summaryrefslogtreecommitdiffstats
path: root/private/oleauto
diff options
context:
space:
mode:
Diffstat (limited to 'private/oleauto')
-rw-r--r--private/oleauto/bin/ppcdef.awk30
-rw-r--r--private/oleauto/bin/src/constant.h48
-rw-r--r--private/oleauto/bin/src/errormes.h25
-rw-r--r--private/oleauto/bin/src/eval.c489
-rw-r--r--private/oleauto/bin/src/eval.h22
-rw-r--r--private/oleauto/bin/src/evaltest.c31
-rw-r--r--private/oleauto/bin/src/evps.h175
-rw-r--r--private/oleauto/bin/src/includes.c464
-rw-r--r--private/oleauto/bin/src/make.bat4
-rw-r--r--private/oleauto/bin/src/makefile123
-rw-r--r--private/oleauto/bin/src/mk.bat23
-rw-r--r--private/oleauto/bin/src/results.c555
-rw-r--r--private/oleauto/bin/src/symtab.c131
-rw-r--r--private/oleauto/bin/src/symtab.h29
-rw-r--r--private/oleauto/bin/win16def.awk59
-rw-r--r--private/oleauto/build/go.bat25
-rw-r--r--private/oleauto/build/go1.bat25
-rw-r--r--private/oleauto/build/make.bat264
-rw-r--r--private/oleauto/build/makeall.bat1
-rw-r--r--private/oleauto/build/mktyplib.mak646
-rw-r--r--private/oleauto/build/readme.txt20
-rw-r--r--private/oleauto/build/results.bat1
-rw-r--r--private/oleauto/build/win16.mak1217
-rw-r--r--private/oleauto/build/win32.mak758
-rw-r--r--private/oleauto/chkfile.bat6
-rw-r--r--private/oleauto/ole/win16/cobjps.h69
-rw-r--r--private/oleauto/ole/win16/coguid.h65
-rw-r--r--private/oleauto/ole/win16/compobj.h1031
-rw-r--r--private/oleauto/ole/win16/dvobj.h480
-rw-r--r--private/oleauto/ole/win16/initguid.h38
-rw-r--r--private/oleauto/ole/win16/moniker.h248
-rw-r--r--private/oleauto/ole/win16/ole1cls.h141
-rw-r--r--private/oleauto/ole/win16/ole2.h1336
-rw-r--r--private/oleauto/ole/win16/ole2.reg460
-rw-r--r--private/oleauto/ole/win16/ole2dbg.h19
-rw-r--r--private/oleauto/ole/win16/ole2ver.h5
-rw-r--r--private/oleauto/ole/win16/oleguid.h80
-rw-r--r--private/oleauto/ole/win16/scode.h283
-rw-r--r--private/oleauto/ole/win16/storage.h457
-rw-r--r--private/oleauto/sample/copyall.bat20
-rw-r--r--private/oleauto/sample/dispcalc/clsid.c46
-rw-r--r--private/oleauto/sample/dispcalc/clsid.h31
-rw-r--r--private/oleauto/sample/dispcalc/dispcalc.cpp609
-rw-r--r--private/oleauto/sample/dispcalc/dispcalc.def14
-rw-r--r--private/oleauto/sample/dispcalc/dispcalc.h240
-rw-r--r--private/oleauto/sample/dispcalc/dispcalc.icobin0 -> 766 bytes
-rw-r--r--private/oleauto/sample/dispcalc/dispcalc.r313
-rw-r--r--private/oleauto/sample/dispcalc/dispcalc.r3221
-rw-r--r--private/oleauto/sample/dispcalc/dispcalc.rc32
-rw-r--r--private/oleauto/sample/dispcalc/dispcalc.reg22
-rw-r--r--private/oleauto/sample/dispcalc/driver.bas29
-rw-r--r--private/oleauto/sample/dispcalc/driver.mak7
-rw-r--r--private/oleauto/sample/dispcalc/frmdrive.frm111
-rw-r--r--private/oleauto/sample/dispcalc/frmdrive.frxbin0 -> 770 bytes
-rw-r--r--private/oleauto/sample/dispcalc/hostenv.h117
-rw-r--r--private/oleauto/sample/dispcalc/idata.cpp85
-rw-r--r--private/oleauto/sample/dispcalc/macmain.cpp306
-rw-r--r--private/oleauto/sample/dispcalc/makefile354
-rw-r--r--private/oleauto/sample/dispcalc/mk.bat24
-rw-r--r--private/oleauto/sample/dispcalc/mk.cmd13
-rw-r--r--private/oleauto/sample/dispcalc/readme.txt101
-rw-r--r--private/oleauto/sample/dispcalc/resource.h71
-rw-r--r--private/oleauto/sample/dispcalc/src2mac.cmd12
-rw-r--r--private/oleauto/sample/dispcalc/src2mac.mak90
-rw-r--r--private/oleauto/sample/dispcalc/winmain.cpp161
-rw-r--r--private/oleauto/sample/dispdemo/bmk.bat19
-rw-r--r--private/oleauto/sample/dispdemo/borland.mak51
-rw-r--r--private/oleauto/sample/dispdemo/clsid.c46
-rw-r--r--private/oleauto/sample/dispdemo/clsid.h31
-rw-r--r--private/oleauto/sample/dispdemo/crempoly.cpp869
-rw-r--r--private/oleauto/sample/dispdemo/crempoly.h90
-rw-r--r--private/oleauto/sample/dispdemo/dispdemo.def14
-rw-r--r--private/oleauto/sample/dispdemo/dispdemo.h51
-rw-r--r--private/oleauto/sample/dispdemo/dispdemo.icobin0 -> 766 bytes
-rw-r--r--private/oleauto/sample/dispdemo/dispdemo.r317
-rw-r--r--private/oleauto/sample/dispdemo/dispdemo.rc36
-rw-r--r--private/oleauto/sample/dispdemo/hostenv.h117
-rw-r--r--private/oleauto/sample/dispdemo/macmain.cpp322
-rw-r--r--private/oleauto/sample/dispdemo/makefile351
-rw-r--r--private/oleauto/sample/dispdemo/misc.cpp99
-rw-r--r--private/oleauto/sample/dispdemo/mk.bat23
-rw-r--r--private/oleauto/sample/dispdemo/mk.cmd13
-rw-r--r--private/oleauto/sample/dispdemo/readme.txt21
-rw-r--r--private/oleauto/sample/dispdemo/resource.h60
-rw-r--r--private/oleauto/sample/dispdemo/winmain.cpp185
-rw-r--r--private/oleauto/sample/dspcalc2/calctype.odl95
-rw-r--r--private/oleauto/sample/dspcalc2/clsid.c46
-rw-r--r--private/oleauto/sample/dspcalc2/clsid.h30
-rw-r--r--private/oleauto/sample/dspcalc2/dspcalc2.cpp689
-rw-r--r--private/oleauto/sample/dspcalc2/dspcalc2.def14
-rw-r--r--private/oleauto/sample/dspcalc2/dspcalc2.h171
-rw-r--r--private/oleauto/sample/dspcalc2/dspcalc2.icobin0 -> 766 bytes
-rw-r--r--private/oleauto/sample/dspcalc2/dspcalc2.r312
-rw-r--r--private/oleauto/sample/dspcalc2/dspcalc2.r3225
-rw-r--r--private/oleauto/sample/dspcalc2/dspcalc2.rc32
-rw-r--r--private/oleauto/sample/dspcalc2/dspcalc2.reg26
-rw-r--r--private/oleauto/sample/dspcalc2/hostenv.h117
-rw-r--r--private/oleauto/sample/dspcalc2/macmain.cpp305
-rw-r--r--private/oleauto/sample/dspcalc2/main.cpp161
-rw-r--r--private/oleauto/sample/dspcalc2/makefile371
-rw-r--r--private/oleauto/sample/dspcalc2/mk.bat22
-rw-r--r--private/oleauto/sample/dspcalc2/mk.cmd13
-rw-r--r--private/oleauto/sample/dspcalc2/readme.txt101
-rw-r--r--private/oleauto/sample/dspcalc2/resource.h71
-rw-r--r--private/oleauto/sample/hello/clsid.c36
-rw-r--r--private/oleauto/sample/hello/clsid.h89
-rw-r--r--private/oleauto/sample/hello/common.h65
-rw-r--r--private/oleauto/sample/hello/hello.cpp326
-rw-r--r--private/oleauto/sample/hello/hello.def14
-rw-r--r--private/oleauto/sample/hello/hello.frm141
-rw-r--r--private/oleauto/sample/hello/hello.h89
-rw-r--r--private/oleauto/sample/hello/hello.icobin0 -> 766 bytes
-rw-r--r--private/oleauto/sample/hello/hello.mak4
-rw-r--r--private/oleauto/sample/hello/hello.odl67
-rw-r--r--private/oleauto/sample/hello/hello.r3230
-rw-r--r--private/oleauto/sample/hello/hello.rc81
-rw-r--r--private/oleauto/sample/hello/hello.reg30
-rw-r--r--private/oleauto/sample/hello/hellopro.cpp97
-rw-r--r--private/oleauto/sample/hello/hellopro.h43
-rw-r--r--private/oleauto/sample/hello/main.cpp272
-rw-r--r--private/oleauto/sample/hello/makefile290
-rw-r--r--private/oleauto/sample/hello/mk.bat21
-rw-r--r--private/oleauto/sample/hello/readme.txt60
-rw-r--r--private/oleauto/sample/hello/resource.h21
-rw-r--r--private/oleauto/sample/make.bat196
-rw-r--r--private/oleauto/sample/mk16.bat13
-rw-r--r--private/oleauto/sample/mk32.bat19
-rw-r--r--private/oleauto/sample/mkallm.bat18
-rw-r--r--private/oleauto/sample/mkitall.bat70
-rw-r--r--private/oleauto/sample/mkmac.bat9
-rw-r--r--private/oleauto/sample/mkppc.bat7
-rw-r--r--private/oleauto/sample/nlssort/makefile200
-rw-r--r--private/oleauto/sample/nlssort/nlssort.cpp442
-rw-r--r--private/oleauto/sample/nlssort/nlssort.def18
-rw-r--r--private/oleauto/sample/nlssort/result.chs6763
-rw-r--r--private/oleauto/sample/nlssort/result.cht13053
-rw-r--r--private/oleauto/sample/nlssort/result.jpn16109
-rw-r--r--private/oleauto/sample/nlssort/source.chs6763
-rw-r--r--private/oleauto/sample/nlssort/source.cht13053
-rw-r--r--private/oleauto/sample/nlssort/source.jpn16109
-rw-r--r--private/oleauto/sample/spoly/cenumpt.cpp284
-rw-r--r--private/oleauto/sample/spoly/cenumpt.h40
-rw-r--r--private/oleauto/sample/spoly/clsid.c46
-rw-r--r--private/oleauto/sample/spoly/clsid.h30
-rw-r--r--private/oleauto/sample/spoly/cpoint.cpp389
-rw-r--r--private/oleauto/sample/spoly/cpoint.h127
-rw-r--r--private/oleauto/sample/spoly/cpoly.cpp1034
-rw-r--r--private/oleauto/sample/spoly/cpoly.h203
-rw-r--r--private/oleauto/sample/spoly/hostenv.h117
-rw-r--r--private/oleauto/sample/spoly/macmain.cpp398
-rw-r--r--private/oleauto/sample/spoly/makefile335
-rw-r--r--private/oleauto/sample/spoly/misc.cpp300
-rw-r--r--private/oleauto/sample/spoly/mk.bat19
-rw-r--r--private/oleauto/sample/spoly/mk.cmd13
-rw-r--r--private/oleauto/sample/spoly/readme.txt61
-rw-r--r--private/oleauto/sample/spoly/resource.h51
-rw-r--r--private/oleauto/sample/spoly/spoly.def14
-rw-r--r--private/oleauto/sample/spoly/spoly.h68
-rw-r--r--private/oleauto/sample/spoly/spoly.icobin0 -> 766 bytes
-rw-r--r--private/oleauto/sample/spoly/spoly.r298
-rw-r--r--private/oleauto/sample/spoly/spoly.r3227
-rw-r--r--private/oleauto/sample/spoly/spoly.rc15
-rw-r--r--private/oleauto/sample/spoly/spoly.reg22
-rw-r--r--private/oleauto/sample/spoly/statbar.cpp368
-rw-r--r--private/oleauto/sample/spoly/statbar.h142
-rw-r--r--private/oleauto/sample/spoly/winmain.cpp293
-rw-r--r--private/oleauto/sample/spoly2/cenumpt.cpp281
-rw-r--r--private/oleauto/sample/spoly2/cenumpt.h39
-rw-r--r--private/oleauto/sample/spoly2/clsid.c46
-rw-r--r--private/oleauto/sample/spoly2/clsid.h30
-rw-r--r--private/oleauto/sample/spoly2/cpoint.cpp356
-rw-r--r--private/oleauto/sample/spoly2/cpoint.h145
-rw-r--r--private/oleauto/sample/spoly2/cpoly.cpp897
-rw-r--r--private/oleauto/sample/spoly2/cpoly.h235
-rw-r--r--private/oleauto/sample/spoly2/hostenv.h117
-rw-r--r--private/oleauto/sample/spoly2/macmain.cpp397
-rw-r--r--private/oleauto/sample/spoly2/makefile342
-rw-r--r--private/oleauto/sample/spoly2/misc.cpp215
-rw-r--r--private/oleauto/sample/spoly2/mk.bat19
-rw-r--r--private/oleauto/sample/spoly2/mk.cmd13
-rw-r--r--private/oleauto/sample/spoly2/readme.txt62
-rw-r--r--private/oleauto/sample/spoly2/resource.h50
-rw-r--r--private/oleauto/sample/spoly2/spoly.h71
-rw-r--r--private/oleauto/sample/spoly2/spoly2.def14
-rw-r--r--private/oleauto/sample/spoly2/spoly2.icobin0 -> 766 bytes
-rw-r--r--private/oleauto/sample/spoly2/spoly2.r298
-rw-r--r--private/oleauto/sample/spoly2/spoly2.r3226
-rw-r--r--private/oleauto/sample/spoly2/spoly2.rc15
-rw-r--r--private/oleauto/sample/spoly2/spoly2.reg20
-rw-r--r--private/oleauto/sample/spoly2/statbar.cpp368
-rw-r--r--private/oleauto/sample/spoly2/statbar.h142
-rw-r--r--private/oleauto/sample/spoly2/tdata.cpp344
-rw-r--r--private/oleauto/sample/spoly2/winmain.cpp293
-rw-r--r--private/oleauto/sample/tibrowse/makefile323
-rw-r--r--private/oleauto/sample/tibrowse/mk.bat19
-rw-r--r--private/oleauto/sample/tibrowse/readme.txt23
-rw-r--r--private/oleauto/sample/tibrowse/resource.h54
-rw-r--r--private/oleauto/sample/tibrowse/src2mac.cmd12
-rw-r--r--private/oleauto/sample/tibrowse/src2mac.mak75
-rw-r--r--private/oleauto/sample/tibrowse/tibrowse.cpp1156
-rw-r--r--private/oleauto/sample/tibrowse/tibrowse.def13
-rw-r--r--private/oleauto/sample/tibrowse/tibrowse.h131
-rw-r--r--private/oleauto/sample/tibrowse/tibrowse.icobin0 -> 766 bytes
-rw-r--r--private/oleauto/sample/tibrowse/tibrowse.r384
-rw-r--r--private/oleauto/sample/tibrowse/tibrowse.rc33
-rw-r--r--private/oleauto/sample/tomac.cmd50
-rw-r--r--private/oleauto/sample/toppc.cmd86
-rw-r--r--private/oleauto/src/dispatch/asmhelp.c55
-rw-r--r--private/oleauto/src/dispatch/assert.cpp134
-rw-r--r--private/oleauto/src/dispatch/assert.dlg13
-rw-r--r--private/oleauto/src/dispatch/assrtdlg.h29
-rw-r--r--private/oleauto/src/dispatch/bstr.cpp615
-rw-r--r--private/oleauto/src/dispatch/bstrdate.c2802
-rw-r--r--private/oleauto/src/dispatch/cdispti.cpp1360
-rw-r--r--private/oleauto/src/dispatch/cdispti.h111
-rw-r--r--private/oleauto/src/dispatch/clsid.c54
-rw-r--r--private/oleauto/src/dispatch/clsid.h28
-rw-r--r--private/oleauto/src/dispatch/convert.cpp2939
-rw-r--r--private/oleauto/src/dispatch/crtstuff.c214
-rw-r--r--private/oleauto/src/dispatch/crtstuff.h47
-rw-r--r--private/oleauto/src/dispatch/dbcsdate.c87
-rw-r--r--private/oleauto/src/dispatch/dbcsdate.h228
-rw-r--r--private/oleauto/src/dispatch/dispbind.cpp221
-rw-r--r--private/oleauto/src/dispatch/disphelp.cpp229
-rw-r--r--private/oleauto/src/dispatch/dispiid.c59
-rw-r--r--private/oleauto/src/dispatch/dispmrsh.cpp1894
-rw-r--r--private/oleauto/src/dispatch/dispmrsh.h316
-rw-r--r--private/oleauto/src/dispatch/disppch.cpp3
-rw-r--r--private/oleauto/src/dispatch/dispprox.cpp707
-rw-r--r--private/oleauto/src/dispatch/dispps.h267
-rw-r--r--private/oleauto/src/dispatch/dispstrm.cpp375
-rw-r--r--private/oleauto/src/dispatch/dispstrm.h78
-rw-r--r--private/oleauto/src/dispatch/dispstub.cpp803
-rw-r--r--private/oleauto/src/dispatch/errinfo.cpp680
-rw-r--r--private/oleauto/src/dispatch/evprox.cpp402
-rw-r--r--private/oleauto/src/dispatch/evps.h179
-rw-r--r--private/oleauto/src/dispatch/evstub.cpp500
-rw-r--r--private/oleauto/src/dispatch/getobj.cpp202
-rw-r--r--private/oleauto/src/dispatch/idispiid.c58
-rw-r--r--private/oleauto/src/dispatch/invhelp.cpp154
-rw-r--r--private/oleauto/src/dispatch/memory.cpp64
-rw-r--r--private/oleauto/src/dispatch/namemacs.h1305
-rw-r--r--private/oleauto/src/dispatch/nlsapi.c3148
-rw-r--r--private/oleauto/src/dispatch/nlsdbcs.h176
-rw-r--r--private/oleauto/src/dispatch/nlshelp.cpp276
-rw-r--r--private/oleauto/src/dispatch/nlsintrn.h409
-rw-r--r--private/oleauto/src/dispatch/oaglue.c664
-rw-r--r--private/oleauto/src/dispatch/oaglue.v126
-rw-r--r--private/oleauto/src/dispatch/oaimp.h164
-rw-r--r--private/oleauto/src/dispatch/oaimp.mak172
-rw-r--r--private/oleauto/src/dispatch/oavtbl.c156
-rw-r--r--private/oleauto/src/dispatch/oavtbl.h293
-rw-r--r--private/oleauto/src/dispatch/ole2.ini275
-rw-r--r--private/oleauto/src/dispatch/ole2auto.reg79
-rw-r--r--private/oleauto/src/dispatch/oledate.c370
-rw-r--r--private/oleauto/src/dispatch/oledisp.h817
-rw-r--r--private/oleauto/src/dispatch/oleguids.c27
-rw-r--r--private/oleauto/src/dispatch/oleguids.h71
-rw-r--r--private/oleauto/src/dispatch/olenames.h100
-rw-r--r--private/oleauto/src/dispatch/psfactry.cpp434
-rw-r--r--private/oleauto/src/dispatch/psfactry.h52
-rw-r--r--private/oleauto/src/dispatch/sarray.cpp1713
-rw-r--r--private/oleauto/src/dispatch/stddisp.cpp856
-rw-r--r--private/oleauto/src/dispatch/stddisp.h325
-rw-r--r--private/oleauto/src/dispatch/string.c530
-rw-r--r--private/oleauto/src/dispatch/tables.c95
-rw-r--r--private/oleauto/src/dispatch/tcprox.cpp440
-rw-r--r--private/oleauto/src/dispatch/tcps.h196
-rw-r--r--private/oleauto/src/dispatch/tcstub.cpp496
-rw-r--r--private/oleauto/src/dispatch/time-api.cpp173
-rw-r--r--private/oleauto/src/dispatch/tiprox.cpp1627
-rw-r--r--private/oleauto/src/dispatch/tips.h297
-rw-r--r--private/oleauto/src/dispatch/tistub.cpp1034
-rw-r--r--private/oleauto/src/dispatch/tiutil.cpp99
-rw-r--r--private/oleauto/src/dispatch/tlprox.cpp867
-rw-r--r--private/oleauto/src/dispatch/tlps.h226
-rw-r--r--private/oleauto/src/dispatch/tlstub.cpp846
-rw-r--r--private/oleauto/src/dispatch/ups.cpp1719
-rw-r--r--private/oleauto/src/dispatch/ups.h170
-rw-r--r--private/oleauto/src/dispatch/uvft.cpp396
-rw-r--r--private/oleauto/src/dispatch/validate.cpp291
-rw-r--r--private/oleauto/src/dispatch/variant.cpp1168
-rw-r--r--private/oleauto/src/dispatch/win16/0401.c714
-rw-r--r--private/oleauto/src/dispatch/win16/0403.c531
-rw-r--r--private/oleauto/src/dispatch/win16/0404.c1036
-rw-r--r--private/oleauto/src/dispatch/win16/0405.c711
-rw-r--r--private/oleauto/src/dispatch/win16/0406.c705
-rw-r--r--private/oleauto/src/dispatch/win16/0407.c524
-rw-r--r--private/oleauto/src/dispatch/win16/0408.c706
-rw-r--r--private/oleauto/src/dispatch/win16/0409.c714
-rw-r--r--private/oleauto/src/dispatch/win16/040a.c723
-rw-r--r--private/oleauto/src/dispatch/win16/040b.c526
-rw-r--r--private/oleauto/src/dispatch/win16/040c.c521
-rw-r--r--private/oleauto/src/dispatch/win16/040d.c696
-rw-r--r--private/oleauto/src/dispatch/win16/040e.c750
-rw-r--r--private/oleauto/src/dispatch/win16/040f.c704
-rw-r--r--private/oleauto/src/dispatch/win16/0410.c518
-rw-r--r--private/oleauto/src/dispatch/win16/0411.c1679
-rw-r--r--private/oleauto/src/dispatch/win16/0412.c1729
-rw-r--r--private/oleauto/src/dispatch/win16/0413.c526
-rw-r--r--private/oleauto/src/dispatch/win16/0414.c526
-rw-r--r--private/oleauto/src/dispatch/win16/0415.c695
-rw-r--r--private/oleauto/src/dispatch/win16/0416.c532
-rw-r--r--private/oleauto/src/dispatch/win16/0419.c690
-rw-r--r--private/oleauto/src/dispatch/win16/041b.c706
-rw-r--r--private/oleauto/src/dispatch/win16/041d.c701
-rw-r--r--private/oleauto/src/dispatch/win16/041f.c699
-rw-r--r--private/oleauto/src/dispatch/win16/0429.c536
-rw-r--r--private/oleauto/src/dispatch/win16/0801.c536
-rw-r--r--private/oleauto/src/dispatch/win16/0804.c724
-rw-r--r--private/oleauto/src/dispatch/win16/0807.c518
-rw-r--r--private/oleauto/src/dispatch/win16/0809.c525
-rw-r--r--private/oleauto/src/dispatch/win16/080a.c537
-rw-r--r--private/oleauto/src/dispatch/win16/080c.c522
-rw-r--r--private/oleauto/src/dispatch/win16/0810.c518
-rw-r--r--private/oleauto/src/dispatch/win16/0813.c524
-rw-r--r--private/oleauto/src/dispatch/win16/0814.c526
-rw-r--r--private/oleauto/src/dispatch/win16/0816.c532
-rw-r--r--private/oleauto/src/dispatch/win16/0c01.c528
-rw-r--r--private/oleauto/src/dispatch/win16/0c07.c525
-rw-r--r--private/oleauto/src/dispatch/win16/0c09.c528
-rw-r--r--private/oleauto/src/dispatch/win16/0c0a.c708
-rw-r--r--private/oleauto/src/dispatch/win16/0c0c.c522
-rw-r--r--private/oleauto/src/dispatch/win16/1001.c528
-rw-r--r--private/oleauto/src/dispatch/win16/1009.c523
-rw-r--r--private/oleauto/src/dispatch/win16/100c.c517
-rw-r--r--private/oleauto/src/dispatch/win16/1401.c528
-rw-r--r--private/oleauto/src/dispatch/win16/1409.c528
-rw-r--r--private/oleauto/src/dispatch/win16/1801.c521
-rw-r--r--private/oleauto/src/dispatch/win16/1809.c523
-rw-r--r--private/oleauto/src/dispatch/win16/1c01.c520
-rw-r--r--private/oleauto/src/dispatch/win16/2001.c528
-rw-r--r--private/oleauto/src/dispatch/win16/2401.c528
-rw-r--r--private/oleauto/src/dispatch/win16/2801.c536
-rw-r--r--private/oleauto/src/dispatch/win16/2c01.c536
-rw-r--r--private/oleauto/src/dispatch/win16/3001.c536
-rw-r--r--private/oleauto/src/dispatch/win16/3401.c528
-rw-r--r--private/oleauto/src/dispatch/win16/3801.c530
-rw-r--r--private/oleauto/src/dispatch/win16/3c01.c528
-rw-r--r--private/oleauto/src/dispatch/win16/4001.c528
-rw-r--r--private/oleauto/src/dispatch/win16/invoke.asm783
-rw-r--r--private/oleauto/src/dispatch/win16/loc11-3.txt4900
-rw-r--r--private/oleauto/src/dispatch/win16/locale.jap111
-rw-r--r--private/oleauto/src/dispatch/win16/locale.kor110
-rw-r--r--private/oleauto/src/dispatch/win16/locale.prc113
-rw-r--r--private/oleauto/src/dispatch/win16/locale.twn111
-rw-r--r--private/oleauto/src/dispatch/win16/locale.txt4877
-rw-r--r--private/oleauto/src/dispatch/win16/ole2disp.def207
-rw-r--r--private/oleauto/src/dispatch/win16/ole2disp.rc92
-rw-r--r--private/oleauto/src/dispatch/win16/ole2nls.def80
-rw-r--r--private/oleauto/src/dispatch/win16/ole2nls.rc93
-rw-r--r--private/oleauto/src/dispatch/win16/oleconva.asm653
-rw-r--r--private/oleauto/src/dispatch/win16/oledisp.cpp89
-rw-r--r--private/oleauto/src/dispatch/win32/alpha/invoke.s728
-rw-r--r--private/oleauto/src/dispatch/win32/i386/invoke.asm832
-rw-r--r--private/oleauto/src/dispatch/win32/i386/oleconva.asm675
-rw-r--r--private/oleauto/src/dispatch/win32/mips/invoke.s725
-rw-r--r--private/oleauto/src/dispatch/win32/mips/invtest.cpp413
-rw-r--r--private/oleauto/src/dispatch/win32/mips/invtest.h72
-rw-r--r--private/oleauto/src/dispatch/win32/oleconva.cpp549
-rw-r--r--private/oleauto/src/dispatch/win32/oledisp.cpp119
-rw-r--r--private/oleauto/src/dispatch/win32/ppc/invoke.s853
-rw-r--r--private/oleauto/src/inc/dispatch.h1412
-rw-r--r--private/oleauto/src/inc/oautil.h283
-rw-r--r--private/oleauto/src/inc/olenls.h502
-rw-r--r--private/oleauto/src/inc/variant.h277
-rw-r--r--private/oleauto/src/inc/verstamp.h5
-rw-r--r--private/oleauto/src/mktyplib/dimalloc.cxx1787
-rw-r--r--private/oleauto/src/mktyplib/errors.h104
-rw-r--r--private/oleauto/src/mktyplib/fileinfo.h329
-rw-r--r--private/oleauto/src/mktyplib/hout.c1111
-rw-r--r--private/oleauto/src/mktyplib/intlstr.c212
-rw-r--r--private/oleauto/src/mktyplib/intlstr.h35
-rw-r--r--private/oleauto/src/mktyplib/lexer.c890
-rw-r--r--private/oleauto/src/mktyplib/mktyplib.c1302
-rw-r--r--private/oleauto/src/mktyplib/mktyplib.def7
-rw-r--r--private/oleauto/src/mktyplib/mktyplib.h162
-rw-r--r--private/oleauto/src/mktyplib/mktyplib.icobin0 -> 766 bytes
-rw-r--r--private/oleauto/src/mktyplib/mktyplib.r165
-rw-r--r--private/oleauto/src/mktyplib/mktyplib.rc87
-rw-r--r--private/oleauto/src/mktyplib/parser.c3218
-rw-r--r--private/oleauto/src/mktyplib/parser.h93
-rw-r--r--private/oleauto/src/mktyplib/stdole.def15
-rw-r--r--private/oleauto/src/mktyplib/stdole.odl117
-rw-r--r--private/oleauto/src/mktyplib/stdole.rc114
-rw-r--r--private/oleauto/src/mktyplib/stdole32.rc92
-rw-r--r--private/oleauto/src/mktyplib/tlviewer.cpp1473
-rw-r--r--private/oleauto/src/mktyplib/tlviewer.hxx157
-rw-r--r--private/oleauto/src/mktyplib/tmpguid.c23
-rw-r--r--private/oleauto/src/mktyplib/tokens.h132
-rw-r--r--private/oleauto/src/mktyplib/typelib.err85
-rw-r--r--private/oleauto/src/mktyplib/typout.cpp1186
-rw-r--r--private/oleauto/src/typelib/blkdsc32.hxx232
-rw-r--r--private/oleauto/src/typelib/blkmgr.cxx1385
-rw-r--r--private/oleauto/src/typelib/blkmgr.hxx752
-rw-r--r--private/oleauto/src/typelib/bstr.h109
-rw-r--r--private/oleauto/src/typelib/cltypes.hxx687
-rw-r--r--private/oleauto/src/typelib/clutil.cxx3210
-rw-r--r--private/oleauto/src/typelib/clutil.hxx417
-rw-r--r--private/oleauto/src/typelib/convert.cxx356
-rw-r--r--private/oleauto/src/typelib/convert.hxx37
-rw-r--r--private/oleauto/src/typelib/ctseg.hxx84
-rw-r--r--private/oleauto/src/typelib/dassert.c35
-rw-r--r--private/oleauto/src/typelib/dbindtbl.cxx811
-rw-r--r--private/oleauto/src/typelib/dbindtbl.hxx249
-rw-r--r--private/oleauto/src/typelib/dblkmgr.hxx690
-rw-r--r--private/oleauto/src/typelib/debug.h234
-rw-r--r--private/oleauto/src/typelib/debug.hxx175
-rw-r--r--private/oleauto/src/typelib/debug2.cxx164
-rw-r--r--private/oleauto/src/typelib/defn.hxx1640
-rw-r--r--private/oleauto/src/typelib/dfntbind.cxx80
-rw-r--r--private/oleauto/src/typelib/dfntbind.hxx272
-rw-r--r--private/oleauto/src/typelib/dfntcomp.cxx569
-rw-r--r--private/oleauto/src/typelib/dfntcomp.hxx92
-rw-r--r--private/oleauto/src/typelib/dfstream.cxx408
-rw-r--r--private/oleauto/src/typelib/dfstream.hxx77
-rw-r--r--private/oleauto/src/typelib/dstrmgr.cxx1692
-rw-r--r--private/oleauto/src/typelib/dstrmgr.hxx196
-rw-r--r--private/oleauto/src/typelib/dtbind.cxx1210
-rw-r--r--private/oleauto/src/typelib/dtbind.hxx282
-rw-r--r--private/oleauto/src/typelib/dtmbrs.cxx3285
-rw-r--r--private/oleauto/src/typelib/dtmbrs.hxx361
-rw-r--r--private/oleauto/src/typelib/dyntinfo.hxx90
-rw-r--r--private/oleauto/src/typelib/ebvers.h22
-rw-r--r--private/oleauto/src/typelib/entrymgr.cxx1017
-rw-r--r--private/oleauto/src/typelib/entrymgr.hxx506
-rw-r--r--private/oleauto/src/typelib/errmap.cxx161
-rw-r--r--private/oleauto/src/typelib/errmap.hxx31
-rw-r--r--private/oleauto/src/typelib/exbind.hxx167
-rw-r--r--private/oleauto/src/typelib/fstream.cxx364
-rw-r--r--private/oleauto/src/typelib/gbindtbl.cxx1377
-rw-r--r--private/oleauto/src/typelib/gbindtbl.hxx415
-rw-r--r--private/oleauto/src/typelib/gdtinfo.cxx4981
-rw-r--r--private/oleauto/src/typelib/gdtinfo.hxx1323
-rw-r--r--private/oleauto/src/typelib/gdtrt.cxx2576
-rw-r--r--private/oleauto/src/typelib/gptbind.cxx1526
-rw-r--r--private/oleauto/src/typelib/gptbind.hxx254
-rw-r--r--private/oleauto/src/typelib/gtlibole.cxx6619
-rw-r--r--private/oleauto/src/typelib/gtlibole.hxx1220
-rw-r--r--private/oleauto/src/typelib/gtlibstg.cxx1609
-rw-r--r--private/oleauto/src/typelib/gtlibstg.hxx208
-rw-r--r--private/oleauto/src/typelib/impmgr.cxx1502
-rw-r--r--private/oleauto/src/typelib/impmgr.hxx490
-rw-r--r--private/oleauto/src/typelib/machine.hxx222
-rw-r--r--private/oleauto/src/typelib/macros.hxx276
-rw-r--r--private/oleauto/src/typelib/mbstring.cxx667
-rw-r--r--private/oleauto/src/typelib/mbstring.h46
-rw-r--r--private/oleauto/src/typelib/mem.cxx417
-rw-r--r--private/oleauto/src/typelib/mem.hxx174
-rw-r--r--private/oleauto/src/typelib/namemacs.h1305
-rw-r--r--private/oleauto/src/typelib/nammgr.cxx1521
-rw-r--r--private/oleauto/src/typelib/nammgr.hxx621
-rw-r--r--private/oleauto/src/typelib/ncache.hxx287
-rw-r--r--private/oleauto/src/typelib/newexe.h387
-rw-r--r--private/oleauto/src/typelib/ntimage.h968
-rw-r--r--private/oleauto/src/typelib/ntstring.cxx397
-rw-r--r--private/oleauto/src/typelib/ntstring.h153
-rw-r--r--private/oleauto/src/typelib/oautil.cxx522
-rw-r--r--private/oleauto/src/typelib/obguid.c65
-rw-r--r--private/oleauto/src/typelib/obguid.h46
-rw-r--r--private/oleauto/src/typelib/obole2.h224
-rw-r--r--private/oleauto/src/typelib/obwin.hxx93
-rw-r--r--private/oleauto/src/typelib/obwlm.h374
-rw-r--r--private/oleauto/src/typelib/oleaut32.def241
-rw-r--r--private/oleauto/src/typelib/oleaut32.rc96
-rw-r--r--private/oleauto/src/typelib/olenames.h100
-rw-r--r--private/oleauto/src/typelib/oletmgr.cxx468
-rw-r--r--private/oleauto/src/typelib/oletmgr.hxx100
-rw-r--r--private/oleauto/src/typelib/rtarray.h39
-rw-r--r--private/oleauto/src/typelib/rtsheap.cxx473
-rw-r--r--private/oleauto/src/typelib/rtsheap.h128
-rw-r--r--private/oleauto/src/typelib/segnames.h246
-rw-r--r--private/oleauto/src/typelib/segorder.asm99
-rw-r--r--private/oleauto/src/typelib/sheapmgr.cxx1996
-rw-r--r--private/oleauto/src/typelib/sheapmgr.hxx1057
-rw-r--r--private/oleauto/src/typelib/silver.hxx143
-rw-r--r--private/oleauto/src/typelib/stltinfo.cxx500
-rw-r--r--private/oleauto/src/typelib/stltinfo.hxx558
-rw-r--r--private/oleauto/src/typelib/strdcl.c2
-rw-r--r--private/oleauto/src/typelib/stream.hxx188
-rw-r--r--private/oleauto/src/typelib/switches.hxx457
-rw-r--r--private/oleauto/src/typelib/sysutils.h13
-rw-r--r--private/oleauto/src/typelib/tdata.hxx1372
-rw-r--r--private/oleauto/src/typelib/tdata1.cxx2465
-rw-r--r--private/oleauto/src/typelib/tdata2.cxx3651
-rw-r--r--private/oleauto/src/typelib/tdesck.hxx72
-rw-r--r--private/oleauto/src/typelib/tinfo.hxx56
-rw-r--r--private/oleauto/src/typelib/tiperr.h92
-rw-r--r--private/oleauto/src/typelib/tlibfrag.r36
-rw-r--r--private/oleauto/src/typelib/tlibguid.c69
-rw-r--r--private/oleauto/src/typelib/tlibpch.cxx178
-rw-r--r--private/oleauto/src/typelib/tlibutil.cxx7729
-rw-r--r--private/oleauto/src/typelib/tlibutil.hxx40
-rw-r--r--private/oleauto/src/typelib/tls.c340
-rw-r--r--private/oleauto/src/typelib/tls.h175
-rw-r--r--private/oleauto/src/typelib/tmpguid.c104
-rw-r--r--private/oleauto/src/typelib/typelib.def74
-rw-r--r--private/oleauto/src/typelib/typelib.hxx336
-rw-r--r--private/oleauto/src/typelib/typelib.rc131
-rw-r--r--private/oleauto/src/typelib/types.h342
-rw-r--r--private/oleauto/src/typelib/typesx.h190
-rw-r--r--private/oleauto/src/typelib/validate.h71
-rw-r--r--private/oleauto/src/typelib/version.hxx67
-rw-r--r--private/oleauto/src/typelib/wep.c144
-rw-r--r--private/oleauto/src/typelib/xstring.h60
-rw-r--r--private/oleauto/src/typelib/xutil.h196
-rw-r--r--private/oleauto/tests/build16.bat5
-rw-r--r--private/oleauto/tests/build32.bat15
-rw-r--r--private/oleauto/tests/common/assert.cpp131
-rw-r--r--private/oleauto/tests/common/assert.dlg13
-rw-r--r--private/oleauto/tests/common/assrtdlg.h11
-rw-r--r--private/oleauto/tests/common/cdisp.cpp378
-rw-r--r--private/oleauto/tests/common/cdisp.h64
-rw-r--r--private/oleauto/tests/common/common.h407
-rw-r--r--private/oleauto/tests/common/crempoly.cpp610
-rw-r--r--private/oleauto/tests/common/crempoly.h90
-rw-r--r--private/oleauto/tests/common/cunk.cpp65
-rw-r--r--private/oleauto/tests/common/cunk.h33
-rw-r--r--private/oleauto/tests/common/dballoc.cpp916
-rw-r--r--private/oleauto/tests/common/dballoc.h51
-rw-r--r--private/oleauto/tests/common/dispdbug.cpp890
-rw-r--r--private/oleauto/tests/common/dispdbug.h66
-rw-r--r--private/oleauto/tests/common/disphelp.cpp402
-rw-r--r--private/oleauto/tests/common/disphelp.h41
-rw-r--r--private/oleauto/tests/common/dualtst.h81
-rw-r--r--private/oleauto/tests/common/nlshelp.cpp131
-rw-r--r--private/oleauto/tests/common/statbar.cpp374
-rw-r--r--private/oleauto/tests/common/statbar.h147
-rw-r--r--private/oleauto/tests/common/testhelp.cpp1252
-rw-r--r--private/oleauto/tests/common/testhelp.h141
-rw-r--r--private/oleauto/tests/common/util.cpp65
-rw-r--r--private/oleauto/tests/disptest/cbind.cpp393
-rw-r--r--private/oleauto/tests/disptest/cbstr.cpp313
-rw-r--r--private/oleauto/tests/disptest/ccollect.cpp422
-rw-r--r--private/oleauto/tests/disptest/cdatecnv.cpp491
-rw-r--r--private/oleauto/tests/disptest/cdisptst.def13
-rw-r--r--private/oleauto/tests/disptest/cdisptst.r329
-rw-r--r--private/oleauto/tests/disptest/cdisptst.rc87
-rw-r--r--private/oleauto/tests/disptest/cearly.cpp319
-rw-r--r--private/oleauto/tests/disptest/cinvex.cpp156
-rw-r--r--private/oleauto/tests/disptest/cinvref.cpp545
-rw-r--r--private/oleauto/tests/disptest/cinvsary.cpp641
-rw-r--r--private/oleauto/tests/disptest/cinvval.cpp571
-rw-r--r--private/oleauto/tests/disptest/clsid.h31
-rw-r--r--private/oleauto/tests/disptest/cnls.cpp421
-rw-r--r--private/oleauto/tests/disptest/csarray.cpp371
-rw-r--r--private/oleauto/tests/disptest/ctime.cpp266
-rw-r--r--private/oleauto/tests/disptest/cvariant.cpp1617
-rw-r--r--private/oleauto/tests/disptest/cwbstr.cpp320
-rw-r--r--private/oleauto/tests/disptest/disptest.cpp316
-rw-r--r--private/oleauto/tests/disptest/disptest.h63
-rw-r--r--private/oleauto/tests/disptest/guid.c56
-rw-r--r--private/oleauto/tests/disptest/macmain.cpp1447
-rw-r--r--private/oleauto/tests/disptest/macmain.h191
-rw-r--r--private/oleauto/tests/disptest/makefile552
-rw-r--r--private/oleauto/tests/disptest/makefile.mpw181
-rw-r--r--private/oleauto/tests/disptest/misc.cpp271
-rw-r--r--private/oleauto/tests/disptest/oleguids.c51
-rw-r--r--private/oleauto/tests/disptest/oleguids.h37
-rw-r--r--private/oleauto/tests/disptest/pch.cpp5
-rw-r--r--private/oleauto/tests/disptest/resource.h41
-rw-r--r--private/oleauto/tests/disptest/src2mac.mak228
-rw-r--r--private/oleauto/tests/disptest/suite.cpp590
-rw-r--r--private/oleauto/tests/disptest/timer.c29
-rw-r--r--private/oleauto/tests/disptest/tstsuite.h119
-rw-r--r--private/oleauto/tests/make.bat144
-rw-r--r--private/oleauto/tests/oleprog.mak584
-rw-r--r--private/oleauto/tests/sdisptst/cappobj.cpp201
-rw-r--r--private/oleauto/tests/sdisptst/cappobj.h65
-rw-r--r--private/oleauto/tests/sdisptst/ccf.cpp105
-rw-r--r--private/oleauto/tests/sdisptst/cdisptst.cpp893
-rw-r--r--private/oleauto/tests/sdisptst/cdisptst.h427
-rw-r--r--private/oleauto/tests/sdisptst/cdualtst.cpp459
-rw-r--r--private/oleauto/tests/sdisptst/cdualtst.h133
-rw-r--r--private/oleauto/tests/sdisptst/cexinfo.cpp279
-rw-r--r--private/oleauto/tests/sdisptst/cexinfo.h97
-rw-r--r--private/oleauto/tests/sdisptst/clsid.c45
-rw-r--r--private/oleauto/tests/sdisptst/clsid.h34
-rw-r--r--private/oleauto/tests/sdisptst/cprop.cpp471
-rw-r--r--private/oleauto/tests/sdisptst/cprop.h127
-rw-r--r--private/oleauto/tests/sdisptst/csarray.cpp831
-rw-r--r--private/oleauto/tests/sdisptst/csarray.h259
-rw-r--r--private/oleauto/tests/sdisptst/macmain.cpp1542
-rw-r--r--private/oleauto/tests/sdisptst/macmain.h176
-rw-r--r--private/oleauto/tests/sdisptst/makefile470
-rw-r--r--private/oleauto/tests/sdisptst/makefile.mpw143
-rw-r--r--private/oleauto/tests/sdisptst/misc.cpp371
-rw-r--r--private/oleauto/tests/sdisptst/oleguids.c51
-rw-r--r--private/oleauto/tests/sdisptst/oleguids.h38
-rw-r--r--private/oleauto/tests/sdisptst/pch.cpp9
-rw-r--r--private/oleauto/tests/sdisptst/resource.h3
-rw-r--r--private/oleauto/tests/sdisptst/sdisptst.cpp263
-rw-r--r--private/oleauto/tests/sdisptst/sdisptst.def8
-rw-r--r--private/oleauto/tests/sdisptst/sdisptst.h120
-rw-r--r--private/oleauto/tests/sdisptst/sdisptst.odl114
-rw-r--r--private/oleauto/tests/sdisptst/sdisptst.r295
-rw-r--r--private/oleauto/tests/sdisptst/sdisptst.r3252
-rw-r--r--private/oleauto/tests/sdisptst/sdisptst.rc32
-rw-r--r--private/oleauto/tests/sdisptst/sdisptst.reg53
-rw-r--r--private/oleauto/tests/sdisptst/src2mac.mak217
-rw-r--r--private/oleauto/tests/sdisptst/tdata.c702
-rw-r--r--private/oleauto/tests/sdisptst/tinfo.c13
-rw-r--r--private/oleauto/tools/win16/hdos/bin/ml.err259
-rw-r--r--private/oleauto/tools/win16/hdos/bin/rcpp.err334
-rw-r--r--private/oleauto/tools/win16/hdos/c800/bin/c1.err1088
-rw-r--r--private/oleauto/tools/win16/hdos/c800/bin/c23.err99
-rw-r--r--private/oleauto/tools/win16/hdos/c800/bin/cl.err43
-rw-r--r--private/oleauto/tools/win16/hdos/c800/bin/cl.msg139
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/assert.h35
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/bios.h244
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/cderr.h58
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/cmacros.inc1410
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/colordlg.h49
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/commdlg.h318
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/conio.h73
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/cpl.h157
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/ctype.h127
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/custcntl.h105
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/dde.h146
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/ddeml.h457
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/direct.h51
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/dlgs.h192
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/dos.h330
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/drivinit.h2
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/errno.h80
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/fcntl.h54
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/fgraph.fd372
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/fgraph.fi506
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/float.h213
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/fstream.h141
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/graph.h485
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/io.h162
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/iomanip.h128
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/ios.h198
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/iostream.h65
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/istream.h149
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/limits.h44
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/locale.h84
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/lzdos.h5
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/lzexpand.h95
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/malloc.h155
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/math.h303
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/memory.h75
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/mmsystem.h1917
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/mmsystem.inc1484
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/new.h48
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/ole.h504
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/ostream.h129
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/penwin.h818
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/penwoem.h75
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/pgchart.h256
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/print.h302
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/process.h144
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/scrnsave.h168
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/search.h59
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/setjmp.h44
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/share.h29
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/shellapi.h88
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/signal.h70
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/stdarg.h52
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/stddef.h80
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/stdio.h352
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/stdiostr.h55
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/stdlib.h282
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/streamb.h142
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/stress.h56
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/string.h167
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/strstrea.h95
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/time.h129
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/toolhelp.h469
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/toolhelp.inc292
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/varargs.h52
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/ver.h255
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/vmemory.h60
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/wfext.h85
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/windows.h5373
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/windows.inc2343
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/windowsx.h1109
-rw-r--r--private/oleauto/tools/win16/hdos/c800/include/winmem32.h32
-rw-r--r--private/oleauto/tools/win16/hdos/c800/lib/libentry.asm91
-rw-r--r--private/oleauto/tools/win16/os2/bin/c1.err1029
-rw-r--r--private/oleauto/tools/win16/os2/bin/c23.err95
-rw-r--r--private/oleauto/tools/win16/os2/bin/cl.err41
-rw-r--r--private/oleauto/tools/win16/os2/bin/cl.msg126
-rw-r--r--private/oleauto/tools/win16/os2/bin/ml.err277
-rw-r--r--private/oleauto/tools/win16/os2/bin/rcpp.err334
-rw-r--r--private/oleauto/tools/win16/os2/inc/assert.h35
-rw-r--r--private/oleauto/tools/win16/os2/inc/bios.h242
-rw-r--r--private/oleauto/tools/win16/os2/inc/bse.h47
-rw-r--r--private/oleauto/tools/win16/os2/inc/bsedev.h520
-rw-r--r--private/oleauto/tools/win16/os2/inc/bsedos.h1425
-rw-r--r--private/oleauto/tools/win16/os2/inc/bseerr.h637
-rw-r--r--private/oleauto/tools/win16/os2/inc/bsesub.h565
-rw-r--r--private/oleauto/tools/win16/os2/inc/cmacros.inc1236
-rw-r--r--private/oleauto/tools/win16/os2/inc/commdlg.h286
-rw-r--r--private/oleauto/tools/win16/os2/inc/conio.h73
-rw-r--r--private/oleauto/tools/win16/os2/inc/ctype.h116
-rw-r--r--private/oleauto/tools/win16/os2/inc/custcntl.h82
-rw-r--r--private/oleauto/tools/win16/os2/inc/dde.h118
-rw-r--r--private/oleauto/tools/win16/os2/inc/direct.h51
-rw-r--r--private/oleauto/tools/win16/os2/inc/dos.h317
-rw-r--r--private/oleauto/tools/win16/os2/inc/drivinit.h164
-rw-r--r--private/oleauto/tools/win16/os2/inc/errno.h75
-rw-r--r--private/oleauto/tools/win16/os2/inc/ext.h722
-rw-r--r--private/oleauto/tools/win16/os2/inc/fasttest.inc270
-rw-r--r--private/oleauto/tools/win16/os2/inc/fcntl.h54
-rw-r--r--private/oleauto/tools/win16/os2/inc/file.lst34
-rw-r--r--private/oleauto/tools/win16/os2/inc/float.h213
-rw-r--r--private/oleauto/tools/win16/os2/inc/fstream.h132
-rw-r--r--private/oleauto/tools/win16/os2/inc/ftestkey.mst1061
-rw-r--r--private/oleauto/tools/win16/os2/inc/ftestlog.mst1468
-rw-r--r--private/oleauto/tools/win16/os2/inc/ftestutl.mst954
-rw-r--r--private/oleauto/tools/win16/os2/inc/graph.h471
-rw-r--r--private/oleauto/tools/win16/os2/inc/ime.h333
-rw-r--r--private/oleauto/tools/win16/os2/inc/io.h162
-rw-r--r--private/oleauto/tools/win16/os2/inc/iomanip.h125
-rw-r--r--private/oleauto/tools/win16/os2/inc/ios.h191
-rw-r--r--private/oleauto/tools/win16/os2/inc/iostream.h58
-rw-r--r--private/oleauto/tools/win16/os2/inc/istream.h139
-rw-r--r--private/oleauto/tools/win16/os2/inc/limits.h44
-rw-r--r--private/oleauto/tools/win16/os2/inc/locale.h84
-rw-r--r--private/oleauto/tools/win16/os2/inc/malloc.h159
-rw-r--r--private/oleauto/tools/win16/os2/inc/math.h252
-rw-r--r--private/oleauto/tools/win16/os2/inc/memory.h75
-rw-r--r--private/oleauto/tools/win16/os2/inc/mmsystem.h1917
-rw-r--r--private/oleauto/tools/win16/os2/inc/mstest.inc896
-rw-r--r--private/oleauto/tools/win16/os2/inc/new.h40
-rw-r--r--private/oleauto/tools/win16/os2/inc/new.hxx51
-rw-r--r--private/oleauto/tools/win16/os2/inc/nlsapi.h428
-rw-r--r--private/oleauto/tools/win16/os2/inc/ole.h464
-rw-r--r--private/oleauto/tools/win16/os2/inc/os2.h28
-rw-r--r--private/oleauto/tools/win16/os2/inc/os2def.h405
-rw-r--r--private/oleauto/tools/win16/os2/inc/ostream.h119
-rw-r--r--private/oleauto/tools/win16/os2/inc/pgchart.h256
-rw-r--r--private/oleauto/tools/win16/os2/inc/pm.h82
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmavio.h39
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmbitmap.h55
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmdev.h293
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmerr.h799
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmfont.h120
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmgpi.h1388
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmhelp.h268
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmmle.h232
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmord.h793
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmpic.h24
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmsei.h44
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmshl.h402
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmspl.h647
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmstddlg.h335
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmtypes.h264
-rw-r--r--private/oleauto/tools/win16/os2/inc/pmwin.h2980
-rw-r--r--private/oleauto/tools/win16/os2/inc/process.h133
-rw-r--r--private/oleauto/tools/win16/os2/inc/search.h59
-rw-r--r--private/oleauto/tools/win16/os2/inc/setjmp.h41
-rw-r--r--private/oleauto/tools/win16/os2/inc/share.h29
-rw-r--r--private/oleauto/tools/win16/os2/inc/shellapi.h67
-rw-r--r--private/oleauto/tools/win16/os2/inc/signal.h68
-rw-r--r--private/oleauto/tools/win16/os2/inc/stdarg.h52
-rw-r--r--private/oleauto/tools/win16/os2/inc/stddef.h70
-rw-r--r--private/oleauto/tools/win16/os2/inc/stdio.h338
-rw-r--r--private/oleauto/tools/win16/os2/inc/stdiostr.h52
-rw-r--r--private/oleauto/tools/win16/os2/inc/stdlib.h263
-rw-r--r--private/oleauto/tools/win16/os2/inc/stream.hxx61
-rw-r--r--private/oleauto/tools/win16/os2/inc/streamb.h124
-rw-r--r--private/oleauto/tools/win16/os2/inc/string.h167
-rw-r--r--private/oleauto/tools/win16/os2/inc/strstrea.h86
-rw-r--r--private/oleauto/tools/win16/os2/inc/sys/locking.h30
-rw-r--r--private/oleauto/tools/win16/os2/inc/sys/stat.h104
-rw-r--r--private/oleauto/tools/win16/os2/inc/sys/timeb.h69
-rw-r--r--private/oleauto/tools/win16/os2/inc/sys/types.h48
-rw-r--r--private/oleauto/tools/win16/os2/inc/sys/utime.h66
-rw-r--r--private/oleauto/tools/win16/os2/inc/test.h248
-rw-r--r--private/oleauto/tools/win16/os2/inc/time.h125
-rw-r--r--private/oleauto/tools/win16/os2/inc/toolhelp.h505
-rw-r--r--private/oleauto/tools/win16/os2/inc/varargs.h52
-rw-r--r--private/oleauto/tools/win16/os2/inc/ver.h255
-rw-r--r--private/oleauto/tools/win16/os2/inc/vmemory.h60
-rw-r--r--private/oleauto/tools/win16/os2/inc/windows.h5373
-rw-r--r--private/oleauto/tools/win16/os2/inc/windows.inc2108
-rw-r--r--private/oleauto/tools/win16/os2/inc/windowsx.h1212
-rw-r--r--private/oleauto/tools/win16/os2/inc/windowsx.h161213
-rw-r--r--private/oleauto/tools/win16/os2/inc/wnapidec.inc68
-rw-r--r--private/oleauto/tools/win16/os2/lib/wchkstk.asm164
-rw-r--r--private/oleauto/update.bat2
-rw-r--r--private/oleauto/upddir.bat3
785 files changed, 387924 insertions, 0 deletions
diff --git a/private/oleauto/bin/ppcdef.awk b/private/oleauto/bin/ppcdef.awk
new file mode 100644
index 000000000..444175d23
--- /dev/null
+++ b/private/oleauto/bin/ppcdef.awk
@@ -0,0 +1,30 @@
+BEGIN {
+ SwitchedOut = 0;
+ }
+
+$1 == "#if" && $2 == "WIN16" {
+ SwitchedOut = 1;
+ }
+
+{
+ if ((SwitchedOut == 0) && (substr($0,1,1) != "#")) {
+ if (substr($1,1,1) == "_") {
+ MungedName = substr($1,2,length($1)-1);
+ print " " MungedName " " $2 " " $3
+ }
+ else {
+ i = index($1, "@");
+ if ($2 != "=" && i) {
+ MungedName = substr($1, 1, i-1);
+ print " " MungedName " " $2 " " $3
+ }
+ else {
+ print $0;
+ }
+ }
+ }
+}
+
+$1 == "#endif" {
+ SwitchedOut = 0;
+}
diff --git a/private/oleauto/bin/src/constant.h b/private/oleauto/bin/src/constant.h
new file mode 100644
index 000000000..9914db804
--- /dev/null
+++ b/private/oleauto/bin/src/constant.h
@@ -0,0 +1,48 @@
+/***
+*Constant.h - Constants used by the ifstripper, parser and symbol table
+*
+* Copyright (c) 1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Constants used by the ifstripper, parser and symbol table
+*
+*Revision History:
+* 09-30-92 MAL Initial version
+*
+*******************************************************************************/
+
+#ifndef CONSTANT_H
+#define CONSTANT_H
+
+#define TRUE 1
+#define FALSE 0 /* Boolean values */
+
+#define IF 0 /* Tokens for preprocessor statements */
+#define ELIF 1 /* These must not be re-ordered */
+#define ELSE 2
+#define ENDIF 3
+#define IFDEF 4
+#define IFNDEF 5
+#define IF1 6
+#define IF2 7
+#define IFB 8
+#define IFNB 9
+#define IFIDN 10
+#define IFDIF 11 /* CFW - added */
+#define IFE 12 /* CFW - added */
+#define maxkeyword 12
+#define maxcomment 2 /* number of comment strings */
+#define NORMAL 100
+#define KEYWORD 101 /* Used only for skipto and copyto */
+
+#define DEFINED 1
+#define UNDEFINED 2
+#define IGNORE 3
+#define NOTPRESENT 4 /* Types of switches (symbols) */
+
+#define MAXNAMELEN 65 /* Maximum length of a switch name */
+#define MAXLINELEN 512 /* Maximum input line length */
+#define MAXCONDLEN 512 /* Maximum length of a condition */
+#define MAXFILENAMELEN 97 /* Maximum file name length */
+
+#endif /* CONSTANT_H */
diff --git a/private/oleauto/bin/src/errormes.h b/private/oleauto/bin/src/errormes.h
new file mode 100644
index 000000000..0dc370ed4
--- /dev/null
+++ b/private/oleauto/bin/src/errormes.h
@@ -0,0 +1,25 @@
+/***
+*Errormes.h - Error / Warning reporting used by the ifstripper, parser and symbol table
+*
+* Copyright (c) 1988, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Error / Warning reporting used by the ifstripper, parser and symbol table
+*
+*Revision History:
+* ??-??-88 PHG Initial version
+*
+*******************************************************************************/
+
+#ifndef ERRORMES_H
+#define ERRORMES_H
+
+/* error messages, parameters are strings holding the reason and text of the line that caused the error */
+extern void error(char *, char *);
+
+/* warning messages, parameters are strings holding the reason and text of the line that caused the error */
+extern void warning(char *, char *);
+
+extern FILE *errorfile; /* file to output error/warning messages */
+
+#endif /* ERRORMES_H */
diff --git a/private/oleauto/bin/src/eval.c b/private/oleauto/bin/src/eval.c
new file mode 100644
index 000000000..d64bb2535
--- /dev/null
+++ b/private/oleauto/bin/src/eval.c
@@ -0,0 +1,489 @@
+/***
+*eval.c - if expression evaluator
+*
+* Copyright (c) 1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* produce truth values and simplified conditions from compound if
+* statements.
+*
+*Revision History:
+* 09-30-92 MAL Original version
+*
+*******************************************************************************/
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include "eval.h" /* Header for this module */
+#include "symtab.h" /* Symbol table access */
+#include "constant.h" /* Constants for tokens etc */
+#include "errormes.h" /* Errors and Warning messages */
+
+/* Types */
+typedef struct condrec
+{
+ int truth;
+ char *condition;
+} condrec, *cond;
+
+/* Global variables */
+
+extern char **comments; /* Language dependent comment strings */
+extern int *commlen; /* Lengths of above strings */
+extern int nonumbers; /* allow numeric expressions */
+
+char *operators[] = { "!", "(", ")", "||", "&&", "defined" };
+int oplengths[] = { 1, 1, 1, 2, 2, 7 };
+ /* # significant chars */
+#define numoperators 6
+#define NOT 0 /* These tokens must be in the same order as 'operators' */
+#define OPENPARENTHESIS 1
+#define CLOSEPARENTHESIS 2
+#define OR 3
+#define AND 4
+#define DEFINEDFN 5
+#define UINT 100
+#define ID 101
+#define ENDOFLINE 102
+#define UNKNOWN 103
+
+/* Global state */
+/* String holding input, the current pointer into it, and the current token */
+char conditions[MAXLINELEN], *tokenptr, currenttoken[MAXCONDLEN];
+int token = -1;
+
+/* Function prototypes */
+cond evaluateexpression(void);
+cond orexpression(void);
+cond andexpression(void);
+cond unaryexpression(void);
+cond parenthesesexpression(void);
+cond atomicexpression(void);
+cond createcondition(void);
+void destroycondition(cond);
+char *createstring(int);
+void destroystring(char *);
+void gettoken(void);
+int issymbolchar(char);
+
+/* CFW - added complex expression warning */
+void evalwarn()
+{
+ warning("cannot parse expression - ignoring", conditions);
+}
+
+void evaluate(char *outputstring, int *value, char *inputstring)
+{
+ cond result;
+ strcpy(conditions, inputstring); /* Prepare the string for tokenising */
+ tokenptr = conditions;
+ gettoken(); /* Read in the first token of input */
+ result = evaluateexpression();
+ /* check for bad/complex expression */
+ if (token != ENDOFLINE)
+ {
+ evalwarn();
+ if (result)
+ {
+ destroycondition(result);
+ result = NULL;
+ }
+ }
+ /* bad/complex expression, return IGNORE and entire expression */
+ if (!result)
+ {
+ *value = IGNORE;
+ strcpy(outputstring, inputstring);
+ return;
+ }
+ *value = result -> truth;
+ if(!result -> condition)
+ * outputstring = '\0';
+ else
+ strcpy(outputstring, result -> condition);
+ /* Convert from internal to external representation */
+ destroycondition(result);
+}
+
+cond evaluateexpression()
+{
+ return orexpression();
+}
+
+cond orexpression()
+{
+ cond condition1, condition2;
+ char *output;
+ condition1 = andexpression();
+ if (!condition1)
+ return NULL;
+ while (token == OR)
+ {
+ gettoken();
+ condition2 = andexpression();
+ if (!condition2)
+ {
+ destroycondition(condition1);
+ return NULL;
+ }
+ switch (condition1 -> truth)
+ {
+ case DEFINED: /* DEFINED || x == DEFINED */
+ /* condition1 set up correctly for next pass */
+ destroycondition(condition2);
+ break;
+ case UNDEFINED:
+ switch (condition2 -> truth)
+ {
+ case DEFINED: /* UNDEFINED || DEFINED == DEFINED */
+ destroycondition(condition1);
+ condition1 = condition2;
+ break;
+ case UNDEFINED: /* UNDEFINED || UNDEFINED == UNDEFINED */
+ destroycondition(condition2);
+ /* condition1 set up correctly for next pass */
+ break;
+ case IGNORE: /* UNDEFINED || IGNORE == IGNORE */
+ destroycondition(condition1);
+ condition1 = condition2;
+ break;
+ }
+ break;
+ case IGNORE:
+ switch (condition2 -> truth)
+ {
+ case DEFINED: /* IGNORE || DEFINED == DEFINED */
+ destroycondition(condition1);
+ condition1 = condition2;
+ break;
+ case UNDEFINED: /* IGNORE || UNDEFINED == IGNORE */
+ /* condition1 set up correctly for next pass */
+ destroycondition(condition2);
+ break;
+ case IGNORE: /* IGNORE || IGNORE == IGNORE */
+ output = createstring(strlen(condition1 -> condition)
+ + strlen (condition2 -> condition)
+ + (sizeof(" || ") - 1));
+ strcpy(output, condition1 -> condition);
+ strcat(output, " || ");
+ strcat(output, condition2 -> condition);
+ /* Build up the condition string */
+ destroystring(condition1 -> condition);
+ condition1 -> condition = output;
+ /* Place the new string in condition1 */
+ destroycondition(condition2);
+ break;
+ }
+ break;
+ }
+ }
+ return condition1;
+}
+
+cond andexpression()
+{
+ cond condition1, condition2;
+ char *output;
+ condition1 = unaryexpression();
+ if (!condition1)
+ return NULL;
+ while (token == AND)
+ {
+ gettoken();
+ condition2 = unaryexpression();
+ if (!condition2)
+ {
+ destroycondition(condition1);
+ return NULL;
+ }
+ switch (condition1 -> truth)
+ {
+ case DEFINED:
+ switch (condition2 -> truth)
+ {
+ case DEFINED: /* DEFINED && DEFINED == DEFINED */
+ destroycondition(condition2);
+ /* condition1 set up correctly for next pass */
+ break;
+ case UNDEFINED: /* DEFINED && UNDEFINED == UNDEFINED */
+ destroycondition(condition1);
+ condition1 = condition2;
+ break;
+ case IGNORE: /* DEFINED && IGNORE == IGNORE */
+ destroycondition(condition1);
+ condition1 = condition2;
+ break;
+ }
+ break;
+ case UNDEFINED: /* UNDEFINED && x == UNDEFINED */
+ /* condition1 set up correctly for next pass */
+ destroycondition(condition2);
+ break;
+ case IGNORE:
+ switch (condition2 -> truth)
+ {
+ case DEFINED: /* IGNORE && DEFINED == IGNORE */
+ /* condition1 set up correctly for next pass */
+ destroycondition(condition2);
+ break;
+ case UNDEFINED: /* IGNORE && UNDEFINED == UNDEFINED */
+ destroycondition(condition1);
+ condition1 = condition2;
+ break;
+ case IGNORE: /* IGNORE && IGNORE == IGNORE */
+ output = createstring(strlen(condition1 -> condition)
+ + strlen (condition2 -> condition)
+ + (sizeof(" && ") - 1));
+ strcpy(output, condition1 -> condition);
+ strcat(output, " && ");
+ strcat(output, condition2 -> condition);
+ /* Build up the condition string */
+ destroystring(condition1 -> condition);
+ condition1 -> condition = output;
+ /* Place the new string in condition1 */
+ destroycondition(condition2);
+ break;
+ }
+ break;
+ }
+ }
+ return condition1;
+}
+
+cond unaryexpression()
+{
+ cond condition1;
+ char *output;
+ switch (token)
+ {
+ case NOT:
+ gettoken();
+ condition1 = unaryexpression();
+ if (!condition1)
+ return NULL;
+ if ((condition1 -> truth) == IGNORE)
+ {
+ output = createstring(strlen(condition1 -> condition) + 1);
+ *output = '!';
+ strcpy(output + 1, condition1 -> condition);
+ destroystring(condition1 -> condition);
+ condition1 -> condition = output;
+ }
+ else
+ condition1 -> truth = negatecondition(condition1 -> truth);
+ break;
+ case DEFINEDFN:
+ gettoken();
+ condition1 = parenthesesexpression();
+ if (!condition1)
+ return NULL;
+ if ((condition1 -> truth) == IGNORE)
+ {
+ output = createstring(strlen(condition1 -> condition)
+ + (sizeof("defined ") - 1));
+ strcpy(output, "defined ");
+ strcat(output, condition1 -> condition);
+ destroystring(condition1 -> condition);
+ condition1 -> condition = output;
+ }
+ break;
+ default:
+ condition1 = parenthesesexpression();
+ if (!condition1)
+ return NULL;
+ break;
+ }
+ return condition1;
+}
+
+cond parenthesesexpression()
+{
+ cond condition1;
+ char *output;
+ if (token == OPENPARENTHESIS)
+ {
+ gettoken();
+ condition1 = evaluateexpression();
+ if (!condition1)
+ return NULL;
+ if (token != CLOSEPARENTHESIS)
+ {
+ /* check for bad/complex expression */
+ evalwarn();
+ destroycondition(condition1);
+ return NULL;
+ }
+ gettoken();
+ if ((condition1 -> truth) == IGNORE)
+ {
+ output = createstring(strlen(condition1 -> condition) + 2);
+ *output = '(';
+ strcpy(output + 1, condition1 -> condition);
+ strcat(output, ")");
+ destroystring(condition1 -> condition);
+ condition1 -> condition = output;
+ }
+ }
+ else
+ condition1 = atomicexpression();
+ return condition1;
+}
+
+cond atomicexpression()
+{
+ cond condition1 = createcondition();
+
+ switch (token)
+ {
+ case UINT:
+ condition1 -> truth = (atoi(currenttoken) == 0) ? UNDEFINED : DEFINED;
+ break;
+ case ID:
+ condition1 -> truth = lookupsym(currenttoken);
+ if ((condition1 -> truth) == NOTPRESENT)
+ {
+ warning("Switch unlisted - ignoring", currenttoken);
+ condition1 -> truth = IGNORE;
+ }
+ if ((condition1 -> truth) == IGNORE) {
+ condition1 -> condition = createstring(strlen(currenttoken));
+ strcpy(condition1 -> condition, currenttoken);
+ }
+ break;
+ default:
+ /* bad/complex expression */
+ evalwarn();
+ destroycondition(condition1);
+ return NULL;
+ break;
+ }
+ gettoken();
+ return condition1;
+}
+
+/* Negate condition (MAL) */
+__inline int negatecondition(int condvalue) /* inline for speed */
+{
+ switch (condvalue)
+ {
+ case DEFINED:
+ return UNDEFINED;
+ case UNDEFINED:
+ return DEFINED;
+ default:
+ return condvalue;
+ };
+}
+
+/* Allocate the memory for an empty condition structure and return a pointer to it */
+__inline cond createcondition()
+{
+ cond retvalue;
+ retvalue = (cond) malloc(sizeof(condrec));
+ if (retvalue == NULL)
+ error("Memory overflow","");
+ retvalue -> condition = NULL;
+ return retvalue;
+}
+
+/* Destroy a condition structure */
+__inline void destroycondition(cond condition1)
+{
+ if (condition1 -> condition)
+ free(condition1 -> condition);
+
+ free(condition1);
+}
+
+/* Allocate the memory for a string of given length (not including terminator) and return the pointer */
+__inline char *createstring(int length)
+{
+ char *retvalue;
+ retvalue = (char *) malloc(length + 1);
+ if (retvalue == NULL)
+ error("Memory overflow","");
+ return retvalue;
+}
+
+/* Destroy a string */
+__inline void destroystring(char *string)
+{
+ free(string);
+}
+
+int iscomment(char *tokenptr)
+{
+ int cindex;
+
+ for (cindex = 0; cindex < maxcomment; cindex++)
+ {
+ if (commlen[cindex] &&
+ !strnicmp(tokenptr, comments[cindex], commlen[cindex]))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void gettoken()
+{
+ int numofwhitespace, comparetoken = 0, found = FALSE, isnumber = TRUE;
+ char *digitcheck;
+
+ numofwhitespace = strspn(tokenptr, " \t");
+
+ /* CFW - skips comments, assumes comment is last thing on line */
+ if (numofwhitespace == (int) strlen(tokenptr))
+ token = ENDOFLINE;
+ else
+ {
+ tokenptr += numofwhitespace;
+ if (iscomment(tokenptr))
+ token = ENDOFLINE;
+ else
+ {
+
+ do
+ {
+ if (!strnicmp(tokenptr, operators[comparetoken], oplengths[comparetoken]))
+ found = TRUE;
+ else
+ comparetoken++;
+ } while ( (!found) && (comparetoken < numoperators) );
+ if (found)
+ {
+ tokenptr += oplengths[comparetoken];
+ token = comparetoken;
+ /* currenttoken is left blank for all but UINTs and IDs */
+ }
+ else
+ {
+ digitcheck = tokenptr;
+ if (!nonumbers && isdigit(*digitcheck))
+ {
+ while (isdigit(*digitcheck))
+ digitcheck++;
+ strncpy(currenttoken, tokenptr, digitcheck - tokenptr);
+ tokenptr = digitcheck;
+ token = UINT;
+ }
+ else if (issymbolchar(*digitcheck))
+ {
+ while (issymbolchar(*digitcheck))
+ digitcheck++;
+ strncpy(currenttoken, tokenptr, digitcheck - tokenptr);
+ *(currenttoken + (digitcheck - tokenptr)) = '\0';
+ tokenptr = digitcheck;
+ token = ID;
+ }
+ else
+ token = UNKNOWN;
+ }
+ }
+ }
+}
+
+__inline int issymbolchar(char c)
+{
+ return (iscsym(c) || (c == '$') || (c == '?'));
+}
diff --git a/private/oleauto/bin/src/eval.h b/private/oleauto/bin/src/eval.h
new file mode 100644
index 000000000..b8a6a66c9
--- /dev/null
+++ b/private/oleauto/bin/src/eval.h
@@ -0,0 +1,22 @@
+/***
+*Eval.h - If expression evaluator
+*
+* Copyright (c) 1988, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Evaluate complex if expressions
+*
+*Revision History:
+* ??-??-88 PHG Initial version
+*
+*******************************************************************************/
+
+/* Take a pointer to workspace for a simplified condition and truth value, and pass in the condition string to simplify */
+extern void evaluate(char *, int *, char *);
+
+/* Produce the negative of a truth value,
+ !DEFINED == UNDEFINED
+ !UNDEFINED == DEFINED
+ !IGNORE == IGNORE
+ !NOTPRESENT == NOTPRESENT */
+extern int negatecondition(int);
diff --git a/private/oleauto/bin/src/evaltest.c b/private/oleauto/bin/src/evaltest.c
new file mode 100644
index 000000000..94636da00
--- /dev/null
+++ b/private/oleauto/bin/src/evaltest.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include "symtab.h"
+#include "eval.h"
+#include "constant.h"
+#include "errrpt.h"
+
+void main(int argc, char *argv[])
+{
+ char expression[MAXLINELEN], output[MAXLINELEN];
+ int truth;
+ readsyms("switches");
+ printf("If expression evaluator test program\n");
+ for(;;)
+ {
+ printf("Evaluate: #if ");
+ gets(expression);
+ evaluate(output, &truth, expression);
+ switch (truth)
+ {
+ case DEFINED:
+ puts("DEFINED");
+ break;
+ case UNDEFINED:
+ puts("UNDEFINED");
+ break;
+ case IGNORE:
+ printf("IGNORE - condition %s\n",output);
+ break;
+ }
+ }
+}
diff --git a/private/oleauto/bin/src/evps.h b/private/oleauto/bin/src/evps.h
new file mode 100644
index 000000000..669d606b1
--- /dev/null
+++ b/private/oleauto/bin/src/evps.h
@@ -0,0 +1,175 @@
+/***
+*evps.h - IEnumVARIANT Proxy and Stub class definitions
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the IEnumVARIANT Proxy and Stub classes.
+*
+* CProxEnumVARIANT -- the IEnumVARIANT proxy class
+* CPEVUnkImpl - CProxEnumVARIANT implementation of IUnknown
+* CPEVProxImpl - CProxEnumVARIANT implementation of IRpcProxy
+* CPEVEnumVARIANTImpl - CProxEnumVARIANT implementation of IEnumVARIANT
+*
+* CStubEnumVARIANT -- the IEnumVARIANT stub class
+*
+*Revision History:
+*
+* [00] 05-Nov-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef __evps_h__
+#define __evps_h__
+
+#pragma warning(4:4355)
+
+
+// forward declarations
+class FAR CProxEnumVARIANT;
+class FAR CStubEnumVARIANT;
+
+
+// IEnumVARIANT proxy class' IUnknown implementation
+class FAR CPEVUnkImpl : public IUnknown
+{
+public:
+ CPEVUnkImpl(CProxEnumVARIANT FAR* pproxenum);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+private:
+ CProxEnumVARIANT FAR* m_pproxenum;
+};
+
+
+// IEnumVARIANT proxy class' IRpcProxy implementation
+class CPEVProxImpl : public IPROXY
+{
+public:
+ CPEVProxImpl(CProxEnumVARIANT FAR* pproxenum);
+ ~CPEVProxImpl();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(Connect)(ICHANNEL FAR* plrpc);
+ STDMETHOD_(void, Disconnect)(void);
+
+private:
+ CProxEnumVARIANT FAR* m_pproxenum;
+};
+
+
+// IEnumVARIANT
+//
+class CPEVEnumVARIANTImpl : public IEnumVARIANT
+{
+public:
+ CPEVEnumVARIANTImpl(CProxEnumVARIANT FAR* pproxy);
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IEnumVARIANT methods
+ STDMETHOD(Next)(unsigned long celt, VARIANT FAR* rgvar, unsigned long FAR* pceltFetched);
+ STDMETHOD(Skip)(unsigned long celt);
+ STDMETHOD(Reset)(void);
+ STDMETHOD(Clone)(IEnumVARIANT FAR* FAR* ppenum);
+
+private:
+ CProxEnumVARIANT FAR* m_pproxenum;
+};
+
+
+// IEnumVARIANT Proxy Class
+class FAR CProxEnumVARIANT
+{
+public:
+ static IUnknown FAR* Create(IUnknown FAR* punkOuter);
+
+private:
+ CProxEnumVARIANT(IUnknown FAR* punkOuter);
+
+ friend CPEVUnkImpl;
+ friend CPEVProxImpl;
+ friend CPEVEnumVARIANTImpl;
+
+ CPEVUnkImpl m_unk;
+ CPEVProxImpl m_proxy;
+ CPEVEnumVARIANTImpl m_enum;
+
+private:
+ unsigned long m_refs;
+ ICHANNEL FAR* m_plrpc;
+ IUnknown FAR* m_punkOuter;
+};
+
+
+// IEnumVARIANT Stub Class
+//
+class FAR CStubEnumVARIANT : public ISTUB
+{
+public:
+ static ISTUB FAR* FAR Create(IUnknown FAR* punkServer);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IRpcStub methods
+ //
+#if ((OE_WIN32 && defined (OA_UNICODE)) || defined (WOW))
+ STDMETHOD(Connect)(IUnknown FAR* pUnk);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg,
+ IRpcChannelBuffer FAR* pRpcChannel);
+ STDMETHOD_(IRpcStubBuffer *, IsIIDSupported)(REFIID iid);
+ STDMETHOD_(ULONG, CountRefs)(void);
+ STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv);
+ STDMETHOD_(void, DebugServerRelease)(void FAR* pv);
+#else
+ STDMETHOD(Connect)(IUnknown FAR* punkObject);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(
+ REFIID riid,
+ int imeth,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx);
+ STDMETHOD_(BOOL, IsIIDSupported)(REFIID riid);
+ STDMETHOD_(unsigned long, CountRefs)(void);
+#endif
+
+private:
+ CStubEnumVARIANT();
+ ~CStubEnumVARIANT();
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punk;
+ IEnumVARIANT FAR* m_penum;
+};
+
+
+// IEnumVARIANT method indices
+//
+#define IMETH_ENUMVARIANT_QUERYINTERFACE 0 /* Placeholder */
+#define IMETH_ENUMVARIANT_ADDREF 1 /* Placeholder */
+#define IMETH_ENUMVARIANT_RELEASE 2 /* Placeholder */
+
+#define IMETH_ENUMVARIANT_NEXT 3
+#define IMETH_ENUMVARIANT_SKIP 4
+#define IMETH_ENUMVARIANT_RESET 5
+#define IMETH_ENUMVARIANT_CLONE 6
+
+#endif
diff --git a/private/oleauto/bin/src/includes.c b/private/oleauto/bin/src/includes.c
new file mode 100644
index 000000000..93b432608
--- /dev/null
+++ b/private/oleauto/bin/src/includes.c
@@ -0,0 +1,464 @@
+/****************************************************************************
+* INCLUDES - Create dependency makefile for a list of files
+*
+* tabstops:4
+*
+* To compile:
+* OS/2 (C7): cl /W3 /c /AM /Ox /G2 includes.c
+* NT: cl /W3 /c /Ox -DOE_WIN32 includes.c
+*
+* The OS/2 version could be compiled with /AS, except SLIBCEP.LIB is not
+* checked into the SILVER project.
+*
+* Usage:
+* includes [-o outfile] <-i path> [-f infile]
+*
+* Where:
+* -o specifies the output makefile. Default is stdout
+* -i adds an include path. The space between -i and the path is optional
+* -f specifies the input file. This file is a list of fully qualified
+* filenames, one per line. All source and include files used during
+* the build must be listed. ^^^^^^^
+*
+* Notes:
+*
+* 1. This INCLUDES does not recurse through nested include files, so 'infile'
+* must explicitly list all include files referenced in the build. ie.
+* if FOO.C includes BAR.H, and BAR.H includes NEST.H, then FOO,BAR, and
+* NEST must all be listed in 'infile'. INCLUDES will create the following
+* makefile:
+*
+* FOO.C : BAR.H
+*
+* BAR.H : NEST.H
+*
+* A recursive algorithm would generate the following makefile, given only
+* FOO.C:
+*
+* FOO.C : BAR.H NEST.H
+*
+* 2. .ASM and .INC files are assumed to be compiled with MASM (or ML) and
+* have different rules for searching for include files. .A and .I files
+* are assumed to use the C preprocessor.
+*
+*
+* Revision History:
+*
+* 09-Nov-92 w-barryb Created
+*
+****************************************************************************/
+
+#if OE_WIN32
+#pragma message ("Building NT version")
+
+#define NEAR
+#define CBSCANBUF 300000 // max size of scan buffer
+
+#else
+#pragma message ("Building OS/2 version")
+
+#define NEAR __near
+#define CBSCANBUF 50000 // max size of scan buffer
+
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <io.h>
+
+#define CFNINCMAC 25 // max number of include paths
+#define CBPATH 128 // max size of DIRECTORY text
+
+char pszScanBuf[CBSCANBUF+1]; // buffer to scan incs with
+
+int cpszfnInc = 0; // count of include paths
+char *tpszfnInc[CFNINCMAC]; // pointers to include paths
+
+FILE *fhFiles = NULL; // file handle of list of source files
+FILE *fhDest = NULL; // file handle of output file
+
+char pinpBuf[CBPATH]; // name of current source file
+
+int NEAR fCheckIsIntelAsm(char *);
+void NEAR commandline(int argc, char **argv);
+void NEAR error(char *, char *);
+void NEAR warn(char *, char *);
+void NEAR processfiles(void);
+void NEAR newdependency(char *pszIncFile, char *pszSrcFile);
+char * NEAR inclsearchCPP(char **, char *);
+char * NEAR inclsearchMASM(char **, char *);
+
+
+
+void cdecl main(int argc, char *argv[])
+{
+ fhDest = stdout; // default is output to stdout
+
+ commandline(argc, argv); // process command-line
+
+ processfiles(); // process list of source files
+
+ fclose(fhDest);
+ fclose(fhFiles);
+ exit(0);
+}
+
+
+
+// process the command-line
+void NEAR commandline(int argc, char **argv)
+{
+ char szT[CBPATH];
+ char *pszT;
+
+ if (argc == 1) {
+ printf("includes [-o outfile] {-i path} [-f infile]\n");
+ printf("where:\n");
+ printf("\t-i\t- Add additional include search path\n");
+ printf("\t-f\t- File listing all source files to examine\n");
+ printf("\t-o\t- Output dependency file to outfile\n");
+ exit(1);
+ }
+
+ while (--argc > 0) { // for all the arguments
+ argv++; // point at the next argument
+
+ if (memicmp(*argv, "-i", 2) == 0) { // include path?
+ if (strlen(*argv) > 2) { // -i with no space following
+
+ strcpy(szT, (*argv)+2);
+ goto AddInclude;
+
+ } else if (--argc > 0) { // if string, add it
+ strcpy(szT, *(++argv)); // get path fragment
+AddInclude:
+ if (strcmp(szT, ".") == 0)
+ szT[0] = '\0';
+ else {
+ pszT = &szT[0] + strlen(szT)-1; // last char
+ if (*pszT++ != '\\') { // see if it ends in '\'
+ *pszT++ = '\\'; // else add separator
+ *pszT = '\0';
+ }
+ }
+ if (cpszfnInc > CFNINCMAC)
+ error("too many include paths", "");
+ tpszfnInc[cpszfnInc++] = strdup(szT);
+ }
+ else
+ error("expected path after -I", "");
+ }
+ else if (stricmp(*argv, "-f") == 0) { // input filename
+ if (--argc > 0) {
+ fhFiles = fopen((*(++argv)),"r");
+ if (fhFiles == NULL)
+ error("Cannot open input file: ", *argv);
+ }
+ else
+ error("expected filename after -f", "");
+ }
+ else if (stricmp(*argv, "-o") == 0) { // output filename
+ if (--argc > 0) {
+ fhDest = fopen((*(++argv)),"w");
+ if (fhDest == NULL)
+ error("Cannot open output file: ", *argv);
+ }
+ else
+ error("expected filename after -o", "");
+ }
+ else
+ error("Unknown command line switch", *argv);
+ }
+
+ if (fhFiles == NULL)
+ error("No input file specified", "");
+
+ // if no -I found
+ if (cpszfnInc == 0)
+ error("Must specify at least one include path with -i", "");
+}
+
+
+// print an error message and exit out
+void NEAR error(char *psz1, char *psz2)
+{
+ fprintf(stderr, "INCLUDES: error : %s %s\n", psz1, psz2);
+ exit(2);
+}
+
+
+// print a warning and continue. ie. couldn't find include file...
+void NEAR warn(char *psz1, char *psz2)
+{
+ fprintf(stderr, "%s: %s %s\n", pinpBuf, psz1, psz2);
+}
+
+
+// build the dependency list for each file listed in the file fhFiles
+void NEAR processfiles(void)
+{
+ char *pszLnCur; // ptr to current input line
+ int hFile;
+ int fMASM; // false if C preprocessor runs over file during build
+ char *pszBuf;
+ char *pszLast;
+ char *pszIncFile;
+ unsigned int cbFree;
+ unsigned int cbRead;
+ unsigned int cbCopy;
+
+ while ((pszLnCur = (char *)fgets(pinpBuf, CBPATH, fhFiles)) != NULL) {
+
+ // replace the '\n' with a '\0'
+
+ pszBuf = strchr(pszLnCur, '\n');
+ if (pszBuf == NULL)
+ pinpBuf[CBPATH-1] = '\0';
+ else
+ *pszBuf = '\0';
+
+ // we use two different searches for the word 'include' depending on
+ // whether the file uses the C preprocessor to process include files
+ // using '#include', or whether the file uses MASM 'include' syntax.
+
+ fMASM = fCheckIsIntelAsm(pszBuf);
+
+ hFile = open(pszLnCur, O_BINARY | O_RDONLY);
+ if (hFile == -1)
+ error("unable to open source file", pszLnCur);
+
+ fprintf(fhDest, "%s : ", pszLnCur); // append source file name
+
+ pszBuf = pszScanBuf;
+ cbFree = CBSCANBUF;
+
+ // read through the file, looking for include file names. Read
+ // big chunks of the file with low-level I/O for speed.
+ for (;;) {
+
+ cbRead = read(hFile, pszBuf, cbFree);
+ if (cbRead == (unsigned)-1)
+ error("Error reading", pszLnCur);
+
+ cbFree -= cbRead;
+
+ pszLast = pszScanBuf + CBSCANBUF - cbFree;
+
+
+ if (fMASM) {
+ *pszLast = '\n';
+ while (pszIncFile = inclsearchMASM(&pszBuf, pszLast))
+ newdependency(pszIncFile, pinpBuf);
+ } else {
+ *pszLast = '\0';
+ while (pszIncFile = inclsearchCPP(&pszBuf, pszLast))
+ newdependency(pszIncFile, pinpBuf);
+ }
+
+ if (cbFree)
+ break;
+
+ // copy any unused chars to beginning of buffer and reset vars
+
+ cbFree = pszBuf - pszScanBuf;
+ cbCopy = (unsigned)(CBSCANBUF) - cbFree;
+
+ // make sure we will not overwrite part of ourselves when we copy
+
+ if (cbCopy >= cbFree)
+ error("Overlap region greater than 1/2 buffer", "");
+
+ pszBuf = (char *)memcpy(pszScanBuf, pszBuf, cbCopy) + cbCopy;
+ }
+ close(hFile);
+ fprintf(fhDest, "\n\n"); // append blank line after includes
+ }
+}
+
+
+// passed ptr to zero terminator at end of file name. Checks extension of
+// file: .INC and .ASM are treated as MASM files - all others are assumed to
+// use the C preprocessor to expand #include.
+int NEAR fCheckIsIntelAsm(char *pszEndOfFileName)
+{
+ // search backwards for the last '.'
+ while (*pszEndOfFileName != '.')
+ pszEndOfFileName--;
+
+ // move to the char after the '.' - the first character of the extension
+ pszEndOfFileName++;
+
+ // if the file ends in ASM or INC, assume it is a MASM file, else assume
+ // the file contains C-style #includes
+
+ if ((stricmp(pszEndOfFileName, "asm") == 0) ||
+ (stricmp(pszEndOfFileName, "inc") == 0))
+ return -1; // MASM-style
+ else
+ return 0; // C-style
+}
+
+
+// search a file for #include and create the dependency list for the source
+// file
+char * NEAR inclsearchCPP(char **pszBuf, char *pszBufEnd)
+{
+ char *pszInclude;
+ char *retval;
+
+TryAgain:
+ /* try to locate # include */
+ for (;;) {
+
+ pszInclude = strchr(*pszBuf,'#');
+ if (!pszInclude) {
+ *pszBuf = pszBufEnd;
+ return NULL;
+ }
+
+ /* check to see that the #include is preceded by 0 or more whitespace
+ characters only */
+
+ for (retval = pszInclude-1; retval > *pszBuf && (*retval == ' ' || *retval == '\t'); retval--)
+ ;
+
+ if (retval > *pszBuf && *retval != '\n') {
+ *pszBuf = pszInclude+1;
+ continue;
+ }
+
+ pszInclude++;
+
+ while ((*pszInclude == ' ') || (*pszInclude == '\t')) pszInclude++;
+
+ *pszBuf = pszInclude;
+
+ if (strncmp(pszInclude,"include",7) == 0)
+ break;
+ }
+
+ pszInclude += 8; /* point to char folloing '#include' */
+
+ while ((*pszInclude == ' ') || (*pszInclude == '\t')) pszInclude++;
+
+ if (*pszInclude == '<') goto TryAgain;
+
+ if (*pszInclude != '"')
+ error("Invalid #include format","");
+
+ retval = ++pszInclude;
+
+ while ((*pszInclude != '"') && (*pszInclude != '>') && (*pszInclude != '\n'))
+ pszInclude++;
+
+ *pszInclude++ = '\0';
+ *pszBuf = pszInclude;
+
+ return retval;
+}
+
+
+// search a .ASM or .INC file for include files and create the dependency
+// list for the source file
+char * NEAR inclsearchMASM(char **pszBuf, char *pszBufEnd)
+{
+ char *pszInclude;
+ char *retval;
+
+ pszInclude = *pszBuf;
+
+ for (;;) {
+
+ // skip any leading spaces
+ while ((*pszInclude == ' ') || (*pszInclude == '\t')) pszInclude++;
+
+ // do case-insensitive compare
+ if (memicmp(pszInclude,"include",7) == 0)
+ break;
+
+TryAgain:
+ // find the next end-of-line
+ pszInclude = strchr(pszInclude, '\n');
+
+ // if it is the last one, the line may be been truncated in the buffer
+ // load more text and try again
+ if (pszInclude == pszBufEnd)
+ return NULL;
+
+ pszInclude++; // skip '\n' at end-of-line
+ *pszBuf = pszInclude;
+ }
+
+ // found the word 'include' skip it and any spaces afterwards
+
+ pszInclude += 7;
+ while ((*pszInclude == ' ') || (*pszInclude == '\t')) pszInclude++;
+
+ if (*pszInclude == ';') // found a comment?
+ goto TryAgain; // give up on this line and try again
+
+ retval = pszInclude; // store ptr to start of include file name
+
+ // search for next whitespace, '\n', or comment
+
+ while ((*pszInclude != ' ') && (*pszInclude != '\t') &&
+ (*pszInclude != '\n') && (*pszInclude != ';'))
+ pszInclude++;
+
+ // zero-terminate include-file name
+
+ if (*pszInclude == '\n')
+ *(pszInclude-1) = '\0';
+ else
+ *pszInclude++ = '\0';
+
+ *pszBuf = pszInclude;
+
+ return retval;
+}
+
+
+// given the name of an include file, create a fully qualified pathname to it
+// by searching the list of include paths specified by -I on the command-line
+void NEAR newdependency(char *pszIncFile, char *pszSrcFile)
+{
+ int iCnt;
+ char pszFName[CBPATH];
+ char *psz;
+
+ // search the directory of the source file first
+
+ strcpy(pszFName, pszSrcFile);
+ psz = strrchr(pszFName, '\\'); // find last '\' in pathname
+ if (psz == NULL) // no '\' - try current directory
+ psz = pszIncFile;
+ else {
+ strcpy(psz+1, pszIncFile); // append include file name to path
+ psz = pszFName;
+ }
+
+ if (access(psz, 4) == 0) { // found file?
+ fprintf(fhDest, "\\\n\t%s ", psz); // yes - append dependency file
+ return;
+ }
+
+ // find the include file along one of the include paths
+
+ for (iCnt = 0; iCnt < cpszfnInc; ++iCnt) {
+ strcpy(pszFName, tpszfnInc[iCnt]);
+ strcat(pszFName, pszIncFile);
+ if (access(pszFName, 4) == 0)
+ break;
+ }
+
+ if (iCnt >= cpszfnInc) {
+ warn("can not find include file", pszIncFile);
+ return;
+ }
+
+ fprintf(fhDest, "\\\n\t%s ", pszFName); // append dependency file
+}
diff --git a/private/oleauto/bin/src/make.bat b/private/oleauto/bin/src/make.bat
new file mode 100644
index 000000000..a08fc95af
--- /dev/null
+++ b/private/oleauto/bin/src/make.bat
@@ -0,0 +1,4 @@
+set path=%vbatools%\win32\win32\bin;%vbatools%\win32\bin;%Path%
+set lib=%vbatools%\win32\win32\lib
+set include=%vbatools%\win32\win32\inc
+nmake
diff --git a/private/oleauto/bin/src/makefile b/private/oleauto/bin/src/makefile
new file mode 100644
index 000000000..f253c13da
--- /dev/null
+++ b/private/oleauto/bin/src/makefile
@@ -0,0 +1,123 @@
+# Microsoft Visual C++ generated build script - Do not modify
+
+PATHSAVE=$(PATH)
+#INCLUDEDIR=-I$(VBATOOLS)\win32\win32\inc
+
+PROJ = IFSTRIP
+DEBUG = 1
+PROGTYPE = 2
+CALLER =
+#ARGS = d:\vb4\ruby\ruby.c
+DLLS =
+ORIGIN = MSVCNT
+ORIGIN_VER = 1.00
+PROJPATH = C:\IFSTRIP2\
+USEMFC = 0
+CC = $(VBATOOLS)\win32\win32\bin\cl
+CPP = $(VBATOOLS)\win32\win32\bin\cl
+CXX = $(VBATOOLS)\win32\win32\bin\cl
+CCREATEPCHFLAG =
+CPPCREATEPCHFLAG =
+CUSEPCHFLAG =
+CPPUSEPCHFLAG =
+FIRSTC =
+FIRSTCPP =
+RC = $(VBATOOLS)\win32\win32\bin\rc
+CFLAGS_D_DEXE32 = /nologo /D_X86_ /W3 /FR /YX /D_DEBUG /Zi /D_CONSOLE /Fd"IFSTRIP.PDB" /Fp"IFSTRIP.PCH"
+CFLAGS_R_DEXE32 = /nologo /D_X86_ /W3 /FR /YX /O2 /DNDEBUG /D_CONSOLE /Fp"IFSTRIP.PCH"
+#LFLAGS_D_DEXE32 = /NOLOGO /DEBUG /DEBUGTYPE:cv /SUBSYSTEM:console netapi32.lib
+LFLAGS_D_DEXE32 = /NOLOGO -debug:full -debugtype:cv,fixup /SUBSYSTEM:console /NOD /nopack /incremental:no /pdb:none
+LFLAGS_R_DEXE32 = /NOLOGO /SUBSYSTEM:console netapi32.lib /NOD /nopack /incremental:no /pdb:none
+LFLAGS_D_LIB32 = /NOLOGO
+LFLAGS_R_LIB32 = /NOLOGO
+LIBS_D_DEXE32 = libc.lib kernel32.lib
+LIBS_R_DEXE32 = libc.lib kernel32.lib
+RCFLAGS32 =
+D_RCDEFINES32 = -d_DEBUG
+R_RCDEFINES32 = -dNDEBUG
+OBJS_EXT =
+LIBS_EXT =
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS_D_DEXE32)
+LFLAGS = $(LFLAGS_D_DEXE32)
+LIBS = $(LIBS_D_DEXE32)
+LFLAGS_LIB=$(LFLAGS_D_LIB32)
+MAPFILE_OPTION =
+RCDEFINES = $(D_RCDEFINES32)
+!else
+CFLAGS = $(CFLAGS_R_DEXE32)
+LFLAGS = $(LFLAGS_R_DEXE32)
+LIBS = $(LIBS_R_DEXE32)
+MAPFILE_OPTION =
+LFLAGS_LIB=$(LFLAGS_R_LIB32)
+RCDEFINES = $(R_RCDEFINES32)
+!endif
+SBRS = EVAL.SBR \
+ IFSTRIP.SBR \
+ SYMTAB.SBR
+
+
+EVAL_DEP = \
+ c:\ifstrip2\eval.h \
+ c:\ifstrip2\symtab.h \
+ c:\ifstrip2\constant.h \
+ c:\ifstrip2\errormes.h
+
+
+IFSTRIP_DEP = \
+ c:\ifstrip2\constant.h \
+ c:\ifstrip2\errormes.h \
+ c:\ifstrip2\symtab.h \
+ c:\ifstrip2\eval.h
+
+
+SYMTAB_DEP = \
+ c:\ifstrip2\constant.h \
+ c:\ifstrip2\errormes.h \
+ c:\ifstrip2\symtab.h
+
+
+all: setflags $(PROJ).EXE $(PROJ).BSC resetflags
+
+setflags:
+ set PATH=$(VBATOOLS)\win32\win32\bin;$(VBATOOLS)\win32\bin;$(PATH)
+ set LIB=$(VBATOOLS)\win32\win32\lib;
+ set INCLUDE=$(VBATOOLS)\win32\win32\inc
+
+resetflags:
+ set LIB=
+ set INCLUDE=
+ set PATH=$(PATHSAVE)
+
+EVAL.OBJ: EVAL.C $(EVAL_DEP)
+ $(CC) $(CFLAGS) $(CUSEPCHFLAG) $(INCLUDEDIR) /c EVAL.C
+
+IFSTRIP.OBJ: IFSTRIP.C $(IFSTRIP_DEP)
+ $(CC) $(CFLAGS) $(CUSEPCHFLAG) $(INCLUDEDIR) /c IFSTRIP.C
+
+SYMTAB.OBJ: SYMTAB.C $(SYMTAB_DEP)
+ $(CC) $(CFLAGS) $(CUSEPCHFLAG) $(INCLUDEDIR) /c SYMTAB.C
+
+$(PROJ).EXE: EVAL.OBJ IFSTRIP.OBJ SYMTAB.OBJ $(OBJS_EXT) $(LIBS_EXT)
+ echo >NUL @<<$(PROJ).CRF
+EVAL.OBJ
+IFSTRIP.OBJ
+SYMTAB.OBJ
+$(OBJS_EXT)
+-OUT:$(PROJ).EXE
+$(MAPFILE_OPTION)
+$(LIBS)
+$(LIBS_EXT)
+$(DEFFILE_OPTION) -implib:$(PROJ).lib
+<<
+ %VBATOOLS%\win32\win32\bin\link $(LFLAGS) @$(PROJ).CRF
+ cvpack $(PROJ).exe
+
+run: $(PROJ).EXE
+ $(PROJ) $(RUNFLAGS)
+
+
+$(PROJ).BSC: $(SBRS)
+ bscmake @<<
+/o$@ $(SBRS)
+<<
diff --git a/private/oleauto/bin/src/mk.bat b/private/oleauto/bin/src/mk.bat
new file mode 100644
index 000000000..d1586eb55
--- /dev/null
+++ b/private/oleauto/bin/src/mk.bat
@@ -0,0 +1,23 @@
+setlocal
+if '%host%' == 'WIN32' set CPU_VALUE=i386
+if NOT '%host%' == 'WIN32' set CPU_VALUE=%HOST%
+
+if '%_NTBINDIR%'=='' goto use_vbatools
+ set path=%_NTBINDIR%\mstools
+ set include=.;%_NTBINDIR%\public\sdk\inc;%_NTBINDIR%\public\sdk\inc\crt
+ set lib=%_NTBINDIR%\public\sdk\lib\%CPU_VALUE%
+ goto doit
+
+:use_vbatools
+ set path=%vbatools%\%host%\%host%\bin;%vbatools%\%host%\bin
+ set include=.;%oleprog%\src\inc;%vbatools%\win32\win32\inc
+ set lib=%CPU_VALUE%;%vbatools%\%host%\%host%\lib
+
+:doit
+cl /c /W3 /Ox -DWIN32 results.c
+link -subsystem:console -nodefaultlib -out:results.exe results.obj kernel32.lib libc.lib
+
+cl /c /W3 /Ox -DOE_WIN32 includes.c
+link -subsystem:console -nodefaultlib -out:includes.exe includes.obj kernel32.lib libc.lib
+
+endlocal
diff --git a/private/oleauto/bin/src/results.c b/private/oleauto/bin/src/results.c
new file mode 100644
index 000000000..4d7a884a5
--- /dev/null
+++ b/private/oleauto/bin/src/results.c
@@ -0,0 +1,555 @@
+/*---------------------------------------------------------------------------
+|
+| FILE: results.c
+| BY: ScottFe
+|
+| COMMAND LINE:
+| results [-iqs] [-v<file>] [-d<file>] <filespec1> ...
+| where: (Note: Switches are case INsensitive)
+| -i = Ignore warnings listed in szIgnoreG[]
+| -i<errtyp> = -i and add <errtyp> to szIgnoreG[]
+| -q = Quiet, no sounds
+| -s = Summary only, does not list all errors & warnings
+| -v = Sound file for victory sound
+| -d = Sound file for defeat sound
+| <filespec> = One or more files to scan. Standard wild card supported.
+|
+| DESCRIPTION:
+| Searches each file specified by the <filespec> parameters for
+| errors and warnings, displaying them in red and yellow, respectively.
+| It also counts # of compiles, masm's, link's, lib's, and csl's,
+| printing this information on the summary line. Without the -q
+| switch, it will also make one of two tones, depending upon if errors
+| were found or not. An errorlevel is returned to DOS for use in
+| .cmd files.
+|
+|IMPLEMENTATION:
+| This programs finds errors, warnings, and counts compiles, etc. by
+| counting the number of occurrences of certain strings found in the
+| specified input files. The strings which are searched for may be
+| found in assocG[].sz and an indicator of which counter to increment
+| is in assocG[].tgt. The counters are contained in mptgtcHitsG[], and
+| sz's describing each tgt are contained in mptgtszTitlesG[]. Note
+| that if a warning is found, this program searches for occurrences
+| of the strings found in szIgnoreG[] on the current line. If one
+| is found, the warning is ignored. (I.e. Add a unique sub- string
+| from any warnings you want ignored to the szIgnoreG[] array.)
+|
+| SOUND FILE FORMAT:
+| One frequence/duration pair per line. Both are positive short's
+| separated by a space. Units are same as DosBeep().
+|
+| HUNGARIAN:
+| All global variables have a suffix of 'G'.
+| All constants have a suffix of 'C'.
+|
+| [5] larrybr (12-Aug-94) - added -i<newIgnore>, tweek ignore list
+| [4] chrisfr ( 7-May-90) - added -V/D, and comments.
+| [3] scottfe ( 2-May-90) - added filters for unwanted warnings.
+| [2] chrisfr (26-Feb-90) - added ctl+C handling.
+| [1] chrisfr (22-Feb-90) - added color.
+| [0] scottfe ( ) - created.
+---------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <signal.h>
+#define INCL_VIO
+#define INCL_AVIO
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <os2.h>
+#endif
+#include <stdio.h>
+
+/*---------------------------------------------------------------------------
+| Constants
+---------------------------------------------------------------------------*/
+#define cchLineMaxC 255
+#define tgtEndC (-1)
+#define tgtErrorC 0 // These tgt constants must match titles in
+#define tgtWarnC 1 // mptgtszTitlesG[]
+#define tgtCC 2
+#define tgtAsmC 3
+#define tgtLinkC 4
+#define tgtLibC 5
+#define tgtTokenC 6
+#define tgtMaxC 7
+#define iIgnoreMaxC 20 // Max number of ignorable warnings.
+
+/*---------------------------------------------------------------------------
+| Macros
+---------------------------------------------------------------------------*/
+#ifdef WIN32
+#define ColorError() SetConsoleTextAttribute(hStdOut, FOREGROUND_RED | FOREGROUND_INTENSITY)
+#define ColorOK() SetConsoleTextAttribute(hStdOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY)
+#define ColorWarning() SetConsoleTextAttribute(hStdOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY)
+#define ColorNormal() SetConsoleTextAttribute(hStdOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
+#define ClearLine()
+#else
+#define ColorError() VioWrtTTY("\33[0;1;40;31m", 12, 0)
+#define ColorOK() VioWrtTTY("\33[0;1;40;32m", 12, 0)
+#define ColorWarning() VioWrtTTY("\33[0;1;40;33m", 12, 0)
+#define ColorNormal() VioWrtTTY("\33[0;2;40;37m", 12, 0)
+#define ClearLine() VioWrtTTY("\33[K", 3, 0)
+#endif
+
+/*---------------------------------------------------------------------------
+| Typedefs
+---------------------------------------------------------------------------*/
+typedef unsigned char UBYTE;
+typedef unsigned short USHORT;
+
+
+/*---------------------------------------------------------------------------
+| Prototypes
+---------------------------------------------------------------------------*/
+void SaveColor(void);
+void ColorReset(void);
+void cdecl BreakHandler(int);
+char *szNameFromFullPath(char *szFullPath);
+BOOL FPlayFile(char *szFile);
+void victory(void);
+void defeat(void);
+void DoFile(char *pszFileName);
+int cdecl main(short argc, char **argv);
+
+
+/*---------------------------------------------------------------------------
+| Global Variables
+---------------------------------------------------------------------------*/
+char szBufG[cchLineMaxC]; // General i/o buffer
+int fQuietG; // No victory or defeat beeps
+int fSumG; // No error message echo (summary only)
+int fIgnoreG; // Ignore selected warnings
+int fFatalG; // Fatal errors occured
+char *szVictoryG = NULL; // Sound file to use for victory tone
+char *szDefeatG = NULL; // Sound file to use for defeat tone
+UBYTE rgbCellG[4]; // Storage for VIO cell to remember colors.
+#ifdef WIN32
+HANDLE hStdOut; // Console handle
+#endif
+
+/*---------------------------------------------------------------------------
+| assocG[] - Associates a substring found in the input stream with one of
+| several "targets", which may be programs (C, MASM, LINK, LIB, etc)
+| or an error or a warning. See the #defines for current targets.
+---------------------------------------------------------------------------*/
+struct {
+ char *sz;
+ short tgt;
+ } assocG[] = {
+
+ /* STRING TO SEARCH FOR, COUNTER TO BUMP */
+
+ { "not find file", tgtErrorC }, // Errors
+ { "Number of open", tgtErrorC },
+ { "not access file", tgtErrorC },
+ { ": fatal error", tgtErrorC },
+ { "atal error:", tgtErrorC },
+ { ": error ", tgtErrorC },
+ { " error:", tgtErrorC },
+ { "on't know how to make", tgtErrorC },
+ { "Write failed", tgtErrorC },
+ { "Write error", tgtErrorC },
+ { "Unresolved", tgtErrorC },
+ { "Out of mem", tgtErrorC },
+ { "Invalid object", tgtErrorC },
+ { "*** Term", tgtErrorC },
+ { "diagnostic code", tgtErrorC },
+ { "Compiler error", tgtErrorC },
+ { "Error - ", tgtErrorC }, // mrc Error
+ { "Error: ", tgtErrorC }, // awk/intl Error
+ { "not enough space", tgtErrorC }, // NT disk full
+ { "name specified is not", tgtErrorC }, // NT prog not found
+ { "system cannot find", tgtErrorC }, // NT dir not found
+ { ": warning", tgtWarnC }, // Warnings
+ { "Warning: ", tgtWarnC }, // cpp Warnings
+ { "]] not found.", tgtWarnC }, // token file warning
+ { "C Optimizing Compiler", tgtCC }, // C
+ { "C/C++ Optimizing Compiler", tgtCC }, // C7
+ { "C 68K Optimizing Compiler", tgtCC }, // Wings
+ { "Macro Assembler", tgtAsmC }, // ASM
+ { "asm68", tgtAsmC }, // Wings asm
+ { "Linker", tgtLinkC }, // LINKER
+ { "Library Manager", tgtLibC }, // LIB
+ { "Reading Token file", tgtTokenC }, // Glossman token
+ { NULL, tgtEndC } /*** End Of List ***/
+ };
+
+
+/*---------------------------------------------------------------------------
+| mptgtcHitsG[] - Maps targets to the number of times an associated string
+| from assocG[] was found in the input stream.
+---------------------------------------------------------------------------*/
+int mptgtcHitsG[tgtMaxC];
+
+
+/*---------------------------------------------------------------------------
+| mptgtszTitlesG[] - Maps a typ (from assocG[]) to a user-friendly string.
+---------------------------------------------------------------------------*/
+char *mptgtszTitlesG[tgtMaxC+1] =
+ {
+ "errors", // tgtErrorC
+ "warnings", // tgtWarnC
+ "C", // tgtCC
+ "ASM", // tgtAsmC
+ "LINK", // tgtLinkC
+ "LIB", // tgtLibC
+ "Tok", // tgtTokenC
+
+ // If you add more make sure you increase tgtMaxC!
+ NULL /*** End Of List ***/
+ };
+
+
+/*---------------------------------------------------------------------------
+| szIgnoreG[] - List of kinds of warnings to ignore. Only searched when
+| counter for tgtWarnC might be incremented.
+---------------------------------------------------------------------------*/
+char *szIgnoreG[iIgnoreMaxC+1] =
+ {
+ "C4001:",
+ "C4758:", // 99% of the time this is bogus; the other 1% it's dangerous
+ // but we ignore it anyway because of the other 99% so why
+ // clutter up the screen? Check if fixed in C8.
+ "C4762:", // According to Joseph this is a bogus error in C8
+ "MP4002:",
+#ifdef WIN32
+ "warning 505:", //link32 warning for unused libs
+#endif
+ "C4651:", // /D_FAST specified in file but not precompiled header
+ NULL /*** End Of List ***/
+ };
+
+int AddIgnore(char *szNewIgnoreType)
+{
+ char **psz = szIgnoreG;
+ while (psz - szIgnoreG < iIgnoreMaxC) {
+ if (*psz == NULL) {
+ *psz = szNewIgnoreType;
+ *(++psz) = NULL;
+ return TRUE;
+ }
+ ++psz;
+ }
+ return FALSE;
+}
+
+/*---------------------------------------------------------------------------
+| void SaveColor(void)
+|
+| Saves the current VIO colors into rgbCellG.
+---------------------------------------------------------------------------*/
+void SaveColor(void)
+ {
+#ifndef WIN32
+ USHORT usRow, usColumn;
+ USHORT cbCell;
+
+ putchar('\n');
+ VioGetCurPos(&usRow, &usColumn, 0);
+ cbCell = sizeof(rgbCellG);
+ VioReadCellStr(rgbCellG, &cbCell, usRow, usColumn, 0);
+#endif
+ }
+
+
+/*---------------------------------------------------------------------------
+| void ColorReset(void)
+|
+| This routine resets the VIO colors to what they were upon the last
+| SaveColor() call.
+---------------------------------------------------------------------------*/
+void ColorReset(void)
+ {
+#ifndef WIN32
+ UBYTE colorFore, colorBack;
+ int fBrite;
+ char sz[9];
+ static char mpbch[8] = {'0', '4', '2', '6', '1', '5', '3', '7'};
+
+ colorFore = rgbCellG[1] & 0x07;
+ colorBack = (rgbCellG[1] & 0x70) >> 4;
+ fBrite = rgbCellG[1] & 0x08;
+ if (fBrite)
+ VioWrtTTY("\33[0;1m", 6, 0);
+ else
+ VioWrtTTY("\33[0;2m", 6, 0);
+ sprintf(sz, "\33[4%c;3%cm", mpbch[colorBack], mpbch[colorFore]);
+ VioWrtTTY(sz, 8, 0);
+#endif
+ }
+
+
+/*---------------------------------------------------------------------------
+| void cdecl BreakHandler(void)
+|
+| On a Ctrl+C or Ctrl+Break, returns colors back to normal before exiting
+| with an error level.
+---------------------------------------------------------------------------*/
+void cdecl BreakHandler(int i)
+ {
+ (i); // ignore i
+ signal(SIGINT, (SIG_IGN));
+ signal(SIGTERM, (SIG_IGN));
+ ColorReset();
+ exit (1);
+ }
+
+
+/*---------------------------------------------------------------------------
+| char *szNameFromFullPath(char *szFullPath)
+|
+| Given a sz possibly containing a full or partial path, returns a pointer
+| to the base.ext part of "c:\path\base.ext".
+---------------------------------------------------------------------------*/
+char *szNameFromFullPath(char *szFullPath)
+ {
+ char *szFile;
+
+ szFile = szFullPath + strlen(szFullPath);
+ while ((szFile >= szFullPath) &&
+ (*szFile != '\\') &&
+ (*szFile != '/') &&
+ (*szFile != ':'))
+ szFile--;
+ return (szFile+1);
+ }
+
+
+/*---------------------------------------------------------------------------
+| BOOL FPlayFile(char *szFile)
+|
+| Plays a tune found in szFile. The format of the file is two integers per
+| line: Frequency Duration. Lines not of this format are ignored.
+---------------------------------------------------------------------------*/
+#ifndef WIN32
+BOOL FPlayFile(char *szFile)
+ {
+ FILE *pfile;
+ int Freq, Dur;
+
+ if (NULL != (pfile=fopen(szFile, "r")))
+ {
+ while (fgets(szBufG, sizeof(szBufG), pfile))
+ if (sscanf(szBufG, "%d %d", &Freq, &Dur) == 2)
+ DosBeep(Freq, Dur);
+ return (TRUE);
+ }
+ else
+ return (FALSE);
+ }
+#endif
+
+
+/*---------------------------------------------------------------------------
+| void victory(void)
+|
+| Plays a victory tune.
+---------------------------------------------------------------------------*/
+void victory(void)
+ {
+#ifdef WIN32
+ Beep(104, 300);
+ Beep(415, 600);
+#else
+ if (szVictoryG==NULL || !FPlayFile(szVictoryG))
+ {
+ DosBeep(104, 300);
+ DosBeep(415, 600);
+ }
+#endif
+ }
+
+
+/*---------------------------------------------------------------------------
+| void defeat(void)
+|
+| Plays a defeat tune.
+---------------------------------------------------------------------------*/
+void defeat(void)
+ {
+#ifdef WIN32
+ Beep(415, 300);
+ Beep(104, 600);
+#else
+ if (szDefeatG==NULL || !FPlayFile(szDefeatG))
+ {
+ DosBeep(415, 300);
+ DosBeep(104, 600);
+ }
+#endif
+ }
+
+
+/*---------------------------------------------------------------------------
+| void DoFile(char *pszFileName)
+|
+| Processes file pszFileName, printing out any errors and warnings found,
+| and counting the number of times CL, MASM, LINK, and LIB are
+| invoked.
+---------------------------------------------------------------------------*/
+void DoFile(char *pszFileName)
+ {
+ short tgt, isz, iassoc;
+ BOOL fFoundMatch;
+ BOOL fFoundIgnore;
+ struct stat fstat;
+ FILE *pfile;
+ char *szTime;
+
+ for (tgt=0; tgt<tgtMaxC; tgt++)
+ mptgtcHitsG[tgt] = 0;
+
+ // Open file and get time it was created:
+ pfile = fopen(pszFileName, "r");
+ if (pfile == NULL)
+ {
+ printf("cannot open file: %s\n", pszFileName);
+ exit(1);
+ }
+ stat(pszFileName, &fstat);
+ szTime = ctime(&fstat.st_mtime);
+ szTime[strlen(szTime)-1] = '\0'; // Remove '\n' from end of szTime
+
+ // Set up Break handler
+ SaveColor();
+ signal(SIGINT, BreakHandler);
+ signal(SIGTERM, BreakHandler);
+
+ ColorNormal();
+ putchar('\n');
+ ClearLine();
+ putchar('\n');
+ ClearLine();
+ printf("-- %s (%s) --\n", pszFileName, szTime);
+ ClearLine();
+
+ // Loop through all of the lines in the file
+ while (fgets(szBufG, sizeof(szBufG), pfile))
+ {
+ fFoundMatch = FALSE;
+ szBufG[strlen(szBufG)-1] = '\0'; // Remove '\n' from end of szBufG
+
+ // See if we can find one of the strings in assocG[] as a substring
+ // in this line:
+ for (iassoc=0; !fFoundMatch && assocG[iassoc].tgt!=tgtEndC; ++iassoc)
+ if (fFoundMatch = (strstr(szBufG,assocG[iassoc].sz) != NULL))
+ {
+ // We found one. Is this a warning we should ignore?
+ fFoundIgnore = FALSE;
+ if (fIgnoreG && assocG[iassoc].tgt == tgtWarnC)
+ for (isz=0; !fFoundIgnore && szIgnoreG[isz]; isz++)
+ fFoundIgnore = (strstr(szBufG,szIgnoreG[isz]) != NULL);
+ if (fFoundIgnore)
+ continue;
+
+ // Record that we found a string in assocG[]
+ ++mptgtcHitsG[assocG[iassoc].tgt];
+ if (!fSumG && (assocG[iassoc].tgt==tgtErrorC ||
+ assocG[iassoc].tgt==tgtWarnC))
+ {
+ if (assocG[iassoc].tgt == tgtErrorC)
+ ColorError();
+ else
+ ColorWarning();
+ printf("%s\n", szBufG);
+ ColorNormal();
+ ClearLine();
+ }
+ }
+ }
+
+ printf("-- %s:", szNameFromFullPath(pszFileName));
+
+ // Print out summary of findings:
+ for (tgt=0; mptgtszTitlesG[tgt]; tgt++)
+ {
+ if (mptgtcHitsG[tgt] != 0)
+ switch (tgt)
+ {
+ case tgtErrorC: ColorError(); break;
+ case tgtWarnC: ColorWarning(); break;
+ default: ColorOK(); break;
+ }
+ printf(" %d %s", mptgtcHitsG[tgt], mptgtszTitlesG[tgt]);
+ ColorNormal();
+ putchar(mptgtszTitlesG[tgt+1] ? ',' : ' ');
+ }
+ printf("--\n");
+ ClearLine();
+
+ if (!fQuietG)
+ {
+ if (mptgtcHitsG[tgtErrorC])
+ defeat();
+ else
+ victory();
+ }
+
+ if (mptgtcHitsG[tgtErrorC])
+ fFatalG = TRUE;
+ ColorReset();
+ putchar('\n');
+ }
+
+
+/*---------------------------------------------------------------------------
+| int cdecl main(short cArg, char **ppchArg)
+|
+| Sets up Globals from command-line switches. Processes each file placed on
+| the command line via DoFile().
+---------------------------------------------------------------------------*/
+int cdecl main(short cArg, char **ppchArg)
+ {
+ char *pchCmd;
+
+#ifdef WIN32
+ hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+#endif
+ for (ppchArg++; cArg>1; cArg--, ppchArg++)
+ if (**ppchArg == '-')
+ {
+ pchCmd = *ppchArg;
+ while (*++pchCmd)
+ switch (toupper(*pchCmd))
+ {
+ case 'I':
+ fIgnoreG = TRUE;
+ if (pchCmd[1]) {
+ if (!AddIgnore(pchCmd+1)) {
+ printf("Cannot exceed %d ignores.\n",iIgnoreMaxC);
+ }
+ goto NextArg;
+ }
+ break;
+
+ case 'Q':
+ fQuietG = TRUE;
+ break;
+
+ case 'S':
+ fSumG = TRUE;
+ break;
+
+ case 'V':
+ szVictoryG = pchCmd + 1;
+ goto NextArg;
+
+ case 'D':
+ szDefeatG = pchCmd + 1;
+ goto NextArg;
+ }
+NextArg: ;
+ }
+ else
+ DoFile(*ppchArg);
+
+ return (fFatalG);
+ }
diff --git a/private/oleauto/bin/src/symtab.c b/private/oleauto/bin/src/symtab.c
new file mode 100644
index 000000000..6904b74b6
--- /dev/null
+++ b/private/oleauto/bin/src/symtab.c
@@ -0,0 +1,131 @@
+/***
+*symtab.c - Ifdef symbol table storage module
+*
+* Copyright (c) 1988, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Store the symbols from the switches file.
+*
+*Revision History:
+* ??-??-88 PHG Initial version
+*
+*******************************************************************************/
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <search.h>
+#include <ctype.h>
+#include "constant.h"
+#include "errormes.h"
+#include "symtab.h"
+
+/* Internal constants */
+#define MAXSYMBOLS 512 /* Maximum number of symbols (switches) */
+#define IDENT_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_$?"
+
+/* Symbol record */
+struct symrec {
+ char *name; /* name of the symbol */
+ int type; /* type of symbol (DEFINED, UNDEFINED, IGNORE)*/
+};
+
+/* Internal variables */
+int numsyms; /* Number of symbols */
+struct symrec symtable[MAXSYMBOLS];
+ /* Symbol table */
+/* Procedures */
+int compsym(const struct symrec *, const struct symrec *);
+
+/* Compare two records for alphabetical order */
+int compsym(rec1, rec2)
+const struct symrec *rec1, *rec2;
+{
+ return strcmp(rec1->name, rec2->name);
+}
+
+/* Add symbol to symbol table */
+void addsym(symbol, type)
+char *symbol;
+int type;
+{
+ if (lookupsym(symbol) != NOTPRESENT) {
+ fprintf(stderr, "fatal error: symbol \"%s\" already in symbol table.\n", symbol);
+ exit(1);
+ }
+ symtable[numsyms].name = strdup(symbol);
+ symtable[numsyms].type = type;
+ ++numsyms;
+}
+
+/* Read switches from a file into symbol table */
+void readsyms(filename)
+char *filename;
+{
+ FILE *f;
+ char name[MAXNAMELEN];
+ f = fopen(filename, "r");
+ if (f == NULL) {
+ fprintf(stderr, "fatal error: cannot open switch file \"%s\".\n", filename);
+ exit(1);
+ }
+ numsyms = 0;
+
+ do {
+ if ( fgets(name, MAXNAMELEN, f) == NULL) {
+ fprintf(stderr, "fatal error: unexpected EOF in switch file.\n");
+ exit(1);
+ }
+ name[strlen(name) - 1] = '\0'; /* remove trailing \n */
+ if (name[0] != '-') {
+ addsym(name, DEFINED);
+ }
+ } while (name[0] != '-');
+
+ do {
+ if (fgets(name, MAXNAMELEN, f) == NULL) {
+ fprintf(stderr, "fatal error: unexpected EOF in switch file.\n");
+ exit(1);
+ }
+ name[strlen(name) - 1] = '\0'; /* remove trailing \n */
+ if (name[0] != '-') {
+ addsym(name, UNDEFINED);
+ }
+ } while (name[0] != '-');
+
+ do {
+ if (fgets(name, MAXNAMELEN, f) == NULL)
+ break;
+ name[strlen(name) - 1] = '\0'; /* remove trailing \n */
+ if (name[0] != '-') {
+ addsym(name, IGNORE);
+ }
+ } while (name[0] != '-');
+
+ fclose(f);
+}
+
+/* Lookup symbol in symbol table */
+int lookupsym(name)
+char *name;
+{
+ struct symrec srchrec;
+ struct symrec *recfound;
+
+ srchrec.name = name;
+ recfound = (struct symrec *) lfind( (const void *)&srchrec, (const void *)symtable,
+ &numsyms, sizeof(struct symrec), compsym);
+ if (recfound == NULL)
+ return NOTPRESENT;
+ else
+ return recfound->type;
+}
+
+/* Check if token is identifier only (must have no whitespace) */
+int ident_only(token)
+char *token;
+{
+ /* is an identifier if all characters are in IDENT_CHARS
+ and first character is not a digit */
+ return (strspn(token, IDENT_CHARS) == strlen(token) &&
+ !isdigit(token[0]));
+}
diff --git a/private/oleauto/bin/src/symtab.h b/private/oleauto/bin/src/symtab.h
new file mode 100644
index 000000000..b40667595
--- /dev/null
+++ b/private/oleauto/bin/src/symtab.h
@@ -0,0 +1,29 @@
+/***
+*Symtab.h - symbol table storage used by the ifstripper, parser and symbol table
+*
+* Copyright (c) 1988, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Symbol table storage used by the ifstripper, parser and symbol table
+*
+*Revision History:
+* ??-??-88 PHG Initial version
+*
+*******************************************************************************/
+
+#ifndef SYMTAB_H
+#define SYMTAB_H
+
+/* read the symbol table from the named switch file */
+extern void readsyms(char *);
+
+/* add the named symbol to the table, with the given truth value */
+extern void addsym(char *, int);
+
+/* find the truth value for the named symbol */
+extern int lookupsym(char *);
+
+/* Check that the named identifier consists of valid characters */
+extern int ident_only(char *);
+
+#endif /* SYMTAB_H */
diff --git a/private/oleauto/bin/win16def.awk b/private/oleauto/bin/win16def.awk
new file mode 100644
index 000000000..7018e0932
--- /dev/null
+++ b/private/oleauto/bin/win16def.awk
@@ -0,0 +1,59 @@
+BEGIN {
+ SwitchedOut = 0;
+ LCase = "abcdefghijklmnopqrstuvwxyz";
+ UCase[01] = "A";
+ UCase[02] = "B";
+ UCase[03] = "C";
+ UCase[04] = "D";
+ UCase[05] = "E";
+ UCase[06] = "F";
+ UCase[07] = "G";
+ UCase[08] = "H";
+ UCase[09] = "I";
+ UCase[10] = "J";
+ UCase[11] = "K";
+ UCase[12] = "L";
+ UCase[13] = "M";
+ UCase[14] = "N";
+ UCase[15] = "O";
+ UCase[16] = "P";
+ UCase[17] = "Q";
+ UCase[18] = "R";
+ UCase[19] = "S";
+ UCase[20] = "T";
+ UCase[21] = "U";
+ UCase[22] = "V";
+ UCase[23] = "W";
+ UCase[24] = "X";
+ UCase[25] = "Y";
+ UCase[26] = "Z";
+ }
+
+$1 == "#if" && $2 == "WIN32" {
+ SwitchedOut = 1;
+ }
+
+{
+if ((SwitchedOut == 0) && (substr($0,1,1) != "#")) {
+ MungedName = "";
+ i = index($1,"@");
+ if (i) {
+ for (j=1; j<i; j++) {
+ NextLetter = substr($1,j,1);
+ k = index(LCase,NextLetter);
+ if (k) {
+ NextLetter = UCase[k];
+ }
+ MungedName = MungedName NextLetter;
+ }
+ print " " MungedName " " $2 " " $3;
+ }
+ else {
+ print $0;
+ }
+ }
+}
+
+$1 == "#endif" {
+ SwitchedOut = 0;
+}
diff --git a/private/oleauto/build/go.bat b/private/oleauto/build/go.bat
new file mode 100644
index 000000000..b87f09f17
--- /dev/null
+++ b/private/oleauto/build/go.bat
@@ -0,0 +1,25 @@
+REM call make dwin1632 clean
+REM call make rwin1632 clean
+REM call make dwin32 clean
+REM call make rwin32 clean
+
+REM call make dwin1632 newdep
+REM call make rwin1632 newdep
+REM call make dwin32 newdep
+REM call make rwin32 newdep
+
+call make dwin1632
+call make rwin1632
+call make dwin32
+call make rwin32
+cd ..\sample
+REM call make win32 clean
+REM call make win16 clean
+call make win32
+call make win16
+cd ..\tests
+REM call make win32 clean
+REM call make win16 clean
+call make win32
+call make win16
+cd ..\build
diff --git a/private/oleauto/build/go1.bat b/private/oleauto/build/go1.bat
new file mode 100644
index 000000000..74a0060f5
--- /dev/null
+++ b/private/oleauto/build/go1.bat
@@ -0,0 +1,25 @@
+call make dwin1632 clean
+call make rwin1632 clean
+call make dwin32 clean
+call make rwin32 clean
+
+call make dwin1632 newdep
+call make rwin1632 newdep
+call make dwin32 newdep
+call make rwin32 newdep
+
+call make dwin1632
+call make rwin1632
+call make dwin32
+call make rwin32
+cd ..\sample
+call make win32 clean
+call make win16 clean
+call make win32
+call make win16
+cd ..\tests
+call make win32 clean
+call make win16 clean
+call make win32
+call make win16
+cd ..\build
diff --git a/private/oleauto/build/make.bat b/private/oleauto/build/make.bat
new file mode 100644
index 000000000..4694c4eb1
--- /dev/null
+++ b/private/oleauto/build/make.bat
@@ -0,0 +1,264 @@
+@echo off
+setlocal
+REM *********************************************************************
+REM
+REM (c) Copyright Microsoft Corp. 1992-1993 All Rights Reserved
+REM
+REM File:
+REM
+REM make.bat
+REM
+REM Purpose:
+REM
+REM oleprog project master make batch file.
+REM
+REM Description:
+REM
+REM Usage: run make with no arguments for usage.
+REM This batch file will set up all required variables and fire up
+REM one of (win16.mak, win32.mak and mac.mak).
+REM
+REM
+REM The structure of the project is
+REM
+REM %OLEPROG% The root of the project
+REM |___BIN Tools for the project, like ifstrip, awk
+REM |___TOOLS
+REM |___WIN16 WIN16 tools, libs, incs
+REM |___HDOS For Win16 oledisp build
+REM |___OS2 For Win16 typelib build
+REM |___WIN32
+REM |___LIB oleaut32.dll can be built without VBATOOLS
+REM |___OLE Some .inc .lib files for Win16 & MAC build
+REM |___WIN16
+REM |___LIB
+REM |___MAC
+REM |___M68K
+REM |___PPC
+REM |___BUILD Where the .bat and .mak .log files are.
+REM |___SRC All the source files of the project
+REM |___INC All the common include files of the project
+REM dispatch, variant, olenls
+REM |___DISPATCH All the oledisp source & include files
+REM |___WIN16
+REM |___WIN32 like oledisp.cpp
+REM |___I386 Specific invoke.asm and oleconva.asm, etc
+REM |___ALPHA Specific invoke.s and oleconva.cpp, etc
+REM |___MIPS Specific invoke.s and oleconva.cpp, etc
+REM |___PPC Specific invoke.s and oleconva.cpp, etc
+REM |___MAC
+REM |___M68K Specific M68K files like invoke.a, etc
+REM |___PPC Specific MACPPC files like invoke.s, etc
+REM |___TYPELIB All the typelib source & include files
+REM |___MKTYPLIB All the mktyplib files, all .h are here also
+REM |___DWIN32
+REM |___RWIN32
+REM |___DWIN1632 Debug WOW win16 .obj .lib and .dll, ...
+REM |___RWIN1632 Retail WOW win16 .obj .lib and .dll, ...
+REM |___DWIN16
+REM |___RWIN16
+REM |___Dmac
+REM |___APPLET
+REM |___STATIC
+REM |___PAPPLET pcode build
+REM |___PSTATIC pcode build
+REM |___Rmac
+REM |___APPLET
+REM |___STATIC
+REM |___PAPPLET pcode build
+REM |___PSTATIC pcode build
+REM |___Dmacppc only the applet none pcode build
+REM |___Rmacppc only the applet none pcode build
+REM ...
+REM
+REM
+REM Environment:
+REM
+REM oleprog, HOST must be set
+REM
+REM Revision History:
+REM
+REM [00] 02-Aug-94 t-issacl: Created
+REM
+REM *********************************************************************
+
+
+if '%oleprog%' == '' goto ERROR_BadEnv
+
+for %%a in ( dwin16 rwin16 dwin1632 rwin1632 dwin32 rwin32 dmac rmac dmacppc rmacppc) do if "%1"=="%%a" goto oktarg
+goto usage
+
+:oktarg
+
+set VERS=2
+set WOW=
+set PCODE=N
+set CHARSIZE=D
+REM assume we are using VBATOOLS for stuff
+set LOCALBUILD=TRUE
+if '%2'=='notlocalbuild' goto usage
+if '%2'=='NOTLOCALBUILD' goto usage
+if not '%_NTBINDIR%'=='' set LOCALBUILD=FALSE
+
+goto %1
+
+:usage
+echo USAGE: make VERSION options
+echo where VERSION is:
+echo dwin16 Debug win16 build
+echo rwin16 Retail win16 build
+echo dwin1632 Debug win16 WOW build
+echo rwin1632 Retail win16 WOW build
+echo dwin32 Debug win32 build
+echo rwin32 Retail win32 build
+echo dmac Debug mac build
+echo rmac Retail mac build
+echo dmacppc Debug ppc build
+echo rmacppc Retail ppc build
+echo.
+echo options will be passed to makefile by nmake
+echo "clean" option will clean up the target directory.
+echo 2 useful MAC options are (nopcode, pcode)
+echo Default for MAC/MACPPC build is nopcode.
+echo NOTE: if _NTBINDIR is set, will use _NTBINDIR for all tools and incs
+echo (for 32-bit builds); otherwise VBATOOLS will be used
+echo.
+goto done
+
+
+:dwin16
+ set TARG=WIN16
+ set TARGAPI=WIN16
+ set TARGCPU=i386
+ set TARGCPUDEF=_X86_
+ set DEBUG=D
+ goto build
+
+:rwin16
+ set TARG=WIN16
+ set TARGAPI=WIN16
+ set TARGCPU=i386
+ set TARGCPUDEF=_X86_
+ set DEBUG=R
+ goto build
+
+:dwin1632
+ set TARG=WIN16
+ set TARGAPI=WIN16
+ set TARGCPU=i386
+ set TARGCPUDEF=_X86_
+ set DEBUG=D
+ set WOW=1
+ goto build
+
+:rwin1632
+ set TARG=WIN16
+ set TARGAPI=WIN16
+ set TARGCPU=i386
+ set TARGCPUDEF=_X86_
+ set DEBUG=R
+ set WOW=1
+ goto build
+
+:dwin32
+ set TARG=WIN32
+ set TARGAPI=WIN32
+ set DEBUG=D
+ set TARGCPU=i386
+ set TARGCPUDEF=_X86_
+ if '%HOST%'=='MIPS' goto MIPS_here
+ if '%HOST%'=='ALPHA' goto ALPHA_here
+ if '%HOST%'=='PPC' goto PPC_here
+ goto build
+:rwin32
+ set TARG=WIN32
+ set TARGAPI=WIN32
+ set DEBUG=R
+ set TARGCPU=i386
+ set TARGCPUDEF=_X86_
+ if '%HOST%'=='MIPS' goto MIPS_here
+ if '%HOST%'=='ALPHA' goto ALPHA_here
+ if '%HOST%'=='PPC' goto PPC_here
+ goto build
+
+:MIPS_here
+ set TARG=MIPS
+ set TARGCPU=MIPS
+ set TARGCPUDEF=_MIPS_
+ goto build
+
+:ALPHA_here
+ set TARG=ALPHA
+ set TARGCPU=ALPHA
+ set TARGCPUDEF=_ALPHA_
+ goto build
+
+:PPC_here
+ set TARG=PPC
+ set TARGCPU=PPC
+ set TARGCPUDEF=_PPC_
+ goto build
+
+:dmac
+ set TARG=MAC
+ set TARGAPI=MAC
+ set TARGCPU=M68K
+ set TARGCPUDEF=_MAC_
+ set DEBUG=D
+ goto build
+
+:rmac
+ set TARG=MAC
+ set TARGAPI=MAC
+ set TARGCPU=M68K
+ set TARGCPUDEF=_MAC_
+ set DEBUG=R
+ goto build
+
+:dmacppc
+ set TARG=MACPPC
+ set TARGAPI=MAC
+ set TARGCPU=PPC
+ set TARGCPUDEF=_PPC_
+ set DEBUG=D
+ goto build
+
+:rmacppc
+ set TARG=MACPPC
+ set TARGAPI=MAC
+ set TARGCPU=PPC
+ set TARGCPUDEF=_PPC_
+ set DEBUG=R
+ goto build
+
+
+REM *********************************************************************
+REM here we call nmake to make it
+REM *********************************************************************
+:build
+set DESTDIR=%oleprog%\%1
+set LOGFILE=%1
+if '%LOCALBUILD%'=='TRUE' set NMAKEDIR=%VBATOOLS%\%HOST%\bin
+if '%LOCALBUILD%'=='FALSE' set NMAKEDIR=%_NTBINDIR%\mstools
+
+if "%TARGAPI%"=="WIN32" goto Build_Win32
+if "%TARGAPI%"=="MAC" goto Build_Mac
+%NMAKEDIR%\nmake %2 DESTDIR=%DESTDIR% TARG=%TARG% TARGCPU=%TARGCPU% TARGCPUDEF=%TARGCPUDEF% TARGAPI=%TARGAPI% DEBUG=%DEBUG% VERS=%VERS% WOW=%WOW% PCODE=%PCODE% -f win16.mak>%LOGFILE%.log 2>&1
+goto check
+:Build_Win32
+%NMAKEDIR%\nmake %2 DESTDIR=%DESTDIR% TARG=%TARG% TARGCPU=%TARGCPU% TARGCPUDEF=%TARGCPUDEF% DEBUG=%DEBUG% WOW=%WOW% PCODE=%PCODE% -f win32.mak >%LOGFILE%.log 2>&1
+goto check
+:Build_Mac
+%NMAKEDIR%\nmake %2 DESTDIR=%DESTDIR% TARG=%TARG% TARGCPU=%TARGCPU% TARGCPUDEF=%TARGCPUDEF% DEBUG=%DEBUG% WOW=%WOW% PCODE=%PCODE% -f mac.mak >%LOGFILE%.log 2>&1
+
+:check
+%oleprog%\bin\%host%\results %LOGFILE%.log
+goto done
+
+:ERROR_BadEnv
+echo.
+echo Must set oleprog variable
+
+:done
+endlocal
+@echo on
diff --git a/private/oleauto/build/makeall.bat b/private/oleauto/build/makeall.bat
new file mode 100644
index 000000000..503f0c4a1
--- /dev/null
+++ b/private/oleauto/build/makeall.bat
@@ -0,0 +1 @@
+for %%a in (dwin16 rwin16 dwin1632 rwin1632 dwin32 rwin32 dmac rmac dmacppc rmacppc) do call make %%a %1
diff --git a/private/oleauto/build/mktyplib.mak b/private/oleauto/build/mktyplib.mak
new file mode 100644
index 000000000..74ff35693
--- /dev/null
+++ b/private/oleauto/build/mktyplib.mak
@@ -0,0 +1,646 @@
+###########################################################################
+#
+# (c) Copyright Microsoft Corp. 1994 All Rights Reserved
+#
+# File:
+#
+# mktyplib.mak
+#
+# Purpose:
+#
+# makefile - makefile for mktyplib.exe
+#
+#
+# Description:
+#
+# Usage: make.bat to set required variabled and invoke one of
+# win16.mak, win32.mak and mac.mak. Each of these 3 makefiles
+# will !include this file.
+#
+# Options:
+#
+# the caller should supply the following
+# DESTDIR = [dwin32, rwin32] ;where .obj, .lib, .dll ... will be
+# TARG = [WIN16,WIN32,MIPS,ALPHA,PPC,MAC,MACPPC] ;useful if we want to combin win16.mak, win32.mak and macppc.mak together
+# TARGCPU = [i386,MIPS,ALPHA,PPC]
+# TARGCPUDEF = [_X86_,_MIPS_,_ALPHA_,_PPC_]
+# TARGAPI = [WIN16,WIN32,MAC]
+# WOW
+# PCODE
+# DEBUG = [D,R] ;control debug or retail build
+#
+#
+# Environment:
+#
+# OLEPROG, HOST must be set
+# OLEPROG ;the root directory of this project
+# HOST = [WIN32,MIPS,ALPHA,PPC] ;build host
+#
+# Revision History:
+#
+# [00] 02-Aug-94 t-issacl: Created
+#
+# Note:
+#
+# This file can be invoked by itself instead of being !included in one
+# of the 3 .mak mentioned above.
+# When adding new variables, be sure there is no name conflict in other
+# 3 .mak files. Usually a good practice is to put MKTYPLIB or so as
+# a suffix to any new introduced variable.
+#
+###########################################################################
+
+
+MKTYPLIBPATHSAVE = $(PATH) # old path is save in MKTYPLIBPATHSAVE
+
+# Defaults
+#
+!ifndef TARG
+TARG = WIN32
+!endif
+
+!ifndef TARGAPI
+TARGAPI = WIN32
+!endif
+
+!ifndef DEBUG
+DEBUG = D
+!endif
+
+!ifndef DISPLAY
+DISPLAY = echo >con
+!endif
+
+!if "$(TARGAPI)"=="WIN32"
+# turn on Unicode for all WIN32 builds
+EXTRADEFS2=-DFV_UNICODE_OLE=1
+STDOLE=stdole32
+!else
+STDOLE=stdole
+!endif
+
+MKTYPLIBSRCDIR = $(OLEPROG)\src\mktyplib
+
+# TARGET dependent variables
+#
+DISPDIR = $(OLEPROG)\src\inc
+
+!if "$(TARG)" == "WIN16"
+# always use OS2 tools for win16 build
+HOSTX = OS2
+
+
+OLEINCDIR = $(OLEPROG)\ole\win16
+OLEDIR = $(OLEPROG)\ole\win16\lib
+MKTYPLIBCC = $(OLEPROG)\tools\win16\os2\bin\cl
+MKTYPLIBLINK = $(OLEPROG)\tools\win16\os2\bin\link
+MKTYPLIBRC = $(OLEPROG)\tools\win16\os2\bin\rc
+MKTYPLIBMAPSYM = $(OLEPROG)\tools\win16\os2\bin\mapsym
+
+TYPELIBLIB = $(DESTDIR)\typelib.lib
+
+!else if "$(TARGAPI)"=="WIN32"
+HOSTX = $(HOST)
+!if "$(LOCALBUILD)"=="TRUE"
+CVTRES = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\cvtres
+MKTYPLIBLINK = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\link -Incremental:NO -Pdb:NONE
+MKTYPLIBRC = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\rc
+MKTYPLIBMAPSYM = REM
+!if "$(TARG)" == "WIN32"
+MKTYPLIBCC = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\cl
+!else if "$(TARG)"=="MIPS"
+MKTYPLIBCC = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\cl
+!else if "$(TARG)"=="ALPHA"
+MKTYPLIBCC = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\claxp
+!else if "$(TARG)"=="PPC"
+MKTYPLIBCC = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\mcl
+!endif #TARG
+!else #LOCALBUILD
+CVTRES = $(_NTBINDIR)\MSTOOLS\cvtres
+MKTYPLIBLINK = $(_NTBINDIR)\MSTOOLS\link -Incremental:NO -Pdb:NONE
+MKTYPLIBRC = $(_NTBINDIR)\MSTOOLS\rc
+MKTYPLIBMAPSYM = $(_NTBINDIR)\MSTOOLS\mapsympe
+!if "$(TARG)" == "WIN32"
+MKTYPLIBCC = $(_NTBINDIR)\MSTOOLS\cl386
+!else if "$(TARG)"=="MIPS"
+MKTYPLIBCC = $(_NTBINDIR)\MSTOOLS\cl
+!else if "$(TARG)"=="ALPHA"
+MKTYPLIBCC = $(_NTBINDIR)\MSTOOLS\claxp
+!else if "$(TARG)"=="PPC"
+MKTYPLIBCC = $(_NTBINDIR)\MSTOOLS\mcl
+!endif #TARG
+!endif #LOCALBUILD
+
+#all win32 builds share common include files
+!if "$(LOCALBUILD)"=="TRUE"
+OLEINCDIR = $(OLEPROG)\ole\win32
+!else
+OLEINCDIR = $(_NTBINDIR)\public\sdk\inc
+!endif #LOCALBUILD
+TYPELIBLIB = $(DESTDIR)\oleaut32.lib
+
+!if "$(TARG)" == "WIN32"
+OLEDIR = $(OLEPROG)\ole\win32\i386
+!else if "$(TARG)"=="MIPS"
+OLEDIR = $(OLEPROG)\ole\win32\$(TARG)
+!else if "$(TARG)"=="ALPHA"
+OLEDIR = $(OLEPROG)\ole\win32\$(TARG)
+!else if "$(TARG)"=="PPC"
+OLEDIR = $(OLEPROG)\ole\win32\$(TARG)
+!endif #TARG
+
+
+!else if "$(TARG)" == "MAC"
+HOSTX = $(HOST)
+OLEINCDIR = $(OLEPROG)\ole\mac\m68k
+OLEDIR = $(OLEPROG)\ole\mac\m68k
+
+MKTYPLIBCC = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\cl
+MKTYPLIBLINK = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\link
+MMKTYPLIBRC = $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\mrc.exe
+
+!if "$(APPLET)" == "0"
+# to use typelib from a static wings lib
+TYPELIBLIB = $(DESTDIR)\..\applet\mtypelib.lib \
+ $(DESTDIR)\..\applet\ole2disp.lib \
+ $(DESTDIR)\..\applet\ole2nls.lib
+# $(DESTDIR)\strdcl.obj
+
+EXTRADEFS=-DNO_MPW
+
+!endif
+
+!else
+!error Unknown Target OS : "$(TARG)"
+!endif
+
+
+# DEBUG dependent variables
+#
+
+!if "$(DEBUG)" == "D"
+MKTYPLIBDEFS =-DDEBUG $(EXTRADEFS) $(EXTRADEFS2)
+!if "$(TARG)" == "WIN16"
+MKTYPLIBOPT =-f -Od -W3 -WX
+!else
+# no -f under WIN32 or MAC
+MKTYPLIBOPT =-Od -W3 -WX
+!if "$(LOCALBUILD)"=="FALSE" && "$(TARGAPI)"=="WIN32"
+MKTYPLIBOPT =-Od -W3
+!endif
+!endif
+MKTYPLIBLINKDBFLAGS = /CO
+
+!else if "$(DEBUG)" == "R"
+
+MKTYPLIBDEFS =$(EXTRADEFS) $(EXTRADEFS2)
+!if "$(TARG)" == "WIN16"
+MKTYPLIBOPT =-Oxza -W4
+!else
+# no -z under MAC
+MKTYPLIBOPT =-Oxa -W3
+!endif
+MKTYPLIBLINKDBFLAGS =
+
+!else
+!error Unknown DEBUG : "$(DEBUG)"
+!endif
+
+
+!if "$(TARG)" == "MAC"
+#note -- must include macos directory first because there are 2 memory.h's
+#and we want the one in macos
+MKTYPLIBINCS = /I$(DISPDIR) -I$(OLEINCDIR) \
+ -I$(VBATOOLS)\$(HOSTX)\$(TARG)\inc\macos -I$(VBATOOLS)\$(HOSTX)\$(TARG)\inc -I$(VBATOOLS)\$(HOSTX)\$(TARG)\inc\mrc
+!if "$(APPLET)" == "0"
+MKTYPLIBCCFLAGS = -D$(TARG) $(MKTYPLIBDEFS) $(MKTYPLIBINCS) -c $(MKTYPLIBOPT) -X -Zb -Ze -AL -Zm -Zi -Gt1 -Q68s
+!else #not swapped
+MKTYPLIBCCFLAGS = -D$(TARG) $(MKTYPLIBDEFS) $(MKTYPLIBINCS) -c $(MKTYPLIBOPT) -X -Zb -Ze -AL -Zm -Zi -Gt1
+!endif
+RESFILE = $(MKTYPLIBSRCDIR)\mktyplib.r
+!else #MAC
+
+!if "$(TARGAPI)" == "WIN32"
+!if "$(LOCALBUILD)"=="TRUE"
+MKTYPLIBINCS = /I$(DISPDIR) -I$(OLEINCDIR) /I$(VBATOOLS)\win32\win32\inc
+!else
+MKTYPLIBINCS = /I$(DISPDIR) -I$(OLEINCDIR) /I$(_NTBINDIR)\public\sdk\inc -I$(_NTBINDIR)\public\sdk\inc\crt -I$(_NTBINDIR)\public\sdk\inc\crt\sys
+!endif
+
+# default C/C++ compiler flags
+MKTYPLIBCCFLAGS = -DWIN32 $(MKTYPLIBDEFS) $(MKTYPLIBINCS) -c $(MKTYPLIBOPT) -Z7 -Gs -D$(TARGCPUDEF)=1 -D_NTWIN -D_WINDOWS
+
+MKTYPLIBRCFLAGS = $(MKTYPLIBINCS) -DWIN32 -I$(MKTYPLIBSRCDIR)
+RESFILE = $(DESTDIR)\MKTYPLIB.RES
+RESFLAGS = -t $(RESFILE)
+DEFFILE = $(MKTYPLIBSRCDIR)\MKTYPLIB.DEF
+
+!else #WIN32
+MKTYPLIBINCS = /I$(DISPDIR) /I$(OLEINCDIR) /I$(OLEPROG)\tools\win16\os2\inc
+
+# default C/C++ compiler flags
+MKTYPLIBLINKFLAGS = /NOI /NOD /BATCH /ST:32768 /ONERROR:NOEXE $(MKTYPLIBLINKDBFLAGS)
+#MKTYPLIBCCFLAGS = -D$(TARG) $(MKTYPLIBDEFS) $(MKTYPLIBINCS) -c $(MKTYPLIBOPT) -Zi -Zp -AM -G2A -GEas
+MKTYPLIBCCFLAGS = -D$(TARG) $(MKTYPLIBDEFS) $(MKTYPLIBINCS) -c $(MKTYPLIBOPT) -Zi -Zp -AM -G2A -GEs
+
+MKTYPLIBRCFLAGS = $(MKTYPLIBINCS) -D$(TARG) -I$(MKTYPLIBSRCDIR)
+RESFILE = $(DESTDIR)\MKTYPLIB.RES
+RESFLAGS = -31 -t $(RESFILE)
+DEFFILE = $(MKTYPLIBSRCDIR)\MKTYPLIB.DEF
+!endif #WIN32
+!endif #MAC
+
+
+mktyplib: $(DESTDIR)\mktyplib.exe
+
+stdole: $(DESTDIR)\$(STDOLE).tlb
+
+OBJS = \
+ $(DESTDIR)\mktyplib.obj \
+ $(DESTDIR)\intlstr.obj \
+ $(DESTDIR)\lexer.obj \
+ $(DESTDIR)\parser.obj \
+ $(DESTDIR)\hout.obj \
+!if "$(TARG)" == "MAC"
+ $(DESTDIR)\tmpguid2.obj \
+!endif
+ $(DESTDIR)\dimalloc.obj \
+!if "$(APPLET)" == "0"
+ $(DESTDIR)\tlviewer.obj \
+!endif
+ $(DESTDIR)\typout.obj
+
+!if "$(TARG)" == "WIN16"
+CLIBS = $(OLEPROG)\tools\win16\os2\lib\mlibcew.lib \
+ $(OLEPROG)\tools\win16\os2\lib\oldnames.lib \
+ $(OLEPROG)\tools\win16\os2\lib\libw.lib \
+ $(OLEPROG)\tools\win16\os2\lib\commdlg.lib \
+ $(OLEPROG)\tools\win16\os2\lib\toolhelp.lib
+
+OLELIBS = $(TYPELIBLIB) \
+ $(DESTDIR)\ole2disp.lib \
+ $(OLEDIR)\ole2.lib \
+ $(DESTDIR)\ole2nls.lib
+!else #win16
+!if "$(TARGAPI)" == "WIN32"
+!if "$(LOCALBUILD)"=="TRUE"
+CLIBS = $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\user32.lib \
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\kernel32.lib \
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\comdlg32.lib \
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\libc.lib
+OLELIBS = $(TYPELIBLIB) \
+ $(OLEDIR)\ole32.lib \
+ $(OLEDIR)\uuid.lib
+!else
+CLIBS = $(_NTBINDIR)\public\sdk\lib\$(TARGCPU)\user32.lib \
+ $(_NTBINDIR)\public\sdk\lib\$(TARGCPU)\kernel32.lib \
+ $(_NTBINDIR)\public\sdk\lib\$(TARGCPU)\comdlg32.lib \
+ $(_NTBINDIR)\public\sdk\lib\$(TARGCPU)\libc.lib
+OLELIBS = $(TYPELIBLIB) \
+ $(_NTBINDIR)\public\sdk\lib\$(TARGCPU)\ole32.lib \
+ $(_NTBINDIR)\public\sdk\lib\$(TARGCPU)\uuid.lib
+!endif
+
+
+!else # risc
+!if "$(TARG)" == "MAC"
+CLIBS = $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\interfac.lib \
+!if "$(APPLET)" == "0"
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\llibcs.lib \
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\lsanes.lib \
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\swap.lib
+!else
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\llibc.lib \
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\lib\lsane.lib
+!endif
+
+!if "$(APPLET)" == "0"
+!if "$(DEBUG)" == "D"
+#with typelib linked into mktyplib2
+OLELIBS = $(OLEDIR)\olelds.obj $(TYPELIBLIB)
+#otherwise, using the applet...
+#OLELIBS = $(OLEDIR)\olelds.obj $(OLEDIR)\oalds.obj
+!else
+OLELIBS = $(OLEDIR)\olelrs.obj $(OLEDIR)\oalrs.obj
+!endif
+!else #not static
+!if "$(DEBUG)" == "D"
+OLELIBS = $(OLEDIR)\olendf.obj $(OLEDIR)\oandf.obj
+!else
+OLELIBS = $(OLEDIR)\olenrf.obj $(OLEDIR)\oanrf.obj
+!endif
+!endif #not static
+
+!endif #mac
+!endif #risc
+!endif #win16
+
+
+###########################################
+# default build rules
+###########################################
+
+
+$(MKTYPLIBSRCDIR)\ERRORS.H: $(MKTYPLIBSRCDIR)\TYPELIB.ERR
+$(MKTYPLIBSRCDIR)\INTLSTR.H: $(MKTYPLIBSRCDIR)\TYPELIB.ERR
+
+$(DESTDIR)\MKTYPLIB.OBJ: $(MKTYPLIBSRCDIR)\MKTYPLIB.C \
+ $(MKTYPLIBSRCDIR)\MKTYPLIB.H \
+ $(MKTYPLIBSRCDIR)\ERRORS.H \
+ $(MKTYPLIBSRCDIR)\FILEINFO.H \
+ $(DISPDIR)\dispatch.h \
+ $(MKTYPLIBSRCDIR)\INTLSTR.H
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$@ $(MKTYPLIBSRCDIR)\mktyplib.c
+
+$(DESTDIR)\TYPOUT.OBJ: $(MKTYPLIBSRCDIR)\TYPOUT.CPP \
+ $(MKTYPLIBSRCDIR)\MKTYPLIB.H \
+ $(MKTYPLIBSRCDIR)\ERRORS.H \
+ $(MKTYPLIBSRCDIR)\FILEINFO.H \
+ $(MKTYPLIBSRCDIR)\INTLSTR.H \
+ $(MKTYPLIBSRCDIR)\TYPELIB.ERR \
+ $(DISPDIR)\dispatch.h
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$@ $(MKTYPLIBSRCDIR)\typout.cpp
+
+$(DESTDIR)\HOUT.OBJ: $(MKTYPLIBSRCDIR)\HOUT.C \
+ $(MKTYPLIBSRCDIR)\MKTYPLIB.H \
+ $(MKTYPLIBSRCDIR)\ERRORS.H \
+ $(MKTYPLIBSRCDIR)\FILEINFO.H \
+ $(MKTYPLIBSRCDIR)\INTLSTR.H \
+ $(DISPDIR)\dispatch.h
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$@ $(MKTYPLIBSRCDIR)\hout.c
+
+$(DESTDIR)\PARSER.OBJ: $(MKTYPLIBSRCDIR)\PARSER.C \
+ $(MKTYPLIBSRCDIR)\MKTYPLIB.H \
+ $(MKTYPLIBSRCDIR)\ERRORS.H \
+ $(MKTYPLIBSRCDIR)\TOKENS.H \
+ $(MKTYPLIBSRCDIR)\PARSER.H \
+ $(MKTYPLIBSRCDIR)\FILEINFO.H \
+ $(DISPDIR)\dispatch.h
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$@ $(MKTYPLIBSRCDIR)\parser.c
+
+$(DESTDIR)\LEXER.OBJ: $(MKTYPLIBSRCDIR)\LEXER.C \
+ $(MKTYPLIBSRCDIR)\MKTYPLIB.H \
+ $(MKTYPLIBSRCDIR)\ERRORS.H \
+ $(MKTYPLIBSRCDIR)\TOKENS.H
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$@ $(MKTYPLIBSRCDIR)\lexer.c
+
+$(DESTDIR)\INTLSTR.OBJ: $(MKTYPLIBSRCDIR)\INTLSTR.C \
+ $(MKTYPLIBSRCDIR)\MKTYPLIB.H \
+ $(DISPDIR)\verstamp.h \
+ $(MKTYPLIBSRCDIR)\INTLSTR.H
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$@ $(MKTYPLIBSRCDIR)\intlstr.c
+
+
+#UNDONE: this file is temporary
+$(DESTDIR)\TMPGUID2.OBJ: $(MKTYPLIBSRCDIR)\TMPGUID.C \
+ $(MKTYPLIBSRCDIR)\MKTYPLIB.H
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$(DESTDIR)\tmpguid2.obj $(MKTYPLIBSRCDIR)\tmpguid.c
+
+$(DESTDIR)\DIMALLOC.OBJ: $(MKTYPLIBSRCDIR)\DIMALLOC.CXX
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$@ $(MKTYPLIBSRCDIR)\dimalloc.cxx
+
+$(DESTDIR)\TLVIEWER.OBJ: $(MKTYPLIBSRCDIR)\TLVIEWER.CPP \
+ $(MKTYPLIBSRCDIR)\MKTYPLIB.H \
+ $(DISPDIR)\dispatch.h \
+ $(MKTYPLIBSRCDIR)\tlviewer.hxx
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) $(MKTYPLIBCCFLAGS) -Fo$@ $(MKTYPLIBSRCDIR)\tlviewer.cpp
+
+
+# ***********************************************************
+# MAC LINK
+# ***********************************************************
+!if "$(TARG)" == "MAC"
+
+$(DESTDIR)\MKTYPLIB.RES: $(MKTYPLIBSRCDIR)\MKTYPLIB.RC $(MKTYPLIBSRCDIR)\MKTYPLIB.ICO $(DISPDIR)\verstamp.h
+ set PATH=$(VBATOOLS)\$(HOSTX)\$(TARG)\bin
+ $(MKTYPLIBRC) $(MKTYPLIBRCFLAGS) -r -Fo$@ $(MKTYPLIBSRCDIR)\mktyplib.rc
+ set PATH=$(MKTYPLIBPATHSAVE)
+
+!if "$(APPLET)" != "0"
+$(DESTDIR)\MKTYPLIB.EXE: $(OBJS) $(DESTDIR)\mktyplib.x \
+ $(OLELIBS)
+ $(DISPLAY) Creating mktyplib.exe...
+ echo >NUL @<<$(DESTDIR)\MKTYPLIB.CRF
+$(DESTDIR)\LEXER.OBJ
+$(DESTDIR)\INTLSTR.OBJ
+$(DESTDIR)\MKTYPLIB.OBJ
+$(DESTDIR)\PARSER.OBJ
+$(DESTDIR)\HOUT.OBJ
+$(DESTDIR)\TYPOUT.OBJ
+$(DESTDIR)\TMPGUID2.OBJ
+$(DESTDIR)\dimalloc.obj
+$(OLELIBS)
+$(CLIBS)
+-MACHINE:m68k
+-ENTRY:mainCRTStartup
+-MAP:$(DESTDIR)\mktyplib.map
+-DEBUG:full
+-DEBUGTYPE:CV
+-NOPACK
+-NODEFAULTLIB
+-OUT:$(DESTDIR)\mktyplib.exe
+<<
+ $(MKTYPLIBLINK) -link @$(DESTDIR)\MKTYPLIB.CRF
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\cvpack $(DESTDIR)\mktyplib.exe
+ copy $(DESTDIR)\mktyplib.x $(DESTDIR)\mktyplib
+ $(MMKTYPLIBRC) -e $(DESTDIR)\mktyplib.exe -a -o $(DESTDIR)\mktyplib
+
+$(DESTDIR)\mktyplib.x: $(MKTYPLIBSRCDIR)\mktyplib.r
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) -EP $(MKTYPLIBINCS) -I$(OLEPROG)\src\typelib -D_MAC_RC -D_MAC \
+ $(RESFILE) > $(DESTDIR)\mktyplib.tmp
+ $(MMKTYPLIBRC) -o $(DESTDIR)\mktyplib.x $(DESTDIR)\mktyplib.tmp
+
+!else
+
+$(DESTDIR)\MKTYPLIB.EXE: $(OBJS) $(DESTDIR)\mktyplib.x \
+ $(OLELIBS)
+ $(DISPLAY) Creating mktyplib.exe...
+ echo >NUL @<<$(DESTDIR)\MKTYPLIB.CRF
+$(DESTDIR)\LEXER.OBJ
+$(DESTDIR)\INTLSTR.OBJ
+$(DESTDIR)\MKTYPLIB.OBJ
+$(DESTDIR)\PARSER.OBJ
+$(DESTDIR)\HOUT.OBJ
+$(DESTDIR)\TYPOUT.OBJ
+$(DESTDIR)\TLVIEWER.OBJ
+$(DESTDIR)\TMPGUID2.OBJ
+$(DESTDIR)\dimalloc.obj
+$(OLELIBS)
+$(CLIBS)
+-MACHINE:m68k
+-ENTRY:mainCRTStartup
+-MAP:$(DESTDIR)\mktyplib.map
+-DEBUG:full
+-DEBUGTYPE:CV
+-NOPACK
+-NODEFAULTLIB
+-OUT:$(DESTDIR)\mktyplib.exe
+<<
+ $(MKTYPLIBLINK) -link @$(DESTDIR)\MKTYPLIB.CRF
+ $(VBATOOLS)\$(HOSTX)\$(TARG)\bin\cvpack $(DESTDIR)\mktyplib.exe
+ copy $(DESTDIR)\mktyplib.x $(DESTDIR)\mktyplib
+ $(MMKTYPLIBRC) -e $(DESTDIR)\mktyplib.exe -a -o $(DESTDIR)\mktyplib
+
+$(DESTDIR)\mktyplib.x: $(MKTYPLIBSRCDIR)\mktyplib.r
+ $(DISPLAY) Compiling $@...
+ $(MKTYPLIBCC) -EP $(MKTYPLIBINCS) -I$(OLEPROG)\src\typelib -DMKTYPLIB2 -D_MAC_RC -D_MAC \
+ $(RESFILE) > $(DESTDIR)\mktyplib.tmp
+ $(MMKTYPLIBRC) -o $(DESTDIR)\mktyplib.x $(DESTDIR)\mktyplib.tmp
+!endif
+
+!else
+
+!if "$(TARGAPI)" == "WIN32"
+# ***********************************************************
+# WIN32 LINK
+# ***********************************************************
+$(DESTDIR)\MKTYPLIB.RES: $(MKTYPLIBSRCDIR)\MKTYPLIB.RC $(MKTYPLIBSRCDIR)\MKTYPLIB.ICO $(DISPDIR)\verstamp.h
+ set PATH=$(_NTBINDIR)\mstools
+ $(MKTYPLIBRC) $(MKTYPLIBRCFLAGS) -r -Fo$@ $(MKTYPLIBSRCDIR)\mktyplib.rc
+ set PATH=$(MKTYPLIBPATHSAVE)
+
+$(DESTDIR)\MKTYPLIB.EXE: $(OBJS) $(DEFFILE) $(RESFILE) $(CLIBS) \
+ $(OLELIBS)
+ $(DISPLAY) Creating mktyplib.exe...
+ $(CVTRES) -r -$(TARGCPU) -o $(DESTDIR)\_resfile.obj $(RESFILE)
+ echo >NUL @<<$(DESTDIR)\MKTYPLIB.CRF
+-MACHINE:$(TARGCPU) -SUBSYSTEM:console -ENTRY:mainCRTStartup -MAP:$(DESTDIR)\mktyplib.map
+-OUT:$(DESTDIR)\mktyplib.exe
+-NODEFAULTLIB
+!if "$(DEBUG)"=="D"
+-DEBUG:full -DEBUGTYPE:CV,fixup,coff
+!endif
+$(DESTDIR)\LEXER.OBJ
+$(DESTDIR)\INTLSTR.OBJ
+$(DESTDIR)\MKTYPLIB.OBJ
+$(DESTDIR)\PARSER.OBJ
+$(DESTDIR)\HOUT.OBJ
+$(DESTDIR)\TYPOUT.OBJ
+$(DESTDIR)\dimalloc.obj
+$(DESTDIR)\_resfile.obj
+!if "$(TARG)"=="WIN32"
+$(OLEPROG)\TOOLS\WIN32\lib\oldnames.lib
+!endif
+$(CLIBS)
+$(OLELIBS)
+<<
+ $(MKTYPLIBLINK) @$(DESTDIR)\MKTYPLIB.CRF
+#only care about .SYM file for x86 builds for use on win32s
+!if "$(TARG)" == "WIN32"
+ $(MKTYPLIBMAPSYM) -a -e -o $(DESTDIR)\mktyplib.sym $(DESTDIR)\mktyplib.map
+!endif
+
+!else
+# ***********************************************************
+# WIN16 LINK
+# ***********************************************************
+$(DESTDIR)\MKTYPLIB.RES: $(MKTYPLIBSRCDIR)\MKTYPLIB.RC $(MKTYPLIBSRCDIR)\MKTYPLIB.ICO $(DISPDIR)\verstamp.h
+ set PATH=$(OLEPROG)\tools\win16\os2\bin
+ $(MKTYPLIBRC) $(MKTYPLIBRCFLAGS) -r -Fo$@ $(MKTYPLIBSRCDIR)\mktyplib.rc
+ set PATH=$(MKTYPLIBPATHSAVE)
+
+$(DESTDIR)\MKTYPLIB.EXE: $(OBJS) $(DEFFILE) $(RESFILE) $(CLIBS) \
+ $(OLELIBS)
+ $(DISPLAY) Creating mktyplib.exe...
+ echo >NUL @<<$(DESTDIR)\MKTYPLIB.CRF
+$(DESTDIR)\LEXER.OBJ +
+$(DESTDIR)\INTLSTR.OBJ +
+$(DESTDIR)\MKTYPLIB.OBJ +
+$(DESTDIR)\PARSER.OBJ +
+$(DESTDIR)\HOUT.OBJ +
+$(DESTDIR)\TYPOUT.OBJ +
+$(DESTDIR)\dimalloc.obj
+$(DESTDIR)\MKTYPLIB.EXE
+$(DESTDIR)\mktyplib.map
+$(OLEPROG)\tools\win16\os2\lib\+
+/NOD $(CLIBS) +
+$(OLELIBS)
+$(DEFFILE);
+<<
+ set PATH=$(OLEPROG)\tools\win16\os2\bin
+ $(MKTYPLIBLINK) $(MKTYPLIBLINKFLAGS) @$(DESTDIR)\MKTYPLIB.CRF
+ $(MKTYPLIBRC) $(RESFLAGS) $(DESTDIR)\MKTYPLIB.EXE
+ $(MKTYPLIBMAPSYM) $(DESTDIR)\mktyplib
+ copy mktyplib.sym $(DESTDIR)
+ set PATH=$(MKTYPLIBPATHSAVE)
+!endif
+!endif
+
+
+
+#***************************************************
+#
+# Type library build rules (assumes $(DESTDIR)\mktyplib.exe has been built)
+#
+# Create the type library, put it into a .RES file (with a version resource)
+# and then link the .RES file together with a stub DLL (which we call
+# STDOLE[32].TLB for backwards compatibility.
+#
+#***************************************************
+!if "$(TARGAPI)" == "WIN32"
+$(DESTDIR)\$(STDOLE).tlb: $(DESTDIR)\$(STDOLE).res \
+ $(MKTYPLIBSRCDIR)\stdole.def
+ $(DISPLAY) Creating $@...
+ $(CVTRES) -r -$(TARGCPU) -o $(DESTDIR)\_resfile.obj $(DESTDIR)\$(STDOLE).res
+ $(MKTYPLIBLINK) @<<$(DESTDIR)\$(@B).lrf
+-machine:$(TARGCPU) -dll
+-map:$(DESTDIR)\$(@B).MAP -nodefaultlib
+-debug:none
+-noentry
+-out:$@
+-heap:0,0
+-stack:0,0
+$(DESTDIR)\_resfile.obj
+<<KEEP
+!else
+$(DESTDIR)\$(STDOLE).tlb: $(DESTDIR)\$(STDOLE).res $(DESTDIR)\resstub.obj \
+ $(MKTYPLIBSRCDIR)\stdole.def
+ $(MKTYPLIBLINK) @<<$(DESTDIR)\$(@B).lrf
+/BA /onerror:noexe /noe /nod /map /far /packc /packd /align:4 +
+$(DESTDIR)\resstub.obj
+$@
+$(DESTDIR)\$(@B).MAP
+$(OLEPROG)\tools\win16\os2\lib\libw.lib $(OLEPROG)\tools\win16\os2\lib\snocrtdw.lib
+$(MKTYPLIBSRCDIR)\stdole.def
+<<KEEP
+ $(MKTYPLIBRC) -31 -T $(DESTDIR)\$(STDOLE).res $@
+!endif
+
+$(DESTDIR)\$(STDOLE).tmp: $(DESTDIR)\mktyplib.exe $(MKTYPLIBSRCDIR)\stdole.odl
+ $(DISPLAY) Running mktyplib to create $@...
+ copy $(MKTYPLIBSRCDIR)\stdole.odl $(DESTDIR)\$(STDOLE).odl
+ cd $(DESTDIR)
+ $(MKTYPLIBCC) /EP $(STDOLE).odl >$(STDOLE).pre
+ mktyplib /h /o $(STDOLE).log /tlb $(STDOLE).tmp /nocpp $(STDOLE).pre
+ type $(STDOLE).log
+ cd $(OLEPROG)\build
+
+$(DESTDIR)\$(STDOLE).RES: $(MKTYPLIBSRCDIR)\$(STDOLE).rc $(DESTDIR)\$(STDOLE).tmp $(DISPDIR)\verstamp.h
+ $(DISPLAY) Creating $@...
+!if "$(TARGAPI)" == "WIN32"
+ set PATH=$(_NTBINDIR)\mstools
+ $(MKTYPLIBRC) $(MKTYPLIBRCFLAGS) -I$(DESTDIR) -r -Fo$@ $(MKTYPLIBSRCDIR)\$(STDOLE).rc
+ set PATH=$(MKTYPLIBPATHSAVE)
+!else
+ set PATH=$(OLEPROG)\tools\win16\os2\bin
+ $(MKTYPLIBRC) $(MKTYPLIBRCFLAGS) -I$(DESTDIR) $(WOWFLAG) -r -Fo$@ $(MKTYPLIBSRCDIR)\$(STDOLE).rc
+ set PATH=$(MKTYPLIBPATHSAVE)
+!endif
+
+# generate an empty .OBJ file for LINK
+$(DESTDIR)\resstub.obj:
+ $(DISPLAY) Generating $(DESTDIR)\resstub.obj...
+ ECHO // Automatically generated empty .C file for use with OBintl.DLL >$(DESTDIR)\resstub.c
+ ECHO int __far __pascal __export LibMain(int i, int j, int k, char __far *l) {return 1;} >>$(DESTDIR)\resstub.c
+ ECHO int __far __pascal __export WEP(int n) {return 1;}>>$(DESTDIR)\resstub.c
+ $(MKTYPLIBCC) /AS /c /Od /Gs /Fo$@ $(DESTDIR)\resstub.c
diff --git a/private/oleauto/build/readme.txt b/private/oleauto/build/readme.txt
new file mode 100644
index 000000000..ba19d403b
--- /dev/null
+++ b/private/oleauto/build/readme.txt
@@ -0,0 +1,20 @@
+To build OLE Automation from this project:
+
+set OLEPROG = c:\oleauto (wherever this enlistment is called)
+set _NTBINDIR = c:\nt (or whatever)
+ Assumes the following structure:
+ c:\nt\mstools
+ c:\public\sdk\lib\<platform>
+ c:\public\sdk\inc
+ c:\public\sdk\inc\crt
+set HOST = WIN32 (x86 32-bit & 16-bit build)
+ MIPS (mips build)
+ ALPHA (alpha build)
+ PPC (PPC build)
+
+See Go1.bat for an example of how to build everything from scratch.
+For RISC machines, you can omit all the 16-bit builds if you want
+(just use the ones from the x86 build -- they are supposed to be identical).
+
+The resulting object fies and binaries are put in directories that match your
+build target. For example, "make dwin32" ==> puts all generated files into \oleauto\dwin32.
diff --git a/private/oleauto/build/results.bat b/private/oleauto/build/results.bat
new file mode 100644
index 000000000..724ffa645
--- /dev/null
+++ b/private/oleauto/build/results.bat
@@ -0,0 +1 @@
+%oleprog%\bin\win32\results -i %1 %2 %3 %4
diff --git a/private/oleauto/build/win16.mak b/private/oleauto/build/win16.mak
new file mode 100644
index 000000000..a9bc2f6d6
--- /dev/null
+++ b/private/oleauto/build/win16.mak
@@ -0,0 +1,1217 @@
+###########################################################################
+#
+# (c) Copyright Microsoft Corp. 1994 All Rights Reserved
+#
+# File:
+#
+# win16.mak
+#
+# Purpose:
+#
+# makefile for WIN16 build, both WOW and non-WOW version
+# it also !includes mktyplib.mak for mktyplib.exe build.
+#
+#
+# Description:
+#
+# Usage: use make.bat to set required variabled and invoke this makefile
+#
+# Options:
+#
+# the caller should supply the following
+# DESTDIR = [dwin32, rwin32] ;where .obj, .lib, .dll ... will be
+# TARG = [WIN16,WIN32,MIPS,ALPHA,PPC,MAC,MACPPC] ;useful if we want to combin win16.mak, win32.mak and macppc.mak together
+# TARGCPU = [i386,MIPS,ALPHA,PPC]
+# TARGCPUDEF = [_X86_,_MIPS_,_ALPHA_,_PPC_]
+# WOW
+# PCODE
+# DEBUG = [D,R] ;control debug or retail build
+#
+#
+# Environment:
+#
+# OLEPROG, HOST must be set
+# OLEPROG ;the root directory of this project
+# HOST = [WIN32,MIPS,ALPHA,PPC] ;build host
+#
+#
+# Revision History:
+#
+# [00] 02-Aug-94 t-issacl: Created
+#
+# Note: we are using 2 versions of ldllcew.lib in this build.
+# hdos\c800\lib\ldllcew.lib should be used for oledisp build.
+# os2\lib\ldllcew.lib should be used for typelib build.
+#
+###########################################################################
+
+
+PATHSAVE = $(PATH) # old path is save in PATHSAVE
+
+
+###########################################################################
+#
+# Switch validity checking start
+#
+!if "$(HOST)"!="WIN32"
+!error ERROR: Invalid HOST $(HOST)! Must be WIN32
+!endif
+
+!if "$(TARGCPU)"!="i386"
+!error ERROR: Invalid TARGCPU $(TARGCPU)! Must be i386
+!endif
+
+!if "$(DEBUG)"!="D" && "$(DEBUG)"!="R"
+!error ERROR: Invalid DEBUG type $(DEBUG)! Must be one of (D, R)
+!endif
+
+#
+# Switch validity checking ends
+#
+###########################################################################
+
+
+###########################################################################
+#
+# directory, flags and tools settting
+#
+
+TARGAPIAPI = WIN16
+
+###########################################################################
+# set up directories and files
+#
+
+DISPPATH = $(OLEPROG)\src\dispatch
+DISPINC = $(OLEPROG)\src\inc
+DISPTARGAPISRC = $(DISPPATH)\$(TARGAPI)
+TYPELIBPATH = $(OLEPROG)\src\typelib
+TOOLS = $(OLEPROG)\tools\win16
+OLELIB = $(OLEPROG)\ole\win16\LIB
+C7LIB = $(OLEPROG)\tools\win16\os2\LIB
+
+#####
+# Create build directories if not already present
+# (the '!if []' notation executes the command during the NMAKE pre-
+# processor, so these are not emitted into the output batch file)
+#####
+
+!if [if not exist $(DESTDIR)\*.* mkdir $(DESTDIR)] != 0
+!endif
+
+################################################################
+#
+# Run under WOW under WinNT
+# Version #'s for this is OLE 2.10, not 2.02
+#
+!if ("$(WOW)" == "1" )
+WOWFLAG = -DWOW -DOLEMINORVERS=10
+OLEMINORVERS=10
+!else
+OLEMINORVERS=02
+!endif
+
+
+###########################################################################
+# set up flags and TOOLS
+#
+
+##### default use of pre-compiled headers
+!ifndef USEPCH
+! if "$(DEBUG)" == "D"
+USEPCH = 1
+! else
+USEPCH = 0
+! endif
+!endif
+
+#
+# TARGAPI specific variables
+#
+
+
+A = asm
+O = obj
+R = rc
+
+AS = ml
+CC = cl
+CCPP = cl
+LD = link
+RC = rc
+LIBRARIAN= lib
+IMPLIB = implib
+MAPSYM = mapsym
+
+DISPLAY = echo >con
+FILELIST = $(OLEPROG)\bin\$(HOST)\ls -1F
+INCLUDES = $(OLEPROG)\bin\$(HOST)\includes.exe
+SED = $(OLEPROG)\bin\$(HOST)\sed.exe
+
+CFLAGS = -nologo -f- -W3 -G2 -H64 -DWIN16 -D_WINDOWS
+AFLAGS = -nologo -Cx -FPi $(WOWFLAG)
+LFLAGS = /NOD /NOE /BATCH /ONERROR:NOEXE /ALIGN:16
+RCFLAGS =
+LNOI = /NOI
+
+!if "$(DEBUG)" == "D"
+COPT = -Od
+LOPT =
+CDEFS = -D_DEBUG
+RCDEFS = -d_DEBUG
+VERDEFS = -DWIN16 -DID_DEBUG=1 #define these for version.hxx
+OLELINKFLAGS = /cod
+!else
+!if "$(DEBUG)" == "R"
+COPT = -Oxza -Gs
+LOPT = /FAR
+CDEFS =
+RCDEFS =
+VERDEFS = -DWIN16 -DID_DEBUG=0 #define these for version.hxx
+OLELINKFLAGS =
+!endif
+!endif
+
+! if "$(DEBUG)" == "D"
+DBCFLAGS = -Zi
+DBAFLAGS = -Zi
+DBLFLAGS = /CO
+!else
+DBCFLAGS = /Zi
+DBAFLAGS = /Zi
+DBLFLAGS =
+!endif
+
+COMPILER = C800
+
+TARGAPIBIN = $(TOOLS)\HDOS\$(COMPILER)\BIN
+BINPATHS = $(TOOLS)\HDOS\BIN;$(TARGAPIBIN)
+
+TARGAPILIB = $(TOOLS)\HDOS\$(COMPILER)\LIB
+LIBPATHS = $(TARGAPILIB);$(OLELIB)
+
+TARGAPIINC = $(TOOLS)\HDOS\$(COMPILER)\INCLUDE
+INCPATHS = $(OLEPROG)\ole\win16;$(DISPPATH);$(DISPINC);$(TARGAPIINC)
+#T-issacl DISPINCFLAGS used only for dependence generating purpose.
+#We still use set INCLUCDE=INCPATHS since there are line length limitation
+#for some command like hdos\bin\rc.
+DISPINCFLAGS = -I$(OLEPROG)\ole\win16 -I$(DISPPATH) -I$(DISPINC) -I$(TARGAPIINC)
+
+#
+# Default flags
+#
+
+# global C/C++ compiler flags
+CFLAGS = $(CFLAGS) $(CDEFS) $(COPT) $(DBCFLAGS) -DVBA2=1
+
+# global assembler flags
+#AFLAGS = $(AFLAGS) $(DBAFLAGS) -DVBA2=1 $(VERDEFS)
+AFLAGS = $(AFLAGS) $(CDEFS) $(DBAFLAGS) -DVBA2=1
+
+# global linker flags
+LFLAGS = $(LFLAGS) $(LOPT) $(DBLFLAGS)
+
+# global rc flags
+RCFLAGS = $(RCFLAGS) $(RCDEFS) -DVBA2=1 $(VERDEFS)
+
+
+#
+# Precompiled Header Files
+#
+PCHSTOP =
+PCHSRC =
+PCHFILE =
+
+!if "$(USEPCH)" == "1"
+PCHOBJ =
+PCHFLAGS=
+!else
+PCHOBJ =
+PCHFLAGS=
+!endif
+
+
+#
+# Profiling enabled
+#
+!if ("$(PROFILE)" == "1")
+CFLAGS = $(CFLAGS) -Zi
+LFLAGS = $(LFLAGS) /CO
+!endif
+
+
+
+##########################################################################
+#
+# WIN16 Local Settings
+#
+# Note: were are using the same flags that are used to build the ole2
+# Dlls. The following comment is taken from the Ole2 makefile
+# (ole2\dll\src\inc\makeole2),
+#
+# "Win16 compiler/linker flags; NOTE: we are using a trick to get exported
+# entries w/o the corresponding EXPDEF record: /GA /GEd -D_WINDLL;
+# this has been verified by the C7/C8 team."
+#
+
+DISPCLFLAGS = $(CFLAGS) $(WOWFLAG) $(VERDEFS)
+DISPCFLAGS = -Fd$(DESTDIR)\ole2disp.pdb -ALw -GA -GEd -D_WINDLL
+DISPCPPFLAGS = -Fd$(DESTDIR)\ole2disp.pdb -ALw -GA -GEd -D_WINDLL $(PCHFLAGS) -NV "_COMDATS"
+NLSCFLAGS = -Fd$(DESTDIR)\ole2nls.pdb -Gs -ASw -GD -GEd -DNO_PROCESS_CACHE
+
+
+RPC_TEXT = -NT "RPC"
+RPC2_TEXT = -NT "RPC2"
+BSTR_TEXT = -NT "BSTR"
+DEBUG_TEXT = -NT "DEBUG"
+RUNTIME_TEXT = -NT "RT"
+STDIMPL_TEXT = -NT "STDIMPL"
+DEFAULT_TEXT = -NT "_TEXT"
+UPS_TEXT = -NT "UPS"
+
+
+##########################################################################
+#
+# VBA OLE setting
+#
+
+TLB_NAME = typelib
+VBATARGBIN = $(TOOLS)\OS2\BIN
+
+VBAINC = -I$(DESTDIR) -I$(TOOLS)\OS2\INC -I$(TYPELIBPATH) -I$(OLEPROG)\ole\win16 -I$(OLEPROG)\src\inc
+
+VBARCFLAGS = -R -X $(VBAINC) -DOLEMINORVERS=$(OLEMINORVERS) $(VERDEFS)
+
+!if "$(DEBUG)"=="D"
+OLECLFLAGS = -c -f -W3 -ALw -Od -Gt10 -G2 -GA -GEd -D_WINDLL -Ge -Zie $(VBAINC) -DConst=const -DOLEMINORVERS=$(OLEMINORVERS) $(VERDEFS)
+CLBROWSE = /Zn /Fr$*.sbr
+!else
+OLECLFLAGS = -c -W3 -ALw -Oxtwz -Bm8192 -GA2sx /GEd -D_WINDLL -Zi $(VBAINC) -DOLEMINORVERS=$(OLEMINORVERS) $(VERDEFS)
+CLBROWSE=
+!endif
+PCHOLE = -Yu -DRTPCHNAME=\"$(DESTDIR)\typelib.pch\"
+
+VBAMAPSYM = $(VBATARGBIN)\mapsym.exe
+VBALINK = $(VBATARGBIN)\link.exe
+VBARC = $(VBATARGBIN)\rc.exe
+VBACL = $(VBATARGBIN)\cl.exe
+AWK = $(OLEPROG)\bin\$(HOST)\awk.exe # c:\revlis\bin\[host]
+
+#
+#Tools and Variables setting end
+#
+###########################################################################
+
+
+
+###########################################################################
+#
+# Default Build rules start
+#
+
+{$(DISPPATH)}.c{$(DESTDIR)}.obj:
+ @$(DISPLAY) Compiling $<...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) -c -Fo$@ $<
+
+{$(DISPPATH)}.cpp{$(DESTDIR)}.obj:
+ @$(DISPLAY) Compiling $<...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) -c -Fo$@ $<
+
+{$(DISPPATH)}.asm{$(DESTDIR)}.obj:
+ @$(DISPLAY) Compiling $<...
+ $(AS) $(AFLAGS) -Fo$(DESTDIR)\ -c $<
+
+{$(DISPTARGAPISRC)}.c{$(DESTDIR)}.obj:
+ @$(DISPLAY) Compiling $<...
+ $(CC) $(DISPCLFLAGS) $(NLSCFLAGS) -c -Fo$@ $<
+
+{$(TYPELIBPATH)}.cxx{$(DESTDIR)}.obj:
+ $(DISPLAY) Compiling $<...
+ $(VBACL) -DOLEBLD $(OLECLFLAGS) $(CLBROWSE) $(PCHOLE) -Fo$@ $<
+
+{$(TYPELIBPATH)}.c{$(DESTDIR)}.obj:
+ $(DISPLAY) Compiling $<...
+ $(VBACL) -DOLEBLD $(OLECLFLAGS) $(CLBROWSE) -Fo$@ $<
+
+{$(TYPELIBPATH)}.asm{$(DESTDIR)}.obj:
+ @$(DISPLAY) Compiling $<...
+ $(TOOLS)\HDOS\BIN\$(AS) $(AFLAGS) -Fo$(DESTDIR)\ -c $<
+
+{$(TYPELIBPATH)}.rc{$(DESTDIR)}.res:
+ $(DISPLAY) Compiling $<...
+# so it can find RCPP.EXE
+ set PATH=$(VBATARGBIN)
+!if "$(CHARSIZE)"=="D"
+ $(VBARC) $(VBARCFLAGS) -Fo$@ -DFV_DBCS $<
+!else
+ $(VBARC) $(VBARCFLAGS) -Fo$@ $<
+!endif
+ set PATH=$(PATHSAVE)
+
+
+#
+#Default Build rules ends
+#
+###########################################################################
+
+
+
+##########################################################################
+#
+# Ole Automation OBJS
+#
+
+
+#####################
+#
+# ole2disp.dll OBJS
+
+
+!if "$(DEBUG)" == "D"
+DISPDB_OBJS = \
+ $(DESTDIR)\validat.obj \
+ $(DESTDIR)\assert.obj
+!else
+DISPDB_OBJS =
+!endif
+
+
+DISP_OBJS = \
+ $(DISPDB_OBJS) \
+ $(DESTDIR)\oledisp.obj \
+ $(DESTDIR)\psfactry.obj \
+ $(DESTDIR)\dispmrsh.obj \
+ $(DESTDIR)\dispprox.obj \
+ $(DESTDIR)\dispstub.obj \
+ $(DESTDIR)\evprox.obj \
+ $(DESTDIR)\evstub.obj \
+ $(DESTDIR)\tiprox.obj \
+ $(DESTDIR)\tistub.obj \
+ $(DESTDIR)\errinfo.obj \
+ $(DESTDIR)\tiutil.obj \
+ $(DESTDIR)\tlprox.obj \
+ $(DESTDIR)\tlstub.obj \
+ $(DESTDIR)\tcprox.obj \
+ $(DESTDIR)\tcstub.obj \
+ $(DESTDIR)\ups.obj \
+ $(DESTDIR)\uvft.obj \
+!if ( "$(WOW)" == "1")
+ $(DESTDIR)\dispstrm.obj \
+!endif
+ $(DESTDIR)\disphelp.obj \
+ $(DESTDIR)\invhelp.obj \
+ $(DESTDIR)\invoke.obj \
+ $(DESTDIR)\cdispti.obj \
+ $(DESTDIR)\stddisp.obj \
+ $(DESTDIR)\time-api.obj \
+ $(DESTDIR)\memory.obj \
+ $(DESTDIR)\bstr.obj \
+ $(DESTDIR)\sarray.obj \
+ $(DESTDIR)\oledate.obj \
+ $(DESTDIR)\crtstuff.obj \
+ $(DESTDIR)\bstrdate.obj \
+ $(DESTDIR)\asmhelp.obj \
+ $(DESTDIR)\oleconva.obj \
+ $(DESTDIR)\variant.obj \
+ $(DESTDIR)\convertt.obj \
+ $(DESTDIR)\nlshelp.obj \
+ $(DESTDIR)\getobj.obj \
+ $(DESTDIR)\tables.obj \
+ $(DESTDIR)\dispiid.obj \
+ $(DESTDIR)\oleguids.obj \
+ $(DESTDIR)\clsid.obj
+
+GUID_OBJS = \
+ $(DESTDIR)\idispiid.obj
+# $(DESTDIR)\oleguids.obj \
+# $(DESTDIR)\clsid.obj
+
+
+
+#####################
+#
+# ole2nls.dll OBJS
+
+!if "$(DEBUG)" == "D"
+NLSDB_OBJS = \
+ $(DESTDIR)\validato.obj \
+ $(DESTDIR)\asserto.obj
+!else
+NLSDB_OBJS =
+!endif
+
+
+TARGAPI_OBJS= $(TOOLS)\HDOS\$(COMPILER)\LIB\libentry.obj
+
+FENLS_OBJS = \
+ $(DESTDIR)\0404.obj \
+ $(DESTDIR)\0411.obj \
+ $(DESTDIR)\0412.obj \
+ $(DESTDIR)\0804.obj
+
+NLS_OBJS = \
+ $(NLSDB_OBJS) \
+ $(TARGAPI_OBJS) \
+ $(DESTDIR)\nlsapi.obj \
+ $(DESTDIR)\string.obj \
+ $(NLS_TABLE_OBJS)
+
+NLS_TABLE_OBJS = \
+ $(FENLS_OBJS) \
+ $(DESTDIR)\0403.obj \
+ $(DESTDIR)\0405.obj \
+ $(DESTDIR)\0406.obj \
+ $(DESTDIR)\0407.obj \
+ $(DESTDIR)\0408.obj \
+ $(DESTDIR)\0409.obj \
+ $(DESTDIR)\040A.obj \
+ $(DESTDIR)\040B.obj \
+ $(DESTDIR)\040C.obj \
+ $(DESTDIR)\040E.obj \
+ $(DESTDIR)\040F.obj \
+ $(DESTDIR)\0410.obj \
+ $(DESTDIR)\0413.obj \
+ $(DESTDIR)\0414.obj \
+ $(DESTDIR)\0416.obj \
+ $(DESTDIR)\0415.obj \
+ $(DESTDIR)\0419.obj \
+ $(DESTDIR)\041B.obj \
+ $(DESTDIR)\041D.obj \
+ $(DESTDIR)\041F.obj \
+ $(DESTDIR)\0807.obj \
+ $(DESTDIR)\0809.obj \
+ $(DESTDIR)\080A.obj \
+ $(DESTDIR)\080C.obj \
+ $(DESTDIR)\0810.obj \
+ $(DESTDIR)\0813.obj \
+ $(DESTDIR)\0814.obj \
+ $(DESTDIR)\0816.obj \
+ $(DESTDIR)\0C09.obj \
+ $(DESTDIR)\0C07.obj \
+ $(DESTDIR)\0C0A.obj \
+ $(DESTDIR)\0C0C.obj \
+ $(DESTDIR)\1009.obj \
+ $(DESTDIR)\100C.obj \
+ $(DESTDIR)\1409.obj \
+ $(DESTDIR)\1809.obj \
+ $(DESTDIR)\040d.obj \
+ $(DESTDIR)\0429.obj \
+ $(DESTDIR)\0401.obj \
+ $(DESTDIR)\0801.obj \
+ $(DESTDIR)\0c01.obj \
+ $(DESTDIR)\1001.obj \
+ $(DESTDIR)\1401.obj \
+ $(DESTDIR)\1801.obj \
+ $(DESTDIR)\1c01.obj \
+ $(DESTDIR)\2001.obj \
+ $(DESTDIR)\2401.obj \
+ $(DESTDIR)\2801.obj \
+ $(DESTDIR)\2c01.obj \
+ $(DESTDIR)\3001.obj \
+ $(DESTDIR)\3401.obj \
+ $(DESTDIR)\3801.obj \
+ $(DESTDIR)\3c01.obj \
+ $(DESTDIR)\4001.obj
+
+
+
+############################################################################
+#
+# VBA OLE build -- T Y P E L I B --
+#
+############################################################################
+
+CLOBJ_OLE = $(DESTDIR)\gdtinfo.obj $(DESTDIR)\gdtrt.obj \
+ $(DESTDIR)\stltinfo.obj $(DESTDIR)\nammgr.obj \
+ $(DESTDIR)\gtlibole.obj \
+ $(DESTDIR)\dfstream.obj \
+ $(DESTDIR)\oletmgr.obj $(DESTDIR)\impmgr.obj \
+ $(DESTDIR)\errmap.obj \
+ $(DESTDIR)\clutil.obj \
+ $(DESTDIR)\tdata1.obj \
+ $(DESTDIR)\tdata2.obj $(DESTDIR)\dtmbrs.obj \
+ $(DESTDIR)\entrymgr.obj $(DESTDIR)\dtbind.obj \
+ $(DESTDIR)\dfntbind.obj $(DESTDIR)\dbindtbl.obj \
+ $(DESTDIR)\gbindtbl.obj $(DESTDIR)\dstrmgr.obj \
+ $(DESTDIR)\gptbind.obj $(DESTDIR)\dfntcomp.obj \
+ $(DESTDIR)\gtlibstg.obj $(DESTDIR)\oautil.obj
+
+MISCLIB_OLEOBJ = \
+ $(DESTDIR)\debug2.obj \
+ $(DESTDIR)\blkmgr.obj \
+ $(DESTDIR)\dassert.obj \
+ $(DESTDIR)\fstream.obj \
+ $(DESTDIR)\mem.obj \
+ $(DESTDIR)\sheapmgr.obj \
+ $(DESTDIR)\tls.obj \
+ $(DESTDIR)\rtsheap.obj \
+ $(DESTDIR)\tlibutil.obj \
+ $(DESTDIR)\wep.obj \
+ $(DESTDIR)\tlibguid.obj \
+ $(DESTDIR)\obguid.obj \
+ $(DESTDIR)\mbstring.obj
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+TLB_DLL = $(DESTDIR)\$(TLB_NAME).dll # TypeLib DLL
+TLB_IMPLIB = $(DESTDIR)\$(TLB_NAME).lib # Import Lib for TypeLib
+TYPELIBDLL_DEF = $(DESTDIR)\$(TLB_NAME).def
+TLBTARGET=\
+ $(TLB_DLL) \
+ $(TLB_IMPLIB) \
+
+default: all
+
+all: setflags ole2nls ole2disp resetflags TypeLibTarget mktyplib stdole
+
+!include $(OLEPROG)\build\mktyplib.mak
+
+ole2disp: setflags $(DESTDIR)\ole2disp.dll
+ole2nls: setflags $(DESTDIR)\ole2nls.dll
+
+#t-issacl we choose to set PATH and INCLUDE since tools\win16\hdos\bin\rc has
+# a line length limitation of 128 chars. It will be too much hustle to
+# simply make the rc work.
+setflags:
+ set LIB=$(LIBPATHS)
+ set PATH=$(BINPATHS)
+ set INCLUDE=$(INCPATHS)
+
+resetflags:
+ set LIB=
+ set PATH=$(PATHSAVE)
+ set INCLUDE=
+
+TypeLibTarget: $(TLBTARGET)
+
+TYPELIBDLL_RSRC=$(DESTDIR)\$(TLB_NAME).res
+#add explicit dependencies on files included by $(TLB_NAME).rc
+$(TYPELIBPATH)\$(TLB_NAME).rc : $(TYPELIBPATH)\obwin.hxx $(DISPINC)\verstamp.h
+
+
+#It happens that next 2 lines will cause a link error "response line too long"
+#so we use 2 variables instead of one.
+#TYPELIBDLL_OLE2_LIBS=$(TOOLS)\OLELIB\ole2.lib $(TOOLS)\OLELIB\storage.lib $(OLELIB)\compobj.lib $(DESTDIR)\ole2disp.lib $(DESTDIR)\ole2nls.lib
+#TYPELIBDLL_LIBS=$(TYPELIBDLL_OLE2_LIBS) $(C7LIB)\toolhelp.lib $(C7LIB)\shell.lib
+TYPELIBDLL_OLE2_LIBS=$(OLELIB)\ole2.lib $(OLELIB)\storage.lib $(OLELIB)\compobj.lib
+TYPELIBDLL_LIBS=$(DESTDIR)\ole2disp.lib $(DESTDIR)\ole2nls.lib $(C7LIB)\toolhelp.lib $(C7LIB)\shell.lib
+
+TYPELIBDLL_OBJS = $(MISCLIB_OLEOBJ) $(CLOBJ_OLE)
+$(TYPELIBDLL_OBJS): $(DESTDIR)\tlibpch.obj
+
+$(DESTDIR)\tlibpch.obj: $(TYPELIBPATH)\tlibpch.cxx
+ $(DISPLAY) Compiling pre-compiled header $@
+ $(VBACL) $(CLBROWSE) $(OLECLFLAGS) -DOLEBLD -Yc -DRTPCHNAME=\"$(DESTDIR)\typelib.pch\" -Fo$@ $(TYPELIBPATH)\tlibpch.cxx
+
+
+$(TYPELIBDLL_DEF): $(TYPELIBPATH)\$(TLB_NAME).def $(TYPELIBPATH)\switches.hxx $(TYPELIBPATH)\version.hxx
+ $(DISPLAY) Creating $@...
+!if "$(UNICODE_OLE)" == ""
+ $(VBACL) $(VERDEFS) /EP /c /I$(TYPELIBPATH) /I$(DESTDIR) /Tc$(TYPELIBPATH)\$(TLB_NAME).def > $(DESTDIR)\tlibcpp.def
+ $(AWK) -f $(OLEPROG)\bin\$(TARGAPI)def.awk $(DESTDIR)\tlibcpp.def >$@
+!else # UNICODE_OLE
+ $(VBACL) $(VERDEFS) /EP /c /I$(TYPELIBPATH) /I$(DESTDIR) /Tc$(TYPELIBPATH)\$(TLB_NAME).def > $(DESTDIR)\$(TLB_NAME).def
+!endif
+
+
+
+#############################################################################
+#
+# typelib.dll (Win16 build)
+#
+
+$(TLB_DLL): $(TYPELIBDLL_OBJS) $(TYPELIBDLL_LIBS) $(TYPELIBDLL_OLE2_LIBS) $(TYPELIBDLL_RSRC) $(TYPELIBDLL_DEF) $(DESTDIR)\segorder.obj
+ $(DISPLAY) Linking $@...
+ if exist $@ del $@
+# set path so that it can find CVPACK
+ set PATH=$(VBATARGBIN)
+ $(VBALINK) @<<$(DESTDIR)\$(TLB_NAME).lrf
+/BA /onerror:noexe /noe /nod $(OLELINKFLAGS) /map /far /packd:0xC000 /nopackcode /segm:150 +
+!if "$(DEBUG)"=="R"
+/align:16 +
+!else
+/align:64 +
+!endif
+$(DESTDIR)\segorder.obj +
+$(TYPELIBDLL_OBJS: =+^
+) +
+$(DESTDIR)\tlibpch.obj +
+$(C7LIB)\wchkstk.obj
+$@
+$(DESTDIR)\$(TLB_NAME).map
+$(TYPELIBDLL_LIBS) +
+$(TYPELIBDLL_OLE2_LIBS) +
+$(C7LIB)\pcdm.lib $(C7LIB)\oldnames.lib $(C7LIB)\libw.lib $(C7LIB)\ldllcew.lib
+$(TYPELIBDLL_DEF)
+<<KEEP
+ set PATH=$(PATHSAVE)
+ $(VBARC) $(VERDEFS) -31 -T $(TYPELIBDLL_RSRC) $@
+ $(VBAMAPSYM) $(DESTDIR)\$(TLB_NAME).map
+ copy $(TLB_NAME).sym $(DESTDIR)\$(TLB_NAME).sym
+ del $(TLB_NAME).sym
+
+#
+# TypeLib Import Lib -- All platforms
+#
+
+VBAIMPLIB = $(OLEPROG)\tools\win16\hdos\c800\bin\implib.exe
+
+$(TLB_IMPLIB): $(TYPELIBDLL_DEF)
+ $(DISPLAY) Building import library $@...
+ $(VBAIMPLIB) /nowep $@ $(TYPELIBDLL_DEF)
+
+
+#############################################################################
+#
+# ole2disp.dll (Win16 build)
+#
+
+$(DESTDIR)\ole2disp.dll : \
+ $(PCHOBJ) \
+ $(DISP_OBJS) \
+ $(DESTDIR)\ole2disp.res \
+ $(DESTDIR)\ole2disp.lib
+ $(DISPLAY) linking $@...
+ $(LD) $(LFLAGS) $(LNOI) @<<$(DESTDIR)\ole2disp.lnk
+$(DISP_OBJS: = +^
+)
+$(DESTDIR)\ole2disp.dll
+$(DESTDIR)\ole2disp.map,
+libw ldllcew shell compobj ole2 $(DESTDIR)\ole2nls.lib
+$(DISPTARGAPISRC)\ole2disp.def
+<<KEEP
+!if "$(MAPSYM)" != ""
+ $(MAPSYM) $(DESTDIR)\ole2disp.map
+ - copy ole2disp.sym $(DESTDIR)
+ - del ole2disp.sym
+!endif
+ $(RC) $(RCFLAGS) -k -t $(DESTDIR)\ole2disp.res $@
+
+$(DESTDIR)\ole2disp.lib : $(DISPTARGAPISRC)\ole2disp.def
+ $(IMPLIB) $(DESTDIR)\ole2disp.lib $(DISPTARGAPISRC)\ole2disp.def
+ $(LIBRARIAN) $(DESTDIR)\ole2disp.lib +$(DISPTARGAPISRC)\empty.lib;
+ $(LIBRARIAN) $(DESTDIR)\ole2disp.lib -WEP -DLLGETCLASSOBJECT;
+
+#Warning: The following rc.exe we're using has a command line length limitation
+# of 128 characters. So rc the .res file into current directory first
+# and move it over to where it should be
+$(DESTDIR)\ole2disp.res : \
+ $(DISPTARGAPISRC)\ole2disp.rc $(DISPINC)\verstamp.h
+ $(RC) $(RCFLAGS) $(WOWFLAG) -r -foole2disp.res $(DISPTARGAPISRC)\ole2disp.rc
+ copy ole2disp.res $(DESTDIR)
+ del ole2disp.res
+
+
+
+#############################################################################
+#
+# ole2nls.dll (WIN16 build)
+#
+
+ole2nls: setflags $(DESTDIR)\ole2nls.dll $(DESTDIR)\ole2nls.lib
+
+# Note: we cant use /NOI on the following link line, because the
+# object libentry.obj has an extdef for "LibMain" which is actually
+# a pascal function and should be "LIBMAIN".
+#
+$(DESTDIR)\ole2nls.dll : \
+ $(NLS_OBJS) \
+ $(DESTDIR)\ole2nls.res \
+ $(DISPTARGAPISRC)\ole2nls.def
+ $(DISPLAY) linking $@...
+ $(LD) $(LFLAGS) @<<$(DESTDIR)\ole2nls.lnk
+$(NLS_OBJS: = +^
+)
+$(DESTDIR)\ole2nls.dll
+$(DESTDIR)\ole2nls.map
+libw snocrtdw,
+$(DISPTARGAPISRC)\ole2nls.def
+<<KEEP
+!if "$(MAPSYM)" != ""
+ $(MAPSYM) $(DESTDIR)\ole2nls.map
+ - copy ole2nls.sym $(DESTDIR)
+ - del ole2nls.sym
+!endif
+ $(RC) $(RCFLAGS) -k -t $(DESTDIR)\ole2nls.res $@
+
+$(DESTDIR)\ole2nls.lib : $(DISPTARGAPISRC)\ole2nls.def
+ $(IMPLIB) /nowep $(DESTDIR)\ole2nls.lib $(DISPTARGAPISRC)\ole2nls.def
+
+#Warning: The following rc.exe we're using has a command line length limitation
+# of 128 characters. So rc the .res file into current directory first
+# and move it over to where it should be
+$(DESTDIR)\ole2nls.res : $(DISPTARGAPISRC)\ole2nls.$(R) $(DISPINC)\verstamp.h
+ $(RC) $(RCFLAGS) $(WOWFLAG) -r -foole2nls.res $(DISPTARGAPISRC)\ole2nls.rc
+ copy ole2nls.res $(DESTDIR)
+ del ole2nls.res
+
+
+###########################################################################
+#
+# Filespecs to search when building dependencies
+# UNDONE: t-issacl, consider group oledisp\src\dispatch files according
+# their Text Flags like RPC_TEXT.
+#
+
+newdep:
+ if exist $(DESTDIR)\files.dep del $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.cpp >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.c >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.hxx >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.h >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.cxx >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.c >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.hxx >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.h >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.inc >> $(DESTDIR)\files.dep
+ $(SED) -e "/^[ n]/d" -e "s/*//" $(DESTDIR)\files.dep >$(DESTDIR)\files.tmp
+ del $(DESTDIR)\files.dep
+ ren $(DESTDIR)\files.tmp files.dep
+ $(INCLUDES) $(DISPINCFLAGS) $(VBAINC) -f $(DESTDIR)\files.dep -o $(DESTDIR)\depend.mak
+ $(SED) -e "/^[ n]/d" -e "s/*//" $(DESTDIR)\files.dep >$(DESTDIR)\files.tmp
+ del $(DESTDIR)\files.dep
+ ren $(DESTDIR)\files.tmp files.dep
+
+
+#if depend.mak does not exist, create an empty one
+!if [if not exist $(DESTDIR)\depend.mak echo !message REM WARNING: depend.mak empty. >$(DESTDIR)\depend.mak] != 0
+!endif
+
+!include $(DESTDIR)\depend.mak
+
+#
+# Filespecs to search when building dependencies
+#
+###########################################################################
+
+
+###########################################################################
+#
+# Clean up the DESTDIR directory
+#
+
+clean:
+ if exist $(DESTDIR)\*.* del /q $(DESTDIR)\*.*
+ echo.>con
+ echo cleanup done.>con
+
+#
+# Clean up the DESTDIR directory done
+#
+###########################################################################
+
+
+#############################################################################
+#
+# Dependencies
+#
+
+
+###########################
+#
+# OLE2DISP.DLL dependencies
+
+$(DESTDIR)\dispprox.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\dispps.h \
+ $(DISPPATH)\dispprox.cpp
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\dispprox.cpp
+
+$(DESTDIR)\dispstub.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\dispps.h \
+ $(DISPPATH)\dispstub.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\dispstub.cpp
+
+$(DESTDIR)\dispmrsh.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\dispmrsh.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\dispmrsh.cpp
+
+$(DESTDIR)\dispstrm.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\dispstrm.h \
+ $(DISPPATH)\dispstrm.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\dispstrm.cpp
+
+$(DESTDIR)\errinfo.obj : \
+ $(DISPINC)\dispatch.h\
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\errinfo.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPPATH)\errinfo.cpp
+
+$(DESTDIR)\evprox.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\evps.h \
+ $(DISPPATH)\evprox.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\evprox.cpp
+
+$(DESTDIR)\evstub.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\evps.h \
+ $(DISPPATH)\evstub.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\evstub.cpp
+
+$(DESTDIR)\tiprox.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\tips.h \
+ $(DISPPATH)\tiprox.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\tiprox.cpp
+
+$(DESTDIR)\tistub.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\tips.h \
+ $(DISPPATH)\tistub.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\tistub.cpp
+
+$(DESTDIR)\tiutil.obj : \
+ $(DISPINC)\dispatch.h\
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\tiutil.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\tiutil.cpp
+
+$(DESTDIR)\tlprox.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\tlps.h \
+ $(DISPPATH)\tlprox.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC2_TEXT) -c -Fo$@ $(DISPPATH)\tlprox.cpp
+
+$(DESTDIR)\tlstub.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\tlps.h \
+ $(DISPPATH)\tlstub.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC2_TEXT) -c -Fo$@ $(DISPPATH)\tlstub.cpp
+
+$(DESTDIR)\tcprox.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\tcps.h \
+ $(DISPPATH)\tcprox.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC2_TEXT) -c -Fo$@ $(DISPPATH)\tcprox.cpp
+
+$(DESTDIR)\tcstub.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\tcps.h \
+ $(DISPPATH)\tcstub.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC2_TEXT) -c -Fo$@ $(DISPPATH)\tcstub.cpp
+
+$(DESTDIR)\ups.obj : \
+ $(DISPINC)\dispatch.h\
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\ups.h \
+ $(DISPPATH)\ups.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(UPS_TEXT) -c -Fo$@ $(DISPPATH)\ups.cpp
+
+$(DESTDIR)\uvft.obj : \
+ $(DISPINC)\dispatch.h\
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispmrsh.h \
+ $(DISPPATH)\ups.h \
+ $(DISPPATH)\uvft.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(UPS_TEXT) -c -Fo$@ $(DISPPATH)\uvft.cpp
+
+
+$(DESTDIR)\psfactry.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\dispps.h \
+ $(DISPPATH)\evps.h \
+ $(DISPPATH)\tips.h \
+ $(DISPPATH)\psfactry.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\psfactry.cpp
+
+$(DESTDIR)\cdispti.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\cdispti.h \
+ $(DISPPATH)\cdispti.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(STDIMPL_TEXT) -c -Fo$@ $(DISPPATH)\cdispti.cpp
+
+$(DESTDIR)\stddisp.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\stddisp.h \
+ $(DISPPATH)\stddisp.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(STDIMPL_TEXT) -c -Fo$@ $(DISPPATH)\stddisp.cpp
+
+$(DESTDIR)\time-api.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\time-api.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\time-api.cpp
+
+$(DESTDIR)\memory.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\memory.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPPATH)\memory.cpp
+
+$(DESTDIR)\oledisp.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPTARGAPISRC)\oledisp.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPTARGAPISRC)\oledisp.cpp
+
+#Note: Put bstr routines into a separate segment because XL wants to
+# allocate bstr(s) as part of their startup, but they dont want to pull
+# in the entire RT segment.
+#
+$(DESTDIR)\bstr.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\bstr.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(BSTR_TEXT) -c -Fo$@ $(DISPPATH)\bstr.cpp
+
+$(DESTDIR)\sarray.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\sarray.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\sarray.cpp
+
+$(DESTDIR)\oledate.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\oledate.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\oledate.c
+
+$(DESTDIR)\bstrdate.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\bstrdate.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\bstrdate.c
+
+$(DESTDIR)\oavtbl.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\oavtbl.h \
+ $(DISPPATH)\oavtbl.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPPATH)\oavtbl.c
+
+$(DESTDIR)\oaglue.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\oavtbl.h \
+ $(DISPPATH)\oavtbl.c
+ $(DISPLAY) Compiling $@...
+!if "$(DBCFLAGS)" != ""
+# using -Z7 because we don't want to require a PDB file
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(DEFAULT_TEXT) -Z7 -c -Fo$@ $(DISPPATH)\oaglue.c
+!else
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPPATH)\oaglue.c
+!endif
+
+$(DESTDIR)\crtstuff.obj : $(DISPPATH)\oledisp.h $(DISPPATH)\crtstuff.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\crtstuff.c
+
+$(DESTDIR)\asmhelp.obj : $(DISPPATH)\oledisp.h $(DISPPATH)\asmhelp.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\asmhelp.c
+
+
+$(DESTDIR)\invoke.obj : $(DISPTARGAPISRC)\invoke.$(A)
+ $(DISPLAY) Compiling $@...
+ $(AS) $(AFLAGS) -Fo$(DESTDIR)\ -c -Fo$@ $(DISPTARGAPISRC)\invoke.$(A)
+
+
+$(DESTDIR)\oleconva.obj : $(DISPTARGAPISRC)\oleconva.$(A)
+ $(DISPLAY) Compiling $@...
+ $(AS) $(AFLAGS) -Fo$(DESTDIR)\ -c -Fo$@ $(DISPTARGAPISRC)\oleconva.$(A)
+
+$(DESTDIR)\variant.obj : \
+ $(DISPINC)\variant.h \
+ $(DISPINC)\dispatch.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\variant.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\variant.cpp
+
+$(DESTDIR)\convertt.obj : \
+ $(DISPINC)\variant.h \
+ $(DISPINC)\dispatch.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\convert.cpp
+ $(DISPLAY) Compiling $@ $(DISPPATH)\convert.cpp to $(DESTDIR)\convertt.obj
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RUNTIME_TEXT) -c -Fo$(DESTDIR)\convertt.obj $(DISPPATH)\convert.cpp
+
+$(DESTDIR)\nlshelp.obj : \
+ $(DISPINC)\variant.h \
+ $(DISPINC)\dispatch.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\nlshelp.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\nlshelp.cpp
+
+$(DESTDIR)\invhelp.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\invhelp.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(STDIMPL_TEXT) -c -Fo$@ $(DISPPATH)\invhelp.cpp
+
+$(DESTDIR)\disphelp.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\disphelp.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(RUNTIME_TEXT) -c -Fo$@ $(DISPPATH)\disphelp.cpp
+
+$(DESTDIR)\getobj.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\getobj.cpp
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPPATH)\getobj.cpp
+
+$(DESTDIR)\tables.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\tables.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(RPC_TEXT) -c -Fo$@ $(DISPPATH)\tables.c
+
+$(DESTDIR)\dispiid.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\dispiid.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPPATH)\dispiid.c
+
+$(DESTDIR)\clsid.obj : $(DISPPATH)\clsid.h $(DISPPATH)\clsid.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPPATH)\clsid.c
+
+$(DESTDIR)\oleguids.obj : $(DISPPATH)\oleguids.h $(DISPPATH)\oleguids.c
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(DISPCFLAGS) $(DEFAULT_TEXT) -c -Fo$@ $(DISPPATH)\oleguids.c
+
+$(DESTDIR)\validat.obj : \
+ $(DISPINC)\dispatch.h \
+ $(DISPINC)\variant.h \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\validate.cpp
+ $(DISPLAY) Compiling $(DISPPATH)\validate.cpp to $(DESTDIR)\validat.obj
+ $(CCPP) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(DEBUG_TEXT) -c -Fo$(DESTDIR)\validat.obj $(DISPPATH)\validate.cpp
+
+$(DESTDIR)\assert.obj : \
+ $(DISPPATH)\oledisp.h \
+ $(DISPPATH)\assert.cpp
+ $(DISPLAY) Compiling $@...
+ $(CCPP) $(DISPCLFLAGS) $(DISPCPPFLAGS) $(DEBUG_TEXT) -c -Fo$@ $(DISPPATH)\assert.cpp
+
+
+
+##########################
+#
+# OLE2NLS.DLL dependencies
+
+
+$(DESTDIR)\validato.obj : $(DISPPATH)\oledisp.h $(DISPPATH)\validate.cpp
+ $(DISPLAY) Compiling $(DISPPATH)\validate.cpp to $(DESTDIR)\validato.obj
+ $(CCPP) $(DISPCLFLAGS) $(NLSCFLAGS) $(DEBUG_TEXT) -c -Fo$(DESTDIR)\validato.obj $(DISPPATH)\validate.cpp
+
+$(DESTDIR)\asserto.obj : $(DISPPATH)\oledisp.h $(DISPPATH)\assert.cpp
+ $(DISPLAY) Compiling $(DISPPATH)\assert.cpp to $(DESTDIR)\asserto.obj
+ $(CCPP) $(DISPCLFLAGS) $(NLSCFLAGS) $(DEBUG_TEXT) -c -Fo$(DESTDIR)\asserto.obj $(DISPPATH)\assert.cpp
+
+$(DESTDIR)\nlsapi.obj : $(DISPPATH)\nlsapi.c $(DISPPATH)\oledisp.h $(DISPINC)\olenls.h $(DISPPATH)\nlsintrn.h
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(NLSCFLAGS) -c -Fo$@ $(DISPPATH)\nlsapi.c
+
+$(DESTDIR)\string.obj : $(DISPPATH)\string.c $(DISPPATH)\oledisp.h $(DISPINC)\olenls.h $(DISPPATH)\nlsintrn.h
+ $(DISPLAY) Compiling $@...
+ $(CC) $(DISPCLFLAGS) $(NLSCFLAGS) -c -Fo$@ $(DISPPATH)\string.c
+
+##########################
+#
+# Special build rule for VBA ole objects
+
+$(DESTDIR)\dassert.obj : $(TYPELIBPATH)\dassert.c
+ $(DISPLAY) Compiling $@...
+ $(VBACL) $(OLECLFLAGS) $(CLBROWSE) -Fo$@ $(BROWSEFLAGS) $(TYPELIBPATH)\dassert.c
diff --git a/private/oleauto/build/win32.mak b/private/oleauto/build/win32.mak
new file mode 100644
index 000000000..0d6365ae9
--- /dev/null
+++ b/private/oleauto/build/win32.mak
@@ -0,0 +1,758 @@
+###########################################################################
+#
+# (c) Copyright Microsoft Corp. 1994 All Rights Reserved
+#
+# File:
+#
+# win32.mak
+#
+# Purpose:
+#
+# makefile for WIN32 (NT, MIPS, ALPHA, PPC) oledisp and typelib build
+# it also !includes mktyplib.mak for mktyplib.exe build.
+#
+#
+# Description:
+#
+# Usage: use make.bat to set required variabled and invoke this makefile
+#
+# Options:
+#
+# the caller should supply the following
+# DESTDIR = [dwin32, rwin32] ;where .obj, .lib, .dll ... will be
+# TARG = [WIN16,WIN32,MIPS,ALPHA,PPC,MAC,MACPPC] ;useful if we want to combin win16.mak, win32.mak and macppc.mak together
+# TARGCPU = [i386,MIPS,ALPHA,PPC]
+# TARGCPUDEF = [_X86_,_MIPS_,_ALPHA_,_PPC_]
+# WOW
+# PCODE
+# DEBUG = [D,R] ;control debug or retail build
+#
+#
+# Environment:
+#
+# OLEPROG, HOST must be set
+# OLEPROG ;the root directory of this project
+# HOST = [WIN32,MIPS,ALPHA,PPC] ;build host
+#
+# if LOCALBUILD==TRUE, VBATOOLS must be set. All tools, incs
+# and libs will come from this directory.
+#
+# if LOCALBUILD==FLASE, _NTBINDIR must be set, and it is assumed to have
+# the following 2 sub direcotry:
+# _NTBINDIR
+# |_____mstools where rc.exe will be
+# |_____public\sdk where the \inc and \lib will be
+#
+# Revision History:
+#
+# [00] 02-Aug-94 t-issacl: Created
+#
+###########################################################################
+
+
+PATHSAVE = $(PATH) # old path is saved in PATHSAVE
+
+
+###########################################################################
+#
+# Switch validity checking start
+#
+!if "$(HOST)"!="WIN32" && "$(HOST)"!="MIPS" && "$(HOST)"!="ALPHA" && "$(HOST)"!="PPC"
+!error ERROR: Invalid HOST $(HOST)! Must be one of (WIN32, MIPS, ALPHA, PPC)
+!endif
+
+!if "$(TARG)"!="WIN32" && "$(TARG)"!="MIPS" && "$(TARG)"!="ALPHA" && "$(TARG)"!="PPC"
+!error ERROR: Invalid TARG $(TARG)! Must be one of (WIN32, MIPS, ALPHA, PPC)
+!endif
+
+!if "$(TARGCPU)"!="i386" && "$(TARGCPU)"!="MIPS" && "$(TARGCPU)"!="ALPHA" && "$(TARGCPU)"!="PPC"
+!error ERROR: Invalid TARGCPU $(TARGCPU)! Must be one of (i386, MIPS, ALPHA, PPC)
+!endif
+
+!if "$(TARGCPUDEF)"!="_X86_" && "$(TARGCPUDEF)"!="_MIPS_" && "$(TARGCPUDEF)"!="_ALPHA_" && "$(TARGCPUDEF)"!="_PPC_"
+!error ERROR: Invalid TARGCPUDEF $(TARGCPUDEF)! Must be one of (_X86_, _MIPS_, _ALPHA_, _PPC_)
+!endif
+
+!if "$(DEBUG)"!="D" && "$(DEBUG)"!="R"
+!error ERROR: Invalid DEBUG type $(DEBUG)! Must be one of (D, R)
+!endif
+
+!if "$(LOCALBUILD)"=="TRUE"
+!if "$(VBATOOLS)"==""
+!error ERROR: VBATOOLS must be set $(VBATOOLS)
+!endif
+!elseif "$(LOCALBUILD)"=="FALSE"
+!if "$(_NTBINDIR)"==""
+!error ERROR: _NTBINDIR must be set $(_NTBINDIR)!
+!endif
+!else
+!error ERROR: Invalid LOCALBUILD type $(LOCALBUILD)! Must be one of (TRUE, FALSE)
+!endif
+#
+# Switch validity checking ends
+#
+###########################################################################
+
+
+###########################################################################
+#
+# directory, flags and tools settting
+#
+
+TARGAPI = WIN32
+
+###########################################################################
+# set up directories and files
+#
+
+DISPPATH = $(OLEPROG)\src\dispatch
+OLEAUTOINC = $(OLEPROG)\src\inc
+DISPTARGAPISRC = $(DISPPATH)\$(TARGAPI)
+DISPTARGCPUSRC = $(DISPPATH)\$(TARGAPI)\$(TARGCPU)
+TYPELIBPATH = $(OLEPROG)\src\typelib
+
+
+!if "$(LOCALBUILD)"=="TRUE"
+OLE2INCTARG = $(OLEPROG)\ole\win32
+TARGDIR = $(VBATOOLS)\$(HOST)\$(HOST) # c:\vbatools\[host]\[host]
+TARGBIN = $(TARGDIR)\BIN # c:\vbatools\[host]\[host]\bin
+TARGLIB = $(TARGDIR)\LIB # c:\vbatools\[host]\[host]\lib
+TARGINC = $(VBATOOLS)\win32\win32\inc # always use win32 headers
+!if "$(TARG)"=="MIPS"
+#copied from vba.mak
+#UNDONE : t-marioc Temporary till MIPS and NT SDK have same headers again
+#UNDONE : t-marioc at present mips uses the c9 compiler not the sdk
+TARGINC = $(VBATOOLS)\mips\mips\inc
+!endif
+!else
+TARGBIN = $(_NTBINDIR)\MSTOOLS
+TARGLIB = $(_NTBINDIR)\public\sdk\LIB;$(_NTBINDIR)\public\sdk\lib\$(TARGCPU)
+TARGINC = $(_NTBINDIR)\public\sdk\inc -I$(_NTBINDIR)\public\sdk\inc\crt -I$(_NTBINDIR)\public\sdk\inc\crt\sys; # use NT build headers
+!endif #LOCALBUILD
+
+#####
+# Create build directories if not already present
+# (the '!if []' notation executes the command during the NMAKE pre-
+# processor, so these are not emitted into the output batch file)
+#####
+
+!if [if not exist $(DESTDIR)\*.* mkdir $(DESTDIR)] != 0
+!endif
+
+!if "$(TARG)" == "WIN32"
+!if [if not exist $(DESTDIR)\chicago\*.* mkdir $(DESTDIR)\chicago] != 0
+!endif
+!endif
+
+
+###########################################################################
+# set up flags
+#
+
+OLE_UNICODE_SWITCH=-DFV_UNICODE_OLE=1 #as in vba.mak
+!message REM Setting FV_UNICODE_OLE to "$(FV_UNICODE_OLE)"
+
+#
+# flags mostly for ole2disp build
+#
+
+!if "$(LOCALBUILD)"=="TRUE"
+LOCALFLAGS = -D_NTSDK
+!else
+LOCALFLAGS =
+!endif #LOCALBUILD
+
+A = asm
+DISPCFLAGS = -Fd$(DESTDIR)\ole2disp.pdb
+DISPCPPFLAGS = -Fd$(DESTDIR)\ole2disp.pdb
+!if ("$(TARG)" == "ALPHA" || "$(TARG)" == "MIPS" || "$(TARG)" == "PPC")
+A = s
+DISPCFLAGS =
+DISPCPPFLAGS =
+!endif #TARG
+
+!if "$(TARG)" == "WIN32"
+AFLAGS = -nologo -Cx -coff -Zi -DVBA2=1
+!endif
+!if "$(TARG)" == "MIPS"
+!if "$(LOCALBUILD)"=="TRUE"
+AFLAGS = -I$(VBATOOLS)\win32\win32\inc -D_MIPS_=1 -D_LANGUAGE_ASSEMBLY -DVBA2=1
+!else
+AFLAGS = -I$(TARGINC) -D_MIPS_=1 -D_LANGUAGE_ASSEMBLY -DVBA2=1
+!endif #LOCALBUILD
+!endif
+!if "$(TARG)" == "ALPHA"
+AFLAGS = -std -D_ALPHA_=1 -D_LANGUAGE_ASSEMBLY -DVBA2=1
+!endif
+!if "$(TARG)" == "PPC"
+AFLAGS = -I$(_NTBINDIR)\public\sdk\inc -I$(_NTBINDIR)\public\sdk\inc\crt -D_PPC_=1 -D_LANGUAGE_ASSEMBLY -DVBA2=1
+!endif
+
+!if "$(DEBUG)" == "D"
+!if "$(TARG)" == "WIN32"
+DBAFLAGS = -Zi
+!else
+DBAFLAGS = -O -g0 -G0
+!endif
+!else
+DBAFLAGS =
+!endif
+
+# global assembler flags
+AFLAGS = $(AFLAGS) $(DBAFLAGS)
+
+WARN = -W3 -WX
+!if ("$(TARG)" == "ALPHA" || "$(TARG)" == "PPC")
+#UNDONE: turn on -WX for these builds, too.
+WARN = -W3
+!endif
+
+!if ("$(TARG)" == "WIN32")
+LEGOFLAGS = -Bbb1
+!endif
+
+
+!if "$(DEBUG)"=="R"
+!if "$(TARG)"=="WIN32"
+DISPCLFLAGS = $(WARN) $(LEGOFLAGS) $(LOCALFLAGS) -DWIN32 -DINC_OLE2 -D_DLL -D_MT -D_X86_=1 -G3 -Z7 -Oxa -Gy -DVBA2=1 -DID_DEBUG=0
+!elseif "$(TARG)"=="ALPHA"
+DISPCLFLAGS = $(WARN) $(LEGOFLAGS) -DWIN32 -DINC_OLE2 -D_DLL -D_MT -DUNICODE -D_ALPHA_=1 -QAieee1 -Ox -DVBA2=1 -DID_DEBUG=0
+!elseif "$(TARG)"=="MIPS"
+DISPCLFLAGS = $(WARN) $(LEGOFLAGS) -DWIN32 -DINC_OLE2 -D_DLL -D_MT -DUNICODE -D_MIPS_=1 -Oxa -Gy -DVBA2=1 -DID_DEBUG=0
+!elseif "$(TARG)"=="PPC"
+DISPCLFLAGS = $(WARN) $(LEGOFLAGS) -DWIN32 -DINC_OLE2 -D_DLL -D_MT -DUNICODE -D_PPC_=1 -Oxa -Gy -DVBA2=1 -DID_DEBUG=0
+!endif
+!else #DEBUG==R
+!if "$(TARG)"=="WIN32"
+DISPCLFLAGS = $(WARN) $(LEGOFLAGS) $(LOCALFLAGS) -DWIN32 -DINC_OLE2 -D_DLL -D_MT -D_X86_=1 -G3 -D_DEBUG -Od -Zi -Z7 -DVBA2=1 -DID_DEBUG=1
+!elseif "$(TARG)"=="ALPHA"
+DISPCLFLAGS = $(WARN) $(LEGOFLAGS) -DWIN32 -DINC_OLE2 -D_DLL -D_MT -DUNICODE -D_ALPHA_=1 -QAieee1 -D_DEBUG -Od -Zi -Z7 -DVBA2=1 -DID_DEBUG=1
+!elseif "$(TARG)"=="MIPS"
+DISPCLFLAGS = $(WARN) $(LEGOFLAGS) -DWIN32 -DINC_OLE2 -D_DLL -D_MT -DUNICODE -D_MIPS_=1 -D_DEBUG -Od -Zi -Z7 -DVBA2=1 -DID_DEBUG=1
+!elseif "$(TARG)"=="PPC"
+DISPCLFLAGS = $(WARN) $(LEGOFLAGS) -DWIN32 -DINC_OLE2 -D_DLL -D_MT -DUNICODE -D_PPC_=1 -D_DEBUG -Od -Z7 -DVBA2=1 -DID_DEBUG=1
+!endif
+!endif #DEBUG==R
+
+!if "$(LOCALBUILD)"=="TRUE"
+DISPINCFLAGS = -I$(DISPPATH) -I$(OLEAUTOINC) -I$(OLE2INCTARG) -I$(TARGINC)
+!else
+DISPINCFLAGS = -I$(DISPPATH) -I$(TARGINC) -I$(OLEAUTOINC)
+!endif #LOCALBUILD
+
+#for oleconva.$(A) use
+RUNTIME_TEXT =
+
+#
+# Other flags mostly for oleaut32.dll build
+#
+
+!if "$(LOCALBUILD)"=="TRUE"
+OLEINCS = -I$(TYPELIBPATH) -I$(OLEAUTOINC) \
+ -I$(OLE2INCTARG) -I$(TARGINC)
+!else
+OLEINCS = -I$(TYPELIBPATH) -I$(TARGINC) -I$(OLEAUTOINC)
+!endif #LOCALBUILD
+
+#RCINC==OLEINCS
+!if "$(LOCALBUILD)"=="TRUE"
+RCINCS = -I$(TYPELIBPATH) -I$(OLEAUTOINC) \
+ -I$(OLE2INCTARG) -I$(VBATOOLS)\win32\win32\inc
+!else
+RCINCS = -I$(TYPELIBPATH) -I$(TARGINC) -I$(OLEAUTOINC)
+!endif #LOCALBUILD
+
+!if "$(DEBUG)"=="D"
+OLECLFLAGS = -c -D$(TARGCPUDEF)=1 $(OLE_UNICODE_SWITCH) $(WARN) $(LEGOFLAGS) -Od -Gd -Z7 -DWIN32 $(LOCALFLAGS) $(OLEINCS) -DConst=const -DOSDEBUG -DID_DEBUG=1
+!else
+OLECLFLAGS = -c $(WARN) $(LEGOFLAGS) $(OLE_UNICODE_SWITCH) -Gd -Oxsw -D$(TARGCPUDEF)=1 -Z7 -DWIN32 $(LOCALFLAGS) -DConst=const $(OLEINCS) -DOSDEBUG -DID_DEBUG=0
+!endif
+
+!if "$(TARG)"=="ALPHA"
+OLECLFLAGS = $(OLECLFLAGS) -QAieee1
+!endif
+
+#CLBROWSE = /Zn /Fr$*.sbr, default set to nobrowse
+CLBROWSE =
+
+PCHOLE = -Yu -DRTPCHNAME=\"$(DESTDIR)\typelib.pch\" #from vba.mak
+
+!if "$(DEBUG)"=="R"
+RCFLAGS = -R -X $(RCINCS) -DWIN32 -DID_DEBUG=0
+!else
+RCFLAGS = -R -X $(RCINCS) -DWIN32 -DID_DEBUG=1
+!endif #debug
+
+LINK32DEBFLAGS = -debug:mapped,full -debugtype:cv,fixup -opt:ref
+
+
+###########################################################################
+# set up tools
+#
+
+DISPLAY = echo >con
+FILELIST = $(OLEPROG)\bin\$(HOST)\ls -1F
+INCLUDES = $(OLEPROG)\bin\$(HOST)\includes.exe
+SED = $(OLEPROG)\bin\$(HOST)\sed.exe
+!if "$(LOCALBUILD)"=="TRUE"
+VBAMAPSYM = REM
+!else
+VBAMAPSYM = mapsympe.exe
+!endif
+
+RC = rc.exe
+IMPLIB = link -lib
+
+!if "$(TARG)"=="WIN32"
+AS = ml
+!if "$(LOCALBUILD)"=="TRUE"
+CL = cl.exe
+!else
+CL = cl386.exe
+!endif
+ML = ml.exe
+LINK = link.exe -incremental:NO -pdb:none
+LIBTOOL = link.exe -lib
+!elseif "$(TARG)"=="ALPHA"
+AS = acc
+CL = claxp.exe
+ML = acc.exe
+LINK = link32.exe
+LIBTOOL = link32.exe -lib
+# [Note: Mips assembler must be executed with simple filename.]
+!elseif "$(TARG)"=="MIPS"
+AS = cl
+CL = cl.exe
+ML = cc.exe
+LINK = link.exe -Incremental:NO -Pdb:NONE
+LIBTOOL = link.exe -lib
+!elseif "$(TARG)"=="PPC"
+AS = pas
+CL = mcl.exe
+ML = mcl.exe
+LINK = link.exe -Incremental:NO -Pdb:NONE
+LIBTOOL = link.exe -lib
+!endif #WIN32
+
+#
+#Tools and Variables setting end
+#
+###########################################################################
+
+
+
+###########################################################################
+#
+# Default Build rules start
+#
+{$(DISPPATH)}.c{$(DESTDIR)}.obj:
+ @$(DISPLAY) Compiling $<...
+ $(CL) $(DISPCFLAGS) $(DISPCLFLAGS) $(DISPINCFLAGS) -c -Fo$@ $<
+
+{$(DISPPATH)}.cpp{$(DESTDIR)}.obj:
+ @$(DISPLAY) Compiling $<...
+ $(CL) $(DISPCPPFLAGS) $(DISPCLFLAGS) $(DISPINCFLAGS) -c -Fo$@ $<
+
+{$(DISPPATH)}.asm{$(DESTDIR)}.obj:
+ @$(DISPLAY) Compiling $<...
+ $(ML) $(AFLAGS) $(DISPINCFLAGS) -Fo$(DESTDIR)\ -c $<
+
+{$(TYPELIBPATH)}.cxx{$(DESTDIR)}.obj:
+ $(DISPLAY) Compiling $<...
+ $(CL) -DOLEBLD $(OLECLFLAGS) $(CLBROWSE) $(PCHOLE) -Fo$@ $<
+
+{$(TYPELIBPATH)}.c{$(DESTDIR)}.obj:
+ $(DISPLAY) Compiling $<...
+ $(CL) -DOLEBLD $(OLECLFLAGS) $(CLBROWSE) -Fo$@ $<
+
+{$(TYPELIBPATH)}.rc{$(DESTDIR)}.res:
+ $(DISPLAY) Compiling $<...
+!if "$(CHARSIZE)"=="D"
+ $(RC) $(RCFLAGS) -Fo$@ -DFV_DBCS $<
+!else
+ $(RC) $(RCFLAGS) -Fo$@ $<
+!endif
+
+
+#
+#Default Build rules ends
+#
+###########################################################################
+
+
+
+
+###########################################################################
+#
+#Targets start
+#
+
+TLB_NAME=oleaut32
+
+TLB_IMPLIB = $(DESTDIR)\$(TLB_NAME).lib # Import Lib for TypeLib
+TLB_DLL=$(DESTDIR)\$(TLB_NAME).dll
+
+!if "$(TARG)"=="WIN32"
+TLB_CHICAGO=$(DESTDIR)\chicago\$(TLB_NAME).dll
+!endif
+
+all: setpath \
+ TypeLibTarget \
+ mktyplib \
+ stdole \
+ resetpath
+
+!include $(OLEPROG)\build\mktyplib.mak
+
+TLBTARGET=\
+ $(TLB_DLL) \
+ $(TLB_IMPLIB) \
+!if "$(TARG)"=="WIN32"
+ $(TLB_CHICAGO) \
+!endif
+
+
+TypeLibTarget: $(TLBTARGET)
+
+
+setpath:
+ set PATH=$(TARGBIN)
+
+resetpath:
+ set PATH=$(PATHSAVE)
+
+#
+#Targets ends
+#
+###########################################################################
+
+
+
+###########################################################################
+#
+#TypeLib import library and $(TLB_NAME).dll start
+#
+
+#notice that validat.obj and convertt.obj in the next section.
+#currently we have all the .obj files in one dir and it happened
+#that we have two validate.obj and convert.obj.
+#right now just changed the name. It might be better to put .obj
+#into different dir though.
+
+!if "$(DEBUG)" == "D"
+DISPDB_OBJS = \
+ $(DESTDIR)\validat.obj \
+ $(DESTDIR)\assert.obj
+!else
+DISPDB_OBJS =
+!endif
+
+
+OLEDISP_OBJS = \
+ $(DISPDB_OBJS) \
+ $(DESTDIR)\oledisp.obj \
+ $(DESTDIR)\psfactry.obj \
+ $(DESTDIR)\dispmrsh.obj \
+ $(DESTDIR)\dispprox.obj \
+ $(DESTDIR)\dispstub.obj \
+ $(DESTDIR)\evprox.obj \
+ $(DESTDIR)\evstub.obj \
+ $(DESTDIR)\tiprox.obj \
+ $(DESTDIR)\tistub.obj \
+ $(DESTDIR)\errinfo.obj \
+ $(DESTDIR)\tiutil.obj \
+ $(DESTDIR)\tlprox.obj \
+ $(DESTDIR)\tlstub.obj \
+ $(DESTDIR)\tcprox.obj \
+ $(DESTDIR)\tcstub.obj \
+ $(DESTDIR)\ups.obj \
+ $(DESTDIR)\uvft.obj \
+ $(DESTDIR)\dispstrm.obj \
+ $(DESTDIR)\disphelp.obj \
+ $(DESTDIR)\invhelp.obj \
+ $(DESTDIR)\invoke.obj \
+ $(DESTDIR)\cdispti.obj \
+ $(DESTDIR)\stddisp.obj \
+ $(DESTDIR)\time-api.obj \
+ $(DESTDIR)\bstr.obj \
+ $(DESTDIR)\sarray.obj \
+ $(DESTDIR)\oledate.obj \
+ $(DESTDIR)\crtstuff.obj \
+ $(DESTDIR)\bstrdate.obj \
+ $(DESTDIR)\asmhelp.obj \
+ $(DESTDIR)\oleconva.obj \
+ $(DESTDIR)\variant.obj \
+ $(DESTDIR)\convertt.obj \
+ $(DESTDIR)\nlshelp.obj \
+ $(DESTDIR)\getobj.obj \
+ $(DESTDIR)\tables.obj \
+ $(DESTDIR)\clsid.obj
+
+TYPELIB_OBJS = \
+ $(DESTDIR)\debug2.obj \
+ $(DESTDIR)\blkmgr.obj \
+ $(DESTDIR)\dassert.obj \
+ $(DESTDIR)\fstream.obj \
+ $(DESTDIR)\mem.obj $(DESTDIR)\sheapmgr.obj \
+ $(DESTDIR)\tlibutil.obj \
+ $(DESTDIR)\ntstring.obj \
+ $(DESTDIR)\tlibguid.obj \
+ $(DESTDIR)\obguid.obj \
+ $(DESTDIR)\mbstring.obj \
+ $(DESTDIR)\gdtinfo.obj $(DESTDIR)\gdtrt.obj \
+ $(DESTDIR)\stltinfo.obj $(DESTDIR)\nammgr.obj \
+ $(DESTDIR)\gtlibole.obj \
+ $(DESTDIR)\dfstream.obj \
+ $(DESTDIR)\oletmgr.obj $(DESTDIR)\impmgr.obj \
+ $(DESTDIR)\errmap.obj \
+ $(DESTDIR)\clutil.obj $(DESTDIR)\oautil.obj \
+ $(DESTDIR)\tdata1.obj \
+ $(DESTDIR)\tdata2.obj $(DESTDIR)\dtmbrs.obj \
+ $(DESTDIR)\entrymgr.obj $(DESTDIR)\dtbind.obj \
+ $(DESTDIR)\dfntbind.obj $(DESTDIR)\dbindtbl.obj \
+ $(DESTDIR)\gbindtbl.obj $(DESTDIR)\dstrmgr.obj \
+ $(DESTDIR)\gptbind.obj $(DESTDIR)\dfntcomp.obj \
+ $(DESTDIR)\convert.obj \
+ $(DESTDIR)\gtlibstg.obj
+
+
+$(DESTDIR)\dassert.obj : $(TYPELIBPATH)\dassert.c
+ $(DISPLAY) Compiling $@
+ $(CL) $(OLECLFLAGS) $(CLBROWSE) -Fo$@ $(BROWSEFLAGS) $(TYPELIBPATH)\dassert.c
+
+OLEAUTDLL_OBJS = $(OLEDISP_OBJS) $(TYPELIB_OBJS)
+
+!if "$(TARG)"=="WIN32"
+!if "$(LOCALBUILD)"=="TRUE"
+TYPELIBDLL_LIBS=$(OLEPROG)\ole\win32\i386\ole32.lib $(OLEPROG)\ole\win32\i386\uuid.lib
+!else
+TYPELIBDLL_LIBS=$(_NTBINDIR)\public\sdk\lib\i386\ole32.lib $(_NTBINDIR)\public\sdk\lib\i386\uuid.lib
+!endif #LOCALBUILD
+!else #TARG
+!if "$(LOCALBUILD)"=="TRUE"
+TYPELIBDLL_LIBS=$(OLEPROG)\ole\win32\$(TARG)\ole32.lib $(OLEPROG)\ole\win32\$(TARG)\uuid.lib
+!else
+TYPELIBDLL_LIBS=$(_NTBINDIR)\public\sdk\lib\$(TARG)\ole32.lib $(_NTBINDIR)\public\sdk\lib\$(TARG)\uuid.lib
+!endif #LOCALBUILD
+!endif #TARG
+
+$(TYPELIB_OBJS): $(DESTDIR)\tlibpch.obj
+
+$(DESTDIR)\tlibpch.obj: $(TYPELIBPATH)\tlibpch.cxx
+ $(DISPLAY) Compiling pre-compiled header $@
+ $(CL) $(CLBROWSE) $(OLECLFLAGS) -DOLEBLD -Yc -DRTPCHNAME=\"$(DESTDIR)\typelib.pch\" -Fo$@ $(TYPELIBPATH)\tlibpch.cxx
+
+
+
+#
+# Next Section:
+#
+TYPELIBDLL_DEF =$(DESTDIR)\$(TLB_NAME).def
+TYPELIBDLL_RSRC=$(DESTDIR)\$(TLB_NAME).res
+#add explicit dependencies on files included by typelib.rc
+$(TYPELIBPATH)\$(TLB_NAME).rc : $(TYPELIBPATH)\obwin.hxx $(OLEAUTOINC)\verstamp.h
+
+$(TYPELIBDLL_DEF): $(TYPELIBPATH)\$(TLB_NAME).def $(TYPELIBPATH)\switches.hxx $(TYPELIBPATH)\version.hxx
+ $(DISPLAY) Creating $@...
+!if "$(DEBUG)"=="D"
+ $(CL) -D$(TARGCPUDEF)=1 /EP /c -DWIN32 -DID_DEBUG=1 /I$(TYPELIBPATH) /I$(DESTDIR) /Tc$(TYPELIBPATH)\$(TLB_NAME).def > $(DESTDIR)\$(TLB_NAME).def
+!else
+ $(CL) -D$(TARGCPUDEF)=1 /EP /c -DWIN32 -DID_DEBUG=0 /I$(TYPELIBPATH) /I$(DESTDIR) /Tc$(TYPELIBPATH)\$(TLB_NAME).def > $(DESTDIR)\$(TLB_NAME).def
+!endif
+
+#####
+# TypeLib Import Lib -- All platforms
+#####
+
+$(TLB_IMPLIB): $(TYPELIBDLL_DEF) $(OLEAUTDLL_OBJS)
+ $(DISPLAY) Building import library $@...
+ $(LIBTOOL) -machine:$(TARGCPU) -out:$@ -def:$(TYPELIBDLL_DEF) @<<$(DESTDIR)\tlbimp.lrf
+$(OLEAUTDLL_OBJS: =^
+) $(DESTDIR)\tlibpch.obj
+$(TYPELIBDLL_LIBS)
+<<KEEP
+
+
+
+#####
+# $(TLB_NAME).dll
+#####
+
+#
+# Build Win32 DLL:
+#
+$(TLB_DLL): $(OLEAUTDLL_OBJS) $(TYPELIBDLL_LIBS) $(TYPELIBDLL_RSRC) $(TLB_IMPLIB)
+ $(DISPLAY) Linking $@...
+ if exist $@ del $@
+ set LIB=$(TARGLIB)
+ cvtres.exe -r -$(TARGCPU) -o $(DESTDIR)\_resfile.rbj $(TYPELIBDLL_RSRC)
+ $(LINK) @<<$(DESTDIR)\$(TLB_NAME).lrf
+-machine:$(TARGCPU) -subsystem:windows -dll
+!if "$(TARG)"=="MIPS" || "$(TARG)"=="ALPHA" || "$(TARG)"=="PPC"
+-entry:_DllMainCRTStartup
+!else
+-entry:_DllMainCRTStartup@12
+!endif
+$(LINK32DEBFLAGS)
+-release
+-map:$(DESTDIR)\$(TLB_NAME).map -nodefaultlib
+-out:$@
+$(OLEAUTDLL_OBJS: =^
+) $(DESTDIR)\tlibpch.obj
+$(DESTDIR)\$(TLB_NAME).exp
+$(DESTDIR)\_resfile.rbj
+!if "$(HOST)" == "WIN32" || "$(HOST)" == "MIPS"
+$(OLEPROG)\tools\$(HOST)\lib\oldnames.lib
+!endif #HOST==WIN32
+$(TYPELIBDLL_LIBS)
+gdi32.lib user32.lib
+crtdll.lib
+kernel32.lib advapi32.lib mpr.lib
+<<KEEP
+ set LIB=
+!if "$(TARGCPU)"=="i386"
+ $(VBAMAPSYM) -n -o $(DESTDIR)\$(TLB_NAME).sym $(DESTDIR)\$(TLB_NAME).map
+!endif
+
+#
+#TypeLib import library and $(TLB_NAME).dll end
+#
+###########################################################################
+
+
+!if "$(TARG)"=="WIN32"
+###########################################################################
+#
+# Chicago-specific stuff start
+#
+$(TLB_CHICAGO): $(TLB_DLL)
+ $(DISPLAY) Splitting apart $@ for Chicago drop...
+ copy $(TLB_DLL) $(TLB_CHICAGO)
+ $(OLEPROG)\tools\win32\splitsym -a $(TLB_CHICAGO)
+
+#
+# Chicago end
+#
+!endif
+
+###########################################################################
+#
+# Filespecs to search when building dependencies
+#
+
+newdep:
+ if exist $(DESTDIR)\files.dep del $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPPATH)\*.cpp >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPPATH)\*.c >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPPATH)\*.h >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPPATH)\*.hxx >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.cpp >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.c >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.hxx >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.h >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGCPUSRC)\*.cpp >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGCPUSRC)\*.c >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGCPUSRC)\*.hxx >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGCPUSRC)\*.h >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.cxx >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.c >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.hxx >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.h >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.inc >> $(DESTDIR)\files.dep
+!if "$(TARG)"=="WIN32"
+ $(FILELIST) $(DISPPATH)\*.asm >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.asm >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGCPUSRC)\*.asm >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.asm >> $(DESTDIR)\files.dep
+!else
+ $(FILELIST) $(DISPPATH)\*.s >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGAPISRC)\*.s >> $(DESTDIR)\files.dep
+ $(FILELIST) $(DISPTARGCPUSRC)\*.s >> $(DESTDIR)\files.dep
+ $(FILELIST) $(TYPELIBPATH)\*.s >> $(DESTDIR)\files.dep
+!endif
+ $(SED) -e "/^[ n]/d" -e "s/*//" $(DESTDIR)\files.dep >$(DESTDIR)\files.tmp
+ del $(DESTDIR)\files.dep
+ ren $(DESTDIR)\files.tmp files.dep
+ $(INCLUDES) $(DISPINCFLAGS) $(OLEINCS) -f $(DESTDIR)\files.dep -o $(DESTDIR)\depend.mak
+ $(SED) -e "/^[ n]/d" -e "s/*//" $(DESTDIR)\files.dep >$(DESTDIR)\files.tmp
+ del $(DESTDIR)\files.dep
+ ren $(DESTDIR)\files.tmp files.dep
+
+
+#if depend.mak does not exist, create an empty one
+!if [if not exist $(DESTDIR)\depend.mak echo !message REM WARNING: depend.mak empty. >$(DESTDIR)\depend.mak] != 0
+!endif
+
+!include $(DESTDIR)\depend.mak
+
+#
+# Filespecs to search when building dependencies
+#
+###########################################################################
+
+
+###########################################################################
+#
+# Clean up the DESTDIR directory
+#
+
+clean:
+ if exist $(DESTDIR)\*.* del /q $(DESTDIR)\*.*
+ echo.>con
+ echo cleanup done.>con
+
+#
+# Clean up the DESTDIR directory done
+#
+###########################################################################
+
+
+#############################################################################
+#
+# Dependencies and special build rules
+#
+
+$(DESTDIR)\invoke.obj : $(DISPTARGCPUSRC)\invoke.$(A)
+!if ("$(TARG)" == "MIPS")
+ @$(DISPLAY) Compiling $(DISPTARGCPUSRC)\invoke.$(A)...
+ $(AS) $(AFLAGS) $(DISPINCFLAGS) -Fo$(DESTDIR)\invoke.obj -c $(DISPTARGCPUSRC)\invoke.$(A)
+# mip2coff $(DESTDIR)\invoke.obj
+!elseif ("$(TARG)" == "ALPHA")
+ @$(DISPLAY) Compiling $(DISPTARGCPUSRC)\invoke.$(A)...
+ $(AS) $(AFLAGS) $(DISPINCFLAGS) -o $(DESTDIR)\invoke.obj -c $(DISPTARGCPUSRC)\invoke.$(A)
+ a2coff $(DESTDIR)\invoke.obj
+!elseif ("$(TARG)" == "PPC")
+ @$(DISPLAY) Compiling $(DISPTARGCPUSRC)\invoke.$(A)...
+ $(CL) $(AFLAGS) -nologo /EP $(DISPTARGCPUSRC)\invoke.$(A) >$(DISPTARGCPUSRC)\tmp.i
+ $(AS) -o $(DESTDIR)\invoke.obj $(DISPTARGCPUSRC)\tmp.i
+ @-erase $(DISPTARGCPUSRC)\tmp.i
+!else
+ @$(DISPLAY) Compiling $(DISPTARGCPUSRC)\invoke.$(A)...
+ $(AS) $(AFLAGS) $(DISPINCFLAGS) -Fo$(DESTDIR)\invoke.obj -c $(DISPTARGCPUSRC)\invoke.$(A)
+!endif
+
+!if ("$(TARG)" != "WIN32")
+$(DESTDIR)\oleconva.obj : $(DISPTARGAPISRC)\oleconva.cpp
+ @$(DISPLAY) Compiling $(DISPTARGAPISRC)\oleconva.cpp...
+ $(CL) $(DISPCPPFLAGS) $(RUNTIME_TEXT) $(DISPCLFLAGS) $(DISPINCFLAGS) -c -Fo$@ $(DISPTARGAPISRC)\oleconva.cpp
+!else
+$(DESTDIR)\oleconva.obj : $(DISPTARGCPUSRC)\oleconva.$(A)
+ @$(DISPLAY) Compiling $(DISPTARGCPUSRC)\oleconva.cpp...
+ $(AS) $(AFLAGS) $(DISPINCFLAGS) -Fo$(DESTDIR)\oleconva.obj -c $(DISPTARGCPUSRC)\oleconva.$(A)
+!endif
+
+$(DESTDIR)\oledisp.obj : $(DISPTARGAPISRC)\oledisp.cpp
+ @$(DISPLAY) Compiling $(DISPTARGAPISRC)\oledisp.cpp...
+ $(CL) $(DISPCPPFLAGS) $(DISPCLFLAGS) $(DISPINCFLAGS) -Fo$(DESTDIR)\oledisp.obj -c $(DISPTARGAPISRC)\oledisp.cpp
+
+$(DESTDIR)\convertt.obj : $(DISPPATH)\convert.cpp
+ @$(DISPLAY) Compiling $(DISPPATH)\convert.cpp... to $(DESTDIR)\convertt.obj
+ $(CL) $(DISPCPPFLAGS) $(DISPCLFLAGS) $(DISPINCFLAGS) -c -Fo$(DESTDIR)\convertt.obj $(DISPPATH)\convert.cpp
+
+$(DESTDIR)\convert.obj : $(TYPELIBPATH)\convert.cxx
+ @$(DISPLAY) Compiling $(TYPELIBPATH)\convert.cxx
+ $(CL) -DOLEBLD $(OLECLFLAGS) $(CLBROWSE) $(PCHOLE) -Fo$@ $(TYPELIBPATH)\convert.cxx
+
+$(DESTDIR)\validat.obj : $(DISPPATH)\validate.cpp
+ @$(DISPLAY) Compiling $(DISPPATH)\validate.cpp... to $(DESTDIR)\validat.obj
+ $(CL) $(DISPCPPFLAGS) $(DISPCLFLAGS) $(DISPINCFLAGS) -c -Fo$(DESTDIR)\validat.obj $(DISPPATH)\validate.cpp
diff --git a/private/oleauto/chkfile.bat b/private/oleauto/chkfile.bat
new file mode 100644
index 000000000..b52bb7e9c
--- /dev/null
+++ b/private/oleauto/chkfile.bat
@@ -0,0 +1,6 @@
+diff %oleprog%\%1\%2 %2 >nul
+if not errorlevel 1 goto noupd
+echo checking out and updating \oleauto\%1\%2
+out %2
+copy %oleprog%\%1\%2 %2
+:noupd
diff --git a/private/oleauto/ole/win16/cobjps.h b/private/oleauto/ole/win16/cobjps.h
new file mode 100644
index 000000000..ff0359005
--- /dev/null
+++ b/private/oleauto/ole/win16/cobjps.h
@@ -0,0 +1,69 @@
+/*****************************************************************************\
+* *
+* cobjps.h - Definitions for writing standard proxies and stubs *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#if !defined( _COBJPS_H_ )
+#define _COBJPS_H_
+
+
+/****** IRpcChannel Interface ***********************************************/
+
+interface IRpcChannel : IUnknown
+{
+ STDMETHOD(GetStream)(REFIID iid, int iMethod, BOOL fSend,
+ BOOL fNoWait, DWORD size, IStream FAR* FAR* ppIStream) = 0;
+ STDMETHOD(Call)(IStream FAR* pIStream) = 0;
+ STDMETHOD(GetDestCtx)(DWORD FAR* lpdwDestCtx, LPVOID FAR* lplpvDestCtx) = 0;
+ STDMETHOD(IsConnected)(void) = 0;
+};
+
+
+/****** IRpcProxy Interface *************************************************/
+
+// IRpcProxy is an interface implemented by proxy objects. A proxy object has
+// exactly the same interfaces as the real object in addition to IRpcProxy.
+//
+
+interface IRpcProxy : IUnknown
+{
+ STDMETHOD(Connect)(IRpcChannel FAR* pRpcChannel) = 0;
+ STDMETHOD_(void, Disconnect)(void) = 0;
+};
+
+
+/****** IRpcStub Interface **************************************************/
+
+// IRpcStub is an interface implemented by stub objects.
+//
+
+interface IRpcStub : IUnknown
+{
+ STDMETHOD(Connect)(IUnknown FAR* pUnk) = 0;
+ STDMETHOD_(void, Disconnect)(void) = 0;
+ STDMETHOD(Invoke)(REFIID iid, int iMethod, IStream FAR* pIStream,
+ DWORD dwDestCtx, LPVOID lpvDestCtx) = 0;
+ STDMETHOD_(BOOL, IsIIDSupported)(REFIID iid) = 0;
+ STDMETHOD_(ULONG, CountRefs)(void) = 0;
+};
+
+
+/****** IPSFactory Interface ************************************************/
+
+// IPSFactory - creates proxies and stubs
+//
+
+interface IPSFactory : IUnknown
+{
+ STDMETHOD(CreateProxy)(IUnknown FAR* pUnkOuter, REFIID riid,
+ IRpcProxy FAR* FAR* ppProxy, void FAR* FAR* ppv) = 0;
+ STDMETHOD(CreateStub)(REFIID riid, IUnknown FAR* pUnkServer,
+ IRpcStub FAR* FAR* ppStub) = 0;
+};
+
+#endif // _COBJPS_H_
diff --git a/private/oleauto/ole/win16/coguid.h b/private/oleauto/ole/win16/coguid.h
new file mode 100644
index 000000000..049884168
--- /dev/null
+++ b/private/oleauto/ole/win16/coguid.h
@@ -0,0 +1,65 @@
+/*****************************************************************************\
+* *
+* coguid.h - Master definition of GUIDs for compobj.dll *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+/* this file is the master definition of all GUIDs for the component object
+ model and is included in compobj.h. Some GUIDs for moinkers and storage
+ appear here as well. All of these GUIDs are OLE GUIDs only in the sense
+ that part of the GUID range owned by OLE was used to define them.
+
+ NOTE: The second byte of all of these GUIDs is 0.
+*/
+
+
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0);
+DEFINE_OLEGUID(IID_IClassFactory, 0x00000001L, 0, 0);
+DEFINE_OLEGUID(IID_IMalloc, 0x00000002L, 0, 0);
+DEFINE_OLEGUID(IID_IMarshal, 0x00000003L, 0, 0);
+
+/* RPC related interfaces */
+DEFINE_OLEGUID(IID_IRpcChannel, 0x00000004L, 0, 0);
+DEFINE_OLEGUID(IID_IRpcStub, 0x00000005L, 0, 0);
+DEFINE_OLEGUID(IID_IStubManager, 0x00000006L, 0, 0);
+DEFINE_OLEGUID(IID_IRpcProxy, 0x00000007L, 0, 0);
+DEFINE_OLEGUID(IID_IProxyManager, 0x00000008L, 0, 0);
+DEFINE_OLEGUID(IID_IPSFactory, 0x00000009L, 0, 0);
+
+/* storage related interfaces */
+DEFINE_OLEGUID(IID_ILockBytes, 0x0000000aL, 0, 0);
+DEFINE_OLEGUID(IID_IStorage, 0x0000000bL, 0, 0);
+DEFINE_OLEGUID(IID_IStream, 0x0000000cL, 0, 0);
+DEFINE_OLEGUID(IID_IEnumSTATSTG, 0x0000000dL, 0, 0);
+
+/* moniker related interfaces */
+DEFINE_OLEGUID(IID_IBindCtx, 0x0000000eL, 0, 0);
+DEFINE_OLEGUID(IID_IMoniker, 0x0000000fL, 0, 0);
+DEFINE_OLEGUID(IID_IRunningObjectTable, 0x00000010L, 0, 0);
+DEFINE_OLEGUID(IID_IInternalMoniker, 0x00000011L, 0, 0);
+
+/* storage related interfaces */
+DEFINE_OLEGUID(IID_IRootStorage, 0x00000012L, 0, 0);
+DEFINE_OLEGUID(IID_IDfReserved1, 0x00000013L, 0, 0);
+DEFINE_OLEGUID(IID_IDfReserved2, 0x00000014L, 0, 0);
+DEFINE_OLEGUID(IID_IDfReserved3, 0x00000015L, 0, 0);
+
+/* concurrency releated interfaces */
+DEFINE_OLEGUID(IID_IMessageFilter, 0x00000016L, 0, 0);
+
+/* CLSID of standard marshaler */
+DEFINE_OLEGUID(CLSID_StdMarshal, 0x00000017L, 0, 0);
+
+/* interface on server for getting info for std marshaler */
+DEFINE_OLEGUID(IID_IStdMarshalInfo, 0x00000018L, 0, 0);
+
+/* interface to inform object of number of external connections */
+DEFINE_OLEGUID(IID_IExternalConnection, 0x00000019L, 0, 0);
+
+/* NOTE: LSB 0x1a through 0xff are reserved for future use */
diff --git a/private/oleauto/ole/win16/compobj.h b/private/oleauto/ole/win16/compobj.h
new file mode 100644
index 000000000..a438db8e4
--- /dev/null
+++ b/private/oleauto/ole/win16/compobj.h
@@ -0,0 +1,1031 @@
+/*****************************************************************************\
+* *
+* compobj.h - Component object model definitions *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+
+#if !defined( _COMPOBJ_H_ )
+#define _COMPOBJ_H_
+
+/****** Linkage Definitions *************************************************/
+
+/*
+ * These are macros for declaring methods/functions. They exist so that
+ * control over the use of keywords (CDECL, PASCAL, __export,
+ * extern "C") resides in one place, and because this is the least
+ * intrusive way of writing function declarations that do not have
+ * to be modified in order to port to the Mac.
+ *
+ * The macros without the trailing underscore are for functions/methods
+ * which a return value of type HRESULT; this is by far the most common
+ * case in OLE. The macros with a trailing underscore take a return
+ * type as a parameter.
+ *
+ * WARNING: STDAPI is hard coded into the LPFNGETCLASSOBJECT typedef below.
+ */
+
+#ifdef __cplusplus
+ #define EXTERN_C extern "C"
+#else
+ #define EXTERN_C extern
+#endif
+
+#ifdef _MAC
+#define STDMETHODCALLTYPE
+#define STDAPICALLTYPE pascal
+
+#define STDAPI EXTERN_C STDAPICALLTYPE HRESULT
+#define STDAPI_(type) EXTERN_C STDAPICALLTYPE type
+
+#else // !_MAC
+
+#ifdef WIN32
+#define STDMETHODCALLTYPE __export __cdecl
+#define STDAPICALLTYPE __export __stdcall
+
+#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
+#define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
+
+#else
+#define STDMETHODCALLTYPE __export FAR CDECL
+#define STDAPICALLTYPE __export FAR PASCAL
+
+#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
+#define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
+
+#endif
+
+#endif //!_MAC
+
+#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
+#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
+
+
+/****** Interface Declaration ***********************************************/
+
+/*
+ * These are macros for declaring interfaces. They exist so that
+ * a single definition of the interface is simulataneously a proper
+ * declaration of the interface structures (C++ abstract classes)
+ * for both C and C++.
+ *
+ * DECLARE_INTERFACE(iface) is used to declare an interface that does
+ * not derive from a base interface.
+ * DECLARE_INTERFACE_(iface, baseiface) is used to declare an interface
+ * that does derive from a base interface.
+ *
+ * By default if the source file has a .c extension the C version of
+ * the interface declaratations will be expanded; if it has a .cpp
+ * extension the C++ version will be expanded. if you want to force
+ * the C version expansion even though the source file has a .cpp
+ * extension, then define the macro "CINTERFACE".
+ * eg. cl -DCINTERFACE file.cpp
+ *
+ * Example Interface declaration:
+ *
+ * #undef INTERFACE
+ * #define INTERFACE IClassFactory
+ *
+ * DECLARE_INTERFACE_(IClassFactory, IUnknown)
+ * {
+ * // *** IUnknown methods ***
+ * STDMETHOD(QueryInterface) (THIS_
+ * REFIID riid,
+ * LPVOID FAR* ppvObj) PURE;
+ * STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ * STDMETHOD_(ULONG,Release) (THIS) PURE;
+ *
+ * // *** IClassFactory methods ***
+ * STDMETHOD(CreateInstance) (THIS_
+ * LPUNKNOWN pUnkOuter,
+ * REFIID riid,
+ * LPVOID FAR* ppvObject) PURE;
+ * };
+ *
+ * Example C++ expansion:
+ *
+ * struct FAR IClassFactory : public IUnknown
+ * {
+ * virtual HRESULT STDMETHODCALLTYPE QueryInterface(
+ * IID FAR& riid,
+ * LPVOID FAR* ppvObj) = 0;
+ * virtual HRESULT STDMETHODCALLTYPE AddRef(void) = 0;
+ * virtual HRESULT STDMETHODCALLTYPE Release(void) = 0;
+ * virtual HRESULT STDMETHODCALLTYPE CreateInstance(
+ * LPUNKNOWN pUnkOuter,
+ * IID FAR& riid,
+ * LPVOID FAR* ppvObject) = 0;
+ * };
+ *
+ * NOTE: Our documentation says '#define interface class' but we use
+ * 'struct' instead of 'class' to keep a lot of 'public:' lines
+ * out of the interfaces. The 'FAR' forces the 'this' pointers to
+ * be far, which is what we need.
+ *
+ * Example C expansion:
+ *
+ * typedef struct IClassFactory
+ * {
+ * const struct IClassFactoryVtbl FAR* lpVtbl;
+ * } IClassFactory;
+ *
+ * typedef struct IClassFactoryVtbl IClassFactoryVtbl;
+ *
+ * struct IClassFactoryVtbl
+ * {
+ * HRESULT (STDMETHODCALLTYPE * QueryInterface) (
+ * IClassFactory FAR* This,
+ * IID FAR* riid,
+ * LPVOID FAR* ppvObj) ;
+ * HRESULT (STDMETHODCALLTYPE * AddRef) (IClassFactory FAR* This) ;
+ * HRESULT (STDMETHODCALLTYPE * Release) (IClassFactory FAR* This) ;
+ * HRESULT (STDMETHODCALLTYPE * CreateInstance) (
+ * IClassFactory FAR* This,
+ * LPUNKNOWN pUnkOuter,
+ * IID FAR* riid,
+ * LPVOID FAR* ppvObject);
+ * HRESULT (STDMETHODCALLTYPE * LockServer) (
+ * IClassFactory FAR* This,
+ * BOOL fLock);
+ * };
+ */
+
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+#ifdef __TURBOC__
+#define interface struct huge
+#else
+#define interface struct FAR
+#endif
+#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method
+#define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
+#define PURE = 0
+#define THIS_
+#define THIS void
+#define DECLARE_INTERFACE(iface) interface iface
+#define DECLARE_INTERFACE_(iface, baseiface) interface iface : public baseiface
+
+#else
+#define interface struct
+
+#ifdef _MAC
+
+#define STDMETHOD(method) long method##pad;\
+ HRESULT (STDMETHODCALLTYPE * method)
+#define STDMETHOD_(type,method) long method##pad;\
+ type (STDMETHODCALLTYPE * method)
+
+#else // _MAC
+
+#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method)
+#define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)
+
+#endif // !_MAC
+
+#define PURE
+#define THIS_ INTERFACE FAR* This,
+#define THIS INTERFACE FAR* This
+#ifdef CONST_VTABLE
+#define DECLARE_INTERFACE(iface) typedef interface iface { \
+ const struct iface##Vtbl FAR* lpVtbl; \
+ } iface; \
+ typedef const struct iface##Vtbl iface##Vtbl; \
+ const struct iface##Vtbl
+#else
+#define DECLARE_INTERFACE(iface) typedef interface iface { \
+ struct iface##Vtbl FAR* lpVtbl; \
+ } iface; \
+ typedef struct iface##Vtbl iface##Vtbl; \
+ struct iface##Vtbl
+#endif
+#define DECLARE_INTERFACE_(iface, baseiface) DECLARE_INTERFACE(iface)
+
+#endif
+
+
+/****** Additional basic types **********************************************/
+
+
+#ifndef FARSTRUCT
+#ifdef __cplusplus
+#define FARSTRUCT FAR
+#else
+#define FARSTRUCT
+#endif // __cplusplus
+#endif // FARSTRUCT
+
+
+#ifndef WINAPI /* If not included with 3.1 headers... */
+
+#ifdef WIN32
+#define FAR
+#define PASCAL __stdcall
+#define CDECL
+#else
+#define FAR _far
+#define PASCAL _pascal
+#define CDECL _cdecl
+#endif
+
+#define VOID void
+#define WINAPI FAR PASCAL
+#define CALLBACK FAR PASCAL
+
+#ifndef FALSE
+#define FALSE 0
+#define TRUE 1
+#endif
+
+typedef int BOOL;
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned int UINT;
+
+typedef long LONG;
+typedef unsigned long DWORD;
+
+
+typedef UINT WPARAM;
+typedef LONG LPARAM;
+typedef LONG LRESULT;
+
+typedef unsigned int HANDLE;
+#define DECLARE_HANDLE(name) typedef UINT name
+
+DECLARE_HANDLE(HMODULE);
+DECLARE_HANDLE(HINSTANCE);
+DECLARE_HANDLE(HLOCAL);
+DECLARE_HANDLE(HGLOBAL);
+DECLARE_HANDLE(HDC);
+DECLARE_HANDLE(HRGN);
+DECLARE_HANDLE(HWND);
+DECLARE_HANDLE(HMENU);
+DECLARE_HANDLE(HACCEL);
+DECLARE_HANDLE(HTASK);
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+
+typedef void FAR * LPVOID;
+typedef WORD FAR * LPWORD;
+typedef DWORD FAR * LPDWORD;
+typedef char FAR* LPSTR;
+typedef const char FAR* LPCSTR;
+typedef void FAR* LPLOGPALETTE;
+typedef void FAR* LPMSG;
+//typedef struct tagMSG FAR *LPMSG;
+
+typedef HANDLE FAR *LPHANDLE;
+typedef struct tagRECT FAR *LPRECT;
+
+typedef struct FARSTRUCT tagSIZE
+{
+ int cx;
+ int cy;
+} SIZE;
+typedef SIZE* PSIZE;
+
+
+#endif /* WINAPI */
+
+
+typedef short SHORT;
+typedef unsigned short USHORT;
+typedef DWORD ULONG;
+
+
+#ifndef HUGEP
+#ifdef WIN32
+#define HUGEP
+#else
+#define HUGEP __huge
+#endif // WIN32
+#endif // HUGEP
+
+typedef WORD WCHAR;
+
+#ifndef WIN32
+typedef struct FARSTRUCT _LARGE_INTEGER {
+ DWORD LowPart;
+ LONG HighPart;
+} LARGE_INTEGER, *PLARGE_INTEGER;
+#endif
+#define LISet32(li, v) ((li).HighPart = ((LONG)(v)) < 0 ? -1 : 0, (li).LowPart = (v))
+
+#ifndef WIN32
+typedef struct FARSTRUCT _ULARGE_INTEGER {
+ DWORD LowPart;
+ DWORD HighPart;
+} ULARGE_INTEGER, *PULARGE_INTEGER;
+#endif
+#define ULISet32(li, v) ((li).HighPart = 0, (li).LowPart = (v))
+
+#ifndef _WINDOWS_
+#ifndef _FILETIME_
+#define _FILETIME_
+typedef struct FARSTRUCT tagFILETIME
+{
+ DWORD dwLowDateTime;
+ DWORD dwHighDateTime;
+} FILETIME;
+#endif
+#endif
+
+#ifdef WIN32
+#define HTASK DWORD
+#endif
+
+#include "scode.h"
+
+
+
+// *********************** Compobj errors **********************************
+
+#define CO_E_NOTINITIALIZED (CO_E_FIRST + 0x0)
+// CoInitialize has not been called and must be
+
+#define CO_E_ALREADYINITIALIZED (CO_E_FIRST + 0x1)
+// CoInitialize has already been called and cannot be called again (temporary)
+
+#define CO_E_CANTDETERMINECLASS (CO_E_FIRST + 0x2)
+// can't determine clsid (e.g., extension not in reg.dat)
+
+#define CO_E_CLASSSTRING (CO_E_FIRST + 0x3)
+// the string form of the clsid is invalid (including ole1 classes)
+
+#define CO_E_IIDSTRING (CO_E_FIRST + 0x4)
+// the string form of the iid is invalid
+
+#define CO_E_APPNOTFOUND (CO_E_FIRST + 0x5)
+// application not found
+
+#define CO_E_APPSINGLEUSE (CO_E_FIRST + 0x6)
+// application cannot be run more than once
+
+#define CO_E_ERRORINAPP (CO_E_FIRST + 0x7)
+// some error in the app program file
+
+#define CO_E_DLLNOTFOUND (CO_E_FIRST + 0x8)
+// dll not found
+
+#define CO_E_ERRORINDLL (CO_E_FIRST + 0x9)
+// some error in the dll file
+
+#define CO_E_WRONGOSFORAPP (CO_E_FIRST + 0xa)
+// app written for other version of OS or other OS altogether
+
+#define CO_E_OBJNOTREG (CO_E_FIRST + 0xb)
+// object is not registered
+
+#define CO_E_OBJISREG (CO_E_FIRST + 0xc)
+// object is already registered
+
+#define CO_E_OBJNOTCONNECTED (CO_E_FIRST + 0xd)
+// handler is not connected to server
+
+#define CO_E_APPDIDNTREG (CO_E_FIRST + 0xe)
+// app was launched, but didn't registered a class factory
+
+
+// ********************* ClassObject errors ********************************
+
+#define CLASS_E_NOAGGREGATION (CLASSFACTORY_E_FIRST + 0x0)
+// class does not support aggregation (or class object is remote)
+
+#define CLASS_E_CLASSNOTAVAILABLE (CLASSFACTORY_E_FIRST + 0x1)
+// dll doesn't support that class (returned from DllGetClassObject)
+
+
+// *********************** Reg.dat errors **********************************
+
+#define REGDB_E_READREGDB (REGDB_E_FIRST + 0x0)
+// some error reading the registration database
+
+#define REGDB_E_WRITEREGDB (REGDB_E_FIRST + 0x1)
+// some error reading the registration database
+
+#define REGDB_E_KEYMISSING (REGDB_E_FIRST + 0x2)
+// some error reading the registration database
+
+#define REGDB_E_INVALIDVALUE (REGDB_E_FIRST + 0x3)
+// some error reading the registration database
+
+#define REGDB_E_CLASSNOTREG (REGDB_E_FIRST + 0x4)
+// some error reading the registration database
+
+#define REGDB_E_IIDNOTREG (REGDB_E_FIRST + 0x5)
+// some error reading the registration database
+
+
+// *************************** RPC errors **********************************
+
+#define RPC_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_RPC, 0x000)
+
+// call was rejected by callee, either by MF::HandleIncomingCall or
+#define RPC_E_CALL_REJECTED (RPC_E_FIRST + 0x1)
+
+// call was canceld by call - returned by MessagePending
+// this code only occurs if MessagePending return cancel
+#define RPC_E_CALL_CANCELED (RPC_E_FIRST + 0x2)
+
+// the caller is dispatching an intertask SendMessage call and
+// can NOT call out via PostMessage
+#define RPC_E_CANTPOST_INSENDCALL (RPC_E_FIRST + 0x3)
+
+// the caller is dispatching an asynchronus call can NOT
+// make an outgoing call on behalf of this call
+#define RPC_E_CANTCALLOUT_INASYNCCALL (RPC_E_FIRST + 0x4)
+
+// the caller is not in a state where an outgoing call can be made
+// this is the case if the caller has an outstandig call and
+// another incoming call was excepted by HIC; now the caller is
+// not allowed to call out again
+#define RPC_E_CANTCALLOUT_INEXTERNALCALL (RPC_E_FIRST + 0x5)
+
+// the connection terminated or is in a bogus state
+// and can not be used any more. Other connections
+// are still valid.
+#define RPC_E_CONNECTION_TERMINATED (RPC_E_FIRST + 0x6)
+
+// the callee (server [not server application]) is not available
+// and disappeared; all connections are invalid
+#define RPC_E_SERVER_DIED (RPC_E_FIRST + 0x7)
+
+// the caller (client ) disappeared while the callee (server) was
+// processing a call
+#define RPC_E_CLIENT_DIED (RPC_E_FIRST + 0x8)
+
+// the date paket with the marshalled parameter data is
+// incorrect
+#define RPC_E_INVALID_DATAPACKET (RPC_E_FIRST + 0x9)
+
+// the call was not transmitted properly; the message queue
+// was full and was not emptied after yielding
+#define RPC_E_CANTTRANSMIT_CALL (RPC_E_FIRST + 0xa)
+
+// the client (caller) can not marshall the parameter data
+// or unmarshall the return data - low memory etc.
+#define RPC_E_CLIENT_CANTMARSHAL_DATA (RPC_E_FIRST + 0xb)
+#define RPC_E_CLIENT_CANTUNMARSHAL_DATA (RPC_E_FIRST + 0xc)
+
+// the server (caller) can not unmarshall the parameter data
+// or marshall the return data - low memory
+#define RPC_E_SERVER_CANTMARSHAL_DATA (RPC_E_FIRST + 0xd)
+#define RPC_E_SERVER_CANTUNMARSHAL_DATA (RPC_E_FIRST + 0xe)
+
+// received data are invalid; can be server or
+// client data
+#define RPC_E_INVALID_DATA (RPC_E_FIRST + 0xf)
+
+// a particular parameter is invalid and can not be un/marshalled
+#define RPC_E_INVALID_PARAMETER (RPC_E_FIRST + 0x10)
+
+// DDE conversation - no second outgoing call on same channel
+#define RPC_E_CANTCALLOUT_AGAIN (RPC_E_FIRST + 0x11)
+
+// a internal error occured
+#define RPC_E_UNEXPECTED (RPC_E_FIRST + 0xFFFF)
+
+
+/****** Globally Unique Ids *************************************************/
+
+#ifdef __cplusplus
+
+struct FAR GUID
+{
+ DWORD Data1;
+ WORD Data2;
+ WORD Data3;
+ BYTE Data4[8];
+
+ BOOL operator==(const GUID& iidOther) const
+
+#ifdef WIN32
+ { return !memcmp(&Data1,&iidOther.Data1,sizeof(GUID)); }
+#else
+ { return !_fmemcmp(&Data1,&iidOther.Data1,sizeof(GUID)); }
+#endif
+ BOOL operator!=(const GUID& iidOther) const
+ { return !((*this) == iidOther); }
+};
+
+#else
+typedef struct GUID
+{
+ DWORD Data1;
+ WORD Data2;
+ WORD Data3;
+ BYTE Data4[8];
+} GUID;
+#endif
+
+typedef GUID FAR* LPGUID;
+
+
+// macros to define byte pattern for a GUID.
+// Example: DEFINE_GUID(GUID_XXX, a, b, c, ...);
+//
+// Each dll/exe must initialize the GUIDs once. This is done in one of
+// two ways. If you are not using precompiled headers for the file(s) which
+// initializes the GUIDs, define INITGUID before including compobj.h. This
+// is how OLE builds the initialized versions of the GUIDs which are included
+// in compobj.dll.
+//
+// The alternative (which some versions of the compiler don't handle properly;
+// they wind up with the initialized GUIDs in a data, not a text segment),
+// is to use a precompiled version of compobj.h and then include initguid.h
+// after compobj.h followed by one or more of the guid defintion files.
+
+
+#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+ EXTERN_C const GUID CDECL FAR name
+
+#ifdef INITGUID
+#include "initguid.h"
+#endif
+
+#define DEFINE_OLEGUID(name, l, w1, w2) \
+ DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
+
+
+// Interface ID are just a kind of GUID
+typedef GUID IID;
+typedef IID FAR* LPIID;
+#define IID_NULL GUID_NULL
+#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
+
+
+// Class ID are just a kind of GUID
+typedef GUID CLSID;
+typedef CLSID FAR* LPCLSID;
+#define CLSID_NULL GUID_NULL
+#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
+
+
+#if defined(__cplusplus)
+#define REFGUID const GUID FAR&
+#define REFIID const IID FAR&
+#define REFCLSID const CLSID FAR&
+#else
+#define REFGUID const GUID FAR* const
+#define REFIID const IID FAR* const
+#define REFCLSID const CLSID FAR* const
+#endif
+
+
+#ifndef INITGUID
+#include "coguid.h"
+#endif
+
+/****** Other value types ***************************************************/
+
+// memory context values; passed to CoGetMalloc
+typedef enum tagMEMCTX
+{
+ MEMCTX_TASK = 1, // task (private) memory
+ MEMCTX_SHARED = 2, // shared memory (between processes)
+#ifdef _MAC
+ MEMCTX_MACSYSTEM = 3, // on the mac, the system heap
+#endif
+
+ // these are mostly for internal use...
+ MEMCTX_UNKNOWN = -1, // unknown context (when asked about it)
+ MEMCTX_SAME = -2, // same context (as some other pointer)
+} MEMCTX;
+
+
+
+// class context: used to determine what scope and kind of class object to use
+// NOTE: this is a bitwise enum
+typedef enum tagCLSCTX
+{
+ CLSCTX_INPROC_SERVER = 1, // server dll (runs in same process as caller)
+ CLSCTX_INPROC_HANDLER = 2, // handler dll (runs in same process as caller)
+ CLSCTX_LOCAL_SERVER = 4 // server exe (runs on same machine; diff proc)
+} CLSCTX;
+
+#define CLSCTX_ALL (CLSCTX_INPROC_SERVER| \
+ CLSCTX_INPROC_HANDLER| \
+ CLSCTX_LOCAL_SERVER)
+
+#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER)
+
+#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER)
+
+
+// class registration flags; passed to CoRegisterClassObject
+typedef enum tagREGCLS
+{
+ REGCLS_SINGLEUSE = 0, // class object only generates one instance
+ REGCLS_MULTIPLEUSE = 1, // same class object genereates multiple inst.
+ // and local automatically goes into inproc tbl.
+ REGCLS_MULTI_SEPARATE = 2, // multiple use, but separate control over each
+ // context.
+
+ // NOTE: CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE is the same as
+ // (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER), REGCLS_MULTI_SEPARATE, but
+ // not the same as CLSCTX_LOCAL_SERVER, REGCLS_MULTI_SEPARATE.
+} REGCLS;
+
+
+// interface marshaling definitions
+#define MARSHALINTERFACE_MIN 40 // minimum number of bytes for interface marshl
+
+// marshaling flags; passed to CoMarshalInterface
+typedef enum tagMSHLFLAGS
+{
+ MSHLFLAGS_NORMAL = 0, // normal marshaling via proxy/stub
+ MSHLFLAGS_TABLESTRONG = 1, // keep object alive; must explicitly release
+ MSHLFLAGS_TABLEWEAK = 2 // doesn't hold object alive; still must release
+} MSHLFLAGS;
+
+// marshal context: determines the destination context of the marshal operation
+typedef enum tagMSHCTX
+{
+ MSHCTX_LOCAL = 0, // unmarshal context is local (eg.shared memory)
+ MSHCTX_NOSHAREDMEM = 1, // unmarshal context has no shared memory access
+} MSHCTX;
+
+
+// call type used by IMessageFilter::HandleIncommingMessage
+typedef enum tagCALLTYPE
+{
+ CALLTYPE_TOPLEVEL = 1, // toplevel call - no outgoing call
+ CALLTYPE_NESTED = 2, // callback on behalf of previous outgoing call - should always handle
+ CALLTYPE_ASYNC = 3, // aysnchronous call - can NOT be rejected
+ CALLTYPE_TOPLEVEL_CALLPENDING = 4, // new toplevel call with new LID
+ CALLTYPE_ASYNC_CALLPENDING = 5 // async call - can NOT be rejected
+} CALLTYPE;
+
+typedef struct tagINTERFACEINFO
+{
+ interface IUnknown FAR *pUnk; // the pointer to the object
+ IID iid; // interface id
+ WORD wMethod; // interface methode
+} INTERFACEINFO, FAR * LPINTERFACEINFO;
+
+// status of server call - returned by IMessageFilter::HandleIncommingCall
+// and passed to IMessageFilter::RetryRejectedCall
+typedef enum tagSERVERCALL
+{
+ SERVERCALL_ISHANDLED = 0,
+ SERVERCALL_REJECTED = 1,
+ SERVERCALL_RETRYLATER = 2
+} SERVERCALL;
+
+
+// Pending type indicates the level of nesting
+typedef enum tagPENDINGTYPE
+{
+ PENDINGTYPE_TOPLEVEL = 1, // toplevel call
+ PENDINGTYPE_NESTED = 2, // nested call
+} PENDINGTYPE;
+
+// return values of MessagePending
+typedef enum tagPENDINGMSG
+{
+ PENDINGMSG_CANCELCALL = 0, // cancel the outgoing call
+ PENDINGMSG_WAITNOPROCESS = 1, // wait for the return and don't dispatch the message
+ PENDINGMSG_WAITDEFPROCESS = 2 // wait and dispatch the message
+
+} PENDINGMSG;
+
+
+// bit flags for IExternalConnection
+typedef enum tagEXTCONN
+{
+ EXTCONN_STRONG = 0x0001 // strong connection
+} EXTCONN;
+
+
+/****** IUnknown Interface **************************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IUnknown
+
+DECLARE_INTERFACE(IUnknown)
+{
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+};
+
+typedef IUnknown FAR* LPUNKNOWN;
+
+
+/****** Class Factory Interface *******************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IClassFactory
+
+DECLARE_INTERFACE_(IClassFactory, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IClassFactory methods ***
+ STDMETHOD(CreateInstance) (THIS_ LPUNKNOWN pUnkOuter,
+ REFIID riid,
+ LPVOID FAR* ppvObject) PURE;
+ STDMETHOD(LockServer) (THIS_ BOOL fLock) PURE;
+
+};
+typedef IClassFactory FAR* LPCLASSFACTORY;
+
+
+/****** Memory Allocation Interface ***************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IMalloc
+
+DECLARE_INTERFACE_(IMalloc, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IMalloc methods ***
+ STDMETHOD_(void FAR*, Alloc) (THIS_ ULONG cb) PURE;
+ STDMETHOD_(void FAR*, Realloc) (THIS_ void FAR* pv, ULONG cb) PURE;
+ STDMETHOD_(void, Free) (THIS_ void FAR* pv) PURE;
+ STDMETHOD_(ULONG, GetSize) (THIS_ void FAR* pv) PURE;
+ STDMETHOD_(int, DidAlloc) (THIS_ void FAR* pv) PURE;
+ STDMETHOD_(void, HeapMinimize) (THIS) PURE;
+};
+typedef IMalloc FAR* LPMALLOC;
+
+
+/****** IMarshal Interface ************************************************/
+
+// forward declaration for IStream; must include storage.h later to use
+#ifdef __cplusplus
+interface IStream;
+#else
+typedef interface IStream IStream;
+#endif
+typedef IStream FAR* LPSTREAM;
+
+
+#undef INTERFACE
+#define INTERFACE IMarshal
+
+DECLARE_INTERFACE_(IMarshal, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IMarshal methods ***
+ STDMETHOD(GetUnmarshalClass)(THIS_ REFIID riid, LPVOID pv,
+ DWORD dwDestContext, LPVOID pvDestContext,
+ DWORD mshlflags, LPCLSID pCid) PURE;
+ STDMETHOD(GetMarshalSizeMax)(THIS_ REFIID riid, LPVOID pv,
+ DWORD dwDestContext, LPVOID pvDestContext,
+ DWORD mshlflags, LPDWORD pSize) PURE;
+ STDMETHOD(MarshalInterface)(THIS_ LPSTREAM pStm, REFIID riid,
+ LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext,
+ DWORD mshlflags) PURE;
+ STDMETHOD(UnmarshalInterface)(THIS_ LPSTREAM pStm, REFIID riid,
+ LPVOID FAR* ppv) PURE;
+ STDMETHOD(ReleaseMarshalData)(THIS_ LPSTREAM pStm) PURE;
+ STDMETHOD(DisconnectObject)(THIS_ DWORD dwReserved) PURE;
+};
+typedef IMarshal FAR* LPMARSHAL;
+
+
+#undef INTERFACE
+#define INTERFACE IStdMarshalInfo
+
+DECLARE_INTERFACE_(IStdMarshalInfo, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IStdMarshalInfo methods ***
+ STDMETHOD(GetClassForHandler)(THIS_ DWORD dwDestContext,
+ LPVOID pvDestContext, LPCLSID pClsid) PURE;
+};
+typedef IStdMarshalInfo FAR* LPSTDMARSHALINFO;
+
+
+/****** Message Filter Interface *******************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IMessageFilter
+
+DECLARE_INTERFACE_(IMessageFilter, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IMessageFilter methods ***
+ STDMETHOD_(DWORD, HandleInComingCall) (THIS_ DWORD dwCallType,
+ HTASK htaskCaller, DWORD dwTickCount,
+ DWORD dwReserved ) PURE;
+ STDMETHOD_(DWORD, RetryRejectedCall) (THIS_
+ HTASK htaskCallee, DWORD dwTickCount,
+ DWORD dwRejectType ) PURE;
+ STDMETHOD_(DWORD, MessagePending) (THIS_
+ HTASK htaskCallee, DWORD dwTickCount,
+ DWORD dwPendingType ) PURE;
+};
+typedef IMessageFilter FAR* LPMESSAGEFILTER;
+
+
+/****** External Connection Information ***********************************/
+
+#undef INTERFACE
+#define INTERFACE IExternalConnection
+
+DECLARE_INTERFACE_(IExternalConnection, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IExternalConnection methods ***
+ STDMETHOD_(DWORD, AddConnection) (THIS_ DWORD extconn, DWORD reserved) PURE;
+ STDMETHOD_(DWORD, ReleaseConnection) (THIS_ DWORD extconn, DWORD reserved, BOOL fLastReleaseCloses) PURE;
+};
+typedef IExternalConnection FAR* LPEXTERNALCONNECTION;
+
+
+/****** Enumerator Interfaces *********************************************/
+
+/*
+ * Since we don't use parametrized types, we put in explicit declarations
+ * of the enumerators we need.
+ */
+
+
+#undef INTERFACE
+#define INTERFACE IEnumString
+
+DECLARE_INTERFACE_(IEnumString, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IEnumString methods ***
+ STDMETHOD(Next) (THIS_ ULONG celt,
+ LPSTR FAR* rgelt,
+ ULONG FAR* pceltFetched) PURE;
+ STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
+ STDMETHOD(Reset) (THIS) PURE;
+ STDMETHOD(Clone) (THIS_ IEnumString FAR* FAR* ppenm) PURE;
+};
+typedef IEnumString FAR* LPENUMSTRING;
+
+
+#undef INTERFACE
+#define INTERFACE IEnumUnknown
+
+DECLARE_INTERFACE_(IEnumUnknown, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IEnumUnknown methods ***
+ STDMETHOD(Next) (THIS_ ULONG celt, LPUNKNOWN FAR* rgelt, ULONG FAR* pceltFetched) PURE;
+ STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
+ STDMETHOD(Reset) (THIS) PURE;
+ STDMETHOD(Clone) (THIS_ IEnumUnknown FAR* FAR* ppenm) PURE;
+};
+typedef IEnumUnknown FAR* LPENUMUNKNOWN;
+
+
+/****** STD Object API Prototypes *****************************************/
+
+STDAPI_(DWORD) CoBuildVersion( VOID );
+
+/* init/uninit */
+
+STDAPI CoInitialize(LPMALLOC pMalloc);
+STDAPI_(void) CoUninitialize(void);
+STDAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC FAR* ppMalloc);
+STDAPI_(DWORD) CoGetCurrentProcess(void);
+STDAPI CoCreateStandardMalloc(DWORD memctx, IMalloc FAR* FAR* ppMalloc);
+
+
+/* register/revoke/get class objects */
+
+STDAPI CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, LPVOID pvReserved,
+ REFIID riid, LPVOID FAR* ppv);
+STDAPI CoRegisterClassObject(REFCLSID rclsid, LPUNKNOWN pUnk,
+ DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister);
+STDAPI CoRevokeClassObject(DWORD dwRegister);
+
+
+/* marshaling interface pointers */
+
+STDAPI CoMarshalInterface(LPSTREAM pStm, REFIID riid, LPUNKNOWN pUnk,
+ DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags);
+STDAPI CoUnmarshalInterface(LPSTREAM pStm, REFIID riid, LPVOID FAR* ppv);
+STDAPI CoMarshalHresult(LPSTREAM pstm, HRESULT hresult);
+STDAPI CoUnmarshalHresult(LPSTREAM pstm, HRESULT FAR * phresult);
+STDAPI CoReleaseMarshalData(LPSTREAM pStm);
+STDAPI CoDisconnectObject(LPUNKNOWN pUnk, DWORD dwReserved);
+STDAPI CoLockObjectExternal(LPUNKNOWN pUnk, BOOL fLock, BOOL fLastUnlockReleases);
+STDAPI CoGetStandardMarshal(REFIID riid, LPUNKNOWN pUnk,
+ DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags,
+ LPMARSHAL FAR* ppMarshal);
+
+STDAPI_(BOOL) CoIsHandlerConnected(LPUNKNOWN pUnk);
+
+/* dll loading helpers; keeps track of ref counts and unloads all on exit */
+
+STDAPI_(HINSTANCE) CoLoadLibrary(LPSTR lpszLibName, BOOL bAutoFree);
+STDAPI_(void) CoFreeLibrary(HINSTANCE hInst);
+STDAPI_(void) CoFreeAllLibraries(void);
+STDAPI_(void) CoFreeUnusedLibraries(void);
+
+
+/* helper for creating instances */
+
+STDAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
+ DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv);
+
+
+/* other helpers */
+STDAPI_(BOOL) IsEqualGUID(REFGUID rguid1, REFGUID rguid2);
+STDAPI StringFromCLSID(REFCLSID rclsid, LPSTR FAR* lplpsz);
+STDAPI CLSIDFromString(LPSTR lpsz, LPCLSID pclsid);
+STDAPI StringFromIID(REFIID rclsid, LPSTR FAR* lplpsz);
+STDAPI IIDFromString(LPSTR lpsz, LPIID lpiid);
+STDAPI_(BOOL) CoIsOle1Class(REFCLSID rclsid);
+STDAPI ProgIDFromCLSID (REFCLSID clsid, LPSTR FAR* lplpszProgID);
+STDAPI CLSIDFromProgID (LPCSTR lpszProgID, LPCLSID lpclsid);
+STDAPI_(int) StringFromGUID2(REFGUID rguid, LPSTR lpsz, int cbMax);
+
+STDAPI CoCreateGuid(GUID FAR *pguid);
+
+STDAPI_(BOOL) CoFileTimeToDosDateTime(
+ FILETIME FAR* lpFileTime, LPWORD lpDosDate, LPWORD lpDosTime);
+STDAPI_(BOOL) CoDosDateTimeToFileTime(
+ WORD nDosDate, WORD nDosTime, FILETIME FAR* lpFileTime);
+STDAPI CoFileTimeNow( FILETIME FAR* lpFileTime );
+
+
+STDAPI CoRegisterMessageFilter( LPMESSAGEFILTER lpMessageFilter,
+ LPMESSAGEFILTER FAR* lplpMessageFilter );
+
+
+/* TreatAs APIS */
+
+STDAPI CoGetTreatAsClass(REFCLSID clsidOld, LPCLSID pClsidNew);
+STDAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew);
+
+
+/* the server dlls must define their DllGetClassObject and DllCanUnloadNow
+ * to match these; the typedefs are located here to ensure all are changed at
+ * the same time.
+ */
+
+STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv);
+#ifdef _MAC
+typedef STDAPICALLTYPE HRESULT (FAR* LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID FAR*);
+#else
+typedef HRESULT (STDAPICALLTYPE FAR* LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID FAR*);
+#endif
+
+
+STDAPI DllCanUnloadNow(void);
+#ifdef _MAC
+typedef STDAPICALLTYPE HRESULT (FAR* LPFNCANUNLOADNOW)(void);
+#else
+typedef HRESULT (STDAPICALLTYPE FAR* LPFNCANUNLOADNOW)(void);
+#endif
+
+
+/****** Debugging Helpers *************************************************/
+
+#ifdef _DEBUG
+// writes to the debug port and displays a message box
+STDAPI FnAssert(LPSTR lpstrExpr, LPSTR lpstrMsg, LPSTR lpstrFileName, UINT iLine);
+#endif // _DEBUG
+
+#endif // _COMPOBJ_H_
diff --git a/private/oleauto/ole/win16/dvobj.h b/private/oleauto/ole/win16/dvobj.h
new file mode 100644
index 000000000..9c3dac58f
--- /dev/null
+++ b/private/oleauto/ole/win16/dvobj.h
@@ -0,0 +1,480 @@
+/*****************************************************************************\
+* *
+* dvobj.h - Data/View object definitions *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#if !defined( _DVOBJ_H_ )
+#define _DVOBJ_H_
+
+/****** DV value types ******************************************************/
+
+// forward type declarations
+#if defined(__cplusplus)
+interface IStorage;
+interface IStream;
+interface IAdviseSink;
+interface IMoniker;
+#else
+typedef interface IStorage IStorage;
+typedef interface IStream IStream;
+typedef interface IAdviseSink IAdviseSink;
+typedef interface IMoniker IMoniker;
+#endif
+
+typedef IStorage FAR* LPSTORAGE;
+typedef IStream FAR* LPSTREAM;
+typedef IAdviseSink FAR* LPADVISESINK;
+typedef IMoniker FAR* LPMONIKER;
+
+
+#if !defined(_MAC)
+typedef WORD CLIPFORMAT;
+#else
+typedef unsigned long CLIPFORMAT; // ResType
+#endif
+typedef CLIPFORMAT FAR* LPCLIPFORMAT;
+
+
+// Data/View aspect; specifies the desired aspect of the object when
+// drawing or getting data.
+typedef enum tagDVASPECT
+{
+ DVASPECT_CONTENT = 1,
+ DVASPECT_THUMBNAIL = 2,
+ DVASPECT_ICON = 4,
+ DVASPECT_DOCPRINT = 8
+} DVASPECT;
+
+
+// Data/View target device; determines the device for drawing or gettting data
+typedef struct FARSTRUCT tagDVTARGETDEVICE
+{
+ DWORD tdSize;
+ WORD tdDriverNameOffset;
+ WORD tdDeviceNameOffset;
+ WORD tdPortNameOffset;
+ WORD tdExtDevmodeOffset;
+ BYTE tdData[1];
+} DVTARGETDEVICE;
+
+
+// Format, etc.; completely specifices the kind of data desired, including tymed
+typedef struct FARSTRUCT tagFORMATETC
+{
+ CLIPFORMAT cfFormat;
+ DVTARGETDEVICE FAR* ptd;
+ DWORD dwAspect;
+ LONG lindex;
+ DWORD tymed;
+} FORMATETC, FAR* LPFORMATETC;
+
+
+// TYpes of storage MEDiums; determines how data is stored or passed around
+typedef enum tagTYMED
+{
+ TYMED_HGLOBAL = 1,
+ TYMED_FILE = 2,
+ TYMED_ISTREAM = 4,
+ TYMED_ISTORAGE = 8,
+ TYMED_GDI = 16,
+ TYMED_MFPICT = 32,
+ TYMED_NULL = 0
+} TYMED;
+
+
+// DATA format DIRection
+typedef enum tagDATADIR
+{
+ DATADIR_GET = 1,
+ DATADIR_SET = 2,
+} DATADIR;
+
+
+// SToraGe MEDIUM; a block of data on a particular medium
+typedef struct FARSTRUCT tagSTGMEDIUM
+{
+ DWORD tymed;
+ union
+ {
+ HANDLE hGlobal;
+ LPSTR lpszFileName;
+ IStream FAR* pstm;
+ IStorage FAR* pstg;
+ }
+#ifdef NONAMELESSUNION
+ u // add a tag when name less unions not supported
+#endif
+ ;
+ IUnknown FAR* pUnkForRelease;
+} STGMEDIUM, FAR* LPSTGMEDIUM;
+
+
+// Advise Flags
+typedef enum tagADVF
+{
+ ADVF_NODATA = 1,
+ ADVF_PRIMEFIRST = 2,
+ ADVF_ONLYONCE = 4,
+ ADVF_DATAONSTOP = 64,
+ ADVFCACHE_NOHANDLER = 8,
+ ADVFCACHE_FORCEBUILTIN = 16,
+ ADVFCACHE_ONSAVE = 32
+} ADVF;
+
+
+// Stats for data; used by several enumerations and by at least one
+// implementation of IDataAdviseHolder; if a field is not used, it
+// will be NULL.
+typedef struct FARSTRUCT tagSTATDATA
+{ // field used by:
+ FORMATETC formatetc; // EnumAdvise, EnumData (cache), EnumFormats
+ DWORD advf; // EnumAdvise, EnumData (cache)
+ IAdviseSink FAR* pAdvSink; // EnumAdvise
+ DWORD dwConnection; // EnumAdvise
+} STATDATA;
+
+typedef STATDATA FAR* LPSTATDATA;
+
+
+
+/****** DV Interfaces ***************************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IEnumFORMATETC
+
+DECLARE_INTERFACE_(IEnumFORMATETC, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppv) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IEnumFORMATETC methods ***
+ STDMETHOD(Next) (THIS_ ULONG celt, FORMATETC FAR * rgelt, ULONG FAR* pceltFetched) PURE;
+ STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
+ STDMETHOD(Reset) (THIS) PURE;
+ STDMETHOD(Clone) (THIS_ IEnumFORMATETC FAR* FAR* ppenum) PURE;
+};
+typedef IEnumFORMATETC FAR* LPENUMFORMATETC;
+
+
+#undef INTERFACE
+#define INTERFACE IEnumSTATDATA
+
+DECLARE_INTERFACE_(IEnumSTATDATA, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppv) PURE;
+ STDMETHOD_(ULONG, AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // *** IEnumSTATDATA methods ***
+ STDMETHOD(Next) (THIS_ ULONG celt, STATDATA FAR * rgelt, ULONG FAR* pceltFetched) PURE;
+ STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
+ STDMETHOD(Reset) (THIS) PURE;
+ STDMETHOD(Clone) (THIS_ IEnumSTATDATA FAR* FAR* ppenum) PURE;
+};
+typedef IEnumSTATDATA FAR* LPENUMSTATDATA;
+
+
+
+#undef INTERFACE
+#define INTERFACE IDataObject
+
+#define DATA_E_FORMATETC DV_E_FORMATETC
+#define DATA_S_SAMEFORMATETC (DATA_S_FIRST + 0)
+
+DECLARE_INTERFACE_(IDataObject, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // *** IDataObject methods ***
+ STDMETHOD(GetData) (THIS_ LPFORMATETC pformatetcIn,
+ LPSTGMEDIUM pmedium ) PURE;
+ STDMETHOD(GetDataHere) (THIS_ LPFORMATETC pformatetc,
+ LPSTGMEDIUM pmedium ) PURE;
+ STDMETHOD(QueryGetData) (THIS_ LPFORMATETC pformatetc ) PURE;
+ STDMETHOD(GetCanonicalFormatEtc) (THIS_ LPFORMATETC pformatetc,
+ LPFORMATETC pformatetcOut) PURE;
+ STDMETHOD(SetData) (THIS_ LPFORMATETC pformatetc, STGMEDIUM FAR * pmedium,
+ BOOL fRelease) PURE;
+ STDMETHOD(EnumFormatEtc) (THIS_ DWORD dwDirection,
+ LPENUMFORMATETC FAR* ppenumFormatEtc) PURE;
+
+ STDMETHOD(DAdvise) (THIS_ FORMATETC FAR* pFormatetc, DWORD advf,
+ LPADVISESINK pAdvSink, DWORD FAR* pdwConnection) PURE;
+ STDMETHOD(DUnadvise) (THIS_ DWORD dwConnection) PURE;
+ STDMETHOD(EnumDAdvise) (THIS_ LPENUMSTATDATA FAR* ppenumAdvise) PURE;
+};
+typedef IDataObject FAR* LPDATAOBJECT;
+
+
+
+#undef INTERFACE
+#define INTERFACE IViewObject
+
+#define VIEW_E_DRAW (VIEW_E_FIRST)
+#define E_DRAW VIEW_E_DRAW
+
+#define VIEW_S_ALREADY_FROZEN (VIEW_S_FIRST)
+
+DECLARE_INTERFACE_(IViewObject, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IViewObject methods ***
+ STDMETHOD(Draw) (THIS_ DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect, DVTARGETDEVICE FAR * ptd,
+ HDC hicTargetDev,
+ HDC hdcDraw,
+ LPCRECTL lprcBounds,
+ LPCRECTL lprcWBounds,
+ BOOL (CALLBACK * pfnContinue) (DWORD),
+ DWORD dwContinue) PURE;
+
+ STDMETHOD(GetColorSet) (THIS_ DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect, DVTARGETDEVICE FAR * ptd,
+ HDC hicTargetDev,
+ LPLOGPALETTE FAR* ppColorSet) PURE;
+
+ STDMETHOD(Freeze)(THIS_ DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect,
+ DWORD FAR* pdwFreeze) PURE;
+ STDMETHOD(Unfreeze) (THIS_ DWORD dwFreeze) PURE;
+ STDMETHOD(SetAdvise) (THIS_ DWORD aspects, DWORD advf,
+ LPADVISESINK pAdvSink) PURE;
+ STDMETHOD(GetAdvise) (THIS_ DWORD FAR* pAspects, DWORD FAR* pAdvf,
+ LPADVISESINK FAR* ppAdvSink) PURE;
+};
+typedef IViewObject FAR* LPVIEWOBJECT;
+
+
+#undef INTERFACE
+#define INTERFACE IViewObject2
+
+DECLARE_INTERFACE_(IViewObject2, IViewObject)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IViewObject methods ***
+ STDMETHOD(Draw) (THIS_ DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect, DVTARGETDEVICE FAR * ptd,
+ HDC hicTargetDev,
+ HDC hdcDraw,
+ LPCRECTL lprcBounds,
+ LPCRECTL lprcWBounds,
+ BOOL (CALLBACK * pfnContinue) (DWORD),
+ DWORD dwContinue) PURE;
+
+ STDMETHOD(GetColorSet) (THIS_ DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect, DVTARGETDEVICE FAR * ptd,
+ HDC hicTargetDev,
+ LPLOGPALETTE FAR* ppColorSet) PURE;
+
+ STDMETHOD(Freeze)(THIS_ DWORD dwDrawAspect, LONG lindex,
+ void FAR* pvAspect,
+ DWORD FAR* pdwFreeze) PURE;
+ STDMETHOD(Unfreeze) (THIS_ DWORD dwFreeze) PURE;
+ STDMETHOD(SetAdvise) (THIS_ DWORD aspects, DWORD advf,
+ LPADVISESINK pAdvSink) PURE;
+ STDMETHOD(GetAdvise) (THIS_ DWORD FAR* pAspects, DWORD FAR* pAdvf,
+ LPADVISESINK FAR* ppAdvSink) PURE;
+
+ // *** IViewObject2 methods ***
+ STDMETHOD(GetExtent) (THIS_ DWORD dwDrawAspect, LONG lindex,
+ DVTARGETDEVICE FAR * ptd, LPSIZEL lpsizel) PURE;
+
+};
+typedef IViewObject2 FAR* LPVIEWOBJECT2;
+
+
+#undef INTERFACE
+#define INTERFACE IAdviseSink
+
+DECLARE_INTERFACE_(IAdviseSink, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppv) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IAdviseSink methods ***
+ STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC FAR* pFormatetc,
+ STGMEDIUM FAR* pStgmed) PURE;
+ STDMETHOD_(void,OnViewChange)(THIS_ DWORD dwAspect, LONG lindex) PURE;
+ STDMETHOD_(void,OnRename)(THIS_ LPMONIKER pmk) PURE;
+ STDMETHOD_(void,OnSave)(THIS) PURE;
+ STDMETHOD_(void,OnClose)(THIS) PURE;
+};
+typedef IAdviseSink FAR* LPADVISESINK;
+
+
+
+#undef INTERFACE
+#define INTERFACE IAdviseSink2
+
+DECLARE_INTERFACE_(IAdviseSink2, IAdviseSink)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppv) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IAdviseSink methods ***
+ STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC FAR* pFormatetc,
+ STGMEDIUM FAR* pStgmed) PURE;
+ STDMETHOD_(void,OnViewChange)(THIS_ DWORD dwAspect, LONG lindex) PURE;
+ STDMETHOD_(void,OnRename)(THIS_ LPMONIKER pmk) PURE;
+ STDMETHOD_(void,OnSave)(THIS) PURE;
+ STDMETHOD_(void,OnClose)(THIS) PURE;
+
+ // *** IAdviseSink2 methods ***
+ STDMETHOD_(void,OnLinkSrcChange)(THIS_ LPMONIKER pmk) PURE;
+};
+typedef IAdviseSink2 FAR* LPADVISESINK2;
+
+
+
+#undef INTERFACE
+#define INTERFACE IDataAdviseHolder
+
+DECLARE_INTERFACE_(IDataAdviseHolder, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppv) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IDataAdviseHolder methods ***
+ STDMETHOD(Advise)(THIS_ LPDATAOBJECT pDataObject, FORMATETC FAR* pFetc,
+ DWORD advf, LPADVISESINK pAdvise, DWORD FAR* pdwConnection) PURE;
+ STDMETHOD(Unadvise)(THIS_ DWORD dwConnection) PURE;
+ STDMETHOD(EnumAdvise)(THIS_ LPENUMSTATDATA FAR* ppenumAdvise) PURE;
+
+ STDMETHOD(SendOnDataChange)(THIS_ LPDATAOBJECT pDataObject, DWORD dwReserved, DWORD advf) PURE;
+};
+typedef IDataAdviseHolder FAR* LPDATAADVISEHOLDER;
+
+
+
+#undef INTERFACE
+#define INTERFACE IOleCache
+
+#define CACHE_E_NOCACHE_UPDATED (CACHE_E_FIRST)
+
+#define CACHE_S_FORMATETC_NOTSUPPORTED (CACHE_S_FIRST)
+#define CACHE_S_SAMECACHE (CACHE_S_FIRST+1)
+#define CACHE_S_SOMECACHES_NOTUPDATED (CACHE_S_FIRST+2)
+
+
+DECLARE_INTERFACE_(IOleCache, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleCache methods ***
+ STDMETHOD(Cache) (THIS_ LPFORMATETC lpFormatetc, DWORD advf, LPDWORD lpdwConnection) PURE;
+ STDMETHOD(Uncache) (THIS_ DWORD dwConnection) PURE;
+ STDMETHOD(EnumCache) (THIS_ LPENUMSTATDATA FAR* ppenumStatData) PURE;
+ STDMETHOD(InitCache) (THIS_ LPDATAOBJECT pDataObject) PURE;
+ STDMETHOD(SetData) (THIS_ LPFORMATETC pformatetc, STGMEDIUM FAR * pmedium,
+ BOOL fRelease) PURE;
+};
+typedef IOleCache FAR* LPOLECACHE;
+
+
+
+// Cache update Flags
+
+#define UPDFCACHE_NODATACACHE 0x00000001
+#define UPDFCACHE_ONSAVECACHE 0x00000002
+#define UPDFCACHE_ONSTOPCACHE 0x00000004
+#define UPDFCACHE_NORMALCACHE 0x00000008
+#define UPDFCACHE_IFBLANK 0x00000010
+#define UPDFCACHE_ONLYIFBLANK 0x80000000
+
+#define UPDFCACHE_IFBLANKORONSAVECACHE (UPDFCACHE_IFBLANK | UPDFCACHE_ONSAVECACHE )
+#define UPDFCACHE_ALL (~UPDFCACHE_ONLYIFBLANK)
+#define UPDFCACHE_ALLBUTNODATACACHE (UPDFCACHE_ALL & ~UPDFCACHE_NODATACACHE)
+
+
+// IOleCache2::DiscardCache options
+typedef enum tagDISCARDCACHE
+{
+ DISCARDCACHE_SAVEIFDIRTY = 0, // Save all dirty cache before discarding
+ DISCARDCACHE_NOSAVE = 1 // Don't save dirty caches before
+ // discarding
+} DISCARDCACHE;
+
+
+#undef INTERFACE
+#define INTERFACE IOleCache2
+
+DECLARE_INTERFACE_(IOleCache2, IOleCache)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // *** IOleCache methods ***
+ STDMETHOD(Cache) (THIS_ LPFORMATETC lpFormatetc, DWORD advf, LPDWORD lpdwConnection) PURE;
+ STDMETHOD(Uncache) (THIS_ DWORD dwConnection) PURE;
+ STDMETHOD(EnumCache) (THIS_ LPENUMSTATDATA FAR* ppenumStatData) PURE;
+ STDMETHOD(InitCache) (THIS_ LPDATAOBJECT pDataObject) PURE;
+ STDMETHOD(SetData) (THIS_ LPFORMATETC pformatetc, STGMEDIUM FAR * pmedium,
+ BOOL fRelease) PURE;
+
+ // *** IOleCache2 methods ***
+ STDMETHOD(UpdateCache) (THIS_ LPDATAOBJECT pDataObject, DWORD grfUpdf,
+ LPVOID pReserved) PURE;
+ STDMETHOD(DiscardCache) (THIS_ DWORD dwDiscardOptions) PURE;
+
+};
+typedef IOleCache2 FAR* LPOLECACHE2;
+
+
+#undef INTERFACE
+#define INTERFACE IOleCacheControl
+
+DECLARE_INTERFACE_(IOleCacheControl, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // *** IDataObject methods ***
+ STDMETHOD(OnRun) (THIS_ LPDATAOBJECT pDataObject) PURE;
+ STDMETHOD(OnStop) (THIS) PURE;
+};
+typedef IOleCacheControl FAR* LPOLECACHECONTROL;
+
+
+
+/****** DV APIs ***********************************************************/
+
+
+STDAPI CreateDataAdviseHolder(LPDATAADVISEHOLDER FAR* ppDAHolder);
+
+STDAPI CreateDataCache(LPUNKNOWN pUnkOuter, REFCLSID rclsid,
+ REFIID iid, LPVOID FAR* ppv);
+
+#endif // _DVOBJ_H_
diff --git a/private/oleauto/ole/win16/initguid.h b/private/oleauto/ole/win16/initguid.h
new file mode 100644
index 000000000..e7406e3c2
--- /dev/null
+++ b/private/oleauto/ole/win16/initguid.h
@@ -0,0 +1,38 @@
+/*****************************************************************************\
+* *
+* initguid.h - Definitions for controlling GUID initialization *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+// Include after compobj.h to enable GUID initialization. This
+// must be done once per exe/dll.
+//
+// After this file, include one or more of the GUID definition files.
+//
+// NOTE: ole2.lib contains references to all GUIDs defined by OLE.
+
+#ifndef DEFINE_GUID
+#pragma error "initguid: must include compobj.h first."
+#endif
+
+#undef DEFINE_GUID
+
+#ifdef _MAC
+#define __based(a)
+#endif
+
+#ifdef WIN32
+#define __based(a)
+#endif
+
+#ifdef __TURBOC__
+#define __based(a)
+#endif
+
+#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+ EXTERN_C const GUID CDECL __based(__segname("_CODE")) name \
+ = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
diff --git a/private/oleauto/ole/win16/moniker.h b/private/oleauto/ole/win16/moniker.h
new file mode 100644
index 000000000..0f1761ff8
--- /dev/null
+++ b/private/oleauto/ole/win16/moniker.h
@@ -0,0 +1,248 @@
+/*****************************************************************************\
+* *
+* moniker.h - Moniker and related interfaces and APIs *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+
+#if !defined( _MONIKER_H_ )
+#define _MONIKER_H_
+
+#define MK_E_CONNECTMANUALLY MK_E_FIRST
+#define MK_E_EXCEEDEDDEADLINE (MK_E_FIRST + 1)
+#define MK_E_NEEDGENERIC (MK_E_FIRST + 2)
+#define MK_E_UNAVAILABLE (MK_E_FIRST + 3)
+#define MK_E_SYNTAX (MK_E_FIRST + 4)
+#define MK_E_NOOBJECT (MK_E_FIRST + 5)
+#define MK_E_INVALIDEXTENSION (MK_E_FIRST + 6)
+#define MK_E_INTERMEDIATEINTERFACENOTSUPPORTED (MK_E_FIRST + 7)
+#define MK_E_NOTBINDABLE (MK_E_FIRST + 8)
+#define MK_E_NOTBOUND (MK_E_FIRST + 9)
+ // called IBindCtx->RevokeObjectBound for an
+ // object which was not bound
+#define MK_E_CANTOPENFILE (MK_E_FIRST + 10)
+#define MK_E_MUSTBOTHERUSER (MK_E_FIRST + 11)
+#define MK_E_NOINVERSE (MK_E_FIRST + 12)
+#define MK_E_NOSTORAGE (MK_E_FIRST + 13)
+#define MK_E_NOPREFIX (MK_E_FIRST + 14)
+
+
+// reserved MK_S_FIRST
+// reserved (MK_S_FIRST + 1)
+#define MK_S_REDUCED_TO_SELF (MK_S_FIRST + 2)
+// reserved (MK_S_FIRST + 3)
+#define MK_S_ME (MK_S_FIRST + 4)
+#define MK_S_HIM (MK_S_FIRST + 5)
+#define MK_S_US (MK_S_FIRST + 6)
+#define MK_S_MONIKERALREADYREGISTERED (MK_S_FIRST + 7)
+
+
+// bind options; variable sized
+typedef struct FARSTRUCT tagBIND_OPTS
+{
+ DWORD cbStruct; // sizeof(BIND_OPTS)
+ DWORD grfFlags;
+ DWORD grfMode;
+ DWORD dwTickCountDeadline;
+} BIND_OPTS, FAR* LPBIND_OPTS;
+
+
+// bind flags; controls binding; stored in bind options above
+typedef enum
+{
+ BIND_MAYBOTHERUSER = 1,
+ BIND_JUSTTESTEXISTENCE = 2
+} BIND_FLAGS;
+
+
+// system moniker types; returned from IsSystemMoniker.
+typedef enum tagMKSYS
+{
+ MKSYS_NONE = 0,
+ MKSYS_GENERICCOMPOSITE = 1,
+ MKSYS_FILEMONIKER = 2,
+ MKSYS_ANTIMONIKER = 3,
+ MKSYS_ITEMMONIKER = 4,
+ MKSYS_POINTERMONIKER = 5
+}MKSYS;
+
+
+// bit wise enum to control how much reduction takes place.
+typedef enum tagMKREDUCE
+{
+ MKRREDUCE_ONE = 3<<16,
+ MKRREDUCE_TOUSER = 2<<16,
+ MKRREDUCE_THROUGHUSER = 1<<16,
+ MKRREDUCE_ALL = 0
+} MKRREDUCE;
+
+
+#if defined(__cplusplus)
+interface IEnumMoniker;
+interface IRunningObjectTable;
+#else
+typedef interface IEnumMoniker IEnumMoniker;
+typedef interface IRunningObjectTable IRunningObjectTable;
+#endif
+
+typedef IEnumMoniker FAR* LPENUMMONIKER;
+typedef IRunningObjectTable FAR* LPRUNNINGOBJECTTABLE;
+
+
+
+#undef INTERFACE
+#define INTERFACE IBindCtx
+
+DECLARE_INTERFACE_(IBindCtx, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IBindCtx methods ***
+ STDMETHOD(RegisterObjectBound) (THIS_ LPUNKNOWN punk) PURE;
+ STDMETHOD(RevokeObjectBound) (THIS_ LPUNKNOWN punk) PURE;
+ STDMETHOD(ReleaseBoundObjects) (THIS) PURE;
+
+ STDMETHOD(SetBindOptions) (THIS_ LPBIND_OPTS pbindopts) PURE;
+ STDMETHOD(GetBindOptions) (THIS_ LPBIND_OPTS pbindopts) PURE;
+ STDMETHOD(GetRunningObjectTable) (THIS_ LPRUNNINGOBJECTTABLE FAR*
+ pprot) PURE;
+ STDMETHOD(RegisterObjectParam) (THIS_ LPSTR lpszKey, LPUNKNOWN punk) PURE;
+ STDMETHOD(GetObjectParam) (THIS_ LPSTR lpszKey, LPUNKNOWN FAR* ppunk) PURE;
+ STDMETHOD(EnumObjectParam) (THIS_ LPENUMSTRING FAR* ppenum) PURE;
+ STDMETHOD(RevokeObjectParam) (THIS_ LPSTR lpszKey) PURE;
+};
+typedef IBindCtx FAR* LPBC;
+typedef IBindCtx FAR* LPBINDCTX;
+
+
+
+#undef INTERFACE
+#define INTERFACE IMoniker
+
+DECLARE_INTERFACE_(IMoniker, IPersistStream)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IPersist methods ***
+ STDMETHOD(GetClassID) (THIS_ LPCLSID lpClassID) PURE;
+
+ // *** IPersistStream methods ***
+ STDMETHOD(IsDirty) (THIS) PURE;
+ STDMETHOD(Load) (THIS_ LPSTREAM pStm) PURE;
+ STDMETHOD(Save) (THIS_ LPSTREAM pStm,
+ BOOL fClearDirty) PURE;
+ STDMETHOD(GetSizeMax) (THIS_ ULARGE_INTEGER FAR * pcbSize) PURE;
+
+ // *** IMoniker methods ***
+ STDMETHOD(BindToObject) (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
+ REFIID riidResult, LPVOID FAR* ppvResult) PURE;
+ STDMETHOD(BindToStorage) (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
+ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD(Reduce) (THIS_ LPBC pbc, DWORD dwReduceHowFar, LPMONIKER FAR*
+ ppmkToLeft, LPMONIKER FAR * ppmkReduced) PURE;
+ STDMETHOD(ComposeWith) (THIS_ LPMONIKER pmkRight, BOOL fOnlyIfNotGeneric,
+ LPMONIKER FAR* ppmkComposite) PURE;
+ STDMETHOD(Enum) (THIS_ BOOL fForward, LPENUMMONIKER FAR* ppenumMoniker)
+ PURE;
+ STDMETHOD(IsEqual) (THIS_ LPMONIKER pmkOtherMoniker) PURE;
+ STDMETHOD(Hash) (THIS_ LPDWORD pdwHash) PURE;
+ STDMETHOD(IsRunning) (THIS_ LPBC pbc, LPMONIKER pmkToLeft, LPMONIKER
+ pmkNewlyRunning) PURE;
+ STDMETHOD(GetTimeOfLastChange) (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
+ FILETIME FAR* pfiletime) PURE;
+ STDMETHOD(Inverse) (THIS_ LPMONIKER FAR* ppmk) PURE;
+ STDMETHOD(CommonPrefixWith) (THIS_ LPMONIKER pmkOther, LPMONIKER FAR*
+ ppmkPrefix) PURE;
+ STDMETHOD(RelativePathTo) (THIS_ LPMONIKER pmkOther, LPMONIKER FAR*
+ ppmkRelPath) PURE;
+ STDMETHOD(GetDisplayName) (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
+ LPSTR FAR* lplpszDisplayName) PURE;
+ STDMETHOD(ParseDisplayName) (THIS_ LPBC pbc, LPMONIKER pmkToLeft,
+ LPSTR lpszDisplayName, ULONG FAR* pchEaten,
+ LPMONIKER FAR* ppmkOut) PURE;
+ STDMETHOD(IsSystemMoniker) (THIS_ LPDWORD pdwMksys) PURE;
+};
+typedef IMoniker FAR* LPMONIKER;
+
+
+// IRunningObjectTable::Register flags
+#define ROTFLAGS_REGISTRATIONKEEPSALIVE 1
+
+#undef INTERFACE
+#define INTERFACE IRunningObjectTable
+
+DECLARE_INTERFACE_(IRunningObjectTable, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IRunningObjectTable methods ***
+ STDMETHOD(Register) (THIS_ DWORD grfFlags, LPUNKNOWN punkObject,
+ LPMONIKER pmkObjectName, DWORD FAR * pdwRegister) PURE;
+ STDMETHOD(Revoke) (THIS_ DWORD dwRegister) PURE;
+ STDMETHOD(IsRunning) (THIS_ LPMONIKER pmkObjectName) PURE;
+ STDMETHOD(GetObject) (THIS_ LPMONIKER pmkObjectName,
+ LPUNKNOWN FAR* ppunkObject) PURE;
+ STDMETHOD(NoteChangeTime) (THIS_ DWORD dwRegister, FILETIME FAR * pfiletime) PURE;
+ STDMETHOD(GetTimeOfLastChange) (THIS_ LPMONIKER pmkObjectName, FILETIME FAR * pfiletime) PURE;
+ STDMETHOD(EnumRunning) (THIS_ LPENUMMONIKER FAR * ppenumMoniker ) PURE;
+};
+typedef IRunningObjectTable FAR* LPRUNNINGOBJECTTABLE;
+
+
+
+#undef INTERFACE
+#define INTERFACE IEnumMoniker
+
+DECLARE_INTERFACE_(IEnumMoniker, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IEnumOleDataObject methods ***
+ STDMETHOD(Next) (THIS_ ULONG celt, LPMONIKER FAR* rgelt, ULONG FAR* pceltFetched) PURE;
+ STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
+ STDMETHOD(Reset) (THIS) PURE;
+ STDMETHOD(Clone) (THIS_ IEnumMoniker FAR* FAR* ppenm) PURE;
+};
+typedef IEnumMoniker FAR* LPENUMMONIKER;
+
+
+
+
+STDAPI BindMoniker(LPMONIKER pmk, DWORD grfOpt, REFIID iidResult, LPVOID FAR* ppvResult);
+STDAPI MkParseDisplayName(LPBC pbc, LPSTR szUserName,
+ ULONG FAR * pchEaten, LPMONIKER FAR * ppmk);
+STDAPI MonikerRelativePathTo(LPMONIKER pmkSrc, LPMONIKER pmkDest, LPMONIKER
+ FAR* ppmkRelPath, BOOL fCalledFromMethod);
+STDAPI MonikerCommonPrefixWith(LPMONIKER pmkThis, LPMONIKER pmkOther,
+ LPMONIKER FAR* ppmkCommon);
+STDAPI CreateBindCtx(DWORD reserved, LPBC FAR* ppbc);
+STDAPI CreateGenericComposite(LPMONIKER pmkFirst, LPMONIKER pmkRest,
+ LPMONIKER FAR* ppmkComposite);
+STDAPI GetClassFile (LPCSTR szFilename, CLSID FAR* pclsid);
+
+STDAPI CreateFileMoniker(LPSTR lpszPathName, LPMONIKER FAR* ppmk);
+STDAPI CreateItemMoniker(LPSTR lpszDelim, LPSTR lpszItem,
+ LPMONIKER FAR* ppmk);
+STDAPI CreateAntiMoniker(LPMONIKER FAR* ppmk);
+STDAPI CreatePointerMoniker(LPUNKNOWN punk, LPMONIKER FAR* ppmk);
+
+STDAPI GetRunningObjectTable( DWORD reserved, LPRUNNINGOBJECTTABLE FAR* pprot);
+
+
+#endif // _MONIKER_H_
diff --git a/private/oleauto/ole/win16/ole1cls.h b/private/oleauto/ole/win16/ole1cls.h
new file mode 100644
index 000000000..eeae62ba4
--- /dev/null
+++ b/private/oleauto/ole/win16/ole1cls.h
@@ -0,0 +1,141 @@
+/*****************************************************************************\
+* *
+* ole1cls.h - Master definition of GUIDs for OLE1 classes *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+/* This file is the master definition of all GUIDs for OLE1 classes.
+
+ All such GUIDs are of the form:
+
+ 0003xxxx-0000-0000-C000-000000000046
+
+ The last parameter to DEFINE_OLE1GUID is the old 1.0 class name,
+ i.e., its key in the registration database.
+
+ Do not remove or change GUIDs.
+
+ Do not add anything to this file except comments and DEFINE_OLE1GUID macros.
+*/
+
+#ifndef DEFINE_OLE1GUID
+#define DEFINE_OLE1GUID(a,b,c,d,e) DEFINE_OLEGUID (a,b,c,d)
+#endif
+
+DEFINE_OLE1GUID(CLSID_ExcelWorksheet, 0x00030000, 0, 0, "ExcelWorksheet");
+DEFINE_OLE1GUID(CLSID_ExcelChart, 0x00030001, 0, 0, "ExcelChart");
+DEFINE_OLE1GUID(CLSID_ExcelMacrosheet, 0x00030002, 0, 0, "ExcelMacrosheet");
+DEFINE_OLE1GUID(CLSID_WordDocument, 0x00030003, 0, 0, "WordDocument");
+DEFINE_OLE1GUID(CLSID_MSPowerPoint, 0x00030004, 0, 0, "MSPowerPoint");
+DEFINE_OLE1GUID(CLSID_MSPowerPointSho, 0x00030005, 0, 0, "MSPowerPointSho");
+DEFINE_OLE1GUID(CLSID_MSGraph, 0x00030006, 0, 0, "MSGraph");
+DEFINE_OLE1GUID(CLSID_MSDraw, 0x00030007, 0, 0, "MSDraw");
+DEFINE_OLE1GUID(CLSID_Note_It, 0x00030008, 0, 0, "Note-It");
+DEFINE_OLE1GUID(CLSID_WordArt, 0x00030009, 0, 0, "WordArt");
+DEFINE_OLE1GUID(CLSID_PBrush, 0x0003000a, 0, 0, "PBrush");
+DEFINE_OLE1GUID(CLSID_Equation, 0x0003000b, 0, 0, "Equation");
+DEFINE_OLE1GUID(CLSID_Package, 0x0003000c, 0, 0, "Package");
+DEFINE_OLE1GUID(CLSID_SoundRec, 0x0003000d, 0, 0, "SoundRec");
+DEFINE_OLE1GUID(CLSID_MPlayer, 0x0003000e, 0, 0, "MPlayer");
+
+/* test apps */
+DEFINE_OLE1GUID(CLSID_ServerDemo, 0x0003000f, 0, 0, "ServerDemo");
+DEFINE_OLE1GUID(CLSID_Srtest, 0x00030010, 0, 0, "Srtest");
+DEFINE_OLE1GUID(CLSID_SrtInv, 0x00030011, 0, 0, "SrtInv");
+DEFINE_OLE1GUID(CLSID_OleDemo, 0x00030012, 0, 0, "OleDemo");
+
+/* External ISVs */
+// Coromandel / Dorai Swamy / 718-793-7963
+DEFINE_OLE1GUID(CLSID_CoromandelIntegra, 0x00030013, 0, 0, "CoromandelIntegra");
+DEFINE_OLE1GUID(CLSID_CoromandelObjServer,0x00030014, 0, 0, "CoromandelObjServer");
+
+// 3-d Visions Corp / Peter Hirsch / 310-325-1339
+DEFINE_OLE1GUID(CLSID_StanfordGraphics, 0x00030015, 0, 0, "StanfordGraphics");
+
+// Deltapoint / Nigel Hearne / 408-648-4000
+DEFINE_OLE1GUID(CLSID_DGraphCHART, 0x00030016, 0, 0, "DGraphCHART");
+DEFINE_OLE1GUID(CLSID_DGraphDATA, 0x00030017, 0, 0, "DGraphDATA");
+
+// Corel / Richard V. Woodend / 613-728-8200 x1153
+DEFINE_OLE1GUID(CLSID_PhotoPaint, 0x00030018, 0, 0, "PhotoPaint");
+DEFINE_OLE1GUID(CLSID_CShow, 0x00030019, 0, 0, "CShow");
+DEFINE_OLE1GUID(CLSID_CorelChart, 0x0003001a, 0, 0, "CorelChart");
+DEFINE_OLE1GUID(CLSID_CDraw, 0x0003001b, 0, 0, "CDraw");
+
+// Inset Systems / Mark Skiba / 203-740-2400
+DEFINE_OLE1GUID(CLSID_HJWIN1_0, 0x0003001c, 0, 0, "HJWIN1.0");
+
+// Mark V Systems / Mark McGraw / 818-995-7671
+DEFINE_OLE1GUID(CLSID_ObjMakerOLE, 0x0003001d, 0, 0, "ObjMakerOLE");
+
+// IdentiTech / Mike Gilger / 407-951-9503
+DEFINE_OLE1GUID(CLSID_FYI, 0x0003001e, 0, 0, "FYI");
+DEFINE_OLE1GUID(CLSID_FYIView, 0x0003001f, 0, 0, "FYIView");
+
+// Inventa Corporation / Balaji Varadarajan / 408-987-0220
+DEFINE_OLE1GUID(CLSID_Stickynote, 0x00030020, 0, 0, "Stickynote");
+
+// ShapeWare Corp. / Lori Pearce / 206-467-6723
+DEFINE_OLE1GUID(CLSID_ShapewareVISIO10, 0x00030021, 0, 0, "ShapewareVISIO10");
+DEFINE_OLE1GUID(CLSID_ImportServer, 0x00030022, 0, 0, "ImportServer");
+
+
+// test app SrTest
+DEFINE_OLE1GUID(CLSID_SrvrTest, 0x00030023, 0, 0, "SrvrTest");
+
+// Special clsid for when a 1.0 client pastes an embedded object
+// that is a link.
+// **This CLSID is obsolete. Do not reuse number.
+//DEFINE_OLE1GUID(CLSID_10EmbedObj, 0x00030024, 0, 0, "OLE2_Embedded_Link");
+
+// test app ClTest. Doesn't really work as a server but is in reg db
+DEFINE_OLE1GUID(CLSID_ClTest, 0x00030025, 0, 0, "Cltest");
+
+// Microsoft ClipArt Gallery Sherry Larsen-Holmes
+DEFINE_OLE1GUID(CLSID_MS_ClipArt_Gallery,0x00030026, 0, 0, "MS_ClipArt_Gallery");
+
+// Microsoft Project Cory Reina
+DEFINE_OLE1GUID(CLSID_MSProject, 0x00030027, 0, 0, "MSProject");
+
+// Microsoft Works Chart
+DEFINE_OLE1GUID(CLSID_MSWorksChart, 0x00030028, 0, 0, "MSWorksChart");
+
+// Microsoft Works Spreadsheet
+DEFINE_OLE1GUID(CLSID_MSWorksSpreadsheet,0x00030029, 0, 0, "MSWorksSpreadsheet");
+
+// AFX apps - Dean McCrory
+DEFINE_OLE1GUID(CLSID_MinSvr, 0x0003002A, 0, 0, "MinSvr");
+DEFINE_OLE1GUID(CLSID_HierarchyList, 0x0003002B, 0, 0, "HierarchyList");
+DEFINE_OLE1GUID(CLSID_BibRef, 0x0003002C, 0, 0, "BibRef");
+DEFINE_OLE1GUID(CLSID_MinSvrMI, 0x0003002D, 0, 0, "MinSvrMI");
+DEFINE_OLE1GUID(CLSID_TestServ, 0x0003002E, 0, 0, "TestServ");
+
+// Ami Pro
+DEFINE_OLE1GUID(CLSID_AmiProDocument, 0x0003002F, 0, 0, "AmiProDocument");
+
+// WordPerfect Presentations For Windows
+DEFINE_OLE1GUID(CLSID_WPGraphics, 0x00030030, 0, 0, "WPGraphics");
+DEFINE_OLE1GUID(CLSID_WPCharts, 0x00030031, 0, 0, "WPCharts");
+
+
+// MicroGrafx Charisma
+DEFINE_OLE1GUID(CLSID_Charisma, 0x00030032, 0, 0, "Charisma");
+DEFINE_OLE1GUID(CLSID_Charisma_30, 0x00030033, 0, 0, "Charisma_30");
+DEFINE_OLE1GUID(CLSID_CharPres_30, 0x00030034, 0, 0, "CharPres_30");
+
+// MicroGrafx Draw
+DEFINE_OLE1GUID(CLSID_Draw, 0x00030035, 0, 0, "Draw");
+
+// MicroGrafx Designer
+DEFINE_OLE1GUID(CLSID_Designer_40, 0x00030036, 0, 0, "Designer_40");
+
+
+#undef DEFINE_OLE1GUID
+
+/* as we discover OLE 1 servers we will add them to the end of this list;
+ there is room for 64K of them!
+*/
diff --git a/private/oleauto/ole/win16/ole2.h b/private/oleauto/ole/win16/ole2.h
new file mode 100644
index 000000000..c5daea6f0
--- /dev/null
+++ b/private/oleauto/ole/win16/ole2.h
@@ -0,0 +1,1336 @@
+/*****************************************************************************\
+* *
+* ole2.h - Main OLE2 header; includes all subcomponents *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+
+#if !defined( _OLE2_H_ )
+#define _OLE2_H_
+
+#ifndef RC_INVOKED
+#pragma warning(disable:4001)
+#endif /* RC_INVOKED */
+
+#include <string.h>
+
+/****** Standard Object Definitions *****************************************/
+
+#include <compobj.h>
+
+
+// *************** FACILITY_ITF scodes common to all interfaces ************
+//
+// By convention, OLE interfaces divide the FACILITY_ITF range of errors
+// into nonoverlapping subranges. If an interface returns a FACILITY_ITF
+// scode, it must be from the range associated with that interface or from
+// the shared range: OLE_E_FIRST...OLE_E_LAST.
+//
+
+// error codes
+
+#define OLE_E_OLEVERB (OLE_E_FIRST)
+// invalid OLEVERB structure
+
+#define OLE_E_ADVF (OLE_E_FIRST+1)
+// invalid advise flags
+
+#define OLE_E_ENUM_NOMORE (OLE_E_FIRST+2)
+// you can't enuemrate any more, because the associated data is missing
+
+#define OLE_E_ADVISENOTSUPPORTED (OLE_E_FIRST+3)
+// this implementation doesn't take advises
+
+#define OLE_E_NOCONNECTION (OLE_E_FIRST+4)
+// there is no connection for this connection id
+
+#define OLE_E_NOTRUNNING (OLE_E_FIRST+5)
+// need run the object to perform this operation
+
+#define OLE_E_NOCACHE (OLE_E_FIRST+6)
+// there is no cache to operate on
+
+#define OLE_E_BLANK (OLE_E_FIRST+7)
+// Uninitialized object
+
+#define OLE_E_CLASSDIFF (OLE_E_FIRST+8)
+// linked object's source class has changed
+
+#define OLE_E_CANT_GETMONIKER (OLE_E_FIRST+9)
+// not able to get the moniker of the object
+
+#define OLE_E_CANT_BINDTOSOURCE (OLE_E_FIRST+10)
+// not able to bind to the source
+
+#define OLE_E_STATIC (OLE_E_FIRST+11)
+// object is static, operation not allowed
+
+#define OLE_E_PROMPTSAVECANCELLED (OLE_E_FIRST+12)
+// user cancelled out of save dialog
+
+#define OLE_E_INVALIDRECT (OLE_E_FIRST+13)
+// invalid rectangle
+
+#define OLE_E_WRONGCOMPOBJ (OLE_E_FIRST+14)
+// compobj.dll is too old for the ole2.dll initialized
+
+#define OLE_E_INVALIDHWND (OLE_E_FIRST+15)
+// invalid window handle
+
+#define OLE_E_NOT_INPLACEACTIVE (OLE_E_FIRST+16)
+// object is not in any of the inplace active states
+
+#define OLE_E_CANTCONVERT (OLE_E_FIRST+17)
+// not able to convert the object
+
+#define OLE_E_NOSTORAGE (OLE_E_FIRST+18)
+// not able to perform the operation because object is not given storage yet.
+
+
+#define DVGEN_E_FIRST (OLE_E_FIRST+100)
+
+#define DV_E_FORMATETC (DVGEN_E_FIRST)
+// invalid FORMATETC structure
+
+#define DV_E_DVTARGETDEVICE (DVGEN_E_FIRST+1)
+// invalid DVTARGETDEVICE structure
+
+#define DV_E_STGMEDIUM (DVGEN_E_FIRST+2)
+// invalid STDGMEDIUM structure
+
+#define DV_E_STATDATA (DVGEN_E_FIRST+3)
+// invalid STATDATA structure
+
+#define DV_E_LINDEX (DVGEN_E_FIRST+4)
+// invalid lindex
+
+#define DV_E_TYMED (DVGEN_E_FIRST+5)
+// invalid tymed
+
+#define DV_E_CLIPFORMAT (DVGEN_E_FIRST+6)
+// invalid clipboard format
+
+#define DV_E_DVASPECT (DVGEN_E_FIRST+7)
+// invalid aspect(s)
+
+#define DV_E_DVTARGETDEVICE_SIZE (DVGEN_E_FIRST+8)
+// tdSize paramter of the DVTARGETDEVICE structure is invalid
+
+#define DV_E_NOIVIEWOBJECT (DVGEN_E_FIRST+9)
+// object doesn't support IViewObject interface
+
+
+// Success codes
+
+#define OLE_S_USEREG (OLE_S_FIRST)
+// use the reg database to provide the requested info
+
+#define OLE_S_STATIC (OLE_S_FIRST+1)
+// success, but static
+
+#define OLE_S_MAC_CLIPFORMAT (OLE_S_FIRST+2)
+// macintosh clipboard format
+
+//*************************** Interface or API specific scodes *************
+
+// Errors for OleConvertOLESTREAMToIStorage and OleConvertIStorageToOLESTREAM
+
+// OLESTREAM Get method failed
+#define CONVERT10_E_OLESTREAM_GET (CONVERT10_E_FIRST + 0)
+
+// OLESTREAM Put method failed
+#define CONVERT10_E_OLESTREAM_PUT (CONVERT10_E_FIRST + 1)
+
+// Contents of the OLESTREAM not in correct format
+#define CONVERT10_E_OLESTREAM_FMT (CONVERT10_E_FIRST + 2)
+
+// There was in an error in a Windows GDI call while converting the bitmap
+// to a DIB.
+#define CONVERT10_E_OLESTREAM_BITMAP_TO_DIB (CONVERT10_E_FIRST + 3)
+
+// Contents of the IStorage not in correct format
+#define CONVERT10_E_STG_FMT (CONVERT10_E_FIRST + 4)
+
+// Contents of IStorage is missing one of the standard streams ("\1CompObj",
+// "\1Ole", "\2OlePres000"). This may be the storage for a DLL object, or a
+// class that does not use the def handler.
+#define CONVERT10_E_STG_NO_STD_STREAM (CONVERT10_E_FIRST + 5)
+
+// There was in an error in a Windows GDI call while converting the DIB
+// to a bitmap.
+#define CONVERT10_E_STG_DIB_TO_BITMAP (CONVERT10_E_FIRST + 6)
+
+
+// Returned by either API, this scode indicates that the original object
+// had no presentation, therefore the converted object does not either.
+#define CONVERT10_S_NO_PRESENTATION (CONVERT10_S_FIRST + 0)
+
+
+// Errors for Clipboard functions
+
+// OpenClipboard Failed
+#define CLIPBRD_E_CANT_OPEN (CLIPBRD_E_FIRST + 0)
+
+// EmptyClipboard Failed
+#define CLIPBRD_E_CANT_EMPTY (CLIPBRD_E_FIRST + 1)
+
+// SetClipboard Failed
+#define CLIPBRD_E_CANT_SET (CLIPBRD_E_FIRST + 2)
+
+// Data on clipboard is invalid
+#define CLIPBRD_E_BAD_DATA (CLIPBRD_E_FIRST + 3)
+
+// CloseClipboard Failed
+#define CLIPBRD_E_CANT_CLOSE (CLIPBRD_E_FIRST + 4)
+
+
+/****** OLE value types *****************************************************/
+
+/* rendering options */
+typedef enum tagOLERENDER
+{
+ OLERENDER_NONE = 0,
+ OLERENDER_DRAW = 1,
+ OLERENDER_FORMAT = 2,
+ OLERENDER_ASIS = 3
+} OLERENDER;
+typedef OLERENDER FAR* LPOLERENDER;
+
+// OLE verb; returned by IEnumOLEVERB
+typedef struct FARSTRUCT tagOLEVERB
+{
+ LONG lVerb;
+ LPSTR lpszVerbName;
+ DWORD fuFlags;
+ DWORD grfAttribs;
+} OLEVERB, FAR* LPOLEVERB;
+
+
+// Bitwise verb attributes used in OLEVERB.grfAttribs
+typedef enum tagOLEVERBATTRIB // bitwise
+{
+ OLEVERBATTRIB_NEVERDIRTIES = 1,
+ OLEVERBATTRIB_ONCONTAINERMENU = 2
+} OLEVERBATTRIB;
+
+
+// IOleObject::GetUserType optons; determines which form of the string to use
+typedef enum tagUSERCLASSTYPE
+{
+ USERCLASSTYPE_FULL = 1,
+ USERCLASSTYPE_SHORT= 2,
+ USERCLASSTYPE_APPNAME= 3,
+} USERCLASSTYPE;
+
+
+// bits returned from IOleObject::GetMistStatus
+typedef enum tagOLEMISC // bitwise
+{
+ OLEMISC_RECOMPOSEONRESIZE = 1,
+ OLEMISC_ONLYICONIC = 2,
+ OLEMISC_INSERTNOTREPLACE = 4,
+ OLEMISC_STATIC = 8,
+ OLEMISC_CANTLINKINSIDE = 16,
+ OLEMISC_CANLINKBYOLE1 = 32,
+ OLEMISC_ISLINKOBJECT = 64,
+ OLEMISC_INSIDEOUT = 128,
+ OLEMISC_ACTIVATEWHENVISIBLE = 256,
+ OLEMISC_RENDERINGISDEVICEINDEPENDENT = 512
+} OLEMISC;
+
+
+// IOleObject::Close options
+typedef enum tagOLECLOSE
+{
+ OLECLOSE_SAVEIFDIRTY = 0,
+ OLECLOSE_NOSAVE = 1,
+ OLECLOSE_PROMPTSAVE = 2
+} OLECLOSE;
+
+
+// IOleObject::GetMoniker and IOleClientSite::GetMoniker options; determines
+// if and how monikers should be assigned.
+typedef enum tagOLEGETMONIKER
+{
+ OLEGETMONIKER_ONLYIFTHERE=1,
+ OLEGETMONIKER_FORCEASSIGN=2,
+ OLEGETMONIKER_UNASSIGN=3,
+ OLEGETMONIKER_TEMPFORUSER=4
+} OLEGETMONIKER;
+
+
+// IOleObject::GetMoniker, IOleObject::SetMoniker and
+// IOleClientSite::GetMoniker options; determines which moniker to use
+typedef enum tagOLEWHICHMK
+{
+ OLEWHICHMK_CONTAINER=1,
+ OLEWHICHMK_OBJREL=2,
+ OLEWHICHMK_OBJFULL=3
+} OLEWHICHMK;
+
+
+#ifdef WIN32
+#define LPSIZEL PSIZEL
+#else
+typedef struct FARSTRUCT tagSIZEL
+{
+ long cx;
+ long cy;
+} SIZEL, FAR* LPSIZEL;
+#endif
+
+
+#ifdef WIN32
+#define LPRECTL PRECTL
+#else
+typedef struct FARSTRUCT tagRECTL
+{
+ long left;
+ long top;
+ long right;
+ long bottom;
+} RECTL, FAR* LPRECTL;
+
+typedef struct FARSTRUCT tagPOINTL {
+ LONG x;
+ LONG y;
+} POINTL;
+
+#endif
+
+
+#ifndef LPCRECT
+typedef const RECT FAR* LPCRECT;
+#endif
+
+#ifndef LPCRECTL
+typedef const RECTL FAR* LPCRECTL;
+#endif
+
+
+// for OleCreateEmbeddingHelper flags; roles in low word; options in high word
+#define EMBDHLP_INPROC_HANDLER 0x0000L // role is handler; implementation is
+ // default handler; pCF can be NULL
+#define EMBDHLP_INPROC_SERVER 0x0001L // role is server; pCF can't be NULL
+
+#define EMBDHLP_CREATENOW 0x00000000L // create using pCF immediately; if pCF
+ // is NULL, uses std remoting handler
+#define EMBDHLP_DELAYCREATE 0x00010000L // delayed create; must supply pCF
+
+
+// NOTE: OleCreateEmbeddingHelper(clsid, pUnkOuter,
+// EMBDHLP_INPROC_HANDLER | EMBDHLP_CREATENOW, NULL, riid, lplpObj)
+// is the same as OleCreateDefaultHandler(clsid, pUnkOuter, riid, lplpObj);
+// i.e., the embedding helper is the default handler in various roles.
+
+
+/***** OLE 1.0 OLESTREAM declarations *************************************/
+
+typedef struct _OLESTREAM FAR* LPOLESTREAM;
+
+typedef struct _OLESTREAMVTBL
+{
+ DWORD (CALLBACK* Get)(LPOLESTREAM, void FAR*, DWORD);
+ DWORD (CALLBACK* Put)(LPOLESTREAM, const void FAR*, DWORD);
+} OLESTREAMVTBL;
+typedef OLESTREAMVTBL FAR* LPOLESTREAMVTBL;
+
+typedef struct _OLESTREAM
+{
+ LPOLESTREAMVTBL lpstbl;
+} OLESTREAM;
+
+
+/****** Clipboard Data structures *****************************************/
+
+typedef struct tagOBJECTDESCRIPTOR
+{
+ ULONG cbSize; // Size of structure in bytes
+ CLSID clsid; // CLSID of data being transferred
+ DWORD dwDrawAspect; // Display aspect of the object
+ // normally DVASPECT_CONTENT or ICON.
+ // dwDrawAspect will be 0 (which is NOT
+ // DVASPECT_CONTENT) if the copier or
+ // dragsource didn't draw the object to
+ // begin with.
+ SIZEL sizel; // size of the object in HIMETRIC
+ // sizel is opt.: will be (0,0) for apps
+ // which don't draw the object being
+ // transferred
+ POINTL pointl; // Offset in HIMETRIC units from the
+ // upper-left corner of the obj where the
+ // mouse went down for the drag.
+ // NOTE: y coordinates increase downward.
+ // x coordinates increase to right
+ // pointl is opt.; it is only meaningful
+ // if object is transfered via drag/drop.
+ // (0, 0) if mouse position is unspecified
+ // (eg. when obj transfered via clipboard)
+ DWORD dwStatus; // Misc. status flags for object. Flags are
+ // defined by OLEMISC enum. these flags
+ // are as would be returned
+ // by IOleObject::GetMiscStatus.
+ DWORD dwFullUserTypeName; // Offset from beginning of structure to
+ // null-terminated string that specifies
+ // Full User Type Name of the object.
+ // 0 indicates string not present.
+ DWORD dwSrcOfCopy; // Offset from beginning of structure to
+ // null-terminated string that specifies
+ // source of the transfer.
+ // dwSrcOfCOpy is normally implemented as
+ // the display name of the temp-for-user
+ // moniker which identifies the source of
+ // the data.
+ // 0 indicates string not present.
+ // NOTE: moniker assignment is NOT forced.
+ // see IOleObject::GetMoniker(
+ // OLEGETMONIKER_TEMPFORUSER)
+
+ /* variable sized string data may appear here */
+
+} OBJECTDESCRIPTOR, *POBJECTDESCRIPTOR, FAR *LPOBJECTDESCRIPTOR,
+ LINKSRCDESCRIPTOR, *PLINKSRCDESCRIPTOR, FAR *LPLINKSRCDESCRIPTOR;
+
+
+
+/* verbs */
+#define OLEIVERB_PRIMARY (0L)
+#define OLEIVERB_SHOW (-1L)
+#define OLEIVERB_OPEN (-2L)
+#define OLEIVERB_HIDE (-3L)
+#define OLEIVERB_UIACTIVATE (-4L)
+#define OLEIVERB_INPLACEACTIVATE (-5L)
+#define OLEIVERB_DISCARDUNDOSTATE (-6L)
+
+
+// forward type declarations
+#if defined(__cplusplus)
+interface IOleClientSite;
+interface IOleContainer;
+interface IOleObject;
+#else
+typedef interface IOleClientSite IOleClientSite;
+typedef interface IOleContainer IOleContainer;
+typedef interface IOleObject IOleObject;
+#endif
+
+typedef IOleObject FAR* LPOLEOBJECT;
+typedef IOleClientSite FAR* LPOLECLIENTSITE;
+typedef IOleContainer FAR* LPOLECONTAINER;
+
+
+/****** OLE GUIDs *********************************************************/
+
+#ifndef INITGUID
+#include "oleguid.h"
+#endif
+
+
+/****** Other Major Interfaces ********************************************/
+
+#include <dvobj.h>
+
+#include <storage.h>
+
+
+
+/****** IDrop??? Interfaces ********************************************/
+
+#define MK_ALT 0x0020
+
+
+#define DROPEFFECT_NONE 0
+#define DROPEFFECT_COPY 1
+#define DROPEFFECT_MOVE 2
+#define DROPEFFECT_LINK 4
+#define DROPEFFECT_SCROLL 0x80000000
+
+// default inset-width of the hot zone, in pixels
+// typical use: GetProfileInt("windows","DragScrollInset",DD_DEFSCROLLINSET)
+#define DD_DEFSCROLLINSET 11
+
+// default delay before scrolling, in milliseconds
+// typical use: GetProfileInt("windows","DragScrollDelay",DD_DEFSCROLLDELAY)
+#define DD_DEFSCROLLDELAY 50
+
+// default scroll interval, in milliseconds
+// typical use: GetProfileInt("windows","DragScrollInterval",
+// DD_DEFSCROLLINTERVAL)
+#define DD_DEFSCROLLINTERVAL 50
+
+// default delay before dragging should start, in milliseconds
+// typical use: GetProfileInt("windows", "DragDelay", DD_DEFDRAGDELAY)
+#define DD_DEFDRAGDELAY 200
+
+// default minimum distance (radius) before dragging should start, in pixels
+// typical use: GetProfileInt("windows", "DragMinDist", DD_DEFDRAGMINDIST)
+#define DD_DEFDRAGMINDIST 2
+
+
+
+/* Dragdrop specific error codes */
+
+#define DRAGDROP_E_NOTREGISTERED (DRAGDROP_E_FIRST)
+// trying to revoke a drop target that has not been registered
+
+#define DRAGDROP_E_ALREADYREGISTERED (DRAGDROP_E_FIRST+1)
+// this window has already been registered as a drop target
+
+#define DRAGDROP_E_INVALIDHWND (DRAGDROP_E_FIRST+2)
+// invalid HWND
+
+
+#define DRAGDROP_S_DROP (DRAGDROP_S_FIRST + 0)
+// successful drop took place
+
+#define DRAGDROP_S_CANCEL (DRAGDROP_S_FIRST + 1)
+// drag-drop operation canceled
+
+#define DRAGDROP_S_USEDEFAULTCURSORS (DRAGDROP_S_FIRST + 2)
+// use the default cursor
+
+
+#undef INTERFACE
+#define INTERFACE IDropTarget
+
+DECLARE_INTERFACE_(IDropTarget, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IDropTarget methods ***
+ STDMETHOD(DragEnter) (THIS_ LPDATAOBJECT pDataObj, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect) PURE;
+ STDMETHOD(DragOver) (THIS_ DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect) PURE;
+ STDMETHOD(DragLeave) (THIS) PURE;
+ STDMETHOD(Drop) (THIS_ LPDATAOBJECT pDataObj, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect) PURE;
+};
+typedef IDropTarget FAR* LPDROPTARGET;
+
+
+
+#undef INTERFACE
+#define INTERFACE IDropSource
+
+DECLARE_INTERFACE_(IDropSource, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IDropSource methods ***
+ STDMETHOD(QueryContinueDrag) (THIS_ BOOL fEscapePressed, DWORD grfKeyState) PURE;
+ STDMETHOD(GiveFeedback) (THIS_ DWORD dwEffect) PURE;
+};
+typedef IDropSource FAR* LPDROPSOURCE;
+
+
+
+/****** IPersist??? Interfaces ********************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IPersist
+
+DECLARE_INTERFACE_(IPersist, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IPersist methods ***
+ STDMETHOD(GetClassID) (THIS_ LPCLSID lpClassID) PURE;
+};
+typedef IPersist FAR* LPPERSIST;
+
+
+
+#undef INTERFACE
+#define INTERFACE IPersistStorage
+
+DECLARE_INTERFACE_(IPersistStorage, IPersist)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IPersist methods ***
+ STDMETHOD(GetClassID) (THIS_ LPCLSID lpClassID) PURE;
+
+ // *** IPersistStorage methods ***
+ STDMETHOD(IsDirty) (THIS) PURE;
+ STDMETHOD(InitNew) (THIS_ LPSTORAGE pStg) PURE;
+ STDMETHOD(Load) (THIS_ LPSTORAGE pStg) PURE;
+ STDMETHOD(Save) (THIS_ LPSTORAGE pStgSave, BOOL fSameAsLoad) PURE;
+ STDMETHOD(SaveCompleted) (THIS_ LPSTORAGE pStgNew) PURE;
+ STDMETHOD(HandsOffStorage) (THIS) PURE;
+};
+typedef IPersistStorage FAR* LPPERSISTSTORAGE;
+
+
+
+#undef INTERFACE
+#define INTERFACE IPersistStream
+
+DECLARE_INTERFACE_(IPersistStream, IPersist)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IPersist methods ***
+ STDMETHOD(GetClassID) (THIS_ LPCLSID lpClassID) PURE;
+
+ // *** IPersistStream methods ***
+ STDMETHOD(IsDirty) (THIS) PURE;
+ STDMETHOD(Load) (THIS_ LPSTREAM pStm) PURE;
+ STDMETHOD(Save) (THIS_ LPSTREAM pStm,
+ BOOL fClearDirty) PURE;
+ STDMETHOD(GetSizeMax) (THIS_ ULARGE_INTEGER FAR* pcbSize) PURE;
+};
+typedef IPersistStream FAR* LPPERSISTSTREAM;
+
+
+
+#undef INTERFACE
+#define INTERFACE IPersistFile
+
+DECLARE_INTERFACE_(IPersistFile, IPersist)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IPersist methods ***
+ STDMETHOD(GetClassID) (THIS_ LPCLSID lpClassID) PURE;
+
+ // *** IPersistFile methods ***
+ STDMETHOD(IsDirty) (THIS) PURE;
+ STDMETHOD(Load) (THIS_ LPCSTR lpszFileName, DWORD grfMode) PURE;
+ STDMETHOD(Save) (THIS_ LPCSTR lpszFileName, BOOL fRemember) PURE;
+ STDMETHOD(SaveCompleted) (THIS_ LPCSTR lpszFileName) PURE;
+ STDMETHOD(GetCurFile) (THIS_ LPSTR FAR* lplpszFileName) PURE;
+};
+typedef IPersistFile FAR* LPPERSISTFILE;
+
+
+/****** Moniker Object Interfaces ******************************************/
+
+#include <moniker.h>
+
+
+/****** OLE Object Interfaces ******************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IEnumOLEVERB
+
+DECLARE_INTERFACE_(IEnumOLEVERB, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IEnumOLEVERB methods ***
+ STDMETHOD(Next) (THIS_ ULONG celt, LPOLEVERB rgelt, ULONG FAR* pceltFetched) PURE;
+ STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
+ STDMETHOD(Reset) (THIS) PURE;
+ STDMETHOD(Clone) (THIS_ IEnumOLEVERB FAR* FAR* ppenm) PURE;
+};
+typedef IEnumOLEVERB FAR* LPENUMOLEVERB;
+
+
+
+
+#undef INTERFACE
+#define INTERFACE IOleObject
+
+#define OLEOBJ_E_NOVERBS (OLEOBJ_E_FIRST + 0)
+
+#define OLEOBJ_E_INVALIDVERB (OLEOBJ_E_FIRST + 1)
+
+#define OLEOBJ_S_INVALIDVERB (OLEOBJ_S_FIRST + 0)
+
+#define OLEOBJ_S_CANNOT_DOVERB_NOW (OLEOBJ_S_FIRST + 1)
+// verb number is valid but verb cannot be done now, for instance
+// hiding a link or hiding a visible OLE 1.0 server
+
+#define OLEOBJ_S_INVALIDHWND (OLEOBJ_S_FIRST + 2)
+// invalid hwnd passed
+
+
+DECLARE_INTERFACE_(IOleObject, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleObject methods ***
+ STDMETHOD(SetClientSite) (THIS_ LPOLECLIENTSITE pClientSite) PURE;
+ STDMETHOD(GetClientSite) (THIS_ LPOLECLIENTSITE FAR* ppClientSite) PURE;
+ STDMETHOD(SetHostNames) (THIS_ LPCSTR szContainerApp, LPCSTR szContainerObj) PURE;
+ STDMETHOD(Close) (THIS_ DWORD dwSaveOption) PURE;
+ STDMETHOD(SetMoniker) (THIS_ DWORD dwWhichMoniker, LPMONIKER pmk) PURE;
+ STDMETHOD(GetMoniker) (THIS_ DWORD dwAssign, DWORD dwWhichMoniker,
+ LPMONIKER FAR* ppmk) PURE;
+ STDMETHOD(InitFromData) (THIS_ LPDATAOBJECT pDataObject,
+ BOOL fCreation,
+ DWORD dwReserved) PURE;
+ STDMETHOD(GetClipboardData) (THIS_ DWORD dwReserved,
+ LPDATAOBJECT FAR* ppDataObject) PURE;
+ STDMETHOD(DoVerb) (THIS_ LONG iVerb,
+ LPMSG lpmsg,
+ LPOLECLIENTSITE pActiveSite,
+ LONG lindex,
+ HWND hwndParent,
+ LPCRECT lprcPosRect) PURE;
+ STDMETHOD(EnumVerbs) (THIS_ LPENUMOLEVERB FAR* ppenumOleVerb) PURE;
+ STDMETHOD(Update) (THIS) PURE;
+ STDMETHOD(IsUpToDate) (THIS) PURE;
+ STDMETHOD(GetUserClassID) (THIS_ CLSID FAR* pClsid) PURE;
+ STDMETHOD(GetUserType) (THIS_ DWORD dwFormOfType, LPSTR FAR* pszUserType) PURE;
+ STDMETHOD(SetExtent) (THIS_ DWORD dwDrawAspect, LPSIZEL lpsizel) PURE;
+ STDMETHOD(GetExtent) (THIS_ DWORD dwDrawAspect, LPSIZEL lpsizel) PURE;
+
+ STDMETHOD(Advise)(THIS_ LPADVISESINK pAdvSink, DWORD FAR* pdwConnection) PURE;
+ STDMETHOD(Unadvise)(THIS_ DWORD dwConnection) PURE;
+ STDMETHOD(EnumAdvise) (THIS_ LPENUMSTATDATA FAR* ppenumAdvise) PURE;
+ STDMETHOD(GetMiscStatus) (THIS_ DWORD dwAspect, DWORD FAR* pdwStatus) PURE;
+ STDMETHOD(SetColorScheme) (THIS_ LPLOGPALETTE lpLogpal) PURE;
+};
+typedef IOleObject FAR* LPOLEOBJECT;
+
+
+
+#undef INTERFACE
+#define INTERFACE IOleClientSite
+
+DECLARE_INTERFACE_(IOleClientSite, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleClientSite methods ***
+ STDMETHOD(SaveObject) (THIS) PURE;
+ STDMETHOD(GetMoniker) (THIS_ DWORD dwAssign, DWORD dwWhichMoniker,
+ LPMONIKER FAR* ppmk) PURE;
+ STDMETHOD(GetContainer) (THIS_ LPOLECONTAINER FAR* ppContainer) PURE;
+ STDMETHOD(ShowObject) (THIS) PURE;
+ STDMETHOD(OnShowWindow) (THIS_ BOOL fShow) PURE;
+ STDMETHOD(RequestNewObjectLayout) (THIS) PURE;
+};
+typedef IOleClientSite FAR* LPOLECLIENTSITE;
+
+
+/****** OLE Runnable Object Interface **********************************/
+
+#undef INTERFACE
+#define INTERFACE IRunnableObject
+
+DECLARE_INTERFACE_(IRunnableObject, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IRunnableObject methods ***
+ STDMETHOD(GetRunningClass) (THIS_ LPCLSID lpClsid) PURE;
+ STDMETHOD(Run) (THIS_ LPBINDCTX pbc) PURE;
+ STDMETHOD_(BOOL, IsRunning) (THIS) PURE;
+ STDMETHOD(LockRunning)(THIS_ BOOL fLock, BOOL fLastUnlockCloses) PURE;
+ STDMETHOD(SetContainedObject)(THIS_ BOOL fContained) PURE;
+};
+typedef IRunnableObject FAR* LPRUNNABLEOBJECT;
+
+
+/****** OLE Container Interfaces ***************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IParseDisplayName
+
+DECLARE_INTERFACE_(IParseDisplayName, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IParseDisplayName method ***
+ STDMETHOD(ParseDisplayName) (THIS_ LPBC pbc, LPSTR lpszDisplayName,
+ ULONG FAR* pchEaten, LPMONIKER FAR* ppmkOut) PURE;
+};
+typedef IParseDisplayName FAR* LPPARSEDISPLAYNAME;
+
+
+#undef INTERFACE
+#define INTERFACE IOleContainer
+
+DECLARE_INTERFACE_(IOleContainer, IParseDisplayName)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IParseDisplayName method ***
+ STDMETHOD(ParseDisplayName) (THIS_ LPBC pbc, LPSTR lpszDisplayName,
+ ULONG FAR* pchEaten, LPMONIKER FAR* ppmkOut) PURE;
+
+ // *** IOleContainer methods ***
+ STDMETHOD(EnumObjects) ( DWORD grfFlags, LPENUMUNKNOWN FAR* ppenumUnknown) PURE;
+ STDMETHOD(LockContainer) (THIS_ BOOL fLock) PURE;
+};
+typedef IOleContainer FAR* LPOLECONTAINER;
+
+
+typedef enum tagBINDSPEED
+{
+ BINDSPEED_INDEFINITE = 1,
+ BINDSPEED_MODERATE = 2,
+ BINDSPEED_IMMEDIATE = 3
+} BINDSPEED;
+
+typedef enum tagOLECONTF
+{
+ OLECONTF_EMBEDDINGS = 1,
+ OLECONTF_LINKS = 2,
+ OLECONTF_OTHERS = 4,
+ OLECONTF_ONLYUSER = 8,
+ OLECONTF_ONLYIFRUNNING = 16
+} OLECONTF;
+
+
+#undef INTERFACE
+#define INTERFACE IOleItemContainer
+
+DECLARE_INTERFACE_(IOleItemContainer, IOleContainer)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IParseDisplayName method ***
+ STDMETHOD(ParseDisplayName) (THIS_ LPBC pbc, LPSTR lpszDisplayName,
+ ULONG FAR* pchEaten, LPMONIKER FAR* ppmkOut) PURE;
+
+ // *** IOleContainer methods ***
+ STDMETHOD(EnumObjects) (THIS_ DWORD grfFlags, LPENUMUNKNOWN FAR* ppenumUnknown) PURE;
+ STDMETHOD(LockContainer) (THIS_ BOOL fLock) PURE;
+
+ // *** IOleItemContainer methods ***
+ STDMETHOD(GetObject) (THIS_ LPSTR lpszItem, DWORD dwSpeedNeeded,
+ LPBINDCTX pbc, REFIID riid, LPVOID FAR* ppvObject) PURE;
+ STDMETHOD(GetObjectStorage) (THIS_ LPSTR lpszItem, LPBINDCTX pbc,
+ REFIID riid, LPVOID FAR* ppvStorage) PURE;
+ STDMETHOD(IsRunning) (THIS_ LPSTR lpszItem) PURE;
+};
+typedef IOleItemContainer FAR* LPOLEITEMCONTAINER;
+
+
+/****** OLE Advise Holder Interface ***************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IOleAdviseHolder
+
+DECLARE_INTERFACE_(IOleAdviseHolder, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppv) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleAdviseHolder methods ***
+ STDMETHOD(Advise)(THIS_ LPADVISESINK pAdvise, DWORD FAR* pdwConnection) PURE;
+ STDMETHOD(Unadvise)(THIS_ DWORD dwConnection) PURE;
+ STDMETHOD(EnumAdvise)(THIS_ LPENUMSTATDATA FAR* ppenumAdvise) PURE;
+
+ STDMETHOD(SendOnRename)(THIS_ LPMONIKER pmk) PURE;
+ STDMETHOD(SendOnSave)(THIS) PURE;
+ STDMETHOD(SendOnClose)(THIS) PURE;
+};
+typedef IOleAdviseHolder FAR* LPOLEADVISEHOLDER;
+
+
+/****** OLE Link Interface ************************************************/
+
+/* Link update options */
+typedef enum tagOLEUPDATE
+{
+ OLEUPDATE_ALWAYS=1,
+ OLEUPDATE_ONCALL=3
+} OLEUPDATE;
+typedef OLEUPDATE FAR* LPOLEUPDATE;
+
+
+// for IOleLink::BindToSource
+typedef enum tagOLELINKBIND
+{
+ OLELINKBIND_EVENIFCLASSDIFF = 1,
+} OLELINKBIND;
+
+
+#undef INTERFACE
+#define INTERFACE IOleLink
+
+DECLARE_INTERFACE_(IOleLink, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleLink methods ***
+ STDMETHOD(SetUpdateOptions) (THIS_ DWORD dwUpdateOpt) PURE;
+ STDMETHOD(GetUpdateOptions) (THIS_ LPDWORD pdwUpdateOpt) PURE;
+ STDMETHOD(SetSourceMoniker) (THIS_ LPMONIKER pmk, REFCLSID rclsid) PURE;
+ STDMETHOD(GetSourceMoniker) (THIS_ LPMONIKER FAR* ppmk) PURE;
+ STDMETHOD(SetSourceDisplayName) (THIS_ LPCSTR lpszDisplayName) PURE;
+ STDMETHOD(GetSourceDisplayName) (THIS_ LPSTR FAR* lplpszDisplayName) PURE;
+ STDMETHOD(BindToSource) (THIS_ DWORD bindflags, LPBINDCTX pbc) PURE;
+ STDMETHOD(BindIfRunning) (THIS) PURE;
+ STDMETHOD(GetBoundSource) (THIS_ LPUNKNOWN FAR* ppUnk) PURE;
+ STDMETHOD(UnbindSource) (THIS) PURE;
+ STDMETHOD(Update) (THIS_ LPBINDCTX pbc) PURE;
+};
+typedef IOleLink FAR* LPOLELINK;
+
+
+/****** OLE InPlace Editing Interfaces ************************************/
+
+#ifdef _MAC
+typedef Handle HOLEMENU;
+typedef long SIZE;
+typedef long HACCEL;
+#else
+DECLARE_HANDLE(HOLEMENU);
+#endif
+
+typedef struct FARSTRUCT tagOIFI // OleInPlaceFrameInfo
+{
+ UINT cb;
+ BOOL fMDIApp;
+ HWND hwndFrame;
+ HACCEL haccel;
+ int cAccelEntries;
+} OLEINPLACEFRAMEINFO, FAR* LPOLEINPLACEFRAMEINFO;
+
+
+typedef struct FARSTRUCT tagOleMenuGroupWidths
+{
+ LONG width[6];
+} OLEMENUGROUPWIDTHS, FAR* LPOLEMENUGROUPWIDTHS;
+
+typedef RECT BORDERWIDTHS;
+typedef LPRECT LPBORDERWIDTHS;
+typedef LPCRECT LPCBORDERWIDTHS;
+
+/* Inplace editing specific error codes */
+
+#define INPLACE_E_NOTUNDOABLE (INPLACE_E_FIRST)
+// undo is not avaiable
+
+#define INPLACE_E_NOTOOLSPACE (INPLACE_E_FIRST+1)
+// Space for tools is not available
+
+#define INPLACE_S_TRUNCATED (INPLACE_S_FIRST)
+// Message is too long, some of it had to be truncated before displaying
+
+//misc definitions
+#define INPLACE_DEFBORDERWIDTH 4
+
+// forward type declarations
+#if defined(__cplusplus)
+interface IOleInPlaceUIWindow;
+#else
+typedef interface IOleInPlaceUIWindow IOleInPlaceUIWindow;
+#endif
+
+typedef IOleInPlaceUIWindow FAR* LPOLEINPLACEUIWINDOW;
+
+
+#undef INTERFACE
+#define INTERFACE IOleWindow
+
+DECLARE_INTERFACE_(IOleWindow, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND FAR* lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+};
+
+typedef IOleWindow FAR* LPOLEWINDOW;
+
+
+
+#undef INTERFACE
+#define INTERFACE IOleInPlaceObject
+
+DECLARE_INTERFACE_(IOleInPlaceObject, IOleWindow)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND FAR* lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+
+ // *** IOleInPlaceObject methods ***
+ STDMETHOD(InPlaceDeactivate) (THIS) PURE;
+ STDMETHOD(UIDeactivate) (THIS) PURE;
+ STDMETHOD(SetObjectRects) (THIS_ LPCRECT lprcPosRect,
+ LPCRECT lprcClipRect) PURE;
+ STDMETHOD(ReactivateAndUndo) (THIS) PURE;
+};
+typedef IOleInPlaceObject FAR* LPOLEINPLACEOBJECT;
+
+
+
+#undef INTERFACE
+#define INTERFACE IOleInPlaceActiveObject
+
+DECLARE_INTERFACE_(IOleInPlaceActiveObject, IOleWindow)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND FAR* lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+
+ // *** IOleInPlaceActiveObject methods ***
+ STDMETHOD(TranslateAccelerator) (THIS_ LPMSG lpmsg) PURE;
+ STDMETHOD(OnFrameWindowActivate) (THIS_ BOOL fActivate) PURE;
+ STDMETHOD(OnDocWindowActivate) (THIS_ BOOL fActivate) PURE;
+ STDMETHOD(ResizeBorder) (THIS_ LPCRECT lprectBorder, LPOLEINPLACEUIWINDOW lpUIWindow, BOOL fFrameWindow) PURE;
+ STDMETHOD(EnableModeless) (THIS_ BOOL fEnable) PURE;
+};
+typedef IOleInPlaceActiveObject FAR* LPOLEINPLACEACTIVEOBJECT;
+
+
+
+#undef INTERFACE
+#define INTERFACE IOleInPlaceUIWindow
+
+DECLARE_INTERFACE_(IOleInPlaceUIWindow, IOleWindow)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND FAR* lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+
+ // *** IOleInPlaceUIWindow methods ***
+ STDMETHOD(GetBorder) (THIS_ LPRECT lprectBorder) PURE;
+ STDMETHOD(RequestBorderSpace) (THIS_ LPCBORDERWIDTHS lpborderwidths) PURE;
+ STDMETHOD(SetBorderSpace) (THIS_ LPCBORDERWIDTHS lpborderwidths) PURE;
+ STDMETHOD(SetActiveObject) (THIS_ LPOLEINPLACEACTIVEOBJECT lpActiveObject,
+ LPCSTR lpszObjName) PURE;
+};
+typedef IOleInPlaceUIWindow FAR* LPOLEINPLACEUIWINDOW;
+
+
+
+#undef INTERFACE
+#define INTERFACE IOleInPlaceFrame
+
+DECLARE_INTERFACE_(IOleInPlaceFrame, IOleInPlaceUIWindow)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND FAR* lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+
+ // *** IOleInPlaceUIWindow methods ***
+ STDMETHOD(GetBorder) (THIS_ LPRECT lprectBorder) PURE;
+ STDMETHOD(RequestBorderSpace) (THIS_ LPCBORDERWIDTHS lpborderwidths) PURE;
+ STDMETHOD(SetBorderSpace) (THIS_ LPCBORDERWIDTHS lpborderwidths) PURE;
+ STDMETHOD(SetActiveObject) (THIS_ LPOLEINPLACEACTIVEOBJECT lpActiveObject,
+ LPCSTR lpszObjName) PURE;
+
+
+ // *** IOleInPlaceFrame methods ***
+ STDMETHOD(InsertMenus) (THIS_ HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) PURE;
+ STDMETHOD(SetMenu) (THIS_ HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject) PURE;
+ STDMETHOD(RemoveMenus) (THIS_ HMENU hmenuShared) PURE;
+ STDMETHOD(SetStatusText) (THIS_ LPCSTR lpszStatusText) PURE;
+ STDMETHOD(EnableModeless) (THIS_ BOOL fEnable) PURE;
+ STDMETHOD(TranslateAccelerator) (THIS_ LPMSG lpmsg, WORD wID) PURE;
+};
+typedef IOleInPlaceFrame FAR* LPOLEINPLACEFRAME;
+
+
+#undef INTERFACE
+#define INTERFACE IOleInPlaceSite
+
+DECLARE_INTERFACE_(IOleInPlaceSite, IOleWindow)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND FAR* lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+
+ // *** IOleInPlaceSite methods ***
+ STDMETHOD(CanInPlaceActivate) (THIS) PURE;
+ STDMETHOD(OnInPlaceActivate) (THIS) PURE;
+ STDMETHOD(OnUIActivate) (THIS) PURE;
+ STDMETHOD(GetWindowContext) (THIS_ LPOLEINPLACEFRAME FAR* lplpFrame,
+ LPOLEINPLACEUIWINDOW FAR* lplpDoc,
+ LPRECT lprcPosRect,
+ LPRECT lprcClipRect,
+ LPOLEINPLACEFRAMEINFO lpFrameInfo) PURE;
+ STDMETHOD(Scroll) (THIS_ SIZE scrollExtent) PURE;
+ STDMETHOD(OnUIDeactivate) (THIS_ BOOL fUndoable) PURE;
+ STDMETHOD(OnInPlaceDeactivate) (THIS) PURE;
+ STDMETHOD(DiscardUndoState) (THIS) PURE;
+ STDMETHOD(DeactivateAndUndo) (THIS) PURE;
+ STDMETHOD(OnPosRectChange) (THIS_ LPCRECT lprcPosRect) PURE;
+};
+typedef IOleInPlaceSite FAR* LPOLEINPLACESITE;
+
+
+
+/****** OLE API Prototypes ************************************************/
+
+STDAPI_(DWORD) OleBuildVersion( VOID );
+
+/* helper functions */
+STDAPI ReadClassStg(LPSTORAGE pStg, CLSID FAR* pclsid);
+STDAPI WriteClassStg(LPSTORAGE pStg, REFCLSID rclsid);
+STDAPI ReadClassStm(LPSTREAM pStm, CLSID FAR* pclsid);
+STDAPI WriteClassStm(LPSTREAM pStm, REFCLSID rclsid);
+STDAPI WriteFmtUserTypeStg (LPSTORAGE pstg, CLIPFORMAT cf, LPSTR lpszUserType);
+STDAPI ReadFmtUserTypeStg (LPSTORAGE pstg, CLIPFORMAT FAR* pcf, LPSTR FAR* lplpszUserType);
+
+
+/* init/term */
+
+STDAPI OleInitialize(LPMALLOC pMalloc);
+STDAPI_(void) OleUninitialize(void);
+
+
+/* APIs to query whether (Embedded/Linked) object can be created from
+ the data object */
+
+STDAPI OleQueryLinkFromData(LPDATAOBJECT pSrcDataObject);
+STDAPI OleQueryCreateFromData(LPDATAOBJECT pSrcDataObject);
+
+
+/* Object creation APIs */
+
+STDAPI OleCreate(REFCLSID rclsid, REFIID riid, DWORD renderopt,
+ LPFORMATETC pFormatEtc, LPOLECLIENTSITE pClientSite,
+ LPSTORAGE pStg, LPVOID FAR* ppvObj);
+
+STDAPI OleCreateFromData(LPDATAOBJECT pSrcDataObj, REFIID riid,
+ DWORD renderopt, LPFORMATETC pFormatEtc,
+ LPOLECLIENTSITE pClientSite, LPSTORAGE pStg,
+ LPVOID FAR* ppvObj);
+
+STDAPI OleCreateLinkFromData(LPDATAOBJECT pSrcDataObj, REFIID riid,
+ DWORD renderopt, LPFORMATETC pFormatEtc,
+ LPOLECLIENTSITE pClientSite, LPSTORAGE pStg,
+ LPVOID FAR* ppvObj);
+
+STDAPI OleCreateStaticFromData(LPDATAOBJECT pSrcDataObj, REFIID iid,
+ DWORD renderopt, LPFORMATETC pFormatEtc,
+ LPOLECLIENTSITE pClientSite, LPSTORAGE pStg,
+ LPVOID FAR* ppvObj);
+
+
+STDAPI OleCreateLink(LPMONIKER pmkLinkSrc, REFIID riid,
+ DWORD renderopt, LPFORMATETC lpFormatEtc,
+ LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID FAR* ppvObj);
+
+STDAPI OleCreateLinkToFile(LPCSTR lpszFileName, REFIID riid,
+ DWORD renderopt, LPFORMATETC lpFormatEtc,
+ LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID FAR* ppvObj);
+
+STDAPI OleCreateFromFile(REFCLSID rclsid, LPCSTR lpszFileName, REFIID riid,
+ DWORD renderopt, LPFORMATETC lpFormatEtc,
+ LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID FAR* ppvObj);
+
+STDAPI OleLoad(LPSTORAGE pStg, REFIID riid, LPOLECLIENTSITE pClientSite,
+ LPVOID FAR* ppvObj);
+
+STDAPI OleSave(LPPERSISTSTORAGE pPS, LPSTORAGE pStg, BOOL fSameAsLoad);
+
+STDAPI OleLoadFromStream( LPSTREAM pStm, REFIID iidInterface, LPVOID FAR* ppvObj);
+STDAPI OleSaveToStream( LPPERSISTSTREAM pPStm, LPSTREAM pStm );
+
+
+STDAPI OleSetContainedObject(LPUNKNOWN pUnknown, BOOL fContained);
+STDAPI OleNoteObjectVisible(LPUNKNOWN pUnknown, BOOL fVisible);
+
+
+/* Drag/Drop APIs */
+
+STDAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget);
+STDAPI RevokeDragDrop(HWND hwnd);
+STDAPI DoDragDrop(LPDATAOBJECT pDataObj, LPDROPSOURCE pDropSource,
+ DWORD dwOKEffects, LPDWORD pdwEffect);
+
+/* Clipboard APIs */
+
+STDAPI OleSetClipboard(LPDATAOBJECT pDataObj);
+STDAPI OleGetClipboard(LPDATAOBJECT FAR* ppDataObj);
+STDAPI OleFlushClipboard(void);
+STDAPI OleIsCurrentClipboard(LPDATAOBJECT pDataObj);
+
+
+/* InPlace Editing APIs */
+
+STDAPI_(HOLEMENU) OleCreateMenuDescriptor (HMENU hmenuCombined,
+ LPOLEMENUGROUPWIDTHS lpMenuWidths);
+STDAPI OleSetMenuDescriptor (HOLEMENU holemenu, HWND hwndFrame,
+ HWND hwndActiveObject,
+ LPOLEINPLACEFRAME lpFrame,
+ LPOLEINPLACEACTIVEOBJECT lpActiveObj);
+STDAPI OleDestroyMenuDescriptor (HOLEMENU holemenu);
+
+STDAPI OleTranslateAccelerator (LPOLEINPLACEFRAME lpFrame,
+ LPOLEINPLACEFRAMEINFO lpFrameInfo, LPMSG lpmsg);
+
+
+/* Helper APIs */
+STDAPI_(HANDLE) OleDuplicateData (HANDLE hSrc, CLIPFORMAT cfFormat,
+ UINT uiFlags);
+
+STDAPI OleDraw (LPUNKNOWN pUnknown, DWORD dwAspect, HDC hdcDraw,
+ LPCRECT lprcBounds);
+
+STDAPI OleRun(LPUNKNOWN pUnknown);
+STDAPI_(BOOL) OleIsRunning(LPOLEOBJECT pObject);
+STDAPI OleLockRunning(LPUNKNOWN pUnknown, BOOL fLock, BOOL fLastUnlockCloses);
+
+STDAPI_(void) ReleaseStgMedium(LPSTGMEDIUM);
+STDAPI CreateOleAdviseHolder(LPOLEADVISEHOLDER FAR* ppOAHolder);
+
+STDAPI OleCreateDefaultHandler(REFCLSID clsid, LPUNKNOWN pUnkOuter,
+ REFIID riid, LPVOID FAR* lplpObj);
+
+STDAPI OleCreateEmbeddingHelper(REFCLSID clsid, LPUNKNOWN pUnkOuter,
+ DWORD flags, LPCLASSFACTORY pCF,
+ REFIID riid, LPVOID FAR* lplpObj);
+
+STDAPI_(BOOL) IsAccelerator(HACCEL hAccel, int cAccelEntries, LPMSG lpMsg,
+ WORD FAR* lpwCmd);
+
+
+/* Icon extraction Helper APIs */
+
+STDAPI_(HGLOBAL) OleGetIconOfFile(LPSTR lpszPath, BOOL fUseFileAsLabel);
+
+STDAPI_(HGLOBAL) OleGetIconOfClass(REFCLSID rclsid, LPSTR lpszLabel,
+ BOOL fUseTypeAsLabel);
+
+STDAPI_(HGLOBAL) OleMetafilePictFromIconAndLabel(HICON hIcon, LPSTR lpszLabel,
+ LPSTR lpszSourceFile, UINT iIconIndex);
+
+
+
+/* Registration Database Helper APIs */
+
+STDAPI OleRegGetUserType (REFCLSID clsid, DWORD dwFormOfType,
+ LPSTR FAR* pszUserType);
+
+STDAPI OleRegGetMiscStatus (REFCLSID clsid, DWORD dwAspect,
+ DWORD FAR* pdwStatus);
+
+STDAPI OleRegEnumFormatEtc (REFCLSID clsid, DWORD dwDirection,
+ LPENUMFORMATETC FAR* ppenum);
+
+STDAPI OleRegEnumVerbs (REFCLSID clsid, LPENUMOLEVERB FAR* ppenum);
+
+
+
+/* OLE 1.0 conversion APIS */
+
+STDAPI OleConvertIStorageToOLESTREAM
+ (LPSTORAGE pstg,
+ LPOLESTREAM polestm);
+
+STDAPI OleConvertOLESTREAMToIStorage
+ (LPOLESTREAM polestm,
+ LPSTORAGE pstg,
+ const DVTARGETDEVICE FAR* ptd);
+
+STDAPI OleConvertIStorageToOLESTREAMEx
+ (LPSTORAGE pstg,
+ // Presentation data to OLESTREAM
+ CLIPFORMAT cfFormat, // format
+ LONG lWidth, // width
+ LONG lHeight, // height
+ DWORD dwSize, // size in bytes
+ LPSTGMEDIUM pmedium, // bits
+ LPOLESTREAM polestm);
+
+STDAPI OleConvertOLESTREAMToIStorageEx
+ (LPOLESTREAM polestm,
+ LPSTORAGE pstg,
+ // Presentation data from OLESTREAM
+ CLIPFORMAT FAR* pcfFormat, // format
+ LONG FAR* plwWidth, // width
+ LONG FAR* plHeight, // height
+ DWORD FAR* pdwSize, // size in bytes
+ LPSTGMEDIUM pmedium); // bits
+
+
+
+/* Storage Utility APIs */
+STDAPI GetHGlobalFromILockBytes (LPLOCKBYTES plkbyt, HGLOBAL FAR* phglobal);
+STDAPI CreateILockBytesOnHGlobal (HGLOBAL hGlobal, BOOL fDeleteOnRelease,
+ LPLOCKBYTES FAR* pplkbyt);
+
+STDAPI GetHGlobalFromStream (LPSTREAM pstm, HGLOBAL FAR* phglobal);
+STDAPI CreateStreamOnHGlobal (HGLOBAL hGlobal, BOOL fDeleteOnRelease,
+ LPSTREAM FAR* ppstm);
+
+
+/* ConvertTo APIS */
+
+STDAPI OleDoAutoConvert(LPSTORAGE pStg, LPCLSID pClsidNew);
+STDAPI OleGetAutoConvert(REFCLSID clsidOld, LPCLSID pClsidNew);
+STDAPI OleSetAutoConvert(REFCLSID clsidOld, REFCLSID clsidNew);
+STDAPI GetConvertStg(LPSTORAGE pStg);
+STDAPI SetConvertStg(LPSTORAGE pStg, BOOL fConvert);
+
+
+#endif // _OLE2_H_
diff --git a/private/oleauto/ole/win16/ole2.reg b/private/oleauto/ole/win16/ole2.reg
new file mode 100644
index 000000000..fe992a65b
--- /dev/null
+++ b/private/oleauto/ole/win16/ole2.reg
@@ -0,0 +1,460 @@
+REGEDIT
+
+//
+// The values of the following keys need to be localized
+//
+// LANGUAGE: USA
+//
+
+; The string "Edit" below is to be localized.
+HKEY_CLASSES_ROOT\Software\Microsoft\OLE1\UnregisteredVerb = Edit
+
+; The string "Unknown" below is to be localized.
+HKEY_CLASSES_ROOT\Software\Microsoft\OLE2\UnknownUserType = Unknown
+
+; The string "Picture (Metafile)" is to be localized.
+HKEY_CLASSES_ROOT\StaticMetafile = Picture (Metafile)
+HKEY_CLASSES_ROOT\CLSID\{00000315-0000-0000-C000-000000000046} = Picture (Metafile)
+
+; The string "Picture" is to be localized.
+HKEY_CLASSES_ROOT\CLSID\{00000315-0000-0000-C000-000000000046}\AuxUserType\2 = Picture
+HKEY_CLASSES_ROOT\CLSID\{00000316-0000-0000-C000-000000000046}\AuxUserType\2 = Picture
+
+; The string "Picture (Device Independent Bitmap)" is to be localized.
+HKEY_CLASSES_ROOT\StaticDib = Picture (Device Independent Bitmap)
+HKEY_CLASSES_ROOT\CLSID\{00000316-0000-0000-C000-000000000046} = Picture (Device Independent Bitmap)
+
+; The string "Paintbrush Picture" is to be localized.
+HKEY_CLASSES_ROOT\CLSID\{0003000a-0000-0000-C000-000000000046} = Paintbrush Picture
+
+; The string "Microsoft Drawing" is to be localized.
+HKEY_CLASSES_ROOT\CLSID\{00030007-0000-0000-C000-000000000046} = Microsoft Drawing
+
+; The string "OLE (Part * of 5)" below is to be localized.
+HKEY_CLASSES_ROOT\CLSID = OLE (Part 1 of 5)
+HKEY_CLASSES_ROOT\Software = OLE (Part 2 of 5)
+HKEY_CLASSES_ROOT\Interface = OLE (Part 3 of 5)
+HKEY_CLASSES_ROOT\TypeLib = OLE (Part 4 of 5)
+HKEY_CLASSES_ROOT\FileType = OLE (Part 5 of 5)
+
+// -------------------- NO LOCALIZATION NECESSARY BELOW THIS LINE ------------
+
+; registration info for ole2 private classes
+
+HKEY_CLASSES_ROOT\CLSID\{00000300-0000-0000-C000-000000000046} = StdOleLink
+HKEY_CLASSES_ROOT\CLSID\{00000300-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000301-0000-0000-C000-000000000046} = StdMemStm
+HKEY_CLASSES_ROOT\CLSID\{00000301-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000302-0000-0000-C000-000000000046} = StdMemBytes
+HKEY_CLASSES_ROOT\CLSID\{00000302-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000303-0000-0000-C000-000000000046} = FileMoniker
+HKEY_CLASSES_ROOT\CLSID\{00000303-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000304-0000-0000-C000-000000000046} = ItemMoniker
+HKEY_CLASSES_ROOT\CLSID\{00000304-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000305-0000-0000-C000-000000000046} = AntiMoniker
+HKEY_CLASSES_ROOT\CLSID\{00000305-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000306-0000-0000-C000-000000000046} = PointerMoniker
+HKEY_CLASSES_ROOT\CLSID\{00000306-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+; 307 used to be CDdeFileMoniker
+
+HKEY_CLASSES_ROOT\CLSID\{00000308-0000-0000-C000-000000000046} = PackagerMoniker
+HKEY_CLASSES_ROOT\CLSID\{00000308-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000309-0000-0000-C000-000000000046} = CompositeMoniker
+HKEY_CLASSES_ROOT\CLSID\{00000309-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{0000030A-0000-0000-C000-000000000046} = DdeCompositeMoniker
+HKEY_CLASSES_ROOT\CLSID\{0000030A-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+HKEY_CLASSES_ROOT\CLSID\{0000030B-0000-0000-C000-000000000046} = DfMarshal
+HKEY_CLASSES_ROOT\CLSID\{0000030B-0000-0000-C000-000000000046}\InprocServer = storage.dll
+
+
+// servers for proxy/stub objects
+HKEY_CLASSES_ROOT\CLSID\{0000030C-0000-0000-C000-000000000046} = PSGenObject
+HKEY_CLASSES_ROOT\CLSID\{0000030C-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+HKEY_CLASSES_ROOT\CLSID\{0000030D-0000-0000-C000-000000000046} = PSClientSite
+HKEY_CLASSES_ROOT\CLSID\{0000030D-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+HKEY_CLASSES_ROOT\CLSID\{0000030E-0000-0000-C000-000000000046} = PSClassObject
+HKEY_CLASSES_ROOT\CLSID\{0000030E-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+HKEY_CLASSES_ROOT\CLSID\{0000030F-0000-0000-C000-000000000046} = PSInPlaceActive
+HKEY_CLASSES_ROOT\CLSID\{0000030F-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000310-0000-0000-C000-000000000046} = PSInPlaceFrame
+HKEY_CLASSES_ROOT\CLSID\{00000310-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000311-0000-0000-C000-000000000046} = PSDragDrop
+HKEY_CLASSES_ROOT\CLSID\{00000311-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000312-0000-0000-C000-000000000046} = PSBindCtx
+HKEY_CLASSES_ROOT\CLSID\{00000312-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000313-0000-0000-C000-000000000046} = PSEnumerators
+HKEY_CLASSES_ROOT\CLSID\{00000313-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00000314-0000-0000-C000-000000000046} = PSStore
+HKEY_CLASSES_ROOT\CLSID\{00000314-0000-0000-C000-000000000046}\InprocServer = ole2prox.dll
+
+
+//
+//StaticMetafile
+//
+;Root level key
+HKEY_CLASSES_ROOT\StaticMetafile\CLSID = {00000315-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\CLSID\{00000315-0000-0000-C000-000000000046}\ProgID = StaticMetafile
+
+HKEY_CLASSES_ROOT\CLSID\{00000315-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+
+; Default File Format = CF_METAFILEPICT
+HKEY_CLASSES_ROOT\CLSID\{00000315-0000-0000-C000-000000000046}\DataFormats\DefaultFile = 3
+
+; Format 0 = CF_METAFILEPICT, DVASPECT_CONTENT, TYMED_MFPICT, DATADIR_BOTH
+HKEY_CLASSES_ROOT\CLSID\{00000315-0000-0000-C000-000000000046}\DataFormats\GetSet\0 = 3,1,32,3
+
+; MiscStatus = OLEMISC_STATIC | OLEMISC_CANTLINKINSIDE | OLEMISC_RENDERINGISDEVICEINDEPENDENT = 8 + 16 + 512
+HKEY_CLASSES_ROOT\CLSID\{00000315-0000-0000-C000-000000000046}\MiscStatus = 536
+; Readable format = CF_METAFILEPICT
+HKEY_CLASSES_ROOT\CLSID\{00000315-0000-0000-C000-000000000046}\Conversion\Readable\Main = 3,MSDraw
+
+
+//
+//StaticDib
+//
+
+; Root level keys
+HKEY_CLASSES_ROOT\StaticDib\CLSID = {00000316-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\CLSID\{00000316-0000-0000-C000-000000000046}\ProgID = StaticDib
+
+HKEY_CLASSES_ROOT\CLSID\{00000316-0000-0000-C000-000000000046}\InprocServer = ole2.dll
+
+
+
+; Default File Format = CF_DIB
+HKEY_CLASSES_ROOT\CLSID\{00000316-0000-0000-C000-000000000046}\DataFormats\DefaultFile = 8
+
+; Format 0 = CF_DIB, DVASPECT_CONTENT, TYMED_HGLOBAL, DATADIR_BOTH
+HKEY_CLASSES_ROOT\CLSID\{00000316-0000-0000-C000-000000000046}\DataFormats\GetSet\0 = 8,1,1,3
+
+; MiscStatus = OLEMISC_STATIC | OLEMISC_CANTLINKINSIDE | OLEMISC_RENDERINGISDEVICEINDEPENDENT = 8 + 16 + 512
+HKEY_CLASSES_ROOT\CLSID\{00000316-0000-0000-C000-000000000046}\MiscStatus = 536
+
+; Readable format = CF_DIB
+HKEY_CLASSES_ROOT\CLSID\{00000316-0000-0000-C000-000000000046}\Conversion\Readable\Main = 8,PBrush
+
+
+//
+//PBrush
+//
+
+; ProgID
+HKEY_CLASSES_ROOT\CLSID\{0003000a-0000-0000-C000-000000000046}\ProgID = PBrush
+
+; Ole1Class
+HKEY_CLASSES_ROOT\CLSID\{0003000a-0000-0000-C000-000000000046}\Ole1Class = PBrush
+
+
+; MiscStatus = OLEMISC_RENDERINGISDEVICEINDEPENDENT = 512
+HKEY_CLASSES_ROOT\CLSID\{0003000a-0000-0000-C000-000000000046}\MiscStatus = 512
+
+; Readwritable format = CF_DIB
+HKEY_CLASSES_ROOT\CLSID\{0003000a-0000-0000-C000-000000000046}\Conversion\Readable\Main = 8
+
+//
+// MSDraw
+//
+
+; ProgID
+HKEY_CLASSES_ROOT\CLSID\{00030007-0000-0000-C000-000000000046}\ProgID = MSDraw
+
+; Ole1Class
+HKEY_CLASSES_ROOT\CLSID\{00030007-0000-0000-C000-000000000046}\Ole1Class = MSDraw
+
+; MiscStatus = OLEMISC_RENDERINGISDEVICEINDEPENDENT = 512
+HKEY_CLASSES_ROOT\CLSID\{00030007-0000-0000-C000-000000000046}\MiscStatus = 512
+
+
+// maps IIDs into proxy/stub class id
+HKEY_CLASSES_ROOT\Interface\{00000000-0000-0000-C000-000000000046} = IUnknown
+HKEY_CLASSES_ROOT\Interface\{00000000-0000-0000-C000-000000000046}\BaseInterface =
+HKEY_CLASSES_ROOT\Interface\{00000000-0000-0000-C000-000000000046}\NumMethods = 3
+
+HKEY_CLASSES_ROOT\Interface\{00000001-0000-0000-C000-000000000046} = IClassFactory
+HKEY_CLASSES_ROOT\Interface\{00000001-0000-0000-C000-000000000046}\NumMethods = 5
+HKEY_CLASSES_ROOT\Interface\{00000001-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030E-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000002-0000-0000-C000-000000000046} = IMalloc
+HKEY_CLASSES_ROOT\Interface\{00000002-0000-0000-C000-000000000046}\NumMethods = 9
+
+HKEY_CLASSES_ROOT\Interface\{00000003-0000-0000-C000-000000000046} = IMarshal
+HKEY_CLASSES_ROOT\Interface\{00000003-0000-0000-C000-000000000046}\NumMethods = 9
+
+HKEY_CLASSES_ROOT\Interface\{00000004-0000-0000-C000-000000000046} = IRpcChannel
+HKEY_CLASSES_ROOT\Interface\{00000004-0000-0000-C000-000000000046}\NumMethods = 7
+
+HKEY_CLASSES_ROOT\Interface\{00000005-0000-0000-C000-000000000046} = IRpcStub
+HKEY_CLASSES_ROOT\Interface\{00000005-0000-0000-C000-000000000046}\NumMethods = 8
+
+HKEY_CLASSES_ROOT\Interface\{00000007-0000-0000-C000-000000000046} = IRpcProxy
+HKEY_CLASSES_ROOT\Interface\{00000007-0000-0000-C000-000000000046}\NumMethods = 5
+
+HKEY_CLASSES_ROOT\Interface\{00000009-0000-0000-C000-000000000046} = IPSFactory
+HKEY_CLASSES_ROOT\Interface\{00000009-0000-0000-C000-000000000046}\NumMethods = 5
+
+HKEY_CLASSES_ROOT\Interface\{0000000A-0000-0000-C000-000000000046} = ILockBytes
+HKEY_CLASSES_ROOT\Interface\{0000000A-0000-0000-C000-000000000046}\NumMethods = 10
+HKEY_CLASSES_ROOT\Interface\{0000000A-0000-0000-C000-000000000046}\ProxyStubClsid = {00000314-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000000B-0000-0000-C000-000000000046} = IStorage
+HKEY_CLASSES_ROOT\Interface\{0000000B-0000-0000-C000-000000000046}\NumMethods = 18
+HKEY_CLASSES_ROOT\Interface\{0000000B-0000-0000-C000-000000000046}\ProxyStubClsid = {00000314-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000000C-0000-0000-C000-000000000046} = IStream
+HKEY_CLASSES_ROOT\Interface\{0000000C-0000-0000-C000-000000000046}\NumMethods = 14
+HKEY_CLASSES_ROOT\Interface\{0000000C-0000-0000-C000-000000000046}\ProxyStubClsid = {00000314-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000000D-0000-0000-C000-000000000046} = IEnumSTATSTG
+HKEY_CLASSES_ROOT\Interface\{0000000D-0000-0000-C000-000000000046}\NumMethods = 7
+
+HKEY_CLASSES_ROOT\Interface\{0000000E-0000-0000-C000-000000000046} = IBindCtx
+HKEY_CLASSES_ROOT\Interface\{0000000E-0000-0000-C000-000000000046}\NumMethods = 13
+HKEY_CLASSES_ROOT\Interface\{0000000E-0000-0000-C000-000000000046}\ProxyStubClsid = {00000312-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000000F-0000-0000-C000-000000000046} = IMoniker
+HKEY_CLASSES_ROOT\Interface\{0000000F-0000-0000-C000-000000000046}\BaseInterface = {00000109-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{0000000F-0000-0000-C000-000000000046}\NumMethods = 23
+
+HKEY_CLASSES_ROOT\Interface\{00000010-0000-0000-C000-000000000046} = IRunningObjectTable
+HKEY_CLASSES_ROOT\Interface\{00000010-0000-0000-C000-000000000046}\NumMethods = 10
+
+HKEY_CLASSES_ROOT\Interface\{00000012-0000-0000-C000-000000000046} = IRootStorage
+HKEY_CLASSES_ROOT\Interface\{00000012-0000-0000-C000-000000000046}\NumMethods = 4
+
+HKEY_CLASSES_ROOT\Interface\{00000016-0000-0000-C000-000000000046} = IMessageFilter
+HKEY_CLASSES_ROOT\Interface\{00000016-0000-0000-C000-000000000046}\NumMethods = 6
+
+HKEY_CLASSES_ROOT\Interface\{00000018-0000-0000-C000-000000000046} = IStdMarshalInfo
+HKEY_CLASSES_ROOT\Interface\{00000018-0000-0000-C000-000000000046}\NumMethods = 4
+
+HKEY_CLASSES_ROOT\Interface\{00000019-0000-0000-C000-000000000046} = IExternalConnection
+HKEY_CLASSES_ROOT\Interface\{00000019-0000-0000-C000-000000000046}\NumMethods = 5
+
+HKEY_CLASSES_ROOT\Interface\{00000100-0000-0000-C000-000000000046} = IEnumUnknown
+HKEY_CLASSES_ROOT\Interface\{00000100-0000-0000-C000-000000000046}\NumMethods = 7
+
+HKEY_CLASSES_ROOT\Interface\{00000101-0000-0000-C000-000000000046} = IEnumString
+HKEY_CLASSES_ROOT\Interface\{00000101-0000-0000-C000-000000000046}\NumMethods = 7
+
+HKEY_CLASSES_ROOT\Interface\{00000102-0000-0000-C000-000000000046} = IEnumMoniker
+HKEY_CLASSES_ROOT\Interface\{00000102-0000-0000-C000-000000000046}\NumMethods = 7
+
+HKEY_CLASSES_ROOT\Interface\{00000103-0000-0000-C000-000000000046} = IEnumFORMATETC
+HKEY_CLASSES_ROOT\Interface\{00000103-0000-0000-C000-000000000046}\NumMethods = 7
+HKEY_CLASSES_ROOT\Interface\{00000103-0000-0000-C000-000000000046}\ProxyStubClsid = {00000313-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000104-0000-0000-C000-000000000046} = IEnumOLEVERB
+HKEY_CLASSES_ROOT\Interface\{00000104-0000-0000-C000-000000000046}\NumMethods = 7
+HKEY_CLASSES_ROOT\Interface\{00000104-0000-0000-C000-000000000046}\ProxyStubClsid = {00000313-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000105-0000-0000-C000-000000000046} = IEnumSTATDATA
+HKEY_CLASSES_ROOT\Interface\{00000105-0000-0000-C000-000000000046}\NumMethods = 7
+HKEY_CLASSES_ROOT\Interface\{00000105-0000-0000-C000-000000000046}\ProxyStubClsid = {00000313-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000109-0000-0000-C000-000000000046} = IPersistStream
+HKEY_CLASSES_ROOT\Interface\{00000109-0000-0000-C000-000000000046}\BaseInterface = {0000010C-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{00000109-0000-0000-C000-000000000046}\NumMethods = 8
+
+HKEY_CLASSES_ROOT\Interface\{0000010A-0000-0000-C000-000000000046} = IPersistStorage
+HKEY_CLASSES_ROOT\Interface\{0000010A-0000-0000-C000-000000000046}\BaseInterface = {0000010C-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{0000010A-0000-0000-C000-000000000046}\NumMethods = 10
+HKEY_CLASSES_ROOT\Interface\{0000010A-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000010B-0000-0000-C000-000000000046} = IPersistFile
+HKEY_CLASSES_ROOT\Interface\{0000010B-0000-0000-C000-000000000046}\BaseInterface = {0000010C-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{0000010B-0000-0000-C000-000000000046}\NumMethods = 9
+HKEY_CLASSES_ROOT\Interface\{0000010B-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000010C-0000-0000-C000-000000000046} = IPersist
+HKEY_CLASSES_ROOT\Interface\{0000010C-0000-0000-C000-000000000046}\NumMethods = 4
+HKEY_CLASSES_ROOT\Interface\{0000010C-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000010D-0000-0000-C000-000000000046} = IViewObject
+HKEY_CLASSES_ROOT\Interface\{0000010D-0000-0000-C000-000000000046}\NumMethods = 9
+
+HKEY_CLASSES_ROOT\Interface\{0000010E-0000-0000-C000-000000000046} = IDataObject
+HKEY_CLASSES_ROOT\Interface\{0000010E-0000-0000-C000-000000000046}\NumMethods = 12
+HKEY_CLASSES_ROOT\Interface\{0000010E-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000010F-0000-0000-C000-000000000046} = IAdviseSink
+HKEY_CLASSES_ROOT\Interface\{0000010F-0000-0000-C000-000000000046}\NumMethods = 8
+HKEY_CLASSES_ROOT\Interface\{0000010F-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030D-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000110-0000-0000-C000-000000000046} = IDataAdviseHolder
+HKEY_CLASSES_ROOT\Interface\{00000110-0000-0000-C000-000000000046}\NumMethods = 7
+
+HKEY_CLASSES_ROOT\Interface\{00000111-0000-0000-C000-000000000046} = IOleAdviseHolder
+HKEY_CLASSES_ROOT\Interface\{00000111-0000-0000-C000-000000000046}\NumMethods = 9
+
+HKEY_CLASSES_ROOT\Interface\{00000112-0000-0000-C000-000000000046} = IOleObject
+HKEY_CLASSES_ROOT\Interface\{00000112-0000-0000-C000-000000000046}\NumMethods = 24
+HKEY_CLASSES_ROOT\Interface\{00000112-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000113-0000-0000-C000-000000000046} = IOleInPlaceObject
+HKEY_CLASSES_ROOT\Interface\{00000113-0000-0000-C000-000000000046}\BaseInterface = {00000114-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{00000113-0000-0000-C000-000000000046}\NumMethods = 9
+HKEY_CLASSES_ROOT\Interface\{00000113-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000114-0000-0000-C000-000000000046} = IOleWindow
+HKEY_CLASSES_ROOT\Interface\{00000114-0000-0000-C000-000000000046}\NumMethods = 5
+
+HKEY_CLASSES_ROOT\Interface\{00000115-0000-0000-C000-000000000046} = IOleInPlaceUIWindow
+HKEY_CLASSES_ROOT\Interface\{00000115-0000-0000-C000-000000000046}\BaseInterface = {00000114-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{00000115-0000-0000-C000-000000000046}\NumMethods = 9
+HKEY_CLASSES_ROOT\Interface\{00000115-0000-0000-C000-000000000046}\ProxyStubClsid = {00000310-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000116-0000-0000-C000-000000000046} = IOleInPlaceFrame
+HKEY_CLASSES_ROOT\Interface\{00000116-0000-0000-C000-000000000046}\NumMethods = 15
+HKEY_CLASSES_ROOT\Interface\{00000116-0000-0000-C000-000000000046}\ProxyStubClsid = {00000310-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000117-0000-0000-C000-000000000046} = IOleInPlaceActiveObject
+HKEY_CLASSES_ROOT\Interface\{00000117-0000-0000-C000-000000000046}\BaseInterface = {00000114-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{00000117-0000-0000-C000-000000000046}\NumMethods = 10
+HKEY_CLASSES_ROOT\Interface\{00000117-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030F-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000118-0000-0000-C000-000000000046} = IOleClientSite
+HKEY_CLASSES_ROOT\Interface\{00000118-0000-0000-C000-000000000046}\NumMethods = 9
+HKEY_CLASSES_ROOT\Interface\{00000118-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030D-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000119-0000-0000-C000-000000000046} = IOleInPlaceSite
+HKEY_CLASSES_ROOT\Interface\{00000119-0000-0000-C000-000000000046}\BaseInterface = {00000114-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{00000119-0000-0000-C000-000000000046}\NumMethods = 15
+HKEY_CLASSES_ROOT\Interface\{00000119-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030D-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000011A-0000-0000-C000-000000000046} = IParseDisplayName
+HKEY_CLASSES_ROOT\Interface\{0000011A-0000-0000-C000-000000000046}\NumMethods = 4
+HKEY_CLASSES_ROOT\Interface\{0000011A-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000011B-0000-0000-C000-000000000046} = IOleContainer
+HKEY_CLASSES_ROOT\Interface\{0000011B-0000-0000-C000-000000000046}\BaseInterface = {0000011A-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{0000011B-0000-0000-C000-000000000046}\NumMethods = 6
+HKEY_CLASSES_ROOT\Interface\{0000011B-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000011C-0000-0000-C000-000000000046} = IOleItemContainer
+HKEY_CLASSES_ROOT\Interface\{0000011C-0000-0000-C000-000000000046}\BaseInterface = {0000011B-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{0000011C-0000-0000-C000-000000000046}\NumMethods = 9
+HKEY_CLASSES_ROOT\Interface\{0000011C-0000-0000-C000-000000000046}\ProxyStubClsid = {0000030C-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{0000011D-0000-0000-C000-000000000046} = IOleLink
+HKEY_CLASSES_ROOT\Interface\{0000011D-0000-0000-C000-000000000046}\NumMethods = 14
+
+HKEY_CLASSES_ROOT\Interface\{0000011E-0000-0000-C000-000000000046} = IOleCache
+HKEY_CLASSES_ROOT\Interface\{0000011E-0000-0000-C000-000000000046}\NumMethods = 8
+
+HKEY_CLASSES_ROOT\Interface\{00000121-0000-0000-C000-000000000046} = IDropSource
+HKEY_CLASSES_ROOT\Interface\{00000121-0000-0000-C000-000000000046}\NumMethods = 5
+
+HKEY_CLASSES_ROOT\Interface\{00000122-0000-0000-C000-000000000046} = IDropTarget
+HKEY_CLASSES_ROOT\Interface\{00000122-0000-0000-C000-000000000046}\NumMethods = 7
+HKEY_CLASSES_ROOT\Interface\{00000122-0000-0000-C000-000000000046}\ProxyStubClsid = {00000311-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\Interface\{00000124-0000-0000-C000-000000000046} = IDebugStream
+HKEY_CLASSES_ROOT\Interface\{00000124-0000-0000-C000-000000000046}\NumMethods = 19
+
+HKEY_CLASSES_ROOT\Interface\{00000125-0000-0000-C000-000000000046} = IAdviseSink2
+HKEY_CLASSES_ROOT\Interface\{00000125-0000-0000-C000-000000000046}\BaseInterface = {0000010F-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{00000125-0000-0000-C000-000000000046}\NumMethods = 9
+
+HKEY_CLASSES_ROOT\Interface\{00000126-0000-0000-C000-000000000046} = IRunnableObject
+HKEY_CLASSES_ROOT\Interface\{00000126-0000-0000-C000-000000000046}\NumMethods = 8
+
+HKEY_CLASSES_ROOT\Interface\{00000127-0000-0000-C000-000000000046} = IViewObject2
+HKEY_CLASSES_ROOT\Interface\{00000127-0000-0000-C000-000000000046}\BaseInterface = {0000010D-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{00000127-0000-0000-C000-000000000046}\NumMethods = 10
+
+HKEY_CLASSES_ROOT\Interface\{00000128-0000-0000-C000-000000000046} = IOleCache2
+HKEY_CLASSES_ROOT\Interface\{00000128-0000-0000-C000-000000000046}\BaseInterface = {0000011E-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\Interface\{00000128-0000-0000-C000-000000000046}\NumMethods = 10
+
+HKEY_CLASSES_ROOT\Interface\{00000129-0000-0000-C000-000000000046} = IOleCacheControl
+HKEY_CLASSES_ROOT\Interface\{00000129-0000-0000-C000-000000000046}\NumMethods = 5
+
+//
+//; registration info for the ole programmability component (automation)
+//
+
+-- IDispatch
+
+HKEY_CLASSES_ROOT\Interface\{00020400-0000-0000-C000-000000000046} = IDispatch
+HKEY_CLASSES_ROOT\Interface\{00020400-0000-0000-C000-000000000046}\NumMethods = 7
+HKEY_CLASSES_ROOT\Interface\{00020400-0000-0000-C000-000000000046}\ProxyStubClsid = {00020420-0000-0000-C000-000000000046}
+
+
+-- IEnumVARIANT
+
+HKEY_CLASSES_ROOT\Interface\{00020404-0000-0000-C000-000000000046} = IEnumVARIANT
+HKEY_CLASSES_ROOT\Interface\{00020404-0000-0000-C000-000000000046}\NumMethods = 7
+HKEY_CLASSES_ROOT\Interface\{00020404-0000-0000-C000-000000000046}\ProxyStubClsid = {00020421-0000-0000-C000-000000000046}
+
+
+-- ITypeInfo
+
+HKEY_CLASSES_ROOT\Interface\{00020401-0000-0000-C000-000000000046} = ITypeInfo
+HKEY_CLASSES_ROOT\Interface\{00020401-0000-0000-C000-000000000046}\NumMethods = 22
+HKEY_CLASSES_ROOT\Interface\{00020401-0000-0000-C000-000000000046}\ProxyStubClsid = {00020422-0000-0000-C000-000000000046}
+
+
+-- ITypeLib
+
+HKEY_CLASSES_ROOT\Interface\{00020402-0000-0000-C000-000000000046} = ITypeLib
+HKEY_CLASSES_ROOT\Interface\{00020402-0000-0000-C000-000000000046}\NumMethods = 13
+
+
+-- ITypeComp
+
+HKEY_CLASSES_ROOT\Interface\{00020403-0000-0000-C000-000000000046} = ITypeComp
+HKEY_CLASSES_ROOT\Interface\{00020403-0000-0000-C000-000000000046}\NumMethods = 5
+
+-- ICreateTypeInfo
+
+HKEY_CLASSES_ROOT\Interface\{00020405-0000-0000-C000-000000000046} = ICreateTypeInfo
+HKEY_CLASSES_ROOT\Interface\{00020405-0000-0000-C000-000000000046}\NumMethods = 26
+
+
+-- ICreateTypeLib
+
+HKEY_CLASSES_ROOT\Interface\{00020406-0000-0000-C000-000000000046} = ICreateTypeLib
+HKEY_CLASSES_ROOT\Interface\{00020406-0000-0000-C000-000000000046}\NumMethods = 13
+
+
+-- OLE Automation stdole.tlb registration
+
+HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}\1.0 = OLE Automation
+HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}\1.0\HELPDIR =
+HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}\1.0\0\win16 = stdole.tlb
+
+
+-- Registration info for OLE Automation private classes
+
+HKEY_CLASSES_ROOT\CLSID\{00020420-0000-0000-C000-000000000046} = PSDispatch
+HKEY_CLASSES_ROOT\CLSID\{00020420-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00020422-0000-0000-C000-000000000046} = PSTypeInfo
+HKEY_CLASSES_ROOT\CLSID\{00020422-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00020421-0000-0000-C000-000000000046} = PSEnumVARIANT
+HKEY_CLASSES_ROOT\CLSID\{00020421-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
+
diff --git a/private/oleauto/ole/win16/ole2dbg.h b/private/oleauto/ole/win16/ole2dbg.h
new file mode 100644
index 000000000..34fbf8384
--- /dev/null
+++ b/private/oleauto/ole/win16/ole2dbg.h
@@ -0,0 +1,19 @@
+/*
+ ole2dbg.h: This header file contains the function declarations for the publicly
+ exported debugging interfaces.
+
+ Include *after* standard OLE2 includes.
+
+ Copyright (c) 1992-1993, Microsoft Corp. All rights reserved.
+*/
+
+#ifndef __OLE2DBG_H
+#define __OLE2DBG_H
+
+STDAPI_(void) DbgDumpObject( IUnknown FAR * pUnk, DWORD dwReserved);
+STDAPI_(void) DbgDumpExternalObject( IUnknown FAR * pUnk, DWORD dwReserved );
+
+STDAPI_(BOOL) DbgIsObjectValid( IUnknown FAR * pUnk );
+STDAPI_(void) DbgDumpClassName( IUnknown FAR * pUnk );
+
+#endif
diff --git a/private/oleauto/ole/win16/ole2ver.h b/private/oleauto/ole/win16/ole2ver.h
new file mode 100644
index 000000000..5cbde9a99
--- /dev/null
+++ b/private/oleauto/ole/win16/ole2ver.h
@@ -0,0 +1,5 @@
+#define rmj 0
+#define rmm 23
+#define rup 639
+#define szVerName ""
+#define szVerUser "Y-OLEBLD"
diff --git a/private/oleauto/ole/win16/oleguid.h b/private/oleauto/ole/win16/oleguid.h
new file mode 100644
index 000000000..723fa50d7
--- /dev/null
+++ b/private/oleauto/ole/win16/oleguid.h
@@ -0,0 +1,80 @@
+/*****************************************************************************\
+* *
+* oleguid.h - Master definition of GUIDs for ole2.dll *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+/* this file is the master definition of all public GUIDs specific to OLE
+ and is included in ole2.h.
+
+ NOTE: The second least significant byte of all of these GUIDs is 1.
+*/
+
+
+DEFINE_OLEGUID(IID_IEnumUnknown, 0x00000100, 0, 0);
+DEFINE_OLEGUID(IID_IEnumString, 0x00000101, 0, 0);
+DEFINE_OLEGUID(IID_IEnumMoniker, 0x00000102, 0, 0);
+DEFINE_OLEGUID(IID_IEnumFORMATETC, 0x00000103, 0, 0);
+DEFINE_OLEGUID(IID_IEnumOLEVERB, 0x00000104, 0, 0);
+DEFINE_OLEGUID(IID_IEnumSTATDATA, 0x00000105, 0, 0);
+
+DEFINE_OLEGUID(IID_IEnumGeneric, 0x00000106, 0, 0);
+DEFINE_OLEGUID(IID_IEnumHolder, 0x00000107, 0, 0);
+DEFINE_OLEGUID(IID_IEnumCallback, 0x00000108, 0, 0);
+
+DEFINE_OLEGUID(IID_IPersistStream, 0x00000109, 0, 0);
+DEFINE_OLEGUID(IID_IPersistStorage, 0x0000010a, 0, 0);
+DEFINE_OLEGUID(IID_IPersistFile, 0x0000010b, 0, 0);
+DEFINE_OLEGUID(IID_IPersist, 0x0000010c, 0, 0);
+
+DEFINE_OLEGUID(IID_IViewObject, 0x0000010d, 0, 0);
+DEFINE_OLEGUID(IID_IDataObject, 0x0000010e, 0, 0);
+DEFINE_OLEGUID(IID_IAdviseSink, 0x0000010f, 0, 0);
+DEFINE_OLEGUID(IID_IDataAdviseHolder, 0x00000110, 0, 0);
+DEFINE_OLEGUID(IID_IOleAdviseHolder, 0x00000111, 0, 0);
+
+DEFINE_OLEGUID(IID_IOleObject, 0x00000112, 0, 0);
+DEFINE_OLEGUID(IID_IOleInPlaceObject, 0x00000113, 0, 0);
+DEFINE_OLEGUID(IID_IOleWindow, 0x00000114, 0, 0);
+DEFINE_OLEGUID(IID_IOleInPlaceUIWindow, 0x00000115, 0, 0);
+DEFINE_OLEGUID(IID_IOleInPlaceFrame, 0x00000116, 0, 0);
+DEFINE_OLEGUID(IID_IOleInPlaceActiveObject, 0x00000117, 0, 0);
+
+DEFINE_OLEGUID(IID_IOleClientSite, 0x00000118, 0, 0);
+DEFINE_OLEGUID(IID_IOleInPlaceSite, 0x00000119, 0, 0);
+
+DEFINE_OLEGUID(IID_IParseDisplayName, 0x0000011a, 0, 0);
+DEFINE_OLEGUID(IID_IOleContainer, 0x0000011b, 0, 0);
+DEFINE_OLEGUID(IID_IOleItemContainer, 0x0000011c, 0, 0);
+
+DEFINE_OLEGUID(IID_IOleLink, 0x0000011d, 0, 0);
+DEFINE_OLEGUID(IID_IOleCache, 0x0000011e, 0, 0);
+DEFINE_OLEGUID(IID_IOleManager, 0x0000011f, 0, 0); // unused
+DEFINE_OLEGUID(IID_IOlePresObj, 0x00000120, 0, 0);
+
+DEFINE_OLEGUID(IID_IDropSource, 0x00000121, 0, 0);
+DEFINE_OLEGUID(IID_IDropTarget, 0x00000122, 0, 0);
+
+DEFINE_OLEGUID(IID_IDebug, 0x00000123, 0, 0);
+DEFINE_OLEGUID(IID_IDebugStream, 0x00000124, 0, 0);
+
+DEFINE_OLEGUID(IID_IAdviseSink2, 0x00000125, 0, 0);
+
+DEFINE_OLEGUID(IID_IRunnableObject, 0x00000126, 0, 0);
+
+DEFINE_OLEGUID(IID_IViewObject2, 0x00000127, 0, 0);
+DEFINE_OLEGUID(IID_IOleCache2, 0x00000128, 0, 0);
+DEFINE_OLEGUID(IID_IOleCacheControl, 0x00000129, 0, 0);
+
+/* NOTE: LSB values 0x27 through 0xff are reserved */
+
+
+/* GUIDs defined in OLE's private range */
+DEFINE_OLEGUID(CLSID_Picture_Metafile, 0x00000315, 0, 0);
+DEFINE_OLEGUID(CLSID_Picture_Dib, 0x00000316, 0, 0);
+
+
diff --git a/private/oleauto/ole/win16/scode.h b/private/oleauto/ole/win16/scode.h
new file mode 100644
index 000000000..cbfb2751c
--- /dev/null
+++ b/private/oleauto/ole/win16/scode.h
@@ -0,0 +1,283 @@
+/*****************************************************************************\
+* *
+* scode.h - Defines standard status code services. *
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+
+#ifndef __SCODE_H__
+#define __SCODE_H__
+
+//
+// SCODE
+//
+
+typedef long SCODE;
+typedef SCODE *PSCODE;
+typedef void FAR * HRESULT;
+#define NOERROR 0
+
+//
+// Status values are 32 bit values layed out as follows:
+//
+// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+// +-+---------------------+-------+-------------------------------+
+// |S| Context | Facil | Code |
+// +-+---------------------+-------+-------------------------------+
+//
+// where
+//
+// S - is the severity code
+//
+// 0 - Success
+// 1 - Error
+//
+// Context - context info
+//
+// Facility - is the facility code
+//
+// Code - is the facility's status code
+//
+
+//
+// Severity values
+//
+
+#define SEVERITY_SUCCESS 0
+#define SEVERITY_ERROR 1
+
+
+
+#define SUCCEEDED(Status) ((SCODE)(Status) >= 0)
+
+#define FAILED(Status) ((SCODE)(Status)<0)
+
+
+//
+// Return the code
+//
+
+#define SCODE_CODE(sc) ((sc) & 0xFFFF)
+
+//
+// Return the facility
+//
+
+#define SCODE_FACILITY(sc) (((sc) >> 16) & 0x1fff)
+
+//
+// Return the severity
+//
+
+#define SCODE_SEVERITY(sc) (((sc) >> 31) & 0x1)
+
+//
+// Create an SCODE value from component pieces
+//
+
+#define MAKE_SCODE(sev,fac,code) \
+ ((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )
+
+
+
+// --------------------- Functions ---------------------------------------
+
+#define GetScode(hr) ((SCODE)(hr) & 0x800FFFFF)
+#define ResultFromScode(sc) ((HRESULT)((SCODE)(sc) & 0x800FFFFF))
+
+STDAPI PropagateResult(HRESULT hrPrev, SCODE scNew);
+
+
+// -------------------------- Facility definitions -------------------------
+
+#define FACILITY_NULL 0x0000 // generally useful errors ([SE]_*)
+#define FACILITY_RPC 0x0001 // remote procedure call errors (RPC_E_*)
+#define FACILITY_DISPATCH 0x0002 // late binding dispatch errors
+#define FACILITY_STORAGE 0x0003 // storage errors (STG_E_*)
+#define FACILITY_ITF 0x0004 // interface-specific errors
+
+
+
+#define S_OK 0L
+#define S_FALSE MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_NULL, 1)
+
+
+
+// --------------------- FACILITY_NULL errors ------------------------------
+
+#define E_UNEXPECTED MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 0xffff)
+ // relatively catastrophic failure
+
+#define E_NOTIMPL MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 1)
+ // not implemented
+
+#define E_OUTOFMEMORY MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 2)
+ // ran out of memory
+
+#define E_INVALIDARG MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 3)
+ // one or more arguments are invalid
+
+#define E_NOINTERFACE MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 4)
+ // no such interface supported
+
+
+#define E_POINTER MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 5)
+ // invalid pointer
+
+#define E_HANDLE MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 6)
+ // invalid handle
+
+#define E_ABORT MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 7)
+ // operation aborted
+
+#define E_FAIL MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 8)
+ // unspecified error
+
+
+#define E_ACCESSDENIED MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 9)
+ // general access denied error
+
+
+// ----------------- FACILITY_ITF errors used by OLE ---------------------
+//
+// By convention, OLE interfaces divide the FACILITY_ITF range of errors
+// into nonoverlapping subranges. If an OLE interface returns a FACILITY_ITF
+// scode, it must be from the range associated with that interface or from
+// the shared range: OLE_E_FIRST...OLE_E_LAST.
+//
+// The ranges, their associated interfaces, and the header file that defines
+// the actual scodes are given below.
+//
+
+// Generic OLE errors that may be returned by many interfaces
+#define OLE_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0000)
+#define OLE_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x00FF)
+#define OLE_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0000)
+#define OLE_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x00FF)
+// interfaces: all
+// file: ole2.h
+
+
+#define DRAGDROP_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0100)
+#define DRAGDROP_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x010F)
+#define DRAGDROP_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0100)
+#define DRAGDROP_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x010F)
+// interfaces: IDropSource, IDropTarget
+// file: ole2.h
+
+#define CLASSFACTORY_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0110)
+#define CLASSFACTORY_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x011F)
+#define CLASSFACTORY_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0110)
+#define CLASSFACTORY_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x011F)
+// interfaces: IClassFactory
+// file:
+
+#define MARSHAL_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0120)
+#define MARSHAL_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x012F)
+#define MARSHAL_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0120)
+#define MARSHAL_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x012F)
+// interfaces: IMarshal, IStdMarshalInfo, marshal APIs
+// file:
+
+#define DATA_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0130)
+#define DATA_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x013F)
+#define DATA_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0130)
+#define DATA_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x013F)
+// interfaces: IDataObject
+// file: dvobj.h
+
+#define VIEW_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0140)
+#define VIEW_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x014F)
+#define VIEW_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0140)
+#define VIEW_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x014F)
+// interfaces: IViewObject
+// file: dvobj.h
+
+#define REGDB_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0150)
+#define REGDB_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x015F)
+#define REGDB_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0150)
+#define REGDB_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x015F)
+// API: reg.dat manipulation
+// file:
+
+
+// range 160 - 16F reserved
+
+#define CACHE_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0170)
+#define CACHE_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x017F)
+#define CACHE_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0170)
+#define CACHE_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x017F)
+// interfaces: IOleCache
+// file:
+
+#define OLEOBJ_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0180)
+#define OLEOBJ_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x018F)
+#define OLEOBJ_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0180)
+#define OLEOBJ_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x018F)
+// interfaces: IOleObject
+// file:
+
+#define CLIENTSITE_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0190)
+#define CLIENTSITE_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x019F)
+#define CLIENTSITE_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x0190)
+#define CLIENTSITE_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x019F)
+// interfaces: IOleClientSite
+// file:
+
+#define INPLACE_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01A0)
+#define INPLACE_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01AF)
+#define INPLACE_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01A0)
+#define INPLACE_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01AF)
+// interfaces: IOleWindow, IOleInPlaceObject, IOleInPlaceActiveObject,
+// IOleInPlaceUIWindow, IOleInPlaceFrame, IOleInPlaceSite
+// file:
+
+#define ENUM_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01B0)
+#define ENUM_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01BF)
+#define ENUM_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01B0)
+#define ENUM_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01BF)
+// interfaces: IEnum*
+// file:
+
+#define CONVERT10_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01C0)
+#define CONVERT10_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01CF)
+#define CONVERT10_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01C0)
+#define CONVERT10_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01CF)
+// API: OleConvertOLESTREAMToIStorage, OleConvertIStorageToOLESTREAM
+// file:
+
+
+#define CLIPBRD_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01D0)
+#define CLIPBRD_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01DF)
+#define CLIPBRD_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01D0)
+#define CLIPBRD_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01DF)
+// interfaces: OleSetClipboard, OleGetClipboard, OleFlushClipboard
+// file: ole2.h
+
+#define MK_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01E0)
+#define MK_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01EF)
+#define MK_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01E0)
+#define MK_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01EF)
+// interfaces: IMoniker, IBindCtx, IRunningObjectTable, IParseDisplayName,
+// IOleContainer, IOleItemContainer, IOleLink
+// file: moniker.h
+
+
+#define CO_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01F0)
+#define CO_E_LAST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x01FF)
+#define CO_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01F0)
+#define CO_S_LAST MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_ITF, 0x01FF)
+// all Co* API
+// file: compobj.h
+
+
+// range 200 - ffff for new error codes
+
+
+
+#endif // ifndef __SCODE_H__
diff --git a/private/oleauto/ole/win16/storage.h b/private/oleauto/ole/win16/storage.h
new file mode 100644
index 000000000..e111c1d8f
--- /dev/null
+++ b/private/oleauto/ole/win16/storage.h
@@ -0,0 +1,457 @@
+/*****************************************************************************\
+* *
+* storage.h - Definitions for the strutured storage system
+* *
+* OLE Version 2.0 *
+* *
+* Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+
+#if !defined( _STORAGE_H_ )
+#define _STORAGE_H_
+
+
+#include <compobj.h>
+
+
+/****** Storage Error Codes *************************************************/
+
+/* DOS-based error codes */
+#define STG_E_INVALIDFUNCTION \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x01)
+
+#define STG_E_FILENOTFOUND \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x02)
+
+#define STG_E_PATHNOTFOUND \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x03)
+
+#define STG_E_TOOMANYOPENFILES \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x04)
+
+#define STG_E_ACCESSDENIED \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x05)
+
+#define STG_E_INVALIDHANDLE \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x06)
+
+#define STG_E_INSUFFICIENTMEMORY \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x08)
+
+#define STG_E_INVALIDPOINTER \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x09)
+
+#define STG_E_NOMOREFILES \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x12)
+
+#define STG_E_DISKISWRITEPROTECTED \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x13)
+
+#define STG_E_SEEKERROR \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x19)
+
+#define STG_E_WRITEFAULT \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x1d)
+
+#define STG_E_READFAULT \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x1e)
+
+#define STG_E_SHAREVIOLATION \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x20)
+
+#define STG_E_LOCKVIOLATION \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x21)
+
+#define STG_E_FILEALREADYEXISTS \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x50)
+
+#define STG_E_INVALIDPARAMETER \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x57)
+
+#define STG_E_MEDIUMFULL \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x70)
+
+#define STG_E_ABNORMALAPIEXIT \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0xfa)
+
+#define STG_E_INVALIDHEADER \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0xfb)
+
+#define STG_E_INVALIDNAME \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0xfc)
+
+#define STG_E_UNKNOWN \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0xfd)
+
+#define STG_E_UNIMPLEMENTEDFUNCTION\
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0xfe)
+
+#define STG_E_INVALIDFLAG \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0xff)
+
+/* Standard storage error codes */
+#define STG_E_INUSE \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x100)
+
+#define STG_E_NOTCURRENT \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x101)
+
+#define STG_E_REVERTED \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x102)
+
+#define STG_E_CANTSAVE \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x103)
+
+#define STG_E_OLDFORMAT \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x104)
+
+#define STG_E_OLDDLL \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x105)
+
+#define STG_E_SHAREREQUIRED \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x106)
+
+#define STG_E_NOTFILEBASEDSTORAGE \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x107)
+
+#define STG_E_EXTANTMARSHALLINGS \
+ MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, 0x108)
+
+/* Information returns */
+#define STG_S_CONVERTED \
+ MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_STORAGE, 0x200)
+
+/****** Storage types *******************************************************/
+
+#if defined(_M_I286)
+typedef char TCHAR;
+#ifndef HUGEP
+#define HUGEP _huge
+#endif
+#else
+typedef char TCHAR;
+#ifndef HUGEP
+#define HUGEP
+#endif
+#endif
+
+#define CWCSTORAGENAME 32
+
+/* Storage instantiation modes */
+#define STGM_DIRECT 0x00000000L
+#define STGM_TRANSACTED 0x00010000L
+
+#define STGM_READ 0x00000000L
+#define STGM_WRITE 0x00000001L
+#define STGM_READWRITE 0x00000002L
+
+#define STGM_SHARE_DENY_NONE 0x00000040L
+#define STGM_SHARE_DENY_READ 0x00000030L
+#define STGM_SHARE_DENY_WRITE 0x00000020L
+#define STGM_SHARE_EXCLUSIVE 0x00000010L
+
+#define STGM_PRIORITY 0x00040000L
+#define STGM_DELETEONRELEASE 0x04000000L
+
+#define STGM_CREATE 0x00001000L
+#define STGM_CONVERT 0x00020000L
+#define STGM_FAILIFTHERE 0x00000000L
+
+/* Storage commit types */
+typedef enum tagSTGC
+{
+ STGC_DEFAULT = 0,
+ STGC_OVERWRITE = 1,
+ STGC_ONLYIFCURRENT = 2,
+ STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE = 4
+} STGC;
+
+/* Stream name block definitions */
+typedef char FAR * FAR *SNB;
+
+
+#ifndef _WINDOWS_
+#ifndef _FILETIME_
+#define _FILETIME_
+typedef struct FARSTRUCT tagFILETIME
+{
+ DWORD dwLowDateTime;
+ DWORD dwHighDateTime;
+} FILETIME;
+#endif
+#endif
+
+
+/* Storage stat buffer */
+
+typedef struct FARSTRUCT tagSTATSTG
+{
+ char FAR* pwcsName;
+ DWORD type;
+ ULARGE_INTEGER cbSize;
+ FILETIME mtime;
+ FILETIME ctime;
+ FILETIME atime;
+ DWORD grfMode;
+ DWORD grfLocksSupported;
+ CLSID clsid;
+ DWORD grfStateBits;
+ DWORD reserved;
+} STATSTG;
+
+
+/* Storage element types */
+typedef enum tagSTGTY
+{
+ STGTY_STORAGE = 1,
+ STGTY_STREAM = 2,
+ STGTY_LOCKBYTES = 3,
+ STGTY_PROPERTY = 4
+} STGTY;
+
+typedef enum tagSTREAM_SEEK
+{
+ STREAM_SEEK_SET = 0,
+ STREAM_SEEK_CUR = 1,
+ STREAM_SEEK_END = 2
+} STREAM_SEEK;
+
+typedef enum tagLOCKTYPE
+{
+ LOCK_WRITE = 1,
+ LOCK_EXCLUSIVE = 2,
+ LOCK_ONLYONCE = 4
+} LOCKTYPE;
+
+typedef enum tagSTGMOVE
+{
+ STGMOVE_MOVE = 0,
+ STGMOVE_COPY = 1
+} STGMOVE;
+
+typedef enum tagSTATFLAG
+{
+ STATFLAG_DEFAULT = 0,
+ STATFLAG_NONAME = 1
+} STATFLAG;
+
+
+/****** Storage Enumerators *************************************************/
+
+#undef INTERFACE
+#define INTERFACE IEnumSTATSTG
+
+DECLARE_INTERFACE_(IEnumSTATSTG, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IENUMSTATSTG methods ***
+ STDMETHOD(Next) (THIS_ ULONG celt, STATSTG FAR * rgelt, ULONG FAR *pceltFetched) PURE;
+ STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
+ STDMETHOD(Reset) (THIS) PURE;
+ STDMETHOD(Clone) (THIS_ IEnumSTATSTG FAR *FAR *ppenm) PURE;
+};
+
+typedef IEnumSTATSTG FAR* LPENUMSTATSTG;
+
+
+
+/****** ILockBytes Interface ************************************************/
+
+#undef INTERFACE
+#define INTERFACE ILockBytes
+
+DECLARE_INTERFACE_(ILockBytes, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** ILockBytes methods ***
+ STDMETHOD(ReadAt) (THIS_ ULARGE_INTEGER ulOffset,
+ VOID HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbRead) PURE;
+ STDMETHOD(WriteAt) (THIS_ ULARGE_INTEGER ulOffset,
+ VOID const HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbWritten) PURE;
+ STDMETHOD(Flush) (THIS) PURE;
+ STDMETHOD(SetSize) (THIS_ ULARGE_INTEGER cb) PURE;
+ STDMETHOD(LockRegion) (THIS_ ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType) PURE;
+ STDMETHOD(UnlockRegion) (THIS_ ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType) PURE;
+ STDMETHOD(Stat) (THIS_ STATSTG FAR *pstatstg, DWORD grfStatFlag) PURE;
+};
+
+typedef ILockBytes FAR* LPLOCKBYTES;
+
+
+
+/****** IStream Interface ***************************************************/
+
+
+#undef INTERFACE
+#define INTERFACE IStream
+
+DECLARE_INTERFACE_(IStream, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IStream methods ***
+ STDMETHOD(Read) (THIS_ VOID HUGEP *pv,
+ ULONG cb, ULONG FAR *pcbRead) PURE;
+ STDMETHOD(Write) (THIS_ VOID const HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbWritten) PURE;
+ STDMETHOD(Seek) (THIS_ LARGE_INTEGER dlibMove,
+ DWORD dwOrigin,
+ ULARGE_INTEGER FAR *plibNewPosition) PURE;
+ STDMETHOD(SetSize) (THIS_ ULARGE_INTEGER libNewSize) PURE;
+ STDMETHOD(CopyTo) (THIS_ IStream FAR *pstm,
+ ULARGE_INTEGER cb,
+ ULARGE_INTEGER FAR *pcbRead,
+ ULARGE_INTEGER FAR *pcbWritten) PURE;
+ STDMETHOD(Commit) (THIS_ DWORD grfCommitFlags) PURE;
+ STDMETHOD(Revert) (THIS) PURE;
+ STDMETHOD(LockRegion) (THIS_ ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType) PURE;
+ STDMETHOD(UnlockRegion) (THIS_ ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType) PURE;
+ STDMETHOD(Stat) (THIS_ STATSTG FAR *pstatstg, DWORD grfStatFlag) PURE;
+ STDMETHOD(Clone)(THIS_ IStream FAR * FAR *ppstm) PURE;
+};
+
+typedef IStream FAR* LPSTREAM;
+
+
+
+/****** IStorage Interface **************************************************/
+
+#undef INTERFACE
+#define INTERFACE IStorage
+
+DECLARE_INTERFACE_(IStorage, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IStorage methods ***
+ STDMETHOD(CreateStream) (THIS_ const char FAR* pwcsName,
+ DWORD grfMode,
+ DWORD reserved1,
+ DWORD reserved2,
+ IStream FAR *FAR *ppstm) PURE;
+ STDMETHOD(OpenStream) (THIS_ const char FAR* pwcsName,
+ void FAR *reserved1,
+ DWORD grfMode,
+ DWORD reserved2,
+ IStream FAR *FAR *ppstm) PURE;
+ STDMETHOD(CreateStorage) (THIS_ const char FAR* pwcsName,
+ DWORD grfMode,
+ DWORD reserved1,
+ DWORD reserved2,
+ IStorage FAR *FAR *ppstg) PURE;
+ STDMETHOD(OpenStorage) (THIS_ const char FAR* pwcsName,
+ IStorage FAR *pstgPriority,
+ DWORD grfMode,
+ SNB snbExclude,
+ DWORD reserved,
+ IStorage FAR *FAR *ppstg) PURE;
+ STDMETHOD(CopyTo) (THIS_ DWORD ciidExclude,
+ IID const FAR *rgiidExclude,
+ SNB snbExclude,
+ IStorage FAR *pstgDest) PURE;
+ STDMETHOD(MoveElementTo) (THIS_ char const FAR* lpszName,
+ IStorage FAR *pstgDest,
+ char const FAR* lpszNewName,
+ DWORD grfFlags) PURE;
+ STDMETHOD(Commit) (THIS_ DWORD grfCommitFlags) PURE;
+ STDMETHOD(Revert) (THIS) PURE;
+ STDMETHOD(EnumElements) (THIS_ DWORD reserved1,
+ void FAR *reserved2,
+ DWORD reserved3,
+ IEnumSTATSTG FAR *FAR *ppenm) PURE;
+ STDMETHOD(DestroyElement) (THIS_ const char FAR* pwcsName) PURE;
+ STDMETHOD(RenameElement) (THIS_ const char FAR* pwcsOldName,
+ const char FAR* pwcsNewName) PURE;
+ STDMETHOD(SetElementTimes) (THIS_ const char FAR *lpszName,
+ FILETIME const FAR *pctime,
+ FILETIME const FAR *patime,
+ FILETIME const FAR *pmtime) PURE;
+ STDMETHOD(SetClass) (THIS_ REFCLSID clsid) PURE;
+ STDMETHOD(SetStateBits) (THIS_ DWORD grfStateBits, DWORD grfMask) PURE;
+ STDMETHOD(Stat) (THIS_ STATSTG FAR *pstatstg, DWORD grfStatFlag) PURE;
+};
+
+typedef IStorage FAR* LPSTORAGE;
+
+
+
+/****** IRootStorage Interface **********************************************/
+
+#undef INTERFACE
+#define INTERFACE IRootStorage
+
+DECLARE_INTERFACE_(IRootStorage, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IRootStorage methods ***
+ STDMETHOD(SwitchToFile) (THIS_ LPSTR lpstrFile) PURE;
+};
+
+typedef IRootStorage FAR* LPROOTSTORAGE;
+
+
+
+/****** Storage API Prototypes ********************************************/
+
+STDAPI StgCreateDocfile(const char FAR* pwcsName,
+ DWORD grfMode,
+ DWORD reserved,
+ IStorage FAR * FAR *ppstgOpen);
+STDAPI StgCreateDocfileOnILockBytes(ILockBytes FAR *plkbyt,
+ DWORD grfMode,
+ DWORD reserved,
+ IStorage FAR * FAR *ppstgOpen);
+STDAPI StgOpenStorage(const char FAR* pwcsName,
+ IStorage FAR *pstgPriority,
+ DWORD grfMode,
+ SNB snbExclude,
+ DWORD reserved,
+ IStorage FAR * FAR *ppstgOpen);
+STDAPI StgOpenStorageOnILockBytes(ILockBytes FAR *plkbyt,
+ IStorage FAR *pstgPriority,
+ DWORD grfMode,
+ SNB snbExclude,
+ DWORD reserved,
+ IStorage FAR * FAR *ppstgOpen);
+STDAPI StgIsStorageFile(const char FAR* pwcsName);
+STDAPI StgIsStorageILockBytes(ILockBytes FAR* plkbyt);
+
+STDAPI StgSetTimes(char const FAR* lpszName,
+ FILETIME const FAR* pctime,
+ FILETIME const FAR* patime,
+ FILETIME const FAR* pmtime);
+
+#endif
diff --git a/private/oleauto/sample/copyall.bat b/private/oleauto/sample/copyall.bat
new file mode 100644
index 000000000..5ef71875b
--- /dev/null
+++ b/private/oleauto/sample/copyall.bat
@@ -0,0 +1,20 @@
+
+copy dispcalc\win32\dispcalc.exe c:\test
+copy dispdemo\win32\dispdemo.exe c:\test
+copy dspcalc2\win32\dspcalc2.exe c:\test
+copy dspcalc2\win32\dspcalc2.tlb c:\test
+copy hello\win32\hello.exe c:\test
+copy hello\win32\hello.tlb c:\test
+copy spoly\win32\spoly.exe c:\test
+copy spoly2\win32\spoly2.exe c:\test
+copy tibrowse\win32\tibrowse.exe c:\test
+
+copy dispcalc\win16\dispcalc.exe c:\test16
+copy dispdemo\win16\dispdemo.exe c:\test16
+copy dspcalc2\win16\dspcalc2.exe c:\test16
+copy dspcalc2\win16\dspcalc2.tlb c:\test16
+copy hello\win16\hello.exe c:\test16
+copy hello\win16\hello.tlb c:\test16
+copy spoly\win16\spoly.exe c:\test16
+copy spoly2\win16\spoly2.exe c:\test16
+copy tibrowse\win16\tibrowse.exe c:\test16
diff --git a/private/oleauto/sample/dispcalc/clsid.c b/private/oleauto/sample/dispcalc/clsid.c
new file mode 100644
index 000000000..5994746b5
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/clsid.c
@@ -0,0 +1,46 @@
+/***
+*clsid.c
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates and initializes the CLSIDs.
+*
+*****************************************************************************/
+
+#ifdef _PPCMAC
+#pragma data_seg ("_FAR_DATA")
+#pragma data_seg ( )
+#endif //_PPCMAC
+
+#ifdef _MAC
+# include <Types.h>
+#ifdef _MSC_VER
+# include <Processe.h>
+# include <AppleEve.h>
+#else //_MSC_VER
+# include <Processes.h>
+# include <AppleEvents.h>
+#endif //_MSC_VER
+#else
+# include <windows.h>
+#endif
+
+#ifndef WIN32
+#include <compobj.h>
+#endif //!WIN32
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+#ifndef INITGUID
+# define INITGUID
+#endif
+
+// due to the previous header, including this causes the DEFINE_GUID
+// definitions in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
+
diff --git a/private/oleauto/sample/dispcalc/clsid.h b/private/oleauto/sample/dispcalc/clsid.h
new file mode 100644
index 000000000..86e502737
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/clsid.h
@@ -0,0 +1,31 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+DEFINE_GUID(CLSID_CCalc, 0x00020467, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+
+
+#ifdef INITGUID
+# ifdef _MAC
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+# ifndef _MW_BUILD
+/* The Metrowerks PPC build gives multiple definition warnings */
+DEFINE_GUID(IID_IDispatch, 0x00020400, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IEnumVARIANT, 0x00020404, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+
+DEFINE_GUID(IID_IUnknown, 0x00000000, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IClassFactory, 0x00000001, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+#endif
+
diff --git a/private/oleauto/sample/dispcalc/dispcalc.cpp b/private/oleauto/sample/dispcalc/dispcalc.cpp
new file mode 100644
index 000000000..94cb2d372
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/dispcalc.cpp
@@ -0,0 +1,609 @@
+/***
+*dispcalc.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the basic user interface and arithmetic
+* functionality of the IDispatch calculator.
+*
+* The implementation of IDispatch it via aggregation with an
+* instance of the "standard" IDispatch implementation, which is
+* initialized with a DispTypeInfo constructed from an INTERFACEDATA
+* description.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dispcalc.h"
+
+CCalc FAR* g_pcalc = NULL;
+
+unsigned long g_dwCCalcCF = 0;
+unsigned long g_dwRegisterCCalc = 0;
+
+#ifdef _MAC
+extern Boolean g_fQuit;
+#endif //_MAC
+
+
+CCalc::CCalc() : m_arith(this)
+{
+ m_refs = 0;
+#ifdef _MAC
+ m_pdlg = nil;
+#else
+ m_hwnd = NULL;
+#endif
+ m_punkStdDisp = NULL;
+}
+
+/***
+*CCalc *CCalc::Create(void)
+*Purpose:
+* Create an instance of the IDispatch calculator, build a
+* TypeInfo that describes the exposed functionality and
+* aggregate with an instance of CStdDispatch that has been
+* initialized with this TypeInfo.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = CCalc*, NULL if the creation failed.
+*
+***********************************************************************/
+CCalc FAR*
+CCalc::Create()
+{
+ HRESULT hresult;
+ CCalc FAR* pcalc;
+ CArith FAR* parith;
+ ITypeInfo FAR* ptinfo;
+ IUnknown FAR* punkStdDisp;
+extern INTERFACEDATA NEARDATA g_idataCCalc;
+
+ if((pcalc = new FAR CCalc()) == NULL)
+ return NULL;
+ pcalc->AddRef();
+
+ parith = &(pcalc->m_arith);
+
+ // Build a TypeInfo for the functionality on this object that
+ // is being exposing for external programmability.
+ //
+ hresult = CreateDispTypeInfo(
+ &g_idataCCalc, LOCALE_SYSTEM_DEFAULT, &ptinfo);
+ if(hresult != NOERROR)
+ goto LError0;
+
+ // Create and aggregate with an instance of the default
+ // implementation of IDispatch that is initialized with our
+ // TypeInfo.
+ //
+ hresult = CreateStdDispatch(
+ pcalc, // controlling unknown
+ parith, // instance to dispatch on
+ ptinfo, // typeinfo describing the instance
+ &punkStdDisp);
+
+ ptinfo->Release();
+
+ if(hresult != NOERROR)
+ goto LError0;
+
+ pcalc->m_punkStdDisp = punkStdDisp;
+
+ return pcalc;
+
+LError0:;
+ pcalc->Release();
+
+ return NULL;
+}
+
+//---------------------------------------------------------------------
+// IUnknown methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CCalc::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else
+ if(IsEqualIID(riid, IID_IDispatch)){
+ return m_punkStdDisp->QueryInterface(riid, ppv);
+ }else {
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+ }
+
+ AddRef();
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CCalc::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CCalc::Release()
+{
+ if(--m_refs == 0){
+ if(m_punkStdDisp != NULL)
+ m_punkStdDisp->Release();
+#ifndef _MAC
+ PostQuitMessage(0);
+#endif
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// Arithmetic features
+//---------------------------------------------------------------------
+
+STDMETHODIMP_(void)
+CArith::Clear()
+{
+ m_opnd = 0;
+ m_accum = 0;
+ m_op = OP_NONE;
+ m_state = STATE_LOPND;
+}
+
+STDMETHODIMP_(void)
+CArith::put_Accum(long l)
+{
+ m_accum = l;
+}
+
+
+STDMETHODIMP_(long)
+CArith::get_Accum()
+{
+ return m_accum;
+}
+
+STDMETHODIMP_(void)
+CArith::put_Opnd(long l)
+{
+ m_opnd = l;
+}
+
+STDMETHODIMP_(long)
+CArith::get_Opnd()
+{
+ return m_opnd;
+}
+
+STDMETHODIMP_(void)
+CArith::put_Op(short op)
+{
+ m_op = op;
+}
+
+STDMETHODIMP_(short)
+CArith::get_Op()
+{
+ return m_op;
+}
+
+STDMETHODIMP_(short)
+CArith::Eval()
+{
+ if(m_op == OP_NONE)
+ return 0;
+
+ switch(m_op){
+ case OP_PLUS:
+ m_accum += m_opnd;
+ break;
+ case OP_MINUS:
+ m_accum -= m_opnd;
+ break;
+ case OP_MULT:
+ m_accum *= m_opnd;
+ break;
+ case OP_DIV:
+ m_accum = (m_opnd == 0) ? 0 : (m_accum / m_opnd);
+ break;
+ default:
+ // ASSERT(UNREACHED);
+ return 0;
+
+ }
+
+ m_state = STATE_EVAL;
+
+ return 1;
+}
+
+
+//---------------------------------------------------------------------
+// User Interface features
+//---------------------------------------------------------------------
+
+/***
+*void CArith::Display()
+*Purpose:
+* Display the contents of the register currently being edited.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDMETHODIMP_(void)
+CArith::Display()
+{
+ VARIANT var;
+
+ VariantInit(&var);
+
+ V_VT(&var) = VT_I4;
+ V_I4(&var) = (m_state == STATE_ROPND) ? m_opnd : m_accum;
+ VariantChangeType(&var, &var, 0, VT_BSTR);
+
+#ifdef _MAC
+ {
+ Rect rcItem;
+ Handle hItem;
+ char str[255];
+ short sItemKind;
+
+ strcpy(str, V_BSTR(&var));
+ GetDItem(m_pcalc->m_pdlg, IDC_DISPLAY, &sItemKind, &hItem, &rcItem);
+ SetIText(hItem, c2pstr(str));
+ }
+#else
+ SetDlgItemText(m_pcalc->m_hwnd, IDC_DISPLAY, STRING(V_BSTR(&var)));
+#endif
+
+ VariantClear(&var);
+}
+
+STDMETHODIMP_(short)
+CArith::Button(BSTR bstrButton)
+{
+ int i, button;
+
+static struct {
+ OLECHAR ch;
+ int idc;
+} NEARDATA rgIdcOfCh[] = {
+ { OLESTR('+'), IDC_PLUS }
+ , { OLESTR('-'), IDC_MINUS }
+ , { OLESTR('*'), IDC_MULT }
+ , { OLESTR('/'), IDC_DIV }
+ , { OLESTR('C'), IDC_CLEAR }
+ , { OLESTR('c'), IDC_CLEAR }
+ , { OLESTR('='), IDC_EQUALS }
+ , { OLESTR('0'), IDC_ZERO }
+ , { OLESTR('1'), IDC_ONE }
+ , { OLESTR('2'), IDC_TWO }
+ , { OLESTR('3'), IDC_THREE }
+ , { OLESTR('4'), IDC_FOUR }
+ , { OLESTR('5'), IDC_FIVE }
+ , { OLESTR('6'), IDC_SIX }
+ , { OLESTR('7'), IDC_SEVEN }
+ , { OLESTR('8'), IDC_EIGHT }
+ , { OLESTR('9'), IDC_NINE }
+ , { (OLECHAR)-1 , -1 }
+};
+
+ // if the string is more that 1 character long, then we know its wrong.
+ if(SysStringLen(bstrButton) > 1)
+ return 0;
+
+ // translate button string into control ID
+ for(i = 0;; ++i){
+ if(rgIdcOfCh[i].ch == -1)
+ return 0;
+ if(rgIdcOfCh[i].ch == bstrButton[0]){
+ button = rgIdcOfCh[i].idc;
+ break;
+ }
+ }
+
+ return ButtonPush(button);
+}
+
+// the following method is internal, and not exposed for programmability
+int
+CArith::ButtonPush(int button)
+{
+ if(button >= IDC_ZERO && button <= IDC_NINE){
+
+ long lVal = button - IDC_ZERO;
+
+ switch(m_state){
+ case STATE_EVAL:
+ m_accum = lVal;
+ m_state = STATE_LOPND;
+ break;
+ case STATE_OP:
+ m_opnd = lVal;
+ m_state = STATE_ROPND;
+ break;
+ case STATE_LOPND:
+ m_accum = (m_accum * 10) + lVal;
+ break;
+ case STATE_ROPND:
+ m_opnd = (m_opnd * 10) + lVal;
+ break;
+ }
+
+ }else if(button >= IDC_PLUS && button <= IDC_DIV){
+
+ if(m_state == STATE_LOPND){
+ m_opnd = m_accum;
+ m_state = STATE_OP;
+ m_op = button - IDC_PLUS + OP_PLUS;
+ }
+
+ }else if(button == IDC_EQUALS){
+
+ if(m_state > STATE_LOPND)
+ Eval();
+
+ }else if (button == IDC_CLEAR){
+
+ Clear();
+
+ }else{
+
+ return 0; // unknown button
+
+ }
+
+ // Flash the button
+
+#ifdef _MAC
+ {
+ Rect rcItem;
+ long lDummy;
+ Handle hItem;
+ short sItemKind;
+
+ GetDItem(m_pcalc->m_pdlg, button, &sItemKind, &hItem, &rcItem);
+ HiliteControl((ControlHandle)hItem, 1);
+ Delay(6, &lDummy);
+ HiliteControl((ControlHandle)hItem, 0);
+ }
+#else
+ SendMessage(m_pcalc->m_hwnd, BM_SETSTATE, 1, 0L);
+ SendMessage(m_pcalc->m_hwnd, BM_SETSTATE, 0, 0L);
+#endif
+
+ // Update the calculator display
+
+ Display();
+
+ return 1;
+}
+
+/***
+*void CArith::Quit()
+*Purpose:
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDMETHODIMP_(void)
+CArith::Quit()
+{
+#ifndef _MAC
+ PostQuitMessage(0);
+#else
+ g_fQuit = 1;
+#endif
+}
+
+
+//---------------------------------------------------------------------
+// The CCalc Class Factory
+//---------------------------------------------------------------------
+
+IClassFactory FAR*
+CCalcCF::Create()
+{
+ return new FAR CCalcCF();
+}
+
+STDMETHODIMP
+CCalcCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown) ||
+ IsEqualIID(riid, IID_IClassFactory)){
+ AddRef();
+ *ppv = this;
+ return NOERROR;
+ }
+
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CCalcCF::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CCalcCF::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP
+CCalcCF::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv)
+{
+ if(punkOuter != NULL)
+ return ResultFromScode(CLASS_E_NOAGGREGATION);
+ return g_pcalc->QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP
+#ifdef _MAC
+CCalcCF::LockServer(unsigned long fLock)
+#else
+CCalcCF::LockServer(BOOL fLock)
+#endif
+{
+ UNUSED(fLock);
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// Ole Init/Uninit
+//---------------------------------------------------------------------
+
+HRESULT
+UninitOle()
+{
+ if(g_dwRegisterCCalc != 0)
+ RevokeActiveObject(g_dwRegisterCCalc, NULL);
+
+ if(g_dwCCalcCF != 0)
+ CoRevokeClassObject(g_dwCCalcCF);
+
+ if(g_pcalc != NULL)
+ g_pcalc->Release();
+
+ OleUninitialize();
+
+ return NOERROR;
+}
+
+#ifdef _MAC
+struct regentry{
+ char *szKey;
+ char *szValue;
+} g_rgregentry[] = {
+
+ { "CLSID\\{00020467-0000-0000-C000-000000000046}",
+ "OLE Automation DispCalc 1.0 Application" }
+
+ , { "CLSID\\{00020467-0000-0000-C000-000000000046}\\LocalServer",
+ "DCLC" }
+
+ , { "CLSID\\{00020467-0000-0000-C000-000000000046}\\ProgID",
+ "Dispcalc.Application" }
+
+ , { "CLSID\\{00020467-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "DCLC", "{00020467-0000-0000-C000-000000000046}" }
+
+ , { "Dispcalc.Application\\CLSID",
+ "{00020467-0000-0000-C000-000000000046}" }
+
+};
+
+HRESULT
+EnsureRegistration()
+{
+ HKEY hkey;
+
+ if(RegOpenKey(HKEY_CLASSES_ROOT, "DCLC", &hkey) == NOERROR){
+ RegCloseKey(hkey);
+ return NOERROR;
+ }
+
+ for(int i = 0; i < DIM(g_rgregentry); ++i){
+ if(RegSetValue(HKEY_CLASSES_ROOT, g_rgregentry[i].szKey, REG_SZ, g_rgregentry[i].szValue, 0) != ERROR_SUCCESS)
+ return ResultFromScode(E_FAIL);
+ }
+
+ return NOERROR;
+}
+#endif
+
+/***
+*HRESULT InitOle(void)
+*Purpose:
+* Initialize Ole, and register our class factories.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+HRESULT
+InitOle()
+{
+ HRESULT hresult;
+ IClassFactory FAR* pcf;
+
+ if((hresult = OleInitialize(NULL)) != NOERROR)
+ goto LError0;
+
+#ifdef _MAC
+ if((hresult = EnsureRegistration()) != NOERROR)
+ goto LError0;
+#endif
+
+ // create the single global instance of CCalc
+ if((g_pcalc = CCalc::Create()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ if((pcf = CCalcCF::Create()) == NULL)
+ goto LError1;
+
+ hresult = CoRegisterClassObject(
+ CLSID_CCalc,
+ pcf,
+ CLSCTX_LOCAL_SERVER,
+ REGCLS_MULTIPLEUSE,
+ &g_dwCCalcCF);
+ if(hresult != NOERROR)
+ goto LError2;
+
+ hresult = RegisterActiveObject(
+ g_pcalc, CLSID_CCalc, NULL, &g_dwRegisterCCalc);
+ if(hresult != NOERROR)
+ goto LError2;
+
+ pcf->Release();
+
+ return NOERROR;
+
+LError2:;
+ pcf->Release();
+
+LError1:;
+ UninitOle();
+
+LError0:;
+ return hresult;
+}
+
+
diff --git a/private/oleauto/sample/dispcalc/dispcalc.def b/private/oleauto/sample/dispcalc/dispcalc.def
new file mode 100644
index 000000000..c10b01af7
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/dispcalc.def
@@ -0,0 +1,14 @@
+
+NAME DISPCALC
+
+DESCRIPTION 'IDispatch Calculator'
+
+EXETYPE WINDOWS
+
+STUB 'WINSTUB.EXE'
+
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MULTIPLE
+
+HEAPSIZE 4096
+STACKSIZE 8192
diff --git a/private/oleauto/sample/dispcalc/dispcalc.h b/private/oleauto/sample/dispcalc/dispcalc.h
new file mode 100644
index 000000000..0d7524d99
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/dispcalc.h
@@ -0,0 +1,240 @@
+/***
+*dispcalc.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* UNDONE
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "hostenv.h"
+#include "resource.h"
+#include "clsid.h"
+
+#ifndef CLASS
+# ifdef __TURBOC__
+# define CLASS class huge
+# else
+# define CLASS class FAR
+# endif
+#endif
+
+#pragma warning(disable:4355)
+
+#ifdef _MAC
+# define NEARDATA
+#else
+# ifdef WIN32
+# define NEARDATA
+# else
+# define NEARDATA __near
+# endif
+#endif
+
+#ifdef _MAC
+# define UNUSED(X) ((void)(void*)&(X))
+#else
+# define UNUSED(X) (X)
+#endif
+
+#define DIM(X) (sizeof(X)/sizeof(X[0]))
+
+
+
+// forward decl
+CLASS CCalc;
+
+// Introduced "calculator" interface
+//
+// This class implementes core arithmetic functionality
+// (such as it is) *and* is the interface that will be
+// exposed via IDispatch for external programmability.
+
+#if defined(_MAC) && !(!defined(applec) || defined(__SC__) || defined(_MSC_VER))
+
+// Mac Note: The default implementation of IDispatch places
+// a couple of requirements on the layout of an instance that
+// in can invoke on.
+//
+// 1. It assumes that the vtable pointer is at offset 0
+// from the beginning of the instance. This appears
+// to always be the case if the class derives from
+// an interface, and hence the games I play below
+// creating a stub _CArith interface containing a
+// single pure virtual function. The only reason for
+// this is to ensure that the vtable ptr is at offset
+// 0 when this class is a member of CCalc. If your
+// class derives from an Ole interface, then you are ok.
+//
+// 2. It assumes that the vtable is a simple array of
+// function pointers, with index zero reserved. In
+// order to ensure this, the class must derive from
+// SingleObject. Note that IUnknown derives from SingleObject,
+// so if your class derives from any Ole interface, then
+// you are also ok - otherwise you need to explicitly
+// derive from SingleObject as I have done below.
+//
+// (The above comments apply to MPW C++ v3.3)
+//
+
+interface _CArith : public SingleObject
+{
+ STDMETHOD_(void, put_Accum)(long l) PURE;
+};
+CLASS CArith : public _CArith
+#else
+CLASS CArith
+#endif
+{
+public:
+#if defined(_MAC)
+ BEGIN_INTERFACE
+#endif //_MAC
+
+ STDMETHOD_(void, put_Accum)(long l);
+ STDMETHOD_(long, get_Accum)(void);
+ STDMETHOD_(void, put_Opnd)(long l);
+ STDMETHOD_(long, get_Opnd)(void);
+ STDMETHOD_(void, put_Op)(short op);
+ STDMETHOD_(short, get_Op)(void);
+ STDMETHOD_(short, Eval)(void);
+ STDMETHOD_(void, Clear)(void);
+ STDMETHOD_(void, Display)(void);
+ STDMETHOD_(void, Quit)(void);
+ STDMETHOD_(short, Button)(BSTR button);
+
+ // the following method is internal, and not exposed for programmability
+ int ButtonPush(int button);
+
+ CArith(CCalc FAR* pcalc){
+ m_pcalc = pcalc;
+ Clear();
+ }
+ enum states { STATE_LOPND, STATE_OP, STATE_ROPND, STATE_EVAL };
+
+private:
+ CCalc FAR* m_pcalc;
+
+ short m_op;
+ long m_opnd;
+ long m_accum;
+ enum states m_state;
+};
+
+
+CLASS CCalc : public IUnknown {
+public:
+ friend CArith;
+
+ static CCalc FAR* Create();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ CCalc();
+
+#ifdef _MAC
+ DialogPtr m_pdlg;
+#else
+ HWND m_hwnd;
+#endif
+ CArith m_arith;
+
+private:
+ unsigned long m_refs;
+ IUnknown FAR* m_punkStdDisp;
+};
+
+enum operators {
+ OP_NONE = 0,
+ OP_PLUS,
+ OP_MINUS,
+ OP_MULT,
+ OP_DIV
+};
+
+// the following enum defines method indices used by the
+// default IDispatch implementation - DispInvoke().
+//
+// Note: these must match the order of the preceeding declarations
+//
+enum IMETH_CARITH {
+ IMETH_PUTACCUM = 0,
+ IMETH_GETACCUM,
+ IMETH_PUTOPERAND,
+ IMETH_GETOPERAND,
+ IMETH_PUTOPERATOR,
+ IMETH_GETOPERATOR,
+ IMETH_EVAL,
+ IMETH_CLEAR,
+ IMETH_DISPLAY,
+ IMETH_QUIT,
+ IMETH_BUTTON,
+
+ // Define the "property" indices. these are defined to be
+ // the first index in a set/get property method pair. These
+ // definitions are used to build the METHODDATA that drives
+ // our implementation of IDispatch. see cdisp.cpp.
+ //
+ IMETH_ACCUM = IMETH_PUTACCUM,
+ IMETH_OPERAND = IMETH_PUTOPERAND,
+ IMETH_OPERATOR = IMETH_PUTOPERATOR
+};
+
+// the following enum defines the IDs used by IDispatch
+//
+// Note: these values do *not* depend on order of declaration,
+// but are sensitive to the kind of the method - ie, if a get/set
+// method pair implements a property, then they need to share
+// an ID.
+//
+// Note: by assigning "accum" the ID 'DISPID_VALUE', we are
+// choosing to expose it as the default "value" property.
+//
+enum IDMEMBER_CARITH {
+ IDMEMBER_ACCUM = DISPID_VALUE, // the default property
+ IDMEMBER_OPERAND,
+ IDMEMBER_OPERATOR,
+ IDMEMBER_EVAL,
+ IDMEMBER_CLEAR,
+ IDMEMBER_DISPLAY,
+ IDMEMBER_QUIT,
+ IDMEMBER_BUTTON
+};
+
+
+// the CCalc Class Factory
+//
+CLASS CCalcCF : public IClassFactory {
+public:
+ static IClassFactory FAR* Create();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(CreateInstance)(
+ IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
+#ifdef _MAC
+ STDMETHOD(LockServer)(unsigned long fLock);
+#else
+ STDMETHOD(LockServer)(BOOL fLock);
+#endif
+
+ CCalcCF() { m_refs = 1; }
+
+private:
+ unsigned long m_refs;
+};
+
+extern HRESULT InitOle(void);
+extern HRESULT UninitOle(void);
+
+extern CCalc FAR* g_pcalc;
+
diff --git a/private/oleauto/sample/dispcalc/dispcalc.ico b/private/oleauto/sample/dispcalc/dispcalc.ico
new file mode 100644
index 000000000..57a644dfc
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/dispcalc.ico
Binary files differ
diff --git a/private/oleauto/sample/dispcalc/dispcalc.r b/private/oleauto/sample/dispcalc/dispcalc.r
new file mode 100644
index 000000000..7a0509cf6
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/dispcalc.r
@@ -0,0 +1,313 @@
+/***
+*dispcalc.r
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Resource script for dispcalc.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "types.r"
+#include "resource.h"
+
+#if defined (_PPCMAC)
+include "cfrg.rsc";
+#endif
+
+
+/* we use an MBAR resource to conveniently load all the menus */
+
+resource 'MBAR' (rMenuBar, preload) {
+ { mApple, mFile, mEdit }
+};
+
+resource 'MENU' (mApple, preload) {
+ mApple,
+ textMenuProc,
+ 0b11111111111111111111111111111101,
+ enabled,
+ apple,
+ {
+ "About DispCalc\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mFile, preload) {
+ mFile,
+ textMenuProc,
+ 0b00000000000000000000100000000000,
+ enabled,
+ "File",
+ {
+ "New",
+ noicon, "N", nomark, plain;
+ "Open",
+ noicon, "O", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Close",
+ noicon, "W", nomark, plain;
+ "Save",
+ noicon, "S", nomark, plain;
+ "Save As\311",
+ noicon, nokey, nomark, plain;
+ "Revert",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Page Setup\311",
+ noicon, nokey, nomark, plain;
+ "Print\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Quit",
+ noicon, "Q", nomark, plain
+ }
+};
+
+resource 'MENU' (mEdit, preload) {
+ mEdit,
+ textMenuProc,
+ 0b00000000000000000000000000000000,
+ enabled,
+ "Edit",
+ {
+ "Undo",
+ noicon, "Z", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Cut",
+ noicon, "X", nomark, plain;
+ "Copy",
+ noicon, "C", nomark, plain;
+ "Paste",
+ noicon, "V", nomark, plain;
+ "Clear",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'DLOG' (rCalc) {
+ {100, 100, 240, 220},
+ rDocProc,
+ visible,
+ noGoAway,
+ 0x0,
+ rCalc,
+ "DispCalc"
+};
+
+resource 'DITL' (rCalc) {
+ {
+ {110,10,130,30}, Button { enabled, "0" } /* 1 */
+ , {85,10,105,30}, Button { enabled, "1" } /* 2 */
+ , {85,35,105,55}, Button { enabled, "2" } /* 3 */
+ , {85,60,105,80}, Button { enabled, "3" } /* 4 */
+ , {60,10,80,30}, Button { enabled, "4" } /* 5 */
+ , {60,35,80,55}, Button { enabled, "5" } /* 6 */
+ , {60,60,80,80}, Button { enabled, "6" } /* 7 */
+ , {35,10,55,30}, Button { enabled, "7" } /* 8 */
+ , {35,35,55,55}, Button { enabled, "8" } /* 9 */
+ , {35,60,55,80}, Button { enabled, "9" } /* 10 */
+
+ , {35,85,55,105}, Button { enabled, "+" } /* 11 */
+ , {60,85,80,105}, Button { enabled, "-" } /* 12 */
+ , {85,85,105,105}, Button { enabled, "*" } /* 13 */
+ , {110,85,130,105}, Button { enabled, "/" } /* 14 */
+
+ , {110,35,130,55}, Button { enabled, "C" } /* 15 */
+ , {110,60,130,80}, Button { enabled, "=" } /* 16 */
+
+ , {10,10,25,105}, EditText { disabled, "" } /* 17 */
+ }
+};
+
+/* this ALRT and DITL are used as an About screen */
+
+resource 'ALRT' (rAboutAlert, purgeable) {
+ {40, 20, 160, 290},
+ rAboutAlert,
+ {
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+resource 'DITL' (rAboutAlert, purgeable) {
+ { /* array DITLarray: 5 elements */
+ /* [1] */
+ {88, 180, 108, 260},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {8, 8, 24, 214},
+ StaticText {
+ disabled,
+ "The IDispatch Calculator"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an error screen */
+
+resource 'ALRT' (rUserAlert, purgeable) {
+ {40, 20, 120, 260},
+ rUserAlert,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+
+resource 'DITL' (rUserAlert, purgeable) {
+ {
+ /* [1] */
+ {50, 150, 70, 230},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 30, 230},
+ StaticText {
+ disabled,
+ "Error. ^0"
+ },
+ /* [3] */
+ {8, 8, 40, 40},
+ Icon {
+ disabled,
+ 2
+ }
+ }
+};
+
+
+resource 'SIZE' (-1) {
+ dontSaveScreen,
+ acceptSuspendResumeEvents,
+ enableOptionSwitch,
+ canBackground,
+ multiFinderAware,
+ backgroundAndForeground,
+ dontGetFrontClicks,
+ ignoreChildDiedEvents,
+ is32BitCompatible,
+ isHighLevelEventAware,
+ localAndRemoteHLEvents,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ kPrefSize * 1024,
+ kMinSize * 1024
+};
+
+
+resource 'BNDL' (128) {
+ 'DCLC',
+ 0,
+ { /* array TypeArray: 2 elements */
+ /* [1] */
+ 'FREF',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 128
+ },
+ /* [2] */
+ 'ICN#',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 128
+ }
+ }
+};
+
+resource 'FREF' (128) {
+ 'APPL',
+ 0,
+ ""
+};
+
+data 'ICN#' (128) {
+ $"003F FFFF 0040 0001 0040 0001 004F FFF9" /* .?ÿÿ.@...@...Oÿù */
+ $"0048 0009 0048 0009 0048 0009 004F FFF9" /* .H.Æ.H.Æ.H.Æ.Oÿù */
+ $"0040 0001 0040 0001 004F FFF9 0048 8889" /* .@...@...Oÿù.Hˆ‰ */
+ $"0048 8889 0048 8889 004F FFF9 0040 0001" /* .Hˆ‰.Hˆ‰.Oÿù.@.. */
+ $"004F FFF9 0048 8889 0048 8889 004C 8889" /* .Oÿù.Hˆ‰.Hˆ‰.Lˆ‰ */
+ $"005F FFF9 0078 0001 01FF FFF9 00F8 8889" /* ._ÿù.x...ÿÿù.øˆ‰ */
+ $"0068 8889 0168 8889 064F FFF9 1E40 0001" /* .hˆ‰.hˆ‰.Oÿù.@.. */
+ $"7C40 0001 3C7F FFFF 183F FFFF 0800 0000" /* |@..<.ÿÿ.?ÿÿ.... */
+ $"003F FFFF 007F FFFF 007F FFFF 007F FFFF" /* .?ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"007F FFFF 007F FFFF 007F FFFF 007F FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"007F FFFF 007F FFFF 007F FFFF 007F FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"007F FFFF 007F FFFF 007F FFFF 007F FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"007F FFFF 007F FFFF 007F FFFF 007F FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"007F FFFF 007F FFFF 01FF FFFF 00FF FFFF" /* ..ÿÿ..ÿÿ.ÿÿÿ.ÿÿÿ */
+ $"007F FFFF 017F FFFF 067F FFFF 1E7F FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"7C7F FFFF 3C7F FFFF 183F FFFF 0800 0000" /* |.ÿÿ<.ÿÿ.?ÿÿ.... */
+};
+
+data 'icl4' (128) {
+ $"0000 0000 00FF FFFF FFFF FFFF FFFF FFFF" /* .....ÿÿÿÿÿÿÿÿÿÿÿ */
+ $"0000 0000 0F00 0000 0000 0000 0000 000F" /* ................ */
+ $"0000 0000 0F0C CCCC CCCC CCCC CCCC CCDF" /* ......ÌÌÌÌÌÌÌÌÌß */
+ $"0000 0000 0F0C DDDD DDDD DDDD DDDD DCDF" /* ......ÝÝÝÝÝÝÝÝÜß */
+ $"0000 0000 0F0C DCCC CCCC CCCC CCCC 0CDF" /* ......ÜÌÌÌÌÌÌÌ.ß */
+ $"0000 0000 0F0C DCCC CCCC CCCC CCCC 0CDF" /* ......ÜÌÌÌÌÌÌÌ.ß */
+ $"0000 0000 0F0C DCCC CCCC CCCC CCCC 0CDF" /* ......ÜÌÌÌÌÌÌÌ.ß */
+ $"0000 0000 0F0C 0000 0000 0000 0000 0CDF" /* ...............ß */
+ $"0000 0000 0F0C CCCC CCCC CCCC CCCC CCDF" /* ......ÌÌÌÌÌÌÌÌÌß */
+ $"0000 0000 0F0C CCCC CCCC CCCC CCCC CCDF" /* ......ÌÌÌÌÌÌÌÌÌß */
+ $"0000 0000 0F0C DDDD DDDD DDDD DDDD DCDF" /* ......ÝÝÝÝÝÝÝÝÜß */
+ $"0000 0000 0F0C F00C F00C F00C F00C FCDF" /* ......ð.ð.ð.ð.üß */
+ $"0000 0000 0F0C F0CD F0CD F0CD F0CD FCDF" /* ......ðÍðÍðÍðÍüß */
+ $"0000 0000 0F0C FCDD FCDD FCDD FCDD FCDF" /* ......üÝüÝüÝüÝüß */
+ $"0000 0000 0F0C FFFF FFFF FFFF FFFF FCDF" /* ......ÿÿÿÿÿÿÿÿüß */
+ $"0000 0000 0F0C CCCC CCCC CCCC CCCC CCDF" /* ......ÌÌÌÌÌÌÌÌÌß */
+ $"0000 0000 0F0C DDDD DDDD DDDD DDDD DCDF" /* ......ÝÝÝÝÝÝÝÝÜß */
+ $"0000 0000 0F0C F00C F00C F00C F00C FCDF" /* ......ð.ð.ð.ð.üß */
+ $"0000 0000 0F0C F0CD F0CD F0CD F0CD FCDF" /* ......ðÍðÍðÍðÍüß */
+ $"0000 0000 0F0C F3DD FCDD FCDD FCDD FCDF" /* ......óÝüÝüÝüÝüß */
+ $"0000 0000 0F03 3FFF FFFF FFFF FFFF FCDF" /* ......?ÿÿÿÿÿÿÿüß */
+ $"0000 0000 033F 3CCC CCCC CCCC CCCC CCDF" /* .....?<ÌÌÌÌÌÌÌÌß */
+ $"0000 0003 33F3 DDDD DDDD DDDD DDDD DCDF" /* ....3óÝÝÝÝÝÝÝÝÜß */
+ $"0000 0000 3F33 F00C F00C F00C F00C FCDF" /* ....?3ð.ð.ð.ð.üß */
+ $"0000 0000 033C F0CD F0CD F0CD F0CD FCDF" /* .....<ðÍðÍðÍðÍüß */
+ $"0000 0003 0F3C FCDD FCDD FCDD FCDD FCDF" /* .....<üÝüÝüÝüÝüß */
+ $"0000 0330 0F0C FFFF FFFF FFFF FFFF FCDF" /* ...0..ÿÿÿÿÿÿÿÿüß */
+ $"0003 3F30 0F0C CCCC CCCC CCCC CCCC CCDF" /* ..?0..ÌÌÌÌÌÌÌÌÌß */
+ $"0333 F300 0F0D DDDD DDDD DDDD DDDD DDDF" /* .3ó..ÂÝÝÝÝÝÝÝÝÝß */
+ $"003F 3300 0FFF FFFF FFFF FFFF FFFF FFFF" /* .?3..ÿÿÿÿÿÿÿÿÿÿÿ */
+ $"0003 3000 00FF FFFF FFFF FFFF FFFF FFFF" /* ..0..ÿÿÿÿÿÿÿÿÿÿÿ */
+ $"0000 3000 0000 0000 0000 0000 0000 0000" /* ..0............. */
+};
+
+data 'DCLC' (0, "Owner resource") {
+ $"00" /* . */
+};
diff --git a/private/oleauto/sample/dispcalc/dispcalc.r32 b/private/oleauto/sample/dispcalc/dispcalc.r32
new file mode 100644
index 000000000..94dc95e33
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/dispcalc.r32
@@ -0,0 +1,21 @@
+REGEDIT
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DispCalc.Application (defaults to DispCalc.Application.1
+
+HKEY_CLASSES_ROOT\Dispcalc.Application = OLE Automation Dispcalc Application
+HKEY_CLASSES_ROOT\Dispcalc.Application\Clsid = {00020467-0000-0000-C000-000000000046}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DispCalc 1.0
+
+HKEY_CLASSES_ROOT\Dispcalc.Application.1 = OLE Automation Dispcalc 1.0 Application
+HKEY_CLASSES_ROOT\Dispcalc.Application.1\Clsid = {00020467-0000-0000-C000-000000000046}
+
+
+HKEY_CLASSES_ROOT\CLSID\{00020467-0000-0000-C000-000000000046} = OLE Automation Dispcalc 1.0 Application
+HKEY_CLASSES_ROOT\CLSID\{00020467-0000-0000-C000-000000000046}\ProgID = Dispcalc.Application.1
+HKEY_CLASSES_ROOT\CLSID\{00020467-0000-0000-C000-000000000046}\VersionIndependentProgID = Dispcalc.Application
+HKEY_CLASSES_ROOT\CLSID\{00020467-0000-0000-C000-000000000046}\LocalServer32 = dispcalc.exe /Automation
diff --git a/private/oleauto/sample/dispcalc/dispcalc.rc b/private/oleauto/sample/dispcalc/dispcalc.rc
new file mode 100644
index 000000000..71ba1f5a1
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/dispcalc.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+#include "resource.h"
+
+DispCalc ICON dispcalc.ico
+
+DispCalc DIALOG DISCARDABLE 0, 0, 92, 114
+STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
+CLASS "DispCalc"
+#ifdef WIN32
+CAPTION "DispCalc (32-bit)"
+#else //WIN32
+CAPTION "DispCalc"
+#endif //WIN32
+BEGIN
+ PUSHBUTTON "0", IDC_ZERO, 9, 90, 14, 15
+ PUSHBUTTON "1", IDC_ONE, 9, 70, 15, 16
+ PUSHBUTTON "2", IDC_TWO, 29, 70, 16, 15
+ PUSHBUTTON "3", IDC_THREE, 49, 70, 15, 15
+ PUSHBUTTON "4", IDC_FOUR, 9, 50, 15, 14
+ PUSHBUTTON "5", IDC_FIVE, 29, 50, 15, 15
+ PUSHBUTTON "6", IDC_SIX, 49, 50, 15, 15
+ PUSHBUTTON "7", IDC_SEVEN, 9, 30, 15, 15
+ PUSHBUTTON "8", IDC_EIGHT, 29, 30, 15, 15
+ PUSHBUTTON "9", IDC_NINE, 49, 30, 15, 15
+ PUSHBUTTON "=", IDC_EQUALS, 49, 90, 14, 15
+ PUSHBUTTON "+", IDC_PLUS, 69, 30, 15, 15
+ PUSHBUTTON "-", IDC_MINUS, 69, 50, 14, 15
+ PUSHBUTTON "*", IDC_MULT, 69, 70, 15, 15
+ PUSHBUTTON "/", IDC_DIV, 69, 90, 15, 15
+ PUSHBUTTON "C", IDC_CLEAR, 29, 90, 16, 15
+ EDITTEXT IDC_DISPLAY, 9, 6, 76, 15, ES_MULTILINE | ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY
+END
diff --git a/private/oleauto/sample/dispcalc/dispcalc.reg b/private/oleauto/sample/dispcalc/dispcalc.reg
new file mode 100644
index 000000000..9addc9d8f
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/dispcalc.reg
@@ -0,0 +1,22 @@
+REGEDIT
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DispCalc.Application (defaults to DispCalc.Application.1
+
+HKEY_CLASSES_ROOT\Dispcalc.Application = OLE Automation Dispcalc Application
+HKEY_CLASSES_ROOT\Dispcalc.Application\Clsid = {00020467-0000-0000-C000-000000000046}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DispCalc 1.0
+
+HKEY_CLASSES_ROOT\Dispcalc.Application.1 = OLE Automation Dispcalc 1.0 Application
+HKEY_CLASSES_ROOT\Dispcalc.Application.1\Clsid = {00020467-0000-0000-C000-000000000046}
+
+
+HKEY_CLASSES_ROOT\CLSID\{00020467-0000-0000-C000-000000000046} = OLE Automation Dispcalc 1.0 Application
+HKEY_CLASSES_ROOT\CLSID\{00020467-0000-0000-C000-000000000046}\ProgID = Dispcalc.Application.1
+HKEY_CLASSES_ROOT\CLSID\{00020467-0000-0000-C000-000000000046}\VersionIndependentProgID = Dispcalc.Application
+HKEY_CLASSES_ROOT\CLSID\{00020467-0000-0000-C000-000000000046}\LocalServer = dispcalc.exe /Automation
+
diff --git a/private/oleauto/sample/dispcalc/driver.bas b/private/oleauto/sample/dispcalc/driver.bas
new file mode 100644
index 000000000..49ecb805a
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/driver.bas
@@ -0,0 +1,29 @@
+Global DispCalc As Object ' Calculator object, scope is global to application.
+
+Sub Main ()
+
+ ' Get a number to put in calculator.
+ x = InputBox("Enter a number to begin with.")
+ If x = "" Then Exit Sub ' Check if canceled,
+
+ Set DispCalc = CreateObject("dispcalc.application") ' Create new instance of calculator.
+
+ DispCalc = x ' Assign x to DispCalc's default property.
+ DispCalc.Display ' Display value.
+
+ ' Initialize data in listbox.
+ frmDriver.lstScript.AddItem "Cube"
+ frmDriver.lstScript.AddItem "Count down"
+ frmDriver.lstScript.AddItem "Decrement"
+ frmDriver.lstScript.AddItem "Factorial"
+ frmDriver.lstScript.AddItem "Increment"
+ frmDriver.lstScript.AddItem "Square"
+ frmDriver.lstScript.AddItem "Square root"
+ frmDriver.lstScript.AddItem "Tangent"
+ frmDriver.lstScript.AddItem "Quit"
+
+ ' Display form.
+ frmDriver.Show
+
+End Sub
+
diff --git a/private/oleauto/sample/dispcalc/driver.mak b/private/oleauto/sample/dispcalc/driver.mak
new file mode 100644
index 000000000..936800474
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/driver.mak
@@ -0,0 +1,7 @@
+DRIVER.BAS
+FRMDRIVE.FRM
+ProjWinSize=321,766,248,215
+ProjWinShow=2
+IconForm="frmDriver"
+Title="DRIVER"
+ExeName="DRIVER.EXE"
diff --git a/private/oleauto/sample/dispcalc/frmdrive.frm b/private/oleauto/sample/dispcalc/frmdrive.frm
new file mode 100644
index 000000000..7cd55f355
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/frmdrive.frm
@@ -0,0 +1,111 @@
+VERSION 2.00
+Begin Form frmDriver
+ BorderStyle = 1 'Fixed Single
+ Caption = "Choose script to run"
+ ClientHeight = 2496
+ ClientLeft = 4800
+ ClientTop = 1380
+ ClientWidth = 3204
+ Height = 2916
+ Icon = FRMDRIVE.FRX:0000
+ Left = 4752
+ LinkTopic = "Form1"
+ MaxButton = 0 'False
+ ScaleHeight = 2496
+ ScaleWidth = 3204
+ Top = 1008
+ Width = 3300
+ Begin ListBox lstScript
+ Height = 2520
+ Left = 0
+ TabIndex = 0
+ Top = 0
+ Width = 3252
+ End
+End
+
+Sub lstScript_Click ()
+
+ x = DispCalc.Accum ' Get Accum property (displayed value).
+
+ Select Case lstScript.List(lstScript.ListIndex)
+
+ Case "Decrement"
+ DispCalc.Accum = x - 1 ' Decrement Accum property and display.
+ DispCalc.Display
+
+ Case "Count down"
+ If DispCalc.Accum < 0 Then
+ MsgBox ("Value too small.")
+ Exit Sub
+ End If
+ ' Decrement default property (Accum) till zero.
+ Do Until DispCalc = 0
+ DispCalc = DispCalc - 1
+ DispCalc.Display
+ Loop
+
+ Case "Cube"
+ If DispCalc.Accum > 1000 Then
+ MsgBox ("Value too large.")
+ Exit Sub
+ End If
+ DispCalc.Op = 3 ' Use DispCalc's operator method (Op).
+ DispCalc.Opnd = x
+ DispCalc.Eval ' Evaluate operation twice (cube).
+ DispCalc.Eval
+ DispCalc.Display
+
+ Case "Factorial"
+ If DispCalc.Accum > 16 Then
+ MsgBox ("Value too large.")
+ Exit Sub
+ End If
+ DispCalc.Op = 3 ' Use DispCalc's operator method (Op).
+ For i = 1 To (x - 1)
+ DispCalc.Opnd = i
+ DispCalc.Eval
+ DispCalc.Display
+ Next
+
+ Case "Increment"
+ DispCalc.Accum = x + 1 ' Increment Accum property and display.
+ DispCalc.Display
+
+ Case "Square"
+ If DispCalc.Accum > 30000 Then
+ MsgBox ("Value too large.")
+ Exit Sub
+ End If
+ DispCalc.Op = 3 ' Use DispCalc's operator method (Op).
+ DispCalc.Opnd = x
+ DispCalc.Eval ' Evaluate operation once (square).
+ DispCalc.Display
+
+ Case "Square root"
+ If DispCalc.Accum < 1 Then
+ MsgBox ("Value too small.")
+ Exit Sub
+ End If
+ DispCalc.Accum = Sqr(x) ' Use intrinsic function.
+ DispCalc.Display ' Note that Calculator display integers only.
+
+ Case "Tangent"
+ DispCalc.Value = Tan(x) ' Use intrinsic function.
+ DispCalc.Display ' Note that Calculator display integers only.
+
+ Case "Quit"
+ x = MsgBox("Close Calculator?", 35)
+ Select Case x
+ Case 6 ' If "Yes", then close calculator and end.
+ DispCalc.Quit
+ End
+ Case 7 ' If "No", then
+ End ' leave calculator running.
+ Case Else ' Otherwise, do nothing.
+ End Select
+
+ End Select
+
+End Sub
+
diff --git a/private/oleauto/sample/dispcalc/frmdrive.frx b/private/oleauto/sample/dispcalc/frmdrive.frx
new file mode 100644
index 000000000..d3ddba689
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/frmdrive.frx
Binary files differ
diff --git a/private/oleauto/sample/dispcalc/hostenv.h b/private/oleauto/sample/dispcalc/hostenv.h
new file mode 100644
index 000000000..56a311393
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/hostenv.h
@@ -0,0 +1,117 @@
+/***
+*hostenv.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Generic host specific includes.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(_MAC)
+
+#if defined(_PPCMAC)
+#pragma data_seg("_FAR_DATA")
+#pragma data_seg( )
+#define MAXLONG 0x7fffffff
+#define EventHandlerProcPtr AEEventHandlerUPP
+#else //_PPCMAC
+#define GetMenuItemText(mApple,menuItem,daName) GetItem(mApple,menuItem,daName)
+#endif //_PPCMAC
+
+#endif //_MAC
+
+#if defined(_MAC)
+
+#if defined(_MSC_VER)
+
+# include <values.h>
+# include <types.h>
+# include <string.h>
+# include <quickdra.h>
+# include <fonts.h>
+# include <events.h>
+# include <resource.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutil.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEve.h>
+
+#else //_MSC_VER
+
+# include <values.h>
+# include <types.h>
+# include <strings.h>
+# include <quickdraw.h>
+# include <fonts.h>
+# include <events.h>
+# include <resources.h>
+# include <windows.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutils.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEvents.h>
+
+#endif //_MSC_VER
+
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+
+#elif defined(WIN32)
+
+# include <windows.h>
+
+# if defined(UNICODE)
+ #define TCHAR WCHAR
+ #define TSTR(str) L##str
+ #define STRING(str) (str)
+ #define WIDESTRING(str) (str)
+# else
+ #define TCHAR char
+ #define TSTR(str) str
+ #define STRING(str) AnsiString(str)
+ #define WIDESTRING(str) WideString(str)
+ extern "C" char FAR* AnsiString(OLECHAR FAR* strIn);
+ extern "C" OLECHAR FAR* WideString(char FAR* strIn);
+# endif
+
+
+#else /* WIN16 */
+
+# include <windows.h>
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+#endif
+
diff --git a/private/oleauto/sample/dispcalc/idata.cpp b/private/oleauto/sample/dispcalc/idata.cpp
new file mode 100644
index 000000000..9963df67e
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/idata.cpp
@@ -0,0 +1,85 @@
+/***
+*idata.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the INTERFACEDATA definitions for the methods
+* and properties on the CCalc object that are exposed for external
+* programmability via IDispatch.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dispcalc.h"
+
+
+//---------------------------------------------------------------------
+// INTERFACEDATA definitions
+//---------------------------------------------------------------------
+
+/* The INTERFACEDATA table describes the methods and properties that
+ * are being exposed for external programmability via IDispatch.
+ * This table is used to construct a CDispTypeInfo for this interface,
+ * and that TypeInfo is in turn used to initialize and drive the
+ * default implementation of IDispatch.
+ */
+
+
+// PDATA1() declares the PARAMDATA for a methods that takes a single param
+//
+#define PDATA1(NAME, TYPE) \
+ static PARAMDATA NEARDATA rgpdata ## NAME = {OLESTR(#NAME), TYPE}
+
+// MDATA() declares a single METHODDATA entry
+//
+#define MDATA(NAME, PDATA, IDMEMBER, IMETH, CARGS, KIND, TYPE) \
+ { OLESTR(#NAME), PDATA, IDMEMBER, IMETH, CC_CDECL, CARGS, KIND, TYPE }
+
+// The following macro defines the METHODDATA entries for a
+// property Put/Get method pair.
+//
+// Note: this macro *assumes* that the Put/Get pair are adjacent
+// in the vtable, and that the Put method comes first.
+//
+#define PROPERTY(NAME, IMETH, ID, TYPE) \
+ MDATA(NAME, &rgpdata ## NAME, ID, IMETH, 1,DISPATCH_PROPERTYPUT,VT_EMPTY), \
+ MDATA(NAME, NULL, ID, IMETH+1, 0, DISPATCH_PROPERTYGET, TYPE)
+
+// The following macro is used to define a METHODDATA entry for
+// a method that takes zero parameters.
+//
+#define METHOD0(NAME, IMETH, ID, TYPE) \
+ MDATA(NAME, NULL, ID, IMETH, 0, DISPATCH_METHOD, TYPE)
+
+// and for one param
+#define METHOD1(NAME, IMETH, ID, TYPE) \
+ MDATA(NAME, &rgpdata ## NAME, ID, IMETH, 1, DISPATCH_METHOD, TYPE)
+
+
+PDATA1(VALUE, VT_I4);
+PDATA1(ACCUM, VT_I4);
+PDATA1(OPND, VT_I4);
+PDATA1(OP, VT_I2);
+PDATA1(BUTTON, VT_BSTR);
+
+static METHODDATA NEARDATA rgmdataCCalc[] =
+{
+ PROPERTY(VALUE, IMETH_ACCUM, IDMEMBER_ACCUM, VT_I4)
+ , PROPERTY(ACCUM, IMETH_ACCUM, IDMEMBER_ACCUM, VT_I4)
+ , PROPERTY(OPND, IMETH_OPERAND, IDMEMBER_OPERAND, VT_I4)
+ , PROPERTY(OP, IMETH_OPERATOR, IDMEMBER_OPERATOR, VT_I2)
+ , METHOD0(EVAL, IMETH_EVAL, IDMEMBER_EVAL, VT_BOOL)
+ , METHOD0(CLEAR, IMETH_CLEAR, IDMEMBER_CLEAR, VT_EMPTY)
+ , METHOD0(DISPLAY, IMETH_DISPLAY, IDMEMBER_DISPLAY, VT_EMPTY)
+ , METHOD0(QUIT, IMETH_QUIT, IDMEMBER_QUIT, VT_EMPTY)
+ , METHOD1(BUTTON, IMETH_BUTTON, IDMEMBER_BUTTON, VT_BOOL)
+};
+
+INTERFACEDATA NEARDATA g_idataCCalc =
+{
+ rgmdataCCalc, DIM(rgmdataCCalc)
+};
diff --git a/private/oleauto/sample/dispcalc/macmain.cpp b/private/oleauto/sample/dispcalc/macmain.cpp
new file mode 100644
index 000000000..8b984b03c
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/macmain.cpp
@@ -0,0 +1,306 @@
+/***
+*macmain.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module is the main entry point for the sample IDispatch calculator
+* server, dispcalc.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dispcalc.h"
+
+#include <stdio.h>
+
+extern "C" {
+
+Boolean g_fInitOle = false;
+#ifndef _PPCMAC
+Boolean g_fInitLibraryManager = false;
+#endif //!_PPCMAC
+}
+
+Boolean g_fQuit = false;
+
+
+void Init(void);
+void EventLoop(void);
+
+void AdjustMenus(void);
+void DoEvent(EventRecord *pevent);
+void DoMenuCommand(long menuResult);
+void Quit(void);
+#ifndef _MSC_VER
+#ifndef ConstStr255Param
+#define ConstStr255Param StringPtr
+#endif
+#endif
+void Fatal(ConstStr255Param);
+
+Boolean
+IsAppWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : ((WindowPeek)window)->windowKind == userKind;
+}
+
+Boolean
+IsDAWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind < 0);
+}
+
+void
+main()
+{
+ Init();
+ EventLoop();
+}
+
+void
+EventLoop()
+{
+ short sItem;
+ DialogPtr pdlg;
+ EventRecord event;
+ RgnHandle cursorRgn;
+
+ cursorRgn = NewRgn();
+ while(1){
+ if(WaitNextEvent(everyEvent, &event, MAXLONG, cursorRgn)){
+ if(FrontWindow() != nil
+ && event.what != diskEvt
+ && (event.what != keyDown || (event.modifiers & cmdKey) == 0)
+ && IsDialogEvent(&event))
+ {
+ if(DialogSelect(&event, &pdlg, &sItem)){
+ // REVIEW: replace following with an assertion
+ if(pdlg != g_pcalc->m_pdlg)
+ Debugger();
+ g_pcalc->m_arith.ButtonPush(sItem);
+ }
+ }else{
+ DoEvent(&event);
+ }
+ }
+ if (g_fQuit)
+ Quit();
+ }
+}
+
+void
+DoEvent(EventRecord *pevent)
+{
+ char key;
+ short part;
+ WindowPtr window;
+
+ switch(pevent->what){
+ case mouseDown:
+ part = FindWindow(pevent->where, &window);
+ switch(part){
+ case inMenuBar:
+ AdjustMenus();
+ DoMenuCommand(MenuSelect(pevent->where));
+ break;
+
+ case inSysWindow: /* let the system handle the mouseDown */
+ SystemClick(pevent, window);
+ break;
+
+ case inContent:
+ if(window != FrontWindow()){
+ SelectWindow(window);
+ }
+ break;
+
+ case inDrag:
+ DragWindow(window, pevent->where, &qd.screenBits.bounds);
+ break;
+ }
+ break;
+
+ case keyDown:
+ case autoKey: /* check for menukey equivalents */
+ key = (char)(pevent->message & charCodeMask);
+ if(pevent->modifiers & cmdKey){ /* Command key down */
+ if(pevent->what == keyDown){
+ /* enable/disable/check menu items properly */
+ AdjustMenus();
+ DoMenuCommand(MenuKey(key));
+ }
+ }
+ break;
+
+ case kHighLevelEvent:
+ AEProcessAppleEvent(pevent);
+ break;
+ }
+}
+
+void
+Enable(MenuHandle hmenu, short sItem, Boolean fEnable)
+{
+ if(fEnable)
+ EnableItem(hmenu, sItem);
+ else
+ DisableItem(hmenu, sItem);
+}
+
+void
+AdjustMenus()
+{
+ Boolean fIsDA;
+ MenuHandle hmenu;
+
+ fIsDA = IsDAWindow(FrontWindow());
+
+ /* we can allow desk accessories to be closed from the menu */
+ hmenu = GetMHandle(mFile);
+ Enable(hmenu, iClose, fIsDA);
+
+ hmenu = GetMHandle(mEdit);
+ Enable(hmenu, iUndo, fIsDA);
+ Enable(hmenu, iCut, fIsDA);
+ Enable(hmenu, iCopy, fIsDA);
+ Enable(hmenu, iPaste, fIsDA);
+ Enable(hmenu, iClear, fIsDA);
+}
+
+void
+DoMenuCommand(long menuResult)
+{
+ short menuID; /* the resource ID of the selected menu */
+ short menuItem; /* the item number of the selected menu */
+ Str255 daName;
+
+ menuID = HiWord(menuResult);
+ menuItem = LoWord(menuResult);
+
+ switch(menuID){
+ case mApple:
+ switch(menuItem){
+ case iAbout: /* bring up alert for About */
+ Alert(rAboutAlert, nil);
+ break;
+ default:
+ GetMenuItemText(GetMHandle(mApple), menuItem, daName);
+ OpenDeskAcc(daName);
+ break;
+ }
+ break;
+
+ case mFile:
+ switch(menuItem){
+ case iQuit:
+ Quit();
+ break;
+ }
+ break;
+
+ case mEdit:
+ SystemEdit(menuItem-1);
+ break;
+ }
+
+ HiliteMenu(0);
+}
+
+#if defined(_MSC_VER)
+OSErr pascal
+#else
+pascal OSErr
+#endif
+RemoteLowLevelEvt(AppleEvent theAppEvt, AppleEvent reply, long HandlerRefCon)
+{
+ long cb;
+ OSErr err;
+ DescType descType;
+ EventRecord event;
+
+ UNUSED(reply);
+ UNUSED(HandlerRefCon);
+
+ err = AEGetKeyPtr(
+ &theAppEvt,
+ keyDirectObject,
+ typeWildCard,
+ &descType,
+ (Ptr)&event, sizeof(event), &cb);
+
+ if(err != noErr)
+ return err;
+
+ DoEvent(&event);
+
+ return noErr;
+}
+
+void
+Init()
+{
+ Handle menuBar;
+
+ MaxApplZone();
+
+ InitGraf((Ptr)&qd.thePort);
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ TEInit();
+ InitDialogs(nil);
+ InitCursor();
+ FlushEvents(everyEvent, 0);
+
+#ifndef _PPCMAC
+ if (InitOleManager(0) != NOERROR)
+ Fatal((ConstStr255Param)"\pCould not initialize OLE Applet");
+
+ g_fInitLibraryManager = true;
+#endif //!_PPCMAC
+
+ if(InitOle() != NOERROR)
+ Fatal((ConstStr255Param)"\pUnable to Initialize Ole");
+ g_fInitOle = true;
+
+ if(AEInstallEventHandler('OLE2', 'EVNT', (EventHandlerProcPtr)RemoteLowLevelEvt, 0, false) != noErr)
+ Fatal((ConstStr255Param)"\pUnable to install handler");
+
+ if((g_pcalc->m_pdlg = GetNewDialog(rCalc, nil, (WindowPtr)-1)) == nil)
+ Fatal((ConstStr255Param)"\pUnable to create dialog");
+
+ if((menuBar = GetNewMBar(rMenuBar)) == nil)
+ Fatal((ConstStr255Param)"\pUnable to load menu bar");
+
+ SetMenuBar(menuBar);
+ DisposHandle(menuBar);
+ AddResMenu(GetMHandle(mApple), 'DRVR'); /* add DA names to Apple menu */
+ DrawMenuBar();
+}
+
+void
+Quit()
+{
+ if(g_fInitOle)
+ UninitOle();
+#ifndef _PPCMAC
+ if(g_fInitLibraryManager)
+ UninitOleManager(); // clean up applet
+#endif //_PPCMAC
+ ExitToShell();
+}
+
+/* display fatal error alert, and exit */
+void
+Fatal(ConstStr255Param msg)
+{
+ SetCursor(&qd.arrow);
+ ParamText(msg, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
+ Alert(rUserAlert, nil);
+ Quit();
+}
+
diff --git a/private/oleauto/sample/dispcalc/makefile b/private/oleauto/sample/dispcalc/makefile
new file mode 100644
index 000000000..250438d47
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/makefile
@@ -0,0 +1,354 @@
+##############################################################################
+#
+# (c) Copyright Microsoft Corp. 1992-1994 All Rights Reserved
+#
+# File:
+#
+# makefile - makefile for dispcalc.exe
+#
+# Purpose:
+#
+# Builds the OLE 2.0 sample IDispatch server, dispcalc.exe.
+#
+#
+# Usage:
+#
+# NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option:
+# dev = [win16 | win32 | mac] ; dev=win16 is the default
+# CPU = [i386 | M68K | MIPS | ALPHA | PPC]
+# DEBUG=[0|1] ; DEBUG=1 is the default
+#
+# Notes:
+#
+# This makefile assumes that the CPU, PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+##############################################################################
+
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if "$(dev)" == ""
+dev = win16
+!endif
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32" || "$(dev)" == "mac")
+!error Invalid dev option, choose from [win16 | win32 | mac]
+!endif
+
+!if "$(dev)" == "win16"
+TARGET = WIN16
+!endif
+
+!if "$(dev)" == "win32"
+TARGET = WIN32
+!endif
+
+!if "$(dev)" == "mac"
+TARGET = MAC
+!endif
+
+!if "$(DEBUG)" == ""
+DEBUG = 1
+!endif
+
+
+##########################################################################
+#
+# WIN16 Settings
+#
+!if "$(TARGET)" == "WIN16"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -dWIN16
+CFLAGS = -W3 -AM -GA -GEs -DWIN16
+LINKFLAGS = /NOD /NOI /BATCH /ONERROR:NOEXE
+
+LIBS = libw.lib mlibcew.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) /COD
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+LINKFLAGS = $(LINKFLAGS) /FAR /PACKC
+!endif
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARGET)" == "WIN32"
+
+!if "$(CPU)"==""
+
+!if "$(PROCESSOR_ARCHITECTURE)"=="" || "$(PROCESSOR_ARCHITECTURE)"=="x86"
+CPU=i386
+!else
+CPU=$(PROCESSOR_ARCHITECTURE)
+!endif
+
+!endif #CPU
+
+!if "$(CPU)" == "i386"
+CC = cl386
+LINK = link
+CFLAGS = -D_X86_=1
+!endif
+!if "$(CPU)" == "MIPS"
+CC = cl
+LINK = link
+CFLAGS = -D_MIPS_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "ALPHA"
+CC = claxp
+LINK = link
+CFLAGS = -D_ALPHA_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "PPC"
+CC = cl
+LINK = link
+CFLAGS = -D_PPC_=1 -DUNICODE
+!endif
+
+RCFLAGS = -dWIN32
+CFLAGS = $(CFLAGS) -nologo -W3 -DWIN32 -DINC_OLE2 -D_MT $(CL)
+LINKFLAGS = -Incremental:NO -Pdb:NONE -subsystem:windows -entry:WinMainCRTStartup -machine:$(CPU)
+
+LIBS = libc.lib kernel32.lib user32.lib
+
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Z7 -D_DEBUG $(CL)
+LINKFLAGS = -debug:full -debugtype:cv,coff $(LINKFLAGS)
+!else
+CFLAGS = $(CFLAGS) -Ox
+!endif
+!endif
+
+##########################################################################
+#
+# MAC Settings
+#
+!if "$(TARGET)" == "MAC"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -d_MAC
+!if "$(CPU)"=="PPC"
+CFLAGS = -W3 -D_MAC -D_PPCMAC -D_pascal= -D__pascal=
+LIBS = interfac.lib libc.lib ole2.lib ole2auto.lib
+LINKFLAGS = -machine:mppc -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+!else
+LIBS = interfac.lib llibcs.lib lsanes.lib swap.lib
+CFLAGS = -W3 -AL -D_MAC
+LINKFLAGS = -machine:$(CPU) -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+!endif
+
+
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) -debug:full -debugtype:cv
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+!endif
+
+MRC = mrc
+!if "$(CPU)"=="PPC"
+MRCOPT = -D_PPCMAC -s$(VBATOOLS)\win32\ppc\lib
+!else
+MRCOPT =
+!endif
+
+MAKEPEF = makepef
+!endif
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+APPS = dispcalc
+
+SRCDIR = $(OLEPROG)\SAMPLE\$(APPS)
+
+!if "$(TARGET)" == "MAC" && "$(CPU)"=="PPC"
+OBJDIR=$(SRCDIR)\macppc
+!else
+OBJDIR=$(SRCDIR)\$(TARGET)
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+
+!if "$(TARGET)" == "WIN16"
+LIBS = ole2.lib compobj.lib ole2disp.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "WIN32"
+LIBS = ole32.lib oleaut32.lib uuid.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "MAC"
+!if "$(CPU)"=="m68k"
+LIBS = olenrf.obj oanrf.obj $(LIBS)
+!endif
+!endif
+
+OBJS = \
+!if "$(TARGET)" == "MAC"
+ $(OBJDIR)\macmain.obj \
+!else
+ $(OBJDIR)\winmain.obj \
+!endif
+ $(OBJDIR)\idata.obj \
+ $(OBJDIR)\dispcalc.obj \
+ $(OBJDIR)\clsid.obj
+
+
+##########################################################################
+#
+# Build rules
+#
+
+{$(SRCDIR)}.cpp{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+{$(SRCDIR)}.c{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+goal : setflags $(OBJDIR)\$(APPS).exe
+
+setflags :
+ set CL=$(CFLAGS)
+
+
+##########################################################################
+#
+# Clean (erase) generated files
+#
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\$(APPS).exe del $(OBJDIR)\$(APPS).exe
+ if exist $(OBJDIR)\$(APPS).map del $(OBJDIR)\$(APPS).map
+ if exist $(OBJDIR)\$(APPS).res del $(OBJDIR)\$(APPS).res
+ if exist $(OBJDIR)\$(APPS).rs del $(OBJDIR)\$(APPS).rs
+
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARGET)" == "WIN16"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ link $(LINKFLAGS) @<<
+$(OBJS),
+$@,$(OBJDIR)\$(APPS).map/map,
+$(LIBS),
+$(SRCDIR)\$(APPS).def
+<<
+ rc -k -t $(OBJDIR)\$(APPS).res $@
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARGET)" == "WIN32"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ cvtres -r -$(CPU) $(OBJDIR)\$(APPS).res -o $(OBJDIR)\$(APPS).rs
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(OBJDIR)\$(APPS).rs
+ $(LIBS)
+<<
+!endif
+
+##########################################################################
+#
+# Application Build (MAC Specific)
+#
+
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(OBJDIR)\$(APPS).x
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(LIBS)
+<<
+ copy $(OBJDIR)\$(APPS).x $(OBJDIR)\$(APPS)
+!if "$(CPU)"=="PPC"
+ $(MAKEPEF) $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).pef
+!else
+ cvpack $(OBJDIR)\$(APPS).exe
+ $(MRC) $(MRCOPT) -e $(OBJDIR)\$(APPS).exe -a -o $(OBJDIR)\$(APPS)
+!endif
+
+$(OBJDIR)\$(APPS).x: $(SRCDIR)\$(APPS).r
+ $(MRC) $(MRCOPT) -D_MAC -o $(OBJDIR)\$(APPS).x $(SRCDIR)\$(APPS).r
+
+!endif
+
+
+##########################################################################
+#
+# Application Build (Common)
+#
+
+!if "$(TARGET)" != "MAC"
+$(OBJDIR)\$(APPS).res : $(SRCDIR)\$(APPS).rc
+ rc $(RCFLAGS) -r -fo$@ $?
+!endif
+
+
+##########################################################################
+#
+# Dependencies
+#
+
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\macmain.obj: $(SRCDIR)\macmain.cpp $(SRCDIR)\dispcalc.h
+ $(CC) -c -Fo$@ $(SRCDIR)\macmain.cpp
+!else
+$(OBJDIR)\winmain.obj: $(SRCDIR)\winmain.cpp $(SRCDIR)\dispcalc.h
+ $(CC) -c -Fo$@ $(SRCDIR)\winmain.cpp
+!endif
+
+$(OBJDIR)\idata.obj: $(SRCDIR)\idata.cpp $(SRCDIR)\dispcalc.h
+ $(CC) -c -Fo$@ $(SRCDIR)\idata.cpp
+
+$(OBJDIR)\dispcalc.obj: $(SRCDIR)\dispcalc.cpp $(SRCDIR)\dispcalc.h
+ $(CC) -c -Fo$@ $(SRCDIR)\dispcalc.cpp
+
+$(OBJDIR)\clsid.obj: $(SRCDIR)\clsid.c $(SRCDIR)\clsid.h
+ $(CC) -c -Fo$@ $(SRCDIR)\clsid.c
diff --git a/private/oleauto/sample/dispcalc/mk.bat b/private/oleauto/sample/dispcalc/mk.bat
new file mode 100644
index 000000000..b22e39d08
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/mk.bat
@@ -0,0 +1,24 @@
+REM setup the environment for the dispcalc makefile
+
+set OLDLIB=%LIB%
+set OLDPATH=%PATH%
+set OLDINC=%INCLUDE%
+set OLDTOOLS=%TOOLS%
+
+set TOOLS=%OLEPROG%\TOOLS\win16
+set PATH=%TOOLS%\HDOS\BIN;%TOOLS%\HDOS\C800\BIN
+set LIB=%TOOLS%\HDOS\C800\LIB;%OLEPROG%\DWIN16;%OLEPROG%\OLE\WIN16\lib
+set INCLUDE=%TOOLS%\HDOS\C800\INCLUDE;%OLEPROG%\OLE\WIN16;%OLEPROG%\SRC\DISPATCH;%OLEPROG%\SRC\inc
+
+REM c:\binr\tee nmake %1 %2 %3 %4 %5 > status
+nmake %1 %2 %3 %4 %5
+
+set LIB=%OLDLIB%
+set PATH=%OLDPATH%
+set INCLUDE=%OLDINC%
+set TOOLS=%OLDTOOLS%
+
+set OLDPATH=
+set OLDINC=
+set OLDLIB=
+set OLDTOOLS=
diff --git a/private/oleauto/sample/dispcalc/mk.cmd b/private/oleauto/sample/dispcalc/mk.cmd
new file mode 100644
index 000000000..b49700b53
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/mk.cmd
@@ -0,0 +1,13 @@
+REM The dispcalc.exe makefile assumes that PATH, LIB, and include are setup.
+
+@setlocal
+
+REM we get rc.exe and winstub.exe from \tools\win
+
+set PATH=%TOOLS%\HOS2\BIN;%TOOLS%\HOS2\C700\BIN
+set INCLUDE=%TOOLS%\HOS2\C700\INCLUDE;%OLEPROG%\ole\dwin16;%OLEPROG%\src\dispatch
+set LIB=%TOOLS%\HOS2\C700\LIB;%OLEPROG%\ole\dwin16;%OLEPROG%\build\dwin16
+
+nmake %1 %2 %3 %4 %5
+
+@endlocal
diff --git a/private/oleauto/sample/dispcalc/readme.txt b/private/oleauto/sample/dispcalc/readme.txt
new file mode 100644
index 000000000..3dcf88780
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/readme.txt
@@ -0,0 +1,101 @@
+---------------------------------------
+OLE Automation Sample Program: Dispcalc
+---------------------------------------
+
+DispCalc is a simple accumulator-based calculator. Its
+user interface consists of buttons for the numbers (0-9),
+the operators (+, -, *, /), and some other necessary
+buttons (C for Clear, = for evaluation). Its programmability
+interface consists of one object, which is described below.
+
+The ProgID for dispcalc's only object is "DispCalc.Application".
+An instance of this object can be created by executing the
+following lines of code in Visual Basic or DispTest:
+
+ Sub Foo
+ Dim MyCalculator as Object
+
+ Set MyCalculator = CreateObject("DispCalc.Application")
+ . . .
+ End Sub
+
+
+-----------------
+Program Structure
+-----------------
+Dispcalc uses INTERFACEDATA and CreateStdDispatch in order to
+implement the IDispatch interface.
+
+
+
+-------------------------
+Properties for the object
+-------------------------
+
+
+Name Type Description
+---------------------------
+Value VT_I4 Same as the value for the accumulator.
+
+Accum VT_I4 The value that is in the accumulator of the
+ calculator.
+
+Opnd VT_I4 The operand. This is the number which is
+ currently being entered.
+
+Op VT_I2 The operator that is currently being used.
+ This is an enumeration:
+ const OP_NONE = 0
+ const OP_PLUS = 1
+ const OP_MINUS = 2
+ const OP_MULT = 3
+
+
+
+-----------------------------
+Methods defined on the object
+-----------------------------
+
+
+Name Description
+---------------------------
+Eval() as Boolean If there is an operator, apply it to
+ accumulator and the operand, placing the
+ result in the accumulator.
+
+ The return value indicates success or
+ failure.
+
+Clear() Resets the calculator. This sets
+ Op to OP_NONE, and both Accum and
+ Opnd to 0.
+Display() Updates the display of the calculator.
+ (Other operations do not do this.)
+
+Quit() Close the calculator.
+
+Button(b as string) as Boolean
+ Press the indicated button and return
+ success or failure.
+
+ Valid string values are:
+ +, -, *, +
+ 0-9
+ c, C
+ =
+
+ Note that you may also pass the numbers
+ 0-9 and these will be converted to strings
+ automatically.
+
+
+
+---------------------------
+Shortcomings of this sample
+---------------------------
+1. Property and method names should not be abbreviated.
+For example, the "Opnd" property should be the "Operand"
+property.
+
+2. Since the object is the application object, it should
+have Name and Version properties, which are read-only.
diff --git a/private/oleauto/sample/dispcalc/resource.h b/private/oleauto/sample/dispcalc/resource.h
new file mode 100644
index 000000000..dea23584f
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/resource.h
@@ -0,0 +1,71 @@
+/***
+*resource.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _MAC
+
+#define kMinSize 500 /* minimum size (in K) */
+#define kPrefSize 500 /* preferred size (in K) */
+
+#define kMinHeap 21 * 1024
+#define kMinSpace 8 * 1024
+
+#define rMenuBar 128 /* menu bar */
+#define rAboutAlert 128 /* about alert */
+#define rUserAlert 129 /* error alert */
+
+#define rCalc 130
+
+#define mApple 128 /* Apple menu */
+#define iAbout 1
+
+#define mFile 129 /* File menu */
+#define iClose 4
+#define iQuit 12
+
+#define mEdit 130 /* Edit menu */
+#define iUndo 1
+#define iCut 3
+#define iCopy 4
+#define iPaste 5
+#define iClear 6
+
+#endif
+
+// Note: there is code that depends on all of the digits being contiguous
+// and in the following order.
+
+// Mac Note: On the mac these IDs correspond to the control indices
+// in the DITL array.
+
+#define IDC_ZERO 1
+#define IDC_ONE 2
+#define IDC_TWO 3
+#define IDC_THREE 4
+#define IDC_FOUR 5
+#define IDC_FIVE 6
+#define IDC_SIX 7
+#define IDC_SEVEN 8
+#define IDC_EIGHT 9
+#define IDC_NINE 10
+
+// Note: there is code that depends on the operators being contiguous
+// and in the following order.
+//
+#define IDC_PLUS 11
+#define IDC_MINUS 12
+#define IDC_MULT 13
+#define IDC_DIV 14
+
+#define IDC_CLEAR 15
+#define IDC_EQUALS 16
+
+#define IDC_DISPLAY 17
+
diff --git a/private/oleauto/sample/dispcalc/src2mac.cmd b/private/oleauto/sample/dispcalc/src2mac.cmd
new file mode 100644
index 000000000..7df884c6b
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/src2mac.cmd
@@ -0,0 +1,12 @@
+@rem
+@rem Copy Ole Automation sources to the Mac
+@rem
+@rem must be run from your local OS/2 box
+@rem
+
+rem echo off
+
+setlocal
+set path=%tools%\hnt\wings\bin
+nmake -f src2mac.mak
+endlocal
diff --git a/private/oleauto/sample/dispcalc/src2mac.mak b/private/oleauto/sample/dispcalc/src2mac.mak
new file mode 100644
index 000000000..d1345d170
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/src2mac.mak
@@ -0,0 +1,90 @@
+#***
+#src2mac.mak
+#
+# Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+# Information Contained Herein Is Proprietary and Confidential.
+#
+#Purpose:
+# This makefile copies dispcalc sources to the mac.
+#
+#
+#Revision History:
+#
+# [00] 02-Aug-93 bradlo: Created.
+#
+#Implementation Notes:
+#
+#****************************************************************************/
+
+.SUFFIXES: .c .cpp .h
+
+all: setflags files
+
+# source directories
+#
+SRCDCLC = $(OLEPROG)\SAMPLE\DISPCALC
+
+# destination directories
+#
+MACDCLC = :hd:ole2auto:sample:dispcalc:
+
+# timestamp directories
+#
+TMPDCLC = $(TMP)\dispcalc
+
+CP2MAC=ec copy -l -t TEXT -c "MPS "
+
+setflags:
+ set path=%tools%\hnt\wings\bin;%oleprog%\bin
+ if not exist %TMP%\dispcalc mkdir %TMP%\dispcalc
+
+files : \
+ $(TMPDCLC)\clsid.h \
+ $(TMPDCLC)\dispcalc.h \
+ $(TMPDCLC)\hostenv.h \
+ $(TMPDCLC)\resource.h \
+ $(TMPDCLC)\clsid.c \
+ $(TMPDCLC)\dispcalc.cpp \
+ $(TMPDCLC)\idata.cpp \
+ $(TMPDCLC)\macmain.cpp \
+ $(TMPDCLC)\dispcalc.r \
+ $(TMPDCLC)\makefile.tmp
+
+
+{$(SRCDCLC)}.h{$(TMPDCLC)}.h:
+ $(CP2MAC) $< $(MACDCLC)$(@F)
+ echo $(@F) > $@
+
+{$(SRCDCLC)}.c{$(TMPDCLC)}.c:
+ $(CP2MAC) $< $(MACDCLC)$(@F)
+ echo $(@F) > $@
+
+{$(SRCDCLC)}.cpp{$(TMPDCLC)}.cpp:
+ $(CP2MAC) $< $(MACDCLC)$(@F)
+ echo $(@F) > $@
+
+
+$(TMPDCLC)\clsid.h : $(SRCDCLC)\clsid.h
+
+$(TMPDCLC)\dispcalc.h : $(SRCDCLC)\dispcalc.h
+
+$(TMPDCLC)\hostenv.h : $(SRCDCLC)\hostenv.h
+
+$(TMPDCLC)\resource.h : $(SRCDCLC)\resource.h
+
+$(TMPDCLC)\clsid.c : $(SRCDCLC)\clsid.c
+
+$(TMPDCLC)\dispcalc.cpp : $(SRCDCLC)\dispcalc.cpp
+
+$(TMPDCLC)\idata.cpp : $(SRCDCLC)\idata.cpp
+
+$(TMPDCLC)\macmain.cpp : $(SRCDCLC)\macmain.cpp
+
+$(TMPDCLC)\dispcalc.r : $(SRCDCLC)\dispcalc.r
+ $(CP2MAC) $(SRCDCLC)\dispcalc.r $(MACDCLC)$(@F)
+ echo $(@F) > $@
+
+$(TMPDCLC)\makefile.tmp : $(SRCDCLC)\makefile.mpw
+ mungemak $(SRCDCLC)\makefile.mpw > $(TMPDCLC)\makefile.tmp
+ $(CP2MAC) $(TMPDCLC)\makefile.tmp $(MACDCLC)makefile
+
diff --git a/private/oleauto/sample/dispcalc/winmain.cpp b/private/oleauto/sample/dispcalc/winmain.cpp
new file mode 100644
index 000000000..fa6002f0b
--- /dev/null
+++ b/private/oleauto/sample/dispcalc/winmain.cpp
@@ -0,0 +1,161 @@
+/***
+*main.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module is the main entry point of the sample IDispatch
+* calculator, dispcalc.exe
+*
+* This program is intended to demonstrate an implementation of
+* the IDispatch interface.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dispcalc.h"
+
+TCHAR g_szAppName[] = TSTR("DispCalc");
+
+BOOL InitApplication(HINSTANCE);
+BOOL InitInstance(HINSTANCE, int);
+
+
+extern "C" {
+long FAR PASCAL WndProc(HWND, UINT, WPARAM, LPARAM);
+int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+}
+
+
+extern "C" int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hinstPrev,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+
+ if(!hinstPrev)
+ if(!InitApplication(hinst))
+ return FALSE;
+
+ if(InitOle() != NOERROR)
+ return FALSE;
+
+ if(!InitInstance(hinst, nCmdShow)){
+ UninitOle();
+ return FALSE;
+ }
+
+ while(GetMessage(&msg, NULL, NULL, NULL)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ UninitOle();
+
+ return msg.wParam;
+}
+
+
+BOOL
+InitApplication(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = WndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = DLGWINDOWEXTRA;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(hinst, g_szAppName);
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = g_szAppName;
+
+ if(!RegisterClass(&wc))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+BOOL
+InitInstance(HINSTANCE hinst, int nCmdShow)
+{
+ g_pcalc->m_hwnd = CreateDialog(hinst, g_szAppName, 0, NULL);
+
+ ShowWindow(g_pcalc->m_hwnd, nCmdShow);
+
+ g_pcalc->m_arith.Display();
+
+ return TRUE;
+}
+
+
+extern "C" long FAR PASCAL
+WndProc(
+ HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch(message){
+ case WM_COMMAND:
+ switch(wParam){
+ case IDC_ZERO:
+ case IDC_ONE:
+ case IDC_TWO:
+ case IDC_THREE:
+ case IDC_FOUR:
+ case IDC_FIVE:
+ case IDC_SIX:
+ case IDC_SEVEN:
+ case IDC_EIGHT:
+ case IDC_NINE:
+ case IDC_PLUS:
+ case IDC_MINUS:
+ case IDC_MULT:
+ case IDC_DIV:
+ case IDC_CLEAR:
+ case IDC_EQUALS:
+ g_pcalc->m_arith.ButtonPush(wParam);
+ return 0;
+ }
+ break;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefWindowProc(hwnd, message, wParam, lParam);
+}
+
+
+#if defined(WIN32)
+
+extern "C" char FAR*
+ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size)
+{
+ int badConversion = FALSE;
+
+ WideCharToMultiByte(CP_ACP, NULL,
+ strIn, -1,
+ buf, size,
+ NULL, &badConversion);
+ return buf;
+}
+
+extern "C" char FAR*
+AnsiString(OLECHAR FAR* strIn)
+{
+ static char buf[256];
+
+ return (ConvertStrWtoA(strIn, buf, 256));
+}
+
+#endif
diff --git a/private/oleauto/sample/dispdemo/bmk.bat b/private/oleauto/sample/dispdemo/bmk.bat
new file mode 100644
index 000000000..828693592
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/bmk.bat
@@ -0,0 +1,19 @@
+REM setup the environment for the dispdemo makefile
+
+set OLDLIB=%LIB%
+set OLDPATH=%PATH%
+set OLDINC=%INCLUDE%
+
+set PATH=\BORLANDC\BIN
+set LIB=\BORLANDC\LIB;%OLEPROG%\build\DWIN16;%OLEPROG%\OLE\DWIN16
+set INCLUDE=\BORLANDC\INCLUDE;%OLEPROG%\OLE\DWIN16;%OLEPROG%\SRC\DISPATCH
+
+\borlandc\bin\make -fborland.mak %1 %2 %3 %4 %5
+
+set LIB=%OLDLIB%
+set PATH=%OLDPATH%
+set INCLUDE=%OLDINC%
+
+set OLDPATH=
+set OLDINC=
+set OLDLIB=
diff --git a/private/oleauto/sample/dispdemo/borland.mak b/private/oleauto/sample/dispdemo/borland.mak
new file mode 100644
index 000000000..794f86a2f
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/borland.mak
@@ -0,0 +1,51 @@
+# build variables
+#
+CC = bcc
+
+CFLAGS = -I\oledisp\ole\dwin16 -I\oledisp\src\dispatch -D__export=_export -D__huge=_huge -D_BORLAND_ -WE -mm -v
+
+OLELIBS = \oledisp\ole\rwin16\ole2.lib \oledisp\ole\rwin16\compobj.lib \oledisp\build\rwin16\oledisp.lib
+
+OBJS = dispdemo.obj disphelp.obj crempoly.obj clsid.obj
+
+
+# targets
+#
+goal : dispdemo.exe
+
+clean:
+ -erase *.obj
+ -erase dispdemo.exe
+ -erase dispdemo.map
+ -erase dispdemo.res
+
+dispdemo.exe : $(OBJS) dispdemo.def dispdemo.res
+ echo \borlandc\lib\c0wm $(OBJS) > borland.lrf
+ echo dispdemo >> borland.lrf
+ echo dispdemo >> borland.lrf
+ echo \borlandc\lib\import+ >> borland.lrf
+ echo \borlandc\lib\cwm+ >> borland.lrf
+ echo \oledisp\ole\rwin16\ole2.lib+ >> borland.lrf
+ echo \oledisp\ole\rwin16\compobj.lib+ >> borland.lrf
+ echo \oledisp\build\rwin16\oledisp.lib >> borland.lrf
+ echo dispdemo.def >> borland.lrf
+ tlink /Tw /c /v @borland.lrf
+ rc -k -t dispdemo.res $@
+
+dispdemo.res : dispdemo.rc
+ rc -r -fo$@ $?
+
+
+# dependencies
+#
+dispdemo.obj : dispdemo.cpp dispdemo.h
+ $(CC) $(CFLAGS) -c dispdemo.cpp
+
+disphelp.obj : disphelp.cpp disphelp.h
+ $(CC) $(CFLAGS) -c disphelp.cpp
+
+crempoly.obj : crempoly.cpp crempoly.h disphelp.h
+ $(CC) $(CFLAGS) -c crempoly.cpp
+
+clsid.obj : clsid.h clsid.c
+ $(CC) $(CFLAGS) -c clsid.c
diff --git a/private/oleauto/sample/dispdemo/clsid.c b/private/oleauto/sample/dispdemo/clsid.c
new file mode 100644
index 000000000..fc70a7825
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/clsid.c
@@ -0,0 +1,46 @@
+/***
+*clsid.c
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates and initializes the CLSIDs.
+*
+*****************************************************************************/
+
+#ifdef _PPCMAC
+#pragma data_seg ("_FAR_DATA")
+#pragma data_seg ( )
+#endif
+
+#ifdef _MAC
+# include <Types.h>
+#ifdef _MSC_VER
+# include <Processe.h>
+# include <AppleEve.h>
+#else //_MSC_VER
+# include <Processes.h>
+# include <AppleEvents.h>
+#endif //_MSC_VER
+#else
+# include <windows.h>
+#endif
+
+#ifndef WIN32
+#include <compobj.h>
+#endif //!WIN32
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+#ifndef INITGUID
+# define INITGUID
+#endif
+
+// due to the previous header, including this causes the DEFINE_GUID
+// definitions in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
+
diff --git a/private/oleauto/sample/dispdemo/clsid.h b/private/oleauto/sample/dispdemo/clsid.h
new file mode 100644
index 000000000..f74208731
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/clsid.h
@@ -0,0 +1,31 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs referenced by the IDispatch demo app.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+DEFINE_GUID(CLSID_CPoly, 0x00020462, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(CLSID_CPoly2, 0x00020464, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+
+
+#ifdef INITGUID
+# ifdef _MAC
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+/* The PPC MW gives a warning if these are redefined */
+# ifndef _MW_BUILD
+DEFINE_GUID(IID_IDispatch, 0x00020400, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IEnumVARIANT, 0x00020404, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+DEFINE_GUID(IID_IUnknown, 0x00000000, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IClassFactory, 0x00000001, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+#endif
+
+
diff --git a/private/oleauto/sample/dispdemo/crempoly.cpp b/private/oleauto/sample/dispdemo/crempoly.cpp
new file mode 100644
index 000000000..ca960bd87
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/crempoly.cpp
@@ -0,0 +1,869 @@
+/***
+*crempoly.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the implementation of CRemPoly, the remote polygon
+* class. This class presents a standard C++ vtable interface to the
+* rest of the application, and hides the details of talking to the
+* actual remote CPoly class exposed by the SPoly server. Each of
+* the introduced methods is simply a cover for an IDispatch invocation
+* of the actual method on the remote object.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dispdemo.h"
+#include "crempoly.h"
+
+extern int g_fTrace;
+
+// method names on the CPoly class.
+//
+OLECHAR FAR* CRemPoly::m_rgszMethods[] = {
+ OLESTR("draw"),
+ OLESTR("dump"),
+ OLESTR("reset"),
+ OLESTR("addpoint"),
+ OLESTR("enumpoints"),
+ OLESTR("getxorigin"),
+ OLESTR("setxorigin"),
+ OLESTR("getyorigin"),
+ OLESTR("setyorigin"),
+ OLESTR("getwidth"),
+ OLESTR("setwidth"),
+ OLESTR("get_red"),
+ OLESTR("set_red"),
+ OLESTR("get_green"),
+ OLESTR("set_green"),
+ OLESTR("get_blue"),
+ OLESTR("set_blue")
+};
+
+#ifdef _MAC
+# define IfMac(X) (X)
+# define IfWin(X)
+#else
+# define IfMac(X)
+# define IfWin(X) (X)
+#endif
+
+
+CRemPoly::CRemPoly()
+{
+ m_refs = 0;
+ m_pdisp = (IDispatch FAR*)NULL;
+}
+
+
+// A useful pre-initialized DISPATCHPARAMS, used on all the methods that
+// take 0 arguments.
+//
+DISPPARAMS NEAR g_dispparamsNoArgs = {NULL, NULL, 0, 0};
+
+
+/***
+*HRESULT CRemPoly::Create(clsid, CRemPoly**)
+*
+*Purpose:
+* This function creates an instance of the CRemPoly class, connects
+* it to the IDispatch interface of the remote CPoly class, and learns
+* the DISPIDs for the members (that we know about) exposed by that
+* class.
+*
+*Entry:
+* clsid = The CLSID of the CPoly we are to create. (taking this as a
+* param is a bit weird, but allows us to connect to several remote
+* versions.
+*
+*Exit:
+* return value = HRESULT
+*
+* *pprempoly = pointer to the newly created CRemPoly, if successfyl.
+*
+***********************************************************************/
+HRESULT
+CRemPoly::Create(CLSID clsid, CRemPoly FAR* FAR* pprempoly)
+{
+ int i;
+ HRESULT hresult;
+ IUnknown FAR* punk;
+ CRemPoly FAR* prempoly;
+
+
+ prempoly = new FAR CRemPoly();
+ if(prempoly == (CRemPoly FAR*)NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError;
+ }
+ prempoly->AddRef();
+
+ // create an instance of the remote CPoly class.
+ //
+ IfMac(DbPrintf("CoCreateInstance(CLSID_CPoly)"));
+ hresult = CoCreateInstance(
+ clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void FAR* FAR*)&punk);
+ if(hresult != NOERROR){
+ IfMac(DbPrintf("CoCreateInstance() = 0x%x", hresult));
+ IfWin(MessageBox(NULL, TSTR("Unable to create polygon object"),
+ NULL, MB_OK));
+ goto LFreeCRemPoly;
+ }
+
+ // were going to talk to this remote instance via IDispatch.
+ //
+ IfMac(DbPrintf("QueryInterface(IID_IDispatch)"));
+ hresult = punk->QueryInterface(
+ IID_IDispatch, (void FAR* FAR*)&prempoly->m_pdisp);
+ if(hresult != NOERROR){
+ IfMac(DbPrintf("QueryInterface(IID_IDispatch) = 0x%x", hresult));
+ IfWin(MessageBox(NULL, TSTR("Unable to QueryInterface to IDispatch"),
+ NULL, MB_OK));
+ goto LReleaseUnk;
+ }
+
+ // We learn *all* the member IDs up front. A more sophisticated
+ // implementation might defer learning about the IDs for a given
+ // method until the first time the method is invoked, thereby
+ // amortizing the creation costs.
+ //
+ IfMac(DbPrintf("GetIDsOfNames()"));
+ for(i = 0; i < IMETH_CREMPOLY_MAX; ++i){
+ hresult = prempoly->m_pdisp->GetIDsOfNames(
+ IID_NULL,
+ &prempoly->m_rgszMethods[i],
+ 1, LOCALE_USER_DEFAULT,
+ &prempoly->m_rgdispid[i]);
+ if(hresult != NOERROR){
+ IfMac(DbPrintf("GetIDsOfNames() = 0x%x", hresult));
+ IfWin(MessageBox(NULL, TSTR("Unrecognized member name"),
+ NULL, MB_OK));
+ goto LReleaseUnk;
+ }
+ }
+
+ punk->Release();
+
+ *pprempoly = prempoly;
+
+ IfMac(DbPrintf("Object created."));
+
+ return NOERROR;
+
+LReleaseUnk:;
+ punk->Release();
+
+LFreeCRemPoly:;
+ prempoly->Release();
+
+LError:;
+ return hresult;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown methods
+//---------------------------------------------------------------------
+
+
+/***
+*HRESULT CRemPoly::QueryInterface(REFIID, void**)
+*
+*Purpose:
+* Standard Ole2 implementation of QueryInterface. This class
+* supports the IUnknown interface, and introduces a number of
+* nonvirtual members.
+*
+*Entry:
+* riid = reference to the requested interface id
+*
+*Exit:
+* return value = HRESULT
+* *ppv = pointer to the requested interface, if successful.
+*
+***********************************************************************/
+STDMETHODIMP
+CRemPoly::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+/***
+*unsigned long CRemPoly::AddRef(void)
+*
+*Purpose:
+* Add a reference to the instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long. The resulting reference count.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CRemPoly::AddRef(void)
+{
+ return ++m_refs;
+}
+
+
+/***
+*unsigned long CRemPoly::Release(void)
+*
+*Purpose:
+* Release a reference to the instance. If the reference count goes
+* to zero, delete the instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long. The resulting reference count.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CRemPoly::Release(void)
+{
+ if(--m_refs == 0){
+ if(m_pdisp != (IDispatch FAR*)NULL){
+ m_pdisp->Release();
+ }
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// Introduced methods
+//---------------------------------------------------------------------
+
+
+/*
+ * Each of these methods is simply a cover for an IDispatch Invocation
+ * of the actual method on the remote CPoly class. This allows CRemPoly
+ * to present an interface that looks and acts just like the CPoly
+ * object, even though the actual work is being done in another process.
+ *
+ */
+
+/***
+*HRESULT CRemPoly::Draw(void)
+*
+*Purpose:
+* Invoke the Draw method on the remote CPoly instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::Draw()
+{
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_DRAW],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, NULL, NULL, NULL);
+}
+
+
+/***
+*HRESULT CRemPoly::Dump(void)
+*
+*Purpose:
+* Invoke the Dump() method on the remote CPoly instance. This method
+* dumps the contained CPoints and writes the properties of the remote
+* CPoly instance to the debug window.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::Dump()
+{
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_DUMP],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, NULL, NULL, NULL);
+}
+
+
+/***
+*HRESULT CRemPoly::Reset(void)
+*
+*Purpose:
+* Invoke the Reset() method on the remote CPoly instance. The Reset()
+* method causes the remote CPoly to release all contained CPoints.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::Reset()
+{
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_RESET],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, NULL, NULL, NULL);
+}
+
+
+/***
+*HRESULT CRemPoly::AddPoint(short, short)
+*
+*Purpose:
+* Invoke the AddPoint method in the remote CPoly object to add a
+* new point with the given coordinates to this instance.
+*
+*Entry:
+* x,y = the x and y coordinates of the new point.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::AddPoint(short x, short y)
+{
+ HRESULT hresult;
+ VARIANTARG varg[2];
+ DISPPARAMS dispparams;
+
+ V_VT(&varg[0]) = VT_I2;
+ V_I2(&varg[0]) = y;
+
+ V_VT(&varg[1]) = VT_I2;
+ V_I2(&varg[1]) = x;
+
+ dispparams.cArgs = 2;
+ dispparams.rgvarg = varg;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+
+ hresult = m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_ADDPOINT],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &dispparams, NULL, NULL, NULL);
+
+ return hresult;
+}
+
+
+/***
+*HRESULT CRemPoly::EnumPoints(IEnumVARIANT**)
+*Purpose:
+* Inoke the EnumPoints() method in the remote object to
+* get a enumerator for the points contained in the current poly.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppenum = pointer to the point enumerator
+*
+***********************************************************************/
+HRESULT
+CRemPoly::EnumPoints(IEnumVARIANT FAR* FAR* ppenum)
+{
+ HRESULT hresult;
+ IEnumVARIANT FAR* penum;
+ VARIANT varResult, FAR* pvarResult;
+
+
+ pvarResult = &varResult;
+ VariantInit(pvarResult);
+ hresult = m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_ENUMPOINTS],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, pvarResult, NULL, NULL);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ if(V_VT(pvarResult) != VT_UNKNOWN)
+ return ResultFromScode(E_FAIL);
+
+ hresult = V_UNKNOWN(pvarResult)->QueryInterface(
+ IID_IEnumVARIANT, (void FAR* FAR*)&penum);
+
+ if(hresult == NOERROR)
+ *ppenum = penum;
+
+ VariantClear(pvarResult);
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CRemPoly::GetXOrigin(short*)
+*
+*Purpose:
+* Invoke the GetXOrigin() method on the remote object to extract
+* the current value of the XOrigin property.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pxorg = the current X origin of the polygon.
+*
+***********************************************************************/
+HRESULT
+CRemPoly::GetXOrigin(short FAR* pxorg)
+{
+ HRESULT hresult;
+ VARIANT varResult;
+
+ VariantInit(&varResult);
+ hresult = m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_GETXORIGIN],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, &varResult, NULL, NULL);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ *pxorg = V_I2(&varResult);
+ VariantClear(&varResult);
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CRemPoly::SetXOrigin(short)
+*
+*Purpose:
+* Invoke the SetXOrigin method on the remote object to set the
+* XOrigin property of the polygon to the given value.
+*
+*Entry:
+* xorg = the new X origin
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::SetXOrigin(short xorg)
+{
+ VARIANTARG varg;
+ DISPPARAMS dispparams;
+
+
+ V_VT(&varg) = VT_I2;
+ V_I2(&varg) = xorg;
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgvarg = &varg;
+
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_SETXORIGIN],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &dispparams, NULL, NULL, NULL);
+}
+
+
+/***
+*HRESULT CRemPoly::GetYOrigin(short*)
+*
+*Purpose:
+* Invoke the GetYOrigin() method on the remote object to extract
+* the current value of the YOrigin property.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pyorg = the current Y origin of the polygon
+*
+***********************************************************************/
+HRESULT
+CRemPoly::GetYOrigin(short FAR* pyorg)
+{
+ HRESULT hresult;
+ VARIANT varResult;
+
+
+ VariantInit(&varResult);
+ hresult = m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_GETYORIGIN],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, &varResult, NULL, NULL);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ *pyorg = V_I2(&varResult);
+ VariantClear(&varResult);
+
+ return hresult;
+}
+
+
+/***
+*HRESULT CRemPoly::SetYOrigin(short)
+*
+*Purpose:
+* Invoke the SetYOrigin method on the remote object to set the
+* YOrigin property of the polygon to the given value.
+*
+*Entry:
+* yorg = the new Y origin
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::SetYOrigin(short yorg)
+{
+ VARIANTARG varg;
+ DISPPARAMS dispparams;
+
+ V_VT(&varg) = VT_I2;
+ V_I2(&varg) = yorg;
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgvarg = &varg;
+
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_SETYORIGIN],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &dispparams, NULL, NULL, NULL);
+}
+
+
+/***
+*HRESULT CRemPoly::GetWidth(short*)
+*
+*Purpose:
+* Invoke the GetWidth() method on the remote object to extract
+* the current value of the line width property.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pwidth = short, the current line width of the polygon
+*
+***********************************************************************/
+HRESULT
+CRemPoly::GetWidth(short FAR* pwidth)
+{
+ HRESULT hresult;
+ VARIANT varResult;
+
+ VariantInit(&varResult);
+ hresult = m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_GETWIDTH],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, &varResult, NULL, NULL);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ *pwidth = V_I2(&varResult);
+ VariantClear(&varResult);
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CRemPoly::SetWidth(short)
+*
+*Purpose:
+* Invoke the SetWidth method on the remote object to set the
+* line width property of the polygon to the given value.
+*
+*Entry:
+* width = the new value for the line width property.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::SetWidth(short width)
+{
+ VARIANTARG varg;
+ DISPPARAMS dispparams;
+
+
+ V_VT(&varg) = VT_I2;
+ V_I2(&varg) = width;
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgvarg = &varg;
+
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_SETWIDTH],
+ IID_NULL,
+ LOCALE_USER_DEFAULT,
+ DISPATCH_METHOD,
+ &dispparams, NULL, NULL, NULL);
+}
+
+
+HRESULT CRemPoly::get_red(short FAR* psRed)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETRED], psRed);
+}
+
+HRESULT CRemPoly::set_red(short sRed)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETRED], sRed);
+}
+
+
+HRESULT CRemPoly::get_green(short FAR* psGreen)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETGREEN], psGreen);
+}
+
+HRESULT CRemPoly::set_green(short sGreen)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETGREEN], sGreen);
+}
+
+
+HRESULT CRemPoly::get_blue(short FAR* psBlue)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETBLUE], psBlue);
+}
+
+HRESULT CRemPoly::set_blue(short sBlue)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETBLUE], sBlue);
+}
+
+HRESULT
+CRemPoly::get_i2(DISPID dispid, short FAR* ps)
+{
+ HRESULT hresult;
+ VARIANT varResult;
+
+ VariantInit(&varResult);
+
+ hresult = m_pdisp->Invoke(
+ dispid,
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs,
+ &varResult, NULL, NULL);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ hresult = VariantChangeType(&varResult, &varResult, 0, VT_I2);
+ if(hresult != NOERROR){
+ VariantClear(&varResult);
+ return hresult;
+ }
+
+ *ps = V_I2(&varResult);
+ VariantClear(&varResult);
+ return NOERROR;
+}
+
+HRESULT
+CRemPoly::set_i2(DISPID dispid, short s)
+{
+ VARIANTARG varg;
+ DISPPARAMS dispparams;
+
+ V_VT(&varg) = VT_I2;
+ V_I2(&varg) = s;
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgvarg = &varg;
+
+ return m_pdisp->Invoke(
+ dispid,
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &dispparams, NULL, NULL, NULL);
+}
+
+
+/***
+*void DoPoly(CLSID)
+*
+*Purpose:
+* This function simply exercises our CRemPoly class by creating an
+* instance and invoking a number of its methods.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDAPI
+DoPoly(CLSID clsid)
+{
+ HRESULT hr;
+ int numpoly, i, j;
+
+static struct {
+ short x;
+ short y;
+} rgptPoly[] = {
+ { 25, 0}
+ , { 75, 0}
+ , {100, 25}
+ , {100, 75}
+ , { 75, 100}
+ , { 25, 100}
+ , { 0, 75}
+ , { 0, 25}
+};
+
+static struct {
+ short red;
+ short green;
+ short blue;
+} rgrgbColors[] = {
+#ifdef _MAC
+ { 0, 0, 0}
+ , { 0, 0, 0x7fff}
+ , { 0, 0x7fff, 0}
+ , {0x7fff, 0, 0}
+ , {0x7fff, 0, 0x7fff}
+ , {0x7fff, 0x7fff, 0}
+ , {0x7fff, 0x7fff, 0x7fff}
+#else
+ { 0, 0, 0}
+ , { 0, 0, 127}
+ , { 0, 127, 0}
+ , {127, 0, 0}
+ , {127, 0, 127}
+ , {127, 127, 0}
+ , {127, 127, 127}
+#endif
+};
+
+ CRemPoly FAR* rgprempoly[DIM(rgrgbColors)];
+
+ numpoly = DIM(rgprempoly);
+
+ // init
+ for(i = 0; i < numpoly; ++i)
+ rgprempoly[i] = (CRemPoly FAR*)NULL;
+
+ for(i = 0; i < numpoly; ++i){
+ hr = CRemPoly::Create(clsid, &rgprempoly[i]);
+ if(hr != NOERROR)
+ goto LError0;
+ IfMac(DbPrintf("CRemPoly::Create()"));
+
+ for(j = 0; j < DIM(rgptPoly); ++j){
+ short x = rgptPoly[j].x;
+ short y = rgptPoly[j].y;
+ IfMac(DbPrintf("CRemPoly::AddPoint(%d,%d)", x, y));
+ hr = rgprempoly[i]->AddPoint(x, y);
+ ASSERT(hr == NOERROR);
+ }
+
+ for(j = 0; j < DIM(rgrgbColors); ++j){
+ hr = rgprempoly[i]->SetWidth(i + j);
+ ASSERT(hr == NOERROR);
+ IfMac(DbPrintf("CRemPoly::SetWidth()"));
+
+ hr = rgprempoly[i]->set_red(rgrgbColors[j].red);
+ ASSERT(hr == NOERROR);
+ IfMac(DbPrintf("CRemPoly::set_red()"));
+
+ hr = rgprempoly[i]->set_green(rgrgbColors[j].green);
+ ASSERT(hr == NOERROR);
+ IfMac(DbPrintf("CRemPoly::set_green()"));
+
+ hr = rgprempoly[i]->set_blue(rgrgbColors[j].blue);
+ ASSERT(hr == NOERROR);
+ IfMac(DbPrintf("CRemPoly::set_blue()"));
+
+ hr = rgprempoly[i]->SetXOrigin((2*i) + j << 4);
+ ASSERT(hr == NOERROR);
+ IfMac(DbPrintf("CRemPoly::SetXOrigin()"));
+
+ hr = rgprempoly[i]->SetYOrigin(j << 4);
+ ASSERT(hr == NOERROR);
+ IfMac(DbPrintf("CRemPoly::SetYOrigin()"));
+
+ hr = rgprempoly[i]->Draw();
+ ASSERT(hr == NOERROR);
+ IfMac(DbPrintf("CRemPoly::Draw()"));
+ }
+ }
+
+ hr = NOERROR;
+
+LError0:;
+ for(i = 0; i < numpoly; ++i){
+ if(rgprempoly[i] != (CRemPoly FAR*)NULL){
+ rgprempoly[i]->Release();
+ }
+ }
+
+ return hr;
+}
+
diff --git a/private/oleauto/sample/dispdemo/crempoly.h b/private/oleauto/sample/dispdemo/crempoly.h
new file mode 100644
index 000000000..087df0251
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/crempoly.h
@@ -0,0 +1,90 @@
+/***
+*crempoly.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CRemPoly remote polygon object.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+class CRemPoly : public IUnknown {
+public:
+ static HRESULT Create(CLSID clsid, CRemPoly FAR* FAR*);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // Introduced methods
+ //
+ HRESULT Draw(void);
+ HRESULT Dump(void);
+ HRESULT Reset(void);
+ HRESULT AddPoint(short x, short y);
+ HRESULT EnumPoints(IEnumVARIANT FAR* FAR* ppenum);
+ HRESULT GetXOrigin(short FAR* pxorg);
+ HRESULT SetXOrigin(short xorg);
+ HRESULT GetYOrigin(short FAR* pyorg);
+ HRESULT SetYOrigin(short yorg);
+ HRESULT GetWidth(short FAR* pwidth);
+ HRESULT SetWidth(short width);
+
+ HRESULT get_red(short FAR* psRed);
+ HRESULT set_red(short sRed);
+ HRESULT get_green(short FAR* psGreen);
+ HRESULT set_green(short sGreen);
+ HRESULT get_blue(short FAR* psBlue);
+ HRESULT set_blue(short sBlue);
+
+private:
+ CRemPoly();
+
+ HRESULT get_i2(DISPID dispid, short FAR* ps);
+ HRESULT set_i2(DISPID dispid, short s);
+
+ unsigned long m_refs;
+ IDispatch FAR* m_pdisp;
+
+ // NOTE: this enumeration exists simply to allow us to symbolicly
+ // index the member name and id arrays (m_rgid and m_rgszMethods).
+ // This doesn't (necessarrily) have any connection to the vtable
+ // indices, it *only* needs to correspond correctly to the m_rgid
+ // and m_rgszMethods arrays.
+ //
+ enum CREMPOLY_METHODS {
+ IMETH_CREMPOLY_DRAW = 0,
+ IMETH_CREMPOLY_DUMP,
+ IMETH_CREMPOLY_RESET,
+ IMETH_CREMPOLY_ADDPOINT,
+ IMETH_CREMPOLY_ENUMPOINTS,
+ IMETH_CREMPOLY_GETXORIGIN,
+ IMETH_CREMPOLY_SETXORIGIN,
+ IMETH_CREMPOLY_GETYORIGIN,
+ IMETH_CREMPOLY_SETYORIGIN,
+ IMETH_CREMPOLY_GETWIDTH,
+ IMETH_CREMPOLY_SETWIDTH,
+ IMETH_CREMPOLY_GETRED,
+ IMETH_CREMPOLY_SETRED,
+ IMETH_CREMPOLY_GETGREEN,
+ IMETH_CREMPOLY_SETGREEN,
+ IMETH_CREMPOLY_GETBLUE,
+ IMETH_CREMPOLY_SETBLUE,
+ IMETH_CREMPOLY_MAX
+ };
+
+ // member IDs - these are used by IDispatch::Invoke to identify the
+ // method or property on the remote object we accessing.
+ //
+ DISPID m_rgdispid[IMETH_CREMPOLY_MAX];
+
+ // member names - these are used to learn the member IDs when we
+ // connect to the remote object.
+ //
+ static OLECHAR FAR* m_rgszMethods[IMETH_CREMPOLY_MAX];
+};
diff --git a/private/oleauto/sample/dispdemo/dispdemo.def b/private/oleauto/sample/dispdemo/dispdemo.def
new file mode 100644
index 000000000..81b623e20
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/dispdemo.def
@@ -0,0 +1,14 @@
+
+NAME DispDemo
+
+DESCRIPTION 'IDispatch Demo Application'
+
+EXETYPE WINDOWS
+
+STUB 'WINSTUB.EXE'
+
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MULTIPLE
+
+HEAPSIZE 1024
+STACKSIZE 16384
diff --git a/private/oleauto/sample/dispdemo/dispdemo.h b/private/oleauto/sample/dispdemo/dispdemo.h
new file mode 100644
index 000000000..6aea236d9
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/dispdemo.h
@@ -0,0 +1,51 @@
+/***
+*dispdemo.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* IDispatch Demo App definitions.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "hostenv.h"
+#include "resource.h"
+#include "clsid.h"
+
+#ifdef _MAC
+# define UNUSED(X) ((void)(void*)&(X))
+#else
+# define UNUSED(X) (X)
+#endif
+
+#ifndef NEAR
+# define NEAR
+#endif
+
+#define DIM(X) (sizeof(X) / sizeof(X[0]))
+
+#define ASSERT(X) Assert(X, __FILE__, __LINE__)
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+STDAPI InitOle(void);
+STDAPI UninitOle(void);
+
+STDAPI DoPoly(CLSID);
+
+void Assert(int, char FAR*, int);
+
+#ifdef _MAC
+void DbPrintf(char*, ...);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/private/oleauto/sample/dispdemo/dispdemo.ico b/private/oleauto/sample/dispdemo/dispdemo.ico
new file mode 100644
index 000000000..d6f67b4a2
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/dispdemo.ico
Binary files differ
diff --git a/private/oleauto/sample/dispdemo/dispdemo.r b/private/oleauto/sample/dispdemo/dispdemo.r
new file mode 100644
index 000000000..5a0256f4c
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/dispdemo.r
@@ -0,0 +1,317 @@
+/***
+*dispdemo.r
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Resource script for dispdemo.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _PPCMAC
+include "cfrg.rsc";
+#endif
+
+#include "types.r"
+#include "resource.h"
+
+/* we use an MBAR resource to conveniently load all the menus */
+
+resource 'MBAR' (rMenuBar, preload) {
+ {
+ mApple
+ , mFile
+ , mEdit
+ , mSpoly
+ , mSpoly2
+ }
+};
+
+
+resource 'MENU' (mApple, preload) {
+ mApple,
+ textMenuProc,
+ 0b11111111111111111111111111111101,
+ enabled,
+ apple,
+ {
+ "About DispDemo\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mFile, preload) {
+ mFile,
+ textMenuProc,
+ 0b00000000000000000000100000000000,
+ enabled,
+ "File",
+ {
+ "New",
+ noicon, "N", nomark, plain;
+ "Open",
+ noicon, "O", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Close",
+ noicon, "W", nomark, plain;
+ "Save",
+ noicon, "S", nomark, plain;
+ "Save As\311",
+ noicon, nokey, nomark, plain;
+ "Revert",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Page Setup\311",
+ noicon, nokey, nomark, plain;
+ "Print\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Quit",
+ noicon, "Q", nomark, plain
+ }
+};
+
+resource 'MENU' (mEdit, preload) {
+ mEdit,
+ textMenuProc,
+ 0b00000000000000000000000000000000,
+ enabled,
+ "Edit",
+ {
+ "Undo",
+ noicon, "Z", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Cut",
+ noicon, "X", nomark, plain;
+ "Copy",
+ noicon, "C", nomark, plain;
+ "Paste",
+ noicon, "V", nomark, plain;
+ "Clear",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mSpoly, preload) {
+ mSpoly,
+ textMenuProc,
+ 0b00000000000000000000000000000001,
+ enabled,
+ "Spoly",
+ {
+ "Spoly", noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mSpoly2, preload) {
+ mSpoly2,
+ textMenuProc,
+ 0b00000000000000000000000000000001,
+ enabled,
+ "Spoly2",
+ {
+ "Spoly2", noicon, nokey, nomark, plain
+ }
+};
+
+/* this ALRT and DITL are used as an About screen */
+
+resource 'ALRT' (rAboutAlert, purgeable) {
+ {40, 20, 160, 290},
+ rAboutAlert,
+ {
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+resource 'DITL' (rAboutAlert, purgeable) {
+ { /* array DITLarray: 5 elements */
+ /* [1] */
+ {88, 180, 108, 260},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {8, 8, 24, 214},
+ StaticText {
+ disabled,
+ "IDispatch Polygon Server"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an error screen */
+
+resource 'ALRT' (rUserAlert, purgeable) {
+ {40, 20, 120, 260},
+ rUserAlert,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+
+resource 'DITL' (rUserAlert, purgeable) {
+ {
+ /* [1] */
+ {50, 150, 70, 230},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 30, 230},
+ StaticText {
+ disabled,
+ "Error. ^0"
+ },
+ /* [3] */
+ {8, 8, 40, 40},
+ Icon {
+ disabled,
+ 2
+ }
+ }
+};
+
+
+resource 'WIND' (rWindow, preload, purgeable) {
+ {40, 40, 75, 500},
+ rDocProc, visible, goAway, 0x0, "DispDemo"
+};
+
+resource 'WIND' (rDebugWindow, preload) {
+ {130, 40, 200, 350},
+ documentProc, visible, goAway, 0x0, "debug"
+};
+
+
+resource 'SIZE' (-1) {
+ dontSaveScreen,
+ acceptSuspendResumeEvents,
+ enableOptionSwitch,
+ canBackground,
+ multiFinderAware,
+ backgroundAndForeground,
+ dontGetFrontClicks,
+ ignoreChildDiedEvents,
+ is32BitCompatible,
+ isHighLevelEventAware,
+ localAndRemoteHLEvents,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ kPrefSize * 1024,
+ kMinSize * 1024
+};
+
+
+resource 'BNDL' (129) {
+ 'DDMO',
+ 0,
+ { /* array TypeArray: 2 elements */
+ /* [1] */
+ 'FREF',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 129
+ },
+ /* [2] */
+ 'ICN#',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 129
+ }
+ }
+};
+
+resource 'FREF' (129) {
+ 'APPL',
+ 0,
+ ""
+};
+
+data 'ICN#' (129) {
+ $"0000 0000 0000 0000 0000 0000 0000 0008" /* ................ */
+ $"0000 0030 0000 00F0 0000 03E0 0000 01E0" /* ...0...ð...à...à */
+ $"0000 00C0 0000 0240 0000 0C00 0000 3C00" /* ...À...@......<. */
+ $"0000 F800 0000 7800 0000 3000 0000 1000" /* ..ø...x...0..... */
+ $"0000 0000 07FF FFF0 07FF FFF0 07FF FFF0" /* .....ÿÿð.ÿÿð.ÿÿð */
+ $"0400 0010 0400 0010 0400 0010 0400 0010" /* ................ */
+ $"0400 0010 0400 0010 0400 0010 07FF FFF0" /* .............ÿÿð */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0008" /* ................ */
+ $"0000 0030 0000 00F0 0000 03E0 0000 01E0" /* ...0...ð...à...à */
+ $"0000 00C0 0000 0240 0000 0C00 0000 3C00" /* ...À...@......<. */
+ $"0000 F800 0000 7800 0000 3000 0000 1000" /* ..ø...x...0..... */
+ $"0000 0000 07FF FFF0 07FF FFF0 07FF FFF0" /* .....ÿÿð.ÿÿð.ÿÿð */
+ $"07FF FFF0 07FF FFF0 07FF FFF0 07FF FFF0" /* .ÿÿð.ÿÿð.ÿÿð.ÿÿð */
+ $"07FF FFF0 07FF FFF0 07FF FFF0 07FF FFF0" /* .ÿÿð.ÿÿð.ÿÿð.ÿÿð */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+};
+
+data 'icl4' (129) {
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 3000" /* ..............0. */
+ $"0000 0000 0000 0000 0000 0000 0033 0000" /* .............3.. */
+ $"0000 0000 0000 0000 0000 0000 33F3 0000" /* ............3ó.. */
+ $"0000 0000 0000 0000 0000 0033 3F30 0000" /* ...........3?0.. */
+ $"0000 0000 0000 0000 0000 0003 F330 0000" /* ............ó0.. */
+ $"0000 0000 0000 0000 0000 0000 3300 0000" /* ............3... */
+ $"0000 0000 0000 0000 0000 0030 0300 0000" /* ...........0.... */
+ $"0000 0000 0000 0000 0000 3300 0000 0000" /* ..........3..... */
+ $"0000 0000 0000 0000 0033 F300 0000 0000" /* .........3ó..... */
+ $"0000 0000 0000 0000 333F 3000 0000 0000" /* ........3?0..... */
+ $"0000 0000 0000 0000 03F3 3000 0000 0000" /* .........ó0..... */
+ $"0000 0000 0000 0000 0033 0000 0000 0000" /* .........3...... */
+ $"0000 0000 0000 0000 0003 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0666 6666 6666 6666 6666 6666 0000" /* ...fffffffffff.. */
+ $"0000 0666 6666 6666 6666 6666 6666 0000" /* ...fffffffffff.. */
+ $"0000 0666 6666 6666 6666 6666 6666 0000" /* ...fffffffffff.. */
+ $"0000 0F00 0000 0000 0000 0000 000F 0000" /* ................ */
+ $"0000 0F00 0000 0000 0000 0000 000F 0000" /* ................ */
+ $"0000 0F00 0000 0000 0000 0000 000F 0000" /* ................ */
+ $"0000 0F00 0000 0000 0000 0000 000F 0000" /* ................ */
+ $"0000 0F00 0000 0000 0000 0000 000F 0000" /* ................ */
+ $"0000 0F00 0000 0000 0000 0000 000F 0000" /* ................ */
+ $"0000 0F00 0000 0000 0000 0000 000F 0000" /* ................ */
+ $"0000 0FFF FFFF FFFF FFFF FFFF FFFF 0000" /* ...ÿÿÿÿÿÿÿÿÿÿÿ.. */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+};
+
+data 'DDMO' (0, "Owner resource") {
+ $"00" /* . */
+};
diff --git a/private/oleauto/sample/dispdemo/dispdemo.rc b/private/oleauto/sample/dispdemo/dispdemo.rc
new file mode 100644
index 000000000..6f4c170d0
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/dispdemo.rc
@@ -0,0 +1,36 @@
+#define NOKERNEL
+#define NOGDI
+#define NOSOUND
+#define NOCOMM
+#define NODRIVERS
+#include "windows.h"
+#include "dispdemo.h"
+
+DISPDEMO ICON dispdemo.ico
+
+DispDemoMenu MENU
+BEGIN
+ MENUITEM "&CPoly", IDM_POLY
+
+ MENUITEM "CPoly&2", IDM_POLY2
+
+ POPUP "&Options"
+ BEGIN
+ MENUITEM "&Trace", IDM_TRACE
+ END
+
+ POPUP "&Help"
+ BEGIN
+ MENUITEM "&About IDispatch Demo...", IDM_ABOUT
+ END
+END
+
+AboutBox DIALOG 22, 17, 144, 75
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "About IDispatch Demo App"
+BEGIN
+ CTEXT "Microsoft Windows" -1, 0, 5, 144, 8
+ CTEXT "IDispatch Demo Application" -1, 0, 14, 144, 8
+ CTEXT "Version 2.0" -1, 0, 34, 144, 8
+ DEFPUSHBUTTON "OK" IDOK, 53, 59, 32, 14, WS_GROUP
+END
diff --git a/private/oleauto/sample/dispdemo/hostenv.h b/private/oleauto/sample/dispdemo/hostenv.h
new file mode 100644
index 000000000..56a311393
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/hostenv.h
@@ -0,0 +1,117 @@
+/***
+*hostenv.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Generic host specific includes.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(_MAC)
+
+#if defined(_PPCMAC)
+#pragma data_seg("_FAR_DATA")
+#pragma data_seg( )
+#define MAXLONG 0x7fffffff
+#define EventHandlerProcPtr AEEventHandlerUPP
+#else //_PPCMAC
+#define GetMenuItemText(mApple,menuItem,daName) GetItem(mApple,menuItem,daName)
+#endif //_PPCMAC
+
+#endif //_MAC
+
+#if defined(_MAC)
+
+#if defined(_MSC_VER)
+
+# include <values.h>
+# include <types.h>
+# include <string.h>
+# include <quickdra.h>
+# include <fonts.h>
+# include <events.h>
+# include <resource.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutil.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEve.h>
+
+#else //_MSC_VER
+
+# include <values.h>
+# include <types.h>
+# include <strings.h>
+# include <quickdraw.h>
+# include <fonts.h>
+# include <events.h>
+# include <resources.h>
+# include <windows.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutils.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEvents.h>
+
+#endif //_MSC_VER
+
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+
+#elif defined(WIN32)
+
+# include <windows.h>
+
+# if defined(UNICODE)
+ #define TCHAR WCHAR
+ #define TSTR(str) L##str
+ #define STRING(str) (str)
+ #define WIDESTRING(str) (str)
+# else
+ #define TCHAR char
+ #define TSTR(str) str
+ #define STRING(str) AnsiString(str)
+ #define WIDESTRING(str) WideString(str)
+ extern "C" char FAR* AnsiString(OLECHAR FAR* strIn);
+ extern "C" OLECHAR FAR* WideString(char FAR* strIn);
+# endif
+
+
+#else /* WIN16 */
+
+# include <windows.h>
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+#endif
+
diff --git a/private/oleauto/sample/dispdemo/macmain.cpp b/private/oleauto/sample/dispdemo/macmain.cpp
new file mode 100644
index 000000000..aa7175988
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/macmain.cpp
@@ -0,0 +1,322 @@
+/***
+*macmain.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dispdemo.h"
+
+#include <stdio.h>
+
+extern "C" {
+
+Boolean g_fInitOle = false;
+#ifndef _PPCMAC
+Boolean g_fInitLibraryManager = false;
+#endif //_PPCMAC
+
+WindowPtr g_pwndClient = nil;
+WindowPtr g_pwndDebug = nil;
+
+}
+
+void Init(void);
+void EventLoop(void);
+
+void AdjustMenus(void);
+void Close(WindowPtr window);
+void DoEvent(EventRecord *pevent);
+void DoMenuCommand(long menuResult);
+void Quit(void);
+#ifndef _MSC_VER
+#ifndef ConstStr255Param
+#define ConstStr255Param StringPtr
+#endif
+#endif
+void Fatal(ConstStr255Param);
+
+Boolean
+IsAppWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : ((WindowPeek)window)->windowKind == userKind;
+}
+
+Boolean
+IsDAWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind < 0);
+}
+
+void
+main()
+{
+ Init();
+ EventLoop();
+}
+
+void
+EventLoop()
+{
+ EventRecord event;
+ RgnHandle cursorRgn;
+
+ cursorRgn = NewRgn();
+ while(1){
+ if(WaitNextEvent(everyEvent, &event, MAXLONG, cursorRgn))
+ DoEvent(&event);
+ }
+}
+
+void
+DoEvent(EventRecord *pevent)
+{
+ char key;
+ short part;
+ WindowPtr window;
+
+ switch(pevent->what){
+ case mouseDown:
+ part = FindWindow(pevent->where, &window);
+ switch(part){
+ case inMenuBar:
+ AdjustMenus();
+ DoMenuCommand(MenuSelect(pevent->where));
+ break;
+
+ case inSysWindow: /* let the system handle the mouseDown */
+ SystemClick(pevent, window);
+ break;
+
+ case inContent:
+ if(window != FrontWindow()){
+ SelectWindow(window);
+ }
+ break;
+
+ case inDrag:
+ DragWindow(window, pevent->where, &qd.screenBits.bounds);
+ break;
+ }
+ break;
+
+ case keyDown:
+ case autoKey: /* check for menukey equivalents */
+ key = (char)(pevent->message & charCodeMask);
+ if(pevent->modifiers & cmdKey){ /* Command key down */
+ if(pevent->what == keyDown){
+ /* enable/disable/check menu items properly */
+ AdjustMenus();
+ DoMenuCommand(MenuKey(key));
+ }
+ }
+ break;
+
+ case updateEvt:
+ window = (WindowPtr)pevent->message;
+ if(IsAppWindow(window)){
+ BeginUpdate(window);
+ if(!EmptyRgn(window->visRgn)){
+ SetPort(window);
+ EraseRect(&window->portRect);
+ }
+ EndUpdate(window);
+ }
+ break;
+
+ case kHighLevelEvent:
+ AEProcessAppleEvent(pevent);
+ break;
+ }
+}
+
+void
+Enable(MenuHandle hmenu, short sItem, Boolean fEnable)
+{
+ if(fEnable)
+ EnableItem(hmenu, sItem);
+ else
+ DisableItem(hmenu, sItem);
+}
+
+void
+AdjustMenus()
+{
+ Boolean fIsDA;
+ MenuHandle hmenu;
+
+ fIsDA = IsDAWindow(FrontWindow());
+
+ /* we can allow desk accessories to be closed from the menu */
+ hmenu = GetMHandle(mFile);
+ Enable(hmenu, iClose, fIsDA);
+
+ hmenu = GetMHandle(mEdit);
+ Enable(hmenu, iUndo, fIsDA);
+ Enable(hmenu, iCut, fIsDA);
+ Enable(hmenu, iCopy, fIsDA);
+ Enable(hmenu, iClear, fIsDA);
+ Enable(hmenu, iPaste, fIsDA);
+}
+
+void
+DoMenuCommand(long menuResult)
+{
+ short menuID; /* the resource ID of the selected menu */
+ short menuItem; /* the item number of the selected menu */
+ Str255 daName;
+
+ menuID = HiWord(menuResult);
+ menuItem = LoWord(menuResult);
+
+ switch(menuID){
+ case mApple:
+ switch(menuItem){
+ case iAbout:
+ Alert(rAboutAlert, nil);
+ break;
+ default: /* all non-About items in this menu are DAs */
+ GetMenuItemText(GetMHandle(mApple), menuItem, daName);
+ OpenDeskAcc(daName);
+ break;
+ }
+ break;
+
+ case mFile:
+ switch(menuItem){
+ case iClose:
+ Close(FrontWindow());
+ break;
+ case iQuit:
+ Quit();
+ break;
+ }
+ break;
+
+ case mEdit:
+ SystemEdit(menuItem-1);
+ break;
+
+ case mSpoly:
+ DoPoly(CLSID_CPoly);
+ break;
+
+ case mSpoly2:
+ DoPoly(CLSID_CPoly2);
+ break;
+ }
+
+ HiliteMenu(0);
+}
+
+void
+Close(WindowPtr window)
+{
+ if(IsDAWindow(window))
+ CloseDeskAcc(((WindowPeek)window)->windowKind);
+ else if(IsAppWindow(window))
+ CloseWindow(window);
+}
+
+#if defined(_MSC_VER)
+OSErr pascal
+#else
+pascal OSErr
+#endif
+RemoteLowLevelEvt(AppleEvent theAppEvt, AppleEvent reply, long HandlerRefCon)
+{
+ long cb;
+ OSErr err;
+ DescType descType;
+ EventRecord event;
+
+ UNUSED(reply);
+ UNUSED(HandlerRefCon);
+
+ err = AEGetKeyPtr(
+ &theAppEvt,
+ keyDirectObject,
+ typeWildCard,
+ &descType,
+ (Ptr)&event, sizeof(event), &cb);
+
+ if(err != noErr)
+ return err;
+
+ DoEvent(&event);
+
+ return noErr;
+}
+
+void
+Init()
+{
+ Handle menuBar;
+
+ MaxApplZone();
+
+ InitGraf((Ptr)&qd.thePort);
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ TEInit();
+ InitDialogs(nil);
+ InitCursor();
+ FlushEvents(everyEvent, 0);
+
+#ifndef _PPCMAC
+ if (InitOleManager(0) != NOERROR)
+ Fatal((ConstStr255Param)"\pCould not initialize OLE Applet");
+
+ g_fInitLibraryManager = true;
+#endif //_PPCMAC
+
+ if(InitOle() != NOERROR)
+ Fatal((ConstStr255Param)"\pUnable to Initialize Ole");
+ g_fInitOle = true;
+
+ if(AEInstallEventHandler('OLE2', 'EVNT', (EventHandlerProcPtr)RemoteLowLevelEvt, 0, false) != noErr)
+ Fatal((ConstStr255Param)"\pUnable to install handler");
+
+ if((g_pwndClient = (WindowPtr)NewPtr(sizeof(WindowRecord))) == nil)
+ Fatal((ConstStr255Param)"\pOut of memory");
+ g_pwndClient = GetNewCWindow(rWindow, (Ptr)g_pwndClient, (WindowPtr)-1);
+
+ g_pwndDebug = g_pwndClient;
+
+ if((menuBar = GetNewMBar(rMenuBar)) == nil)
+ Fatal((ConstStr255Param)"\pUnable to load menu bar");
+ SetMenuBar(menuBar);
+ DisposHandle(menuBar);
+ AddResMenu(GetMHandle(mApple), 'DRVR'); /* add DA names to Apple menu */
+ DrawMenuBar();
+}
+
+void
+Quit()
+{
+ if(g_fInitOle)
+ UninitOle();
+#ifndef _PPCMAC
+ if(g_fInitLibraryManager)
+ UninitOleManager(); // clean up applet
+#endif //_PPCMAC
+ ExitToShell();
+}
+
+/* display fatal error alert, and exit */
+void
+Fatal(ConstStr255Param msg)
+{
+ SetCursor(&qd.arrow);
+ ParamText(msg, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
+ Alert(rUserAlert, nil);
+ Quit();
+}
+
diff --git a/private/oleauto/sample/dispdemo/makefile b/private/oleauto/sample/dispdemo/makefile
new file mode 100644
index 000000000..3490f0df3
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/makefile
@@ -0,0 +1,351 @@
+##############################################################################
+#
+# (c) Copyright Microsoft Corp. 1992-1994 All Rights Reserved
+#
+# File:
+#
+# makefile - makefile for dispdemo.exe
+#
+# Purpose:
+#
+# Builds the OLE 2.0 IDispatch sample client application, dispdemo.exe.
+#
+#
+# Usage:
+#
+# NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option:
+# dev = [win16 | win32 | mac] ; dev=win16 is the default
+# CPU = [i386 | M68K | MIPS | ALPHA | PPC]
+# DEBUG=[0|1] ; DEBUG=1 is the default
+#
+#
+# Notes:
+#
+# This makefile assumes that the CPU, PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+##############################################################################
+
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if "$(dev)" == ""
+dev = win16
+!endif
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32" || "$(dev)" == "mac")
+!error Invalid dev option, choose from [win16 | win32 | mac]
+!endif
+
+!if "$(dev)" == "win16"
+TARGET = WIN16
+!endif
+
+!if "$(dev)" == "win32"
+TARGET = WIN32
+!endif
+
+!if "$(dev)" == "mac"
+TARGET = MAC
+!endif
+
+!if "$(DEBUG)" == ""
+DEBUG = 1
+!endif
+
+
+##########################################################################
+#
+# WIN16 Settings
+#
+!if "$(TARGET)" == "WIN16"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -dWIN16
+CFLAGS = -W3 -AM -GA -GEs -DWIN16
+LINKFLAGS = /NOD /NOI /BATCH /ONERROR:NOEXE
+
+LIBS = libw.lib mlibcew.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) /COD
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+LINKFLAGS = $(LINKFLAGS) /FAR /PACKC
+!endif
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARGET)" == "WIN32"
+
+!if "$(CPU)"==""
+
+!if "$(PROCESSOR_ARCHITECTURE)"=="" || "$(PROCESSOR_ARCHITECTURE)"=="x86"
+CPU=i386
+!else
+CPU=$(PROCESSOR_ARCHITECTURE)
+!endif
+
+!endif #CPU
+
+!if "$(CPU)" == "i386"
+CC = cl386
+LINK = link
+CFLAGS = -D_X86_=1
+!endif
+!if "$(CPU)" == "MIPS"
+CC = cl
+LINK = link
+CFLAGS = -D_MIPS_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "ALPHA"
+CC = claxp
+LINK = link
+CFLAGS = -D_ALPHA_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "PPC"
+CC = cl
+LINK = link
+CFLAGS = -D_PPC_=1 -DUNICODE
+!endif
+
+RCFLAGS = -dWIN32
+CFLAGS = $(CFLAGS) -nologo -W3 -DWIN32 -DINC_OLE2 -D_MT $(CL)
+LINKFLAGS = -Incremental:NO -Pdb:NONE -subsystem:windows -entry:WinMainCRTStartup -machine:$(CPU)
+
+LIBS = libc.lib kernel32.lib user32.lib gdi32.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Z7 -D_DEBUG $(CL)
+LINKFLAGS = -debug:full -debugtype:cv,coff $(LINKFLAGS)
+!else
+CFLAGS = $(CFLAGS) -Ox
+!endif
+!endif
+
+
+##########################################################################
+#
+# MAC Settings
+#
+!if "$(TARGET)" == "MAC"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -d_MAC
+
+!if "$(CPU)"=="PPC"
+CFLAGS = -W3 -D_MAC -D_PPCMAC -D_pascal= -D__pascal=
+LIBS = interfac.lib libc.lib ole2.lib ole2auto.lib
+LINKFLAGS = -machine:mppc -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+!else
+LIBS = interfac.lib llibcs.lib lsanes.lib swap.lib
+CFLAGS = -W3 -AL -D_MAC
+LINKFLAGS = -machine:$(CPU) -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+!endif
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) -debug:full -debugtype:cv
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+!endif
+
+MRC = mrc
+!if "$(CPU)"=="PPC"
+MRCOPT = -D_PPCMAC -s$(VBATOOLS)\win32\ppc\lib
+!else
+MRCOPT =
+!endif
+
+MAKEPEF = makepef
+!endif
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+APPS = dispdemo
+
+SRCDIR = $(OLEPROG)\SAMPLE\$(APPS)
+
+!if "$(TARGET)" == "MAC" && "$(CPU)"=="PPC"
+OBJDIR=$(SRCDIR)\macppc
+!else
+OBJDIR=$(SRCDIR)\$(TARGET)
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+
+!if "$(TARGET)" == "WIN16"
+LIBS = ole2.lib compobj.lib ole2disp.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "WIN32"
+LIBS = ole32.lib oleaut32.lib uuid.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "MAC"
+!if "$(CPU)"!="PPC"
+LIBS = olenrf.obj oanrf.obj $(LIBS)
+!endif
+!endif
+
+OBJS = \
+!if "$(TARGET)" == "MAC"
+ $(OBJDIR)\macmain.obj \
+!else
+ $(OBJDIR)\winmain.obj \
+!endif
+ $(OBJDIR)\misc.obj \
+ $(OBJDIR)\crempoly.obj \
+ $(OBJDIR)\clsid.obj
+
+
+##########################################################################
+#
+# Build rules
+#
+
+{$(SRCDIR)}.cpp{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+{$(SRCDIR)}.c{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+goal : setflags $(OBJDIR)\$(APPS).exe
+
+setflags :
+ set CL=$(CFLAGS)
+
+
+##########################################################################
+#
+# Clean (erase) generated files
+#
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\$(APPS).exe del $(OBJDIR)\$(APPS).exe
+ if exist $(OBJDIR)\$(APPS).map del $(OBJDIR)\$(APPS).map
+ if exist $(OBJDIR)\$(APPS).res del $(OBJDIR)\$(APPS).res
+ if exist $(OBJDIR)\$(APPS).rs del $(OBJDIR)\$(APPS).rs
+ if exist $(OBJDIR)\*.pdb del $(OBJDIR)\*.pdb
+
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARGET)" == "WIN16"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ link $(LINKFLAGS) @<<
+$(OBJS),
+$@,$(OBJDIR)\$(APPS).map/map,
+$(LIBS),
+$(SRCDIR)\$(APPS).def
+<<
+ rc -k -t $(OBJDIR)\$(APPS).res $@
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARGET)" == "WIN32"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ cvtres -r -$(CPU) $(OBJDIR)\$(APPS).res -o $(OBJDIR)\$(APPS).rs
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(OBJDIR)\$(APPS).rs
+ $(LIBS)
+<<
+!endif
+
+
+##########################################################################
+#
+# Application Build (MAC Specific)
+#
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(OBJDIR)\$(APPS).x
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(LIBS)
+<<
+ copy $(OBJDIR)\$(APPS).x $(OBJDIR)\$(APPS)
+!if "$(CPU)"=="PPC"
+ $(MAKEPEF) $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).pef
+!else
+ cvpack $(OBJDIR)\$(APPS).exe
+ $(MRC) $(MRCOPT) -e $(OBJDIR)\$(APPS).exe -a -o $(OBJDIR)\$(APPS)
+!endif
+
+$(OBJDIR)\$(APPS).x: $(SRCDIR)\$(APPS).r
+ $(MRC) $(MRCOPT) -D_MAC -o $(OBJDIR)\$(APPS).x $(SRCDIR)\$(APPS).r
+!endif
+
+
+##########################################################################
+#
+# Application Build (Common)
+#
+
+$(OBJDIR)\$(APPS).res : $(SRCDIR)\$(APPS).rc
+ rc $(RCFLAGS) -r -fo$@ $?
+
+
+##########################################################################
+#
+# Dependencies
+#
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\macmain.obj: $(SRCDIR)\macmain.cpp $(SRCDIR)\dispdemo.h
+ $(CC) -c -Fo$@ $(SRCDIR)\macmain.cpp
+!else
+$(OBJDIR)\winmain.obj: $(SRCDIR)\winmain.cpp $(SRCDIR)\dispdemo.h
+ $(CC) -c -Fo$@ $(SRCDIR)\winmain.cpp
+!endif
+
+$(OBJDIR)\misc.obj: $(SRCDIR)\misc.cpp $(SRCDIR)\dispdemo.h
+ $(CC) -c -Fo$@ $(SRCDIR)\misc.cpp
+
+$(OBJDIR)\crempoly.obj: $(SRCDIR)\crempoly.cpp $(SRCDIR)\crempoly.h
+ $(CC) -c -Fo$@ $(SRCDIR)\crempoly.cpp
+
+$(OBJDIR)\clsid.obj: $(SRCDIR)\clsid.c $(SRCDIR)\clsid.h
+ $(CC) -c -Fo$@ $(SRCDIR)\clsid.c
diff --git a/private/oleauto/sample/dispdemo/misc.cpp b/private/oleauto/sample/dispdemo/misc.cpp
new file mode 100644
index 000000000..5880bd1a2
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/misc.cpp
@@ -0,0 +1,99 @@
+/***
+*misc.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+// Use ANSI strings for assertions
+#ifdef UNICODE
+# undef UNICODE
+#endif
+
+#include "dispdemo.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+
+
+int g_fTrace = 0;
+
+STDAPI
+InitOle(void)
+{
+ HRESULT hresult;
+
+ if((hresult = OleInitialize(NULL)) != NOERROR)
+ return hresult;
+
+// UNDONE: temporary to try to get symbols for the DLL
+ VARIANT var;
+ VariantInit(&var);
+
+ return NOERROR;
+}
+
+STDAPI
+UninitOle()
+{
+ OleUninitialize();
+
+ return NOERROR;
+}
+
+extern "C" void
+Assert(int fCond, char FAR* file, int line)
+{
+ char buf[128];
+
+ if(fCond)
+ return;
+
+ sprintf(buf, "Assertion failed: %s(%d)\n", file, line);
+
+#ifdef _MAC
+ DebugStr(c2pstr(buf));
+#else
+ OutputDebugString(buf);
+ DebugBreak();
+#endif
+}
+
+#ifdef _MAC
+
+extern "C" {
+extern WindowPtr g_pwndDebug;
+
+void
+DbPrintf(char *sz, ...)
+{
+ va_list args;
+ WindowPtr pwndSaved;
+static char rgchOut[256];
+
+ if(g_pwndDebug == nil)
+ return;
+
+ GetPort(&pwndSaved);
+ SetPort(g_pwndDebug);
+
+ va_start(args, sz);
+ vsprintf(rgchOut, sz, args);
+ rgchOut[79] = '\0';
+
+ EraseRect(&g_pwndDebug->portRect);
+ TextFont(systemFont);
+ MoveTo(10,20);
+ DrawString(c2pstr(rgchOut));
+
+ SetPort(pwndSaved);
+}
+
+}
+
+#endif
diff --git a/private/oleauto/sample/dispdemo/mk.bat b/private/oleauto/sample/dispdemo/mk.bat
new file mode 100644
index 000000000..d9cd6ac7a
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/mk.bat
@@ -0,0 +1,23 @@
+REM setup the environment for the dispdemo makefile
+
+set OLDLIB=%LIB%
+set OLDPATH=%PATH%
+set OLDINC=%INCLUDE%
+set OLDTOOLS=%TOOLS%
+
+set TOOLS=%OLEPROG%\TOOLS\win16
+set PATH=%TOOLS%\HDOS\BIN;%TOOLS%\HDOS\C800\BIN
+set LIB=%TOOLS%\HDOS\C800\LIB;%OLEPROG%\DWIN16;%OLEPROG%\OLE\WIN16\lib
+set INCLUDE=%TOOLS%\HDOS\C800\INCLUDE;%OLEPROG%\OLE\WIN16;%OLEPROG%\SRC\DISPATCH;%OLEPROG%\SRC\inc
+
+nmake %1 %2 %3 %4 %5
+
+set LIB=%OLDLIB%
+set PATH=%OLDPATH%
+set INCLUDE=%OLDINC%
+set TOOLS=%OLDTOOLS%
+
+set OLDPATH=
+set OLDINC=
+set OLDLIB=
+set OLDTOOLS=
diff --git a/private/oleauto/sample/dispdemo/mk.cmd b/private/oleauto/sample/dispdemo/mk.cmd
new file mode 100644
index 000000000..8cf2c0fe9
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/mk.cmd
@@ -0,0 +1,13 @@
+REM The dispdemo.exe makefile assumes that PATH, LIB, and include are setup.
+
+@setlocal
+
+REM we get rc.exe and winstub.exe from \tools\win
+
+set PATH=%TOOLS%\HOS2\BIN;%TOOLS%\HOS2\C700\BIN
+set INCLUDE=%TOOLS%\HOS2\C700\INCLUDE;%OLEPROG%\ole\dwin16;%OLEPROG%\src\dispatch
+set LIB=%TOOLS%\HOS2\C700\LIB;%OLEPROG%\ole\dwin16;%OLEPROG%\build\dwin16
+
+nmake %1 %2 %3 %4 %5
+
+@endlocal
diff --git a/private/oleauto/sample/dispdemo/readme.txt b/private/oleauto/sample/dispdemo/readme.txt
new file mode 100644
index 000000000..3298037cc
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/readme.txt
@@ -0,0 +1,21 @@
+---------------------------------------
+OLE Automation Sample Program: DispDemo
+---------------------------------------
+
+DispDemo is a sample OLE Automation controller. DispDemo
+drives the two polygon servers which are also provided
+as samples.
+
+
+-----------------
+Program Structure
+-----------------
+The interesting part of DispDemo is in the remote polygon
+class. The remote polygon class was constructed so that
+the IDispatch members could be accessed conveniently from
+C++. The remote polygon class does this by transforming
+the C++ calls into IDispatch calls. The code that calls
+these routines has no idea that it is going through IDispatch.
+
+
+
diff --git a/private/oleauto/sample/dispdemo/resource.h b/private/oleauto/sample/dispdemo/resource.h
new file mode 100644
index 000000000..77e52a6e8
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/resource.h
@@ -0,0 +1,60 @@
+/***
+*resource.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _MAC
+
+#define kMinSize 500 /* minimum size (in K) */
+#define kPrefSize 500 /* preferred size (in K) */
+
+#define rMenuBar 128 /* menu bar */
+
+#define rAboutAlert 128 /* about alert */
+
+#define rUserAlert 129 /* error alert */
+
+#define rWindow 128 /* application's window */
+#define rDebugWindow 129 /* debug window */
+
+#define mApple 128 /* Apple menu */
+#define iAbout 1
+
+#define mFile 129 /* File menu */
+#define iNew 1
+#define iClose 4
+#define iQuit 12
+
+#define mEdit 130 /* Edit menu */
+#define iUndo 1
+#define iCut 3
+#define iCopy 4
+#define iPaste 5
+#define iClear 6
+
+#define mSpoly 131
+#define iSpoly 1
+
+#define mSpoly2 132
+#define iSpoly2 1
+
+#define kMinHeap 21 * 1024
+#define kMinSpace 8 * 1024
+
+#else /* WIN16 || WIN32 */
+
+# define IDM_ABOUT 1
+# define IDM_POLY 2
+# define IDM_POLY2 3
+# define IDM_TRACE 4
+# define IDM_MAX 5
+
+#endif
+
+
diff --git a/private/oleauto/sample/dispdemo/winmain.cpp b/private/oleauto/sample/dispdemo/winmain.cpp
new file mode 100644
index 000000000..37776a373
--- /dev/null
+++ b/private/oleauto/sample/dispdemo/winmain.cpp
@@ -0,0 +1,185 @@
+/***
+*dispdemo.c - IDespatch demo/sample client application.
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module is the main entry point for the sample IDispatch client,
+* dispdemo.exe.
+*
+* This program is intended to demonstrate a client invoking methods
+* and referencing properties on a remote object via the IDispatch
+* interface.
+*
+* The bulk of the sample can be found in the file crempoly.cpp, which
+* implements CRemPoly, the remote polygon class.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dispdemo.h"
+
+extern BOOL g_fTrace;
+
+BOOL InitApplication(HINSTANCE);
+BOOL InitInstance(HINSTANCE, int);
+BOOL FAR PASCAL About(HWND, unsigned, WORD, LONG);
+
+extern "C" {
+int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+LRESULT FAR PASCAL MainWndProc(HWND, UINT, WPARAM, LPARAM);
+}
+
+HINSTANCE g_hInst;
+
+TCHAR g_szDispDemoWClass[] = TSTR("DispDemoWClass");
+
+extern "C" int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+
+
+ (lpCmdLine); // UNUSED
+
+ if(!hPrevInstance)
+ if(!InitApplication(hinst))
+ return FALSE;
+
+ if(InitOle() != NOERROR)
+ return FALSE;
+
+ if(!InitInstance(hinst, nCmdShow))
+ return FALSE;
+
+ while(GetMessage(&msg, NULL, 0, 0)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ UninitOle();
+
+ return msg.wParam;
+}
+
+
+BOOL
+InitApplication(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ wc.style = NULL;
+ wc.lpfnWndProc = MainWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(hinst, TSTR("DISPDEMO"));
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wc.lpszMenuName = TSTR("DispDemoMenu");
+ wc.lpszClassName = g_szDispDemoWClass;
+ if(!RegisterClass(&wc))
+ return FALSE;
+
+ return TRUE;
+}
+
+#ifdef WIN32
+#define szAppTitle TSTR("IDispatch Demo App (32-bit)")
+#else //WIN32
+#define szAppTitle TSTR("IDispatch Demo App")
+#endif //WIN32
+
+BOOL
+InitInstance(HINSTANCE hinst, int nCmdShow)
+{
+ HWND hWnd;
+
+ g_hInst = hinst;
+
+ hWnd = CreateWindow(
+ g_szDispDemoWClass,
+ szAppTitle,
+ WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,
+ CW_USEDEFAULT, CW_USEDEFAULT, 300, 100,
+ NULL, NULL, hinst, NULL);
+
+ if(!hWnd)
+ return FALSE;
+
+ ShowWindow(hWnd, nCmdShow);
+ UpdateWindow(hWnd);
+
+ return TRUE;
+}
+
+
+BOOL FAR PASCAL
+About(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
+{
+ switch(message){
+ case WM_INITDIALOG:
+ return TRUE;
+
+ case WM_COMMAND:
+ switch(wParam){
+ case IDOK:
+ case IDCANCEL:
+ EndDialog(hDlg, TRUE);
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+
+extern "C" LRESULT FAR PASCAL
+MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ HMENU hmenu;
+static DLGPROC pfnAbout;
+
+ switch(message){
+ case WM_COMMAND:
+ switch(wParam){
+ case IDM_TRACE:
+ /* enable/disable trace */
+ g_fTrace = (g_fTrace) ? FALSE : TRUE;
+ hmenu = GetMenu(hwnd);
+ CheckMenuItem(hmenu, IDM_TRACE, g_fTrace ? MF_CHECKED : MF_UNCHECKED);
+ return 0;
+
+ case IDM_POLY:
+ DoPoly(CLSID_CPoly);
+ return 0;
+
+ case IDM_POLY2:
+ DoPoly(CLSID_CPoly2);
+ return 0;
+
+ case IDM_ABOUT:
+ pfnAbout = (DLGPROC)MakeProcInstance((FARPROC)About, g_hInst);
+ DialogBox(g_hInst, TSTR("AboutBox"), hwnd, pfnAbout);
+ FreeProcInstance(pfnAbout);
+ return 0;
+ }
+ break;
+
+ case WM_CLOSE:
+ DestroyWindow(hwnd);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefWindowProc(hwnd, message, wParam, lParam);
+}
+
diff --git a/private/oleauto/sample/dspcalc2/calctype.odl b/private/oleauto/sample/dspcalc2/calctype.odl
new file mode 100644
index 000000000..690a7994c
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/calctype.odl
@@ -0,0 +1,95 @@
+/***
+*calctype.odl
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the definitions of the objects exposed for OLE Automation
+* by the dspcalc2
+* example program. MkTypLib uses this file to produce a type library and
+* a header file. The header file is then used in compiling dspcalc2.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+[
+ uuid(00020470-0000-0000-C000-000000000046),
+ helpstring("OLE Automation DspCalc2 1.0 Type Library"),
+ lcid(0x0409),
+ version(1.0)
+]
+library DspCalc2
+{
+
+#if defined(WIN32)
+ importlib("stdole32.tlb");
+#else
+#if defined(MAC) && !defined(_MSC_VER)
+ importlib("Standard OLE Types");
+#else
+ importlib("stdole.tlb");
+#endif
+#endif
+
+ typedef enum operators {
+ OP_NONE = 0,
+ OP_PLUS,
+ OP_MINUS,
+ OP_MULT,
+ OP_DIV
+ } OPERATORS;
+
+
+ [
+ uuid(00020441-0000-0000-C000-000000000046),
+ helpstring("DspCalc2"),
+ odl
+ ]
+ interface _ICalculator : IUnknown
+ {
+ [propput]
+ void Accum([in] long l);
+ [propget, helpstring("The value stored in the calculator")]
+ long Accum();
+
+ [propput]
+ void Opnd([in] long l);
+ [propget]
+ long Opnd();
+
+ [propput]
+ void Op([in] OPERATORS op);
+ [propget]
+ OPERATORS Op();
+
+ boolean Eval(void);
+ void Clear(void);
+ void Display(void);
+ void Quit(void);
+ [vararg] boolean Button([in]SAFEARRAY(VARIANT) psa);
+ }
+
+
+ [
+ uuid(00020442-0000-0000-C000-000000000046),
+ helpstring("DspCalc2")
+ ]
+ dispinterface _DCalculator
+ {
+ interface _ICalculator;
+ }
+
+
+ [
+ uuid(00020469-0000-0000-C000-000000000046),
+ helpstring("DspCalc2"),
+ appobject
+ ]
+ coclass Calculator
+ {
+ dispinterface _DCalculator;
+ interface _ICalculator;
+ }
+}
diff --git a/private/oleauto/sample/dspcalc2/clsid.c b/private/oleauto/sample/dspcalc2/clsid.c
new file mode 100644
index 000000000..5994746b5
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/clsid.c
@@ -0,0 +1,46 @@
+/***
+*clsid.c
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates and initializes the CLSIDs.
+*
+*****************************************************************************/
+
+#ifdef _PPCMAC
+#pragma data_seg ("_FAR_DATA")
+#pragma data_seg ( )
+#endif //_PPCMAC
+
+#ifdef _MAC
+# include <Types.h>
+#ifdef _MSC_VER
+# include <Processe.h>
+# include <AppleEve.h>
+#else //_MSC_VER
+# include <Processes.h>
+# include <AppleEvents.h>
+#endif //_MSC_VER
+#else
+# include <windows.h>
+#endif
+
+#ifndef WIN32
+#include <compobj.h>
+#endif //!WIN32
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+#ifndef INITGUID
+# define INITGUID
+#endif
+
+// due to the previous header, including this causes the DEFINE_GUID
+// definitions in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
+
diff --git a/private/oleauto/sample/dspcalc2/clsid.h b/private/oleauto/sample/dspcalc2/clsid.h
new file mode 100644
index 000000000..f85b7c98d
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/clsid.h
@@ -0,0 +1,30 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+DEFINE_GUID(CLSID_CCalc2, 0x00020469, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(LIBID_DspCalc2, 0x00020470, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_ICalculator, 0x00020441, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_DCalculator, 0x00020442, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+
+#ifdef INITGUID
+# ifdef _MAC
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+# ifndef _MW_BUILD
+/* The PPC Metrowerks gives warning if this is redefined */
+DEFINE_GUID(IID_IDispatch, 0x00020400, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IEnumVARIANT, 0x00020404, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+DEFINE_GUID(IID_IUnknown, 0x00000000, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IClassFactory, 0x00000001, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+#endif
diff --git a/private/oleauto/sample/dspcalc2/dspcalc2.cpp b/private/oleauto/sample/dspcalc2/dspcalc2.cpp
new file mode 100644
index 000000000..bd42fed7b
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/dspcalc2.cpp
@@ -0,0 +1,689 @@
+/***
+*dspcalc2.cpp
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the basic user interface and arithmetic
+* functionality of the IDispatch calculator.
+*
+* The implementation of IDispatch is via aggregation with an
+* instance of the "standard" IDispatch implementation, which is
+* initialized with a TypeInfo loaded from the TypeLib that was
+* constructed from the ODL description of the calculator.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dspcalc2.h"
+
+CCalc FAR* g_pcalc = NULL;
+
+unsigned long g_dwCCalcCF = 0;
+unsigned long g_dwRegisterCCalc = 0;
+
+#ifdef _MAC
+extern Boolean g_fQuit;
+#endif //_MAC
+
+
+/***
+*CCalc *CCalc::Create(void)
+*Purpose:
+* Create an instance of the IDispatch calculator, load the
+* TypeInfo that describes the exposed functionality and
+* aggregate with an instance of CStdDispatch that has been
+* initialized with this TypeInfo.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = CCalc*, NULL if the creation failed.
+*
+***********************************************************************/
+CCalc FAR*
+CCalc::Create()
+{
+ HRESULT hresult;
+ CCalc FAR* pcalc;
+ ITypeLib FAR* ptlib;
+ ITypeInfo FAR* ptinfo;
+ IUnknown FAR* punkStdDisp;
+
+ ptlib = NULL;
+ ptinfo = NULL;
+
+ if((pcalc = new FAR CCalc()) == NULL)
+ return NULL;
+ pcalc->AddRef();
+
+ // first try to load the type library from the information in the registry
+ if((hresult = LoadRegTypeLib(LIBID_DspCalc2, 1, 0, 0x0409, &ptlib)) != NOERROR){
+
+ #define TLB_NAME OLESTR("dspcalc2.tlb")
+
+ // if it wasn't registered, try to load it from the path/current directory
+ // if this succeeds, it will have registered the type library for us
+ // for the next time.
+ if((hresult = LoadTypeLib(TLB_NAME, &ptlib)) != NOERROR){
+#ifndef _MAC
+ MessageBox(NULL, TSTR("error loading TypeLib"),
+ TSTR("dspcalc2"), MB_OK);
+#endif
+ goto LError0;
+ }
+
+ }
+
+ if((hresult = ptlib->GetTypeInfoOfGuid(IID_ICalculator, &ptinfo)) != NOERROR){
+#ifndef _MAC
+ MessageBox(NULL, TSTR("error accessing TypeInfo"),
+ TSTR("dspcalc2"), MB_OK);
+#endif
+ goto LError0;
+ }
+
+ // Create and aggregate with an instance of the default
+ // implementation of IDispatch that is initialized with our
+ // TypeInfo.
+ //
+ hresult = CreateStdDispatch(
+ pcalc, // controlling unknown
+ &(pcalc->m_arith), // vtable* to dispatch on
+ ptinfo,
+ &punkStdDisp);
+
+ if(hresult != NOERROR)
+ goto LError0;
+
+ pcalc->m_punkStdDisp = punkStdDisp;
+
+ ptinfo->Release();
+ ptlib->Release();
+
+ return pcalc;
+
+LError0:;
+ pcalc->Release();
+ if(ptinfo != NULL)
+ ptinfo->Release();
+ if(ptlib != NULL)
+ ptlib->Release();
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CCalc::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else
+ if(IsEqualIID(riid, IID_IDispatch) ||
+ IsEqualIID(riid, IID_DCalculator)){
+ return m_punkStdDisp->QueryInterface(IID_IDispatch, ppv);
+ }else
+ if(IsEqualIID(riid, IID_ICalculator)){
+ *ppv = &m_arith;
+ }else {
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+ }
+
+ AddRef();
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(ULONG)
+CCalc::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(ULONG)
+CCalc::Release()
+{
+ if(--m_refs == 0){
+ if(m_punkStdDisp != NULL)
+ m_punkStdDisp->Release();
+#ifndef _MAC
+ PostQuitMessage(0);
+#endif
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+STDMETHODIMP
+CArith::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pcalc->QueryInterface(riid, ppv);
+}
+
+
+STDMETHODIMP_(ULONG)
+CArith::AddRef()
+{
+ return m_pcalc->AddRef();
+}
+
+
+STDMETHODIMP_(ULONG)
+CArith::Release()
+{
+ return m_pcalc->Release();
+}
+
+
+//---------------------------------------------------------------------
+// Arithmetic features
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP_(void)
+CArith::Clear()
+{
+ m_opnd = 0;
+ m_accum = 0;
+ m_op = OP_NONE;
+ m_state = STATE_LOPND;
+}
+
+STDMETHODIMP_(void)
+CArith::put_Accum(long l)
+{
+ m_accum = l;
+}
+
+
+STDMETHODIMP_(long)
+CArith::get_Accum()
+{
+ return m_accum;
+}
+
+
+STDMETHODIMP_(void)
+CArith::put_Opnd(long l)
+{
+ m_opnd = l;
+}
+
+
+STDMETHODIMP_(long)
+CArith::get_Opnd()
+{
+ return m_opnd;
+}
+
+
+STDMETHODIMP_(void)
+CArith::put_Op(OPERATORS op)
+{
+ m_op = op;
+}
+
+
+STDMETHODIMP_(OPERATORS)
+CArith::get_Op()
+{
+ return m_op;
+}
+
+
+STDMETHODIMP_(VARIANT_BOOL)
+CArith::Eval()
+{
+ if(m_op == OP_NONE)
+ return FALSE;
+
+ switch(m_op){
+ case OP_PLUS:
+ m_accum += m_opnd;
+ break;
+ case OP_MINUS:
+ m_accum -= m_opnd;
+ break;
+ case OP_MULT:
+ m_accum *= m_opnd;
+ break;
+ case OP_DIV:
+ m_accum = (m_opnd == 0) ? 0 : (m_accum / m_opnd);
+ break;
+ default:
+ // ASSERT(UNREACHED);
+ return FALSE;
+
+ }
+
+ m_state = STATE_EVAL;
+
+ return TRUE;
+}
+
+
+//---------------------------------------------------------------------
+// User Interface features
+//---------------------------------------------------------------------
+
+
+/***
+*void CArith::Display()
+*Purpose:
+* Display the contents of the register currently being edited.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDMETHODIMP_(void)
+CArith::Display()
+{
+ VARIANT var;
+
+ VariantInit(&var);
+ V_VT(&var) = VT_I4;
+ V_I4(&var) = (m_state == STATE_ROPND) ? m_opnd : m_accum;
+ VariantChangeType(&var, &var, 0, VT_BSTR);
+
+ #ifdef _MAC
+ {
+ Rect rcItem;
+ Handle hItem;
+ char str[255];
+ short sItemKind;
+
+ strcpy(str, V_BSTR(&var));
+ GetDItem(m_pcalc->m_pdlg, IDC_DISPLAY, &sItemKind, &hItem, &rcItem);
+ SetIText(hItem, c2pstr(str));
+ }
+#else
+ SetDlgItemText(m_pcalc->m_hwnd, IDC_DISPLAY, STRING(V_BSTR(&var)));
+#endif
+
+ VariantClear(&var);
+}
+
+
+STDMETHODIMP_(VARIANT_BOOL)
+CArith::Button(SAFEARRAY FAR * psa)
+{
+ int i, button;
+
+static struct {
+ OLECHAR ch;
+ int idc;
+} NEAR rgIdcOfCh[] = {
+ { OLESTR('+'), IDC_PLUS }
+ , { OLESTR('-'), IDC_MINUS }
+ , { OLESTR('*'), IDC_MULT }
+ , { OLESTR('/'), IDC_DIV }
+ , { OLESTR('C'), IDC_CLEAR }
+ , { OLESTR('c'), IDC_CLEAR }
+ , { OLESTR('='), IDC_EQUALS }
+ , { OLESTR('0'), IDC_ZERO }
+ , { OLESTR('1'), IDC_ONE }
+ , { OLESTR('2'), IDC_TWO }
+ , { OLESTR('3'), IDC_THREE }
+ , { OLESTR('4'), IDC_FOUR }
+ , { OLESTR('5'), IDC_FIVE }
+ , { OLESTR('6'), IDC_SIX }
+ , { OLESTR('7'), IDC_SEVEN }
+ , { OLESTR('8'), IDC_EIGHT }
+ , { OLESTR('9'), IDC_NINE }
+ , { (OLECHAR)-1 , -1 }
+};
+ LONG saIndex, saUbound;
+ VARIANT varButton;
+
+ // Since this is a vararg function, we should be given a 1-dimensional
+ // array with 0 for the lower bound. The array could be uninitialized
+ // if 0 args were passed to us -- this call will give an error in this case.
+ if (SafeArrayGetUBound(psa, 1, &saUbound) != NOERROR)
+ return FALSE; // most likely 0 args were passed to us
+
+ for (saIndex = 0; saIndex <= saUbound; saIndex++) {
+
+ // get next parameter
+ if (SafeArrayGetElement(psa, &saIndex, &varButton) != NOERROR)
+ return FALSE;
+
+ // convert it to a string in-place
+ if (VariantChangeType(&varButton, &varButton, 0, VT_BSTR) != NOERROR)
+ goto Error;
+
+ // if the string is more that 1 character long, then we know its wrong.
+ if(SysStringLen(varButton.bstrVal) > 1)
+ goto Error;
+
+ // translate button string into control ID
+ for(i = 0;; ++i){
+ if(rgIdcOfCh[i].ch == -1)
+ goto Error;
+ if(rgIdcOfCh[i].ch == varButton.bstrVal[0]){
+ button = rgIdcOfCh[i].idc;
+ break;
+ }
+ }
+
+ VariantClear(&varButton); // done with the parameter
+
+ if (!ButtonPush(button))
+ return FALSE;
+
+ } // for
+
+ return TRUE; // success
+
+Error:
+ VariantClear(&varButton);
+ return FALSE; // failure
+}
+
+
+// the following method is internal, and not exposed for programmability
+BOOL
+CArith::ButtonPush(int button)
+{
+ if(button >= IDC_ZERO && button <= IDC_NINE){
+
+ long lVal = button - IDC_ZERO;
+
+ switch(m_state){
+ case STATE_EVAL:
+ m_accum = lVal;
+ m_state = STATE_LOPND;
+ break;
+ case STATE_OP:
+ m_opnd = lVal;
+ m_state = STATE_ROPND;
+ break;
+ case STATE_LOPND:
+ m_accum = (m_accum * 10) + lVal;
+ break;
+ case STATE_ROPND:
+ m_opnd = (m_opnd * 10) + lVal;
+ break;
+ }
+
+ }else if(button >= IDC_PLUS && button <= IDC_DIV){
+
+ if(m_state == STATE_LOPND){
+ m_opnd = m_accum;
+ m_state = STATE_OP;
+ m_op = (OPERATORS)(button - IDC_PLUS + OP_PLUS);
+ }
+
+ }else if(button == IDC_EQUALS){
+
+ if(m_state > STATE_LOPND)
+ Eval();
+
+ }else if (button == IDC_CLEAR){
+
+ Clear();
+
+ } else {
+
+ return 0; // unknown button
+
+ }
+
+
+ // Flash the button
+
+#ifdef _MAC
+ {
+ Rect rcItem;
+ long lDummy;
+ Handle hItem;
+ short sItemKind;
+
+ GetDItem(m_pcalc->m_pdlg, button, &sItemKind, &hItem, &rcItem);
+ HiliteControl((ControlHandle)hItem, 1);
+ Delay(6, &lDummy);
+ HiliteControl((ControlHandle)hItem, 0);
+ }
+#else
+ SendMessage(m_pcalc->m_hwnd, BM_SETSTATE, 1, 0L);
+ SendMessage(m_pcalc->m_hwnd, BM_SETSTATE, 0, 0L);
+#endif
+
+ // Update the calculator display
+
+ Display();
+
+ return TRUE;
+}
+
+/***
+*void CArith::Quit()
+*Purpose:
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDMETHODIMP_(void)
+CArith::Quit()
+{
+#ifndef _MAC
+ PostQuitMessage(0);
+#else
+ g_fQuit = TRUE;
+#endif
+}
+
+
+//---------------------------------------------------------------------
+// The CCalc Class Factory
+//---------------------------------------------------------------------
+
+
+IClassFactory FAR*
+CCalcCF::Create()
+{
+ return new FAR CCalcCF();
+}
+
+
+STDMETHODIMP
+CCalcCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)){
+ AddRef();
+ *ppv = this;
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(ULONG)
+CCalcCF::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(ULONG)
+CCalcCF::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+STDMETHODIMP
+CCalcCF::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv)
+{
+extern CCalc FAR* g_pcalc;
+
+ UNUSED(punkOuter);
+ return g_pcalc->QueryInterface(riid, ppv);
+}
+
+
+STDMETHODIMP
+#ifdef _MAC
+CCalcCF::LockServer(unsigned long fLock)
+#else
+CCalcCF::LockServer(BOOL fLock)
+#endif
+{
+ UNUSED(fLock);
+ return NOERROR;
+}
+
+#ifdef _MAC
+struct regentry{
+ char *szKey;
+ char *szValue;
+} g_rgregentry[] = {
+
+ { "CLSID\\{00020469-0000-0000-C000-000000000046}",
+ "OLE Automation DspCalc2 1.0 Application" }
+
+ , { "CLSID\\{00020469-0000-0000-C000-000000000046}\\LocalServer",
+ "DCL2" }
+
+ , { "CLSID\\{00020469-0000-0000-C000-000000000046}\\ProgID",
+ "Dspcalc2.Application" }
+
+ , { "CLSID\\{00020469-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "DCL2", "{00020469-0000-0000-C000-000000000046}" }
+
+ , { "Dspcalc2.Application\\CLSID",
+ "{00020469-0000-0000-C000-000000000046}" }
+
+};
+
+HRESULT
+EnsureRegistration()
+{
+ HKEY hkey;
+
+ if(RegOpenKey(HKEY_CLASSES_ROOT, "DCL2", &hkey) == NOERROR){
+ RegCloseKey(hkey);
+ return NOERROR;
+ }
+
+ for(int i = 0; i < DIM(g_rgregentry); ++i){
+ if(RegSetValue(HKEY_CLASSES_ROOT, g_rgregentry[i].szKey, REG_SZ, g_rgregentry[i].szValue, 0) != ERROR_SUCCESS)
+ return ResultFromScode(E_FAIL);
+ }
+
+ return NOERROR;
+}
+#endif //_MAC
+
+
+/***
+*HRESULT InitOle(void)
+*Purpose:
+* Initialize Ole, and register our class factories.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+HRESULT
+InitOle()
+{
+ HRESULT hresult;
+ IClassFactory FAR* pcf;
+
+
+ if((hresult = OleInitialize(NULL)) != NOERROR)
+ goto LError0;
+
+#ifdef _MAC
+ if((hresult = EnsureRegistration()) != NOERROR)
+ goto LError0;
+#endif
+
+ // create the single global instance of CCalc
+ if((g_pcalc = CCalc::Create()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ if((pcf = CCalcCF::Create()) == NULL)
+ goto LError1;
+
+ hresult = CoRegisterClassObject(
+ CLSID_CCalc2,
+ pcf,
+ CLSCTX_LOCAL_SERVER,
+ REGCLS_MULTIPLEUSE,
+ &g_dwCCalcCF);
+ if(hresult != NOERROR)
+ goto LError2;
+
+ hresult = RegisterActiveObject(
+ g_pcalc, CLSID_CCalc2, NULL, &g_dwRegisterCCalc);
+ if(hresult != NOERROR)
+ goto LError2;
+
+ pcf->Release();
+
+ return NOERROR;
+
+LError2:;
+ pcf->Release();
+
+LError1:;
+ UninitOle();
+
+LError0:;
+ return hresult;
+}
+
+
+HRESULT
+UninitOle()
+{
+ if(g_dwRegisterCCalc != 0)
+ RevokeActiveObject(g_dwRegisterCCalc, NULL);
+
+ if(g_dwCCalcCF != 0)
+ CoRevokeClassObject(g_dwCCalcCF);
+
+ // cause the remaining typeinfo to be released
+ if(g_pcalc != NULL)
+ g_pcalc->Release();
+
+ OleUninitialize();
+
+ return NOERROR;
+}
diff --git a/private/oleauto/sample/dspcalc2/dspcalc2.def b/private/oleauto/sample/dspcalc2/dspcalc2.def
new file mode 100644
index 000000000..a6d6cfacf
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/dspcalc2.def
@@ -0,0 +1,14 @@
+
+NAME DSPCALC2
+
+DESCRIPTION 'IDispatch Calculator w/ Type Library'
+
+EXETYPE WINDOWS
+
+STUB 'WINSTUB.EXE'
+
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MULTIPLE
+
+HEAPSIZE 4096
+STACKSIZE 8192
diff --git a/private/oleauto/sample/dspcalc2/dspcalc2.h b/private/oleauto/sample/dspcalc2/dspcalc2.h
new file mode 100644
index 000000000..7f51d25df
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/dspcalc2.h
@@ -0,0 +1,171 @@
+/***
+*dspcalc2.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "hostenv.h"
+#include "resource.h"
+#include "clsid.h"
+
+#ifndef CLASS
+# ifdef __TURBOC__
+# define CLASS class huge
+# else
+# define CLASS class FAR
+# endif
+#endif
+
+#pragma warning(disable:4355)
+
+#ifdef _MAC
+typedef void * LPVOID;
+typedef unsigned long ULONG;
+typedef int BOOL;
+typedef unsigned int UINT;
+typedef unsigned short WORD;
+typedef unsigned char BYTE;
+typedef unsigned long DWORD;
+typedef long LONG;
+#define FALSE 0
+#define TRUE 1
+#define NEAR
+#endif
+
+#ifdef _MAC
+# define UNUSED(X) ((void)(void*)&(X))
+#else
+# define UNUSED(X) (X)
+#endif
+
+
+/*
+ * The .h file included below is created via MkTypLib
+ */
+#include "calctype.h"
+
+#pragma warning(disable:4355)
+
+#define DIM(X) (sizeof(X)/sizeof(X[0]))
+
+
+// forward decl
+CLASS CCalc;
+
+
+// Introduced "calculator" interface
+//
+// This nested class implementes core arithmetic functionality
+// (such as it is) *and* is the interface that will be exposed via
+// IDispatch for external programmability.
+//
+CLASS CArith : public _ICalculator {
+ public:
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj);
+ STDMETHOD_(ULONG, AddRef)(THIS);
+ STDMETHOD_(ULONG, Release)(THIS);
+
+ /* ICalculator methods */
+ STDMETHOD_(void, put_Accum)(long l);
+ STDMETHOD_(long, get_Accum)(void);
+ STDMETHOD_(void, put_Opnd)(long l);
+ STDMETHOD_(long, get_Opnd)(void);
+ STDMETHOD_(void, put_Op)(OPERATORS op);
+ STDMETHOD_(OPERATORS, get_Op)(void);
+ STDMETHOD_(VARIANT_BOOL, Eval)(void);
+ STDMETHOD_(void, Clear)(void);
+ STDMETHOD_(void, Display)(void);
+ STDMETHOD_(void, Quit)(void);
+ STDMETHOD_(VARIANT_BOOL, Button)(SAFEARRAY FAR* psa);
+
+ // the following method is internal, and not exposed for programmability
+ BOOL ButtonPush(int button);
+
+ CArith(CCalc FAR* pcalc){
+ m_pcalc = pcalc;
+ Clear();
+ }
+
+ enum states { STATE_LOPND, STATE_OP, STATE_ROPND, STATE_EVAL };
+
+ private:
+ CCalc FAR* m_pcalc;
+ OPERATORS m_op;
+ long m_opnd;
+ long m_accum;
+ enum states m_state;
+};
+
+
+CLASS CCalc : public IUnknown {
+public:
+ friend CArith;
+
+ static CCalc FAR* Create();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ CCalc() : m_arith(this)
+ {
+ m_refs = 0;
+#ifdef _MAC
+ m_pdlg = nil;
+#else
+ m_hwnd = 0;
+#endif
+ m_punkStdDisp = NULL;
+ }
+
+#ifdef _MAC
+ DialogPtr m_pdlg;
+#else
+ HWND m_hwnd;
+#endif
+ CArith m_arith;
+
+private:
+ ULONG m_refs;
+ IUnknown FAR* m_punkStdDisp;
+};
+
+
+// the CCalc Class Factory
+//
+CLASS CCalcCF : public IClassFactory {
+public:
+ static IClassFactory FAR* Create();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ STDMETHOD(CreateInstance)(
+ IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
+#ifdef _MAC
+ STDMETHOD(LockServer)(unsigned long fLock);
+#else
+ STDMETHOD(LockServer)(BOOL fLock);
+#endif
+
+ CCalcCF() { m_refs = 1; }
+
+private:
+ ULONG m_refs;
+};
+
+extern HRESULT InitOle(void);
+extern HRESULT UninitOle(void);
+
+extern CCalc FAR* g_pcalc;
+
diff --git a/private/oleauto/sample/dspcalc2/dspcalc2.ico b/private/oleauto/sample/dspcalc2/dspcalc2.ico
new file mode 100644
index 000000000..2d9b808ee
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/dspcalc2.ico
Binary files differ
diff --git a/private/oleauto/sample/dspcalc2/dspcalc2.r b/private/oleauto/sample/dspcalc2/dspcalc2.r
new file mode 100644
index 000000000..4c98cff7a
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/dspcalc2.r
@@ -0,0 +1,312 @@
+/***
+*dspcalc2.r
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Resource script for dspcalc2.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "types.r"
+#include "resource.h"
+
+#if defined (_PPCMAC)
+include "cfrg.rsc";
+#endif
+
+/* we use an MBAR resource to conveniently load all the menus */
+
+resource 'MBAR' (rMenuBar, preload) {
+ { mApple, mFile, mEdit }
+};
+
+resource 'MENU' (mApple, preload) {
+ mApple,
+ textMenuProc,
+ 0b11111111111111111111111111111101,
+ enabled,
+ apple,
+ {
+ "About DspCalc2\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mFile, preload) {
+ mFile,
+ textMenuProc,
+ 0b00000000000000000000100000000000,
+ enabled,
+ "File",
+ {
+ "New",
+ noicon, "N", nomark, plain;
+ "Open",
+ noicon, "O", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Close",
+ noicon, "W", nomark, plain;
+ "Save",
+ noicon, "S", nomark, plain;
+ "Save As\311",
+ noicon, nokey, nomark, plain;
+ "Revert",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Page Setup\311",
+ noicon, nokey, nomark, plain;
+ "Print\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Quit",
+ noicon, "Q", nomark, plain
+ }
+};
+
+resource 'MENU' (mEdit, preload) {
+ mEdit,
+ textMenuProc,
+ 0b00000000000000000000000000000000,
+ enabled,
+ "Edit",
+ {
+ "Undo",
+ noicon, "Z", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Cut",
+ noicon, "X", nomark, plain;
+ "Copy",
+ noicon, "C", nomark, plain;
+ "Paste",
+ noicon, "V", nomark, plain;
+ "Clear",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'DLOG' (rCalc) {
+ {100, 100, 240, 220},
+ rDocProc,
+ visible,
+ noGoAway,
+ 0x0,
+ rCalc,
+ "DspCalc2"
+};
+
+resource 'DITL' (rCalc) {
+ {
+ {110,10,130,30}, Button { enabled, "0" } /* 1 */
+ , {85,10,105,30}, Button { enabled, "1" } /* 2 */
+ , {85,35,105,55}, Button { enabled, "2" } /* 3 */
+ , {85,60,105,80}, Button { enabled, "3" } /* 4 */
+ , {60,10,80,30}, Button { enabled, "4" } /* 5 */
+ , {60,35,80,55}, Button { enabled, "5" } /* 6 */
+ , {60,60,80,80}, Button { enabled, "6" } /* 7 */
+ , {35,10,55,30}, Button { enabled, "7" } /* 8 */
+ , {35,35,55,55}, Button { enabled, "8" } /* 9 */
+ , {35,60,55,80}, Button { enabled, "9" } /* 10 */
+
+ , {35,85,55,105}, Button { enabled, "+" } /* 11 */
+ , {60,85,80,105}, Button { enabled, "-" } /* 12 */
+ , {85,85,105,105}, Button { enabled, "*" } /* 13 */
+ , {110,85,130,105}, Button { enabled, "/" } /* 14 */
+
+ , {110,35,130,55}, Button { enabled, "C" } /* 15 */
+ , {110,60,130,80}, Button { enabled, "=" } /* 16 */
+
+ , {10,10,25,105}, EditText { disabled, "" } /* 17 */
+ }
+};
+
+/* this ALRT and DITL are used as an About screen */
+
+resource 'ALRT' (rAboutAlert, purgeable) {
+ {40, 20, 160, 290},
+ rAboutAlert,
+ {
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+resource 'DITL' (rAboutAlert, purgeable) {
+ { /* array DITLarray: 5 elements */
+ /* [1] */
+ {88, 180, 108, 260},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {8, 8, 24, 214},
+ StaticText {
+ disabled,
+ "The IDispatch Calculator"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an error screen */
+
+resource 'ALRT' (rUserAlert, purgeable) {
+ {40, 20, 120, 260},
+ rUserAlert,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+
+resource 'DITL' (rUserAlert, purgeable) {
+ {
+ /* [1] */
+ {50, 150, 70, 230},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 30, 230},
+ StaticText {
+ disabled,
+ "Error. ^0"
+ },
+ /* [3] */
+ {8, 8, 40, 40},
+ Icon {
+ disabled,
+ 2
+ }
+ }
+};
+
+
+resource 'SIZE' (-1) {
+ dontSaveScreen,
+ acceptSuspendResumeEvents,
+ enableOptionSwitch,
+ canBackground,
+ multiFinderAware,
+ backgroundAndForeground,
+ dontGetFrontClicks,
+ ignoreChildDiedEvents,
+ is32BitCompatible,
+ isHighLevelEventAware,
+ localAndRemoteHLEvents,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ kPrefSize * 1024,
+ kMinSize * 1024
+};
+
+resource 'BNDL' (130) {
+ 'DCL2',
+ 0,
+ { /* array TypeArray: 2 elements */
+ /* [1] */
+ 'FREF',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 130
+ },
+ /* [2] */
+ 'ICN#',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 130
+ }
+ }
+};
+
+resource 'FREF' (130) {
+ 'APPL',
+ 0,
+ ""
+};
+
+data 'ICN#' (130) {
+ $"1E3F FFFF 3340 0001 63C0 0001 03CF FFF9" /* .?ÿÿ3@..cÀ...Ïÿù */
+ $"0748 0009 0E48 0009 3C48 0009 704F FFF9" /* .H.Æ.H.Æ<H.ÆpOÿù */
+ $"7FC0 0001 0040 0001 004F FFF9 0048 8889" /* .À...@...Oÿù.Hˆ‰ */
+ $"0048 8889 0048 8889 004F FFF9 0040 0001" /* .Hˆ‰.Hˆ‰.Oÿù.@.. */
+ $"004F FFF9 0048 8889 0048 8889 004C 8889" /* .Oÿù.Hˆ‰.Hˆ‰.Lˆ‰ */
+ $"005F FFF9 0078 0001 01FF FFF9 00F8 8889" /* ._ÿù.x...ÿÿù.øˆ‰ */
+ $"0068 8889 0168 8889 064F FFF9 1E40 0001" /* .hˆ‰.hˆ‰.Oÿù.@.. */
+ $"7C40 0001 3C7F FFFF 183F FFFF 0800 0000" /* |@..<.ÿÿ.?ÿÿ.... */
+ $"1E3F FFFF 337F FFFF 63FF FFFF 03FF FFFF" /* .?ÿÿ3.ÿÿcÿÿÿ.ÿÿÿ */
+ $"077F FFFF 0E7F FFFF 3C7F FFFF 707F FFFF" /* ..ÿÿ..ÿÿ<.ÿÿp.ÿÿ */
+ $"7FFF FFFF 007F FFFF 007F FFFF 007F FFFF" /* .ÿÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"007F FFFF 007F FFFF 007F FFFF 007F FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"007F FFFF 007F FFFF 007F FFFF 007F FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"007F FFFF 007F FFFF 01FF FFFF 00FF FFFF" /* ..ÿÿ..ÿÿ.ÿÿÿ.ÿÿÿ */
+ $"007F FFFF 017F FFFF 067F FFFF 1E7F FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"7C7F FFFF 3C7F FFFF 183F FFFF 0800 0000" /* |.ÿÿ<.ÿÿ.?ÿÿ.... */
+};
+
+data 'icl4' (130) {
+ $"000F FFF0 00FF FFFF FFFF FFFF FFFF FFFF" /* ..ÿð.ÿÿÿÿÿÿÿÿÿÿÿ */
+ $"00FF 00FF 0F00 0000 0000 0000 0000 000F" /* .ÿ.ÿ............ */
+ $"0FF0 00FF FF0C CCCC CCCC CCCC CCCC CCDF" /* .ð.ÿÿ.ÌÌÌÌÌÌÌÌÌß */
+ $"0000 00FF FF0C DDDD DDDD DDDD DDDD DCDF" /* ...ÿÿ.ÝÝÝÝÝÝÝÝÜß */
+ $"0000 0FFF 0F0C DCCC CCCC CCCC CCCC 0CDF" /* ...ÿ..ÜÌÌÌÌÌÌÌ.ß */
+ $"0000 FFF0 0F0C DCCC CCCC CCCC CCCC 0CDF" /* ..ÿð..ÜÌÌÌÌÌÌÌ.ß */
+ $"00FF FF00 0F0C DCCC CCCC CCCC CCCC 0CDF" /* .ÿÿ...ÜÌÌÌÌÌÌÌ.ß */
+ $"0FFF 0000 0F0C 0000 0000 0000 0000 0CDF" /* .ÿ.............ß */
+ $"0FFF FFFF FF0C CCCC CCCC CCCC CCCC CCDF" /* .ÿÿÿÿ.ÌÌÌÌÌÌÌÌÌß */
+ $"0000 0000 0F0C CCCC CCCC CCCC CCCC CCDF" /* ......ÌÌÌÌÌÌÌÌÌß */
+ $"0000 0000 0F0C DDDD DDDD DDDD DDDD DCDF" /* ......ÝÝÝÝÝÝÝÝÜß */
+ $"0000 0000 0F0C F00C F00C F00C F00C FCDF" /* ......ð.ð.ð.ð.üß */
+ $"0000 0000 0F0C F0CD F0CD F0CD F0CD FCDF" /* ......ðÍðÍðÍðÍüß */
+ $"0000 0000 0F0C FCDD FCDD FCDD FCDD FCDF" /* ......üÝüÝüÝüÝüß */
+ $"0000 0000 0F0C FFFF FFFF FFFF FFFF FCDF" /* ......ÿÿÿÿÿÿÿÿüß */
+ $"0000 0000 0F0C CCCC CCCC CCCC CCCC CCDF" /* ......ÌÌÌÌÌÌÌÌÌß */
+ $"0000 0000 0F0C DDDD DDDD DDDD DDDD DCDF" /* ......ÝÝÝÝÝÝÝÝÜß */
+ $"0000 0000 0F0C F00C F00C F00C F00C FCDF" /* ......ð.ð.ð.ð.üß */
+ $"0000 0000 0F0C F0CD F0CD F0CD F0CD FCDF" /* ......ðÍðÍðÍðÍüß */
+ $"0000 0000 0F0C F3DD FCDD FCDD FCDD FCDF" /* ......óÝüÝüÝüÝüß */
+ $"0000 0000 0F03 3FFF FFFF FFFF FFFF FCDF" /* ......?ÿÿÿÿÿÿÿüß */
+ $"0000 0000 033F 3CCC CCCC CCCC CCCC CCDF" /* .....?<ÌÌÌÌÌÌÌÌß */
+ $"0000 0003 33F3 DDDD DDDD DDDD DDDD DCDF" /* ....3óÝÝÝÝÝÝÝÝÜß */
+ $"0000 0000 3F33 F00C F00C F00C F00C FCDF" /* ....?3ð.ð.ð.ð.üß */
+ $"0000 0000 033C F0CD F0CD F0CD F0CD FCDF" /* .....<ðÍðÍðÍðÍüß */
+ $"0000 0003 0F3C FCDD FCDD FCDD FCDD FCDF" /* .....<üÝüÝüÝüÝüß */
+ $"0000 0330 0F0C FFFF FFFF FFFF FFFF FCDF" /* ...0..ÿÿÿÿÿÿÿÿüß */
+ $"0003 3F30 0F0C CCCC CCCC CCCC CCCC CCDF" /* ..?0..ÌÌÌÌÌÌÌÌÌß */
+ $"0333 F300 0F0D DDDD DDDD DDDD DDDD DDDF" /* .3ó..ÂÝÝÝÝÝÝÝÝÝß */
+ $"003F 3300 0FFF FFFF FFFF FFFF FFFF FFFF" /* .?3..ÿÿÿÿÿÿÿÿÿÿÿ */
+ $"0003 3000 00FF FFFF FFFF FFFF FFFF FFFF" /* ..0..ÿÿÿÿÿÿÿÿÿÿÿ */
+ $"0000 3000 0000 0000 0000 0000 0000 0000" /* ..0............. */
+};
+
+data 'DCL2' (0, "Owner resource") {
+ $"00" /* . */
+};
+
diff --git a/private/oleauto/sample/dspcalc2/dspcalc2.r32 b/private/oleauto/sample/dspcalc2/dspcalc2.r32
new file mode 100644
index 000000000..d40ca4ab1
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/dspcalc2.r32
@@ -0,0 +1,25 @@
+REGEDIT
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DspCalc2.Application (defaults to DspCalc2.Application.1
+
+HKEY_CLASSES_ROOT\Dspcalc2.Application = OLE Automation Dspcalc2 Application
+HKEY_CLASSES_ROOT\Dspcalc2.Application\Clsid = {00020469-0000-0000-C000-000000000046}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DspCalc2.Application.1
+
+HKEY_CLASSES_ROOT\Dspcalc2.Application.1 = OLE Automation Dspcalc2 1.0 Application
+HKEY_CLASSES_ROOT\Dspcalc2.Application.1\Clsid = {00020469-0000-0000-C000-000000000046}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DspCalc2 1.0
+
+HKEY_CLASSES_ROOT\CLSID\{00020469-0000-0000-C000-000000000046} = OLE Automation Dspcalc2 1.0 Application
+HKEY_CLASSES_ROOT\CLSID\{00020469-0000-0000-C000-000000000046}\ProgID = Dspcalc2.Application.1
+HKEY_CLASSES_ROOT\CLSID\{00020469-0000-0000-C000-000000000046}\VersionIndependentProgID = Dspcalc2.Application
+HKEY_CLASSES_ROOT\CLSID\{00020469-0000-0000-C000-000000000046}\LocalServer32 = dspcalc2.exe /Automation
+
diff --git a/private/oleauto/sample/dspcalc2/dspcalc2.rc b/private/oleauto/sample/dspcalc2/dspcalc2.rc
new file mode 100644
index 000000000..805b30be1
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/dspcalc2.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+#include "resource.h"
+
+DspCalc2 ICON dspcalc2.ico
+
+DspCalc2 DIALOG DISCARDABLE 0, 0, 92, 114
+STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
+CLASS "DspCalc2"
+#ifdef WIN32
+CAPTION "DspCalc2 (32-bit)"
+#else //WIN32
+CAPTION "DspCalc2"
+#endif //WIN32
+BEGIN
+ PUSHBUTTON "0", IDC_ZERO, 9, 90, 14, 15
+ PUSHBUTTON "1", IDC_ONE, 9, 70, 15, 16
+ PUSHBUTTON "2", IDC_TWO, 29, 70, 16, 15
+ PUSHBUTTON "3", IDC_THREE, 49, 70, 15, 15
+ PUSHBUTTON "4", IDC_FOUR, 9, 50, 15, 14
+ PUSHBUTTON "5", IDC_FIVE, 29, 50, 15, 15
+ PUSHBUTTON "6", IDC_SIX, 49, 50, 15, 15
+ PUSHBUTTON "7", IDC_SEVEN, 9, 30, 15, 15
+ PUSHBUTTON "8", IDC_EIGHT, 29, 30, 15, 15
+ PUSHBUTTON "9", IDC_NINE, 49, 30, 15, 15
+ PUSHBUTTON "=", IDC_EQUALS, 49, 90, 14, 15
+ PUSHBUTTON "+", IDC_PLUS, 69, 30, 15, 15
+ PUSHBUTTON "-", IDC_MINUS, 69, 50, 14, 15
+ PUSHBUTTON "*", IDC_MULT, 69, 70, 15, 15
+ PUSHBUTTON "/", IDC_DIV, 69, 90, 15, 15
+ PUSHBUTTON "C", IDC_CLEAR, 29, 90, 16, 15
+ EDITTEXT IDC_DISPLAY, 9, 6, 76, 15, ES_MULTILINE | ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY
+END
diff --git a/private/oleauto/sample/dspcalc2/dspcalc2.reg b/private/oleauto/sample/dspcalc2/dspcalc2.reg
new file mode 100644
index 000000000..179e52b62
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/dspcalc2.reg
@@ -0,0 +1,26 @@
+REGEDIT
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DspCalc2.Application (defaults to DspCalc2.Application.1
+
+HKEY_CLASSES_ROOT\Dspcalc2.Application = OLE Automation Dspcalc2 Application
+HKEY_CLASSES_ROOT\Dspcalc2.Application\Clsid = {00020469-0000-0000-C000-000000000046}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DspCalc2.Application.1
+
+HKEY_CLASSES_ROOT\Dspcalc2.Application.1 = OLE Automation Dspcalc2 1.0 Application
+HKEY_CLASSES_ROOT\Dspcalc2.Application.1\Clsid = {00020469-0000-0000-C000-000000000046}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info DspCalc2 1.0
+
+HKEY_CLASSES_ROOT\CLSID\{00020469-0000-0000-C000-000000000046} = OLE Automation Dspcalc2 1.0 Application
+HKEY_CLASSES_ROOT\CLSID\{00020469-0000-0000-C000-000000000046}\ProgID = Dspcalc2.Application.1
+HKEY_CLASSES_ROOT\CLSID\{00020469-0000-0000-C000-000000000046}\VersionIndependentProgID = Dspcalc2.Application
+HKEY_CLASSES_ROOT\CLSID\{00020469-0000-0000-C000-000000000046}\LocalServer = dspcalc2.exe /Automation
+
+
diff --git a/private/oleauto/sample/dspcalc2/hostenv.h b/private/oleauto/sample/dspcalc2/hostenv.h
new file mode 100644
index 000000000..56a311393
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/hostenv.h
@@ -0,0 +1,117 @@
+/***
+*hostenv.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Generic host specific includes.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(_MAC)
+
+#if defined(_PPCMAC)
+#pragma data_seg("_FAR_DATA")
+#pragma data_seg( )
+#define MAXLONG 0x7fffffff
+#define EventHandlerProcPtr AEEventHandlerUPP
+#else //_PPCMAC
+#define GetMenuItemText(mApple,menuItem,daName) GetItem(mApple,menuItem,daName)
+#endif //_PPCMAC
+
+#endif //_MAC
+
+#if defined(_MAC)
+
+#if defined(_MSC_VER)
+
+# include <values.h>
+# include <types.h>
+# include <string.h>
+# include <quickdra.h>
+# include <fonts.h>
+# include <events.h>
+# include <resource.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutil.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEve.h>
+
+#else //_MSC_VER
+
+# include <values.h>
+# include <types.h>
+# include <strings.h>
+# include <quickdraw.h>
+# include <fonts.h>
+# include <events.h>
+# include <resources.h>
+# include <windows.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutils.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEvents.h>
+
+#endif //_MSC_VER
+
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+
+#elif defined(WIN32)
+
+# include <windows.h>
+
+# if defined(UNICODE)
+ #define TCHAR WCHAR
+ #define TSTR(str) L##str
+ #define STRING(str) (str)
+ #define WIDESTRING(str) (str)
+# else
+ #define TCHAR char
+ #define TSTR(str) str
+ #define STRING(str) AnsiString(str)
+ #define WIDESTRING(str) WideString(str)
+ extern "C" char FAR* AnsiString(OLECHAR FAR* strIn);
+ extern "C" OLECHAR FAR* WideString(char FAR* strIn);
+# endif
+
+
+#else /* WIN16 */
+
+# include <windows.h>
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+#endif
+
diff --git a/private/oleauto/sample/dspcalc2/macmain.cpp b/private/oleauto/sample/dspcalc2/macmain.cpp
new file mode 100644
index 000000000..d95f4c60f
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/macmain.cpp
@@ -0,0 +1,305 @@
+/***
+*macmain.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module is the main entry point for the sample IDispatch calculator
+* server, dspcalc2.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dspcalc2.h"
+
+#include <stdio.h>
+
+extern "C" {
+
+Boolean g_fInitOle = false;
+#ifndef _PPCMAC
+Boolean g_fInitLibraryManager = false;
+#endif //_PPCMAC
+}
+
+Boolean g_fQuit = false;
+
+
+void Init(void);
+void EventLoop(void);
+
+void AdjustMenus(void);
+void DoEvent(EventRecord *pevent);
+void DoMenuCommand(long menuResult);
+void Quit(void);
+#ifndef _MSC_VER
+#ifndef ConstStr255Param
+#define ConstStr255Param StringPtr
+#endif
+#endif
+void Fatal(ConstStr255Param);
+
+Boolean
+IsAppWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : ((WindowPeek)window)->windowKind == userKind;
+}
+
+Boolean
+IsDAWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind < 0);
+}
+
+void
+main()
+{
+ Init();
+ EventLoop();
+}
+
+void
+EventLoop()
+{
+ short sItem;
+ DialogPtr pdlg;
+ EventRecord event;
+ RgnHandle cursorRgn;
+
+ cursorRgn = NewRgn();
+ while(1){
+ if(WaitNextEvent(everyEvent, &event, MAXLONG, cursorRgn)){
+ if(FrontWindow() != nil
+ && event.what != diskEvt
+ && (event.what != keyDown || (event.modifiers & cmdKey) == 0)
+ && IsDialogEvent(&event))
+ {
+ if(DialogSelect(&event, &pdlg, &sItem)){
+ // REVIEW: replace following with an assertion
+ if(pdlg != g_pcalc->m_pdlg)
+ Debugger();
+ g_pcalc->m_arith.ButtonPush(sItem);
+ }
+ }else{
+ DoEvent(&event);
+ }
+ }
+ if (g_fQuit)
+ Quit();
+ }
+}
+
+void
+DoEvent(EventRecord *pevent)
+{
+ char key;
+ short part;
+ WindowPtr window;
+
+ switch(pevent->what){
+ case mouseDown:
+ part = FindWindow(pevent->where, &window);
+ switch(part){
+ case inMenuBar:
+ AdjustMenus();
+ DoMenuCommand(MenuSelect(pevent->where));
+ break;
+
+ case inSysWindow: /* let the system handle the mouseDown */
+ SystemClick(pevent, window);
+ break;
+
+ case inContent:
+ if(window != FrontWindow()){
+ SelectWindow(window);
+ }
+ break;
+
+ case inDrag:
+ DragWindow(window, pevent->where, &qd.screenBits.bounds);
+ break;
+ }
+ break;
+
+ case keyDown:
+ case autoKey: /* check for menukey equivalents */
+ key = (char)(pevent->message & charCodeMask);
+ if(pevent->modifiers & cmdKey){ /* Command key down */
+ if(pevent->what == keyDown){
+ /* enable/disable/check menu items properly */
+ AdjustMenus();
+ DoMenuCommand(MenuKey(key));
+ }
+ }
+ break;
+
+ case kHighLevelEvent:
+ AEProcessAppleEvent(pevent);
+ break;
+ }
+}
+
+void
+Enable(MenuHandle hmenu, short sItem, Boolean fEnable)
+{
+ if(fEnable)
+ EnableItem(hmenu, sItem);
+ else
+ DisableItem(hmenu, sItem);
+}
+
+void
+AdjustMenus()
+{
+ Boolean fIsDA;
+ MenuHandle hmenu;
+
+ fIsDA = IsDAWindow(FrontWindow());
+
+ /* we can allow desk accessories to be closed from the menu */
+ hmenu = GetMHandle(mFile);
+ Enable(hmenu, iClose, fIsDA);
+
+ hmenu = GetMHandle(mEdit);
+ Enable(hmenu, iUndo, fIsDA);
+ Enable(hmenu, iCut, fIsDA);
+ Enable(hmenu, iCopy, fIsDA);
+ Enable(hmenu, iPaste, fIsDA);
+ Enable(hmenu, iClear, fIsDA);
+}
+
+void
+DoMenuCommand(long menuResult)
+{
+ short menuID; /* the resource ID of the selected menu */
+ short menuItem; /* the item number of the selected menu */
+ Str255 daName;
+
+ menuID = HiWord(menuResult);
+ menuItem = LoWord(menuResult);
+
+ switch(menuID){
+ case mApple:
+ switch(menuItem){
+ case iAbout: /* bring up alert for About */
+ Alert(rAboutAlert, nil);
+ break;
+ default:
+ GetMenuItemText(GetMHandle(mApple), menuItem, daName);
+ OpenDeskAcc(daName);
+ break;
+ }
+ break;
+
+ case mFile:
+ switch(menuItem){
+ case iQuit:
+ Quit();
+ break;
+ }
+ break;
+
+ case mEdit:
+ SystemEdit(menuItem-1);
+ break;
+ }
+
+ HiliteMenu(0);
+}
+
+#if defined(_MSC_VER)
+OSErr pascal
+#else
+pascal OSErr
+#endif
+RemoteLowLevelEvt(AppleEvent theAppEvt, AppleEvent reply, long HandlerRefCon)
+{
+ long cb;
+ OSErr err;
+ DescType descType;
+ EventRecord event;
+
+ UNUSED(reply);
+ UNUSED(HandlerRefCon);
+
+ err = AEGetKeyPtr(
+ &theAppEvt,
+ keyDirectObject,
+ typeWildCard,
+ &descType,
+ (Ptr)&event, sizeof(event), &cb);
+
+ if(err != noErr)
+ return err;
+
+ DoEvent(&event);
+
+ return noErr;
+}
+
+void
+Init()
+{
+ Handle menuBar;
+
+ MaxApplZone();
+
+ InitGraf((Ptr)&qd.thePort);
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ TEInit();
+ InitDialogs(nil);
+ InitCursor();
+ FlushEvents(everyEvent, 0);
+#ifndef _PPCMAC
+ if (InitOleManager(0) != NOERROR)
+ Fatal((ConstStr255Param)"\pCould not initialize OLE Applet");
+
+ g_fInitLibraryManager = true;
+#endif //_PPCMAC
+
+ if(InitOle() != NOERROR)
+ Fatal((ConstStr255Param)"\pUnable to Initialize Ole");
+ g_fInitOle = true;
+
+ if(AEInstallEventHandler('OLE2', 'EVNT', (EventHandlerProcPtr)RemoteLowLevelEvt, 0, false) != noErr)
+ Fatal((ConstStr255Param)"\pUnable to install handler");
+
+ if((g_pcalc->m_pdlg = GetNewDialog(rCalc, nil, (WindowPtr)-1)) == nil)
+ Fatal((ConstStr255Param)"\pUnable to create dialog");
+
+ if((menuBar = GetNewMBar(rMenuBar)) == nil)
+ Fatal((ConstStr255Param)"\pUnable to load menu bar");
+
+ SetMenuBar(menuBar);
+ DisposHandle(menuBar);
+ AddResMenu(GetMHandle(mApple), 'DRVR'); /* add DA names to Apple menu */
+ DrawMenuBar();
+}
+
+void
+Quit()
+{
+ if(g_fInitOle)
+ UninitOle();
+#ifndef _PPCMAC
+ if(g_fInitLibraryManager)
+ UninitOleManager(); // clean up applet
+#endif //_PPCMAC
+ ExitToShell();
+}
+
+/* display fatal error alert, and exit */
+void
+Fatal(ConstStr255Param msg)
+{
+ SetCursor(&qd.arrow);
+ ParamText(msg, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
+ Alert(rUserAlert, nil);
+ Quit();
+}
+
diff --git a/private/oleauto/sample/dspcalc2/main.cpp b/private/oleauto/sample/dspcalc2/main.cpp
new file mode 100644
index 000000000..b7039a973
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/main.cpp
@@ -0,0 +1,161 @@
+/***
+*main.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module is the main entry point of the sample IDispatch
+* calculator, dspcalc2.exe.
+*
+* This program is intended to demonstrate an implementation of
+* the IDispatch interface.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "dspcalc2.h"
+
+TCHAR g_szAppName[] = TSTR("DspCalc2");
+
+BOOL InitApplication(HINSTANCE);
+BOOL InitInstance(HINSTANCE, int);
+
+
+extern "C" {
+long FAR PASCAL WndProc(HWND, UINT, WPARAM, LPARAM);
+int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+}
+
+
+extern "C" int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+
+ if(!hPrevInstance)
+ if(!InitApplication(hinst))
+ return FALSE;
+
+ if(InitOle() != NOERROR)
+ return FALSE;
+
+ if(!InitInstance(hinst, nCmdShow)){
+ UninitOle();
+ return FALSE;
+ }
+
+ while(GetMessage(&msg, NULL, NULL, NULL)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ UninitOle();
+
+ return msg.wParam;
+}
+
+
+BOOL
+InitApplication(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = WndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = DLGWINDOWEXTRA;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(hinst, g_szAppName);
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = g_szAppName;
+
+ if(!RegisterClass(&wc))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+BOOL
+InitInstance(HINSTANCE hinst, int nCmdShow)
+{
+ g_pcalc->m_hwnd = CreateDialog(hinst, g_szAppName, 0, NULL);
+
+ ShowWindow(g_pcalc->m_hwnd, nCmdShow);
+
+ g_pcalc->m_arith.Display();
+
+ return TRUE;
+}
+
+
+extern "C" long FAR PASCAL
+WndProc(
+ HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch(message){
+ case WM_COMMAND:
+ switch(wParam){
+ case IDC_ZERO:
+ case IDC_ONE:
+ case IDC_TWO:
+ case IDC_THREE:
+ case IDC_FOUR:
+ case IDC_FIVE:
+ case IDC_SIX:
+ case IDC_SEVEN:
+ case IDC_EIGHT:
+ case IDC_NINE:
+ case IDC_PLUS:
+ case IDC_MINUS:
+ case IDC_MULT:
+ case IDC_DIV:
+ case IDC_CLEAR:
+ case IDC_EQUALS:
+ g_pcalc->m_arith.ButtonPush(wParam);
+ return 0;
+ }
+ break;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefWindowProc(hwnd, message, wParam, lParam);
+}
+
+
+#if defined(WIN32)
+
+extern "C" char FAR*
+ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size)
+{
+ int badConversion = FALSE;
+
+ WideCharToMultiByte(CP_ACP, NULL,
+ strIn, -1,
+ buf, size,
+ NULL, &badConversion);
+ return buf;
+}
+
+extern "C" char FAR*
+AnsiString(OLECHAR FAR* strIn)
+{
+ static char buf[256];
+
+ return (ConvertStrWtoA(strIn, buf, 256));
+}
+
+#endif
diff --git a/private/oleauto/sample/dspcalc2/makefile b/private/oleauto/sample/dspcalc2/makefile
new file mode 100644
index 000000000..779fbe522
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/makefile
@@ -0,0 +1,371 @@
+####
+#makefile - makefile for dspcalc2.exe
+#
+# Copyright (C) 1992-1994, Microsoft Corporation
+#
+#Purpose:
+# Builds the OLE 2.0 sample IDispatch server, dspcalc2.exe.
+#
+#
+# Usage: NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option:
+# dev = [win16 | win32 | mac] ; dev=win16 is the default
+# CPU = [i386 | M68K | MIPS | ALPHA | PPC]
+# DEBUG=[0|1] ; DEBUG=1 is the default
+# HOST=[DOS | NT] ; HOST=DOS (for win16)
+# ; HOST=NT (for win32)
+#
+#Notes:
+# This makefile assumes that the PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+##############################################################################
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if "$(dev)" == ""
+dev = win16
+!endif
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32" || "$(dev)" == "mac")
+!error Invalid dev option, choose from [win16 | win32 | mac]
+!endif
+
+!if "$(dev)" == "win16"
+TARGET = WIN16
+!if "$(HOST)" == ""
+HOST = DOS
+!endif
+!endif
+
+!if "$(dev)" == "win32"
+TARGET = WIN32
+!endif
+
+!if "$(dev)" == "mac"
+TARGET = MAC
+!endif
+
+!if "$(DEBUG)" == ""
+DEBUG = 1
+!endif
+
+!if "$(CPU)"=="PPC"
+TYPLIBTARGET=PPC
+!else
+TYPLIBTARGET=$(TARGET)
+!endif
+
+
+##########################################################################
+#
+# WIN16 Settings
+#
+!if "$(TARGET)" == "WIN16"
+
+CC = cl
+LINK = link
+
+!if "$(HOST)" == "DOS"
+WX = wx /w
+!else
+WX =
+!endif
+
+RCFLAGS = -dWIN16
+CFLAGS = -W3 -AM -GA -GEs -DWIN16 -I$(OBJDIR)
+LINKFLAGS = /NOD /NOI /BATCH /ONERROR:NOEXE
+
+LIBS = libw.lib mlibcew.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) /COD
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+LINKFLAGS = $(LINKFLAGS) /FAR /PACKC
+!endif
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARGET)" == "WIN32"
+
+!if "$(CPU)"==""
+!if "$(PROCESSOR_ARCHITECTURE)"=="" || "$(PROCESSOR_ARCHITECTURE)"=="x86"
+CPU=i386
+!else
+CPU=$(PROCESSOR_ARCHITECTURE)
+!endif
+
+!endif #CPU
+
+!if "$(CPU)" == "i386"
+CC = cl386
+LINK = link
+CFLAGS = -D_X86_=1
+!endif
+!if "$(CPU)" == "MIPS"
+CC = cl
+LINK = link
+CFLAGS = -D_MIPS_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "ALPHA"
+CC = claxp
+LINK = link
+CFLAGS = -D_ALPHA_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "PPC"
+CC = cl
+LINK = link
+CFLAGS = -D_PPC_=1 -DUNICODE
+TYPLIBTARGET=PPC32
+!endif
+
+WX =
+RCFLAGS = -dWIN32
+CFLAGS = $(CFLAGS) -nologo -W3 -DWIN32 -DINC_OLE2 -D_MT $(CL) -I$(OBJDIR)
+LINKFLAGS = -Incremental:NO -Pdb:NONE -subsystem:windows -entry:WinMainCRTStartup -machine:$(CPU)
+
+LIBS = libc.lib kernel32.lib user32.lib
+
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Z7 -D_DEBUG $(CL)
+LINKFLAGS = -debug:full -debugtype:cv,coff $(LINKFLAGS)
+!else
+CFLAGS = $(CFLAGS) -Ox
+!endif
+!endif
+
+
+##########################################################################
+#
+# MAC Settings
+#
+!if "$(TARGET)" == "MAC"
+
+CC = cl
+LINK = link
+
+WX =
+RCFLAGS = -d_MAC
+!if "$(CPU)"=="PPC"
+CFLAGS = -W3 -D_MAC -D_PPCMAC -D_pascal= -D__pascal= -I$(OBJDIR)
+LIBS = interfac.lib libc.lib ole2.lib ole2auto.lib
+LINKFLAGS = -machine:mppc -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+!else
+LIBS = interfac.lib llibcs.lib lsanes.lib swap.lib
+CFLAGS = -W3 -AL -D_MAC -I$(OBJDIR)
+LINKFLAGS = -machine:$(CPU) -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+!endif
+
+!if "$(DEBUG)" == "1"
+!if "$(CPU)"=="PPC"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+!else
+CFLAGS = $(CFLAGS) -Od -Zi -Q68m -D_DEBUG $(CL)
+!endif
+LINKFLAGS = $(LINKFLAGS) -debug:full -debugtype:cv
+
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+!endif
+
+MRC = mrc
+!if "$(CPU)"=="PPC"
+MRCOPT = -D_PPCMAC -s$(VBATOOLS)\win32\ppc\lib
+!else
+MRCOPT =
+!endif
+
+MAKEPEF = makepef
+!endif
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+APPS = dspcalc2
+
+SRCDIR = $(OLEPROG)\SAMPLE\$(APPS)
+
+!if "$(TARGET)" == "MAC" && "$(CPU)"=="PPC"
+OBJDIR=$(SRCDIR)\macppc
+!else
+OBJDIR=$(SRCDIR)\$(TARGET)
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+
+!if "$(TARGET)" == "WIN16"
+LIBS = ole2.lib compobj.lib ole2disp.lib typelib.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "WIN32"
+LIBS = ole32.lib oleaut32.lib uuid.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "MAC"
+!if "$(CPU)"!="PPC"
+LIBS = olenrf.obj oanrf.obj $(LIBS)
+!endif
+!endif
+
+OBJS = \
+!if "$(TARGET)" == "MAC"
+ $(OBJDIR)\macmain.obj \
+!else
+ $(OBJDIR)\main.obj \
+!endif
+ $(OBJDIR)\dspcalc2.obj \
+ $(OBJDIR)\clsid.obj
+
+
+##########################################################################
+#
+# Build rules
+#
+
+{$(SRCDIR)}.cpp{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+{$(SRCDIR)}.c{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+goal : setflags $(OBJDIR)\$(APPS).exe
+
+setflags :
+ set CL=$(CFLAGS)
+
+
+##########################################################################
+#
+# Clean (erase) generated files
+#
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\$(APPS).exe del $(OBJDIR)\$(APPS).exe
+ if exist $(OBJDIR)\$(APPS).tlb del $(OBJDIR)\$(APPS).tlb
+ if exist $(OBJDIR)\$(APPS).map del $(OBJDIR)\$(APPS).map
+ if exist $(OBJDIR)\$(APPS).res del $(OBJDIR)\$(APPS).res
+ if exist $(OBJDIR)\$(APPS).rs del $(OBJDIR)\$(APPS).rs
+ if exist $(OBJDIR)\calctype.h del $(OBJDIR)\calctype.h
+ if exist $(OBJDIR)\*.log del $(OBJDIR)\*.log
+ if exist $(SRCDIR)\*.pdb del $(SRCDIR)\*.pdb
+
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARGET)" == "WIN16"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ link $(LINKFLAGS) @<<
+$(OBJS),
+$@,$(OBJDIR)\$(APPS).map/map,
+$(LIBS),
+$(SRCDIR)\$(APPS).def
+<<
+ rc -k -t $(OBJDIR)\$(APPS).res $@
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARGET)" == "WIN32"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ cvtres -r -$(CPU) $(OBJDIR)\$(APPS).res -o $(OBJDIR)\$(APPS).rs
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(OBJDIR)\$(APPS).rs
+ $(LIBS)
+<<
+!endif
+
+
+##########################################################################
+#
+# Application Build (MAC Specific)
+#
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(OBJDIR)\$(APPS).x
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(LIBS)
+<<
+ copy $(OBJDIR)\$(APPS).x $(OBJDIR)\$(APPS)
+!if "$(CPU)"=="PPC"
+ $(MAKEPEF) $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).pef
+!else
+ cvpack $(OBJDIR)\$(APPS).exe
+ $(MRC) $(MRCOPT) -e $(OBJDIR)\$(APPS).exe -a -o $(OBJDIR)\$(APPS)
+!endif
+
+$(OBJDIR)\$(APPS).x: $(SRCDIR)\$(APPS).r
+ $(MRC) $(MRCOPT) -D_MAC -o $(OBJDIR)\$(APPS).x $(SRCDIR)\$(APPS).r
+!endif
+
+
+##########################################################################
+#
+# Application Build (Common)
+#
+
+$(OBJDIR)\$(APPS).res : $(SRCDIR)\$(APPS).rc
+ rc $(RCFLAGS) -r -fo$@ $?
+
+
+##########################################################################
+#
+# Dependencies
+#
+
+$(OBJDIR)\calctype.h : $(SRCDIR)\calctype.odl
+ if exist $(OBJDIR)\calctype.h del $(OBJDIR)\calctype.h
+ if exist $(OBJDIR)\dspcalc2.tlb del $(OBJDIR)\dspcalc2.tlb
+ $(CC) -E -D$(TARGET) $(SRCDIR)\calctype.odl >$(OBJDIR)\calctype.tmp
+ $(WX) mktyplib /$(TYPLIBTARGET) /nocpp /h $(OBJDIR)\calctype.h /o $(OBJDIR)\calctype.log /tlb $(OBJDIR)\dspcalc2.tlb $(OBJDIR)\calctype.tmp
+
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\macmain.obj : $(SRCDIR)\macmain.cpp $(SRCDIR)\dspcalc2.h $(OBJDIR)\calctype.h
+ $(CC) -c -Fo$@ $(SRCDIR)\macmain.cpp
+!else
+$(OBJDIR)\main.obj : $(SRCDIR)\main.cpp $(SRCDIR)\dspcalc2.h $(OBJDIR)\calctype.h
+ $(CC) -c -Fo$@ $(SRCDIR)\main.cpp
+!endif
+
+$(OBJDIR)\dspcalc2.obj : $(SRCDIR)\dspcalc2.cpp $(SRCDIR)\dspcalc2.h $(OBJDIR)\calctype.h
+ $(CC) -c -Fo$@ $(SRCDIR)\dspcalc2.cpp
+
+$(OBJDIR)\clsid.obj : $(SRCDIR)\clsid.c $(SRCDIR)\clsid.h
+ $(CC) -c -Fo$@ $(SRCDIR)\clsid.c
diff --git a/private/oleauto/sample/dspcalc2/mk.bat b/private/oleauto/sample/dspcalc2/mk.bat
new file mode 100644
index 000000000..30e7580d3
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/mk.bat
@@ -0,0 +1,22 @@
+REM setup the environment for the dispcalc makefile
+
+set OLDLIB=%LIB%
+set OLDPATH=%PATH%
+set OLDINC=%INCLUDE%
+
+set PATH=%TOOLS%\HDOS\BIN;%TOOLS%\HDOS\C800\BIN
+set LIB=%TOOLS%\HDOS\C800\LIB;%OLEPROG%\build\dispatch\DWIN16;%OLEPROG%\build\ole2nls\dwin16;%OLEPROG%\OLE\WIN16\D
+set INCLUDE=%TOOLS%\HDOS\C800\INCLUDE;%OLEPROG%\OLE\WIN16;%OLEPROG%\SRC\DISPATCH
+
+copy %OLEPROG%\OB\DWIN16\typelib.lib %OLEPROG%\sample\dspcalc2
+
+REM c:\binr\tee nmake %1 %2 %3 %4 %5 > status
+nmake %1 %2 %3 %4 %5
+
+set LIB=%OLDLIB%
+set PATH=%OLDPATH%
+set INCLUDE=%OLDINC%
+
+set OLDPATH=
+set OLDINC=
+set OLDLIB=
diff --git a/private/oleauto/sample/dspcalc2/mk.cmd b/private/oleauto/sample/dspcalc2/mk.cmd
new file mode 100644
index 000000000..b49700b53
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/mk.cmd
@@ -0,0 +1,13 @@
+REM The dispcalc.exe makefile assumes that PATH, LIB, and include are setup.
+
+@setlocal
+
+REM we get rc.exe and winstub.exe from \tools\win
+
+set PATH=%TOOLS%\HOS2\BIN;%TOOLS%\HOS2\C700\BIN
+set INCLUDE=%TOOLS%\HOS2\C700\INCLUDE;%OLEPROG%\ole\dwin16;%OLEPROG%\src\dispatch
+set LIB=%TOOLS%\HOS2\C700\LIB;%OLEPROG%\ole\dwin16;%OLEPROG%\build\dwin16
+
+nmake %1 %2 %3 %4 %5
+
+@endlocal
diff --git a/private/oleauto/sample/dspcalc2/readme.txt b/private/oleauto/sample/dspcalc2/readme.txt
new file mode 100644
index 000000000..b3bb25733
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/readme.txt
@@ -0,0 +1,101 @@
+---------------------------------------
+OLE Automation Sample Program: Dispcalc
+---------------------------------------
+
+DspCalc2 is a simple accumulator-based calculator. Its
+user interface consists of buttons for the numbers (0-9),
+the operators (+, -, *, /), and some other necessary
+buttons (C for Clear, = for evaluation). Its programmability
+interface consists of one object, which is described below.
+
+The ProgID for dspcalc2's only object is "DspCalc2.Application".
+An instance of this object can be created by executing the
+following lines of code in Visual Basic or DispTest:
+
+ Sub Foo
+ Dim MyCalculator as Object
+
+ Set MyCalculator = CreateObject("DspCalc2.Application")
+ . . .
+ End Sub
+
+
+-----------------
+Program Structure
+-----------------
+DspCalc2 uses a type library and CreateStdDispatch in order to
+implement the IDispatch interface.
+
+
+
+-------------------------
+Properties for the object
+-------------------------
+
+
+Name Type Description
+---------------------------
+Value VT_I4 Same as the value for the accumulator.
+
+Accum VT_I4 The value that is in the accumulator of the
+ calculator.
+
+Opnd VT_I4 The operand. This is the number which is
+ currently being entered.
+
+Op VT_I2 The operator that is currently being used.
+ This is an enumeration:
+ const OP_NONE = 0
+ const OP_PLUS = 1
+ const OP_MINUS = 2
+ const OP_MULT = 3
+
+
+
+-----------------------------
+Methods defined on the object
+-----------------------------
+
+
+Name Description
+---------------------------
+Eval() as Boolean If there is an operator, apply it to
+ accumulator and the operand, placing the
+ result in the accumulator.
+
+ The return value indicates success or
+ failure.
+
+Clear() Resets the calculator. This sets
+ Op to OP_NONE, and both Accum and
+ Opnd to 0.
+Display() Updates the display of the calculator.
+ (Other operations do not do this.)
+
+Quit() Close the calculator.
+
+Button(b as string) as Boolean
+ Press the indicated button and return
+ success or failure.
+
+ Valid string values are:
+ +, -, *, +
+ 0-9
+ c, C
+ =
+
+ Note that you may also pass the numbers
+ 0-9 and these will be converted to strings
+ automatically.
+
+
+
+---------------------------
+Shortcomings of this sample
+---------------------------
+1. Property and method names should not be abbreviated.
+For example, the "Opnd" property should be the "Operand"
+property.
+
+2. Since the object is the application object, it should
+have Name and Version properties, which are read-only.
diff --git a/private/oleauto/sample/dspcalc2/resource.h b/private/oleauto/sample/dspcalc2/resource.h
new file mode 100644
index 000000000..dea23584f
--- /dev/null
+++ b/private/oleauto/sample/dspcalc2/resource.h
@@ -0,0 +1,71 @@
+/***
+*resource.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _MAC
+
+#define kMinSize 500 /* minimum size (in K) */
+#define kPrefSize 500 /* preferred size (in K) */
+
+#define kMinHeap 21 * 1024
+#define kMinSpace 8 * 1024
+
+#define rMenuBar 128 /* menu bar */
+#define rAboutAlert 128 /* about alert */
+#define rUserAlert 129 /* error alert */
+
+#define rCalc 130
+
+#define mApple 128 /* Apple menu */
+#define iAbout 1
+
+#define mFile 129 /* File menu */
+#define iClose 4
+#define iQuit 12
+
+#define mEdit 130 /* Edit menu */
+#define iUndo 1
+#define iCut 3
+#define iCopy 4
+#define iPaste 5
+#define iClear 6
+
+#endif
+
+// Note: there is code that depends on all of the digits being contiguous
+// and in the following order.
+
+// Mac Note: On the mac these IDs correspond to the control indices
+// in the DITL array.
+
+#define IDC_ZERO 1
+#define IDC_ONE 2
+#define IDC_TWO 3
+#define IDC_THREE 4
+#define IDC_FOUR 5
+#define IDC_FIVE 6
+#define IDC_SIX 7
+#define IDC_SEVEN 8
+#define IDC_EIGHT 9
+#define IDC_NINE 10
+
+// Note: there is code that depends on the operators being contiguous
+// and in the following order.
+//
+#define IDC_PLUS 11
+#define IDC_MINUS 12
+#define IDC_MULT 13
+#define IDC_DIV 14
+
+#define IDC_CLEAR 15
+#define IDC_EQUALS 16
+
+#define IDC_DISPLAY 17
+
diff --git a/private/oleauto/sample/hello/clsid.c b/private/oleauto/sample/hello/clsid.c
new file mode 100644
index 000000000..6e7421731
--- /dev/null
+++ b/private/oleauto/sample/hello/clsid.c
@@ -0,0 +1,36 @@
+/***
+*clsid.c
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates and initializes the CLSIDs.
+*
+*****************************************************************************/
+
+
+
+// initguid.h requires this.
+//
+
+#ifdef _MAC
+# include <Types.h>
+# include <Processes.h>
+# include <AppleEvents.h>
+#else
+# include <windows.h>
+#endif
+
+#ifndef WIN32
+#include <compobj.h>
+#endif //!WIN32
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+// due to the previous header, including this causes the DEFINE_GUID
+// definitions in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
diff --git a/private/oleauto/sample/hello/clsid.h b/private/oleauto/sample/hello/clsid.h
new file mode 100644
index 000000000..8dca81d17
--- /dev/null
+++ b/private/oleauto/sample/hello/clsid.h
@@ -0,0 +1,89 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs for the class which we
+* will register with OLE.
+*
+* You can get a universally unique identifier (uuid) by running
+* the uuidgen tool supplied with OLE2. When you run it, a huge
+* hex number comes out. Do some pattern matching and stick the
+* numbers into this macro. A long (l) is 8 he digits, a word (w)
+* is 4 hex digits and a byte is two hex digits.
+*
+* You only have to do this once for each class you create and register
+* with OLE.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+/*
+ *
+ IDispatch* Hello.Application {D3CE6D43-F1AF-1068-9FBB-08002B32372A}
+ Type library: Hello.tlb {D3CE6D44-F1AF-1068-9FBB-08002B32372A}
+ Interface: _IHello {D3CE6D45-F1AF-1068-9FBB-08002B32372A}
+ DispInterface:_DHello {D3CE6D46-F1AF-1068-9FBB-08002B32372A}
+ *
+ */
+
+DEFINE_GUID(CLSID_CHello,
+ 0xD3CE6D43,
+ 0xF1AF,
+ 0x1068,
+ 0x9F,
+ 0xBB,
+ 0x08,
+ 0x00,
+ 0x2B,
+ 0x32,
+ 0x37,
+ 0x2A);
+
+
+DEFINE_GUID(IID_IHello,
+ 0xD3CE6D45,
+ 0xF1AF,
+ 0x1068,
+ 0x9F,
+ 0xBB,
+ 0x08,
+ 0x00,
+ 0x2B,
+ 0x32,
+ 0x37,
+ 0x2A);
+
+
+
+DEFINE_GUID(IID_DHello,
+ 0xD3CE6D46,
+ 0xF1AF,
+ 0x1068,
+ 0x9F,
+ 0xBB,
+ 0x08,
+ 0x00,
+ 0x2B,
+ 0x32,
+ 0x37,
+ 0x2A);
+
+
+DEFINE_GUID(LIBID_HELLOTLB,
+ 0xD3CE6D44,
+ 0xF1AF,
+ 0x1068,
+ 0x9F,
+ 0xBB,
+ 0x08,
+ 0x00,
+ 0x2B,
+ 0x32,
+ 0x37,
+ 0x2A);
+
diff --git a/private/oleauto/sample/hello/common.h b/private/oleauto/sample/hello/common.h
new file mode 100644
index 000000000..f933e89ab
--- /dev/null
+++ b/private/oleauto/sample/hello/common.h
@@ -0,0 +1,65 @@
+/***
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* File:
+* common.h
+*
+* Purpose:
+*
+* Common definitions across Win16/Win32
+*
+*****************************************************************************/
+
+#ifndef __Common_h_
+#define __Common_h_
+
+#include <windows.h>
+#ifndef WIN32
+#include <ole2.h>
+#include <olenls.h>
+#include <dispatch.h>
+#endif //!WIN32
+
+
+#ifdef WIN32
+# define STRLEN strlen
+# define STRICMP _stricmp
+# define MEMCPY memcpy
+# define MEMCMP memcmp
+# define MEMSET memset
+# define STRSTR strstr
+# if defined(UNICODE)
+ #define TCHAR WCHAR
+ #define TSTR(str) L##str
+ #define STRING(str) (str)
+# else
+ #define TCHAR char
+ #define TSTR(str) str
+ #define STRING(str) AnsiString(str)
+ extern "C" char FAR* AnsiString(OLECHAR FAR* strIn);
+# endif
+
+#else
+# define STRLEN _fstrlen
+# define STRICMP _fstricmp
+# define MEMCPY _fmemcpy
+# define MEMCMP _fmemcmp
+# define MEMSET _fmemset
+# define STRSTR _fstrstr
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+#endif
+
+#ifndef CLASS
+# ifdef __TURBOC__
+# define CLASS class huge
+# else
+# define CLASS class FAR
+# endif
+#endif
+
+
+#endif // __Common_h_
diff --git a/private/oleauto/sample/hello/hello.cpp b/private/oleauto/sample/hello/hello.cpp
new file mode 100644
index 000000000..1f69253f5
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.cpp
@@ -0,0 +1,326 @@
+/***
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* File:
+* hello.cpp
+*
+* Purpose:
+* See comment in hello.h
+*
+*****************************************************************************/
+
+
+#include "common.h"
+#include "resource.h"
+#include "hello.h"
+
+
+
+
+
+IUnknown FAR*
+CreateDispatchInterface(
+ IUnknown FAR* punkController,
+ void FAR* pProgInterface)
+{
+ HRESULT hresult;
+ ITypeLib FAR* ptlib;
+ ITypeInfo FAR* ptinfo;
+ IUnknown FAR* punkStdDisp;
+
+ // Load the the hellotlb type library.
+ hresult = LoadRegTypeLib(LIBID_HELLOTLB, 1, 0, 0x0409, &ptlib);
+ if (hresult != NOERROR) {
+ #define TLB_NAME OLESTR("hello.tlb")
+
+ // if it wasn't registered, try to load it from the path/current directory
+ // if this succeeds, it will have registered the type library for us
+ // for the next time.
+ if((hresult = LoadTypeLib(TLB_NAME, &ptlib)) != NOERROR)
+ return NULL;
+ }
+
+ // Get Dispatch TypeInfo from the type library.
+ // Exit if an error occurs.
+ hresult = ptlib->GetTypeInfoOfGuid(IID_IHello, &ptinfo);
+ if (hresult != NOERROR)
+ return NULL;
+
+ ptlib->Release();
+
+ // Create a standard dispatch object.
+ // Release the pointer to the previously created TypeInfo.
+ // Exit if an error occurred.
+ hresult = CreateStdDispatch(punkController,
+ pProgInterface,
+ ptinfo,
+ &punkStdDisp);
+ ptinfo->Release();
+ if (hresult != NOERROR)
+ return NULL;
+
+
+ // If execution has reached this point, then no errors occurred.
+ return punkStdDisp;
+}
+
+
+
+
+
+/*
+ * CHello::CHello(void)
+ *
+ */
+CHello::CHello()
+{
+ m_refs = 1;
+ m_disp_interface = NULL;
+ m_prog_interface = new CHelloPro;
+ m_prog_interface->m_phello = this;
+ m_bstrHelloMsg = SysAllocString(OLESTR("Hello, world"));
+}
+
+
+
+
+
+/*
+ * CHello::~CHello(void)
+ *
+ */
+CHello::~CHello()
+{
+ SysFreeString(m_bstrHelloMsg);
+ delete m_prog_interface;
+}
+
+
+
+
+
+/*
+ * CHello *CHello::Create(void)
+ *
+ * Creates a new instance of the CHello object.
+ *
+ * Returns a pointer to the newly created instance or
+ * NULL if the creation fails.
+ *
+ */
+CHello FAR*
+CHello::Create()
+{
+ CHello FAR* phello;
+ IUnknown FAR* punkStdDisp;
+
+
+ // Create an instance of CHello. Exit if an error occurs.
+ phello = new FAR CHello();
+ if(phello == NULL)
+ return NULL;
+
+ punkStdDisp = CreateDispatchInterface((IUnknown FAR*) phello,
+ phello->m_prog_interface);
+ if (punkStdDisp == NULL) {
+ phello->Release();
+ return NULL;
+ }
+
+
+ // If execution has reached this point, then no errors have occurred.
+ // Save the standard dispatch item and return the new instance.
+ phello->m_disp_interface = punkStdDisp;
+ return phello;
+}
+
+
+
+
+
+/*
+ * void CHello::ProcessCommand(WPARAM param)
+ *
+ * Process a windows WM_COMMAND with the specified parameter.
+ *
+ */
+void CHello::ProcessCommand(WPARAM wparam)
+{
+ switch(wparam) {
+ case IDC_SAYHELLO:
+ // The user pressed the "Say Hello" button.
+ m_prog_interface->SayHello();
+ break;
+ }
+}
+
+
+
+
+
+//---------------------------------------------------------------------
+// IUnknown methods
+//---------------------------------------------------------------------
+
+
+/* CHello::QueryInterface(...)
+ *
+ * Someone wants to know if CHello support the interface identified
+ * by riid. CHello supports IUnknown and we defer to a member
+ * (m_disp_interfaceatch) and thus support IDispatch.
+ *
+ * CHello doesn't support any other interfaces.
+ *
+ */
+STDMETHODIMP
+CHello::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ // riid identifies an interface type. Do we support it?
+
+ if (IsEqualIID(riid, IID_IUnknown))
+ // Someone is asking us for our controlling IUnknown.
+ // CHello is that IUnknown, so "this" is the answer.
+ *ppv = this;
+ else if (IsEqualIID(riid, IID_IDispatch) ||
+ IsEqualIID(riid, IID_DHello))
+ // Someone is asking us for our IDispatch or dispinterface.
+ // We simply defer to the standard dispatch interface
+ // we created earlier.
+ return m_disp_interface->QueryInterface(IID_IDispatch, ppv);
+ else if (IsEqualIID(riid, IID_IHello))
+ // Someone is asking us for our IHelloPro interface.
+ // We simply defer to the standard dispatch interface
+ // we created earlier.
+ *ppv = &m_prog_interface;
+ else {
+ // They must have asked for another interface -- something
+ // we don't support. Report the error.
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+ }
+
+ // If execution reached this point then no error occurred.
+ AddRef();
+ return NOERROR;
+}
+
+
+
+
+
+
+STDMETHODIMP_(ULONG)
+CHello::AddRef()
+{
+ return ++m_refs;
+}
+
+
+
+
+
+STDMETHODIMP_(ULONG)
+CHello::Release()
+{
+ if(--m_refs == 0)
+ {
+ if(m_disp_interface != NULL)
+ m_disp_interface->Release();
+ PostQuitMessage(0);
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+
+
+//---------------------------------------------------------------------
+// The CHello Class Factory
+//---------------------------------------------------------------------
+
+
+CHelloCF::CHelloCF()
+{
+ m_refs = 1;
+}
+
+
+
+
+
+IClassFactory FAR*
+CHelloCF::Create()
+{
+ return new FAR CHelloCF();
+}
+
+
+
+
+
+STDMETHODIMP
+CHelloCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown) ||
+ IsEqualIID(riid, IID_IClassFactory)) {
+ AddRef();
+ *ppv = this;
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+
+
+
+STDMETHODIMP_(ULONG)
+CHelloCF::AddRef()
+{
+ return ++m_refs;
+}
+
+
+
+
+
+STDMETHODIMP_(ULONG)
+CHelloCF::Release()
+{
+ if(--m_refs == 0) {
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+
+
+
+STDMETHODIMP
+CHelloCF::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv)
+{
+ extern CHello FAR* g_phello;
+
+
+ return g_phello->QueryInterface(riid, ppv);
+}
+
+
+
+
+
+STDMETHODIMP
+CHelloCF::LockServer(BOOL fLock)
+{
+ return NOERROR;
+}
diff --git a/private/oleauto/sample/hello/hello.def b/private/oleauto/sample/hello/hello.def
new file mode 100644
index 000000000..1f9132d46
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.def
@@ -0,0 +1,14 @@
+
+NAME HELLO
+
+DESCRIPTION 'Hello world OLE object'
+
+EXETYPE WINDOWS
+
+STUB 'WINSTUB.EXE'
+
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MULTIPLE
+
+HEAPSIZE 4096
+STACKSIZE 8192
diff --git a/private/oleauto/sample/hello/hello.frm b/private/oleauto/sample/hello/hello.frm
new file mode 100644
index 000000000..417aac128
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.frm
@@ -0,0 +1,141 @@
+VERSION 2.00
+Begin Form Form1
+ Caption = "This is a Disptest application"
+ ClientHeight = 3915
+ ClientLeft = 1995
+ ClientTop = 2115
+ ClientWidth = 7500
+ Height = 4320
+ Left = 1935
+ LinkTopic = "Form1"
+ ScaleHeight = 3915
+ ScaleWidth = 7500
+ Top = 1770
+ Width = 7620
+ Begin CommandButton btnGetHelloValue
+ Caption = "Get Hello's Value"
+ Height = 500
+ Left = 240
+ TabIndex = 9
+ Top = 3200
+ Width = 2000
+ End
+ Begin TextBox txtSetHelloMsg
+ Height = 285
+ Left = 4300
+ TabIndex = 4
+ Top = 2205
+ Width = 3000
+ End
+ Begin CommandButton btnSetHelloMsg
+ Caption = "Set Hello Message"
+ Height = 500
+ Left = 195
+ TabIndex = 3
+ Top = 2205
+ Width = 2000
+ End
+ Begin CommandButton btnGetHelloMsg
+ Caption = "Get Hello Message"
+ Height = 500
+ Left = 200
+ TabIndex = 2
+ Top = 1200
+ Width = 2000
+ End
+ Begin PictureBox picOutput
+ Height = 735
+ Left = 4300
+ ScaleHeight = 705
+ ScaleWidth = 2970
+ TabIndex = 1
+ Top = 195
+ Width = 3000
+ End
+ Begin CommandButton btnSayHello
+ Caption = "Say Hello"
+ Height = 500
+ Left = 200
+ TabIndex = 0
+ Top = 200
+ Width = 2000
+ End
+ Begin Label lblHelloValue
+ BorderStyle = 1 'Fixed Single
+ Height = 260
+ Left = 4300
+ TabIndex = 11
+ Top = 3200
+ Width = 3000
+ End
+ Begin Label zLabel
+ Alignment = 1 'Right Justify
+ Caption = "Hello's' value:"
+ Height = 255
+ Index = 3
+ Left = 2280
+ TabIndex = 10
+ Top = 3195
+ Width = 1935
+ End
+ Begin Label zLabel
+ Alignment = 1 'Right Justify
+ Caption = "New Hello message:"
+ Height = 255
+ Index = 2
+ Left = 2300
+ TabIndex = 8
+ Top = 2205
+ Width = 1940
+ End
+ Begin Label zLabel
+ Alignment = 1 'Right Justify
+ Caption = "Hello message:"
+ Height = 255
+ Index = 1
+ Left = 2300
+ TabIndex = 7
+ Top = 1200
+ Width = 1940
+ End
+ Begin Label zLabel
+ Alignment = 1 'Right Justify
+ Caption = "Output pane:"
+ Height = 255
+ Index = 0
+ Left = 2300
+ TabIndex = 6
+ Top = 195
+ Width = 1940
+ End
+ Begin Label lblGetHelloMsg
+ BorderStyle = 1 'Fixed Single
+ Height = 260
+ Left = 4300
+ TabIndex = 5
+ Top = 1200
+ Width = 3000
+ End
+End
+Dim MyObj As object
+
+Sub btnGetHelloMsg_Click ()
+ lblGetHelloMsg.Caption = MyObj.HelloMessage
+End Sub
+
+Sub btnGetHelloValue_Click ()
+ lblHelloValue.Caption = MyObj
+End Sub
+
+Sub btnSayHello_Click ()
+ picOutput.Print MyObj.SayHello
+End Sub
+
+Sub btnSetHelloMsg_Click ()
+ MyObj.HelloMessage = txtSetHelloMsg.Text
+End Sub
+
+Sub Form_Load ()
+ Set MyObj = CreateObject("hello.application")
+End Sub
+
diff --git a/private/oleauto/sample/hello/hello.h b/private/oleauto/sample/hello/hello.h
new file mode 100644
index 000000000..dc591373f
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.h
@@ -0,0 +1,89 @@
+/***
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* File:
+* hello.h
+*
+* Purpose:
+* Contains the following:
+*
+* * The CHello class
+* - Creation
+* - Creating the standard dispatch object
+* - Deletion
+* - Reference count maintenance
+* - IUnknown methods
+* * The CHelloCF class, which creates instances of CHello.
+* - Creation
+* - Deletion
+* - Reference count maintenance
+* - IUnknown methods
+*
+*****************************************************************************/
+
+#include "common.h"
+#include "clsid.h"
+#include "hellopro.h"
+
+#pragma warning(disable:4355)
+
+
+
+/* The CHello class.
+ *
+ */
+CLASS CHello : public IUnknown
+{
+
+ public:
+ CHello();
+ ~CHello();
+ static CHello FAR* Create();
+ void ProcessCommand(WPARAM wparam); // Process a Windows WM_COMMAND message
+
+ // Standard OLE stuff.
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ HWND m_hwnd; // The window to which we draw.
+ BSTR m_bstrHelloMsg;
+
+ private:
+ ULONG m_refs; // Reference count.
+ IUnknown FAR* m_disp_interface; // Pointer to the standard dispatch object.
+ CHelloPro FAR* m_prog_interface; // What a programmer sees.
+};
+
+
+
+
+
+/* The class factory for CHello.
+ *
+ */
+CLASS CHelloCF : public IClassFactory
+{
+ public:
+ CHelloCF();
+ static IClassFactory FAR* Create();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ STDMETHOD(CreateInstance)( IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv);
+ STDMETHOD(LockServer)(BOOL fLock);
+
+ private:
+ ULONG m_refs;
+};
+
+
+
+
+
diff --git a/private/oleauto/sample/hello/hello.ico b/private/oleauto/sample/hello/hello.ico
new file mode 100644
index 000000000..00a39d984
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.ico
Binary files differ
diff --git a/private/oleauto/sample/hello/hello.mak b/private/oleauto/sample/hello/hello.mak
new file mode 100644
index 000000000..942438316
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.mak
@@ -0,0 +1,4 @@
+HELLO.FRM
+ProjWinSize=288,448,189,102
+ProjWinShow=2
+IconForm="Form1"
diff --git a/private/oleauto/sample/hello/hello.odl b/private/oleauto/sample/hello/hello.odl
new file mode 100644
index 000000000..272a7d5cf
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.odl
@@ -0,0 +1,67 @@
+/*
+ * hello.odl
+ *
+ *
+ *
+ IDispatch* Hello.Application {D3CE6D43-F1AF-1068-9FBB-08002B32372A}
+ Type library: hello.tlb {D3CE6D44-F1AF-1068-9FBB-08002B32372A}
+ Interface: IHello {D3CE6D45-F1AF-1068-9FBB-08002B32372A}
+
+ *
+ *
+ *
+ */
+
+[
+ uuid(D3CE6D44-F1AF-1068-9FBB-08002B32372A),
+ helpstring("OLE Automation Hello 1.0 Type Library"),
+ lcid(0x0409),
+ version(1.0)
+]
+library Hello
+{
+#ifdef WIN32
+ importlib("stdole32.tlb");
+#else
+ importlib("stdole.tlb");
+#endif
+
+ [
+ // The uuid for the interface IID_IHelloPro.
+ odl,
+ uuid(D3CE6D45-F1AF-1068-9FBB-08002B32372A),
+ helpstring("Hello")
+ ]
+ interface _IHello : IUnknown
+ {
+ [id(0), propput]
+ void HelloMessage([in] BSTR b);
+
+ [id (0), propget, helpstring("The message that will be displayed.")]
+ BSTR HelloMessage();
+
+ BSTR SayHello(void);
+ }
+
+
+ [
+ uuid(D3CE6D46-F1AF-1068-9FBB-08002B32372A),
+ helpstring("Hello DispInterface")
+ ]
+ dispinterface _DHello
+ {
+ interface _IHello;
+ }
+
+
+ [ // The uuid for the class we expose. Same as registry
+ // entry for hello.hello
+ uuid(D3CE6D43-F1AF-1068-9FBB-08002B32372A),
+ helpstring("Hello")
+ ]
+ coclass Hello
+ {
+ dispinterface _DHello;
+ interface _IHello;
+ }
+};
diff --git a/private/oleauto/sample/hello/hello.r32 b/private/oleauto/sample/hello/hello.r32
new file mode 100644
index 000000000..e62aefec4
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.r32
@@ -0,0 +1,30 @@
+REGEDIT
+
+; Registration information for the hello application
+;
+; IDispatch* Hello.Application {D3CE6D43-F1AF-1068-9FBB-08002B32372A}
+; Type library: hello.tlb {D3CE6D44-F1AF-1068-9FBB-08002B32372A}
+; Interface: IHello {D3CE6D45-F1AF-1068-9FBB-08002B32372A}
+;
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info Hello.Application (defaults to Hello.Application.1)
+
+HKEY_CLASSES_ROOT\Hello.Application = OLE Automation Hello Application
+HKEY_CLASSES_ROOT\Hello.Application\Clsid = {D3CE6D43-F1AF-1068-9FBB-08002B32372A}
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info Hello.Application.1
+
+HKEY_CLASSES_ROOT\Hello.Application.1 = OLE Automation Hello 1.0 Application
+HKEY_CLASSES_ROOT\Hello.Application.1\Clsid = {D3CE6D43-F1AF-1068-9FBB-08002B32372A}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info Hello 1.0
+
+HKEY_CLASSES_ROOT\CLSID\{D3CE6D43-F1AF-1068-9FBB-08002B32372A} = IDispatch Hello Example
+HKEY_CLASSES_ROOT\CLSID\{D3CE6D43-F1AF-1068-9FBB-08002B32372A}\ProgID = Hello.Application.1
+HKEY_CLASSES_ROOT\CLSID\{D3CE6D43-F1AF-1068-9FBB-08002B32372A}\VersionIndependentProgID = Hello.Application
+HKEY_CLASSES_ROOT\CLSID\{D3CE6D43-F1AF-1068-9FBB-08002B32372A}\LocalServer32 = hello.exe /Automation
diff --git a/private/oleauto/sample/hello/hello.rc b/private/oleauto/sample/hello/hello.rc
new file mode 100644
index 000000000..ad86feb74
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.rc
@@ -0,0 +1,81 @@
+//Microsoft App Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+#include "resource.h"
+
+/////////////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+HELLO ICON DISCARDABLE "HELLO.ICO"
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+HELLO DIALOG DISCARDABLE 20, 20, 214, 144
+STYLE WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU
+CAPTION "Hello"
+CLASS "Hello"
+FONT 8, "MS Sans Serif"
+BEGIN
+ PUSHBUTTON "Say Hello",IDC_SAYHELLO,7,6,52,15
+ EDITTEXT IDC_HELLOAREA,86,7,119,117,ES_MULTILINE | ES_AUTOHSCROLL |
+ ES_READONLY
+END
+
+#ifdef APSTUDIO_INVOKED
+//////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resrc1.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""resource.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+/////////////////////////////////////////////////////////////////////////////////////
+#endif // APSTUDIO_INVOKED
+
+
+#ifndef APSTUDIO_INVOKED
+////////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/private/oleauto/sample/hello/hello.reg b/private/oleauto/sample/hello/hello.reg
new file mode 100644
index 000000000..0aacbc5be
--- /dev/null
+++ b/private/oleauto/sample/hello/hello.reg
@@ -0,0 +1,30 @@
+REGEDIT
+
+; Registration information for the hello application
+;
+; IDispatch* Hello.Application {D3CE6D43-F1AF-1068-9FBB-08002B32372A}
+; Type library: hello.tlb {D3CE6D44-F1AF-1068-9FBB-08002B32372A}
+; Interface: IHello {D3CE6D45-F1AF-1068-9FBB-08002B32372A}
+;
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info Hello.Application (defaults to Hello.Application.1)
+
+HKEY_CLASSES_ROOT\Hello.Application = OLE Automation Hello Application
+HKEY_CLASSES_ROOT\Hello.Application\Clsid = {D3CE6D43-F1AF-1068-9FBB-08002B32372A}
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info Hello.Application.1
+
+HKEY_CLASSES_ROOT\Hello.Application.1 = OLE Automation Hello 1.0 Application
+HKEY_CLASSES_ROOT\Hello.Application.1\Clsid = {D3CE6D43-F1AF-1068-9FBB-08002B32372A}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info Hello 1.0
+
+HKEY_CLASSES_ROOT\CLSID\{D3CE6D43-F1AF-1068-9FBB-08002B32372A} = IDispatch Hello Example
+HKEY_CLASSES_ROOT\CLSID\{D3CE6D43-F1AF-1068-9FBB-08002B32372A}\ProgID = Hello.Application.1
+HKEY_CLASSES_ROOT\CLSID\{D3CE6D43-F1AF-1068-9FBB-08002B32372A}\VersionIndependentProgID = Hello.Application
+HKEY_CLASSES_ROOT\CLSID\{D3CE6D43-F1AF-1068-9FBB-08002B32372A}\LocalServer = hello.exe /Automation
diff --git a/private/oleauto/sample/hello/hellopro.cpp b/private/oleauto/sample/hello/hellopro.cpp
new file mode 100644
index 000000000..300aed7f1
--- /dev/null
+++ b/private/oleauto/sample/hello/hellopro.cpp
@@ -0,0 +1,97 @@
+/***
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* File:
+* hellopro.cpp
+*
+* Purpose:
+* CHelloProgrammability is the programmability interface for
+* the CHello object. it contains the implementation of every
+* member of the CHello class which is visible to a programmer
+* using the CHello object.
+*
+*****************************************************************************/
+
+#include "common.h"
+#include "resource.h"
+#include "hello.h" // This also gets hellopro.h
+
+
+
+/* SetHelloMsg
+ *
+ * SetHelloMsg sets the message that the hello object
+ * says when the SayHello method is called.
+ *
+ */
+STDMETHODIMP_(void)
+CHelloPro::put_HelloMessage(BSTR b)
+{
+ SysReAllocString(&(m_phello->m_bstrHelloMsg), b);
+}
+
+
+
+
+/* GetHelloMsg
+ *
+ * GetHelloMsg gets the message that the hello object
+ * says when the SayHello method is called.
+ *
+ */
+STDMETHODIMP_(BSTR)
+CHelloPro::get_HelloMessage()
+{
+ return SysAllocString(m_phello->m_bstrHelloMsg);
+}
+
+
+
+
+/* SayHello
+ *
+ * SayHello writes the string "Hello world." in the dialog's
+ * text box and returns the same string.
+ *
+ */
+STDMETHODIMP_(BSTR)
+CHelloPro::SayHello()
+{
+ BSTR b;
+
+ b = SysAllocString(m_phello->m_bstrHelloMsg);
+ SetDlgItemText(m_phello->m_hwnd, IDC_HELLOAREA, STRING(b));
+ return b;
+}
+
+
+
+
+
+/* IUnknown methods
+ *
+ * Simply defer to pur controlling IUnknown.
+ *
+ */
+STDMETHODIMP
+CHelloPro::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_phello->QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(ULONG)
+CHelloPro::AddRef()
+{
+ return m_phello->AddRef();
+}
+
+STDMETHODIMP_(ULONG)
+CHelloPro::Release()
+{
+ return m_phello->Release();
+}
+
+
+
diff --git a/private/oleauto/sample/hello/hellopro.h b/private/oleauto/sample/hello/hellopro.h
new file mode 100644
index 000000000..e23007950
--- /dev/null
+++ b/private/oleauto/sample/hello/hellopro.h
@@ -0,0 +1,43 @@
+/***
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* File:
+* hellopro.h
+*
+* Purpose:
+* This is the header for CHelloProgrammability, which is the
+* programmability interface for CHello objects.
+*
+* This is the user interface that a programmer who uses our
+* object will be using.
+*
+*****************************************************************************/
+
+#include "common.h"
+
+
+// Forward declaration.
+CLASS CHello;
+
+#include "ihello.h" // Include MkTypLib-created interface
+ // description of _IHello.
+
+
+
+CLASS CHelloPro : public _IHello
+{
+ public:
+
+ // Standard OLE stuff.
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj);
+ STDMETHOD_(ULONG, AddRef)(THIS);
+ STDMETHOD_(ULONG, Release)(THIS);
+
+ STDMETHOD_(void, put_HelloMessage)(THIS_ BSTR b);
+ STDMETHOD_(BSTR, get_HelloMessage)(THIS);
+ STDMETHOD_(BSTR, SayHello)(THIS);
+
+ CHello FAR* m_phello;
+};
diff --git a/private/oleauto/sample/hello/main.cpp b/private/oleauto/sample/hello/main.cpp
new file mode 100644
index 000000000..788ae0e90
--- /dev/null
+++ b/private/oleauto/sample/hello/main.cpp
@@ -0,0 +1,272 @@
+/***
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* File:
+* main.cpp
+*
+* Purpose:
+* This file contains:
+*
+* WinMain() and WndProc(), which are called by Windows when the app is run.
+* Code to initialize and uninitialize OLE.
+* Code to create and destroy the window for the application.
+*
+*****************************************************************************/
+
+#include "common.h"
+#include "resource.h"
+#include "hello.h"
+
+#include <string.h>
+
+
+/* Global variables.
+ */
+
+DWORD g_dwCHelloCF = 0; // Holds the return code for class factory creation.
+
+CHello FAR* g_phello = NULL; // Pointer to a CHello object.
+
+TCHAR g_szAppName[] = TSTR("Hello"); // Name of the application.
+
+
+
+/* Forward declarations.
+ */
+HRESULT InitOle(void);
+void UninitOle(void);
+BOOL InitApplication(HINSTANCE);
+BOOL InitInstance(HINSTANCE, int);
+
+
+
+/* Let Windows call WinMain and WndProc.
+ */
+extern "C"
+{
+ long FAR PASCAL WndProc(HWND, UINT, WPARAM, LPARAM);
+ int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+}
+
+
+
+
+
+/* WinMain
+ *
+ * Windows calls WinMain when the application starts.
+ *
+ */
+extern "C" int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+
+
+ if(!hPrevInstance)
+ if(!InitApplication(hinst))
+ return FALSE;
+
+ if(InitOle() != NOERROR)
+ return FALSE;
+
+ if(!InitInstance(hinst, nCmdShow)){
+ UninitOle();
+ return FALSE;
+ }
+
+
+ while(GetMessage(&msg, NULL, NULL, NULL)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ // Uninitialize OLE.
+ UninitOle();
+
+ return msg.wParam;
+}
+
+
+
+
+
+/* InitApplication
+ *
+ * Create a window and register it with Windows.
+ *
+ * Return FALSE if an error occurs and TRUE otherwise.
+ */
+BOOL
+InitApplication(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = WndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = DLGWINDOWEXTRA;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(hinst, g_szAppName); // Loads hello.ico
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Normal arrow pointer
+ wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1);
+ wc.lpszMenuName = NULL; // No menus.
+ wc.lpszClassName= g_szAppName;
+
+ // Tell Windows about the window class we just created.
+ // Exit if an error occurs.
+ if(!RegisterClass(&wc))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+
+
+
+/* InitInstance
+ *
+ * Create an instance of CHello and make g_phello
+ * point to it..
+ *
+ * Return FALSE if an error occurs and TRUE otherwise.
+ */
+BOOL
+InitInstance(HINSTANCE hinst, int nCmdShow)
+{
+ HWND hwnd;
+
+ // Create the window and show it
+ hwnd = CreateDialog(hinst, g_szAppName, 0, NULL);
+ ShowWindow(hwnd, nCmdShow);
+ g_phello->m_hwnd = hwnd;
+
+ return TRUE;
+}
+
+
+
+
+
+extern "C" long FAR PASCAL
+WndProc(
+ HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch(message) {
+ case WM_COMMAND:
+ g_phello->ProcessCommand(wParam);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefWindowProc(hwnd, message, wParam, lParam);
+}
+
+
+
+
+
+
+HRESULT
+InitOle()
+{
+ HRESULT hresult;
+ IClassFactory FAR* pcf;
+
+ if((hresult = OleInitialize(NULL)) != NOERROR)
+ return hresult;
+
+ // create the single global instance of CHello
+ if((g_phello = CHello::Create()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ return hresult;
+ }
+
+ // Create an instance of the class factory for CHello.
+ // Exit if an error occurs.
+ pcf = CHelloCF::Create();
+ if (pcf == NULL) {
+ UninitOle();
+ return hresult;
+ }
+
+ // Register the class factroy. Exit if an error occurs.
+ hresult = CoRegisterClassObject(CLSID_CHello,
+ pcf,
+ CLSCTX_LOCAL_SERVER,
+ REGCLS_MULTIPLEUSE,
+ &g_dwCHelloCF);
+ if (hresult != NOERROR) {
+ pcf->Release();
+ UninitOle();
+ return hresult;
+ }
+
+ pcf->Release();
+
+ // If execution has reached this spot, then no errors have occurred.
+ return NOERROR;
+}
+
+
+
+
+
+/* UninitOLE
+ *
+ * Tell OLE that we are going away.
+ *
+ */
+void
+UninitOle()
+{
+ // If a class factory was successfully created earlier then
+ // tell OLE that the object is no longer available.
+ if(g_dwCHelloCF != 0)
+ CoRevokeClassObject(g_dwCHelloCF);
+
+ // cause the remaining typeinfo to be released
+ if (g_phello != NULL)
+ g_phello->Release();
+
+ // Tell OLE we are done using them.
+ OleUninitialize();
+}
+
+
+#if defined(WIN32)
+
+extern "C" char FAR*
+ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size)
+{
+ int badConversion = FALSE;
+
+ WideCharToMultiByte(CP_ACP, NULL,
+ strIn, -1,
+ buf, size,
+ NULL, &badConversion);
+ return buf;
+}
+
+extern "C" char FAR*
+AnsiString(OLECHAR FAR* strIn)
+{
+ static char buf[256];
+
+ return (ConvertStrWtoA(strIn, buf, 256));
+}
+
+#endif
+
diff --git a/private/oleauto/sample/hello/makefile b/private/oleauto/sample/hello/makefile
new file mode 100644
index 000000000..d1e478b86
--- /dev/null
+++ b/private/oleauto/sample/hello/makefile
@@ -0,0 +1,290 @@
+####
+#makefile - makefile for hello.exe
+#
+# Copyright (C) 1992-1994, Microsoft Corporation
+#
+#Purpose:
+# Builds the OLE 2.0 sample IDispatch server, hello.exe.
+#
+#
+# Usage: NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option: dev = [win16 | win32] ; dev=win16 is the default
+# DEBUG=[0|1] ; DEBUG=1 is the default
+# HOST=[DOS | NT] ; HOST=DOS (for win16)
+# ; HOST=NT (for win32)
+#
+#Notes:
+# This makefile assumes that the PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+##############################################################################
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if "$(dev)" == ""
+dev = win16
+!endif
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32")
+!error Invalid dev option, choose from [win16 | win32]
+!endif
+
+!if "$(dev)" == "win16"
+TARGET = WIN16
+!if "$(HOST)" == ""
+HOST = DOS
+!endif
+!endif
+
+!if "$(dev)" == "win32"
+TARGET = WIN32
+HOST = NT
+!endif
+
+!if "$(dev)" == "mac"
+!error Mac build is currently not supported
+!endif
+
+!if "$(DEBUG)" == ""
+DEBUG = 1
+!endif
+
+!if "$(CPU)"=="PPC"
+TYPLIBTARGET=PPC
+!else
+TYPLIBTARGET=$(TARGET)
+!endif
+
+
+##########################################################################
+#
+# WIN16 Settings
+#
+!if "$(TARGET)" == "WIN16"
+
+CC = cl
+LINK = link
+!if "$(HOST)" == "DOS"
+WX = wx /w
+!else
+WX =
+!endif
+
+RCFLAGS = -dWIN16
+CFLAGS = -W3 -AM -GA -GEs -DWIN16 -I$(OBJDIR)
+LINKFLAGS = /NOD /NOI /BATCH /ONERROR:NOEXE
+
+LIBS = libw.lib mlibcew.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) /COD
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+LINKFLAGS = $(LINKFLAGS) /FAR /PACKC
+!endif
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARGET)" == "WIN32"
+
+!if "$(CPU)"==""
+
+!if "$(PROCESSOR_ARCHITECTURE)"=="" || "$(PROCESSOR_ARCHITECTURE)"=="x86"
+CPU=i386
+!else
+CPU=$(PROCESSOR_ARCHITECTURE)
+!endif
+
+!endif #CPU
+
+!if "$(CPU)" == "i386"
+CC = cl386
+LINK = link
+CFLAGS = -D_X86_=1
+!endif
+!if "$(CPU)" == "MIPS"
+CC = cl
+LINK = link
+CFLAGS = -D_MIPS_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "ALPHA"
+CC = claxp
+LINK = link
+CFLAGS = -D_ALPHA_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "PPC"
+CC = cl
+LINK = link
+CFLAGS = -D_PPC_=1 -DUNICODE
+TYPLIBTARGET=PPC32
+!endif
+
+WX =
+RCFLAGS = -dWIN32
+CFLAGS = $(CFLAGS) -nologo -W3 -DWIN32 -DINC_OLE2 -D_MT $(CL) -I$(OBJDIR)
+LINKFLAGS = -Incremental:NO -Pdb:NONE -subsystem:windows -entry:WinMainCRTStartup -machine:$(CPU)
+
+LIBS = libc.lib kernel32.lib user32.lib
+
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Z7 -D_DEBUG $(CL)
+LINKFLAGS = -debug:full -debugtype:cv,coff $(LINKFLAGS)
+!else
+CFLAGS = $(CFLAGS) -Ox
+!endif
+!endif
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+APPS = hello
+
+SRCDIR = $(OLEPROG)\SAMPLE\$(APPS)
+
+!if "$(TARGET)" == "MAC" && "$(CPU)"=="PPC"
+OBJDIR=$(SRCDIR)\macppc
+!else
+OBJDIR=$(SRCDIR)\$(TARGET)
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+
+!if "$(TARGET)" == "WIN16"
+LIBS = ole2.lib compobj.lib ole2disp.lib typelib.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "WIN32"
+LIBS = ole32.lib oleaut32.lib uuid.lib $(LIBS)
+!endif
+
+OBJS = \
+ $(OBJDIR)\main.obj \
+ $(OBJDIR)\hello.obj \
+ $(OBJDIR)\hellopro.obj \
+ $(OBJDIR)\clsid.obj
+
+
+##########################################################################
+#
+# Build rules
+#
+
+{$(SRCDIR)}.cpp{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+{$(SRCDIR)}.c{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+goal : setflags $(OBJDIR)\$(APPS).exe
+
+setflags :
+ set CL=$(CFLAGS)
+
+
+##########################################################################
+#
+# Clean (erase) generated files
+#
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\$(APPS).exe del $(OBJDIR)\$(APPS).exe
+ if exist $(OBJDIR)\$(APPS).tlb del $(OBJDIR)\$(APPS).tlb
+ if exist $(OBJDIR)\$(APPS).map del $(OBJDIR)\$(APPS).map
+ if exist $(OBJDIR)\$(APPS).res del $(OBJDIR)\$(APPS).res
+ if exist $(OBJDIR)\$(APPS).rs del $(OBJDIR)\$(APPS).rs
+ if exist $(OBJDIR)\ihello.h del $(OBJDIR)\ihello.h
+ if exist $(OBJDIR)\*.log del $(OBJDIR)\*.log
+ if exist $(SRCDIR)\*.pdb del $(SRCDIR)\*.pdb
+
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARGET)" == "WIN16"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ link $(LINKFLAGS) @<<
+$(OBJS),
+$@,$(OBJDIR)\$(APPS).map/map,
+$(LIBS),
+$(SRCDIR)\$(APPS).def
+<<
+ rc -k -t $(OBJDIR)\$(APPS).res $@
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARGET)" == "WIN32"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ cvtres -r -$(CPU) $(OBJDIR)\$(APPS).res -o $(OBJDIR)\$(APPS).rs
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(OBJDIR)\$(APPS).rs
+ $(LIBS)
+<<
+!endif
+
+
+##########################################################################
+#
+# Application Build (Common)
+#
+
+$(OBJDIR)\$(APPS).res : $(SRCDIR)\$(APPS).rc
+ rc $(RCFLAGS) -r -fo$@ $?
+
+
+##########################################################################
+#
+# Dependencies
+#
+
+$(OBJDIR)\ihello.h : $(SRCDIR)\hello.odl
+ if exist $(OBJDIR)\ihello.h del $(OBJDIR)\ihello.h
+ if exist $(OBJDIR)\hello.tlb del $(OBJDIR)\hello.tlb
+ $(WX) mktyplib /D$(TYPLIBTARGET) /h $(OBJDIR)\ihello.h /o $(OBJDIR)\hello.log /tlb $(OBJDIR)\hello.tlb $(SRCDIR)\hello.odl
+
+$(OBJDIR)\main.obj : $(SRCDIR)\main.cpp $(SRCDIR)\hello.h $(OBJDIR)\ihello.h
+ $(CC) -c -Fo$@ $(SRCDIR)\main.cpp
+
+$(OBJDIR)\hello.obj : $(SRCDIR)\hello.cpp $(SRCDIR)\hello.h $(SRCDIR)\resource.h
+ $(CC) -c -Fo$@ $(SRCDIR)\hello.cpp
+
+$(OBJDIR)\hellopro.obj : $(SRCDIR)\hellopro.cpp $(SRCDIR)\hello.h $(OBJDIR)\ihello.h
+ $(CC) -c -Fo$@ $(SRCDIR)\hellopro.cpp
+
+$(OBJDIR)\clsid.obj : $(SRCDIR)\clsid.c $(SRCDIR)\clsid.h
+ $(CC) -c -Fo$@ $(SRCDIR)\clsid.c
diff --git a/private/oleauto/sample/hello/mk.bat b/private/oleauto/sample/hello/mk.bat
new file mode 100644
index 000000000..f9a5d856f
--- /dev/null
+++ b/private/oleauto/sample/hello/mk.bat
@@ -0,0 +1,21 @@
+REM setup the environment for the hello makefile
+
+set OLDLIB=%LIB%
+set OLDPATH=%PATH%
+set OLDINC=%INCLUDE%
+
+set PATH=%TOOLS%\HDOS\BIN;%TOOLS%\HDOS\C800\BIN
+set LIB=%TOOLS%\HDOS\C800\LIB;%OLEPROG%\build\dispatch\DWIN16;%OLEPROG%\build\ole2nls\dwin16;%OLEPROG%\OLE\WIN16\D
+set INCLUDE=%TOOLS%\HDOS\C800\INCLUDE;%OLEPROG%\OLE\WIN16;%OLEPROG%\SRC\DISPATCH
+
+copy %OLEPROG%\OB\DWIN16\typelib.lib %OLEPROG%\sample\hello
+
+nmake %1 %2 %3 %4 %5
+
+set LIB=%OLDLIB%
+set PATH=%OLDPATH%
+set INCLUDE=%OLDINC%
+
+set OLDPATH=
+set OLDINC=
+set OLDLIB=
diff --git a/private/oleauto/sample/hello/readme.txt b/private/oleauto/sample/hello/readme.txt
new file mode 100644
index 000000000..f328c1aae
--- /dev/null
+++ b/private/oleauto/sample/hello/readme.txt
@@ -0,0 +1,60 @@
+---------------------------------------
+OLE Automation Sample Program: Hello
+---------------------------------------
+
+This is the "hello world" sample application. It is an OLE object
+which is programmable via IDispatch.
+
+The application has one window which contains a button and a text box.
+When the button is pressed, the string "Hello world." is displayed in
+the text box.
+
+The hello application to the SayHello method by performing the same
+action as when the "Say Hello" button in the user interface is pressed.
+The SayHello method returns the same string.
+
+This is the simplest OLE automation sample application and is a good
+place to start if you have not done any OLE Automation programming.
+
+The ProgID for hello's only object is "Hello.Application".
+An instance of this object can be created by executing the
+following lines of code in Visual Basic or DispTest:
+
+ Sub Foo
+ Dim MyCalculator as Object
+
+ Set MyCalculator = CreateObject("Hello.Application")
+ . . .
+ End Sub
+
+
+
+-----------------
+Program Structure
+-----------------
+Hello uses a type library and CreateStdDispatch in order to
+implement the IDispatch interface.
+
+
+
+-------------------------
+Properties for the object
+-------------------------
+
+
+Name Type Description
+---------------------------------------------------------------------
+HelloMessage VT_BSTR the message that is printed when the
+ SayHello method is called or when the
+ SayHello button is pressed.
+
+
+
+-----------------------------
+Methods defined on the object
+-----------------------------
+
+
+Name Description
+--------------------------------------------------------------
+SayHello() as String Print the hello message and return it.
diff --git a/private/oleauto/sample/hello/resource.h b/private/oleauto/sample/hello/resource.h
new file mode 100644
index 000000000..6484fb006
--- /dev/null
+++ b/private/oleauto/sample/hello/resource.h
@@ -0,0 +1,21 @@
+//{{NO_DEPENDENCIES}}
+// App Studio generated include file.
+// Used by HELLO.RC
+//
+
+
+#define IDC_SAYHELLO 1000
+#define IDC_HELLOAREA 1001
+
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+
+#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_COMMAND_VALUE 101
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/private/oleauto/sample/make.bat b/private/oleauto/sample/make.bat
new file mode 100644
index 000000000..5c0d06c35
--- /dev/null
+++ b/private/oleauto/sample/make.bat
@@ -0,0 +1,196 @@
+@echo off
+setlocal
+REM *********************************************************************
+REM
+REM (c) Copyright Microsoft Corp. 1992-1993 All Rights Reserved
+REM
+REM File:
+REM
+REM make.bat
+REM
+REM Purpose:
+REM
+REM oleprog project sample master make batch file.
+REM
+REM Description:
+REM
+REM Usage: run make with no arguments for usage.
+REM This batch file will set up all required variables and fire up
+REM makefile in each sample directories
+REM
+REM
+REM The structure of the SAMPLE direcoty is
+REM
+REM %OLEPROG%\SAMPLE The root of the directory
+REM |___DISPCALC makefile and .c** .h** files
+REM |___WIN32 Win32 .obj, .exe files
+REM |___WIN16 ..
+REM |___MAC ..
+REM |___MACPPC ..
+REM |___DISPDEMO Same as DISPCALC directory structure
+REM |___DSPCALC2 Same as DISPCALC directory structure
+REM |___HELLO Same as DISPCALC directory structure
+REM |___NLSSORT Same as DISPCALC directory structure
+REM |___SPOLY Same as DISPCALC directory structure
+REM |___SPOLY2 Same as DISPCALC directory structure
+REM |___TIBROWSE Same as DISPCALC directory structure
+REM ...
+REM
+REM
+REM Environment:
+REM
+REM oleprog, HOST must be set
+REM
+REM Revision History:
+REM
+REM [00] 02-Aug-94 t-issacl: Created
+REM
+REM *********************************************************************
+
+
+if '%oleprog%' == '' goto ERROR_BadEnv
+
+REM set VERS=2
+
+for %%a in ( win16 win32 mac macppc) do if "%1"=="%%a" goto %1
+
+:usage
+echo USAGE: make VERSION [SAMPLE] options
+echo where VERSION is:
+echo win16 Win16 build
+echo win32 Win32 build
+echo mac Mac build
+echo macppc PPC build
+echo.
+echo where SAMPLE is: (default to build all samples)
+echo one of (dispcalc, dispdemo, dspcalc2, hello, spoly,
+echo spoly2, tibrowse)
+echo.
+echo options will be passed to makefile by nmake
+echo "clean" option will clean up the target directory.
+echo.
+goto end
+
+
+:win16
+ set BUILDBATCHFILE=..\mk16
+ set MKTYPLIBSRC=%OLEPROG%\dwin32
+ goto build
+
+:win32
+ set BUILDBATCHFILE=..\mk32
+ set MKTYPLIBSRC=%OLEPROG%\dwin32
+ goto build
+
+:mac
+ set BUILDBATCHFILE=..\mkmac
+ set MKTYPLIBSRC=%OLEPROG%\dwin32
+ goto build
+
+:macppc
+ set BUILDBATCHFILE=..\mkppc
+ set MKTYPLIBSRC=%OLEPROG%\dwin32
+ goto build
+
+
+REM *********************************************************************
+REM here we call nmake to make it
+REM *********************************************************************
+:build
+
+set TESTBUILDALL=FALSE
+for %%a in (dispcalc dispdemo dspcalc2 hello nlssort spoly spoly2 tibrowse) do if "%2"=="%%a" goto NeedShift
+set TESTBUILDALL=TRUE
+goto dispcalc
+
+:NeedShift
+set TEMPFLAG=%2
+shift
+goto %TEMPFLAG%
+
+:dispcalc
+REM Build dispcalc
+cd dispcalc
+REM call %BUILDBATCHFILE% clean
+call %BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:dispdemo
+REM Build dispdemo
+cd dispdemo
+REM call %BUILDBATCHFILE% clean
+call %BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:dspcalc2
+REM Build dspcalc2
+cd dspcalc2
+REM call %BUILDBATCHFILE% clean
+copy %MKTYPLIBSRC%\oleaut32.dll
+copy %MKTYPLIBSRC%\mktyplib.exe
+copy %MKTYPLIBSRC%\stdole32.tlb
+call %BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:hello
+REM Build hello
+cd hello
+REM call %BUILDBATCHFILE% clean
+copy %MKTYPLIBSRC%\oleaut32.dll
+copy %MKTYPLIBSRC%\mktyplib.exe
+copy %MKTYPLIBSRC%\stdole32.tlb
+call %BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:nlssort
+REM Build nlssort
+cd nlssort
+REM call %BUILDBATCHFILE% clean
+call %BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:spoly
+REM Build spoly
+cd spoly
+REM call %BUILDBATCHFILE% clean
+call %BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:spoly2
+REM Build spoly2
+cd spoly2
+REM call %BUILDBATCHFILE% clean
+call %BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:tibrowse
+REM Build tibrowse
+cd tibrowse
+REM call %BUILDBATCHFILE% clean
+call %BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+goto end
+
+:ERROR_BadEnv
+echo.
+echo Must set oleprog variable
+
+:end
+endlocal
+@echo on
diff --git a/private/oleauto/sample/mk16.bat b/private/oleauto/sample/mk16.bat
new file mode 100644
index 000000000..f74a6fc14
--- /dev/null
+++ b/private/oleauto/sample/mk16.bat
@@ -0,0 +1,13 @@
+set path2=%path%
+set path=%oleprog%\tools\win16\hdos\c800\bin;%oleprog%\tools\win16\hdos\bin;c:\dos
+set include=%oleprog%\tools\win16\hdos\c800\include;%oleprog%\src\inc;%oleprog%\ole\win16
+set lib=%oleprog%\tools\win16\hdos\c800\lib;%oleprog%\dwin16;%oleprog%\ole\win16\lib
+set debug=1
+if not '%_NTBINDIR%' == '' %_NTBINDIR%\mstools\nmake & goto done
+if '%HOST%' == 'WIN32' %vbatools%\win32\bin\nmake & goto done
+nmake
+:done
+set path=%path2%
+set lib=
+set include=
+set path2=
diff --git a/private/oleauto/sample/mk32.bat b/private/oleauto/sample/mk32.bat
new file mode 100644
index 000000000..0ca341b01
--- /dev/null
+++ b/private/oleauto/sample/mk32.bat
@@ -0,0 +1,19 @@
+setlocal
+if '%host%' == 'WIN32' set CPU_VALUE=i386
+if NOT '%host%' == 'WIN32' set CPU_VALUE=%HOST%
+
+if '%_NTBINDIR%'=='' goto use_vbatools
+ set path=%_NTBINDIR%\mstools
+ set include=.;%_NTBINDIR%\public\sdk\inc;%_NTBINDIR%\public\sdk\inc\crt
+ set lib=%oleprog%\dwin32;%_NTBINDIR%\public\sdk\lib\%CPU_VALUE%
+ goto doit
+
+:use_vbatools
+ set path=%vbatools%\%host%\%host%\bin;%vbatools%\%host%\bin
+ set include=.;%oleprog%\src\inc;%vbatools%\win32\win32\inc
+ set lib=%oleprog%\dwin32;%oleprog%\ole\win32\%CPU_VALUE%;%vbatools%\%host%\%host%\lib
+
+:doit
+nmake dev=win32 CPU=%CPU_VALUE% DEBUG=1 %1 %2 %3 %4 %5
+
+endlocal
diff --git a/private/oleauto/sample/mkallm.bat b/private/oleauto/sample/mkallm.bat
new file mode 100644
index 000000000..c171089ed
--- /dev/null
+++ b/private/oleauto/sample/mkallm.bat
@@ -0,0 +1,18 @@
+cd dispcalc
+call ..\mkmac.bat
+cd ..
+cd dispdemo
+call ..\mkmac.bat
+cd ..
+cd dspcalc2
+call ..\mkmac.bat
+cd ..
+cd spoly
+call ..\mkmac.bat
+cd ..
+cd spoly2
+call ..\mkmac.bat
+cd ..
+cd tibrowse
+call ..\mkmac.bat
+cd ..
diff --git a/private/oleauto/sample/mkitall.bat b/private/oleauto/sample/mkitall.bat
new file mode 100644
index 000000000..597abbf88
--- /dev/null
+++ b/private/oleauto/sample/mkitall.bat
@@ -0,0 +1,70 @@
+REM ---------------------------------------------------
+REM Build All of OLE Automation Sample Applications
+REM
+if "%1" == "" set DEV=win32
+if "%1" == "win32" set DEV=win32
+if "%1" == "win16" set DEV=win16
+if "%1" == "mac" set DEV=mac
+if "%1" == "ppc" set DEV=mac
+if "%1" == "ppc" set CPU=PPC
+if not "%HOST%" == "" goto hostset
+if "%2" == "" set HOST=NT
+
+:hostset
+if not "%1" == "ppc" goto notppc
+
+setlocal
+ set mkcom=call ..\mkppc
+ goto build
+:notppc
+ set mkcom=call ..\mk
+
+:build
+REM -----------------------------------
+REM Build dispcalc demo
+REM
+cd dispcalc
+nmake clean
+%mkcom%
+cd ..
+
+REM -----------------------------------
+REM Build dspcalc2 demo
+REM
+cd dspcalc2
+nmake clean
+%mkcom%
+cd ..
+
+REM -----------------------------------
+REM Build tibrowse demo
+REM
+cd tibrowse
+nmake clean
+%mkcom%
+cd ..
+
+REM -----------------------------------
+REM Build dispdemo/spoly/spoly2 demo
+REM
+cd dispdemo
+nmake clean
+%mkcom%
+cd ..\spoly
+nmake clean
+%mkcom%
+cd ..\spoly2
+nmake clean
+%mkcom%
+cd ..
+
+if '%1' == 'ppc' goto done
+REM -----------------------------------
+REM Build hello demo
+REM
+cd hello
+nmake clean
+%mkcom%
+cd ..
+:done
+endlocal
diff --git a/private/oleauto/sample/mkmac.bat b/private/oleauto/sample/mkmac.bat
new file mode 100644
index 000000000..a3b69b0f6
--- /dev/null
+++ b/private/oleauto/sample/mkmac.bat
@@ -0,0 +1,9 @@
+setlocal
+ set path=%vbatools%\%host%\mac\bin;%vbatools%\%host%\bin
+ set include=.;%oleprog%\src\inc;%oleprog%\ole\mac\m68k;%vbatools%\%host%\mac\inc;%vbatools%\%host%\mac\inc\mrc;%vbatools%\%host%\mac\inc\macos
+ set lib=%vba93%\ole2\mac;%vbatools%\%host%\mac\lib
+ set lib=%oleprog%\ole\mac\m68k;%oleprog%\dmac;%vbatools%\%host%\mac\lib
+
+nmake dev=mac CPU=m68k DEBUG=1 %1 %2 %3 %4 %5
+
+endlocal
diff --git a/private/oleauto/sample/mkppc.bat b/private/oleauto/sample/mkppc.bat
new file mode 100644
index 000000000..3c2738b40
--- /dev/null
+++ b/private/oleauto/sample/mkppc.bat
@@ -0,0 +1,7 @@
+setlocal
+ set path=%vbatools%\%host%\ppc\bin;%vbatools%\%host%\bin
+ set include=.;%oleprog%\src\inc;%oleprog%\ole\mac\ppc;%vbatools%\%host%\ppc\inc;%vbatools%\%host%\ppc\inc\mrc;%vbatools%\%host%\ppc\inc\macos
+ set lib=%oleprog%\ole\mac\ppc;%oleprog%\dmacppc;%vbatools%\%host%\ppc\lib
+nmake dev=mac CPU=PPC DEBUG=1 %1 %2 %3 %4 %5
+
+endlocal
diff --git a/private/oleauto/sample/nlssort/makefile b/private/oleauto/sample/nlssort/makefile
new file mode 100644
index 000000000..572a78c45
--- /dev/null
+++ b/private/oleauto/sample/nlssort/makefile
@@ -0,0 +1,200 @@
+##############################################################################
+#
+# (c) Copyright Microsoft Corp. 1993 All Rights Reserved
+#
+# File:
+#
+# makefile
+#
+# Purpose:
+#
+# builds nlssort app
+#
+# Usage:
+#
+# NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option: dev = [win16 | win32] ; dev=win16 is the default
+# DEBUG=[0|1] ; DEBUG=1 is the default
+#
+#
+# Notes:
+#
+# This makefile assumes that the PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+##############################################################################
+
+
+#################################################################
+#
+# Default Settings
+#
+
+!if "$(dev)" == ""
+dev = win16
+!endif
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32")
+!error Invalid dev option, choose from [win16 | win32]
+!endif
+
+!if "$(dev)" == "win16"
+TARGET = WIN16
+!endif
+
+!if "$(dev)" == "win32"
+TARGET = WIN32
+MACHINE = i386
+!endif
+
+!if "$(DEBUG)" == ""
+DEBUG = 1
+!endif
+
+
+
+##########################################################################
+#
+# WIN16 Settings
+#
+!if "$(TARGET)" == "WIN16"
+
+CC = cl
+LINK = link
+
+CFLAGS = -W3 -AL -GA -GEs -DWIN16
+LINKFLAGS = /NOD /NOI /BATCH /ONERROR:NOEXE
+
+LIBS = libw.lib llibcew.lib ole2nls.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG
+LINKFLAGS = $(LINKFLAGS) /COD
+!else
+CFLAGS = $(CFLAGS) -Ox
+LINKFLAGS = $(LINKFLAGS) /FAR /PACKC
+!endif
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARGET)" == "WIN32"
+
+CC = cl386
+LINK = link32
+
+CFLAGS = -nologo -W3 -G3 -D_X86_=1 -DWIN32
+LINKFLAGS = -Incremental:no -Pdb:NONE -subsystem:console -entry:mainCRTStartup -align:0x1000
+
+LIBS = libc.lib kernel32.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Z7 -Od -D_DEBUG
+LINKFLAGS = -debug:full -debugtype:cv $(LINKFLAGS)
+!else
+CFLAGS = $(CFLAGS) -Ox
+!endif
+!endif
+
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+APPS = nlssort
+
+SRCDIR = $(OLEPROG)\SAMPLE\$(APPS)
+
+OBJDIR=$(SRCDIR)\$(TARGET)
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+
+OBJS = $(OBJDIR)\nlssort.obj
+
+
+##########################################################################
+#
+# Build rules
+#
+
+{$(SRCDIR)}.cpp{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+{$(SRCDIR)}.c{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+goal : setflags $(OBJDIR)\$(APPS).exe
+
+setflags :
+ set CL=$(CFLAGS)
+
+
+##########################################################################
+#
+# Clean (erase) generated files
+#
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\$(APPS).exe del $(OBJDIR)\$(APPS).exe
+ if exist $(SRCDIR)\*.pdb del $(SRCDIR)\*.pdb
+
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARGET)" == "WIN16"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def
+ link $(LINKFLAGS) @<<
+$(OBJS),
+$@,,
+$(LIBS),
+$(SRCDIR)\$(APPS).def
+<<
+ rc -k -t $@
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARGET)" == "WIN32"
+$(OBJDIR)\$(APPS).exe : $(OBJS)
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ $(OBJS)
+ $(LIBS)
+<<
+!endif
+
+
+##########################################################################
+#
+# Dependencies
+#
+
+$(OBJDIR)\nlssort.obj: $(SRCDIR)\nlssort.cpp
+ $(CC) -c -Fo$@ $(SRCDIR)\nlssort.cpp
diff --git a/private/oleauto/sample/nlssort/nlssort.cpp b/private/oleauto/sample/nlssort/nlssort.cpp
new file mode 100644
index 000000000..aeba364e0
--- /dev/null
+++ b/private/oleauto/sample/nlssort/nlssort.cpp
@@ -0,0 +1,442 @@
+/*********************************************************************\
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Synposis:
+* --------
+*
+* nlssort [options...] [< input-file > output-file]
+* /l lcid lcid used for sort
+* /R reverse order sort
+* /c ignore case
+* /n ignore nonspace
+* /s ignore symbols
+* /h print usage message
+* /H print language options
+* /i input-file input file
+* /o output-file output file
+* /u unicode file processing (not yet implemented)
+*
+*
+* Purpose:
+* -------
+*
+* nlssort does an locale-specific sort. By default, it reads its
+* input file from stdin and generates its sorted output to stdout.
+*
+* If no locale agrument is given, the sort uses the user default locale.
+* The locale agrument can be given either as an LCID hex value (e.g.,
+* 0x0409) or as a language code (e.g., ENU for American English).
+*
+*
+* Implementation Note:
+* -------------------
+*
+* Input file is currently limited to 16,384 lines of text.
+* WIN16 version of nlssort is also depends on olenls.dll.
+*
+*
+* To Do:
+* -----
+*
+* Need to make nlssort a portable win32s EXE.
+* Improve input buffering to handle larger input files.
+* Add Unicode input file support for WIN32.
+*
+*
+* Revision History:
+* ----------------
+*
+* [00] 29-Jun-93 tomteng: Created.
+*
+\*********************************************************************/
+
+
+//***********************
+// Imported Definitions
+//***********************
+
+#include <windows.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <string.h>
+#include <search.h>
+
+#ifdef WIN32
+#define MEMCPY memcpy
+#define STRCMP strcmp
+#define STRNICMP _strnicmp
+#else
+#include <olenls.h>
+#define MEMCPY _fmemcpy
+#define STRCMP _fstrcmp
+#define STRNICMP _fstrnicmp
+#endif
+
+
+//*****************************
+// Private Struct & Variables
+//*****************************
+
+struct LOCALEINFO {
+ LCID lcid;
+ char FAR* language;
+ char FAR* languageCode;
+};
+
+static LOCALEINFO g_language[] =
+{
+ {0x0403, "Catalan", "CAT"},
+ {0x0404, "Chinese (Traditional)", "CHT"},
+ {0x0804, "Chinese (Simplified)", "CHS"},
+ {0x0405, "Czech", "CSY"},
+ {0x0406, "Danish", "DAN"},
+ {0x0413, "Dutch (Standard)", "NLD"},
+ {0x0813, "Dutch (Belgian)", "NLB"},
+ {0x0409, "English (American)", "ENU"},
+ {0x0809, "English (British)", "ENG"},
+ {0x0c09, "English (Australian)", "ENA"},
+ {0x1009, "English (Canadian)", "ENC"},
+ {0x1409, "English (New Zealand)", "ENZ"},
+ {0x1809, "English (Ireland)", "ENI"},
+ {0x040b, "Finnish", "FIN"},
+ {0x040c, "French (Standard)", "FRA"},
+ {0x080c, "French (Belgian)", "FRB"},
+ {0x0c0c, "French (Canadian)", "FRC"},
+ {0x100c, "French (Swiss)", "FRS"},
+ {0x0407, "German (Standard)", "DEU"},
+ {0x0807, "German (Swiss)", "DES"},
+ {0x0c07, "German (Austrian)", "DEA"},
+ {0x0408, "Greek", "ELL"},
+ {0x040e, "Hungarian", "HUN"},
+ {0x040f, "Icelandic", "ISL"},
+ {0x0410, "Italian (Standard)", "ITA"},
+ {0x0810, "Italian (Swiss)", "ITS"},
+ {0x0411, "Japanese", "JPN"},
+ {0x0412, "Korean", "KOR"},
+ {0x0414, "Norwegian (Bokmal)", "NOR"},
+ {0x0814, "Norwegian (Nynorsk)", "NON"},
+ {0x0415, "Polish", "PLK"},
+ {0x0816, "Portuguese (Standard)", "PTG"},
+ {0x0416, "Portuguese (Brazilian)", "PTB"},
+ {0x0419, "Russian", "RUS"},
+ {0x041b, "Slovak", "SKY"},
+ {0x041D, "Swedish", "SVE"},
+ {0x040a, "Spanish (Traditional Sort)", "ESP"},
+ {0x080a, "Spanish (Mexican)", "ESM"},
+ {0x0c0a, "Spanish (Modern Sort)", "ESN"},
+ {0x041f, "Turkish", "TRK"},
+};
+
+
+LCID g_sortLCID = NULL;
+unsigned long g_sortFlag = NULL;
+unsigned int g_normalSortOrder = TRUE;
+
+#define DIM(X) (sizeof(X) / sizeof((X)[0]))
+
+
+//******************************************
+// Command Line Parsing Function (per XPG4)
+//******************************************
+
+char * optarg;
+int optind = 1;
+int opterr = 1;
+
+int getopt(int argc, char ** argv, char * optstring)
+{
+ static int sp = 1;
+ register c;
+ register char *cp;
+
+ if (sp == 1)
+ if (optind >= argc ||
+ !(argv[optind][0] == '/' || argv[optind][0] == '-') ||
+ argv[optind][1] == '\0')
+ return EOF;
+ else if (STRCMP(argv[optind], "--") == 0) {
+ optind++;
+ return EOF;
+ }
+ c = argv[optind][sp];
+ if ((cp=strchr(optstring, c)) == NULL ) {
+ if (opterr)
+ fprintf(stderr, "%s%s%c\n", argv[0], ": illegal option -- ", c);
+ else if (argv[optind][++sp] == '\0') {
+ optind++;
+ sp = 1;
+ }
+ return '?';
+ }
+ if (*++cp == ':') {
+ if (argv[optind][sp+1] != '\0')
+ optarg = &argv[optind++][sp+1];
+ else if (++optind >= argc) {
+ if (opterr)
+ fprintf(stderr,
+ "%s%s%c\n",
+ argv[0], ": option requires an argument -- ", c);
+ else
+ sp = 1;
+ return '?';
+ } else
+ optarg = argv[optind++];
+ sp = 1;
+ } else {
+ if (argv[optind][++sp] == '\0') {
+ sp = 1;
+ optind++;
+ }
+ optarg = NULL;
+ }
+ return c;
+}
+
+#ifndef WIN32 /* generated argv & argc from WinMain cmdline argument */
+void
+GetCmdLineArgs(LPSTR lpszCmdLine, int* argc, char *** argv)
+{
+ static char * argvArray[32];
+ int argCount = 1;
+ int i;
+ char c;
+ char buf[80];
+
+ argvArray[0] = "nlssort";
+
+ while (c = *lpszCmdLine++) {
+ if (c == ' ' || c =='\t')
+ continue;
+ i = 0;
+ do {
+ buf[i++] = c;
+ c = *lpszCmdLine++;
+ } while (!(c == ' ' || c == '\t' || c == 0));
+ buf[i] = NULL;
+ argvArray[argCount++] =
+ (char FAR*) MEMCPY(new FAR char[i+1], buf, i+1);
+ if (c == 0)
+ break;
+ }
+ *argv = argvArray;
+ *argc = argCount;
+}
+#endif
+
+//******************
+// Usage Statement
+//******************
+
+void PrintUsage()
+{
+ FILE *messageFile = stdout;
+
+ fprintf(messageFile, "\n");
+ fprintf(messageFile, "nlssort [/l lcid] [/r] [/c] [/n] [/s] [/h] [/H]\n"
+ " [/i input-file] [/o output-file] "
+ "[< input-file > output-file]\n\n");
+ fprintf(messageFile, " /l lcid lcid used for sort where lcid can"
+ " be either a\n "
+ "hex lcid value or a language code"
+ "\n");
+ fprintf(messageFile, " /i inputfile input file\n");
+ fprintf(messageFile, " /o outputfile output file\n");
+ fprintf(messageFile, " /r reverse order sort\n");
+ fprintf(messageFile, " /c ignore case\n");
+ fprintf(messageFile, " /n ignore nonspace\n");
+ fprintf(messageFile, " /s ignore symbols\n");
+ fprintf(messageFile, " /h print usage message\n");
+ fprintf(messageFile, " /H print lcid options\n");
+
+ exit(0);
+}
+
+void PrintLCID()
+{
+ int i;
+ FILE *messageFile = stdout;
+
+ fprintf(messageFile, "\n");
+ fprintf(messageFile, "%-30s %6s %3s\n",
+ "LANGUAGE", "LCID", "Language Code");
+ fprintf(messageFile, "%-30s %8s %3s\n",
+ "--------", "------", "-------------");
+ for (i = 0; i < DIM(g_language); i++)
+ fprintf(messageFile, "%-30s 0x%04x %3s\n",
+ g_language[i].language,
+ g_language[i].lcid,
+ g_language[i].languageCode);
+ fprintf(messageFile, "\n");
+ exit(0);
+}
+
+
+//**********************
+// Comparsion Function
+//**********************
+
+
+int Compare(const void *str1, const void *str2)
+{
+ int result;
+
+ // Return the result of CompareStringA minus 2 to adjust for
+ // different return result needed by qsort:
+ //
+ // str1 < str2 CompareStringA returns: 1, need to return: -1
+ // str1 == str2 CompareStringA returns: 2, need to return: 0
+ // str1 > str2 CompareStringA returns: 3, need to return: 1
+ //
+
+ //fprintf(stderr, "str1: %s, str2: %s\n", * (char**) str1, * (char**)str2);
+ result = CompareStringA(g_sortLCID,
+ g_sortFlag,
+ *(char FAR* FAR*) str1, -1,
+ *(char FAR* FAR*) str2, -1);
+
+ if (result == 0) {
+ fprintf(stderr, "NLS Sort failed "
+ "(Probably due to non-installed locale)\n");
+ exit(1);
+ }
+ return (g_normalSortOrder ? (result-2) : (result-2) * -1);
+}
+
+
+//***************
+// Main Program
+//***************
+
+
+#ifdef WIN32
+extern "C"
+int main(int argc, char **argv)
+#else
+extern "C"
+int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
+ LPSTR lpszCmdLine, int nCmdShow )
+#endif
+{
+ unsigned int i, len;
+ char c;
+
+ const UINT MAXARRAYSIZE = 16384;
+ static char FAR* sortArray[MAXARRAYSIZE];
+ UINT elementCount = 0;
+ char buf[256];
+
+ FILE *inFile = stdin;
+ FILE *outFile = stdout;
+
+
+#ifndef WIN32
+ int argc;
+ char ** argv;
+
+ (hInstance, hPrevInstance, nCmdShow); // UNUSED
+ GetCmdLineArgs(lpszCmdLine, &argc, &argv);
+#endif
+
+
+ //*********************************
+ // Default to user default locale
+ //*********************************
+ g_sortLCID = GetUserDefaultLCID();
+
+
+ //*******************
+ // Parse command line
+ //*******************
+ while((c=getopt(argc, argv, "l:i:o:cnsrHh")) != EOF)
+ switch(c) {
+ case 'l':
+ g_sortLCID = NULL;
+ if (STRNICMP(optarg, "0x", 2) == 0) {
+ sscanf(optarg, "%x", &g_sortLCID);
+ } else {
+ for (i = 0; i < DIM(g_language); i++)
+ if (lstrcmpi(optarg, g_language[i].languageCode) == 0) {
+ g_sortLCID = g_language[i].lcid;
+ break;
+ }
+ }
+ //fprintf(stderr, "LCID: 0x%04x\n", g_sortLCID);
+ if (g_sortLCID == NULL) {
+ fprintf(stderr, "Invalid LCID specified: %s\n", optarg);
+ PrintLCID();
+ }
+ break;
+ case 'c':
+ g_sortFlag |= NORM_IGNORECASE;
+ break;
+ case 'n':
+ g_sortFlag |= NORM_IGNORENONSPACE;
+ break;
+ case 's':
+ g_sortFlag |= NORM_IGNORESYMBOLS;
+ break;
+ case 'r':
+ g_normalSortOrder = FALSE;
+ break;
+ case 'i':
+ inFile = fopen(optarg, "r");
+ if (inFile == NULL) {
+ fprintf(stderr, "Can't open input file: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ case 'o':
+ outFile = fopen(optarg, "w");
+ if (outFile == NULL) {
+ fprintf(stderr, "Can't open output file: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ case 'H':
+ PrintLCID();
+ break;
+ case 'h':
+ case '?':
+ PrintUsage();
+ break;
+ }
+
+ //***********************************
+ // Read input data from standard-in
+ //***********************************
+
+ i = 0;
+ while ((c = getc(inFile)) != EOF) {
+ if (c != '\n')
+ buf[i++] = c;
+ else if (i != 0) {
+ buf[i] = NULL;
+ len = strlen(buf)+1;
+ sortArray[elementCount++] =
+ (char FAR*) MEMCPY(new FAR char[len], buf, len);
+ i = 0;
+ }
+ }
+ if (inFile != stdin)
+ fclose(inFile);
+
+ //**************************************
+ // Sort data using Quicksort alogrithm
+ //**************************************
+ qsort( (void*) &sortArray, (size_t) elementCount, sizeof(char*), Compare);
+
+
+ //************************************
+ // Write sorted data to standard-out
+ //************************************
+ for (i = 0; i < elementCount; i++)
+ fprintf(outFile, "%s\n", sortArray[i]);
+ if(outFile != stdout)
+ fclose(outFile);
+
+ return(TRUE);
+}
diff --git a/private/oleauto/sample/nlssort/nlssort.def b/private/oleauto/sample/nlssort/nlssort.def
new file mode 100644
index 000000000..bf0d306e7
--- /dev/null
+++ b/private/oleauto/sample/nlssort/nlssort.def
@@ -0,0 +1,18 @@
+name nlssort
+
+exetype windows
+code preload moveable discardable
+data preload moveable multiple
+
+heapsize 1024
+stacksize 16384
+
+IMPORTS
+ GetUserDefaultLCID = ole2nls.1
+ GetSystemDefaultLCID = ole2nls.2
+ GetUserDefaultLangID = ole2nls.3
+ GetSystemDefaultLangID = ole2nls.4
+ GetLocaleInfoA = ole2nls.5
+ LCMapStringA = ole2nls.6
+ GetStringTypeA = ole2nls.7
+ CompareStringA = ole2nls.8
diff --git a/private/oleauto/sample/nlssort/result.chs b/private/oleauto/sample/nlssort/result.chs
new file mode 100644
index 000000000..e6825ad42
--- /dev/null
+++ b/private/oleauto/sample/nlssort/result.chs
@@ -0,0 +1,6763 @@
+°¡ 0xb0a1
+°¢ 0xb0a2
+°£ 0xb0a3
+°¤ 0xb0a4
+°¥ 0xb0a5
+°¦ 0xb0a6
+°§ 0xb0a7
+°¨ 0xb0a8
+°© 0xb0a9
+°ª 0xb0aa
+°« 0xb0ab
+°¬ 0xb0ac
+°­ 0xb0ad
+°® 0xb0ae
+°¯ 0xb0af
+°° 0xb0b0
+°± 0xb0b1
+°² 0xb0b2
+°³ 0xb0b3
+°´ 0xb0b4
+°µ 0xb0b5
+°¶ 0xb0b6
+°· 0xb0b7
+°¸ 0xb0b8
+°¹ 0xb0b9
+°º 0xb0ba
+°» 0xb0bb
+°¼ 0xb0bc
+°½ 0xb0bd
+°¾ 0xb0be
+°¿ 0xb0bf
+°À 0xb0c0
+°Á 0xb0c1
+°Â 0xb0c2
+°Ã 0xb0c3
+°Ä 0xb0c4
+°Å 0xb0c5
+°Æ 0xb0c6
+°Ç 0xb0c7
+°È 0xb0c8
+°É 0xb0c9
+°Ê 0xb0ca
+°Ë 0xb0cb
+°Ì 0xb0cc
+°Í 0xb0cd
+°Î 0xb0ce
+°Ï 0xb0cf
+°Ð 0xb0d0
+°Ñ 0xb0d1
+°Ò 0xb0d2
+°Ó 0xb0d3
+°Ô 0xb0d4
+°Õ 0xb0d5
+°Ö 0xb0d6
+°× 0xb0d7
+°Ø 0xb0d8
+°Ù 0xb0d9
+°Ú 0xb0da
+°Û 0xb0db
+°Ü 0xb0dc
+°Ý 0xb0dd
+°Þ 0xb0de
+°ß 0xb0df
+°à 0xb0e0
+°á 0xb0e1
+°â 0xb0e2
+°ã 0xb0e3
+°ä 0xb0e4
+°å 0xb0e5
+°æ 0xb0e6
+°ç 0xb0e7
+°è 0xb0e8
+°é 0xb0e9
+°ê 0xb0ea
+°ë 0xb0eb
+°ì 0xb0ec
+°í 0xb0ed
+°î 0xb0ee
+°ï 0xb0ef
+°ð 0xb0f0
+°ñ 0xb0f1
+°ò 0xb0f2
+°ó 0xb0f3
+°ô 0xb0f4
+°õ 0xb0f5
+°ö 0xb0f6
+°÷ 0xb0f7
+°ø 0xb0f8
+°ù 0xb0f9
+°ú 0xb0fa
+°û 0xb0fb
+°ü 0xb0fc
+°ý 0xb0fd
+°þ 0xb0fe
+±¡ 0xb1a1
+±¢ 0xb1a2
+±£ 0xb1a3
+±¤ 0xb1a4
+±¥ 0xb1a5
+±¦ 0xb1a6
+±§ 0xb1a7
+±¨ 0xb1a8
+±© 0xb1a9
+±ª 0xb1aa
+±« 0xb1ab
+±¬ 0xb1ac
+±­ 0xb1ad
+±® 0xb1ae
+±¯ 0xb1af
+±° 0xb1b0
+±± 0xb1b1
+±² 0xb1b2
+±³ 0xb1b3
+±´ 0xb1b4
+±µ 0xb1b5
+±¶ 0xb1b6
+±· 0xb1b7
+±¸ 0xb1b8
+±¹ 0xb1b9
+±º 0xb1ba
+±» 0xb1bb
+±¼ 0xb1bc
+±½ 0xb1bd
+±¾ 0xb1be
+±¿ 0xb1bf
+±À 0xb1c0
+±Á 0xb1c1
+±Â 0xb1c2
+±Ã 0xb1c3
+±Ä 0xb1c4
+±Å 0xb1c5
+±Æ 0xb1c6
+±Ç 0xb1c7
+±È 0xb1c8
+±É 0xb1c9
+±Ê 0xb1ca
+±Ë 0xb1cb
+±Ì 0xb1cc
+±Í 0xb1cd
+±Î 0xb1ce
+±Ï 0xb1cf
+±Ð 0xb1d0
+±Ñ 0xb1d1
+±Ò 0xb1d2
+±Ó 0xb1d3
+±Ô 0xb1d4
+±Õ 0xb1d5
+±Ö 0xb1d6
+±× 0xb1d7
+±Ø 0xb1d8
+±Ù 0xb1d9
+±Ú 0xb1da
+±Û 0xb1db
+±Ü 0xb1dc
+±Ý 0xb1dd
+±Þ 0xb1de
+±ß 0xb1df
+±à 0xb1e0
+±á 0xb1e1
+±â 0xb1e2
+±ã 0xb1e3
+±ä 0xb1e4
+±å 0xb1e5
+±æ 0xb1e6
+±ç 0xb1e7
+±è 0xb1e8
+±é 0xb1e9
+±ê 0xb1ea
+±ë 0xb1eb
+±ì 0xb1ec
+±í 0xb1ed
+±î 0xb1ee
+±ï 0xb1ef
+±ð 0xb1f0
+±ñ 0xb1f1
+±ò 0xb1f2
+±ó 0xb1f3
+±ô 0xb1f4
+±õ 0xb1f5
+±ö 0xb1f6
+±÷ 0xb1f7
+±ø 0xb1f8
+±ù 0xb1f9
+±ú 0xb1fa
+±û 0xb1fb
+±ü 0xb1fc
+±ý 0xb1fd
+±þ 0xb1fe
+²¡ 0xb2a1
+²¢ 0xb2a2
+²£ 0xb2a3
+²¤ 0xb2a4
+²¥ 0xb2a5
+²¦ 0xb2a6
+²§ 0xb2a7
+²¨ 0xb2a8
+²© 0xb2a9
+²ª 0xb2aa
+²« 0xb2ab
+²¬ 0xb2ac
+²­ 0xb2ad
+²® 0xb2ae
+²¯ 0xb2af
+²° 0xb2b0
+²± 0xb2b1
+²² 0xb2b2
+²³ 0xb2b3
+²´ 0xb2b4
+²µ 0xb2b5
+²¶ 0xb2b6
+²· 0xb2b7
+²¸ 0xb2b8
+²¹ 0xb2b9
+²º 0xb2ba
+²» 0xb2bb
+²¼ 0xb2bc
+²½ 0xb2bd
+²¾ 0xb2be
+²¿ 0xb2bf
+²À 0xb2c0
+²Á 0xb2c1
+²Â 0xb2c2
+²Ã 0xb2c3
+²Ä 0xb2c4
+²Å 0xb2c5
+²Æ 0xb2c6
+²Ç 0xb2c7
+²È 0xb2c8
+²É 0xb2c9
+²Ê 0xb2ca
+²Ë 0xb2cb
+²Ì 0xb2cc
+²Í 0xb2cd
+²Î 0xb2ce
+²Ï 0xb2cf
+²Ð 0xb2d0
+²Ñ 0xb2d1
+²Ò 0xb2d2
+²Ó 0xb2d3
+²Ô 0xb2d4
+²Õ 0xb2d5
+²Ö 0xb2d6
+²× 0xb2d7
+²Ø 0xb2d8
+²Ù 0xb2d9
+²Ú 0xb2da
+²Û 0xb2db
+²Ü 0xb2dc
+²Ý 0xb2dd
+²Þ 0xb2de
+²ß 0xb2df
+²à 0xb2e0
+²á 0xb2e1
+²â 0xb2e2
+²ã 0xb2e3
+²ä 0xb2e4
+²å 0xb2e5
+²æ 0xb2e6
+²ç 0xb2e7
+²è 0xb2e8
+²é 0xb2e9
+²ê 0xb2ea
+²ë 0xb2eb
+²ì 0xb2ec
+²í 0xb2ed
+²î 0xb2ee
+²ï 0xb2ef
+²ð 0xb2f0
+²ñ 0xb2f1
+²ò 0xb2f2
+²ó 0xb2f3
+²ô 0xb2f4
+²õ 0xb2f5
+²ö 0xb2f6
+²÷ 0xb2f7
+²ø 0xb2f8
+²ù 0xb2f9
+²ú 0xb2fa
+²û 0xb2fb
+²ü 0xb2fc
+²ý 0xb2fd
+²þ 0xb2fe
+³¡ 0xb3a1
+³¢ 0xb3a2
+³£ 0xb3a3
+³¤ 0xb3a4
+³¥ 0xb3a5
+³¦ 0xb3a6
+³§ 0xb3a7
+³¨ 0xb3a8
+³© 0xb3a9
+³ª 0xb3aa
+³« 0xb3ab
+³¬ 0xb3ac
+³­ 0xb3ad
+³® 0xb3ae
+³¯ 0xb3af
+³° 0xb3b0
+³± 0xb3b1
+³² 0xb3b2
+³³ 0xb3b3
+³´ 0xb3b4
+³µ 0xb3b5
+³¶ 0xb3b6
+³· 0xb3b7
+³¸ 0xb3b8
+³¹ 0xb3b9
+³º 0xb3ba
+³» 0xb3bb
+³¼ 0xb3bc
+³½ 0xb3bd
+³¾ 0xb3be
+³¿ 0xb3bf
+³À 0xb3c0
+³Á 0xb3c1
+³Â 0xb3c2
+³Ã 0xb3c3
+³Ä 0xb3c4
+³Å 0xb3c5
+³Æ 0xb3c6
+³Ç 0xb3c7
+³È 0xb3c8
+³É 0xb3c9
+³Ê 0xb3ca
+³Ë 0xb3cb
+³Ì 0xb3cc
+³Í 0xb3cd
+³Î 0xb3ce
+³Ï 0xb3cf
+³Ð 0xb3d0
+³Ñ 0xb3d1
+³Ò 0xb3d2
+³Ó 0xb3d3
+³Ô 0xb3d4
+³Õ 0xb3d5
+³Ö 0xb3d6
+³× 0xb3d7
+³Ø 0xb3d8
+³Ù 0xb3d9
+³Ú 0xb3da
+³Û 0xb3db
+³Ü 0xb3dc
+³Ý 0xb3dd
+³Þ 0xb3de
+³ß 0xb3df
+³à 0xb3e0
+³á 0xb3e1
+³â 0xb3e2
+³ã 0xb3e3
+³ä 0xb3e4
+³å 0xb3e5
+³æ 0xb3e6
+³ç 0xb3e7
+³è 0xb3e8
+³é 0xb3e9
+³ê 0xb3ea
+³ë 0xb3eb
+³ì 0xb3ec
+³í 0xb3ed
+³î 0xb3ee
+³ï 0xb3ef
+³ð 0xb3f0
+³ñ 0xb3f1
+³ò 0xb3f2
+³ó 0xb3f3
+³ô 0xb3f4
+³õ 0xb3f5
+³ö 0xb3f6
+³÷ 0xb3f7
+³ø 0xb3f8
+³ù 0xb3f9
+³ú 0xb3fa
+³û 0xb3fb
+³ü 0xb3fc
+³ý 0xb3fd
+³þ 0xb3fe
+´¡ 0xb4a1
+´¢ 0xb4a2
+´£ 0xb4a3
+´¤ 0xb4a4
+´¥ 0xb4a5
+´¦ 0xb4a6
+´§ 0xb4a7
+´¨ 0xb4a8
+´© 0xb4a9
+´ª 0xb4aa
+´« 0xb4ab
+´¬ 0xb4ac
+´­ 0xb4ad
+´® 0xb4ae
+´¯ 0xb4af
+´° 0xb4b0
+´± 0xb4b1
+´² 0xb4b2
+´³ 0xb4b3
+´´ 0xb4b4
+´µ 0xb4b5
+´¶ 0xb4b6
+´· 0xb4b7
+´¸ 0xb4b8
+´¹ 0xb4b9
+´º 0xb4ba
+´» 0xb4bb
+´¼ 0xb4bc
+´½ 0xb4bd
+´¾ 0xb4be
+´¿ 0xb4bf
+´À 0xb4c0
+´Á 0xb4c1
+´Â 0xb4c2
+´Ã 0xb4c3
+´Ä 0xb4c4
+´Å 0xb4c5
+´Æ 0xb4c6
+´Ç 0xb4c7
+´È 0xb4c8
+´É 0xb4c9
+´Ê 0xb4ca
+´Ë 0xb4cb
+´Ì 0xb4cc
+´Í 0xb4cd
+´Î 0xb4ce
+´Ï 0xb4cf
+´Ð 0xb4d0
+´Ñ 0xb4d1
+´Ò 0xb4d2
+´Ó 0xb4d3
+´Ô 0xb4d4
+´Õ 0xb4d5
+´Ö 0xb4d6
+´× 0xb4d7
+´Ø 0xb4d8
+´Ù 0xb4d9
+´Ú 0xb4da
+´Û 0xb4db
+´Ü 0xb4dc
+´Ý 0xb4dd
+´Þ 0xb4de
+´ß 0xb4df
+´à 0xb4e0
+´á 0xb4e1
+´â 0xb4e2
+´ã 0xb4e3
+´ä 0xb4e4
+´å 0xb4e5
+´æ 0xb4e6
+´ç 0xb4e7
+´è 0xb4e8
+´é 0xb4e9
+´ê 0xb4ea
+´ë 0xb4eb
+´ì 0xb4ec
+´í 0xb4ed
+´î 0xb4ee
+´ï 0xb4ef
+´ð 0xb4f0
+´ñ 0xb4f1
+´ò 0xb4f2
+´ó 0xb4f3
+´ô 0xb4f4
+´õ 0xb4f5
+´ö 0xb4f6
+´÷ 0xb4f7
+´ø 0xb4f8
+´ù 0xb4f9
+´ú 0xb4fa
+´û 0xb4fb
+´ü 0xb4fc
+´ý 0xb4fd
+´þ 0xb4fe
+µ¡ 0xb5a1
+µ¢ 0xb5a2
+µ£ 0xb5a3
+µ¤ 0xb5a4
+µ¥ 0xb5a5
+µ¦ 0xb5a6
+µ§ 0xb5a7
+µ¨ 0xb5a8
+µ© 0xb5a9
+µª 0xb5aa
+µ« 0xb5ab
+µ¬ 0xb5ac
+µ­ 0xb5ad
+µ® 0xb5ae
+µ¯ 0xb5af
+µ° 0xb5b0
+µ± 0xb5b1
+µ² 0xb5b2
+µ³ 0xb5b3
+µ´ 0xb5b4
+µµ 0xb5b5
+µ¶ 0xb5b6
+µ· 0xb5b7
+µ¸ 0xb5b8
+µ¹ 0xb5b9
+µº 0xb5ba
+µ» 0xb5bb
+µ¼ 0xb5bc
+µ½ 0xb5bd
+µ¾ 0xb5be
+µ¿ 0xb5bf
+µÀ 0xb5c0
+µÁ 0xb5c1
+µÂ 0xb5c2
+µÃ 0xb5c3
+µÄ 0xb5c4
+µÅ 0xb5c5
+µÆ 0xb5c6
+µÇ 0xb5c7
+µÈ 0xb5c8
+µÉ 0xb5c9
+µÊ 0xb5ca
+µË 0xb5cb
+µÌ 0xb5cc
+µÍ 0xb5cd
+µÎ 0xb5ce
+µÏ 0xb5cf
+µÐ 0xb5d0
+µÑ 0xb5d1
+µÒ 0xb5d2
+µÓ 0xb5d3
+µÔ 0xb5d4
+µÕ 0xb5d5
+µÖ 0xb5d6
+µ× 0xb5d7
+µØ 0xb5d8
+µÙ 0xb5d9
+µÚ 0xb5da
+µÛ 0xb5db
+µÜ 0xb5dc
+µÝ 0xb5dd
+µÞ 0xb5de
+µß 0xb5df
+µà 0xb5e0
+µá 0xb5e1
+µâ 0xb5e2
+µã 0xb5e3
+µä 0xb5e4
+µå 0xb5e5
+µæ 0xb5e6
+µç 0xb5e7
+µè 0xb5e8
+µé 0xb5e9
+µê 0xb5ea
+µë 0xb5eb
+µì 0xb5ec
+µí 0xb5ed
+µî 0xb5ee
+µï 0xb5ef
+µð 0xb5f0
+µñ 0xb5f1
+µò 0xb5f2
+µó 0xb5f3
+µô 0xb5f4
+µõ 0xb5f5
+µö 0xb5f6
+µ÷ 0xb5f7
+µø 0xb5f8
+µù 0xb5f9
+µú 0xb5fa
+µû 0xb5fb
+µü 0xb5fc
+µý 0xb5fd
+µþ 0xb5fe
+¶¡ 0xb6a1
+¶¢ 0xb6a2
+¶£ 0xb6a3
+¶¤ 0xb6a4
+¶¥ 0xb6a5
+¶¦ 0xb6a6
+¶§ 0xb6a7
+¶¨ 0xb6a8
+¶© 0xb6a9
+¶ª 0xb6aa
+¶« 0xb6ab
+¶¬ 0xb6ac
+¶­ 0xb6ad
+¶® 0xb6ae
+¶¯ 0xb6af
+¶° 0xb6b0
+¶± 0xb6b1
+¶² 0xb6b2
+¶³ 0xb6b3
+¶´ 0xb6b4
+¶µ 0xb6b5
+¶¶ 0xb6b6
+¶· 0xb6b7
+¶¸ 0xb6b8
+¶¹ 0xb6b9
+¶º 0xb6ba
+¶» 0xb6bb
+¶¼ 0xb6bc
+¶½ 0xb6bd
+¶¾ 0xb6be
+¶¿ 0xb6bf
+¶À 0xb6c0
+¶Á 0xb6c1
+¶Â 0xb6c2
+¶Ã 0xb6c3
+¶Ä 0xb6c4
+¶Å 0xb6c5
+¶Æ 0xb6c6
+¶Ç 0xb6c7
+¶È 0xb6c8
+¶É 0xb6c9
+¶Ê 0xb6ca
+¶Ë 0xb6cb
+¶Ì 0xb6cc
+¶Í 0xb6cd
+¶Î 0xb6ce
+¶Ï 0xb6cf
+¶Ð 0xb6d0
+¶Ñ 0xb6d1
+¶Ò 0xb6d2
+¶Ó 0xb6d3
+¶Ô 0xb6d4
+¶Õ 0xb6d5
+¶Ö 0xb6d6
+¶× 0xb6d7
+¶Ø 0xb6d8
+¶Ù 0xb6d9
+¶Ú 0xb6da
+¶Û 0xb6db
+¶Ü 0xb6dc
+¶Ý 0xb6dd
+¶Þ 0xb6de
+¶ß 0xb6df
+¶à 0xb6e0
+¶á 0xb6e1
+¶â 0xb6e2
+¶ã 0xb6e3
+¶ä 0xb6e4
+¶å 0xb6e5
+¶æ 0xb6e6
+¶ç 0xb6e7
+¶è 0xb6e8
+¶é 0xb6e9
+¶ê 0xb6ea
+¶ë 0xb6eb
+¶ì 0xb6ec
+¶í 0xb6ed
+¶î 0xb6ee
+¶ï 0xb6ef
+¶ð 0xb6f0
+¶ñ 0xb6f1
+¶ò 0xb6f2
+¶ó 0xb6f3
+¶ô 0xb6f4
+¶õ 0xb6f5
+¶ö 0xb6f6
+¶÷ 0xb6f7
+¶ø 0xb6f8
+¶ù 0xb6f9
+¶ú 0xb6fa
+¶û 0xb6fb
+¶ü 0xb6fc
+¶ý 0xb6fd
+¶þ 0xb6fe
+·¡ 0xb7a1
+·¢ 0xb7a2
+·£ 0xb7a3
+·¤ 0xb7a4
+·¥ 0xb7a5
+·¦ 0xb7a6
+·§ 0xb7a7
+·¨ 0xb7a8
+·© 0xb7a9
+·ª 0xb7aa
+·« 0xb7ab
+·¬ 0xb7ac
+·­ 0xb7ad
+·® 0xb7ae
+·¯ 0xb7af
+·° 0xb7b0
+·± 0xb7b1
+·² 0xb7b2
+·³ 0xb7b3
+·´ 0xb7b4
+·µ 0xb7b5
+·¶ 0xb7b6
+·· 0xb7b7
+·¸ 0xb7b8
+·¹ 0xb7b9
+·º 0xb7ba
+·» 0xb7bb
+·¼ 0xb7bc
+·½ 0xb7bd
+·¾ 0xb7be
+·¿ 0xb7bf
+·À 0xb7c0
+·Á 0xb7c1
+·Â 0xb7c2
+·Ã 0xb7c3
+·Ä 0xb7c4
+·Å 0xb7c5
+·Æ 0xb7c6
+·Ç 0xb7c7
+·È 0xb7c8
+·É 0xb7c9
+·Ê 0xb7ca
+·Ë 0xb7cb
+·Ì 0xb7cc
+·Í 0xb7cd
+·Î 0xb7ce
+·Ï 0xb7cf
+·Ð 0xb7d0
+·Ñ 0xb7d1
+·Ò 0xb7d2
+·Ó 0xb7d3
+·Ô 0xb7d4
+·Õ 0xb7d5
+·Ö 0xb7d6
+·× 0xb7d7
+·Ø 0xb7d8
+·Ù 0xb7d9
+·Ú 0xb7da
+·Û 0xb7db
+·Ü 0xb7dc
+·Ý 0xb7dd
+·Þ 0xb7de
+·ß 0xb7df
+·à 0xb7e0
+·á 0xb7e1
+·â 0xb7e2
+·ã 0xb7e3
+·ä 0xb7e4
+·å 0xb7e5
+·æ 0xb7e6
+·ç 0xb7e7
+·è 0xb7e8
+·é 0xb7e9
+·ê 0xb7ea
+·ë 0xb7eb
+·ì 0xb7ec
+·í 0xb7ed
+·î 0xb7ee
+·ï 0xb7ef
+·ð 0xb7f0
+·ñ 0xb7f1
+·ò 0xb7f2
+·ó 0xb7f3
+·ô 0xb7f4
+·õ 0xb7f5
+·ö 0xb7f6
+·÷ 0xb7f7
+·ø 0xb7f8
+·ù 0xb7f9
+·ú 0xb7fa
+·û 0xb7fb
+·ü 0xb7fc
+·ý 0xb7fd
+·þ 0xb7fe
+¸¡ 0xb8a1
+¸¢ 0xb8a2
+¸£ 0xb8a3
+¸¤ 0xb8a4
+¸¥ 0xb8a5
+¸¦ 0xb8a6
+¸§ 0xb8a7
+¸¨ 0xb8a8
+¸© 0xb8a9
+¸ª 0xb8aa
+¸« 0xb8ab
+¸¬ 0xb8ac
+¸­ 0xb8ad
+¸® 0xb8ae
+¸¯ 0xb8af
+¸° 0xb8b0
+¸± 0xb8b1
+¸² 0xb8b2
+¸³ 0xb8b3
+¸´ 0xb8b4
+¸µ 0xb8b5
+¸¶ 0xb8b6
+¸· 0xb8b7
+¸¸ 0xb8b8
+¸¹ 0xb8b9
+¸º 0xb8ba
+¸» 0xb8bb
+¸¼ 0xb8bc
+¸½ 0xb8bd
+¸¾ 0xb8be
+¸¿ 0xb8bf
+¸À 0xb8c0
+¸Á 0xb8c1
+¸Â 0xb8c2
+¸Ã 0xb8c3
+¸Ä 0xb8c4
+¸Å 0xb8c5
+¸Æ 0xb8c6
+¸Ç 0xb8c7
+¸È 0xb8c8
+¸É 0xb8c9
+¸Ê 0xb8ca
+¸Ë 0xb8cb
+¸Ì 0xb8cc
+¸Í 0xb8cd
+¸Î 0xb8ce
+¸Ï 0xb8cf
+¸Ð 0xb8d0
+¸Ñ 0xb8d1
+¸Ò 0xb8d2
+¸Ó 0xb8d3
+¸Ô 0xb8d4
+¸Õ 0xb8d5
+¸Ö 0xb8d6
+¸× 0xb8d7
+¸Ø 0xb8d8
+¸Ù 0xb8d9
+¸Ú 0xb8da
+¸Û 0xb8db
+¸Ü 0xb8dc
+¸Ý 0xb8dd
+¸Þ 0xb8de
+¸ß 0xb8df
+¸à 0xb8e0
+¸á 0xb8e1
+¸â 0xb8e2
+¸ã 0xb8e3
+¸ä 0xb8e4
+¸å 0xb8e5
+¸æ 0xb8e6
+¸ç 0xb8e7
+¸è 0xb8e8
+¸é 0xb8e9
+¸ê 0xb8ea
+¸ë 0xb8eb
+¸ì 0xb8ec
+¸í 0xb8ed
+¸î 0xb8ee
+¸ï 0xb8ef
+¸ð 0xb8f0
+¸ñ 0xb8f1
+¸ò 0xb8f2
+¸ó 0xb8f3
+¸ô 0xb8f4
+¸õ 0xb8f5
+¸ö 0xb8f6
+¸÷ 0xb8f7
+¸ø 0xb8f8
+¸ù 0xb8f9
+¸ú 0xb8fa
+¸û 0xb8fb
+¸ü 0xb8fc
+¸ý 0xb8fd
+¸þ 0xb8fe
+¹¡ 0xb9a1
+¹¢ 0xb9a2
+¹£ 0xb9a3
+¹¤ 0xb9a4
+¹¥ 0xb9a5
+¹¦ 0xb9a6
+¹§ 0xb9a7
+¹¨ 0xb9a8
+¹© 0xb9a9
+¹ª 0xb9aa
+¹« 0xb9ab
+¹¬ 0xb9ac
+¹­ 0xb9ad
+¹® 0xb9ae
+¹¯ 0xb9af
+¹° 0xb9b0
+¹± 0xb9b1
+¹² 0xb9b2
+¹³ 0xb9b3
+¹´ 0xb9b4
+¹µ 0xb9b5
+¹¶ 0xb9b6
+¹· 0xb9b7
+¹¸ 0xb9b8
+¹¹ 0xb9b9
+¹º 0xb9ba
+¹» 0xb9bb
+¹¼ 0xb9bc
+¹½ 0xb9bd
+¹¾ 0xb9be
+¹¿ 0xb9bf
+¹À 0xb9c0
+¹Á 0xb9c1
+¹Â 0xb9c2
+¹Ã 0xb9c3
+¹Ä 0xb9c4
+¹Å 0xb9c5
+¹Æ 0xb9c6
+¹Ç 0xb9c7
+¹È 0xb9c8
+¹É 0xb9c9
+¹Ê 0xb9ca
+¹Ë 0xb9cb
+¹Ì 0xb9cc
+¹Í 0xb9cd
+¹Î 0xb9ce
+¹Ï 0xb9cf
+¹Ð 0xb9d0
+¹Ñ 0xb9d1
+¹Ò 0xb9d2
+¹Ó 0xb9d3
+¹Ô 0xb9d4
+¹Õ 0xb9d5
+¹Ö 0xb9d6
+¹× 0xb9d7
+¹Ø 0xb9d8
+¹Ù 0xb9d9
+¹Ú 0xb9da
+¹Û 0xb9db
+¹Ü 0xb9dc
+¹Ý 0xb9dd
+¹Þ 0xb9de
+¹ß 0xb9df
+¹à 0xb9e0
+¹á 0xb9e1
+¹â 0xb9e2
+¹ã 0xb9e3
+¹ä 0xb9e4
+¹å 0xb9e5
+¹æ 0xb9e6
+¹ç 0xb9e7
+¹è 0xb9e8
+¹é 0xb9e9
+¹ê 0xb9ea
+¹ë 0xb9eb
+¹ì 0xb9ec
+¹í 0xb9ed
+¹î 0xb9ee
+¹ï 0xb9ef
+¹ð 0xb9f0
+¹ñ 0xb9f1
+¹ò 0xb9f2
+¹ó 0xb9f3
+¹ô 0xb9f4
+¹õ 0xb9f5
+¹ö 0xb9f6
+¹÷ 0xb9f7
+¹ø 0xb9f8
+¹ù 0xb9f9
+¹ú 0xb9fa
+¹û 0xb9fb
+¹ü 0xb9fc
+¹ý 0xb9fd
+¹þ 0xb9fe
+º¡ 0xbaa1
+º¢ 0xbaa2
+º£ 0xbaa3
+º¤ 0xbaa4
+º¥ 0xbaa5
+º¦ 0xbaa6
+º§ 0xbaa7
+º¨ 0xbaa8
+º© 0xbaa9
+ºª 0xbaaa
+º« 0xbaab
+º¬ 0xbaac
+º­ 0xbaad
+º® 0xbaae
+º¯ 0xbaaf
+º° 0xbab0
+º± 0xbab1
+º² 0xbab2
+º³ 0xbab3
+º´ 0xbab4
+ºµ 0xbab5
+º¶ 0xbab6
+º· 0xbab7
+º¸ 0xbab8
+º¹ 0xbab9
+ºº 0xbaba
+º» 0xbabb
+º¼ 0xbabc
+º½ 0xbabd
+º¾ 0xbabe
+º¿ 0xbabf
+ºÀ 0xbac0
+ºÁ 0xbac1
+ºÂ 0xbac2
+ºÃ 0xbac3
+ºÄ 0xbac4
+ºÅ 0xbac5
+ºÆ 0xbac6
+ºÇ 0xbac7
+ºÈ 0xbac8
+ºÉ 0xbac9
+ºÊ 0xbaca
+ºË 0xbacb
+ºÌ 0xbacc
+ºÍ 0xbacd
+ºÎ 0xbace
+ºÏ 0xbacf
+ºÐ 0xbad0
+ºÑ 0xbad1
+ºÒ 0xbad2
+ºÓ 0xbad3
+ºÔ 0xbad4
+ºÕ 0xbad5
+ºÖ 0xbad6
+º× 0xbad7
+ºØ 0xbad8
+ºÙ 0xbad9
+ºÚ 0xbada
+ºÛ 0xbadb
+ºÜ 0xbadc
+ºÝ 0xbadd
+ºÞ 0xbade
+ºß 0xbadf
+ºà 0xbae0
+ºá 0xbae1
+ºâ 0xbae2
+ºã 0xbae3
+ºä 0xbae4
+ºå 0xbae5
+ºæ 0xbae6
+ºç 0xbae7
+ºè 0xbae8
+ºé 0xbae9
+ºê 0xbaea
+ºë 0xbaeb
+ºì 0xbaec
+ºí 0xbaed
+ºî 0xbaee
+ºï 0xbaef
+ºð 0xbaf0
+ºñ 0xbaf1
+ºò 0xbaf2
+ºó 0xbaf3
+ºô 0xbaf4
+ºõ 0xbaf5
+ºö 0xbaf6
+º÷ 0xbaf7
+ºø 0xbaf8
+ºù 0xbaf9
+ºú 0xbafa
+ºû 0xbafb
+ºü 0xbafc
+ºý 0xbafd
+ºþ 0xbafe
+»¡ 0xbba1
+Ȣ 0xbba2
+ȣ 0xbba3
+»¤ 0xbba4
+ȴ 0xbba5
+»¦ 0xbba6
+Ȥ 0xbba7
+Ȭ 0xbba8
+»© 0xbba9
+Ȼ 0xbbaa
+»« 0xbbab
+»¬ 0xbbac
+»­ 0xbbad
+»® 0xbbae
+»¯ 0xbbaf
+»° 0xbbb0
+»± 0xbbb1
+»² 0xbbb2
+»³ 0xbbb3
+»´ 0xbbb4
+»µ 0xbbb5
+Ȧ 0xbbb6
+»· 0xbbb7
+»¸ 0xbbb8
+»¹ 0xbbb9
+ȼ 0xbbba
+»» 0xbbbb
+»¼ 0xbbbc
+»½ 0xbbbd
+»¾ 0xbbbe
+»¿ 0xbbbf
+»À 0xbbc0
+»Á 0xbbc1
+»Â 0xbbc2
+»Ã 0xbbc3
+Ȁ 0xbbc4
+ȁ 0xbbc5
+Ȯ 0xbbc6
+Ȃ 0xbbc7
+»È 0xbbc8
+ȃ 0xbbc9
+»Ê 0xbbca
+»Ë 0xbbcb
+»Ì 0xbbcc
+»Í 0xbbcd
+»Î 0xbbce
+»Ï 0xbbcf
+»Ð 0xbbd0
+Ȅ 0xbbd1
+»Ò 0xbbd2
+»Ó 0xbbd3
+»Ô 0xbbd4
+»Õ 0xbbd5
+»Ö 0xbbd6
+»× 0xbbd7
+ȯ 0xbbd8
+»Ù 0xbbd9
+»Ú 0xbbda
+»Û 0xbbdb
+Ȇ 0xbbdc
+»Ý 0xbbdd
+»Þ 0xbbde
+ȧ 0xbbdf
+Ȉ 0xbbe0
+ȇ 0xbbe1
+ȉ 0xbbe2
+ȋ 0xbbe3
+Ȋ 0xbbe4
+Ȍ 0xbbe5
+Ⱦ 0xbbe6
+ȍ 0xbbe7
+ȏ 0xbbe8
+Ȏ 0xbbe9
+Ȑ 0xbbea
+ȑ 0xbbeb
+ȓ 0xbbec
+Ȓ 0xbbed
+Ȕ 0xbbee
+ȕ 0xbbef
+»ð 0xbbf0
+Ȗ 0xbbf1
+»ò 0xbbf2
+»ó 0xbbf3
+»ô 0xbbf4
+»õ 0xbbf5
+»ö 0xbbf6
+»÷ 0xbbf7
+»ø 0xbbf8
+»ù 0xbbf9
+»ú 0xbbfa
+»û 0xbbfb
+ȟ 0xbbfc
+»ý 0xbbfd
+»þ 0xbbfe
+¼¡ 0xbca1
+¼¢ 0xbca2
+¼£ 0xbca3
+¼¤ 0xbca4
+¼¥ 0xbca5
+¼¦ 0xbca6
+¼§ 0xbca7
+¼¨ 0xbca8
+¼© 0xbca9
+¼ª 0xbcaa
+¼« 0xbcab
+¼¬ 0xbcac
+¼­ 0xbcad
+¼® 0xbcae
+¼¯ 0xbcaf
+¼° 0xbcb0
+¼± 0xbcb1
+¼² 0xbcb2
+¼³ 0xbcb3
+¼´ 0xbcb4
+¼µ 0xbcb5
+¼¶ 0xbcb6
+¼· 0xbcb7
+¼¸ 0xbcb8
+¼¹ 0xbcb9
+¼º 0xbcba
+¼» 0xbcbb
+¼¼ 0xbcbc
+¼½ 0xbcbd
+¼¾ 0xbcbe
+¼¿ 0xbcbf
+¼À 0xbcc0
+¼Á 0xbcc1
+¼Â 0xbcc2
+¼Ã 0xbcc3
+¼Ä 0xbcc4
+¼Å 0xbcc5
+¼Æ 0xbcc6
+¼Ç 0xbcc7
+¼È 0xbcc8
+¼É 0xbcc9
+¼Ê 0xbcca
+¼Ë 0xbccb
+¼Ì 0xbccc
+¼Í 0xbccd
+¼Î 0xbcce
+¼Ï 0xbccf
+¼Ð 0xbcd0
+¼Ñ 0xbcd1
+¼Ò 0xbcd2
+¼Ó 0xbcd3
+¼Ô 0xbcd4
+¼Õ 0xbcd5
+¼Ö 0xbcd6
+¼× 0xbcd7
+¼Ø 0xbcd8
+¼Ù 0xbcd9
+¼Ú 0xbcda
+¼Û 0xbcdb
+¼Ü 0xbcdc
+¼Ý 0xbcdd
+¼Þ 0xbcde
+¼ß 0xbcdf
+¼à 0xbce0
+¼á 0xbce1
+¼â 0xbce2
+¼ã 0xbce3
+¼ä 0xbce4
+¼å 0xbce5
+¼æ 0xbce6
+¼ç 0xbce7
+¼è 0xbce8
+¼é 0xbce9
+¼ê 0xbcea
+¼ë 0xbceb
+¼ì 0xbcec
+¼í 0xbced
+¼î 0xbcee
+¼ï 0xbcef
+¼ð 0xbcf0
+¼ñ 0xbcf1
+¼ò 0xbcf2
+¼ó 0xbcf3
+¼ô 0xbcf4
+¼õ 0xbcf5
+¼ö 0xbcf6
+¼÷ 0xbcf7
+¼ø 0xbcf8
+¼ù 0xbcf9
+¼ú 0xbcfa
+¼û 0xbcfb
+¼ü 0xbcfc
+¼ý 0xbcfd
+¼þ 0xbcfe
+½¡ 0xbda1
+½¢ 0xbda2
+½£ 0xbda3
+½¤ 0xbda4
+½¥ 0xbda5
+½¦ 0xbda6
+½§ 0xbda7
+½¨ 0xbda8
+½© 0xbda9
+½ª 0xbdaa
+½« 0xbdab
+½¬ 0xbdac
+½­ 0xbdad
+½® 0xbdae
+½¯ 0xbdaf
+½° 0xbdb0
+½± 0xbdb1
+½² 0xbdb2
+½³ 0xbdb3
+½´ 0xbdb4
+½µ 0xbdb5
+½¶ 0xbdb6
+½· 0xbdb7
+½¸ 0xbdb8
+½¹ 0xbdb9
+½º 0xbdba
+½» 0xbdbb
+½¼ 0xbdbc
+½½ 0xbdbd
+½¾ 0xbdbe
+½¿ 0xbdbf
+½À 0xbdc0
+½Á 0xbdc1
+½Â 0xbdc2
+½Ã 0xbdc3
+½Ä 0xbdc4
+½Å 0xbdc5
+½Æ 0xbdc6
+½Ç 0xbdc7
+½È 0xbdc8
+½É 0xbdc9
+½Ê 0xbdca
+½Ë 0xbdcb
+½Ì 0xbdcc
+½Í 0xbdcd
+½Î 0xbdce
+½Ï 0xbdcf
+½Ð 0xbdd0
+½Ñ 0xbdd1
+½Ò 0xbdd2
+½Ó 0xbdd3
+½Ô 0xbdd4
+½Õ 0xbdd5
+½Ö 0xbdd6
+½× 0xbdd7
+½Ø 0xbdd8
+½Ù 0xbdd9
+½Ú 0xbdda
+½Û 0xbddb
+½Ü 0xbddc
+½Ý 0xbddd
+½Þ 0xbdde
+½ß 0xbddf
+½à 0xbde0
+½á 0xbde1
+½â 0xbde2
+½ã 0xbde3
+½ä 0xbde4
+½å 0xbde5
+½æ 0xbde6
+½ç 0xbde7
+½è 0xbde8
+½é 0xbde9
+½ê 0xbdea
+½ë 0xbdeb
+½ì 0xbdec
+½í 0xbded
+½î 0xbdee
+½ï 0xbdef
+½ð 0xbdf0
+½ñ 0xbdf1
+½ò 0xbdf2
+½ó 0xbdf3
+½ô 0xbdf4
+½õ 0xbdf5
+½ö 0xbdf6
+½÷ 0xbdf7
+½ø 0xbdf8
+½ù 0xbdf9
+½ú 0xbdfa
+½û 0xbdfb
+½ü 0xbdfc
+½ý 0xbdfd
+½þ 0xbdfe
+¾¡ 0xbea1
+¾¢ 0xbea2
+¾£ 0xbea3
+¾¤ 0xbea4
+¾¥ 0xbea5
+¾¦ 0xbea6
+¾§ 0xbea7
+¾¨ 0xbea8
+¾© 0xbea9
+¾ª 0xbeaa
+¾« 0xbeab
+¾¬ 0xbeac
+¾­ 0xbead
+¾® 0xbeae
+¾¯ 0xbeaf
+¾° 0xbeb0
+¾± 0xbeb1
+¾² 0xbeb2
+¾³ 0xbeb3
+¾´ 0xbeb4
+¾µ 0xbeb5
+¾¶ 0xbeb6
+¾· 0xbeb7
+¾¸ 0xbeb8
+¾¹ 0xbeb9
+¾º 0xbeba
+¾» 0xbebb
+¾¼ 0xbebc
+¾½ 0xbebd
+¾¾ 0xbebe
+¾¿ 0xbebf
+¾À 0xbec0
+¾Á 0xbec1
+¾Â 0xbec2
+¾Ã 0xbec3
+¾Ä 0xbec4
+¾Å 0xbec5
+¾Æ 0xbec6
+¾Ç 0xbec7
+¾È 0xbec8
+¾É 0xbec9
+¾Ê 0xbeca
+¾Ë 0xbecb
+¾Ì 0xbecc
+¾Í 0xbecd
+¾Î 0xbece
+¾Ï 0xbecf
+¾Ð 0xbed0
+¾Ñ 0xbed1
+¾Ò 0xbed2
+¾Ó 0xbed3
+¾Ô 0xbed4
+¾Õ 0xbed5
+¾Ö 0xbed6
+¾× 0xbed7
+¾Ø 0xbed8
+¾Ù 0xbed9
+¾Ú 0xbeda
+¾Û 0xbedb
+¾Ü 0xbedc
+¾Ý 0xbedd
+¾Þ 0xbede
+¾ß 0xbedf
+¾à 0xbee0
+¾á 0xbee1
+¾â 0xbee2
+¾ã 0xbee3
+¾ä 0xbee4
+¾å 0xbee5
+¾æ 0xbee6
+¾ç 0xbee7
+¾è 0xbee8
+¾é 0xbee9
+¾ê 0xbeea
+¾ë 0xbeeb
+¾ì 0xbeec
+¾í 0xbeed
+¾î 0xbeee
+¾ï 0xbeef
+¾ð 0xbef0
+¾ñ 0xbef1
+¾ò 0xbef2
+¾ó 0xbef3
+¾ô 0xbef4
+¾õ 0xbef5
+¾ö 0xbef6
+¾÷ 0xbef7
+¾ø 0xbef8
+¾ù 0xbef9
+¾ú 0xbefa
+¾û 0xbefb
+¾ü 0xbefc
+¾ý 0xbefd
+¾þ 0xbefe
+¿¡ 0xbfa1
+¿¢ 0xbfa2
+¿£ 0xbfa3
+¿¤ 0xbfa4
+¿¥ 0xbfa5
+¿¦ 0xbfa6
+¿§ 0xbfa7
+¿¨ 0xbfa8
+¿© 0xbfa9
+¿ª 0xbfaa
+¿« 0xbfab
+¿¬ 0xbfac
+¿­ 0xbfad
+¿® 0xbfae
+¿¯ 0xbfaf
+¿° 0xbfb0
+¿± 0xbfb1
+¿² 0xbfb2
+¿³ 0xbfb3
+¿´ 0xbfb4
+¿µ 0xbfb5
+¿¶ 0xbfb6
+¿· 0xbfb7
+¿¸ 0xbfb8
+¿¹ 0xbfb9
+¿º 0xbfba
+¿» 0xbfbb
+¿¼ 0xbfbc
+¿½ 0xbfbd
+¿¾ 0xbfbe
+¿¿ 0xbfbf
+¿À 0xbfc0
+¿Á 0xbfc1
+¿Â 0xbfc2
+¿Ã 0xbfc3
+¿Ä 0xbfc4
+¿Å 0xbfc5
+¿Æ 0xbfc6
+¿Ç 0xbfc7
+¿È 0xbfc8
+¿É 0xbfc9
+¿Ê 0xbfca
+¿Ë 0xbfcb
+¿Ì 0xbfcc
+¿Í 0xbfcd
+¿Î 0xbfce
+¿Ï 0xbfcf
+¿Ð 0xbfd0
+¿Ñ 0xbfd1
+¿Ò 0xbfd2
+¿Ó 0xbfd3
+¿Ô 0xbfd4
+¿Õ 0xbfd5
+¿Ö 0xbfd6
+¿× 0xbfd7
+¿Ø 0xbfd8
+¿Ù 0xbfd9
+¿Ú 0xbfda
+¿Û 0xbfdb
+¿Ü 0xbfdc
+¿Ý 0xbfdd
+¿Þ 0xbfde
+¿ß 0xbfdf
+¿à 0xbfe0
+¿á 0xbfe1
+¿â 0xbfe2
+¿ã 0xbfe3
+¿ä 0xbfe4
+¿å 0xbfe5
+¿æ 0xbfe6
+¿ç 0xbfe7
+¿è 0xbfe8
+¿é 0xbfe9
+¿ê 0xbfea
+¿ë 0xbfeb
+¿ì 0xbfec
+¿í 0xbfed
+¿î 0xbfee
+¿ï 0xbfef
+¿ð 0xbff0
+¿ñ 0xbff1
+¿ò 0xbff2
+¿ó 0xbff3
+¿ô 0xbff4
+¿õ 0xbff5
+¿ö 0xbff6
+¿÷ 0xbff7
+¿ø 0xbff8
+¿ù 0xbff9
+¿ú 0xbffa
+¿û 0xbffb
+¿ü 0xbffc
+¿ý 0xbffd
+¿þ 0xbffe
+À¡ 0xc0a1
+À¢ 0xc0a2
+À£ 0xc0a3
+À¤ 0xc0a4
+À¥ 0xc0a5
+À¦ 0xc0a6
+ˤ 0xc0a7
+ˬ 0xc0a8
+À© 0xc0a9
+˻ 0xc0aa
+À« 0xc0ab
+À¬ 0xc0ac
+À­ 0xc0ad
+À® 0xc0ae
+À¯ 0xc0af
+À° 0xc0b0
+˱ 0xc0b1
+À² 0xc0b2
+À³ 0xc0b3
+À´ 0xc0b4
+˵ 0xc0b5
+˦ 0xc0b6
+À· 0xc0b7
+À¸ 0xc0b8
+À¹ 0xc0b9
+˼ 0xc0ba
+À» 0xc0bb
+À¼ 0xc0bc
+À½ 0xc0bd
+À¾ 0xc0be
+À¿ 0xc0bf
+ÀÀ 0xc0c0
+ÀÁ 0xc0c1
+ÀÂ 0xc0c2
+ÀÃ 0xc0c3
+ÀÄ 0xc0c4
+ÀÅ 0xc0c5
+ÀÆ 0xc0c6
+ÀÇ 0xc0c7
+ÀÈ 0xc0c8
+ÀÉ 0xc0c9
+ÀÊ 0xc0ca
+ÀË 0xc0cb
+ÀÌ 0xc0cc
+ÀÍ 0xc0cd
+ÀÎ 0xc0ce
+ÀÏ 0xc0cf
+ÀÐ 0xc0d0
+ÀÑ 0xc0d1
+ÀÒ 0xc0d2
+ÀÓ 0xc0d3
+ÀÔ 0xc0d4
+ÀÕ 0xc0d5
+ÀÖ 0xc0d6
+À× 0xc0d7
+ÀØ 0xc0d8
+ÀÙ 0xc0d9
+ÀÚ 0xc0da
+ÀÛ 0xc0db
+ÀÜ 0xc0dc
+ÀÝ 0xc0dd
+ÀÞ 0xc0de
+Àß 0xc0df
+Àà 0xc0e0
+Àá 0xc0e1
+Àâ 0xc0e2
+Àã 0xc0e3
+Àä 0xc0e4
+Àå 0xc0e5
+Àæ 0xc0e6
+Àç 0xc0e7
+Àè 0xc0e8
+Àé 0xc0e9
+Àê 0xc0ea
+Àë 0xc0eb
+Àì 0xc0ec
+Àí 0xc0ed
+Àî 0xc0ee
+Àï 0xc0ef
+Àð 0xc0f0
+Àñ 0xc0f1
+Àò 0xc0f2
+Àó 0xc0f3
+Àô 0xc0f4
+Àõ 0xc0f5
+Àö 0xc0f6
+À÷ 0xc0f7
+Àø 0xc0f8
+Àù 0xc0f9
+Àú 0xc0fa
+Àû 0xc0fb
+Àü 0xc0fc
+Àý 0xc0fd
+Àþ 0xc0fe
+Á¡ 0xc1a1
+Á¢ 0xc1a2
+Á£ 0xc1a3
+Á¤ 0xc1a4
+Á¥ 0xc1a5
+Á¦ 0xc1a6
+Á§ 0xc1a7
+Á¨ 0xc1a8
+Á© 0xc1a9
+Áª 0xc1aa
+Á« 0xc1ab
+Á¬ 0xc1ac
+Á­ 0xc1ad
+Á® 0xc1ae
+Á¯ 0xc1af
+Á° 0xc1b0
+Á± 0xc1b1
+Á² 0xc1b2
+Á³ 0xc1b3
+Á´ 0xc1b4
+Áµ 0xc1b5
+Á¶ 0xc1b6
+Á· 0xc1b7
+Á¸ 0xc1b8
+Á¹ 0xc1b9
+Áº 0xc1ba
+Á» 0xc1bb
+Á¼ 0xc1bc
+Á½ 0xc1bd
+Á¾ 0xc1be
+Á¿ 0xc1bf
+ÁÀ 0xc1c0
+ÁÁ 0xc1c1
+ÁÂ 0xc1c2
+ÁÃ 0xc1c3
+ÁÄ 0xc1c4
+ÁÅ 0xc1c5
+ÁÆ 0xc1c6
+ÁÇ 0xc1c7
+ÁÈ 0xc1c8
+ÁÉ 0xc1c9
+ÁÊ 0xc1ca
+ÁË 0xc1cb
+ÁÌ 0xc1cc
+ÁÍ 0xc1cd
+ÁÎ 0xc1ce
+ÁÏ 0xc1cf
+ÁÐ 0xc1d0
+ÁÑ 0xc1d1
+ÁÒ 0xc1d2
+ÁÓ 0xc1d3
+ÁÔ 0xc1d4
+ÁÕ 0xc1d5
+ÁÖ 0xc1d6
+Á× 0xc1d7
+ÁØ 0xc1d8
+ÁÙ 0xc1d9
+ÁÚ 0xc1da
+ÁÛ 0xc1db
+ÁÜ 0xc1dc
+ÁÝ 0xc1dd
+ÁÞ 0xc1de
+Áß 0xc1df
+Áà 0xc1e0
+Áá 0xc1e1
+Áâ 0xc1e2
+Áã 0xc1e3
+Áä 0xc1e4
+Áå 0xc1e5
+Áæ 0xc1e6
+Áç 0xc1e7
+Áè 0xc1e8
+Áé 0xc1e9
+Áê 0xc1ea
+Áë 0xc1eb
+Áì 0xc1ec
+Áí 0xc1ed
+Áî 0xc1ee
+Áï 0xc1ef
+Áð 0xc1f0
+Áñ 0xc1f1
+Áò 0xc1f2
+Áó 0xc1f3
+Áô 0xc1f4
+Áõ 0xc1f5
+Áö 0xc1f6
+Á÷ 0xc1f7
+Áø 0xc1f8
+Áù 0xc1f9
+Áú 0xc1fa
+Áû 0xc1fb
+Áü 0xc1fc
+Áý 0xc1fd
+Áþ 0xc1fe
+¡ 0xc2a1
+¢ 0xc2a2
+£ 0xc2a3
+¤ 0xc2a4
+Â¥ 0xc2a5
+¦ 0xc2a6
+§ 0xc2a7
+¨ 0xc2a8
+© 0xc2a9
+ª 0xc2aa
+« 0xc2ab
+¬ 0xc2ac
+­ 0xc2ad
+® 0xc2ae
+¯ 0xc2af
+° 0xc2b0
+± 0xc2b1
+² 0xc2b2
+³ 0xc2b3
+´ 0xc2b4
+µ 0xc2b5
+¶ 0xc2b6
+· 0xc2b7
+¸ 0xc2b8
+¹ 0xc2b9
+º 0xc2ba
+» 0xc2bb
+¼ 0xc2bc
+½ 0xc2bd
+¾ 0xc2be
+¿ 0xc2bf
+ÂÀ 0xc2c0
+ÂÁ 0xc2c1
+ÂÂ 0xc2c2
+ÂÃ 0xc2c3
+ÂÄ 0xc2c4
+ÂÅ 0xc2c5
+ÂÆ 0xc2c6
+ÂÇ 0xc2c7
+ÂÈ 0xc2c8
+ÂÉ 0xc2c9
+ÂÊ 0xc2ca
+ÂË 0xc2cb
+ÂÌ 0xc2cc
+ÂÍ 0xc2cd
+ÂÎ 0xc2ce
+ÂÏ 0xc2cf
+ÂÐ 0xc2d0
+ÂÑ 0xc2d1
+ÂÒ 0xc2d2
+ÂÓ 0xc2d3
+ÂÔ 0xc2d4
+ÂÕ 0xc2d5
+ÂÖ 0xc2d6
+Â× 0xc2d7
+ÂØ 0xc2d8
+ÂÙ 0xc2d9
+ÂÚ 0xc2da
+ÂÛ 0xc2db
+ÂÜ 0xc2dc
+ÂÝ 0xc2dd
+ÂÞ 0xc2de
+Âß 0xc2df
+Âà 0xc2e0
+Âá 0xc2e1
+Ââ 0xc2e2
+Âã 0xc2e3
+Âä 0xc2e4
+Âå 0xc2e5
+Âæ 0xc2e6
+Âç 0xc2e7
+Âè 0xc2e8
+Âé 0xc2e9
+Âê 0xc2ea
+Âë 0xc2eb
+Âì 0xc2ec
+Âí 0xc2ed
+Âî 0xc2ee
+Âï 0xc2ef
+Âð 0xc2f0
+Âñ 0xc2f1
+Âò 0xc2f2
+Âó 0xc2f3
+Âô 0xc2f4
+Âõ 0xc2f5
+Âö 0xc2f6
+Â÷ 0xc2f7
+Âø 0xc2f8
+Âù 0xc2f9
+Âú 0xc2fa
+Âû 0xc2fb
+Âü 0xc2fc
+Âý 0xc2fd
+Âþ 0xc2fe
+á 0xc3a1
+â 0xc3a2
+ã 0xc3a3
+ä 0xc3a4
+Ã¥ 0xc3a5
+æ 0xc3a6
+ç 0xc3a7
+è 0xc3a8
+é 0xc3a9
+ê 0xc3aa
+ë 0xc3ab
+ì 0xc3ac
+í 0xc3ad
+î 0xc3ae
+ï 0xc3af
+ð 0xc3b0
+ñ 0xc3b1
+ò 0xc3b2
+ó 0xc3b3
+ô 0xc3b4
+õ 0xc3b5
+ö 0xc3b6
+÷ 0xc3b7
+ø 0xc3b8
+ù 0xc3b9
+ú 0xc3ba
+û 0xc3bb
+ü 0xc3bc
+ý 0xc3bd
+þ 0xc3be
+ÿ 0xc3bf
+ÃÀ 0xc3c0
+ÃÁ 0xc3c1
+ÃÂ 0xc3c2
+ÃÃ 0xc3c3
+ÃÄ 0xc3c4
+ÃÅ 0xc3c5
+ÃÆ 0xc3c6
+ÃÇ 0xc3c7
+ÃÈ 0xc3c8
+ÃÉ 0xc3c9
+ÃÊ 0xc3ca
+ÃË 0xc3cb
+ÃÌ 0xc3cc
+ÃÍ 0xc3cd
+ÃÎ 0xc3ce
+ÃÏ 0xc3cf
+ÃÐ 0xc3d0
+ÃÑ 0xc3d1
+ÃÒ 0xc3d2
+ÃÓ 0xc3d3
+ÃÔ 0xc3d4
+ÃÕ 0xc3d5
+ÃÖ 0xc3d6
+Ã× 0xc3d7
+ÃØ 0xc3d8
+ÃÙ 0xc3d9
+ÃÚ 0xc3da
+ÃÛ 0xc3db
+ÃÜ 0xc3dc
+ÃÝ 0xc3dd
+ÃÞ 0xc3de
+Ãß 0xc3df
+Ãà 0xc3e0
+Ãá 0xc3e1
+Ãâ 0xc3e2
+Ãã 0xc3e3
+Ãä 0xc3e4
+Ãå 0xc3e5
+Ãæ 0xc3e6
+Ãç 0xc3e7
+Ãè 0xc3e8
+Ãé 0xc3e9
+Ãê 0xc3ea
+Ãë 0xc3eb
+Ãì 0xc3ec
+Ãí 0xc3ed
+Ãî 0xc3ee
+Ãï 0xc3ef
+Ãð 0xc3f0
+Ãñ 0xc3f1
+Ãò 0xc3f2
+Ãó 0xc3f3
+Ãô 0xc3f4
+Ãõ 0xc3f5
+Ãö 0xc3f6
+Ã÷ 0xc3f7
+Ãø 0xc3f8
+Ãù 0xc3f9
+Ãú 0xc3fa
+Ãû 0xc3fb
+Ãü 0xc3fc
+Ãý 0xc3fd
+Ãþ 0xc3fe
+Ä¡ 0xc4a1
+Ä¢ 0xc4a2
+Ä£ 0xc4a3
+Ĥ 0xc4a4
+Ä¥ 0xc4a5
+Ħ 0xc4a6
+ħ 0xc4a7
+Ĩ 0xc4a8
+Ä© 0xc4a9
+Ī 0xc4aa
+Ä« 0xc4ab
+Ĭ 0xc4ac
+Ä­ 0xc4ad
+Ä® 0xc4ae
+į 0xc4af
+Ä° 0xc4b0
+ı 0xc4b1
+IJ 0xc4b2
+ij 0xc4b3
+Ä´ 0xc4b4
+ĵ 0xc4b5
+Ķ 0xc4b6
+Ä· 0xc4b7
+ĸ 0xc4b8
+Ĺ 0xc4b9
+ĺ 0xc4ba
+Ä» 0xc4bb
+ļ 0xc4bc
+Ľ 0xc4bd
+ľ 0xc4be
+Ä¿ 0xc4bf
+ÄÀ 0xc4c0
+ÄÁ 0xc4c1
+ÄÂ 0xc4c2
+ÄÃ 0xc4c3
+ÄÄ 0xc4c4
+ÄÅ 0xc4c5
+ÄÆ 0xc4c6
+ÄÇ 0xc4c7
+ÄÈ 0xc4c8
+ÄÉ 0xc4c9
+ÄÊ 0xc4ca
+ÄË 0xc4cb
+ÄÌ 0xc4cc
+ÄÍ 0xc4cd
+ÄÎ 0xc4ce
+ÄÏ 0xc4cf
+ÄÐ 0xc4d0
+ÄÑ 0xc4d1
+ÄÒ 0xc4d2
+ÄÓ 0xc4d3
+ÄÔ 0xc4d4
+ÄÕ 0xc4d5
+ÄÖ 0xc4d6
+Ä× 0xc4d7
+ÄØ 0xc4d8
+ÄÙ 0xc4d9
+ÄÚ 0xc4da
+ÄÛ 0xc4db
+ÄÜ 0xc4dc
+ÄÝ 0xc4dd
+ÄÞ 0xc4de
+Äß 0xc4df
+Äà 0xc4e0
+Äá 0xc4e1
+Äâ 0xc4e2
+Äã 0xc4e3
+Ää 0xc4e4
+Äå 0xc4e5
+Äæ 0xc4e6
+Äç 0xc4e7
+Äè 0xc4e8
+Äé 0xc4e9
+Äê 0xc4ea
+Äë 0xc4eb
+Äì 0xc4ec
+Äí 0xc4ed
+Äî 0xc4ee
+Äï 0xc4ef
+Äð 0xc4f0
+Äñ 0xc4f1
+Äò 0xc4f2
+Äó 0xc4f3
+Äô 0xc4f4
+Äõ 0xc4f5
+Äö 0xc4f6
+Ä÷ 0xc4f7
+Äø 0xc4f8
+Äù 0xc4f9
+Äú 0xc4fa
+Äû 0xc4fb
+Äü 0xc4fc
+Äý 0xc4fd
+Äþ 0xc4fe
+Å¡ 0xc5a1
+Å¢ 0xc5a2
+Å£ 0xc5a3
+Ť 0xc5a4
+Å¥ 0xc5a5
+Ŧ 0xc5a6
+ŧ 0xc5a7
+Ũ 0xc5a8
+Å© 0xc5a9
+Ū 0xc5aa
+Å« 0xc5ab
+Ŭ 0xc5ac
+Å­ 0xc5ad
+Å® 0xc5ae
+ů 0xc5af
+Å° 0xc5b0
+ű 0xc5b1
+Ų 0xc5b2
+ų 0xc5b3
+Å´ 0xc5b4
+ŵ 0xc5b5
+Ŷ 0xc5b6
+Å· 0xc5b7
+Ÿ 0xc5b8
+Ź 0xc5b9
+ź 0xc5ba
+Å» 0xc5bb
+ż 0xc5bc
+Ž 0xc5bd
+ž 0xc5be
+Å¿ 0xc5bf
+ÅÀ 0xc5c0
+ÅÁ 0xc5c1
+ÅÂ 0xc5c2
+ÅÃ 0xc5c3
+ÅÄ 0xc5c4
+ÅÅ 0xc5c5
+ÅÆ 0xc5c6
+ÅÇ 0xc5c7
+ÅÈ 0xc5c8
+ÅÉ 0xc5c9
+ÅÊ 0xc5ca
+ÅË 0xc5cb
+ÅÌ 0xc5cc
+ÅÍ 0xc5cd
+ÅÎ 0xc5ce
+ÅÏ 0xc5cf
+ÅÐ 0xc5d0
+ÅÑ 0xc5d1
+ÅÒ 0xc5d2
+ÅÓ 0xc5d3
+ÅÔ 0xc5d4
+ÅÕ 0xc5d5
+ÅÖ 0xc5d6
+Å× 0xc5d7
+ÅØ 0xc5d8
+ÅÙ 0xc5d9
+ÅÚ 0xc5da
+ÅÛ 0xc5db
+ÅÜ 0xc5dc
+ÅÝ 0xc5dd
+ÅÞ 0xc5de
+Åß 0xc5df
+Åà 0xc5e0
+Åá 0xc5e1
+Åâ 0xc5e2
+Åã 0xc5e3
+Åä 0xc5e4
+Åå 0xc5e5
+Åæ 0xc5e6
+Åç 0xc5e7
+Åè 0xc5e8
+Åé 0xc5e9
+Åê 0xc5ea
+Åë 0xc5eb
+Åì 0xc5ec
+Åí 0xc5ed
+Åî 0xc5ee
+Åï 0xc5ef
+Åð 0xc5f0
+Åñ 0xc5f1
+Åò 0xc5f2
+Åó 0xc5f3
+Åô 0xc5f4
+Åõ 0xc5f5
+Åö 0xc5f6
+Å÷ 0xc5f7
+Åø 0xc5f8
+Åù 0xc5f9
+Åú 0xc5fa
+Åû 0xc5fb
+Åü 0xc5fc
+Åý 0xc5fd
+Åþ 0xc5fe
+Æ¡ 0xc6a1
+Æ¢ 0xc6a2
+Æ£ 0xc6a3
+Ƥ 0xc6a4
+Æ¥ 0xc6a5
+Ʀ 0xc6a6
+Ƨ 0xc6a7
+ƨ 0xc6a8
+Æ© 0xc6a9
+ƪ 0xc6aa
+Æ« 0xc6ab
+Ƭ 0xc6ac
+Æ­ 0xc6ad
+Æ® 0xc6ae
+Ư 0xc6af
+Æ° 0xc6b0
+Ʊ 0xc6b1
+Ʋ 0xc6b2
+Ƴ 0xc6b3
+Æ´ 0xc6b4
+Ƶ 0xc6b5
+ƶ 0xc6b6
+Æ· 0xc6b7
+Ƹ 0xc6b8
+ƹ 0xc6b9
+ƺ 0xc6ba
+Æ» 0xc6bb
+Ƽ 0xc6bc
+ƽ 0xc6bd
+ƾ 0xc6be
+Æ¿ 0xc6bf
+ÆÀ 0xc6c0
+ÆÁ 0xc6c1
+ÆÂ 0xc6c2
+ÆÃ 0xc6c3
+ÆÄ 0xc6c4
+ÆÅ 0xc6c5
+ÆÆ 0xc6c6
+ÆÇ 0xc6c7
+ÆÈ 0xc6c8
+ÆÉ 0xc6c9
+ÆÊ 0xc6ca
+ÆË 0xc6cb
+ÆÌ 0xc6cc
+ÆÍ 0xc6cd
+ÆÎ 0xc6ce
+ÆÏ 0xc6cf
+ÆÐ 0xc6d0
+ÆÑ 0xc6d1
+ÆÒ 0xc6d2
+ÆÓ 0xc6d3
+ÆÔ 0xc6d4
+ÆÕ 0xc6d5
+ÆÖ 0xc6d6
+Æ× 0xc6d7
+ÆØ 0xc6d8
+ÆÙ 0xc6d9
+ÆÚ 0xc6da
+ÆÛ 0xc6db
+ÆÜ 0xc6dc
+ÆÝ 0xc6dd
+ÆÞ 0xc6de
+Æß 0xc6df
+Æà 0xc6e0
+Æá 0xc6e1
+Æâ 0xc6e2
+Æã 0xc6e3
+Æä 0xc6e4
+Æå 0xc6e5
+Ææ 0xc6e6
+Æç 0xc6e7
+Æè 0xc6e8
+Æé 0xc6e9
+Æê 0xc6ea
+Æë 0xc6eb
+Æì 0xc6ec
+Æí 0xc6ed
+Æî 0xc6ee
+Æï 0xc6ef
+Æð 0xc6f0
+Æñ 0xc6f1
+Æò 0xc6f2
+Æó 0xc6f3
+Æô 0xc6f4
+Æõ 0xc6f5
+Æö 0xc6f6
+Æ÷ 0xc6f7
+Æø 0xc6f8
+Æù 0xc6f9
+Æú 0xc6fa
+Æû 0xc6fb
+Æü 0xc6fc
+Æý 0xc6fd
+Æþ 0xc6fe
+Ç¡ 0xc7a1
+Ç¢ 0xc7a2
+Ç£ 0xc7a3
+Ǥ 0xc7a4
+Ç¥ 0xc7a5
+Ǧ 0xc7a6
+ǧ 0xc7a7
+Ǩ 0xc7a8
+Ç© 0xc7a9
+Ǫ 0xc7aa
+Ç« 0xc7ab
+Ǭ 0xc7ac
+Ç­ 0xc7ad
+Ç® 0xc7ae
+ǯ 0xc7af
+Ç° 0xc7b0
+DZ 0xc7b1
+Dz 0xc7b2
+dz 0xc7b3
+Ç´ 0xc7b4
+ǵ 0xc7b5
+Ƕ 0xc7b6
+Ç· 0xc7b7
+Ǹ 0xc7b8
+ǹ 0xc7b9
+Ǻ 0xc7ba
+Ç» 0xc7bb
+Ǽ 0xc7bc
+ǽ 0xc7bd
+Ǿ 0xc7be
+Ç¿ 0xc7bf
+ÇÀ 0xc7c0
+ÇÁ 0xc7c1
+ÇÂ 0xc7c2
+ÇÃ 0xc7c3
+ÇÄ 0xc7c4
+ÇÅ 0xc7c5
+ÇÆ 0xc7c6
+ÇÇ 0xc7c7
+ÇÈ 0xc7c8
+ÇÉ 0xc7c9
+ÇÊ 0xc7ca
+ÇË 0xc7cb
+ÇÌ 0xc7cc
+ÇÍ 0xc7cd
+ÇÎ 0xc7ce
+ÇÏ 0xc7cf
+ÇÐ 0xc7d0
+ÇÑ 0xc7d1
+ÇÒ 0xc7d2
+ÇÓ 0xc7d3
+ÇÔ 0xc7d4
+ÇÕ 0xc7d5
+ÇÖ 0xc7d6
+Ç× 0xc7d7
+ÇØ 0xc7d8
+ÇÙ 0xc7d9
+ÇÚ 0xc7da
+ÇÛ 0xc7db
+ÇÜ 0xc7dc
+ÇÝ 0xc7dd
+ÇÞ 0xc7de
+Çß 0xc7df
+Çà 0xc7e0
+Çá 0xc7e1
+Çâ 0xc7e2
+Çã 0xc7e3
+Çä 0xc7e4
+Çå 0xc7e5
+Çæ 0xc7e6
+Çç 0xc7e7
+Çè 0xc7e8
+Çé 0xc7e9
+Çê 0xc7ea
+Çë 0xc7eb
+Çì 0xc7ec
+Çí 0xc7ed
+Çî 0xc7ee
+Çï 0xc7ef
+Çð 0xc7f0
+Çñ 0xc7f1
+Çò 0xc7f2
+Çó 0xc7f3
+Çô 0xc7f4
+Çõ 0xc7f5
+Çö 0xc7f6
+Ç÷ 0xc7f7
+Çø 0xc7f8
+Çù 0xc7f9
+Çú 0xc7fa
+Çû 0xc7fb
+Çü 0xc7fc
+Çý 0xc7fd
+Çþ 0xc7fe
+È¡ 0xc8a1
+È¢ 0xc8a2
+È£ 0xc8a3
+Ȥ 0xc8a4
+È¥ 0xc8a5
+Ȧ 0xc8a6
+ȧ 0xc8a7
+Ȩ 0xc8a8
+È© 0xc8a9
+Ȫ 0xc8aa
+È« 0xc8ab
+Ȭ 0xc8ac
+È­ 0xc8ad
+È® 0xc8ae
+ȯ 0xc8af
+È° 0xc8b0
+ȱ 0xc8b1
+Ȳ 0xc8b2
+ȳ 0xc8b3
+È´ 0xc8b4
+ȵ 0xc8b5
+ȶ 0xc8b6
+È· 0xc8b7
+ȸ 0xc8b8
+ȹ 0xc8b9
+Ⱥ 0xc8ba
+È» 0xc8bb
+ȼ 0xc8bc
+Ƚ 0xc8bd
+Ⱦ 0xc8be
+È¿ 0xc8bf
+ÈÀ 0xc8c0
+ÈÁ 0xc8c1
+ÈÂ 0xc8c2
+ÈÃ 0xc8c3
+ÈÄ 0xc8c4
+ÈÅ 0xc8c5
+ÈÆ 0xc8c6
+ÈÇ 0xc8c7
+ÈÈ 0xc8c8
+ÈÉ 0xc8c9
+ÈÊ 0xc8ca
+ÈË 0xc8cb
+ÈÌ 0xc8cc
+ÈÍ 0xc8cd
+ÈÎ 0xc8ce
+ÈÏ 0xc8cf
+ÈÐ 0xc8d0
+ÈÑ 0xc8d1
+ÈÒ 0xc8d2
+ÈÓ 0xc8d3
+ÈÔ 0xc8d4
+ÈÕ 0xc8d5
+ÈÖ 0xc8d6
+È× 0xc8d7
+ÈØ 0xc8d8
+ÈÙ 0xc8d9
+ÈÚ 0xc8da
+ÈÛ 0xc8db
+ÈÜ 0xc8dc
+ÈÝ 0xc8dd
+ÈÞ 0xc8de
+Èß 0xc8df
+Èà 0xc8e0
+Èá 0xc8e1
+Èâ 0xc8e2
+Èã 0xc8e3
+Èä 0xc8e4
+Èå 0xc8e5
+Èæ 0xc8e6
+Èç 0xc8e7
+Èè 0xc8e8
+Èé 0xc8e9
+Èê 0xc8ea
+Èë 0xc8eb
+Èì 0xc8ec
+Èí 0xc8ed
+Èî 0xc8ee
+Èï 0xc8ef
+Èð 0xc8f0
+Èñ 0xc8f1
+Èò 0xc8f2
+Èó 0xc8f3
+Èô 0xc8f4
+Èõ 0xc8f5
+Èö 0xc8f6
+È÷ 0xc8f7
+Èø 0xc8f8
+Èù 0xc8f9
+Èú 0xc8fa
+Èû 0xc8fb
+Èü 0xc8fc
+Èý 0xc8fd
+Èþ 0xc8fe
+É¡ 0xc9a1
+É¢ 0xc9a2
+É£ 0xc9a3
+ɤ 0xc9a4
+É¥ 0xc9a5
+ɦ 0xc9a6
+ɧ 0xc9a7
+ɨ 0xc9a8
+É© 0xc9a9
+ɪ 0xc9aa
+É« 0xc9ab
+ɬ 0xc9ac
+É­ 0xc9ad
+É® 0xc9ae
+ɯ 0xc9af
+É° 0xc9b0
+ɱ 0xc9b1
+ɲ 0xc9b2
+ɳ 0xc9b3
+É´ 0xc9b4
+ɵ 0xc9b5
+ɶ 0xc9b6
+É· 0xc9b7
+ɸ 0xc9b8
+ɹ 0xc9b9
+ɺ 0xc9ba
+É» 0xc9bb
+ɼ 0xc9bc
+ɽ 0xc9bd
+ɾ 0xc9be
+É¿ 0xc9bf
+ÉÀ 0xc9c0
+ÉÁ 0xc9c1
+ÉÂ 0xc9c2
+ÉÃ 0xc9c3
+ÉÄ 0xc9c4
+ÉÅ 0xc9c5
+ÉÆ 0xc9c6
+ÉÇ 0xc9c7
+ÉÈ 0xc9c8
+ÉÉ 0xc9c9
+ÉÊ 0xc9ca
+ÉË 0xc9cb
+ÉÌ 0xc9cc
+ÉÍ 0xc9cd
+ÉÎ 0xc9ce
+ÉÏ 0xc9cf
+ÉÐ 0xc9d0
+ÉÑ 0xc9d1
+ÉÒ 0xc9d2
+ÉÓ 0xc9d3
+ÉÔ 0xc9d4
+ÉÕ 0xc9d5
+ÉÖ 0xc9d6
+É× 0xc9d7
+ÉØ 0xc9d8
+ÉÙ 0xc9d9
+ÉÚ 0xc9da
+ÉÛ 0xc9db
+ÉÜ 0xc9dc
+ÉÝ 0xc9dd
+ÉÞ 0xc9de
+Éß 0xc9df
+Éà 0xc9e0
+Éá 0xc9e1
+Éâ 0xc9e2
+Éã 0xc9e3
+Éä 0xc9e4
+Éå 0xc9e5
+Éæ 0xc9e6
+Éç 0xc9e7
+Éè 0xc9e8
+Éé 0xc9e9
+Éê 0xc9ea
+Éë 0xc9eb
+Éì 0xc9ec
+Éí 0xc9ed
+Éî 0xc9ee
+Éï 0xc9ef
+Éð 0xc9f0
+Éñ 0xc9f1
+Éò 0xc9f2
+Éó 0xc9f3
+Éô 0xc9f4
+Éõ 0xc9f5
+Éö 0xc9f6
+É÷ 0xc9f7
+Éø 0xc9f8
+Éù 0xc9f9
+Éú 0xc9fa
+Éû 0xc9fb
+Éü 0xc9fc
+Éý 0xc9fd
+Éþ 0xc9fe
+Ê¡ 0xcaa1
+Ê¢ 0xcaa2
+Ê£ 0xcaa3
+ʤ 0xcaa4
+Ê¥ 0xcaa5
+ʦ 0xcaa6
+ʧ 0xcaa7
+ʨ 0xcaa8
+Ê© 0xcaa9
+ʪ 0xcaaa
+Ê« 0xcaab
+ʬ 0xcaac
+Ê­ 0xcaad
+Ê® 0xcaae
+ʯ 0xcaaf
+Ê° 0xcab0
+ʱ 0xcab1
+ʲ 0xcab2
+ʳ 0xcab3
+Ê´ 0xcab4
+ʵ 0xcab5
+ʶ 0xcab6
+Ê· 0xcab7
+ʸ 0xcab8
+ʹ 0xcab9
+ʺ 0xcaba
+Ê» 0xcabb
+ʼ 0xcabc
+ʽ 0xcabd
+ʾ 0xcabe
+Ê¿ 0xcabf
+ÊÀ 0xcac0
+ÊÁ 0xcac1
+ÊÂ 0xcac2
+ÊÃ 0xcac3
+ÊÄ 0xcac4
+ÊÅ 0xcac5
+ÊÆ 0xcac6
+ÊÇ 0xcac7
+ÊÈ 0xcac8
+ÊÉ 0xcac9
+ÊÊ 0xcaca
+ÊË 0xcacb
+ÊÌ 0xcacc
+ÊÍ 0xcacd
+ÊÎ 0xcace
+ÊÏ 0xcacf
+ÊÐ 0xcad0
+ÊÑ 0xcad1
+ÊÒ 0xcad2
+ÊÓ 0xcad3
+ÊÔ 0xcad4
+ÊÕ 0xcad5
+ÊÖ 0xcad6
+Ê× 0xcad7
+ÊØ 0xcad8
+ÊÙ 0xcad9
+ÊÚ 0xcada
+ÊÛ 0xcadb
+ÊÜ 0xcadc
+ÊÝ 0xcadd
+ÊÞ 0xcade
+Êß 0xcadf
+Êà 0xcae0
+Êá 0xcae1
+Êâ 0xcae2
+Êã 0xcae3
+Êä 0xcae4
+Êå 0xcae5
+Êæ 0xcae6
+Êç 0xcae7
+Êè 0xcae8
+Êé 0xcae9
+Êê 0xcaea
+Êë 0xcaeb
+Êì 0xcaec
+Êí 0xcaed
+Êî 0xcaee
+Êï 0xcaef
+Êð 0xcaf0
+Êñ 0xcaf1
+Êò 0xcaf2
+Êó 0xcaf3
+Êô 0xcaf4
+Êõ 0xcaf5
+Êö 0xcaf6
+Ê÷ 0xcaf7
+Êø 0xcaf8
+Êù 0xcaf9
+Êú 0xcafa
+Êû 0xcafb
+Êü 0xcafc
+Êý 0xcafd
+Êþ 0xcafe
+Ë¡ 0xcba1
+Ë¢ 0xcba2
+Ë£ 0xcba3
+ˤ 0xcba4
+Ë¥ 0xcba5
+˦ 0xcba6
+˧ 0xcba7
+˨ 0xcba8
+Ë© 0xcba9
+˪ 0xcbaa
+Ë« 0xcbab
+ˬ 0xcbac
+Ë­ 0xcbad
+Ë® 0xcbae
+˯ 0xcbaf
+Ë° 0xcbb0
+˱ 0xcbb1
+˲ 0xcbb2
+˳ 0xcbb3
+Ë´ 0xcbb4
+˵ 0xcbb5
+˶ 0xcbb6
+Ë· 0xcbb7
+˸ 0xcbb8
+˹ 0xcbb9
+˺ 0xcbba
+Ë» 0xcbbb
+˼ 0xcbbc
+˽ 0xcbbd
+˾ 0xcbbe
+Ë¿ 0xcbbf
+ËÀ 0xcbc0
+ËÁ 0xcbc1
+ËÂ 0xcbc2
+ËÃ 0xcbc3
+ËÄ 0xcbc4
+ËÅ 0xcbc5
+ËÆ 0xcbc6
+ËÇ 0xcbc7
+ËÈ 0xcbc8
+ËÉ 0xcbc9
+ËÊ 0xcbca
+ËË 0xcbcb
+ËÌ 0xcbcc
+ËÍ 0xcbcd
+ËÎ 0xcbce
+ËÏ 0xcbcf
+ËÐ 0xcbd0
+ËÑ 0xcbd1
+ËÒ 0xcbd2
+ËÓ 0xcbd3
+ËÔ 0xcbd4
+ËÕ 0xcbd5
+ËÖ 0xcbd6
+Ë× 0xcbd7
+ËØ 0xcbd8
+ËÙ 0xcbd9
+ËÚ 0xcbda
+ËÛ 0xcbdb
+ËÜ 0xcbdc
+ËÝ 0xcbdd
+ËÞ 0xcbde
+Ëß 0xcbdf
+Ëà 0xcbe0
+Ëá 0xcbe1
+Ëâ 0xcbe2
+Ëã 0xcbe3
+Ëä 0xcbe4
+Ëå 0xcbe5
+Ëæ 0xcbe6
+Ëç 0xcbe7
+Ëè 0xcbe8
+Ëé 0xcbe9
+Ëê 0xcbea
+Ëë 0xcbeb
+Ëì 0xcbec
+Ëí 0xcbed
+Ëî 0xcbee
+Ëï 0xcbef
+Ëð 0xcbf0
+Ëñ 0xcbf1
+Ëò 0xcbf2
+Ëó 0xcbf3
+Ëô 0xcbf4
+Ëõ 0xcbf5
+Ëö 0xcbf6
+Ë÷ 0xcbf7
+Ëø 0xcbf8
+Ëù 0xcbf9
+Ëú 0xcbfa
+Ëû 0xcbfb
+Ëü 0xcbfc
+Ëý 0xcbfd
+Ëþ 0xcbfe
+Ì¡ 0xcca1
+Ì¢ 0xcca2
+Ì£ 0xcca3
+̤ 0xcca4
+Ì¥ 0xcca5
+̦ 0xcca6
+̧ 0xcca7
+̨ 0xcca8
+Ì© 0xcca9
+̪ 0xccaa
+Ì« 0xccab
+̬ 0xccac
+Ì­ 0xccad
+Ì® 0xccae
+̯ 0xccaf
+Ì° 0xccb0
+̱ 0xccb1
+̲ 0xccb2
+̳ 0xccb3
+Ì´ 0xccb4
+̵ 0xccb5
+̶ 0xccb6
+Ì· 0xccb7
+̸ 0xccb8
+̹ 0xccb9
+̺ 0xccba
+Ì» 0xccbb
+̼ 0xccbc
+̽ 0xccbd
+̾ 0xccbe
+Ì¿ 0xccbf
+ÌÀ 0xccc0
+ÌÁ 0xccc1
+ÌÂ 0xccc2
+ÌÃ 0xccc3
+ÌÄ 0xccc4
+ÌÅ 0xccc5
+ÌÆ 0xccc6
+ÌÇ 0xccc7
+ÌÈ 0xccc8
+ÌÉ 0xccc9
+ÌÊ 0xccca
+ÌË 0xcccb
+ÌÌ 0xcccc
+ÌÍ 0xcccd
+ÌÎ 0xccce
+ÌÏ 0xcccf
+ÌÐ 0xccd0
+ÌÑ 0xccd1
+ÌÒ 0xccd2
+ÌÓ 0xccd3
+ÌÔ 0xccd4
+ÌÕ 0xccd5
+ÌÖ 0xccd6
+Ì× 0xccd7
+ÌØ 0xccd8
+ÌÙ 0xccd9
+ÌÚ 0xccda
+ÌÛ 0xccdb
+ÌÜ 0xccdc
+ÌÝ 0xccdd
+ÌÞ 0xccde
+Ìß 0xccdf
+Ìà 0xcce0
+Ìá 0xcce1
+Ìâ 0xcce2
+Ìã 0xcce3
+Ìä 0xcce4
+Ìå 0xcce5
+Ìæ 0xcce6
+Ìç 0xcce7
+Ìè 0xcce8
+Ìé 0xcce9
+Ìê 0xccea
+Ìë 0xcceb
+Ìì 0xccec
+Ìí 0xcced
+Ìî 0xccee
+Ìï 0xccef
+Ìð 0xccf0
+Ìñ 0xccf1
+Ìò 0xccf2
+Ìó 0xccf3
+Ìô 0xccf4
+Ìõ 0xccf5
+Ìö 0xccf6
+Ì÷ 0xccf7
+Ìø 0xccf8
+Ìù 0xccf9
+Ìú 0xccfa
+Ìû 0xccfb
+Ìü 0xccfc
+Ìý 0xccfd
+Ìþ 0xccfe
+Í¡ 0xcda1
+Í¢ 0xcda2
+Í£ 0xcda3
+ͤ 0xcda4
+Í¥ 0xcda5
+ͦ 0xcda6
+ͧ 0xcda7
+ͨ 0xcda8
+Í© 0xcda9
+ͪ 0xcdaa
+Í« 0xcdab
+ͬ 0xcdac
+Í­ 0xcdad
+Í® 0xcdae
+ͯ 0xcdaf
+Í° 0xcdb0
+ͱ 0xcdb1
+Ͳ 0xcdb2
+ͳ 0xcdb3
+Í´ 0xcdb4
+͵ 0xcdb5
+Ͷ 0xcdb6
+Í· 0xcdb7
+͸ 0xcdb8
+͹ 0xcdb9
+ͺ 0xcdba
+Í» 0xcdbb
+ͼ 0xcdbc
+ͽ 0xcdbd
+; 0xcdbe
+Í¿ 0xcdbf
+ÍÀ 0xcdc0
+ÍÁ 0xcdc1
+ÍÂ 0xcdc2
+ÍÃ 0xcdc3
+ÍÄ 0xcdc4
+ÍÅ 0xcdc5
+ÍÆ 0xcdc6
+ÍÇ 0xcdc7
+ÍÈ 0xcdc8
+ÍÉ 0xcdc9
+ÍÊ 0xcdca
+ÍË 0xcdcb
+ÍÌ 0xcdcc
+ÍÍ 0xcdcd
+ÍÎ 0xcdce
+ÍÏ 0xcdcf
+ÍÐ 0xcdd0
+ÍÑ 0xcdd1
+ÍÒ 0xcdd2
+ÍÓ 0xcdd3
+ÍÔ 0xcdd4
+ÍÕ 0xcdd5
+ÍÖ 0xcdd6
+Í× 0xcdd7
+ÍØ 0xcdd8
+ÍÙ 0xcdd9
+ÍÚ 0xcdda
+ÍÛ 0xcddb
+ÍÜ 0xcddc
+ÍÝ 0xcddd
+ÍÞ 0xcdde
+Íß 0xcddf
+Íà 0xcde0
+Íá 0xcde1
+Íâ 0xcde2
+Íã 0xcde3
+Íä 0xcde4
+Íå 0xcde5
+Íæ 0xcde6
+Íç 0xcde7
+Íè 0xcde8
+Íé 0xcde9
+Íê 0xcdea
+Íë 0xcdeb
+Íì 0xcdec
+Íí 0xcded
+Íî 0xcdee
+Íï 0xcdef
+Íð 0xcdf0
+Íñ 0xcdf1
+Íò 0xcdf2
+Íó 0xcdf3
+Íô 0xcdf4
+Íõ 0xcdf5
+Íö 0xcdf6
+Í÷ 0xcdf7
+Íø 0xcdf8
+Íù 0xcdf9
+Íú 0xcdfa
+Íû 0xcdfb
+Íü 0xcdfc
+Íý 0xcdfd
+Íþ 0xcdfe
+Ρ 0xcea1
+΢ 0xcea2
+Σ 0xcea3
+Τ 0xcea4
+Î¥ 0xcea5
+Φ 0xcea6
+Χ 0xcea7
+Ψ 0xcea8
+Ω 0xcea9
+Ϊ 0xceaa
+Ϋ 0xceab
+ά 0xceac
+έ 0xcead
+ή 0xceae
+ί 0xceaf
+ΰ 0xceb0
+α 0xceb1
+β 0xceb2
+γ 0xceb3
+δ 0xceb4
+ε 0xceb5
+ζ 0xceb6
+η 0xceb7
+θ 0xceb8
+ι 0xceb9
+κ 0xceba
+λ 0xcebb
+μ 0xcebc
+ν 0xcebd
+ξ 0xcebe
+ο 0xcebf
+ÎÀ 0xcec0
+ÎÁ 0xcec1
+ÎÂ 0xcec2
+ÎÃ 0xcec3
+ÎÄ 0xcec4
+ÎÅ 0xcec5
+ÎÆ 0xcec6
+ÎÇ 0xcec7
+ÎÈ 0xcec8
+ÎÉ 0xcec9
+ÎÊ 0xceca
+ÎË 0xcecb
+ÎÌ 0xcecc
+ÎÍ 0xcecd
+ÎÎ 0xcece
+ÎÏ 0xcecf
+ÎÐ 0xced0
+ÎÑ 0xced1
+ÎÒ 0xced2
+ÎÓ 0xced3
+ÎÔ 0xced4
+ÎÕ 0xced5
+ÎÖ 0xced6
+Î× 0xced7
+ÎØ 0xced8
+ÎÙ 0xced9
+ÎÚ 0xceda
+ÎÛ 0xcedb
+ÎÜ 0xcedc
+ÎÝ 0xcedd
+ÎÞ 0xcede
+Îß 0xcedf
+Îà 0xcee0
+Îá 0xcee1
+Îâ 0xcee2
+Îã 0xcee3
+Îä 0xcee4
+Îå 0xcee5
+Îæ 0xcee6
+Îç 0xcee7
+Îè 0xcee8
+Îé 0xcee9
+Îê 0xceea
+Îë 0xceeb
+Îì 0xceec
+Îí 0xceed
+Îî 0xceee
+Îï 0xceef
+Îð 0xcef0
+Îñ 0xcef1
+Îò 0xcef2
+Îó 0xcef3
+Îô 0xcef4
+Îõ 0xcef5
+Îö 0xcef6
+Î÷ 0xcef7
+Îø 0xcef8
+Îù 0xcef9
+Îú 0xcefa
+Îû 0xcefb
+Îü 0xcefc
+Îý 0xcefd
+Îþ 0xcefe
+Ï¡ 0xcfa1
+Ï¢ 0xcfa2
+Ï£ 0xcfa3
+Ϥ 0xcfa4
+Ï¥ 0xcfa5
+Ϧ 0xcfa6
+ϧ 0xcfa7
+Ϩ 0xcfa8
+Ï© 0xcfa9
+Ϫ 0xcfaa
+Ï« 0xcfab
+Ϭ 0xcfac
+Ï­ 0xcfad
+Ï® 0xcfae
+ϯ 0xcfaf
+Ï° 0xcfb0
+ϱ 0xcfb1
+ϲ 0xcfb2
+ϳ 0xcfb3
+Ï´ 0xcfb4
+ϵ 0xcfb5
+϶ 0xcfb6
+Ï· 0xcfb7
+ϸ 0xcfb8
+Ϲ 0xcfb9
+Ϻ 0xcfba
+Ï» 0xcfbb
+ϼ 0xcfbc
+Ͻ 0xcfbd
+Ͼ 0xcfbe
+Ï¿ 0xcfbf
+ÏÀ 0xcfc0
+ÏÁ 0xcfc1
+ÏÂ 0xcfc2
+ÏÃ 0xcfc3
+ÏÄ 0xcfc4
+ÏÅ 0xcfc5
+ÏÆ 0xcfc6
+ÏÇ 0xcfc7
+ÏÈ 0xcfc8
+ÏÉ 0xcfc9
+ÏÊ 0xcfca
+ÏË 0xcfcb
+ÏÌ 0xcfcc
+ÏÍ 0xcfcd
+ÏÎ 0xcfce
+ÏÏ 0xcfcf
+ÏÐ 0xcfd0
+ÏÑ 0xcfd1
+ÏÒ 0xcfd2
+ÏÓ 0xcfd3
+ÏÔ 0xcfd4
+ÏÕ 0xcfd5
+ÏÖ 0xcfd6
+Ï× 0xcfd7
+ÏØ 0xcfd8
+ÏÙ 0xcfd9
+ÏÚ 0xcfda
+ÏÛ 0xcfdb
+ÏÜ 0xcfdc
+ÏÝ 0xcfdd
+ÏÞ 0xcfde
+Ïß 0xcfdf
+Ïà 0xcfe0
+Ïá 0xcfe1
+Ïâ 0xcfe2
+Ïã 0xcfe3
+Ïä 0xcfe4
+Ïå 0xcfe5
+Ïæ 0xcfe6
+Ïç 0xcfe7
+Ïè 0xcfe8
+Ïé 0xcfe9
+Ïê 0xcfea
+Ïë 0xcfeb
+Ïì 0xcfec
+Ïí 0xcfed
+Ïî 0xcfee
+Ïï 0xcfef
+Ïð 0xcff0
+Ïñ 0xcff1
+Ïò 0xcff2
+Ïó 0xcff3
+Ïô 0xcff4
+Ïõ 0xcff5
+Ïö 0xcff6
+Ï÷ 0xcff7
+Ïø 0xcff8
+Ïù 0xcff9
+Ïú 0xcffa
+Ïû 0xcffb
+Ïü 0xcffc
+Ïý 0xcffd
+Ïþ 0xcffe
+С 0xd0a1
+Т 0xd0a2
+У 0xd0a3
+Ф 0xd0a4
+Ð¥ 0xd0a5
+Ц 0xd0a6
+Ч 0xd0a7
+Ш 0xd0a8
+Щ 0xd0a9
+Ъ 0xd0aa
+Ы 0xd0ab
+Ь 0xd0ac
+Э 0xd0ad
+Ю 0xd0ae
+Я 0xd0af
+а 0xd0b0
+б 0xd0b1
+в 0xd0b2
+г 0xd0b3
+д 0xd0b4
+е 0xd0b5
+ж 0xd0b6
+з 0xd0b7
+и 0xd0b8
+й 0xd0b9
+к 0xd0ba
+л 0xd0bb
+м 0xd0bc
+н 0xd0bd
+о 0xd0be
+п 0xd0bf
+ÐÀ 0xd0c0
+ÐÁ 0xd0c1
+ÐÂ 0xd0c2
+ÐÃ 0xd0c3
+ÐÄ 0xd0c4
+ÐÅ 0xd0c5
+ÐÆ 0xd0c6
+ÐÇ 0xd0c7
+ÐÈ 0xd0c8
+ÐÉ 0xd0c9
+ÐÊ 0xd0ca
+ÐË 0xd0cb
+ÐÌ 0xd0cc
+ÐÍ 0xd0cd
+ÐÎ 0xd0ce
+ÐÏ 0xd0cf
+ÐÐ 0xd0d0
+ÐÑ 0xd0d1
+ÐÒ 0xd0d2
+ÐÓ 0xd0d3
+ÐÔ 0xd0d4
+ÐÕ 0xd0d5
+ÐÖ 0xd0d6
+Ð× 0xd0d7
+ÐØ 0xd0d8
+ÐÙ 0xd0d9
+ÐÚ 0xd0da
+ÐÛ 0xd0db
+ÐÜ 0xd0dc
+ÐÝ 0xd0dd
+ÐÞ 0xd0de
+Ðß 0xd0df
+Ðà 0xd0e0
+Ðá 0xd0e1
+Ðâ 0xd0e2
+Ðã 0xd0e3
+Ðä 0xd0e4
+Ðå 0xd0e5
+Ðæ 0xd0e6
+Ðç 0xd0e7
+Ðè 0xd0e8
+Ðé 0xd0e9
+Ðê 0xd0ea
+Ðë 0xd0eb
+Ðì 0xd0ec
+Ðí 0xd0ed
+Ðî 0xd0ee
+Ðï 0xd0ef
+Ðð 0xd0f0
+Ðñ 0xd0f1
+Ðò 0xd0f2
+Ðó 0xd0f3
+Ðô 0xd0f4
+Ðõ 0xd0f5
+Ðö 0xd0f6
+Ð÷ 0xd0f7
+Ðø 0xd0f8
+Ðù 0xd0f9
+Ðú 0xd0fa
+Ðû 0xd0fb
+Ðü 0xd0fc
+Ðý 0xd0fd
+Ðþ 0xd0fe
+Ñ¡ 0xd1a1
+Ñ¢ 0xd1a2
+Ñ£ 0xd1a3
+Ѥ 0xd1a4
+Ñ¥ 0xd1a5
+Ѧ 0xd1a6
+ѧ 0xd1a7
+Ѩ 0xd1a8
+Ñ© 0xd1a9
+Ѫ 0xd1aa
+Ñ« 0xd1ab
+Ѭ 0xd1ac
+Ñ­ 0xd1ad
+Ñ® 0xd1ae
+ѯ 0xd1af
+Ñ° 0xd1b0
+ѱ 0xd1b1
+Ѳ 0xd1b2
+ѳ 0xd1b3
+Ñ´ 0xd1b4
+ѵ 0xd1b5
+Ѷ 0xd1b6
+Ñ· 0xd1b7
+Ѹ 0xd1b8
+ѹ 0xd1b9
+Ѻ 0xd1ba
+Ñ» 0xd1bb
+Ѽ 0xd1bc
+ѽ 0xd1bd
+Ѿ 0xd1be
+Ñ¿ 0xd1bf
+ÑÀ 0xd1c0
+ÑÁ 0xd1c1
+ÑÂ 0xd1c2
+ÑÃ 0xd1c3
+ÑÄ 0xd1c4
+ÑÅ 0xd1c5
+ÑÆ 0xd1c6
+ÑÇ 0xd1c7
+ÑÈ 0xd1c8
+ÑÉ 0xd1c9
+ÑÊ 0xd1ca
+ÑË 0xd1cb
+ÑÌ 0xd1cc
+ÑÍ 0xd1cd
+ÑÎ 0xd1ce
+ÑÏ 0xd1cf
+ÑÐ 0xd1d0
+ÑÑ 0xd1d1
+ÑÒ 0xd1d2
+ÑÓ 0xd1d3
+ÑÔ 0xd1d4
+ÑÕ 0xd1d5
+ÑÖ 0xd1d6
+Ñ× 0xd1d7
+ÑØ 0xd1d8
+ÑÙ 0xd1d9
+ÑÚ 0xd1da
+ÑÛ 0xd1db
+ÑÜ 0xd1dc
+ÑÝ 0xd1dd
+ÑÞ 0xd1de
+Ñß 0xd1df
+Ñà 0xd1e0
+Ñá 0xd1e1
+Ñâ 0xd1e2
+Ñã 0xd1e3
+Ñä 0xd1e4
+Ñå 0xd1e5
+Ñæ 0xd1e6
+Ñç 0xd1e7
+Ñè 0xd1e8
+Ñé 0xd1e9
+Ñê 0xd1ea
+Ñë 0xd1eb
+Ñì 0xd1ec
+Ñí 0xd1ed
+Ñî 0xd1ee
+Ñï 0xd1ef
+Ñð 0xd1f0
+Ññ 0xd1f1
+Ñò 0xd1f2
+Ñó 0xd1f3
+Ñô 0xd1f4
+Ñõ 0xd1f5
+Ñö 0xd1f6
+Ñ÷ 0xd1f7
+Ñø 0xd1f8
+Ñù 0xd1f9
+Ñú 0xd1fa
+Ñû 0xd1fb
+Ñü 0xd1fc
+Ñý 0xd1fd
+Ñþ 0xd1fe
+Ò¡ 0xd2a1
+Ò¢ 0xd2a2
+Ò£ 0xd2a3
+Ò¤ 0xd2a4
+Ò¥ 0xd2a5
+Ò¦ 0xd2a6
+Ò§ 0xd2a7
+Ò¨ 0xd2a8
+Ò© 0xd2a9
+Òª 0xd2aa
+Ò« 0xd2ab
+Ò¬ 0xd2ac
+Ò­ 0xd2ad
+Ò® 0xd2ae
+Ò¯ 0xd2af
+Ò° 0xd2b0
+Ò± 0xd2b1
+Ò² 0xd2b2
+Ò³ 0xd2b3
+Ò´ 0xd2b4
+Òµ 0xd2b5
+Ò¶ 0xd2b6
+Ò· 0xd2b7
+Ò¸ 0xd2b8
+Ò¹ 0xd2b9
+Òº 0xd2ba
+Ò» 0xd2bb
+Ò¼ 0xd2bc
+Ò½ 0xd2bd
+Ò¾ 0xd2be
+Ò¿ 0xd2bf
+ÒÀ 0xd2c0
+ÒÁ 0xd2c1
+ÒÂ 0xd2c2
+ÒÃ 0xd2c3
+ÒÄ 0xd2c4
+ÒÅ 0xd2c5
+ÒÆ 0xd2c6
+ÒÇ 0xd2c7
+ÒÈ 0xd2c8
+ÒÉ 0xd2c9
+ÒÊ 0xd2ca
+ÒË 0xd2cb
+ÒÌ 0xd2cc
+ÒÍ 0xd2cd
+ÒÎ 0xd2ce
+ÒÏ 0xd2cf
+ÒÐ 0xd2d0
+ÒÑ 0xd2d1
+ÒÒ 0xd2d2
+ÒÓ 0xd2d3
+ÒÔ 0xd2d4
+ÒÕ 0xd2d5
+ÒÖ 0xd2d6
+Ò× 0xd2d7
+ÒØ 0xd2d8
+ÒÙ 0xd2d9
+ÒÚ 0xd2da
+ÒÛ 0xd2db
+ÒÜ 0xd2dc
+ÒÝ 0xd2dd
+ÒÞ 0xd2de
+Òß 0xd2df
+Òà 0xd2e0
+Òá 0xd2e1
+Òâ 0xd2e2
+Òã 0xd2e3
+Òä 0xd2e4
+Òå 0xd2e5
+Òæ 0xd2e6
+Òç 0xd2e7
+Òè 0xd2e8
+Òé 0xd2e9
+Òê 0xd2ea
+Òë 0xd2eb
+Òì 0xd2ec
+Òí 0xd2ed
+Òî 0xd2ee
+Òï 0xd2ef
+Òð 0xd2f0
+Òñ 0xd2f1
+Òò 0xd2f2
+Òó 0xd2f3
+Òô 0xd2f4
+Òõ 0xd2f5
+Òö 0xd2f6
+Ò÷ 0xd2f7
+Òø 0xd2f8
+Òù 0xd2f9
+Òú 0xd2fa
+Òû 0xd2fb
+Òü 0xd2fc
+Òý 0xd2fd
+Òþ 0xd2fe
+Ó¡ 0xd3a1
+Ó¢ 0xd3a2
+Ó£ 0xd3a3
+Ó¤ 0xd3a4
+Ó¥ 0xd3a5
+Ó¦ 0xd3a6
+Ó§ 0xd3a7
+Ó¨ 0xd3a8
+Ó© 0xd3a9
+Óª 0xd3aa
+Ó« 0xd3ab
+Ó¬ 0xd3ac
+Ó­ 0xd3ad
+Ó® 0xd3ae
+Ó¯ 0xd3af
+Ó° 0xd3b0
+Ó± 0xd3b1
+Ó² 0xd3b2
+Ó³ 0xd3b3
+Ó´ 0xd3b4
+Óµ 0xd3b5
+Ó¶ 0xd3b6
+Ó· 0xd3b7
+Ó¸ 0xd3b8
+Ó¹ 0xd3b9
+Óº 0xd3ba
+Ó» 0xd3bb
+Ó¼ 0xd3bc
+Ó½ 0xd3bd
+Ó¾ 0xd3be
+Ó¿ 0xd3bf
+ÓÀ 0xd3c0
+ÓÁ 0xd3c1
+ÓÂ 0xd3c2
+ÓÃ 0xd3c3
+ÓÄ 0xd3c4
+ÓÅ 0xd3c5
+ÓÆ 0xd3c6
+ÓÇ 0xd3c7
+ÓÈ 0xd3c8
+ÓÉ 0xd3c9
+ÓÊ 0xd3ca
+ÓË 0xd3cb
+ÓÌ 0xd3cc
+ÓÍ 0xd3cd
+ÓÎ 0xd3ce
+ÓÏ 0xd3cf
+ÓÐ 0xd3d0
+ÓÑ 0xd3d1
+ÓÒ 0xd3d2
+ÓÓ 0xd3d3
+ÓÔ 0xd3d4
+ÓÕ 0xd3d5
+ÓÖ 0xd3d6
+Ó× 0xd3d7
+ÓØ 0xd3d8
+ÓÙ 0xd3d9
+ÓÚ 0xd3da
+ÓÛ 0xd3db
+ÓÜ 0xd3dc
+ÓÝ 0xd3dd
+ÓÞ 0xd3de
+Óß 0xd3df
+Óà 0xd3e0
+Óá 0xd3e1
+Óâ 0xd3e2
+Óã 0xd3e3
+Óä 0xd3e4
+Óå 0xd3e5
+Óæ 0xd3e6
+Óç 0xd3e7
+Óè 0xd3e8
+Óé 0xd3e9
+Óê 0xd3ea
+Óë 0xd3eb
+Óì 0xd3ec
+Óí 0xd3ed
+Óî 0xd3ee
+Óï 0xd3ef
+Óð 0xd3f0
+Óñ 0xd3f1
+Óò 0xd3f2
+Óó 0xd3f3
+Óô 0xd3f4
+Óõ 0xd3f5
+Óö 0xd3f6
+Ó÷ 0xd3f7
+Óø 0xd3f8
+Óù 0xd3f9
+Óú 0xd3fa
+Óû 0xd3fb
+Óü 0xd3fc
+Óý 0xd3fd
+Óþ 0xd3fe
+Ô¡ 0xd4a1
+Ô¢ 0xd4a2
+Ô£ 0xd4a3
+Ô¤ 0xd4a4
+Ô¥ 0xd4a5
+Ô¦ 0xd4a6
+Ô§ 0xd4a7
+Ô¨ 0xd4a8
+Ô© 0xd4a9
+Ôª 0xd4aa
+Ô« 0xd4ab
+Ô¬ 0xd4ac
+Ô­ 0xd4ad
+Ô® 0xd4ae
+Ô¯ 0xd4af
+Ô° 0xd4b0
+Ô± 0xd4b1
+Ô² 0xd4b2
+Ô³ 0xd4b3
+Ô´ 0xd4b4
+Ôµ 0xd4b5
+Ô¶ 0xd4b6
+Ô· 0xd4b7
+Ô¸ 0xd4b8
+Ô¹ 0xd4b9
+Ôº 0xd4ba
+Ô» 0xd4bb
+Ô¼ 0xd4bc
+Ô½ 0xd4bd
+Ô¾ 0xd4be
+Ô¿ 0xd4bf
+ÔÀ 0xd4c0
+ÔÁ 0xd4c1
+ÔÂ 0xd4c2
+ÔÃ 0xd4c3
+ÔÄ 0xd4c4
+ÔÅ 0xd4c5
+ÔÆ 0xd4c6
+ÔÇ 0xd4c7
+ÔÈ 0xd4c8
+ÔÉ 0xd4c9
+ÔÊ 0xd4ca
+ÔË 0xd4cb
+ÔÌ 0xd4cc
+ÔÍ 0xd4cd
+ÔÎ 0xd4ce
+ÔÏ 0xd4cf
+ÔÐ 0xd4d0
+ÔÑ 0xd4d1
+ÔÒ 0xd4d2
+ÔÓ 0xd4d3
+ÔÔ 0xd4d4
+ÔÕ 0xd4d5
+ÔÖ 0xd4d6
+Ô× 0xd4d7
+ÔØ 0xd4d8
+ÔÙ 0xd4d9
+ÔÚ 0xd4da
+ÔÛ 0xd4db
+ÔÜ 0xd4dc
+ÔÝ 0xd4dd
+ÔÞ 0xd4de
+Ôß 0xd4df
+Ôà 0xd4e0
+Ôá 0xd4e1
+Ôâ 0xd4e2
+Ôã 0xd4e3
+Ôä 0xd4e4
+Ôå 0xd4e5
+Ôæ 0xd4e6
+Ôç 0xd4e7
+Ôè 0xd4e8
+Ôé 0xd4e9
+Ôê 0xd4ea
+Ôë 0xd4eb
+Ôì 0xd4ec
+Ôí 0xd4ed
+Ôî 0xd4ee
+Ôï 0xd4ef
+Ôð 0xd4f0
+Ôñ 0xd4f1
+Ôò 0xd4f2
+Ôó 0xd4f3
+Ôô 0xd4f4
+Ôõ 0xd4f5
+Ôö 0xd4f6
+Ô÷ 0xd4f7
+Ôø 0xd4f8
+Ôù 0xd4f9
+Ôú 0xd4fa
+Ôû 0xd4fb
+Ôü 0xd4fc
+Ôý 0xd4fd
+Ôþ 0xd4fe
+Õ¡ 0xd5a1
+Õ¢ 0xd5a2
+Õ£ 0xd5a3
+Õ¤ 0xd5a4
+Õ¥ 0xd5a5
+Õ¦ 0xd5a6
+Õ§ 0xd5a7
+Õ¨ 0xd5a8
+Õ© 0xd5a9
+Õª 0xd5aa
+Õ« 0xd5ab
+Õ¬ 0xd5ac
+Õ­ 0xd5ad
+Õ® 0xd5ae
+Õ¯ 0xd5af
+Õ° 0xd5b0
+Õ± 0xd5b1
+Õ² 0xd5b2
+Õ³ 0xd5b3
+Õ´ 0xd5b4
+Õµ 0xd5b5
+Õ¶ 0xd5b6
+Õ· 0xd5b7
+Õ¸ 0xd5b8
+Õ¹ 0xd5b9
+Õº 0xd5ba
+Õ» 0xd5bb
+Õ¼ 0xd5bc
+Õ½ 0xd5bd
+Õ¾ 0xd5be
+Õ¿ 0xd5bf
+ÕÀ 0xd5c0
+ÕÁ 0xd5c1
+ÕÂ 0xd5c2
+ÕÃ 0xd5c3
+ÕÄ 0xd5c4
+ÕÅ 0xd5c5
+ÕÆ 0xd5c6
+ÕÇ 0xd5c7
+ÕÈ 0xd5c8
+ÕÉ 0xd5c9
+ÕÊ 0xd5ca
+ÕË 0xd5cb
+ÕÌ 0xd5cc
+ÕÍ 0xd5cd
+ÕÎ 0xd5ce
+ÕÏ 0xd5cf
+ÕÐ 0xd5d0
+ÕÑ 0xd5d1
+ÕÒ 0xd5d2
+ÕÓ 0xd5d3
+ÕÔ 0xd5d4
+ÕÕ 0xd5d5
+ÕÖ 0xd5d6
+Õ× 0xd5d7
+ÕØ 0xd5d8
+ÕÙ 0xd5d9
+ÕÚ 0xd5da
+ÕÛ 0xd5db
+ÕÜ 0xd5dc
+ÕÝ 0xd5dd
+ÕÞ 0xd5de
+Õß 0xd5df
+Õà 0xd5e0
+Õá 0xd5e1
+Õâ 0xd5e2
+Õã 0xd5e3
+Õä 0xd5e4
+Õå 0xd5e5
+Õæ 0xd5e6
+Õç 0xd5e7
+Õè 0xd5e8
+Õé 0xd5e9
+Õê 0xd5ea
+Õë 0xd5eb
+Õì 0xd5ec
+Õí 0xd5ed
+Õî 0xd5ee
+Õï 0xd5ef
+Õð 0xd5f0
+Õñ 0xd5f1
+Õò 0xd5f2
+Õó 0xd5f3
+Õô 0xd5f4
+Õõ 0xd5f5
+Õö 0xd5f6
+Õ÷ 0xd5f7
+Õø 0xd5f8
+Õù 0xd5f9
+Õú 0xd5fa
+Õû 0xd5fb
+Õü 0xd5fc
+Õý 0xd5fd
+Õþ 0xd5fe
+Ö¡ 0xd6a1
+Ö¢ 0xd6a2
+Ö£ 0xd6a3
+Ö¤ 0xd6a4
+Ö¥ 0xd6a5
+Ö¦ 0xd6a6
+Ö§ 0xd6a7
+Ö¨ 0xd6a8
+Ö© 0xd6a9
+Öª 0xd6aa
+Ö« 0xd6ab
+Ö¬ 0xd6ac
+Ö­ 0xd6ad
+Ö® 0xd6ae
+Ö¯ 0xd6af
+Ö° 0xd6b0
+Ö± 0xd6b1
+Ö² 0xd6b2
+Ö³ 0xd6b3
+Ö´ 0xd6b4
+Öµ 0xd6b5
+Ö¶ 0xd6b6
+Ö· 0xd6b7
+Ö¸ 0xd6b8
+Ö¹ 0xd6b9
+Öº 0xd6ba
+Ö» 0xd6bb
+Ö¼ 0xd6bc
+Ö½ 0xd6bd
+Ö¾ 0xd6be
+Ö¿ 0xd6bf
+ÖÀ 0xd6c0
+ÖÁ 0xd6c1
+ÖÂ 0xd6c2
+ÖÃ 0xd6c3
+ÖÄ 0xd6c4
+ÖÅ 0xd6c5
+ÖÆ 0xd6c6
+ÖÇ 0xd6c7
+ÖÈ 0xd6c8
+ÖÉ 0xd6c9
+ÖÊ 0xd6ca
+ÖË 0xd6cb
+ÖÌ 0xd6cc
+ÖÍ 0xd6cd
+ÖÎ 0xd6ce
+ÖÏ 0xd6cf
+ÖÐ 0xd6d0
+ÖÑ 0xd6d1
+ÖÒ 0xd6d2
+ÖÓ 0xd6d3
+ÖÔ 0xd6d4
+ÖÕ 0xd6d5
+ÖÖ 0xd6d6
+Ö× 0xd6d7
+ÖØ 0xd6d8
+ÖÙ 0xd6d9
+ÖÚ 0xd6da
+ÖÛ 0xd6db
+ÖÜ 0xd6dc
+ÖÝ 0xd6dd
+ÖÞ 0xd6de
+Öß 0xd6df
+Öà 0xd6e0
+Öá 0xd6e1
+Öâ 0xd6e2
+Öã 0xd6e3
+Öä 0xd6e4
+Öå 0xd6e5
+Öæ 0xd6e6
+Öç 0xd6e7
+Öè 0xd6e8
+Öé 0xd6e9
+Öê 0xd6ea
+Öë 0xd6eb
+Öì 0xd6ec
+Öí 0xd6ed
+Öî 0xd6ee
+Öï 0xd6ef
+Öð 0xd6f0
+Öñ 0xd6f1
+Öò 0xd6f2
+Öó 0xd6f3
+Öô 0xd6f4
+Öõ 0xd6f5
+Öö 0xd6f6
+Ö÷ 0xd6f7
+Öø 0xd6f8
+Öù 0xd6f9
+Öú 0xd6fa
+Öû 0xd6fb
+Öü 0xd6fc
+Öý 0xd6fd
+Öþ 0xd6fe
+ס 0xd7a1
+×¢ 0xd7a2
+×£ 0xd7a3
+פ 0xd7a4
+×¥ 0xd7a5
+צ 0xd7a6
+ק 0xd7a7
+ר 0xd7a8
+ש 0xd7a9
+ת 0xd7aa
+׫ 0xd7ab
+׬ 0xd7ac
+×­ 0xd7ad
+×® 0xd7ae
+ׯ 0xd7af
+×° 0xd7b0
+×± 0xd7b1
+ײ 0xd7b2
+׳ 0xd7b3
+×´ 0xd7b4
+×µ 0xd7b5
+׶ 0xd7b6
+×· 0xd7b7
+׸ 0xd7b8
+×¹ 0xd7b9
+׺ 0xd7ba
+×» 0xd7bb
+×¼ 0xd7bc
+×½ 0xd7bd
+×¾ 0xd7be
+׿ 0xd7bf
+×À 0xd7c0
+×Á 0xd7c1
+× 0xd7c2
+×à 0xd7c3
+×Ä 0xd7c4
+×Å 0xd7c5
+×Æ 0xd7c6
+×Ç 0xd7c7
+×È 0xd7c8
+×É 0xd7c9
+×Ê 0xd7ca
+×Ë 0xd7cb
+×Ì 0xd7cc
+×Í 0xd7cd
+×Î 0xd7ce
+×Ï 0xd7cf
+×Ð 0xd7d0
+×Ñ 0xd7d1
+×Ò 0xd7d2
+×Ó 0xd7d3
+×Ô 0xd7d4
+×Õ 0xd7d5
+×Ö 0xd7d6
+×× 0xd7d7
+×Ø 0xd7d8
+×Ù 0xd7d9
+×Ú 0xd7da
+×Û 0xd7db
+×Ü 0xd7dc
+×Ý 0xd7dd
+×Þ 0xd7de
+×ß 0xd7df
+×à 0xd7e0
+×á 0xd7e1
+×â 0xd7e2
+×ã 0xd7e3
+×ä 0xd7e4
+×å 0xd7e5
+×æ 0xd7e6
+×ç 0xd7e7
+×è 0xd7e8
+×é 0xd7e9
+×ê 0xd7ea
+×ë 0xd7eb
+×ì 0xd7ec
+×í 0xd7ed
+×î 0xd7ee
+×ï 0xd7ef
+×ð 0xd7f0
+×ñ 0xd7f1
+×ò 0xd7f2
+×ó 0xd7f3
+×ô 0xd7f4
+×õ 0xd7f5
+×ö 0xd7f6
+×÷ 0xd7f7
+×ø 0xd7f8
+×ù 0xd7f9
+Ø¡ 0xd8a1
+Ø¢ 0xd8a2
+Ø£ 0xd8a3
+ؤ 0xd8a4
+Ø¥ 0xd8a5
+ئ 0xd8a6
+ا 0xd8a7
+ب 0xd8a8
+Ø© 0xd8a9
+ت 0xd8aa
+Ø« 0xd8ab
+ج 0xd8ac
+Ø­ 0xd8ad
+Ø® 0xd8ae
+د 0xd8af
+Ø° 0xd8b0
+ر 0xd8b1
+ز 0xd8b2
+س 0xd8b3
+Ø´ 0xd8b4
+ص 0xd8b5
+ض 0xd8b6
+Ø· 0xd8b7
+ظ 0xd8b8
+ع 0xd8b9
+غ 0xd8ba
+Ø» 0xd8bb
+ؼ 0xd8bc
+ؽ 0xd8bd
+ؾ 0xd8be
+Ø¿ 0xd8bf
+ØÀ 0xd8c0
+ØÁ 0xd8c1
+ØÂ 0xd8c2
+ØÃ 0xd8c3
+ØÄ 0xd8c4
+ØÅ 0xd8c5
+ØÆ 0xd8c6
+ØÇ 0xd8c7
+ØÈ 0xd8c8
+ØÉ 0xd8c9
+ØÊ 0xd8ca
+ØË 0xd8cb
+ØÌ 0xd8cc
+ØÍ 0xd8cd
+ØÎ 0xd8ce
+ØÏ 0xd8cf
+ØÐ 0xd8d0
+ØÑ 0xd8d1
+ØÒ 0xd8d2
+ØÓ 0xd8d3
+ØÔ 0xd8d4
+ØÕ 0xd8d5
+ØÖ 0xd8d6
+Ø× 0xd8d7
+ØØ 0xd8d8
+ØÙ 0xd8d9
+ØÚ 0xd8da
+ØÛ 0xd8db
+ØÜ 0xd8dc
+ØÝ 0xd8dd
+ØÞ 0xd8de
+Øß 0xd8df
+Øà 0xd8e0
+Øá 0xd8e1
+Øâ 0xd8e2
+Øã 0xd8e3
+Øä 0xd8e4
+Øå 0xd8e5
+Øæ 0xd8e6
+Øç 0xd8e7
+Øè 0xd8e8
+Øé 0xd8e9
+Øê 0xd8ea
+Øë 0xd8eb
+Øì 0xd8ec
+Øí 0xd8ed
+Øî 0xd8ee
+Øï 0xd8ef
+Øð 0xd8f0
+Øñ 0xd8f1
+Øò 0xd8f2
+Øó 0xd8f3
+Øô 0xd8f4
+Øõ 0xd8f5
+Øö 0xd8f6
+Ø÷ 0xd8f7
+Øø 0xd8f8
+Øù 0xd8f9
+Øú 0xd8fa
+Øû 0xd8fb
+Øü 0xd8fc
+Øý 0xd8fd
+Øþ 0xd8fe
+Ù¡ 0xd9a1
+Ù¢ 0xd9a2
+Ù£ 0xd9a3
+Ù¤ 0xd9a4
+Ù¥ 0xd9a5
+Ù¦ 0xd9a6
+Ù§ 0xd9a7
+Ù¨ 0xd9a8
+Ù© 0xd9a9
+Ùª 0xd9aa
+Ù« 0xd9ab
+Ù¬ 0xd9ac
+Ù­ 0xd9ad
+Ù® 0xd9ae
+Ù¯ 0xd9af
+Ù° 0xd9b0
+Ù± 0xd9b1
+Ù² 0xd9b2
+Ù³ 0xd9b3
+Ù´ 0xd9b4
+Ùµ 0xd9b5
+Ù¶ 0xd9b6
+Ù· 0xd9b7
+Ù¸ 0xd9b8
+Ù¹ 0xd9b9
+Ùº 0xd9ba
+Ù» 0xd9bb
+Ù¼ 0xd9bc
+Ù½ 0xd9bd
+Ù¾ 0xd9be
+Ù¿ 0xd9bf
+ÙÀ 0xd9c0
+ÙÁ 0xd9c1
+ÙÂ 0xd9c2
+ÙÃ 0xd9c3
+ÙÄ 0xd9c4
+ÙÅ 0xd9c5
+ÙÆ 0xd9c6
+ÙÇ 0xd9c7
+ÙÈ 0xd9c8
+ÙÉ 0xd9c9
+ÙÊ 0xd9ca
+ÙË 0xd9cb
+ÙÌ 0xd9cc
+ÙÍ 0xd9cd
+ÙÎ 0xd9ce
+ÙÏ 0xd9cf
+ÙÐ 0xd9d0
+ÙÑ 0xd9d1
+ÙÒ 0xd9d2
+ÙÓ 0xd9d3
+ÙÔ 0xd9d4
+ÙÕ 0xd9d5
+ÙÖ 0xd9d6
+Ù× 0xd9d7
+ÙØ 0xd9d8
+ÙÙ 0xd9d9
+ÙÚ 0xd9da
+ÙÛ 0xd9db
+ÙÜ 0xd9dc
+ÙÝ 0xd9dd
+ÙÞ 0xd9de
+Ùß 0xd9df
+Ùà 0xd9e0
+Ùá 0xd9e1
+Ùâ 0xd9e2
+Ùã 0xd9e3
+Ùä 0xd9e4
+Ùå 0xd9e5
+Ùæ 0xd9e6
+Ùç 0xd9e7
+Ùè 0xd9e8
+Ùé 0xd9e9
+Ùê 0xd9ea
+Ùë 0xd9eb
+Ùì 0xd9ec
+Ùí 0xd9ed
+Ùî 0xd9ee
+Ùï 0xd9ef
+Ùð 0xd9f0
+Ùñ 0xd9f1
+Ùò 0xd9f2
+Ùó 0xd9f3
+Ùô 0xd9f4
+Ùõ 0xd9f5
+Ùö 0xd9f6
+Ù÷ 0xd9f7
+Ùø 0xd9f8
+Ùù 0xd9f9
+Ùú 0xd9fa
+Ùû 0xd9fb
+Ùü 0xd9fc
+Ùý 0xd9fd
+Ùþ 0xd9fe
+Ú¡ 0xdaa1
+Ú¢ 0xdaa2
+Ú£ 0xdaa3
+Ú¤ 0xdaa4
+Ú¥ 0xdaa5
+Ú¦ 0xdaa6
+Ú§ 0xdaa7
+Ú¨ 0xdaa8
+Ú© 0xdaa9
+Úª 0xdaaa
+Ú« 0xdaab
+Ú¬ 0xdaac
+Ú­ 0xdaad
+Ú® 0xdaae
+Ú¯ 0xdaaf
+Ú° 0xdab0
+Ú± 0xdab1
+Ú² 0xdab2
+Ú³ 0xdab3
+Ú´ 0xdab4
+Úµ 0xdab5
+Ú¶ 0xdab6
+Ú· 0xdab7
+Ú¸ 0xdab8
+Ú¹ 0xdab9
+Úº 0xdaba
+Ú» 0xdabb
+Ú¼ 0xdabc
+Ú½ 0xdabd
+Ú¾ 0xdabe
+Ú¿ 0xdabf
+ÚÀ 0xdac0
+ÚÁ 0xdac1
+ÚÂ 0xdac2
+ÚÃ 0xdac3
+ÚÄ 0xdac4
+ÚÅ 0xdac5
+ÚÆ 0xdac6
+ÚÇ 0xdac7
+ÚÈ 0xdac8
+ÚÉ 0xdac9
+ÚÊ 0xdaca
+ÚË 0xdacb
+ÚÌ 0xdacc
+ÚÍ 0xdacd
+ÚÎ 0xdace
+ÚÏ 0xdacf
+ÚÐ 0xdad0
+ÚÑ 0xdad1
+ÚÒ 0xdad2
+ÚÓ 0xdad3
+ÚÔ 0xdad4
+ÚÕ 0xdad5
+ÚÖ 0xdad6
+Ú× 0xdad7
+ÚØ 0xdad8
+ÚÙ 0xdad9
+ÚÚ 0xdada
+ÚÛ 0xdadb
+ÚÜ 0xdadc
+ÚÝ 0xdadd
+ÚÞ 0xdade
+Úß 0xdadf
+Úà 0xdae0
+Úá 0xdae1
+Úâ 0xdae2
+Úã 0xdae3
+Úä 0xdae4
+Úå 0xdae5
+Úæ 0xdae6
+Úç 0xdae7
+Úè 0xdae8
+Úé 0xdae9
+Úê 0xdaea
+Úë 0xdaeb
+Úì 0xdaec
+Úí 0xdaed
+Úî 0xdaee
+Úï 0xdaef
+Úð 0xdaf0
+Úñ 0xdaf1
+Úò 0xdaf2
+Úó 0xdaf3
+Úô 0xdaf4
+Úõ 0xdaf5
+Úö 0xdaf6
+Ú÷ 0xdaf7
+Úø 0xdaf8
+Úù 0xdaf9
+Úú 0xdafa
+Úû 0xdafb
+Úü 0xdafc
+Úý 0xdafd
+Úþ 0xdafe
+Û¡ 0xdba1
+Û¢ 0xdba2
+Û£ 0xdba3
+Û¤ 0xdba4
+Û¥ 0xdba5
+Û¦ 0xdba6
+Û§ 0xdba7
+Û¨ 0xdba8
+Û© 0xdba9
+Ûª 0xdbaa
+Û« 0xdbab
+Û¬ 0xdbac
+Û­ 0xdbad
+Û® 0xdbae
+Û¯ 0xdbaf
+Û° 0xdbb0
+Û± 0xdbb1
+Û² 0xdbb2
+Û³ 0xdbb3
+Û´ 0xdbb4
+Ûµ 0xdbb5
+Û¶ 0xdbb6
+Û· 0xdbb7
+Û¸ 0xdbb8
+Û¹ 0xdbb9
+Ûº 0xdbba
+Û» 0xdbbb
+Û¼ 0xdbbc
+Û½ 0xdbbd
+Û¾ 0xdbbe
+Û¿ 0xdbbf
+ÛÀ 0xdbc0
+ÛÁ 0xdbc1
+ÛÂ 0xdbc2
+ÛÃ 0xdbc3
+ÛÄ 0xdbc4
+ÛÅ 0xdbc5
+ÛÆ 0xdbc6
+ÛÇ 0xdbc7
+ÛÈ 0xdbc8
+ÛÉ 0xdbc9
+ÛÊ 0xdbca
+ÛË 0xdbcb
+ÛÌ 0xdbcc
+ÛÍ 0xdbcd
+ÛÎ 0xdbce
+ÛÏ 0xdbcf
+ÛÐ 0xdbd0
+ÛÑ 0xdbd1
+ÛÒ 0xdbd2
+ÛÓ 0xdbd3
+ÛÔ 0xdbd4
+ÛÕ 0xdbd5
+ÛÖ 0xdbd6
+Û× 0xdbd7
+ÛØ 0xdbd8
+ÛÙ 0xdbd9
+ÛÚ 0xdbda
+ÛÛ 0xdbdb
+ÛÜ 0xdbdc
+ÛÝ 0xdbdd
+ÛÞ 0xdbde
+Ûß 0xdbdf
+Ûà 0xdbe0
+Ûá 0xdbe1
+Ûâ 0xdbe2
+Ûã 0xdbe3
+Ûä 0xdbe4
+Ûå 0xdbe5
+Ûæ 0xdbe6
+Ûç 0xdbe7
+Ûè 0xdbe8
+Ûé 0xdbe9
+Ûê 0xdbea
+Ûë 0xdbeb
+Ûì 0xdbec
+Ûí 0xdbed
+Ûî 0xdbee
+Ûï 0xdbef
+Ûð 0xdbf0
+Ûñ 0xdbf1
+Ûò 0xdbf2
+Ûó 0xdbf3
+Ûô 0xdbf4
+Ûõ 0xdbf5
+Ûö 0xdbf6
+Û÷ 0xdbf7
+Ûø 0xdbf8
+Ûù 0xdbf9
+Ûú 0xdbfa
+Ûû 0xdbfb
+Ûü 0xdbfc
+Ûý 0xdbfd
+Ûþ 0xdbfe
+Ü¡ 0xdca1
+Ü¢ 0xdca2
+Ü£ 0xdca3
+ܤ 0xdca4
+Ü¥ 0xdca5
+ܦ 0xdca6
+ܧ 0xdca7
+ܨ 0xdca8
+Ü© 0xdca9
+ܪ 0xdcaa
+Ü« 0xdcab
+ܬ 0xdcac
+Ü­ 0xdcad
+Ü® 0xdcae
+ܯ 0xdcaf
+Ü° 0xdcb0
+ܱ 0xdcb1
+ܲ 0xdcb2
+ܳ 0xdcb3
+Ü´ 0xdcb4
+ܵ 0xdcb5
+ܶ 0xdcb6
+Ü· 0xdcb7
+ܸ 0xdcb8
+ܹ 0xdcb9
+ܺ 0xdcba
+Ü» 0xdcbb
+ܼ 0xdcbc
+ܽ 0xdcbd
+ܾ 0xdcbe
+Ü¿ 0xdcbf
+ÜÀ 0xdcc0
+ÜÁ 0xdcc1
+ÜÂ 0xdcc2
+ÜÃ 0xdcc3
+ÜÄ 0xdcc4
+ÜÅ 0xdcc5
+ÜÆ 0xdcc6
+ÜÇ 0xdcc7
+ÜÈ 0xdcc8
+ÜÉ 0xdcc9
+ÜÊ 0xdcca
+ÜË 0xdccb
+ÜÌ 0xdccc
+ÜÍ 0xdccd
+ÜÎ 0xdcce
+ÜÏ 0xdccf
+ÜÐ 0xdcd0
+ÜÑ 0xdcd1
+ÜÒ 0xdcd2
+ÜÓ 0xdcd3
+ÜÔ 0xdcd4
+ÜÕ 0xdcd5
+ÜÖ 0xdcd6
+Ü× 0xdcd7
+ÜØ 0xdcd8
+ÜÙ 0xdcd9
+ÜÚ 0xdcda
+ÜÛ 0xdcdb
+ÜÜ 0xdcdc
+ÜÝ 0xdcdd
+ÜÞ 0xdcde
+Üß 0xdcdf
+Üà 0xdce0
+Üá 0xdce1
+Üâ 0xdce2
+Üã 0xdce3
+Üä 0xdce4
+Üå 0xdce5
+Üæ 0xdce6
+Üç 0xdce7
+Üè 0xdce8
+Üé 0xdce9
+Üê 0xdcea
+Üë 0xdceb
+Üì 0xdcec
+Üí 0xdced
+Üî 0xdcee
+Üï 0xdcef
+Üð 0xdcf0
+Üñ 0xdcf1
+Üò 0xdcf2
+Üó 0xdcf3
+Üô 0xdcf4
+Üõ 0xdcf5
+Üö 0xdcf6
+Ü÷ 0xdcf7
+Üø 0xdcf8
+Üù 0xdcf9
+Üú 0xdcfa
+Üû 0xdcfb
+Üü 0xdcfc
+Üý 0xdcfd
+Üþ 0xdcfe
+Ý¡ 0xdda1
+Ý¢ 0xdda2
+Ý£ 0xdda3
+ݤ 0xdda4
+Ý¥ 0xdda5
+ݦ 0xdda6
+ݧ 0xdda7
+ݨ 0xdda8
+Ý© 0xdda9
+ݪ 0xddaa
+Ý« 0xddab
+ݬ 0xddac
+Ý­ 0xddad
+Ý® 0xddae
+ݯ 0xddaf
+Ý° 0xddb0
+ݱ 0xddb1
+ݲ 0xddb2
+ݳ 0xddb3
+Ý´ 0xddb4
+ݵ 0xddb5
+ݶ 0xddb6
+Ý· 0xddb7
+ݸ 0xddb8
+ݹ 0xddb9
+ݺ 0xddba
+Ý» 0xddbb
+ݼ 0xddbc
+ݽ 0xddbd
+ݾ 0xddbe
+Ý¿ 0xddbf
+ÝÀ 0xddc0
+ÝÁ 0xddc1
+ÝÂ 0xddc2
+ÝÃ 0xddc3
+ÝÄ 0xddc4
+ÝÅ 0xddc5
+ÝÆ 0xddc6
+ÝÇ 0xddc7
+ÝÈ 0xddc8
+ÝÉ 0xddc9
+ÝÊ 0xddca
+ÝË 0xddcb
+ÝÌ 0xddcc
+ÝÍ 0xddcd
+ÝÎ 0xddce
+ÝÏ 0xddcf
+ÝÐ 0xddd0
+ÝÑ 0xddd1
+ÝÒ 0xddd2
+ÝÓ 0xddd3
+ÝÔ 0xddd4
+ÝÕ 0xddd5
+ÝÖ 0xddd6
+Ý× 0xddd7
+ÝØ 0xddd8
+ÝÙ 0xddd9
+ÝÚ 0xddda
+ÝÛ 0xdddb
+ÝÜ 0xdddc
+ÝÝ 0xdddd
+ÝÞ 0xddde
+Ýß 0xdddf
+Ýà 0xdde0
+Ýá 0xdde1
+Ýâ 0xdde2
+Ýã 0xdde3
+Ýä 0xdde4
+Ýå 0xdde5
+Ýæ 0xdde6
+Ýç 0xdde7
+Ýè 0xdde8
+Ýé 0xdde9
+Ýê 0xddea
+Ýë 0xddeb
+Ýì 0xddec
+Ýí 0xdded
+Ýî 0xddee
+Ýï 0xddef
+Ýð 0xddf0
+Ýñ 0xddf1
+Ýò 0xddf2
+Ýó 0xddf3
+Ýô 0xddf4
+Ýõ 0xddf5
+Ýö 0xddf6
+Ý÷ 0xddf7
+Ýø 0xddf8
+Ýù 0xddf9
+Ýú 0xddfa
+Ýû 0xddfb
+Ýü 0xddfc
+Ýý 0xddfd
+Ýþ 0xddfe
+Þ¡ 0xdea1
+Þ¢ 0xdea2
+Þ£ 0xdea3
+Þ¤ 0xdea4
+Þ¥ 0xdea5
+Þ¦ 0xdea6
+Þ§ 0xdea7
+Þ¨ 0xdea8
+Þ© 0xdea9
+Þª 0xdeaa
+Þ« 0xdeab
+Þ¬ 0xdeac
+Þ­ 0xdead
+Þ® 0xdeae
+Þ¯ 0xdeaf
+Þ° 0xdeb0
+Þ± 0xdeb1
+Þ² 0xdeb2
+Þ³ 0xdeb3
+Þ´ 0xdeb4
+Þµ 0xdeb5
+Þ¶ 0xdeb6
+Þ· 0xdeb7
+Þ¸ 0xdeb8
+Þ¹ 0xdeb9
+Þº 0xdeba
+Þ» 0xdebb
+Þ¼ 0xdebc
+Þ½ 0xdebd
+Þ¾ 0xdebe
+Þ¿ 0xdebf
+ÞÀ 0xdec0
+ÞÁ 0xdec1
+ÞÂ 0xdec2
+ÞÃ 0xdec3
+ÞÄ 0xdec4
+ÞÅ 0xdec5
+ÞÆ 0xdec6
+ÞÇ 0xdec7
+ÞÈ 0xdec8
+ÞÉ 0xdec9
+ÞÊ 0xdeca
+ÞË 0xdecb
+ÞÌ 0xdecc
+ÞÍ 0xdecd
+ÞÎ 0xdece
+ÞÏ 0xdecf
+ÞÐ 0xded0
+ÞÑ 0xded1
+ÞÒ 0xded2
+ÞÓ 0xded3
+ÞÔ 0xded4
+ÞÕ 0xded5
+ÞÖ 0xded6
+Þ× 0xded7
+ÞØ 0xded8
+ÞÙ 0xded9
+ÞÚ 0xdeda
+ÞÛ 0xdedb
+ÞÜ 0xdedc
+ÞÝ 0xdedd
+ÞÞ 0xdede
+Þß 0xdedf
+Þà 0xdee0
+Þá 0xdee1
+Þâ 0xdee2
+Þã 0xdee3
+Þä 0xdee4
+Þå 0xdee5
+Þæ 0xdee6
+Þç 0xdee7
+Þè 0xdee8
+Þé 0xdee9
+Þê 0xdeea
+Þë 0xdeeb
+Þì 0xdeec
+Þí 0xdeed
+Þî 0xdeee
+Þï 0xdeef
+Þð 0xdef0
+Þñ 0xdef1
+Þò 0xdef2
+Þó 0xdef3
+Þô 0xdef4
+Þõ 0xdef5
+Þö 0xdef6
+Þ÷ 0xdef7
+Þø 0xdef8
+Þù 0xdef9
+Þú 0xdefa
+Þû 0xdefb
+Þü 0xdefc
+Þý 0xdefd
+Þþ 0xdefe
+ß¡ 0xdfa1
+ߢ 0xdfa2
+ߣ 0xdfa3
+ߤ 0xdfa4
+ߥ 0xdfa5
+ߦ 0xdfa6
+ߧ 0xdfa7
+ߨ 0xdfa8
+ß© 0xdfa9
+ߪ 0xdfaa
+ß« 0xdfab
+߬ 0xdfac
+ß­ 0xdfad
+ß® 0xdfae
+߯ 0xdfaf
+ß° 0xdfb0
+ß± 0xdfb1
+ß² 0xdfb2
+ß³ 0xdfb3
+ß´ 0xdfb4
+ßµ 0xdfb5
+߶ 0xdfb6
+ß· 0xdfb7
+߸ 0xdfb8
+ß¹ 0xdfb9
+ߺ 0xdfba
+ß» 0xdfbb
+ß¼ 0xdfbc
+ß½ 0xdfbd
+ß¾ 0xdfbe
+ß¿ 0xdfbf
+ßÀ 0xdfc0
+ßÁ 0xdfc1
+ß 0xdfc2
+ßà 0xdfc3
+Ꭰ0xdfc4
+Ꮰ0xdfc5
+ᒠ0xdfc6
+ဠ0xdfc7
+ßÈ 0xdfc8
+ᐠ0xdfc9
+ßÊ 0xdfca
+ßË 0xdfcb
+ßÌ 0xdfcc
+ßÍ 0xdfcd
+ßÎ 0xdfce
+ßÏ 0xdfcf
+ßÐ 0xdfd0
+ᥠ0xdfd1
+ßÒ 0xdfd2
+ßÓ 0xdfd3
+ßÔ 0xdfd4
+ßÕ 0xdfd5
+ßÖ 0xdfd6
+ß× 0xdfd7
+ßØ 0xdfd8
+ßÙ 0xdfd9
+ßÚ 0xdfda
+ßÛ 0xdfdb
+ᚠ0xdfdc
+ßÝ 0xdfdd
+ßÞ 0xdfde
+ßß 0xdfdf
+ßà 0xdfe0
+ßá 0xdfe1
+ßâ 0xdfe2
+ßã 0xdfe3
+ßä 0xdfe4
+ßå 0xdfe5
+ßæ 0xdfe6
+ßç 0xdfe7
+ßè 0xdfe8
+ßé 0xdfe9
+ßê 0xdfea
+ßë 0xdfeb
+ßì 0xdfec
+ßí 0xdfed
+ßî 0xdfee
+ßï 0xdfef
+ßð 0xdff0
+ßñ 0xdff1
+ßò 0xdff2
+ßó 0xdff3
+ßô 0xdff4
+ßõ 0xdff5
+ßö 0xdff6
+ß÷ 0xdff7
+ßø 0xdff8
+ßù 0xdff9
+ßú 0xdffa
+ßû 0xdffb
+ßü 0xdffc
+ßý 0xdffd
+ßþ 0xdffe
+à¡ 0xe0a1
+ࢠ0xe0a2
+࣠0xe0a3
+ठ0xe0a4
+ॠ0xe0a5
+ঠ0xe0a6
+ৠ0xe0a7
+ਠ0xe0a8
+à© 0xe0a9
+ઠ0xe0aa
+à« 0xe0ab
+ଠ0xe0ac
+à­ 0xe0ad
+à® 0xe0ae
+௠0xe0af
+à° 0xe0b0
+à± 0xe0b1
+ಠ0xe0b2
+à³ 0xe0b3
+à´ 0xe0b4
+ൠ0xe0b5
+ච0xe0b6
+à· 0xe0b7
+ภ0xe0b8
+๠0xe0b9
+ຠ0xe0ba
+à» 0xe0bb
+༠0xe0bc
+འ0xe0bd
+ྠ0xe0be
+à¿ 0xe0bf
+àÀ 0xe0c0
+àÁ 0xe0c1
+à 0xe0c2
+àà 0xe0c3
+àÄ 0xe0c4
+àÅ 0xe0c5
+àÆ 0xe0c6
+àÇ 0xe0c7
+àÈ 0xe0c8
+àÉ 0xe0c9
+àÊ 0xe0ca
+àË 0xe0cb
+àÌ 0xe0cc
+àÍ 0xe0cd
+àÎ 0xe0ce
+àÏ 0xe0cf
+àÐ 0xe0d0
+àÑ 0xe0d1
+àÒ 0xe0d2
+àÓ 0xe0d3
+àÔ 0xe0d4
+àÕ 0xe0d5
+àÖ 0xe0d6
+à× 0xe0d7
+àØ 0xe0d8
+àÙ 0xe0d9
+àÚ 0xe0da
+àÛ 0xe0db
+àÜ 0xe0dc
+àÝ 0xe0dd
+àÞ 0xe0de
+àß 0xe0df
+àà 0xe0e0
+àá 0xe0e1
+àâ 0xe0e2
+àã 0xe0e3
+àä 0xe0e4
+àå 0xe0e5
+àæ 0xe0e6
+àç 0xe0e7
+àè 0xe0e8
+àé 0xe0e9
+àê 0xe0ea
+àë 0xe0eb
+àì 0xe0ec
+àí 0xe0ed
+àî 0xe0ee
+àï 0xe0ef
+àð 0xe0f0
+àñ 0xe0f1
+àò 0xe0f2
+àó 0xe0f3
+àô 0xe0f4
+àõ 0xe0f5
+àö 0xe0f6
+à÷ 0xe0f7
+àø 0xe0f8
+àù 0xe0f9
+àú 0xe0fa
+àû 0xe0fb
+àü 0xe0fc
+àý 0xe0fd
+àþ 0xe0fe
+á¡ 0xe1a1
+ᢠ0xe1a2
+ᣠ0xe1a3
+ᤠ0xe1a4
+ᥠ0xe1a5
+ᦠ0xe1a6
+᧠0xe1a7
+ᨠ0xe1a8
+á© 0xe1a9
+᪠0xe1aa
+á« 0xe1ab
+ᬠ0xe1ac
+á­ 0xe1ad
+á® 0xe1ae
+ᯠ0xe1af
+á° 0xe1b0
+á± 0xe1b1
+á² 0xe1b2
+á³ 0xe1b3
+á´ 0xe1b4
+áµ 0xe1b5
+ᶠ0xe1b6
+á· 0xe1b7
+Ḡ0xe1b8
+á¹ 0xe1b9
+Ạ0xe1ba
+á» 0xe1bb
+á¼ 0xe1bc
+á½ 0xe1bd
+á¾ 0xe1be
+á¿ 0xe1bf
+áÀ 0xe1c0
+áÁ 0xe1c1
+á 0xe1c2
+áà 0xe1c3
+áÄ 0xe1c4
+áÅ 0xe1c5
+áÆ 0xe1c6
+áÇ 0xe1c7
+áÈ 0xe1c8
+áÉ 0xe1c9
+áÊ 0xe1ca
+áË 0xe1cb
+áÌ 0xe1cc
+áÍ 0xe1cd
+áÎ 0xe1ce
+áÏ 0xe1cf
+áÐ 0xe1d0
+áÑ 0xe1d1
+áÒ 0xe1d2
+áÓ 0xe1d3
+áÔ 0xe1d4
+áÕ 0xe1d5
+áÖ 0xe1d6
+á× 0xe1d7
+áØ 0xe1d8
+áÙ 0xe1d9
+áÚ 0xe1da
+áÛ 0xe1db
+áÜ 0xe1dc
+áÝ 0xe1dd
+áÞ 0xe1de
+áß 0xe1df
+áà 0xe1e0
+áá 0xe1e1
+áâ 0xe1e2
+áã 0xe1e3
+áä 0xe1e4
+áå 0xe1e5
+áæ 0xe1e6
+áç 0xe1e7
+áè 0xe1e8
+áé 0xe1e9
+áê 0xe1ea
+áë 0xe1eb
+áì 0xe1ec
+áí 0xe1ed
+áî 0xe1ee
+áï 0xe1ef
+áð 0xe1f0
+áñ 0xe1f1
+áò 0xe1f2
+áó 0xe1f3
+áô 0xe1f4
+áõ 0xe1f5
+áö 0xe1f6
+á÷ 0xe1f7
+áø 0xe1f8
+áù 0xe1f9
+áú 0xe1fa
+áû 0xe1fb
+áü 0xe1fc
+áý 0xe1fd
+áþ 0xe1fe
+â¡ 0xe2a1
+⢠0xe2a2
+⣠0xe2a3
+⤠0xe2a4
+⥠0xe2a5
+⦠0xe2a6
+⧠0xe2a7
+⨠0xe2a8
+â© 0xe2a9
+⪠0xe2aa
+â« 0xe2ab
+⬠0xe2ac
+â­ 0xe2ad
+â® 0xe2ae
+⯠0xe2af
+â° 0xe2b0
+â± 0xe2b1
+â² 0xe2b2
+â³ 0xe2b3
+â´ 0xe2b4
+âµ 0xe2b5
+ⶠ0xe2b6
+â· 0xe2b7
+⸠0xe2b8
+â¹ 0xe2b9
+⺠0xe2ba
+â» 0xe2bb
+â¼ 0xe2bc
+â½ 0xe2bd
+â¾ 0xe2be
+â¿ 0xe2bf
+âÀ 0xe2c0
+âÁ 0xe2c1
+â 0xe2c2
+âà 0xe2c3
+âÄ 0xe2c4
+âÅ 0xe2c5
+âÆ 0xe2c6
+âÇ 0xe2c7
+âÈ 0xe2c8
+âÉ 0xe2c9
+âÊ 0xe2ca
+âË 0xe2cb
+âÌ 0xe2cc
+âÍ 0xe2cd
+âÎ 0xe2ce
+âÏ 0xe2cf
+âÐ 0xe2d0
+âÑ 0xe2d1
+âÒ 0xe2d2
+âÓ 0xe2d3
+âÔ 0xe2d4
+âÕ 0xe2d5
+âÖ 0xe2d6
+â× 0xe2d7
+âØ 0xe2d8
+âÙ 0xe2d9
+âÚ 0xe2da
+âÛ 0xe2db
+âÜ 0xe2dc
+âÝ 0xe2dd
+âÞ 0xe2de
+âß 0xe2df
+âà 0xe2e0
+âá 0xe2e1
+ââ 0xe2e2
+âã 0xe2e3
+âä 0xe2e4
+âå 0xe2e5
+âæ 0xe2e6
+âç 0xe2e7
+âè 0xe2e8
+âé 0xe2e9
+âê 0xe2ea
+âë 0xe2eb
+âì 0xe2ec
+âí 0xe2ed
+âî 0xe2ee
+âï 0xe2ef
+âð 0xe2f0
+âñ 0xe2f1
+âò 0xe2f2
+âó 0xe2f3
+âô 0xe2f4
+âõ 0xe2f5
+âö 0xe2f6
+â÷ 0xe2f7
+âø 0xe2f8
+âù 0xe2f9
+âú 0xe2fa
+âû 0xe2fb
+âü 0xe2fc
+âý 0xe2fd
+âþ 0xe2fe
+ã¡ 0xe3a1
+㢠0xe3a2
+㣠0xe3a3
+㤠0xe3a4
+㥠0xe3a5
+㦠0xe3a6
+㧠0xe3a7
+㨠0xe3a8
+ã© 0xe3a9
+㪠0xe3aa
+ã« 0xe3ab
+㬠0xe3ac
+ã­ 0xe3ad
+ã® 0xe3ae
+㯠0xe3af
+ã° 0xe3b0
+ã± 0xe3b1
+ã² 0xe3b2
+ã³ 0xe3b3
+ã´ 0xe3b4
+ãµ 0xe3b5
+㶠0xe3b6
+ã· 0xe3b7
+㸠0xe3b8
+ã¹ 0xe3b9
+㺠0xe3ba
+ã» 0xe3bb
+ã¼ 0xe3bc
+ã½ 0xe3bd
+ã¾ 0xe3be
+ã¿ 0xe3bf
+ãÀ 0xe3c0
+ãÁ 0xe3c1
+ã 0xe3c2
+ãà 0xe3c3
+ãÄ 0xe3c4
+ãÅ 0xe3c5
+ãÆ 0xe3c6
+ãÇ 0xe3c7
+ãÈ 0xe3c8
+ãÉ 0xe3c9
+ãÊ 0xe3ca
+ãË 0xe3cb
+ãÌ 0xe3cc
+ãÍ 0xe3cd
+ãÎ 0xe3ce
+ãÏ 0xe3cf
+ãÐ 0xe3d0
+ãÑ 0xe3d1
+ãÒ 0xe3d2
+ãÓ 0xe3d3
+ãÔ 0xe3d4
+ãÕ 0xe3d5
+ãÖ 0xe3d6
+ã× 0xe3d7
+ãØ 0xe3d8
+ãÙ 0xe3d9
+ãÚ 0xe3da
+ãÛ 0xe3db
+ãÜ 0xe3dc
+ãÝ 0xe3dd
+ãÞ 0xe3de
+ãß 0xe3df
+ãà 0xe3e0
+ãá 0xe3e1
+ãâ 0xe3e2
+ãã 0xe3e3
+ãä 0xe3e4
+ãå 0xe3e5
+ãæ 0xe3e6
+ãç 0xe3e7
+ãè 0xe3e8
+ãé 0xe3e9
+ãê 0xe3ea
+ãë 0xe3eb
+ãì 0xe3ec
+ãí 0xe3ed
+ãî 0xe3ee
+ãï 0xe3ef
+ãð 0xe3f0
+ãñ 0xe3f1
+ãò 0xe3f2
+ãó 0xe3f3
+ãô 0xe3f4
+ãõ 0xe3f5
+ãö 0xe3f6
+ã÷ 0xe3f7
+ãø 0xe3f8
+ãù 0xe3f9
+ãú 0xe3fa
+ãû 0xe3fb
+ãü 0xe3fc
+ãý 0xe3fd
+ãþ 0xe3fe
+ä¡ 0xe4a1
+ä¢ 0xe4a2
+ä£ 0xe4a3
+ä¤ 0xe4a4
+ä¥ 0xe4a5
+ä¦ 0xe4a6
+ä§ 0xe4a7
+ä¨ 0xe4a8
+ä© 0xe4a9
+äª 0xe4aa
+ä« 0xe4ab
+ä¬ 0xe4ac
+ä­ 0xe4ad
+ä® 0xe4ae
+ä¯ 0xe4af
+ä° 0xe4b0
+ä± 0xe4b1
+ä² 0xe4b2
+ä³ 0xe4b3
+ä´ 0xe4b4
+äµ 0xe4b5
+ä¶ 0xe4b6
+ä· 0xe4b7
+ä¸ 0xe4b8
+ä¹ 0xe4b9
+äº 0xe4ba
+ä» 0xe4bb
+ä¼ 0xe4bc
+ä½ 0xe4bd
+ä¾ 0xe4be
+ä¿ 0xe4bf
+äÀ 0xe4c0
+äÁ 0xe4c1
+ä 0xe4c2
+äà 0xe4c3
+äÄ 0xe4c4
+äÅ 0xe4c5
+äÆ 0xe4c6
+äÇ 0xe4c7
+äÈ 0xe4c8
+äÉ 0xe4c9
+äÊ 0xe4ca
+äË 0xe4cb
+äÌ 0xe4cc
+äÍ 0xe4cd
+äÎ 0xe4ce
+äÏ 0xe4cf
+äÐ 0xe4d0
+äÑ 0xe4d1
+äÒ 0xe4d2
+äÓ 0xe4d3
+äÔ 0xe4d4
+äÕ 0xe4d5
+äÖ 0xe4d6
+ä× 0xe4d7
+äØ 0xe4d8
+äÙ 0xe4d9
+äÚ 0xe4da
+äÛ 0xe4db
+äÜ 0xe4dc
+äÝ 0xe4dd
+äÞ 0xe4de
+äß 0xe4df
+äà 0xe4e0
+äá 0xe4e1
+äâ 0xe4e2
+äã 0xe4e3
+ää 0xe4e4
+äå 0xe4e5
+äæ 0xe4e6
+äç 0xe4e7
+äè 0xe4e8
+äé 0xe4e9
+äê 0xe4ea
+äë 0xe4eb
+äì 0xe4ec
+äí 0xe4ed
+äî 0xe4ee
+äï 0xe4ef
+äð 0xe4f0
+äñ 0xe4f1
+äò 0xe4f2
+äó 0xe4f3
+äô 0xe4f4
+äõ 0xe4f5
+äö 0xe4f6
+ä÷ 0xe4f7
+äø 0xe4f8
+äù 0xe4f9
+äú 0xe4fa
+äû 0xe4fb
+äü 0xe4fc
+äý 0xe4fd
+äþ 0xe4fe
+å¡ 0xe5a1
+å¢ 0xe5a2
+å£ 0xe5a3
+å¤ 0xe5a4
+å¥ 0xe5a5
+å¦ 0xe5a6
+å§ 0xe5a7
+å¨ 0xe5a8
+å© 0xe5a9
+åª 0xe5aa
+å« 0xe5ab
+å¬ 0xe5ac
+å­ 0xe5ad
+å® 0xe5ae
+å¯ 0xe5af
+å° 0xe5b0
+å± 0xe5b1
+å² 0xe5b2
+å³ 0xe5b3
+å´ 0xe5b4
+åµ 0xe5b5
+å¶ 0xe5b6
+å· 0xe5b7
+å¸ 0xe5b8
+å¹ 0xe5b9
+åº 0xe5ba
+å» 0xe5bb
+å¼ 0xe5bc
+å½ 0xe5bd
+å¾ 0xe5be
+å¿ 0xe5bf
+åÀ 0xe5c0
+åÁ 0xe5c1
+å 0xe5c2
+åà 0xe5c3
+åÄ 0xe5c4
+åÅ 0xe5c5
+åÆ 0xe5c6
+åÇ 0xe5c7
+åÈ 0xe5c8
+åÉ 0xe5c9
+åÊ 0xe5ca
+åË 0xe5cb
+åÌ 0xe5cc
+åÍ 0xe5cd
+åÎ 0xe5ce
+åÏ 0xe5cf
+åÐ 0xe5d0
+åÑ 0xe5d1
+åÒ 0xe5d2
+åÓ 0xe5d3
+åÔ 0xe5d4
+åÕ 0xe5d5
+åÖ 0xe5d6
+å× 0xe5d7
+åØ 0xe5d8
+åÙ 0xe5d9
+åÚ 0xe5da
+åÛ 0xe5db
+åÜ 0xe5dc
+åÝ 0xe5dd
+åÞ 0xe5de
+åß 0xe5df
+åà 0xe5e0
+åá 0xe5e1
+åâ 0xe5e2
+åã 0xe5e3
+åä 0xe5e4
+åå 0xe5e5
+åæ 0xe5e6
+åç 0xe5e7
+åè 0xe5e8
+åé 0xe5e9
+åê 0xe5ea
+åë 0xe5eb
+åì 0xe5ec
+åí 0xe5ed
+åî 0xe5ee
+åï 0xe5ef
+åð 0xe5f0
+åñ 0xe5f1
+åò 0xe5f2
+åó 0xe5f3
+åô 0xe5f4
+åõ 0xe5f5
+åö 0xe5f6
+å÷ 0xe5f7
+åø 0xe5f8
+åù 0xe5f9
+åú 0xe5fa
+åû 0xe5fb
+åü 0xe5fc
+åý 0xe5fd
+åþ 0xe5fe
+æ¡ 0xe6a1
+æ¢ 0xe6a2
+æ£ 0xe6a3
+æ¤ 0xe6a4
+æ¥ 0xe6a5
+æ¦ 0xe6a6
+æ§ 0xe6a7
+æ¨ 0xe6a8
+æ© 0xe6a9
+æª 0xe6aa
+æ« 0xe6ab
+æ¬ 0xe6ac
+æ­ 0xe6ad
+æ® 0xe6ae
+æ¯ 0xe6af
+æ° 0xe6b0
+æ± 0xe6b1
+æ² 0xe6b2
+æ³ 0xe6b3
+æ´ 0xe6b4
+æµ 0xe6b5
+æ¶ 0xe6b6
+æ· 0xe6b7
+æ¸ 0xe6b8
+æ¹ 0xe6b9
+æº 0xe6ba
+æ» 0xe6bb
+æ¼ 0xe6bc
+æ½ 0xe6bd
+æ¾ 0xe6be
+æ¿ 0xe6bf
+æÀ 0xe6c0
+æÁ 0xe6c1
+æ 0xe6c2
+æà 0xe6c3
+æÄ 0xe6c4
+æÅ 0xe6c5
+æÆ 0xe6c6
+æÇ 0xe6c7
+æÈ 0xe6c8
+æÉ 0xe6c9
+æÊ 0xe6ca
+æË 0xe6cb
+æÌ 0xe6cc
+æÍ 0xe6cd
+æÎ 0xe6ce
+æÏ 0xe6cf
+æÐ 0xe6d0
+æÑ 0xe6d1
+æÒ 0xe6d2
+æÓ 0xe6d3
+æÔ 0xe6d4
+æÕ 0xe6d5
+æÖ 0xe6d6
+æ× 0xe6d7
+æØ 0xe6d8
+æÙ 0xe6d9
+æÚ 0xe6da
+æÛ 0xe6db
+æÜ 0xe6dc
+æÝ 0xe6dd
+æÞ 0xe6de
+æß 0xe6df
+æà 0xe6e0
+æá 0xe6e1
+æâ 0xe6e2
+æã 0xe6e3
+æä 0xe6e4
+æå 0xe6e5
+ææ 0xe6e6
+æç 0xe6e7
+æè 0xe6e8
+æé 0xe6e9
+æê 0xe6ea
+æë 0xe6eb
+æì 0xe6ec
+æí 0xe6ed
+æî 0xe6ee
+æï 0xe6ef
+æð 0xe6f0
+æñ 0xe6f1
+æò 0xe6f2
+æó 0xe6f3
+æô 0xe6f4
+æõ 0xe6f5
+æö 0xe6f6
+æ÷ 0xe6f7
+æø 0xe6f8
+æù 0xe6f9
+æú 0xe6fa
+æû 0xe6fb
+æü 0xe6fc
+æý 0xe6fd
+æþ 0xe6fe
+ç¡ 0xe7a1
+ç¢ 0xe7a2
+ç£ 0xe7a3
+ç¤ 0xe7a4
+ç¥ 0xe7a5
+ç¦ 0xe7a6
+ç§ 0xe7a7
+ç¨ 0xe7a8
+ç© 0xe7a9
+çª 0xe7aa
+ç« 0xe7ab
+ç¬ 0xe7ac
+ç­ 0xe7ad
+ç® 0xe7ae
+ç¯ 0xe7af
+ç° 0xe7b0
+ç± 0xe7b1
+ç² 0xe7b2
+ç³ 0xe7b3
+ç´ 0xe7b4
+çµ 0xe7b5
+ç¶ 0xe7b6
+ç· 0xe7b7
+ç¸ 0xe7b8
+ç¹ 0xe7b9
+çº 0xe7ba
+ç» 0xe7bb
+ç¼ 0xe7bc
+ç½ 0xe7bd
+ç¾ 0xe7be
+ç¿ 0xe7bf
+çÀ 0xe7c0
+çÁ 0xe7c1
+ç 0xe7c2
+çà 0xe7c3
+çÄ 0xe7c4
+çÅ 0xe7c5
+çÆ 0xe7c6
+çÇ 0xe7c7
+çÈ 0xe7c8
+çÉ 0xe7c9
+çÊ 0xe7ca
+çË 0xe7cb
+çÌ 0xe7cc
+çÍ 0xe7cd
+çÎ 0xe7ce
+çÏ 0xe7cf
+çÐ 0xe7d0
+çÑ 0xe7d1
+çÒ 0xe7d2
+çÓ 0xe7d3
+çÔ 0xe7d4
+çÕ 0xe7d5
+çÖ 0xe7d6
+ç× 0xe7d7
+çØ 0xe7d8
+çÙ 0xe7d9
+çÚ 0xe7da
+çÛ 0xe7db
+çÜ 0xe7dc
+çÝ 0xe7dd
+çÞ 0xe7de
+çß 0xe7df
+çà 0xe7e0
+çá 0xe7e1
+çâ 0xe7e2
+çã 0xe7e3
+çä 0xe7e4
+çå 0xe7e5
+çæ 0xe7e6
+çç 0xe7e7
+çè 0xe7e8
+çé 0xe7e9
+çê 0xe7ea
+çë 0xe7eb
+çì 0xe7ec
+çí 0xe7ed
+çî 0xe7ee
+çï 0xe7ef
+çð 0xe7f0
+çñ 0xe7f1
+çò 0xe7f2
+çó 0xe7f3
+çô 0xe7f4
+çõ 0xe7f5
+çö 0xe7f6
+ç÷ 0xe7f7
+çø 0xe7f8
+çù 0xe7f9
+çú 0xe7fa
+çû 0xe7fb
+çü 0xe7fc
+çý 0xe7fd
+çþ 0xe7fe
+è¡ 0xe8a1
+è¢ 0xe8a2
+è£ 0xe8a3
+è¤ 0xe8a4
+è¥ 0xe8a5
+è¦ 0xe8a6
+è§ 0xe8a7
+è¨ 0xe8a8
+è© 0xe8a9
+èª 0xe8aa
+è« 0xe8ab
+è¬ 0xe8ac
+è­ 0xe8ad
+è® 0xe8ae
+è¯ 0xe8af
+è° 0xe8b0
+è± 0xe8b1
+è² 0xe8b2
+è³ 0xe8b3
+è´ 0xe8b4
+èµ 0xe8b5
+è¶ 0xe8b6
+è· 0xe8b7
+è¸ 0xe8b8
+è¹ 0xe8b9
+èº 0xe8ba
+è» 0xe8bb
+è¼ 0xe8bc
+è½ 0xe8bd
+è¾ 0xe8be
+è¿ 0xe8bf
+èÀ 0xe8c0
+èÁ 0xe8c1
+è 0xe8c2
+èà 0xe8c3
+èÄ 0xe8c4
+èÅ 0xe8c5
+èÆ 0xe8c6
+èÇ 0xe8c7
+èÈ 0xe8c8
+èÉ 0xe8c9
+èÊ 0xe8ca
+èË 0xe8cb
+èÌ 0xe8cc
+èÍ 0xe8cd
+èÎ 0xe8ce
+èÏ 0xe8cf
+èÐ 0xe8d0
+èÑ 0xe8d1
+èÒ 0xe8d2
+èÓ 0xe8d3
+èÔ 0xe8d4
+èÕ 0xe8d5
+èÖ 0xe8d6
+è× 0xe8d7
+èØ 0xe8d8
+èÙ 0xe8d9
+èÚ 0xe8da
+èÛ 0xe8db
+èÜ 0xe8dc
+èÝ 0xe8dd
+èÞ 0xe8de
+èß 0xe8df
+èà 0xe8e0
+èá 0xe8e1
+èâ 0xe8e2
+èã 0xe8e3
+èä 0xe8e4
+èå 0xe8e5
+èæ 0xe8e6
+èç 0xe8e7
+èè 0xe8e8
+èé 0xe8e9
+èê 0xe8ea
+èë 0xe8eb
+èì 0xe8ec
+èí 0xe8ed
+èî 0xe8ee
+èï 0xe8ef
+èð 0xe8f0
+èñ 0xe8f1
+èò 0xe8f2
+èó 0xe8f3
+èô 0xe8f4
+èõ 0xe8f5
+èö 0xe8f6
+è÷ 0xe8f7
+èø 0xe8f8
+èù 0xe8f9
+èú 0xe8fa
+èû 0xe8fb
+èü 0xe8fc
+èý 0xe8fd
+èþ 0xe8fe
+é¡ 0xe9a1
+é¢ 0xe9a2
+é£ 0xe9a3
+é¤ 0xe9a4
+é¥ 0xe9a5
+é¦ 0xe9a6
+é§ 0xe9a7
+é¨ 0xe9a8
+é© 0xe9a9
+éª 0xe9aa
+é« 0xe9ab
+é¬ 0xe9ac
+é­ 0xe9ad
+é® 0xe9ae
+é¯ 0xe9af
+é° 0xe9b0
+é± 0xe9b1
+é² 0xe9b2
+é³ 0xe9b3
+é´ 0xe9b4
+éµ 0xe9b5
+é¶ 0xe9b6
+é· 0xe9b7
+é¸ 0xe9b8
+é¹ 0xe9b9
+éº 0xe9ba
+é» 0xe9bb
+é¼ 0xe9bc
+é½ 0xe9bd
+é¾ 0xe9be
+é¿ 0xe9bf
+éÀ 0xe9c0
+éÁ 0xe9c1
+é 0xe9c2
+éà 0xe9c3
+éÄ 0xe9c4
+éÅ 0xe9c5
+éÆ 0xe9c6
+éÇ 0xe9c7
+éÈ 0xe9c8
+éÉ 0xe9c9
+éÊ 0xe9ca
+éË 0xe9cb
+éÌ 0xe9cc
+éÍ 0xe9cd
+éÎ 0xe9ce
+éÏ 0xe9cf
+éÐ 0xe9d0
+éÑ 0xe9d1
+éÒ 0xe9d2
+éÓ 0xe9d3
+éÔ 0xe9d4
+éÕ 0xe9d5
+éÖ 0xe9d6
+é× 0xe9d7
+éØ 0xe9d8
+éÙ 0xe9d9
+éÚ 0xe9da
+éÛ 0xe9db
+éÜ 0xe9dc
+éÝ 0xe9dd
+éÞ 0xe9de
+éß 0xe9df
+éà 0xe9e0
+éá 0xe9e1
+éâ 0xe9e2
+éã 0xe9e3
+éä 0xe9e4
+éå 0xe9e5
+éæ 0xe9e6
+éç 0xe9e7
+éè 0xe9e8
+éé 0xe9e9
+éê 0xe9ea
+éë 0xe9eb
+éì 0xe9ec
+éí 0xe9ed
+éî 0xe9ee
+éï 0xe9ef
+éð 0xe9f0
+éñ 0xe9f1
+éò 0xe9f2
+éó 0xe9f3
+éô 0xe9f4
+éõ 0xe9f5
+éö 0xe9f6
+é÷ 0xe9f7
+éø 0xe9f8
+éù 0xe9f9
+éú 0xe9fa
+éû 0xe9fb
+éü 0xe9fc
+éý 0xe9fd
+éþ 0xe9fe
+ê¡ 0xeaa1
+ê¢ 0xeaa2
+ê£ 0xeaa3
+ê¤ 0xeaa4
+ê¥ 0xeaa5
+ê¦ 0xeaa6
+ê§ 0xeaa7
+ê¨ 0xeaa8
+ê© 0xeaa9
+êª 0xeaaa
+ê« 0xeaab
+ê¬ 0xeaac
+ê­ 0xeaad
+ê® 0xeaae
+ê¯ 0xeaaf
+ê° 0xeab0
+ê± 0xeab1
+ê² 0xeab2
+ê³ 0xeab3
+ê´ 0xeab4
+êµ 0xeab5
+ê¶ 0xeab6
+ê· 0xeab7
+ê¸ 0xeab8
+ê¹ 0xeab9
+êº 0xeaba
+ê» 0xeabb
+ê¼ 0xeabc
+ê½ 0xeabd
+ê¾ 0xeabe
+ê¿ 0xeabf
+êÀ 0xeac0
+êÁ 0xeac1
+ê 0xeac2
+êà 0xeac3
+êÄ 0xeac4
+êÅ 0xeac5
+êÆ 0xeac6
+êÇ 0xeac7
+êÈ 0xeac8
+êÉ 0xeac9
+êÊ 0xeaca
+êË 0xeacb
+êÌ 0xeacc
+êÍ 0xeacd
+êÎ 0xeace
+êÏ 0xeacf
+êÐ 0xead0
+êÑ 0xead1
+êÒ 0xead2
+êÓ 0xead3
+êÔ 0xead4
+êÕ 0xead5
+êÖ 0xead6
+ê× 0xead7
+êØ 0xead8
+êÙ 0xead9
+êÚ 0xeada
+êÛ 0xeadb
+êÜ 0xeadc
+êÝ 0xeadd
+êÞ 0xeade
+êß 0xeadf
+êà 0xeae0
+êá 0xeae1
+êâ 0xeae2
+êã 0xeae3
+êä 0xeae4
+êå 0xeae5
+êæ 0xeae6
+êç 0xeae7
+êè 0xeae8
+êé 0xeae9
+êê 0xeaea
+êë 0xeaeb
+êì 0xeaec
+êí 0xeaed
+êî 0xeaee
+êï 0xeaef
+êð 0xeaf0
+êñ 0xeaf1
+êò 0xeaf2
+êó 0xeaf3
+êô 0xeaf4
+êõ 0xeaf5
+êö 0xeaf6
+ê÷ 0xeaf7
+êø 0xeaf8
+êù 0xeaf9
+êú 0xeafa
+êû 0xeafb
+êü 0xeafc
+êý 0xeafd
+êþ 0xeafe
+ë¡ 0xeba1
+ë¢ 0xeba2
+ë£ 0xeba3
+ë¤ 0xeba4
+ë¥ 0xeba5
+ë¦ 0xeba6
+ë§ 0xeba7
+ë¨ 0xeba8
+ë© 0xeba9
+ëª 0xebaa
+ë« 0xebab
+ë¬ 0xebac
+ë­ 0xebad
+ë® 0xebae
+ë¯ 0xebaf
+ë° 0xebb0
+ë± 0xebb1
+ë² 0xebb2
+ë³ 0xebb3
+ë´ 0xebb4
+ëµ 0xebb5
+ë¶ 0xebb6
+ë· 0xebb7
+ë¸ 0xebb8
+ë¹ 0xebb9
+ëº 0xebba
+ë» 0xebbb
+ë¼ 0xebbc
+ë½ 0xebbd
+ë¾ 0xebbe
+ë¿ 0xebbf
+ëÀ 0xebc0
+ëÁ 0xebc1
+ë 0xebc2
+ëà 0xebc3
+ëÄ 0xebc4
+ëÅ 0xebc5
+ëÆ 0xebc6
+ëÇ 0xebc7
+ëÈ 0xebc8
+ëÉ 0xebc9
+ëÊ 0xebca
+ëË 0xebcb
+ëÌ 0xebcc
+ëÍ 0xebcd
+ëÎ 0xebce
+ëÏ 0xebcf
+ëÐ 0xebd0
+ëÑ 0xebd1
+ëÒ 0xebd2
+ëÓ 0xebd3
+ëÔ 0xebd4
+ëÕ 0xebd5
+ëÖ 0xebd6
+ë× 0xebd7
+ëØ 0xebd8
+ëÙ 0xebd9
+ëÚ 0xebda
+ëÛ 0xebdb
+ëÜ 0xebdc
+ëÝ 0xebdd
+ëÞ 0xebde
+ëß 0xebdf
+ëà 0xebe0
+ëá 0xebe1
+ëâ 0xebe2
+ëã 0xebe3
+ëä 0xebe4
+ëå 0xebe5
+ëæ 0xebe6
+ëç 0xebe7
+ëè 0xebe8
+ëé 0xebe9
+ëê 0xebea
+ëë 0xebeb
+ëì 0xebec
+ëí 0xebed
+ëî 0xebee
+ëï 0xebef
+ëð 0xebf0
+ëñ 0xebf1
+ëò 0xebf2
+ëó 0xebf3
+ëô 0xebf4
+ëõ 0xebf5
+ëö 0xebf6
+ë÷ 0xebf7
+ëø 0xebf8
+ëù 0xebf9
+ëú 0xebfa
+ëû 0xebfb
+ëü 0xebfc
+ëý 0xebfd
+ëþ 0xebfe
+ì¡ 0xeca1
+ì¢ 0xeca2
+ì£ 0xeca3
+ì¤ 0xeca4
+ì¥ 0xeca5
+ì¦ 0xeca6
+ì§ 0xeca7
+ì¨ 0xeca8
+ì© 0xeca9
+ìª 0xecaa
+ì« 0xecab
+ì¬ 0xecac
+ì­ 0xecad
+ì® 0xecae
+ì¯ 0xecaf
+ì° 0xecb0
+ì± 0xecb1
+ì² 0xecb2
+ì³ 0xecb3
+ì´ 0xecb4
+ìµ 0xecb5
+ì¶ 0xecb6
+ì· 0xecb7
+ì¸ 0xecb8
+ì¹ 0xecb9
+ìº 0xecba
+ì» 0xecbb
+ì¼ 0xecbc
+ì½ 0xecbd
+ì¾ 0xecbe
+ì¿ 0xecbf
+ìÀ 0xecc0
+ìÁ 0xecc1
+ì 0xecc2
+ìà 0xecc3
+ìÄ 0xecc4
+ìÅ 0xecc5
+ìÆ 0xecc6
+ìÇ 0xecc7
+ìÈ 0xecc8
+ìÉ 0xecc9
+ìÊ 0xecca
+ìË 0xeccb
+ìÌ 0xeccc
+ìÍ 0xeccd
+ìÎ 0xecce
+ìÏ 0xeccf
+ìÐ 0xecd0
+ìÑ 0xecd1
+ìÒ 0xecd2
+ìÓ 0xecd3
+ìÔ 0xecd4
+ìÕ 0xecd5
+ìÖ 0xecd6
+ì× 0xecd7
+ìØ 0xecd8
+ìÙ 0xecd9
+ìÚ 0xecda
+ìÛ 0xecdb
+ìÜ 0xecdc
+ìÝ 0xecdd
+ìÞ 0xecde
+ìß 0xecdf
+ìà 0xece0
+ìá 0xece1
+ìâ 0xece2
+ìã 0xece3
+ìä 0xece4
+ìå 0xece5
+ìæ 0xece6
+ìç 0xece7
+ìè 0xece8
+ìé 0xece9
+ìê 0xecea
+ìë 0xeceb
+ìì 0xecec
+ìí 0xeced
+ìî 0xecee
+ìï 0xecef
+ìð 0xecf0
+ìñ 0xecf1
+ìò 0xecf2
+ìó 0xecf3
+ìô 0xecf4
+ìõ 0xecf5
+ìö 0xecf6
+ì÷ 0xecf7
+ìø 0xecf8
+ìù 0xecf9
+ìú 0xecfa
+ìû 0xecfb
+ìü 0xecfc
+ìý 0xecfd
+ìþ 0xecfe
+í¡ 0xeda1
+í¢ 0xeda2
+í£ 0xeda3
+í¤ 0xeda4
+í¥ 0xeda5
+í¦ 0xeda6
+í§ 0xeda7
+í¨ 0xeda8
+í© 0xeda9
+íª 0xedaa
+í« 0xedab
+í¬ 0xedac
+í­ 0xedad
+í® 0xedae
+í¯ 0xedaf
+í° 0xedb0
+í± 0xedb1
+í² 0xedb2
+í³ 0xedb3
+í´ 0xedb4
+íµ 0xedb5
+í¶ 0xedb6
+í· 0xedb7
+í¸ 0xedb8
+í¹ 0xedb9
+íº 0xedba
+í» 0xedbb
+í¼ 0xedbc
+í½ 0xedbd
+í¾ 0xedbe
+í¿ 0xedbf
+íÀ 0xedc0
+íÁ 0xedc1
+í 0xedc2
+íà 0xedc3
+íÄ 0xedc4
+íÅ 0xedc5
+íÆ 0xedc6
+íÇ 0xedc7
+íÈ 0xedc8
+íÉ 0xedc9
+íÊ 0xedca
+íË 0xedcb
+íÌ 0xedcc
+íÍ 0xedcd
+íÎ 0xedce
+íÏ 0xedcf
+íÐ 0xedd0
+íÑ 0xedd1
+íÒ 0xedd2
+íÓ 0xedd3
+íÔ 0xedd4
+íÕ 0xedd5
+íÖ 0xedd6
+í× 0xedd7
+íØ 0xedd8
+íÙ 0xedd9
+íÚ 0xedda
+íÛ 0xeddb
+íÜ 0xeddc
+íÝ 0xeddd
+íÞ 0xedde
+íß 0xeddf
+íà 0xede0
+íá 0xede1
+íâ 0xede2
+íã 0xede3
+íä 0xede4
+íå 0xede5
+íæ 0xede6
+íç 0xede7
+íè 0xede8
+íé 0xede9
+íê 0xedea
+íë 0xedeb
+íì 0xedec
+íí 0xeded
+íî 0xedee
+íï 0xedef
+íð 0xedf0
+íñ 0xedf1
+íò 0xedf2
+íó 0xedf3
+íô 0xedf4
+íõ 0xedf5
+íö 0xedf6
+í÷ 0xedf7
+íø 0xedf8
+íù 0xedf9
+íú 0xedfa
+íû 0xedfb
+íü 0xedfc
+íý 0xedfd
+íþ 0xedfe
+î¡ 0xeea1
+î¢ 0xeea2
+î£ 0xeea3
+î¤ 0xeea4
+î¥ 0xeea5
+î¦ 0xeea6
+î§ 0xeea7
+î¨ 0xeea8
+î© 0xeea9
+îª 0xeeaa
+î« 0xeeab
+î¬ 0xeeac
+î­ 0xeead
+î® 0xeeae
+î¯ 0xeeaf
+î° 0xeeb0
+î± 0xeeb1
+î² 0xeeb2
+î³ 0xeeb3
+î´ 0xeeb4
+îµ 0xeeb5
+î¶ 0xeeb6
+î· 0xeeb7
+î¸ 0xeeb8
+î¹ 0xeeb9
+îº 0xeeba
+î» 0xeebb
+î¼ 0xeebc
+î½ 0xeebd
+î¾ 0xeebe
+î¿ 0xeebf
+îÀ 0xeec0
+îÁ 0xeec1
+î 0xeec2
+îà 0xeec3
+îÄ 0xeec4
+îÅ 0xeec5
+îÆ 0xeec6
+îÇ 0xeec7
+îÈ 0xeec8
+îÉ 0xeec9
+îÊ 0xeeca
+îË 0xeecb
+îÌ 0xeecc
+îÍ 0xeecd
+îÎ 0xeece
+îÏ 0xeecf
+îÐ 0xeed0
+îÑ 0xeed1
+îÒ 0xeed2
+îÓ 0xeed3
+îÔ 0xeed4
+îÕ 0xeed5
+îÖ 0xeed6
+î× 0xeed7
+îØ 0xeed8
+îÙ 0xeed9
+îÚ 0xeeda
+îÛ 0xeedb
+îÜ 0xeedc
+îÝ 0xeedd
+îÞ 0xeede
+îß 0xeedf
+îà 0xeee0
+îá 0xeee1
+îâ 0xeee2
+îã 0xeee3
+îä 0xeee4
+îå 0xeee5
+îæ 0xeee6
+îç 0xeee7
+îè 0xeee8
+îé 0xeee9
+îê 0xeeea
+îë 0xeeeb
+îì 0xeeec
+îí 0xeeed
+îî 0xeeee
+îï 0xeeef
+îð 0xeef0
+îñ 0xeef1
+îò 0xeef2
+îó 0xeef3
+îô 0xeef4
+îõ 0xeef5
+îö 0xeef6
+î÷ 0xeef7
+îø 0xeef8
+îù 0xeef9
+îú 0xeefa
+îû 0xeefb
+îü 0xeefc
+îý 0xeefd
+îþ 0xeefe
+ï¡ 0xefa1
+ï¢ 0xefa2
+ï£ 0xefa3
+ï¤ 0xefa4
+ï¥ 0xefa5
+ï¦ 0xefa6
+ï§ 0xefa7
+ï¨ 0xefa8
+ï© 0xefa9
+ïª 0xefaa
+ï« 0xefab
+ï¬ 0xefac
+ï­ 0xefad
+ï® 0xefae
+ï¯ 0xefaf
+ï° 0xefb0
+ï± 0xefb1
+ï² 0xefb2
+ï³ 0xefb3
+ï´ 0xefb4
+ïµ 0xefb5
+ï¶ 0xefb6
+ï· 0xefb7
+ï¸ 0xefb8
+ï¹ 0xefb9
+ïº 0xefba
+ï» 0xefbb
+ï¼ 0xefbc
+ï½ 0xefbd
+ï¾ 0xefbe
+ï¿ 0xefbf
+ïÀ 0xefc0
+ïÁ 0xefc1
+ï 0xefc2
+ïà 0xefc3
+ïÄ 0xefc4
+ïÅ 0xefc5
+ïÆ 0xefc6
+ïÇ 0xefc7
+ïÈ 0xefc8
+ïÉ 0xefc9
+ïÊ 0xefca
+ïË 0xefcb
+ïÌ 0xefcc
+ïÍ 0xefcd
+ïÎ 0xefce
+ïÏ 0xefcf
+ïÐ 0xefd0
+ïÑ 0xefd1
+ïÒ 0xefd2
+ïÓ 0xefd3
+ïÔ 0xefd4
+ïÕ 0xefd5
+ïÖ 0xefd6
+ï× 0xefd7
+ïØ 0xefd8
+ïÙ 0xefd9
+ïÚ 0xefda
+ïÛ 0xefdb
+ïÜ 0xefdc
+ïÝ 0xefdd
+ïÞ 0xefde
+ïß 0xefdf
+ïà 0xefe0
+ïá 0xefe1
+ïâ 0xefe2
+ïã 0xefe3
+ïä 0xefe4
+ïå 0xefe5
+ïæ 0xefe6
+ïç 0xefe7
+ïè 0xefe8
+ïé 0xefe9
+ïê 0xefea
+ïë 0xefeb
+ïì 0xefec
+ïí 0xefed
+ïî 0xefee
+ïï 0xefef
+ïð 0xeff0
+ïñ 0xeff1
+ïò 0xeff2
+ïó 0xeff3
+ïô 0xeff4
+ïõ 0xeff5
+ïö 0xeff6
+ï÷ 0xeff7
+ïø 0xeff8
+ïù 0xeff9
+ïú 0xeffa
+ïû 0xeffb
+ïü 0xeffc
+ïý 0xeffd
+ïþ 0xeffe
+ð¡ 0xf0a1
+ð¢ 0xf0a2
+ð£ 0xf0a3
+ð¤ 0xf0a4
+ð¥ 0xf0a5
+ð¦ 0xf0a6
+ð§ 0xf0a7
+ð¨ 0xf0a8
+ð© 0xf0a9
+ðª 0xf0aa
+ð« 0xf0ab
+ð¬ 0xf0ac
+ð­ 0xf0ad
+ð® 0xf0ae
+ð¯ 0xf0af
+ð° 0xf0b0
+ð± 0xf0b1
+ð² 0xf0b2
+ð³ 0xf0b3
+ð´ 0xf0b4
+ðµ 0xf0b5
+ð¶ 0xf0b6
+ð· 0xf0b7
+ð¸ 0xf0b8
+ð¹ 0xf0b9
+ðº 0xf0ba
+ð» 0xf0bb
+ð¼ 0xf0bc
+ð½ 0xf0bd
+ð¾ 0xf0be
+ð¿ 0xf0bf
+ðÀ 0xf0c0
+ðÁ 0xf0c1
+ð 0xf0c2
+ðà 0xf0c3
+ðÄ 0xf0c4
+ðÅ 0xf0c5
+ðÆ 0xf0c6
+ðÇ 0xf0c7
+ðÈ 0xf0c8
+ðÉ 0xf0c9
+ðÊ 0xf0ca
+ðË 0xf0cb
+ðÌ 0xf0cc
+ðÍ 0xf0cd
+ðÎ 0xf0ce
+ðÏ 0xf0cf
+ðÐ 0xf0d0
+ðÑ 0xf0d1
+ðÒ 0xf0d2
+ðÓ 0xf0d3
+ðÔ 0xf0d4
+ðÕ 0xf0d5
+ðÖ 0xf0d6
+ð× 0xf0d7
+ðØ 0xf0d8
+ðÙ 0xf0d9
+ðÚ 0xf0da
+ðÛ 0xf0db
+ðÜ 0xf0dc
+ðÝ 0xf0dd
+ðÞ 0xf0de
+ðß 0xf0df
+ðà 0xf0e0
+ðá 0xf0e1
+ðâ 0xf0e2
+ðã 0xf0e3
+ðä 0xf0e4
+ðå 0xf0e5
+ðæ 0xf0e6
+ðç 0xf0e7
+ðè 0xf0e8
+ðé 0xf0e9
+ðê 0xf0ea
+ðë 0xf0eb
+ðì 0xf0ec
+ðí 0xf0ed
+ðî 0xf0ee
+ðï 0xf0ef
+ðð 0xf0f0
+ðñ 0xf0f1
+ðò 0xf0f2
+ðó 0xf0f3
+ðô 0xf0f4
+ðõ 0xf0f5
+ðö 0xf0f6
+ð÷ 0xf0f7
+ðø 0xf0f8
+ðù 0xf0f9
+ðú 0xf0fa
+ðû 0xf0fb
+ðü 0xf0fc
+ðý 0xf0fd
+ðþ 0xf0fe
+ñ¡ 0xf1a1
+ñ¢ 0xf1a2
+ñ£ 0xf1a3
+ñ¤ 0xf1a4
+ñ¥ 0xf1a5
+ñ¦ 0xf1a6
+ñ§ 0xf1a7
+ñ¨ 0xf1a8
+ñ© 0xf1a9
+ñª 0xf1aa
+ñ« 0xf1ab
+ñ¬ 0xf1ac
+ñ­ 0xf1ad
+ñ® 0xf1ae
+ñ¯ 0xf1af
+ñ° 0xf1b0
+ñ± 0xf1b1
+ñ² 0xf1b2
+ñ³ 0xf1b3
+ñ´ 0xf1b4
+ñµ 0xf1b5
+ñ¶ 0xf1b6
+ñ· 0xf1b7
+ñ¸ 0xf1b8
+ñ¹ 0xf1b9
+ñº 0xf1ba
+ñ» 0xf1bb
+ñ¼ 0xf1bc
+ñ½ 0xf1bd
+ñ¾ 0xf1be
+ñ¿ 0xf1bf
+ñÀ 0xf1c0
+ñÁ 0xf1c1
+ñ 0xf1c2
+ñà 0xf1c3
+ñÄ 0xf1c4
+ñÅ 0xf1c5
+ñÆ 0xf1c6
+ñÇ 0xf1c7
+ñÈ 0xf1c8
+ñÉ 0xf1c9
+ñÊ 0xf1ca
+ñË 0xf1cb
+ñÌ 0xf1cc
+ñÍ 0xf1cd
+ñÎ 0xf1ce
+ñÏ 0xf1cf
+ñÐ 0xf1d0
+ñÑ 0xf1d1
+ñÒ 0xf1d2
+ñÓ 0xf1d3
+ñÔ 0xf1d4
+ñÕ 0xf1d5
+ñÖ 0xf1d6
+ñ× 0xf1d7
+ñØ 0xf1d8
+ñÙ 0xf1d9
+ñÚ 0xf1da
+ñÛ 0xf1db
+ñÜ 0xf1dc
+ñÝ 0xf1dd
+ñÞ 0xf1de
+ñß 0xf1df
+ñà 0xf1e0
+ñá 0xf1e1
+ñâ 0xf1e2
+ñã 0xf1e3
+ñä 0xf1e4
+ñå 0xf1e5
+ñæ 0xf1e6
+ñç 0xf1e7
+ñè 0xf1e8
+ñé 0xf1e9
+ñê 0xf1ea
+ñë 0xf1eb
+ñì 0xf1ec
+ñí 0xf1ed
+ñî 0xf1ee
+ñï 0xf1ef
+ñð 0xf1f0
+ññ 0xf1f1
+ñò 0xf1f2
+ñó 0xf1f3
+ñô 0xf1f4
+ñõ 0xf1f5
+ñö 0xf1f6
+ñ÷ 0xf1f7
+ñø 0xf1f8
+ñù 0xf1f9
+ñú 0xf1fa
+ñû 0xf1fb
+ñü 0xf1fc
+ñý 0xf1fd
+ñþ 0xf1fe
+ò¡ 0xf2a1
+ò¢ 0xf2a2
+ò£ 0xf2a3
+ò¤ 0xf2a4
+ò¥ 0xf2a5
+ò¦ 0xf2a6
+ò§ 0xf2a7
+ò¨ 0xf2a8
+ò© 0xf2a9
+òª 0xf2aa
+ò« 0xf2ab
+ò¬ 0xf2ac
+ò­ 0xf2ad
+ò® 0xf2ae
+ò¯ 0xf2af
+ò° 0xf2b0
+ò± 0xf2b1
+ò² 0xf2b2
+ò³ 0xf2b3
+ò´ 0xf2b4
+òµ 0xf2b5
+ò¶ 0xf2b6
+ò· 0xf2b7
+ò¸ 0xf2b8
+ò¹ 0xf2b9
+òº 0xf2ba
+ò» 0xf2bb
+ò¼ 0xf2bc
+ò½ 0xf2bd
+ò¾ 0xf2be
+ò¿ 0xf2bf
+òÀ 0xf2c0
+òÁ 0xf2c1
+òÂ 0xf2c2
+òÃ 0xf2c3
+òÄ 0xf2c4
+òÅ 0xf2c5
+òÆ 0xf2c6
+òÇ 0xf2c7
+òÈ 0xf2c8
+òÉ 0xf2c9
+òÊ 0xf2ca
+òË 0xf2cb
+òÌ 0xf2cc
+òÍ 0xf2cd
+òÎ 0xf2ce
+òÏ 0xf2cf
+òÐ 0xf2d0
+òÑ 0xf2d1
+òÒ 0xf2d2
+òÓ 0xf2d3
+òÔ 0xf2d4
+òÕ 0xf2d5
+òÖ 0xf2d6
+ò× 0xf2d7
+òØ 0xf2d8
+òÙ 0xf2d9
+òÚ 0xf2da
+òÛ 0xf2db
+òÜ 0xf2dc
+òÝ 0xf2dd
+òÞ 0xf2de
+òß 0xf2df
+òà 0xf2e0
+òá 0xf2e1
+òâ 0xf2e2
+òã 0xf2e3
+òä 0xf2e4
+òå 0xf2e5
+òæ 0xf2e6
+òç 0xf2e7
+òè 0xf2e8
+òé 0xf2e9
+òê 0xf2ea
+òë 0xf2eb
+òì 0xf2ec
+òí 0xf2ed
+òî 0xf2ee
+òï 0xf2ef
+òð 0xf2f0
+òñ 0xf2f1
+òò 0xf2f2
+òó 0xf2f3
+òô 0xf2f4
+òõ 0xf2f5
+òö 0xf2f6
+ò÷ 0xf2f7
+òø 0xf2f8
+òù 0xf2f9
+òú 0xf2fa
+òû 0xf2fb
+òü 0xf2fc
+òý 0xf2fd
+òþ 0xf2fe
+ó¡ 0xf3a1
+ó¢ 0xf3a2
+ó£ 0xf3a3
+ó¤ 0xf3a4
+ó¥ 0xf3a5
+ó¦ 0xf3a6
+ó§ 0xf3a7
+ó¨ 0xf3a8
+ó© 0xf3a9
+óª 0xf3aa
+ó« 0xf3ab
+ó¬ 0xf3ac
+ó­ 0xf3ad
+ó® 0xf3ae
+ó¯ 0xf3af
+ó° 0xf3b0
+ó± 0xf3b1
+ó² 0xf3b2
+ó³ 0xf3b3
+ó´ 0xf3b4
+óµ 0xf3b5
+ó¶ 0xf3b6
+ó· 0xf3b7
+ó¸ 0xf3b8
+ó¹ 0xf3b9
+óº 0xf3ba
+ó» 0xf3bb
+ó¼ 0xf3bc
+ó½ 0xf3bd
+ó¾ 0xf3be
+ó¿ 0xf3bf
+óÀ 0xf3c0
+óÁ 0xf3c1
+óÂ 0xf3c2
+óÃ 0xf3c3
+óÄ 0xf3c4
+óÅ 0xf3c5
+óÆ 0xf3c6
+óÇ 0xf3c7
+óÈ 0xf3c8
+óÉ 0xf3c9
+óÊ 0xf3ca
+óË 0xf3cb
+óÌ 0xf3cc
+óÍ 0xf3cd
+óÎ 0xf3ce
+óÏ 0xf3cf
+óÐ 0xf3d0
+óÑ 0xf3d1
+óÒ 0xf3d2
+óÓ 0xf3d3
+óÔ 0xf3d4
+óÕ 0xf3d5
+óÖ 0xf3d6
+ó× 0xf3d7
+óØ 0xf3d8
+óÙ 0xf3d9
+óÚ 0xf3da
+óÛ 0xf3db
+óÜ 0xf3dc
+óÝ 0xf3dd
+óÞ 0xf3de
+óß 0xf3df
+óà 0xf3e0
+óá 0xf3e1
+óâ 0xf3e2
+óã 0xf3e3
+óä 0xf3e4
+óå 0xf3e5
+óæ 0xf3e6
+óç 0xf3e7
+óè 0xf3e8
+óé 0xf3e9
+óê 0xf3ea
+óë 0xf3eb
+óì 0xf3ec
+óí 0xf3ed
+óî 0xf3ee
+óï 0xf3ef
+óð 0xf3f0
+óñ 0xf3f1
+óò 0xf3f2
+óó 0xf3f3
+óô 0xf3f4
+óõ 0xf3f5
+óö 0xf3f6
+ó÷ 0xf3f7
+óø 0xf3f8
+óù 0xf3f9
+óú 0xf3fa
+óû 0xf3fb
+óü 0xf3fc
+óý 0xf3fd
+óþ 0xf3fe
+ô¡ 0xf4a1
+ô¢ 0xf4a2
+ô£ 0xf4a3
+ô¤ 0xf4a4
+ô¥ 0xf4a5
+ô¦ 0xf4a6
+ô§ 0xf4a7
+ô¨ 0xf4a8
+ô© 0xf4a9
+ôª 0xf4aa
+ô« 0xf4ab
+ô¬ 0xf4ac
+ô­ 0xf4ad
+ô® 0xf4ae
+ô¯ 0xf4af
+ô° 0xf4b0
+ô± 0xf4b1
+ô² 0xf4b2
+ô³ 0xf4b3
+ô´ 0xf4b4
+ôµ 0xf4b5
+ô¶ 0xf4b6
+ô· 0xf4b7
+ô¸ 0xf4b8
+ô¹ 0xf4b9
+ôº 0xf4ba
+ô» 0xf4bb
+ô¼ 0xf4bc
+ô½ 0xf4bd
+ô¾ 0xf4be
+ô¿ 0xf4bf
+ôÀ 0xf4c0
+ôÁ 0xf4c1
+ôÂ 0xf4c2
+ôÃ 0xf4c3
+ôÄ 0xf4c4
+ôÅ 0xf4c5
+ôÆ 0xf4c6
+ôÇ 0xf4c7
+ôÈ 0xf4c8
+ôÉ 0xf4c9
+ôÊ 0xf4ca
+ôË 0xf4cb
+ôÌ 0xf4cc
+ôÍ 0xf4cd
+ôÎ 0xf4ce
+ôÏ 0xf4cf
+ôÐ 0xf4d0
+ôÑ 0xf4d1
+ôÒ 0xf4d2
+ôÓ 0xf4d3
+ôÔ 0xf4d4
+ôÕ 0xf4d5
+ôÖ 0xf4d6
+ô× 0xf4d7
+ôØ 0xf4d8
+ôÙ 0xf4d9
+ôÚ 0xf4da
+ôÛ 0xf4db
+ôÜ 0xf4dc
+ôÝ 0xf4dd
+ôÞ 0xf4de
+ôß 0xf4df
+ôà 0xf4e0
+ôá 0xf4e1
+ôâ 0xf4e2
+ôã 0xf4e3
+ôä 0xf4e4
+ôå 0xf4e5
+ôæ 0xf4e6
+ôç 0xf4e7
+ôè 0xf4e8
+ôé 0xf4e9
+ôê 0xf4ea
+ôë 0xf4eb
+ôì 0xf4ec
+ôí 0xf4ed
+ôî 0xf4ee
+ôï 0xf4ef
+ôð 0xf4f0
+ôñ 0xf4f1
+ôò 0xf4f2
+ôó 0xf4f3
+ôô 0xf4f4
+ôõ 0xf4f5
+ôö 0xf4f6
+ô÷ 0xf4f7
+ôø 0xf4f8
+ôù 0xf4f9
+ôú 0xf4fa
+ôû 0xf4fb
+ôü 0xf4fc
+ôý 0xf4fd
+ôþ 0xf4fe
+õ¡ 0xf5a1
+õ¢ 0xf5a2
+õ£ 0xf5a3
+õ¤ 0xf5a4
+õ¥ 0xf5a5
+õ¦ 0xf5a6
+õ§ 0xf5a7
+õ¨ 0xf5a8
+õ© 0xf5a9
+õª 0xf5aa
+õ« 0xf5ab
+õ¬ 0xf5ac
+õ­ 0xf5ad
+õ® 0xf5ae
+õ¯ 0xf5af
+õ° 0xf5b0
+õ± 0xf5b1
+õ² 0xf5b2
+õ³ 0xf5b3
+õ´ 0xf5b4
+õµ 0xf5b5
+õ¶ 0xf5b6
+õ· 0xf5b7
+õ¸ 0xf5b8
+õ¹ 0xf5b9
+õº 0xf5ba
+õ» 0xf5bb
+õ¼ 0xf5bc
+õ½ 0xf5bd
+õ¾ 0xf5be
+õ¿ 0xf5bf
+õÀ 0xf5c0
+õÁ 0xf5c1
+õÂ 0xf5c2
+õÃ 0xf5c3
+õÄ 0xf5c4
+õÅ 0xf5c5
+õÆ 0xf5c6
+õÇ 0xf5c7
+õÈ 0xf5c8
+õÉ 0xf5c9
+õÊ 0xf5ca
+õË 0xf5cb
+õÌ 0xf5cc
+õÍ 0xf5cd
+õÎ 0xf5ce
+õÏ 0xf5cf
+õÐ 0xf5d0
+õÑ 0xf5d1
+õÒ 0xf5d2
+õÓ 0xf5d3
+õÔ 0xf5d4
+õÕ 0xf5d5
+õÖ 0xf5d6
+õ× 0xf5d7
+õØ 0xf5d8
+õÙ 0xf5d9
+õÚ 0xf5da
+õÛ 0xf5db
+õÜ 0xf5dc
+õÝ 0xf5dd
+õÞ 0xf5de
+õß 0xf5df
+õà 0xf5e0
+õá 0xf5e1
+õâ 0xf5e2
+õã 0xf5e3
+õä 0xf5e4
+õå 0xf5e5
+õæ 0xf5e6
+õç 0xf5e7
+õè 0xf5e8
+õé 0xf5e9
+õê 0xf5ea
+õë 0xf5eb
+õì 0xf5ec
+õí 0xf5ed
+õî 0xf5ee
+õï 0xf5ef
+õð 0xf5f0
+õñ 0xf5f1
+õò 0xf5f2
+õó 0xf5f3
+õô 0xf5f4
+õõ 0xf5f5
+õö 0xf5f6
+õ÷ 0xf5f7
+õø 0xf5f8
+õù 0xf5f9
+õú 0xf5fa
+õû 0xf5fb
+õü 0xf5fc
+õý 0xf5fd
+õþ 0xf5fe
+ö¡ 0xf6a1
+ö¢ 0xf6a2
+ö£ 0xf6a3
+ö¤ 0xf6a4
+ö¥ 0xf6a5
+ö¦ 0xf6a6
+ö§ 0xf6a7
+ö¨ 0xf6a8
+ö© 0xf6a9
+öª 0xf6aa
+ö« 0xf6ab
+ö¬ 0xf6ac
+ö­ 0xf6ad
+ö® 0xf6ae
+ö¯ 0xf6af
+ö° 0xf6b0
+ö± 0xf6b1
+ö² 0xf6b2
+ö³ 0xf6b3
+ö´ 0xf6b4
+öµ 0xf6b5
+ö¶ 0xf6b6
+ö· 0xf6b7
+ö¸ 0xf6b8
+ö¹ 0xf6b9
+öº 0xf6ba
+ö» 0xf6bb
+ö¼ 0xf6bc
+ö½ 0xf6bd
+ö¾ 0xf6be
+ö¿ 0xf6bf
+öÀ 0xf6c0
+öÁ 0xf6c1
+öÂ 0xf6c2
+öÃ 0xf6c3
+öÄ 0xf6c4
+öÅ 0xf6c5
+öÆ 0xf6c6
+öÇ 0xf6c7
+öÈ 0xf6c8
+öÉ 0xf6c9
+öÊ 0xf6ca
+öË 0xf6cb
+öÌ 0xf6cc
+öÍ 0xf6cd
+öÎ 0xf6ce
+öÏ 0xf6cf
+öÐ 0xf6d0
+öÑ 0xf6d1
+öÒ 0xf6d2
+öÓ 0xf6d3
+öÔ 0xf6d4
+öÕ 0xf6d5
+öÖ 0xf6d6
+ö× 0xf6d7
+öØ 0xf6d8
+öÙ 0xf6d9
+öÚ 0xf6da
+öÛ 0xf6db
+öÜ 0xf6dc
+öÝ 0xf6dd
+öÞ 0xf6de
+öß 0xf6df
+öà 0xf6e0
+öá 0xf6e1
+öâ 0xf6e2
+öã 0xf6e3
+öä 0xf6e4
+öå 0xf6e5
+öæ 0xf6e6
+öç 0xf6e7
+öè 0xf6e8
+öé 0xf6e9
+öê 0xf6ea
+öë 0xf6eb
+öì 0xf6ec
+öí 0xf6ed
+öî 0xf6ee
+öï 0xf6ef
+öð 0xf6f0
+öñ 0xf6f1
+öò 0xf6f2
+öó 0xf6f3
+öô 0xf6f4
+öõ 0xf6f5
+öö 0xf6f6
+ö÷ 0xf6f7
+öø 0xf6f8
+öù 0xf6f9
+öú 0xf6fa
+öû 0xf6fb
+öü 0xf6fc
+öý 0xf6fd
+öþ 0xf6fe
+÷¡ 0xf7a1
+÷¢ 0xf7a2
+÷£ 0xf7a3
+÷¤ 0xf7a4
+÷¥ 0xf7a5
+÷¦ 0xf7a6
+֤ 0xf7a7
+֬ 0xf7a8
+֩ 0xf7a9
+ֻ 0xf7aa
+÷« 0xf7ab
+÷¬ 0xf7ac
+÷­ 0xf7ad
+÷® 0xf7ae
+÷¯ 0xf7af
+÷° 0xf7b0
+÷± 0xf7b1
+÷² 0xf7b2
+÷³ 0xf7b3
+÷´ 0xf7b4
+÷µ 0xf7b5
+֦ 0xf7b6
+÷· 0xf7b7
+÷¸ 0xf7b8
+÷¹ 0xf7b9
+ּ 0xf7ba
+÷» 0xf7bb
+÷¼ 0xf7bc
+÷½ 0xf7bd
+÷¾ 0xf7be
+÷¿ 0xf7bf
+÷À 0xf7c0
+÷Á 0xf7c1
+÷ 0xf7c2
+ֈ 0xf7c3
+ր 0xf7c4
+ց 0xf7c5
+֮ 0xf7c6
+ւ 0xf7c7
+÷È 0xf7c8
+փ 0xf7c9
+÷Ê 0xf7ca
+÷Ë 0xf7cb
+÷Ì 0xf7cc
+÷Í 0xf7cd
+÷Î 0xf7ce
+÷Ï 0xf7cf
+÷Ð 0xf7d0
+ք 0xf7d1
+÷Ò 0xf7d2
+÷Ó 0xf7d3
+÷Ô 0xf7d4
+÷Õ 0xf7d5
+÷Ö 0xf7d6
+÷× 0xf7d7
+֯ 0xf7d8
+÷Ù 0xf7d9
+÷Ú 0xf7da
+÷Û 0xf7db
+ֆ 0xf7dc
+÷Ý 0xf7dd
+÷Þ 0xf7de
+֧ 0xf7df
+ֈ 0xf7e0
+և 0xf7e1
+։ 0xf7e2
+֋ 0xf7e3
+֊ 0xf7e4
+֌ 0xf7e5
+־ 0xf7e6
+֍ 0xf7e7
+֏ 0xf7e8
+֎ 0xf7e9
+֐ 0xf7ea
+֑ 0xf7eb
+֓ 0xf7ec
+֒ 0xf7ed
+֔ 0xf7ee
+֕ 0xf7ef
+÷ð 0xf7f0
+֖ 0xf7f1
+÷ò 0xf7f2
+÷ó 0xf7f3
+÷ô 0xf7f4
+÷õ 0xf7f5
+÷ö 0xf7f6
+÷÷ 0xf7f7
+÷ø 0xf7f8
+÷ù 0xf7f9
+÷ú 0xf7fa
+÷û 0xf7fb
+֟ 0xf7fc
+÷ý 0xf7fd
+÷þ 0xf7fe
diff --git a/private/oleauto/sample/nlssort/result.cht b/private/oleauto/sample/nlssort/result.cht
new file mode 100644
index 000000000..ee8ba3e87
--- /dev/null
+++ b/private/oleauto/sample/nlssort/result.cht
@@ -0,0 +1,13053 @@
+¤@ 0xa440
+¤A 0xa441
+¤B 0xa442
+¤C 0xa443
+¤D 0xa444
+¤E 0xa445
+¤F 0xa446
+¤G 0xa447
+¤H 0xa448
+¤I 0xa449
+¤J 0xa44a
+¤K 0xa44b
+¤L 0xa44c
+¤M 0xa44d
+¤N 0xa44e
+¤O 0xa44f
+¤P 0xa450
+¤Q 0xa451
+¤R 0xa452
+¤S 0xa453
+É@ 0xc940
+ÉA 0xc941
+ÉB 0xc942
+ÉC 0xc943
+ÉD 0xc944
+¤T 0xa454
+¤U 0xa455
+¤V 0xa456
+¤W 0xa457
+¤X 0xa458
+¤Y 0xa459
+¤Z 0xa45a
+¤[ 0xa45b
+¤\ 0xa45c
+¤] 0xa45d
+¤^ 0xa45e
+¤_ 0xa45f
+¤` 0xa460
+¤a 0xa461
+¤b 0xa462
+¤c 0xa463
+¤d 0xa464
+¤e 0xa465
+¤f 0xa466
+¤g 0xa467
+¤h 0xa468
+¤i 0xa469
+¤j 0xa46a
+¤k 0xa46b
+¤l 0xa46c
+¤m 0xa46d
+¤n 0xa46e
+¤o 0xa46f
+¤p 0xa470
+¤q 0xa471
+¤r 0xa472
+¤s 0xa473
+¤t 0xa474
+¤u 0xa475
+¤v 0xa476
+¤w 0xa477
+¤x 0xa478
+¤y 0xa479
+¤z 0xa47a
+¤{ 0xa47b
+¤| 0xa47c
+¤} 0xa47d
+¤~ 0xa47e
+ÉE 0xc945
+ÉF 0xc946
+ÉG 0xc947
+ÉH 0xc948
+ÉI 0xc949
+ÉJ 0xc94a
+ÉK 0xc94b
+ÉL 0xc94c
+¤¡ 0xa4a1
+¤¢ 0xa4a2
+¤£ 0xa4a3
+¤¤ 0xa4a4
+¤¥ 0xa4a5
+¤¦ 0xa4a6
+¤§ 0xa4a7
+¤¨ 0xa4a8
+¤© 0xa4a9
+¤ª 0xa4aa
+¤« 0xa4ab
+¤¬ 0xa4ac
+¤­ 0xa4ad
+¤® 0xa4ae
+¤¯ 0xa4af
+¤° 0xa4b0
+¤± 0xa4b1
+¤² 0xa4b2
+¤³ 0xa4b3
+¤´ 0xa4b4
+¤µ 0xa4b5
+¤¶ 0xa4b6
+¤· 0xa4b7
+¤¸ 0xa4b8
+¤¹ 0xa4b9
+¤º 0xa4ba
+¤» 0xa4bb
+¤¼ 0xa4bc
+¤½ 0xa4bd
+¤¾ 0xa4be
+¤¿ 0xa4bf
+¤À 0xa4c0
+¤Á 0xa4c1
+¤Â 0xa4c2
+¤Ã 0xa4c3
+¤Ä 0xa4c4
+¤Å 0xa4c5
+¤Æ 0xa4c6
+¤Ç 0xa4c7
+¤È 0xa4c8
+¤É 0xa4c9
+¤Ê 0xa4ca
+¤Ë 0xa4cb
+¤Ì 0xa4cc
+¤Í 0xa4cd
+¤Î 0xa4ce
+¤Ï 0xa4cf
+¤Ð 0xa4d0
+¤Ñ 0xa4d1
+¤Ò 0xa4d2
+¤Ó 0xa4d3
+¤Ô 0xa4d4
+¤Õ 0xa4d5
+¤Ö 0xa4d6
+¤× 0xa4d7
+¤Ø 0xa4d8
+¤Ù 0xa4d9
+¤Ú 0xa4da
+¤Û 0xa4db
+¤Ü 0xa4dc
+¤Ý 0xa4dd
+¤Þ 0xa4de
+¤ß 0xa4df
+¤à 0xa4e0
+¤á 0xa4e1
+¤â 0xa4e2
+¤ã 0xa4e3
+¤ä 0xa4e4
+¤å 0xa4e5
+¤æ 0xa4e6
+¤ç 0xa4e7
+¤è 0xa4e8
+¤é 0xa4e9
+¤ê 0xa4ea
+¤ë 0xa4eb
+¤ì 0xa4ec
+¤í 0xa4ed
+¤î 0xa4ee
+¤ï 0xa4ef
+¤ð 0xa4f0
+¤ñ 0xa4f1
+¤ò 0xa4f2
+¤ó 0xa4f3
+¤ô 0xa4f4
+¤õ 0xa4f5
+¤ö 0xa4f6
+¤÷ 0xa4f7
+¤ø 0xa4f8
+¤ù 0xa4f9
+¤ú 0xa4fa
+¤û 0xa4fb
+¤ü 0xa4fc
+¤ý 0xa4fd
+ÉM 0xc94d
+ÉN 0xc94e
+ÉO 0xc94f
+ÉP 0xc950
+ÉQ 0xc951
+ÉR 0xc952
+ÉS 0xc953
+ÉT 0xc954
+ÉU 0xc955
+ÉV 0xc956
+ÉW 0xc957
+ÉX 0xc958
+ÉY 0xc959
+ÉZ 0xc95a
+É[ 0xc95b
+É\ 0xc95c
+É] 0xc95d
+É^ 0xc95e
+É_ 0xc95f
+É` 0xc960
+Éa 0xc961
+Éb 0xc962
+¤þ 0xa4fe
+¥@ 0xa540
+¥A 0xa541
+¥B 0xa542
+¥C 0xa543
+¥D 0xa544
+¥E 0xa545
+¥F 0xa546
+¥G 0xa547
+¥H 0xa548
+¥I 0xa549
+¥J 0xa54a
+¥K 0xa54b
+¥L 0xa54c
+¥M 0xa54d
+¥N 0xa54e
+¥O 0xa54f
+¥P 0xa550
+¥Q 0xa551
+¥R 0xa552
+¥S 0xa553
+¥T 0xa554
+¥U 0xa555
+¥V 0xa556
+¥W 0xa557
+¥X 0xa558
+¥Y 0xa559
+¥Z 0xa55a
+¥[ 0xa55b
+¥\ 0xa55c
+¥] 0xa55d
+¥^ 0xa55e
+¥_ 0xa55f
+¥` 0xa560
+¥a 0xa561
+¥b 0xa562
+¥c 0xa563
+¥d 0xa564
+¥e 0xa565
+¥f 0xa566
+¥g 0xa567
+¥h 0xa568
+¥i 0xa569
+¥j 0xa56a
+¥k 0xa56b
+¥l 0xa56c
+¥m 0xa56d
+¥n 0xa56e
+¥o 0xa56f
+¥p 0xa570
+¥q 0xa571
+¥r 0xa572
+¥s 0xa573
+¥t 0xa574
+¥u 0xa575
+¥v 0xa576
+¥w 0xa577
+¥x 0xa578
+¥y 0xa579
+¥z 0xa57a
+¥{ 0xa57b
+¥| 0xa57c
+¥} 0xa57d
+¥~ 0xa57e
+¥¡ 0xa5a1
+¥¢ 0xa5a2
+¥£ 0xa5a3
+¥¤ 0xa5a4
+¥¥ 0xa5a5
+¥¦ 0xa5a6
+¥§ 0xa5a7
+¥¨ 0xa5a8
+¥© 0xa5a9
+¥ª 0xa5aa
+¥« 0xa5ab
+¥¬ 0xa5ac
+¥­ 0xa5ad
+¥® 0xa5ae
+¥¯ 0xa5af
+¥° 0xa5b0
+¥± 0xa5b1
+¥² 0xa5b2
+¥³ 0xa5b3
+¥´ 0xa5b4
+¥µ 0xa5b5
+¥¶ 0xa5b6
+¥· 0xa5b7
+¥¸ 0xa5b8
+¥¹ 0xa5b9
+¥º 0xa5ba
+¥» 0xa5bb
+¥¼ 0xa5bc
+¥½ 0xa5bd
+¥¾ 0xa5be
+¥¿ 0xa5bf
+¥À 0xa5c0
+¥Á 0xa5c1
+¥Â 0xa5c2
+¥Ã 0xa5c3
+¥Ä 0xa5c4
+¥Å 0xa5c5
+¥Æ 0xa5c6
+¥Ç 0xa5c7
+¥È 0xa5c8
+¥É 0xa5c9
+¥Ê 0xa5ca
+¥Ë 0xa5cb
+¥Ì 0xa5cc
+¥Í 0xa5cd
+¥Î 0xa5ce
+¥Ï 0xa5cf
+¥Ð 0xa5d0
+¥Ñ 0xa5d1
+¥Ò 0xa5d2
+¥Ó 0xa5d3
+¥Ô 0xa5d4
+¥Õ 0xa5d5
+¥Ö 0xa5d6
+¥× 0xa5d7
+¥Ø 0xa5d8
+¥Ù 0xa5d9
+¥Ú 0xa5da
+¥Û 0xa5db
+¥Ü 0xa5dc
+¥Ý 0xa5dd
+¥Þ 0xa5de
+¥ß 0xa5df
+Éc 0xc963
+Éd 0xc964
+Ée 0xc965
+Éf 0xc966
+Ég 0xc967
+Éh 0xc968
+Éi 0xc969
+Éj 0xc96a
+Ék 0xc96b
+Él 0xc96c
+Ém 0xc96d
+Én 0xc96e
+Éo 0xc96f
+Ép 0xc970
+Éq 0xc971
+Ér 0xc972
+És 0xc973
+Ét 0xc974
+Éu 0xc975
+Év 0xc976
+Éw 0xc977
+Éx 0xc978
+Éy 0xc979
+Éz 0xc97a
+É{ 0xc97b
+É| 0xc97c
+É} 0xc97d
+É~ 0xc97e
+É¡ 0xc9a1
+É¢ 0xc9a2
+É£ 0xc9a3
+ɤ 0xc9a4
+É¥ 0xc9a5
+ɦ 0xc9a6
+ɧ 0xc9a7
+ɨ 0xc9a8
+É© 0xc9a9
+ɪ 0xc9aa
+¥à 0xa5e0
+¥á 0xa5e1
+¥â 0xa5e2
+¥ã 0xa5e3
+¥ä 0xa5e4
+¥å 0xa5e5
+¥æ 0xa5e6
+¥ç 0xa5e7
+¥è 0xa5e8
+¥é 0xa5e9
+¥ê 0xa5ea
+¥ë 0xa5eb
+¥ì 0xa5ec
+¥í 0xa5ed
+¥î 0xa5ee
+¥ï 0xa5ef
+¥ð 0xa5f0
+¥ñ 0xa5f1
+¥ò 0xa5f2
+¥ó 0xa5f3
+¥ô 0xa5f4
+¥õ 0xa5f5
+¥ö 0xa5f6
+¥÷ 0xa5f7
+¥ø 0xa5f8
+¥ù 0xa5f9
+¥ú 0xa5fa
+¥û 0xa5fb
+¥ü 0xa5fc
+¥ý 0xa5fd
+¥þ 0xa5fe
+¦@ 0xa640
+¦A 0xa641
+¦B 0xa642
+¦C 0xa643
+¦D 0xa644
+¦E 0xa645
+¦F 0xa646
+¦G 0xa647
+¦H 0xa648
+¦I 0xa649
+¦J 0xa64a
+¦K 0xa64b
+¦L 0xa64c
+¦M 0xa64d
+¦N 0xa64e
+¦O 0xa64f
+¦P 0xa650
+¦Q 0xa651
+¦R 0xa652
+¦S 0xa653
+¦T 0xa654
+¦U 0xa655
+¦V 0xa656
+¦W 0xa657
+¦X 0xa658
+¦Y 0xa659
+¦Z 0xa65a
+¦[ 0xa65b
+¦\ 0xa65c
+¦] 0xa65d
+¦^ 0xa65e
+¦_ 0xa65f
+¦` 0xa660
+¦a 0xa661
+¦b 0xa662
+¦c 0xa663
+¦d 0xa664
+¦e 0xa665
+¦f 0xa666
+¦g 0xa667
+¦h 0xa668
+¦i 0xa669
+¦j 0xa66a
+¦k 0xa66b
+¦l 0xa66c
+¦m 0xa66d
+¦n 0xa66e
+¦o 0xa66f
+¦p 0xa670
+¦q 0xa671
+¦r 0xa672
+¦s 0xa673
+¦t 0xa674
+¦u 0xa675
+¦v 0xa676
+¦w 0xa677
+¦x 0xa678
+¦y 0xa679
+¦z 0xa67a
+¦{ 0xa67b
+¦| 0xa67c
+¦} 0xa67d
+¦~ 0xa67e
+¦¡ 0xa6a1
+¦¢ 0xa6a2
+¦£ 0xa6a3
+¦¤ 0xa6a4
+¦¥ 0xa6a5
+¦¦ 0xa6a6
+¦§ 0xa6a7
+¦¨ 0xa6a8
+¦© 0xa6a9
+¦ª 0xa6aa
+¦« 0xa6ab
+¦¬ 0xa6ac
+¦­ 0xa6ad
+¦® 0xa6ae
+¦¯ 0xa6af
+¦° 0xa6b0
+¦± 0xa6b1
+¦² 0xa6b2
+¦³ 0xa6b3
+¦´ 0xa6b4
+¦µ 0xa6b5
+¦¶ 0xa6b6
+¦· 0xa6b7
+¦¸ 0xa6b8
+¦¹ 0xa6b9
+¦º 0xa6ba
+¦» 0xa6bb
+¦¼ 0xa6bc
+¦½ 0xa6bd
+¦¾ 0xa6be
+¦¿ 0xa6bf
+¦À 0xa6c0
+¦Á 0xa6c1
+¦Â 0xa6c2
+¦Ã 0xa6c3
+¦Ä 0xa6c4
+¦Å 0xa6c5
+¦Æ 0xa6c6
+¦Ç 0xa6c7
+¦È 0xa6c8
+¦É 0xa6c9
+¦Ê 0xa6ca
+¦Ë 0xa6cb
+¦Ì 0xa6cc
+¦Í 0xa6cd
+¦Î 0xa6ce
+¦Ï 0xa6cf
+¦Ð 0xa6d0
+¦Ñ 0xa6d1
+¦Ò 0xa6d2
+¦Ó 0xa6d3
+¦Ô 0xa6d4
+¦Õ 0xa6d5
+¦Ö 0xa6d6
+¦× 0xa6d7
+¦Ø 0xa6d8
+¦Ù 0xa6d9
+¦Ú 0xa6da
+¦Û 0xa6db
+¦Ü 0xa6dc
+¦Ý 0xa6dd
+¦Þ 0xa6de
+¦ß 0xa6df
+¦à 0xa6e0
+¦á 0xa6e1
+¦â 0xa6e2
+¦ã 0xa6e3
+¦ä 0xa6e4
+¦å 0xa6e5
+¦æ 0xa6e6
+¦ç 0xa6e7
+¦è 0xa6e8
+¦é 0xa6e9
+É« 0xc9ab
+ɬ 0xc9ac
+É­ 0xc9ad
+É® 0xc9ae
+ɯ 0xc9af
+É° 0xc9b0
+ɱ 0xc9b1
+ɲ 0xc9b2
+ɳ 0xc9b3
+É´ 0xc9b4
+ɵ 0xc9b5
+ɶ 0xc9b6
+É· 0xc9b7
+ɸ 0xc9b8
+ɹ 0xc9b9
+ɺ 0xc9ba
+É» 0xc9bb
+ɼ 0xc9bc
+ɽ 0xc9bd
+ɾ 0xc9be
+É¿ 0xc9bf
+ÉÀ 0xc9c0
+ÉÁ 0xc9c1
+ÉÂ 0xc9c2
+ÉÃ 0xc9c3
+ÉÄ 0xc9c4
+ÉÅ 0xc9c5
+ÉÆ 0xc9c6
+ÉÇ 0xc9c7
+ÉÈ 0xc9c8
+ÉÉ 0xc9c9
+ÉÊ 0xc9ca
+ÉË 0xc9cb
+ÉÌ 0xc9cc
+ÉÍ 0xc9cd
+ÉÎ 0xc9ce
+ÉÏ 0xc9cf
+ÉÐ 0xc9d0
+ÉÑ 0xc9d1
+ÉÒ 0xc9d2
+ÉÓ 0xc9d3
+ÉÔ 0xc9d4
+ÉÕ 0xc9d5
+ÉÖ 0xc9d6
+É× 0xc9d7
+ÉØ 0xc9d8
+ÉÙ 0xc9d9
+ÉÚ 0xc9da
+ÉÛ 0xc9db
+ÉÜ 0xc9dc
+ÉÝ 0xc9dd
+ÉÞ 0xc9de
+Éß 0xc9df
+Éà 0xc9e0
+Éá 0xc9e1
+Éâ 0xc9e2
+Éã 0xc9e3
+Éä 0xc9e4
+Éå 0xc9e5
+Éæ 0xc9e6
+Éç 0xc9e7
+Éè 0xc9e8
+Éé 0xc9e9
+Éê 0xc9ea
+Éë 0xc9eb
+Éì 0xc9ec
+Éí 0xc9ed
+Éî 0xc9ee
+Éï 0xc9ef
+Éð 0xc9f0
+Éñ 0xc9f1
+Éò 0xc9f2
+Éó 0xc9f3
+Éô 0xc9f4
+Éõ 0xc9f5
+Éö 0xc9f6
+É÷ 0xc9f7
+Éø 0xc9f8
+Éù 0xc9f9
+Éú 0xc9fa
+Éû 0xc9fb
+Éü 0xc9fc
+Éý 0xc9fd
+Éþ 0xc9fe
+Ê@ 0xca40
+ÊA 0xca41
+ÊB 0xca42
+ÊC 0xca43
+ÊD 0xca44
+ÊE 0xca45
+ÊF 0xca46
+ÊG 0xca47
+ÊH 0xca48
+ÊI 0xca49
+ÊJ 0xca4a
+ÊK 0xca4b
+ÊL 0xca4c
+ÊM 0xca4d
+ÊN 0xca4e
+ÊO 0xca4f
+ÊP 0xca50
+ÊQ 0xca51
+ÊR 0xca52
+ÊS 0xca53
+ÊT 0xca54
+ÊU 0xca55
+ÊV 0xca56
+ÊW 0xca57
+ÊX 0xca58
+ÊY 0xca59
+¦ê 0xa6ea
+¦ë 0xa6eb
+¦ì 0xa6ec
+¦í 0xa6ed
+¦î 0xa6ee
+¦ï 0xa6ef
+¦ð 0xa6f0
+¦ñ 0xa6f1
+¦ò 0xa6f2
+¦ó 0xa6f3
+¦ô 0xa6f4
+¦õ 0xa6f5
+¦ö 0xa6f6
+¦÷ 0xa6f7
+¦ø 0xa6f8
+¦ù 0xa6f9
+¦ú 0xa6fa
+¦û 0xa6fb
+¦ü 0xa6fc
+¦ý 0xa6fd
+¦þ 0xa6fe
+§@ 0xa740
+§A 0xa741
+§B 0xa742
+§C 0xa743
+§D 0xa744
+§E 0xa745
+§F 0xa746
+§G 0xa747
+§H 0xa748
+§I 0xa749
+§J 0xa74a
+§K 0xa74b
+§L 0xa74c
+§M 0xa74d
+§N 0xa74e
+§O 0xa74f
+§P 0xa750
+§Q 0xa751
+§R 0xa752
+§S 0xa753
+§T 0xa754
+§U 0xa755
+§V 0xa756
+§W 0xa757
+§X 0xa758
+§Y 0xa759
+§Z 0xa75a
+§[ 0xa75b
+§\ 0xa75c
+§] 0xa75d
+§^ 0xa75e
+§_ 0xa75f
+§` 0xa760
+§a 0xa761
+§b 0xa762
+§c 0xa763
+§d 0xa764
+§e 0xa765
+§f 0xa766
+§g 0xa767
+§h 0xa768
+§i 0xa769
+§j 0xa76a
+§k 0xa76b
+§l 0xa76c
+§m 0xa76d
+§n 0xa76e
+§o 0xa76f
+§p 0xa770
+§q 0xa771
+§r 0xa772
+§s 0xa773
+§t 0xa774
+§u 0xa775
+§v 0xa776
+§w 0xa777
+§x 0xa778
+§y 0xa779
+§z 0xa77a
+§{ 0xa77b
+§| 0xa77c
+§} 0xa77d
+§~ 0xa77e
+§¡ 0xa7a1
+§¢ 0xa7a2
+§£ 0xa7a3
+§¤ 0xa7a4
+§¥ 0xa7a5
+§¦ 0xa7a6
+§§ 0xa7a7
+§¨ 0xa7a8
+§© 0xa7a9
+§ª 0xa7aa
+§« 0xa7ab
+§¬ 0xa7ac
+§­ 0xa7ad
+§® 0xa7ae
+§¯ 0xa7af
+§° 0xa7b0
+§± 0xa7b1
+§² 0xa7b2
+§³ 0xa7b3
+§´ 0xa7b4
+§µ 0xa7b5
+§¶ 0xa7b6
+§· 0xa7b7
+§¸ 0xa7b8
+§¹ 0xa7b9
+§º 0xa7ba
+§» 0xa7bb
+§¼ 0xa7bc
+§½ 0xa7bd
+§¾ 0xa7be
+§¿ 0xa7bf
+§À 0xa7c0
+§Á 0xa7c1
+§Â 0xa7c2
+§Ã 0xa7c3
+§Ä 0xa7c4
+§Å 0xa7c5
+§Æ 0xa7c6
+§Ç 0xa7c7
+§È 0xa7c8
+§É 0xa7c9
+§Ê 0xa7ca
+§Ë 0xa7cb
+§Ì 0xa7cc
+§Í 0xa7cd
+§Î 0xa7ce
+§Ï 0xa7cf
+§Ð 0xa7d0
+§Ñ 0xa7d1
+§Ò 0xa7d2
+§Ó 0xa7d3
+§Ô 0xa7d4
+§Õ 0xa7d5
+§Ö 0xa7d6
+§× 0xa7d7
+§Ø 0xa7d8
+§Ù 0xa7d9
+§Ú 0xa7da
+§Û 0xa7db
+§Ü 0xa7dc
+§Ý 0xa7dd
+§Þ 0xa7de
+§ß 0xa7df
+§à 0xa7e0
+§á 0xa7e1
+§â 0xa7e2
+§ã 0xa7e3
+§ä 0xa7e4
+§å 0xa7e5
+§æ 0xa7e6
+§ç 0xa7e7
+§è 0xa7e8
+§é 0xa7e9
+§ê 0xa7ea
+§ë 0xa7eb
+§ì 0xa7ec
+§í 0xa7ed
+§î 0xa7ee
+§ï 0xa7ef
+§ð 0xa7f0
+§ñ 0xa7f1
+§ò 0xa7f2
+§ó 0xa7f3
+§ô 0xa7f4
+§õ 0xa7f5
+§ö 0xa7f6
+§÷ 0xa7f7
+§ø 0xa7f8
+§ù 0xa7f9
+§ú 0xa7fa
+§û 0xa7fb
+§ü 0xa7fc
+§ý 0xa7fd
+§þ 0xa7fe
+¨@ 0xa840
+¨A 0xa841
+¨B 0xa842
+¨C 0xa843
+¨D 0xa844
+¨E 0xa845
+¨F 0xa846
+¨G 0xa847
+¨H 0xa848
+¨I 0xa849
+¨J 0xa84a
+¨K 0xa84b
+¨L 0xa84c
+¨M 0xa84d
+¨N 0xa84e
+¨O 0xa84f
+¨P 0xa850
+¨Q 0xa851
+¨R 0xa852
+¨S 0xa853
+¨T 0xa854
+¨U 0xa855
+¨V 0xa856
+¨W 0xa857
+¨X 0xa858
+¨Y 0xa859
+¨Z 0xa85a
+¨[ 0xa85b
+¨\ 0xa85c
+¨] 0xa85d
+¨^ 0xa85e
+¨_ 0xa85f
+¨` 0xa860
+¨a 0xa861
+¨b 0xa862
+¨c 0xa863
+¨d 0xa864
+¨e 0xa865
+¨f 0xa866
+¨g 0xa867
+¨h 0xa868
+¨i 0xa869
+¨j 0xa86a
+¨k 0xa86b
+¨l 0xa86c
+¨m 0xa86d
+¨n 0xa86e
+¨o 0xa86f
+¨p 0xa870
+¨q 0xa871
+¨r 0xa872
+¨s 0xa873
+¨t 0xa874
+¨u 0xa875
+¨v 0xa876
+¨w 0xa877
+¨x 0xa878
+¨y 0xa879
+¨z 0xa87a
+¨{ 0xa87b
+¨| 0xa87c
+¨} 0xa87d
+¨~ 0xa87e
+¨¡ 0xa8a1
+¨¢ 0xa8a2
+¨£ 0xa8a3
+¨¤ 0xa8a4
+¨¥ 0xa8a5
+¨¦ 0xa8a6
+¨§ 0xa8a7
+¨¨ 0xa8a8
+¨© 0xa8a9
+¨ª 0xa8aa
+¨« 0xa8ab
+¨¬ 0xa8ac
+¨­ 0xa8ad
+¨® 0xa8ae
+¨¯ 0xa8af
+¨° 0xa8b0
+¨± 0xa8b1
+¨² 0xa8b2
+¨³ 0xa8b3
+¨´ 0xa8b4
+¨µ 0xa8b5
+¨¶ 0xa8b6
+¨· 0xa8b7
+¨¸ 0xa8b8
+¨¹ 0xa8b9
+¨º 0xa8ba
+¨» 0xa8bb
+¨¼ 0xa8bc
+¨½ 0xa8bd
+¨¾ 0xa8be
+¨¿ 0xa8bf
+¨À 0xa8c0
+¨Á 0xa8c1
+¨Â 0xa8c2
+ÊZ 0xca5a
+Ê[ 0xca5b
+Ê\ 0xca5c
+Ê] 0xca5d
+Ê^ 0xca5e
+Ê_ 0xca5f
+Ê` 0xca60
+Êa 0xca61
+Êb 0xca62
+Êc 0xca63
+Êd 0xca64
+Êe 0xca65
+Êf 0xca66
+Êg 0xca67
+Êh 0xca68
+Êi 0xca69
+Êj 0xca6a
+Êk 0xca6b
+Êl 0xca6c
+Êm 0xca6d
+Ên 0xca6e
+Êo 0xca6f
+Êp 0xca70
+Êq 0xca71
+Êr 0xca72
+Ês 0xca73
+Êt 0xca74
+Êu 0xca75
+Êv 0xca76
+Êw 0xca77
+Êx 0xca78
+Êy 0xca79
+Êz 0xca7a
+Ê{ 0xca7b
+Ê| 0xca7c
+Ê} 0xca7d
+Ê~ 0xca7e
+Ê¡ 0xcaa1
+Ê¢ 0xcaa2
+Ê£ 0xcaa3
+ʤ 0xcaa4
+Ê¥ 0xcaa5
+ʦ 0xcaa6
+ʧ 0xcaa7
+ʨ 0xcaa8
+Ê© 0xcaa9
+ʪ 0xcaaa
+Ê« 0xcaab
+ʬ 0xcaac
+Ê­ 0xcaad
+Ê® 0xcaae
+ʯ 0xcaaf
+Ê° 0xcab0
+ʱ 0xcab1
+ʲ 0xcab2
+ʳ 0xcab3
+Ê´ 0xcab4
+ʵ 0xcab5
+ʶ 0xcab6
+Ê· 0xcab7
+ʸ 0xcab8
+ʹ 0xcab9
+ʺ 0xcaba
+Ê» 0xcabb
+ʼ 0xcabc
+ʽ 0xcabd
+ʾ 0xcabe
+Ê¿ 0xcabf
+ÊÀ 0xcac0
+ÊÁ 0xcac1
+ÊÂ 0xcac2
+ÊÃ 0xcac3
+ÊÄ 0xcac4
+ÊÅ 0xcac5
+ÊÆ 0xcac6
+ÊÇ 0xcac7
+ÊÈ 0xcac8
+ÊÉ 0xcac9
+ÊÊ 0xcaca
+ÊË 0xcacb
+ÊÌ 0xcacc
+ÊÍ 0xcacd
+ÊÎ 0xcace
+ÊÏ 0xcacf
+ÊÐ 0xcad0
+ÊÑ 0xcad1
+ÊÒ 0xcad2
+ÊÓ 0xcad3
+ÊÔ 0xcad4
+ÊÕ 0xcad5
+ÊÖ 0xcad6
+Ê× 0xcad7
+ÊØ 0xcad8
+ÊÙ 0xcad9
+ÊÚ 0xcada
+ÊÛ 0xcadb
+ÊÜ 0xcadc
+ÊÝ 0xcadd
+ÊÞ 0xcade
+Êß 0xcadf
+Êà 0xcae0
+Êá 0xcae1
+Êâ 0xcae2
+Êã 0xcae3
+Êä 0xcae4
+Êå 0xcae5
+Êæ 0xcae6
+Êç 0xcae7
+Êè 0xcae8
+Êé 0xcae9
+Êê 0xcaea
+Êë 0xcaeb
+Êì 0xcaec
+Êí 0xcaed
+Êî 0xcaee
+Êï 0xcaef
+Êð 0xcaf0
+Êñ 0xcaf1
+Êò 0xcaf2
+Êó 0xcaf3
+Êô 0xcaf4
+Êõ 0xcaf5
+Êö 0xcaf6
+Ê÷ 0xcaf7
+Êø 0xcaf8
+Êù 0xcaf9
+Êú 0xcafa
+Êû 0xcafb
+Êü 0xcafc
+Êý 0xcafd
+Êþ 0xcafe
+Ë@ 0xcb40
+ËA 0xcb41
+ËB 0xcb42
+ËC 0xcb43
+ËD 0xcb44
+ËE 0xcb45
+ËF 0xcb46
+ËG 0xcb47
+ËH 0xcb48
+ËI 0xcb49
+ËJ 0xcb4a
+ËK 0xcb4b
+ËL 0xcb4c
+ËM 0xcb4d
+ËN 0xcb4e
+ËO 0xcb4f
+ËP 0xcb50
+ËQ 0xcb51
+ËR 0xcb52
+ËS 0xcb53
+ËT 0xcb54
+ËU 0xcb55
+ËV 0xcb56
+ËW 0xcb57
+ËX 0xcb58
+ËY 0xcb59
+ËZ 0xcb5a
+Ë[ 0xcb5b
+Ë\ 0xcb5c
+Ë] 0xcb5d
+Ë^ 0xcb5e
+Ë_ 0xcb5f
+Ë` 0xcb60
+Ëa 0xcb61
+Ëb 0xcb62
+Ëc 0xcb63
+Ëd 0xcb64
+Ëe 0xcb65
+Ëf 0xcb66
+Ëg 0xcb67
+Ëh 0xcb68
+Ëi 0xcb69
+Ëj 0xcb6a
+Ëk 0xcb6b
+Ël 0xcb6c
+Ëm 0xcb6d
+Ën 0xcb6e
+Ëo 0xcb6f
+Ëp 0xcb70
+Ëq 0xcb71
+Ër 0xcb72
+Ës 0xcb73
+Ët 0xcb74
+Ëu 0xcb75
+Ëv 0xcb76
+Ëw 0xcb77
+Ëx 0xcb78
+Ëy 0xcb79
+Ëz 0xcb7a
+Ë{ 0xcb7b
+Ë| 0xcb7c
+Ë} 0xcb7d
+Ë~ 0xcb7e
+Ë¡ 0xcba1
+Ë¢ 0xcba2
+Ë£ 0xcba3
+ˤ 0xcba4
+Ë¥ 0xcba5
+˦ 0xcba6
+˧ 0xcba7
+˨ 0xcba8
+Ë© 0xcba9
+˪ 0xcbaa
+Ë« 0xcbab
+ˬ 0xcbac
+Ë­ 0xcbad
+Ë® 0xcbae
+˯ 0xcbaf
+Ë° 0xcbb0
+¨Ã 0xa8c3
+¨Ä 0xa8c4
+¨Å 0xa8c5
+¨Æ 0xa8c6
+¨Ç 0xa8c7
+¨È 0xa8c8
+¨É 0xa8c9
+¨Ê 0xa8ca
+¨Ë 0xa8cb
+¨Ì 0xa8cc
+¨Í 0xa8cd
+¨Î 0xa8ce
+¨Ï 0xa8cf
+¨Ð 0xa8d0
+¨Ñ 0xa8d1
+¨Ò 0xa8d2
+¨Ó 0xa8d3
+¨Ô 0xa8d4
+¨Õ 0xa8d5
+¨Ö 0xa8d6
+¨× 0xa8d7
+¨Ø 0xa8d8
+¨Ù 0xa8d9
+¨Ú 0xa8da
+¨Û 0xa8db
+¨Ü 0xa8dc
+¨Ý 0xa8dd
+¨Þ 0xa8de
+¨ß 0xa8df
+¨à 0xa8e0
+¨á 0xa8e1
+¨â 0xa8e2
+¨ã 0xa8e3
+¨ä 0xa8e4
+¨å 0xa8e5
+¨æ 0xa8e6
+¨ç 0xa8e7
+¨è 0xa8e8
+¨é 0xa8e9
+¨ê 0xa8ea
+¨ë 0xa8eb
+¨ì 0xa8ec
+¨í 0xa8ed
+¨î 0xa8ee
+¨ï 0xa8ef
+¨ð 0xa8f0
+¨ñ 0xa8f1
+¨ò 0xa8f2
+¨ó 0xa8f3
+¨ô 0xa8f4
+¨õ 0xa8f5
+¨ö 0xa8f6
+¨÷ 0xa8f7
+¨ø 0xa8f8
+¨ù 0xa8f9
+¨ú 0xa8fa
+¨û 0xa8fb
+¨ü 0xa8fc
+¨ý 0xa8fd
+¨þ 0xa8fe
+©@ 0xa940
+©A 0xa941
+©B 0xa942
+©C 0xa943
+©D 0xa944
+©E 0xa945
+©F 0xa946
+©G 0xa947
+©H 0xa948
+©I 0xa949
+©J 0xa94a
+©K 0xa94b
+©L 0xa94c
+©M 0xa94d
+©N 0xa94e
+©O 0xa94f
+©P 0xa950
+©Q 0xa951
+©R 0xa952
+©S 0xa953
+©T 0xa954
+©U 0xa955
+©V 0xa956
+©W 0xa957
+©X 0xa958
+©Y 0xa959
+©Z 0xa95a
+©[ 0xa95b
+©\ 0xa95c
+©] 0xa95d
+©^ 0xa95e
+©_ 0xa95f
+©` 0xa960
+©a 0xa961
+©b 0xa962
+©c 0xa963
+©d 0xa964
+©e 0xa965
+©f 0xa966
+©g 0xa967
+©h 0xa968
+©i 0xa969
+©j 0xa96a
+©k 0xa96b
+©l 0xa96c
+©m 0xa96d
+©n 0xa96e
+©o 0xa96f
+©p 0xa970
+©q 0xa971
+©r 0xa972
+©s 0xa973
+©t 0xa974
+©u 0xa975
+©v 0xa976
+©w 0xa977
+©x 0xa978
+©y 0xa979
+©z 0xa97a
+©{ 0xa97b
+©| 0xa97c
+©} 0xa97d
+©~ 0xa97e
+©¡ 0xa9a1
+©¢ 0xa9a2
+©£ 0xa9a3
+©¤ 0xa9a4
+©¥ 0xa9a5
+©¦ 0xa9a6
+©§ 0xa9a7
+©¨ 0xa9a8
+©© 0xa9a9
+©ª 0xa9aa
+©« 0xa9ab
+©¬ 0xa9ac
+©­ 0xa9ad
+©® 0xa9ae
+©¯ 0xa9af
+©° 0xa9b0
+©± 0xa9b1
+©² 0xa9b2
+©³ 0xa9b3
+©´ 0xa9b4
+©µ 0xa9b5
+©¶ 0xa9b6
+©· 0xa9b7
+©¸ 0xa9b8
+©¹ 0xa9b9
+©º 0xa9ba
+©» 0xa9bb
+©¼ 0xa9bc
+©½ 0xa9bd
+©¾ 0xa9be
+©¿ 0xa9bf
+©À 0xa9c0
+©Á 0xa9c1
+©Â 0xa9c2
+©Ã 0xa9c3
+©Ä 0xa9c4
+©Å 0xa9c5
+©Æ 0xa9c6
+©Ç 0xa9c7
+©È 0xa9c8
+©É 0xa9c9
+©Ê 0xa9ca
+©Ë 0xa9cb
+©Ì 0xa9cc
+©Í 0xa9cd
+©Î 0xa9ce
+©Ï 0xa9cf
+©Ð 0xa9d0
+©Ñ 0xa9d1
+©Ò 0xa9d2
+©Ó 0xa9d3
+©Ô 0xa9d4
+©Õ 0xa9d5
+©Ö 0xa9d6
+©× 0xa9d7
+©Ø 0xa9d8
+©Ù 0xa9d9
+©Ú 0xa9da
+©Û 0xa9db
+©Ü 0xa9dc
+©Ý 0xa9dd
+©Þ 0xa9de
+©ß 0xa9df
+©à 0xa9e0
+©á 0xa9e1
+©â 0xa9e2
+©ã 0xa9e3
+©ä 0xa9e4
+©å 0xa9e5
+©æ 0xa9e6
+©ç 0xa9e7
+©è 0xa9e8
+©é 0xa9e9
+©ê 0xa9ea
+©ë 0xa9eb
+©ì 0xa9ec
+©í 0xa9ed
+©î 0xa9ee
+©ï 0xa9ef
+©ð 0xa9f0
+©ñ 0xa9f1
+©ò 0xa9f2
+©ó 0xa9f3
+©ô 0xa9f4
+©õ 0xa9f5
+©ö 0xa9f6
+©÷ 0xa9f7
+©ø 0xa9f8
+©ù 0xa9f9
+©ú 0xa9fa
+©û 0xa9fb
+©ü 0xa9fc
+©ý 0xa9fd
+©þ 0xa9fe
+ª@ 0xaa40
+ªA 0xaa41
+ªB 0xaa42
+ªC 0xaa43
+ªD 0xaa44
+ªE 0xaa45
+ªF 0xaa46
+ªG 0xaa47
+ªH 0xaa48
+ªI 0xaa49
+ªJ 0xaa4a
+ªK 0xaa4b
+ªL 0xaa4c
+ªM 0xaa4d
+ªN 0xaa4e
+ªO 0xaa4f
+ªP 0xaa50
+ªQ 0xaa51
+ªR 0xaa52
+ªS 0xaa53
+ªT 0xaa54
+ªU 0xaa55
+ªV 0xaa56
+ªW 0xaa57
+ªX 0xaa58
+ªY 0xaa59
+ªZ 0xaa5a
+ª[ 0xaa5b
+ª\ 0xaa5c
+ª] 0xaa5d
+ª^ 0xaa5e
+ª_ 0xaa5f
+ª` 0xaa60
+ªa 0xaa61
+ªb 0xaa62
+ªc 0xaa63
+ªd 0xaa64
+ªe 0xaa65
+ªf 0xaa66
+ªg 0xaa67
+ªh 0xaa68
+ªi 0xaa69
+ªj 0xaa6a
+ªk 0xaa6b
+ªl 0xaa6c
+ªm 0xaa6d
+ªn 0xaa6e
+ªo 0xaa6f
+ªp 0xaa70
+ªq 0xaa71
+ªr 0xaa72
+ªs 0xaa73
+ªt 0xaa74
+ªu 0xaa75
+ªv 0xaa76
+ªw 0xaa77
+ªx 0xaa78
+ªy 0xaa79
+ªz 0xaa7a
+ª{ 0xaa7b
+ª| 0xaa7c
+ª} 0xaa7d
+ª~ 0xaa7e
+ª¡ 0xaaa1
+ª¢ 0xaaa2
+ª£ 0xaaa3
+ª¤ 0xaaa4
+ª¥ 0xaaa5
+ª¦ 0xaaa6
+ª§ 0xaaa7
+ª¨ 0xaaa8
+ª© 0xaaa9
+ªª 0xaaaa
+ª« 0xaaab
+ª¬ 0xaaac
+ª­ 0xaaad
+ª® 0xaaae
+ª¯ 0xaaaf
+ª° 0xaab0
+ª± 0xaab1
+ª² 0xaab2
+ª³ 0xaab3
+ª´ 0xaab4
+ªµ 0xaab5
+ª¶ 0xaab6
+ª· 0xaab7
+ª¸ 0xaab8
+ª¹ 0xaab9
+ªº 0xaaba
+ª» 0xaabb
+ª¼ 0xaabc
+ª½ 0xaabd
+ª¾ 0xaabe
+ª¿ 0xaabf
+ªÀ 0xaac0
+ªÁ 0xaac1
+ªÂ 0xaac2
+ªÃ 0xaac3
+ªÄ 0xaac4
+ªÅ 0xaac5
+ªÆ 0xaac6
+ªÇ 0xaac7
+ªÈ 0xaac8
+ªÉ 0xaac9
+ªÊ 0xaaca
+ªË 0xaacb
+ªÌ 0xaacc
+ªÍ 0xaacd
+ªÎ 0xaace
+ªÏ 0xaacf
+ªÐ 0xaad0
+ªÑ 0xaad1
+ªÒ 0xaad2
+ªÓ 0xaad3
+ªÔ 0xaad4
+ªÕ 0xaad5
+ªÖ 0xaad6
+ª× 0xaad7
+ªØ 0xaad8
+ªÙ 0xaad9
+ªÚ 0xaada
+ªÛ 0xaadb
+ªÜ 0xaadc
+ªÝ 0xaadd
+ªÞ 0xaade
+ªß 0xaadf
+ªà 0xaae0
+ªá 0xaae1
+ªâ 0xaae2
+ªã 0xaae3
+ªä 0xaae4
+ªå 0xaae5
+ªæ 0xaae6
+ªç 0xaae7
+ªè 0xaae8
+ªé 0xaae9
+ªê 0xaaea
+ªë 0xaaeb
+ªì 0xaaec
+ªí 0xaaed
+ªî 0xaaee
+ªï 0xaaef
+ªð 0xaaf0
+ªñ 0xaaf1
+ªò 0xaaf2
+ªó 0xaaf3
+ªô 0xaaf4
+ªõ 0xaaf5
+ªö 0xaaf6
+ª÷ 0xaaf7
+ªø 0xaaf8
+ªù 0xaaf9
+ªú 0xaafa
+ªû 0xaafb
+ªü 0xaafc
+ªý 0xaafd
+ªþ 0xaafe
+«@ 0xab40
+«A 0xab41
+«B 0xab42
+«C 0xab43
+«D 0xab44
+˱ 0xcbb1
+˲ 0xcbb2
+˳ 0xcbb3
+Ë´ 0xcbb4
+˵ 0xcbb5
+˶ 0xcbb6
+Ë· 0xcbb7
+˸ 0xcbb8
+˹ 0xcbb9
+˺ 0xcbba
+Ë» 0xcbbb
+˼ 0xcbbc
+˽ 0xcbbd
+˾ 0xcbbe
+Ë¿ 0xcbbf
+ËÀ 0xcbc0
+ËÁ 0xcbc1
+ËÂ 0xcbc2
+ËÃ 0xcbc3
+ËÄ 0xcbc4
+ËÅ 0xcbc5
+ËÆ 0xcbc6
+ËÇ 0xcbc7
+ËÈ 0xcbc8
+ËÉ 0xcbc9
+ËÊ 0xcbca
+ËË 0xcbcb
+ËÌ 0xcbcc
+ËÍ 0xcbcd
+ËÎ 0xcbce
+ËÏ 0xcbcf
+ËÐ 0xcbd0
+ËÑ 0xcbd1
+ËÒ 0xcbd2
+ËÓ 0xcbd3
+ËÔ 0xcbd4
+ËÕ 0xcbd5
+ËÖ 0xcbd6
+Ë× 0xcbd7
+ËØ 0xcbd8
+ËÙ 0xcbd9
+ËÚ 0xcbda
+ËÛ 0xcbdb
+ËÜ 0xcbdc
+ËÝ 0xcbdd
+ËÞ 0xcbde
+Ëß 0xcbdf
+Ëà 0xcbe0
+Ëá 0xcbe1
+Ëâ 0xcbe2
+Ëã 0xcbe3
+Ëä 0xcbe4
+Ëå 0xcbe5
+Ëæ 0xcbe6
+Ëç 0xcbe7
+Ëè 0xcbe8
+Ëé 0xcbe9
+Ëê 0xcbea
+Ëë 0xcbeb
+Ëì 0xcbec
+Ëí 0xcbed
+Ëî 0xcbee
+Ëï 0xcbef
+Ëð 0xcbf0
+Ëñ 0xcbf1
+Ëò 0xcbf2
+Ëó 0xcbf3
+Ëô 0xcbf4
+Ëõ 0xcbf5
+Ëö 0xcbf6
+Ë÷ 0xcbf7
+Ëø 0xcbf8
+Ëù 0xcbf9
+Ëú 0xcbfa
+Ëû 0xcbfb
+Ëü 0xcbfc
+Ëý 0xcbfd
+Ëþ 0xcbfe
+Ì@ 0xcc40
+ÌA 0xcc41
+ÌB 0xcc42
+ÌC 0xcc43
+ÌD 0xcc44
+ÌE 0xcc45
+ÌF 0xcc46
+ÌG 0xcc47
+ÌH 0xcc48
+ÌI 0xcc49
+ÌJ 0xcc4a
+ÌK 0xcc4b
+ÌL 0xcc4c
+ÌM 0xcc4d
+ÌN 0xcc4e
+ÌO 0xcc4f
+ÌP 0xcc50
+ÌQ 0xcc51
+ÌR 0xcc52
+ÌS 0xcc53
+ÌT 0xcc54
+ÌU 0xcc55
+ÌV 0xcc56
+ÌW 0xcc57
+ÌX 0xcc58
+ÌY 0xcc59
+ÌZ 0xcc5a
+Ì[ 0xcc5b
+Ì\ 0xcc5c
+Ì] 0xcc5d
+Ì^ 0xcc5e
+Ì_ 0xcc5f
+Ì` 0xcc60
+Ìa 0xcc61
+Ìb 0xcc62
+Ìc 0xcc63
+Ìd 0xcc64
+Ìe 0xcc65
+Ìf 0xcc66
+Ìg 0xcc67
+Ìh 0xcc68
+Ìi 0xcc69
+Ìj 0xcc6a
+Ìk 0xcc6b
+Ìl 0xcc6c
+Ìm 0xcc6d
+Ìn 0xcc6e
+Ìo 0xcc6f
+Ìp 0xcc70
+Ìq 0xcc71
+Ìr 0xcc72
+Ìs 0xcc73
+Ìt 0xcc74
+Ìu 0xcc75
+Ìv 0xcc76
+Ìw 0xcc77
+Ìx 0xcc78
+Ìy 0xcc79
+Ìz 0xcc7a
+Ì{ 0xcc7b
+Ì| 0xcc7c
+Ì} 0xcc7d
+Ì~ 0xcc7e
+Ì¡ 0xcca1
+Ì¢ 0xcca2
+Ì£ 0xcca3
+̤ 0xcca4
+Ì¥ 0xcca5
+̦ 0xcca6
+̧ 0xcca7
+̨ 0xcca8
+Ì© 0xcca9
+̪ 0xccaa
+Ì« 0xccab
+̬ 0xccac
+Ì­ 0xccad
+Ì® 0xccae
+̯ 0xccaf
+Ì° 0xccb0
+̱ 0xccb1
+̲ 0xccb2
+̳ 0xccb3
+Ì´ 0xccb4
+̵ 0xccb5
+̶ 0xccb6
+Ì· 0xccb7
+̸ 0xccb8
+̹ 0xccb9
+̺ 0xccba
+Ì» 0xccbb
+̼ 0xccbc
+̽ 0xccbd
+̾ 0xccbe
+Ì¿ 0xccbf
+ÌÀ 0xccc0
+ÌÁ 0xccc1
+ÌÂ 0xccc2
+ÌÃ 0xccc3
+ÌÄ 0xccc4
+ÌÅ 0xccc5
+ÌÆ 0xccc6
+ÌÇ 0xccc7
+ÌÈ 0xccc8
+ÌÉ 0xccc9
+ÌÊ 0xccca
+ÌË 0xcccb
+ÌÌ 0xcccc
+ÌÍ 0xcccd
+ÌÎ 0xccce
+ÌÏ 0xcccf
+ÌÐ 0xccd0
+ÌÑ 0xccd1
+ÌÒ 0xccd2
+ÌÓ 0xccd3
+ÌÔ 0xccd4
+ÌÕ 0xccd5
+ÌÖ 0xccd6
+Ì× 0xccd7
+ÌØ 0xccd8
+ÌÙ 0xccd9
+ÌÚ 0xccda
+ÌÛ 0xccdb
+ÌÜ 0xccdc
+ÌÝ 0xccdd
+ÌÞ 0xccde
+Ìß 0xccdf
+Ìà 0xcce0
+Ìá 0xcce1
+Ìâ 0xcce2
+Ìã 0xcce3
+Ìä 0xcce4
+Ìå 0xcce5
+Ìæ 0xcce6
+Ìç 0xcce7
+Ìè 0xcce8
+Ìé 0xcce9
+Ìê 0xccea
+Ìë 0xcceb
+Ìì 0xccec
+Ìí 0xcced
+Ìî 0xccee
+Ìï 0xccef
+Ìð 0xccf0
+Ìñ 0xccf1
+Ìò 0xccf2
+Ìó 0xccf3
+Ìô 0xccf4
+Ìõ 0xccf5
+Ìö 0xccf6
+Ì÷ 0xccf7
+Ìø 0xccf8
+Ìù 0xccf9
+Ìú 0xccfa
+Ìû 0xccfb
+Ìü 0xccfc
+Ìý 0xccfd
+Ìþ 0xccfe
+Í@ 0xcd40
+ÍA 0xcd41
+ÍB 0xcd42
+ÍC 0xcd43
+ÍD 0xcd44
+ÍE 0xcd45
+ÍF 0xcd46
+ÍG 0xcd47
+ÍH 0xcd48
+ÍI 0xcd49
+ÍJ 0xcd4a
+ÍK 0xcd4b
+ÍL 0xcd4c
+ÍM 0xcd4d
+ÍN 0xcd4e
+ÍO 0xcd4f
+ÍP 0xcd50
+ÍQ 0xcd51
+ÍR 0xcd52
+ÍS 0xcd53
+ÍT 0xcd54
+ÍU 0xcd55
+ÍV 0xcd56
+ÍW 0xcd57
+ÍX 0xcd58
+ÍY 0xcd59
+ÍZ 0xcd5a
+Í[ 0xcd5b
+Í\ 0xcd5c
+Í] 0xcd5d
+Í^ 0xcd5e
+Í_ 0xcd5f
+Í` 0xcd60
+Ía 0xcd61
+Íb 0xcd62
+Íc 0xcd63
+Íd 0xcd64
+Íe 0xcd65
+Íf 0xcd66
+Íg 0xcd67
+Íh 0xcd68
+Íi 0xcd69
+Íj 0xcd6a
+Ík 0xcd6b
+Íl 0xcd6c
+Ím 0xcd6d
+Ín 0xcd6e
+Ío 0xcd6f
+Íp 0xcd70
+Íq 0xcd71
+Ír 0xcd72
+Ís 0xcd73
+Ít 0xcd74
+Íu 0xcd75
+Ív 0xcd76
+Íw 0xcd77
+Íx 0xcd78
+Íy 0xcd79
+Íz 0xcd7a
+Í{ 0xcd7b
+Í| 0xcd7c
+Í} 0xcd7d
+Í~ 0xcd7e
+Í¡ 0xcda1
+Í¢ 0xcda2
+Í£ 0xcda3
+ͤ 0xcda4
+Í¥ 0xcda5
+ͦ 0xcda6
+ͧ 0xcda7
+ͨ 0xcda8
+Í© 0xcda9
+ͪ 0xcdaa
+Í« 0xcdab
+ͬ 0xcdac
+Í­ 0xcdad
+Í® 0xcdae
+ͯ 0xcdaf
+Í° 0xcdb0
+ͱ 0xcdb1
+Ͳ 0xcdb2
+ͳ 0xcdb3
+Í´ 0xcdb4
+͵ 0xcdb5
+Ͷ 0xcdb6
+Í· 0xcdb7
+͸ 0xcdb8
+͹ 0xcdb9
+ͺ 0xcdba
+Í» 0xcdbb
+ͼ 0xcdbc
+ͽ 0xcdbd
+; 0xcdbe
+Í¿ 0xcdbf
+ÍÀ 0xcdc0
+ÍÁ 0xcdc1
+ÍÂ 0xcdc2
+ÍÃ 0xcdc3
+ÍÄ 0xcdc4
+ÍÅ 0xcdc5
+ÍÆ 0xcdc6
+ÍÇ 0xcdc7
+ÍÈ 0xcdc8
+ÍÉ 0xcdc9
+ÍÊ 0xcdca
+ÍË 0xcdcb
+ÍÌ 0xcdcc
+ÍÍ 0xcdcd
+ÍÎ 0xcdce
+ÍÏ 0xcdcf
+ÍÐ 0xcdd0
+ÍÑ 0xcdd1
+ÍÒ 0xcdd2
+ÍÓ 0xcdd3
+ÍÔ 0xcdd4
+ÍÕ 0xcdd5
+ÍÖ 0xcdd6
+Í× 0xcdd7
+ÍØ 0xcdd8
+ÍÙ 0xcdd9
+ÍÚ 0xcdda
+ÍÛ 0xcddb
+ÍÜ 0xcddc
+«E 0xab45
+«F 0xab46
+«G 0xab47
+«H 0xab48
+«I 0xab49
+«J 0xab4a
+«K 0xab4b
+«L 0xab4c
+«M 0xab4d
+«N 0xab4e
+«O 0xab4f
+«P 0xab50
+«Q 0xab51
+«R 0xab52
+«S 0xab53
+«T 0xab54
+«U 0xab55
+«V 0xab56
+«W 0xab57
+«X 0xab58
+«Y 0xab59
+«Z 0xab5a
+«[ 0xab5b
+«\ 0xab5c
+«] 0xab5d
+«^ 0xab5e
+«_ 0xab5f
+«` 0xab60
+«a 0xab61
+«b 0xab62
+«c 0xab63
+«d 0xab64
+«e 0xab65
+«f 0xab66
+«g 0xab67
+«h 0xab68
+«i 0xab69
+«j 0xab6a
+«k 0xab6b
+«l 0xab6c
+«m 0xab6d
+«n 0xab6e
+«o 0xab6f
+«p 0xab70
+«q 0xab71
+«r 0xab72
+«s 0xab73
+«t 0xab74
+«u 0xab75
+«v 0xab76
+«w 0xab77
+«x 0xab78
+«y 0xab79
+«z 0xab7a
+«{ 0xab7b
+«| 0xab7c
+«} 0xab7d
+«~ 0xab7e
+«¡ 0xaba1
+«¢ 0xaba2
+«£ 0xaba3
+«¤ 0xaba4
+«¥ 0xaba5
+«¦ 0xaba6
+Ǥ 0xaba7
+Ǭ 0xaba8
+«© 0xaba9
+ǻ 0xabaa
+«« 0xabab
+«¬ 0xabac
+«­ 0xabad
+«® 0xabae
+«¯ 0xabaf
+«° 0xabb0
+«± 0xabb1
+«² 0xabb2
+«³ 0xabb3
+«´ 0xabb4
+«µ 0xabb5
+Ǧ 0xabb6
+«· 0xabb7
+«¸ 0xabb8
+«¹ 0xabb9
+Ǽ 0xabba
+«» 0xabbb
+«¼ 0xabbc
+«½ 0xabbd
+«¾ 0xabbe
+«¿ 0xabbf
+«À 0xabc0
+«Á 0xabc1
+«Â 0xabc2
+«Ã 0xabc3
+«Ä 0xabc4
+«Å 0xabc5
+«Æ 0xabc6
+«Ç 0xabc7
+«È 0xabc8
+«É 0xabc9
+«Ê 0xabca
+«Ë 0xabcb
+«Ì 0xabcc
+«Í 0xabcd
+«Î 0xabce
+«Ï 0xabcf
+«Ð 0xabd0
+«Ñ 0xabd1
+«Ò 0xabd2
+«Ó 0xabd3
+«Ô 0xabd4
+«Õ 0xabd5
+«Ö 0xabd6
+«× 0xabd7
+«Ø 0xabd8
+«Ù 0xabd9
+«Ú 0xabda
+«Û 0xabdb
+«Ü 0xabdc
+«Ý 0xabdd
+«Þ 0xabde
+«ß 0xabdf
+«à 0xabe0
+«á 0xabe1
+«â 0xabe2
+«ã 0xabe3
+«ä 0xabe4
+«å 0xabe5
+«æ 0xabe6
+«ç 0xabe7
+«è 0xabe8
+«é 0xabe9
+«ê 0xabea
+«ë 0xabeb
+«ì 0xabec
+«í 0xabed
+«î 0xabee
+«ï 0xabef
+«ð 0xabf0
+«ñ 0xabf1
+«ò 0xabf2
+«ó 0xabf3
+«ô 0xabf4
+«õ 0xabf5
+«ö 0xabf6
+«÷ 0xabf7
+«ø 0xabf8
+«ù 0xabf9
+«ú 0xabfa
+«û 0xabfb
+«ü 0xabfc
+«ý 0xabfd
+«þ 0xabfe
+¬@ 0xac40
+¬A 0xac41
+¬B 0xac42
+¬C 0xac43
+¬D 0xac44
+¬E 0xac45
+¬F 0xac46
+¬G 0xac47
+¬H 0xac48
+¬I 0xac49
+¬J 0xac4a
+¬K 0xac4b
+¬L 0xac4c
+¬M 0xac4d
+¬N 0xac4e
+¬O 0xac4f
+¬P 0xac50
+¬Q 0xac51
+¬R 0xac52
+¬S 0xac53
+¬T 0xac54
+¬U 0xac55
+¬V 0xac56
+¬W 0xac57
+¬X 0xac58
+¬Y 0xac59
+¬Z 0xac5a
+¬[ 0xac5b
+¬\ 0xac5c
+¬] 0xac5d
+¬^ 0xac5e
+¬_ 0xac5f
+¬` 0xac60
+¬a 0xac61
+¬b 0xac62
+¬c 0xac63
+¬d 0xac64
+¬e 0xac65
+¬f 0xac66
+¬g 0xac67
+¬h 0xac68
+¬i 0xac69
+¬j 0xac6a
+¬k 0xac6b
+¬l 0xac6c
+¬m 0xac6d
+¬n 0xac6e
+¬o 0xac6f
+¬p 0xac70
+¬q 0xac71
+¬r 0xac72
+¬s 0xac73
+¬t 0xac74
+¬u 0xac75
+¬v 0xac76
+¬w 0xac77
+¬x 0xac78
+¬y 0xac79
+¬z 0xac7a
+¬{ 0xac7b
+¬| 0xac7c
+¬} 0xac7d
+¬~ 0xac7e
+¬¡ 0xaca1
+¢ 0xaca2
+£ 0xaca3
+¬¤ 0xaca4
+´ 0xaca5
+¬¦ 0xaca6
+¤ 0xaca7
+¬ 0xaca8
+© 0xaca9
+» 0xacaa
+¬« 0xacab
+¬¬ 0xacac
+¬­ 0xacad
+¨ 0xacae
+¬¯ 0xacaf
+¬° 0xacb0
+± 0xacb1
+¬² 0xacb2
+¬³ 0xacb3
+¬´ 0xacb4
+µ 0xacb5
+¦ 0xacb6
+¬· 0xacb7
+¬¸ 0xacb8
+¬¹ 0xacb9
+¼ 0xacba
+¬» 0xacbb
+¬¼ 0xacbc
+¬½ 0xacbd
+¬¾ 0xacbe
+¬¿ 0xacbf
+¬À 0xacc0
+¬Á 0xacc1
+¬Â 0xacc2
+¬Ã 0xacc3
+€ 0xacc4
+ 0xacc5
+® 0xacc6
+‚ 0xacc7
+¬È 0xacc8
+ƒ 0xacc9
+¬Ê 0xacca
+¬Ë 0xaccb
+¬Ì 0xaccc
+¬Í 0xaccd
+¬Î 0xacce
+¬Ï 0xaccf
+¬Ð 0xacd0
+„ 0xacd1
+¬Ò 0xacd2
+¬Ó 0xacd3
+¬Ô 0xacd4
+¬Õ 0xacd5
+¬Ö 0xacd6
+¬× 0xacd7
+¯ 0xacd8
+¬Ù 0xacd9
+¬Ú 0xacda
+¬Û 0xacdb
+† 0xacdc
+¬Ý 0xacdd
+¬Þ 0xacde
+§ 0xacdf
+ˆ 0xace0
+‡ 0xace1
+‰ 0xace2
+‹ 0xace3
+Š 0xace4
+Π0xace5
+¾ 0xace6
+ 0xace7
+ 0xace8
+Ž 0xace9
+ 0xacea
+‘ 0xaceb
+“ 0xacec
+’ 0xaced
+” 0xacee
+• 0xacef
+¬ð 0xacf0
+– 0xacf1
+¬ò 0xacf2
+¬ó 0xacf3
+¬ô 0xacf4
+¬õ 0xacf5
+¬ö 0xacf6
+¬÷ 0xacf7
+¬ø 0xacf8
+¬ù 0xacf9
+¬ú 0xacfa
+¬û 0xacfb
+Ÿ 0xacfc
+¬ý 0xacfd
+¬þ 0xacfe
+­@ 0xad40
+­A 0xad41
+­B 0xad42
+­C 0xad43
+­D 0xad44
+­E 0xad45
+­F 0xad46
+­G 0xad47
+­H 0xad48
+­I 0xad49
+­J 0xad4a
+­K 0xad4b
+­L 0xad4c
+­M 0xad4d
+­N 0xad4e
+­O 0xad4f
+­P 0xad50
+­Q 0xad51
+­R 0xad52
+­S 0xad53
+­T 0xad54
+­U 0xad55
+­V 0xad56
+­W 0xad57
+­X 0xad58
+­Y 0xad59
+­Z 0xad5a
+­[ 0xad5b
+­\ 0xad5c
+­] 0xad5d
+­^ 0xad5e
+­_ 0xad5f
+­` 0xad60
+­a 0xad61
+­b 0xad62
+­c 0xad63
+­d 0xad64
+­e 0xad65
+­f 0xad66
+­g 0xad67
+­h 0xad68
+­i 0xad69
+­j 0xad6a
+­k 0xad6b
+­l 0xad6c
+­m 0xad6d
+­n 0xad6e
+­o 0xad6f
+­p 0xad70
+­q 0xad71
+­r 0xad72
+­s 0xad73
+­t 0xad74
+­u 0xad75
+­v 0xad76
+­w 0xad77
+­x 0xad78
+­y 0xad79
+­z 0xad7a
+­{ 0xad7b
+­| 0xad7c
+­} 0xad7d
+­~ 0xad7e
+­¡ 0xada1
+­¢ 0xada2
+­£ 0xada3
+­¤ 0xada4
+­¥ 0xada5
+­¦ 0xada6
+­§ 0xada7
+­¨ 0xada8
+­© 0xada9
+­ª 0xadaa
+­« 0xadab
+­¬ 0xadac
+­­ 0xadad
+­® 0xadae
+­¯ 0xadaf
+­° 0xadb0
+­± 0xadb1
+­² 0xadb2
+­³ 0xadb3
+­´ 0xadb4
+­µ 0xadb5
+­¶ 0xadb6
+­· 0xadb7
+­¸ 0xadb8
+­¹ 0xadb9
+­º 0xadba
+­» 0xadbb
+ÍÝ 0xcddd
+ÍÞ 0xcdde
+Íß 0xcddf
+Íà 0xcde0
+Íá 0xcde1
+Íâ 0xcde2
+Íã 0xcde3
+Íä 0xcde4
+Íå 0xcde5
+Íæ 0xcde6
+Íç 0xcde7
+Íè 0xcde8
+Íé 0xcde9
+Íê 0xcdea
+Íë 0xcdeb
+Íì 0xcdec
+Íí 0xcded
+Íî 0xcdee
+Íï 0xcdef
+Íð 0xcdf0
+Íñ 0xcdf1
+Íò 0xcdf2
+Íó 0xcdf3
+Íô 0xcdf4
+Íõ 0xcdf5
+Íö 0xcdf6
+Í÷ 0xcdf7
+Íø 0xcdf8
+Íù 0xcdf9
+Íú 0xcdfa
+Íû 0xcdfb
+Íü 0xcdfc
+Íý 0xcdfd
+Íþ 0xcdfe
+Î@ 0xce40
+ÎA 0xce41
+ÎB 0xce42
+ÎC 0xce43
+ÎD 0xce44
+ÎE 0xce45
+ÎF 0xce46
+ÎG 0xce47
+ÎH 0xce48
+ÎI 0xce49
+ÎJ 0xce4a
+ÎK 0xce4b
+ÎL 0xce4c
+ÎM 0xce4d
+ÎN 0xce4e
+ÎO 0xce4f
+ÎP 0xce50
+ÎQ 0xce51
+ÎR 0xce52
+ÎS 0xce53
+ÎT 0xce54
+ÎU 0xce55
+ÎV 0xce56
+ÎW 0xce57
+ÎX 0xce58
+ÎY 0xce59
+ÎZ 0xce5a
+Î[ 0xce5b
+Î\ 0xce5c
+Î] 0xce5d
+Î^ 0xce5e
+Î_ 0xce5f
+Î` 0xce60
+Îa 0xce61
+Îb 0xce62
+Îc 0xce63
+Îd 0xce64
+Îe 0xce65
+Îf 0xce66
+Îg 0xce67
+Îh 0xce68
+Îi 0xce69
+Îj 0xce6a
+Îk 0xce6b
+Îl 0xce6c
+Îm 0xce6d
+În 0xce6e
+Îo 0xce6f
+Îp 0xce70
+Îq 0xce71
+Îr 0xce72
+Îs 0xce73
+Ît 0xce74
+Îu 0xce75
+Îv 0xce76
+Îw 0xce77
+Îx 0xce78
+Îy 0xce79
+Îz 0xce7a
+Î{ 0xce7b
+Î| 0xce7c
+Î} 0xce7d
+Î~ 0xce7e
+Ρ 0xcea1
+΢ 0xcea2
+Σ 0xcea3
+Τ 0xcea4
+Î¥ 0xcea5
+Φ 0xcea6
+Χ 0xcea7
+Ψ 0xcea8
+Ω 0xcea9
+Ϊ 0xceaa
+Ϋ 0xceab
+ά 0xceac
+έ 0xcead
+ή 0xceae
+ί 0xceaf
+ΰ 0xceb0
+α 0xceb1
+β 0xceb2
+γ 0xceb3
+δ 0xceb4
+ε 0xceb5
+ζ 0xceb6
+η 0xceb7
+θ 0xceb8
+ι 0xceb9
+κ 0xceba
+λ 0xcebb
+μ 0xcebc
+ν 0xcebd
+ξ 0xcebe
+ο 0xcebf
+ÎÀ 0xcec0
+ÎÁ 0xcec1
+ÎÂ 0xcec2
+ÎÃ 0xcec3
+ÎÄ 0xcec4
+ÎÅ 0xcec5
+ÎÆ 0xcec6
+ÎÇ 0xcec7
+ÎÈ 0xcec8
+ÎÉ 0xcec9
+ÎÊ 0xceca
+ÎË 0xcecb
+ÎÌ 0xcecc
+ÎÍ 0xcecd
+ÎÎ 0xcece
+ÎÏ 0xcecf
+ÎÐ 0xced0
+ÎÑ 0xced1
+ÎÒ 0xced2
+ÎÓ 0xced3
+ÎÔ 0xced4
+ÎÕ 0xced5
+ÎÖ 0xced6
+Î× 0xced7
+ÎØ 0xced8
+ÎÙ 0xced9
+ÎÚ 0xceda
+ÎÛ 0xcedb
+ÎÜ 0xcedc
+ÎÝ 0xcedd
+ÎÞ 0xcede
+Îß 0xcedf
+Îà 0xcee0
+Îá 0xcee1
+Îâ 0xcee2
+Îã 0xcee3
+Îä 0xcee4
+Îå 0xcee5
+Îæ 0xcee6
+Îç 0xcee7
+Îè 0xcee8
+Îé 0xcee9
+Îê 0xceea
+Îë 0xceeb
+Îì 0xceec
+Îí 0xceed
+Îî 0xceee
+Îï 0xceef
+Îð 0xcef0
+Îñ 0xcef1
+Îò 0xcef2
+Îó 0xcef3
+Îô 0xcef4
+Îõ 0xcef5
+Îö 0xcef6
+Î÷ 0xcef7
+Îø 0xcef8
+Îù 0xcef9
+Îú 0xcefa
+Îû 0xcefb
+Îü 0xcefc
+Îý 0xcefd
+Îþ 0xcefe
+Ï@ 0xcf40
+ÏA 0xcf41
+ÏB 0xcf42
+ÏC 0xcf43
+ÏD 0xcf44
+ÏE 0xcf45
+ÏF 0xcf46
+ÏG 0xcf47
+ÏH 0xcf48
+ÏI 0xcf49
+ÏJ 0xcf4a
+ÏK 0xcf4b
+ÏL 0xcf4c
+ÏM 0xcf4d
+ÏN 0xcf4e
+ÏO 0xcf4f
+ÏP 0xcf50
+ÏQ 0xcf51
+ÏR 0xcf52
+ÏS 0xcf53
+ÏT 0xcf54
+ÏU 0xcf55
+ÏV 0xcf56
+ÏW 0xcf57
+ÏX 0xcf58
+ÏY 0xcf59
+ÏZ 0xcf5a
+Ï[ 0xcf5b
+Ï\ 0xcf5c
+Ï] 0xcf5d
+Ï^ 0xcf5e
+Ï_ 0xcf5f
+Ï` 0xcf60
+Ïa 0xcf61
+Ïb 0xcf62
+Ïc 0xcf63
+Ïd 0xcf64
+Ïe 0xcf65
+Ïf 0xcf66
+Ïg 0xcf67
+Ïh 0xcf68
+Ïi 0xcf69
+Ïj 0xcf6a
+Ïk 0xcf6b
+Ïl 0xcf6c
+Ïm 0xcf6d
+Ïn 0xcf6e
+Ïo 0xcf6f
+Ïp 0xcf70
+Ïq 0xcf71
+Ïr 0xcf72
+Ïs 0xcf73
+Ït 0xcf74
+Ïu 0xcf75
+Ïv 0xcf76
+Ïw 0xcf77
+Ïx 0xcf78
+Ïy 0xcf79
+Ïz 0xcf7a
+Ï{ 0xcf7b
+Ï| 0xcf7c
+Ï} 0xcf7d
+Ï~ 0xcf7e
+Ï¡ 0xcfa1
+Ï¢ 0xcfa2
+Ï£ 0xcfa3
+Ϥ 0xcfa4
+Ï¥ 0xcfa5
+Ϧ 0xcfa6
+ϧ 0xcfa7
+Ϩ 0xcfa8
+Ï© 0xcfa9
+Ϫ 0xcfaa
+Ï« 0xcfab
+Ϭ 0xcfac
+Ï­ 0xcfad
+Ï® 0xcfae
+ϯ 0xcfaf
+Ï° 0xcfb0
+ϱ 0xcfb1
+ϲ 0xcfb2
+ϳ 0xcfb3
+Ï´ 0xcfb4
+ϵ 0xcfb5
+϶ 0xcfb6
+Ï· 0xcfb7
+ϸ 0xcfb8
+Ϲ 0xcfb9
+Ϻ 0xcfba
+Ï» 0xcfbb
+ϼ 0xcfbc
+Ͻ 0xcfbd
+Ͼ 0xcfbe
+Ï¿ 0xcfbf
+ÏÀ 0xcfc0
+ÏÁ 0xcfc1
+ÏÂ 0xcfc2
+ÏÃ 0xcfc3
+ÏÄ 0xcfc4
+ÏÅ 0xcfc5
+ÏÆ 0xcfc6
+ÏÇ 0xcfc7
+ÏÈ 0xcfc8
+ÏÉ 0xcfc9
+ÏÊ 0xcfca
+ÏË 0xcfcb
+ÏÌ 0xcfcc
+ÏÍ 0xcfcd
+ÏÎ 0xcfce
+ÏÏ 0xcfcf
+ÏÐ 0xcfd0
+ÏÑ 0xcfd1
+ÏÒ 0xcfd2
+ÏÓ 0xcfd3
+ÏÔ 0xcfd4
+ÏÕ 0xcfd5
+ÏÖ 0xcfd6
+Ï× 0xcfd7
+ÏØ 0xcfd8
+ÏÙ 0xcfd9
+ÏÚ 0xcfda
+ÏÛ 0xcfdb
+ÏÜ 0xcfdc
+ÏÝ 0xcfdd
+ÏÞ 0xcfde
+Ïß 0xcfdf
+Ïà 0xcfe0
+Ïá 0xcfe1
+Ïâ 0xcfe2
+Ïã 0xcfe3
+Ïä 0xcfe4
+Ïå 0xcfe5
+Ïæ 0xcfe6
+Ïç 0xcfe7
+Ïè 0xcfe8
+Ïé 0xcfe9
+Ïê 0xcfea
+Ïë 0xcfeb
+Ïì 0xcfec
+Ïí 0xcfed
+Ïî 0xcfee
+Ïï 0xcfef
+Ïð 0xcff0
+Ïñ 0xcff1
+Ïò 0xcff2
+Ïó 0xcff3
+Ïô 0xcff4
+Ïõ 0xcff5
+Ïö 0xcff6
+Ï÷ 0xcff7
+Ïø 0xcff8
+Ïù 0xcff9
+Ïú 0xcffa
+Ïû 0xcffb
+Ïü 0xcffc
+Ïý 0xcffd
+Ïþ 0xcffe
+Ð@ 0xd040
+ÐA 0xd041
+ÐB 0xd042
+ÐC 0xd043
+ÐD 0xd044
+ÐE 0xd045
+ÐF 0xd046
+ÐG 0xd047
+ÐH 0xd048
+ÐI 0xd049
+ÐJ 0xd04a
+ÐK 0xd04b
+ÐL 0xd04c
+ÐM 0xd04d
+ÐN 0xd04e
+ÐO 0xd04f
+ÐP 0xd050
+ÐQ 0xd051
+ÐR 0xd052
+ÐS 0xd053
+ÐT 0xd054
+ÐU 0xd055
+ÐV 0xd056
+ÐW 0xd057
+ÐX 0xd058
+ÐY 0xd059
+ÐZ 0xd05a
+Ð[ 0xd05b
+Ð\ 0xd05c
+Ð] 0xd05d
+Ð^ 0xd05e
+Ð_ 0xd05f
+Ð` 0xd060
+Ða 0xd061
+Ðb 0xd062
+Ðc 0xd063
+Ðd 0xd064
+Ðe 0xd065
+Ðf 0xd066
+Ðg 0xd067
+Ðh 0xd068
+Ði 0xd069
+Ðj 0xd06a
+Ðk 0xd06b
+Ðl 0xd06c
+Ðm 0xd06d
+Ðn 0xd06e
+Ðo 0xd06f
+Ðp 0xd070
+Ðq 0xd071
+Ðr 0xd072
+Ðs 0xd073
+Ðt 0xd074
+Ðu 0xd075
+Ðv 0xd076
+Ðw 0xd077
+Ðx 0xd078
+Ðy 0xd079
+Ðz 0xd07a
+Ð{ 0xd07b
+Ð| 0xd07c
+Ð} 0xd07d
+Ð~ 0xd07e
+С 0xd0a1
+Т 0xd0a2
+У 0xd0a3
+Ф 0xd0a4
+Ð¥ 0xd0a5
+Ц 0xd0a6
+Ч 0xd0a7
+Ш 0xd0a8
+Щ 0xd0a9
+Ъ 0xd0aa
+Ы 0xd0ab
+Ь 0xd0ac
+Э 0xd0ad
+Ю 0xd0ae
+Я 0xd0af
+а 0xd0b0
+б 0xd0b1
+в 0xd0b2
+г 0xd0b3
+д 0xd0b4
+е 0xd0b5
+ж 0xd0b6
+з 0xd0b7
+и 0xd0b8
+й 0xd0b9
+к 0xd0ba
+л 0xd0bb
+м 0xd0bc
+н 0xd0bd
+о 0xd0be
+п 0xd0bf
+ÐÀ 0xd0c0
+ÐÁ 0xd0c1
+ÐÂ 0xd0c2
+ÐÃ 0xd0c3
+ÐÄ 0xd0c4
+ÐÅ 0xd0c5
+ÐÆ 0xd0c6
+ÐÇ 0xd0c7
+­¼ 0xadbc
+­½ 0xadbd
+­¾ 0xadbe
+­¿ 0xadbf
+­À 0xadc0
+­Á 0xadc1
+­Â 0xadc2
+­Ã 0xadc3
+­Ä 0xadc4
+­Å 0xadc5
+­Æ 0xadc6
+­Ç 0xadc7
+­È 0xadc8
+­É 0xadc9
+­Ê 0xadca
+­Ë 0xadcb
+­Ì 0xadcc
+­Í 0xadcd
+­Î 0xadce
+­Ï 0xadcf
+­Ð 0xadd0
+­Ñ 0xadd1
+­Ò 0xadd2
+­Ó 0xadd3
+­Ô 0xadd4
+­Õ 0xadd5
+­Ö 0xadd6
+­× 0xadd7
+­Ø 0xadd8
+­Ù 0xadd9
+­Ú 0xadda
+­Û 0xaddb
+­Ü 0xaddc
+­Ý 0xaddd
+­Þ 0xadde
+­ß 0xaddf
+­à 0xade0
+­á 0xade1
+­â 0xade2
+­ã 0xade3
+­ä 0xade4
+­å 0xade5
+­æ 0xade6
+­ç 0xade7
+­è 0xade8
+­é 0xade9
+­ê 0xadea
+­ë 0xadeb
+­ì 0xadec
+­í 0xaded
+­î 0xadee
+­ï 0xadef
+­ð 0xadf0
+­ñ 0xadf1
+­ò 0xadf2
+­ó 0xadf3
+­ô 0xadf4
+­õ 0xadf5
+­ö 0xadf6
+­÷ 0xadf7
+­ø 0xadf8
+­ù 0xadf9
+­ú 0xadfa
+­û 0xadfb
+­ü 0xadfc
+­ý 0xadfd
+­þ 0xadfe
+®@ 0xae40
+®A 0xae41
+®B 0xae42
+®C 0xae43
+®D 0xae44
+®E 0xae45
+®F 0xae46
+®G 0xae47
+®H 0xae48
+®I 0xae49
+®J 0xae4a
+®K 0xae4b
+®L 0xae4c
+®M 0xae4d
+®N 0xae4e
+®O 0xae4f
+®P 0xae50
+®Q 0xae51
+®R 0xae52
+®S 0xae53
+®T 0xae54
+®U 0xae55
+®V 0xae56
+®W 0xae57
+®X 0xae58
+®Y 0xae59
+®Z 0xae5a
+®[ 0xae5b
+®\ 0xae5c
+®] 0xae5d
+®^ 0xae5e
+®_ 0xae5f
+®` 0xae60
+®a 0xae61
+®b 0xae62
+®c 0xae63
+®d 0xae64
+®e 0xae65
+®f 0xae66
+®g 0xae67
+®h 0xae68
+®i 0xae69
+®j 0xae6a
+®k 0xae6b
+®l 0xae6c
+®m 0xae6d
+®n 0xae6e
+®o 0xae6f
+®p 0xae70
+®q 0xae71
+®r 0xae72
+®s 0xae73
+®t 0xae74
+®u 0xae75
+®v 0xae76
+®w 0xae77
+®x 0xae78
+®y 0xae79
+®z 0xae7a
+®{ 0xae7b
+®| 0xae7c
+®} 0xae7d
+®~ 0xae7e
+®¡ 0xaea1
+®¢ 0xaea2
+®£ 0xaea3
+®¤ 0xaea4
+®¥ 0xaea5
+®¦ 0xaea6
+®§ 0xaea7
+®¨ 0xaea8
+®© 0xaea9
+®ª 0xaeaa
+®« 0xaeab
+®¬ 0xaeac
+®­ 0xaead
+®® 0xaeae
+®¯ 0xaeaf
+®° 0xaeb0
+®± 0xaeb1
+®² 0xaeb2
+®³ 0xaeb3
+®´ 0xaeb4
+®µ 0xaeb5
+®¶ 0xaeb6
+®· 0xaeb7
+®¸ 0xaeb8
+®¹ 0xaeb9
+®º 0xaeba
+®» 0xaebb
+®¼ 0xaebc
+®½ 0xaebd
+®¾ 0xaebe
+®¿ 0xaebf
+®À 0xaec0
+®Á 0xaec1
+®Â 0xaec2
+®Ã 0xaec3
+®Ä 0xaec4
+®Å 0xaec5
+®Æ 0xaec6
+®Ç 0xaec7
+®È 0xaec8
+®É 0xaec9
+®Ê 0xaeca
+®Ë 0xaecb
+®Ì 0xaecc
+®Í 0xaecd
+®Î 0xaece
+®Ï 0xaecf
+®Ð 0xaed0
+®Ñ 0xaed1
+®Ò 0xaed2
+®Ó 0xaed3
+®Ô 0xaed4
+®Õ 0xaed5
+®Ö 0xaed6
+®× 0xaed7
+®Ø 0xaed8
+®Ù 0xaed9
+®Ú 0xaeda
+®Û 0xaedb
+®Ü 0xaedc
+®Ý 0xaedd
+®Þ 0xaede
+®ß 0xaedf
+®à 0xaee0
+®á 0xaee1
+®â 0xaee2
+®ã 0xaee3
+®ä 0xaee4
+®å 0xaee5
+®æ 0xaee6
+®ç 0xaee7
+®è 0xaee8
+®é 0xaee9
+®ê 0xaeea
+®ë 0xaeeb
+®ì 0xaeec
+®í 0xaeed
+®î 0xaeee
+®ï 0xaeef
+®ð 0xaef0
+®ñ 0xaef1
+®ò 0xaef2
+®ó 0xaef3
+®ô 0xaef4
+®õ 0xaef5
+®ö 0xaef6
+®÷ 0xaef7
+®ø 0xaef8
+®ù 0xaef9
+®ú 0xaefa
+®û 0xaefb
+®ü 0xaefc
+®ý 0xaefd
+®þ 0xaefe
+¯@ 0xaf40
+¯A 0xaf41
+¯B 0xaf42
+¯C 0xaf43
+¯D 0xaf44
+¯E 0xaf45
+¯F 0xaf46
+¯G 0xaf47
+¯H 0xaf48
+¯I 0xaf49
+¯J 0xaf4a
+¯K 0xaf4b
+¯L 0xaf4c
+¯M 0xaf4d
+¯N 0xaf4e
+¯O 0xaf4f
+¯P 0xaf50
+¯Q 0xaf51
+¯R 0xaf52
+¯S 0xaf53
+¯T 0xaf54
+¯U 0xaf55
+¯V 0xaf56
+¯W 0xaf57
+¯X 0xaf58
+¯Y 0xaf59
+¯Z 0xaf5a
+¯[ 0xaf5b
+¯\ 0xaf5c
+¯] 0xaf5d
+¯^ 0xaf5e
+¯_ 0xaf5f
+¯` 0xaf60
+¯a 0xaf61
+¯b 0xaf62
+¯c 0xaf63
+¯d 0xaf64
+¯e 0xaf65
+¯f 0xaf66
+¯g 0xaf67
+¯h 0xaf68
+¯i 0xaf69
+¯j 0xaf6a
+¯k 0xaf6b
+¯l 0xaf6c
+¯m 0xaf6d
+¯n 0xaf6e
+¯o 0xaf6f
+¯p 0xaf70
+¯q 0xaf71
+¯r 0xaf72
+¯s 0xaf73
+¯t 0xaf74
+¯u 0xaf75
+¯v 0xaf76
+¯w 0xaf77
+¯x 0xaf78
+¯y 0xaf79
+¯z 0xaf7a
+¯{ 0xaf7b
+¯| 0xaf7c
+¯} 0xaf7d
+¯~ 0xaf7e
+¯¡ 0xafa1
+¯¢ 0xafa2
+¯£ 0xafa3
+¯¤ 0xafa4
+¯¥ 0xafa5
+¯¦ 0xafa6
+¯§ 0xafa7
+¯¨ 0xafa8
+¯© 0xafa9
+¯ª 0xafaa
+¯« 0xafab
+¯¬ 0xafac
+¯­ 0xafad
+¯® 0xafae
+¯¯ 0xafaf
+¯° 0xafb0
+¯± 0xafb1
+¯² 0xafb2
+¯³ 0xafb3
+¯´ 0xafb4
+¯µ 0xafb5
+¯¶ 0xafb6
+¯· 0xafb7
+¯¸ 0xafb8
+¯¹ 0xafb9
+¯º 0xafba
+¯» 0xafbb
+¯¼ 0xafbc
+¯½ 0xafbd
+¯¾ 0xafbe
+¯¿ 0xafbf
+¯À 0xafc0
+¯Á 0xafc1
+¯Â 0xafc2
+¯Ã 0xafc3
+¯Ä 0xafc4
+¯Å 0xafc5
+¯Æ 0xafc6
+¯Ç 0xafc7
+¯È 0xafc8
+¯É 0xafc9
+¯Ê 0xafca
+¯Ë 0xafcb
+¯Ì 0xafcc
+¯Í 0xafcd
+¯Î 0xafce
+¯Ï 0xafcf
+¯Ð 0xafd0
+¯Ñ 0xafd1
+¯Ò 0xafd2
+¯Ó 0xafd3
+¯Ô 0xafd4
+¯Õ 0xafd5
+¯Ö 0xafd6
+¯× 0xafd7
+¯Ø 0xafd8
+¯Ù 0xafd9
+¯Ú 0xafda
+¯Û 0xafdb
+¯Ü 0xafdc
+¯Ý 0xafdd
+¯Þ 0xafde
+¯ß 0xafdf
+¯à 0xafe0
+¯á 0xafe1
+¯â 0xafe2
+¯ã 0xafe3
+¯ä 0xafe4
+¯å 0xafe5
+¯æ 0xafe6
+¯ç 0xafe7
+¯è 0xafe8
+¯é 0xafe9
+¯ê 0xafea
+¯ë 0xafeb
+¯ì 0xafec
+¯í 0xafed
+¯î 0xafee
+¯ï 0xafef
+¯ð 0xaff0
+¯ñ 0xaff1
+¯ò 0xaff2
+¯ó 0xaff3
+¯ô 0xaff4
+¯õ 0xaff5
+¯ö 0xaff6
+¯÷ 0xaff7
+¯ø 0xaff8
+¯ù 0xaff9
+¯ú 0xaffa
+¯û 0xaffb
+¯ü 0xaffc
+¯ý 0xaffd
+¯þ 0xaffe
+°@ 0xb040
+°A 0xb041
+°B 0xb042
+°C 0xb043
+°D 0xb044
+°E 0xb045
+°F 0xb046
+°G 0xb047
+°H 0xb048
+°I 0xb049
+°J 0xb04a
+°K 0xb04b
+°L 0xb04c
+°M 0xb04d
+°N 0xb04e
+°O 0xb04f
+°P 0xb050
+°Q 0xb051
+°R 0xb052
+°S 0xb053
+°T 0xb054
+°U 0xb055
+°V 0xb056
+°W 0xb057
+°X 0xb058
+°Y 0xb059
+°Z 0xb05a
+°[ 0xb05b
+°\ 0xb05c
+°] 0xb05d
+°^ 0xb05e
+°_ 0xb05f
+°` 0xb060
+°a 0xb061
+°b 0xb062
+°c 0xb063
+°d 0xb064
+°e 0xb065
+°f 0xb066
+°g 0xb067
+°h 0xb068
+°i 0xb069
+°j 0xb06a
+°k 0xb06b
+°l 0xb06c
+°m 0xb06d
+°n 0xb06e
+°o 0xb06f
+°p 0xb070
+°q 0xb071
+°r 0xb072
+°s 0xb073
+°t 0xb074
+°u 0xb075
+°v 0xb076
+°w 0xb077
+°x 0xb078
+°y 0xb079
+°z 0xb07a
+°{ 0xb07b
+°| 0xb07c
+°} 0xb07d
+°~ 0xb07e
+°¡ 0xb0a1
+°¢ 0xb0a2
+°£ 0xb0a3
+°¤ 0xb0a4
+°¥ 0xb0a5
+°¦ 0xb0a6
+°§ 0xb0a7
+°¨ 0xb0a8
+°© 0xb0a9
+°ª 0xb0aa
+°« 0xb0ab
+°¬ 0xb0ac
+°­ 0xb0ad
+ÐÈ 0xd0c8
+ÐÉ 0xd0c9
+ÐÊ 0xd0ca
+ÐË 0xd0cb
+ÐÌ 0xd0cc
+ÐÍ 0xd0cd
+ÐÎ 0xd0ce
+ÐÏ 0xd0cf
+ÐÐ 0xd0d0
+ÐÑ 0xd0d1
+ÐÒ 0xd0d2
+ÐÓ 0xd0d3
+ÐÔ 0xd0d4
+ÐÕ 0xd0d5
+ÐÖ 0xd0d6
+Ð× 0xd0d7
+ÐØ 0xd0d8
+ÐÙ 0xd0d9
+ÐÚ 0xd0da
+ÐÛ 0xd0db
+ÐÜ 0xd0dc
+ÐÝ 0xd0dd
+ÐÞ 0xd0de
+Ðß 0xd0df
+Ðà 0xd0e0
+Ðá 0xd0e1
+Ðâ 0xd0e2
+Ðã 0xd0e3
+Ðä 0xd0e4
+Ðå 0xd0e5
+Ðæ 0xd0e6
+Ðç 0xd0e7
+Ðè 0xd0e8
+Ðé 0xd0e9
+Ðê 0xd0ea
+Ðë 0xd0eb
+Ðì 0xd0ec
+Ðí 0xd0ed
+Ðî 0xd0ee
+Ðï 0xd0ef
+Ðð 0xd0f0
+Ðñ 0xd0f1
+Ðò 0xd0f2
+Ðó 0xd0f3
+Ðô 0xd0f4
+Ðõ 0xd0f5
+Ðö 0xd0f6
+Ð÷ 0xd0f7
+Ðø 0xd0f8
+Ðù 0xd0f9
+Ðú 0xd0fa
+Ðû 0xd0fb
+Ðü 0xd0fc
+Ðý 0xd0fd
+Ðþ 0xd0fe
+Ñ@ 0xd140
+ÑA 0xd141
+ÑB 0xd142
+ÑC 0xd143
+ÑD 0xd144
+ÑE 0xd145
+ÑF 0xd146
+ÑG 0xd147
+ÑH 0xd148
+ÑI 0xd149
+ÑJ 0xd14a
+ÑK 0xd14b
+ÑL 0xd14c
+ÑM 0xd14d
+ÑN 0xd14e
+ÑO 0xd14f
+ÑP 0xd150
+ÑQ 0xd151
+ÑR 0xd152
+ÑS 0xd153
+ÑT 0xd154
+ÑU 0xd155
+ÑV 0xd156
+ÑW 0xd157
+ÑX 0xd158
+ÑY 0xd159
+ÑZ 0xd15a
+Ñ[ 0xd15b
+Ñ\ 0xd15c
+Ñ] 0xd15d
+Ñ^ 0xd15e
+Ñ_ 0xd15f
+Ñ` 0xd160
+Ña 0xd161
+Ñb 0xd162
+Ñc 0xd163
+Ñd 0xd164
+Ñe 0xd165
+Ñf 0xd166
+Ñg 0xd167
+Ñh 0xd168
+Ñi 0xd169
+Ñj 0xd16a
+Ñk 0xd16b
+Ñl 0xd16c
+Ñm 0xd16d
+Ñn 0xd16e
+Ño 0xd16f
+Ñp 0xd170
+Ñq 0xd171
+Ñr 0xd172
+Ñs 0xd173
+Ñt 0xd174
+Ñu 0xd175
+Ñv 0xd176
+Ñw 0xd177
+Ñx 0xd178
+Ñy 0xd179
+Ñz 0xd17a
+Ñ{ 0xd17b
+Ñ| 0xd17c
+Ñ} 0xd17d
+Ñ~ 0xd17e
+Ñ¡ 0xd1a1
+Ñ¢ 0xd1a2
+Ñ£ 0xd1a3
+Ѥ 0xd1a4
+Ñ¥ 0xd1a5
+Ѧ 0xd1a6
+ѧ 0xd1a7
+Ѩ 0xd1a8
+Ñ© 0xd1a9
+Ѫ 0xd1aa
+Ñ« 0xd1ab
+Ѭ 0xd1ac
+Ñ­ 0xd1ad
+Ñ® 0xd1ae
+ѯ 0xd1af
+Ñ° 0xd1b0
+ѱ 0xd1b1
+Ѳ 0xd1b2
+ѳ 0xd1b3
+Ñ´ 0xd1b4
+ѵ 0xd1b5
+Ѷ 0xd1b6
+Ñ· 0xd1b7
+Ѹ 0xd1b8
+ѹ 0xd1b9
+Ѻ 0xd1ba
+Ñ» 0xd1bb
+Ѽ 0xd1bc
+ѽ 0xd1bd
+Ѿ 0xd1be
+Ñ¿ 0xd1bf
+ÑÀ 0xd1c0
+ÑÁ 0xd1c1
+ÑÂ 0xd1c2
+ÑÃ 0xd1c3
+ÑÄ 0xd1c4
+ÑÅ 0xd1c5
+ÑÆ 0xd1c6
+ÑÇ 0xd1c7
+ÑÈ 0xd1c8
+ÑÉ 0xd1c9
+ÑÊ 0xd1ca
+ÑË 0xd1cb
+ÑÌ 0xd1cc
+ÑÍ 0xd1cd
+ÑÎ 0xd1ce
+ÑÏ 0xd1cf
+ÑÐ 0xd1d0
+ÑÑ 0xd1d1
+ÑÒ 0xd1d2
+ÑÓ 0xd1d3
+ÑÔ 0xd1d4
+ÑÕ 0xd1d5
+ÑÖ 0xd1d6
+Ñ× 0xd1d7
+ÑØ 0xd1d8
+ÑÙ 0xd1d9
+ÑÚ 0xd1da
+ÑÛ 0xd1db
+ÑÜ 0xd1dc
+ÑÝ 0xd1dd
+ÑÞ 0xd1de
+Ñß 0xd1df
+Ñà 0xd1e0
+Ñá 0xd1e1
+Ñâ 0xd1e2
+Ñã 0xd1e3
+Ñä 0xd1e4
+Ñå 0xd1e5
+Ñæ 0xd1e6
+Ñç 0xd1e7
+Ñè 0xd1e8
+Ñé 0xd1e9
+Ñê 0xd1ea
+Ñë 0xd1eb
+Ñì 0xd1ec
+Ñí 0xd1ed
+Ñî 0xd1ee
+Ñï 0xd1ef
+Ñð 0xd1f0
+Ññ 0xd1f1
+Ñò 0xd1f2
+Ñó 0xd1f3
+Ñô 0xd1f4
+Ñõ 0xd1f5
+Ñö 0xd1f6
+Ñ÷ 0xd1f7
+Ñø 0xd1f8
+Ñù 0xd1f9
+Ñú 0xd1fa
+Ñû 0xd1fb
+Ñü 0xd1fc
+Ñý 0xd1fd
+Ñþ 0xd1fe
+Ò@ 0xd240
+ÒA 0xd241
+ÒB 0xd242
+ÒC 0xd243
+ÒD 0xd244
+ÒE 0xd245
+ÒF 0xd246
+ÒG 0xd247
+ÒH 0xd248
+ÒI 0xd249
+ÒJ 0xd24a
+ÒK 0xd24b
+ÒL 0xd24c
+ÒM 0xd24d
+ÒN 0xd24e
+ÒO 0xd24f
+ÒP 0xd250
+ÒQ 0xd251
+ÒR 0xd252
+ÒS 0xd253
+ÒT 0xd254
+ÒU 0xd255
+ÒV 0xd256
+ÒW 0xd257
+ÒX 0xd258
+ÒY 0xd259
+ÒZ 0xd25a
+Ò[ 0xd25b
+Ò\ 0xd25c
+Ò] 0xd25d
+Ò^ 0xd25e
+Ò_ 0xd25f
+Ò` 0xd260
+Òa 0xd261
+Òb 0xd262
+Òc 0xd263
+Òd 0xd264
+Òe 0xd265
+Òf 0xd266
+Òg 0xd267
+Òh 0xd268
+Òi 0xd269
+Òj 0xd26a
+Òk 0xd26b
+Òl 0xd26c
+Òm 0xd26d
+Òn 0xd26e
+Òo 0xd26f
+Òp 0xd270
+Òq 0xd271
+Òr 0xd272
+Òs 0xd273
+Òt 0xd274
+Òu 0xd275
+Òv 0xd276
+Òw 0xd277
+Òx 0xd278
+Òy 0xd279
+Òz 0xd27a
+Ò{ 0xd27b
+Ò| 0xd27c
+Ò} 0xd27d
+Ò~ 0xd27e
+Ò¡ 0xd2a1
+Ò¢ 0xd2a2
+Ò£ 0xd2a3
+Ò¤ 0xd2a4
+Ò¥ 0xd2a5
+Ò¦ 0xd2a6
+Ò§ 0xd2a7
+Ò¨ 0xd2a8
+Ò© 0xd2a9
+Òª 0xd2aa
+Ò« 0xd2ab
+Ò¬ 0xd2ac
+Ò­ 0xd2ad
+Ò® 0xd2ae
+Ò¯ 0xd2af
+Ò° 0xd2b0
+Ò± 0xd2b1
+Ò² 0xd2b2
+Ò³ 0xd2b3
+Ò´ 0xd2b4
+Òµ 0xd2b5
+Ò¶ 0xd2b6
+Ò· 0xd2b7
+Ò¸ 0xd2b8
+Ò¹ 0xd2b9
+Òº 0xd2ba
+Ò» 0xd2bb
+Ò¼ 0xd2bc
+Ò½ 0xd2bd
+Ò¾ 0xd2be
+Ò¿ 0xd2bf
+ÒÀ 0xd2c0
+ÒÁ 0xd2c1
+ÒÂ 0xd2c2
+ÒÃ 0xd2c3
+ÒÄ 0xd2c4
+ÒÅ 0xd2c5
+ÒÆ 0xd2c6
+ÒÇ 0xd2c7
+ÒÈ 0xd2c8
+ÒÉ 0xd2c9
+ÒÊ 0xd2ca
+ÒË 0xd2cb
+ÒÌ 0xd2cc
+ÒÍ 0xd2cd
+ÒÎ 0xd2ce
+ÒÏ 0xd2cf
+ÒÐ 0xd2d0
+ÒÑ 0xd2d1
+ÒÒ 0xd2d2
+ÒÓ 0xd2d3
+ÒÔ 0xd2d4
+ÒÕ 0xd2d5
+ÒÖ 0xd2d6
+Ò× 0xd2d7
+ÒØ 0xd2d8
+ÒÙ 0xd2d9
+ÒÚ 0xd2da
+ÒÛ 0xd2db
+ÒÜ 0xd2dc
+ÒÝ 0xd2dd
+ÒÞ 0xd2de
+Òß 0xd2df
+Òà 0xd2e0
+Òá 0xd2e1
+Òâ 0xd2e2
+Òã 0xd2e3
+Òä 0xd2e4
+Òå 0xd2e5
+Òæ 0xd2e6
+Òç 0xd2e7
+Òè 0xd2e8
+Òé 0xd2e9
+Òê 0xd2ea
+Òë 0xd2eb
+Òì 0xd2ec
+Òí 0xd2ed
+Òî 0xd2ee
+Òï 0xd2ef
+Òð 0xd2f0
+Òñ 0xd2f1
+Òò 0xd2f2
+Òó 0xd2f3
+Òô 0xd2f4
+Òõ 0xd2f5
+Òö 0xd2f6
+Ò÷ 0xd2f7
+Òø 0xd2f8
+Òù 0xd2f9
+Òú 0xd2fa
+Òû 0xd2fb
+Òü 0xd2fc
+Òý 0xd2fd
+Òþ 0xd2fe
+Ó@ 0xd340
+ÓA 0xd341
+ÓB 0xd342
+ÓC 0xd343
+ÓD 0xd344
+ÓE 0xd345
+ÓF 0xd346
+ÓG 0xd347
+ÓH 0xd348
+ÓI 0xd349
+ÓJ 0xd34a
+ÓK 0xd34b
+ÓL 0xd34c
+ÓM 0xd34d
+ÓN 0xd34e
+ÓO 0xd34f
+ÓP 0xd350
+ÓQ 0xd351
+ÓR 0xd352
+ÓS 0xd353
+ÓT 0xd354
+ÓU 0xd355
+ÓV 0xd356
+ÓW 0xd357
+ÓX 0xd358
+ÓY 0xd359
+ÓZ 0xd35a
+Ó[ 0xd35b
+Ó\ 0xd35c
+Ó] 0xd35d
+Ó^ 0xd35e
+Ó_ 0xd35f
+Ó` 0xd360
+Óa 0xd361
+Ób 0xd362
+Óc 0xd363
+Ód 0xd364
+Óe 0xd365
+Óf 0xd366
+Óg 0xd367
+Óh 0xd368
+Ói 0xd369
+Ój 0xd36a
+Ók 0xd36b
+Ól 0xd36c
+Óm 0xd36d
+Ón 0xd36e
+Óo 0xd36f
+Óp 0xd370
+Óq 0xd371
+Ór 0xd372
+Ós 0xd373
+Ót 0xd374
+Óu 0xd375
+Óv 0xd376
+Ów 0xd377
+Óx 0xd378
+Óy 0xd379
+Óz 0xd37a
+Ó{ 0xd37b
+Ó| 0xd37c
+Ó} 0xd37d
+Ó~ 0xd37e
+Ó¡ 0xd3a1
+Ó¢ 0xd3a2
+Ó£ 0xd3a3
+Ó¤ 0xd3a4
+Ó¥ 0xd3a5
+Ó¦ 0xd3a6
+Ó§ 0xd3a7
+Ó¨ 0xd3a8
+Ó© 0xd3a9
+Óª 0xd3aa
+Ó« 0xd3ab
+Ó¬ 0xd3ac
+Ó­ 0xd3ad
+Ó® 0xd3ae
+Ó¯ 0xd3af
+Ó° 0xd3b0
+Ó± 0xd3b1
+Ó² 0xd3b2
+Ó³ 0xd3b3
+Ó´ 0xd3b4
+Óµ 0xd3b5
+Ó¶ 0xd3b6
+Ó· 0xd3b7
+Ó¸ 0xd3b8
+Ó¹ 0xd3b9
+Óº 0xd3ba
+Ó» 0xd3bb
+Ó¼ 0xd3bc
+Ó½ 0xd3bd
+Ó¾ 0xd3be
+Ó¿ 0xd3bf
+ÓÀ 0xd3c0
+ÓÁ 0xd3c1
+ÓÂ 0xd3c2
+ÓÃ 0xd3c3
+ÓÄ 0xd3c4
+ÓÅ 0xd3c5
+ÓÆ 0xd3c6
+ÓÇ 0xd3c7
+ÓÈ 0xd3c8
+ÓÉ 0xd3c9
+ÓÊ 0xd3ca
+ÓË 0xd3cb
+ÓÌ 0xd3cc
+ÓÍ 0xd3cd
+ÓÎ 0xd3ce
+ÓÏ 0xd3cf
+ÓÐ 0xd3d0
+ÓÑ 0xd3d1
+ÓÒ 0xd3d2
+ÓÓ 0xd3d3
+ÓÔ 0xd3d4
+ÓÕ 0xd3d5
+ÓÖ 0xd3d6
+Ó× 0xd3d7
+ÓØ 0xd3d8
+ÓÙ 0xd3d9
+ÓÚ 0xd3da
+ÓÛ 0xd3db
+ÓÜ 0xd3dc
+ÓÝ 0xd3dd
+ÓÞ 0xd3de
+Óß 0xd3df
+Óà 0xd3e0
+Óá 0xd3e1
+Óâ 0xd3e2
+Óã 0xd3e3
+Óä 0xd3e4
+Óå 0xd3e5
+Óæ 0xd3e6
+Óç 0xd3e7
+Óè 0xd3e8
+Óé 0xd3e9
+Óê 0xd3ea
+Óë 0xd3eb
+Óì 0xd3ec
+Óí 0xd3ed
+Óî 0xd3ee
+Óï 0xd3ef
+Óð 0xd3f0
+Óñ 0xd3f1
+Óò 0xd3f2
+Óó 0xd3f3
+Óô 0xd3f4
+Óõ 0xd3f5
+Óö 0xd3f6
+Ó÷ 0xd3f7
+Óø 0xd3f8
+Óù 0xd3f9
+Óú 0xd3fa
+Óû 0xd3fb
+Óü 0xd3fc
+Óý 0xd3fd
+Óþ 0xd3fe
+Ô@ 0xd440
+ÔA 0xd441
+ÔB 0xd442
+ÔC 0xd443
+ÔD 0xd444
+ÔE 0xd445
+ÔF 0xd446
+ÔG 0xd447
+ÔH 0xd448
+ÔI 0xd449
+ÔJ 0xd44a
+°® 0xb0ae
+°¯ 0xb0af
+°° 0xb0b0
+°± 0xb0b1
+°² 0xb0b2
+°³ 0xb0b3
+°´ 0xb0b4
+°µ 0xb0b5
+°¶ 0xb0b6
+°· 0xb0b7
+°¸ 0xb0b8
+°¹ 0xb0b9
+°º 0xb0ba
+°» 0xb0bb
+°¼ 0xb0bc
+°½ 0xb0bd
+°¾ 0xb0be
+°¿ 0xb0bf
+°À 0xb0c0
+°Á 0xb0c1
+°Â 0xb0c2
+°Ã 0xb0c3
+°Ä 0xb0c4
+°Å 0xb0c5
+°Æ 0xb0c6
+°Ç 0xb0c7
+°È 0xb0c8
+°É 0xb0c9
+°Ê 0xb0ca
+°Ë 0xb0cb
+°Ì 0xb0cc
+°Í 0xb0cd
+°Î 0xb0ce
+°Ï 0xb0cf
+°Ð 0xb0d0
+°Ñ 0xb0d1
+°Ò 0xb0d2
+°Ó 0xb0d3
+°Ô 0xb0d4
+°Õ 0xb0d5
+°Ö 0xb0d6
+°× 0xb0d7
+°Ø 0xb0d8
+°Ù 0xb0d9
+°Ú 0xb0da
+°Û 0xb0db
+°Ü 0xb0dc
+°Ý 0xb0dd
+°Þ 0xb0de
+°ß 0xb0df
+°à 0xb0e0
+°á 0xb0e1
+°â 0xb0e2
+°ã 0xb0e3
+°ä 0xb0e4
+°å 0xb0e5
+°æ 0xb0e6
+°ç 0xb0e7
+°è 0xb0e8
+°é 0xb0e9
+°ê 0xb0ea
+°ë 0xb0eb
+°ì 0xb0ec
+°í 0xb0ed
+°î 0xb0ee
+°ï 0xb0ef
+°ð 0xb0f0
+°ñ 0xb0f1
+°ò 0xb0f2
+°ó 0xb0f3
+°ô 0xb0f4
+°õ 0xb0f5
+°ö 0xb0f6
+°÷ 0xb0f7
+°ø 0xb0f8
+°ù 0xb0f9
+°ú 0xb0fa
+°û 0xb0fb
+°ü 0xb0fc
+°ý 0xb0fd
+°þ 0xb0fe
+±@ 0xb140
+±A 0xb141
+±B 0xb142
+±C 0xb143
+±D 0xb144
+±E 0xb145
+±F 0xb146
+±G 0xb147
+±H 0xb148
+±I 0xb149
+±J 0xb14a
+±K 0xb14b
+±L 0xb14c
+±M 0xb14d
+±N 0xb14e
+±O 0xb14f
+±P 0xb150
+±Q 0xb151
+±R 0xb152
+±S 0xb153
+±T 0xb154
+±U 0xb155
+±V 0xb156
+±W 0xb157
+±X 0xb158
+±Y 0xb159
+±Z 0xb15a
+±[ 0xb15b
+±\ 0xb15c
+±] 0xb15d
+±^ 0xb15e
+±_ 0xb15f
+±` 0xb160
+±a 0xb161
+±b 0xb162
+±c 0xb163
+±d 0xb164
+±e 0xb165
+±f 0xb166
+±g 0xb167
+±h 0xb168
+±i 0xb169
+±j 0xb16a
+±k 0xb16b
+±l 0xb16c
+±m 0xb16d
+±n 0xb16e
+±o 0xb16f
+±p 0xb170
+±q 0xb171
+±r 0xb172
+±s 0xb173
+±t 0xb174
+±u 0xb175
+±v 0xb176
+±w 0xb177
+±x 0xb178
+±y 0xb179
+±z 0xb17a
+±{ 0xb17b
+±| 0xb17c
+±} 0xb17d
+±~ 0xb17e
+±¡ 0xb1a1
+±¢ 0xb1a2
+±£ 0xb1a3
+±¤ 0xb1a4
+±¥ 0xb1a5
+±¦ 0xb1a6
+±§ 0xb1a7
+±¨ 0xb1a8
+±© 0xb1a9
+±ª 0xb1aa
+±« 0xb1ab
+±¬ 0xb1ac
+±­ 0xb1ad
+±® 0xb1ae
+±¯ 0xb1af
+±° 0xb1b0
+±± 0xb1b1
+±² 0xb1b2
+±³ 0xb1b3
+±´ 0xb1b4
+±µ 0xb1b5
+±¶ 0xb1b6
+±· 0xb1b7
+±¸ 0xb1b8
+±¹ 0xb1b9
+±º 0xb1ba
+±» 0xb1bb
+±¼ 0xb1bc
+±½ 0xb1bd
+±¾ 0xb1be
+±¿ 0xb1bf
+±À 0xb1c0
+±Á 0xb1c1
+±Â 0xb1c2
+±Ã 0xb1c3
+±Ä 0xb1c4
+±Å 0xb1c5
+±Æ 0xb1c6
+±Ç 0xb1c7
+±È 0xb1c8
+±É 0xb1c9
+±Ê 0xb1ca
+±Ë 0xb1cb
+±Ì 0xb1cc
+±Í 0xb1cd
+±Î 0xb1ce
+±Ï 0xb1cf
+±Ð 0xb1d0
+±Ñ 0xb1d1
+±Ò 0xb1d2
+±Ó 0xb1d3
+±Ô 0xb1d4
+±Õ 0xb1d5
+±Ö 0xb1d6
+±× 0xb1d7
+±Ø 0xb1d8
+±Ù 0xb1d9
+±Ú 0xb1da
+±Û 0xb1db
+±Ü 0xb1dc
+±Ý 0xb1dd
+±Þ 0xb1de
+±ß 0xb1df
+±à 0xb1e0
+±á 0xb1e1
+±â 0xb1e2
+±ã 0xb1e3
+±ä 0xb1e4
+±å 0xb1e5
+±æ 0xb1e6
+±ç 0xb1e7
+±è 0xb1e8
+±é 0xb1e9
+±ê 0xb1ea
+±ë 0xb1eb
+±ì 0xb1ec
+±í 0xb1ed
+±î 0xb1ee
+±ï 0xb1ef
+±ð 0xb1f0
+±ñ 0xb1f1
+±ò 0xb1f2
+±ó 0xb1f3
+±ô 0xb1f4
+±õ 0xb1f5
+±ö 0xb1f6
+±÷ 0xb1f7
+±ø 0xb1f8
+±ù 0xb1f9
+±ú 0xb1fa
+±û 0xb1fb
+±ü 0xb1fc
+±ý 0xb1fd
+±þ 0xb1fe
+²@ 0xb240
+²A 0xb241
+²B 0xb242
+²C 0xb243
+²D 0xb244
+²E 0xb245
+²F 0xb246
+²G 0xb247
+²H 0xb248
+²I 0xb249
+²J 0xb24a
+²K 0xb24b
+²L 0xb24c
+²M 0xb24d
+²N 0xb24e
+²O 0xb24f
+²P 0xb250
+²Q 0xb251
+²R 0xb252
+²S 0xb253
+²T 0xb254
+²U 0xb255
+²V 0xb256
+²W 0xb257
+²X 0xb258
+²Y 0xb259
+²Z 0xb25a
+²[ 0xb25b
+²\ 0xb25c
+²] 0xb25d
+²^ 0xb25e
+²_ 0xb25f
+²` 0xb260
+²a 0xb261
+²b 0xb262
+²c 0xb263
+²d 0xb264
+²e 0xb265
+²f 0xb266
+²g 0xb267
+²h 0xb268
+²i 0xb269
+²j 0xb26a
+²k 0xb26b
+²l 0xb26c
+²m 0xb26d
+²n 0xb26e
+²o 0xb26f
+²p 0xb270
+²q 0xb271
+²r 0xb272
+²s 0xb273
+²t 0xb274
+²u 0xb275
+²v 0xb276
+²w 0xb277
+²x 0xb278
+²y 0xb279
+²z 0xb27a
+²{ 0xb27b
+²| 0xb27c
+²} 0xb27d
+²~ 0xb27e
+²¡ 0xb2a1
+²¢ 0xb2a2
+²£ 0xb2a3
+²¤ 0xb2a4
+²¥ 0xb2a5
+²¦ 0xb2a6
+²§ 0xb2a7
+²¨ 0xb2a8
+²© 0xb2a9
+²ª 0xb2aa
+²« 0xb2ab
+²¬ 0xb2ac
+²­ 0xb2ad
+²® 0xb2ae
+²¯ 0xb2af
+²° 0xb2b0
+²± 0xb2b1
+²² 0xb2b2
+²³ 0xb2b3
+²´ 0xb2b4
+²µ 0xb2b5
+²¶ 0xb2b6
+²· 0xb2b7
+²¸ 0xb2b8
+²¹ 0xb2b9
+²º 0xb2ba
+²» 0xb2bb
+²¼ 0xb2bc
+²½ 0xb2bd
+²¾ 0xb2be
+²¿ 0xb2bf
+²À 0xb2c0
+²Á 0xb2c1
+²Â 0xb2c2
+²Ã 0xb2c3
+²Ä 0xb2c4
+²Å 0xb2c5
+²Æ 0xb2c6
+²Ç 0xb2c7
+²È 0xb2c8
+²É 0xb2c9
+²Ê 0xb2ca
+²Ë 0xb2cb
+²Ì 0xb2cc
+²Í 0xb2cd
+²Î 0xb2ce
+²Ï 0xb2cf
+²Ð 0xb2d0
+²Ñ 0xb2d1
+²Ò 0xb2d2
+²Ó 0xb2d3
+²Ô 0xb2d4
+²Õ 0xb2d5
+²Ö 0xb2d6
+²× 0xb2d7
+²Ø 0xb2d8
+²Ù 0xb2d9
+²Ú 0xb2da
+²Û 0xb2db
+²Ü 0xb2dc
+²Ý 0xb2dd
+²Þ 0xb2de
+²ß 0xb2df
+²à 0xb2e0
+²á 0xb2e1
+²â 0xb2e2
+²ã 0xb2e3
+²ä 0xb2e4
+²å 0xb2e5
+²æ 0xb2e6
+²ç 0xb2e7
+²è 0xb2e8
+²é 0xb2e9
+²ê 0xb2ea
+²ë 0xb2eb
+²ì 0xb2ec
+²í 0xb2ed
+²î 0xb2ee
+²ï 0xb2ef
+²ð 0xb2f0
+²ñ 0xb2f1
+²ò 0xb2f2
+²ó 0xb2f3
+²ô 0xb2f4
+²õ 0xb2f5
+²ö 0xb2f6
+²÷ 0xb2f7
+²ø 0xb2f8
+²ù 0xb2f9
+²ú 0xb2fa
+²û 0xb2fb
+²ü 0xb2fc
+²ý 0xb2fd
+²þ 0xb2fe
+³@ 0xb340
+³A 0xb341
+³B 0xb342
+³C 0xb343
+³D 0xb344
+³E 0xb345
+³F 0xb346
+³G 0xb347
+³H 0xb348
+³I 0xb349
+³J 0xb34a
+³K 0xb34b
+³L 0xb34c
+³M 0xb34d
+³N 0xb34e
+³O 0xb34f
+³P 0xb350
+³Q 0xb351
+³R 0xb352
+³S 0xb353
+³T 0xb354
+³U 0xb355
+³V 0xb356
+³W 0xb357
+³X 0xb358
+³Y 0xb359
+³Z 0xb35a
+³[ 0xb35b
+³\ 0xb35c
+³] 0xb35d
+³^ 0xb35e
+³_ 0xb35f
+³` 0xb360
+³a 0xb361
+³b 0xb362
+³c 0xb363
+³d 0xb364
+³e 0xb365
+³f 0xb366
+³g 0xb367
+³h 0xb368
+³i 0xb369
+³j 0xb36a
+³k 0xb36b
+³l 0xb36c
+³m 0xb36d
+³n 0xb36e
+³o 0xb36f
+³p 0xb370
+³q 0xb371
+³r 0xb372
+³s 0xb373
+³t 0xb374
+³u 0xb375
+³v 0xb376
+³w 0xb377
+³x 0xb378
+³y 0xb379
+³z 0xb37a
+³{ 0xb37b
+³| 0xb37c
+³} 0xb37d
+³~ 0xb37e
+³¡ 0xb3a1
+³¢ 0xb3a2
+³£ 0xb3a3
+³¤ 0xb3a4
+³¥ 0xb3a5
+³¦ 0xb3a6
+³§ 0xb3a7
+³¨ 0xb3a8
+³© 0xb3a9
+³ª 0xb3aa
+³« 0xb3ab
+³¬ 0xb3ac
+³­ 0xb3ad
+³® 0xb3ae
+³¯ 0xb3af
+³° 0xb3b0
+³± 0xb3b1
+³² 0xb3b2
+³³ 0xb3b3
+³´ 0xb3b4
+³µ 0xb3b5
+³¶ 0xb3b6
+³· 0xb3b7
+³¸ 0xb3b8
+³¹ 0xb3b9
+³º 0xb3ba
+³» 0xb3bb
+³¼ 0xb3bc
+³½ 0xb3bd
+³¾ 0xb3be
+³¿ 0xb3bf
+³À 0xb3c0
+³Á 0xb3c1
+³Â 0xb3c2
+ÔK 0xd44b
+ÔL 0xd44c
+ÔM 0xd44d
+ÔN 0xd44e
+ÔO 0xd44f
+ÔP 0xd450
+ÔQ 0xd451
+ÔR 0xd452
+ÔS 0xd453
+ÔT 0xd454
+ÔU 0xd455
+ÔV 0xd456
+ÔW 0xd457
+ÔX 0xd458
+ÔY 0xd459
+ÔZ 0xd45a
+Ô[ 0xd45b
+Ô\ 0xd45c
+Ô] 0xd45d
+Ô^ 0xd45e
+Ô_ 0xd45f
+Ô` 0xd460
+Ôa 0xd461
+Ôb 0xd462
+Ôc 0xd463
+Ôd 0xd464
+Ôe 0xd465
+Ôf 0xd466
+Ôg 0xd467
+Ôh 0xd468
+Ôi 0xd469
+Ôj 0xd46a
+Ôk 0xd46b
+Ôl 0xd46c
+Ôm 0xd46d
+Ôn 0xd46e
+Ôo 0xd46f
+Ôp 0xd470
+Ôq 0xd471
+Ôr 0xd472
+Ôs 0xd473
+Ôt 0xd474
+Ôu 0xd475
+Ôv 0xd476
+Ôw 0xd477
+Ôx 0xd478
+Ôy 0xd479
+Ôz 0xd47a
+Ô{ 0xd47b
+Ô| 0xd47c
+Ô} 0xd47d
+Ô~ 0xd47e
+Ô¡ 0xd4a1
+Ô¢ 0xd4a2
+Ô£ 0xd4a3
+Ô¤ 0xd4a4
+Ô¥ 0xd4a5
+Ô¦ 0xd4a6
+Ô§ 0xd4a7
+Ô¨ 0xd4a8
+Ô© 0xd4a9
+Ôª 0xd4aa
+Ô« 0xd4ab
+Ô¬ 0xd4ac
+Ô­ 0xd4ad
+Ô® 0xd4ae
+Ô¯ 0xd4af
+Ô° 0xd4b0
+Ô± 0xd4b1
+Ô² 0xd4b2
+Ô³ 0xd4b3
+Ô´ 0xd4b4
+Ôµ 0xd4b5
+Ô¶ 0xd4b6
+Ô· 0xd4b7
+Ô¸ 0xd4b8
+Ô¹ 0xd4b9
+Ôº 0xd4ba
+Ô» 0xd4bb
+Ô¼ 0xd4bc
+Ô½ 0xd4bd
+Ô¾ 0xd4be
+Ô¿ 0xd4bf
+ÔÀ 0xd4c0
+ÔÁ 0xd4c1
+ÔÂ 0xd4c2
+ÔÃ 0xd4c3
+ÔÄ 0xd4c4
+ÔÅ 0xd4c5
+ÔÆ 0xd4c6
+ÔÇ 0xd4c7
+ÔÈ 0xd4c8
+ÔÉ 0xd4c9
+ÔÊ 0xd4ca
+ÔË 0xd4cb
+ÔÌ 0xd4cc
+ÔÍ 0xd4cd
+ÔÎ 0xd4ce
+ÔÏ 0xd4cf
+ÔÐ 0xd4d0
+ÔÑ 0xd4d1
+ÔÒ 0xd4d2
+ÔÓ 0xd4d3
+ÔÔ 0xd4d4
+ÔÕ 0xd4d5
+ÔÖ 0xd4d6
+Ô× 0xd4d7
+ÔØ 0xd4d8
+ÔÙ 0xd4d9
+ÔÚ 0xd4da
+ÔÛ 0xd4db
+ÔÜ 0xd4dc
+ÔÝ 0xd4dd
+ÔÞ 0xd4de
+Ôß 0xd4df
+Ôà 0xd4e0
+Ôá 0xd4e1
+Ôâ 0xd4e2
+Ôã 0xd4e3
+Ôä 0xd4e4
+Ôå 0xd4e5
+Ôæ 0xd4e6
+Ôç 0xd4e7
+Ôè 0xd4e8
+Ôé 0xd4e9
+Ôê 0xd4ea
+Ôë 0xd4eb
+Ôì 0xd4ec
+Ôí 0xd4ed
+Ôî 0xd4ee
+Ôï 0xd4ef
+Ôð 0xd4f0
+Ôñ 0xd4f1
+Ôò 0xd4f2
+Ôó 0xd4f3
+Ôô 0xd4f4
+Ôõ 0xd4f5
+Ôö 0xd4f6
+Ô÷ 0xd4f7
+Ôø 0xd4f8
+Ôù 0xd4f9
+Ôú 0xd4fa
+Ôû 0xd4fb
+Ôü 0xd4fc
+Ôý 0xd4fd
+Ôþ 0xd4fe
+Õ@ 0xd540
+ÕA 0xd541
+ÕB 0xd542
+ÕC 0xd543
+ÕD 0xd544
+ÕE 0xd545
+ÕF 0xd546
+ÕG 0xd547
+ÕH 0xd548
+ÕI 0xd549
+ÕJ 0xd54a
+ÕK 0xd54b
+ÕL 0xd54c
+ÕM 0xd54d
+ÕN 0xd54e
+ÕO 0xd54f
+ÕP 0xd550
+ÕQ 0xd551
+ÕR 0xd552
+ÕS 0xd553
+ÕT 0xd554
+ÕU 0xd555
+ÕV 0xd556
+ÕW 0xd557
+ÕX 0xd558
+ÕY 0xd559
+ÕZ 0xd55a
+Õ[ 0xd55b
+Õ\ 0xd55c
+Õ] 0xd55d
+Õ^ 0xd55e
+Õ_ 0xd55f
+Õ` 0xd560
+Õa 0xd561
+Õb 0xd562
+Õc 0xd563
+Õd 0xd564
+Õe 0xd565
+Õf 0xd566
+Õg 0xd567
+Õh 0xd568
+Õi 0xd569
+Õj 0xd56a
+Õk 0xd56b
+Õl 0xd56c
+Õm 0xd56d
+Õn 0xd56e
+Õo 0xd56f
+Õp 0xd570
+Õq 0xd571
+Õr 0xd572
+Õs 0xd573
+Õt 0xd574
+Õu 0xd575
+Õv 0xd576
+Õw 0xd577
+Õx 0xd578
+Õy 0xd579
+Õz 0xd57a
+Õ{ 0xd57b
+Õ| 0xd57c
+Õ} 0xd57d
+Õ~ 0xd57e
+Õ¡ 0xd5a1
+Õ¢ 0xd5a2
+Õ£ 0xd5a3
+Õ¤ 0xd5a4
+Õ¥ 0xd5a5
+Õ¦ 0xd5a6
+Õ§ 0xd5a7
+Õ¨ 0xd5a8
+Õ© 0xd5a9
+Õª 0xd5aa
+Õ« 0xd5ab
+Õ¬ 0xd5ac
+Õ­ 0xd5ad
+Õ® 0xd5ae
+Õ¯ 0xd5af
+Õ° 0xd5b0
+Õ± 0xd5b1
+Õ² 0xd5b2
+Õ³ 0xd5b3
+Õ´ 0xd5b4
+Õµ 0xd5b5
+Õ¶ 0xd5b6
+Õ· 0xd5b7
+Õ¸ 0xd5b8
+Õ¹ 0xd5b9
+Õº 0xd5ba
+Õ» 0xd5bb
+Õ¼ 0xd5bc
+Õ½ 0xd5bd
+Õ¾ 0xd5be
+Õ¿ 0xd5bf
+ÕÀ 0xd5c0
+ÕÁ 0xd5c1
+ÕÂ 0xd5c2
+ÕÃ 0xd5c3
+ÕÄ 0xd5c4
+ÕÅ 0xd5c5
+ÕÆ 0xd5c6
+ÕÇ 0xd5c7
+ÕÈ 0xd5c8
+ÕÉ 0xd5c9
+ÕÊ 0xd5ca
+ÕË 0xd5cb
+ÕÌ 0xd5cc
+ÕÍ 0xd5cd
+ÕÎ 0xd5ce
+ÕÏ 0xd5cf
+ÕÐ 0xd5d0
+ÕÑ 0xd5d1
+ÕÒ 0xd5d2
+ÕÓ 0xd5d3
+ÕÔ 0xd5d4
+ÕÕ 0xd5d5
+ÕÖ 0xd5d6
+Õ× 0xd5d7
+ÕØ 0xd5d8
+ÕÙ 0xd5d9
+ÕÚ 0xd5da
+ÕÛ 0xd5db
+ÕÜ 0xd5dc
+ÕÝ 0xd5dd
+ÕÞ 0xd5de
+Õß 0xd5df
+Õà 0xd5e0
+Õá 0xd5e1
+Õâ 0xd5e2
+Õã 0xd5e3
+Õä 0xd5e4
+Õå 0xd5e5
+Õæ 0xd5e6
+Õç 0xd5e7
+Õè 0xd5e8
+Õé 0xd5e9
+Õê 0xd5ea
+Õë 0xd5eb
+Õì 0xd5ec
+Õí 0xd5ed
+Õî 0xd5ee
+Õï 0xd5ef
+Õð 0xd5f0
+Õñ 0xd5f1
+Õò 0xd5f2
+Õó 0xd5f3
+Õô 0xd5f4
+Õõ 0xd5f5
+Õö 0xd5f6
+Õ÷ 0xd5f7
+Õø 0xd5f8
+Õù 0xd5f9
+Õú 0xd5fa
+Õû 0xd5fb
+Õü 0xd5fc
+Õý 0xd5fd
+Õþ 0xd5fe
+Ö@ 0xd640
+ÖA 0xd641
+ÖB 0xd642
+ÖC 0xd643
+ÖD 0xd644
+ÖE 0xd645
+ÖF 0xd646
+ÖG 0xd647
+ÖH 0xd648
+ÖI 0xd649
+ÖJ 0xd64a
+ÖK 0xd64b
+ÖL 0xd64c
+ÖM 0xd64d
+ÖN 0xd64e
+ÖO 0xd64f
+ÖP 0xd650
+ÖQ 0xd651
+ÖR 0xd652
+ÖS 0xd653
+ÖT 0xd654
+ÖU 0xd655
+ÖV 0xd656
+ÖW 0xd657
+ÖX 0xd658
+ÖY 0xd659
+ÖZ 0xd65a
+Ö[ 0xd65b
+Ö\ 0xd65c
+Ö] 0xd65d
+Ö^ 0xd65e
+Ö_ 0xd65f
+Ö` 0xd660
+Öa 0xd661
+Öb 0xd662
+Öc 0xd663
+Öd 0xd664
+Öe 0xd665
+Öf 0xd666
+Ög 0xd667
+Öh 0xd668
+Öi 0xd669
+Öj 0xd66a
+Ök 0xd66b
+Öl 0xd66c
+Öm 0xd66d
+Ön 0xd66e
+Öo 0xd66f
+Öp 0xd670
+Öq 0xd671
+Ör 0xd672
+Ös 0xd673
+Öt 0xd674
+Öu 0xd675
+Öv 0xd676
+Öw 0xd677
+Öx 0xd678
+Öy 0xd679
+Öz 0xd67a
+Ö{ 0xd67b
+Ö| 0xd67c
+Ö} 0xd67d
+Ö~ 0xd67e
+Ö¡ 0xd6a1
+Ö¢ 0xd6a2
+Ö£ 0xd6a3
+Ö¤ 0xd6a4
+Ö¥ 0xd6a5
+Ö¦ 0xd6a6
+Ö§ 0xd6a7
+Ö¨ 0xd6a8
+Ö© 0xd6a9
+Öª 0xd6aa
+Ö« 0xd6ab
+Ö¬ 0xd6ac
+Ö­ 0xd6ad
+Ö® 0xd6ae
+Ö¯ 0xd6af
+Ö° 0xd6b0
+Ö± 0xd6b1
+Ö² 0xd6b2
+Ö³ 0xd6b3
+Ö´ 0xd6b4
+Öµ 0xd6b5
+Ö¶ 0xd6b6
+Ö· 0xd6b7
+Ö¸ 0xd6b8
+Ö¹ 0xd6b9
+Öº 0xd6ba
+Ö» 0xd6bb
+Ö¼ 0xd6bc
+Ö½ 0xd6bd
+Ö¾ 0xd6be
+Ö¿ 0xd6bf
+ÖÀ 0xd6c0
+ÖÁ 0xd6c1
+ÖÂ 0xd6c2
+ÖÃ 0xd6c3
+ÖÄ 0xd6c4
+ÖÅ 0xd6c5
+ÖÆ 0xd6c6
+ÖÇ 0xd6c7
+ÖÈ 0xd6c8
+ÖÉ 0xd6c9
+ÖÊ 0xd6ca
+ÖË 0xd6cb
+ÖÌ 0xd6cc
+ÖÍ 0xd6cd
+ÖÎ 0xd6ce
+ÖÏ 0xd6cf
+ÖÐ 0xd6d0
+ÖÑ 0xd6d1
+ÖÒ 0xd6d2
+ÖÓ 0xd6d3
+ÖÔ 0xd6d4
+ÖÕ 0xd6d5
+ÖÖ 0xd6d6
+Ö× 0xd6d7
+ÖØ 0xd6d8
+ÖÙ 0xd6d9
+ÖÚ 0xd6da
+ÖÛ 0xd6db
+ÖÜ 0xd6dc
+ÖÝ 0xd6dd
+ÖÞ 0xd6de
+Öß 0xd6df
+Öà 0xd6e0
+Öá 0xd6e1
+Öâ 0xd6e2
+Öã 0xd6e3
+Öä 0xd6e4
+Öå 0xd6e5
+Öæ 0xd6e6
+Öç 0xd6e7
+Öè 0xd6e8
+Öé 0xd6e9
+Öê 0xd6ea
+Öë 0xd6eb
+Öì 0xd6ec
+Öí 0xd6ed
+Öî 0xd6ee
+Öï 0xd6ef
+Öð 0xd6f0
+Öñ 0xd6f1
+Öò 0xd6f2
+Öó 0xd6f3
+Öô 0xd6f4
+Öõ 0xd6f5
+Öö 0xd6f6
+Ö÷ 0xd6f7
+Öø 0xd6f8
+Öù 0xd6f9
+Öú 0xd6fa
+Öû 0xd6fb
+Öü 0xd6fc
+Öý 0xd6fd
+Öþ 0xd6fe
+×@ 0xd740
+×A 0xd741
+×B 0xd742
+×C 0xd743
+×D 0xd744
+×E 0xd745
+×F 0xd746
+×G 0xd747
+×H 0xd748
+×I 0xd749
+×J 0xd74a
+×K 0xd74b
+×L 0xd74c
+×M 0xd74d
+×N 0xd74e
+×O 0xd74f
+×P 0xd750
+×Q 0xd751
+×R 0xd752
+×S 0xd753
+×T 0xd754
+×U 0xd755
+×V 0xd756
+×W 0xd757
+×X 0xd758
+×Y 0xd759
+×Z 0xd75a
+×[ 0xd75b
+×\ 0xd75c
+×] 0xd75d
+×^ 0xd75e
+×_ 0xd75f
+×` 0xd760
+×a 0xd761
+×b 0xd762
+×c 0xd763
+×d 0xd764
+×e 0xd765
+×f 0xd766
+×g 0xd767
+×h 0xd768
+×i 0xd769
+×j 0xd76a
+×k 0xd76b
+×l 0xd76c
+×m 0xd76d
+×n 0xd76e
+×o 0xd76f
+×p 0xd770
+×q 0xd771
+×r 0xd772
+×s 0xd773
+×t 0xd774
+×u 0xd775
+×v 0xd776
+×w 0xd777
+×x 0xd778
+×y 0xd779
+×z 0xd77a
+×{ 0xd77b
+×| 0xd77c
+×} 0xd77d
+×~ 0xd77e
+ס 0xd7a1
+×¢ 0xd7a2
+×£ 0xd7a3
+פ 0xd7a4
+×¥ 0xd7a5
+צ 0xd7a6
+ק 0xd7a7
+ר 0xd7a8
+ש 0xd7a9
+ת 0xd7aa
+׫ 0xd7ab
+׬ 0xd7ac
+×­ 0xd7ad
+×® 0xd7ae
+ׯ 0xd7af
+×° 0xd7b0
+×± 0xd7b1
+ײ 0xd7b2
+׳ 0xd7b3
+×´ 0xd7b4
+×µ 0xd7b5
+׶ 0xd7b6
+×· 0xd7b7
+׸ 0xd7b8
+×¹ 0xd7b9
+׺ 0xd7ba
+×» 0xd7bb
+×¼ 0xd7bc
+×½ 0xd7bd
+×¾ 0xd7be
+׿ 0xd7bf
+×À 0xd7c0
+×Á 0xd7c1
+× 0xd7c2
+×à 0xd7c3
+×Ä 0xd7c4
+×Å 0xd7c5
+×Æ 0xd7c6
+×Ç 0xd7c7
+×È 0xd7c8
+×É 0xd7c9
+×Ê 0xd7ca
+×Ë 0xd7cb
+×Ì 0xd7cc
+×Í 0xd7cd
+×Î 0xd7ce
+×Ï 0xd7cf
+×Ð 0xd7d0
+×Ñ 0xd7d1
+×Ò 0xd7d2
+×Ó 0xd7d3
+×Ô 0xd7d4
+×Õ 0xd7d5
+×Ö 0xd7d6
+×× 0xd7d7
+×Ø 0xd7d8
+×Ù 0xd7d9
+×Ú 0xd7da
+×Û 0xd7db
+×Ü 0xd7dc
+×Ý 0xd7dd
+×Þ 0xd7de
+×ß 0xd7df
+×à 0xd7e0
+×á 0xd7e1
+×â 0xd7e2
+×ã 0xd7e3
+×ä 0xd7e4
+×å 0xd7e5
+×æ 0xd7e6
+×ç 0xd7e7
+×è 0xd7e8
+×é 0xd7e9
+×ê 0xd7ea
+×ë 0xd7eb
+×ì 0xd7ec
+×í 0xd7ed
+×î 0xd7ee
+×ï 0xd7ef
+×ð 0xd7f0
+×ñ 0xd7f1
+×ò 0xd7f2
+×ó 0xd7f3
+×ô 0xd7f4
+×õ 0xd7f5
+×ö 0xd7f6
+×÷ 0xd7f7
+×ø 0xd7f8
+×ù 0xd7f9
+×ú 0xd7fa
+×û 0xd7fb
+×ü 0xd7fc
+×ý 0xd7fd
+×þ 0xd7fe
+Ø@ 0xd840
+ØA 0xd841
+ØB 0xd842
+ØC 0xd843
+ØD 0xd844
+ØE 0xd845
+ØF 0xd846
+ØG 0xd847
+ØH 0xd848
+ØI 0xd849
+ØJ 0xd84a
+ØK 0xd84b
+ØL 0xd84c
+ØM 0xd84d
+ØN 0xd84e
+ØO 0xd84f
+ØP 0xd850
+³Ã 0xb3c3
+³Ä 0xb3c4
+³Å 0xb3c5
+³Æ 0xb3c6
+³Ç 0xb3c7
+³È 0xb3c8
+³É 0xb3c9
+³Ê 0xb3ca
+³Ë 0xb3cb
+³Ì 0xb3cc
+³Í 0xb3cd
+³Î 0xb3ce
+³Ï 0xb3cf
+³Ð 0xb3d0
+³Ñ 0xb3d1
+³Ò 0xb3d2
+³Ó 0xb3d3
+³Ô 0xb3d4
+³Õ 0xb3d5
+³Ö 0xb3d6
+³× 0xb3d7
+³Ø 0xb3d8
+³Ù 0xb3d9
+³Ú 0xb3da
+³Û 0xb3db
+³Ü 0xb3dc
+³Ý 0xb3dd
+³Þ 0xb3de
+³ß 0xb3df
+³à 0xb3e0
+³á 0xb3e1
+³â 0xb3e2
+³ã 0xb3e3
+³ä 0xb3e4
+³å 0xb3e5
+³æ 0xb3e6
+³ç 0xb3e7
+³è 0xb3e8
+³é 0xb3e9
+³ê 0xb3ea
+³ë 0xb3eb
+³ì 0xb3ec
+³í 0xb3ed
+³î 0xb3ee
+³ï 0xb3ef
+³ð 0xb3f0
+³ñ 0xb3f1
+³ò 0xb3f2
+³ó 0xb3f3
+³ô 0xb3f4
+³õ 0xb3f5
+³ö 0xb3f6
+³÷ 0xb3f7
+³ø 0xb3f8
+³ù 0xb3f9
+³ú 0xb3fa
+³û 0xb3fb
+³ü 0xb3fc
+³ý 0xb3fd
+³þ 0xb3fe
+´@ 0xb440
+´A 0xb441
+´B 0xb442
+´C 0xb443
+´D 0xb444
+´E 0xb445
+´F 0xb446
+´G 0xb447
+´H 0xb448
+´I 0xb449
+´J 0xb44a
+´K 0xb44b
+´L 0xb44c
+´M 0xb44d
+´N 0xb44e
+´O 0xb44f
+´P 0xb450
+´Q 0xb451
+´R 0xb452
+´S 0xb453
+´T 0xb454
+´U 0xb455
+´V 0xb456
+´W 0xb457
+´X 0xb458
+´Y 0xb459
+´Z 0xb45a
+´[ 0xb45b
+´\ 0xb45c
+´] 0xb45d
+´^ 0xb45e
+´_ 0xb45f
+´` 0xb460
+´a 0xb461
+´b 0xb462
+´c 0xb463
+´d 0xb464
+´e 0xb465
+´f 0xb466
+´g 0xb467
+´h 0xb468
+´i 0xb469
+´j 0xb46a
+´k 0xb46b
+´l 0xb46c
+´m 0xb46d
+´n 0xb46e
+´o 0xb46f
+´p 0xb470
+´q 0xb471
+´r 0xb472
+´s 0xb473
+´t 0xb474
+´u 0xb475
+´v 0xb476
+´w 0xb477
+´x 0xb478
+´y 0xb479
+´z 0xb47a
+´{ 0xb47b
+´| 0xb47c
+´} 0xb47d
+´~ 0xb47e
+´¡ 0xb4a1
+´¢ 0xb4a2
+´£ 0xb4a3
+´¤ 0xb4a4
+´¥ 0xb4a5
+´¦ 0xb4a6
+´§ 0xb4a7
+´¨ 0xb4a8
+´© 0xb4a9
+´ª 0xb4aa
+´« 0xb4ab
+´¬ 0xb4ac
+´­ 0xb4ad
+´® 0xb4ae
+´¯ 0xb4af
+´° 0xb4b0
+´± 0xb4b1
+´² 0xb4b2
+´³ 0xb4b3
+´´ 0xb4b4
+´µ 0xb4b5
+´¶ 0xb4b6
+´· 0xb4b7
+´¸ 0xb4b8
+´¹ 0xb4b9
+´º 0xb4ba
+´» 0xb4bb
+´¼ 0xb4bc
+´½ 0xb4bd
+´¾ 0xb4be
+´¿ 0xb4bf
+´À 0xb4c0
+´Á 0xb4c1
+´Â 0xb4c2
+´Ã 0xb4c3
+´Ä 0xb4c4
+´Å 0xb4c5
+´Æ 0xb4c6
+´Ç 0xb4c7
+´È 0xb4c8
+´É 0xb4c9
+´Ê 0xb4ca
+´Ë 0xb4cb
+´Ì 0xb4cc
+´Í 0xb4cd
+´Î 0xb4ce
+´Ï 0xb4cf
+´Ð 0xb4d0
+´Ñ 0xb4d1
+´Ò 0xb4d2
+´Ó 0xb4d3
+´Ô 0xb4d4
+´Õ 0xb4d5
+´Ö 0xb4d6
+´× 0xb4d7
+´Ø 0xb4d8
+´Ù 0xb4d9
+´Ú 0xb4da
+´Û 0xb4db
+´Ü 0xb4dc
+´Ý 0xb4dd
+´Þ 0xb4de
+´ß 0xb4df
+´à 0xb4e0
+´á 0xb4e1
+´â 0xb4e2
+´ã 0xb4e3
+´ä 0xb4e4
+´å 0xb4e5
+´æ 0xb4e6
+´ç 0xb4e7
+´è 0xb4e8
+´é 0xb4e9
+´ê 0xb4ea
+´ë 0xb4eb
+´ì 0xb4ec
+´í 0xb4ed
+´î 0xb4ee
+´ï 0xb4ef
+´ð 0xb4f0
+´ñ 0xb4f1
+´ò 0xb4f2
+´ó 0xb4f3
+´ô 0xb4f4
+´õ 0xb4f5
+´ö 0xb4f6
+´÷ 0xb4f7
+´ø 0xb4f8
+´ù 0xb4f9
+´ú 0xb4fa
+´û 0xb4fb
+´ü 0xb4fc
+´ý 0xb4fd
+´þ 0xb4fe
+µ@ 0xb540
+µA 0xb541
+µB 0xb542
+µC 0xb543
+µD 0xb544
+µE 0xb545
+µF 0xb546
+µG 0xb547
+µH 0xb548
+µI 0xb549
+µJ 0xb54a
+µK 0xb54b
+µL 0xb54c
+µM 0xb54d
+µN 0xb54e
+µO 0xb54f
+µP 0xb550
+µQ 0xb551
+µR 0xb552
+µS 0xb553
+µT 0xb554
+µU 0xb555
+µV 0xb556
+µW 0xb557
+µX 0xb558
+µY 0xb559
+µZ 0xb55a
+µ[ 0xb55b
+µ\ 0xb55c
+µ] 0xb55d
+µ^ 0xb55e
+µ_ 0xb55f
+µ` 0xb560
+µa 0xb561
+µb 0xb562
+µc 0xb563
+µd 0xb564
+µe 0xb565
+µf 0xb566
+µg 0xb567
+µh 0xb568
+µi 0xb569
+µj 0xb56a
+µk 0xb56b
+µl 0xb56c
+µm 0xb56d
+µn 0xb56e
+µo 0xb56f
+µp 0xb570
+µq 0xb571
+µr 0xb572
+µs 0xb573
+µt 0xb574
+µu 0xb575
+µv 0xb576
+µw 0xb577
+µx 0xb578
+µy 0xb579
+µz 0xb57a
+µ{ 0xb57b
+µ| 0xb57c
+µ} 0xb57d
+µ~ 0xb57e
+µ¡ 0xb5a1
+µ¢ 0xb5a2
+µ£ 0xb5a3
+µ¤ 0xb5a4
+µ¥ 0xb5a5
+µ¦ 0xb5a6
+µ§ 0xb5a7
+µ¨ 0xb5a8
+µ© 0xb5a9
+µª 0xb5aa
+µ« 0xb5ab
+µ¬ 0xb5ac
+µ­ 0xb5ad
+µ® 0xb5ae
+µ¯ 0xb5af
+µ° 0xb5b0
+µ± 0xb5b1
+µ² 0xb5b2
+µ³ 0xb5b3
+µ´ 0xb5b4
+µµ 0xb5b5
+µ¶ 0xb5b6
+µ· 0xb5b7
+µ¸ 0xb5b8
+µ¹ 0xb5b9
+µº 0xb5ba
+µ» 0xb5bb
+µ¼ 0xb5bc
+µ½ 0xb5bd
+µ¾ 0xb5be
+µ¿ 0xb5bf
+µÀ 0xb5c0
+µÁ 0xb5c1
+µÂ 0xb5c2
+µÃ 0xb5c3
+µÄ 0xb5c4
+µÅ 0xb5c5
+µÆ 0xb5c6
+µÇ 0xb5c7
+µÈ 0xb5c8
+µÉ 0xb5c9
+µÊ 0xb5ca
+µË 0xb5cb
+µÌ 0xb5cc
+µÍ 0xb5cd
+µÎ 0xb5ce
+µÏ 0xb5cf
+µÐ 0xb5d0
+µÑ 0xb5d1
+µÒ 0xb5d2
+µÓ 0xb5d3
+µÔ 0xb5d4
+µÕ 0xb5d5
+µÖ 0xb5d6
+µ× 0xb5d7
+µØ 0xb5d8
+µÙ 0xb5d9
+µÚ 0xb5da
+µÛ 0xb5db
+µÜ 0xb5dc
+µÝ 0xb5dd
+µÞ 0xb5de
+µß 0xb5df
+µà 0xb5e0
+µá 0xb5e1
+µâ 0xb5e2
+µã 0xb5e3
+µä 0xb5e4
+µå 0xb5e5
+µæ 0xb5e6
+µç 0xb5e7
+µè 0xb5e8
+µé 0xb5e9
+µê 0xb5ea
+µë 0xb5eb
+µì 0xb5ec
+µí 0xb5ed
+µî 0xb5ee
+µï 0xb5ef
+µð 0xb5f0
+µñ 0xb5f1
+µò 0xb5f2
+µó 0xb5f3
+µô 0xb5f4
+µõ 0xb5f5
+µö 0xb5f6
+µ÷ 0xb5f7
+µø 0xb5f8
+µù 0xb5f9
+µú 0xb5fa
+µû 0xb5fb
+µü 0xb5fc
+µý 0xb5fd
+µþ 0xb5fe
+¶@ 0xb640
+¶A 0xb641
+¶B 0xb642
+¶C 0xb643
+¶D 0xb644
+¶E 0xb645
+¶F 0xb646
+¶G 0xb647
+¶H 0xb648
+¶I 0xb649
+¶J 0xb64a
+¶K 0xb64b
+¶L 0xb64c
+¶M 0xb64d
+¶N 0xb64e
+¶O 0xb64f
+¶P 0xb650
+¶Q 0xb651
+¶R 0xb652
+¶S 0xb653
+¶T 0xb654
+¶U 0xb655
+¶V 0xb656
+¶W 0xb657
+¶X 0xb658
+¶Y 0xb659
+¶Z 0xb65a
+¶[ 0xb65b
+¶\ 0xb65c
+¶] 0xb65d
+¶^ 0xb65e
+¶_ 0xb65f
+¶` 0xb660
+¶a 0xb661
+¶b 0xb662
+¶c 0xb663
+¶d 0xb664
+¶e 0xb665
+¶f 0xb666
+¶g 0xb667
+¶h 0xb668
+¶i 0xb669
+¶j 0xb66a
+¶k 0xb66b
+¶l 0xb66c
+¶m 0xb66d
+¶n 0xb66e
+¶o 0xb66f
+¶p 0xb670
+¶q 0xb671
+¶r 0xb672
+¶s 0xb673
+¶t 0xb674
+¶u 0xb675
+¶v 0xb676
+¶w 0xb677
+¶x 0xb678
+¶y 0xb679
+¶z 0xb67a
+¶{ 0xb67b
+¶| 0xb67c
+¶} 0xb67d
+¶~ 0xb67e
+¶¡ 0xb6a1
+¶¢ 0xb6a2
+¶£ 0xb6a3
+¶¤ 0xb6a4
+¶¥ 0xb6a5
+¶¦ 0xb6a6
+¶§ 0xb6a7
+¶¨ 0xb6a8
+¶© 0xb6a9
+¶ª 0xb6aa
+¶« 0xb6ab
+¶¬ 0xb6ac
+¶­ 0xb6ad
+¶® 0xb6ae
+¶¯ 0xb6af
+¶° 0xb6b0
+¶± 0xb6b1
+¶² 0xb6b2
+¶³ 0xb6b3
+¶´ 0xb6b4
+¶µ 0xb6b5
+¶¶ 0xb6b6
+¶· 0xb6b7
+¶¸ 0xb6b8
+¶¹ 0xb6b9
+¶º 0xb6ba
+¶» 0xb6bb
+¶¼ 0xb6bc
+¶½ 0xb6bd
+¶¾ 0xb6be
+¶¿ 0xb6bf
+¶À 0xb6c0
+¶Á 0xb6c1
+¶Â 0xb6c2
+ØQ 0xd851
+ØR 0xd852
+ØS 0xd853
+ØT 0xd854
+ØU 0xd855
+ØV 0xd856
+ØW 0xd857
+ØX 0xd858
+ØY 0xd859
+ØZ 0xd85a
+Ø[ 0xd85b
+Ø\ 0xd85c
+Ø] 0xd85d
+Ø^ 0xd85e
+Ø_ 0xd85f
+Ø` 0xd860
+Øa 0xd861
+Øb 0xd862
+Øc 0xd863
+Ød 0xd864
+Øe 0xd865
+Øf 0xd866
+Øg 0xd867
+Øh 0xd868
+Øi 0xd869
+Øj 0xd86a
+Øk 0xd86b
+Øl 0xd86c
+Øm 0xd86d
+Øn 0xd86e
+Øo 0xd86f
+Øp 0xd870
+Øq 0xd871
+Ør 0xd872
+Øs 0xd873
+Øt 0xd874
+Øu 0xd875
+Øv 0xd876
+Øw 0xd877
+Øx 0xd878
+Øy 0xd879
+Øz 0xd87a
+Ø{ 0xd87b
+Ø| 0xd87c
+Ø} 0xd87d
+Ø~ 0xd87e
+Ø¡ 0xd8a1
+Ø¢ 0xd8a2
+Ø£ 0xd8a3
+ؤ 0xd8a4
+Ø¥ 0xd8a5
+ئ 0xd8a6
+ا 0xd8a7
+ب 0xd8a8
+Ø© 0xd8a9
+ت 0xd8aa
+Ø« 0xd8ab
+ج 0xd8ac
+Ø­ 0xd8ad
+Ø® 0xd8ae
+د 0xd8af
+Ø° 0xd8b0
+ر 0xd8b1
+ز 0xd8b2
+س 0xd8b3
+Ø´ 0xd8b4
+ص 0xd8b5
+ض 0xd8b6
+Ø· 0xd8b7
+ظ 0xd8b8
+ع 0xd8b9
+غ 0xd8ba
+Ø» 0xd8bb
+ؼ 0xd8bc
+ؽ 0xd8bd
+ؾ 0xd8be
+Ø¿ 0xd8bf
+ØÀ 0xd8c0
+ØÁ 0xd8c1
+ØÂ 0xd8c2
+ØÃ 0xd8c3
+ØÄ 0xd8c4
+ØÅ 0xd8c5
+ØÆ 0xd8c6
+ØÇ 0xd8c7
+ØÈ 0xd8c8
+ØÉ 0xd8c9
+ØÊ 0xd8ca
+ØË 0xd8cb
+ØÌ 0xd8cc
+ØÍ 0xd8cd
+ØÎ 0xd8ce
+ØÏ 0xd8cf
+ØÐ 0xd8d0
+ØÑ 0xd8d1
+ØÒ 0xd8d2
+ØÓ 0xd8d3
+ØÔ 0xd8d4
+ØÕ 0xd8d5
+ØÖ 0xd8d6
+Ø× 0xd8d7
+ØØ 0xd8d8
+ØÙ 0xd8d9
+ØÚ 0xd8da
+ØÛ 0xd8db
+ØÜ 0xd8dc
+ØÝ 0xd8dd
+ØÞ 0xd8de
+Øß 0xd8df
+Øà 0xd8e0
+Øá 0xd8e1
+Øâ 0xd8e2
+Øã 0xd8e3
+Øä 0xd8e4
+Øå 0xd8e5
+Øæ 0xd8e6
+Øç 0xd8e7
+Øè 0xd8e8
+Øé 0xd8e9
+Øê 0xd8ea
+Øë 0xd8eb
+Øì 0xd8ec
+Øí 0xd8ed
+Øî 0xd8ee
+Øï 0xd8ef
+Øð 0xd8f0
+Øñ 0xd8f1
+Øò 0xd8f2
+Øó 0xd8f3
+Øô 0xd8f4
+Øõ 0xd8f5
+Øö 0xd8f6
+Ø÷ 0xd8f7
+Øø 0xd8f8
+Øù 0xd8f9
+Øú 0xd8fa
+Øû 0xd8fb
+Øü 0xd8fc
+Øý 0xd8fd
+Øþ 0xd8fe
+Ù@ 0xd940
+ÙA 0xd941
+ÙB 0xd942
+ÙC 0xd943
+ÙD 0xd944
+ÙE 0xd945
+ÙF 0xd946
+ÙG 0xd947
+ÙH 0xd948
+ÙI 0xd949
+ÙJ 0xd94a
+ÙK 0xd94b
+ÙL 0xd94c
+ÙM 0xd94d
+ÙN 0xd94e
+ÙO 0xd94f
+ÙP 0xd950
+ÙQ 0xd951
+ÙR 0xd952
+ÙS 0xd953
+ÙT 0xd954
+ÙU 0xd955
+ÙV 0xd956
+ÙW 0xd957
+ÙX 0xd958
+ÙY 0xd959
+ÙZ 0xd95a
+Ù[ 0xd95b
+Ù\ 0xd95c
+Ù] 0xd95d
+Ù^ 0xd95e
+Ù_ 0xd95f
+Ù` 0xd960
+Ùa 0xd961
+Ùb 0xd962
+Ùc 0xd963
+Ùd 0xd964
+Ùe 0xd965
+Ùf 0xd966
+Ùg 0xd967
+Ùh 0xd968
+Ùi 0xd969
+Ùj 0xd96a
+Ùk 0xd96b
+Ùl 0xd96c
+Ùm 0xd96d
+Ùn 0xd96e
+Ùo 0xd96f
+Ùp 0xd970
+Ùq 0xd971
+Ùr 0xd972
+Ùs 0xd973
+Ùt 0xd974
+Ùu 0xd975
+Ùv 0xd976
+Ùw 0xd977
+Ùx 0xd978
+Ùy 0xd979
+Ùz 0xd97a
+Ù{ 0xd97b
+Ù| 0xd97c
+Ù} 0xd97d
+Ù~ 0xd97e
+Ù¡ 0xd9a1
+Ù¢ 0xd9a2
+Ù£ 0xd9a3
+Ù¤ 0xd9a4
+Ù¥ 0xd9a5
+Ù¦ 0xd9a6
+Ù§ 0xd9a7
+Ù¨ 0xd9a8
+Ù© 0xd9a9
+Ùª 0xd9aa
+Ù« 0xd9ab
+Ù¬ 0xd9ac
+Ù­ 0xd9ad
+Ù® 0xd9ae
+Ù¯ 0xd9af
+Ù° 0xd9b0
+Ù± 0xd9b1
+Ù² 0xd9b2
+Ù³ 0xd9b3
+Ù´ 0xd9b4
+Ùµ 0xd9b5
+Ù¶ 0xd9b6
+Ù· 0xd9b7
+Ù¸ 0xd9b8
+Ù¹ 0xd9b9
+Ùº 0xd9ba
+Ù» 0xd9bb
+Ù¼ 0xd9bc
+Ù½ 0xd9bd
+Ù¾ 0xd9be
+Ù¿ 0xd9bf
+ÙÀ 0xd9c0
+ÙÁ 0xd9c1
+ÙÂ 0xd9c2
+ÙÃ 0xd9c3
+ÙÄ 0xd9c4
+ÙÅ 0xd9c5
+ÙÆ 0xd9c6
+ÙÇ 0xd9c7
+ÙÈ 0xd9c8
+ÙÉ 0xd9c9
+ÙÊ 0xd9ca
+ÙË 0xd9cb
+ÙÌ 0xd9cc
+ÙÍ 0xd9cd
+ÙÎ 0xd9ce
+ÙÏ 0xd9cf
+ÙÐ 0xd9d0
+ÙÑ 0xd9d1
+ÙÒ 0xd9d2
+ÙÓ 0xd9d3
+ÙÔ 0xd9d4
+ÙÕ 0xd9d5
+ÙÖ 0xd9d6
+Ù× 0xd9d7
+ÙØ 0xd9d8
+ÙÙ 0xd9d9
+ÙÚ 0xd9da
+ÙÛ 0xd9db
+ÙÜ 0xd9dc
+ÙÝ 0xd9dd
+ÙÞ 0xd9de
+Ùß 0xd9df
+Ùà 0xd9e0
+Ùá 0xd9e1
+Ùâ 0xd9e2
+Ùã 0xd9e3
+Ùä 0xd9e4
+Ùå 0xd9e5
+Ùæ 0xd9e6
+Ùç 0xd9e7
+Ùè 0xd9e8
+Ùé 0xd9e9
+Ùê 0xd9ea
+Ùë 0xd9eb
+Ùì 0xd9ec
+Ùí 0xd9ed
+Ùî 0xd9ee
+Ùï 0xd9ef
+Ùð 0xd9f0
+Ùñ 0xd9f1
+Ùò 0xd9f2
+Ùó 0xd9f3
+Ùô 0xd9f4
+Ùõ 0xd9f5
+Ùö 0xd9f6
+Ù÷ 0xd9f7
+Ùø 0xd9f8
+Ùù 0xd9f9
+Ùú 0xd9fa
+Ùû 0xd9fb
+Ùü 0xd9fc
+Ùý 0xd9fd
+Ùþ 0xd9fe
+Ú@ 0xda40
+ÚA 0xda41
+ÚB 0xda42
+ÚC 0xda43
+ÚD 0xda44
+ÚE 0xda45
+ÚF 0xda46
+ÚG 0xda47
+ÚH 0xda48
+ÚI 0xda49
+ÚJ 0xda4a
+ÚK 0xda4b
+ÚL 0xda4c
+ÚM 0xda4d
+ÚN 0xda4e
+ÚO 0xda4f
+ÚP 0xda50
+ÚQ 0xda51
+ÚR 0xda52
+ÚS 0xda53
+ÚT 0xda54
+ÚU 0xda55
+ÚV 0xda56
+ÚW 0xda57
+ÚX 0xda58
+ÚY 0xda59
+ÚZ 0xda5a
+Ú[ 0xda5b
+Ú\ 0xda5c
+Ú] 0xda5d
+Ú^ 0xda5e
+Ú_ 0xda5f
+Ú` 0xda60
+Úa 0xda61
+Úb 0xda62
+Úc 0xda63
+Úd 0xda64
+Úe 0xda65
+Úf 0xda66
+Úg 0xda67
+Úh 0xda68
+Úi 0xda69
+Új 0xda6a
+Úk 0xda6b
+Úl 0xda6c
+Úm 0xda6d
+Ún 0xda6e
+Úo 0xda6f
+Úp 0xda70
+Úq 0xda71
+Úr 0xda72
+Ús 0xda73
+Út 0xda74
+Úu 0xda75
+Úv 0xda76
+Úw 0xda77
+Úx 0xda78
+Úy 0xda79
+Úz 0xda7a
+Ú{ 0xda7b
+Ú| 0xda7c
+Ú} 0xda7d
+Ú~ 0xda7e
+Ú¡ 0xdaa1
+Ú¢ 0xdaa2
+Ú£ 0xdaa3
+Ú¤ 0xdaa4
+Ú¥ 0xdaa5
+Ú¦ 0xdaa6
+Ú§ 0xdaa7
+Ú¨ 0xdaa8
+Ú© 0xdaa9
+Úª 0xdaaa
+Ú« 0xdaab
+Ú¬ 0xdaac
+Ú­ 0xdaad
+Ú® 0xdaae
+Ú¯ 0xdaaf
+Ú° 0xdab0
+Ú± 0xdab1
+Ú² 0xdab2
+Ú³ 0xdab3
+Ú´ 0xdab4
+Úµ 0xdab5
+Ú¶ 0xdab6
+Ú· 0xdab7
+Ú¸ 0xdab8
+Ú¹ 0xdab9
+Úº 0xdaba
+Ú» 0xdabb
+Ú¼ 0xdabc
+Ú½ 0xdabd
+Ú¾ 0xdabe
+Ú¿ 0xdabf
+ÚÀ 0xdac0
+ÚÁ 0xdac1
+ÚÂ 0xdac2
+ÚÃ 0xdac3
+ÚÄ 0xdac4
+ÚÅ 0xdac5
+ÚÆ 0xdac6
+ÚÇ 0xdac7
+ÚÈ 0xdac8
+ÚÉ 0xdac9
+ÚÊ 0xdaca
+ÚË 0xdacb
+ÚÌ 0xdacc
+ÚÍ 0xdacd
+ÚÎ 0xdace
+ÚÏ 0xdacf
+ÚÐ 0xdad0
+ÚÑ 0xdad1
+ÚÒ 0xdad2
+ÚÓ 0xdad3
+ÚÔ 0xdad4
+ÚÕ 0xdad5
+ÚÖ 0xdad6
+Ú× 0xdad7
+ÚØ 0xdad8
+ÚÙ 0xdad9
+ÚÚ 0xdada
+ÚÛ 0xdadb
+ÚÜ 0xdadc
+ÚÝ 0xdadd
+ÚÞ 0xdade
+Úß 0xdadf
+Úà 0xdae0
+Úá 0xdae1
+Úâ 0xdae2
+Úã 0xdae3
+Úä 0xdae4
+Úå 0xdae5
+Úæ 0xdae6
+Úç 0xdae7
+Úè 0xdae8
+Úé 0xdae9
+Úê 0xdaea
+Úë 0xdaeb
+Úì 0xdaec
+Úí 0xdaed
+Úî 0xdaee
+Úï 0xdaef
+Úð 0xdaf0
+Úñ 0xdaf1
+Úò 0xdaf2
+Úó 0xdaf3
+Úô 0xdaf4
+Úõ 0xdaf5
+Úö 0xdaf6
+Ú÷ 0xdaf7
+Úø 0xdaf8
+Úù 0xdaf9
+Úú 0xdafa
+Úû 0xdafb
+Úü 0xdafc
+Úý 0xdafd
+Úþ 0xdafe
+Û@ 0xdb40
+ÛA 0xdb41
+ÛB 0xdb42
+ÛC 0xdb43
+ÛD 0xdb44
+ÛE 0xdb45
+ÛF 0xdb46
+ÛG 0xdb47
+ÛH 0xdb48
+ÛI 0xdb49
+ÛJ 0xdb4a
+ÛK 0xdb4b
+ÛL 0xdb4c
+ÛM 0xdb4d
+ÛN 0xdb4e
+ÛO 0xdb4f
+ÛP 0xdb50
+ÛQ 0xdb51
+ÛR 0xdb52
+ÛS 0xdb53
+ÛT 0xdb54
+ÛU 0xdb55
+ÛV 0xdb56
+ÛW 0xdb57
+ÛX 0xdb58
+ÛY 0xdb59
+ÛZ 0xdb5a
+Û[ 0xdb5b
+Û\ 0xdb5c
+Û] 0xdb5d
+Û^ 0xdb5e
+Û_ 0xdb5f
+Û` 0xdb60
+Ûa 0xdb61
+Ûb 0xdb62
+Ûc 0xdb63
+Ûd 0xdb64
+Ûe 0xdb65
+Ûf 0xdb66
+Ûg 0xdb67
+Ûh 0xdb68
+Ûi 0xdb69
+Ûj 0xdb6a
+Ûk 0xdb6b
+Ûl 0xdb6c
+Ûm 0xdb6d
+Ûn 0xdb6e
+Ûo 0xdb6f
+Ûp 0xdb70
+Ûq 0xdb71
+Ûr 0xdb72
+Ûs 0xdb73
+Ût 0xdb74
+Ûu 0xdb75
+Ûv 0xdb76
+Ûw 0xdb77
+Ûx 0xdb78
+Ûy 0xdb79
+Ûz 0xdb7a
+Û{ 0xdb7b
+Û| 0xdb7c
+Û} 0xdb7d
+Û~ 0xdb7e
+Û¡ 0xdba1
+Û¢ 0xdba2
+Û£ 0xdba3
+Û¤ 0xdba4
+Û¥ 0xdba5
+Û¦ 0xdba6
+Û§ 0xdba7
+Û¨ 0xdba8
+Û© 0xdba9
+Ûª 0xdbaa
+Û« 0xdbab
+Û¬ 0xdbac
+Û­ 0xdbad
+Û® 0xdbae
+Û¯ 0xdbaf
+Û° 0xdbb0
+Û± 0xdbb1
+Û² 0xdbb2
+Û³ 0xdbb3
+Û´ 0xdbb4
+Ûµ 0xdbb5
+Û¶ 0xdbb6
+Û· 0xdbb7
+Û¸ 0xdbb8
+Û¹ 0xdbb9
+Ûº 0xdbba
+Û» 0xdbbb
+Û¼ 0xdbbc
+Û½ 0xdbbd
+Û¾ 0xdbbe
+Û¿ 0xdbbf
+ÛÀ 0xdbc0
+ÛÁ 0xdbc1
+ÛÂ 0xdbc2
+ÛÃ 0xdbc3
+ÛÄ 0xdbc4
+ÛÅ 0xdbc5
+ÛÆ 0xdbc6
+ÛÇ 0xdbc7
+ÛÈ 0xdbc8
+ÛÉ 0xdbc9
+ÛÊ 0xdbca
+ÛË 0xdbcb
+ÛÌ 0xdbcc
+ÛÍ 0xdbcd
+ÛÎ 0xdbce
+ÛÏ 0xdbcf
+ÛÐ 0xdbd0
+ÛÑ 0xdbd1
+ÛÒ 0xdbd2
+ÛÓ 0xdbd3
+ÛÔ 0xdbd4
+ÛÕ 0xdbd5
+ÛÖ 0xdbd6
+Û× 0xdbd7
+ÛØ 0xdbd8
+ÛÙ 0xdbd9
+ÛÚ 0xdbda
+ÛÛ 0xdbdb
+ÛÜ 0xdbdc
+ÛÝ 0xdbdd
+ÛÞ 0xdbde
+Ûß 0xdbdf
+Ûà 0xdbe0
+Ûá 0xdbe1
+Ûâ 0xdbe2
+Ûã 0xdbe3
+Ûä 0xdbe4
+Ûå 0xdbe5
+Ûæ 0xdbe6
+Ûç 0xdbe7
+Ûè 0xdbe8
+Ûé 0xdbe9
+Ûê 0xdbea
+Ûë 0xdbeb
+Ûì 0xdbec
+Ûí 0xdbed
+Ûî 0xdbee
+Ûï 0xdbef
+Ûð 0xdbf0
+Ûñ 0xdbf1
+Ûò 0xdbf2
+Ûó 0xdbf3
+Ûô 0xdbf4
+Ûõ 0xdbf5
+Ûö 0xdbf6
+Û÷ 0xdbf7
+Ûø 0xdbf8
+Ûù 0xdbf9
+Ûú 0xdbfa
+Ûû 0xdbfb
+Ûü 0xdbfc
+Ûý 0xdbfd
+Ûþ 0xdbfe
+Ü@ 0xdc40
+ÜA 0xdc41
+ÜB 0xdc42
+ÜC 0xdc43
+ÜD 0xdc44
+ÜE 0xdc45
+ÜF 0xdc46
+ÜG 0xdc47
+ÜH 0xdc48
+ÜI 0xdc49
+ÜJ 0xdc4a
+ÜK 0xdc4b
+ÜL 0xdc4c
+ÜM 0xdc4d
+ÜN 0xdc4e
+ÜO 0xdc4f
+ÜP 0xdc50
+ÜQ 0xdc51
+ÜR 0xdc52
+ÜS 0xdc53
+ÜT 0xdc54
+ÜU 0xdc55
+ÜV 0xdc56
+ÜW 0xdc57
+ÜX 0xdc58
+ÜY 0xdc59
+ÜZ 0xdc5a
+Ü[ 0xdc5b
+Ü\ 0xdc5c
+Ü] 0xdc5d
+Ü^ 0xdc5e
+Ü_ 0xdc5f
+Ü` 0xdc60
+Üa 0xdc61
+Üb 0xdc62
+Üc 0xdc63
+Üd 0xdc64
+Üe 0xdc65
+Üf 0xdc66
+Üg 0xdc67
+Üh 0xdc68
+Üi 0xdc69
+Üj 0xdc6a
+Ük 0xdc6b
+Ül 0xdc6c
+Üm 0xdc6d
+Ün 0xdc6e
+Üo 0xdc6f
+Üp 0xdc70
+Üq 0xdc71
+Ür 0xdc72
+Üs 0xdc73
+Üt 0xdc74
+Üu 0xdc75
+Üv 0xdc76
+Üw 0xdc77
+Üx 0xdc78
+Üy 0xdc79
+Üz 0xdc7a
+Ü{ 0xdc7b
+Ü| 0xdc7c
+Ü} 0xdc7d
+Ü~ 0xdc7e
+Ü¡ 0xdca1
+Ü¢ 0xdca2
+Ü£ 0xdca3
+ܤ 0xdca4
+Ü¥ 0xdca5
+ܦ 0xdca6
+ܧ 0xdca7
+ܨ 0xdca8
+Ü© 0xdca9
+ܪ 0xdcaa
+Ü« 0xdcab
+ܬ 0xdcac
+Ü­ 0xdcad
+Ü® 0xdcae
+ܯ 0xdcaf
+Ü° 0xdcb0
+¶Ã 0xb6c3
+¶Ä 0xb6c4
+¶Å 0xb6c5
+¶Æ 0xb6c6
+¶Ç 0xb6c7
+¶È 0xb6c8
+¶É 0xb6c9
+¶Ê 0xb6ca
+¶Ë 0xb6cb
+¶Ì 0xb6cc
+¶Í 0xb6cd
+¶Î 0xb6ce
+¶Ï 0xb6cf
+¶Ð 0xb6d0
+¶Ñ 0xb6d1
+¶Ò 0xb6d2
+¶Ó 0xb6d3
+¶Ô 0xb6d4
+¶Õ 0xb6d5
+¶Ö 0xb6d6
+¶× 0xb6d7
+¶Ø 0xb6d8
+¶Ù 0xb6d9
+¶Ú 0xb6da
+¶Û 0xb6db
+¶Ü 0xb6dc
+¶Ý 0xb6dd
+¶Þ 0xb6de
+¶ß 0xb6df
+¶à 0xb6e0
+¶á 0xb6e1
+¶â 0xb6e2
+¶ã 0xb6e3
+¶ä 0xb6e4
+¶å 0xb6e5
+¶æ 0xb6e6
+¶ç 0xb6e7
+¶è 0xb6e8
+¶é 0xb6e9
+¶ê 0xb6ea
+¶ë 0xb6eb
+¶ì 0xb6ec
+¶í 0xb6ed
+¶î 0xb6ee
+¶ï 0xb6ef
+¶ð 0xb6f0
+¶ñ 0xb6f1
+¶ò 0xb6f2
+¶ó 0xb6f3
+¶ô 0xb6f4
+¶õ 0xb6f5
+¶ö 0xb6f6
+¶÷ 0xb6f7
+¶ø 0xb6f8
+¶ù 0xb6f9
+¶ú 0xb6fa
+¶û 0xb6fb
+¶ü 0xb6fc
+¶ý 0xb6fd
+¶þ 0xb6fe
+·@ 0xb740
+·A 0xb741
+·B 0xb742
+·C 0xb743
+·D 0xb744
+·E 0xb745
+·F 0xb746
+·G 0xb747
+·H 0xb748
+·I 0xb749
+·J 0xb74a
+·K 0xb74b
+·L 0xb74c
+·M 0xb74d
+·N 0xb74e
+·O 0xb74f
+·P 0xb750
+·Q 0xb751
+·R 0xb752
+·S 0xb753
+·T 0xb754
+·U 0xb755
+·V 0xb756
+·W 0xb757
+·X 0xb758
+·Y 0xb759
+·Z 0xb75a
+·[ 0xb75b
+·\ 0xb75c
+·] 0xb75d
+·^ 0xb75e
+·_ 0xb75f
+·` 0xb760
+·a 0xb761
+·b 0xb762
+·c 0xb763
+·d 0xb764
+·e 0xb765
+·f 0xb766
+·g 0xb767
+·h 0xb768
+·i 0xb769
+·j 0xb76a
+·k 0xb76b
+·l 0xb76c
+·m 0xb76d
+·n 0xb76e
+·o 0xb76f
+·p 0xb770
+·q 0xb771
+·r 0xb772
+·s 0xb773
+·t 0xb774
+·u 0xb775
+·v 0xb776
+·w 0xb777
+·x 0xb778
+·y 0xb779
+·z 0xb77a
+·{ 0xb77b
+·| 0xb77c
+·} 0xb77d
+·~ 0xb77e
+·¡ 0xb7a1
+·¢ 0xb7a2
+·£ 0xb7a3
+·¤ 0xb7a4
+·¥ 0xb7a5
+·¦ 0xb7a6
+·§ 0xb7a7
+·¨ 0xb7a8
+·© 0xb7a9
+·ª 0xb7aa
+·« 0xb7ab
+·¬ 0xb7ac
+·­ 0xb7ad
+·® 0xb7ae
+·¯ 0xb7af
+·° 0xb7b0
+·± 0xb7b1
+·² 0xb7b2
+·³ 0xb7b3
+·´ 0xb7b4
+·µ 0xb7b5
+·¶ 0xb7b6
+·· 0xb7b7
+·¸ 0xb7b8
+·¹ 0xb7b9
+·º 0xb7ba
+·» 0xb7bb
+·¼ 0xb7bc
+·½ 0xb7bd
+·¾ 0xb7be
+·¿ 0xb7bf
+·À 0xb7c0
+·Á 0xb7c1
+·Â 0xb7c2
+·Ã 0xb7c3
+·Ä 0xb7c4
+·Å 0xb7c5
+·Æ 0xb7c6
+·Ç 0xb7c7
+·È 0xb7c8
+·É 0xb7c9
+·Ê 0xb7ca
+·Ë 0xb7cb
+·Ì 0xb7cc
+·Í 0xb7cd
+·Î 0xb7ce
+·Ï 0xb7cf
+·Ð 0xb7d0
+·Ñ 0xb7d1
+·Ò 0xb7d2
+·Ó 0xb7d3
+·Ô 0xb7d4
+·Õ 0xb7d5
+·Ö 0xb7d6
+·× 0xb7d7
+·Ø 0xb7d8
+·Ù 0xb7d9
+·Ú 0xb7da
+·Û 0xb7db
+·Ü 0xb7dc
+·Ý 0xb7dd
+·Þ 0xb7de
+·ß 0xb7df
+·à 0xb7e0
+·á 0xb7e1
+·â 0xb7e2
+·ã 0xb7e3
+·ä 0xb7e4
+·å 0xb7e5
+·æ 0xb7e6
+·ç 0xb7e7
+·è 0xb7e8
+·é 0xb7e9
+·ê 0xb7ea
+·ë 0xb7eb
+·ì 0xb7ec
+·í 0xb7ed
+·î 0xb7ee
+·ï 0xb7ef
+·ð 0xb7f0
+·ñ 0xb7f1
+·ò 0xb7f2
+·ó 0xb7f3
+·ô 0xb7f4
+·õ 0xb7f5
+·ö 0xb7f6
+·÷ 0xb7f7
+·ø 0xb7f8
+·ù 0xb7f9
+·ú 0xb7fa
+·û 0xb7fb
+·ü 0xb7fc
+·ý 0xb7fd
+·þ 0xb7fe
+¸@ 0xb840
+¸A 0xb841
+¸B 0xb842
+¸C 0xb843
+¸D 0xb844
+¸E 0xb845
+¸F 0xb846
+¸G 0xb847
+¸H 0xb848
+¸I 0xb849
+¸J 0xb84a
+¸K 0xb84b
+¸L 0xb84c
+¸M 0xb84d
+¸N 0xb84e
+¸O 0xb84f
+¸P 0xb850
+¸Q 0xb851
+¸R 0xb852
+¸S 0xb853
+¸T 0xb854
+¸U 0xb855
+¸V 0xb856
+¸W 0xb857
+¸X 0xb858
+¸Y 0xb859
+¸Z 0xb85a
+¸[ 0xb85b
+¸\ 0xb85c
+¸] 0xb85d
+¸^ 0xb85e
+¸_ 0xb85f
+¸` 0xb860
+¸a 0xb861
+¸b 0xb862
+¸c 0xb863
+¸d 0xb864
+¸e 0xb865
+¸f 0xb866
+¸g 0xb867
+¸h 0xb868
+¸i 0xb869
+¸j 0xb86a
+¸k 0xb86b
+¸l 0xb86c
+¸m 0xb86d
+¸n 0xb86e
+¸o 0xb86f
+¸p 0xb870
+¸q 0xb871
+¸r 0xb872
+¸s 0xb873
+¸t 0xb874
+¸u 0xb875
+¸v 0xb876
+¸w 0xb877
+¸x 0xb878
+¸y 0xb879
+¸z 0xb87a
+¸{ 0xb87b
+¸| 0xb87c
+¸} 0xb87d
+¸~ 0xb87e
+¸¡ 0xb8a1
+¸¢ 0xb8a2
+¸£ 0xb8a3
+¸¤ 0xb8a4
+¸¥ 0xb8a5
+¸¦ 0xb8a6
+¸§ 0xb8a7
+¸¨ 0xb8a8
+¸© 0xb8a9
+¸ª 0xb8aa
+¸« 0xb8ab
+¸¬ 0xb8ac
+¸­ 0xb8ad
+¸® 0xb8ae
+¸¯ 0xb8af
+¸° 0xb8b0
+¸± 0xb8b1
+¸² 0xb8b2
+¸³ 0xb8b3
+¸´ 0xb8b4
+¸µ 0xb8b5
+¸¶ 0xb8b6
+¸· 0xb8b7
+¸¸ 0xb8b8
+¸¹ 0xb8b9
+¸º 0xb8ba
+¸» 0xb8bb
+¸¼ 0xb8bc
+¸½ 0xb8bd
+¸¾ 0xb8be
+¸¿ 0xb8bf
+¸À 0xb8c0
+¸Á 0xb8c1
+¸Â 0xb8c2
+¸Ã 0xb8c3
+¸Ä 0xb8c4
+¸Å 0xb8c5
+¸Æ 0xb8c6
+¸Ç 0xb8c7
+¸È 0xb8c8
+¸É 0xb8c9
+¸Ê 0xb8ca
+¸Ë 0xb8cb
+¸Ì 0xb8cc
+¸Í 0xb8cd
+¸Î 0xb8ce
+¸Ï 0xb8cf
+¸Ð 0xb8d0
+¸Ñ 0xb8d1
+¸Ò 0xb8d2
+¸Ó 0xb8d3
+¸Ô 0xb8d4
+¸Õ 0xb8d5
+¸Ö 0xb8d6
+¸× 0xb8d7
+¸Ø 0xb8d8
+¸Ù 0xb8d9
+¸Ú 0xb8da
+¸Û 0xb8db
+¸Ü 0xb8dc
+¸Ý 0xb8dd
+¸Þ 0xb8de
+¸ß 0xb8df
+¸à 0xb8e0
+¸á 0xb8e1
+¸â 0xb8e2
+¸ã 0xb8e3
+¸ä 0xb8e4
+¸å 0xb8e5
+¸æ 0xb8e6
+¸ç 0xb8e7
+¸è 0xb8e8
+¸é 0xb8e9
+¸ê 0xb8ea
+¸ë 0xb8eb
+¸ì 0xb8ec
+¸í 0xb8ed
+¸î 0xb8ee
+¸ï 0xb8ef
+¸ð 0xb8f0
+¸ñ 0xb8f1
+¸ò 0xb8f2
+¸ó 0xb8f3
+¸ô 0xb8f4
+¸õ 0xb8f5
+¸ö 0xb8f6
+¸÷ 0xb8f7
+¸ø 0xb8f8
+¸ù 0xb8f9
+¸ú 0xb8fa
+¸û 0xb8fb
+¸ü 0xb8fc
+¸ý 0xb8fd
+¸þ 0xb8fe
+¹@ 0xb940
+¹A 0xb941
+¹B 0xb942
+¹C 0xb943
+¹D 0xb944
+¹E 0xb945
+¹F 0xb946
+¹G 0xb947
+¹H 0xb948
+¹I 0xb949
+¹J 0xb94a
+¹K 0xb94b
+¹L 0xb94c
+¹M 0xb94d
+¹N 0xb94e
+¹O 0xb94f
+¹P 0xb950
+¹Q 0xb951
+¹R 0xb952
+¹S 0xb953
+¹T 0xb954
+¹U 0xb955
+¹V 0xb956
+¹W 0xb957
+¹X 0xb958
+¹Y 0xb959
+¹Z 0xb95a
+¹[ 0xb95b
+¹\ 0xb95c
+¹] 0xb95d
+¹^ 0xb95e
+¹_ 0xb95f
+¹` 0xb960
+¹a 0xb961
+¹b 0xb962
+¹c 0xb963
+¹d 0xb964
+¹e 0xb965
+¹f 0xb966
+¹g 0xb967
+¹h 0xb968
+¹i 0xb969
+¹j 0xb96a
+¹k 0xb96b
+¹l 0xb96c
+¹m 0xb96d
+¹n 0xb96e
+¹o 0xb96f
+¹p 0xb970
+¹q 0xb971
+¹r 0xb972
+¹s 0xb973
+¹t 0xb974
+¹u 0xb975
+¹v 0xb976
+¹w 0xb977
+¹x 0xb978
+¹y 0xb979
+¹z 0xb97a
+¹{ 0xb97b
+¹| 0xb97c
+¹} 0xb97d
+¹~ 0xb97e
+¹¡ 0xb9a1
+¹¢ 0xb9a2
+¹£ 0xb9a3
+¹¤ 0xb9a4
+¹¥ 0xb9a5
+¹¦ 0xb9a6
+¹§ 0xb9a7
+¹¨ 0xb9a8
+¹© 0xb9a9
+¹ª 0xb9aa
+¹« 0xb9ab
+ܱ 0xdcb1
+ܲ 0xdcb2
+ܳ 0xdcb3
+Ü´ 0xdcb4
+ܵ 0xdcb5
+ܶ 0xdcb6
+Ü· 0xdcb7
+ܸ 0xdcb8
+ܹ 0xdcb9
+ܺ 0xdcba
+Ü» 0xdcbb
+ܼ 0xdcbc
+ܽ 0xdcbd
+ܾ 0xdcbe
+Ü¿ 0xdcbf
+ÜÀ 0xdcc0
+ÜÁ 0xdcc1
+ÜÂ 0xdcc2
+ÜÃ 0xdcc3
+ÜÄ 0xdcc4
+ÜÅ 0xdcc5
+ÜÆ 0xdcc6
+ÜÇ 0xdcc7
+ÜÈ 0xdcc8
+ÜÉ 0xdcc9
+ÜÊ 0xdcca
+ÜË 0xdccb
+ÜÌ 0xdccc
+ÜÍ 0xdccd
+ÜÎ 0xdcce
+ÜÏ 0xdccf
+ÜÐ 0xdcd0
+ÜÑ 0xdcd1
+ÜÒ 0xdcd2
+ÜÓ 0xdcd3
+ÜÔ 0xdcd4
+ÜÕ 0xdcd5
+ÜÖ 0xdcd6
+Ü× 0xdcd7
+ÜØ 0xdcd8
+ÜÙ 0xdcd9
+ÜÚ 0xdcda
+ÜÛ 0xdcdb
+ÜÜ 0xdcdc
+ÜÝ 0xdcdd
+ÜÞ 0xdcde
+Üß 0xdcdf
+Üà 0xdce0
+Üá 0xdce1
+Üâ 0xdce2
+Üã 0xdce3
+Üä 0xdce4
+Üå 0xdce5
+Üæ 0xdce6
+Üç 0xdce7
+Üè 0xdce8
+Üé 0xdce9
+Üê 0xdcea
+Üë 0xdceb
+Üì 0xdcec
+Üí 0xdced
+Üî 0xdcee
+Üï 0xdcef
+Üð 0xdcf0
+Üñ 0xdcf1
+Üò 0xdcf2
+Üó 0xdcf3
+Üô 0xdcf4
+Üõ 0xdcf5
+Üö 0xdcf6
+Ü÷ 0xdcf7
+Üø 0xdcf8
+Üù 0xdcf9
+Üú 0xdcfa
+Üû 0xdcfb
+Üü 0xdcfc
+Üý 0xdcfd
+Üþ 0xdcfe
+Ý@ 0xdd40
+ÝA 0xdd41
+ÝB 0xdd42
+ÝC 0xdd43
+ÝD 0xdd44
+ÝE 0xdd45
+ÝF 0xdd46
+ÝG 0xdd47
+ÝH 0xdd48
+ÝI 0xdd49
+ÝJ 0xdd4a
+ÝK 0xdd4b
+ÝL 0xdd4c
+ÝM 0xdd4d
+ÝN 0xdd4e
+ÝO 0xdd4f
+ÝP 0xdd50
+ÝQ 0xdd51
+ÝR 0xdd52
+ÝS 0xdd53
+ÝT 0xdd54
+ÝU 0xdd55
+ÝV 0xdd56
+ÝW 0xdd57
+ÝX 0xdd58
+ÝY 0xdd59
+ÝZ 0xdd5a
+Ý[ 0xdd5b
+Ý\ 0xdd5c
+Ý] 0xdd5d
+Ý^ 0xdd5e
+Ý_ 0xdd5f
+Ý` 0xdd60
+Ýa 0xdd61
+Ýb 0xdd62
+Ýc 0xdd63
+Ýd 0xdd64
+Ýe 0xdd65
+Ýf 0xdd66
+Ýg 0xdd67
+Ýh 0xdd68
+Ýi 0xdd69
+Ýj 0xdd6a
+Ýk 0xdd6b
+Ýl 0xdd6c
+Ým 0xdd6d
+Ýn 0xdd6e
+Ýo 0xdd6f
+Ýp 0xdd70
+Ýq 0xdd71
+Ýr 0xdd72
+Ýs 0xdd73
+Ýt 0xdd74
+Ýu 0xdd75
+Ýv 0xdd76
+Ýw 0xdd77
+Ýx 0xdd78
+Ýy 0xdd79
+Ýz 0xdd7a
+Ý{ 0xdd7b
+Ý| 0xdd7c
+Ý} 0xdd7d
+Ý~ 0xdd7e
+Ý¡ 0xdda1
+Ý¢ 0xdda2
+Ý£ 0xdda3
+ݤ 0xdda4
+Ý¥ 0xdda5
+ݦ 0xdda6
+ݧ 0xdda7
+ݨ 0xdda8
+Ý© 0xdda9
+ݪ 0xddaa
+Ý« 0xddab
+ݬ 0xddac
+Ý­ 0xddad
+Ý® 0xddae
+ݯ 0xddaf
+Ý° 0xddb0
+ݱ 0xddb1
+ݲ 0xddb2
+ݳ 0xddb3
+Ý´ 0xddb4
+ݵ 0xddb5
+ݶ 0xddb6
+Ý· 0xddb7
+ݸ 0xddb8
+ݹ 0xddb9
+ݺ 0xddba
+Ý» 0xddbb
+ݼ 0xddbc
+ݽ 0xddbd
+ݾ 0xddbe
+Ý¿ 0xddbf
+ÝÀ 0xddc0
+ÝÁ 0xddc1
+ÝÂ 0xddc2
+ÝÃ 0xddc3
+ÝÄ 0xddc4
+ÝÅ 0xddc5
+ÝÆ 0xddc6
+ÝÇ 0xddc7
+ÝÈ 0xddc8
+ÝÉ 0xddc9
+ÝÊ 0xddca
+ÝË 0xddcb
+ÝÌ 0xddcc
+ÝÍ 0xddcd
+ÝÎ 0xddce
+ÝÏ 0xddcf
+ÝÐ 0xddd0
+ÝÑ 0xddd1
+ÝÒ 0xddd2
+ÝÓ 0xddd3
+ÝÔ 0xddd4
+ÝÕ 0xddd5
+ÝÖ 0xddd6
+Ý× 0xddd7
+ÝØ 0xddd8
+ÝÙ 0xddd9
+ÝÚ 0xddda
+ÝÛ 0xdddb
+ÝÜ 0xdddc
+ÝÝ 0xdddd
+ÝÞ 0xddde
+Ýß 0xdddf
+Ýà 0xdde0
+Ýá 0xdde1
+Ýâ 0xdde2
+Ýã 0xdde3
+Ýä 0xdde4
+Ýå 0xdde5
+Ýæ 0xdde6
+Ýç 0xdde7
+Ýè 0xdde8
+Ýé 0xdde9
+Ýê 0xddea
+Ýë 0xddeb
+Ýì 0xddec
+Ýí 0xdded
+Ýî 0xddee
+Ýï 0xddef
+Ýð 0xddf0
+Ýñ 0xddf1
+Ýò 0xddf2
+Ýó 0xddf3
+Ýô 0xddf4
+Ýõ 0xddf5
+Ýö 0xddf6
+Ý÷ 0xddf7
+Ýø 0xddf8
+Ýù 0xddf9
+Ýú 0xddfa
+Ýû 0xddfb
+Ýü 0xddfc
+Ýý 0xddfd
+Ýþ 0xddfe
+Þ@ 0xde40
+ÞA 0xde41
+ÞB 0xde42
+ÞC 0xde43
+ÞD 0xde44
+ÞE 0xde45
+ÞF 0xde46
+ÞG 0xde47
+ÞH 0xde48
+ÞI 0xde49
+ÞJ 0xde4a
+ÞK 0xde4b
+ÞL 0xde4c
+ÞM 0xde4d
+ÞN 0xde4e
+ÞO 0xde4f
+ÞP 0xde50
+ÞQ 0xde51
+ÞR 0xde52
+ÞS 0xde53
+ÞT 0xde54
+ÞU 0xde55
+ÞV 0xde56
+ÞW 0xde57
+ÞX 0xde58
+ÞY 0xde59
+ÞZ 0xde5a
+Þ[ 0xde5b
+Þ\ 0xde5c
+Þ] 0xde5d
+Þ^ 0xde5e
+Þ_ 0xde5f
+Þ` 0xde60
+Þa 0xde61
+Þb 0xde62
+Þc 0xde63
+Þd 0xde64
+Þe 0xde65
+Þf 0xde66
+Þg 0xde67
+Þh 0xde68
+Þi 0xde69
+Þj 0xde6a
+Þk 0xde6b
+Þl 0xde6c
+Þm 0xde6d
+Þn 0xde6e
+Þo 0xde6f
+Þp 0xde70
+Þq 0xde71
+Þr 0xde72
+Þs 0xde73
+Þt 0xde74
+Þu 0xde75
+Þv 0xde76
+Þw 0xde77
+Þx 0xde78
+Þy 0xde79
+Þz 0xde7a
+Þ{ 0xde7b
+Þ| 0xde7c
+Þ} 0xde7d
+Þ~ 0xde7e
+Þ¡ 0xdea1
+Þ¢ 0xdea2
+Þ£ 0xdea3
+Þ¤ 0xdea4
+Þ¥ 0xdea5
+Þ¦ 0xdea6
+Þ§ 0xdea7
+Þ¨ 0xdea8
+Þ© 0xdea9
+Þª 0xdeaa
+Þ« 0xdeab
+Þ¬ 0xdeac
+Þ­ 0xdead
+Þ® 0xdeae
+Þ¯ 0xdeaf
+Þ° 0xdeb0
+Þ± 0xdeb1
+Þ² 0xdeb2
+Þ³ 0xdeb3
+Þ´ 0xdeb4
+Þµ 0xdeb5
+Þ¶ 0xdeb6
+Þ· 0xdeb7
+Þ¸ 0xdeb8
+Þ¹ 0xdeb9
+Þº 0xdeba
+Þ» 0xdebb
+Þ¼ 0xdebc
+Þ½ 0xdebd
+Þ¾ 0xdebe
+Þ¿ 0xdebf
+ÞÀ 0xdec0
+ÞÁ 0xdec1
+ÞÂ 0xdec2
+ÞÃ 0xdec3
+ÞÄ 0xdec4
+ÞÅ 0xdec5
+ÞÆ 0xdec6
+ÞÇ 0xdec7
+ÞÈ 0xdec8
+ÞÉ 0xdec9
+ÞÊ 0xdeca
+ÞË 0xdecb
+ÞÌ 0xdecc
+ÞÍ 0xdecd
+ÞÎ 0xdece
+ÞÏ 0xdecf
+ÞÐ 0xded0
+ÞÑ 0xded1
+ÞÒ 0xded2
+ÞÓ 0xded3
+ÞÔ 0xded4
+ÞÕ 0xded5
+ÞÖ 0xded6
+Þ× 0xded7
+ÞØ 0xded8
+ÞÙ 0xded9
+ÞÚ 0xdeda
+ÞÛ 0xdedb
+ÞÜ 0xdedc
+ÞÝ 0xdedd
+ÞÞ 0xdede
+Þß 0xdedf
+Þà 0xdee0
+Þá 0xdee1
+Þâ 0xdee2
+Þã 0xdee3
+Þä 0xdee4
+Þå 0xdee5
+Þæ 0xdee6
+Þç 0xdee7
+Þè 0xdee8
+Þé 0xdee9
+Þê 0xdeea
+Þë 0xdeeb
+Þì 0xdeec
+Þí 0xdeed
+Þî 0xdeee
+Þï 0xdeef
+Þð 0xdef0
+Þñ 0xdef1
+Þò 0xdef2
+Þó 0xdef3
+Þô 0xdef4
+Þõ 0xdef5
+Þö 0xdef6
+Þ÷ 0xdef7
+Þø 0xdef8
+Þù 0xdef9
+Þú 0xdefa
+Þû 0xdefb
+Þü 0xdefc
+Þý 0xdefd
+Þþ 0xdefe
+ß@ 0xdf40
+ßA 0xdf41
+ßB 0xdf42
+ßC 0xdf43
+ßD 0xdf44
+ßE 0xdf45
+ßF 0xdf46
+ßG 0xdf47
+ßH 0xdf48
+ßI 0xdf49
+ßJ 0xdf4a
+ßK 0xdf4b
+ßL 0xdf4c
+ßM 0xdf4d
+ßN 0xdf4e
+ßO 0xdf4f
+ßP 0xdf50
+ßQ 0xdf51
+ßR 0xdf52
+ßS 0xdf53
+ßT 0xdf54
+ßU 0xdf55
+ßV 0xdf56
+ßW 0xdf57
+ßX 0xdf58
+ßY 0xdf59
+ßZ 0xdf5a
+ß[ 0xdf5b
+ß\ 0xdf5c
+ß] 0xdf5d
+ß^ 0xdf5e
+ß_ 0xdf5f
+ß` 0xdf60
+ßa 0xdf61
+ßb 0xdf62
+ßc 0xdf63
+ßd 0xdf64
+ße 0xdf65
+ßf 0xdf66
+ßg 0xdf67
+ßh 0xdf68
+ßi 0xdf69
+ßj 0xdf6a
+ßk 0xdf6b
+ßl 0xdf6c
+ßm 0xdf6d
+ßn 0xdf6e
+ßo 0xdf6f
+ßp 0xdf70
+ßq 0xdf71
+ßr 0xdf72
+ßs 0xdf73
+ßt 0xdf74
+ßu 0xdf75
+ßv 0xdf76
+ßw 0xdf77
+ßx 0xdf78
+ßy 0xdf79
+ßz 0xdf7a
+ß{ 0xdf7b
+ß| 0xdf7c
+ß} 0xdf7d
+ß~ 0xdf7e
+ß¡ 0xdfa1
+ߢ 0xdfa2
+ߣ 0xdfa3
+ߤ 0xdfa4
+ߥ 0xdfa5
+ߦ 0xdfa6
+ߧ 0xdfa7
+ߨ 0xdfa8
+ß© 0xdfa9
+ߪ 0xdfaa
+ß« 0xdfab
+߬ 0xdfac
+ß­ 0xdfad
+ß® 0xdfae
+߯ 0xdfaf
+ß° 0xdfb0
+ß± 0xdfb1
+ß² 0xdfb2
+ß³ 0xdfb3
+ß´ 0xdfb4
+ßµ 0xdfb5
+߶ 0xdfb6
+ß· 0xdfb7
+߸ 0xdfb8
+ß¹ 0xdfb9
+ߺ 0xdfba
+ß» 0xdfbb
+ß¼ 0xdfbc
+ß½ 0xdfbd
+ß¾ 0xdfbe
+ß¿ 0xdfbf
+ßÀ 0xdfc0
+ßÁ 0xdfc1
+ß 0xdfc2
+ßà 0xdfc3
+Ꭰ0xdfc4
+Ꮰ0xdfc5
+ᒠ0xdfc6
+ဠ0xdfc7
+ßÈ 0xdfc8
+ᐠ0xdfc9
+ßÊ 0xdfca
+ßË 0xdfcb
+ßÌ 0xdfcc
+ßÍ 0xdfcd
+ßÎ 0xdfce
+ßÏ 0xdfcf
+ßÐ 0xdfd0
+ᥠ0xdfd1
+ßÒ 0xdfd2
+ßÓ 0xdfd3
+ßÔ 0xdfd4
+ßÕ 0xdfd5
+ßÖ 0xdfd6
+ß× 0xdfd7
+ßØ 0xdfd8
+ßÙ 0xdfd9
+ßÚ 0xdfda
+ßÛ 0xdfdb
+ᚠ0xdfdc
+ßÝ 0xdfdd
+ßÞ 0xdfde
+ßß 0xdfdf
+ßà 0xdfe0
+ßá 0xdfe1
+ßâ 0xdfe2
+ßã 0xdfe3
+ßä 0xdfe4
+ßå 0xdfe5
+ßæ 0xdfe6
+ßç 0xdfe7
+ßè 0xdfe8
+ßé 0xdfe9
+ßê 0xdfea
+ßë 0xdfeb
+ßì 0xdfec
+ßí 0xdfed
+ßî 0xdfee
+ßï 0xdfef
+ßð 0xdff0
+ßñ 0xdff1
+ßò 0xdff2
+ßó 0xdff3
+ßô 0xdff4
+ßõ 0xdff5
+ßö 0xdff6
+ß÷ 0xdff7
+ßø 0xdff8
+ßù 0xdff9
+ßú 0xdffa
+ßû 0xdffb
+ßü 0xdffc
+ßý 0xdffd
+ßþ 0xdffe
+à@ 0xe040
+àA 0xe041
+àB 0xe042
+àC 0xe043
+àD 0xe044
+àE 0xe045
+àF 0xe046
+àG 0xe047
+àH 0xe048
+àI 0xe049
+àJ 0xe04a
+àK 0xe04b
+àL 0xe04c
+àM 0xe04d
+àN 0xe04e
+àO 0xe04f
+àP 0xe050
+àQ 0xe051
+àR 0xe052
+àS 0xe053
+àT 0xe054
+àU 0xe055
+àV 0xe056
+àW 0xe057
+àX 0xe058
+àY 0xe059
+àZ 0xe05a
+à[ 0xe05b
+à\ 0xe05c
+à] 0xe05d
+à^ 0xe05e
+à_ 0xe05f
+à` 0xe060
+àa 0xe061
+àb 0xe062
+àc 0xe063
+àd 0xe064
+àe 0xe065
+àf 0xe066
+àg 0xe067
+àh 0xe068
+ài 0xe069
+àj 0xe06a
+àk 0xe06b
+àl 0xe06c
+àm 0xe06d
+àn 0xe06e
+ào 0xe06f
+àp 0xe070
+àq 0xe071
+àr 0xe072
+às 0xe073
+àt 0xe074
+àu 0xe075
+àv 0xe076
+àw 0xe077
+àx 0xe078
+ày 0xe079
+àz 0xe07a
+à{ 0xe07b
+à| 0xe07c
+à} 0xe07d
+à~ 0xe07e
+à¡ 0xe0a1
+ࢠ0xe0a2
+࣠0xe0a3
+ठ0xe0a4
+ॠ0xe0a5
+ঠ0xe0a6
+ৠ0xe0a7
+ਠ0xe0a8
+à© 0xe0a9
+ઠ0xe0aa
+à« 0xe0ab
+ଠ0xe0ac
+à­ 0xe0ad
+à® 0xe0ae
+௠0xe0af
+à° 0xe0b0
+à± 0xe0b1
+ಠ0xe0b2
+à³ 0xe0b3
+à´ 0xe0b4
+ൠ0xe0b5
+ච0xe0b6
+à· 0xe0b7
+ภ0xe0b8
+๠0xe0b9
+ຠ0xe0ba
+à» 0xe0bb
+༠0xe0bc
+འ0xe0bd
+ྠ0xe0be
+à¿ 0xe0bf
+àÀ 0xe0c0
+àÁ 0xe0c1
+à 0xe0c2
+àà 0xe0c3
+àÄ 0xe0c4
+àÅ 0xe0c5
+àÆ 0xe0c6
+àÇ 0xe0c7
+àÈ 0xe0c8
+àÉ 0xe0c9
+àÊ 0xe0ca
+àË 0xe0cb
+àÌ 0xe0cc
+àÍ 0xe0cd
+àÎ 0xe0ce
+àÏ 0xe0cf
+àÐ 0xe0d0
+àÑ 0xe0d1
+àÒ 0xe0d2
+àÓ 0xe0d3
+àÔ 0xe0d4
+àÕ 0xe0d5
+àÖ 0xe0d6
+à× 0xe0d7
+àØ 0xe0d8
+àÙ 0xe0d9
+àÚ 0xe0da
+àÛ 0xe0db
+àÜ 0xe0dc
+àÝ 0xe0dd
+àÞ 0xe0de
+àß 0xe0df
+àà 0xe0e0
+àá 0xe0e1
+àâ 0xe0e2
+àã 0xe0e3
+àä 0xe0e4
+àå 0xe0e5
+àæ 0xe0e6
+àç 0xe0e7
+àè 0xe0e8
+àé 0xe0e9
+àê 0xe0ea
+àë 0xe0eb
+àì 0xe0ec
+àí 0xe0ed
+àî 0xe0ee
+àï 0xe0ef
+¹¬ 0xb9ac
+¹­ 0xb9ad
+¹® 0xb9ae
+¹¯ 0xb9af
+¹° 0xb9b0
+¹± 0xb9b1
+¹² 0xb9b2
+¹³ 0xb9b3
+¹´ 0xb9b4
+¹µ 0xb9b5
+¹¶ 0xb9b6
+¹· 0xb9b7
+¹¸ 0xb9b8
+¹¹ 0xb9b9
+¹º 0xb9ba
+¹» 0xb9bb
+¹¼ 0xb9bc
+¹½ 0xb9bd
+¹¾ 0xb9be
+¹¿ 0xb9bf
+¹À 0xb9c0
+¹Á 0xb9c1
+¹Â 0xb9c2
+¹Ã 0xb9c3
+¹Ä 0xb9c4
+¹Å 0xb9c5
+¹Æ 0xb9c6
+¹Ç 0xb9c7
+¹È 0xb9c8
+¹É 0xb9c9
+¹Ê 0xb9ca
+¹Ë 0xb9cb
+¹Ì 0xb9cc
+¹Í 0xb9cd
+¹Î 0xb9ce
+¹Ï 0xb9cf
+¹Ð 0xb9d0
+¹Ñ 0xb9d1
+¹Ò 0xb9d2
+¹Ó 0xb9d3
+¹Ô 0xb9d4
+¹Õ 0xb9d5
+¹Ö 0xb9d6
+¹× 0xb9d7
+¹Ø 0xb9d8
+¹Ù 0xb9d9
+¹Ú 0xb9da
+¹Û 0xb9db
+¹Ü 0xb9dc
+¹Ý 0xb9dd
+¹Þ 0xb9de
+¹ß 0xb9df
+¹à 0xb9e0
+¹á 0xb9e1
+¹â 0xb9e2
+¹ã 0xb9e3
+¹ä 0xb9e4
+¹å 0xb9e5
+¹æ 0xb9e6
+¹ç 0xb9e7
+¹è 0xb9e8
+¹é 0xb9e9
+¹ê 0xb9ea
+¹ë 0xb9eb
+¹ì 0xb9ec
+¹í 0xb9ed
+¹î 0xb9ee
+¹ï 0xb9ef
+¹ð 0xb9f0
+¹ñ 0xb9f1
+¹ò 0xb9f2
+¹ó 0xb9f3
+¹ô 0xb9f4
+¹õ 0xb9f5
+¹ö 0xb9f6
+¹÷ 0xb9f7
+¹ø 0xb9f8
+¹ù 0xb9f9
+¹ú 0xb9fa
+¹û 0xb9fb
+¹ü 0xb9fc
+¹ý 0xb9fd
+¹þ 0xb9fe
+º@ 0xba40
+ºA 0xba41
+ºB 0xba42
+ºC 0xba43
+ºD 0xba44
+ºE 0xba45
+ºF 0xba46
+ºG 0xba47
+ºH 0xba48
+ºI 0xba49
+ºJ 0xba4a
+ºK 0xba4b
+ºL 0xba4c
+ºM 0xba4d
+ºN 0xba4e
+ºO 0xba4f
+ºP 0xba50
+ºQ 0xba51
+ºR 0xba52
+ºS 0xba53
+ºT 0xba54
+ºU 0xba55
+ºV 0xba56
+ºW 0xba57
+ºX 0xba58
+ºY 0xba59
+ºZ 0xba5a
+º[ 0xba5b
+º\ 0xba5c
+º] 0xba5d
+º^ 0xba5e
+º_ 0xba5f
+º` 0xba60
+ºa 0xba61
+ºb 0xba62
+ºc 0xba63
+ºd 0xba64
+ºe 0xba65
+ºf 0xba66
+ºg 0xba67
+ºh 0xba68
+ºi 0xba69
+ºj 0xba6a
+ºk 0xba6b
+ºl 0xba6c
+ºm 0xba6d
+ºn 0xba6e
+ºo 0xba6f
+ºp 0xba70
+ºq 0xba71
+ºr 0xba72
+ºs 0xba73
+ºt 0xba74
+ºu 0xba75
+ºv 0xba76
+ºw 0xba77
+ºx 0xba78
+ºy 0xba79
+ºz 0xba7a
+º{ 0xba7b
+º| 0xba7c
+º} 0xba7d
+º~ 0xba7e
+º¡ 0xbaa1
+º¢ 0xbaa2
+º£ 0xbaa3
+º¤ 0xbaa4
+º¥ 0xbaa5
+º¦ 0xbaa6
+º§ 0xbaa7
+º¨ 0xbaa8
+º© 0xbaa9
+ºª 0xbaaa
+º« 0xbaab
+º¬ 0xbaac
+º­ 0xbaad
+º® 0xbaae
+º¯ 0xbaaf
+º° 0xbab0
+º± 0xbab1
+º² 0xbab2
+º³ 0xbab3
+º´ 0xbab4
+ºµ 0xbab5
+º¶ 0xbab6
+º· 0xbab7
+º¸ 0xbab8
+º¹ 0xbab9
+ºº 0xbaba
+º» 0xbabb
+º¼ 0xbabc
+º½ 0xbabd
+º¾ 0xbabe
+º¿ 0xbabf
+ºÀ 0xbac0
+ºÁ 0xbac1
+ºÂ 0xbac2
+ºÃ 0xbac3
+ºÄ 0xbac4
+ºÅ 0xbac5
+ºÆ 0xbac6
+ºÇ 0xbac7
+ºÈ 0xbac8
+ºÉ 0xbac9
+ºÊ 0xbaca
+ºË 0xbacb
+ºÌ 0xbacc
+ºÍ 0xbacd
+ºÎ 0xbace
+ºÏ 0xbacf
+ºÐ 0xbad0
+ºÑ 0xbad1
+ºÒ 0xbad2
+ºÓ 0xbad3
+ºÔ 0xbad4
+ºÕ 0xbad5
+ºÖ 0xbad6
+º× 0xbad7
+ºØ 0xbad8
+ºÙ 0xbad9
+ºÚ 0xbada
+ºÛ 0xbadb
+ºÜ 0xbadc
+ºÝ 0xbadd
+ºÞ 0xbade
+ºß 0xbadf
+ºà 0xbae0
+ºá 0xbae1
+ºâ 0xbae2
+ºã 0xbae3
+ºä 0xbae4
+ºå 0xbae5
+ºæ 0xbae6
+ºç 0xbae7
+ºè 0xbae8
+ºé 0xbae9
+ºê 0xbaea
+ºë 0xbaeb
+ºì 0xbaec
+ºí 0xbaed
+ºî 0xbaee
+ºï 0xbaef
+ºð 0xbaf0
+ºñ 0xbaf1
+ºò 0xbaf2
+ºó 0xbaf3
+ºô 0xbaf4
+ºõ 0xbaf5
+ºö 0xbaf6
+º÷ 0xbaf7
+ºø 0xbaf8
+ºù 0xbaf9
+ºú 0xbafa
+ºû 0xbafb
+ºü 0xbafc
+ºý 0xbafd
+ºþ 0xbafe
+»@ 0xbb40
+»A 0xbb41
+»B 0xbb42
+»C 0xbb43
+»D 0xbb44
+»E 0xbb45
+»F 0xbb46
+»G 0xbb47
+»H 0xbb48
+»I 0xbb49
+»J 0xbb4a
+»K 0xbb4b
+»L 0xbb4c
+»M 0xbb4d
+»N 0xbb4e
+»O 0xbb4f
+»P 0xbb50
+»Q 0xbb51
+»R 0xbb52
+»S 0xbb53
+»T 0xbb54
+»U 0xbb55
+»V 0xbb56
+»W 0xbb57
+»X 0xbb58
+»Y 0xbb59
+»Z 0xbb5a
+»[ 0xbb5b
+»\ 0xbb5c
+»] 0xbb5d
+»^ 0xbb5e
+»_ 0xbb5f
+»` 0xbb60
+»a 0xbb61
+»b 0xbb62
+»c 0xbb63
+»d 0xbb64
+»e 0xbb65
+»f 0xbb66
+»g 0xbb67
+»h 0xbb68
+»i 0xbb69
+»j 0xbb6a
+»k 0xbb6b
+»l 0xbb6c
+»m 0xbb6d
+»n 0xbb6e
+»o 0xbb6f
+»p 0xbb70
+»q 0xbb71
+»r 0xbb72
+»s 0xbb73
+»t 0xbb74
+»u 0xbb75
+»v 0xbb76
+»w 0xbb77
+»x 0xbb78
+»y 0xbb79
+»z 0xbb7a
+»{ 0xbb7b
+»| 0xbb7c
+»} 0xbb7d
+»~ 0xbb7e
+»¡ 0xbba1
+Ȣ 0xbba2
+ȣ 0xbba3
+»¤ 0xbba4
+ȴ 0xbba5
+»¦ 0xbba6
+Ȥ 0xbba7
+Ȭ 0xbba8
+»© 0xbba9
+Ȼ 0xbbaa
+»« 0xbbab
+»¬ 0xbbac
+»­ 0xbbad
+»® 0xbbae
+»¯ 0xbbaf
+»° 0xbbb0
+»± 0xbbb1
+»² 0xbbb2
+»³ 0xbbb3
+»´ 0xbbb4
+»µ 0xbbb5
+Ȧ 0xbbb6
+»· 0xbbb7
+»¸ 0xbbb8
+»¹ 0xbbb9
+ȼ 0xbbba
+»» 0xbbbb
+»¼ 0xbbbc
+»½ 0xbbbd
+»¾ 0xbbbe
+»¿ 0xbbbf
+»À 0xbbc0
+»Á 0xbbc1
+»Â 0xbbc2
+»Ã 0xbbc3
+Ȁ 0xbbc4
+ȁ 0xbbc5
+Ȯ 0xbbc6
+Ȃ 0xbbc7
+»È 0xbbc8
+ȃ 0xbbc9
+»Ê 0xbbca
+»Ë 0xbbcb
+»Ì 0xbbcc
+»Í 0xbbcd
+»Î 0xbbce
+»Ï 0xbbcf
+»Ð 0xbbd0
+Ȅ 0xbbd1
+»Ò 0xbbd2
+»Ó 0xbbd3
+»Ô 0xbbd4
+»Õ 0xbbd5
+»Ö 0xbbd6
+»× 0xbbd7
+ȯ 0xbbd8
+»Ù 0xbbd9
+»Ú 0xbbda
+»Û 0xbbdb
+Ȇ 0xbbdc
+»Ý 0xbbdd
+»Þ 0xbbde
+ȧ 0xbbdf
+Ȉ 0xbbe0
+ȇ 0xbbe1
+ȉ 0xbbe2
+ȋ 0xbbe3
+Ȋ 0xbbe4
+Ȍ 0xbbe5
+Ⱦ 0xbbe6
+ȍ 0xbbe7
+ȏ 0xbbe8
+Ȏ 0xbbe9
+Ȑ 0xbbea
+ȑ 0xbbeb
+ȓ 0xbbec
+Ȓ 0xbbed
+Ȕ 0xbbee
+ȕ 0xbbef
+»ð 0xbbf0
+Ȗ 0xbbf1
+»ò 0xbbf2
+»ó 0xbbf3
+»ô 0xbbf4
+àð 0xe0f0
+àñ 0xe0f1
+àò 0xe0f2
+àó 0xe0f3
+àô 0xe0f4
+àõ 0xe0f5
+àö 0xe0f6
+à÷ 0xe0f7
+àø 0xe0f8
+àù 0xe0f9
+àú 0xe0fa
+àû 0xe0fb
+àü 0xe0fc
+àý 0xe0fd
+àþ 0xe0fe
+á@ 0xe140
+áA 0xe141
+áB 0xe142
+áC 0xe143
+áD 0xe144
+áE 0xe145
+áF 0xe146
+áG 0xe147
+áH 0xe148
+áI 0xe149
+áJ 0xe14a
+áK 0xe14b
+áL 0xe14c
+áM 0xe14d
+áN 0xe14e
+áO 0xe14f
+áP 0xe150
+áQ 0xe151
+áR 0xe152
+áS 0xe153
+áT 0xe154
+áU 0xe155
+áV 0xe156
+áW 0xe157
+áX 0xe158
+áY 0xe159
+áZ 0xe15a
+á[ 0xe15b
+á\ 0xe15c
+á] 0xe15d
+á^ 0xe15e
+á_ 0xe15f
+á` 0xe160
+áa 0xe161
+áb 0xe162
+ác 0xe163
+ád 0xe164
+áe 0xe165
+áf 0xe166
+ág 0xe167
+áh 0xe168
+ái 0xe169
+áj 0xe16a
+ák 0xe16b
+ál 0xe16c
+ám 0xe16d
+án 0xe16e
+áo 0xe16f
+áp 0xe170
+áq 0xe171
+ár 0xe172
+ás 0xe173
+át 0xe174
+áu 0xe175
+áv 0xe176
+áw 0xe177
+áx 0xe178
+áy 0xe179
+áz 0xe17a
+á{ 0xe17b
+á| 0xe17c
+á} 0xe17d
+á~ 0xe17e
+á¡ 0xe1a1
+ᢠ0xe1a2
+ᣠ0xe1a3
+ᤠ0xe1a4
+ᥠ0xe1a5
+ᦠ0xe1a6
+᧠0xe1a7
+ᨠ0xe1a8
+á© 0xe1a9
+᪠0xe1aa
+á« 0xe1ab
+ᬠ0xe1ac
+á­ 0xe1ad
+á® 0xe1ae
+ᯠ0xe1af
+á° 0xe1b0
+á± 0xe1b1
+á² 0xe1b2
+á³ 0xe1b3
+á´ 0xe1b4
+áµ 0xe1b5
+ᶠ0xe1b6
+á· 0xe1b7
+Ḡ0xe1b8
+á¹ 0xe1b9
+Ạ0xe1ba
+á» 0xe1bb
+á¼ 0xe1bc
+á½ 0xe1bd
+á¾ 0xe1be
+á¿ 0xe1bf
+áÀ 0xe1c0
+áÁ 0xe1c1
+á 0xe1c2
+áà 0xe1c3
+áÄ 0xe1c4
+áÅ 0xe1c5
+áÆ 0xe1c6
+áÇ 0xe1c7
+áÈ 0xe1c8
+áÉ 0xe1c9
+áÊ 0xe1ca
+áË 0xe1cb
+áÌ 0xe1cc
+áÍ 0xe1cd
+áÎ 0xe1ce
+áÏ 0xe1cf
+áÐ 0xe1d0
+áÑ 0xe1d1
+áÒ 0xe1d2
+áÓ 0xe1d3
+áÔ 0xe1d4
+áÕ 0xe1d5
+áÖ 0xe1d6
+á× 0xe1d7
+áØ 0xe1d8
+áÙ 0xe1d9
+áÚ 0xe1da
+áÛ 0xe1db
+áÜ 0xe1dc
+áÝ 0xe1dd
+áÞ 0xe1de
+áß 0xe1df
+áà 0xe1e0
+áá 0xe1e1
+áâ 0xe1e2
+áã 0xe1e3
+áä 0xe1e4
+áå 0xe1e5
+áæ 0xe1e6
+áç 0xe1e7
+áè 0xe1e8
+áé 0xe1e9
+áê 0xe1ea
+áë 0xe1eb
+áì 0xe1ec
+áí 0xe1ed
+áî 0xe1ee
+áï 0xe1ef
+áð 0xe1f0
+áñ 0xe1f1
+áò 0xe1f2
+áó 0xe1f3
+áô 0xe1f4
+áõ 0xe1f5
+áö 0xe1f6
+á÷ 0xe1f7
+áø 0xe1f8
+áù 0xe1f9
+áú 0xe1fa
+áû 0xe1fb
+áü 0xe1fc
+áý 0xe1fd
+áþ 0xe1fe
+â@ 0xe240
+âA 0xe241
+âB 0xe242
+âC 0xe243
+âD 0xe244
+âE 0xe245
+âF 0xe246
+âG 0xe247
+âH 0xe248
+âI 0xe249
+âJ 0xe24a
+âK 0xe24b
+âL 0xe24c
+âM 0xe24d
+âN 0xe24e
+âO 0xe24f
+âP 0xe250
+âQ 0xe251
+âR 0xe252
+âS 0xe253
+âT 0xe254
+âU 0xe255
+âV 0xe256
+âW 0xe257
+âX 0xe258
+âY 0xe259
+âZ 0xe25a
+â[ 0xe25b
+â\ 0xe25c
+â] 0xe25d
+â^ 0xe25e
+â_ 0xe25f
+â` 0xe260
+âa 0xe261
+âb 0xe262
+âc 0xe263
+âd 0xe264
+âe 0xe265
+âf 0xe266
+âg 0xe267
+âh 0xe268
+âi 0xe269
+âj 0xe26a
+âk 0xe26b
+âl 0xe26c
+âm 0xe26d
+ân 0xe26e
+âo 0xe26f
+âp 0xe270
+âq 0xe271
+âr 0xe272
+âs 0xe273
+ât 0xe274
+âu 0xe275
+âv 0xe276
+âw 0xe277
+âx 0xe278
+ây 0xe279
+âz 0xe27a
+â{ 0xe27b
+â| 0xe27c
+â} 0xe27d
+â~ 0xe27e
+â¡ 0xe2a1
+⢠0xe2a2
+⣠0xe2a3
+⤠0xe2a4
+⥠0xe2a5
+⦠0xe2a6
+⧠0xe2a7
+⨠0xe2a8
+â© 0xe2a9
+⪠0xe2aa
+â« 0xe2ab
+⬠0xe2ac
+â­ 0xe2ad
+â® 0xe2ae
+⯠0xe2af
+â° 0xe2b0
+â± 0xe2b1
+â² 0xe2b2
+â³ 0xe2b3
+â´ 0xe2b4
+âµ 0xe2b5
+ⶠ0xe2b6
+â· 0xe2b7
+⸠0xe2b8
+â¹ 0xe2b9
+⺠0xe2ba
+â» 0xe2bb
+â¼ 0xe2bc
+â½ 0xe2bd
+â¾ 0xe2be
+â¿ 0xe2bf
+âÀ 0xe2c0
+âÁ 0xe2c1
+â 0xe2c2
+âà 0xe2c3
+âÄ 0xe2c4
+âÅ 0xe2c5
+âÆ 0xe2c6
+âÇ 0xe2c7
+âÈ 0xe2c8
+âÉ 0xe2c9
+âÊ 0xe2ca
+âË 0xe2cb
+âÌ 0xe2cc
+âÍ 0xe2cd
+âÎ 0xe2ce
+âÏ 0xe2cf
+âÐ 0xe2d0
+âÑ 0xe2d1
+âÒ 0xe2d2
+âÓ 0xe2d3
+âÔ 0xe2d4
+âÕ 0xe2d5
+âÖ 0xe2d6
+â× 0xe2d7
+âØ 0xe2d8
+âÙ 0xe2d9
+âÚ 0xe2da
+âÛ 0xe2db
+âÜ 0xe2dc
+âÝ 0xe2dd
+âÞ 0xe2de
+âß 0xe2df
+âà 0xe2e0
+âá 0xe2e1
+ââ 0xe2e2
+âã 0xe2e3
+âä 0xe2e4
+âå 0xe2e5
+âæ 0xe2e6
+âç 0xe2e7
+âè 0xe2e8
+âé 0xe2e9
+âê 0xe2ea
+âë 0xe2eb
+âì 0xe2ec
+âí 0xe2ed
+âî 0xe2ee
+âï 0xe2ef
+âð 0xe2f0
+âñ 0xe2f1
+âò 0xe2f2
+âó 0xe2f3
+âô 0xe2f4
+âõ 0xe2f5
+âö 0xe2f6
+â÷ 0xe2f7
+âø 0xe2f8
+âù 0xe2f9
+âú 0xe2fa
+âû 0xe2fb
+âü 0xe2fc
+âý 0xe2fd
+âþ 0xe2fe
+ã@ 0xe340
+ãA 0xe341
+ãB 0xe342
+ãC 0xe343
+ãD 0xe344
+ãE 0xe345
+ãF 0xe346
+ãG 0xe347
+ãH 0xe348
+ãI 0xe349
+ãJ 0xe34a
+ãK 0xe34b
+ãL 0xe34c
+ãM 0xe34d
+ãN 0xe34e
+ãO 0xe34f
+ãP 0xe350
+ãQ 0xe351
+ãR 0xe352
+ãS 0xe353
+ãT 0xe354
+ãU 0xe355
+ãV 0xe356
+ãW 0xe357
+ãX 0xe358
+ãY 0xe359
+ãZ 0xe35a
+ã[ 0xe35b
+ã\ 0xe35c
+ã] 0xe35d
+ã^ 0xe35e
+ã_ 0xe35f
+ã` 0xe360
+ãa 0xe361
+ãb 0xe362
+ãc 0xe363
+ãd 0xe364
+ãe 0xe365
+ãf 0xe366
+ãg 0xe367
+ãh 0xe368
+ãi 0xe369
+ãj 0xe36a
+ãk 0xe36b
+ãl 0xe36c
+ãm 0xe36d
+ãn 0xe36e
+ão 0xe36f
+ãp 0xe370
+ãq 0xe371
+ãr 0xe372
+ãs 0xe373
+ãt 0xe374
+ãu 0xe375
+ãv 0xe376
+ãw 0xe377
+ãx 0xe378
+ãy 0xe379
+ãz 0xe37a
+ã{ 0xe37b
+ã| 0xe37c
+ã} 0xe37d
+ã~ 0xe37e
+ã¡ 0xe3a1
+㢠0xe3a2
+㣠0xe3a3
+㤠0xe3a4
+㥠0xe3a5
+㦠0xe3a6
+㧠0xe3a7
+㨠0xe3a8
+ã© 0xe3a9
+㪠0xe3aa
+ã« 0xe3ab
+㬠0xe3ac
+ã­ 0xe3ad
+ã® 0xe3ae
+㯠0xe3af
+ã° 0xe3b0
+ã± 0xe3b1
+ã² 0xe3b2
+ã³ 0xe3b3
+ã´ 0xe3b4
+ãµ 0xe3b5
+㶠0xe3b6
+ã· 0xe3b7
+㸠0xe3b8
+ã¹ 0xe3b9
+㺠0xe3ba
+ã» 0xe3bb
+ã¼ 0xe3bc
+ã½ 0xe3bd
+ã¾ 0xe3be
+ã¿ 0xe3bf
+ãÀ 0xe3c0
+ãÁ 0xe3c1
+ã 0xe3c2
+ãà 0xe3c3
+ãÄ 0xe3c4
+ãÅ 0xe3c5
+ãÆ 0xe3c6
+ãÇ 0xe3c7
+ãÈ 0xe3c8
+ãÉ 0xe3c9
+ãÊ 0xe3ca
+ãË 0xe3cb
+ãÌ 0xe3cc
+ãÍ 0xe3cd
+ãÎ 0xe3ce
+ãÏ 0xe3cf
+ãÐ 0xe3d0
+ãÑ 0xe3d1
+ãÒ 0xe3d2
+ãÓ 0xe3d3
+ãÔ 0xe3d4
+ãÕ 0xe3d5
+ãÖ 0xe3d6
+ã× 0xe3d7
+ãØ 0xe3d8
+ãÙ 0xe3d9
+ãÚ 0xe3da
+ãÛ 0xe3db
+ãÜ 0xe3dc
+ãÝ 0xe3dd
+ãÞ 0xe3de
+ãß 0xe3df
+ãà 0xe3e0
+ãá 0xe3e1
+ãâ 0xe3e2
+ãã 0xe3e3
+ãä 0xe3e4
+ãå 0xe3e5
+ãæ 0xe3e6
+ãç 0xe3e7
+ãè 0xe3e8
+ãé 0xe3e9
+ãê 0xe3ea
+ãë 0xe3eb
+ãì 0xe3ec
+ãí 0xe3ed
+ãî 0xe3ee
+ãï 0xe3ef
+ãð 0xe3f0
+ãñ 0xe3f1
+ãò 0xe3f2
+ãó 0xe3f3
+ãô 0xe3f4
+ãõ 0xe3f5
+ãö 0xe3f6
+ã÷ 0xe3f7
+ãø 0xe3f8
+ãù 0xe3f9
+ãú 0xe3fa
+ãû 0xe3fb
+ãü 0xe3fc
+ãý 0xe3fd
+ãþ 0xe3fe
+ä@ 0xe440
+äA 0xe441
+äB 0xe442
+äC 0xe443
+äD 0xe444
+äE 0xe445
+äF 0xe446
+äG 0xe447
+äH 0xe448
+äI 0xe449
+äJ 0xe44a
+äK 0xe44b
+äL 0xe44c
+äM 0xe44d
+äN 0xe44e
+äO 0xe44f
+äP 0xe450
+äQ 0xe451
+äR 0xe452
+äS 0xe453
+äT 0xe454
+äU 0xe455
+äV 0xe456
+äW 0xe457
+äX 0xe458
+äY 0xe459
+äZ 0xe45a
+ä[ 0xe45b
+ä\ 0xe45c
+ä] 0xe45d
+ä^ 0xe45e
+ä_ 0xe45f
+ä` 0xe460
+äa 0xe461
+äb 0xe462
+äc 0xe463
+äd 0xe464
+äe 0xe465
+äf 0xe466
+äg 0xe467
+äh 0xe468
+äi 0xe469
+äj 0xe46a
+äk 0xe46b
+äl 0xe46c
+äm 0xe46d
+än 0xe46e
+äo 0xe46f
+äp 0xe470
+äq 0xe471
+är 0xe472
+äs 0xe473
+ät 0xe474
+äu 0xe475
+äv 0xe476
+äw 0xe477
+äx 0xe478
+äy 0xe479
+äz 0xe47a
+ä{ 0xe47b
+ä| 0xe47c
+ä} 0xe47d
+ä~ 0xe47e
+ä¡ 0xe4a1
+ä¢ 0xe4a2
+ä£ 0xe4a3
+ä¤ 0xe4a4
+ä¥ 0xe4a5
+ä¦ 0xe4a6
+ä§ 0xe4a7
+ä¨ 0xe4a8
+ä© 0xe4a9
+äª 0xe4aa
+ä« 0xe4ab
+ä¬ 0xe4ac
+ä­ 0xe4ad
+ä® 0xe4ae
+ä¯ 0xe4af
+ä° 0xe4b0
+ä± 0xe4b1
+ä² 0xe4b2
+ä³ 0xe4b3
+ä´ 0xe4b4
+äµ 0xe4b5
+ä¶ 0xe4b6
+ä· 0xe4b7
+ä¸ 0xe4b8
+ä¹ 0xe4b9
+äº 0xe4ba
+ä» 0xe4bb
+ä¼ 0xe4bc
+ä½ 0xe4bd
+ä¾ 0xe4be
+ä¿ 0xe4bf
+äÀ 0xe4c0
+äÁ 0xe4c1
+ä 0xe4c2
+äà 0xe4c3
+äÄ 0xe4c4
+äÅ 0xe4c5
+äÆ 0xe4c6
+äÇ 0xe4c7
+äÈ 0xe4c8
+äÉ 0xe4c9
+äÊ 0xe4ca
+äË 0xe4cb
+äÌ 0xe4cc
+äÍ 0xe4cd
+äÎ 0xe4ce
+äÏ 0xe4cf
+äÐ 0xe4d0
+äÑ 0xe4d1
+äÒ 0xe4d2
+äÓ 0xe4d3
+äÔ 0xe4d4
+äÕ 0xe4d5
+äÖ 0xe4d6
+ä× 0xe4d7
+äØ 0xe4d8
+äÙ 0xe4d9
+äÚ 0xe4da
+äÛ 0xe4db
+äÜ 0xe4dc
+äÝ 0xe4dd
+äÞ 0xe4de
+äß 0xe4df
+äà 0xe4e0
+äá 0xe4e1
+äâ 0xe4e2
+äã 0xe4e3
+ää 0xe4e4
+äå 0xe4e5
+»õ 0xbbf5
+»ö 0xbbf6
+»÷ 0xbbf7
+»ø 0xbbf8
+»ù 0xbbf9
+»ú 0xbbfa
+»û 0xbbfb
+ȟ 0xbbfc
+»ý 0xbbfd
+»þ 0xbbfe
+¼@ 0xbc40
+¼A 0xbc41
+¼B 0xbc42
+¼C 0xbc43
+¼D 0xbc44
+¼E 0xbc45
+¼F 0xbc46
+¼G 0xbc47
+¼H 0xbc48
+¼I 0xbc49
+¼J 0xbc4a
+¼K 0xbc4b
+¼L 0xbc4c
+¼M 0xbc4d
+¼N 0xbc4e
+¼O 0xbc4f
+¼P 0xbc50
+¼Q 0xbc51
+¼R 0xbc52
+¼S 0xbc53
+¼T 0xbc54
+¼U 0xbc55
+¼V 0xbc56
+¼W 0xbc57
+¼X 0xbc58
+¼Y 0xbc59
+¼Z 0xbc5a
+¼[ 0xbc5b
+¼\ 0xbc5c
+¼] 0xbc5d
+¼^ 0xbc5e
+¼_ 0xbc5f
+¼` 0xbc60
+¼a 0xbc61
+¼b 0xbc62
+¼c 0xbc63
+¼d 0xbc64
+¼e 0xbc65
+¼f 0xbc66
+¼g 0xbc67
+¼h 0xbc68
+¼i 0xbc69
+¼j 0xbc6a
+¼k 0xbc6b
+¼l 0xbc6c
+¼m 0xbc6d
+¼n 0xbc6e
+¼o 0xbc6f
+¼p 0xbc70
+¼q 0xbc71
+¼r 0xbc72
+¼s 0xbc73
+¼t 0xbc74
+¼u 0xbc75
+¼v 0xbc76
+¼w 0xbc77
+¼x 0xbc78
+¼y 0xbc79
+¼z 0xbc7a
+¼{ 0xbc7b
+¼| 0xbc7c
+¼} 0xbc7d
+¼~ 0xbc7e
+¼¡ 0xbca1
+¼¢ 0xbca2
+¼£ 0xbca3
+¼¤ 0xbca4
+¼¥ 0xbca5
+¼¦ 0xbca6
+¼§ 0xbca7
+¼¨ 0xbca8
+¼© 0xbca9
+¼ª 0xbcaa
+¼« 0xbcab
+¼¬ 0xbcac
+¼­ 0xbcad
+¼® 0xbcae
+¼¯ 0xbcaf
+¼° 0xbcb0
+¼± 0xbcb1
+¼² 0xbcb2
+¼³ 0xbcb3
+¼´ 0xbcb4
+¼µ 0xbcb5
+¼¶ 0xbcb6
+¼· 0xbcb7
+¼¸ 0xbcb8
+¼¹ 0xbcb9
+¼º 0xbcba
+¼» 0xbcbb
+¼¼ 0xbcbc
+¼½ 0xbcbd
+¼¾ 0xbcbe
+¼¿ 0xbcbf
+¼À 0xbcc0
+¼Á 0xbcc1
+¼Â 0xbcc2
+¼Ã 0xbcc3
+¼Ä 0xbcc4
+¼Å 0xbcc5
+¼Æ 0xbcc6
+¼Ç 0xbcc7
+¼È 0xbcc8
+¼É 0xbcc9
+¼Ê 0xbcca
+¼Ë 0xbccb
+¼Ì 0xbccc
+¼Í 0xbccd
+¼Î 0xbcce
+¼Ï 0xbccf
+¼Ð 0xbcd0
+¼Ñ 0xbcd1
+¼Ò 0xbcd2
+¼Ó 0xbcd3
+¼Ô 0xbcd4
+¼Õ 0xbcd5
+¼Ö 0xbcd6
+¼× 0xbcd7
+¼Ø 0xbcd8
+¼Ù 0xbcd9
+¼Ú 0xbcda
+¼Û 0xbcdb
+¼Ü 0xbcdc
+¼Ý 0xbcdd
+¼Þ 0xbcde
+¼ß 0xbcdf
+¼à 0xbce0
+¼á 0xbce1
+¼â 0xbce2
+¼ã 0xbce3
+¼ä 0xbce4
+¼å 0xbce5
+¼æ 0xbce6
+¼ç 0xbce7
+¼è 0xbce8
+¼é 0xbce9
+¼ê 0xbcea
+¼ë 0xbceb
+¼ì 0xbcec
+¼í 0xbced
+¼î 0xbcee
+¼ï 0xbcef
+¼ð 0xbcf0
+¼ñ 0xbcf1
+¼ò 0xbcf2
+¼ó 0xbcf3
+¼ô 0xbcf4
+¼õ 0xbcf5
+¼ö 0xbcf6
+¼÷ 0xbcf7
+¼ø 0xbcf8
+¼ù 0xbcf9
+¼ú 0xbcfa
+¼û 0xbcfb
+¼ü 0xbcfc
+¼ý 0xbcfd
+¼þ 0xbcfe
+½@ 0xbd40
+½A 0xbd41
+½B 0xbd42
+½C 0xbd43
+½D 0xbd44
+½E 0xbd45
+½F 0xbd46
+½G 0xbd47
+½H 0xbd48
+½I 0xbd49
+½J 0xbd4a
+½K 0xbd4b
+½L 0xbd4c
+½M 0xbd4d
+½N 0xbd4e
+½O 0xbd4f
+½P 0xbd50
+½Q 0xbd51
+½R 0xbd52
+½S 0xbd53
+½T 0xbd54
+½U 0xbd55
+½V 0xbd56
+½W 0xbd57
+½X 0xbd58
+½Y 0xbd59
+½Z 0xbd5a
+½[ 0xbd5b
+½\ 0xbd5c
+½] 0xbd5d
+½^ 0xbd5e
+½_ 0xbd5f
+½` 0xbd60
+½a 0xbd61
+½b 0xbd62
+½c 0xbd63
+½d 0xbd64
+½e 0xbd65
+½f 0xbd66
+½g 0xbd67
+½h 0xbd68
+½i 0xbd69
+½j 0xbd6a
+½k 0xbd6b
+½l 0xbd6c
+½m 0xbd6d
+½n 0xbd6e
+½o 0xbd6f
+½p 0xbd70
+½q 0xbd71
+½r 0xbd72
+½s 0xbd73
+½t 0xbd74
+½u 0xbd75
+½v 0xbd76
+½w 0xbd77
+½x 0xbd78
+½y 0xbd79
+½z 0xbd7a
+½{ 0xbd7b
+½| 0xbd7c
+½} 0xbd7d
+½~ 0xbd7e
+½¡ 0xbda1
+½¢ 0xbda2
+½£ 0xbda3
+½¤ 0xbda4
+½¥ 0xbda5
+½¦ 0xbda6
+½§ 0xbda7
+½¨ 0xbda8
+½© 0xbda9
+½ª 0xbdaa
+½« 0xbdab
+½¬ 0xbdac
+½­ 0xbdad
+½® 0xbdae
+½¯ 0xbdaf
+½° 0xbdb0
+½± 0xbdb1
+½² 0xbdb2
+½³ 0xbdb3
+½´ 0xbdb4
+½µ 0xbdb5
+½¶ 0xbdb6
+½· 0xbdb7
+½¸ 0xbdb8
+½¹ 0xbdb9
+½º 0xbdba
+½» 0xbdbb
+½¼ 0xbdbc
+½½ 0xbdbd
+½¾ 0xbdbe
+½¿ 0xbdbf
+½À 0xbdc0
+½Á 0xbdc1
+½Â 0xbdc2
+½Ã 0xbdc3
+½Ä 0xbdc4
+½Å 0xbdc5
+½Æ 0xbdc6
+½Ç 0xbdc7
+½È 0xbdc8
+½É 0xbdc9
+½Ê 0xbdca
+½Ë 0xbdcb
+½Ì 0xbdcc
+½Í 0xbdcd
+½Î 0xbdce
+½Ï 0xbdcf
+½Ð 0xbdd0
+½Ñ 0xbdd1
+½Ò 0xbdd2
+½Ó 0xbdd3
+½Ô 0xbdd4
+½Õ 0xbdd5
+½Ö 0xbdd6
+½× 0xbdd7
+½Ø 0xbdd8
+½Ù 0xbdd9
+½Ú 0xbdda
+½Û 0xbddb
+½Ü 0xbddc
+½Ý 0xbddd
+½Þ 0xbdde
+½ß 0xbddf
+½à 0xbde0
+½á 0xbde1
+½â 0xbde2
+½ã 0xbde3
+½ä 0xbde4
+½å 0xbde5
+½æ 0xbde6
+½ç 0xbde7
+½è 0xbde8
+½é 0xbde9
+½ê 0xbdea
+½ë 0xbdeb
+½ì 0xbdec
+½í 0xbded
+½î 0xbdee
+½ï 0xbdef
+½ð 0xbdf0
+½ñ 0xbdf1
+½ò 0xbdf2
+½ó 0xbdf3
+½ô 0xbdf4
+½õ 0xbdf5
+½ö 0xbdf6
+½÷ 0xbdf7
+½ø 0xbdf8
+½ù 0xbdf9
+½ú 0xbdfa
+½û 0xbdfb
+½ü 0xbdfc
+½ý 0xbdfd
+½þ 0xbdfe
+¾@ 0xbe40
+¾A 0xbe41
+¾B 0xbe42
+¾C 0xbe43
+¾D 0xbe44
+¾E 0xbe45
+¾F 0xbe46
+¾G 0xbe47
+¾H 0xbe48
+¾I 0xbe49
+¾J 0xbe4a
+¾K 0xbe4b
+¾L 0xbe4c
+¾M 0xbe4d
+¾N 0xbe4e
+¾O 0xbe4f
+¾P 0xbe50
+¾Q 0xbe51
+¾R 0xbe52
+¾S 0xbe53
+¾T 0xbe54
+¾U 0xbe55
+¾V 0xbe56
+¾W 0xbe57
+¾X 0xbe58
+¾Y 0xbe59
+¾Z 0xbe5a
+¾[ 0xbe5b
+¾\ 0xbe5c
+¾] 0xbe5d
+¾^ 0xbe5e
+¾_ 0xbe5f
+¾` 0xbe60
+¾a 0xbe61
+¾b 0xbe62
+¾c 0xbe63
+¾d 0xbe64
+¾e 0xbe65
+¾f 0xbe66
+¾g 0xbe67
+¾h 0xbe68
+¾i 0xbe69
+¾j 0xbe6a
+¾k 0xbe6b
+¾l 0xbe6c
+¾m 0xbe6d
+¾n 0xbe6e
+¾o 0xbe6f
+¾p 0xbe70
+¾q 0xbe71
+¾r 0xbe72
+¾s 0xbe73
+¾t 0xbe74
+¾u 0xbe75
+¾v 0xbe76
+¾w 0xbe77
+¾x 0xbe78
+¾y 0xbe79
+¾z 0xbe7a
+¾{ 0xbe7b
+¾| 0xbe7c
+¾} 0xbe7d
+¾~ 0xbe7e
+¾¡ 0xbea1
+¾¢ 0xbea2
+¾£ 0xbea3
+¾¤ 0xbea4
+¾¥ 0xbea5
+¾¦ 0xbea6
+äæ 0xe4e6
+äç 0xe4e7
+äè 0xe4e8
+äé 0xe4e9
+äê 0xe4ea
+äë 0xe4eb
+äì 0xe4ec
+äí 0xe4ed
+äî 0xe4ee
+äï 0xe4ef
+äð 0xe4f0
+äñ 0xe4f1
+äò 0xe4f2
+äó 0xe4f3
+äô 0xe4f4
+äõ 0xe4f5
+äö 0xe4f6
+ä÷ 0xe4f7
+äø 0xe4f8
+äù 0xe4f9
+äú 0xe4fa
+äû 0xe4fb
+äü 0xe4fc
+äý 0xe4fd
+äþ 0xe4fe
+å@ 0xe540
+åA 0xe541
+åB 0xe542
+åC 0xe543
+åD 0xe544
+åE 0xe545
+åF 0xe546
+åG 0xe547
+åH 0xe548
+åI 0xe549
+åJ 0xe54a
+åK 0xe54b
+åL 0xe54c
+åM 0xe54d
+åN 0xe54e
+åO 0xe54f
+åP 0xe550
+åQ 0xe551
+åR 0xe552
+åS 0xe553
+åT 0xe554
+åU 0xe555
+åV 0xe556
+åW 0xe557
+åX 0xe558
+åY 0xe559
+åZ 0xe55a
+å[ 0xe55b
+å\ 0xe55c
+å] 0xe55d
+å^ 0xe55e
+å_ 0xe55f
+å` 0xe560
+åa 0xe561
+åb 0xe562
+åc 0xe563
+åd 0xe564
+åe 0xe565
+åf 0xe566
+åg 0xe567
+åh 0xe568
+åi 0xe569
+åj 0xe56a
+åk 0xe56b
+ål 0xe56c
+åm 0xe56d
+ån 0xe56e
+åo 0xe56f
+åp 0xe570
+åq 0xe571
+år 0xe572
+ås 0xe573
+åt 0xe574
+åu 0xe575
+åv 0xe576
+åw 0xe577
+åx 0xe578
+åy 0xe579
+åz 0xe57a
+å{ 0xe57b
+å| 0xe57c
+å} 0xe57d
+å~ 0xe57e
+å¡ 0xe5a1
+å¢ 0xe5a2
+å£ 0xe5a3
+å¤ 0xe5a4
+å¥ 0xe5a5
+å¦ 0xe5a6
+å§ 0xe5a7
+å¨ 0xe5a8
+å© 0xe5a9
+åª 0xe5aa
+å« 0xe5ab
+å¬ 0xe5ac
+å­ 0xe5ad
+å® 0xe5ae
+å¯ 0xe5af
+å° 0xe5b0
+å± 0xe5b1
+å² 0xe5b2
+å³ 0xe5b3
+å´ 0xe5b4
+åµ 0xe5b5
+å¶ 0xe5b6
+å· 0xe5b7
+å¸ 0xe5b8
+å¹ 0xe5b9
+åº 0xe5ba
+å» 0xe5bb
+å¼ 0xe5bc
+å½ 0xe5bd
+å¾ 0xe5be
+å¿ 0xe5bf
+åÀ 0xe5c0
+åÁ 0xe5c1
+å 0xe5c2
+åà 0xe5c3
+åÄ 0xe5c4
+åÅ 0xe5c5
+åÆ 0xe5c6
+åÇ 0xe5c7
+åÈ 0xe5c8
+åÉ 0xe5c9
+åÊ 0xe5ca
+åË 0xe5cb
+åÌ 0xe5cc
+åÍ 0xe5cd
+åÎ 0xe5ce
+åÏ 0xe5cf
+åÐ 0xe5d0
+åÑ 0xe5d1
+åÒ 0xe5d2
+åÓ 0xe5d3
+åÔ 0xe5d4
+åÕ 0xe5d5
+åÖ 0xe5d6
+å× 0xe5d7
+åØ 0xe5d8
+åÙ 0xe5d9
+åÚ 0xe5da
+åÛ 0xe5db
+åÜ 0xe5dc
+åÝ 0xe5dd
+åÞ 0xe5de
+åß 0xe5df
+åà 0xe5e0
+åá 0xe5e1
+åâ 0xe5e2
+åã 0xe5e3
+åä 0xe5e4
+åå 0xe5e5
+åæ 0xe5e6
+åç 0xe5e7
+åè 0xe5e8
+åé 0xe5e9
+åê 0xe5ea
+åë 0xe5eb
+åì 0xe5ec
+åí 0xe5ed
+åî 0xe5ee
+åï 0xe5ef
+åð 0xe5f0
+åñ 0xe5f1
+åò 0xe5f2
+åó 0xe5f3
+åô 0xe5f4
+åõ 0xe5f5
+åö 0xe5f6
+å÷ 0xe5f7
+åø 0xe5f8
+åù 0xe5f9
+åú 0xe5fa
+åû 0xe5fb
+åü 0xe5fc
+åý 0xe5fd
+åþ 0xe5fe
+æ@ 0xe640
+æA 0xe641
+æB 0xe642
+æC 0xe643
+æD 0xe644
+æE 0xe645
+æF 0xe646
+æG 0xe647
+æH 0xe648
+æI 0xe649
+æJ 0xe64a
+æK 0xe64b
+æL 0xe64c
+æM 0xe64d
+æN 0xe64e
+æO 0xe64f
+æP 0xe650
+æQ 0xe651
+æR 0xe652
+æS 0xe653
+æT 0xe654
+æU 0xe655
+æV 0xe656
+æW 0xe657
+æX 0xe658
+æY 0xe659
+æZ 0xe65a
+æ[ 0xe65b
+æ\ 0xe65c
+æ] 0xe65d
+æ^ 0xe65e
+æ_ 0xe65f
+æ` 0xe660
+æa 0xe661
+æb 0xe662
+æc 0xe663
+æd 0xe664
+æe 0xe665
+æf 0xe666
+æg 0xe667
+æh 0xe668
+æi 0xe669
+æj 0xe66a
+æk 0xe66b
+æl 0xe66c
+æm 0xe66d
+æn 0xe66e
+æo 0xe66f
+æp 0xe670
+æq 0xe671
+ær 0xe672
+æs 0xe673
+æt 0xe674
+æu 0xe675
+æv 0xe676
+æw 0xe677
+æx 0xe678
+æy 0xe679
+æz 0xe67a
+æ{ 0xe67b
+æ| 0xe67c
+æ} 0xe67d
+æ~ 0xe67e
+æ¡ 0xe6a1
+æ¢ 0xe6a2
+æ£ 0xe6a3
+æ¤ 0xe6a4
+æ¥ 0xe6a5
+æ¦ 0xe6a6
+æ§ 0xe6a7
+æ¨ 0xe6a8
+æ© 0xe6a9
+æª 0xe6aa
+æ« 0xe6ab
+æ¬ 0xe6ac
+æ­ 0xe6ad
+æ® 0xe6ae
+æ¯ 0xe6af
+æ° 0xe6b0
+æ± 0xe6b1
+æ² 0xe6b2
+æ³ 0xe6b3
+æ´ 0xe6b4
+æµ 0xe6b5
+æ¶ 0xe6b6
+æ· 0xe6b7
+æ¸ 0xe6b8
+æ¹ 0xe6b9
+æº 0xe6ba
+æ» 0xe6bb
+æ¼ 0xe6bc
+æ½ 0xe6bd
+æ¾ 0xe6be
+æ¿ 0xe6bf
+æÀ 0xe6c0
+æÁ 0xe6c1
+æ 0xe6c2
+æà 0xe6c3
+æÄ 0xe6c4
+æÅ 0xe6c5
+æÆ 0xe6c6
+æÇ 0xe6c7
+æÈ 0xe6c8
+æÉ 0xe6c9
+æÊ 0xe6ca
+æË 0xe6cb
+æÌ 0xe6cc
+æÍ 0xe6cd
+æÎ 0xe6ce
+æÏ 0xe6cf
+æÐ 0xe6d0
+æÑ 0xe6d1
+æÒ 0xe6d2
+æÓ 0xe6d3
+æÔ 0xe6d4
+æÕ 0xe6d5
+æÖ 0xe6d6
+æ× 0xe6d7
+æØ 0xe6d8
+æÙ 0xe6d9
+æÚ 0xe6da
+æÛ 0xe6db
+æÜ 0xe6dc
+æÝ 0xe6dd
+æÞ 0xe6de
+æß 0xe6df
+æà 0xe6e0
+æá 0xe6e1
+æâ 0xe6e2
+æã 0xe6e3
+æä 0xe6e4
+æå 0xe6e5
+ææ 0xe6e6
+æç 0xe6e7
+æè 0xe6e8
+æé 0xe6e9
+æê 0xe6ea
+æë 0xe6eb
+æì 0xe6ec
+æí 0xe6ed
+æî 0xe6ee
+æï 0xe6ef
+æð 0xe6f0
+æñ 0xe6f1
+æò 0xe6f2
+æó 0xe6f3
+æô 0xe6f4
+æõ 0xe6f5
+æö 0xe6f6
+æ÷ 0xe6f7
+æø 0xe6f8
+æù 0xe6f9
+æú 0xe6fa
+æû 0xe6fb
+æü 0xe6fc
+æý 0xe6fd
+æþ 0xe6fe
+ç@ 0xe740
+çA 0xe741
+çB 0xe742
+çC 0xe743
+çD 0xe744
+çE 0xe745
+çF 0xe746
+çG 0xe747
+çH 0xe748
+çI 0xe749
+çJ 0xe74a
+çK 0xe74b
+çL 0xe74c
+çM 0xe74d
+çN 0xe74e
+çO 0xe74f
+çP 0xe750
+çQ 0xe751
+çR 0xe752
+çS 0xe753
+çT 0xe754
+çU 0xe755
+çV 0xe756
+çW 0xe757
+çX 0xe758
+çY 0xe759
+çZ 0xe75a
+ç[ 0xe75b
+ç\ 0xe75c
+ç] 0xe75d
+ç^ 0xe75e
+ç_ 0xe75f
+ç` 0xe760
+ça 0xe761
+çb 0xe762
+çc 0xe763
+çd 0xe764
+çe 0xe765
+çf 0xe766
+çg 0xe767
+çh 0xe768
+çi 0xe769
+çj 0xe76a
+çk 0xe76b
+çl 0xe76c
+çm 0xe76d
+çn 0xe76e
+ço 0xe76f
+çp 0xe770
+çq 0xe771
+çr 0xe772
+çs 0xe773
+çt 0xe774
+çu 0xe775
+çv 0xe776
+çw 0xe777
+çx 0xe778
+çy 0xe779
+çz 0xe77a
+ç{ 0xe77b
+ç| 0xe77c
+ç} 0xe77d
+ç~ 0xe77e
+ç¡ 0xe7a1
+ç¢ 0xe7a2
+ç£ 0xe7a3
+ç¤ 0xe7a4
+ç¥ 0xe7a5
+ç¦ 0xe7a6
+ç§ 0xe7a7
+ç¨ 0xe7a8
+ç© 0xe7a9
+çª 0xe7aa
+ç« 0xe7ab
+ç¬ 0xe7ac
+ç­ 0xe7ad
+ç® 0xe7ae
+ç¯ 0xe7af
+ç° 0xe7b0
+ç± 0xe7b1
+ç² 0xe7b2
+ç³ 0xe7b3
+ç´ 0xe7b4
+çµ 0xe7b5
+ç¶ 0xe7b6
+ç· 0xe7b7
+ç¸ 0xe7b8
+ç¹ 0xe7b9
+çº 0xe7ba
+ç» 0xe7bb
+ç¼ 0xe7bc
+ç½ 0xe7bd
+ç¾ 0xe7be
+ç¿ 0xe7bf
+çÀ 0xe7c0
+çÁ 0xe7c1
+ç 0xe7c2
+çà 0xe7c3
+çÄ 0xe7c4
+çÅ 0xe7c5
+çÆ 0xe7c6
+çÇ 0xe7c7
+çÈ 0xe7c8
+çÉ 0xe7c9
+çÊ 0xe7ca
+çË 0xe7cb
+çÌ 0xe7cc
+çÍ 0xe7cd
+çÎ 0xe7ce
+çÏ 0xe7cf
+çÐ 0xe7d0
+çÑ 0xe7d1
+çÒ 0xe7d2
+çÓ 0xe7d3
+çÔ 0xe7d4
+çÕ 0xe7d5
+çÖ 0xe7d6
+ç× 0xe7d7
+çØ 0xe7d8
+çÙ 0xe7d9
+çÚ 0xe7da
+çÛ 0xe7db
+çÜ 0xe7dc
+çÝ 0xe7dd
+çÞ 0xe7de
+çß 0xe7df
+çà 0xe7e0
+çá 0xe7e1
+çâ 0xe7e2
+çã 0xe7e3
+çä 0xe7e4
+çå 0xe7e5
+çæ 0xe7e6
+çç 0xe7e7
+çè 0xe7e8
+çé 0xe7e9
+çê 0xe7ea
+çë 0xe7eb
+çì 0xe7ec
+çí 0xe7ed
+çî 0xe7ee
+çï 0xe7ef
+çð 0xe7f0
+çñ 0xe7f1
+çò 0xe7f2
+çó 0xe7f3
+çô 0xe7f4
+çõ 0xe7f5
+çö 0xe7f6
+ç÷ 0xe7f7
+çø 0xe7f8
+çù 0xe7f9
+çú 0xe7fa
+çû 0xe7fb
+çü 0xe7fc
+çý 0xe7fd
+çþ 0xe7fe
+è@ 0xe840
+èA 0xe841
+èB 0xe842
+èC 0xe843
+èD 0xe844
+èE 0xe845
+èF 0xe846
+èG 0xe847
+èH 0xe848
+èI 0xe849
+èJ 0xe84a
+èK 0xe84b
+èL 0xe84c
+èM 0xe84d
+èN 0xe84e
+èO 0xe84f
+èP 0xe850
+èQ 0xe851
+èR 0xe852
+èS 0xe853
+èT 0xe854
+èU 0xe855
+èV 0xe856
+èW 0xe857
+èX 0xe858
+èY 0xe859
+èZ 0xe85a
+è[ 0xe85b
+è\ 0xe85c
+è] 0xe85d
+è^ 0xe85e
+è_ 0xe85f
+è` 0xe860
+èa 0xe861
+èb 0xe862
+èc 0xe863
+èd 0xe864
+èe 0xe865
+èf 0xe866
+èg 0xe867
+èh 0xe868
+èi 0xe869
+èj 0xe86a
+èk 0xe86b
+èl 0xe86c
+èm 0xe86d
+èn 0xe86e
+èo 0xe86f
+èp 0xe870
+èq 0xe871
+èr 0xe872
+ès 0xe873
+èt 0xe874
+èu 0xe875
+èv 0xe876
+èw 0xe877
+èx 0xe878
+èy 0xe879
+èz 0xe87a
+è{ 0xe87b
+è| 0xe87c
+è} 0xe87d
+è~ 0xe87e
+è¡ 0xe8a1
+è¢ 0xe8a2
+è£ 0xe8a3
+è¤ 0xe8a4
+è¥ 0xe8a5
+è¦ 0xe8a6
+è§ 0xe8a7
+è¨ 0xe8a8
+è© 0xe8a9
+èª 0xe8aa
+è« 0xe8ab
+è¬ 0xe8ac
+è­ 0xe8ad
+è® 0xe8ae
+è¯ 0xe8af
+è° 0xe8b0
+è± 0xe8b1
+è² 0xe8b2
+è³ 0xe8b3
+è´ 0xe8b4
+èµ 0xe8b5
+è¶ 0xe8b6
+è· 0xe8b7
+è¸ 0xe8b8
+è¹ 0xe8b9
+èº 0xe8ba
+è» 0xe8bb
+è¼ 0xe8bc
+è½ 0xe8bd
+è¾ 0xe8be
+è¿ 0xe8bf
+èÀ 0xe8c0
+èÁ 0xe8c1
+è 0xe8c2
+èà 0xe8c3
+èÄ 0xe8c4
+èÅ 0xe8c5
+èÆ 0xe8c6
+èÇ 0xe8c7
+èÈ 0xe8c8
+èÉ 0xe8c9
+èÊ 0xe8ca
+èË 0xe8cb
+èÌ 0xe8cc
+èÍ 0xe8cd
+èÎ 0xe8ce
+èÏ 0xe8cf
+èÐ 0xe8d0
+èÑ 0xe8d1
+èÒ 0xe8d2
+èÓ 0xe8d3
+èÔ 0xe8d4
+èÕ 0xe8d5
+èÖ 0xe8d6
+è× 0xe8d7
+èØ 0xe8d8
+èÙ 0xe8d9
+èÚ 0xe8da
+èÛ 0xe8db
+èÜ 0xe8dc
+èÝ 0xe8dd
+èÞ 0xe8de
+èß 0xe8df
+èà 0xe8e0
+èá 0xe8e1
+èâ 0xe8e2
+èã 0xe8e3
+èä 0xe8e4
+èå 0xe8e5
+èæ 0xe8e6
+èç 0xe8e7
+èè 0xe8e8
+èé 0xe8e9
+èê 0xe8ea
+èë 0xe8eb
+èì 0xe8ec
+èí 0xe8ed
+èî 0xe8ee
+èï 0xe8ef
+èð 0xe8f0
+èñ 0xe8f1
+èò 0xe8f2
+èó 0xe8f3
+¾§ 0xbea7
+¾¨ 0xbea8
+¾© 0xbea9
+¾ª 0xbeaa
+¾« 0xbeab
+¾¬ 0xbeac
+¾­ 0xbead
+¾® 0xbeae
+¾¯ 0xbeaf
+¾° 0xbeb0
+¾± 0xbeb1
+¾² 0xbeb2
+¾³ 0xbeb3
+¾´ 0xbeb4
+¾µ 0xbeb5
+¾¶ 0xbeb6
+¾· 0xbeb7
+¾¸ 0xbeb8
+¾¹ 0xbeb9
+¾º 0xbeba
+¾» 0xbebb
+¾¼ 0xbebc
+¾½ 0xbebd
+¾¾ 0xbebe
+¾¿ 0xbebf
+¾À 0xbec0
+¾Á 0xbec1
+¾Â 0xbec2
+¾Ã 0xbec3
+¾Ä 0xbec4
+¾Å 0xbec5
+¾Æ 0xbec6
+¾Ç 0xbec7
+¾È 0xbec8
+¾É 0xbec9
+¾Ê 0xbeca
+¾Ë 0xbecb
+¾Ì 0xbecc
+¾Í 0xbecd
+¾Î 0xbece
+¾Ï 0xbecf
+¾Ð 0xbed0
+¾Ñ 0xbed1
+¾Ò 0xbed2
+¾Ó 0xbed3
+¾Ô 0xbed4
+¾Õ 0xbed5
+¾Ö 0xbed6
+¾× 0xbed7
+¾Ø 0xbed8
+¾Ù 0xbed9
+¾Ú 0xbeda
+¾Û 0xbedb
+¾Ü 0xbedc
+¾Ý 0xbedd
+¾Þ 0xbede
+¾ß 0xbedf
+¾à 0xbee0
+¾á 0xbee1
+¾â 0xbee2
+¾ã 0xbee3
+¾ä 0xbee4
+¾å 0xbee5
+¾æ 0xbee6
+¾ç 0xbee7
+¾è 0xbee8
+¾é 0xbee9
+¾ê 0xbeea
+¾ë 0xbeeb
+¾ì 0xbeec
+¾í 0xbeed
+¾î 0xbeee
+¾ï 0xbeef
+¾ð 0xbef0
+¾ñ 0xbef1
+¾ò 0xbef2
+¾ó 0xbef3
+¾ô 0xbef4
+¾õ 0xbef5
+¾ö 0xbef6
+¾÷ 0xbef7
+¾ø 0xbef8
+¾ù 0xbef9
+¾ú 0xbefa
+¾û 0xbefb
+¾ü 0xbefc
+¾ý 0xbefd
+¾þ 0xbefe
+¿@ 0xbf40
+¿A 0xbf41
+¿B 0xbf42
+¿C 0xbf43
+¿D 0xbf44
+¿E 0xbf45
+¿F 0xbf46
+¿G 0xbf47
+¿H 0xbf48
+¿I 0xbf49
+¿J 0xbf4a
+¿K 0xbf4b
+¿L 0xbf4c
+¿M 0xbf4d
+¿N 0xbf4e
+¿O 0xbf4f
+¿P 0xbf50
+¿Q 0xbf51
+¿R 0xbf52
+¿S 0xbf53
+¿T 0xbf54
+¿U 0xbf55
+¿V 0xbf56
+¿W 0xbf57
+¿X 0xbf58
+¿Y 0xbf59
+¿Z 0xbf5a
+¿[ 0xbf5b
+¿\ 0xbf5c
+¿] 0xbf5d
+¿^ 0xbf5e
+¿_ 0xbf5f
+¿` 0xbf60
+¿a 0xbf61
+¿b 0xbf62
+¿c 0xbf63
+¿d 0xbf64
+¿e 0xbf65
+¿f 0xbf66
+¿g 0xbf67
+¿h 0xbf68
+¿i 0xbf69
+¿j 0xbf6a
+¿k 0xbf6b
+¿l 0xbf6c
+¿m 0xbf6d
+¿n 0xbf6e
+¿o 0xbf6f
+¿p 0xbf70
+¿q 0xbf71
+¿r 0xbf72
+¿s 0xbf73
+¿t 0xbf74
+¿u 0xbf75
+¿v 0xbf76
+¿w 0xbf77
+¿x 0xbf78
+¿y 0xbf79
+¿z 0xbf7a
+¿{ 0xbf7b
+¿| 0xbf7c
+¿} 0xbf7d
+¿~ 0xbf7e
+¿¡ 0xbfa1
+¿¢ 0xbfa2
+¿£ 0xbfa3
+¿¤ 0xbfa4
+¿¥ 0xbfa5
+¿¦ 0xbfa6
+¿§ 0xbfa7
+¿¨ 0xbfa8
+¿© 0xbfa9
+¿ª 0xbfaa
+¿« 0xbfab
+¿¬ 0xbfac
+¿­ 0xbfad
+¿® 0xbfae
+¿¯ 0xbfaf
+¿° 0xbfb0
+¿± 0xbfb1
+¿² 0xbfb2
+¿³ 0xbfb3
+¿´ 0xbfb4
+¿µ 0xbfb5
+¿¶ 0xbfb6
+¿· 0xbfb7
+¿¸ 0xbfb8
+¿¹ 0xbfb9
+¿º 0xbfba
+¿» 0xbfbb
+¿¼ 0xbfbc
+¿½ 0xbfbd
+¿¾ 0xbfbe
+¿¿ 0xbfbf
+¿À 0xbfc0
+¿Á 0xbfc1
+¿Â 0xbfc2
+¿Ã 0xbfc3
+¿Ä 0xbfc4
+¿Å 0xbfc5
+¿Æ 0xbfc6
+¿Ç 0xbfc7
+¿È 0xbfc8
+¿É 0xbfc9
+¿Ê 0xbfca
+¿Ë 0xbfcb
+¿Ì 0xbfcc
+¿Í 0xbfcd
+¿Î 0xbfce
+¿Ï 0xbfcf
+¿Ð 0xbfd0
+¿Ñ 0xbfd1
+¿Ò 0xbfd2
+¿Ó 0xbfd3
+¿Ô 0xbfd4
+¿Õ 0xbfd5
+¿Ö 0xbfd6
+¿× 0xbfd7
+¿Ø 0xbfd8
+¿Ù 0xbfd9
+¿Ú 0xbfda
+¿Û 0xbfdb
+¿Ü 0xbfdc
+¿Ý 0xbfdd
+¿Þ 0xbfde
+¿ß 0xbfdf
+¿à 0xbfe0
+¿á 0xbfe1
+¿â 0xbfe2
+¿ã 0xbfe3
+¿ä 0xbfe4
+¿å 0xbfe5
+¿æ 0xbfe6
+¿ç 0xbfe7
+¿è 0xbfe8
+¿é 0xbfe9
+¿ê 0xbfea
+¿ë 0xbfeb
+¿ì 0xbfec
+¿í 0xbfed
+¿î 0xbfee
+¿ï 0xbfef
+¿ð 0xbff0
+¿ñ 0xbff1
+¿ò 0xbff2
+¿ó 0xbff3
+¿ô 0xbff4
+¿õ 0xbff5
+¿ö 0xbff6
+¿÷ 0xbff7
+¿ø 0xbff8
+¿ù 0xbff9
+¿ú 0xbffa
+¿û 0xbffb
+¿ü 0xbffc
+¿ý 0xbffd
+¿þ 0xbffe
+À@ 0xc040
+ÀA 0xc041
+ÀB 0xc042
+ÀC 0xc043
+ÀD 0xc044
+ÀE 0xc045
+ÀF 0xc046
+ÀG 0xc047
+ÀH 0xc048
+ÀI 0xc049
+ÀJ 0xc04a
+ÀK 0xc04b
+ÀL 0xc04c
+ÀM 0xc04d
+ÀN 0xc04e
+ÀO 0xc04f
+ÀP 0xc050
+ÀQ 0xc051
+ÀR 0xc052
+ÀS 0xc053
+ÀT 0xc054
+ÀU 0xc055
+ÀV 0xc056
+ÀW 0xc057
+ÀX 0xc058
+ÀY 0xc059
+ÀZ 0xc05a
+À[ 0xc05b
+À\ 0xc05c
+À] 0xc05d
+À^ 0xc05e
+À_ 0xc05f
+À` 0xc060
+Àa 0xc061
+Àb 0xc062
+Àc 0xc063
+Àd 0xc064
+Àe 0xc065
+Àf 0xc066
+Àg 0xc067
+Àh 0xc068
+Ài 0xc069
+Àj 0xc06a
+Àk 0xc06b
+Àl 0xc06c
+Àm 0xc06d
+Àn 0xc06e
+Ào 0xc06f
+Àp 0xc070
+Àq 0xc071
+Àr 0xc072
+Às 0xc073
+Àt 0xc074
+èô 0xe8f4
+èõ 0xe8f5
+èö 0xe8f6
+è÷ 0xe8f7
+èø 0xe8f8
+èù 0xe8f9
+èú 0xe8fa
+èû 0xe8fb
+èü 0xe8fc
+èý 0xe8fd
+èþ 0xe8fe
+é@ 0xe940
+éA 0xe941
+éB 0xe942
+éC 0xe943
+éD 0xe944
+éE 0xe945
+éF 0xe946
+éG 0xe947
+éH 0xe948
+éI 0xe949
+éJ 0xe94a
+éK 0xe94b
+éL 0xe94c
+éM 0xe94d
+éN 0xe94e
+éO 0xe94f
+éP 0xe950
+éQ 0xe951
+éR 0xe952
+éS 0xe953
+éT 0xe954
+éU 0xe955
+éV 0xe956
+éW 0xe957
+éX 0xe958
+éY 0xe959
+éZ 0xe95a
+é[ 0xe95b
+é\ 0xe95c
+é] 0xe95d
+é^ 0xe95e
+é_ 0xe95f
+é` 0xe960
+éa 0xe961
+éb 0xe962
+éc 0xe963
+éd 0xe964
+ée 0xe965
+éf 0xe966
+ég 0xe967
+éh 0xe968
+éi 0xe969
+éj 0xe96a
+ék 0xe96b
+él 0xe96c
+ém 0xe96d
+én 0xe96e
+éo 0xe96f
+ép 0xe970
+éq 0xe971
+ér 0xe972
+és 0xe973
+ét 0xe974
+éu 0xe975
+év 0xe976
+éw 0xe977
+éx 0xe978
+éy 0xe979
+éz 0xe97a
+é{ 0xe97b
+é| 0xe97c
+é} 0xe97d
+é~ 0xe97e
+é¡ 0xe9a1
+é¢ 0xe9a2
+é£ 0xe9a3
+é¤ 0xe9a4
+é¥ 0xe9a5
+é¦ 0xe9a6
+é§ 0xe9a7
+é¨ 0xe9a8
+é© 0xe9a9
+éª 0xe9aa
+é« 0xe9ab
+é¬ 0xe9ac
+é­ 0xe9ad
+é® 0xe9ae
+é¯ 0xe9af
+é° 0xe9b0
+é± 0xe9b1
+é² 0xe9b2
+é³ 0xe9b3
+é´ 0xe9b4
+éµ 0xe9b5
+é¶ 0xe9b6
+é· 0xe9b7
+é¸ 0xe9b8
+é¹ 0xe9b9
+éº 0xe9ba
+é» 0xe9bb
+é¼ 0xe9bc
+é½ 0xe9bd
+é¾ 0xe9be
+é¿ 0xe9bf
+éÀ 0xe9c0
+éÁ 0xe9c1
+é 0xe9c2
+éà 0xe9c3
+éÄ 0xe9c4
+éÅ 0xe9c5
+éÆ 0xe9c6
+éÇ 0xe9c7
+éÈ 0xe9c8
+éÉ 0xe9c9
+éÊ 0xe9ca
+éË 0xe9cb
+éÌ 0xe9cc
+éÍ 0xe9cd
+éÎ 0xe9ce
+éÏ 0xe9cf
+éÐ 0xe9d0
+éÑ 0xe9d1
+éÒ 0xe9d2
+éÓ 0xe9d3
+éÔ 0xe9d4
+éÕ 0xe9d5
+éÖ 0xe9d6
+é× 0xe9d7
+éØ 0xe9d8
+éÙ 0xe9d9
+éÚ 0xe9da
+éÛ 0xe9db
+éÜ 0xe9dc
+éÝ 0xe9dd
+éÞ 0xe9de
+éß 0xe9df
+éà 0xe9e0
+éá 0xe9e1
+éâ 0xe9e2
+éã 0xe9e3
+éä 0xe9e4
+éå 0xe9e5
+éæ 0xe9e6
+éç 0xe9e7
+éè 0xe9e8
+éé 0xe9e9
+éê 0xe9ea
+éë 0xe9eb
+éì 0xe9ec
+éí 0xe9ed
+éî 0xe9ee
+éï 0xe9ef
+éð 0xe9f0
+éñ 0xe9f1
+éò 0xe9f2
+éó 0xe9f3
+éô 0xe9f4
+éõ 0xe9f5
+éö 0xe9f6
+é÷ 0xe9f7
+éø 0xe9f8
+éù 0xe9f9
+éú 0xe9fa
+éû 0xe9fb
+éü 0xe9fc
+éý 0xe9fd
+éþ 0xe9fe
+ê@ 0xea40
+êA 0xea41
+êB 0xea42
+êC 0xea43
+êD 0xea44
+êE 0xea45
+êF 0xea46
+êG 0xea47
+êH 0xea48
+êI 0xea49
+êJ 0xea4a
+êK 0xea4b
+êL 0xea4c
+êM 0xea4d
+êN 0xea4e
+êO 0xea4f
+êP 0xea50
+êQ 0xea51
+êR 0xea52
+êS 0xea53
+êT 0xea54
+êU 0xea55
+êV 0xea56
+êW 0xea57
+êX 0xea58
+êY 0xea59
+êZ 0xea5a
+ê[ 0xea5b
+ê\ 0xea5c
+ê] 0xea5d
+ê^ 0xea5e
+ê_ 0xea5f
+ê` 0xea60
+êa 0xea61
+êb 0xea62
+êc 0xea63
+êd 0xea64
+êe 0xea65
+êf 0xea66
+êg 0xea67
+êh 0xea68
+êi 0xea69
+êj 0xea6a
+êk 0xea6b
+êl 0xea6c
+êm 0xea6d
+ên 0xea6e
+êo 0xea6f
+êp 0xea70
+êq 0xea71
+êr 0xea72
+ês 0xea73
+êt 0xea74
+êu 0xea75
+êv 0xea76
+êw 0xea77
+êx 0xea78
+êy 0xea79
+êz 0xea7a
+ê{ 0xea7b
+ê| 0xea7c
+ê} 0xea7d
+ê~ 0xea7e
+ê¡ 0xeaa1
+ê¢ 0xeaa2
+ê£ 0xeaa3
+ê¤ 0xeaa4
+ê¥ 0xeaa5
+ê¦ 0xeaa6
+ê§ 0xeaa7
+ê¨ 0xeaa8
+ê© 0xeaa9
+êª 0xeaaa
+ê« 0xeaab
+ê¬ 0xeaac
+ê­ 0xeaad
+ê® 0xeaae
+ê¯ 0xeaaf
+ê° 0xeab0
+ê± 0xeab1
+ê² 0xeab2
+ê³ 0xeab3
+ê´ 0xeab4
+êµ 0xeab5
+ê¶ 0xeab6
+ê· 0xeab7
+ê¸ 0xeab8
+ê¹ 0xeab9
+êº 0xeaba
+ê» 0xeabb
+ê¼ 0xeabc
+ê½ 0xeabd
+ê¾ 0xeabe
+ê¿ 0xeabf
+êÀ 0xeac0
+êÁ 0xeac1
+ê 0xeac2
+êà 0xeac3
+êÄ 0xeac4
+êÅ 0xeac5
+êÆ 0xeac6
+êÇ 0xeac7
+êÈ 0xeac8
+êÉ 0xeac9
+êÊ 0xeaca
+êË 0xeacb
+êÌ 0xeacc
+êÍ 0xeacd
+êÎ 0xeace
+êÏ 0xeacf
+êÐ 0xead0
+êÑ 0xead1
+êÒ 0xead2
+êÓ 0xead3
+êÔ 0xead4
+êÕ 0xead5
+êÖ 0xead6
+ê× 0xead7
+êØ 0xead8
+êÙ 0xead9
+êÚ 0xeada
+êÛ 0xeadb
+êÜ 0xeadc
+êÝ 0xeadd
+êÞ 0xeade
+êß 0xeadf
+êà 0xeae0
+êá 0xeae1
+êâ 0xeae2
+êã 0xeae3
+êä 0xeae4
+êå 0xeae5
+êæ 0xeae6
+êç 0xeae7
+êè 0xeae8
+êé 0xeae9
+êê 0xeaea
+êë 0xeaeb
+êì 0xeaec
+êí 0xeaed
+êî 0xeaee
+êï 0xeaef
+êð 0xeaf0
+êñ 0xeaf1
+êò 0xeaf2
+êó 0xeaf3
+êô 0xeaf4
+êõ 0xeaf5
+êö 0xeaf6
+ê÷ 0xeaf7
+êø 0xeaf8
+êù 0xeaf9
+êú 0xeafa
+êû 0xeafb
+êü 0xeafc
+êý 0xeafd
+êþ 0xeafe
+ë@ 0xeb40
+ëA 0xeb41
+ëB 0xeb42
+ëC 0xeb43
+ëD 0xeb44
+ëE 0xeb45
+ëF 0xeb46
+ëG 0xeb47
+ëH 0xeb48
+ëI 0xeb49
+ëJ 0xeb4a
+ëK 0xeb4b
+ëL 0xeb4c
+ëM 0xeb4d
+ëN 0xeb4e
+ëO 0xeb4f
+ëP 0xeb50
+ëQ 0xeb51
+ëR 0xeb52
+ëS 0xeb53
+ëT 0xeb54
+ëU 0xeb55
+ëV 0xeb56
+ëW 0xeb57
+ëX 0xeb58
+ëY 0xeb59
+ëZ 0xeb5a
+ë[ 0xeb5b
+ë\ 0xeb5c
+ë] 0xeb5d
+ë^ 0xeb5e
+ë_ 0xeb5f
+ë` 0xeb60
+ëa 0xeb61
+ëb 0xeb62
+ëc 0xeb63
+ëd 0xeb64
+ëe 0xeb65
+ëf 0xeb66
+ëg 0xeb67
+ëh 0xeb68
+ëi 0xeb69
+ëj 0xeb6a
+ëk 0xeb6b
+ël 0xeb6c
+ëm 0xeb6d
+ën 0xeb6e
+ëo 0xeb6f
+ëp 0xeb70
+ëq 0xeb71
+ër 0xeb72
+ës 0xeb73
+ët 0xeb74
+ëu 0xeb75
+ëv 0xeb76
+ëw 0xeb77
+ëx 0xeb78
+ëy 0xeb79
+ëz 0xeb7a
+ë{ 0xeb7b
+ë| 0xeb7c
+ë} 0xeb7d
+ë~ 0xeb7e
+ë¡ 0xeba1
+ë¢ 0xeba2
+ë£ 0xeba3
+ë¤ 0xeba4
+ë¥ 0xeba5
+ë¦ 0xeba6
+ë§ 0xeba7
+ë¨ 0xeba8
+ë© 0xeba9
+ëª 0xebaa
+ë« 0xebab
+ë¬ 0xebac
+ë­ 0xebad
+ë® 0xebae
+ë¯ 0xebaf
+ë° 0xebb0
+ë± 0xebb1
+ë² 0xebb2
+ë³ 0xebb3
+ë´ 0xebb4
+ëµ 0xebb5
+ë¶ 0xebb6
+ë· 0xebb7
+ë¸ 0xebb8
+ë¹ 0xebb9
+ëº 0xebba
+ë» 0xebbb
+ë¼ 0xebbc
+ë½ 0xebbd
+ë¾ 0xebbe
+ë¿ 0xebbf
+ëÀ 0xebc0
+ëÁ 0xebc1
+ë 0xebc2
+ëà 0xebc3
+ëÄ 0xebc4
+ëÅ 0xebc5
+ëÆ 0xebc6
+ëÇ 0xebc7
+ëÈ 0xebc8
+ëÉ 0xebc9
+ëÊ 0xebca
+ëË 0xebcb
+ëÌ 0xebcc
+ëÍ 0xebcd
+ëÎ 0xebce
+ëÏ 0xebcf
+ëÐ 0xebd0
+ëÑ 0xebd1
+ëÒ 0xebd2
+ëÓ 0xebd3
+ëÔ 0xebd4
+ëÕ 0xebd5
+ëÖ 0xebd6
+ë× 0xebd7
+ëØ 0xebd8
+ëÙ 0xebd9
+ëÚ 0xebda
+ëÛ 0xebdb
+ëÜ 0xebdc
+ëÝ 0xebdd
+ëÞ 0xebde
+ëß 0xebdf
+ëà 0xebe0
+ëá 0xebe1
+ëâ 0xebe2
+ëã 0xebe3
+ëä 0xebe4
+ëå 0xebe5
+ëæ 0xebe6
+ëç 0xebe7
+ëè 0xebe8
+ëé 0xebe9
+ëê 0xebea
+ëë 0xebeb
+ëì 0xebec
+ëí 0xebed
+ëî 0xebee
+ëï 0xebef
+ëð 0xebf0
+ëñ 0xebf1
+ëò 0xebf2
+ëó 0xebf3
+ëô 0xebf4
+ëõ 0xebf5
+ëö 0xebf6
+ë÷ 0xebf7
+ëø 0xebf8
+ëù 0xebf9
+ëú 0xebfa
+ëû 0xebfb
+ëü 0xebfc
+ëý 0xebfd
+ëþ 0xebfe
+ì@ 0xec40
+ìA 0xec41
+ìB 0xec42
+ìC 0xec43
+ìD 0xec44
+ìE 0xec45
+ìF 0xec46
+ìG 0xec47
+ìH 0xec48
+ìI 0xec49
+ìJ 0xec4a
+ìK 0xec4b
+ìL 0xec4c
+ìM 0xec4d
+ìN 0xec4e
+ìO 0xec4f
+ìP 0xec50
+ìQ 0xec51
+ìR 0xec52
+ìS 0xec53
+ìT 0xec54
+ìU 0xec55
+ìV 0xec56
+ìW 0xec57
+ìX 0xec58
+ìY 0xec59
+ìZ 0xec5a
+ì[ 0xec5b
+ì\ 0xec5c
+ì] 0xec5d
+ì^ 0xec5e
+ì_ 0xec5f
+ì` 0xec60
+ìa 0xec61
+ìb 0xec62
+ìc 0xec63
+ìd 0xec64
+ìe 0xec65
+ìf 0xec66
+ìg 0xec67
+ìh 0xec68
+ìi 0xec69
+ìj 0xec6a
+ìk 0xec6b
+ìl 0xec6c
+ìm 0xec6d
+ìn 0xec6e
+ìo 0xec6f
+ìp 0xec70
+ìq 0xec71
+ìr 0xec72
+ìs 0xec73
+ìt 0xec74
+ìu 0xec75
+ìv 0xec76
+ìw 0xec77
+ìx 0xec78
+ìy 0xec79
+ìz 0xec7a
+ì{ 0xec7b
+ì| 0xec7c
+ì} 0xec7d
+ì~ 0xec7e
+ì¡ 0xeca1
+ì¢ 0xeca2
+ì£ 0xeca3
+ì¤ 0xeca4
+ì¥ 0xeca5
+ì¦ 0xeca6
+ì§ 0xeca7
+ì¨ 0xeca8
+ì© 0xeca9
+ìª 0xecaa
+ì« 0xecab
+ì¬ 0xecac
+ì­ 0xecad
+ì® 0xecae
+ì¯ 0xecaf
+ì° 0xecb0
+ì± 0xecb1
+ì² 0xecb2
+ì³ 0xecb3
+ì´ 0xecb4
+ìµ 0xecb5
+ì¶ 0xecb6
+ì· 0xecb7
+ì¸ 0xecb8
+Àu 0xc075
+Àv 0xc076
+Àw 0xc077
+Àx 0xc078
+Ày 0xc079
+Àz 0xc07a
+À{ 0xc07b
+À| 0xc07c
+À} 0xc07d
+À~ 0xc07e
+À¡ 0xc0a1
+À¢ 0xc0a2
+À£ 0xc0a3
+À¤ 0xc0a4
+À¥ 0xc0a5
+À¦ 0xc0a6
+ˤ 0xc0a7
+ˬ 0xc0a8
+À© 0xc0a9
+˻ 0xc0aa
+À« 0xc0ab
+À¬ 0xc0ac
+À­ 0xc0ad
+À® 0xc0ae
+À¯ 0xc0af
+À° 0xc0b0
+˱ 0xc0b1
+À² 0xc0b2
+À³ 0xc0b3
+À´ 0xc0b4
+˵ 0xc0b5
+˦ 0xc0b6
+À· 0xc0b7
+À¸ 0xc0b8
+À¹ 0xc0b9
+˼ 0xc0ba
+À» 0xc0bb
+À¼ 0xc0bc
+À½ 0xc0bd
+À¾ 0xc0be
+À¿ 0xc0bf
+ÀÀ 0xc0c0
+ÀÁ 0xc0c1
+ÀÂ 0xc0c2
+ÀÃ 0xc0c3
+ÀÄ 0xc0c4
+ÀÅ 0xc0c5
+ÀÆ 0xc0c6
+ÀÇ 0xc0c7
+ÀÈ 0xc0c8
+ÀÉ 0xc0c9
+ÀÊ 0xc0ca
+ÀË 0xc0cb
+ÀÌ 0xc0cc
+ÀÍ 0xc0cd
+ÀÎ 0xc0ce
+ÀÏ 0xc0cf
+ÀÐ 0xc0d0
+ÀÑ 0xc0d1
+ÀÒ 0xc0d2
+ÀÓ 0xc0d3
+ÀÔ 0xc0d4
+ÀÕ 0xc0d5
+ÀÖ 0xc0d6
+À× 0xc0d7
+ÀØ 0xc0d8
+ÀÙ 0xc0d9
+ÀÚ 0xc0da
+ÀÛ 0xc0db
+ÀÜ 0xc0dc
+ÀÝ 0xc0dd
+ÀÞ 0xc0de
+Àß 0xc0df
+Àà 0xc0e0
+Àá 0xc0e1
+Àâ 0xc0e2
+Àã 0xc0e3
+Àä 0xc0e4
+Àå 0xc0e5
+Àæ 0xc0e6
+Àç 0xc0e7
+Àè 0xc0e8
+Àé 0xc0e9
+Àê 0xc0ea
+Àë 0xc0eb
+Àì 0xc0ec
+Àí 0xc0ed
+Àî 0xc0ee
+Àï 0xc0ef
+Àð 0xc0f0
+Àñ 0xc0f1
+Àò 0xc0f2
+Àó 0xc0f3
+Àô 0xc0f4
+Àõ 0xc0f5
+Àö 0xc0f6
+À÷ 0xc0f7
+Àø 0xc0f8
+Àù 0xc0f9
+Àú 0xc0fa
+Àû 0xc0fb
+Àü 0xc0fc
+Àý 0xc0fd
+Àþ 0xc0fe
+Á@ 0xc140
+ÁA 0xc141
+ÁB 0xc142
+ÁC 0xc143
+ÁD 0xc144
+ÁE 0xc145
+ÁF 0xc146
+ÁG 0xc147
+ÁH 0xc148
+ÁI 0xc149
+ÁJ 0xc14a
+ÁK 0xc14b
+ÁL 0xc14c
+ÁM 0xc14d
+ÁN 0xc14e
+ÁO 0xc14f
+ÁP 0xc150
+ÁQ 0xc151
+ÁR 0xc152
+ÁS 0xc153
+ÁT 0xc154
+ÁU 0xc155
+ÁV 0xc156
+ÁW 0xc157
+ÁX 0xc158
+ÁY 0xc159
+ÁZ 0xc15a
+Á[ 0xc15b
+Á\ 0xc15c
+Á] 0xc15d
+Á^ 0xc15e
+Á_ 0xc15f
+Á` 0xc160
+Áa 0xc161
+Áb 0xc162
+Ác 0xc163
+Ád 0xc164
+Áe 0xc165
+Áf 0xc166
+Ág 0xc167
+Áh 0xc168
+Ái 0xc169
+Áj 0xc16a
+Ák 0xc16b
+Ál 0xc16c
+Ám 0xc16d
+Án 0xc16e
+Áo 0xc16f
+Áp 0xc170
+Áq 0xc171
+Ár 0xc172
+Ás 0xc173
+Át 0xc174
+Áu 0xc175
+Áv 0xc176
+Áw 0xc177
+Áx 0xc178
+Áy 0xc179
+Áz 0xc17a
+Á{ 0xc17b
+Á| 0xc17c
+Á} 0xc17d
+Á~ 0xc17e
+Á¡ 0xc1a1
+Á¢ 0xc1a2
+Á£ 0xc1a3
+Á¤ 0xc1a4
+Á¥ 0xc1a5
+Á¦ 0xc1a6
+Á§ 0xc1a7
+Á¨ 0xc1a8
+Á© 0xc1a9
+Áª 0xc1aa
+Á« 0xc1ab
+Á¬ 0xc1ac
+Á­ 0xc1ad
+Á® 0xc1ae
+Á¯ 0xc1af
+Á° 0xc1b0
+Á± 0xc1b1
+Á² 0xc1b2
+Á³ 0xc1b3
+Á´ 0xc1b4
+Áµ 0xc1b5
+Á¶ 0xc1b6
+Á· 0xc1b7
+Á¸ 0xc1b8
+Á¹ 0xc1b9
+Áº 0xc1ba
+Á» 0xc1bb
+Á¼ 0xc1bc
+Á½ 0xc1bd
+Á¾ 0xc1be
+Á¿ 0xc1bf
+ÁÀ 0xc1c0
+ÁÁ 0xc1c1
+ÁÂ 0xc1c2
+ÁÃ 0xc1c3
+ÁÄ 0xc1c4
+ÁÅ 0xc1c5
+ÁÆ 0xc1c6
+ÁÇ 0xc1c7
+ÁÈ 0xc1c8
+ÁÉ 0xc1c9
+ÁÊ 0xc1ca
+ÁË 0xc1cb
+ÁÌ 0xc1cc
+ÁÍ 0xc1cd
+ÁÎ 0xc1ce
+ÁÏ 0xc1cf
+ÁÐ 0xc1d0
+ÁÑ 0xc1d1
+ÁÒ 0xc1d2
+ÁÓ 0xc1d3
+ÁÔ 0xc1d4
+ÁÕ 0xc1d5
+ÁÖ 0xc1d6
+Á× 0xc1d7
+ÁØ 0xc1d8
+ÁÙ 0xc1d9
+ÁÚ 0xc1da
+ÁÛ 0xc1db
+ÁÜ 0xc1dc
+ÁÝ 0xc1dd
+ÁÞ 0xc1de
+Áß 0xc1df
+Áà 0xc1e0
+Áá 0xc1e1
+Áâ 0xc1e2
+Áã 0xc1e3
+Áä 0xc1e4
+Áå 0xc1e5
+Áæ 0xc1e6
+Áç 0xc1e7
+Áè 0xc1e8
+Áé 0xc1e9
+Áê 0xc1ea
+Áë 0xc1eb
+Áì 0xc1ec
+Áí 0xc1ed
+Áî 0xc1ee
+Áï 0xc1ef
+Áð 0xc1f0
+Áñ 0xc1f1
+Áò 0xc1f2
+Áó 0xc1f3
+Áô 0xc1f4
+Áõ 0xc1f5
+Áö 0xc1f6
+Á÷ 0xc1f7
+Áø 0xc1f8
+Áù 0xc1f9
+Áú 0xc1fa
+Áû 0xc1fb
+Áü 0xc1fc
+Áý 0xc1fd
+Áþ 0xc1fe
+Â@ 0xc240
+ÂA 0xc241
+ÂB 0xc242
+ÂC 0xc243
+ÂD 0xc244
+ÂE 0xc245
+ÂF 0xc246
+ÂG 0xc247
+ÂH 0xc248
+ÂI 0xc249
+ÂJ 0xc24a
+ÂK 0xc24b
+ÂL 0xc24c
+ÂM 0xc24d
+ÂN 0xc24e
+ì¹ 0xecb9
+ìº 0xecba
+ì» 0xecbb
+ì¼ 0xecbc
+ì½ 0xecbd
+ì¾ 0xecbe
+ì¿ 0xecbf
+ìÀ 0xecc0
+ìÁ 0xecc1
+ì 0xecc2
+ìà 0xecc3
+ìÄ 0xecc4
+ìÅ 0xecc5
+ìÆ 0xecc6
+ìÇ 0xecc7
+ìÈ 0xecc8
+ìÉ 0xecc9
+ìÊ 0xecca
+ìË 0xeccb
+ìÌ 0xeccc
+ìÍ 0xeccd
+ìÎ 0xecce
+ìÏ 0xeccf
+ìÐ 0xecd0
+ìÑ 0xecd1
+ìÒ 0xecd2
+ìÓ 0xecd3
+ìÔ 0xecd4
+ìÕ 0xecd5
+ìÖ 0xecd6
+ì× 0xecd7
+ìØ 0xecd8
+ìÙ 0xecd9
+ìÚ 0xecda
+ìÛ 0xecdb
+ìÜ 0xecdc
+ìÝ 0xecdd
+ìÞ 0xecde
+ìß 0xecdf
+ìà 0xece0
+ìá 0xece1
+ìâ 0xece2
+ìã 0xece3
+ìä 0xece4
+ìå 0xece5
+ìæ 0xece6
+ìç 0xece7
+ìè 0xece8
+ìé 0xece9
+ìê 0xecea
+ìë 0xeceb
+ìì 0xecec
+ìí 0xeced
+ìî 0xecee
+ìï 0xecef
+ìð 0xecf0
+ìñ 0xecf1
+ìò 0xecf2
+ìó 0xecf3
+ìô 0xecf4
+ìõ 0xecf5
+ìö 0xecf6
+ì÷ 0xecf7
+ìø 0xecf8
+ìù 0xecf9
+ìú 0xecfa
+ìû 0xecfb
+ìü 0xecfc
+ìý 0xecfd
+ìþ 0xecfe
+í@ 0xed40
+íA 0xed41
+íB 0xed42
+íC 0xed43
+íD 0xed44
+íE 0xed45
+íF 0xed46
+íG 0xed47
+íH 0xed48
+íI 0xed49
+íJ 0xed4a
+íK 0xed4b
+íL 0xed4c
+íM 0xed4d
+íN 0xed4e
+íO 0xed4f
+íP 0xed50
+íQ 0xed51
+íR 0xed52
+íS 0xed53
+íT 0xed54
+íU 0xed55
+íV 0xed56
+íW 0xed57
+íX 0xed58
+íY 0xed59
+íZ 0xed5a
+í[ 0xed5b
+í\ 0xed5c
+í] 0xed5d
+í^ 0xed5e
+í_ 0xed5f
+í` 0xed60
+ía 0xed61
+íb 0xed62
+íc 0xed63
+íd 0xed64
+íe 0xed65
+íf 0xed66
+íg 0xed67
+íh 0xed68
+íi 0xed69
+íj 0xed6a
+ík 0xed6b
+íl 0xed6c
+ím 0xed6d
+ín 0xed6e
+ío 0xed6f
+íp 0xed70
+íq 0xed71
+ír 0xed72
+ís 0xed73
+ít 0xed74
+íu 0xed75
+ív 0xed76
+íw 0xed77
+íx 0xed78
+íy 0xed79
+íz 0xed7a
+í{ 0xed7b
+í| 0xed7c
+í} 0xed7d
+í~ 0xed7e
+í¡ 0xeda1
+í¢ 0xeda2
+í£ 0xeda3
+í¤ 0xeda4
+í¥ 0xeda5
+í¦ 0xeda6
+í§ 0xeda7
+í¨ 0xeda8
+í© 0xeda9
+íª 0xedaa
+í« 0xedab
+í¬ 0xedac
+í­ 0xedad
+í® 0xedae
+í¯ 0xedaf
+í° 0xedb0
+í± 0xedb1
+í² 0xedb2
+í³ 0xedb3
+í´ 0xedb4
+íµ 0xedb5
+í¶ 0xedb6
+í· 0xedb7
+í¸ 0xedb8
+í¹ 0xedb9
+íº 0xedba
+í» 0xedbb
+í¼ 0xedbc
+í½ 0xedbd
+í¾ 0xedbe
+í¿ 0xedbf
+íÀ 0xedc0
+íÁ 0xedc1
+í 0xedc2
+íà 0xedc3
+íÄ 0xedc4
+íÅ 0xedc5
+íÆ 0xedc6
+íÇ 0xedc7
+íÈ 0xedc8
+íÉ 0xedc9
+íÊ 0xedca
+íË 0xedcb
+íÌ 0xedcc
+íÍ 0xedcd
+íÎ 0xedce
+íÏ 0xedcf
+íÐ 0xedd0
+íÑ 0xedd1
+íÒ 0xedd2
+íÓ 0xedd3
+íÔ 0xedd4
+íÕ 0xedd5
+íÖ 0xedd6
+í× 0xedd7
+íØ 0xedd8
+íÙ 0xedd9
+íÚ 0xedda
+íÛ 0xeddb
+íÜ 0xeddc
+íÝ 0xeddd
+íÞ 0xedde
+íß 0xeddf
+íà 0xede0
+íá 0xede1
+íâ 0xede2
+íã 0xede3
+íä 0xede4
+íå 0xede5
+íæ 0xede6
+íç 0xede7
+íè 0xede8
+íé 0xede9
+íê 0xedea
+íë 0xedeb
+íì 0xedec
+íí 0xeded
+íî 0xedee
+íï 0xedef
+íð 0xedf0
+íñ 0xedf1
+íò 0xedf2
+íó 0xedf3
+íô 0xedf4
+íõ 0xedf5
+íö 0xedf6
+í÷ 0xedf7
+íø 0xedf8
+íù 0xedf9
+íú 0xedfa
+íû 0xedfb
+íü 0xedfc
+íý 0xedfd
+íþ 0xedfe
+î@ 0xee40
+îA 0xee41
+îB 0xee42
+îC 0xee43
+îD 0xee44
+îE 0xee45
+îF 0xee46
+îG 0xee47
+îH 0xee48
+îI 0xee49
+îJ 0xee4a
+îK 0xee4b
+îL 0xee4c
+îM 0xee4d
+îN 0xee4e
+îO 0xee4f
+îP 0xee50
+îQ 0xee51
+îR 0xee52
+îS 0xee53
+îT 0xee54
+îU 0xee55
+îV 0xee56
+îW 0xee57
+îX 0xee58
+îY 0xee59
+îZ 0xee5a
+î[ 0xee5b
+î\ 0xee5c
+î] 0xee5d
+î^ 0xee5e
+î_ 0xee5f
+î` 0xee60
+îa 0xee61
+îb 0xee62
+îc 0xee63
+îd 0xee64
+îe 0xee65
+îf 0xee66
+îg 0xee67
+îh 0xee68
+îi 0xee69
+îj 0xee6a
+îk 0xee6b
+îl 0xee6c
+îm 0xee6d
+în 0xee6e
+îo 0xee6f
+îp 0xee70
+îq 0xee71
+îr 0xee72
+îs 0xee73
+ît 0xee74
+îu 0xee75
+îv 0xee76
+îw 0xee77
+îx 0xee78
+îy 0xee79
+îz 0xee7a
+î{ 0xee7b
+î| 0xee7c
+î} 0xee7d
+î~ 0xee7e
+î¡ 0xeea1
+î¢ 0xeea2
+î£ 0xeea3
+î¤ 0xeea4
+î¥ 0xeea5
+î¦ 0xeea6
+î§ 0xeea7
+î¨ 0xeea8
+î© 0xeea9
+îª 0xeeaa
+î« 0xeeab
+î¬ 0xeeac
+î­ 0xeead
+î® 0xeeae
+î¯ 0xeeaf
+î° 0xeeb0
+î± 0xeeb1
+î² 0xeeb2
+î³ 0xeeb3
+î´ 0xeeb4
+îµ 0xeeb5
+î¶ 0xeeb6
+î· 0xeeb7
+î¸ 0xeeb8
+î¹ 0xeeb9
+îº 0xeeba
+î» 0xeebb
+î¼ 0xeebc
+î½ 0xeebd
+î¾ 0xeebe
+î¿ 0xeebf
+îÀ 0xeec0
+îÁ 0xeec1
+î 0xeec2
+îà 0xeec3
+îÄ 0xeec4
+îÅ 0xeec5
+îÆ 0xeec6
+îÇ 0xeec7
+îÈ 0xeec8
+îÉ 0xeec9
+îÊ 0xeeca
+îË 0xeecb
+îÌ 0xeecc
+îÍ 0xeecd
+îÎ 0xeece
+îÏ 0xeecf
+îÐ 0xeed0
+îÑ 0xeed1
+îÒ 0xeed2
+îÓ 0xeed3
+îÔ 0xeed4
+îÕ 0xeed5
+îÖ 0xeed6
+î× 0xeed7
+îØ 0xeed8
+îÙ 0xeed9
+îÚ 0xeeda
+îÛ 0xeedb
+îÜ 0xeedc
+îÝ 0xeedd
+îÞ 0xeede
+îß 0xeedf
+îà 0xeee0
+îá 0xeee1
+îâ 0xeee2
+îã 0xeee3
+îä 0xeee4
+îå 0xeee5
+îæ 0xeee6
+îç 0xeee7
+îè 0xeee8
+îé 0xeee9
+îê 0xeeea
+îë 0xeeeb
+îì 0xeeec
+îí 0xeeed
+îî 0xeeee
+îï 0xeeef
+îð 0xeef0
+îñ 0xeef1
+îò 0xeef2
+îó 0xeef3
+îô 0xeef4
+îõ 0xeef5
+îö 0xeef6
+î÷ 0xeef7
+îø 0xeef8
+îù 0xeef9
+îú 0xeefa
+îû 0xeefb
+îü 0xeefc
+îý 0xeefd
+îþ 0xeefe
+ï@ 0xef40
+ïA 0xef41
+ïB 0xef42
+ïC 0xef43
+ïD 0xef44
+ïE 0xef45
+ïF 0xef46
+ïG 0xef47
+ïH 0xef48
+ïI 0xef49
+ïJ 0xef4a
+ïK 0xef4b
+ïL 0xef4c
+ïM 0xef4d
+ïN 0xef4e
+ïO 0xef4f
+ïP 0xef50
+ïQ 0xef51
+ïR 0xef52
+ïS 0xef53
+ïT 0xef54
+ïU 0xef55
+ïV 0xef56
+ïW 0xef57
+ïX 0xef58
+ïY 0xef59
+ïZ 0xef5a
+ï[ 0xef5b
+ï\ 0xef5c
+ï] 0xef5d
+ï^ 0xef5e
+ï_ 0xef5f
+ï` 0xef60
+ïa 0xef61
+ïb 0xef62
+ïc 0xef63
+ïd 0xef64
+ïe 0xef65
+ïf 0xef66
+ïg 0xef67
+ïh 0xef68
+ïi 0xef69
+ïj 0xef6a
+ïk 0xef6b
+ïl 0xef6c
+ïm 0xef6d
+ïn 0xef6e
+ïo 0xef6f
+ïp 0xef70
+ïq 0xef71
+ïr 0xef72
+ïs 0xef73
+ït 0xef74
+ïu 0xef75
+ïv 0xef76
+ïw 0xef77
+ïx 0xef78
+ïy 0xef79
+ïz 0xef7a
+ï{ 0xef7b
+ï| 0xef7c
+ï} 0xef7d
+ï~ 0xef7e
+ï¡ 0xefa1
+ï¢ 0xefa2
+ï£ 0xefa3
+ï¤ 0xefa4
+ï¥ 0xefa5
+ï¦ 0xefa6
+ï§ 0xefa7
+ï¨ 0xefa8
+ï© 0xefa9
+ïª 0xefaa
+ï« 0xefab
+ï¬ 0xefac
+ï­ 0xefad
+ï® 0xefae
+ï¯ 0xefaf
+ï° 0xefb0
+ï± 0xefb1
+ï² 0xefb2
+ï³ 0xefb3
+ï´ 0xefb4
+ïµ 0xefb5
+ï¶ 0xefb6
+ÂO 0xc24f
+ÂP 0xc250
+ÂQ 0xc251
+ÂR 0xc252
+ÂS 0xc253
+ÂT 0xc254
+ÂU 0xc255
+ÂV 0xc256
+ÂW 0xc257
+ÂX 0xc258
+ÂY 0xc259
+ÂZ 0xc25a
+Â[ 0xc25b
+Â\ 0xc25c
+Â] 0xc25d
+Â^ 0xc25e
+Â_ 0xc25f
+Â` 0xc260
+Âa 0xc261
+Âb 0xc262
+Âc 0xc263
+Âd 0xc264
+Âe 0xc265
+Âf 0xc266
+Âg 0xc267
+Âh 0xc268
+Âi 0xc269
+Âj 0xc26a
+Âk 0xc26b
+Âl 0xc26c
+Âm 0xc26d
+Ân 0xc26e
+Âo 0xc26f
+Âp 0xc270
+Âq 0xc271
+Âr 0xc272
+Âs 0xc273
+Ât 0xc274
+Âu 0xc275
+Âv 0xc276
+Âw 0xc277
+Âx 0xc278
+Ây 0xc279
+Âz 0xc27a
+Â{ 0xc27b
+Â| 0xc27c
+Â} 0xc27d
+Â~ 0xc27e
+¡ 0xc2a1
+¢ 0xc2a2
+£ 0xc2a3
+¤ 0xc2a4
+Â¥ 0xc2a5
+¦ 0xc2a6
+§ 0xc2a7
+¨ 0xc2a8
+© 0xc2a9
+ª 0xc2aa
+« 0xc2ab
+¬ 0xc2ac
+­ 0xc2ad
+® 0xc2ae
+¯ 0xc2af
+° 0xc2b0
+± 0xc2b1
+² 0xc2b2
+³ 0xc2b3
+´ 0xc2b4
+µ 0xc2b5
+¶ 0xc2b6
+· 0xc2b7
+¸ 0xc2b8
+¹ 0xc2b9
+º 0xc2ba
+» 0xc2bb
+¼ 0xc2bc
+½ 0xc2bd
+¾ 0xc2be
+¿ 0xc2bf
+ÂÀ 0xc2c0
+ÂÁ 0xc2c1
+ÂÂ 0xc2c2
+ÂÃ 0xc2c3
+ÂÄ 0xc2c4
+ÂÅ 0xc2c5
+ÂÆ 0xc2c6
+ÂÇ 0xc2c7
+ÂÈ 0xc2c8
+ÂÉ 0xc2c9
+ÂÊ 0xc2ca
+ÂË 0xc2cb
+ÂÌ 0xc2cc
+ÂÍ 0xc2cd
+ÂÎ 0xc2ce
+ÂÏ 0xc2cf
+ÂÐ 0xc2d0
+ÂÑ 0xc2d1
+ÂÒ 0xc2d2
+ÂÓ 0xc2d3
+ÂÔ 0xc2d4
+ÂÕ 0xc2d5
+ÂÖ 0xc2d6
+Â× 0xc2d7
+ÂØ 0xc2d8
+ÂÙ 0xc2d9
+ÂÚ 0xc2da
+ÂÛ 0xc2db
+ÂÜ 0xc2dc
+ÂÝ 0xc2dd
+ÂÞ 0xc2de
+Âß 0xc2df
+Âà 0xc2e0
+Âá 0xc2e1
+Ââ 0xc2e2
+Âã 0xc2e3
+Âä 0xc2e4
+Âå 0xc2e5
+Âæ 0xc2e6
+Âç 0xc2e7
+Âè 0xc2e8
+Âé 0xc2e9
+Âê 0xc2ea
+Âë 0xc2eb
+Âì 0xc2ec
+Âí 0xc2ed
+Âî 0xc2ee
+Âï 0xc2ef
+Âð 0xc2f0
+Âñ 0xc2f1
+Âò 0xc2f2
+Âó 0xc2f3
+Âô 0xc2f4
+Âõ 0xc2f5
+Âö 0xc2f6
+Â÷ 0xc2f7
+Âø 0xc2f8
+Âù 0xc2f9
+Âú 0xc2fa
+Âû 0xc2fb
+Âü 0xc2fc
+Âý 0xc2fd
+Âþ 0xc2fe
+Ã@ 0xc340
+ÃA 0xc341
+ÃB 0xc342
+ÃC 0xc343
+ÃD 0xc344
+ÃE 0xc345
+ÃF 0xc346
+ÃG 0xc347
+ÃH 0xc348
+ÃI 0xc349
+ÃJ 0xc34a
+ÃK 0xc34b
+ÃL 0xc34c
+ÃM 0xc34d
+ÃN 0xc34e
+ÃO 0xc34f
+ÃP 0xc350
+ÃQ 0xc351
+ÃR 0xc352
+ÃS 0xc353
+ÃT 0xc354
+ÃU 0xc355
+ÃV 0xc356
+ÃW 0xc357
+ÃX 0xc358
+ÃY 0xc359
+ÃZ 0xc35a
+Ã[ 0xc35b
+Ã\ 0xc35c
+Ã] 0xc35d
+Ã^ 0xc35e
+ï· 0xefb7
+ï¸ 0xefb8
+ï¹ 0xefb9
+ïº 0xefba
+ï» 0xefbb
+ï¼ 0xefbc
+ï½ 0xefbd
+ï¾ 0xefbe
+ï¿ 0xefbf
+ïÀ 0xefc0
+ïÁ 0xefc1
+ï 0xefc2
+ïà 0xefc3
+ïÄ 0xefc4
+ïÅ 0xefc5
+ïÆ 0xefc6
+ïÇ 0xefc7
+ïÈ 0xefc8
+ïÉ 0xefc9
+ïÊ 0xefca
+ïË 0xefcb
+ïÌ 0xefcc
+ïÍ 0xefcd
+ïÎ 0xefce
+ïÏ 0xefcf
+ïÐ 0xefd0
+ïÑ 0xefd1
+ïÒ 0xefd2
+ïÓ 0xefd3
+ïÔ 0xefd4
+ïÕ 0xefd5
+ïÖ 0xefd6
+ï× 0xefd7
+ïØ 0xefd8
+ïÙ 0xefd9
+ïÚ 0xefda
+ïÛ 0xefdb
+ïÜ 0xefdc
+ïÝ 0xefdd
+ïÞ 0xefde
+ïß 0xefdf
+ïà 0xefe0
+ïá 0xefe1
+ïâ 0xefe2
+ïã 0xefe3
+ïä 0xefe4
+ïå 0xefe5
+ïæ 0xefe6
+ïç 0xefe7
+ïè 0xefe8
+ïé 0xefe9
+ïê 0xefea
+ïë 0xefeb
+ïì 0xefec
+ïí 0xefed
+ïî 0xefee
+ïï 0xefef
+ïð 0xeff0
+ïñ 0xeff1
+ïò 0xeff2
+ïó 0xeff3
+ïô 0xeff4
+ïõ 0xeff5
+ïö 0xeff6
+ï÷ 0xeff7
+ïø 0xeff8
+ïù 0xeff9
+ïú 0xeffa
+ïû 0xeffb
+ïü 0xeffc
+ïý 0xeffd
+ïþ 0xeffe
+ð@ 0xf040
+ðA 0xf041
+ðB 0xf042
+ðC 0xf043
+ðD 0xf044
+ðE 0xf045
+ðF 0xf046
+ðG 0xf047
+ðH 0xf048
+ðI 0xf049
+ðJ 0xf04a
+ðK 0xf04b
+ðL 0xf04c
+ðM 0xf04d
+ðN 0xf04e
+ðO 0xf04f
+ðP 0xf050
+ðQ 0xf051
+ðR 0xf052
+ðS 0xf053
+ðT 0xf054
+ðU 0xf055
+ðV 0xf056
+ðW 0xf057
+ðX 0xf058
+ðY 0xf059
+ðZ 0xf05a
+ð[ 0xf05b
+ð\ 0xf05c
+ð] 0xf05d
+ð^ 0xf05e
+ð_ 0xf05f
+ð` 0xf060
+ða 0xf061
+ðb 0xf062
+ðc 0xf063
+ðd 0xf064
+ðe 0xf065
+ðf 0xf066
+ðg 0xf067
+ðh 0xf068
+ði 0xf069
+ðj 0xf06a
+ðk 0xf06b
+ðl 0xf06c
+ðm 0xf06d
+ðn 0xf06e
+ðo 0xf06f
+ðp 0xf070
+ðq 0xf071
+ðr 0xf072
+ðs 0xf073
+ðt 0xf074
+ðu 0xf075
+ðv 0xf076
+ðw 0xf077
+ðx 0xf078
+ðy 0xf079
+ðz 0xf07a
+ð{ 0xf07b
+ð| 0xf07c
+ð} 0xf07d
+ð~ 0xf07e
+ð¡ 0xf0a1
+ð¢ 0xf0a2
+ð£ 0xf0a3
+ð¤ 0xf0a4
+ð¥ 0xf0a5
+ð¦ 0xf0a6
+ð§ 0xf0a7
+ð¨ 0xf0a8
+ð© 0xf0a9
+ðª 0xf0aa
+ð« 0xf0ab
+ð¬ 0xf0ac
+ð­ 0xf0ad
+ð® 0xf0ae
+ð¯ 0xf0af
+ð° 0xf0b0
+ð± 0xf0b1
+ð² 0xf0b2
+ð³ 0xf0b3
+ð´ 0xf0b4
+ðµ 0xf0b5
+ð¶ 0xf0b6
+ð· 0xf0b7
+ð¸ 0xf0b8
+ð¹ 0xf0b9
+ðº 0xf0ba
+ð» 0xf0bb
+ð¼ 0xf0bc
+ð½ 0xf0bd
+ð¾ 0xf0be
+ð¿ 0xf0bf
+ðÀ 0xf0c0
+ðÁ 0xf0c1
+ð 0xf0c2
+ðà 0xf0c3
+ðÄ 0xf0c4
+ðÅ 0xf0c5
+ðÆ 0xf0c6
+ðÇ 0xf0c7
+ðÈ 0xf0c8
+ðÉ 0xf0c9
+ðÊ 0xf0ca
+ðË 0xf0cb
+ðÌ 0xf0cc
+ðÍ 0xf0cd
+ðÎ 0xf0ce
+ðÏ 0xf0cf
+ðÐ 0xf0d0
+ðÑ 0xf0d1
+ðÒ 0xf0d2
+ðÓ 0xf0d3
+ðÔ 0xf0d4
+ðÕ 0xf0d5
+ðÖ 0xf0d6
+ð× 0xf0d7
+ðØ 0xf0d8
+ðÙ 0xf0d9
+ðÚ 0xf0da
+ðÛ 0xf0db
+ðÜ 0xf0dc
+ðÝ 0xf0dd
+ðÞ 0xf0de
+ðß 0xf0df
+ðà 0xf0e0
+ðá 0xf0e1
+ðâ 0xf0e2
+ðã 0xf0e3
+ðä 0xf0e4
+ðå 0xf0e5
+ðæ 0xf0e6
+ðç 0xf0e7
+ðè 0xf0e8
+ðé 0xf0e9
+ðê 0xf0ea
+ðë 0xf0eb
+ðì 0xf0ec
+ðí 0xf0ed
+ðî 0xf0ee
+ðï 0xf0ef
+ðð 0xf0f0
+ðñ 0xf0f1
+ðò 0xf0f2
+ðó 0xf0f3
+ðô 0xf0f4
+ðõ 0xf0f5
+ðö 0xf0f6
+ð÷ 0xf0f7
+ðø 0xf0f8
+ðù 0xf0f9
+ðú 0xf0fa
+ðû 0xf0fb
+ðü 0xf0fc
+ðý 0xf0fd
+ðþ 0xf0fe
+ñ@ 0xf140
+ñA 0xf141
+ñB 0xf142
+ñC 0xf143
+ñD 0xf144
+ñE 0xf145
+ñF 0xf146
+ñG 0xf147
+ñH 0xf148
+ñI 0xf149
+ñJ 0xf14a
+ñK 0xf14b
+ñL 0xf14c
+ñM 0xf14d
+ñN 0xf14e
+ñO 0xf14f
+ñP 0xf150
+ñQ 0xf151
+ñR 0xf152
+ñS 0xf153
+ñT 0xf154
+ñU 0xf155
+ñV 0xf156
+ñW 0xf157
+ñX 0xf158
+ñY 0xf159
+ñZ 0xf15a
+ñ[ 0xf15b
+ñ\ 0xf15c
+ñ] 0xf15d
+ñ^ 0xf15e
+ñ_ 0xf15f
+ñ` 0xf160
+ña 0xf161
+ñb 0xf162
+ñc 0xf163
+ñd 0xf164
+ñe 0xf165
+ñf 0xf166
+ñg 0xf167
+ñh 0xf168
+ñi 0xf169
+ñj 0xf16a
+ñk 0xf16b
+ñl 0xf16c
+ñm 0xf16d
+ñn 0xf16e
+ño 0xf16f
+ñp 0xf170
+ñq 0xf171
+ñr 0xf172
+ñs 0xf173
+ñt 0xf174
+ñu 0xf175
+ñv 0xf176
+ñw 0xf177
+ñx 0xf178
+ñy 0xf179
+ñz 0xf17a
+ñ{ 0xf17b
+ñ| 0xf17c
+ñ} 0xf17d
+ñ~ 0xf17e
+ñ¡ 0xf1a1
+ñ¢ 0xf1a2
+ñ£ 0xf1a3
+ñ¤ 0xf1a4
+ñ¥ 0xf1a5
+ñ¦ 0xf1a6
+ñ§ 0xf1a7
+ñ¨ 0xf1a8
+ñ© 0xf1a9
+ñª 0xf1aa
+ñ« 0xf1ab
+ñ¬ 0xf1ac
+ñ­ 0xf1ad
+ñ® 0xf1ae
+ñ¯ 0xf1af
+ñ° 0xf1b0
+ñ± 0xf1b1
+ñ² 0xf1b2
+ñ³ 0xf1b3
+ñ´ 0xf1b4
+ñµ 0xf1b5
+ñ¶ 0xf1b6
+ñ· 0xf1b7
+ñ¸ 0xf1b8
+ñ¹ 0xf1b9
+ñº 0xf1ba
+ñ» 0xf1bb
+ñ¼ 0xf1bc
+ñ½ 0xf1bd
+ñ¾ 0xf1be
+ñ¿ 0xf1bf
+ñÀ 0xf1c0
+ñÁ 0xf1c1
+ñ 0xf1c2
+ñà 0xf1c3
+ñÄ 0xf1c4
+ñÅ 0xf1c5
+ñÆ 0xf1c6
+ñÇ 0xf1c7
+ñÈ 0xf1c8
+ñÉ 0xf1c9
+ñÊ 0xf1ca
+ñË 0xf1cb
+ñÌ 0xf1cc
+ñÍ 0xf1cd
+ñÎ 0xf1ce
+ñÏ 0xf1cf
+ñÐ 0xf1d0
+ñÑ 0xf1d1
+ñÒ 0xf1d2
+ñÓ 0xf1d3
+ñÔ 0xf1d4
+ñÕ 0xf1d5
+ñÖ 0xf1d6
+ñ× 0xf1d7
+ñØ 0xf1d8
+ñÙ 0xf1d9
+ñÚ 0xf1da
+ñÛ 0xf1db
+ñÜ 0xf1dc
+ñÝ 0xf1dd
+ñÞ 0xf1de
+ñß 0xf1df
+ñà 0xf1e0
+ñá 0xf1e1
+ñâ 0xf1e2
+ñã 0xf1e3
+ñä 0xf1e4
+ñå 0xf1e5
+ñæ 0xf1e6
+ñç 0xf1e7
+ñè 0xf1e8
+ñé 0xf1e9
+ñê 0xf1ea
+Ã_ 0xc35f
+Ã` 0xc360
+Ãa 0xc361
+Ãb 0xc362
+Ãc 0xc363
+Ãd 0xc364
+Ãe 0xc365
+Ãf 0xc366
+Ãg 0xc367
+Ãh 0xc368
+Ãi 0xc369
+Ãj 0xc36a
+Ãk 0xc36b
+Ãl 0xc36c
+Ãm 0xc36d
+Ãn 0xc36e
+Ão 0xc36f
+Ãp 0xc370
+Ãq 0xc371
+Ãr 0xc372
+Ãs 0xc373
+Ãt 0xc374
+Ãu 0xc375
+Ãv 0xc376
+Ãw 0xc377
+Ãx 0xc378
+Ãy 0xc379
+Ãz 0xc37a
+Ã{ 0xc37b
+Ã| 0xc37c
+Ã} 0xc37d
+Ã~ 0xc37e
+á 0xc3a1
+â 0xc3a2
+ã 0xc3a3
+ä 0xc3a4
+Ã¥ 0xc3a5
+æ 0xc3a6
+ç 0xc3a7
+è 0xc3a8
+é 0xc3a9
+ê 0xc3aa
+ë 0xc3ab
+ì 0xc3ac
+í 0xc3ad
+î 0xc3ae
+ï 0xc3af
+ð 0xc3b0
+ñ 0xc3b1
+ò 0xc3b2
+ó 0xc3b3
+ô 0xc3b4
+õ 0xc3b5
+ö 0xc3b6
+÷ 0xc3b7
+ø 0xc3b8
+ù 0xc3b9
+ú 0xc3ba
+û 0xc3bb
+ü 0xc3bc
+ý 0xc3bd
+þ 0xc3be
+ÿ 0xc3bf
+ÃÀ 0xc3c0
+ÃÁ 0xc3c1
+ÃÂ 0xc3c2
+ÃÃ 0xc3c3
+ÃÄ 0xc3c4
+ÃÅ 0xc3c5
+ÃÆ 0xc3c6
+ÃÇ 0xc3c7
+ÃÈ 0xc3c8
+ÃÉ 0xc3c9
+ÃÊ 0xc3ca
+ÃË 0xc3cb
+ÃÌ 0xc3cc
+ÃÍ 0xc3cd
+ÃÎ 0xc3ce
+ÃÏ 0xc3cf
+ÃÐ 0xc3d0
+ÃÑ 0xc3d1
+ÃÒ 0xc3d2
+ÃÓ 0xc3d3
+ÃÔ 0xc3d4
+ÃÕ 0xc3d5
+ÃÖ 0xc3d6
+Ã× 0xc3d7
+ÃØ 0xc3d8
+ÃÙ 0xc3d9
+ÃÚ 0xc3da
+ÃÛ 0xc3db
+ÃÜ 0xc3dc
+ÃÝ 0xc3dd
+ÃÞ 0xc3de
+Ãß 0xc3df
+Ãà 0xc3e0
+Ãá 0xc3e1
+Ãâ 0xc3e2
+Ãã 0xc3e3
+Ãä 0xc3e4
+Ãå 0xc3e5
+Ãæ 0xc3e6
+Ãç 0xc3e7
+Ãè 0xc3e8
+Ãé 0xc3e9
+Ãê 0xc3ea
+Ãë 0xc3eb
+Ãì 0xc3ec
+Ãí 0xc3ed
+Ãî 0xc3ee
+Ãï 0xc3ef
+Ãð 0xc3f0
+Ãñ 0xc3f1
+Ãò 0xc3f2
+Ãó 0xc3f3
+Ãô 0xc3f4
+Ãõ 0xc3f5
+Ãö 0xc3f6
+Ã÷ 0xc3f7
+Ãø 0xc3f8
+Ãù 0xc3f9
+Ãú 0xc3fa
+Ãû 0xc3fb
+Ãü 0xc3fc
+Ãý 0xc3fd
+Ãþ 0xc3fe
+Ä@ 0xc440
+ÄA 0xc441
+ÄB 0xc442
+ÄC 0xc443
+ÄD 0xc444
+ÄE 0xc445
+ÄF 0xc446
+ÄG 0xc447
+ÄH 0xc448
+ÄI 0xc449
+ÄJ 0xc44a
+ÄK 0xc44b
+ÄL 0xc44c
+ÄM 0xc44d
+ÄN 0xc44e
+ÄO 0xc44f
+ÄP 0xc450
+ÄQ 0xc451
+ÄR 0xc452
+ÄS 0xc453
+ÄT 0xc454
+ñë 0xf1eb
+ñì 0xf1ec
+ñí 0xf1ed
+ñî 0xf1ee
+ñï 0xf1ef
+ñð 0xf1f0
+ññ 0xf1f1
+ñò 0xf1f2
+ñó 0xf1f3
+ñô 0xf1f4
+ñõ 0xf1f5
+ñö 0xf1f6
+ñ÷ 0xf1f7
+ñø 0xf1f8
+ñù 0xf1f9
+ñú 0xf1fa
+ñû 0xf1fb
+ñü 0xf1fc
+ñý 0xf1fd
+ñþ 0xf1fe
+ò@ 0xf240
+òA 0xf241
+òB 0xf242
+òC 0xf243
+òD 0xf244
+òE 0xf245
+òF 0xf246
+òG 0xf247
+òH 0xf248
+òI 0xf249
+òJ 0xf24a
+òK 0xf24b
+òL 0xf24c
+òM 0xf24d
+òN 0xf24e
+òO 0xf24f
+òP 0xf250
+òQ 0xf251
+òR 0xf252
+òS 0xf253
+òT 0xf254
+òU 0xf255
+òV 0xf256
+òW 0xf257
+òX 0xf258
+òY 0xf259
+òZ 0xf25a
+ò[ 0xf25b
+ò\ 0xf25c
+ò] 0xf25d
+ò^ 0xf25e
+ò_ 0xf25f
+ò` 0xf260
+òa 0xf261
+òb 0xf262
+òc 0xf263
+òd 0xf264
+òe 0xf265
+òf 0xf266
+òg 0xf267
+òh 0xf268
+òi 0xf269
+òj 0xf26a
+òk 0xf26b
+òl 0xf26c
+òm 0xf26d
+òn 0xf26e
+òo 0xf26f
+òp 0xf270
+òq 0xf271
+òr 0xf272
+òs 0xf273
+òt 0xf274
+òu 0xf275
+òv 0xf276
+òw 0xf277
+òx 0xf278
+òy 0xf279
+òz 0xf27a
+ò{ 0xf27b
+ò| 0xf27c
+ò} 0xf27d
+ò~ 0xf27e
+ò¡ 0xf2a1
+ò¢ 0xf2a2
+ò£ 0xf2a3
+ò¤ 0xf2a4
+ò¥ 0xf2a5
+ò¦ 0xf2a6
+ò§ 0xf2a7
+ò¨ 0xf2a8
+ò© 0xf2a9
+òª 0xf2aa
+ò« 0xf2ab
+ò¬ 0xf2ac
+ò­ 0xf2ad
+ò® 0xf2ae
+ò¯ 0xf2af
+ò° 0xf2b0
+ò± 0xf2b1
+ò² 0xf2b2
+ò³ 0xf2b3
+ò´ 0xf2b4
+òµ 0xf2b5
+ò¶ 0xf2b6
+ò· 0xf2b7
+ò¸ 0xf2b8
+ò¹ 0xf2b9
+òº 0xf2ba
+ò» 0xf2bb
+ò¼ 0xf2bc
+ò½ 0xf2bd
+ò¾ 0xf2be
+ò¿ 0xf2bf
+òÀ 0xf2c0
+òÁ 0xf2c1
+òÂ 0xf2c2
+òÃ 0xf2c3
+òÄ 0xf2c4
+òÅ 0xf2c5
+òÆ 0xf2c6
+òÇ 0xf2c7
+òÈ 0xf2c8
+òÉ 0xf2c9
+òÊ 0xf2ca
+òË 0xf2cb
+òÌ 0xf2cc
+òÍ 0xf2cd
+òÎ 0xf2ce
+òÏ 0xf2cf
+òÐ 0xf2d0
+òÑ 0xf2d1
+òÒ 0xf2d2
+òÓ 0xf2d3
+òÔ 0xf2d4
+òÕ 0xf2d5
+òÖ 0xf2d6
+ò× 0xf2d7
+òØ 0xf2d8
+òÙ 0xf2d9
+òÚ 0xf2da
+òÛ 0xf2db
+òÜ 0xf2dc
+òÝ 0xf2dd
+òÞ 0xf2de
+òß 0xf2df
+òà 0xf2e0
+òá 0xf2e1
+òâ 0xf2e2
+òã 0xf2e3
+òä 0xf2e4
+òå 0xf2e5
+òæ 0xf2e6
+òç 0xf2e7
+òè 0xf2e8
+òé 0xf2e9
+òê 0xf2ea
+òë 0xf2eb
+òì 0xf2ec
+òí 0xf2ed
+òî 0xf2ee
+òï 0xf2ef
+òð 0xf2f0
+òñ 0xf2f1
+òò 0xf2f2
+òó 0xf2f3
+òô 0xf2f4
+òõ 0xf2f5
+òö 0xf2f6
+ò÷ 0xf2f7
+òø 0xf2f8
+òù 0xf2f9
+òú 0xf2fa
+òû 0xf2fb
+òü 0xf2fc
+òý 0xf2fd
+òþ 0xf2fe
+ó@ 0xf340
+óA 0xf341
+óB 0xf342
+óC 0xf343
+óD 0xf344
+óE 0xf345
+óF 0xf346
+óG 0xf347
+óH 0xf348
+óI 0xf349
+óJ 0xf34a
+óK 0xf34b
+óL 0xf34c
+óM 0xf34d
+óN 0xf34e
+óO 0xf34f
+óP 0xf350
+óQ 0xf351
+óR 0xf352
+óS 0xf353
+óT 0xf354
+óU 0xf355
+óV 0xf356
+óW 0xf357
+óX 0xf358
+óY 0xf359
+óZ 0xf35a
+ó[ 0xf35b
+ó\ 0xf35c
+ó] 0xf35d
+ó^ 0xf35e
+ó_ 0xf35f
+ó` 0xf360
+óa 0xf361
+ób 0xf362
+óc 0xf363
+ód 0xf364
+óe 0xf365
+óf 0xf366
+óg 0xf367
+óh 0xf368
+ói 0xf369
+ój 0xf36a
+ók 0xf36b
+ól 0xf36c
+óm 0xf36d
+ón 0xf36e
+óo 0xf36f
+óp 0xf370
+óq 0xf371
+ór 0xf372
+ós 0xf373
+ót 0xf374
+óu 0xf375
+óv 0xf376
+ów 0xf377
+óx 0xf378
+óy 0xf379
+óz 0xf37a
+ó{ 0xf37b
+ó| 0xf37c
+ó} 0xf37d
+ó~ 0xf37e
+ó¡ 0xf3a1
+ó¢ 0xf3a2
+ó£ 0xf3a3
+ó¤ 0xf3a4
+ó¥ 0xf3a5
+ó¦ 0xf3a6
+ó§ 0xf3a7
+ó¨ 0xf3a8
+ó© 0xf3a9
+óª 0xf3aa
+ó« 0xf3ab
+ó¬ 0xf3ac
+ó­ 0xf3ad
+ó® 0xf3ae
+ó¯ 0xf3af
+ó° 0xf3b0
+ó± 0xf3b1
+ó² 0xf3b2
+ó³ 0xf3b3
+ó´ 0xf3b4
+óµ 0xf3b5
+ó¶ 0xf3b6
+ó· 0xf3b7
+ó¸ 0xf3b8
+ó¹ 0xf3b9
+óº 0xf3ba
+ó» 0xf3bb
+ó¼ 0xf3bc
+ó½ 0xf3bd
+ó¾ 0xf3be
+ó¿ 0xf3bf
+óÀ 0xf3c0
+óÁ 0xf3c1
+óÂ 0xf3c2
+óÃ 0xf3c3
+óÄ 0xf3c4
+óÅ 0xf3c5
+óÆ 0xf3c6
+óÇ 0xf3c7
+óÈ 0xf3c8
+óÉ 0xf3c9
+óÊ 0xf3ca
+óË 0xf3cb
+óÌ 0xf3cc
+óÍ 0xf3cd
+óÎ 0xf3ce
+óÏ 0xf3cf
+óÐ 0xf3d0
+óÑ 0xf3d1
+óÒ 0xf3d2
+óÓ 0xf3d3
+óÔ 0xf3d4
+óÕ 0xf3d5
+óÖ 0xf3d6
+ó× 0xf3d7
+óØ 0xf3d8
+óÙ 0xf3d9
+óÚ 0xf3da
+óÛ 0xf3db
+óÜ 0xf3dc
+óÝ 0xf3dd
+óÞ 0xf3de
+óß 0xf3df
+óà 0xf3e0
+óá 0xf3e1
+óâ 0xf3e2
+óã 0xf3e3
+óä 0xf3e4
+óå 0xf3e5
+óæ 0xf3e6
+óç 0xf3e7
+óè 0xf3e8
+óé 0xf3e9
+óê 0xf3ea
+óë 0xf3eb
+óì 0xf3ec
+óí 0xf3ed
+óî 0xf3ee
+óï 0xf3ef
+óð 0xf3f0
+óñ 0xf3f1
+óò 0xf3f2
+óó 0xf3f3
+óô 0xf3f4
+óõ 0xf3f5
+óö 0xf3f6
+ó÷ 0xf3f7
+óø 0xf3f8
+óù 0xf3f9
+óú 0xf3fa
+óû 0xf3fb
+óü 0xf3fc
+ÄU 0xc455
+ÄV 0xc456
+ÄW 0xc457
+ÄX 0xc458
+ÄY 0xc459
+ÄZ 0xc45a
+Ä[ 0xc45b
+Ä\ 0xc45c
+Ä] 0xc45d
+Ä^ 0xc45e
+Ä_ 0xc45f
+Ä` 0xc460
+Äa 0xc461
+Äb 0xc462
+Äc 0xc463
+Äd 0xc464
+Äe 0xc465
+Äf 0xc466
+Äg 0xc467
+Äh 0xc468
+Äi 0xc469
+Äj 0xc46a
+Äk 0xc46b
+Äl 0xc46c
+Äm 0xc46d
+Än 0xc46e
+Äo 0xc46f
+Äp 0xc470
+Äq 0xc471
+Är 0xc472
+Äs 0xc473
+Ät 0xc474
+Äu 0xc475
+Äv 0xc476
+Äw 0xc477
+Äx 0xc478
+Äy 0xc479
+Äz 0xc47a
+Ä{ 0xc47b
+Ä| 0xc47c
+Ä} 0xc47d
+Ä~ 0xc47e
+Ä¡ 0xc4a1
+Ä¢ 0xc4a2
+Ä£ 0xc4a3
+Ĥ 0xc4a4
+Ä¥ 0xc4a5
+Ħ 0xc4a6
+ħ 0xc4a7
+Ĩ 0xc4a8
+Ä© 0xc4a9
+Ī 0xc4aa
+Ä« 0xc4ab
+Ĭ 0xc4ac
+Ä­ 0xc4ad
+Ä® 0xc4ae
+į 0xc4af
+Ä° 0xc4b0
+ı 0xc4b1
+IJ 0xc4b2
+ij 0xc4b3
+Ä´ 0xc4b4
+ĵ 0xc4b5
+Ķ 0xc4b6
+Ä· 0xc4b7
+ĸ 0xc4b8
+Ĺ 0xc4b9
+ĺ 0xc4ba
+Ä» 0xc4bb
+ļ 0xc4bc
+Ľ 0xc4bd
+ľ 0xc4be
+Ä¿ 0xc4bf
+ÄÀ 0xc4c0
+ÄÁ 0xc4c1
+ÄÂ 0xc4c2
+ÄÃ 0xc4c3
+ÄÄ 0xc4c4
+ÄÅ 0xc4c5
+ÄÆ 0xc4c6
+ÄÇ 0xc4c7
+ÄÈ 0xc4c8
+ÄÉ 0xc4c9
+ÄÊ 0xc4ca
+ÄË 0xc4cb
+ÄÌ 0xc4cc
+ÄÍ 0xc4cd
+ÄÎ 0xc4ce
+ÄÏ 0xc4cf
+ÄÐ 0xc4d0
+ÄÑ 0xc4d1
+ÄÒ 0xc4d2
+ÄÓ 0xc4d3
+ÄÔ 0xc4d4
+ÄÕ 0xc4d5
+ÄÖ 0xc4d6
+óý 0xf3fd
+óþ 0xf3fe
+ô@ 0xf440
+ôA 0xf441
+ôB 0xf442
+ôC 0xf443
+ôD 0xf444
+ôE 0xf445
+ôF 0xf446
+ôG 0xf447
+ôH 0xf448
+ôI 0xf449
+ôJ 0xf44a
+ôK 0xf44b
+ôL 0xf44c
+ôM 0xf44d
+ôN 0xf44e
+ôO 0xf44f
+ôP 0xf450
+ôQ 0xf451
+ôR 0xf452
+ôS 0xf453
+ôT 0xf454
+ôU 0xf455
+ôV 0xf456
+ôW 0xf457
+ôX 0xf458
+ôY 0xf459
+ôZ 0xf45a
+ô[ 0xf45b
+ô\ 0xf45c
+ô] 0xf45d
+ô^ 0xf45e
+ô_ 0xf45f
+ô` 0xf460
+ôa 0xf461
+ôb 0xf462
+ôc 0xf463
+ôd 0xf464
+ôe 0xf465
+ôf 0xf466
+ôg 0xf467
+ôh 0xf468
+ôi 0xf469
+ôj 0xf46a
+ôk 0xf46b
+ôl 0xf46c
+ôm 0xf46d
+ôn 0xf46e
+ôo 0xf46f
+ôp 0xf470
+ôq 0xf471
+ôr 0xf472
+ôs 0xf473
+ôt 0xf474
+ôu 0xf475
+ôv 0xf476
+ôw 0xf477
+ôx 0xf478
+ôy 0xf479
+ôz 0xf47a
+ô{ 0xf47b
+ô| 0xf47c
+ô} 0xf47d
+ô~ 0xf47e
+ô¡ 0xf4a1
+ô¢ 0xf4a2
+ô£ 0xf4a3
+ô¤ 0xf4a4
+ô¥ 0xf4a5
+ô¦ 0xf4a6
+ô§ 0xf4a7
+ô¨ 0xf4a8
+ô© 0xf4a9
+ôª 0xf4aa
+ô« 0xf4ab
+ô¬ 0xf4ac
+ô­ 0xf4ad
+ô® 0xf4ae
+ô¯ 0xf4af
+ô° 0xf4b0
+ô± 0xf4b1
+ô² 0xf4b2
+ô³ 0xf4b3
+ô´ 0xf4b4
+ôµ 0xf4b5
+ô¶ 0xf4b6
+ô· 0xf4b7
+ô¸ 0xf4b8
+ô¹ 0xf4b9
+ôº 0xf4ba
+ô» 0xf4bb
+ô¼ 0xf4bc
+ô½ 0xf4bd
+ô¾ 0xf4be
+ô¿ 0xf4bf
+ôÀ 0xf4c0
+ôÁ 0xf4c1
+ôÂ 0xf4c2
+ôÃ 0xf4c3
+ôÄ 0xf4c4
+ôÅ 0xf4c5
+ôÆ 0xf4c6
+ôÇ 0xf4c7
+ôÈ 0xf4c8
+ôÉ 0xf4c9
+ôÊ 0xf4ca
+ôË 0xf4cb
+ôÌ 0xf4cc
+ôÍ 0xf4cd
+ôÎ 0xf4ce
+ôÏ 0xf4cf
+ôÐ 0xf4d0
+ôÑ 0xf4d1
+ôÒ 0xf4d2
+ôÓ 0xf4d3
+ôÔ 0xf4d4
+ôÕ 0xf4d5
+ôÖ 0xf4d6
+ô× 0xf4d7
+ôØ 0xf4d8
+ôÙ 0xf4d9
+ôÚ 0xf4da
+ôÛ 0xf4db
+ôÜ 0xf4dc
+ôÝ 0xf4dd
+ôÞ 0xf4de
+ôß 0xf4df
+ôà 0xf4e0
+ôá 0xf4e1
+ôâ 0xf4e2
+ôã 0xf4e3
+ôä 0xf4e4
+ôå 0xf4e5
+ôæ 0xf4e6
+ôç 0xf4e7
+ôè 0xf4e8
+ôé 0xf4e9
+ôê 0xf4ea
+ôë 0xf4eb
+ôì 0xf4ec
+ôí 0xf4ed
+ôî 0xf4ee
+ôï 0xf4ef
+ôð 0xf4f0
+ôñ 0xf4f1
+ôò 0xf4f2
+ôó 0xf4f3
+ôô 0xf4f4
+ôõ 0xf4f5
+ôö 0xf4f6
+ô÷ 0xf4f7
+ôø 0xf4f8
+ôù 0xf4f9
+ôú 0xf4fa
+ôû 0xf4fb
+ôü 0xf4fc
+ôý 0xf4fd
+ôþ 0xf4fe
+õ@ 0xf540
+õA 0xf541
+õB 0xf542
+õC 0xf543
+õD 0xf544
+õE 0xf545
+õF 0xf546
+õG 0xf547
+õH 0xf548
+õI 0xf549
+õJ 0xf54a
+õK 0xf54b
+õL 0xf54c
+õM 0xf54d
+õN 0xf54e
+õO 0xf54f
+õP 0xf550
+õQ 0xf551
+õR 0xf552
+õS 0xf553
+õT 0xf554
+õU 0xf555
+õV 0xf556
+õW 0xf557
+õX 0xf558
+õY 0xf559
+õZ 0xf55a
+õ[ 0xf55b
+õ\ 0xf55c
+õ] 0xf55d
+õ^ 0xf55e
+õ_ 0xf55f
+õ` 0xf560
+õa 0xf561
+õb 0xf562
+õc 0xf563
+õd 0xf564
+õe 0xf565
+õf 0xf566
+õg 0xf567
+õh 0xf568
+õi 0xf569
+õj 0xf56a
+õk 0xf56b
+õl 0xf56c
+õm 0xf56d
+õn 0xf56e
+õo 0xf56f
+õp 0xf570
+õq 0xf571
+õr 0xf572
+õs 0xf573
+õt 0xf574
+õu 0xf575
+õv 0xf576
+õw 0xf577
+õx 0xf578
+õy 0xf579
+õz 0xf57a
+õ{ 0xf57b
+õ| 0xf57c
+õ} 0xf57d
+õ~ 0xf57e
+õ¡ 0xf5a1
+õ¢ 0xf5a2
+õ£ 0xf5a3
+õ¤ 0xf5a4
+õ¥ 0xf5a5
+õ¦ 0xf5a6
+õ§ 0xf5a7
+õ¨ 0xf5a8
+õ© 0xf5a9
+õª 0xf5aa
+õ« 0xf5ab
+õ¬ 0xf5ac
+õ­ 0xf5ad
+õ® 0xf5ae
+õ¯ 0xf5af
+õ° 0xf5b0
+õ± 0xf5b1
+õ² 0xf5b2
+õ³ 0xf5b3
+õ´ 0xf5b4
+õµ 0xf5b5
+õ¶ 0xf5b6
+õ· 0xf5b7
+õ¸ 0xf5b8
+õ¹ 0xf5b9
+õº 0xf5ba
+õ» 0xf5bb
+õ¼ 0xf5bc
+õ½ 0xf5bd
+õ¾ 0xf5be
+õ¿ 0xf5bf
+Ä× 0xc4d7
+ÄØ 0xc4d8
+ÄÙ 0xc4d9
+ÄÚ 0xc4da
+ÄÛ 0xc4db
+ÄÜ 0xc4dc
+ÄÝ 0xc4dd
+ÄÞ 0xc4de
+Äß 0xc4df
+Äà 0xc4e0
+Äá 0xc4e1
+Äâ 0xc4e2
+Äã 0xc4e3
+Ää 0xc4e4
+Äå 0xc4e5
+Äæ 0xc4e6
+Äç 0xc4e7
+Äè 0xc4e8
+Äé 0xc4e9
+Äê 0xc4ea
+Äë 0xc4eb
+Äì 0xc4ec
+Äí 0xc4ed
+Äî 0xc4ee
+Äï 0xc4ef
+Äð 0xc4f0
+Äñ 0xc4f1
+Äò 0xc4f2
+Äó 0xc4f3
+Äô 0xc4f4
+Äõ 0xc4f5
+Äö 0xc4f6
+Ä÷ 0xc4f7
+Äø 0xc4f8
+Äù 0xc4f9
+Äú 0xc4fa
+Äû 0xc4fb
+Äü 0xc4fc
+Äý 0xc4fd
+Äþ 0xc4fe
+Å@ 0xc540
+ÅA 0xc541
+ÅB 0xc542
+ÅC 0xc543
+ÅD 0xc544
+ÅE 0xc545
+ÅF 0xc546
+ÅG 0xc547
+ÅH 0xc548
+ÅI 0xc549
+ÅJ 0xc54a
+ÅK 0xc54b
+ÅL 0xc54c
+ÅM 0xc54d
+ÅN 0xc54e
+ÅO 0xc54f
+ÅP 0xc550
+ÅQ 0xc551
+ÅR 0xc552
+ÅS 0xc553
+ÅT 0xc554
+ÅU 0xc555
+ÅV 0xc556
+ÅW 0xc557
+ÅX 0xc558
+ÅY 0xc559
+ÅZ 0xc55a
+Å[ 0xc55b
+Å\ 0xc55c
+Å] 0xc55d
+Å^ 0xc55e
+Å_ 0xc55f
+Å` 0xc560
+Åa 0xc561
+Åb 0xc562
+Åc 0xc563
+Åd 0xc564
+Åe 0xc565
+Åf 0xc566
+Åg 0xc567
+Åh 0xc568
+Åi 0xc569
+Åj 0xc56a
+õÀ 0xf5c0
+õÁ 0xf5c1
+õÂ 0xf5c2
+õÃ 0xf5c3
+õÄ 0xf5c4
+õÅ 0xf5c5
+õÆ 0xf5c6
+õÇ 0xf5c7
+õÈ 0xf5c8
+õÉ 0xf5c9
+õÊ 0xf5ca
+õË 0xf5cb
+õÌ 0xf5cc
+õÍ 0xf5cd
+õÎ 0xf5ce
+õÏ 0xf5cf
+õÐ 0xf5d0
+õÑ 0xf5d1
+õÒ 0xf5d2
+õÓ 0xf5d3
+õÔ 0xf5d4
+õÕ 0xf5d5
+õÖ 0xf5d6
+õ× 0xf5d7
+õØ 0xf5d8
+õÙ 0xf5d9
+õÚ 0xf5da
+õÛ 0xf5db
+õÜ 0xf5dc
+õÝ 0xf5dd
+õÞ 0xf5de
+õß 0xf5df
+õà 0xf5e0
+õá 0xf5e1
+õâ 0xf5e2
+õã 0xf5e3
+õä 0xf5e4
+õå 0xf5e5
+õæ 0xf5e6
+õç 0xf5e7
+õè 0xf5e8
+õé 0xf5e9
+õê 0xf5ea
+õë 0xf5eb
+õì 0xf5ec
+õí 0xf5ed
+õî 0xf5ee
+õï 0xf5ef
+õð 0xf5f0
+õñ 0xf5f1
+õò 0xf5f2
+õó 0xf5f3
+õô 0xf5f4
+õõ 0xf5f5
+õö 0xf5f6
+õ÷ 0xf5f7
+õø 0xf5f8
+õù 0xf5f9
+õú 0xf5fa
+õû 0xf5fb
+õü 0xf5fc
+õý 0xf5fd
+õþ 0xf5fe
+ö@ 0xf640
+öA 0xf641
+öB 0xf642
+öC 0xf643
+öD 0xf644
+öE 0xf645
+öF 0xf646
+öG 0xf647
+öH 0xf648
+öI 0xf649
+öJ 0xf64a
+öK 0xf64b
+öL 0xf64c
+öM 0xf64d
+öN 0xf64e
+öO 0xf64f
+öP 0xf650
+öQ 0xf651
+öR 0xf652
+öS 0xf653
+öT 0xf654
+öU 0xf655
+öV 0xf656
+öW 0xf657
+öX 0xf658
+öY 0xf659
+öZ 0xf65a
+ö[ 0xf65b
+ö\ 0xf65c
+ö] 0xf65d
+ö^ 0xf65e
+ö_ 0xf65f
+ö` 0xf660
+öa 0xf661
+öb 0xf662
+öc 0xf663
+öd 0xf664
+öe 0xf665
+öf 0xf666
+ög 0xf667
+öh 0xf668
+öi 0xf669
+öj 0xf66a
+ök 0xf66b
+öl 0xf66c
+öm 0xf66d
+ön 0xf66e
+öo 0xf66f
+öp 0xf670
+öq 0xf671
+ör 0xf672
+ös 0xf673
+öt 0xf674
+öu 0xf675
+öv 0xf676
+öw 0xf677
+öx 0xf678
+öy 0xf679
+öz 0xf67a
+ö{ 0xf67b
+ö| 0xf67c
+ö} 0xf67d
+ö~ 0xf67e
+ö¡ 0xf6a1
+ö¢ 0xf6a2
+ö£ 0xf6a3
+ö¤ 0xf6a4
+ö¥ 0xf6a5
+ö¦ 0xf6a6
+ö§ 0xf6a7
+ö¨ 0xf6a8
+ö© 0xf6a9
+öª 0xf6aa
+ö« 0xf6ab
+ö¬ 0xf6ac
+ö­ 0xf6ad
+ö® 0xf6ae
+ö¯ 0xf6af
+ö° 0xf6b0
+ö± 0xf6b1
+ö² 0xf6b2
+ö³ 0xf6b3
+ö´ 0xf6b4
+öµ 0xf6b5
+ö¶ 0xf6b6
+ö· 0xf6b7
+ö¸ 0xf6b8
+ö¹ 0xf6b9
+öº 0xf6ba
+ö» 0xf6bb
+ö¼ 0xf6bc
+ö½ 0xf6bd
+ö¾ 0xf6be
+ö¿ 0xf6bf
+öÀ 0xf6c0
+öÁ 0xf6c1
+öÂ 0xf6c2
+öÃ 0xf6c3
+öÄ 0xf6c4
+öÅ 0xf6c5
+öÆ 0xf6c6
+öÇ 0xf6c7
+öÈ 0xf6c8
+öÉ 0xf6c9
+öÊ 0xf6ca
+öË 0xf6cb
+öÌ 0xf6cc
+öÍ 0xf6cd
+öÎ 0xf6ce
+öÏ 0xf6cf
+öÐ 0xf6d0
+öÑ 0xf6d1
+öÒ 0xf6d2
+öÓ 0xf6d3
+öÔ 0xf6d4
+öÕ 0xf6d5
+Åk 0xc56b
+Ål 0xc56c
+Åm 0xc56d
+Ån 0xc56e
+Åo 0xc56f
+Åp 0xc570
+Åq 0xc571
+År 0xc572
+Ås 0xc573
+Åt 0xc574
+Åu 0xc575
+Åv 0xc576
+Åw 0xc577
+Åx 0xc578
+Åy 0xc579
+Åz 0xc57a
+Å{ 0xc57b
+Å| 0xc57c
+Å} 0xc57d
+Å~ 0xc57e
+Å¡ 0xc5a1
+Å¢ 0xc5a2
+Å£ 0xc5a3
+Ť 0xc5a4
+Å¥ 0xc5a5
+Ŧ 0xc5a6
+ŧ 0xc5a7
+Ũ 0xc5a8
+Å© 0xc5a9
+Ū 0xc5aa
+Å« 0xc5ab
+Ŭ 0xc5ac
+Å­ 0xc5ad
+Å® 0xc5ae
+ů 0xc5af
+Å° 0xc5b0
+ű 0xc5b1
+Ų 0xc5b2
+ų 0xc5b3
+Å´ 0xc5b4
+ŵ 0xc5b5
+Ŷ 0xc5b6
+Å· 0xc5b7
+Ÿ 0xc5b8
+Ź 0xc5b9
+ź 0xc5ba
+Å» 0xc5bb
+ż 0xc5bc
+Ž 0xc5bd
+ž 0xc5be
+Å¿ 0xc5bf
+ÅÀ 0xc5c0
+ÅÁ 0xc5c1
+ÅÂ 0xc5c2
+ÅÃ 0xc5c3
+ÅÄ 0xc5c4
+ÅÅ 0xc5c5
+ÅÆ 0xc5c6
+ÅÇ 0xc5c7
+öÖ 0xf6d6
+ö× 0xf6d7
+öØ 0xf6d8
+öÙ 0xf6d9
+öÚ 0xf6da
+öÛ 0xf6db
+öÜ 0xf6dc
+öÝ 0xf6dd
+öÞ 0xf6de
+öß 0xf6df
+öà 0xf6e0
+öá 0xf6e1
+öâ 0xf6e2
+öã 0xf6e3
+öä 0xf6e4
+öå 0xf6e5
+öæ 0xf6e6
+öç 0xf6e7
+öè 0xf6e8
+öé 0xf6e9
+öê 0xf6ea
+öë 0xf6eb
+öì 0xf6ec
+öí 0xf6ed
+öî 0xf6ee
+öï 0xf6ef
+öð 0xf6f0
+öñ 0xf6f1
+öò 0xf6f2
+öó 0xf6f3
+öô 0xf6f4
+öõ 0xf6f5
+öö 0xf6f6
+ö÷ 0xf6f7
+öø 0xf6f8
+öù 0xf6f9
+öú 0xf6fa
+öû 0xf6fb
+öü 0xf6fc
+öý 0xf6fd
+öþ 0xf6fe
+÷@ 0xf740
+÷A 0xf741
+÷B 0xf742
+÷C 0xf743
+÷D 0xf744
+÷E 0xf745
+÷F 0xf746
+÷G 0xf747
+÷H 0xf748
+÷I 0xf749
+÷J 0xf74a
+÷K 0xf74b
+÷L 0xf74c
+÷M 0xf74d
+÷N 0xf74e
+÷O 0xf74f
+÷P 0xf750
+÷Q 0xf751
+÷R 0xf752
+÷S 0xf753
+÷T 0xf754
+÷U 0xf755
+÷V 0xf756
+÷W 0xf757
+÷X 0xf758
+÷Y 0xf759
+÷Z 0xf75a
+÷[ 0xf75b
+÷\ 0xf75c
+÷] 0xf75d
+÷^ 0xf75e
+÷_ 0xf75f
+÷` 0xf760
+÷a 0xf761
+÷b 0xf762
+÷c 0xf763
+÷d 0xf764
+÷e 0xf765
+÷f 0xf766
+÷g 0xf767
+÷h 0xf768
+÷i 0xf769
+÷j 0xf76a
+÷k 0xf76b
+÷l 0xf76c
+÷m 0xf76d
+÷n 0xf76e
+÷o 0xf76f
+÷p 0xf770
+÷q 0xf771
+÷r 0xf772
+÷s 0xf773
+÷t 0xf774
+÷u 0xf775
+÷v 0xf776
+÷w 0xf777
+÷x 0xf778
+÷y 0xf779
+÷z 0xf77a
+÷{ 0xf77b
+÷| 0xf77c
+÷} 0xf77d
+÷~ 0xf77e
+÷¡ 0xf7a1
+÷¢ 0xf7a2
+÷£ 0xf7a3
+÷¤ 0xf7a4
+÷¥ 0xf7a5
+÷¦ 0xf7a6
+֤ 0xf7a7
+֬ 0xf7a8
+֩ 0xf7a9
+ֻ 0xf7aa
+÷« 0xf7ab
+÷¬ 0xf7ac
+÷­ 0xf7ad
+÷® 0xf7ae
+÷¯ 0xf7af
+÷° 0xf7b0
+÷± 0xf7b1
+÷² 0xf7b2
+÷³ 0xf7b3
+÷´ 0xf7b4
+÷µ 0xf7b5
+֦ 0xf7b6
+÷· 0xf7b7
+÷¸ 0xf7b8
+÷¹ 0xf7b9
+ּ 0xf7ba
+÷» 0xf7bb
+÷¼ 0xf7bc
+÷½ 0xf7bd
+÷¾ 0xf7be
+÷¿ 0xf7bf
+÷À 0xf7c0
+÷Á 0xf7c1
+÷ 0xf7c2
+ֈ 0xf7c3
+ր 0xf7c4
+ց 0xf7c5
+֮ 0xf7c6
+ւ 0xf7c7
+÷È 0xf7c8
+փ 0xf7c9
+÷Ê 0xf7ca
+÷Ë 0xf7cb
+÷Ì 0xf7cc
+÷Í 0xf7cd
+÷Î 0xf7ce
+÷Ï 0xf7cf
+ÅÈ 0xc5c8
+ÅÉ 0xc5c9
+ÅÊ 0xc5ca
+ÅË 0xc5cb
+ÅÌ 0xc5cc
+ÅÍ 0xc5cd
+ÅÎ 0xc5ce
+ÅÏ 0xc5cf
+ÅÐ 0xc5d0
+ÅÑ 0xc5d1
+ÅÒ 0xc5d2
+ÅÓ 0xc5d3
+ÅÔ 0xc5d4
+ÅÕ 0xc5d5
+ÅÖ 0xc5d6
+Å× 0xc5d7
+ÅØ 0xc5d8
+ÅÙ 0xc5d9
+ÅÚ 0xc5da
+ÅÛ 0xc5db
+ÅÜ 0xc5dc
+ÅÝ 0xc5dd
+ÅÞ 0xc5de
+Åß 0xc5df
+Åà 0xc5e0
+Åá 0xc5e1
+Åâ 0xc5e2
+Åã 0xc5e3
+Åä 0xc5e4
+Åå 0xc5e5
+Åæ 0xc5e6
+Åç 0xc5e7
+Åè 0xc5e8
+Åé 0xc5e9
+Åê 0xc5ea
+Åë 0xc5eb
+Åì 0xc5ec
+Åí 0xc5ed
+Åî 0xc5ee
+Åï 0xc5ef
+Åð 0xc5f0
+÷Ð 0xf7d0
+ք 0xf7d1
+÷Ò 0xf7d2
+÷Ó 0xf7d3
+÷Ô 0xf7d4
+÷Õ 0xf7d5
+÷Ö 0xf7d6
+÷× 0xf7d7
+֯ 0xf7d8
+÷Ù 0xf7d9
+÷Ú 0xf7da
+÷Û 0xf7db
+ֆ 0xf7dc
+÷Ý 0xf7dd
+÷Þ 0xf7de
+֧ 0xf7df
+ֈ 0xf7e0
+և 0xf7e1
+։ 0xf7e2
+֋ 0xf7e3
+֊ 0xf7e4
+֌ 0xf7e5
+־ 0xf7e6
+֍ 0xf7e7
+֏ 0xf7e8
+֎ 0xf7e9
+֐ 0xf7ea
+֑ 0xf7eb
+֓ 0xf7ec
+֒ 0xf7ed
+֔ 0xf7ee
+֕ 0xf7ef
+÷ð 0xf7f0
+֖ 0xf7f1
+÷ò 0xf7f2
+÷ó 0xf7f3
+÷ô 0xf7f4
+÷õ 0xf7f5
+÷ö 0xf7f6
+÷÷ 0xf7f7
+÷ø 0xf7f8
+÷ù 0xf7f9
+÷ú 0xf7fa
+÷û 0xf7fb
+֟ 0xf7fc
+÷ý 0xf7fd
+÷þ 0xf7fe
+ø@ 0xf840
+øA 0xf841
+øB 0xf842
+øC 0xf843
+øD 0xf844
+øE 0xf845
+øF 0xf846
+øG 0xf847
+øH 0xf848
+øI 0xf849
+øJ 0xf84a
+øK 0xf84b
+øL 0xf84c
+øM 0xf84d
+øN 0xf84e
+øO 0xf84f
+øP 0xf850
+øQ 0xf851
+øR 0xf852
+øS 0xf853
+øT 0xf854
+øU 0xf855
+øV 0xf856
+øW 0xf857
+øX 0xf858
+øY 0xf859
+øZ 0xf85a
+ø[ 0xf85b
+ø\ 0xf85c
+ø] 0xf85d
+ø^ 0xf85e
+ø_ 0xf85f
+ø` 0xf860
+øa 0xf861
+øb 0xf862
+øc 0xf863
+ød 0xf864
+øe 0xf865
+øf 0xf866
+øg 0xf867
+øh 0xf868
+øi 0xf869
+øj 0xf86a
+øk 0xf86b
+øl 0xf86c
+øm 0xf86d
+øn 0xf86e
+øo 0xf86f
+øp 0xf870
+øq 0xf871
+ør 0xf872
+øs 0xf873
+øt 0xf874
+øu 0xf875
+øv 0xf876
+øw 0xf877
+øx 0xf878
+øy 0xf879
+øz 0xf87a
+ø{ 0xf87b
+ø| 0xf87c
+ø} 0xf87d
+ø~ 0xf87e
+ø¡ 0xf8a1
+ø¢ 0xf8a2
+ø£ 0xf8a3
+ø¤ 0xf8a4
+Åñ 0xc5f1
+Åò 0xc5f2
+Åó 0xc5f3
+Åô 0xc5f4
+Åõ 0xc5f5
+Åö 0xc5f6
+Å÷ 0xc5f7
+Åø 0xc5f8
+Åù 0xc5f9
+Åú 0xc5fa
+Åû 0xc5fb
+Åü 0xc5fc
+Åý 0xc5fd
+Åþ 0xc5fe
+Æ@ 0xc640
+ÆA 0xc641
+ÆB 0xc642
+ÆC 0xc643
+ÆD 0xc644
+ÆE 0xc645
+ÆF 0xc646
+ÆG 0xc647
+ÆH 0xc648
+ÆI 0xc649
+ÆJ 0xc64a
+ÆK 0xc64b
+ÆL 0xc64c
+ÆM 0xc64d
+ÆN 0xc64e
+ÆO 0xc64f
+ÆP 0xc650
+ÆQ 0xc651
+ÆR 0xc652
+ÆS 0xc653
+ÆT 0xc654
+ø¥ 0xf8a5
+ø¦ 0xf8a6
+ø§ 0xf8a7
+ø¨ 0xf8a8
+ø© 0xf8a9
+øª 0xf8aa
+ø« 0xf8ab
+ø¬ 0xf8ac
+ø­ 0xf8ad
+ø® 0xf8ae
+ø¯ 0xf8af
+ø° 0xf8b0
+ø± 0xf8b1
+ø² 0xf8b2
+ø³ 0xf8b3
+ø´ 0xf8b4
+øµ 0xf8b5
+ø¶ 0xf8b6
+ø· 0xf8b7
+ø¸ 0xf8b8
+ø¹ 0xf8b9
+øº 0xf8ba
+ø» 0xf8bb
+ø¼ 0xf8bc
+ø½ 0xf8bd
+ø¾ 0xf8be
+ø¿ 0xf8bf
+øÀ 0xf8c0
+øÁ 0xf8c1
+øÂ 0xf8c2
+øÃ 0xf8c3
+øÄ 0xf8c4
+øÅ 0xf8c5
+øÆ 0xf8c6
+øÇ 0xf8c7
+øÈ 0xf8c8
+øÉ 0xf8c9
+øÊ 0xf8ca
+øË 0xf8cb
+øÌ 0xf8cc
+øÍ 0xf8cd
+øÎ 0xf8ce
+øÏ 0xf8cf
+øÐ 0xf8d0
+øÑ 0xf8d1
+øÒ 0xf8d2
+øÓ 0xf8d3
+øÔ 0xf8d4
+øÕ 0xf8d5
+øÖ 0xf8d6
+ø× 0xf8d7
+øØ 0xf8d8
+øÙ 0xf8d9
+øÚ 0xf8da
+øÛ 0xf8db
+øÜ 0xf8dc
+øÝ 0xf8dd
+øÞ 0xf8de
+øß 0xf8df
+øà 0xf8e0
+øá 0xf8e1
+øâ 0xf8e2
+øã 0xf8e3
+øä 0xf8e4
+øå 0xf8e5
+øæ 0xf8e6
+øç 0xf8e7
+øè 0xf8e8
+øé 0xf8e9
+øê 0xf8ea
+øë 0xf8eb
+øì 0xf8ec
+øí 0xf8ed
+ÆU 0xc655
+ÆV 0xc656
+ÆW 0xc657
+ÆX 0xc658
+ÆY 0xc659
+ÆZ 0xc65a
+Æ[ 0xc65b
+Æ\ 0xc65c
+Æ] 0xc65d
+Æ^ 0xc65e
+Æ_ 0xc65f
+Æ` 0xc660
+Æa 0xc661
+Æb 0xc662
+Æc 0xc663
+Æd 0xc664
+øî 0xf8ee
+øï 0xf8ef
+øð 0xf8f0
+øñ 0xf8f1
+øò 0xf8f2
+øó 0xf8f3
+øô 0xf8f4
+øõ 0xf8f5
+øö 0xf8f6
+ø÷ 0xf8f7
+øø 0xf8f8
+øù 0xf8f9
+øú 0xf8fa
+øû 0xf8fb
+øü 0xf8fc
+øý 0xf8fd
+øþ 0xf8fe
+ù@ 0xf940
+ùA 0xf941
+ùB 0xf942
+ùC 0xf943
+ùD 0xf944
+ùE 0xf945
+ùF 0xf946
+ùG 0xf947
+ùH 0xf948
+ùI 0xf949
+ùJ 0xf94a
+ùK 0xf94b
+ùL 0xf94c
+ùM 0xf94d
+ùN 0xf94e
+ùO 0xf94f
+ùP 0xf950
+ùQ 0xf951
+ùR 0xf952
+ùS 0xf953
+ùT 0xf954
+ùU 0xf955
+ùV 0xf956
+ùW 0xf957
+ùX 0xf958
+ùY 0xf959
+ùZ 0xf95a
+ù[ 0xf95b
+ù\ 0xf95c
+ù] 0xf95d
+ù^ 0xf95e
+ù_ 0xf95f
+ù` 0xf960
+ùa 0xf961
+ùb 0xf962
+ùc 0xf963
+ùd 0xf964
+ùe 0xf965
+ùf 0xf966
+ùg 0xf967
+ùh 0xf968
+ùi 0xf969
+ùj 0xf96a
+Æe 0xc665
+Æf 0xc666
+Æg 0xc667
+Æh 0xc668
+Æi 0xc669
+Æj 0xc66a
+Æk 0xc66b
+ùk 0xf96b
+ùl 0xf96c
+ùm 0xf96d
+ùn 0xf96e
+ùo 0xf96f
+ùp 0xf970
+ùq 0xf971
+ùr 0xf972
+ùs 0xf973
+ùt 0xf974
+ùu 0xf975
+ùv 0xf976
+ùw 0xf977
+ùx 0xf978
+ùy 0xf979
+ùz 0xf97a
+ù{ 0xf97b
+ù| 0xf97c
+ù} 0xf97d
+ù~ 0xf97e
+ù¡ 0xf9a1
+Æl 0xc66c
+Æm 0xc66d
+Æn 0xc66e
+Æo 0xc66f
+Æp 0xc670
+Æq 0xc671
+Ær 0xc672
+Æs 0xc673
+Æt 0xc674
+Æu 0xc675
+ù¢ 0xf9a2
+ù£ 0xf9a3
+ù¤ 0xf9a4
+ù¥ 0xf9a5
+ù¦ 0xf9a6
+ù§ 0xf9a7
+ù¨ 0xf9a8
+ù© 0xf9a9
+ùª 0xf9aa
+ù« 0xf9ab
+ù¬ 0xf9ac
+ù­ 0xf9ad
+ù® 0xf9ae
+ù¯ 0xf9af
+ù° 0xf9b0
+ù± 0xf9b1
+ù² 0xf9b2
+ù³ 0xf9b3
+ù´ 0xf9b4
+ùµ 0xf9b5
+ù¶ 0xf9b6
+ù· 0xf9b7
+ù¸ 0xf9b8
+ù¹ 0xf9b9
+Æv 0xc676
+Æw 0xc677
+Æx 0xc678
+ùº 0xf9ba
+ù» 0xf9bb
+ù¼ 0xf9bc
+ù½ 0xf9bd
+ù¾ 0xf9be
+ù¿ 0xf9bf
+ùÀ 0xf9c0
+ùÁ 0xf9c1
+ùÂ 0xf9c2
+ùÃ 0xf9c3
+ùÄ 0xf9c4
+ùÅ 0xf9c5
+Æy 0xc679
+Æz 0xc67a
+Æ{ 0xc67b
+Æ| 0xc67c
+ùÇ 0xf9c7
+ùÈ 0xf9c8
+ùÉ 0xf9c9
+ùÊ 0xf9ca
+ùË 0xf9cb
+Æ} 0xc67d
+ùÌ 0xf9cc
+ùÍ 0xf9cd
+ùÎ 0xf9ce
+ùÏ 0xf9cf
+ùÐ 0xf9d0
+Æ~ 0xc67e
+ùÑ 0xf9d1
+ùÆ 0xf9c6
+ùÒ 0xf9d2
+ùÓ 0xf9d3
+ùÔ 0xf9d4
+ùÕ 0xf9d5
diff --git a/private/oleauto/sample/nlssort/result.jpn b/private/oleauto/sample/nlssort/result.jpn
new file mode 100644
index 000000000..669c34051
--- /dev/null
+++ b/private/oleauto/sample/nlssort/result.jpn
@@ -0,0 +1,16109 @@
+ƒ@
+‚Ÿ
+ƒA
+‚ 
+‚ [‚­
+‚ [‚¯[‚Ç
+‚ [‚¿
+‚ [‚¿‚¥‚è
+‚ [‚Ä‚¡‚·‚Æ
+‚ [‚Æ
+‚ [‚Þ
+‚ ‚¢
+‚ ‚¢‚ ‚ñ
+‚ ‚¢‚¢‚ë
+‚ ‚¢‚¦‚ñ‚©
+‚ ‚¢‚¨‚¢
+‚ ‚¢‚©‚¬
+‚ ‚¢‚©‚½
+‚ ‚¢‚«‚á‚­
+‚ ‚¢‚«‚傤
+‚ ‚¢‚­‚¿
+‚ ‚¢‚¯‚ñ
+‚ ‚¢‚±
+‚ ‚¢‚±‚¤‚©
+‚ ‚¢‚±‚­
+‚ ‚¢‚±‚ñ
+‚ ‚¢‚³‚¢
+‚ ‚¢‚µ
+‚ ‚¢‚¶
+‚ ‚¢‚µ‚á
+‚ ‚¢‚µ‚イ
+‚ ‚¢‚µ‚傤
+‚ ‚¢‚¶‚ñ
+‚ ‚¢‚·
+‚ ‚¢‚»
+‚ ‚¢‚»‚¤
+‚ ‚¢‚¼‚¤
+‚ ‚¢‚»‚­
+‚ ‚¢‚¾
+‚ ‚¢‚¿‚傤
+‚ ‚¢‚¿
+‚ ‚¢‚Ä
+‚ ‚¢‚Å‚ 
+‚ ‚¢‚Ä‚ª‚½
+‚ ‚¢‚Ä‚³‚«
+‚ ‚¢‚Ç‚é
+‚ ‚¢‚Ñ‚«
+‚ ‚¢‚Ó‚­
+‚ ‚¢‚ׂÂ
+‚ ‚¢‚Ú‚¤
+‚ ‚¢‚Ü
+‚ ‚¢‚Ü‚¢
+‚ ‚¢‚æ‚­
+‚ ‚¢‚ë
+‚ ‚¢‚ë‚ñ
+‚ ‚¦‚ñ
+‚ ‚¨
+‚ ‚¨‚¢
+‚ ‚¨‚¢‚«‚Æ‚¢‚«
+‚ ‚¨‚¢‚ë
+‚ ‚¨‚«
+‚ ‚¨‚¶‚Ⴕ‚ñ
+‚ ‚¨‚¸
+‚ ‚¨‚¼‚ç
+‚ ‚¨‚½
+‚ ‚¨‚È
+‚ ‚¨‚Î
+‚ ‚¨‚à‚Ì
+‚ ‚¨‚€
+‚ ‚©
+‚ ‚©‚µ
+‚ ‚©‚¶
+‚ ‚©‚µ‚¨
+‚ ‚©‚µ‚ñ‚²‚¤
+‚ ‚©‚‚«
+‚ ‚©‚‚¿
+‚ ‚©‚Å‚Ý[
+‚ ‚©‚Å‚ñ‚í
+‚ ‚©‚Ë
+‚ ‚©‚Í‚½
+‚ ‚©‚Ó‚¾
+‚ ‚©‚Ü‚Â
+‚ ‚©‚Ý
+‚ ‚©‚à‚ñ
+‚ ‚©‚炳‚Ü
+‚ ‚©‚è
+‚ ‚ª‚è
+‚ ‚©‚ñ‚Ú‚¤
+‚ ‚«‚©‚ñ
+‚ ‚«‚®‚¿
+‚ ‚«‚³‚ß
+‚ ‚«‚·
+‚ ‚«‚¿
+‚ ‚«‚΂±
+‚ ‚«‚΂ê
+‚ ‚«‚܂‚è
+‚ ‚«‚â
+‚ ‚«‚ê‚·
+‚ ‚«‚ê‚·‚¯‚ñ
+‚ ‚­
+‚ ‚­‚¢
+‚ ‚­‚¤‚ñ
+‚ ‚­‚¬‚á‚­
+‚ ‚­‚¶
+‚ ‚­‚µ‚Â
+‚ ‚­‚µ‚Å‚ñ‚Æ
+‚ ‚­‚µ‚イ
+‚ ‚­‚µ‚å
+‚ ‚­‚¶‚傤‚¯‚ñ
+‚ ‚­‚¹‚³‚è
+‚ ‚­‚¹‚³‚è[
+‚ ‚­‚¹‚·
+‚ ‚­‚¹‚é
+‚ ‚­‚¹‚ñ
+‚ ‚­‚¹‚ñ‚Æ
+‚ ‚­‚½
+‚ ‚­‚¿‚ウ[‚½
+‚ ‚­‚Ä‚¡‚Ô
+‚ ‚­‚Ä‚ñ‚±‚¤
+‚ ‚­‚Æ‚¤
+‚ ‚­‚Ç‚¤
+‚ ‚­‚Æ‚­‚¢
+‚ ‚­‚É‚ñ
+‚ ‚­‚Ö‚¢
+‚ ‚­‚Ö‚«
+‚ ‚­‚Ü
+‚ ‚­‚Þ
+‚ ‚­‚ß‚¢
+‚ ‚­‚â‚­
+‚ ‚­‚䂤
+‚ ‚­‚è‚é
+‚ ‚­‚ê‚¢
+‚ ‚­‚ë
+‚ ‚­‚ë‚΂Á‚Æ
+‚ ‚¯
+‚ ‚°
+‚ ‚°‚ ‚µ
+‚ ‚°‚­
+‚ ‚¯‚­‚ê
+‚ ‚°‚µ‚¨
+‚ ‚°‚¼‚±
+‚ ‚¯‚Á‚Ï‚È‚µ
+‚ ‚¯‚Ú‚Ì
+‚ ‚°‚à‚Ì
+‚ ‚±[‚Å‚¨‚ñ
+‚ ‚³
+‚ ‚´
+‚ ‚³‚¢‚¿
+‚ ‚³‚¢‚Æ
+‚ ‚³‚ª‚¨
+‚ ‚³‚ª‚½
+‚ ‚³‚¹
+‚ ‚³‚Á‚Ä
+‚ ‚³‚‚ä
+‚ ‚³‚È‚¬
+‚ ‚³‚΂ñ
+‚ ‚³‚Ð
+‚ ‚³‚䂤
+‚ ‚¶
+‚ ‚µ‚ ‚Æ
+‚ ‚µ‚¨‚Æ
+‚ ‚µ‚ª‚©‚è
+‚ ‚µ‚©‚¯
+‚ ‚µ‚­‚Ñ
+‚ ‚µ‚±‚µ
+‚ ‚µ‚·‚½‚ñ‚Æ
+‚ ‚µ‚½
+‚ ‚µ‚¾‚¢
+‚ ‚¶‚‚¯‚Ì‚è
+‚ ‚µ‚Ç‚è
+‚ ‚µ‚È‚Ý
+‚ ‚µ‚Î
+‚ ‚µ‚ã‚ç
+‚ ‚·
+‚ ‚·‚©
+‚ ‚¸‚©‚è‚«‚ñ
+‚ ‚¸‚©‚肵‚傤
+‚ ‚¸‚«
+‚ ‚¸‚³
+‚ ‚·‚Ø‚­‚Æ
+‚ ‚¸‚Ü
+‚ ‚¸‚Ü‚â
+‚ ‚º
+‚ ‚º‚­‚ç
+‚ ‚¹‚Ý‚¸
+‚ ‚º‚Ý‚¿
+‚ ‚¹‚ñ‚Ô‚è
+‚ ‚¹‚ñ‚Ô‚é
+‚ ‚»‚±
+‚ ‚»‚µ‚¦[‚µ‚å‚ñ
+‚ ‚»‚Ñ‚Î
+‚ ‚¾
+‚ ‚½‚¢
+‚ ‚½‚Á‚µ‚ク[‚·
+‚ ‚¾‚È
+‚ ‚¾‚Õ‚½
+‚ ‚½‚Ü
+‚ ‚½‚Ü‚¤‚¿
+‚ ‚½‚Ü‚©‚¸
+‚ ‚½‚Ü‚«‚ñ
+‚ ‚½‚è‚Ç‚µ
+‚ ‚¿‚±‚¿
+‚ ‚¿‚ç
+‚ ‚‚¢‚½
+‚ ‚‚¦‚ñ‚«
+‚ ‚Á‚©
+‚ ‚‚©‚¢
+‚ ‚‚©‚¢‚Ä‚ñ
+‚ ‚‚ª‚Ý
+‚ ‚Á‚©‚ñ
+‚ ‚Á‚¯
+‚ ‚‚³
+‚ ‚‚¶
+‚ ‚Á‚µ‚ã‚­‚«
+‚ ‚Á‚¿
+‚ ‚Á‚¿‚á‚ñ
+‚ ‚‚Å
+‚ ‚‚łñ
+‚ ‚Á‚Æ
+‚ ‚Á‚Õ‚é
+‚ ‚‚ß
+‚ ‚‚ꂫ
+‚ ‚Ä
+‚ ‚Ä‚³‚«
+‚ ‚Ä‚¶
+‚ ‚Ä‚¸‚¢‚è‚傤
+‚ ‚Ä‚È
+‚ ‚Æ
+‚ ‚Æ‚ ‚Æ
+‚ ‚Æ‚©‚½
+‚ ‚Æ‚ª‚Ü
+‚ ‚Æ‚«‚ñ
+‚ ‚Æ‚³‚«
+‚ ‚Æ‚¿
+‚ ‚Ƃ‚¬
+‚ ‚Ƃ̂܂‚è
+‚ ‚ǂ΂¢‚´[
+‚ ‚ǂ΂½‚¢‚¸
+‚ ‚ǂ΂é[‚ñ
+‚ ‚ǂ΂ñ‚Ä[‚¶
+‚ ‚ǂׂñ‚¿‚á
+‚ ‚Ƃ܂킵
+‚ ‚Ƃ肦
+‚ ‚Ç‚è‚Ô
+‚ ‚Ç‚ê‚·
+‚ ‚È
+‚ ‚È‚¤‚ñ‚³
+‚ ‚È‚®‚ç
+‚ ‚È‚½
+‚ ‚È‚ë‚®
+‚ ‚É
+‚ ‚É‚«
+‚ ‚É‚Ü‚é
+‚ ‚É‚ß
+‚ ‚É‚ß[‚µ‚å‚ñ
+‚ ‚É‚æ‚ß
+‚ ‚Ë‚Á‚½‚¢
+‚ ‚Ì‚±‚Æ
+‚ ‚Ï[‚Æ
+‚ ‚΂ç‚Ú‚Ë
+‚ ‚΂ç‚â
+‚ ‚Ï‚é‚Æ
+‚ ‚Ђé
+‚ ‚Ó‚ª‚É‚·‚½‚ñ
+‚ ‚Ó‚½
+‚ ‚Ó‚½‚Ê[‚ñ
+‚ ‚Ô‚Ý
+‚ ‚Ô‚ç
+‚ ‚Ô‚ç‚ ‚°
+‚ ‚Ô‚ç‚ ‚¹
+‚ ‚Ô‚ç‚©‚·
+‚ ‚Ԃ炳‚µ
+‚ ‚Ô‚ç‚Ý
+‚ ‚Ղ肯[‚µ‚å‚ñ
+‚ ‚ׂÁ‚­
+‚ ‚ׂɂã[
+‚ ‚ׂê[‚¶
+‚ ‚Ü
+‚ ‚Ü‚ ‚µ
+‚ ‚Ü‚¦‚ñ‚Ú‚¤
+‚ ‚Ü‚ª‚³
+‚ ‚Ü‚®
+‚ ‚Ü‚­‚¿
+‚ ‚Ü‚®‚Â
+‚ ‚Ü‚®‚è
+‚ ‚Ü‚´‚¯
+‚ ‚Ü‚´‚炵
+‚ ‚Ü‚¶‚¨
+‚ ‚Ü‚½
+‚ ‚Ü‚¿‚ã‚ 
+‚ ‚Ü‚Å‚ç
+‚ ‚Ü‚Ç‚¢
+‚ ‚Ü‚Æ‚¤
+‚ ‚Ü‚Ì‚ª‚í
+‚ ‚Ü‚Ý
+‚ ‚Ü‚Ý‚¸
+‚ ‚Ü‚è
+‚ ‚Ý
+‚ ‚Ý‚¾
+‚ ‚Ý‚¾‚È
+‚ ‚Ý‚Ç
+‚ ‚Ý‚Ì
+‚ ‚Ý‚Ì‚³‚ñ
+‚ ‚Ý‚Ì‚ß
+‚ ‚Ý‚ß
+‚ ‚ß
+‚ ‚ß‚ ‚ª‚è
+‚ ‚ß‚Ó‚è
+‚ ‚ß‚à‚悤
+‚ ‚ß‚è‚©‚ñ
+‚ ‚â
+‚ ‚â‚Ü‚¿
+‚ ‚ä
+‚ ‚ç
+‚ ‚ç‚¢‚ ‚ª‚è
+‚ ‚ç‚¢‚´‚ç‚¢
+‚ ‚ç‚¢‚»
+‚ ‚炤‚Ý
+‚ ‚ç‚«
+‚ ‚ç‚·‚¶
+‚ ‚炽
+‚ ‚ç‚Ä
+‚ ‚ç‚Æ
+‚ ‚ç‚È‚Ý
+‚ ‚ç‚È‚í
+‚ ‚ç‚Ñ‚ ‚²
+‚ ‚ç‚à‚Ì
+‚ ‚ç‚â
+‚ ‚ç‚è
+‚ ‚ç‚肦‚«
+‚ ‚ç‚肦‚«‚è‚Â
+‚ ‚è
+‚ ‚è‚ ‚¯
+‚ ‚肪‚½‚ß‚¢‚í‚­
+‚ ‚肪‚Ë
+‚ ‚肳‚Ü
+‚ ‚è‚·‚Æ‚Ä‚ê‚·
+‚ ‚è‚Ì‚Ü‚Ü
+‚ ‚è‚΂¢
+‚ ‚è‚イ
+‚ ‚é‚©‚肹‚¢
+‚ ‚é‚«‚ß‚Å‚·
+‚ ‚邱[‚é
+‚ ‚邲‚肸‚Þ
+‚ ‚邶
+‚ ‚邶‚¥‚è‚ 
+‚ ‚邺‚ñ‚¿‚ñ
+‚ ‚é‚¿‚イ
+‚ ‚é‚Æ
+‚ ‚é‚΂Þ
+‚ ‚é‚Ó‚Ÿ
+‚ ‚é‚Ó‚Ÿ‚¹‚ñ
+‚ ‚é‚Ó‚Ÿ‚ׂÁ‚Æ
+‚ ‚é‚Ý
+‚ ‚é‚Ý‚É‚¤‚Þ
+‚ ‚é‚Ý‚É‚ã[‚Þ
+‚ ‚ê
+‚ ‚ê‚¢
+‚ ‚ꂵ‚傤
+‚ ‚ê‚à‚悤
+‚ ‚ê‚邬
+‚ ‚í
+‚ ‚í[
+‚ ‚킹
+‚ ‚í‚‚Ô
+‚ ‚í‚ä‚«
+‚ ‚ñ
+‚ ‚ñ‚¤‚ñ
+‚ ‚ñ‚®‚é
+‚ ‚ñ‚¯‚ñ
+‚ ‚ñ‚²‚¤
+‚ ‚ñ‚±[‚é
+‚ ‚ñ‚±‚­
+‚ ‚ñ‚³‚ñ‚Ô‚é
+‚ ‚ñ‚µ‚Â
+‚ ‚ñ‚µ‚ñ
+‚ ‚ñ‚µ‚ñ‚©‚ñ
+‚ ‚ñ‚¸
+‚ ‚ñ‚¹‚¢
+‚ ‚ñ‚º‚ñ
+‚ ‚ñ‚º‚ñ‚¹‚¢
+‚ ‚ñ‚º‚ñ‚è‚Â
+‚ ‚ñ‚¾[
+‚ ‚ñ‚¾[‚ç‚¢‚ñ
+‚ ‚ñ‚¿
+‚ ‚ñ‚Ä‚¢‚©‚ñ
+‚ ‚ñ‚Ä‚¢‚µ‚å
+‚ ‚ñ‚Ä‚¢‚¹‚¢
+‚ ‚ñ‚Ä‚È
+‚ ‚ñ‚Ç
+‚ ‚ñ‚Ç‚ë‚ß‚¾
+‚ ‚ñ‚È‚¢‚µ‚å
+‚ ‚ñ‚È‚¢‚¶‚å
+‚ ‚ñ‚È‚¢‚¶‚傤
+‚ ‚ñ‚È‚¢‚É‚ñ
+‚ ‚ñ‚Ë‚¢
+‚ ‚ñ‚΂ç‚ñ‚·
+‚ ‚ñ‚Ò
+‚ ‚ñ‚Ô‚ñ
+‚ ‚ñ‚Ø‚ 
+‚ ‚ñ‚Û
+‚ ‚ñ‚Ü‚­
+‚ ‚ñ‚Ý‚Â
+‚ ‚ñ‚à‚É‚ 
+‚ ‚ñ‚ç‚­
+ƒB
+‚¡
+ƒC
+‚¢
+‚¢
+‚¢[
+‚¢‚¢‚¦
+‚¢‚¢‚©‚½
+‚¢[‚®‚é
+‚¢[‚½
+‚¢‚¢‚¾‚­‚¾‚­
+‚¢‚¢‚‚¯
+‚¢‚¢‚È‚¸‚¯
+‚¢‚¢‚È‚è
+‚¢‚¢‚Ô‚ñ
+‚¢‚¢‚ñ
+‚¢‚¢‚ñ‚¿‚傤
+‚¢‚¦
+‚¢‚¦‚¢
+‚¢‚¦‚ª‚ç
+‚¢‚¦‚«
+‚¢‚¦‚¶
+‚¢‚¦‚·
+‚¢‚¦‚à‚Æ
+‚¢‚¦‚ë[
+‚¢‚¦‚ñ
+‚¢‚¨‚¤
+‚¢‚¨‚½
+‚¢‚¨‚è
+‚¢‚¨‚ñ
+‚¢‚ª
+‚¢‚ª‚¢
+‚¢‚©‚¢‚悤
+‚¢‚ª‚­
+‚¢‚ª‚­‚©
+‚¢‚ª‚­‚¯‚¢
+‚¢‚ª‚­‚Ô
+‚¢‚©‚¾
+‚¢‚ª‚½
+‚¢‚ª‚Á‚©
+‚¢‚©‚è
+‚¢‚©‚ñ
+‚¢‚ª‚ñ
+‚¢‚«
+‚¢‚«‚¤‚‚µ
+‚¢‚«‚¤‚ß
+‚¢‚«‚¨‚¢
+‚¢‚«‚ª‚¢
+‚¢‚«‚ª‚©‚è
+‚¢‚«‚©‚½
+‚¢‚«‚³‚«
+‚¢‚«‚´‚Ü
+‚¢‚«‚¿‚ª‚¢
+‚¢‚«‚©‚¢
+‚¢‚«‚Ç‚Ü‚è
+‚¢‚«‚È‚¢
+‚¢‚«‚à‚Ì
+‚¢‚«‚傤
+‚¢‚«‚悤‚悤
+‚¢‚«‚å‚­
+‚¢‚«‚í‚©‚ê
+‚¢‚­
+‚¢‚­‚¦
+‚¢‚­‚³
+‚¢‚­‚¶
+‚¢‚­‚Ç
+‚¢‚­‚Ç‚¤‚¨‚ñ
+‚¢‚­‚É‚¿
+‚¢‚­‚Ô‚ñ
+‚¢‚­‚ç
+‚¢‚­‚ñ
+‚¢‚¯
+‚¢‚¯‚ª‚«
+‚¢‚¯‚΂È
+‚¢‚¯‚ñ
+‚¢‚°‚ñ
+‚¢‚²
+‚¢‚±‚¢
+‚¢‚±‚¤
+‚¢‚±‚­
+‚¢‚²‚±‚¿
+‚¢‚±‚Â
+‚¢‚±‚ç‚¢‚´
+‚¢‚±‚ñ
+‚¢‚²‚ñ
+‚¢‚³‚¢
+‚¢‚³‚­
+‚¢‚³‚Ý
+‚¢‚³‚è‚Ñ
+‚¢‚³‚ñ
+‚¢‚µ
+‚¢‚¶
+‚¢‚µ‚¤‚·
+‚¢‚µ‚ª‚«
+‚¢‚µ‚«‚Ä‚«
+‚¢‚µ‚«‚Ó‚ß‚¢
+‚¢‚µ‚¸‚¦
+‚¢‚µ‚¾‚½‚Ý
+‚¢‚µ‚¾‚ñ
+‚¢‚µ‚Â
+‚¢‚µ‚΂¢
+‚¢‚µ‚΂µ
+‚¢‚¶‚Ð
+‚¢‚µ‚Ô‚Ý
+‚¢‚µ‚×
+‚¢‚µ‚á
+‚¢‚µ‚â
+‚¢‚µ‚á‚è‚傤
+‚¢‚µ‚ã
+‚¢‚µ‚イ
+‚¢‚¶‚ã‚Â
+‚¢‚µ‚å
+‚¢‚µ‚傤
+‚¢‚¶‚傤
+‚¢‚µ‚å‚­‚¶‚イ
+‚¢‚µ‚킽
+‚¢‚¶‚í‚é
+‚¢‚µ‚ñ
+‚¢‚¶‚ñ
+‚¢‚µ‚ñ‚Å‚ñ‚µ‚ñ
+‚¢‚·
+‚¢‚·‚½‚ñ‚Ô[‚é
+‚¢‚¸‚Ü‚¢
+‚¢‚¸‚Ý
+‚¢‚·‚炦‚é
+‚¢‚·‚ç‚Þ
+‚¢‚¸‚ê
+‚¢‚¹‚¢
+‚¢‚¹‚«
+‚¢‚¹‚Â
+‚¢‚¹‚ñ
+‚¢‚º‚ñ
+‚¢‚»
+‚¢‚»‚¤
+‚¢‚»‚¬‚ ‚µ
+‚¢‚»‚Á‚Õ
+‚¢‚»‚×
+‚¢‚¼‚ñ
+‚¢‚½
+‚¢‚½‚¢
+‚¢‚¾‚¢
+‚¢‚½‚ª‚Ë
+‚¢‚½‚ª‚ç‚·
+‚¢‚½‚µ‚©‚½
+‚¢‚½‚µ‚©‚䂵
+‚¢‚½‚¸‚ç‚Á‚±
+‚¢‚½‚¾‚«
+‚¢‚½‚Å
+‚¢‚½‚Ç‚è
+‚¢‚½‚΂³‚Ý
+‚¢‚½‚Ü‚¦
+‚¢‚½‚ß
+‚¢‚½‚è‚ ‚²
+‚¢‚½‚é
+‚¢‚½‚ñ
+‚¢‚½‚ñ‚¶
+‚¢‚¿‚¢
+‚¢‚¿‚¢‚ñ
+‚¢‚¿‚¦‚ñ
+‚¢‚¿‚ª‚©‚è
+‚¢‚¿‚ª‚Â
+‚¢‚¿‚©‚à‚­
+‚¢‚¿‚ª‚ñ
+‚¢‚¿‚®‚¤
+‚¢‚¿‚®‚ñ
+‚¢‚¿‚°‚¢
+‚¢‚¿‚°‚«
+‚¢‚¿‚°‚ñ
+‚¢‚¿‚°‚ñ‚±‚¶
+‚¢‚¿‚²
+‚¢‚¿‚¶
+‚¢‚¿‚¶‚«‚ñ
+‚¢‚¿‚¶‚Ä‚«
+‚¢‚¿‚¶‚å
+‚¢‚¿‚¶‚傤
+‚¢‚¿‚¶‚ñ
+‚¢‚¿‚¸
+‚¢‚¿‚¼‚ñ
+‚¢‚¿‚¾‚¢
+‚¢‚¿‚¾‚¢‚¶
+‚¢‚¿‚¾‚ñ
+‚¢‚¿‚Ç
+‚¢‚¿‚Ç‚¤
+‚¢‚¿‚È‚ñ
+‚¢‚¿‚É‚ñ‚Ü‚¦
+‚¢‚¿‚Ë‚ñ
+‚¢‚¿‚Ë‚ñ‚©‚ñ
+‚¢‚¿‚Ë‚ñ‚¹‚¢
+‚¢‚¿‚Ì‚Æ‚è
+‚¢‚¿‚Î
+‚¢‚¿‚΂ñ
+‚¢‚¿‚Ô‚µ‚¶‚イ
+‚¢‚¿‚Ô‚Ô‚ñ
+‚¢‚¿‚Ü‚¢
+‚¢‚¿‚Ü‚Â
+‚¢‚¿‚Ý
+‚¢‚¿‚Ý‚á‚­
+‚¢‚¿‚ß‚¢
+‚¢‚¿‚ß‚ñ‚µ‚«
+‚¢‚¿‚à‚¤‚³‚­
+‚¢‚¿‚à‚¤‚¾‚¶‚ñ
+‚¢‚¿‚à‚Â
+‚¢‚¿‚à‚ñ
+‚¢‚¿‚à‚ñ‚¢‚Á‚Æ‚¤
+‚¢‚¿‚à‚ñ‚¶
+‚¢‚¿‚イ
+‚¢‚¿‚å
+‚¢‚¿‚傤
+‚¢‚¿‚悤
+‚¢‚¿‚傤‚©
+‚¢‚¿‚ç‚ñ‚¹‚¢
+‚¢‚¿‚ç‚ñ‚Ђ傤
+‚¢‚¿‚è‚Â
+‚¢‚¿‚è‚イ
+‚¢‚¿‚è‚傤‚¶‚Â
+‚¢‚¿‚è‚ñ
+‚¢‚¿‚é
+‚¢‚¿‚é‚¢
+‚¢‚¿‚ê‚¢
+‚¢‚¿‚ê‚ñ
+‚¢‚¿‚ê‚ñ‚½‚­‚µ‚å
+‚¢‚¿‚ë
+‚¢‚¿‚í‚è
+‚¢‚Â
+‚¢‚‚¤
+‚¢‚Á‚©
+‚¢‚Á‚©‚¢
+‚¢‚Á‚©‚­
+‚¢‚Á‚©‚­‚¹‚ñ‚«‚ñ
+‚¢‚Á‚©‚°‚Â
+‚¢‚Á‚©‚¹‚¢
+‚¢‚Á‚©‚ñ
+‚¢‚Á‚«
+‚¢‚Á‚«‚å
+‚¢‚Á‚«‚å‚¢‚¿‚Ç‚¤
+‚¢‚Á‚«‚傤
+‚¢‚Á‚¯‚¢
+‚¢‚Á‚¯‚ñ
+‚¢‚Á‚±
+‚¢‚Á‚±‚¤
+‚¢‚Á‚±‚­‚¢‚¿‚¶‚å
+‚¢‚Á‚±‚¾‚Ä
+‚¢‚Á‚³‚¢
+‚¢‚‚´‚¢
+‚¢‚Á‚³‚­
+‚¢‚Á‚³‚­‚¶‚Â
+‚¢‚Á‚³‚­‚Ë‚ñ
+‚¢‚Á‚³‚ñ‚©‚½‚ñ‚»
+‚¢‚Á‚µ
+‚¢‚Á‚µ‚«
+‚¢‚Á‚µ‚á‚­
+‚¢‚Á‚µ‚Ⴙ‚ñ‚è
+‚¢‚Á‚µ‚ã
+‚¢‚Á‚µ‚イ
+‚¢‚Á‚µ‚イ‚«
+‚¢‚Á‚µ‚イ‚Ë‚ñ
+‚¢‚Á‚µ‚ã‚ñ
+‚¢‚Á‚µ‚å
+‚¢‚Á‚µ‚傤
+‚¢‚Á‚µ‚傤‚¯‚ñ‚ß
+‚¢‚Á‚µ‚å‚­‚»‚­‚Í
+‚¢‚Á‚µ‚ñ
+‚¢‚Á‚µ‚ñ‚¢‚Á‚½‚¢
+‚¢‚Á‚µ‚ñ‚¶‚傤
+‚¢‚Á‚µ‚ñ‚Ó‚ç‚ñ
+‚¢‚Á‚¹‚¢
+‚¢‚Á‚¹‚«
+‚¢‚Á‚¹‚«‚É‚¿‚傤
+‚¢‚Á‚¹‚ñ
+‚¢‚Á‚»
+‚¢‚Á‚»‚¤
+‚¢‚Á‚»‚­
+‚¢‚Á‚½‚¢
+‚¢‚Á‚½‚¢‚©‚ñ
+‚¢‚Á‚½‚ñ
+‚¢‚Á‚¿‚イ‚â
+‚¢‚Á‚¿‚傤
+‚¢‚Á‚¿‚傤‚¢‚Á‚¹
+‚¢‚Á‚¿‚å‚­‚¹‚ñ
+‚¢‚‚Â
+‚¢‚Á‚‚¢
+‚¢‚Á‚‚¤
+‚¢‚Á‚Ä‚Â
+‚¢‚Á‚Ä‚ñ
+‚¢‚Á‚Ä‚ñ‚΂è
+‚¢‚Á‚Æ
+‚¢‚Á‚Æ‚¤
+‚¢‚‚É
+‚¢‚Á‚Ï
+‚¢‚Á‚Ï‚­
+‚¢‚Á‚Ï‚ñ
+‚¢‚Á‚Ï‚ñ‚Ä‚«
+‚¢‚Á‚Ï‚ñ‚ë‚ñ
+‚¢‚Á‚Ò‚Â
+‚¢‚Á‚҂傤
+‚¢‚Á‚Ò‚ñ
+‚¢‚Á‚Õ‚½‚³‚¢
+‚¢‚Á‚Ø‚ñ
+‚¢‚Á‚Ø‚ñ‚Æ‚¤
+‚¢‚Á‚Û
+‚¢‚Á‚Û‚¤
+‚¢‚Á‚Û‚ñ
+‚¢‚‚à
+‚¢‚‚í
+‚¢‚Å‚¨‚났
+‚¢‚Ä‚ñ‚³‚«
+‚¢‚Å‚ñ‚µ
+‚¢‚Æ
+‚¢‚Ç
+‚¢‚Æ‚¤
+‚¢‚Ç‚¤‚¹‚¢
+‚¢‚Æ‚®‚¿
+‚¢‚Æ‚±
+‚¢‚Ç‚±‚ë
+‚¢‚Æ‚¼‚±
+‚¢‚ǂ΂½
+‚¢‚Æ‚Ü
+‚¢‚Æ‚ß
+‚¢‚È
+‚¢‚È‚¢
+‚¢‚È‚©
+‚¢‚È‚²
+‚¢‚È‚³‚­
+‚¢‚È‚¸‚Ü
+‚¢‚ȂÂÜ
+‚¢‚È‚Ñ‚©‚è
+‚¢‚È‚Ù
+‚¢‚È‚â
+‚¢‚È‚è
+‚¢‚È‚ñ
+‚¢‚É‚µ‚ ‚¿‚Ô
+‚¢‚É‚µ‚á‚é
+‚¢‚É‚ñ‚¶‚傤
+‚¢‚Ê
+‚¢‚Ê‚¢
+‚¢‚Ê‚«
+‚¢‚Ë
+‚¢‚Ì‚µ‚µ
+‚¢‚Ì‚¿‚ª‚¯
+‚¢‚Ì‚¿‚ÂÈ
+‚¢‚Ì‚¿‚Æ‚è
+‚¢‚Í‚¢
+‚¢‚΂µ‚å
+‚¢‚΂ç
+‚¢‚Í‚ñ‚µ‚á
+‚¢‚Ђ傤
+‚¢‚т傤
+‚¢‚Ђñ
+‚¢‚Ó‚¤
+‚¢‚Ô‚«
+‚¢‚Ó‚­
+‚¢‚Ô‚­‚ë
+‚¢‚Ô‚É‚ñ‚®
+‚¢‚Ô‚ñ
+‚¢‚Ô‚ñ‚µ
+‚¢‚Ö‚ñ
+‚¢‚ׂñ‚Æ
+‚¢‚Ú
+‚¢‚Ù‚¤
+‚¢‚Ù‚­
+‚¢‚Ù‚ñ
+‚¢‚Ü
+‚¢‚Ü‚¶‚Ë[‚µ‚å‚ñ
+‚¢‚Ü‚Ç‚«
+‚¢‚܂悤
+‚¢‚Ý‚µ‚ñ‚¿‚傤
+‚¢‚݂傤
+‚¢‚Þ
+‚¢‚Þ‚©
+‚¢‚ß‚¢
+‚¢‚à
+‚¢‚à‚¤‚Æ
+‚¢‚à‚Ì
+‚¢‚â‚­
+‚¢‚â‚­‚«‚ñ
+‚¢‚â‚­‚Ђñ
+‚¢‚₯
+‚¢‚â‚Ý
+‚¢‚â‚è‚ñ‚®
+‚¢‚䂤
+‚¢‚æ‚­
+‚¢‚ç‚¢‚µ‚å
+‚¢‚ç‚¢‚µ‚ñ
+‚¢‚ç‚¢‚É‚ñ
+‚¢‚ç‚­
+‚¢‚ç‚·‚Æ
+‚¢‚ç‚·‚Æ‚ê[‚µ‚å
+‚¢‚è‚ ‚¢
+‚¢‚è‚ ‚¢‚¯‚ñ
+‚¢‚肤‚Ý
+‚¢‚肦
+‚¢‚è‚®‚¿
+‚¢‚è‚Ð
+‚¢‚è‚Ó‚Ë
+‚¢‚è‚傤
+‚¢‚è‚悤
+‚¢‚è‚傤‚Ð
+‚¢‚è‚傤‚Ђñ
+‚¢‚è‚傤‚Ù‚¤‚¶‚ñ
+‚¢‚è‚å‚­
+‚¢‚é‚¢
+‚¢‚é‚·
+‚¢‚é‚Ý‚Ë[‚µ‚å‚ñ
+‚¢‚ê‚¢
+‚¢‚ê‚¢‚³‚¢
+‚¢‚ꂬ‚ã‚ç[
+‚¢‚ꂱ‚Ý
+‚¢‚ê‚¿‚ª‚¢
+‚¢‚ê‚Ô‚ñ
+‚¢‚ê‚à‚Ì
+‚¢‚ë
+‚¢‚ë‚ ‚¢
+‚¢‚ë‚¢‚ë
+‚¢‚낤
+‚¢‚낤‚©‚¢
+‚¢‚낪‚Ý
+‚¢‚낯
+‚¢‚낯‚µ
+‚¢‚낶‚ë
+‚¢‚ë‚‚â
+‚¢‚ë‚Ç‚è
+‚¢‚ë‚Í
+‚¢‚ë‚ñ
+‚¢‚í
+‚¢‚í‚ ‚È
+‚¢‚í‚¢
+‚¢‚í‚¢‚«‚ñ
+‚¢‚í‚¢‚²‚Æ
+‚¢‚킨
+‚¢‚í‚«
+‚¢‚킵
+‚¢‚킵‚Ý‚¸
+‚¢‚í‚Î
+‚¢‚í‚Í‚¾
+‚¢‚í‚ê
+‚¢‚ñ
+‚¢‚ñ‚¤‚Â
+‚¢‚ñ‚¦‚¢
+‚¢‚ñ‚ª
+‚¢‚ñ‚ª‚¢
+‚¢‚ñ‚ª‚µ
+‚¢‚ñ‚©‚ñ
+‚¢‚ñ‚©‚ñ‚µ‚傤‚ß
+‚¢‚ñ‚«
+‚¢‚ñ‚¬
+‚¢‚ñ‚«‚å‚­
+‚¢‚ñ‚¬‚ñ
+‚¢‚ñ‚­
+‚¢‚ñ‚®‚ç‚ñ‚Ç
+‚¢‚ñ‚®‚è‚Á‚µ‚ã
+‚¢‚ñ‚²
+‚¢‚ñ‚±‚¤
+‚¢‚ñ‚²‚¤
+‚¢‚ñ‚±‚¤‚©
+‚¢‚ñ‚´‚¢
+‚¢‚ñ‚³‚‚«
+‚¢‚ñ‚³‚‚µ‚å
+‚¢‚ñ‚³‚ñ
+‚¢‚ñ‚µ
+‚¢‚ñ‚¶‚¯[‚½
+‚¢‚ñ‚µ‚º‚¢
+‚¢‚ñ‚µ‚Â
+‚¢‚ñ‚µ‚イ
+‚¢‚ñ‚¶‚ã‚ñ
+‚¢‚ñ‚µ‚傤
+‚¢‚ñ‚µ‚傤‚Ä‚«
+‚¢‚ñ‚µ‚å‚­‚ª‚¢
+‚¢‚ñ‚µ‚å‚­‚º‚¢
+‚¢‚ñ‚µ‚å‚­‚Ä‚ñ
+‚¢‚ñ‚µ‚ñ
+‚¢‚ñ‚·‚¤
+‚¢‚ñ‚·‚½‚ñ‚·
+‚¢‚ñ‚·‚½‚ñ‚Æ
+‚¢‚ñ‚·‚Æ‚ç‚­‚½
+‚¢‚ñ‚·‚Ò‚ê[‚µ‚å
+‚¢‚ñ‚¹‚¢
+‚¢‚ñ‚º‚¢
+‚¢‚ñ‚¹‚«
+‚¢‚ñ‚¼‚­
+‚¢‚ñ‚»‚‚µ‚á
+‚¢‚ñ‚½[‚¿‚¥‚ñ‚¶
+‚¢‚ñ‚½[‚ñ
+‚¢‚ñ‚¾‚·‚Æ‚è‚ ‚é
+‚¢‚ñ‚¿
+‚¢‚ñ‚¿‚傤
+‚¢‚ñ‚Ä‚è
+‚¢‚ñ‚Ä‚è‚ 
+‚¢‚ñ‚Ă肶‚¥‚ñ‚·
+‚¢‚ñ‚Ä‚ñ
+‚¢‚ñ‚Ç
+‚¢‚ñ‚Æ‚¤
+‚¢‚ñ‚Ç‚¤
+‚¢‚ñ‚Ç‚µ‚È
+‚¢‚ñ‚Ƃ낾‚­‚µ‚å
+‚¢‚ñ‚È‚¢
+‚¢‚ñ‚É‚­
+‚¢‚ñ‚Ë‚ñ
+‚¢‚ñ‚Ï‚­‚Æ
+‚¢‚ñ‚΂ñ
+‚¢‚ñ‚Ó‚§‚ß[‚µ‚å
+‚¢‚ñ‚ӂ邦‚ñ‚´
+‚¢‚ñ‚Ó‚ê
+‚¢‚ñ‚Ó‚ê[‚µ‚å‚ñ
+‚¢‚ñ‚Ô‚ñ
+‚¢‚ñ‚Ú‚¤
+‚¢‚ñ‚Û[‚Æ
+‚¢‚ñ‚悤‚Ô‚ñ
+‚¢‚ñ‚ç‚ñ
+‚¢‚ñ‚è‚傤
+‚¢‚ñ‚è‚傤‚·‚¢
+‚¢‚ñ‚è‚å‚­
+‚¢‚ñ‚ê‚«
+‚¢‚ñ‚ê‚Á‚Æ
+ƒD
+‚£
+ƒE
+‚¤
+ƒ”
+‚¤‚¢
+‚¤‚¡[‚­
+‚¤‚¢[‚­
+‚¤‚¡[‚ñ
+‚¤‚¢‚´‚ñ
+‚¤‚¢‚·‚«[
+‚¤‚¢‚É‚ñ‚®
+‚¤‚¢‚é‚·
+‚¤‚¡‚ñ‚®
+‚¤‚¢‚ñ‚®
+‚¤‚¢‚ñ‚½
+‚¤‚¡‚ñ‚Ç
+‚¤‚¢‚ñ‚Ç
+‚¤‚¡‚ñ‚Ç‚¤
+‚¤[‚Ü‚ñ
+‚¤[‚é
+‚¤[‚ë‚ñ
+‚¤‚¦
+‚¤‚¥‚ 
+‚¤‚¥‚¢
+‚¤‚¥‚¢‚Æ
+‚¤‚¦[‚Æ
+‚¤‚¦[‚Æ‚ê‚·
+‚¤‚¦‚«
+‚¤‚¦‚³‚Ü
+‚¤‚¦‚·‚½‚ñ
+‚¤‚¦‚·‚Æ
+‚¤‚¦‚Å‚¡‚ñ‚®
+‚¤‚¨
+‚¤‚¨‚¢‚¿‚Î
+‚¤‚§[
+‚¤‚¨‚ª‚µ
+‚¤‚¨‚Á‚¿
+‚¤‚©‚¢
+‚¤‚©‚Â
+‚¤‚«
+‚¤‚«‚­‚³
+‚¤‚«‚®‚à
+‚¤‚«‚È
+‚¤‚«‚Ô‚­‚ë
+‚¤‚«‚Ú‚è
+‚¤‚«‚Ý
+‚¤‚«‚悦
+‚¤‚®‚¢‚·
+‚¤‚­‚ç‚¢‚È
+‚¤‚¯
+‚¤‚¯‚¢‚ê
+‚¤‚¯‚´‚ç
+‚¤‚¯‚µ‚å
+‚¤‚¯‚Ä
+‚¤‚¯‚Æ‚è
+‚¤‚¯‚Æ‚è‚É‚ñ
+‚¤‚¯‚É‚ñ
+‚¤‚¯‚Ý
+‚¤‚¯‚à‚¿
+‚¤‚°‚ñ
+‚¤‚³‚¬
+‚¤‚³‚ñ
+‚¤‚µ
+‚¤‚¶
+‚¤‚µ‚¨
+‚¤‚¶‚±
+‚¤‚¶‚·‚¶‚傤
+‚¤‚µ‚ë‚ ‚µ
+‚¤‚µ‚ë‚·‚ª‚½
+‚¤‚µ‚낾‚Ä
+‚¤‚µ‚ë‚Å
+‚¤‚µ‚ë‚Þ‚«
+‚¤‚·
+‚¤‚¸
+‚¤‚·‚ª‚½
+‚¤‚·‚©‚í
+‚¤‚·‚­‚¿
+‚¤‚·‚®‚à‚è
+‚¤‚·‚¶
+‚¤‚·‚¶‚¨
+‚¤‚¸‚µ‚¨
+‚¤‚·‚Å
+‚¤‚·‚Î
+‚¤‚·‚Ñ
+‚¤‚¸‚Ü‚«
+‚¤‚·‚Ü‚­
+‚¤‚·‚ß
+‚¤‚·‚à‚Ì
+‚¤‚»‚­
+‚¤‚½
+‚¤‚½‚¢
+‚¤‚½‚°
+‚¤‚½‚²‚¦
+‚¤‚¿
+‚¤‚¿‚¤‚¿
+‚¤‚¿‚¤‚ç
+‚¤‚¿‚©‚¯
+‚¤‚¿‚ª‚í
+‚¤‚¿‚«
+‚¤‚¿‚«‚¸
+‚¤‚¿‚«‚ñ
+‚¤‚¿‚Å‚µ
+‚¤‚¿‚Ú‚è
+‚¤‚¿‚Ü‚­
+‚¤‚¿‚Ü‚²
+‚¤‚¿‚Ü‚½
+‚¤‚¿‚Ý
+‚¤‚¿‚ä
+‚¤‚¿‚イ
+‚¤‚¿‚傤‚Ä‚ñ
+‚¤‚¿‚í
+‚¤‚¿‚킯
+‚¤‚¿‚킯‚µ‚å
+‚¤‚Â
+‚¤‚«
+‚¤‚Á‚½‚¦
+‚¤‚‚Ú
+‚¤‚‚肬
+‚¤‚‚í
+‚¤‚Å
+‚¤‚Å‚«‚«
+‚¤‚Å‚Ç‚¯‚¢
+‚¤‚Å‚Ü‚¦
+‚¤‚Ä‚ñ
+‚¤‚Æ‚­
+‚¤‚Ç‚ñ
+‚¤‚Ç‚ñ‚°
+‚¤‚È‚¬
+‚¤‚È‚¬‚Ì‚Ú‚è
+‚¤‚È‚¶
+‚¤‚É
+‚¤‚Ë
+‚¤‚Ë‚Ñ
+‚¤‚Ì‚Ý
+‚¤‚Í
+‚¤‚Î
+‚¤‚Ô
+‚¤‚Ô‚²‚¦
+‚¤‚Ô‚ä
+‚¤‚Ö‚ñ
+‚¤‚Ù‚¤
+‚¤‚Ü
+‚¤‚Ü‚©‚½
+‚¤‚Ü‚²‚â
+‚¤‚Ü‚â
+‚¤‚Ü‚ê
+‚¤‚Ü‚ê‚‚«
+‚¤‚Ý
+‚¤‚Ý‚¹‚ñ‚â‚Ü‚¹‚ñ
+‚¤‚Ý‚¼‚¢
+‚¤‚Ý‚Ì‚¨‚â
+‚¤‚Þ
+‚¤‚ß
+‚¤‚ß‚µ‚ã
+‚¤‚ß‚¸
+‚¤‚ß‚½‚Ä‚¿
+‚¤‚ß‚Ú‚µ
+‚¤‚à‚¤
+‚¤‚æ‚­
+‚¤‚ç
+‚¤‚炨‚à‚Ä
+‚¤‚炪‚«‚É‚ñ
+‚¤‚ç‚©‚½
+‚¤‚炪‚Ë
+‚¤‚炪‚í
+‚¤‚炳‚­
+‚¤‚炶
+‚¤‚ç‚Ä
+‚¤‚ç‚Ç‚¨‚è
+‚¤‚ç‚È‚¢
+‚¤‚ç‚É‚¤‚Þ
+‚¤‚ç‚Í‚ç
+‚¤‚ç‚Ú‚ñ
+‚¤‚ç‚Ú‚ñ‚¦
+‚¤‚ç‚Ü‚¿
+‚¤‚ç‚Ý
+‚¤‚ç‚Ý‚¿
+‚¤‚ç‚ß
+‚¤‚ç‚à‚ñ
+‚¤‚ç‚ñ
+‚¤‚è
+‚¤‚è‚ ‚°
+‚¤‚è‚ ‚°‚«‚ñ
+‚¤‚è‚ ‚°‚¾‚©
+‚¤‚è‚¢‚¦
+‚¤‚è‚©‚¯
+‚¤‚è‚­‚¿
+‚¤‚肱
+‚¤‚肱‚Ý
+‚¤‚肾‚µ
+‚¤‚è‚Ä
+‚¤‚è‚Ê‚µ
+‚¤‚è‚Ë
+‚¤‚è‚à‚Ì
+‚¤‚è‚傤
+‚¤‚邤
+‚¤‚邤‚«
+‚¤‚邤‚Ç‚µ
+‚¤‚é‚®‚ ‚¢
+‚¤‚邵
+‚¤‚ê‚¢
+‚¤‚ê‚­‚¿
+‚¤‚ê‚Á‚±
+‚¤‚ê‚Ì‚±‚è
+‚¤‚ê‚ä‚«
+‚¤‚ë
+‚¤‚낱
+‚¤‚í‚«
+‚¤‚킬
+‚¤‚í‚®‚·‚è
+‚¤‚í‚®‚Â
+‚¤‚킵‚«
+‚¤‚킸‚Ý
+‚¤‚í‚Ä
+‚¤‚í‚΂«
+‚¤‚í‚×
+‚¤‚í‚Ü‚¦
+‚¤‚í‚Þ‚«
+‚¤‚í‚ß
+‚¤‚í‚â
+‚¤‚í‚â‚­
+‚¤‚ñ
+‚¤‚ñ‚©
+‚¤‚ñ‚ª
+‚¤‚ñ‚©‚¢
+‚¤‚ñ‚¹‚¢
+‚¤‚ñ‚»‚¤‚¬‚傤
+‚¤‚ñ‚»‚¤‚Ð
+‚¤‚ñ‚¿‚­
+‚¤‚ñ‚¿‚ñ
+‚¤‚ñ‚Å‚¢
+‚¤‚ñ‚Ä‚ñ‚µ
+‚¤‚ñ‚Ä‚ñ‚µ‚ã
+‚¤‚ñ‚Ç‚¤‚©
+‚¤‚ñ‚Ç‚¤‚©‚¢
+‚¤‚ñ‚Ç‚¤‚¶‚傤
+‚¤‚ñ‚Ï‚ñ‚«
+‚¤‚ñ‚Ï‚ñ‚®
+‚¤‚ñ‚Ò‚Â
+‚¤‚ñ‚ß‚¢
+‚¤‚ñ‚à
+‚¤‚ñ‚ä
+‚¤‚ñ‚䂵‚傤
+‚¤‚ñ‚䂾‚¢‚¶‚ñ
+‚¤‚ñ‚è‚傤
+ƒF
+‚¥
+ƒG
+‚¦
+‚¦
+‚¦‚ 
+‚¦‚ ‚±‚ñ
+‚¦‚ ‚Û[‚Æ
+‚¦‚¢
+‚¦‚¢‚¢
+‚¦‚¢‚¦‚ñ
+‚¦‚¢‚ª
+‚¦‚¢‚©‚¢‚í
+‚¦‚¢‚ª‚©‚ñ
+‚¦‚¢‚©‚­
+‚¦‚¢‚«
+‚¦‚¢‚¬
+‚¦‚¢‚«‚イ
+‚¦‚¢‚«‚イ‚µ
+‚¦‚¢‚«‚イ‚Ä‚«
+‚¦‚¢‚¬‚傤
+‚¦‚¢‚¬‚傤‚©
+‚¦‚¢‚¬‚傤‚ª‚©‚è
+‚¦‚¢‚¬‚傤‚«‚å‚­
+‚¦‚¢‚¬‚傤‚µ‚å
+‚¦‚¢‚¬‚傤‚µ‚å‚¿
+‚¦‚¢‚¬‚傤‚¿‚イ
+‚¦‚¢‚¬‚傤‚Ð
+‚¦‚¢‚¬‚傤‚Ñ
+‚¦‚¢‚«‚傤‚è‚å‚­
+‚¦‚¢‚±
+‚¦‚¢‚²
+‚¦‚¢‚±‚¤
+‚¦‚¢‚±‚­
+‚¦‚¢‚±‚¹‚¢‚·‚¢
+‚¦‚¢‚³‚¢
+‚¦‚¢‚¶
+‚¦‚¢‚µ‚á
+‚¦‚¢‚µ‚á‚«
+‚¦‚¢‚¹‚¢
+‚¦‚¢‚¹‚¢‚©
+‚¦‚¢‚¹‚¢‚«‚å‚­
+‚¦‚¢‚¹‚¢‚Ä‚«
+‚¦‚¢‚¹‚¢‚Ù‚¤‚»‚¤
+‚¦‚¢‚¼‚¤
+‚¦‚¢‚¼‚¤‚Ô‚Â
+‚¦‚¢‚½‚¢
+‚¦‚¢‚¾‚ñ
+‚¦‚¢‚¿
+‚¦‚¢‚Ä‚ñ
+‚¦‚¢‚É‚¿
+‚¦‚¢‚Ë‚ñ
+‚¦‚¢‚Ì‚¤
+‚¦‚¢‚Ñ‚ñ
+‚¦‚¢‚Ó‚Â
+‚¦‚¢‚Ô‚ñ
+‚¦‚¢‚Ô‚ñ‚©
+‚¦‚¢‚Ö‚¢
+‚¦‚¢‚ׂ¢
+‚¦‚¢‚ׂ¢‚©
+‚¦‚¢‚Ù‚ñ
+‚¦‚¢‚ß‚¢
+‚¦‚¢‚䂤
+‚¦‚¢‚æ
+‚¦‚¢‚悤‚©
+‚¦‚¢‚悤‚µ
+‚¦‚¢‚悤‚µ‚Á‚¿‚å
+‚¦‚¢‚悤‚»
+‚¦‚¢‚è
+‚¦‚¢‚è‚ñ
+‚¦‚¢‚è‚ñ‚«‚å‚­
+‚¦‚¢‚ê‚¢
+‚¦‚¢‚í
+‚¦‚¢‚킶‚Ä‚ñ
+‚¦‚¦
+‚¦[
+‚¦[‚¶
+‚¦[‚¶‚¥‚ñ‚µ[
+‚¦[‚·
+‚¦[‚Õ‚è‚é
+‚¦[‚é‚¢
+‚¦‚ª‚¨
+‚¦‚ª‚ç
+‚¦‚«
+‚¦‚«‚¢‚ñ
+‚¦‚«‚´‚¢
+‚¦‚«‚µ‚á
+‚¦‚«‚µ‚傤
+‚¦‚«‚¶‚傤
+‚¦‚«‚·‚Æ‚ç
+‚¦‚«‚·‚Ï[‚Æ
+‚¦‚«‚¼‚¿‚Á‚­
+‚¦‚«‚¿‚イ
+‚¦‚«‚¿‚傤
+‚¦‚«‚Å‚ñ
+‚¦‚«‚т傤
+‚¦‚«‚ׂñ
+‚¦‚«‚Ü‚¦
+‚¦‚«‚Ü‚¦‚Ç‚¨‚è
+‚¦‚«‚è
+‚¦‚­‚ ‚Ç‚é
+‚¦‚­‚·‚Õ‚ê‚·
+‚¦‚®‚º‚­‚Ä‚¡‚Ô
+‚¦‚±[
+‚¦‚±‚Ì‚Ý[
+‚¦‚±‚Ì‚Ý‚·‚Æ
+‚¦‚±‚낶[
+‚¦‚³
+‚¦‚µ‚«
+‚¦‚¶‚«
+‚¦‚¶‚»‚ñ
+‚¦‚·
+‚¦‚¸
+‚¦‚·‚«‚à[
+‚¦‚·‚Ä‚é
+‚¦‚»
+‚¦‚¾
+‚¦‚½‚¢
+‚¦‚½‚Ì[‚é
+‚¦‚¾‚Í
+‚¦‚¾‚Ü‚ß
+‚¦‚¾‚Ý‚¿
+‚¦‚¿‚¨‚Ò‚ 
+‚¦‚¿‚¯‚Á‚Æ
+‚¦‚¿‚¸
+‚¦‚¿‚é
+‚¦‚¿‚ê‚ñ
+‚¦‚Á‚­‚·‚¹‚ñ
+‚¦‚Á‚¯‚ñ
+‚¦‚Á‚¶
+‚¦‚Á‚¹‚¢
+‚¦‚Á‚¹‚ñ‚·
+‚¦‚Á‚¿‚á‚ñ
+‚¦‚‚炭
+‚¦‚Å‚¡‚½
+‚¦‚Å‚¡‚Á‚Æ
+‚¦‚Ä‚©‚Á‚Ä
+‚¦‚Æ
+‚¦‚Ç
+‚¦‚Ç‚Á‚±
+‚¦‚È‚ß‚é
+‚¦‚É‚Á‚«
+‚¦‚Ê
+‚¦‚˂邬
+‚¦‚˂邬[
+‚¦‚Ì‚«
+‚¦‚Ì‚®
+‚¦‚Í‚ª‚«
+‚¦‚Ñ‚·
+‚¦‚Ò‚»[‚Ç
+‚¦‚Ò‚ë[‚®
+‚¦‚Ó
+‚¦‚Õ‚µ‚ë‚ñ
+‚¦‚Õ‚ë‚ñ
+‚¦‚ׂꂷ‚Æ
+‚¦‚Ù‚ñ
+‚¦‚Ü
+‚¦‚Ü‚«
+‚¦‚Ü‚«‚à‚Ì
+‚¦‚Ý‚ã‚ê[‚µ‚å‚ñ
+‚¦‚Ý‚ã‚ê[‚½
+‚¦‚Þ
+‚¦‚à‚Ì
+‚¦‚è
+‚¦‚è‚ ‚µ
+‚¦‚è[‚Æ
+‚¦‚è‚­‚Ñ
+‚¦‚è‚Ü‚«
+‚¦‚è‚à‚Æ
+‚¦‚ꂪ‚ñ‚Æ
+‚¦‚ê‚­‚Æ‚è‚Á‚­
+‚¦‚ê‚­‚Æ‚ë
+‚¦‚ê‚­‚Æ‚ë‚É‚­‚·
+‚¦‚ê‚×[‚½
+‚¦‚ë
+‚¦‚ñ
+‚¦‚ñ‚©
+‚¦‚ñ‚©‚¢
+‚¦‚ñ‚ª‚¢
+‚¦‚ñ‚©‚­
+‚¦‚ñ‚©‚­‚¿
+‚¦‚ñ‚©‚Â
+‚¦‚ñ‚ª‚í
+‚¦‚ñ‚ª‚ñ
+‚¦‚ñ‚«
+‚¦‚ñ‚¬
+‚¦‚ñ‚«‚å‚­
+‚¦‚ñ‚«‚å‚è
+‚¦‚ñ‚¬‚è‚å‚­
+‚¦‚ñ‚«‚ñ
+‚¦‚ñ‚®‚ñ
+‚¦‚ñ‚¯‚¢
+‚¦‚ñ‚°‚¢
+‚¦‚ñ‚°[‚¶
+‚¦‚ñ‚°‚«
+‚¦‚ñ‚°‚邯‚¢‚·‚¤
+‚¦‚ñ‚±
+‚¦‚ñ‚±‚ñ
+‚¦‚ñ‚´‚¢
+‚¦‚ñ‚³‚¢‚­‚ë‚Ø‚Å
+‚¦‚ñ‚³‚ñ
+‚¦‚ñ‚´‚ñ‚µ
+‚¦‚ñ‚µ
+‚¦‚ñ‚¶
+‚¦‚ñ‚¶‚É‚ 
+‚¦‚ñ‚¶‚É‚ ‚è‚ñ‚®
+‚¦‚ñ‚¶‚á
+‚¦‚ñ‚µ‚イ
+‚¦‚ñ‚µ‚イ‚è‚Â
+‚¦‚ñ‚µ‚ã‚‚©
+‚¦‚ñ‚µ‚å
+‚¦‚ñ‚¶‚傪‚­
+‚¦‚ñ‚µ‚ñ
+‚¦‚ñ‚¶‚ñ
+‚¦‚ñ‚µ‚ñ‚è‚å‚­
+‚¦‚ñ‚·‚¢
+‚¦‚ñ‚¹‚¢
+‚¦‚ñ‚¹‚«
+‚¦‚ñ‚¹‚ñ
+‚¦‚ñ‚»
+‚¦‚ñ‚»‚¤‚©
+‚¦‚ñ‚»‚¤‚©‚¢
+‚¦‚ñ‚»‚¤‚µ‚á
+‚¦‚ñ‚»‚­
+‚¦‚ñ‚½[‚Ä‚¢‚È[
+‚¦‚ñ‚¾‚©
+‚¦‚ñ‚½‚­
+‚¦‚ñ‚¾‚Ä
+‚¦‚ñ‚¾‚ñ
+‚¦‚ñ‚¿‚Ä‚ñ
+‚¦‚ñ‚¿‚イ
+‚¦‚ñ‚¿‚傤
+‚¦‚ñ‚Ä‚ñ
+‚¦‚ñ‚Å‚ñ
+‚¦‚ñ‚Ä‚ñ‚©
+‚¦‚ñ‚Ä‚ñ‚©‚‚¾‚Â
+‚¦‚ñ‚Ç
+‚¦‚ñ‚Æ‚¤
+‚¦‚ñ‚Ç‚¤
+‚¦‚ñ‚Æ‚Â
+‚¦‚ñ‚Æ‚ç‚ñ‚·
+‚¦‚ñ‚Æ‚è[
+‚¦‚ñ‚É‚¿
+‚¦‚ñ‚Ë‚Â
+‚¦‚ñ‚΂ñ
+‚¦‚ñ‚Ò‚Â
+‚¦‚ñ‚Ô‚«‚å‚­
+‚¦‚ñ‚Ô‚¶‚傤
+‚¦‚ñ‚Ô‚ñ
+‚¦‚ñ‚Ø‚¢
+‚¦‚ñ‚Ø‚ñ
+‚¦‚ñ‚Ú‚¤
+‚¦‚ñ‚Û‚¤
+‚¦‚ñ‚Ü‚ñ
+‚¦‚ñ‚Þ
+‚¦‚ñ‚Þ‚·‚Ñ
+‚¦‚ñ‚ß‚¢
+‚¦‚ñ‚â‚·
+‚¦‚ñ‚䂤‚©‚¢
+‚¦‚ñ‚悤
+‚¦‚ñ‚é‚¢
+‚¦‚ñ‚ë
+ƒH
+‚§
+ƒI
+‚¨
+‚¨
+‚¨‚ ‚µ‚·
+‚¨‚ ‚炽‚ß
+‚¨‚¢
+‚¨‚¢‚¤‚¿
+‚¨‚¢‚±‚Ý
+‚¨‚¢‚³‚«
+‚¨‚¢‚»‚ª‚µ‚¢
+‚¨‚¢‚½‚¿
+‚¨‚¢‚Å
+‚¨‚¢‚Ü‚Â
+‚¨‚¢‚ß
+‚¨‚¢‚킯
+‚¨‚¤
+‚¨‚¤‚¢
+‚¨‚¤‚©
+‚¨‚¤‚©‚­‚Ü‚­
+‚¨‚¤‚©‚ñ
+‚¨‚¤‚¬
+‚¨‚¤‚¯
+‚¨‚¤‚±‚¤
+‚¨‚¤‚±‚­
+‚¨‚¤‚²‚ñ
+‚¨‚¤‚´
+‚¨‚¤‚¶
+‚¨‚¤‚µ‚Â
+‚¨‚¤‚¶‚ã
+‚¨‚¤‚µ‚イ
+‚¨‚¤‚¶‚å
+‚¨‚¤‚µ‚傤
+‚¨‚¤‚µ‚å‚­
+‚¨‚¤‚µ‚ñ
+‚¨‚¤‚¶‚ñ
+‚¨‚¤‚¹‚‚µ‚Â
+‚¨‚¤‚¹‚‚Ü
+‚¨‚¤‚¹‚ñ
+‚¨‚¤‚¼‚­
+‚¨‚¤‚½‚¢
+‚¨‚¤‚¾‚ñ
+‚¨‚¤‚¾‚ñ‚Ù‚Ç‚¤
+‚¨‚¤‚¿‚傤
+‚¨‚¤‚Ä
+‚¨‚¤‚Æ‚¤
+‚¨‚¤‚Ç‚¤
+‚¨‚¤‚Æ‚Â
+‚¨‚¤‚Ë‚ñ
+‚¨‚¤‚Í‚ñ
+‚¨‚¤‚Ó‚¤
+‚¨‚¤‚Ô‚ñ
+‚¨‚¤‚Ö‚¢
+‚¨‚¤‚ׂ¢
+‚¨‚¤‚Ú‚¤
+‚¨‚¤‚Ú‚µ‚á
+‚¨‚¤‚Þ
+‚¨‚¤‚ß‚ñ‚«‚傤
+‚¨‚¤‚悤
+‚¨‚¤‚悤‚è‚å‚­
+‚¨‚¤‚è‚å‚­
+‚¨‚¤‚è‚ñ
+‚¨‚¤‚ê‚ñ‚¸
+‚¨‚¤‚ë
+‚¨‚¨‚ ‚´
+‚¨‚¨‚ ‚½‚è
+‚¨‚¨‚ ‚È
+‚¨‚¨‚ ‚ß
+‚¨‚¨‚¢‚¯
+‚¨‚¨‚¢‚µ
+‚¨‚¨‚¢‚»‚¬
+‚¨‚¨‚¤‚肾‚µ
+‚¨‚¨‚¨‚­
+‚¨‚¨‚©‚º
+‚¨‚¨‚©‚½
+‚¨‚¨‚ª‚½
+‚¨‚¨‚ª‚½‚«
+‚¨‚¨‚ª‚½‚µ‚á
+‚¨‚¨‚ª‚ç
+‚¨‚¨‚©‚í
+‚¨‚¨‚­
+‚¨[‚­
+‚¨‚¨‚­‚¿
+‚¨‚¨‚®‚¿
+‚¨‚¨‚­‚ç
+‚¨‚¨‚­‚炾‚¢‚¶‚ñ
+‚¨‚¨‚­‚ë
+‚¨[‚¯‚·‚Æ‚ç
+‚¨‚¨‚²‚¦
+‚¨‚¨‚¶
+‚¨‚¨‚µ‚¨
+‚¨‚¨‚µ‚©
+‚¨‚¨‚·‚¶
+‚¨[‚·‚Æ‚è‚ 
+‚¨‚¨‚¸‚à‚¤
+‚¨‚¨‚¹
+‚¨‚¨‚º‚¢
+‚¨‚¨‚º‚«
+‚¨[‚»‚Ç‚Á‚­‚·
+‚¨‚¨‚¾‚¢
+‚¨‚¨‚½‚«
+‚¨‚¨‚Âß
+‚¨‚¨‚Ä
+‚¨[‚Å‚¡‚¨
+‚¨[‚Å‚¡‚µ‚å‚ñ
+‚¨[‚Æ
+‚¨‚¨‚Ç‚¨‚è
+‚¨[‚Ƃ΂¢
+‚¨[‚Æ‚Ü
+‚¨[‚Æ‚ß[‚µ‚å‚ñ
+‚¨‚¨‚Æ‚è
+‚¨‚¨‚Æ‚è‚¢
+‚¨[‚È[
+‚¨‚¨‚Í‚µ
+‚¨‚¨‚Í‚Î
+‚¨‚¨‚Í‚Ü
+‚¨‚¨‚Í‚ç‚¢
+‚¨‚¨‚΂ñ
+‚¨‚¨‚Ñ‚¯
+‚¨‚¨‚Ђë‚Ü
+‚¨[‚Ô‚ñ
+‚¨‚¨‚ׂâ
+‚¨‚¨‚Ü
+‚¨‚¨‚Ü‚ª‚è
+‚¨‚¨‚Ü‚½
+‚¨‚¨‚Ý‚¸
+‚¨‚¨‚Ý‚»‚©
+‚¨‚¨‚Þ‚¬
+‚¨‚¨‚ß
+‚¨‚¨‚à‚¶
+‚¨‚¨‚à‚Æ
+‚¨‚¨‚à‚Ì
+‚¨‚¨‚à‚è
+‚¨‚¨‚â
+‚¨‚¨‚â‚Ü
+‚¨‚¨‚ä‚«
+‚¨‚¨‚æ‚»
+‚¨[‚é
+‚¨[‚é‚Ç
+‚¨[‚ë‚ç
+‚¨‚¨‚í‚´
+‚¨‚©‚ ‚³‚Ü
+‚¨‚©‚ ‚³‚ñ
+‚¨‚©‚ ‚¿‚á‚ñ
+‚¨‚©‚°
+‚¨‚©‚°‚³‚Ü
+‚¨‚©‚°‚ñ
+‚¨‚©‚µ‚ç‚‚«
+‚¨‚©‚Á‚Ä
+‚¨‚©‚Ç‚¿‚ª‚¢
+‚¨‚©‚Ë
+‚¨‚ª‚í
+‚¨‚©‚í‚è
+‚¨‚©‚ñ
+‚¨‚«
+‚¨‚«‚ ‚¢
+‚¨‚«‚Ç‚¯‚¢
+‚¨‚«‚È
+‚¨‚«‚È‚©‚µ
+‚¨‚«‚É‚¢‚è
+‚¨‚«‚Î
+‚¨‚«‚à‚¿
+‚¨‚«‚â
+‚¨‚«‚á‚­
+‚¨‚«‚á‚­‚³‚Ü
+‚¨‚­
+‚¨‚­‚ª‚¢
+‚¨‚­‚ª‚½
+‚¨‚­‚¬
+‚¨‚­‚³‚Ü
+‚¨‚­‚¶‚傤
+‚¨‚­‚¹‚Â
+‚¨‚­‚»‚±
+‚¨‚­‚½[‚Ô
+‚¨‚­‚¿
+‚¨‚­‚¿‚傤
+‚¨‚­‚Ä
+‚¨‚­‚È‚¢
+‚¨‚­‚É
+‚¨‚­‚Ì‚Ä
+‚¨‚­‚Î
+‚¨‚­‚т傤
+‚¨‚­‚ß‚ñ
+‚¨‚­‚â‚Ý
+‚¨‚­‚ä‚«
+‚¨‚®‚ç
+‚¨‚­‚肪‚È
+‚¨‚­‚肳‚«
+‚¨‚­‚肶‚傤
+‚¨‚­‚è‚Ê‚µ
+‚¨‚±‚¤‚Å‚ñ
+‚¨‚±‚³‚Ü
+‚¨‚±‚³‚ñ
+‚¨‚±‚µ
+‚¨‚³
+‚¨‚³‚È‚²
+‚¨‚³‚È‚²‚±‚ë
+‚¨‚¶
+‚¨‚µ‚ ‚킹
+‚¨‚¶‚¢‚³‚ñ
+‚¨‚µ‚¢‚ê
+‚¨‚µ‚¦
+‚¨‚µ‚¦‚²
+‚¨‚µ‚°
+‚¨‚µ‚×
+‚¨‚µ‚á‚ê
+‚¨‚µ‚傤
+‚¨‚¶‚傤‚³‚Ü
+‚¨‚¶‚å‚­
+‚¨‚µ‚ë‚¢
+‚¨‚·
+‚¨‚·‚©[
+‚¨‚·‚²‚µ
+‚¨‚·‚Ü‚¢
+‚¨‚·‚Ý
+‚¨‚¹‚¢‚Ú
+‚¨‚¹‚Á‚©‚¢
+‚¨‚»‚­
+‚¨‚»‚¶‚à
+‚¨‚»‚Å
+‚¨‚»‚΂ñ
+‚¨‚»‚Ü‚«
+‚¨‚»‚ê
+‚¨‚½‚ª‚¢
+‚¨‚¾‚­
+‚¨‚½‚Á‚µ
+‚¨‚¿‚±‚Ý
+‚¨‚¿‚Ç
+‚¨‚¿‚Î
+‚¨‚¿‚Ú
+‚¨‚¿‚á
+‚¨‚¿‚イ‚°‚ñ
+‚¨‚Á‚­‚¤
+‚¨‚‚µ‚ã
+‚¨‚Á‚¿‚á‚ñ
+‚¨‚Á‚Ä‚ª‚«
+‚¨‚Á‚Æ
+‚¨‚Ä‚ ‚°
+‚¨‚Å‚¢
+‚¨‚Ä‚·‚¤
+‚¨‚Ä‚Ù‚ñ
+‚¨‚Ä‚Ü
+‚¨‚Ä‚Ü‚¦
+‚¨‚Ä‚ñ
+‚¨‚Æ
+‚¨‚Æ‚¤‚³‚Ü
+‚¨‚Æ‚¤‚¿‚á‚ñ
+‚¨‚Æ‚¤‚Æ
+‚¨‚Æ‚­‚¢
+‚¨‚Æ‚±
+‚¨‚Æ‚±‚Å
+‚¨‚Æ‚±‚Ì‚±
+‚¨‚Æ‚±‚à‚Ì
+‚¨‚Æ‚µ‚ ‚È
+‚¨‚Æ‚µ‚¾‚Ü
+‚¨‚Æ‚µ‚Ê‚µ
+‚¨‚Æ‚Æ‚¢
+‚¨‚Æ‚Æ‚µ
+‚¨‚Æ‚È
+‚¨‚Æ‚ß
+‚¨‚Ç‚è‚Î
+‚¨‚Æ‚è‚Í‚©‚ç‚¢
+‚¨‚È‚ª
+‚¨‚È‚¶
+‚¨‚È‚¶‚Ý
+‚¨‚È‚Ü‚¦
+‚¨‚É
+‚¨‚É‚¢‚¿‚á‚ñ
+‚¨‚É‚ª‚í‚ç
+‚¨‚É‚Ñ
+‚¨‚Ë
+‚¨‚Ë‚¦‚³‚ñ
+‚¨‚Ë‚¦‚¿‚á‚ñ
+‚¨‚Ì
+‚¨‚Ì‚ê
+‚¨‚Î
+‚¨‚΂ ‚³‚ñ
+‚¨‚΂È
+‚¨‚͂悤
+‚¨‚Í‚ç‚¢‚΂±
+‚¨‚Ñ
+‚¨‚Ñ‚¶‚ß
+‚¨‚Ñ‚¶‚傤
+‚¨‚Ñ‚Ç‚ß
+‚¨‚ЂƂ悵
+‚¨‚Ñ‚Ó‚¤
+‚¨‚Ó‚¡‚µ‚á‚é
+‚¨‚Ó‚¡‚·
+‚¨‚Ó‚³‚¢‚Ç
+‚¨‚Ô‚¶‚¥
+‚¨‚Ô‚¶‚¥‚­‚Æ
+‚¨‚Õ‚µ‚å‚ñ
+‚¨‚Ó‚¹‚Á‚Æ
+‚¨‚Ô‚Â
+‚¨‚Õ‚Ä‚¡‚Ü‚¢‚¸
+‚¨‚Ø‚ç
+‚¨‚Ø‚ê[‚µ‚å‚ñ
+‚¨‚Ø‚ê[‚½
+‚¨‚Ø‚ê[‚Ä‚¡‚ñ‚®
+‚¨‚Ú‚¦‚ª‚«
+‚¨‚Ù[‚‚­
+‚¨‚Ú‚µ‚ß‚µ
+‚¨‚Ü‚¦
+‚¨‚Ü‚²‚³‚ñ
+‚¨‚Ü‚í‚肳‚ñ
+‚¨‚Ý‚¨‚‚¯
+‚¨‚Ý‚«
+‚¨‚Ý‚­‚ë‚ñ
+‚¨‚Þ‚·‚Ñ
+‚¨‚ß‚¢
+‚¨‚ß‚¢‚µ
+‚¨‚ß‚ª
+‚¨‚à‚¢‚«‚è
+‚¨‚à‚¢‚Å
+‚¨‚à‚¢‚Ç‚¨‚è
+‚¨‚à‚¢‚Ì‚Ù‚©
+‚¨‚à‚©‚¶
+‚¨‚à‚µ‚ë
+‚¨‚à‚¿‚á
+‚¨‚à‚Ä
+‚¨‚à‚Ä‚ª‚í
+‚¨‚à‚Ä‚®‚¿
+‚¨‚à‚Ä‚°‚¢
+‚¨‚à‚Ä‚´‚½
+‚¨‚à‚Ä‚¶
+‚¨‚à‚Ä‚Ç‚¨‚è
+‚¨‚à‚Ä‚Þ‚«
+‚¨‚à‚Ä‚à‚ñ
+‚¨‚à‚È‚ª
+‚¨‚à‚É
+‚¨‚à‚à‚¿
+‚¨‚à‚â
+‚¨‚à‚ä
+‚¨‚à‚í‚­
+‚¨‚â
+‚¨‚₪‚¢‚µ‚á
+‚¨‚â‚©‚½
+‚¨‚₱
+‚¨‚₲
+‚¨‚₱‚¤‚±‚¤
+‚¨‚₲‚±‚ë
+‚¨‚₶
+‚¨‚₵‚¨
+‚¨‚â‚·‚Ý
+‚¨‚â‚Ó‚±‚¤
+‚¨‚â‚Ô‚ñ
+‚¨‚â‚Ü
+‚¨‚â‚à‚Æ
+‚¨‚â‚䂸‚è
+‚¨‚â‚ä‚Ñ
+‚¨‚ä
+‚¨‚æ‚»
+‚¨‚æ‚낱‚Ñ
+‚¨‚è
+‚¨‚è‚ ‚¢
+‚¨‚è[‚Ô
+‚¨‚肦‚ñ‚Ä[‚µ‚å
+‚¨‚肨‚è
+‚¨‚è‚©‚¦‚µ
+‚¨‚肪‚Ý
+‚¨‚肱‚Ý
+‚¨‚肶‚È‚é
+‚¨‚è‚Âß
+‚¨‚è‚Âé
+‚¨‚è‚΂±
+‚¨‚è‚ß
+‚¨‚è‚à‚Ì
+‚¨‚è‚ñ‚Ò‚Á‚­
+‚¨‚邪‚ñ
+‚¨‚邲[‚é
+‚¨‚ê
+‚¨‚ꂹ‚ñ
+‚¨‚ë‚©
+‚¨‚ë‚©‚à‚Ì
+‚¨‚낵
+‚¨‚낵‚»‚¤‚Î
+‚¨‚낵‚Ë
+‚¨‚í‚è
+‚¨‚í‚è‚Ë
+‚¨‚ñ‚¢‚«
+‚¨‚ñ‚©‚¢
+‚¨‚ñ‚ª‚­
+‚¨‚ñ‚ª‚­‚©
+‚¨‚ñ‚ª‚Á‚©
+‚¨‚ñ‚©‚ñ
+‚¨‚ñ‚¬
+‚¨‚ñ‚«‚傤
+‚¨‚ñ‚®‚·‚Æ‚ë[‚Þ
+‚¨‚ñ‚­‚ñ
+‚¨‚ñ‚¯‚¢
+‚¨‚ñ‚°‚ñ
+‚¨‚ñ‚±
+‚¨‚ñ‚±‚¿‚µ‚ñ
+‚¨‚ñ‚³
+‚¨‚ñ‚µ
+‚¨‚ñ‚µ‚Â
+‚¨‚ñ‚µ‚á
+‚¨‚ñ‚¶‚ã‚ñ
+‚¨‚ñ‚µ‚傤
+‚¨‚ñ‚¶‚傤
+‚¨‚ñ‚µ‚ñ
+‚¨‚ñ‚¶‚ñ
+‚¨‚ñ‚·
+‚¨‚ñ‚·‚¢
+‚¨‚ñ‚·‚¢‚«
+‚¨‚ñ‚¹‚¢
+‚¨‚ñ‚¹‚ñ
+‚¨‚ñ‚»‚­
+‚¨‚ñ‚½‚¢
+‚¨‚ñ‚¾‚ñ
+‚¨‚ñ‚¾‚ñ‚º‚ñ‚¹‚ñ
+‚¨‚ñ‚¿
+‚¨‚ñ‚¿‚イ
+‚¨‚ñ‚¿‚傤
+‚¨‚ñ‚Ä‚ñ
+‚¨‚ñ‚Ç
+‚¨‚ñ‚Ç‚¯‚¢
+‚¨‚ñ‚Ç‚³
+‚¨‚ñ‚Ç‚è
+‚¨‚ñ‚È
+‚¨‚ñ‚È‚ª‚½
+‚¨‚ñ‚È‚Å
+‚¨‚ñ‚È‚Ì‚±
+‚¨‚ñ‚È‚à‚Ì
+‚¨‚ñ‚Ë‚Â
+‚¨‚ñ‚Ë‚ñ
+‚¨‚ñ‚Ï
+‚¨‚ñ‚Ñ‚ñ
+‚¨‚ñ‚Ý
+‚¨‚ñ‚Ý‚Â
+‚¨‚ñ‚à‚Æ
+‚¨‚ñ‚ç‚¢‚ñ
+‚¨‚ñ‚è‚Â
+‚¨‚ñ‚è‚傤
+‚¨‚ñ‚ê‚¢
+ĥ
+ƒJ
+‚©
+ƒK
+‚ª
+‚ª
+‚©[
+‚©[‚²
+‚©‚ ‚³‚ñ
+‚©[‚»‚é
+‚©[‚Å‚¡‚ª‚ñ
+‚©[‚Ä‚ñ
+‚©[‚Æ
+‚©[‚Ç
+‚©[‚Æ‚è‚Á‚¶
+‚©[‚Æ‚ñ
+‚ª[‚È
+‚©[‚ɂ΂é
+‚©[‚Ë[‚µ‚å‚ñ
+‚©[‚Ú‚ñ
+‚ª[‚è‚Á‚­
+‚ª[‚é
+‚©‚¢
+‚ª‚¢
+‚ª‚¢‚ ‚­
+‚ª‚¢‚ ‚Â
+‚©‚¢‚¢‚Ê
+‚©‚¢‚¢‚ñ
+‚ª‚¢‚¢‚ñ
+‚©‚¢‚¢‚ñ‚¹‚¢
+‚©‚¢‚¤‚ñ
+‚©‚¢‚¦‚ñ
+‚ª‚¢‚¦‚ñ
+‚©‚¢‚©
+‚©‚¢‚ª
+‚ª‚¢‚©
+‚©‚¢‚ª‚¢
+‚ª‚¢‚©‚¢
+‚©‚¢‚ª‚¢‚©
+‚©‚¢‚ª‚¢‚ª‚©‚è
+‚©‚¢‚©‚¢‚µ‚«
+‚©‚¢‚ª‚¢‚Ô
+‚©‚¢‚©‚¦
+‚©‚¢‚ª‚©
+‚ª‚¢‚©‚­
+‚©‚¢‚©‚¯
+‚©‚¢‚©‚¯‚«‚ñ
+‚©‚¢‚©‚ñ
+‚©‚¢‚ª‚ñ
+‚ª‚¢‚©‚ñ
+‚©‚¢‚ª‚ñ‚¹‚ñ
+‚©‚¢‚«
+‚ª‚¢‚«
+‚©‚¢‚¬‚µ‚Â
+‚©‚¢‚«‚µ‚å‚­
+‚©‚¢‚«‚¹‚ñ
+‚©‚¢‚¬‚Ð
+‚©‚¢‚¬‚á‚­
+‚©‚¢‚«‚イ
+‚©‚¢‚«‚å
+‚©‚¢‚«‚傤
+‚©‚¢‚¬‚傤‚¢
+‚ª‚¢‚«‚å‚­
+‚©‚¢‚«‚ñ
+‚ª‚¢‚«‚ñ
+‚©‚¢‚®‚ñ
+‚ª‚¢‚¯‚¢
+‚©‚¢‚¯‚¢‚©
+‚©‚¢‚¯‚‚³‚­
+‚©‚¢‚¯‚‚т傤
+‚©‚¢‚¯‚ñ
+‚©‚¢‚°‚ñ
+‚ª‚¢‚¯‚ñ
+‚©‚¢‚°‚ñ‚ê‚¢
+‚©‚¢‚±
+‚©‚¢‚±‚¤
+‚ª‚¢‚±‚¤
+‚ª‚¢‚±‚¤‚¢‚ñ
+‚ª‚¢‚±‚¤‚©‚ñ
+‚ª‚¢‚±‚¤‚Ä‚«
+‚©‚¢‚±‚­
+‚ª‚¢‚±‚­
+‚ª‚¢‚±‚­‚²
+‚ª‚¢‚±‚­‚¹‚¢
+‚©‚¢‚±‚µ
+‚ª‚¢‚±‚Â
+‚©‚¢‚²‚낵
+‚©‚¢‚±‚ñ
+‚ª‚¢‚³‚¢
+‚©‚¢‚³‚¢‚¿
+‚©‚¢‚³‚­
+‚©‚¢‚³‚‚®‚¿
+‚©‚¢‚´‚ñ
+‚©‚¢‚³‚ñ‚Ô‚Â
+‚©‚¢‚µ
+‚©‚¢‚¶
+‚ª‚¢‚¶
+‚©‚¢‚µ‚á
+‚ª‚¢‚µ‚á
+‚©‚¢‚µ‚á‚¢‚ñ
+‚©‚¢‚µ‚á‚ß‚¢
+‚ª‚¢‚¶‚ã
+‚©‚¢‚¶‚イ
+‚ª‚¢‚µ‚ã‚‚¬
+‚©‚¢‚µ‚ã‚ñ
+‚©‚¢‚µ‚å
+‚©‚¢‚µ‚傤
+‚©‚¢‚¶‚傤
+‚ª‚¢‚µ‚傤
+‚ª‚¢‚µ‚傤‚©
+‚ª‚¢‚µ‚傤‚Ô
+‚©‚¢‚µ‚ñ
+‚©‚¢‚¶‚ñ
+‚ª‚¢‚µ‚ñ
+‚ª‚¢‚¶‚ñ
+‚©‚¢‚¸
+‚©‚¢‚·‚¢
+‚©‚¢‚·‚¢‚æ‚­
+‚©‚¢‚·‚¤
+‚ª‚¢‚·‚¤
+‚©‚¢‚·‚¤‚¯‚ñ
+‚©‚¢‚¹‚¢
+‚©‚¢‚¹‚¢‚ ‚ñ
+‚©‚¢‚¹‚«
+‚©‚¢‚¹‚‚µ‚á
+‚©‚¢‚º‚é
+‚©‚¢‚¹‚ñ
+‚ª‚¢‚¹‚ñ
+‚ª‚¢‚¹‚ñ‚à‚ñ
+‚©‚¢‚»
+‚©‚¢‚»‚¤
+‚©‚¢‚¼‚¤‚Ç
+‚©‚¢‚»‚­
+‚©‚¢‚¼‚­
+‚©‚¢‚¾‚¢
+‚ª‚¢‚¾‚¢
+‚ª‚¢‚½‚ß
+‚©‚¢‚¾‚ñ
+‚ª‚¢‚¿
+‚©‚¢‚¿‚イ
+‚ª‚¢‚¿‚イ
+‚©‚¢‚¿‚傤
+‚ª‚¢‚¿‚傤
+‚©‚¢‚‚¤‚µ‚«
+‚©‚¢‚©
+‚©‚¢‚Ä‚¢
+‚©‚¢‚Ä‚«
+‚ª‚¢‚Ä‚«
+‚©‚¢‚Ä‚ñ
+‚©‚¢‚Å‚ñ
+‚ª‚¢‚Å‚ñ
+‚©‚¢‚Ä‚ñ‚«
+‚©‚¢‚Æ‚¤
+‚©‚¢‚Ç‚¤
+‚ª‚¢‚Æ‚¤
+‚ª‚¢‚Æ‚¤‚µ‚á
+‚©‚¢‚Æ‚­
+‚ª‚¢‚Ç‚­
+‚©‚¢‚È‚ñ
+‚©‚¢‚Ë
+‚ª‚¢‚Ë‚ñ
+‚©‚¢‚Î
+‚©‚¢‚΂µ‚ç
+‚©‚¢‚Í‚Â
+‚©‚¢‚΂Â
+‚©‚¢‚͂‚©
+‚©‚¢‚͂‚«
+‚©‚¢‚͂‚«‚å‚­
+‚©‚¢‚͂‚µ‚Â
+‚©‚¢‚͂‚Ð
+‚©‚¢‚͂‚Ô
+‚ª‚¢‚Í‚ñ
+‚©‚¢‚Ð
+‚©‚¢‚Ñ‚á‚­
+‚©‚¢‚Ђñ
+‚ª‚¢‚Ђñ
+‚ª‚¢‚Ô
+‚©‚¢‚Ô‚Â
+‚©‚¢‚Ô‚ñ
+‚ª‚¢‚Ô‚ñ
+‚©‚¢‚Ö‚¢
+‚©‚¢‚Ö‚¢‚«
+‚ª‚¢‚Ö‚«
+‚©‚¢‚Ù‚¤
+‚ª‚¢‚Ù‚¤
+‚ª‚¢‚Ü‚¢
+‚©‚¢‚݂傤
+‚ª‚¢‚Þ
+‚ª‚¢‚Þ‚µ‚傤
+‚ª‚¢‚Þ‚¾‚¢‚¶‚ñ
+‚©‚¢‚ß‚¢
+‚©‚¢‚ß‚ñ
+‚ª‚¢‚ß‚ñ
+‚ª‚¢‚â
+‚ª‚¢‚悤
+‚©‚¢‚ç‚¢
+‚ª‚¢‚ç‚¢
+‚ª‚¢‚ç‚¢‚²
+‚©‚¢‚ç‚­
+‚©‚¢‚è
+‚©‚¢‚è‚«
+‚©‚¢‚è‚Â
+‚ª‚¢‚è‚á‚­
+‚©‚¢‚è‚イ
+‚ª‚¢‚è‚å‚­
+‚ª‚¢‚è‚ñ
+‚ª‚¢‚è‚ñ‚´‚ñ
+‚©‚¢‚ê‚¢
+‚ª‚¢‚ë
+‚©‚¢‚낤
+‚ª‚¢‚낶‚ã
+‚ª‚¢‚ë‚Æ‚¤
+‚ª‚¢‚ë‚ñ
+‚©‚¢‚í‚¢
+‚©‚¢‚ñ
+‚©‚¤‚ñ‚¹‚ç[
+‚©‚¤‚ñ‚¹‚è‚ñ‚®
+‚©‚¤‚ñ‚½
+‚©‚¦
+‚©‚¦‚¾‚Ü
+‚©‚¦‚Å
+‚©‚¦‚é
+‚©‚¨
+‚©‚¨‚¢‚ë
+‚©‚¨‚¤
+‚©‚¨‚©‚½‚¿
+‚©‚¨‚­
+‚©‚¨‚¶‚Ⴕ‚ñ
+‚©‚¨‚¾‚¿
+‚©‚¨‚È‚¶‚Ý
+‚©‚¨‚Ô‚ê
+‚©‚¨‚Ý‚µ‚è
+‚©‚¨‚Þ‚¯
+‚©‚¨‚â‚­
+‚©‚¨‚è
+‚ª‚©
+‚©‚ª‚¢‚µ‚á
+‚©‚©‚­
+‚©‚ª‚­
+‚ª‚ª‚­
+‚©‚ª‚­‚©
+‚©‚ª‚­‚¬‚¶‚ã‚Â
+‚©‚ª‚­‚¬‚¶‚ã‚‚¿
+‚©‚ª‚­‚µ‚á
+‚©‚ª‚­‚¿‚傤‚Ý‚è
+‚©‚©‚µ
+‚©‚ª‚Á‚©
+‚©‚ª‚Ý
+‚©‚ª‚Ý‚¢‚µ
+‚©‚ª‚Ý‚¢‚½
+‚©‚ª‚Ý‚à‚¿
+‚©‚ª‚â‚«
+‚©‚©‚è
+‚ª‚©‚è
+‚©‚©‚è‚¢‚ñ
+‚©‚©‚è‚©‚ñ
+‚©‚©‚è‚¿‚傤
+‚©‚«
+‚©‚¬
+‚ª‚«
+‚©‚«‚¢‚ê‚Ç‚«
+‚©‚«‚©‚½
+‚©‚«‚«‚イ‚©
+‚©‚«‚µ‚Ô
+‚©‚«‚‚¯
+‚©‚«‚Æ‚ß
+‚©‚«‚Æ‚è
+‚©‚«‚Ë
+‚©‚«‚Í‚ñ
+‚©‚¬‚â
+‚©‚¬‚á‚­
+‚©‚«‚イ
+‚©‚¬‚イ
+‚©‚«‚イ‚¹‚¢
+‚©‚«‚イ‚Ä‚«
+‚©‚«‚傤
+‚©‚¬‚傤
+‚ª‚¬‚傤
+‚©‚¬‚è
+‚©‚«‚ñ
+‚©‚­
+‚©‚®
+‚ª‚­
+‚©‚­‚¢
+‚ª‚­‚¢
+‚©‚­‚¢‚ñ
+‚ª‚­‚¢‚ñ
+‚©‚­‚¤
+‚©‚­‚¦‚«
+‚ª‚­‚¦‚ñ
+‚ª‚­‚¦‚ñ‚³‚¢
+‚©‚­‚¨‚Ñ
+‚©‚­‚©
+‚©‚­‚©‚¢
+‚©‚­‚ª‚¢
+‚ª‚­‚ª‚¢
+‚©‚­‚©‚¼‚­
+‚©‚­‚ª‚½
+‚©‚­‚©‚ñ
+‚ª‚­‚¬‚傤
+‚©‚­‚­‚Ý
+‚©‚­‚­‚ç‚·
+‚ª‚­‚®‚ñ
+‚ª‚­‚°‚¢
+‚ª‚­‚°‚¢‚©‚¢
+‚ª‚­‚°‚«
+‚©‚­‚°‚‚©‚ñ
+‚©‚­‚¯‚ñ
+‚©‚­‚°‚ñ
+‚©‚­‚±‚¤
+‚©‚­‚³
+‚©‚­‚´‚¢
+‚ª‚­‚³‚¢
+‚©‚­‚³‚ñ
+‚©‚­‚µ
+‚©‚­‚¶
+‚ª‚­‚µ
+‚ª‚­‚¶
+‚©‚­‚µ‚«
+‚ª‚­‚µ‚«
+‚©‚­‚µ‚Â
+‚©‚­‚¶‚Â
+‚©‚­‚µ‚á
+‚ª‚­‚µ‚á
+‚©‚­‚µ‚ã
+‚©‚­‚µ‚イ
+‚©‚­‚µ‚イ‚©‚ñ
+‚ª‚­‚¶‚ã‚Â
+‚©‚­‚µ‚å
+‚©‚­‚µ‚傤
+‚ª‚­‚µ‚傤
+‚©‚­‚µ‚傤‚¿‚傤
+‚ª‚­‚µ‚å‚­
+‚©‚­‚µ‚ñ
+‚©‚­‚·‚¢
+‚©‚­‚·‚¤
+‚©‚­‚¹‚¢
+‚ª‚­‚¹‚¢
+‚ª‚­‚¹‚¢‚ª‚¢
+‚©‚­‚¹‚¢‚«
+‚©‚­‚¹‚¢‚´‚¢
+‚ª‚­‚¹‚«‚Ú
+‚ª‚­‚¹‚Â
+‚©‚­‚¹‚ñ
+‚©‚­‚¹‚ñ‚»‚¤
+‚©‚­‚»‚¤
+‚ª‚­‚»‚¤
+‚ª‚­‚»‚­
+‚ª‚­‚»‚Â
+‚ª‚­‚½‚¢
+‚©‚­‚¾‚ñ
+‚ª‚­‚¾‚ñ
+‚©‚­‚¾‚ñ‚Æ‚¤
+‚©‚­‚¿
+‚©‚­‚¿‚イ
+‚©‚®‚¿‚傤
+‚ª‚­‚¿‚傤
+‚©‚­‚¿‚傤‚µ
+‚©‚­‚‚«
+‚ª‚­‚Ä‚«
+‚©‚­‚Ä‚ñ
+‚ª‚­‚Ä‚ñ
+‚ª‚­‚Æ
+‚©‚­‚Æ‚¤
+‚ª‚­‚Ç‚¤
+‚ª‚­‚Æ‚­
+‚©‚­‚È‚¢
+‚ª‚­‚È‚¢
+‚©‚­‚Ë‚ñ
+‚©‚­‚Ë‚ñ‚è‚傤
+‚©‚­‚Ì‚¤‚±
+‚©‚­‚Í
+‚ª‚­‚Í
+‚ª‚­‚΂Â
+‚©‚­‚Í‚ñ
+‚©‚­‚Í‚ñ‚«
+‚©‚­‚Ô
+‚ª‚­‚Ó
+‚ª‚­‚Ô
+‚ª‚­‚Ô‚¿
+‚ª‚­‚Ô‚¿‚傤
+‚©‚­‚Ö‚¢‚«
+‚©‚­‚Ö‚«
+‚©‚­‚Ü‚­
+‚ª‚­‚Þ
+‚©‚­‚ß‚¢
+‚ª‚­‚ß‚¢
+‚©‚­‚ß‚ñ
+‚ª‚­‚ß‚ñ
+‚ª‚­‚â
+‚ª‚­‚䂤
+‚©‚­‚悤
+‚ª‚­‚悤
+‚ª‚­‚悤‚Ђñ
+‚©‚®‚ç
+‚©‚­‚ç‚ñ
+‚ª‚­‚è
+‚©‚­‚è‚Â
+‚©‚­‚è‚傤
+‚ª‚­‚è‚å‚­
+‚ª‚­‚ê‚¢
+‚ª‚­‚ê‚«
+‚©‚­‚ë‚ñ
+‚ª‚­‚í‚è
+‚©‚¯
+‚©‚°
+‚ª‚¯
+‚©‚¯‚ ‚¢
+‚©‚¯‚¢
+‚©‚¯‚¢‚Ú
+‚©‚°‚¦
+‚©‚¯‚ª‚Ë
+‚©‚°‚«
+‚©‚°‚«‚Í
+‚©‚¯‚«‚ñ
+‚©‚°‚®‚¿
+‚©‚¯‚²‚¦
+‚©‚¯‚²‚Æ
+‚©‚¯‚¸
+‚©‚¯‚¾‚µ
+‚©‚°‚Â
+‚©‚¯‚Æ‚è
+‚©‚¯‚Ë
+‚©‚¯‚Í‚µ
+‚©‚°‚ЂȂ½
+‚©‚°‚Þ‚µ‚á
+‚©‚¯‚ß
+‚©‚¯‚à‚Ì
+‚©‚°‚낤
+‚©‚¯‚ñ
+‚©‚°‚ñ
+‚©‚±
+‚©‚±‚¤
+‚ª‚±‚¤
+‚ª‚²‚¤
+‚©‚±‚¤‚¬‚傤
+‚©‚±‚¤‚¹‚ñ
+‚©‚±‚¤‚¿
+‚©‚±‚¤‚Ð
+‚©‚±‚¤‚悤
+‚©‚±‚ñ
+‚©‚²‚ñ
+‚©‚³
+‚©‚³‚¢
+‚©‚´‚¢
+‚ª‚´‚¢
+‚©‚³‚­
+‚©‚´‚®‚é‚Ü
+‚©‚´‚µ‚à
+‚©‚³‚¾‚©
+‚©‚´‚Ü
+‚©‚´‚Ý
+‚©‚´‚Þ‚«
+‚©‚´‚è
+‚©‚´‚ñ
+‚©‚´‚ñ‚½‚¢
+‚©‚´‚ñ‚΂¢
+‚©‚µ
+‚©‚¶
+‚ª‚µ
+‚©‚µ‚¨‚µ‚Ú‚è
+‚©‚µ‚¨‚Þ‚Â
+‚©‚¶‚©
+‚©‚µ‚©‚½
+‚©‚µ‚©‚ñ
+‚©‚µ‚«‚è
+‚©‚µ‚«‚ñ
+‚©‚µ‚µ‚Â
+‚©‚µ‚¹‚«
+‚©‚µ‚¾‚¨‚ê
+‚©‚µ‚¾‚µ
+‚©‚µ‚¿‚ñ
+‚©‚µ‚Â
+‚©‚¶‚Â
+‚©‚µ‚‚¿‚µ
+‚©‚¶‚Æ‚è
+‚©‚¶‚Î
+‚©‚µ‚Ù‚ñ
+‚©‚µ‚Ü
+‚©‚µ‚á
+‚©‚µ‚â
+‚©‚µ‚ã
+‚©‚¶‚ã
+‚ª‚µ‚ã
+‚©‚µ‚イ
+‚©‚¶‚イ
+‚ª‚µ‚イ
+‚©‚µ‚å
+‚©‚¶‚傤
+‚ª‚µ‚傤
+‚ª‚¶‚傤
+‚©‚µ‚å‚­
+‚©‚µ‚ç
+‚©‚µ‚í
+‚©‚µ‚í‚´‚«
+‚©‚µ‚í‚à‚¿
+‚©‚µ‚ñ
+‚©‚¶‚ñ
+‚ª‚µ‚ñ‚µ‚傤‚½‚ñ
+‚©‚·
+‚©‚¸
+‚ª‚·
+‚©‚·‚¤
+‚©‚·‚¤‚Ô
+‚©‚·‚ª
+‚©‚¸‚©‚¸
+‚©‚·‚¶‚é
+‚©‚·‚½[‚Ç
+‚©‚·‚½‚Þ
+‚©‚¸‚Ì‚±
+‚©‚·‚Ý
+‚©‚¸‚ç
+‚©‚º
+‚©‚º‚ ‚½‚è
+‚©‚¹‚¢
+‚©‚º‚¢
+‚©‚¹‚¢‚Ó
+‚©‚¹‚«
+‚©‚¹‚Â
+‚©‚¹‚Á‚Æ
+‚©‚º‚Æ‚¨‚µ
+‚©‚º‚Þ‚«
+‚©‚¹‚ñ
+‚©‚»
+‚©‚»‚¤
+‚ª‚¼‚¤
+‚©‚»‚¤‚Î
+‚©‚¼‚¦‚Ç‚µ
+‚©‚¼‚­
+‚©‚»‚­‚Ç
+‚©‚»‚¿
+‚ª‚»‚è‚ñ
+‚©‚½
+‚ª‚½
+‚©‚½‚ ‚µ
+‚©‚¾‚¢
+‚ª‚¾‚¢
+‚©‚½‚¢‚È‚©
+‚©‚½‚¤‚Å
+‚©‚½‚¨‚â
+‚©‚½‚ª‚«
+‚©‚½‚ª‚½
+‚©‚½‚©‚È
+‚©‚½‚ª‚Ý
+‚©‚½‚¬
+‚©‚½‚­
+‚©‚½‚­‚è
+‚©‚½‚±‚Æ
+‚©‚½‚µ‚«
+‚©‚½‚¸
+‚©‚½‚·‚©‚µ
+‚©‚½‚¿
+‚©‚½‚Â
+‚©‚½‚Ã
+‚©‚½‚¯
+‚©‚½‚Ä
+‚©‚½‚Ä‚¨‚¿
+‚©‚½‚Æ‚«
+‚©‚½‚Í‚µ
+‚©‚½‚Í‚¾
+‚©‚½‚Í‚Î
+‚©‚½‚Í‚ç‚¢‚½‚¢
+‚©‚½‚Ñ‚ç
+‚©‚½‚Ù‚¤
+‚©‚½‚Ú‚¤
+‚©‚½‚Ü‚è
+‚©‚½‚Ý
+‚©‚½‚Ý‚¿
+‚©‚½‚ß
+‚©‚½‚ß‚ñ
+‚©‚½‚æ‚è
+‚©‚½‚è
+‚©‚½‚ë‚®
+‚©‚½‚í‚ç
+‚©‚½‚ñ
+‚©‚¾‚ñ
+‚©‚¿
+‚©‚¿‚©‚ñ
+‚©‚¿‚«
+‚©‚¿‚Ú‚µ
+‚©‚¿‚Ü‚¯
+‚©‚¿‚ß
+‚©‚¿‚イ
+‚©‚¿‚傤
+‚ª‚¿‚傤
+‚©‚¿‚傤‚«‚ñ
+‚©‚‚¨
+‚©‚‚¨‚Ô‚µ
+‚©‚Á‚©
+‚ª‚Á‚©
+‚©‚Á‚©‚¢
+‚ª‚Á‚©‚¢
+‚©‚Á‚©‚´‚ñ
+‚©‚Á‚«
+‚ª‚Á‚«
+‚©‚Á‚«‚Ä‚«
+‚ª‚Á‚«‚Ü‚Â
+‚ª‚Á‚«‚イ
+‚©‚Á‚«‚傤
+‚©‚Á‚«‚å‚­
+‚©‚Á‚­
+‚ª‚Á‚­
+‚©‚Á‚¯
+‚ª‚Á‚¯‚¢
+‚©‚‚°‚«
+‚©‚Á‚±
+‚©‚Á‚±‚¤
+‚ª‚Á‚±‚¤‚Ù‚¤‚¶‚ñ
+‚©‚Á‚±‚­
+‚©‚‚¶
+‚©‚Á‚µ‚á
+‚©‚Á‚µ‚å‚­
+‚©‚Á‚¹‚¢
+‚©‚Á‚¹‚¢‚½‚ñ
+‚©‚Á‚¹‚ñ
+‚©‚Á‚»‚¤‚ë
+‚©‚Á‚½
+‚©‚Á‚½[
+‚©‚Á‚½‚Â
+‚©‚‚¾‚Â
+‚©‚Á‚½‚ñ
+‚©‚Á‚Ä‚®‚¿
+‚ª‚Á‚Æ
+‚©‚Á‚Æ‚¤
+‚©‚‚ǂ¤‚©
+‚©‚Á‚Ï
+‚©‚Á‚Ï‚Â
+‚©‚Á‚Ï‚ñ
+‚©‚Á‚Õ
+‚©‚Á‚Õ‚­
+‚©‚Á‚Õ‚é
+‚©‚Á‚Û‚¤
+‚©‚Á‚Û‚¤‚¬
+‚©‚Â‚à‚­
+‚©‚‚₭‚«‚ñ
+‚©‚‚è‚å‚­
+‚©‚‚ë
+‚©‚Ä‚¢
+‚©‚Ä‚¢‚©
+‚©‚Ä‚¢‚È‚¢
+‚©‚Ä‚¢‚悤
+‚©‚Ä‚²‚è[
+‚©‚Æ
+‚©‚Ç
+‚©‚Æ‚¤
+‚©‚Ç‚¤
+‚©‚Ç‚¤‚è‚Â
+‚©‚Æ‚«
+‚©‚Æ‚­
+‚©‚Æ‚Ä‚«
+‚©‚Ç‚Ü‚Â
+‚©‚Ƃ肹‚ñ‚±‚¤
+‚©‚Æ‚è‚Á‚­
+‚©‚È
+‚©‚È‚ ‚Ý
+‚©‚È‚¢
+‚©‚È‚ª‚½
+‚©‚È‚®
+‚©‚È‚½
+‚©‚Ȃ¿
+‚©‚È‚Æ‚±
+‚©‚È‚Ú‚¤
+‚©‚È‚ß
+‚©‚È‚è‚ 
+‚©‚É
+‚©‚É‚­
+‚©‚ɂイ‚µ‚á
+‚©‚Ë
+‚©‚Ë‚¶‚á‚­
+‚©‚˂©‚¢
+‚©‚˂΂Ȃê
+‚©‚Ë‚Ü‚í‚è
+‚©‚Ë‚ß
+‚©‚Ë‚à‚¿
+‚©‚Ë‚ñ
+‚©‚Ë‚ñ‚¹‚¢
+‚©‚Ì‚¤
+‚©‚Ì‚±
+‚©‚Ì‚¶‚å
+‚©‚Î
+‚©‚Î[
+‚ª‚Í‚­
+‚©‚΂Ë
+‚©‚΂₫
+‚©‚΂ñ
+‚ª‚΂ñ
+‚©‚Í‚ñ‚µ‚ñ
+‚©‚Í‚ñ‚·‚¤
+‚©‚Ð
+‚©‚Ñ
+‚ª‚ЂÂ
+‚ª‚т傤
+‚©‚Ñ‚ñ
+‚©‚Ó
+‚©‚Ô
+‚©‚Ó‚¤
+‚©‚Ó‚¥
+‚©‚Ó‚¥‚¢‚ñ
+‚©‚Ô‚«
+‚©‚Ô‚¯‚ñ
+‚©‚Ô‚µ‚«
+‚©‚Ô‚µ‚«‚©‚¢‚µ‚á
+‚©‚Ô‚µ‚«‚ª‚¢‚µ‚á
+‚©‚Õ‚¹‚é
+‚©‚Ó‚»‚­
+‚©‚Ô‚Æ
+‚©‚Ô‚Ê‚µ
+‚©‚Ô‚ç
+‚©‚Ó‚ñ
+‚©‚Ô‚ñ
+‚©‚×
+‚©‚Ö‚¢
+‚©‚Ö‚ñ
+‚©‚ׂñ
+‚©‚Ö‚ñ‚¿‚傤
+‚©‚Ù‚¤
+‚©‚Ù‚¤‚í
+‚©‚Ù‚²
+‚©‚Ú‚¿‚á
+‚©‚Ü‚Ú‚±
+‚©‚Ü‚à‚Æ
+‚©‚Ý
+‚©‚Ý‚¢‚ê
+‚©‚Ý‚ª‚½
+‚©‚Ý‚«
+‚©‚Ý‚­‚¸
+‚©‚Ý‚³‚Ü
+‚©‚Ý‚µ‚΂¢
+‚©‚Ý‚µ‚à
+‚©‚Ý‚»‚è
+‚©‚Ý‚¾‚È
+‚©‚Ý‚Â
+‚©‚Ý‚Ä
+‚©‚݂΂³‚Ý
+‚©‚Ý‚Í‚ñ‚«
+‚©‚݂ЂƂ¦
+‚©‚Ý‚Ô‚­‚ë
+‚©‚Ý‚â
+‚©‚Ý‚ä‚¢
+‚©‚Ý‚í‚´
+‚ª‚Þ
+‚ª‚Þ‚µ‚á‚ç
+‚©‚Þ‚¿‚á‚‚©
+‚©‚Þ‚Ó‚ç[‚¶‚ã
+‚©‚ß
+‚©‚ß‚¢
+‚©‚ß‚¢‚±‚­
+‚©‚ß‚ç
+‚©‚ß‚é[‚ñ
+‚©‚߂ꂨ‚ñ
+‚©‚ß‚ñ
+‚ª‚ß‚ñ
+‚ª‚ß‚ñ‚¶‚傤
+‚©‚à
+‚©‚à‚­
+‚©‚à‚Â
+‚©‚à‚‚¹‚ñ
+‚©‚à‚ß
+‚©‚à‚ñ
+‚©‚â
+‚©‚â‚­
+‚©‚ä
+‚©‚æ‚¢‚΂±
+‚©‚悤
+‚©‚悤‚«‚å‚­
+‚ª‚悤‚µ
+‚©‚悤‚¹‚¢
+‚©‚悤‚Ñ
+‚ª‚æ‚­
+‚©‚ç
+‚ª‚ç
+‚©‚ç[
+‚ª‚ç‚ ‚«
+‚©‚炤‚è
+‚©‚炪‚¢
+‚©‚ç‚©‚Ý
+‚©‚ç‚­‚³
+‚©‚ç‚­‚¿
+‚©‚炵
+‚©‚ç‚·
+‚ª‚ç‚·
+‚©‚ç‚·‚®‚¿
+‚©‚炽‚¿
+‚©‚ç‚Â
+‚©‚ç‚Á‚Æ
+‚©‚ç‚Ä
+‚©‚ç‚Ä‚ª‚½
+‚©‚ç‚Æ‚¤
+‚©‚ç‚Þ
+‚©‚ç‚ß‚Ä
+‚©‚è
+‚©‚è‚¢‚ê‚«‚ñ
+‚©‚è‚©‚½
+‚©‚è‚©‚ñ‚¶‚傤
+‚©‚è‚«‚ã‚ç‚Þ
+‚©‚肱‚µ
+‚©‚è‚Ê‚µ
+‚©‚è‚Î
+‚ª‚è‚Î[
+‚©‚è‚΂炢‚«‚ñ
+‚©‚è‚ß‚ñ
+‚©‚è‚ß‚ñ‚«‚å
+‚©‚è‚à‚Ì
+‚ª‚è‚イ
+‚©‚è‚イ‚©‚¢
+‚©‚è‚イ‚Ç
+‚©‚è‚傤
+‚ª‚è‚傤‚Ä‚ñ‚¹‚¢
+‚©‚è‚å‚­
+‚ª‚è‚ê‚¢
+‚©‚邵‚¤‚Þ
+‚©‚邽
+‚©‚é‚¿‚á[
+‚©‚é‚Ä
+‚©‚é‚í‚´
+‚©‚ê
+‚©‚ê‚¢
+‚©‚ê[
+‚ª‚ê[‚¶
+‚©‚ê‚«
+‚ª‚ê‚«
+‚©‚ê‚­‚³
+‚©‚ꂵ
+‚©‚ê‚Á‚¶
+‚©‚ê‚ñ
+‚©‚ê‚ñ‚¾
+‚©‚ê‚ñ‚Æ
+‚©‚낤
+‚ª‚낤
+‚©‚ë‚è[
+‚ª‚ë‚ñ
+‚ª‚í
+‚©‚í‚©‚º
+‚©‚í‚©‚Ý
+‚©‚킬‚µ
+‚©‚í‚®‚¿
+‚©‚í‚®‚Â
+‚©‚킵‚à
+‚©‚킹
+‚©‚킼‚±
+‚©‚í‚΂½
+‚©‚í‚ç
+‚©‚í‚肾‚Ë
+‚©‚ñ
+‚ª‚ñ
+‚©‚ñ‚¢‚Á‚Ï‚Â
+‚©‚ñ‚¢‚ñ
+‚©‚ñ‚¦‚¢
+‚©‚ñ‚¦‚ñ
+‚ª‚ñ‚¦‚ñ
+‚©‚ñ‚¨‚¤
+‚©‚ñ‚¨‚¯
+‚ª‚ñ‚©
+‚©‚ñ‚©‚¢
+‚©‚ñ‚ª‚¢
+‚ª‚ñ‚©‚¢
+‚©‚ñ‚ª‚¢‚Þ‚è‚傤
+‚©‚ñ‚ª‚¦‚©‚½
+‚©‚ñ‚©‚­
+‚©‚ñ‚©‚‚ª‚¢
+‚©‚ñ‚ª‚Á‚«
+‚©‚ñ‚ª‚é[
+‚©‚ñ‚ª‚ñ
+‚©‚ñ‚©‚ñ‚ª‚­‚ª‚­
+‚©‚ñ‚«
+‚ª‚ñ‚¬
+‚©‚ñ‚«‚Â
+‚©‚ñ‚«‚á‚­
+‚©‚ñ‚«‚イ
+‚ª‚ñ‚«‚イ
+‚©‚ñ‚«‚傤
+‚©‚ñ‚¬‚傤
+‚ª‚ñ‚«‚傤
+‚©‚ñ‚«‚è
+‚©‚ñ‚«‚ñ
+‚ª‚ñ‚«‚ñ
+‚©‚ñ‚­
+‚ª‚ñ‚®
+‚ª‚ñ‚­‚Â
+‚©‚ñ‚®‚ñ
+‚©‚ñ‚°‚«
+‚©‚ñ‚¯‚ñ
+‚©‚ñ‚°‚ñ
+‚©‚ñ‚°‚ñ‚ª‚­
+‚©‚ñ‚²
+‚ª‚ñ‚±
+‚©‚ñ‚±‚¤
+‚ª‚ñ‚±‚¤
+‚©‚ñ‚±‚¤‚«‚á‚­
+‚©‚ñ‚±‚¤‚µ
+‚©‚ñ‚±‚¤‚¿
+‚©‚ñ‚±‚¤‚¿‚傤
+‚©‚ñ‚±‚¤‚Ô‚Â
+‚©‚ñ‚±‚¤‚Ö‚ñ
+‚©‚ñ‚²‚­
+‚©‚ñ‚±‚‚¾‚Á‚½‚¢
+‚©‚ñ‚±‚Ç‚è
+‚©‚ñ‚²‚Ó
+‚©‚ñ‚±‚ñ‚»‚¤‚³‚¢
+‚©‚ñ‚³
+‚©‚ñ‚³‚¢
+‚©‚ñ‚³‚¢‚¿‚Ù‚¤
+‚©‚ñ‚´‚¢‚É‚ñ
+‚©‚ñ‚³‚©
+‚©‚ñ‚³‚­
+‚©‚ñ‚³‚µ‚Â
+‚©‚ñ‚³‚Â
+‚©‚ñ‚³‚Ô
+‚©‚ñ‚µ
+‚©‚ñ‚¶
+‚ª‚ñ‚¶[
+‚©‚ñ‚µ‚«
+‚ª‚ñ‚µ‚«
+‚©‚ñ‚¶‚¿‚傤
+‚©‚ñ‚µ‚Â
+‚ª‚ñ‚¶‚Â
+‚©‚ñ‚µ‚á
+‚©‚ñ‚¶‚á
+‚©‚ñ‚µ‚á‚­
+‚©‚ñ‚µ‚Ⴖ‚傤
+‚©‚ñ‚µ‚ã
+‚©‚ñ‚¶‚ã
+‚ª‚ñ‚µ‚イ
+‚©‚ñ‚µ‚å
+‚ª‚ñ‚µ‚å
+‚©‚ñ‚µ‚傤
+‚©‚ñ‚¶‚傤
+‚ª‚ñ‚µ‚傤
+‚©‚ñ‚¶‚傤‚©‚à‚­
+‚©‚ñ‚µ‚傤‚Ä‚«
+‚©‚ñ‚µ‚å‚­
+‚ª‚ñ‚µ‚å‚­
+‚©‚ñ‚µ‚ñ
+‚©‚ñ‚¶‚ñ
+‚©‚ñ‚·‚¢
+‚ª‚ñ‚·‚¢
+‚©‚ñ‚·‚¤‚¶
+‚©‚ñ‚¹‚¢
+‚©‚ñ‚º‚¢
+‚©‚ñ‚¹‚¢‚Æ‚¤
+‚ª‚ñ‚¹‚¢‚Ђ낤
+‚©‚ñ‚¹‚¢‚Ђñ
+‚ª‚ñ‚¹‚«
+‚©‚ñ‚¹‚‚¦‚ñ
+‚©‚ñ‚¹‚‚º‚¢
+‚©‚ñ‚¹‚‚Ă«
+‚©‚ñ‚¹‚ñ
+‚©‚ñ‚º‚ñ
+‚ª‚ñ‚º‚ñ
+‚©‚ñ‚»
+‚©‚ñ‚»‚¤
+‚©‚ñ‚¼‚¤
+‚©‚ñ‚»‚¤‚Ô‚ñ
+‚©‚ñ‚»‚ñ
+‚ª‚ñ‚¾[‚ç
+‚©‚ñ‚½‚¢
+‚©‚ñ‚¾‚¢
+‚©‚ñ‚½‚ׂè[
+‚©‚ñ‚½‚ñ
+‚©‚ñ‚¾‚ñ
+‚ª‚ñ‚½‚ñ
+‚©‚ñ‚¾‚ñ‚¯‚¢
+‚©‚ñ‚¿
+‚ª‚ñ‚¿‚­
+‚ª‚ñ‚¿‚イ
+‚©‚ñ‚¿‚傤
+‚©‚ñ‚Âß
+‚©‚ñ‚Ä‚¢
+‚ª‚ñ‚Ä‚¢
+‚©‚ñ‚Ä‚¢‚µ
+‚©‚ñ‚Ä‚ñ
+‚©‚ñ‚Å‚ñ‚¿
+‚©‚ñ‚Ç
+‚©‚ñ‚Æ‚¤
+‚©‚ñ‚Ç‚¤
+‚©‚ñ‚Æ‚¤‚¿‚Ù‚¤
+‚©‚ñ‚Ç‚¤‚Ý‚á‚­
+‚©‚ñ‚Æ‚­‚µ‚å
+‚©‚ñ‚Æ‚è[
+‚©‚ñ‚È
+‚©‚ñ‚È‚¢
+‚©‚ñ‚Ȃ«
+‚©‚ñ‚È‚ñ
+‚©‚ñ‚É‚ñ‚®
+‚©‚ñ‚Ê‚µ
+‚©‚ñ‚Ì‚¤
+‚©‚ñ‚Ì‚ñ
+‚©‚ñ‚Ï
+‚©‚ñ‚΂¢
+‚©‚ñ‚Ï‚­
+‚©‚ñ‚΂Â
+‚©‚ñ‚Ï‚É[
+‚©‚ñ‚Ï‚ñ
+‚ª‚ñ‚΂ñ
+‚©‚ñ‚Ñ
+‚©‚ñ‚Ò
+‚ª‚ñ‚Ò
+‚ª‚ñ‚Ñ‚ 
+‚©‚ñ‚҂傤
+‚©‚ñ‚Ô
+‚©‚ñ‚Õ
+‚©‚ñ‚Õ‚¤
+‚©‚ñ‚Õ‚«‚ñ
+‚©‚ñ‚Ô‚Â
+‚©‚ñ‚Ԃ‚¦
+‚©‚ñ‚Ô‚ñ
+‚ª‚ñ‚Ø‚«
+‚©‚ñ‚ׂ‚µ‚å
+‚©‚ñ‚Ø‚ñ
+‚©‚ñ‚Ú‚¤
+‚©‚ñ‚Û‚¤
+‚©‚ñ‚Ú‚¤‚¿‚傤‚©
+‚©‚ñ‚Û‚¤‚â‚­
+‚©‚ñ‚Û‚ñ
+‚ª‚ñ‚Û‚ñ
+‚ª‚ñ‚Ü
+‚ª‚ñ‚Ü‚¹‚ñ
+‚©‚ñ‚Ü‚Â
+‚©‚ñ‚Ü‚ñ
+‚©‚ñ‚Ý
+‚©‚ñ‚Ý‚ñ
+‚©‚ñ‚Þ‚è
+‚©‚ñ‚ß‚ñ
+‚ª‚ñ‚ß‚ñ
+‚ª‚ñ‚à‚­
+‚©‚ñ‚à‚ñ
+‚ª‚ñ‚â‚­
+‚©‚ñ‚䂤
+‚©‚ñ‚悤
+‚ª‚ñ‚ç‚¢
+‚©‚ñ‚ç‚­
+‚©‚ñ‚è
+‚ª‚ñ‚è
+‚©‚ñ‚è‚©
+‚©‚ñ‚è‚«‚å‚­
+‚©‚ñ‚肵‚Â
+‚©‚ñ‚肵‚å‚­
+‚©‚ñ‚肸
+‚©‚ñ‚è‚Â
+‚©‚ñ‚è‚Ä‚«
+‚©‚ñ‚è‚É‚ñ
+‚©‚ñ‚è‚Ô
+‚©‚ñ‚è‚á‚­
+‚©‚ñ‚è‚イ
+‚©‚ñ‚è‚傤
+‚ª‚ñ‚è‚傤
+‚©‚ñ‚è‚傤‚Ä‚«
+‚©‚ñ‚é‚¢
+‚©‚ñ‚ê‚¢‚º‚ñ‚¹‚ñ
+‚©‚ñ‚ê‚«
+‚©‚ñ‚ë
+‚©‚ñ‚ë‚­
+‚©‚ñ‚í
+ƒL
+‚«
+‚«
+ƒM
+‚¬
+‚¬
+‚«‚ ‚¢
+‚¬‚ ‚­
+‚«‚ ‚Â
+‚«‚ ‚‚¯‚¢
+‚¬‚ ‚ñ
+‚«‚¢
+‚«[
+‚«‚¢‚Æ
+‚«[‚Ï[
+‚«[‚Õ
+‚«[‚Ú[‚Ç
+‚«‚¢‚ë
+‚¬‚¢‚ñ
+‚«‚¤
+‚«‚¦‚ñ
+‚¬‚¦‚ñ‚«‚ñ
+‚«‚¨‚¢
+‚«‚¨‚¤
+‚«‚¨‚¤‚µ‚傤
+‚«‚¨‚­‚è‚å‚­
+‚«‚¨‚·‚­
+‚¬‚¨‚ñ
+‚«‚©
+‚«‚ª
+‚«‚©‚¢
+‚«‚ª‚¢
+‚¬‚©‚¢
+‚«‚©‚¢‚²
+‚«‚©‚«
+‚«‚©‚­
+‚«‚ª‚­
+‚«‚©‚­‚©
+‚«‚ª‚­‚©
+‚«‚©‚­‚ª‚©‚è
+‚«‚©‚­‚«‚å‚­
+‚«‚©‚­‚Ô
+‚«‚ª‚½
+‚«‚ª‚Á‚©
+‚«‚©‚Ë‚Â
+‚«‚ª‚Ü‚¦
+‚«‚ª‚邳
+‚«‚©‚ñ
+‚¬‚ª‚ñ
+‚«‚©‚ñ‚ª‚¢
+‚«‚©‚ñ‚µ
+‚«‚©‚ñ‚µ‚¦‚ñ
+‚«‚©‚ñ‚µ‚á
+‚«‚©‚ñ‚¶‚イ
+‚«‚«
+‚«‚«‚¢‚Á‚Ï‚Â
+‚«‚«‚¤‚Å
+‚«‚«‚©‚ñ
+‚«‚«‚¶‚傤‚¸
+‚«‚«‚ß
+‚«‚«‚イ
+‚«‚«‚傤
+‚«‚¬‚傤‚½‚¢
+‚¬‚«‚傤‚¾‚¢
+‚«‚¬‚傤‚Ê‚µ
+‚¬‚«‚å‚­
+‚«‚«‚킯
+‚«‚«‚ñ
+‚«‚«‚ñ‚¼‚­
+‚«‚®
+‚«‚­‚·‚¢
+‚«‚­‚«
+‚«‚­‚΂ñ
+‚«‚®‚ç‚¢
+‚«‚­‚ñ
+‚¬‚®‚ñ
+‚¬‚¯‚¢
+‚¬‚°‚¢
+‚«‚¯‚¢‚¶
+‚«‚°‚«
+‚«‚¯‚Â
+‚«‚¯‚ñ
+‚«‚°‚ñ
+‚«‚°‚ñ‚¬‚ê
+‚«‚¯‚ñ‚¹‚¢
+‚«‚°‚ñ‚º‚ñ
+‚«‚¯‚ñ‚Ô‚Â
+‚«‚¯‚ñ‚è‚Â
+‚«‚²
+‚«‚±‚¤
+‚¬‚±‚¤
+‚«‚±‚¤‚µ
+‚¬‚²‚­
+‚«‚±‚Â
+‚«‚±‚È‚µ
+‚«‚±‚ñ
+‚«‚±‚ñ‚µ‚á
+‚«‚³‚¢
+‚«‚´‚¢
+‚«‚³‚«
+‚«‚³‚­
+‚«‚³‚Ü
+‚«‚´‚Ý
+‚«‚³‚炬
+‚«‚µ
+‚«‚¶
+‚¬‚µ
+‚¬‚¶
+‚¬‚µ‚«
+‚«‚¶‚­
+‚¬‚µ‚¿‚傤
+‚«‚¶‚Â
+‚¬‚¶‚Ç‚¤
+‚«‚µ‚×
+‚«‚µ‚Ú‚¶‚ñ
+‚«‚µ‚à‚¶‚ñ
+‚«‚µ‚á
+‚«‚¶‚á‚­
+‚«‚¶‚ã
+‚¬‚µ‚ã
+‚«‚µ‚イ
+‚«‚¶‚イ‚«
+‚«‚µ‚ã‚­‚µ‚á
+‚«‚¶‚ã‚Â
+‚¬‚¶‚ã‚Â
+‚¬‚¶‚ã‚‚ª‚©‚è
+‚¬‚¶‚ã‚‚«‚å‚­
+‚¬‚¶‚ã‚‚µ‚Â
+‚¬‚¶‚ã‚‚µ‚á
+‚¬‚¶‚ã‚‚Ô
+‚«‚¶‚ã‚ñ
+‚«‚¶‚ã‚ñ‚ª‚­
+‚«‚¶‚å
+‚¬‚µ‚å
+‚«‚µ‚傤
+‚«‚¶‚傤
+‚¬‚¶‚傤
+‚¬‚µ‚傤‚´‚¢
+‚«‚µ‚傤‚¾‚¢
+‚«‚µ‚傤‚Ä‚ñ‚¯‚Â
+‚«‚µ‚å‚­
+‚¬‚¶‚ë‚­
+‚«‚µ‚ñ
+‚«‚¶‚ñ
+‚¬‚µ‚ñ
+‚¬‚¶‚ñ
+‚«‚¸
+‚«‚¸‚ ‚Æ
+‚«‚·‚¢
+‚«‚·‚¤
+‚«‚¸‚®‚¿
+‚«‚¸‚È
+‚«‚¹‚¢
+‚¬‚¹‚¢‚µ‚á
+‚«‚¹‚¢‚¿‚イ
+‚«‚¹‚¢‚Ђñ
+‚«‚¹‚«
+‚¬‚¹‚«
+‚«‚¹‚Â
+‚«‚¹‚‚ӂ¤
+‚¬‚º‚ñ
+‚«‚»
+‚«‚»‚¤
+‚«‚»‚­
+‚«‚¼‚­
+‚¬‚»‚­
+‚«‚»‚±‚¤‚¶‚å
+‚«‚»‚ñ
+‚«‚¼‚ñ
+‚«‚½
+‚¬‚½[
+‚«‚½‚¢
+‚«‚¾‚¢
+‚¬‚½‚¢
+‚«‚½‚¢‚¿
+‚«‚½‚©‚º
+‚«‚½‚ª‚í
+‚«‚½‚­
+‚«‚½‚®‚¿
+‚«‚½‚®‚É
+‚«‚½‚¯
+‚«‚½‚É‚Á‚Û‚ñ
+‚«‚½‚É‚Ù‚ñ
+‚«‚½‚Ì‚Ü‚é
+‚«‚½‚Í‚ñ‚«‚イ
+‚«‚½‚Ü‚¿
+‚¬‚¾‚䂤
+‚«‚¾‚ñ
+‚«‚¿‚ª‚¢
+‚«‚¿‚­
+‚«‚¿‚¶
+‚«‚¿‚¶‚Â
+‚«‚¿‚イ
+‚«‚¿‚å
+‚«‚¿‚傤
+‚«‚¿‚傤‚Ђñ
+‚«‚¿‚傤‚ß‚ñ
+‚«‚¿‚ê‚¢
+‚«‚¿‚ñ
+‚«‚‚¦‚ñ‚®
+‚«‚‚¨‚ñ
+‚«‚Á‚©
+‚«‚Á‚«‚傤
+‚«‚Á‚­
+‚«‚­‚è
+‚«‚‚¯
+‚«‚¯
+‚«‚Á‚±‚¤
+‚«‚Á‚³‚«
+‚«‚Á‚µ‚傤
+‚«‚Á‚·
+‚«‚Á‚·‚¢
+‚«‚Á‚»‚¤
+‚«‚¿
+‚«‚Á‚¿‚傤
+‚«‚Á‚¿‚ñ
+‚«‚Á‚Æ
+‚«‚ÂÈ
+‚«‚‚Ë
+‚«‚‚˂¢‚ë
+‚«‚Á‚Õ
+‚«‚Á‚Û‚¤
+‚«‚Ä‚¢
+‚«‚Ä‚¢‚¿
+‚«‚Ä‚«
+‚«‚Ä‚ñ
+‚«‚Å‚ñ
+‚¬‚Ä‚ñ
+‚«‚Æ
+‚«‚Ç
+‚«‚Æ‚¤
+‚«‚Ç‚¤
+‚«‚Ç‚¤‚µ‚á
+‚«‚Ç‚¤‚½‚¢
+‚«‚Æ‚­
+‚«‚Ç‚è
+‚«‚È‚¢
+‚«‚È‚±
+‚«‚È‚ñ
+‚¬‚É‚ 
+‚«‚É‚¿
+‚«‚Ê
+‚«‚Ê‚¢‚Æ
+‚«‚Ê‚ª‚³
+‚«‚Ê‚½
+‚«‚Ê‚à‚Ì
+‚«‚Ë
+‚«‚Ë‚Ü
+‚¬‚Ë‚ñ
+‚«‚Ë‚ñ‚Ð
+‚«‚Ë‚ñ‚Ñ
+‚«‚Ì‚¤
+‚¬‚Ì‚¤
+‚«‚Ì‚¦‚Ë
+‚«‚Ì‚±
+‚«‚Ì‚Ç‚­
+‚«‚Ì‚Ý
+‚«‚Î
+‚«‚΂­
+‚«‚Í‚¾
+‚«‚͂‚ä
+‚«‚Í‚ñ
+‚«‚΂ñ
+‚«‚Ñ
+‚«‚Ñ‚·
+‚«‚т傤
+‚«‚Ђñ
+‚¬‚Ó
+‚«‚Ó‚¤
+‚«‚Ó‚«‚ñ
+‚«‚Ó‚¶‚ñ
+‚«‚Ô‚Â
+‚¬‚Ó‚ñ
+‚«‚Ö‚¢
+‚«‚Ö‚«
+‚«‚ׂñ
+‚«‚Ú
+‚¬‚Ú
+‚«‚Ù‚¤
+‚¬‚Ù‚¤
+‚«‚Ú‚¤‚µ‚á
+‚«‚Ú‚Ë
+‚«‚Ú‚è
+‚«‚Ù‚ñ
+‚¬‚Ù‚ñ
+‚«‚Ù‚ñ‚«‚イ
+‚«‚Ü‚¦
+‚«‚Ü‚®‚ê
+‚«‚Ü‚¶‚ß
+‚«‚Ü‚Â
+‚«‚Ü‚Ü
+‚«‚Ý
+‚«‚Ý‚ª‚æ
+‚«‚Ý‚Â
+‚«‚Ý‚á‚­
+‚¬‚Ý‚ñ
+‚¬‚Þ
+‚«‚Þ‚·‚ß
+‚«‚ß
+‚«‚ß‚¢
+‚«‚ß‚Ä
+‚«‚à
+‚«‚à‚¤
+‚«‚à‚¿
+‚«‚à‚Ì
+‚«‚à‚ñ
+‚¬‚à‚ñ
+‚«‚á‚­
+‚«‚â‚­
+‚¬‚á‚­
+‚«‚á‚­‚ ‚µ
+‚«‚á‚­‚¢‚ñ
+‚¬‚á‚­‚¦‚ñ
+‚¬‚á‚­‚´‚â
+‚«‚á‚­‚µ‚á
+‚¬‚á‚­‚¶‚ã‚ñ
+‚¬‚á‚­‚µ‚ñ
+‚¬‚á‚­‚·‚¤
+‚«‚á‚­‚·‚¶
+‚¬‚á‚­‚¹‚¢
+‚«‚á‚­‚¹‚«
+‚«‚á‚­‚¹‚ñ
+‚«‚á‚­‚¾‚Ë
+‚«‚á‚­‚¿‚イ
+‚¬‚á‚­‚Ä
+‚¬‚á‚­‚Ó‚¤
+‚«‚á‚­‚Ù‚ñ
+‚«‚á‚­‚Ù‚ñ‚©
+‚«‚á‚­‚è‚å‚­
+‚«‚á‚·‚½
+‚«‚â‚·‚ß
+‚«‚Ⴝ‚Â
+‚«‚Ⴝ‚Ò‚ç
+‚¬‚á‚Á‚«‚傤
+‚«‚á‚Á‚±‚¤
+‚«‚á‚Á‚¿
+‚«‚á‚Á‚Õ
+‚¬‚á‚Á‚Õ
+‚«‚á‚Ñ‚Ë‚Á‚Æ
+‚«‚á‚Õ‚Ä‚ñ
+‚«‚á‚ׂÂ
+‚«‚á‚ç‚­‚½
+‚«‚á‚ç‚΂ñ
+‚¬‚á‚ç‚è
+‚¬‚á‚ç‚è[
+‚¬‚á‚ç‚ñ‚Ä‚¡[
+‚«‚â‚è
+‚«‚á‚è‚ 
+‚¬‚á‚ë‚Á‚Õ
+‚«‚á‚ñ‚Å‚¡
+‚«‚á‚ñ‚Å[
+‚«‚á‚ñ‚΂·
+‚«‚á‚ñ‚Ï‚·
+‚¬‚á‚ñ‚Ô‚é
+‚«‚á‚ñ‚Ø[‚ñ
+‚«‚イ
+‚«‚䂤
+‚¬‚イ
+‚¬‚䂤
+‚«‚イ‚ ‚­
+‚«‚イ‚©
+‚«‚イ‚©‚­
+‚«‚イ‚©‚´‚ñ
+‚«‚イ‚©‚ñ
+‚«‚イ‚¬
+‚«‚イ‚«‚イ
+‚«‚イ‚«‚イ‚µ‚á
+‚«‚イ‚«‚å
+‚«‚イ‚«‚傤
+‚«‚イ‚¬‚傤‚Ñ
+‚«‚イ‚«‚ñ
+‚«‚イ‚­‚Â
+‚«‚イ‚¯‚¢
+‚«‚イ‚¯‚Â
+‚«‚イ‚¯‚‚«
+‚«‚イ‚±‚¤
+‚«‚イ‚±‚¤‚¯‚ñ
+‚«‚イ‚±‚ñ
+‚«‚イ‚³‚­
+‚«‚イ‚µ
+‚¬‚イ‚µ
+‚¬‚イ‚¶
+‚«‚イ‚µ‚«
+‚«‚イ‚¶‚Â
+‚«‚イ‚µ‚ã
+‚«‚イ‚µ‚イ
+‚«‚イ‚¶‚ã‚Â
+‚«‚イ‚µ‚å
+‚«‚イ‚µ‚傤
+‚«‚イ‚¶‚傤
+‚«‚イ‚¶‚傽‚¢
+‚«‚イ‚¶‚ñ‚È‚ñ
+‚«‚イ‚µ‚ñ‚è‚å‚­
+‚«‚イ‚·
+‚«‚イ‚·‚¤
+‚«‚イ‚¹‚¢
+‚«‚イ‚¹‚¢‚µ‚ã
+‚«‚イ‚¹‚«
+‚«‚イ‚»‚­
+‚«‚イ‚½‚¢
+‚«‚イ‚¾‚ñ
+‚«‚イ‚¿
+‚«‚イ‚¿‚イ
+‚«‚イ‚¿‚傤
+‚«‚イ‚Ä‚¢
+‚«‚イ‚Å‚ñ
+‚«‚イ‚Æ‚¤
+‚«‚イ‚Ç‚¤
+‚¬‚イ‚É‚­
+‚¬‚イ‚ɂイ
+‚«‚イ‚Ë‚Â
+‚«‚イ‚Ë‚ñ
+‚«‚ã[‚Î
+‚¬‚イ‚Î
+‚«‚イ‚Í‚¢
+‚«‚イ‚΂ñ
+‚«‚ã[‚Ò[
+‚«‚イ‚Ò‚Á‚¿
+‚«‚ã[‚Ò‚Á‚Ç
+‚«‚イ‚Ñ‚ñ
+‚«‚イ‚Ó‚«‚ñ
+‚«‚イ‚Ô‚ñ
+‚¬‚イ‚Ù
+‚«‚イ‚Þ
+‚«‚イ‚ß‚¢
+‚«‚イ‚ß‚¢‚®
+‚«‚イ‚â‚­
+‚«‚イ‚䂤
+‚«‚イ‚悤
+‚«‚イ‚ç‚¢
+‚«‚イ‚ç‚­
+‚«‚イ‚è‚イ
+‚«‚イ‚è‚傤
+‚«‚イ‚ê‚«
+‚«‚å
+‚«‚傤
+‚«‚悤
+‚¬‚傤
+‚«‚傤‚ ‚­
+‚«‚傤‚¢
+‚«‚傤‚¢‚­‚©
+‚«‚傤‚¢‚­‚ª‚©‚è
+‚«‚傤‚¢‚­‚«‚å‚­
+‚«‚傤‚¢‚­‚µ‚á
+‚«‚傤‚¢‚­‚¿‚傤
+‚«‚傤‚¢‚­‚Ô
+‚«‚傤‚¢‚ñ
+‚«‚傤‚©
+‚«‚傤‚ª
+‚«‚傤‚©‚¢
+‚«‚傤‚ª‚¢
+‚¬‚傤‚©‚¢
+‚¬‚傤‚©‚¢‚µ
+‚«‚傤‚©‚¢‚¹‚ñ
+‚¬‚傤‚©‚­
+‚«‚傤‚©‚µ‚å
+‚«‚傤‚©‚ñ
+‚¬‚傤‚©‚ñ
+‚«‚傤‚«
+‚«‚傤‚¬
+‚¬‚傤‚¬
+‚«‚傤‚¬‚¶‚傤
+‚«‚傤‚«‚á‚­
+‚«‚傤‚«‚イ‚°‚ñ
+‚«‚傤‚«‚ñ
+‚«‚傤‚®‚¤
+‚«‚傤‚¯‚¢
+‚«‚傤‚¯‚ñ
+‚«‚傤‚¯‚ñ‚т傤
+‚«‚傤‚±‚¤
+‚«‚傤‚²‚¤
+‚«‚傤‚±‚¤‚®‚ñ
+‚«‚傤‚±‚­
+‚«‚傤‚±‚Â
+‚¬‚傤‚´
+‚«‚傤‚´‚¢
+‚¬‚傤‚³‚¢
+‚«‚傤‚³‚­
+‚«‚傤‚³‚ñ
+‚«‚傤‚³‚ñ‚Æ‚¤
+‚«‚傤‚µ
+‚«‚傤‚¶
+‚«‚傤‚µ‚Â
+‚¬‚傤‚µ‚á
+‚¬‚傤‚¶‚á
+‚«‚傤‚¶‚á‚­
+‚«‚傤‚¶‚ã
+‚¬‚傤‚µ‚ã
+‚«‚傤‚µ‚イ
+‚«‚傤‚¶‚ã‚‚µ‚å
+‚«‚傤‚¶‚ã‚ñ
+‚«‚傤‚µ‚å
+‚¬‚傤‚µ‚å
+‚«‚傤‚¶‚傤
+‚¬‚傤‚¶‚傤
+‚«‚傤‚µ‚å‚­
+‚«‚傤‚µ‚ñ
+‚«‚傤‚¶‚ñ
+‚«‚傤‚µ‚ñ‚´‚¢
+‚«‚傤‚µ‚ñ‚µ‚傤
+‚¬‚傤‚·‚¤
+‚«‚傤‚¹‚¢
+‚¬‚傤‚¹‚¢
+‚¬‚傤‚¹‚«
+‚«‚傤‚»
+‚«‚傤‚¼‚¤
+‚¬‚傤‚»‚¤
+‚«‚傤‚»‚¤‚«‚å‚­
+‚«‚傤‚»‚¤‚è‚Â
+‚«‚傤‚»‚¤‚è‚å‚­
+‚«‚傤‚¼‚ß
+‚«‚傤‚¾‚¢
+‚¬‚傤‚½‚¢
+‚«‚傤‚½‚­‚«‚ñ
+‚«‚傤‚¾‚ñ
+‚«‚傤‚¿
+‚«‚傤‚¿‚イ
+‚«‚傤‚¿‚傤
+‚«‚傤‚¿‚傤‚¹‚¢
+‚«‚傤‚‚¤‚²
+‚«‚傤‚‚¤‚Ä‚ñ
+‚«‚傤‚Ä‚¢
+‚«‚傤‚Ä‚«
+‚«‚傤‚Ä‚ñ
+‚«‚傤‚Æ
+‚«‚傤‚Ç
+‚«‚傤‚Æ‚¤
+‚«‚傤‚Ç‚¤
+‚«‚傤‚Ç‚¤‚½‚¢
+‚«‚傤‚Æ‚¤‚Ù
+‚«‚傤‚Ë‚ñ
+‚«‚傤‚Í‚ñ
+‚«‚傤‚Í‚ñ‚µ‚á
+‚«‚傤‚Ô
+‚«‚傤‚Ó‚¤
+‚«‚傤‚Ö‚¢
+‚«‚傤‚Ö‚ñ
+‚«‚傤‚ׂñ
+‚«‚傤‚Ù‚¤
+‚«‚傤‚Ú‚­
+‚«‚傤‚Ý
+‚«‚傤‚Ý‚µ‚ñ‚µ‚ñ
+‚«‚傤‚Þ
+‚¬‚傤‚Þ
+‚¬‚傤‚Þ‚©
+‚¬‚傤‚Þ‚«‚å‚­
+‚¬‚傤‚Þ‚µ‚Â
+‚¬‚傤‚Þ‚¶‚傤
+‚¬‚傤‚Þ‚Ô
+‚¬‚傤‚ނ悤
+‚«‚傤‚à‚ñ
+‚«‚傤‚â‚­
+‚«‚傤‚悤
+‚«‚傤‚è
+‚«‚傤‚è‚Â
+‚«‚傤‚è‚傤
+‚«‚傤‚è‚å‚­
+‚«‚傤‚è‚å‚­‚µ‚á
+‚«‚傤‚í
+‚«‚傤‚킹‚¢
+‚«‚傦‚¢
+‚«‚傦‚¢‚µ‚ñ
+‚¬‚傦‚ñ
+‚¬‚å[‚´
+‚«‚å‚©
+‚¬‚å‚©
+‚¬‚å‚©‚¢
+‚¬‚å‚©‚¢‚é‚¢
+‚«‚傪‚­
+‚¬‚å‚©‚­‚¾‚©
+‚«‚å‚©‚µ‚傤
+‚«‚å‚©‚ñ
+‚«‚傪‚ñ
+‚«‚催‚傤
+‚¬‚å‚«‚傤
+‚¬‚催‚傤
+‚«‚å‚«‚傶‚‚¶‚Â
+‚«‚å‚­
+‚¬‚å‚­
+‚¬‚å‚®
+‚«‚å‚­‚ª‚¢
+‚«‚å‚­‚¬
+‚«‚å‚­‚­‚È‚¢
+‚«‚å‚­‚°‚¢
+‚«‚å‚­‚°‚ñ
+‚¬‚å‚­‚´
+‚«‚å‚­‚¶
+‚«‚å‚­‚¶‚Â
+‚«‚å‚­‚µ‚å
+‚¬‚å‚­‚¹‚«
+‚«‚å‚­‚¹‚ñ
+‚«‚å‚­‚¿
+‚«‚å‚­‚¿‚傤
+‚«‚å‚­‚Ä‚ñ
+‚«‚å‚­‚Ç‚ß
+‚«‚å‚­‚È‚¢
+‚¬‚å‚­‚Í‚¢
+‚«‚å‚­‚΂ñ
+‚«‚å‚­‚Ó
+‚«‚å‚­‚Ô
+‚«‚å‚­‚Ù‚¤
+‚«‚å‚­‚à‚­
+‚«‚å‚­‚悤
+‚«‚å‚­‚è‚Â
+‚¬‚å‚­‚ë
+‚¬‚å‚­‚낤
+‚¬‚å‚®‚ñ
+‚¬‚傯‚¢
+‚«‚傱‚¤
+‚¬‚傱‚¤
+‚«‚傱‚­
+‚«‚傱‚ñ
+‚«‚債‚Â
+‚«‚傶‚Â
+‚¬‚債‚á
+‚«‚傶‚イ‚µ‚á
+‚«‚債‚å
+‚«‚債‚傤
+‚«‚傶‚傤
+‚¬‚債‚傤
+‚¬‚傶‚傤
+‚«‚債‚å‚­
+‚«‚傶‚ñ
+‚«‚債‚ñ‚½‚ñ‚©‚¢
+‚«‚å‚·‚¤
+‚«‚傹‚¢
+‚¬‚傹‚¢
+‚¬‚傹‚ñ
+‚«‚å‚»
+‚¬‚å‚»‚ñ
+‚«‚傽‚­
+‚¬‚傽‚­
+‚«‚傾‚‚©‚ñ
+‚«‚傾‚ñ
+‚«‚å‚Á‚¯‚¢
+‚«‚å‚Á‚±‚¤
+‚«‚å‚Æ‚¤
+‚«‚å‚Ç‚¤
+‚¬‚å‚Ç‚¤
+‚¬‚å‚É‚­
+‚«‚å‚Ë‚ñ
+‚«‚å‚Ð
+‚¬‚å‚Ð
+‚«‚å‚Ô
+‚¬‚å‚Ó
+‚¬‚å‚Ô‚Â
+‚¬‚å‚Ó‚Ì‚è
+‚«‚å‚Ô‚ñ
+‚«‚å‚Ù
+‚«‚å‚Ù‚¤
+‚«‚æ‚Ý‚¸
+‚¬‚å‚Ý‚ñ
+‚«‚å‚Þ
+‚«‚å‚ß‚¢
+‚¬‚å‚ß‚¢
+‚«‚å‚à‚¤
+‚¬‚å‚à‚¤
+‚«‚å‚悤‚è‚傤
+‚¬‚å‚ç‚¢
+‚«‚å‚è
+‚«‚å‚è‚©‚ñ
+‚¬‚å‚è‚傤
+‚¬‚å‚é‚¢
+‚«‚å‚ê‚¢
+‚«‚ç‚¢
+‚«‚ç‚­
+‚«‚è
+‚¬‚è
+‚«‚è‚©‚Ô
+‚«‚è‚«‚¸
+‚«‚è‚­‚¸
+‚«‚肱
+‚«‚肱‚¤‚¶‚傤
+‚«‚肳‚ß
+‚¬‚肵‚á
+‚«‚è‚·‚Æ
+‚«‚è‚·‚Æ‚«‚傤
+‚«‚肾‚µ
+‚«‚è‚ÂÜ
+‚«‚è‚Ç‚¨‚µ
+‚«‚è‚Ƃ肹‚ñ
+‚«‚è‚Í
+‚«‚è‚΂È
+‚«‚è‚Ó‚«
+‚«‚è‚Ó‚¾
+‚«‚è‚Ý
+‚«‚è‚à‚Ý
+‚«‚è‚イ
+‚«‚è‚傤
+‚¬‚è‚傤
+‚«‚è‚å‚­
+‚«‚è‚ñ
+‚¬‚é‚Ç
+‚¬‚ê‚¢
+‚«‚ꂶ
+‚«‚ê‚Â
+‚«‚ê‚Í‚µ
+‚«‚ê‚Ü
+‚«‚ê‚ß
+‚«‚ë
+‚«‚ë‚­‚µ
+‚«‚í
+‚¬‚í‚­
+‚«‚í‚Ý
+‚«‚í‚ß
+‚«‚í‚߂‚«
+‚«‚ñ
+‚¬‚ñ
+‚«‚ñ‚¢‚Â
+‚«‚ñ‚¢‚Á‚Õ‚¤
+‚«‚ñ‚¢‚ë
+‚¬‚ñ‚¢‚ë
+‚«‚ñ‚¢‚ñ
+‚«‚ñ‚©
+‚«‚ñ‚ª
+‚¬‚ñ‚©
+‚¬‚ñ‚ª
+‚«‚ñ‚©‚¢
+‚«‚ñ‚©‚¬‚å‚­‚¶‚å
+‚«‚ñ‚ª‚­
+‚¬‚ñ‚ª‚Ý
+‚«‚ñ‚ª‚í
+‚¬‚ñ‚ª‚í
+‚«‚ñ‚©‚ñ
+‚«‚ñ‚ª‚ñ
+‚«‚ñ‚«‚¿‚Ù‚¤
+‚«‚ñ‚«‚イ
+‚«‚ñ‚«‚傤
+‚«‚ñ‚«‚å‚è
+‚«‚ñ‚¬‚ñ
+‚«‚ñ‚­
+‚«‚ñ‚®
+‚«‚ñ‚¯‚¢
+‚«‚ñ‚¯‚ñ
+‚«‚ñ‚±
+‚«‚ñ‚±‚¤
+‚«‚ñ‚²‚¤
+‚¬‚ñ‚±‚¤
+‚¬‚ñ‚±‚¤‚¢‚ñ
+‚¬‚ñ‚±‚¤‚ß‚¢
+‚«‚ñ‚±‚Â
+‚¬‚ñ‚±‚ñ‚µ‚«
+‚«‚ñ‚³
+‚«‚ñ‚´
+‚«‚ñ‚´‚¢
+‚«‚ñ‚³‚­
+‚«‚ñ‚´‚ñ
+‚¬‚ñ‚´‚ñ
+‚«‚ñ‚¶
+‚«‚ñ‚¶‚¿
+‚«‚ñ‚µ‚Â
+‚«‚ñ‚¶‚Â
+‚«‚ñ‚¶‚‚¿‚イ
+‚«‚ñ‚¶‚Æ‚¤
+‚«‚ñ‚µ‚á
+‚«‚ñ‚µ‚ã‚Ђ傤
+‚«‚ñ‚¶‚å
+‚«‚ñ‚¶‚傤
+‚«‚ñ‚¶‚傤‚Ä‚Á‚Ø
+‚«‚ñ‚µ‚ñ
+‚«‚ñ‚·
+‚«‚ñ‚¹‚¢
+‚¬‚ñ‚¹‚¢
+‚¬‚ñ‚¹‚©‚¢
+‚«‚ñ‚¹‚«
+‚«‚ñ‚¹‚ñ
+‚«‚ñ‚»‚­
+‚«‚ñ‚¼‚­
+‚«‚ñ‚¾
+‚«‚ñ‚¾‚¢
+‚«‚ñ‚¿‚³‚ñ
+‚«‚ñ‚¿‚³‚ñ‚µ‚á
+‚«‚ñ‚¿‚á‚­
+‚«‚ñ‚¿‚イ
+‚«‚ñ‚Ä‚¢
+‚«‚ñ‚Ä‚«
+‚¬‚ñ‚Ä‚ñ
+‚«‚ñ‚Æ‚¤
+‚«‚ñ‚É‚­
+‚«‚ñ‚É‚­‚µ‚Â
+‚«‚ñ‚Ë‚ñ
+‚«‚ñ‚Î
+‚«‚ñ‚Ï‚¢
+‚¬‚ñ‚Ï‚­
+‚«‚ñ‚Ï‚Â
+‚¬‚ñ‚΂ñ
+‚«‚ñ‚Ò
+‚«‚ñ‚Ò‚ñ
+‚«‚ñ‚Õ‚ñ
+‚«‚ñ‚ׂñ
+‚«‚ñ‚Ú‚¤
+‚«‚ñ‚Ú‚µ
+‚«‚ñ‚Ù‚ñ‚¢
+‚¬‚ñ‚Ù‚ñ‚¢
+‚¬‚ñ‚Ü‚­
+‚«‚ñ‚Ý‚á‚­
+‚«‚ñ‚Þ‚³‚«
+‚«‚ñ‚ä
+‚«‚ñ‚䂤
+‚«‚ñ‚䂤‚¬‚傤
+‚«‚ñ‚悤
+‚«‚ñ‚悤‚Ñ
+‚¬‚ñ‚æ‚­
+‚«‚ñ‚ç‚¢
+‚«‚ñ‚è‚傤
+‚«‚ñ‚è‚å‚­
+‚«‚ñ‚è‚ñ
+‚¬‚ñ‚è‚ñ
+‚«‚ñ‚é‚¢
+‚«‚ñ‚ê‚¢
+‚¬‚ñ‚ê‚¢
+‚«‚ñ‚낤‚©
+‚«‚ñ‚낤‚ª‚©‚è
+‚«‚ñ‚낤‚«‚å‚­
+‚«‚ñ‚낤‚Ô
+ƒN
+‚­
+‚­
+ƒO
+‚®
+‚®‚ ‚¢
+‚®‚ ‚Ä‚Ü‚ç
+‚­‚¢[‚ñ
+‚­‚¢‚«
+‚­‚¢‚¯
+‚­‚¢‚µ‚ñ‚Ú‚¤
+‚­‚¢‚¸
+‚­‚¢‚Á‚­
+‚­‚¢‚à‚Ì
+‚­‚¤‚¢
+‚­‚¤‚¢‚«
+‚­‚¤‚©‚¢
+‚­‚¤‚©‚ñ
+‚­‚¤‚«
+‚­‚¤‚®‚ñ
+‚­‚¤‚±‚¤
+‚­‚¤‚µ‚á
+‚®‚¤‚·‚¤
+‚­‚¤‚¹‚«
+‚­‚¤‚º‚ñ
+‚®‚¤‚º‚ñ
+‚®‚¤‚¼‚¤
+‚­‚¤‚¿‚イ
+‚­[‚Å‚½
+‚­[‚Å‚½[
+‚­‚¤‚Å‚ñ
+‚­‚¤‚Ç‚¤
+‚­‚¤‚Í‚­
+‚­‚¤‚Ó‚­
+‚­[‚Ø
+‚­‚¤‚Ù‚¤
+‚­[‚Û‚ñ
+‚­[‚ç
+‚­[‚ç[
+‚®‚¤‚è‚å‚­
+‚­[‚é
+‚­‚¤‚ê‚¢
+‚­‚¤‚ë‚ñ
+‚®‚¤‚í
+‚­‚¦‚¢
+‚­‚¨[‚½[
+‚­‚§[‚Â
+‚­‚§‚è‚Ä‚¡[
+‚­‚©‚¢
+‚­‚©‚ñ
+‚­‚«
+‚­‚¬
+‚­‚¬‚Ê‚«
+‚­‚«‚傤
+‚­‚­
+‚­‚°
+‚®‚¯‚¢
+‚­‚³
+‚®‚³
+‚®‚³‚¢
+‚®‚´‚¢
+‚­‚³‚©‚è
+‚­‚³‚«
+‚­‚³‚Æ‚è
+‚­‚³‚Ì
+‚­‚³‚΂È
+‚­‚³‚Ü‚­‚ç
+‚­‚³‚à‚¿
+‚­‚³‚è
+‚­‚³‚킯
+‚­‚µ‚ª‚½
+‚­‚¶‚á‚­
+‚­‚¶‚イ
+‚­‚¶‚傤
+‚®‚µ‚傤
+‚­‚¶‚ç
+‚­‚·
+‚®‚¸
+‚­‚¸‚Ä‚Â
+‚­‚¸‚à‚¿
+‚­‚¸‚à‚Ì
+‚­‚¸‚ä
+‚­‚·‚è
+‚­‚·‚è‚ä‚Ñ
+‚­‚¹
+‚®‚¹‚¢
+‚­‚º‚Â
+‚­‚»
+‚®‚»‚­
+‚­‚¾
+‚®‚½‚¢
+‚­‚¾‚à‚Ì
+‚­‚¾‚ñ
+‚­‚¿
+‚®‚¿
+‚­‚¿‚ ‚½‚è
+‚­‚¿‚¦
+‚­‚¿‚©‚¸
+‚­‚¿‚­‚©‚ñ
+‚­‚¿‚®‚¹
+‚­‚¿‚®‚é‚Ü
+‚­‚¿‚·‚¤
+‚­‚¿‚½‚¦
+‚­‚¿‚Ñ
+‚­‚¿‚Ñ‚é
+‚­‚¿‚Ô‚è
+‚­‚¿‚ׂÉ
+‚­‚¿‚à‚Æ
+‚­‚¿‚â‚­‚»‚­
+‚­‚¿‚イ
+‚­‚¿‚傤
+‚­‚Â
+‚­‚‚¨‚Æ
+‚­‚Á‚«[
+‚­‚Á‚«‚ñ‚®
+‚­‚Á‚µ
+‚­‚‚µ‚½
+‚­‚‚¶‚å‚­
+‚­‚Á‚µ‚å‚ñ
+‚­‚Á‚¹‚‚è‚Â
+‚­‚‚Ăñ
+‚®‚Á‚Ç
+‚­‚‚í
+‚®‚Ä‚¢
+‚­‚Ä‚ñ
+‚®‚Æ‚¤
+‚­‚Ç‚­
+‚­‚È‚¢
+‚­‚È‚¢‚¿‚傤
+‚­‚É
+‚­‚É‚ª‚ç
+‚­‚É‚­
+‚­‚É‚®‚É
+‚­‚ɂׂÂ
+‚­‚É‚à‚Æ
+‚­‚Í‚¢
+‚­‚Ð
+‚­‚Ñ
+‚­‚Ñ‚©‚´‚è
+‚­‚Ñ‚«‚è
+‚­‚Ñ‚Ü‚«
+‚­‚Ñ‚í
+‚­‚Ô
+‚­‚Ô‚­‚è‚ñ
+‚­‚Ú‚¿
+‚­‚Ü
+‚®‚Ü‚¢
+‚­‚Ü‚Å
+‚­‚Ý
+‚­‚Ý‚ ‚¢
+‚­‚Ý‚ ‚¢‚¢‚ñ
+‚­‚Ý‚¢‚ñ
+‚­‚Ý‚ª‚µ‚ç
+‚­‚Ý‚©‚½
+‚­‚Ý‚½‚Ä‚µ‚«
+‚­‚Ý‚¿‚傤
+‚­‚Ý‚Í‚ñ
+‚­‚݂Ђà
+‚­‚Ý‚ñ
+‚­‚à
+‚­‚à‚Â
+‚­‚à‚ä‚«
+‚­‚à‚è
+‚®‚à‚ñ
+‚­‚â‚­‚µ‚å
+‚­‚ç
+‚­‚ç‚¢
+‚®‚ç‚¢
+‚­‚ç‚¢‚Ü‚Á‚­‚·
+‚­‚炤‚ñ
+‚®‚炤‚ñ‚Ç
+‚­‚ç‚­
+‚­‚炵‚Á‚­
+‚­‚ç‚·
+‚®‚ç‚·
+‚®‚炽‚ñ
+‚­‚ç‚Á‚©[
+‚®‚ç‚É‚ã[
+‚®‚ç‚Ñ‚ 
+‚®‚ç‚Ñ‚â
+‚­‚ç‚Ô
+‚®‚ç‚Ó
+‚®‚ç‚Ó‚¡‚Á‚­
+‚®‚ç‚Ó‚¡‚Á‚­‚·
+‚®‚ç‚Ü[
+‚®‚ç‚Þ
+‚­‚ç‚â‚Ý
+‚®‚ç‚ñ‚Ç
+‚®‚ç‚ñ‚Õ‚è
+‚­‚è‚ 
+‚­‚è‚ ‚°
+‚­‚è[‚È
+‚­‚è[‚Þ
+‚­‚è‚¢‚ê
+‚­‚è‚¢‚ê‚«‚ñ
+‚­‚è‚¢‚ë
+‚®‚è[‚ñ
+‚­‚肦‚¢‚Æ
+‚­‚è‚°
+‚­‚肱‚µ‚«‚ñ
+‚­‚肳‚°
+‚­‚è‚·‚½‚é
+‚­‚è‚·‚¿‚á‚ñ
+‚­‚è‚Â
+‚­‚è‚Á‚Õ
+‚­‚è‚É‚Á‚­
+‚®‚è‚É‚Á‚¶
+‚­‚è‚΂₵
+‚®‚è‚Þ
+‚­‚è‚â‚Ü
+‚®‚é
+‚­‚é[
+‚­‚é[‚´[
+‚®‚é[‚Õ
+‚­‚é‚Ü
+‚­‚é‚Ü‚¾‚¢
+‚­‚é‚Ü‚Ç‚ß
+‚­‚é‚Ý
+‚®‚é‚è
+‚­‚ê
+‚®‚ê[‚Õ
+‚­‚ê[‚Þ
+‚­‚ê[‚ñ
+‚­‚ꂶ‚Á‚Æ
+‚­‚ꂽ‚¯
+‚­‚ê‚È‚¢
+‚­‚ê‚Ï‚·
+‚­‚ê‚æ‚ñ
+‚­‚ë
+‚®‚ë
+‚­‚ë‚¢‚µ
+‚­‚낤
+‚­‚낤‚Æ
+‚®‚ë[‚΂é
+‚®‚ë[‚Ô
+‚­‚ë‚©‚Ý
+‚­‚낱‚°
+‚­‚낶
+‚­‚ë‚·
+‚®‚ë‚·
+‚­‚ë‚Á‚­
+‚­‚ë‚Ú‚µ
+‚­‚ë‚Ü‚­
+‚­‚ë‚Ü‚Â
+‚­‚ë‚â‚Ü
+‚­‚í
+‚­‚í‚¢‚ê
+‚­‚킽
+‚­‚ñ
+‚®‚ñ
+‚®‚ñ‚¢
+‚®‚ñ‚©
+‚®‚ñ‚©‚ñ
+‚®‚ñ‚«
+‚­‚ñ‚±‚¤
+‚®‚ñ‚±‚¤
+‚®‚ñ‚±‚­
+‚­‚ñ‚µ
+‚®‚ñ‚µ
+‚®‚ñ‚¶‚Ð
+‚­‚ñ‚µ‚ã
+‚®‚ñ‚¶‚ã
+‚®‚ñ‚µ‚イ
+‚­‚ñ‚µ‚ケ‚­
+‚­‚ñ‚µ‚傤
+‚®‚ñ‚µ‚傤
+‚®‚ñ‚¶‚ñ
+‚­‚ñ‚¹‚¢
+‚®‚ñ‚¹‚¢
+‚®‚ñ‚º‚¢
+‚®‚ñ‚¼‚¤
+‚®‚ñ‚½‚¢
+‚­‚ñ‚¾‚è
+‚®‚ñ‚Ä
+‚­‚ñ‚Ä‚ñ
+‚®‚ñ‚Æ‚¤
+‚®‚ñ‚΂¢
+‚®‚ñ‚Í‚Â
+‚­‚ñ‚Õ
+‚®‚ñ‚Ô
+‚®‚ñ‚Õ‚­
+‚­‚ñ‚Ý‚ñ
+‚­‚ñ‚ß‚¢
+‚®‚ñ‚à‚¤
+‚®‚ñ‚䂤
+‚®‚ñ‚䂤‚©‚Á‚«‚å
+‚®‚ñ‚悤
+‚®‚ñ‚ç‚­
+‚®‚ñ‚è‚Â
+‚®‚ñ‚ë‚ñ
+ƒP
+‚¯
+‚¯
+ƒQ
+‚°
+‚°
+‚¯‚ ‚È
+‚¯‚¢
+‚¯‚¢‚¢
+‚¯‚¢‚¦‚¢‚ª‚­
+‚¯‚¢‚¦‚¢‚µ‚á
+‚¯‚¢‚¦‚¢‚¶‚ñ
+‚¯‚¢‚¨‚ñ‚ª‚­
+‚¯‚¢‚©‚¢
+‚¯‚¢‚ª‚¢
+‚¯‚¢‚©‚­‚©
+‚¯‚¢‚©‚­‚ª‚©‚è
+‚¯‚¢‚©‚­‚«‚å‚­
+‚¯‚¢‚©‚­‚µ‚Â
+‚¯‚¢‚©‚­‚¹‚¢
+‚¯‚¢‚©‚­‚Ô
+‚¯‚¢‚©‚ñ
+‚¯‚¢‚«
+‚°‚¢‚¬
+‚¯‚¢‚«‚¿‚傤
+‚¯‚¢‚«‚å
+‚¯‚¢‚«‚ñ‚¼‚­
+‚¯‚¢‚­
+‚¯‚¢‚®
+‚¯‚¢‚²
+‚¯‚¢‚±‚¤
+‚¯‚¢‚±‚¤‚¬‚傤
+‚¯‚¢‚²‚¤‚«‚ñ
+‚¯‚¢‚±‚¤‚½‚¢
+‚¯‚¢‚±‚¤‚Æ‚¤
+‚¯‚¢‚±‚­
+‚¯‚¢‚´‚¢
+‚¯‚¢‚´‚¢‚©‚¢
+‚¯‚¢‚´‚¢‚ª‚­
+‚¯‚¢‚´‚¢‚«‚©‚­‚¿
+‚¯‚¢‚´‚¢‚ß‚ñ
+‚¯‚¢‚³‚Â
+‚¯‚¢‚³‚‚©‚ñ
+‚¯‚¢‚³‚‚µ‚å
+‚¯‚¢‚³‚‚¿‚傤
+‚¯‚¢‚³‚ñ
+‚¯‚¢‚³‚ñ‚«
+‚¯‚¢‚³‚ñ‚µ‚å
+‚¯‚¢‚³‚ñ‚Õ
+‚¯‚¢‚µ
+‚¯‚¢‚¶‚©
+‚¯‚¢‚µ‚«
+‚¯‚¢‚¶‚¶‚傤
+‚¯‚¢‚µ‚¿‚傤
+‚¯‚¢‚µ‚Â
+‚¯‚¢‚¶‚Ç‚¤‚µ‚á
+‚¯‚¢‚¶‚΂ñ
+‚°‚¢‚µ‚á
+‚¯‚¢‚µ‚イ
+‚°‚¢‚¶‚ã‚Â
+‚°‚¢‚¶‚ã‚‚©
+‚°‚¢‚¶‚ã‚‚³‚¢
+‚°‚¢‚µ‚ã‚ñ
+‚¯‚¢‚µ‚傤
+‚¯‚¢‚µ‚ñ
+‚¯‚¢‚¸
+‚¯‚¢‚·‚¢
+‚¯‚¢‚·‚¤
+‚¯‚¢‚¹‚¢
+‚¯‚¢‚¹‚«
+‚¯‚¢‚¹‚Â
+‚¯‚¢‚»
+‚¯‚¢‚¼‚¤
+‚¯‚¢‚½‚¢
+‚¯‚¢‚¾‚¢
+‚°‚¢‚¾‚¢
+‚¯‚¢‚½‚¢‚悤
+‚¯‚¢‚½‚­
+‚¯‚¢‚¿‚Â
+‚¯‚¢‚¿‚傤
+‚¯‚¢‚Ä‚¢
+‚¯‚¢‚Ä‚«
+‚¯‚¢‚Å‚ñ‚«
+‚¯‚¢‚Æ
+‚¯‚¢‚Ç
+‚°‚¢‚Æ‚¤
+‚°‚¢‚Ç‚¤
+‚°‚¢‚É‚ñ
+‚°‚¢‚Ì‚¤
+‚°‚¢‚Ì‚¤‚©‚¢
+‚°‚¢‚Ì‚¤‚¶‚ñ
+‚¯‚¢‚Î
+‚¯‚¢‚Í‚­
+‚¯‚¢‚΂Â
+‚¯‚¢‚Ð
+‚¯‚¢‚Ñ‚¢‚ñ
+‚¯‚¢‚Ђñ
+‚°‚¢‚Ђñ
+‚°‚¢‚Ђñ‚©‚ñ
+‚¯‚¢‚Ô
+‚°‚¢‚Ó‚¤
+‚¯‚¢‚Ô‚Ù
+‚¯‚¢‚Ú
+‚¯‚¢‚Ù‚¤
+‚¯‚¢‚Ú‚¤
+‚¯‚¢‚Ù‚¤‚«
+‚°‚¢‚ß‚¢
+‚¯‚¢‚à‚¤
+‚¯‚¢‚â‚­‚ª‚¢
+‚¯‚¢‚â‚­‚«‚ñ
+‚¯‚¢‚â‚­‚µ‚å
+‚¯‚¢‚ä
+‚¯‚¢‚悤
+‚¯‚¢‚悤‚Ç‚¤‚µ
+‚¯‚¢‚æ‚ñ
+‚¯‚¢‚ç‚ñ
+‚¯‚¢‚è
+‚¯‚¢‚è‚©
+‚¯‚¢‚肪‚©‚è
+‚¯‚¢‚肵
+‚¯‚¢‚è‚á‚­
+‚¯‚¢‚è‚イ
+‚¯‚¢‚è‚傤
+‚¯‚¢‚è‚ñ
+‚¯‚¢‚é‚¢
+‚¯‚¢‚ê‚«
+‚¯‚¢‚ê‚Â
+‚¯‚¢‚낤
+‚¯[
+‚¯[‚«
+‚°[‚¶
+‚¯[‚·
+‚°[‚Æ
+‚¯[‚Ô‚é
+‚¯‚¨‚è‚à‚Ì
+‚°‚©
+‚°‚©‚¢
+‚¯‚ª‚ê
+‚¯‚ª‚í
+‚°‚©‚ñ
+‚°‚«
+‚°‚«‚³‚­
+‚°‚«‚µ‚å
+‚°‚«‚¶‚傤
+‚°‚«‚µ‚å‚­
+‚°‚«‚µ‚ñ
+‚°‚«‚¾‚ñ
+‚°‚«‚‚¤
+‚°‚«‚Þ
+‚°‚«‚â‚­
+‚°‚«‚è‚イ
+‚°‚«‚è‚ñ
+‚°‚­‚¤
+‚°‚±
+‚¯‚²‚ñ
+‚°‚´
+‚°‚´‚¢
+‚¯‚µ
+‚°‚µ
+‚¯‚µ‚«
+‚¯‚µ‚²‚Þ
+‚¯‚µ‚¸‚Ý
+‚°‚¶‚ã‚ñ
+‚°‚¶‚å
+‚¯‚µ‚傤‚Ђñ
+‚¯‚µ‚ñ
+‚°‚·‚¢
+‚°‚·‚¢‚Ç‚¤
+‚°‚·‚Æ
+‚°‚»‚­
+‚¯‚½
+‚°‚½
+‚°‚¾‚ñ
+‚¯‚¿‚á‚Á‚Õ
+‚¯‚¿‚ñ‚Ú‚¤
+‚¯‚Â
+‚¯‚‚¢‚ñ
+‚¯‚‚¦‚«
+‚¯‚‚¦‚«‚ª‚½
+‚¯‚‚¦‚ñ
+‚°‚Á‚©
+‚¯‚Á‚©‚­
+‚°‚‚ª‚­
+‚°‚Á‚©‚ñ
+‚°‚Á‚©‚ñ‚µ
+‚¯‚Á‚«
+‚¯‚‚¬‚ ‚ñ
+‚¯‚Á‚«‚イ
+‚°‚Á‚«‚イ
+‚¯‚Á‚«‚å‚­
+‚°‚Á‚¯‚¢‚¶‚ã
+‚¯‚Á‚±‚¤
+‚°‚Á‚±‚¤
+‚¯‚Á‚±‚ñ
+‚¯‚Á‚±‚ñ‚µ‚«
+‚¯‚Á‚³‚­
+‚°‚Á‚³‚ñ
+‚¯‚Á‚µ
+‚°‚‚¶
+‚¯‚Á‚µ‚á
+‚°‚Á‚µ‚á
+‚°‚Á‚µ‚イ
+‚¯‚Á‚µ‚傤
+‚¯‚Á‚µ‚傤‚¹‚ñ
+‚¯‚Á‚µ‚å‚­
+‚°‚Á‚µ‚å‚­
+‚¯‚Á‚¹‚¢
+‚¯‚‚º‚¢
+‚¯‚Á‚¹‚«
+‚¯‚Á‚¹‚«‚µ‚á
+‚¯‚Á‚¹‚ñ
+‚¯‚‚¼‚­
+‚°‚Á‚½‚ñ
+‚¯‚‚¾‚ñ‚è‚å‚­
+‚¯‚Á‚¿‚傤
+‚¯‚Á‚¿‚ñ
+‚¯‚Á‚Ä‚¢‚΂ñ
+‚¯‚Á‚Ä‚ñ
+‚¯‚Á‚Æ‚¤‚µ‚å
+‚¯‚‚ɂ­
+‚¯‚Á‚Ï‚­
+‚¯‚‚΂ñ
+‚°‚Á‚Õ
+‚¯‚‚Ԃñ
+‚¯‚Á‚Ø‚«
+‚°‚Á‚Û‚¤
+‚¯‚‚ڂ¤‚µ‚傤
+‚¯‚‚܂­
+‚¯‚‚܂­‚¦‚ñ
+‚¯‚‚܂Â
+‚°‚‚܂Â
+‚°‚‚܂‚΂炢
+‚°‚‚߂ñ
+‚°‚‚悤
+‚°‚‚悤‚Ñ
+‚°‚‚è
+‚¯‚‚邢
+‚°‚‚ꂢ
+‚¯‚‚ë
+‚¯‚È‚Ý
+‚¯‚É‚ 
+‚¯‚É‚ñ
+‚¯‚Ê‚«
+‚°‚˂‚´‚¢
+‚¯‚Î
+‚¯‚Í‚¢
+‚¯‚т傤
+‚°‚Ђñ
+‚¯‚Ú‚è
+‚¯‚Þ‚µ
+‚¯‚Þ‚è
+‚¯‚à‚Ì
+‚°‚â
+‚¯‚ç‚¢
+‚¯‚è
+‚°‚è‚á‚­
+‚°‚è‚ç
+‚°‚é‚Ü‚ñ
+‚¯‚é‚ñ
+‚°‚ê‚ñ‚Å
+‚°‚ñ
+‚¯‚ñ‚ ‚ñ
+‚°‚ñ‚ ‚ñ
+‚¯‚ñ‚¢
+‚¯‚ñ‚¢‚´‚¢
+‚°‚ñ‚¢‚ñ
+‚¯‚ñ‚¤‚ñ
+‚°‚ñ‚¦‚¢
+‚¯‚ñ‚¦‚«
+‚°‚ñ‚¦‚«
+‚¯‚ñ‚¦‚ñ
+‚°‚ñ‚¨‚¤
+‚¯‚ñ‚¨‚©‚ñ
+‚°‚ñ‚¨‚ñ
+‚°‚ñ‚©
+‚°‚ñ‚ª
+‚¯‚ñ‚©‚¢
+‚¯‚ñ‚ª‚¢
+‚°‚ñ‚©‚¢
+‚°‚ñ‚ª‚¢
+‚°‚ñ‚©‚­
+‚¯‚ñ‚ª‚­‚µ‚á
+‚°‚ñ‚ª‚Á‚«
+‚°‚ñ‚©‚ñ
+‚¯‚ñ‚«
+‚¯‚ñ‚¬
+‚°‚ñ‚«
+‚°‚ñ‚¬
+‚¯‚ñ‚¬‚イ
+‚¯‚ñ‚«‚イ‚¢‚ñ
+‚¯‚ñ‚«‚イ‚©
+‚¯‚ñ‚«‚イ‚ª‚©‚è
+‚¯‚ñ‚«‚イ‚µ‚Â
+‚¯‚ñ‚«‚イ‚µ‚å
+‚¯‚ñ‚«‚イ‚¶‚å
+‚¯‚ñ‚«‚イ‚Ô
+‚°‚ñ‚«‚å
+‚°‚ñ‚«‚傤
+‚°‚ñ‚¬‚傤
+‚°‚ñ‚«‚ñ
+‚¯‚ñ‚®
+‚°‚ñ‚­‚ñ
+‚°‚ñ‚¯‚¢
+‚°‚ñ‚¯‚¢‚µ‚Â
+‚¯‚ñ‚°‚«
+‚°‚ñ‚°‚Â
+‚¯‚ñ‚°‚ñ
+‚°‚ñ‚²
+‚¯‚ñ‚±‚¤
+‚°‚ñ‚±‚¤
+‚°‚ñ‚²‚¤
+‚¯‚ñ‚±‚¤‚Ù‚¯‚ñ
+‚°‚ñ‚²‚ª‚­
+‚°‚ñ‚±‚­
+‚°‚ñ‚±‚Â
+‚°‚ñ‚±‚ñ
+‚¯‚ñ‚´‚¢
+‚°‚ñ‚´‚¢
+‚°‚ñ‚´‚¢‚¿
+‚°‚ñ‚´‚¢‚è‚傤
+‚¯‚ñ‚³‚©
+‚¯‚ñ‚³‚ª‚©‚è
+‚¯‚ñ‚³‚©‚ñ
+‚°‚ñ‚³‚­
+‚°‚ñ‚³‚­‚µ‚á
+‚¯‚ñ‚³‚µ‚Â
+‚¯‚ñ‚³‚‚©‚ñ
+‚¯‚ñ‚³‚‚¿‚傤
+‚¯‚ñ‚³‚Ô
+‚°‚ñ‚³‚ñ
+‚¯‚ñ‚µ
+‚¯‚ñ‚¶
+‚°‚ñ‚µ
+‚°‚ñ‚¶
+‚°‚ñ‚µ‚©‚­
+‚¯‚ñ‚µ‚«
+‚°‚ñ‚¶‚Â
+‚¯‚ñ‚¶‚á
+‚°‚ñ‚µ‚ã
+‚¯‚ñ‚µ‚イ
+‚¯‚ñ‚¶‚イ
+‚°‚ñ‚µ‚イ
+‚¯‚ñ‚µ‚イ‚©
+‚¯‚ñ‚µ‚イ‚ª‚©‚è
+‚¯‚ñ‚µ‚イ‚µ‚å
+‚°‚ñ‚¶‚イ‚µ‚å
+‚¯‚ñ‚µ‚イ‚Ô
+‚°‚ñ‚¶‚イ‚Ý‚ñ
+‚¯‚ñ‚¶‚ã‚Â
+‚°‚ñ‚¶‚ã‚Â
+‚°‚ñ‚µ‚å
+‚°‚ñ‚µ‚傤
+‚°‚ñ‚¶‚傤
+‚°‚ñ‚µ‚傤‚è‚Â
+‚°‚ñ‚µ‚å‚­
+‚°‚ñ‚µ‚è‚傤
+‚°‚ñ‚µ‚è‚å‚­
+‚°‚ñ‚µ‚è‚ñ
+‚¯‚ñ‚¶‚ñ
+‚°‚ñ‚¶‚ñ
+‚°‚ñ‚¸
+‚¯‚ñ‚·‚¢
+‚°‚ñ‚·‚¢
+‚°‚ñ‚·‚¢‚«
+‚°‚ñ‚·‚¢‚΂­
+‚°‚ñ‚·‚ñ
+‚°‚ñ‚¹
+‚¯‚ñ‚¹‚¢
+‚°‚ñ‚¹‚¢
+‚°‚ñ‚¹‚«
+‚¯‚ñ‚¹‚‚µ‚傤
+‚¯‚ñ‚¹‚‚¾‚¢‚¶‚ñ
+‚¯‚ñ‚º‚ñ
+‚°‚ñ‚¹‚ñ
+‚°‚ñ‚»
+‚¯‚ñ‚»‚¤
+‚°‚ñ‚»‚¤
+‚¯‚ñ‚¼‚¤‚Ô‚Â
+‚¯‚ñ‚¼‚­
+‚°‚ñ‚»‚ñ
+‚°‚ñ‚½‚¢
+‚°‚ñ‚¾‚¢
+‚¯‚ñ‚½‚¢‚©‚ñ
+‚¯‚ñ‚½‚¢‚«
+‚°‚ñ‚¾‚¢‚Á‚±
+‚°‚ñ‚¾‚¢‚΂ñ
+‚°‚ñ‚¿
+‚¯‚ñ‚¿‚­‚©
+‚¯‚ñ‚¿‚­‚µ
+‚°‚ñ‚¿‚イ
+‚°‚ñ‚¿‚å
+‚¯‚ñ‚¿‚傤
+‚°‚ñ‚¿‚傤
+‚°‚ñ‚Ä‚¢‚΂ñ
+‚¯‚ñ‚Ä‚Â
+‚°‚ñ‚Ä‚ñ
+‚°‚ñ‚Ç
+‚¯‚ñ‚Æ‚¤
+‚¯‚ñ‚Ç‚¤
+‚°‚ñ‚Æ‚¤
+‚°‚ñ‚Ç‚¤‚«
+‚°‚ñ‚Ç‚¤‚è‚å‚­
+‚°‚ñ‚Ç‚ª‚­
+‚¯‚ñ‚È‚¢
+‚¯‚ñ‚È‚ñ
+‚¯‚ñ‚É‚ñ
+‚°‚ñ‚É‚ñ
+‚°‚ñ‚Î
+‚¯‚ñ‚΂¢‚«
+‚°‚ñ‚΂­
+‚°‚ñ‚΂­‚µ‚傤
+‚°‚ñ‚Ï‚Â
+‚¯‚ñ‚΂ñ
+‚°‚ñ‚΂ñ
+‚¯‚ñ‚Ò
+‚¯‚ñ‚Ñ‚«‚傤
+‚¯‚ñ‚Ò‚Â
+‚°‚ñ‚҂傤
+‚¯‚ñ‚Ò‚ñ
+‚°‚ñ‚Ò‚ñ
+‚¯‚ñ‚Õ
+‚°‚ñ‚Ô‚ª‚ñ
+‚°‚ñ‚Ô‚Â
+‚°‚ñ‚Ô‚ñ
+‚¯‚ñ‚Ø‚¢
+‚°‚ñ‚Ø‚¢
+‚¯‚ñ‚Ø‚¢‚è‚Â
+‚¯‚ñ‚ׂÂ
+‚¯‚ñ‚Û
+‚°‚ñ‚Ú
+‚¯‚ñ‚Ú‚¤
+‚¯‚ñ‚Û‚¤
+‚°‚ñ‚Û‚¤
+‚¯‚ñ‚Ú‚¤‚µ‚傤
+‚¯‚ñ‚Û‚­
+‚°‚ñ‚Û‚ñ
+‚°‚ñ‚Ü‚¢
+‚¯‚ñ‚Ü‚­
+‚¯‚ñ‚Ý‚ñ
+‚¯‚ñ‚ß‚¢
+‚¯‚ñ‚ß‚ñ
+‚°‚ñ‚ß‚ñ
+‚°‚ñ‚â
+‚°‚ñ‚ä
+‚°‚ñ‚悤‚«
+‚¯‚ñ‚è
+‚°‚ñ‚è
+‚¯‚ñ‚è‚«‚ñ
+‚¯‚ñ‚肵‚å
+‚°‚ñ‚è‚イ
+‚¯‚ñ‚è‚å
+‚¯‚ñ‚è‚傤
+‚°‚ñ‚è‚傤
+‚¯‚ñ‚è‚å‚­
+‚¯‚ñ‚ë
+‚°‚ñ‚낤
+‚°‚ñ‚ë‚ñ
+ƒR
+‚±
+‚±
+ƒS
+‚²
+‚²
+‚±‚ 
+‚±‚ ‚´
+‚±‚ ‚Ý
+‚±‚ ‚ç
+‚²‚¢
+‚±‚¢‚¯
+‚±‚¢‚²‚±‚ë
+‚±‚¢‚µ
+‚±‚¢‚¶
+‚²‚¢‚¿‚Ç‚¤‚³‚Ü
+‚²‚¢‚Á‚Æ‚¤‚³‚Ü
+‚±‚¢‚Ê
+‚±‚¢‚Ñ‚Æ
+‚±‚¢‚Ô‚Ý
+‚±‚¢‚é
+‚±‚¢‚ñ
+‚±‚¢‚ñ‚ë‚Á‚©[
+‚±‚¤
+‚±‚¤‚ ‚Â
+‚±‚¤‚ ‚ñ
+‚±‚¤‚¢
+‚±‚¤‚¢‚«
+‚±‚¤‚¢‚µ‚Â
+‚±‚¤‚¢‚µ‚傤
+‚±‚¤‚¢‚Á‚Ä‚ñ
+‚±‚¤‚¢‚ñ‚µ‚傤
+‚±‚¤‚¤
+‚²‚¤‚¤
+‚±‚¤‚¤‚è‚傤
+‚±‚¤‚¤‚ñ
+‚±‚¤‚¤‚ñ‚«
+‚±‚¤‚¦‚¢
+‚±‚¤‚¦‚ñ
+‚±‚¤‚¦‚ñ‚©‚¢
+‚±‚¤‚¨
+‚±‚¤‚¨‚Â
+‚±‚¤‚¨‚ñ
+‚²‚¤‚¨‚ñ
+‚±‚¤‚©
+‚²‚¤‚©
+‚±‚¤‚©‚¢
+‚±‚¤‚ª‚¢
+‚²‚¤‚ª‚¢
+‚±‚¤‚©‚¢‚µ
+‚±‚¤‚©‚¢‚¼‚¤
+‚±‚¤‚©‚¢‚¼‚¤‚Ç
+‚±‚¤‚©‚ª‚­
+‚±‚¤‚©‚­
+‚±‚¤‚ª‚­
+‚²‚¤‚©‚­‚µ‚á
+‚±‚¤‚ª‚­‚µ‚ñ
+‚±‚¤‚ª‚­‚Ë‚ñ
+‚±‚¤‚ª‚­‚Ô
+‚±‚¤‚ª‚­‚ê‚«
+‚±‚¤‚©‚¹‚ñ
+‚±‚¤‚©‚ñ
+‚±‚¤‚ª‚ñ
+‚±‚¤‚©‚ñ‚«
+‚±‚¤‚©‚ñ‚µ‚ã
+‚±‚¤‚©‚ñ‚¶‚å
+‚±‚¤‚«
+‚±‚¤‚¬
+‚±‚¤‚«‚ ‚Â
+‚±‚¤‚«‚µ‚ñ
+‚±‚¤‚«‚Ì‚¤
+‚±‚¤‚«‚イ
+‚±‚¤‚«‚イ‚Ñ
+‚±‚¤‚«‚傤
+‚±‚¤‚¬‚傤
+‚±‚¤‚«‚傤‚ª‚­
+‚±‚¤‚«‚傤‚«‚å‚­
+‚±‚¤‚¬‚傤‚µ‚å
+‚±‚¤‚«‚傤‚Ô‚Â
+‚±‚¤‚¬‚傤‚悤
+‚±‚¤‚«‚ñ
+‚²‚¤‚«‚ñ
+‚±‚¤‚«‚ñ‚è
+‚±‚¤‚­
+‚±‚¤‚®
+‚±‚¤‚­‚¤
+‚±‚¤‚®‚¤
+‚±‚¤‚­‚¤‚Ñ‚ñ
+‚±‚¤‚­‚ñ
+‚±‚¤‚®‚ñ
+‚±‚¤‚¯‚¢
+‚±‚¤‚°‚¢
+‚±‚¤‚°‚¢‚©
+‚±‚¤‚¯‚¢‚µ‚á
+‚±‚¤‚¯‚‚ ‚Â
+‚±‚¤‚¯‚ñ
+‚±‚¤‚°‚ñ
+‚²‚¤‚¯‚ñ
+‚±‚¤‚¯‚ñ‚É‚ñ
+‚±‚¤‚±
+‚±‚¤‚²
+‚±‚¤‚²‚¤
+‚±‚¤‚±‚¤‚¬‚傤
+‚±‚¤‚±‚¤‚¹‚¢
+‚±‚¤‚±‚ª‚­
+‚±‚¤‚±‚­
+‚±‚¤‚±‚­‚©
+‚±‚¤‚±‚­‚ª‚©‚è
+‚±‚¤‚±‚­‚Ô
+‚±‚¤‚±‚Â
+‚±‚¤‚³
+‚±‚¤‚´
+‚±‚¤‚³‚¢
+‚±‚¤‚´‚¢
+‚±‚¤‚³‚¢‚©‚¢
+‚±‚¤‚³‚­‚µ‚å
+‚±‚¤‚³‚Â
+‚±‚¤‚³‚Ä‚ñ
+‚±‚¤‚³‚ñ
+‚±‚¤‚´‚ñ
+‚±‚¤‚µ
+‚±‚¤‚¶
+‚²‚¤‚µ‚ª‚¢‚µ‚á
+‚±‚¤‚¶‚ª‚©‚è
+‚±‚¤‚µ‚©‚ñ
+‚±‚¤‚µ‚«
+‚±‚¤‚¶‚«‚å‚­
+‚±‚¤‚¶‚­
+‚±‚¤‚µ‚¹‚¢
+‚±‚¤‚µ‚Â
+‚±‚¤‚¶‚Â
+‚²‚¤‚µ‚Â
+‚±‚¤‚µ‚Ç
+‚±‚¤‚¶‚Ô
+‚±‚¤‚µ‚á
+‚²‚¤‚µ‚á
+‚±‚¤‚µ‚Ⴓ‚¢
+‚±‚¤‚µ‚ã
+‚±‚¤‚µ‚イ
+‚±‚¤‚µ‚イ‚Å‚ñ‚í
+‚±‚¤‚µ‚イ‚Í
+‚±‚¤‚¶‚ã‚Â
+‚±‚¤‚¶‚ã‚ñ
+‚±‚¤‚¶‚å
+‚±‚¤‚µ‚傤
+‚±‚¤‚¶‚傤
+‚²‚¤‚µ‚傤
+‚²‚¤‚¶‚傤
+‚±‚¤‚¶‚傤‚¹‚ñ
+‚±‚¤‚¶‚傤‚¿‚傤
+‚±‚¤‚µ‚å‚­
+‚±‚¤‚µ‚ñ
+‚±‚¤‚¶‚ñ
+‚±‚¤‚µ‚ñ‚¶‚å
+‚±‚¤‚¶‚ñ‚Ô‚Â
+‚±‚¤‚µ‚ñ‚è‚傤
+‚±‚¤‚¸
+‚±‚¤‚¸‚¢
+‚±‚¤‚·‚¢‚¶‚ã‚ñ
+‚±‚¤‚·‚¢‚è‚傤
+‚±‚¤‚·‚¤
+‚±‚¤‚¸‚©
+‚±‚¤‚¹‚¢
+‚±‚¤‚¹‚¢‚µ‚傤
+‚±‚¤‚¹‚¢‚¾‚¢‚¶‚ñ
+‚±‚¤‚¹‚¢‚Ì‚¤
+‚±‚¤‚¹‚¢‚Ô‚Á‚µ‚Â
+‚±‚¤‚¹‚¢‚Ù‚¤
+‚±‚¤‚¹‚«
+‚±‚¤‚¹‚Â
+‚²‚¤‚¹‚Â
+‚±‚¤‚¹‚ñ
+‚±‚¤‚º‚ñ
+‚²‚¤‚¹‚ñ
+‚±‚¤‚»
+‚±‚¤‚»‚¤
+‚±‚¤‚¼‚¤
+‚±‚¤‚»‚­
+‚²‚¤‚¼‚­
+‚±‚¤‚»‚­‚«
+‚±‚¤‚»‚­‚Ç
+‚±‚¤‚»‚­‚Ç‚¤‚ë
+‚±‚¤‚»‚µ‚ñ
+‚±‚¤‚»‚Â
+‚±‚¤‚½‚¢
+‚²‚¤‚½‚¢
+‚±‚¤‚½‚¢‚µ
+‚±‚¤‚½‚¢‚¹‚¢
+‚±‚¤‚¾‚©
+‚±‚¤‚½‚­
+‚±‚¤‚¾‚ñ
+‚±‚¤‚¾‚ñ‚¶‚イ‚½
+‚±‚¤‚¿‚µ‚å
+‚±‚¤‚¿‚á
+‚±‚¤‚¿‚傤
+‚±‚¤‚¿‚傤‚©‚¢
+‚±‚¤‚¿‚傤‚è‚å‚­
+‚±‚¤‚¿‚ñ
+‚±‚¤‚‚¤
+‚±‚¤‚‚¤‚Ð
+‚±‚¤‚‚¤‚à‚¤
+‚±‚¤‚Ä‚¢
+‚±‚¤‚Ä‚¢‚Ô‚ ‚¢
+‚±‚¤‚Ä‚«‚µ‚ã
+‚±‚¤‚Ä‚Â
+‚±‚¤‚Ä‚ñ
+‚±‚¤‚Ç
+‚±‚¤‚Æ‚¤
+‚±‚¤‚Ç‚¤
+‚²‚¤‚Æ‚¤
+‚±‚¤‚Æ‚¤‚©
+‚±‚¤‚Æ‚¤‚ª‚Á‚±‚¤
+‚²‚¤‚Ç‚¤‚¿‚傤‚µ
+‚±‚¤‚Ç‚¤‚è‚å‚­
+‚±‚¤‚Æ‚­
+‚±‚¤‚Ç‚­‚è‚傤
+‚±‚¤‚Æ‚è
+‚±‚¤‚Æ‚è‚¢
+‚±‚¤‚È‚¢
+‚±‚¤‚È‚¢‚¦‚ñ
+‚±‚¤‚É‚ñ
+‚±‚¤‚Ë‚Â
+‚±‚¤‚˂‚Ð
+‚±‚¤‚Ë‚ñ
+‚±‚¤‚Ë‚ñ‚«
+‚±‚¤‚Ì‚¤
+‚±‚¤‚Í
+‚±‚¤‚Í‚¢
+‚±‚¤‚΂¢
+‚±‚¤‚΂¢‚©
+‚±‚¤‚΂¢‚ª‚©‚è
+‚±‚¤‚΂¢‚·‚¤
+‚±‚¤‚΂¢‚Ô
+‚±‚¤‚΂¢‚è‚å‚­
+‚±‚¤‚Í‚Â
+‚±‚¤‚Í‚ñ
+‚±‚¤‚΂ñ
+‚²‚¤‚Í‚ñ
+‚²‚¤‚΂ñ
+‚±‚¤‚Ð
+‚±‚¤‚Ñ
+‚±‚¤‚ЂÂ
+‚±‚¤‚Ђ傤
+‚±‚¤‚Ђñ
+‚±‚¤‚Ђñ‚µ‚Â
+‚±‚¤‚Ó
+‚±‚¤‚Ô
+‚±‚¤‚Ó‚¤
+‚±‚¤‚Ó‚­
+‚²‚¤‚Ó‚­
+‚±‚¤‚Ô‚Â
+‚±‚¤‚Ó‚ñ
+‚±‚¤‚Ô‚ñ
+‚±‚¤‚Ô‚ñ‚µ
+‚±‚¤‚Ô‚ñ‚µ‚å
+‚±‚¤‚Ö‚ñ
+‚²‚¤‚ׂñ
+‚²‚¤‚ׂñ‚ª‚¢‚µ‚á
+‚±‚¤‚Ù
+‚±‚¤‚Ú
+‚±‚¤‚Ù‚¤
+‚±‚¤‚Ú‚¤
+‚±‚¤‚Ù‚¤‚©
+‚±‚¤‚Ù‚¤‚ª‚©‚è
+‚±‚¤‚Ù‚¤‚«‚å‚­
+‚±‚¤‚Ù‚¤‚µ‚Â
+‚±‚¤‚Ù‚¤‚Ô
+‚±‚¤‚Ù‚­
+‚±‚¤‚Ú‚­
+‚±‚¤‚Ü
+‚±‚¤‚Ý
+‚±‚¤‚Ý‚Â
+‚±‚¤‚Ý‚á‚­
+‚±‚¤‚݂傤
+‚±‚¤‚Ý‚ñ
+‚±‚¤‚Ý‚ñ‚©‚ñ
+‚±‚¤‚Þ‚¢‚ñ
+‚±‚¤‚Þ‚©
+‚±‚¤‚Þ‚ª‚©‚è
+‚±‚¤‚Þ‚Ä‚ñ
+‚±‚¤‚Þ‚Ô
+‚²‚¤‚ß‚¢
+‚²‚¤‚ß‚¢‚ª‚¢‚µ‚á
+‚±‚¤‚à‚ñ
+‚±‚¤‚â
+‚±‚¤‚â‚­
+‚±‚¤‚â‚­‚·‚¤
+‚±‚¤‚䂤
+‚±‚¤‚䂤‚è‚ñ
+‚±‚¤‚悤
+‚±‚¤‚ç‚ñ
+‚±‚¤‚è
+‚²‚¤‚è
+‚±‚¤‚肬‚傤
+‚±‚¤‚肵‚傤
+‚±‚¤‚è‚Â
+‚±‚¤‚è‚Ü‚í‚è
+‚±‚¤‚è‚å‚­
+‚±‚¤‚ê‚¢
+‚±‚¤‚ê‚Â
+‚±‚¤‚ë
+‚±‚¤‚낤
+‚±‚¤‚낤‚¢
+‚±‚¤‚낤‚«‚傤
+‚±‚¤‚í‚ñ
+‚±‚¦
+‚²[
+‚±[‚·
+‚²[‚·‚Æ
+‚±[‚Ä‚¡‚ñ‚®
+‚±[‚Å‚¡‚ñ‚®
+‚±[‚Ç
+‚±[‚È
+‚±[‚Ð[
+‚±[‚Û
+‚±[‚Û‚ç‚·
+‚±[‚Û‚ê[‚µ‚å‚ñ
+‚±[‚ç
+‚±‚¨‚è
+‚±‚¨‚è‚´‚Æ‚¤
+‚²[‚é‚Å‚ñ
+‚±[‚é‚Ç
+‚²[‚é‚Ç
+‚²‚¨‚ñ‚±
+‚²‚©
+‚±‚ª‚¢‚µ‚á
+‚²‚©‚¢‚»‚¤
+‚²‚ª‚©‚è
+‚²‚ª‚­
+‚²‚ª‚­‚©
+‚±‚©‚°
+‚±‚©‚±[‚ç
+‚²‚©‚¼‚­
+‚±‚ª‚½
+‚±‚ª‚½‚«
+‚²‚ª‚Â
+‚²‚ª‚Á‚©
+‚²‚©‚Ä‚¢
+‚±‚ª‚Ë
+‚±‚©‚Ô
+‚±‚ª‚ç
+‚±‚ª‚炵
+‚±‚©‚ñ
+‚±‚ª‚ñ
+‚²‚©‚ñ
+‚²‚ª‚ñ
+‚²‚©‚ñ‚¹‚¢
+‚²‚©‚ñ‚悤
+‚±‚«
+‚²‚«
+‚²‚«‚°‚ñ‚悤
+‚±‚«‚´‚Ý
+‚±‚¬‚Á‚Ä
+‚±‚«‚á‚­‚»‚¤
+‚±‚«‚イ‚«
+‚±‚«‚傤
+‚²‚­
+‚²‚­‚¢
+‚±‚­‚¦‚¢
+‚±‚­‚¦‚«
+‚±‚­‚¨‚¤
+‚±‚­‚ª‚¢
+‚±‚­‚¬
+‚±‚­‚²
+‚±‚­‚±‚¤‚è‚Â
+‚±‚­‚³‚¢
+‚±‚­‚³‚¢‚©‚ñ
+‚±‚­‚³‚¢‚¹‚ñ
+‚±‚­‚³‚¢‚Ù‚¤
+‚±‚­‚³‚¢‚ê‚ñ‚²‚¤
+‚±‚­‚³‚­
+‚±‚­‚³‚ñ
+‚±‚­‚³‚ñ‚«
+‚±‚­‚³‚ñ‚µ‚á
+‚±‚­‚¶
+‚²‚­‚µ‚á
+‚±‚­‚µ‚å
+‚±‚­‚¶‚傤
+‚²‚­‚¶‚傤
+‚±‚­‚¶‚ñ
+‚±‚­‚º
+‚±‚­‚º‚¢
+‚±‚­‚º‚¢‚«‚å‚­
+‚±‚­‚º‚¢‚¿‚傤
+‚±‚­‚¹‚«
+‚±‚­‚¹‚ñ
+‚±‚­‚»‚¤
+‚±‚­‚½‚¢
+‚²‚­‚¿‚イ
+‚±‚­‚Ä‚¢
+‚±‚­‚Ä‚¢‚±‚¤‚¦‚ñ
+‚±‚­‚Ä‚Â
+‚±‚­‚Å‚ñ
+‚±‚­‚Ç
+‚±‚­‚Ç‚¤
+‚±‚­‚È‚¢
+‚±‚­‚È‚¢‚¹‚ñ
+‚±‚­‚Í‚­
+‚±‚­‚΂ñ
+‚±‚­‚Ð
+‚±‚­‚Ђñ
+‚±‚­‚Ó
+‚±‚­‚Ô‚ñ‚ª‚­
+‚±‚­‚ׂ‚µ‚«
+‚±‚­‚Ù
+‚±‚­‚Ù‚¤
+‚±‚­‚Ú‚¤
+‚±‚­‚Ú‚¤‚µ‚傤
+‚²‚­‚Ú‚»
+‚±‚­‚Ý‚ñ‚¹‚¢
+‚±‚­‚Þ
+‚±‚­‚Þ‚µ‚傤
+‚±‚­‚Þ‚¾‚¢‚¶‚ñ
+‚±‚­‚à‚Â
+‚±‚­‚䂤
+‚±‚­‚䂤‚Âǂ¤
+‚²‚­‚ç‚­
+‚±‚­‚è‚Â
+‚±‚­‚è‚‚±‚¤‚¦‚ñ
+‚±‚­‚è‚‚¾‚¢‚ª‚­
+‚±‚­‚è‚å‚­
+‚±‚­‚é‚¢
+‚±‚­‚ê‚ñ
+‚²‚­‚낤
+‚±‚¯
+‚²‚¯
+‚±‚¯‚¢
+‚²‚¯‚¢
+‚±‚°‚¿‚á
+‚±‚¯‚Â
+‚±‚¯‚ñ
+‚²‚¯‚ñ
+‚²‚°‚ñ
+‚²‚¯‚ñ‚±‚¤
+‚²‚¯‚ñ‚µ‚傤
+‚±‚±
+‚±‚²
+‚±‚±‚ 
+‚±‚±‚¤
+‚±‚²‚¤
+‚²‚±‚¤
+‚²‚±‚¤‚¢
+‚²‚±‚¤‚¬
+‚²‚±‚¤‚µ
+‚²‚±‚¤‚Í‚¢
+‚²‚±‚¤‚ç‚ñ
+‚±‚±‚­
+‚±‚±‚¿
+‚±‚²‚Æ
+‚±‚±‚Ì‚¦
+‚±‚±‚Ì‚©
+‚±‚±‚ë‚ ‚½‚è
+‚±‚±‚ë‚¢‚«
+‚±‚±‚ë‚¢‚ê
+‚±‚±‚낦‚ª‚¨
+‚±‚±‚낪‚Ü‚¦
+‚±‚±‚ë‚´‚µ
+‚±‚±‚낼‚¦
+‚±‚±‚ë‚­‚µ
+‚±‚±‚낯
+‚±‚±‚ë‚Âà‚è
+‚±‚±‚ë‚à‚¿
+‚±‚±‚ñ
+‚²‚±‚ñ‚¶‚傤
+‚²‚³
+‚²‚³‚¢
+‚±‚³‚ß
+‚±‚³‚ñ
+‚±‚´‚ñ
+‚²‚³‚ñ
+‚²‚³‚ñ‚¯
+‚±‚µ
+‚²‚µ
+‚²‚¶
+‚±‚¶‚¢‚ñ
+‚±‚µ‚¨
+‚±‚µ‚©‚¯
+‚±‚µ‚©‚½
+‚±‚µ‚«
+‚²‚µ‚«
+‚±‚µ‚½‚ñ‚½‚ñ
+‚±‚µ‚Â
+‚±‚¶‚Â
+‚²‚¶‚Â
+‚²‚µ‚Á‚­
+‚±‚¶‚Ü
+‚±‚µ‚ã
+‚²‚¶‚イ
+‚²‚¶‚イ‚¨‚ñ
+‚²‚¶‚イ‚¨‚ñ‚¶‚ã
+‚²‚¶‚イ‚¨‚ñ‚¸
+‚²‚¶‚イ‚µ‚å
+‚±‚¶‚イ‚Æ
+‚²‚µ‚ザ‚ñ
+‚±‚µ‚å
+‚²‚µ‚å
+‚±‚µ‚傤
+‚±‚¶‚傤
+‚²‚µ‚傤
+‚²‚µ‚悤
+‚±‚µ‚å‚­
+‚²‚µ‚å‚­
+‚±‚µ‚傹‚«
+‚±‚¶‚ñ
+‚²‚µ‚ñ
+‚±‚¶‚ñ‚³
+‚±‚·‚¢
+‚²‚·‚¤
+‚±‚¸‚¦
+‚±‚·‚¿‚ã[‚Þ
+‚±‚·‚Æ
+‚±‚·‚à‚·
+‚±‚·‚à‚ۂ肽‚ñ
+‚±‚¹‚¢
+‚²‚¹‚¢
+‚²‚¹‚¢‚¤‚ñ
+‚²‚¹‚¢‚¦‚¢
+‚²‚¹‚¢‚«‚イ
+‚²‚¹‚¢‚¬‚傤
+‚²‚¹‚¢‚µ‚傤
+‚±‚¹‚«
+‚±‚¹‚«‚Æ‚¤‚Ù‚ñ
+‚±‚º‚É
+‚²‚º‚ñ
+‚±‚¹‚ñ‚«‚傤
+‚±‚¹‚ñ‚¶‚傤
+‚²‚¹‚ñ‚¼
+‚²‚º‚ñ‚¿‚イ
+‚²‚¼‚¤‚ë‚Á‚Õ
+‚²‚»‚­‚낤
+‚±‚»‚Å
+‚²‚¼‚ñ‚¶
+‚±‚½‚¢
+‚±‚¾‚¢
+‚²‚½‚¢
+‚±‚½‚¦
+‚±‚¾‚©‚ç
+‚²‚½‚­
+‚²‚½‚²‚½
+‚²‚½‚µ‚傤
+‚±‚¾‚¿
+‚²‚¾‚Â
+‚±‚¾‚Ü
+‚²‚½‚悤‚¿‚イ
+‚²‚¾‚ñ‚©‚¢
+‚±‚¿
+‚²‚¿‚»‚¤
+‚²‚¿‚Á‚­
+‚±‚¿‚傤
+‚±‚¿‚ç
+‚±‚Â
+‚±‚Á‚©
+‚±‚Á‚©‚¢
+‚±‚©‚¢
+‚±‚Á‚©‚¢‚¬‚¢‚ñ
+‚±‚Á‚©‚­
+‚±‚Á‚©‚ñ
+‚±‚Á‚«
+‚±‚Á‚«‚傤
+‚±‚Á‚«‚è
+‚±‚Á‚­
+‚±‚Á‚¯‚¢
+‚±‚Á‚¯‚ñ
+‚²‚Á‚±
+‚±‚Á‚±‚¤
+‚²‚‚²‚¤
+‚±‚Á‚±‚­
+‚±‚Á‚µ
+‚±‚‚¸‚¢
+‚±‚Á‚¿
+‚±‚‚Ý
+‚±‚Á‚Æ‚¤
+‚±‚Á‚Æ‚ñ
+‚±‚‚ɂ­
+‚±‚Á‚Ï
+‚±‚‚΂ñ
+‚±‚Á‚Õ
+‚±‚‚܂­
+‚±‚Ä
+‚²‚Ä
+‚±‚Ä‚¢‚«‚á‚­
+‚±‚Ä‚¢‚¿‚傤
+‚±‚Ä‚«
+‚±‚Ä‚«‚½‚¢
+‚±‚Ä‚ñ
+‚²‚Ä‚ñ
+‚±‚Æ
+‚±‚Æ‚¤
+‚²‚Æ‚¤
+‚±‚Ç‚¤‚®
+‚²‚Æ‚¤‚¿‚á‚­
+‚±‚Ç‚­
+‚±‚Æ‚µ
+‚±‚Æ‚µ‚¶‚イ
+‚±‚Æ‚Î
+‚±‚Ƃ΂©‚¢
+‚±‚Æ‚Ô‚«
+‚±‚Ç‚à
+‚±‚Æ‚è
+‚±‚È
+‚±‚È‚Ý‚¶‚ñ
+‚±‚È‚Ý‚é‚­
+‚±‚È‚ä‚«
+‚±‚É‚à‚Â
+‚±‚É‚ñ‚¸‚¤
+‚±‚Ê‚Ü
+‚±‚Ë
+‚±‚Ë‚­‚½
+‚±‚Ë‚±
+‚±‚Ì‚ ‚¢‚¾
+‚±‚Ì‚¦
+‚±‚Ì‚±‚Æ
+‚±‚Ì‚½‚Ñ
+‚±‚Ì‚½‚ß
+‚±‚Ì‚Í
+‚±‚Ì‚Ü‚Ü
+‚²‚Î
+‚±‚΂¢
+‚±‚Í‚­
+‚²‚Í‚Á‚Ä‚ñ
+‚±‚΂È
+‚±‚΂Ȃµ
+‚±‚Í‚Î
+‚±‚Í‚é
+‚±‚΂é‚Æ
+‚±‚Í‚é‚Ñ‚æ‚è
+‚±‚΂ñ
+‚²‚Í‚ñ
+‚²‚΂ñ
+‚²‚Í‚ñ‚Ú‚¤
+‚±‚Ñ
+‚²‚Ñ
+‚±‚Ñ‚«
+‚²‚тイ
+‚±‚Ô
+‚²‚Ó
+‚²‚Ô
+‚²‚Ó‚­
+‚²‚Ô‚²‚Ô
+‚±‚Ô‚µ
+‚²‚Ó‚µ‚ñ
+‚±‚Ԃ‚µ‚傤
+‚±‚Ô‚Æ‚è
+‚±‚Ô‚Ë
+‚²‚Ó‚ß‚¢
+‚±‚Ô‚è
+‚±‚Ó‚ñ
+‚²‚Ó‚ñ
+‚²‚Ö‚¢
+‚±‚ׂÂ
+‚²‚ׂñ‚½‚Â
+‚²‚Ù‚¤
+‚²‚Ù‚¤‚µ
+‚²‚Ù‚¤‚Ë‚ñ
+‚±‚Ü
+‚²‚Ü
+‚±‚Ü[‚µ‚á‚肸‚Þ
+‚±‚Ü[‚µ‚á‚é
+‚±‚Ü‚¢
+‚±‚Ü‚¬‚ê
+‚±‚Ü‚­
+‚±‚Ü‚½
+‚±‚Ü‚¿
+‚±‚Ü‚Â
+‚±‚܂©‚¢
+‚±‚Ü‚à‚Ì
+‚±‚Ü‚ñ‚Ç
+‚±‚Ý
+‚±‚Ý‚¿
+‚±‚Ý‚Á‚­
+‚±‚Ý‚Ý
+‚±‚Ý‚ã‚É‚¯[‚µ‚å
+‚±‚Ý‚ã‚É‚Ä‚¡[
+‚±‚Þ
+‚²‚Þ
+‚±‚Þ‚¬
+‚±‚Þ‚¬‚±
+‚²‚Þ‚è
+‚±‚ß
+‚²‚ß‚¢‚í‚­
+‚±‚ß‚Å‚¡
+‚±‚ß‚Å‚¡[
+‚±‚ß‚Ê‚©
+‚±‚ß‚â
+‚±‚ß‚ñ
+‚²‚ß‚ñ
+‚²‚ß‚ñ‚È‚³‚¢
+‚²‚à‚­
+‚±‚à‚¶
+‚±‚à‚Ì
+‚±‚à‚ê‚Ñ
+‚±‚à‚ñ
+‚±‚à‚ñ‚¹‚ñ‚·
+‚±‚â
+‚±‚â‚­
+‚±‚â‚·
+‚±‚䂤‚ß‚¢‚µ
+‚±‚ä‚Ñ
+‚±‚æ‚¢
+‚±‚悤
+‚²‚悤
+‚²‚悤‚¨‚³‚ß
+‚²‚悤‚«‚«
+‚²‚悤‚Ä‚¢
+‚²‚悤‚Í‚¶‚ß
+‚²‚悤‚ß‚¢
+‚±‚æ‚Ý
+‚±‚ç‚¢
+‚²‚ç‚¢‚±‚¤
+‚²‚ç‚­
+‚±‚ç‚Þ
+‚±‚ç‚Þ‚É‚·‚Æ
+‚²‚ç‚ñ
+‚±‚è
+‚²‚è‚©‚¢
+‚²‚è‚Þ‚¿‚イ
+‚²‚è‚â‚­
+‚²‚è‚傤
+‚²‚è‚傤‚µ‚ñ
+‚²‚è‚傤‚É‚ñ
+‚±‚è‚傤‚è
+‚²‚è‚ç
+‚²‚è‚ñ
+‚±‚é‚¢
+‚±‚邹‚Á‚Æ
+‚²‚é‚Ó
+‚²‚é‚Ó‚Ÿ[
+‚²‚é‚Ó‚¶‚傤
+‚±‚é‚Ù[‚¸
+‚±‚ê
+‚±‚ê‚¢‚¶‚傤
+‚±‚ê‚·‚Ä‚ë[‚é
+‚±‚ê‚ç
+‚±‚ë
+‚±‚ë‚ ‚¢
+‚±‚낤
+‚²‚ë‚­
+‚±‚낵‚ ‚Þ
+‚±‚ë‚Á‚¯
+‚±‚ë‚È
+‚±‚ë‚É[
+‚±‚ë‚à
+‚±‚ë‚ñ
+‚±‚ë‚ñ‚Ô‚·
+‚±‚í‚¢‚ë
+‚±‚ñ
+‚±‚ñ‚¢
+‚±‚ñ‚©
+‚±‚ñ‚©‚¢
+‚±‚ñ‚©‚ñ
+‚±‚ñ‚«
+‚±‚ñ‚¬
+‚±‚ñ‚­
+‚±‚ñ‚­[‚é
+‚±‚ñ‚­‚è[‚Æ
+‚±‚ñ‚®‚ë‚Ü‚è‚Á‚Æ
+‚±‚ñ‚¯‚Â
+‚±‚ñ‚°‚Â
+‚±‚ñ‚°‚ñ
+‚±‚ñ‚²
+‚±‚ñ‚²‚¤
+‚±‚ñ‚±[‚·
+‚²‚ñ‚²‚Ç‚¤‚¾‚ñ
+‚±‚ñ‚³[‚Æ
+‚±‚ñ‚³‚¢
+‚±‚ñ‚³‚¢‚·
+‚±‚ñ‚³‚é‚Ä‚¡‚ñ‚®
+‚±‚ñ‚¶
+‚±‚ñ‚¶‚«
+‚±‚ñ‚¶‚á‚­
+‚±‚ñ‚µ‚イ
+‚±‚ñ‚µ‚ã[‚Ü[
+‚±‚ñ‚µ‚ã‚ñ
+‚±‚ñ‚µ‚ñ
+‚±‚ñ‚·‚½‚ñ‚Æ
+‚±‚ñ‚¹‚¢
+‚±‚ñ‚¹‚¢‚«
+‚±‚ñ‚¹‚«
+‚±‚ñ‚¹‚Â
+‚±‚ñ‚¹‚Õ‚Æ
+‚±‚ñ‚¹‚ñ‚Æ
+‚±‚ñ‚»[‚é
+‚±‚ñ‚½‚­‚Æ
+‚±‚ñ‚¾‚Ä
+‚±‚ñ‚¾‚ĂЂ傤
+‚±‚ñ‚½‚ñ
+‚±‚ñ‚¾‚ñ‚©‚¢
+‚±‚ñ‚¿‚イ
+‚±‚ñ‚Ä
+‚±‚ñ‚Ä‚¢
+‚±‚ñ‚Å‚¡‚µ‚å‚ñ
+‚±‚ñ‚Ä‚È
+‚±‚ñ‚Å‚ñ‚³
+‚±‚ñ‚Ç
+‚±‚ñ‚Ç‚¤
+‚±‚ñ‚Æ‚ç‚·‚Æ
+‚±‚ñ‚È‚ñ
+‚±‚ñ‚É‚¿
+‚±‚ñ‚É‚¿‚Í
+‚±‚ñ‚É‚¿‚í
+‚±‚ñ‚Ë‚ñ
+‚±‚ñ‚Ï
+‚±‚ñ‚Î[‚½
+‚±‚ñ‚Î[‚½[
+‚±‚ñ‚Î[‚Æ
+‚±‚ñ‚Ï‚¢‚ç
+‚±‚ñ‚Ï‚­‚Æ
+‚±‚ñ‚Ï‚·
+‚±‚ñ‚Ï‚É‚¨‚ñ
+‚±‚ñ‚΂ñ
+‚±‚ñ‚Ï‚ñ
+‚±‚ñ‚΂ñ‚Í
+‚±‚ñ‚΂ñ‚í
+‚±‚ñ‚Ñ
+‚±‚ñ‚Ñ‚È[‚Æ
+‚±‚ñ‚Ñ‚Ë[‚µ‚å‚ñ
+‚±‚ñ‚Ò‚ã[‚½
+‚±‚ñ‚Ô
+‚±‚ñ‚Õ‚ê‚Á‚­‚·
+‚±‚ñ‚Õ‚ê‚Á‚³
+‚±‚ñ‚Ø
+‚±‚ñ‚ׂ 
+‚±‚ñ‚ׂñ‚µ‚å‚ñ
+‚±‚ñ‚Û
+‚±‚ñ‚Û‚ñ
+‚±‚ñ‚à‚¤
+‚±‚ñ‚â
+‚±‚ñ‚è‚イ
+‚±‚ñ‚ê‚¢
+ƒT
+‚³
+‚³
+ƒU
+‚´
+‚³[‚©‚·
+‚³[‚«‚Á‚Æ
+‚³[‚­‚é
+‚³[‚¶
+‚³[‚Ç
+‚³[‚Î[
+‚³[‚Ñ‚·‚©
+‚³[‚Ñ‚·‚ª‚©‚è
+‚³[‚Ñ‚·‚«‚å‚­
+‚³[‚Ñ‚·‚Ô
+‚³[‚Ô
+‚³[‚Ó‚¥‚·
+‚³[‚Ú
+‚´‚¢
+‚³‚¢‚ ‚¢
+‚³‚¢‚ ‚­
+‚´‚¢‚ ‚­
+‚³‚¢‚¤‚æ‚­
+‚³‚¢‚¦‚ñ
+‚³‚¢‚¦‚ñ‚·
+‚´‚¢‚©
+‚³‚¢‚©‚¢
+‚³‚¢‚ª‚¢
+‚´‚¢‚©‚¢
+‚´‚¢‚ª‚¢
+‚³‚¢‚«
+‚³‚¢‚«‚å
+‚³‚¢‚«‚ñ
+‚³‚¢‚­‚é
+‚³‚¢‚­‚ñ
+‚´‚¢‚¯‚¢
+‚³‚¢‚°‚Â
+‚³‚¢‚¯‚ñ
+‚³‚¢‚°‚ñ
+‚³‚¢‚±
+‚³‚¢‚²
+‚³‚¢‚±‚¤
+‚´‚¢‚²‚¤
+‚³‚¢‚±‚¤‚«‚イ
+‚³‚¢‚±‚¤‚³‚¢
+‚³‚¢‚±‚¤‚¿‚傤
+‚³‚¢‚±‚­
+‚³‚¢‚±‚낶[
+‚³‚¢‚³‚«
+‚³‚¢‚³‚ñ
+‚´‚¢‚³‚ñ
+‚³‚¢‚³‚ñ‚³‚¢‚µ
+‚³‚¢‚µ
+‚³‚¢‚¶‚«
+‚³‚¢‚¶‚Â
+‚´‚¢‚µ‚Â
+‚³‚¢‚µ‚イ
+‚³‚¢‚µ‚イ‚©‚¢
+‚³‚¢‚µ‚イ‚Ñ
+‚³‚¢‚µ‚イ‚Ñ‚ñ
+‚³‚¢‚µ‚å
+‚³‚¢‚¶‚å
+‚´‚¢‚µ‚å
+‚³‚¢‚µ‚傤
+‚³‚¢‚¶‚傤
+‚´‚¢‚¶‚傤
+‚³‚¢‚¶‚傤‚©‚¢
+‚³‚¢‚µ‚傤‚°‚ñ
+‚³‚¢‚µ‚傤‚¿
+‚³‚¢‚µ‚å‚­
+‚´‚¢‚µ‚å‚­‚¿‚イ
+‚³‚¢‚µ‚ñ
+‚³‚¢‚µ‚ñ‚ª‚½
+‚³‚¢‚µ‚ñ‚©‚ñ
+‚³‚¢‚¸
+‚´‚¢‚¹‚¢
+‚³‚¢‚¹‚¢‚«
+‚³‚¢‚¹‚ñ
+‚³‚¢‚º‚ñ
+‚³‚¢‚º‚ñ‚¹‚ñ
+‚³‚¢‚¹‚ñ‚½‚ñ
+‚³‚¢‚½
+‚³‚¢‚¾[
+‚³‚¢‚¾‚¢
+‚³‚¢‚¾‚¢‚«‚イ
+‚³‚¢‚¾‚¢‚°‚ñ
+‚³‚¢‚½‚¢‚µ‚á
+‚³‚¢‚¾‚¢‚¿
+‚³‚¢‚¾‚ñ
+‚´‚¢‚¾‚ñ
+‚³‚¢‚¾‚ñ‚«
+‚´‚¢‚¾‚ñ‚Ù‚¤‚¶‚ñ
+‚³‚¢‚¿
+‚³‚¢‚¿‚イ
+‚³‚¢‚¿‚傤
+‚³‚¢‚Ä‚¢‚°‚ñ
+‚³‚¢‚Ä‚«
+‚´‚¢‚Ä‚­
+‚³‚¢‚Ä‚ñ
+‚³‚¢‚Å‚ñ
+‚³‚¢‚Ç
+‚³‚¢‚Æ‚è
+‚³‚¢‚È‚ñ‚½‚ñ
+‚³‚¢‚ɂイ
+‚´‚¢‚É‚ñ
+‚³‚¢‚Ë‚ñ‚µ‚傤
+‚³‚¢‚Ë‚ñ‚¿‚傤
+‚³‚¢‚Ì‚¤
+‚´‚¢‚΂Â
+‚³‚¢‚΂ñ‚©‚ñ
+‚³‚¢‚΂ñ‚µ‚å
+‚³‚¢‚Ð
+‚³‚¢‚Ó
+‚³‚¢‚Ô
+‚³‚¢‚Ô‚Â
+‚´‚¢‚Ô‚Â
+‚³‚¢‚Ú‚¤
+‚´‚¢‚Ù‚¤
+‚³‚¢‚Ù‚­‚½‚ñ
+‚³‚¢‚Ü‚Â
+‚³‚¢‚Ý‚ñ
+‚³‚¢‚Ý‚ñ‚¶‚ã‚Â
+‚³‚¢‚Þ
+‚´‚¢‚Þ‚©
+‚´‚¢‚Þ‚ª‚©‚è
+‚´‚¢‚Þ‚«‚å‚­
+‚³‚¢‚Þ‚µ‚á
+‚´‚¢‚Þ‚Ô
+‚´‚¢‚ß‚¢
+‚³‚¢‚à‚­
+‚³‚¢‚â‚­
+‚´‚¢‚ç‚¢
+‚³‚¢‚è‚á‚­
+‚´‚¢‚è‚傤
+‚´‚¢‚è‚傤‚Ð
+‚´‚¢‚è‚å‚­
+‚³‚¢‚é‚¢
+‚³‚¢‚ê‚ñ
+‚³‚¢‚ê‚ñ‚Æ
+‚³‚¢‚í‚¢
+‚³‚¤‚·
+‚³‚¤‚È‚Ô‚ë
+‚³‚¤‚ñ‚Ç
+‚³‚¦
+‚³‚¨
+‚³‚¨‚¾‚¯
+‚³‚¨‚Æ‚ß
+‚³‚©
+‚³‚©‚¢
+‚³‚©‚¦
+‚³‚©‚«
+‚³‚©‚®‚ç
+‚³‚©‚³
+‚³‚©‚³‚Ü
+‚³‚ª‚µ‚à‚Ì
+‚³‚©‚¸‚«
+‚³‚©‚«
+‚³‚©‚Ä
+‚³‚©‚È
+‚³‚©‚È‚â
+‚´‚ª‚Ë
+‚³‚©‚Î
+‚³‚©‚Ý‚¿
+‚³‚©‚â
+‚³‚©‚ä‚ß
+‚³‚©‚è‚Î
+‚³‚©‚ñ
+‚³‚ª‚ñ
+‚³‚«
+‚³‚¬
+‚³‚«‚²‚ë
+‚³‚«‚´‚«
+‚³‚«‚¯
+‚³‚«‚Ù‚Ç
+‚³‚«‚à‚Ì
+‚³‚«‚イ
+‚³‚«‚ä‚«
+‚´‚«‚傤
+‚´‚¬‚傤
+‚³‚¬‚傤‚¢‚ñ
+‚³‚¬‚傤‚¬
+‚³‚¬‚傤‚µ‚å
+‚³‚¬‚傤‚Î
+‚³‚¬‚傤‚Ó‚­
+‚³‚¬‚傤‚è‚傤
+‚³‚«‚ñ
+‚³‚­‚¢
+‚³‚­‚¢‚ñ
+‚³‚­‚ª‚ç
+‚³‚­‚³‚ñ
+‚³‚­‚µ
+‚³‚­‚¶
+‚³‚­‚µ‚©
+‚³‚­‚µ‚á
+‚³‚­‚µ‚イ
+‚³‚­‚µ‚ã‚ñ
+‚³‚­‚¹‚·
+‚³‚­‚¹‚ñ
+‚³‚­‚¿‚イ
+‚³‚­‚‚¯
+‚³‚­‚Æ‚¤
+‚³‚­‚Ç‚¤
+‚³‚­‚Ë‚ñ
+‚³‚­‚Ë‚ñ‚Ç
+‚³‚­‚΂ñ
+‚³‚­‚Ђñ
+‚³‚­‚Ђñ‚Ä‚ñ
+‚³‚­‚à‚Â
+‚³‚­‚â
+‚³‚­‚â‚­
+‚³‚­‚ç
+‚³‚­‚炪‚¢
+‚³‚­‚ç‚»‚¤
+‚³‚­‚ç‚ß‚ñ‚Æ
+‚³‚¯
+‚³‚¯‚©‚·
+‚³‚¯‚Ä‚ñ
+‚³‚¯‚ß
+‚³‚°‚ñ
+‚´‚±
+‚´‚±‚¤
+‚´‚±‚Â
+‚³‚±‚ñ
+‚³‚³
+‚³‚´‚È‚Ý
+‚³‚³‚Í‚ç
+‚³‚³‚Ý
+‚³‚´‚ñ
+‚³‚µ
+‚³‚¶
+‚³‚µ‚ ‚µ
+‚³‚µ‚¦
+‚³‚µ‚¨‚³‚¦
+‚³‚µ‚ª‚Ë
+‚³‚¶‚«
+‚³‚µ‚±
+‚³‚µ‚±‚Ý
+‚³‚µ‚³‚í‚è
+‚³‚µ‚¾‚µ‚É‚ñ
+‚³‚µ‚Ђ«
+‚³‚µ‚Ý
+‚³‚µ‚à‚Ç‚µ
+‚³‚¶‚ã‚Â
+‚´‚µ‚傤
+‚³‚µ‚킽‚µ
+‚³‚¶‚ñ
+‚³‚·
+‚´‚·
+‚³‚·‚ª
+‚´‚¼‚¤
+‚³‚»‚è
+‚³‚½[‚ñ
+‚´‚½‚­
+‚³‚½‚Å[
+‚³‚¾‚ß
+‚³‚½‚ñ
+‚³‚¿
+‚´‚¿‚傤
+‚³‚Â
+‚´‚Â
+‚³‚‚¢
+‚³‚‚¦‚¢‚«
+‚´‚‚¦‚«
+‚³‚Á‚©
+‚´‚Á‚©
+‚³‚Á‚©[
+‚³‚Á‚©‚­
+‚´‚‚ª‚­
+‚´‚Á‚©‚µ‚傤
+‚´‚Á‚©‚ñ
+‚³‚‚«
+‚³‚‚«‚΂ê
+‚´‚Á‚«‚イ
+‚´‚Á‚«‚å
+‚³‚Á‚«‚å‚­‚©
+‚´‚Á‚«‚ñ
+‚´‚Á‚¯‚ñ
+‚³‚Á‚±‚ñ
+‚³‚Á‚µ
+‚´‚Á‚µ
+‚´‚‚¶
+‚´‚Á‚µ‚ã
+‚´‚Á‚µ‚イ‚ɂイ
+‚³‚‚¶‚ñ
+‚´‚Á‚»‚¤
+‚´‚Á‚»‚­
+‚³‚Á‚»‚´‚¢
+‚´‚Á‚½
+‚³‚‚½‚Î
+‚³‚Á‚¿‚á‚ñ
+‚³‚Á‚¿‚イ‚´‚¢
+‚³‚Á‚Ï‚ñ
+‚´‚Á‚Ò
+‚´‚‚Þ
+‚´‚‚悤
+‚³‚Ä‚Â
+‚³‚Æ
+‚³‚Æ‚¤
+‚³‚Æ‚¨‚â
+‚³‚Æ‚²
+‚³‚Æ‚²‚±‚ë
+‚³‚Æ‚Ñ‚Æ
+‚³‚Æ‚è
+‚³‚È‚¦
+‚³‚È‚¬
+‚³‚Í
+‚³‚Î
+‚³‚΂­
+‚³‚Í‚ñ‚¶
+‚³‚΂ñ‚È
+‚³‚Ñ
+‚³‚Ñ‚Ç‚ß
+‚³‚Ô
+‚³‚Ó‚Ÿ‚è
+‚´‚Ô‚Æ‚ñ
+‚³‚Õ‚ç‚¢
+‚³‚Ô‚é[‚¿‚ñ
+‚³‚Ô‚ñ
+‚³‚Ö‚ñ
+‚³‚Ú‚¤
+‚³‚Ü
+‚³‚Ü[
+‚³‚Ü‚³‚Ü
+‚³‚Ý‚¾‚ê
+‚³‚Ý‚Á‚Æ
+‚³‚Þ
+‚³‚Þ‚³
+‚³‚Þ‚´‚Þ
+‚³‚Þ‚ç‚¢
+‚³‚ß
+‚³‚ß‚Í‚¾
+‚³‚â
+‚³‚ä
+‚³‚æ‚­
+‚³‚ç
+‚³‚ç‚¢‚Ë‚ñ
+‚³‚ç‚«‚ñ
+‚³‚炳
+‚³‚炵
+‚³‚炵‚±
+‚³‚ç‚è[‚Ü‚ñ
+‚³‚é
+‚³‚邪‚­
+‚³‚é‚À‚¦
+‚³‚é‚Ü‚½
+‚³‚ë‚ñ
+‚³‚í
+‚³‚ñ
+‚´‚ñ
+‚³‚ñ‚¢
+‚³‚ñ‚¢‚ñ
+‚³‚ñ‚©
+‚³‚ñ‚ª
+‚³‚ñ‚©‚¢
+‚´‚ñ‚ª‚¢
+‚³‚ñ‚ª‚©‚è
+‚³‚ñ‚©‚­
+‚³‚ñ‚ª‚­
+‚´‚ñ‚ª‚­
+‚³‚ñ‚©‚­‚¯‚¢
+‚³‚ñ‚©‚­‚·
+‚³‚ñ‚ª‚Â
+‚³‚ñ‚©‚Á‚¯‚¢
+‚³‚ñ‚ª‚É‚¿
+‚³‚ñ‚©‚ñ
+‚³‚ñ‚©‚ñ‚¨‚¤
+‚³‚ñ‚©‚ñ‚µ‚¨‚ñ
+‚³‚ñ‚©‚ñ‚Ñ
+‚³‚ñ‚«
+‚³‚ñ‚¬
+‚³‚ñ‚¬‚¢‚ñ
+‚³‚ñ‚«‚á‚­
+‚³‚ñ‚«‚ã[
+‚³‚ñ‚«‚傤
+‚³‚ñ‚¬‚傤
+‚³‚ñ‚¬‚傤‚©‚¢
+‚³‚ñ‚¬‚傤‚悤
+‚´‚ñ‚«‚ñ
+‚³‚ñ‚¯
+‚³‚ñ‚¯‚¢
+‚³‚ñ‚°‚«
+‚³‚ñ‚¯‚ñ
+‚³‚ñ‚²‚¤
+‚³‚ñ‚±‚¤‚µ‚å
+‚³‚ñ‚±‚¤‚É‚ñ
+‚³‚ñ‚²‚­
+‚³‚ñ‚²‚µ‚傤
+‚³‚ñ‚³
+‚³‚ñ‚³‚¢
+‚³‚ñ‚³‚ë
+‚³‚ñ‚µ
+‚³‚ñ‚¶
+‚´‚ñ‚µ
+‚´‚ñ‚¶
+‚³‚ñ‚µ‚·‚¢‚ß‚¢
+‚³‚ñ‚µ‚á
+‚³‚ñ‚¶‚ã
+‚³‚ñ‚¶‚ã‚Â
+‚´‚ñ‚µ‚å
+‚³‚ñ‚¶‚傤
+‚´‚ñ‚µ‚傤
+‚³‚ñ‚µ‚å‚­
+‚³‚ñ‚·‚¢
+‚³‚ñ‚·‚¤
+‚³‚ñ‚·‚­‚è‚Á‚Æ
+‚³‚ñ‚¹‚¢
+‚³‚ñ‚¹‚¢‚¯‚ñ
+‚´‚ñ‚¹‚Â
+‚³‚ñ‚º‚ñ
+‚³‚ñ‚»
+‚´‚ñ‚¼‚¤
+‚³‚ñ‚¼‚­
+‚³‚ñ‚»‚ñ
+‚³‚ñ‚½
+‚³‚ñ‚¾[
+‚³‚ñ‚¾‚¢
+‚´‚ñ‚¾‚©
+‚³‚ñ‚¾‚ñ
+‚³‚ñ‚¾‚ñ‚Æ‚Ñ
+‚³‚ñ‚¾‚ñ‚ë‚ñ‚Û‚¤
+‚³‚ñ‚¿
+‚³‚ñ‚¿‚イ
+‚³‚ñ‚¿‚傤
+‚³‚ñ‚Å[
+‚³‚ñ‚Ç‚¢‚Á‚¿
+‚³‚ñ‚Æ‚¤
+‚³‚ñ‚Ç‚¤
+‚´‚ñ‚Æ‚¤
+‚³‚ñ‚È‚¢
+‚´‚ñ‚Ë‚ñ
+‚³‚ñ‚Î
+‚³‚ñ‚΂»‚¤
+‚³‚ñ‚΂ñ
+‚´‚ñ‚Ï‚ñ
+‚³‚ñ‚Ñ
+‚³‚ñ‚Ò
+‚³‚ñ‚Ñ‚©
+‚³‚ñ‚т傤‚µ
+‚´‚ñ‚Ò‚ñ
+‚³‚ñ‚Ô
+‚³‚ñ‚Õ
+‚³‚ñ‚Õ‚­
+‚³‚ñ‚Ó‚¶‚ñ‚©
+‚³‚ñ‚Ô‚Â
+‚³‚ñ‚Õ‚è‚ñ‚®
+‚³‚ñ‚Ô‚ñ
+‚³‚ñ‚Ú‚¤
+‚³‚ñ‚Ü‚¢
+‚´‚ñ‚Ü‚¢
+‚³‚ñ‚Ý
+‚³‚ñ‚Ý‚á‚­
+‚´‚ñ‚Þ
+‚³‚ñ‚à‚ñ‚΂ñ
+‚³‚ñ‚â
+‚³‚ñ‚â‚­
+‚³‚ñ‚ä
+‚³‚ñ‚䂱‚­
+‚³‚ñ‚æ
+‚´‚ñ‚æ
+‚³‚ñ‚è‚傤
+‚³‚ñ‚è‚ñ
+‚³‚ñ‚è‚ñ‚µ‚á
+‚³‚ñ‚é‚¢
+‚³‚ñ‚ê‚‚µ‚á
+‚³‚ñ‚ë‚­
+ƒV
+‚µ
+‚µ
+ƒW
+‚¶
+‚¶‚ ‚¢
+‚µ‚ ‚킹
+‚µ‚ ‚ñ
+‚µ‚¢
+‚µ[
+‚¶‚¢
+‚¶[
+‚¶‚¢‚µ‚«
+‚µ[‚¸‚ñ
+‚µ[‚½
+‚¶[‚½
+‚µ‚¢‚½‚¯
+‚µ[‚Â
+‚µ[‚Æ
+‚µ‚¢‚ê
+‚µ‚¢‚ꂳ‚«
+‚¶‚¢‚ë
+‚µ‚¢‚ñ
+‚µ[‚ñ
+‚¶‚¢‚ñ
+‚¶‚¤
+‚¶‚¤‚ñ
+‚µ‚¥‚ 
+‚µ‚¦‚¢
+‚¶‚¥‚¢
+‚¶‚¦‚¢‚©‚ñ
+‚¶‚¦‚¢‚½‚¢
+‚¶‚¥[
+‚¶‚¥‚Á‚Æ
+‚¶‚¥‚Á‚Æ‚«
+‚¶‚¥‚Ë‚ê[‚½
+‚µ‚¥‚Ó
+‚µ‚¥‚é
+‚µ‚¦‚ñ‚µ‚á
+‚µ‚¨
+‚µ‚¨‚¯
+‚µ‚¨‚³‚¢
+‚µ‚¨‚´‚¢
+‚µ‚¨‚¶
+‚µ‚¨‚º
+‚µ‚¨‚¯
+‚µ‚¨‚Ç‚«
+‚µ‚¨‚Ý‚¸
+‚µ‚¨‚ß
+‚µ‚¨‚è
+‚µ‚¨‚ñ
+‚µ‚©
+‚µ‚ª
+‚¶‚©
+‚µ‚©‚¢
+‚µ‚ª‚¢
+‚¶‚©‚¢
+‚µ‚©‚¢‚¬‚¢‚ñ
+‚µ‚©‚¢‚µ‚á
+‚µ‚ª‚¢‚¹‚ñ
+‚µ‚ª‚¢‚¿
+‚µ‚©‚©‚è‚Ђñ
+‚µ‚©‚­
+‚µ‚ª‚­
+‚¶‚©‚­
+‚µ‚ª‚­‚©
+‚µ‚©‚­‚¯‚¢
+‚µ‚ª‚­‚¯‚¢
+‚µ‚©‚¯
+‚¶‚©‚¹‚¢
+‚¶‚ª‚¼‚¤
+‚µ‚©‚½
+‚µ‚©‚Â
+‚µ‚ª‚Â
+‚µ‚ª‚Á‚©
+‚¶‚ª‚Ë
+‚µ‚©‚΂Ë
+‚¶‚©‚悤‚µ‚á
+‚µ‚ª‚ê‚Á‚Æ
+‚¶‚©‚ñ
+‚¶‚©‚ñ‚ª‚¢
+‚¶‚©‚ñ‚«‚イ
+‚µ‚ª‚ñ‚µ‚á
+‚¶‚©‚ñ‚í‚è
+‚µ‚«
+‚µ‚¬
+‚¶‚«
+‚¶‚¬
+‚µ‚«‚¢
+‚µ‚«‚©
+‚µ‚«‚«‚ñ
+‚µ‚«‚³‚¢
+‚µ‚«‚µ
+‚µ‚«‚¶
+‚µ‚«‚µ‚á
+‚µ‚«‚¶‚傤
+‚µ‚«‚¹‚ñ
+‚µ‚«‚»
+‚µ‚«‚»‚¤
+‚µ‚«‚¿
+‚µ‚«‚¿‚傤
+‚¶‚«‚Å‚µ
+‚µ‚«‚Ä‚ñ
+‚¶‚«‚ЂÂ
+‚µ‚«‚Ó
+‚µ‚«‚Ó‚­
+‚µ‚«‚Ü
+‚µ‚«‚à‚¤
+‚µ‚«‚à‚Ì
+‚µ‚«‚イ
+‚µ‚«‚イ‚ª‚­
+‚¶‚«‚イ‚¹‚ñ
+‚¶‚«‚イ‚»‚¤
+‚µ‚«‚イ‚Ñ
+‚¶‚«‚イ‚è‚å‚­
+‚µ‚«‚傤
+‚µ‚¬‚傤
+‚µ‚¬‚傤‚µ‚«
+‚¶‚¬‚傤‚µ‚å
+‚¶‚¬‚傤‚Ê‚µ
+‚µ‚«‚傤‚Ђñ
+‚¶‚¬‚傤‚Ô
+‚¶‚¬‚傤‚Ô‚¿‚傤
+‚¶‚¬‚傤‚Ù‚ñ‚Ô
+‚¶‚«‚å‚­
+‚µ‚«‚è
+‚µ‚«‚ñ
+‚µ‚¬‚ñ
+‚µ‚«‚ñ‚®‚è‚Ђ傤
+‚µ‚«‚ñ‚°‚ñ
+‚µ‚«‚ñ‚¹‚«
+‚¶‚­
+‚¶‚®
+‚¶‚­‚¤‚¯
+‚¶‚­‚¬
+‚µ‚®‚³
+‚¶‚®‚´‚®
+‚µ‚®‚È‚é
+‚µ‚­‚ç‚ß‚ñ
+‚µ‚®‚ê
+‚¶‚­‚ñ
+‚µ‚¯
+‚µ‚¯‚¢
+‚¶‚¯‚¢
+‚µ‚¯‚¢‚µ‚イ
+‚µ‚°‚ñ
+‚¶‚¯‚ñ
+‚¶‚°‚ñ
+‚µ‚¯‚ñ‚©
+‚µ‚¯‚ñ‚ª‚©‚è
+‚µ‚¯‚ñ‚©‚ñ
+‚µ‚¯‚ñ‚«
+‚µ‚¯‚ñ‚¶‚å
+‚µ‚¯‚ñ‚¶‚傤
+‚µ‚¯‚ñ‚Ô
+‚µ‚²
+‚¶‚±
+‚¶‚²
+‚¶‚±‚ ‚ñ‚¶
+‚¶‚±‚¤
+‚¶‚²‚¤
+‚¶‚²‚¤‚¶‚Æ‚­
+‚µ‚±‚¤‚è‚å‚­
+‚µ‚²‚­
+‚¶‚±‚­
+‚¶‚²‚­
+‚¶‚±‚¯‚ñ‚¨
+‚¶‚±‚µ‚Ù‚ñ
+‚µ‚²‚¹‚ñ
+‚µ‚²‚Æ‚¬
+‚µ‚²‚Æ‚Î
+‚µ‚±‚Ý
+‚¶‚±‚è‚Â
+‚¶‚±‚ñ
+‚¶‚³
+‚µ‚³‚¢
+‚µ‚´‚¢
+‚µ‚´‚¢‚©
+‚µ‚´‚¢‚ª‚©‚è
+‚µ‚´‚¢‚Ô
+‚µ‚³‚­‚Ђñ
+‚µ‚³‚ñ
+‚µ‚³‚ñ‚©
+‚¶‚³‚ñ‚É‚ñ
+‚µ‚³‚ñ‚Ђ傤
+‚µ‚µ
+‚µ‚¶
+‚µ‚¶‚µ‚á
+‚µ‚µ‚Â
+‚µ‚¶‚Â
+‚¶‚µ‚Â
+‚¶‚¶‚Â
+‚¶‚¶‚‚¶‚傤
+‚µ‚¶‚Ü
+‚¶‚µ‚á
+‚¶‚µ‚á‚­
+‚¶‚¶‚á‚­
+‚µ‚µ‚á‚¿‚傤
+‚µ‚µ‚ã
+‚¶‚µ‚ã
+‚µ‚µ‚イ
+‚¶‚¶‚イ
+‚µ‚¶‚イ‚­‚É‚¿
+‚µ‚¶‚ã‚­
+‚¶‚µ‚ス‚¢
+‚µ‚µ‚ã‚ñ‚«
+‚µ‚µ‚å
+‚µ‚¶‚å
+‚¶‚¶‚å
+‚µ‚µ‚傤
+‚µ‚¶‚傤
+‚¶‚µ‚傤
+‚¶‚¶‚傤
+‚¶‚¶‚傤‚¶‚΂­
+‚µ‚µ‚傤‚µ‚á
+‚¶‚¶‚å‚Å‚ñ
+‚µ‚µ‚å‚΂±
+‚µ‚¶‚è‚Â
+‚µ‚µ‚ñ
+‚µ‚¶‚ñ
+‚¶‚µ‚ñ
+‚µ‚·‚¤
+‚µ‚¸‚©‚³
+‚µ‚¸‚­
+‚µ‚¸‚¯‚³
+‚µ‚·‚½[
+‚µ‚·‚Ä‚Þ
+‚µ‚¹‚¢
+‚¶‚¹‚¢
+‚µ‚¹‚¢‚¶
+‚µ‚¹‚«
+‚¶‚¹‚«
+‚µ‚¹‚Â
+‚¶‚¹‚Â
+‚µ‚¹‚‚©
+‚µ‚¹‚‚ª‚©‚è
+‚µ‚¹‚‚Ô
+‚µ‚¹‚ñ
+‚µ‚º‚ñ
+‚¶‚º‚ñ
+‚µ‚º‚ñ‚©‚¢
+‚µ‚º‚ñ‚µ‚å‚­
+‚µ‚º‚ñ‚·‚¤
+‚¶‚¼‚¤
+‚µ‚»‚¤‚©
+‚¶‚»‚¤‚µ‚«
+‚µ‚»‚­
+‚µ‚¼‚­
+‚¶‚»‚­
+‚¶‚¼‚­‚¹‚¢
+‚¶‚»‚ñ
+‚¶‚»‚ñ‚µ‚ñ
+‚µ‚½
+‚¶‚½
+‚µ‚½‚¢
+‚µ‚¾‚¢
+‚¶‚½‚¢
+‚¶‚¾‚¢‚³‚­‚²
+‚µ‚½‚¤‚¯‚ª‚¢‚µ‚á
+‚µ‚½‚¦
+‚µ‚½‚¨‚Ñ
+‚µ‚½‚¬
+‚¶‚½‚­
+‚µ‚½‚¶
+‚µ‚½‚¶‚«
+‚µ‚½‚½‚©‚à‚Ì
+‚µ‚½‚‚ÂÝ
+‚µ‚½‚‚Ý
+‚µ‚½‚Á‚Ï
+‚µ‚½‚ÂÝ
+‚µ‚½‚Ä
+‚µ‚½‚Ñ
+‚µ‚½‚Ü‚¿
+‚µ‚½‚Þ‚«
+‚¶‚¾‚ç‚­
+‚µ‚¾‚ê
+‚µ‚½‚ñ
+‚µ‚¾‚ñ
+‚¶‚¾‚ñ
+‚¶‚¾‚ñ‚«‚ñ
+‚µ‚¿
+‚¶‚¿
+‚¶‚¿‚©‚¢
+‚µ‚¿‚ª‚Â
+‚µ‚¿‚²‚³‚ñ
+‚µ‚¿‚¸‚ñ
+‚¶‚¿‚½‚¢
+‚¶‚¿‚¾‚¢‚¶‚ñ
+‚µ‚¿‚È‚ñ
+‚µ‚¿‚Ó‚­‚¶‚ñ
+‚µ‚¿‚Ó‚¾
+‚µ‚¿‚â
+‚µ‚¿‚ウ[‚µ‚å‚ñ
+‚¶‚¿‚å
+‚µ‚¿‚傤
+‚µ‚¿‚悤
+‚¶‚¿‚傤
+‚µ‚¿‚傤‚©‚­
+‚µ‚¿‚傤‚µ‚á
+‚µ‚¿‚傤‚è‚Â
+‚¶‚¿‚낤
+‚¶‚¿‚ñ‚³‚¢
+‚µ‚Â
+‚¶‚Â
+‚µ‚‚¢
+‚¶‚‚¢
+‚µ‚‚¤
+‚¶‚‚¦‚«
+‚µ‚‚¨‚ñ
+‚¶‚Á‚©
+‚µ‚‚ª‚¢
+‚¶‚‚ª‚¢
+‚µ‚Á‚©‚ñ
+‚µ‚Á‚«
+‚¶‚Á‚«
+‚¶‚‚¬
+‚¶‚Á‚«‚傤
+‚¶‚‚¬‚傤
+‚¶‚‚¬‚傤‚©
+‚µ‚‚¬‚傤‚µ‚á
+‚µ‚Á‚­
+‚µ‚Á‚­‚¢
+‚µ‚Á‚­‚·
+‚µ‚Á‚¯
+‚µ‚‚¯
+‚¶‚Á‚¯‚¢
+‚µ‚Á‚¯‚ñ
+‚¶‚Á‚¯‚ñ
+‚¶‚Á‚¯‚ñ‚«
+‚¶‚‚°‚ñ‚¹‚¢
+‚µ‚‚²
+‚¶‚Á‚±‚¤
+‚µ‚Á‚±‚¤‚䂤‚æ
+‚¶‚Á‚±‚¤‚è‚å‚­
+‚¶‚Á‚³‚¢
+‚µ‚‚¶
+‚¶‚Á‚µ
+‚µ‚‚¶‚Â
+‚¶‚Á‚µ‚Â
+‚µ‚‚¶‚‚²‚¤‚¯‚ñ
+‚¶‚‚¶‚ã
+‚¶‚‚¶‚傤
+‚µ‚Á‚µ‚ñ
+‚¶‚Á‚·‚¤
+‚¶‚Á‚·‚ñ
+‚µ‚Á‚¹‚¢
+‚¶‚Á‚¹‚¢
+‚¶‚Á‚¹‚«
+‚¶‚Á‚¹‚ñ
+‚µ‚Á‚»
+‚¶‚Á‚»‚¤
+‚¶‚‚¼‚¤
+‚µ‚Á‚½‚¢
+‚¶‚Á‚½‚¢
+‚¶‚‚¾‚ñ
+‚¶‚Á‚¿
+‚¶‚Á‚¿‚イ‚Í‚Á‚­
+‚µ‚‚¿‚傤
+‚¶‚Á‚Ä‚¢
+‚µ‚Á‚Ä‚ñ
+‚µ‚‚łñ
+‚µ‚‚Ç
+‚¶‚Á‚Ò
+‚¶‚Á‚Õ
+‚¶‚‚Ô
+‚µ‚Á‚Õ‚¤
+‚¶‚‚ԂÂ
+‚µ‚Á‚Ø‚¢
+‚µ‚Á‚Û
+‚µ‚Á‚Û‚¤
+‚¶‚‚܂¢
+‚¶‚‚Þ
+‚¶‚‚߂¢
+‚¶‚‚è
+‚µ‚‚è‚傤
+‚¶‚‚è‚å‚­
+‚¶‚‚ꂢ
+‚¶‚‚낭
+‚¶‚‚í
+‚µ‚Ä
+‚µ‚Ä‚¢
+‚¶‚Ä‚¢
+‚µ‚Ä‚¡[
+‚µ‚Ä‚¢‚¹‚«
+‚µ‚Ä‚Â
+‚µ‚Ä‚ñ
+‚µ‚Å‚ñ
+‚¶‚Ä‚ñ
+‚¶‚Å‚ñ
+‚¶‚Ä‚ñ‚µ‚á
+‚µ‚Ä‚ñ‚Ì‚¤
+‚µ‚Æ
+‚µ‚Æ‚¤
+‚µ‚Ç‚¤
+‚¶‚Ç‚¤
+‚µ‚Ç‚¤‚µ‚á
+‚¶‚Ç‚¤‚µ‚á
+‚µ‚Æ‚Ý
+‚µ‚Ƃ낦‚ñ
+‚µ‚È
+‚µ‚È‚¢
+‚µ‚È‚©‚¸
+‚µ‚È‚¶‚È
+‚µ‚È‚à‚Ì
+‚¶‚È‚ñ
+‚µ‚É‚ 
+‚µ‚É‚ª‚¨
+‚µ‚É‚¬‚í
+‚µ‚É‚¹
+‚µ‚É‚à‚Ì‚®‚é‚¢
+‚µ‚ɂ傤
+‚¶‚Ê‚µ
+‚¶‚Ë‚Â
+‚µ‚Ë‚Ü
+‚µ‚Ì
+‚µ‚Ì‚Ì‚ß
+‚µ‚Ì‚Ñ‚²‚¦
+‚µ‚Ì‚Ô
+‚¶‚Î
+‚µ‚Í‚¢
+‚µ‚Í‚¢‚É‚ñ
+‚µ‚Í‚·
+‚µ‚΂·
+‚¶‚Í‚¾
+‚µ‚Í‚Â
+‚µ‚΂Ó
+‚¶‚΂ç
+‚µ‚Í‚ç‚¢‚«
+‚µ‚Í‚ç‚¢‚É‚ñ
+‚µ‚Í‚ç‚¢‚Ñ
+‚µ‚Í‚ñ
+‚¶‚Í‚ñ
+‚µ‚Í‚ñ‚«
+‚¶‚Í‚ñ‚«
+‚µ‚Ð
+‚¶‚Ð
+‚¶‚Ñ
+‚µ‚Ñ‚ 
+‚¶‚Ñ‚©
+‚¶‚ЂÂ
+‚µ‚Ђ傤
+‚µ‚т傤
+‚¶‚Ђ傤
+‚¶‚т傤
+‚µ‚Ñ‚è‚ ‚ñ
+‚µ‚Ô
+‚µ‚Ô‚ª‚«
+‚µ‚Ó‚­
+‚µ‚Ô‚¿‚傤
+‚µ‚Ô‚Â
+‚¶‚Ô‚Â
+‚µ‚Ó‚ñ
+‚µ‚Ô‚ñ
+‚¶‚Ô‚ñ‚©‚Â
+‚µ‚Ô‚ñ‚µ‚å
+‚µ‚×
+‚µ‚Ö‚¢
+‚¶‚Ö‚¢‚µ‚傤
+‚¶‚Ø[‚¶
+‚µ‚Ö‚ñ
+‚µ‚Ö‚ñ‚¯‚¢
+‚µ‚Ú
+‚¶‚Ú
+‚µ‚Ù‚¤
+‚µ‚Ú‚¤
+‚¶‚Ù‚¤
+‚¶‚Ú‚¤
+‚µ‚Ú‚¤‚±‚¤
+‚¶‚Ú‚¤‚¶‚«
+‚µ‚Ú‚¤‚µ‚Â
+‚µ‚Ù‚¤‚µ‚債
+‚µ‚Ú‚¤‚è‚Â
+‚µ‚Ù‚ñ
+‚µ‚Ù‚ñ‚©
+‚µ‚Ù‚ñ‚µ‚ガ
+‚µ‚Ü
+‚µ‚Ü‚¢
+‚¶‚Ü‚¦
+‚µ‚Ü‚©‚°
+‚¶‚Ü‚­
+‚µ‚Ü‚®‚É
+‚µ‚܂‚µ‚å
+‚¶‚Ü‚Ü
+‚µ‚Ü‚è
+‚µ‚Ý
+‚¶‚Ý
+‚µ‚Ý‚¸
+‚¶‚Ý‚¿
+‚µ‚Ý‚ã‚ê[‚µ‚å‚ñ
+‚µ‚Ý‚ã‚ê[‚½
+‚µ‚Ý‚ñ
+‚¶‚Ý‚ñ
+‚µ‚Ý‚ñ‚©
+‚µ‚Ý‚ñ‚º‚¢
+‚¶‚Ý‚ñ‚Æ‚¤
+‚¶‚Þ‚¢‚ñ
+‚¶‚Þ‚©
+‚¶‚Þ‚ª‚©‚è
+‚¶‚Þ‚©‚ñ
+‚¶‚Þ‚«
+‚¶‚Þ‚«‚å‚­
+‚µ‚Þ‚¯
+‚¶‚Þ‚µ‚å
+‚¶‚Þ‚Ô
+‚¶‚Þ‚Ó‚­
+‚¶‚Þ‚è‚傤
+‚µ‚ß
+‚µ‚ß‚¢
+‚µ‚ß‚¢‚©‚ñ
+‚µ‚ß‚«‚è‚Ñ
+‚µ‚ß‚Ñ
+‚µ‚ß‚è
+‚µ‚ß‚ñ
+‚¶‚ß‚ñ
+‚µ‚ß‚ñ‚»‚©
+‚µ‚à
+‚µ‚à‚«
+‚¶‚à‚­
+‚µ‚à‚²‚¦
+‚µ‚à‚´
+‚µ‚à‚‚«
+‚µ‚à‚Ä
+‚¶‚à‚Æ
+‚µ‚à‚΂µ‚ç
+‚µ‚à‚Í‚ñ‚«
+‚µ‚à‚Ó‚è
+‚µ‚à‚×
+‚µ‚à‚ñ
+‚¶‚à‚ñ
+‚µ‚á
+‚¶‚á
+‚¶‚á[‚È‚è‚·‚Æ
+‚¶‚á[‚Ȃ肸‚Þ
+‚¶‚á[‚È‚é
+‚µ‚á[‚Õ
+‚µ‚á‚¢
+‚µ‚á‚¢‚ñ
+‚µ‚Ⴈ‚­
+‚µ‚Ⴈ‚ñ‚©‚¢
+‚µ‚á‚©‚¢
+‚µ‚Ⴊ‚¢
+‚µ‚á‚©‚¢‚ ‚­
+‚µ‚á‚©‚¢‚©
+‚µ‚á‚©‚¢‚ª‚­
+‚µ‚á‚©‚¢‚¶‚ñ
+‚µ‚á‚©‚¢‚¹‚¢
+‚µ‚á‚©‚¢‚Æ‚¤
+‚µ‚á‚©‚¢‚ß‚ñ
+‚¶‚Ⴊ‚¢‚à
+‚µ‚Ⴊ‚ꂲ‚¦
+‚µ‚á‚©‚ñ
+‚µ‚Ⴌ‚傤
+‚µ‚á‚«‚ñ
+‚µ‚á‚­
+‚µ‚â‚­
+‚¶‚á‚­
+‚¶‚â‚­
+‚µ‚á‚­‚¢
+‚µ‚á‚­‚µ
+‚¶‚á‚­‚µ
+‚¶‚á‚­‚µ‚á
+‚µ‚â‚­‚µ‚å
+‚¶‚á‚­‚µ‚ñ
+‚¶‚á‚­‚»‚Â
+‚µ‚á‚­‚¿
+‚¶‚á‚­‚Ä‚ñ
+‚¶‚á‚­‚Å‚ñ
+‚µ‚á‚­‚Ç
+‚µ‚á‚­‚Ç‚¤
+‚µ‚á‚­‚È‚°
+‚¶‚á‚­‚É‚­‚«‚傤
+‚¶‚á‚­‚Ë‚ñ
+‚µ‚á‚­‚Í‚¿
+‚µ‚á‚­‚Ó
+‚µ‚á‚­‚Ü
+‚µ‚á‚­‚â
+‚µ‚á‚­‚悤‚µ‚å
+‚µ‚á‚­‚ñ
+‚¶‚Ⴏ‚Á‚Æ
+‚µ‚Ⴑ
+‚µ‚Ⴑ‚¤
+‚µ‚Ⴓ‚¢
+‚µ‚Ⴕ
+‚µ‚Ⴖ
+‚µ‚Ⴖ‚­
+‚µ‚Ⴖ‚Â
+‚µ‚Ⴕ‚傤
+‚µ‚Ⴖ‚傤
+‚µ‚Ⴕ‚ñ
+‚¶‚Ⴕ‚ñ
+‚µ‚Ⴕ‚ñ‚©
+‚µ‚Ⴕ‚ñ‚©‚ñ
+‚µ‚Ⴕ‚ñ‚«
+‚¶‚á‚·‚Æ
+‚µ‚Ⴚ
+‚µ‚Ⴙ‚Â
+‚¶‚Ⴙ‚Â
+‚µ‚Ⴙ‚ñ
+‚µ‚á‚»‚¤
+‚µ‚Ⴜ‚¤
+‚µ‚Ⴞ‚¢
+‚µ‚Ⴝ‚­
+‚µ‚Ⴞ‚ñ
+‚µ‚Ⴞ‚ñ‚«
+‚µ‚Ⴞ‚ñ‚Ù‚¤‚¶‚ñ
+‚µ‚á‚¿‚イ
+‚µ‚á‚¿‚傤
+‚µ‚á‚Á‚©‚ñ
+‚¶‚á‚Á‚©‚ñ
+‚µ‚á‚Á‚©‚ñ‚Ù‚¤
+‚¶‚á‚Á‚«
+‚¶‚á‚Á‚±‚¤
+‚µ‚á‚Á‚½
+‚µ‚á‚Á‚Æ
+‚µ‚á‚Ä‚«
+‚µ‚á‚Ç‚¤
+‚¶‚á‚Ç‚¤
+‚µ‚á‚Ç[
+‚µ‚á‚Æ‚é
+‚µ‚á‚È‚¢
+‚µ‚á‚È‚¢‚Ù‚¤
+‚¶‚á‚Ì‚ß
+‚¶‚á‚Ï‚É[‚¸
+‚¶‚á‚΂ç
+‚¶‚á‚Ï‚ñ
+‚µ‚á‚Ð
+‚µ‚á‚Ó‚¤
+‚µ‚á‚Ó‚Æ
+‚µ‚á‚Ù
+‚¶‚á‚Ü
+‚¶‚á‚Ü‚à‚Ì
+‚µ‚á‚Ý‚¹‚ñ
+‚µ‚á‚Þ
+‚¶‚á‚Þ
+‚µ‚á‚Þ‚µ‚å
+‚µ‚á‚ß‚ñ
+‚µ‚á‚䂤
+‚µ‚á‚悤
+‚¶‚á‚è
+‚µ‚á‚è‚傤
+‚µ‚á‚è‚ñ
+‚µ‚á‚ê
+‚¶‚á‚ñ‚­
+‚¶‚á‚ñ‚®‚é
+‚µ‚á‚ñ‚Å‚è‚ 
+‚¶‚á‚ñ‚Ï[
+‚¶‚á‚ñ‚Ú
+‚¶‚á‚ñ‚é
+‚µ‚ã
+‚µ‚ã‚¢‚ñ
+‚µ‚イ
+‚µ‚ã[
+‚µ‚䂤
+‚¶‚イ
+‚¶‚䂤
+‚¶‚イ‚ ‚Â
+‚¶‚イ‚¢
+‚¶‚イ‚¢‚ª‚­
+‚¶‚イ‚¢‚¿‚ª‚Â
+‚µ‚イ‚¢‚ñ
+‚µ‚イ‚¦‚«
+‚µ‚イ‚¦‚ñ
+‚¶‚イ‚¨‚¤
+‚¶‚イ‚©
+‚µ‚イ‚©‚¢‚¶‚å
+‚¶‚イ‚©‚ª‚­
+‚µ‚イ‚ª‚­
+‚µ‚イ‚ª‚­‚©
+‚¶‚イ‚©‚º‚¢
+‚¶‚䂤‚ª‚½
+‚µ‚イ‚ª‚Á‚©
+‚µ‚イ‚©‚ñ
+‚¶‚イ‚©‚ñ
+‚¶‚イ‚©‚ñ‚«‚傤
+‚µ‚イ‚©‚ñ‚µ
+‚µ‚イ‚«
+‚µ‚イ‚¬
+‚µ‚イ‚¬‚¢‚ñ
+‚¶‚イ‚«‚©‚¢
+‚µ‚イ‚«‚イ
+‚¶‚イ‚«‚å
+‚µ‚イ‚«‚傤
+‚¶‚䂤‚¬‚傤
+‚¶‚イ‚¬‚傤‚¢‚ñ
+‚µ‚イ‚«‚傤‚Ù‚¤
+‚µ‚イ‚«‚å‚­
+‚¶‚イ‚¯‚¢
+‚¶‚イ‚¯‚¢‚µ‚傤
+‚¶‚イ‚°‚«‚¹‚ñ
+‚µ‚イ‚¯‚ñ
+‚µ‚イ‚°‚ñ
+‚¶‚イ‚±‚¤‚¬‚傤
+‚¶‚イ‚²‚â
+‚µ‚イ‚³
+‚µ‚イ‚³‚¢
+‚¶‚イ‚´‚¢
+‚µ‚イ‚³‚­
+‚µ‚イ‚³‚ñ
+‚µ‚イ‚¶
+‚¶‚イ‚¶
+‚¶‚イ‚¶‚©
+‚µ‚イ‚µ‚¯‚¢
+‚µ‚イ‚¶‚Â
+‚µ‚イ‚µ‚Ó
+‚¶‚イ‚µ‚á
+‚µ‚イ‚µ‚傤
+‚¶‚イ‚µ‚傤
+‚µ‚イ‚µ‚å‚­
+‚¶‚イ‚µ‚å‚­
+‚µ‚イ‚µ‚å‚­‚è‚Â
+‚¶‚イ‚µ‚å‚ë‚­
+‚¶‚イ‚¶‚ë
+‚µ‚イ‚¶‚ñ
+‚¶‚イ‚µ‚ñ
+‚µ‚ã[‚¸
+‚¶‚ã[‚·
+‚¶‚イ‚·‚¢
+‚µ‚イ‚¹‚¢
+‚¶‚イ‚¹‚¢
+‚µ‚イ‚¹‚¢‚ ‚ñ
+‚¶‚イ‚¹‚«
+‚µ‚イ‚¹‚ñ
+‚¶‚イ‚º‚ñ
+‚¶‚イ‚»‚¤
+‚µ‚イ‚¼‚­
+‚µ‚イ‚½‚¢
+‚¶‚イ‚¾‚¢
+‚¶‚イ‚½‚­
+‚¶‚イ‚½‚­‚ª‚¢
+‚¶‚イ‚½‚­‚¿
+‚¶‚イ‚½‚­‚È‚ñ
+‚µ‚イ‚½‚ñ
+‚µ‚イ‚¾‚ñ
+‚¶‚イ‚¾‚ñ
+‚µ‚イ‚¿
+‚µ‚䂤‚¿
+‚µ‚イ‚¿‚á‚­
+‚µ‚イ‚¿‚傤
+‚¶‚イ‚¿‚ñ
+‚¶‚イ‚Ä‚¢
+‚µ‚イ‚Å‚ñ
+‚¶‚イ‚Ä‚ñ
+‚µ‚イ‚Æ
+‚µ‚ã[‚Æ
+‚¶‚イ‚Ç
+‚¶‚イ‚Ç‚¤
+‚µ‚イ‚Ç‚¤‚¢‚ñ
+‚¶‚イ‚É‚ª‚Â
+‚¶‚イ‚É‚­
+‚¶‚イ‚É‚µ
+‚¶‚イ‚É‚µ‚¿‚傤
+‚µ‚イ‚ɂイ
+‚µ‚イ‚ɂイ‚â‚­
+‚¶‚イ‚É‚ñ
+‚µ‚イ‚Í
+‚¶‚イ‚΂±
+‚µ‚イ‚Í‚·‚¤
+‚µ‚イ‚Í‚Â
+‚µ‚イ‚΂ñ
+‚µ‚イ‚Ñ
+‚µ‚イ‚Ђ傤
+‚µ‚イ‚Ô‚ñ
+‚¶‚イ‚Ô‚ñ
+‚µ‚イ‚Ö‚«
+‚µ‚イ‚Ö‚ñ
+‚µ‚イ‚Ù‚¤
+‚µ‚イ‚Ú‚¤
+‚¶‚イ‚Ù‚¤
+‚¶‚イ‚Ü‚¢
+‚µ‚イ‚Ü‚­
+‚µ‚イ‚Ü‚Â
+‚¶‚イ‚Ý‚ñ
+‚¶‚イ‚Ý‚ñ‚©
+‚¶‚イ‚Ý‚ñ‚º‚¢
+‚¶‚イ‚Ý‚ñ‚Ђ傤
+‚¶‚イ‚à‚ñ‚¶
+‚µ‚イ‚â
+‚¶‚イ‚â‚­
+‚¶‚イ‚ä
+‚µ‚イ‚䂤‚¯‚ñ
+‚¶‚イ‚悤
+‚¶‚イ‚ç‚¢
+‚µ‚イ‚è‚Â
+‚µ‚イ‚è‚Ð
+‚µ‚イ‚è‚傤
+‚¶‚イ‚è‚傤
+‚µ‚イ‚è‚傤‚²
+‚¶‚イ‚è‚傤‚º‚¢
+‚¶‚イ‚è‚å‚­
+‚µ‚イ‚ê‚¢
+‚µ‚ウ‚¢
+‚¶‚ウ‚«
+‚µ‚ウ‚ñ
+‚µ‚オ[
+‚µ‚ã‚©‚¢
+‚¶‚ã‚©‚¢
+‚µ‚ã‚©‚ñ
+‚µ‚オ‚ñ
+‚µ‚ã‚©‚ñ‚¬‚µ
+‚µ‚ã‚«
+‚µ‚ガ
+‚¶‚ã‚«‚イ
+‚¶‚ã‚«‚イ‚µ‚á
+‚¶‚ガ‚傤‚è‚傤
+‚µ‚ガ‚å‚­
+‚¶‚ã‚­
+‚µ‚ã‚­‚¢
+‚µ‚ã‚­‚¦‚ñ
+‚µ‚ã‚­‚ª‚ñ
+‚µ‚ã‚­‚¬
+‚µ‚ã‚­‚³‚¢‚¶‚Â
+‚µ‚ã‚­‚µ
+‚µ‚ã‚­‚¶
+‚¶‚ã‚­‚µ
+‚¶‚ã‚­‚¶
+‚µ‚ã‚­‚¶‚Â
+‚µ‚ã‚­‚µ‚á
+‚µ‚ã‚­‚µ‚ã
+‚µ‚ã‚­‚µ‚å
+‚µ‚ã‚­‚¶‚å
+‚µ‚ã‚­‚¸
+‚¶‚ã‚­‚¹‚¢
+‚µ‚ã‚­‚½‚¢
+‚¶‚ã‚­‚¿‚傤
+‚µ‚ã‚­‚Ä‚ñ
+‚µ‚ã‚­‚Å‚ñ
+‚¶‚ã‚­‚Æ‚¤
+‚¶‚ã‚­‚Ë‚ñ
+‚µ‚ã‚­‚Î
+‚µ‚ã‚­‚Í‚¢
+‚µ‚ã‚­‚ׂñ
+‚µ‚ã‚­‚ß‚¢
+‚¶‚ã‚­‚ê‚ñ‚µ‚á
+‚µ‚ã‚­‚ñ
+‚µ‚ク‚¢
+‚µ‚ã‚°‚¢
+‚µ‚ク‚ñ
+‚¶‚ク‚ñ‚µ‚á
+‚¶‚ク‚ñ‚Ђ傤
+‚¶‚ク‚ñ‚è‚傤
+‚µ‚ゲ
+‚µ‚ケ‚¤
+‚µ‚ゲ‚¤
+‚µ‚ケ‚¤‚¬‚傤
+‚¶‚ケ‚¤‚µ‚á
+‚µ‚コ
+‚µ‚コ‚¢‚µ‚á
+‚µ‚ã‚´‚ñ
+‚¶‚コ‚ñ
+‚µ‚サ
+‚µ‚ザ
+‚¶‚サ
+‚µ‚ザ‚­
+‚µ‚ザ‚イ
+‚¶‚ザ‚ã‚Â
+‚µ‚サ‚傤
+‚µ‚ザ‚傤
+‚¶‚サ‚傤‚µ‚á
+‚µ‚サ‚å‚­
+‚µ‚ザ‚ñ
+‚¶‚サ‚ñ‚«
+‚µ‚ザ‚ñ‚±‚¤
+‚¶‚ジ
+‚µ‚ス‚¢
+‚µ‚ズ‚¢
+‚µ‚ス‚«
+‚µ‚ゼ‚¤
+‚¶‚ゼ‚¤‚«
+‚µ‚ゼ‚­
+‚µ‚ソ‚¢
+‚µ‚ゾ‚¢
+‚µ‚ゾ‚ñ
+‚µ‚ソ‚ñ‚Æ‚¤
+‚µ‚ã‚¿‚イ
+‚µ‚ã‚¿‚傤
+‚µ‚ã‚Â
+‚¶‚ã‚Â
+‚µ‚ã‚‚¦‚ñ‚µ‚á
+‚µ‚ã‚Á‚¯‚Â
+‚¶‚ã‚‚²
+‚µ‚ã‚Á‚µ‚å
+‚µ‚ã‚Á‚µ‚ñ
+‚µ‚ã‚Á‚µ‚ñ‚¿
+‚µ‚ã‚Á‚¹‚¢‚è‚Â
+‚µ‚ã‚Á‚¹‚«‚µ‚á
+‚µ‚ã‚Á‚¹‚«‚è‚Â
+‚µ‚ã‚‚¾‚¢‚µ‚á
+‚µ‚ã‚Á‚¿‚傤
+‚µ‚ã‚Á‚¿‚傤‚µ‚å
+‚µ‚ã‚Á‚¿‚傤‚¶‚å
+‚µ‚ã‚Á‚Ä‚ñ
+‚µ‚ã‚Á‚Ï‚ñ
+‚µ‚ã‚Á‚Ï‚ñ‚©
+‚µ‚ã‚Á‚Ï‚ñ‚ª‚©‚è
+‚µ‚ã‚Á‚Ï‚ñ‚µ‚Â
+‚µ‚ã‚Á‚Ï‚ñ‚µ‚á
+‚µ‚ã‚Á‚Ï‚ñ‚Ô
+‚µ‚ã‚Ä‚ñ
+‚µ‚ã‚Æ
+‚µ‚ã‚Ç‚¤
+‚¶‚ã‚Ç‚¤
+‚µ‚ã‚Æ‚¯‚ñ
+‚¶‚ã‚É‚ 
+‚µ‚ã‚É‚­
+‚¶‚ã‚ɂイ‚«
+‚µ‚ã‚É‚ñ
+‚µ‚ã‚É‚ñ‚¬‚µ
+‚µ‚ã‚Ì‚¤
+‚µ‚ã‚Í‚ñ
+‚µ‚ã‚Ð
+‚µ‚ã‚Ñ
+‚¶‚ã‚Ð
+‚¶‚ã‚Ò‚½[
+‚µ‚ã‚ЂÂ
+‚µ‚ã‚т傤
+‚µ‚ã‚Ђñ
+‚µ‚ã‚Ó
+‚µ‚ã‚Ó‚ê‚ñ
+‚µ‚ã‚Ô‚ñ
+‚µ‚ã‚Ù‚¤
+‚µ‚ã‚Ú‚¤‚µ‚á
+‚µ‚ã‚Ý
+‚µ‚ã‚Þ
+‚µ‚ã‚à‚­
+‚¶‚ã‚à‚­
+‚µ‚ã‚à‚Â
+‚¶‚ã‚à‚ñ
+‚µ‚ã‚â‚­
+‚µ‚ã‚悤
+‚µ‚ã‚æ‚­
+‚µ‚ã‚ç
+‚µ‚ã‚ç‚Î
+‚¶‚ã‚ç‚é‚Ý‚ñ
+‚µ‚ã‚ç‚ñ
+‚µ‚ã‚è‚イ
+‚µ‚ã‚è‚イ‚Í
+‚¶‚ã‚è‚傤‚µ‚å
+‚¶‚ã‚è‚傤‚µ‚傤
+‚µ‚ã‚è‚å‚­
+‚µ‚ã‚é‚¢
+‚¶‚ã‚ê‚¢
+‚µ‚ã‚ê‚ñ
+‚µ‚ã‚í
+‚µ‚ã‚í‚ñ
+‚µ‚ã‚ñ
+‚¶‚ã‚ñ
+‚¶‚ã‚ñ‚ ‚¢
+‚¶‚ã‚ñ‚¢
+‚µ‚ã‚ñ‚¦‚¢
+‚¶‚ã‚ñ‚¦‚«
+‚µ‚ã‚ñ‚©‚µ‚イ‚Æ
+‚¶‚ã‚ñ‚©‚‚ä
+‚µ‚ã‚ñ‚©‚ñ
+‚¶‚ã‚ñ‚©‚ñ
+‚¶‚ã‚ñ‚©‚ñ‚«
+‚µ‚ã‚ñ‚«
+‚µ‚ã‚ñ‚¬‚­
+‚¶‚ã‚ñ‚«‚傤
+‚¶‚ã‚ñ‚«‚ñ
+‚¶‚ã‚ñ‚®‚è
+‚¶‚ã‚ñ‚¯‚Â
+‚¶‚ã‚ñ‚¯‚Á‚µ‚傤
+‚µ‚ã‚ñ‚±‚¤
+‚¶‚ã‚ñ‚±‚¤‚¹‚ñ
+‚µ‚ã‚ñ‚³‚¢
+‚¶‚ã‚ñ‚³‚Ô‚¿‚傤
+‚µ‚ã‚ñ‚¶
+‚¶‚ã‚ñ‚µ‚¹‚ñ
+‚¶‚ã‚ñ‚¶‚Â
+‚µ‚ã‚ñ‚¶‚イ
+‚¶‚ã‚ñ‚¶‚ã‚ñ
+‚¶‚ã‚ñ‚¶‚傤
+‚µ‚ã‚ñ‚µ‚å‚­
+‚¶‚ã‚ñ‚µ‚ñ
+‚¶‚ã‚ñ‚·‚¢
+‚¶‚ã‚ñ‚¹‚¢
+‚µ‚ã‚ñ‚¹‚Â
+‚µ‚ã‚ñ‚»‚­
+‚¶‚ã‚ñ‚¿‚傤
+‚¶‚ã‚ñ‚Ç
+‚µ‚ã‚ñ‚Æ‚¤
+‚¶‚ã‚ñ‚Ë‚ñ
+‚¶‚ã‚ñ‚Ì‚¤‚¹‚¢
+‚¶‚ã‚ñ‚Ï‚­
+‚¶‚ã‚ñ‚΂ñ
+‚¶‚ã‚ñ‚Ò‚Â
+‚µ‚ã‚ñ‚Õ‚¤
+‚¶‚ã‚ñ‚Õ‚¤
+‚¶‚ã‚ñ‚Ó‚Ç‚¤
+‚µ‚ã‚ñ‚Ô‚ñ
+‚¶‚ã‚ñ‚Ô‚ñ
+‚¶‚ã‚ñ‚Ô‚ñ‚ª‚­
+‚µ‚ã‚ñ‚Ý‚ñ
+‚¶‚ã‚ñ‚ß‚ñ
+‚¶‚ã‚ñ‚à‚¤
+‚¶‚ã‚ñ‚â‚­
+‚µ‚ã‚ñ‚悤
+‚¶‚ã‚ñ‚悤‚©‚ñ
+‚¶‚ã‚ñ‚è
+‚¶‚ã‚ñ‚ê‚Â
+‚¶‚ã‚ñ‚ë
+‚µ‚å
+‚µ‚å‚¢
+‚¶‚å‚¢
+‚µ‚å‚¢‚ñ
+‚¶‚å‚¢‚ñ‚Æ
+‚µ‚悤
+‚¶‚傤
+‚¶‚悤
+‚¶‚傤‚ ‚¢
+‚µ‚傤‚¢
+‚¶‚傤‚¢
+‚µ‚傤‚¢‚ñ
+‚µ‚傤‚¤‚ñ
+‚µ‚傤‚¦‚Ë
+‚µ‚傤‚¦‚˂邬
+‚µ‚傤‚¦‚ñ
+‚µ‚傤‚¨‚ñ
+‚¶‚傤‚¨‚ñ
+‚µ‚傤‚©
+‚¶‚傤‚©
+‚µ‚傤‚©‚¢
+‚µ‚傤‚ª‚¢
+‚¶‚傤‚ª‚¢
+‚µ‚傤‚ª‚¢‚©
+‚µ‚傤‚ª‚¢‚ª‚©‚è
+‚µ‚傤‚ª‚¢‚«‚å‚­
+‚µ‚傤‚ª‚¢‚µ‚Â
+‚µ‚傤‚ª‚¢‚µ‚á
+‚µ‚傤‚ª‚¢‚Ô
+‚µ‚傤‚©‚«
+‚µ‚傤‚ª‚­
+‚¶‚傤‚©‚­
+‚µ‚傤‚ª‚­‚©
+‚µ‚傤‚ª‚­‚¹‚¢
+‚µ‚傤‚ª‚­‚Ô
+‚µ‚傤‚©‚¹‚ñ
+‚¶‚傤‚©‚»‚¤
+‚µ‚傤‚ª‚Â
+‚µ‚傤‚ª‚Á‚©
+‚µ‚傤‚ª‚Á‚±‚¤
+‚µ‚傤‚©‚ñ
+‚¶‚傤‚©‚ñ
+‚µ‚傤‚«
+‚µ‚傤‚¬
+‚¶‚傤‚«
+‚¶‚傤‚¬
+‚µ‚傤‚«‚¬‚傤
+‚¶‚傤‚«‚á‚­
+‚µ‚傤‚«‚á‚­‚ë
+‚¶‚傤‚«‚イ
+‚µ‚傤‚¬‚傤
+‚¶‚傤‚«‚傤
+‚µ‚傤‚¬‚傤‚©
+‚µ‚傤‚«‚å‚­
+‚¶‚傤‚«‚ñ
+‚¶‚傤‚­‚¤
+‚µ‚傤‚®‚ñ
+‚µ‚傤‚¯‚¢
+‚¶‚傤‚¯‚¢
+‚µ‚傤‚°‚«
+‚µ‚傤‚¯‚ñ
+‚¶‚傤‚¯‚ñ
+‚¶‚傤‚°‚ñ
+‚µ‚傤‚¯‚ñ‚©
+‚µ‚傤‚¯‚ñ‚ª‚©‚è
+‚µ‚傤‚¯‚ñ‚«‚å‚­
+‚µ‚傤‚¯‚ñ‚Ô
+‚µ‚傤‚±
+‚¶‚傤‚²
+‚µ‚傤‚±‚¤
+‚µ‚傤‚²‚¤
+‚¶‚傤‚±‚¤
+‚µ‚傤‚±‚¤‚©‚¢‚¬
+‚µ‚傤‚±‚¤‚«
+‚µ‚傤‚±‚¤‚®‚ñ
+‚µ‚傤‚±‚ñ
+‚¶‚傤‚±‚ñ
+‚µ‚傤‚³
+‚µ‚傤‚³‚¢
+‚¶‚傤‚´‚¢
+‚¶‚傤‚³‚µ
+‚µ‚傤‚³‚Á‚µ
+‚µ‚傤‚³‚ñ
+‚µ‚傤‚µ
+‚µ‚傤‚¶
+‚¶‚傤‚µ
+‚¶‚傤‚¶
+‚µ‚傤‚¶‚«
+‚¶‚傤‚µ‚«
+‚¶‚傤‚¶‚Â
+‚µ‚傤‚µ‚á
+‚¶‚傤‚µ‚ã
+‚µ‚傤‚¶‚イ
+‚¶‚傤‚µ‚イ
+‚µ‚傤‚µ‚ã‚ñ
+‚µ‚傤‚¶‚ã‚ñ
+‚µ‚傤‚µ‚å
+‚µ‚傤‚¶‚å
+‚µ‚悤‚µ‚å
+‚µ‚傤‚µ‚傤
+‚µ‚傤‚¶‚傤
+‚µ‚悤‚¶‚傤
+‚¶‚傤‚µ‚傤
+‚µ‚傤‚µ‚å‚­
+‚µ‚傤‚µ‚ñ
+‚µ‚傤‚¶‚ñ
+‚¶‚傤‚¶‚ñ
+‚¶‚傤‚µ‚ñ‚µ‚å
+‚¶‚傤‚¸
+‚µ‚傤‚·‚¢
+‚¶‚傤‚·‚¢‚¶‚傤
+‚¶‚傤‚·‚¢‚Ç‚¤
+‚µ‚傤‚·‚¤
+‚¶‚傤‚·‚¤
+‚µ‚傤‚·‚¤‚Ä‚ñ
+‚µ‚傤‚·‚¤‚Í
+‚µ‚傤‚¹‚¢
+‚µ‚傤‚¹‚«
+‚¶‚傤‚¹‚«
+‚µ‚傤‚¹‚Â
+‚µ‚傤‚¹‚‚©
+‚µ‚傤‚¹‚ñ
+‚µ‚傤‚»‚¤
+‚µ‚傤‚¼‚¤
+‚µ‚傤‚»‚­
+‚µ‚傤‚¼‚­
+‚µ‚傤‚½‚¢
+‚¶‚傤‚½‚¢
+‚¶‚傤‚¾‚¢
+‚µ‚傤‚½‚¢‚µ‚á
+‚µ‚傤‚½‚¢‚¶‚傤
+‚¶‚傤‚½‚ñ
+‚¶‚傤‚¾‚ñ
+‚µ‚傤‚¿‚­‚΂¢
+‚µ‚傤‚¿‚イ
+‚µ‚悤‚¿‚イ
+‚¶‚傤‚¿‚å
+‚µ‚傤‚¿‚傤
+‚µ‚傤‚¿‚å‚­
+‚µ‚傤‚‚«
+‚µ‚傤‚Ä‚ñ
+‚µ‚傤‚Ä‚ñ‚ª‚¢
+‚µ‚傤‚Æ
+‚µ‚傤‚Ç
+‚¶‚傤‚Ç
+‚µ‚傤‚Ç‚¤
+‚¶‚傤‚Æ‚¤
+‚¶‚傤‚Ç‚¤
+‚µ‚傤‚Æ‚­
+‚µ‚傤‚Ç‚­‚¦‚«
+‚µ‚傤‚Æ‚è‚Ђ«
+‚¶‚傤‚È‚¢
+‚µ‚傤‚É‚©
+‚µ‚傤‚É‚©‚¢
+‚µ‚傤‚ɂイ‚Ç‚¤
+‚µ‚傤‚É‚ñ
+‚µ‚悤‚É‚ñ
+‚¶‚傤‚É‚ñ
+‚µ‚傤‚Ë
+‚¶‚傤‚Ë‚Â
+‚µ‚傤‚Ë‚ñ
+‚¶‚傤‚Ë‚ñ
+‚µ‚傤‚Ë‚ñ‚¢‚ñ
+‚µ‚傤‚Ë‚ñ‚Î
+‚µ‚傤‚Ì‚¤
+‚µ‚傤‚Í‚¢
+‚µ‚傤‚΂Â
+‚¶‚傤‚Í‚ñ‚µ‚ñ
+‚µ‚傤‚Ñ
+‚¶‚傤‚Ð
+‚µ‚傤‚Ђ´‚¢
+‚µ‚傤‚Ђµ‚á
+‚µ‚傤‚Ђº‚¢
+‚µ‚傤‚т傤
+‚¶‚傤‚Ђ傤
+‚µ‚傤‚Ђñ
+‚¶‚傤‚Ђñ
+‚µ‚傤‚Ђñ‚¯‚ñ
+‚µ‚傤‚Ó
+‚µ‚傤‚Ô
+‚¶‚傤‚Ô
+‚µ‚傤‚Ó‚¾
+‚µ‚傤‚Ô‚ñ
+‚¶‚傤‚Ô‚ñ
+‚µ‚傤‚Ö‚¢
+‚µ‚傤‚Ö‚«
+‚¶‚傤‚Ö‚«
+‚µ‚傤‚Ú‚¤
+‚µ‚悤‚Ù‚¤
+‚¶‚傤‚Ù‚¤
+‚µ‚傤‚Ú‚¤‚µ
+‚µ‚傤‚Ú‚¤‚µ‚á
+‚µ‚傤‚Ú‚¤‚µ‚å
+‚µ‚傤‚Ù‚ñ
+‚µ‚傤‚Ý
+‚¶‚傤‚Ý
+‚¶‚傤‚Ý‚á‚­
+‚µ‚傤‚Þ
+‚¶‚傤‚Þ
+‚¶‚傤‚Þ‚¢‚ñ
+‚¶‚傤‚Þ‚©‚¢
+‚¶‚傤‚ނ肶
+‚µ‚傤‚ß‚¢
+‚µ‚傤‚ß‚¢‚µ‚å
+‚µ‚傤‚ß‚ñ
+‚µ‚傤‚à‚¤‚Ђñ
+‚µ‚傤‚à‚ñ
+‚¶‚傤‚à‚ñ
+‚µ‚傤‚â‚­
+‚¶‚傤‚â‚Æ‚¤
+‚µ‚傤‚ä
+‚µ‚傤‚æ
+‚¶‚傤‚æ
+‚µ‚傤‚悤
+‚¶‚傤‚悤‚µ‚á
+‚¶‚傤‚æ‚­
+‚µ‚傤‚ç‚¢
+‚µ‚傤‚ç‚¢‚¹‚¢
+‚¶‚傤‚è
+‚µ‚傤‚è‚Â
+‚µ‚悤‚è‚Â
+‚¶‚傤‚è‚イ
+‚µ‚傤‚è‚傤
+‚µ‚傤‚è‚傤‚¦
+‚µ‚傤‚è‚å‚­
+‚¶‚傤‚è‚å‚­
+‚¶‚傤‚è‚å‚­‚¶‚ã
+‚¶‚傤‚é‚è
+‚µ‚傤‚ê‚¢
+‚¶‚傤‚ê‚ñ
+‚µ‚傤‚낤
+‚µ‚傤‚í
+‚µ‚å[
+‚¶‚储‚¤
+‚¶‚å[‚©[
+‚¶‚å[‚­
+‚µ‚傪
+‚µ‚å‚©‚¢
+‚¶‚傪‚­‚¹‚¢
+‚¶‚傪‚Á‚±‚¤
+‚µ‚å‚©‚ñ
+‚µ‚å‚«
+‚µ‚å‚«‚©‚ñ
+‚µ‚å‚«‚¿
+‚µ‚å‚«‚¿‚傤
+‚µ‚å‚«‚イ
+‚µ‚催‚傤
+‚¶‚å‚«‚傤‚¶‚ã
+‚¶‚å‚«‚å‚­
+‚µ‚å‚­
+‚µ‚å‚­‚ ‚ñ
+‚µ‚å‚­‚¢
+‚µ‚å‚­‚¢‚«
+‚µ‚å‚­‚¢‚ñ
+‚µ‚å‚­‚¦‚ñ
+‚µ‚å‚­‚¬‚傤
+‚µ‚å‚­‚¬‚傤‚Ñ‚å
+‚µ‚å‚­‚³‚ñ
+‚µ‚å‚­‚µ
+‚µ‚å‚­‚µ‚ã
+‚µ‚å‚­‚µ‚傤
+‚µ‚å‚­‚µ‚傤‚ª‚¢
+‚µ‚å‚­‚¹‚¢
+‚µ‚å‚­‚¹‚¢‚©‚Â
+‚µ‚å‚­‚º‚ñ
+‚µ‚å‚­‚¾‚¢
+‚µ‚å‚­‚½‚­
+‚µ‚å‚­‚¿
+‚µ‚å‚­‚‚¤
+‚µ‚å‚­‚Ç‚¤
+‚µ‚å‚­‚É‚­
+‚µ‚å‚­‚Ì‚¤
+‚µ‚å‚­‚Î
+‚µ‚å‚­‚΂¢
+‚µ‚å‚­‚Ï‚ñ
+‚µ‚å‚­‚Ð
+‚µ‚å‚­‚Ђñ
+‚µ‚å‚­‚Ô‚Â
+‚µ‚å‚­‚Ԃ‚ª‚­
+‚µ‚å‚­‚Ԃ‚ä
+‚µ‚å‚­‚Ô‚ñ
+‚µ‚å‚­‚Ù‚¤
+‚µ‚å‚­‚Ý‚ñ‚¿
+‚µ‚å‚­‚Þ
+‚µ‚å‚­‚ß‚¢
+‚µ‚å‚­‚悤
+‚µ‚å‚­‚æ‚­
+‚µ‚å‚­‚è‚傤
+‚µ‚å‚­‚è‚傤‚¿‚å
+‚µ‚å‚­‚è‚傤‚È‚ñ
+‚µ‚å‚­‚è‚傤‚Ђñ
+‚µ‚å‚­‚ê‚«
+‚¶‚å‚­‚ñ
+‚µ‚傯‚¢
+‚¶‚傯‚¢
+‚µ‚傯‚¢‚Ð
+‚¶‚傯‚Â
+‚µ‚傯‚ñ
+‚µ‚å‚°‚ñ
+‚¶‚å‚°‚ñ
+‚µ‚傱
+‚µ‚傱‚¤
+‚µ‚傲‚¤
+‚µ‚傱‚­
+‚µ‚傱‚ñ
+‚µ‚傳
+‚µ‚å‚´‚¢
+‚¶‚傳‚¢
+‚µ‚å‚´‚¢‚¿
+‚µ‚傳‚ñ
+‚¶‚傳‚ñ‚Õ
+‚µ‚債
+‚µ‚傶
+‚¶‚傶
+‚µ‚債‚«
+‚¶‚債‚±‚¤
+‚¶‚傶‚µ
+‚¶‚債‚¾‚¢
+‚µ‚傶‚¿‚傤
+‚¶‚債‚ã
+‚¶‚債‚イ
+‚µ‚債‚ã‚ñ
+‚µ‚傶‚ã‚ñ
+‚µ‚債‚å
+‚µ‚傶‚å
+‚µ‚債‚傤
+‚µ‚傶‚傤
+‚¶‚傶‚傤
+‚¶‚債‚å‚­
+‚µ‚債‚ñ
+‚µ‚債‚ñ‚µ‚á
+‚µ‚債‚ñ‚è‚傤
+‚¶‚å‚·‚¤
+‚µ‚傹‚¢
+‚¶‚傹‚¢
+‚¶‚傹‚¢‚«‚ñ
+‚µ‚傹‚«
+‚µ‚傹‚Â
+‚¶‚傹‚Â
+‚¶‚傹‚‚µ‚á
+‚µ‚傹‚ñ
+‚¶‚å‚»‚¤‚´‚¢
+‚µ‚傼‚ñ
+‚µ‚傽‚¢
+‚µ‚傾‚¢
+‚µ‚傽‚¢‚ß‚ñ
+‚µ‚傾‚È
+‚µ‚傾‚ñ
+‚¶‚å‚¿‚イ
+‚¶‚å‚¿‚イ‚¬‚­
+‚µ‚å‚¿‚傤
+‚µ‚å‚Á‚©‚¢
+‚µ‚å‚Á‚©‚­
+‚µ‚å‚Á‚©‚ñ
+‚µ‚å‚Á‚©‚ñ‚Ù‚¤
+‚µ‚å‚Á‚«‚ñ‚®
+‚µ‚å‚Á‚­
+‚µ‚å‚Á‚¯‚ñ
+‚µ‚å‚Á‚±‚¤
+‚µ‚å‚Á‚Æ
+‚µ‚å‚Á‚Õ
+‚µ‚å‚Ä
+‚µ‚å‚Ä‚¢
+‚µ‚å‚Ä‚ñ
+‚µ‚å‚Ä‚ñ‚ª‚¢
+‚µ‚å‚Æ‚¤
+‚µ‚å‚Ç‚¤
+‚¶‚å‚Ç‚¤‚µ
+‚µ‚å‚Æ‚­
+‚µ‚å‚È‚¢
+‚¶‚å‚È‚ñ
+‚µ‚å‚É‚¿
+‚µ‚å‚É‚ñ
+‚µ‚å‚É‚ñ‚«‚イ
+‚µ‚å‚Ë‚ñ‚Ç
+‚µ‚å‚Í‚ñ
+‚µ‚å‚Ђ傤
+‚¶‚å‚Ô
+‚µ‚å‚Ô‚Á‚©
+‚¶‚å‚Ô‚ñ
+‚µ‚å‚Ù
+‚µ‚å‚Ù‚¤
+‚µ‚å‚Ú‚¤
+‚µ‚å‚Ù‚¤‚¹‚ñ
+‚¶‚å‚Ü‚­
+‚¶‚å‚Ü‚­‚µ‚«
+‚µ‚å‚Ý‚ñ
+‚µ‚å‚Þ
+‚µ‚å‚Þ‚©
+‚µ‚å‚Þ‚ª‚©‚è
+‚µ‚å‚ß‚¢
+‚µ‚å‚ß‚ñ
+‚µ‚å‚à‚Â
+‚µ‚å‚à‚ñ‚¾‚¢
+‚µ‚å‚â
+‚¶‚å‚â
+‚¶‚å‚â‚­
+‚µ‚å‚䂤‚¯‚ñ
+‚µ‚å‚䂤‚µ‚á
+‚µ‚å‚䂤‚¿
+‚µ‚å‚悤
+‚µ‚å‚è‚«
+‚¶‚å‚è‚イ
+‚µ‚å‚é‚¢
+‚¶‚å‚ê‚Â
+‚µ‚å‚낤
+‚µ‚å‚ë‚ñ
+‚¶‚å‚ë‚ñ
+‚¶‚ç‚¢
+‚µ‚ç‚¢‚Æ
+‚µ‚炤‚¨
+‚µ‚ç‚©‚Î
+‚µ‚ç‚©‚×
+‚µ‚ç‚«
+‚µ‚炬‚­
+‚µ‚炱
+‚µ‚炳‚¬
+‚µ‚ç‚·
+‚µ‚炽‚«
+‚µ‚ç‚Æ‚è
+‚µ‚ç‚Í
+‚µ‚ç‚Ó
+‚µ‚ç‚ä‚è
+‚µ‚è
+‚µ‚è‚ ‚¢
+‚µ‚è‚ ‚é
+‚µ‚è[‚¸
+‚µ‚肤‚Ü
+‚¶‚è‚«
+‚µ‚肱‚ñ
+‚µ‚è‚Â
+‚¶‚è‚Â
+‚µ‚è‚ß
+‚µ‚è‚イ
+‚¶‚è‚イ
+‚µ‚è‚å
+‚µ‚è‚傤
+‚µ‚è‚å‚­
+‚¶‚è‚å‚­
+‚µ‚è‚ñ‚¾[
+‚µ‚é
+‚µ‚邦‚Á‚Æ
+‚µ‚é‚­
+‚µ‚é‚­‚ë[‚Ç
+‚µ‚邱
+‚µ‚邵
+‚µ‚ê‚¢
+‚¶‚ê‚¢
+‚µ‚ê‚ñ
+‚¶‚ê‚ñ‚Ü
+‚µ‚ë
+‚¶‚ë
+‚¶‚낤
+‚µ‚낪‚Ë
+‚µ‚ë‚­‚¶‚¿‚イ
+‚µ‚ë‚­‚ë
+‚µ‚ë‚´‚¯
+‚µ‚낶
+‚µ‚낽‚¦
+‚µ‚낽‚΂¢‚΂¢
+‚µ‚ë‚Ú‚µ
+‚µ‚ë‚Ý
+‚µ‚ë‚Þ‚­
+‚µ‚ë‚à‚Ì
+‚µ‚ë‚â‚Ü
+‚µ‚ë‚ñ
+‚¶‚ë‚ñ
+‚µ‚í‚´
+‚µ‚í‚·
+‚¶‚í‚è
+‚µ‚ñ
+‚¶‚ñ
+‚¶‚ñ‚ ‚¢
+‚µ‚ñ‚ ‚ñ
+‚¶‚ñ‚¢
+‚µ‚ñ‚¢‚«
+‚µ‚ñ‚¢‚ñ
+‚¶‚ñ‚¢‚ñ
+‚¶‚ñ‚¤
+‚µ‚ñ‚¤‚¿
+‚µ‚ñ‚¤‚ñ
+‚¶‚ñ‚¦‚¢
+‚µ‚ñ‚¦‚Â
+‚µ‚ñ‚¦‚ñ
+‚µ‚ñ‚¨‚¤
+‚µ‚ñ‚¨‚ñ
+‚µ‚ñ‚©
+‚¶‚ñ‚©
+‚µ‚ñ‚©‚¢
+‚¶‚ñ‚©‚¢
+‚µ‚ñ‚©‚¢‚¬‚å
+‚µ‚ñ‚ª‚¢‚µ‚á
+‚µ‚ñ‚©‚¢‚¿
+‚µ‚ñ‚ª‚¨
+‚µ‚ñ‚ª‚­
+‚µ‚ñ‚ª‚­‚©
+‚¶‚ñ‚©‚­‚µ‚á
+‚µ‚ñ‚ª‚­‚Ô
+‚µ‚ñ‚ª‚­‚è‚Â
+‚¶‚ñ‚ª‚³
+‚µ‚ñ‚ª‚½
+‚µ‚ñ‚ª‚Á‚©
+‚µ‚ñ‚©‚Ô
+‚µ‚ñ‚ª‚ç
+‚µ‚ñ‚©‚í
+‚µ‚ñ‚©‚ñ
+‚µ‚ñ‚ª‚ñ
+‚µ‚ñ‚©‚ñ‚¹‚ñ
+‚µ‚ñ‚«
+‚¶‚ñ‚¬
+‚µ‚ñ‚¬‚©‚¢
+‚µ‚ñ‚«‚¶‚­
+‚µ‚ñ‚¬‚¶‚ã‚Â
+‚µ‚ñ‚«‚イ
+‚µ‚ñ‚«‚å
+‚¶‚ñ‚«‚å
+‚µ‚ñ‚«‚å‚­
+‚µ‚ñ‚«‚낤
+‚µ‚ñ‚«‚ë‚­
+‚µ‚ñ‚«‚ñ
+‚µ‚ñ‚«‚ñ‚©‚ñ
+‚µ‚ñ‚­
+‚µ‚ñ‚®
+‚µ‚ñ‚®‚¤
+‚¶‚ñ‚®‚¤
+‚µ‚ñ‚­‚¤‚©‚ñ
+‚¶‚ñ‚­‚·
+‚µ‚ñ‚®‚é
+‚µ‚ñ‚®‚é‚·
+‚µ‚ñ‚­‚ë
+‚µ‚ñ‚¯‚¢‚©
+‚µ‚ñ‚¯‚¢‚µ‚Â
+‚µ‚ñ‚¯‚¢‚‚¤
+‚µ‚ñ‚°‚«
+‚µ‚ñ‚¯‚Â
+‚µ‚ñ‚°‚Â
+‚µ‚ñ‚¯‚ñ
+‚¶‚ñ‚¯‚ñ
+‚µ‚ñ‚¯‚ñ‚´‚¢
+‚µ‚ñ‚°‚ñ‚¿
+‚¶‚ñ‚¯‚ñ‚Ð
+‚µ‚ñ‚²
+‚¶‚ñ‚²
+‚µ‚ñ‚±‚¤
+‚¶‚ñ‚±‚¤‚¦‚¢‚¹‚¢
+‚µ‚ñ‚²‚¤‚«
+‚µ‚ñ‚±‚¤‚±‚­
+‚µ‚ñ‚±‚­‚µ‚å
+‚¶‚ñ‚±‚Â
+‚µ‚ñ‚±‚Á‚¿‚傤
+‚µ‚ñ‚±‚ñ
+‚µ‚ñ‚³
+‚µ‚ñ‚³‚¢
+‚µ‚ñ‚´‚¢
+‚¶‚ñ‚³‚¢
+‚¶‚ñ‚´‚¢
+‚µ‚ñ‚³‚¢‚ñ
+‚µ‚ñ‚³‚©
+‚µ‚ñ‚³‚«‚å‚­
+‚µ‚ñ‚³‚µ‚Â
+‚µ‚ñ‚³‚Ô
+‚µ‚ñ‚³‚ñ
+‚µ‚ñ‚´‚ñ
+‚µ‚ñ‚µ
+‚µ‚ñ‚¶
+‚¶‚ñ‚¶‚¢‚ñ
+‚¶‚ñ‚¶‚©
+‚¶‚ñ‚¶‚ª‚©‚è
+‚µ‚ñ‚µ‚«
+‚¶‚ñ‚¶‚«‚å‚­
+‚µ‚ñ‚¶‚¯[‚Æ
+‚µ‚ñ‚µ‚Â
+‚¶‚ñ‚¶‚Ô
+‚µ‚ñ‚µ‚Ó‚­
+‚µ‚ñ‚¶‚á
+‚¶‚ñ‚¶‚á
+‚µ‚ñ‚µ‚ã
+‚µ‚ñ‚¶‚ã
+‚¶‚ñ‚µ‚ã
+‚µ‚ñ‚¶‚ã‚Â
+‚¶‚ñ‚¶‚ã‚Â
+‚µ‚ñ‚µ‚ã‚‚«‚Ú‚Â
+‚µ‚ñ‚µ‚ã‚ñ
+‚µ‚ñ‚µ‚å
+‚µ‚ñ‚¶‚å
+‚µ‚ñ‚µ‚傤
+‚µ‚ñ‚µ‚傤‚µ‚á
+‚µ‚ñ‚µ‚傤‚Ђ‚Î
+‚µ‚ñ‚µ‚傤‚Ђñ
+‚µ‚ñ‚µ‚傤‚Ú‚¤‚¾
+‚µ‚ñ‚µ‚å‚­
+‚µ‚ñ‚µ‚ë‚­
+‚µ‚ñ‚µ‚ñ
+‚¶‚ñ‚µ‚ñ
+‚µ‚ñ‚µ‚ñ‚«‚¦‚¢
+‚µ‚ñ‚¸‚¢
+‚µ‚ñ‚¹‚¢
+‚¶‚ñ‚¹‚¢
+‚µ‚ñ‚¹‚¢‚ª‚ñ
+‚¶‚ñ‚¹‚¢‚©‚ñ
+‚µ‚ñ‚¹‚¢‚µ‚å
+‚µ‚ñ‚¹‚¢‚Ђñ
+‚¶‚ñ‚¹‚¢‚ë‚ñ
+‚µ‚ñ‚¹‚©‚¢
+‚µ‚ñ‚¹‚«
+‚¶‚ñ‚¹‚«
+‚µ‚ñ‚¹‚³‚¢‚´
+‚µ‚ñ‚¹‚ñ
+‚µ‚ñ‚º‚ñ
+‚µ‚ñ‚»
+‚µ‚ñ‚»‚¤
+‚µ‚ñ‚¼‚¤
+‚¶‚ñ‚¼‚¤
+‚¶‚ñ‚¼‚¤‚¦‚ñ
+‚µ‚ñ‚¼‚¤‚т傤
+‚µ‚ñ‚¼‚­
+‚¶‚ñ‚»‚­
+‚µ‚ñ‚»‚±
+‚µ‚ñ‚»‚´‚¢
+‚µ‚ñ‚»‚Â
+‚µ‚ñ‚½‚¢
+‚¶‚ñ‚½‚¢
+‚¶‚ñ‚¾‚¢
+‚µ‚ñ‚¾‚¢‚µ‚á
+‚µ‚ñ‚½‚¢‚¹‚¢
+‚µ‚ñ‚½‚¢‚»‚¤
+‚µ‚ñ‚½‚­
+‚µ‚ñ‚½‚­‚¬‚ñ‚±‚¤
+‚¶‚ñ‚½‚ñ
+‚µ‚ñ‚¾‚ñ‚µ
+‚µ‚ñ‚¾‚ñ‚µ‚å
+‚µ‚ñ‚¿
+‚¶‚ñ‚¿
+‚¶‚ñ‚¿‚­
+‚µ‚ñ‚¿‚á
+‚µ‚ñ‚¿‚イ
+‚¶‚ñ‚¿‚イ
+‚µ‚ñ‚¿‚å
+‚µ‚ñ‚¿‚傤
+‚¶‚ñ‚‚¤
+‚µ‚ñ‚Ä‚¢
+‚¶‚ñ‚Ä‚¢
+‚µ‚ñ‚Ä‚ñ
+‚µ‚ñ‚Å‚ñ
+‚µ‚ñ‚Å‚ñ‚¸
+‚µ‚ñ‚Ä‚ñ‚¿
+‚µ‚ñ‚Æ
+‚µ‚ñ‚Ç
+‚µ‚ñ‚Æ‚¤
+‚¶‚ñ‚Æ‚¤
+‚¶‚ñ‚Ç‚¤
+‚µ‚ñ‚Æ‚¤‚è‚Â
+‚µ‚ñ‚Æ‚­
+‚¶‚ñ‚Æ‚­
+‚µ‚ñ‚Ç‚ë[‚Þ
+‚µ‚ñ‚È[
+‚µ‚ñ‚É‚Ù‚ñ
+‚µ‚ñ‚ɂイ
+‚µ‚ñ‚ɂイ‚ª‚­
+‚µ‚ñ‚ɂイ‚¹‚¢
+‚µ‚ñ‚Ë‚ñ
+‚µ‚ñ‚Ì‚¤
+‚µ‚ñ‚Ï
+‚µ‚ñ‚Ï‚¢
+‚µ‚ñ‚΂µ
+‚µ‚ñ‚΂ñ
+‚µ‚ñ‚Ï‚ñ
+‚µ‚ñ‚Ñ
+‚µ‚ñ‚Ò
+‚µ‚ñ‚Ò‚Â
+‚¶‚ñ‚Ò‚ñ
+‚µ‚ñ‚Ô
+‚µ‚ñ‚Õ
+‚µ‚ñ‚Õ‚¤
+‚µ‚ñ‚Õ‚­
+‚µ‚ñ‚Ó‚º‚ñ
+‚µ‚ñ‚Ô‚Â
+‚µ‚ñ‚Õ‚é
+‚µ‚ñ‚Ô‚ñ
+‚¶‚ñ‚Ô‚ñ
+‚¶‚ñ‚Ô‚ñ‚ª‚­
+‚µ‚ñ‚Ô‚ñ‚µ
+‚µ‚ñ‚Ô‚ñ‚µ‚á
+‚µ‚ñ‚Ø‚ñ
+‚µ‚ñ‚Û‚¤
+‚¶‚ñ‚Ú‚¤
+‚µ‚ñ‚Û‚¶‚¤‚Þ
+‚µ‚ñ‚Ú‚é
+‚µ‚ñ‚Û‚ñ
+‚µ‚ñ‚Ü‚¢
+‚µ‚ñ‚Ý
+‚¶‚ñ‚Ý‚ñ
+‚µ‚ñ‚ß
+‚µ‚ñ‚ß‚¢
+‚¶‚ñ‚ß‚¢
+‚µ‚ñ‚à‚Â
+‚µ‚ñ‚â
+‚µ‚ñ‚â‚­
+‚¶‚ñ‚悤
+‚µ‚ñ‚悤‚«‚ñ‚±
+‚µ‚ñ‚悤‚­‚Ý‚ ‚¢
+‚µ‚ñ‚悤‚¶‚ã
+‚µ‚ñ‚悤‚¶‚傤
+‚µ‚ñ‚ç‚¢
+‚µ‚ñ‚ç‚¢‚©‚ñ
+‚µ‚ñ‚ç‚΂ñ‚µ‚傤
+‚µ‚ñ‚è
+‚µ‚ñ‚肪‚­
+‚¶‚ñ‚è‚«‚µ‚á
+‚µ‚ñ‚è‚å
+‚µ‚ñ‚è‚傤
+‚µ‚ñ‚è‚傤‚¶‚å
+‚¶‚ñ‚è‚å‚­
+‚µ‚ñ‚è‚ñ
+‚¶‚ñ‚è‚ñ
+‚µ‚ñ‚é‚¢
+‚¶‚ñ‚é‚¢
+‚¶‚ñ‚é‚¢‚ª‚­
+‚µ‚ñ‚ê‚¢
+‚µ‚ñ‚ë
+‚µ‚ñ‚낤
+‚¶‚ñ‚ë‚­
+‚µ‚ñ‚í
+ƒX
+‚·
+‚·
+ƒY
+‚¸
+‚¸
+‚·‚ ‚µ
+‚·‚¢
+‚¸‚¢
+‚·‚¢‚ ‚Â
+‚·‚¡[
+‚·‚¢‚¢
+‚·‚¢‚¢‚«
+‚¸‚¢‚¢‚¿
+‚¸‚¢‚¢‚ñ
+‚·‚¢‚¤‚ñ
+‚·‚¢‚¨‚ñ
+‚·‚¢‚©
+‚·‚¢‚ª‚¢
+‚·‚¢‚ª‚ç
+‚·‚¢‚ª‚ñ
+‚·‚¢‚¬‚ñ
+‚·‚¢‚¬‚ñ‚¿‚イ
+‚·‚¢‚¬‚ñ‚Æ‚¤
+‚·‚¢‚¯‚¢
+‚·‚¢‚°‚ñ
+‚·‚¢‚°‚ñ‚¿
+‚·‚¢‚±‚¤
+‚·‚¢‚³‚¢
+‚·‚¢‚³‚¢‚ª
+‚·‚¢‚³‚ñ
+‚·‚¢‚³‚ñ‚©‚Ô‚Â
+‚·‚¢‚³‚ñ‚¬‚傤
+‚·‚¢‚³‚ñ‚¯‚¢
+‚·‚¢‚³‚ñ‚Ô‚Â
+‚·‚¢‚µ‚Â
+‚·‚¢‚µ‚á
+‚·‚¢‚µ‚ã
+‚·‚¢‚¶‚ã‚ñ
+‚¸‚¢‚µ‚å
+‚·‚¢‚µ‚傤
+‚·‚¢‚¶‚傤
+‚·‚¢‚¶‚傤‚«
+‚·‚¢‚µ‚傤‚½‚¢
+‚·‚¢‚µ‚ñ
+‚·‚¢‚¶‚ñ
+‚·‚¢‚µ‚ñ‚©
+‚·‚¢‚µ‚ñ‚ª‚©‚è
+‚·‚¢‚µ‚ñ‚«‚å‚­
+‚·‚¢‚µ‚ñ‚Ô
+‚·‚¢‚¹‚¢
+‚·‚¢‚¹‚ñ
+‚·‚¢‚»
+‚·‚¢‚»‚¤
+‚·‚¢‚¼‚¤
+‚·‚¢‚»‚¤‚ª‚­
+‚·‚¢‚½‚­
+‚·‚¢‚¿‚イ
+‚·‚¢‚¿‚イ‚æ‚­‚¹
+‚¸‚¢‚¿‚傤
+‚·‚¢‚¿‚å‚­
+‚·‚¢‚Ä‚¢
+‚·‚¢‚Ä‚«
+‚·‚¢‚Æ‚¤
+‚·‚¢‚Ç‚¤
+‚·‚¢‚Ç‚¤‚«‚å‚­
+‚·‚¢‚Ç‚¤‚΂µ
+‚·‚¢‚Æ‚¤‚Ú
+‚·‚¢‚΂­
+‚·‚¢‚΂ñ
+‚¸‚¢‚ЂÂ
+‚·‚¢‚Ó
+‚·‚¢‚Ô‚ñ
+‚·‚¢‚Ö‚¢
+‚·‚¢‚Ö‚¢‚¹‚ñ
+‚·‚¢‚Ö‚¢‚ß‚ñ
+‚·‚¢‚Ù‚¤
+‚·‚¢‚Ú‚­
+‚·‚¢‚Ú‚­‚ª
+‚·‚¢‚Ù‚ñ
+‚·‚¢‚Ü
+‚·‚¢‚Ý‚Â
+‚·‚¢‚Ý‚á‚­
+‚·‚¢‚Ý‚ñ‚®
+‚·‚¢‚ß‚¢
+‚·‚¢‚ß‚ñ
+‚·‚¢‚à‚Ì
+‚·‚¢‚à‚ñ
+‚·‚¢‚悤
+‚·‚¢‚悤‚¦‚«
+‚·‚¢‚悤‚Ñ
+‚·‚¢‚è‚­
+‚·‚¢‚è‚イ
+‚·‚¢‚è‚傤
+‚·‚¢‚è‚å‚­
+‚·‚¢‚ë
+‚·‚¤
+‚·‚¤‚©‚¢
+‚·‚¤‚ª‚­‚©
+‚·‚¤‚©‚±‚­
+‚·‚¤‚©‚µ‚å
+‚·‚¤‚ª‚Á‚©
+‚·‚¤‚¯‚ñ
+‚·‚¤‚±
+‚·‚¤‚µ
+‚·‚¤‚µ‚«
+‚·‚¤‚¶‚­
+‚·‚¤‚µ‚á
+‚·‚¤‚µ‚ã
+‚·‚¤‚¶‚イ
+‚·‚¤‚µ‚ã‚é‚¢
+‚·‚¤‚¹‚¢
+‚·‚¤‚¾‚¢
+‚¸‚¤‚½‚¢
+‚·‚¤‚¿
+‚·[‚Â
+‚·‚¤‚É‚ñ
+‚·[‚Ï
+‚·[‚Ï[
+‚·‚¤‚Ù‚ñ
+‚·‚¤‚Ü‚ñ
+‚·‚¤‚Ý‚Â
+‚·‚¤‚ß‚¢
+‚·‚¤‚è
+‚·‚¤‚è‚傤
+‚·‚¤‚ê‚Â
+‚¸‚¦
+‚·‚¦‚¨‚«
+‚·‚¦‚«‚¿
+‚·‚¦‚º‚ñ
+‚·‚¦‚Á‚±
+‚·‚¦‚Ђë
+‚·‚¦‚Ђ낪‚è
+‚·‚©[‚Æ
+‚·‚©‚¢
+‚¸‚ª‚¢‚±‚Â
+‚·‚ª‚¨
+‚·‚©‚µ
+‚·‚ª‚½
+‚·‚ª‚½‚Ý
+‚¸‚©‚ñ
+‚·‚«
+‚·‚¬
+‚·‚«‚Ü
+‚·‚«‚â
+‚·‚«‚á‚È
+‚·‚¬‚â‚Ü
+‚·‚­[‚½
+‚·‚­[‚é
+‚·‚­‚¦‚ 
+‚·‚­‚ç‚Á‚Õ
+‚·‚­‚è[‚ñ
+‚·‚­‚è‚ã[
+‚¸‚¯‚¢
+‚·‚¯‚¶‚ã[‚é
+‚·‚±‚ 
+‚¸‚±‚¤
+‚·‚±‚µ
+‚·‚±‚Á‚¿
+‚·‚²‚Ý
+‚·‚±‚ç
+‚·‚µ
+‚·‚¶
+‚¸‚µ
+‚·‚¶‚ ‚¢
+‚¸‚µ‚«
+‚·‚¶‚¿‚ª‚¢
+‚·‚¶‚Ý‚¿
+‚·‚¶‚傤
+‚¸‚¶‚傤
+‚·‚¸
+‚·‚¸‚©‚º
+‚·‚¸‚ß
+‚·‚¸‚ç‚ñ
+‚·‚¸‚è
+‚·‚»‚Ì
+‚·‚½[
+‚·‚½‚¢‚è‚·‚Æ
+‚·‚½‚¢‚é
+‚·‚½‚¶‚ ‚Þ
+‚·‚½‚¶‚¨
+‚·‚½‚Á‚­
+‚·‚½‚Å‚¡
+‚·‚½‚Ý‚È
+‚·‚¾‚ê
+‚·‚½‚ñ‚¾[‚Ç
+‚·‚½‚ñ‚Ç
+‚·‚½‚ñ‚΂¢
+‚·‚½‚ñ‚Õ
+‚·‚¿[‚é
+‚·‚¿‚ã‚í[‚Å‚·
+‚·‚¿‚ë[‚é
+‚¸‚‚¤
+‚·‚Â[‚é
+‚·‚Á‚Æ‚ñ‚«‚傤
+‚·‚Å
+‚·‚Ä‚¡‚Á‚­
+‚·‚Ä[‚¶
+‚·‚Ä[‚µ‚å‚ñ
+‚·‚Ä[‚½‚·
+‚·‚Ä‚ª‚Ë
+‚·‚Ä‚²
+‚·‚Ä‚Ë
+‚·‚Ăꂨ
+‚·‚Ä‚ñ‚ê‚·
+‚·‚Æ[‚Ô
+‚·‚Æ[‚è[
+‚·‚Æ[‚ñ
+‚·‚Æ‚Á‚­
+‚·‚Æ‚ç‚¢‚­
+‚·‚Æ‚ê[‚Æ
+‚·‚Æ‚ê‚·
+‚·‚Æ‚ë[
+‚·‚Æ‚ë‚ׂè[
+‚·‚Æ‚ë‚Ú
+‚·‚È
+‚·‚È‚¨
+‚·‚È‚¶
+‚·‚È‚Á‚­
+‚·‚È‚Ç‚¯‚¢
+‚·‚È‚Î
+‚·‚È‚Í‚Ü
+‚·‚È‚Í‚ç
+‚·‚È‚â‚Ü
+‚·‚Ì[
+‚·‚Ì‚à‚Ì
+‚·‚Ï‚¢‚·
+‚·‚Ï‚°‚Á‚Ä‚¡
+‚·‚΂±
+‚·‚Í‚¾
+‚·‚Ï‚É‚Á‚µ‚ã
+‚·‚΂é
+‚¸‚΂ñ
+‚·‚Ò[‚©
+‚·‚Ò[‚Å‚¡
+‚·‚Ò[‚Ç
+‚¸‚Ђ傤
+‚·‚Ò‚è‚Á‚Æ
+‚¸‚Ó
+‚·‚Ó‚¡‚ñ‚­‚·
+‚·‚Õ[‚é
+‚·‚Õ[‚ñ
+‚·‚Õ‚è‚ñ‚®
+‚·‚Õ‚è‚ñ‚­‚ç[
+‚·‚Õ‚è‚ñ‚½[
+‚·‚Õ‚ê‚Á‚Ç
+‚·‚Ø‚ 
+‚·‚Ø‚¢‚ñ‚²
+‚·‚Ø[‚·
+‚·‚Ø[‚Ç
+‚·‚Ø‚­‚Æ‚é
+‚·‚Ø‚µ‚á‚è‚·‚Æ
+‚·‚ׂÄ
+‚·‚Ø‚é
+‚¸‚Ù‚¤
+‚·‚Û[‚­‚·‚Ü‚ñ
+‚·‚Û[‚‚܂ñ
+‚·‚Û[‚Ä‚¡
+‚·‚Û[‚Ä‚¡[
+‚·‚Û‚Á‚Æ
+‚·‚Û‚ñ‚³
+‚·‚Û‚ñ‚¶
+‚·‚Ü[‚Æ
+‚·‚Ü‚¢‚é
+‚·‚Ý
+‚·‚Ý‚¦
+‚·‚Þ[‚·
+‚·‚Þ[‚¸
+‚·‚ß‚ñ
+‚¸‚ß‚ñ
+‚·‚à‚¤
+‚·‚à[‚­
+‚·‚à‚Á‚®
+‚·‚ç‚¢‚·
+‚·‚ç‚¢‚Ç
+‚·‚è
+‚·‚è[
+‚·‚è‚«‚¸
+‚·‚è‚Á‚Ï
+‚·‚è‚Þ
+‚·‚è‚é
+‚·‚ê[‚Æ
+‚·‚ë[
+‚·‚ë[‚ª‚ñ
+‚·‚ë[‚à[‚µ‚å‚ñ
+‚¸‚ë‚­
+‚·‚ë‚Á‚Æ
+‚·‚ñ
+‚·‚ñ‚©
+‚·‚ñ‚°‚«
+‚·‚ñ‚°‚ñ
+‚·‚ñ‚±‚­
+‚·‚ñ‚µ
+‚·‚ñ‚¶
+‚·‚ñ‚º‚ñ
+‚·‚ñ‚Ä‚Â
+‚·‚ñ‚т傤
+‚·‚ñ‚Ô‚ñ
+‚·‚ñ‚Û‚¤
+‚·‚ñ‚í
+ƒZ
+‚¹
+‚¹
+ƒ[
+‚º
+‚¹‚¢
+‚º‚¢
+‚¹‚¢‚ ‚­
+‚¹‚¢‚ ‚ñ
+‚¹‚¢‚¢
+‚¹‚¢‚¢‚«
+‚¹‚¢‚¢‚Á‚Ï‚¢
+‚¹‚¢‚¤
+‚¹‚¢‚¤‚ñ
+‚¹‚¢‚¦‚¢
+‚¹‚¢‚¦‚«
+‚¹‚¢‚¨‚¤
+‚¹‚¢‚¨‚ñ
+‚¹‚¢‚©
+‚¹‚¢‚©‚¢‚¢‚ñ
+‚¹‚¢‚©‚¢‚¯‚ñ
+‚¹‚¢‚©‚ª‚­
+‚¹‚¢‚©‚­
+‚¹‚¢‚ª‚­
+‚º‚¢‚ª‚­
+‚¹‚¢‚ª‚­‚©
+‚¹‚¢‚©‚‚Ð
+‚¹‚¢‚©‚Ô‚Â
+‚¹‚¢‚©‚ñ
+‚¹‚¢‚ª‚ñ
+‚º‚¢‚©‚ñ
+‚¹‚¢‚«
+‚¹‚¢‚¬
+‚¹‚¢‚«‚å
+‚¹‚¢‚¬‚å
+‚¹‚¢‚«‚傤
+‚¹‚¢‚¬‚傤
+‚¹‚¢‚¬‚å‚«
+‚¹‚¢‚¬‚å‚«‚«
+‚¹‚¢‚«‚å‚­
+‚¹‚¢‚­
+‚¹‚¢‚­‚¤‚¯‚ñ
+‚¹‚¢‚¯‚¢
+‚¹‚¢‚¯‚¢‚°‚©
+‚¹‚¢‚¯‚Â
+‚¹‚¢‚¯‚ñ
+‚¹‚¢‚°‚ñ
+‚¹‚¢‚²
+‚¹‚¢‚±‚¤
+‚¹‚¢‚²‚¤
+‚¹‚¢‚±‚¤‚¤‚Ç‚­
+‚¹‚¢‚±‚¤‚Æ‚¤‚Ä‚¢
+‚¹‚¢‚±‚­
+‚¹‚¢‚±‚Â
+‚º‚¢‚±‚Ý
+‚¹‚¢‚±‚ñ
+‚¹‚¢‚´
+‚¹‚¢‚³‚¢
+‚¹‚¢‚´‚¢
+‚¹‚¢‚´‚¢‚©‚¢
+‚¹‚¢‚³‚­
+‚¹‚¢‚³‚‚悾‚Â
+‚¹‚¢‚³‚ñ
+‚¹‚¢‚³‚ñ‚©
+‚¹‚¢‚³‚ñ‚ª‚©‚è
+‚¹‚¢‚³‚ñ‚´‚¢
+‚¹‚¢‚³‚ñ‚µ‚á
+‚¹‚¢‚³‚ñ‚¹‚¢
+‚¹‚¢‚³‚ñ‚¿
+‚¹‚¢‚³‚ñ‚Ô
+‚¹‚¢‚³‚ñ‚è‚傤
+‚¹‚¢‚µ
+‚¹‚¢‚¶
+‚¹‚¢‚¶‚©
+‚¹‚¢‚¶‚ª‚­
+‚¹‚¢‚µ‚Â
+‚¹‚¢‚¶‚Â
+‚¹‚¢‚¶‚á
+‚¹‚¢‚µ‚á‚¢‚ñ
+‚¹‚¢‚¶‚á‚­
+‚¹‚¢‚µ‚ã
+‚º‚¢‚µ‚イ
+‚¹‚¢‚µ‚å
+‚¹‚¢‚µ‚傤
+‚¹‚¢‚¶‚傤
+‚¹‚¢‚¶‚傤‚«
+‚¹‚¢‚µ‚傤‚Ë‚ñ
+‚¹‚¢‚µ‚傤‚Ђñ
+‚¹‚¢‚µ‚å‚­
+‚¹‚¢‚¶‚ñ
+‚¹‚¢‚µ‚ñ‚©
+‚¹‚¢‚µ‚ñ‚¹‚¢‚¢
+‚¹‚¢‚µ‚ñ‚т傤
+‚¹‚¢‚¶‚ñ‚т傤
+‚¹‚¢‚¸
+‚¹‚¢‚·‚¢
+‚¹‚¢‚·‚¤
+‚º‚¢‚¹‚¢
+‚¹‚¢‚¹‚«
+‚¹‚¢‚¹‚ñ
+‚¹‚¢‚º‚ñ
+‚¹‚¢‚»‚¤
+‚¹‚¢‚¼‚¤
+‚¹‚¢‚¼‚¤‚ª‚©‚è
+‚¹‚¢‚¼‚¤‚¬‚傤
+‚¹‚¢‚»‚¤‚¯‚ñ
+‚¹‚¢‚¼‚¤‚Ô
+‚¹‚¢‚¼‚¤‚à‚Æ
+‚¹‚¢‚½‚¢
+‚¹‚¢‚¾‚­
+‚¹‚¢‚¾‚ñ
+‚¹‚¢‚¿
+‚¹‚¢‚¿‚á
+‚¹‚¢‚¿‚イ
+‚¹‚¢‚¿‚傤
+‚¹‚¢‚¿‚傤‚«
+‚¹‚¢‚¿‚傤‚´‚¢
+‚¹‚¢‚µ‚å
+‚¹‚¢‚Ä‚ñ
+‚¹‚¢‚Å‚ñ
+‚¹‚¢‚Å‚ñ‚«
+‚¹‚¢‚Æ
+‚¹‚¢‚Ç
+‚¹‚¢‚Æ‚¤
+‚¹‚¢‚Æ‚¤‚Í
+‚¹‚¢‚È‚ñ
+‚¹‚¢‚È‚ñ‚¹‚¢
+‚¹‚¢‚É‚­
+‚º‚¢‚É‚­
+‚¹‚¢‚Ë‚ñ
+‚¹‚¢‚Ë‚ñ‚ª‚Á‚Ò
+‚¹‚¢‚Í‚­
+‚¹‚¢‚΂­
+‚¹‚¢‚Í‚ñ‚½‚¢
+‚¹‚¢‚Ð
+‚º‚¢‚Ñ‚«
+‚º‚¢‚Ñ‚«‚²
+‚º‚¢‚Ñ‚«‚Ü‚¦
+‚¹‚¢‚ЂÂ
+‚¹‚¢‚Ђ傤
+‚¹‚¢‚т傤
+‚¹‚¢‚т傤‚©
+‚¹‚¢‚Ђñ
+‚¹‚¢‚Ó
+‚¹‚¢‚Ô
+‚¹‚¢‚Ó‚­
+‚¹‚¢‚Ô‚Â
+‚¹‚¢‚Ԃ‚©
+‚¹‚¢‚Ԃ‚ª‚­
+‚¹‚¢‚Ô‚ñ
+‚¹‚¢‚Ö‚«
+‚¹‚¢‚ׂÂ
+‚¹‚¢‚Ù
+‚¹‚¢‚Ú
+‚¹‚¢‚Ù‚¤
+‚¹‚¢‚Ú‚¤
+‚º‚¢‚Ù‚¤
+‚¹‚¢‚Ù‚¤‚¯‚¢
+‚¹‚¢‚Ù‚­
+‚¹‚¢‚Ù‚ñ
+‚¹‚¢‚Ý‚Â
+‚¹‚¢‚Ý‚á‚­
+‚º‚¢‚Þ
+‚º‚¢‚Þ‚©
+‚º‚¢‚Þ‚µ‚å
+‚¹‚¢‚ß‚¢
+‚¹‚¢‚ß‚ñ
+‚¹‚¢‚à‚ñ
+‚¹‚¢‚â
+‚¹‚¢‚â‚­
+‚¹‚¢‚â‚­‚µ‚å
+‚¹‚¢‚ä
+‚¹‚¢‚䂤
+‚¹‚¢‚æ‚­
+‚¹‚¢‚ç‚¢
+‚¹‚¢‚ç‚ñ
+‚¹‚¢‚è
+‚º‚¢‚è
+‚º‚¢‚肵
+‚º‚¢‚è‚Â
+‚¹‚¢‚è‚イ
+‚¹‚¢‚è‚イ‚«
+‚¹‚¢‚è‚傤
+‚¹‚¢‚è‚å‚­
+‚¹‚¢‚ê‚¢
+‚¹‚¢‚ê‚«
+‚¹‚¢‚ë‚ñ
+‚¹[‚½[
+‚¹[‚Ó
+‚¹[‚ç[
+‚¹[‚é
+‚¹‚¨‚Æ
+‚¹‚¨‚悬
+‚¹‚©‚¢
+‚¹‚©‚¢‚À‚イ
+‚¹‚©‚ñ‚Ç
+‚¹‚«
+‚¹‚«‚¤‚ñ
+‚¹‚«‚¦‚¢
+‚¹‚«‚ª‚¢
+‚¹‚«‚ª‚¢‚¹‚ñ
+‚¹‚«‚²
+‚¹‚«‚´‚¢
+‚¹‚«‚³‚¢‚è‚傤
+‚¹‚«‚¶
+‚¹‚«‚¶‚Â
+‚¹‚«‚¶‚イ‚¶
+‚¹‚«‚µ‚ã‚ñ
+‚¹‚«‚µ‚å
+‚¹‚«‚¶‚傤
+‚¹‚«‚µ‚å‚­
+‚¹‚«‚µ‚ñ
+‚¹‚«‚¸‚¢
+‚¹‚«‚·‚¤
+‚¹‚«‚¹‚‚è‚傤
+‚¹‚«‚½‚ñ
+‚¹‚«‚¿‚イ
+‚¹‚«‚¿‚ñ
+‚¹‚«‚‚¢
+‚¹‚«‚Ä‚¢
+‚¹‚«‚Æ‚¤
+‚¹‚«‚Ç‚¤
+‚¹‚«‚É‚ñ
+‚¹‚«‚É‚ñ‚©‚ñ
+‚¹‚«‚É‚ñ‚µ‚á
+‚¹‚«‚Ë‚ñ
+‚¹‚«‚Í‚ñ
+‚¹‚«‚΂ñ
+‚¹‚«‚Ð
+‚¹‚«‚Ö‚¢
+‚¹‚«‚Þ
+‚¹‚«‚ß‚ñ
+‚¹‚«‚ä
+‚¹‚«‚ã‚è‚Ä‚¡
+‚¹‚«‚ç‚ñ‚¤‚ñ
+‚¹‚«‚è
+‚¹‚«‚è‚å‚­
+‚¹‚«‚è‚ñ
+‚¹‚«‚킯
+‚¹‚­‚µ[
+‚¹‚­‚µ‚å‚ñ
+‚¹‚­‚½
+‚¹‚®‚ß‚ñ‚Æ
+‚¹‚¯‚ñ‚µ‚炸
+‚¹‚¯‚ñ‚Ä‚¢
+‚¹‚¶
+‚¹‚µ‚ã
+‚¹‚¶‚傤
+‚¹‚¶‚ñ
+‚¹‚·‚¶
+‚º‚º‚ЂÐ
+‚¹‚»‚¤
+‚¹‚¼‚­
+‚¹‚½‚¢
+‚¹‚¾‚¢
+‚¹‚½‚¯
+‚¹‚¾‚ñ
+‚º‚Á‚©
+‚¹‚Á‚©‚¢
+‚º‚Á‚©‚¢
+‚¹‚Á‚©‚¢‚ª‚ñ
+‚¹‚‚ª‚ñ
+‚¹‚Á‚«
+‚º‚Á‚«‚傤
+‚¹‚Á‚­
+‚¹‚Á‚¯‚¢
+‚º‚Á‚¯‚¢
+‚¹‚Á‚¯‚¢‚©
+‚¹‚Á‚¯‚¢‚ª‚©‚è
+‚¹‚Á‚¯‚¢‚µ
+‚¹‚Á‚¯‚¢‚µ‚Â
+‚¹‚Á‚¯‚¢‚Ô
+‚¹‚Á‚¯‚Á‚«‚イ
+‚¹‚Á‚¯‚ñ
+‚¹‚‚°‚ñ
+‚º‚‚²
+‚¹‚Á‚±‚¤
+‚º‚Á‚±‚¤
+‚º‚Á‚±‚ñ
+‚¹‚Á‚³‚­
+‚¹‚Á‚µ
+‚¹‚‚¶
+‚¹‚Á‚µ‚á
+‚¹‚Á‚µ‚傤
+‚¹‚‚¶‚傤
+‚¹‚‚¶‚å‚­‚¹‚ñ
+‚º‚Á‚¹‚¢
+‚¹‚Á‚¹‚ñ
+‚¹‚Á‚»‚¤
+‚¹‚‚¼‚­‚µ
+‚º‚Á‚½‚¢
+‚º‚‚¾‚¢
+‚º‚Á‚½‚¢‚¿
+‚¹‚Á‚½‚­
+‚º‚Á‚½‚ñ
+‚¹‚‚¾‚ñ‚«
+‚¹‚Á‚¿‚á‚­‚´‚¢
+‚¹‚Á‚¿‚á‚ñ
+‚º‚Á‚¿‚傤
+‚¹‚‚Ç
+‚º‚Á‚Æ
+‚¹‚Á‚Æ‚¤‚²
+‚¹‚Á‚Æ‚¤‚¶
+‚¹‚Á‚Æ‚­‚è‚å‚­
+‚º‚Á‚Ï‚ñ
+‚¹‚‚Ñ
+‚¹‚‚т¶
+‚º‚Á‚Ò‚Â
+‚º‚Á‚Ò‚ñ
+‚¹‚‚Ԃñ
+‚º‚Á‚Ø‚«
+‚º‚Á‚Û‚¤
+‚º‚‚Þ
+‚¹‚‚è
+‚¹‚‚ë‚ñ
+‚¹‚‚í
+‚¹‚Æ
+‚¹‚Ç
+‚¹‚Æ‚¬‚í
+‚¹‚Æ‚à‚Ì
+‚º‚É
+‚º‚Ë‚ç‚é
+‚¹‚Ï‚ê[‚Æ
+‚¹‚΂ñ‚²‚¤
+‚º‚Ð
+‚¹‚Ò‚ 
+‚¹‚Ђ傤
+‚¹‚Õ‚Ä‚ñ‚Î[
+‚¹‚Ô‚ñ
+‚¹‚Ú‚Ë
+‚¹‚Ý
+‚¹‚Ý‚±‚ë‚ñ
+‚¹‚Ý‚È
+‚¹‚ß
+‚¹‚ß‚ñ‚Æ
+‚¹‚ç‚Ý‚Á‚­
+‚¹‚è
+‚º‚è[
+‚¹‚è[‚®
+‚¹‚è‚¢‚¿
+‚¹‚è‚Ó
+‚¹‚é‚Ó‚³[‚Ñ‚·
+‚¹‚é‚ë‚¢‚Ç
+‚¹‚ê‚­‚Æ
+‚¹‚ë
+‚º‚ë
+‚¹‚ë‚Í‚ñ
+‚¹‚ë‚Ó‚Ÿ‚ñ
+‚¹‚í‚É‚ñ
+‚¹‚í‚â‚­
+‚¹‚ñ
+‚º‚ñ
+‚º‚ñ‚ ‚­
+‚¹‚ñ‚¢
+‚º‚ñ‚¢
+‚º‚ñ‚¢‚«
+‚¹‚ñ‚¢‚ñ
+‚º‚ñ‚¢‚ñ
+‚¹‚ñ‚¦‚¢
+‚º‚ñ‚¦‚¢
+‚¹‚ñ‚¦‚ñ
+‚¹‚ñ‚¨‚­
+‚º‚ñ‚©
+‚¹‚ñ‚ª‚¢
+‚º‚ñ‚©‚¢
+‚¹‚ñ‚©‚­
+‚¹‚ñ‚ª‚­
+‚º‚ñ‚©‚­
+‚º‚ñ‚ª‚­
+‚¹‚ñ‚©‚ñ
+‚º‚ñ‚©‚ñ
+‚¹‚ñ‚«
+‚º‚ñ‚«
+‚º‚ñ‚«‚Ü‚Â
+‚¹‚ñ‚«‚á‚­
+‚¹‚ñ‚«‚á‚­‚΂ñ‚ç
+‚¹‚ñ‚«‚傤
+‚¹‚ñ‚¬‚傤
+‚¹‚ñ‚«‚傤‚µ
+‚¹‚ñ‚«‚å‚­
+‚º‚ñ‚«‚å‚­
+‚¹‚ñ‚«‚傯‚ñ
+‚¹‚ñ‚«‚傹‚ñ
+‚º‚ñ‚¬‚ñ‚«‚傤
+‚º‚ñ‚­
+‚¹‚ñ‚­‚µ‚á
+‚¹‚ñ‚­‚¿
+‚¹‚ñ‚­‚ñ
+‚¹‚ñ‚¯‚¢
+‚º‚ñ‚¯‚¢
+‚¹‚ñ‚°‚Â
+‚º‚ñ‚°‚Â
+‚º‚ñ‚°‚‚܂Â
+‚¹‚ñ‚¯‚ñ
+‚º‚ñ‚¯‚ñ
+‚º‚ñ‚°‚ñ
+‚¹‚ñ‚±
+‚º‚ñ‚±
+‚¹‚ñ‚±‚¤
+‚º‚ñ‚±‚¤
+‚¹‚ñ‚±‚­
+‚¹‚ñ‚²‚­
+‚º‚ñ‚±‚­
+‚º‚ñ‚²‚³‚­
+‚º‚ñ‚±‚ñ
+‚¹‚ñ‚³
+‚º‚ñ‚´
+‚¹‚ñ‚³‚¢
+‚¹‚ñ‚´‚¢
+‚º‚ñ‚³‚¢
+‚º‚ñ‚´‚¢
+‚º‚ñ‚³‚­
+‚¹‚ñ‚µ
+‚¹‚ñ‚¶
+‚º‚ñ‚µ
+‚º‚ñ‚¶
+‚¹‚ñ‚¶‚©
+‚¹‚ñ‚¶‚¿‚イ
+‚¹‚ñ‚¶‚Â
+‚º‚ñ‚¶‚Â
+‚¹‚ñ‚µ‚á
+‚¹‚ñ‚¶‚á
+‚º‚ñ‚µ‚á
+‚¹‚ñ‚µ‚ã
+‚¹‚ñ‚µ‚イ
+‚º‚ñ‚µ‚イ
+‚¹‚ñ‚µ‚イ‚ç‚­
+‚¹‚ñ‚µ‚ク‚ñ
+‚¹‚ñ‚µ‚ゾ‚ñ
+‚¹‚ñ‚¶‚ã‚Â
+‚¹‚ñ‚µ‚ã‚ñ
+‚º‚ñ‚µ‚å
+‚¹‚ñ‚¶‚傤
+‚¹‚ñ‚¶‚傤‚¦‚«
+‚¹‚ñ‚¶‚傤‚¿
+‚¹‚ñ‚µ‚å‚­
+‚º‚ñ‚µ‚å‚­‚¢‚ñ
+‚¹‚ñ‚µ‚å‚­‚½‚¢
+‚¹‚ñ‚µ‚ñ
+‚º‚ñ‚µ‚ñ
+‚¹‚ñ‚µ‚ñ‚±‚­
+‚¹‚ñ‚·
+‚¹‚ñ‚·‚¢
+‚¹‚ñ‚·‚¢‚©‚ñ
+‚¹‚ñ‚·‚¢‚т傤
+‚º‚ñ‚·‚¤
+‚¹‚ñ‚¹‚¢
+‚º‚ñ‚¹‚¢
+‚º‚ñ‚¹‚¢‚«
+‚¹‚ñ‚¹‚¢‚¶‚ã‚Â
+‚¹‚ñ‚¹[‚µ‚å‚È‚é
+‚¹‚ñ‚¹[‚µ‚å‚ñ
+‚º‚ñ‚¹‚©‚¢
+‚º‚ñ‚¹‚«
+‚º‚ñ‚¹‚«‚É‚ñ
+‚º‚ñ‚¹‚Â
+‚¹‚ñ‚¹‚ñ
+‚¹‚ñ‚º‚ñ
+‚º‚ñ‚¹‚ñ
+‚¹‚ñ‚¼
+‚º‚ñ‚»‚¤‚«‚å‚­
+‚¹‚ñ‚»‚­
+‚¹‚ñ‚¼‚­
+‚º‚ñ‚»‚­
+‚¹‚ñ‚½
+‚¹‚ñ‚½[
+‚¹‚ñ‚½‚¢
+‚º‚ñ‚½‚¢
+‚º‚ñ‚¾‚¢
+‚º‚ñ‚¾‚¢‚Ý‚à‚ñ
+‚¹‚ñ‚½‚­‚«
+‚¹‚ñ‚¾‚Â
+‚¹‚ñ‚¾‚Á‚Ä
+‚¹‚ñ‚½‚ñ
+‚º‚ñ‚¾‚ñ
+‚¹‚ñ‚¿
+‚º‚ñ‚¿‚º‚ñ‚Ì‚¤
+‚¹‚ñ‚¿‚ß[‚Æ‚é
+‚¹‚ñ‚¿‚á
+‚¹‚ñ‚¿‚á‚­‚¶‚ã‚ñ
+‚¹‚ñ‚¿‚イ
+‚¹‚ñ‚¿‚傤
+‚º‚ñ‚¿‚傤
+‚¹‚ñ‚Ä
+‚º‚ñ‚Ä‚¢
+‚¹‚ñ‚Ä‚Â
+‚¹‚ñ‚Ä‚ñ
+‚¹‚ñ‚Å‚ñ
+‚¹‚ñ‚Å‚ñ‚©
+‚¹‚ñ‚Å‚ñ‚ª‚©‚è
+‚¹‚ñ‚Å‚ñ‚«‚å‚­
+‚¹‚ñ‚Ä‚ñ‚¹‚¢
+‚¹‚ñ‚Å‚ñ‚Ô
+‚¹‚ñ‚Æ
+‚¹‚ñ‚Ç
+‚º‚ñ‚Ç
+‚¹‚ñ‚Æ‚¤
+‚¹‚ñ‚Ç‚¤
+‚º‚ñ‚Æ‚¤
+‚¹‚ñ‚Æ‚¤‚«
+‚¹‚ñ‚Æ‚ç‚é
+‚¹‚ñ‚Æ‚ë‚É‚­‚·
+‚º‚ñ‚É‚¶‚イ
+‚º‚ñ‚É‚¿‚¹‚¢
+‚º‚ñ‚É‚Á‚Û‚ñ
+‚º‚ñ‚É‚Ù‚ñ
+‚¹‚ñ‚ɂイ
+‚¹‚ñ‚ɂイ‚©‚ñ
+‚¹‚ñ‚É‚ñ
+‚¹‚ñ‚Ë‚Â
+‚¹‚ñ‚Ë‚ñ
+‚º‚ñ‚Ë‚ñ
+‚º‚ñ‚Ë‚ñ‚Ç
+‚º‚ñ‚Ì‚¤
+‚¹‚ñ‚Î
+‚º‚ñ‚Î
+‚¹‚ñ‚Ï‚¢
+‚¹‚ñ‚Ï‚­
+‚¹‚ñ‚΂Âé
+‚¹‚ñ‚΂ñ
+‚¹‚ñ‚Ï‚ñ
+‚º‚ñ‚Í‚ñ
+‚º‚ñ‚Ï‚ñ
+‚¹‚ñ‚Ò
+‚¹‚ñ‚т傤
+‚¹‚ñ‚Ñ‚ñ
+‚º‚ñ‚Ñ‚ñ
+‚º‚ñ‚Ò‚ñ
+‚¹‚ñ‚Ô
+‚¹‚ñ‚Õ
+‚¹‚ñ‚Õ‚¤
+‚¹‚ñ‚Õ‚¤‚«
+‚¹‚ñ‚Õ‚­
+‚º‚ñ‚Õ‚­
+‚¹‚ñ‚Õ‚­‚«
+‚¹‚ñ‚Ô‚ñ
+‚º‚ñ‚Ô‚ñ
+‚¹‚ñ‚ׂ¢
+‚¹‚ñ‚Ø‚¢
+‚º‚ñ‚ׂ¢
+‚¹‚ñ‚ׂÂ
+‚¹‚ñ‚ׂñ
+‚º‚ñ‚Ø‚ñ
+‚¹‚ñ‚Û‚¤
+‚º‚ñ‚Û‚¤
+‚¹‚ñ‚ڂ‚µ‚á
+‚º‚ñ‚Ü‚¢
+‚¹‚ñ‚Ü‚ñ
+‚¹‚ñ‚Ý‚ñ
+‚¹‚ñ‚Þ
+‚¹‚ñ‚ނƂ肵‚Ü‚è
+‚¹‚ñ‚ß‚ñ
+‚º‚ñ‚ß‚ñ
+‚¹‚ñ‚ß‚ñ‚¶‚å
+‚¹‚ñ‚à‚¤
+‚º‚ñ‚à‚¤
+‚¹‚ñ‚à‚ñ
+‚¹‚ñ‚à‚ñ‚¢
+‚¹‚ñ‚à‚ñ‚ª‚¢
+‚¹‚ñ‚à‚ñ‚²
+‚¹‚ñ‚à‚ñ‚µ
+‚¹‚ñ‚à‚ñ‚µ‚å‚­
+‚¹‚ñ‚à‚ñ‚Ä‚ñ
+‚º‚ñ‚â
+‚¹‚ñ‚â‚­
+‚¹‚ñ‚䂤
+‚¹‚ñ‚䂤‚è‚Â
+‚¹‚ñ‚悤
+‚º‚ñ‚悤
+‚¹‚ñ‚悤‚«
+‚¹‚ñ‚悤‚¹‚ñ
+‚º‚ñ‚ç
+‚¹‚ñ‚è
+‚¹‚ñ‚肪‚ñ
+‚¹‚ñ‚è‚Â
+‚¹‚ñ‚è‚á‚­
+‚º‚ñ‚è‚á‚­
+‚¹‚ñ‚è‚イ
+‚¹‚ñ‚è‚å
+‚º‚ñ‚è‚傤
+‚¹‚ñ‚è‚å‚­
+‚º‚ñ‚è‚å‚­
+‚º‚ñ‚è‚ñ
+‚¹‚ñ‚ê‚¢
+‚º‚ñ‚ê‚¢
+‚º‚ñ‚ê‚«
+‚¹‚ñ‚ë
+‚º‚ñ‚낤
+¿
+ƒ\
+‚»
+‚»
+ƒ]
+‚¼
+‚»‚¢‚ñ
+‚»‚¤
+‚¼‚¤
+‚»‚¤‚ ‚¢
+‚»‚¤‚¢
+‚»‚¤‚¢‚Ä‚ñ
+‚»‚¤‚¢‚ñ
+‚»‚¤‚¤‚Â
+‚»‚¤‚¤‚è‚ ‚°
+‚»‚¤‚¤‚ñ
+‚»‚¤‚¦‚ñ
+‚»‚¤‚©
+‚¼‚¤‚©
+‚»‚¤‚©‚¢
+‚»‚¤‚ª‚¢
+‚»‚¤‚©‚¢‚â
+‚»‚¤‚ª‚­
+‚¼‚¤‚©‚è‚Â
+‚»‚¤‚ª‚ñ‚«‚傤
+‚»‚¤‚©‚ñ‚²‚¤
+‚¼‚¤‚©‚ñ‚²‚¤
+‚»‚¤‚«
+‚»‚¤‚¬
+‚¼‚¤‚«
+‚¼‚¤‚«‚΂₵
+‚»‚¤‚¬‚傤
+‚»‚¤‚¬‚傤‚µ‚á
+‚»‚¤‚«‚å‚­
+‚»‚¤‚«‚å‚­‚¹‚ñ
+‚»‚¤‚¬‚ñ
+‚¼‚¤‚«‚ñ
+‚»‚¤‚­
+‚»‚¤‚¯
+‚¼‚¤‚°
+‚¼‚¤‚¯‚¢
+‚¼‚¤‚¯‚‚´‚¢
+‚»‚¤‚¯‚Á‚³‚ñ
+‚»‚¤‚¯‚ñ
+‚»‚¤‚°‚ñ
+‚»‚¤‚±
+‚»‚¤‚²
+‚»‚¤‚±‚¤
+‚»‚¤‚²‚¤
+‚»‚¤‚±‚¤‚©‚¢
+‚»‚¤‚²‚¤‚¯‚¢
+‚»‚¤‚±‚¤‚µ‚á
+‚»‚¤‚²‚¬‚ñ‚±‚¤
+‚»‚¤‚±‚­
+‚»‚¤‚±‚ñ
+‚¼‚¤‚³
+‚»‚¤‚³‚¢
+‚»‚¤‚´‚¢
+‚»‚¤‚³‚¢‚ñ
+‚»‚¤‚µ
+‚»‚¤‚µ‚«
+‚»‚¤‚¶‚«
+‚¼‚¤‚µ‚«
+‚»‚¤‚µ‚µ‚á
+‚»‚¤‚µ‚»‚¤‚ ‚¢
+‚»‚¤‚µ‚á
+‚»‚¤‚µ‚ã
+‚»‚¤‚¶‚イ‚µ
+‚»‚¤‚µ‚イ‚Ö‚ñ
+‚»‚¤‚¶‚ã‚­
+‚»‚¤‚µ‚ã‚ñ
+‚»‚¤‚µ‚å
+‚¼‚¤‚µ‚å
+‚»‚¤‚¶‚傤
+‚¼‚¤‚µ‚傤
+‚»‚¤‚µ‚å‚­‚Ђñ
+‚¼‚¤‚µ‚å‚­‚ë
+‚»‚¤‚µ‚ñ
+‚»‚¤‚µ‚ñ‚«
+‚»‚¤‚µ‚ñ‚®
+‚»‚¤‚¸
+‚»‚¤‚·‚¢
+‚¼‚¤‚·‚¢
+‚»‚¤‚·‚¤
+‚»‚¤‚¹‚¢
+‚»‚¤‚º‚¢
+‚»‚¤‚¹‚¢‚³‚ñ
+‚»‚¤‚¹‚«
+‚»‚¤‚¹‚Â
+‚¼‚¤‚¹‚ñ‚¶‚å
+‚»‚¤‚»‚¤
+‚»‚¤‚¼‚¤‚è‚å‚­
+‚»‚¤‚»‚­
+‚»‚¤‚¼‚­
+‚»‚¤‚¼‚­‚É‚ñ
+‚»‚¤‚»‚Ó
+‚»‚¤‚»‚Ú
+‚»‚¤‚»‚ñ
+‚»‚¤‚¾
+‚»‚¤‚½‚¢
+‚»‚¤‚¾‚¢
+‚»‚¤‚¾‚©
+‚»‚¤‚¾‚¿
+‚»‚¤‚¾‚ñ‚µ‚å
+‚»‚¤‚¾‚ñ‚â‚­
+‚»‚¤‚¿
+‚»‚¤‚¿‚傤
+‚»‚¤‚Å
+‚»‚¤‚Ä‚ñ
+‚»‚¤‚Æ
+‚»‚¤‚Æ‚¤
+‚»‚¤‚Ç‚¤
+‚¼‚¤‚Æ‚¤‚Ђñ
+‚»‚¤‚Æ‚­
+‚»‚¤‚È‚ñ‚µ‚á
+‚»‚¤‚Ë‚ñ
+‚»‚¤‚Î
+‚»‚¤‚Í‚Â
+‚»‚¤‚΂È
+‚»‚¤‚΂ñ
+‚»‚¤‚Ђ傤
+‚¼‚¤‚Ó‚­‚«
+‚¼‚¤‚Ö‚¢‚«‚å‚­
+‚»‚¤‚Ö‚«
+‚»‚¤‚ׂ‚©‚¢
+‚»‚¤‚Ù‚¤
+‚»‚¤‚Ù‚ñ
+‚¼‚¤‚Ù‚ñ
+‚»‚¤‚Ù‚ñ‚¯
+‚»‚¤‚Ù‚ñ‚Ä‚ñ
+‚»‚¤‚Ù‚ñ‚Ô
+‚»‚¤‚Ü‚Æ‚¤
+‚»‚¤‚Ý
+‚»‚¤‚Þ
+‚»‚¤‚Þ‚©
+‚»‚¤‚Þ‚ª‚©‚è
+‚»‚¤‚Þ‚Ô
+‚»‚¤‚ß‚ñ
+‚»‚¤‚ß‚ñ‚¹‚«
+‚»‚¤‚à‚­
+‚¼‚¤‚à‚Â
+‚»‚¤‚à‚Æ‚¶‚ß
+‚»‚¤‚à‚ñ
+‚»‚¤‚ç‚ñ
+‚»‚¤‚è
+‚¼‚¤‚è
+‚»‚¤‚肦‚«
+‚»‚¤‚肾‚¢‚¶‚ñ
+‚»‚¤‚è‚Ó
+‚»‚¤‚è‚å
+‚»‚¤‚è‚傤‚¶
+‚»‚¤‚è‚å‚­
+‚»‚¤‚é
+‚»‚¤‚é‚¢
+‚»‚¤‚ê‚¢
+‚»‚¤‚ê‚Â
+‚»‚¤‚ê‚ñ
+‚»‚¤‚낤
+‚»‚¤‚ë‚ñ
+‚»‚¤‚í
+‚»‚¤‚í‚«
+‚»‚¦‚¶
+‚»‚¦‚ñ
+‚»[‚·
+‚»[‚Æ
+‚»[‚ç[
+‚»[‚é
+‚¼[‚ñ
+‚»‚©
+‚»‚©‚¢
+‚»‚­
+‚¼‚­‚ ‚­
+‚»‚­‚¢‚ñ
+‚»‚­‚¨‚ñ
+‚¼‚­‚ª‚ç
+‚¼‚­‚²
+‚»‚­‚´
+‚»‚­‚³‚¢
+‚¼‚­‚¶
+‚»‚­‚µ‚Â
+‚»‚­‚¶‚Â
+‚»‚­‚¶‚å
+‚¼‚­‚µ‚傤
+‚¼‚­‚¶‚ñ
+‚¼‚­‚¹‚¢
+‚¼‚­‚¹‚Â
+‚»‚­‚½‚Â
+‚»‚­‚Ä‚¢‚«
+‚»‚­‚Ä‚¢‚¿
+‚»‚­‚Ç
+‚»‚­‚Ç‚¯‚¢
+‚¼‚­‚Ë‚ñ
+‚¼‚­‚Ô‚Â
+‚»‚­‚Ö‚«
+‚¼‚­‚Ö‚ñ
+‚¼‚­‚Ù‚¤
+‚¼‚­‚݂傤
+‚»‚­‚ß‚ñ
+‚»‚­‚ß‚ñ‚¸
+‚¼‚­‚è‚傤
+‚»‚­‚è‚å‚­
+‚»‚­‚낤
+‚¼‚­‚ë‚ñ
+‚»‚¯‚Á‚Æ
+‚»‚±
+‚»‚±‚¢
+‚»‚±‚¢‚ê
+‚»‚±‚¤
+‚»‚±‚­
+‚»‚±‚À‚©‚ç
+‚»‚±‚Ë
+‚»‚±‚Ñ‚«
+‚»‚³‚¢
+‚»‚³‚¦‚Ä‚¡
+‚»‚³‚ñ
+‚»‚µ
+‚»‚¶
+‚»‚µ‚Â
+‚»‚µ‚È
+‚»‚µ‚ã
+‚»‚·‚¢
+‚»‚·‚¤
+‚»‚¹‚¢
+‚»‚º‚¢
+‚»‚¹‚«
+‚»‚¹‚ñ
+‚»‚¼‚¤
+‚»‚¿‚ç
+‚»‚Â
+‚»‚Á‚©
+‚»‚Á‚«
+‚»‚Á‚«‚イ
+‚»‚Á‚«‚傤
+‚»‚‚¬‚傤‚µ‚«
+‚»‚Á‚«‚ñ
+‚»‚Á‚±‚¤
+‚»‚Á‚±‚¤‚¶‚å
+‚»‚Á‚±‚­
+‚¼‚Á‚±‚­
+‚»‚‚¶‚ã
+‚»‚Á‚¿
+‚»‚‚ë‚ñ
+‚»‚Å
+‚»‚Å‚ª‚«
+‚»‚Å‚®‚¿
+‚»‚Å‚½‚¯
+‚»‚Æ
+‚»‚Æ‚¤
+‚»‚Æ‚©‚×
+‚»‚Æ‚ª‚í
+‚»‚Æ‚Ì‚è
+‚»‚Æ‚Ú‚è
+‚»‚Æ‚Ü‚²
+‚»‚Æ‚Ü‚í‚è
+‚»‚È[
+‚»‚Ì
+‚»‚Ì‚¤
+‚»‚Ì‚±‚Æ
+‚»‚Ì‚¹‚Â
+‚»‚Ì‚½
+‚»‚Ì‚½‚ß
+‚»‚Ì‚Æ‚«
+‚»‚Ì‚Ü‚Ü
+‚»‚Ì‚à‚Ì
+‚»‚Î
+‚»‚΂¦
+‚»‚Ó
+‚»‚Ó‚Æ
+‚»‚Ó‚Æ‚¤‚¥‚ 
+‚»‚Õ‚ç‚Ì
+‚»‚Ú
+‚»‚Ü‚Â
+‚»‚Ý‚Â
+‚»‚ß
+‚»‚à‚»‚à
+‚»‚â
+‚»‚æ‚©‚º
+‚»‚ç
+‚»‚炲‚Æ
+‚»‚ç‚É
+‚»‚ç‚Ë
+‚»‚ç‚Ü‚ß
+‚»‚ç‚Ý‚Ý
+‚»‚è‚Ý
+‚»‚è‚イ‚µ
+‚»‚ê
+‚»‚ê‚­‚ç‚¢
+‚»‚ꂼ‚ê
+‚»‚ꂾ‚¯
+‚»‚ë
+‚»‚ë‚΂ñ
+‚»‚ñ
+‚¼‚ñ‚¢
+‚»‚ñ‚¦‚¢
+‚»‚ñ‚¦‚«
+‚»‚ñ‚¦‚«‚è‚Â
+‚»‚ñ‚©
+‚»‚ñ‚ª‚¢
+‚»‚ñ‚ª‚ñ
+‚»‚ñ‚¬
+‚»‚ñ‚«‚ñ
+‚»‚ñ‚®
+‚»‚ñ‚²‚¤
+‚»‚ñ‚µ‚傤
+‚»‚ñ‚¼‚­
+‚»‚ñ‚¾‚¢
+‚»‚ñ‚¿‚傤
+‚»‚ñ‚Æ‚­
+‚¼‚ñ‚Ë‚ñ
+‚»‚ñ‚Ò
+‚»‚ñ‚Õ
+‚»‚ñ‚Û
+‚»‚ñ‚Ú‚¤
+‚»‚ñ‚Ý‚ñ
+‚»‚ñ‚ß‚¢
+‚»‚ñ‚ç‚­
+‚»‚ñ‚è‚Â
+‚»‚ñ‚è‚å
+ƒ^
+‚½
+‚½
+ƒ_
+‚¾
+‚¾[‚­
+‚½[‚°‚Á‚Æ
+‚¾[‚·
+‚½[‚½‚ñ
+‚½[‚Æ‚é
+‚½[‚Ú
+‚½[‚Þ
+‚½[‚é
+‚½[‚ñ
+‚½‚¢
+‚¾‚¢
+‚½‚¢‚ 
+‚¾‚¢‚ 
+‚¾‚¢‚ ‚à‚ñ‚Ç
+‚¾‚¢‚ ‚è[
+‚¾‚¢‚ ‚é
+‚½‚¢‚ ‚ñ
+‚¾‚¢‚ ‚ñ
+‚½‚¢‚¢
+‚¾‚¢‚¢
+‚½‚¢‚¢‚­
+‚½‚¢‚¢‚­‚©
+‚½‚¢‚¢‚­‚©‚ñ
+‚¾‚¢‚¢‚¿
+‚¾‚¢‚¢‚¿‚¢‚ñ‚µ‚å
+‚¾‚¢‚¢‚¿‚ª‚©‚è
+‚¾‚¢‚¢‚¿‚¬
+‚¾‚¢‚¢‚¿‚É‚ñ‚µ‚á
+‚¾‚¢‚¢‚¿‚Ô
+‚¾‚¢‚¢‚¿‚é‚¢
+‚¾‚¢‚¢‚Á‚©
+‚¾‚¢‚¢‚Á‚µ‚ã
+‚¾‚¢‚¢‚Á‚¹‚ñ
+‚½‚¢‚¢‚ñ
+‚¾‚¢‚¦‚Á‚Æ
+‚¾‚¢‚¨‚¤
+‚¾‚¢‚¨[‚Ç
+‚½‚¢‚¨‚ñ
+‚½‚¢‚¨‚ñ‚¯‚¢
+‚½‚¢‚©
+‚½‚¢‚ª
+‚½‚¢‚ª[
+‚½‚¢‚©‚¢
+‚½‚¢‚ª‚¢
+‚¾‚¢‚ª‚¦
+‚½‚¢‚©‚­
+‚¾‚¢‚ª‚­
+‚¾‚¢‚ª‚­‚¢‚ñ
+‚½‚¢‚©‚­‚¹‚ñ
+‚¾‚¢‚©‚®‚ç
+‚½‚¢‚©‚ñ
+‚½‚¢‚ª‚ñ
+‚¾‚¢‚©‚ñ
+‚½‚¢‚©‚ñ‚µ‚«
+‚½‚¢‚«
+‚¾‚¢‚¬‚¢‚ñ
+‚¾‚¢‚«‚¬‚傤
+‚½‚¢‚«‚¯‚ñ
+‚¾‚¢‚¬‚µ
+‚¾‚¢‚«‚¿
+‚¾‚¢‚«‚Ú
+‚½‚¢‚¬‚ß‚¢‚Ô‚ñ
+‚½‚¢‚¬‚傤
+‚¾‚¢‚«‚傤
+‚½‚¢‚«‚å‚­
+‚½‚¢‚«‚ñ
+‚¾‚¢‚«‚ñ
+‚¾‚¢‚«‚ñ‚Ђ«‚©‚¦
+‚½‚¢‚­
+‚½‚¢‚­‚¤
+‚½‚¢‚®‚¤
+‚½‚¢‚­‚Â
+‚½‚¢‚®‚ñ
+‚½‚¢‚¯
+‚½‚¢‚¯‚¢
+‚¾‚¢‚¯‚¢
+‚½‚¢‚°‚ñ
+‚½‚¢‚¯‚ñ‚µ‚á
+‚½‚¢‚¯‚ñ‚¾‚ñ
+‚½‚¢‚±
+‚½‚¢‚²
+‚¾‚¢‚²
+‚½‚¢‚±‚¤
+‚½‚¢‚±‚¤‚µ‚á
+‚¾‚¢‚±‚¤‚Ô‚Â
+‚½‚¢‚±‚¤‚Ú‚¤
+‚¾‚¢‚²‚©
+‚¾‚¢‚²‚ª‚©‚è
+‚½‚¢‚±‚­
+‚¾‚¢‚±‚­
+‚½‚¢‚±‚΂ñ
+‚¾‚¢‚²‚Ô
+‚¾‚¢‚²‚Ý
+‚¾‚¢‚²‚é‚¢
+‚¾‚¢‚±‚ñ
+‚½‚¢‚³
+‚¾‚¢‚´
+‚¾‚¢‚´‚¢
+‚½‚¢‚³‚­
+‚½‚¢‚³‚ñ
+‚¾‚¢‚³‚ñ
+‚¾‚¢‚³‚ñ‚©
+‚¾‚¢‚³‚ñ‚ª‚©‚è
+‚¾‚¢‚³‚ñ‚²‚­
+‚¾‚¢‚³‚ñ‚µ‚á
+‚¾‚¢‚³‚ñ‚Ô
+‚¾‚¢‚³‚ñ‚é‚¢
+‚½‚¢‚µ
+‚½‚¢‚¶
+‚¾‚¢‚µ
+‚¾‚¢‚¶
+‚½‚¢‚µ‚©‚ñ
+‚¾‚¢‚µ‚«‚イ
+‚¾‚¢‚µ‚«‚傤
+‚½‚¢‚µ‚Â
+‚½‚¢‚µ‚á
+‚¾‚¢‚µ‚á
+‚¾‚¢‚¶‚á
+‚½‚¢‚µ‚á‚­‚½‚¢‚µ
+‚½‚¢‚¶‚ã
+‚½‚¢‚µ‚イ
+‚½‚¢‚¶‚イ
+‚½‚¢‚µ‚å
+‚½‚¢‚µ‚傤
+‚¾‚¢‚µ‚傤
+‚¾‚¢‚¶‚傤‚©‚ñ
+‚½‚¢‚µ‚傤‚Ђ傤
+‚½‚¢‚µ‚傤‚è‚傤
+‚½‚¢‚µ‚å‚­
+‚½‚¢‚µ‚å‚­‚«‚ñ
+‚½‚¢‚µ‚ñ
+‚½‚¢‚¶‚ñ
+‚¾‚¢‚µ‚ñ‚³‚¢
+‚¾‚¢‚·
+‚¾‚¢‚¸
+‚½‚¢‚·‚¢
+‚½‚¢‚·‚¤
+‚¾‚¢‚·‚¤
+‚½‚¢‚¹‚¢
+‚½‚¢‚¹‚«
+‚½‚¢‚¹‚Â
+‚¾‚¢‚¹‚Â
+‚½‚¢‚¹‚ñ
+‚½‚¢‚»
+‚½‚¢‚»‚­
+‚¾‚¢‚»‚Â
+‚¾‚¢‚½‚¢
+‚¾‚¢‚¾‚¢
+‚¾‚¢‚¾‚¢‚¢‚ë
+‚¾‚¢‚¾‚¢‚Ђ傤
+‚¾‚¢‚½‚·‚¤
+‚½‚¢‚¿
+‚¾‚¢‚¿
+‚¾‚¢‚¿‚傤
+‚¾‚¢‚¿‚傤‚«‚ñ
+‚½‚¢‚Ä‚¢
+‚½‚¢‚Ä‚«
+‚½‚¢‚Ä‚ñ
+‚½‚¢‚Æ
+‚½‚¢‚Ç
+‚¾‚¢‚Ç‚¤
+‚¾‚¢‚Æ‚¤‚è‚傤
+‚¾‚¢‚Ç‚±‚ë
+‚¾‚¢‚Æ‚µ
+‚½‚¢‚Æ‚é
+‚½‚¢‚È‚¢
+‚¾‚¢‚È‚²‚ñ
+‚¾‚¢‚É
+‚¾‚¢‚É‚©
+‚¾‚¢‚É‚ª‚©‚è
+‚¾‚¢‚É‚¶
+‚¾‚¢‚É‚µ‚ã
+‚½‚¢‚É‚¿
+‚¾‚¢‚É‚Ô
+‚½‚¢‚É‚ñ
+‚¾‚¢‚É‚ñ
+‚¾‚¢‚É‚ñ‚®
+‚½‚¢‚Ë‚Â
+‚¾‚¢‚Ì‚¤
+‚¾‚¢‚Î
+‚¾‚¢‚΂©‚è
+‚½‚¢‚Í‚ñ
+‚½‚¢‚΂ñ
+‚½‚¢‚Ð
+‚½‚¢‚Ò‚·‚Æ
+‚½‚¢‚т傤
+‚¾‚¢‚Ђ傤
+‚¾‚¢‚Ђ傤‚³‚­
+‚¾‚¢‚Ђ傤‚Ƃ肵
+‚½‚¢‚Ó‚¤
+‚¾‚¢‚Ó‚­
+‚½‚¢‚Ô‚Â
+‚¾‚¢‚Ô‚Â
+‚¾‚¢‚Ô‚Ô‚ñ
+‚½‚¢‚Õ‚ç‚¢‚½
+‚½‚¢‚Ö‚¢
+‚½‚¢‚ׂ¢
+‚½‚¢‚Ö‚¢‚悤
+‚½‚¢‚Ö‚ñ
+‚¾‚¢‚ׂñ
+‚¾‚¢‚ׂñ‚µ‚á
+‚½‚¢‚Ù‚¤
+‚½‚¢‚Ú‚­
+‚½‚¢‚Ù‚¶‚傤
+‚¾‚¢‚Ù‚ñ
+‚¾‚¢‚Ù‚ñ‚¦‚¢
+‚½‚¢‚Ü
+‚½‚¢‚Ü[
+‚½‚¢‚Ü‚Â
+‚¾‚¢‚݂傤
+‚½‚¢‚Ý‚ñ‚®
+‚½‚¢‚Þ
+‚½‚¢‚Þ‚¸
+‚½‚¢‚Þ‚è[
+‚¾‚¢‚ß‚¢
+‚¾‚¢‚ß‚¢‚µ
+‚½‚¢‚à‚¤
+‚¾‚¢‚à‚­
+‚¾‚¢‚à‚ñ
+‚¾‚¢‚à‚ñ‚¶
+‚¾‚¢‚à‚ñ‚¾‚¢
+‚½‚¢‚â
+‚¾‚¢‚â
+‚¾‚¢‚â‚­
+‚¾‚¢‚â‚à‚ñ‚Ç
+‚½‚¢‚悤
+‚½‚¢‚悤‚¯‚¢
+‚¾‚¢‚悤‚Ђñ
+‚¾‚¢‚æ‚ñ
+‚¾‚¢‚æ‚ñ‚©
+‚¾‚¢‚æ‚ñ‚Ô
+‚¾‚¢‚æ‚ñ‚é‚¢
+‚½‚¢‚ç
+‚¾‚¢‚è
+‚½‚¢‚è‚­
+‚½‚¢‚è‚­‚¾‚È
+‚¾‚¢‚肹‚«
+‚¾‚¢‚è‚É‚ñ
+‚½‚¢‚è‚á‚­
+‚½‚¢‚è‚傤
+‚½‚¢‚è‚å‚­
+‚½‚¢‚è‚ñ
+‚¾‚¢‚è‚ñ
+‚½‚¢‚é
+‚½‚¢‚ë
+‚½‚¢‚낤
+‚¾‚¢‚ë‚­
+‚¾‚¢‚ë‚­‚é‚¢
+‚½‚¢‚í‚ñ
+‚½‚¤
+‚¾‚¤
+‚¾‚¦‚«
+‚½‚¦‚Ü
+‚¾‚¦‚ñ
+‚½‚¨‚é
+‚½‚©
+‚½‚ª‚¢
+‚¾‚©‚¢‚³‚­
+‚½‚©‚­
+‚½‚ª‚­
+‚½‚©‚³‚²
+‚¾‚ª‚µ
+‚½‚©‚µ‚¨
+‚½‚©‚µ‚Ü‚¾
+‚½‚©‚¹
+‚¾‚©‚Â
+‚¾‚ª‚Á‚«
+‚½‚©‚Á‚¯‚¢
+‚½‚©‚È
+‚½‚©‚È‚Ý
+‚½‚©‚Ë
+‚½‚©‚Ó‚¾
+‚½‚©‚ç
+‚¾‚©‚ç
+‚½‚©‚ç‚­‚¶
+‚½‚©‚ç‚Ô‚Ë
+‚½‚©‚ç‚à‚Ì
+‚½‚©‚ñ
+‚½‚«
+‚¾‚«‚ ‚킹
+‚½‚«‚©‚í
+‚½‚«‚¬
+‚½‚«‚®‚¿
+‚½‚«‚µ‚½
+‚½‚«‚½
+‚½‚«‚‚Ú
+‚½‚«‚傤
+‚¾‚«‚傤‚ ‚ñ
+‚½‚­
+‚½‚®
+‚½‚­‚ ‚ñ
+‚½‚®‚¢
+‚¾‚­‚¨‚ñ
+‚½‚­‚¶
+‚½‚­‚µ[
+‚½‚­‚µ‚«
+‚½‚­‚¶‚¶‚å
+‚½‚­‚µ‚傤
+‚½‚­‚¶‚傤
+‚¾‚­‚·‚¢
+‚½‚­‚¹‚ñ
+‚½‚­‚¿
+‚¾‚­‚Ä‚ñ
+‚½‚­‚È‚¢
+‚½‚­‚Í‚¢‚Ñ‚ñ
+‚¾‚­‚Ð
+‚½‚­‚Ù‚ñ
+‚¾‚­‚è‚イ
+‚½‚­‚ë‚ñ
+‚½‚­‚킦
+‚½‚¯
+‚½‚°‚¢
+‚½‚¯‚¤‚Ü
+‚½‚¯‚´‚¨
+‚½‚¯‚Ì‚±
+‚½‚¯‚΂₵
+‚½‚¯‚â‚Ô
+‚½‚¯‚â‚Ü
+‚½‚¯‚ñ
+‚½‚°‚ñ
+‚½‚±
+‚½‚±‚¤‚µ‚«
+‚½‚±‚­
+‚½‚²‚³‚­
+‚½‚±‚ñ
+‚½‚³‚¢
+‚¾‚³‚­
+‚½‚³‚Â
+‚½‚´‚ñ‚Ì‚¢‚µ
+‚½‚µ
+‚½‚¶
+‚¾‚µ
+‚½‚¶‚Â
+‚¾‚µ‚Ë
+‚¾‚µ‚à‚Ì
+‚¾‚µ‚á
+‚½‚µ‚ã
+‚¾‚µ‚ã
+‚½‚¶‚イ
+‚½‚µ‚ã‚Ý
+‚½‚µ‚å
+‚½‚µ‚傤
+‚¾‚¶‚傤‚©‚ñ
+‚½‚µ‚å‚­
+‚½‚µ‚ñ
+‚½‚·‚¤
+‚¾‚·‚¤
+‚½‚·‚¤‚¯‚Â
+‚½‚·‚­
+‚¾‚·‚Æ
+‚½‚º‚¢
+‚¾‚¹‚¢
+‚½‚»‚¤
+‚½‚»‚ª‚ê
+‚¾‚»‚­
+‚½‚¾
+‚½‚¾‚¢‚Ü
+‚½‚½‚«‚¾‚¢
+‚½‚¾‚²‚Æ
+‚½‚¾‚µ‚ª‚«
+‚½‚½‚Ý
+‚½‚½‚Ý‚±‚Ý
+‚½‚½‚ñ
+‚½‚¿‚ ‚¢‚É‚ñ
+‚½‚¿‚ ‚ª‚è
+‚½‚¿‚¢
+‚½‚¿‚¢‚è‚«‚ñ‚µ
+‚½‚¿‚¨‚­‚ê
+‚½‚¿‚«
+‚½‚¿‚¬‚¦
+‚½‚¿‚΂È
+‚½‚¿‚â‚­
+‚¾‚¿‚ñ
+‚½‚Â
+‚½‚‚¢
+‚¾‚‚¢‚¶‚傤
+‚½‚Á‚«‚イ‚Ñ‚ñ
+‚¾‚‚¶
+‚¾‚Á‚µ‚ß‚ñ
+‚½‚Á‚µ‚á
+‚¾‚Á‚µ‚å‚­‚´‚¢
+‚½‚‚¶‚ñ
+‚½‚‚¹
+‚½‚Á‚¹‚¢‚è‚Â
+‚¾‚Á‚Æ
+‚½‚ÂÈ
+‚½‚Á‚Ò‚Â
+‚½‚‚Ԃñ
+‚½‚‚ׂñ
+‚½‚‚܂«
+‚½‚‚Ý
+‚½‚Ä
+‚¾‚Ä
+‚½‚Ä‚¢‚Æ
+‚½‚Ä‚¤‚è
+‚½‚Ä‚©‚¦‚«‚ñ
+‚½‚Ä‚®
+‚½‚Ä‚±‚¤
+‚½‚Ä‚µ
+‚½‚Ä‚¶‚Ü
+‚½‚¯
+‚½‚ÂÚ
+‚½‚Ä‚È‚ª
+‚½‚Ä‚Ë
+‚½‚Ä‚Ó‚¾
+‚½‚Ä‚à‚Ì
+‚½‚Ä‚â‚­‚µ‚á
+‚½‚Ă悱
+‚¾‚Ä‚ñ
+‚½‚Ç
+‚½‚Ç‚¤
+‚¾‚Æ‚¤‚¹‚¢
+‚½‚È‚´‚炵
+‚½‚Ȃ΂½
+‚½‚È‚ñ
+‚½‚É
+‚½‚É‚ ‚¢
+‚½‚É‚ª‚í
+‚½‚É‚®‚¿
+‚½‚É‚Ü
+‚½‚É‚ñ
+‚½‚É‚ñ‚¬‚傤‚¬
+‚½‚É‚ñ‚¸‚¤
+‚½‚Ê‚«
+‚½‚Ë
+‚½‚Ë‚ ‚Ô‚ç
+‚½‚Ë‚¢‚¿
+‚½‚Ë‚¢‚à
+‚½‚Ë‚¤‚µ
+‚½‚Ë‚¤‚Ü
+‚½‚Ë‚Ù‚ñ
+‚½‚Ë‚ñ
+‚½‚Ì‚¤
+‚½‚Í
+‚½‚Î
+‚½‚΂±
+‚½‚Í‚½
+‚½‚Ñ
+‚¾‚Ñ
+‚½‚Ñ‚³‚«
+‚½‚Ñ‚¾‚¿
+‚½‚Ñ‚Ñ‚Æ
+‚¾‚Ñ‚ñ‚®
+‚½‚Ó
+‚½‚Ô
+‚½‚Ô[
+‚½‚Ó‚¯‚ñ
+‚¾‚Ô‚è‚ã[
+‚¾‚Ô‚é
+‚¾‚Ô‚é‚·
+‚½‚Ô‚ê‚Á‚Æ
+‚½‚Ô‚ñ
+‚¾‚Ô‚ñ
+‚½‚ׂà‚Ì
+‚¾‚ׂñ
+‚½‚Ö‚ñ‚¯‚¢
+‚½‚Ù‚¤
+‚½‚Ú‚¤
+‚½‚Ù‚¤‚ß‚ñ
+‚¾‚Ú‚­‚µ‚傤
+‚½‚Ü
+‚½‚Ü‚®‚µ
+‚½‚Ü‚²
+‚½‚Ü‚µ‚¢
+‚½‚܂‚­‚è
+‚½‚Ü‚Ë‚¬
+‚½‚Ü‚Þ‚µ
+‚½‚Ü‚à‚Ì
+‚½‚Ü‚è‚Î
+‚½‚Ý
+‚¾‚Ý[
+‚¾‚Ý‚ñ
+‚¾‚Þ
+‚½‚ß
+‚¾‚ß
+‚½‚ß‚µ
+‚½‚ß‚Ä
+‚½‚ß‚É
+‚½‚ß‚ñ
+‚½‚à‚¤‚³‚­
+‚½‚悤
+‚½‚æ‚è
+‚¾‚ç[
+‚½‚è‚«
+‚½‚è‚Â
+‚¾‚è‚Â
+‚½‚è‚イ
+‚½‚è‚傤
+‚¾‚è‚å‚­
+‚¾‚é‚Ü
+‚½‚ê
+‚¾‚ê
+‚¾‚ê‚©
+‚½‚ê‚Ü‚­
+‚½‚ê‚ñ‚Æ
+‚½‚í[
+‚½‚í‚ç
+‚½‚ñ
+‚¾‚ñ
+‚½‚ñ‚¢
+‚¾‚ñ‚¢
+‚½‚ñ‚¢‚¿
+‚½‚ñ‚¢‚Â
+‚½‚ñ‚¨‚ñ
+‚½‚ñ‚¨‚ñ‚©‚¢
+‚½‚ñ‚©
+‚¾‚ñ‚©
+‚½‚ñ‚©[
+‚¾‚ñ‚©‚¢
+‚¾‚ñ‚ª‚¢
+‚½‚ñ‚ª‚ñ
+‚¾‚ñ‚ª‚ñ
+‚½‚ñ‚«
+‚¾‚ñ‚«
+‚½‚ñ‚«‚©‚ñ
+‚½‚ñ‚«‚¾‚¢‚ª‚­
+‚¾‚ñ‚«‚イ
+‚½‚ñ‚­
+‚½‚ñ‚®‚·‚Ä‚ñ
+‚¾‚ñ‚¯‚‚è‚å‚­
+‚½‚ñ‚¯‚ñ
+‚½‚ñ‚°‚ñ
+‚½‚ñ‚²
+‚¾‚ñ‚²
+‚½‚ñ‚±‚¤‚Ú‚ñ
+‚¾‚ñ‚±‚ñ
+‚½‚ñ‚´
+‚¾‚ñ‚³[
+‚½‚ñ‚³‚¢
+‚½‚ñ‚³‚¢‚Ú‚¤
+‚½‚ñ‚³‚«
+‚½‚ñ‚´‚­
+‚½‚ñ‚³‚ñ
+‚½‚ñ‚µ
+‚¾‚ñ‚µ
+‚¾‚ñ‚¶
+‚½‚ñ‚¶‚¥‚ñ‚Æ
+‚½‚ñ‚¶‚©‚ñ
+‚½‚ñ‚¶‚­
+‚½‚ñ‚¶‚¶‚Â
+‚½‚ñ‚µ‚á
+‚¾‚ñ‚µ‚á‚­
+‚½‚ñ‚¶‚イ
+‚½‚ñ‚¶‚ã‚ñ
+‚½‚ñ‚µ‚å
+‚½‚ñ‚µ‚傤
+‚¾‚ñ‚¶‚傤
+‚½‚ñ‚µ‚傤‚Æ‚¤
+‚½‚ñ‚¶‚傤‚Ñ
+‚½‚ñ‚µ‚å‚­
+‚¾‚ñ‚µ‚å‚­
+‚½‚ñ‚µ‚ñ
+‚½‚ñ‚·
+‚½‚ñ‚·‚¢
+‚½‚ñ‚·‚¢‚©‚Ô‚Â
+‚½‚ñ‚·‚¢‚¬‚å
+‚½‚ñ‚·‚¤
+‚¾‚ñ‚·‚¤
+‚½‚ñ‚¹‚¢
+‚½‚ñ‚¹‚¢‚Ç
+‚½‚ñ‚¹‚«
+‚½‚ñ‚¹‚ñ
+‚½‚ñ‚º‚ñ
+‚½‚ñ‚»
+‚½‚ñ‚»‚¤
+‚¾‚ñ‚»‚¤
+‚¾‚ñ‚»‚ñ‚¶‚å‚Ð
+‚½‚ñ‚½‚¢
+‚½‚ñ‚¾‚¢
+‚¾‚ñ‚½‚¢
+‚¾‚ñ‚¿
+‚½‚ñ‚¿‚«
+‚½‚ñ‚¿‚å
+‚¾‚ñ‚¿‚傤
+‚¾‚ñ‚‚¤
+‚½‚ñ‚Ä‚¢
+‚¾‚ñ‚Å‚¡
+‚½‚ñ‚Å‚ñ
+‚¾‚ñ‚Æ
+‚½‚ñ‚Æ‚¤
+‚¾‚ñ‚Ç‚¤
+‚½‚ñ‚Æ‚¤‚ª‚¢
+‚½‚ñ‚Æ‚¤‚µ‚á
+‚½‚ñ‚Ç‚­
+‚¾‚ñ‚È
+‚½‚ñ‚É
+‚½‚ñ‚É‚ñ
+‚½‚ñ‚Ï
+‚½‚ñ‚Ï‚­
+‚½‚ñ‚Ï‚­‚µ‚Â
+‚½‚ñ‚Ï‚Â
+‚½‚ñ‚Ñ
+‚½‚ñ‚҂傤
+‚½‚ñ‚Ò‚ñ
+‚¾‚ñ‚Õ
+‚½‚ñ‚Õ‚­
+‚½‚ñ‚Ô‚ñ
+‚½‚ñ‚Ø‚¢‚«‚イ
+‚½‚ñ‚Ø‚ñ
+‚¾‚ñ‚Ø‚ñ
+‚½‚ñ‚Ú
+‚½‚ñ‚Ü‚Â
+‚½‚ñ‚܂‚«
+‚¾‚ñ‚܂‚Ü
+‚½‚ñ‚ß‚¢
+‚½‚ñ‚ß‚ñ
+‚¾‚ñ‚ß‚ñ
+‚¾‚ñ‚ß‚ñ‚¸
+‚½‚ñ‚à‚Ì
+‚¾‚ñ‚â‚­
+‚¾‚ñ‚䂤
+‚½‚ñ‚悤
+‚¾‚ñ‚ç‚­
+‚½‚ñ‚è
+‚¾‚ñ‚è‚イ
+‚¾‚ñ‚è‚å‚­
+‚¾‚ñ‚ë
+ƒ`
+‚¿
+‚¿
+ƒa
+‚À
+‚À
+‚¿‚ ‚ñ
+‚¿‚¢
+‚¿‚¢‚«
+‚¿‚¢‚«‚ª‚½
+‚¿‚¢‚«‚³
+‚¿[‚¸
+‚À[‚º‚é
+‚¿[‚Ó
+‚¿[‚Þ
+‚¿‚¦
+‚¿‚¥‚·
+‚¿‚¥‚Á‚©[
+‚¿‚¥‚Á‚­‚¢‚ñ
+‚¿‚¦‚Ô‚­‚ë
+‚¿‚¥‚ë
+‚¿‚¦‚ñ
+‚¿‚¨‚ñ
+‚¿‚©‚¢
+‚¿‚ª‚¢‚Ù‚¤‚¯‚ñ
+‚¿‚©‚ª‚¢
+‚¿‚©‚­
+‚¿‚ª‚­
+‚¿‚ª‚­‚©
+‚¿‚©‚²‚ë
+‚¿‚©‚·‚¢
+‚¿‚ª‚Á‚©
+‚¿‚©‚Ä‚Â
+‚¿‚©‚Ç‚¤
+‚¿‚©‚Ü‚í‚è
+‚¿‚©‚ç
+‚¿‚©‚ç‚à‚¿
+‚¿‚«
+‚¿‚«‚イ
+‚¿‚«‚イ‚¬
+‚¿‚«‚イ‚¶‚傤
+‚¿‚¬‚å
+‚¿‚«‚傤
+‚¿‚¬‚è
+‚¿‚¬‚ñ
+‚¿‚­
+‚¿‚®‚¤
+‚¿‚®‚³
+‚¿‚­‚´‚¢
+‚¿‚­‚³‚ñ
+‚¿‚­‚µ‚á
+‚¿‚­‚Å‚ñ‚¿
+‚¿‚­‚Î
+‚¿‚­‚Ñ
+‚¿‚­‚ׂÂ
+‚¿‚­‚è‚ñ
+‚¿‚­‚í
+‚¿‚¯‚¢
+‚¿‚¯‚Á‚Æ
+‚¿‚¯‚ñ
+‚¿‚²
+‚¿‚±‚¤
+‚¿‚³‚¢
+‚¿‚³‚ñ
+‚¿‚µ
+‚¿‚µ‚¨
+‚¿‚µ‚«
+‚¿‚¶‚«
+‚¿‚¶‚­
+‚¿‚¶‚¹‚ñ
+‚¿‚µ‚Â
+‚¿‚µ‚‚ª‚­
+‚¿‚¶‚傤
+‚¿‚¶‚å‚­
+‚¿‚µ‚è‚傤
+‚¿‚¶‚ñ
+‚¿‚¸
+‚¿‚·‚¢
+‚¿‚·‚¶
+‚¿‚¹‚¢
+‚¿‚¹‚«
+‚¿‚»
+‚¿‚»‚¤
+‚¿‚»‚­
+‚¿‚½‚¢
+‚¿‚¾‚¢
+‚¿‚¿
+‚¿‚¿‚¨‚â
+‚¿‚¿‚イ
+‚¿‚¿‚イ‚©‚¢
+‚¿‚Á‚­
+‚¿‚‚¶‚å
+‚¿‚Á‚»
+‚¿‚Ä‚ñ
+‚¿‚Æ‚¹
+‚¿‚Ç‚è
+‚¿‚Ç‚è‚ ‚µ
+‚¿‚Ë‚Â
+‚¿‚Ì‚¤
+‚¿‚Ì‚¤‚Í‚ñ
+‚¿‚΂ñ
+‚¿‚Ђ傤
+‚¿‚Ђë
+‚¿‚Ô‚³
+‚¿‚Ö‚¢
+‚¿‚Ö‚¢‚¹‚ñ
+‚¿‚Ö‚ñ
+‚¿‚Ù‚¤
+‚¿‚Ù‚¤‚­
+‚¿‚Ù‚¤‚³‚¢
+‚¿‚Ù‚¤‚µ
+‚¿‚Ù‚¤‚µ‚å‚­
+‚¿‚Ù‚¤‚º‚¢
+‚¿‚Ù‚¤‚΂ñ
+‚¿‚Ý
+‚¿‚ß‚¢
+‚¿‚ß‚¢‚µ‚傤
+‚¿‚ß‚¢‚Ç
+‚¿‚à‚­
+‚¿‚á
+‚¿‚á[‚Æ
+‚¿‚á‚¢‚È
+‚¿‚á‚¢‚É[‚¸
+‚¿‚á‚¢‚é‚Ç
+‚¿‚á‚¢‚ë
+‚¿‚Ⴄ‚·
+‚¿‚á‚©‚¢
+‚¿‚Ⴊ‚µ
+‚¿‚á‚­‚¦‚«
+‚¿‚á‚­‚ª‚ñ‚Ä‚ñ
+‚¿‚á‚­‚µ
+‚¿‚á‚­‚µ‚å‚­‚è‚å
+‚¿‚á‚­‚È‚ñ
+‚¿‚á‚­‚Í‚Â
+‚¿‚á‚­‚΂炢
+‚¿‚Ⴖ‚ñ
+‚¿‚Ⴙ‚«
+‚¿‚Ⴝ‚­
+‚¿‚Ⴏ
+‚¿‚á‚ÂÂ
+‚¿‚á‚Ç‚±‚ë
+‚¿‚á‚Ë‚é
+‚¿‚á‚Ì‚Ý
+‚¿‚á‚Ì‚ä
+‚¿‚á‚΂ñ
+‚¿‚á‚Ñ‚ñ
+‚¿‚á‚Ô‚¾‚¢
+‚¿‚á‚Ù
+‚¿‚á‚Ý‚¹
+‚¿‚á‚è‚Ä‚¡
+‚¿‚á‚è‚Ä‚¡[
+‚¿‚á‚ê‚ñ‚¶‚á[
+‚¿‚á‚í‚ñ
+‚¿‚á‚ñ‚·
+‚¿‚á‚ñ‚Ë‚é
+‚¿‚á‚ñ‚Ò‚¨‚ñ
+‚¿‚䂤
+‚¿‚イ‚¢
+‚¿‚イ‚¢‚¶‚±‚¤
+‚¿‚イ‚¢‚Ù‚¤
+‚¿‚イ‚¢‚è‚å‚­
+‚¿‚ã[‚¢‚ñ‚ª‚Þ
+‚¿‚イ‚¨‚¤
+‚¿‚イ‚¨‚¤‚¿
+‚¿‚イ‚¨‚ñ
+‚¿‚イ‚©
+‚¿‚イ‚©‚¢
+‚¿‚イ‚ª‚¢
+‚¿‚イ‚©‚ª‚¢
+‚¿‚イ‚©‚­
+‚¿‚イ‚ª‚­‚¹‚¢
+‚¿‚イ‚ª‚­‚Ë‚ñ
+‚¿‚イ‚ª‚½
+‚¿‚イ‚ª‚½‚«
+‚¿‚イ‚ª‚Á‚±‚¤
+‚¿‚イ‚©‚ñ
+‚¿‚イ‚©‚ñ‚µ
+‚¿‚イ‚«
+‚¿‚イ‚«‚イ
+‚¿‚イ‚«‚傤
+‚¿‚イ‚«‚å‚è
+‚¿‚イ‚«‚ñ‚Æ‚¤
+‚¿‚イ‚­‚¤
+‚¿‚イ‚¯‚¢‚«
+‚¿‚イ‚¯‚¢‚µ‚å
+‚¿‚イ‚¯‚ñ
+‚¿‚イ‚°‚ñ
+‚¿‚イ‚±
+‚¿‚イ‚±‚¤
+‚¿‚イ‚±‚¤‚µ‚å‚­
+‚¿‚イ‚±‚¤‚»‚¤
+‚¿‚イ‚²‚­
+‚¿‚イ‚²‚­‚²
+‚¿‚イ‚²‚µ
+‚¿‚イ‚±‚µ‚á
+‚¿‚イ‚±‚ñ
+‚¿‚イ‚³
+‚¿‚イ‚´‚¢‚µ‚å
+‚¿‚イ‚¶‚¦‚ñ
+‚¿‚イ‚µ‚Ⴖ‚傤
+‚¿‚イ‚µ‚イ
+‚¿‚イ‚¶‚ã‚ñ
+‚¿‚イ‚µ‚傤
+‚¿‚イ‚¶‚傤
+‚¿‚イ‚µ‚傤‚«‚¬
+‚¿‚イ‚µ‚ñ‚¹‚ñ
+‚¿‚イ‚µ‚ñ‚Ä‚ñ
+‚¿‚イ‚·‚¢
+‚¿‚イ‚·‚¢‚¦‚ñ
+‚¿‚イ‚·‚¤
+‚¿‚イ‚¹‚¢
+‚¿‚イ‚º‚¢
+‚¿‚イ‚¹‚Â
+‚¿‚イ‚»
+‚¿‚イ‚»‚¤
+‚¿‚イ‚»‚­
+‚¿‚イ‚»‚­‚«
+‚¿‚イ‚»‚Â
+‚¿‚イ‚½‚¢
+‚¿‚イ‚Âè
+‚¿‚イ‚Ä‚Â
+‚¿‚イ‚Ä‚ñ
+‚¿‚イ‚Æ
+‚¿‚イ‚Æ‚¤
+‚¿‚イ‚Ç‚¤
+‚¿‚イ‚Æ‚¤‚©
+‚¿‚イ‚Æ‚ñ‚¿
+‚¿‚ã[‚È[
+‚¿‚イ‚È‚ñ‚ׂ¢
+‚¿‚イ‚É‚©‚¢
+‚¿‚イ‚É‚­
+‚¿‚イ‚É‚¿
+‚¿‚ã[‚É‚ñ‚®
+‚¿‚イ‚Í
+‚¿‚ã[‚Î
+‚¿‚イ‚΂ñ
+‚¿‚イ‚Ñ
+‚¿‚イ‚Ô
+‚¿‚ã[‚Ô
+‚¿‚イ‚Ô‚¤
+‚¿‚イ‚Ô‚ñ‚é‚¢
+‚¿‚イ‚ׂ¢
+‚¿‚イ‚Ú‚¤
+‚¿‚イ‚Ý‚Â
+‚¿‚イ‚à‚ñ‚µ‚å
+‚¿‚イ‚â
+‚¿‚イ‚悤
+‚¿‚ã[‚è‚Á‚Õ
+‚¿‚イ‚è‚イ
+‚¿‚イ‚è‚ñ‚¶‚傤
+‚¿‚イ‚낤‚¢
+‚¿‚ã[‚ñ
+‚¿‚å
+‚¿‚æ
+‚¿‚傤
+‚¿‚傤‚ ‚¢
+‚¿‚傤‚¢
+‚¿‚傤‚¦‚¢
+‚¿‚傤‚¦‚«
+‚¿‚傤‚¦‚ñ
+‚¿‚傤‚¨‚ñ
+‚¿‚傤‚¨‚ñ‚Ï
+‚¿‚傤‚©‚¢
+‚¿‚傤‚©‚­
+‚¿‚傤‚©‚½‚é
+‚¿‚傤‚©‚ñ
+‚¿‚傤‚«
+‚¿‚傤‚¬
+‚¿‚傤‚«‚傤‚µ
+‚¿‚傤‚«‚æ‚Ù‚¤
+‚¿‚傤‚«‚å‚è
+‚¿‚傤‚«‚ñ‚Ä‚ ‚Ä
+‚¿‚傤‚¯‚¢
+‚¿‚傤‚±‚¤
+‚¿‚傤‚±‚¤‚¹‚¢
+‚¿‚傤‚³
+‚¿‚傤‚³‚¢‚ñ
+‚¿‚傤‚³‚©
+‚¿‚傤‚³‚ª‚©‚è
+‚¿‚傤‚³‚«‚å‚­
+‚¿‚傤‚³‚µ‚Â
+‚¿‚傤‚³‚Ð
+‚¿‚傤‚³‚â‚­
+‚¿‚傤‚³‚ñ‚Ú‚µ
+‚¿‚傤‚µ
+‚¿‚傤‚¶
+‚¿‚傤‚¶‚©‚ñ
+‚¿‚傤‚¶‚­
+‚¿‚傤‚µ‚á
+‚¿‚傤‚¶‚ã
+‚¿‚傤‚µ‚イ
+‚¿‚傤‚¶‚イ
+‚¿‚傤‚µ‚å
+‚¿‚傤‚¶‚å
+‚¿‚傤‚¶‚傤
+‚¿‚傤‚¶‚è
+‚¿‚傤‚¶‚ñ
+‚¿‚傤‚¹‚¢‚Ç
+‚¿‚傤‚¹‚«
+‚¿‚傤‚¹‚ñ
+‚¿‚傤‚¹‚ñ‚²
+‚¿‚傤‚»
+‚¿‚傤‚¼‚¤
+‚¿‚傤‚»‚ñ
+‚¿‚傤‚¾
+‚¿‚傤‚½‚¢
+‚¿‚傤‚¾‚¢
+‚¿‚傤‚½‚ñ
+‚¿‚傤‚½‚ñ‚Ï
+‚¿‚傤‚¿‚傤
+‚¿‚傤‚‚ª‚¢
+‚¿‚傤‚Âß
+‚¿‚傤‚Ä‚¢
+‚¿‚傤‚Ä‚ñ
+‚¿‚傤‚Å‚ñ
+‚¿‚傤‚Æ
+‚¿‚傤‚Ç
+‚¿‚傤‚Æ‚Á‚«‚イ
+‚¿‚傤‚ǂЂñ
+‚¿‚傤‚È‚¢
+‚¿‚傤‚È‚¢‚©‚¢
+‚¿‚傤‚È‚ñ
+‚¿‚傤‚Í
+‚¿‚傤‚Î
+‚¿‚傤‚Í‚ñ
+‚¿‚傤‚Ђ傤
+‚¿‚傤‚Ô
+‚¿‚傤‚Ô‚ñ
+‚¿‚傤‚Ö‚ñ
+‚¿‚傤‚Ú
+‚¿‚傤‚Ù‚¤
+‚¿‚傤‚Ù‚ñ‚É‚ñ
+‚¿‚傤‚Ý‚Â
+‚¿‚傤‚Ý‚è‚傤
+‚¿‚傤‚Ý‚ñ
+‚¿‚傤‚ß
+‚¿‚傤‚ß‚¢
+‚¿‚傤‚ß‚ñ
+‚¿‚傤‚â‚­
+‚¿‚傤‚悤
+‚¿‚傤‚肵
+‚¿‚傤‚è‚Â
+‚¿‚傤‚è‚‚µ
+‚¿‚傤‚è‚Î
+‚¿‚傤‚è‚イ
+‚¿‚傤‚é‚¢
+‚¿‚傤‚ê‚¢‚Ú‚©‚¢
+‚¿‚傤‚낤
+‚¿‚å[‚­
+‚¿‚悪‚Ý
+‚¿‚å‚­‚²
+‚¿‚å‚­‚µ
+‚¿‚å‚­‚¹‚Â
+‚¿‚å‚­‚¹‚‚º‚¢
+‚¿‚å‚­‚¹‚‚Ð
+‚¿‚å‚­‚¹‚ñ
+‚¿‚å‚­‚º‚ñ
+‚¿‚å‚­‚¿‚傤
+‚¿‚å‚­‚Ù‚¤‚½‚¢
+‚¿‚å‚­‚ê‚Â
+‚¿‚å‚°‚ñ
+‚¿‚傱
+‚¿‚傱‚ê[‚Æ
+‚¿‚傳‚­‚¯‚ñ
+‚¿‚傳‚­‚Ô‚Â
+‚¿‚傳‚Á‚¯‚ñ
+‚¿‚債‚å
+‚¿‚å‚·‚¢‚¿
+‚¿‚傼‚¤‚±
+‚¿‚悾
+‚¿‚å‚Á‚©
+‚¿‚å‚Á‚©‚­
+‚¿‚å‚Á‚©‚ñ
+‚¿‚å‚Á‚±‚¤‚Ñ‚ñ
+‚¿‚å‚Á‚Æ
+‚¿‚炵
+‚¿‚ç‚ñ
+‚¿‚è
+‚¿‚è‚ ‚­‚½
+‚¿‚肪‚­
+‚¿‚è‚Æ‚è
+‚¿‚è‚ß‚ñ
+‚¿‚è‚á‚­
+‚¿‚è‚å
+‚¿‚è‚å‚­
+‚¿‚낤‚¢
+‚¿‚ë‚è‚ ‚ñ
+‚¿‚ñ‚¤‚Â
+‚¿‚ñ‚©‚­
+‚¿‚ñ‚«
+‚¿‚ñ‚«‚á‚­
+‚¿‚ñ‚«‚ñ
+‚¿‚ñ‚¬‚ñ
+‚¿‚ñ‚±‚ñ
+‚¿‚ñ‚µ‚á‚­‚è‚傤
+‚¿‚ñ‚¶‚ã
+‚¿‚ñ‚¹‚¢
+‚¿‚ñ‚¹‚¢‚´‚¢
+‚¿‚ñ‚¹‚«
+‚¿‚ñ‚¹‚Â
+‚¿‚ñ‚½‚¢‚µ‚á‚­
+‚¿‚ñ‚¾‚ñ
+‚¿‚ñ‚¿‚á‚­
+‚¿‚ñ‚‚¤
+‚¿‚ñ‚‚¤‚´‚¢
+‚¿‚ñ‚Ï‚ñ‚¶[
+‚¿‚ñ‚Ò‚ñ
+‚¿‚ñ‚Õ
+‚¿‚ñ‚Þ‚é‚¢
+ƒb
+‚Á
+ƒc
+‚Â
+‚Â
+ƒd
+‚Ã
+‚‚ [
+‚‚¢
+‚‚¢‚©‚ñ‚΂ñ
+‚‚¢‚²
+‚‚¢‚µ
+‚‚¢‚µ‚¯‚ñ
+‚‚¢‚µ‚ñ
+‚‚¢‚·‚Æ
+‚‚¢‚½‚¿
+‚‚¢‚½‚Ä
+‚‚¢‚¿‚傤‚«‚ñ
+‚‚¢‚Ä
+‚‚¤
+‚Â[
+‚‚¤‚¤‚ñ
+‚‚¤‚©
+‚‚¤‚©‚ñ
+‚‚¤‚«
+‚‚¤‚«‚ñ‚Ð
+‚‚¤‚±‚¤
+‚‚¤‚±‚¤‚Ç‚ß
+‚‚¤‚±‚¤‚É‚ñ
+‚‚¤‚³‚ñ
+‚‚¤‚³‚ñ‚µ‚傤
+‚‚¤‚³‚ñ‚¾‚¢‚¶‚ñ
+‚‚¤‚µ‚傤
+‚‚¤‚µ‚傤‚³‚ñ‚¬
+‚‚¤‚µ‚ñ
+‚‚¤‚¶‚ñ
+‚‚¤‚µ‚ñ‚¦‚¢‚¹‚¢
+‚‚¤‚µ‚ñ‚©
+‚‚¤‚µ‚ñ‚ª‚©‚è
+‚‚¤‚µ‚ñ‚«
+‚‚¤‚µ‚ñ‚µ‚Â
+‚‚¤‚µ‚ñ‚µ‚á
+‚‚¤‚µ‚ñ‚Í‚ñ‚΂¢
+‚‚¤‚µ‚ñ‚Ô
+‚‚¤‚µ‚ñ‚Ú
+‚‚¤‚µ‚ñ‚à‚¤
+‚‚¤‚¹‚¢
+‚‚¤‚»‚­
+‚‚¤‚¿‚µ‚å
+‚‚¤‚¿‚Ú
+‚‚¤‚¿‚傤
+‚‚¤‚Ë‚ñ
+‚‚¤‚Ó‚¤
+‚‚¤‚Ö‚¢
+‚‚¤‚悤
+‚Â[‚é
+‚‚¤‚ê‚¢
+‚‚¤‚ë
+‚‚¤‚ë‚ñ
+‚‚¦
+‚‚©
+‚‚ª‚¢
+‚‚©‚¢‚©‚½
+‚‚©‚¢‚ª‚Á‚Ä
+‚‚©‚¢‚Ý‚¿
+‚‚©‚³
+‚‚©‚Ì‚Ü
+‚‚«
+‚‚«‚ ‚©‚è
+‚‚«‚ ‚½‚è
+‚‚«‚©‚°
+‚‚«‚ª‚¯
+‚‚«‚¬‚ß
+‚‚«‚¬‚è
+‚‚«‚²‚µ
+‚‚«‚¾‚Ä
+‚‚«‚«
+‚‚¬‚‚¬
+‚‚«‚Ð
+‚‚«‚Ñ‚Æ
+‚‚«‚ׂÂ
+‚‚¬‚Ù
+‚‚¬‚ß
+‚‚«‚â‚Ü
+‚‚«‚æ
+‚‚«‚í‚è
+‚‚­‚¦
+‚‚­‚¾
+‚‚­‚¾‚É
+‚‚­‚è‚©‚½
+‚‚­‚育‚Æ
+‚‚­‚è‚΂Ȃµ
+‚‚­‚è‚à‚Ì
+‚‚¯
+‚‚°
+‚‚¯‚ ‚킹
+‚‚¯‚Ë
+‚‚¯‚à‚Ì
+‚‚¶
+‚‚¶‚Ç‚¤
+‚‚½
+‚‚¿
+‚‚¿‚¯‚Þ‚è
+‚‚¿‚â‚Ü
+‚‚Â
+‚‚¯‚´‚Ü
+‚‚‚¶
+‚‚‚ʂ¯
+‚‚‚Ý
+‚‚ÂÝ
+‚‚Âè
+‚‚Â肩‚½
+‚‚Ä
+‚‚Ç
+‚‚Ƃ߂³‚«
+‚‚È
+‚‚Ȃ¬
+‚‚Ë
+‚‚˂ÂË
+‚‚Ì
+‚‚̂©‚­‚µ
+‚‚Î
+‚‚΂«
+‚‚΂³
+‚‚Ô
+‚‚Ԃ¼‚ë‚¢
+‚‚Ú
+‚‚ڂ ‚½‚è
+‚‚ڂ·‚¤
+‚‚Ü
+‚‚܂¢‚½
+‚‚܂悤‚¶
+‚‚Ý
+‚‚݂«
+‚‚݂½‚Ä
+‚‚݂½‚Ä‚«‚ñ
+‚‚݂É
+‚‚ނ¬
+‚‚ß
+‚‚߂ ‚Æ
+‚‚߂ ‚킹
+‚‚߂¦‚è
+‚‚߂µ‚å
+‚‚â
+‚‚ä
+‚‚悫
+‚‚悲‚µ
+‚‚æ‚Ñ
+‚‚ç
+‚‚ç‚ç
+‚‚肠‚¢
+‚‚è[
+‚‚肩‚í
+‚‚肮
+‚‚肴‚¨
+‚‚肹‚ñ
+‚‚肾‚È
+‚‚è‚Ä
+‚‚è‚Ç‚±
+‚‚è‚΂µ
+‚‚è‚΂è
+‚‚è‚Ô‚Ë
+‚‚è‚Ú‚è
+‚‚é
+‚‚邩‚ß
+‚‚邬
+‚‚é‚Í‚µ
+‚‚é‚×
+‚‚ꂠ‚¢
+‚‚ê‚Âê
+‚‚í‚è
+‚‚ñ‚Ú
+ƒe
+‚Ä
+‚Ä
+ƒf
+‚Å
+‚Ä‚ ‚¢
+‚Å‚ ‚¢
+‚Ä‚ ‚©
+‚Ä‚ ‚«
+‚Ä‚ ‚µ
+‚Å‚ ‚µ
+‚Ä‚ ‚Æ‚é
+‚Å‚¢
+‚Ä‚¢‚ ‚Â
+‚Ä‚¡[
+‚Ä‚¢‚¢
+‚Å‚¡[
+‚Å‚¡[‚º‚é
+‚Ä‚¢‚¢‚¿
+‚Å‚¡[‚ç
+‚Å‚¡[‚ç[
+‚Ä‚¡[‚ñ
+‚Ä‚¢‚¢‚ñ
+‚Ä‚¡[‚ñ‚¦[‚¶‚á
+‚Ä‚¢‚¦‚ñ
+‚Ä‚¢‚¦‚ñ‚Æ‚¤
+‚Ä‚¢‚¨‚ñ
+‚Ä‚¢‚©
+‚Ä‚¢‚©‚©‚­
+‚Ä‚¢‚©‚­
+‚Ä‚¢‚ª‚­
+‚Ä‚¢‚ª‚­‚Ë‚ñ
+‚Ä‚¢‚©‚ñ
+‚Ä‚¢‚«‚ ‚Â
+‚Ä‚¢‚«‚¯‚ñ
+‚Ä‚¢‚«‚Ñ‚ñ
+‚Ä‚¢‚«‚イ
+‚Ä‚¢‚«‚イ‚Ñ
+‚Ä‚¢‚«‚傤‚µ‚á
+‚Ä‚¢‚«‚æ‚«‚ñ
+‚Ä‚¢‚­‚¤
+‚Å‚¡‚­‚µ‚å‚È‚è
+‚Ä‚¢‚¯‚¢
+‚Ä‚¢‚¯‚¢‚ª‚¢
+‚Ä‚¢‚¯‚‚ ‚Â
+‚Ä‚¢‚¯‚ñ
+‚Ä‚¢‚±‚¤‚«
+‚Ä‚¢‚³‚¢
+‚Ä‚¢‚¶
+‚Ä‚¢‚µ‚«
+‚Ä‚¢‚¶‚¹‚¢
+‚Å‚¡‚¶‚½‚é
+‚Ä‚¢‚¶‚Â
+‚Ä‚¢‚µ‚á‚­
+‚Ä‚¢‚µ‚Ⴖ‚傤
+‚Ä‚¢‚µ‚á‚Î
+‚Ä‚¡‚µ‚ã
+‚Ä‚¢‚µ‚ã
+‚Ä‚¢‚µ‚イ‚Í
+‚Ä‚¢‚µ‚ã‚‚³‚«
+‚Ä‚¢‚µ‚ã‚‚Ñ
+‚Ä‚¢‚µ‚å‚­
+‚Ä‚¢‚·‚¤
+‚Å‚¡‚·‚©‚¤‚ñ‚Æ
+‚Å‚¡‚·‚©‚Á‚µ‚å‚ñ
+‚Å‚¡‚·‚©‚Î[
+‚Å‚¡‚·‚­
+‚Å‚¡‚·‚¯‚Á‚Æ
+‚Å‚¡‚·‚Æ‚è‚Ñ‚ã[
+‚Å‚¡‚¸‚É[
+‚Å‚¡‚·‚Õ‚ê[
+‚Ä‚¢‚¹‚¢
+‚Ä‚¢‚¹‚Â
+‚Å‚¡‚¹‚ñ‚Î[
+‚Ä‚¢‚»
+‚Ä‚¢‚»‚­
+‚Ä‚¢‚»‚­‚«
+‚Ä‚¢‚½‚¢‚º‚ñ‚¹‚ñ
+‚Ä‚¢‚½‚­
+‚Å‚¢‚½‚ñ
+‚Ä‚¢‚¿
+‚Ä‚¢‚¿‚傤
+‚Ä‚¡‚Á‚µ‚ã
+‚Å‚¡‚Ä[‚é
+‚Ä‚¢‚Ä‚ñ
+‚Ä‚¢‚Æ
+‚Ä‚¢‚Ç
+‚Ä‚¢‚Æ‚¤
+‚Ä‚¢‚Æ‚¤‚¯‚ñ
+‚Å‚¢‚Ë‚¢
+‚Ä‚¢‚Ë‚ñ
+‚Ä‚¢‚Ì‚¤
+‚Ä‚¢‚΂ñ
+‚Ä‚¢‚Ђ傤
+‚Å‚¡‚Ó‚¥‚ñ‚·
+‚Ä‚¢‚Ö‚ñ
+‚Ä‚¢‚Ú‚­
+‚Ä‚¢‚Ù‚ñ
+‚Ä‚¢‚ß‚ñ
+‚Ä‚¢‚悤
+‚Ä‚¢‚è
+‚Å‚¢‚è[
+‚Å‚¢‚è‚®‚¿
+‚Ä‚¢‚è‚イ
+‚Ä‚¢‚è‚イ‚¶‚å
+‚Ä‚¢‚è‚傤
+‚Ä‚¢‚ê‚¢
+‚Å‚¡‚ê‚­‚½
+‚Å‚¡‚ê‚­‚½[
+‚Å‚¡‚ê‚­‚Æ‚è
+‚Ä[‚½
+‚Å[‚½
+‚Å[‚½‚×[‚·
+‚Ä[‚Õ
+‚Ä[‚Ô‚é
+‚Ä[‚Ü
+‚Ä‚¨‚­‚ê
+‚Ä‚¨‚è
+‚Ä‚©‚ª‚Ý
+‚Ä‚ª‚©‚è
+‚Ä‚ª‚½
+‚Ä‚ª‚Ý
+‚Ä‚ª‚ç
+‚Ä‚ª‚邳
+‚Å‚«‚ ‚ª‚è
+‚Ä‚«‚¢
+‚Ä‚«‚²‚¤‚è‚Â
+‚Å‚«‚²‚Æ
+‚Ä‚«‚´‚¢
+‚Ä‚«‚³‚·
+‚Ä‚«‚¶
+‚Ä‚«‚µ‚å
+‚Ä‚«‚µ‚å‚­
+‚Ä‚«‚¸
+‚Ä‚«‚·‚Æ
+‚Ä‚«‚¹‚¢
+‚Å‚«‚¾‚©
+‚Ä‚«‚¿
+‚Ä‚«‚Æ‚¤
+‚Ä‚«‚É‚ñ
+‚Ä‚«‚É‚ñ‚µ‚á
+‚Ä‚«‚Ù‚¤
+‚Å‚«‚à‚Ì
+‚Ä‚«‚â
+‚Ä‚«‚â‚­
+‚Ä‚«‚è‚傤
+‚Ä‚«‚ê‚¢
+‚Ä‚«‚ê‚¢‚«
+‚Ä‚¬‚í
+‚Å‚­
+‚Ä‚®‚¿
+‚Å‚®‚¿
+‚Ä‚­‚É‚Á‚­
+‚Ä‚­‚Ì
+‚Ä‚­‚̂낶
+‚Ä‚­‚̂낶[
+‚Ä‚­‚Ñ
+‚Ä‚­‚ç‚¢‚Æ
+‚Ä‚±
+‚Ä‚²‚±‚ë
+‚Ä‚²‚½‚¦
+‚Å‚±‚ê[‚µ‚å‚ñ
+‚Ä‚²‚ë
+‚Ä‚²‚낳
+‚Å‚´[‚Æ
+‚Å‚´‚¢‚È
+‚Ä‚³‚«
+‚Å‚³‚«
+‚Ä‚³‚°
+‚Ä‚´‚í‚è
+‚Å‚µ
+‚Ä‚µ‚¨
+‚Ä‚µ‚½
+‚Ä‚µ‚Ü
+‚Ä‚¶‚ã‚ñ
+‚Ä‚¶‚傤
+‚Ä‚·‚¤
+‚Ä‚·‚¤‚è‚傤
+‚Ä‚·‚«
+‚Å‚·‚­
+‚Ä‚¹‚¢
+‚Ä‚»‚¤
+‚Å‚¼‚ß
+‚Ä‚¿‚ª‚¢
+‚Ä‚¿‚傤
+‚Ä‚Â
+‚Ä‚Á‚©
+‚ª‚­‚©
+‚ª‚­‚µ‚á
+‚ª‚Á‚©
+‚Ä‚Á‚©‚ñ
+‚Ä‚Á‚«
+‚Å‚Á‚«
+‚Ä‚Á‚«‚傤
+‚Ä‚Á‚­‚·
+‚­‚¸
+‚Ă­‚è
+‚¯
+‚¯‚«‚ñ
+‚Ä‚Á‚±‚¤
+‚Ä‚Á‚±‚¤‚µ‚å
+‚Ä‚Á‚±‚Â
+‚´‚¢
+‚Ä‚Á‚³‚­
+‚¶‚ñ
+‚Ä‚Á‚¹‚¢
+‚Ä‚Á‚¹‚«
+‚Ä‚Á‚¹‚ñ
+‚Å‚Á‚¿
+‚Ä‚Á‚¿‚á‚ñ
+‚Ä‚Á‚‚¢
+‚Å‚Á‚Ç
+‚Ä‚Á‚Æ‚¤
+‚Âǂ¤
+‚Ä‚Á‚Æ‚¤‚ÂÑ
+‚Ä‚Á‚Ò‚Â
+‚Âтñ
+‚ÂԂñ
+‚Ä‚Á‚Ø‚«
+‚Ä‚Á‚Ø‚ñ
+‚Ä‚Á‚Û‚¤
+‚Âڂ¤
+‚Âí‚ñ
+‚Ä‚Ç‚è
+‚Ä‚Æ‚ë‚ñ
+‚Ä‚È[
+‚Ä‚È‚°‚¾‚ñ
+‚Ä‚È‚×
+‚Ä‚È‚Ý
+‚Ä‚È‚ñ‚Æ
+‚Ä‚É‚à‚Â
+‚Ä‚Ê‚¢
+‚Ä‚Ê‚©‚è
+‚Ä‚Ê‚«
+‚Ä‚Ê‚®‚¢
+‚Ä‚Ì‚¤‚¿
+‚Å‚Ì‚Ý
+‚Å‚Ì‚Ý‚Ë[‚µ‚å‚ñ
+‚Ä‚Î
+‚Å‚Ï[‚Æ
+‚ł΂¢‚·
+‚Ä‚Í‚¶‚ß
+‚Ä‚Í‚¸
+‚Å‚Í‚È
+‚ł΂ñ
+‚Å‚Ñ‚ã[
+‚Ăт傤‚µ
+‚Å‚Ó‚§‚é‚Æ
+‚Å‚Ó‚§‚é‚ß
+‚Ä‚Ô‚­‚ë
+‚Å‚Ó‚Ë
+‚Ä‚Ô‚è
+‚Å‚Ó‚ê
+‚Å‚Ó‚ê[‚µ‚å‚ñ
+‚Å‚Û
+‚Ä‚Ù‚ñ
+‚Ä‚Ü
+‚Ä‚Ü‚¦
+‚Å‚Ü‚©‚¹
+‚Ä‚Ü‚¿‚ñ
+‚Å‚Ý‚¹
+‚Å‚ß‚è‚Á‚Æ
+‚Å‚à‚­‚炵[
+‚Ä‚à‚¿
+‚Å‚à‚Ì
+‚Å‚à‚ñ‚·‚Æ‚ê[‚µ
+‚Å‚ã‚ ‚é
+‚Ä‚ç
+‚Ä‚ç[
+‚Ă炱‚â
+‚Å‚ç‚Á‚­‚·
+‚Ä‚è‚Æ‚è[
+‚Ä‚é
+‚ł邽
+‚Ä‚ê
+‚Ä‚ê‚Á‚­‚·
+‚Ä‚ê‚Ï‚µ[
+‚Ä‚ê‚Ñ
+‚Ä‚ê‚Ñ‚¶‚å‚ñ
+‚Ä‚ê‚Ó‚§‚ñ
+‚Ä‚ê‚Ù‚ñ
+‚Ä‚ñ
+‚Å‚ñ‚ ‚Â
+‚Ä‚ñ‚¢
+‚Å‚ñ‚¢
+‚Å‚ñ‚¦‚ñ
+‚Ä‚ñ‚©
+‚Å‚ñ‚©
+‚Ä‚ñ‚ª‚¢
+‚Å‚ñ‚©‚¢
+‚Å‚ñ‚©‚¢‚¦‚«
+‚Ä‚ñ‚©‚¢‚¸
+‚Ä‚ñ‚©‚Ô‚Â
+‚Ä‚ñ‚©‚ñ‚«
+‚Ä‚ñ‚«
+‚Å‚ñ‚«
+‚Ä‚ñ‚«[
+‚Å‚ñ‚«‚«‚®
+‚Ä‚ñ‚«‚¸
+‚Å‚ñ‚«‚イ
+‚Ä‚ñ‚«‚å
+‚Å‚ñ‚¬‚傤
+‚Å‚ñ‚«‚å‚­
+‚Ä‚ñ‚«‚æ‚Ù‚¤
+‚Ä‚ñ‚®
+‚Ä‚ñ‚­‚¤
+‚Å‚ñ‚¯‚¢
+‚Å‚ñ‚°‚«
+‚Ä‚ñ‚¯‚Â
+‚Å‚ñ‚¯‚ñ
+‚Å‚ñ‚°‚ñ
+‚Ä‚ñ‚±‚¤
+‚Å‚ñ‚±‚¤
+‚Ä‚ñ‚³‚¢
+‚Å‚ñ‚´‚¢
+‚Å‚ñ‚³‚ñ
+‚Å‚ñ‚³‚ñ‚«
+‚Ä‚ñ‚µ
+‚Ä‚ñ‚¶
+‚Å‚ñ‚µ
+‚Ä‚ñ‚¶‚©‚¢
+‚Å‚ñ‚µ‚«‚«
+‚Ä‚ñ‚¶‚­
+‚Å‚ñ‚µ‚¯‚¢‚³‚ñ‚«
+‚Å‚ñ‚µ‚±‚¤‚ª‚­
+‚Å‚ñ‚µ‚±‚¤‚¬‚傤
+‚Ä‚ñ‚¶‚Â
+‚Å‚ñ‚µ‚á
+‚Ä‚ñ‚µ‚ã
+‚Ä‚ñ‚¶‚ã
+‚Ä‚ñ‚µ‚ã‚©‚­
+‚Ä‚ñ‚µ‚ã‚‚Ƃǂ¯
+‚Ä‚ñ‚¶‚å
+‚Ä‚ñ‚¶‚傤
+‚Ä‚ñ‚¶‚ñ
+‚Å‚ñ‚µ‚ñ
+‚Ä‚ñ‚·‚¢
+‚Ä‚ñ‚·‚¤
+‚Ä‚ñ‚¹‚¢
+‚Å‚ñ‚¹‚Â
+‚Ä‚ñ‚¹‚ñ
+‚Å‚ñ‚¹‚ñ‚т傤
+‚Ä‚ñ‚½‚¢
+‚Ä‚ñ‚¾‚¢‚µ‚イ
+‚Å‚ñ‚½‚­
+‚Ä‚ñ‚¿
+‚Å‚ñ‚¿
+‚Å‚ñ‚¿‚イ
+‚Ä‚ñ‚Ä‚«
+‚Å‚ñ‚Ä‚Â
+‚Ä‚ñ‚Ä‚ñ
+‚Å‚ñ‚Å‚ñ
+‚Ä‚ñ‚Æ
+‚Ä‚ñ‚Æ‚¤
+‚Ä‚ñ‚Ç‚¤
+‚Å‚ñ‚Ç‚¤
+‚Å‚ñ‚Ç‚¤‚«
+‚Å‚ñ‚Ç‚¤‚µ‚«
+‚Å‚ñ‚Ç‚¤‚è‚Â
+‚Ä‚ñ‚È‚¢
+‚Ä‚ñ‚ɂイ‚Æ‚Ç‚¯
+‚Ä‚ñ‚É‚å
+‚Å‚ñ‚Ë‚Â
+‚Å‚ñ‚˂‚«
+‚Ä‚ñ‚Ë‚ñ
+‚Ä‚ñ‚Ë‚ñ‚ª‚·
+‚Ä‚ñ‚Ë‚ñ‚µ‚å‚­
+‚Ä‚ñ‚Ë‚ñ‚Æ‚¤
+‚Ä‚ñ‚Ì‚¤
+‚Ä‚ñ‚Ì‚¤‚Ö‚¢‚©
+‚Å‚ñ‚Î
+‚Å‚ñ‚Ï
+‚Ä‚ñ‚΂Â
+‚Ä‚ñ‚Ï‚ñ
+‚Ä‚ñ‚Ò
+‚Ä‚ñ‚҂傤
+‚Ä‚ñ‚Ñ‚ñ
+‚Ä‚ñ‚Õ
+‚Å‚ñ‚Ô
+‚Ä‚ñ‚Ô‚­‚ë
+‚Ä‚ñ‚Ô‚ñ
+‚Å‚ñ‚Ô‚ñ
+‚Å‚ñ‚Õ‚ñ
+‚Ä‚ñ‚Ø‚ñ
+‚Ä‚ñ‚Ø‚ñ‚¿‚¢
+‚Ä‚ñ‚Û
+‚Å‚ñ‚Û‚¤
+‚Ä‚ñ‚Ú‚¤‚¾‚¢
+‚Ä‚ñ‚Û‚ç‚è[
+‚Ä‚ñ‚Ü‚¹‚ñ
+‚Ä‚ñ‚Ü‚Ç
+‚Ä‚ñ‚Ü‚ñ‚®‚¤
+‚Ä‚ñ‚ß‚¢
+‚Ä‚ñ‚à‚ñ
+‚Ä‚ñ‚à‚ñ‚ª‚­
+‚Ä‚ñ‚à‚ñ‚¾‚¢
+‚Ä‚ñ‚â‚à‚Ì
+‚Ä‚ñ‚æ
+‚Ä‚ñ‚ç‚ñ
+‚Å‚ñ‚ç‚ñ
+‚Ä‚ñ‚è
+‚Ä‚ñ‚è‚«‚傤
+‚Å‚ñ‚è‚イ
+‚Å‚ñ‚è‚イ‚¯‚¢
+‚Å‚ñ‚è‚å‚­‚¯‚¢
+‚Ä‚ñ‚ê‚¢
+‚Å‚ñ‚ê‚¢
+‚Å‚ñ‚ë
+‚Å‚ñ‚í‚«
+‚Å‚ñ‚í‚«‚å‚­
+‚Å‚ñ‚í‚¿‚傤
+ƒg
+‚Æ
+‚Æ
+ƒh
+‚Ç
+‚Ç‚ 
+‚Ç‚ ‚¢
+‚Æ‚ ‚Ý
+‚Æ‚¢
+‚Æ‚¢‚¤
+‚Æ‚¢‚µ
+‚Ç‚¢‚‚²
+‚Æ‚¢‚ê
+‚Æ‚¢‚ê‚Á‚Æ
+‚Æ‚£
+‚Æ‚¤
+‚Ç‚¤
+‚Æ‚¤‚ 
+‚Æ‚¤‚ ‚ñ
+‚Æ‚¤‚¢
+‚Ç‚¤‚¢
+‚Ç‚¤‚¢‚µ‚å
+‚Æ‚¤‚¢‚¶‚傤
+‚Æ‚¤‚¢‚»‚­‚݂傤
+‚Ç‚¤‚¢‚Â
+‚Æ‚£[
+‚Ç‚¤‚¤
+‚Ç‚¤‚¦‚¢
+‚Æ‚¤‚¨‚¤
+‚Æ‚¤‚¨‚ñ
+‚Ç‚¤‚¨‚ñ
+‚Æ‚¤‚¨‚ñ‚¹‚ñ
+‚Ç‚¤‚©
+‚Ç‚¤‚ª
+‚Æ‚¤‚©‚¢
+‚Æ‚¤‚ª‚¢
+‚Æ‚¤‚©‚¢‚¿‚Ù‚¤
+‚Æ‚¤‚©‚¢‚Ç‚¤
+‚Æ‚¤‚©‚­
+‚Ç‚¤‚ª‚­
+‚Ç‚¤‚©‚¹‚ñ
+‚Æ‚¤‚©‚Â
+‚Æ‚¤‚©‚‚©
+‚Æ‚¤‚©‚‚ª‚©‚è
+‚Æ‚¤‚©‚‚«‚å‚­
+‚Æ‚¤‚©‚‚µ‚Â
+‚Æ‚¤‚©‚‚قñ‚Ô
+‚Æ‚¤‚ª‚炵
+‚Æ‚¤‚©‚è‚Â
+‚Æ‚¤‚©‚ñ
+‚Ç‚¤‚©‚ñ
+‚Ç‚¤‚ª‚ñ
+‚Ç‚¤‚©‚ñ‚·‚¤
+‚Æ‚¤‚¬
+‚Ç‚¤‚«
+‚Ç‚¤‚¬
+‚Ç‚¤‚¬‚²
+‚Æ‚¤‚«‚µ‚å
+‚Ç‚¤‚«‚¹‚¢
+‚Æ‚¤‚«‚Ú
+‚Æ‚¤‚¬‚イ
+‚Ç‚¤‚«‚イ
+‚Ç‚¤‚«‚イ‚¹‚¢
+‚Æ‚¤‚«‚傤
+‚Ç‚¤‚«‚傤
+‚Ç‚¤‚¬‚傤
+‚Ç‚¤‚¬‚傤‚µ‚á
+‚Ç‚¤‚«‚å‚­
+‚Æ‚¤‚¬‚è
+‚Ç‚¤‚­
+‚Ç‚¤‚®
+‚Æ‚¤‚®‚¤
+‚Ç‚¤‚­‚Â
+‚Æ‚¤‚°
+‚Æ‚¤‚¯‚¢
+‚Æ‚¤‚°‚¢
+‚Ç‚¤‚¯‚¢
+‚Ç‚¤‚¯‚µ
+‚Æ‚¤‚°‚Â
+‚Ç‚¤‚¯‚Â
+‚Ç‚¤‚°‚Â
+‚Ç‚¤‚¯‚à‚Ì
+‚Æ‚¤‚¯‚ñ
+‚Ç‚¤‚¯‚ñ
+‚Æ‚¤‚°‚ñ‚«‚傤
+‚Æ‚¤‚±‚¤
+‚Æ‚¤‚²‚¤
+‚Ç‚¤‚±‚¤
+‚Æ‚¤‚±‚¤‚«
+‚Æ‚¤‚±‚¤‚¹‚ñ
+‚Ç‚¤‚±‚­
+‚Æ‚¤‚±‚ñ
+‚Æ‚¤‚³
+‚Æ‚¤‚´
+‚Ç‚¤‚³
+‚Æ‚¤‚´‚¢
+‚Ç‚¤‚´‚¢
+‚Æ‚¤‚´‚æ‚«‚ñ
+‚Æ‚¤‚³‚ñ
+‚Ç‚¤‚³‚ñ
+‚Ç‚¤‚´‚ñ
+‚Æ‚¤‚µ
+‚Ç‚¤‚µ
+‚Ç‚¤‚¶
+‚Æ‚¤‚µ‚©
+‚Æ‚¤‚µ‚«
+‚Æ‚¤‚¶‚«
+‚Ç‚¤‚¶‚­
+‚Æ‚¤‚¶‚µ‚á
+‚Æ‚¤‚¶‚Â
+‚Ç‚¤‚µ‚Â
+‚Ç‚¤‚¶‚Â
+‚Æ‚¤‚µ‚á
+‚Ç‚¤‚µ‚á
+‚Æ‚¤‚µ‚ã
+‚Ç‚¤‚µ‚ã
+‚Æ‚¤‚µ‚å
+‚Ç‚¤‚µ‚å
+‚Ç‚¤‚¶‚å
+‚Æ‚¤‚µ‚傤
+‚Ç‚¤‚µ‚傤
+‚Ç‚¤‚¶‚傤
+‚Ç‚¤‚µ‚傤‚¢‚Þ
+‚Æ‚¤‚¶‚傤‚¯‚ñ
+‚Ç‚¤‚µ‚å‚­
+‚Æ‚¤‚¶‚è‚Â
+‚Æ‚¤‚µ‚ñ
+‚Æ‚¤‚¶‚ñ
+‚Ç‚¤‚µ‚ñ
+‚Ç‚¤‚¶‚ñ
+‚Æ‚¤‚µ‚ñ‚¾‚¢
+‚Ç‚¤‚·‚¤
+‚Æ‚¤‚¹‚¢
+‚Ç‚¤‚¹‚¢
+‚Ç‚¤‚¹‚¢‚Ç‚¤‚ß‚¢
+‚Æ‚¤‚¹‚«
+‚Æ‚¤‚¹‚Â
+‚Ç‚¤‚¹‚ñ
+‚Æ‚¤‚¹‚ñ‚µ‚á
+‚Æ‚¤‚»‚¤
+‚Ç‚¤‚»‚¤
+‚Ç‚¤‚¼‚¤
+‚Ç‚¤‚»‚¤‚©‚¢
+‚Ç‚¤‚»‚¤‚¹‚¢
+‚Ç‚¤‚¼‚­
+‚Æ‚¤‚¾‚¢
+‚Ç‚¤‚½‚¢
+‚Æ‚¤‚½‚¢‚©‚¢
+‚Æ‚¤‚¿
+‚Ç‚¤‚¿
+‚Æ‚¤‚¿‚µ‚á
+‚Ç‚¤‚¿‚傤
+‚Æ‚¤‚‚¤
+‚Ç‚¤‚Ä‚¢
+‚Æ‚¤‚Ä‚ñ
+‚Ç‚¤‚Ä‚ñ
+‚Ç‚¤‚Å‚ñ‚è‚Â
+‚Æ‚¤‚Ç
+‚Ç‚¤‚Ç‚¤‚ß‚®‚è
+‚Ç‚¤‚Æ‚­
+‚Æ‚¤‚Ç‚è
+‚Æ‚¤‚È‚¢
+‚Ç‚¤‚È‚¢
+‚Æ‚¤‚È‚ñ
+‚Æ‚¤‚È‚ñ‚Æ‚¤
+‚Æ‚¤‚ɂ傤‚т傤
+‚Æ‚¤‚É‚ñ
+‚Æ‚¤‚Ë‚ñ
+‚Ç‚¤‚Ë‚ñ
+‚Æ‚¤‚Í
+‚Æ‚¤‚Î
+‚Ç‚¤‚Í‚¢
+‚Æ‚¤‚Í‚Â
+‚Ç‚¤‚΂ñ
+‚Æ‚¤‚Ð
+‚Æ‚¤‚Ђ±‚¤
+‚Æ‚¤‚т傤
+‚Æ‚¤‚Ђ傤‚¶‚å
+‚Æ‚¤‚Ђ傤‚Ñ
+‚Æ‚¤‚Ó
+‚Æ‚¤‚Ô
+‚Ç‚¤‚Ô‚Â
+‚Ç‚¤‚Ԃ‚¦‚ñ
+‚Ç‚¤‚Ԃ‚¹‚¢
+‚Æ‚¤‚Ô‚ñ
+‚Ç‚¤‚Ô‚ñ
+‚Æ‚¤‚Ù‚¤
+‚Ç‚¤‚Ù‚¤
+‚Æ‚¤‚Ù‚­
+‚Æ‚¤‚Ù‚­‚¿‚Ù‚¤
+‚Æ‚¤‚Ù‚­‚Æ‚¤
+‚Æ‚¤‚Ù‚ñ
+‚Æ‚¤‚Ù‚ñ‚Ô
+‚Ç‚¤‚Ý‚á‚­
+‚Æ‚¤‚Ý‚ñ
+‚Ç‚¤‚Ý‚ñ
+‚Æ‚¤‚ß‚¢
+‚Ç‚¤‚ß‚¢
+‚Æ‚¤‚ß‚¢‚±‚¤‚»‚­
+‚Ç‚¤‚ß‚¢‚±‚­
+‚Æ‚¤‚à‚­
+‚Ç‚¤‚à‚Æ
+‚Ç‚¤‚à‚ñ
+‚Æ‚¤‚ä
+‚Ç‚¤‚䂤
+‚Æ‚¤‚悤
+‚Ç‚¤‚悤
+‚Æ‚¤‚ç‚­
+‚Ç‚¤‚ç‚­
+‚Ç‚¤‚ç‚ñ
+‚Ç‚¤‚è
+‚Ç‚¤‚è‚Â
+‚Æ‚¤‚è‚傤
+‚Ç‚¤‚è‚傤
+‚Ç‚¤‚è‚å‚­‚°‚ñ
+‚Ç‚¤‚è‚ñ
+‚Æ‚¤‚é‚¢
+‚Ç‚¤‚é‚¢
+‚Ç‚¤‚ê‚Â
+‚Ç‚¤‚ë
+‚Æ‚¤‚낤
+‚Æ‚¤‚ë‚­‚Ú
+‚Ç‚¤‚í
+‚Æ‚¦‚¢
+‚Æ‚¦‚Í‚½‚¦
+‚Æ‚¨
+‚Æ‚¨‚ ‚³
+‚Æ‚¨‚¦‚ñ
+‚Æ‚¨‚­
+‚Æ[‚­
+‚Æ[‚­‚ñ
+‚Æ[‚·‚Æ
+‚Æ[‚½‚é
+‚Æ‚¨‚â‚Ü
+‚Æ‚¨‚è
+‚Æ[‚ñ
+‚Æ‚©
+‚Æ‚©‚¢
+‚Æ‚©‚°
+‚Ç‚©‚½
+‚Ç‚©‚ñ
+‚Æ‚«
+‚Ç‚«
+‚Æ‚«‚¨‚è
+‚Æ‚¬‚©‚¢
+‚Æ‚«‚Ç‚«
+‚Ç‚«‚ã‚ß‚ñ‚½‚è
+‚Ç‚«‚ã‚ß‚ñ‚Æ
+‚Ç‚«‚傤
+‚Æ‚¬‚ñ
+‚Æ‚­
+‚Æ‚­‚¢
+‚Æ‚­‚¢‚³‚«
+‚Ç‚­‚ª‚·
+‚Æ‚­‚ª‚í
+‚Æ‚­‚¬
+‚Ç‚­‚³‚¢‚µ‚á
+‚Æ‚­‚³‚­
+‚Æ‚­‚³‚Â
+‚Æ‚­‚³‚ñ
+‚Æ‚­‚³‚ñ‚Ô‚Â
+‚Æ‚­‚µ
+‚Æ‚­‚µ‚Â
+‚Ç‚­‚µ‚á
+‚Æ‚­‚µ‚ã
+‚Æ‚­‚¶‚ã
+‚Æ‚­‚µ‚傤
+‚Æ‚­‚µ‚å‚­
+‚Ç‚­‚µ‚ñ
+‚Æ‚­‚¹‚¢
+‚Ç‚­‚º‚Â
+‚Ç‚­‚º‚ñ
+‚Ç‚­‚»
+‚Æ‚­‚»‚¤
+‚Ç‚­‚»‚¤
+‚Æ‚­‚»‚­‚¶‚傤
+‚Æ‚­‚¾‚¢
+‚Æ‚­‚¾‚ñ
+‚Æ‚®‚¿
+‚Æ‚­‚¿‚傤
+‚Æ‚­‚Ä‚ñ
+‚Æ‚­‚Æ‚¤
+‚Æ‚­‚Ì‚¤
+‚Æ‚­‚Í‚¢‚ñ
+‚Æ‚­‚Í‚ñ‚©
+‚Æ‚­‚Í‚ñ‚ª‚©‚è
+‚Æ‚­‚Í‚ñ‚Ô
+‚Ç‚­‚Ô‚Â
+‚Ç‚­‚Ô‚ñ
+‚Ç‚­‚Ô‚ñ‚ª‚­
+‚Æ‚­‚ׂÂ
+‚Ç‚­‚Ú‚¤
+‚Ç‚­‚Ù‚ñ
+‚Æ‚­‚Þ
+‚Æ‚­‚ß‚¢
+‚Ç‚­‚â‚­
+‚Æ‚­‚â‚­‚Ä‚ñ
+‚Æ‚­‚悤
+‚Ç‚­‚è‚å‚­
+‚Æ‚®‚é‚Ü
+‚Æ‚­‚ê‚¢
+‚Æ‚°
+‚Æ‚¯‚¢
+‚Æ‚¯‚¢‚¾‚¢
+‚Æ‚¯‚ñ
+‚Ç‚¯‚ñ‚¬‚傤
+‚Æ‚±
+‚Ç‚±
+‚Ç‚±‚¤
+‚Ç‚²‚¤
+‚Æ‚±‚È‚Â
+‚Æ‚±‚Ì‚Ü
+‚Æ‚±‚΂µ‚ç
+‚Æ‚±‚â
+‚Æ‚±‚ë
+‚Æ‚±‚ë‚Ä‚ñ
+‚Æ‚±‚ë‚Ç‚±‚ë
+‚Æ‚µ
+‚Ç‚¶
+‚Ç‚µ‚Â
+‚Æ‚µ‚‚«
+‚Æ‚µ‚Ì‚¹
+‚Æ‚µ‚Ü
+‚Ç‚µ‚á
+‚Ç‚µ‚á‚­‚¸‚ê
+‚Ç‚µ‚á‚Ô‚è
+‚Æ‚¶‚傤
+‚Ç‚¶‚傤
+‚Æ‚¶‚傤‚±‚­
+‚Æ‚µ‚å‚©‚ñ
+‚Æ‚µ‚æ‚è
+‚Æ‚µ‚í‚·‚ê
+‚Æ‚µ‚ñ
+‚Ç‚·‚¤
+‚Æ‚¹‚¢
+‚Ç‚¹‚¢
+‚Æ‚»
+‚Ç‚¼‚¤
+‚Ç‚»‚­
+‚Ç‚¾‚¢
+‚Æ‚½‚ñ
+‚Ç‚½‚ñ‚Î
+‚Æ‚¿
+‚Æ‚¿‚ª‚ç
+‚Æ‚¿‚イ
+‚Æ‚¿‚傤
+‚Ç‚¿‚ç
+‚Æ‚Á‚©
+‚Æ‚Á‚©‚¢
+‚Æ‚Á‚«
+‚Æ‚Á‚«‚©
+‚Æ‚Á‚«‚ª‚©‚è
+‚Ƃ‚¬‚³‚«
+‚Æ‚Á‚«‚Ô
+‚Æ‚Á‚«‚å
+‚Æ‚Á‚«‚å‚©
+‚Æ‚Á‚«‚傪‚©‚è
+‚Æ‚Á‚«‚å‚«‚å‚­
+‚Æ‚Á‚«‚傯‚ñ
+‚Æ‚Á‚«‚債‚Â
+‚Æ‚Á‚«‚å‚Ô
+‚Ç‚Á‚­
+‚Ç‚Á‚®
+‚Æ‚Á‚­‚è
+‚Æ‚Á‚¯‚¢
+‚Æ‚Á‚¯‚ñ
+‚Æ‚Á‚±‚¤
+‚Æ‚Á‚±‚¤‚â‚­
+‚Æ‚Á‚½‚ñ
+‚Ç‚Á‚¿
+‚Æ‚Á‚¿‚á‚ñ
+‚Æ‚Á‚Ä
+‚Æ‚Á‚Ä‚¢
+‚Ç‚Á‚Æ
+‚Æ‚Á‚Ï‚ñ
+‚Æ‚Á‚Õ‚¤
+‚Ƃ‚߂ñ
+‚Ƃ‚߂ñ‚«‚傤
+‚Ƃ‚ê‚ñ‚¸
+‚Ç‚Ä
+‚Æ‚Ä‚¢
+‚Æ‚Å‚ñ
+‚Æ‚Ç‚¤‚Ó‚¯‚ñ
+‚Æ‚Ç‚¯
+‚Æ‚Ç‚Ü‚Â
+‚Æ‚Ç‚ë‚«
+‚Æ‚È[
+‚Æ‚È‚¢
+‚Ç‚È‚½
+‚Æ‚È‚è‚ ‚킹
+‚Æ‚Ë‚è
+‚Æ‚Ì
+‚Ç‚Ì
+‚Ç‚Ì‚±‚Æ
+‚Æ‚Î
+‚Ƃ΂­
+‚Ƃ΂è
+‚Æ‚Ñ
+‚Æ‚Ñ‚¢‚µ
+‚Æ‚Ñ‚¢‚è
+‚Æ‚Ñ‚¨‚è
+‚Æ‚Ñ‚±‚Ý‚¾‚¢
+‚Æ‚Ñ‚µ‚å‚­
+‚Ƃт΂±
+‚ǂЂ傤
+‚Æ‚Ñ‚ç
+‚Ç‚Ñ‚ñ
+‚ǂׂ¢
+‚Æ‚Ù
+‚Æ‚Ù‚¤
+‚Ç‚Ú‚­‚©
+‚Ç‚Ü
+‚Æ‚Ü‚è
+‚Æ‚Ý
+‚Æ‚Ý‚ñ
+‚Æ‚Ý‚ñ‚º‚¢
+‚Æ‚ß‚¨‚«
+‚Æ‚à
+‚Æ‚à‚¦
+‚Æ‚à‚¾‚¿
+‚Æ‚à‚Ñ‚«
+‚Æ‚æ
+‚ǂ悤
+‚ǂ悤‚Ñ
+‚Æ‚ç‚¢
+‚Ç‚ç‚¢
+‚Ç‚ç‚¢‚Î
+‚Ç‚ç‚¢‚Î[
+‚Ç‚ç‚¢‚Ô‚¢‚ñ
+‚Æ‚ç‚­‚½
+‚Æ‚ç‚Á‚­
+‚Æ‚ç‚Ì‚Ü‚«
+‚Ç‚ç‚Ó‚Æ
+‚Æ‚ç‚Ô‚é
+‚Æ‚ç‚ׂé
+‚Ç‚ç‚Ü
+‚Ç‚ç‚Þ
+‚Æ‚ç‚ñ‚­
+‚Æ‚ç‚ñ‚µ[‚Î
+‚Æ‚ç‚ñ‚¶‚¥‚ñ‚Æ
+‚Æ‚ç‚ñ‚¶‚·‚½
+‚Æ‚ç‚ñ‚·
+‚Æ‚ç‚ñ‚Õ
+‚Æ‚è
+‚Æ‚è‚ ‚‚©‚¢
+‚Æ‚è‚¢
+‚Ç‚è[‚Þ
+‚Æ‚è‚¢‚ê
+‚Ƃ肦
+‚Ƃ肨
+‚Ƃ肪[
+‚Æ‚è‚©‚²
+‚Ƃ肯‚µ
+‚Ƃ肱
+‚Ƃ肵‚Ü‚è‚â‚­
+‚Ƃ肵‚ç‚×
+‚Ƃ肽‚Ä
+‚Æ‚è‚Â
+‚Æ‚è‚‚¯
+‚Æ‚è‚É‚­
+‚Æ‚è‚Ђ«‚³‚«
+‚Æ‚è‚Ђ«‚µ‚å
+‚Æ‚è‚Ђ«‚¶‚å
+‚Æ‚è‚Õ‚é
+‚Æ‚è‚Ô‚ñ
+‚Æ‚è‚â
+‚Ç‚è‚傤‚±‚¤
+‚Ç‚è‚å‚­‚©
+‚Ç‚è‚ñ‚­
+‚Ç‚é
+‚Æ‚é‚­
+‚Ç‚ê
+‚Ç‚ê‚¢
+‚Æ‚ê[‚·
+‚Æ‚ê[‚ç
+‚Ç‚ê‚·
+‚Æ‚ë
+‚Ç‚ë
+‚Ƃ낤
+‚Ç‚ë[
+‚Æ‚ë‚Ó‚¡
+‚Æ‚ë‚Ó‚¡[
+‚Ç‚ë‚Ú‚¤
+‚Ç‚ë‚Ý‚¸
+‚Ç‚ë‚悯
+‚Æ‚í
+‚Ç‚ñ
+‚Ç‚ñ‚«
+‚Ç‚ñ‚±‚¤
+‚Æ‚ñ‚¶
+‚Æ‚ñ‚µ‚á
+‚Æ‚ñ‚µ‚ã
+‚Ç‚ñ‚¿‚傤
+‚Ç‚ñ‚‚¤
+‚Æ‚ñ‚Å‚ñ
+‚Ç‚ñ‚Ä‚ñ
+‚Æ‚ñ‚Ë‚é
+‚Æ‚ñ‚Ñ
+‚Æ‚ñ‚Õ‚­
+‚Æ‚ñ‚Ú
+‚Æ‚ñ‚â
+ƒi
+‚È
+‚È[‚·
+‚È‚¢
+‚È‚¢‚ ‚Â
+‚È‚¢[‚Ô
+‚È‚¢‚¢‚ñ
+‚È‚¢‚¦‚ñ
+‚È‚¢‚©
+‚È‚¢‚ª‚¢
+‚È‚¢‚©‚­
+‚È‚¢‚ª‚µ‚ë
+‚È‚¢‚©‚ñ
+‚È‚¢‚«
+‚È‚¢‚«‚å‚­
+‚È‚¢‚­‚¤
+‚È‚¢‚±‚­
+‚È‚¢‚³‚¢
+‚È‚¢‚µ
+‚È‚¢‚¶
+‚È‚¢‚¶‚Â
+‚È‚¢‚¶‚ã
+‚È‚¢‚µ‚å
+‚È‚¢‚µ‚ñ
+‚È‚¢‚µ‚ñ‚µ‚å
+‚È‚¢‚·
+‚È‚¢‚·‚ñ
+‚È‚¢‚¹‚¢
+‚È‚¢‚¹‚«
+‚È‚¢‚¹‚ñ
+‚È‚¢‚¼‚¤
+‚È‚¢‚½[
+‚È‚¢‚¿
+‚È‚¢‚Æ
+‚È‚¢‚Ë‚ñ‚«‚©‚ñ
+‚È‚¢‚Ó
+‚È‚¢‚Ô
+‚È‚¢‚Ô‚ñ
+‚È‚¢‚Ô‚ñ‚Ò
+‚È‚¢‚Ô‚ñ‚Ò‚¹‚ñ
+‚È‚¢‚Þ
+‚È‚¢‚ß‚¢
+‚È‚¢‚ß‚ñ
+‚È‚¢‚䂤
+‚È‚¢‚ç‚ñ
+‚È‚¢‚è‚­
+‚È‚¢‚è‚ñ‚´‚ñ
+‚È‚¢‚ë‚ñ
+‚È‚¢‚ñ
+‚È‚¦
+‚È‚¦‚¬
+‚È‚©
+‚È‚ª‚ ‚ß
+‚È‚©‚¢
+‚È‚ª‚¤‚½
+‚È‚©‚¤‚Ý
+‚È‚©‚ª‚¢‚É‚ñ
+‚È‚ª‚®‚Â
+‚È‚ª‚µ‚¾‚¢
+‚È‚©‚·
+‚È‚©‚·‚¶
+‚È‚©‚¹
+‚È‚ª‚»‚Å
+‚È‚ª‚½‚Ñ
+‚È‚ª‚¿‚傤‚Î
+‚È‚©‚Ç‚¨‚è
+‚È‚©‚É‚í
+‚È‚ª‚Ë‚ñ
+‚È‚©‚Î
+‚È‚©‚Ù‚Ç
+‚È‚©‚Ü
+‚È‚©‚Ü‚­
+‚È‚ª‚â
+‚È‚©‚悵
+‚È‚ª‚ê
+‚È‚ª‚ꂸ
+‚È‚ª‚ê‚Ú‚µ
+‚È‚«
+‚È‚¬
+‚È‚«‚²‚¦
+‚È‚«‚²‚Æ
+‚È‚¬‚³
+‚È‚¬‚È‚½
+‚È‚®‚³‚ß
+‚È‚®‚肱‚Ý
+‚È‚°‚«
+‚È‚±‚¤‚Ç
+‚È‚²‚è
+‚È‚³‚¯
+‚È‚µ
+‚È‚µ‚å‚È‚è‚·‚Æ
+‚È‚µ‚å‚Ȃ肸‚Þ
+‚È‚µ‚å‚È‚è‚Ä‚¡
+‚È‚º
+‚È‚¼
+‚È‚¾
+‚È‚¾‚¢
+‚È‚½‚Ë
+‚È‚¾‚ê
+‚È‚Â
+‚È‚Á‚Â
+‚È‚Á‚Æ
+‚È‚Á‚Æ‚¤
+‚Ȃ‚Î
+‚Ȃ‚ӂ­
+‚Ȃ‚ނ«
+‚Ȃ‚à‚Ì
+‚Ȃ‚â‚Ü
+‚È‚Å‚µ‚±
+‚È‚Ç
+‚È‚Æ‚è
+‚È‚È
+‚È‚È‚¢‚ë
+‚È‚È‚­‚³
+‚È‚È‚ß
+‚È‚É
+‚È‚É‚²‚Æ
+‚È‚É‚Ô‚ñ
+‚È‚É‚í‚Ô‚µ
+‚È‚Ê‚©
+‚È‚Ì‚©
+‚È‚Ñ‚Á‚­
+‚È‚Õ‚«‚ñ
+‚È‚Ó‚¾
+‚È‚Ó‚½‚è‚ñ
+‚È‚×
+‚Ȃׂ¼‚±
+‚Ȃׂà‚Ì
+‚È‚Ü
+‚È‚Ü‚¢‚«
+‚È‚Ü‚¦
+‚È‚Ü‚ª‚µ
+‚È‚Ü‚«
+‚È‚Ü‚«‚¸
+‚È‚Ü‚¯‚à‚Ì
+‚È‚Ü‚Ù‚¤‚»‚¤
+‚È‚Ü‚Ý
+‚È‚Ü‚Ý‚¸
+‚È‚Ü‚à‚Ì
+‚È‚Ü‚è
+‚È‚Ý
+‚È‚Ý‚ ‚µ
+‚È‚Ý‚«
+‚È‚Ý‚¹‚¢
+‚È‚Ý‚Í‚Î
+‚È‚Ý‚Ü
+‚È‚ß‚µ‚ª‚í
+‚È‚â
+‚È‚ç
+‚Ȃ炯
+‚È‚ç‚Ñ‚©‚½
+‚È‚ç‚ׂ©‚¦
+‚È‚ç‚킵
+‚È‚è‚«‚ñ
+‚Ȃ肽‚¿
+‚È‚è‚à‚Ì
+‚Ȃ邱
+‚È‚ê‚ ‚¢
+‚È‚ê[‚µ‚å‚ñ
+‚È‚ê[‚½
+‚È‚ê‚Á‚¶
+‚È‚í
+‚Ȃ킵‚ë
+‚È‚í‚Æ‚Ñ
+‚È‚í‚΂è
+‚È‚ñ
+‚È‚ñ‚¢
+‚È‚ñ‚¢‚Ç
+‚È‚ñ‚¨‚¤
+‚È‚ñ‚©‚¢
+‚È‚ñ‚ª‚ñ
+‚È‚ñ‚«‚å‚­
+‚È‚ñ‚«‚ñ
+‚È‚ñ‚­‚¹
+‚È‚ñ‚°‚ñ
+‚È‚ñ‚±
+‚È‚ñ‚±‚¤
+‚È‚ñ‚±‚Â
+‚È‚ñ‚¶
+‚È‚ñ‚¶‚©‚ñ
+‚È‚ñ‚µ‚«
+‚È‚ñ‚µ‚Â
+‚È‚ñ‚µ‚å
+‚È‚ñ‚µ‚å‚­
+‚È‚ñ‚¹‚¢
+‚È‚ñ‚¹‚ñ‚·
+‚È‚ñ‚¾‚¢
+‚È‚ñ‚½‚ñ
+‚È‚ñ‚¿‚傤
+‚È‚ñ‚Ä‚Â
+‚È‚ñ‚Ä‚ñ
+‚È‚ñ‚Æ‚¤
+‚È‚ñ‚Ç‚­
+‚È‚ñ‚È‚ñ‚¹‚¢
+‚È‚ñ‚È‚ñ‚Æ‚¤
+‚È‚ñ‚É‚¿
+‚È‚ñ‚É‚ñ
+‚È‚ñ‚Ë‚ñ
+‚È‚ñ‚Î[
+‚È‚ñ‚΂ñ
+‚È‚ñ‚Ò‚Æ
+‚È‚ñ‚т傤
+‚È‚ñ‚҂傤‚悤
+‚È‚ñ‚Ô
+‚È‚ñ‚Õ‚¤
+‚È‚ñ‚Ô‚ñ
+‚È‚ñ‚Õ‚ñ
+‚È‚ñ‚ׂ¢
+‚È‚ñ‚Û‚¤
+‚È‚ñ‚Ú‚­
+‚È‚ñ‚Ý‚ñ
+‚È‚ñ‚à‚ñ
+‚È‚ñ‚ç
+‚È‚ñ‚ë
+ƒj
+‚É
+‚É
+‚É‚ ‚‚©‚¢
+‚É‚¢‚³‚ñ
+‚É[‚¸
+‚É‚¢‚ÂÜ
+‚É‚¢‚Ú‚ñ
+‚É‚¢‚ñ
+‚É‚¤‚²‚«
+‚É‚¦‚«
+‚É‚¨‚¤
+‚É‚©
+‚É‚©‚¢
+‚É‚ª‚©‚è
+‚É‚ª‚Â
+‚É‚ª‚Ä
+‚É‚«
+‚É‚¬‚í‚¢
+‚É‚­
+‚É‚­‚¢
+‚É‚­‚ª‚ñ
+‚É‚­‚¬‚イ
+‚É‚­‚µ‚Â
+‚É‚­‚µ‚Ý
+‚É‚­‚µ‚ã
+‚É‚­‚µ‚ñ
+‚É‚­‚¹‚¢
+‚É‚­‚«
+‚É‚­‚ЂÂ
+‚É‚­‚é‚¢
+‚É‚®‚é‚Ü
+‚É‚°‚Î
+‚É‚°‚Ý‚¿
+‚É‚°‚ñ
+‚É‚³‚΂«
+‚É‚³‚ñ
+‚É‚³‚ñ‚©
+‚É‚µ
+‚É‚¶
+‚É‚¶‚©‚¢
+‚É‚µ‚©‚¢‚ª‚ñ
+‚É‚µ‚ª‚í
+‚É‚µ‚«
+‚É‚µ‚®‚¿
+‚É‚¶‚°‚ñ
+‚É‚µ‚¶‚ñ
+‚É‚µ‚¶‚ñ‚¨‚è
+‚É‚µ‚Ñ
+‚É‚µ‚Ⴝ‚­‚¢‚Â
+‚É‚¶‚イ
+‚É‚¶‚傤
+‚É‚µ‚ñ
+‚É‚µ‚ñ‚Æ‚¤
+‚É‚µ‚ñ‚Ù‚¤
+‚É‚·
+‚É‚¹‚¢
+‚É‚¹‚³‚Â
+‚É‚¹‚à‚Ì
+‚É‚»‚¤
+‚É‚»‚­‚³‚ñ‚à‚ñ
+‚É‚¾
+‚É‚¾‚¢
+‚É‚¿
+‚É‚¿‚¨‚¤
+‚É‚¿‚°‚ñ
+‚É‚¿‚¶
+‚É‚¿‚¶‚傤
+‚É‚¿‚Ç‚¤
+‚É‚¿‚Ç‚­
+‚É‚¿‚Ó‚Â
+‚É‚¿‚ׂ¢
+‚É‚¿‚Ú‚Â
+‚É‚¿‚â
+‚É‚¿‚悤
+‚É‚¿‚悤‚Ñ
+‚É‚¿‚悤‚Ђñ
+‚É‚Á‚©
+‚É‚Á‚©‚Â
+‚É‚Á‚©‚ñ
+‚É‚Á‚©‚ñ‚µ
+‚É‚Á‚«
+‚É‚Á‚«‚¿‚傤
+‚É‚Á‚«‚イ
+‚É‚Á‚¯‚¢
+‚É‚Á‚¯‚¢‚Ђ傤
+‚É‚Á‚¯‚¢‚ê‚ñ
+‚É‚Á‚±‚¤
+‚É‚Á‚³‚ñ
+‚É‚Á‚µ
+‚É‚Á‚µ‚á
+‚É‚Á‚µ‚イ
+‚É‚Á‚µ‚傤
+‚É‚Á‚µ‚傤‚«
+‚É‚Á‚µ‚傤‚¯‚ñ
+‚É‚Á‚µ‚å‚­
+‚É‚Á‚µ‚ñ
+‚É‚Á‚·‚¤
+‚É‚Á‚¿‚イ
+‚É‚Á‚¿‚å‚­
+‚É‚Á‚Ä‚¢
+‚É‚Á‚Ä‚¢‚Ђ傤
+‚É‚Á‚Ä‚ñ
+‚É‚Á‚Æ
+‚É‚Á‚Æ‚¤
+‚É‚Á‚Û‚ñ
+‚É‚Æ
+‚É‚Ç
+‚É‚Æ‚¤
+‚É‚È‚¢‚Ä
+‚É‚Ê‚µ
+‚É‚Ì‚ ‚µ
+‚É‚Ì‚Æ‚è
+‚É‚Ì‚Ü‚¢
+‚ɂ΂ñ
+‚É‚Ô
+‚É‚Ó‚¾
+‚É‚Ú‚µ
+‚É‚Ù‚ñ
+‚É‚Ù‚ñ‚ª
+‚É‚Ù‚ñ‚©‚¢
+‚É‚Ù‚ñ‚ª‚Ý
+‚É‚Ù‚ñ‚²
+‚É‚Ù‚ñ‚±‚­
+‚É‚Ù‚ñ‚µ
+‚É‚Ù‚ñ‚µ‚ã
+‚É‚Ù‚ñ‚΂ê
+‚É‚Ù‚ñ‚Ü
+‚É‚à‚¤‚³‚­
+‚É‚à‚Â
+‚É‚â‚­
+‚É‚ã‚ ‚ñ‚·
+‚É‚ã[
+‚ɂイ‚©‚¢‚«‚ñ
+‚ɂイ‚ª‚­‚«‚ñ
+‚ɂイ‚ª‚­‚µ‚«
+‚ɂイ‚ª‚ñ
+‚ɂイ‚¬‚イ
+‚ɂイ‚¬‚傤
+‚ɂイ‚´‚¢
+‚ɂイ‚³‚ñ‚«‚ñ
+‚ɂイ‚µ
+‚ɂイ‚¶
+‚ɂイ‚¶‚¢‚ñ
+‚ɂイ‚µ‚ã‚Á‚«‚ñ
+‚ɂイ‚µ‚ã‚Á‚±‚­
+‚ɂイ‚¶‚傤‚¯‚ñ
+‚É‚ã[‚·
+‚É‚ã[‚¸
+‚ɂイ‚¹‚¢‚Ђñ
+‚ɂイ‚¹‚ñ
+‚ɂイ‚Æ‚¤
+‚É‚ã[‚Æ‚ç‚é
+‚ɂイ‚Í‚­‚µ‚å‚­
+‚ɂイ‚悤
+‚ɂイ‚悤‚¶
+‚É‚å‚¢
+‚ɂ傤
+‚ɂ傤‚»
+‚ɂ傤‚Ç‚¤
+‚ɂ傤‚Ç‚­‚µ‚傤
+‚ɂ傽‚¢
+‚É‚å‚É‚ñ
+‚É‚å‚ç‚¢
+‚É‚ç
+‚É‚è‚‚͂¢‚Í‚ñ
+‚É‚è‚イ
+‚É‚è‚ñ
+‚É‚é‚¢
+‚É‚í
+‚É‚í‚¢‚µ
+‚É‚í‚©‚ ‚ß
+‚É‚í‚«
+‚ɂ킳‚«
+‚ɂ킵
+‚É‚ñ
+‚É‚ñ‚«
+‚É‚ñ‚«‚à‚Ì
+‚É‚ñ‚¬‚å
+‚É‚ñ‚¬‚傤
+‚É‚ñ‚°‚ñ
+‚É‚ñ‚°‚ñ‚©‚¢
+‚É‚ñ‚°‚ñ‚Ý
+‚É‚ñ‚³‚ñ‚Õ
+‚É‚ñ‚¶‚á
+‚É‚ñ‚µ‚傤
+‚É‚ñ‚¶‚傤
+‚É‚ñ‚¶‚傤‚Ý
+‚É‚ñ‚¶‚ñ
+‚É‚ñ‚»‚¤
+‚É‚ñ‚»‚­
+‚É‚ñ‚¿
+‚É‚ñ‚Ä‚¢‚µ‚傤
+‚É‚ñ‚Ò
+‚É‚ñ‚Ò‚É‚ñ
+‚É‚ñ‚Õ
+ƒk
+‚Ê
+‚Ê‚¢‚®‚é‚Ý
+‚Ê‚¢‚±
+‚Ê‚¢‚µ‚ë
+‚Ê‚¢‚΂è
+‚Ê‚¢‚ß
+‚Ê[‚ñ
+‚Ê‚©
+‚Ê‚©‚è
+‚Ê‚«
+‚Ê‚«‚ª‚½
+‚Ê‚­‚à‚è
+‚Ê‚¯‚ ‚È
+‚Ê‚¯‚ª‚ç
+‚Ê‚¯‚Ý‚¿
+‚Ê‚µ
+‚Ê‚·‚Á‚Æ
+‚Ê‚·‚Ñ‚Æ
+‚Ê‚·‚Ý
+‚Ê‚Ì
+‚Ê‚Ì‚¶
+‚Ê‚Ì‚¹‚¢
+‚Ê‚Ü
+‚Ê‚Ü‚½
+‚Ê‚Ü‚¿
+‚Ê‚è
+‚ʂ肦
+‚Ê‚è‚à‚Ì
+‚Ê‚é‚Ü‚ä
+ƒl
+‚Ë
+‚Ë
+‚Ë‚ ‚¹
+‚Ë‚¢‚«
+‚Ë‚¢‚ë
+‚Ë‚¤‚¿
+‚Ë‚¦
+‚Ë‚¦‚³‚ñ
+‚Ë[‚Þ
+‚Ë‚¨‚ñ
+‚Ë‚ª
+‚Ë‚ª‚¢
+‚Ë‚ª‚¢‚²‚Æ
+‚Ë‚ª‚Ä‚¡‚Ô
+‚Ë‚¬
+‚Ë‚­‚½‚¢
+‚Ë‚±
+‚Ë‚²‚±‚¿
+‚Ë‚±‚º
+‚Ë‚²‚Æ
+‚Ë‚¶
+‚Ë‚¸‚Ý
+‚Ë‚¾
+‚Ë‚¾‚ñ
+‚Ë‚Â
+‚˂‚¢
+‚Ë‚Á‚«
+‚Ë‚Á‚­
+‚Ë‚Á‚¯‚Â
+‚Ë‚Á‚µ‚á‚т傤
+‚˂‚¶‚傤
+‚˂‚µ‚å‚è
+‚Ë‚Á‚¹‚ñ
+‚Ë‚Á‚½‚¢
+‚Ë‚Á‚½‚¢‚¬‚å
+‚˂‚łñ‚Ç‚¤‚è‚Â
+‚Ë‚Á‚Æ‚¤
+‚Ë‚Á‚Æ‚í[‚­
+‚˂‚т傤
+‚Ë‚Á‚Õ‚¤
+‚˂‚炢
+‚˂‚è‚傤
+‚Ë‚Ä‚¢‚Æ‚¤
+‚Ë‚Í‚Î
+‚˂΂è
+‚˂΂肯
+‚Ë‚Í‚ñ
+‚Ë‚Ñ‚ç‚«
+‚Ë‚Ô‚­‚ë
+‚Ë‚Ó‚¾
+‚Ë‚Þ‚¯
+‚Ë‚Þ‚Ì‚«
+‚Ë‚Þ‚è
+‚Ë‚à‚Æ
+‚Ë‚ä‚«
+‚Ë‚ç‚¢
+‚Ë‚è
+‚Ë‚í‚´
+‚Ë‚ñ
+‚Ë‚ñ‚¦‚«
+‚Ë‚ñ‚ª
+‚Ë‚ñ‚ª‚­
+‚Ë‚ñ‚ª‚¶‚傤
+‚Ë‚ñ‚ª‚Á‚Ò
+‚Ë‚ñ‚«
+‚Ë‚ñ‚«‚ñ
+‚Ë‚ñ‚®
+‚Ë‚ñ‚°‚Â
+‚Ë‚ñ‚°‚ñ
+‚Ë‚ñ‚±‚¤
+‚Ë‚ñ‚²‚¤
+‚Ë‚ñ‚µ
+‚Ë‚ñ‚¶
+‚Ë‚ñ‚µ‚イ
+‚Ë‚ñ‚¶‚イ
+‚Ë‚ñ‚µ‚å
+‚Ë‚ñ‚µ‚傤
+‚Ë‚ñ‚·‚¤
+‚Ë‚ñ‚¾‚¢
+‚Ë‚ñ‚À‚イ
+‚Ë‚ñ‚¿‚傤
+‚Ë‚ñ‚¿‚傤‚µ‚á
+‚Ë‚ñ‚Ç
+‚Ë‚ñ‚Æ‚¤
+‚Ë‚ñ‚Ç‚È‚¢
+‚Ë‚ñ‚È‚¢
+‚Ë‚ñ‚Ë‚ñ
+‚Ë‚ñ‚Ï‚¢
+‚Ë‚ñ‚Ò
+‚Ë‚ñ‚҂傤
+‚Ë‚ñ‚Õ
+‚Ë‚ñ‚Ô‚Â
+‚Ë‚ñ‚ׂÂ
+‚Ë‚ñ‚Û‚¤
+‚Ë‚ñ‚Ü‚­
+‚Ë‚ñ‚Ü‚Â
+‚Ë‚ñ‚ß
+‚Ë‚ñ‚ç‚¢
+‚Ë‚ñ‚è
+‚Ë‚ñ‚è‚Â
+‚Ë‚ñ‚è‚傤
+‚Ë‚ñ‚è‚ñ
+‚Ë‚ñ‚ê‚¢
+ƒm
+‚Ì
+‚Ì
+‚Ì‚¢‚ë[‚º
+‚Ì‚¤
+‚Ì‚¤‚¦‚ñ
+‚Ì‚¤‚©
+‚Ì‚¤‚©‚¢
+‚Ì‚¤‚ª‚«
+‚Ì‚¤‚ª‚­
+‚Ì‚¤‚ª‚­‚©
+‚Ì‚¤‚ª‚­‚Ô
+‚Ì‚¤‚©‚ñ‚«
+‚Ì‚¤‚«
+‚Ì‚¤‚«‚®
+‚Ì‚¤‚«‚傤
+‚Ì‚¤‚¬‚傤
+‚Ì‚¤‚®
+‚Ì‚¤‚°‚¢
+‚Ì‚¤‚¯‚Á‚¹‚ñ
+‚Ì‚¤‚±‚¤
+‚Ì‚¤‚±‚ñ
+‚Ì‚¤‚³‚¬‚傤
+‚Ì‚¤‚³‚­
+‚Ì‚¤‚³‚­‚Ô‚Â
+‚Ì‚¤‚³‚ñ
+‚Ì‚¤‚µ
+‚Ì‚¤‚¶
+‚Ì‚¤‚¶‚イ‚¢
+‚Ì‚¤‚µ‚ã‚Á‚¯‚Â
+‚Ì‚¤‚µ‚傤
+‚Ì‚¤‚¶‚傤
+‚Ì‚¤‚¸‚¢
+‚Ì‚¤‚¹‚¢
+‚Ì‚¤‚»‚Á‚¿‚イ
+‚Ì‚¤‚»‚ñ
+‚Ì‚¤‚½‚ñ
+‚Ì‚¤‚¿
+‚Ì‚¤‚Ä‚ñ
+‚Ì‚¤‚Ç
+‚Ì‚¤‚Í
+‚Ì‚¤‚Í‚¤
+‚Ì‚¤‚Í‚ñ‚«
+‚Ì‚¤‚ЂÂ
+‚Ì‚¤‚Ђñ‚¯‚Â
+‚Ì‚¤‚Ђñ‚µ‚å
+‚Ì‚¤‚Ó
+‚Ì‚¤‚Ù‚¤
+‚Ì‚¤‚Ü‚­
+‚Ì‚¤‚Ü‚­‚¦‚ñ
+‚Ì‚¤‚Ý‚ñ
+‚Ì‚¤‚Þ
+‚Ì‚¤‚ß‚ñ
+‚Ì‚¤‚â‚­
+‚Ì‚¤‚è‚Â
+‚Ì‚¤‚è‚傤
+‚Ì‚¤‚è‚å‚­
+‚Ì‚¤‚è‚ñ
+‚Ì‚¤‚è‚ñ‚·‚¢‚³‚ñ
+‚Ì[‚·
+‚Ì[‚Æ
+‚Ì[‚Ü‚é
+‚Ì‚«
+‚Ì‚¬
+‚Ì‚¬‚­
+‚Ì‚«‚³‚«
+‚Ì‚«‚µ‚½
+‚Ì‚«‚È‚Ý
+‚Ì‚¯‚à‚Ì
+‚Ì‚±
+‚Ì‚±‚¬‚è
+‚Ì‚´‚炵
+‚Ì‚µ‚ª‚Ý
+‚Ì‚¸‚é
+‚Ì‚¿
+‚Ì‚Á‚­
+‚Ì‚Á‚¿
+‚Ì‚Á‚Æ
+‚Ì‚Ä‚ñ
+‚Ì‚Ç
+‚Ì‚Ç‚í
+‚Ì‚È‚©
+‚Ì‚Í‚ç
+‚Ì‚Ñ
+‚Ì‚Ñ‚È‚â‚Ý
+‚Ì‚Ñ‚Ì‚Ñ
+‚Ì‚Ñ‚è‚Â
+‚Ì‚×
+‚ׂ̂¢‚½
+‚ׂ̂¶‚ñ‚¢‚ñ
+‚ׂ̂ɂÁ‚·‚¤
+‚Ì‚Ú‚è
+‚Ì‚Ú‚è‚´‚©
+‚Ì‚Ý
+‚Ì‚Ý‚·‚¬
+‚Ì‚Ý‚¿
+‚Ì‚Ý‚à‚Ì
+‚Ì‚Ý‚â
+‚Ì‚â‚«
+‚Ì‚â‚Ü
+‚Ì‚ç
+‚Ì‚è
+‚Ì‚è‚ ‚¢
+‚Ì‚è‚©‚¦‚¦‚«
+‚Ì‚è‚­‚Ý‚¢‚ñ
+‚̂肵‚ë
+‚Ì‚è‚Æ
+‚Ì‚è‚Î
+‚Ì‚è‚à‚Ì
+‚Ì‚ê‚ñ
+‚Ì‚ë‚Ü
+‚Ì‚ñ‚¿‚á‚ñ
+ƒn
+‚Í
+‚Í
+ƒo
+‚Î
+‚Î
+ƒp
+‚Ï
+‚Î[
+‚Ï[
+‚΂ ‚¢
+‚Ï[‚­
+‚Î[‚¶‚å‚ñ
+‚Ï[‚¹‚ñ‚Ä[‚¶
+‚Ï[‚¹‚ñ‚Æ
+‚Ï[‚»‚È‚è‚Ä‚¡
+‚Ï[‚»‚È‚é
+‚Ï[‚Â
+‚Í[‚Æ
+‚Í[‚Ç
+‚Î[‚Ç
+‚Ï[‚Æ
+‚Í[‚Ç‚¤‚¥‚ 
+‚Ï[‚Æ‚½‚¢‚Ü
+‚Í[‚Î[
+‚Ï[‚Ó‚¥‚­‚Æ
+‚Ï[‚Ü‚Ë‚ñ‚Æ
+‚Í[‚à‚É[
+‚Í[‚à‚É‚©
+‚Ï[‚ç
+‚Ï[‚é
+‚Î[‚ê‚é
+‚΂¢
+‚Ï‚¢
+‚΂¢‚ ‚·
+‚Í‚¢‚ ‚ñ
+‚Í‚¢‚¢‚ë
+‚Í‚¢‚¢‚ñ
+‚΂¢‚¤
+‚΂¢‚¤‚º‚ñ‚¹‚ñ
+‚Í‚¢‚¦‚¢
+‚Í‚¢‚¦‚«
+‚Í‚¢‚¦‚ñ
+‚΂¢‚¦‚ñ
+‚΂¢‚¨
+‚Í‚¢‚¨‚­
+‚΂¢‚¨‚è‚ñ
+‚΂¢‚¨‚ê‚Á‚Æ
+‚Í‚¢‚ª
+‚΂¢‚©
+‚΂¢‚©‚­
+‚΂¢‚ª‚­
+‚Í‚¢‚«‚Ô‚Â
+‚΂¢‚«‚ñ
+‚Í‚¢‚«‚ñ‚®
+‚Í‚¢‚­
+‚΂¢‚­
+‚Í‚¢‚®‚¤‚µ‚á
+‚Í‚¢‚®‚ñ
+‚Í‚¢‚¯‚¢
+‚Í‚¢‚±‚¤
+‚΂¢‚±‚­
+‚Í‚¢‚´‚ç
+‚Í‚¢‚´‚ñ
+‚Í‚¢‚µ‚á
+‚΂¢‚µ‚á‚­‚É‚ñ
+‚΂¢‚µ‚傤‚«‚ñ
+‚Í‚¢‚¶‚ñ
+‚΂¢‚µ‚ñ
+‚΂¢‚¶‚ñ
+‚΂¢‚µ‚ñ‚¢‚ñ
+‚Í‚¢‚·‚¢
+‚Í‚¢‚·‚¢‚©‚ñ
+‚Í‚¢‚·‚¢‚Ì‚¶‚ñ
+‚Í‚¢‚·‚­[‚é
+‚Í‚¢‚¹‚¢
+‚΂¢‚¹‚¢‚Ç
+‚Í‚¢‚»‚¤
+‚΂¢‚»‚­
+‚Í‚¢‚½
+‚΂¢‚½‚¢
+‚Í‚¢‚Ä‚­
+‚Í‚¢‚Å‚ñ
+‚΂¢‚Ä‚ñ
+‚Í‚¢‚Å‚ñ‚΂ñ
+‚Í‚¢‚Æ‚¤‚è‚Â
+‚Í‚¢‚Æ‚­
+‚΂¢‚Ç‚­
+‚Í‚¢‚É‚¿
+‚Í‚¢‚Ï[
+‚Í‚¢‚Í‚ñ
+‚Í‚¢‚΂ñ
+‚Í‚¢‚т傤
+‚Í‚¢‚Ђñ
+‚΂¢‚Ђñ
+‚Í‚¢‚Ó‚Ÿ‚¢
+‚Í‚¢‚Ó‚«‚¶‚ã‚ñ
+‚Í‚¢‚Ó‚­
+‚Í‚¢‚Ô‚Â
+‚Ï‚¢‚Õ‚â‚­
+‚Í‚¢‚Ó‚ñ
+‚Í‚¢‚Ù‚¤
+‚Í‚¢‚â[
+‚΂¢‚â[
+‚΂¢‚â‚­
+‚΂¢‚â‚­‚¸‚Ý
+‚Í‚¢‚ä
+‚Í‚¢‚䂤
+‚΂¢‚è‚Â
+‚Ï‚¢‚é
+‚Ï‚¢‚ë‚Á‚Æ
+‚΂¢‚ñ‚¾
+‚Í‚¤‚¶‚ñ‚®
+‚Í‚¤‚·
+‚Í‚¦
+‚Í‚¦‚È‚í
+‚Í‚©
+‚΂©
+‚Í‚©‚¢
+‚Í‚©‚¢‚µ
+‚Í‚ª‚«
+‚Í‚©‚­
+‚΂©‚¸
+‚Í‚ª‚½
+‚Í‚ª‚Ë
+‚Í‚©‚Î
+‚Í‚©‚Ô
+‚Í‚©‚Ü
+‚Í‚©‚ç‚¢
+‚Í‚©‚è
+‚΂©‚ñ‚·
+‚Í‚«
+‚Í‚¬
+‚Í‚«‚¯
+‚Í‚«‚à‚Ì
+‚Í‚¬‚傤
+‚Í‚«‚å‚­
+‚Í‚­
+‚΂®
+‚Í‚­‚ 
+‚Í‚­‚ ‚¢
+‚Í‚­‚¢
+‚Í‚­‚¤‚ñ
+‚΂­‚¨‚ñ
+‚΂­‚ª‚Æ‚¤
+‚Í‚®‚«
+‚Í‚­‚³‚¢
+‚Í‚­‚µ
+‚Í‚­‚¶
+‚Í‚­‚µ‚²‚¤
+‚Í‚­‚¶‚Â
+‚Í‚­‚µ‚á‚­
+‚Í‚­‚¶‚ã
+‚΂­‚µ‚イ
+‚Í‚­‚µ‚å
+‚Í‚­‚¶‚傤
+‚Í‚­‚µ‚å‚­
+‚Í‚­‚µ‚ñ
+‚΂­‚µ‚ñ‚¿
+‚Í‚­‚¹‚¢
+‚Í‚­‚¹‚ñ
+‚΂­‚¾‚ñ
+‚Í‚­‚¿
+‚Í‚­‚¿‚イ
+‚Í‚­‚¿‚傤
+‚Í‚­‚Æ‚¤
+‚Í‚­‚Ç‚¤
+‚Í‚­‚Î
+‚Í‚­‚΂¢
+‚Í‚­‚Í‚Â
+‚Í‚­‚Ñ
+‚Í‚­‚Ђ傤
+‚΂­‚Ó‚¤
+‚Í‚­‚Ô‚Â
+‚Í‚­‚Ԃ‚©‚ñ
+‚Í‚­‚Ö‚¢
+‚Í‚­‚Ú
+‚Í‚­‚Ú‚­
+‚Í‚­‚Ü‚¢
+‚΂­‚Ü‚Â
+‚Í‚­‚ß‚¢
+‚΂­‚â‚­
+‚Í‚­‚悤
+‚Í‚­‚ç‚¢
+‚΂­‚ç‚¢
+‚Í‚­‚ç‚­
+‚Í‚­‚è
+‚Í‚­‚è‚å‚­
+‚Í‚®‚é‚Ü
+‚Í‚®‚ë
+‚΂­‚낤
+‚Í‚¯
+‚Í‚°
+‚΂¯‚Â
+‚Ï‚¯‚Á‚Æ
+‚΂¯‚à‚Ì
+‚Í‚¯‚ñ
+‚΂¯‚ñ
+‚Í‚±
+‚΂±
+‚Í‚²‚½‚¦
+‚Í‚±‚É‚í
+‚Í‚²‚ë‚à
+‚΂´[
+‚Í‚´‚©‚¢‚«
+‚Í‚³‚«
+‚Í‚´‚­‚ç
+‚Í‚³‚Ý
+‚΂³‚Ý
+‚Í‚µ
+‚Í‚¶
+‚΂¶‚¥‚Á‚Æ
+‚Í‚µ‚©
+‚Í‚µ‚¯
+‚Í‚µ‚²
+‚Í‚µ‚½
+‚Í‚µ‚À‚©
+‚Í‚µ‚Âß
+‚΂¶‚Æ‚¤‚Ó‚¤
+‚Í‚µ‚΂µ
+‚Í‚¶‚ß
+‚΂µ‚á
+‚΂¶‚ã‚Â
+‚Í‚µ‚ã‚‚¶‚å
+‚Í‚µ‚ã‚‚Ó
+‚΂µ‚å
+‚Í‚¶‚傤
+‚΂µ‚傤
+‚Í‚µ‚ç
+‚Í‚µ‚è
+‚Í‚·
+‚Í‚¸
+‚΂·
+‚Ï‚·
+‚Í‚·‚¤
+‚΂·‚¯‚Á‚Æ
+‚Ï‚¸‚é
+‚Ï‚·‚í[‚Ç
+‚Í‚º
+‚΂¹‚¢
+‚Í‚¹‚ñ
+‚Ï‚»‚±‚ñ
+‚Í‚¾
+‚΂½[
+‚Í‚¾‚ ‚¢
+‚Ï‚½[‚ñ
+‚Í‚½‚¢‚ë
+‚Í‚¾‚¢‚ë
+‚Í‚½‚¨‚è
+‚Í‚½‚ª‚µ‚ç
+‚Í‚¾‚¬
+‚Í‚½‚¯
+‚Í‚½‚²
+‚Í‚½‚³‚­
+‚Í‚¾‚´‚í‚è
+‚Í‚½‚¶‚邵
+‚Í‚½‚Ñ
+‚Í‚¾‚Ý
+‚Í‚½‚ß
+‚Í‚½‚ç‚«‚´‚©‚è
+‚Í‚½‚ç‚«‚Ä
+‚Í‚¾‚ñ
+‚Í‚¿
+‚Í‚¿‚¤‚¦
+‚Í‚¿‚ª‚Â
+‚Í‚¿‚­
+‚Í‚¿‚Ô
+‚Í‚¿‚Ü‚ñ
+‚Í‚¿‚Ý‚Â
+‚Í‚¿‚à‚Ì
+‚Í‚¿‚傤
+‚Ï‚¿‚ñ‚±
+‚Í‚Â
+‚΂Â
+‚͂‚¤‚Ü
+‚͂‚¦‚ñ‚Æ‚¤
+‚͂‚¨‚ñ
+‚Í‚Á‚©‚Ä‚ñ
+‚͂‚ª‚ñ
+‚͂‚ª‚ñ‚¹‚¢
+‚͂«
+‚Í‚Á‚«‚イ
+‚Í‚Á‚«‚ñ
+‚΂Á‚«‚ñ
+‚΂Á‚®
+‚΂Á‚­‚·
+‚΂‚®‚ñ
+‚Í‚Á‚¯‚¢
+‚Ï‚Á‚¯[‚¶
+‚Í‚Á‚¯‚Á‚«‚イ
+‚Í‚Á‚¯‚‚т傤
+‚Í‚Á‚±‚¤‚µ‚á
+‚Í‚Á‚±‚¤‚µ‚å
+‚Í‚Á‚±‚¤‚¸‚Ý
+‚Í‚Á‚±‚¤‚Ñ
+‚Í‚Á‚±‚Â
+‚Í‚Á‚³‚­
+‚΂Á‚¶
+‚Í‚Á‚µ‚傤‚¿
+‚Í‚Á‚µ‚å‚­
+‚Í‚Á‚µ‚ñ‚«
+‚΂Á‚»‚­
+‚΂Á‚½
+‚΂Á‚¿
+‚΂Á‚Ä‚¡‚ñ‚®
+‚΂Á‚Ä‚ñ
+‚͂‚łñ‚«
+‚͂‚łñ‚µ‚å
+‚΂Á‚Æ
+‚͂‚ǂ¤‚«
+‚͂‚É
+‚͂‚Ë
+‚͂‚΂¢‚à‚Æ
+‚͂‚͂é
+‚Í‚Á‚Ò[
+‚Í‚Á‚҂傤‚©‚¢
+‚΂Á‚Ó‚Ÿ
+‚Í‚Á‚Û‚¤
+‚΂Á‚Û‚ñ
+‚͂‚݂Ý
+‚͂‚à‚Ì
+‚͂‚䂫
+‚͂‚ä‚ß
+‚Í‚Ä
+‚Í‚Å
+‚΂Ă¢
+‚Í‚Ç‚¤
+‚΂Ƃ¤
+‚Ï‚Æ‚©[
+‚Í‚Æ‚Î
+‚Í‚Æ‚ß
+‚Í‚Ç‚ß
+‚Ï‚Æ‚ë‚ñ
+‚Í‚È‚¢‚«
+‚Í‚È‚¨
+‚Í‚È‚ª‚³
+‚Í‚È‚ª‚½
+‚Í‚È‚²‚¦
+‚Í‚È‚´‚©‚è
+‚Í‚È‚³‚«
+‚Í‚È‚µ‚ ‚¢‚Ä
+‚Í‚È‚µ‚©
+‚Í‚È‚·‚¶
+‚Ï‚È‚»‚É‚Á‚­
+‚Í‚È‚¼‚Ì
+‚Í‚È‚½‚Î
+‚Í‚È‚À
+‚Í‚È‚Ñ
+‚Í‚È‚Ô‚³
+‚Í‚È‚Ý‚¿
+‚Í‚È‚Þ‚±
+‚Í‚È‚â
+‚Í‚È‚æ‚ß
+‚Í‚È‚í
+‚Í‚É[
+‚Ï‚É‚Á‚­
+‚Í‚É‚í
+‚Í‚Ë
+‚΂Ë
+‚Í‚Ë‚Þ[‚ñ
+‚Ï‚Ë‚ç
+‚Í‚Í
+‚Í‚Î
+‚΂Î
+‚Ï‚Ï
+‚Í‚Í‚¨‚â
+‚Í‚Í‚©‚½
+‚͂΂Â
+‚Ï‚Ô
+‚Ï‚Ó‚§[‚Ü‚ñ‚·
+‚Í‚Õ‚É‚ñ‚®
+‚Í‚Ö‚ñ
+‚Í‚Ü
+‚Í‚Ü‚¤‚ç
+‚Í‚Ü‚«
+‚Í‚Ü‚×
+‚Í‚Þ
+‚Í‚ß
+‚΂߂ñ
+‚Í‚à‚Ì
+‚Í‚à‚ñ
+‚Í‚â
+‚͂₤‚Ü‚ê
+‚Í‚â‚­
+‚Í‚â‚­‚¿
+‚͂₵
+‚͂₹
+‚Í‚â‚Ä
+‚Í‚â‚Æ
+‚Í‚â‚΂ñ
+‚Í‚â‚Ô‚³
+‚Í‚â‚Ý‚¿
+‚Í‚â‚è
+‚Í‚â‚í‚´
+‚Í‚ç
+‚΂ç
+‚΂炢
+‚Í‚ç‚¢‚¹
+‚Í‚ç‚¢‚à‚Ç‚µ‚«‚ñ
+‚΂炦‚Ä‚¡
+‚͂炨‚Ñ
+‚Í‚ç‚°‚¢
+‚Ï‚ç‚»‚é
+‚Í‚ç‚Ü‚«
+‚Ï‚ç‚ß[‚½
+‚Ï‚ç‚ê‚é
+‚Í‚ç‚킽
+‚Í‚ç‚ñ
+‚΂ç‚ñ‚·
+‚Í‚ç‚ñ‚΂ñ‚¶‚傤
+‚Í‚è‚ ‚¢
+‚Í‚è‚¢‚½
+‚͂肪‚Ë
+‚͂肪‚Ý
+‚΂肫
+‚͂肱
+‚Í‚è‚ß
+‚Í‚é‚©‚º
+‚΂邭
+‚ς邱
+‚΂邱‚É[
+‚͂邳‚«
+‚͂邳‚ß
+‚Ï‚é‚·
+‚Ï‚é‚Õ
+‚Í‚é‚à‚Ì
+‚Í‚é‚â‚·‚Ý
+‚Í‚ê
+‚΂ꂢ‚µ‚å
+‚΂ꂦ
+‚΂ê[
+‚Í‚ê‚·‚ª‚½
+‚Ï‚ê‚Á‚Æ
+‚Í‚ê‚Ü
+‚Í‚ê‚à‚Ì
+‚͂낤
+‚Í‚ë[
+‚Í‚ë‚°‚ñ
+‚͂킽‚è
+‚Ï‚í‚Ó‚é
+‚Í‚ñ
+‚΂ñ
+‚Ï‚ñ
+‚Í‚ñ‚¢
+‚Í‚ñ‚¢‚ª‚¢
+‚Í‚ñ‚¦‚ñ
+‚Í‚ñ‚©
+‚Í‚ñ‚ª
+‚΂ñ‚©
+‚Í‚ñ‚ª[
+‚΂ñ‚ª‚¢
+‚΂ñ‚ª‚¢‚¿
+‚Í‚ñ‚©‚­
+‚Í‚ñ‚ª‚­
+‚΂ñ‚ª‚­
+‚Í‚ñ‚©‚¿
+‚Í‚ñ‚©‚‚¤
+‚Í‚ñ‚©‚ñ
+‚Í‚ñ‚ª‚ñ
+‚Í‚ñ‚©‚ñ‚Í‚ñ‚Ý‚ñ
+‚Í‚ñ‚«
+‚΂ñ‚«
+‚Í‚ñ‚«‚イ
+‚΂ñ‚«‚ñ
+‚΂ñ‚«‚ñ‚®
+‚΂ñ‚­
+‚Í‚ñ‚®‚é
+‚Í‚ñ‚¯‚¢
+‚Í‚ñ‚°‚µ‚傤
+‚Í‚ñ‚°‚Â
+‚Í‚ñ‚¯‚ñ
+‚΂ñ‚¯‚ñ
+‚Í‚ñ‚°‚ñ‚«
+‚Í‚ñ‚²
+‚΂ñ‚±
+‚Í‚ñ‚±‚¤
+‚΂ñ‚²‚¤
+‚Í‚ñ‚±‚¤‚«
+‚΂ñ‚²‚¤‚¶‚ã‚ñ
+‚΂ñ‚±‚­
+‚΂ñ‚±‚Á‚«
+‚Í‚ñ‚±‚‚¹‚¢‚µ‚ñ
+‚΂ñ‚±‚ñ
+‚Í‚ñ‚³‚¢
+‚Í‚ñ‚´‚¢
+‚Í‚ñ‚´‚¢‚µ‚á
+‚΂ñ‚³‚­
+‚Í‚ñ‚³‚Þ
+‚΂ñ‚³‚ñ
+‚Í‚ñ‚µ
+‚Í‚ñ‚¶
+‚΂ñ‚¶
+‚΂ñ‚¶‚«‚イ‚·
+‚Í‚ñ‚µ‚½
+‚΂ñ‚¶‚á‚­
+‚Í‚ñ‚µ‚ã
+‚΂ñ‚µ‚イ
+‚Í‚ñ‚¶‚ã‚­
+‚΂ñ‚µ‚ã‚ñ
+‚Í‚ñ‚µ‚傤
+‚Í‚ñ‚¶‚傤
+‚Í‚ñ‚µ‚ñ
+‚΂ñ‚¶‚ñ
+‚Í‚ñ‚¸
+‚Í‚ñ‚·‚¢
+‚Í‚ñ‚·‚¤
+‚Í‚ñ‚¹‚¢
+‚΂ñ‚¹‚¢
+‚Í‚ñ‚¹‚Â
+‚Í‚ñ‚¹‚ñ
+‚΂ñ‚¹‚ñ
+‚΂ñ‚º‚ñ
+‚΂ñ‚»‚¤
+‚΂ñ‚»‚¤‚±‚¤
+‚Í‚ñ‚»‚­
+‚Í‚ñ‚¾
+‚Í‚ñ‚½[
+‚Í‚ñ‚½‚¢
+‚Í‚ñ‚¾‚¢
+‚΂ñ‚¾‚¢
+‚Í‚ñ‚½‚¢‚ª‚í
+‚Í‚ñ‚½‚¢‚Í
+‚΂ñ‚¿
+‚΂ñ‚¿‚á
+‚Í‚ñ‚¿‚イ
+‚Í‚ñ‚¿‚傤
+‚΂ñ‚¿‚傤
+‚Ï‚ñ‚Â
+‚Í‚ñ‚‚«
+‚΂ñ‚Ä
+‚Í‚ñ‚Å‚¡
+‚Í‚ñ‚Ä‚ñ
+‚Í‚ñ‚Ç
+‚΂ñ‚Ç
+‚Í‚ñ‚Æ‚¤
+‚Í‚ñ‚Ç‚¤
+‚Í‚ñ‚Ç‚¤‚½‚¢
+‚Í‚ñ‚Æ‚¤‚ß‚¢
+‚Í‚ñ‚Æ‚µ
+‚Í‚ñ‚Ç‚é
+‚΂ñ‚È‚ñ
+‚Í‚ñ‚É‚¿
+‚Í‚ñ‚É‚á
+‚Í‚ñ‚É‚ñ
+‚΂ñ‚É‚ñ
+‚Í‚ñ‚É‚ñ‚Ü‚¦
+‚Í‚ñ‚Ë
+‚΂ñ‚Ë‚ñ
+‚΂ñ‚Ì‚¤
+‚Í‚ñ‚Î
+‚Í‚ñ‚΂¢
+‚Í‚ñ‚΂¢‚©
+‚Í‚ñ‚΂¢‚ª‚©‚è
+‚Í‚ñ‚΂¢‚«
+‚Í‚ñ‚΂¢‚Ä‚ñ
+‚Í‚ñ‚΂¢‚Ô
+‚΂ñ‚Ï‚­
+‚΂ñ‚Ñ
+‚΂ñ‚Ô‚Â
+‚Ï‚ñ‚Ó‚ê‚Á‚Æ
+‚Í‚ñ‚Ô‚ñ
+‚Í‚ñ‚Ô‚ñ‚¶‚å‚­‚ê
+‚Í‚ñ‚ׂ¢
+‚Í‚ñ‚Ø‚ñ
+‚΂ñ‚Ý‚ñ
+‚Í‚ñ‚Þ
+‚Í‚ñ‚ß‚ñ
+‚Í‚ñ‚à‚Æ
+‚΂ñ‚䂤
+‚Í‚ñ‚悤
+‚Í‚ñ‚悤‚«
+‚΂ñ‚è
+‚Í‚ñ‚è‚å
+‚Í‚ñ‚é‚¢
+‚Í‚ñ‚ê‚¢
+‚Í‚ñ‚ë
+ƒq
+‚Ð
+‚Ð
+ƒr
+‚Ñ
+‚Ñ
+ƒs
+‚Ò
+‚Ђ ‚¢
+‚Ђ ‚µ
+‚Ђ ‚½‚è
+‚Ò‚ ‚Ì
+‚Ò‚ ‚Ì‚¹‚ñ
+‚Ђ¢
+‚Ñ[
+‚Ò[‚­
+‚Ò[‚±‚Á‚­
+‚Ñ‚¢‚µ‚«
+‚Ò[‚·
+‚Ð[‚½
+‚Ð[‚½[
+‚Ñ[‚¿
+‚Ò[‚È‚Á‚Â
+‚Ò[‚Õ‚é
+‚Ђ¢‚Ü‚²
+‚Ñ[‚Þ
+‚Ђ¢‚炬
+‚Ñ[‚é
+‚Ñ[‚é‚¢
+‚Ђ¢‚ê
+‚Ñ‚¤
+‚Ђ¤‚¿
+‚Ђ¤‚ñ
+‚Ђ¦
+‚Ñ‚¦‚ñ
+‚Ñ‚¨‚ñ
+‚Ђª
+‚Ђª‚¢
+‚Ђª‚¢‚µ‚á
+‚Ђ©‚¦
+‚Ђ©‚¦‚µ‚Â
+‚Ђ©‚¦‚ß
+‚Ђ©‚­
+‚Ñ‚ª‚­‚©
+‚Ђ©‚°
+‚Ђª‚¯
+‚Ђª‚³
+‚Ђª‚µ
+‚Ђª‚µ‚©‚º
+‚Ђª‚µ‚ª‚í
+‚Ђª‚µ‚µ‚È‚©‚¢
+‚Ђª‚µ‚Í‚ñ‚«‚イ
+‚Ђ©‚µ‚Ú‚¤
+‚Ђ©‚º‚¢
+‚Ђª‚½
+‚Ñ‚ª‚Á‚©
+‚Ђª‚ß
+‚Ђ©‚è
+‚Ђª‚í‚è
+‚Ђª‚ñ
+‚Ñ‚©‚ñ
+‚Ñ‚ª‚ñ
+‚Ђ«
+‚Ђ«‚ ‚¢
+‚Ђ«‚¤‚¯‚É‚ñ
+‚Ђ«‚©‚¦
+‚Ђ«‚©‚¦‚¯‚ñ
+‚Ђ«‚ª‚Ë
+‚Ђ«‚µ‚¨
+‚Ђ¬‚µ‚á
+‚Ђ«‚·‚¤
+‚Ђ«‚½‚Ä
+‚Ђ«‚¿‚á
+‚Ђ«‚Å‚à‚Ì
+‚Ђ«‚Ç
+‚Ђ«‚Æ‚è‚Ä
+‚Ђ«‚É‚­
+‚Ђ«‚Ó‚Ë
+‚Ђ«‚à‚Ì
+‚Ђ«‚á‚­
+‚Ђ«‚イ
+‚Ђ«‚傤
+‚Ђ¬‚傤
+‚Ђ«‚킽‚µ
+‚Ђ«‚ñ‚¼‚­
+‚Ñ‚­‚½[
+‚Ђ®‚炵
+‚Ђ®‚ê
+‚Ђ¯
+‚Ђ°
+‚Ђ¯‚¢
+‚Ñ‚¯‚¢
+‚Ђ¯‚Â
+‚Ђ¯‚ß
+‚Ђ²
+‚Ђ±‚¤
+‚Ђ²‚¤
+‚Ñ‚±‚¤
+‚Ђ±‚¤‚©‚¢
+‚Ђ±‚¤‚µ
+‚Ђ±‚¤‚µ‚«
+‚Ђ±‚¤‚¶‚傤
+‚Ñ‚±‚¤‚ç‚ñ
+‚Ђ²‚¤‚è
+‚Ђ±‚­
+‚Ђ±‚­‚É‚ñ
+‚Ђ²‚Æ
+‚Ђ²‚ë
+‚Ђ³
+‚Ђ´
+‚Ñ‚´
+‚Ђ³‚¢
+‚Ñ‚³‚¢
+‚Ђ³‚¢‚µ‚á
+‚Ђ³‚¢‚¿
+‚Ђ³‚­
+‚Ђ³‚µ
+‚Ђ´‚µ
+‚Ђ³‚µ‚Ô‚è
+‚Ђ´‚Âß
+‚Ђ³‚ß
+‚Ђ´‚à‚Æ
+‚Ђµ
+‚Ђ¶
+‚Ñ‚¶
+‚Ђ¶‚©‚¯
+‚Ђµ‚ª‚½
+‚Ñ‚¶‚Ë‚·
+‚Ђµ‚à‚¿
+‚Ђµ‚á‚­
+‚Ђµ‚Ⴝ‚¢
+‚Ñ‚µ‚á‚à‚ñ‚Ä‚ñ
+‚Ñ‚µ‚ã
+‚Ñ‚¶‚ã‚ ‚é
+‚Ђ¶‚イ
+‚Ñ‚µ‚イ
+‚Ђ¶‚ã‚Â
+‚Ñ‚¶‚ã‚Â
+‚Ñ‚¶‚ã‚‚©
+‚Ñ‚¶‚ã‚‚©‚ñ
+‚Ñ‚¶‚ã‚‚µ
+‚Ñ‚¶‚å
+‚Ђµ‚傤
+‚Ђ¶‚傤
+‚Ñ‚µ‚傤
+‚Ђ¶‚傤‚«‚ñ
+‚Ђ¶‚傤‚®‚¿
+‚Ђ¶‚傤‚¶
+‚Ђ¶‚傤‚¹‚ñ
+‚Ñ‚µ‚傤‚Ë‚ñ
+‚Ђµ‚å‚©
+‚Ђµ‚傪‚©‚è
+‚Ђµ‚å‚©‚ñ
+‚Ђµ‚債‚Â
+‚Ђµ‚å‚Ô
+‚Ђ¶‚è
+‚Ñ‚µ‚ñ
+‚Ñ‚¶‚ñ
+‚Ñ‚·
+‚Ђ·‚¢
+‚Ñ‚·‚¢
+‚Ђ·‚Æ‚è[
+‚Ñ‚¹‚¢
+‚Ñ‚¹‚¢‚Ô‚Â
+‚Ђº‚É
+‚Ñ‚º‚ñ‚â‚«
+‚Ђ»
+‚Ñ‚»‚¤
+‚Ђ¼‚­
+‚Ђ½‚¢
+‚Ђ¾‚¿
+‚Ђ¾‚Ü‚è
+‚Ñ‚½‚Ý‚ñ
+‚Ђ¾‚è
+‚Ђ¾‚è‚ ‚µ
+‚Ђ¾‚肤‚¦
+‚Ђ¾‚è‚«‚«
+‚Ђ¾‚肵‚½
+‚Ђ¾‚è‚Ä
+‚Ђ¾‚è‚Í‚µ
+‚Ђ¾‚è‚Ü‚¦
+‚Ђ¾‚è‚Þ‚«
+‚Ђ¾‚è‚ß
+‚Ñ‚¾‚ñ
+‚Ђ¿‚イ
+‚Ђ¿‚傤
+‚Ђ‚ ‚Â
+‚ЂÁ‚©
+‚ЂÁ‚©‚­
+‚Ђ‚¬
+‚Ñ‚Á‚®
+‚Ò‚Á‚­
+‚ЂÂ¯
+‚ЂÁ‚¯‚¢
+‚ЂÁ‚¯‚ñ
+‚ЂÁ‚±‚Ý
+‚ЂÁ‚³‚Â
+‚Ђ‚¶
+‚ЂÁ‚µ‚á
+‚Ђ‚¶‚ã
+‚ЂÁ‚µ‚イ
+‚Ђ‚¶‚ã‚Ђñ
+‚Ђ‚¶‚ã‚ñ
+‚ЂÁ‚µ‚傤
+‚ЂÁ‚¹‚¢
+‚ЂÁ‚¹‚«
+‚Ђ‚º‚Â
+‚Ђ‚º‚ñ
+‚ЂÁ‚¿
+‚Ò‚Á‚¿
+‚Ñ‚Á‚Æ
+‚ЂÁ‚Æ‚¤‚µ‚á
+‚Ђ‚ǂ­
+‚Ђ‚ɂ傤‚«
+‚ЂÁ‚Õ
+‚ЂÁ‚Û‚¤
+‚Ђ‚ڂ­
+‚ЂÂß
+‚Ђ‚悤
+‚Ђ‚悤‚ ‚­
+‚Ñ‚Å‚¨
+‚ЂĂÂ
+‚Ђłè
+‚Ђłñ
+‚Ñ‚Ä‚ñ
+‚Ђłñ‚©
+‚ЂÆ
+‚ЂÇ
+‚ЂƂ ‚½‚è
+‚ЂƂ ‚ß
+‚ЂƂ ‚í
+‚ЂƂ¢‚«
+‚Ñ‚Æ‚¤
+‚ЂƂ¦
+‚ЂƂª‚«
+‚ЂƂ©‚°
+‚ЂƂª‚ç
+‚ЂƂ¬‚«
+‚Ñ‚Æ‚­
+‚ЂƂ¯
+‚ЂƂ±‚¦
+‚ЂƂ±‚Æ
+‚ЂƂ²‚Æ
+‚ЂƂ²‚Ý
+‚ЂƂ³‚µ‚ä‚Ñ
+‚ЂƂ´‚Æ
+‚ЂƂ·‚¶
+‚ЂƂ½‚¿
+‚ЂƂÂ
+‚ЂƂÁ‚±
+‚ЂƂÂÄ
+‚ЂƂ‚ЂƂÂ
+‚ЂƂ‚Ô
+‚ЂƂÅ
+‚ЂƂƂ¨‚è
+‚ЂƂǂ¨‚è
+‚ЂƂƂ«
+‚ЂƂȂÝ
+‚ЂƂ͂¾
+‚ЂƂ΂ñ
+‚ЂƂÜ
+‚ЂƂ܂¦
+‚ЂƂ܂©‚¹
+‚ЂƂ܂­
+‚ЂƂÝ
+‚ЂƂނ©‚µ
+‚ЂƂß
+‚ЂƂè
+‚Ђǂè
+‚ЂƂ育‚Æ
+‚ЂƂè‚Ú‚Á‚¿
+‚ЂƂè‚à‚Ì
+‚ЂÈ
+‚ЂȂª
+‚ЂȂ½
+‚ЂȂ܂‚è
+‚Ñ‚È‚ñ
+‚Ñ‚É[‚é
+‚Ђɂ­
+‚Ђɂ¿
+‚Ђɂ傤‚«
+‚Ñ‚É‚ë‚ñ
+‚Ђɂñ
+‚Ђ˂Â
+‚Ñ‚Ë‚Â
+‚Ђ̂¢‚è
+‚Ђ̂¦
+‚Ђ̂«
+‚Ђ̂Å
+‚Ђ̂Æ
+‚Ђ̂܂é
+‚Ђ̂ß
+‚Ђ̂à‚Æ
+‚Ђ΂¢
+‚Ђ΂¢‚Ђñ
+‚Ђ΂È
+‚Ђ΂è
+‚Ђ΂ñ
+‚ЂÑ
+‚ЂЂ傤‚©
+‚тЂñ
+‚ЂÓ
+‚Ñ‚Ó‚¤
+‚Ђӂ©
+‚Ђӂ­
+‚ЂԂ»‚¤
+‚ЂԂñ
+‚Ñ‚Ó‚ñ
+‚Ñ‚Ô‚ñ
+‚Ñ‚Ú‚¤
+‚Ñ‚Ú‚¤‚ë‚­
+‚Ђق¯‚ñ‚µ‚á
+‚Ђڂµ
+‚ЂÜ
+‚Ђ܂­
+‚Ђ܂Â
+‚Ñ‚Ý
+‚Ђ݂Â
+‚Ђß
+‚Ђ߂¢
+‚Ñ‚ß‚¢
+‚Ђà
+‚Ð‚à‚­
+‚Ђà‚‚«
+‚Ђà‚Æ
+‚Ђà‚Ì
+‚Ђ₠‚¹
+‚ЂႭ
+‚Ђ₭
+‚ЂႭ‚¦‚ñ
+‚ЂႭ‚µ‚傤
+‚ЂႭ‚É‚¿
+‚ЂႭ‚Ô‚ñ
+‚ЂႭ‚Ô‚ñ‚è‚Â
+‚ЂႭ‚Ü‚ñ‚¿‚傤
+‚Ñ‚á‚­‚â
+‚Ђá‚Á‚©
+‚Ђá‚Á‚«‚₱‚¤
+‚Ђá‚Á‚ς‚ЂႭ
+‚Ђâ‚Æ‚¢
+‚Ђâ‚Þ‚¬
+‚Ђâ‚ß‚µ
+‚Ђä
+‚Ђã[‚¸
+‚Ñ‚ã[‚Ä‚¡[
+‚Ђã[‚Ü‚É‚·‚Æ
+‚Ђã[‚Ü‚É‚¸‚Þ
+‚Ђã[‚Ü‚ñ
+‚Ñ‚ã[‚ë
+‚Ђ傤
+‚Ђ悤
+‚т悤
+‚Ђ傤‚¢
+‚т傤‚¢‚ñ
+‚т悤‚¢‚ñ
+‚Ђ傤‚¨‚ñ
+‚Ђ傤‚©
+‚Ђ傤‚ª
+‚Ђ傤‚®
+‚т傤‚­
+‚Ђ傤‚¯‚¢
+‚Ђ傤‚°‚ñ
+‚т傤‚°‚ñ
+‚т傤‚°‚ñ‚«‚ñ
+‚т傤‚°‚ñ‚½‚¢
+‚т傤‚²
+‚Ђ傤‚±‚¤
+‚т傤‚±‚ñ
+‚Ђ傤‚³‚Â
+‚Ђ傤‚´‚ñ
+‚Ђ傤‚µ
+‚т悤‚µ
+‚Ђ傤‚¶‚«
+‚т傤‚µ‚Â
+‚Ђ傤‚¶‚ã‚ñ
+‚Ђ傤‚¶‚ã‚ñ‚²
+‚Ђ傤‚µ‚傤
+‚Ђ傤‚¶‚傤
+‚т傤‚µ‚傤
+‚Ђ傤‚µ‚傤‚¶‚å
+‚т傤‚µ‚ñ
+‚Ђ傤‚·‚¤
+‚т傤‚¹‚¢
+‚Ђ傤‚¹‚Â
+‚Ђ傤‚»‚¤
+‚т傤‚»‚¤
+‚Ђ傤‚¾‚¢
+‚Ђ傤‚½‚ñ
+‚Ђ傤‚Ä‚«
+‚Ђ傤‚Ä‚ñ
+‚Ђ傤‚Ä‚ñ‚©
+‚Ђ傤‚Ç
+‚т傤‚Æ‚¤
+‚т傤‚É‚ñ
+‚Ђ傤‚Ì‚¤
+‚Ђ傤‚΂ñ
+‚Ђ傤‚Ð
+‚т傤‚Ô
+‚т傤‚Ö‚«
+‚Ђ傤‚Ù‚ñ
+‚т傤‚ß‚¢
+‚Ђ傤‚ß‚ñ
+‚Ђ傤‚ß‚ñ‚¶‚傤
+‚Ђ傤‚ß‚ñ‚¹‚«
+‚Ђ傤‚à‚­
+‚Ђ傤‚æ‚Ý
+‚т傤‚æ‚Ý
+‚т傤‚è
+‚Ђ傤‚è‚傤
+‚т傤‚ê‚«
+‚Ђ傤‚ë‚ñ‚©
+‚Ђ悭
+‚Ñ‚æ‚­
+‚Ђ悯
+‚Ђæ‚è
+‚Ђæ‚è‚Ý
+‚Ñ‚ç
+‚Ђ炢‚«
+‚Ђ炢‚µ‚ñ
+‚Ђ炪‚È
+‚Ђ炫‚Ó‚¤
+‚Ђç‚Æ‚è
+‚Ò‚ç‚Ý‚Á‚Ç
+‚Ђç‚ß
+‚Ђç‚â
+‚҂肨‚Ç
+‚Ђ肫
+‚Ђè‚Â
+‚Ñ‚è‚イ
+‚Ñ‚è‚イ‚µ
+‚Ђè‚傤
+‚Ñ‚è‚傤
+‚Ђé
+‚Ñ‚é
+‚Ò‚é
+‚Ñ‚é‚Å‚¡‚ñ‚®
+‚Ђé‚Ë
+‚Ђé‚Ü
+‚Ñ‚é‚Ü
+‚Ђé‚Ü‚¦
+‚Ђé‚â‚·‚Ý
+‚Ђê
+‚Ñ‚ê‚Á‚¶
+‚Ђê‚ñ
+‚Ђ낢‚à‚Ì
+‚Ђ낢‚ñ
+‚Ђ낤‚¦‚ñ
+‚Ђ낭
+‚Ђë‚Î
+‚Ђë‚Ü
+‚Ђí
+‚Ñ‚í
+‚Ђí‚è
+‚Ђñ
+‚Ñ‚ñ
+‚Ò‚ñ
+‚Ђñ‚©‚­
+‚Ñ‚ñ‚ª‚½
+‚Ђñ‚«‚á‚­
+‚Ò‚ñ‚­
+‚Ђñ‚¯‚Â
+‚Ђñ‚±‚¤
+‚Ђñ‚±‚ñ
+‚Ђñ‚µ‚Â
+‚Ђñ‚¶‚á
+‚Ђñ‚µ‚ã
+‚Ñ‚ñ‚µ‚傤‚¹‚¢
+‚Ђñ‚¹‚¢
+‚Ñ‚ñ‚¹‚ñ
+‚Ò‚ñ‚¿
+‚Ђñ‚Ç
+‚Ò‚ñ‚Æ
+‚Ђñ‚Ì‚¤
+‚Ђñ‚΂ñ
+‚Ђñ‚Õ
+‚Ñ‚ñ‚Ú‚¤
+‚Ђñ‚Ý‚ñ
+‚Ђñ‚à‚­
+‚Ñ‚ñ‚ç‚ñ
+ƒt
+‚Ó
+‚Ó
+ƒu
+‚Ô
+‚Ô
+ƒv
+‚Õ
+‚Ó‚Ÿ[
+‚Ó‚Ÿ[‚·‚Æ
+‚Ó‚Ÿ[‚Þ
+‚Ô‚ ‚¢
+‚Ó‚Ÿ‚¢‚ 
+‚Ô‚ ‚¢‚¹‚¢
+‚Ó‚Ÿ‚¢‚Æ
+‚Ó‚Ÿ‚¢‚È‚é
+‚Ó‚Ÿ‚¢‚È‚ñ‚·
+‚Ó‚Ÿ‚¢‚Î
+‚Ó‚Ÿ‚¢‚Ô
+‚Ó‚Ÿ‚¢‚â[
+‚Ó‚Ÿ‚¢‚ñ
+‚Ó‚Ÿ‚­‚µ‚Ý‚è
+‚Ó‚Ÿ‚­‚½
+‚Ó‚Ÿ‚­‚Æ
+‚Ó‚Ÿ‚­‚Æ‚è
+‚Ó‚Ÿ‚±‚Þ
+‚Ó‚Ÿ‚Á‚µ‚å‚ñ
+‚Ó‚Ÿ‚Ý‚±‚ñ
+‚Ó‚Ÿ‚Ý‚è
+‚Ó‚Ÿ‚Ý‚è‚ 
+‚Ó‚Ÿ‚ñ
+‚Ó‚ ‚ñ
+‚Ó‚Ÿ‚ñ‚­‚µ‚å‚ñ
+‚Ó‚ ‚ñ‚Ä‚¢
+‚Ó‚Ÿ‚ñ‚Ç
+‚Ó‚ ‚ñ‚È‚¢
+‚Ó‚¢
+‚Ô‚¢
+‚Ó‚¡[‚Æ
+‚Ó‚¡[‚é‚Ç
+‚Ó‚¡‚­‚µ‚å‚ñ
+‚Ó‚¢‚²
+‚Ó‚¢‚Â
+‚Ó‚¡‚Á‚µ‚ã
+‚Ó‚¢‚Á‚¿
+‚Ó‚¡‚È[‚ê
+‚Ó‚¡‚æ‚é‚Ç
+‚Ó‚¡‚ç‚ß‚ñ‚Æ
+‚Ó‚¢‚è
+‚Ó‚¡‚邽
+‚Ó‚¡‚é‚Þ
+‚Ó‚¡‚ñ
+‚Ó‚¢‚ñ
+‚Ó‚¡‚ñ‚ª
+‚Ó‚¡‚ñ‚ª[
+‚Ó‚¤
+‚Ó‚¤‚ ‚¢
+‚Ó‚¤‚ ‚Â
+‚Ó‚¤‚¤
+‚Ó‚¤‚¤‚ñ
+‚Ó[‚ª
+‚Ó‚¤‚ª‚¢
+‚Ó‚¤‚©‚­
+‚Ó‚¤‚«
+‚Ó‚¤‚¯‚¢
+‚Ó‚¤‚°‚Â
+‚Ó‚¤‚±‚¤
+‚Ó‚¤‚µ
+‚Ó‚¤‚µ‚á
+‚Ó‚¤‚µ‚イ
+‚Ó‚¤‚µ‚å
+‚Ó‚¤‚µ‚ñ
+‚Ó‚¤‚¶‚ñ
+‚Ô[‚·
+‚Ó‚¤‚¹‚Â
+‚Ó‚¤‚¹‚ñ
+‚Ó‚¤‚º‚ñ
+‚Ó‚¤‚»‚¤
+‚Ó‚¤‚»‚­
+‚Ó‚¤‚¼‚­
+‚Ó‚¤‚½‚¢
+‚Ó‚¤‚¿‚傤
+‚Ó‚¤‚Ä‚¢
+‚Ó‚¤‚Ç
+‚Ó[‚Ç
+‚Ô[‚Æ
+‚Ó‚¤‚Æ‚¤
+‚Ó‚¤‚Ç‚¤
+‚Ó‚¤‚Ђ傤
+‚Ó‚¤‚Ó
+‚Ó‚¤‚Ô‚Â
+‚Ó‚¤‚Ԃ‚µ
+‚Ó‚¤‚Ú‚¤
+‚Ó‚¤‚Ý
+‚Ô[‚Þ
+‚Ó‚¤‚è‚イ
+‚Ó‚¤‚è‚å‚­
+‚Ó‚¤‚è‚ñ
+‚Ó‚¤‚낤
+‚Ó‚¤‚ñ
+‚Ô‚¤‚ñ
+‚Ó‚¦
+‚Ó‚¦‚¢
+‚Ó‚¥[‚·
+‚Ó‚¦‚«
+‚Ó‚¥‚ë[
+‚Ó‚§[
+‚Ó‚§[‚©‚·
+‚Ó‚§[‚­
+‚Ó‚§[‚ñ
+‚Ó‚§‚Æ
+‚Ó‚§‚肨
+‚Ó‚§‚邾[
+‚Ó‚§‚ñ
+‚Ó‚§‚ñ‚Æ
+‚Ó‚©
+‚Ó‚©‚¢
+‚Ô‚©‚¢
+‚Ô‚ª‚¢
+‚Ó‚©‚¢‚©‚ñ
+‚Ô‚ª‚¢‚µ‚á
+‚Ó‚©‚©‚¿
+‚Ó‚©‚­
+‚Ó‚©‚­‚¶‚Â
+‚Ó‚©‚±‚¤‚è‚å‚­
+‚Ó‚©‚µ‚ñ
+‚Ô‚©‚Á‚±‚¤
+‚Ó‚©‚Å
+‚Ó‚©‚Ì‚¤
+‚Ô‚©‚ñ
+‚Ó‚©‚ñ‚º‚ñ
+‚Ó‚«
+‚Ó‚¬
+‚Ô‚«
+‚Ô‚¬
+‚Ó‚«‚°‚ñ
+‚Ó‚«‚»
+‚Ó‚«‚Â
+‚Ó‚«‚Å‚à‚Ì
+‚Ó‚«‚Ê‚¯
+‚Ó‚«‚Ô‚è
+‚Ó‚«‚イ
+‚Ó‚«‚イ‚«
+‚Ó‚«‚イ‚΂ñ
+‚Ó‚«‚傤
+‚Ô‚«‚å‚­
+‚Ó‚¬‚è
+‚Ó‚«‚ñ
+‚Ó‚«‚ñ‚±‚¤
+‚Ó‚«‚ñ‚µ‚ñ
+‚Ó‚­
+‚Ó‚®‚ ‚¢
+‚Ó‚­‚ ‚ñ
+‚Ó‚­‚¢‚ñ
+‚Ó‚­‚©‚¢‚¿‚傤
+‚Ó‚­‚©‚ñ
+‚Ó‚­‚ª‚ñ
+‚Ó‚­‚¬‚¿‚傤
+‚Ó‚­‚²‚¤‚²
+‚Ó‚­‚´‚Â
+‚Ó‚­‚³‚悤
+‚Ó‚­‚³‚ñ‚¶
+‚Ó‚­‚³‚ñ‚Ô‚Â
+‚Ó‚­‚µ
+‚Ó‚­‚¶
+‚Ó‚­‚µ‚á‚«
+‚Ó‚­‚µ‚á‚¿‚傤
+‚Ó‚­‚µ‚ã
+‚Ó‚­‚¶‚ã
+‚Ó‚­‚µ‚イ‚ɂイ
+‚Ó‚­‚µ‚ザ
+‚Ó‚­‚µ‚サ‚傤
+‚Ó‚­‚µ‚傤
+‚Ó‚­‚µ‚å‚­
+‚Ó‚­‚µ‚ñ
+‚Ó‚­‚¶‚ñ
+‚Ó‚­‚·‚¤
+‚Ó‚­‚¹‚ñ
+‚Ó‚­‚»‚¤
+‚Ó‚­‚»‚·‚¤
+‚Ó‚­‚¾‚¢
+‚Ó‚®‚½‚¢‚Ä‚ñ
+‚Ó‚­‚¿‚傤
+‚Ó‚­‚Â
+‚Ó‚­‚‚¤
+‚Ó‚­‚Æ‚µ‚ñ
+‚Ó‚­‚Ñ‚«
+‚Ó‚­‚Ô‚¿‚傤
+‚Ó‚­‚Ô‚ñ
+‚Ó‚­‚Ö‚¢
+‚Ó‚­‚Ö‚«
+‚Ó‚­‚Ù‚ñ
+‚Ó‚­‚Ü‚­
+‚Ó‚­‚Ü‚Å‚ñ
+‚Ó‚­‚悤
+‚Ó‚­‚è
+‚Ó‚­‚肶
+‚Ó‚­‚è‚Ù‚¤
+‚Ó‚­‚è‚イ
+‚Ó‚­‚ë
+‚Ó‚­‚ë‚Æ‚¶
+‚Ó‚­‚ñ
+‚Ó‚¯
+‚Ô‚¯
+‚Ó‚¯‚¢
+‚Ô‚°‚¢
+‚Ó‚¯‚¢‚©‚¢
+‚Ó‚¯‚Â
+‚Ó‚¯‚ñ
+‚Ó‚°‚ñ
+‚Ô‚°‚ñ
+‚Ó‚¯‚ñ‚±‚¤
+‚Ó‚°‚ñ‚¶‚Á‚±‚¤
+‚Ó‚±‚¤
+‚Ó‚²‚¤‚©‚­
+‚Ó‚±‚¤‚Ö‚¢
+‚Ó‚²‚¤‚è
+‚Ó‚±‚­
+‚Ó‚³
+‚Ô‚´
+‚Ó‚³‚¢
+‚Ô‚´‚¢
+‚Õ‚³‚¢
+‚Ó‚³‚¢‚悤
+‚Ó‚³‚­
+‚Ó‚³‚ñ‚©
+‚Ó‚µ
+‚Ó‚¶
+‚Ô‚¶
+‚Ó‚µ‚ ‚È
+‚Ó‚µ‚ ‚킹
+‚Ó‚µ‚«
+‚Ó‚µ‚¬
+‚Ó‚µ‚º‚ñ
+‚Ó‚¶‚¾‚È
+‚Ô‚¶‚¿‚傤
+‚Ó‚¶‚Â
+‚Ô‚µ‚Â
+‚Ô‚µ‚‚¯
+‚Ó‚µ‚Ô‚µ
+‚Ó‚µ‚Ü‚Â
+‚Ó‚¶‚Ý
+‚Ó‚µ‚ã
+‚Ô‚µ‚ã
+‚Ó‚¶‚䂤
+‚Ô‚µ‚イ‚¬
+‚Ó‚µ‚ã‚Â
+‚Ô‚¶‚ã‚Â
+‚Ó‚¶‚ã‚ñ
+‚Ó‚¶‚å
+‚Ô‚µ‚å
+‚Ó‚µ‚傤
+‚Ô‚µ‚傤
+‚Ó‚µ‚傤‚¶
+‚Ó‚µ‚傤‚µ‚á
+‚Ó‚µ‚傤‚¿
+‚Ó‚¶‚傤‚è
+‚Ó‚¶‚債
+‚Ó‚µ‚ñ
+‚Ó‚¶‚ñ
+‚Ô‚¶‚ñ
+‚Ó‚¶‚ñ‚©
+‚Ó‚µ‚ñ‚©‚ñ
+‚Ó‚µ‚ñ‚É‚ñ
+‚Ó‚µ‚ñ‚É‚ñ‚ ‚ñ
+‚Ó‚¸
+‚Ó‚¸‚¢
+‚Ô‚·‚¢
+‚Ó‚·‚¤
+‚Ô‚·‚¤
+‚Ó‚¹
+‚Ó‚¹‚¢
+‚Ó‚º‚¢
+‚Ô‚º‚¢
+‚Ó‚¹‚¢‚±‚¤‚¢
+‚Ó‚¹‚¢‚µ‚ã‚Â
+‚Ó‚¹‚¢‚è‚Â
+‚Ó‚¹‚Á‚¹‚¢
+‚Ó‚¹‚ñ
+‚Ó‚º‚ñ
+‚Ó‚¹‚ñ‚ß‚¢
+‚Ó‚»
+‚Ó‚»‚¤‚¨‚¤
+‚Ó‚»‚­
+‚Ó‚¼‚­‚²
+‚Ó‚»‚­‚Ó‚è
+‚Ó‚¼‚ë‚¢
+‚Ó‚»‚ñ
+‚Ó‚½
+‚Ó‚¾
+‚Ô‚½
+‚Ô‚½‚¢
+‚Ó‚½‚¢‚Ä‚ñ
+‚Ó‚½‚¦
+‚Ó‚½‚²
+‚Ó‚¾‚µ‚å
+‚Ó‚½‚Â
+‚Ô‚½‚É‚­
+‚Ó‚½‚Î
+‚Ó‚½‚Ü
+‚Ó‚½‚Ü‚½
+‚Ó‚½‚è
+‚Ó‚¾‚ñ
+‚Ô‚½‚ñ
+‚Ó‚¾‚ñ‚¬
+‚Ô‚¿
+‚Ó‚¿‚á‚­
+‚Ó‚¿‚イ
+‚Ó‚¿‚イ‚¢
+‚Ó‚¿‚傤
+‚Ô‚¿‚傤
+‚Ô‚¿‚傤‚Ù‚¤
+‚Ó‚Â
+‚Ô‚Â
+‚ӂ‚¤
+‚ӂ‚¤‚©
+‚ӂ‚¤‚µ‚á
+‚ӂ‚¤‚æ‚«‚ñ
+‚ӂ‚©
+‚Ԃ‚ª
+‚Ó‚Á‚©‚­
+‚Ô‚Á‚©‚­
+‚ӂ‚©‚æ‚¢
+‚ӂ«
+‚Ԃ‚¬
+‚ӂ‚¬‚傤
+‚Ó‚Á‚«‚ñ
+‚Ó‚Á‚­
+‚Ô‚Á‚­
+‚Ԃ‚®‚â
+‚Ô‚Á‚¯‚ñ
+‚ӂ‚²
+‚Ô‚Á‚±
+‚Ô‚Á‚³‚ñ
+‚Ô‚Á‚µ
+‚Ԃ‚¶
+‚Ô‚Á‚µ‚«
+‚Ô‚Á‚µ‚Â
+‚Õ‚Á‚µ‚ã
+‚Õ‚Á‚µ‚ã‚Ù‚ñ
+‚Ԃ‚¶‚傤
+‚Ô‚Á‚µ‚ñ
+‚Ô‚Á‚¹‚¢
+‚Ԃ‚º‚ñ
+‚Ó‚Á‚»
+‚Ԃ‚¼‚¤
+‚Ô‚Á‚½‚¢
+‚Ó‚Á‚Ä‚ñ
+‚Ó‚Á‚Æ
+‚Õ‚Á‚Æ
+‚Ô‚Á‚Æ‚¤
+‚Ô‚Á‚Ò‚ñ
+‚Ô‚Á‚Ò‚ñ‚º‚¢
+‚ӂ‚Ԃñ
+‚Ô‚Á‚Û‚¤
+‚Ԃ‚Ü
+‚ԂÂÝ
+‚Ԃ‚߂Â
+‚Ԃ‚à‚ñ
+‚Ԃ‚悭
+‚Ԃ‚è
+‚Ԃ‚肩
+‚Ԃ‚肪‚­
+‚Ԃ‚è‚イ
+‚Ԃ‚è‚傤
+‚Ó‚Å
+‚Ó‚Ä‚¢
+‚Ó‚Ä‚«
+‚Ó‚Ä‚«‚Æ‚¤
+‚Ó‚Ä‚¬‚í
+‚Ó‚Ä‚Á‚Ä‚¢
+‚ӂł΂±
+‚Ó‚Å‚Ô‚µ‚傤
+‚Ó‚Æ‚¤
+‚Ó‚Ç‚¤
+‚Ô‚Ç‚¤‚©‚ñ
+‚Ó‚Æ‚¤‚±‚¤
+‚Ó‚Æ‚¤‚²‚¤
+‚Ó‚Ç‚¤‚³‚ñ
+‚Ó‚Æ‚¤‚µ‚«
+‚Ô‚Ç‚¤‚µ‚ã
+‚Ó‚Ç‚¤‚½‚¢
+‚Ó‚Ç‚¤‚Ђ傤
+‚Ó‚Æ‚¤‚Ó‚­‚Â
+‚Ó‚Æ‚¤‚ß‚¢
+‚Ó‚Ç‚«
+‚Ó‚Æ‚­
+‚Ó‚Æ‚­‚¢
+‚Ó‚Æ‚­‚Ä‚¢
+‚Ó‚Æ‚±‚ë
+‚Ó‚Æ‚¶
+‚Ó‚Æ‚Ç‚«
+‚Ô‚Ç‚Ü‚è
+‚Ó‚Æ‚ß
+‚Ó‚Æ‚à‚à
+‚Ó‚Æ‚ñ
+‚Ô‚È
+‚Ó‚È‚ ‚µ
+‚Ó‚È‚¢
+‚Ô‚È‚¢
+‚Ó‚È‚ª‚½
+‚Ó‚È‚®
+‚Ó‚È‚¶
+‚Ó‚È‚½‚Ñ
+‚Ó‚È‚É
+‚Ó‚È‚Ì‚è
+‚Ó‚È‚Î
+‚Ó‚È‚Ñ‚ñ
+‚ӂȂׂè
+‚Ó‚È‚â‚Ç
+‚Ó‚É‚å‚¢
+‚Ó‚É‚ñ
+‚Ó‚É‚ñ‚«
+‚Ó‚É‚ñ‚µ‚傤
+‚Ó‚É‚ñ‚¶‚傤
+‚Ó‚Ë
+‚ӂ˂Ђ«
+‚Ó‚Ë‚ñ‚¹‚¢
+‚Ó‚Ì‚¤
+‚Ó‚Ì‚è
+‚Ó‚Í‚¢
+‚ӂ΂¢
+‚Ó‚Í‚­
+‚Ó‚Í‚Â
+‚Ó‚Ñ
+‚Ô‚Ñ‚«
+‚ӂЂ‚悤
+‚ӂЂ傤
+‚ӂт傤‚Ç‚¤
+‚Ó‚Ñ‚ñ
+‚ԂЂñ
+‚Ó‚Ó‚­
+‚Ô‚Ô‚ñ
+‚Ó‚Ô‚ñ‚è‚Â
+‚Ó‚Ö‚¢
+‚Ó‚Ö‚ñ
+‚ӂׂñ
+‚Ó‚Ú
+‚Ó‚Ù‚ñ‚¢
+‚Ó‚Ü‚ñ
+‚Ó‚Ü‚ñ‚¼‚­
+‚Ó‚Ý
+‚Ó‚Ý‚¢‚½
+‚Ó‚Ý‚«‚è
+‚Ó‚Ý‚¾‚¢
+‚ӂ݂«
+‚Ó‚Ý‚ñ
+‚Ó‚Ý‚ñ‚µ‚傤
+‚Ó‚Þ‚«
+‚Ó‚ß‚¢
+‚Ó‚ß‚¢‚©‚­
+‚Ó‚ß‚¢‚æ
+‚Ó‚ß‚¢‚낤
+‚Ó‚ß‚Â
+‚Ó‚ß‚ñ
+‚Ô‚ß‚ñ
+‚Ó‚à‚¤
+‚Ó‚à‚Æ
+‚Ó‚à‚ñ
+‚Ô‚à‚ñ‚ׂÂ
+‚ӂ₶‚傤
+‚Ó‚ä
+‚ӂ䂤
+‚Ԃ䂤
+‚Ó‚ã[‚¿‚á
+‚Ó‚ä‚©‚¢
+‚ӂ䂬
+‚Ó‚ä‚«‚Æ‚Ç‚«
+‚ӂ䂼‚ç
+‚Ó‚ä‚Î
+‚Ó‚ä‚Ñ
+‚Ó‚ä‚à‚Ì
+‚Ó‚ä‚â‚·‚Ý
+‚ӂ悤
+‚Ԃ悤
+‚ӂ悤‚¢
+‚ӂ悤‚©‚¼‚­
+‚ӂ悤‚¶‚傤
+‚Ԃ悤‚¶‚ñ
+‚ӂ悤‚Ç
+‚Ô‚ç‚¢
+‚Õ‚ç‚¢‚¨‚è‚Ä‚¡
+‚Õ‚ç‚¢‚·
+‚Õ‚ç‚¢‚Ç
+‚Õ‚ç‚¢‚΂µ
+‚Õ‚ç‚¢‚×[‚Æ
+‚Õ‚ç‚¢‚Ü‚è
+‚Ô‚ç‚¢‚ñ‚Ç
+‚Ԃ炤‚·
+‚Ԃ炤‚ñ
+‚Ԃ炤‚ñ‚©‚ñ
+‚Ó‚ç‚®
+‚Ô‚ç‚­
+‚Õ‚ç‚®
+‚Õ‚ç‚·‚¿‚Á‚­
+‚Ղ炸‚Ü
+‚Ó‚ç‚¿
+‚Õ‚ç‚¿‚È
+‚Ô‚ç‚Á‚­
+‚Ó‚ç‚Á‚Æ
+‚Õ‚ç‚Æ‚É‚Á‚­
+‚Ó‚ç‚ñ
+‚Õ‚ç‚ñ
+‚Ó‚ç‚ñ‚­
+‚Ô‚ç‚ñ‚­
+‚Ó‚ç‚ñ‚·‚²
+‚Ô‚ç‚ñ‚¿
+‚Ô‚ç‚ñ‚Ç
+‚Õ‚ç‚ñ‚È[
+‚Ó‚è
+‚Ô‚è
+‚Õ‚è
+‚Ó‚è[
+‚Ó‚è[‚´
+‚ӂ肦‚«
+‚Ó‚è‚©‚½
+‚Ô‚è‚«
+‚ӂ肱
+‚ӂ肱‚Ý‚³‚«
+‚Ղ肸‚Þ
+‚Ó‚è‚»‚Å
+‚ӂ肾‚µ
+‚ӂ肾‚µ‚Ñ
+‚Ó‚è‚Â
+‚Ô‚è‚Á‚¶
+‚Õ‚è‚Ü
+‚Õ‚è‚Ý‚Ä‚¡‚Ô
+‚Ó‚è‚å
+‚Ó‚è‚傤
+‚Ó‚è‚傤‚¯‚ñ
+‚Ó‚è‚å‚­
+‚Ô‚è‚å‚­
+‚Ó‚è‚ñ
+‚Õ‚è‚ñ
+‚Õ‚è‚ñ‚·
+‚Õ‚è‚ñ‚¹‚·
+‚Ó‚é
+‚Ô‚é‚¢
+‚Ô‚é[
+‚Ó‚é[‚Â
+‚Ó‚é[‚Æ
+‚Ó‚é‚©‚Ô
+‚ӂ邬
+‚ӂ邳‚Æ
+‚Ԃ邶‚å‚í
+‚Ó‚é‚·
+‚Ó‚é‚Ä
+‚Ó‚é‚Å‚ç
+‚Ó‚é‚Ç‚¤‚®
+‚Ô‚é‚Ç[‚´
+‚Ó‚é‚â
+‚Õ‚ê
+‚Ó‚ê‚ ‚¢
+‚Ô‚ê‚¢
+‚Ô‚ê[‚©
+‚Ô‚ê[‚«
+‚Ó‚ê[‚¸
+‚Ó‚ê[‚Þ
+‚Ô‚ê[‚ñ
+‚Õ‚ê[‚ñ
+‚Ó‚ê‚«‚µ‚Ô‚é
+‚Õ‚ê‚Í‚Ô
+‚Õ‚ê‚Ý‚ ‚Þ
+‚Ó‚ê‚ñ‚¼‚­‚¹‚ñ
+‚Ó‚ê‚ñ‚Ç
+‚Ó‚ë
+‚Õ‚ë
+‚Ó‚ë‚ 
+‚ӂ낤
+‚ӂ낤‚µ‚á
+‚Ó‚ë[
+‚Ó‚ë[‚Æ
+‚Õ‚ë‚«‚イ
+‚Ó‚ë‚­
+‚Õ‚ë‚®‚ç‚Ü
+‚Õ‚ë‚®‚ç‚Ý‚ñ‚®
+‚Ղ낶‚¥‚­‚Æ
+‚ӂ낵‚«
+‚Ղ낹‚Á‚³
+‚Ղ낾‚­‚µ‚å‚ñ
+‚Ղ낾‚­‚Æ
+‚Ô‚ë‚Á‚­
+‚Õ‚ë‚Á‚½
+‚Ó‚ë‚Á‚Ò
+‚Õ‚ë‚Ä‚­‚µ‚å‚ñ
+‚Õ‚ë‚Æ‚±‚é
+‚Õ‚ë‚Ï‚ñ
+‚Õ‚ë‚Ò‚ê‚ñ
+‚Õ‚ë‚Ó‚¡[‚é
+‚Õ‚ë‚Ó‚¥‚Á‚µ‚å‚È
+‚Õ‚ë‚Ø‚ç
+‚Õ‚ë‚Ý‚·
+‚Ó‚ë‚â
+‚Õ‚ë‚â‚«‚イ
+‚Ó‚ë‚ñ‚Ä‚¡‚ 
+‚Ó‚ë‚ñ‚Æ
+‚Õ‚ë‚ñ‚Õ‚Æ
+‚Ó‚í
+‚Ó‚í‚­
+‚Ó‚ñ
+‚Ô‚ñ
+‚Ô‚ñ‚ ‚Â
+‚Ô‚ñ‚ ‚ñ
+‚Ô‚ñ‚¢
+‚Ó‚ñ‚¢‚«
+‚Ó‚ñ‚¦‚ñ
+‚Ô‚ñ‚©‚¢
+‚Ô‚ñ‚©‚¢‚Ì‚¤
+‚Ô‚ñ‚©‚©‚¢
+‚Ô‚ñ‚ª‚­
+‚Ô‚ñ‚ª‚­‚©
+‚Ô‚ñ‚ª‚­‚µ‚á
+‚Ô‚ñ‚ª‚­‚Ô
+‚Ô‚ñ‚©‚³‚¢
+‚Ô‚ñ‚©‚´‚¢
+‚Ô‚ñ‚©‚µ
+‚Ô‚ñ‚©‚¶‚ñ
+‚Ô‚ñ‚©‚¿‚傤
+‚Ô‚ñ‚ª‚Á‚©
+‚Ô‚ñ‚©‚‚΂炢
+‚Ô‚ñ‚«‚Ä‚ñ
+‚Ô‚ñ‚«‚傤
+‚Ô‚ñ‚«‚傤‚¶‚傤
+‚Ó‚ñ‚¬‚è
+‚Ô‚ñ‚®
+‚Ô‚ñ‚®‚Ä‚ñ
+‚Ô‚ñ‚¯‚¢
+‚Ô‚ñ‚°‚¢‚©
+‚Ô‚ñ‚¯‚ñ
+‚Ô‚ñ‚±
+‚Ô‚ñ‚²
+‚Ô‚ñ‚±‚¤
+‚Ô‚ñ‚²‚¤
+‚Ô‚ñ‚²‚½‚¢
+‚Ô‚ñ‚³‚¢
+‚Ô‚ñ‚´‚¢
+‚Ô‚ñ‚µ
+‚Ô‚ñ‚µ‚µ‚«
+‚Ô‚ñ‚µ‚Â
+‚Ô‚ñ‚µ‚á
+‚Ô‚ñ‚µ‚イ
+‚Ô‚ñ‚µ‚傤
+‚Ô‚ñ‚¶‚傤
+‚Ô‚ñ‚¶‚傤‚¿
+‚Ô‚ñ‚µ‚å‚©
+‚Ô‚ñ‚µ‚傪‚©‚è
+‚Ô‚ñ‚µ‚債‚Â
+‚Ô‚ñ‚µ‚å‚Ô
+‚Ó‚ñ‚¶‚ñ
+‚Ô‚ñ‚µ‚ñ
+‚Ô‚ñ‚¶‚ñ
+‚Ó‚ñ‚·‚¢
+‚Ô‚ñ‚·‚¤
+‚Ô‚ñ‚¹‚«
+‚Ô‚ñ‚¹‚«‚«
+‚Ó‚ñ‚»‚­
+‚Ó‚ñ‚½‚¢
+‚Ô‚ñ‚½‚¢
+‚Ó‚ñ‚½‚ñ
+‚Ô‚ñ‚¾‚ñ
+‚Ô‚ñ‚¿‚イ
+‚Ô‚ñ‚¿‚傤
+‚Ô‚ñ‚Ä‚ñ
+‚Ó‚ñ‚Ç‚¤
+‚Ô‚ñ‚Æ‚¤
+‚Ô‚ñ‚Ç‚«
+‚Ó‚ñ‚ɂイ
+‚Ó‚ñ‚ɂ傤
+‚Ó‚ñ‚Ê
+‚Ô‚ñ‚Ï‚¢‚è‚Â
+‚Ó‚ñ‚Ï‚ñ
+‚Ô‚ñ‚Ò‚Â
+‚Ô‚ñ‚҂‚ԂÂ
+‚Ô‚ñ‚Ò‚Ô‚Â
+‚Ô‚ñ‚Ô
+‚Ô‚ñ‚Õ‚¸
+‚Ô‚ñ‚Û‚¤
+‚Ô‚ñ‚Ú‚¤‚®
+‚Ó‚ñ‚Ü‚Â
+‚Ô‚ñ‚Ü‚Â
+‚Ó‚ñ‚Ü‚ñ
+‚Ô‚ñ‚Ý‚á‚­
+‚Ó‚ñ‚Þ‚«
+‚Ô‚ñ‚ß‚ñ
+‚Ô‚ñ‚â
+‚Ô‚ñ‚ç‚­
+‚Ô‚ñ‚è
+‚Ô‚ñ‚è‚«
+‚Ô‚ñ‚è‚á‚­
+‚Ó‚ñ‚è‚イ
+‚Ô‚ñ‚è‚å‚­
+‚Ô‚ñ‚ê‚¢
+ƒw
+‚Ö
+‚Ö
+ƒx
+‚×
+ƒy
+‚Ø
+‚Ö‚ 
+‚ׂ 
+‚Ø‚ 
+‚ׂ ‚è‚ñ‚®
+‚ׂ¢
+‚Ö‚¢‚ ‚ñ
+‚Ö‚¢‚¢
+‚ׂ¢‚¦‚¢
+‚Ö‚¢‚¦‚«
+‚Ö‚¢‚¨‚ñ
+‚Ö‚¢‚©
+‚Ö‚¢‚ª‚¢
+‚Ö‚¢‚©‚¢‚µ‚«
+‚Ö‚¢‚©‚Â
+‚Ö‚¢‚«
+‚Ö‚¢‚«‚ñ‚¿
+‚Ö‚¢‚«‚ñ‚Ä‚ñ
+‚Ö‚¢‚¯
+‚ׂ¢‚²
+‚Ö‚¢‚±‚¤
+‚Ö‚¢‚±‚¤‚º‚¢
+‚Ö‚¢‚±‚¤‚¹‚ñ
+‚ׂ¢‚±‚­
+‚Ö‚¢‚³‚­
+‚ׂ¢‚³‚­
+‚Ö‚¢‚µ
+‚Ö‚¢‚¶
+‚ׂ¢‚µ
+‚Ö‚¢‚¶‚Â
+‚Ö‚¢‚µ‚á
+‚ׂ¢‚¶‚ã
+‚Ö‚¢‚¶‚ã‚ñ
+‚Ö‚¢‚¶‚傤
+‚ׂ¢‚µ‚å‚­
+‚Ö‚¢‚µ‚ñ
+‚ׂ¢‚µ‚ñ
+‚Ö‚¢‚¹‚¢
+‚Ö‚¢‚º‚¢
+‚Ö‚¢‚»
+‚Ö‚¢‚½‚¢
+‚Ö‚¢‚½‚ñ
+‚Ö‚¢‚¿
+‚ׂ¢‚¿‚イ
+‚Ö‚¢‚Ä‚ñ
+‚Ö‚¢‚Æ
+‚Ö‚¢‚Ë‚Â
+‚Ö‚¢‚Ë‚ñ‚È‚Ý
+‚ׂ¢‚΂­
+‚Ö‚¢‚Í‚ñ
+‚Ö‚¢‚΂ñ
+‚Ö‚¢‚Ó‚¤
+‚Ö‚¢‚Ó‚­
+‚Ö‚¢‚Ô‚ñ
+‚Ö‚¢‚Ù‚¤
+‚Ö‚¢‚Ù‚¤‚±‚ñ
+‚Ö‚¢‚Ú‚ñ
+‚Ö‚¢‚Ý‚á‚­
+‚Ö‚¢‚Ý‚ñ
+‚Ö‚¢‚ß‚ñ
+‚Ö‚¢‚ß‚ñ‚¸
+‚Ö‚¢‚è‚å‚­
+‚Ö‚¢‚ë
+‚Ö‚¢‚í
+‚Ö‚¢‚킵‚ガ
+‚Ø‚¢‚ñ‚Æ
+‚×[‚±‚ñ
+‚Ø[‚¶
+‚×[‚µ‚Á‚­
+‚×[‚¶‚ã
+‚×[‚·
+‚Ø[‚·
+‚×[‚½
+‚×[‚½‚¹‚ñ
+‚Ø[‚Ï[
+‚Ö‚«‚ª
+‚Ö‚«‚©‚¢
+‚Ö‚«‚»‚ñ
+‚Ö‚«‚¿
+‚Ö‚«‚Æ‚¤
+‚Ö‚«‚ß‚ñ
+‚ׂ­‚½
+‚Ö‚³‚«
+‚Ø‚µ‚Ý‚·‚Æ
+‚ׂ·‚Æ
+‚ׂ·‚Æ‚¹‚ç[
+‚Ö‚½
+‚ׂ½
+‚ׂ½[
+‚ׂ‚¢‚ñ
+‚ׂÁ‚©‚­
+‚ׂÁ‚©‚ñ
+‚ׂ‚¬
+‚ׂ‚­‚¿
+‚ׂÁ‚¯‚¢
+‚ׂÁ‚¯‚ñ
+‚ׂÁ‚±‚¤
+‚ׂÁ‚³‚Â
+‚ׂÁ‚µ
+‚ׂ‚¶
+‚ׂÁ‚µ‚Â
+‚ׂÁ‚µ‚ã
+‚ׂÁ‚µ‚å
+‚ׂ‚¶‚傤
+‚ׂ‚¶‚ñ
+‚ׂÁ‚¹‚¢
+‚ׂÁ‚¹‚©‚¢
+‚ׂÁ‚»‚¤
+‚Ö‚Á‚¾
+‚Ö‚Á‚¾[
+‚ׂÁ‚Ä‚¢
+‚Ö‚Á‚Ç
+‚ׂÁ‚Æ
+‚ׂÁ‚Ç
+‚Ø‚Á‚Æ
+‚ׂÁ‚Ç‚·‚¤
+‚ׂÁ‚҂傤
+‚ׂ‚ׂÂ
+‚ׂÁ‚Û‚¤
+‚ׂ‚ނË
+‚ׂ‚߂¢
+‚ׂ‚à‚Ì
+‚ׂ‚è
+‚ׂĂç‚ñ
+‚Ø‚È‚é‚Ä‚¡[
+‚ׂÉ
+‚ׂɂ 
+‚ׂɂ΂È
+‚ׂɂâ
+‚ׂɂ₢‚½
+‚Ö‚Ñ
+‚ׂÑ[
+‚Ö‚Ú‚ñ
+‚Ö‚â
+‚Ö‚ç
+‚Ö‚è
+‚Ö‚è‚©‚é
+‚ւ肱‚Õ‚½
+‚Ø‚é[
+‚ׂ邬[
+‚ւ邵[
+‚Ö‚é‚Â
+‚Ö‚é‚Ç
+‚ׂé‚Æ
+‚Ö‚é‚Õ
+‚Ö‚ñ
+‚ׂñ
+‚Ø‚ñ
+‚Ö‚ñ‚ ‚‚«
+‚ׂñ‚¢
+‚Ö‚ñ‚¤‚ñ
+‚ׂñ‚¦‚«
+‚ׂñ‚«
+‚ׂñ‚¬
+‚Ø‚ñ‚«
+‚Ö‚ñ‚«‚傤
+‚ׂñ‚«‚傤‚©
+‚Ö‚ñ‚«‚å‚­‚©
+‚Ö‚ñ‚­‚Â
+‚Ö‚ñ‚¯‚ñ
+‚Ö‚ñ‚°‚ñ
+‚Ö‚ñ‚±‚¤
+‚ׂñ‚²‚µ
+‚ׂñ‚²‚É‚ñ
+‚Ö‚ñ‚³
+‚ׂñ‚³‚¢
+‚Ö‚ñ‚³‚¿
+‚Ö‚ñ‚¶
+‚ׂñ‚µ
+‚Ö‚ñ‚µ‚‚µ‚á
+‚Ö‚ñ‚µ‚á
+‚Ö‚ñ‚¶‚á
+‚Ö‚ñ‚µ‚ã
+‚Ö‚ñ‚µ‚イ‚©
+‚Ö‚ñ‚µ‚イ‚ª‚©‚è
+‚Ö‚ñ‚µ‚イ‚«‚å‚­
+‚Ö‚ñ‚µ‚イ‚µ‚Â
+‚Ö‚ñ‚µ‚イ‚µ‚á
+‚Ö‚ñ‚µ‚イ‚¿‚傤
+‚Ö‚ñ‚µ‚イ‚Ô
+‚ׂñ‚¶‚å
+‚ׂñ‚µ‚傤‚Ù‚¤
+‚Ø‚ñ‚µ‚å‚ñ
+‚Ø‚ñ‚µ‚é
+‚Ö‚ñ‚¶‚ñ
+‚Ö‚ñ‚·‚¤
+‚Ö‚ñ‚¹‚¢
+‚ׂñ‚º‚Â
+‚Ö‚ñ‚»‚­
+‚ׂñ‚¾[
+‚Ö‚ñ‚½‚¢
+‚Ö‚ñ‚¿
+‚ׂñ‚¿
+‚ׂñ‚¿‚á[
+‚ׂñ‚Â
+‚Ö‚ñ‚Ä‚Â
+‚ׂñ‚Ä‚ñ
+‚Ö‚ñ‚Å‚ñ‚µ‚å
+‚ׂñ‚Æ‚¤
+‚Ö‚ñ‚Ç‚¤‚Ð
+‚Ö‚ñ‚Ç‚¤‚è‚Â
+‚Ö‚ñ‚Ò
+‚Ö‚ñ‚Ò‚ñ‚è‚Â
+‚ׂñ‚Û‚¤
+‚ׂñ‚Ü‚­
+‚ׂñ‚Þ‚©‚ñ
+‚ׂñ‚ç‚ñ
+‚ׂñ‚è
+‚ׂñ‚è‚â
+‚Ö‚ñ‚è‚ñ
+‚Ö‚ñ‚ë
+ƒz
+‚Ù
+‚Ù
+ƒ{
+‚Ú
+‚Ú
+ƒ|
+‚Û
+‚Ù‚ ‚ñ
+‚Ù‚ ‚ñ‚«
+‚Ù‚¢
+‚Ù‚¢‚­‚¦‚ñ
+‚Ù‚¢‚­‚µ‚å
+‚Ú‚¢‚ç
+‚Ú‚¢‚ñ
+‚Û‚¢‚ñ‚½
+‚Ù‚¤
+‚Ù‚¤‚ ‚ñ
+‚Ù‚¤‚¢
+‚Ú‚¤‚¢
+‚Ù‚¤‚¢‚ª‚­
+‚Ù‚¤‚¢‚«
+‚Ú‚¤‚¤
+‚Ù‚¤‚¦
+‚Ú‚¤‚¦‚¢‚¿‚傤
+‚Ú‚¤‚¦‚¢‚è‚å‚­
+‚Ú‚¤‚¦‚«‚µ‚傤
+‚Ù‚¤‚¦‚Â
+‚Ù‚¤‚¦‚ñ
+‚Ú‚¤‚¦‚ñ‚«‚傤
+‚Ù‚¤‚¨‚¤
+‚Ú‚¤‚¨‚ñ
+‚Ú‚¤‚¨‚ñ‚´‚¢
+‚Ù‚¤‚©
+‚Ù‚¤‚ª
+‚Ú‚¤‚ª
+‚Ú‚¤‚ª‚¢
+‚Ù‚¤‚ª‚­
+‚Ù‚¤‚ª‚­‚Ô
+‚Ù‚¤‚©‚²
+‚Ù‚¤‚ª‚Á‚©
+‚Ù‚¤‚©‚ñ
+‚Ù‚¤‚ª‚ñ
+‚Ú‚¤‚©‚ñ
+‚Ù‚¤‚ª‚ñ‚µ
+‚Ù‚¤‚«‚イ
+‚Ú‚¤‚«‚å
+‚Ù‚¤‚«‚傤
+‚Ú‚¤‚«‚傤
+‚Ù‚¤‚¬‚å‚­
+‚Ù‚¤‚«‚ñ
+‚Ù‚¤‚¬‚ñ
+‚Ú‚¤‚­‚¤
+‚Ú‚¤‚®‚Ý
+‚Ú‚¤‚­‚ñ
+‚Ù‚¤‚¯‚¢
+‚Ú‚¤‚¯‚¢
+‚Ù‚¤‚¯‚ñ
+‚Ù‚¤‚°‚ñ
+‚Ù‚¤‚²
+‚Ù‚¤‚±‚¤
+‚Ù‚¤‚²‚¤
+‚Ú‚¤‚±‚¤
+‚Ù‚¤‚±‚­
+‚Ú‚¤‚±‚­
+‚Ù‚¤‚±‚­‚µ‚å
+‚Ù‚¤‚³‚­
+‚Ù‚¤‚³‚ñ
+‚Ù‚¤‚µ
+‚Ù‚¤‚¶
+‚Ú‚¤‚µ
+‚Ù‚¤‚µ‚«
+‚Ù‚¤‚µ‚Ђñ
+‚Ú‚¤‚µ‚á
+‚Ù‚¤‚µ‚Ⴖ‚傤
+‚Ù‚¤‚µ‚Ⴙ‚¢
+‚Ù‚¤‚µ‚Ⴙ‚ñ
+‚Ù‚¤‚µ‚á‚Ì‚¤
+‚Ù‚¤‚µ‚ã
+‚Ù‚¤‚µ‚イ
+‚Ù‚¤‚µ‚å
+‚Ù‚¤‚µ‚傤
+‚Ù‚¤‚¶‚傤
+‚Ú‚¤‚µ‚傤
+‚Ú‚¤‚¶‚傤
+‚Ù‚¤‚¶‚傤‚¦
+‚Ù‚¤‚µ‚傤‚«‚ñ
+‚Ù‚¤‚µ‚å‚­‚Ä‚ñ
+‚Ù‚¤‚µ‚ñ
+‚Ù‚¤‚¶‚ñ
+‚Ù‚¤‚¶‚ñ‚º‚¢
+‚Ú‚¤‚¸
+‚Ù‚¤‚·‚¢
+‚Ú‚¤‚·‚¢
+‚Ù‚¤‚·‚ñ
+‚Ù‚¤‚¹‚¢
+‚Ù‚¤‚¹‚«
+‚Ú‚¤‚¹‚Â
+‚Ù‚¤‚¹‚ñ
+‚Ú‚¤‚¹‚ñ
+‚Ú‚¤‚º‚ñ
+‚Ù‚¤‚»‚¤
+‚Ù‚¤‚»‚¤‚©‚¢
+‚Ù‚¤‚»‚¤‚«‚å‚­
+‚Ù‚¤‚»‚¤‚µ
+‚Ù‚¤‚»‚¤‚à‚¤
+‚Ù‚¤‚»‚­
+‚Ù‚¤‚¾‚¢
+‚Ù‚¤‚¾‚ñ
+‚Ú‚¤‚¾‚ñ
+‚Ù‚¤‚¿
+‚Ù‚¤‚¿‚«
+‚Ù‚¤‚¿‚±‚­
+‚Ú‚¤‚¿‚イ
+‚Ú‚¤‚¿‚イ‚´‚¢
+‚Ú‚¤‚¿‚傤
+‚Ú‚¤‚¿‚傤‚É‚ñ
+‚Ù‚¤‚Ä‚¢
+‚Ù‚¤‚Ä‚¢‚µ‚«
+‚Ù‚¤‚Ä‚ñ
+‚Ú‚¤‚Ä‚ñ
+‚Ù‚¤‚Æ
+‚Ù‚¤‚Æ‚¤
+‚Ú‚¤‚Æ‚¤
+‚Ú‚¤‚Ç‚¤
+‚Ù‚¤‚Ç‚¤‚¶‚ñ
+‚Ù‚¤‚Æ‚­
+‚Ù‚¤‚Ë‚ñ
+‚Ú‚¤‚Ë‚ñ‚©‚¢
+‚Ú‚¤‚Í‚Ä‚¢
+‚Ù‚¤‚Ð
+‚Ú‚¤‚Ñ‚«
+‚Ù‚¤‚Ó
+‚Ú‚¤‚Ó
+‚Ú‚¤‚Ó‚¤
+‚Ú‚¤‚Ó‚¤‚¤
+‚Ù‚¤‚Ԃ‚¹‚ñ
+‚Ù‚¤‚Ô‚ñ
+‚Ú‚¤‚Ö‚«
+‚Ù‚¤‚ׂñ
+‚Ù‚¤‚Ù‚¤
+‚Ù‚¤‚Ú‚¤
+‚Ù‚¤‚Ü‚Â
+‚Ù‚¤‚Þ‚©
+‚Ù‚¤‚Þ‚ª‚©‚è
+‚Ù‚¤‚Þ‚«‚å‚­
+‚Ù‚¤‚Þ‚µ‚傤
+‚Ù‚¤‚Þ‚¾‚¢‚¶‚ñ
+‚Ù‚¤‚Þ‚Ô
+‚Ù‚¤‚ß‚¢
+‚Ù‚¤‚à‚¤
+‚Ù‚¤‚à‚Â
+‚Ù‚¤‚à‚ñ‚¬
+‚Ù‚¤‚à‚ñ‚³‚«
+‚Ù‚¤‚䂤
+‚Ù‚¤‚悤
+‚Ù‚¤‚悤‚è‚å‚­
+‚Ú‚¤‚è
+‚Ù‚¤‚è‚Â
+‚Ù‚¤‚è‚‚©
+‚Ù‚¤‚è‚á‚­
+‚Ú‚¤‚è‚á‚­
+‚Ù‚¤‚è‚傤
+‚Ú‚¤‚è‚å‚­
+‚Ú‚¤‚è‚ñ‚®
+‚Ù‚¤‚é‚¢
+‚Ù‚¤‚ê‚¢
+‚Ú‚¤‚ê‚¢
+‚Ù‚¤‚ê‚Â
+‚Ù‚¤‚낤
+‚Ú‚¤‚낤
+‚Ù‚¤‚í
+‚Ù‚¦‚«
+‚Ù‚¨
+‚Ú[‚¢
+‚Ù[‚­
+‚Ù[‚·
+‚Û[‚¸
+‚Ù‚¨‚¦
+‚Ú[‚Æ
+‚Ú[‚Ç
+‚Û[‚Æ
+‚Ú[‚È‚·
+‚Ù[‚Õ
+‚Ù‚¨‚ׂÉ
+‚Ù[‚é
+‚Ú[‚é
+‚Û[‚é
+‚Ú[‚邪‚Ý
+‚Ù[‚ñ
+‚Ú[‚ñ
+‚Ù‚©
+‚Ù‚©‚­
+‚Ù‚©‚°
+‚Ù‚©‚ñ
+‚Ú‚©‚ñ
+‚Ú‚«
+‚Ù‚«‚ñ‚µ‚á
+‚Ú‚­
+‚Ù‚­‚¨‚¤
+‚Ú‚­‚¬‚イ
+‚Ù‚­‚°‚ñ
+‚Ú‚­‚µ
+‚Ú‚­‚¶‚イ
+‚Ú‚­‚¶‚傤
+‚Ù‚­‚µ‚ñ
+‚Ù‚­‚¹‚¢
+‚Ú‚­‚¹‚«
+‚Ú‚­‚»‚¤
+‚Ù‚­‚½‚ñ
+‚Ú‚­‚¿‚­
+‚Ù‚­‚Æ
+‚Ù‚­‚Æ‚¤
+‚Ú‚­‚Ç‚¤
+‚Ù‚­‚Ô
+‚Ù‚­‚ׂ¢
+‚Ù‚­‚Ù‚­‚¹‚¢
+‚Ù‚­‚Ù‚­‚Æ‚¤
+‚Ù‚­‚悤
+‚Ù‚­‚è‚­
+‚Ù‚­‚ë
+‚Ú‚¯
+‚Ù‚°‚¢
+‚Ú‚¯‚¢
+‚Ù‚¯‚Â
+‚Ú‚¯‚Â
+‚Û‚¯‚Á‚Æ
+‚Ù‚¯‚ñ
+‚Ù‚¯‚ñ‚«‚ñ
+‚Ù‚¯‚ñ‚µ‚á
+‚Ù‚¯‚ñ‚¶‚å
+‚Ù‚¯‚ñ‚µ‚傤
+‚Ù‚¯‚ñ‚Ó
+‚Ù‚¯‚ñ‚è‚傤
+‚Ú‚±‚¤
+‚Ù‚±‚¤‚µ‚á
+‚Ú‚±‚­
+‚Ú‚±‚­‚²
+‚Ù‚±‚³‚«
+‚Ù‚²‚µ
+‚Ù‚²‚µ‚á
+‚Ù‚³
+‚Ù‚³‚©‚ñ
+‚Ù‚³‚«
+‚Ú‚³‚Â
+‚Ù‚µ
+‚Ú‚µ
+‚Ù‚µ‚­‚¸
+‚Ù‚µ‚¼‚ç
+‚Ù‚µ‚à‚Ì
+‚Ù‚µ‚á‚­‚«‚ñ
+‚Ù‚µ‚ã
+‚Ú‚µ‚イ‚¾‚ñ
+‚Ù‚µ‚ク‚¢
+‚Ú‚µ‚å
+‚Ú‚¶‚傤
+‚Ù‚µ‚傤‚«‚ñ
+‚Ù‚µ‚傤‚µ‚å
+‚Ù‚µ‚傤‚‚«
+‚Ù‚µ‚傤‚É‚ñ
+‚Ù‚¶‚å‚«‚ñ
+‚Ù‚µ‚å‚­
+‚Ù‚µ‚ñ
+‚Ù‚·‚¤
+‚Û‚·‚½[
+‚Ù‚·‚Ä‚·
+‚Ù‚·‚Æ
+‚Ú‚·‚Æ‚ñ
+‚Ù‚º‚¢
+‚Ù‚¹‚ñ
+‚Ù‚º‚ñ
+‚Ú‚¹‚ñ
+‚Ú‚º‚ñ
+‚Ù‚¹‚ñ‚­
+‚Ù‚»‚¨‚à‚Ä
+‚Ù‚»‚­
+‚Ù‚»‚Ý
+‚Ù‚»‚ß
+‚Ú‚½‚¢
+‚Ú‚¾‚¢
+‚Ù‚½‚é
+‚Ú‚½‚ñ
+‚Ú‚¿
+‚Ù‚¿‚傤
+‚Ù‚¿‚傤‚«
+‚Ú‚Â
+‚Ú‚Á‚©
+‚ڂ‚ª
+‚Ù‚Á‚©‚¢‚Ç‚¤
+‚Ù‚Á‚«‚É‚ñ
+‚Ù‚Á‚«‚å‚­‚©‚¢
+‚Ù‚Á‚«‚å‚­‚¯‚ñ
+‚Ù‚Á‚«‚å‚­‚¹‚¢
+‚Ú‚Á‚­‚·
+‚Ù‚Á‚¯
+‚Ù‚Á‚¯[
+‚ڂ‚²
+‚Ù‚Á‚±‚­
+‚Ù‚Á‚³
+‚Ù‚Á‚½‚ñ
+‚Ú‚Á‚¿‚á‚ñ
+‚Ù‚Á‚Æ
+‚Û‚Á‚Æ
+‚ڂ‚˂ñ
+‚Ù‚Ä‚¢
+‚Ú‚Å‚¡[
+‚Ù‚Ä‚é
+‚Û‚Ä‚ñ‚µ‚á‚é
+‚Ù‚Ç
+‚Ù‚Ç‚¤
+‚Ú‚Ç‚¤
+‚Ù‚Æ‚¯
+‚Ù‚Æ‚Æ‚¬‚·
+‚Ù‚Ç‚È‚­
+‚Ù‚Ç‚Ù‚Ç
+‚Ú‚Æ‚Þ
+‚Ù‚Æ‚è
+‚Ù‚Æ‚ñ‚Ç
+‚ڂɂイ
+‚Ù‚Ë
+‚Ù‚Ë‚¨‚肼‚ñ
+‚Ù‚Ë‚®‚Ý
+‚ق˂‚¬
+‚Ù‚Ë‚Ý
+‚Ù‚Ì‚¨
+‚Ú‚Ð
+‚Ù‚Ñ[
+‚Û‚Ò‚ã‚ç[
+‚ڂЂ傤
+‚Ù‚Ó
+‚Ù‚Ö‚¢
+‚Ù‚Ù
+‚Ù‚Ü‚ê
+‚Ú‚â
+‚ق䂤‚è‚Â
+‚ق悤‚µ‚å
+‚Ù‚ç
+‚Ù‚ç‚ ‚È
+‚Ù‚è
+‚ۂ肦‚·‚Ä‚é
+‚Ù‚è‚©‚í
+‚ۂ肵[
+‚Û‚è‚·
+‚ق肾‚µ‚à‚Ì
+‚Ù‚è‚Å[
+‚Ù‚è‚Ì‚¤‚¿
+‚Û‚è‚Ü[
+‚Ù‚è‚à‚Ì
+‚Ú‚è‚ã[‚Þ
+‚Ù‚è‚å
+‚ق邾
+‚ق邾[
+‚Ú‚é‚Æ
+‚Ù‚ë
+‚Ú‚ë
+‚Û‚ë
+‚ق낤
+‚ۂ낵‚á‚Â
+‚Ù‚í‚¢‚Æ
+‚Ù‚ñ
+‚Ù‚ñ‚ ‚ñ
+‚Ù‚ñ‚¢
+‚Ù‚ñ‚¦‚¢
+‚Ú‚ñ‚¨‚Ç‚è
+‚Ù‚ñ‚©
+‚Ù‚ñ‚©‚¢
+‚Ù‚ñ‚©‚¢‚¬
+‚Ù‚ñ‚©‚­‚Í
+‚Ù‚ñ‚©‚ñ
+‚Ù‚ñ‚ª‚ñ
+‚Ù‚ñ‚ª‚ñ‚¶
+‚Ù‚ñ‚«
+‚Ù‚ñ‚¬
+‚Ù‚ñ‚¬‚Ü‚è
+‚Ù‚ñ‚«‚å
+‚Ù‚ñ‚¬‚傤
+‚Ù‚ñ‚«‚å‚­
+‚Ù‚ñ‚«‚å‚¿
+‚Ù‚ñ‚«‚ñ
+‚Ù‚ñ‚®‚¤
+‚Ú‚ñ‚­‚ê
+‚Ú‚ñ‚¯‚¢
+‚Ù‚ñ‚¯‚ñ
+‚Ù‚ñ‚±‚¤
+‚Ù‚ñ‚²‚­
+‚Ù‚ñ‚²‚µ
+‚Ù‚ñ‚³‚¢
+‚Ú‚ñ‚³‚¢
+‚Ù‚ñ‚´‚ñ
+‚Ù‚ñ‚µ
+‚Ù‚ñ‚µ‚«
+‚Ù‚ñ‚µ‚Â
+‚Ù‚ñ‚¶‚Â
+‚Ù‚ñ‚µ‚á
+‚Ù‚ñ‚µ‚イ
+‚Ù‚ñ‚¶‚å
+‚Ù‚ñ‚µ‚傤
+‚Ù‚ñ‚¶‚傤
+‚Ù‚ñ‚µ‚å‚­
+‚Ù‚ñ‚µ‚ñ
+‚Ù‚ñ‚¶‚ñ
+‚Ú‚ñ‚¶‚ñ
+‚Ù‚ñ‚·‚¶
+‚Ù‚ñ‚¹‚«
+‚Ù‚ñ‚¹‚«‚¿
+‚Ù‚ñ‚¹‚ñ
+‚Ù‚ñ‚»
+‚Ù‚ñ‚»‚¤
+‚Ù‚ñ‚»‚­
+‚Ù‚ñ‚½‚¢
+‚Ù‚ñ‚¾‚¢
+‚Ù‚ñ‚½‚­
+‚Ù‚ñ‚½‚Ä
+‚Ù‚ñ‚¾‚È
+‚Ú‚ñ‚¿
+‚Ù‚ñ‚¿‚傤
+‚Ù‚ñ‚Ä‚ñ
+‚Ù‚ñ‚Å‚ñ
+‚Ù‚ñ‚Æ
+‚Ù‚ñ‚Ç
+‚Ú‚ñ‚Ç
+‚Ù‚ñ‚Æ‚¤
+‚Ù‚ñ‚Ç‚¤
+‚Ù‚ñ‚É‚ñ
+‚Ù‚ñ‚Ë
+‚Ù‚ñ‚Ë‚ñ
+‚Ù‚ñ‚Ë‚ñ‚Ç
+‚Ù‚ñ‚Ì‚¤
+‚Ú‚ñ‚Ì‚¤
+‚Ù‚ñ‚Î
+‚Ù‚ñ‚΂ñ
+‚Ù‚ñ‚Ô
+‚Û‚ñ‚Õ
+‚Ù‚ñ‚Ô‚¿‚傤
+‚Ù‚ñ‚Ô‚ñ
+‚Ù‚ñ‚Û
+‚Ù‚ñ‚Û‚¤
+‚Ù‚ñ‚݂傤
+‚Ù‚ñ‚Þ
+‚Ù‚ñ‚ß‚¢
+‚Ù‚ñ‚à‚Æ
+‚Ù‚ñ‚à‚Ì
+‚Ù‚ñ‚â
+‚Ù‚ñ‚â‚­‚«
+‚Ù‚ñ‚è‚イ
+‚Ù‚ñ‚è‚傤
+‚Ù‚ñ‚é‚¢
+‚Ù‚ñ‚ë‚ñ
+ƒ}
+‚Ü
+‚Ü
+‚Ü‚ 
+‚Ü‚ ‚¢
+‚Ü[‚ª‚è‚ñ
+‚Ü[‚ª‚ê‚Á‚Æ
+‚Ü[‚¯‚Á‚Ä‚¡‚ñ‚®
+‚Ü[‚¯‚Á‚Æ
+‚Ü[‚¯‚Ä‚¡‚ñ‚®
+‚Ü[‚¶‚á‚ñ
+‚Ü[‚¶‚ñ
+‚Ü[‚Æ
+‚Ü‚¢
+‚Ü‚¢‚ ‚³
+‚Ü‚¢‚©[
+‚Ü‚¢‚©‚¢
+‚Ü‚¢‚«
+‚Ü‚¢‚­
+‚Ü‚¢‚±
+‚Ü‚¢‚²
+‚Ü‚¢‚²‚¤
+‚Ü‚¢‚±‚ñ
+‚Ü‚¢‚¶
+‚Ü‚¢‚µ‚イ
+‚Ü‚¢‚·‚¤
+‚Ü‚¢‚‚«
+‚Ü‚¢‚Ç
+‚Ü‚¢‚Æ‚µ
+‚Ü‚¢‚È[
+‚Ü‚¢‚É‚¿
+‚Ü‚¢‚Ë‚ñ
+‚Ü‚¢‚΂ñ
+‚Ü‚¢‚Ó‚ñ
+‚Ü‚¢‚Ø[‚·
+‚Ü‚¢‚Ù[‚Þ
+‚Ü‚¢‚Ü‚¢
+‚Ü‚¢‚æ
+‚Ü‚¢‚é
+‚Ü‚¢‚é‚Ç
+‚Ü‚¤‚·
+‚Ü‚¤‚ñ‚Æ
+‚Ü‚¦
+‚Ü‚¦‚ ‚µ
+‚Ü‚¦‚¤‚肯‚ñ
+‚Ü‚¦‚ª‚Ý
+‚Ü‚¦‚ª‚í
+‚Ü‚¦‚¾‚ê
+‚Ü‚¦‚Î
+‚Ü‚¦‚Ü‚¦
+‚Ü‚¦‚Þ‚«
+‚Ü‚¦‚킽‚µ‚«‚ñ
+‚Ü‚ª‚¢‚à‚Ì
+‚Ü‚ª‚¨
+‚Ü‚ª‚è‚©‚Ç
+‚Ü‚ª‚è‚È‚è
+‚Ü‚©‚ë‚É
+‚Ü‚«
+‚Ü‚«‚¦
+‚Ü‚«‚ª‚Ý
+‚Ü‚«‚µ‚Ü‚Þ
+‚Ü‚«‚¼‚¦
+‚Ü‚«‚Î
+‚Ü‚«‚à‚Ì
+‚Ü‚¬‚í
+‚Ü‚­
+‚Ü‚­‚ ‚¯
+‚Ü‚­‚¤‚¿
+‚Ü‚­‚µ‚½
+‚Ü‚®‚¿
+‚Ü‚®‚É‚¿‚ã[‚Ç
+‚Ü‚®‚Ë‚Á‚Æ
+‚Ü‚­‚Ì‚¤‚¿
+‚Ü‚­‚Í‚è
+‚Ü‚­‚ç
+‚Ü‚­‚炱‚Æ‚Î
+‚Ü‚­‚ç‚à‚Æ
+‚Ü‚­‚ë
+‚Ü‚®‚ë
+‚Ü‚¯‚Ú‚µ
+‚Ü‚²
+‚Ü‚²‚±‚ë
+‚Ü‚´[
+‚Ü‚³‚«
+‚Ü‚³‚²
+‚Ü‚³‚ß
+‚Ü‚³‚ä‚ß
+‚Ü‚µ
+‚Ü‚µ[‚ñ
+‚Ü‚µ‚½
+‚Ü‚¶‚ß
+‚Ü‚µ‚á‚­
+‚Ü‚¶‚ã‚Â
+‚Ü‚¶‚å
+‚Ü‚µ‚傤
+‚Ü‚µ‚傤‚ß‚ñ
+‚Ü‚µ‚ñ
+‚Ü‚·
+‚Ü‚·‚­
+‚Ü‚·‚±‚Ý
+‚Ü‚·‚±‚Ý‚ã‚É‚¯[
+‚Ü‚·‚Ý
+‚Ü‚·‚ß
+‚Ü‚½
+‚Ü‚½‚ª‚Ý
+‚Ü‚¾‚¯
+‚Ü‚½‚µ‚½
+‚Ü‚¾‚ç
+‚Ü‚¿
+‚Ü‚¿‚ ‚¢
+‚Ü‚¿‚¢‚µ‚á
+‚Ü‚¿‚©‚Ç
+‚Ü‚¿‚¶‚イ
+‚Ü‚¿‚À‚イ
+‚Ü‚¿‚È‚©
+‚Ü‚¿‚È‚Ý
+‚Ü‚¿‚Í‚¸‚ê
+‚Ü‚Â
+‚܂‚¦‚¢
+‚܂‚©‚º
+‚Ü‚Á‚«
+‚܂‚°
+‚܂‚²
+‚Ü‚Á‚±‚¤
+‚Ü‚Á‚³‚¢‚¿‚イ
+‚Ü‚Á‚³‚©‚³‚Ü
+‚Ü‚Á‚³‚«
+‚܂‚¶
+‚܂‚¶‚Â
+‚܂‚¶‚ß
+‚Ü‚Á‚µ‚ã‚é[‚Þ
+‚Ü‚Á‚µ‚ë
+‚Ü‚Á‚·‚®
+‚Ü‚Á‚¹‚«
+‚Ü‚Á‚¹‚Â
+‚܂‚¾‚¢
+‚܂‚½‚¯
+‚Ü‚Á‚½‚¾‚È‚©
+‚Ü‚Á‚¿‚á
+‚Ü‚Á‚Ä‚¢
+‚Ü‚Á‚Æ
+‚Ü‚Á‚Í
+‚܂‚Î
+‚܂‚΂¦
+‚܂‚΂₵
+‚܂‚Ñ
+‚Ü‚Á‚Ò‚Â
+‚Ü‚Á‚Õ
+‚܂‚Ԃñ
+‚܂‚ނµ
+‚܂‚â‚Ü
+‚܂‚悤
+‚܂‚育‚Æ
+‚܂‚è‚イ
+‚܂‚ë
+‚Ü‚Å
+‚Ü‚Ä‚ñ‚낤
+‚Ü‚Æ
+‚Ü‚Ç
+‚Ü‚Ç‚ª‚í
+‚Ü‚Ç‚¬‚í
+‚Ü‚Ç‚®‚¿
+‚Ü‚Ç‚×
+‚Ü‚Æ‚à
+‚Ü‚Ç‚è
+‚܂ǂ肸
+‚Ü‚Æ‚ñ
+‚Ü‚Ç‚ñ‚È
+‚Ü‚È[
+‚Ü‚È‚¢‚½
+‚Ü‚È‚±
+‚Ü‚È‚´‚µ
+‚Ü‚È‚Â
+‚܂ȂÂé
+‚Ü‚È‚Å‚µ
+‚Ü‚È‚Ñ
+‚Ü‚È‚Þ‚·‚ß
+‚Ü‚É‚ 
+‚Ü‚É‚ã‚ ‚é
+‚Ü‚É‚ç
+‚Ü‚Ë[
+‚Ü‚Ë[‚¶‚á
+‚Ü‚Ë[‚¶‚á[
+‚Ü‚Ë‚«‚Ë‚±
+‚Ü‚Ë‚¶‚ß‚ñ‚Æ
+‚Ü‚Ë‚¶‚á[
+‚Ü‚Ì‚ ‚½‚è
+‚Ü‚Ô‚½
+‚Ü‚Ó‚ä
+‚Ü‚Ó‚ä‚Ñ
+‚Ü‚Ó‚ç
+‚Ü‚Ù‚¤
+‚Ü‚Ù‚¤‚Ñ‚ñ
+‚Ü‚Ù‚ª‚É[
+‚Ü‚Ü
+‚Ü‚Ü‚±
+‚Ü‚Ü‚Í‚Í
+‚Ü‚Ý‚¸
+‚Ü‚Þ‚©‚¢
+‚Ü‚ß
+‚Ü‚ß‚¾
+‚܂߂‚Ô
+‚Ü‚ß‚Ù‚ñ
+‚Ü‚ß‚é‚¢
+‚Ü‚à‚Ì
+‚Ü‚â‚­
+‚Ü‚ä
+‚Ü‚ä‚°
+‚܂悯
+‚Ü‚æ‚È‚©
+‚Ü‚æ‚Ë[‚¸
+‚Ü‚ç‚»‚ñ
+‚Ü‚è
+‚Ü‚è‚å‚­
+‚Ü‚é
+‚Ü‚é‚­‚Ñ
+‚܂邼‚ñ
+‚܂邽
+‚Ü‚é‚¿
+‚Ü‚é‚Í‚¾‚©
+‚Ü‚é‚Ú‚¤‚¸
+‚Ü‚é‚₯
+‚Ü‚ë
+‚Ü‚ë‚É‚¦
+‚܂킽
+‚Ü‚í‚è
+‚Ü‚ñ
+‚Ü‚ñ‚¢‚¿
+‚Ü‚ñ‚¢‚ñ
+‚Ü‚ñ‚ª
+‚Ü‚ñ‚©‚¢
+‚Ü‚ñ‚ª‚©
+‚Ü‚ñ‚ª‚ñ
+‚Ü‚ñ‚©‚ñ‚µ‚å‚­
+‚Ü‚ñ‚«
+‚Ü‚ñ‚°‚«‚傤
+‚Ü‚ñ‚´
+‚Ü‚ñ‚´‚¢
+‚Ü‚ñ‚³‚­
+‚Ü‚ñ‚¶
+‚Ü‚ñ‚µ‚á
+‚Ü‚ñ‚¶‚イ
+‚Ü‚ñ‚¶‚サ‚á‚°
+‚Ü‚ñ‚µ‚å‚ñ
+‚Ü‚ñ‚µ‚ñ
+‚Ü‚ñ‚·
+‚Ü‚ñ‚¹‚¢
+‚Ü‚ñ‚¼‚­
+‚Ü‚ñ‚¼‚­‚©‚ñ
+‚Ü‚ñ‚¾‚ç
+‚Ü‚ñ‚Ä‚ñ
+‚Ü‚ñ‚Ç‚¤
+‚Ü‚ñ‚È‚©
+‚Ü‚ñ‚É‚ñ
+‚Ü‚ñ‚Ë‚ñ‚ЂÂ
+‚Ü‚ñ‚Ë‚ñ‚ê‚¢
+‚Ü‚ñ‚Ï‚¢
+‚Ü‚ñ‚Ü‚¦
+‚Ü‚ñ‚Ü‚é
+‚Ü‚ñ‚ß‚ñ
+‚Ü‚ñ‚à‚·
+‚Ü‚ñ‚悤
+‚Ü‚ñ‚悤‚ª‚È
+‚Ü‚ñ‚悤‚µ‚イ
+‚Ü‚ñ‚è‚傤
+‚Ü‚ñ‚é‚¢
+ƒ~
+‚Ý
+‚Ý
+‚Ý[‚Æ
+‚Ý‚¢‚ç
+‚Ý‚¢‚è
+‚Ý[‚é
+‚Ý‚¦
+‚Ý‚¨‚Ú‚¦
+‚Ý‚¨‚à
+‚Ý‚©‚¦‚è
+‚Ý‚ª‚«‚±
+‚Ý‚©‚­
+‚Ý‚©‚°
+‚Ý‚©‚½
+‚Ý‚©‚«
+‚Ý‚ª‚ç
+‚Ý‚ª‚í‚è
+‚Ý‚©‚ñ
+‚Ý‚«
+‚Ý‚¬
+‚Ý‚¬‚¤‚¦
+‚Ý‚¬‚¤‚Å
+‚Ý‚¬‚ª‚í
+‚Ý‚«‚³[
+‚Ý‚¬‚µ‚½
+‚Ý‚¬‚Ä
+‚Ý‚¬‚Í‚µ
+‚Ý‚¬‚Þ‚«
+‚Ý‚¬‚ß
+‚Ý‚¬‚æ‚è
+‚Ý‚«‚è
+‚Ý‚¬‚í
+‚Ý‚«‚í‚ß
+‚Ý‚­‚ë
+‚Ý‚¯
+‚Ý‚¯‚Â
+‚Ý‚¯‚ñ
+‚Ý‚±
+‚Ý‚±‚µ
+‚Ý‚²‚½‚¦
+‚Ý‚±‚Æ
+‚Ý‚²‚ë
+‚Ý‚²‚낵
+‚Ý‚±‚ñ
+‚Ý‚³‚¢
+‚Ý‚³‚¢‚é
+‚Ý‚³‚¨
+‚Ý‚³‚©‚¢
+‚Ý‚µ‚イ
+‚Ý‚¶‚ã‚­‚¶
+‚Ý‚µ‚傤
+‚Ý‚µ‚å‚Ô‚ñ
+‚Ý‚µ‚å‚è
+‚Ý‚µ‚ñ
+‚Ý‚·
+‚Ý‚¸‚ ‚©
+‚Ý‚¸‚ ‚ß
+‚Ý‚·‚¢
+‚Ý‚¸‚¢‚炸
+‚Ý‚¸‚¢‚ë
+‚Ý‚¸‚¤‚Ý
+‚Ý‚¸‚©‚«
+‚Ý‚¸‚©‚¯‚ë‚ñ
+‚Ý‚¸‚©‚³
+‚Ý‚¸‚ª‚ß
+‚Ý‚¸‚©‚ç
+‚Ý‚¸‚¬
+‚Ý‚¸‚¬‚í
+‚Ý‚¸‚­‚³
+‚Ý‚¸‚®‚¿
+‚Ý‚¸‚¯
+‚Ý‚¸‚³‚«
+‚Ý‚¸‚³‚µ
+‚Ý‚¸‚µ‚傤‚΂¢
+‚Ý‚·‚½[
+‚Ý‚¸‚½‚«
+‚Ý‚·‚Ä[‚­
+‚Ý‚·‚Ä‚è
+‚Ý‚·‚Ä‚è[
+‚Ý‚¸‚Æ‚è
+‚Ý‚¸‚Í‚¯
+‚Ý‚¸‚Ђ«
+‚Ý‚¸‚Ñ‚½‚µ
+‚Ý‚¸‚Ù
+‚Ý‚¸‚Ü‚«
+‚Ý‚·‚Ý
+‚Ý‚¸‚Þ‚µ
+‚Ý‚¸‚à‚Ì
+‚Ý‚¹
+‚Ý‚¹‚¢‚Ë‚ñ
+‚Ý‚¹‚µ‚ß
+‚Ý‚¹‚·
+‚Ý‚¹‚Â
+‚Ý‚º‚É
+‚Ý‚¹‚à‚Ì
+‚Ý‚º‚ñ
+‚Ý‚º‚ñ‚¯‚¢
+‚Ý‚¼
+‚Ý‚»‚©
+‚Ý‚»‚ç
+‚Ý‚¼‚ê
+‚Ý‚½‚¯
+‚Ý‚¾‚µ
+‚Ý‚¾‚µ‚È‚Ý
+‚Ý‚½‚ß
+‚Ý‚¿
+‚Ý‚¿‚µ‚¨
+‚Ý‚¿‚¶‚ã‚ñ
+‚Ý‚¿‚µ‚é‚×
+‚Ý‚¿‚·‚¤
+‚Ý‚¿‚·‚¶
+‚Ý‚¿‚Ì‚è
+‚Ý‚¿‚΂½
+‚Ý‚¿‚Í‚Î
+‚Ý‚¿‚Ð
+‚Ý‚¿‚á‚­
+‚Ý‚¿‚ä‚«
+‚Ý‚Â
+‚Ý‚Á‚«[
+‚Ý‚Á‚«‚傤
+‚Ý‚Á‚­
+‚݂‚¯
+‚Ý‚Á‚¯‚¢
+‚݂‚°‚Â
+‚Ý‚Á‚µ‚Â
+‚Ý‚Á‚¿‚á‚ñ
+‚Ý‚Á‚Â
+‚Ý‚Á‚Æ
+‚݂‚Ç
+‚Ý‚Á‚Ç‚È‚¢‚Æ
+‚Ý‚Â‚Ç‚à‚¦
+‚݂‚Î
+‚݂‚à‚肵‚å
+‚݂‚è‚ñ
+‚Ý‚Ä‚¢
+‚Ý‚Å‚¡‚ ‚Þ
+‚Ý‚Æ‚¤
+‚Ý‚Ç‚¤
+‚Ý‚Æ‚¨‚µ
+‚Ý‚Æ‚ß‚¢‚ñ
+‚Ý‚Ç‚è
+‚݂Ƃ肸
+‚Ý‚Ç‚é
+‚Ý‚È
+‚Ý‚È‚³‚Ü
+‚Ý‚È‚³‚ñ
+‚݂Ȃ«
+‚Ý‚È‚Æ
+‚Ý‚È‚Æ‚Ü‚¿
+‚Ý‚È‚Ý
+‚Ý‚È‚Ý‚©‚¢‚«‚¹‚ñ
+‚Ý‚È‚Ý‚©‚º
+‚Ý‚È‚Ý‚ª‚í
+‚Ý‚È‚Ý‚È
+‚Ý‚È‚Ý‚Í‚ñ‚«‚イ
+‚Ý‚È‚à‚Æ
+‚Ý‚È‚ç‚¢
+‚Ý‚È‚è
+‚Ý‚É
+‚Ý‚É‚±‚ñ
+‚Ý‚É‚Ü‚Þ
+‚Ý‚Ë
+‚Ý‚Ë‚ç‚é
+‚Ý‚Ì
+‚Ý‚Ì‚¤
+‚Ý‚Ì‚¤‚¦
+‚Ý‚Ì‚µ‚ë‚«‚ñ
+‚Ý‚Ì‚Þ‚µ
+‚Ý‚Í‚ç‚¢
+‚݂͂炵
+‚Ý‚Ô‚è
+‚Ý‚Ô‚ñ
+‚Ý‚Ú‚¤‚¶‚ñ
+‚Ý‚Ù‚ñ
+‚Ý‚Ü‚¢
+‚Ý‚Ü‚¢‚«‚ñ
+‚Ý‚Ü‚ñ
+‚Ý‚Ý
+‚Ý‚Ý‚½‚Ô
+‚Ý‚ß‚¢
+‚Ý‚à‚¿
+‚Ý‚à‚Ì
+‚Ý‚à‚ñ
+‚Ý‚â
+‚Ý‚á‚­
+‚Ý‚á‚­‚Í‚­
+‚Ý‚á‚­‚ç‚­
+‚Ý‚â‚°
+‚Ý‚â‚Ü
+‚Ý‚ã[
+‚Ý‚ã[‚¶‚©‚é
+‚Ý‚ã[‚¶‚Á‚­
+‚Ý‚ä‚«
+‚Ý‚æ
+‚݂傤
+‚݂傤‚¬
+‚݂傤‚¯‚¢
+‚݂傤‚²
+‚݂傤‚²‚É‚¿
+‚݂傤‚¶
+‚݂傤‚µ‚ã
+‚݂傤‚¶‚傤
+‚݂傤‚¾‚¢
+‚݂傤‚É‚¿
+‚݂傤‚Ë‚ñ
+‚݂傤‚΂ñ
+‚݂傤‚Ý
+‚݂傤‚â‚­
+‚݂傤‚è
+‚Ý‚ç[
+‚Ý‚ç‚¢
+‚Ý‚ç‚­‚é
+‚݂肨‚ñ
+‚Ý‚è‚Î[‚é
+‚Ý‚è‚ß[‚Æ‚é
+‚Ý‚è‚傤
+‚Ý‚è‚ñ
+‚Ý‚é‚­
+‚Ý‚ê‚ñ
+‚Ý‚ñ‚¦‚¢
+‚Ý‚ñ‚©
+‚Ý‚ñ‚©‚Â
+‚Ý‚ñ‚©‚ñ
+‚Ý‚ñ‚¯‚ñ
+‚Ý‚ñ‚¶
+‚Ý‚ñ‚µ‚á
+‚Ý‚ñ‚µ‚á‚Æ‚¤
+‚Ý‚ñ‚µ‚ã
+‚Ý‚ñ‚¶‚ã
+‚Ý‚ñ‚µ‚イ
+‚Ý‚ñ‚µ‚サ‚ガ
+‚Ý‚ñ‚¹‚¢
+‚Ý‚ñ‚¼‚­
+‚Ý‚ñ‚¿‚傤
+‚Ý‚ñ‚Ä‚Â
+‚Ý‚ñ‚Æ
+‚Ý‚ñ‚Ç
+‚Ý‚ñ‚Ú‚¤
+‚Ý‚ñ‚Û‚¤
+‚Ý‚ñ‚䂤
+‚Ý‚ñ‚悤
+‚Ý‚ñ‚è‚å‚­
+‚Ý‚ñ‚낤‚«‚傤
+‚Ý‚ñ‚í
+ƒ€
+‚Þ
+‚Þ‚¢
+‚Þ‚¢‚©
+‚Þ‚¢‚µ‚«
+‚Þ‚¢‚»‚ñ
+‚Þ‚¢‚¿‚à‚Â
+‚Þ‚¢‚¿‚à‚ñ
+‚Þ‚¢‚Ý
+‚Þ[‚Ñ[
+‚Þ[‚ñ
+‚Þ‚¦‚«
+‚Þ‚¦‚ñ
+‚Þ‚¦‚ñ‚½‚ñ
+‚Þ‚ª
+‚Þ‚ª‚¢
+‚Þ‚©‚¦
+‚Þ‚ª‚­
+‚Þ‚©‚µ
+‚Þ‚©‚µ‚©‚½‚¬
+‚Þ‚©‚µ‚È‚¶‚Ý
+‚Þ‚©‚µ‚΂Ȃµ
+‚Þ‚©‚Å
+‚Þ‚©‚ñ
+‚Þ‚©‚ñ‚¯‚¢
+‚Þ‚©‚ñ‚µ‚ñ
+‚Þ‚«
+‚Þ‚¬
+‚Þ‚«‚µ‚Â
+‚Þ‚«‚¸
+‚Þ‚¬‚΂½‚¯
+‚Þ‚«‚ß‚¢
+‚Þ‚«‚イ
+‚Þ‚¬‚í‚ç
+‚Þ‚­
+‚Þ‚­‚¢
+‚Þ‚­‚¿
+‚Þ‚¯
+‚Þ‚°
+‚Þ‚¯‚¢
+‚Þ‚°‚¢
+‚Þ‚¯‚Â
+‚Þ‚°‚ñ
+‚Þ‚°‚ñ‚¾‚¢
+‚Þ‚±‚¤
+‚Þ‚±‚悤‚µ
+‚Þ‚±‚ñ
+‚Þ‚²‚ñ
+‚Þ‚´‚¢
+‚Þ‚³‚µ
+‚Þ‚³‚ñ
+‚Þ‚¶
+‚Þ‚¶‚±
+‚Þ‚µ‚¸
+‚Þ‚¶‚Â
+‚Þ‚¶‚È
+‚Þ‚µ‚Î
+‚Þ‚µ‚á
+‚Þ‚µ‚イ
+‚Þ‚¶‚イ‚è‚å‚­
+‚Þ‚µ‚傤
+‚Þ‚¶‚傤
+‚Þ‚¶‚傤‚¯‚ñ
+‚Þ‚µ‚å‚­
+‚Þ‚µ‚傼‚­
+‚Þ‚µ‚ë
+‚Þ‚¶‚ñ
+‚Þ‚µ‚ñ‚¯‚¢
+‚Þ‚¶‚ñ‚Æ‚¤
+‚Þ‚·‚¤
+‚Þ‚·‚±
+‚Þ‚·‚ß
+‚Þ‚º‚¢
+‚Þ‚¹‚ñ
+‚Þ‚¹‚ñ‚«
+‚Þ‚»‚¤
+‚Þ‚¾
+‚Þ‚¾‚ ‚µ
+‚Þ‚¾‚®‚¿
+‚Þ‚¿
+‚Þ‚¿‚¤‚¿‚µ‚傤
+‚Þ‚¿‚á
+‚Þ‚¿‚á‚­‚¿‚á
+‚Þ‚¿‚ñ
+‚ނ‚¤
+‚ނ‚«
+‚Þ‚Á‚µ‚ã[
+‚Þ‚Á‚Â
+‚Þ‚Ä‚«
+‚Þ‚Å‚ñ
+‚Þ‚Ä‚ñ‚Û
+‚Þ‚Ç‚­
+‚Þ‚Æ‚Ç‚¯
+‚Þ‚È‚¬
+‚Þ‚É
+‚Þ‚É‚ñ‚µ‚å
+‚Þ‚Ë
+‚Þ‚Ë‚ñ
+‚Þ‚Ì‚¤
+‚ނЂ傤
+‚Þ‚Ó‚¤
+‚Þ‚Ù‚¤
+‚Þ‚ß‚¢
+‚Þ‚ß‚ñ‚«‚å
+‚ނ䂤‚т傤
+‚ނ悤
+‚Þ‚æ‚­
+‚ނ炳‚«
+‚ނ炳‚ß
+‚ނ炶‚イ
+‚Þ‚ç‚Í‚¿‚Ô
+‚Þ‚ç‚Ñ‚Æ
+‚Þ‚ç‚â‚­‚Î
+‚Þ‚è
+‚Þ‚è‚»‚­
+‚Þ‚è‚傤
+‚Þ‚è‚å‚­
+‚Þ‚é‚¢
+‚Þ‚ê
+‚Þ‚ë
+‚Þ‚ë‚Ü‚¿
+‚ß
+‚ß‚ ‚Ä
+‚ß‚¢
+‚ß‚¢‚ ‚ñ
+‚ß‚¢‚¢
+‚ß‚¢‚¦‚ñ
+‚ß‚¢‚¨‚¤‚¹‚¢
+‚ß‚¢‚©
+‚ß‚¢‚ª‚ç
+‚ß‚¢‚«
+‚ß‚¢‚¬
+‚ß‚¢‚¬‚¶‚傤
+‚ß‚¢‚¬‚É‚ñ
+‚ß‚¢‚«‚イ
+‚ß‚¢‚«‚傤‚µ‚·‚¢
+‚ß‚¢‚°‚Â
+‚ß‚¢‚°‚ñ
+‚ß‚¢‚±‚¤
+‚ß‚¢‚³‚¢
+‚ß‚¢‚³‚¢‚µ‚å
+‚ß‚¢‚³‚­
+‚ß‚¢‚³‚Â
+‚ß‚¢‚µ
+‚ß‚¢‚¶
+‚ß‚¢‚¶‚Â
+‚ß‚¢‚µ‚ã
+‚ß‚¢‚µ‚å
+‚ß‚¢‚µ‚傤
+‚ß‚¢‚¶‚傤
+‚ß‚¢‚¶‚ñ
+‚ß‚¢‚¹‚¢
+‚ß‚¢‚¹‚«
+‚ß‚¢‚¹‚ñ
+‚ß‚¢‚¾‚¢
+‚ß‚¢‚¿‚á
+‚ß‚¢‚¿‚å
+‚ß‚¢‚Ä‚ñ
+‚ß‚¢‚Ä‚ñ‚ª‚¢
+‚ß‚¢‚Æ
+‚ß‚¢‚Ç
+‚ß‚¢‚Æ‚¤
+‚ß‚¢‚Æ‚­
+‚ß‚¢‚É‚¿
+‚ß‚¢‚Ó‚­
+‚ß‚¢‚Ô‚Â
+‚ß‚¢‚Ô‚ñ
+‚ß‚¢‚Ú
+‚ß‚¢‚Ù‚¤
+‚ß‚¢‚Ú‚¤
+‚ß‚¢‚Ú‚­
+‚ß‚¢‚ß‚¢
+‚ß‚¢‚à‚¤
+‚ß‚¢‚à‚­
+‚ß‚¢‚à‚ñ
+‚ß‚¢‚à‚ñ‚±‚¤
+‚ß‚¢‚䂤
+‚ß‚¢‚æ
+‚ß‚¢‚ë
+‚ß‚¢‚í‚­
+‚ß‚¢‚ñ
+‚ß‚¤‚¦
+‚ß[‚©
+‚ß[‚«‚á‚Á‚Õ
+‚ß[‚½
+‚ß[‚Æ‚é
+‚ß[‚é
+‚ß‚¨‚Æ
+‚ß‚ª
+‚ß‚©‚¯
+‚ß‚ª‚µ‚ç
+‚ß‚©‚½
+‚ß‚©‚É‚¸‚Þ
+‚ß‚ª‚Ë
+‚ß‚ª‚Ý
+‚ß‚®‚·‚è
+‚ß‚®‚Ý
+‚ß‚­‚ç
+‚ß‚­‚ç‚΂ñ
+‚ß‚´‚µ
+‚ß‚´‚Ü‚µ
+‚ß‚µ
+‚ß‚µ‚½
+‚ß‚µ‚‚©‚¢
+‚ß‚¶‚á[
+‚ß‚¶‚è
+‚ß‚·
+‚ß‚»‚Á‚Ç
+‚ß‚¼‚Ë‚Á‚Æ
+‚ß‚¼‚ñ
+‚ß‚½
+‚ß‚½‚Ì[‚é
+‚ß‚¾‚Ü
+‚ß‚¾‚é
+‚ß‚¿‚á‚­‚¿‚á
+‚ß‚¿‚á‚ß‚¿‚á
+‚ß‚¿‚é
+‚ß‚Â
+‚ß‚Á‚©
+‚ß‚Á‚µ‚ã
+‚ß‚Á‚¹[‚¶
+‚ß‚Á‚¹‚ñ‚¶‚á
+‚ß‚Å‚¡‚ 
+‚ß‚Ç
+‚ß‚Æ‚ë
+‚ß‚Æ‚ë‚ۂ肽‚ñ
+‚ß‚É‚ã[
+‚ß‚Ê‚«‚Ç‚¨‚è
+‚߂΂¦
+‚ß‚Í‚È
+‚ß‚Ú‚µ
+‚ß‚à
+‚ß‚à‚¿‚傤
+‚ß‚à‚Æ
+‚ß‚â‚·
+‚ß‚ç‚Ý‚ñ
+‚ß‚è‚Á‚Æ
+‚ß‚è‚â‚·
+‚ß‚ë‚Å‚¡[
+‚ß‚ë‚ñ
+‚ß‚ñ
+‚ß‚ñ‚©
+‚ß‚ñ‚«‚債‚傤
+‚ß‚ñ‚«‚傶‚傤
+‚ß‚ñ‚´‚¢
+‚ß‚ñ‚µ
+‚ß‚ñ‚µ‚«
+‚ß‚ñ‚¶‚傤
+‚ß‚ñ‚º‚ñ
+‚ß‚ñ‚»‚¤
+‚ß‚ñ‚Â
+‚ß‚ñ‚Ä‚¢
+‚ß‚ñ‚Æ
+‚ß‚ñ‚Ç‚¤
+‚ß‚ñ‚Î
+‚ß‚ñ‚Õ
+‚ß‚ñ‚Ú‚¤
+‚ß‚ñ‚Ú‚­
+‚ß‚ñ‚ß‚ñ
+‚ß‚ñ‚悤
+‚ß‚ñ‚é‚¢
+ƒ‚
+‚à
+‚à
+‚à‚¤‚¢
+‚à‚¤‚©
+‚à‚¤‚ª‚Á‚±‚¤
+‚à‚¤‚©‚ñ
+‚à‚¤‚«‚ñ
+‚à‚¤‚±
+‚à‚¤‚±‚ñ
+‚à‚¤‚µ‚±‚Ý
+‚à‚¤‚µ‚±‚Ý‚µ‚å
+‚à‚¤‚µ‚Ô‚ñ
+‚à‚¤‚¶‚á
+‚à‚¤‚¶‚イ
+‚à‚¤‚µ‚å
+‚à‚¤‚¶‚ñ
+‚à‚¤‚Å
+‚à‚¤‚Ä‚ñ
+‚à‚¤‚Ç‚¤‚¯‚ñ
+‚à‚¤‚Ç‚­
+‚à‚¤‚Í‚Â
+‚à‚¤‚ЂÂ
+‚à‚¤‚Ó
+‚à‚¤‚à‚­
+‚à‚¦
+‚à[‚½
+‚à[‚½[
+‚à[‚Ç
+‚à[‚É‚ñ‚®
+‚à[‚ß‚ñ‚Æ
+‚à‚­‚ ‚Ý
+‚à‚­‚¬‚å
+‚à‚­‚°‚«‚µ‚á
+‚à‚­‚´‚¢
+‚à‚­‚¶
+‚à‚­‚µ‚Â
+‚à‚­‚¸
+‚à‚­‚º‚ñ
+‚à‚­‚¼‚¤
+‚à‚­‚½‚ñ
+‚à‚­‚¿‚傤
+‚à‚­‚Ä‚«
+‚à‚­‚Î
+‚à‚­‚Í‚¢
+‚à‚­‚Ђ¯‚ñ
+‚à‚­‚Ђ傤
+‚à‚­‚ß
+‚à‚­‚悤
+‚à‚­‚悤‚Ñ
+‚à‚­‚ê‚ñ
+‚à‚­‚ë‚­
+‚à‚¯‚¢
+‚à‚³
+‚à‚µ
+‚à‚¶
+‚à‚¶‚·‚¤
+‚à‚¶‚Ç‚¨‚è
+‚à‚µ‚à‚µ
+‚à‚¶‚ã[‚é
+‚à‚µ‚傤
+‚à‚¶‚ê‚Â
+‚à‚¸
+‚à‚¼‚¤‚µ
+‚à‚¾‚ñ
+‚à‚¿
+‚à‚¿‚ ‚¶
+‚à‚¿‚¢‚¦
+‚à‚¿[‚Ó
+‚à‚¿‚©‚Ô
+‚à‚¿‚«‚è
+‚à‚¿‚²‚ß
+‚à‚¿‚«
+‚à‚¿‚Î
+‚à‚¿‚Ô‚ñ
+‚à‚¿‚Ü‚¦
+‚à‚¿‚à‚Ì
+‚à‚¿‚イ
+‚à‚Á‚©
+‚à‚Á‚©‚ñ
+‚à‚Á‚±‚¤
+‚à‚Á‚±‚¤‚悤
+‚à‚Á‚½‚¢
+‚à‚Á‚¿‚á‚ñ
+‚à‚Á‚Ä‚±‚¢
+‚à‚Á‚Æ[
+‚à‚Å‚Þ
+‚à‚Æ
+‚à‚Æ‚¢
+‚à‚Æ‚©‚½
+‚à‚Æ‚«
+‚à‚Æ‚«‚ñ
+‚à‚Æ‚²‚¦
+‚à‚Æ‚¶‚ß
+‚à‚Æ‚¿‚傤
+‚à‚Æ‚Å
+‚à‚Æ‚Ç‚¨‚è
+‚à‚Æ‚Ë
+‚à‚Ƃ΂炢
+‚à‚Æ‚Ý‚â
+‚à‚Æ‚à‚Æ
+‚à‚Ì
+‚à‚Ì‚¢‚è
+‚à‚Ì‚¨‚«
+‚à‚Ì‚¨‚Æ
+‚à‚Ì‚¨‚Ú‚¦
+‚à‚Ì‚©‚°
+‚à‚Ì‚ª‚½‚è
+‚à‚Ì‚­‚ë
+‚à‚Ì‚²‚±‚ë
+‚à‚Ì‚²‚µ
+‚à‚Ì‚²‚Æ
+‚à‚Ì‚³‚µ
+‚à‚Ì‚µ‚è
+‚à‚Ì‚Ñ
+‚à‚Ì‚Ü[
+‚à‚Ì‚ç‚é
+‚à‚Ì‚ê[‚é
+‚à‚Ì‚í‚©‚è
+‚à‚Ì‚í‚©‚ê
+‚à‚Ì‚í‚ç‚¢
+‚à‚Í‚ñ
+‚à‚Ó‚­
+‚à‚Ý
+‚à‚Ý‚¶
+‚à‚ß‚ñ
+‚à‚à
+‚à‚à‚¢‚ë
+‚à‚à‚Ђ«
+‚à‚悤
+‚à‚您‚µ‚à‚Ì
+‚à‚æ‚è
+‚à‚ç‚¢
+‚à‚ç‚é
+‚à‚è
+‚à‚è‚ ‚ª‚è
+‚à‚ë
+‚à‚ë‚Ä
+‚à‚ë‚Æ‚à
+‚à‚ë‚à‚ë
+‚à‚ñ
+‚à‚ñ‚¦‚¢
+‚à‚ñ‚©
+‚à‚ñ‚©‚¹‚¢
+‚à‚ñ‚ª‚Ü‚¦
+‚à‚ñ‚­
+‚à‚ñ‚°‚ñ
+‚à‚ñ‚±
+‚à‚ñ‚µ
+‚à‚ñ‚¶‚ã
+‚à‚ñ‚¶‚ñ
+‚à‚ñ‚º‚«
+‚à‚ñ‚º‚ñ
+‚à‚ñ‚½[‚¶‚ã
+‚à‚ñ‚¾‚¢
+‚à‚ñ‚¾‚¢‚Ä‚ñ
+‚à‚ñ‚¿
+‚à‚ñ‚‚«
+‚à‚ñ‚Ä‚¢
+‚à‚ñ‚Æ
+‚à‚ñ‚Æ‚¤
+‚à‚ñ‚Ç‚¤
+‚à‚ñ‚Ç‚±‚ë
+‚à‚ñ‚È‚µ
+‚à‚ñ‚Ò
+‚à‚ñ‚҂傤
+‚à‚ñ‚Ô
+‚à‚ñ‚Ô‚µ‚傤
+‚à‚ñ‚Ô‚¾‚¢‚¶‚ñ
+‚à‚ñ‚ß
+‚à‚ñ‚à‚¤
+ƒƒ
+‚á
+ƒ„
+‚â
+‚â
+‚â‚ 
+‚â[‚Ç
+‚â‚¢‚ñ
+‚₦
+‚₦‚â‚Ü
+‚₨‚à‚Ä
+‚₪‚¢
+‚₪‚­
+‚â‚©‚½
+‚â‚©‚ñ
+‚€
+‚â‚«‚¢‚à
+‚â‚«‚¢‚ñ
+‚â‚«‚É‚­
+‚â‚«‚à‚Ì
+‚â‚«‚イ
+‚€‚傤
+‚â‚«‚ñ
+‚â‚­
+‚â‚­‚¢‚ñ
+‚â‚­‚ª‚¢
+‚â‚­‚ª‚­
+‚â‚­‚ª‚­‚©
+‚â‚­‚ª‚­‚Ô
+‚â‚­‚ª‚Á‚©
+‚â‚­‚ª‚ç
+‚â‚­‚¬
+‚â‚­‚´‚¢
+‚â‚­‚´‚¢‚µ
+‚â‚­‚µ
+‚â‚­‚µ‚á
+‚â‚­‚µ‚å
+‚â‚­‚µ‚å‚­
+‚â‚­‚·‚¤
+‚â‚­‚»‚¤
+‚â‚­‚Ä
+‚â‚­‚Æ‚­
+‚â‚­‚Ç‚µ
+‚â‚­‚É‚ñ
+‚â‚­‚Î
+‚â‚­‚Ñ
+‚â‚­‚Ђñ
+‚â‚­‚Ô‚Â
+‚â‚­‚Ô‚ñ
+‚â‚­‚Ù‚ñ
+‚â‚­‚Ý
+‚â‚­‚ß
+‚â‚­‚悤
+‚â‚®‚é‚Ü
+‚â‚­‚í‚è
+‚₯
+‚₯‚ ‚Æ
+‚₯‚¢
+‚₯‚¢‚µ
+‚₯‚ñ
+‚₲‚¤
+‚₳‚¢
+‚₳‚«
+‚₵
+‚₶
+‚₶‚¤‚Ü
+‚₵‚«
+‚₵‚ã
+‚₶‚イ
+‚₵‚å‚­
+‚₵‚ë
+‚₵‚ñ
+‚₶‚ñ
+‚â‚·
+‚â‚·‚à‚Ì
+‚â‚·‚è
+‚₹‚¢
+‚₹‚ñ
+‚₽‚¢
+‚â‚¿‚æ
+‚â‚¿‚傤
+‚â‚Â
+‚â‚Á‚©
+‚â‚Á‚©‚ñ
+‚â‚Á‚«‚å‚­
+‚â‚Á‚±
+‚â‚Á‚¿‚á‚ñ
+‚â‚Á‚Â
+‚â‚Æ‚¢
+‚â‚Æ‚¢‚É‚ñ
+‚â‚Æ‚¢‚Ê‚µ
+‚â‚Æ‚¤
+‚â‚Ç‚¿‚傤
+‚â‚Ç‚â
+‚â‚È
+‚â‚È‚¬‚²‚µ
+‚â‚È‚Ý
+‚â‚Ê‚µ
+‚â‚Ë
+‚â‚Í‚ñ
+‚â‚΂ñ
+‚â‚Ô
+‚â‚Ú
+‚â‚Ú‚¤
+‚â‚Ü
+‚â‚Ü‚¢
+‚â‚Ü‚¢‚à
+‚â‚Ü‚¨‚­
+‚â‚Ü‚©‚í
+‚â‚Ü‚¬‚í
+‚â‚Ü‚®‚É
+‚â‚Ü‚¯
+‚â‚Ü‚²‚â
+‚â‚Ü‚´‚­‚ç
+‚â‚Ü‚´‚Æ
+‚â‚Ü‚¶
+‚â‚Ü‚·‚»
+‚â‚Ü‚Ä
+‚â‚Ü‚Å‚ç
+‚â‚Ü‚Æ
+‚â‚Ü‚Ì‚Ä
+‚â‚Ü‚Î
+‚â‚Ü‚Í‚¾
+‚â‚Ü‚Ô‚µ
+‚â‚Ü‚×
+‚â‚Ü‚â‚Ü
+‚â‚Ý
+‚â‚Ý‚ ‚ª‚è
+‚â‚݂‚«
+‚â‚æ‚¢
+‚â‚肪‚¢
+‚â‚è‚©‚½
+‚â‚è‚Ä
+‚â‚é‚«
+‚â‚낤
+‚â‚í
+‚â‚í‚Í‚¾
+‚â‚ñ‚®
+ƒ…
+‚ã
+Ġ
+‚ä
+‚ä
+‚ä‚ 
+‚ä‚ ‚©
+‚ä‚ ‚ª‚è
+‚ä‚ ‚Â
+‚ä‚¢‚¢‚Â
+‚ä‚¢‚µ‚å
+‚ä‚¢‚Ì‚¤
+‚ä‚¢‚Ô‚Â
+‚䂤
+‚ä[
+‚䂤‚ ‚¢
+‚䂤‚¢
+‚䂤‚¢‚ñ
+‚䂤‚¤‚Â
+‚䂤‚¦‚«
+‚䂤‚¦‚ñ
+‚䂤‚¦‚ñ‚¿
+‚䂤‚©
+‚䂤‚©‚¢
+‚䂤‚©‚­
+‚䂤‚©‚µ‚傤‚¯‚ñ
+‚䂤‚ª‚½
+‚ä[‚©‚ç
+‚䂤‚©‚ñ
+‚䂤‚«
+‚䂤‚¬
+‚䂤‚«‚イ
+‚䂤‚®
+‚䂤‚®‚ê
+‚䂤‚®‚ñ
+‚䂤‚¯‚¢
+‚䂤‚¯‚ñ
+‚䂤‚°‚ñ
+‚䂤‚¯‚ñ‚µ‚á
+‚䂤‚±‚¤
+‚䂤‚±‚­
+‚ä[‚´
+‚䂤‚´‚¢
+‚䂤‚³‚ñ
+‚䂤‚µ
+‚䂤‚µ‚á
+‚䂤‚µ‚イ
+‚䂤‚µ‚イ‚Ì‚Ñ
+‚䂤‚¶‚å
+‚䂤‚µ‚傤
+‚䂤‚¶‚傤
+‚䂤‚µ‚傤‚«
+‚䂤‚¶‚ñ
+‚ä[‚·
+‚䂤‚·‚¤
+‚䂤‚¹‚¢
+‚䂤‚º‚¢
+‚䂤‚¹‚¢‚µ‚傤
+‚䂤‚¹‚¢‚¾‚¢‚¶‚ñ
+‚䂤‚º‚ñ
+‚䂤‚¹‚ñ‚¯‚ñ
+‚䂤‚¾‚ñ
+‚䂤‚¾‚ñ‚µ‚á
+‚䂤‚¿‚å
+‚ä[‚Ä‚¡‚è‚Ä‚¡
+‚䂤‚Ä‚ñ
+‚䂤‚Å‚ñ‚è‚Â
+‚䂤‚Æ‚¤
+‚䂤‚Æ‚¤‚¹‚¢
+‚䂤‚Æ‚­
+‚䂤‚È‚¬
+‚䂤‚Ì‚¤
+‚䂤‚΂è
+‚䂤‚Ð
+‚䂤‚Ñ
+‚䂤‚Ñ‚ñ
+‚䂤‚Ñ‚ñ‚«‚å‚­
+‚䂤‚Ñ‚ñ‚Ô‚Â
+‚䂤‚Ó‚­
+‚䂤‚×
+‚䂤‚Ù‚¤
+‚䂤‚Ú‚¤
+‚䂤‚Ú‚­
+‚䂤‚Ù‚Ç‚¤
+‚䂤‚ß‚¢‚¶‚ñ
+‚ä[‚à‚ç‚·
+‚䂤‚₯
+‚䂤‚è
+‚䂤‚è‚·‚¤
+‚䂤‚è‚傤
+‚䂤‚è‚å‚­‚µ‚á
+‚䂤‚ê‚¢
+‚䂤‚ê‚Â
+‚ä[‚낾‚ç[
+‚䂦
+‚䂦‚É
+‚䂦‚ñ
+‚ä‚©
+‚ä‚©‚¤‚¦
+‚ä‚©‚µ‚½
+‚ä‚©‚½
+‚ä‚©‚í
+‚䂪‚í
+‚ä‚«
+‚ä‚«‚ª‚©‚è
+‚ä‚«‚®‚É
+‚ä‚«‚³‚«
+‚ä‚«‚Ç‚¯
+‚ä‚«‚Ì‚µ‚½
+‚ä‚«‚â‚Ü
+‚ä‚­‚¦
+‚ä‚­‚·‚¦
+‚ä‚­‚Ä
+‚ä‚°
+‚ä‚´‚¢
+‚䂵‚ã‚Â
+‚䂵‚ã‚‚©
+‚䂵‚ã‚‚ª‚©‚è
+‚䂵‚ã‚‚ɂイ
+‚䂵‚ã‚‚Ô
+‚䂸
+‚䂸‚è
+‚䂹‚¢
+‚ä‚»‚¤
+‚ä‚»‚¤‚«
+‚ä‚»‚¤‚µ‚á
+‚䂾‚â
+‚ä‚¿‚á
+‚ä‚Å‚ñ
+‚ä‚É
+‚ä‚É[‚­
+‚ä‚É‚¨‚ñ
+‚ä‚É‚¹‚Ó
+‚ä‚É‚Á‚Æ
+‚ä‚É‚Î[‚³‚é
+‚ä‚É‚Ó‚§[‚Þ
+‚ä‚ɂイ‚©
+‚ä‚ɂイ‚ª‚©‚è
+‚ä‚ɂイ‚Ô
+‚ä‚Ë‚·‚±
+‚ä‚Ñ
+‚ä‚Ñ‚¨‚è
+‚ä‚Ñ‚³‚«
+‚ä‚Õ‚µ‚ë‚ñ
+‚ä‚Ý
+‚ä‚Ý‚ª‚½
+‚ä‚Ý‚¸
+‚ä‚Ý‚â
+‚ä‚ß
+‚ä‚ß‚¶
+‚ä‚邵
+‚ä‚í‚©‚µ
+‚ä‚í‚©‚µ‚«
+ƒ‡
+‚å
+ƒˆ
+‚æ
+‚æ
+‚æ‚ ‚¯
+‚æ‚¢
+‚æ‚¢‚Ü‚¿‚®‚³
+‚悤
+‚悤‚¢‚ñ
+‚悤‚¦‚«
+‚悤‚©
+‚悤‚ª
+‚悤‚ª‚¢
+‚悤‚ª‚­
+‚悤‚ª‚µ
+‚悤‚©‚ñ
+‚悤‚ª‚ñ
+‚悤‚«
+‚悤‚¬
+‚悤‚¬‚µ‚á
+‚悤‚¬‚å
+‚悤‚«‚å‚­
+‚悤‚®
+‚悤‚¯‚¢
+‚悤‚¯‚ñ
+‚悤‚°‚ñ
+‚悤‚²
+‚悤‚±‚¤
+‚悤‚³‚¢
+‚悤‚´‚¢
+‚悤‚³‚ñ
+‚悤‚µ
+‚悤‚¶
+‚悤‚µ‚«
+‚悤‚µ‚Â
+‚悤‚µ‚ã‚ñ
+‚悤‚µ‚å
+‚悤‚¶‚å
+‚悤‚µ‚傤
+‚悤‚¶‚傤
+‚悤‚µ‚å‚­
+‚悤‚¶‚ñ
+‚悤‚·‚¢
+‚悤‚·‚¢‚ë
+‚悤‚¹‚¢
+‚悤‚¹‚«
+‚悤‚¹‚‚«
+‚悤‚¹‚ñ
+‚悤‚»
+‚悤‚¾‚¢
+‚悤‚¿
+‚悤‚¿‚¦‚ñ
+‚悤‚¿‚イ
+‚悤‚¿‚イ‚¢
+‚悤‚‚¤
+‚悤‚Ä‚ñ
+‚悤‚Ç
+‚悤‚ǂЂñ
+‚悤‚Æ‚ñ
+‚悤‚Ë‚ñ
+‚悤‚΂¢
+‚悤‚Ñ
+‚悤‚Ђñ
+‚悤‚Ó‚¤
+‚悤‚Ó‚­
+‚悤‚Ô‚ñ
+‚悤‚Ú
+‚悤‚Ù‚¤
+‚悤‚Ú‚¤
+‚悤‚Ü
+‚悤‚ß‚¢
+‚悤‚à‚¤
+‚悤‚ç‚ñ
+‚悤‚è‚傤
+‚悤‚è‚å‚­‚»
+‚悤‚ê‚¢
+‚悤‚ê‚«
+‚悤‚낤
+‚悤‚낤‚¢‚ñ
+‚悤‚ë‚­
+‚æ[‚®‚é‚Æ
+‚æ‚©
+‚悪
+‚æ‚©‚ñ
+‚æ‚«‚傤
+‚悬‚è
+‚æ‚«‚ñ‚µ‚á
+‚æ‚­
+‚æ‚­‚©
+‚æ‚­‚°‚Â
+‚æ‚­‚µ‚Â
+‚æ‚­‚µ‚イ
+‚æ‚­‚¶‚傤
+‚æ‚­‚»‚¤
+‚æ‚­‚¿
+‚æ‚­‚¿‚傤
+‚æ‚­‚Ç
+‚æ‚­‚Æ‚­
+‚æ‚­‚Ë‚ñ
+‚æ‚­‚Ú‚¤
+‚æ‚­‚悤
+‚æ‚­‚æ‚­
+‚æ‚°‚ñ
+‚悱
+‚悲
+‚悱‚¤
+‚悱‚ª‚¨
+‚悱‚­‚Ö‚ñ
+‚悱‚¶‚Ü
+‚悱‚ÂÈ
+‚悱‚Ä
+‚悱‚È‚ª
+‚悱‚ß
+‚悱‚â‚è
+‚æ‚´‚¢
+‚悳‚Þ
+‚悳‚ñ
+‚悵
+‚悶
+‚悵‚Ì
+‚悵‚Ý
+‚悶‚傤
+‚悵‚ñ
+‚悶‚ñ
+‚æ‚·‚Ý
+‚悹
+‚悹‚¬
+‚悹‚È‚×
+‚悹‚ñ
+‚æ‚»
+‚æ‚»‚¤‚ª‚¢
+‚悼‚ç
+‚悽
+‚æ‚¿
+‚æ‚¿‚å‚«‚ñ
+‚æ‚Â
+‚æ‚Á‚©
+‚æ‚‚©‚Ç
+‚æ‚‚¬
+‚æ‚Á‚«‚イ‚Ó‚Ü‚ñ
+‚æ‚Á‚¿‚á‚ñ
+‚æ‚Á‚Â
+‚æ‚Á‚Æ
+‚æ‚‚Î
+‚æ‚‚ä
+‚æ‚Ä‚¢‚ª‚¢
+‚æ‚Ä‚¢‚Ђ傤
+‚æ‚Æ‚¤
+‚æ‚È‚©
+‚æ‚Ë‚Â
+‚æ‚Ë‚ñ
+‚æ‚Ì‚È‚©
+‚æ‚Í
+‚æ‚Í‚­
+‚æ‚Ñ‚©‚¯
+‚æ‚Ñ‚«
+‚æ‚Ñ‚±‚¤
+‚æ‚Ñ‚²‚¦
+‚æ‚Ñ‚¾‚µ
+‚æ‚Ñ‚È
+‚æ‚Ñ‚Ý‚¸
+‚æ‚т傤
+‚æ‚Ó‚¯
+‚æ‚Ô‚ñ
+‚æ‚Ý‚©‚½
+‚æ‚Ý‚¹
+‚æ‚Ý‚à‚Ì
+‚æ‚݂傤
+‚æ‚ß‚¢
+‚æ‚à‚¬
+‚æ‚â‚­‚«‚ñ
+‚æ‚â‚Æ‚¤
+‚æ‚䂤
+‚æ‚è‚ ‚¢
+‚æ‚è‚¢‚Æ
+‚æ‚è‚‚«
+‚æ‚è‚Ê‚«
+‚æ‚è‚Ý‚¿
+‚æ‚è‚å‚­
+‚æ‚é
+‚æ‚ë‚¢
+‚æ‚ë‚­
+‚æ‚낸‚â
+‚æ‚ë‚ñ
+‚æ‚í‚«
+‚æ‚킲‚µ
+‚æ‚í‚Ë
+‚æ‚í‚Ý
+‚æ‚í‚Þ‚µ
+‚æ‚ñ‚©
+‚æ‚ñ‚ª‚©‚è
+‚æ‚ñ‚Ô
+‚æ‚ñ‚è‚ñ
+ƒ‰
+‚ç
+‚ç[‚Ç
+‚ç[‚ß‚ñ
+‚ç‚¢‚¤
+‚ç‚¢‚¨‚ñ
+‚ç‚¢‚©
+‚ç‚¢‚©‚ñ
+‚ç‚¢‚«
+‚ç‚¢‚«‚á‚­
+‚ç‚¢‚°‚Â
+‚ç‚¢‚µ‚イ
+‚ç‚¢‚µ‚ñ
+‚ç‚¢‚·
+‚ç‚¢‚¹
+‚ç‚¢‚¹‚ñ‚·
+‚ç‚¢‚½
+‚ç‚¢‚½[
+‚ç‚¢‚¿‚傤
+‚ç‚¢‚Å‚ñ
+‚ç‚¢‚Æ
+‚ç‚¢‚È[
+‚ç‚¢‚Ë‚ñ
+‚ç‚¢‚Ë‚ñ‚Ç
+‚ç‚¢‚Í‚é
+‚ç‚¢‚΂é
+‚ç‚¢‚Ђñ
+‚ç‚¢‚Ó
+‚ç‚¢‚Ô
+‚ç‚¢‚Ô‚ç‚è
+‚ç‚¢‚ӂ邶‚イ
+‚ç‚¢‚ß‚¢
+‚ç‚¢‚è‚ñ
+‚ç‚¢‚ñ
+‚炤‚ñ‚Ç
+‚炪‚ñ
+‚ç‚­
+‚ç‚­‚¢‚ñ
+‚ç‚­‚¦‚ñ
+‚ç‚­‚ª‚¢
+‚ç‚­‚²
+‚ç‚­‚²‚©
+‚ç‚­‚³
+‚ç‚­‚¶‚Â
+‚ç‚­‚¹‚¢‚µ‚«
+‚ç‚­‚¾‚¢‚¹‚¢
+‚ç‚­‚¿‚イ
+‚ç‚­‚Ä‚ñ
+‚ç‚­‚Ì‚¤
+‚ç‚­‚Ñ
+‚ç‚®‚Ñ[
+‚ç‚­‚â‚«
+‚ç‚­‚悤
+‚ç‚­‚悤‚¶‚ã
+‚炶‚¨
+‚炶‚©‚é
+‚炵‚á
+‚炶‚ã[‚Þ
+‚炵‚傤‚à‚ñ
+‚炵‚ñ
+‚炵‚ñ‚΂ñ
+‚ç‚·‚Æ
+‚点‚ñ
+‚炼‚¤
+‚炽‚¢
+‚ç‚Á‚©[
+‚ç‚Á‚©‚¹‚¢
+‚ç‚Á‚©‚ñ
+‚ç‚Á‚­
+‚ç‚Á‚µ‚ã
+‚ç‚‚í‚ñ
+‚ç‚Ä‚¡‚·
+‚ç‚Ñ‚Á‚Æ
+‚ç‚Ó
+‚ç‚Ô
+‚ç‚ׂñ‚¾[
+‚ç‚Ú
+‚ç‚Þ
+‚ç‚Þ‚¾
+‚ç‚Þ‚Ë
+‚ç‚è[
+‚ç‚ñ
+‚ç‚ñ‚¨‚¤
+‚ç‚ñ‚ª‚¢
+‚ç‚ñ‚©‚­
+‚ç‚ñ‚©‚ñ
+‚ç‚ñ‚¬‚傤
+‚ç‚ñ‚«‚è‚イ
+‚ç‚ñ‚µ
+‚ç‚ñ‚¹‚ñ
+‚ç‚ñ‚»‚¤
+‚ç‚ñ‚¾‚Þ
+‚ç‚ñ‚¿
+‚ç‚ñ‚¿‚傤
+‚ç‚ñ‚Ç‚¹‚é
+‚ç‚ñ‚Ç‚è
+‚ç‚ñ‚É‚ñ‚®
+‚ç‚ñ‚Ï‚­
+‚ç‚ñ‚Ò‚Â
+‚ç‚ñ‚Õ
+‚ç‚ñ‚Ú‚¤
+‚ç‚ñ‚Ü
+‚ç‚ñ‚Ü‚ñ
+ƒŠ
+‚è
+‚è
+‚è‚ 
+‚è‚ ‚é
+‚è[‚®
+‚è[‚¾
+‚è[‚¾[
+‚è‚¢‚ñ
+‚è‚©
+‚肪‚¢
+‚è‚©‚ª‚­
+‚肪‚­
+‚肪‚­‚Ô
+‚è‚«
+‚è‚«‚ª‚­
+‚è‚«‚µ
+‚è‚«‚Ä‚ñ
+‚è‚«‚イ
+‚è‚«‚è‚Â
+‚è‚«‚è‚傤
+‚è‚­
+‚è‚­‚ ‚°
+‚è‚­‚¤‚ñ‚«‚å‚­
+‚è‚­‚®‚ñ
+‚è‚­‚¶‚傤
+‚è‚­‚¹‚¢
+‚è‚­‚¿
+‚è‚­‚Â
+‚è‚­‚‚«
+‚è‚­‚肦[‚µ‚å‚ñ
+‚è‚­‚é[‚Æ
+‚è‚­‚ë
+‚肯‚ñ
+‚肱
+‚肱‚¤
+‚肱‚¤‚ª‚­
+‚肳[‚¿
+‚è‚´[‚Ô
+‚肳‚¢‚­‚é
+‚肳‚Â
+‚肵
+‚肶
+‚肶‚¿‚傤
+‚è‚·‚¢
+‚è‚·‚¤
+‚è‚·‚­
+‚肸‚Þ
+‚肹‚¢
+‚è‚»‚¤
+‚è‚»‚¤‚¼‚¤
+‚è‚»‚­
+‚è‚¿
+‚è‚Â
+‚è‚Á‚©
+‚è‚‚«
+‚è‚Á‚«‚傤
+‚è‚Á‚­
+‚è‚Á‚µ‚イ
+‚è‚Á‚µ‚ã‚ñ
+‚è‚Á‚·‚¢
+‚è‚‚¼‚¤
+‚è‚Á‚½‚¢
+‚è‚Á‚¿‚á‚ñ
+‚è‚Á‚Æ‚¤
+‚è‚Á‚Æ‚é
+‚è‚Á‚Õ
+‚è‚Á‚Û‚¤
+‚è‚Á‚Û‚¤‚½‚¢
+‚è‚‚ꂢ
+‚è‚Ä‚¢
+‚è‚Ä‚ñ
+‚è‚ɂイ‚µ‚å‚­
+‚è‚Ë‚ñ
+‚è‚Í[‚³‚é
+‚è‚͂‚Ăñ
+‚è‚Í‚Ñ‚è
+‚è‚Í‚Ñ‚è‚Ä[‚µ‚å
+‚è‚΂炢
+‚è‚Ñ‚ñ‚®
+‚è‚Ô
+‚è‚Ó‚Ÿ‚ê‚ñ‚·
+‚è‚Ó‚§[‚Þ
+‚è‚Ó‚¶‚ñ
+‚è‚Ó‚¾
+‚è‚Ó‚Æ
+‚è‚ׂÁ‚Æ
+‚è‚ׂñ
+‚è‚Û[‚½[
+‚è‚Û[‚Æ
+‚è‚Ú‚ñ
+‚è‚Ü‚í‚è
+‚è‚Ý‚Á‚Æ
+‚è‚à[‚Æ
+‚è‚â
+‚è‚â‚­
+‚è‚á‚­‚ª
+‚è‚á‚­‚¬
+‚è‚á‚­‚²
+‚è‚á‚­‚²‚¤
+‚è‚á‚­‚µ‚«
+‚è‚á‚­‚¸
+‚è‚á‚­‚ê‚«
+‚è‚イ
+‚è‚䂤
+‚è‚イ‚ ‚ñ
+‚è‚イ‚¢‚«
+‚è‚イ‚ª‚­‚¹‚¢
+‚è‚イ‚©‚ñ
+‚è‚イ‚¬
+‚è‚イ‚¯‚Â
+‚è‚イ‚±‚¤‚©
+‚è‚イ‚±‚¤‚²
+‚è‚イ‚³‚ñ
+‚è‚イ‚µ‚傤
+‚è‚イ‚¶‚傤
+‚è‚イ‚¸
+‚è‚イ‚·‚¢
+‚è‚イ‚¹‚¢
+‚è‚イ‚º‚ñ
+‚è‚イ‚¹‚ñ‚¯‚¢
+‚è‚イ‚½‚¢
+‚è‚イ‚¿‚¶‚傤
+‚è‚イ‚Æ‚¤
+‚è‚イ‚Í
+‚è‚イ‚Ђ傤
+‚è‚イ‚×
+‚è‚イ‚Ú‚­
+‚è‚イ‚è‚傤
+‚è‚ã‚Á‚­‚³‚Á‚­
+‚è‚傤
+‚è‚悤
+‚è‚傤‚ ‚µ
+‚è‚傤‚ ‚ñ
+‚è‚傤‚¢‚«
+‚è‚傤‚¢‚ñ‚º‚¢
+‚è‚傤‚¦‚ñ
+‚è‚傤‚©‚¢
+‚è‚傤‚ª‚í
+‚è‚傤‚©‚ñ
+‚è‚傤‚«
+‚è‚傤‚«‚å‚­
+‚è‚傤‚«‚ñ
+‚è‚傤‚«‚ñ‚¶‚å
+‚è‚傤‚­‚¤
+‚è‚傤‚­‚ñ
+‚è‚傤‚¯
+‚è‚傤‚¯‚¢
+‚è‚傤‚¯‚ñ
+‚è‚傤‚±‚­
+‚è‚傤‚²‚­
+‚è‚傤‚³‚¢
+‚è‚傤‚³‚¢‚¯‚ñ‚Ú
+‚è‚傤‚³‚­
+‚è‚傤‚µ
+‚è‚傤‚¶
+‚è‚傤‚¶‚©‚ñ
+‚è‚傤‚µ‚«
+‚è‚傤‚µ‚Â
+‚è‚傤‚¶‚Â
+‚è‚傤‚µ‚á
+‚è‚悤‚µ‚á
+‚è‚傤‚µ‚ã
+‚è‚傤‚µ‚イ‚µ‚å
+‚è‚傤‚µ‚å
+‚è‚傤‚µ‚傤
+‚è‚傤‚µ‚ñ
+‚è‚傤‚·‚¢
+‚è‚傤‚¹‚¢
+‚è‚傤‚¹‚ñ
+‚è‚傤‚¿
+‚è‚傤‚¿‚傤
+‚è‚傤‚Ä
+‚è‚傤‚Ä‚¢
+‚è‚傤‚Ç
+‚è‚傤‚Æ‚¤
+‚è‚傤‚Ç‚¤
+‚è‚傤‚È‚¢
+‚è‚傤‚É‚ñ
+‚è‚傤‚Ë‚ñ
+‚è‚傤‚Í
+‚è‚傤‚Î
+‚è‚傤‚Í‚µ
+‚è‚傤‚Ð
+‚è‚傤‚Ó‚¤
+‚è‚傤‚Ô‚ñ
+‚è‚傤‚Ú
+‚è‚傤‚Ù‚¤
+‚è‚傤‚Ý
+‚è‚傤‚ß
+‚è‚傤‚ß‚ñ
+‚è‚傤‚䂤
+‚è‚傤‚悤
+‚è‚傤‚悤‚¶‚å
+‚è‚傤‚æ‚­
+‚è‚悤‚è‚Â
+‚è‚傤‚è‚ñ
+‚è‚傤‚ë‚ñ
+‚è‚å‚©‚­
+‚è‚å‚©‚­‚¹‚ñ
+‚è‚å‚©‚Á‚«
+‚è‚å‚©‚ñ
+‚è‚å‚­‚¿
+‚è‚å‚­‚¿‚½‚¢
+‚è‚å‚­‚¿‚á
+‚è‚傯‚ñ
+‚è‚債‚イ
+‚è‚傶‚傤
+‚è‚å‚»‚¤
+‚è‚傾‚ñ
+‚è‚å‚Ä‚¢
+‚è‚å‚Ð
+‚è‚è[‚·
+‚è‚è‚Â
+‚è‚ê[‚µ‚å‚È‚é
+‚è‚ê[‚µ‚å‚ñ
+‚è‚ê‚«
+‚è‚ê‚«‚µ‚å
+‚è‚ë
+‚è‚ë‚ñ
+‚è‚ë‚ñ‚©
+‚è‚ñ
+‚è‚ñ‚©
+‚è‚ñ‚©‚¢
+‚è‚ñ‚©‚­
+‚è‚ñ‚ª‚­
+‚è‚ñ‚ª‚Á‚©
+‚è‚ñ‚©‚ñ
+‚è‚ñ‚«
+‚è‚ñ‚¬
+‚è‚ñ‚¬‚µ‚å
+‚è‚ñ‚¬‚傤
+‚è‚ñ‚®
+‚è‚ñ‚°‚Â
+‚è‚ñ‚²
+‚è‚ñ‚±‚¤
+‚è‚ñ‚²‚­
+‚è‚ñ‚³‚ñ
+‚è‚ñ‚¶
+‚è‚ñ‚µ‚Â
+‚è‚ñ‚µ‚傤
+‚è‚ñ‚µ‚å‚­
+‚è‚ñ‚µ‚å‚­‚©
+‚è‚ñ‚¶‚ñ
+‚è‚ñ‚»‚ñ
+‚è‚ñ‚¿
+‚è‚ñ‚¿‚傤
+‚è‚ñ‚Ç‚¤
+‚è‚ñ‚Ï‚¹‚ñ
+‚è‚ñ‚΂ñ
+‚è‚ñ‚т傤
+‚è‚ñ‚Ô
+‚è‚ñ‚â
+‚è‚ñ‚è
+ƒ‹
+‚é
+‚é‚¢
+‚é‚¢‚¬‚²
+‚é‚¢‚¯‚¢
+‚é‚¢‚²
+‚é‚¢‚¶
+‚é‚¢‚µ‚å
+‚é‚¢‚¹‚ñ
+‚é[‚¸
+‚é[‚¿‚ñ
+‚é[‚Æ
+‚é[‚Ó
+‚é[‚Þ
+‚é[‚é
+‚é‚­‚·
+‚é‚‚Ú
+‚é‚Ë‚Á‚³‚ñ‚·
+‚é‚Ñ
+‚é‚è
+ƒŒ
+‚ê
+‚ê‚¢
+‚ê‚¢‚¤
+‚ê‚¢‚¦‚ñ
+‚ê‚¢‚©‚¢
+‚ê‚¢‚ª‚¢
+‚ê‚¢‚©‚ñ
+‚ê‚¢‚«
+‚ê‚¢‚¬
+‚ê‚¢‚«‚á‚­‚«
+‚ê‚¢‚«‚ñ
+‚ê‚¢‚¯‚¢
+‚ê‚¢‚°‚Â
+‚ê‚¢‚±‚ñ
+‚ê‚¢‚³‚¢
+‚ê‚¢‚µ
+‚ê‚¢‚¶
+‚ê‚¢‚µ‚Â
+‚ê‚¢‚¶‚傤
+‚ê‚¢‚¶‚ñ
+‚ê‚¢‚·‚¢
+‚ê‚¢‚¹‚¢
+‚ê‚¢‚¹‚Â
+‚ê‚¢‚¹‚ñ
+‚ê‚¢‚º‚ñ
+‚ê‚¢‚»‚­
+‚ê‚¢‚»‚ñ
+‚ê‚¢‚¾‚¢
+‚ê‚¢‚Ä‚¢
+‚ê‚¢‚Ä‚ñ
+‚ê‚¢‚Ç
+‚ê‚¢‚Æ‚¤‚«
+‚ê‚¢‚Ë‚Â
+‚ê‚¢‚Ë‚ñ
+‚ê‚¢‚΂¢
+‚ê‚¢‚Ó‚­
+‚ê‚¢‚Ó‚¶‚ñ
+‚ê‚¢‚Ô‚ñ
+‚ê‚¢‚Ù‚¤
+‚ê‚¢‚è‚傤
+‚ê‚¢‚ñ
+‚ê‚¢‚ñ‚Ú[
+‚ê[‚ ‚¤‚Æ
+‚ê[‚´
+‚ê[‚µ‚å‚ñ
+‚ê[‚·
+‚ê[‚¾
+‚ê[‚Æ
+‚ê[‚æ‚ñ
+‚ê[‚é
+‚ê‚«
+‚ê‚«‚µ
+‚ê‚«‚µ‚¶‚傤
+‚ê‚«‚¹‚¢
+‚ê‚«‚¹‚ñ
+‚ê‚«‚¾‚¢
+‚ê‚«‚Ë‚ñ
+‚ꂬ‚ã‚ç[
+‚ê‚«‚ê‚«
+‚ꂱ[‚¾
+‚ꂱ[‚Ç
+‚ê‚´[
+‚ꂶ
+‚ꂵ[‚Æ
+‚ꂵ[‚Î
+‚ꂵ[‚Ô
+‚ꂶ‚·‚½[
+‚ê‚·
+‚ê‚·‚Æ‚ç‚ñ
+‚ê‚·‚è‚ñ‚®
+‚ꂹ‚Õ‚µ‚å‚ñ
+‚ꂽ[
+‚ꂽ‚·
+‚ꂽ‚è‚ñ‚®
+‚ê‚Á‚«‚傤
+‚ê‚Á‚±‚­
+‚ê‚‚¶‚Â
+‚ê‚Á‚µ‚á
+‚ê‚Á‚µ‚傤
+‚ê‚‚¶‚傤
+‚ê‚Á‚µ‚ñ
+‚ê‚Á‚¹‚¢
+‚ê‚Á‚Ä‚é
+‚ê‚‚łñ
+‚ê‚Á‚Ç
+‚ê‚Á‚Æ‚¤
+‚ê‚Á‚Æ‚¤‚¹‚¢
+‚ê‚Á‚Ï‚¢
+‚ê‚Å‚¡
+‚ê‚Å‚¡[
+‚ê‚Î[
+‚ê‚Ó
+‚ê‚Ó‚Æ
+‚ê‚ׂé
+‚ê‚à‚ñ
+‚ê‚ñ‚©
+‚ê‚ñ‚ª
+‚ê‚ñ‚«‚イ
+‚ê‚ñ‚°
+‚ê‚ñ‚²
+‚ê‚ñ‚²‚¤
+‚ê‚ñ‚²‚¤‚±‚­
+‚ê‚ñ‚³
+‚ê‚ñ‚´‚ñ
+‚ê‚ñ‚µ
+‚ê‚ñ‚¶
+‚ê‚ñ‚¶‚Â
+‚ê‚ñ‚¶‚ã
+‚ê‚ñ‚µ‚イ‚¶‚傤
+‚ê‚ñ‚½
+‚ê‚ñ‚½‚¢
+‚ê‚ñ‚½‚¢‚µ
+‚ê‚ñ‚½‚é
+‚ê‚ñ‚½‚ñ
+‚ê‚ñ‚¿‚イ
+‚ê‚ñ‚À‚イ
+‚ê‚ñ‚ɂイ
+‚ê‚ñ‚Ë‚ñ
+‚ê‚ñ‚Ï‚ñ
+‚ê‚ñ‚Û‚¤
+‚ê‚ñ‚ß‚¢
+‚ê‚ñ‚â
+‚ê‚ñ‚ç‚­‚³‚«
+‚ê‚ñ‚è
+‚ë
+‚ë
+‚ë‚¢‚Ç
+‚ë‚¢‚â‚è‚Ä‚¡
+‚ë‚¢‚â‚é
+‚낤
+‚낤‚ 
+‚낤‚©
+‚낤‚©‚­
+‚낤‚ª‚Á‚±‚¤
+‚낤‚ª‚ñ
+‚낤‚«‚«‚å‚­
+‚낤‚«‚µ‚å
+‚낤‚«‚Ù‚¤
+‚낤‚«‚å‚­
+‚낤‚«‚ñ
+‚낤‚­
+‚낤‚²
+‚낤‚²‚­
+‚낤‚±‚Â
+‚낤‚³‚¢
+‚낤‚µ
+‚낤‚¶‚ã
+‚낤‚µ‚イ
+‚낤‚¶‚å
+‚낤‚µ‚傤
+‚낤‚¶‚傤
+‚낤‚¶‚ñ
+‚낤‚»
+‚낤‚»‚­
+‚낤‚½‚¢
+‚낤‚¿‚ñ
+‚낤‚Æ
+‚낤‚Ç‚¤‚µ‚á
+‚낤‚Ç‚¤‚µ‚傤
+‚낤‚É‚á‚­‚È‚ñ‚É
+‚낤‚Ë‚ñ
+‚낤‚Î
+‚낤‚Ђ©
+‚낤‚Ó
+‚낤‚Ú
+‚낤‚Ù‚¤
+‚낤‚Ü‚ñ
+‚낤‚Þ
+‚낤‚Þ‚©
+‚낤‚Þ‚ª‚©‚è
+‚낤‚Þ‚«‚å‚­
+‚낤‚Þ‚µ
+‚낤‚Þ‚Ô
+‚낤‚ê‚¢
+‚낤‚ê‚ñ
+‚ë[
+‚ë[‚©‚é
+‚ë[‚¸
+‚ë[‚½‚è
+‚ë[‚½‚è[
+‚ë[‚Õ
+‚ë[‚Ü‚¶
+‚ë[‚ç
+‚ë[‚ñ
+‚ë‚©‚µ
+‚ë‚©‚½
+‚났‚ñ
+‚ë‚­‚¨‚ñ‚«
+‚ë‚­‚ª‚Â
+‚ë‚­‚µ‚傤
+‚ë‚­‚Ü‚­
+‚낯[‚µ‚å‚ñ
+‚낯‚Á‚Æ
+‚낲
+‚낶
+‚낵‚ ‚²
+‚낶‚傤
+‚낵‚ñ
+‚낹‚ñ
+‚ë‚Á‚©[
+‚ë‚Á‚©‚­
+‚ë‚Á‚±‚Â
+‚ë‚Á‚¶
+‚ë‚Á‚Æ
+‚ë‚Á‚Û‚¤
+‚ë‚Ä‚¢
+‚ë‚Ä‚ñ
+‚ë‚Ä‚ñ‚µ‚傤
+‚ë‚΂½
+‚ë‚΂ñ
+‚ë‚Ñ[
+‚ë‚Ђ傤
+‚ë‚Ú‚¤
+‚ë‚Ú‚Á‚Æ
+‚ë‚Ü‚ñ
+‚ë‚ß‚ñ
+‚ë‚ñ
+‚ë‚ñ‚«‚å
+‚ë‚ñ‚®
+‚ë‚ñ‚²
+‚ë‚ñ‚±‚¤
+‚ë‚ñ‚µ
+‚ë‚ñ‚¾‚ñ
+‚ë‚ñ‚¿‚傤
+‚ë‚ñ‚Ä‚ñ
+‚ë‚ñ‚Ô‚ñ
+‚ë‚ñ‚Û‚¤
+‚ë‚ñ‚è
+‚ë‚ñ‚肪‚­
+ƒŽ
+‚ì
+‚í
+‚í[‚­
+‚í[‚·‚Æ
+‚í[‚Ç
+‚í[‚ǂՂ낹‚Á‚³
+‚í[‚Õ‚ë
+‚í[‚é‚Ç
+‚í‚¢
+‚í‚¢‚Ç
+‚í‚¢‚Ó
+‚í‚¢‚â
+‚í‚¢‚è‚Â
+‚í‚¢‚é‚Ç
+‚í‚¢‚ë
+‚í‚¢‚ñ
+‚킨‚ñ
+‚í‚©
+‚í‚©‚¬
+‚í‚©‚®
+‚í‚©‚­‚³
+‚킪‚­‚É
+‚í‚©‚°
+‚킪‚µ
+‚í‚©‚¼‚¤
+‚í‚©‚½‚¯
+‚í‚©‚ÂÜ
+‚í‚©‚Ä
+‚í‚©‚È
+‚í‚©‚Î
+‚í‚©‚Ü‚Â
+‚킪‚Ü‚Ü
+‚킪‚Ý
+‚í‚©‚Ý‚¸
+‚í‚©‚Ý‚â
+‚í‚©‚ß
+‚í‚©‚à‚Ì
+‚í‚©‚ê‚Ý‚¿
+‚í‚©‚ê‚ß
+‚í‚©‚ñ
+‚í‚«
+‚킬
+‚í‚«‚¯
+‚í‚«‚΂ç
+‚í‚«‚ß
+‚í‚«‚â‚­
+‚킬‚イ
+‚킬‚è
+‚í‚­
+‚í‚­‚ª‚¢
+‚í‚­‚¹‚¢
+‚í‚­‚È‚¢
+‚킯
+‚킯‚ß
+‚킱‚¤
+‚킱‚¤‚Ç
+‚킱‚­
+‚킲‚Þ
+‚í‚´
+‚킳‚¢
+‚킳‚Ñ
+‚í‚´‚í‚¢
+‚킵
+‚킵‚«
+‚킵‚Â
+‚킵‚å‚­
+‚킵‚ñ
+‚킹
+‚킹‚¢
+‚킹‚¾
+‚킹‚ñ
+‚킽
+‚킽‚­‚µ
+‚킽‚­‚µ‚²‚Æ
+‚킽‚µ
+‚킽‚µ‚Ô‚Ë
+‚킽‚µ‚ç
+‚킾‚¿
+‚킽‚è‚Ç‚è
+‚í‚Á‚­‚·
+‚í‚Á‚µ‚á
+‚í‚Á‚Æ
+‚í‚Á‚Ø‚ñ
+‚í‚È
+‚í‚É
+‚í‚É‚·
+‚í‚Ñ‚¶‚傤
+‚í‚Ó‚¤
+‚í‚Ó‚­
+‚í‚Ô‚ñ
+‚í‚Ö‚¢
+‚í‚悤
+‚í‚ç
+‚í‚ç‚­
+‚í‚ç‚΂ñ‚µ
+‚í‚ç‚Ñ
+‚í‚ç‚Ô‚«
+‚í‚ç‚×
+‚í‚è
+‚í‚è‚ ‚¢
+‚í‚肱‚Ý
+‚í‚è‚´‚ñ
+‚í‚è‚‚¯
+‚í‚è‚΂µ
+‚í‚è‚Ñ‚«
+‚í‚è‚Ñ‚«‚¯‚ñ
+‚í‚è‚Ñ‚«‚è‚Â
+‚í‚è‚Ü‚¦
+‚í‚è‚Ü‚µ
+‚í‚è‚à‚Ç‚µ
+‚í‚é
+‚í‚邬
+‚í‚é‚­‚¿
+‚í‚é‚Â
+‚í‚ê
+‚í‚ꂵ‚炸
+‚í‚ê‚È‚ª‚ç
+‚í‚ê‚ß
+‚í‚ê‚ç
+‚í‚ê‚í‚ê
+‚í‚ñ
+‚í‚ñ‚µ‚傤
+‚í‚ñ‚È‚¢
+‚í‚ñ‚Ü‚ñ
+‚í‚ñ‚è‚å‚­
+‚î
+ƒ‘
+‚ï
+ƒ’
+‚ð
+‚ð
+
diff --git a/private/oleauto/sample/nlssort/source.chs b/private/oleauto/sample/nlssort/source.chs
new file mode 100644
index 000000000..8a329bff3
--- /dev/null
+++ b/private/oleauto/sample/nlssort/source.chs
@@ -0,0 +1,6763 @@
+°þ 0xb0fe
+°ý 0xb0fd
+°ü 0xb0fc
+°û 0xb0fb
+°ú 0xb0fa
+°ù 0xb0f9
+°ø 0xb0f8
+°÷ 0xb0f7
+°ö 0xb0f6
+°õ 0xb0f5
+°ô 0xb0f4
+°ó 0xb0f3
+°ò 0xb0f2
+°ñ 0xb0f1
+°ð 0xb0f0
+°ï 0xb0ef
+°î 0xb0ee
+°í 0xb0ed
+°ì 0xb0ec
+°ë 0xb0eb
+°ê 0xb0ea
+°é 0xb0e9
+°è 0xb0e8
+°ç 0xb0e7
+°æ 0xb0e6
+°å 0xb0e5
+°ä 0xb0e4
+°ã 0xb0e3
+°â 0xb0e2
+°á 0xb0e1
+°à 0xb0e0
+°ß 0xb0df
+°Þ 0xb0de
+°Ý 0xb0dd
+°Ü 0xb0dc
+°Û 0xb0db
+°Ú 0xb0da
+°Ù 0xb0d9
+°Ø 0xb0d8
+°× 0xb0d7
+°Ö 0xb0d6
+°Õ 0xb0d5
+°Ô 0xb0d4
+°Ó 0xb0d3
+°Ò 0xb0d2
+°Ñ 0xb0d1
+°Ð 0xb0d0
+°Ï 0xb0cf
+°Î 0xb0ce
+°Í 0xb0cd
+°Ì 0xb0cc
+°Ë 0xb0cb
+°Ê 0xb0ca
+°É 0xb0c9
+°È 0xb0c8
+°Ç 0xb0c7
+°Æ 0xb0c6
+°Å 0xb0c5
+°Ä 0xb0c4
+°Ã 0xb0c3
+°Â 0xb0c2
+°Á 0xb0c1
+°À 0xb0c0
+°¿ 0xb0bf
+°¾ 0xb0be
+°½ 0xb0bd
+°¼ 0xb0bc
+°» 0xb0bb
+°º 0xb0ba
+°¹ 0xb0b9
+°¸ 0xb0b8
+°· 0xb0b7
+°¶ 0xb0b6
+°µ 0xb0b5
+°´ 0xb0b4
+°³ 0xb0b3
+°² 0xb0b2
+°± 0xb0b1
+°° 0xb0b0
+°¯ 0xb0af
+°® 0xb0ae
+°­ 0xb0ad
+°¬ 0xb0ac
+°« 0xb0ab
+°ª 0xb0aa
+°© 0xb0a9
+°¨ 0xb0a8
+°§ 0xb0a7
+°¦ 0xb0a6
+°¥ 0xb0a5
+°¤ 0xb0a4
+°£ 0xb0a3
+°¢ 0xb0a2
+°¡ 0xb0a1
+±þ 0xb1fe
+±ý 0xb1fd
+±ü 0xb1fc
+±û 0xb1fb
+±ú 0xb1fa
+±ù 0xb1f9
+±ø 0xb1f8
+±÷ 0xb1f7
+±ö 0xb1f6
+±õ 0xb1f5
+±ô 0xb1f4
+±ó 0xb1f3
+±ò 0xb1f2
+±ñ 0xb1f1
+±ð 0xb1f0
+±ï 0xb1ef
+±î 0xb1ee
+±í 0xb1ed
+±ì 0xb1ec
+±ë 0xb1eb
+±ê 0xb1ea
+±é 0xb1e9
+±è 0xb1e8
+±ç 0xb1e7
+±æ 0xb1e6
+±å 0xb1e5
+±ä 0xb1e4
+±ã 0xb1e3
+±â 0xb1e2
+±á 0xb1e1
+±à 0xb1e0
+±ß 0xb1df
+±Þ 0xb1de
+±Ý 0xb1dd
+±Ü 0xb1dc
+±Û 0xb1db
+±Ú 0xb1da
+±Ù 0xb1d9
+±Ø 0xb1d8
+±× 0xb1d7
+±Ö 0xb1d6
+±Õ 0xb1d5
+±Ô 0xb1d4
+±Ó 0xb1d3
+±Ò 0xb1d2
+±Ñ 0xb1d1
+±Ð 0xb1d0
+±Ï 0xb1cf
+±Î 0xb1ce
+±Í 0xb1cd
+±Ì 0xb1cc
+±Ë 0xb1cb
+±Ê 0xb1ca
+±É 0xb1c9
+±È 0xb1c8
+±Ç 0xb1c7
+±Æ 0xb1c6
+±Å 0xb1c5
+±Ä 0xb1c4
+±Ã 0xb1c3
+±Â 0xb1c2
+±Á 0xb1c1
+±À 0xb1c0
+±¿ 0xb1bf
+±¾ 0xb1be
+±½ 0xb1bd
+±¼ 0xb1bc
+±» 0xb1bb
+±º 0xb1ba
+±¹ 0xb1b9
+±¸ 0xb1b8
+±· 0xb1b7
+±¶ 0xb1b6
+±µ 0xb1b5
+±´ 0xb1b4
+±³ 0xb1b3
+±² 0xb1b2
+±± 0xb1b1
+±° 0xb1b0
+±¯ 0xb1af
+±® 0xb1ae
+±­ 0xb1ad
+±¬ 0xb1ac
+±« 0xb1ab
+±ª 0xb1aa
+±© 0xb1a9
+±¨ 0xb1a8
+±§ 0xb1a7
+±¦ 0xb1a6
+±¥ 0xb1a5
+±¤ 0xb1a4
+±£ 0xb1a3
+±¢ 0xb1a2
+±¡ 0xb1a1
+²þ 0xb2fe
+²ý 0xb2fd
+²ü 0xb2fc
+²û 0xb2fb
+²ú 0xb2fa
+²ù 0xb2f9
+²ø 0xb2f8
+²÷ 0xb2f7
+²ö 0xb2f6
+²õ 0xb2f5
+²ô 0xb2f4
+²ó 0xb2f3
+²ò 0xb2f2
+²ñ 0xb2f1
+²ð 0xb2f0
+²ï 0xb2ef
+²î 0xb2ee
+²í 0xb2ed
+²ì 0xb2ec
+²ë 0xb2eb
+²ê 0xb2ea
+²é 0xb2e9
+²è 0xb2e8
+²ç 0xb2e7
+²æ 0xb2e6
+²å 0xb2e5
+²ä 0xb2e4
+²ã 0xb2e3
+²â 0xb2e2
+²á 0xb2e1
+²à 0xb2e0
+²ß 0xb2df
+²Þ 0xb2de
+²Ý 0xb2dd
+²Ü 0xb2dc
+²Û 0xb2db
+²Ú 0xb2da
+²Ù 0xb2d9
+²Ø 0xb2d8
+²× 0xb2d7
+²Ö 0xb2d6
+²Õ 0xb2d5
+²Ô 0xb2d4
+²Ó 0xb2d3
+²Ò 0xb2d2
+²Ñ 0xb2d1
+²Ð 0xb2d0
+²Ï 0xb2cf
+²Î 0xb2ce
+²Í 0xb2cd
+²Ì 0xb2cc
+²Ë 0xb2cb
+²Ê 0xb2ca
+²É 0xb2c9
+²È 0xb2c8
+²Ç 0xb2c7
+²Æ 0xb2c6
+²Å 0xb2c5
+²Ä 0xb2c4
+²Ã 0xb2c3
+²Â 0xb2c2
+²Á 0xb2c1
+²À 0xb2c0
+²¿ 0xb2bf
+²¾ 0xb2be
+²½ 0xb2bd
+²¼ 0xb2bc
+²» 0xb2bb
+²º 0xb2ba
+²¹ 0xb2b9
+²¸ 0xb2b8
+²· 0xb2b7
+²¶ 0xb2b6
+²µ 0xb2b5
+²´ 0xb2b4
+²³ 0xb2b3
+²² 0xb2b2
+²± 0xb2b1
+²° 0xb2b0
+²¯ 0xb2af
+²® 0xb2ae
+²­ 0xb2ad
+²¬ 0xb2ac
+²« 0xb2ab
+²ª 0xb2aa
+²© 0xb2a9
+²¨ 0xb2a8
+²§ 0xb2a7
+²¦ 0xb2a6
+²¥ 0xb2a5
+²¤ 0xb2a4
+²£ 0xb2a3
+²¢ 0xb2a2
+²¡ 0xb2a1
+³þ 0xb3fe
+³ý 0xb3fd
+³ü 0xb3fc
+³û 0xb3fb
+³ú 0xb3fa
+³ù 0xb3f9
+³ø 0xb3f8
+³÷ 0xb3f7
+³ö 0xb3f6
+³õ 0xb3f5
+³ô 0xb3f4
+³ó 0xb3f3
+³ò 0xb3f2
+³ñ 0xb3f1
+³ð 0xb3f0
+³ï 0xb3ef
+³î 0xb3ee
+³í 0xb3ed
+³ì 0xb3ec
+³ë 0xb3eb
+³ê 0xb3ea
+³é 0xb3e9
+³è 0xb3e8
+³ç 0xb3e7
+³æ 0xb3e6
+³å 0xb3e5
+³ä 0xb3e4
+³ã 0xb3e3
+³â 0xb3e2
+³á 0xb3e1
+³à 0xb3e0
+³ß 0xb3df
+³Þ 0xb3de
+³Ý 0xb3dd
+³Ü 0xb3dc
+³Û 0xb3db
+³Ú 0xb3da
+³Ù 0xb3d9
+³Ø 0xb3d8
+³× 0xb3d7
+³Ö 0xb3d6
+³Õ 0xb3d5
+³Ô 0xb3d4
+³Ó 0xb3d3
+³Ò 0xb3d2
+³Ñ 0xb3d1
+³Ð 0xb3d0
+³Ï 0xb3cf
+³Î 0xb3ce
+³Í 0xb3cd
+³Ì 0xb3cc
+³Ë 0xb3cb
+³Ê 0xb3ca
+³É 0xb3c9
+³È 0xb3c8
+³Ç 0xb3c7
+³Æ 0xb3c6
+³Å 0xb3c5
+³Ä 0xb3c4
+³Ã 0xb3c3
+³Â 0xb3c2
+³Á 0xb3c1
+³À 0xb3c0
+³¿ 0xb3bf
+³¾ 0xb3be
+³½ 0xb3bd
+³¼ 0xb3bc
+³» 0xb3bb
+³º 0xb3ba
+³¹ 0xb3b9
+³¸ 0xb3b8
+³· 0xb3b7
+³¶ 0xb3b6
+³µ 0xb3b5
+³´ 0xb3b4
+³³ 0xb3b3
+³² 0xb3b2
+³± 0xb3b1
+³° 0xb3b0
+³¯ 0xb3af
+³® 0xb3ae
+³­ 0xb3ad
+³¬ 0xb3ac
+³« 0xb3ab
+³ª 0xb3aa
+³© 0xb3a9
+³¨ 0xb3a8
+³§ 0xb3a7
+³¦ 0xb3a6
+³¥ 0xb3a5
+³¤ 0xb3a4
+³£ 0xb3a3
+³¢ 0xb3a2
+³¡ 0xb3a1
+´þ 0xb4fe
+´ý 0xb4fd
+´ü 0xb4fc
+´û 0xb4fb
+´ú 0xb4fa
+´ù 0xb4f9
+´ø 0xb4f8
+´÷ 0xb4f7
+´ö 0xb4f6
+´õ 0xb4f5
+´ô 0xb4f4
+´ó 0xb4f3
+´ò 0xb4f2
+´ñ 0xb4f1
+´ð 0xb4f0
+´ï 0xb4ef
+´î 0xb4ee
+´í 0xb4ed
+´ì 0xb4ec
+´ë 0xb4eb
+´ê 0xb4ea
+´é 0xb4e9
+´è 0xb4e8
+´ç 0xb4e7
+´æ 0xb4e6
+´å 0xb4e5
+´ä 0xb4e4
+´ã 0xb4e3
+´â 0xb4e2
+´á 0xb4e1
+´à 0xb4e0
+´ß 0xb4df
+´Þ 0xb4de
+´Ý 0xb4dd
+´Ü 0xb4dc
+´Û 0xb4db
+´Ú 0xb4da
+´Ù 0xb4d9
+´Ø 0xb4d8
+´× 0xb4d7
+´Ö 0xb4d6
+´Õ 0xb4d5
+´Ô 0xb4d4
+´Ó 0xb4d3
+´Ò 0xb4d2
+´Ñ 0xb4d1
+´Ð 0xb4d0
+´Ï 0xb4cf
+´Î 0xb4ce
+´Í 0xb4cd
+´Ì 0xb4cc
+´Ë 0xb4cb
+´Ê 0xb4ca
+´É 0xb4c9
+´È 0xb4c8
+´Ç 0xb4c7
+´Æ 0xb4c6
+´Å 0xb4c5
+´Ä 0xb4c4
+´Ã 0xb4c3
+´Â 0xb4c2
+´Á 0xb4c1
+´À 0xb4c0
+´¿ 0xb4bf
+´¾ 0xb4be
+´½ 0xb4bd
+´¼ 0xb4bc
+´» 0xb4bb
+´º 0xb4ba
+´¹ 0xb4b9
+´¸ 0xb4b8
+´· 0xb4b7
+´¶ 0xb4b6
+´µ 0xb4b5
+´´ 0xb4b4
+´³ 0xb4b3
+´² 0xb4b2
+´± 0xb4b1
+´° 0xb4b0
+´¯ 0xb4af
+´® 0xb4ae
+´­ 0xb4ad
+´¬ 0xb4ac
+´« 0xb4ab
+´ª 0xb4aa
+´© 0xb4a9
+´¨ 0xb4a8
+´§ 0xb4a7
+´¦ 0xb4a6
+´¥ 0xb4a5
+´¤ 0xb4a4
+´£ 0xb4a3
+´¢ 0xb4a2
+´¡ 0xb4a1
+µþ 0xb5fe
+µý 0xb5fd
+µü 0xb5fc
+µû 0xb5fb
+µú 0xb5fa
+µù 0xb5f9
+µø 0xb5f8
+µ÷ 0xb5f7
+µö 0xb5f6
+µõ 0xb5f5
+µô 0xb5f4
+µó 0xb5f3
+µò 0xb5f2
+µñ 0xb5f1
+µð 0xb5f0
+µï 0xb5ef
+µî 0xb5ee
+µí 0xb5ed
+µì 0xb5ec
+µë 0xb5eb
+µê 0xb5ea
+µé 0xb5e9
+µè 0xb5e8
+µç 0xb5e7
+µæ 0xb5e6
+µå 0xb5e5
+µä 0xb5e4
+µã 0xb5e3
+µâ 0xb5e2
+µá 0xb5e1
+µà 0xb5e0
+µß 0xb5df
+µÞ 0xb5de
+µÝ 0xb5dd
+µÜ 0xb5dc
+µÛ 0xb5db
+µÚ 0xb5da
+µÙ 0xb5d9
+µØ 0xb5d8
+µ× 0xb5d7
+µÖ 0xb5d6
+µÕ 0xb5d5
+µÔ 0xb5d4
+µÓ 0xb5d3
+µÒ 0xb5d2
+µÑ 0xb5d1
+µÐ 0xb5d0
+µÏ 0xb5cf
+µÎ 0xb5ce
+µÍ 0xb5cd
+µÌ 0xb5cc
+µË 0xb5cb
+µÊ 0xb5ca
+µÉ 0xb5c9
+µÈ 0xb5c8
+µÇ 0xb5c7
+µÆ 0xb5c6
+µÅ 0xb5c5
+µÄ 0xb5c4
+µÃ 0xb5c3
+µÂ 0xb5c2
+µÁ 0xb5c1
+µÀ 0xb5c0
+µ¿ 0xb5bf
+µ¾ 0xb5be
+µ½ 0xb5bd
+µ¼ 0xb5bc
+µ» 0xb5bb
+µº 0xb5ba
+µ¹ 0xb5b9
+µ¸ 0xb5b8
+µ· 0xb5b7
+µ¶ 0xb5b6
+µµ 0xb5b5
+µ´ 0xb5b4
+µ³ 0xb5b3
+µ² 0xb5b2
+µ± 0xb5b1
+µ° 0xb5b0
+µ¯ 0xb5af
+µ® 0xb5ae
+µ­ 0xb5ad
+µ¬ 0xb5ac
+µ« 0xb5ab
+µª 0xb5aa
+µ© 0xb5a9
+µ¨ 0xb5a8
+µ§ 0xb5a7
+µ¦ 0xb5a6
+µ¥ 0xb5a5
+µ¤ 0xb5a4
+µ£ 0xb5a3
+µ¢ 0xb5a2
+µ¡ 0xb5a1
+¶þ 0xb6fe
+¶ý 0xb6fd
+¶ü 0xb6fc
+¶û 0xb6fb
+¶ú 0xb6fa
+¶ù 0xb6f9
+¶ø 0xb6f8
+¶÷ 0xb6f7
+¶ö 0xb6f6
+¶õ 0xb6f5
+¶ô 0xb6f4
+¶ó 0xb6f3
+¶ò 0xb6f2
+¶ñ 0xb6f1
+¶ð 0xb6f0
+¶ï 0xb6ef
+¶î 0xb6ee
+¶í 0xb6ed
+¶ì 0xb6ec
+¶ë 0xb6eb
+¶ê 0xb6ea
+¶é 0xb6e9
+¶è 0xb6e8
+¶ç 0xb6e7
+¶æ 0xb6e6
+¶å 0xb6e5
+¶ä 0xb6e4
+¶ã 0xb6e3
+¶â 0xb6e2
+¶á 0xb6e1
+¶à 0xb6e0
+¶ß 0xb6df
+¶Þ 0xb6de
+¶Ý 0xb6dd
+¶Ü 0xb6dc
+¶Û 0xb6db
+¶Ú 0xb6da
+¶Ù 0xb6d9
+¶Ø 0xb6d8
+¶× 0xb6d7
+¶Ö 0xb6d6
+¶Õ 0xb6d5
+¶Ô 0xb6d4
+¶Ó 0xb6d3
+¶Ò 0xb6d2
+¶Ñ 0xb6d1
+¶Ð 0xb6d0
+¶Ï 0xb6cf
+¶Î 0xb6ce
+¶Í 0xb6cd
+¶Ì 0xb6cc
+¶Ë 0xb6cb
+¶Ê 0xb6ca
+¶É 0xb6c9
+¶È 0xb6c8
+¶Ç 0xb6c7
+¶Æ 0xb6c6
+¶Å 0xb6c5
+¶Ä 0xb6c4
+¶Ã 0xb6c3
+¶Â 0xb6c2
+¶Á 0xb6c1
+¶À 0xb6c0
+¶¿ 0xb6bf
+¶¾ 0xb6be
+¶½ 0xb6bd
+¶¼ 0xb6bc
+¶» 0xb6bb
+¶º 0xb6ba
+¶¹ 0xb6b9
+¶¸ 0xb6b8
+¶· 0xb6b7
+¶¶ 0xb6b6
+¶µ 0xb6b5
+¶´ 0xb6b4
+¶³ 0xb6b3
+¶² 0xb6b2
+¶± 0xb6b1
+¶° 0xb6b0
+¶¯ 0xb6af
+¶® 0xb6ae
+¶­ 0xb6ad
+¶¬ 0xb6ac
+¶« 0xb6ab
+¶ª 0xb6aa
+¶© 0xb6a9
+¶¨ 0xb6a8
+¶§ 0xb6a7
+¶¦ 0xb6a6
+¶¥ 0xb6a5
+¶¤ 0xb6a4
+¶£ 0xb6a3
+¶¢ 0xb6a2
+¶¡ 0xb6a1
+·þ 0xb7fe
+·ý 0xb7fd
+·ü 0xb7fc
+·û 0xb7fb
+·ú 0xb7fa
+·ù 0xb7f9
+·ø 0xb7f8
+·÷ 0xb7f7
+·ö 0xb7f6
+·õ 0xb7f5
+·ô 0xb7f4
+·ó 0xb7f3
+·ò 0xb7f2
+·ñ 0xb7f1
+·ð 0xb7f0
+·ï 0xb7ef
+·î 0xb7ee
+·í 0xb7ed
+·ì 0xb7ec
+·ë 0xb7eb
+·ê 0xb7ea
+·é 0xb7e9
+·è 0xb7e8
+·ç 0xb7e7
+·æ 0xb7e6
+·å 0xb7e5
+·ä 0xb7e4
+·ã 0xb7e3
+·â 0xb7e2
+·á 0xb7e1
+·à 0xb7e0
+·ß 0xb7df
+·Þ 0xb7de
+·Ý 0xb7dd
+·Ü 0xb7dc
+·Û 0xb7db
+·Ú 0xb7da
+·Ù 0xb7d9
+·Ø 0xb7d8
+·× 0xb7d7
+·Ö 0xb7d6
+·Õ 0xb7d5
+·Ô 0xb7d4
+·Ó 0xb7d3
+·Ò 0xb7d2
+·Ñ 0xb7d1
+·Ð 0xb7d0
+·Ï 0xb7cf
+·Î 0xb7ce
+·Í 0xb7cd
+·Ì 0xb7cc
+·Ë 0xb7cb
+·Ê 0xb7ca
+·É 0xb7c9
+·È 0xb7c8
+·Ç 0xb7c7
+·Æ 0xb7c6
+·Å 0xb7c5
+·Ä 0xb7c4
+·Ã 0xb7c3
+·Â 0xb7c2
+·Á 0xb7c1
+·À 0xb7c0
+·¿ 0xb7bf
+·¾ 0xb7be
+·½ 0xb7bd
+·¼ 0xb7bc
+·» 0xb7bb
+·º 0xb7ba
+·¹ 0xb7b9
+·¸ 0xb7b8
+·· 0xb7b7
+·¶ 0xb7b6
+·µ 0xb7b5
+·´ 0xb7b4
+·³ 0xb7b3
+·² 0xb7b2
+·± 0xb7b1
+·° 0xb7b0
+·¯ 0xb7af
+·® 0xb7ae
+·­ 0xb7ad
+·¬ 0xb7ac
+·« 0xb7ab
+·ª 0xb7aa
+·© 0xb7a9
+·¨ 0xb7a8
+·§ 0xb7a7
+·¦ 0xb7a6
+·¥ 0xb7a5
+·¤ 0xb7a4
+·£ 0xb7a3
+·¢ 0xb7a2
+·¡ 0xb7a1
+¸þ 0xb8fe
+¸ý 0xb8fd
+¸ü 0xb8fc
+¸û 0xb8fb
+¸ú 0xb8fa
+¸ù 0xb8f9
+¸ø 0xb8f8
+¸÷ 0xb8f7
+¸ö 0xb8f6
+¸õ 0xb8f5
+¸ô 0xb8f4
+¸ó 0xb8f3
+¸ò 0xb8f2
+¸ñ 0xb8f1
+¸ð 0xb8f0
+¸ï 0xb8ef
+¸î 0xb8ee
+¸í 0xb8ed
+¸ì 0xb8ec
+¸ë 0xb8eb
+¸ê 0xb8ea
+¸é 0xb8e9
+¸è 0xb8e8
+¸ç 0xb8e7
+¸æ 0xb8e6
+¸å 0xb8e5
+¸ä 0xb8e4
+¸ã 0xb8e3
+¸â 0xb8e2
+¸á 0xb8e1
+¸à 0xb8e0
+¸ß 0xb8df
+¸Þ 0xb8de
+¸Ý 0xb8dd
+¸Ü 0xb8dc
+¸Û 0xb8db
+¸Ú 0xb8da
+¸Ù 0xb8d9
+¸Ø 0xb8d8
+¸× 0xb8d7
+¸Ö 0xb8d6
+¸Õ 0xb8d5
+¸Ô 0xb8d4
+¸Ó 0xb8d3
+¸Ò 0xb8d2
+¸Ñ 0xb8d1
+¸Ð 0xb8d0
+¸Ï 0xb8cf
+¸Î 0xb8ce
+¸Í 0xb8cd
+¸Ì 0xb8cc
+¸Ë 0xb8cb
+¸Ê 0xb8ca
+¸É 0xb8c9
+¸È 0xb8c8
+¸Ç 0xb8c7
+¸Æ 0xb8c6
+¸Å 0xb8c5
+¸Ä 0xb8c4
+¸Ã 0xb8c3
+¸Â 0xb8c2
+¸Á 0xb8c1
+¸À 0xb8c0
+¸¿ 0xb8bf
+¸¾ 0xb8be
+¸½ 0xb8bd
+¸¼ 0xb8bc
+¸» 0xb8bb
+¸º 0xb8ba
+¸¹ 0xb8b9
+¸¸ 0xb8b8
+¸· 0xb8b7
+¸¶ 0xb8b6
+¸µ 0xb8b5
+¸´ 0xb8b4
+¸³ 0xb8b3
+¸² 0xb8b2
+¸± 0xb8b1
+¸° 0xb8b0
+¸¯ 0xb8af
+¸® 0xb8ae
+¸­ 0xb8ad
+¸¬ 0xb8ac
+¸« 0xb8ab
+¸ª 0xb8aa
+¸© 0xb8a9
+¸¨ 0xb8a8
+¸§ 0xb8a7
+¸¦ 0xb8a6
+¸¥ 0xb8a5
+¸¤ 0xb8a4
+¸£ 0xb8a3
+¸¢ 0xb8a2
+¸¡ 0xb8a1
+¹þ 0xb9fe
+¹ý 0xb9fd
+¹ü 0xb9fc
+¹û 0xb9fb
+¹ú 0xb9fa
+¹ù 0xb9f9
+¹ø 0xb9f8
+¹÷ 0xb9f7
+¹ö 0xb9f6
+¹õ 0xb9f5
+¹ô 0xb9f4
+¹ó 0xb9f3
+¹ò 0xb9f2
+¹ñ 0xb9f1
+¹ð 0xb9f0
+¹ï 0xb9ef
+¹î 0xb9ee
+¹í 0xb9ed
+¹ì 0xb9ec
+¹ë 0xb9eb
+¹ê 0xb9ea
+¹é 0xb9e9
+¹è 0xb9e8
+¹ç 0xb9e7
+¹æ 0xb9e6
+¹å 0xb9e5
+¹ä 0xb9e4
+¹ã 0xb9e3
+¹â 0xb9e2
+¹á 0xb9e1
+¹à 0xb9e0
+¹ß 0xb9df
+¹Þ 0xb9de
+¹Ý 0xb9dd
+¹Ü 0xb9dc
+¹Û 0xb9db
+¹Ú 0xb9da
+¹Ù 0xb9d9
+¹Ø 0xb9d8
+¹× 0xb9d7
+¹Ö 0xb9d6
+¹Õ 0xb9d5
+¹Ô 0xb9d4
+¹Ó 0xb9d3
+¹Ò 0xb9d2
+¹Ñ 0xb9d1
+¹Ð 0xb9d0
+¹Ï 0xb9cf
+¹Î 0xb9ce
+¹Í 0xb9cd
+¹Ì 0xb9cc
+¹Ë 0xb9cb
+¹Ê 0xb9ca
+¹É 0xb9c9
+¹È 0xb9c8
+¹Ç 0xb9c7
+¹Æ 0xb9c6
+¹Å 0xb9c5
+¹Ä 0xb9c4
+¹Ã 0xb9c3
+¹Â 0xb9c2
+¹Á 0xb9c1
+¹À 0xb9c0
+¹¿ 0xb9bf
+¹¾ 0xb9be
+¹½ 0xb9bd
+¹¼ 0xb9bc
+¹» 0xb9bb
+¹º 0xb9ba
+¹¹ 0xb9b9
+¹¸ 0xb9b8
+¹· 0xb9b7
+¹¶ 0xb9b6
+¹µ 0xb9b5
+¹´ 0xb9b4
+¹³ 0xb9b3
+¹² 0xb9b2
+¹± 0xb9b1
+¹° 0xb9b0
+¹¯ 0xb9af
+¹® 0xb9ae
+¹­ 0xb9ad
+¹¬ 0xb9ac
+¹« 0xb9ab
+¹ª 0xb9aa
+¹© 0xb9a9
+¹¨ 0xb9a8
+¹§ 0xb9a7
+¹¦ 0xb9a6
+¹¥ 0xb9a5
+¹¤ 0xb9a4
+¹£ 0xb9a3
+¹¢ 0xb9a2
+¹¡ 0xb9a1
+ºþ 0xbafe
+ºý 0xbafd
+ºü 0xbafc
+ºû 0xbafb
+ºú 0xbafa
+ºù 0xbaf9
+ºø 0xbaf8
+º÷ 0xbaf7
+ºö 0xbaf6
+ºõ 0xbaf5
+ºô 0xbaf4
+ºó 0xbaf3
+ºò 0xbaf2
+ºñ 0xbaf1
+ºð 0xbaf0
+ºï 0xbaef
+ºî 0xbaee
+ºí 0xbaed
+ºì 0xbaec
+ºë 0xbaeb
+ºê 0xbaea
+ºé 0xbae9
+ºè 0xbae8
+ºç 0xbae7
+ºæ 0xbae6
+ºå 0xbae5
+ºä 0xbae4
+ºã 0xbae3
+ºâ 0xbae2
+ºá 0xbae1
+ºà 0xbae0
+ºß 0xbadf
+ºÞ 0xbade
+ºÝ 0xbadd
+ºÜ 0xbadc
+ºÛ 0xbadb
+ºÚ 0xbada
+ºÙ 0xbad9
+ºØ 0xbad8
+º× 0xbad7
+ºÖ 0xbad6
+ºÕ 0xbad5
+ºÔ 0xbad4
+ºÓ 0xbad3
+ºÒ 0xbad2
+ºÑ 0xbad1
+ºÐ 0xbad0
+ºÏ 0xbacf
+ºÎ 0xbace
+ºÍ 0xbacd
+ºÌ 0xbacc
+ºË 0xbacb
+ºÊ 0xbaca
+ºÉ 0xbac9
+ºÈ 0xbac8
+ºÇ 0xbac7
+ºÆ 0xbac6
+ºÅ 0xbac5
+ºÄ 0xbac4
+ºÃ 0xbac3
+ºÂ 0xbac2
+ºÁ 0xbac1
+ºÀ 0xbac0
+º¿ 0xbabf
+º¾ 0xbabe
+º½ 0xbabd
+º¼ 0xbabc
+º» 0xbabb
+ºº 0xbaba
+º¹ 0xbab9
+º¸ 0xbab8
+º· 0xbab7
+º¶ 0xbab6
+ºµ 0xbab5
+º´ 0xbab4
+º³ 0xbab3
+º² 0xbab2
+º± 0xbab1
+º° 0xbab0
+º¯ 0xbaaf
+º® 0xbaae
+º­ 0xbaad
+º¬ 0xbaac
+º« 0xbaab
+ºª 0xbaaa
+º© 0xbaa9
+º¨ 0xbaa8
+º§ 0xbaa7
+º¦ 0xbaa6
+º¥ 0xbaa5
+º¤ 0xbaa4
+º£ 0xbaa3
+º¢ 0xbaa2
+º¡ 0xbaa1
+»þ 0xbbfe
+»ý 0xbbfd
+ȟ 0xbbfc
+»û 0xbbfb
+»ú 0xbbfa
+»ù 0xbbf9
+»ø 0xbbf8
+»÷ 0xbbf7
+»ö 0xbbf6
+»õ 0xbbf5
+»ô 0xbbf4
+»ó 0xbbf3
+»ò 0xbbf2
+Ȗ 0xbbf1
+»ð 0xbbf0
+ȕ 0xbbef
+Ȕ 0xbbee
+Ȓ 0xbbed
+ȓ 0xbbec
+ȑ 0xbbeb
+Ȑ 0xbbea
+Ȏ 0xbbe9
+ȏ 0xbbe8
+ȍ 0xbbe7
+Ⱦ 0xbbe6
+Ȍ 0xbbe5
+Ȋ 0xbbe4
+ȋ 0xbbe3
+ȉ 0xbbe2
+ȇ 0xbbe1
+Ȉ 0xbbe0
+ȧ 0xbbdf
+»Þ 0xbbde
+»Ý 0xbbdd
+Ȇ 0xbbdc
+»Û 0xbbdb
+»Ú 0xbbda
+»Ù 0xbbd9
+ȯ 0xbbd8
+»× 0xbbd7
+»Ö 0xbbd6
+»Õ 0xbbd5
+»Ô 0xbbd4
+»Ó 0xbbd3
+»Ò 0xbbd2
+Ȅ 0xbbd1
+»Ð 0xbbd0
+»Ï 0xbbcf
+»Î 0xbbce
+»Í 0xbbcd
+»Ì 0xbbcc
+»Ë 0xbbcb
+»Ê 0xbbca
+ȃ 0xbbc9
+»È 0xbbc8
+Ȃ 0xbbc7
+Ȯ 0xbbc6
+ȁ 0xbbc5
+Ȁ 0xbbc4
+»Ã 0xbbc3
+»Â 0xbbc2
+»Á 0xbbc1
+»À 0xbbc0
+»¿ 0xbbbf
+»¾ 0xbbbe
+»½ 0xbbbd
+»¼ 0xbbbc
+»» 0xbbbb
+ȼ 0xbbba
+»¹ 0xbbb9
+»¸ 0xbbb8
+»· 0xbbb7
+Ȧ 0xbbb6
+»µ 0xbbb5
+»´ 0xbbb4
+»³ 0xbbb3
+»² 0xbbb2
+»± 0xbbb1
+»° 0xbbb0
+»¯ 0xbbaf
+»® 0xbbae
+»­ 0xbbad
+»¬ 0xbbac
+»« 0xbbab
+Ȼ 0xbbaa
+»© 0xbba9
+Ȭ 0xbba8
+Ȥ 0xbba7
+»¦ 0xbba6
+ȴ 0xbba5
+»¤ 0xbba4
+ȣ 0xbba3
+Ȣ 0xbba2
+»¡ 0xbba1
+¼þ 0xbcfe
+¼ý 0xbcfd
+¼ü 0xbcfc
+¼û 0xbcfb
+¼ú 0xbcfa
+¼ù 0xbcf9
+¼ø 0xbcf8
+¼÷ 0xbcf7
+¼ö 0xbcf6
+¼õ 0xbcf5
+¼ô 0xbcf4
+¼ó 0xbcf3
+¼ò 0xbcf2
+¼ñ 0xbcf1
+¼ð 0xbcf0
+¼ï 0xbcef
+¼î 0xbcee
+¼í 0xbced
+¼ì 0xbcec
+¼ë 0xbceb
+¼ê 0xbcea
+¼é 0xbce9
+¼è 0xbce8
+¼ç 0xbce7
+¼æ 0xbce6
+¼å 0xbce5
+¼ä 0xbce4
+¼ã 0xbce3
+¼â 0xbce2
+¼á 0xbce1
+¼à 0xbce0
+¼ß 0xbcdf
+¼Þ 0xbcde
+¼Ý 0xbcdd
+¼Ü 0xbcdc
+¼Û 0xbcdb
+¼Ú 0xbcda
+¼Ù 0xbcd9
+¼Ø 0xbcd8
+¼× 0xbcd7
+¼Ö 0xbcd6
+¼Õ 0xbcd5
+¼Ô 0xbcd4
+¼Ó 0xbcd3
+¼Ò 0xbcd2
+¼Ñ 0xbcd1
+¼Ð 0xbcd0
+¼Ï 0xbccf
+¼Î 0xbcce
+¼Í 0xbccd
+¼Ì 0xbccc
+¼Ë 0xbccb
+¼Ê 0xbcca
+¼É 0xbcc9
+¼È 0xbcc8
+¼Ç 0xbcc7
+¼Æ 0xbcc6
+¼Å 0xbcc5
+¼Ä 0xbcc4
+¼Ã 0xbcc3
+¼Â 0xbcc2
+¼Á 0xbcc1
+¼À 0xbcc0
+¼¿ 0xbcbf
+¼¾ 0xbcbe
+¼½ 0xbcbd
+¼¼ 0xbcbc
+¼» 0xbcbb
+¼º 0xbcba
+¼¹ 0xbcb9
+¼¸ 0xbcb8
+¼· 0xbcb7
+¼¶ 0xbcb6
+¼µ 0xbcb5
+¼´ 0xbcb4
+¼³ 0xbcb3
+¼² 0xbcb2
+¼± 0xbcb1
+¼° 0xbcb0
+¼¯ 0xbcaf
+¼® 0xbcae
+¼­ 0xbcad
+¼¬ 0xbcac
+¼« 0xbcab
+¼ª 0xbcaa
+¼© 0xbca9
+¼¨ 0xbca8
+¼§ 0xbca7
+¼¦ 0xbca6
+¼¥ 0xbca5
+¼¤ 0xbca4
+¼£ 0xbca3
+¼¢ 0xbca2
+¼¡ 0xbca1
+½þ 0xbdfe
+½ý 0xbdfd
+½ü 0xbdfc
+½û 0xbdfb
+½ú 0xbdfa
+½ù 0xbdf9
+½ø 0xbdf8
+½÷ 0xbdf7
+½ö 0xbdf6
+½õ 0xbdf5
+½ô 0xbdf4
+½ó 0xbdf3
+½ò 0xbdf2
+½ñ 0xbdf1
+½ð 0xbdf0
+½ï 0xbdef
+½î 0xbdee
+½í 0xbded
+½ì 0xbdec
+½ë 0xbdeb
+½ê 0xbdea
+½é 0xbde9
+½è 0xbde8
+½ç 0xbde7
+½æ 0xbde6
+½å 0xbde5
+½ä 0xbde4
+½ã 0xbde3
+½â 0xbde2
+½á 0xbde1
+½à 0xbde0
+½ß 0xbddf
+½Þ 0xbdde
+½Ý 0xbddd
+½Ü 0xbddc
+½Û 0xbddb
+½Ú 0xbdda
+½Ù 0xbdd9
+½Ø 0xbdd8
+½× 0xbdd7
+½Ö 0xbdd6
+½Õ 0xbdd5
+½Ô 0xbdd4
+½Ó 0xbdd3
+½Ò 0xbdd2
+½Ñ 0xbdd1
+½Ð 0xbdd0
+½Ï 0xbdcf
+½Î 0xbdce
+½Í 0xbdcd
+½Ì 0xbdcc
+½Ë 0xbdcb
+½Ê 0xbdca
+½É 0xbdc9
+½È 0xbdc8
+½Ç 0xbdc7
+½Æ 0xbdc6
+½Å 0xbdc5
+½Ä 0xbdc4
+½Ã 0xbdc3
+½Â 0xbdc2
+½Á 0xbdc1
+½À 0xbdc0
+½¿ 0xbdbf
+½¾ 0xbdbe
+½½ 0xbdbd
+½¼ 0xbdbc
+½» 0xbdbb
+½º 0xbdba
+½¹ 0xbdb9
+½¸ 0xbdb8
+½· 0xbdb7
+½¶ 0xbdb6
+½µ 0xbdb5
+½´ 0xbdb4
+½³ 0xbdb3
+½² 0xbdb2
+½± 0xbdb1
+½° 0xbdb0
+½¯ 0xbdaf
+½® 0xbdae
+½­ 0xbdad
+½¬ 0xbdac
+½« 0xbdab
+½ª 0xbdaa
+½© 0xbda9
+½¨ 0xbda8
+½§ 0xbda7
+½¦ 0xbda6
+½¥ 0xbda5
+½¤ 0xbda4
+½£ 0xbda3
+½¢ 0xbda2
+½¡ 0xbda1
+¾þ 0xbefe
+¾ý 0xbefd
+¾ü 0xbefc
+¾û 0xbefb
+¾ú 0xbefa
+¾ù 0xbef9
+¾ø 0xbef8
+¾÷ 0xbef7
+¾ö 0xbef6
+¾õ 0xbef5
+¾ô 0xbef4
+¾ó 0xbef3
+¾ò 0xbef2
+¾ñ 0xbef1
+¾ð 0xbef0
+¾ï 0xbeef
+¾î 0xbeee
+¾í 0xbeed
+¾ì 0xbeec
+¾ë 0xbeeb
+¾ê 0xbeea
+¾é 0xbee9
+¾è 0xbee8
+¾ç 0xbee7
+¾æ 0xbee6
+¾å 0xbee5
+¾ä 0xbee4
+¾ã 0xbee3
+¾â 0xbee2
+¾á 0xbee1
+¾à 0xbee0
+¾ß 0xbedf
+¾Þ 0xbede
+¾Ý 0xbedd
+¾Ü 0xbedc
+¾Û 0xbedb
+¾Ú 0xbeda
+¾Ù 0xbed9
+¾Ø 0xbed8
+¾× 0xbed7
+¾Ö 0xbed6
+¾Õ 0xbed5
+¾Ô 0xbed4
+¾Ó 0xbed3
+¾Ò 0xbed2
+¾Ñ 0xbed1
+¾Ð 0xbed0
+¾Ï 0xbecf
+¾Î 0xbece
+¾Í 0xbecd
+¾Ì 0xbecc
+¾Ë 0xbecb
+¾Ê 0xbeca
+¾É 0xbec9
+¾È 0xbec8
+¾Ç 0xbec7
+¾Æ 0xbec6
+¾Å 0xbec5
+¾Ä 0xbec4
+¾Ã 0xbec3
+¾Â 0xbec2
+¾Á 0xbec1
+¾À 0xbec0
+¾¿ 0xbebf
+¾¾ 0xbebe
+¾½ 0xbebd
+¾¼ 0xbebc
+¾» 0xbebb
+¾º 0xbeba
+¾¹ 0xbeb9
+¾¸ 0xbeb8
+¾· 0xbeb7
+¾¶ 0xbeb6
+¾µ 0xbeb5
+¾´ 0xbeb4
+¾³ 0xbeb3
+¾² 0xbeb2
+¾± 0xbeb1
+¾° 0xbeb0
+¾¯ 0xbeaf
+¾® 0xbeae
+¾­ 0xbead
+¾¬ 0xbeac
+¾« 0xbeab
+¾ª 0xbeaa
+¾© 0xbea9
+¾¨ 0xbea8
+¾§ 0xbea7
+¾¦ 0xbea6
+¾¥ 0xbea5
+¾¤ 0xbea4
+¾£ 0xbea3
+¾¢ 0xbea2
+¾¡ 0xbea1
+¿þ 0xbffe
+¿ý 0xbffd
+¿ü 0xbffc
+¿û 0xbffb
+¿ú 0xbffa
+¿ù 0xbff9
+¿ø 0xbff8
+¿÷ 0xbff7
+¿ö 0xbff6
+¿õ 0xbff5
+¿ô 0xbff4
+¿ó 0xbff3
+¿ò 0xbff2
+¿ñ 0xbff1
+¿ð 0xbff0
+¿ï 0xbfef
+¿î 0xbfee
+¿í 0xbfed
+¿ì 0xbfec
+¿ë 0xbfeb
+¿ê 0xbfea
+¿é 0xbfe9
+¿è 0xbfe8
+¿ç 0xbfe7
+¿æ 0xbfe6
+¿å 0xbfe5
+¿ä 0xbfe4
+¿ã 0xbfe3
+¿â 0xbfe2
+¿á 0xbfe1
+¿à 0xbfe0
+¿ß 0xbfdf
+¿Þ 0xbfde
+¿Ý 0xbfdd
+¿Ü 0xbfdc
+¿Û 0xbfdb
+¿Ú 0xbfda
+¿Ù 0xbfd9
+¿Ø 0xbfd8
+¿× 0xbfd7
+¿Ö 0xbfd6
+¿Õ 0xbfd5
+¿Ô 0xbfd4
+¿Ó 0xbfd3
+¿Ò 0xbfd2
+¿Ñ 0xbfd1
+¿Ð 0xbfd0
+¿Ï 0xbfcf
+¿Î 0xbfce
+¿Í 0xbfcd
+¿Ì 0xbfcc
+¿Ë 0xbfcb
+¿Ê 0xbfca
+¿É 0xbfc9
+¿È 0xbfc8
+¿Ç 0xbfc7
+¿Æ 0xbfc6
+¿Å 0xbfc5
+¿Ä 0xbfc4
+¿Ã 0xbfc3
+¿Â 0xbfc2
+¿Á 0xbfc1
+¿À 0xbfc0
+¿¿ 0xbfbf
+¿¾ 0xbfbe
+¿½ 0xbfbd
+¿¼ 0xbfbc
+¿» 0xbfbb
+¿º 0xbfba
+¿¹ 0xbfb9
+¿¸ 0xbfb8
+¿· 0xbfb7
+¿¶ 0xbfb6
+¿µ 0xbfb5
+¿´ 0xbfb4
+¿³ 0xbfb3
+¿² 0xbfb2
+¿± 0xbfb1
+¿° 0xbfb0
+¿¯ 0xbfaf
+¿® 0xbfae
+¿­ 0xbfad
+¿¬ 0xbfac
+¿« 0xbfab
+¿ª 0xbfaa
+¿© 0xbfa9
+¿¨ 0xbfa8
+¿§ 0xbfa7
+¿¦ 0xbfa6
+¿¥ 0xbfa5
+¿¤ 0xbfa4
+¿£ 0xbfa3
+¿¢ 0xbfa2
+¿¡ 0xbfa1
+Àþ 0xc0fe
+Àý 0xc0fd
+Àü 0xc0fc
+Àû 0xc0fb
+Àú 0xc0fa
+Àù 0xc0f9
+Àø 0xc0f8
+À÷ 0xc0f7
+Àö 0xc0f6
+Àõ 0xc0f5
+Àô 0xc0f4
+Àó 0xc0f3
+Àò 0xc0f2
+Àñ 0xc0f1
+Àð 0xc0f0
+Àï 0xc0ef
+Àî 0xc0ee
+Àí 0xc0ed
+Àì 0xc0ec
+Àë 0xc0eb
+Àê 0xc0ea
+Àé 0xc0e9
+Àè 0xc0e8
+Àç 0xc0e7
+Àæ 0xc0e6
+Àå 0xc0e5
+Àä 0xc0e4
+Àã 0xc0e3
+Àâ 0xc0e2
+Àá 0xc0e1
+Àà 0xc0e0
+Àß 0xc0df
+ÀÞ 0xc0de
+ÀÝ 0xc0dd
+ÀÜ 0xc0dc
+ÀÛ 0xc0db
+ÀÚ 0xc0da
+ÀÙ 0xc0d9
+ÀØ 0xc0d8
+À× 0xc0d7
+ÀÖ 0xc0d6
+ÀÕ 0xc0d5
+ÀÔ 0xc0d4
+ÀÓ 0xc0d3
+ÀÒ 0xc0d2
+ÀÑ 0xc0d1
+ÀÐ 0xc0d0
+ÀÏ 0xc0cf
+ÀÎ 0xc0ce
+ÀÍ 0xc0cd
+ÀÌ 0xc0cc
+ÀË 0xc0cb
+ÀÊ 0xc0ca
+ÀÉ 0xc0c9
+ÀÈ 0xc0c8
+ÀÇ 0xc0c7
+ÀÆ 0xc0c6
+ÀÅ 0xc0c5
+ÀÄ 0xc0c4
+ÀÃ 0xc0c3
+ÀÂ 0xc0c2
+ÀÁ 0xc0c1
+ÀÀ 0xc0c0
+À¿ 0xc0bf
+À¾ 0xc0be
+À½ 0xc0bd
+À¼ 0xc0bc
+À» 0xc0bb
+˼ 0xc0ba
+À¹ 0xc0b9
+À¸ 0xc0b8
+À· 0xc0b7
+˦ 0xc0b6
+˵ 0xc0b5
+À´ 0xc0b4
+À³ 0xc0b3
+À² 0xc0b2
+˱ 0xc0b1
+À° 0xc0b0
+À¯ 0xc0af
+À® 0xc0ae
+À­ 0xc0ad
+À¬ 0xc0ac
+À« 0xc0ab
+˻ 0xc0aa
+À© 0xc0a9
+ˬ 0xc0a8
+ˤ 0xc0a7
+À¦ 0xc0a6
+À¥ 0xc0a5
+À¤ 0xc0a4
+À£ 0xc0a3
+À¢ 0xc0a2
+À¡ 0xc0a1
+Áþ 0xc1fe
+Áý 0xc1fd
+Áü 0xc1fc
+Áû 0xc1fb
+Áú 0xc1fa
+Áù 0xc1f9
+Áø 0xc1f8
+Á÷ 0xc1f7
+Áö 0xc1f6
+Áõ 0xc1f5
+Áô 0xc1f4
+Áó 0xc1f3
+Áò 0xc1f2
+Áñ 0xc1f1
+Áð 0xc1f0
+Áï 0xc1ef
+Áî 0xc1ee
+Áí 0xc1ed
+Áì 0xc1ec
+Áë 0xc1eb
+Áê 0xc1ea
+Áé 0xc1e9
+Áè 0xc1e8
+Áç 0xc1e7
+Áæ 0xc1e6
+Áå 0xc1e5
+Áä 0xc1e4
+Áã 0xc1e3
+Áâ 0xc1e2
+Áá 0xc1e1
+Áà 0xc1e0
+Áß 0xc1df
+ÁÞ 0xc1de
+ÁÝ 0xc1dd
+ÁÜ 0xc1dc
+ÁÛ 0xc1db
+ÁÚ 0xc1da
+ÁÙ 0xc1d9
+ÁØ 0xc1d8
+Á× 0xc1d7
+ÁÖ 0xc1d6
+ÁÕ 0xc1d5
+ÁÔ 0xc1d4
+ÁÓ 0xc1d3
+ÁÒ 0xc1d2
+ÁÑ 0xc1d1
+ÁÐ 0xc1d0
+ÁÏ 0xc1cf
+ÁÎ 0xc1ce
+ÁÍ 0xc1cd
+ÁÌ 0xc1cc
+ÁË 0xc1cb
+ÁÊ 0xc1ca
+ÁÉ 0xc1c9
+ÁÈ 0xc1c8
+ÁÇ 0xc1c7
+ÁÆ 0xc1c6
+ÁÅ 0xc1c5
+ÁÄ 0xc1c4
+ÁÃ 0xc1c3
+ÁÂ 0xc1c2
+ÁÁ 0xc1c1
+ÁÀ 0xc1c0
+Á¿ 0xc1bf
+Á¾ 0xc1be
+Á½ 0xc1bd
+Á¼ 0xc1bc
+Á» 0xc1bb
+Áº 0xc1ba
+Á¹ 0xc1b9
+Á¸ 0xc1b8
+Á· 0xc1b7
+Á¶ 0xc1b6
+Áµ 0xc1b5
+Á´ 0xc1b4
+Á³ 0xc1b3
+Á² 0xc1b2
+Á± 0xc1b1
+Á° 0xc1b0
+Á¯ 0xc1af
+Á® 0xc1ae
+Á­ 0xc1ad
+Á¬ 0xc1ac
+Á« 0xc1ab
+Áª 0xc1aa
+Á© 0xc1a9
+Á¨ 0xc1a8
+Á§ 0xc1a7
+Á¦ 0xc1a6
+Á¥ 0xc1a5
+Á¤ 0xc1a4
+Á£ 0xc1a3
+Á¢ 0xc1a2
+Á¡ 0xc1a1
+Âþ 0xc2fe
+Âý 0xc2fd
+Âü 0xc2fc
+Âû 0xc2fb
+Âú 0xc2fa
+Âù 0xc2f9
+Âø 0xc2f8
+Â÷ 0xc2f7
+Âö 0xc2f6
+Âõ 0xc2f5
+Âô 0xc2f4
+Âó 0xc2f3
+Âò 0xc2f2
+Âñ 0xc2f1
+Âð 0xc2f0
+Âï 0xc2ef
+Âî 0xc2ee
+Âí 0xc2ed
+Âì 0xc2ec
+Âë 0xc2eb
+Âê 0xc2ea
+Âé 0xc2e9
+Âè 0xc2e8
+Âç 0xc2e7
+Âæ 0xc2e6
+Âå 0xc2e5
+Âä 0xc2e4
+Âã 0xc2e3
+Ââ 0xc2e2
+Âá 0xc2e1
+Âà 0xc2e0
+Âß 0xc2df
+ÂÞ 0xc2de
+ÂÝ 0xc2dd
+ÂÜ 0xc2dc
+ÂÛ 0xc2db
+ÂÚ 0xc2da
+ÂÙ 0xc2d9
+ÂØ 0xc2d8
+Â× 0xc2d7
+ÂÖ 0xc2d6
+ÂÕ 0xc2d5
+ÂÔ 0xc2d4
+ÂÓ 0xc2d3
+ÂÒ 0xc2d2
+ÂÑ 0xc2d1
+ÂÐ 0xc2d0
+ÂÏ 0xc2cf
+ÂÎ 0xc2ce
+ÂÍ 0xc2cd
+ÂÌ 0xc2cc
+ÂË 0xc2cb
+ÂÊ 0xc2ca
+ÂÉ 0xc2c9
+ÂÈ 0xc2c8
+ÂÇ 0xc2c7
+ÂÆ 0xc2c6
+ÂÅ 0xc2c5
+ÂÄ 0xc2c4
+ÂÃ 0xc2c3
+ÂÂ 0xc2c2
+ÂÁ 0xc2c1
+ÂÀ 0xc2c0
+¿ 0xc2bf
+¾ 0xc2be
+½ 0xc2bd
+¼ 0xc2bc
+» 0xc2bb
+º 0xc2ba
+¹ 0xc2b9
+¸ 0xc2b8
+· 0xc2b7
+¶ 0xc2b6
+µ 0xc2b5
+´ 0xc2b4
+³ 0xc2b3
+² 0xc2b2
+± 0xc2b1
+° 0xc2b0
+¯ 0xc2af
+® 0xc2ae
+­ 0xc2ad
+¬ 0xc2ac
+« 0xc2ab
+ª 0xc2aa
+© 0xc2a9
+¨ 0xc2a8
+§ 0xc2a7
+¦ 0xc2a6
+Â¥ 0xc2a5
+¤ 0xc2a4
+£ 0xc2a3
+¢ 0xc2a2
+¡ 0xc2a1
+Ãþ 0xc3fe
+Ãý 0xc3fd
+Ãü 0xc3fc
+Ãû 0xc3fb
+Ãú 0xc3fa
+Ãù 0xc3f9
+Ãø 0xc3f8
+Ã÷ 0xc3f7
+Ãö 0xc3f6
+Ãõ 0xc3f5
+Ãô 0xc3f4
+Ãó 0xc3f3
+Ãò 0xc3f2
+Ãñ 0xc3f1
+Ãð 0xc3f0
+Ãï 0xc3ef
+Ãî 0xc3ee
+Ãí 0xc3ed
+Ãì 0xc3ec
+Ãë 0xc3eb
+Ãê 0xc3ea
+Ãé 0xc3e9
+Ãè 0xc3e8
+Ãç 0xc3e7
+Ãæ 0xc3e6
+Ãå 0xc3e5
+Ãä 0xc3e4
+Ãã 0xc3e3
+Ãâ 0xc3e2
+Ãá 0xc3e1
+Ãà 0xc3e0
+Ãß 0xc3df
+ÃÞ 0xc3de
+ÃÝ 0xc3dd
+ÃÜ 0xc3dc
+ÃÛ 0xc3db
+ÃÚ 0xc3da
+ÃÙ 0xc3d9
+ÃØ 0xc3d8
+Ã× 0xc3d7
+ÃÖ 0xc3d6
+ÃÕ 0xc3d5
+ÃÔ 0xc3d4
+ÃÓ 0xc3d3
+ÃÒ 0xc3d2
+ÃÑ 0xc3d1
+ÃÐ 0xc3d0
+ÃÏ 0xc3cf
+ÃÎ 0xc3ce
+ÃÍ 0xc3cd
+ÃÌ 0xc3cc
+ÃË 0xc3cb
+ÃÊ 0xc3ca
+ÃÉ 0xc3c9
+ÃÈ 0xc3c8
+ÃÇ 0xc3c7
+ÃÆ 0xc3c6
+ÃÅ 0xc3c5
+ÃÄ 0xc3c4
+ÃÃ 0xc3c3
+ÃÂ 0xc3c2
+ÃÁ 0xc3c1
+ÃÀ 0xc3c0
+ÿ 0xc3bf
+þ 0xc3be
+ý 0xc3bd
+ü 0xc3bc
+û 0xc3bb
+ú 0xc3ba
+ù 0xc3b9
+ø 0xc3b8
+÷ 0xc3b7
+ö 0xc3b6
+õ 0xc3b5
+ô 0xc3b4
+ó 0xc3b3
+ò 0xc3b2
+ñ 0xc3b1
+ð 0xc3b0
+ï 0xc3af
+î 0xc3ae
+í 0xc3ad
+ì 0xc3ac
+ë 0xc3ab
+ê 0xc3aa
+é 0xc3a9
+è 0xc3a8
+ç 0xc3a7
+æ 0xc3a6
+Ã¥ 0xc3a5
+ä 0xc3a4
+ã 0xc3a3
+â 0xc3a2
+á 0xc3a1
+Äþ 0xc4fe
+Äý 0xc4fd
+Äü 0xc4fc
+Äû 0xc4fb
+Äú 0xc4fa
+Äù 0xc4f9
+Äø 0xc4f8
+Ä÷ 0xc4f7
+Äö 0xc4f6
+Äõ 0xc4f5
+Äô 0xc4f4
+Äó 0xc4f3
+Äò 0xc4f2
+Äñ 0xc4f1
+Äð 0xc4f0
+Äï 0xc4ef
+Äî 0xc4ee
+Äí 0xc4ed
+Äì 0xc4ec
+Äë 0xc4eb
+Äê 0xc4ea
+Äé 0xc4e9
+Äè 0xc4e8
+Äç 0xc4e7
+Äæ 0xc4e6
+Äå 0xc4e5
+Ää 0xc4e4
+Äã 0xc4e3
+Äâ 0xc4e2
+Äá 0xc4e1
+Äà 0xc4e0
+Äß 0xc4df
+ÄÞ 0xc4de
+ÄÝ 0xc4dd
+ÄÜ 0xc4dc
+ÄÛ 0xc4db
+ÄÚ 0xc4da
+ÄÙ 0xc4d9
+ÄØ 0xc4d8
+Ä× 0xc4d7
+ÄÖ 0xc4d6
+ÄÕ 0xc4d5
+ÄÔ 0xc4d4
+ÄÓ 0xc4d3
+ÄÒ 0xc4d2
+ÄÑ 0xc4d1
+ÄÐ 0xc4d0
+ÄÏ 0xc4cf
+ÄÎ 0xc4ce
+ÄÍ 0xc4cd
+ÄÌ 0xc4cc
+ÄË 0xc4cb
+ÄÊ 0xc4ca
+ÄÉ 0xc4c9
+ÄÈ 0xc4c8
+ÄÇ 0xc4c7
+ÄÆ 0xc4c6
+ÄÅ 0xc4c5
+ÄÄ 0xc4c4
+ÄÃ 0xc4c3
+ÄÂ 0xc4c2
+ÄÁ 0xc4c1
+ÄÀ 0xc4c0
+Ä¿ 0xc4bf
+ľ 0xc4be
+Ľ 0xc4bd
+ļ 0xc4bc
+Ä» 0xc4bb
+ĺ 0xc4ba
+Ĺ 0xc4b9
+ĸ 0xc4b8
+Ä· 0xc4b7
+Ķ 0xc4b6
+ĵ 0xc4b5
+Ä´ 0xc4b4
+ij 0xc4b3
+IJ 0xc4b2
+ı 0xc4b1
+Ä° 0xc4b0
+į 0xc4af
+Ä® 0xc4ae
+Ä­ 0xc4ad
+Ĭ 0xc4ac
+Ä« 0xc4ab
+Ī 0xc4aa
+Ä© 0xc4a9
+Ĩ 0xc4a8
+ħ 0xc4a7
+Ħ 0xc4a6
+Ä¥ 0xc4a5
+Ĥ 0xc4a4
+Ä£ 0xc4a3
+Ä¢ 0xc4a2
+Ä¡ 0xc4a1
+Åþ 0xc5fe
+Åý 0xc5fd
+Åü 0xc5fc
+Åû 0xc5fb
+Åú 0xc5fa
+Åù 0xc5f9
+Åø 0xc5f8
+Å÷ 0xc5f7
+Åö 0xc5f6
+Åõ 0xc5f5
+Åô 0xc5f4
+Åó 0xc5f3
+Åò 0xc5f2
+Åñ 0xc5f1
+Åð 0xc5f0
+Åï 0xc5ef
+Åî 0xc5ee
+Åí 0xc5ed
+Åì 0xc5ec
+Åë 0xc5eb
+Åê 0xc5ea
+Åé 0xc5e9
+Åè 0xc5e8
+Åç 0xc5e7
+Åæ 0xc5e6
+Åå 0xc5e5
+Åä 0xc5e4
+Åã 0xc5e3
+Åâ 0xc5e2
+Åá 0xc5e1
+Åà 0xc5e0
+Åß 0xc5df
+ÅÞ 0xc5de
+ÅÝ 0xc5dd
+ÅÜ 0xc5dc
+ÅÛ 0xc5db
+ÅÚ 0xc5da
+ÅÙ 0xc5d9
+ÅØ 0xc5d8
+Å× 0xc5d7
+ÅÖ 0xc5d6
+ÅÕ 0xc5d5
+ÅÔ 0xc5d4
+ÅÓ 0xc5d3
+ÅÒ 0xc5d2
+ÅÑ 0xc5d1
+ÅÐ 0xc5d0
+ÅÏ 0xc5cf
+ÅÎ 0xc5ce
+ÅÍ 0xc5cd
+ÅÌ 0xc5cc
+ÅË 0xc5cb
+ÅÊ 0xc5ca
+ÅÉ 0xc5c9
+ÅÈ 0xc5c8
+ÅÇ 0xc5c7
+ÅÆ 0xc5c6
+ÅÅ 0xc5c5
+ÅÄ 0xc5c4
+ÅÃ 0xc5c3
+ÅÂ 0xc5c2
+ÅÁ 0xc5c1
+ÅÀ 0xc5c0
+Å¿ 0xc5bf
+ž 0xc5be
+Ž 0xc5bd
+ż 0xc5bc
+Å» 0xc5bb
+ź 0xc5ba
+Ź 0xc5b9
+Ÿ 0xc5b8
+Å· 0xc5b7
+Ŷ 0xc5b6
+ŵ 0xc5b5
+Å´ 0xc5b4
+ų 0xc5b3
+Ų 0xc5b2
+ű 0xc5b1
+Å° 0xc5b0
+ů 0xc5af
+Å® 0xc5ae
+Å­ 0xc5ad
+Ŭ 0xc5ac
+Å« 0xc5ab
+Ū 0xc5aa
+Å© 0xc5a9
+Ũ 0xc5a8
+ŧ 0xc5a7
+Ŧ 0xc5a6
+Å¥ 0xc5a5
+Ť 0xc5a4
+Å£ 0xc5a3
+Å¢ 0xc5a2
+Å¡ 0xc5a1
+Æþ 0xc6fe
+Æý 0xc6fd
+Æü 0xc6fc
+Æû 0xc6fb
+Æú 0xc6fa
+Æù 0xc6f9
+Æø 0xc6f8
+Æ÷ 0xc6f7
+Æö 0xc6f6
+Æõ 0xc6f5
+Æô 0xc6f4
+Æó 0xc6f3
+Æò 0xc6f2
+Æñ 0xc6f1
+Æð 0xc6f0
+Æï 0xc6ef
+Æî 0xc6ee
+Æí 0xc6ed
+Æì 0xc6ec
+Æë 0xc6eb
+Æê 0xc6ea
+Æé 0xc6e9
+Æè 0xc6e8
+Æç 0xc6e7
+Ææ 0xc6e6
+Æå 0xc6e5
+Æä 0xc6e4
+Æã 0xc6e3
+Æâ 0xc6e2
+Æá 0xc6e1
+Æà 0xc6e0
+Æß 0xc6df
+ÆÞ 0xc6de
+ÆÝ 0xc6dd
+ÆÜ 0xc6dc
+ÆÛ 0xc6db
+ÆÚ 0xc6da
+ÆÙ 0xc6d9
+ÆØ 0xc6d8
+Æ× 0xc6d7
+ÆÖ 0xc6d6
+ÆÕ 0xc6d5
+ÆÔ 0xc6d4
+ÆÓ 0xc6d3
+ÆÒ 0xc6d2
+ÆÑ 0xc6d1
+ÆÐ 0xc6d0
+ÆÏ 0xc6cf
+ÆÎ 0xc6ce
+ÆÍ 0xc6cd
+ÆÌ 0xc6cc
+ÆË 0xc6cb
+ÆÊ 0xc6ca
+ÆÉ 0xc6c9
+ÆÈ 0xc6c8
+ÆÇ 0xc6c7
+ÆÆ 0xc6c6
+ÆÅ 0xc6c5
+ÆÄ 0xc6c4
+ÆÃ 0xc6c3
+ÆÂ 0xc6c2
+ÆÁ 0xc6c1
+ÆÀ 0xc6c0
+Æ¿ 0xc6bf
+ƾ 0xc6be
+ƽ 0xc6bd
+Ƽ 0xc6bc
+Æ» 0xc6bb
+ƺ 0xc6ba
+ƹ 0xc6b9
+Ƹ 0xc6b8
+Æ· 0xc6b7
+ƶ 0xc6b6
+Ƶ 0xc6b5
+Æ´ 0xc6b4
+Ƴ 0xc6b3
+Ʋ 0xc6b2
+Ʊ 0xc6b1
+Æ° 0xc6b0
+Ư 0xc6af
+Æ® 0xc6ae
+Æ­ 0xc6ad
+Ƭ 0xc6ac
+Æ« 0xc6ab
+ƪ 0xc6aa
+Æ© 0xc6a9
+ƨ 0xc6a8
+Ƨ 0xc6a7
+Ʀ 0xc6a6
+Æ¥ 0xc6a5
+Ƥ 0xc6a4
+Æ£ 0xc6a3
+Æ¢ 0xc6a2
+Æ¡ 0xc6a1
+Çþ 0xc7fe
+Çý 0xc7fd
+Çü 0xc7fc
+Çû 0xc7fb
+Çú 0xc7fa
+Çù 0xc7f9
+Çø 0xc7f8
+Ç÷ 0xc7f7
+Çö 0xc7f6
+Çõ 0xc7f5
+Çô 0xc7f4
+Çó 0xc7f3
+Çò 0xc7f2
+Çñ 0xc7f1
+Çð 0xc7f0
+Çï 0xc7ef
+Çî 0xc7ee
+Çí 0xc7ed
+Çì 0xc7ec
+Çë 0xc7eb
+Çê 0xc7ea
+Çé 0xc7e9
+Çè 0xc7e8
+Çç 0xc7e7
+Çæ 0xc7e6
+Çå 0xc7e5
+Çä 0xc7e4
+Çã 0xc7e3
+Çâ 0xc7e2
+Çá 0xc7e1
+Çà 0xc7e0
+Çß 0xc7df
+ÇÞ 0xc7de
+ÇÝ 0xc7dd
+ÇÜ 0xc7dc
+ÇÛ 0xc7db
+ÇÚ 0xc7da
+ÇÙ 0xc7d9
+ÇØ 0xc7d8
+Ç× 0xc7d7
+ÇÖ 0xc7d6
+ÇÕ 0xc7d5
+ÇÔ 0xc7d4
+ÇÓ 0xc7d3
+ÇÒ 0xc7d2
+ÇÑ 0xc7d1
+ÇÐ 0xc7d0
+ÇÏ 0xc7cf
+ÇÎ 0xc7ce
+ÇÍ 0xc7cd
+ÇÌ 0xc7cc
+ÇË 0xc7cb
+ÇÊ 0xc7ca
+ÇÉ 0xc7c9
+ÇÈ 0xc7c8
+ÇÇ 0xc7c7
+ÇÆ 0xc7c6
+ÇÅ 0xc7c5
+ÇÄ 0xc7c4
+ÇÃ 0xc7c3
+ÇÂ 0xc7c2
+ÇÁ 0xc7c1
+ÇÀ 0xc7c0
+Ç¿ 0xc7bf
+Ǿ 0xc7be
+ǽ 0xc7bd
+Ǽ 0xc7bc
+Ç» 0xc7bb
+Ǻ 0xc7ba
+ǹ 0xc7b9
+Ǹ 0xc7b8
+Ç· 0xc7b7
+Ƕ 0xc7b6
+ǵ 0xc7b5
+Ç´ 0xc7b4
+dz 0xc7b3
+Dz 0xc7b2
+DZ 0xc7b1
+Ç° 0xc7b0
+ǯ 0xc7af
+Ç® 0xc7ae
+Ç­ 0xc7ad
+Ǭ 0xc7ac
+Ç« 0xc7ab
+Ǫ 0xc7aa
+Ç© 0xc7a9
+Ǩ 0xc7a8
+ǧ 0xc7a7
+Ǧ 0xc7a6
+Ç¥ 0xc7a5
+Ǥ 0xc7a4
+Ç£ 0xc7a3
+Ç¢ 0xc7a2
+Ç¡ 0xc7a1
+Èþ 0xc8fe
+Èý 0xc8fd
+Èü 0xc8fc
+Èû 0xc8fb
+Èú 0xc8fa
+Èù 0xc8f9
+Èø 0xc8f8
+È÷ 0xc8f7
+Èö 0xc8f6
+Èõ 0xc8f5
+Èô 0xc8f4
+Èó 0xc8f3
+Èò 0xc8f2
+Èñ 0xc8f1
+Èð 0xc8f0
+Èï 0xc8ef
+Èî 0xc8ee
+Èí 0xc8ed
+Èì 0xc8ec
+Èë 0xc8eb
+Èê 0xc8ea
+Èé 0xc8e9
+Èè 0xc8e8
+Èç 0xc8e7
+Èæ 0xc8e6
+Èå 0xc8e5
+Èä 0xc8e4
+Èã 0xc8e3
+Èâ 0xc8e2
+Èá 0xc8e1
+Èà 0xc8e0
+Èß 0xc8df
+ÈÞ 0xc8de
+ÈÝ 0xc8dd
+ÈÜ 0xc8dc
+ÈÛ 0xc8db
+ÈÚ 0xc8da
+ÈÙ 0xc8d9
+ÈØ 0xc8d8
+È× 0xc8d7
+ÈÖ 0xc8d6
+ÈÕ 0xc8d5
+ÈÔ 0xc8d4
+ÈÓ 0xc8d3
+ÈÒ 0xc8d2
+ÈÑ 0xc8d1
+ÈÐ 0xc8d0
+ÈÏ 0xc8cf
+ÈÎ 0xc8ce
+ÈÍ 0xc8cd
+ÈÌ 0xc8cc
+ÈË 0xc8cb
+ÈÊ 0xc8ca
+ÈÉ 0xc8c9
+ÈÈ 0xc8c8
+ÈÇ 0xc8c7
+ÈÆ 0xc8c6
+ÈÅ 0xc8c5
+ÈÄ 0xc8c4
+ÈÃ 0xc8c3
+ÈÂ 0xc8c2
+ÈÁ 0xc8c1
+ÈÀ 0xc8c0
+È¿ 0xc8bf
+Ⱦ 0xc8be
+Ƚ 0xc8bd
+ȼ 0xc8bc
+È» 0xc8bb
+Ⱥ 0xc8ba
+ȹ 0xc8b9
+ȸ 0xc8b8
+È· 0xc8b7
+ȶ 0xc8b6
+ȵ 0xc8b5
+È´ 0xc8b4
+ȳ 0xc8b3
+Ȳ 0xc8b2
+ȱ 0xc8b1
+È° 0xc8b0
+ȯ 0xc8af
+È® 0xc8ae
+È­ 0xc8ad
+Ȭ 0xc8ac
+È« 0xc8ab
+Ȫ 0xc8aa
+È© 0xc8a9
+Ȩ 0xc8a8
+ȧ 0xc8a7
+Ȧ 0xc8a6
+È¥ 0xc8a5
+Ȥ 0xc8a4
+È£ 0xc8a3
+È¢ 0xc8a2
+È¡ 0xc8a1
+Éþ 0xc9fe
+Éý 0xc9fd
+Éü 0xc9fc
+Éû 0xc9fb
+Éú 0xc9fa
+Éù 0xc9f9
+Éø 0xc9f8
+É÷ 0xc9f7
+Éö 0xc9f6
+Éõ 0xc9f5
+Éô 0xc9f4
+Éó 0xc9f3
+Éò 0xc9f2
+Éñ 0xc9f1
+Éð 0xc9f0
+Éï 0xc9ef
+Éî 0xc9ee
+Éí 0xc9ed
+Éì 0xc9ec
+Éë 0xc9eb
+Éê 0xc9ea
+Éé 0xc9e9
+Éè 0xc9e8
+Éç 0xc9e7
+Éæ 0xc9e6
+Éå 0xc9e5
+Éä 0xc9e4
+Éã 0xc9e3
+Éâ 0xc9e2
+Éá 0xc9e1
+Éà 0xc9e0
+Éß 0xc9df
+ÉÞ 0xc9de
+ÉÝ 0xc9dd
+ÉÜ 0xc9dc
+ÉÛ 0xc9db
+ÉÚ 0xc9da
+ÉÙ 0xc9d9
+ÉØ 0xc9d8
+É× 0xc9d7
+ÉÖ 0xc9d6
+ÉÕ 0xc9d5
+ÉÔ 0xc9d4
+ÉÓ 0xc9d3
+ÉÒ 0xc9d2
+ÉÑ 0xc9d1
+ÉÐ 0xc9d0
+ÉÏ 0xc9cf
+ÉÎ 0xc9ce
+ÉÍ 0xc9cd
+ÉÌ 0xc9cc
+ÉË 0xc9cb
+ÉÊ 0xc9ca
+ÉÉ 0xc9c9
+ÉÈ 0xc9c8
+ÉÇ 0xc9c7
+ÉÆ 0xc9c6
+ÉÅ 0xc9c5
+ÉÄ 0xc9c4
+ÉÃ 0xc9c3
+ÉÂ 0xc9c2
+ÉÁ 0xc9c1
+ÉÀ 0xc9c0
+É¿ 0xc9bf
+ɾ 0xc9be
+ɽ 0xc9bd
+ɼ 0xc9bc
+É» 0xc9bb
+ɺ 0xc9ba
+ɹ 0xc9b9
+ɸ 0xc9b8
+É· 0xc9b7
+ɶ 0xc9b6
+ɵ 0xc9b5
+É´ 0xc9b4
+ɳ 0xc9b3
+ɲ 0xc9b2
+ɱ 0xc9b1
+É° 0xc9b0
+ɯ 0xc9af
+É® 0xc9ae
+É­ 0xc9ad
+ɬ 0xc9ac
+É« 0xc9ab
+ɪ 0xc9aa
+É© 0xc9a9
+ɨ 0xc9a8
+ɧ 0xc9a7
+ɦ 0xc9a6
+É¥ 0xc9a5
+ɤ 0xc9a4
+É£ 0xc9a3
+É¢ 0xc9a2
+É¡ 0xc9a1
+Êþ 0xcafe
+Êý 0xcafd
+Êü 0xcafc
+Êû 0xcafb
+Êú 0xcafa
+Êù 0xcaf9
+Êø 0xcaf8
+Ê÷ 0xcaf7
+Êö 0xcaf6
+Êõ 0xcaf5
+Êô 0xcaf4
+Êó 0xcaf3
+Êò 0xcaf2
+Êñ 0xcaf1
+Êð 0xcaf0
+Êï 0xcaef
+Êî 0xcaee
+Êí 0xcaed
+Êì 0xcaec
+Êë 0xcaeb
+Êê 0xcaea
+Êé 0xcae9
+Êè 0xcae8
+Êç 0xcae7
+Êæ 0xcae6
+Êå 0xcae5
+Êä 0xcae4
+Êã 0xcae3
+Êâ 0xcae2
+Êá 0xcae1
+Êà 0xcae0
+Êß 0xcadf
+ÊÞ 0xcade
+ÊÝ 0xcadd
+ÊÜ 0xcadc
+ÊÛ 0xcadb
+ÊÚ 0xcada
+ÊÙ 0xcad9
+ÊØ 0xcad8
+Ê× 0xcad7
+ÊÖ 0xcad6
+ÊÕ 0xcad5
+ÊÔ 0xcad4
+ÊÓ 0xcad3
+ÊÒ 0xcad2
+ÊÑ 0xcad1
+ÊÐ 0xcad0
+ÊÏ 0xcacf
+ÊÎ 0xcace
+ÊÍ 0xcacd
+ÊÌ 0xcacc
+ÊË 0xcacb
+ÊÊ 0xcaca
+ÊÉ 0xcac9
+ÊÈ 0xcac8
+ÊÇ 0xcac7
+ÊÆ 0xcac6
+ÊÅ 0xcac5
+ÊÄ 0xcac4
+ÊÃ 0xcac3
+ÊÂ 0xcac2
+ÊÁ 0xcac1
+ÊÀ 0xcac0
+Ê¿ 0xcabf
+ʾ 0xcabe
+ʽ 0xcabd
+ʼ 0xcabc
+Ê» 0xcabb
+ʺ 0xcaba
+ʹ 0xcab9
+ʸ 0xcab8
+Ê· 0xcab7
+ʶ 0xcab6
+ʵ 0xcab5
+Ê´ 0xcab4
+ʳ 0xcab3
+ʲ 0xcab2
+ʱ 0xcab1
+Ê° 0xcab0
+ʯ 0xcaaf
+Ê® 0xcaae
+Ê­ 0xcaad
+ʬ 0xcaac
+Ê« 0xcaab
+ʪ 0xcaaa
+Ê© 0xcaa9
+ʨ 0xcaa8
+ʧ 0xcaa7
+ʦ 0xcaa6
+Ê¥ 0xcaa5
+ʤ 0xcaa4
+Ê£ 0xcaa3
+Ê¢ 0xcaa2
+Ê¡ 0xcaa1
+Ëþ 0xcbfe
+Ëý 0xcbfd
+Ëü 0xcbfc
+Ëû 0xcbfb
+Ëú 0xcbfa
+Ëù 0xcbf9
+Ëø 0xcbf8
+Ë÷ 0xcbf7
+Ëö 0xcbf6
+Ëõ 0xcbf5
+Ëô 0xcbf4
+Ëó 0xcbf3
+Ëò 0xcbf2
+Ëñ 0xcbf1
+Ëð 0xcbf0
+Ëï 0xcbef
+Ëî 0xcbee
+Ëí 0xcbed
+Ëì 0xcbec
+Ëë 0xcbeb
+Ëê 0xcbea
+Ëé 0xcbe9
+Ëè 0xcbe8
+Ëç 0xcbe7
+Ëæ 0xcbe6
+Ëå 0xcbe5
+Ëä 0xcbe4
+Ëã 0xcbe3
+Ëâ 0xcbe2
+Ëá 0xcbe1
+Ëà 0xcbe0
+Ëß 0xcbdf
+ËÞ 0xcbde
+ËÝ 0xcbdd
+ËÜ 0xcbdc
+ËÛ 0xcbdb
+ËÚ 0xcbda
+ËÙ 0xcbd9
+ËØ 0xcbd8
+Ë× 0xcbd7
+ËÖ 0xcbd6
+ËÕ 0xcbd5
+ËÔ 0xcbd4
+ËÓ 0xcbd3
+ËÒ 0xcbd2
+ËÑ 0xcbd1
+ËÐ 0xcbd0
+ËÏ 0xcbcf
+ËÎ 0xcbce
+ËÍ 0xcbcd
+ËÌ 0xcbcc
+ËË 0xcbcb
+ËÊ 0xcbca
+ËÉ 0xcbc9
+ËÈ 0xcbc8
+ËÇ 0xcbc7
+ËÆ 0xcbc6
+ËÅ 0xcbc5
+ËÄ 0xcbc4
+ËÃ 0xcbc3
+ËÂ 0xcbc2
+ËÁ 0xcbc1
+ËÀ 0xcbc0
+Ë¿ 0xcbbf
+˾ 0xcbbe
+˽ 0xcbbd
+˼ 0xcbbc
+Ë» 0xcbbb
+˺ 0xcbba
+˹ 0xcbb9
+˸ 0xcbb8
+Ë· 0xcbb7
+˶ 0xcbb6
+˵ 0xcbb5
+Ë´ 0xcbb4
+˳ 0xcbb3
+˲ 0xcbb2
+˱ 0xcbb1
+Ë° 0xcbb0
+˯ 0xcbaf
+Ë® 0xcbae
+Ë­ 0xcbad
+ˬ 0xcbac
+Ë« 0xcbab
+˪ 0xcbaa
+Ë© 0xcba9
+˨ 0xcba8
+˧ 0xcba7
+˦ 0xcba6
+Ë¥ 0xcba5
+ˤ 0xcba4
+Ë£ 0xcba3
+Ë¢ 0xcba2
+Ë¡ 0xcba1
+Ìþ 0xccfe
+Ìý 0xccfd
+Ìü 0xccfc
+Ìû 0xccfb
+Ìú 0xccfa
+Ìù 0xccf9
+Ìø 0xccf8
+Ì÷ 0xccf7
+Ìö 0xccf6
+Ìõ 0xccf5
+Ìô 0xccf4
+Ìó 0xccf3
+Ìò 0xccf2
+Ìñ 0xccf1
+Ìð 0xccf0
+Ìï 0xccef
+Ìî 0xccee
+Ìí 0xcced
+Ìì 0xccec
+Ìë 0xcceb
+Ìê 0xccea
+Ìé 0xcce9
+Ìè 0xcce8
+Ìç 0xcce7
+Ìæ 0xcce6
+Ìå 0xcce5
+Ìä 0xcce4
+Ìã 0xcce3
+Ìâ 0xcce2
+Ìá 0xcce1
+Ìà 0xcce0
+Ìß 0xccdf
+ÌÞ 0xccde
+ÌÝ 0xccdd
+ÌÜ 0xccdc
+ÌÛ 0xccdb
+ÌÚ 0xccda
+ÌÙ 0xccd9
+ÌØ 0xccd8
+Ì× 0xccd7
+ÌÖ 0xccd6
+ÌÕ 0xccd5
+ÌÔ 0xccd4
+ÌÓ 0xccd3
+ÌÒ 0xccd2
+ÌÑ 0xccd1
+ÌÐ 0xccd0
+ÌÏ 0xcccf
+ÌÎ 0xccce
+ÌÍ 0xcccd
+ÌÌ 0xcccc
+ÌË 0xcccb
+ÌÊ 0xccca
+ÌÉ 0xccc9
+ÌÈ 0xccc8
+ÌÇ 0xccc7
+ÌÆ 0xccc6
+ÌÅ 0xccc5
+ÌÄ 0xccc4
+ÌÃ 0xccc3
+ÌÂ 0xccc2
+ÌÁ 0xccc1
+ÌÀ 0xccc0
+Ì¿ 0xccbf
+̾ 0xccbe
+̽ 0xccbd
+̼ 0xccbc
+Ì» 0xccbb
+̺ 0xccba
+̹ 0xccb9
+̸ 0xccb8
+Ì· 0xccb7
+̶ 0xccb6
+̵ 0xccb5
+Ì´ 0xccb4
+̳ 0xccb3
+̲ 0xccb2
+̱ 0xccb1
+Ì° 0xccb0
+̯ 0xccaf
+Ì® 0xccae
+Ì­ 0xccad
+̬ 0xccac
+Ì« 0xccab
+̪ 0xccaa
+Ì© 0xcca9
+̨ 0xcca8
+̧ 0xcca7
+̦ 0xcca6
+Ì¥ 0xcca5
+̤ 0xcca4
+Ì£ 0xcca3
+Ì¢ 0xcca2
+Ì¡ 0xcca1
+Íþ 0xcdfe
+Íý 0xcdfd
+Íü 0xcdfc
+Íû 0xcdfb
+Íú 0xcdfa
+Íù 0xcdf9
+Íø 0xcdf8
+Í÷ 0xcdf7
+Íö 0xcdf6
+Íõ 0xcdf5
+Íô 0xcdf4
+Íó 0xcdf3
+Íò 0xcdf2
+Íñ 0xcdf1
+Íð 0xcdf0
+Íï 0xcdef
+Íî 0xcdee
+Íí 0xcded
+Íì 0xcdec
+Íë 0xcdeb
+Íê 0xcdea
+Íé 0xcde9
+Íè 0xcde8
+Íç 0xcde7
+Íæ 0xcde6
+Íå 0xcde5
+Íä 0xcde4
+Íã 0xcde3
+Íâ 0xcde2
+Íá 0xcde1
+Íà 0xcde0
+Íß 0xcddf
+ÍÞ 0xcdde
+ÍÝ 0xcddd
+ÍÜ 0xcddc
+ÍÛ 0xcddb
+ÍÚ 0xcdda
+ÍÙ 0xcdd9
+ÍØ 0xcdd8
+Í× 0xcdd7
+ÍÖ 0xcdd6
+ÍÕ 0xcdd5
+ÍÔ 0xcdd4
+ÍÓ 0xcdd3
+ÍÒ 0xcdd2
+ÍÑ 0xcdd1
+ÍÐ 0xcdd0
+ÍÏ 0xcdcf
+ÍÎ 0xcdce
+ÍÍ 0xcdcd
+ÍÌ 0xcdcc
+ÍË 0xcdcb
+ÍÊ 0xcdca
+ÍÉ 0xcdc9
+ÍÈ 0xcdc8
+ÍÇ 0xcdc7
+ÍÆ 0xcdc6
+ÍÅ 0xcdc5
+ÍÄ 0xcdc4
+ÍÃ 0xcdc3
+ÍÂ 0xcdc2
+ÍÁ 0xcdc1
+ÍÀ 0xcdc0
+Í¿ 0xcdbf
+; 0xcdbe
+ͽ 0xcdbd
+ͼ 0xcdbc
+Í» 0xcdbb
+ͺ 0xcdba
+͹ 0xcdb9
+͸ 0xcdb8
+Í· 0xcdb7
+Ͷ 0xcdb6
+͵ 0xcdb5
+Í´ 0xcdb4
+ͳ 0xcdb3
+Ͳ 0xcdb2
+ͱ 0xcdb1
+Í° 0xcdb0
+ͯ 0xcdaf
+Í® 0xcdae
+Í­ 0xcdad
+ͬ 0xcdac
+Í« 0xcdab
+ͪ 0xcdaa
+Í© 0xcda9
+ͨ 0xcda8
+ͧ 0xcda7
+ͦ 0xcda6
+Í¥ 0xcda5
+ͤ 0xcda4
+Í£ 0xcda3
+Í¢ 0xcda2
+Í¡ 0xcda1
+Îþ 0xcefe
+Îý 0xcefd
+Îü 0xcefc
+Îû 0xcefb
+Îú 0xcefa
+Îù 0xcef9
+Îø 0xcef8
+Î÷ 0xcef7
+Îö 0xcef6
+Îõ 0xcef5
+Îô 0xcef4
+Îó 0xcef3
+Îò 0xcef2
+Îñ 0xcef1
+Îð 0xcef0
+Îï 0xceef
+Îî 0xceee
+Îí 0xceed
+Îì 0xceec
+Îë 0xceeb
+Îê 0xceea
+Îé 0xcee9
+Îè 0xcee8
+Îç 0xcee7
+Îæ 0xcee6
+Îå 0xcee5
+Îä 0xcee4
+Îã 0xcee3
+Îâ 0xcee2
+Îá 0xcee1
+Îà 0xcee0
+Îß 0xcedf
+ÎÞ 0xcede
+ÎÝ 0xcedd
+ÎÜ 0xcedc
+ÎÛ 0xcedb
+ÎÚ 0xceda
+ÎÙ 0xced9
+ÎØ 0xced8
+Î× 0xced7
+ÎÖ 0xced6
+ÎÕ 0xced5
+ÎÔ 0xced4
+ÎÓ 0xced3
+ÎÒ 0xced2
+ÎÑ 0xced1
+ÎÐ 0xced0
+ÎÏ 0xcecf
+ÎÎ 0xcece
+ÎÍ 0xcecd
+ÎÌ 0xcecc
+ÎË 0xcecb
+ÎÊ 0xceca
+ÎÉ 0xcec9
+ÎÈ 0xcec8
+ÎÇ 0xcec7
+ÎÆ 0xcec6
+ÎÅ 0xcec5
+ÎÄ 0xcec4
+ÎÃ 0xcec3
+ÎÂ 0xcec2
+ÎÁ 0xcec1
+ÎÀ 0xcec0
+ο 0xcebf
+ξ 0xcebe
+ν 0xcebd
+μ 0xcebc
+λ 0xcebb
+κ 0xceba
+ι 0xceb9
+θ 0xceb8
+η 0xceb7
+ζ 0xceb6
+ε 0xceb5
+δ 0xceb4
+γ 0xceb3
+β 0xceb2
+α 0xceb1
+ΰ 0xceb0
+ί 0xceaf
+ή 0xceae
+έ 0xcead
+ά 0xceac
+Ϋ 0xceab
+Ϊ 0xceaa
+Ω 0xcea9
+Ψ 0xcea8
+Χ 0xcea7
+Φ 0xcea6
+Î¥ 0xcea5
+Τ 0xcea4
+Σ 0xcea3
+΢ 0xcea2
+Ρ 0xcea1
+Ïþ 0xcffe
+Ïý 0xcffd
+Ïü 0xcffc
+Ïû 0xcffb
+Ïú 0xcffa
+Ïù 0xcff9
+Ïø 0xcff8
+Ï÷ 0xcff7
+Ïö 0xcff6
+Ïõ 0xcff5
+Ïô 0xcff4
+Ïó 0xcff3
+Ïò 0xcff2
+Ïñ 0xcff1
+Ïð 0xcff0
+Ïï 0xcfef
+Ïî 0xcfee
+Ïí 0xcfed
+Ïì 0xcfec
+Ïë 0xcfeb
+Ïê 0xcfea
+Ïé 0xcfe9
+Ïè 0xcfe8
+Ïç 0xcfe7
+Ïæ 0xcfe6
+Ïå 0xcfe5
+Ïä 0xcfe4
+Ïã 0xcfe3
+Ïâ 0xcfe2
+Ïá 0xcfe1
+Ïà 0xcfe0
+Ïß 0xcfdf
+ÏÞ 0xcfde
+ÏÝ 0xcfdd
+ÏÜ 0xcfdc
+ÏÛ 0xcfdb
+ÏÚ 0xcfda
+ÏÙ 0xcfd9
+ÏØ 0xcfd8
+Ï× 0xcfd7
+ÏÖ 0xcfd6
+ÏÕ 0xcfd5
+ÏÔ 0xcfd4
+ÏÓ 0xcfd3
+ÏÒ 0xcfd2
+ÏÑ 0xcfd1
+ÏÐ 0xcfd0
+ÏÏ 0xcfcf
+ÏÎ 0xcfce
+ÏÍ 0xcfcd
+ÏÌ 0xcfcc
+ÏË 0xcfcb
+ÏÊ 0xcfca
+ÏÉ 0xcfc9
+ÏÈ 0xcfc8
+ÏÇ 0xcfc7
+ÏÆ 0xcfc6
+ÏÅ 0xcfc5
+ÏÄ 0xcfc4
+ÏÃ 0xcfc3
+ÏÂ 0xcfc2
+ÏÁ 0xcfc1
+ÏÀ 0xcfc0
+Ï¿ 0xcfbf
+Ͼ 0xcfbe
+Ͻ 0xcfbd
+ϼ 0xcfbc
+Ï» 0xcfbb
+Ϻ 0xcfba
+Ϲ 0xcfb9
+ϸ 0xcfb8
+Ï· 0xcfb7
+϶ 0xcfb6
+ϵ 0xcfb5
+Ï´ 0xcfb4
+ϳ 0xcfb3
+ϲ 0xcfb2
+ϱ 0xcfb1
+Ï° 0xcfb0
+ϯ 0xcfaf
+Ï® 0xcfae
+Ï­ 0xcfad
+Ϭ 0xcfac
+Ï« 0xcfab
+Ϫ 0xcfaa
+Ï© 0xcfa9
+Ϩ 0xcfa8
+ϧ 0xcfa7
+Ϧ 0xcfa6
+Ï¥ 0xcfa5
+Ϥ 0xcfa4
+Ï£ 0xcfa3
+Ï¢ 0xcfa2
+Ï¡ 0xcfa1
+Ðþ 0xd0fe
+Ðý 0xd0fd
+Ðü 0xd0fc
+Ðû 0xd0fb
+Ðú 0xd0fa
+Ðù 0xd0f9
+Ðø 0xd0f8
+Ð÷ 0xd0f7
+Ðö 0xd0f6
+Ðõ 0xd0f5
+Ðô 0xd0f4
+Ðó 0xd0f3
+Ðò 0xd0f2
+Ðñ 0xd0f1
+Ðð 0xd0f0
+Ðï 0xd0ef
+Ðî 0xd0ee
+Ðí 0xd0ed
+Ðì 0xd0ec
+Ðë 0xd0eb
+Ðê 0xd0ea
+Ðé 0xd0e9
+Ðè 0xd0e8
+Ðç 0xd0e7
+Ðæ 0xd0e6
+Ðå 0xd0e5
+Ðä 0xd0e4
+Ðã 0xd0e3
+Ðâ 0xd0e2
+Ðá 0xd0e1
+Ðà 0xd0e0
+Ðß 0xd0df
+ÐÞ 0xd0de
+ÐÝ 0xd0dd
+ÐÜ 0xd0dc
+ÐÛ 0xd0db
+ÐÚ 0xd0da
+ÐÙ 0xd0d9
+ÐØ 0xd0d8
+Ð× 0xd0d7
+ÐÖ 0xd0d6
+ÐÕ 0xd0d5
+ÐÔ 0xd0d4
+ÐÓ 0xd0d3
+ÐÒ 0xd0d2
+ÐÑ 0xd0d1
+ÐÐ 0xd0d0
+ÐÏ 0xd0cf
+ÐÎ 0xd0ce
+ÐÍ 0xd0cd
+ÐÌ 0xd0cc
+ÐË 0xd0cb
+ÐÊ 0xd0ca
+ÐÉ 0xd0c9
+ÐÈ 0xd0c8
+ÐÇ 0xd0c7
+ÐÆ 0xd0c6
+ÐÅ 0xd0c5
+ÐÄ 0xd0c4
+ÐÃ 0xd0c3
+ÐÂ 0xd0c2
+ÐÁ 0xd0c1
+ÐÀ 0xd0c0
+п 0xd0bf
+о 0xd0be
+н 0xd0bd
+м 0xd0bc
+л 0xd0bb
+к 0xd0ba
+й 0xd0b9
+и 0xd0b8
+з 0xd0b7
+ж 0xd0b6
+е 0xd0b5
+д 0xd0b4
+г 0xd0b3
+в 0xd0b2
+б 0xd0b1
+а 0xd0b0
+Я 0xd0af
+Ю 0xd0ae
+Э 0xd0ad
+Ь 0xd0ac
+Ы 0xd0ab
+Ъ 0xd0aa
+Щ 0xd0a9
+Ш 0xd0a8
+Ч 0xd0a7
+Ц 0xd0a6
+Ð¥ 0xd0a5
+Ф 0xd0a4
+У 0xd0a3
+Т 0xd0a2
+С 0xd0a1
+Ñþ 0xd1fe
+Ñý 0xd1fd
+Ñü 0xd1fc
+Ñû 0xd1fb
+Ñú 0xd1fa
+Ñù 0xd1f9
+Ñø 0xd1f8
+Ñ÷ 0xd1f7
+Ñö 0xd1f6
+Ñõ 0xd1f5
+Ñô 0xd1f4
+Ñó 0xd1f3
+Ñò 0xd1f2
+Ññ 0xd1f1
+Ñð 0xd1f0
+Ñï 0xd1ef
+Ñî 0xd1ee
+Ñí 0xd1ed
+Ñì 0xd1ec
+Ñë 0xd1eb
+Ñê 0xd1ea
+Ñé 0xd1e9
+Ñè 0xd1e8
+Ñç 0xd1e7
+Ñæ 0xd1e6
+Ñå 0xd1e5
+Ñä 0xd1e4
+Ñã 0xd1e3
+Ñâ 0xd1e2
+Ñá 0xd1e1
+Ñà 0xd1e0
+Ñß 0xd1df
+ÑÞ 0xd1de
+ÑÝ 0xd1dd
+ÑÜ 0xd1dc
+ÑÛ 0xd1db
+ÑÚ 0xd1da
+ÑÙ 0xd1d9
+ÑØ 0xd1d8
+Ñ× 0xd1d7
+ÑÖ 0xd1d6
+ÑÕ 0xd1d5
+ÑÔ 0xd1d4
+ÑÓ 0xd1d3
+ÑÒ 0xd1d2
+ÑÑ 0xd1d1
+ÑÐ 0xd1d0
+ÑÏ 0xd1cf
+ÑÎ 0xd1ce
+ÑÍ 0xd1cd
+ÑÌ 0xd1cc
+ÑË 0xd1cb
+ÑÊ 0xd1ca
+ÑÉ 0xd1c9
+ÑÈ 0xd1c8
+ÑÇ 0xd1c7
+ÑÆ 0xd1c6
+ÑÅ 0xd1c5
+ÑÄ 0xd1c4
+ÑÃ 0xd1c3
+ÑÂ 0xd1c2
+ÑÁ 0xd1c1
+ÑÀ 0xd1c0
+Ñ¿ 0xd1bf
+Ѿ 0xd1be
+ѽ 0xd1bd
+Ѽ 0xd1bc
+Ñ» 0xd1bb
+Ѻ 0xd1ba
+ѹ 0xd1b9
+Ѹ 0xd1b8
+Ñ· 0xd1b7
+Ѷ 0xd1b6
+ѵ 0xd1b5
+Ñ´ 0xd1b4
+ѳ 0xd1b3
+Ѳ 0xd1b2
+ѱ 0xd1b1
+Ñ° 0xd1b0
+ѯ 0xd1af
+Ñ® 0xd1ae
+Ñ­ 0xd1ad
+Ѭ 0xd1ac
+Ñ« 0xd1ab
+Ѫ 0xd1aa
+Ñ© 0xd1a9
+Ѩ 0xd1a8
+ѧ 0xd1a7
+Ѧ 0xd1a6
+Ñ¥ 0xd1a5
+Ѥ 0xd1a4
+Ñ£ 0xd1a3
+Ñ¢ 0xd1a2
+Ñ¡ 0xd1a1
+Òþ 0xd2fe
+Òý 0xd2fd
+Òü 0xd2fc
+Òû 0xd2fb
+Òú 0xd2fa
+Òù 0xd2f9
+Òø 0xd2f8
+Ò÷ 0xd2f7
+Òö 0xd2f6
+Òõ 0xd2f5
+Òô 0xd2f4
+Òó 0xd2f3
+Òò 0xd2f2
+Òñ 0xd2f1
+Òð 0xd2f0
+Òï 0xd2ef
+Òî 0xd2ee
+Òí 0xd2ed
+Òì 0xd2ec
+Òë 0xd2eb
+Òê 0xd2ea
+Òé 0xd2e9
+Òè 0xd2e8
+Òç 0xd2e7
+Òæ 0xd2e6
+Òå 0xd2e5
+Òä 0xd2e4
+Òã 0xd2e3
+Òâ 0xd2e2
+Òá 0xd2e1
+Òà 0xd2e0
+Òß 0xd2df
+ÒÞ 0xd2de
+ÒÝ 0xd2dd
+ÒÜ 0xd2dc
+ÒÛ 0xd2db
+ÒÚ 0xd2da
+ÒÙ 0xd2d9
+ÒØ 0xd2d8
+Ò× 0xd2d7
+ÒÖ 0xd2d6
+ÒÕ 0xd2d5
+ÒÔ 0xd2d4
+ÒÓ 0xd2d3
+ÒÒ 0xd2d2
+ÒÑ 0xd2d1
+ÒÐ 0xd2d0
+ÒÏ 0xd2cf
+ÒÎ 0xd2ce
+ÒÍ 0xd2cd
+ÒÌ 0xd2cc
+ÒË 0xd2cb
+ÒÊ 0xd2ca
+ÒÉ 0xd2c9
+ÒÈ 0xd2c8
+ÒÇ 0xd2c7
+ÒÆ 0xd2c6
+ÒÅ 0xd2c5
+ÒÄ 0xd2c4
+ÒÃ 0xd2c3
+ÒÂ 0xd2c2
+ÒÁ 0xd2c1
+ÒÀ 0xd2c0
+Ò¿ 0xd2bf
+Ò¾ 0xd2be
+Ò½ 0xd2bd
+Ò¼ 0xd2bc
+Ò» 0xd2bb
+Òº 0xd2ba
+Ò¹ 0xd2b9
+Ò¸ 0xd2b8
+Ò· 0xd2b7
+Ò¶ 0xd2b6
+Òµ 0xd2b5
+Ò´ 0xd2b4
+Ò³ 0xd2b3
+Ò² 0xd2b2
+Ò± 0xd2b1
+Ò° 0xd2b0
+Ò¯ 0xd2af
+Ò® 0xd2ae
+Ò­ 0xd2ad
+Ò¬ 0xd2ac
+Ò« 0xd2ab
+Òª 0xd2aa
+Ò© 0xd2a9
+Ò¨ 0xd2a8
+Ò§ 0xd2a7
+Ò¦ 0xd2a6
+Ò¥ 0xd2a5
+Ò¤ 0xd2a4
+Ò£ 0xd2a3
+Ò¢ 0xd2a2
+Ò¡ 0xd2a1
+Óþ 0xd3fe
+Óý 0xd3fd
+Óü 0xd3fc
+Óû 0xd3fb
+Óú 0xd3fa
+Óù 0xd3f9
+Óø 0xd3f8
+Ó÷ 0xd3f7
+Óö 0xd3f6
+Óõ 0xd3f5
+Óô 0xd3f4
+Óó 0xd3f3
+Óò 0xd3f2
+Óñ 0xd3f1
+Óð 0xd3f0
+Óï 0xd3ef
+Óî 0xd3ee
+Óí 0xd3ed
+Óì 0xd3ec
+Óë 0xd3eb
+Óê 0xd3ea
+Óé 0xd3e9
+Óè 0xd3e8
+Óç 0xd3e7
+Óæ 0xd3e6
+Óå 0xd3e5
+Óä 0xd3e4
+Óã 0xd3e3
+Óâ 0xd3e2
+Óá 0xd3e1
+Óà 0xd3e0
+Óß 0xd3df
+ÓÞ 0xd3de
+ÓÝ 0xd3dd
+ÓÜ 0xd3dc
+ÓÛ 0xd3db
+ÓÚ 0xd3da
+ÓÙ 0xd3d9
+ÓØ 0xd3d8
+Ó× 0xd3d7
+ÓÖ 0xd3d6
+ÓÕ 0xd3d5
+ÓÔ 0xd3d4
+ÓÓ 0xd3d3
+ÓÒ 0xd3d2
+ÓÑ 0xd3d1
+ÓÐ 0xd3d0
+ÓÏ 0xd3cf
+ÓÎ 0xd3ce
+ÓÍ 0xd3cd
+ÓÌ 0xd3cc
+ÓË 0xd3cb
+ÓÊ 0xd3ca
+ÓÉ 0xd3c9
+ÓÈ 0xd3c8
+ÓÇ 0xd3c7
+ÓÆ 0xd3c6
+ÓÅ 0xd3c5
+ÓÄ 0xd3c4
+ÓÃ 0xd3c3
+ÓÂ 0xd3c2
+ÓÁ 0xd3c1
+ÓÀ 0xd3c0
+Ó¿ 0xd3bf
+Ó¾ 0xd3be
+Ó½ 0xd3bd
+Ó¼ 0xd3bc
+Ó» 0xd3bb
+Óº 0xd3ba
+Ó¹ 0xd3b9
+Ó¸ 0xd3b8
+Ó· 0xd3b7
+Ó¶ 0xd3b6
+Óµ 0xd3b5
+Ó´ 0xd3b4
+Ó³ 0xd3b3
+Ó² 0xd3b2
+Ó± 0xd3b1
+Ó° 0xd3b0
+Ó¯ 0xd3af
+Ó® 0xd3ae
+Ó­ 0xd3ad
+Ó¬ 0xd3ac
+Ó« 0xd3ab
+Óª 0xd3aa
+Ó© 0xd3a9
+Ó¨ 0xd3a8
+Ó§ 0xd3a7
+Ó¦ 0xd3a6
+Ó¥ 0xd3a5
+Ó¤ 0xd3a4
+Ó£ 0xd3a3
+Ó¢ 0xd3a2
+Ó¡ 0xd3a1
+Ôþ 0xd4fe
+Ôý 0xd4fd
+Ôü 0xd4fc
+Ôû 0xd4fb
+Ôú 0xd4fa
+Ôù 0xd4f9
+Ôø 0xd4f8
+Ô÷ 0xd4f7
+Ôö 0xd4f6
+Ôõ 0xd4f5
+Ôô 0xd4f4
+Ôó 0xd4f3
+Ôò 0xd4f2
+Ôñ 0xd4f1
+Ôð 0xd4f0
+Ôï 0xd4ef
+Ôî 0xd4ee
+Ôí 0xd4ed
+Ôì 0xd4ec
+Ôë 0xd4eb
+Ôê 0xd4ea
+Ôé 0xd4e9
+Ôè 0xd4e8
+Ôç 0xd4e7
+Ôæ 0xd4e6
+Ôå 0xd4e5
+Ôä 0xd4e4
+Ôã 0xd4e3
+Ôâ 0xd4e2
+Ôá 0xd4e1
+Ôà 0xd4e0
+Ôß 0xd4df
+ÔÞ 0xd4de
+ÔÝ 0xd4dd
+ÔÜ 0xd4dc
+ÔÛ 0xd4db
+ÔÚ 0xd4da
+ÔÙ 0xd4d9
+ÔØ 0xd4d8
+Ô× 0xd4d7
+ÔÖ 0xd4d6
+ÔÕ 0xd4d5
+ÔÔ 0xd4d4
+ÔÓ 0xd4d3
+ÔÒ 0xd4d2
+ÔÑ 0xd4d1
+ÔÐ 0xd4d0
+ÔÏ 0xd4cf
+ÔÎ 0xd4ce
+ÔÍ 0xd4cd
+ÔÌ 0xd4cc
+ÔË 0xd4cb
+ÔÊ 0xd4ca
+ÔÉ 0xd4c9
+ÔÈ 0xd4c8
+ÔÇ 0xd4c7
+ÔÆ 0xd4c6
+ÔÅ 0xd4c5
+ÔÄ 0xd4c4
+ÔÃ 0xd4c3
+ÔÂ 0xd4c2
+ÔÁ 0xd4c1
+ÔÀ 0xd4c0
+Ô¿ 0xd4bf
+Ô¾ 0xd4be
+Ô½ 0xd4bd
+Ô¼ 0xd4bc
+Ô» 0xd4bb
+Ôº 0xd4ba
+Ô¹ 0xd4b9
+Ô¸ 0xd4b8
+Ô· 0xd4b7
+Ô¶ 0xd4b6
+Ôµ 0xd4b5
+Ô´ 0xd4b4
+Ô³ 0xd4b3
+Ô² 0xd4b2
+Ô± 0xd4b1
+Ô° 0xd4b0
+Ô¯ 0xd4af
+Ô® 0xd4ae
+Ô­ 0xd4ad
+Ô¬ 0xd4ac
+Ô« 0xd4ab
+Ôª 0xd4aa
+Ô© 0xd4a9
+Ô¨ 0xd4a8
+Ô§ 0xd4a7
+Ô¦ 0xd4a6
+Ô¥ 0xd4a5
+Ô¤ 0xd4a4
+Ô£ 0xd4a3
+Ô¢ 0xd4a2
+Ô¡ 0xd4a1
+Õþ 0xd5fe
+Õý 0xd5fd
+Õü 0xd5fc
+Õû 0xd5fb
+Õú 0xd5fa
+Õù 0xd5f9
+Õø 0xd5f8
+Õ÷ 0xd5f7
+Õö 0xd5f6
+Õõ 0xd5f5
+Õô 0xd5f4
+Õó 0xd5f3
+Õò 0xd5f2
+Õñ 0xd5f1
+Õð 0xd5f0
+Õï 0xd5ef
+Õî 0xd5ee
+Õí 0xd5ed
+Õì 0xd5ec
+Õë 0xd5eb
+Õê 0xd5ea
+Õé 0xd5e9
+Õè 0xd5e8
+Õç 0xd5e7
+Õæ 0xd5e6
+Õå 0xd5e5
+Õä 0xd5e4
+Õã 0xd5e3
+Õâ 0xd5e2
+Õá 0xd5e1
+Õà 0xd5e0
+Õß 0xd5df
+ÕÞ 0xd5de
+ÕÝ 0xd5dd
+ÕÜ 0xd5dc
+ÕÛ 0xd5db
+ÕÚ 0xd5da
+ÕÙ 0xd5d9
+ÕØ 0xd5d8
+Õ× 0xd5d7
+ÕÖ 0xd5d6
+ÕÕ 0xd5d5
+ÕÔ 0xd5d4
+ÕÓ 0xd5d3
+ÕÒ 0xd5d2
+ÕÑ 0xd5d1
+ÕÐ 0xd5d0
+ÕÏ 0xd5cf
+ÕÎ 0xd5ce
+ÕÍ 0xd5cd
+ÕÌ 0xd5cc
+ÕË 0xd5cb
+ÕÊ 0xd5ca
+ÕÉ 0xd5c9
+ÕÈ 0xd5c8
+ÕÇ 0xd5c7
+ÕÆ 0xd5c6
+ÕÅ 0xd5c5
+ÕÄ 0xd5c4
+ÕÃ 0xd5c3
+ÕÂ 0xd5c2
+ÕÁ 0xd5c1
+ÕÀ 0xd5c0
+Õ¿ 0xd5bf
+Õ¾ 0xd5be
+Õ½ 0xd5bd
+Õ¼ 0xd5bc
+Õ» 0xd5bb
+Õº 0xd5ba
+Õ¹ 0xd5b9
+Õ¸ 0xd5b8
+Õ· 0xd5b7
+Õ¶ 0xd5b6
+Õµ 0xd5b5
+Õ´ 0xd5b4
+Õ³ 0xd5b3
+Õ² 0xd5b2
+Õ± 0xd5b1
+Õ° 0xd5b0
+Õ¯ 0xd5af
+Õ® 0xd5ae
+Õ­ 0xd5ad
+Õ¬ 0xd5ac
+Õ« 0xd5ab
+Õª 0xd5aa
+Õ© 0xd5a9
+Õ¨ 0xd5a8
+Õ§ 0xd5a7
+Õ¦ 0xd5a6
+Õ¥ 0xd5a5
+Õ¤ 0xd5a4
+Õ£ 0xd5a3
+Õ¢ 0xd5a2
+Õ¡ 0xd5a1
+Öþ 0xd6fe
+Öý 0xd6fd
+Öü 0xd6fc
+Öû 0xd6fb
+Öú 0xd6fa
+Öù 0xd6f9
+Öø 0xd6f8
+Ö÷ 0xd6f7
+Öö 0xd6f6
+Öõ 0xd6f5
+Öô 0xd6f4
+Öó 0xd6f3
+Öò 0xd6f2
+Öñ 0xd6f1
+Öð 0xd6f0
+Öï 0xd6ef
+Öî 0xd6ee
+Öí 0xd6ed
+Öì 0xd6ec
+Öë 0xd6eb
+Öê 0xd6ea
+Öé 0xd6e9
+Öè 0xd6e8
+Öç 0xd6e7
+Öæ 0xd6e6
+Öå 0xd6e5
+Öä 0xd6e4
+Öã 0xd6e3
+Öâ 0xd6e2
+Öá 0xd6e1
+Öà 0xd6e0
+Öß 0xd6df
+ÖÞ 0xd6de
+ÖÝ 0xd6dd
+ÖÜ 0xd6dc
+ÖÛ 0xd6db
+ÖÚ 0xd6da
+ÖÙ 0xd6d9
+ÖØ 0xd6d8
+Ö× 0xd6d7
+ÖÖ 0xd6d6
+ÖÕ 0xd6d5
+ÖÔ 0xd6d4
+ÖÓ 0xd6d3
+ÖÒ 0xd6d2
+ÖÑ 0xd6d1
+ÖÐ 0xd6d0
+ÖÏ 0xd6cf
+ÖÎ 0xd6ce
+ÖÍ 0xd6cd
+ÖÌ 0xd6cc
+ÖË 0xd6cb
+ÖÊ 0xd6ca
+ÖÉ 0xd6c9
+ÖÈ 0xd6c8
+ÖÇ 0xd6c7
+ÖÆ 0xd6c6
+ÖÅ 0xd6c5
+ÖÄ 0xd6c4
+ÖÃ 0xd6c3
+ÖÂ 0xd6c2
+ÖÁ 0xd6c1
+ÖÀ 0xd6c0
+Ö¿ 0xd6bf
+Ö¾ 0xd6be
+Ö½ 0xd6bd
+Ö¼ 0xd6bc
+Ö» 0xd6bb
+Öº 0xd6ba
+Ö¹ 0xd6b9
+Ö¸ 0xd6b8
+Ö· 0xd6b7
+Ö¶ 0xd6b6
+Öµ 0xd6b5
+Ö´ 0xd6b4
+Ö³ 0xd6b3
+Ö² 0xd6b2
+Ö± 0xd6b1
+Ö° 0xd6b0
+Ö¯ 0xd6af
+Ö® 0xd6ae
+Ö­ 0xd6ad
+Ö¬ 0xd6ac
+Ö« 0xd6ab
+Öª 0xd6aa
+Ö© 0xd6a9
+Ö¨ 0xd6a8
+Ö§ 0xd6a7
+Ö¦ 0xd6a6
+Ö¥ 0xd6a5
+Ö¤ 0xd6a4
+Ö£ 0xd6a3
+Ö¢ 0xd6a2
+Ö¡ 0xd6a1
+×ù 0xd7f9
+×ø 0xd7f8
+×÷ 0xd7f7
+×ö 0xd7f6
+×õ 0xd7f5
+×ô 0xd7f4
+×ó 0xd7f3
+×ò 0xd7f2
+×ñ 0xd7f1
+×ð 0xd7f0
+×ï 0xd7ef
+×î 0xd7ee
+×í 0xd7ed
+×ì 0xd7ec
+×ë 0xd7eb
+×ê 0xd7ea
+×é 0xd7e9
+×è 0xd7e8
+×ç 0xd7e7
+×æ 0xd7e6
+×å 0xd7e5
+×ä 0xd7e4
+×ã 0xd7e3
+×â 0xd7e2
+×á 0xd7e1
+×à 0xd7e0
+×ß 0xd7df
+×Þ 0xd7de
+×Ý 0xd7dd
+×Ü 0xd7dc
+×Û 0xd7db
+×Ú 0xd7da
+×Ù 0xd7d9
+×Ø 0xd7d8
+×× 0xd7d7
+×Ö 0xd7d6
+×Õ 0xd7d5
+×Ô 0xd7d4
+×Ó 0xd7d3
+×Ò 0xd7d2
+×Ñ 0xd7d1
+×Ð 0xd7d0
+×Ï 0xd7cf
+×Î 0xd7ce
+×Í 0xd7cd
+×Ì 0xd7cc
+×Ë 0xd7cb
+×Ê 0xd7ca
+×É 0xd7c9
+×È 0xd7c8
+×Ç 0xd7c7
+×Æ 0xd7c6
+×Å 0xd7c5
+×Ä 0xd7c4
+×à 0xd7c3
+× 0xd7c2
+×Á 0xd7c1
+×À 0xd7c0
+׿ 0xd7bf
+×¾ 0xd7be
+×½ 0xd7bd
+×¼ 0xd7bc
+×» 0xd7bb
+׺ 0xd7ba
+×¹ 0xd7b9
+׸ 0xd7b8
+×· 0xd7b7
+׶ 0xd7b6
+×µ 0xd7b5
+×´ 0xd7b4
+׳ 0xd7b3
+ײ 0xd7b2
+×± 0xd7b1
+×° 0xd7b0
+ׯ 0xd7af
+×® 0xd7ae
+×­ 0xd7ad
+׬ 0xd7ac
+׫ 0xd7ab
+ת 0xd7aa
+ש 0xd7a9
+ר 0xd7a8
+ק 0xd7a7
+צ 0xd7a6
+×¥ 0xd7a5
+פ 0xd7a4
+×£ 0xd7a3
+×¢ 0xd7a2
+ס 0xd7a1
+Øþ 0xd8fe
+Øý 0xd8fd
+Øü 0xd8fc
+Øû 0xd8fb
+Øú 0xd8fa
+Øù 0xd8f9
+Øø 0xd8f8
+Ø÷ 0xd8f7
+Øö 0xd8f6
+Øõ 0xd8f5
+Øô 0xd8f4
+Øó 0xd8f3
+Øò 0xd8f2
+Øñ 0xd8f1
+Øð 0xd8f0
+Øï 0xd8ef
+Øî 0xd8ee
+Øí 0xd8ed
+Øì 0xd8ec
+Øë 0xd8eb
+Øê 0xd8ea
+Øé 0xd8e9
+Øè 0xd8e8
+Øç 0xd8e7
+Øæ 0xd8e6
+Øå 0xd8e5
+Øä 0xd8e4
+Øã 0xd8e3
+Øâ 0xd8e2
+Øá 0xd8e1
+Øà 0xd8e0
+Øß 0xd8df
+ØÞ 0xd8de
+ØÝ 0xd8dd
+ØÜ 0xd8dc
+ØÛ 0xd8db
+ØÚ 0xd8da
+ØÙ 0xd8d9
+ØØ 0xd8d8
+Ø× 0xd8d7
+ØÖ 0xd8d6
+ØÕ 0xd8d5
+ØÔ 0xd8d4
+ØÓ 0xd8d3
+ØÒ 0xd8d2
+ØÑ 0xd8d1
+ØÐ 0xd8d0
+ØÏ 0xd8cf
+ØÎ 0xd8ce
+ØÍ 0xd8cd
+ØÌ 0xd8cc
+ØË 0xd8cb
+ØÊ 0xd8ca
+ØÉ 0xd8c9
+ØÈ 0xd8c8
+ØÇ 0xd8c7
+ØÆ 0xd8c6
+ØÅ 0xd8c5
+ØÄ 0xd8c4
+ØÃ 0xd8c3
+ØÂ 0xd8c2
+ØÁ 0xd8c1
+ØÀ 0xd8c0
+Ø¿ 0xd8bf
+ؾ 0xd8be
+ؽ 0xd8bd
+ؼ 0xd8bc
+Ø» 0xd8bb
+غ 0xd8ba
+ع 0xd8b9
+ظ 0xd8b8
+Ø· 0xd8b7
+ض 0xd8b6
+ص 0xd8b5
+Ø´ 0xd8b4
+س 0xd8b3
+ز 0xd8b2
+ر 0xd8b1
+Ø° 0xd8b0
+د 0xd8af
+Ø® 0xd8ae
+Ø­ 0xd8ad
+ج 0xd8ac
+Ø« 0xd8ab
+ت 0xd8aa
+Ø© 0xd8a9
+ب 0xd8a8
+ا 0xd8a7
+ئ 0xd8a6
+Ø¥ 0xd8a5
+ؤ 0xd8a4
+Ø£ 0xd8a3
+Ø¢ 0xd8a2
+Ø¡ 0xd8a1
+Ùþ 0xd9fe
+Ùý 0xd9fd
+Ùü 0xd9fc
+Ùû 0xd9fb
+Ùú 0xd9fa
+Ùù 0xd9f9
+Ùø 0xd9f8
+Ù÷ 0xd9f7
+Ùö 0xd9f6
+Ùõ 0xd9f5
+Ùô 0xd9f4
+Ùó 0xd9f3
+Ùò 0xd9f2
+Ùñ 0xd9f1
+Ùð 0xd9f0
+Ùï 0xd9ef
+Ùî 0xd9ee
+Ùí 0xd9ed
+Ùì 0xd9ec
+Ùë 0xd9eb
+Ùê 0xd9ea
+Ùé 0xd9e9
+Ùè 0xd9e8
+Ùç 0xd9e7
+Ùæ 0xd9e6
+Ùå 0xd9e5
+Ùä 0xd9e4
+Ùã 0xd9e3
+Ùâ 0xd9e2
+Ùá 0xd9e1
+Ùà 0xd9e0
+Ùß 0xd9df
+ÙÞ 0xd9de
+ÙÝ 0xd9dd
+ÙÜ 0xd9dc
+ÙÛ 0xd9db
+ÙÚ 0xd9da
+ÙÙ 0xd9d9
+ÙØ 0xd9d8
+Ù× 0xd9d7
+ÙÖ 0xd9d6
+ÙÕ 0xd9d5
+ÙÔ 0xd9d4
+ÙÓ 0xd9d3
+ÙÒ 0xd9d2
+ÙÑ 0xd9d1
+ÙÐ 0xd9d0
+ÙÏ 0xd9cf
+ÙÎ 0xd9ce
+ÙÍ 0xd9cd
+ÙÌ 0xd9cc
+ÙË 0xd9cb
+ÙÊ 0xd9ca
+ÙÉ 0xd9c9
+ÙÈ 0xd9c8
+ÙÇ 0xd9c7
+ÙÆ 0xd9c6
+ÙÅ 0xd9c5
+ÙÄ 0xd9c4
+ÙÃ 0xd9c3
+ÙÂ 0xd9c2
+ÙÁ 0xd9c1
+ÙÀ 0xd9c0
+Ù¿ 0xd9bf
+Ù¾ 0xd9be
+Ù½ 0xd9bd
+Ù¼ 0xd9bc
+Ù» 0xd9bb
+Ùº 0xd9ba
+Ù¹ 0xd9b9
+Ù¸ 0xd9b8
+Ù· 0xd9b7
+Ù¶ 0xd9b6
+Ùµ 0xd9b5
+Ù´ 0xd9b4
+Ù³ 0xd9b3
+Ù² 0xd9b2
+Ù± 0xd9b1
+Ù° 0xd9b0
+Ù¯ 0xd9af
+Ù® 0xd9ae
+Ù­ 0xd9ad
+Ù¬ 0xd9ac
+Ù« 0xd9ab
+Ùª 0xd9aa
+Ù© 0xd9a9
+Ù¨ 0xd9a8
+Ù§ 0xd9a7
+Ù¦ 0xd9a6
+Ù¥ 0xd9a5
+Ù¤ 0xd9a4
+Ù£ 0xd9a3
+Ù¢ 0xd9a2
+Ù¡ 0xd9a1
+Úþ 0xdafe
+Úý 0xdafd
+Úü 0xdafc
+Úû 0xdafb
+Úú 0xdafa
+Úù 0xdaf9
+Úø 0xdaf8
+Ú÷ 0xdaf7
+Úö 0xdaf6
+Úõ 0xdaf5
+Úô 0xdaf4
+Úó 0xdaf3
+Úò 0xdaf2
+Úñ 0xdaf1
+Úð 0xdaf0
+Úï 0xdaef
+Úî 0xdaee
+Úí 0xdaed
+Úì 0xdaec
+Úë 0xdaeb
+Úê 0xdaea
+Úé 0xdae9
+Úè 0xdae8
+Úç 0xdae7
+Úæ 0xdae6
+Úå 0xdae5
+Úä 0xdae4
+Úã 0xdae3
+Úâ 0xdae2
+Úá 0xdae1
+Úà 0xdae0
+Úß 0xdadf
+ÚÞ 0xdade
+ÚÝ 0xdadd
+ÚÜ 0xdadc
+ÚÛ 0xdadb
+ÚÚ 0xdada
+ÚÙ 0xdad9
+ÚØ 0xdad8
+Ú× 0xdad7
+ÚÖ 0xdad6
+ÚÕ 0xdad5
+ÚÔ 0xdad4
+ÚÓ 0xdad3
+ÚÒ 0xdad2
+ÚÑ 0xdad1
+ÚÐ 0xdad0
+ÚÏ 0xdacf
+ÚÎ 0xdace
+ÚÍ 0xdacd
+ÚÌ 0xdacc
+ÚË 0xdacb
+ÚÊ 0xdaca
+ÚÉ 0xdac9
+ÚÈ 0xdac8
+ÚÇ 0xdac7
+ÚÆ 0xdac6
+ÚÅ 0xdac5
+ÚÄ 0xdac4
+ÚÃ 0xdac3
+ÚÂ 0xdac2
+ÚÁ 0xdac1
+ÚÀ 0xdac0
+Ú¿ 0xdabf
+Ú¾ 0xdabe
+Ú½ 0xdabd
+Ú¼ 0xdabc
+Ú» 0xdabb
+Úº 0xdaba
+Ú¹ 0xdab9
+Ú¸ 0xdab8
+Ú· 0xdab7
+Ú¶ 0xdab6
+Úµ 0xdab5
+Ú´ 0xdab4
+Ú³ 0xdab3
+Ú² 0xdab2
+Ú± 0xdab1
+Ú° 0xdab0
+Ú¯ 0xdaaf
+Ú® 0xdaae
+Ú­ 0xdaad
+Ú¬ 0xdaac
+Ú« 0xdaab
+Úª 0xdaaa
+Ú© 0xdaa9
+Ú¨ 0xdaa8
+Ú§ 0xdaa7
+Ú¦ 0xdaa6
+Ú¥ 0xdaa5
+Ú¤ 0xdaa4
+Ú£ 0xdaa3
+Ú¢ 0xdaa2
+Ú¡ 0xdaa1
+Ûþ 0xdbfe
+Ûý 0xdbfd
+Ûü 0xdbfc
+Ûû 0xdbfb
+Ûú 0xdbfa
+Ûù 0xdbf9
+Ûø 0xdbf8
+Û÷ 0xdbf7
+Ûö 0xdbf6
+Ûõ 0xdbf5
+Ûô 0xdbf4
+Ûó 0xdbf3
+Ûò 0xdbf2
+Ûñ 0xdbf1
+Ûð 0xdbf0
+Ûï 0xdbef
+Ûî 0xdbee
+Ûí 0xdbed
+Ûì 0xdbec
+Ûë 0xdbeb
+Ûê 0xdbea
+Ûé 0xdbe9
+Ûè 0xdbe8
+Ûç 0xdbe7
+Ûæ 0xdbe6
+Ûå 0xdbe5
+Ûä 0xdbe4
+Ûã 0xdbe3
+Ûâ 0xdbe2
+Ûá 0xdbe1
+Ûà 0xdbe0
+Ûß 0xdbdf
+ÛÞ 0xdbde
+ÛÝ 0xdbdd
+ÛÜ 0xdbdc
+ÛÛ 0xdbdb
+ÛÚ 0xdbda
+ÛÙ 0xdbd9
+ÛØ 0xdbd8
+Û× 0xdbd7
+ÛÖ 0xdbd6
+ÛÕ 0xdbd5
+ÛÔ 0xdbd4
+ÛÓ 0xdbd3
+ÛÒ 0xdbd2
+ÛÑ 0xdbd1
+ÛÐ 0xdbd0
+ÛÏ 0xdbcf
+ÛÎ 0xdbce
+ÛÍ 0xdbcd
+ÛÌ 0xdbcc
+ÛË 0xdbcb
+ÛÊ 0xdbca
+ÛÉ 0xdbc9
+ÛÈ 0xdbc8
+ÛÇ 0xdbc7
+ÛÆ 0xdbc6
+ÛÅ 0xdbc5
+ÛÄ 0xdbc4
+ÛÃ 0xdbc3
+ÛÂ 0xdbc2
+ÛÁ 0xdbc1
+ÛÀ 0xdbc0
+Û¿ 0xdbbf
+Û¾ 0xdbbe
+Û½ 0xdbbd
+Û¼ 0xdbbc
+Û» 0xdbbb
+Ûº 0xdbba
+Û¹ 0xdbb9
+Û¸ 0xdbb8
+Û· 0xdbb7
+Û¶ 0xdbb6
+Ûµ 0xdbb5
+Û´ 0xdbb4
+Û³ 0xdbb3
+Û² 0xdbb2
+Û± 0xdbb1
+Û° 0xdbb0
+Û¯ 0xdbaf
+Û® 0xdbae
+Û­ 0xdbad
+Û¬ 0xdbac
+Û« 0xdbab
+Ûª 0xdbaa
+Û© 0xdba9
+Û¨ 0xdba8
+Û§ 0xdba7
+Û¦ 0xdba6
+Û¥ 0xdba5
+Û¤ 0xdba4
+Û£ 0xdba3
+Û¢ 0xdba2
+Û¡ 0xdba1
+Üþ 0xdcfe
+Üý 0xdcfd
+Üü 0xdcfc
+Üû 0xdcfb
+Üú 0xdcfa
+Üù 0xdcf9
+Üø 0xdcf8
+Ü÷ 0xdcf7
+Üö 0xdcf6
+Üõ 0xdcf5
+Üô 0xdcf4
+Üó 0xdcf3
+Üò 0xdcf2
+Üñ 0xdcf1
+Üð 0xdcf0
+Üï 0xdcef
+Üî 0xdcee
+Üí 0xdced
+Üì 0xdcec
+Üë 0xdceb
+Üê 0xdcea
+Üé 0xdce9
+Üè 0xdce8
+Üç 0xdce7
+Üæ 0xdce6
+Üå 0xdce5
+Üä 0xdce4
+Üã 0xdce3
+Üâ 0xdce2
+Üá 0xdce1
+Üà 0xdce0
+Üß 0xdcdf
+ÜÞ 0xdcde
+ÜÝ 0xdcdd
+ÜÜ 0xdcdc
+ÜÛ 0xdcdb
+ÜÚ 0xdcda
+ÜÙ 0xdcd9
+ÜØ 0xdcd8
+Ü× 0xdcd7
+ÜÖ 0xdcd6
+ÜÕ 0xdcd5
+ÜÔ 0xdcd4
+ÜÓ 0xdcd3
+ÜÒ 0xdcd2
+ÜÑ 0xdcd1
+ÜÐ 0xdcd0
+ÜÏ 0xdccf
+ÜÎ 0xdcce
+ÜÍ 0xdccd
+ÜÌ 0xdccc
+ÜË 0xdccb
+ÜÊ 0xdcca
+ÜÉ 0xdcc9
+ÜÈ 0xdcc8
+ÜÇ 0xdcc7
+ÜÆ 0xdcc6
+ÜÅ 0xdcc5
+ÜÄ 0xdcc4
+ÜÃ 0xdcc3
+ÜÂ 0xdcc2
+ÜÁ 0xdcc1
+ÜÀ 0xdcc0
+Ü¿ 0xdcbf
+ܾ 0xdcbe
+ܽ 0xdcbd
+ܼ 0xdcbc
+Ü» 0xdcbb
+ܺ 0xdcba
+ܹ 0xdcb9
+ܸ 0xdcb8
+Ü· 0xdcb7
+ܶ 0xdcb6
+ܵ 0xdcb5
+Ü´ 0xdcb4
+ܳ 0xdcb3
+ܲ 0xdcb2
+ܱ 0xdcb1
+Ü° 0xdcb0
+ܯ 0xdcaf
+Ü® 0xdcae
+Ü­ 0xdcad
+ܬ 0xdcac
+Ü« 0xdcab
+ܪ 0xdcaa
+Ü© 0xdca9
+ܨ 0xdca8
+ܧ 0xdca7
+ܦ 0xdca6
+Ü¥ 0xdca5
+ܤ 0xdca4
+Ü£ 0xdca3
+Ü¢ 0xdca2
+Ü¡ 0xdca1
+Ýþ 0xddfe
+Ýý 0xddfd
+Ýü 0xddfc
+Ýû 0xddfb
+Ýú 0xddfa
+Ýù 0xddf9
+Ýø 0xddf8
+Ý÷ 0xddf7
+Ýö 0xddf6
+Ýõ 0xddf5
+Ýô 0xddf4
+Ýó 0xddf3
+Ýò 0xddf2
+Ýñ 0xddf1
+Ýð 0xddf0
+Ýï 0xddef
+Ýî 0xddee
+Ýí 0xdded
+Ýì 0xddec
+Ýë 0xddeb
+Ýê 0xddea
+Ýé 0xdde9
+Ýè 0xdde8
+Ýç 0xdde7
+Ýæ 0xdde6
+Ýå 0xdde5
+Ýä 0xdde4
+Ýã 0xdde3
+Ýâ 0xdde2
+Ýá 0xdde1
+Ýà 0xdde0
+Ýß 0xdddf
+ÝÞ 0xddde
+ÝÝ 0xdddd
+ÝÜ 0xdddc
+ÝÛ 0xdddb
+ÝÚ 0xddda
+ÝÙ 0xddd9
+ÝØ 0xddd8
+Ý× 0xddd7
+ÝÖ 0xddd6
+ÝÕ 0xddd5
+ÝÔ 0xddd4
+ÝÓ 0xddd3
+ÝÒ 0xddd2
+ÝÑ 0xddd1
+ÝÐ 0xddd0
+ÝÏ 0xddcf
+ÝÎ 0xddce
+ÝÍ 0xddcd
+ÝÌ 0xddcc
+ÝË 0xddcb
+ÝÊ 0xddca
+ÝÉ 0xddc9
+ÝÈ 0xddc8
+ÝÇ 0xddc7
+ÝÆ 0xddc6
+ÝÅ 0xddc5
+ÝÄ 0xddc4
+ÝÃ 0xddc3
+ÝÂ 0xddc2
+ÝÁ 0xddc1
+ÝÀ 0xddc0
+Ý¿ 0xddbf
+ݾ 0xddbe
+ݽ 0xddbd
+ݼ 0xddbc
+Ý» 0xddbb
+ݺ 0xddba
+ݹ 0xddb9
+ݸ 0xddb8
+Ý· 0xddb7
+ݶ 0xddb6
+ݵ 0xddb5
+Ý´ 0xddb4
+ݳ 0xddb3
+ݲ 0xddb2
+ݱ 0xddb1
+Ý° 0xddb0
+ݯ 0xddaf
+Ý® 0xddae
+Ý­ 0xddad
+ݬ 0xddac
+Ý« 0xddab
+ݪ 0xddaa
+Ý© 0xdda9
+ݨ 0xdda8
+ݧ 0xdda7
+ݦ 0xdda6
+Ý¥ 0xdda5
+ݤ 0xdda4
+Ý£ 0xdda3
+Ý¢ 0xdda2
+Ý¡ 0xdda1
+Þþ 0xdefe
+Þý 0xdefd
+Þü 0xdefc
+Þû 0xdefb
+Þú 0xdefa
+Þù 0xdef9
+Þø 0xdef8
+Þ÷ 0xdef7
+Þö 0xdef6
+Þõ 0xdef5
+Þô 0xdef4
+Þó 0xdef3
+Þò 0xdef2
+Þñ 0xdef1
+Þð 0xdef0
+Þï 0xdeef
+Þî 0xdeee
+Þí 0xdeed
+Þì 0xdeec
+Þë 0xdeeb
+Þê 0xdeea
+Þé 0xdee9
+Þè 0xdee8
+Þç 0xdee7
+Þæ 0xdee6
+Þå 0xdee5
+Þä 0xdee4
+Þã 0xdee3
+Þâ 0xdee2
+Þá 0xdee1
+Þà 0xdee0
+Þß 0xdedf
+ÞÞ 0xdede
+ÞÝ 0xdedd
+ÞÜ 0xdedc
+ÞÛ 0xdedb
+ÞÚ 0xdeda
+ÞÙ 0xded9
+ÞØ 0xded8
+Þ× 0xded7
+ÞÖ 0xded6
+ÞÕ 0xded5
+ÞÔ 0xded4
+ÞÓ 0xded3
+ÞÒ 0xded2
+ÞÑ 0xded1
+ÞÐ 0xded0
+ÞÏ 0xdecf
+ÞÎ 0xdece
+ÞÍ 0xdecd
+ÞÌ 0xdecc
+ÞË 0xdecb
+ÞÊ 0xdeca
+ÞÉ 0xdec9
+ÞÈ 0xdec8
+ÞÇ 0xdec7
+ÞÆ 0xdec6
+ÞÅ 0xdec5
+ÞÄ 0xdec4
+ÞÃ 0xdec3
+ÞÂ 0xdec2
+ÞÁ 0xdec1
+ÞÀ 0xdec0
+Þ¿ 0xdebf
+Þ¾ 0xdebe
+Þ½ 0xdebd
+Þ¼ 0xdebc
+Þ» 0xdebb
+Þº 0xdeba
+Þ¹ 0xdeb9
+Þ¸ 0xdeb8
+Þ· 0xdeb7
+Þ¶ 0xdeb6
+Þµ 0xdeb5
+Þ´ 0xdeb4
+Þ³ 0xdeb3
+Þ² 0xdeb2
+Þ± 0xdeb1
+Þ° 0xdeb0
+Þ¯ 0xdeaf
+Þ® 0xdeae
+Þ­ 0xdead
+Þ¬ 0xdeac
+Þ« 0xdeab
+Þª 0xdeaa
+Þ© 0xdea9
+Þ¨ 0xdea8
+Þ§ 0xdea7
+Þ¦ 0xdea6
+Þ¥ 0xdea5
+Þ¤ 0xdea4
+Þ£ 0xdea3
+Þ¢ 0xdea2
+Þ¡ 0xdea1
+ßþ 0xdffe
+ßý 0xdffd
+ßü 0xdffc
+ßû 0xdffb
+ßú 0xdffa
+ßù 0xdff9
+ßø 0xdff8
+ß÷ 0xdff7
+ßö 0xdff6
+ßõ 0xdff5
+ßô 0xdff4
+ßó 0xdff3
+ßò 0xdff2
+ßñ 0xdff1
+ßð 0xdff0
+ßï 0xdfef
+ßî 0xdfee
+ßí 0xdfed
+ßì 0xdfec
+ßë 0xdfeb
+ßê 0xdfea
+ßé 0xdfe9
+ßè 0xdfe8
+ßç 0xdfe7
+ßæ 0xdfe6
+ßå 0xdfe5
+ßä 0xdfe4
+ßã 0xdfe3
+ßâ 0xdfe2
+ßá 0xdfe1
+ßà 0xdfe0
+ßß 0xdfdf
+ßÞ 0xdfde
+ßÝ 0xdfdd
+ᚠ0xdfdc
+ßÛ 0xdfdb
+ßÚ 0xdfda
+ßÙ 0xdfd9
+ßØ 0xdfd8
+ß× 0xdfd7
+ßÖ 0xdfd6
+ßÕ 0xdfd5
+ßÔ 0xdfd4
+ßÓ 0xdfd3
+ßÒ 0xdfd2
+ᥠ0xdfd1
+ßÐ 0xdfd0
+ßÏ 0xdfcf
+ßÎ 0xdfce
+ßÍ 0xdfcd
+ßÌ 0xdfcc
+ßË 0xdfcb
+ßÊ 0xdfca
+ᐠ0xdfc9
+ßÈ 0xdfc8
+ဠ0xdfc7
+ᒠ0xdfc6
+Ꮰ0xdfc5
+Ꭰ0xdfc4
+ßà 0xdfc3
+ß 0xdfc2
+ßÁ 0xdfc1
+ßÀ 0xdfc0
+ß¿ 0xdfbf
+ß¾ 0xdfbe
+ß½ 0xdfbd
+ß¼ 0xdfbc
+ß» 0xdfbb
+ߺ 0xdfba
+ß¹ 0xdfb9
+߸ 0xdfb8
+ß· 0xdfb7
+߶ 0xdfb6
+ßµ 0xdfb5
+ß´ 0xdfb4
+ß³ 0xdfb3
+ß² 0xdfb2
+ß± 0xdfb1
+ß° 0xdfb0
+߯ 0xdfaf
+ß® 0xdfae
+ß­ 0xdfad
+߬ 0xdfac
+ß« 0xdfab
+ߪ 0xdfaa
+ß© 0xdfa9
+ߨ 0xdfa8
+ߧ 0xdfa7
+ߦ 0xdfa6
+ߥ 0xdfa5
+ߤ 0xdfa4
+ߣ 0xdfa3
+ߢ 0xdfa2
+ß¡ 0xdfa1
+àþ 0xe0fe
+àý 0xe0fd
+àü 0xe0fc
+àû 0xe0fb
+àú 0xe0fa
+àù 0xe0f9
+àø 0xe0f8
+à÷ 0xe0f7
+àö 0xe0f6
+àõ 0xe0f5
+àô 0xe0f4
+àó 0xe0f3
+àò 0xe0f2
+àñ 0xe0f1
+àð 0xe0f0
+àï 0xe0ef
+àî 0xe0ee
+àí 0xe0ed
+àì 0xe0ec
+àë 0xe0eb
+àê 0xe0ea
+àé 0xe0e9
+àè 0xe0e8
+àç 0xe0e7
+àæ 0xe0e6
+àå 0xe0e5
+àä 0xe0e4
+àã 0xe0e3
+àâ 0xe0e2
+àá 0xe0e1
+àà 0xe0e0
+àß 0xe0df
+àÞ 0xe0de
+àÝ 0xe0dd
+àÜ 0xe0dc
+àÛ 0xe0db
+àÚ 0xe0da
+àÙ 0xe0d9
+àØ 0xe0d8
+à× 0xe0d7
+àÖ 0xe0d6
+àÕ 0xe0d5
+àÔ 0xe0d4
+àÓ 0xe0d3
+àÒ 0xe0d2
+àÑ 0xe0d1
+àÐ 0xe0d0
+àÏ 0xe0cf
+àÎ 0xe0ce
+àÍ 0xe0cd
+àÌ 0xe0cc
+àË 0xe0cb
+àÊ 0xe0ca
+àÉ 0xe0c9
+àÈ 0xe0c8
+àÇ 0xe0c7
+àÆ 0xe0c6
+àÅ 0xe0c5
+àÄ 0xe0c4
+àà 0xe0c3
+à 0xe0c2
+àÁ 0xe0c1
+àÀ 0xe0c0
+à¿ 0xe0bf
+ྠ0xe0be
+འ0xe0bd
+༠0xe0bc
+à» 0xe0bb
+ຠ0xe0ba
+๠0xe0b9
+ภ0xe0b8
+à· 0xe0b7
+ච0xe0b6
+ൠ0xe0b5
+à´ 0xe0b4
+à³ 0xe0b3
+ಠ0xe0b2
+à± 0xe0b1
+à° 0xe0b0
+௠0xe0af
+à® 0xe0ae
+à­ 0xe0ad
+ଠ0xe0ac
+à« 0xe0ab
+ઠ0xe0aa
+à© 0xe0a9
+ਠ0xe0a8
+ৠ0xe0a7
+ঠ0xe0a6
+ॠ0xe0a5
+ठ0xe0a4
+࣠0xe0a3
+ࢠ0xe0a2
+à¡ 0xe0a1
+áþ 0xe1fe
+áý 0xe1fd
+áü 0xe1fc
+áû 0xe1fb
+áú 0xe1fa
+áù 0xe1f9
+áø 0xe1f8
+á÷ 0xe1f7
+áö 0xe1f6
+áõ 0xe1f5
+áô 0xe1f4
+áó 0xe1f3
+áò 0xe1f2
+áñ 0xe1f1
+áð 0xe1f0
+áï 0xe1ef
+áî 0xe1ee
+áí 0xe1ed
+áì 0xe1ec
+áë 0xe1eb
+áê 0xe1ea
+áé 0xe1e9
+áè 0xe1e8
+áç 0xe1e7
+áæ 0xe1e6
+áå 0xe1e5
+áä 0xe1e4
+áã 0xe1e3
+áâ 0xe1e2
+áá 0xe1e1
+áà 0xe1e0
+áß 0xe1df
+áÞ 0xe1de
+áÝ 0xe1dd
+áÜ 0xe1dc
+áÛ 0xe1db
+áÚ 0xe1da
+áÙ 0xe1d9
+áØ 0xe1d8
+á× 0xe1d7
+áÖ 0xe1d6
+áÕ 0xe1d5
+áÔ 0xe1d4
+áÓ 0xe1d3
+áÒ 0xe1d2
+áÑ 0xe1d1
+áÐ 0xe1d0
+áÏ 0xe1cf
+áÎ 0xe1ce
+áÍ 0xe1cd
+áÌ 0xe1cc
+áË 0xe1cb
+áÊ 0xe1ca
+áÉ 0xe1c9
+áÈ 0xe1c8
+áÇ 0xe1c7
+áÆ 0xe1c6
+áÅ 0xe1c5
+áÄ 0xe1c4
+áà 0xe1c3
+á 0xe1c2
+áÁ 0xe1c1
+áÀ 0xe1c0
+á¿ 0xe1bf
+á¾ 0xe1be
+á½ 0xe1bd
+á¼ 0xe1bc
+á» 0xe1bb
+Ạ0xe1ba
+á¹ 0xe1b9
+Ḡ0xe1b8
+á· 0xe1b7
+ᶠ0xe1b6
+áµ 0xe1b5
+á´ 0xe1b4
+á³ 0xe1b3
+á² 0xe1b2
+á± 0xe1b1
+á° 0xe1b0
+ᯠ0xe1af
+á® 0xe1ae
+á­ 0xe1ad
+ᬠ0xe1ac
+á« 0xe1ab
+᪠0xe1aa
+á© 0xe1a9
+ᨠ0xe1a8
+᧠0xe1a7
+ᦠ0xe1a6
+ᥠ0xe1a5
+ᤠ0xe1a4
+ᣠ0xe1a3
+ᢠ0xe1a2
+á¡ 0xe1a1
+âþ 0xe2fe
+âý 0xe2fd
+âü 0xe2fc
+âû 0xe2fb
+âú 0xe2fa
+âù 0xe2f9
+âø 0xe2f8
+â÷ 0xe2f7
+âö 0xe2f6
+âõ 0xe2f5
+âô 0xe2f4
+âó 0xe2f3
+âò 0xe2f2
+âñ 0xe2f1
+âð 0xe2f0
+âï 0xe2ef
+âî 0xe2ee
+âí 0xe2ed
+âì 0xe2ec
+âë 0xe2eb
+âê 0xe2ea
+âé 0xe2e9
+âè 0xe2e8
+âç 0xe2e7
+âæ 0xe2e6
+âå 0xe2e5
+âä 0xe2e4
+âã 0xe2e3
+ââ 0xe2e2
+âá 0xe2e1
+âà 0xe2e0
+âß 0xe2df
+âÞ 0xe2de
+âÝ 0xe2dd
+âÜ 0xe2dc
+âÛ 0xe2db
+âÚ 0xe2da
+âÙ 0xe2d9
+âØ 0xe2d8
+â× 0xe2d7
+âÖ 0xe2d6
+âÕ 0xe2d5
+âÔ 0xe2d4
+âÓ 0xe2d3
+âÒ 0xe2d2
+âÑ 0xe2d1
+âÐ 0xe2d0
+âÏ 0xe2cf
+âÎ 0xe2ce
+âÍ 0xe2cd
+âÌ 0xe2cc
+âË 0xe2cb
+âÊ 0xe2ca
+âÉ 0xe2c9
+âÈ 0xe2c8
+âÇ 0xe2c7
+âÆ 0xe2c6
+âÅ 0xe2c5
+âÄ 0xe2c4
+âà 0xe2c3
+â 0xe2c2
+âÁ 0xe2c1
+âÀ 0xe2c0
+â¿ 0xe2bf
+â¾ 0xe2be
+â½ 0xe2bd
+â¼ 0xe2bc
+â» 0xe2bb
+⺠0xe2ba
+â¹ 0xe2b9
+⸠0xe2b8
+â· 0xe2b7
+ⶠ0xe2b6
+âµ 0xe2b5
+â´ 0xe2b4
+â³ 0xe2b3
+â² 0xe2b2
+â± 0xe2b1
+â° 0xe2b0
+⯠0xe2af
+â® 0xe2ae
+â­ 0xe2ad
+⬠0xe2ac
+â« 0xe2ab
+⪠0xe2aa
+â© 0xe2a9
+⨠0xe2a8
+⧠0xe2a7
+⦠0xe2a6
+⥠0xe2a5
+⤠0xe2a4
+⣠0xe2a3
+⢠0xe2a2
+â¡ 0xe2a1
+ãþ 0xe3fe
+ãý 0xe3fd
+ãü 0xe3fc
+ãû 0xe3fb
+ãú 0xe3fa
+ãù 0xe3f9
+ãø 0xe3f8
+ã÷ 0xe3f7
+ãö 0xe3f6
+ãõ 0xe3f5
+ãô 0xe3f4
+ãó 0xe3f3
+ãò 0xe3f2
+ãñ 0xe3f1
+ãð 0xe3f0
+ãï 0xe3ef
+ãî 0xe3ee
+ãí 0xe3ed
+ãì 0xe3ec
+ãë 0xe3eb
+ãê 0xe3ea
+ãé 0xe3e9
+ãè 0xe3e8
+ãç 0xe3e7
+ãæ 0xe3e6
+ãå 0xe3e5
+ãä 0xe3e4
+ãã 0xe3e3
+ãâ 0xe3e2
+ãá 0xe3e1
+ãà 0xe3e0
+ãß 0xe3df
+ãÞ 0xe3de
+ãÝ 0xe3dd
+ãÜ 0xe3dc
+ãÛ 0xe3db
+ãÚ 0xe3da
+ãÙ 0xe3d9
+ãØ 0xe3d8
+ã× 0xe3d7
+ãÖ 0xe3d6
+ãÕ 0xe3d5
+ãÔ 0xe3d4
+ãÓ 0xe3d3
+ãÒ 0xe3d2
+ãÑ 0xe3d1
+ãÐ 0xe3d0
+ãÏ 0xe3cf
+ãÎ 0xe3ce
+ãÍ 0xe3cd
+ãÌ 0xe3cc
+ãË 0xe3cb
+ãÊ 0xe3ca
+ãÉ 0xe3c9
+ãÈ 0xe3c8
+ãÇ 0xe3c7
+ãÆ 0xe3c6
+ãÅ 0xe3c5
+ãÄ 0xe3c4
+ãà 0xe3c3
+ã 0xe3c2
+ãÁ 0xe3c1
+ãÀ 0xe3c0
+ã¿ 0xe3bf
+ã¾ 0xe3be
+ã½ 0xe3bd
+ã¼ 0xe3bc
+ã» 0xe3bb
+㺠0xe3ba
+ã¹ 0xe3b9
+㸠0xe3b8
+ã· 0xe3b7
+㶠0xe3b6
+ãµ 0xe3b5
+ã´ 0xe3b4
+ã³ 0xe3b3
+ã² 0xe3b2
+ã± 0xe3b1
+ã° 0xe3b0
+㯠0xe3af
+ã® 0xe3ae
+ã­ 0xe3ad
+㬠0xe3ac
+ã« 0xe3ab
+㪠0xe3aa
+ã© 0xe3a9
+㨠0xe3a8
+㧠0xe3a7
+㦠0xe3a6
+㥠0xe3a5
+㤠0xe3a4
+㣠0xe3a3
+㢠0xe3a2
+ã¡ 0xe3a1
+äþ 0xe4fe
+äý 0xe4fd
+äü 0xe4fc
+äû 0xe4fb
+äú 0xe4fa
+äù 0xe4f9
+äø 0xe4f8
+ä÷ 0xe4f7
+äö 0xe4f6
+äõ 0xe4f5
+äô 0xe4f4
+äó 0xe4f3
+äò 0xe4f2
+äñ 0xe4f1
+äð 0xe4f0
+äï 0xe4ef
+äî 0xe4ee
+äí 0xe4ed
+äì 0xe4ec
+äë 0xe4eb
+äê 0xe4ea
+äé 0xe4e9
+äè 0xe4e8
+äç 0xe4e7
+äæ 0xe4e6
+äå 0xe4e5
+ää 0xe4e4
+äã 0xe4e3
+äâ 0xe4e2
+äá 0xe4e1
+äà 0xe4e0
+äß 0xe4df
+äÞ 0xe4de
+äÝ 0xe4dd
+äÜ 0xe4dc
+äÛ 0xe4db
+äÚ 0xe4da
+äÙ 0xe4d9
+äØ 0xe4d8
+ä× 0xe4d7
+äÖ 0xe4d6
+äÕ 0xe4d5
+äÔ 0xe4d4
+äÓ 0xe4d3
+äÒ 0xe4d2
+äÑ 0xe4d1
+äÐ 0xe4d0
+äÏ 0xe4cf
+äÎ 0xe4ce
+äÍ 0xe4cd
+äÌ 0xe4cc
+äË 0xe4cb
+äÊ 0xe4ca
+äÉ 0xe4c9
+äÈ 0xe4c8
+äÇ 0xe4c7
+äÆ 0xe4c6
+äÅ 0xe4c5
+äÄ 0xe4c4
+äà 0xe4c3
+ä 0xe4c2
+äÁ 0xe4c1
+äÀ 0xe4c0
+ä¿ 0xe4bf
+ä¾ 0xe4be
+ä½ 0xe4bd
+ä¼ 0xe4bc
+ä» 0xe4bb
+äº 0xe4ba
+ä¹ 0xe4b9
+ä¸ 0xe4b8
+ä· 0xe4b7
+ä¶ 0xe4b6
+äµ 0xe4b5
+ä´ 0xe4b4
+ä³ 0xe4b3
+ä² 0xe4b2
+ä± 0xe4b1
+ä° 0xe4b0
+ä¯ 0xe4af
+ä® 0xe4ae
+ä­ 0xe4ad
+ä¬ 0xe4ac
+ä« 0xe4ab
+äª 0xe4aa
+ä© 0xe4a9
+ä¨ 0xe4a8
+ä§ 0xe4a7
+ä¦ 0xe4a6
+ä¥ 0xe4a5
+ä¤ 0xe4a4
+ä£ 0xe4a3
+ä¢ 0xe4a2
+ä¡ 0xe4a1
+åþ 0xe5fe
+åý 0xe5fd
+åü 0xe5fc
+åû 0xe5fb
+åú 0xe5fa
+åù 0xe5f9
+åø 0xe5f8
+å÷ 0xe5f7
+åö 0xe5f6
+åõ 0xe5f5
+åô 0xe5f4
+åó 0xe5f3
+åò 0xe5f2
+åñ 0xe5f1
+åð 0xe5f0
+åï 0xe5ef
+åî 0xe5ee
+åí 0xe5ed
+åì 0xe5ec
+åë 0xe5eb
+åê 0xe5ea
+åé 0xe5e9
+åè 0xe5e8
+åç 0xe5e7
+åæ 0xe5e6
+åå 0xe5e5
+åä 0xe5e4
+åã 0xe5e3
+åâ 0xe5e2
+åá 0xe5e1
+åà 0xe5e0
+åß 0xe5df
+åÞ 0xe5de
+åÝ 0xe5dd
+åÜ 0xe5dc
+åÛ 0xe5db
+åÚ 0xe5da
+åÙ 0xe5d9
+åØ 0xe5d8
+å× 0xe5d7
+åÖ 0xe5d6
+åÕ 0xe5d5
+åÔ 0xe5d4
+åÓ 0xe5d3
+åÒ 0xe5d2
+åÑ 0xe5d1
+åÐ 0xe5d0
+åÏ 0xe5cf
+åÎ 0xe5ce
+åÍ 0xe5cd
+åÌ 0xe5cc
+åË 0xe5cb
+åÊ 0xe5ca
+åÉ 0xe5c9
+åÈ 0xe5c8
+åÇ 0xe5c7
+åÆ 0xe5c6
+åÅ 0xe5c5
+åÄ 0xe5c4
+åà 0xe5c3
+å 0xe5c2
+åÁ 0xe5c1
+åÀ 0xe5c0
+å¿ 0xe5bf
+å¾ 0xe5be
+å½ 0xe5bd
+å¼ 0xe5bc
+å» 0xe5bb
+åº 0xe5ba
+å¹ 0xe5b9
+å¸ 0xe5b8
+å· 0xe5b7
+å¶ 0xe5b6
+åµ 0xe5b5
+å´ 0xe5b4
+å³ 0xe5b3
+å² 0xe5b2
+å± 0xe5b1
+å° 0xe5b0
+å¯ 0xe5af
+å® 0xe5ae
+å­ 0xe5ad
+å¬ 0xe5ac
+å« 0xe5ab
+åª 0xe5aa
+å© 0xe5a9
+å¨ 0xe5a8
+å§ 0xe5a7
+å¦ 0xe5a6
+å¥ 0xe5a5
+å¤ 0xe5a4
+å£ 0xe5a3
+å¢ 0xe5a2
+å¡ 0xe5a1
+æþ 0xe6fe
+æý 0xe6fd
+æü 0xe6fc
+æû 0xe6fb
+æú 0xe6fa
+æù 0xe6f9
+æø 0xe6f8
+æ÷ 0xe6f7
+æö 0xe6f6
+æõ 0xe6f5
+æô 0xe6f4
+æó 0xe6f3
+æò 0xe6f2
+æñ 0xe6f1
+æð 0xe6f0
+æï 0xe6ef
+æî 0xe6ee
+æí 0xe6ed
+æì 0xe6ec
+æë 0xe6eb
+æê 0xe6ea
+æé 0xe6e9
+æè 0xe6e8
+æç 0xe6e7
+ææ 0xe6e6
+æå 0xe6e5
+æä 0xe6e4
+æã 0xe6e3
+æâ 0xe6e2
+æá 0xe6e1
+æà 0xe6e0
+æß 0xe6df
+æÞ 0xe6de
+æÝ 0xe6dd
+æÜ 0xe6dc
+æÛ 0xe6db
+æÚ 0xe6da
+æÙ 0xe6d9
+æØ 0xe6d8
+æ× 0xe6d7
+æÖ 0xe6d6
+æÕ 0xe6d5
+æÔ 0xe6d4
+æÓ 0xe6d3
+æÒ 0xe6d2
+æÑ 0xe6d1
+æÐ 0xe6d0
+æÏ 0xe6cf
+æÎ 0xe6ce
+æÍ 0xe6cd
+æÌ 0xe6cc
+æË 0xe6cb
+æÊ 0xe6ca
+æÉ 0xe6c9
+æÈ 0xe6c8
+æÇ 0xe6c7
+æÆ 0xe6c6
+æÅ 0xe6c5
+æÄ 0xe6c4
+æà 0xe6c3
+æ 0xe6c2
+æÁ 0xe6c1
+æÀ 0xe6c0
+æ¿ 0xe6bf
+æ¾ 0xe6be
+æ½ 0xe6bd
+æ¼ 0xe6bc
+æ» 0xe6bb
+æº 0xe6ba
+æ¹ 0xe6b9
+æ¸ 0xe6b8
+æ· 0xe6b7
+æ¶ 0xe6b6
+æµ 0xe6b5
+æ´ 0xe6b4
+æ³ 0xe6b3
+æ² 0xe6b2
+æ± 0xe6b1
+æ° 0xe6b0
+æ¯ 0xe6af
+æ® 0xe6ae
+æ­ 0xe6ad
+æ¬ 0xe6ac
+æ« 0xe6ab
+æª 0xe6aa
+æ© 0xe6a9
+æ¨ 0xe6a8
+æ§ 0xe6a7
+æ¦ 0xe6a6
+æ¥ 0xe6a5
+æ¤ 0xe6a4
+æ£ 0xe6a3
+æ¢ 0xe6a2
+æ¡ 0xe6a1
+çþ 0xe7fe
+çý 0xe7fd
+çü 0xe7fc
+çû 0xe7fb
+çú 0xe7fa
+çù 0xe7f9
+çø 0xe7f8
+ç÷ 0xe7f7
+çö 0xe7f6
+çõ 0xe7f5
+çô 0xe7f4
+çó 0xe7f3
+çò 0xe7f2
+çñ 0xe7f1
+çð 0xe7f0
+çï 0xe7ef
+çî 0xe7ee
+çí 0xe7ed
+çì 0xe7ec
+çë 0xe7eb
+çê 0xe7ea
+çé 0xe7e9
+çè 0xe7e8
+çç 0xe7e7
+çæ 0xe7e6
+çå 0xe7e5
+çä 0xe7e4
+çã 0xe7e3
+çâ 0xe7e2
+çá 0xe7e1
+çà 0xe7e0
+çß 0xe7df
+çÞ 0xe7de
+çÝ 0xe7dd
+çÜ 0xe7dc
+çÛ 0xe7db
+çÚ 0xe7da
+çÙ 0xe7d9
+çØ 0xe7d8
+ç× 0xe7d7
+çÖ 0xe7d6
+çÕ 0xe7d5
+çÔ 0xe7d4
+çÓ 0xe7d3
+çÒ 0xe7d2
+çÑ 0xe7d1
+çÐ 0xe7d0
+çÏ 0xe7cf
+çÎ 0xe7ce
+çÍ 0xe7cd
+çÌ 0xe7cc
+çË 0xe7cb
+çÊ 0xe7ca
+çÉ 0xe7c9
+çÈ 0xe7c8
+çÇ 0xe7c7
+çÆ 0xe7c6
+çÅ 0xe7c5
+çÄ 0xe7c4
+çà 0xe7c3
+ç 0xe7c2
+çÁ 0xe7c1
+çÀ 0xe7c0
+ç¿ 0xe7bf
+ç¾ 0xe7be
+ç½ 0xe7bd
+ç¼ 0xe7bc
+ç» 0xe7bb
+çº 0xe7ba
+ç¹ 0xe7b9
+ç¸ 0xe7b8
+ç· 0xe7b7
+ç¶ 0xe7b6
+çµ 0xe7b5
+ç´ 0xe7b4
+ç³ 0xe7b3
+ç² 0xe7b2
+ç± 0xe7b1
+ç° 0xe7b0
+ç¯ 0xe7af
+ç® 0xe7ae
+ç­ 0xe7ad
+ç¬ 0xe7ac
+ç« 0xe7ab
+çª 0xe7aa
+ç© 0xe7a9
+ç¨ 0xe7a8
+ç§ 0xe7a7
+ç¦ 0xe7a6
+ç¥ 0xe7a5
+ç¤ 0xe7a4
+ç£ 0xe7a3
+ç¢ 0xe7a2
+ç¡ 0xe7a1
+èþ 0xe8fe
+èý 0xe8fd
+èü 0xe8fc
+èû 0xe8fb
+èú 0xe8fa
+èù 0xe8f9
+èø 0xe8f8
+è÷ 0xe8f7
+èö 0xe8f6
+èõ 0xe8f5
+èô 0xe8f4
+èó 0xe8f3
+èò 0xe8f2
+èñ 0xe8f1
+èð 0xe8f0
+èï 0xe8ef
+èî 0xe8ee
+èí 0xe8ed
+èì 0xe8ec
+èë 0xe8eb
+èê 0xe8ea
+èé 0xe8e9
+èè 0xe8e8
+èç 0xe8e7
+èæ 0xe8e6
+èå 0xe8e5
+èä 0xe8e4
+èã 0xe8e3
+èâ 0xe8e2
+èá 0xe8e1
+èà 0xe8e0
+èß 0xe8df
+èÞ 0xe8de
+èÝ 0xe8dd
+èÜ 0xe8dc
+èÛ 0xe8db
+èÚ 0xe8da
+èÙ 0xe8d9
+èØ 0xe8d8
+è× 0xe8d7
+èÖ 0xe8d6
+èÕ 0xe8d5
+èÔ 0xe8d4
+èÓ 0xe8d3
+èÒ 0xe8d2
+èÑ 0xe8d1
+èÐ 0xe8d0
+èÏ 0xe8cf
+èÎ 0xe8ce
+èÍ 0xe8cd
+èÌ 0xe8cc
+èË 0xe8cb
+èÊ 0xe8ca
+èÉ 0xe8c9
+èÈ 0xe8c8
+èÇ 0xe8c7
+èÆ 0xe8c6
+èÅ 0xe8c5
+èÄ 0xe8c4
+èà 0xe8c3
+è 0xe8c2
+èÁ 0xe8c1
+èÀ 0xe8c0
+è¿ 0xe8bf
+è¾ 0xe8be
+è½ 0xe8bd
+è¼ 0xe8bc
+è» 0xe8bb
+èº 0xe8ba
+è¹ 0xe8b9
+è¸ 0xe8b8
+è· 0xe8b7
+è¶ 0xe8b6
+èµ 0xe8b5
+è´ 0xe8b4
+è³ 0xe8b3
+è² 0xe8b2
+è± 0xe8b1
+è° 0xe8b0
+è¯ 0xe8af
+è® 0xe8ae
+è­ 0xe8ad
+è¬ 0xe8ac
+è« 0xe8ab
+èª 0xe8aa
+è© 0xe8a9
+è¨ 0xe8a8
+è§ 0xe8a7
+è¦ 0xe8a6
+è¥ 0xe8a5
+è¤ 0xe8a4
+è£ 0xe8a3
+è¢ 0xe8a2
+è¡ 0xe8a1
+éþ 0xe9fe
+éý 0xe9fd
+éü 0xe9fc
+éû 0xe9fb
+éú 0xe9fa
+éù 0xe9f9
+éø 0xe9f8
+é÷ 0xe9f7
+éö 0xe9f6
+éõ 0xe9f5
+éô 0xe9f4
+éó 0xe9f3
+éò 0xe9f2
+éñ 0xe9f1
+éð 0xe9f0
+éï 0xe9ef
+éî 0xe9ee
+éí 0xe9ed
+éì 0xe9ec
+éë 0xe9eb
+éê 0xe9ea
+éé 0xe9e9
+éè 0xe9e8
+éç 0xe9e7
+éæ 0xe9e6
+éå 0xe9e5
+éä 0xe9e4
+éã 0xe9e3
+éâ 0xe9e2
+éá 0xe9e1
+éà 0xe9e0
+éß 0xe9df
+éÞ 0xe9de
+éÝ 0xe9dd
+éÜ 0xe9dc
+éÛ 0xe9db
+éÚ 0xe9da
+éÙ 0xe9d9
+éØ 0xe9d8
+é× 0xe9d7
+éÖ 0xe9d6
+éÕ 0xe9d5
+éÔ 0xe9d4
+éÓ 0xe9d3
+éÒ 0xe9d2
+éÑ 0xe9d1
+éÐ 0xe9d0
+éÏ 0xe9cf
+éÎ 0xe9ce
+éÍ 0xe9cd
+éÌ 0xe9cc
+éË 0xe9cb
+éÊ 0xe9ca
+éÉ 0xe9c9
+éÈ 0xe9c8
+éÇ 0xe9c7
+éÆ 0xe9c6
+éÅ 0xe9c5
+éÄ 0xe9c4
+éà 0xe9c3
+é 0xe9c2
+éÁ 0xe9c1
+éÀ 0xe9c0
+é¿ 0xe9bf
+é¾ 0xe9be
+é½ 0xe9bd
+é¼ 0xe9bc
+é» 0xe9bb
+éº 0xe9ba
+é¹ 0xe9b9
+é¸ 0xe9b8
+é· 0xe9b7
+é¶ 0xe9b6
+éµ 0xe9b5
+é´ 0xe9b4
+é³ 0xe9b3
+é² 0xe9b2
+é± 0xe9b1
+é° 0xe9b0
+é¯ 0xe9af
+é® 0xe9ae
+é­ 0xe9ad
+é¬ 0xe9ac
+é« 0xe9ab
+éª 0xe9aa
+é© 0xe9a9
+é¨ 0xe9a8
+é§ 0xe9a7
+é¦ 0xe9a6
+é¥ 0xe9a5
+é¤ 0xe9a4
+é£ 0xe9a3
+é¢ 0xe9a2
+é¡ 0xe9a1
+êþ 0xeafe
+êý 0xeafd
+êü 0xeafc
+êû 0xeafb
+êú 0xeafa
+êù 0xeaf9
+êø 0xeaf8
+ê÷ 0xeaf7
+êö 0xeaf6
+êõ 0xeaf5
+êô 0xeaf4
+êó 0xeaf3
+êò 0xeaf2
+êñ 0xeaf1
+êð 0xeaf0
+êï 0xeaef
+êî 0xeaee
+êí 0xeaed
+êì 0xeaec
+êë 0xeaeb
+êê 0xeaea
+êé 0xeae9
+êè 0xeae8
+êç 0xeae7
+êæ 0xeae6
+êå 0xeae5
+êä 0xeae4
+êã 0xeae3
+êâ 0xeae2
+êá 0xeae1
+êà 0xeae0
+êß 0xeadf
+êÞ 0xeade
+êÝ 0xeadd
+êÜ 0xeadc
+êÛ 0xeadb
+êÚ 0xeada
+êÙ 0xead9
+êØ 0xead8
+ê× 0xead7
+êÖ 0xead6
+êÕ 0xead5
+êÔ 0xead4
+êÓ 0xead3
+êÒ 0xead2
+êÑ 0xead1
+êÐ 0xead0
+êÏ 0xeacf
+êÎ 0xeace
+êÍ 0xeacd
+êÌ 0xeacc
+êË 0xeacb
+êÊ 0xeaca
+êÉ 0xeac9
+êÈ 0xeac8
+êÇ 0xeac7
+êÆ 0xeac6
+êÅ 0xeac5
+êÄ 0xeac4
+êà 0xeac3
+ê 0xeac2
+êÁ 0xeac1
+êÀ 0xeac0
+ê¿ 0xeabf
+ê¾ 0xeabe
+ê½ 0xeabd
+ê¼ 0xeabc
+ê» 0xeabb
+êº 0xeaba
+ê¹ 0xeab9
+ê¸ 0xeab8
+ê· 0xeab7
+ê¶ 0xeab6
+êµ 0xeab5
+ê´ 0xeab4
+ê³ 0xeab3
+ê² 0xeab2
+ê± 0xeab1
+ê° 0xeab0
+ê¯ 0xeaaf
+ê® 0xeaae
+ê­ 0xeaad
+ê¬ 0xeaac
+ê« 0xeaab
+êª 0xeaaa
+ê© 0xeaa9
+ê¨ 0xeaa8
+ê§ 0xeaa7
+ê¦ 0xeaa6
+ê¥ 0xeaa5
+ê¤ 0xeaa4
+ê£ 0xeaa3
+ê¢ 0xeaa2
+ê¡ 0xeaa1
+ëþ 0xebfe
+ëý 0xebfd
+ëü 0xebfc
+ëû 0xebfb
+ëú 0xebfa
+ëù 0xebf9
+ëø 0xebf8
+ë÷ 0xebf7
+ëö 0xebf6
+ëõ 0xebf5
+ëô 0xebf4
+ëó 0xebf3
+ëò 0xebf2
+ëñ 0xebf1
+ëð 0xebf0
+ëï 0xebef
+ëî 0xebee
+ëí 0xebed
+ëì 0xebec
+ëë 0xebeb
+ëê 0xebea
+ëé 0xebe9
+ëè 0xebe8
+ëç 0xebe7
+ëæ 0xebe6
+ëå 0xebe5
+ëä 0xebe4
+ëã 0xebe3
+ëâ 0xebe2
+ëá 0xebe1
+ëà 0xebe0
+ëß 0xebdf
+ëÞ 0xebde
+ëÝ 0xebdd
+ëÜ 0xebdc
+ëÛ 0xebdb
+ëÚ 0xebda
+ëÙ 0xebd9
+ëØ 0xebd8
+ë× 0xebd7
+ëÖ 0xebd6
+ëÕ 0xebd5
+ëÔ 0xebd4
+ëÓ 0xebd3
+ëÒ 0xebd2
+ëÑ 0xebd1
+ëÐ 0xebd0
+ëÏ 0xebcf
+ëÎ 0xebce
+ëÍ 0xebcd
+ëÌ 0xebcc
+ëË 0xebcb
+ëÊ 0xebca
+ëÉ 0xebc9
+ëÈ 0xebc8
+ëÇ 0xebc7
+ëÆ 0xebc6
+ëÅ 0xebc5
+ëÄ 0xebc4
+ëà 0xebc3
+ë 0xebc2
+ëÁ 0xebc1
+ëÀ 0xebc0
+ë¿ 0xebbf
+ë¾ 0xebbe
+ë½ 0xebbd
+ë¼ 0xebbc
+ë» 0xebbb
+ëº 0xebba
+ë¹ 0xebb9
+ë¸ 0xebb8
+ë· 0xebb7
+ë¶ 0xebb6
+ëµ 0xebb5
+ë´ 0xebb4
+ë³ 0xebb3
+ë² 0xebb2
+ë± 0xebb1
+ë° 0xebb0
+ë¯ 0xebaf
+ë® 0xebae
+ë­ 0xebad
+ë¬ 0xebac
+ë« 0xebab
+ëª 0xebaa
+ë© 0xeba9
+ë¨ 0xeba8
+ë§ 0xeba7
+ë¦ 0xeba6
+ë¥ 0xeba5
+ë¤ 0xeba4
+ë£ 0xeba3
+ë¢ 0xeba2
+ë¡ 0xeba1
+ìþ 0xecfe
+ìý 0xecfd
+ìü 0xecfc
+ìû 0xecfb
+ìú 0xecfa
+ìù 0xecf9
+ìø 0xecf8
+ì÷ 0xecf7
+ìö 0xecf6
+ìõ 0xecf5
+ìô 0xecf4
+ìó 0xecf3
+ìò 0xecf2
+ìñ 0xecf1
+ìð 0xecf0
+ìï 0xecef
+ìî 0xecee
+ìí 0xeced
+ìì 0xecec
+ìë 0xeceb
+ìê 0xecea
+ìé 0xece9
+ìè 0xece8
+ìç 0xece7
+ìæ 0xece6
+ìå 0xece5
+ìä 0xece4
+ìã 0xece3
+ìâ 0xece2
+ìá 0xece1
+ìà 0xece0
+ìß 0xecdf
+ìÞ 0xecde
+ìÝ 0xecdd
+ìÜ 0xecdc
+ìÛ 0xecdb
+ìÚ 0xecda
+ìÙ 0xecd9
+ìØ 0xecd8
+ì× 0xecd7
+ìÖ 0xecd6
+ìÕ 0xecd5
+ìÔ 0xecd4
+ìÓ 0xecd3
+ìÒ 0xecd2
+ìÑ 0xecd1
+ìÐ 0xecd0
+ìÏ 0xeccf
+ìÎ 0xecce
+ìÍ 0xeccd
+ìÌ 0xeccc
+ìË 0xeccb
+ìÊ 0xecca
+ìÉ 0xecc9
+ìÈ 0xecc8
+ìÇ 0xecc7
+ìÆ 0xecc6
+ìÅ 0xecc5
+ìÄ 0xecc4
+ìà 0xecc3
+ì 0xecc2
+ìÁ 0xecc1
+ìÀ 0xecc0
+ì¿ 0xecbf
+ì¾ 0xecbe
+ì½ 0xecbd
+ì¼ 0xecbc
+ì» 0xecbb
+ìº 0xecba
+ì¹ 0xecb9
+ì¸ 0xecb8
+ì· 0xecb7
+ì¶ 0xecb6
+ìµ 0xecb5
+ì´ 0xecb4
+ì³ 0xecb3
+ì² 0xecb2
+ì± 0xecb1
+ì° 0xecb0
+ì¯ 0xecaf
+ì® 0xecae
+ì­ 0xecad
+ì¬ 0xecac
+ì« 0xecab
+ìª 0xecaa
+ì© 0xeca9
+ì¨ 0xeca8
+ì§ 0xeca7
+ì¦ 0xeca6
+ì¥ 0xeca5
+ì¤ 0xeca4
+ì£ 0xeca3
+ì¢ 0xeca2
+ì¡ 0xeca1
+íþ 0xedfe
+íý 0xedfd
+íü 0xedfc
+íû 0xedfb
+íú 0xedfa
+íù 0xedf9
+íø 0xedf8
+í÷ 0xedf7
+íö 0xedf6
+íõ 0xedf5
+íô 0xedf4
+íó 0xedf3
+íò 0xedf2
+íñ 0xedf1
+íð 0xedf0
+íï 0xedef
+íî 0xedee
+íí 0xeded
+íì 0xedec
+íë 0xedeb
+íê 0xedea
+íé 0xede9
+íè 0xede8
+íç 0xede7
+íæ 0xede6
+íå 0xede5
+íä 0xede4
+íã 0xede3
+íâ 0xede2
+íá 0xede1
+íà 0xede0
+íß 0xeddf
+íÞ 0xedde
+íÝ 0xeddd
+íÜ 0xeddc
+íÛ 0xeddb
+íÚ 0xedda
+íÙ 0xedd9
+íØ 0xedd8
+í× 0xedd7
+íÖ 0xedd6
+íÕ 0xedd5
+íÔ 0xedd4
+íÓ 0xedd3
+íÒ 0xedd2
+íÑ 0xedd1
+íÐ 0xedd0
+íÏ 0xedcf
+íÎ 0xedce
+íÍ 0xedcd
+íÌ 0xedcc
+íË 0xedcb
+íÊ 0xedca
+íÉ 0xedc9
+íÈ 0xedc8
+íÇ 0xedc7
+íÆ 0xedc6
+íÅ 0xedc5
+íÄ 0xedc4
+íà 0xedc3
+í 0xedc2
+íÁ 0xedc1
+íÀ 0xedc0
+í¿ 0xedbf
+í¾ 0xedbe
+í½ 0xedbd
+í¼ 0xedbc
+í» 0xedbb
+íº 0xedba
+í¹ 0xedb9
+í¸ 0xedb8
+í· 0xedb7
+í¶ 0xedb6
+íµ 0xedb5
+í´ 0xedb4
+í³ 0xedb3
+í² 0xedb2
+í± 0xedb1
+í° 0xedb0
+í¯ 0xedaf
+í® 0xedae
+í­ 0xedad
+í¬ 0xedac
+í« 0xedab
+íª 0xedaa
+í© 0xeda9
+í¨ 0xeda8
+í§ 0xeda7
+í¦ 0xeda6
+í¥ 0xeda5
+í¤ 0xeda4
+í£ 0xeda3
+í¢ 0xeda2
+í¡ 0xeda1
+îþ 0xeefe
+îý 0xeefd
+îü 0xeefc
+îû 0xeefb
+îú 0xeefa
+îù 0xeef9
+îø 0xeef8
+î÷ 0xeef7
+îö 0xeef6
+îõ 0xeef5
+îô 0xeef4
+îó 0xeef3
+îò 0xeef2
+îñ 0xeef1
+îð 0xeef0
+îï 0xeeef
+îî 0xeeee
+îí 0xeeed
+îì 0xeeec
+îë 0xeeeb
+îê 0xeeea
+îé 0xeee9
+îè 0xeee8
+îç 0xeee7
+îæ 0xeee6
+îå 0xeee5
+îä 0xeee4
+îã 0xeee3
+îâ 0xeee2
+îá 0xeee1
+îà 0xeee0
+îß 0xeedf
+îÞ 0xeede
+îÝ 0xeedd
+îÜ 0xeedc
+îÛ 0xeedb
+îÚ 0xeeda
+îÙ 0xeed9
+îØ 0xeed8
+î× 0xeed7
+îÖ 0xeed6
+îÕ 0xeed5
+îÔ 0xeed4
+îÓ 0xeed3
+îÒ 0xeed2
+îÑ 0xeed1
+îÐ 0xeed0
+îÏ 0xeecf
+îÎ 0xeece
+îÍ 0xeecd
+îÌ 0xeecc
+îË 0xeecb
+îÊ 0xeeca
+îÉ 0xeec9
+îÈ 0xeec8
+îÇ 0xeec7
+îÆ 0xeec6
+îÅ 0xeec5
+îÄ 0xeec4
+îà 0xeec3
+î 0xeec2
+îÁ 0xeec1
+îÀ 0xeec0
+î¿ 0xeebf
+î¾ 0xeebe
+î½ 0xeebd
+î¼ 0xeebc
+î» 0xeebb
+îº 0xeeba
+î¹ 0xeeb9
+î¸ 0xeeb8
+î· 0xeeb7
+î¶ 0xeeb6
+îµ 0xeeb5
+î´ 0xeeb4
+î³ 0xeeb3
+î² 0xeeb2
+î± 0xeeb1
+î° 0xeeb0
+î¯ 0xeeaf
+î® 0xeeae
+î­ 0xeead
+î¬ 0xeeac
+î« 0xeeab
+îª 0xeeaa
+î© 0xeea9
+î¨ 0xeea8
+î§ 0xeea7
+î¦ 0xeea6
+î¥ 0xeea5
+î¤ 0xeea4
+î£ 0xeea3
+î¢ 0xeea2
+î¡ 0xeea1
+ïþ 0xeffe
+ïý 0xeffd
+ïü 0xeffc
+ïû 0xeffb
+ïú 0xeffa
+ïù 0xeff9
+ïø 0xeff8
+ï÷ 0xeff7
+ïö 0xeff6
+ïõ 0xeff5
+ïô 0xeff4
+ïó 0xeff3
+ïò 0xeff2
+ïñ 0xeff1
+ïð 0xeff0
+ïï 0xefef
+ïî 0xefee
+ïí 0xefed
+ïì 0xefec
+ïë 0xefeb
+ïê 0xefea
+ïé 0xefe9
+ïè 0xefe8
+ïç 0xefe7
+ïæ 0xefe6
+ïå 0xefe5
+ïä 0xefe4
+ïã 0xefe3
+ïâ 0xefe2
+ïá 0xefe1
+ïà 0xefe0
+ïß 0xefdf
+ïÞ 0xefde
+ïÝ 0xefdd
+ïÜ 0xefdc
+ïÛ 0xefdb
+ïÚ 0xefda
+ïÙ 0xefd9
+ïØ 0xefd8
+ï× 0xefd7
+ïÖ 0xefd6
+ïÕ 0xefd5
+ïÔ 0xefd4
+ïÓ 0xefd3
+ïÒ 0xefd2
+ïÑ 0xefd1
+ïÐ 0xefd0
+ïÏ 0xefcf
+ïÎ 0xefce
+ïÍ 0xefcd
+ïÌ 0xefcc
+ïË 0xefcb
+ïÊ 0xefca
+ïÉ 0xefc9
+ïÈ 0xefc8
+ïÇ 0xefc7
+ïÆ 0xefc6
+ïÅ 0xefc5
+ïÄ 0xefc4
+ïà 0xefc3
+ï 0xefc2
+ïÁ 0xefc1
+ïÀ 0xefc0
+ï¿ 0xefbf
+ï¾ 0xefbe
+ï½ 0xefbd
+ï¼ 0xefbc
+ï» 0xefbb
+ïº 0xefba
+ï¹ 0xefb9
+ï¸ 0xefb8
+ï· 0xefb7
+ï¶ 0xefb6
+ïµ 0xefb5
+ï´ 0xefb4
+ï³ 0xefb3
+ï² 0xefb2
+ï± 0xefb1
+ï° 0xefb0
+ï¯ 0xefaf
+ï® 0xefae
+ï­ 0xefad
+ï¬ 0xefac
+ï« 0xefab
+ïª 0xefaa
+ï© 0xefa9
+ï¨ 0xefa8
+ï§ 0xefa7
+ï¦ 0xefa6
+ï¥ 0xefa5
+ï¤ 0xefa4
+ï£ 0xefa3
+ï¢ 0xefa2
+ï¡ 0xefa1
+ðþ 0xf0fe
+ðý 0xf0fd
+ðü 0xf0fc
+ðû 0xf0fb
+ðú 0xf0fa
+ðù 0xf0f9
+ðø 0xf0f8
+ð÷ 0xf0f7
+ðö 0xf0f6
+ðõ 0xf0f5
+ðô 0xf0f4
+ðó 0xf0f3
+ðò 0xf0f2
+ðñ 0xf0f1
+ðð 0xf0f0
+ðï 0xf0ef
+ðî 0xf0ee
+ðí 0xf0ed
+ðì 0xf0ec
+ðë 0xf0eb
+ðê 0xf0ea
+ðé 0xf0e9
+ðè 0xf0e8
+ðç 0xf0e7
+ðæ 0xf0e6
+ðå 0xf0e5
+ðä 0xf0e4
+ðã 0xf0e3
+ðâ 0xf0e2
+ðá 0xf0e1
+ðà 0xf0e0
+ðß 0xf0df
+ðÞ 0xf0de
+ðÝ 0xf0dd
+ðÜ 0xf0dc
+ðÛ 0xf0db
+ðÚ 0xf0da
+ðÙ 0xf0d9
+ðØ 0xf0d8
+ð× 0xf0d7
+ðÖ 0xf0d6
+ðÕ 0xf0d5
+ðÔ 0xf0d4
+ðÓ 0xf0d3
+ðÒ 0xf0d2
+ðÑ 0xf0d1
+ðÐ 0xf0d0
+ðÏ 0xf0cf
+ðÎ 0xf0ce
+ðÍ 0xf0cd
+ðÌ 0xf0cc
+ðË 0xf0cb
+ðÊ 0xf0ca
+ðÉ 0xf0c9
+ðÈ 0xf0c8
+ðÇ 0xf0c7
+ðÆ 0xf0c6
+ðÅ 0xf0c5
+ðÄ 0xf0c4
+ðà 0xf0c3
+ð 0xf0c2
+ðÁ 0xf0c1
+ðÀ 0xf0c0
+ð¿ 0xf0bf
+ð¾ 0xf0be
+ð½ 0xf0bd
+ð¼ 0xf0bc
+ð» 0xf0bb
+ðº 0xf0ba
+ð¹ 0xf0b9
+ð¸ 0xf0b8
+ð· 0xf0b7
+ð¶ 0xf0b6
+ðµ 0xf0b5
+ð´ 0xf0b4
+ð³ 0xf0b3
+ð² 0xf0b2
+ð± 0xf0b1
+ð° 0xf0b0
+ð¯ 0xf0af
+ð® 0xf0ae
+ð­ 0xf0ad
+ð¬ 0xf0ac
+ð« 0xf0ab
+ðª 0xf0aa
+ð© 0xf0a9
+ð¨ 0xf0a8
+ð§ 0xf0a7
+ð¦ 0xf0a6
+ð¥ 0xf0a5
+ð¤ 0xf0a4
+ð£ 0xf0a3
+ð¢ 0xf0a2
+ð¡ 0xf0a1
+ñþ 0xf1fe
+ñý 0xf1fd
+ñü 0xf1fc
+ñû 0xf1fb
+ñú 0xf1fa
+ñù 0xf1f9
+ñø 0xf1f8
+ñ÷ 0xf1f7
+ñö 0xf1f6
+ñõ 0xf1f5
+ñô 0xf1f4
+ñó 0xf1f3
+ñò 0xf1f2
+ññ 0xf1f1
+ñð 0xf1f0
+ñï 0xf1ef
+ñî 0xf1ee
+ñí 0xf1ed
+ñì 0xf1ec
+ñë 0xf1eb
+ñê 0xf1ea
+ñé 0xf1e9
+ñè 0xf1e8
+ñç 0xf1e7
+ñæ 0xf1e6
+ñå 0xf1e5
+ñä 0xf1e4
+ñã 0xf1e3
+ñâ 0xf1e2
+ñá 0xf1e1
+ñà 0xf1e0
+ñß 0xf1df
+ñÞ 0xf1de
+ñÝ 0xf1dd
+ñÜ 0xf1dc
+ñÛ 0xf1db
+ñÚ 0xf1da
+ñÙ 0xf1d9
+ñØ 0xf1d8
+ñ× 0xf1d7
+ñÖ 0xf1d6
+ñÕ 0xf1d5
+ñÔ 0xf1d4
+ñÓ 0xf1d3
+ñÒ 0xf1d2
+ñÑ 0xf1d1
+ñÐ 0xf1d0
+ñÏ 0xf1cf
+ñÎ 0xf1ce
+ñÍ 0xf1cd
+ñÌ 0xf1cc
+ñË 0xf1cb
+ñÊ 0xf1ca
+ñÉ 0xf1c9
+ñÈ 0xf1c8
+ñÇ 0xf1c7
+ñÆ 0xf1c6
+ñÅ 0xf1c5
+ñÄ 0xf1c4
+ñà 0xf1c3
+ñ 0xf1c2
+ñÁ 0xf1c1
+ñÀ 0xf1c0
+ñ¿ 0xf1bf
+ñ¾ 0xf1be
+ñ½ 0xf1bd
+ñ¼ 0xf1bc
+ñ» 0xf1bb
+ñº 0xf1ba
+ñ¹ 0xf1b9
+ñ¸ 0xf1b8
+ñ· 0xf1b7
+ñ¶ 0xf1b6
+ñµ 0xf1b5
+ñ´ 0xf1b4
+ñ³ 0xf1b3
+ñ² 0xf1b2
+ñ± 0xf1b1
+ñ° 0xf1b0
+ñ¯ 0xf1af
+ñ® 0xf1ae
+ñ­ 0xf1ad
+ñ¬ 0xf1ac
+ñ« 0xf1ab
+ñª 0xf1aa
+ñ© 0xf1a9
+ñ¨ 0xf1a8
+ñ§ 0xf1a7
+ñ¦ 0xf1a6
+ñ¥ 0xf1a5
+ñ¤ 0xf1a4
+ñ£ 0xf1a3
+ñ¢ 0xf1a2
+ñ¡ 0xf1a1
+òþ 0xf2fe
+òý 0xf2fd
+òü 0xf2fc
+òû 0xf2fb
+òú 0xf2fa
+òù 0xf2f9
+òø 0xf2f8
+ò÷ 0xf2f7
+òö 0xf2f6
+òõ 0xf2f5
+òô 0xf2f4
+òó 0xf2f3
+òò 0xf2f2
+òñ 0xf2f1
+òð 0xf2f0
+òï 0xf2ef
+òî 0xf2ee
+òí 0xf2ed
+òì 0xf2ec
+òë 0xf2eb
+òê 0xf2ea
+òé 0xf2e9
+òè 0xf2e8
+òç 0xf2e7
+òæ 0xf2e6
+òå 0xf2e5
+òä 0xf2e4
+òã 0xf2e3
+òâ 0xf2e2
+òá 0xf2e1
+òà 0xf2e0
+òß 0xf2df
+òÞ 0xf2de
+òÝ 0xf2dd
+òÜ 0xf2dc
+òÛ 0xf2db
+òÚ 0xf2da
+òÙ 0xf2d9
+òØ 0xf2d8
+ò× 0xf2d7
+òÖ 0xf2d6
+òÕ 0xf2d5
+òÔ 0xf2d4
+òÓ 0xf2d3
+òÒ 0xf2d2
+òÑ 0xf2d1
+òÐ 0xf2d0
+òÏ 0xf2cf
+òÎ 0xf2ce
+òÍ 0xf2cd
+òÌ 0xf2cc
+òË 0xf2cb
+òÊ 0xf2ca
+òÉ 0xf2c9
+òÈ 0xf2c8
+òÇ 0xf2c7
+òÆ 0xf2c6
+òÅ 0xf2c5
+òÄ 0xf2c4
+òÃ 0xf2c3
+òÂ 0xf2c2
+òÁ 0xf2c1
+òÀ 0xf2c0
+ò¿ 0xf2bf
+ò¾ 0xf2be
+ò½ 0xf2bd
+ò¼ 0xf2bc
+ò» 0xf2bb
+òº 0xf2ba
+ò¹ 0xf2b9
+ò¸ 0xf2b8
+ò· 0xf2b7
+ò¶ 0xf2b6
+òµ 0xf2b5
+ò´ 0xf2b4
+ò³ 0xf2b3
+ò² 0xf2b2
+ò± 0xf2b1
+ò° 0xf2b0
+ò¯ 0xf2af
+ò® 0xf2ae
+ò­ 0xf2ad
+ò¬ 0xf2ac
+ò« 0xf2ab
+òª 0xf2aa
+ò© 0xf2a9
+ò¨ 0xf2a8
+ò§ 0xf2a7
+ò¦ 0xf2a6
+ò¥ 0xf2a5
+ò¤ 0xf2a4
+ò£ 0xf2a3
+ò¢ 0xf2a2
+ò¡ 0xf2a1
+óþ 0xf3fe
+óý 0xf3fd
+óü 0xf3fc
+óû 0xf3fb
+óú 0xf3fa
+óù 0xf3f9
+óø 0xf3f8
+ó÷ 0xf3f7
+óö 0xf3f6
+óõ 0xf3f5
+óô 0xf3f4
+óó 0xf3f3
+óò 0xf3f2
+óñ 0xf3f1
+óð 0xf3f0
+óï 0xf3ef
+óî 0xf3ee
+óí 0xf3ed
+óì 0xf3ec
+óë 0xf3eb
+óê 0xf3ea
+óé 0xf3e9
+óè 0xf3e8
+óç 0xf3e7
+óæ 0xf3e6
+óå 0xf3e5
+óä 0xf3e4
+óã 0xf3e3
+óâ 0xf3e2
+óá 0xf3e1
+óà 0xf3e0
+óß 0xf3df
+óÞ 0xf3de
+óÝ 0xf3dd
+óÜ 0xf3dc
+óÛ 0xf3db
+óÚ 0xf3da
+óÙ 0xf3d9
+óØ 0xf3d8
+ó× 0xf3d7
+óÖ 0xf3d6
+óÕ 0xf3d5
+óÔ 0xf3d4
+óÓ 0xf3d3
+óÒ 0xf3d2
+óÑ 0xf3d1
+óÐ 0xf3d0
+óÏ 0xf3cf
+óÎ 0xf3ce
+óÍ 0xf3cd
+óÌ 0xf3cc
+óË 0xf3cb
+óÊ 0xf3ca
+óÉ 0xf3c9
+óÈ 0xf3c8
+óÇ 0xf3c7
+óÆ 0xf3c6
+óÅ 0xf3c5
+óÄ 0xf3c4
+óÃ 0xf3c3
+óÂ 0xf3c2
+óÁ 0xf3c1
+óÀ 0xf3c0
+ó¿ 0xf3bf
+ó¾ 0xf3be
+ó½ 0xf3bd
+ó¼ 0xf3bc
+ó» 0xf3bb
+óº 0xf3ba
+ó¹ 0xf3b9
+ó¸ 0xf3b8
+ó· 0xf3b7
+ó¶ 0xf3b6
+óµ 0xf3b5
+ó´ 0xf3b4
+ó³ 0xf3b3
+ó² 0xf3b2
+ó± 0xf3b1
+ó° 0xf3b0
+ó¯ 0xf3af
+ó® 0xf3ae
+ó­ 0xf3ad
+ó¬ 0xf3ac
+ó« 0xf3ab
+óª 0xf3aa
+ó© 0xf3a9
+ó¨ 0xf3a8
+ó§ 0xf3a7
+ó¦ 0xf3a6
+ó¥ 0xf3a5
+ó¤ 0xf3a4
+ó£ 0xf3a3
+ó¢ 0xf3a2
+ó¡ 0xf3a1
+ôþ 0xf4fe
+ôý 0xf4fd
+ôü 0xf4fc
+ôû 0xf4fb
+ôú 0xf4fa
+ôù 0xf4f9
+ôø 0xf4f8
+ô÷ 0xf4f7
+ôö 0xf4f6
+ôõ 0xf4f5
+ôô 0xf4f4
+ôó 0xf4f3
+ôò 0xf4f2
+ôñ 0xf4f1
+ôð 0xf4f0
+ôï 0xf4ef
+ôî 0xf4ee
+ôí 0xf4ed
+ôì 0xf4ec
+ôë 0xf4eb
+ôê 0xf4ea
+ôé 0xf4e9
+ôè 0xf4e8
+ôç 0xf4e7
+ôæ 0xf4e6
+ôå 0xf4e5
+ôä 0xf4e4
+ôã 0xf4e3
+ôâ 0xf4e2
+ôá 0xf4e1
+ôà 0xf4e0
+ôß 0xf4df
+ôÞ 0xf4de
+ôÝ 0xf4dd
+ôÜ 0xf4dc
+ôÛ 0xf4db
+ôÚ 0xf4da
+ôÙ 0xf4d9
+ôØ 0xf4d8
+ô× 0xf4d7
+ôÖ 0xf4d6
+ôÕ 0xf4d5
+ôÔ 0xf4d4
+ôÓ 0xf4d3
+ôÒ 0xf4d2
+ôÑ 0xf4d1
+ôÐ 0xf4d0
+ôÏ 0xf4cf
+ôÎ 0xf4ce
+ôÍ 0xf4cd
+ôÌ 0xf4cc
+ôË 0xf4cb
+ôÊ 0xf4ca
+ôÉ 0xf4c9
+ôÈ 0xf4c8
+ôÇ 0xf4c7
+ôÆ 0xf4c6
+ôÅ 0xf4c5
+ôÄ 0xf4c4
+ôÃ 0xf4c3
+ôÂ 0xf4c2
+ôÁ 0xf4c1
+ôÀ 0xf4c0
+ô¿ 0xf4bf
+ô¾ 0xf4be
+ô½ 0xf4bd
+ô¼ 0xf4bc
+ô» 0xf4bb
+ôº 0xf4ba
+ô¹ 0xf4b9
+ô¸ 0xf4b8
+ô· 0xf4b7
+ô¶ 0xf4b6
+ôµ 0xf4b5
+ô´ 0xf4b4
+ô³ 0xf4b3
+ô² 0xf4b2
+ô± 0xf4b1
+ô° 0xf4b0
+ô¯ 0xf4af
+ô® 0xf4ae
+ô­ 0xf4ad
+ô¬ 0xf4ac
+ô« 0xf4ab
+ôª 0xf4aa
+ô© 0xf4a9
+ô¨ 0xf4a8
+ô§ 0xf4a7
+ô¦ 0xf4a6
+ô¥ 0xf4a5
+ô¤ 0xf4a4
+ô£ 0xf4a3
+ô¢ 0xf4a2
+ô¡ 0xf4a1
+õþ 0xf5fe
+õý 0xf5fd
+õü 0xf5fc
+õû 0xf5fb
+õú 0xf5fa
+õù 0xf5f9
+õø 0xf5f8
+õ÷ 0xf5f7
+õö 0xf5f6
+õõ 0xf5f5
+õô 0xf5f4
+õó 0xf5f3
+õò 0xf5f2
+õñ 0xf5f1
+õð 0xf5f0
+õï 0xf5ef
+õî 0xf5ee
+õí 0xf5ed
+õì 0xf5ec
+õë 0xf5eb
+õê 0xf5ea
+õé 0xf5e9
+õè 0xf5e8
+õç 0xf5e7
+õæ 0xf5e6
+õå 0xf5e5
+õä 0xf5e4
+õã 0xf5e3
+õâ 0xf5e2
+õá 0xf5e1
+õà 0xf5e0
+õß 0xf5df
+õÞ 0xf5de
+õÝ 0xf5dd
+õÜ 0xf5dc
+õÛ 0xf5db
+õÚ 0xf5da
+õÙ 0xf5d9
+õØ 0xf5d8
+õ× 0xf5d7
+õÖ 0xf5d6
+õÕ 0xf5d5
+õÔ 0xf5d4
+õÓ 0xf5d3
+õÒ 0xf5d2
+õÑ 0xf5d1
+õÐ 0xf5d0
+õÏ 0xf5cf
+õÎ 0xf5ce
+õÍ 0xf5cd
+õÌ 0xf5cc
+õË 0xf5cb
+õÊ 0xf5ca
+õÉ 0xf5c9
+õÈ 0xf5c8
+õÇ 0xf5c7
+õÆ 0xf5c6
+õÅ 0xf5c5
+õÄ 0xf5c4
+õÃ 0xf5c3
+õÂ 0xf5c2
+õÁ 0xf5c1
+õÀ 0xf5c0
+õ¿ 0xf5bf
+õ¾ 0xf5be
+õ½ 0xf5bd
+õ¼ 0xf5bc
+õ» 0xf5bb
+õº 0xf5ba
+õ¹ 0xf5b9
+õ¸ 0xf5b8
+õ· 0xf5b7
+õ¶ 0xf5b6
+õµ 0xf5b5
+õ´ 0xf5b4
+õ³ 0xf5b3
+õ² 0xf5b2
+õ± 0xf5b1
+õ° 0xf5b0
+õ¯ 0xf5af
+õ® 0xf5ae
+õ­ 0xf5ad
+õ¬ 0xf5ac
+õ« 0xf5ab
+õª 0xf5aa
+õ© 0xf5a9
+õ¨ 0xf5a8
+õ§ 0xf5a7
+õ¦ 0xf5a6
+õ¥ 0xf5a5
+õ¤ 0xf5a4
+õ£ 0xf5a3
+õ¢ 0xf5a2
+õ¡ 0xf5a1
+öþ 0xf6fe
+öý 0xf6fd
+öü 0xf6fc
+öû 0xf6fb
+öú 0xf6fa
+öù 0xf6f9
+öø 0xf6f8
+ö÷ 0xf6f7
+öö 0xf6f6
+öõ 0xf6f5
+öô 0xf6f4
+öó 0xf6f3
+öò 0xf6f2
+öñ 0xf6f1
+öð 0xf6f0
+öï 0xf6ef
+öî 0xf6ee
+öí 0xf6ed
+öì 0xf6ec
+öë 0xf6eb
+öê 0xf6ea
+öé 0xf6e9
+öè 0xf6e8
+öç 0xf6e7
+öæ 0xf6e6
+öå 0xf6e5
+öä 0xf6e4
+öã 0xf6e3
+öâ 0xf6e2
+öá 0xf6e1
+öà 0xf6e0
+öß 0xf6df
+öÞ 0xf6de
+öÝ 0xf6dd
+öÜ 0xf6dc
+öÛ 0xf6db
+öÚ 0xf6da
+öÙ 0xf6d9
+öØ 0xf6d8
+ö× 0xf6d7
+öÖ 0xf6d6
+öÕ 0xf6d5
+öÔ 0xf6d4
+öÓ 0xf6d3
+öÒ 0xf6d2
+öÑ 0xf6d1
+öÐ 0xf6d0
+öÏ 0xf6cf
+öÎ 0xf6ce
+öÍ 0xf6cd
+öÌ 0xf6cc
+öË 0xf6cb
+öÊ 0xf6ca
+öÉ 0xf6c9
+öÈ 0xf6c8
+öÇ 0xf6c7
+öÆ 0xf6c6
+öÅ 0xf6c5
+öÄ 0xf6c4
+öÃ 0xf6c3
+öÂ 0xf6c2
+öÁ 0xf6c1
+öÀ 0xf6c0
+ö¿ 0xf6bf
+ö¾ 0xf6be
+ö½ 0xf6bd
+ö¼ 0xf6bc
+ö» 0xf6bb
+öº 0xf6ba
+ö¹ 0xf6b9
+ö¸ 0xf6b8
+ö· 0xf6b7
+ö¶ 0xf6b6
+öµ 0xf6b5
+ö´ 0xf6b4
+ö³ 0xf6b3
+ö² 0xf6b2
+ö± 0xf6b1
+ö° 0xf6b0
+ö¯ 0xf6af
+ö® 0xf6ae
+ö­ 0xf6ad
+ö¬ 0xf6ac
+ö« 0xf6ab
+öª 0xf6aa
+ö© 0xf6a9
+ö¨ 0xf6a8
+ö§ 0xf6a7
+ö¦ 0xf6a6
+ö¥ 0xf6a5
+ö¤ 0xf6a4
+ö£ 0xf6a3
+ö¢ 0xf6a2
+ö¡ 0xf6a1
+÷þ 0xf7fe
+÷ý 0xf7fd
+֟ 0xf7fc
+÷û 0xf7fb
+÷ú 0xf7fa
+÷ù 0xf7f9
+÷ø 0xf7f8
+÷÷ 0xf7f7
+÷ö 0xf7f6
+÷õ 0xf7f5
+÷ô 0xf7f4
+÷ó 0xf7f3
+÷ò 0xf7f2
+֖ 0xf7f1
+÷ð 0xf7f0
+֕ 0xf7ef
+֔ 0xf7ee
+֒ 0xf7ed
+֓ 0xf7ec
+֑ 0xf7eb
+֐ 0xf7ea
+֎ 0xf7e9
+֏ 0xf7e8
+֍ 0xf7e7
+־ 0xf7e6
+֌ 0xf7e5
+֊ 0xf7e4
+֋ 0xf7e3
+։ 0xf7e2
+և 0xf7e1
+ֈ 0xf7e0
+֧ 0xf7df
+÷Þ 0xf7de
+÷Ý 0xf7dd
+ֆ 0xf7dc
+÷Û 0xf7db
+÷Ú 0xf7da
+÷Ù 0xf7d9
+֯ 0xf7d8
+÷× 0xf7d7
+÷Ö 0xf7d6
+÷Õ 0xf7d5
+÷Ô 0xf7d4
+÷Ó 0xf7d3
+÷Ò 0xf7d2
+ք 0xf7d1
+÷Ð 0xf7d0
+÷Ï 0xf7cf
+÷Î 0xf7ce
+÷Í 0xf7cd
+÷Ì 0xf7cc
+÷Ë 0xf7cb
+÷Ê 0xf7ca
+փ 0xf7c9
+÷È 0xf7c8
+ւ 0xf7c7
+֮ 0xf7c6
+ց 0xf7c5
+ր 0xf7c4
+ֈ 0xf7c3
+÷ 0xf7c2
+÷Á 0xf7c1
+÷À 0xf7c0
+÷¿ 0xf7bf
+÷¾ 0xf7be
+÷½ 0xf7bd
+÷¼ 0xf7bc
+÷» 0xf7bb
+ּ 0xf7ba
+÷¹ 0xf7b9
+÷¸ 0xf7b8
+÷· 0xf7b7
+֦ 0xf7b6
+÷µ 0xf7b5
+÷´ 0xf7b4
+÷³ 0xf7b3
+÷² 0xf7b2
+÷± 0xf7b1
+÷° 0xf7b0
+÷¯ 0xf7af
+÷® 0xf7ae
+÷­ 0xf7ad
+÷¬ 0xf7ac
+÷« 0xf7ab
+ֻ 0xf7aa
+֩ 0xf7a9
+֬ 0xf7a8
+֤ 0xf7a7
+÷¦ 0xf7a6
+÷¥ 0xf7a5
+÷¤ 0xf7a4
+÷£ 0xf7a3
+÷¢ 0xf7a2
+÷¡ 0xf7a1
diff --git a/private/oleauto/sample/nlssort/source.cht b/private/oleauto/sample/nlssort/source.cht
new file mode 100644
index 000000000..c29379005
--- /dev/null
+++ b/private/oleauto/sample/nlssort/source.cht
@@ -0,0 +1,13053 @@
+¤@ 0xa440
+¤A 0xa441
+¤B 0xa442
+¤C 0xa443
+¤D 0xa444
+¤E 0xa445
+¤F 0xa446
+¤G 0xa447
+¤H 0xa448
+¤I 0xa449
+¤J 0xa44a
+¤K 0xa44b
+¤L 0xa44c
+¤M 0xa44d
+¤N 0xa44e
+¤O 0xa44f
+¤P 0xa450
+¤Q 0xa451
+¤R 0xa452
+¤S 0xa453
+¤T 0xa454
+¤U 0xa455
+¤V 0xa456
+¤W 0xa457
+¤X 0xa458
+¤Y 0xa459
+¤Z 0xa45a
+¤[ 0xa45b
+¤\ 0xa45c
+¤] 0xa45d
+¤^ 0xa45e
+¤_ 0xa45f
+¤` 0xa460
+¤a 0xa461
+¤b 0xa462
+¤c 0xa463
+¤d 0xa464
+¤e 0xa465
+¤f 0xa466
+¤g 0xa467
+¤h 0xa468
+¤i 0xa469
+¤j 0xa46a
+¤k 0xa46b
+¤l 0xa46c
+¤m 0xa46d
+¤n 0xa46e
+¤o 0xa46f
+¤p 0xa470
+¤q 0xa471
+¤r 0xa472
+¤s 0xa473
+¤t 0xa474
+¤u 0xa475
+¤v 0xa476
+¤w 0xa477
+¤x 0xa478
+¤y 0xa479
+¤z 0xa47a
+¤{ 0xa47b
+¤| 0xa47c
+¤} 0xa47d
+¤~ 0xa47e
+¤¡ 0xa4a1
+¤¢ 0xa4a2
+¤£ 0xa4a3
+¤¤ 0xa4a4
+¤¥ 0xa4a5
+¤¦ 0xa4a6
+¤§ 0xa4a7
+¤¨ 0xa4a8
+¤© 0xa4a9
+¤ª 0xa4aa
+¤« 0xa4ab
+¤¬ 0xa4ac
+¤­ 0xa4ad
+¤® 0xa4ae
+¤¯ 0xa4af
+¤° 0xa4b0
+¤± 0xa4b1
+¤² 0xa4b2
+¤³ 0xa4b3
+¤´ 0xa4b4
+¤µ 0xa4b5
+¤¶ 0xa4b6
+¤· 0xa4b7
+¤¸ 0xa4b8
+¤¹ 0xa4b9
+¤º 0xa4ba
+¤» 0xa4bb
+¤¼ 0xa4bc
+¤½ 0xa4bd
+¤¾ 0xa4be
+¤¿ 0xa4bf
+¤À 0xa4c0
+¤Á 0xa4c1
+¤Â 0xa4c2
+¤Ã 0xa4c3
+¤Ä 0xa4c4
+¤Å 0xa4c5
+¤Æ 0xa4c6
+¤Ç 0xa4c7
+¤È 0xa4c8
+¤É 0xa4c9
+¤Ê 0xa4ca
+¤Ë 0xa4cb
+¤Ì 0xa4cc
+¤Í 0xa4cd
+¤Î 0xa4ce
+¤Ï 0xa4cf
+¤Ð 0xa4d0
+¤Ñ 0xa4d1
+¤Ò 0xa4d2
+¤Ó 0xa4d3
+¤Ô 0xa4d4
+¤Õ 0xa4d5
+¤Ö 0xa4d6
+¤× 0xa4d7
+¤Ø 0xa4d8
+¤Ù 0xa4d9
+¤Ú 0xa4da
+¤Û 0xa4db
+¤Ü 0xa4dc
+¤Ý 0xa4dd
+¤Þ 0xa4de
+¤ß 0xa4df
+¤à 0xa4e0
+¤á 0xa4e1
+¤â 0xa4e2
+¤ã 0xa4e3
+¤ä 0xa4e4
+¤å 0xa4e5
+¤æ 0xa4e6
+¤ç 0xa4e7
+¤è 0xa4e8
+¤é 0xa4e9
+¤ê 0xa4ea
+¤ë 0xa4eb
+¤ì 0xa4ec
+¤í 0xa4ed
+¤î 0xa4ee
+¤ï 0xa4ef
+¤ð 0xa4f0
+¤ñ 0xa4f1
+¤ò 0xa4f2
+¤ó 0xa4f3
+¤ô 0xa4f4
+¤õ 0xa4f5
+¤ö 0xa4f6
+¤÷ 0xa4f7
+¤ø 0xa4f8
+¤ù 0xa4f9
+¤ú 0xa4fa
+¤û 0xa4fb
+¤ü 0xa4fc
+¤ý 0xa4fd
+¤þ 0xa4fe
+¥@ 0xa540
+¥A 0xa541
+¥B 0xa542
+¥C 0xa543
+¥D 0xa544
+¥E 0xa545
+¥F 0xa546
+¥G 0xa547
+¥H 0xa548
+¥I 0xa549
+¥J 0xa54a
+¥K 0xa54b
+¥L 0xa54c
+¥M 0xa54d
+¥N 0xa54e
+¥O 0xa54f
+¥P 0xa550
+¥Q 0xa551
+¥R 0xa552
+¥S 0xa553
+¥T 0xa554
+¥U 0xa555
+¥V 0xa556
+¥W 0xa557
+¥X 0xa558
+¥Y 0xa559
+¥Z 0xa55a
+¥[ 0xa55b
+¥\ 0xa55c
+¥] 0xa55d
+¥^ 0xa55e
+¥_ 0xa55f
+¥` 0xa560
+¥a 0xa561
+¥b 0xa562
+¥c 0xa563
+¥d 0xa564
+¥e 0xa565
+¥f 0xa566
+¥g 0xa567
+¥h 0xa568
+¥i 0xa569
+¥j 0xa56a
+¥k 0xa56b
+¥l 0xa56c
+¥m 0xa56d
+¥n 0xa56e
+¥o 0xa56f
+¥p 0xa570
+¥q 0xa571
+¥r 0xa572
+¥s 0xa573
+¥t 0xa574
+¥u 0xa575
+¥v 0xa576
+¥w 0xa577
+¥x 0xa578
+¥y 0xa579
+¥z 0xa57a
+¥{ 0xa57b
+¥| 0xa57c
+¥} 0xa57d
+¥~ 0xa57e
+¥¡ 0xa5a1
+¥¢ 0xa5a2
+¥£ 0xa5a3
+¥¤ 0xa5a4
+¥¥ 0xa5a5
+¥¦ 0xa5a6
+¥§ 0xa5a7
+¥¨ 0xa5a8
+¥© 0xa5a9
+¥ª 0xa5aa
+¥« 0xa5ab
+¥¬ 0xa5ac
+¥­ 0xa5ad
+¥® 0xa5ae
+¥¯ 0xa5af
+¥° 0xa5b0
+¥± 0xa5b1
+¥² 0xa5b2
+¥³ 0xa5b3
+¥´ 0xa5b4
+¥µ 0xa5b5
+¥¶ 0xa5b6
+¥· 0xa5b7
+¥¸ 0xa5b8
+¥¹ 0xa5b9
+¥º 0xa5ba
+¥» 0xa5bb
+¥¼ 0xa5bc
+¥½ 0xa5bd
+¥¾ 0xa5be
+¥¿ 0xa5bf
+¥À 0xa5c0
+¥Á 0xa5c1
+¥Â 0xa5c2
+¥Ã 0xa5c3
+¥Ä 0xa5c4
+¥Å 0xa5c5
+¥Æ 0xa5c6
+¥Ç 0xa5c7
+¥È 0xa5c8
+¥É 0xa5c9
+¥Ê 0xa5ca
+¥Ë 0xa5cb
+¥Ì 0xa5cc
+¥Í 0xa5cd
+¥Î 0xa5ce
+¥Ï 0xa5cf
+¥Ð 0xa5d0
+¥Ñ 0xa5d1
+¥Ò 0xa5d2
+¥Ó 0xa5d3
+¥Ô 0xa5d4
+¥Õ 0xa5d5
+¥Ö 0xa5d6
+¥× 0xa5d7
+¥Ø 0xa5d8
+¥Ù 0xa5d9
+¥Ú 0xa5da
+¥Û 0xa5db
+¥Ü 0xa5dc
+¥Ý 0xa5dd
+¥Þ 0xa5de
+¥ß 0xa5df
+¥à 0xa5e0
+¥á 0xa5e1
+¥â 0xa5e2
+¥ã 0xa5e3
+¥ä 0xa5e4
+¥å 0xa5e5
+¥æ 0xa5e6
+¥ç 0xa5e7
+¥è 0xa5e8
+¥é 0xa5e9
+¥ê 0xa5ea
+¥ë 0xa5eb
+¥ì 0xa5ec
+¥í 0xa5ed
+¥î 0xa5ee
+¥ï 0xa5ef
+¥ð 0xa5f0
+¥ñ 0xa5f1
+¥ò 0xa5f2
+¥ó 0xa5f3
+¥ô 0xa5f4
+¥õ 0xa5f5
+¥ö 0xa5f6
+¥÷ 0xa5f7
+¥ø 0xa5f8
+¥ù 0xa5f9
+¥ú 0xa5fa
+¥û 0xa5fb
+¥ü 0xa5fc
+¥ý 0xa5fd
+¥þ 0xa5fe
+¦@ 0xa640
+¦A 0xa641
+¦B 0xa642
+¦C 0xa643
+¦D 0xa644
+¦E 0xa645
+¦F 0xa646
+¦G 0xa647
+¦H 0xa648
+¦I 0xa649
+¦J 0xa64a
+¦K 0xa64b
+¦L 0xa64c
+¦M 0xa64d
+¦N 0xa64e
+¦O 0xa64f
+¦P 0xa650
+¦Q 0xa651
+¦R 0xa652
+¦S 0xa653
+¦T 0xa654
+¦U 0xa655
+¦V 0xa656
+¦W 0xa657
+¦X 0xa658
+¦Y 0xa659
+¦Z 0xa65a
+¦[ 0xa65b
+¦\ 0xa65c
+¦] 0xa65d
+¦^ 0xa65e
+¦_ 0xa65f
+¦` 0xa660
+¦a 0xa661
+¦b 0xa662
+¦c 0xa663
+¦d 0xa664
+¦e 0xa665
+¦f 0xa666
+¦g 0xa667
+¦h 0xa668
+¦i 0xa669
+¦j 0xa66a
+¦k 0xa66b
+¦l 0xa66c
+¦m 0xa66d
+¦n 0xa66e
+¦o 0xa66f
+¦p 0xa670
+¦q 0xa671
+¦r 0xa672
+¦s 0xa673
+¦t 0xa674
+¦u 0xa675
+¦v 0xa676
+¦w 0xa677
+¦x 0xa678
+¦y 0xa679
+¦z 0xa67a
+¦{ 0xa67b
+¦| 0xa67c
+¦} 0xa67d
+¦~ 0xa67e
+¦¡ 0xa6a1
+¦¢ 0xa6a2
+¦£ 0xa6a3
+¦¤ 0xa6a4
+¦¥ 0xa6a5
+¦¦ 0xa6a6
+¦§ 0xa6a7
+¦¨ 0xa6a8
+¦© 0xa6a9
+¦ª 0xa6aa
+¦« 0xa6ab
+¦¬ 0xa6ac
+¦­ 0xa6ad
+¦® 0xa6ae
+¦¯ 0xa6af
+¦° 0xa6b0
+¦± 0xa6b1
+¦² 0xa6b2
+¦³ 0xa6b3
+¦´ 0xa6b4
+¦µ 0xa6b5
+¦¶ 0xa6b6
+¦· 0xa6b7
+¦¸ 0xa6b8
+¦¹ 0xa6b9
+¦º 0xa6ba
+¦» 0xa6bb
+¦¼ 0xa6bc
+¦½ 0xa6bd
+¦¾ 0xa6be
+¦¿ 0xa6bf
+¦À 0xa6c0
+¦Á 0xa6c1
+¦Â 0xa6c2
+¦Ã 0xa6c3
+¦Ä 0xa6c4
+¦Å 0xa6c5
+¦Æ 0xa6c6
+¦Ç 0xa6c7
+¦È 0xa6c8
+¦É 0xa6c9
+¦Ê 0xa6ca
+¦Ë 0xa6cb
+¦Ì 0xa6cc
+¦Í 0xa6cd
+¦Î 0xa6ce
+¦Ï 0xa6cf
+¦Ð 0xa6d0
+¦Ñ 0xa6d1
+¦Ò 0xa6d2
+¦Ó 0xa6d3
+¦Ô 0xa6d4
+¦Õ 0xa6d5
+¦Ö 0xa6d6
+¦× 0xa6d7
+¦Ø 0xa6d8
+¦Ù 0xa6d9
+¦Ú 0xa6da
+¦Û 0xa6db
+¦Ü 0xa6dc
+¦Ý 0xa6dd
+¦Þ 0xa6de
+¦ß 0xa6df
+¦à 0xa6e0
+¦á 0xa6e1
+¦â 0xa6e2
+¦ã 0xa6e3
+¦ä 0xa6e4
+¦å 0xa6e5
+¦æ 0xa6e6
+¦ç 0xa6e7
+¦è 0xa6e8
+¦é 0xa6e9
+¦ê 0xa6ea
+¦ë 0xa6eb
+¦ì 0xa6ec
+¦í 0xa6ed
+¦î 0xa6ee
+¦ï 0xa6ef
+¦ð 0xa6f0
+¦ñ 0xa6f1
+¦ò 0xa6f2
+¦ó 0xa6f3
+¦ô 0xa6f4
+¦õ 0xa6f5
+¦ö 0xa6f6
+¦÷ 0xa6f7
+¦ø 0xa6f8
+¦ù 0xa6f9
+¦ú 0xa6fa
+¦û 0xa6fb
+¦ü 0xa6fc
+¦ý 0xa6fd
+¦þ 0xa6fe
+§@ 0xa740
+§A 0xa741
+§B 0xa742
+§C 0xa743
+§D 0xa744
+§E 0xa745
+§F 0xa746
+§G 0xa747
+§H 0xa748
+§I 0xa749
+§J 0xa74a
+§K 0xa74b
+§L 0xa74c
+§M 0xa74d
+§N 0xa74e
+§O 0xa74f
+§P 0xa750
+§Q 0xa751
+§R 0xa752
+§S 0xa753
+§T 0xa754
+§U 0xa755
+§V 0xa756
+§W 0xa757
+§X 0xa758
+§Y 0xa759
+§Z 0xa75a
+§[ 0xa75b
+§\ 0xa75c
+§] 0xa75d
+§^ 0xa75e
+§_ 0xa75f
+§` 0xa760
+§a 0xa761
+§b 0xa762
+§c 0xa763
+§d 0xa764
+§e 0xa765
+§f 0xa766
+§g 0xa767
+§h 0xa768
+§i 0xa769
+§j 0xa76a
+§k 0xa76b
+§l 0xa76c
+§m 0xa76d
+§n 0xa76e
+§o 0xa76f
+§p 0xa770
+§q 0xa771
+§r 0xa772
+§s 0xa773
+§t 0xa774
+§u 0xa775
+§v 0xa776
+§w 0xa777
+§x 0xa778
+§y 0xa779
+§z 0xa77a
+§{ 0xa77b
+§| 0xa77c
+§} 0xa77d
+§~ 0xa77e
+§¡ 0xa7a1
+§¢ 0xa7a2
+§£ 0xa7a3
+§¤ 0xa7a4
+§¥ 0xa7a5
+§¦ 0xa7a6
+§§ 0xa7a7
+§¨ 0xa7a8
+§© 0xa7a9
+§ª 0xa7aa
+§« 0xa7ab
+§¬ 0xa7ac
+§­ 0xa7ad
+§® 0xa7ae
+§¯ 0xa7af
+§° 0xa7b0
+§± 0xa7b1
+§² 0xa7b2
+§³ 0xa7b3
+§´ 0xa7b4
+§µ 0xa7b5
+§¶ 0xa7b6
+§· 0xa7b7
+§¸ 0xa7b8
+§¹ 0xa7b9
+§º 0xa7ba
+§» 0xa7bb
+§¼ 0xa7bc
+§½ 0xa7bd
+§¾ 0xa7be
+§¿ 0xa7bf
+§À 0xa7c0
+§Á 0xa7c1
+§Â 0xa7c2
+§Ã 0xa7c3
+§Ä 0xa7c4
+§Å 0xa7c5
+§Æ 0xa7c6
+§Ç 0xa7c7
+§È 0xa7c8
+§É 0xa7c9
+§Ê 0xa7ca
+§Ë 0xa7cb
+§Ì 0xa7cc
+§Í 0xa7cd
+§Î 0xa7ce
+§Ï 0xa7cf
+§Ð 0xa7d0
+§Ñ 0xa7d1
+§Ò 0xa7d2
+§Ó 0xa7d3
+§Ô 0xa7d4
+§Õ 0xa7d5
+§Ö 0xa7d6
+§× 0xa7d7
+§Ø 0xa7d8
+§Ù 0xa7d9
+§Ú 0xa7da
+§Û 0xa7db
+§Ü 0xa7dc
+§Ý 0xa7dd
+§Þ 0xa7de
+§ß 0xa7df
+§à 0xa7e0
+§á 0xa7e1
+§â 0xa7e2
+§ã 0xa7e3
+§ä 0xa7e4
+§å 0xa7e5
+§æ 0xa7e6
+§ç 0xa7e7
+§è 0xa7e8
+§é 0xa7e9
+§ê 0xa7ea
+§ë 0xa7eb
+§ì 0xa7ec
+§í 0xa7ed
+§î 0xa7ee
+§ï 0xa7ef
+§ð 0xa7f0
+§ñ 0xa7f1
+§ò 0xa7f2
+§ó 0xa7f3
+§ô 0xa7f4
+§õ 0xa7f5
+§ö 0xa7f6
+§÷ 0xa7f7
+§ø 0xa7f8
+§ù 0xa7f9
+§ú 0xa7fa
+§û 0xa7fb
+§ü 0xa7fc
+§ý 0xa7fd
+§þ 0xa7fe
+¨@ 0xa840
+¨A 0xa841
+¨B 0xa842
+¨C 0xa843
+¨D 0xa844
+¨E 0xa845
+¨F 0xa846
+¨G 0xa847
+¨H 0xa848
+¨I 0xa849
+¨J 0xa84a
+¨K 0xa84b
+¨L 0xa84c
+¨M 0xa84d
+¨N 0xa84e
+¨O 0xa84f
+¨P 0xa850
+¨Q 0xa851
+¨R 0xa852
+¨S 0xa853
+¨T 0xa854
+¨U 0xa855
+¨V 0xa856
+¨W 0xa857
+¨X 0xa858
+¨Y 0xa859
+¨Z 0xa85a
+¨[ 0xa85b
+¨\ 0xa85c
+¨] 0xa85d
+¨^ 0xa85e
+¨_ 0xa85f
+¨` 0xa860
+¨a 0xa861
+¨b 0xa862
+¨c 0xa863
+¨d 0xa864
+¨e 0xa865
+¨f 0xa866
+¨g 0xa867
+¨h 0xa868
+¨i 0xa869
+¨j 0xa86a
+¨k 0xa86b
+¨l 0xa86c
+¨m 0xa86d
+¨n 0xa86e
+¨o 0xa86f
+¨p 0xa870
+¨q 0xa871
+¨r 0xa872
+¨s 0xa873
+¨t 0xa874
+¨u 0xa875
+¨v 0xa876
+¨w 0xa877
+¨x 0xa878
+¨y 0xa879
+¨z 0xa87a
+¨{ 0xa87b
+¨| 0xa87c
+¨} 0xa87d
+¨~ 0xa87e
+¨¡ 0xa8a1
+¨¢ 0xa8a2
+¨£ 0xa8a3
+¨¤ 0xa8a4
+¨¥ 0xa8a5
+¨¦ 0xa8a6
+¨§ 0xa8a7
+¨¨ 0xa8a8
+¨© 0xa8a9
+¨ª 0xa8aa
+¨« 0xa8ab
+¨¬ 0xa8ac
+¨­ 0xa8ad
+¨® 0xa8ae
+¨¯ 0xa8af
+¨° 0xa8b0
+¨± 0xa8b1
+¨² 0xa8b2
+¨³ 0xa8b3
+¨´ 0xa8b4
+¨µ 0xa8b5
+¨¶ 0xa8b6
+¨· 0xa8b7
+¨¸ 0xa8b8
+¨¹ 0xa8b9
+¨º 0xa8ba
+¨» 0xa8bb
+¨¼ 0xa8bc
+¨½ 0xa8bd
+¨¾ 0xa8be
+¨¿ 0xa8bf
+¨À 0xa8c0
+¨Á 0xa8c1
+¨Â 0xa8c2
+¨Ã 0xa8c3
+¨Ä 0xa8c4
+¨Å 0xa8c5
+¨Æ 0xa8c6
+¨Ç 0xa8c7
+¨È 0xa8c8
+¨É 0xa8c9
+¨Ê 0xa8ca
+¨Ë 0xa8cb
+¨Ì 0xa8cc
+¨Í 0xa8cd
+¨Î 0xa8ce
+¨Ï 0xa8cf
+¨Ð 0xa8d0
+¨Ñ 0xa8d1
+¨Ò 0xa8d2
+¨Ó 0xa8d3
+¨Ô 0xa8d4
+¨Õ 0xa8d5
+¨Ö 0xa8d6
+¨× 0xa8d7
+¨Ø 0xa8d8
+¨Ù 0xa8d9
+¨Ú 0xa8da
+¨Û 0xa8db
+¨Ü 0xa8dc
+¨Ý 0xa8dd
+¨Þ 0xa8de
+¨ß 0xa8df
+¨à 0xa8e0
+¨á 0xa8e1
+¨â 0xa8e2
+¨ã 0xa8e3
+¨ä 0xa8e4
+¨å 0xa8e5
+¨æ 0xa8e6
+¨ç 0xa8e7
+¨è 0xa8e8
+¨é 0xa8e9
+¨ê 0xa8ea
+¨ë 0xa8eb
+¨ì 0xa8ec
+¨í 0xa8ed
+¨î 0xa8ee
+¨ï 0xa8ef
+¨ð 0xa8f0
+¨ñ 0xa8f1
+¨ò 0xa8f2
+¨ó 0xa8f3
+¨ô 0xa8f4
+¨õ 0xa8f5
+¨ö 0xa8f6
+¨÷ 0xa8f7
+¨ø 0xa8f8
+¨ù 0xa8f9
+¨ú 0xa8fa
+¨û 0xa8fb
+¨ü 0xa8fc
+¨ý 0xa8fd
+¨þ 0xa8fe
+©@ 0xa940
+©A 0xa941
+©B 0xa942
+©C 0xa943
+©D 0xa944
+©E 0xa945
+©F 0xa946
+©G 0xa947
+©H 0xa948
+©I 0xa949
+©J 0xa94a
+©K 0xa94b
+©L 0xa94c
+©M 0xa94d
+©N 0xa94e
+©O 0xa94f
+©P 0xa950
+©Q 0xa951
+©R 0xa952
+©S 0xa953
+©T 0xa954
+©U 0xa955
+©V 0xa956
+©W 0xa957
+©X 0xa958
+©Y 0xa959
+©Z 0xa95a
+©[ 0xa95b
+©\ 0xa95c
+©] 0xa95d
+©^ 0xa95e
+©_ 0xa95f
+©` 0xa960
+©a 0xa961
+©b 0xa962
+©c 0xa963
+©d 0xa964
+©e 0xa965
+©f 0xa966
+©g 0xa967
+©h 0xa968
+©i 0xa969
+©j 0xa96a
+©k 0xa96b
+©l 0xa96c
+©m 0xa96d
+©n 0xa96e
+©o 0xa96f
+©p 0xa970
+©q 0xa971
+©r 0xa972
+©s 0xa973
+©t 0xa974
+©u 0xa975
+©v 0xa976
+©w 0xa977
+©x 0xa978
+©y 0xa979
+©z 0xa97a
+©{ 0xa97b
+©| 0xa97c
+©} 0xa97d
+©~ 0xa97e
+©¡ 0xa9a1
+©¢ 0xa9a2
+©£ 0xa9a3
+©¤ 0xa9a4
+©¥ 0xa9a5
+©¦ 0xa9a6
+©§ 0xa9a7
+©¨ 0xa9a8
+©© 0xa9a9
+©ª 0xa9aa
+©« 0xa9ab
+©¬ 0xa9ac
+©­ 0xa9ad
+©® 0xa9ae
+©¯ 0xa9af
+©° 0xa9b0
+©± 0xa9b1
+©² 0xa9b2
+©³ 0xa9b3
+©´ 0xa9b4
+©µ 0xa9b5
+©¶ 0xa9b6
+©· 0xa9b7
+©¸ 0xa9b8
+©¹ 0xa9b9
+©º 0xa9ba
+©» 0xa9bb
+©¼ 0xa9bc
+©½ 0xa9bd
+©¾ 0xa9be
+©¿ 0xa9bf
+©À 0xa9c0
+©Á 0xa9c1
+©Â 0xa9c2
+©Ã 0xa9c3
+©Ä 0xa9c4
+©Å 0xa9c5
+©Æ 0xa9c6
+©Ç 0xa9c7
+©È 0xa9c8
+©É 0xa9c9
+©Ê 0xa9ca
+©Ë 0xa9cb
+©Ì 0xa9cc
+©Í 0xa9cd
+©Î 0xa9ce
+©Ï 0xa9cf
+©Ð 0xa9d0
+©Ñ 0xa9d1
+©Ò 0xa9d2
+©Ó 0xa9d3
+©Ô 0xa9d4
+©Õ 0xa9d5
+©Ö 0xa9d6
+©× 0xa9d7
+©Ø 0xa9d8
+©Ù 0xa9d9
+©Ú 0xa9da
+©Û 0xa9db
+©Ü 0xa9dc
+©Ý 0xa9dd
+©Þ 0xa9de
+©ß 0xa9df
+©à 0xa9e0
+©á 0xa9e1
+©â 0xa9e2
+©ã 0xa9e3
+©ä 0xa9e4
+©å 0xa9e5
+©æ 0xa9e6
+©ç 0xa9e7
+©è 0xa9e8
+©é 0xa9e9
+©ê 0xa9ea
+©ë 0xa9eb
+©ì 0xa9ec
+©í 0xa9ed
+©î 0xa9ee
+©ï 0xa9ef
+©ð 0xa9f0
+©ñ 0xa9f1
+©ò 0xa9f2
+©ó 0xa9f3
+©ô 0xa9f4
+©õ 0xa9f5
+©ö 0xa9f6
+©÷ 0xa9f7
+©ø 0xa9f8
+©ù 0xa9f9
+©ú 0xa9fa
+©û 0xa9fb
+©ü 0xa9fc
+©ý 0xa9fd
+©þ 0xa9fe
+ª@ 0xaa40
+ªA 0xaa41
+ªB 0xaa42
+ªC 0xaa43
+ªD 0xaa44
+ªE 0xaa45
+ªF 0xaa46
+ªG 0xaa47
+ªH 0xaa48
+ªI 0xaa49
+ªJ 0xaa4a
+ªK 0xaa4b
+ªL 0xaa4c
+ªM 0xaa4d
+ªN 0xaa4e
+ªO 0xaa4f
+ªP 0xaa50
+ªQ 0xaa51
+ªR 0xaa52
+ªS 0xaa53
+ªT 0xaa54
+ªU 0xaa55
+ªV 0xaa56
+ªW 0xaa57
+ªX 0xaa58
+ªY 0xaa59
+ªZ 0xaa5a
+ª[ 0xaa5b
+ª\ 0xaa5c
+ª] 0xaa5d
+ª^ 0xaa5e
+ª_ 0xaa5f
+ª` 0xaa60
+ªa 0xaa61
+ªb 0xaa62
+ªc 0xaa63
+ªd 0xaa64
+ªe 0xaa65
+ªf 0xaa66
+ªg 0xaa67
+ªh 0xaa68
+ªi 0xaa69
+ªj 0xaa6a
+ªk 0xaa6b
+ªl 0xaa6c
+ªm 0xaa6d
+ªn 0xaa6e
+ªo 0xaa6f
+ªp 0xaa70
+ªq 0xaa71
+ªr 0xaa72
+ªs 0xaa73
+ªt 0xaa74
+ªu 0xaa75
+ªv 0xaa76
+ªw 0xaa77
+ªx 0xaa78
+ªy 0xaa79
+ªz 0xaa7a
+ª{ 0xaa7b
+ª| 0xaa7c
+ª} 0xaa7d
+ª~ 0xaa7e
+ª¡ 0xaaa1
+ª¢ 0xaaa2
+ª£ 0xaaa3
+ª¤ 0xaaa4
+ª¥ 0xaaa5
+ª¦ 0xaaa6
+ª§ 0xaaa7
+ª¨ 0xaaa8
+ª© 0xaaa9
+ªª 0xaaaa
+ª« 0xaaab
+ª¬ 0xaaac
+ª­ 0xaaad
+ª® 0xaaae
+ª¯ 0xaaaf
+ª° 0xaab0
+ª± 0xaab1
+ª² 0xaab2
+ª³ 0xaab3
+ª´ 0xaab4
+ªµ 0xaab5
+ª¶ 0xaab6
+ª· 0xaab7
+ª¸ 0xaab8
+ª¹ 0xaab9
+ªº 0xaaba
+ª» 0xaabb
+ª¼ 0xaabc
+ª½ 0xaabd
+ª¾ 0xaabe
+ª¿ 0xaabf
+ªÀ 0xaac0
+ªÁ 0xaac1
+ªÂ 0xaac2
+ªÃ 0xaac3
+ªÄ 0xaac4
+ªÅ 0xaac5
+ªÆ 0xaac6
+ªÇ 0xaac7
+ªÈ 0xaac8
+ªÉ 0xaac9
+ªÊ 0xaaca
+ªË 0xaacb
+ªÌ 0xaacc
+ªÍ 0xaacd
+ªÎ 0xaace
+ªÏ 0xaacf
+ªÐ 0xaad0
+ªÑ 0xaad1
+ªÒ 0xaad2
+ªÓ 0xaad3
+ªÔ 0xaad4
+ªÕ 0xaad5
+ªÖ 0xaad6
+ª× 0xaad7
+ªØ 0xaad8
+ªÙ 0xaad9
+ªÚ 0xaada
+ªÛ 0xaadb
+ªÜ 0xaadc
+ªÝ 0xaadd
+ªÞ 0xaade
+ªß 0xaadf
+ªà 0xaae0
+ªá 0xaae1
+ªâ 0xaae2
+ªã 0xaae3
+ªä 0xaae4
+ªå 0xaae5
+ªæ 0xaae6
+ªç 0xaae7
+ªè 0xaae8
+ªé 0xaae9
+ªê 0xaaea
+ªë 0xaaeb
+ªì 0xaaec
+ªí 0xaaed
+ªî 0xaaee
+ªï 0xaaef
+ªð 0xaaf0
+ªñ 0xaaf1
+ªò 0xaaf2
+ªó 0xaaf3
+ªô 0xaaf4
+ªõ 0xaaf5
+ªö 0xaaf6
+ª÷ 0xaaf7
+ªø 0xaaf8
+ªù 0xaaf9
+ªú 0xaafa
+ªû 0xaafb
+ªü 0xaafc
+ªý 0xaafd
+ªþ 0xaafe
+«@ 0xab40
+«A 0xab41
+«B 0xab42
+«C 0xab43
+«D 0xab44
+«E 0xab45
+«F 0xab46
+«G 0xab47
+«H 0xab48
+«I 0xab49
+«J 0xab4a
+«K 0xab4b
+«L 0xab4c
+«M 0xab4d
+«N 0xab4e
+«O 0xab4f
+«P 0xab50
+«Q 0xab51
+«R 0xab52
+«S 0xab53
+«T 0xab54
+«U 0xab55
+«V 0xab56
+«W 0xab57
+«X 0xab58
+«Y 0xab59
+«Z 0xab5a
+«[ 0xab5b
+«\ 0xab5c
+«] 0xab5d
+«^ 0xab5e
+«_ 0xab5f
+«` 0xab60
+«a 0xab61
+«b 0xab62
+«c 0xab63
+«d 0xab64
+«e 0xab65
+«f 0xab66
+«g 0xab67
+«h 0xab68
+«i 0xab69
+«j 0xab6a
+«k 0xab6b
+«l 0xab6c
+«m 0xab6d
+«n 0xab6e
+«o 0xab6f
+«p 0xab70
+«q 0xab71
+«r 0xab72
+«s 0xab73
+«t 0xab74
+«u 0xab75
+«v 0xab76
+«w 0xab77
+«x 0xab78
+«y 0xab79
+«z 0xab7a
+«{ 0xab7b
+«| 0xab7c
+«} 0xab7d
+«~ 0xab7e
+«¡ 0xaba1
+«¢ 0xaba2
+«£ 0xaba3
+«¤ 0xaba4
+«¥ 0xaba5
+«¦ 0xaba6
+Ǥ 0xaba7
+Ǭ 0xaba8
+«© 0xaba9
+ǻ 0xabaa
+«« 0xabab
+«¬ 0xabac
+«­ 0xabad
+«® 0xabae
+«¯ 0xabaf
+«° 0xabb0
+«± 0xabb1
+«² 0xabb2
+«³ 0xabb3
+«´ 0xabb4
+«µ 0xabb5
+Ǧ 0xabb6
+«· 0xabb7
+«¸ 0xabb8
+«¹ 0xabb9
+Ǽ 0xabba
+«» 0xabbb
+«¼ 0xabbc
+«½ 0xabbd
+«¾ 0xabbe
+«¿ 0xabbf
+«À 0xabc0
+«Á 0xabc1
+«Â 0xabc2
+«Ã 0xabc3
+«Ä 0xabc4
+«Å 0xabc5
+«Æ 0xabc6
+«Ç 0xabc7
+«È 0xabc8
+«É 0xabc9
+«Ê 0xabca
+«Ë 0xabcb
+«Ì 0xabcc
+«Í 0xabcd
+«Î 0xabce
+«Ï 0xabcf
+«Ð 0xabd0
+«Ñ 0xabd1
+«Ò 0xabd2
+«Ó 0xabd3
+«Ô 0xabd4
+«Õ 0xabd5
+«Ö 0xabd6
+«× 0xabd7
+«Ø 0xabd8
+«Ù 0xabd9
+«Ú 0xabda
+«Û 0xabdb
+«Ü 0xabdc
+«Ý 0xabdd
+«Þ 0xabde
+«ß 0xabdf
+«à 0xabe0
+«á 0xabe1
+«â 0xabe2
+«ã 0xabe3
+«ä 0xabe4
+«å 0xabe5
+«æ 0xabe6
+«ç 0xabe7
+«è 0xabe8
+«é 0xabe9
+«ê 0xabea
+«ë 0xabeb
+«ì 0xabec
+«í 0xabed
+«î 0xabee
+«ï 0xabef
+«ð 0xabf0
+«ñ 0xabf1
+«ò 0xabf2
+«ó 0xabf3
+«ô 0xabf4
+«õ 0xabf5
+«ö 0xabf6
+«÷ 0xabf7
+«ø 0xabf8
+«ù 0xabf9
+«ú 0xabfa
+«û 0xabfb
+«ü 0xabfc
+«ý 0xabfd
+«þ 0xabfe
+¬@ 0xac40
+¬A 0xac41
+¬B 0xac42
+¬C 0xac43
+¬D 0xac44
+¬E 0xac45
+¬F 0xac46
+¬G 0xac47
+¬H 0xac48
+¬I 0xac49
+¬J 0xac4a
+¬K 0xac4b
+¬L 0xac4c
+¬M 0xac4d
+¬N 0xac4e
+¬O 0xac4f
+¬P 0xac50
+¬Q 0xac51
+¬R 0xac52
+¬S 0xac53
+¬T 0xac54
+¬U 0xac55
+¬V 0xac56
+¬W 0xac57
+¬X 0xac58
+¬Y 0xac59
+¬Z 0xac5a
+¬[ 0xac5b
+¬\ 0xac5c
+¬] 0xac5d
+¬^ 0xac5e
+¬_ 0xac5f
+¬` 0xac60
+¬a 0xac61
+¬b 0xac62
+¬c 0xac63
+¬d 0xac64
+¬e 0xac65
+¬f 0xac66
+¬g 0xac67
+¬h 0xac68
+¬i 0xac69
+¬j 0xac6a
+¬k 0xac6b
+¬l 0xac6c
+¬m 0xac6d
+¬n 0xac6e
+¬o 0xac6f
+¬p 0xac70
+¬q 0xac71
+¬r 0xac72
+¬s 0xac73
+¬t 0xac74
+¬u 0xac75
+¬v 0xac76
+¬w 0xac77
+¬x 0xac78
+¬y 0xac79
+¬z 0xac7a
+¬{ 0xac7b
+¬| 0xac7c
+¬} 0xac7d
+¬~ 0xac7e
+¬¡ 0xaca1
+¢ 0xaca2
+£ 0xaca3
+¬¤ 0xaca4
+´ 0xaca5
+¬¦ 0xaca6
+¤ 0xaca7
+¬ 0xaca8
+© 0xaca9
+» 0xacaa
+¬« 0xacab
+¬¬ 0xacac
+¬­ 0xacad
+¨ 0xacae
+¬¯ 0xacaf
+¬° 0xacb0
+± 0xacb1
+¬² 0xacb2
+¬³ 0xacb3
+¬´ 0xacb4
+µ 0xacb5
+¦ 0xacb6
+¬· 0xacb7
+¬¸ 0xacb8
+¬¹ 0xacb9
+¼ 0xacba
+¬» 0xacbb
+¬¼ 0xacbc
+¬½ 0xacbd
+¬¾ 0xacbe
+¬¿ 0xacbf
+¬À 0xacc0
+¬Á 0xacc1
+¬Â 0xacc2
+¬Ã 0xacc3
+€ 0xacc4
+ 0xacc5
+® 0xacc6
+‚ 0xacc7
+¬È 0xacc8
+ƒ 0xacc9
+¬Ê 0xacca
+¬Ë 0xaccb
+¬Ì 0xaccc
+¬Í 0xaccd
+¬Î 0xacce
+¬Ï 0xaccf
+¬Ð 0xacd0
+„ 0xacd1
+¬Ò 0xacd2
+¬Ó 0xacd3
+¬Ô 0xacd4
+¬Õ 0xacd5
+¬Ö 0xacd6
+¬× 0xacd7
+¯ 0xacd8
+¬Ù 0xacd9
+¬Ú 0xacda
+¬Û 0xacdb
+† 0xacdc
+¬Ý 0xacdd
+¬Þ 0xacde
+§ 0xacdf
+ˆ 0xace0
+‡ 0xace1
+‰ 0xace2
+‹ 0xace3
+Š 0xace4
+Π0xace5
+¾ 0xace6
+ 0xace7
+ 0xace8
+Ž 0xace9
+ 0xacea
+‘ 0xaceb
+“ 0xacec
+’ 0xaced
+” 0xacee
+• 0xacef
+¬ð 0xacf0
+– 0xacf1
+¬ò 0xacf2
+¬ó 0xacf3
+¬ô 0xacf4
+¬õ 0xacf5
+¬ö 0xacf6
+¬÷ 0xacf7
+¬ø 0xacf8
+¬ù 0xacf9
+¬ú 0xacfa
+¬û 0xacfb
+Ÿ 0xacfc
+¬ý 0xacfd
+¬þ 0xacfe
+­@ 0xad40
+­A 0xad41
+­B 0xad42
+­C 0xad43
+­D 0xad44
+­E 0xad45
+­F 0xad46
+­G 0xad47
+­H 0xad48
+­I 0xad49
+­J 0xad4a
+­K 0xad4b
+­L 0xad4c
+­M 0xad4d
+­N 0xad4e
+­O 0xad4f
+­P 0xad50
+­Q 0xad51
+­R 0xad52
+­S 0xad53
+­T 0xad54
+­U 0xad55
+­V 0xad56
+­W 0xad57
+­X 0xad58
+­Y 0xad59
+­Z 0xad5a
+­[ 0xad5b
+­\ 0xad5c
+­] 0xad5d
+­^ 0xad5e
+­_ 0xad5f
+­` 0xad60
+­a 0xad61
+­b 0xad62
+­c 0xad63
+­d 0xad64
+­e 0xad65
+­f 0xad66
+­g 0xad67
+­h 0xad68
+­i 0xad69
+­j 0xad6a
+­k 0xad6b
+­l 0xad6c
+­m 0xad6d
+­n 0xad6e
+­o 0xad6f
+­p 0xad70
+­q 0xad71
+­r 0xad72
+­s 0xad73
+­t 0xad74
+­u 0xad75
+­v 0xad76
+­w 0xad77
+­x 0xad78
+­y 0xad79
+­z 0xad7a
+­{ 0xad7b
+­| 0xad7c
+­} 0xad7d
+­~ 0xad7e
+­¡ 0xada1
+­¢ 0xada2
+­£ 0xada3
+­¤ 0xada4
+­¥ 0xada5
+­¦ 0xada6
+­§ 0xada7
+­¨ 0xada8
+­© 0xada9
+­ª 0xadaa
+­« 0xadab
+­¬ 0xadac
+­­ 0xadad
+­® 0xadae
+­¯ 0xadaf
+­° 0xadb0
+­± 0xadb1
+­² 0xadb2
+­³ 0xadb3
+­´ 0xadb4
+­µ 0xadb5
+­¶ 0xadb6
+­· 0xadb7
+­¸ 0xadb8
+­¹ 0xadb9
+­º 0xadba
+­» 0xadbb
+­¼ 0xadbc
+­½ 0xadbd
+­¾ 0xadbe
+­¿ 0xadbf
+­À 0xadc0
+­Á 0xadc1
+­Â 0xadc2
+­Ã 0xadc3
+­Ä 0xadc4
+­Å 0xadc5
+­Æ 0xadc6
+­Ç 0xadc7
+­È 0xadc8
+­É 0xadc9
+­Ê 0xadca
+­Ë 0xadcb
+­Ì 0xadcc
+­Í 0xadcd
+­Î 0xadce
+­Ï 0xadcf
+­Ð 0xadd0
+­Ñ 0xadd1
+­Ò 0xadd2
+­Ó 0xadd3
+­Ô 0xadd4
+­Õ 0xadd5
+­Ö 0xadd6
+­× 0xadd7
+­Ø 0xadd8
+­Ù 0xadd9
+­Ú 0xadda
+­Û 0xaddb
+­Ü 0xaddc
+­Ý 0xaddd
+­Þ 0xadde
+­ß 0xaddf
+­à 0xade0
+­á 0xade1
+­â 0xade2
+­ã 0xade3
+­ä 0xade4
+­å 0xade5
+­æ 0xade6
+­ç 0xade7
+­è 0xade8
+­é 0xade9
+­ê 0xadea
+­ë 0xadeb
+­ì 0xadec
+­í 0xaded
+­î 0xadee
+­ï 0xadef
+­ð 0xadf0
+­ñ 0xadf1
+­ò 0xadf2
+­ó 0xadf3
+­ô 0xadf4
+­õ 0xadf5
+­ö 0xadf6
+­÷ 0xadf7
+­ø 0xadf8
+­ù 0xadf9
+­ú 0xadfa
+­û 0xadfb
+­ü 0xadfc
+­ý 0xadfd
+­þ 0xadfe
+®@ 0xae40
+®A 0xae41
+®B 0xae42
+®C 0xae43
+®D 0xae44
+®E 0xae45
+®F 0xae46
+®G 0xae47
+®H 0xae48
+®I 0xae49
+®J 0xae4a
+®K 0xae4b
+®L 0xae4c
+®M 0xae4d
+®N 0xae4e
+®O 0xae4f
+®P 0xae50
+®Q 0xae51
+®R 0xae52
+®S 0xae53
+®T 0xae54
+®U 0xae55
+®V 0xae56
+®W 0xae57
+®X 0xae58
+®Y 0xae59
+®Z 0xae5a
+®[ 0xae5b
+®\ 0xae5c
+®] 0xae5d
+®^ 0xae5e
+®_ 0xae5f
+®` 0xae60
+®a 0xae61
+®b 0xae62
+®c 0xae63
+®d 0xae64
+®e 0xae65
+®f 0xae66
+®g 0xae67
+®h 0xae68
+®i 0xae69
+®j 0xae6a
+®k 0xae6b
+®l 0xae6c
+®m 0xae6d
+®n 0xae6e
+®o 0xae6f
+®p 0xae70
+®q 0xae71
+®r 0xae72
+®s 0xae73
+®t 0xae74
+®u 0xae75
+®v 0xae76
+®w 0xae77
+®x 0xae78
+®y 0xae79
+®z 0xae7a
+®{ 0xae7b
+®| 0xae7c
+®} 0xae7d
+®~ 0xae7e
+®¡ 0xaea1
+®¢ 0xaea2
+®£ 0xaea3
+®¤ 0xaea4
+®¥ 0xaea5
+®¦ 0xaea6
+®§ 0xaea7
+®¨ 0xaea8
+®© 0xaea9
+®ª 0xaeaa
+®« 0xaeab
+®¬ 0xaeac
+®­ 0xaead
+®® 0xaeae
+®¯ 0xaeaf
+®° 0xaeb0
+®± 0xaeb1
+®² 0xaeb2
+®³ 0xaeb3
+®´ 0xaeb4
+®µ 0xaeb5
+®¶ 0xaeb6
+®· 0xaeb7
+®¸ 0xaeb8
+®¹ 0xaeb9
+®º 0xaeba
+®» 0xaebb
+®¼ 0xaebc
+®½ 0xaebd
+®¾ 0xaebe
+®¿ 0xaebf
+®À 0xaec0
+®Á 0xaec1
+®Â 0xaec2
+®Ã 0xaec3
+®Ä 0xaec4
+®Å 0xaec5
+®Æ 0xaec6
+®Ç 0xaec7
+®È 0xaec8
+®É 0xaec9
+®Ê 0xaeca
+®Ë 0xaecb
+®Ì 0xaecc
+®Í 0xaecd
+®Î 0xaece
+®Ï 0xaecf
+®Ð 0xaed0
+®Ñ 0xaed1
+®Ò 0xaed2
+®Ó 0xaed3
+®Ô 0xaed4
+®Õ 0xaed5
+®Ö 0xaed6
+®× 0xaed7
+®Ø 0xaed8
+®Ù 0xaed9
+®Ú 0xaeda
+®Û 0xaedb
+®Ü 0xaedc
+®Ý 0xaedd
+®Þ 0xaede
+®ß 0xaedf
+®à 0xaee0
+®á 0xaee1
+®â 0xaee2
+®ã 0xaee3
+®ä 0xaee4
+®å 0xaee5
+®æ 0xaee6
+®ç 0xaee7
+®è 0xaee8
+®é 0xaee9
+®ê 0xaeea
+®ë 0xaeeb
+®ì 0xaeec
+®í 0xaeed
+®î 0xaeee
+®ï 0xaeef
+®ð 0xaef0
+®ñ 0xaef1
+®ò 0xaef2
+®ó 0xaef3
+®ô 0xaef4
+®õ 0xaef5
+®ö 0xaef6
+®÷ 0xaef7
+®ø 0xaef8
+®ù 0xaef9
+®ú 0xaefa
+®û 0xaefb
+®ü 0xaefc
+®ý 0xaefd
+®þ 0xaefe
+¯@ 0xaf40
+¯A 0xaf41
+¯B 0xaf42
+¯C 0xaf43
+¯D 0xaf44
+¯E 0xaf45
+¯F 0xaf46
+¯G 0xaf47
+¯H 0xaf48
+¯I 0xaf49
+¯J 0xaf4a
+¯K 0xaf4b
+¯L 0xaf4c
+¯M 0xaf4d
+¯N 0xaf4e
+¯O 0xaf4f
+¯P 0xaf50
+¯Q 0xaf51
+¯R 0xaf52
+¯S 0xaf53
+¯T 0xaf54
+¯U 0xaf55
+¯V 0xaf56
+¯W 0xaf57
+¯X 0xaf58
+¯Y 0xaf59
+¯Z 0xaf5a
+¯[ 0xaf5b
+¯\ 0xaf5c
+¯] 0xaf5d
+¯^ 0xaf5e
+¯_ 0xaf5f
+¯` 0xaf60
+¯a 0xaf61
+¯b 0xaf62
+¯c 0xaf63
+¯d 0xaf64
+¯e 0xaf65
+¯f 0xaf66
+¯g 0xaf67
+¯h 0xaf68
+¯i 0xaf69
+¯j 0xaf6a
+¯k 0xaf6b
+¯l 0xaf6c
+¯m 0xaf6d
+¯n 0xaf6e
+¯o 0xaf6f
+¯p 0xaf70
+¯q 0xaf71
+¯r 0xaf72
+¯s 0xaf73
+¯t 0xaf74
+¯u 0xaf75
+¯v 0xaf76
+¯w 0xaf77
+¯x 0xaf78
+¯y 0xaf79
+¯z 0xaf7a
+¯{ 0xaf7b
+¯| 0xaf7c
+¯} 0xaf7d
+¯~ 0xaf7e
+¯¡ 0xafa1
+¯¢ 0xafa2
+¯£ 0xafa3
+¯¤ 0xafa4
+¯¥ 0xafa5
+¯¦ 0xafa6
+¯§ 0xafa7
+¯¨ 0xafa8
+¯© 0xafa9
+¯ª 0xafaa
+¯« 0xafab
+¯¬ 0xafac
+¯­ 0xafad
+¯® 0xafae
+¯¯ 0xafaf
+¯° 0xafb0
+¯± 0xafb1
+¯² 0xafb2
+¯³ 0xafb3
+¯´ 0xafb4
+¯µ 0xafb5
+¯¶ 0xafb6
+¯· 0xafb7
+¯¸ 0xafb8
+¯¹ 0xafb9
+¯º 0xafba
+¯» 0xafbb
+¯¼ 0xafbc
+¯½ 0xafbd
+¯¾ 0xafbe
+¯¿ 0xafbf
+¯À 0xafc0
+¯Á 0xafc1
+¯Â 0xafc2
+¯Ã 0xafc3
+¯Ä 0xafc4
+¯Å 0xafc5
+¯Æ 0xafc6
+¯Ç 0xafc7
+¯È 0xafc8
+¯É 0xafc9
+¯Ê 0xafca
+¯Ë 0xafcb
+¯Ì 0xafcc
+¯Í 0xafcd
+¯Î 0xafce
+¯Ï 0xafcf
+¯Ð 0xafd0
+¯Ñ 0xafd1
+¯Ò 0xafd2
+¯Ó 0xafd3
+¯Ô 0xafd4
+¯Õ 0xafd5
+¯Ö 0xafd6
+¯× 0xafd7
+¯Ø 0xafd8
+¯Ù 0xafd9
+¯Ú 0xafda
+¯Û 0xafdb
+¯Ü 0xafdc
+¯Ý 0xafdd
+¯Þ 0xafde
+¯ß 0xafdf
+¯à 0xafe0
+¯á 0xafe1
+¯â 0xafe2
+¯ã 0xafe3
+¯ä 0xafe4
+¯å 0xafe5
+¯æ 0xafe6
+¯ç 0xafe7
+¯è 0xafe8
+¯é 0xafe9
+¯ê 0xafea
+¯ë 0xafeb
+¯ì 0xafec
+¯í 0xafed
+¯î 0xafee
+¯ï 0xafef
+¯ð 0xaff0
+¯ñ 0xaff1
+¯ò 0xaff2
+¯ó 0xaff3
+¯ô 0xaff4
+¯õ 0xaff5
+¯ö 0xaff6
+¯÷ 0xaff7
+¯ø 0xaff8
+¯ù 0xaff9
+¯ú 0xaffa
+¯û 0xaffb
+¯ü 0xaffc
+¯ý 0xaffd
+¯þ 0xaffe
+°@ 0xb040
+°A 0xb041
+°B 0xb042
+°C 0xb043
+°D 0xb044
+°E 0xb045
+°F 0xb046
+°G 0xb047
+°H 0xb048
+°I 0xb049
+°J 0xb04a
+°K 0xb04b
+°L 0xb04c
+°M 0xb04d
+°N 0xb04e
+°O 0xb04f
+°P 0xb050
+°Q 0xb051
+°R 0xb052
+°S 0xb053
+°T 0xb054
+°U 0xb055
+°V 0xb056
+°W 0xb057
+°X 0xb058
+°Y 0xb059
+°Z 0xb05a
+°[ 0xb05b
+°\ 0xb05c
+°] 0xb05d
+°^ 0xb05e
+°_ 0xb05f
+°` 0xb060
+°a 0xb061
+°b 0xb062
+°c 0xb063
+°d 0xb064
+°e 0xb065
+°f 0xb066
+°g 0xb067
+°h 0xb068
+°i 0xb069
+°j 0xb06a
+°k 0xb06b
+°l 0xb06c
+°m 0xb06d
+°n 0xb06e
+°o 0xb06f
+°p 0xb070
+°q 0xb071
+°r 0xb072
+°s 0xb073
+°t 0xb074
+°u 0xb075
+°v 0xb076
+°w 0xb077
+°x 0xb078
+°y 0xb079
+°z 0xb07a
+°{ 0xb07b
+°| 0xb07c
+°} 0xb07d
+°~ 0xb07e
+°¡ 0xb0a1
+°¢ 0xb0a2
+°£ 0xb0a3
+°¤ 0xb0a4
+°¥ 0xb0a5
+°¦ 0xb0a6
+°§ 0xb0a7
+°¨ 0xb0a8
+°© 0xb0a9
+°ª 0xb0aa
+°« 0xb0ab
+°¬ 0xb0ac
+°­ 0xb0ad
+°® 0xb0ae
+°¯ 0xb0af
+°° 0xb0b0
+°± 0xb0b1
+°² 0xb0b2
+°³ 0xb0b3
+°´ 0xb0b4
+°µ 0xb0b5
+°¶ 0xb0b6
+°· 0xb0b7
+°¸ 0xb0b8
+°¹ 0xb0b9
+°º 0xb0ba
+°» 0xb0bb
+°¼ 0xb0bc
+°½ 0xb0bd
+°¾ 0xb0be
+°¿ 0xb0bf
+°À 0xb0c0
+°Á 0xb0c1
+°Â 0xb0c2
+°Ã 0xb0c3
+°Ä 0xb0c4
+°Å 0xb0c5
+°Æ 0xb0c6
+°Ç 0xb0c7
+°È 0xb0c8
+°É 0xb0c9
+°Ê 0xb0ca
+°Ë 0xb0cb
+°Ì 0xb0cc
+°Í 0xb0cd
+°Î 0xb0ce
+°Ï 0xb0cf
+°Ð 0xb0d0
+°Ñ 0xb0d1
+°Ò 0xb0d2
+°Ó 0xb0d3
+°Ô 0xb0d4
+°Õ 0xb0d5
+°Ö 0xb0d6
+°× 0xb0d7
+°Ø 0xb0d8
+°Ù 0xb0d9
+°Ú 0xb0da
+°Û 0xb0db
+°Ü 0xb0dc
+°Ý 0xb0dd
+°Þ 0xb0de
+°ß 0xb0df
+°à 0xb0e0
+°á 0xb0e1
+°â 0xb0e2
+°ã 0xb0e3
+°ä 0xb0e4
+°å 0xb0e5
+°æ 0xb0e6
+°ç 0xb0e7
+°è 0xb0e8
+°é 0xb0e9
+°ê 0xb0ea
+°ë 0xb0eb
+°ì 0xb0ec
+°í 0xb0ed
+°î 0xb0ee
+°ï 0xb0ef
+°ð 0xb0f0
+°ñ 0xb0f1
+°ò 0xb0f2
+°ó 0xb0f3
+°ô 0xb0f4
+°õ 0xb0f5
+°ö 0xb0f6
+°÷ 0xb0f7
+°ø 0xb0f8
+°ù 0xb0f9
+°ú 0xb0fa
+°û 0xb0fb
+°ü 0xb0fc
+°ý 0xb0fd
+°þ 0xb0fe
+±@ 0xb140
+±A 0xb141
+±B 0xb142
+±C 0xb143
+±D 0xb144
+±E 0xb145
+±F 0xb146
+±G 0xb147
+±H 0xb148
+±I 0xb149
+±J 0xb14a
+±K 0xb14b
+±L 0xb14c
+±M 0xb14d
+±N 0xb14e
+±O 0xb14f
+±P 0xb150
+±Q 0xb151
+±R 0xb152
+±S 0xb153
+±T 0xb154
+±U 0xb155
+±V 0xb156
+±W 0xb157
+±X 0xb158
+±Y 0xb159
+±Z 0xb15a
+±[ 0xb15b
+±\ 0xb15c
+±] 0xb15d
+±^ 0xb15e
+±_ 0xb15f
+±` 0xb160
+±a 0xb161
+±b 0xb162
+±c 0xb163
+±d 0xb164
+±e 0xb165
+±f 0xb166
+±g 0xb167
+±h 0xb168
+±i 0xb169
+±j 0xb16a
+±k 0xb16b
+±l 0xb16c
+±m 0xb16d
+±n 0xb16e
+±o 0xb16f
+±p 0xb170
+±q 0xb171
+±r 0xb172
+±s 0xb173
+±t 0xb174
+±u 0xb175
+±v 0xb176
+±w 0xb177
+±x 0xb178
+±y 0xb179
+±z 0xb17a
+±{ 0xb17b
+±| 0xb17c
+±} 0xb17d
+±~ 0xb17e
+±¡ 0xb1a1
+±¢ 0xb1a2
+±£ 0xb1a3
+±¤ 0xb1a4
+±¥ 0xb1a5
+±¦ 0xb1a6
+±§ 0xb1a7
+±¨ 0xb1a8
+±© 0xb1a9
+±ª 0xb1aa
+±« 0xb1ab
+±¬ 0xb1ac
+±­ 0xb1ad
+±® 0xb1ae
+±¯ 0xb1af
+±° 0xb1b0
+±± 0xb1b1
+±² 0xb1b2
+±³ 0xb1b3
+±´ 0xb1b4
+±µ 0xb1b5
+±¶ 0xb1b6
+±· 0xb1b7
+±¸ 0xb1b8
+±¹ 0xb1b9
+±º 0xb1ba
+±» 0xb1bb
+±¼ 0xb1bc
+±½ 0xb1bd
+±¾ 0xb1be
+±¿ 0xb1bf
+±À 0xb1c0
+±Á 0xb1c1
+±Â 0xb1c2
+±Ã 0xb1c3
+±Ä 0xb1c4
+±Å 0xb1c5
+±Æ 0xb1c6
+±Ç 0xb1c7
+±È 0xb1c8
+±É 0xb1c9
+±Ê 0xb1ca
+±Ë 0xb1cb
+±Ì 0xb1cc
+±Í 0xb1cd
+±Î 0xb1ce
+±Ï 0xb1cf
+±Ð 0xb1d0
+±Ñ 0xb1d1
+±Ò 0xb1d2
+±Ó 0xb1d3
+±Ô 0xb1d4
+±Õ 0xb1d5
+±Ö 0xb1d6
+±× 0xb1d7
+±Ø 0xb1d8
+±Ù 0xb1d9
+±Ú 0xb1da
+±Û 0xb1db
+±Ü 0xb1dc
+±Ý 0xb1dd
+±Þ 0xb1de
+±ß 0xb1df
+±à 0xb1e0
+±á 0xb1e1
+±â 0xb1e2
+±ã 0xb1e3
+±ä 0xb1e4
+±å 0xb1e5
+±æ 0xb1e6
+±ç 0xb1e7
+±è 0xb1e8
+±é 0xb1e9
+±ê 0xb1ea
+±ë 0xb1eb
+±ì 0xb1ec
+±í 0xb1ed
+±î 0xb1ee
+±ï 0xb1ef
+±ð 0xb1f0
+±ñ 0xb1f1
+±ò 0xb1f2
+±ó 0xb1f3
+±ô 0xb1f4
+±õ 0xb1f5
+±ö 0xb1f6
+±÷ 0xb1f7
+±ø 0xb1f8
+±ù 0xb1f9
+±ú 0xb1fa
+±û 0xb1fb
+±ü 0xb1fc
+±ý 0xb1fd
+±þ 0xb1fe
+²@ 0xb240
+²A 0xb241
+²B 0xb242
+²C 0xb243
+²D 0xb244
+²E 0xb245
+²F 0xb246
+²G 0xb247
+²H 0xb248
+²I 0xb249
+²J 0xb24a
+²K 0xb24b
+²L 0xb24c
+²M 0xb24d
+²N 0xb24e
+²O 0xb24f
+²P 0xb250
+²Q 0xb251
+²R 0xb252
+²S 0xb253
+²T 0xb254
+²U 0xb255
+²V 0xb256
+²W 0xb257
+²X 0xb258
+²Y 0xb259
+²Z 0xb25a
+²[ 0xb25b
+²\ 0xb25c
+²] 0xb25d
+²^ 0xb25e
+²_ 0xb25f
+²` 0xb260
+²a 0xb261
+²b 0xb262
+²c 0xb263
+²d 0xb264
+²e 0xb265
+²f 0xb266
+²g 0xb267
+²h 0xb268
+²i 0xb269
+²j 0xb26a
+²k 0xb26b
+²l 0xb26c
+²m 0xb26d
+²n 0xb26e
+²o 0xb26f
+²p 0xb270
+²q 0xb271
+²r 0xb272
+²s 0xb273
+²t 0xb274
+²u 0xb275
+²v 0xb276
+²w 0xb277
+²x 0xb278
+²y 0xb279
+²z 0xb27a
+²{ 0xb27b
+²| 0xb27c
+²} 0xb27d
+²~ 0xb27e
+²¡ 0xb2a1
+²¢ 0xb2a2
+²£ 0xb2a3
+²¤ 0xb2a4
+²¥ 0xb2a5
+²¦ 0xb2a6
+²§ 0xb2a7
+²¨ 0xb2a8
+²© 0xb2a9
+²ª 0xb2aa
+²« 0xb2ab
+²¬ 0xb2ac
+²­ 0xb2ad
+²® 0xb2ae
+²¯ 0xb2af
+²° 0xb2b0
+²± 0xb2b1
+²² 0xb2b2
+²³ 0xb2b3
+²´ 0xb2b4
+²µ 0xb2b5
+²¶ 0xb2b6
+²· 0xb2b7
+²¸ 0xb2b8
+²¹ 0xb2b9
+²º 0xb2ba
+²» 0xb2bb
+²¼ 0xb2bc
+²½ 0xb2bd
+²¾ 0xb2be
+²¿ 0xb2bf
+²À 0xb2c0
+²Á 0xb2c1
+²Â 0xb2c2
+²Ã 0xb2c3
+²Ä 0xb2c4
+²Å 0xb2c5
+²Æ 0xb2c6
+²Ç 0xb2c7
+²È 0xb2c8
+²É 0xb2c9
+²Ê 0xb2ca
+²Ë 0xb2cb
+²Ì 0xb2cc
+²Í 0xb2cd
+²Î 0xb2ce
+²Ï 0xb2cf
+²Ð 0xb2d0
+²Ñ 0xb2d1
+²Ò 0xb2d2
+²Ó 0xb2d3
+²Ô 0xb2d4
+²Õ 0xb2d5
+²Ö 0xb2d6
+²× 0xb2d7
+²Ø 0xb2d8
+²Ù 0xb2d9
+²Ú 0xb2da
+²Û 0xb2db
+²Ü 0xb2dc
+²Ý 0xb2dd
+²Þ 0xb2de
+²ß 0xb2df
+²à 0xb2e0
+²á 0xb2e1
+²â 0xb2e2
+²ã 0xb2e3
+²ä 0xb2e4
+²å 0xb2e5
+²æ 0xb2e6
+²ç 0xb2e7
+²è 0xb2e8
+²é 0xb2e9
+²ê 0xb2ea
+²ë 0xb2eb
+²ì 0xb2ec
+²í 0xb2ed
+²î 0xb2ee
+²ï 0xb2ef
+²ð 0xb2f0
+²ñ 0xb2f1
+²ò 0xb2f2
+²ó 0xb2f3
+²ô 0xb2f4
+²õ 0xb2f5
+²ö 0xb2f6
+²÷ 0xb2f7
+²ø 0xb2f8
+²ù 0xb2f9
+²ú 0xb2fa
+²û 0xb2fb
+²ü 0xb2fc
+²ý 0xb2fd
+²þ 0xb2fe
+³@ 0xb340
+³A 0xb341
+³B 0xb342
+³C 0xb343
+³D 0xb344
+³E 0xb345
+³F 0xb346
+³G 0xb347
+³H 0xb348
+³I 0xb349
+³J 0xb34a
+³K 0xb34b
+³L 0xb34c
+³M 0xb34d
+³N 0xb34e
+³O 0xb34f
+³P 0xb350
+³Q 0xb351
+³R 0xb352
+³S 0xb353
+³T 0xb354
+³U 0xb355
+³V 0xb356
+³W 0xb357
+³X 0xb358
+³Y 0xb359
+³Z 0xb35a
+³[ 0xb35b
+³\ 0xb35c
+³] 0xb35d
+³^ 0xb35e
+³_ 0xb35f
+³` 0xb360
+³a 0xb361
+³b 0xb362
+³c 0xb363
+³d 0xb364
+³e 0xb365
+³f 0xb366
+³g 0xb367
+³h 0xb368
+³i 0xb369
+³j 0xb36a
+³k 0xb36b
+³l 0xb36c
+³m 0xb36d
+³n 0xb36e
+³o 0xb36f
+³p 0xb370
+³q 0xb371
+³r 0xb372
+³s 0xb373
+³t 0xb374
+³u 0xb375
+³v 0xb376
+³w 0xb377
+³x 0xb378
+³y 0xb379
+³z 0xb37a
+³{ 0xb37b
+³| 0xb37c
+³} 0xb37d
+³~ 0xb37e
+³¡ 0xb3a1
+³¢ 0xb3a2
+³£ 0xb3a3
+³¤ 0xb3a4
+³¥ 0xb3a5
+³¦ 0xb3a6
+³§ 0xb3a7
+³¨ 0xb3a8
+³© 0xb3a9
+³ª 0xb3aa
+³« 0xb3ab
+³¬ 0xb3ac
+³­ 0xb3ad
+³® 0xb3ae
+³¯ 0xb3af
+³° 0xb3b0
+³± 0xb3b1
+³² 0xb3b2
+³³ 0xb3b3
+³´ 0xb3b4
+³µ 0xb3b5
+³¶ 0xb3b6
+³· 0xb3b7
+³¸ 0xb3b8
+³¹ 0xb3b9
+³º 0xb3ba
+³» 0xb3bb
+³¼ 0xb3bc
+³½ 0xb3bd
+³¾ 0xb3be
+³¿ 0xb3bf
+³À 0xb3c0
+³Á 0xb3c1
+³Â 0xb3c2
+³Ã 0xb3c3
+³Ä 0xb3c4
+³Å 0xb3c5
+³Æ 0xb3c6
+³Ç 0xb3c7
+³È 0xb3c8
+³É 0xb3c9
+³Ê 0xb3ca
+³Ë 0xb3cb
+³Ì 0xb3cc
+³Í 0xb3cd
+³Î 0xb3ce
+³Ï 0xb3cf
+³Ð 0xb3d0
+³Ñ 0xb3d1
+³Ò 0xb3d2
+³Ó 0xb3d3
+³Ô 0xb3d4
+³Õ 0xb3d5
+³Ö 0xb3d6
+³× 0xb3d7
+³Ø 0xb3d8
+³Ù 0xb3d9
+³Ú 0xb3da
+³Û 0xb3db
+³Ü 0xb3dc
+³Ý 0xb3dd
+³Þ 0xb3de
+³ß 0xb3df
+³à 0xb3e0
+³á 0xb3e1
+³â 0xb3e2
+³ã 0xb3e3
+³ä 0xb3e4
+³å 0xb3e5
+³æ 0xb3e6
+³ç 0xb3e7
+³è 0xb3e8
+³é 0xb3e9
+³ê 0xb3ea
+³ë 0xb3eb
+³ì 0xb3ec
+³í 0xb3ed
+³î 0xb3ee
+³ï 0xb3ef
+³ð 0xb3f0
+³ñ 0xb3f1
+³ò 0xb3f2
+³ó 0xb3f3
+³ô 0xb3f4
+³õ 0xb3f5
+³ö 0xb3f6
+³÷ 0xb3f7
+³ø 0xb3f8
+³ù 0xb3f9
+³ú 0xb3fa
+³û 0xb3fb
+³ü 0xb3fc
+³ý 0xb3fd
+³þ 0xb3fe
+´@ 0xb440
+´A 0xb441
+´B 0xb442
+´C 0xb443
+´D 0xb444
+´E 0xb445
+´F 0xb446
+´G 0xb447
+´H 0xb448
+´I 0xb449
+´J 0xb44a
+´K 0xb44b
+´L 0xb44c
+´M 0xb44d
+´N 0xb44e
+´O 0xb44f
+´P 0xb450
+´Q 0xb451
+´R 0xb452
+´S 0xb453
+´T 0xb454
+´U 0xb455
+´V 0xb456
+´W 0xb457
+´X 0xb458
+´Y 0xb459
+´Z 0xb45a
+´[ 0xb45b
+´\ 0xb45c
+´] 0xb45d
+´^ 0xb45e
+´_ 0xb45f
+´` 0xb460
+´a 0xb461
+´b 0xb462
+´c 0xb463
+´d 0xb464
+´e 0xb465
+´f 0xb466
+´g 0xb467
+´h 0xb468
+´i 0xb469
+´j 0xb46a
+´k 0xb46b
+´l 0xb46c
+´m 0xb46d
+´n 0xb46e
+´o 0xb46f
+´p 0xb470
+´q 0xb471
+´r 0xb472
+´s 0xb473
+´t 0xb474
+´u 0xb475
+´v 0xb476
+´w 0xb477
+´x 0xb478
+´y 0xb479
+´z 0xb47a
+´{ 0xb47b
+´| 0xb47c
+´} 0xb47d
+´~ 0xb47e
+´¡ 0xb4a1
+´¢ 0xb4a2
+´£ 0xb4a3
+´¤ 0xb4a4
+´¥ 0xb4a5
+´¦ 0xb4a6
+´§ 0xb4a7
+´¨ 0xb4a8
+´© 0xb4a9
+´ª 0xb4aa
+´« 0xb4ab
+´¬ 0xb4ac
+´­ 0xb4ad
+´® 0xb4ae
+´¯ 0xb4af
+´° 0xb4b0
+´± 0xb4b1
+´² 0xb4b2
+´³ 0xb4b3
+´´ 0xb4b4
+´µ 0xb4b5
+´¶ 0xb4b6
+´· 0xb4b7
+´¸ 0xb4b8
+´¹ 0xb4b9
+´º 0xb4ba
+´» 0xb4bb
+´¼ 0xb4bc
+´½ 0xb4bd
+´¾ 0xb4be
+´¿ 0xb4bf
+´À 0xb4c0
+´Á 0xb4c1
+´Â 0xb4c2
+´Ã 0xb4c3
+´Ä 0xb4c4
+´Å 0xb4c5
+´Æ 0xb4c6
+´Ç 0xb4c7
+´È 0xb4c8
+´É 0xb4c9
+´Ê 0xb4ca
+´Ë 0xb4cb
+´Ì 0xb4cc
+´Í 0xb4cd
+´Î 0xb4ce
+´Ï 0xb4cf
+´Ð 0xb4d0
+´Ñ 0xb4d1
+´Ò 0xb4d2
+´Ó 0xb4d3
+´Ô 0xb4d4
+´Õ 0xb4d5
+´Ö 0xb4d6
+´× 0xb4d7
+´Ø 0xb4d8
+´Ù 0xb4d9
+´Ú 0xb4da
+´Û 0xb4db
+´Ü 0xb4dc
+´Ý 0xb4dd
+´Þ 0xb4de
+´ß 0xb4df
+´à 0xb4e0
+´á 0xb4e1
+´â 0xb4e2
+´ã 0xb4e3
+´ä 0xb4e4
+´å 0xb4e5
+´æ 0xb4e6
+´ç 0xb4e7
+´è 0xb4e8
+´é 0xb4e9
+´ê 0xb4ea
+´ë 0xb4eb
+´ì 0xb4ec
+´í 0xb4ed
+´î 0xb4ee
+´ï 0xb4ef
+´ð 0xb4f0
+´ñ 0xb4f1
+´ò 0xb4f2
+´ó 0xb4f3
+´ô 0xb4f4
+´õ 0xb4f5
+´ö 0xb4f6
+´÷ 0xb4f7
+´ø 0xb4f8
+´ù 0xb4f9
+´ú 0xb4fa
+´û 0xb4fb
+´ü 0xb4fc
+´ý 0xb4fd
+´þ 0xb4fe
+µ@ 0xb540
+µA 0xb541
+µB 0xb542
+µC 0xb543
+µD 0xb544
+µE 0xb545
+µF 0xb546
+µG 0xb547
+µH 0xb548
+µI 0xb549
+µJ 0xb54a
+µK 0xb54b
+µL 0xb54c
+µM 0xb54d
+µN 0xb54e
+µO 0xb54f
+µP 0xb550
+µQ 0xb551
+µR 0xb552
+µS 0xb553
+µT 0xb554
+µU 0xb555
+µV 0xb556
+µW 0xb557
+µX 0xb558
+µY 0xb559
+µZ 0xb55a
+µ[ 0xb55b
+µ\ 0xb55c
+µ] 0xb55d
+µ^ 0xb55e
+µ_ 0xb55f
+µ` 0xb560
+µa 0xb561
+µb 0xb562
+µc 0xb563
+µd 0xb564
+µe 0xb565
+µf 0xb566
+µg 0xb567
+µh 0xb568
+µi 0xb569
+µj 0xb56a
+µk 0xb56b
+µl 0xb56c
+µm 0xb56d
+µn 0xb56e
+µo 0xb56f
+µp 0xb570
+µq 0xb571
+µr 0xb572
+µs 0xb573
+µt 0xb574
+µu 0xb575
+µv 0xb576
+µw 0xb577
+µx 0xb578
+µy 0xb579
+µz 0xb57a
+µ{ 0xb57b
+µ| 0xb57c
+µ} 0xb57d
+µ~ 0xb57e
+µ¡ 0xb5a1
+µ¢ 0xb5a2
+µ£ 0xb5a3
+µ¤ 0xb5a4
+µ¥ 0xb5a5
+µ¦ 0xb5a6
+µ§ 0xb5a7
+µ¨ 0xb5a8
+µ© 0xb5a9
+µª 0xb5aa
+µ« 0xb5ab
+µ¬ 0xb5ac
+µ­ 0xb5ad
+µ® 0xb5ae
+µ¯ 0xb5af
+µ° 0xb5b0
+µ± 0xb5b1
+µ² 0xb5b2
+µ³ 0xb5b3
+µ´ 0xb5b4
+µµ 0xb5b5
+µ¶ 0xb5b6
+µ· 0xb5b7
+µ¸ 0xb5b8
+µ¹ 0xb5b9
+µº 0xb5ba
+µ» 0xb5bb
+µ¼ 0xb5bc
+µ½ 0xb5bd
+µ¾ 0xb5be
+µ¿ 0xb5bf
+µÀ 0xb5c0
+µÁ 0xb5c1
+µÂ 0xb5c2
+µÃ 0xb5c3
+µÄ 0xb5c4
+µÅ 0xb5c5
+µÆ 0xb5c6
+µÇ 0xb5c7
+µÈ 0xb5c8
+µÉ 0xb5c9
+µÊ 0xb5ca
+µË 0xb5cb
+µÌ 0xb5cc
+µÍ 0xb5cd
+µÎ 0xb5ce
+µÏ 0xb5cf
+µÐ 0xb5d0
+µÑ 0xb5d1
+µÒ 0xb5d2
+µÓ 0xb5d3
+µÔ 0xb5d4
+µÕ 0xb5d5
+µÖ 0xb5d6
+µ× 0xb5d7
+µØ 0xb5d8
+µÙ 0xb5d9
+µÚ 0xb5da
+µÛ 0xb5db
+µÜ 0xb5dc
+µÝ 0xb5dd
+µÞ 0xb5de
+µß 0xb5df
+µà 0xb5e0
+µá 0xb5e1
+µâ 0xb5e2
+µã 0xb5e3
+µä 0xb5e4
+µå 0xb5e5
+µæ 0xb5e6
+µç 0xb5e7
+µè 0xb5e8
+µé 0xb5e9
+µê 0xb5ea
+µë 0xb5eb
+µì 0xb5ec
+µí 0xb5ed
+µî 0xb5ee
+µï 0xb5ef
+µð 0xb5f0
+µñ 0xb5f1
+µò 0xb5f2
+µó 0xb5f3
+µô 0xb5f4
+µõ 0xb5f5
+µö 0xb5f6
+µ÷ 0xb5f7
+µø 0xb5f8
+µù 0xb5f9
+µú 0xb5fa
+µû 0xb5fb
+µü 0xb5fc
+µý 0xb5fd
+µþ 0xb5fe
+¶@ 0xb640
+¶A 0xb641
+¶B 0xb642
+¶C 0xb643
+¶D 0xb644
+¶E 0xb645
+¶F 0xb646
+¶G 0xb647
+¶H 0xb648
+¶I 0xb649
+¶J 0xb64a
+¶K 0xb64b
+¶L 0xb64c
+¶M 0xb64d
+¶N 0xb64e
+¶O 0xb64f
+¶P 0xb650
+¶Q 0xb651
+¶R 0xb652
+¶S 0xb653
+¶T 0xb654
+¶U 0xb655
+¶V 0xb656
+¶W 0xb657
+¶X 0xb658
+¶Y 0xb659
+¶Z 0xb65a
+¶[ 0xb65b
+¶\ 0xb65c
+¶] 0xb65d
+¶^ 0xb65e
+¶_ 0xb65f
+¶` 0xb660
+¶a 0xb661
+¶b 0xb662
+¶c 0xb663
+¶d 0xb664
+¶e 0xb665
+¶f 0xb666
+¶g 0xb667
+¶h 0xb668
+¶i 0xb669
+¶j 0xb66a
+¶k 0xb66b
+¶l 0xb66c
+¶m 0xb66d
+¶n 0xb66e
+¶o 0xb66f
+¶p 0xb670
+¶q 0xb671
+¶r 0xb672
+¶s 0xb673
+¶t 0xb674
+¶u 0xb675
+¶v 0xb676
+¶w 0xb677
+¶x 0xb678
+¶y 0xb679
+¶z 0xb67a
+¶{ 0xb67b
+¶| 0xb67c
+¶} 0xb67d
+¶~ 0xb67e
+¶¡ 0xb6a1
+¶¢ 0xb6a2
+¶£ 0xb6a3
+¶¤ 0xb6a4
+¶¥ 0xb6a5
+¶¦ 0xb6a6
+¶§ 0xb6a7
+¶¨ 0xb6a8
+¶© 0xb6a9
+¶ª 0xb6aa
+¶« 0xb6ab
+¶¬ 0xb6ac
+¶­ 0xb6ad
+¶® 0xb6ae
+¶¯ 0xb6af
+¶° 0xb6b0
+¶± 0xb6b1
+¶² 0xb6b2
+¶³ 0xb6b3
+¶´ 0xb6b4
+¶µ 0xb6b5
+¶¶ 0xb6b6
+¶· 0xb6b7
+¶¸ 0xb6b8
+¶¹ 0xb6b9
+¶º 0xb6ba
+¶» 0xb6bb
+¶¼ 0xb6bc
+¶½ 0xb6bd
+¶¾ 0xb6be
+¶¿ 0xb6bf
+¶À 0xb6c0
+¶Á 0xb6c1
+¶Â 0xb6c2
+¶Ã 0xb6c3
+¶Ä 0xb6c4
+¶Å 0xb6c5
+¶Æ 0xb6c6
+¶Ç 0xb6c7
+¶È 0xb6c8
+¶É 0xb6c9
+¶Ê 0xb6ca
+¶Ë 0xb6cb
+¶Ì 0xb6cc
+¶Í 0xb6cd
+¶Î 0xb6ce
+¶Ï 0xb6cf
+¶Ð 0xb6d0
+¶Ñ 0xb6d1
+¶Ò 0xb6d2
+¶Ó 0xb6d3
+¶Ô 0xb6d4
+¶Õ 0xb6d5
+¶Ö 0xb6d6
+¶× 0xb6d7
+¶Ø 0xb6d8
+¶Ù 0xb6d9
+¶Ú 0xb6da
+¶Û 0xb6db
+¶Ü 0xb6dc
+¶Ý 0xb6dd
+¶Þ 0xb6de
+¶ß 0xb6df
+¶à 0xb6e0
+¶á 0xb6e1
+¶â 0xb6e2
+¶ã 0xb6e3
+¶ä 0xb6e4
+¶å 0xb6e5
+¶æ 0xb6e6
+¶ç 0xb6e7
+¶è 0xb6e8
+¶é 0xb6e9
+¶ê 0xb6ea
+¶ë 0xb6eb
+¶ì 0xb6ec
+¶í 0xb6ed
+¶î 0xb6ee
+¶ï 0xb6ef
+¶ð 0xb6f0
+¶ñ 0xb6f1
+¶ò 0xb6f2
+¶ó 0xb6f3
+¶ô 0xb6f4
+¶õ 0xb6f5
+¶ö 0xb6f6
+¶÷ 0xb6f7
+¶ø 0xb6f8
+¶ù 0xb6f9
+¶ú 0xb6fa
+¶û 0xb6fb
+¶ü 0xb6fc
+¶ý 0xb6fd
+¶þ 0xb6fe
+·@ 0xb740
+·A 0xb741
+·B 0xb742
+·C 0xb743
+·D 0xb744
+·E 0xb745
+·F 0xb746
+·G 0xb747
+·H 0xb748
+·I 0xb749
+·J 0xb74a
+·K 0xb74b
+·L 0xb74c
+·M 0xb74d
+·N 0xb74e
+·O 0xb74f
+·P 0xb750
+·Q 0xb751
+·R 0xb752
+·S 0xb753
+·T 0xb754
+·U 0xb755
+·V 0xb756
+·W 0xb757
+·X 0xb758
+·Y 0xb759
+·Z 0xb75a
+·[ 0xb75b
+·\ 0xb75c
+·] 0xb75d
+·^ 0xb75e
+·_ 0xb75f
+·` 0xb760
+·a 0xb761
+·b 0xb762
+·c 0xb763
+·d 0xb764
+·e 0xb765
+·f 0xb766
+·g 0xb767
+·h 0xb768
+·i 0xb769
+·j 0xb76a
+·k 0xb76b
+·l 0xb76c
+·m 0xb76d
+·n 0xb76e
+·o 0xb76f
+·p 0xb770
+·q 0xb771
+·r 0xb772
+·s 0xb773
+·t 0xb774
+·u 0xb775
+·v 0xb776
+·w 0xb777
+·x 0xb778
+·y 0xb779
+·z 0xb77a
+·{ 0xb77b
+·| 0xb77c
+·} 0xb77d
+·~ 0xb77e
+·¡ 0xb7a1
+·¢ 0xb7a2
+·£ 0xb7a3
+·¤ 0xb7a4
+·¥ 0xb7a5
+·¦ 0xb7a6
+·§ 0xb7a7
+·¨ 0xb7a8
+·© 0xb7a9
+·ª 0xb7aa
+·« 0xb7ab
+·¬ 0xb7ac
+·­ 0xb7ad
+·® 0xb7ae
+·¯ 0xb7af
+·° 0xb7b0
+·± 0xb7b1
+·² 0xb7b2
+·³ 0xb7b3
+·´ 0xb7b4
+·µ 0xb7b5
+·¶ 0xb7b6
+·· 0xb7b7
+·¸ 0xb7b8
+·¹ 0xb7b9
+·º 0xb7ba
+·» 0xb7bb
+·¼ 0xb7bc
+·½ 0xb7bd
+·¾ 0xb7be
+·¿ 0xb7bf
+·À 0xb7c0
+·Á 0xb7c1
+·Â 0xb7c2
+·Ã 0xb7c3
+·Ä 0xb7c4
+·Å 0xb7c5
+·Æ 0xb7c6
+·Ç 0xb7c7
+·È 0xb7c8
+·É 0xb7c9
+·Ê 0xb7ca
+·Ë 0xb7cb
+·Ì 0xb7cc
+·Í 0xb7cd
+·Î 0xb7ce
+·Ï 0xb7cf
+·Ð 0xb7d0
+·Ñ 0xb7d1
+·Ò 0xb7d2
+·Ó 0xb7d3
+·Ô 0xb7d4
+·Õ 0xb7d5
+·Ö 0xb7d6
+·× 0xb7d7
+·Ø 0xb7d8
+·Ù 0xb7d9
+·Ú 0xb7da
+·Û 0xb7db
+·Ü 0xb7dc
+·Ý 0xb7dd
+·Þ 0xb7de
+·ß 0xb7df
+·à 0xb7e0
+·á 0xb7e1
+·â 0xb7e2
+·ã 0xb7e3
+·ä 0xb7e4
+·å 0xb7e5
+·æ 0xb7e6
+·ç 0xb7e7
+·è 0xb7e8
+·é 0xb7e9
+·ê 0xb7ea
+·ë 0xb7eb
+·ì 0xb7ec
+·í 0xb7ed
+·î 0xb7ee
+·ï 0xb7ef
+·ð 0xb7f0
+·ñ 0xb7f1
+·ò 0xb7f2
+·ó 0xb7f3
+·ô 0xb7f4
+·õ 0xb7f5
+·ö 0xb7f6
+·÷ 0xb7f7
+·ø 0xb7f8
+·ù 0xb7f9
+·ú 0xb7fa
+·û 0xb7fb
+·ü 0xb7fc
+·ý 0xb7fd
+·þ 0xb7fe
+¸@ 0xb840
+¸A 0xb841
+¸B 0xb842
+¸C 0xb843
+¸D 0xb844
+¸E 0xb845
+¸F 0xb846
+¸G 0xb847
+¸H 0xb848
+¸I 0xb849
+¸J 0xb84a
+¸K 0xb84b
+¸L 0xb84c
+¸M 0xb84d
+¸N 0xb84e
+¸O 0xb84f
+¸P 0xb850
+¸Q 0xb851
+¸R 0xb852
+¸S 0xb853
+¸T 0xb854
+¸U 0xb855
+¸V 0xb856
+¸W 0xb857
+¸X 0xb858
+¸Y 0xb859
+¸Z 0xb85a
+¸[ 0xb85b
+¸\ 0xb85c
+¸] 0xb85d
+¸^ 0xb85e
+¸_ 0xb85f
+¸` 0xb860
+¸a 0xb861
+¸b 0xb862
+¸c 0xb863
+¸d 0xb864
+¸e 0xb865
+¸f 0xb866
+¸g 0xb867
+¸h 0xb868
+¸i 0xb869
+¸j 0xb86a
+¸k 0xb86b
+¸l 0xb86c
+¸m 0xb86d
+¸n 0xb86e
+¸o 0xb86f
+¸p 0xb870
+¸q 0xb871
+¸r 0xb872
+¸s 0xb873
+¸t 0xb874
+¸u 0xb875
+¸v 0xb876
+¸w 0xb877
+¸x 0xb878
+¸y 0xb879
+¸z 0xb87a
+¸{ 0xb87b
+¸| 0xb87c
+¸} 0xb87d
+¸~ 0xb87e
+¸¡ 0xb8a1
+¸¢ 0xb8a2
+¸£ 0xb8a3
+¸¤ 0xb8a4
+¸¥ 0xb8a5
+¸¦ 0xb8a6
+¸§ 0xb8a7
+¸¨ 0xb8a8
+¸© 0xb8a9
+¸ª 0xb8aa
+¸« 0xb8ab
+¸¬ 0xb8ac
+¸­ 0xb8ad
+¸® 0xb8ae
+¸¯ 0xb8af
+¸° 0xb8b0
+¸± 0xb8b1
+¸² 0xb8b2
+¸³ 0xb8b3
+¸´ 0xb8b4
+¸µ 0xb8b5
+¸¶ 0xb8b6
+¸· 0xb8b7
+¸¸ 0xb8b8
+¸¹ 0xb8b9
+¸º 0xb8ba
+¸» 0xb8bb
+¸¼ 0xb8bc
+¸½ 0xb8bd
+¸¾ 0xb8be
+¸¿ 0xb8bf
+¸À 0xb8c0
+¸Á 0xb8c1
+¸Â 0xb8c2
+¸Ã 0xb8c3
+¸Ä 0xb8c4
+¸Å 0xb8c5
+¸Æ 0xb8c6
+¸Ç 0xb8c7
+¸È 0xb8c8
+¸É 0xb8c9
+¸Ê 0xb8ca
+¸Ë 0xb8cb
+¸Ì 0xb8cc
+¸Í 0xb8cd
+¸Î 0xb8ce
+¸Ï 0xb8cf
+¸Ð 0xb8d0
+¸Ñ 0xb8d1
+¸Ò 0xb8d2
+¸Ó 0xb8d3
+¸Ô 0xb8d4
+¸Õ 0xb8d5
+¸Ö 0xb8d6
+¸× 0xb8d7
+¸Ø 0xb8d8
+¸Ù 0xb8d9
+¸Ú 0xb8da
+¸Û 0xb8db
+¸Ü 0xb8dc
+¸Ý 0xb8dd
+¸Þ 0xb8de
+¸ß 0xb8df
+¸à 0xb8e0
+¸á 0xb8e1
+¸â 0xb8e2
+¸ã 0xb8e3
+¸ä 0xb8e4
+¸å 0xb8e5
+¸æ 0xb8e6
+¸ç 0xb8e7
+¸è 0xb8e8
+¸é 0xb8e9
+¸ê 0xb8ea
+¸ë 0xb8eb
+¸ì 0xb8ec
+¸í 0xb8ed
+¸î 0xb8ee
+¸ï 0xb8ef
+¸ð 0xb8f0
+¸ñ 0xb8f1
+¸ò 0xb8f2
+¸ó 0xb8f3
+¸ô 0xb8f4
+¸õ 0xb8f5
+¸ö 0xb8f6
+¸÷ 0xb8f7
+¸ø 0xb8f8
+¸ù 0xb8f9
+¸ú 0xb8fa
+¸û 0xb8fb
+¸ü 0xb8fc
+¸ý 0xb8fd
+¸þ 0xb8fe
+¹@ 0xb940
+¹A 0xb941
+¹B 0xb942
+¹C 0xb943
+¹D 0xb944
+¹E 0xb945
+¹F 0xb946
+¹G 0xb947
+¹H 0xb948
+¹I 0xb949
+¹J 0xb94a
+¹K 0xb94b
+¹L 0xb94c
+¹M 0xb94d
+¹N 0xb94e
+¹O 0xb94f
+¹P 0xb950
+¹Q 0xb951
+¹R 0xb952
+¹S 0xb953
+¹T 0xb954
+¹U 0xb955
+¹V 0xb956
+¹W 0xb957
+¹X 0xb958
+¹Y 0xb959
+¹Z 0xb95a
+¹[ 0xb95b
+¹\ 0xb95c
+¹] 0xb95d
+¹^ 0xb95e
+¹_ 0xb95f
+¹` 0xb960
+¹a 0xb961
+¹b 0xb962
+¹c 0xb963
+¹d 0xb964
+¹e 0xb965
+¹f 0xb966
+¹g 0xb967
+¹h 0xb968
+¹i 0xb969
+¹j 0xb96a
+¹k 0xb96b
+¹l 0xb96c
+¹m 0xb96d
+¹n 0xb96e
+¹o 0xb96f
+¹p 0xb970
+¹q 0xb971
+¹r 0xb972
+¹s 0xb973
+¹t 0xb974
+¹u 0xb975
+¹v 0xb976
+¹w 0xb977
+¹x 0xb978
+¹y 0xb979
+¹z 0xb97a
+¹{ 0xb97b
+¹| 0xb97c
+¹} 0xb97d
+¹~ 0xb97e
+¹¡ 0xb9a1
+¹¢ 0xb9a2
+¹£ 0xb9a3
+¹¤ 0xb9a4
+¹¥ 0xb9a5
+¹¦ 0xb9a6
+¹§ 0xb9a7
+¹¨ 0xb9a8
+¹© 0xb9a9
+¹ª 0xb9aa
+¹« 0xb9ab
+¹¬ 0xb9ac
+¹­ 0xb9ad
+¹® 0xb9ae
+¹¯ 0xb9af
+¹° 0xb9b0
+¹± 0xb9b1
+¹² 0xb9b2
+¹³ 0xb9b3
+¹´ 0xb9b4
+¹µ 0xb9b5
+¹¶ 0xb9b6
+¹· 0xb9b7
+¹¸ 0xb9b8
+¹¹ 0xb9b9
+¹º 0xb9ba
+¹» 0xb9bb
+¹¼ 0xb9bc
+¹½ 0xb9bd
+¹¾ 0xb9be
+¹¿ 0xb9bf
+¹À 0xb9c0
+¹Á 0xb9c1
+¹Â 0xb9c2
+¹Ã 0xb9c3
+¹Ä 0xb9c4
+¹Å 0xb9c5
+¹Æ 0xb9c6
+¹Ç 0xb9c7
+¹È 0xb9c8
+¹É 0xb9c9
+¹Ê 0xb9ca
+¹Ë 0xb9cb
+¹Ì 0xb9cc
+¹Í 0xb9cd
+¹Î 0xb9ce
+¹Ï 0xb9cf
+¹Ð 0xb9d0
+¹Ñ 0xb9d1
+¹Ò 0xb9d2
+¹Ó 0xb9d3
+¹Ô 0xb9d4
+¹Õ 0xb9d5
+¹Ö 0xb9d6
+¹× 0xb9d7
+¹Ø 0xb9d8
+¹Ù 0xb9d9
+¹Ú 0xb9da
+¹Û 0xb9db
+¹Ü 0xb9dc
+¹Ý 0xb9dd
+¹Þ 0xb9de
+¹ß 0xb9df
+¹à 0xb9e0
+¹á 0xb9e1
+¹â 0xb9e2
+¹ã 0xb9e3
+¹ä 0xb9e4
+¹å 0xb9e5
+¹æ 0xb9e6
+¹ç 0xb9e7
+¹è 0xb9e8
+¹é 0xb9e9
+¹ê 0xb9ea
+¹ë 0xb9eb
+¹ì 0xb9ec
+¹í 0xb9ed
+¹î 0xb9ee
+¹ï 0xb9ef
+¹ð 0xb9f0
+¹ñ 0xb9f1
+¹ò 0xb9f2
+¹ó 0xb9f3
+¹ô 0xb9f4
+¹õ 0xb9f5
+¹ö 0xb9f6
+¹÷ 0xb9f7
+¹ø 0xb9f8
+¹ù 0xb9f9
+¹ú 0xb9fa
+¹û 0xb9fb
+¹ü 0xb9fc
+¹ý 0xb9fd
+¹þ 0xb9fe
+º@ 0xba40
+ºA 0xba41
+ºB 0xba42
+ºC 0xba43
+ºD 0xba44
+ºE 0xba45
+ºF 0xba46
+ºG 0xba47
+ºH 0xba48
+ºI 0xba49
+ºJ 0xba4a
+ºK 0xba4b
+ºL 0xba4c
+ºM 0xba4d
+ºN 0xba4e
+ºO 0xba4f
+ºP 0xba50
+ºQ 0xba51
+ºR 0xba52
+ºS 0xba53
+ºT 0xba54
+ºU 0xba55
+ºV 0xba56
+ºW 0xba57
+ºX 0xba58
+ºY 0xba59
+ºZ 0xba5a
+º[ 0xba5b
+º\ 0xba5c
+º] 0xba5d
+º^ 0xba5e
+º_ 0xba5f
+º` 0xba60
+ºa 0xba61
+ºb 0xba62
+ºc 0xba63
+ºd 0xba64
+ºe 0xba65
+ºf 0xba66
+ºg 0xba67
+ºh 0xba68
+ºi 0xba69
+ºj 0xba6a
+ºk 0xba6b
+ºl 0xba6c
+ºm 0xba6d
+ºn 0xba6e
+ºo 0xba6f
+ºp 0xba70
+ºq 0xba71
+ºr 0xba72
+ºs 0xba73
+ºt 0xba74
+ºu 0xba75
+ºv 0xba76
+ºw 0xba77
+ºx 0xba78
+ºy 0xba79
+ºz 0xba7a
+º{ 0xba7b
+º| 0xba7c
+º} 0xba7d
+º~ 0xba7e
+º¡ 0xbaa1
+º¢ 0xbaa2
+º£ 0xbaa3
+º¤ 0xbaa4
+º¥ 0xbaa5
+º¦ 0xbaa6
+º§ 0xbaa7
+º¨ 0xbaa8
+º© 0xbaa9
+ºª 0xbaaa
+º« 0xbaab
+º¬ 0xbaac
+º­ 0xbaad
+º® 0xbaae
+º¯ 0xbaaf
+º° 0xbab0
+º± 0xbab1
+º² 0xbab2
+º³ 0xbab3
+º´ 0xbab4
+ºµ 0xbab5
+º¶ 0xbab6
+º· 0xbab7
+º¸ 0xbab8
+º¹ 0xbab9
+ºº 0xbaba
+º» 0xbabb
+º¼ 0xbabc
+º½ 0xbabd
+º¾ 0xbabe
+º¿ 0xbabf
+ºÀ 0xbac0
+ºÁ 0xbac1
+ºÂ 0xbac2
+ºÃ 0xbac3
+ºÄ 0xbac4
+ºÅ 0xbac5
+ºÆ 0xbac6
+ºÇ 0xbac7
+ºÈ 0xbac8
+ºÉ 0xbac9
+ºÊ 0xbaca
+ºË 0xbacb
+ºÌ 0xbacc
+ºÍ 0xbacd
+ºÎ 0xbace
+ºÏ 0xbacf
+ºÐ 0xbad0
+ºÑ 0xbad1
+ºÒ 0xbad2
+ºÓ 0xbad3
+ºÔ 0xbad4
+ºÕ 0xbad5
+ºÖ 0xbad6
+º× 0xbad7
+ºØ 0xbad8
+ºÙ 0xbad9
+ºÚ 0xbada
+ºÛ 0xbadb
+ºÜ 0xbadc
+ºÝ 0xbadd
+ºÞ 0xbade
+ºß 0xbadf
+ºà 0xbae0
+ºá 0xbae1
+ºâ 0xbae2
+ºã 0xbae3
+ºä 0xbae4
+ºå 0xbae5
+ºæ 0xbae6
+ºç 0xbae7
+ºè 0xbae8
+ºé 0xbae9
+ºê 0xbaea
+ºë 0xbaeb
+ºì 0xbaec
+ºí 0xbaed
+ºî 0xbaee
+ºï 0xbaef
+ºð 0xbaf0
+ºñ 0xbaf1
+ºò 0xbaf2
+ºó 0xbaf3
+ºô 0xbaf4
+ºõ 0xbaf5
+ºö 0xbaf6
+º÷ 0xbaf7
+ºø 0xbaf8
+ºù 0xbaf9
+ºú 0xbafa
+ºû 0xbafb
+ºü 0xbafc
+ºý 0xbafd
+ºþ 0xbafe
+»@ 0xbb40
+»A 0xbb41
+»B 0xbb42
+»C 0xbb43
+»D 0xbb44
+»E 0xbb45
+»F 0xbb46
+»G 0xbb47
+»H 0xbb48
+»I 0xbb49
+»J 0xbb4a
+»K 0xbb4b
+»L 0xbb4c
+»M 0xbb4d
+»N 0xbb4e
+»O 0xbb4f
+»P 0xbb50
+»Q 0xbb51
+»R 0xbb52
+»S 0xbb53
+»T 0xbb54
+»U 0xbb55
+»V 0xbb56
+»W 0xbb57
+»X 0xbb58
+»Y 0xbb59
+»Z 0xbb5a
+»[ 0xbb5b
+»\ 0xbb5c
+»] 0xbb5d
+»^ 0xbb5e
+»_ 0xbb5f
+»` 0xbb60
+»a 0xbb61
+»b 0xbb62
+»c 0xbb63
+»d 0xbb64
+»e 0xbb65
+»f 0xbb66
+»g 0xbb67
+»h 0xbb68
+»i 0xbb69
+»j 0xbb6a
+»k 0xbb6b
+»l 0xbb6c
+»m 0xbb6d
+»n 0xbb6e
+»o 0xbb6f
+»p 0xbb70
+»q 0xbb71
+»r 0xbb72
+»s 0xbb73
+»t 0xbb74
+»u 0xbb75
+»v 0xbb76
+»w 0xbb77
+»x 0xbb78
+»y 0xbb79
+»z 0xbb7a
+»{ 0xbb7b
+»| 0xbb7c
+»} 0xbb7d
+»~ 0xbb7e
+»¡ 0xbba1
+Ȣ 0xbba2
+ȣ 0xbba3
+»¤ 0xbba4
+ȴ 0xbba5
+»¦ 0xbba6
+Ȥ 0xbba7
+Ȭ 0xbba8
+»© 0xbba9
+Ȼ 0xbbaa
+»« 0xbbab
+»¬ 0xbbac
+»­ 0xbbad
+»® 0xbbae
+»¯ 0xbbaf
+»° 0xbbb0
+»± 0xbbb1
+»² 0xbbb2
+»³ 0xbbb3
+»´ 0xbbb4
+»µ 0xbbb5
+Ȧ 0xbbb6
+»· 0xbbb7
+»¸ 0xbbb8
+»¹ 0xbbb9
+ȼ 0xbbba
+»» 0xbbbb
+»¼ 0xbbbc
+»½ 0xbbbd
+»¾ 0xbbbe
+»¿ 0xbbbf
+»À 0xbbc0
+»Á 0xbbc1
+»Â 0xbbc2
+»Ã 0xbbc3
+Ȁ 0xbbc4
+ȁ 0xbbc5
+Ȯ 0xbbc6
+Ȃ 0xbbc7
+»È 0xbbc8
+ȃ 0xbbc9
+»Ê 0xbbca
+»Ë 0xbbcb
+»Ì 0xbbcc
+»Í 0xbbcd
+»Î 0xbbce
+»Ï 0xbbcf
+»Ð 0xbbd0
+Ȅ 0xbbd1
+»Ò 0xbbd2
+»Ó 0xbbd3
+»Ô 0xbbd4
+»Õ 0xbbd5
+»Ö 0xbbd6
+»× 0xbbd7
+ȯ 0xbbd8
+»Ù 0xbbd9
+»Ú 0xbbda
+»Û 0xbbdb
+Ȇ 0xbbdc
+»Ý 0xbbdd
+»Þ 0xbbde
+ȧ 0xbbdf
+Ȉ 0xbbe0
+ȇ 0xbbe1
+ȉ 0xbbe2
+ȋ 0xbbe3
+Ȋ 0xbbe4
+Ȍ 0xbbe5
+Ⱦ 0xbbe6
+ȍ 0xbbe7
+ȏ 0xbbe8
+Ȏ 0xbbe9
+Ȑ 0xbbea
+ȑ 0xbbeb
+ȓ 0xbbec
+Ȓ 0xbbed
+Ȕ 0xbbee
+ȕ 0xbbef
+»ð 0xbbf0
+Ȗ 0xbbf1
+»ò 0xbbf2
+»ó 0xbbf3
+»ô 0xbbf4
+»õ 0xbbf5
+»ö 0xbbf6
+»÷ 0xbbf7
+»ø 0xbbf8
+»ù 0xbbf9
+»ú 0xbbfa
+»û 0xbbfb
+ȟ 0xbbfc
+»ý 0xbbfd
+»þ 0xbbfe
+¼@ 0xbc40
+¼A 0xbc41
+¼B 0xbc42
+¼C 0xbc43
+¼D 0xbc44
+¼E 0xbc45
+¼F 0xbc46
+¼G 0xbc47
+¼H 0xbc48
+¼I 0xbc49
+¼J 0xbc4a
+¼K 0xbc4b
+¼L 0xbc4c
+¼M 0xbc4d
+¼N 0xbc4e
+¼O 0xbc4f
+¼P 0xbc50
+¼Q 0xbc51
+¼R 0xbc52
+¼S 0xbc53
+¼T 0xbc54
+¼U 0xbc55
+¼V 0xbc56
+¼W 0xbc57
+¼X 0xbc58
+¼Y 0xbc59
+¼Z 0xbc5a
+¼[ 0xbc5b
+¼\ 0xbc5c
+¼] 0xbc5d
+¼^ 0xbc5e
+¼_ 0xbc5f
+¼` 0xbc60
+¼a 0xbc61
+¼b 0xbc62
+¼c 0xbc63
+¼d 0xbc64
+¼e 0xbc65
+¼f 0xbc66
+¼g 0xbc67
+¼h 0xbc68
+¼i 0xbc69
+¼j 0xbc6a
+¼k 0xbc6b
+¼l 0xbc6c
+¼m 0xbc6d
+¼n 0xbc6e
+¼o 0xbc6f
+¼p 0xbc70
+¼q 0xbc71
+¼r 0xbc72
+¼s 0xbc73
+¼t 0xbc74
+¼u 0xbc75
+¼v 0xbc76
+¼w 0xbc77
+¼x 0xbc78
+¼y 0xbc79
+¼z 0xbc7a
+¼{ 0xbc7b
+¼| 0xbc7c
+¼} 0xbc7d
+¼~ 0xbc7e
+¼¡ 0xbca1
+¼¢ 0xbca2
+¼£ 0xbca3
+¼¤ 0xbca4
+¼¥ 0xbca5
+¼¦ 0xbca6
+¼§ 0xbca7
+¼¨ 0xbca8
+¼© 0xbca9
+¼ª 0xbcaa
+¼« 0xbcab
+¼¬ 0xbcac
+¼­ 0xbcad
+¼® 0xbcae
+¼¯ 0xbcaf
+¼° 0xbcb0
+¼± 0xbcb1
+¼² 0xbcb2
+¼³ 0xbcb3
+¼´ 0xbcb4
+¼µ 0xbcb5
+¼¶ 0xbcb6
+¼· 0xbcb7
+¼¸ 0xbcb8
+¼¹ 0xbcb9
+¼º 0xbcba
+¼» 0xbcbb
+¼¼ 0xbcbc
+¼½ 0xbcbd
+¼¾ 0xbcbe
+¼¿ 0xbcbf
+¼À 0xbcc0
+¼Á 0xbcc1
+¼Â 0xbcc2
+¼Ã 0xbcc3
+¼Ä 0xbcc4
+¼Å 0xbcc5
+¼Æ 0xbcc6
+¼Ç 0xbcc7
+¼È 0xbcc8
+¼É 0xbcc9
+¼Ê 0xbcca
+¼Ë 0xbccb
+¼Ì 0xbccc
+¼Í 0xbccd
+¼Î 0xbcce
+¼Ï 0xbccf
+¼Ð 0xbcd0
+¼Ñ 0xbcd1
+¼Ò 0xbcd2
+¼Ó 0xbcd3
+¼Ô 0xbcd4
+¼Õ 0xbcd5
+¼Ö 0xbcd6
+¼× 0xbcd7
+¼Ø 0xbcd8
+¼Ù 0xbcd9
+¼Ú 0xbcda
+¼Û 0xbcdb
+¼Ü 0xbcdc
+¼Ý 0xbcdd
+¼Þ 0xbcde
+¼ß 0xbcdf
+¼à 0xbce0
+¼á 0xbce1
+¼â 0xbce2
+¼ã 0xbce3
+¼ä 0xbce4
+¼å 0xbce5
+¼æ 0xbce6
+¼ç 0xbce7
+¼è 0xbce8
+¼é 0xbce9
+¼ê 0xbcea
+¼ë 0xbceb
+¼ì 0xbcec
+¼í 0xbced
+¼î 0xbcee
+¼ï 0xbcef
+¼ð 0xbcf0
+¼ñ 0xbcf1
+¼ò 0xbcf2
+¼ó 0xbcf3
+¼ô 0xbcf4
+¼õ 0xbcf5
+¼ö 0xbcf6
+¼÷ 0xbcf7
+¼ø 0xbcf8
+¼ù 0xbcf9
+¼ú 0xbcfa
+¼û 0xbcfb
+¼ü 0xbcfc
+¼ý 0xbcfd
+¼þ 0xbcfe
+½@ 0xbd40
+½A 0xbd41
+½B 0xbd42
+½C 0xbd43
+½D 0xbd44
+½E 0xbd45
+½F 0xbd46
+½G 0xbd47
+½H 0xbd48
+½I 0xbd49
+½J 0xbd4a
+½K 0xbd4b
+½L 0xbd4c
+½M 0xbd4d
+½N 0xbd4e
+½O 0xbd4f
+½P 0xbd50
+½Q 0xbd51
+½R 0xbd52
+½S 0xbd53
+½T 0xbd54
+½U 0xbd55
+½V 0xbd56
+½W 0xbd57
+½X 0xbd58
+½Y 0xbd59
+½Z 0xbd5a
+½[ 0xbd5b
+½\ 0xbd5c
+½] 0xbd5d
+½^ 0xbd5e
+½_ 0xbd5f
+½` 0xbd60
+½a 0xbd61
+½b 0xbd62
+½c 0xbd63
+½d 0xbd64
+½e 0xbd65
+½f 0xbd66
+½g 0xbd67
+½h 0xbd68
+½i 0xbd69
+½j 0xbd6a
+½k 0xbd6b
+½l 0xbd6c
+½m 0xbd6d
+½n 0xbd6e
+½o 0xbd6f
+½p 0xbd70
+½q 0xbd71
+½r 0xbd72
+½s 0xbd73
+½t 0xbd74
+½u 0xbd75
+½v 0xbd76
+½w 0xbd77
+½x 0xbd78
+½y 0xbd79
+½z 0xbd7a
+½{ 0xbd7b
+½| 0xbd7c
+½} 0xbd7d
+½~ 0xbd7e
+½¡ 0xbda1
+½¢ 0xbda2
+½£ 0xbda3
+½¤ 0xbda4
+½¥ 0xbda5
+½¦ 0xbda6
+½§ 0xbda7
+½¨ 0xbda8
+½© 0xbda9
+½ª 0xbdaa
+½« 0xbdab
+½¬ 0xbdac
+½­ 0xbdad
+½® 0xbdae
+½¯ 0xbdaf
+½° 0xbdb0
+½± 0xbdb1
+½² 0xbdb2
+½³ 0xbdb3
+½´ 0xbdb4
+½µ 0xbdb5
+½¶ 0xbdb6
+½· 0xbdb7
+½¸ 0xbdb8
+½¹ 0xbdb9
+½º 0xbdba
+½» 0xbdbb
+½¼ 0xbdbc
+½½ 0xbdbd
+½¾ 0xbdbe
+½¿ 0xbdbf
+½À 0xbdc0
+½Á 0xbdc1
+½Â 0xbdc2
+½Ã 0xbdc3
+½Ä 0xbdc4
+½Å 0xbdc5
+½Æ 0xbdc6
+½Ç 0xbdc7
+½È 0xbdc8
+½É 0xbdc9
+½Ê 0xbdca
+½Ë 0xbdcb
+½Ì 0xbdcc
+½Í 0xbdcd
+½Î 0xbdce
+½Ï 0xbdcf
+½Ð 0xbdd0
+½Ñ 0xbdd1
+½Ò 0xbdd2
+½Ó 0xbdd3
+½Ô 0xbdd4
+½Õ 0xbdd5
+½Ö 0xbdd6
+½× 0xbdd7
+½Ø 0xbdd8
+½Ù 0xbdd9
+½Ú 0xbdda
+½Û 0xbddb
+½Ü 0xbddc
+½Ý 0xbddd
+½Þ 0xbdde
+½ß 0xbddf
+½à 0xbde0
+½á 0xbde1
+½â 0xbde2
+½ã 0xbde3
+½ä 0xbde4
+½å 0xbde5
+½æ 0xbde6
+½ç 0xbde7
+½è 0xbde8
+½é 0xbde9
+½ê 0xbdea
+½ë 0xbdeb
+½ì 0xbdec
+½í 0xbded
+½î 0xbdee
+½ï 0xbdef
+½ð 0xbdf0
+½ñ 0xbdf1
+½ò 0xbdf2
+½ó 0xbdf3
+½ô 0xbdf4
+½õ 0xbdf5
+½ö 0xbdf6
+½÷ 0xbdf7
+½ø 0xbdf8
+½ù 0xbdf9
+½ú 0xbdfa
+½û 0xbdfb
+½ü 0xbdfc
+½ý 0xbdfd
+½þ 0xbdfe
+¾@ 0xbe40
+¾A 0xbe41
+¾B 0xbe42
+¾C 0xbe43
+¾D 0xbe44
+¾E 0xbe45
+¾F 0xbe46
+¾G 0xbe47
+¾H 0xbe48
+¾I 0xbe49
+¾J 0xbe4a
+¾K 0xbe4b
+¾L 0xbe4c
+¾M 0xbe4d
+¾N 0xbe4e
+¾O 0xbe4f
+¾P 0xbe50
+¾Q 0xbe51
+¾R 0xbe52
+¾S 0xbe53
+¾T 0xbe54
+¾U 0xbe55
+¾V 0xbe56
+¾W 0xbe57
+¾X 0xbe58
+¾Y 0xbe59
+¾Z 0xbe5a
+¾[ 0xbe5b
+¾\ 0xbe5c
+¾] 0xbe5d
+¾^ 0xbe5e
+¾_ 0xbe5f
+¾` 0xbe60
+¾a 0xbe61
+¾b 0xbe62
+¾c 0xbe63
+¾d 0xbe64
+¾e 0xbe65
+¾f 0xbe66
+¾g 0xbe67
+¾h 0xbe68
+¾i 0xbe69
+¾j 0xbe6a
+¾k 0xbe6b
+¾l 0xbe6c
+¾m 0xbe6d
+¾n 0xbe6e
+¾o 0xbe6f
+¾p 0xbe70
+¾q 0xbe71
+¾r 0xbe72
+¾s 0xbe73
+¾t 0xbe74
+¾u 0xbe75
+¾v 0xbe76
+¾w 0xbe77
+¾x 0xbe78
+¾y 0xbe79
+¾z 0xbe7a
+¾{ 0xbe7b
+¾| 0xbe7c
+¾} 0xbe7d
+¾~ 0xbe7e
+¾¡ 0xbea1
+¾¢ 0xbea2
+¾£ 0xbea3
+¾¤ 0xbea4
+¾¥ 0xbea5
+¾¦ 0xbea6
+¾§ 0xbea7
+¾¨ 0xbea8
+¾© 0xbea9
+¾ª 0xbeaa
+¾« 0xbeab
+¾¬ 0xbeac
+¾­ 0xbead
+¾® 0xbeae
+¾¯ 0xbeaf
+¾° 0xbeb0
+¾± 0xbeb1
+¾² 0xbeb2
+¾³ 0xbeb3
+¾´ 0xbeb4
+¾µ 0xbeb5
+¾¶ 0xbeb6
+¾· 0xbeb7
+¾¸ 0xbeb8
+¾¹ 0xbeb9
+¾º 0xbeba
+¾» 0xbebb
+¾¼ 0xbebc
+¾½ 0xbebd
+¾¾ 0xbebe
+¾¿ 0xbebf
+¾À 0xbec0
+¾Á 0xbec1
+¾Â 0xbec2
+¾Ã 0xbec3
+¾Ä 0xbec4
+¾Å 0xbec5
+¾Æ 0xbec6
+¾Ç 0xbec7
+¾È 0xbec8
+¾É 0xbec9
+¾Ê 0xbeca
+¾Ë 0xbecb
+¾Ì 0xbecc
+¾Í 0xbecd
+¾Î 0xbece
+¾Ï 0xbecf
+¾Ð 0xbed0
+¾Ñ 0xbed1
+¾Ò 0xbed2
+¾Ó 0xbed3
+¾Ô 0xbed4
+¾Õ 0xbed5
+¾Ö 0xbed6
+¾× 0xbed7
+¾Ø 0xbed8
+¾Ù 0xbed9
+¾Ú 0xbeda
+¾Û 0xbedb
+¾Ü 0xbedc
+¾Ý 0xbedd
+¾Þ 0xbede
+¾ß 0xbedf
+¾à 0xbee0
+¾á 0xbee1
+¾â 0xbee2
+¾ã 0xbee3
+¾ä 0xbee4
+¾å 0xbee5
+¾æ 0xbee6
+¾ç 0xbee7
+¾è 0xbee8
+¾é 0xbee9
+¾ê 0xbeea
+¾ë 0xbeeb
+¾ì 0xbeec
+¾í 0xbeed
+¾î 0xbeee
+¾ï 0xbeef
+¾ð 0xbef0
+¾ñ 0xbef1
+¾ò 0xbef2
+¾ó 0xbef3
+¾ô 0xbef4
+¾õ 0xbef5
+¾ö 0xbef6
+¾÷ 0xbef7
+¾ø 0xbef8
+¾ù 0xbef9
+¾ú 0xbefa
+¾û 0xbefb
+¾ü 0xbefc
+¾ý 0xbefd
+¾þ 0xbefe
+¿@ 0xbf40
+¿A 0xbf41
+¿B 0xbf42
+¿C 0xbf43
+¿D 0xbf44
+¿E 0xbf45
+¿F 0xbf46
+¿G 0xbf47
+¿H 0xbf48
+¿I 0xbf49
+¿J 0xbf4a
+¿K 0xbf4b
+¿L 0xbf4c
+¿M 0xbf4d
+¿N 0xbf4e
+¿O 0xbf4f
+¿P 0xbf50
+¿Q 0xbf51
+¿R 0xbf52
+¿S 0xbf53
+¿T 0xbf54
+¿U 0xbf55
+¿V 0xbf56
+¿W 0xbf57
+¿X 0xbf58
+¿Y 0xbf59
+¿Z 0xbf5a
+¿[ 0xbf5b
+¿\ 0xbf5c
+¿] 0xbf5d
+¿^ 0xbf5e
+¿_ 0xbf5f
+¿` 0xbf60
+¿a 0xbf61
+¿b 0xbf62
+¿c 0xbf63
+¿d 0xbf64
+¿e 0xbf65
+¿f 0xbf66
+¿g 0xbf67
+¿h 0xbf68
+¿i 0xbf69
+¿j 0xbf6a
+¿k 0xbf6b
+¿l 0xbf6c
+¿m 0xbf6d
+¿n 0xbf6e
+¿o 0xbf6f
+¿p 0xbf70
+¿q 0xbf71
+¿r 0xbf72
+¿s 0xbf73
+¿t 0xbf74
+¿u 0xbf75
+¿v 0xbf76
+¿w 0xbf77
+¿x 0xbf78
+¿y 0xbf79
+¿z 0xbf7a
+¿{ 0xbf7b
+¿| 0xbf7c
+¿} 0xbf7d
+¿~ 0xbf7e
+¿¡ 0xbfa1
+¿¢ 0xbfa2
+¿£ 0xbfa3
+¿¤ 0xbfa4
+¿¥ 0xbfa5
+¿¦ 0xbfa6
+¿§ 0xbfa7
+¿¨ 0xbfa8
+¿© 0xbfa9
+¿ª 0xbfaa
+¿« 0xbfab
+¿¬ 0xbfac
+¿­ 0xbfad
+¿® 0xbfae
+¿¯ 0xbfaf
+¿° 0xbfb0
+¿± 0xbfb1
+¿² 0xbfb2
+¿³ 0xbfb3
+¿´ 0xbfb4
+¿µ 0xbfb5
+¿¶ 0xbfb6
+¿· 0xbfb7
+¿¸ 0xbfb8
+¿¹ 0xbfb9
+¿º 0xbfba
+¿» 0xbfbb
+¿¼ 0xbfbc
+¿½ 0xbfbd
+¿¾ 0xbfbe
+¿¿ 0xbfbf
+¿À 0xbfc0
+¿Á 0xbfc1
+¿Â 0xbfc2
+¿Ã 0xbfc3
+¿Ä 0xbfc4
+¿Å 0xbfc5
+¿Æ 0xbfc6
+¿Ç 0xbfc7
+¿È 0xbfc8
+¿É 0xbfc9
+¿Ê 0xbfca
+¿Ë 0xbfcb
+¿Ì 0xbfcc
+¿Í 0xbfcd
+¿Î 0xbfce
+¿Ï 0xbfcf
+¿Ð 0xbfd0
+¿Ñ 0xbfd1
+¿Ò 0xbfd2
+¿Ó 0xbfd3
+¿Ô 0xbfd4
+¿Õ 0xbfd5
+¿Ö 0xbfd6
+¿× 0xbfd7
+¿Ø 0xbfd8
+¿Ù 0xbfd9
+¿Ú 0xbfda
+¿Û 0xbfdb
+¿Ü 0xbfdc
+¿Ý 0xbfdd
+¿Þ 0xbfde
+¿ß 0xbfdf
+¿à 0xbfe0
+¿á 0xbfe1
+¿â 0xbfe2
+¿ã 0xbfe3
+¿ä 0xbfe4
+¿å 0xbfe5
+¿æ 0xbfe6
+¿ç 0xbfe7
+¿è 0xbfe8
+¿é 0xbfe9
+¿ê 0xbfea
+¿ë 0xbfeb
+¿ì 0xbfec
+¿í 0xbfed
+¿î 0xbfee
+¿ï 0xbfef
+¿ð 0xbff0
+¿ñ 0xbff1
+¿ò 0xbff2
+¿ó 0xbff3
+¿ô 0xbff4
+¿õ 0xbff5
+¿ö 0xbff6
+¿÷ 0xbff7
+¿ø 0xbff8
+¿ù 0xbff9
+¿ú 0xbffa
+¿û 0xbffb
+¿ü 0xbffc
+¿ý 0xbffd
+¿þ 0xbffe
+À@ 0xc040
+ÀA 0xc041
+ÀB 0xc042
+ÀC 0xc043
+ÀD 0xc044
+ÀE 0xc045
+ÀF 0xc046
+ÀG 0xc047
+ÀH 0xc048
+ÀI 0xc049
+ÀJ 0xc04a
+ÀK 0xc04b
+ÀL 0xc04c
+ÀM 0xc04d
+ÀN 0xc04e
+ÀO 0xc04f
+ÀP 0xc050
+ÀQ 0xc051
+ÀR 0xc052
+ÀS 0xc053
+ÀT 0xc054
+ÀU 0xc055
+ÀV 0xc056
+ÀW 0xc057
+ÀX 0xc058
+ÀY 0xc059
+ÀZ 0xc05a
+À[ 0xc05b
+À\ 0xc05c
+À] 0xc05d
+À^ 0xc05e
+À_ 0xc05f
+À` 0xc060
+Àa 0xc061
+Àb 0xc062
+Àc 0xc063
+Àd 0xc064
+Àe 0xc065
+Àf 0xc066
+Àg 0xc067
+Àh 0xc068
+Ài 0xc069
+Àj 0xc06a
+Àk 0xc06b
+Àl 0xc06c
+Àm 0xc06d
+Àn 0xc06e
+Ào 0xc06f
+Àp 0xc070
+Àq 0xc071
+Àr 0xc072
+Às 0xc073
+Àt 0xc074
+Àu 0xc075
+Àv 0xc076
+Àw 0xc077
+Àx 0xc078
+Ày 0xc079
+Àz 0xc07a
+À{ 0xc07b
+À| 0xc07c
+À} 0xc07d
+À~ 0xc07e
+À¡ 0xc0a1
+À¢ 0xc0a2
+À£ 0xc0a3
+À¤ 0xc0a4
+À¥ 0xc0a5
+À¦ 0xc0a6
+ˤ 0xc0a7
+ˬ 0xc0a8
+À© 0xc0a9
+˻ 0xc0aa
+À« 0xc0ab
+À¬ 0xc0ac
+À­ 0xc0ad
+À® 0xc0ae
+À¯ 0xc0af
+À° 0xc0b0
+˱ 0xc0b1
+À² 0xc0b2
+À³ 0xc0b3
+À´ 0xc0b4
+˵ 0xc0b5
+˦ 0xc0b6
+À· 0xc0b7
+À¸ 0xc0b8
+À¹ 0xc0b9
+˼ 0xc0ba
+À» 0xc0bb
+À¼ 0xc0bc
+À½ 0xc0bd
+À¾ 0xc0be
+À¿ 0xc0bf
+ÀÀ 0xc0c0
+ÀÁ 0xc0c1
+ÀÂ 0xc0c2
+ÀÃ 0xc0c3
+ÀÄ 0xc0c4
+ÀÅ 0xc0c5
+ÀÆ 0xc0c6
+ÀÇ 0xc0c7
+ÀÈ 0xc0c8
+ÀÉ 0xc0c9
+ÀÊ 0xc0ca
+ÀË 0xc0cb
+ÀÌ 0xc0cc
+ÀÍ 0xc0cd
+ÀÎ 0xc0ce
+ÀÏ 0xc0cf
+ÀÐ 0xc0d0
+ÀÑ 0xc0d1
+ÀÒ 0xc0d2
+ÀÓ 0xc0d3
+ÀÔ 0xc0d4
+ÀÕ 0xc0d5
+ÀÖ 0xc0d6
+À× 0xc0d7
+ÀØ 0xc0d8
+ÀÙ 0xc0d9
+ÀÚ 0xc0da
+ÀÛ 0xc0db
+ÀÜ 0xc0dc
+ÀÝ 0xc0dd
+ÀÞ 0xc0de
+Àß 0xc0df
+Àà 0xc0e0
+Àá 0xc0e1
+Àâ 0xc0e2
+Àã 0xc0e3
+Àä 0xc0e4
+Àå 0xc0e5
+Àæ 0xc0e6
+Àç 0xc0e7
+Àè 0xc0e8
+Àé 0xc0e9
+Àê 0xc0ea
+Àë 0xc0eb
+Àì 0xc0ec
+Àí 0xc0ed
+Àî 0xc0ee
+Àï 0xc0ef
+Àð 0xc0f0
+Àñ 0xc0f1
+Àò 0xc0f2
+Àó 0xc0f3
+Àô 0xc0f4
+Àõ 0xc0f5
+Àö 0xc0f6
+À÷ 0xc0f7
+Àø 0xc0f8
+Àù 0xc0f9
+Àú 0xc0fa
+Àû 0xc0fb
+Àü 0xc0fc
+Àý 0xc0fd
+Àþ 0xc0fe
+Á@ 0xc140
+ÁA 0xc141
+ÁB 0xc142
+ÁC 0xc143
+ÁD 0xc144
+ÁE 0xc145
+ÁF 0xc146
+ÁG 0xc147
+ÁH 0xc148
+ÁI 0xc149
+ÁJ 0xc14a
+ÁK 0xc14b
+ÁL 0xc14c
+ÁM 0xc14d
+ÁN 0xc14e
+ÁO 0xc14f
+ÁP 0xc150
+ÁQ 0xc151
+ÁR 0xc152
+ÁS 0xc153
+ÁT 0xc154
+ÁU 0xc155
+ÁV 0xc156
+ÁW 0xc157
+ÁX 0xc158
+ÁY 0xc159
+ÁZ 0xc15a
+Á[ 0xc15b
+Á\ 0xc15c
+Á] 0xc15d
+Á^ 0xc15e
+Á_ 0xc15f
+Á` 0xc160
+Áa 0xc161
+Áb 0xc162
+Ác 0xc163
+Ád 0xc164
+Áe 0xc165
+Áf 0xc166
+Ág 0xc167
+Áh 0xc168
+Ái 0xc169
+Áj 0xc16a
+Ák 0xc16b
+Ál 0xc16c
+Ám 0xc16d
+Án 0xc16e
+Áo 0xc16f
+Áp 0xc170
+Áq 0xc171
+Ár 0xc172
+Ás 0xc173
+Át 0xc174
+Áu 0xc175
+Áv 0xc176
+Áw 0xc177
+Áx 0xc178
+Áy 0xc179
+Áz 0xc17a
+Á{ 0xc17b
+Á| 0xc17c
+Á} 0xc17d
+Á~ 0xc17e
+Á¡ 0xc1a1
+Á¢ 0xc1a2
+Á£ 0xc1a3
+Á¤ 0xc1a4
+Á¥ 0xc1a5
+Á¦ 0xc1a6
+Á§ 0xc1a7
+Á¨ 0xc1a8
+Á© 0xc1a9
+Áª 0xc1aa
+Á« 0xc1ab
+Á¬ 0xc1ac
+Á­ 0xc1ad
+Á® 0xc1ae
+Á¯ 0xc1af
+Á° 0xc1b0
+Á± 0xc1b1
+Á² 0xc1b2
+Á³ 0xc1b3
+Á´ 0xc1b4
+Áµ 0xc1b5
+Á¶ 0xc1b6
+Á· 0xc1b7
+Á¸ 0xc1b8
+Á¹ 0xc1b9
+Áº 0xc1ba
+Á» 0xc1bb
+Á¼ 0xc1bc
+Á½ 0xc1bd
+Á¾ 0xc1be
+Á¿ 0xc1bf
+ÁÀ 0xc1c0
+ÁÁ 0xc1c1
+ÁÂ 0xc1c2
+ÁÃ 0xc1c3
+ÁÄ 0xc1c4
+ÁÅ 0xc1c5
+ÁÆ 0xc1c6
+ÁÇ 0xc1c7
+ÁÈ 0xc1c8
+ÁÉ 0xc1c9
+ÁÊ 0xc1ca
+ÁË 0xc1cb
+ÁÌ 0xc1cc
+ÁÍ 0xc1cd
+ÁÎ 0xc1ce
+ÁÏ 0xc1cf
+ÁÐ 0xc1d0
+ÁÑ 0xc1d1
+ÁÒ 0xc1d2
+ÁÓ 0xc1d3
+ÁÔ 0xc1d4
+ÁÕ 0xc1d5
+ÁÖ 0xc1d6
+Á× 0xc1d7
+ÁØ 0xc1d8
+ÁÙ 0xc1d9
+ÁÚ 0xc1da
+ÁÛ 0xc1db
+ÁÜ 0xc1dc
+ÁÝ 0xc1dd
+ÁÞ 0xc1de
+Áß 0xc1df
+Áà 0xc1e0
+Áá 0xc1e1
+Áâ 0xc1e2
+Áã 0xc1e3
+Áä 0xc1e4
+Áå 0xc1e5
+Áæ 0xc1e6
+Áç 0xc1e7
+Áè 0xc1e8
+Áé 0xc1e9
+Áê 0xc1ea
+Áë 0xc1eb
+Áì 0xc1ec
+Áí 0xc1ed
+Áî 0xc1ee
+Áï 0xc1ef
+Áð 0xc1f0
+Áñ 0xc1f1
+Áò 0xc1f2
+Áó 0xc1f3
+Áô 0xc1f4
+Áõ 0xc1f5
+Áö 0xc1f6
+Á÷ 0xc1f7
+Áø 0xc1f8
+Áù 0xc1f9
+Áú 0xc1fa
+Áû 0xc1fb
+Áü 0xc1fc
+Áý 0xc1fd
+Áþ 0xc1fe
+Â@ 0xc240
+ÂA 0xc241
+ÂB 0xc242
+ÂC 0xc243
+ÂD 0xc244
+ÂE 0xc245
+ÂF 0xc246
+ÂG 0xc247
+ÂH 0xc248
+ÂI 0xc249
+ÂJ 0xc24a
+ÂK 0xc24b
+ÂL 0xc24c
+ÂM 0xc24d
+ÂN 0xc24e
+ÂO 0xc24f
+ÂP 0xc250
+ÂQ 0xc251
+ÂR 0xc252
+ÂS 0xc253
+ÂT 0xc254
+ÂU 0xc255
+ÂV 0xc256
+ÂW 0xc257
+ÂX 0xc258
+ÂY 0xc259
+ÂZ 0xc25a
+Â[ 0xc25b
+Â\ 0xc25c
+Â] 0xc25d
+Â^ 0xc25e
+Â_ 0xc25f
+Â` 0xc260
+Âa 0xc261
+Âb 0xc262
+Âc 0xc263
+Âd 0xc264
+Âe 0xc265
+Âf 0xc266
+Âg 0xc267
+Âh 0xc268
+Âi 0xc269
+Âj 0xc26a
+Âk 0xc26b
+Âl 0xc26c
+Âm 0xc26d
+Ân 0xc26e
+Âo 0xc26f
+Âp 0xc270
+Âq 0xc271
+Âr 0xc272
+Âs 0xc273
+Ât 0xc274
+Âu 0xc275
+Âv 0xc276
+Âw 0xc277
+Âx 0xc278
+Ây 0xc279
+Âz 0xc27a
+Â{ 0xc27b
+Â| 0xc27c
+Â} 0xc27d
+Â~ 0xc27e
+¡ 0xc2a1
+¢ 0xc2a2
+£ 0xc2a3
+¤ 0xc2a4
+Â¥ 0xc2a5
+¦ 0xc2a6
+§ 0xc2a7
+¨ 0xc2a8
+© 0xc2a9
+ª 0xc2aa
+« 0xc2ab
+¬ 0xc2ac
+­ 0xc2ad
+® 0xc2ae
+¯ 0xc2af
+° 0xc2b0
+± 0xc2b1
+² 0xc2b2
+³ 0xc2b3
+´ 0xc2b4
+µ 0xc2b5
+¶ 0xc2b6
+· 0xc2b7
+¸ 0xc2b8
+¹ 0xc2b9
+º 0xc2ba
+» 0xc2bb
+¼ 0xc2bc
+½ 0xc2bd
+¾ 0xc2be
+¿ 0xc2bf
+ÂÀ 0xc2c0
+ÂÁ 0xc2c1
+ÂÂ 0xc2c2
+ÂÃ 0xc2c3
+ÂÄ 0xc2c4
+ÂÅ 0xc2c5
+ÂÆ 0xc2c6
+ÂÇ 0xc2c7
+ÂÈ 0xc2c8
+ÂÉ 0xc2c9
+ÂÊ 0xc2ca
+ÂË 0xc2cb
+ÂÌ 0xc2cc
+ÂÍ 0xc2cd
+ÂÎ 0xc2ce
+ÂÏ 0xc2cf
+ÂÐ 0xc2d0
+ÂÑ 0xc2d1
+ÂÒ 0xc2d2
+ÂÓ 0xc2d3
+ÂÔ 0xc2d4
+ÂÕ 0xc2d5
+ÂÖ 0xc2d6
+Â× 0xc2d7
+ÂØ 0xc2d8
+ÂÙ 0xc2d9
+ÂÚ 0xc2da
+ÂÛ 0xc2db
+ÂÜ 0xc2dc
+ÂÝ 0xc2dd
+ÂÞ 0xc2de
+Âß 0xc2df
+Âà 0xc2e0
+Âá 0xc2e1
+Ââ 0xc2e2
+Âã 0xc2e3
+Âä 0xc2e4
+Âå 0xc2e5
+Âæ 0xc2e6
+Âç 0xc2e7
+Âè 0xc2e8
+Âé 0xc2e9
+Âê 0xc2ea
+Âë 0xc2eb
+Âì 0xc2ec
+Âí 0xc2ed
+Âî 0xc2ee
+Âï 0xc2ef
+Âð 0xc2f0
+Âñ 0xc2f1
+Âò 0xc2f2
+Âó 0xc2f3
+Âô 0xc2f4
+Âõ 0xc2f5
+Âö 0xc2f6
+Â÷ 0xc2f7
+Âø 0xc2f8
+Âù 0xc2f9
+Âú 0xc2fa
+Âû 0xc2fb
+Âü 0xc2fc
+Âý 0xc2fd
+Âþ 0xc2fe
+Ã@ 0xc340
+ÃA 0xc341
+ÃB 0xc342
+ÃC 0xc343
+ÃD 0xc344
+ÃE 0xc345
+ÃF 0xc346
+ÃG 0xc347
+ÃH 0xc348
+ÃI 0xc349
+ÃJ 0xc34a
+ÃK 0xc34b
+ÃL 0xc34c
+ÃM 0xc34d
+ÃN 0xc34e
+ÃO 0xc34f
+ÃP 0xc350
+ÃQ 0xc351
+ÃR 0xc352
+ÃS 0xc353
+ÃT 0xc354
+ÃU 0xc355
+ÃV 0xc356
+ÃW 0xc357
+ÃX 0xc358
+ÃY 0xc359
+ÃZ 0xc35a
+Ã[ 0xc35b
+Ã\ 0xc35c
+Ã] 0xc35d
+Ã^ 0xc35e
+Ã_ 0xc35f
+Ã` 0xc360
+Ãa 0xc361
+Ãb 0xc362
+Ãc 0xc363
+Ãd 0xc364
+Ãe 0xc365
+Ãf 0xc366
+Ãg 0xc367
+Ãh 0xc368
+Ãi 0xc369
+Ãj 0xc36a
+Ãk 0xc36b
+Ãl 0xc36c
+Ãm 0xc36d
+Ãn 0xc36e
+Ão 0xc36f
+Ãp 0xc370
+Ãq 0xc371
+Ãr 0xc372
+Ãs 0xc373
+Ãt 0xc374
+Ãu 0xc375
+Ãv 0xc376
+Ãw 0xc377
+Ãx 0xc378
+Ãy 0xc379
+Ãz 0xc37a
+Ã{ 0xc37b
+Ã| 0xc37c
+Ã} 0xc37d
+Ã~ 0xc37e
+á 0xc3a1
+â 0xc3a2
+ã 0xc3a3
+ä 0xc3a4
+Ã¥ 0xc3a5
+æ 0xc3a6
+ç 0xc3a7
+è 0xc3a8
+é 0xc3a9
+ê 0xc3aa
+ë 0xc3ab
+ì 0xc3ac
+í 0xc3ad
+î 0xc3ae
+ï 0xc3af
+ð 0xc3b0
+ñ 0xc3b1
+ò 0xc3b2
+ó 0xc3b3
+ô 0xc3b4
+õ 0xc3b5
+ö 0xc3b6
+÷ 0xc3b7
+ø 0xc3b8
+ù 0xc3b9
+ú 0xc3ba
+û 0xc3bb
+ü 0xc3bc
+ý 0xc3bd
+þ 0xc3be
+ÿ 0xc3bf
+ÃÀ 0xc3c0
+ÃÁ 0xc3c1
+ÃÂ 0xc3c2
+ÃÃ 0xc3c3
+ÃÄ 0xc3c4
+ÃÅ 0xc3c5
+ÃÆ 0xc3c6
+ÃÇ 0xc3c7
+ÃÈ 0xc3c8
+ÃÉ 0xc3c9
+ÃÊ 0xc3ca
+ÃË 0xc3cb
+ÃÌ 0xc3cc
+ÃÍ 0xc3cd
+ÃÎ 0xc3ce
+ÃÏ 0xc3cf
+ÃÐ 0xc3d0
+ÃÑ 0xc3d1
+ÃÒ 0xc3d2
+ÃÓ 0xc3d3
+ÃÔ 0xc3d4
+ÃÕ 0xc3d5
+ÃÖ 0xc3d6
+Ã× 0xc3d7
+ÃØ 0xc3d8
+ÃÙ 0xc3d9
+ÃÚ 0xc3da
+ÃÛ 0xc3db
+ÃÜ 0xc3dc
+ÃÝ 0xc3dd
+ÃÞ 0xc3de
+Ãß 0xc3df
+Ãà 0xc3e0
+Ãá 0xc3e1
+Ãâ 0xc3e2
+Ãã 0xc3e3
+Ãä 0xc3e4
+Ãå 0xc3e5
+Ãæ 0xc3e6
+Ãç 0xc3e7
+Ãè 0xc3e8
+Ãé 0xc3e9
+Ãê 0xc3ea
+Ãë 0xc3eb
+Ãì 0xc3ec
+Ãí 0xc3ed
+Ãî 0xc3ee
+Ãï 0xc3ef
+Ãð 0xc3f0
+Ãñ 0xc3f1
+Ãò 0xc3f2
+Ãó 0xc3f3
+Ãô 0xc3f4
+Ãõ 0xc3f5
+Ãö 0xc3f6
+Ã÷ 0xc3f7
+Ãø 0xc3f8
+Ãù 0xc3f9
+Ãú 0xc3fa
+Ãû 0xc3fb
+Ãü 0xc3fc
+Ãý 0xc3fd
+Ãþ 0xc3fe
+Ä@ 0xc440
+ÄA 0xc441
+ÄB 0xc442
+ÄC 0xc443
+ÄD 0xc444
+ÄE 0xc445
+ÄF 0xc446
+ÄG 0xc447
+ÄH 0xc448
+ÄI 0xc449
+ÄJ 0xc44a
+ÄK 0xc44b
+ÄL 0xc44c
+ÄM 0xc44d
+ÄN 0xc44e
+ÄO 0xc44f
+ÄP 0xc450
+ÄQ 0xc451
+ÄR 0xc452
+ÄS 0xc453
+ÄT 0xc454
+ÄU 0xc455
+ÄV 0xc456
+ÄW 0xc457
+ÄX 0xc458
+ÄY 0xc459
+ÄZ 0xc45a
+Ä[ 0xc45b
+Ä\ 0xc45c
+Ä] 0xc45d
+Ä^ 0xc45e
+Ä_ 0xc45f
+Ä` 0xc460
+Äa 0xc461
+Äb 0xc462
+Äc 0xc463
+Äd 0xc464
+Äe 0xc465
+Äf 0xc466
+Äg 0xc467
+Äh 0xc468
+Äi 0xc469
+Äj 0xc46a
+Äk 0xc46b
+Äl 0xc46c
+Äm 0xc46d
+Än 0xc46e
+Äo 0xc46f
+Äp 0xc470
+Äq 0xc471
+Är 0xc472
+Äs 0xc473
+Ät 0xc474
+Äu 0xc475
+Äv 0xc476
+Äw 0xc477
+Äx 0xc478
+Äy 0xc479
+Äz 0xc47a
+Ä{ 0xc47b
+Ä| 0xc47c
+Ä} 0xc47d
+Ä~ 0xc47e
+Ä¡ 0xc4a1
+Ä¢ 0xc4a2
+Ä£ 0xc4a3
+Ĥ 0xc4a4
+Ä¥ 0xc4a5
+Ħ 0xc4a6
+ħ 0xc4a7
+Ĩ 0xc4a8
+Ä© 0xc4a9
+Ī 0xc4aa
+Ä« 0xc4ab
+Ĭ 0xc4ac
+Ä­ 0xc4ad
+Ä® 0xc4ae
+į 0xc4af
+Ä° 0xc4b0
+ı 0xc4b1
+IJ 0xc4b2
+ij 0xc4b3
+Ä´ 0xc4b4
+ĵ 0xc4b5
+Ķ 0xc4b6
+Ä· 0xc4b7
+ĸ 0xc4b8
+Ĺ 0xc4b9
+ĺ 0xc4ba
+Ä» 0xc4bb
+ļ 0xc4bc
+Ľ 0xc4bd
+ľ 0xc4be
+Ä¿ 0xc4bf
+ÄÀ 0xc4c0
+ÄÁ 0xc4c1
+ÄÂ 0xc4c2
+ÄÃ 0xc4c3
+ÄÄ 0xc4c4
+ÄÅ 0xc4c5
+ÄÆ 0xc4c6
+ÄÇ 0xc4c7
+ÄÈ 0xc4c8
+ÄÉ 0xc4c9
+ÄÊ 0xc4ca
+ÄË 0xc4cb
+ÄÌ 0xc4cc
+ÄÍ 0xc4cd
+ÄÎ 0xc4ce
+ÄÏ 0xc4cf
+ÄÐ 0xc4d0
+ÄÑ 0xc4d1
+ÄÒ 0xc4d2
+ÄÓ 0xc4d3
+ÄÔ 0xc4d4
+ÄÕ 0xc4d5
+ÄÖ 0xc4d6
+Ä× 0xc4d7
+ÄØ 0xc4d8
+ÄÙ 0xc4d9
+ÄÚ 0xc4da
+ÄÛ 0xc4db
+ÄÜ 0xc4dc
+ÄÝ 0xc4dd
+ÄÞ 0xc4de
+Äß 0xc4df
+Äà 0xc4e0
+Äá 0xc4e1
+Äâ 0xc4e2
+Äã 0xc4e3
+Ää 0xc4e4
+Äå 0xc4e5
+Äæ 0xc4e6
+Äç 0xc4e7
+Äè 0xc4e8
+Äé 0xc4e9
+Äê 0xc4ea
+Äë 0xc4eb
+Äì 0xc4ec
+Äí 0xc4ed
+Äî 0xc4ee
+Äï 0xc4ef
+Äð 0xc4f0
+Äñ 0xc4f1
+Äò 0xc4f2
+Äó 0xc4f3
+Äô 0xc4f4
+Äõ 0xc4f5
+Äö 0xc4f6
+Ä÷ 0xc4f7
+Äø 0xc4f8
+Äù 0xc4f9
+Äú 0xc4fa
+Äû 0xc4fb
+Äü 0xc4fc
+Äý 0xc4fd
+Äþ 0xc4fe
+Å@ 0xc540
+ÅA 0xc541
+ÅB 0xc542
+ÅC 0xc543
+ÅD 0xc544
+ÅE 0xc545
+ÅF 0xc546
+ÅG 0xc547
+ÅH 0xc548
+ÅI 0xc549
+ÅJ 0xc54a
+ÅK 0xc54b
+ÅL 0xc54c
+ÅM 0xc54d
+ÅN 0xc54e
+ÅO 0xc54f
+ÅP 0xc550
+ÅQ 0xc551
+ÅR 0xc552
+ÅS 0xc553
+ÅT 0xc554
+ÅU 0xc555
+ÅV 0xc556
+ÅW 0xc557
+ÅX 0xc558
+ÅY 0xc559
+ÅZ 0xc55a
+Å[ 0xc55b
+Å\ 0xc55c
+Å] 0xc55d
+Å^ 0xc55e
+Å_ 0xc55f
+Å` 0xc560
+Åa 0xc561
+Åb 0xc562
+Åc 0xc563
+Åd 0xc564
+Åe 0xc565
+Åf 0xc566
+Åg 0xc567
+Åh 0xc568
+Åi 0xc569
+Åj 0xc56a
+Åk 0xc56b
+Ål 0xc56c
+Åm 0xc56d
+Ån 0xc56e
+Åo 0xc56f
+Åp 0xc570
+Åq 0xc571
+År 0xc572
+Ås 0xc573
+Åt 0xc574
+Åu 0xc575
+Åv 0xc576
+Åw 0xc577
+Åx 0xc578
+Åy 0xc579
+Åz 0xc57a
+Å{ 0xc57b
+Å| 0xc57c
+Å} 0xc57d
+Å~ 0xc57e
+Å¡ 0xc5a1
+Å¢ 0xc5a2
+Å£ 0xc5a3
+Ť 0xc5a4
+Å¥ 0xc5a5
+Ŧ 0xc5a6
+ŧ 0xc5a7
+Ũ 0xc5a8
+Å© 0xc5a9
+Ū 0xc5aa
+Å« 0xc5ab
+Ŭ 0xc5ac
+Å­ 0xc5ad
+Å® 0xc5ae
+ů 0xc5af
+Å° 0xc5b0
+ű 0xc5b1
+Ų 0xc5b2
+ų 0xc5b3
+Å´ 0xc5b4
+ŵ 0xc5b5
+Ŷ 0xc5b6
+Å· 0xc5b7
+Ÿ 0xc5b8
+Ź 0xc5b9
+ź 0xc5ba
+Å» 0xc5bb
+ż 0xc5bc
+Ž 0xc5bd
+ž 0xc5be
+Å¿ 0xc5bf
+ÅÀ 0xc5c0
+ÅÁ 0xc5c1
+ÅÂ 0xc5c2
+ÅÃ 0xc5c3
+ÅÄ 0xc5c4
+ÅÅ 0xc5c5
+ÅÆ 0xc5c6
+ÅÇ 0xc5c7
+ÅÈ 0xc5c8
+ÅÉ 0xc5c9
+ÅÊ 0xc5ca
+ÅË 0xc5cb
+ÅÌ 0xc5cc
+ÅÍ 0xc5cd
+ÅÎ 0xc5ce
+ÅÏ 0xc5cf
+ÅÐ 0xc5d0
+ÅÑ 0xc5d1
+ÅÒ 0xc5d2
+ÅÓ 0xc5d3
+ÅÔ 0xc5d4
+ÅÕ 0xc5d5
+ÅÖ 0xc5d6
+Å× 0xc5d7
+ÅØ 0xc5d8
+ÅÙ 0xc5d9
+ÅÚ 0xc5da
+ÅÛ 0xc5db
+ÅÜ 0xc5dc
+ÅÝ 0xc5dd
+ÅÞ 0xc5de
+Åß 0xc5df
+Åà 0xc5e0
+Åá 0xc5e1
+Åâ 0xc5e2
+Åã 0xc5e3
+Åä 0xc5e4
+Åå 0xc5e5
+Åæ 0xc5e6
+Åç 0xc5e7
+Åè 0xc5e8
+Åé 0xc5e9
+Åê 0xc5ea
+Åë 0xc5eb
+Åì 0xc5ec
+Åí 0xc5ed
+Åî 0xc5ee
+Åï 0xc5ef
+Åð 0xc5f0
+Åñ 0xc5f1
+Åò 0xc5f2
+Åó 0xc5f3
+Åô 0xc5f4
+Åõ 0xc5f5
+Åö 0xc5f6
+Å÷ 0xc5f7
+Åø 0xc5f8
+Åù 0xc5f9
+Åú 0xc5fa
+Åû 0xc5fb
+Åü 0xc5fc
+Åý 0xc5fd
+Åþ 0xc5fe
+Æ@ 0xc640
+ÆA 0xc641
+ÆB 0xc642
+ÆC 0xc643
+ÆD 0xc644
+ÆE 0xc645
+ÆF 0xc646
+ÆG 0xc647
+ÆH 0xc648
+ÆI 0xc649
+ÆJ 0xc64a
+ÆK 0xc64b
+ÆL 0xc64c
+ÆM 0xc64d
+ÆN 0xc64e
+ÆO 0xc64f
+ÆP 0xc650
+ÆQ 0xc651
+ÆR 0xc652
+ÆS 0xc653
+ÆT 0xc654
+ÆU 0xc655
+ÆV 0xc656
+ÆW 0xc657
+ÆX 0xc658
+ÆY 0xc659
+ÆZ 0xc65a
+Æ[ 0xc65b
+Æ\ 0xc65c
+Æ] 0xc65d
+Æ^ 0xc65e
+Æ_ 0xc65f
+Æ` 0xc660
+Æa 0xc661
+Æb 0xc662
+Æc 0xc663
+Æd 0xc664
+Æe 0xc665
+Æf 0xc666
+Æg 0xc667
+Æh 0xc668
+Æi 0xc669
+Æj 0xc66a
+Æk 0xc66b
+Æl 0xc66c
+Æm 0xc66d
+Æn 0xc66e
+Æo 0xc66f
+Æp 0xc670
+Æq 0xc671
+Ær 0xc672
+Æs 0xc673
+Æt 0xc674
+Æu 0xc675
+Æv 0xc676
+Æw 0xc677
+Æx 0xc678
+Æy 0xc679
+Æz 0xc67a
+Æ{ 0xc67b
+Æ| 0xc67c
+Æ} 0xc67d
+Æ~ 0xc67e
+É@ 0xc940
+ÉA 0xc941
+ÉB 0xc942
+ÉC 0xc943
+ÉD 0xc944
+ÉE 0xc945
+ÉF 0xc946
+ÉG 0xc947
+ÉH 0xc948
+ÉI 0xc949
+ÉJ 0xc94a
+ÉK 0xc94b
+ÉL 0xc94c
+ÉM 0xc94d
+ÉN 0xc94e
+ÉO 0xc94f
+ÉP 0xc950
+ÉQ 0xc951
+ÉR 0xc952
+ÉS 0xc953
+ÉT 0xc954
+ÉU 0xc955
+ÉV 0xc956
+ÉW 0xc957
+ÉX 0xc958
+ÉY 0xc959
+ÉZ 0xc95a
+É[ 0xc95b
+É\ 0xc95c
+É] 0xc95d
+É^ 0xc95e
+É_ 0xc95f
+É` 0xc960
+Éa 0xc961
+Éb 0xc962
+Éc 0xc963
+Éd 0xc964
+Ée 0xc965
+Éf 0xc966
+Ég 0xc967
+Éh 0xc968
+Éi 0xc969
+Éj 0xc96a
+Ék 0xc96b
+Él 0xc96c
+Ém 0xc96d
+Én 0xc96e
+Éo 0xc96f
+Ép 0xc970
+Éq 0xc971
+Ér 0xc972
+És 0xc973
+Ét 0xc974
+Éu 0xc975
+Év 0xc976
+Éw 0xc977
+Éx 0xc978
+Éy 0xc979
+Éz 0xc97a
+É{ 0xc97b
+É| 0xc97c
+É} 0xc97d
+É~ 0xc97e
+É¡ 0xc9a1
+É¢ 0xc9a2
+É£ 0xc9a3
+ɤ 0xc9a4
+É¥ 0xc9a5
+ɦ 0xc9a6
+ɧ 0xc9a7
+ɨ 0xc9a8
+É© 0xc9a9
+ɪ 0xc9aa
+É« 0xc9ab
+ɬ 0xc9ac
+É­ 0xc9ad
+É® 0xc9ae
+ɯ 0xc9af
+É° 0xc9b0
+ɱ 0xc9b1
+ɲ 0xc9b2
+ɳ 0xc9b3
+É´ 0xc9b4
+ɵ 0xc9b5
+ɶ 0xc9b6
+É· 0xc9b7
+ɸ 0xc9b8
+ɹ 0xc9b9
+ɺ 0xc9ba
+É» 0xc9bb
+ɼ 0xc9bc
+ɽ 0xc9bd
+ɾ 0xc9be
+É¿ 0xc9bf
+ÉÀ 0xc9c0
+ÉÁ 0xc9c1
+ÉÂ 0xc9c2
+ÉÃ 0xc9c3
+ÉÄ 0xc9c4
+ÉÅ 0xc9c5
+ÉÆ 0xc9c6
+ÉÇ 0xc9c7
+ÉÈ 0xc9c8
+ÉÉ 0xc9c9
+ÉÊ 0xc9ca
+ÉË 0xc9cb
+ÉÌ 0xc9cc
+ÉÍ 0xc9cd
+ÉÎ 0xc9ce
+ÉÏ 0xc9cf
+ÉÐ 0xc9d0
+ÉÑ 0xc9d1
+ÉÒ 0xc9d2
+ÉÓ 0xc9d3
+ÉÔ 0xc9d4
+ÉÕ 0xc9d5
+ÉÖ 0xc9d6
+É× 0xc9d7
+ÉØ 0xc9d8
+ÉÙ 0xc9d9
+ÉÚ 0xc9da
+ÉÛ 0xc9db
+ÉÜ 0xc9dc
+ÉÝ 0xc9dd
+ÉÞ 0xc9de
+Éß 0xc9df
+Éà 0xc9e0
+Éá 0xc9e1
+Éâ 0xc9e2
+Éã 0xc9e3
+Éä 0xc9e4
+Éå 0xc9e5
+Éæ 0xc9e6
+Éç 0xc9e7
+Éè 0xc9e8
+Éé 0xc9e9
+Éê 0xc9ea
+Éë 0xc9eb
+Éì 0xc9ec
+Éí 0xc9ed
+Éî 0xc9ee
+Éï 0xc9ef
+Éð 0xc9f0
+Éñ 0xc9f1
+Éò 0xc9f2
+Éó 0xc9f3
+Éô 0xc9f4
+Éõ 0xc9f5
+Éö 0xc9f6
+É÷ 0xc9f7
+Éø 0xc9f8
+Éù 0xc9f9
+Éú 0xc9fa
+Éû 0xc9fb
+Éü 0xc9fc
+Éý 0xc9fd
+Éþ 0xc9fe
+Ê@ 0xca40
+ÊA 0xca41
+ÊB 0xca42
+ÊC 0xca43
+ÊD 0xca44
+ÊE 0xca45
+ÊF 0xca46
+ÊG 0xca47
+ÊH 0xca48
+ÊI 0xca49
+ÊJ 0xca4a
+ÊK 0xca4b
+ÊL 0xca4c
+ÊM 0xca4d
+ÊN 0xca4e
+ÊO 0xca4f
+ÊP 0xca50
+ÊQ 0xca51
+ÊR 0xca52
+ÊS 0xca53
+ÊT 0xca54
+ÊU 0xca55
+ÊV 0xca56
+ÊW 0xca57
+ÊX 0xca58
+ÊY 0xca59
+ÊZ 0xca5a
+Ê[ 0xca5b
+Ê\ 0xca5c
+Ê] 0xca5d
+Ê^ 0xca5e
+Ê_ 0xca5f
+Ê` 0xca60
+Êa 0xca61
+Êb 0xca62
+Êc 0xca63
+Êd 0xca64
+Êe 0xca65
+Êf 0xca66
+Êg 0xca67
+Êh 0xca68
+Êi 0xca69
+Êj 0xca6a
+Êk 0xca6b
+Êl 0xca6c
+Êm 0xca6d
+Ên 0xca6e
+Êo 0xca6f
+Êp 0xca70
+Êq 0xca71
+Êr 0xca72
+Ês 0xca73
+Êt 0xca74
+Êu 0xca75
+Êv 0xca76
+Êw 0xca77
+Êx 0xca78
+Êy 0xca79
+Êz 0xca7a
+Ê{ 0xca7b
+Ê| 0xca7c
+Ê} 0xca7d
+Ê~ 0xca7e
+Ê¡ 0xcaa1
+Ê¢ 0xcaa2
+Ê£ 0xcaa3
+ʤ 0xcaa4
+Ê¥ 0xcaa5
+ʦ 0xcaa6
+ʧ 0xcaa7
+ʨ 0xcaa8
+Ê© 0xcaa9
+ʪ 0xcaaa
+Ê« 0xcaab
+ʬ 0xcaac
+Ê­ 0xcaad
+Ê® 0xcaae
+ʯ 0xcaaf
+Ê° 0xcab0
+ʱ 0xcab1
+ʲ 0xcab2
+ʳ 0xcab3
+Ê´ 0xcab4
+ʵ 0xcab5
+ʶ 0xcab6
+Ê· 0xcab7
+ʸ 0xcab8
+ʹ 0xcab9
+ʺ 0xcaba
+Ê» 0xcabb
+ʼ 0xcabc
+ʽ 0xcabd
+ʾ 0xcabe
+Ê¿ 0xcabf
+ÊÀ 0xcac0
+ÊÁ 0xcac1
+ÊÂ 0xcac2
+ÊÃ 0xcac3
+ÊÄ 0xcac4
+ÊÅ 0xcac5
+ÊÆ 0xcac6
+ÊÇ 0xcac7
+ÊÈ 0xcac8
+ÊÉ 0xcac9
+ÊÊ 0xcaca
+ÊË 0xcacb
+ÊÌ 0xcacc
+ÊÍ 0xcacd
+ÊÎ 0xcace
+ÊÏ 0xcacf
+ÊÐ 0xcad0
+ÊÑ 0xcad1
+ÊÒ 0xcad2
+ÊÓ 0xcad3
+ÊÔ 0xcad4
+ÊÕ 0xcad5
+ÊÖ 0xcad6
+Ê× 0xcad7
+ÊØ 0xcad8
+ÊÙ 0xcad9
+ÊÚ 0xcada
+ÊÛ 0xcadb
+ÊÜ 0xcadc
+ÊÝ 0xcadd
+ÊÞ 0xcade
+Êß 0xcadf
+Êà 0xcae0
+Êá 0xcae1
+Êâ 0xcae2
+Êã 0xcae3
+Êä 0xcae4
+Êå 0xcae5
+Êæ 0xcae6
+Êç 0xcae7
+Êè 0xcae8
+Êé 0xcae9
+Êê 0xcaea
+Êë 0xcaeb
+Êì 0xcaec
+Êí 0xcaed
+Êî 0xcaee
+Êï 0xcaef
+Êð 0xcaf0
+Êñ 0xcaf1
+Êò 0xcaf2
+Êó 0xcaf3
+Êô 0xcaf4
+Êõ 0xcaf5
+Êö 0xcaf6
+Ê÷ 0xcaf7
+Êø 0xcaf8
+Êù 0xcaf9
+Êú 0xcafa
+Êû 0xcafb
+Êü 0xcafc
+Êý 0xcafd
+Êþ 0xcafe
+Ë@ 0xcb40
+ËA 0xcb41
+ËB 0xcb42
+ËC 0xcb43
+ËD 0xcb44
+ËE 0xcb45
+ËF 0xcb46
+ËG 0xcb47
+ËH 0xcb48
+ËI 0xcb49
+ËJ 0xcb4a
+ËK 0xcb4b
+ËL 0xcb4c
+ËM 0xcb4d
+ËN 0xcb4e
+ËO 0xcb4f
+ËP 0xcb50
+ËQ 0xcb51
+ËR 0xcb52
+ËS 0xcb53
+ËT 0xcb54
+ËU 0xcb55
+ËV 0xcb56
+ËW 0xcb57
+ËX 0xcb58
+ËY 0xcb59
+ËZ 0xcb5a
+Ë[ 0xcb5b
+Ë\ 0xcb5c
+Ë] 0xcb5d
+Ë^ 0xcb5e
+Ë_ 0xcb5f
+Ë` 0xcb60
+Ëa 0xcb61
+Ëb 0xcb62
+Ëc 0xcb63
+Ëd 0xcb64
+Ëe 0xcb65
+Ëf 0xcb66
+Ëg 0xcb67
+Ëh 0xcb68
+Ëi 0xcb69
+Ëj 0xcb6a
+Ëk 0xcb6b
+Ël 0xcb6c
+Ëm 0xcb6d
+Ën 0xcb6e
+Ëo 0xcb6f
+Ëp 0xcb70
+Ëq 0xcb71
+Ër 0xcb72
+Ës 0xcb73
+Ët 0xcb74
+Ëu 0xcb75
+Ëv 0xcb76
+Ëw 0xcb77
+Ëx 0xcb78
+Ëy 0xcb79
+Ëz 0xcb7a
+Ë{ 0xcb7b
+Ë| 0xcb7c
+Ë} 0xcb7d
+Ë~ 0xcb7e
+Ë¡ 0xcba1
+Ë¢ 0xcba2
+Ë£ 0xcba3
+ˤ 0xcba4
+Ë¥ 0xcba5
+˦ 0xcba6
+˧ 0xcba7
+˨ 0xcba8
+Ë© 0xcba9
+˪ 0xcbaa
+Ë« 0xcbab
+ˬ 0xcbac
+Ë­ 0xcbad
+Ë® 0xcbae
+˯ 0xcbaf
+Ë° 0xcbb0
+˱ 0xcbb1
+˲ 0xcbb2
+˳ 0xcbb3
+Ë´ 0xcbb4
+˵ 0xcbb5
+˶ 0xcbb6
+Ë· 0xcbb7
+˸ 0xcbb8
+˹ 0xcbb9
+˺ 0xcbba
+Ë» 0xcbbb
+˼ 0xcbbc
+˽ 0xcbbd
+˾ 0xcbbe
+Ë¿ 0xcbbf
+ËÀ 0xcbc0
+ËÁ 0xcbc1
+ËÂ 0xcbc2
+ËÃ 0xcbc3
+ËÄ 0xcbc4
+ËÅ 0xcbc5
+ËÆ 0xcbc6
+ËÇ 0xcbc7
+ËÈ 0xcbc8
+ËÉ 0xcbc9
+ËÊ 0xcbca
+ËË 0xcbcb
+ËÌ 0xcbcc
+ËÍ 0xcbcd
+ËÎ 0xcbce
+ËÏ 0xcbcf
+ËÐ 0xcbd0
+ËÑ 0xcbd1
+ËÒ 0xcbd2
+ËÓ 0xcbd3
+ËÔ 0xcbd4
+ËÕ 0xcbd5
+ËÖ 0xcbd6
+Ë× 0xcbd7
+ËØ 0xcbd8
+ËÙ 0xcbd9
+ËÚ 0xcbda
+ËÛ 0xcbdb
+ËÜ 0xcbdc
+ËÝ 0xcbdd
+ËÞ 0xcbde
+Ëß 0xcbdf
+Ëà 0xcbe0
+Ëá 0xcbe1
+Ëâ 0xcbe2
+Ëã 0xcbe3
+Ëä 0xcbe4
+Ëå 0xcbe5
+Ëæ 0xcbe6
+Ëç 0xcbe7
+Ëè 0xcbe8
+Ëé 0xcbe9
+Ëê 0xcbea
+Ëë 0xcbeb
+Ëì 0xcbec
+Ëí 0xcbed
+Ëî 0xcbee
+Ëï 0xcbef
+Ëð 0xcbf0
+Ëñ 0xcbf1
+Ëò 0xcbf2
+Ëó 0xcbf3
+Ëô 0xcbf4
+Ëõ 0xcbf5
+Ëö 0xcbf6
+Ë÷ 0xcbf7
+Ëø 0xcbf8
+Ëù 0xcbf9
+Ëú 0xcbfa
+Ëû 0xcbfb
+Ëü 0xcbfc
+Ëý 0xcbfd
+Ëþ 0xcbfe
+Ì@ 0xcc40
+ÌA 0xcc41
+ÌB 0xcc42
+ÌC 0xcc43
+ÌD 0xcc44
+ÌE 0xcc45
+ÌF 0xcc46
+ÌG 0xcc47
+ÌH 0xcc48
+ÌI 0xcc49
+ÌJ 0xcc4a
+ÌK 0xcc4b
+ÌL 0xcc4c
+ÌM 0xcc4d
+ÌN 0xcc4e
+ÌO 0xcc4f
+ÌP 0xcc50
+ÌQ 0xcc51
+ÌR 0xcc52
+ÌS 0xcc53
+ÌT 0xcc54
+ÌU 0xcc55
+ÌV 0xcc56
+ÌW 0xcc57
+ÌX 0xcc58
+ÌY 0xcc59
+ÌZ 0xcc5a
+Ì[ 0xcc5b
+Ì\ 0xcc5c
+Ì] 0xcc5d
+Ì^ 0xcc5e
+Ì_ 0xcc5f
+Ì` 0xcc60
+Ìa 0xcc61
+Ìb 0xcc62
+Ìc 0xcc63
+Ìd 0xcc64
+Ìe 0xcc65
+Ìf 0xcc66
+Ìg 0xcc67
+Ìh 0xcc68
+Ìi 0xcc69
+Ìj 0xcc6a
+Ìk 0xcc6b
+Ìl 0xcc6c
+Ìm 0xcc6d
+Ìn 0xcc6e
+Ìo 0xcc6f
+Ìp 0xcc70
+Ìq 0xcc71
+Ìr 0xcc72
+Ìs 0xcc73
+Ìt 0xcc74
+Ìu 0xcc75
+Ìv 0xcc76
+Ìw 0xcc77
+Ìx 0xcc78
+Ìy 0xcc79
+Ìz 0xcc7a
+Ì{ 0xcc7b
+Ì| 0xcc7c
+Ì} 0xcc7d
+Ì~ 0xcc7e
+Ì¡ 0xcca1
+Ì¢ 0xcca2
+Ì£ 0xcca3
+̤ 0xcca4
+Ì¥ 0xcca5
+̦ 0xcca6
+̧ 0xcca7
+̨ 0xcca8
+Ì© 0xcca9
+̪ 0xccaa
+Ì« 0xccab
+̬ 0xccac
+Ì­ 0xccad
+Ì® 0xccae
+̯ 0xccaf
+Ì° 0xccb0
+̱ 0xccb1
+̲ 0xccb2
+̳ 0xccb3
+Ì´ 0xccb4
+̵ 0xccb5
+̶ 0xccb6
+Ì· 0xccb7
+̸ 0xccb8
+̹ 0xccb9
+̺ 0xccba
+Ì» 0xccbb
+̼ 0xccbc
+̽ 0xccbd
+̾ 0xccbe
+Ì¿ 0xccbf
+ÌÀ 0xccc0
+ÌÁ 0xccc1
+ÌÂ 0xccc2
+ÌÃ 0xccc3
+ÌÄ 0xccc4
+ÌÅ 0xccc5
+ÌÆ 0xccc6
+ÌÇ 0xccc7
+ÌÈ 0xccc8
+ÌÉ 0xccc9
+ÌÊ 0xccca
+ÌË 0xcccb
+ÌÌ 0xcccc
+ÌÍ 0xcccd
+ÌÎ 0xccce
+ÌÏ 0xcccf
+ÌÐ 0xccd0
+ÌÑ 0xccd1
+ÌÒ 0xccd2
+ÌÓ 0xccd3
+ÌÔ 0xccd4
+ÌÕ 0xccd5
+ÌÖ 0xccd6
+Ì× 0xccd7
+ÌØ 0xccd8
+ÌÙ 0xccd9
+ÌÚ 0xccda
+ÌÛ 0xccdb
+ÌÜ 0xccdc
+ÌÝ 0xccdd
+ÌÞ 0xccde
+Ìß 0xccdf
+Ìà 0xcce0
+Ìá 0xcce1
+Ìâ 0xcce2
+Ìã 0xcce3
+Ìä 0xcce4
+Ìå 0xcce5
+Ìæ 0xcce6
+Ìç 0xcce7
+Ìè 0xcce8
+Ìé 0xcce9
+Ìê 0xccea
+Ìë 0xcceb
+Ìì 0xccec
+Ìí 0xcced
+Ìî 0xccee
+Ìï 0xccef
+Ìð 0xccf0
+Ìñ 0xccf1
+Ìò 0xccf2
+Ìó 0xccf3
+Ìô 0xccf4
+Ìõ 0xccf5
+Ìö 0xccf6
+Ì÷ 0xccf7
+Ìø 0xccf8
+Ìù 0xccf9
+Ìú 0xccfa
+Ìû 0xccfb
+Ìü 0xccfc
+Ìý 0xccfd
+Ìþ 0xccfe
+Í@ 0xcd40
+ÍA 0xcd41
+ÍB 0xcd42
+ÍC 0xcd43
+ÍD 0xcd44
+ÍE 0xcd45
+ÍF 0xcd46
+ÍG 0xcd47
+ÍH 0xcd48
+ÍI 0xcd49
+ÍJ 0xcd4a
+ÍK 0xcd4b
+ÍL 0xcd4c
+ÍM 0xcd4d
+ÍN 0xcd4e
+ÍO 0xcd4f
+ÍP 0xcd50
+ÍQ 0xcd51
+ÍR 0xcd52
+ÍS 0xcd53
+ÍT 0xcd54
+ÍU 0xcd55
+ÍV 0xcd56
+ÍW 0xcd57
+ÍX 0xcd58
+ÍY 0xcd59
+ÍZ 0xcd5a
+Í[ 0xcd5b
+Í\ 0xcd5c
+Í] 0xcd5d
+Í^ 0xcd5e
+Í_ 0xcd5f
+Í` 0xcd60
+Ía 0xcd61
+Íb 0xcd62
+Íc 0xcd63
+Íd 0xcd64
+Íe 0xcd65
+Íf 0xcd66
+Íg 0xcd67
+Íh 0xcd68
+Íi 0xcd69
+Íj 0xcd6a
+Ík 0xcd6b
+Íl 0xcd6c
+Ím 0xcd6d
+Ín 0xcd6e
+Ío 0xcd6f
+Íp 0xcd70
+Íq 0xcd71
+Ír 0xcd72
+Ís 0xcd73
+Ít 0xcd74
+Íu 0xcd75
+Ív 0xcd76
+Íw 0xcd77
+Íx 0xcd78
+Íy 0xcd79
+Íz 0xcd7a
+Í{ 0xcd7b
+Í| 0xcd7c
+Í} 0xcd7d
+Í~ 0xcd7e
+Í¡ 0xcda1
+Í¢ 0xcda2
+Í£ 0xcda3
+ͤ 0xcda4
+Í¥ 0xcda5
+ͦ 0xcda6
+ͧ 0xcda7
+ͨ 0xcda8
+Í© 0xcda9
+ͪ 0xcdaa
+Í« 0xcdab
+ͬ 0xcdac
+Í­ 0xcdad
+Í® 0xcdae
+ͯ 0xcdaf
+Í° 0xcdb0
+ͱ 0xcdb1
+Ͳ 0xcdb2
+ͳ 0xcdb3
+Í´ 0xcdb4
+͵ 0xcdb5
+Ͷ 0xcdb6
+Í· 0xcdb7
+͸ 0xcdb8
+͹ 0xcdb9
+ͺ 0xcdba
+Í» 0xcdbb
+ͼ 0xcdbc
+ͽ 0xcdbd
+; 0xcdbe
+Í¿ 0xcdbf
+ÍÀ 0xcdc0
+ÍÁ 0xcdc1
+ÍÂ 0xcdc2
+ÍÃ 0xcdc3
+ÍÄ 0xcdc4
+ÍÅ 0xcdc5
+ÍÆ 0xcdc6
+ÍÇ 0xcdc7
+ÍÈ 0xcdc8
+ÍÉ 0xcdc9
+ÍÊ 0xcdca
+ÍË 0xcdcb
+ÍÌ 0xcdcc
+ÍÍ 0xcdcd
+ÍÎ 0xcdce
+ÍÏ 0xcdcf
+ÍÐ 0xcdd0
+ÍÑ 0xcdd1
+ÍÒ 0xcdd2
+ÍÓ 0xcdd3
+ÍÔ 0xcdd4
+ÍÕ 0xcdd5
+ÍÖ 0xcdd6
+Í× 0xcdd7
+ÍØ 0xcdd8
+ÍÙ 0xcdd9
+ÍÚ 0xcdda
+ÍÛ 0xcddb
+ÍÜ 0xcddc
+ÍÝ 0xcddd
+ÍÞ 0xcdde
+Íß 0xcddf
+Íà 0xcde0
+Íá 0xcde1
+Íâ 0xcde2
+Íã 0xcde3
+Íä 0xcde4
+Íå 0xcde5
+Íæ 0xcde6
+Íç 0xcde7
+Íè 0xcde8
+Íé 0xcde9
+Íê 0xcdea
+Íë 0xcdeb
+Íì 0xcdec
+Íí 0xcded
+Íî 0xcdee
+Íï 0xcdef
+Íð 0xcdf0
+Íñ 0xcdf1
+Íò 0xcdf2
+Íó 0xcdf3
+Íô 0xcdf4
+Íõ 0xcdf5
+Íö 0xcdf6
+Í÷ 0xcdf7
+Íø 0xcdf8
+Íù 0xcdf9
+Íú 0xcdfa
+Íû 0xcdfb
+Íü 0xcdfc
+Íý 0xcdfd
+Íþ 0xcdfe
+Î@ 0xce40
+ÎA 0xce41
+ÎB 0xce42
+ÎC 0xce43
+ÎD 0xce44
+ÎE 0xce45
+ÎF 0xce46
+ÎG 0xce47
+ÎH 0xce48
+ÎI 0xce49
+ÎJ 0xce4a
+ÎK 0xce4b
+ÎL 0xce4c
+ÎM 0xce4d
+ÎN 0xce4e
+ÎO 0xce4f
+ÎP 0xce50
+ÎQ 0xce51
+ÎR 0xce52
+ÎS 0xce53
+ÎT 0xce54
+ÎU 0xce55
+ÎV 0xce56
+ÎW 0xce57
+ÎX 0xce58
+ÎY 0xce59
+ÎZ 0xce5a
+Î[ 0xce5b
+Î\ 0xce5c
+Î] 0xce5d
+Î^ 0xce5e
+Î_ 0xce5f
+Î` 0xce60
+Îa 0xce61
+Îb 0xce62
+Îc 0xce63
+Îd 0xce64
+Îe 0xce65
+Îf 0xce66
+Îg 0xce67
+Îh 0xce68
+Îi 0xce69
+Îj 0xce6a
+Îk 0xce6b
+Îl 0xce6c
+Îm 0xce6d
+În 0xce6e
+Îo 0xce6f
+Îp 0xce70
+Îq 0xce71
+Îr 0xce72
+Îs 0xce73
+Ît 0xce74
+Îu 0xce75
+Îv 0xce76
+Îw 0xce77
+Îx 0xce78
+Îy 0xce79
+Îz 0xce7a
+Î{ 0xce7b
+Î| 0xce7c
+Î} 0xce7d
+Î~ 0xce7e
+Ρ 0xcea1
+΢ 0xcea2
+Σ 0xcea3
+Τ 0xcea4
+Î¥ 0xcea5
+Φ 0xcea6
+Χ 0xcea7
+Ψ 0xcea8
+Ω 0xcea9
+Ϊ 0xceaa
+Ϋ 0xceab
+ά 0xceac
+έ 0xcead
+ή 0xceae
+ί 0xceaf
+ΰ 0xceb0
+α 0xceb1
+β 0xceb2
+γ 0xceb3
+δ 0xceb4
+ε 0xceb5
+ζ 0xceb6
+η 0xceb7
+θ 0xceb8
+ι 0xceb9
+κ 0xceba
+λ 0xcebb
+μ 0xcebc
+ν 0xcebd
+ξ 0xcebe
+ο 0xcebf
+ÎÀ 0xcec0
+ÎÁ 0xcec1
+ÎÂ 0xcec2
+ÎÃ 0xcec3
+ÎÄ 0xcec4
+ÎÅ 0xcec5
+ÎÆ 0xcec6
+ÎÇ 0xcec7
+ÎÈ 0xcec8
+ÎÉ 0xcec9
+ÎÊ 0xceca
+ÎË 0xcecb
+ÎÌ 0xcecc
+ÎÍ 0xcecd
+ÎÎ 0xcece
+ÎÏ 0xcecf
+ÎÐ 0xced0
+ÎÑ 0xced1
+ÎÒ 0xced2
+ÎÓ 0xced3
+ÎÔ 0xced4
+ÎÕ 0xced5
+ÎÖ 0xced6
+Î× 0xced7
+ÎØ 0xced8
+ÎÙ 0xced9
+ÎÚ 0xceda
+ÎÛ 0xcedb
+ÎÜ 0xcedc
+ÎÝ 0xcedd
+ÎÞ 0xcede
+Îß 0xcedf
+Îà 0xcee0
+Îá 0xcee1
+Îâ 0xcee2
+Îã 0xcee3
+Îä 0xcee4
+Îå 0xcee5
+Îæ 0xcee6
+Îç 0xcee7
+Îè 0xcee8
+Îé 0xcee9
+Îê 0xceea
+Îë 0xceeb
+Îì 0xceec
+Îí 0xceed
+Îî 0xceee
+Îï 0xceef
+Îð 0xcef0
+Îñ 0xcef1
+Îò 0xcef2
+Îó 0xcef3
+Îô 0xcef4
+Îõ 0xcef5
+Îö 0xcef6
+Î÷ 0xcef7
+Îø 0xcef8
+Îù 0xcef9
+Îú 0xcefa
+Îû 0xcefb
+Îü 0xcefc
+Îý 0xcefd
+Îþ 0xcefe
+Ï@ 0xcf40
+ÏA 0xcf41
+ÏB 0xcf42
+ÏC 0xcf43
+ÏD 0xcf44
+ÏE 0xcf45
+ÏF 0xcf46
+ÏG 0xcf47
+ÏH 0xcf48
+ÏI 0xcf49
+ÏJ 0xcf4a
+ÏK 0xcf4b
+ÏL 0xcf4c
+ÏM 0xcf4d
+ÏN 0xcf4e
+ÏO 0xcf4f
+ÏP 0xcf50
+ÏQ 0xcf51
+ÏR 0xcf52
+ÏS 0xcf53
+ÏT 0xcf54
+ÏU 0xcf55
+ÏV 0xcf56
+ÏW 0xcf57
+ÏX 0xcf58
+ÏY 0xcf59
+ÏZ 0xcf5a
+Ï[ 0xcf5b
+Ï\ 0xcf5c
+Ï] 0xcf5d
+Ï^ 0xcf5e
+Ï_ 0xcf5f
+Ï` 0xcf60
+Ïa 0xcf61
+Ïb 0xcf62
+Ïc 0xcf63
+Ïd 0xcf64
+Ïe 0xcf65
+Ïf 0xcf66
+Ïg 0xcf67
+Ïh 0xcf68
+Ïi 0xcf69
+Ïj 0xcf6a
+Ïk 0xcf6b
+Ïl 0xcf6c
+Ïm 0xcf6d
+Ïn 0xcf6e
+Ïo 0xcf6f
+Ïp 0xcf70
+Ïq 0xcf71
+Ïr 0xcf72
+Ïs 0xcf73
+Ït 0xcf74
+Ïu 0xcf75
+Ïv 0xcf76
+Ïw 0xcf77
+Ïx 0xcf78
+Ïy 0xcf79
+Ïz 0xcf7a
+Ï{ 0xcf7b
+Ï| 0xcf7c
+Ï} 0xcf7d
+Ï~ 0xcf7e
+Ï¡ 0xcfa1
+Ï¢ 0xcfa2
+Ï£ 0xcfa3
+Ϥ 0xcfa4
+Ï¥ 0xcfa5
+Ϧ 0xcfa6
+ϧ 0xcfa7
+Ϩ 0xcfa8
+Ï© 0xcfa9
+Ϫ 0xcfaa
+Ï« 0xcfab
+Ϭ 0xcfac
+Ï­ 0xcfad
+Ï® 0xcfae
+ϯ 0xcfaf
+Ï° 0xcfb0
+ϱ 0xcfb1
+ϲ 0xcfb2
+ϳ 0xcfb3
+Ï´ 0xcfb4
+ϵ 0xcfb5
+϶ 0xcfb6
+Ï· 0xcfb7
+ϸ 0xcfb8
+Ϲ 0xcfb9
+Ϻ 0xcfba
+Ï» 0xcfbb
+ϼ 0xcfbc
+Ͻ 0xcfbd
+Ͼ 0xcfbe
+Ï¿ 0xcfbf
+ÏÀ 0xcfc0
+ÏÁ 0xcfc1
+ÏÂ 0xcfc2
+ÏÃ 0xcfc3
+ÏÄ 0xcfc4
+ÏÅ 0xcfc5
+ÏÆ 0xcfc6
+ÏÇ 0xcfc7
+ÏÈ 0xcfc8
+ÏÉ 0xcfc9
+ÏÊ 0xcfca
+ÏË 0xcfcb
+ÏÌ 0xcfcc
+ÏÍ 0xcfcd
+ÏÎ 0xcfce
+ÏÏ 0xcfcf
+ÏÐ 0xcfd0
+ÏÑ 0xcfd1
+ÏÒ 0xcfd2
+ÏÓ 0xcfd3
+ÏÔ 0xcfd4
+ÏÕ 0xcfd5
+ÏÖ 0xcfd6
+Ï× 0xcfd7
+ÏØ 0xcfd8
+ÏÙ 0xcfd9
+ÏÚ 0xcfda
+ÏÛ 0xcfdb
+ÏÜ 0xcfdc
+ÏÝ 0xcfdd
+ÏÞ 0xcfde
+Ïß 0xcfdf
+Ïà 0xcfe0
+Ïá 0xcfe1
+Ïâ 0xcfe2
+Ïã 0xcfe3
+Ïä 0xcfe4
+Ïå 0xcfe5
+Ïæ 0xcfe6
+Ïç 0xcfe7
+Ïè 0xcfe8
+Ïé 0xcfe9
+Ïê 0xcfea
+Ïë 0xcfeb
+Ïì 0xcfec
+Ïí 0xcfed
+Ïî 0xcfee
+Ïï 0xcfef
+Ïð 0xcff0
+Ïñ 0xcff1
+Ïò 0xcff2
+Ïó 0xcff3
+Ïô 0xcff4
+Ïõ 0xcff5
+Ïö 0xcff6
+Ï÷ 0xcff7
+Ïø 0xcff8
+Ïù 0xcff9
+Ïú 0xcffa
+Ïû 0xcffb
+Ïü 0xcffc
+Ïý 0xcffd
+Ïþ 0xcffe
+Ð@ 0xd040
+ÐA 0xd041
+ÐB 0xd042
+ÐC 0xd043
+ÐD 0xd044
+ÐE 0xd045
+ÐF 0xd046
+ÐG 0xd047
+ÐH 0xd048
+ÐI 0xd049
+ÐJ 0xd04a
+ÐK 0xd04b
+ÐL 0xd04c
+ÐM 0xd04d
+ÐN 0xd04e
+ÐO 0xd04f
+ÐP 0xd050
+ÐQ 0xd051
+ÐR 0xd052
+ÐS 0xd053
+ÐT 0xd054
+ÐU 0xd055
+ÐV 0xd056
+ÐW 0xd057
+ÐX 0xd058
+ÐY 0xd059
+ÐZ 0xd05a
+Ð[ 0xd05b
+Ð\ 0xd05c
+Ð] 0xd05d
+Ð^ 0xd05e
+Ð_ 0xd05f
+Ð` 0xd060
+Ða 0xd061
+Ðb 0xd062
+Ðc 0xd063
+Ðd 0xd064
+Ðe 0xd065
+Ðf 0xd066
+Ðg 0xd067
+Ðh 0xd068
+Ði 0xd069
+Ðj 0xd06a
+Ðk 0xd06b
+Ðl 0xd06c
+Ðm 0xd06d
+Ðn 0xd06e
+Ðo 0xd06f
+Ðp 0xd070
+Ðq 0xd071
+Ðr 0xd072
+Ðs 0xd073
+Ðt 0xd074
+Ðu 0xd075
+Ðv 0xd076
+Ðw 0xd077
+Ðx 0xd078
+Ðy 0xd079
+Ðz 0xd07a
+Ð{ 0xd07b
+Ð| 0xd07c
+Ð} 0xd07d
+Ð~ 0xd07e
+С 0xd0a1
+Т 0xd0a2
+У 0xd0a3
+Ф 0xd0a4
+Ð¥ 0xd0a5
+Ц 0xd0a6
+Ч 0xd0a7
+Ш 0xd0a8
+Щ 0xd0a9
+Ъ 0xd0aa
+Ы 0xd0ab
+Ь 0xd0ac
+Э 0xd0ad
+Ю 0xd0ae
+Я 0xd0af
+а 0xd0b0
+б 0xd0b1
+в 0xd0b2
+г 0xd0b3
+д 0xd0b4
+е 0xd0b5
+ж 0xd0b6
+з 0xd0b7
+и 0xd0b8
+й 0xd0b9
+к 0xd0ba
+л 0xd0bb
+м 0xd0bc
+н 0xd0bd
+о 0xd0be
+п 0xd0bf
+ÐÀ 0xd0c0
+ÐÁ 0xd0c1
+ÐÂ 0xd0c2
+ÐÃ 0xd0c3
+ÐÄ 0xd0c4
+ÐÅ 0xd0c5
+ÐÆ 0xd0c6
+ÐÇ 0xd0c7
+ÐÈ 0xd0c8
+ÐÉ 0xd0c9
+ÐÊ 0xd0ca
+ÐË 0xd0cb
+ÐÌ 0xd0cc
+ÐÍ 0xd0cd
+ÐÎ 0xd0ce
+ÐÏ 0xd0cf
+ÐÐ 0xd0d0
+ÐÑ 0xd0d1
+ÐÒ 0xd0d2
+ÐÓ 0xd0d3
+ÐÔ 0xd0d4
+ÐÕ 0xd0d5
+ÐÖ 0xd0d6
+Ð× 0xd0d7
+ÐØ 0xd0d8
+ÐÙ 0xd0d9
+ÐÚ 0xd0da
+ÐÛ 0xd0db
+ÐÜ 0xd0dc
+ÐÝ 0xd0dd
+ÐÞ 0xd0de
+Ðß 0xd0df
+Ðà 0xd0e0
+Ðá 0xd0e1
+Ðâ 0xd0e2
+Ðã 0xd0e3
+Ðä 0xd0e4
+Ðå 0xd0e5
+Ðæ 0xd0e6
+Ðç 0xd0e7
+Ðè 0xd0e8
+Ðé 0xd0e9
+Ðê 0xd0ea
+Ðë 0xd0eb
+Ðì 0xd0ec
+Ðí 0xd0ed
+Ðî 0xd0ee
+Ðï 0xd0ef
+Ðð 0xd0f0
+Ðñ 0xd0f1
+Ðò 0xd0f2
+Ðó 0xd0f3
+Ðô 0xd0f4
+Ðõ 0xd0f5
+Ðö 0xd0f6
+Ð÷ 0xd0f7
+Ðø 0xd0f8
+Ðù 0xd0f9
+Ðú 0xd0fa
+Ðû 0xd0fb
+Ðü 0xd0fc
+Ðý 0xd0fd
+Ðþ 0xd0fe
+Ñ@ 0xd140
+ÑA 0xd141
+ÑB 0xd142
+ÑC 0xd143
+ÑD 0xd144
+ÑE 0xd145
+ÑF 0xd146
+ÑG 0xd147
+ÑH 0xd148
+ÑI 0xd149
+ÑJ 0xd14a
+ÑK 0xd14b
+ÑL 0xd14c
+ÑM 0xd14d
+ÑN 0xd14e
+ÑO 0xd14f
+ÑP 0xd150
+ÑQ 0xd151
+ÑR 0xd152
+ÑS 0xd153
+ÑT 0xd154
+ÑU 0xd155
+ÑV 0xd156
+ÑW 0xd157
+ÑX 0xd158
+ÑY 0xd159
+ÑZ 0xd15a
+Ñ[ 0xd15b
+Ñ\ 0xd15c
+Ñ] 0xd15d
+Ñ^ 0xd15e
+Ñ_ 0xd15f
+Ñ` 0xd160
+Ña 0xd161
+Ñb 0xd162
+Ñc 0xd163
+Ñd 0xd164
+Ñe 0xd165
+Ñf 0xd166
+Ñg 0xd167
+Ñh 0xd168
+Ñi 0xd169
+Ñj 0xd16a
+Ñk 0xd16b
+Ñl 0xd16c
+Ñm 0xd16d
+Ñn 0xd16e
+Ño 0xd16f
+Ñp 0xd170
+Ñq 0xd171
+Ñr 0xd172
+Ñs 0xd173
+Ñt 0xd174
+Ñu 0xd175
+Ñv 0xd176
+Ñw 0xd177
+Ñx 0xd178
+Ñy 0xd179
+Ñz 0xd17a
+Ñ{ 0xd17b
+Ñ| 0xd17c
+Ñ} 0xd17d
+Ñ~ 0xd17e
+Ñ¡ 0xd1a1
+Ñ¢ 0xd1a2
+Ñ£ 0xd1a3
+Ѥ 0xd1a4
+Ñ¥ 0xd1a5
+Ѧ 0xd1a6
+ѧ 0xd1a7
+Ѩ 0xd1a8
+Ñ© 0xd1a9
+Ѫ 0xd1aa
+Ñ« 0xd1ab
+Ѭ 0xd1ac
+Ñ­ 0xd1ad
+Ñ® 0xd1ae
+ѯ 0xd1af
+Ñ° 0xd1b0
+ѱ 0xd1b1
+Ѳ 0xd1b2
+ѳ 0xd1b3
+Ñ´ 0xd1b4
+ѵ 0xd1b5
+Ѷ 0xd1b6
+Ñ· 0xd1b7
+Ѹ 0xd1b8
+ѹ 0xd1b9
+Ѻ 0xd1ba
+Ñ» 0xd1bb
+Ѽ 0xd1bc
+ѽ 0xd1bd
+Ѿ 0xd1be
+Ñ¿ 0xd1bf
+ÑÀ 0xd1c0
+ÑÁ 0xd1c1
+ÑÂ 0xd1c2
+ÑÃ 0xd1c3
+ÑÄ 0xd1c4
+ÑÅ 0xd1c5
+ÑÆ 0xd1c6
+ÑÇ 0xd1c7
+ÑÈ 0xd1c8
+ÑÉ 0xd1c9
+ÑÊ 0xd1ca
+ÑË 0xd1cb
+ÑÌ 0xd1cc
+ÑÍ 0xd1cd
+ÑÎ 0xd1ce
+ÑÏ 0xd1cf
+ÑÐ 0xd1d0
+ÑÑ 0xd1d1
+ÑÒ 0xd1d2
+ÑÓ 0xd1d3
+ÑÔ 0xd1d4
+ÑÕ 0xd1d5
+ÑÖ 0xd1d6
+Ñ× 0xd1d7
+ÑØ 0xd1d8
+ÑÙ 0xd1d9
+ÑÚ 0xd1da
+ÑÛ 0xd1db
+ÑÜ 0xd1dc
+ÑÝ 0xd1dd
+ÑÞ 0xd1de
+Ñß 0xd1df
+Ñà 0xd1e0
+Ñá 0xd1e1
+Ñâ 0xd1e2
+Ñã 0xd1e3
+Ñä 0xd1e4
+Ñå 0xd1e5
+Ñæ 0xd1e6
+Ñç 0xd1e7
+Ñè 0xd1e8
+Ñé 0xd1e9
+Ñê 0xd1ea
+Ñë 0xd1eb
+Ñì 0xd1ec
+Ñí 0xd1ed
+Ñî 0xd1ee
+Ñï 0xd1ef
+Ñð 0xd1f0
+Ññ 0xd1f1
+Ñò 0xd1f2
+Ñó 0xd1f3
+Ñô 0xd1f4
+Ñõ 0xd1f5
+Ñö 0xd1f6
+Ñ÷ 0xd1f7
+Ñø 0xd1f8
+Ñù 0xd1f9
+Ñú 0xd1fa
+Ñû 0xd1fb
+Ñü 0xd1fc
+Ñý 0xd1fd
+Ñþ 0xd1fe
+Ò@ 0xd240
+ÒA 0xd241
+ÒB 0xd242
+ÒC 0xd243
+ÒD 0xd244
+ÒE 0xd245
+ÒF 0xd246
+ÒG 0xd247
+ÒH 0xd248
+ÒI 0xd249
+ÒJ 0xd24a
+ÒK 0xd24b
+ÒL 0xd24c
+ÒM 0xd24d
+ÒN 0xd24e
+ÒO 0xd24f
+ÒP 0xd250
+ÒQ 0xd251
+ÒR 0xd252
+ÒS 0xd253
+ÒT 0xd254
+ÒU 0xd255
+ÒV 0xd256
+ÒW 0xd257
+ÒX 0xd258
+ÒY 0xd259
+ÒZ 0xd25a
+Ò[ 0xd25b
+Ò\ 0xd25c
+Ò] 0xd25d
+Ò^ 0xd25e
+Ò_ 0xd25f
+Ò` 0xd260
+Òa 0xd261
+Òb 0xd262
+Òc 0xd263
+Òd 0xd264
+Òe 0xd265
+Òf 0xd266
+Òg 0xd267
+Òh 0xd268
+Òi 0xd269
+Òj 0xd26a
+Òk 0xd26b
+Òl 0xd26c
+Òm 0xd26d
+Òn 0xd26e
+Òo 0xd26f
+Òp 0xd270
+Òq 0xd271
+Òr 0xd272
+Òs 0xd273
+Òt 0xd274
+Òu 0xd275
+Òv 0xd276
+Òw 0xd277
+Òx 0xd278
+Òy 0xd279
+Òz 0xd27a
+Ò{ 0xd27b
+Ò| 0xd27c
+Ò} 0xd27d
+Ò~ 0xd27e
+Ò¡ 0xd2a1
+Ò¢ 0xd2a2
+Ò£ 0xd2a3
+Ò¤ 0xd2a4
+Ò¥ 0xd2a5
+Ò¦ 0xd2a6
+Ò§ 0xd2a7
+Ò¨ 0xd2a8
+Ò© 0xd2a9
+Òª 0xd2aa
+Ò« 0xd2ab
+Ò¬ 0xd2ac
+Ò­ 0xd2ad
+Ò® 0xd2ae
+Ò¯ 0xd2af
+Ò° 0xd2b0
+Ò± 0xd2b1
+Ò² 0xd2b2
+Ò³ 0xd2b3
+Ò´ 0xd2b4
+Òµ 0xd2b5
+Ò¶ 0xd2b6
+Ò· 0xd2b7
+Ò¸ 0xd2b8
+Ò¹ 0xd2b9
+Òº 0xd2ba
+Ò» 0xd2bb
+Ò¼ 0xd2bc
+Ò½ 0xd2bd
+Ò¾ 0xd2be
+Ò¿ 0xd2bf
+ÒÀ 0xd2c0
+ÒÁ 0xd2c1
+ÒÂ 0xd2c2
+ÒÃ 0xd2c3
+ÒÄ 0xd2c4
+ÒÅ 0xd2c5
+ÒÆ 0xd2c6
+ÒÇ 0xd2c7
+ÒÈ 0xd2c8
+ÒÉ 0xd2c9
+ÒÊ 0xd2ca
+ÒË 0xd2cb
+ÒÌ 0xd2cc
+ÒÍ 0xd2cd
+ÒÎ 0xd2ce
+ÒÏ 0xd2cf
+ÒÐ 0xd2d0
+ÒÑ 0xd2d1
+ÒÒ 0xd2d2
+ÒÓ 0xd2d3
+ÒÔ 0xd2d4
+ÒÕ 0xd2d5
+ÒÖ 0xd2d6
+Ò× 0xd2d7
+ÒØ 0xd2d8
+ÒÙ 0xd2d9
+ÒÚ 0xd2da
+ÒÛ 0xd2db
+ÒÜ 0xd2dc
+ÒÝ 0xd2dd
+ÒÞ 0xd2de
+Òß 0xd2df
+Òà 0xd2e0
+Òá 0xd2e1
+Òâ 0xd2e2
+Òã 0xd2e3
+Òä 0xd2e4
+Òå 0xd2e5
+Òæ 0xd2e6
+Òç 0xd2e7
+Òè 0xd2e8
+Òé 0xd2e9
+Òê 0xd2ea
+Òë 0xd2eb
+Òì 0xd2ec
+Òí 0xd2ed
+Òî 0xd2ee
+Òï 0xd2ef
+Òð 0xd2f0
+Òñ 0xd2f1
+Òò 0xd2f2
+Òó 0xd2f3
+Òô 0xd2f4
+Òõ 0xd2f5
+Òö 0xd2f6
+Ò÷ 0xd2f7
+Òø 0xd2f8
+Òù 0xd2f9
+Òú 0xd2fa
+Òû 0xd2fb
+Òü 0xd2fc
+Òý 0xd2fd
+Òþ 0xd2fe
+Ó@ 0xd340
+ÓA 0xd341
+ÓB 0xd342
+ÓC 0xd343
+ÓD 0xd344
+ÓE 0xd345
+ÓF 0xd346
+ÓG 0xd347
+ÓH 0xd348
+ÓI 0xd349
+ÓJ 0xd34a
+ÓK 0xd34b
+ÓL 0xd34c
+ÓM 0xd34d
+ÓN 0xd34e
+ÓO 0xd34f
+ÓP 0xd350
+ÓQ 0xd351
+ÓR 0xd352
+ÓS 0xd353
+ÓT 0xd354
+ÓU 0xd355
+ÓV 0xd356
+ÓW 0xd357
+ÓX 0xd358
+ÓY 0xd359
+ÓZ 0xd35a
+Ó[ 0xd35b
+Ó\ 0xd35c
+Ó] 0xd35d
+Ó^ 0xd35e
+Ó_ 0xd35f
+Ó` 0xd360
+Óa 0xd361
+Ób 0xd362
+Óc 0xd363
+Ód 0xd364
+Óe 0xd365
+Óf 0xd366
+Óg 0xd367
+Óh 0xd368
+Ói 0xd369
+Ój 0xd36a
+Ók 0xd36b
+Ól 0xd36c
+Óm 0xd36d
+Ón 0xd36e
+Óo 0xd36f
+Óp 0xd370
+Óq 0xd371
+Ór 0xd372
+Ós 0xd373
+Ót 0xd374
+Óu 0xd375
+Óv 0xd376
+Ów 0xd377
+Óx 0xd378
+Óy 0xd379
+Óz 0xd37a
+Ó{ 0xd37b
+Ó| 0xd37c
+Ó} 0xd37d
+Ó~ 0xd37e
+Ó¡ 0xd3a1
+Ó¢ 0xd3a2
+Ó£ 0xd3a3
+Ó¤ 0xd3a4
+Ó¥ 0xd3a5
+Ó¦ 0xd3a6
+Ó§ 0xd3a7
+Ó¨ 0xd3a8
+Ó© 0xd3a9
+Óª 0xd3aa
+Ó« 0xd3ab
+Ó¬ 0xd3ac
+Ó­ 0xd3ad
+Ó® 0xd3ae
+Ó¯ 0xd3af
+Ó° 0xd3b0
+Ó± 0xd3b1
+Ó² 0xd3b2
+Ó³ 0xd3b3
+Ó´ 0xd3b4
+Óµ 0xd3b5
+Ó¶ 0xd3b6
+Ó· 0xd3b7
+Ó¸ 0xd3b8
+Ó¹ 0xd3b9
+Óº 0xd3ba
+Ó» 0xd3bb
+Ó¼ 0xd3bc
+Ó½ 0xd3bd
+Ó¾ 0xd3be
+Ó¿ 0xd3bf
+ÓÀ 0xd3c0
+ÓÁ 0xd3c1
+ÓÂ 0xd3c2
+ÓÃ 0xd3c3
+ÓÄ 0xd3c4
+ÓÅ 0xd3c5
+ÓÆ 0xd3c6
+ÓÇ 0xd3c7
+ÓÈ 0xd3c8
+ÓÉ 0xd3c9
+ÓÊ 0xd3ca
+ÓË 0xd3cb
+ÓÌ 0xd3cc
+ÓÍ 0xd3cd
+ÓÎ 0xd3ce
+ÓÏ 0xd3cf
+ÓÐ 0xd3d0
+ÓÑ 0xd3d1
+ÓÒ 0xd3d2
+ÓÓ 0xd3d3
+ÓÔ 0xd3d4
+ÓÕ 0xd3d5
+ÓÖ 0xd3d6
+Ó× 0xd3d7
+ÓØ 0xd3d8
+ÓÙ 0xd3d9
+ÓÚ 0xd3da
+ÓÛ 0xd3db
+ÓÜ 0xd3dc
+ÓÝ 0xd3dd
+ÓÞ 0xd3de
+Óß 0xd3df
+Óà 0xd3e0
+Óá 0xd3e1
+Óâ 0xd3e2
+Óã 0xd3e3
+Óä 0xd3e4
+Óå 0xd3e5
+Óæ 0xd3e6
+Óç 0xd3e7
+Óè 0xd3e8
+Óé 0xd3e9
+Óê 0xd3ea
+Óë 0xd3eb
+Óì 0xd3ec
+Óí 0xd3ed
+Óî 0xd3ee
+Óï 0xd3ef
+Óð 0xd3f0
+Óñ 0xd3f1
+Óò 0xd3f2
+Óó 0xd3f3
+Óô 0xd3f4
+Óõ 0xd3f5
+Óö 0xd3f6
+Ó÷ 0xd3f7
+Óø 0xd3f8
+Óù 0xd3f9
+Óú 0xd3fa
+Óû 0xd3fb
+Óü 0xd3fc
+Óý 0xd3fd
+Óþ 0xd3fe
+Ô@ 0xd440
+ÔA 0xd441
+ÔB 0xd442
+ÔC 0xd443
+ÔD 0xd444
+ÔE 0xd445
+ÔF 0xd446
+ÔG 0xd447
+ÔH 0xd448
+ÔI 0xd449
+ÔJ 0xd44a
+ÔK 0xd44b
+ÔL 0xd44c
+ÔM 0xd44d
+ÔN 0xd44e
+ÔO 0xd44f
+ÔP 0xd450
+ÔQ 0xd451
+ÔR 0xd452
+ÔS 0xd453
+ÔT 0xd454
+ÔU 0xd455
+ÔV 0xd456
+ÔW 0xd457
+ÔX 0xd458
+ÔY 0xd459
+ÔZ 0xd45a
+Ô[ 0xd45b
+Ô\ 0xd45c
+Ô] 0xd45d
+Ô^ 0xd45e
+Ô_ 0xd45f
+Ô` 0xd460
+Ôa 0xd461
+Ôb 0xd462
+Ôc 0xd463
+Ôd 0xd464
+Ôe 0xd465
+Ôf 0xd466
+Ôg 0xd467
+Ôh 0xd468
+Ôi 0xd469
+Ôj 0xd46a
+Ôk 0xd46b
+Ôl 0xd46c
+Ôm 0xd46d
+Ôn 0xd46e
+Ôo 0xd46f
+Ôp 0xd470
+Ôq 0xd471
+Ôr 0xd472
+Ôs 0xd473
+Ôt 0xd474
+Ôu 0xd475
+Ôv 0xd476
+Ôw 0xd477
+Ôx 0xd478
+Ôy 0xd479
+Ôz 0xd47a
+Ô{ 0xd47b
+Ô| 0xd47c
+Ô} 0xd47d
+Ô~ 0xd47e
+Ô¡ 0xd4a1
+Ô¢ 0xd4a2
+Ô£ 0xd4a3
+Ô¤ 0xd4a4
+Ô¥ 0xd4a5
+Ô¦ 0xd4a6
+Ô§ 0xd4a7
+Ô¨ 0xd4a8
+Ô© 0xd4a9
+Ôª 0xd4aa
+Ô« 0xd4ab
+Ô¬ 0xd4ac
+Ô­ 0xd4ad
+Ô® 0xd4ae
+Ô¯ 0xd4af
+Ô° 0xd4b0
+Ô± 0xd4b1
+Ô² 0xd4b2
+Ô³ 0xd4b3
+Ô´ 0xd4b4
+Ôµ 0xd4b5
+Ô¶ 0xd4b6
+Ô· 0xd4b7
+Ô¸ 0xd4b8
+Ô¹ 0xd4b9
+Ôº 0xd4ba
+Ô» 0xd4bb
+Ô¼ 0xd4bc
+Ô½ 0xd4bd
+Ô¾ 0xd4be
+Ô¿ 0xd4bf
+ÔÀ 0xd4c0
+ÔÁ 0xd4c1
+ÔÂ 0xd4c2
+ÔÃ 0xd4c3
+ÔÄ 0xd4c4
+ÔÅ 0xd4c5
+ÔÆ 0xd4c6
+ÔÇ 0xd4c7
+ÔÈ 0xd4c8
+ÔÉ 0xd4c9
+ÔÊ 0xd4ca
+ÔË 0xd4cb
+ÔÌ 0xd4cc
+ÔÍ 0xd4cd
+ÔÎ 0xd4ce
+ÔÏ 0xd4cf
+ÔÐ 0xd4d0
+ÔÑ 0xd4d1
+ÔÒ 0xd4d2
+ÔÓ 0xd4d3
+ÔÔ 0xd4d4
+ÔÕ 0xd4d5
+ÔÖ 0xd4d6
+Ô× 0xd4d7
+ÔØ 0xd4d8
+ÔÙ 0xd4d9
+ÔÚ 0xd4da
+ÔÛ 0xd4db
+ÔÜ 0xd4dc
+ÔÝ 0xd4dd
+ÔÞ 0xd4de
+Ôß 0xd4df
+Ôà 0xd4e0
+Ôá 0xd4e1
+Ôâ 0xd4e2
+Ôã 0xd4e3
+Ôä 0xd4e4
+Ôå 0xd4e5
+Ôæ 0xd4e6
+Ôç 0xd4e7
+Ôè 0xd4e8
+Ôé 0xd4e9
+Ôê 0xd4ea
+Ôë 0xd4eb
+Ôì 0xd4ec
+Ôí 0xd4ed
+Ôî 0xd4ee
+Ôï 0xd4ef
+Ôð 0xd4f0
+Ôñ 0xd4f1
+Ôò 0xd4f2
+Ôó 0xd4f3
+Ôô 0xd4f4
+Ôõ 0xd4f5
+Ôö 0xd4f6
+Ô÷ 0xd4f7
+Ôø 0xd4f8
+Ôù 0xd4f9
+Ôú 0xd4fa
+Ôû 0xd4fb
+Ôü 0xd4fc
+Ôý 0xd4fd
+Ôþ 0xd4fe
+Õ@ 0xd540
+ÕA 0xd541
+ÕB 0xd542
+ÕC 0xd543
+ÕD 0xd544
+ÕE 0xd545
+ÕF 0xd546
+ÕG 0xd547
+ÕH 0xd548
+ÕI 0xd549
+ÕJ 0xd54a
+ÕK 0xd54b
+ÕL 0xd54c
+ÕM 0xd54d
+ÕN 0xd54e
+ÕO 0xd54f
+ÕP 0xd550
+ÕQ 0xd551
+ÕR 0xd552
+ÕS 0xd553
+ÕT 0xd554
+ÕU 0xd555
+ÕV 0xd556
+ÕW 0xd557
+ÕX 0xd558
+ÕY 0xd559
+ÕZ 0xd55a
+Õ[ 0xd55b
+Õ\ 0xd55c
+Õ] 0xd55d
+Õ^ 0xd55e
+Õ_ 0xd55f
+Õ` 0xd560
+Õa 0xd561
+Õb 0xd562
+Õc 0xd563
+Õd 0xd564
+Õe 0xd565
+Õf 0xd566
+Õg 0xd567
+Õh 0xd568
+Õi 0xd569
+Õj 0xd56a
+Õk 0xd56b
+Õl 0xd56c
+Õm 0xd56d
+Õn 0xd56e
+Õo 0xd56f
+Õp 0xd570
+Õq 0xd571
+Õr 0xd572
+Õs 0xd573
+Õt 0xd574
+Õu 0xd575
+Õv 0xd576
+Õw 0xd577
+Õx 0xd578
+Õy 0xd579
+Õz 0xd57a
+Õ{ 0xd57b
+Õ| 0xd57c
+Õ} 0xd57d
+Õ~ 0xd57e
+Õ¡ 0xd5a1
+Õ¢ 0xd5a2
+Õ£ 0xd5a3
+Õ¤ 0xd5a4
+Õ¥ 0xd5a5
+Õ¦ 0xd5a6
+Õ§ 0xd5a7
+Õ¨ 0xd5a8
+Õ© 0xd5a9
+Õª 0xd5aa
+Õ« 0xd5ab
+Õ¬ 0xd5ac
+Õ­ 0xd5ad
+Õ® 0xd5ae
+Õ¯ 0xd5af
+Õ° 0xd5b0
+Õ± 0xd5b1
+Õ² 0xd5b2
+Õ³ 0xd5b3
+Õ´ 0xd5b4
+Õµ 0xd5b5
+Õ¶ 0xd5b6
+Õ· 0xd5b7
+Õ¸ 0xd5b8
+Õ¹ 0xd5b9
+Õº 0xd5ba
+Õ» 0xd5bb
+Õ¼ 0xd5bc
+Õ½ 0xd5bd
+Õ¾ 0xd5be
+Õ¿ 0xd5bf
+ÕÀ 0xd5c0
+ÕÁ 0xd5c1
+ÕÂ 0xd5c2
+ÕÃ 0xd5c3
+ÕÄ 0xd5c4
+ÕÅ 0xd5c5
+ÕÆ 0xd5c6
+ÕÇ 0xd5c7
+ÕÈ 0xd5c8
+ÕÉ 0xd5c9
+ÕÊ 0xd5ca
+ÕË 0xd5cb
+ÕÌ 0xd5cc
+ÕÍ 0xd5cd
+ÕÎ 0xd5ce
+ÕÏ 0xd5cf
+ÕÐ 0xd5d0
+ÕÑ 0xd5d1
+ÕÒ 0xd5d2
+ÕÓ 0xd5d3
+ÕÔ 0xd5d4
+ÕÕ 0xd5d5
+ÕÖ 0xd5d6
+Õ× 0xd5d7
+ÕØ 0xd5d8
+ÕÙ 0xd5d9
+ÕÚ 0xd5da
+ÕÛ 0xd5db
+ÕÜ 0xd5dc
+ÕÝ 0xd5dd
+ÕÞ 0xd5de
+Õß 0xd5df
+Õà 0xd5e0
+Õá 0xd5e1
+Õâ 0xd5e2
+Õã 0xd5e3
+Õä 0xd5e4
+Õå 0xd5e5
+Õæ 0xd5e6
+Õç 0xd5e7
+Õè 0xd5e8
+Õé 0xd5e9
+Õê 0xd5ea
+Õë 0xd5eb
+Õì 0xd5ec
+Õí 0xd5ed
+Õî 0xd5ee
+Õï 0xd5ef
+Õð 0xd5f0
+Õñ 0xd5f1
+Õò 0xd5f2
+Õó 0xd5f3
+Õô 0xd5f4
+Õõ 0xd5f5
+Õö 0xd5f6
+Õ÷ 0xd5f7
+Õø 0xd5f8
+Õù 0xd5f9
+Õú 0xd5fa
+Õû 0xd5fb
+Õü 0xd5fc
+Õý 0xd5fd
+Õþ 0xd5fe
+Ö@ 0xd640
+ÖA 0xd641
+ÖB 0xd642
+ÖC 0xd643
+ÖD 0xd644
+ÖE 0xd645
+ÖF 0xd646
+ÖG 0xd647
+ÖH 0xd648
+ÖI 0xd649
+ÖJ 0xd64a
+ÖK 0xd64b
+ÖL 0xd64c
+ÖM 0xd64d
+ÖN 0xd64e
+ÖO 0xd64f
+ÖP 0xd650
+ÖQ 0xd651
+ÖR 0xd652
+ÖS 0xd653
+ÖT 0xd654
+ÖU 0xd655
+ÖV 0xd656
+ÖW 0xd657
+ÖX 0xd658
+ÖY 0xd659
+ÖZ 0xd65a
+Ö[ 0xd65b
+Ö\ 0xd65c
+Ö] 0xd65d
+Ö^ 0xd65e
+Ö_ 0xd65f
+Ö` 0xd660
+Öa 0xd661
+Öb 0xd662
+Öc 0xd663
+Öd 0xd664
+Öe 0xd665
+Öf 0xd666
+Ög 0xd667
+Öh 0xd668
+Öi 0xd669
+Öj 0xd66a
+Ök 0xd66b
+Öl 0xd66c
+Öm 0xd66d
+Ön 0xd66e
+Öo 0xd66f
+Öp 0xd670
+Öq 0xd671
+Ör 0xd672
+Ös 0xd673
+Öt 0xd674
+Öu 0xd675
+Öv 0xd676
+Öw 0xd677
+Öx 0xd678
+Öy 0xd679
+Öz 0xd67a
+Ö{ 0xd67b
+Ö| 0xd67c
+Ö} 0xd67d
+Ö~ 0xd67e
+Ö¡ 0xd6a1
+Ö¢ 0xd6a2
+Ö£ 0xd6a3
+Ö¤ 0xd6a4
+Ö¥ 0xd6a5
+Ö¦ 0xd6a6
+Ö§ 0xd6a7
+Ö¨ 0xd6a8
+Ö© 0xd6a9
+Öª 0xd6aa
+Ö« 0xd6ab
+Ö¬ 0xd6ac
+Ö­ 0xd6ad
+Ö® 0xd6ae
+Ö¯ 0xd6af
+Ö° 0xd6b0
+Ö± 0xd6b1
+Ö² 0xd6b2
+Ö³ 0xd6b3
+Ö´ 0xd6b4
+Öµ 0xd6b5
+Ö¶ 0xd6b6
+Ö· 0xd6b7
+Ö¸ 0xd6b8
+Ö¹ 0xd6b9
+Öº 0xd6ba
+Ö» 0xd6bb
+Ö¼ 0xd6bc
+Ö½ 0xd6bd
+Ö¾ 0xd6be
+Ö¿ 0xd6bf
+ÖÀ 0xd6c0
+ÖÁ 0xd6c1
+ÖÂ 0xd6c2
+ÖÃ 0xd6c3
+ÖÄ 0xd6c4
+ÖÅ 0xd6c5
+ÖÆ 0xd6c6
+ÖÇ 0xd6c7
+ÖÈ 0xd6c8
+ÖÉ 0xd6c9
+ÖÊ 0xd6ca
+ÖË 0xd6cb
+ÖÌ 0xd6cc
+ÖÍ 0xd6cd
+ÖÎ 0xd6ce
+ÖÏ 0xd6cf
+ÖÐ 0xd6d0
+ÖÑ 0xd6d1
+ÖÒ 0xd6d2
+ÖÓ 0xd6d3
+ÖÔ 0xd6d4
+ÖÕ 0xd6d5
+ÖÖ 0xd6d6
+Ö× 0xd6d7
+ÖØ 0xd6d8
+ÖÙ 0xd6d9
+ÖÚ 0xd6da
+ÖÛ 0xd6db
+ÖÜ 0xd6dc
+ÖÝ 0xd6dd
+ÖÞ 0xd6de
+Öß 0xd6df
+Öà 0xd6e0
+Öá 0xd6e1
+Öâ 0xd6e2
+Öã 0xd6e3
+Öä 0xd6e4
+Öå 0xd6e5
+Öæ 0xd6e6
+Öç 0xd6e7
+Öè 0xd6e8
+Öé 0xd6e9
+Öê 0xd6ea
+Öë 0xd6eb
+Öì 0xd6ec
+Öí 0xd6ed
+Öî 0xd6ee
+Öï 0xd6ef
+Öð 0xd6f0
+Öñ 0xd6f1
+Öò 0xd6f2
+Öó 0xd6f3
+Öô 0xd6f4
+Öõ 0xd6f5
+Öö 0xd6f6
+Ö÷ 0xd6f7
+Öø 0xd6f8
+Öù 0xd6f9
+Öú 0xd6fa
+Öû 0xd6fb
+Öü 0xd6fc
+Öý 0xd6fd
+Öþ 0xd6fe
+×@ 0xd740
+×A 0xd741
+×B 0xd742
+×C 0xd743
+×D 0xd744
+×E 0xd745
+×F 0xd746
+×G 0xd747
+×H 0xd748
+×I 0xd749
+×J 0xd74a
+×K 0xd74b
+×L 0xd74c
+×M 0xd74d
+×N 0xd74e
+×O 0xd74f
+×P 0xd750
+×Q 0xd751
+×R 0xd752
+×S 0xd753
+×T 0xd754
+×U 0xd755
+×V 0xd756
+×W 0xd757
+×X 0xd758
+×Y 0xd759
+×Z 0xd75a
+×[ 0xd75b
+×\ 0xd75c
+×] 0xd75d
+×^ 0xd75e
+×_ 0xd75f
+×` 0xd760
+×a 0xd761
+×b 0xd762
+×c 0xd763
+×d 0xd764
+×e 0xd765
+×f 0xd766
+×g 0xd767
+×h 0xd768
+×i 0xd769
+×j 0xd76a
+×k 0xd76b
+×l 0xd76c
+×m 0xd76d
+×n 0xd76e
+×o 0xd76f
+×p 0xd770
+×q 0xd771
+×r 0xd772
+×s 0xd773
+×t 0xd774
+×u 0xd775
+×v 0xd776
+×w 0xd777
+×x 0xd778
+×y 0xd779
+×z 0xd77a
+×{ 0xd77b
+×| 0xd77c
+×} 0xd77d
+×~ 0xd77e
+ס 0xd7a1
+×¢ 0xd7a2
+×£ 0xd7a3
+פ 0xd7a4
+×¥ 0xd7a5
+צ 0xd7a6
+ק 0xd7a7
+ר 0xd7a8
+ש 0xd7a9
+ת 0xd7aa
+׫ 0xd7ab
+׬ 0xd7ac
+×­ 0xd7ad
+×® 0xd7ae
+ׯ 0xd7af
+×° 0xd7b0
+×± 0xd7b1
+ײ 0xd7b2
+׳ 0xd7b3
+×´ 0xd7b4
+×µ 0xd7b5
+׶ 0xd7b6
+×· 0xd7b7
+׸ 0xd7b8
+×¹ 0xd7b9
+׺ 0xd7ba
+×» 0xd7bb
+×¼ 0xd7bc
+×½ 0xd7bd
+×¾ 0xd7be
+׿ 0xd7bf
+×À 0xd7c0
+×Á 0xd7c1
+× 0xd7c2
+×à 0xd7c3
+×Ä 0xd7c4
+×Å 0xd7c5
+×Æ 0xd7c6
+×Ç 0xd7c7
+×È 0xd7c8
+×É 0xd7c9
+×Ê 0xd7ca
+×Ë 0xd7cb
+×Ì 0xd7cc
+×Í 0xd7cd
+×Î 0xd7ce
+×Ï 0xd7cf
+×Ð 0xd7d0
+×Ñ 0xd7d1
+×Ò 0xd7d2
+×Ó 0xd7d3
+×Ô 0xd7d4
+×Õ 0xd7d5
+×Ö 0xd7d6
+×× 0xd7d7
+×Ø 0xd7d8
+×Ù 0xd7d9
+×Ú 0xd7da
+×Û 0xd7db
+×Ü 0xd7dc
+×Ý 0xd7dd
+×Þ 0xd7de
+×ß 0xd7df
+×à 0xd7e0
+×á 0xd7e1
+×â 0xd7e2
+×ã 0xd7e3
+×ä 0xd7e4
+×å 0xd7e5
+×æ 0xd7e6
+×ç 0xd7e7
+×è 0xd7e8
+×é 0xd7e9
+×ê 0xd7ea
+×ë 0xd7eb
+×ì 0xd7ec
+×í 0xd7ed
+×î 0xd7ee
+×ï 0xd7ef
+×ð 0xd7f0
+×ñ 0xd7f1
+×ò 0xd7f2
+×ó 0xd7f3
+×ô 0xd7f4
+×õ 0xd7f5
+×ö 0xd7f6
+×÷ 0xd7f7
+×ø 0xd7f8
+×ù 0xd7f9
+×ú 0xd7fa
+×û 0xd7fb
+×ü 0xd7fc
+×ý 0xd7fd
+×þ 0xd7fe
+Ø@ 0xd840
+ØA 0xd841
+ØB 0xd842
+ØC 0xd843
+ØD 0xd844
+ØE 0xd845
+ØF 0xd846
+ØG 0xd847
+ØH 0xd848
+ØI 0xd849
+ØJ 0xd84a
+ØK 0xd84b
+ØL 0xd84c
+ØM 0xd84d
+ØN 0xd84e
+ØO 0xd84f
+ØP 0xd850
+ØQ 0xd851
+ØR 0xd852
+ØS 0xd853
+ØT 0xd854
+ØU 0xd855
+ØV 0xd856
+ØW 0xd857
+ØX 0xd858
+ØY 0xd859
+ØZ 0xd85a
+Ø[ 0xd85b
+Ø\ 0xd85c
+Ø] 0xd85d
+Ø^ 0xd85e
+Ø_ 0xd85f
+Ø` 0xd860
+Øa 0xd861
+Øb 0xd862
+Øc 0xd863
+Ød 0xd864
+Øe 0xd865
+Øf 0xd866
+Øg 0xd867
+Øh 0xd868
+Øi 0xd869
+Øj 0xd86a
+Øk 0xd86b
+Øl 0xd86c
+Øm 0xd86d
+Øn 0xd86e
+Øo 0xd86f
+Øp 0xd870
+Øq 0xd871
+Ør 0xd872
+Øs 0xd873
+Øt 0xd874
+Øu 0xd875
+Øv 0xd876
+Øw 0xd877
+Øx 0xd878
+Øy 0xd879
+Øz 0xd87a
+Ø{ 0xd87b
+Ø| 0xd87c
+Ø} 0xd87d
+Ø~ 0xd87e
+Ø¡ 0xd8a1
+Ø¢ 0xd8a2
+Ø£ 0xd8a3
+ؤ 0xd8a4
+Ø¥ 0xd8a5
+ئ 0xd8a6
+ا 0xd8a7
+ب 0xd8a8
+Ø© 0xd8a9
+ت 0xd8aa
+Ø« 0xd8ab
+ج 0xd8ac
+Ø­ 0xd8ad
+Ø® 0xd8ae
+د 0xd8af
+Ø° 0xd8b0
+ر 0xd8b1
+ز 0xd8b2
+س 0xd8b3
+Ø´ 0xd8b4
+ص 0xd8b5
+ض 0xd8b6
+Ø· 0xd8b7
+ظ 0xd8b8
+ع 0xd8b9
+غ 0xd8ba
+Ø» 0xd8bb
+ؼ 0xd8bc
+ؽ 0xd8bd
+ؾ 0xd8be
+Ø¿ 0xd8bf
+ØÀ 0xd8c0
+ØÁ 0xd8c1
+ØÂ 0xd8c2
+ØÃ 0xd8c3
+ØÄ 0xd8c4
+ØÅ 0xd8c5
+ØÆ 0xd8c6
+ØÇ 0xd8c7
+ØÈ 0xd8c8
+ØÉ 0xd8c9
+ØÊ 0xd8ca
+ØË 0xd8cb
+ØÌ 0xd8cc
+ØÍ 0xd8cd
+ØÎ 0xd8ce
+ØÏ 0xd8cf
+ØÐ 0xd8d0
+ØÑ 0xd8d1
+ØÒ 0xd8d2
+ØÓ 0xd8d3
+ØÔ 0xd8d4
+ØÕ 0xd8d5
+ØÖ 0xd8d6
+Ø× 0xd8d7
+ØØ 0xd8d8
+ØÙ 0xd8d9
+ØÚ 0xd8da
+ØÛ 0xd8db
+ØÜ 0xd8dc
+ØÝ 0xd8dd
+ØÞ 0xd8de
+Øß 0xd8df
+Øà 0xd8e0
+Øá 0xd8e1
+Øâ 0xd8e2
+Øã 0xd8e3
+Øä 0xd8e4
+Øå 0xd8e5
+Øæ 0xd8e6
+Øç 0xd8e7
+Øè 0xd8e8
+Øé 0xd8e9
+Øê 0xd8ea
+Øë 0xd8eb
+Øì 0xd8ec
+Øí 0xd8ed
+Øî 0xd8ee
+Øï 0xd8ef
+Øð 0xd8f0
+Øñ 0xd8f1
+Øò 0xd8f2
+Øó 0xd8f3
+Øô 0xd8f4
+Øõ 0xd8f5
+Øö 0xd8f6
+Ø÷ 0xd8f7
+Øø 0xd8f8
+Øù 0xd8f9
+Øú 0xd8fa
+Øû 0xd8fb
+Øü 0xd8fc
+Øý 0xd8fd
+Øþ 0xd8fe
+Ù@ 0xd940
+ÙA 0xd941
+ÙB 0xd942
+ÙC 0xd943
+ÙD 0xd944
+ÙE 0xd945
+ÙF 0xd946
+ÙG 0xd947
+ÙH 0xd948
+ÙI 0xd949
+ÙJ 0xd94a
+ÙK 0xd94b
+ÙL 0xd94c
+ÙM 0xd94d
+ÙN 0xd94e
+ÙO 0xd94f
+ÙP 0xd950
+ÙQ 0xd951
+ÙR 0xd952
+ÙS 0xd953
+ÙT 0xd954
+ÙU 0xd955
+ÙV 0xd956
+ÙW 0xd957
+ÙX 0xd958
+ÙY 0xd959
+ÙZ 0xd95a
+Ù[ 0xd95b
+Ù\ 0xd95c
+Ù] 0xd95d
+Ù^ 0xd95e
+Ù_ 0xd95f
+Ù` 0xd960
+Ùa 0xd961
+Ùb 0xd962
+Ùc 0xd963
+Ùd 0xd964
+Ùe 0xd965
+Ùf 0xd966
+Ùg 0xd967
+Ùh 0xd968
+Ùi 0xd969
+Ùj 0xd96a
+Ùk 0xd96b
+Ùl 0xd96c
+Ùm 0xd96d
+Ùn 0xd96e
+Ùo 0xd96f
+Ùp 0xd970
+Ùq 0xd971
+Ùr 0xd972
+Ùs 0xd973
+Ùt 0xd974
+Ùu 0xd975
+Ùv 0xd976
+Ùw 0xd977
+Ùx 0xd978
+Ùy 0xd979
+Ùz 0xd97a
+Ù{ 0xd97b
+Ù| 0xd97c
+Ù} 0xd97d
+Ù~ 0xd97e
+Ù¡ 0xd9a1
+Ù¢ 0xd9a2
+Ù£ 0xd9a3
+Ù¤ 0xd9a4
+Ù¥ 0xd9a5
+Ù¦ 0xd9a6
+Ù§ 0xd9a7
+Ù¨ 0xd9a8
+Ù© 0xd9a9
+Ùª 0xd9aa
+Ù« 0xd9ab
+Ù¬ 0xd9ac
+Ù­ 0xd9ad
+Ù® 0xd9ae
+Ù¯ 0xd9af
+Ù° 0xd9b0
+Ù± 0xd9b1
+Ù² 0xd9b2
+Ù³ 0xd9b3
+Ù´ 0xd9b4
+Ùµ 0xd9b5
+Ù¶ 0xd9b6
+Ù· 0xd9b7
+Ù¸ 0xd9b8
+Ù¹ 0xd9b9
+Ùº 0xd9ba
+Ù» 0xd9bb
+Ù¼ 0xd9bc
+Ù½ 0xd9bd
+Ù¾ 0xd9be
+Ù¿ 0xd9bf
+ÙÀ 0xd9c0
+ÙÁ 0xd9c1
+ÙÂ 0xd9c2
+ÙÃ 0xd9c3
+ÙÄ 0xd9c4
+ÙÅ 0xd9c5
+ÙÆ 0xd9c6
+ÙÇ 0xd9c7
+ÙÈ 0xd9c8
+ÙÉ 0xd9c9
+ÙÊ 0xd9ca
+ÙË 0xd9cb
+ÙÌ 0xd9cc
+ÙÍ 0xd9cd
+ÙÎ 0xd9ce
+ÙÏ 0xd9cf
+ÙÐ 0xd9d0
+ÙÑ 0xd9d1
+ÙÒ 0xd9d2
+ÙÓ 0xd9d3
+ÙÔ 0xd9d4
+ÙÕ 0xd9d5
+ÙÖ 0xd9d6
+Ù× 0xd9d7
+ÙØ 0xd9d8
+ÙÙ 0xd9d9
+ÙÚ 0xd9da
+ÙÛ 0xd9db
+ÙÜ 0xd9dc
+ÙÝ 0xd9dd
+ÙÞ 0xd9de
+Ùß 0xd9df
+Ùà 0xd9e0
+Ùá 0xd9e1
+Ùâ 0xd9e2
+Ùã 0xd9e3
+Ùä 0xd9e4
+Ùå 0xd9e5
+Ùæ 0xd9e6
+Ùç 0xd9e7
+Ùè 0xd9e8
+Ùé 0xd9e9
+Ùê 0xd9ea
+Ùë 0xd9eb
+Ùì 0xd9ec
+Ùí 0xd9ed
+Ùî 0xd9ee
+Ùï 0xd9ef
+Ùð 0xd9f0
+Ùñ 0xd9f1
+Ùò 0xd9f2
+Ùó 0xd9f3
+Ùô 0xd9f4
+Ùõ 0xd9f5
+Ùö 0xd9f6
+Ù÷ 0xd9f7
+Ùø 0xd9f8
+Ùù 0xd9f9
+Ùú 0xd9fa
+Ùû 0xd9fb
+Ùü 0xd9fc
+Ùý 0xd9fd
+Ùþ 0xd9fe
+Ú@ 0xda40
+ÚA 0xda41
+ÚB 0xda42
+ÚC 0xda43
+ÚD 0xda44
+ÚE 0xda45
+ÚF 0xda46
+ÚG 0xda47
+ÚH 0xda48
+ÚI 0xda49
+ÚJ 0xda4a
+ÚK 0xda4b
+ÚL 0xda4c
+ÚM 0xda4d
+ÚN 0xda4e
+ÚO 0xda4f
+ÚP 0xda50
+ÚQ 0xda51
+ÚR 0xda52
+ÚS 0xda53
+ÚT 0xda54
+ÚU 0xda55
+ÚV 0xda56
+ÚW 0xda57
+ÚX 0xda58
+ÚY 0xda59
+ÚZ 0xda5a
+Ú[ 0xda5b
+Ú\ 0xda5c
+Ú] 0xda5d
+Ú^ 0xda5e
+Ú_ 0xda5f
+Ú` 0xda60
+Úa 0xda61
+Úb 0xda62
+Úc 0xda63
+Úd 0xda64
+Úe 0xda65
+Úf 0xda66
+Úg 0xda67
+Úh 0xda68
+Úi 0xda69
+Új 0xda6a
+Úk 0xda6b
+Úl 0xda6c
+Úm 0xda6d
+Ún 0xda6e
+Úo 0xda6f
+Úp 0xda70
+Úq 0xda71
+Úr 0xda72
+Ús 0xda73
+Út 0xda74
+Úu 0xda75
+Úv 0xda76
+Úw 0xda77
+Úx 0xda78
+Úy 0xda79
+Úz 0xda7a
+Ú{ 0xda7b
+Ú| 0xda7c
+Ú} 0xda7d
+Ú~ 0xda7e
+Ú¡ 0xdaa1
+Ú¢ 0xdaa2
+Ú£ 0xdaa3
+Ú¤ 0xdaa4
+Ú¥ 0xdaa5
+Ú¦ 0xdaa6
+Ú§ 0xdaa7
+Ú¨ 0xdaa8
+Ú© 0xdaa9
+Úª 0xdaaa
+Ú« 0xdaab
+Ú¬ 0xdaac
+Ú­ 0xdaad
+Ú® 0xdaae
+Ú¯ 0xdaaf
+Ú° 0xdab0
+Ú± 0xdab1
+Ú² 0xdab2
+Ú³ 0xdab3
+Ú´ 0xdab4
+Úµ 0xdab5
+Ú¶ 0xdab6
+Ú· 0xdab7
+Ú¸ 0xdab8
+Ú¹ 0xdab9
+Úº 0xdaba
+Ú» 0xdabb
+Ú¼ 0xdabc
+Ú½ 0xdabd
+Ú¾ 0xdabe
+Ú¿ 0xdabf
+ÚÀ 0xdac0
+ÚÁ 0xdac1
+ÚÂ 0xdac2
+ÚÃ 0xdac3
+ÚÄ 0xdac4
+ÚÅ 0xdac5
+ÚÆ 0xdac6
+ÚÇ 0xdac7
+ÚÈ 0xdac8
+ÚÉ 0xdac9
+ÚÊ 0xdaca
+ÚË 0xdacb
+ÚÌ 0xdacc
+ÚÍ 0xdacd
+ÚÎ 0xdace
+ÚÏ 0xdacf
+ÚÐ 0xdad0
+ÚÑ 0xdad1
+ÚÒ 0xdad2
+ÚÓ 0xdad3
+ÚÔ 0xdad4
+ÚÕ 0xdad5
+ÚÖ 0xdad6
+Ú× 0xdad7
+ÚØ 0xdad8
+ÚÙ 0xdad9
+ÚÚ 0xdada
+ÚÛ 0xdadb
+ÚÜ 0xdadc
+ÚÝ 0xdadd
+ÚÞ 0xdade
+Úß 0xdadf
+Úà 0xdae0
+Úá 0xdae1
+Úâ 0xdae2
+Úã 0xdae3
+Úä 0xdae4
+Úå 0xdae5
+Úæ 0xdae6
+Úç 0xdae7
+Úè 0xdae8
+Úé 0xdae9
+Úê 0xdaea
+Úë 0xdaeb
+Úì 0xdaec
+Úí 0xdaed
+Úî 0xdaee
+Úï 0xdaef
+Úð 0xdaf0
+Úñ 0xdaf1
+Úò 0xdaf2
+Úó 0xdaf3
+Úô 0xdaf4
+Úõ 0xdaf5
+Úö 0xdaf6
+Ú÷ 0xdaf7
+Úø 0xdaf8
+Úù 0xdaf9
+Úú 0xdafa
+Úû 0xdafb
+Úü 0xdafc
+Úý 0xdafd
+Úþ 0xdafe
+Û@ 0xdb40
+ÛA 0xdb41
+ÛB 0xdb42
+ÛC 0xdb43
+ÛD 0xdb44
+ÛE 0xdb45
+ÛF 0xdb46
+ÛG 0xdb47
+ÛH 0xdb48
+ÛI 0xdb49
+ÛJ 0xdb4a
+ÛK 0xdb4b
+ÛL 0xdb4c
+ÛM 0xdb4d
+ÛN 0xdb4e
+ÛO 0xdb4f
+ÛP 0xdb50
+ÛQ 0xdb51
+ÛR 0xdb52
+ÛS 0xdb53
+ÛT 0xdb54
+ÛU 0xdb55
+ÛV 0xdb56
+ÛW 0xdb57
+ÛX 0xdb58
+ÛY 0xdb59
+ÛZ 0xdb5a
+Û[ 0xdb5b
+Û\ 0xdb5c
+Û] 0xdb5d
+Û^ 0xdb5e
+Û_ 0xdb5f
+Û` 0xdb60
+Ûa 0xdb61
+Ûb 0xdb62
+Ûc 0xdb63
+Ûd 0xdb64
+Ûe 0xdb65
+Ûf 0xdb66
+Ûg 0xdb67
+Ûh 0xdb68
+Ûi 0xdb69
+Ûj 0xdb6a
+Ûk 0xdb6b
+Ûl 0xdb6c
+Ûm 0xdb6d
+Ûn 0xdb6e
+Ûo 0xdb6f
+Ûp 0xdb70
+Ûq 0xdb71
+Ûr 0xdb72
+Ûs 0xdb73
+Ût 0xdb74
+Ûu 0xdb75
+Ûv 0xdb76
+Ûw 0xdb77
+Ûx 0xdb78
+Ûy 0xdb79
+Ûz 0xdb7a
+Û{ 0xdb7b
+Û| 0xdb7c
+Û} 0xdb7d
+Û~ 0xdb7e
+Û¡ 0xdba1
+Û¢ 0xdba2
+Û£ 0xdba3
+Û¤ 0xdba4
+Û¥ 0xdba5
+Û¦ 0xdba6
+Û§ 0xdba7
+Û¨ 0xdba8
+Û© 0xdba9
+Ûª 0xdbaa
+Û« 0xdbab
+Û¬ 0xdbac
+Û­ 0xdbad
+Û® 0xdbae
+Û¯ 0xdbaf
+Û° 0xdbb0
+Û± 0xdbb1
+Û² 0xdbb2
+Û³ 0xdbb3
+Û´ 0xdbb4
+Ûµ 0xdbb5
+Û¶ 0xdbb6
+Û· 0xdbb7
+Û¸ 0xdbb8
+Û¹ 0xdbb9
+Ûº 0xdbba
+Û» 0xdbbb
+Û¼ 0xdbbc
+Û½ 0xdbbd
+Û¾ 0xdbbe
+Û¿ 0xdbbf
+ÛÀ 0xdbc0
+ÛÁ 0xdbc1
+ÛÂ 0xdbc2
+ÛÃ 0xdbc3
+ÛÄ 0xdbc4
+ÛÅ 0xdbc5
+ÛÆ 0xdbc6
+ÛÇ 0xdbc7
+ÛÈ 0xdbc8
+ÛÉ 0xdbc9
+ÛÊ 0xdbca
+ÛË 0xdbcb
+ÛÌ 0xdbcc
+ÛÍ 0xdbcd
+ÛÎ 0xdbce
+ÛÏ 0xdbcf
+ÛÐ 0xdbd0
+ÛÑ 0xdbd1
+ÛÒ 0xdbd2
+ÛÓ 0xdbd3
+ÛÔ 0xdbd4
+ÛÕ 0xdbd5
+ÛÖ 0xdbd6
+Û× 0xdbd7
+ÛØ 0xdbd8
+ÛÙ 0xdbd9
+ÛÚ 0xdbda
+ÛÛ 0xdbdb
+ÛÜ 0xdbdc
+ÛÝ 0xdbdd
+ÛÞ 0xdbde
+Ûß 0xdbdf
+Ûà 0xdbe0
+Ûá 0xdbe1
+Ûâ 0xdbe2
+Ûã 0xdbe3
+Ûä 0xdbe4
+Ûå 0xdbe5
+Ûæ 0xdbe6
+Ûç 0xdbe7
+Ûè 0xdbe8
+Ûé 0xdbe9
+Ûê 0xdbea
+Ûë 0xdbeb
+Ûì 0xdbec
+Ûí 0xdbed
+Ûî 0xdbee
+Ûï 0xdbef
+Ûð 0xdbf0
+Ûñ 0xdbf1
+Ûò 0xdbf2
+Ûó 0xdbf3
+Ûô 0xdbf4
+Ûõ 0xdbf5
+Ûö 0xdbf6
+Û÷ 0xdbf7
+Ûø 0xdbf8
+Ûù 0xdbf9
+Ûú 0xdbfa
+Ûû 0xdbfb
+Ûü 0xdbfc
+Ûý 0xdbfd
+Ûþ 0xdbfe
+Ü@ 0xdc40
+ÜA 0xdc41
+ÜB 0xdc42
+ÜC 0xdc43
+ÜD 0xdc44
+ÜE 0xdc45
+ÜF 0xdc46
+ÜG 0xdc47
+ÜH 0xdc48
+ÜI 0xdc49
+ÜJ 0xdc4a
+ÜK 0xdc4b
+ÜL 0xdc4c
+ÜM 0xdc4d
+ÜN 0xdc4e
+ÜO 0xdc4f
+ÜP 0xdc50
+ÜQ 0xdc51
+ÜR 0xdc52
+ÜS 0xdc53
+ÜT 0xdc54
+ÜU 0xdc55
+ÜV 0xdc56
+ÜW 0xdc57
+ÜX 0xdc58
+ÜY 0xdc59
+ÜZ 0xdc5a
+Ü[ 0xdc5b
+Ü\ 0xdc5c
+Ü] 0xdc5d
+Ü^ 0xdc5e
+Ü_ 0xdc5f
+Ü` 0xdc60
+Üa 0xdc61
+Üb 0xdc62
+Üc 0xdc63
+Üd 0xdc64
+Üe 0xdc65
+Üf 0xdc66
+Üg 0xdc67
+Üh 0xdc68
+Üi 0xdc69
+Üj 0xdc6a
+Ük 0xdc6b
+Ül 0xdc6c
+Üm 0xdc6d
+Ün 0xdc6e
+Üo 0xdc6f
+Üp 0xdc70
+Üq 0xdc71
+Ür 0xdc72
+Üs 0xdc73
+Üt 0xdc74
+Üu 0xdc75
+Üv 0xdc76
+Üw 0xdc77
+Üx 0xdc78
+Üy 0xdc79
+Üz 0xdc7a
+Ü{ 0xdc7b
+Ü| 0xdc7c
+Ü} 0xdc7d
+Ü~ 0xdc7e
+Ü¡ 0xdca1
+Ü¢ 0xdca2
+Ü£ 0xdca3
+ܤ 0xdca4
+Ü¥ 0xdca5
+ܦ 0xdca6
+ܧ 0xdca7
+ܨ 0xdca8
+Ü© 0xdca9
+ܪ 0xdcaa
+Ü« 0xdcab
+ܬ 0xdcac
+Ü­ 0xdcad
+Ü® 0xdcae
+ܯ 0xdcaf
+Ü° 0xdcb0
+ܱ 0xdcb1
+ܲ 0xdcb2
+ܳ 0xdcb3
+Ü´ 0xdcb4
+ܵ 0xdcb5
+ܶ 0xdcb6
+Ü· 0xdcb7
+ܸ 0xdcb8
+ܹ 0xdcb9
+ܺ 0xdcba
+Ü» 0xdcbb
+ܼ 0xdcbc
+ܽ 0xdcbd
+ܾ 0xdcbe
+Ü¿ 0xdcbf
+ÜÀ 0xdcc0
+ÜÁ 0xdcc1
+ÜÂ 0xdcc2
+ÜÃ 0xdcc3
+ÜÄ 0xdcc4
+ÜÅ 0xdcc5
+ÜÆ 0xdcc6
+ÜÇ 0xdcc7
+ÜÈ 0xdcc8
+ÜÉ 0xdcc9
+ÜÊ 0xdcca
+ÜË 0xdccb
+ÜÌ 0xdccc
+ÜÍ 0xdccd
+ÜÎ 0xdcce
+ÜÏ 0xdccf
+ÜÐ 0xdcd0
+ÜÑ 0xdcd1
+ÜÒ 0xdcd2
+ÜÓ 0xdcd3
+ÜÔ 0xdcd4
+ÜÕ 0xdcd5
+ÜÖ 0xdcd6
+Ü× 0xdcd7
+ÜØ 0xdcd8
+ÜÙ 0xdcd9
+ÜÚ 0xdcda
+ÜÛ 0xdcdb
+ÜÜ 0xdcdc
+ÜÝ 0xdcdd
+ÜÞ 0xdcde
+Üß 0xdcdf
+Üà 0xdce0
+Üá 0xdce1
+Üâ 0xdce2
+Üã 0xdce3
+Üä 0xdce4
+Üå 0xdce5
+Üæ 0xdce6
+Üç 0xdce7
+Üè 0xdce8
+Üé 0xdce9
+Üê 0xdcea
+Üë 0xdceb
+Üì 0xdcec
+Üí 0xdced
+Üî 0xdcee
+Üï 0xdcef
+Üð 0xdcf0
+Üñ 0xdcf1
+Üò 0xdcf2
+Üó 0xdcf3
+Üô 0xdcf4
+Üõ 0xdcf5
+Üö 0xdcf6
+Ü÷ 0xdcf7
+Üø 0xdcf8
+Üù 0xdcf9
+Üú 0xdcfa
+Üû 0xdcfb
+Üü 0xdcfc
+Üý 0xdcfd
+Üþ 0xdcfe
+Ý@ 0xdd40
+ÝA 0xdd41
+ÝB 0xdd42
+ÝC 0xdd43
+ÝD 0xdd44
+ÝE 0xdd45
+ÝF 0xdd46
+ÝG 0xdd47
+ÝH 0xdd48
+ÝI 0xdd49
+ÝJ 0xdd4a
+ÝK 0xdd4b
+ÝL 0xdd4c
+ÝM 0xdd4d
+ÝN 0xdd4e
+ÝO 0xdd4f
+ÝP 0xdd50
+ÝQ 0xdd51
+ÝR 0xdd52
+ÝS 0xdd53
+ÝT 0xdd54
+ÝU 0xdd55
+ÝV 0xdd56
+ÝW 0xdd57
+ÝX 0xdd58
+ÝY 0xdd59
+ÝZ 0xdd5a
+Ý[ 0xdd5b
+Ý\ 0xdd5c
+Ý] 0xdd5d
+Ý^ 0xdd5e
+Ý_ 0xdd5f
+Ý` 0xdd60
+Ýa 0xdd61
+Ýb 0xdd62
+Ýc 0xdd63
+Ýd 0xdd64
+Ýe 0xdd65
+Ýf 0xdd66
+Ýg 0xdd67
+Ýh 0xdd68
+Ýi 0xdd69
+Ýj 0xdd6a
+Ýk 0xdd6b
+Ýl 0xdd6c
+Ým 0xdd6d
+Ýn 0xdd6e
+Ýo 0xdd6f
+Ýp 0xdd70
+Ýq 0xdd71
+Ýr 0xdd72
+Ýs 0xdd73
+Ýt 0xdd74
+Ýu 0xdd75
+Ýv 0xdd76
+Ýw 0xdd77
+Ýx 0xdd78
+Ýy 0xdd79
+Ýz 0xdd7a
+Ý{ 0xdd7b
+Ý| 0xdd7c
+Ý} 0xdd7d
+Ý~ 0xdd7e
+Ý¡ 0xdda1
+Ý¢ 0xdda2
+Ý£ 0xdda3
+ݤ 0xdda4
+Ý¥ 0xdda5
+ݦ 0xdda6
+ݧ 0xdda7
+ݨ 0xdda8
+Ý© 0xdda9
+ݪ 0xddaa
+Ý« 0xddab
+ݬ 0xddac
+Ý­ 0xddad
+Ý® 0xddae
+ݯ 0xddaf
+Ý° 0xddb0
+ݱ 0xddb1
+ݲ 0xddb2
+ݳ 0xddb3
+Ý´ 0xddb4
+ݵ 0xddb5
+ݶ 0xddb6
+Ý· 0xddb7
+ݸ 0xddb8
+ݹ 0xddb9
+ݺ 0xddba
+Ý» 0xddbb
+ݼ 0xddbc
+ݽ 0xddbd
+ݾ 0xddbe
+Ý¿ 0xddbf
+ÝÀ 0xddc0
+ÝÁ 0xddc1
+ÝÂ 0xddc2
+ÝÃ 0xddc3
+ÝÄ 0xddc4
+ÝÅ 0xddc5
+ÝÆ 0xddc6
+ÝÇ 0xddc7
+ÝÈ 0xddc8
+ÝÉ 0xddc9
+ÝÊ 0xddca
+ÝË 0xddcb
+ÝÌ 0xddcc
+ÝÍ 0xddcd
+ÝÎ 0xddce
+ÝÏ 0xddcf
+ÝÐ 0xddd0
+ÝÑ 0xddd1
+ÝÒ 0xddd2
+ÝÓ 0xddd3
+ÝÔ 0xddd4
+ÝÕ 0xddd5
+ÝÖ 0xddd6
+Ý× 0xddd7
+ÝØ 0xddd8
+ÝÙ 0xddd9
+ÝÚ 0xddda
+ÝÛ 0xdddb
+ÝÜ 0xdddc
+ÝÝ 0xdddd
+ÝÞ 0xddde
+Ýß 0xdddf
+Ýà 0xdde0
+Ýá 0xdde1
+Ýâ 0xdde2
+Ýã 0xdde3
+Ýä 0xdde4
+Ýå 0xdde5
+Ýæ 0xdde6
+Ýç 0xdde7
+Ýè 0xdde8
+Ýé 0xdde9
+Ýê 0xddea
+Ýë 0xddeb
+Ýì 0xddec
+Ýí 0xdded
+Ýî 0xddee
+Ýï 0xddef
+Ýð 0xddf0
+Ýñ 0xddf1
+Ýò 0xddf2
+Ýó 0xddf3
+Ýô 0xddf4
+Ýõ 0xddf5
+Ýö 0xddf6
+Ý÷ 0xddf7
+Ýø 0xddf8
+Ýù 0xddf9
+Ýú 0xddfa
+Ýû 0xddfb
+Ýü 0xddfc
+Ýý 0xddfd
+Ýþ 0xddfe
+Þ@ 0xde40
+ÞA 0xde41
+ÞB 0xde42
+ÞC 0xde43
+ÞD 0xde44
+ÞE 0xde45
+ÞF 0xde46
+ÞG 0xde47
+ÞH 0xde48
+ÞI 0xde49
+ÞJ 0xde4a
+ÞK 0xde4b
+ÞL 0xde4c
+ÞM 0xde4d
+ÞN 0xde4e
+ÞO 0xde4f
+ÞP 0xde50
+ÞQ 0xde51
+ÞR 0xde52
+ÞS 0xde53
+ÞT 0xde54
+ÞU 0xde55
+ÞV 0xde56
+ÞW 0xde57
+ÞX 0xde58
+ÞY 0xde59
+ÞZ 0xde5a
+Þ[ 0xde5b
+Þ\ 0xde5c
+Þ] 0xde5d
+Þ^ 0xde5e
+Þ_ 0xde5f
+Þ` 0xde60
+Þa 0xde61
+Þb 0xde62
+Þc 0xde63
+Þd 0xde64
+Þe 0xde65
+Þf 0xde66
+Þg 0xde67
+Þh 0xde68
+Þi 0xde69
+Þj 0xde6a
+Þk 0xde6b
+Þl 0xde6c
+Þm 0xde6d
+Þn 0xde6e
+Þo 0xde6f
+Þp 0xde70
+Þq 0xde71
+Þr 0xde72
+Þs 0xde73
+Þt 0xde74
+Þu 0xde75
+Þv 0xde76
+Þw 0xde77
+Þx 0xde78
+Þy 0xde79
+Þz 0xde7a
+Þ{ 0xde7b
+Þ| 0xde7c
+Þ} 0xde7d
+Þ~ 0xde7e
+Þ¡ 0xdea1
+Þ¢ 0xdea2
+Þ£ 0xdea3
+Þ¤ 0xdea4
+Þ¥ 0xdea5
+Þ¦ 0xdea6
+Þ§ 0xdea7
+Þ¨ 0xdea8
+Þ© 0xdea9
+Þª 0xdeaa
+Þ« 0xdeab
+Þ¬ 0xdeac
+Þ­ 0xdead
+Þ® 0xdeae
+Þ¯ 0xdeaf
+Þ° 0xdeb0
+Þ± 0xdeb1
+Þ² 0xdeb2
+Þ³ 0xdeb3
+Þ´ 0xdeb4
+Þµ 0xdeb5
+Þ¶ 0xdeb6
+Þ· 0xdeb7
+Þ¸ 0xdeb8
+Þ¹ 0xdeb9
+Þº 0xdeba
+Þ» 0xdebb
+Þ¼ 0xdebc
+Þ½ 0xdebd
+Þ¾ 0xdebe
+Þ¿ 0xdebf
+ÞÀ 0xdec0
+ÞÁ 0xdec1
+ÞÂ 0xdec2
+ÞÃ 0xdec3
+ÞÄ 0xdec4
+ÞÅ 0xdec5
+ÞÆ 0xdec6
+ÞÇ 0xdec7
+ÞÈ 0xdec8
+ÞÉ 0xdec9
+ÞÊ 0xdeca
+ÞË 0xdecb
+ÞÌ 0xdecc
+ÞÍ 0xdecd
+ÞÎ 0xdece
+ÞÏ 0xdecf
+ÞÐ 0xded0
+ÞÑ 0xded1
+ÞÒ 0xded2
+ÞÓ 0xded3
+ÞÔ 0xded4
+ÞÕ 0xded5
+ÞÖ 0xded6
+Þ× 0xded7
+ÞØ 0xded8
+ÞÙ 0xded9
+ÞÚ 0xdeda
+ÞÛ 0xdedb
+ÞÜ 0xdedc
+ÞÝ 0xdedd
+ÞÞ 0xdede
+Þß 0xdedf
+Þà 0xdee0
+Þá 0xdee1
+Þâ 0xdee2
+Þã 0xdee3
+Þä 0xdee4
+Þå 0xdee5
+Þæ 0xdee6
+Þç 0xdee7
+Þè 0xdee8
+Þé 0xdee9
+Þê 0xdeea
+Þë 0xdeeb
+Þì 0xdeec
+Þí 0xdeed
+Þî 0xdeee
+Þï 0xdeef
+Þð 0xdef0
+Þñ 0xdef1
+Þò 0xdef2
+Þó 0xdef3
+Þô 0xdef4
+Þõ 0xdef5
+Þö 0xdef6
+Þ÷ 0xdef7
+Þø 0xdef8
+Þù 0xdef9
+Þú 0xdefa
+Þû 0xdefb
+Þü 0xdefc
+Þý 0xdefd
+Þþ 0xdefe
+ß@ 0xdf40
+ßA 0xdf41
+ßB 0xdf42
+ßC 0xdf43
+ßD 0xdf44
+ßE 0xdf45
+ßF 0xdf46
+ßG 0xdf47
+ßH 0xdf48
+ßI 0xdf49
+ßJ 0xdf4a
+ßK 0xdf4b
+ßL 0xdf4c
+ßM 0xdf4d
+ßN 0xdf4e
+ßO 0xdf4f
+ßP 0xdf50
+ßQ 0xdf51
+ßR 0xdf52
+ßS 0xdf53
+ßT 0xdf54
+ßU 0xdf55
+ßV 0xdf56
+ßW 0xdf57
+ßX 0xdf58
+ßY 0xdf59
+ßZ 0xdf5a
+ß[ 0xdf5b
+ß\ 0xdf5c
+ß] 0xdf5d
+ß^ 0xdf5e
+ß_ 0xdf5f
+ß` 0xdf60
+ßa 0xdf61
+ßb 0xdf62
+ßc 0xdf63
+ßd 0xdf64
+ße 0xdf65
+ßf 0xdf66
+ßg 0xdf67
+ßh 0xdf68
+ßi 0xdf69
+ßj 0xdf6a
+ßk 0xdf6b
+ßl 0xdf6c
+ßm 0xdf6d
+ßn 0xdf6e
+ßo 0xdf6f
+ßp 0xdf70
+ßq 0xdf71
+ßr 0xdf72
+ßs 0xdf73
+ßt 0xdf74
+ßu 0xdf75
+ßv 0xdf76
+ßw 0xdf77
+ßx 0xdf78
+ßy 0xdf79
+ßz 0xdf7a
+ß{ 0xdf7b
+ß| 0xdf7c
+ß} 0xdf7d
+ß~ 0xdf7e
+ß¡ 0xdfa1
+ߢ 0xdfa2
+ߣ 0xdfa3
+ߤ 0xdfa4
+ߥ 0xdfa5
+ߦ 0xdfa6
+ߧ 0xdfa7
+ߨ 0xdfa8
+ß© 0xdfa9
+ߪ 0xdfaa
+ß« 0xdfab
+߬ 0xdfac
+ß­ 0xdfad
+ß® 0xdfae
+߯ 0xdfaf
+ß° 0xdfb0
+ß± 0xdfb1
+ß² 0xdfb2
+ß³ 0xdfb3
+ß´ 0xdfb4
+ßµ 0xdfb5
+߶ 0xdfb6
+ß· 0xdfb7
+߸ 0xdfb8
+ß¹ 0xdfb9
+ߺ 0xdfba
+ß» 0xdfbb
+ß¼ 0xdfbc
+ß½ 0xdfbd
+ß¾ 0xdfbe
+ß¿ 0xdfbf
+ßÀ 0xdfc0
+ßÁ 0xdfc1
+ß 0xdfc2
+ßà 0xdfc3
+Ꭰ0xdfc4
+Ꮰ0xdfc5
+ᒠ0xdfc6
+ဠ0xdfc7
+ßÈ 0xdfc8
+ᐠ0xdfc9
+ßÊ 0xdfca
+ßË 0xdfcb
+ßÌ 0xdfcc
+ßÍ 0xdfcd
+ßÎ 0xdfce
+ßÏ 0xdfcf
+ßÐ 0xdfd0
+ᥠ0xdfd1
+ßÒ 0xdfd2
+ßÓ 0xdfd3
+ßÔ 0xdfd4
+ßÕ 0xdfd5
+ßÖ 0xdfd6
+ß× 0xdfd7
+ßØ 0xdfd8
+ßÙ 0xdfd9
+ßÚ 0xdfda
+ßÛ 0xdfdb
+ᚠ0xdfdc
+ßÝ 0xdfdd
+ßÞ 0xdfde
+ßß 0xdfdf
+ßà 0xdfe0
+ßá 0xdfe1
+ßâ 0xdfe2
+ßã 0xdfe3
+ßä 0xdfe4
+ßå 0xdfe5
+ßæ 0xdfe6
+ßç 0xdfe7
+ßè 0xdfe8
+ßé 0xdfe9
+ßê 0xdfea
+ßë 0xdfeb
+ßì 0xdfec
+ßí 0xdfed
+ßî 0xdfee
+ßï 0xdfef
+ßð 0xdff0
+ßñ 0xdff1
+ßò 0xdff2
+ßó 0xdff3
+ßô 0xdff4
+ßõ 0xdff5
+ßö 0xdff6
+ß÷ 0xdff7
+ßø 0xdff8
+ßù 0xdff9
+ßú 0xdffa
+ßû 0xdffb
+ßü 0xdffc
+ßý 0xdffd
+ßþ 0xdffe
+à@ 0xe040
+àA 0xe041
+àB 0xe042
+àC 0xe043
+àD 0xe044
+àE 0xe045
+àF 0xe046
+àG 0xe047
+àH 0xe048
+àI 0xe049
+àJ 0xe04a
+àK 0xe04b
+àL 0xe04c
+àM 0xe04d
+àN 0xe04e
+àO 0xe04f
+àP 0xe050
+àQ 0xe051
+àR 0xe052
+àS 0xe053
+àT 0xe054
+àU 0xe055
+àV 0xe056
+àW 0xe057
+àX 0xe058
+àY 0xe059
+àZ 0xe05a
+à[ 0xe05b
+à\ 0xe05c
+à] 0xe05d
+à^ 0xe05e
+à_ 0xe05f
+à` 0xe060
+àa 0xe061
+àb 0xe062
+àc 0xe063
+àd 0xe064
+àe 0xe065
+àf 0xe066
+àg 0xe067
+àh 0xe068
+ài 0xe069
+àj 0xe06a
+àk 0xe06b
+àl 0xe06c
+àm 0xe06d
+àn 0xe06e
+ào 0xe06f
+àp 0xe070
+àq 0xe071
+àr 0xe072
+às 0xe073
+àt 0xe074
+àu 0xe075
+àv 0xe076
+àw 0xe077
+àx 0xe078
+ày 0xe079
+àz 0xe07a
+à{ 0xe07b
+à| 0xe07c
+à} 0xe07d
+à~ 0xe07e
+à¡ 0xe0a1
+ࢠ0xe0a2
+࣠0xe0a3
+ठ0xe0a4
+ॠ0xe0a5
+ঠ0xe0a6
+ৠ0xe0a7
+ਠ0xe0a8
+à© 0xe0a9
+ઠ0xe0aa
+à« 0xe0ab
+ଠ0xe0ac
+à­ 0xe0ad
+à® 0xe0ae
+௠0xe0af
+à° 0xe0b0
+à± 0xe0b1
+ಠ0xe0b2
+à³ 0xe0b3
+à´ 0xe0b4
+ൠ0xe0b5
+ච0xe0b6
+à· 0xe0b7
+ภ0xe0b8
+๠0xe0b9
+ຠ0xe0ba
+à» 0xe0bb
+༠0xe0bc
+འ0xe0bd
+ྠ0xe0be
+à¿ 0xe0bf
+àÀ 0xe0c0
+àÁ 0xe0c1
+à 0xe0c2
+àà 0xe0c3
+àÄ 0xe0c4
+àÅ 0xe0c5
+àÆ 0xe0c6
+àÇ 0xe0c7
+àÈ 0xe0c8
+àÉ 0xe0c9
+àÊ 0xe0ca
+àË 0xe0cb
+àÌ 0xe0cc
+àÍ 0xe0cd
+àÎ 0xe0ce
+àÏ 0xe0cf
+àÐ 0xe0d0
+àÑ 0xe0d1
+àÒ 0xe0d2
+àÓ 0xe0d3
+àÔ 0xe0d4
+àÕ 0xe0d5
+àÖ 0xe0d6
+à× 0xe0d7
+àØ 0xe0d8
+àÙ 0xe0d9
+àÚ 0xe0da
+àÛ 0xe0db
+àÜ 0xe0dc
+àÝ 0xe0dd
+àÞ 0xe0de
+àß 0xe0df
+àà 0xe0e0
+àá 0xe0e1
+àâ 0xe0e2
+àã 0xe0e3
+àä 0xe0e4
+àå 0xe0e5
+àæ 0xe0e6
+àç 0xe0e7
+àè 0xe0e8
+àé 0xe0e9
+àê 0xe0ea
+àë 0xe0eb
+àì 0xe0ec
+àí 0xe0ed
+àî 0xe0ee
+àï 0xe0ef
+àð 0xe0f0
+àñ 0xe0f1
+àò 0xe0f2
+àó 0xe0f3
+àô 0xe0f4
+àõ 0xe0f5
+àö 0xe0f6
+à÷ 0xe0f7
+àø 0xe0f8
+àù 0xe0f9
+àú 0xe0fa
+àû 0xe0fb
+àü 0xe0fc
+àý 0xe0fd
+àþ 0xe0fe
+á@ 0xe140
+áA 0xe141
+áB 0xe142
+áC 0xe143
+áD 0xe144
+áE 0xe145
+áF 0xe146
+áG 0xe147
+áH 0xe148
+áI 0xe149
+áJ 0xe14a
+áK 0xe14b
+áL 0xe14c
+áM 0xe14d
+áN 0xe14e
+áO 0xe14f
+áP 0xe150
+áQ 0xe151
+áR 0xe152
+áS 0xe153
+áT 0xe154
+áU 0xe155
+áV 0xe156
+áW 0xe157
+áX 0xe158
+áY 0xe159
+áZ 0xe15a
+á[ 0xe15b
+á\ 0xe15c
+á] 0xe15d
+á^ 0xe15e
+á_ 0xe15f
+á` 0xe160
+áa 0xe161
+áb 0xe162
+ác 0xe163
+ád 0xe164
+áe 0xe165
+áf 0xe166
+ág 0xe167
+áh 0xe168
+ái 0xe169
+áj 0xe16a
+ák 0xe16b
+ál 0xe16c
+ám 0xe16d
+án 0xe16e
+áo 0xe16f
+áp 0xe170
+áq 0xe171
+ár 0xe172
+ás 0xe173
+át 0xe174
+áu 0xe175
+áv 0xe176
+áw 0xe177
+áx 0xe178
+áy 0xe179
+áz 0xe17a
+á{ 0xe17b
+á| 0xe17c
+á} 0xe17d
+á~ 0xe17e
+á¡ 0xe1a1
+ᢠ0xe1a2
+ᣠ0xe1a3
+ᤠ0xe1a4
+ᥠ0xe1a5
+ᦠ0xe1a6
+᧠0xe1a7
+ᨠ0xe1a8
+á© 0xe1a9
+᪠0xe1aa
+á« 0xe1ab
+ᬠ0xe1ac
+á­ 0xe1ad
+á® 0xe1ae
+ᯠ0xe1af
+á° 0xe1b0
+á± 0xe1b1
+á² 0xe1b2
+á³ 0xe1b3
+á´ 0xe1b4
+áµ 0xe1b5
+ᶠ0xe1b6
+á· 0xe1b7
+Ḡ0xe1b8
+á¹ 0xe1b9
+Ạ0xe1ba
+á» 0xe1bb
+á¼ 0xe1bc
+á½ 0xe1bd
+á¾ 0xe1be
+á¿ 0xe1bf
+áÀ 0xe1c0
+áÁ 0xe1c1
+á 0xe1c2
+áà 0xe1c3
+áÄ 0xe1c4
+áÅ 0xe1c5
+áÆ 0xe1c6
+áÇ 0xe1c7
+áÈ 0xe1c8
+áÉ 0xe1c9
+áÊ 0xe1ca
+áË 0xe1cb
+áÌ 0xe1cc
+áÍ 0xe1cd
+áÎ 0xe1ce
+áÏ 0xe1cf
+áÐ 0xe1d0
+áÑ 0xe1d1
+áÒ 0xe1d2
+áÓ 0xe1d3
+áÔ 0xe1d4
+áÕ 0xe1d5
+áÖ 0xe1d6
+á× 0xe1d7
+áØ 0xe1d8
+áÙ 0xe1d9
+áÚ 0xe1da
+áÛ 0xe1db
+áÜ 0xe1dc
+áÝ 0xe1dd
+áÞ 0xe1de
+áß 0xe1df
+áà 0xe1e0
+áá 0xe1e1
+áâ 0xe1e2
+áã 0xe1e3
+áä 0xe1e4
+áå 0xe1e5
+áæ 0xe1e6
+áç 0xe1e7
+áè 0xe1e8
+áé 0xe1e9
+áê 0xe1ea
+áë 0xe1eb
+áì 0xe1ec
+áí 0xe1ed
+áî 0xe1ee
+áï 0xe1ef
+áð 0xe1f0
+áñ 0xe1f1
+áò 0xe1f2
+áó 0xe1f3
+áô 0xe1f4
+áõ 0xe1f5
+áö 0xe1f6
+á÷ 0xe1f7
+áø 0xe1f8
+áù 0xe1f9
+áú 0xe1fa
+áû 0xe1fb
+áü 0xe1fc
+áý 0xe1fd
+áþ 0xe1fe
+â@ 0xe240
+âA 0xe241
+âB 0xe242
+âC 0xe243
+âD 0xe244
+âE 0xe245
+âF 0xe246
+âG 0xe247
+âH 0xe248
+âI 0xe249
+âJ 0xe24a
+âK 0xe24b
+âL 0xe24c
+âM 0xe24d
+âN 0xe24e
+âO 0xe24f
+âP 0xe250
+âQ 0xe251
+âR 0xe252
+âS 0xe253
+âT 0xe254
+âU 0xe255
+âV 0xe256
+âW 0xe257
+âX 0xe258
+âY 0xe259
+âZ 0xe25a
+â[ 0xe25b
+â\ 0xe25c
+â] 0xe25d
+â^ 0xe25e
+â_ 0xe25f
+â` 0xe260
+âa 0xe261
+âb 0xe262
+âc 0xe263
+âd 0xe264
+âe 0xe265
+âf 0xe266
+âg 0xe267
+âh 0xe268
+âi 0xe269
+âj 0xe26a
+âk 0xe26b
+âl 0xe26c
+âm 0xe26d
+ân 0xe26e
+âo 0xe26f
+âp 0xe270
+âq 0xe271
+âr 0xe272
+âs 0xe273
+ât 0xe274
+âu 0xe275
+âv 0xe276
+âw 0xe277
+âx 0xe278
+ây 0xe279
+âz 0xe27a
+â{ 0xe27b
+â| 0xe27c
+â} 0xe27d
+â~ 0xe27e
+â¡ 0xe2a1
+⢠0xe2a2
+⣠0xe2a3
+⤠0xe2a4
+⥠0xe2a5
+⦠0xe2a6
+⧠0xe2a7
+⨠0xe2a8
+â© 0xe2a9
+⪠0xe2aa
+â« 0xe2ab
+⬠0xe2ac
+â­ 0xe2ad
+â® 0xe2ae
+⯠0xe2af
+â° 0xe2b0
+â± 0xe2b1
+â² 0xe2b2
+â³ 0xe2b3
+â´ 0xe2b4
+âµ 0xe2b5
+ⶠ0xe2b6
+â· 0xe2b7
+⸠0xe2b8
+â¹ 0xe2b9
+⺠0xe2ba
+â» 0xe2bb
+â¼ 0xe2bc
+â½ 0xe2bd
+â¾ 0xe2be
+â¿ 0xe2bf
+âÀ 0xe2c0
+âÁ 0xe2c1
+â 0xe2c2
+âà 0xe2c3
+âÄ 0xe2c4
+âÅ 0xe2c5
+âÆ 0xe2c6
+âÇ 0xe2c7
+âÈ 0xe2c8
+âÉ 0xe2c9
+âÊ 0xe2ca
+âË 0xe2cb
+âÌ 0xe2cc
+âÍ 0xe2cd
+âÎ 0xe2ce
+âÏ 0xe2cf
+âÐ 0xe2d0
+âÑ 0xe2d1
+âÒ 0xe2d2
+âÓ 0xe2d3
+âÔ 0xe2d4
+âÕ 0xe2d5
+âÖ 0xe2d6
+â× 0xe2d7
+âØ 0xe2d8
+âÙ 0xe2d9
+âÚ 0xe2da
+âÛ 0xe2db
+âÜ 0xe2dc
+âÝ 0xe2dd
+âÞ 0xe2de
+âß 0xe2df
+âà 0xe2e0
+âá 0xe2e1
+ââ 0xe2e2
+âã 0xe2e3
+âä 0xe2e4
+âå 0xe2e5
+âæ 0xe2e6
+âç 0xe2e7
+âè 0xe2e8
+âé 0xe2e9
+âê 0xe2ea
+âë 0xe2eb
+âì 0xe2ec
+âí 0xe2ed
+âî 0xe2ee
+âï 0xe2ef
+âð 0xe2f0
+âñ 0xe2f1
+âò 0xe2f2
+âó 0xe2f3
+âô 0xe2f4
+âõ 0xe2f5
+âö 0xe2f6
+â÷ 0xe2f7
+âø 0xe2f8
+âù 0xe2f9
+âú 0xe2fa
+âû 0xe2fb
+âü 0xe2fc
+âý 0xe2fd
+âþ 0xe2fe
+ã@ 0xe340
+ãA 0xe341
+ãB 0xe342
+ãC 0xe343
+ãD 0xe344
+ãE 0xe345
+ãF 0xe346
+ãG 0xe347
+ãH 0xe348
+ãI 0xe349
+ãJ 0xe34a
+ãK 0xe34b
+ãL 0xe34c
+ãM 0xe34d
+ãN 0xe34e
+ãO 0xe34f
+ãP 0xe350
+ãQ 0xe351
+ãR 0xe352
+ãS 0xe353
+ãT 0xe354
+ãU 0xe355
+ãV 0xe356
+ãW 0xe357
+ãX 0xe358
+ãY 0xe359
+ãZ 0xe35a
+ã[ 0xe35b
+ã\ 0xe35c
+ã] 0xe35d
+ã^ 0xe35e
+ã_ 0xe35f
+ã` 0xe360
+ãa 0xe361
+ãb 0xe362
+ãc 0xe363
+ãd 0xe364
+ãe 0xe365
+ãf 0xe366
+ãg 0xe367
+ãh 0xe368
+ãi 0xe369
+ãj 0xe36a
+ãk 0xe36b
+ãl 0xe36c
+ãm 0xe36d
+ãn 0xe36e
+ão 0xe36f
+ãp 0xe370
+ãq 0xe371
+ãr 0xe372
+ãs 0xe373
+ãt 0xe374
+ãu 0xe375
+ãv 0xe376
+ãw 0xe377
+ãx 0xe378
+ãy 0xe379
+ãz 0xe37a
+ã{ 0xe37b
+ã| 0xe37c
+ã} 0xe37d
+ã~ 0xe37e
+ã¡ 0xe3a1
+㢠0xe3a2
+㣠0xe3a3
+㤠0xe3a4
+㥠0xe3a5
+㦠0xe3a6
+㧠0xe3a7
+㨠0xe3a8
+ã© 0xe3a9
+㪠0xe3aa
+ã« 0xe3ab
+㬠0xe3ac
+ã­ 0xe3ad
+ã® 0xe3ae
+㯠0xe3af
+ã° 0xe3b0
+ã± 0xe3b1
+ã² 0xe3b2
+ã³ 0xe3b3
+ã´ 0xe3b4
+ãµ 0xe3b5
+㶠0xe3b6
+ã· 0xe3b7
+㸠0xe3b8
+ã¹ 0xe3b9
+㺠0xe3ba
+ã» 0xe3bb
+ã¼ 0xe3bc
+ã½ 0xe3bd
+ã¾ 0xe3be
+ã¿ 0xe3bf
+ãÀ 0xe3c0
+ãÁ 0xe3c1
+ã 0xe3c2
+ãà 0xe3c3
+ãÄ 0xe3c4
+ãÅ 0xe3c5
+ãÆ 0xe3c6
+ãÇ 0xe3c7
+ãÈ 0xe3c8
+ãÉ 0xe3c9
+ãÊ 0xe3ca
+ãË 0xe3cb
+ãÌ 0xe3cc
+ãÍ 0xe3cd
+ãÎ 0xe3ce
+ãÏ 0xe3cf
+ãÐ 0xe3d0
+ãÑ 0xe3d1
+ãÒ 0xe3d2
+ãÓ 0xe3d3
+ãÔ 0xe3d4
+ãÕ 0xe3d5
+ãÖ 0xe3d6
+ã× 0xe3d7
+ãØ 0xe3d8
+ãÙ 0xe3d9
+ãÚ 0xe3da
+ãÛ 0xe3db
+ãÜ 0xe3dc
+ãÝ 0xe3dd
+ãÞ 0xe3de
+ãß 0xe3df
+ãà 0xe3e0
+ãá 0xe3e1
+ãâ 0xe3e2
+ãã 0xe3e3
+ãä 0xe3e4
+ãå 0xe3e5
+ãæ 0xe3e6
+ãç 0xe3e7
+ãè 0xe3e8
+ãé 0xe3e9
+ãê 0xe3ea
+ãë 0xe3eb
+ãì 0xe3ec
+ãí 0xe3ed
+ãî 0xe3ee
+ãï 0xe3ef
+ãð 0xe3f0
+ãñ 0xe3f1
+ãò 0xe3f2
+ãó 0xe3f3
+ãô 0xe3f4
+ãõ 0xe3f5
+ãö 0xe3f6
+ã÷ 0xe3f7
+ãø 0xe3f8
+ãù 0xe3f9
+ãú 0xe3fa
+ãû 0xe3fb
+ãü 0xe3fc
+ãý 0xe3fd
+ãþ 0xe3fe
+ä@ 0xe440
+äA 0xe441
+äB 0xe442
+äC 0xe443
+äD 0xe444
+äE 0xe445
+äF 0xe446
+äG 0xe447
+äH 0xe448
+äI 0xe449
+äJ 0xe44a
+äK 0xe44b
+äL 0xe44c
+äM 0xe44d
+äN 0xe44e
+äO 0xe44f
+äP 0xe450
+äQ 0xe451
+äR 0xe452
+äS 0xe453
+äT 0xe454
+äU 0xe455
+äV 0xe456
+äW 0xe457
+äX 0xe458
+äY 0xe459
+äZ 0xe45a
+ä[ 0xe45b
+ä\ 0xe45c
+ä] 0xe45d
+ä^ 0xe45e
+ä_ 0xe45f
+ä` 0xe460
+äa 0xe461
+äb 0xe462
+äc 0xe463
+äd 0xe464
+äe 0xe465
+äf 0xe466
+äg 0xe467
+äh 0xe468
+äi 0xe469
+äj 0xe46a
+äk 0xe46b
+äl 0xe46c
+äm 0xe46d
+än 0xe46e
+äo 0xe46f
+äp 0xe470
+äq 0xe471
+är 0xe472
+äs 0xe473
+ät 0xe474
+äu 0xe475
+äv 0xe476
+äw 0xe477
+äx 0xe478
+äy 0xe479
+äz 0xe47a
+ä{ 0xe47b
+ä| 0xe47c
+ä} 0xe47d
+ä~ 0xe47e
+ä¡ 0xe4a1
+ä¢ 0xe4a2
+ä£ 0xe4a3
+ä¤ 0xe4a4
+ä¥ 0xe4a5
+ä¦ 0xe4a6
+ä§ 0xe4a7
+ä¨ 0xe4a8
+ä© 0xe4a9
+äª 0xe4aa
+ä« 0xe4ab
+ä¬ 0xe4ac
+ä­ 0xe4ad
+ä® 0xe4ae
+ä¯ 0xe4af
+ä° 0xe4b0
+ä± 0xe4b1
+ä² 0xe4b2
+ä³ 0xe4b3
+ä´ 0xe4b4
+äµ 0xe4b5
+ä¶ 0xe4b6
+ä· 0xe4b7
+ä¸ 0xe4b8
+ä¹ 0xe4b9
+äº 0xe4ba
+ä» 0xe4bb
+ä¼ 0xe4bc
+ä½ 0xe4bd
+ä¾ 0xe4be
+ä¿ 0xe4bf
+äÀ 0xe4c0
+äÁ 0xe4c1
+ä 0xe4c2
+äà 0xe4c3
+äÄ 0xe4c4
+äÅ 0xe4c5
+äÆ 0xe4c6
+äÇ 0xe4c7
+äÈ 0xe4c8
+äÉ 0xe4c9
+äÊ 0xe4ca
+äË 0xe4cb
+äÌ 0xe4cc
+äÍ 0xe4cd
+äÎ 0xe4ce
+äÏ 0xe4cf
+äÐ 0xe4d0
+äÑ 0xe4d1
+äÒ 0xe4d2
+äÓ 0xe4d3
+äÔ 0xe4d4
+äÕ 0xe4d5
+äÖ 0xe4d6
+ä× 0xe4d7
+äØ 0xe4d8
+äÙ 0xe4d9
+äÚ 0xe4da
+äÛ 0xe4db
+äÜ 0xe4dc
+äÝ 0xe4dd
+äÞ 0xe4de
+äß 0xe4df
+äà 0xe4e0
+äá 0xe4e1
+äâ 0xe4e2
+äã 0xe4e3
+ää 0xe4e4
+äå 0xe4e5
+äæ 0xe4e6
+äç 0xe4e7
+äè 0xe4e8
+äé 0xe4e9
+äê 0xe4ea
+äë 0xe4eb
+äì 0xe4ec
+äí 0xe4ed
+äî 0xe4ee
+äï 0xe4ef
+äð 0xe4f0
+äñ 0xe4f1
+äò 0xe4f2
+äó 0xe4f3
+äô 0xe4f4
+äõ 0xe4f5
+äö 0xe4f6
+ä÷ 0xe4f7
+äø 0xe4f8
+äù 0xe4f9
+äú 0xe4fa
+äû 0xe4fb
+äü 0xe4fc
+äý 0xe4fd
+äþ 0xe4fe
+å@ 0xe540
+åA 0xe541
+åB 0xe542
+åC 0xe543
+åD 0xe544
+åE 0xe545
+åF 0xe546
+åG 0xe547
+åH 0xe548
+åI 0xe549
+åJ 0xe54a
+åK 0xe54b
+åL 0xe54c
+åM 0xe54d
+åN 0xe54e
+åO 0xe54f
+åP 0xe550
+åQ 0xe551
+åR 0xe552
+åS 0xe553
+åT 0xe554
+åU 0xe555
+åV 0xe556
+åW 0xe557
+åX 0xe558
+åY 0xe559
+åZ 0xe55a
+å[ 0xe55b
+å\ 0xe55c
+å] 0xe55d
+å^ 0xe55e
+å_ 0xe55f
+å` 0xe560
+åa 0xe561
+åb 0xe562
+åc 0xe563
+åd 0xe564
+åe 0xe565
+åf 0xe566
+åg 0xe567
+åh 0xe568
+åi 0xe569
+åj 0xe56a
+åk 0xe56b
+ål 0xe56c
+åm 0xe56d
+ån 0xe56e
+åo 0xe56f
+åp 0xe570
+åq 0xe571
+år 0xe572
+ås 0xe573
+åt 0xe574
+åu 0xe575
+åv 0xe576
+åw 0xe577
+åx 0xe578
+åy 0xe579
+åz 0xe57a
+å{ 0xe57b
+å| 0xe57c
+å} 0xe57d
+å~ 0xe57e
+å¡ 0xe5a1
+å¢ 0xe5a2
+å£ 0xe5a3
+å¤ 0xe5a4
+å¥ 0xe5a5
+å¦ 0xe5a6
+å§ 0xe5a7
+å¨ 0xe5a8
+å© 0xe5a9
+åª 0xe5aa
+å« 0xe5ab
+å¬ 0xe5ac
+å­ 0xe5ad
+å® 0xe5ae
+å¯ 0xe5af
+å° 0xe5b0
+å± 0xe5b1
+å² 0xe5b2
+å³ 0xe5b3
+å´ 0xe5b4
+åµ 0xe5b5
+å¶ 0xe5b6
+å· 0xe5b7
+å¸ 0xe5b8
+å¹ 0xe5b9
+åº 0xe5ba
+å» 0xe5bb
+å¼ 0xe5bc
+å½ 0xe5bd
+å¾ 0xe5be
+å¿ 0xe5bf
+åÀ 0xe5c0
+åÁ 0xe5c1
+å 0xe5c2
+åà 0xe5c3
+åÄ 0xe5c4
+åÅ 0xe5c5
+åÆ 0xe5c6
+åÇ 0xe5c7
+åÈ 0xe5c8
+åÉ 0xe5c9
+åÊ 0xe5ca
+åË 0xe5cb
+åÌ 0xe5cc
+åÍ 0xe5cd
+åÎ 0xe5ce
+åÏ 0xe5cf
+åÐ 0xe5d0
+åÑ 0xe5d1
+åÒ 0xe5d2
+åÓ 0xe5d3
+åÔ 0xe5d4
+åÕ 0xe5d5
+åÖ 0xe5d6
+å× 0xe5d7
+åØ 0xe5d8
+åÙ 0xe5d9
+åÚ 0xe5da
+åÛ 0xe5db
+åÜ 0xe5dc
+åÝ 0xe5dd
+åÞ 0xe5de
+åß 0xe5df
+åà 0xe5e0
+åá 0xe5e1
+åâ 0xe5e2
+åã 0xe5e3
+åä 0xe5e4
+åå 0xe5e5
+åæ 0xe5e6
+åç 0xe5e7
+åè 0xe5e8
+åé 0xe5e9
+åê 0xe5ea
+åë 0xe5eb
+åì 0xe5ec
+åí 0xe5ed
+åî 0xe5ee
+åï 0xe5ef
+åð 0xe5f0
+åñ 0xe5f1
+åò 0xe5f2
+åó 0xe5f3
+åô 0xe5f4
+åõ 0xe5f5
+åö 0xe5f6
+å÷ 0xe5f7
+åø 0xe5f8
+åù 0xe5f9
+åú 0xe5fa
+åû 0xe5fb
+åü 0xe5fc
+åý 0xe5fd
+åþ 0xe5fe
+æ@ 0xe640
+æA 0xe641
+æB 0xe642
+æC 0xe643
+æD 0xe644
+æE 0xe645
+æF 0xe646
+æG 0xe647
+æH 0xe648
+æI 0xe649
+æJ 0xe64a
+æK 0xe64b
+æL 0xe64c
+æM 0xe64d
+æN 0xe64e
+æO 0xe64f
+æP 0xe650
+æQ 0xe651
+æR 0xe652
+æS 0xe653
+æT 0xe654
+æU 0xe655
+æV 0xe656
+æW 0xe657
+æX 0xe658
+æY 0xe659
+æZ 0xe65a
+æ[ 0xe65b
+æ\ 0xe65c
+æ] 0xe65d
+æ^ 0xe65e
+æ_ 0xe65f
+æ` 0xe660
+æa 0xe661
+æb 0xe662
+æc 0xe663
+æd 0xe664
+æe 0xe665
+æf 0xe666
+æg 0xe667
+æh 0xe668
+æi 0xe669
+æj 0xe66a
+æk 0xe66b
+æl 0xe66c
+æm 0xe66d
+æn 0xe66e
+æo 0xe66f
+æp 0xe670
+æq 0xe671
+ær 0xe672
+æs 0xe673
+æt 0xe674
+æu 0xe675
+æv 0xe676
+æw 0xe677
+æx 0xe678
+æy 0xe679
+æz 0xe67a
+æ{ 0xe67b
+æ| 0xe67c
+æ} 0xe67d
+æ~ 0xe67e
+æ¡ 0xe6a1
+æ¢ 0xe6a2
+æ£ 0xe6a3
+æ¤ 0xe6a4
+æ¥ 0xe6a5
+æ¦ 0xe6a6
+æ§ 0xe6a7
+æ¨ 0xe6a8
+æ© 0xe6a9
+æª 0xe6aa
+æ« 0xe6ab
+æ¬ 0xe6ac
+æ­ 0xe6ad
+æ® 0xe6ae
+æ¯ 0xe6af
+æ° 0xe6b0
+æ± 0xe6b1
+æ² 0xe6b2
+æ³ 0xe6b3
+æ´ 0xe6b4
+æµ 0xe6b5
+æ¶ 0xe6b6
+æ· 0xe6b7
+æ¸ 0xe6b8
+æ¹ 0xe6b9
+æº 0xe6ba
+æ» 0xe6bb
+æ¼ 0xe6bc
+æ½ 0xe6bd
+æ¾ 0xe6be
+æ¿ 0xe6bf
+æÀ 0xe6c0
+æÁ 0xe6c1
+æ 0xe6c2
+æà 0xe6c3
+æÄ 0xe6c4
+æÅ 0xe6c5
+æÆ 0xe6c6
+æÇ 0xe6c7
+æÈ 0xe6c8
+æÉ 0xe6c9
+æÊ 0xe6ca
+æË 0xe6cb
+æÌ 0xe6cc
+æÍ 0xe6cd
+æÎ 0xe6ce
+æÏ 0xe6cf
+æÐ 0xe6d0
+æÑ 0xe6d1
+æÒ 0xe6d2
+æÓ 0xe6d3
+æÔ 0xe6d4
+æÕ 0xe6d5
+æÖ 0xe6d6
+æ× 0xe6d7
+æØ 0xe6d8
+æÙ 0xe6d9
+æÚ 0xe6da
+æÛ 0xe6db
+æÜ 0xe6dc
+æÝ 0xe6dd
+æÞ 0xe6de
+æß 0xe6df
+æà 0xe6e0
+æá 0xe6e1
+æâ 0xe6e2
+æã 0xe6e3
+æä 0xe6e4
+æå 0xe6e5
+ææ 0xe6e6
+æç 0xe6e7
+æè 0xe6e8
+æé 0xe6e9
+æê 0xe6ea
+æë 0xe6eb
+æì 0xe6ec
+æí 0xe6ed
+æî 0xe6ee
+æï 0xe6ef
+æð 0xe6f0
+æñ 0xe6f1
+æò 0xe6f2
+æó 0xe6f3
+æô 0xe6f4
+æõ 0xe6f5
+æö 0xe6f6
+æ÷ 0xe6f7
+æø 0xe6f8
+æù 0xe6f9
+æú 0xe6fa
+æû 0xe6fb
+æü 0xe6fc
+æý 0xe6fd
+æþ 0xe6fe
+ç@ 0xe740
+çA 0xe741
+çB 0xe742
+çC 0xe743
+çD 0xe744
+çE 0xe745
+çF 0xe746
+çG 0xe747
+çH 0xe748
+çI 0xe749
+çJ 0xe74a
+çK 0xe74b
+çL 0xe74c
+çM 0xe74d
+çN 0xe74e
+çO 0xe74f
+çP 0xe750
+çQ 0xe751
+çR 0xe752
+çS 0xe753
+çT 0xe754
+çU 0xe755
+çV 0xe756
+çW 0xe757
+çX 0xe758
+çY 0xe759
+çZ 0xe75a
+ç[ 0xe75b
+ç\ 0xe75c
+ç] 0xe75d
+ç^ 0xe75e
+ç_ 0xe75f
+ç` 0xe760
+ça 0xe761
+çb 0xe762
+çc 0xe763
+çd 0xe764
+çe 0xe765
+çf 0xe766
+çg 0xe767
+çh 0xe768
+çi 0xe769
+çj 0xe76a
+çk 0xe76b
+çl 0xe76c
+çm 0xe76d
+çn 0xe76e
+ço 0xe76f
+çp 0xe770
+çq 0xe771
+çr 0xe772
+çs 0xe773
+çt 0xe774
+çu 0xe775
+çv 0xe776
+çw 0xe777
+çx 0xe778
+çy 0xe779
+çz 0xe77a
+ç{ 0xe77b
+ç| 0xe77c
+ç} 0xe77d
+ç~ 0xe77e
+ç¡ 0xe7a1
+ç¢ 0xe7a2
+ç£ 0xe7a3
+ç¤ 0xe7a4
+ç¥ 0xe7a5
+ç¦ 0xe7a6
+ç§ 0xe7a7
+ç¨ 0xe7a8
+ç© 0xe7a9
+çª 0xe7aa
+ç« 0xe7ab
+ç¬ 0xe7ac
+ç­ 0xe7ad
+ç® 0xe7ae
+ç¯ 0xe7af
+ç° 0xe7b0
+ç± 0xe7b1
+ç² 0xe7b2
+ç³ 0xe7b3
+ç´ 0xe7b4
+çµ 0xe7b5
+ç¶ 0xe7b6
+ç· 0xe7b7
+ç¸ 0xe7b8
+ç¹ 0xe7b9
+çº 0xe7ba
+ç» 0xe7bb
+ç¼ 0xe7bc
+ç½ 0xe7bd
+ç¾ 0xe7be
+ç¿ 0xe7bf
+çÀ 0xe7c0
+çÁ 0xe7c1
+ç 0xe7c2
+çà 0xe7c3
+çÄ 0xe7c4
+çÅ 0xe7c5
+çÆ 0xe7c6
+çÇ 0xe7c7
+çÈ 0xe7c8
+çÉ 0xe7c9
+çÊ 0xe7ca
+çË 0xe7cb
+çÌ 0xe7cc
+çÍ 0xe7cd
+çÎ 0xe7ce
+çÏ 0xe7cf
+çÐ 0xe7d0
+çÑ 0xe7d1
+çÒ 0xe7d2
+çÓ 0xe7d3
+çÔ 0xe7d4
+çÕ 0xe7d5
+çÖ 0xe7d6
+ç× 0xe7d7
+çØ 0xe7d8
+çÙ 0xe7d9
+çÚ 0xe7da
+çÛ 0xe7db
+çÜ 0xe7dc
+çÝ 0xe7dd
+çÞ 0xe7de
+çß 0xe7df
+çà 0xe7e0
+çá 0xe7e1
+çâ 0xe7e2
+çã 0xe7e3
+çä 0xe7e4
+çå 0xe7e5
+çæ 0xe7e6
+çç 0xe7e7
+çè 0xe7e8
+çé 0xe7e9
+çê 0xe7ea
+çë 0xe7eb
+çì 0xe7ec
+çí 0xe7ed
+çî 0xe7ee
+çï 0xe7ef
+çð 0xe7f0
+çñ 0xe7f1
+çò 0xe7f2
+çó 0xe7f3
+çô 0xe7f4
+çõ 0xe7f5
+çö 0xe7f6
+ç÷ 0xe7f7
+çø 0xe7f8
+çù 0xe7f9
+çú 0xe7fa
+çû 0xe7fb
+çü 0xe7fc
+çý 0xe7fd
+çþ 0xe7fe
+è@ 0xe840
+èA 0xe841
+èB 0xe842
+èC 0xe843
+èD 0xe844
+èE 0xe845
+èF 0xe846
+èG 0xe847
+èH 0xe848
+èI 0xe849
+èJ 0xe84a
+èK 0xe84b
+èL 0xe84c
+èM 0xe84d
+èN 0xe84e
+èO 0xe84f
+èP 0xe850
+èQ 0xe851
+èR 0xe852
+èS 0xe853
+èT 0xe854
+èU 0xe855
+èV 0xe856
+èW 0xe857
+èX 0xe858
+èY 0xe859
+èZ 0xe85a
+è[ 0xe85b
+è\ 0xe85c
+è] 0xe85d
+è^ 0xe85e
+è_ 0xe85f
+è` 0xe860
+èa 0xe861
+èb 0xe862
+èc 0xe863
+èd 0xe864
+èe 0xe865
+èf 0xe866
+èg 0xe867
+èh 0xe868
+èi 0xe869
+èj 0xe86a
+èk 0xe86b
+èl 0xe86c
+èm 0xe86d
+èn 0xe86e
+èo 0xe86f
+èp 0xe870
+èq 0xe871
+èr 0xe872
+ès 0xe873
+èt 0xe874
+èu 0xe875
+èv 0xe876
+èw 0xe877
+èx 0xe878
+èy 0xe879
+èz 0xe87a
+è{ 0xe87b
+è| 0xe87c
+è} 0xe87d
+è~ 0xe87e
+è¡ 0xe8a1
+è¢ 0xe8a2
+è£ 0xe8a3
+è¤ 0xe8a4
+è¥ 0xe8a5
+è¦ 0xe8a6
+è§ 0xe8a7
+è¨ 0xe8a8
+è© 0xe8a9
+èª 0xe8aa
+è« 0xe8ab
+è¬ 0xe8ac
+è­ 0xe8ad
+è® 0xe8ae
+è¯ 0xe8af
+è° 0xe8b0
+è± 0xe8b1
+è² 0xe8b2
+è³ 0xe8b3
+è´ 0xe8b4
+èµ 0xe8b5
+è¶ 0xe8b6
+è· 0xe8b7
+è¸ 0xe8b8
+è¹ 0xe8b9
+èº 0xe8ba
+è» 0xe8bb
+è¼ 0xe8bc
+è½ 0xe8bd
+è¾ 0xe8be
+è¿ 0xe8bf
+èÀ 0xe8c0
+èÁ 0xe8c1
+è 0xe8c2
+èà 0xe8c3
+èÄ 0xe8c4
+èÅ 0xe8c5
+èÆ 0xe8c6
+èÇ 0xe8c7
+èÈ 0xe8c8
+èÉ 0xe8c9
+èÊ 0xe8ca
+èË 0xe8cb
+èÌ 0xe8cc
+èÍ 0xe8cd
+èÎ 0xe8ce
+èÏ 0xe8cf
+èÐ 0xe8d0
+èÑ 0xe8d1
+èÒ 0xe8d2
+èÓ 0xe8d3
+èÔ 0xe8d4
+èÕ 0xe8d5
+èÖ 0xe8d6
+è× 0xe8d7
+èØ 0xe8d8
+èÙ 0xe8d9
+èÚ 0xe8da
+èÛ 0xe8db
+èÜ 0xe8dc
+èÝ 0xe8dd
+èÞ 0xe8de
+èß 0xe8df
+èà 0xe8e0
+èá 0xe8e1
+èâ 0xe8e2
+èã 0xe8e3
+èä 0xe8e4
+èå 0xe8e5
+èæ 0xe8e6
+èç 0xe8e7
+èè 0xe8e8
+èé 0xe8e9
+èê 0xe8ea
+èë 0xe8eb
+èì 0xe8ec
+èí 0xe8ed
+èî 0xe8ee
+èï 0xe8ef
+èð 0xe8f0
+èñ 0xe8f1
+èò 0xe8f2
+èó 0xe8f3
+èô 0xe8f4
+èõ 0xe8f5
+èö 0xe8f6
+è÷ 0xe8f7
+èø 0xe8f8
+èù 0xe8f9
+èú 0xe8fa
+èû 0xe8fb
+èü 0xe8fc
+èý 0xe8fd
+èþ 0xe8fe
+é@ 0xe940
+éA 0xe941
+éB 0xe942
+éC 0xe943
+éD 0xe944
+éE 0xe945
+éF 0xe946
+éG 0xe947
+éH 0xe948
+éI 0xe949
+éJ 0xe94a
+éK 0xe94b
+éL 0xe94c
+éM 0xe94d
+éN 0xe94e
+éO 0xe94f
+éP 0xe950
+éQ 0xe951
+éR 0xe952
+éS 0xe953
+éT 0xe954
+éU 0xe955
+éV 0xe956
+éW 0xe957
+éX 0xe958
+éY 0xe959
+éZ 0xe95a
+é[ 0xe95b
+é\ 0xe95c
+é] 0xe95d
+é^ 0xe95e
+é_ 0xe95f
+é` 0xe960
+éa 0xe961
+éb 0xe962
+éc 0xe963
+éd 0xe964
+ée 0xe965
+éf 0xe966
+ég 0xe967
+éh 0xe968
+éi 0xe969
+éj 0xe96a
+ék 0xe96b
+él 0xe96c
+ém 0xe96d
+én 0xe96e
+éo 0xe96f
+ép 0xe970
+éq 0xe971
+ér 0xe972
+és 0xe973
+ét 0xe974
+éu 0xe975
+év 0xe976
+éw 0xe977
+éx 0xe978
+éy 0xe979
+éz 0xe97a
+é{ 0xe97b
+é| 0xe97c
+é} 0xe97d
+é~ 0xe97e
+é¡ 0xe9a1
+é¢ 0xe9a2
+é£ 0xe9a3
+é¤ 0xe9a4
+é¥ 0xe9a5
+é¦ 0xe9a6
+é§ 0xe9a7
+é¨ 0xe9a8
+é© 0xe9a9
+éª 0xe9aa
+é« 0xe9ab
+é¬ 0xe9ac
+é­ 0xe9ad
+é® 0xe9ae
+é¯ 0xe9af
+é° 0xe9b0
+é± 0xe9b1
+é² 0xe9b2
+é³ 0xe9b3
+é´ 0xe9b4
+éµ 0xe9b5
+é¶ 0xe9b6
+é· 0xe9b7
+é¸ 0xe9b8
+é¹ 0xe9b9
+éº 0xe9ba
+é» 0xe9bb
+é¼ 0xe9bc
+é½ 0xe9bd
+é¾ 0xe9be
+é¿ 0xe9bf
+éÀ 0xe9c0
+éÁ 0xe9c1
+é 0xe9c2
+éà 0xe9c3
+éÄ 0xe9c4
+éÅ 0xe9c5
+éÆ 0xe9c6
+éÇ 0xe9c7
+éÈ 0xe9c8
+éÉ 0xe9c9
+éÊ 0xe9ca
+éË 0xe9cb
+éÌ 0xe9cc
+éÍ 0xe9cd
+éÎ 0xe9ce
+éÏ 0xe9cf
+éÐ 0xe9d0
+éÑ 0xe9d1
+éÒ 0xe9d2
+éÓ 0xe9d3
+éÔ 0xe9d4
+éÕ 0xe9d5
+éÖ 0xe9d6
+é× 0xe9d7
+éØ 0xe9d8
+éÙ 0xe9d9
+éÚ 0xe9da
+éÛ 0xe9db
+éÜ 0xe9dc
+éÝ 0xe9dd
+éÞ 0xe9de
+éß 0xe9df
+éà 0xe9e0
+éá 0xe9e1
+éâ 0xe9e2
+éã 0xe9e3
+éä 0xe9e4
+éå 0xe9e5
+éæ 0xe9e6
+éç 0xe9e7
+éè 0xe9e8
+éé 0xe9e9
+éê 0xe9ea
+éë 0xe9eb
+éì 0xe9ec
+éí 0xe9ed
+éî 0xe9ee
+éï 0xe9ef
+éð 0xe9f0
+éñ 0xe9f1
+éò 0xe9f2
+éó 0xe9f3
+éô 0xe9f4
+éõ 0xe9f5
+éö 0xe9f6
+é÷ 0xe9f7
+éø 0xe9f8
+éù 0xe9f9
+éú 0xe9fa
+éû 0xe9fb
+éü 0xe9fc
+éý 0xe9fd
+éþ 0xe9fe
+ê@ 0xea40
+êA 0xea41
+êB 0xea42
+êC 0xea43
+êD 0xea44
+êE 0xea45
+êF 0xea46
+êG 0xea47
+êH 0xea48
+êI 0xea49
+êJ 0xea4a
+êK 0xea4b
+êL 0xea4c
+êM 0xea4d
+êN 0xea4e
+êO 0xea4f
+êP 0xea50
+êQ 0xea51
+êR 0xea52
+êS 0xea53
+êT 0xea54
+êU 0xea55
+êV 0xea56
+êW 0xea57
+êX 0xea58
+êY 0xea59
+êZ 0xea5a
+ê[ 0xea5b
+ê\ 0xea5c
+ê] 0xea5d
+ê^ 0xea5e
+ê_ 0xea5f
+ê` 0xea60
+êa 0xea61
+êb 0xea62
+êc 0xea63
+êd 0xea64
+êe 0xea65
+êf 0xea66
+êg 0xea67
+êh 0xea68
+êi 0xea69
+êj 0xea6a
+êk 0xea6b
+êl 0xea6c
+êm 0xea6d
+ên 0xea6e
+êo 0xea6f
+êp 0xea70
+êq 0xea71
+êr 0xea72
+ês 0xea73
+êt 0xea74
+êu 0xea75
+êv 0xea76
+êw 0xea77
+êx 0xea78
+êy 0xea79
+êz 0xea7a
+ê{ 0xea7b
+ê| 0xea7c
+ê} 0xea7d
+ê~ 0xea7e
+ê¡ 0xeaa1
+ê¢ 0xeaa2
+ê£ 0xeaa3
+ê¤ 0xeaa4
+ê¥ 0xeaa5
+ê¦ 0xeaa6
+ê§ 0xeaa7
+ê¨ 0xeaa8
+ê© 0xeaa9
+êª 0xeaaa
+ê« 0xeaab
+ê¬ 0xeaac
+ê­ 0xeaad
+ê® 0xeaae
+ê¯ 0xeaaf
+ê° 0xeab0
+ê± 0xeab1
+ê² 0xeab2
+ê³ 0xeab3
+ê´ 0xeab4
+êµ 0xeab5
+ê¶ 0xeab6
+ê· 0xeab7
+ê¸ 0xeab8
+ê¹ 0xeab9
+êº 0xeaba
+ê» 0xeabb
+ê¼ 0xeabc
+ê½ 0xeabd
+ê¾ 0xeabe
+ê¿ 0xeabf
+êÀ 0xeac0
+êÁ 0xeac1
+ê 0xeac2
+êà 0xeac3
+êÄ 0xeac4
+êÅ 0xeac5
+êÆ 0xeac6
+êÇ 0xeac7
+êÈ 0xeac8
+êÉ 0xeac9
+êÊ 0xeaca
+êË 0xeacb
+êÌ 0xeacc
+êÍ 0xeacd
+êÎ 0xeace
+êÏ 0xeacf
+êÐ 0xead0
+êÑ 0xead1
+êÒ 0xead2
+êÓ 0xead3
+êÔ 0xead4
+êÕ 0xead5
+êÖ 0xead6
+ê× 0xead7
+êØ 0xead8
+êÙ 0xead9
+êÚ 0xeada
+êÛ 0xeadb
+êÜ 0xeadc
+êÝ 0xeadd
+êÞ 0xeade
+êß 0xeadf
+êà 0xeae0
+êá 0xeae1
+êâ 0xeae2
+êã 0xeae3
+êä 0xeae4
+êå 0xeae5
+êæ 0xeae6
+êç 0xeae7
+êè 0xeae8
+êé 0xeae9
+êê 0xeaea
+êë 0xeaeb
+êì 0xeaec
+êí 0xeaed
+êî 0xeaee
+êï 0xeaef
+êð 0xeaf0
+êñ 0xeaf1
+êò 0xeaf2
+êó 0xeaf3
+êô 0xeaf4
+êõ 0xeaf5
+êö 0xeaf6
+ê÷ 0xeaf7
+êø 0xeaf8
+êù 0xeaf9
+êú 0xeafa
+êû 0xeafb
+êü 0xeafc
+êý 0xeafd
+êþ 0xeafe
+ë@ 0xeb40
+ëA 0xeb41
+ëB 0xeb42
+ëC 0xeb43
+ëD 0xeb44
+ëE 0xeb45
+ëF 0xeb46
+ëG 0xeb47
+ëH 0xeb48
+ëI 0xeb49
+ëJ 0xeb4a
+ëK 0xeb4b
+ëL 0xeb4c
+ëM 0xeb4d
+ëN 0xeb4e
+ëO 0xeb4f
+ëP 0xeb50
+ëQ 0xeb51
+ëR 0xeb52
+ëS 0xeb53
+ëT 0xeb54
+ëU 0xeb55
+ëV 0xeb56
+ëW 0xeb57
+ëX 0xeb58
+ëY 0xeb59
+ëZ 0xeb5a
+ë[ 0xeb5b
+ë\ 0xeb5c
+ë] 0xeb5d
+ë^ 0xeb5e
+ë_ 0xeb5f
+ë` 0xeb60
+ëa 0xeb61
+ëb 0xeb62
+ëc 0xeb63
+ëd 0xeb64
+ëe 0xeb65
+ëf 0xeb66
+ëg 0xeb67
+ëh 0xeb68
+ëi 0xeb69
+ëj 0xeb6a
+ëk 0xeb6b
+ël 0xeb6c
+ëm 0xeb6d
+ën 0xeb6e
+ëo 0xeb6f
+ëp 0xeb70
+ëq 0xeb71
+ër 0xeb72
+ës 0xeb73
+ët 0xeb74
+ëu 0xeb75
+ëv 0xeb76
+ëw 0xeb77
+ëx 0xeb78
+ëy 0xeb79
+ëz 0xeb7a
+ë{ 0xeb7b
+ë| 0xeb7c
+ë} 0xeb7d
+ë~ 0xeb7e
+ë¡ 0xeba1
+ë¢ 0xeba2
+ë£ 0xeba3
+ë¤ 0xeba4
+ë¥ 0xeba5
+ë¦ 0xeba6
+ë§ 0xeba7
+ë¨ 0xeba8
+ë© 0xeba9
+ëª 0xebaa
+ë« 0xebab
+ë¬ 0xebac
+ë­ 0xebad
+ë® 0xebae
+ë¯ 0xebaf
+ë° 0xebb0
+ë± 0xebb1
+ë² 0xebb2
+ë³ 0xebb3
+ë´ 0xebb4
+ëµ 0xebb5
+ë¶ 0xebb6
+ë· 0xebb7
+ë¸ 0xebb8
+ë¹ 0xebb9
+ëº 0xebba
+ë» 0xebbb
+ë¼ 0xebbc
+ë½ 0xebbd
+ë¾ 0xebbe
+ë¿ 0xebbf
+ëÀ 0xebc0
+ëÁ 0xebc1
+ë 0xebc2
+ëà 0xebc3
+ëÄ 0xebc4
+ëÅ 0xebc5
+ëÆ 0xebc6
+ëÇ 0xebc7
+ëÈ 0xebc8
+ëÉ 0xebc9
+ëÊ 0xebca
+ëË 0xebcb
+ëÌ 0xebcc
+ëÍ 0xebcd
+ëÎ 0xebce
+ëÏ 0xebcf
+ëÐ 0xebd0
+ëÑ 0xebd1
+ëÒ 0xebd2
+ëÓ 0xebd3
+ëÔ 0xebd4
+ëÕ 0xebd5
+ëÖ 0xebd6
+ë× 0xebd7
+ëØ 0xebd8
+ëÙ 0xebd9
+ëÚ 0xebda
+ëÛ 0xebdb
+ëÜ 0xebdc
+ëÝ 0xebdd
+ëÞ 0xebde
+ëß 0xebdf
+ëà 0xebe0
+ëá 0xebe1
+ëâ 0xebe2
+ëã 0xebe3
+ëä 0xebe4
+ëå 0xebe5
+ëæ 0xebe6
+ëç 0xebe7
+ëè 0xebe8
+ëé 0xebe9
+ëê 0xebea
+ëë 0xebeb
+ëì 0xebec
+ëí 0xebed
+ëî 0xebee
+ëï 0xebef
+ëð 0xebf0
+ëñ 0xebf1
+ëò 0xebf2
+ëó 0xebf3
+ëô 0xebf4
+ëõ 0xebf5
+ëö 0xebf6
+ë÷ 0xebf7
+ëø 0xebf8
+ëù 0xebf9
+ëú 0xebfa
+ëû 0xebfb
+ëü 0xebfc
+ëý 0xebfd
+ëþ 0xebfe
+ì@ 0xec40
+ìA 0xec41
+ìB 0xec42
+ìC 0xec43
+ìD 0xec44
+ìE 0xec45
+ìF 0xec46
+ìG 0xec47
+ìH 0xec48
+ìI 0xec49
+ìJ 0xec4a
+ìK 0xec4b
+ìL 0xec4c
+ìM 0xec4d
+ìN 0xec4e
+ìO 0xec4f
+ìP 0xec50
+ìQ 0xec51
+ìR 0xec52
+ìS 0xec53
+ìT 0xec54
+ìU 0xec55
+ìV 0xec56
+ìW 0xec57
+ìX 0xec58
+ìY 0xec59
+ìZ 0xec5a
+ì[ 0xec5b
+ì\ 0xec5c
+ì] 0xec5d
+ì^ 0xec5e
+ì_ 0xec5f
+ì` 0xec60
+ìa 0xec61
+ìb 0xec62
+ìc 0xec63
+ìd 0xec64
+ìe 0xec65
+ìf 0xec66
+ìg 0xec67
+ìh 0xec68
+ìi 0xec69
+ìj 0xec6a
+ìk 0xec6b
+ìl 0xec6c
+ìm 0xec6d
+ìn 0xec6e
+ìo 0xec6f
+ìp 0xec70
+ìq 0xec71
+ìr 0xec72
+ìs 0xec73
+ìt 0xec74
+ìu 0xec75
+ìv 0xec76
+ìw 0xec77
+ìx 0xec78
+ìy 0xec79
+ìz 0xec7a
+ì{ 0xec7b
+ì| 0xec7c
+ì} 0xec7d
+ì~ 0xec7e
+ì¡ 0xeca1
+ì¢ 0xeca2
+ì£ 0xeca3
+ì¤ 0xeca4
+ì¥ 0xeca5
+ì¦ 0xeca6
+ì§ 0xeca7
+ì¨ 0xeca8
+ì© 0xeca9
+ìª 0xecaa
+ì« 0xecab
+ì¬ 0xecac
+ì­ 0xecad
+ì® 0xecae
+ì¯ 0xecaf
+ì° 0xecb0
+ì± 0xecb1
+ì² 0xecb2
+ì³ 0xecb3
+ì´ 0xecb4
+ìµ 0xecb5
+ì¶ 0xecb6
+ì· 0xecb7
+ì¸ 0xecb8
+ì¹ 0xecb9
+ìº 0xecba
+ì» 0xecbb
+ì¼ 0xecbc
+ì½ 0xecbd
+ì¾ 0xecbe
+ì¿ 0xecbf
+ìÀ 0xecc0
+ìÁ 0xecc1
+ì 0xecc2
+ìà 0xecc3
+ìÄ 0xecc4
+ìÅ 0xecc5
+ìÆ 0xecc6
+ìÇ 0xecc7
+ìÈ 0xecc8
+ìÉ 0xecc9
+ìÊ 0xecca
+ìË 0xeccb
+ìÌ 0xeccc
+ìÍ 0xeccd
+ìÎ 0xecce
+ìÏ 0xeccf
+ìÐ 0xecd0
+ìÑ 0xecd1
+ìÒ 0xecd2
+ìÓ 0xecd3
+ìÔ 0xecd4
+ìÕ 0xecd5
+ìÖ 0xecd6
+ì× 0xecd7
+ìØ 0xecd8
+ìÙ 0xecd9
+ìÚ 0xecda
+ìÛ 0xecdb
+ìÜ 0xecdc
+ìÝ 0xecdd
+ìÞ 0xecde
+ìß 0xecdf
+ìà 0xece0
+ìá 0xece1
+ìâ 0xece2
+ìã 0xece3
+ìä 0xece4
+ìå 0xece5
+ìæ 0xece6
+ìç 0xece7
+ìè 0xece8
+ìé 0xece9
+ìê 0xecea
+ìë 0xeceb
+ìì 0xecec
+ìí 0xeced
+ìî 0xecee
+ìï 0xecef
+ìð 0xecf0
+ìñ 0xecf1
+ìò 0xecf2
+ìó 0xecf3
+ìô 0xecf4
+ìõ 0xecf5
+ìö 0xecf6
+ì÷ 0xecf7
+ìø 0xecf8
+ìù 0xecf9
+ìú 0xecfa
+ìû 0xecfb
+ìü 0xecfc
+ìý 0xecfd
+ìþ 0xecfe
+í@ 0xed40
+íA 0xed41
+íB 0xed42
+íC 0xed43
+íD 0xed44
+íE 0xed45
+íF 0xed46
+íG 0xed47
+íH 0xed48
+íI 0xed49
+íJ 0xed4a
+íK 0xed4b
+íL 0xed4c
+íM 0xed4d
+íN 0xed4e
+íO 0xed4f
+íP 0xed50
+íQ 0xed51
+íR 0xed52
+íS 0xed53
+íT 0xed54
+íU 0xed55
+íV 0xed56
+íW 0xed57
+íX 0xed58
+íY 0xed59
+íZ 0xed5a
+í[ 0xed5b
+í\ 0xed5c
+í] 0xed5d
+í^ 0xed5e
+í_ 0xed5f
+í` 0xed60
+ía 0xed61
+íb 0xed62
+íc 0xed63
+íd 0xed64
+íe 0xed65
+íf 0xed66
+íg 0xed67
+íh 0xed68
+íi 0xed69
+íj 0xed6a
+ík 0xed6b
+íl 0xed6c
+ím 0xed6d
+ín 0xed6e
+ío 0xed6f
+íp 0xed70
+íq 0xed71
+ír 0xed72
+ís 0xed73
+ít 0xed74
+íu 0xed75
+ív 0xed76
+íw 0xed77
+íx 0xed78
+íy 0xed79
+íz 0xed7a
+í{ 0xed7b
+í| 0xed7c
+í} 0xed7d
+í~ 0xed7e
+í¡ 0xeda1
+í¢ 0xeda2
+í£ 0xeda3
+í¤ 0xeda4
+í¥ 0xeda5
+í¦ 0xeda6
+í§ 0xeda7
+í¨ 0xeda8
+í© 0xeda9
+íª 0xedaa
+í« 0xedab
+í¬ 0xedac
+í­ 0xedad
+í® 0xedae
+í¯ 0xedaf
+í° 0xedb0
+í± 0xedb1
+í² 0xedb2
+í³ 0xedb3
+í´ 0xedb4
+íµ 0xedb5
+í¶ 0xedb6
+í· 0xedb7
+í¸ 0xedb8
+í¹ 0xedb9
+íº 0xedba
+í» 0xedbb
+í¼ 0xedbc
+í½ 0xedbd
+í¾ 0xedbe
+í¿ 0xedbf
+íÀ 0xedc0
+íÁ 0xedc1
+í 0xedc2
+íà 0xedc3
+íÄ 0xedc4
+íÅ 0xedc5
+íÆ 0xedc6
+íÇ 0xedc7
+íÈ 0xedc8
+íÉ 0xedc9
+íÊ 0xedca
+íË 0xedcb
+íÌ 0xedcc
+íÍ 0xedcd
+íÎ 0xedce
+íÏ 0xedcf
+íÐ 0xedd0
+íÑ 0xedd1
+íÒ 0xedd2
+íÓ 0xedd3
+íÔ 0xedd4
+íÕ 0xedd5
+íÖ 0xedd6
+í× 0xedd7
+íØ 0xedd8
+íÙ 0xedd9
+íÚ 0xedda
+íÛ 0xeddb
+íÜ 0xeddc
+íÝ 0xeddd
+íÞ 0xedde
+íß 0xeddf
+íà 0xede0
+íá 0xede1
+íâ 0xede2
+íã 0xede3
+íä 0xede4
+íå 0xede5
+íæ 0xede6
+íç 0xede7
+íè 0xede8
+íé 0xede9
+íê 0xedea
+íë 0xedeb
+íì 0xedec
+íí 0xeded
+íî 0xedee
+íï 0xedef
+íð 0xedf0
+íñ 0xedf1
+íò 0xedf2
+íó 0xedf3
+íô 0xedf4
+íõ 0xedf5
+íö 0xedf6
+í÷ 0xedf7
+íø 0xedf8
+íù 0xedf9
+íú 0xedfa
+íû 0xedfb
+íü 0xedfc
+íý 0xedfd
+íþ 0xedfe
+î@ 0xee40
+îA 0xee41
+îB 0xee42
+îC 0xee43
+îD 0xee44
+îE 0xee45
+îF 0xee46
+îG 0xee47
+îH 0xee48
+îI 0xee49
+îJ 0xee4a
+îK 0xee4b
+îL 0xee4c
+îM 0xee4d
+îN 0xee4e
+îO 0xee4f
+îP 0xee50
+îQ 0xee51
+îR 0xee52
+îS 0xee53
+îT 0xee54
+îU 0xee55
+îV 0xee56
+îW 0xee57
+îX 0xee58
+îY 0xee59
+îZ 0xee5a
+î[ 0xee5b
+î\ 0xee5c
+î] 0xee5d
+î^ 0xee5e
+î_ 0xee5f
+î` 0xee60
+îa 0xee61
+îb 0xee62
+îc 0xee63
+îd 0xee64
+îe 0xee65
+îf 0xee66
+îg 0xee67
+îh 0xee68
+îi 0xee69
+îj 0xee6a
+îk 0xee6b
+îl 0xee6c
+îm 0xee6d
+în 0xee6e
+îo 0xee6f
+îp 0xee70
+îq 0xee71
+îr 0xee72
+îs 0xee73
+ît 0xee74
+îu 0xee75
+îv 0xee76
+îw 0xee77
+îx 0xee78
+îy 0xee79
+îz 0xee7a
+î{ 0xee7b
+î| 0xee7c
+î} 0xee7d
+î~ 0xee7e
+î¡ 0xeea1
+î¢ 0xeea2
+î£ 0xeea3
+î¤ 0xeea4
+î¥ 0xeea5
+î¦ 0xeea6
+î§ 0xeea7
+î¨ 0xeea8
+î© 0xeea9
+îª 0xeeaa
+î« 0xeeab
+î¬ 0xeeac
+î­ 0xeead
+î® 0xeeae
+î¯ 0xeeaf
+î° 0xeeb0
+î± 0xeeb1
+î² 0xeeb2
+î³ 0xeeb3
+î´ 0xeeb4
+îµ 0xeeb5
+î¶ 0xeeb6
+î· 0xeeb7
+î¸ 0xeeb8
+î¹ 0xeeb9
+îº 0xeeba
+î» 0xeebb
+î¼ 0xeebc
+î½ 0xeebd
+î¾ 0xeebe
+î¿ 0xeebf
+îÀ 0xeec0
+îÁ 0xeec1
+î 0xeec2
+îà 0xeec3
+îÄ 0xeec4
+îÅ 0xeec5
+îÆ 0xeec6
+îÇ 0xeec7
+îÈ 0xeec8
+îÉ 0xeec9
+îÊ 0xeeca
+îË 0xeecb
+îÌ 0xeecc
+îÍ 0xeecd
+îÎ 0xeece
+îÏ 0xeecf
+îÐ 0xeed0
+îÑ 0xeed1
+îÒ 0xeed2
+îÓ 0xeed3
+îÔ 0xeed4
+îÕ 0xeed5
+îÖ 0xeed6
+î× 0xeed7
+îØ 0xeed8
+îÙ 0xeed9
+îÚ 0xeeda
+îÛ 0xeedb
+îÜ 0xeedc
+îÝ 0xeedd
+îÞ 0xeede
+îß 0xeedf
+îà 0xeee0
+îá 0xeee1
+îâ 0xeee2
+îã 0xeee3
+îä 0xeee4
+îå 0xeee5
+îæ 0xeee6
+îç 0xeee7
+îè 0xeee8
+îé 0xeee9
+îê 0xeeea
+îë 0xeeeb
+îì 0xeeec
+îí 0xeeed
+îî 0xeeee
+îï 0xeeef
+îð 0xeef0
+îñ 0xeef1
+îò 0xeef2
+îó 0xeef3
+îô 0xeef4
+îõ 0xeef5
+îö 0xeef6
+î÷ 0xeef7
+îø 0xeef8
+îù 0xeef9
+îú 0xeefa
+îû 0xeefb
+îü 0xeefc
+îý 0xeefd
+îþ 0xeefe
+ï@ 0xef40
+ïA 0xef41
+ïB 0xef42
+ïC 0xef43
+ïD 0xef44
+ïE 0xef45
+ïF 0xef46
+ïG 0xef47
+ïH 0xef48
+ïI 0xef49
+ïJ 0xef4a
+ïK 0xef4b
+ïL 0xef4c
+ïM 0xef4d
+ïN 0xef4e
+ïO 0xef4f
+ïP 0xef50
+ïQ 0xef51
+ïR 0xef52
+ïS 0xef53
+ïT 0xef54
+ïU 0xef55
+ïV 0xef56
+ïW 0xef57
+ïX 0xef58
+ïY 0xef59
+ïZ 0xef5a
+ï[ 0xef5b
+ï\ 0xef5c
+ï] 0xef5d
+ï^ 0xef5e
+ï_ 0xef5f
+ï` 0xef60
+ïa 0xef61
+ïb 0xef62
+ïc 0xef63
+ïd 0xef64
+ïe 0xef65
+ïf 0xef66
+ïg 0xef67
+ïh 0xef68
+ïi 0xef69
+ïj 0xef6a
+ïk 0xef6b
+ïl 0xef6c
+ïm 0xef6d
+ïn 0xef6e
+ïo 0xef6f
+ïp 0xef70
+ïq 0xef71
+ïr 0xef72
+ïs 0xef73
+ït 0xef74
+ïu 0xef75
+ïv 0xef76
+ïw 0xef77
+ïx 0xef78
+ïy 0xef79
+ïz 0xef7a
+ï{ 0xef7b
+ï| 0xef7c
+ï} 0xef7d
+ï~ 0xef7e
+ï¡ 0xefa1
+ï¢ 0xefa2
+ï£ 0xefa3
+ï¤ 0xefa4
+ï¥ 0xefa5
+ï¦ 0xefa6
+ï§ 0xefa7
+ï¨ 0xefa8
+ï© 0xefa9
+ïª 0xefaa
+ï« 0xefab
+ï¬ 0xefac
+ï­ 0xefad
+ï® 0xefae
+ï¯ 0xefaf
+ï° 0xefb0
+ï± 0xefb1
+ï² 0xefb2
+ï³ 0xefb3
+ï´ 0xefb4
+ïµ 0xefb5
+ï¶ 0xefb6
+ï· 0xefb7
+ï¸ 0xefb8
+ï¹ 0xefb9
+ïº 0xefba
+ï» 0xefbb
+ï¼ 0xefbc
+ï½ 0xefbd
+ï¾ 0xefbe
+ï¿ 0xefbf
+ïÀ 0xefc0
+ïÁ 0xefc1
+ï 0xefc2
+ïà 0xefc3
+ïÄ 0xefc4
+ïÅ 0xefc5
+ïÆ 0xefc6
+ïÇ 0xefc7
+ïÈ 0xefc8
+ïÉ 0xefc9
+ïÊ 0xefca
+ïË 0xefcb
+ïÌ 0xefcc
+ïÍ 0xefcd
+ïÎ 0xefce
+ïÏ 0xefcf
+ïÐ 0xefd0
+ïÑ 0xefd1
+ïÒ 0xefd2
+ïÓ 0xefd3
+ïÔ 0xefd4
+ïÕ 0xefd5
+ïÖ 0xefd6
+ï× 0xefd7
+ïØ 0xefd8
+ïÙ 0xefd9
+ïÚ 0xefda
+ïÛ 0xefdb
+ïÜ 0xefdc
+ïÝ 0xefdd
+ïÞ 0xefde
+ïß 0xefdf
+ïà 0xefe0
+ïá 0xefe1
+ïâ 0xefe2
+ïã 0xefe3
+ïä 0xefe4
+ïå 0xefe5
+ïæ 0xefe6
+ïç 0xefe7
+ïè 0xefe8
+ïé 0xefe9
+ïê 0xefea
+ïë 0xefeb
+ïì 0xefec
+ïí 0xefed
+ïî 0xefee
+ïï 0xefef
+ïð 0xeff0
+ïñ 0xeff1
+ïò 0xeff2
+ïó 0xeff3
+ïô 0xeff4
+ïõ 0xeff5
+ïö 0xeff6
+ï÷ 0xeff7
+ïø 0xeff8
+ïù 0xeff9
+ïú 0xeffa
+ïû 0xeffb
+ïü 0xeffc
+ïý 0xeffd
+ïþ 0xeffe
+ð@ 0xf040
+ðA 0xf041
+ðB 0xf042
+ðC 0xf043
+ðD 0xf044
+ðE 0xf045
+ðF 0xf046
+ðG 0xf047
+ðH 0xf048
+ðI 0xf049
+ðJ 0xf04a
+ðK 0xf04b
+ðL 0xf04c
+ðM 0xf04d
+ðN 0xf04e
+ðO 0xf04f
+ðP 0xf050
+ðQ 0xf051
+ðR 0xf052
+ðS 0xf053
+ðT 0xf054
+ðU 0xf055
+ðV 0xf056
+ðW 0xf057
+ðX 0xf058
+ðY 0xf059
+ðZ 0xf05a
+ð[ 0xf05b
+ð\ 0xf05c
+ð] 0xf05d
+ð^ 0xf05e
+ð_ 0xf05f
+ð` 0xf060
+ða 0xf061
+ðb 0xf062
+ðc 0xf063
+ðd 0xf064
+ðe 0xf065
+ðf 0xf066
+ðg 0xf067
+ðh 0xf068
+ði 0xf069
+ðj 0xf06a
+ðk 0xf06b
+ðl 0xf06c
+ðm 0xf06d
+ðn 0xf06e
+ðo 0xf06f
+ðp 0xf070
+ðq 0xf071
+ðr 0xf072
+ðs 0xf073
+ðt 0xf074
+ðu 0xf075
+ðv 0xf076
+ðw 0xf077
+ðx 0xf078
+ðy 0xf079
+ðz 0xf07a
+ð{ 0xf07b
+ð| 0xf07c
+ð} 0xf07d
+ð~ 0xf07e
+ð¡ 0xf0a1
+ð¢ 0xf0a2
+ð£ 0xf0a3
+ð¤ 0xf0a4
+ð¥ 0xf0a5
+ð¦ 0xf0a6
+ð§ 0xf0a7
+ð¨ 0xf0a8
+ð© 0xf0a9
+ðª 0xf0aa
+ð« 0xf0ab
+ð¬ 0xf0ac
+ð­ 0xf0ad
+ð® 0xf0ae
+ð¯ 0xf0af
+ð° 0xf0b0
+ð± 0xf0b1
+ð² 0xf0b2
+ð³ 0xf0b3
+ð´ 0xf0b4
+ðµ 0xf0b5
+ð¶ 0xf0b6
+ð· 0xf0b7
+ð¸ 0xf0b8
+ð¹ 0xf0b9
+ðº 0xf0ba
+ð» 0xf0bb
+ð¼ 0xf0bc
+ð½ 0xf0bd
+ð¾ 0xf0be
+ð¿ 0xf0bf
+ðÀ 0xf0c0
+ðÁ 0xf0c1
+ð 0xf0c2
+ðà 0xf0c3
+ðÄ 0xf0c4
+ðÅ 0xf0c5
+ðÆ 0xf0c6
+ðÇ 0xf0c7
+ðÈ 0xf0c8
+ðÉ 0xf0c9
+ðÊ 0xf0ca
+ðË 0xf0cb
+ðÌ 0xf0cc
+ðÍ 0xf0cd
+ðÎ 0xf0ce
+ðÏ 0xf0cf
+ðÐ 0xf0d0
+ðÑ 0xf0d1
+ðÒ 0xf0d2
+ðÓ 0xf0d3
+ðÔ 0xf0d4
+ðÕ 0xf0d5
+ðÖ 0xf0d6
+ð× 0xf0d7
+ðØ 0xf0d8
+ðÙ 0xf0d9
+ðÚ 0xf0da
+ðÛ 0xf0db
+ðÜ 0xf0dc
+ðÝ 0xf0dd
+ðÞ 0xf0de
+ðß 0xf0df
+ðà 0xf0e0
+ðá 0xf0e1
+ðâ 0xf0e2
+ðã 0xf0e3
+ðä 0xf0e4
+ðå 0xf0e5
+ðæ 0xf0e6
+ðç 0xf0e7
+ðè 0xf0e8
+ðé 0xf0e9
+ðê 0xf0ea
+ðë 0xf0eb
+ðì 0xf0ec
+ðí 0xf0ed
+ðî 0xf0ee
+ðï 0xf0ef
+ðð 0xf0f0
+ðñ 0xf0f1
+ðò 0xf0f2
+ðó 0xf0f3
+ðô 0xf0f4
+ðõ 0xf0f5
+ðö 0xf0f6
+ð÷ 0xf0f7
+ðø 0xf0f8
+ðù 0xf0f9
+ðú 0xf0fa
+ðû 0xf0fb
+ðü 0xf0fc
+ðý 0xf0fd
+ðþ 0xf0fe
+ñ@ 0xf140
+ñA 0xf141
+ñB 0xf142
+ñC 0xf143
+ñD 0xf144
+ñE 0xf145
+ñF 0xf146
+ñG 0xf147
+ñH 0xf148
+ñI 0xf149
+ñJ 0xf14a
+ñK 0xf14b
+ñL 0xf14c
+ñM 0xf14d
+ñN 0xf14e
+ñO 0xf14f
+ñP 0xf150
+ñQ 0xf151
+ñR 0xf152
+ñS 0xf153
+ñT 0xf154
+ñU 0xf155
+ñV 0xf156
+ñW 0xf157
+ñX 0xf158
+ñY 0xf159
+ñZ 0xf15a
+ñ[ 0xf15b
+ñ\ 0xf15c
+ñ] 0xf15d
+ñ^ 0xf15e
+ñ_ 0xf15f
+ñ` 0xf160
+ña 0xf161
+ñb 0xf162
+ñc 0xf163
+ñd 0xf164
+ñe 0xf165
+ñf 0xf166
+ñg 0xf167
+ñh 0xf168
+ñi 0xf169
+ñj 0xf16a
+ñk 0xf16b
+ñl 0xf16c
+ñm 0xf16d
+ñn 0xf16e
+ño 0xf16f
+ñp 0xf170
+ñq 0xf171
+ñr 0xf172
+ñs 0xf173
+ñt 0xf174
+ñu 0xf175
+ñv 0xf176
+ñw 0xf177
+ñx 0xf178
+ñy 0xf179
+ñz 0xf17a
+ñ{ 0xf17b
+ñ| 0xf17c
+ñ} 0xf17d
+ñ~ 0xf17e
+ñ¡ 0xf1a1
+ñ¢ 0xf1a2
+ñ£ 0xf1a3
+ñ¤ 0xf1a4
+ñ¥ 0xf1a5
+ñ¦ 0xf1a6
+ñ§ 0xf1a7
+ñ¨ 0xf1a8
+ñ© 0xf1a9
+ñª 0xf1aa
+ñ« 0xf1ab
+ñ¬ 0xf1ac
+ñ­ 0xf1ad
+ñ® 0xf1ae
+ñ¯ 0xf1af
+ñ° 0xf1b0
+ñ± 0xf1b1
+ñ² 0xf1b2
+ñ³ 0xf1b3
+ñ´ 0xf1b4
+ñµ 0xf1b5
+ñ¶ 0xf1b6
+ñ· 0xf1b7
+ñ¸ 0xf1b8
+ñ¹ 0xf1b9
+ñº 0xf1ba
+ñ» 0xf1bb
+ñ¼ 0xf1bc
+ñ½ 0xf1bd
+ñ¾ 0xf1be
+ñ¿ 0xf1bf
+ñÀ 0xf1c0
+ñÁ 0xf1c1
+ñ 0xf1c2
+ñà 0xf1c3
+ñÄ 0xf1c4
+ñÅ 0xf1c5
+ñÆ 0xf1c6
+ñÇ 0xf1c7
+ñÈ 0xf1c8
+ñÉ 0xf1c9
+ñÊ 0xf1ca
+ñË 0xf1cb
+ñÌ 0xf1cc
+ñÍ 0xf1cd
+ñÎ 0xf1ce
+ñÏ 0xf1cf
+ñÐ 0xf1d0
+ñÑ 0xf1d1
+ñÒ 0xf1d2
+ñÓ 0xf1d3
+ñÔ 0xf1d4
+ñÕ 0xf1d5
+ñÖ 0xf1d6
+ñ× 0xf1d7
+ñØ 0xf1d8
+ñÙ 0xf1d9
+ñÚ 0xf1da
+ñÛ 0xf1db
+ñÜ 0xf1dc
+ñÝ 0xf1dd
+ñÞ 0xf1de
+ñß 0xf1df
+ñà 0xf1e0
+ñá 0xf1e1
+ñâ 0xf1e2
+ñã 0xf1e3
+ñä 0xf1e4
+ñå 0xf1e5
+ñæ 0xf1e6
+ñç 0xf1e7
+ñè 0xf1e8
+ñé 0xf1e9
+ñê 0xf1ea
+ñë 0xf1eb
+ñì 0xf1ec
+ñí 0xf1ed
+ñî 0xf1ee
+ñï 0xf1ef
+ñð 0xf1f0
+ññ 0xf1f1
+ñò 0xf1f2
+ñó 0xf1f3
+ñô 0xf1f4
+ñõ 0xf1f5
+ñö 0xf1f6
+ñ÷ 0xf1f7
+ñø 0xf1f8
+ñù 0xf1f9
+ñú 0xf1fa
+ñû 0xf1fb
+ñü 0xf1fc
+ñý 0xf1fd
+ñþ 0xf1fe
+ò@ 0xf240
+òA 0xf241
+òB 0xf242
+òC 0xf243
+òD 0xf244
+òE 0xf245
+òF 0xf246
+òG 0xf247
+òH 0xf248
+òI 0xf249
+òJ 0xf24a
+òK 0xf24b
+òL 0xf24c
+òM 0xf24d
+òN 0xf24e
+òO 0xf24f
+òP 0xf250
+òQ 0xf251
+òR 0xf252
+òS 0xf253
+òT 0xf254
+òU 0xf255
+òV 0xf256
+òW 0xf257
+òX 0xf258
+òY 0xf259
+òZ 0xf25a
+ò[ 0xf25b
+ò\ 0xf25c
+ò] 0xf25d
+ò^ 0xf25e
+ò_ 0xf25f
+ò` 0xf260
+òa 0xf261
+òb 0xf262
+òc 0xf263
+òd 0xf264
+òe 0xf265
+òf 0xf266
+òg 0xf267
+òh 0xf268
+òi 0xf269
+òj 0xf26a
+òk 0xf26b
+òl 0xf26c
+òm 0xf26d
+òn 0xf26e
+òo 0xf26f
+òp 0xf270
+òq 0xf271
+òr 0xf272
+òs 0xf273
+òt 0xf274
+òu 0xf275
+òv 0xf276
+òw 0xf277
+òx 0xf278
+òy 0xf279
+òz 0xf27a
+ò{ 0xf27b
+ò| 0xf27c
+ò} 0xf27d
+ò~ 0xf27e
+ò¡ 0xf2a1
+ò¢ 0xf2a2
+ò£ 0xf2a3
+ò¤ 0xf2a4
+ò¥ 0xf2a5
+ò¦ 0xf2a6
+ò§ 0xf2a7
+ò¨ 0xf2a8
+ò© 0xf2a9
+òª 0xf2aa
+ò« 0xf2ab
+ò¬ 0xf2ac
+ò­ 0xf2ad
+ò® 0xf2ae
+ò¯ 0xf2af
+ò° 0xf2b0
+ò± 0xf2b1
+ò² 0xf2b2
+ò³ 0xf2b3
+ò´ 0xf2b4
+òµ 0xf2b5
+ò¶ 0xf2b6
+ò· 0xf2b7
+ò¸ 0xf2b8
+ò¹ 0xf2b9
+òº 0xf2ba
+ò» 0xf2bb
+ò¼ 0xf2bc
+ò½ 0xf2bd
+ò¾ 0xf2be
+ò¿ 0xf2bf
+òÀ 0xf2c0
+òÁ 0xf2c1
+òÂ 0xf2c2
+òÃ 0xf2c3
+òÄ 0xf2c4
+òÅ 0xf2c5
+òÆ 0xf2c6
+òÇ 0xf2c7
+òÈ 0xf2c8
+òÉ 0xf2c9
+òÊ 0xf2ca
+òË 0xf2cb
+òÌ 0xf2cc
+òÍ 0xf2cd
+òÎ 0xf2ce
+òÏ 0xf2cf
+òÐ 0xf2d0
+òÑ 0xf2d1
+òÒ 0xf2d2
+òÓ 0xf2d3
+òÔ 0xf2d4
+òÕ 0xf2d5
+òÖ 0xf2d6
+ò× 0xf2d7
+òØ 0xf2d8
+òÙ 0xf2d9
+òÚ 0xf2da
+òÛ 0xf2db
+òÜ 0xf2dc
+òÝ 0xf2dd
+òÞ 0xf2de
+òß 0xf2df
+òà 0xf2e0
+òá 0xf2e1
+òâ 0xf2e2
+òã 0xf2e3
+òä 0xf2e4
+òå 0xf2e5
+òæ 0xf2e6
+òç 0xf2e7
+òè 0xf2e8
+òé 0xf2e9
+òê 0xf2ea
+òë 0xf2eb
+òì 0xf2ec
+òí 0xf2ed
+òî 0xf2ee
+òï 0xf2ef
+òð 0xf2f0
+òñ 0xf2f1
+òò 0xf2f2
+òó 0xf2f3
+òô 0xf2f4
+òõ 0xf2f5
+òö 0xf2f6
+ò÷ 0xf2f7
+òø 0xf2f8
+òù 0xf2f9
+òú 0xf2fa
+òû 0xf2fb
+òü 0xf2fc
+òý 0xf2fd
+òþ 0xf2fe
+ó@ 0xf340
+óA 0xf341
+óB 0xf342
+óC 0xf343
+óD 0xf344
+óE 0xf345
+óF 0xf346
+óG 0xf347
+óH 0xf348
+óI 0xf349
+óJ 0xf34a
+óK 0xf34b
+óL 0xf34c
+óM 0xf34d
+óN 0xf34e
+óO 0xf34f
+óP 0xf350
+óQ 0xf351
+óR 0xf352
+óS 0xf353
+óT 0xf354
+óU 0xf355
+óV 0xf356
+óW 0xf357
+óX 0xf358
+óY 0xf359
+óZ 0xf35a
+ó[ 0xf35b
+ó\ 0xf35c
+ó] 0xf35d
+ó^ 0xf35e
+ó_ 0xf35f
+ó` 0xf360
+óa 0xf361
+ób 0xf362
+óc 0xf363
+ód 0xf364
+óe 0xf365
+óf 0xf366
+óg 0xf367
+óh 0xf368
+ói 0xf369
+ój 0xf36a
+ók 0xf36b
+ól 0xf36c
+óm 0xf36d
+ón 0xf36e
+óo 0xf36f
+óp 0xf370
+óq 0xf371
+ór 0xf372
+ós 0xf373
+ót 0xf374
+óu 0xf375
+óv 0xf376
+ów 0xf377
+óx 0xf378
+óy 0xf379
+óz 0xf37a
+ó{ 0xf37b
+ó| 0xf37c
+ó} 0xf37d
+ó~ 0xf37e
+ó¡ 0xf3a1
+ó¢ 0xf3a2
+ó£ 0xf3a3
+ó¤ 0xf3a4
+ó¥ 0xf3a5
+ó¦ 0xf3a6
+ó§ 0xf3a7
+ó¨ 0xf3a8
+ó© 0xf3a9
+óª 0xf3aa
+ó« 0xf3ab
+ó¬ 0xf3ac
+ó­ 0xf3ad
+ó® 0xf3ae
+ó¯ 0xf3af
+ó° 0xf3b0
+ó± 0xf3b1
+ó² 0xf3b2
+ó³ 0xf3b3
+ó´ 0xf3b4
+óµ 0xf3b5
+ó¶ 0xf3b6
+ó· 0xf3b7
+ó¸ 0xf3b8
+ó¹ 0xf3b9
+óº 0xf3ba
+ó» 0xf3bb
+ó¼ 0xf3bc
+ó½ 0xf3bd
+ó¾ 0xf3be
+ó¿ 0xf3bf
+óÀ 0xf3c0
+óÁ 0xf3c1
+óÂ 0xf3c2
+óÃ 0xf3c3
+óÄ 0xf3c4
+óÅ 0xf3c5
+óÆ 0xf3c6
+óÇ 0xf3c7
+óÈ 0xf3c8
+óÉ 0xf3c9
+óÊ 0xf3ca
+óË 0xf3cb
+óÌ 0xf3cc
+óÍ 0xf3cd
+óÎ 0xf3ce
+óÏ 0xf3cf
+óÐ 0xf3d0
+óÑ 0xf3d1
+óÒ 0xf3d2
+óÓ 0xf3d3
+óÔ 0xf3d4
+óÕ 0xf3d5
+óÖ 0xf3d6
+ó× 0xf3d7
+óØ 0xf3d8
+óÙ 0xf3d9
+óÚ 0xf3da
+óÛ 0xf3db
+óÜ 0xf3dc
+óÝ 0xf3dd
+óÞ 0xf3de
+óß 0xf3df
+óà 0xf3e0
+óá 0xf3e1
+óâ 0xf3e2
+óã 0xf3e3
+óä 0xf3e4
+óå 0xf3e5
+óæ 0xf3e6
+óç 0xf3e7
+óè 0xf3e8
+óé 0xf3e9
+óê 0xf3ea
+óë 0xf3eb
+óì 0xf3ec
+óí 0xf3ed
+óî 0xf3ee
+óï 0xf3ef
+óð 0xf3f0
+óñ 0xf3f1
+óò 0xf3f2
+óó 0xf3f3
+óô 0xf3f4
+óõ 0xf3f5
+óö 0xf3f6
+ó÷ 0xf3f7
+óø 0xf3f8
+óù 0xf3f9
+óú 0xf3fa
+óû 0xf3fb
+óü 0xf3fc
+óý 0xf3fd
+óþ 0xf3fe
+ô@ 0xf440
+ôA 0xf441
+ôB 0xf442
+ôC 0xf443
+ôD 0xf444
+ôE 0xf445
+ôF 0xf446
+ôG 0xf447
+ôH 0xf448
+ôI 0xf449
+ôJ 0xf44a
+ôK 0xf44b
+ôL 0xf44c
+ôM 0xf44d
+ôN 0xf44e
+ôO 0xf44f
+ôP 0xf450
+ôQ 0xf451
+ôR 0xf452
+ôS 0xf453
+ôT 0xf454
+ôU 0xf455
+ôV 0xf456
+ôW 0xf457
+ôX 0xf458
+ôY 0xf459
+ôZ 0xf45a
+ô[ 0xf45b
+ô\ 0xf45c
+ô] 0xf45d
+ô^ 0xf45e
+ô_ 0xf45f
+ô` 0xf460
+ôa 0xf461
+ôb 0xf462
+ôc 0xf463
+ôd 0xf464
+ôe 0xf465
+ôf 0xf466
+ôg 0xf467
+ôh 0xf468
+ôi 0xf469
+ôj 0xf46a
+ôk 0xf46b
+ôl 0xf46c
+ôm 0xf46d
+ôn 0xf46e
+ôo 0xf46f
+ôp 0xf470
+ôq 0xf471
+ôr 0xf472
+ôs 0xf473
+ôt 0xf474
+ôu 0xf475
+ôv 0xf476
+ôw 0xf477
+ôx 0xf478
+ôy 0xf479
+ôz 0xf47a
+ô{ 0xf47b
+ô| 0xf47c
+ô} 0xf47d
+ô~ 0xf47e
+ô¡ 0xf4a1
+ô¢ 0xf4a2
+ô£ 0xf4a3
+ô¤ 0xf4a4
+ô¥ 0xf4a5
+ô¦ 0xf4a6
+ô§ 0xf4a7
+ô¨ 0xf4a8
+ô© 0xf4a9
+ôª 0xf4aa
+ô« 0xf4ab
+ô¬ 0xf4ac
+ô­ 0xf4ad
+ô® 0xf4ae
+ô¯ 0xf4af
+ô° 0xf4b0
+ô± 0xf4b1
+ô² 0xf4b2
+ô³ 0xf4b3
+ô´ 0xf4b4
+ôµ 0xf4b5
+ô¶ 0xf4b6
+ô· 0xf4b7
+ô¸ 0xf4b8
+ô¹ 0xf4b9
+ôº 0xf4ba
+ô» 0xf4bb
+ô¼ 0xf4bc
+ô½ 0xf4bd
+ô¾ 0xf4be
+ô¿ 0xf4bf
+ôÀ 0xf4c0
+ôÁ 0xf4c1
+ôÂ 0xf4c2
+ôÃ 0xf4c3
+ôÄ 0xf4c4
+ôÅ 0xf4c5
+ôÆ 0xf4c6
+ôÇ 0xf4c7
+ôÈ 0xf4c8
+ôÉ 0xf4c9
+ôÊ 0xf4ca
+ôË 0xf4cb
+ôÌ 0xf4cc
+ôÍ 0xf4cd
+ôÎ 0xf4ce
+ôÏ 0xf4cf
+ôÐ 0xf4d0
+ôÑ 0xf4d1
+ôÒ 0xf4d2
+ôÓ 0xf4d3
+ôÔ 0xf4d4
+ôÕ 0xf4d5
+ôÖ 0xf4d6
+ô× 0xf4d7
+ôØ 0xf4d8
+ôÙ 0xf4d9
+ôÚ 0xf4da
+ôÛ 0xf4db
+ôÜ 0xf4dc
+ôÝ 0xf4dd
+ôÞ 0xf4de
+ôß 0xf4df
+ôà 0xf4e0
+ôá 0xf4e1
+ôâ 0xf4e2
+ôã 0xf4e3
+ôä 0xf4e4
+ôå 0xf4e5
+ôæ 0xf4e6
+ôç 0xf4e7
+ôè 0xf4e8
+ôé 0xf4e9
+ôê 0xf4ea
+ôë 0xf4eb
+ôì 0xf4ec
+ôí 0xf4ed
+ôî 0xf4ee
+ôï 0xf4ef
+ôð 0xf4f0
+ôñ 0xf4f1
+ôò 0xf4f2
+ôó 0xf4f3
+ôô 0xf4f4
+ôõ 0xf4f5
+ôö 0xf4f6
+ô÷ 0xf4f7
+ôø 0xf4f8
+ôù 0xf4f9
+ôú 0xf4fa
+ôû 0xf4fb
+ôü 0xf4fc
+ôý 0xf4fd
+ôþ 0xf4fe
+õ@ 0xf540
+õA 0xf541
+õB 0xf542
+õC 0xf543
+õD 0xf544
+õE 0xf545
+õF 0xf546
+õG 0xf547
+õH 0xf548
+õI 0xf549
+õJ 0xf54a
+õK 0xf54b
+õL 0xf54c
+õM 0xf54d
+õN 0xf54e
+õO 0xf54f
+õP 0xf550
+õQ 0xf551
+õR 0xf552
+õS 0xf553
+õT 0xf554
+õU 0xf555
+õV 0xf556
+õW 0xf557
+õX 0xf558
+õY 0xf559
+õZ 0xf55a
+õ[ 0xf55b
+õ\ 0xf55c
+õ] 0xf55d
+õ^ 0xf55e
+õ_ 0xf55f
+õ` 0xf560
+õa 0xf561
+õb 0xf562
+õc 0xf563
+õd 0xf564
+õe 0xf565
+õf 0xf566
+õg 0xf567
+õh 0xf568
+õi 0xf569
+õj 0xf56a
+õk 0xf56b
+õl 0xf56c
+õm 0xf56d
+õn 0xf56e
+õo 0xf56f
+õp 0xf570
+õq 0xf571
+õr 0xf572
+õs 0xf573
+õt 0xf574
+õu 0xf575
+õv 0xf576
+õw 0xf577
+õx 0xf578
+õy 0xf579
+õz 0xf57a
+õ{ 0xf57b
+õ| 0xf57c
+õ} 0xf57d
+õ~ 0xf57e
+õ¡ 0xf5a1
+õ¢ 0xf5a2
+õ£ 0xf5a3
+õ¤ 0xf5a4
+õ¥ 0xf5a5
+õ¦ 0xf5a6
+õ§ 0xf5a7
+õ¨ 0xf5a8
+õ© 0xf5a9
+õª 0xf5aa
+õ« 0xf5ab
+õ¬ 0xf5ac
+õ­ 0xf5ad
+õ® 0xf5ae
+õ¯ 0xf5af
+õ° 0xf5b0
+õ± 0xf5b1
+õ² 0xf5b2
+õ³ 0xf5b3
+õ´ 0xf5b4
+õµ 0xf5b5
+õ¶ 0xf5b6
+õ· 0xf5b7
+õ¸ 0xf5b8
+õ¹ 0xf5b9
+õº 0xf5ba
+õ» 0xf5bb
+õ¼ 0xf5bc
+õ½ 0xf5bd
+õ¾ 0xf5be
+õ¿ 0xf5bf
+õÀ 0xf5c0
+õÁ 0xf5c1
+õÂ 0xf5c2
+õÃ 0xf5c3
+õÄ 0xf5c4
+õÅ 0xf5c5
+õÆ 0xf5c6
+õÇ 0xf5c7
+õÈ 0xf5c8
+õÉ 0xf5c9
+õÊ 0xf5ca
+õË 0xf5cb
+õÌ 0xf5cc
+õÍ 0xf5cd
+õÎ 0xf5ce
+õÏ 0xf5cf
+õÐ 0xf5d0
+õÑ 0xf5d1
+õÒ 0xf5d2
+õÓ 0xf5d3
+õÔ 0xf5d4
+õÕ 0xf5d5
+õÖ 0xf5d6
+õ× 0xf5d7
+õØ 0xf5d8
+õÙ 0xf5d9
+õÚ 0xf5da
+õÛ 0xf5db
+õÜ 0xf5dc
+õÝ 0xf5dd
+õÞ 0xf5de
+õß 0xf5df
+õà 0xf5e0
+õá 0xf5e1
+õâ 0xf5e2
+õã 0xf5e3
+õä 0xf5e4
+õå 0xf5e5
+õæ 0xf5e6
+õç 0xf5e7
+õè 0xf5e8
+õé 0xf5e9
+õê 0xf5ea
+õë 0xf5eb
+õì 0xf5ec
+õí 0xf5ed
+õî 0xf5ee
+õï 0xf5ef
+õð 0xf5f0
+õñ 0xf5f1
+õò 0xf5f2
+õó 0xf5f3
+õô 0xf5f4
+õõ 0xf5f5
+õö 0xf5f6
+õ÷ 0xf5f7
+õø 0xf5f8
+õù 0xf5f9
+õú 0xf5fa
+õû 0xf5fb
+õü 0xf5fc
+õý 0xf5fd
+õþ 0xf5fe
+ö@ 0xf640
+öA 0xf641
+öB 0xf642
+öC 0xf643
+öD 0xf644
+öE 0xf645
+öF 0xf646
+öG 0xf647
+öH 0xf648
+öI 0xf649
+öJ 0xf64a
+öK 0xf64b
+öL 0xf64c
+öM 0xf64d
+öN 0xf64e
+öO 0xf64f
+öP 0xf650
+öQ 0xf651
+öR 0xf652
+öS 0xf653
+öT 0xf654
+öU 0xf655
+öV 0xf656
+öW 0xf657
+öX 0xf658
+öY 0xf659
+öZ 0xf65a
+ö[ 0xf65b
+ö\ 0xf65c
+ö] 0xf65d
+ö^ 0xf65e
+ö_ 0xf65f
+ö` 0xf660
+öa 0xf661
+öb 0xf662
+öc 0xf663
+öd 0xf664
+öe 0xf665
+öf 0xf666
+ög 0xf667
+öh 0xf668
+öi 0xf669
+öj 0xf66a
+ök 0xf66b
+öl 0xf66c
+öm 0xf66d
+ön 0xf66e
+öo 0xf66f
+öp 0xf670
+öq 0xf671
+ör 0xf672
+ös 0xf673
+öt 0xf674
+öu 0xf675
+öv 0xf676
+öw 0xf677
+öx 0xf678
+öy 0xf679
+öz 0xf67a
+ö{ 0xf67b
+ö| 0xf67c
+ö} 0xf67d
+ö~ 0xf67e
+ö¡ 0xf6a1
+ö¢ 0xf6a2
+ö£ 0xf6a3
+ö¤ 0xf6a4
+ö¥ 0xf6a5
+ö¦ 0xf6a6
+ö§ 0xf6a7
+ö¨ 0xf6a8
+ö© 0xf6a9
+öª 0xf6aa
+ö« 0xf6ab
+ö¬ 0xf6ac
+ö­ 0xf6ad
+ö® 0xf6ae
+ö¯ 0xf6af
+ö° 0xf6b0
+ö± 0xf6b1
+ö² 0xf6b2
+ö³ 0xf6b3
+ö´ 0xf6b4
+öµ 0xf6b5
+ö¶ 0xf6b6
+ö· 0xf6b7
+ö¸ 0xf6b8
+ö¹ 0xf6b9
+öº 0xf6ba
+ö» 0xf6bb
+ö¼ 0xf6bc
+ö½ 0xf6bd
+ö¾ 0xf6be
+ö¿ 0xf6bf
+öÀ 0xf6c0
+öÁ 0xf6c1
+öÂ 0xf6c2
+öÃ 0xf6c3
+öÄ 0xf6c4
+öÅ 0xf6c5
+öÆ 0xf6c6
+öÇ 0xf6c7
+öÈ 0xf6c8
+öÉ 0xf6c9
+öÊ 0xf6ca
+öË 0xf6cb
+öÌ 0xf6cc
+öÍ 0xf6cd
+öÎ 0xf6ce
+öÏ 0xf6cf
+öÐ 0xf6d0
+öÑ 0xf6d1
+öÒ 0xf6d2
+öÓ 0xf6d3
+öÔ 0xf6d4
+öÕ 0xf6d5
+öÖ 0xf6d6
+ö× 0xf6d7
+öØ 0xf6d8
+öÙ 0xf6d9
+öÚ 0xf6da
+öÛ 0xf6db
+öÜ 0xf6dc
+öÝ 0xf6dd
+öÞ 0xf6de
+öß 0xf6df
+öà 0xf6e0
+öá 0xf6e1
+öâ 0xf6e2
+öã 0xf6e3
+öä 0xf6e4
+öå 0xf6e5
+öæ 0xf6e6
+öç 0xf6e7
+öè 0xf6e8
+öé 0xf6e9
+öê 0xf6ea
+öë 0xf6eb
+öì 0xf6ec
+öí 0xf6ed
+öî 0xf6ee
+öï 0xf6ef
+öð 0xf6f0
+öñ 0xf6f1
+öò 0xf6f2
+öó 0xf6f3
+öô 0xf6f4
+öõ 0xf6f5
+öö 0xf6f6
+ö÷ 0xf6f7
+öø 0xf6f8
+öù 0xf6f9
+öú 0xf6fa
+öû 0xf6fb
+öü 0xf6fc
+öý 0xf6fd
+öþ 0xf6fe
+÷@ 0xf740
+÷A 0xf741
+÷B 0xf742
+÷C 0xf743
+÷D 0xf744
+÷E 0xf745
+÷F 0xf746
+÷G 0xf747
+÷H 0xf748
+÷I 0xf749
+÷J 0xf74a
+÷K 0xf74b
+÷L 0xf74c
+÷M 0xf74d
+÷N 0xf74e
+÷O 0xf74f
+÷P 0xf750
+÷Q 0xf751
+÷R 0xf752
+÷S 0xf753
+÷T 0xf754
+÷U 0xf755
+÷V 0xf756
+÷W 0xf757
+÷X 0xf758
+÷Y 0xf759
+÷Z 0xf75a
+÷[ 0xf75b
+÷\ 0xf75c
+÷] 0xf75d
+÷^ 0xf75e
+÷_ 0xf75f
+÷` 0xf760
+÷a 0xf761
+÷b 0xf762
+÷c 0xf763
+÷d 0xf764
+÷e 0xf765
+÷f 0xf766
+÷g 0xf767
+÷h 0xf768
+÷i 0xf769
+÷j 0xf76a
+÷k 0xf76b
+÷l 0xf76c
+÷m 0xf76d
+÷n 0xf76e
+÷o 0xf76f
+÷p 0xf770
+÷q 0xf771
+÷r 0xf772
+÷s 0xf773
+÷t 0xf774
+÷u 0xf775
+÷v 0xf776
+÷w 0xf777
+÷x 0xf778
+÷y 0xf779
+÷z 0xf77a
+÷{ 0xf77b
+÷| 0xf77c
+÷} 0xf77d
+÷~ 0xf77e
+÷¡ 0xf7a1
+÷¢ 0xf7a2
+÷£ 0xf7a3
+÷¤ 0xf7a4
+÷¥ 0xf7a5
+÷¦ 0xf7a6
+֤ 0xf7a7
+֬ 0xf7a8
+֩ 0xf7a9
+ֻ 0xf7aa
+÷« 0xf7ab
+÷¬ 0xf7ac
+÷­ 0xf7ad
+÷® 0xf7ae
+÷¯ 0xf7af
+÷° 0xf7b0
+÷± 0xf7b1
+÷² 0xf7b2
+÷³ 0xf7b3
+÷´ 0xf7b4
+÷µ 0xf7b5
+֦ 0xf7b6
+÷· 0xf7b7
+÷¸ 0xf7b8
+÷¹ 0xf7b9
+ּ 0xf7ba
+÷» 0xf7bb
+÷¼ 0xf7bc
+÷½ 0xf7bd
+÷¾ 0xf7be
+÷¿ 0xf7bf
+÷À 0xf7c0
+÷Á 0xf7c1
+÷ 0xf7c2
+ֈ 0xf7c3
+ր 0xf7c4
+ց 0xf7c5
+֮ 0xf7c6
+ւ 0xf7c7
+÷È 0xf7c8
+փ 0xf7c9
+÷Ê 0xf7ca
+÷Ë 0xf7cb
+÷Ì 0xf7cc
+÷Í 0xf7cd
+÷Î 0xf7ce
+÷Ï 0xf7cf
+÷Ð 0xf7d0
+ք 0xf7d1
+÷Ò 0xf7d2
+÷Ó 0xf7d3
+÷Ô 0xf7d4
+÷Õ 0xf7d5
+÷Ö 0xf7d6
+÷× 0xf7d7
+֯ 0xf7d8
+÷Ù 0xf7d9
+÷Ú 0xf7da
+÷Û 0xf7db
+ֆ 0xf7dc
+÷Ý 0xf7dd
+÷Þ 0xf7de
+֧ 0xf7df
+ֈ 0xf7e0
+և 0xf7e1
+։ 0xf7e2
+֋ 0xf7e3
+֊ 0xf7e4
+֌ 0xf7e5
+־ 0xf7e6
+֍ 0xf7e7
+֏ 0xf7e8
+֎ 0xf7e9
+֐ 0xf7ea
+֑ 0xf7eb
+֓ 0xf7ec
+֒ 0xf7ed
+֔ 0xf7ee
+֕ 0xf7ef
+÷ð 0xf7f0
+֖ 0xf7f1
+÷ò 0xf7f2
+÷ó 0xf7f3
+÷ô 0xf7f4
+÷õ 0xf7f5
+÷ö 0xf7f6
+÷÷ 0xf7f7
+÷ø 0xf7f8
+÷ù 0xf7f9
+÷ú 0xf7fa
+÷û 0xf7fb
+֟ 0xf7fc
+÷ý 0xf7fd
+÷þ 0xf7fe
+ø@ 0xf840
+øA 0xf841
+øB 0xf842
+øC 0xf843
+øD 0xf844
+øE 0xf845
+øF 0xf846
+øG 0xf847
+øH 0xf848
+øI 0xf849
+øJ 0xf84a
+øK 0xf84b
+øL 0xf84c
+øM 0xf84d
+øN 0xf84e
+øO 0xf84f
+øP 0xf850
+øQ 0xf851
+øR 0xf852
+øS 0xf853
+øT 0xf854
+øU 0xf855
+øV 0xf856
+øW 0xf857
+øX 0xf858
+øY 0xf859
+øZ 0xf85a
+ø[ 0xf85b
+ø\ 0xf85c
+ø] 0xf85d
+ø^ 0xf85e
+ø_ 0xf85f
+ø` 0xf860
+øa 0xf861
+øb 0xf862
+øc 0xf863
+ød 0xf864
+øe 0xf865
+øf 0xf866
+øg 0xf867
+øh 0xf868
+øi 0xf869
+øj 0xf86a
+øk 0xf86b
+øl 0xf86c
+øm 0xf86d
+øn 0xf86e
+øo 0xf86f
+øp 0xf870
+øq 0xf871
+ør 0xf872
+øs 0xf873
+øt 0xf874
+øu 0xf875
+øv 0xf876
+øw 0xf877
+øx 0xf878
+øy 0xf879
+øz 0xf87a
+ø{ 0xf87b
+ø| 0xf87c
+ø} 0xf87d
+ø~ 0xf87e
+ø¡ 0xf8a1
+ø¢ 0xf8a2
+ø£ 0xf8a3
+ø¤ 0xf8a4
+ø¥ 0xf8a5
+ø¦ 0xf8a6
+ø§ 0xf8a7
+ø¨ 0xf8a8
+ø© 0xf8a9
+øª 0xf8aa
+ø« 0xf8ab
+ø¬ 0xf8ac
+ø­ 0xf8ad
+ø® 0xf8ae
+ø¯ 0xf8af
+ø° 0xf8b0
+ø± 0xf8b1
+ø² 0xf8b2
+ø³ 0xf8b3
+ø´ 0xf8b4
+øµ 0xf8b5
+ø¶ 0xf8b6
+ø· 0xf8b7
+ø¸ 0xf8b8
+ø¹ 0xf8b9
+øº 0xf8ba
+ø» 0xf8bb
+ø¼ 0xf8bc
+ø½ 0xf8bd
+ø¾ 0xf8be
+ø¿ 0xf8bf
+øÀ 0xf8c0
+øÁ 0xf8c1
+øÂ 0xf8c2
+øÃ 0xf8c3
+øÄ 0xf8c4
+øÅ 0xf8c5
+øÆ 0xf8c6
+øÇ 0xf8c7
+øÈ 0xf8c8
+øÉ 0xf8c9
+øÊ 0xf8ca
+øË 0xf8cb
+øÌ 0xf8cc
+øÍ 0xf8cd
+øÎ 0xf8ce
+øÏ 0xf8cf
+øÐ 0xf8d0
+øÑ 0xf8d1
+øÒ 0xf8d2
+øÓ 0xf8d3
+øÔ 0xf8d4
+øÕ 0xf8d5
+øÖ 0xf8d6
+ø× 0xf8d7
+øØ 0xf8d8
+øÙ 0xf8d9
+øÚ 0xf8da
+øÛ 0xf8db
+øÜ 0xf8dc
+øÝ 0xf8dd
+øÞ 0xf8de
+øß 0xf8df
+øà 0xf8e0
+øá 0xf8e1
+øâ 0xf8e2
+øã 0xf8e3
+øä 0xf8e4
+øå 0xf8e5
+øæ 0xf8e6
+øç 0xf8e7
+øè 0xf8e8
+øé 0xf8e9
+øê 0xf8ea
+øë 0xf8eb
+øì 0xf8ec
+øí 0xf8ed
+øî 0xf8ee
+øï 0xf8ef
+øð 0xf8f0
+øñ 0xf8f1
+øò 0xf8f2
+øó 0xf8f3
+øô 0xf8f4
+øõ 0xf8f5
+øö 0xf8f6
+ø÷ 0xf8f7
+øø 0xf8f8
+øù 0xf8f9
+øú 0xf8fa
+øû 0xf8fb
+øü 0xf8fc
+øý 0xf8fd
+øþ 0xf8fe
+ù@ 0xf940
+ùA 0xf941
+ùB 0xf942
+ùC 0xf943
+ùD 0xf944
+ùE 0xf945
+ùF 0xf946
+ùG 0xf947
+ùH 0xf948
+ùI 0xf949
+ùJ 0xf94a
+ùK 0xf94b
+ùL 0xf94c
+ùM 0xf94d
+ùN 0xf94e
+ùO 0xf94f
+ùP 0xf950
+ùQ 0xf951
+ùR 0xf952
+ùS 0xf953
+ùT 0xf954
+ùU 0xf955
+ùV 0xf956
+ùW 0xf957
+ùX 0xf958
+ùY 0xf959
+ùZ 0xf95a
+ù[ 0xf95b
+ù\ 0xf95c
+ù] 0xf95d
+ù^ 0xf95e
+ù_ 0xf95f
+ù` 0xf960
+ùa 0xf961
+ùb 0xf962
+ùc 0xf963
+ùd 0xf964
+ùe 0xf965
+ùf 0xf966
+ùg 0xf967
+ùh 0xf968
+ùi 0xf969
+ùj 0xf96a
+ùk 0xf96b
+ùl 0xf96c
+ùm 0xf96d
+ùn 0xf96e
+ùo 0xf96f
+ùp 0xf970
+ùq 0xf971
+ùr 0xf972
+ùs 0xf973
+ùt 0xf974
+ùu 0xf975
+ùv 0xf976
+ùw 0xf977
+ùx 0xf978
+ùy 0xf979
+ùz 0xf97a
+ù{ 0xf97b
+ù| 0xf97c
+ù} 0xf97d
+ù~ 0xf97e
+ù¡ 0xf9a1
+ù¢ 0xf9a2
+ù£ 0xf9a3
+ù¤ 0xf9a4
+ù¥ 0xf9a5
+ù¦ 0xf9a6
+ù§ 0xf9a7
+ù¨ 0xf9a8
+ù© 0xf9a9
+ùª 0xf9aa
+ù« 0xf9ab
+ù¬ 0xf9ac
+ù­ 0xf9ad
+ù® 0xf9ae
+ù¯ 0xf9af
+ù° 0xf9b0
+ù± 0xf9b1
+ù² 0xf9b2
+ù³ 0xf9b3
+ù´ 0xf9b4
+ùµ 0xf9b5
+ù¶ 0xf9b6
+ù· 0xf9b7
+ù¸ 0xf9b8
+ù¹ 0xf9b9
+ùº 0xf9ba
+ù» 0xf9bb
+ù¼ 0xf9bc
+ù½ 0xf9bd
+ù¾ 0xf9be
+ù¿ 0xf9bf
+ùÀ 0xf9c0
+ùÁ 0xf9c1
+ùÂ 0xf9c2
+ùÃ 0xf9c3
+ùÄ 0xf9c4
+ùÅ 0xf9c5
+ùÆ 0xf9c6
+ùÇ 0xf9c7
+ùÈ 0xf9c8
+ùÉ 0xf9c9
+ùÊ 0xf9ca
+ùË 0xf9cb
+ùÌ 0xf9cc
+ùÍ 0xf9cd
+ùÎ 0xf9ce
+ùÏ 0xf9cf
+ùÐ 0xf9d0
+ùÑ 0xf9d1
+ùÒ 0xf9d2
+ùÓ 0xf9d3
+ùÔ 0xf9d4
+ùÕ 0xf9d5
diff --git a/private/oleauto/sample/nlssort/source.jpn b/private/oleauto/sample/nlssort/source.jpn
new file mode 100644
index 000000000..424d9e50d
--- /dev/null
+++ b/private/oleauto/sample/nlssort/source.jpn
@@ -0,0 +1,16109 @@
+‚Ú[‚¢
+‚¿‚ã[‚Ô
+‚¿‚イ‚Í
+‚Æ‚¤‚®‚¤
+‚²‚¤‚¶‚傤
+‚µ‚å‚É‚ñ
+‚ê‚ñ‚¶‚Â
+‚¨‚è‚ß
+‚Æ‚¤‚¾‚¢
+‚Ђñ‚à‚­
+‚µ‚à‚²‚¦
+‚½‚¢‚Þ‚è[
+‚½‚Ñ‚³‚«
+‚¿‚傤‚é‚¢
+‚Ђ܂Â
+‚Æ‚¨
+‚¢‚ë‚ ‚¢
+‚»‚¤‚µ‚»‚¤‚ ‚¢
+‚΂µ‚å
+‚ ‚«‚܂‚è
+‚°‚Á‚©‚ñ
+‚©‚±‚¤‚¹‚ñ
+‚ß‚à‚Æ
+‚©‚»‚¤
+‚¨‚₵‚¨
+‚¹‚¢‚Ä‚ñ
+‚©‚½‚ª‚½
+‚¢‚è‚ ‚¢
+‚Ä‚µ‚¨
+‚ ‚»‚µ‚¦[‚µ‚å‚ñ
+‚©‚½‚Ä
+‚±‚¤‚¢‚Á‚Ä‚ñ
+‚¦‚¢‚ß‚¢
+‚¨‚»‚΂ñ
+‚¶‚å‚»‚¤‚´‚¢
+‚¨[‚Ƃ΂¢
+‚°‚ñ‚Î
+‚è‚ñ‚¬‚µ‚å
+‚¬‚¶
+‚°‚ñ‚¢‚ñ
+‚ӂ΂¢
+‚¹‚ç‚Ý‚Á‚­
+‚Í‚¢‚¦‚ñ
+‚Ó‚¾
+‚«‚ñ
+‚µ‚½‚¦
+‚䂵‚ã‚‚ɂイ
+‚¹‚Ò‚ 
+‚¶‚½
+‚‚΂«
+‚䂤‚¯‚ñ
+‚Ђ«‚á‚­
+‚ª‚­‚â
+‚¢‚±‚¢
+‚¢‚ñ‚Ë‚ñ
+‚«‚¿‚ñ
+‚°‚ñ‚²‚ª‚­
+‚Ú‚Ç‚¤
+‚µ[‚Æ
+‚·‚­‚è[‚ñ
+‚®‚ç‚¢
+‚¶‚ñ‚µ‚ã
+‚¾‚ñ‚µ‚å‚­
+‚Ä‚¢‚ê‚¢
+‚µ‚å‚­‚µ‚傤‚ª‚¢
+‚º‚ñ‚ê‚«
+‚ª‚¢‚ ‚Â
+‚悤‚®
+‚°‚¢‚¶‚ã‚‚©
+‚Ï‚Ó‚§[‚Ü‚ñ‚·
+‚¾‚‚¢‚¶‚傤
+‚©‚¢‚͂‚«
+‚Ђ±‚¤
+‚¦‚¢‚µ‚á‚«
+‚݂͂炵
+‚¾‚¢‚²‚ª‚©‚è
+‚¨‚¨‚¢‚»‚¬
+‚Ù‚¤‚¢‚«
+‚·‚Õ‚ê‚Á‚Ç
+‚ª‚­‚¢‚ñ
+‚·‚±‚µ
+‚¨‚ñ‚­‚ñ
+‚䂤‚©‚­
+‚²‚¤‚«‚ñ
+‚¿‚å‚Á‚©‚­
+‚Æ‚¤‚©‚ñ
+‚Þ‚¶‚イ‚è‚å‚­
+‚¨‚Å‚¢
+‚­‚¿‚Ñ‚é
+‚¨‚Æ‚±‚Ì‚±
+‚¿‚傤‚â‚­
+‚ ‚©‚¶
+‚ê‚¢‚Ä‚¢
+‚Ó‚é‚©‚Ô
+‚µ‚Ö‚¢
+‚«‚傪‚­
+‚Ó‚­‚¹‚ñ
+‚©‚Ý‚¾‚È
+‚«‚¯‚ñ‚¹‚¢
+‚¢‚½‚ß
+‚­‚炤‚ñ
+‚Ê‚«
+‚µ‚傤‚¯‚ñ‚«‚å‚­
+‚³‚¢‚µ‚イ
+‚¯‚¢‚¼‚¤
+‚¢‚¿‚à‚ñ
+‚¢‚¿‚ß‚ñ‚µ‚«
+‚³‚©‚³
+‚³‚¢‚ê‚ñ‚Æ
+‚Ó‚¢‚è
+‚¤‚ñ‚Ï‚ñ‚®
+‚¢‚½‚µ‚©‚½
+‚«‚á‚Õ‚Ä‚ñ
+‚¶‚ñ‚悤
+‚¨‚ñ‚ª‚Á‚©
+‚³‚ñ‚±‚¤‚É‚ñ
+‚«‚䂤
+‚Ç‚±‚¤
+‚¬‚ñ‚Ï‚­
+‚¨‚¨‚Þ‚¬
+‚Í‚ß
+‚©‚¢‚ª‚©
+‚«‚Á‚±‚¤
+‚¾‚¢‚¿‚傤‚«‚ñ
+‚«‚ñ‚Ò
+‚¯‚ñ‚Ò‚Â
+‚¯‚Á‚µ‚á
+‚É‚®‚é‚Ü
+‚©‚¢‚낤
+‚©‚邽
+‚µ‚コ
+‚©‚³
+‚Ë‚ñ‚Ò
+‚ê‚¢‚Ë‚Â
+‚Ó‚ñ‚Ü‚ñ
+‚­‚Ý‚ª‚µ‚ç
+‚Æ‚¤‚©‚¢‚¿‚Ù‚¤
+‚©‚µ‚イ
+‚¾‚ñ‚±‚ñ
+‚©‚­‚¶‚Â
+‚¤‚¢‚é‚·
+‚­‚¤‚Ç‚¤
+‚¨‚¨‚ ‚È
+‚Ä‚¢‚«‚傤‚µ‚á
+‚È‚ñ‚Î[
+‚¤‚‚í
+‚è‚·‚¢
+‚¾‚¢‚è
+‚Ó‚è‚ñ
+‚¤‚ê‚Ì‚±‚è
+‚Å‚ñ‚Ô
+‚¢‚Æ‚Ü
+‚΂炢
+‚Í‚Í‚¨‚â
+‚µ‚à‚΂µ‚ç
+‚‚‚Ý
+‚è‚­‚ ‚°
+‚Ù‚¤‚³‚­
+‚¶‚傤‚©
+‚¬‚á‚­‚¦‚ñ
+‚±‚Ä‚¢‚¿‚傤
+‚½‚Ë‚ñ
+‚Ù‚ñ‚Ç‚¤
+‚Ú‚¿
+‚Ó‚ñ‚¢‚«
+‚ê‚ñ‚À‚イ
+‚悤‚¦‚«
+‚­‚Á‚¹‚‚è‚Â
+‚µ‚Á‚«
+‚¤‚¡‚ñ‚Ç
+‚é[‚Ó
+‚Ë‚ñ‚ª‚­
+‚²‚³‚ñ
+‚½‚æ‚è
+‚³‚Ä‚Â
+‚³‚­‚µ‚©
+‚Í‚ë‚°‚ñ
+‚­‚ë
+‚¨‚¨‚ä‚«
+‚ЂƂǂ¨‚è
+‚Ç‚ë‚Ý‚¸
+‚Ó‚µ‚ñ‚É‚ñ
+‚ ‚Ü
+‚©‚¢‚¹‚¢‚ ‚ñ
+‚©‚¿‚傤
+‚Ђñ‚µ‚ã
+‚¨‚¨‚­‚ç
+‚«‚傤‚«‚イ‚°‚ñ
+‚»‚¤‚ª‚­
+‚ê‚ñ‚½‚ñ
+‚¶‚­
+‚Í‚ñ‚°‚µ‚傤
+‚ ‚Æ‚©‚½
+‚µ‚¯‚ñ‚¶‚å
+‚²‚·‚¤
+‚¨‚à‚¢‚«‚è
+‚¶‚サ
+‚É‚µ
+‚½‚ñ‚¶‚¶‚Â
+‚È‚®‚³‚ß
+‚©‚à‚ß
+‚Ó‚Ÿ‚¢‚Ô
+‚낤‚É‚á‚­‚È‚ñ‚É
+‚¢‚µ‚¾‚ñ
+‚ ‚Ü‚®
+‚µ‚傤‚¿‚­‚΂¢
+‚Ù‚Æ‚¯
+‚´‚¢
+‚ ‚è
+‚©‚¢‚ß‚¢
+‚¦‚Á‚­‚·‚¹‚ñ
+‚¯‚т傤
+ƒ^
+‚¤‚ê‚Á‚±
+‚¢‚ñ‚Ç‚µ‚È
+‚¨‚₱‚¤‚±‚¤
+‚Ä‚ñ‚Ñ‚ñ
+‚Ù‚»‚Ý
+‚Þ‚°‚ñ‚¾‚¢
+‚·‚¦‚Ђ낪‚è
+‚¯‚¢‚©‚­‚µ‚Â
+‚±‚¤‚½‚¢‚µ
+‚·‚È‚Í‚Ü
+‚µ‚ã‚Æ
+‚¬‚傤‚¬
+‚Ђ¾‚è‚Ü‚¦
+‚ ‚¸‚³
+‚¤‚¶‚±
+‚µ‚å‚Ô‚Á‚©
+‚‚݂½‚Ä‚«‚ñ
+‚¢‚¦‚ë[
+‚à‚¿‚ ‚¶
+‚ ‚Ü‚´‚¯
+‚Ñ‚ª‚Á‚©
+‚µ‚à‚Ó‚è
+‚ª‚¢‚±‚¤‚¢‚ñ
+‚ ‚¢‚±‚ñ
+‚¦‚ñ‚Æ‚¤
+‚©‚킬‚µ
+‚ë‚Ä‚ñ‚µ‚傤
+‚«‚傤‚½‚­‚«‚ñ
+‚¿‚傤‚¯‚¢
+‚©‚°‚«
+‚Ú‚¤‚Ó‚¤‚¤
+‚©‚ñ
+‚¿‚傤‚«
+‚»‚±‚À‚©‚ç
+‚Ô‚µ‚ã
+‚µ‚ã‚Á‚µ‚ñ
+‚Æ‚¤‚Ð
+‚È‚©‚É‚í
+‚¶‚‚í
+‚¿‚傤‚µ
+‚»‚­‚Ç
+‚©‚¢‚Ä‚ñ‚«
+‚É‚¿‚¨‚¤
+‚°‚ñ‚´‚¢
+‚Ó‚Ÿ[‚·‚Æ
+‚Ú‚¾‚¢
+‚«‚¬‚傤‚½‚¢
+‚«‚傤‚¿‚傤
+‚»‚µ‚Â
+‚Ì‚â‚«
+‚¢‚¿‚¶‚ñ
+‚Ö‚é‚Â
+‚µ‚ñ‚«‚å‚­
+‚¹‚ñ‚Å‚ñ‚«‚å‚­
+‚»‚¤‚­
+‚т傤‚¢‚ñ
+‚ ‚Á‚¿‚á‚ñ
+‚³‚ñ‚¾‚¢
+‚©‚ñ‚䂤
+‚Ç‚¤‚´‚ñ
+‚¨‚â‚Ó‚±‚¤
+‚®‚à‚ñ
+‚è‚«‚Ä‚ñ
+‚«‚å‚­‚È‚¢
+‚¨‚Ñ‚¶‚ß
+‚·‚Ä‚ª‚Ë
+‚æ‚­‚°‚Â
+‚°‚«
+‚¿‚イ‚΂ñ
+‚ª‚¢‚è‚å‚­
+‚Ú‚¤‚±‚­
+‚±‚Æ‚¤
+‚¼‚¤‚Ö‚¢‚«‚å‚­
+‚Å‚ñ‚µ‚±‚¤‚ª‚­
+‚Ó‚¤‚Ú‚¤
+‚´‚ñ‚Ï‚ñ
+‚â‚é‚«
+‚Ù‚ñ‚Ä‚ñ
+‚Å‚à‚Ì
+‚±‚­‚Ú‚¤
+‚«‚Ç‚¤
+‚ ‚Æ
+‚·‚¿‚ã‚í[‚Å‚·
+‚©‚Æ‚Ä‚«
+‚ ‚©‚µ‚¨
+‚©‚¢‚͂‚©
+‚Ȃ邱
+‚Í‚ñ‚¿‚イ
+‚¦‚ñ‚Þ
+‚¨‚¨‚º‚«
+‚ ‚ç‚È‚Ý
+‚µ‚µ‚傤
+‚¿‚イ‚½‚¢
+‚±‚¤‚ª‚ñ
+‚ ‚È‚½
+‚¹‚¢‚Å‚ñ
+‚µ‚³‚ñ‚©
+‚΂­‚â‚­
+‚©‚±‚¤‚¿
+‚¦‚«‚¶‚傤
+‚â‚æ‚¢
+‚¿‚イ‚µ‚ñ‚Ä‚ñ
+‚è‚傤‚¦‚ñ
+‚·‚¸‚ß
+‚Ù‚Ç‚È‚­
+‚ß‚¢‚Æ‚­
+‚­‚¤‚¢‚«
+‚½‚¢‚·‚¢
+‚Ù‚¤‚à‚ñ‚¬
+‚¤‚è‚Ë
+‚ä‚É‚Á‚Æ
+‚«‚Ì‚¤
+‚µ‚‚ª‚¢
+‚Í‚¿‚¤‚¦
+‚©‚ñ‚è‚á‚­
+‚Ì‚¤‚¶‚イ‚¢
+‚¢‚è‚ ‚¢‚¯‚ñ
+‚»‚Î
+‚´‚¢‚©‚¢
+ƒZ
+‚¯‚¿‚á‚Á‚Õ
+‚Ä‚Â
+‚ӂ䂬
+‚©‚½‚¤‚Å
+‚µ‚á‚Ä‚«
+‚Ù‚¯‚Â
+‚ª‚Á‚«‚イ
+‚©‚Á‚«‚傤
+‚«‚イ‚ê‚«
+‚Ó‚³
+‚Ç‚¤‚³‚ñ
+‚Ô‚ñ‚µ‚ñ
+‚Æ‚µ‚ñ
+‚µ‚à‚Ä
+‚ ‚Ó‚½
+‚µ‚Ù‚ñ‚©
+‚¶‚債‚¾‚¢
+‚Ý‚á‚­‚Í‚­
+‚ª‚ç‚·
+‚Æ‚è‚É‚­
+‚É‚¶‚©‚¢
+‚©‚Ì‚±
+‚°‚ñ‚²
+‚ç[‚ß‚ñ
+‚·‚¤‚¶‚イ
+‚Ô‚ñ‚µ‚債‚Â
+‚¢‚Ê
+‚º‚ñ‚Ô‚ñ
+‚¤‚¿‚Ü‚²
+‚΂¹‚¢
+‚΂¢‚¤‚º‚ñ‚¹‚ñ
+‚悤‚¯‚ñ
+‚©‚¨‚©‚½‚¿
+‚₳‚¢
+‚¨‚Æ‚è‚Í‚©‚ç‚¢
+‚Ú‚¤‚·‚¢
+‚©‚Ë‚Ü‚í‚è
+‚¿‚æ
+‚¢‚ñ‚·‚Æ‚ç‚­‚½
+‚¿‚ã[‚¢‚ñ‚ª‚Þ
+‚¢‚ª‚Á‚©
+‚ ‚­‚ß‚¢
+‚¢‚Ê‚¢
+‚»‚Ü‚Â
+‚Ê‚­‚à‚è
+‚«‚Í‚ñ
+‚Í‚­‚µ‚á‚­
+‚Ç‚Á‚¿
+‚©‚½‚ª‚Ý
+‚É‚ ‚‚©‚¢
+‚­‚¤‚¿‚イ
+‚Ђñ‚Õ
+‚ª‚Á‚«
+‚Ȃ‚ӂ­
+‚¹‚­‚µ‚å‚ñ
+‚Ô[‚Þ
+‚µ‚ñ‚Ç‚ë[‚Þ
+‚¤‚«‚Ô‚­‚ë
+‚©‚µ‚Ü
+‚¨‚ ‚µ‚·
+‚Í‚È‚¼‚Ì
+‚²‚¶‚Â
+‚¢‚ê‚¢
+‚«‚イ‚µ‚«
+‚µ‚ñ‚«‚¶‚­
+‚¶‚È‚ñ
+‚Ђ݂Â
+‚ª‚¢‚낶‚ã
+‚΂­‚¾‚ñ
+‚Ȃ‚à‚Ì
+‚³‚Î
+‚Å‚ñ‚Ç‚¤
+‚±‚Æ
+‚ê‚¢‚«‚ñ
+‚È‚¢‚ë‚ñ
+‚³‚©‚Î
+‚È‚×
+‚¤‚¯‚Æ‚è
+‚´‚ñ‚æ
+‚ª‚ñ‚µ‚å‚­
+‚Ó‚µ
+‚·‚Æ‚ë‚ׂè[
+‚µ‚å‚䂤‚¿
+‚³‚¢‚Ó
+‚Ù‚ñ‚©‚ñ
+‚¨‚©‚ñ
+‚è‚å‚­‚¿‚½‚¢
+‚Ç‚è‚傤‚±‚¤
+‚Å‚ñ‚¿‚イ
+‚ЂƂ·‚¶
+‚‚肹‚ñ
+‚·‚¤‚µ‚ã‚é‚¢
+‚¢‚¿‚Ô‚µ‚¶‚イ
+‚è‚傤‚¶
+‚­‚ñ‚µ‚ã
+‚«‚à‚¤
+‚µ‚à
+‚³‚¢‚±‚¤
+‚³‚¢‚ɂイ
+‚²‚¿‚»‚¤
+‚Ö‚Á‚¾
+‚©‚ñ‚¶‚¿‚傤
+‚«‚イ‚µ‚ã
+‚²‚­‚¶‚傤
+‚¨‚Ì
+‚¿‚å‚­‚º‚ñ
+‚½‚¢‚»‚­
+‚¨‚ꂹ‚ñ
+‚¶‚ã‚ñ‚¿‚傤
+‚¾‚­‚¨‚ñ
+‚»‚¯‚Á‚Æ
+‚©‚¢‚¹‚‚µ‚á
+‚Í‚é‚©‚º
+‚䂤‚ß‚¢‚¶‚ñ
+‚¨‚¤‚ׂ¢
+‚ç‚Á‚©[
+‚¨‚¤‚¿‚傤
+‚Ì‚¤‚Ü‚­‚¦‚ñ
+‚«‚傤‚³‚ñ
+‚©‚ñ‚È
+‚½‚ñ‚Ï‚­
+‚«‚傤‚µ‚ñ
+‚¼‚¤‚¯‚¢
+‚«‚ ‚¢
+‚ ‚¢‚ë‚ñ
+‚ê‚¢‚Ó‚¶‚ñ
+‚´‚Á‚µ‚イ‚ɂイ
+‚¢‚µ‚å‚­‚¶‚イ
+‚©‚ñ‚°‚«
+‚ª‚­‚¹‚¢
+‚Ó‚ê‚«‚µ‚Ô‚é
+‚ ‚É‚ß[‚µ‚å‚ñ
+‚²‚±‚¤‚ç‚ñ
+‚·‚¢‚悤‚Ñ
+‚¿‚イ‚¢
+‚¢‚Á‚Æ‚¤
+‚º‚¢‚è‚Â
+‚Ñ‚·‚¢
+‚¢‚¿‚È‚ñ
+‚Ö‚¢‚«‚ñ‚Ä‚ñ
+‚Ђ±‚¤‚©‚¢
+‚Ó‚ç‚ñ‚­
+‚т傤‚¹‚¢
+‚ß‚ë‚ñ
+‚±‚ñ‚Î[‚Æ
+‚¢‚Á‚³‚­‚Ë‚ñ
+‚²‚©‚Ä‚¢
+‚¿‚Æ‚¹
+‚±‚ñ‚Ø
+‚«‚Ó‚¤
+‚¯‚ñ‚¹‚‚¾‚¢‚¶‚ñ
+‚©‚è‚¢‚ê‚«‚ñ
+‚³‚¢‚Ä‚ñ
+‚É‚¹‚¢
+‚©[‚Æ‚ñ
+‚³‚ñ‚¿
+‚©‚º‚Æ‚¨‚µ
+‚¤‚È‚¶
+‚‚¢‚·‚Æ
+‚³‚©‚¦
+‚«‚«‚¢‚Á‚Ï‚Â
+‚¹‚ñ‚²‚­
+‚È‚Ì‚©
+‚¦‚ñ‚Ø‚ñ
+‚ ‚ñ‚Ø‚ 
+‚º‚ñ‚Í‚ñ
+‚«‚ñ‚©‚¬‚å‚­‚¶‚å
+‚ ‚ç‚·‚¶
+‚³‚ñ‚â
+‚¶‚Ç‚¤
+‚¿‚¬‚ñ
+‚¨‚»‚Ü‚«
+‚Æ‚è‚Ô‚ñ
+‚¨‚¤‚Þ
+‚¯‚¢‚Ä‚¢
+‚©‚ñ‚Ì‚ñ
+‚¯‚Á‚Ä‚ñ
+‚¶‚ñ‚Ô‚ñ‚ª‚­
+‚È‚É
+‚µ‚傤‚¿‚イ
+‚²‚¶‚イ
+‚µ‚債‚傤
+‚µ‚²‚­
+‚³‚­‚Æ‚¤
+‚³‚Ú‚¤
+‚«‚ß‚¢
+‚Ô‚ñ‚Ü‚Â
+‚É‚Æ
+‚ ‚­‚¹‚³‚è
+‚©‚²‚ñ
+‚é‚Ë‚Á‚³‚ñ‚·
+‚Ë‚ñ‚°‚ñ
+‚Ë‚¢‚ë
+‚«‚«‚イ
+‚µ‚ª
+‚Í‚¢‚®‚¤‚µ‚á
+‚Í‚Ä
+‚µ‚¨‚¶
+‚«‚傤‚¢‚ñ
+‚¶‚傤
+‚ЂԂñ
+‚¢‚ñ‚³‚‚µ‚å
+‚±‚Ä‚ñ
+‚·‚¢‚è‚­
+‚ӂ낤
+‚µ‚á‚©‚¢
+‚ ‚©‚è
+‚µ‚ã‚ЂÂ
+‚¹‚‚¾‚ñ‚«
+‚½‚¢‚Ä‚«
+‚µ‚´‚¢‚©
+‚¶‚«‚å‚­
+‚«‚¹‚¢
+‚Æ‚¤‚¹‚ñ‚µ‚á
+‚Ý‚Ì‚¤
+‚ê‚¢‚¬
+‚«‚å‚©
+‚Ý‚³‚¨
+‚Ó‚è‚©‚½
+‚¬‚傤‚³‚¢
+‚µ‚ñ‚悤‚¶‚傤
+‚ ‚í[
+‚½‚´‚ñ‚Ì‚¢‚µ
+‚µ‚Ë‚Ü
+‚¿‚傤‚Ђ傤
+‚¨[‚Æ
+‚±‚ê‚¢‚¶‚傤
+‚ЂÁ‚Æ‚¤‚µ‚á
+‚¯‚¢‚±‚­
+‚½‚ß‚Ä
+‚Ä‚Á‚‚¢
+‚³‚½[‚ñ
+‚¶‚イ‚É‚µ‚¿‚傤
+‚©‚´‚ñ‚½‚¢
+‚½‚ñ
+‚±‚¤‚Ó‚¤
+‚ß‚»‚Á‚Ç
+‚±‚¤‚â‚­‚·‚¤
+‚·‚Ä[‚½‚·
+‚Ä‚ñ‚ß‚¢
+‚½‚¢‚Ö‚¢‚悤
+‚¯‚¢‚³‚ñ‚µ‚å
+‚±‚­‚Ç‚¤
+‚ ‚Ü‚Ý‚¸
+‚µ‚傤‚Ђº‚¢
+‚¢‚¿‚¶
+‚Ô‚©‚¢
+‚΂Á‚Ä‚ñ
+‚±‚‚¸‚¢
+‚Ä‚¢‚µ‚å‚­
+‚¢‚µ‚Â
+‚­‚¢‚Á‚­
+‚¶‚ñ‚¯‚ñ
+‚µ‚ã‚ñ‚¹‚Â
+‚­[‚Å‚½
+‚¢‚¿‚°‚ñ‚±‚¶
+‚¹‚¢‚ç‚¢
+‚Ö‚¢‚Ú‚ñ
+‚¯‚µ‚«
+‚Ç‚¤‚µ‚å
+‚¹‚«‚¿‚ñ
+‚³‚ñ‚è‚ñ‚µ‚á
+‚Í‚È‚ª‚½
+‚µ‚ã‚ñ‚¦‚¢
+‚Ԃ‚®‚â
+‚±‚¤‚Ù
+‚µ‚¿‚傤‚©‚­
+‚©‚Á‚¹‚¢‚½‚ñ
+‚è‚à[‚Æ
+‚»‚Ý‚Â
+‚¢‚Á‚µ‚イ‚«
+‚ ‚‚ª‚Ý
+‚©‚»‚¿
+‚‚ނ¬
+‚«‚å‚­‚µ‚å
+‚©‚¢‚΂µ‚ç
+‚·‚¢‚Ô‚ñ
+‚µ‚傤‚ª‚¢‚©
+‚½‚©
+‚¹‚‚°‚ñ
+‚¦‚è‚­‚Ñ
+‚·‚Þ[‚¸
+‚±[‚Ð[
+‚³‚µ‚³‚í‚è
+‚µ‚ñ‚ç‚¢
+‚Ђ₭
+‚«‚イ‚³‚­
+‚é‚¢‚¶
+‚¬‚á‚ç‚è
+‚³‚­‚µ
+‚¤‚¦‚·‚½‚ñ
+‚¶‚á‚΂ç
+‚±‚ñ‚¶‚á‚­
+‚¹‚ñ‚è
+‚«‚イ‚¶‚Â
+‚©‚ç‚©‚Ý
+‚µ‚‚¶‚Â
+‚½‚·‚¤
+‚¾‚¢‚¶
+‚¢‚µ‚傤
+‚Ý‚¿‚·‚¶
+‚³‚¬‚傤‚Ó‚­
+‚³‚¢‚ ‚­
+‚Ƃ肨
+‚¯‚ñ‚«‚イ‚µ‚å
+‚¦‚ñ‚µ‚イ
+‚©‚ñ‚¾‚ñ‚¯‚¢
+‚º‚ñ‚±‚ñ
+‚¶‚ñ‚Ý‚ñ
+‚«‚傤‚Ó‚¤
+‚©‚¢‚«‚ñ
+‚µ‚Ⴚ
+‚¹‚«‚¿‚イ
+‚Ђé‚Ü
+‚¤‚ß
+‚±‚ñ‚¹‚Â
+‚³‚Á‚©[
+‚³‚¢‚«‚ñ
+‚«‚ñ‚Ù‚ñ‚¢
+‚ß‚©‚É‚¸‚Þ
+‚©‚ɂイ‚µ‚á
+‚¹‚¢‚䂤
+‚ª‚ç‚ ‚«
+‚¦‚¢‚«‚イ
+‚Ò‚ñ‚¿
+‚Ö‚ñ‚Ò‚ñ‚è‚Â
+‚悤‚Ä‚ñ
+‚à‚ñ‚ß
+‚¢‚Ђ傤
+‚¢‚½‚¾‚«
+‚à‚Á‚©
+‚©[‚Ç
+‚­‚à‚Â
+‚¢‚ê‚¿‚ª‚¢
+‚»‚­
+‚º‚ë
+‚«‚ ‚‚¯‚¢
+‚à‚¤‚Ó
+‚±‚ ‚ç
+‚Ó‚¶‚債
+‚¾‚Ý[
+‚¢‚Á‚©
+‚Ë‚ñ‚µ‚イ
+‚Ê‚·‚Ý
+‚Ó‚±‚­
+‚¢‚Å‚ñ‚µ
+‚¿‚»‚¤
+‚©‚¢‚µ‚ã‚ñ
+‚Ô‚ñ‚²
+‚­‚¿‚傤
+‚Æ‚¤‚´
+‚Þ‚¶‚Â
+‚è‚イ‚½‚¢
+‚¦‚ñ‚¹‚«
+‚»‚¤‚Æ‚­
+‚Ä‚ñ‚«‚æ‚Ù‚¤
+‚¢‚ç‚¢‚É‚ñ
+‚¦‚¢‚킶‚Ä‚ñ
+‚Ù‚Ë‚®‚Ý
+‚¢‚ꂬ‚ã‚ç[
+‚½‚­‚¶‚¶‚å
+‚¤‚ñ‚»‚¤‚Ð
+‚ ‚­‚ë‚΂Á‚Æ
+‚è‚イ‚±‚¤‚²
+‚­‚¤‚Ù‚¤
+‚ ‚­‚ë
+‚²‚³‚¢
+‚µ‚å[
+‚Ê‚¯‚Ý‚¿
+‚­‚‚Ăñ
+‚·‚¤‚©‚µ‚å
+‚µ‚傤‚¦‚˂邬
+‚æ‚Ý‚©‚½
+‚¶‚¹‚«
+‚Æ‚Ù‚¤
+‚æ‚­‚µ‚イ
+‚¹‚Æ‚¬‚í
+‚Æ‚¤‚¶‚«
+‚«‚©
+‚µ‚¬‚傤
+‚Ü‚¦‚Î
+‚¹‚ñ‚Ò
+‚·‚¤‚©‚¢
+‚Í‚¶‚ß
+‚ЂÓ
+‚¢‚‚í
+‚®‚ñ‚¢
+‚Ó‚ä‚â‚·‚Ý
+‚Õ‚ë
+‚µ‚¾‚ê
+‚µ‚ã‚Á‚µ‚ñ‚¿
+‚¦‚±[
+‚ЂƂ½‚¿
+‚±‚¤‚»‚­‚Ç‚¤‚ë
+‚½‚Ç
+‚ä‚»‚¤‚µ‚á
+‚Å‚¡‚¹‚ñ‚Î[
+‚½‚µ‚å
+‚©‚¢‚»
+‚¯‚¢‚悤
+‚©‚ñ‚«‚ñ
+‚¨‚ЂƂ悵
+‚¤‚Ý‚Ì‚¨‚â
+‚¦‚ñ‚³‚¢‚­‚ë‚Ø‚Å
+‚±‚¤‚¤‚ñ
+‚è‚ñ‚»‚ñ
+‚Ñ‚Ú‚¤‚ë‚­
+‚¦‚ ‚±‚ñ
+‚¹‚ñ‚è‚å‚­
+‚µ‚ã‚ç‚Î
+‚Ñ‚è‚イ
+‚¾‚¢‚¢‚¿‚¢‚ñ‚µ‚å
+‚«‚å‚悤‚è‚傤
+‚©‚ñ‚µ‚«
+‚Í‚¢‚µ‚á
+‚¹‚¢‚¨‚¤
+‚ʂ肦
+‚ ‚Ü‚¶‚¨
+‚‚Ì
+‚É‚Ù‚ñ‚΂ê
+‚¶‚á‚Ï‚É[‚¸
+‚¢‚ñ‚Ó‚ê
+‚Æ‚¤‚¢‚»‚­‚݂傤
+‚ß‚¢‚±‚¤
+‚©‚±‚¤‚¬‚傤
+‚½‚¨‚é
+‚Ä‚ñ‚Ø‚ñ‚¿‚¢
+‚¾‚ñ‚Å‚¡
+‚¨‚ñ‚Ç‚¯‚¢
+‚¹‚ñ‚Å‚ñ‚©
+‚¯‚‚܂­‚¦‚ñ
+‚©‚¢‚ç‚­
+‚«‚Î
+‚©‚­‚¨‚Ñ
+‚¶‚²‚¤‚¶‚Æ‚­
+‚«‚ñ‚낤‚ª‚©‚è
+‚¦‚¢‚¬
+‚ ‚Ë‚Á‚½‚¢
+‚«‚債‚å
+‚΂ñ
+‚Æ‚Á‚Ï‚ñ
+‚«‚Ý‚Â
+‚É‚í‚«
+‚܂‚¶‚Â
+‚¤‚Ä‚ñ
+‚µ‚å‚­‚É‚­
+‚«‚傤‚¹‚¢
+‚³‚ä
+‚·‚Ä‚ñ‚ê‚·
+‚µ‚傤‚¶‚å
+‚Ú‚ñ‚­‚ê
+‚«‚¹‚‚ӂ¤
+‚«‚¶‚ã‚Â
+‚ª‚­‚ê‚¢
+‚É‚ñ‚Ä‚¢‚µ‚傤
+‚悤‚Ó‚¤
+‚·‚¢‚µ‚ñ
+‚Ý‚·‚Ä‚è[
+‚¬‚»‚­
+‚ª‚¢‚ë
+‚¶‚å‚«‚傤‚¶‚ã
+‚È‚ñ‚¶
+‚Ђ傤‚Ì‚¤
+‚¢‚¯‚΂È
+‚ ‚­‚¹‚³‚è[
+‚«‚å‚©‚ñ
+‚«‚ñ‚Î
+‚¦[
+‚í‚¢‚è‚Â
+‚¾‚»‚­
+‚½‚ñ‚¹‚¢‚Ç
+‚Æ‚Á‚½‚ñ
+‚¨‚¤‚¹‚‚µ‚Â
+‚¹‚ñ‚䂤‚è‚Â
+‚¬‚å‚ß‚¢
+‚³[‚Ô
+‚炶‚©‚é
+‚¿‚イ‚«
+‚¾‚¢‚µ‚傤
+‚³‚¢‚µ‚å
+‚¤‚ë
+‚©‚¯‚Æ‚è
+‚·‚¢‚³‚ñ‚¯‚¢
+‚Ù‚¤‚ª‚­
+‚©‚ç‚ß‚Ä
+‚È‚©‚Ü
+‚±‚¤‚¹‚Â
+‚¹‚ñ‚ׂñ
+‚¾‚¢‚Ì‚¤
+‚º‚¢‚Þ‚µ‚å
+‚䂤‚¢
+‚¬‚Ù‚ñ
+‚Ù‚ñ‚µ‚イ
+‚µ‚¯‚¢
+‚¯‚¿‚ñ‚Ú‚¤
+‚«‚イ‚©‚´‚ñ
+‚¢‚ë‚Ç‚è
+‚»‚¼‚¤
+‚‚Ú
+‚©‚‚¶
+‚ª‚ñ‚¾[‚ç
+‚µ‚傤‚è‚傤‚¦
+‚»‚ñ‚¼‚­
+‚Ý‚¼‚ê
+‚¦‚ꂪ‚ñ‚Æ
+‚ЂÁ‚¿
+‚Æ‚¤‚µ‚ã
+‚µ‚‚¤
+‚¢‚¢‚©‚½
+‚ׂÁ‚³‚Â
+‚Ó‚­‚³‚ñ‚Ô‚Â
+‚Ó‚¾‚µ‚å
+‚¶‚Ñ‚©
+‚Ú‚Á‚­‚·
+‚«‚ñ‚´‚¢
+‚¿‚Ö‚¢‚¹‚ñ
+‚䂤‚Ñ‚ñ
+‚ç‚ñ‚¹‚ñ
+‚¹‚¢‚¿‚傤‚´‚¢
+‚µ‚ñ‚ë
+‚½‚©‚­
+‚³‚«‚²‚ë
+‚Ý‚Ü‚ñ
+‚¨‚Æ‚±‚Å
+‚©‚¸
+‚©‚¢‚͂‚Ô
+‚悱‚ª‚¨
+‚±‚¤‚½‚¢
+‚¯‚¢‚©‚­‚©
+‚É‚è‚ñ
+‚±‚¤‚Ó
+‚±‚¤‚»‚¤
+‚¯‚ñ‚è‚å
+‚Í‚Ü
+‚µ‚ñ‚â
+‚¶‚傤‚¯‚¢
+‚è‚傾‚ñ
+‚±‚¤‚Ù‚¤‚©
+‚í‚è‚΂µ
+‚¶‚á‚­‚µ‚á
+‚ЂƂ´‚Æ
+‚Õ‚è‚Ü
+‚¨‚¨‚©‚í
+‚¨‚¨‚Æ‚è
+‚²‚ë‚­
+‚ë‚©‚½
+‚µ‚傤‚²‚¤
+‚«‚¶‚á‚­
+‚¤[‚é
+‚½‚¢‚í‚ñ
+‚¤‚·‚©‚í
+‚¹‚¢‚¤‚ñ
+‚©‚Á‚Õ‚­
+‚Ù‚ñ‚¶‚Â
+‚­‚Â
+‚Ô‚¿
+‚ª‚­
+‚¢‚­‚¶
+‚«‚‚˂¢‚ë
+‚³‚Â
+‚¬‚å‚©‚¢
+‚Â
+‚½‚¦‚Ü
+‚±‚¤‚¯‚¢‚µ‚á
+‚Æ‚¤‚Ù‚¤
+‚Ú‚¤‚¦‚«‚µ‚傤
+‚ª‚¢‚Þ
+‚±‚ñ‚©‚ñ
+‚¬‚傤‚Þ‚©
+‚ӂ䂼‚ç
+‚¶‚ñ‚¢‚ñ
+‚¬‚å‚ç‚¢
+‚º‚ñ‚Ë‚ñ‚Ç
+‚¨‚Ä‚ñ
+‚³‚µ‚ ‚µ
+‚µ‚å‚É‚ñ‚«‚イ
+‚Ô‚Á‚¯‚ñ
+‚²‚­‚낤
+‚¢‚æ‚­
+‚¶‚í‚è
+‚«‚¾‚¢
+‚·‚¢‚³‚ñ‚¬‚傤
+‚©‚ñ‚Ç‚¤
+‚©‚­‚µ‚傤
+‚­‚¢‚à‚Ì
+‚Ђµ‚ª‚½
+‚¢‚¢‚È‚è
+‚ª‚ê[‚¶
+‚Ђ΂¢‚Ђñ
+‚¨‚Ü‚²‚³‚ñ
+‚݂傤‚Ý
+‚ [‚¿
+‚©‚ê‚­‚³
+‚«‚¶‚ã
+‚©‚ñ‚È‚¢
+‚¢‚Ý‚µ‚ñ‚¿‚傤
+‚©‚Á‚©‚´‚ñ
+‚«‚ñ‚³‚­
+‚ ‚‚ß
+‚¿‚Ë‚Â
+‚¾‚ñ‚ë
+‚¶‚±
+‚Õ‚ç‚¢‚Ç
+‚ê‚Á‚¹‚¢
+‚©‚ª‚â‚«
+‚Ç‚²‚¤
+‚«‚æ‚Ý‚¸
+‚¨‚½‚Á‚µ
+‚ª‚¢‚©‚­
+‚º‚¢‚¹‚¢
+‚¶‚©‚­
+‚µ‚ã‚Á‚¹‚«‚µ‚á
+‚ ‚‚³
+‚È‚ñ‚Ú‚­
+‚¢‚‚¤
+‚¿‚傤‚悤
+‚µ‚á‚©‚ñ
+‚¿‚傤‚Ô‚ñ
+‚½‚¢‚Þ‚¸
+‚Ó‚½‚Ü
+‚¢‚Á‚µ‚«
+‚Ù‚¤‚Ô‚ñ
+‚Ä‚ñ‚Ü‚Ç
+‚µ‚ñ‚°‚«
+‚ЂႭ‚Ô‚ñ‚è‚Â
+‚¶‚Î
+‚²‚Ö‚¢
+‚«‚傤‚´‚¢
+‚±‚¤‚䂤
+‚í‚é‚­‚¿
+‚·‚è‚é
+‚¦‚ñ‚«
+‚ ‚Ü‚®‚Â
+‚³‚©
+‚³‚ñ‚Ü‚¢
+‚©‚ñ‚¾‚ñ
+‚¤‚¢
+‚¢‚ñ‚®‚ç‚ñ‚Ç
+‚ê‚¢‚¹‚¢
+‚©‚­‚»‚¤
+‚»‚ñ‚Ú‚¤
+‚΂炦‚Ä‚¡
+‚¤‚¡[‚­
+‚‚¿‚¯‚Þ‚è
+‚¨‚­
+‚È‚®‚肱‚Ý
+‚à‚­‚Í‚¢
+‚ª‚¢‚µ‚ñ
+‚©‚ñ‚µ‚ñ
+‚¢‚ñ‚Ă肶‚¥‚ñ‚·
+‚«‚Ù‚¤
+‚¯‚ñ‚Ò
+‚²‚Ù‚¤‚Ë‚ñ
+‚Ä‚¢‚¯‚¢
+‚Ä‚ñ‚¿
+‚¶‚¶‚傤
+‚Æ‚¤‚ɂ傤‚т傤
+‚«‚å‚è
+‚‚¤‚ë
+‚Í‚è‚¢‚½
+‚«‚ñ‚«‚¿‚Ù‚¤
+‚Ó‚È‚â‚Ç
+‚µ‚å‚Ç‚¤
+‚µ‚ë‚´‚¯
+‚¨‚ñ‚µ‚á
+‚±‚­‚¦‚¢
+‚¨‚ñ‚µ‚傤
+‚±‚¢‚µ
+‚¨‚­‚肳‚«
+‚Ä‚«‚µ‚å‚­
+‚©‚¬‚傤
+‚«‚肳‚ß
+‚µ‚Ⴞ‚ñ‚«
+‚ ‚ç‚Ä
+‚²‚ñ‚²‚Ç‚¤‚¾‚ñ
+‚¾‚ñ‚È
+‚è‚傤‚É‚ñ
+‚±‚¤‚©‚ñ‚«
+‚È‚¢‚¿
+‚Þ‚Ë
+‚Ö‚ñ‚¶‚ñ
+‚Õ‚ë‚Ä‚­‚µ‚å‚ñ
+‚‚«‚¾‚Ä
+‚ª‚ñ‚â‚­
+‚¿‚¨‚ñ
+‚½‚ñ‚Æ‚¤
+‚¢‚ñ‚·‚½‚ñ‚Æ
+‚ª‚­‚¹‚«‚Ú
+‚¤‚è‚ ‚°‚¾‚©
+‚µ‚ñ‚µ‚傤‚Ђ‚Î
+‚Ó‚¤‚¼‚­
+‚ä‚Å‚ñ
+‚à‚¤‚¶‚ñ
+‚Þ‚¦‚«
+‚¬‚å‚­‚낤
+‚©‚¢‚¬‚Ð
+‚©‚Ý‚ä‚¢
+‚²[
+‚Å‚¡‚·‚Õ‚ê[
+‚Ù‚¤‚ª‚­‚Ô
+‚³‚µ
+‚Ü‚¢‚Ü‚¢
+‚ ‚炤‚Ý
+‚©‚ç‚Â
+‚¯‚½
+‚í‚ç‚­
+‚©[‚»‚é
+‚¤‚ñ‚»‚¤‚¬‚傤
+‚¤‚·‚Ü‚­
+‚³‚Ó‚Ÿ‚è
+‚È‚¢‚¹‚¢
+‚©‚Ý‚µ‚à
+‚ê[‚é
+‚«‚ñ‚ª‚ñ
+‚¶‚Ú‚¤‚¶‚«
+‚Ñ‚º‚ñ‚â‚«
+‚ ‚Ђé
+‚±‚ñ‚΂ñ‚í
+‚Ç‚»‚­
+‚­‚é[‚´[
+‚Í‚¢‚«‚ñ‚®
+‚ӂ悤‚Ç
+‚¶‚傤‚µ
+‚²‚­‚Ú‚»
+‚µ‚ñ‚ß‚¢
+‚«‚傶‚傤
+‚¨‚¢‚킯
+‚°‚ñ‚»‚¤
+‚ނ炳‚«
+‚«‚¶‚­
+‚³‚¢‚Ë‚ñ‚¿‚傤
+‚Ö‚ñ‚µ‚ã
+‚«‚¸‚ ‚Æ
+‚¾‚Ý‚ñ
+‚¾‚¢‚³‚ñ‚ª‚©‚è
+‚Ó‚½‚Î
+‚¢‚é‚·
+‚¶‚¿‚傤
+‚¹‚«‚µ‚å
+‚ӂ‚Ԃñ
+‚±‚¤‚Ђñ
+‚¹‚ñ‚Æ‚ë‚É‚­‚·
+‚¨‚³‚È‚²
+‚©‚ñ‚½‚¢
+‚µ‚ß‚¢‚©‚ñ
+‚䂤‚¯‚ñ‚µ‚á
+‚ ‚°
+‚‚¬‚Ù
+‚ª‚¢‚¾‚¢
+‚¦‚ë
+‚©‚®
+‚³‚´‚È‚Ý
+‚µ‚ã‚­‚Í‚¢
+‚Ü‚Ë‚¶‚ß‚ñ‚Æ
+‚«‚ª‚Á‚©
+‚¢‚â‚­
+‚µ‚Á‚Õ‚¤
+‚³‚³‚Ý
+‚ª‚µ
+‚ê‚«‚¾‚¢
+‚°[‚¶
+‚΂ç‚ñ‚·
+‚¸‚Ђ傤
+‚©‚݂΂³‚Ý
+‚Ù‚ñ‚݂傤
+‚¦‚Á‚¹‚¢
+‚­‚ñ‚¾‚è
+‚¯‚¢‚·‚¢
+‚¯‚¢
+‚¹‚¢‚Ù
+‚ꂶ
+‚®‚è‚Þ
+‚Ó‚¤‚Ԃ‚µ
+‚Ý
+‚Ä‚ñ‚à‚ñ‚ª‚­
+‚¯‚¢‚é‚¢
+‚¶‚傤‚«‚イ
+‚Ç‚¤‚Ý‚ñ
+‚Ü‚Ù‚¤
+‚±‚­‚Ä‚¢
+‚ê‚¢‚¾‚¢
+‚¤‚Þ
+‚Ó‚à‚ñ
+‚Ù‚³‚«
+‚±‚ª‚Ë
+‚¨[‚·‚Æ‚è‚ 
+‚¯[‚·
+‚Ä‚ñ‚Û
+‚¢‚낪‚Ý
+‚ª‚è‚イ
+‚ ‚킹
+‚ ‚é‚©‚肹‚¢
+‚²‚悤‚«‚«
+‚µ‚ñ‚悤‚¶‚ã
+‚½‚¢‚â
+‚©‚ñ‚²‚­
+‚¢‚â‚Ý
+‚³‚«
+‚è‚債‚イ
+‚Å‚ñ‚¦‚ñ
+‚«‚ñ‚¯‚¢
+‚¯‚¢‚µ
+‚µ‚©‚¯
+‚ɂ킳‚«
+‚µ‚«‚©
+‚©‚·‚¶‚é
+‚è‚Ó‚§[‚Þ
+‚¢‚ñ‚Ä‚è
+‚à‚Ì‚í‚©‚è
+‚«‚‚¦‚ñ‚®
+‚Ù‚¤‚¿‚±‚­
+‚©‚½‚Ä‚¨‚¿
+‚è‚イ‚©‚ñ
+‚©‚à‚ñ
+‚Ó‚Æ‚¤‚²‚¤
+‚±‚Ü‚¬‚ê
+‚¹‚ñ‚Þ
+‚Ù‚Ì‚¨
+‚Ó‚³‚¢
+‚Ë‚ä‚«
+‚µ‚イ‚Ü‚Â
+‚µ‚ç‚Ó
+‚´‚¬‚傤
+‚Ä‚ñ‚¶‚ã
+‚µ‚ñ‚Ò‚Â
+‚«‚á‚Á‚±‚¤
+‚¶‚ñ‚Ç‚¤
+‚±‚¤‚䂤‚è‚ñ
+‚¶‚傤‚Í‚ñ‚µ‚ñ
+‚Ä‚¢‚µ‚á‚Î
+‚Ú‚¤‚­‚¤
+‚µ‚ã‚­‚µ‚ã
+‚¨[‚Å‚¡‚¨
+‚Ó‚§[‚ñ
+‚«‚ñ‚悤‚Ñ
+‚µ‚傤‚Æ‚­
+‚°‚¢‚É‚ñ
+‚¿‚傤‚µ‚á
+‚¶‚²‚¤
+‚Ý‚¿‚µ‚¨
+‚©‚¢‚©
+‚¸
+‚´‚¢‚¹‚¢
+‚½‚©‚ñ
+‚¤‚ñ‚à
+‚΂¯‚Â
+‚Ü‚ ‚¢
+‚Ó‚É‚ñ‚«
+‚¬‚«‚傤‚¾‚¢
+‚º‚ñ‚´
+‚䂤‚Ñ
+‚©‚Æ‚¤
+‚©‚­‚ç‚ñ
+‚¯‚‚º‚¢
+‚Ý‚È‚Æ‚Ü‚¿
+‚©‚í‚©‚º
+‚¨‚ñ‚µ
+‚±‚µ‚Â
+‚Ђ̂ß
+‚¢‚ñ‚µ‚ñ
+‚©‚­‚·‚¢
+‚±‚­‚¶
+‚Ù‚¤‚¬‚ñ
+‚µ‚傤‚¶‚傤
+‚·‚«‚Ü
+‚±‚Þ‚¬‚±
+‚¾‚¢‚É
+‚±[‚Û
+‚½‚¢‚®‚¤
+‚»‚ñ‚Û
+‚½‚Ñ‚¾‚¿
+‚ª‚ë‚ñ
+‚æ‚ñ‚©
+‚Ü‚Ä‚ñ‚낤
+‚º‚ñ‚·‚¤
+‚¢‚ñ‚悤‚Ô‚ñ
+‚Ý‚ã[‚¶‚Á‚­
+‚´‚‚¦‚«
+‚Ú[‚ñ
+‚©‚¢‚µ
+‚Ƃ肽‚Ä
+‚¤‚¿‚イ
+‚µ‚ñ‚»‚±
+‚µ‚傤‚Ä‚ñ
+‚Ï‚é‚Õ
+‚²‚ß‚ñ‚È‚³‚¢
+‚³‚‚¦‚¢‚«
+‚»‚ñ‚²‚¤
+‚ß‚¢‚Ä‚ñ
+‚¿‚å‚­‚¹‚‚Ð
+‚ׂñ‚è
+‚ ‚é‚Ý‚É‚ã[‚Þ
+‚è
+‚Ä‚ñ‚³‚¢
+‚µ‚Í‚Â
+‚ ‚ñ‚¤‚ñ
+‚½‚Á‚µ‚á
+‚µ‚ã‚­‚¦‚ñ
+‚·‚»‚Ì
+‚¶‚¶‚å
+‚Ü‚³‚ä‚ß
+‚©‚è‚イ‚©‚¢
+‚è‚傤‚Ý
+‚±‚­‚¨‚¤
+‚¼‚­‚²
+‚©‚Ó‚¤
+‚È‚¢‚Ô
+‚ׂñ‚Ä‚ñ
+‚º‚¢‚É‚­
+‚»‚â
+‚ß‚¢‚í‚­
+‚䂤‚¶‚傤
+‚¬‚Ý‚ñ
+‚­
+‚ê‚ñ‚²‚¤
+‚»‚¹‚¢
+‚Ù‚¤‚¹‚ñ
+‚©‚΂Ë
+‚Ì‚Ç‚í
+‚¨‚¨‚¹
+‚°‚ñ‚³‚­‚µ‚á
+‚±‚­‚Ä‚¢‚±‚¤‚¦‚ñ
+‚Ä‚¢‚«‚ ‚Â
+‚¹
+‚°‚«‚µ‚å
+‚«‚­‚ñ
+‚ê‚Á‚±‚­
+‚«‚ñ‚䂤‚¬‚傤
+‚©‚¢‚¶
+‚݂傤‚â‚­
+‚»‚¤‚¬
+‚¼‚¤‚©‚è‚Â
+‚ª‚­‚悤
+‚¶‚傤‚¬
+‚¿‚á‚Ì‚ä
+‚ЂƂª‚ç
+‚¦‚ñ‚¯‚¢
+‚Ü‚È‚Þ‚·‚ß
+‚·‚½‚¢‚è‚·‚Æ
+‚䂤‚Æ‚¤‚¹‚¢
+‚Ç‚¤‚¯‚Â
+‚¯‚¢‚»
+‚¨‚ß‚¢
+‚Ó‚È‚ ‚µ
+‚¹‚¢‚µ‚å
+‚¿‚²
+‚¦‚¢‚Ñ‚ñ
+‚©‚­‚µ
+‚Ђ¶‚ã‚Â
+‚ ‚ǂׂñ‚¿‚á
+‚³‚¢‚µ
+‚©‚¿‚イ
+‚È‚º
+‚Æ‚¹‚¢
+‚¨‚¤‚Ç‚¤
+‚«‚å
+‚±‚ñ‚Ñ
+‚©‚Ë‚ñ
+‚¯‚ñ‚è
+ƒI
+‚Í‚¢‚·‚­[‚é
+‚»‚¤‚±‚­
+‚Ü‚Á‚³‚«
+‚¦‚ñ‚Ô‚¶‚傤
+‚¿‚¬‚è
+‚®‚¤‚è‚å‚­
+‚¹‚¢‚¶‚Â
+‚¢‚°‚ñ
+‚«‚µ‚ñ
+‚Ü‚¾‚ç
+‚í‚Á‚Ø‚ñ
+‚¨‚â‚à‚Æ
+‚µ‚ñ‚®
+‚ ‚«‚·
+‚µ‚Ⴜ‚¤
+‚«‚傤‚킹‚¢
+‚ЂႭ‚Ô‚ñ
+‚Í‚È‚Ô‚³
+‚Ë‚±
+‚³‚ñ‚â‚­
+‚Ö‚¢‚è‚å‚­
+‚ª‚­‚®‚ñ
+‚Ԃ‚Ü
+‚¬‚ñ‚±‚¤‚¢‚ñ
+‚¢‚í‚¢‚²‚Æ
+‚±‚­‚Ù
+‚Ó‚Ä‚¢
+‚»‚¤‚Ù‚¤
+‚ ‚­‚â‚­
+‚È‚©‚Ù‚Ç
+‚¿‚©‚²‚ë
+‚낤‚µ
+‚Ý‚Å‚¡‚ ‚Þ
+‚µ‚å‚Þ
+‚ЂƂÝ
+‚Ú‚­‚¶‚イ
+‚ë‚ñ‚®
+‚µ‚傤‚è‚傤
+‚¨‚Ì‚ê
+‚©‚°‚낤
+‚¢‚µ‚¤‚·
+‚«‚©‚ñ‚µ‚á
+‚·‚­‚ç‚Á‚Õ
+‚¦‚ñ‚µ‚å
+‚¹‚ñ‚·‚¢‚©‚ñ
+‚Ç‚­‚»
+‚«‚ñ‚ä
+‚·‚¤‚µ‚«
+‚¶‚¬‚傤‚Ê‚µ
+‚µ‚ñ‚낤
+‚Ó‚Ÿ‚¢‚È‚ñ‚·
+‚¿‚ë‚è‚ ‚ñ
+‚µ‚ñ‚¶‚ã
+‚䂤‚¤‚Â
+‚©‚°
+‚©‚­‚ß‚¢
+‚Ù‚³‚©‚ñ
+‚¶‚イ‚µ‚å‚­
+‚Þ‚¿‚ñ
+‚ ‚µ‚·‚½‚ñ‚Æ
+‚©‚ñ‚±‚¤‚Ö‚ñ
+‚±‚΂é‚Æ
+‚µ‚µ‚ã
+‚»‚º‚¢
+‚¨‚₱
+‚µ‚債‚å
+‚т傤‚ê‚«
+‚©‚½‚Í‚µ
+‚ׂñ‚Þ‚©‚ñ
+‚킽‚µ‚ç
+‚Ç‚¤‚±‚­
+‚±‚¤‚¯‚ñ
+‚à‚ñ‚±
+‚ ‚µ‚Ç‚è
+‚½‚«‚®‚¿
+‚Æ‚­‚³‚­
+‚¦‚Þ
+‚½‚©‚¹
+‚¦‚Ì‚®
+‚µ‚á‚¢
+‚Ü‚ñ‚È‚©
+‚É‚¿‚悤‚Ñ
+‚Ç‚Ì‚±‚Æ
+‚䂹‚¢
+‚Õ‚ç‚ñ
+‚±‚±‚ë‚´‚µ
+‚·‚±‚ 
+‚°‚ñ‚µ‚傤‚è‚Â
+‚ç‚¢‚½
+‚Ë‚Þ‚Ì‚«
+‚µ‚á‚­‚È‚°
+‚³‚ñ‚Æ‚¤
+‚¿‚傤‚³‚â‚­
+‚É‚Á‚©‚Â
+‚­‚¦‚¢
+‚Ý‚«‚í‚ß
+‚©‚­‚µ‚ñ
+‚Æ‚¤‚ª‚炵
+‚©‚µ‚å‚­
+‚à‚Ì‚í‚©‚ê
+‚Ó‚µ‚ã‚Â
+‚µ‚«‚»
+‚¬‚µ
+‚ς邱
+‚Ԃ悤‚¶‚ñ
+‚Ó‚Ÿ‚±‚Þ
+‚¯‚¢‚´‚¢‚©‚¢
+‚Ñ‚Ý
+‚Ó‚Æ‚­
+‚Ô‚È‚¢
+‚䂤‚È‚¬
+‚Ù‚¤‚²‚¤
+‚È‚ñ‚Ë‚ñ
+‚‚Î
+‚¢‚ç‚­
+‚¢‚¢‚¦
+‚È‚¢‚·
+‚±‚µ‚å‚­
+‚Å‚ñ‚©‚¢
+‚«‚ç‚­
+‚¦‚«‚·‚Æ‚ç
+‚¿‚«‚イ
+‚Í‚ñ‚µ‚ã
+‚Ó‚ñ‚Ç‚¤
+‚ª‚­‚ª‚¢
+‚Ä‚¶‚ã‚ñ
+‚т傤‚±‚ñ
+‚³‚È‚¦
+‚È‚ª‚½‚Ñ
+‚½‚¢‚Ô‚Â
+‚ ‚¿‚ç
+‚±‚¤‚³‚Â
+‚¢‚ñ‚¶‚ã‚ñ
+‚â‚Ü‚¯
+‚±‚¤‚Þ‚Ô
+‚Ý‚¿‚Í‚Î
+‚¶‚Á‚½‚¢
+‚µ‚イ‚«‚傤
+‚Ä‚ñ‚¯‚Â
+‚©‚½‚¯
+‚©‚­‚·‚¤
+‚¿‚イ‚¶‚傤
+‚½‚ñ‚µ‚ñ
+‚¶‚ã‚ñ‚Ô‚ñ‚ª‚­
+‚Ä‚ñ‚¶‚ñ
+‚©‚Á‚Õ‚é
+‚»‚Æ‚ª‚í
+‚°‚«‚µ‚å‚­
+‚½‚¢‚«‚¯‚ñ
+‚¬‚傤‚»‚¤
+‚¹‚©‚¢‚À‚イ
+‚Ó‚¤‚Æ‚¤
+‚¶‚ã‚ñ‚Ì‚¤‚¹‚¢
+‚µ‚ª‚Á‚©
+‚è‚Á‚Û‚¤‚½‚¢
+‚²‚Ó
+‚Ù‚¤‚Þ‚Ô
+‚®‚ë‚·
+‚«‚傶‚ñ
+‚¯‚‚¦‚«‚ª‚½
+‚݂傤‚¬
+‚½‚¢‚΂ñ
+‚½‚­‚Ù‚ñ
+‚¦‚ñ‚©‚­
+‚è‚»‚­
+‚¹‚ñ‚¶‚Â
+‚ª
+‚µ‚µ‚ã‚ñ‚«
+‚¶‚傤‚«‚ñ
+‚¨‚à‚µ‚ë
+‚ª‚ñ‚µ‚傤
+‚¿‚ã[‚Î
+‚©‚µ‚¨‚µ‚Ú‚è
+‚悤‚·‚¢
+‚º‚ñ‚©‚¢
+‚è‚傤‚¯‚ñ
+‚«[
+‚º‚¢‚è
+‚Ђ‚¶
+‚Ä‚«‚²‚¤‚è‚Â
+‚Ì‚¤‚è‚å‚­
+‚Í‚«‚¯
+‚±‚¤‚«‚傤‚ª‚­
+‚±‚ñ‚»[‚é
+‚È‚²‚è
+‚±‚Ý‚Ý
+‚¿‚ñ‚«‚ñ
+‚©‚ñ‚³‚¢‚¿‚Ù‚¤
+‚¨‚Ä‚Ü‚¦
+‚¤‚Å
+‚¶‚傤‚¶‚ñ
+‚Í‚­‚Ç‚¤
+‚¢‚¿‚Ë‚ñ‚¹‚¢
+‚µ‚ã‚ñ‚Æ‚¤
+‚Ó‚¤‚Ђ傤
+‚ ‚½‚Ü‚«‚ñ
+‚´‚¢‚Þ‚©
+‚©‚肱‚µ
+‚Õ‚è‚ñ
+‚È‚ñ‚É‚ñ
+‚΂¢‚ ‚·
+‚©‚Æ‚­
+‚©‚Ý
+‚±‚µ‚½‚ñ‚½‚ñ
+‚¾‚¢‚à‚ñ‚¶
+‚à‚ñ‚º‚ñ
+‚¢‚Ü‚¶‚Ë[‚µ‚å‚ñ
+‚Ó‚¢
+‚½‚à‚¤‚³‚­
+‚ª[‚è‚Á‚­
+‚±‚ë‚È
+‚µ‚傤‚¯‚ñ‚©
+‚»‚ç
+‚±‚ñ‚­‚è[‚Æ
+‚Ô‚¢
+‚º‚ñ‚¶
+‚¿‚傤‚¼‚¤
+‚ª‚´‚¢
+‚¾‚ñ‚Ø‚ñ
+‚«‚傤‚«
+‚³‚ñ‚Ñ
+‚³‚«‚Ù‚Ç
+‚Ђ‚悤‚ ‚­
+‚´‚ª‚Ë
+‚±‚ñ‚¾‚ĂЂ傤
+‚½[‚Æ‚é
+‚¹‚Á‚¿‚á‚­‚´‚¢
+‚¦‚¢‚±
+‚¹‚«‚ã‚è‚Ä‚¡
+‚Ò[‚È‚Á‚Â
+‚¿‚Ö‚¢
+‚Ù‚¤‚낤
+‚¢‚½‚é
+‚¹‚¢‚ª‚­‚©
+‚¹‚¢‚µ‚á‚¢‚ñ
+‚²‚¤‚¹‚Â
+‚¨‚ñ‚Ñ‚ñ
+‚È‚ñ‚°‚ñ
+‚µ‚á‚­‚¢
+‚Ä‚«‚ê‚¢
+‚«‚å‚­
+‚È‚¢‚¦‚ñ
+‚±‚Á‚«
+‚Ó‚µ‚傤‚µ‚á
+‚©‚¢‚è‚«
+‚É‚»‚¤
+‚µ‚º‚ñ‚·‚¤
+‚µ‚ñ‚Ò
+‚±‚©‚ñ
+‚¯‚¢‚Ù‚¤‚«
+‚Ç‚ë
+‚©‚ê‚¢
+‚°‚µ
+‚½‚Á‚¹‚¢‚è‚Â
+‚¹‚ñ‚Ä‚ñ
+‚©
+‚±‚¤‚µ‚Ⴓ‚¢
+‚«‚»‚­
+‚ª‚Á‚­
+‚±‚¤‚‚¤‚à‚¤
+‚Æ‚¢
+‚º‚ñ‚´‚¢
+‚¿‚¯‚Á‚Æ
+‚³‚ñ‚Ò
+‚©‚­‚è‚傤
+‚±‚ñ‚É‚¿‚í
+‚±‚¤‚è‚å‚­
+‚µ‚è‚イ
+‚悤‚·‚¢‚ë
+‚¶‚ã‚ç‚é‚Ý‚ñ
+‚à‚¤‚µ‚Ô‚ñ
+‚¢‚©‚¢‚悤
+‚©‚¨‚­
+‚«‚¸‚®‚¿
+‚¹‚ñ‚ނƂ肵‚Ü‚è
+‚¢‚Á‚Û‚ñ
+‚©‚ª‚­‚µ‚á
+‚è‚傤‚Ç
+‚¶‚Á‚Õ
+‚³‚ñ‚¯
+‚¢‚Á‚Ï
+‚µ‚¯‚ñ‚Ô
+‚æ‚Ë‚ñ
+‚悹‚È‚×
+‚°‚ñ‚¦‚¢
+‚í‚©‚Ý‚¸
+‚É‚ñ‚Õ
+‚낤‚²
+‚ß‚©‚¯
+‚­‚è‚°
+‚Ä‚¿‚傤
+‚í‚¢‚Ó
+‚±‚¤‚¹‚¢‚Ô‚Á‚µ‚Â
+‚µ‚©‚½
+‚í‚ç‚΂ñ‚µ
+‚¤‚ç‚Ú‚ñ
+‚¯‚ñ‚µ‚イ‚ª‚©‚è
+‚«‚Á‚¿‚ñ
+‚¶‚ã‚ñ‚Ï‚­
+‚½‚¶‚イ
+‚È‚¢‚䂤
+‚«‚±‚Â
+‚Ù‚ñ‚¶‚ñ
+‚¾‚µ‚Ë
+‚΂¢‚¤
+‚º‚Á‚¹‚¢
+‚°‚«‚¾‚ñ
+‚Þ‚µ‚¸
+‚Ђ낢‚à‚Ì
+‚±‚­‚º‚¢‚¿‚傤
+‚ ‚©‚µ‚ñ‚²‚¤
+‚»‚ñ‚è‚å
+‚½‚¢‚é
+‚¿‚傤‚Ä‚ñ
+‚Õ‚Á‚Æ
+‚ä‚«‚Ç‚¯
+‚¢‚­
+‚«‚΂­
+‚­‚Ð
+‚Ù‚ñ‚¿‚傤
+‚©‚ñ‚±‚ñ‚»‚¤‚³‚¢
+‚낤‚Æ
+‚Í‚È‚²‚¦
+‚Æ‚Ç‚ë‚«
+‚É‚µ‚¶‚ñ
+‚³‚ë‚ñ
+‚Ý‚á‚­‚ç‚­
+‚¨‚ñ‚µ‚ñ
+‚Ï[‚Â
+‚Ì‚¤‚©
+‚¶‚Ö‚¢‚µ‚傤
+‚«‚¿
+‚炼‚¤
+‚«‚Ü‚®‚ê
+‚½‚Ú‚¤
+‚µ‚µ‚å‚΂±
+‚¶‚イ‚«‚©‚¢
+‚¦‚ñ‚«‚ñ
+‚­‚Á‚«‚ñ‚®
+‚·‚¢‚¼‚¤
+‚¯‚¢‚è
+‚Æ‚¤‚µ‚å
+‚´‚¢‚¯‚¢
+‚¿‚イ‚©‚ñ
+‚¢‚Á‚«‚傤
+‚Ђ«‚½‚Ä
+ƒF
+‚©‚º‚¢
+‚¦‚«‚Ü‚¦
+‚©‚ñ‚Ç‚¤‚Ý‚á‚­
+‚Ù‚¤‚µ‚ã
+‚³‚â
+‚Ƃ‚ê‚ñ‚¸
+‚«‚イ‚¯‚¢
+‚©‚ñ‚ׂ‚µ‚å
+‚Í‚ñ‚©
+‚Í‚ñ‚¢‚ª‚¢
+‚à‚Ì‚­‚ë
+‚µ‚債‚«
+‚³‚ñ‚Å[
+‚Ñ‚©‚ñ
+‚©‚µ‚«‚è
+‚Í‚È‚·‚¶
+‚Ú‚ñ‚¿
+‚»‚¤‚±‚ñ
+‚䂵‚ã‚‚Ô
+‚Ü‚¿‚¶‚イ
+‚¾‚ñ‚‚¤
+‚ЂƂ¯
+‚¬‚á‚­
+‚í‚ꂵ‚炸
+‚Ä‚Ê‚¢
+‚©‚Î[
+‚ׂ¢‚²
+‚¶‚储‚¤
+‚ä[‚낾‚ç[
+‚«[‚Ú[‚Ç
+‚¬‚í‚­
+‚µ‚«‚傤
+‚É‚è‚イ
+‚¨‚®‚ç
+‚±‚é‚¢
+‚ä‚ ‚ª‚è
+‚±‚­‚ê‚ñ
+‚¾‚ª‚Á‚«
+‚µ‚Ⴕ
+‚©‚˂©‚¢
+‚¶‚Â
+‚®‚ç‚Þ
+‚Ú‚¤‚¶‚傤
+‚µ‚傤‚¯‚ñ‚ª‚©‚è
+‚Í‚Þ
+‚¶‚»‚ñ‚µ‚ñ
+‚»‚ñ‚®
+‚¶‚傤‚Ô
+‚킹
+‚·‚½[
+‚Ç‚­‚â‚­
+‚݂Ȃ«
+‚₦
+‚΂¢‚¨
+‚Ù‚Ñ[
+‚¢‚¿‚é
+‚²
+‚Ä‚Á‚Æ‚¤
+‚Õ‚ç‚¢‚·
+‚¯‚¢‚Ô‚Ù
+‚Ù‚è‚Å[
+‚½‚­‚¿
+‚è‚á‚­‚µ‚«
+‚¢‚ñ‚Ä‚è‚ 
+‚È‚ñ‚Ô‚ñ
+‚³‚ç‚è[‚Ü‚ñ
+‚Í‚½‚²
+‚©‚¢‚³‚‚®‚¿
+‚¹‚¢‚©‚¢‚¯‚ñ
+‚¹‚µ‚ã
+ƒ”
+‚©‚¢‚Ä‚ñ
+‚½‚É‚ñ
+‚¨‚ñ‚±‚¿‚µ‚ñ
+‚í‚ç‚Ô‚«
+‚悤‚ê‚¢
+‚«‚肾‚µ
+‚½‚Í‚½
+‚³‚Þ
+‚©‚悤‚¹‚¢
+‚Ó‚ë‚­
+‚»‚¤‚»‚Ó
+‚µ‚ã‚Á‚¿‚傤‚µ‚å
+‚Í‚¢‚Í‚ñ
+‚Í‚­‚¶‚傤
+‚±‚Þ
+‚²‚¤‚Í‚ñ
+‚Ý‚è‚傤
+‚ê‚¢‚Ô‚ñ
+‚©‚¨‚¢‚ë
+‚¾‚ñ‚â‚­
+‚²‚悤‚Ä‚¢
+‚Ù‚Á‚«‚É‚ñ
+‚¾‚¢‚¬‚¢‚ñ
+‚Þ‚©‚µ‚È‚¶‚Ý
+‚Å‚Ï[‚Æ
+‚µ‚Á‚­‚¢
+‚т傤‚ß‚¢
+‚Ì‚¤‚«
+‚Ü‚µ‚á‚­
+‚¶‚è‚Â
+‚É‚»‚­‚³‚ñ‚à‚ñ
+‚½‚ñ‚¢
+‚¾‚¢‚ׂñ
+‚³‚·‚ª
+‚µ‚ñ‚µ‚傤
+‚¨‚Ë‚¦‚¿‚á‚ñ
+‚³‚¢‚­‚é
+‚Ђ傤‚Ä‚«
+‚ ‚»‚±
+‚ª‚¾‚¢
+‚±‚¢‚¶
+‚µ‚ñ‚¼‚¤‚т傤
+‚±‚¤‚³‚Ä‚ñ
+‚©‚¢‚±‚¤
+‚ä‚«‚®‚É
+‚¦‚¢‚ª‚©‚ñ
+‚̂肵‚ë
+‚©‚Ô‚µ‚«‚ª‚¢‚µ‚á
+‚¯‚Á‚±‚ñ
+‚Ó‚ñ‚Ü‚Â
+‚Ä‚ñ‚Ç‚¤
+‚¹‚ñ‚½
+‚¢‚Á‚Ï‚ñ‚ë‚ñ
+‚¼‚¤‚·‚¢
+‚¨‚Æ‚¤‚Æ
+‚΂肫
+‚Ú‚­‚¿‚­
+‚³‚¢‚³‚ñ
+‚킯‚ß
+‚¼‚¤‚µ‚å
+‚³‚©‚ä‚ß
+‚µ‚ɂ傤
+‚¨‚¨‚í‚´
+‚³‚¢‚µ‚傤
+‚Ó‚³‚¢‚悤
+‚¶‚¾‚ñ
+‚µ‚ñ‚Æ
+‚«‚µ
+‚µ‚ñ‚±‚¤‚±‚­
+‚¢‚Á‚¿‚å‚­‚¹‚ñ
+‚±‚Ì‚½‚Ñ
+‚Ä‚¢‚«‚æ‚«‚ñ
+‚©‚ä
+‚®‚ñ‚«
+‚°‚ñ‚Ç
+‚¯‚à‚Ì
+‚¾‚¢‚æ‚ñ‚Ô
+‚¼‚¤‚«
+‚Æ‚µ‚æ‚è
+‚¬‚傤‚µ‚å
+‚½‚ß‚ñ
+‚¤‚·‚ß
+ƒq
+‚©‚¯‚²‚¦
+‚¿‚イ‚ª‚­‚Ë‚ñ
+‚©‚³‚¾‚©
+‚¢‚킵
+‚­‚¤‚±‚¤
+‚¹‚¢‚Æ‚¤‚Í
+‚É‚¿‚Ç‚­
+‚»
+‚Í‚«
+‚Ç‚è[‚Þ
+‚¶‚Ü‚­
+‚Ô‚ñ‚µ
+‚¶‚Á‚±‚¤
+‚±[‚ç
+‚¿‚イ‚ª‚½
+‚µ‚å‚­‚ê‚«
+‚Þ‚è‚»‚­
+‚¢‚ñ‚¼‚­
+‚Ù‚Á‚¯
+‚µ‚傤‚ß‚¢‚µ‚å
+‚¶‚イ‚ä
+‚¶‚‚Ô
+‚ª‚­‚Ä‚«
+‚Ö‚ 
+‚¿‚傼‚¤‚±
+‚₲‚¤
+‚©‚¢‚¬‚á‚­
+‚©‚¢‚©‚¯‚«‚ñ
+‚â‚«‚à‚Ì
+‚±‚¤‚«‚傤‚«‚å‚­
+‚¶‚¬
+‚­‚è‚Â
+‚¹‚¢‚ЂÂ
+‚±‚¤‚Æ‚è‚¢
+‚₶‚¤‚Ü
+‚¢‚ׂñ‚Æ
+‚Ä‚¡‚µ‚ã
+‚«‚ª‚Ü‚¦
+‚Ђ«‚¤‚¯‚É‚ñ
+‚â‚­‚»‚¤
+‚±‚¤‚»‚Â
+‚Ó‚­‚Ô‚¿‚傤
+‚è‚»‚¤‚¼‚¤
+‚Ù‚¿‚傤‚«
+‚«[‚Õ
+‚¢‚Á‚©‚°‚Â
+‚Þ‚·‚ß
+‚¨‚·
+‚Ç‚¤‚悤
+‚Ü
+‚Ђê‚ñ
+‚Ï[‚¹‚ñ‚Æ
+‚µ‚å‚Á‚©‚ñ‚Ù‚¤
+‚±‚¤‚΂¢‚ª‚©‚è
+‚Ä‚¢‚«‚Ñ‚ñ
+‚‚悫
+‚ê‚«‚µ
+‚Ç‚¤‚µ‚ñ
+‚¢‚ñ‚²‚¤
+‚Ü‚è
+‚à‚¤‚Í‚Â
+‚¹‚«‚¶
+‚±‚¤‚‚¤
+‚¯‚‚¦‚ñ
+‚¬‚傤‚¹‚¢
+‚µ‚ñ‚®‚é‚·
+‚µ‚Í‚¢
+‚ç‚ñ‚Ü
+‚³‚ñ‚·‚­‚è‚Á‚Æ
+‚¶‚傯‚Â
+‚©‚¾‚¢
+‚«‚â‚·‚ß
+‚à‚Æ‚¶‚ß
+‚È‚Á‚Æ‚¤
+‚­‚è‚΂₵
+‚Ù‚µ‚傤‚µ‚å
+‚°‚ñ‚¬
+‚µ‚å‚­‚ß‚¢
+‚µ‚å‚Ä
+‚«‚­‚è
+‚µ‚ñ‚Ô‚ñ
+‚§
+‚Å‚ñ‚Ï
+‚µ‚µ‚ñ
+‚°‚¢‚ß‚¢
+‚¬‚å‚Ý‚ñ
+‚Ç‚­‚Ô‚ñ
+‚¨‚ñ‚¿‚イ
+‚¢‚ñ‚Ç
+‚Ó‚¯‚¢‚©‚¢
+‚µ‚¬‚ñ
+‚¨‚É‚Ñ
+‚©‚¹‚Â
+‚«‚ñ‚¢‚ë
+‚É‚Ù‚ñ‚Ü
+‚¨‚â‚Ô‚ñ
+‚¹‚¢‚«‚å‚­
+‚ ‚‚©‚¢
+‚¯‚ñ‚ë
+‚¹‚¢‚¼‚¤
+‚«‚á‚ç‚΂ñ
+‚±‚¤‚²‚¤
+‚¶‚å‚°‚ñ
+‚¢‚«‚ª‚©‚è
+‚Æ‚¤‚±‚¤
+‚¢‚É‚ñ‚¶‚傤
+‚¦‚ñ‚Ô‚ñ
+‚»‚·‚¢
+‚­‚¢‚«
+‚°‚¢‚Ђñ‚©‚ñ
+‚Ý‚ñ‚¦‚¢
+‚«‚å‚­‚¬
+‚½‚Ä‚¤‚è
+‚䂤‚Ñ‚ñ‚«‚å‚­
+‚è‚Ô
+‚¾‚ñ‚¿‚傤
+‚Ò‚ñ‚­
+‚Ç‚¤‚è‚Â
+‚µ‚䂤
+‚Ë‚ñ‚°‚Â
+‚¿‚イ‚â
+‚¹‚¢‚Í‚­
+‚­‚¿‚Ô‚è
+‚±‚ñ‚Î[‚½[
+‚º‚ñ‚¹‚«
+‚ª‚¢
+‚²‚¤‚ß‚¢‚ª‚¢‚µ‚á
+‚Ý‚¬
+‚¹‚¢‚±‚­
+‚±‚¢‚¯
+‚Ì‚¤‚Í‚ñ‚«
+‚°‚ñ‚µ‚傤
+‚¿‚»
+‚Í‚ñ‚É‚ñ
+‚ª‚­‚è
+‚±[‚Ä‚¡‚ñ‚®
+‚¶‚ã[‚·
+‚Ó‚­‚¶
+‚낤‚ª‚Á‚±‚¤
+‚©‚½‚¸
+‚°‚ñ‚µ‚å‚­
+‚«‚イ‚©‚ñ
+‚©‚­‚¿‚イ
+‚±‚¤‚­‚¤‚Ñ‚ñ
+‚¶‚å‚Ô‚ñ
+‚©‚ª‚­‚¬‚¶‚ã‚Â
+‚«‚Ú‚è
+‚·‚¸‚©‚º
+‚³‚ß‚Í‚¾
+‚¿‚ñ‚Þ‚é‚¢
+‚´‚Â
+‚©‚Ë‚¶‚á‚­
+‚±‚¤‚Ú
+‚·‚¢‚Ý‚á‚­
+‚΂ñ‚Ì‚¤
+‚ӂЂ傤
+‚´‚¢‚²‚¤
+‚ª‚¼‚¤
+‚µ‚ ‚킹
+‚Ï[‚»‚È‚é
+‚Ä‚Á‚¹‚¢
+‚¨‚Ú‚µ‚ß‚µ
+‚Ë‚¶
+‚³[‚¶
+‚Ä‚¢‚Æ‚¤‚¯‚ñ
+‚Ü‚â‚­
+‚Ђ²
+ƒ‚
+‚½‚è‚傤
+‚«‚å‚Á‚±‚¤
+‚°‚«‚³‚­
+‚­‚ë‚¢‚µ
+‚¦‚ñ‚¾‚©
+‚°‚ñ‚¶‚ñ
+‚°‚ñ‚¯‚¢‚µ‚Â
+‚«‚ã[‚Ò‚Á‚Ç
+‚Í‚¢‚½
+‚È‚¢‚¼‚¤
+‚¶‚á‚­
+ƒŒ
+‚¾‚¢‚¯‚¢
+‚µ‚¹‚Â
+‚©‚­‚Ì‚¤‚±
+‚³‚ñ‚à‚ñ‚΂ñ
+‚܂킽
+‚µ‚ã‚è‚å‚­
+‚±‚±‚ë‚à‚¿
+‚݂傤‚¾‚¢
+‚Ù‚°‚¢
+‚Ç‚¤‚¶‚ñ
+‚¯‚¢‚©‚­‚ª‚©‚è
+‚©‚ñ‚Þ‚è
+‚¿‚©‚Ä‚Â
+‚Æ‚­
+‚³‚Á‚»‚´‚¢
+‚¶‚傤‚©‚»‚¤
+‚¦‚¢‚¾‚ñ
+‚͂邳‚«
+‚ ‚Ü‚´‚炵
+‚Ë‚Á‚¹‚ñ
+‚Ó‚¡‚æ‚é‚Ç
+‚í‚´‚í‚¢
+‚È‚Ü‚ª‚µ
+‚Ü‚³‚²
+‚Ý‚¹
+‚·‚¢‚¯‚¢
+‚Ù‚¨‚ׂÉ
+‚¶‚イ‚Ä‚ñ
+‚¹‚¢‚¯‚¢‚°‚©
+‚¦‚ñ‚É‚¿
+‚µ‚Á‚­
+‚悤‚²
+‚µ‚ñ‚ê‚¢
+‚³‚¢‚¾‚ñ
+‚µ‚ñ‚ç‚΂ñ‚µ‚傤
+‚«‚傤‚±‚¤
+‚µ‚ñ‚­‚¤‚©‚ñ
+‚ª‚ñ‚½‚ñ
+‚Æ‚¤‚±‚¤‚¹‚ñ
+‚®‚¹‚¢
+‚¦‚ñ‚»‚¤‚©
+‚É‚°‚Î
+‚¶‚â‚­
+‚­‚Ý‚ ‚¢‚¢‚ñ
+‚°‚ñ‚Ü‚¢
+‚ԂÂÝ
+‚Æ‚­‚»‚¤
+‚Å‚¡‚·‚­
+‚±‚ñ‚â
+‚º‚ñ‚è‚á‚­
+‚ ‚·‚©
+‚©‚Á‚Û‚¤‚¬
+‚Ó‚¤‚Ç‚¤
+‚Æ‚¨‚è
+‚Ђ˂Â
+‚¨‚ñ‚ê‚¢
+‚µ‚ã‚ç‚ñ
+‚¯‚‚΂ñ
+‚È‚©‚Î
+‚ä
+‚²‚Î
+‚¾‚¢‚¾‚¢
+‚à‚¤‚Ä‚ñ
+‚ ‚µ‚¨‚Æ
+‚³‚ñ‚©‚ñ‚µ‚¨‚ñ
+‚©‚¶‚傤
+‚Ì‚×
+‚±‚Ì‚Ü‚Ü
+‚°‚ñ‚«
+‚Ђâ‚Æ‚¢
+‚¿‚イ‚ª‚Á‚±‚¤
+‚æ‚«‚ñ‚µ‚á
+‚¢‚«‚¨‚¢
+‚©‚ñ‚»‚¤‚Ô‚ñ
+‚¤‚è‚¢‚¦
+‚Ó‚Ë‚ñ‚¹‚¢
+‚µ‚傤‚ß‚ñ
+‚«‚¢‚Æ
+‚«‚傤‚Ç
+‚Í‚­‚è‚å‚­
+‚Ä‚ñ‚ª‚¢
+‚¶‚イ
+‚݂傤‚É‚¿
+‚¶‚傶
+‚ ‚±[‚Å‚¨‚ñ
+‚ ‚Ô‚ç‚©‚·
+‚³‚µ‚¦
+‚΂¯‚à‚Ì
+‚¹‚«‚É‚ñ
+‚¸‚¶‚傤
+‚±‚¤‚µ‚ñ‚è‚傤
+‚­‚³‚΂È
+‚ª‚¢‚Ö‚«
+‚²‚Þ‚è
+‚É‚ª‚©‚è
+ƒx
+‚¦‚¢‚Ë‚ñ
+‚©[‚Æ
+‚­‚Ý‚©‚½
+‚©‚¢‚Æ‚­
+‚Ý‚¢‚ç
+‚µ‚ñ‚©‚Ô
+‚©‚±‚¤
+‚»‚Æ‚Ú‚è
+‚Ü‚ç‚»‚ñ
+‚Ç‚Ì
+‚­‚É‚®‚É
+‚µ‚傤‚¤‚ñ
+‚Ç‚Ú‚­‚©
+‚¹‚¢‚¼‚¤‚ª‚©‚è
+‚¶‚イ‚µ‚á
+‚µ‚å‚Í‚ñ
+‚¹‚ñ‚¿‚イ
+‚ê‚ñ‚µ‚イ‚¶‚傤
+‚¿‚¯‚ñ
+‚º‚ñ‚¹‚©‚¢
+‚Æ‚¤‚°
+‚Ë‚ñ‚ß
+‚ɂイ‚µ‚ã‚Á‚«‚ñ
+‚¹‚¢‚±‚¤
+‚à‚¿
+‚©‚ç‚Æ‚¤
+‚«‚Ä‚¢
+‚«‚©‚ñ‚µ
+‚°‚ñ‚Ä‚ñ
+‚±‚¤‚©‚¹‚ñ
+‚¹‚¢‚Ù‚­
+‚à‚Æ‚Å
+‚¾‚¢‚«‚ñ‚Ђ«‚©‚¦
+‚ ‚½‚Á‚µ‚ク[‚·
+‚©‚¢‚¶‚ñ
+‚µ‚½‚Á‚Ï
+‚º‚ñ‚è‚å‚­
+‚΂¢‚â[
+‚Æ‚¤‚¶‚Â
+‚¶‚Á‚»‚¤
+‚Ä‚ñ‚¹‚ñ
+‚µ‚«‚¢
+‚µ‚ñ‚¸‚¢
+‚‚߂¦‚è
+‚¶‚ЂÂ
+‚Ý‚È‚Æ
+‚µ‚Á‚¯
+‚¾‚¢‚â‚à‚ñ‚Ç
+‚Í‚ñ‚Ä‚ñ
+‚µ‚‚¢
+‚Ђ¶
+‚Þ‚©‚µ‚΂Ȃµ
+‚Í‚É‚í
+‚­‚ꂽ‚¯
+‚Ì‚Ñ‚è‚Â
+‚±‚¤‚±‚­‚Ô
+‚µ‚΂·
+‚µ‚ñ‚Ô
+‚µ‚å‚ë‚ñ
+‚¨‚·‚Ý
+‚ЂƂ³‚µ‚ä‚Ñ
+‚ª‚ñ‚Û‚ñ
+‚©‚µ‚í‚´‚«
+‚¯‚ñ‚Ý‚ñ
+‚²‚¤‚¤
+‚©‚Á‚½
+‚Ê‚¯‚ª‚ç
+‚Ì‚Ý‚·‚¬
+‚¿‚¹‚¢
+‚©‚­‚ë‚ñ
+‚à‚¤‚Ç‚¤‚¯‚ñ
+‚ª‚ñ‚¹‚¢‚Ђ낤
+‚·‚Ä[‚µ‚å‚ñ
+‚Ô‚ ‚¢
+‚Ђ°
+‚©‚¢‚¹‚ñ
+‚±‚¤‚Ç
+‚«‚イ‚¿‚傤
+‚Ä‚Á‚©‚ñ
+‚»‚­‚µ‚Â
+‚Í‚¿‚Ü‚ñ
+‚¬
+‚Ö‚¢‚¦‚«
+‚¶‚ã‚Â
+‚·‚¤‚µ
+‚¨‚¨‚à‚è
+‚݂Ƃ肸
+‚ǂЂ傤
+‚¿‚傤‚Ú
+‚µ‚ñ‚¹‚¢‚µ‚å
+‚­‚Í‚¢
+‚±‚¯‚¢
+‚Ç‚­‚³‚¢‚µ‚á
+‚±[‚Û‚ç‚·
+‚à‚ñ‚¶‚ã
+‚¶‚å‚«‚å‚­
+‚¢‚Á‚µ‚å‚­‚»‚­‚Í
+‚¦‚¿‚¯‚Á‚Æ
+‚‚­‚¦
+‚¢‚­‚¦
+‚¿‚イ‚«‚ñ‚Æ‚¤
+‚»‚¤‚Þ‚Ô
+‚»‚¤‚¬‚傤‚µ‚á
+‚ç‚­‚¦‚ñ
+‚³[‚«‚Á‚Æ
+‚悤‚¬‚å
+‚±‚ׂÂ
+‚µ‚Ⴕ‚ñ
+‚®‚ç‚Ó‚¡‚Á‚­‚·
+‚©‚¢‚Ö‚¢‚«
+‚¨‚Ä‚ ‚°
+‚¿‚ª‚­‚©
+‚Ú‚è‚ã[‚Þ
+‚È‚ñ‚Ý‚ñ
+‚¹‚ñ‚½‚¢
+‚­‚¤‚µ‚á
+‚Ù‚¤‚¹‚«
+‚©‚ñ‚µ‚傤‚Ä‚«
+‚¹‚ñ‚ɂイ‚©‚ñ
+‚Ï[‚ç
+‚¨‚È‚ª
+‚É‚­‚µ‚Â
+‚¶‚á‚­‚»‚Â
+‚³‚¬‚傤‚¬
+‚É‚¿‚°‚ñ
+‚䂤‚Ä‚ñ
+‚Í‚­‚è
+‚¾‚¢‚¨‚¤
+‚à‚ñ‚¾‚¢
+‚낤‚¶‚ñ
+‚¹‚¢‚Ý‚Â
+‚¾‚¢
+‚Ü‚Á‚·‚®
+‚µ‚債‚ñ‚µ‚á
+‚΂Á‚¶
+‚Âтñ
+‚¿‚傤‚Ù‚ñ‚É‚ñ
+‚­‚Ý‚ñ
+‚¾‚ׂñ
+‚±‚º‚É
+‚°‚ñ‚ª
+‚µ‚ã‚­‚¬
+‚É‚Á‚·‚¤
+‚·‚¢‚µ‚ã
+‚Ç‚¤‚Ԃ‚¹‚¢
+‚¯‚é‚ñ
+‚²‚¤‚µ‚ª‚¢‚µ‚á
+‚¶‚ã‚É‚ 
+‚©‚à‚Â
+‚­‚ñ‚¹‚¢
+‚»‚Á‚«
+‚®‚ñ‚¶‚ã
+‚­‚ç‚¢
+‚΂¢‚©‚­
+‚¯‚¢‚¹‚«
+‚¹‚ñ‚µ‚ã‚ñ
+‚ ‚­‚¹‚é
+‚Ú‚·‚Æ‚ñ
+‚±‚¤‚±‚ª‚­
+‚¶‚ã‚ñ‚¶‚ã‚ñ
+‚Ü‚ñ‚è‚傤
+‚´‚¢‚¾‚ñ‚Ù‚¤‚¶‚ñ
+‚³‚¢‚Ù‚­‚½‚ñ
+‚Ђ傤‚½‚ñ
+‚ǂ悤‚Ñ
+‚¯‚ñ‚±‚¤
+‚Ý‚ñ‚©
+‚¨‚Ü‚¦
+‚©‚µ‚í
+‚¾‚ñ‚¿
+‚¯‚¢‚¦‚¢‚ª‚­
+‚©‚¢‚è
+‚Æ‚è‚¢
+‚Ü‚½‚ª‚Ý
+‚Æ‚¤‚Ë‚ñ
+‚Æ[‚­‚ñ
+‚ ‚¨‚½
+‚¹‚ñ‚ß‚ñ‚¶‚å
+‚½‚¯
+‚Ñ‚¶‚ã‚‚µ
+‚ª‚¢‚Ô‚ñ
+‚¶‚ñ‚¿‚­
+‚Í‚È‚Ý‚¿
+‚¯‚ñ‚«‚イ‚ª‚©‚è
+‚·‚±‚ç
+‚°‚ñ‚Ô‚Â
+‚¹‚í‚É‚ñ
+‚¿‚傤‚‚ª‚¢
+‚è‚傤‚µ
+‚¢‚Á‚©‚­
+‚¬‚債‚傤
+‚¤‚ç‚©‚½
+‚Ô‚ñ
+‚³‚¢‚±‚낶[
+‚«‚«‚©‚ñ
+‚¹‚ñ
+‚µ‚å‚Ù
+‚Æ‚±‚ë‚Ä‚ñ
+‚«‚傤‚Ô
+‚¹‚ë
+‚¯‚¢‚¶‚¶‚傤
+‚¶‚イ‚©‚ª‚­
+‚Ý‚µ‚å‚Ô‚ñ
+‚Ä‚­‚ç‚¢‚Æ
+‚ê‚¢‚¤
+‚Ù‚­‚ׂ¢
+‚í‚­‚¹‚¢
+‚¿‚傤‚¾
+‚ê
+‚Ü‚È‚¢‚½
+‚¶‚ñ‚©
+‚Þ‚°‚ñ
+‚¹‚¢‚Æ
+‚¬‚ñ‚¹‚©‚¢
+‚¢‚µ‚΂µ
+‚µ‚傤‚¶
+‚©‚ñ‚Û‚ñ
+‚¶‚Þ‚«
+‚È‚Ý‚ ‚µ
+‚¹‚¢‚à‚ñ
+‚Ú‚¤‚¿‚傤
+‚¯‚¢‚³‚‚µ‚å
+‚©‚ñ‚¬‚傤
+‚Ê‚¯‚ ‚È
+‚ɂイ‚¬‚傤
+‚µ‚傤‚·‚¤
+‚­‚‚¨‚Æ
+‚»‚¤‚µ‚å‚­‚Ђñ
+‚«‚«‚ñ‚¼‚­
+‚¨‚à‚Ä‚®‚¿
+‚¹‚ñ‚Æ‚¤‚«
+‚ ‚Ä‚³‚«
+‚ ‚Ï‚é‚Æ
+‚«‚傤‚è‚傤
+‚µ‚å‚Á‚«‚ñ‚®
+‚ ‚³‚ª‚¨
+‚¢‚¶‚ñ
+‚³‚ñ‚¯‚ñ
+‚Ù‚Á‚½‚ñ
+‚Ý‚©‚ñ
+‚µ‚ã‚É‚ñ‚¬‚µ
+‚Ü‚®‚¿
+‚«‚á‚Á‚¿
+‚«‚傤‚¶‚á‚­
+‚»‚Á‚±‚­
+‚¦‚Ó
+‚¾‚¢‚É‚µ‚ã
+‚Ä‚¢‚Ö‚ñ
+‚¯‚ñ‚è‚«‚ñ
+‚à‚¿‚¢‚¦
+‚΂¢‚µ‚傤‚«‚ñ
+ƒm
+‚¢‚Ö‚ñ
+‚Û[‚¸
+‚½‚¿‚ ‚ª‚è
+‚Ë
+‚Ä‚¢‚è‚イ‚¶‚å
+‚¾‚¢‚Ђ傤‚Ƃ肵
+‚·‚¢‚Ý‚ñ‚®
+‚ç‚¢‚¨‚ñ
+‚¤‚¯
+‚µ‚ã‚Á‚¹‚«‚è‚Â
+‚¶‚ã‚ñ‚¯‚Á‚µ‚傤
+‚«‚ñ‚²‚¤
+‚½‚¾‚²‚Æ
+‚µ‚ã‚Â
+‚à‚ñ‚¾‚¢‚Ä‚ñ
+‚©‚í‚©‚Ý
+‚µ‚ñ‚Ä‚ñ‚¿
+‚´‚¢‚è‚傤‚Ð
+‚±‚¤‚ª‚­‚Ë‚ñ
+‚è‚傯‚ñ
+‚»‚¤‚Ù‚ñ‚Ô
+‚܂邽
+‚¢‚±‚­
+‚¼‚¤‚³
+‚Þ‚«‚¸
+‚¿‚¥‚ë
+‚³‚Á‚¿‚á‚ñ
+‚©‚ñ‚°‚ñ
+‚µ‚á‚­‚ñ
+‚·‚¢‚ª‚¢
+‚¨‚­‚肪‚È
+‚í‚©‚ê‚ß
+‚Ì‚Í‚ç
+‚悤‚µ‚傤
+‚Ђ´‚Âß
+‚»‚¤‚¤‚Â
+‚Ђ傤‚¨‚ñ
+‚¦‚ñ‚©‚­‚¿
+‚±‚­‚Å‚ñ
+‚Ý‚¸‚¢‚ë
+‚»‚µ
+‚µ‚¸‚­
+‚悳‚Þ
+‚¤‚í‚®‚·‚è
+‚´‚Á‚µ
+‚æ‚©‚ñ
+‚´‚ñ‚ª‚¢
+‚ ‚­‚µ‚Â
+‚¢‚¨‚¤
+‚ ‚­‚µ‚å
+‚Ì‚¤‚¶
+‚³‚¢‚±‚¤‚¿‚傤
+‚Æ‚Á‚«‚å‚«‚å‚­
+‚´‚¢‚Þ‚ª‚©‚è
+‚»‚¤‚¤‚è‚ ‚°
+‚©‚ñ‚ß‚ñ
+‚Ü‚³‚ß
+‚Æ‚¤‚°‚¢
+‚Ђق¯‚ñ‚µ‚á
+‚¢‚»
+‚É‚¦‚«
+‚³‚­‚Ç‚¤
+‚ ‚ç‚¢‚ ‚ª‚è
+‚±‚¤‚Ó‚ñ
+‚½‚¢‚낤
+‚Ö‚¢‚¯
+‚ׂÁ‚Ç‚·‚¤
+‚³‚µ‚à‚Ç‚µ
+‚Ù‚ñ‚µ‚«
+‚µ‚ñ‚Û‚ñ
+‚¤‚í‚Ü‚¦
+‚¿‚䂤
+‚±‚½‚¢
+‚Æ‚Á‚«‚ª‚©‚è
+‚«‚¹‚¢‚Ђñ
+‚µ‚傤‚«‚á‚­‚ë
+‚Æ‚¤‚à‚­
+‚Þ‚«‚イ
+‚©‚ñ‚¶‚á
+‚Ђ߂¢
+‚¢‚¶
+‚»‚¤
+‚¿‚Ù‚¤‚µ‚å‚­
+‚±‚ñ‚³[‚Æ
+‚º‚Á‚©‚¢
+‚‚Ȃ¬
+‚Ì‚¤‚Ý‚ñ
+‚¨[‚­
+‚©‚ç‚Ä‚ª‚½
+‚»‚Ì‚½‚ß
+‚É‚­‚¢
+‚±‚Ԃ‚µ‚傤
+‚«‚傤‚®‚¤
+‚â‚낤
+‚±‚ñ‚Ï
+‚Ó‚­‚³‚悤
+‚±‚¤‚ê‚¢
+‚©‚ñ‚³‚­
+‚±‚¤‚¦‚¢
+‚«‚傱‚¤
+‚´‚Á‚©‚ñ
+‚¨[‚é‚Ç
+‚¨‚¤‚¾‚ñ‚Ù‚Ç‚¤
+‚΂­‚Ü‚Â
+‚ ‚é‚Ó‚Ÿ
+‚«‚ñ‚¿‚³‚ñ
+‚à‚ñ‚¿
+‚΂Á‚®
+‚炵‚ñ‚΂ñ
+‚½‚¢‚±‚¤
+‚¹‚¢‚³‚‚悾‚Â
+‚»‚Ó‚Æ‚¤‚¥‚ 
+‚¶‚傤‚¶‚Â
+‚Ç‚¤‚«‚¹‚¢
+‚»‚¤‚΂È
+‚΂¢
+‚±‚ñ‚Ç
+‚à‚¾‚ñ
+‚¨‚à‚Ä‚¶
+‚³‚ñ‚Õ
+‚Ü‚ñ‚à‚·
+‚䂤
+‚Å‚Û
+‚±‚½‚¦
+‚«‚«‚ñ
+‚Ù‚è‚©‚í
+‚©‚ñ‚à‚ñ
+‚Æ‚¿‚イ
+ƒc
+‚Þ‚«‚µ‚Â
+‚®‚ñ
+‚¹‚«‚ä
+‚µ‚イ‚Ö‚ñ
+‚©‚¢‚©‚¦
+‚Û‚è‚Ü[
+‚·
+‚¨‚¨‚Ü‚ª‚è
+‚·‚¦‚«‚¿
+‚Ù‚ñ
+‚µ‚傾‚È
+‚½‚¢‚µ‚ñ
+‚«‚´‚Ý
+‚µ‚傶‚傤
+‚Ü‚æ‚Ë[‚¸
+‚Ç‚¤‚ç‚ñ
+‚³‚é‚À‚¦
+‚¯‚ñ‚肵‚å
+‚È‚è‚à‚Ì
+‚©‚¿
+ƒu
+‚˂‚łñ‚Ç‚¤‚è‚Â
+‚¢‚­‚ç
+‚½‚Ô‚ê‚Á‚Æ
+‚¿‚©‚­
+‚µ‚傤‚Ç‚¤
+‚²‚¶‚イ‚¨‚ñ
+‚±‚«
+‚´‚‚悤
+‚±‚¤‚Ú‚­
+‚Ç‚¤‚Ý‚á‚­
+‚ ‚Ü‚­‚¿
+‚«‚³‚炬
+‚°‚ñ‚´‚¢‚¿
+‚¢‚ç‚·‚Æ‚ê[‚µ‚å
+‚Ó‚Æ‚¶
+‚¢‚½‚ñ
+‚©‚­‚¾‚ñ
+‚¨‚ñ‚Ç‚è
+‚Ђ΂¢
+‚Ø‚ñ‚µ‚é
+‚¢‚¸‚Ý
+‚³‚ñ‚²‚µ‚傤
+‚Ä‚¢‚»
+‚Ì‚Ñ
+‚©‚­‚³‚ñ
+‚Ó‚Ÿ‚Á‚µ‚å‚ñ
+‚è‚á‚­‚¸
+‚Ç‚­‚Ô‚Â
+‚¹‚è‚¢‚¿
+‚Ó‚¬
+‚¿‚イ‚¢‚è‚å‚­
+‚¶‚イ‚Ç‚¤
+‚¾‚ñ‚³[
+‚΂¢‚¨‚è‚ñ
+‚Ë‚ñ‚è‚傤
+‚Í‚¤‚¶‚ñ‚®
+‚¢‚È‚©
+‚¯‚ñ‚¬
+‚¤‚ê‚¢
+‚Ü‚ñ‚©‚ñ‚µ‚å‚­
+‚Ý‚¬‚Í‚µ
+‚©‚½‚Ã
+‚Æ‚à‚¾‚¿
+‚Ü[‚¯‚Ä‚¡‚ñ‚®
+‚‚Ý
+‚ ‚ç‚Ñ‚ ‚²
+‚ЂƂ¢‚«
+‚®‚ç‚ñ‚Ç
+‚Ù‚¯‚ñ
+‚©‚ñ‚±‚Ç‚è
+‚«‚å‚­‚¶‚Â
+‚Æ‚¤‚»‚¤
+‚¨‚¤‚Ä
+‚¶‚¶‚傤‚¶‚΂­
+‚Ö‚Ú‚ñ
+‚ ‚«‚®‚¿
+‚æ‚à‚¬
+‚¨‚¨‚­‚炾‚¢‚¶‚ñ
+‚¹‚¢‚©‚Ô‚Â
+‚±‚¤‚è
+‚Ä‚ñ‚µ‚ã‚©‚­
+‚¼‚­‚ ‚­
+‚µ‚ñ‚²
+‚Ó‚¤‚ª‚¢
+‚É‚°‚ñ
+‚Ç‚¤‚¬‚傤
+‚¾‚è‚Â
+‚È‚µ‚å‚È‚è‚Ä‚¡
+‚®‚ñ‚±‚¤
+‚©[
+‚©‚߂ꂨ‚ñ
+‚ª‚­‚í‚è
+‚±‚ª‚ñ
+‚è‚傤‚«‚å‚­
+‚±‚Ü‚à‚Ì
+‚©‚º
+‚䂤‚Ó‚­
+‚»‚ñ‚µ‚傤
+‚ê‚¢‚¹‚Â
+‚¿‚傱‚ê[‚Æ
+‚â‚©‚½
+‚½‚È‚ñ
+‚½‚¯‚¤‚Ü
+‚½‚¯‚â‚Ü
+‚ ‚­‚¿‚ウ[‚½
+‚µ‚å‚­
+‚©‚©‚è‚¢‚ñ
+‚Ü‚¢‚µ‚イ
+‚©‚à‚­
+‚Ì‚¤‚è‚ñ‚·‚¢‚³‚ñ
+‚à[‚Ç
+‚­‚Á‚µ
+‚¢‚ª‚¢
+‚Î
+‚Ú‚Æ‚Þ
+‚Ђ낭
+‚¯‚‚邢
+‚¨‚¤‚±‚¤
+‚¯‚‚ë
+‚©‚ñ‚Ȃ«
+‚Æ‚¶‚傤
+‚²‚Ü
+‚½‚«‚¬
+‚Æ‚­‚¾‚¢
+‚ЂႭ‚µ‚傤
+‚³‚ñ‚Ç‚¢‚Á‚¿
+‚­‚¢‚¸
+‚¶‚ã‚ñ‚â‚­
+‚¦‚ñ‚Þ‚·‚Ñ
+‚Æ‚­‚¶‚ã
+‚¹‚ñ‚Ç‚¤
+‚Ô‚ñ‚ª‚­
+‚Ì‚¤‚µ‚傤
+‚¶‚±‚¯‚ñ‚¨
+‚«‚傤‚¢‚­‚©
+‚Í‚¢‚¦‚«
+ƒ|
+‚°‚·‚Æ
+‚µ‚‚¿‚傤
+‚¬‚µ‚ã
+‚ç‚¢‚«
+‚Í‚´‚­‚ç
+‚±‚¤‚Ý‚Â
+‚Í‚Á‚±‚¤‚¸‚Ý
+‚«‚イ‚䂤
+‚º‚ñ‚Ü‚¢
+‚¨‚¨‚Âß
+‚¦‚¶‚»‚ñ
+‚¨‚₶
+‚í‚È
+‚Å‚¢
+‚Ó‚Ì‚¤
+‚¿‚å‚­‚¹‚Â
+‚°‚ñ‚Û‚ñ
+‚±‚¤‚Æ‚¤
+‚µ‚サ‚傤
+‚½‚ñ‚¢‚¿
+‚Í‚ñ‚É‚¿
+‚낤‚Þ‚µ
+‚·‚¿[‚é
+‚­‚¤‚«
+‚è‚傤‚²‚­
+‚«‚傤‚©‚ñ
+‚¨‚©‚Ç‚¿‚ª‚¢
+‚µ‚イ‚¦‚«
+‚½‚¾
+‚«‚Ⴝ‚Ò‚ç
+‚»‚¤‚à‚­
+‚«‚傤‚©‚µ‚å
+‚ß‚¢‚¾‚¢
+‚Ü‚¢‚²
+‚¸‚ë‚­
+‚Ó‚¡‚邽
+‚±‚¤‚¹‚¢‚¾‚¢‚¶‚ñ
+‚Ú‚Á‚©
+‚ª‚µ‚ñ‚µ‚傤‚½‚ñ
+‚¢‚½
+‚©‚ñ‚Û‚¤‚â‚­
+‚«‚ñ‚µ‚ã‚Ђ傤
+‚¹‚ñ‚Î
+‚ׂ̂ɂÁ‚·‚¤
+‚Ë‚ñ‚®
+‚²‚¤‚µ‚Â
+‚ª‚¢‚©‚ñ
+‚³[‚Ç
+‚Ô‚º‚¢
+‚µ‚ñ‚Å‚ñ
+‚µ‚µ‚á‚¿‚傤
+‚©‚¢‚ß‚ñ
+‚¢
+‚Í[‚à‚É[
+‚®‚³‚¢
+‚¹‚¢‚±‚ñ
+‚²‚Ñ
+‚í‚Á‚µ‚á
+‚Ë‚ñ‚¶
+‚â‚Á‚©
+‚â‚­‚ª‚­
+‚¨‚¨‚ׂâ
+‚¨‚à‚¢‚Å
+‚¶‚ñ‚±‚¤‚¦‚¢‚¹‚¢
+‚©‚³‚¢
+‚â‚Á‚©‚ñ
+‚Ò[‚­
+‚¾‚¢‚ß‚¢
+‚¶‚傤‚µ‚傤
+‚³‚¢‚²
+‚±‚­‚Þ‚¾‚¢‚¶‚ñ
+‚ׂ‚¢‚ñ
+‚낤‚Î
+‚¤‚«
+‚µ‚å‚­‚¹‚¢
+‚æ‚­‚©
+‚¢‚ñ‚ª‚µ
+‚¢‚ª‚­‚Ô
+‚·‚ë‚Á‚Æ
+‚¬‚ñ‚æ‚­
+‚½‚Ó‚¯‚ñ
+‚¶‚¼‚¤
+‚¢‚­‚É‚¿
+‚¨‚à‚Ä
+‚¿‚ß‚¢‚Ç
+‚Ç‚¤‚¶‚­
+‚Õ‚ç‚¢‚¨‚è‚Ä‚¡
+‚¯‚ñ‚µ‚«
+‚Í‚­‚Ђ傤
+‚º‚ñ‚½‚¢
+‚Í‚â
+‚¬‚イ‚Ù
+‚Ò
+‚Ä‚Á‚Ø‚ñ
+‚¾‚ñ‚ß‚ñ
+‚¶‚á‚­‚µ‚ñ
+‚µ‚ã‚Ì‚¤
+‚ê‚ñ‚©
+‚¶‚Þ‚¢‚ñ
+‚¹‚¢‚±‚¤‚Æ‚¤‚Ä‚¢
+‚¾‚¢‚²‚é‚¢
+‚¢‚Á‚‚¢
+‚°‚ñ‚«‚å
+‚µ‚傽‚¢‚ß‚ñ
+‚°‚ñ‚´‚¢‚è‚傤
+‚¢‚Ì‚¿‚ÂÈ
+‚Ó‚¤‚µ‚ñ
+‚³‚Ý‚¾‚ê
+‚è‚傤‚±‚­
+‚±‚¤‚µ‚Â
+‚©‚ñ‚»‚¤
+‚Ä‚¢‚Ä‚ñ
+‚µ‚å‚낤
+‚¤‚í‚â
+‚»‚¤‚ª‚ñ‚«‚傤
+‚©‚¢‚Æ‚¤
+‚Ç‚­‚è‚å‚­
+‚΂­‚µ‚ñ‚¿
+‚ ‚Ý‚Ì‚³‚ñ
+‚©‚΂ñ
+‚¿‚낤‚¢
+‚ ‚ǂ΂é[‚ñ
+‚낤‚ª‚ñ
+‚Í‚ç‚킽
+‚©‚à‚‚¹‚ñ
+‚©‚ñ‚©‚‚ª‚¢
+‚¯‚¢‚±‚¤‚¬‚傤
+‚©‚¢‚±
+‚¶‚©‚ñ‚«‚イ
+‚Ç‚¤‚¯‚µ
+‚Ù‚ñ‚´‚ñ
+‚±‚±‚ë‚­‚µ
+‚Æ‚è‚Â
+‚µ‚ガ‚å‚­
+‚½‚¢‚¶‚ã
+‚ ‚ç‚Æ
+‚«‚イ‚­‚Â
+‚©‚©‚µ
+‚΂­‚¨‚ñ
+‚ª‚µ‚傤
+‚¦‚·‚«‚à[
+‚¯‚‚܂­
+‚Ђ±‚¤‚¶‚傤
+‚¶‚¦‚¢‚©‚ñ
+‚Ó‚¼‚­‚²
+‚ ‚­‚µ‚イ
+‚Ý‚Æ‚¨‚µ
+‚¶‚ ‚¢
+‚ ‚¯
+‚µ‚å‚­‚½‚­
+‚΂¢‚Ђñ
+‚µ‚Ý‚¸
+‚¶‚ñ‚¹‚¢
+‚´‚Á‚µ‚ã
+‚¹‚¶‚傤
+‚µ‚Á‚µ‚ñ
+‚±‚É‚à‚Â
+‚Ú‚¤‚±‚¤
+‚¢‚é‚Ý‚Ë[‚µ‚å‚ñ
+‚·‚¦‚¨‚«
+‚ç‚­‚悤
+‚µ‚傯‚¢
+‚Ó‚µ‚º‚ñ
+‚·‚¢‚Æ‚¤‚Ú
+‚¬‚¶‚傤
+‚¯‚¢‚¿‚傤
+‚¶‚á‚­‚Ë‚ñ
+‚¤‚¢‚ñ‚½
+‚µ‚á‚Ð
+‚­‚³‚«
+‚³‚­‚Ë‚ñ‚Ç
+‚É‚â‚­
+‚¦‚¾
+‚©‚ñ‚è‚©
+‚¿‚¶‚傤
+‚¨‚Æ‚Æ‚¢
+‚¶‚傤‚±‚¤
+‚¤‚¯‚µ‚å
+‚Í‚®‚«
+‚µ‚Ç‚¤
+‚ ‚è‚·‚Æ‚Ä‚ê‚·
+‚¨‚ë‚©‚à‚Ì
+‚¿‚傤‚³
+‚ ‚É‚æ‚ß
+‚½‚ñ‚Ø‚¢‚«‚イ
+‚¢‚È‚â
+‚¦‚ñ‚±‚ñ
+‚µ‚傤‚ª‚¢‚µ‚á
+‚Ü‚Ë[‚¶‚á[
+‚Ö‚³‚«
+‚Ú‚¤‚«‚傤
+‚µ‚傤‚®‚ñ
+‚킽‚­‚µ
+‚¶‚Á‚¿
+‚Ê‚«‚ª‚½
+‚µ‚ã‚­‚¢
+‚¹‚ñ‚à‚ñ‚²
+‚³‚Á‚¿‚イ‚´‚¢
+‚¦‚Ä‚©‚Á‚Ä
+‚Ђ©‚µ‚Ú‚¤
+‚­‚ɂׂÂ
+‚³‚ñ‚©‚ñ‚Ñ
+‚ª‚­‚µ‚å‚­
+‚µ‚ñ‚Û‚¶‚¤‚Þ
+‚«‚傤‚¿‚イ
+‚¨‚¨‚ª‚½‚µ‚á
+‚³‚¯‚©‚·
+‚Ù‚ñ‚¹‚ñ
+‚·‚¢‚Ö‚¢‚ß‚ñ
+‚â‚·
+‚Ï‚¢‚ë‚Á‚Æ
+‚­‚É
+‚©‚¢‚µ‚ñ
+‚¯‚¢‚Ç
+‚΂Á‚¿
+‚ ‚¢‚Ó‚­
+‚©‚¢‚ñ
+‚䂤‚¦‚ñ
+‚±‚Ý‚ã‚É‚Ä‚¡[
+‚©‚½‚Ù‚¤
+‚¶‚Ⴙ‚Â
+‚©‚½‚ß
+‚¬‚傤‚µ‚á
+‚µ[‚½
+‚Þ[‚Ñ[
+‚ß[‚©
+‚¿‚ñ‚‚¤
+‚Ђñ‚Ì‚¤
+‚¶‚イ‚©‚ñ‚«‚傤
+‚Ó‚¿‚á‚­
+‚­‚³‚©‚è
+‚¾[‚·
+‚¢‚½‚Ü‚¦
+‚·‚¢‚ß‚ñ
+‚·‚¢‚³‚ñ
+‚·‚¢‚¶‚傤‚«
+‚¢‚Á‚Ò‚Â
+‚¢‚ß‚¢
+‚³‚΂ñ‚È
+‚­‚ë‚Ü‚Â
+‚±‚¢‚²‚±‚ë
+‚¢‚¿‚è‚イ
+‚¯‚¢‚à‚¤
+‚¿‚¶‚­
+‚Å‚ñ‚µ‚ñ
+‚¬‚¶‚ã‚‚ª‚©‚è
+‚΂ñ‚±‚­
+‚݂肨‚ñ
+‚¶‚Ù‚¤
+‚ׂñ‚Æ‚¤
+‚ç‚®‚Ñ[
+‚µ‚å‚´‚¢‚¿
+‚³‚ñ‚é‚¢
+‚‚¤‚¹‚¢
+‚±‚¤‚Æ‚­
+‚¿‚イ‚©‚ñ‚µ
+‚¢‚Á‚µ‚傤
+‚ª‚¢‚±‚­‚¹‚¢
+‚Ö‚ñ‚¿
+‚¶‚ã‚ñ‚¢
+‚è‚á‚­‚ê‚«
+‚­‚»
+‚­‚³‚à‚¿
+‚ª‚¢‚è‚ñ
+‚É‚µ‚«
+‚ЂÁ‚µ‚傤
+‚«‚¹‚«
+‚Ä‚«‚É‚ñ
+‚¬‚イ
+‚Í‚¢‚Ä‚­
+‚±‚ñ‚¬
+‚Ö‚¢‚µ‚ñ
+‚µ‚ñ‚è‚ñ
+‚Ô‚è‚å‚­
+‚‚¤‚µ‚ñ‚¦‚¢‚¹‚¢
+‚©‚­‚©
+‚à‚Æ‚Ç‚¨‚è
+‚³‚ñ‚È‚¢
+‚¨‚ñ‚Ï
+‚­‚¤‚Å‚ñ
+‚¶‚傤‚³‚µ
+‚¾‚¢‚ë‚­‚é‚¢
+‚µ‚ゾ‚ñ
+‚µ‚á‚­‚Í‚¿
+‚Í‚ñ‚ª[
+‚Ñ‚¶‚ã‚Â
+‚¾‚¢‚ß‚¢‚µ
+‚Ç‚¤‚ª‚­
+‚µ‚á‚Ù
+‚·‚ç‚¢‚·
+‚»‚¤‚©‚¢
+‚Å‚ñ‚°‚ñ
+‚¾‚¢‚æ‚ñ‚©
+‚¯‚¢‚ê‚Â
+‚‚«‚ª‚¯
+‚²‚Ô
+‚¦‚ñ‚ª‚ñ
+‚µ‚イ‚«‚å‚­
+‚¶‚イ‚½‚­‚È‚ñ
+‚Æ‚È‚¢
+‚Ó‚¤‚¤‚ñ
+‚¹‚¢‚΂­
+‚Ù‚¤‚è‚‚©
+‚³‚¨‚Æ‚ß
+‚Ђà‚Ì
+‚¹‚«‚ª‚¢
+‚ê‚·
+‚º‚ñ‚²‚³‚­
+‚Æ‚®‚é‚Ü
+‚Ù‚¤‚Þ‚«‚å‚­
+‚Ì‚Á‚¿
+‚¾‚¢‚¶‚傤‚©‚ñ
+‚Ó‚­‚Ü‚Å‚ñ
+‚Ó‚§‚Æ
+‚¦‚ñ‚±
+‚±‚¤‚Ç‚¤
+‚Ù‚Æ‚è
+‚ç‚ñ‚¨‚¤
+‚Ô‚ë‚Á‚­
+‚¶‚傤‚Ђ傤
+‚É‚¿‚Ú‚Â
+‚´‚¢‚ ‚­
+‚µ‚¯‚ñ‚¶‚傤
+‚±‚¤‚Ú‚¤
+‚¢‚Á‚»‚­
+‚¯‚ñ‚«‚イ‚µ‚Â
+‚Ù‚ñ‚Ô
+‚­‚Ü
+‚è‚«‚ª‚­
+‚µ‚Ü‚¢
+‚©‚ñ‚©‚¢
+‚¶‚傶‚µ
+‚­‚È‚¢‚¿‚傤
+‚ ‚­‚Ü
+‚­‚ñ‚Ý‚ñ
+‚«‚¶
+‚Ò‚Á‚­
+‚Ó‚§‚ñ‚Æ
+‚»‚炲‚Æ
+ƒi
+‚Ù‚ñ‚«‚å‚­
+‚ª‚ñ‚®
+‚ª‚­‚¦‚ñ
+‚«‚ñ‚Ú‚¤
+‚µ‚«‚Ó
+‚É‚°‚Ý‚¿
+‚·‚¢‚µ‚ñ‚«‚å‚­
+‚Ó‚­‚©‚¢‚¿‚傤
+‚¿‚¹‚«
+‚Ђ傤‚¢
+‚Ђłè
+‚¶‚ñ‚Ô‚ñ
+‚ ‚·‚Ø‚­‚Æ
+‚Ó‚¡‚ñ‚ª[
+‚ß‚¢‚Ä‚ñ‚ª‚¢
+‚Ђ²‚Æ
+‚«‚傤‚¶‚ñ
+‚µ‚ñ‚ª‚¢‚µ‚á
+‚¶‚¦‚¢‚½‚¢
+‚®‚é[‚Õ
+‚¿‚©‚ç
+‚µ‚Ó‚ñ
+‚ª‚¢‚¶‚ñ
+‚©‚ß‚¢
+‚µ‚·‚½[
+‚¿‚ß‚¢
+‚´‚ñ‚¹‚Â
+‚ЂƂ±‚Æ
+‚±‚‚ɂ­
+‚Æ‚¤‚¨‚ñ‚¹‚ñ
+‚©‚ñ‚¨‚¯
+‚«‚ׂñ
+‚«‚¶‚å
+‚Ԃ‚è
+‚ß‚¢‚䂤
+‚©‚¸‚ç
+‚µ‚ñ‚Ï‚ñ
+‚Ђ傤‚ß‚ñ‚¶‚傤
+‚Í‚¢‚¨‚­
+‚Ô‚·‚¢
+‚©‚´‚ñ
+‚¹‚ñ‚ׂ¢
+‚¦‚¿‚¨‚Ò‚ 
+‚Ä‚¢‚¶‚Â
+‚±‚«‚イ‚«
+‚Ä‚ ‚¢
+‚µ‚å‚­‚¬‚傤‚Ñ‚å
+‚Ì‚¬‚­
+‚ЂƂ育‚Æ
+‚·‚¢‚³‚¢‚ª
+‚¦‚ñ‚¬‚è‚å‚­
+‚Ü‚ñ‚é‚¢
+‚¯‚ñ‚ß‚ñ
+‚³‚ñ‚¬‚¢‚ñ
+‚Æ‚­‚Ä‚ñ
+‚Ý‚ñ‚¼‚­
+‚°‚ñ‚ë‚ñ
+‚Ç‚µ‚Â
+‚±‚ñ‚Û
+‚µ‚Ⴖ‚傤
+‚Ö‚è
+‚Ó‚­
+‚Ý‚ã[
+‚©‚ª‚­‚¬‚¶‚ã‚‚¿
+‚µ‚å‚­‚Ԃ‚ä
+‚Í‚ñ‚ª‚­
+‚±‚ñ‚°‚Â
+‚³‚¤‚ñ‚Ç
+‚í‚ñ‚µ‚傤
+‚·‚¸‚è
+‚»‚ñ‚¾‚¢
+‚¢‚¢‚‚¯
+‚µ‚イ‚©‚ñ
+‚‚Ԃ¼‚ë‚¢
+‚Í‚ñ‚½‚¢‚Í
+‚®‚é‚è
+‚ ‚¹‚ñ‚Ô‚é
+‚¤‚í‚΂«
+‚È‚ñ‚Û‚¤
+‚Ä‚ñ‚¹‚¢
+‚»‚­‚¨‚ñ
+‚»‚³‚¦‚Ä‚¡
+‚¢‚Ù‚­
+‚Ý‚ñ‚Û‚¤
+‚¶‚ñ‚è‚ñ
+‚È‚Ü‚¯‚à‚Ì
+‚Ç‚¤‚è
+‚Ù[‚é
+‚©‚­‚Ô
+‚µ‚å‚­‚³‚ñ
+‚È‚Å‚µ‚±
+‚‚«‚í‚è
+‚¹‚«‚Æ‚¤
+‚¼‚ñ‚Ë‚ñ
+‚«‚傤‚Æ‚¤‚Ù
+‚Ä‚¢‚Ù‚ñ
+‚Æ‚¤‚Ђ±‚¤
+‚ë‚Ä‚¢
+‚µ‚ã‚«
+‚ä[‚à‚ç‚·
+‚¿‚イ‚悤
+‚±‚¤‚Ä‚«‚µ‚ã
+‚¢‚«‚悤‚悤
+‚¨‚»‚ê
+‚°‚«‚¶‚傤
+‚¯‚ñ‚³‚©‚ñ
+‚º‚ñ‚悤
+‚¯‚Á‚¿‚ñ
+‚«‚á‚ñ‚Ï‚·
+‚Ä[‚½
+‚Í‚ñ‚¯‚¢
+‚½‚­
+‚º‚ñ‚°‚ñ
+‚ä‚¿‚á
+‚ɂイ‚³‚ñ‚«‚ñ
+‚Ë‚¢‚«
+‚Ì‚±‚¬‚è
+‚肶
+‚®‚ñ‚΂¢
+‚º‚ñ‚ß‚ñ
+‚Í‚é‚à‚Ì
+‚µ‚ã‚¿‚イ
+‚¾‚Ñ
+‚¦‚ñ‚Ç
+‚¶‚イ‚¶‚©
+‚点‚ñ
+ƒD
+‚µ‚Ⴙ‚ñ
+‚µ‚ã‚­‚Î
+‚ЂƂÅ
+‚Ù‚ñ‚Ô‚¿‚傤
+‚©‚¢‚ª
+‚±‚­‚é‚¢
+‚µ‚Á‚¹‚¢
+‚²‚³‚ñ‚¯
+‚Þ‚±‚ñ
+‚¯[‚«
+‚¶‚ウ‚«
+‚Æ‚Á‚Ä
+‚ß‚¢‚³‚Â
+‚â‚ 
+‚«‚è‚©‚Ô
+‚²‚¼‚¤‚ë‚Á‚Õ
+‚³‚¬‚傤‚¢‚ñ
+‚Ú‚­
+‚¹‚«‚É‚ñ‚µ‚á
+‚©‚­‚µ‚ã
+‚Ì‚¤‚³‚¬‚傤
+‚¿‚悾
+‚©‚­‚°‚‚©‚ñ
+‚­‚¸‚à‚¿
+‚°‚Á‚©
+‚Í‚ñ‚Ç
+‚±‚¤‚ê‚Â
+‚É‚Á‚¿‚å‚­
+‚©‚ñ‚Ú‚¤‚¿‚傤‚©
+‚©‚ñ‚»
+‚µ‚¾‚¢
+‚Í‚¢‚«‚Ô‚Â
+‚½‚¢‚¢
+‚¶‚Á‚«
+‚½‚Ô[
+‚®‚ç‚Ü[
+‚Ó‚­‚µ‚イ‚ɂイ
+‚µ‚傾‚ñ
+‚¹‚Á‚¯‚¢‚µ
+‚°‚´‚¢
+‚Ü‚¢‚Ç
+‚±‚ñ‚½‚ñ
+‚µ‚傤‚¨‚ñ
+‚¤‚à‚¤
+‚Ù‚¤‚¦‚ñ
+‚¿‚®‚¤
+‚»‚±‚Ë
+‚±[‚È
+‚µ‚悤‚Ù‚¤
+‚µ‚á‚»‚¤
+‚¯‚¢‚낤
+‚¬‚傤‚ނ悤
+‚­‚ñ
+‚Ä‚ñ‚¶
+‚ç‚ñ‚¿
+‚È‚ñ‚Ä‚ñ
+‚¹‚ñ‚µ‚å‚­‚½‚¢
+‚µ‚¨‚Ý‚¸
+‚­‚ê
+‚ ‚Á‚©‚ñ
+‚í‚ê‚È‚ª‚ç
+‚µ‚傱‚­
+‚¹‚ñ‚à‚ñ‚µ
+‚¹‚ñ‚è‚å
+‚µ‚ã[‚¸
+‚Ì[‚Æ
+‚Ü‚¢‚Ù[‚Þ
+‚¢‚Á‚«‚å
+‚Ý‚Ì‚µ‚ë‚«‚ñ
+‚Ç‚¤‚ë
+‚Ö‚ñ‚¹‚¢
+‚ ‚¸‚©‚è‚«‚ñ
+‚³‚­‚‚¯
+‚Ђ½‚¢
+‚Ö‚è‚©‚é
+‚Ü‚ñ‚悤‚µ‚イ
+‚¹‚¢‚ê‚«
+‚ä‚É‚Ó‚§[‚Þ
+‚Ò‚ñ
+‚±‚Í‚é‚Ñ‚æ‚è
+‚©‚邵‚¤‚Þ
+‚ ‚΂ç‚â
+‚«‚å‚©‚µ‚傤
+‚µ‚ñ‚ª‚ç
+‚Ì‚Ý‚¿
+‚·‚¢‚µ‚傤
+‚ ‚È‚®‚ç
+‚¬‚傤‚·‚¤
+‚½‚­‚µ‚«
+‚©‚³‚­
+‚Ä‚ñ‚©‚ñ‚«
+‚­‚Ñ‚í
+‚©‚ñ‚½‚ñ
+‚²‚ª‚Â
+‚«‚á‚Ñ‚Ë‚Á‚Æ
+‚Ђª‚ñ
+‚Ђ¿‚傤
+‚±‚±‚낦‚ª‚¨
+‚ª‚¢‚©
+‚½‚¢‚©‚­‚¹‚ñ
+‚©‚¢‚Ù‚¤
+‚Ђ傤‚Ä‚ñ‚©
+‚½‚ñ‚É‚ñ
+‚µ‚ã‚­‚ª‚ñ
+‚Æ‚¤‚Ç
+‚¬‚µ‚ñ
+‚µ‚ã‚Á‚Ï‚ñ‚Ô
+‚è‚イ‚¹‚¢
+‚«‚è‚·‚Æ‚«‚傤
+‚Í‚ñ‚´‚¢‚µ‚á
+‚°‚ñ‚¿
+‚È‚¢‚ª‚µ‚ë
+‚¼‚­‚¹‚¢
+‚Í‚¸
+‚»‚¤‚³‚¢‚ñ
+‚¿‚á‚¢‚È
+‚¿‚á‚­‚È‚ñ
+‚Ђ¼‚­
+‚¢‚í‚¢‚«‚ñ
+‚®‚ñ‚µ‚イ
+‚¢‚Á‚µ‚傤‚¯‚ñ‚ß
+‚¹‚ñ‚Æ‚ç‚é
+‚©‚­
+‚ê‚ñ‚°
+‚Í‚±‚É‚í
+‚¢‚Ô‚­‚ë
+‚悤‚¯‚¢
+‚¶‚Ý‚ñ‚Æ‚¤
+‚¨‚È‚¶‚Ý
+‚«‚µ‚イ
+‚¶‚Ⴏ‚Á‚Æ
+‚¹‚ñ‚µ‚ñ‚±‚­
+‚½‚¢‚Ò‚·‚Æ
+‚µ‚á‚­‚悤‚µ‚å
+‚¯‚¢‚©‚­‚«‚å‚­
+‚Ù‚¤‚Þ‚µ‚傤
+‚«‚Ö‚¢
+‚¨‚¤‚¹‚ñ
+‚¶‚©‚ñ
+‚²‚º‚ñ
+‚ ‚Ý‚ß
+‚¶‚イ‚¢‚ª‚­
+‚±‚ñ‚¾‚ñ‚©‚¢
+‚¤‚¯‚É‚ñ
+‚«‚傤‚»‚¤‚è‚å‚­
+‚©‚ñ‚¹‚ñ
+‚Ó‚í‚­
+‚±‚Ë‚­‚½
+‚ ‚¯‚­‚ê
+‚ä‚©
+‚¨‚è‚΂±
+‚É‚Ê‚µ
+‚¯‚‚¬‚ ‚ñ
+‚³‚¢‚Ô‚Â
+‚¿‚傤‚¾‚¢
+‚¾‚µ‚ã
+‚°‚ñ‚΂ñ
+‚É‚ñ‚¶‚傤
+‚¯‚Á‚µ‚傤
+‚½‚µ
+‚«‚傤‚¯‚ñ‚т傤
+‚¿‚傤‚¶‚傤
+‚䂦‚É
+‚Ù‚¤‚Æ‚¤
+‚¼‚­‚ë‚ñ
+‚¼‚¤‚µ‚å‚­‚ë
+‚ç‚Þ‚¾
+‚«‚Å‚ñ
+‚Í‚½‚ç‚«‚Ä
+‚µ‚傤‚Ì‚¤
+‚±‚¤‚Þ‚¢‚ñ
+‚¿‚イ‚¢‚Ù‚¤
+‚«‚å‚Á‚¯‚¢
+‚Æ‚è‚â
+‚«‚µ‚à‚¶‚ñ
+‚·‚ë[‚ª‚ñ
+‚µ‚傤‚©‚«
+‚©‚¢‚¼‚¤‚Ç
+‚ ‚¨‚¶‚Ⴕ‚ñ
+‚µ‚«‚Ä‚ñ
+‚µ‚ã‚ñ‚¶‚イ
+‚µ‚Ä‚¢‚¹‚«
+‚«‚傤‚«‚á‚­
+‚²‚¤‚è
+‚Ô‚ñ‚Ç‚«
+‚¢‚È‚ñ
+‚悤‚¢‚ñ
+‚΂ñ‚Ë‚ñ
+‚©‚©‚è‚©‚ñ
+‚悤‚³‚ñ
+‚¾‚¢‚Ù‚ñ‚¦‚¢
+‚Æ‚è‚ ‚‚©‚¢
+‚­‚Ñ‚©‚´‚è
+‚¨‚¨‚©‚º
+‚Ü‚é‚Ú‚¤‚¸
+‚µ‚オ‚ñ
+‚킹‚¾
+‚Ë‚¤‚¿
+‚¾‚­‚è‚イ
+‚æ‚Â
+‚¬‚¶‚ã‚‚µ‚á
+‚µ‚炤‚¨
+‚Õ‚ë‚Ï‚ñ
+‚¹‚«‚¶‚イ‚¶
+‚¯‚ñ‚°‚ñ
+‚Å‚¢‚½‚ñ
+‚Í‚²‚½‚¦
+‚±‚¤‚´‚ñ
+‚±‚æ‚Ý
+‚¶‚¶‚å‚Å‚ñ
+‚É‚Á‚©‚ñ‚µ
+‚«‚¸‚È
+‚ß‚¢‚Ú
+‚¹‚ñ‚µ‚ñ
+‚Ù‚ñ‚Å‚ñ
+‚ä‚­‚Ä
+‚«‚イ‚¶‚ñ‚È‚ñ
+‚¦‚¢‚¹‚¢‚Ä‚«
+‚Ý‚ñ‚µ‚ã
+‚°‚ñ‚â
+‚Ó‚ñ‚»‚­
+‚·‚Û[‚Ä‚¡[
+‚©‚¨‚¤
+‚Ä‚Í‚¶‚ß
+‚Ä‚ñ‚©
+‚µ‚·‚Ä‚Þ
+‚¹‚‚Ԃñ
+‚Ï‚ç‚ê‚é
+‚³‚é
+‚è‚ñ‚µ‚å‚­‚©
+‚«‚傤‚Æ
+‚Ô‚Á‚±
+‚«‚ñ‚¢‚ñ
+‚䂤‚¿‚å
+‚±‚¤‚½‚­
+‚µ‚傲‚¤
+‚Þ‚¯
+‚Ú
+‚Ú‚¢‚ç
+‚Æ‚ç‚Ô‚é
+‚¨‚à‚à‚¿
+‚Ó‚¢‚Â
+‚·‚¢‚¤‚ñ
+‚µ‚傤‚µ‚å‚­
+‚«‚傪‚ñ
+‚¶‚傤‚¿‚å
+‚É‚Á‚¯‚¢‚Ђ傤
+‚µ‚å‚É‚¿
+‚±‚ñ‚³‚¢‚·
+‚Ù‚ñ‚à‚Ì
+‚­‚è‚ 
+‚¿‚傤‚¿‚傤
+‚·‚Ý
+‚Ù‚ñ‚¹‚«‚¿
+‚è‚ñ‚¬
+‚½‚‚܂«
+‚¯‚‚¢‚ñ
+‚Ì‚È‚©
+‚¹‚¶‚ñ
+‚«‚傤‚±‚­
+‚È‚¢‚«
+‚ç‚‚í‚ñ
+‚Í‚¢‚ä
+‚Æ‚¿‚傤
+‚Ú‚¤‚¾‚ñ
+‚¤‚è‚ ‚°‚«‚ñ
+‚¾‚¢‚Æ‚¤‚è‚傤
+‚½‚³‚¢
+‚Ë‚Ñ‚ç‚«
+‚©‚Ô
+‚»‚¤‚è‚傤‚¶
+‚Æ‚¤‚µ‚ñ‚¾‚¢
+‚¶‚傤‚Þ‚¢‚ñ
+‚Ђ̂¦
+‚µ‚å‚­‚ ‚ñ
+‚¦‚¢‚¬‚傤‚«‚å‚­
+‚±‚­‚Ù‚¤
+‚Ó‚Í‚¢
+‚¾‚¢‚Ó‚­
+‚í‚Ö‚¢
+‚¾‚¢‚È‚²‚ñ
+‚è‚ñ‚©‚ñ
+‚º‚ñ‚¿‚º‚ñ‚Ì‚¤
+‚Ï‚Ô
+‚¶‚Í‚ñ
+‚ӂ₶‚傤
+‚Ö‚ñ‚µ‚イ‚©
+‚±‚²
+‚¹‚ñ‚Ï‚ñ
+‚³‚ç‚«‚ñ
+‚¨‚¶‚å‚­
+‚Ä‚ñ‚·‚¤
+‚Ó‚Æ‚­‚Ä‚¢
+‚©‚¢‚µ‚å
+‚±‚¤‚¿‚傤‚©‚¢
+‚­‚³‚Ì
+‚«‚傤‚¯‚¢
+‚µ‚ê‚ñ
+‚Ç‚ñ‚±‚¤
+‚©‚Á‚Ï‚ñ
+‚³‚ñ‚¢‚ñ
+‚¢‚‚à
+‚ׂ·‚Æ‚¹‚ç[
+‚Ä‚ ‚µ
+‚Ä‚ñ‚à‚ñ
+‚±‚­‚Ú‚¤‚µ‚傤
+‚Ó‚¤‚µ‚á
+‚¢‚è‚傤‚Ð
+‚«‚ñ‚©‚ñ
+‚è‚­
+‚¨‚¨‚½‚«
+‚Ђà‚Æ
+‚¨‚·‚©[
+‚¼[‚ñ
+‚°‚«‚â‚­
+‚µ‚ñ‚ª‚¨
+‚Ô‚ª‚¢‚µ‚á
+‚Ö‚¢‚í
+‚©‚¸‚©‚¸
+‚˂‚è‚傤
+‚»‚¤‚³‚¢
+‚¶‚ザ‚ã‚Â
+‚¢‚‚É
+‚²‚¤‚Æ‚¤
+‚ç‚¢‚è‚ñ
+‚ ‚©‚Ý
+‚Ђ´‚à‚Æ
+‚ׂ¢‚µ‚ñ
+‚µ‚傤‚·‚¤‚Í
+‚Ó‚¡‚é‚Þ
+‚Ò‚ ‚Ì
+‚È[‚·
+‚µ‚ã‚ñ‚Ô‚ñ
+‚±‚¤‚©‚¢‚¼‚¤‚Ç
+‚ЂႭ
+‚¶‚イ‚µ‚ñ
+‚Ö‚¢‚«
+‚©‚Á‚½[
+‚Ó‚¹‚Á‚¹‚¢
+‚Å‚¡‚·‚©‚Á‚µ‚å‚ñ
+‚©‚µ‚‚¿‚µ
+‚µ‚Ä
+‚¹‚«‚è‚å‚­
+‚¯‚ñ‚°‚«
+‚ß‚µ‚½
+‚Å‚ñ‚ê‚¢
+‚È‚¢‚ç‚ñ
+‚«‚ê‚Â
+‚¶‚¬‚傤‚µ‚å
+‚¨‚Ó‚¹‚Á‚Æ
+‚¶‚å‚­‚ñ
+‚²‚µ‚«
+‚Ö‚¢‚«‚ñ‚¿
+‚«‚¹‚¢‚¿‚イ
+‚©‚Ç
+‚­‚ê‚æ‚ñ
+‚킵‚Â
+‚ ‚ç‚¢‚»
+‚µ‚å‚­‚¢‚ñ
+‚½‚Ü‚Ë‚¬
+‚°‚ñ‚±‚Â
+‚¯‚¢‚Å‚ñ‚«
+‚è‚ê[‚µ‚å‚È‚é
+‚«‚傹‚¢
+‚³‚¢‚º‚ñ‚¹‚ñ
+‚è‚傤‚Ó‚¤
+‚±‚¤‚µ‚å‚­
+‚·‚¤‚¹‚¢
+‚¨‚­‚¶‚傤
+‚¹‚ñ‚±
+‚È‚É‚²‚Æ
+‚Ù‚­‚悤
+‚ê‚ñ‚³
+‚»‚¤‚©‚¢‚â
+‚Ñ‚¶‚Ë‚·
+‚É‚·
+‚ ‚Ä‚¸‚¢‚è‚傤
+‚º‚ñ‚Ï‚ñ
+‚¹‚ñ‚´‚¢
+‚ê‚ñ‚è
+‚±‚¤‚®‚ñ
+‚Ù‚¤‚µ‚Ⴙ‚ñ
+‚±‚¢‚ñ‚ë‚Á‚©[
+‚«‚Ê‚½
+‚©‚­‚¹‚¢
+‚µ‚ñ‚¹‚«
+‚°‚Á‚Û‚¤
+‚Ó‚¤‚°‚Â
+‚Í‚ñ‚é‚¢
+‚©‚ñ‚³‚Â
+‚â‚Ü‚¬‚í
+‚Ç‚ç‚¢‚Î[
+‚¿‚イ‚¨‚ñ
+‚µ‚ñ‚°‚ñ‚¿
+‚µ‚オ[
+‚¨‚­‚È‚¢
+‚µ‚ã‚ñ‚»‚­
+‚½‚ñ‚µ‚á
+‚¢‚¿‚¾‚ñ
+‚¤‚ç‚à‚ñ
+‚»‚¤‚ß‚ñ
+‚ä‚Ý
+‚µ‚傤‚Ô‚ñ
+‚ ‚ç‚â
+‚¯‚ñ‚¿‚­‚µ
+‚»‚¤‚à‚ñ
+‚Ä‚ñ‚¶‚©‚¢
+‚ ‚«‚ê‚·
+‚Ç‚¤‚¶‚Â
+‚䂤‚¹‚¢
+‚®‚é
+‚Î[‚ê‚é
+‚‚¯‚à‚Ì
+‚½‚ñ‚¨‚ñ
+‚ª‚¢‚Þ‚µ‚傤
+‚ª‚¢‚½‚ß
+‚·‚Ø‚ 
+‚È‚¢‚Æ
+‚±‚Ä‚«‚½‚¢
+‚¢‚«‚ª‚¢
+‚ǂׂ¢
+‚¿‚­‚µ‚á
+‚¢‚È
+‚ç‚¢‚Ô‚ç‚è
+‚Æ‚Á‚«‚傯‚ñ
+‚¿‚傤‚è‚‚µ
+‚²‚¶‚イ‚¨‚ñ‚¸
+‚ ‚­‚¹‚ñ
+‚ª‚¢‚¯‚ñ
+‚¨‚¨‚µ‚¨
+‚¢‚»‚×
+‚Ù‚ñ‚»‚­
+‚Ђ̂à‚Æ
+‚±‚¢‚Ô‚Ý
+‚Ô‚Á‚Ò‚ñ‚º‚¢
+‚Ԃ炤‚ñ‚©‚ñ
+‚µ‚イ‚³
+‚¨‚ñ‚à‚Æ
+‚é‚¢‚µ‚å
+‚º‚ñ‚Ñ‚ñ
+‚¾‚­‚Ä‚ñ
+‚΂邱‚É[
+‚ ‚ñ‚Û
+‚¿‚イ‚±‚¤‚µ‚å‚­
+‚Ý‚¹‚Â
+‚è‚イ‚ª‚­‚¹‚¢
+‚½‚ñ‚¾‚¢
+‚È‚ê[‚µ‚å‚ñ
+‚²‚悤‚¨‚³‚ß
+‚Ђª‚¢‚µ‚á
+‚¢‚ñ‚½[‚ñ
+‚¢‚Á‚Ä‚ñ
+‚˂‚т傤
+‚´‚ñ
+‚Ђá‚Á‚©
+‚¿‚イ‚©‚­
+‚ׂ½
+‚±‚©‚Ô
+‚Ç‚¤‚¤
+‚­‚¿‚à‚Æ
+‚«‚å‚­‚Ç‚ß
+‚Ç‚¤‚©
+‚³‚¢‚Ú‚¤
+‚­‚Ñ
+‚Ü‚«‚¼‚¦
+‚¦‚¢‚è‚ñ‚«‚å‚­
+‚±‚ñ‚¢
+‚ß‚¢‚à‚¤
+‚¸‚±‚¤
+‚©‚ñ‚Ü‚Â
+‚݂傤‚¯‚¢
+‚Ç‚¤‚ª
+‚¾‚Ô‚è‚ã[
+‚í‚©‚Î
+‚Þ‚©‚¦
+‚悤‚µ‚å‚­
+‚Ü‚Ë[‚¶‚á
+‚Æ‚¤‚Í
+‚²‚ª‚­
+‚·‚¤‚¶‚­
+‚¾‚¢‚ ‚ñ
+‚¿‚傱
+‚©‚±‚ñ
+‚±‚¤‚¯‚‚ ‚Â
+‚µ‚傤‚¼‚­
+‚ǂ悤
+‚à‚Ì‚²‚±‚ë
+‚ ‚¢‚ׂÂ
+‚«‚ñ‚¿‚³‚ñ‚µ‚á
+‚΂Á‚Æ
+‚ ‚°‚à‚Ì
+‚¦‚ñ‚°‚¢
+‚Ñ‚Ú‚¤
+‚«‚á‚­‚ ‚µ
+‚â‚Ý‚ ‚ª‚è
+‚©‚Ù‚¤
+‚¨‚Æ‚ß
+‚Ü‚Ì‚ ‚½‚è
+‚¹‚ñ‚¶‚¿‚イ
+‚Å‚ñ‚µ‚±‚¤‚¬‚傤
+‚©‚¯‚¾‚µ
+‚«‚傤‚¬‚¶‚傤
+ƒo
+‚µ‚イ
+‚ ‚Ü‚ ‚µ
+‚µ‚傤‚¹‚‚©
+‚º
+‚»‚¤‚Ù‚ñ
+‚©‚‚¨‚Ô‚µ
+‚µ‚å‚«‚¿‚傤
+‚½‚ñ‚Æ‚¤‚ª‚¢
+‚¨‚¨‚²‚¦
+‚Å‚«‚¾‚©
+‚³‚¢‚³‚«
+‚¢‚¿‚イ
+‚©‚½‚¬
+‚Ü‚¢‚é‚Ç
+‚³‚Á‚©‚­
+‚¿‚á‚΂ñ
+‚Ђæ‚è
+‚Ղ炸‚Ü
+‚Í‚µ‚è
+‚°‚ñ‚Ò‚ñ
+‚µ‚½‚Ä
+‚©‚¼‚¦‚Ç‚µ
+‚º‚ñ‚µ
+‚µ‚ß‚ñ
+‚‚¶
+‚‚˂ÂË
+‚‚¤‚¿‚傤
+‚Í‚µ‚½
+‚¾‚ê
+‚ê‚¢‚Ë‚ñ
+‚¬‚Ú
+‚ނ炶‚イ
+‚«‚傤‚悤
+‚«‚á‚­
+‚æ‚è‚Ê‚«
+‚ ‚Ü‚Ì‚ª‚í
+‚â‚Ü‚´‚­‚ç
+‚«‚Ó‚«‚ñ
+‚¢‚³‚­
+‚³‚©‚È‚â
+‚¢‚ê‚¢‚³‚¢
+‚É‚Á‚«‚イ
+‚Ó‚­‚Ö‚«
+‚Ù‚µ‚ã
+‚Ý‚à‚ñ
+‚Ù‚­‚½‚ñ
+‚¬‚á‚­‚Ä
+‚­‚à‚è
+‚¢‚킨
+‚¿‚傤‚«‚å‚è
+‚ЂƂ ‚ß
+‚Ü‚ñ‚¼‚­‚©‚ñ
+‚¨‚ñ‚È‚à‚Ì
+‚±‚ñ‚µ‚ñ
+‚±‚·‚à‚·
+‚«‚傤‚Ö‚¢
+‚Ó‚ñ‚ɂイ
+‚©‚­‚Ë‚ñ‚è‚傤
+‚»‚¤‚¹‚Â
+‚ª‚¢‚¿
+‚»‚¤‚¢
+‚³‚ñ‚³‚ë
+‚‚肮
+‚ ‚Ô‚ç‚ ‚°
+‚µ‚ñ‚®‚é
+‚µ‚イ‚¦‚ñ
+‚Í‚³‚Ý
+‚µ‚ª‚¢
+‚·‚½‚¶‚¨
+‚䂤‚´‚¢
+‚Í‚¢‚­
+‚½‚©‚ç‚à‚Ì
+‚¢‚¢‚ñ‚¿‚傤
+‚¶‚傤‚²
+‚æ‚ñ‚Ô
+‚¨‚©‚°‚ñ
+‚¿‚á
+‚¹‚ñ‚Å‚ñ‚ª‚©‚è
+‚¨‚Ç‚è‚Î
+‚Í‚Ë‚Þ[‚ñ
+‚Ђ¾‚è‚Í‚µ
+‚µ‚á[‚Õ
+‚ɂ킵
+‚т傤‚­
+‚¨‚¢‚Å
+‚à‚ë‚Æ‚à
+‚Ê‚·‚Á‚Æ
+‚Æ‚¤‚½‚¢‚©‚¢
+‚µ‚ã‚Á‚Ï‚ñ
+ƒl
+‚Ë‚ª‚Ä‚¡‚Ô
+‚¯‚¢‚®
+‚Í‚ñ‚¦‚ñ
+‚¶‚イ‚¯‚¢
+‚Ü‚¿
+‚É‚µ‚©‚¢‚ª‚ñ
+‚낤‚Ú
+‚₵
+‚«‚å‚è‚©‚ñ
+‚Æ‚µ‚í‚·‚ê
+‚â‚Ü‚¢‚à
+‚Æ‚è‚Ђ«‚µ‚å
+‚É‚ñ‚°‚ñ‚Ý
+‚¤‚¶‚·‚¶‚傤
+‚²‚‚²‚¤
+‚¹‚¢‚¿‚イ
+‚Ê‚Ü
+‚ ‚Ô‚ç‚Ý
+‚³‚¤‚È‚Ô‚ë
+‚¶‚ã‚è‚傤‚µ‚傤
+‚»‚³‚ñ
+‚È‚ñ‚ª‚ñ
+‚©‚è‚Ê‚µ
+‚Æ‚¤‚©‚‚ª‚©‚è
+‚³‚½‚Å[
+‚±‚¤‚¶‚傤‚¹‚ñ
+‚Ó‚¤‚è‚å‚­
+‚Ü‚í‚è
+‚í‚肱‚Ý
+‚±‚Ü‚¢
+‚¢‚ñ
+‚µ‚ã‚Ó‚ê‚ñ
+‚¹‚·‚¶
+‚Ý‚Ü‚¢
+‚µ‚ë
+‚¯‚ñ‚ª‚¢
+‚¯‚¢‚è‚ñ
+‚Ä‚ñ
+‚Ç‚Ñ‚ñ
+‚悤‚¶‚傤
+‚¯‚¢‚¨‚ñ‚ª‚­
+‚ª‚¢‚Ђñ
+‚Ä‚à‚¿
+‚°‚ñ‚Ä‚¢‚΂ñ
+‚¿‚Ⴏ
+‚ ‚©‚ñ‚Ú‚¤
+‚È‚¬‚³
+‚±‚΂È
+‚¨‚¤‚µ‚Â
+‚±‚­‚ª‚¢
+‚µ‚ñ‚­‚ë
+‚à‚Ì‚©‚°
+‚±‚²‚Æ
+‚·‚¢‚Ç‚¤‚΂µ
+‚Ë‚è
+‚Ó‚Ä‚«‚Æ‚¤
+‚¢‚«‚å‚­
+‚½‚¢‚ª
+‚©‚µ‚í‚à‚¿
+‚«‚å‚­‚悤
+‚³‚¬
+‚±‚¤‚¶‚ª‚©‚è
+‚·‚¢‚½‚­
+‚Ý‚¬‚¤‚¦
+‚ӂЂ‚悤
+‚¶‚ã‚ñ‚΂ñ
+‚«‚傤‚³‚ñ‚Æ‚¤
+‚·‚ñ‚Ä‚Â
+‚Ç‚¤‚¬
+‚Ђ©‚­
+‚¯‚ñ‚¦‚«
+‚ ‚¢‚Ä‚ª‚½
+‚¶‚傤‚½‚ñ
+‚Ó‚µ‚ã
+‚ ‚‚¦‚ñ‚«
+‚ЂƂ¦
+‚©‚Ý‚«
+‚¢‚¿‚è‚Â
+‚µ‚Ⴕ‚傤
+‚µ‚ß‚Ñ
+‚¿‚イ‚©‚ª‚¢
+‚±‚ª‚炵
+‚¾‚ñ‚¶
+‚µ‚Æ‚¤
+‚±‚µ‚©‚½
+‚¾‚¢‚Ђ傤
+‚Ó‚­‚²‚¤‚²
+‚Ä‚«‚¢
+‚³‚¢‚µ‚イ‚©‚¢
+‚‚«‚ ‚½‚è
+‚µ‚è
+‚·‚ñ‚°‚ñ
+‚µ‚ñ‚³‚¢‚ñ
+‚¢‚«‚¿‚ª‚¢
+‚Ó‚¤‚º‚ñ
+‚ ‚í
+‚ª‚­‚µ‚á
+‚µ‚イ‚Í
+‚µ‚µ‚傤‚µ‚á
+‚‚Ƃ߂³‚«
+‚¶‚サ‚ñ‚«
+‚Ä‚«‚è‚傤
+‚æ
+‚¯‚Á‚¹‚«
+‚±‚¤‚µ‚ã
+‚¯‚Â
+‚¶‚­‚¬
+‚»‚¤‚¹‚«
+‚µ‚ñ‚Õ‚é
+‚«‚傤‚»‚¤‚è‚Â
+‚¢‚±‚¤
+‚³
+‚Ü‚Â
+‚«‚ñ‚è‚ñ
+‚È‚ß‚µ‚ª‚í
+‚¢‚ñ‚è‚å‚­
+‚킬‚è
+‚è‚å‚­‚¿‚á
+‚Ý‚Ç‚é
+‚Ñ[‚Þ
+‚¬‚傤‚Þ‚¶‚傤
+‚«‚´‚¢
+‚«‚â‚­
+‚Ô‚ñ‚¢
+‚Ù‚©
+‚¿‚イ‚µ‚Ⴖ‚傤
+‚©‚ë‚è[
+‚½‚µ‚å‚­
+‚©‚Ú‚¿‚á
+‚µ‚±‚¤‚è‚å‚­
+‚º‚ñ‚Æ‚¤
+‚킱‚¤
+‚µ‚ñ‚Ô‚Â
+‚±‚­‚Ó
+‚Û‚¯‚Á‚Æ
+‚³‚ñ‚Ý
+‚µ‚á‚©‚¢‚Æ‚¤
+‚µ‚ñ‚¶‚á
+‚ ‚­‚É‚ñ
+‚«‚å‚Ç‚¤
+‚­‚è[‚Þ
+‚Ì‚¤‚³‚ñ
+‚æ
+‚Ô‚ñ‚©‚¢‚Ì‚¤
+‚‚߂µ‚å
+‚µ‚イ‚¯‚ñ
+‚¿‚傤‚¨‚ñ
+‚«‚ñ‚¶
+‚Ä‚µ‚½
+‚±‚¤‚­
+‚Ñ‚µ‚ñ
+‚Í‚È‚¢‚«
+‚¶‚イ‚Ý‚ñ‚Ђ傤
+‚Ì‚¬
+‚¦‚¢‚¬‚傤‚ª‚©‚è
+‚¿‚傤‚è‚イ
+‚Ó‚è‚傤
+‚Ô‚Á‚¹‚¢
+‚à‚Å‚Þ
+‚µ‚ã‚¢‚ñ
+‚¤‚¢‚ñ‚®
+‚í‚Ó‚¤
+‚¹‚­‚½
+‚ЂƂÂ
+‚Ù‚Ä‚¢
+‚¦‚ñ‚¿‚イ
+‚¨‚â‚Ü
+‚í‚­‚ª‚¢
+‚è‚ñ‚©‚¢
+‚¶‚Á‚¹‚ñ
+‚¹‚Ý‚±‚ë‚ñ
+‚±‚ç‚Þ
+ƒB
+‚æ‚©
+‚¨‚è‚à‚Ì
+‚µ‚¼‚­
+‚»‚¤‚µ‚å
+‚µ‚è‚ñ‚¾[
+‚·‚¢‚¢‚«
+‚¬‚傤‚¹‚«
+‚­‚¾
+‚è‚イ‚µ‚傤
+‚³‚­‚â
+‚¸‚¦
+‚ԂЂñ
+‚«‚Ñ‚·
+‚¹‚Á‚Æ‚­‚è‚å‚­
+‚ ‚Ï[‚Æ
+‚©‚¬‚á‚­
+‚®‚ñ‚䂤‚©‚Á‚«‚å
+‚¹‚Á‚©‚¢‚ª‚ñ
+‚è‚傤‚ß
+‚«‚¿‚å
+‚µ‚á‚ñ‚Å‚è‚ 
+‚µ‚ã‚­‚µ‚á
+‚Ë‚ ‚¹
+‚µ‚Ⴞ‚ñ
+‚Æ‚¤‚Ô‚ñ
+‚²‚µ‚å‚­
+‚ ‚­‚ê‚¢
+‚¹‚¢‚¸
+‚¹‚«‚µ‚å‚­
+‚¿‚¦‚ñ
+‚µ‚ñ‚¹‚¢‚ª‚ñ
+‚¨‚₲
+‚¾‚ñ‚Æ
+‚¦‚¢‚¼‚¤
+‚‚¤‚³‚ñ
+‚Ê‚Ì‚¶
+‚¢‚¿‚Ü‚Â
+‚®‚¤‚º‚ñ
+‚¶
+‚Ï‚Ï
+‚­‚í‚¢‚ê
+‚¦‚ñ‚»
+‚Ù
+‚¿‚イ‚Ç‚¤
+‚Ù‚¤‚µ‚ñ
+‚ ‚ê‚邬
+‚·‚½‚ñ‚Ç
+‚©‚½‚Ú‚¤
+‚·‚¢‚Ù‚ñ
+‚«‚ñ‚悤
+‚ׂɂ 
+‚è‚傤‚¯‚¢
+‚ׂÁ‚¯‚¢
+‚°‚­‚¤
+‚΂ñ‚¿
+‚³‚Æ‚¨‚â
+‚ª‚»‚è‚ñ
+‚Å‚ñ‚µ‚¯‚¢‚³‚ñ‚«
+‚¾‚¢‚±‚¤‚Ô‚Â
+‚¿‚©‚Ç‚¤
+‚µ‚å‚Ä‚¢
+‚µ‚´‚¢‚ª‚©‚è
+‚Æ‚¤‚¢‚¶‚傤
+‚à‚­‚º‚ñ
+‚ ‚Ô‚ç
+‚Ý‚Ì
+‚«‚å‚­‚Ä‚ñ
+‚µ‚傤‚¶‚イ
+‚ЂƂ܂¦
+‚±‚­‚Ä‚Â
+‚à‚¶
+‚Ä‚ñ‚΂Â
+‚Ý‚æ
+‚µ‚ã‚Ä‚ñ
+‚¶‚ã‚ñ‚ë
+‚¿‚イ‚´‚¢‚µ‚å
+‚¨‚ñ‚¶‚傤
+‚¾‚¶‚傤‚©‚ñ
+‚¢‚ñ‚³‚ñ
+‚Æ‚¤‚Í‚Â
+‚悱‚â‚è
+‚¢‚¶‚Ð
+‚¢‚¿‚ê‚ñ
+‚¹‚ñ‚à‚ñ‚¢
+‚¬‚¶‚Ç‚¤
+‚·‚¦‚º‚ñ
+‚Ó‚µ‚ñ‚É‚ñ‚ ‚ñ
+‚®‚ñ‚º‚¢
+‚¹‚¢‚¼‚¤‚Ô
+‚µ‚¶‚イ‚­‚É‚¿
+‚͂‚¨‚ñ
+‚Ë‚ñ‚Õ
+‚Ó‚è‚傤‚¯‚ñ
+‚µ‚ã‚é‚¢
+‚«‚傤‚¢‚­‚«‚å‚­
+‚Ђ낤‚¦‚ñ
+‚ë‚Á‚©‚­
+‚¤‚ñ
+‚µ‚ã‚è‚イ‚Í
+ƒC
+‚¶‚Þ‚«‚å‚­
+‚©‚«‚傤
+‚Ü‚©‚ë‚É
+‚Ô‚à‚ñ‚ׂÂ
+‚ ‚Ä‚È
+‚¬‚è‚傤
+‚à‚à‚Ђ«
+‚³‚ñ‚Î
+‚µ‚¯‚ñ‚ª‚©‚è
+‚É‚µ‚ñ‚Æ‚¤
+‚¯‚¢‚µ‚ñ
+‚΂ê[
+‚­‚炵‚Á‚­
+‚½‚Ù‚¤‚ß‚ñ
+‚¾‚¢‚«‚傤
+‚·‚ñ
+‚µ‚ñ‚ª‚ñ
+‚©‚©‚­
+‚±‚ª‚¢‚µ‚á
+‚µ‚á‚©‚¢‚¹‚¢
+‚©‚Ȃ¿
+‚¹‚¢‚±‚¤‚¤‚Ç‚­
+‚Ó‚¹‚¢‚è‚Â
+‚µ‚イ‚ɂイ
+‚¢‚²
+‚µ‚ë‚­‚¶‚¿‚イ
+‚­‚¿‚Ñ
+‚Ô‚ñ‚¹‚«‚«
+‚¶‚‚낭
+‚䂤‚¶‚å
+‚¢‚¿‚¸
+‚Ô‚ç‚ñ‚Ç
+‚ä‚Ý‚¸
+‚¼‚­‚¶
+‚Ú‚â
+‚¡
+‚Æ‚¢‚µ
+‚®‚ë[‚΂é
+‚«‚イ‚«‚ñ
+‚°‚ñ‚µ‚è‚ñ
+‚¢‚µ‚«‚Ó‚ß‚¢
+‚½‚¶‚Â
+‚©‚ñ‚í
+‚±‚Ç‚à
+‚Ó‚¿‚傤
+‚Å‚Ü‚©‚¹
+‚°‚ñ‚±‚¤
+‚¢‚Á‚µ‚á‚­
+‚±‚¤‚¬‚傤‚µ‚å
+‚Õ‚ë‚Ó‚¥‚Á‚µ‚å‚È
+‚½‚¢‚É‚¿
+‚µ‚Ⴕ‚ñ‚©
+‚ ‚¢‚¾
+‚¤‚ñ‚è‚傤
+‚µ‚á‚©‚¢‚ß‚ñ
+‚Ü‚¦‚ª‚Ý
+‚Õ‚ë‚®‚ç‚Ü
+‚©‚¢‚·‚¢‚æ‚­
+‚°‚©‚¢
+‚©‚Á‚©‚¢
+‚ ‚Ó‚½‚Ê[‚ñ
+‚ ‚ñ‚²‚¤
+‚«‚â‚è
+‚݂‚Ç
+‚Í‚¾‚¢‚ë
+‚¨‚‚µ‚ã
+‚½‚¢‚è‚á‚­
+‚¯‚ñ‚®
+‚¶‚ñ‚»‚­
+‚¹‚¢‚³‚ñ‚©
+‚¦‚¢‚¼‚¤‚Ô‚Â
+‚è‚傤‚Æ‚¤
+‚ª‚­‚µ‚«
+‚¿‚¿
+‚±‚¹‚¢
+‚Ë‚Í‚ñ
+‚µ‚«‚à‚Ì
+‚ª‚¢‚¦‚ñ
+‚Ó‚¥[‚·
+‚É‚¹‚³‚Â
+‚Ç‚¤‚«
+‚µ‚½‚¤‚¯‚ª‚¢‚µ‚á
+‚¢‚¿‚ç‚ñ‚¹‚¢
+‚½‚¢‚¹‚ñ
+‚·‚¢‚ª‚ç
+‚¶‚ã‚ñ‚ ‚¢
+‚µ‚¸‚¯‚³
+‚Æ‚¤‚ ‚ñ
+‚½‚»‚ª‚ê
+‚Ô‚ê[‚ñ
+‚Ђ傤‚¹‚Â
+‚©‚‚₭‚«‚ñ
+‚¶‚á‚ñ‚­
+‚©‚ñ‚¼‚¤
+‚»‚¤‚¹‚¢
+‚µ‚¹‚‚©
+‚Ô‚Á‚Ò‚ñ
+‚¢‚è‚悤
+‚µ‚イ‚½‚ñ
+‚±‚¤‚«‚イ
+‚µ‚å‚Ý‚ñ
+‚ ‚°‚¼‚±
+‚«‚傤‚¾‚ñ
+‚ЂЂ傤‚©
+‚ ‚¨‚Î
+‚¶‚イ‚¹‚¢
+‚©‚ñ‚«‚イ
+‚Ý‚·‚Ý
+‚«‚à‚ñ
+‚½‚ñ‚³‚¢
+‚¤‚¡‚ñ‚®
+‚ ‚­‚Ö‚¢
+‚Ó‚Ÿ‚ñ‚­‚µ‚å‚ñ
+‚¿‚傤‚½‚ñ
+‚‚è‚Ç‚±
+‚°‚¶‚å
+‚±‚·‚¢
+‚Ä‚ñ‚µ‚ã
+‚±‚­‚º‚¢‚«‚å‚­
+‚µ‚Ⴈ‚ñ‚©‚¢
+‚¹‚Á‚¯‚Á‚«‚イ
+‚΂¢‚ñ‚¾
+‚¿‚傤‚è‚Â
+‚Í‚ñ‚·‚¢
+‚Æ‚ç‚ñ‚·
+‚±‚Ü‚Â
+‚©‚ç‚­‚³
+‚©‚Ç‚¤‚è‚Â
+‚µ‚«‚ñ‚®‚è‚Ђ傤
+‚³‚ñ‚©
+‚¹‚¢‚¶
+‚¢‚ñ‚¶‚¯[‚½
+‚¦‚ 
+‚䂤‚®‚ñ
+‚¯‚‚¾‚ñ‚è‚å‚­
+‚ ‚¸‚©‚肵‚傤
+‚¢‚½‚µ‚©‚䂵
+‚¶‚ã‚ñ‚«‚傤
+‚µ‚Í‚·
+‚«‚ñ‚ª
+‚®‚ñ‚ë‚ñ
+‚¶‚²‚­
+‚µ‚å‚­‚Ô‚Â
+‚ê‚Á‚Æ‚¤
+‚¨‚¤‚Ó‚¤
+‚¶‚å‚â‚­
+‚Ó‚¸
+‚¨‚¨‚Í‚Î
+‚³‚¬‚傤‚Î
+‚¶‚á‚ñ‚Ï[
+‚Ä‚¢‚Ú‚­
+‚Ó‚¤‚¯‚¢
+‚¬‚イ‚ɂイ
+‚»‚ç‚Ý‚Ý
+‚½‚¢‚¬‚ß‚¢‚Ô‚ñ
+‚ª‚­‚è‚å‚­
+‚Ì‚¤‚¬‚傤
+‚´‚±‚¤
+‚µ‚‚łñ
+‚ß‚¿‚é
+‚Þ‚è‚傤
+‚Í‚©‚ç‚¢
+‚°‚ñ‚¬‚傤
+‚¿‚傤‚µ‚å
+‚©‚¨‚¶‚Ⴕ‚ñ
+‚¢‚­‚Ç‚¤‚¨‚ñ
+‚©‚¼‚­
+‚Ý‚º‚É
+‚ׂ¢‚¶‚ã
+‚¶‚ã‚ñ‚¶‚Â
+‚Ђ±‚¤‚µ
+‚É‚«
+‚Å‚Ì‚Ý‚Ë[‚µ‚å‚ñ
+‚¯‚ª‚ê
+‚­‚킽
+‚ ‚Ƃ܂킵
+‚Ó‚ß‚¢
+‚낤‚Þ‚©
+‚¹‚Á‚Æ‚¤‚²
+‚Ù‚ñ‚²‚µ
+‚ç‚ñ‚©‚­
+‚Ú‚¤‚è‚á‚­
+‚¯‚ñ‚½‚¢‚«
+‚Ñ‚É[‚é
+‚µ‚ª‚­
+‚¢‚¸‚Ü‚¢
+‚Ä‚Ü‚¦
+‚±‚Ü‚½
+‚Ê‚Ì‚¹‚¢
+‚®‚ñ‚¹‚¢
+‚¨‚낵‚»‚¤‚Î
+‚Ô‚ñ‚©‚µ
+‚½‚ñ‚É
+‚¢‚¿‚°‚ñ
+‚¨‚ä
+‚»‚¤‚Ù‚ñ‚¯
+‚¢‚¢‚Ô‚ñ
+‚à‚¿‚Ô‚ñ
+‚Ý‚è‚Î[‚é
+‚©‚ñ‚Ý‚ñ
+‚©‚¤‚ñ‚½
+‚Ð
+‚¿‚ ‚ñ
+‚©‚¯‚Ë
+‚¤‚µ‚ë‚·‚ª‚½
+‚Ñ‚»‚¤
+‚²‚©‚ñ‚¹‚¢
+‚«‚イ‚悤
+‚±‚¤‚ª‚­‚ê‚«
+‚È‚¢
+‚¾‚¢‚«‚Ú
+‚Ç‚±
+‚µ‚ã‚­‚½‚¢
+‚±‚Ô‚Æ‚è
+‚ä‚Ý‚â
+‚³‚¶‚ã‚Â
+‚¶‚イ‚¬‚傤‚¢‚ñ
+‚Ý‚ñ‚Æ
+‚Ó‚¤‚Ô‚Â
+‚¿[‚¸
+‚Ñ
+‚´‚ñ‚Þ
+‚è‚­‚ë
+‚º‚‚¾‚¢
+‚²‚Æ‚¤
+‚±‚΂Ȃµ
+‚±‚³‚ß
+‚µ‚©‚Â
+‚Í‚¢‚´‚ñ
+‚Ý‚±‚Æ
+‚â‚Ü‚®‚É
+‚·[‚Â
+‚Ô‚ê[‚©
+‚¹‚ñ‚à‚ñ‚Ä‚ñ
+‚©‚­‚¶
+‚µ‚ñ‚Ï‚¢
+‚¯‚ñ‚¹‚¢
+‚°‚Á‚µ‚á
+‚Ö‚¢‚³‚­
+‚º‚ñ‚«‚Ü‚Â
+‚µ‚ケ‚¤
+‚¢‚¼‚ñ
+‚¨‚͂悤
+‚Í‚¬‚傤
+‚©‚¢‚ê‚¢
+‚µ‚½‚Þ‚«
+‚È‚Ü‚«
+‚µ‚»‚¤‚©
+‚¨‚ñ‚È
+‚É‚­‚¬‚イ
+‚«‚Ë‚Ü
+‚µ‚ã‚Ú‚¤‚µ‚á
+‚©‚ñ‚¹‚¢‚Æ‚¤
+‚µ‚µ‚Â
+‚Ä‚Æ‚ë‚ñ
+‚¦‚¿‚¸
+‚»‚¤‚¤‚ñ
+‚È‚ª‚Ë‚ñ
+‚½‚ñ‚Ï‚Â
+‚°‚«‚è‚ñ
+‚«‚è‚Ó‚«
+‚»‚¤‚à‚Æ‚¶‚ß
+‚±‚¤‚è‚Ü‚í‚è
+‚È‚«‚²‚Æ
+‚½‚Î
+‚Ì‚µ‚ª‚Ý
+‚ڂЂ傤
+‚¶‚ã‚ñ‚®‚è
+‚µ‚è‚ ‚é
+‚Ý‚µ‚å‚è
+‚º‚ñ‚¢‚ñ
+‚¨‚ ‚炽‚ß
+‚»‚¤‚»‚Ú
+‚Þ‚¬
+‚«‚½‚¢‚¿
+‚ ‚¨‚€
+‚©‚¢‚¶‚傤
+‚Ä‚ñ‚É‚å
+‚Ý‚Â
+‚Å‚Ó‚ê[‚µ‚å‚ñ
+‚¤‚¯‚Ý
+‚¦‚ñ‚©‚¢
+‚¬‚傤‚Þ‚Ô
+‚ ‚¾‚Õ‚½
+‚Ú‚­‚µ
+‚¢‚³‚¢
+‚Ù‚±‚³‚«
+‚°‚ñ‚Æ‚¤
+‚³‚¢‚â‚­
+‚¢‚µ‚ñ
+‚Ü‚Ç‚ª‚í
+‚µ‚å‚Æ‚­
+‚Ó‚¹‚ñ
+‚»‚¤‚΂ñ
+‚è‚ë‚ñ‚©
+ƒ€
+‚Ä‚ñ‚®
+‚·‚¢‚Ù‚¤
+‚É‚ñ‚»‚­
+‚₯‚¢
+‚­‚ê[‚Þ
+‚µ‚¶‚µ‚á
+‚Ó‚­‚ñ
+‚Ù‚ñ‚ª‚ñ
+‚«‚ñ‚䂤
+‚½‚Í
+‚±‚¤‚¿‚á
+‚ ‚«‚΂±
+‚¹‚¢‚µ‚ñ‚т傤
+‚Ó‚º‚¢
+‚³‚«‚¯
+‚¹‚‚Ñ
+‚à‚ë
+‚ª‚­‚Ç‚¤
+‚悤‚´‚¢
+‚¾‚ñ‚©
+‚Ý‚¿
+‚¤[‚Ü‚ñ
+‚Ђ«‚Ç
+‚¯‚ñ‚«‚イ‚©
+‚Ó‚Þ‚«
+‚à‚ñ‚Ô‚¾‚¢‚¶‚ñ
+‚ß‚ ‚Ä
+‚â‚΂ñ
+‚½‚¢‚ׂ¢
+‚Å‚ñ‚Å‚ñ
+‚±‚ ‚´
+‚º‚Ð
+‚Ö‚¢‚±‚¤‚º‚¢
+‚ª‚­‚¾‚ñ
+‚à‚­‚ë‚­
+‚³‚ñ‚©‚­‚¯‚¢
+‚â‚È
+‚¿‚ã[‚É‚ñ‚®
+‚µ‚å‚Á‚­
+‚Ñ[‚é‚¢
+‚µ‚ª‚¢‚¿
+‚Ý‚Á‚¿‚á‚ñ
+‚±‚¤‚¦‚ñ
+‚¢‚Ô‚«
+‚¶‚イ‚Ä‚¢
+‚¬‚傤‚´
+‚¦‚ñ‚µ
+‚¸
+‚©‚ñ‚µ‚傤
+‚Ó‚ñ‚½‚¢
+‚è‚Ë‚ñ
+‚©‚ê‚ñ
+‚È‚ñ‚©‚¢
+‚¼‚­‚Ë‚ñ
+‚º‚¢‚Þ
+‚«‚傤‚Ý
+‚©‚Æ‚è‚Á‚­
+‚¯‚ñ‚¿‚­‚©
+‚º‚ñ‚°‚‚܂Â
+‚©‚ñ‚·‚¢
+‚·‚¶‚¿‚ª‚¢
+‚Ì‚¤‚©‚¢
+‚т傤‚Ô
+‚Í‚Á‚¯‚Á‚«‚イ
+‚±‚¯‚Â
+‚Ä‚¢‚·‚¤
+‚Ý‚²‚낵
+‚°‚¢‚µ‚á
+‚à‚¿[‚Ó
+‚ɂイ‚ª‚­‚µ‚«
+‚¶‚‚¢
+‚¨‚à‚É
+‚¨‚¤‚è‚ñ
+‚¢‚ñ‚Æ‚¤
+‚¯‚Î
+‚«‚ê‚ß
+‚Ђ¾‚肤‚¦
+‚è‚Ó‚¾
+‚©‚¢‚°‚ñ‚ê‚¢
+‚¦‚¢‚Ì‚¤
+‚ ‚µ‚ ‚Æ
+‚©‚»
+‚±‚Æ‚è
+‚Ä‚ª‚½
+‚ ‚¢‚«‚á‚­
+‚¶‚‚܂¢
+‚Ù‚¤‚©‚ñ
+‚È‚È
+‚Ô‚Á‚³‚ñ
+‚©‚­‚Ö‚«
+‚ׂñ‚¿‚á[
+‚©‚½‚Ü‚è
+‚¯‚É‚ 
+‚¦‚«‚µ‚傤
+‚Ä‚ñ‚â‚à‚Ì
+‚¾‚¢‚²
+‚µ‚ã‚©‚ñ
+‚ ‚©‚Å‚ñ‚í
+‚É‚í
+‚É‚ñ‚»‚¤
+‚Ù‚¤‚¶‚傤
+‚Æ‚¤‚È‚¢
+‚º‚º‚ЂÐ
+‚³‚¢‚¶‚å
+‚Ñ
+‚¢‚¶‚í‚é
+‚½‚ñ‚²
+‚났‚ñ
+ƒb
+‚Ì‚ñ‚¿‚á‚ñ
+‚¯‚ñ‚³‚ª‚©‚è
+‚¹‚Á‚¯‚¢
+‚¹‚ß‚ñ‚Æ
+‚悹‚ñ
+‚΂¯‚ñ
+‚¢‚¿‚¶‚傤
+‚¯‚ª‚í
+‚µ‚ñ‚¤‚ñ
+‚±‚Á‚Æ‚¤
+‚É‚¾‚¢
+‚Ù‚ñ‚»‚¤
+‚Í‚½‚ß
+‚²‚ׂñ‚½‚Â
+‚Í‚Ë
+‚Þ‚É‚ñ‚µ‚å
+‚µ‚傤‚µ‚á
+‚¶‚傤‚è‚å‚­‚¶‚ã
+‚è‚Á‚µ‚イ
+‚䂪‚í
+‚Ó‚¡‚­‚µ‚å‚ñ
+‚³[‚Î[
+‚¦‚Í‚ª‚«
+‚¿‚­‚Å‚ñ‚¿
+‚©‚¢‚í‚¢
+‚µ‚«‚»‚¤
+‚®‚è[‚ñ
+‚ª‚­‚Ä‚ñ
+‚è‚á‚­‚²
+‚µ‚ñ‚³‚ñ
+‚Ä‚¬‚í
+‚¾‚¢‚¦‚Á‚Æ
+‚Æ‚¬‚ñ
+‚º‚Á‚±‚¤
+‚Ђª‚µ‚©‚º
+‚Í‚ª‚Ë
+‚ª‚¢‚Æ‚¤‚µ‚á
+‚µ‚á‚È‚¢‚Ù‚¤
+‚µ‚炱
+‚«‚«‚¤‚Å
+‚¯‚Á‚¹‚¢
+‚±‚ñ‚¶‚«
+‚½‚ñ‚à‚Ì
+‚¹‚¢‚µ‚傤‚Ђñ
+‚Ë‚Ä‚¢‚Æ‚¤
+‚Í‚­‚µ‚å
+‚±‚¶‚イ‚Æ
+‚¿‚Á‚­
+‚µ‚ゲ
+‚ª‚¢‚Å‚ñ
+‚È‚Õ‚«‚ñ
+‚Ä‚Ê‚«
+‚Ü‚ñ‚悤
+‚¶‚ã‚ñ‚Ô‚ñ
+‚©‚­‚È‚¢
+‚Ù‚ñ‚¾‚¢
+‚Í‚È‚µ‚©
+‚±‚à‚Ì
+‚Ղ낹‚Á‚³
+‚¶‚Ð
+‚¾‚ñ‚ª‚¢
+‚²‚½‚悤‚¿‚イ
+‚è‚å‚»‚¤
+‚Ђã[‚¸
+‚¹‚¢‚´‚¢
+‚½‚¾‚µ‚ª‚«
+‚¯‚²‚ñ
+‚‚¤‚µ‚ñ‚ª‚©‚è
+‚ê‚¢‚ñ‚Ú[
+‚¹‚¢‚ ‚ñ
+‚¦‚¶‚«
+‚Ù‚¤‚¨‚¤
+‚±
+‚µ‚ñ‚è
+‚¶‚à‚­
+‚½‚¢‚µ‚©‚ñ
+‚¤‚í‚ß
+‚ê‚«‚¹‚¢
+‚Æ‚¤‚ä
+‚´‚¢‚ß‚¢
+‚µ‚ñ‚¿
+‚肪‚­
+‚Ö‚ñ‚µ‚イ‚ª‚©‚è
+‚²‚Í‚ñ
+‚낤‚¶‚傤
+‚¹‚ñ‚«‚å‚­
+‚µ‚ã‚Á‚Ï‚ñ‚©
+‚º‚ñ‚©‚­
+‚ ‚·
+‚¬‚á‚ñ‚Ô‚é
+‚µ‚¿‚È‚ñ
+‚±‚µ‚«
+‚ [‚Ä‚¡‚·‚Æ
+‚Æ‚¤‚‚¤
+‚à‚­‚´‚¢
+‚¨‚Æ‚µ‚ ‚È
+‚É‚Á‚Û‚ñ
+‚¨‚«‚È‚©‚µ
+‚È‚¢‚©‚ñ
+‚­‚ç
+‚¶‚Ü‚¦
+‚Ђª
+‚µ‚å‚­‚Ù‚¤
+‚³‚‚½‚Î
+‚¹‚«‚Ð
+‚¿‚傤‚Ô
+‚»‚¤‚º‚¢
+‚è‚­‚¤‚ñ‚«‚å‚­
+‚±‚¤‚³‚¢
+‚µ‚傤‚è‚å‚­
+‚¢‚Á‚³‚­
+‚­‚è‚É‚Á‚­
+‚䂵‚ã‚‚©
+‚Æ‚­‚¬
+‚Ç‚¤‚í
+‚¯‚ñ‚Ú‚¤‚µ‚傤
+‚Ù‚ ‚ñ‚«
+‚¹‚¢‚Ђñ
+‚¦‚¢‚±‚­
+‚à‚Ì‚¨‚Ú‚¦
+‚¾‚©‚¢‚³‚­
+‚à‚Á‚¿‚á‚ñ
+‚ ‚ׂÁ‚­
+‚µ‚ã‚­‚µ
+‚½‚É‚ñ‚¬‚傤‚¬
+‚²‚µ‚悤
+‚Í‚Í‚©‚½
+‚Ú‚¤‚¢
+‚¨‚¨‚à‚Æ
+‚¯‚¢‚¸
+‚¹‚«‚²
+‚¶‚傤‚Ô‚ñ
+‚±‚·‚à‚ۂ肽‚ñ
+‚Ü‚µ‚ñ
+‚¯‚ñ‚¶‚イ
+‚Ú[‚é
+‚Ä‚ñ‚è‚«‚傤
+‚‚¤‚µ‚ñ‚Ô
+‚µ‚傤‚©‚¢
+‚³‚ñ‚³
+‚Æ‚Ü‚è
+‚¢‚µ‚ã
+‚Ü‚¤‚·
+‚ ‚³‚ª‚½
+‚¢‚ñ‚ӂ邦‚ñ‚´
+‚­‚Ú‚¿
+‚¶‚イ‚½‚­‚¿
+‚©‚ñ‚»‚ñ
+‚©‚¶‚Î
+ƒy
+‚ç‚ñ‚«‚è‚イ
+‚«‚傤‚¶‚傤
+‚É‚é‚¢
+‚µ‚ñ‚¯‚¢‚‚¤
+‚¤‚¿‚©‚¯
+‚‚¤‚ê‚¢
+‚Ö‚«‚ª
+‚¢‚Á‚¹‚«
+‚ ‚ç‚à‚Ì
+‚Î
+‚¶‚傤‚«‚á‚­
+‚è‚傤‚ß‚ñ
+‚µ‚¿‚²‚³‚ñ
+‚΂ñ‚ª‚¢
+‚ ‚é‚Æ
+‚Ç‚é
+‚ׂÁ‚µ
+‚Ö‚¢‚º‚¢
+‚Ý‚¸‚à‚Ì
+‚¯‚µ‚¸‚Ý
+‚«‚¯‚ñ
+‚»‚Ì‚±‚Æ
+‚¹‚ñ‚·‚¢‚т傤
+‚·‚¤‚è‚傤
+‚Í‚Á‚¯‚‚т傤
+‚±‚䂤‚ß‚¢‚µ
+‚è‚ë‚ñ
+‚¢‚ë‚Í
+‚¶‚䂤‚ª‚½
+‚¤‚¿‚Å‚µ
+‚±‚Ý
+‚­‚‚í
+‚«‚イ‚ç‚­
+‚䂦‚ñ
+‚ß‚¾‚é
+‚悤‚Ú‚¤
+‚µ‚ザ‚傤
+‚­‚Ç‚­
+‚¨‚­‚³‚Ü
+‚½‚ñ‚悤
+‚·‚¢‚¢
+‚¨‚¨‚Ü‚½
+‚Ú‚Â
+‚ç‚¢‚µ‚イ
+‚Æ‚¤‚Ù‚ñ
+‚â‚Ü‚²‚â
+‚ç‚¢‚Å‚ñ
+‚µ‚ñ‚³‚Ô
+‚µ‚É‚¹
+‚¢‚Á‚µ‚イ‚Ë‚ñ
+‚Ù‚¿‚傤
+‚µ‚¨‚º
+‚º‚¢‚Þ‚©
+‚Ä‚¢‚©‚­
+‚Ä‚È‚°‚¾‚ñ
+‚¿‚傤‚肵
+‚±‚±‚ë‚¢‚«
+‚¾‚¤
+‚«‚傤‚µ‚ñ‚´‚¢
+‚Ó‚Ä‚¬‚í
+‚µ‚°‚ñ
+‚°‚©‚ñ
+‚»‚¦‚ñ
+‚¶‚«‚イ‚»‚¤
+‚µ‚è‚Â
+‚µ‚ ‚ñ
+‚¢‚«‚à‚Ì
+‚¹‚ñ‚Ô
+‚ç‚Á‚µ‚ã
+‚·‚¢‚Ç‚¤‚«‚å‚­
+‚Ç‚«
+‚±‚¤‚‚¤‚Ð
+‚«‚傤‚Ç‚¤‚½‚¢
+‚Ü‚¢‚«
+‚ß‚­‚ç
+‚ЂÁ‚©
+‚¤‚·‚¶
+‚±‚ñ‚·‚½‚ñ‚Æ
+‚â‚È‚¬‚²‚µ
+‚ª‚ñ‚ß‚ñ
+‚Ä‚Á‚¹‚ñ
+‚Ù‚ñ‚¶‚傤
+‚Ђ傤‚±‚¤
+‚Ä‚ñ‚Ò
+‚·‚Æ[‚ñ
+‚ЂƂÜ
+‚¹‚ñ‚¶‚傤
+‚ª‚ñ‚Ø‚«
+‚±‚¾‚¢
+‚«‚Ä‚«
+‚Ý‚ñ‚Ú‚¤
+‚ª‚ñ‚¹‚«
+‚³‚ñ‚«‚á‚­
+‚¦‚ ‚Û[‚Æ
+‚©‚Á‚Û‚¤
+‚ׂ‚­‚¿
+‚悤‚à‚¤
+‚«‚イ‚Þ
+‚»‚¤‚±‚¤‚©‚¢
+‚±‚¤‚ª‚­
+‚낶
+‚Ö‚ñ‚Ç‚¤‚è‚Â
+‚킱‚¤‚Ç
+‚¿‚ñ‚‚¤‚´‚¢
+‚æ‚°‚ñ
+‚¯‚¢‚æ‚ñ
+‚µ‚á‚Ó‚¤
+‚½‚Ä‚Ó‚¾
+‚ê‚ñ‚µ
+‚Ù‚¤‚è‚傤
+‚¾‚¢‚¢‚¿‚ª‚©‚è
+‚¹‚ñ‚¬‚傤
+‚Ђ傤‚©
+‚¨‚¨‚Í‚Ü
+‚¯‚ñ‚¶‚á
+‚Ô‚ñ‚´‚¢
+‚±‚¤‚Ä‚¢‚Ô‚ ‚¢
+‚¶‚Á‚µ‚Â
+‚ ‚â‚Ü‚¿
+‚Ç‚¤‚¨‚ñ
+‚«‚¿‚¶‚Â
+‚Ђ©‚¦‚µ‚Â
+‚Ó‚Ÿ‚¢‚È‚é
+‚º‚ñ‚µ‚å‚­‚¢‚ñ
+‚ӂт傤‚Ç‚¤
+‚Ü‚½
+‚Æ‚¤
+‚½‚¢‚¹‚¢
+‚¢‚Ú
+‚Ý‚È‚è
+‚¹‚ñ‚µ‚ã
+‚æ‚т傤
+‚¾‚¢‚µ‚ñ‚³‚¢
+‚è‚イ
+‚¶‚傯‚¢
+‚±‚ª‚½
+‚Æ‚­‚Í‚ñ‚Ô
+‚ª‚т傤
+‚µ‚´‚¢‚Ô
+‚Ü‚Ë‚«‚Ë‚±
+‚¹‚ñ‚µ‚イ‚ç‚­
+‚܂‚΂¦
+‚ ‚ñ‚³‚ñ‚Ô‚é
+‚Æ‚Ñ‚µ‚å‚­
+‚±‚¤‚­‚ñ
+‚Ì
+‚Ä‚¢‚µ‚á‚­
+‚©‚½‚ñ
+‚±‚¤‚²
+‚¦‚¢‚«‚イ‚Ä‚«
+‚¿‚傤‚Í‚ñ
+‚±‚¤‚¬‚傤‚悤
+‚Õ‚ç‚·‚¿‚Á‚­
+‚±‚¤‚±‚Â
+ƒK
+‚Å‚¡[‚ç
+ƒO
+‚¿‚ñ‚¹‚¢
+‚͂‚Ë
+‚æ‚­‚Ë‚ñ
+‚è‚傤‚悤‚¶‚å
+‚«‚ñ‚±
+‚«‚å‚Þ
+‚«‚Ü‚Ü
+‚悤‚°‚ñ
+‚µ‚á‚­‚Ó
+‚¿‚傤‚Ç
+ƒj
+‚µ‚ñ‚¯‚¢‚©
+‚܂‚Ԃñ
+‚¨‚­‚¬
+‚®‚ç‚Ó
+‚¶‚³
+‚Ü‚¢‚É‚¿
+‚«‚á‚ç‚­‚½
+‚©‚¢‚±‚µ
+‚³‚Í
+‚Ñ‚Ë‚Â
+‚Ý‚Ç‚¤
+‚Ђé‚Ü‚¦
+‚²‚è‚â‚­
+‚¨[‚¯‚·‚Æ‚ç
+‚µ‚イ‚¿‚á‚­
+‚¤‚ñ‚Ç‚¤‚©‚¢
+‚ª[‚È
+‚ ‚¢‚Ú‚¤
+‚Ç‚¤‚µ‚ã
+‚ç‚ñ‚¾‚Þ
+‚Ç‚ë‚悯
+‚¹‚ñ‚Ø‚¢
+‚Í‚ñ‚°‚ñ‚«
+‚»‚¤‚Ý
+‚È‚Ü‚Ù‚¤‚»‚¤
+‚ ‚ñ‚Ü‚­
+‚Å‚ñ‚«
+‚â‚­‚Ù‚ñ
+‚¨‚¤‚½‚¢
+‚¨‚¨‚Æ‚è‚¢
+‚Ç‚¤‚ª‚ñ
+‚³‚¢‚Þ‚µ‚á
+‚µ‚«‚¹‚ñ
+‚±‚¤‚°‚¢
+‚±‚â‚­
+‚ЂȂ܂‚è
+‚¸‚¤‚½‚¢
+‚Í‚ñ‚è‚å
+‚Ô‚µ‚傤
+‚©‚¢‚¿‚傤
+‚´‚±‚Â
+‚΂ñ‚¶
+‚³‚Á‚Ï‚ñ
+‚»‚­‚Ä‚¢‚¿
+‚µ‚ñ‚µ‚ã
+‚¶‚イ‚±‚¤‚¬‚傤
+‚¬‚à‚ñ
+‚Þ‚µ‚傼‚­
+‚«‚ñ‚Ò‚ñ
+‚Ö‚ñ‚«‚å‚­‚©
+‚¶‚‚ª‚¢
+‚¹‚ñ‚¨‚­
+‚¦‚«‚¿‚傤
+‚Ì‚¤‚¹‚¢
+‚Ì‚¤‚³‚­‚Ô‚Â
+‚à‚ñ‚º‚«
+‚©‚ñ‚è
+‚³‚ñ‚Ú‚¤
+‚¯[
+‚±‚ß‚â
+‚Ђ傤‚ë‚ñ‚©
+‚΂¢‚­
+‚ç‚ñ‚Õ
+‚«‚傤‚í
+‚·‚¢‚Æ‚¤
+‚É‚©‚¢
+‚è‚·‚¤
+‚Æ‚ç‚ñ‚­
+‚¶‚á‚è
+‚¢‚‚Â
+‚¶‚¢‚µ‚«
+‚è‚â‚­
+‚Ê[‚ñ
+‚É‚ñ‚«
+‚¶‚傤‚¨‚ñ
+‚Ö‚«‚Æ‚¤
+‚ä‚«‚ª‚©‚è
+‚Ì‚Ú‚è‚´‚©
+‚Í‚­‚¢
+‚½‚Ñ
+‚µ‚ñ‚¿‚傤
+‚Ý‚ñ‚¹‚¢
+‚¾‚ñ
+‚º‚ñ‚Û‚¤
+‚‚¤‚«
+‚ß‚¢‚¶
+‚½‚¢‚¨‚ñ
+‚«‚イ‚¶‚ã‚Â
+‚µ‚å‚­‚¢
+‚Ì‚Ñ‚Ì‚Ñ
+‚¹‚«‚΂ñ
+‚½‚è‚«
+‚·‚­‚¦‚ 
+‚±‚¤‚Ç‚­‚è‚傤
+‚±‚¤‚µ‚イ‚Å‚ñ‚í
+‚¹‚¯‚ñ‚Ä‚¢
+‚Ç‚¤‚­‚Â
+‚è‚傤‚µ‚«
+‚«‚©‚ñ‚µ‚¦‚ñ
+‚æ‚è‚¢‚Æ
+‚±‚¤‚΂¢‚·‚¤
+‚ä‚ɂイ‚Ô
+‚«‚傶‚イ‚µ‚á
+‚»‚¤‚Þ‚ª‚©‚è
+‚µ‚Ô‚ñ
+‚Ô‚ñ‚µ‚傪‚©‚è
+‚ª‚ñ‚·‚¢
+‚µ‚ñ‚½‚­‚¬‚ñ‚±‚¤
+‚¢‚ñ‚¾‚·‚Æ‚è‚ ‚é
+‚·‚¢‚è‚イ
+‚¿‚イ‚·‚¢
+‚±‚¤‚¢‚«
+‚ ‚¾‚È
+‚»‚¤‚±
+‚è‚Ä‚¢
+‚«‚å‚»
+‚Ü‚¶‚ã‚Â
+‚¢‚ñ‚ç‚ñ
+‚º‚ñ‚¿‚傤
+‚â‚݂‚«
+‚È‚©‚Ç‚¨‚è
+‚½‚Ñ‚Ñ‚Æ
+‚‚܂¢‚½
+‚µ‚È‚¢
+‚µ‚¹‚‚Ô
+‚«‚å‚Æ‚¤
+‚µ‚ã‚­‚ñ
+‚©‚°‚ЂȂ½
+‚±‚¤‚Ô‚ñ‚µ‚å
+‚¼‚­‚¶‚ñ
+‚½‚Ü‚Þ‚µ
+‚Ô‚ñ‚Õ‚¸
+‚½‚ñ‚¶‚ã‚ñ
+‚«‚傤‚Ç‚¤
+‚¨‚肪‚Ý
+‚¦‚¢‚¬‚傤
+‚Í‚µ‚΂µ
+‚è‚傤‚µ‚ã
+‚ë‚ñ‚è
+‚Ù‚Á‚©‚¢‚Ç‚¤
+‚³‚¢‚¾‚ñ‚«
+‚µ‚ã‚Æ‚¯‚ñ
+‚í[‚­
+‚΂©
+‚Ù‚ñ‚¶‚å
+‚ß‚¢‚Æ‚¤
+‚ç‚­
+‚µ‚å‚Ú‚¤
+‚â‚­‚Î
+‚½‚¯‚´‚¨
+‚¦‚ñ‚¶
+‚µ‚á‚­‚µ
+‚©‚ñ‚Ä‚¢
+‚ ‚¢‚±
+‚܂‚ë
+‚³‚ñ‚»
+‚à‚ñ‚¶‚ñ
+‚±‚ë
+‚­‚¢[‚ñ
+‚©‚ç[
+‚¶‚á‚Á‚±‚¤
+‚¶‚ñ‚¬
+‚Ñ‚¶
+‚ ‚¯‚Ú‚Ì
+‚Ù‚Ü‚ê
+‚Ó‚Æ‚à‚à
+‚Ù‚¤‚¶
+‚«‚«‚¶‚傤‚¸
+‚´‚¢
+‚¦‚Á‚¿‚á‚ñ
+‚‚΂³
+‚䂤‚±‚­
+‚µ‚イ‚Ç‚¤‚¢‚ñ
+‚­‚¾‚ñ
+‚ä‚­‚·‚¦
+‚Û[‚é
+‚Ó‚Ë
+‚¶‚á‚Ï‚ñ
+‚µ‚ñ‚Ø‚ñ
+‚Æ‚¤‚³
+‚Í[‚à‚É‚©
+‚Ç‚¤‚©‚ñ
+‚Ë‚¾
+‚ ‚ñ‚¯‚ñ
+‚ß‚¢‚¹‚ñ
+‚©‚¨
+‚¶‚ñ‚‚¤
+‚¯‚ñ‚Ç‚¤
+‚Í‚ñ‚±‚¤
+‚æ‚݂傤
+‚³‚¢‚©‚¢
+‚©‚»‚¤‚Î
+‚Æ‚­‚ß‚¢
+‚Ô‚ñ‚µ‚µ‚«
+‚¢‚ǂ΂½
+‚½‚¢‚¶‚イ
+‚¦‚ê‚­‚Æ‚è‚Á‚­
+‚¹‚¢‚¬‚傤
+‚«‚傤‚ª‚¢
+‚‚æ‚Ñ
+‚¯‚Í‚¢
+‚Ђ¯‚ß
+‚æ‚è‚ ‚¢
+‚±‚¤‚Ù‚¤‚«‚å‚­
+‚í‚¢‚é‚Ç
+‚Í‚¦‚È‚í
+‚«‚»‚±‚¤‚¶‚å
+‚¨‚¨‚Ђë‚Ü
+‚Í[‚Ç
+‚´‚‚ª‚­
+‚Æ‚­‚Ì‚¤
+‚¨‚Ú‚¦‚ª‚«
+‚ß‚Æ‚ë‚ۂ肽‚ñ
+‚¾‚ñ‚»‚ñ‚¶‚å‚Ð
+ƒn
+‚©‚ñ‚«‚è
+‚º‚ñ‚¹‚«‚É‚ñ
+‚½‚¢‚³
+‚·‚©‚µ
+‚è‚傤‚È‚¢
+‚«‚»‚ñ
+‚¹‚¢
+‚µ‚Á‚Ø‚¢
+‚Æ‚­‚¢‚³‚«
+‚»‚ñ‚ª‚¢
+‚¢‚È‚¢
+‚µ‚ñ‚«‚ñ
+‚Æ‚Á‚±‚¤‚â‚­
+‚µ‚傯‚ñ
+‚Ó‚©‚Ì‚¤
+‚ӂł΂±
+‚©‚¢‚è‚Â
+‚µ‚á‚©‚¢‚¶‚ñ
+‚µ‚傤‚Ë‚ñ‚Î
+‚¢‚ñ‚Ó‚ê[‚µ‚å‚ñ
+‚ë‚Á‚±‚Â
+‚Ú‚¤‚ª
+‚µ‚傤‚¢
+‚©‚í‚肾‚Ë
+‚­‚ë‚â‚Ü
+‚Ù‚¤‚䂤
+‚ɂイ‚ª‚­‚«‚ñ
+‚±‚µ‚¨
+‚±‚¤‚«‚ ‚Â
+‚Ô‚ç‚¢
+‚Ä‚®‚¿
+‚¢‚ë‚‚â
+‚à‚ñ‚°‚ñ
+‚¨‚¨‚¢‚¯
+‚Ù‚ñ‚®‚¤
+‚µ‚傤‚±‚¤‚«
+‚à‚ñ‚Ä‚¢
+‚²‚©‚ñ
+‚Ù‚ñ‚ß‚¢
+‚ê‚¢‚ñ
+‚¶‚»‚­
+‚¨‚Æ‚­‚¢
+‚Ó‚Æ‚Ç‚«
+‚©‚‚¾‚Â
+‚Ó‚Ü‚ñ‚¼‚­
+‚»‚ñ‚«‚ñ
+‚܂ȂÂé
+‚¦‚˂邬
+‚Ç‚¤‚µ‚傤
+‚¹‚½‚¯
+‚낤‚Þ‚«‚å‚­
+‚¦[‚·
+‚µ‚傤‚µ‚ã‚ñ
+‚±‚¤‚Æ‚è
+‚‚«‚Ð
+‚±‚Á‚±‚¤
+‚µ‚ñ‚°‚Â
+‚È‚¾‚ê
+‚¦‚ñ‚°‚«
+‚Ђá‚Á‚«‚₱‚¤
+‚É‚Á‚«‚¿‚傤
+‚»‚Á‚«‚傤
+‚¶‚傤‚´‚¢
+‚È‚ç‚Ñ‚©‚½
+‚ß‚¶‚á[
+‚º‚ñ‚¾‚ñ
+‚µ‚Ü
+‚Ì‚Á‚Æ
+‚¯‚ñ‚³‚‚©‚ñ
+‚Ö‚¢‚ë
+‚·‚¢‚¹‚ñ
+‚¿‚ª‚­
+‚½‚ñ‚³‚¢‚Ú‚¤
+‚º‚ñ‚³‚­
+‚ç‚¢‚¤
+‚«‚イ‚¿
+‚®‚ñ‚¶‚ñ
+‚µ‚Í‚¢‚É‚ñ
+‚Æ‚ç‚¢
+‚Þ‚Æ‚Ç‚¯
+‚æ‚â‚Æ‚¤
+‚¹‚Á‚¯‚¢‚©
+‚Æ‚ê[‚·
+‚¶‚ñ‚ª‚³
+‚‚¤‚¿‚µ‚å
+‚©‚·
+‚¿‚Ù‚¤
+‚©‚µ‚ã
+‚ ‚¢‚©‚½
+‚¹‚ñ‚µ‚ク‚ñ
+‚½‚¢
+‚³‚©‚¸‚«
+‚ª‚Á‚©‚¢
+‚ä‚©‚½
+‚»‚Á‚©
+‚¦‚ñ‚Ò‚Â
+‚Ï[‚»‚È‚è‚Ä‚¡
+‚­‚É‚ª‚ç
+‚Ï
+‚¦‚Ü
+‚Ü‚ñ‚¾‚ç
+‚Ä‚ñ‚҂傤
+‚·‚Ï‚¢‚·
+‚²‚©
+‚è‚ñ‚°‚Â
+‚±‚­‚Ç
+‚ä‚»‚¤‚«
+‚µ‚傤‚ª‚­‚©
+‚½‚¯‚΂₵
+‚Ô‚È
+‚µ‚á‚Á‚©‚ñ
+‚Ó‚è‚å‚­
+‚â‚í‚Í‚¾
+‚ª‚­‚°‚¢
+‚ä‚ɂイ‚©
+‚¹‚¢‚³‚ñ‚è‚傤
+‚­‚Ô
+‚¨‚΂ ‚³‚ñ
+‚½‚É
+‚ЂႭ‚¦‚ñ
+‚¢‚Æ‚¼‚±
+‚·‚¤‚µ‚á
+‚è‚傤‚«‚ñ‚¶‚å
+‚Ä‚´‚í‚è
+‚ɂ傤‚»
+‚‚­‚¾
+‚±‚­‚¶‚傤
+‚¾‚¢‚¬‚µ
+‚±‚Á‚µ
+‚¶‚ã‚­‚¿‚傤
+‚±‚Ü‚ñ‚Ç
+‚Í‚¢‚·‚¢
+‚¢‚¿‚è‚傤‚¶‚Â
+‚º‚ñ‚낤
+‚¬‚å‚­‚¹‚«
+‚«‚¯‚¢‚¶
+‚Ú‚¤‚¹‚Â
+‚µ‚傤‚±‚ñ
+‚‚肴‚¨
+‚«‚傤‚Ä‚¢
+‚È‚Ý‚Ü
+‚Ä‚ñ‚©‚Ô‚Â
+‚Ä‚³‚«
+‚Ù‚ñ‚½‚¢
+‚Í‚¶‚傤
+‚«‚å‚Ù
+‚½‚¢‚¢‚ñ
+‚¤‚©‚Â
+‚Ù‚¤‚Ü‚Â
+‚Ë
+‚½‚¢‚¬‚傤
+‚Ü‚ñ‚É‚ñ
+‚¶‚イ‚É‚­
+‚µ‚ã‚í‚ñ
+‚µ‚Ⴝ‚­
+‚¨‚¨‚à‚Ì
+‚Ä‚¢‚­‚¤
+‚ ‚¢‚»
+‚³‚­‚Ђñ‚Ä‚ñ
+‚»‚¤‚肾‚¢‚¶‚ñ
+‚µ‚«‚µ‚á
+‚í‚ê‚ß
+‚䂤‚µ
+‚Ù‚¤‚悤
+‚Æ‚ë
+‚»‚¤‚¬‚ñ
+‚«‚¿‚ª‚¢
+‚»‚©
+‚Ù‚µ‚¼‚ç
+‚è
+‚Ù‚Á‚«‚å‚­‚¯‚ñ
+‚¯‚¢‚´‚¢‚ª‚­
+‚Ђ΂è
+‚±‚¤‚©‚­
+‚­‚¢‚µ‚ñ‚Ú‚¤
+‚Ó‚©‚©‚¿
+‚È‚Ü‚¦
+‚¤‚·‚Å
+‚Ó‚­‚µ‚ñ
+‚µ‚ã‚à‚Â
+‚·‚­[‚é
+‚³‚­‚³‚ñ
+‚­‚¶‚傤
+‚½[‚½‚ñ
+‚è‚傤‚³‚¢‚¯‚ñ‚Ú
+‚µ‚傤‚ª‚­‚Ô
+‚ЂÁ‚Û‚¤
+‚µ‚イ‚«
+‚Ì‚Ý
+‚¶‚½‚¢
+‚·‚è‚Á‚Ï
+‚‚¢‚¿‚傤‚«‚ñ
+‚µ‚Ô‚¿‚傤
+‚ê[‚µ‚å‚ñ
+‚¶‚ñ‚Ä‚¢
+‚½‚¢‚è‚­
+‚낤‚Þ‚Ô
+‚¯‚¢‚·‚¤
+‚©‚ç‚·
+‚¶‚傪‚­‚¹‚¢
+‚«‚Á‚Û‚¤
+‚Ó‚­‚Ô‚ñ
+‚µ‚¨‚´‚¢
+‚Ђã[‚Ü‚ñ
+‚«‚イ‚µ
+‚Í‚è‚ ‚¢
+‚»‚¤‚Þ‚©
+‚«‚è‚ñ
+‚µ‚å‚Á‚©‚¢
+‚Ý‚¸‚©‚ç
+‚©‚¶‚ã
+‚¢‚¿‚ß‚¢
+‚ ‚ê
+‚¤‚ñ‚Ç‚¤‚¶‚傤
+‚Ë‚Á‚½‚¢‚¬‚å
+‚ЂÁ‚¯‚ñ
+‚¹‚¢‚¶‚傤‚«
+‚Ó‚»‚¤‚¨‚¤
+‚¶‚Þ‚ª‚©‚è
+‚Ý‚¹‚µ‚ß
+‚Þ‚²‚ñ
+‚¨‚낵
+‚Í‚¢‚Ó‚­
+‚³‚¢‚Ì‚¤
+‚¢‚Í‚¢
+‚¦‚É‚Á‚«
+‚¶‚ã‚­‚¹‚¢
+‚Ú‚¤‚¦‚¢‚è‚å‚­
+‚µ‚ñ‚ª‚­‚©
+‚Ý‚·‚¢
+‚¼‚­‚¹‚Â
+‚¬‚¹‚¢‚µ‚á
+‚¤‚è‚­‚¿
+‚Ô‚´‚¢
+‚ê‚ñ‚½‚é
+‚¿‚イ‚Ú‚¤
+‚¶‚‚¶‚ã
+‚Æ‚¤‚¿
+‚ª‚ñ‚¦‚ñ
+‚·‚¢‚±‚¤
+‚²‚±‚¤
+‚«‚傤‚¾‚¢
+‚Ó‚¾‚ñ
+‚Ý‚¼
+‚¹‚«‚·‚¤
+‚½‚¢‚³‚­
+‚©‚¯‚«‚ñ
+‚·‚Û‚ñ‚³
+‚µ‚å‚é‚¢
+‚Ђ傤‚µ
+‚Ù‚¤‚µ‚á‚Ì‚¤
+‚¹‚¢‚´
+‚¿‚イ‚è‚ñ‚¶‚傤
+‚µ‚債‚ñ
+‚¿‚¶‚å‚­
+‚¨‚­‚â‚Ý
+‚«‚á‚­‚¹‚«
+‚Å‚ñ‚µ‚á
+‚¯‚ñ‚È‚¢
+‚©‚Ñ‚ñ
+‚Þ‚¦‚ñ
+‚Ó‚Ÿ‚Ý‚è
+‚¤‚킵‚«
+‚«‚傤‚¶‚ã
+‚¶‚イ‚¢‚¿‚ª‚Â
+‚©‚­‚Ö‚¢‚«
+‚â‚Ê‚µ
+‚­‚¿‚â‚­‚»‚­
+‚µ‚傤‚ª‚Á‚©
+‚É
+‚©‚Ù‚²
+‚Ƃ‚߂ñ
+‚ª‚­‚ê‚«
+‚©‚­‚è‚Â
+‚¹‚ñ‚䂤
+‚ׂɂâ
+‚¶‚ã‚­‚Ë‚ñ
+‚Ì‚¿
+‚à‚­‚ß
+‚¬‚イ‚Î
+‚µ‚傹‚Â
+‚΂·‚¯‚Á‚Æ
+‚³‚邪‚­
+‚¨‚à‚Ä‚°‚¢
+‚ç‚­‚Ì‚¤
+‚¹‚¢‚ß‚¢
+‚»‚¤‚ ‚¢
+‚»‚¤‚Ö‚«
+‚¶‚傤‚·‚¢‚¶‚傤
+‚Ü‚·‚Ý
+‚±‚¤‚¨‚Â
+‚½‚Ë‚Ù‚ñ
+‚¶‚ã‚ñ‚µ‚¹‚ñ
+‚±‚±‚ë‚ ‚½‚è
+‚±‚­‚»‚¤
+‚悤‚¬‚µ‚á
+‚Í‚¢‚т傤
+‚¶‚á‚­‚Å‚ñ
+‚Ђ»
+‚Í‚â‚í‚´
+‚Ù‚ñ‚¦‚¢
+‚©‚‚°‚«
+‚Ñ‚µ‚ã
+‚낤‚©‚­
+‚¬‚傤‚µ‚ã
+‚Í‚®‚é‚Ü
+‚¶‚ê‚¢
+‚¶‚Ý‚ñ
+‚É‚Ù‚ñ‚µ‚ã
+‚º‚ñ‚­
+‚º‚ñ‚ê‚¢
+‚¹‚ñ‚Ë‚ñ
+‚²‚Æ‚¤‚¿‚á‚­
+‚Ç‚­‚Ú‚¤
+‚»‚Ì‚Æ‚«
+‚è‚Í‚Ñ‚è‚Ä[‚µ‚å
+‚µ‚傤‚à‚¤‚Ђñ
+‚à‚Á‚±‚¤‚悤
+‚¶‚傹‚‚µ‚á
+‚ ‚Ü‚¦‚ñ‚Ú‚¤
+‚µ‚傹‚«
+‚É‚­‚µ‚ã
+‚ ‚¸‚Ü‚â
+‚Ý‚·
+‚¨‚¨‚Ý‚»‚©
+‚¾‚¢‚«‚¬‚傤
+‚Í‚­‚Ú‚­
+‚°‚ñ‚¸
+‚¿‚¥‚Á‚­‚¢‚ñ
+‚¢‚Ä‚ñ‚³‚«
+‚Ü‚®‚É‚¿‚ã[‚Ç
+‚¹
+‚Ä‚ ‚Æ‚é
+‚Ä‚ñ‚«‚å
+‚¶‚ã‚ñ‚«‚ñ
+‚»‚¤‚¯‚Á‚³‚ñ
+‚¢‚¸‚ê
+‚à‚Ì‚¨‚Æ
+‚ ‚µ‚¾‚¢
+‚Ö‚¢‚Ý‚á‚­
+‚²‚«
+‚Ä‚¢‚µ‚Ⴖ‚傤
+‚¾‚¢‚¨[‚Ç
+‚Ó‚¤‚»‚¤
+‚í‚«‚΂ç
+‚µ‚½‚¬
+‚»‚¤‚¶‚ã‚­
+‚à‚Á‚©‚ñ
+‚­‚ç‚Ô
+‚²‚»‚­‚낤
+‚¹‚¢‚è
+‚í‚ñ
+‚©‚ñ‚Ç
+‚¿‚傤‚Î
+‚¶‚¬‚傤‚Ô‚¿‚傤
+‚¾‚Æ‚¤‚¹‚¢
+‚³‚¢‚Ç
+‚Í‚­‚¿‚傤
+‚µ‚¿‚ウ[‚µ‚å‚ñ
+‚³‚Ü‚³‚Ü
+‚³[‚Ñ‚·‚Ô
+‚è‚ׂñ
+‚·‚Õ‚è‚ñ‚®
+‚µ‚傤‚Ђµ‚á
+‚µ‚å‚­‚¬‚傤
+‚½‚Á‚«‚イ‚Ñ‚ñ
+‚È‚È‚­‚³
+‚à‚ñ
+‚¶‚傤‚µ‚ñ‚µ‚å
+‚µ‚å‚Þ‚©
+‚·‚¬‚â‚Ü
+‚Å‚ñ‚ ‚Â
+‚±‚¾‚¿
+‚¿‚イ‚¶‚ã‚ñ
+‚±‚¤‚Ù‚­
+‚«[‚Ï[
+‚»
+‚Ó‚¤‚±‚¤
+‚Ȃ炯
+‚Ù‚Æ‚Æ‚¬‚·
+‚±‚ñ‚¿‚イ
+‚¯‚ñ‚¢
+‚²‚ß‚ñ
+‚©‚Ý‚»‚è
+‚ׂ‚߂¢
+‚݂‚à‚肵‚å
+‚³‚¢‚«
+‚¹‚¢‚´‚¢‚©‚¢
+‚¶‚è‚«
+‚‚Â
+‚²‚º‚ñ‚¿‚イ
+‚±‚«‚á‚­‚»‚¤
+‚½‚©‚ç
+‚Ü‚¢‚È[
+‚ ‚µ‚½
+‚±‚ñ‚É‚¿‚Í
+‚É‚µ‚Ñ
+‚¹‚ñ‚¿‚á
+‚µ‚ñ‚½‚¢‚»‚¤
+‚±‚¤‚Ô‚ñ‚µ
+‚¾‚Á‚Æ
+‚´‚Á‚»‚¤
+‚«‚ª‚¢
+‚³‚ñ‚µ‚·‚¢‚ß‚¢
+‚Ý‚Á‚«[
+‚±‚¤‚Ô‚Â
+‚è‚Á‚¿‚á‚ñ
+‚·‚ê[‚Æ
+‚É‚ñ‚°‚ñ‚©‚¢
+‚Ø‚ñ‚«
+‚¾‚¢‚³‚ñ‚Ô
+‚Ô‚ê‚¢
+‚³‚³‚Í‚ç
+‚Ñ‚¢‚µ‚«
+‚µ‚ª‚Â
+‚µ‚Æ‚Ý
+‚µ‚©‚¢‚¬‚¢‚ñ
+‚炶‚¨
+‚¤‚è‚à‚Ì
+‚¨‚Í‚ç‚¢‚΂±
+‚»‚³‚¢
+‚¶‚イ‚Ç
+‚µ‚¸‚©‚³
+‚Þ‚«‚ß‚¢
+‚ä[‚©‚ç
+‚Ü‚È‚Ñ
+‚Ó‚Ä‚Á‚Ä‚¢
+‚¶‚傤‚à‚ñ
+‚Ç‚¤‚ß‚¢‚±‚­
+‚ä[
+‚µ‚á
+‚È‚ñ‚т傤
+‚»‚¤‚Ü‚Æ‚¤
+‚µ‚å‚à‚ñ‚¾‚¢
+‚­
+‚È‚ñ‚«‚ñ
+‚½‚Ä‚®
+‚º‚É
+‚Ђ΂ñ
+‚È‚ñ‚Ô
+‚»‚Ú
+‚«‚Ë‚ñ‚Ñ
+¿
+‚‚ê‚Âê
+‚¶‚ã‚Ò‚½[
+‚Ñ‚È‚ñ
+‚¢‚ñ‚Ó‚§‚ß[‚µ‚å
+‚ ‚­‚Ö‚«
+‚ ‚¸‚Ü
+‚Ú‚µ‚å
+‚µ‚‚¨‚ñ
+‚µ‚ñ‚±‚ñ
+‚¹‚ñ‚è‚イ
+‚«‚å‚­‚à‚­
+‚«‚ç‚¢
+‚䂤‚¹‚¢‚¾‚¢‚¶‚ñ
+‚«‚イ‚â‚­
+‚³‚Á‚µ
+‚µ‚á‚­‚Ç
+‚΂ñ‚ª‚¢‚¿
+‚Ë‚¬
+‚¹‚«‚½‚ñ
+‚µ‚ã‚ñ‚¶
+‚µ‚傽‚¢
+‚ª‚¢‚Ä‚«
+‚Ó‚¤‚ ‚Â
+‚µ‚Ü‚è
+‚Ä‚¢‚«‚イ‚Ñ
+‚µ‚イ‚¾‚ñ
+‚º‚ñ‚¢
+‚µ‚à‚‚«
+‚«‚ñ‚µ‚Â
+‚«‚µ‚傤‚Ä‚ñ‚¯‚Â
+‚肳‚Â
+‚Ù‚ñ‚ª‚ñ‚¶
+‚í[‚é‚Ç
+‚«‚»
+‚ ‚Æ‚ ‚Æ
+‚¤‚邵
+‚Ù‚¤‚Æ‚­
+‚³‚Þ‚ç‚¢
+‚±[‚Ç
+‚Ђ܂­
+‚Ü‚Ç‚®‚¿
+‚΂ñ‚²‚¤
+‚é‚è
+‚­‚ñ‚ß‚¢
+‚æ‚Í
+‚µ‚ñ‚½‚­
+‚䂤‚×
+‚悤‚µ‚ã‚ñ
+‚°‚¢‚¾‚¢
+‚¾‚¢‚³‚ñ‚é‚¢
+‚Å‚ñ‚¯‚¢
+‚½‚Ä‚¢‚Æ
+‚¯‚¢‚­
+‚Í‚ñ‚Æ‚µ
+‚Ù‚è
+‚Ђ©‚¦‚ß
+‚Ђ傤‚¶‚ã‚ñ‚²
+‚®‚Æ‚¤
+‚¹‚ñ‚·‚¢
+‚Ü‚ñ‚¶
+‚ª‚­‚©
+‚¹‚ñ‚à‚ñ‚ª‚¢
+‚³‚¢‚é‚¢
+‚Å‚¢‚è[
+‚³‚½‚ñ
+‚³‚­‚¢‚ñ
+‚½‚¢‚®‚ñ
+‚©‚ñ‚Ô
+‚ë‚¢‚â‚é
+‚½‚ñ‚©
+‚³‚«‚´‚«
+‚Ý‚à‚¿
+‚¨‚¨‚¢‚µ
+‚Å‚¡‚ê‚­‚½
+‚¹‚¢‚â‚­‚µ‚å
+‚¯‚¢‚«‚¿‚傤
+‚­‚©‚¢
+‚©‚ñ‚³‚¢
+‚¶‚傤‚¶
+‚Ë‚ñ‚Û‚¤
+‚­‚É‚à‚Æ
+‚¦[‚é‚¢
+‚Ý‚¸‚¬‚í
+‚±‚ë‚ñ
+‚µ‚ã‚Ô‚ñ
+‚Ó‚­‚µ‚サ‚傤
+‚Þ‚Ì‚¤
+‚²‚¤‚ׂñ‚ª‚¢‚µ‚á
+‚ë‚Á‚©[
+‚¢‚Á‚»‚¤
+‚¶‚ã‚ɂイ‚«
+‚킬
+‚«‚è‚΂È
+‚µ‚Ⴌ‚傤
+‚΂¢‚è‚Â
+‚à‚ñ‚‚«
+‚¯‚ñ‚«‚イ‚¢‚ñ
+‚Ø‚ 
+‚ׂÁ‚µ‚å
+‚Ù‚ñ‚»
+‚¨‚¤‚¾‚ñ
+‚Ԃ‚è‚イ
+‚¯‚Á‚Æ‚¤‚µ‚å
+‚¿‚³‚¢
+‚¨[‚»‚Ç‚Á‚­‚·
+‚Ü‚¢‚΂ñ
+‚¹‚ñ‚Ç
+‚Ä‚¢‚è‚イ
+‚Ä‚¢‚Ì‚¤
+‚¿‚è‚Æ‚è
+‚½‚©‚ç‚Ô‚Ë
+‚¼‚­‚݂傤
+‚©‚»‚­‚Ç
+‚È‚¢‚è‚ñ‚´‚ñ
+‚µ‚傤‚¹‚«
+‚â‚Ü‚©‚í
+‚¬‚á‚ç‚è[
+‚©‚µ‚©‚ñ
+‚¿‚á‚ÂÂ
+‚µ‚Ý‚ã‚ê[‚µ‚å‚ñ
+‚µ‚т傤
+‚æ‚â‚­‚«‚ñ
+‚±‚ñ‚Ò‚ã[‚½
+‚Ý‚Ç‚è
+‚Ì‚¤‚Þ
+‚´‚ñ‚«‚ñ
+‚Ä‚È‚Ý
+‚´‚ñ‚Ü‚¢
+‚È‚ñ‚¹‚¢
+‚¹‚ñ‚º‚ñ
+‚¹‚¢‚µ‚å
+‚¯‚¢‚¢
+‚±‚¤‚¶‚ñ
+‚µ‚Ô‚ñ‚µ‚å
+‚¶‚΂ç
+‚©‚炵
+‚º‚ñ‚©‚ñ
+‚«‚傤‚Þ
+‚¢‚è‚å‚­
+‚¹‚ñ‚¹[‚µ‚å‚È‚é
+‚¢‚ñ‚¬‚ñ
+‚Õ‚³‚¢
+‚¢‚Á‚¿‚傤
+‚¹‚¢‚µ
+‚Í‚ñ‚΂¢‚«
+‚©‚¢‚¬‚傤‚¢
+‚Ô‚ç‚­
+‚ª‚¶‚傤
+‚Æ‚¤‚¶‚傤‚¯‚ñ
+‚¹‚ñ‚µ
+‚¶‚»‚ñ
+‚¤‚ñ‚ª
+‚±‚¤‚Ý‚ñ‚©‚ñ
+‚¹‚¢‚µ‚ã
+‚ç‚¢‚Ђñ
+‚¨‚³‚È‚²‚±‚ë
+‚«‚á‚è‚ 
+‚Ђ±‚­
+‚¶‚¢‚ñ
+‚à‚ñ‚È‚µ
+‚Ä‚­‚É‚Á‚­
+ƒU
+‚³‚ñ‚©‚¢
+‚²‚½‚¢
+‚ª‚ñ
+‚»‚ç‚É
+‚Ђ©‚¦
+‚‚ÂÝ
+‚©‚­‚°‚ñ
+‚«‚ñ‚±‚Â
+‚µ‚傤‚ª‚­
+‚±‚ñ‚ê‚¢
+‚Ä‚ª‚Ý
+‚½‚«‚©‚í
+‚ɂイ‚¬‚イ
+‚ ‚­‚¢
+‚«‚ª‚邳
+‚Í‚¢‚»‚¤
+‚»‚¤‚·‚¤
+‚¢‚Æ‚®‚¿
+‚ß‚¢‚µ
+‚¬‚å‚©‚¢‚é‚¢
+‚³‚ª‚ñ
+‚½‚Ü‚²
+‚¿‚«‚イ‚¬
+‚·‚¤‚¯‚ñ
+‚©‚¢‚µ‚á‚ß‚¢
+‚Ø[‚·
+‚È‚ñ‚¶‚©‚ñ
+‚»‚·‚¤
+‚ ‚ß‚Ó‚è
+‚Ì‚«‚µ‚½
+‚¢‚í‚«
+‚¶‚‚߂¢
+‚Ú‚¤‚낤
+‚©‚Á‚«
+‚«‚傤‚³‚­
+‚Ô‚½‚É‚­
+‚½‚ñ‚¹‚¢
+‚º‚ñ‚¹‚ñ
+‚·‚ª‚¨
+‚½‚Ä‚µ
+‚¶‚Ä‚ñ‚µ‚á
+‚¦‚Á‚¹‚ñ‚·
+‚Ó‚ß‚¢‚©‚­
+‚䂤‚¹‚ñ‚¯‚ñ
+‚¶‚傤‚¹‚«
+‚±‚¤‚®
+‚Æ‚©
+‚µ‚¾‚ñ
+‚Ú‚³‚Â
+‚Ç‚¤‚ê‚Â
+‚¿‚イ‚¨‚¤
+‚悤‚«
+‚ЂƂ¬‚«
+‚¢‚¿‚¢‚ñ
+‚Ä‚¢‚悤
+‚±‚ë‚Á‚¯
+‚È‚¢‚­‚¤
+‚¿‚µ‚Â
+‚Ó‚È‚¢
+‚µ‚º‚ñ
+‚¤‚¸‚Ü‚«
+‚½‚¢‚µ‚傤‚è‚傤
+‚è‚傤‚è‚ñ
+‚è‚ñ‚ª‚Á‚©
+‚Ç‚ñ‚Ä‚ñ
+‚·‚¢‚΂ñ
+‚ß‚ñ‚Ú‚­
+‚«‚イ‚ß‚¢‚®
+‚Ђã[‚Ü‚É‚·‚Æ
+‚¦‚¿‚é
+‚Ø‚ñ
+‚Í‚­‚΂¢
+‚µ‚ñ‚µ‚傤‚µ‚á
+‚í‚¢‚ë
+‚Ђ«‚©‚¦‚¯‚ñ
+‚Ñ‚¶‚ã‚‚©‚ñ
+‚Ä‚¢‚è
+‚Ë‚ª‚¢‚²‚Æ
+‚Õ‚è‚Ý‚Ä‚¡‚Ô
+‚Í‚­‚¶‚Â
+‚±‚¨‚è‚´‚Æ‚¤
+‚µ‚ñ‚Ñ
+‚Ï[‚Ó‚¥‚­‚Æ
+‚µ‚¹‚‚ª‚©‚è
+‚¨‚ª‚í
+‚΂¶‚ã‚Â
+‚æ‚Á‚«‚イ‚Ó‚Ü‚ñ
+‚¯‚¢‚肵
+‚¶‚ã‚ê‚¢
+‚¤‚¿‚傤‚Ä‚ñ
+‚à‚¿‚²‚ß
+‚â‚Â
+‚Ó‚é‚·
+‚©‚ñ‚Ý
+‚µ‚悤‚É‚ñ
+‚±‚¤‚«‚ñ
+‚¦‚¢‚É‚¿
+‚É‚Ù‚ñ‚µ
+‚¾‚¢‚¾‚¢‚Ђ傤
+‚à‚Æ‚¢
+‚Å‚ñ‚³‚ñ‚«
+‚Í‚¢‚Ó‚ñ
+‚ ‚邺‚ñ‚¿‚ñ
+‚«‚肱
+‚©‚ç‚·‚®‚¿
+‚¯‚µ‚²‚Þ
+‚¨‚µ‚á‚ê
+‚«‚Ç‚¤‚½‚¢
+‚¿‚Ⴝ‚­
+‚±‚µ‚ã
+‚Í‚ñ‚«‚イ
+‚Ó‚é[‚Æ
+‚©‚¢‚¬‚µ‚Â
+‚Ú‚¶‚傤
+‚Ó‚¹‚¢‚µ‚ã‚Â
+‚«‚¢‚ë
+‚ ‚ª‚è
+‚ç‚¢‚¹‚ñ‚·
+‚±‚¨‚è
+‚Ä‚¢‚Ç
+‚»‚΂¦
+‚ ‚½‚Ü‚©‚¸
+‚»‚Ì‚½
+‚µ‚å‚«
+‚±‚Ä‚«
+‚¤‚¯‚à‚¿
+‚¹‚¼‚­
+‚¶‚ã‚«‚イ‚µ‚á
+‚½‚¢‚ ‚ñ
+‚΂¢‚Ç‚­
+‚µ‚È‚©‚¸
+‚¢‚µ‚¸‚¦
+‚¢‚ñ‚Ï‚­‚Æ
+‚Ђª‚¢
+‚悤‚¿
+‚ê‚¢‚©‚ñ
+‚½‚¯‚â‚Ô
+‚¢‚Á‚µ
+‚‚é‚Í‚µ
+‚݂傤‚²‚É‚¿
+‚¹‚¢‚ª‚ñ
+‚©‚ª‚­‚©
+‚«‚±‚ñ‚µ‚á
+‚Í‚Ü‚«
+‚¹‚ñ‚Ä‚ñ‚¹‚¢
+‚¶‚イ‚¿‚ñ
+‚炵‚á
+‚ä‚¢‚Ì‚¤
+‚²‚é‚Ó‚¶‚傤
+‚ ‚©‚Í‚½
+‚ ‚ꂵ‚傤
+‚Ü‚à‚Ì
+‚¿‚å‚­‚²
+‚³‚¾‚ß
+‚Ç‚¤‚µ‚Â
+‚¨‚ñ‚Ë‚Â
+‚½‚ñ‚·‚¢‚¬‚å
+‚µ‚傤‚ª‚¢‚«‚å‚­
+‚È‚Ý
+‚Ђ‚¶‚ã‚ñ
+‚¨‚¢‚Ü‚Â
+‚©‚¹‚«
+‚³[‚Ú
+‚·‚½‚ñ‚΂¢
+‚Ý‚Á‚µ‚Â
+‚Å‚ñ‚Ç‚¤‚«
+‚¿‚傤‚ß‚ñ
+‚¹‚ñ‚悤
+‚â‚­
+‚¤‚¿‚«‚¸
+‚Å‚¡‚·‚©‚Î[
+‚µ‚ã‚­‚Ä‚ñ
+‚Í‚­‚¿
+‚Ó‚è[‚´
+‚«‚µ‚×
+‚¦‚Æ
+‚¤‚Î
+‚¶‚傤‚¾‚¢
+‚®‚ç‚É‚ã[
+‚Í‚ç‚Ü‚«
+‚½‚¿‚¢
+‚ɂイ‚ª‚ñ
+‚¯‚Á‚¿‚傤
+‚·‚¢‚悤‚¦‚«
+‚Ç‚¤‚ç‚­
+‚¢‚©‚è
+‚ӂ‚¤‚©
+‚¹‚ñ‚¿‚傤
+‚è‚Á‚©
+‚©‚Ý‚í‚´
+‚²‚¤‚ß‚¢
+‚¶‚‚¾‚ñ
+‚±‚¤‚«‚ñ‚è
+‚¿‚¯‚¢
+‚ ‚ñ‚È‚¢‚¶‚å
+‚º‚ñ‚«‚å‚­
+‚¨‚¨‚Ü
+‚Å‚³‚«
+‚»‚¤‚½‚¢
+‚«‚傤‚ ‚­
+‚Ñ‚ã[‚ë
+‚É‚ñ‚¶‚ñ
+‚䂤‚Å‚ñ‚è‚Â
+‚Ó‚Ç‚¤‚½‚¢
+‚·‚µ
+‚킱‚­
+‚΂ñ‚¶‚«‚イ‚·
+‚¹‚¢‚¶‚á
+‚Ü‚ñ‚¢‚ñ
+‚³‚¢‚Ä‚«
+‚¶‚¬‚傤‚Ù‚ñ‚Ô
+‚µ‚ク‚ñ
+‚«‚¼‚­
+‚Ä‚¢‚¦‚ñ‚Æ‚¤
+‚²‚³
+‚©‚­‚µ‚イ
+‚¨‚«‚È
+‚»‚¤‚¶‚傤
+‚Æ‚­‚³‚Â
+‚ê‚«
+‚悤‚Æ‚ñ
+‚µ‚ñ‚½‚¢
+‚¨‚¿‚á
+‚±‚¤‚Ë‚Â
+‚±‚Æ‚Ô‚«
+‚«‚傤‚»
+‚ä‚«‚Ì‚µ‚½
+‚©‚¢
+‚¶‚傤‚Ђñ
+‚Õ‚ë‚Á‚½
+‚Í‚ª‚«
+‚è‚­‚¹‚¢
+‚Ü‚ñ‚µ‚ñ
+‚±‚­‚³‚ñ
+‚ª‚·
+‚Ë‚ñ‚ª‚¶‚傤
+‚Æ‚ñ‚Ú
+‚µ‚ñ‚â‚­
+‚Ђ傤‚Ç
+‚‚¤
+‚Í‚©‚Ü
+‚Ý‚±‚µ
+‚¤‚¶
+‚²‚¯‚ñ
+‚È‚¢‚¹‚«
+‚ä‚Ñ‚³‚«
+‚½‚­‚¹‚ñ
+‚©‚ñ‚è‚«‚å‚­
+‚É‚ñ‚Ò‚É‚ñ
+‚Ü‚ñ‚Ç‚¤
+‚¶‚傤‚¾‚ñ
+‚Ђ«‚µ‚¨
+‚²‚悤
+‚±‚¤‚ ‚ñ
+‚ ‚Ô‚ç‚ ‚¹
+‚è‚傤‚æ‚­
+‚³‚ñ‚«‚傤
+‚¦‚ñ‚䂤‚©‚¢
+‚Æ‚¤‚Ä‚ñ
+‚«‚Ì‚Ç‚­
+‚ ‚­‚¤‚ñ
+‚­‚ñ‚Ä‚ñ
+‚Ђ傤‚»‚¤
+‚½‚­‚È‚¢
+‚¾‚¢‚É‚¶
+‚É‚ã‚ ‚ñ‚·
+‚Ü‚è‚å‚­
+‚³‚µ‚¾‚µ‚É‚ñ
+‚·‚ñ‚©
+‚Ñ‚µ‚á‚à‚ñ‚Ä‚ñ
+‚¨‚­‚¿‚傤
+‚Ù‚¨‚¦
+‚Ç‚¤‚Ù‚¤
+‚Í‚­‚¶
+‚·‚¤‚µ‚ã
+‚¶‚á‚Ç‚¤
+‚¤‚ê‚­‚¿
+‚¬‚イ‚µ
+‚©‚¢‚«‚µ‚å‚­
+‚¦‚ñ‚ß‚¢
+‚è‚ñ‚«
+‚˂΂肯
+‚±‚¤‚µ‚«
+‚Ô‚¶
+‚«‚ñ‚é‚¢
+‚È‚¢‚Ó
+‚©‚Á‚±‚¤
+‚¤‚¿‚Ý
+‚¹‚ñ‚¹‚¢
+‚Ù‚ñ‚à‚Æ
+‚µ‚¢‚ꂳ‚«
+‚ ‚è‚Ì‚Ü‚Ü
+‚µ‚ñ‚È[
+‚²‚ª‚Á‚©
+‚ª‚¢‚±‚Â
+‚µ‚ñ‚¦‚ñ
+‚½‚ñ‚¢‚Â
+‚¿‚傤‚½‚¢
+‚¯‚ñ‚µ‚イ‚Ô
+‚¶‚傤‚µ‚«
+‚µ‚å‚­‚¾‚¢
+‚悤‚©‚ñ
+‚ ‚³‚䂤
+‚‚¤‚µ‚ñ‚«
+‚Þ‚Ä‚ñ‚Û
+‚Æ‚¤‚낤
+‚É‚Á‚µ‚傤
+‚¶‚イ‚¶‚ë
+‚悤‚µ‚Â
+‚¢‚Á‚µ‚å
+‚¨‚Æ‚µ‚¾‚Ü
+‚µ‚債
+‚悱
+‚«‚傤‚¼‚ß
+‚Í‚Í
+‚µ‚»‚­
+‚±‚ñ‚²‚¤
+‚®‚ñ‚¶‚Ð
+‚¹‚ñ‚悤‚«
+‚»‚­‚¶‚Â
+‚Ô‚Á‚©‚­
+‚¶‚Þ‚µ‚å
+‚È‚µ
+‚ª‚­‚¶
+‚Í‚â‚Ä
+‚½‚ñ‚º‚ñ
+‚Ä‚¢‚ª‚­‚Ë‚ñ
+‚¿‚ª‚Á‚©
+‚­‚Ü‚Å
+‚½‚¾‚¢‚Ü
+‚Þ‚ª‚¢
+‚˂‚炢
+‚µ‚¯‚ñ‚«
+‚Ü‚­‚¤‚¿
+‚¦‚ñ‚ë
+‚ê[‚´
+‚¶‚ñ‚®‚¤
+‚Í‚«‚å‚­
+‚䂤‚º‚ñ
+‚â‚­‚ª‚Á‚©
+‚©‚¢‚Ô‚Â
+‚낤‚«‚µ‚å
+‚Ø‚È‚é‚Ä‚¡[
+‚¨‚Æ‚±
+‚¶‚傤‚Ö‚«
+‚«‚Ý
+‚Æ‚­‚Þ
+‚¤‚¿‚ª‚í
+‚Ç‚ê‚¢
+‚¤‚¿‚«
+‚Ö‚¢‚¨‚ñ
+‚¿‚傤‚ ‚¢
+‚ª‚ñ‚«‚イ
+‚µ‚ñ‚è‚傤‚¶‚å
+‚Ý‚µ‚イ
+‚µ‚ñ‚«‚イ
+‚â‚Æ‚¤
+‚Ä‚ñ‚Ë‚ñ
+‚¢‚Á‚³‚¢
+‚Ì‚¤‚¿
+‚Ó‚ë‚ñ‚Æ
+‚È‚ñ‚½‚ñ
+‚©‚¢‚©‚ñ
+‚¬‚ñ‚±‚¤‚ß‚¢
+‚Æ‚­‚³‚ñ
+‚Ç‚¤‚à‚Æ
+‚©‚Á‚¯
+‚µ‚ñ‚¾‚¢‚µ‚á
+‚¹‚ñ‚Õ‚­
+‚Þ‚±‚¤
+‚º‚ñ‚ׂ¢
+‚Ý‚Í‚ç‚¢
+‚½‚Ü
+‚Å‚«‚à‚Ì
+‚è‚«‚è‚傤
+‚È‚¢‚¶‚ã
+‚·‚¤‚©‚±‚­
+‚»‚­‚Ö‚«
+‚à‚­‚¿‚傤
+‚±‚¹‚«‚Æ‚¤‚Ù‚ñ
+‚È‚°‚«
+‚µ‚ñ‚¨‚¤
+‚ ‚©‚炳‚Ü
+‚â‚Ü‚Ä
+‚Æ‚¤‚É‚ñ
+‚Í‚ñ‚悤‚«
+‚¹‚¢‚­
+‚Ä‚Á‚±‚¤
+‚Æ‚­‚悤
+‚Æ‚©‚°
+‚¢‚Á‚½‚ñ
+‚µ‚ザ
+‚µ‚ñ‚¹‚ñ
+‚¦‚¿‚ê‚ñ
+‚Ä‚¢‚±‚¤‚«
+‚±‚¤‚¸‚©
+‚ׂɂ΂È
+‚º‚ñ‚¶‚Â
+‚Ù‚¤‚°‚ñ
+‚¶‚ñ‚«‚å
+‚‚¤‚µ‚ñ‚µ‚Â
+‚É‚Á‚µ‚イ
+‚Ü‚·‚±‚Ý‚ã‚É‚¯[
+‚¶‚傤‚½‚¢
+‚낤‚¶‚å
+‚±‚ñ‚Ä
+‚¨‚¨‚¨‚­
+‚É‚µ‚Ⴝ‚­‚¢‚Â
+‚µ‚ñ‚µ‚傤‚Ђñ
+‚¬‚傤‚©‚ñ
+‚ ‚¢‚Ü
+‚Ô‚Ç‚¤‚©‚ñ
+‚ß‚¢‚³‚¢
+‚ß‚ª‚Ë
+‚Ì‚«‚È‚Ý
+‚³‚‚«
+‚Þ‚¹‚ñ‚«
+‚©‚­‚Ü‚­
+‚¤‚ç‚Ý‚¿
+‚­‚­
+‚¹‚«‚µ‚ñ
+‚Ç‚¤‚Ô‚Â
+‚¬‚傤‚©‚­
+‚ ‚é‚Ý‚É‚¤‚Þ
+‚ق邾[
+‚¢‚«‚È‚¢
+‚·‚¢‚¶‚傤
+‚Ö‚¢‚Ë‚Â
+‚Þ‚ç‚Í‚¿‚Ô
+‚ª‚­‚Þ
+‚µ‚ñ‚Ô‚ñ‚µ‚á
+‚«‚傤‚²‚¤
+‚ӂ‚²
+‚É‚¢‚ñ
+‚Å‚ñ‚¯‚ñ
+‚½‚ñ‚µ‚å
+‚¾‚¢‚ª‚­
+‚¨‚¨‚©‚½
+‚¶‚å‚è‚イ
+‚Ù‚¤‚¾‚ñ
+‚è‚ñ‚®
+‚Å‚ñ‚¢
+‚Ó‚«‚Â
+‚ׂÁ‚©‚­
+‚æ‚낸‚â
+‚»‚±‚Ñ‚«
+‚È‚µ‚å‚Ȃ肸‚Þ
+‚¢‚ñ‚µ‚Â
+‚ ‚¦‚ñ
+‚©‚ñ‚ë‚­
+‚¢‚ñ‚è‚傤‚·‚¢
+‚Û‚Á‚Æ
+‚¶‚‚è
+‚°‚ñ‚²‚¤
+‚ª‚è‚ê‚¢
+‚¿‚傤‚³‚ª‚©‚è
+‚µ‚å‚Þ‚ª‚©‚è
+‚»‚ñ‚¦‚«
+‚µ‚å‚Ђ傤
+‚Þ‚¶‚傤‚¯‚ñ
+‚È‚¾‚¢
+‚΂ñ‚²‚¤‚¶‚ã‚ñ
+‚½‚±‚ñ
+‚Ü‚ñ‚Ë‚ñ‚ЂÂ
+‚¹‚ñ‚¿‚á‚­‚¶‚ã‚ñ
+‚ª‚ñ‚­‚Â
+‚³‚­‚µ‚イ
+‚Ü‚¦‚¾‚ê
+‚±‚¤‚Í‚¢
+‚±‚¤‚³‚ñ
+‚т傤‚è
+‚³‚¢‚Þ
+‚Í‚â‚è
+‚·‚¢‚Ú‚­
+‚Æ‚±‚â
+‚µ‚Ⴊ‚ꂲ‚¦
+‚©‚¢‚©‚¯
+‚Ó‚à‚Æ
+‚ ‚ñ
+‚¤‚·‚¶‚¨
+‚»‚ñ‚Æ‚­
+‚¾‚¢‚¹‚Â
+‚â‚­‚´‚¢‚µ
+‚¹‚Á‚¯‚ñ
+ƒŠ
+‚¹‚«‚‚¢
+‚¶‚è‚å‚­
+‚µ‚©
+‚É‚ñ‚«‚à‚Ì
+‚Ó‚³‚ñ‚©
+‚Ý‚Ô‚è
+‚«‚½‚ª‚í
+‚·‚¤‚±
+‚¢‚¿‚©‚à‚­
+‚©‚ª‚Ý‚à‚¿
+‚½‚Ô
+‚ ‚Ý‚¾
+‚Ù‚ñ‚΂ñ
+‚«‚Ú
+‚µ‚ñ‚¼‚­
+‚Í‚¢‚¢‚ë
+‚²‚è‚ñ
+‚±‚‚΂ñ
+‚©‚­‚¹‚ñ
+‚º‚ñ‚¦‚¢
+‚°‚ñ‚Û‚¤
+‚¿‚ñ‚Ò‚ñ
+‚½‚ñ‚«‚¾‚¢‚ª‚­
+‚¶‚»‚¤‚µ‚«
+‚«‚イ‚«‚イ‚µ‚á
+‚Ђé‚Ë
+‚Ï‚¸‚é
+‚¢‚Ô‚É‚ñ‚®
+‚΂¢‚â‚­
+‚¼‚¤‚©‚ñ‚²‚¤
+‚«‚傤‚±‚Â
+‚«‚Ü‚¶‚ß
+‚Ü‚Á‚³‚©‚³‚Ü
+‚¶‚°‚ñ
+‚¶‚Á‚Ä‚¢
+‚«‚‚¯
+‚µ‚傤‚½‚¢‚µ‚á
+‚¹‚ñ‚¶‚傤‚¿
+‚»‚¤‚¢‚Ä‚ñ
+‚È‚©
+‚肵
+‚«‚¶‚Â
+‚²‚¼‚ñ‚¶
+‚킽‚µ‚Ô‚Ë
+‚­‚¬‚Ê‚«
+‚º‚ñ‚Î
+‚â‚Ú
+‚©‚¢‚¢‚Ê
+‚¢‚µ‚ñ‚Å‚ñ‚µ‚ñ
+‚è‚傤‚悤
+‚à‚¿‚Î
+‚¦‚¢‚±‚¤
+‚±‚Ì‚±‚Æ
+‚Ì‚¤‚®
+‚¢‚¿‚ª‚©‚è
+‚µ‚Ⴓ‚¢
+‚Ђ‚ɂ傤‚«
+‚«‚ë‚­‚µ
+‚³‚炳
+‚µ‚傤‚¶‚«
+‚«‚傤‚Í‚ñ‚µ‚á
+‚É‚ã[‚Æ‚ç‚é
+‚¨‚«‚á‚­‚³‚Ü
+‚¢‚Á‚«‚å‚¢‚¿‚Ç‚¤
+‚¨[‚ë‚ç
+‚¿‚­‚Î
+‚í[‚Õ‚ë
+‚ ‚³‚È‚¬
+‚Ì‚Ñ‚È‚â‚Ý
+‚©‚¢‚ª‚ñ‚¹‚ñ
+‚¶‚イ‚É‚ª‚Â
+‚ä‚«
+‚ª‚Í‚­
+‚¢‚Á‚¹‚«‚É‚¿‚傤
+‚¤‚®‚¢‚·
+‚Ä‚ª‚邳
+‚¬‚µ‚«
+‚Ü‚Ë[
+‚Þ‚è‚å‚­
+‚è‚傤‚«
+‚Í‚¢‚·‚¢‚©‚ñ
+‚½‚Ä
+‚¿‚傳‚­‚¯‚ñ
+‚¹‚¢‚Ԃ‚©
+‚È‚ê[‚½
+‚Æ‚Ç‚Ü‚Â
+‚¶‚イ‚©‚º‚¢
+‚µ‚イ‚¢‚ñ
+‚É‚Ù‚ñ
+‚É‚å‚ç‚¢
+‚µ‚イ‚³‚ñ
+‚¶‚ë‚ñ
+‚©‚µ‚©‚½
+‚Ú‚¤‚Í‚Ä‚¢
+‚Ï‚·‚í[‚Ç
+ƒ~
+‚Ì‚¤‚Í‚¤
+‚Ù‚¤‚±‚¤
+‚à‚ñ‚Æ
+‚¦‚«‚т傤
+ƒ@
+‚ß‚¢‚«
+‚т傤‚°‚ñ
+‚‚í‚è
+‚¦‚ñ‚Ë‚Â
+‚½‚©‚Á‚¯‚¢
+‚¢‚µ‚イ
+‚²‚¨‚ñ‚±
+‚₪‚¢
+‚Ó‚È‚ª‚½
+ƒ_
+‚³‚»‚è
+‚µ‚イ‚䂤‚¯‚ñ
+‚Ó‚ä
+‚¶‚Á‚µ
+‚Ђè‚Â
+‚¬‚ñ‚¹‚¢
+‚ë‚΂ñ
+‚Ó‚«‚°‚ñ
+‚¦‚¢‚¹‚¢‚Ù‚¤‚»‚¤
+‚µ‚ã‚­‚Å‚ñ
+‚ª‚ñ‚±‚¤
+‚Ä‚¢‚ß‚ñ
+‚ä‚©‚í
+‚ß‚¢‚¹‚¢
+‚¶‚ñ‚Ò‚ñ
+‚Ç‚¶‚傤
+‚Í‚ñ‚¿‚傤
+‚¸‚¢‚¢‚ñ
+‚Å‚Ñ‚ã[
+‚È‚µ‚å‚È‚è‚·‚Æ
+‚²‚¾‚ñ‚©‚¢
+‚Ђ³‚­
+‚Ý‚º‚ñ
+‚¹‚¢‚¯‚¢
+‚ ‚炽
+‚Ç‚¤‚©‚ñ‚·‚¤
+‚È‚ñ‚ׂ¢
+‚Ó‚¯
+‚Æ‚¤‚±‚¤‚«
+‚¹‚¢‚¹‚«
+‚©‚Á‚Ï‚Â
+‚¾‚¢‚è‚ñ
+‚»‚Á‚±‚¤
+‚¹‚ñ‚Û‚¤
+‚­‚낤
+‚¸‚¢‚¿‚傤
+‚Ü‚µ‚½
+‚Ü‚ß
+‚µ‚傤‚â‚­
+‚©‚µ‚å
+‚ª‚ñ‚©
+‚ ‚‚Å
+‚‚߂ ‚킹
+‚¯‚ñ‚Û‚­
+‚¶‚傤‚悤‚µ‚á
+‚µ‚ケ‚¤‚¬‚傤
+‚µ‚Í‚ñ
+‚Æ‚Á‚«‚Ô
+‚Í‚ñ‚µ‚ñ
+‚µ‚‚¯
+‚ç‚ׂñ‚¾[
+‚Ó‚Æ‚¤‚±‚¤
+‚낤‚Ђ©
+‚·‚¢‚µ‚傤‚½‚¢
+‚¦‚ê‚­‚Æ‚ë
+‚˂‚¶‚傤
+‚¹‚ñ‚¢
+‚â‚­‚µ
+‚¿‚傤‚³‚«‚å‚­
+‚Ë‚¦
+‚©‚º‚ ‚½‚è
+‚¿‚·‚¶
+‚¶‚ã‚ñ‚·‚¢
+‚½‚¢‚Ó‚¤
+‚³‚Ñ‚Ç‚ß
+‚»‚¤‚ë‚ñ
+‚Ђ炪‚È
+‚¾‚é‚Ü
+‚Î[‚Ç
+‚¾‚ñ‚Ç‚¤
+‚·‚©[‚Æ
+‚Å‚ñ‚¹‚Â
+‚¿‚á‚©‚¢
+‚Ú‚¤‚¯‚¢
+‚Ö‚é‚Õ
+‚΂¢‚©
+‚µ‚ñ‚µ‚å‚­
+‚Ó‚ë[
+‚¿‚イ‚µ‚イ
+‚æ‚¿‚å‚«‚ñ
+‚µ‚イ‚¹‚¢‚ ‚ñ
+‚¢‚È‚³‚­
+‚·‚è
+‚¿‚á‚­‚µ‚å‚­‚è‚å
+‚»‚±
+‚Ì[‚Ü‚é
+‚¨‚¤‚¶‚ñ
+‚µ‚ã‚¿‚傤
+‚¹‚ñ‚悤‚¹‚ñ
+‚Ó‚ç‚Á‚Æ
+‚¨‚­‚¿
+‚¹‚«‚Ç‚¤
+‚¼‚­‚è‚傤
+‚³‚¢‚µ‚ñ‚ª‚½
+‚Ü‚«‚¦
+‚»‚‚¶‚ã
+‚¶‚Ú
+‚½‚­‚¶‚傤
+‚È‚©‚Ü‚­
+‚©‚Ó
+‚µ‚傤‚悤
+‚µ‚å‚­‚µ‚ã
+‚Þ‚±‚悤‚µ
+‚Ó‚Ç‚¤
+‚Ô‚ñ‚ ‚ñ
+‚Æ‚¯‚¢‚¾‚¢
+‚¬‚å‚­‚ë
+‚µ‚傤‚Ç‚­‚¦‚«
+‚»‚¤‚è‚å‚­
+‚Þ‚º‚¢
+‚µ‚ñ‚Ú‚é
+‚¿‚è‚ß‚ñ
+‚Ó‚¤‚¹‚Â
+‚Ù‚¹‚ñ‚­
+‚Æ‚à‚Ñ‚«
+‚¬‚©‚¢
+‚±‚È
+‚È‚©‚·‚¶
+‚Å‚¡[‚ç[
+‚¦‚ñ‚¿‚Ä‚ñ
+‚³‚¤‚·
+‚µ‚á‚Ç[
+‚ׂñ‚Û‚¤
+‚₵‚å‚­
+‚±‚¤‚¨
+‚½‚É‚ª‚í
+‚‚«‚¬‚è
+‚Æ‚Á‚«‚å‚Ô
+‚©‚¢‚¹‚¢
+‚«‚ã[‚Ò[
+‚¢‚ñ‚Ô‚ñ
+‚ ‚­‚¶
+‚Ë‚ñ‚Æ‚¤
+‚Ý‚½‚ß
+‚Ç‚µ‚á‚­‚¸‚ê
+‚Ë‚à‚Æ
+‚©‚¿‚Ü‚¯
+‚ ‚¹‚ñ‚Ô‚è
+‚낯‚Á‚Æ
+‚ß‚¢‚¬
+‚΂¶‚¥‚Á‚Æ
+‚Ä‚Á‚Û‚¤
+‚¦‚È‚ß‚é
+‚·‚è[
+‚¨‚肶‚È‚é
+‚­‚ë‚Ü‚­
+‚¨‚à‚©‚¶
+‚Ä‚Á‚©
+‚Ì‚¤‚Ђñ‚¯‚Â
+‚Æ‚¤‚¶‚ñ
+‚Í‚é‚â‚·‚Ý
+‚Þ‚Á‚Â
+‚È‚ñ‚È‚ñ‚¹‚¢
+‚Ì‚¤‚Ђñ‚µ‚å
+‚â‚Ý
+‚¹‚Æ
+‚¨‚ß‚ª
+‚½‚¢‚°‚ñ
+‚µ‚Ù‚ñ
+‚³‚«‚イ
+‚è‚傤‚Ä‚¢
+‚Ô‚ñ‚®‚Ä‚ñ
+‚¹‚ñ‚ë
+‚»‚¤‚낤
+‚²‚¯‚ñ‚µ‚傤
+‚«‚å‚­‚¿
+‚»‚¤‚Í‚Â
+‚Ñ‚Ó‚¤
+‚Ì‚¤‚¶‚傤
+‚‚­‚育‚Æ
+‚Ó‚ë
+‚¨‚¢‚³‚«
+‚¹‚Æ‚à‚Ì
+‚µ‚傤‚«‚å‚­
+‚‚ä
+‚΂ñ‚¹‚¢
+‚ ‚肪‚½‚ß‚¢‚í‚­
+‚½‚¯‚ñ
+‚Ђ¦
+‚ׂ‚¶‚傤
+‚¢‚µ‚×
+‚䂤‚₯
+‚Í‚­‚Í‚Â
+‚¶‚ñ‚¿
+‚µ‚ñ‚¨‚ñ
+‚±‚¤‚΂¢‚è‚å‚­
+‚³‚ñ‚©‚­
+‚Ó‚¶‚䂤
+‚Ö‚ñ‚Å‚ñ‚µ‚å
+‚¹‚ñ‚«‚傯‚ñ
+‚è‚傤‚©‚ñ
+ƒs
+‚è‚傤
+‚Í‚¢‚ª
+‚µ‚傤‚©
+‚‚«
+‚µ‚傤‚낤
+‚ׂÁ‚µ‚Â
+‚¿‚イ‚±
+‚Þ‚»‚¤
+‚킽
+‚¿‚ç‚ñ
+‚Ý‚Á‚«‚傤
+‚ ‚‚©‚¢‚Ä‚ñ
+‚±‚«‚傤
+‚т傤‚æ‚Ý
+ƒ‹
+‚Ó‚­‚ë‚Æ‚¶
+‚µ‚¶‚ã‚­
+‚¶‚イ‚¹‚«
+‚Ăт傤‚µ
+‚½‚¢‚¯‚ñ‚¾‚ñ
+‚ª‚­‚½‚¢
+‚¹‚ñ‚Ë‚Â
+‚º‚ñ‚µ‚ñ
+‚Í‚­‚ç‚­
+‚Ä‚Ê‚©‚è
+‚Ä‚¢‚©‚ñ
+‚±‚ñ‚È‚ñ
+‚«‚µ‚å‚­
+‚¶‚傤‚Ð
+‚ ‚¢‚¦‚ñ‚©
+‚±‚­‚²
+‚µ‚ñ‚»
+‚¸‚µ
+‚Ü‚«‚ª‚Ý
+‚Ñ‚ñ‚Ú‚¤
+ƒg
+‚Ý‚­‚ë
+‚Â[
+‚°‚‚܂Â
+‚ª‚­‚¿‚傤
+‚悽
+‚½‚‚Ý
+‚µ‚傤‚«
+‚¤‚邤‚«
+‚º‚Á‚¯‚¢
+‚½‚Ë‚ ‚Ô‚ç
+‚ê‚ñ‚ɂイ
+‚º‚ñ‚»‚­
+‚¨‚à‚Ä‚Þ‚«
+‚Ä‚¶‚傤
+‚Æ‚Á‚Ä‚¢
+‚·‚¢‚¬‚ñ‚Æ‚¤
+‚Õ‚ç‚¿‚È
+‚­‚í
+‚«‚è‚ÂÜ
+‚¨‚­‚ª‚½
+‚Í‚ñ‚Ë
+‚Ȃ‚Î
+‚Í‚½‚³‚­
+‚Ü‚Á‚µ‚ë
+‚¸‚¢‚¢‚¿
+‚©‚¢‚¾‚¢
+‚ ‚«‚©‚ñ
+‚Ä‚é
+‚΂Á‚Ó‚Ÿ
+‚ç‚¢‚Ô
+‚Æ‚­‚ª‚í
+‚¯‚¢‚ç‚ñ
+‚¿‚Ö‚ñ
+‚‚¤‚悤
+‚¤‚Ô‚ä
+‚Å‚ñ‚ë
+‚¢‚à
+‚Í‚ñ‚΂¢‚Ô
+‚«‚ñ‚ª‚­
+‚¹‚¢‚¬
+‚µ‚イ‚¶
+‚»‚ñ‚ç‚­
+‚½‚ñ‚©[
+‚Å‚Ý‚¹
+‚·‚Æ‚Á‚­
+‚·‚¶‚ ‚¢
+‚ꂵ[‚Ô
+‚Í‚ñ‚«
+‚Å‚ñ‚¹‚ñ‚т傤
+‚µ‚á‚©‚¢‚ ‚­
+‚ð
+‚¬‚催‚傤
+‚è‚ñ‚Ç‚¤
+‚·‚È‚Ç‚¯‚¢
+‚Ö‚ñ‚ë
+‚Æ‚¤‚¨‚ñ
+‚킵‚å‚­
+‚ɂ傤‚Ç‚­‚µ‚傤
+‚É‚å‚¢
+‚ß‚Á‚©
+‚Ê‚¢‚®‚é‚Ý
+‚¬‚Ë‚ñ
+‚­‚ꂶ‚Á‚Æ
+‚É‚Á‚¯‚¢‚ê‚ñ
+‚悤‚‚¤
+‚Ì‚¤‚ª‚­
+‚¦‚¢‚í
+‚Í‚©‚¢‚µ
+‚¶‚µ‚Â
+‚º‚ñ‚Ë‚ñ
+‚¦‚¢‚¬‚傤‚µ‚å
+‚ ‚°‚­
+‚¬‚傤‚Þ
+‚«‚¨‚¤‚µ‚傤
+‚µ‚ã[
+‚¤‚¡‚ñ‚Ç‚¤
+‚¯‚¢‚â‚­‚µ‚å
+‚‚©‚¢‚Ý‚¿
+‚µ‚«‚¶‚傤
+‚·‚½‚ñ‚Õ
+‚Ü‚«‚Î
+‚â‚«‚¢‚à
+‚©‚¨‚È‚¶‚Ý
+‚Å‚¡‚·‚Æ‚è‚Ñ‚ã[
+‚Ý‚Á‚­
+‚¿‚ñ‚µ‚á‚­‚è‚傤
+‚È‚¢‚©‚­
+‚¯‚¢‚µ‚¿‚傤
+‚¾‚¢‚ ‚à‚ñ‚Ç
+‚©‚¢‚ç‚¢
+‚«‚傤‚¢‚­‚¿‚傤
+‚¤‚Ö‚ñ
+‚¶‚ñ‚©‚¢
+‚°‚Á‚±‚¤
+‚Æ‚¤‚©‚‚قñ‚Ô
+‚Ù‚ñ‚¢
+‚µ‚ã‚­‚³‚¢‚¶‚Â
+‚±‚µ‚傹‚«
+‚¿‚ñ‚Õ
+‚ ‚­‚¹‚·
+‚¹‚¢‚¶‚á‚­
+‚¹‚ñ‚΂ñ
+‚µ‚ñ‚©
+‚Ђ¿‚イ
+‚¹‚ñ‚Ï‚­
+‚©‚¢‚©‚¢‚µ‚«
+‚Ö‚ñ‚­‚Â
+‚¶‚Á‚Ò
+‚è‚«‚è‚Â
+‚¤‚½‚°
+‚¢‚±‚ç‚¢‚´
+‚µ‚å‚䂤‚¯‚ñ
+‚è‚ê[‚µ‚å‚ñ
+‚¿‚è
+‚¯‚¢‚³‚ñ‚«
+‚µ‚ã‚°‚¢
+‚¬‚é‚Ç
+‚½‚¢‚Ü[
+‚‚è‚΂è
+‚è‚イ‚¸
+‚悤‚±‚¤
+‚¨‚¨‚æ‚»
+‚¾‚ñ‚䂤
+‚¢‚܂悤
+‚ЂÁ‚©‚­
+‚΂ñ‚Ý‚ñ
+‚Ђ‚º‚ñ
+‚«‚債‚ñ‚½‚ñ‚©‚¢
+‚°‚ñ‚·‚ñ
+‚Ü‚¢‚±‚ñ
+‚¢‚ñ‚·‚½‚ñ‚·
+‚·‚Ò[‚©
+‚µ
+‚°‚Á‚µ‚イ
+‚µ‚ザ‚ñ‚±‚¤
+‚Ü‚«‚µ‚Ü‚Þ
+‚«‚イ‚µ‚å
+‚¹‚¢‚·‚¢
+‚½‚­‚µ[
+‚»‚¤‚»‚¤
+‚µ‚ソ‚¢
+‚Ђ¢‚ê
+‚©‚Ë‚ß
+‚¶‚å‚¢
+‚Ü‚é‚₯
+‚®‚炽‚ñ
+‚¹‚¢‚»‚¤‚¯‚ñ
+‚µ‚傤‚æ
+‚É‚Á‚±‚¤
+‚Þ‚ª‚­
+‚©‚Ý‚Ä
+‚Ä‚ñ‚·‚¢
+‚µ‚‚¶
+‚µ‚肱‚ñ
+‚Ý‚·‚Ä‚è
+‚¾‚·‚¤
+‚¦‚«‚µ‚á
+‚±‚±‚낼‚¦
+‚¬‚ñ‚±‚ñ‚µ‚«
+‚¾‚¢‚Ç‚¤
+‚Ñ‚¦‚ñ
+‚»‚¤‚µ‚ã
+‚䂤‚¦‚ñ‚¿
+‚í‚Ó‚­
+‚µ‚ñ‚³‚©
+‚¦‚Ü‚«
+‚¯[‚Ô‚é
+‚¶‚±‚­
+‚¨‚ñ‚»‚­
+‚¢‚肤‚Ý
+‚©‚¢‚·‚¤
+‚ª‚ñ‚«‚傤
+‚Í‚ñ‚©‚¿
+‚Ö‚ñ‚¶
+‚è‚á‚­‚²‚¤
+‚É‚Ô
+‚Ì‚¤‚µ
+‚ЂƂ܂­
+‚µ‚á‚悤
+‚É‚à‚Â
+‚·‚¤‚Ü‚ñ
+‚º‚ñ‚±‚¤
+‚¢‚¢‚ñ
+‚Ç‚½‚ñ‚Î
+‚»‚Æ‚¤
+‚Æ‚µ‚Ì‚¹
+‚±‚¤‚¢
+‚¤‚ñ‚ß‚¢
+‚±‚ç‚¢
+‚Ñ‚Æ‚¤
+‚¨‚í‚è
+‚æ‚è‚Ý‚¿
+‚«‚ñ‚É‚­‚µ‚Â
+‚«‚ñ‚¶‚¿
+‚´‚½‚­
+‚µ‚イ‚Ù‚¤
+‚È‚ñ‚±‚¤
+‚©‚­‚¿‚傤‚µ
+‚ª‚ñ‚¬
+‚·‚ª‚½
+‚ׂ̂¶‚ñ‚¢‚ñ
+‚±‚¤‚´‚¢
+‚¹‚¢‚Ö‚«
+‚ЂԂ»‚¤
+‚Å‚ñ‚í‚«‚å‚­
+‚Ó‚«‚イ‚«
+‚©‚¨‚è
+‚±‚¤‚¦‚ñ‚©‚¢
+‚Þ‚¯‚¢
+‚·‚Æ[‚Ô
+‚ ‚­
+‚»‚ç‚Ë
+‚°‚ñ‚µ‚è‚傤
+‚Í‚Æ‚Î
+‚²‚悤‚ß‚¢
+‚©‚½‚Í‚¾
+‚½[‚Þ
+‚±‚à‚¶
+‚Ú‚¯‚¢
+‚µ‚傳
+‚Ù‚¤‚è‚Â
+‚µ‚å‚â
+‚Í‚ê
+‚µ‚©‚­‚¯‚¢
+‚Õ‚ç‚®
+‚¯‚¢‚¦‚¢‚µ‚á
+‚è‚ñ‚µ‚傤
+‚­‚Ä‚ñ
+‚µ‚傤‚©‚¹‚ñ
+‚Ý[‚Æ
+‚µ‚ã‚Ý
+‚·‚΂±
+‚¿‚イ‚·‚¢‚¦‚ñ
+‚®‚ñ‚Õ‚­
+‚Ђ₠‚¹
+‚µ‚Ú‚¤‚è‚Â
+‚Æ‚¤‚è‚傤
+‚µ‚©‚΂Ë
+‚‚¤‚Ö‚¢
+‚ ‚ñ‚Ä‚¢‚¹‚¢
+‚¹‚¢‚¾‚­
+‚Ó‚ñ‚Þ‚«
+‚Ȃׂà‚Ì
+‚ç‚Á‚©‚¹‚¢
+‚½‚¢‚Ü
+‚«‚µ‚ã‚­‚µ‚á
+‚»‚Ì‚¹‚Â
+‚¬‚å‚é‚¢
+‚¶‚傤‚â‚Æ‚¤
+‚³‚·
+‚¹‚«‚킯
+‚ª‚±‚¤
+‚ê‚¢‚Ó‚­
+‚Å‚Ì‚Ý
+‚©‚½‚­‚è
+‚¹‚¾‚¢
+‚Ó‚¤‚½‚¢
+‚½‚¢‚©
+‚¬‚å‚è‚傤
+‚¶‚­‚ñ
+‚¦‚ñ‚Û‚¤
+‚¢‚µ‚ª‚«
+‚±‚±
+‚©‚¬‚è
+‚É‚¿‚Ó‚Â
+‚·‚¢‚µ‚ñ‚Ô
+‚½‚¢‚­‚Â
+‚ê‚à‚ñ
+‚Ñ‚¶‚ã‚‚©
+‚¦‚«
+‚Ç‚ç‚Þ
+‚¢‚肦
+‚ê‚Á‚Ï‚¢
+‚»‚Â
+‚Ä‚²‚½‚¦
+‚ ‚ñ‚µ‚ñ‚©‚ñ
+‚±‚܂©‚¢
+‚Ó‚³‚­
+‚Í‚­‚¶‚ã
+‚²‚悤‚Í‚¶‚ß
+‚Ó‚é‚Ç‚¤‚®
+‚«‚è‚イ
+‚ª‚ñ‚¿‚イ
+‚½‚悤
+‚µ‚µ
+‚ ‚Ý‚¾‚È
+‚ã
+‚͂肪‚Ë
+‚µ‚«‚Ó‚­
+‚±‚ñ‚«
+‚Ђ¢‚炬
+‚¸‚΂ñ
+‚Ó‚µ‚傤‚¿
+‚½‚ñ‚½‚¢
+‚µ‚½‚‚Ý
+‚Þ‚¹‚ñ
+‚¤‚¿‚¤‚¿
+‚¹‚Õ‚Ä‚ñ‚Î[
+‚í‚©‚Ý‚â
+‚°‚·‚¢
+‚¶‚«‚イ‚è‚å‚­
+‚Ä‚Á‚¹‚«
+‚í‚©‚ñ
+‚½‚¯‚Ì‚±
+‚¯‚¢‚¹‚¢
+‚æ‚ë‚­
+‚¯‚Þ‚è
+‚È‚ñ‚Ò‚Æ
+‚¢‚Á‚¿‚傤‚¢‚Á‚¹
+‚µ‚å‚­‚è‚傤‚Ђñ
+‚½‚ñ‚Ç‚­
+‚µ‚Á‚©‚ñ
+‚¤‚炨‚à‚Ä
+‚½‚Ä‚±‚¤
+‚µ‚傤‚±‚¤‚®‚ñ
+‚¶‚Ø[‚¶
+‚͂‚¤‚Ü
+‚±‚¤‚낤‚«‚傤
+‚«‚å‚ê‚¢
+‚¶‚á‚­‚µ
+‚Ý‚ñ‚í
+‚¨‚¿‚Ú
+‚Õ‚ç‚¢‚Ü‚è
+‚«‚イ‚«‚傤
+‚¯‚ñ‚¶‚ã‚Â
+‚è‚傤‚¿‚傤
+‚¶‚ã‚­
+‚¨‚Ý‚«
+‚Í‚ñ‚É‚á
+‚½‚Ë
+‚¤‚Ü‚ê
+‚¾‚¢‚É‚©
+‚¿‚µ‚«
+‚¢‚¦
+‚í‚Ñ‚¶‚傤
+‚¾‚¢‚è‚É‚ñ
+‚Í‚ñ‚±‚‚¹‚¢‚µ‚ñ
+‚Þ‚¾‚ ‚µ
+‚₯‚¢‚µ
+‚¨‚¨‚ª‚ç
+‚Í‚ñ‚¶‚傤
+‚¨‚«‚ ‚¢
+‚¾‚¢‚Ô‚Ô‚ñ
+‚±‚­‚䂤‚Âǂ¤
+‚¢‚Á‚Ï‚ñ‚Ä‚«
+‚ß‚ç‚Ý‚ñ
+‚Í‚¢‚΂ñ
+‚Ä‚¢‚Ë‚ñ
+‚Æ‚±
+‚¶‚¿‚½‚¢
+ƒh
+‚Ý‚Á‚¯‚¢
+‚«‚è‚Ƃ肹‚ñ
+‚°‚¢‚Ó‚¤
+‚¶‚ク‚ñ‚µ‚á
+‚Õ‚ç‚ñ‚È[
+‚É‚Ì‚Ü‚¢
+‚¿‚á‚­‚ª‚ñ‚Ä‚ñ
+‚¦[‚¶‚¥‚ñ‚µ[
+‚ß‚Á‚µ‚ã
+‚µ‚ñ‚è‚å
+‚³‚¿
+‚º‚ñ‚Ø‚ñ
+‚ß‚Ú‚µ
+‚º‚Á‚½‚¢
+‚«‚¶‚傤
+‚©‚ñ‚ª‚Á‚«
+‚¤[‚ë‚ñ
+‚ä‚¢‚µ‚å
+‚®‚Ä‚¢
+‚ ‚Á‚µ‚ã‚­‚«
+‚à‚­‚½‚ñ
+‚¿‚Ù‚¤‚­
+‚ª‚¢‚ß‚ñ
+‚½‚ñ‚܂‚«
+‚Ƃ‚¬‚³‚«
+‚¢‚ñ‚΂ñ
+‚¬‚å‚®
+‚½‚¢‚Ü‚Â
+‚±‚¤‚肬‚傤
+‚¶‚Á‚¿‚イ‚Í‚Á‚­
+‚²‚©‚¢‚»‚¤
+‚ӂ悤‚¢
+‚Ղ낾‚­‚Æ
+‚¼‚­‚µ‚傤
+‚¿‚ª‚¢‚Ù‚¤‚¯‚ñ
+‚É‚ñ‚µ‚傤
+‚Í‚ñ‚®‚é
+‚Ú‚Á‚¿‚á‚ñ
+‚è‚©‚ª‚­
+‚·‚¢‚ ‚Â
+‚ß‚è‚Á‚Æ
+‚¿‚傤‚Æ
+‚Ó‚¸‚¢
+‚ׂñ
+‚¿‚å‚Á‚±‚¤‚Ñ‚ñ
+‚©‚±‚¤‚Ð
+‚Þ‚ë‚Ü‚¿
+‚©‚‚ë
+‚»‚¤‚í
+‚΂Ƃ¤
+‚¦‚ñ‚Æ‚Â
+‚¾‚‚¶
+‚Í‚¾‚´‚í‚è
+‚¾‚¢‚³‚ñ‚²‚­
+‚¾‚¢‚µ
+‚Ü‚­
+‚³‚¢‚í‚¢
+‚Ä‚¢‚»‚­
+‚Ô‚«
+‚©‚ñ‚¶
+‚¹‚Á‚©‚¢
+‚µ‚傤‚ª‚Â
+‚©‚¢‚°‚ñ
+‚Ì‚¤‚½‚ñ
+‚ ‚Ç‚è‚Ô
+‚Ђµ‚å‚©‚ñ
+‚Ü‚é
+‚â
+‚‚¢‚µ‚¯‚ñ
+‚Ô‚ñ‚¶‚傤
+‚µ‚ã‚Á‚Ä‚ñ
+‚Ü‚Ç‚×
+‚¯‚Á‚Ä‚¢‚΂ñ
+‚¿‚®‚³
+‚Ç‚Á‚Æ
+‚¨‚¢‚»‚ª‚µ‚¢
+‚Ù‚¶‚å‚«‚ñ
+‚©‚¢‚Ђñ
+‚Ý‚µ‚傤
+‚³‚ñ‚º‚ñ
+‚¹‚ñ‚­‚ñ
+‚‚¢‚µ
+‚΂³‚Ý
+‚«‚ê‚Ü
+‚¹‚¢‚©‚‚Ð
+‚Ü‚Á‚¿‚á
+‚¿‚イ‚Ô‚¤
+‚©‚¢‚¢‚ñ‚¹‚¢
+‚±‚­‚³‚­
+‚ ‚°‚µ‚¨
+‚¢‚ë‚ñ
+‚©‚Á‚¹‚¢
+‚º‚ñ‚ç
+‚à‚¯‚¢
+‚¢‚«‚Ç‚Ü‚è
+‚ ‚µ‚Î
+‚Ô‚Â
+‚¿‚イ‚»
+‚Ì‚Ä‚ñ
+‚«‚å‚­‚΂ñ
+‚³‚Á‚±‚ñ
+‚Ú‚¤‚Æ‚¤
+‚è‚Ó‚¶‚ñ
+‚‚©‚¢‚©‚½
+‚Ç‚¤‚ß‚¢
+‚«‚傤‚©‚¢‚¹‚ñ
+‚«‚½‚É‚Á‚Û‚ñ
+‚Ü‚Ü‚±
+‚¢‚è‚Ó‚Ë
+‚ꂽ‚·
+‚º‚Á‚¿‚傤
+‚©‚¢‚¾‚ñ
+‚Ý‚ñ‚µ‚á
+‚©‚ñ‚¹‚‚¦‚ñ
+‚Æ‚¤‚Î
+‚Ë‚ñ‚Ü‚Â
+‚µ‚傤‚µ‚å
+‚¹‚¢‚«
+‚»‚¤‚µ‚ñ
+‚΂µ‚á
+‚Í‚ñ‚¹‚Â
+‚±‚¤‚¶‚­
+‚¾‚¢‚©‚ñ
+‚·‚Æ[‚è[
+‚â‚Ü‚Æ
+‚¢‚½‚ª‚Ë
+‚Ô‚ñ‚µ‚å‚Ô
+‚±‚¤‚낤
+‚«‚傾‚ñ
+‚¹‚Ђ傤
+‚´‚ñ‚µ
+‚è‚ñ‚Ï‚¹‚ñ
+‚Ù‚­‚Ô
+‚Ђ«‚¿‚á
+‚©‚¿‚«
+‚¹‚¢‚»‚¤
+‚¿‚傤‚¦‚«
+‚·‚Ø[‚·
+‚Ì‚â‚Ü
+‚Û‚¢‚ñ‚½
+‚ɂイ‚´‚¢
+‚ׂĂç‚ñ
+‚Ì‚¢‚ë[‚º
+‚ ‚­‚Þ
+‚Í‚ñ‚¯‚ñ
+‚Æ‚°
+‚±‚ñ‚à‚¤
+‚³‚ñ‚è‚傤
+‚ ‚¢‚Å‚ 
+‚Ä‚ñ‚µ
+‚Ù‚­‚°‚ñ
+‚¤‚«‚®‚à
+‚Ä‚ñ‚©‚¢‚¸
+‚½‚ß‚É
+‚°‚¢‚Ì‚¤‚¶‚ñ
+‚Ý‚ª‚«‚±
+‚â‚·‚à‚Ì
+‚Ă炱‚â
+‚¢‚à‚¤‚Æ
+‚±‚¤‚±‚¤‚¹‚¢
+‚ ‚肪‚Ë
+‚²‚¶‚イ‚¨‚ñ‚¶‚ã
+‚æ‚è‚‚«
+‚·‚ñ‚±‚­
+‚©‚­‚¹‚¢‚«
+‚µ‚傤‚ê‚¢
+‚Õ‚ç‚¢‚΂µ
+‚©‚¦
+‚Æ‚Ñ‚¢‚µ
+‚¶‚¶‚‚¶‚傤
+‚È‚©‚¢
+‚‚݂½‚Ä
+‚É‚Ù‚ñ‚©‚¢
+‚È‚ñ‚Ç‚­
+‚»‚¤‚¦‚ñ
+‚Í‚ñ‚Ç‚¤
+‚Ï‚ñ‚Ó‚ê‚Á‚Æ
+‚¤‚ß‚µ‚ã
+‚¤‚¯‚¢‚ê
+‚È‚¾
+‚µ‚‚¬‚傤‚µ‚á
+‚Ú‚ñ‚Ç
+‚¸‚©‚ñ
+‚©‚Ƃ肹‚ñ‚±‚¤
+‚¶‚傤‚è‚å‚­
+‚ª‚­‚Æ
+‚¿‚傤‚¦‚ñ
+‚Ó‚Ñ
+‚‚¤‚³‚ñ‚µ‚傤
+‚¿‚傤‚È‚¢‚©‚¢
+‚¢‚Â
+‚Ó‚½
+‚«‚ñ‚è‚å‚­
+‚Ђí‚è
+‚¶‚¼‚­‚¹‚¢
+‚ ‚Ì‚±‚Æ
+‚Ђ³‚¢‚¿
+‚©‚¹‚¢
+‚¯‚¢‚ª‚¢
+‚Å[‚½
+‚¯‚ñ‚Û‚¤
+‚Ä‚ª‚ç
+‚«‚ñ‚»‚­
+‚¹‚¢‚³‚ñ‚¹‚¢
+‚³‚¢‚Ä‚¢‚°‚ñ
+‚®‚ñ‚±‚­
+‚¨‚â‚·‚Ý
+‚«‚¯‚Â
+‚¶‚ã‚ñ‚±‚¤‚¹‚ñ
+‚Í‚¢‚·‚¢‚Ì‚¶‚ñ
+‚©‚è‚å‚­
+‚±‚Ì‚¦
+‚±‚Ü‚¿
+‚µ‚Ä‚¡[
+‚µ‚ë‚Þ‚­
+‚½‚¢‚悤‚¯‚¢
+‚»‚Ì‚à‚Ì
+‚è‚傤‚䂤
+‚±‚¤‚·‚¤
+‚¹‚¢‚¨‚ñ
+‚Ђ«‚傤
+‚ç‚ñ‚Ú‚¤
+‚µ‚Ú‚¤‚±‚¤
+‚Ô
+‚µ‚å‚Ù‚¤‚¹‚ñ
+‚µ‚傤‚Ó‚¾
+‚Ä‚ñ‚Û‚ç‚è[
+‚©‚ê‚ñ‚Æ
+‚±
+‚¹‚¢‚è‚傤
+‚¬‚Ä‚ñ
+‚¢‚¹‚Â
+‚©‚ñ‚Û‚¤
+‚Í‚¢‚Ó‚«‚¶‚ã‚ñ
+‚¿‚ñ‚«
+‚Í‚ñ‚É‚ñ‚Ü‚¦
+‚Ó‚¤‚Ç
+‚ ‚©‚à‚ñ
+‚±‚¤‚«‚イ‚Ñ
+‚·‚ñ‚Ô‚ñ
+‚¢‚¿‚Ë‚ñ
+‚³‚ñ‚·‚¤
+‚â‚®‚é‚Ü
+‚¢‚ñ‚Ç‚¤
+‚µ‚傤‚¢‚ñ
+‚­‚é‚Ý
+‚΂ñ‚«
+‚â‚­‚ß
+‚µ‚å‚Ù‚¤
+‚»‚¤‚¿‚傤
+‚Æ‚Ý
+‚­[‚ç[
+‚é‚­‚·
+‚å
+‚­‚¤‚©‚¢
+‚Õ‚ë‚«‚イ
+‚¹‚ñ‚肪‚ñ
+‚É‚Á‚Ä‚ñ
+‚¶‚«‚イ‚¹‚ñ
+‚³‚ñ‚¼‚­
+‚»‚±‚­
+‚¢‚Á‚³‚­‚¶‚Â
+‚¤‚¢‚·‚«[
+‚Ù‚¤‚ª
+‚Å‚¡‚·‚©‚¤‚ñ‚Æ
+‚Ó‚¶
+‚µ‚¹‚ñ
+‚ë‚Ђ傤
+‚À[‚º‚é
+‚©‚Ô‚ñ
+‚ê‚¢‚ª‚¢
+‚΂ñ‚»‚¤‚±‚¤
+‚ê‚¢‚Ù‚¤
+‚¹[‚Ó
+‚°‚ñ‚«‚ñ
+‚¯‚¢‚Ô
+‚Ü[‚Æ
+‚³[‚­‚é
+‚¦[‚Õ‚è‚é
+‚ç‚Þ‚Ë
+‚Ú‚¤‚¿‚イ
+‚Ü‚ñ‚µ‚á
+‚¹‚ñ‚¶‚傤‚¦‚«
+‚Ó‚µ‚«
+‚¦‚ñ‚©
+‚¹‚‚¼‚­‚µ
+‚‚¯‚ ‚킹
+‚킪‚Ü‚Ü
+‚‚¢‚²
+‚¢‚­‚³
+‚·‚¤‚ª‚­‚©
+‚«‚ñ‚©‚¢
+‚³‚­‚Ђñ
+‚Ä‚²‚±‚ë
+‚ä‚É
+‚ª‚¢‚Ô
+‚±‚­‚Ђñ
+‚΂­‚ç‚¢
+‚«‚È‚ñ
+‚©‚­‚µ‚傤‚¿‚傤
+‚Ó‚Ü‚ñ
+‚Ü‚­‚ ‚¯
+‚ª‚©
+‚½‚¢‚©‚­
+‚¢‚«‚³‚«
+‚³‚¢‚½‚¢‚µ‚á
+‚¹‚‚¶‚傤
+‚¶‚傹‚Â
+‚É‚¿
+‚Ó‚Ú
+‚Ñ‚ñ‚µ‚傤‚¹‚¢
+‚Ö‚¢‚Ù‚¤‚±‚ñ
+‚¿‚á‚­‚¦‚«
+‚Ä‚ñ‚Ø‚ñ
+‚悵‚ñ
+‚¢‚É‚µ‚ ‚¿‚Ô
+‚«‚±‚È‚µ
+‚Ù‚¤‚Þ‚©
+‚¨‚¤‚Æ‚Â
+‚Å‚Ó‚§‚é‚Æ
+‚¾‚¢‚«‚¿
+‚ ‚«‚¿
+‚³‚¦
+‚±‚¤‚¶
+‚¿‚å‚­‚Ù‚¤‚½‚¢
+‚½‚ê‚ñ‚Æ
+‚½‚«‚½
+‚¯‚ñ‚Õ
+‚µ‚å‚«‚©‚ñ
+‚²‚¶‚イ‚µ‚å
+‚±‚ñ‚Û‚ñ
+‚»‚ë
+‚Í‚ñ‚²
+‚Æ‚¤‚悤
+‚µ‚å‚­‚¢‚«
+‚낶‚傤
+‚­‚ñ‚µ‚ケ‚­
+‚ ‚è‚΂¢
+‚Í‚¾
+‚Ü[‚¶‚ñ
+‚Ù‚¤‚Þ‚ª‚©‚è
+‚·‚ß‚ñ
+‚¶‚ñ‚ß‚¢
+‚¨‚¨‚­‚¿
+‚Í‚­‚Ö‚¢
+‚¬‚å‚Ô‚Â
+‚Ä‚«‚¸
+‚ª
+‚Í‚ñ‚©‚­
+‚È‚¢[‚Ô
+‚æ‚ë‚ñ
+‚Æ‚Á‚©‚¢
+‚±‚¢‚Ê
+‚­[‚Å‚½[
+‚Ђ«‚ª‚Ë
+‚¹‚¢‚·‚¤
+‚¢‚Ê‚«
+‚Ü‚Æ‚ñ
+‚±‚­‚³‚¢‚ê‚ñ‚²‚¤
+‚Ä‚¿‚ª‚¢
+‚¨‚¶‚¢‚³‚ñ
+‚¨‚¨‚΂ñ
+‚ß‚¢‚ë
+‚¿‚傤‚¶‚ñ
+‚µ‚¿‚ª‚Â
+‚Þ‚«
+‚¾
+‚®‚µ‚傤
+‚Ù‚¤‚¢‚ª‚­
+‚¦‚è[‚Æ
+‚ ‚Ƃ‚¬
+‚­‚«‚傤
+‚«‚µ‚á
+‚¾‚ñ‚ª‚ñ
+‚µ‚ñ‚³‚µ‚Â
+‚×[‚½
+‚©‚¤‚ñ‚¹‚è‚ñ‚®
+‚µ‚傤‚¿‚å‚­
+‚è‚傤‚¶‚Â
+‚¢‚½‚¸‚ç‚Á‚±
+‚í‚©‚ß
+‚悬‚è
+‚±‚æ‚¢
+‚¤‚è‚Ä
+‚µ‚傤‚΂Â
+‚¿
+‚ª‚¢‚¶
+‚Í
+‚»‚¤‚¾‚ñ‚â‚­
+‚±‚¤‚ЂÂ
+‚è‚悤‚µ‚á
+‚ê‚‚¶‚Â
+‚³‚©‚È
+‚΂¢‚µ‚á‚­‚É‚ñ
+‚ׂ¢‚³‚­
+‚³‚ñ‚¢
+‚Ý‚¸‚­‚³
+‚¶‚傪‚Á‚±‚¤
+‚Ñ‚µ‚傤
+‚Æ‚Ì
+‚µ‚½‚¢
+‚³‚¢‚è‚á‚­
+‚·‚¢‚©
+‚µ‚Ä‚ñ‚Ì‚¤
+‚¾‚¢‚æ‚ñ
+‚½‚Ù‚¤
+‚¶‚‚¬
+‚Å‚·‚­
+‚Í‚È‚À
+‚¹‚¢‚ç‚ñ
+‚ð
+‚¬‚傶‚傤
+‚í‚­
+‚ ‚‚¢‚½
+‚¹‚¢‚È‚ñ‚¹‚¢
+‚Ö‚¢‚µ
+‚Ë‚í‚´
+‚µ‚å‚Ä‚ñ
+‚í‚©
+‚¾‚ç[
+‚±‚ß‚ñ
+‚¯‚¢‚²‚¤‚«‚ñ
+‚ ‚ñ‚Ç
+‚¾‚¢‚ 
+‚»‚ñ‚¦‚«‚è‚Â
+‚¢‚¿‚Ç
+‚Æ‚¤‚ç‚­
+‚ׂ ‚è‚ñ‚®
+‚Ü‚·‚ß
+‚è‚¿
+‚Ђ«‚É‚­
+‚Ђ¾‚è
+‚Ý‚É
+‚¬‚á‚Á‚«‚傤
+‚â‚Ë
+‚Æ‚­‚Í‚ñ‚ª‚©‚è
+‚Ï‚È‚»‚É‚Á‚­
+‚ ‚Ý‚Ì
+‚±‚¤‚µ‚¹‚¢
+‚䂤‚®‚ê
+‚¹‚ñ‚¯‚¢
+‚¢‚Á‚¯‚ñ
+‚«‚傤‚¶‚ã‚ñ
+‚¹‚¢‚Ô
+‚Ü‚É‚ 
+‚«‚イ‚±‚¤
+‚ЂƂ ‚í
+‚Ä
+‚·‚¶‚Ý‚¿
+‚¹‚¢‚¢‚Á‚Ï‚¢
+‚½‚΂±
+‚©‚Õ‚¹‚é
+‚½‚ñ‚µ‚傤‚Æ‚¤
+‚Ä‚Ô‚­‚ë
+‚ë‚ñ‚¾‚ñ
+‚Ó‚§‚邾[
+‚Ù‚¤‚Ä‚¢
+‚Æ‚µ‚‚«
+‚¶‚¹‚Â
+‚»‚¤‚Ù‚ñ‚Ä‚ñ
+‚Ђ‚º‚Â
+‚΂Á‚­‚·
+‚±‚¤‚â‚­
+‚©‚¬
+‚Ђ傤‚ª
+‚Í‚ê‚Ü
+‚ª‚µ‚イ
+‚Å‚®‚¿
+‚µ‚ã‚ñ‚Ý‚ñ
+‚Ý‚¬‚Þ‚«
+‚Ù‚¹‚ñ
+‚­‚¾‚à‚Ì
+‚²‚Ù‚¤‚µ
+‚ЂÜ
+‚Ó‚µ‚Ü‚Â
+‚Æ‚¤‚´‚¢
+‚Ý
+‚Ù‚­‚Ù‚­‚Æ‚¤
+‚É‚Á‚µ‚å‚­
+‚¶‚‚¶‚傤
+‚ ‚ñ‚Ä‚¢‚µ‚å
+‚È‚¢‚ ‚Â
+‚΂ñ‚¿‚á
+‚Ó‚µ‚ ‚킹
+‚©‚ñ‚Õ
+‚¹‚Á‚¯‚¢‚ª‚©‚è
+‚¢‚Ü‚Ç‚«
+‚µ‚ß‚«‚è‚Ñ
+‚³‚ñ‚µ
+‚è‚イ‚¿‚¶‚傤
+‚¹‚¢‚¼‚¤‚¬‚傤
+‚¿‚Ù‚¤‚º‚¢
+‚¤‚¢[‚­
+‚í‚ñ‚Ü‚ñ
+‚¢‚ñ‚¤‚Â
+‚±‚ñ‚Ï‚É‚¨‚ñ
+‚͂‚ǂ¤‚«
+‚à‚­‚¬‚å
+‚±‚ñ‚µ‚イ
+‚Ä‚ ‚©
+‚Ú‚ñ‚Ì‚¤
+‚ЂÈ
+‚©‚¢‚Ð
+‚½‚»‚¤
+‚É‚ñ‚°‚ñ
+‚ª‚ñ‚΂ñ
+‚«‚©‚ñ‚¶‚イ
+‚©‚¯‚¢‚Ú
+‚½‚ñ‚»
+‚¹‚¢‚²
+‚¾‚¦‚«
+‚µ‚ë‚à‚Ì
+‚¨‚¨‚Ý‚¸
+‚Ï[‚­
+‚í‚悤
+‚É‚­‚«
+‚È‚ñ‚҂傤‚悤
+‚¯‚¢‚²
+‚¹‚ß
+‚Ђ̂Å
+‚µ‚傤‚ç‚¢
+‚Ó‚ñ‚è‚イ
+‚Ý‚¸‚¢‚炸
+‚µ‚ñ‚©‚í
+‚È‚ª‚®‚Â
+‚È‚ñ‚à‚ñ
+‚±‚¤‚«‚傤‚Ô‚Â
+‚©‚Ô‚µ‚«‚©‚¢‚µ‚á
+‚¤‚ñ‚¹‚¢
+‚¹‚ñ‚Õ
+‚Ì‚Á‚­
+‚Ç‚­‚Ù‚ñ
+‚Ä‚ê‚Ñ
+‚͂邳‚ß
+‚±‚¤‚¢‚µ‚傤
+‚³‚Þ‚³
+‚¯‚¢‚΂Â
+‚낤‚±‚Â
+‚à‚¿‚Ü‚¦
+‚Ù‚¤‚²
+‚¢‚©‚¾
+‚¿‚©‚¢
+‚ꂽ[
+‚¿‚イ‚µ‚傤
+‚©‚ñ‚ë
+‚Ă­‚è
+‚Ú‚¤‚¦‚ñ‚«‚傤
+‚µ‚¢
+‚©‚´‚¢
+‚É‚¿‚悤
+‚µ‚ñ‚±‚Á‚¿‚傤
+‚¶‚å‚¢‚ñ‚Æ
+‚¼‚­‚Ô‚Â
+‚±‚Ñ
+‚݂傤‚¶‚傤
+‚½[‚Ú
+‚¢‚Ë
+‚à‚Í‚ñ
+‚Ä‚¢‚µ‚ã‚‚³‚«
+‚ЂƂè‚Ú‚Á‚¿
+‚ ‚º‚­‚ç
+‚Ý‚È‚Ý‚ª‚í
+‚Í‚ë[
+‚¦‚ñ‚¶‚É‚ 
+‚à‚Ì‚ª‚½‚è
+‚µ‚傤‚í
+‚«‚©‚«
+‚¹‚ñ‚·
+‚ß‚¨‚Æ
+‚µ‚Ö‚ñ
+‚³‚©‚®‚ç
+‚Ó‚­‚¾‚¢
+‚Æ[‚·‚Æ
+‚¢‚¿‚è‚ñ
+‚Ó‚¡[‚Æ
+‚¿‚å‚·‚¢‚¿
+ƒŽ
+‚¢‚Á‚Ø‚ñ‚Æ‚¤
+‚º‚ñ‚«
+‚Ô‚ñ‚«‚傤
+‚¢‚ȂÂÜ
+‚Ú‚µ
+‚³‚¬‚傤‚µ‚å
+‚µ‚á‚Á‚©‚ñ‚Ù‚¤
+‚«‚Á‚Æ
+‚т悤‚¢‚ñ
+‚ª‚¢‚Þ‚¾‚¢‚¶‚ñ
+‚Æ‚½‚ñ
+‚Å‚ñ‚«‚«‚®
+‚à‚¤‚¢
+‚Æ‚­‚µ‚傤
+‚æ‚Ý‚¹
+‚·‚à[‚­
+‚¹‚¢‚º‚ñ
+‚ß‚¿‚á‚­‚¿‚á
+‚Ü‚³‚«
+‚â‚­‚Ý
+‚Æ‚Ç‚¤‚Ó‚¯‚ñ
+‚¿‚傤‚¶
+‚±‚¤‚Ë‚ñ
+‚¢‚¨‚è
+‚¶‚¾‚¢‚³‚­‚²
+‚É[‚¸
+‚½‚ñ‚Ø‚ñ
+‚¾‚¢‚ ‚é
+‚Æ‚Á‚«
+‚¢‚í‚Î
+‚ ‚ß‚ ‚ª‚è
+‚¹‚«‚´‚¢
+‚΂ñ‚º‚ñ
+‚ß‚Í‚È
+‚«‚¿‚傤‚ß‚ñ
+‚µ‚ã‚­‚¶‚Â
+‚è‚傤‚µ‚å
+‚µ‚ã‚Á‚¿‚傤‚¶‚å
+‚Ó‚¤‚©‚­
+‚Ó‚¤
+‚µ‚ñ‚­
+‚à‚¿‚イ
+‚º‚ñ‚»‚¤‚«‚å‚­
+‚©‚ñ‚¦‚ñ
+‚©‚ñ‚È‚ñ
+‚Ü‚ñ‚´‚¢
+‚낤‚ê‚¢
+‚Ü‚é‚Í‚¾‚©
+‚ª‚¢‚ë‚Æ‚¤
+‚±‚¹‚ñ‚«‚傤
+‚µ‚ガ
+‚°‚¢‚Ђñ
+‚©‚­‚µ‚イ‚©‚ñ
+‚©‚µ‚ñ
+‚Æ‚¤‚´‚æ‚«‚ñ
+‚¯‚Á‚µ
+‚¤‚µ‚ë‚ ‚µ
+‚©‚«‚Æ‚ß
+‚ç‚ñ‚Ç‚è
+‚Ђ̂Æ
+‚ê‚¢‚è‚傤
+‚³‚Æ‚²‚±‚ë
+‚¶‚Ⴊ‚¢‚à
+‚ ‚¨
+‚É‚ã[
+‚Ù‚¤‚«‚傤
+‚Ë‚Á‚½‚¢
+‚¤‚¢‚ñ‚Ç
+‚®‚ñ‚ç‚­
+‚Ȃ킵‚ë
+‚¢‚·
+‚Ô‚½‚ñ
+‚»‚¤‚ß‚ñ‚¹‚«
+‚Ô‚ñ‚·‚¤
+‚¶‚µ‚ñ
+‚½‚¿‚â‚­
+‚í‚ç‚×
+‚¹‚ñ‚Õ‚¤
+‚¶‚ñ‚Æ‚­
+‚ª‚­‚µ
+‚Ö‚ñ‚è‚ñ
+‚µ‚å‚Á‚©‚­
+‚¦‚Ç
+‚è‚イ‚ ‚ñ
+‚µ‚è‚ ‚¢
+‚æ‚Ä‚¢‚ª‚¢
+‚ ‚ñ‚Ç‚ë‚ß‚¾
+‚¾‚ñ‚«‚イ
+‚µ‚ç‚©‚×
+‚³‚ñ‚Ô
+‚¹‚ñ‚΂Âé
+‚­[‚é
+‚µ‚á‚­‚â
+‚â‚¿‚æ
+‚‚¦
+‚µ‚Ý‚ñ
+‚Ô‚½
+‚Ý‚ñ‚낤‚«‚傤
+‚Ô‚Á‚µ‚ñ
+‚½‚ñ‚´
+‚Ä‚«‚Ù‚¤
+‚¶‚傤‚©‚ñ
+‚¨‚¤‚±‚­
+‚¨‚«‚â
+‚³‚¢‚«‚å
+‚¢‚·‚½‚ñ‚Ô[‚é
+‚Í‚Å
+‚Æ‚Á‚«‚å
+‚±‚Ó‚ñ
+‚µ‚イ‚µ‚¯‚¢
+‚¨‚Ô‚Â
+‚²‚ç‚ñ
+‚©‚Ä‚¢‚È‚¢
+‚Ä‚¢‚½‚­
+‚»‚­‚½‚Â
+‚Ù‚ñ‚É‚ñ
+‚«‚傤‚è‚å‚­
+‚݂‚°‚Â
+‚Æ‚¤‚ 
+‚©‚ñ‚¢‚ñ
+‚¾‚©‚ç
+‚·‚Ï‚É‚Á‚µ‚ã
+‚Ù‚º‚ñ
+‚Ë‚ñ‚¿‚傤
+‚Ä‚ñ‚¢
+‚Ä‚ñ‚æ
+‚ë‚Ñ[
+‚©‚Á‚Ï
+‚à‚ñ‚¦‚¢
+‚Ô‚Ç‚¤‚µ‚ã
+‚¿‚イ‚Æ
+‚¨‚¤‚ß‚ñ‚«‚傤
+‚²‚¹‚¢‚µ‚傤
+‚Ó‚¤‚ ‚¢
+‚낤‚ê‚ñ
+‚Ú‚½‚¢
+‚°‚ñ‚±‚ñ
+‚©‚½‚µ‚«
+‚Í‚ñ‚Þ
+‚Ä‚¢‚Ђ傤
+‚±‚¯‚ñ
+‚¹‚ñ‚â‚­
+‚½‚ñ‚ß‚¢
+‚Ä‚ç[
+‚¨‚à‚Ä‚´‚½
+‚è‚傤‚³‚¢
+‚¯
+‚Ä‚ñ‚¾‚¢‚µ‚イ
+‚»‚¤‚í‚«
+‚ ‚É‚Ü‚é
+‚·‚¦‚Ђë
+‚í‚¢‚Ç
+‚¯‚Á‚«‚å‚­
+‚È‚ª‚ ‚ß
+‚Û‚·‚½[
+‚‚肾‚È
+‚ª‚ß‚ñ‚¶‚傤
+‚Ђ̂܂é
+‚¶‚¾‚ñ‚«‚ñ
+‚à‚Ì‚Ü[
+‚â‚肪‚¢
+‚¾‚Ô‚é‚·
+‚ß‚ñ‚é‚¢
+‚©‚¶‚イ
+‚¹‚ñ‚Ü‚ñ
+‚©‚ª‚Ý‚¢‚½
+‚©‚«‚イ
+‚¬‚å‚Ð
+‚°‚Á‚½‚ñ
+‚ ‚¢‚±‚­
+‚Ç‚¤‚»‚¤‚©‚¢
+‚µ‚á‚Æ‚é
+‚ß‚¿‚á‚ß‚¿‚á
+‚Ö‚¢‚킵‚ガ
+‚䂤‚®
+‚¶‚イ‚Ý‚ñ
+‚³‚­‚΂ñ
+‚¼‚¤‚«‚΂₵
+‚Æ‚¤‚µ‚á
+‚­‚Ñ‚«‚è
+‚¹‚ñ‚Ä
+‚È‚ñ‚΂ñ
+‚ق肾‚µ‚à‚Ì
+‚µ‚傤‚¯‚¢
+‚₵‚ñ
+‚Ñ‚Ô‚ñ
+‚â‚È‚Ý
+‚³‚µ‚±
+‚ɂ傤
+‚Ü‚Á‚¹‚Â
+‚ª‚ñ‚Ü‚¹‚ñ
+‚°‚ñ‚µ‚イ
+‚È‚¢‚¶
+‚®‚ç‚ñ‚Õ‚è
+‚±‚¸‚¦
+‚¤‚킬
+‚¨‚낵‚Ë
+‚«‚イ‚è‚傤
+‚ׂÁ‚¯‚ñ
+‚»‚Á‚±‚¤‚¶‚å
+‚Ü‚µ
+ƒ‡
+‚«‚Á‚Õ
+‚¼‚¤‚¯‚‚´‚¢
+‚É‚¶‚°‚ñ
+‚·‚è‚Þ
+‚ ‚¨‚¼‚ç
+‚Ç‚¤‚±‚¤
+‚¢‚é‚¢
+‚±‚­‚è‚å‚­
+‚É‚ñ‚¶‚傤‚Ý
+‚¢‚΂µ‚å
+‚¿‚«
+ƒ’
+‚²‚¶
+‚²‚µ‚ñ
+‚Ù‚¤‚µ‚Ⴖ‚傤
+‚·‚ñ‚í
+‚¨‚Ø‚ç
+‚©‚ñ‚肵‚Â
+‚‚Ü
+‚«‚¤
+‚Ý‚ñ‚¯‚ñ
+‚½
+‚Æ‚¤‚¬‚イ
+‚¹‚¢‚ä
+‚µ‚イ‚³‚­
+‚¶‚イ‚è‚傤
+‚Ä‚¢‚»‚­‚«
+‚©‚ñ‚­
+‚¬‚傤‚¶‚傤
+‚ª‚¢‚Æ‚¤
+‚©‚Ë
+‚ ‚½‚Ü
+‚Æ‚­‚µ‚ã
+‚´‚¢‚µ‚å‚­‚¿‚イ
+‚»‚¤‚°‚ñ
+‚©‚¯‚¢
+‚±‚¤‚¹‚¢‚Ù‚¤
+‚à‚Ì‚ç‚é
+‚ê‚ñ‚ß‚¢
+‚©‚ñ‚«‚傤
+‚ä‚¢‚¢‚Â
+‚ÂԂñ
+‚¨‚¨‚·‚¶
+‚Ò[‚·
+‚Ç‚¤‚¯‚ñ
+‚Ä‚­‚̂낶[
+‚½‚Ý
+‚͂₵
+‚¨‚É
+‚·‚΂é
+‚¶‚傤‚é‚è
+‚µ‚イ‚ɂイ‚â‚­
+‚¦‚Õ‚ë‚ñ
+‚Æ‚®‚¿
+‚½‚¢‚«‚ñ
+‚½‚¢‚¹‚Â
+‚©‚í‚ç
+‚¹‚¢‚³‚ñ‚Ô
+‚Ђ¶‚è
+‚µ‚ñ‚µ‚Ó‚­
+‚¯‚ñ‚Ä‚Â
+‚ê‚Á‚«‚傤
+‚Æ‚©‚¢
+‚ä‚ɂイ‚ª‚©‚è
+‚΂¢‚ª‚­
+‚à‚¤‚©
+‚ׂñ‚Â
+‚È‚¢‚è‚­
+‚¢‚¿‚Ì‚Æ‚è
+‚Ђ ‚½‚è
+‚½[‚°‚Á‚Æ
+‚ ‚µ‚­‚Ñ
+‚¿‚è‚å‚­
+‚µ‚傤‚É‚©
+‚Ù‚¢
+‚¤‚ç‚ß
+‚¿‚µ‚‚ª‚­
+‚°‚¢‚Ç‚¤
+‚«‚í‚߂‚«
+‚É‚Ó‚¾
+‚¶‚䂤‚¬‚傤
+‚µ‚²‚Æ‚Î
+‚µ‚傤‚Ú‚¤‚µ
+‚Ý‚¸‚¤‚Ý
+‚¢‚ñ‚¹‚¢
+‚½‚Ó
+‚¨‚¨‚º‚¢
+‚Í‚ñ‚ª
+‚ï
+‚Ý‚Æ‚ß‚¢‚ñ
+‚‚©‚³
+‚Í‚¢‚â[
+‚±‚¤‚©‚ñ‚¶‚å
+‚¢‚낶‚ë
+‚‚¯
+‚±‚¤‚ª‚­‚µ‚ñ
+‚Ó‚Ó‚­
+‚³‚æ‚­
+‚°‚ñ‚¨‚ñ
+‚¶‚Þ‚è‚傤
+‚µ‚½‚Ü‚¿
+‚΂­‚낤
+‚¯‚ñ‚¦‚ñ
+‚·‚½‚¢‚é
+‚¹‚ñ‚Æ‚¤
+‚æ‚»‚¤‚ª‚¢
+‚­‚è‚â‚Ü
+‚è‚ê‚«
+‚Ç‚ñ‚«
+‚±‚±‚Ì‚¦
+‚µ‚Ú‚¤
+‚«‚Ç
+‚¢‚¿‚ª‚ñ
+‚µ‚ã‚­‚ׂñ
+‚·‚Æ‚ë‚Ú
+‚Ó‚Ý‚ñ‚µ‚傤
+‚¢‚¿‚í‚è
+‚â‚­‚Ä
+‚µ‚傤‚«‚¬‚傤
+‚Æ‚¨‚­
+‚¤‚í‚â‚­
+‚µ‚Ⴊ‚¢
+‚»‚¤‚²‚¤‚¯‚¢
+‚©‚Á‚µ‚á
+‚͂‚͂é
+‚¹‚ñ‚Ñ‚ñ
+‚ª‚¢‚µ‚傤
+‚¹‚«‚è
+‚ç‚­‚Ñ
+‚Æ[‚½‚é
+‚¢‚¹‚ñ
+‚¤‚ñ‚¿‚­
+‚±‚Ä
+‚°‚ñ‚µ
+‚¿‚¶‚«
+‚ª‚ñ‚è
+‚©‚ß
+‚µ‚å‚­‚Ï‚ñ
+‚Æ‚­‚³‚ñ‚Ô‚Â
+‚Í‚µ‚ç
+‚Æ‚È[
+‚‚ñ‚Ú
+‚΂ñ‚¿‚傤
+‚Í‚Â
+‚«‚‚¨‚ñ
+‚í‚ñ‚è‚å‚­
+‚킵
+‚¿‚è‚å
+‚Ë‚ñ‚ê‚¢
+‚¨‚¤‚¬
+‚Í‚±
+‚¯‚ñ‚ª‚­‚µ‚á
+‚«‚ñ‚·
+‚肱‚¤
+‚³‚ñ‚±‚¤‚µ‚å
+‚¹‚¢‚ ‚­
+‚Í‚ñ‚ª‚ñ
+‚È‚©‚ª‚¢‚É‚ñ
+‚¾‚ñ‚µ‚á‚­
+‚悹
+‚¨‚«‚É‚¢‚è
+‚Ô‚ñ‚²‚¤
+‚ɂ傤‚Ç‚¤
+‚»‚¤‚²
+‚©‚ñ‚肸
+‚¹‚Á‚«
+‚¨‚ñ‚·‚¢
+‚܂‚Ñ
+‚Ö‚«‚¿
+‚¨‚­‚ä‚«
+‚Í‚ñ‚¶‚ã‚­
+‚Ó‚é‚Ä
+‚¶‚‚Þ
+‚¢‚Ç‚±‚ë
+‚©‚ñ‚µ‚á‚­
+‚È‚ç‚ׂ©‚¦
+‚¹‚¢‚Ó
+‚ª‚­‚»‚­
+‚©‚«‚イ‚Ä‚«
+‚±‚낤
+‚µ‚傤‚Ñ
+‚¿‚³‚ñ
+‚©‚°‚¦
+‚³‚¢‚¾‚¢
+‚Ó‚ê[‚¸
+‚©‚·‚¤
+‚»‚ñ‚è‚Â
+‚ª‚ç
+‚Ë‚¨‚ñ
+‚Ó‚«‚ñ‚±‚¤
+‚Ó‚Ý
+‚¢‚µ‚¾‚½‚Ý
+‚É‚Ì‚Æ‚è
+‚«‚Ü‚Â
+‚í‚Á‚Æ
+‚¨‚±‚³‚Ü
+‚à‚Æ‚©‚½
+‚ ‚Ü‚®‚è
+‚Ý‚¬‚í
+‚©‚ñ‚肵‚å‚­
+‚º‚¢‚µ‚イ
+‚Ó‚¡[‚é‚Ç
+‚¦‚ñ‚½[‚Ä‚¢‚È[
+‚¤‚¿‚Ü‚­
+‚¶‚傤‚ª‚¢
+‚é‚¢‚¹‚ñ
+‚º‚¢‚±‚Ý
+‚Í‚¿‚ª‚Â
+‚Ç‚¤‚΂ñ
+‚Ÿ
+‚½‚¢‚¶‚ñ
+‚¼‚¤‚µ‚傤
+‚â‚Á‚¿‚á‚ñ
+‚µ‚¥‚é
+‚½‚ñ‚Ô‚ñ
+‚É‚Ù‚ñ‚²
+‚ä‚Ñ
+‚Ù‚©‚­
+‚¢‚¢‚È‚¸‚¯
+‚Ì‚¤‚¦‚ñ
+‚݂傤‚Ë‚ñ
+‚­‚ç‚·
+‚©‚ª‚Á‚©
+‚΂Á‚«‚ñ
+‚悤‚¹‚‚«
+‚¯‚¢‚´‚¢‚ß‚ñ
+‚Ù‚ñ‚©‚¢
+‚°‚Á‚«‚イ
+‚¯‚Á‚µ‚å‚­
+‚Þ‚Ä‚«
+‚¢‚¢‚¾‚­‚¾‚­
+‚¸‚ª‚¢‚±‚Â
+‚¤‚è‚傤
+‚ç‚Á‚­
+‚Ú‚¯‚Â
+‚¢‚ë‚¢‚ë
+‚¹‚ñ‚Ô‚ñ
+‚µ‚«‚à‚¤
+‚Ó‚­‚è‚Ù‚¤
+‚è‚傤‚µ‚イ‚µ‚å
+‚¿‚«‚イ‚¶‚傤
+‚²‚¹‚¢
+‚¯‚ñ‚¶
+‚ׂÑ[
+‚ª‚Á‚©
+‚º‚ñ‚°‚Â
+‚í‚è
+‚È‚¢‚«‚å‚­
+‚‚­‚è‚©‚½
+‚Ó‚¬‚è
+‚Í‚È‚ª‚³
+‚µ‚©‚¢
+‚í‚¢‚ñ
+‚Ö‚¢‚Ó‚­
+‚Ï‚ñ
+‚¿‚¥‚Á‚©[
+‚Ö‚Á‚¾[
+‚Ü[‚¶‚á‚ñ
+‚ë‚ß‚ñ
+‚Ù‚¤‚»‚¤‚©‚¢
+‚ ‚ǂ΂ñ‚Ä[‚¶
+‚Ç‚¹‚¢
+‚Þ‚¢‚»‚ñ
+‚¢‚ñ‚¦‚¢
+‚È‚Ý‚Í‚Î
+‚Ï‚·
+‚Å‚´[‚Æ
+‚Ü‚¦‚¤‚肯‚ñ
+‚¶‚¢
+‚µ‚ñ‚Ï
+‚Ù‚¤‚Þ‚¾‚¢‚¶‚ñ
+‚Ó‚Ÿ‚ñ‚Ç
+‚Í‚Á‚±‚¤‚µ‚å
+‚«‚è‚«‚¸
+‚Ý‚¬‚æ‚è
+‚ł邽
+‚­[‚Û‚ñ
+‚¹‚¢‚Ô‚Â
+‚Æ‚Á‚¯‚ñ
+‚¨‚ñ‚Ý
+‚¹‚ñ‚Õ‚­‚«
+‚Ä[‚Ü
+‚Þ‚ß‚¢
+‚¯‚¢‚ä
+‚Ç‚¤‚Ԃ‚¦‚ñ
+‚Ü‚ñ‚·
+‚ß‚¢‚°‚Â
+‚¢‚ñ‚µ‚å‚­‚Ä‚ñ
+‚½‚ñ‚ª‚ñ
+‚ ‚΂ç‚Ú‚Ë
+‚«‚¬‚傤‚Ê‚µ
+‚É‚¶‚イ
+‚½‚ñ‚¶‚イ
+‚»‚¤‚²‚¬‚ñ‚±‚¤
+‚¨‚¿‚イ‚°‚ñ
+‚¶‚µ‚á‚­
+‚Ü‚ª‚è‚©‚Ç
+‚·‚¢‚ë
+‚¾‚¢‚¢‚Á‚µ‚ã
+‚©‚ñ‚±‚¤‚µ
+‚³‚¢‚µ‚ñ
+‚¢‚¿‚à‚Â
+‚ª‚ЂÂ
+‚²[‚é‚Å‚ñ
+‚¹‚¢‚ª‚­
+‚½‚É‚ ‚¢
+‚Ç‚¿‚ç
+‚¢‚ñ‚©‚ñ‚µ‚傤‚ß
+‚²‚¹‚¢‚«‚イ
+‚©‚½‚Â
+‚à‚¤‚à‚­
+‚Ü‚Ý‚¸
+‚¤‚ñ‚Ç‚¤‚©
+‚¯‚¢‚Ð
+‚í‚Ô‚ñ
+‚È‚Á‚Â
+‚¢‚±‚ñ
+‚¦‚ñ‚°‚邯‚¢‚·‚¤
+‚¿‚©‚·‚¢
+‚¿‚傤‚Í
+‚¸‚ß‚ñ
+‚­‚ë‚Ú‚µ
+‚¨‚à‚â
+‚©‚æ‚¢‚΂±
+‚Þ‚¶‚傤
+‚¢‚ñ‚Ú‚¤
+‚µ‚ã‚ñ‚µ‚å‚­
+‚ê‚ñ‚²‚¤‚±‚­
+‚ª‚ê‚«
+‚Ù‚Ë‚¨‚肼‚ñ
+‚É‚³‚ñ
+‚µ‚ス‚«
+‚«‚å‚Ù‚¤
+‚µ‚ゼ‚­
+‚¶‚á‚Ü
+‚©‚¢‚·‚¤‚¯‚ñ
+‚Ђ傤‚ß‚ñ‚¹‚«
+‚©‚˂΂Ȃê
+‚ç‚ñ‚Ü‚ñ
+‚ɂイ‚µ
+‚«‚ñ‚±‚¤
+‚¤‚í‚×
+‚Ý‚¿‚Ì‚è
+‚Ó‚ë‚ 
+‚³‚¢‚¯‚ñ
+‚¤‚Æ‚­
+‚¨‚ñ‚È‚Å
+‚²‚¤‚¨‚ñ
+‚悤‚¹‚«
+‚Æ‚­‚ê‚¢
+‚¢‚¿‚¶‚Ä‚«
+‚Æ‚è‚Õ‚é
+‚«‚ñ‚«‚イ
+‚±‚¤‚±‚­
+‚¬‚ñ
+‚ë‚Ú‚Á‚Æ
+‚Ù‚¤‚à‚¤
+‚͂炨‚Ñ
+‚©‚¶
+‚µ‚á‚­
+‚µ‚«‚¶
+‚¢‚¦‚ñ
+‚±‚¤‚«
+‚Í‚¹‚ñ
+‚Æ‚ñ‚µ‚ã
+‚È‚ê‚Á‚¶
+‚É‚­‚¹‚¢
+‚°‚ñ‚¹
+‚Í‚ñ‚Ô‚ñ‚¶‚å‚­‚ê
+‚¿‚¸
+‚¹‚¢‚«‚傤
+‚Ù[‚·
+‚«‚¾‚ñ
+‚µ‚å‚Ë‚ñ‚Ç
+‚¨‚¤‚Ë‚ñ
+‚ª‚¢‚¯‚¢
+‚Õ‚ë‚Æ‚±‚é
+‚Ñ‚ñ‚¹‚ñ
+‚·‚¢‚»‚¤‚ª‚­
+‚ ‚Ô‚Ý
+‚É‚È‚¢‚Ä
+‚µ‚ñ‚¶‚ã‚Â
+‚Í‚Á‚µ‚ñ‚«
+‚¹‚Ý‚È
+‚½‚Ü‚à‚Ì
+‚â‚Ç‚â
+‚¦‚¸
+‚«‚²
+‚Ì‚¤
+‚¶‚イ‚â‚­
+‚«‚å‚­‚¿‚傤
+‚à‚Æ‚«
+‚‚¢‚µ‚ñ
+‚©‚¢‚͂‚«‚å‚­
+‚¬‚¶‚ã‚‚«‚å‚­
+‚ß‚ñ‚º‚ñ
+‚¦‚ñ
+‚Ó‚­‚ë
+‚³‚ñ‚¿‚傤
+‚»‚µ‚ã
+‚Ù‚¯‚ñ‚¶‚å
+‚¨‚¤‚¼‚­
+‚߂΂¦
+‚«‚Æ‚­
+‚¹‚¢‚³‚ñ‚ª‚©‚è
+‚¾‚Á‚µ‚å‚­‚´‚¢
+‚Å‚ñ‚³‚ñ
+‚¶‚á‚ñ‚Ú
+‚©‚­‚­‚ç‚·
+‚Ђ«‚Ó‚Ë
+‚Ö‚ñ‚³
+‚Ú‚­‚¶‚傤
+‚Æ‚¤‚¶‚è‚Â
+ƒw
+‚µ‚傤‚Ô
+‚¤‚³‚¬
+‚è‚ñ‚©
+‚©‚¨‚Þ‚¯
+‚¤‚Ü‚â
+‚¿‚ñ‚¹‚Â
+‚®‚ê[‚Õ
+‚¯‚ñ‚ ‚ñ
+‚Ç‚¤‚è‚ñ
+‚º‚Á‚Ø‚«
+‚¨‚¨‚ ‚½‚è
+‚¨‚æ‚»
+‚©‚¦‚Å
+‚Æ‚Ý‚ñ‚º‚¢
+‚¢‚낤‚©‚¢
+‚Õ‚ë‚®‚ç‚Ý‚ñ‚®
+‚«‚à‚Ì
+‚à‚¤‚©‚ñ
+‚¢‚ñ‚»‚‚µ‚á
+‚Í‚Á‚«‚イ
+‚Ó‚­‚´‚Â
+‚Ü‚¢‚Ë‚ñ
+‚µ‚å‚È‚¢
+‚ ‚¢‚±‚¤‚©
+
+‚¹‚«‚¤‚ñ
+‚¦‚Ý‚ã‚ê[‚µ‚å‚ñ
+‚»‚Ì‚¤
+‚¯
+‚¶‚ñ‚¶‚¢‚ñ
+‚Ù‚µ‚ñ
+‚ê‚¢‚»‚­
+‚½‚²‚³‚­
+‚è‚傤‚ë‚ñ
+ƒM
+‚³‚³
+‚Å‚à‚ñ‚·‚Æ‚ê[‚µ
+‚ׂÁ‚©‚ñ
+‚¿‚傤‚ê‚¢‚Ú‚©‚¢
+‚¶‚傤‚Ý‚á‚­
+‚¾‚©‚Â
+‚Å‚ñ‚Ô‚ñ
+‚ނ悤
+‚Ô‚ç‚ñ‚­
+‚Ù‚ñ‚Ë‚ñ
+‚µ‚イ‚Ђ傤
+‚æ‚¿
+‚Ó‚Å‚Ô‚µ‚傤
+‚©‚Ý‚µ‚΂¢
+‚±‚¤‚à‚ñ
+‚ë[‚©‚é
+‚µ‚å‚­‚Ç‚¤
+‚è‚­‚‚«
+‚«‚ñ‚Õ‚ñ
+‚»‚¤‚ê‚¢
+‚¶‚ガ‚傤‚è‚傤
+‚µ‚イ‚è‚傤‚²
+‚µ‚å‚­‚Ђñ
+‚è‚傤‚¯
+‚¯‚ñ‚Ø‚¢
+‚Ý‚ß‚¢
+‚¿‚­‚è‚ñ
+‚¶‚イ‚É‚µ
+‚¤‚炶
+‚æ‚­‚¿
+‚ [‚­
+‚¯‚«‚ñ
+‚Ú‚¢‚ñ
+‚é[‚Æ
+‚í‚è‚Ñ‚«
+‚Ђɂñ
+‚´‚¢‚è‚å‚­
+‚͂‚΂¢‚à‚Æ
+‚¨‚¿‚Ç
+‚±‚¤‚»‚­‚«
+‚΂©‚ñ‚·
+‚Ö‚Ñ
+‚¶‚©‚ñ‚ª‚¢
+‚Í‚ñ‚©‚‚¤
+‚Ú‚¤‚Ö‚«
+‚µ‚炽‚«
+‚¨‚©‚µ‚ç‚‚«
+‚½‚¢‚¯‚¢
+‚¶‚ケ‚¤‚µ‚á
+‚Í‚¿‚­
+‚é‚¢
+‚͂‚݂Ý
+‚¿‚á‚Ñ‚ñ
+‚©‚¢‚¹‚«
+‚Ä‚«‚¿
+‚Æ‚ç‚­‚½
+‚ЂÁ‚¹‚¢
+‚½‚¢‚è‚ñ
+‚©‚¶‚ñ
+‚¦‚¢‚©‚¢‚í
+‚«‚¿‚¶
+‚¶‚債‚ã
+‚±‚ñ‚Ï‚¢‚ç
+ƒ‰
+‚É‚Ù‚ñ‚ª‚Ý
+‚¾‚ª‚µ
+‚¤‚³‚ñ
+‚¾‚¢‚Æ‚µ
+‚Ô‚ç‚ñ‚¿
+‚»‚¤‚µ‚á
+‚·‚Ü‚¢‚é
+‚ª‚­‚»‚¤
+‚³‚ñ‚æ
+‚¤‚«‚È
+‚±‚ß‚Ê‚©
+‚¶‚±‚ñ
+‚·‚¢‚Ö‚¢‚¹‚ñ
+‚©‚‚ǂ¤‚©
+‚ ‚­‚è‚é
+‚¢‚«‚傤
+‚»‚Å‚ª‚«
+‚¿‚Ђë
+‚ª‚­‚ß‚¢
+‚½‚¢‚­‚¤
+‚·‚Û‚Á‚Æ
+‚¤‚肱
+‚Ö‚¢‚»
+‚Ä‚ñ‚«[
+‚³‚µ‚Ђ«
+‚ª‚¢‚µ‚ã‚‚¬
+‚Ú‚¤‚©‚ñ
+‚Æ‚­‚»‚­‚¶‚傤
+‚±‚©‚°
+‚¦‚ñ‚°[‚¶
+‚·‚Ä‚²
+‚à‚µ
+‚Ç‚¤‚Ë‚ñ
+‚µ‚傱
+‚¦‚¢
+‚é[‚Þ
+‚·‚¸‚ç‚ñ
+‚µ‚傤‚¬‚傤‚©
+‚±‚­‚¦‚«
+‚Ô‚ñ‚µ‚傤
+‚Ó‚©‚±‚¤‚è‚å‚­
+‚½‚Ä‚©‚¦‚«‚ñ
+‚è‚傤‚¹‚ñ
+‚â‚«‚¢‚ñ
+‚Í‚è‚ß
+‚¦‚¢‚¬‚傤‚Ñ
+‚¯‚Á‚©‚­
+‚©‚¸‚Ì‚±
+‚¶‚ã‚ñ‚³‚Ô‚¿‚傤
+‚¨‚ñ‚©‚ñ
+‚Ô[‚·
+‚½‚©‚È
+‚Ó‚Â
+‚»‚¤‚è‚Ó
+‚¿‚¦
+‚©‚Ó‚¥
+‚킽‚è‚Ç‚è
+‚܂‚育‚Æ
+‚¶‚ã‚Ð
+‚Ï‚¢
+‚±‚Á‚©‚ñ
+‚°‚‚悤
+‚Ђª‚½
+‚Í‚¢‚¶‚ñ
+‚Í‚ñ‚©‚ñ‚Í‚ñ‚Ý‚ñ
+‚¨‚肨‚è
+‚©‚ß‚¢‚±‚­
+‚«‚ñ‚Þ‚³‚«
+‚¨‚Ë‚¦‚³‚ñ
+‚è‚イ‚±‚¤‚©
+ƒƒ
+‚Í‚ñ‚³‚Þ
+‚¯‚è
+‚©[‚Å‚¡‚ª‚ñ
+‚¸‚Ù‚¤
+‚°‚ñ‚¾‚¢‚΂ñ
+‚É‚Á‚Ä‚¢‚Ђ傤
+‚Í‚Á‚©‚Ä‚ñ
+‚½‚­‚µ‚傤
+‚Ó‚­‚肶
+‚è[‚¾[
+‚Æ‚¤‚Ù‚­‚Æ‚¤
+‚Ђ̂¢‚è
+‚¾‚¢‚¢‚Á‚©
+‚ӂ悤‚©‚¼‚­
+‚Í‚­‚Ô‚Â
+‚»‚¤‚»‚­
+‚±‚È‚Ý‚é‚­
+‚΂Î
+‚æ‚í‚Ý
+‚®‚ñ‚µ
+‚­‚è‚ ‚°
+‚‚ڂ ‚½‚è
+‚â‚è‚©‚½
+‚·‚ñ‚µ
+‚ª‚ñ‚¶[
+‚킪‚Ý
+‚¦‚«‚·‚Ï[‚Æ
+‚©‚±
+‚µ‚ク‚¢
+‚Ԃ‚ª
+‚¾‚¢‚·
+‚Ç‚¤‚¹‚ñ
+‚¨‚Ñ
+‚Ђè‚傤
+‚¢‚Æ
+‚ЂƂ͂¾
+‚¿‚á‚ñ‚Ò‚¨‚ñ
+‚ª‚­‚¹‚¢‚ª‚¢
+‚ß‚ñ‚µ
+‚º‚ñ‚µ‚á
+‚Ì‚±
+‚¨‚¨‚Í‚ç‚¢
+‚±‚ê‚ç
+‚©‚¬‚â
+‚±‚¤‚·‚¢‚è‚傤
+‚±‚΂ñ
+‚©‚¢‚±‚ñ
+‚¨‚ñ‚Ä‚ñ
+‚¿‚á‚í‚ñ
+‚ЂÁ‚¯‚¢
+‚±‚ñ‚¹‚¢
+‚º‚Á‚½‚ñ
+‚¨‚ñ‚¬
+‚è‚ñ‚è
+‚Ç‚¾‚¢
+‚µ‚¶‚è‚Â
+‚Æ‚­‚ׂÂ
+‚¢‚«‚¤‚ß
+‚¾‚«‚傤‚ ‚ñ
+‚Ü‚Ù‚ª‚É[
+‚¶‚ñ‚è‚«‚µ‚á
+‚«‚傤‚¿‚傤‚¹‚¢
+‚ë‚ñ‚«‚å
+‚ ‚¢‚­‚¿
+‚¶‚イ‚ç‚¢
+‚³‚¢‚Ë‚ñ‚µ‚傤
+‚Ó‚½‚Ü‚½
+‚Ç‚­‚ª‚·
+‚¹‚«‚Ö‚¢
+‚Ђłñ‚©
+‚¶‚Á‚·‚ñ
+‚¹‚ñ‚¯‚ñ
+‚µ‚º‚ñ‚©‚¢
+‚ɂイ‚Í‚­‚µ‚å‚­
+‚΂Â
+‚í
+‚¹‚¢‚µ‚Â
+‚¹‚ñ‚«‚á‚­‚΂ñ‚ç
+‚è‚‚¼‚¤
+‚µ‚傤‚è‚Â
+‚¶‚ジ
+‚¼‚¤
+‚Ù‚è‚Ì‚¤‚¿
+‚ë‚ñ‚±‚¤
+‚ª‚¢‚«‚å‚­
+‚¹‚¨‚悬
+‚Ý‚È‚Ý‚Í‚ñ‚«‚イ
+‚΂Á‚½
+‚¦‚¢‚«
+‚±‚Æ‚Î
+‚܂‚¶
+‚¾‚¢‚´‚¢
+‚Ö‚ñ‚µ‚イ‚¿‚傤
+‚±‚­‚µ‚å
+‚¿‚傤
+‚«‚±‚ñ
+‚Ä‚Á‚Ò‚Â
+‚»‚¤‚¸
+‚¦‚¢‚ê‚¢
+‚±‚¤‚©‚¢‚µ
+‚·‚¾‚ê
+‚¾‚«‚ ‚킹
+‚È‚ê‚ ‚¢
+‚¬‚å‚­
+‚í‚邬
+‚¿‚傤‚©‚ñ
+‚«‚è‚­‚¸
+‚¿‚傤‚ß‚¢
+‚ ‚邶
+‚È‚©‚¤‚Ý
+‚É‚¿‚ׂ¢
+‚°‚‚܂‚΂炢
+‚Ç‚·‚¤
+‚«‚イ‚½‚¢
+‚³‚´‚ñ
+‚«‚¿‚­
+‚è‚­‚¶‚傤
+‚±‚Á‚¿
+‚¨‚¢‚½‚¿
+‚Ä‚ñ‚Ë‚ñ‚ª‚·
+‚Ä‚È‚×
+‚‚¤‚©
+‚Ñ‚Á‚Æ
+‚º‚ñ‚É‚¶‚イ
+‚±‚¤‚¶‚«‚å‚­
+‚Ђ©‚º‚¢
+‚¨‚¶
+‚¶‚債‚イ
+‚ß[‚é
+‚±‚ñ‚°‚ñ
+‚䂤‚µ‚イ‚Ì‚Ñ
+‚Ü‚ñ‚¹‚¢
+‚®‚è‚É‚Á‚¶
+‚¶‚¢‚ë
+‚µ‚ë‚â‚Ü
+‚·‚¢‚»
+‚­‚°
+‚¢‚݂傤
+‚µ‚ス‚¢
+‚Ú‚¹‚ñ
+‚¹‚ê‚­‚Æ
+‚¶‚¿‚낤
+‚±‚¤‚¶‚ñ‚Ô‚Â
+‚₶
+‚µ‚ñ‚é‚¢
+‚Ó‚ä‚©‚¢
+‚È‚¬‚È‚½
+‚»‚¤‚ê‚Â
+‚¿‚å‚Á‚©‚ñ
+‚Æ‚£
+‚³‚¢‚ ‚¢
+‚ä‚É‚¹‚Ó
+‚è‚ ‚é
+‚¢‚ñ‚è‚傤
+‚µ‚イ‚¶‚Â
+‚¦‚ñ‚¾‚ñ
+‚Þ‚µ‚å‚­
+‚΂¢‚¶‚ñ
+‚ ‚Ü‚è
+‚Í‚©‚Ô
+‚ê[‚¾
+‚¶‚á
+‚¾‚¢‚Ђ傤‚³‚­
+‚à‚ñ‚ª‚Ü‚¦
+‚æ‚Ì‚È‚©
+‚µ‚ñ‚í
+‚ׂ¢‚΂­
+‚Ì‚¤‚©‚ñ‚«
+‚Ü‚­‚ç‚à‚Æ
+‚ª‚ñ‚à‚­
+‚­‚ç‚­
+‚±‚é‚Ù[‚¸
+‚Þ‚¿‚á
+‚¦‚ׂꂷ‚Æ
+‚©‚´‚Þ‚«
+ƒˆ
+‚Ö‚¢‚ª‚¢
+‚΂ñ‚±
+‚¿[‚Ó
+‚Ô‚ª‚¢
+‚Ù‚ñ‚±‚¤
+‚Ö‚ñ‚¯‚ñ
+‚Ô‚ñ‚ª‚­‚µ‚á
+‚Ñ‚µ‚イ
+‚à‚­‚悤
+‚°‚é‚Ü‚ñ
+‚¹‚¢‚т傤‚©
+‚Ä‚·‚«
+‚µ‚ñ‚µ‚Â
+‚Ù‚²‚µ‚á
+‚ß‚ë‚Å‚¡[
+‚¿‚傤‚Ä‚¢
+‚Ý‚¸‚Ü‚«
+‚¬‚債‚á
+‚Ñ‚è‚傤
+‚Å‚ñ‚©‚¢‚¦‚«
+‚«‚«
+‚è‚傤‚¶‚©‚ñ
+‚¿‚Ç‚è
+‚Ä‚ê‚Ó‚§‚ñ
+‚¯‚µ‚傤‚Ђñ
+‚±‚ñ‚­
+‚ӂ낤‚µ‚á
+‚­‚·‚è‚ä‚Ñ
+‚è‚ñ‚¶
+‚Ü‚ñ‚Ï‚¢
+‚±‚ñ‚¶
+‚¾‚ñ‚¯‚‚è‚å‚­
+‚Æ
+‚µ‚ç‚©‚Î
+‚±‚ ‚Ý
+‚Ä‚«‚â‚­
+‚Ó‚à‚¤
+‚ä‚Ý‚ª‚½
+‚Ë‚ñ‚Ç‚È‚¢
+‚°‚ñ‚ä
+‚Ú‚¤‚µ‚á
+‚°‚è‚á‚­
+‚É‚­‚µ‚ñ
+‚Ç‚­‚º‚Â
+‚±‚ñ‚Ä‚È
+‚Ë‚ñ‚«
+‚©‚ñ‚µ‚å
+‚µ‚ñ‚µ‚ñ‚«‚¦‚¢
+‚¦‚¢‚¹‚¢
+‚Ô‚ñ‚¯‚¢
+‚©‚ñ‚µ‚Â
+‚à‚à‚¢‚ë
+‚½‚Ç‚¤
+‚¶‚µ‚ス‚¢
+‚µ‚ñ‚Ä‚ñ
+‚Ý‚¸‚¯
+‚Ђñ‚©‚­
+‚¨‚¶‚傤‚³‚Ü
+‚¹‚ñ‚»‚­
+‚©‚Í‚ñ‚·‚¤
+‚¶‚Á‚¯‚ñ‚«
+‚Ï‚Æ‚ë‚ñ
+‚µ‚Â
+‚Ô‚ñ‚ê‚¢
+‚Ý‚â
+‚µ‚ã‚Á‚µ‚å
+‚Ä‚¡[‚ñ‚¦[‚¶‚á
+‚¶‚ã‚­‚ê‚ñ‚µ‚á
+‚½‚ª‚¢
+‚É‚Á‚¿‚イ
+‚ª‚¢‚Ù‚¤
+‚ׂ 
+‚¹‚ñ‚Õ‚¤‚«
+‚Ý‚ñ‚¶
+‚³‚炵
+‚Ë‚ñ‚·‚¤
+‚×
+‚¾‚³‚­
+‚±‚±‚¿
+‚¨‚¨‚®‚¿
+‚à‚¤‚Ç‚­
+‚µ‚µ‚å
+‚°‚·‚¢‚Ç‚¤
+‚ª‚ñ‚µ‚«
+‚Ó‚ñ
+‚Ó‚©‚¢
+‚¤‚ç‚Ý
+‚«‚«‚킯
+‚Ö‚¢‚¶
+‚¯‚¢‚³‚Â
+‚É‚ñ‚³‚ñ‚Õ
+‚µ‚ñ‚¬‚©‚¢
+‚­‚낶
+‚ق悤‚µ‚å
+‚Ç‚¤‚Í‚¢
+‚è‚ñ
+‚à‚¦
+‚Ù‚¤‚»‚¤‚µ
+‚±‚¤‚Ä‚¢
+‚‚¢
+‚·‚¿‚ë[‚é
+‚»‚¢‚ñ
+‚¹‚¢‚¶‚ñ
+‚Ü‚¿‚È‚Ý
+‚«‚傤‚Æ‚¤
+‚Í‚¯‚ñ
+‚Ó‚©‚­
+‚È‚¢‚Ë‚ñ‚«‚©‚ñ
+‚¤‚è‚Ê‚µ
+‚¯‚ñ‚ׂÂ
+‚낤‚¿‚ñ
+‚·‚È‚Á‚­
+‚©‚é‚Ä
+‚¾‚¢‚²‚Ý
+‚æ‚­‚Ú‚¤
+‚Ý‚·‚½[
+‚¢‚Á‚µ‚Ⴙ‚ñ‚è
+‚ЂȂª
+‚è‚傶‚傤
+‚ɂイ‚¹‚ñ
+‚µ‚á‚©‚¢‚©
+‚Ù
+‚¦‚ñ‚¶‚á
+‚°‚ñ‚±‚­
+‚Ó‚È‚Ì‚è
+‚¬‚¢‚ñ
+‚µ‚É‚¬‚í
+‚Í‚«‚à‚Ì
+‚¨‚Ø‚ê[‚µ‚å‚ñ
+‚¹[‚é
+‚ß‚¢‚ß‚¢
+‚µ‚º‚ñ‚µ‚å‚­
+‚ ‚¢‚·
+‚±‚±‚Ì‚©
+‚¨‚à‚í‚­
+‚¹‚ñ‚è‚Â
+‚±‚ñ‚Õ‚ê‚Á‚­‚·
+‚Ë‚ñ‚҂傤
+‚¤‚낱
+‚¨‚í‚è‚Ë
+‚©‚°‚Â
+‚í‚è‚Ñ‚«‚è‚Â
+‚¶‚ã‚ñ‚©‚ñ
+‚­‚¤‚©‚ñ
+‚°‚‚¶
+‚Ȃׂ¼‚±
+‚Ó‚¦‚«
+‚悤‚Ü
+‚°‚ñ‚µ‚è‚å‚­
+‚䂤‚µ‚á
+‚‚°
+‚Ä‚¢‚¶‚¹‚¢
+‚Ç‚«‚ã‚ß‚ñ‚Æ
+‚Ù‚¤‚Ó
+‚±‚¤‚΂¢
+‚¾‚¢‚à‚­
+‚΂¢‚µ‚ñ
+‚º‚ñ‚¹‚¢
+‚«‚傤‚Ö‚ñ
+‚®‚炤‚ñ‚Ç
+‚©‚ñ‚Ì‚¤
+‚Ñ‚¶‚ã‚ ‚é
+‚Æ‚è
+‚¹‚ñ‚«‚傹‚ñ
+‚¬‚½[
+‚³‚ñ
+‚²‚½‚²‚½
+‚½‚­‚Í‚¢‚Ñ‚ñ
+‚¦‚«‚¼‚¿‚Á‚­
+‚¤‚Ý‚¼‚¢
+‚ ‚­‚Æ‚­‚¢
+‚à‚ñ‚Æ‚¤
+‚­‚§‚è‚Ä‚¡[
+‚Í‚½‚Ñ
+‚¶[
+‚¨‚­‚Ì‚Ä
+‚â‚­‚Ђñ
+‚±‚­‚½‚¢
+‚Í‚µ‚¯
+‚Ý‚È‚Ý‚©‚¢‚«‚¹‚ñ
+‚Ü‚ë‚É‚¦
+‚Í‚Î
+‚悶‚傤
+‚¾‚¢‚à‚ñ
+‚¶‚ñ‚¾‚¢
+‚»‚Õ‚ç‚Ì
+‚³‚΂­
+‚·‚Ü[‚Æ
+‚È‚ñ‚¹‚ñ‚·
+‚¨‚±‚µ
+‚©‚½‚í‚ç
+‚Ô‚ñ‚Ú‚¤‚®
+‚ç‚Ñ‚Á‚Æ
+‚ê‚¢‚©‚¢
+‚«‚¶‚ñ
+‚±‚¤‚ª‚¢
+‚¢‚¿‚¾‚¢‚¶
+‚Ñ‚·
+‚È‚É‚Ô‚ñ
+‚Ó‚½‚¦
+‚µ‚ñ‚ç‚¢‚©‚ñ
+‚©‚´‚è
+‚º‚Á‚Û‚¤
+‚ӂ‚¤‚æ‚«‚ñ
+‚½‚ÂÈ
+‚µ‚½‚¨‚Ñ
+‚»‚¤‚Ç‚¤
+‚Æ‚Á‚¯‚¢
+‚©‚¢‚¸
+‚ª‚­‚È‚¢
+‚Ó‚µ‚傤
+‚‚¢‚©‚ñ‚΂ñ
+‚«‚¨‚¤
+‚±‚¹‚ñ‚¶‚傤
+‚µ‚è‚ß
+‚¶‚¶‚イ
+‚Þ‚µ‚á
+‚¢‚È‚Ù
+‚Í‚ç‚ñ
+‚Í‚·‚¤
+‚Ђ傤‚¾‚¢
+‚È‚¢‚½[
+‚»‚¤‚ª‚¢
+‚¢‚Ç
+‚¢‚¿‚Ë‚ñ‚©‚ñ
+‚킳‚¢
+‚¶‚å‚ë‚ñ
+‚Ú[‚È‚·
+‚Þ‚­‚¢
+‚¨‚«‚Î
+‚©‚µ‚á
+‚ä‚«‚â‚Ü
+‚±‚ñ‚½‚­‚Æ
+‚Æ‚¤‚©‚¢‚Ç‚¤
+‚¦‚¢‚䂤
+‚µ‚イ‚Í‚·‚¤
+‚±‚¤‚Ð
+‚³‚Ü[
+‚¨‚Ù[‚‚­
+‚Ђà‚‚«
+‚ł΂ñ
+‚Æ‚¦‚Í‚½‚¦
+‚ ‚‚¶
+‚«‚Í‚¾
+‚Ý‚È‚³‚Ü
+‚¹‚©‚¢
+‚µ‚傳‚ñ
+‚¿‚ñ‚«‚á‚­
+‚Æ‚¤‚©‚‚©
+‚¦‚¢‚½‚¢
+‚©‚­‚ß‚ñ
+‚È‚ª‚¤‚½
+‚Ù‚¤‚ ‚ñ
+‚Ù‚¯‚ñ‚µ‚傤
+‚­‚ç‚¢‚Ü‚Á‚­‚·
+‚¶‚ã‚ñ‚à‚¤
+‚ç‚·‚Æ
+‚«‚å‚­‚¶
+‚«‚È‚¢
+‚«‚è‚Ç‚¨‚µ
+‚µ‚å‚ß‚ñ
+‚Å‚ñ‚Ç‚¤‚µ‚«
+‚ ‚ñ‚®‚é
+‚Ë‚ñ‚À‚イ
+‚É‚à‚¤‚³‚­
+‚µ‚ë‚ñ
+‚µ‚¿‚傤‚è‚Â
+‚ä‚©‚µ‚½
+‚¢‚ñ‚®‚è‚Á‚µ‚ã
+‚º‚Á‚Ò‚Â
+‚¿‚Ì‚¤‚Í‚ñ
+‚¿‚­
+‚Ó‚¶‚å
+‚Ô‚½‚¢
+‚ ‚¹‚Ý‚¸
+‚©‚ñ‚悤
+‚ق˂‚¬
+‚Ù‚¯‚ñ‚Ó
+‚¢‚¿‚傤‚©
+‚Ó‚Ô‚ñ‚è‚Â
+‚©[‚ɂ΂é
+‚ê‚¢‚º‚ñ
+‚©‚ñ‚Ê‚µ
+‚Ó‚¤‚Ý
+‚¾‚¢‚ ‚è[
+‚¹‚ñ‚т傤
+‚Ù‚¤‚µ‚Ⴙ‚¢
+‚낤‚Ç‚¤‚µ‚傤
+‚©‚¢‚¿‚イ
+‚µ‚ウ‚¢
+‚Ç‚¤‚¶‚傤
+‚­‚ê‚È‚¢
+‚Ô‚¶‚ã‚Â
+‚ ‚肳‚Ü
+‚¶‚¬‚傤‚Ô
+‚©‚è‚ß‚ñ‚«‚å
+‚Å‚Á‚«
+‚Æ‚¤‚©‚è‚Â
+‚ꂵ[‚Æ
+‚µ‚イ‚Å‚ñ
+‚Ó‚Ç‚¤‚Ђ傤
+‚ä[‚´
+‚³‚ñ‚·‚¢
+‚Ç‚¤‚´‚¢
+‚¶‚Þ‚Ô
+‚ׂñ‚«
+‚²‚è‚傤‚É‚ñ
+‚ ‚ä
+‚Ü‚Å
+‚Ó‚Ÿ‚Ý‚±‚ñ
+‚°‚ñ‚µ‚å
+‚±‚â
+‚Ì‚¤‚¸‚¢
+‚Ô‚Á‚­
+‚©‚΂₫
+‚¾[‚­
+‚Ë‚ñ‚«‚ñ
+‚ª‚¢‚±‚¤‚©‚ñ
+‚½‚¢‚Ç
+‚ ‚Á‚¿
+‚¤‚·‚Ñ
+‚Í‚ñ‚΂¢
+‚«‚傾‚‚©‚ñ
+‚Æ‚¨‚¦‚ñ
+‚¿‚傤‚«‚æ‚Ù‚¤
+‚Ó‚ã[‚¿‚á
+‚ç[‚Ç
+‚Þ‚µ‚イ
+‚«‚ñ‚³
+‚­‚¤‚ë‚ñ
+‚±‚Í‚é
+‚¿‚イ‚ׂ¢
+‚Æ‚¤‚¯‚ñ
+‚¦‚ñ‚ª‚¢
+‚©‚ñ‚±‚¤‚Ô‚Â
+‚·‚½‚¶‚ ‚Þ
+‚¨‚¨‚ª‚½‚«
+‚ß‚¢‚Ô‚Â
+‚Ñ‚Å‚¨
+‚µ‚イ‚µ‚傤
+‚¶‚©‚悤‚µ‚á
+‚Ê‚µ
+‚´‚Á‚¯‚ñ
+‚悱‚Ä
+‚ª‚Þ
+‚Í‚È‚½‚Î
+‚¾‚¢‚݂傤
+‚´‚¢‚Þ‚Ô
+‚¹‚ñ‚à‚¤
+‚©‚ñ‚ê‚«
+‚Ђ炢‚«
+‚±‚±‚ë‚Âà‚è
+‚Ç‚¤‚䂤
+‚½‚±
+‚Í‚µ‚ã‚‚Ó
+‚Ó‚»‚ñ
+‚Ú‚«
+‚µ‚¥‚ 
+‚¨‚©‚°‚³‚Ü
+‚Ö‚«‚»‚ñ
+‚Ü‚¿‚ ‚¢
+‚ß‚¢‚Ó‚­
+‚©‚Á‚Æ‚¤
+‚Ì‚¤‚±‚ñ
+‚‚݂«
+‚µ‚ザ‚­
+‚Ô‚Á‚Û‚¤
+‚Õ‚ê[‚ñ
+‚¶‚å‚È‚ñ
+‚¹‚é‚Ó‚³[‚Ñ‚·
+‚·‚¢‚µ‚Â
+‚ß‚Å‚¡‚ 
+‚µ‚¿
+‚¿‚á‚ê‚ñ‚¶‚á[
+‚Þ‚¬‚í‚ç
+‚½‚½‚Ý‚±‚Ý
+‚½‚ñ‚³‚«
+‚‚©
+‚²‚­‚¢
+‚¶‚т傤
+‚©‚ñ‚°‚ñ‚ª‚­
+‚½‚©‚µ‚¨
+‚±‚­‚¹‚ñ
+‚È‚ñ‚ç
+‚³‚ñ‚¬
+‚Ý‚â‚Ü
+‚¯‚¢‚¦‚¢‚¶‚ñ
+‚½[‚é
+‚æ‚Á‚Æ
+‚Ä‚«‚â
+‚°‚¢‚Æ‚¤
+‚Ђڂµ
+‚Ä‚¢‚¶
+‚¶‚Á‚«‚傤
+‚©‚È
+‚Ù‚·‚¤
+‚¢‚₯
+‚Ý‚Ä‚¢
+‚ ‚¯‚Á‚Ï‚È‚µ
+‚Ó‚±‚¤
+‚Ù‚Ä‚é
+‚í‚ê
+‚»‚¤‚é
+‚ê‚¢‚΂¢
+‚©‚Â‚à‚­
+‚³‚ñ‚¬‚傤
+‚³‚­‚ª‚ç
+‚΂ñ‚Ï‚­
+ƒY
+‚¾‚¢‚»‚Â
+‚Ä‚¢‚Æ‚¤
+‚½‚ñ‚´‚­
+‚Ђ³‚¢‚µ‚á
+‚±‚ñ‚É‚¿
+‚Æ‚«
+‚ë‚Á‚Û‚¤
+‚ë
+‚Å‚µ
+‚°‚ñ‚悤‚«
+‚Ç‚¤‚µ
+‚¿‚­‚ׂÂ
+‚°‚â
+‚è‚傤‚Ù‚¤
+‚¿‚©‚ª‚¢
+‚³‚¢‚¶‚傤‚©‚¢
+‚è‚å‚­‚¿
+‚à‚¼‚¤‚µ
+‚¿‚á‚¢‚É[‚¸
+‚í[‚·‚Æ
+‚¢‚½‚ñ‚¶
+‚³‚ñ‚¶
+‚Í‚¢‚±‚¤
+‚«‚イ‚¯‚Â
+‚¿‚イ‚³
+‚¶‚傤‚µ‚ã
+‚©‚Ô‚Æ
+‚È‚ñ‚Õ‚¤
+‚¬‚ª‚ñ
+‚ä[‚Ä‚¡‚è‚Ä‚¡
+‚È‚Ñ‚Á‚­
+‚È‚¢‚Ô‚ñ
+‚Ì‚¤‚ª‚­‚Ô
+‚°‚ñ‚¯‚¢
+‚­‚é‚Ü‚Ç‚ß
+‚±‚­‚è‚Â
+‚ ‚é‚¿‚イ
+‚¶‚‚ԂÂ
+‚Æ‚¤‚¹‚¢
+‚Ô‚ñ‚«‚傤‚¶‚傤
+‚µ‚傤‚ª‚­‚¹‚¢
+‚Æ‚Ñ‚¢‚è
+‚«‚å‚Ô‚ñ
+‚낤‚Ü‚ñ
+‚Ó‚¡‚Á‚µ‚ã
+‚¨
+‚¿‚傤‚Æ‚Á‚«‚イ
+‚悤‚µ‚å
+‚Ï‚ê‚Á‚Æ
+‚«‚ñ‚´
+‚º‚ñ‚Ì‚¤
+‚Í‚¢‚Ó‚Ÿ‚¢
+‚µ‚傤‚Ђñ‚¯‚ñ
+‚Ý‚©‚­
+‚¦‚¢‚悤‚©
+‚¶‚ñ‚¼‚¤‚¦‚ñ
+‚ß‚à‚¿‚傤
+‚É‚ã[‚·
+‚Ë‚Þ‚¯
+‚Í‚È‚æ‚ß
+‚Þ‚ë
+‚½‚·‚¤‚¯‚Â
+‚Ó‚­‚¢‚ñ
+‚è‚ñ‚¬‚傤
+‚Ȃ‚ނ«
+‚µ‚È
+‚¾‚¢‚â‚­
+‚ ‚é‚΂Þ
+‚®‚ñ‚©‚ñ
+‚à‚¶‚ã[‚é
+‚«‚å‚­‚Ô
+‚Þ‚³‚ñ
+‚Ý‚Ô‚ñ
+‚낤‚Þ‚ª‚©‚è
+‚«‚Ä‚ñ
+‚Ì‚è‚©‚¦‚¦‚«
+‚Ô‚©‚Á‚±‚¤
+‚æ‚ ‚¯
+‚悳‚ñ
+‚Ù‚¤‚Ç‚¤‚¶‚ñ
+‚Þ‚¶‚ñ‚Æ‚¤
+‚³‚¢‚µ‚傤‚°‚ñ
+‚ЂÁ‚µ‚á
+‚µ‚傤‚ä
+‚«‚イ‚¬‚傤‚Ñ
+‚Ï‚¿‚ñ‚±
+‚Ç‚¤‚³
+‚«‚Á‚»‚¤
+‚µ‚傤‚»‚¤
+‚¨‚à‚È‚ª
+‚µ‚´‚¢
+‚«‚½‚Í‚ñ‚«‚イ
+‚Í‚º
+‚Ђ傤‚¯‚¢
+‚¯‚¢‚©‚­‚¹‚¢
+‚«‚ß
+‚È‚ñ‚µ‚å
+‚Ú‚¯
+‚Ý‚¿‚΂½
+‚¦‚­‚ ‚Ç‚é
+‚µ‚«‚¿
+‚¤‚ñ‚©
+‚¢‚䂤
+‚¹‚ñ‚½‚­‚«
+‚Ó‚Ÿ‚­‚½
+‚½‚Ä‚Ë
+‚Ç‚¤‚«‚å‚­
+‚ڂɂイ
+‚‚¤‚Ó‚¤
+‚³‚ñ‚ª‚É‚¿
+‚¬‚å‚à‚¤
+‚΂¶‚Æ‚¤‚Ó‚¤
+‚¶‚イ‚è‚å‚­
+‚낤‚­
+‚µ‚Ì
+‚¬‚傽‚­
+‚Í‚ñ‚µ‚傤
+‚©‚¢‚¼‚­
+‚³‚ñ‚¶‚ã
+‚ ‚³‚Ð
+‚Ø‚ñ‚µ‚å‚ñ
+‚Ù‚¤‚¦
+‚©‚Î
+‚«‚°‚ñ‚º‚ñ
+‚È‚ñ‚É‚¿
+‚¨‚ñ‚Ç
+‚¼‚Á‚±‚­
+‚µ‚傤‚Ù‚ñ
+‚Í‚ñ‚°‚Â
+‚¢‚·‚ç‚Þ
+‚ß‚¢‚à‚­
+‚©‚Á‚«‚Ä‚«
+‚±‚Ì‚½‚ß
+‚Ä‚¢‚¦‚ñ
+‚±‚¤‚¶‚ã‚ñ
+‚܂邼‚ñ
+‚°‚½
+‚ЂƂނ©‚µ
+‚낤‚Ç‚¤‚µ‚á
+‚ׂÉ
+‚¹‚¢‚©
+‚¢‚¿‚ê‚ñ‚½‚­‚µ‚å
+‚ß‚ñ‚«‚傶‚傤
+‚í‚Á‚­‚·
+‚Ä‚Ì‚¤‚¿
+‚Ý‚¯‚ñ
+‚¢‚µ‚킽
+‚¢‚ê‚à‚Ì
+‚Ü‚Á‚Ä‚¢
+‚«‚»‚¤
+‚´‚¢‚¶‚傤
+‚䂤‚ê‚Â
+‚肹‚¢
+‚‚«‚â‚Ü
+‚ۂ肦‚·‚Ä‚é
+‚Ô‚ñ‚Ô
+‚Ó‚­‚‚¤
+‚®‚ñ‚䂤
+‚¶‚ñ‚è‚å‚­
+‚à‚Ì‚Ñ
+‚¾‚è‚å‚­
+‚Ó‚É‚ñ
+‚±‚Á‚«‚è
+‚ë
+‚à‚¤‚±
+‚¤‚½‚¢
+‚±‚­‚Í‚­
+‚½‚¢‚±‚¤‚µ‚á
+‚Ԃ‚肩
+‚Ԃ‚º‚ñ
+‚è‚«
+‚É
+‚Ý‚¹‚·
+‚½‚É‚®‚¿
+‚±‚¤‚º‚ñ
+‚É‚µ‚ñ
+‚݂傤‚µ‚ã
+‚â‚Ü‚Ì‚Ä
+‚Ë‚¾‚ñ
+‚ê‚¢‚±‚ñ
+‚Ђ±‚­‚É‚ñ
+‚¨‚Á‚Ä‚ª‚«
+‚»‚±‚¢
+‚©‚È‚Æ‚±
+‚«‚Ê‚ª‚³
+‚É‚­‚é‚¢
+‚©‚°‚«‚Í
+‚Õ‚ç‚Æ‚É‚Á‚­
+‚à‚ñ‚©
+‚Ô‚ñ‚Æ‚¤
+ƒQ
+‚½‚Á‚Ò‚Â
+‚΂Á‚Ä‚¡‚ñ‚®
+‚ЂƂ‚ЂƂÂ
+‚©‚Á‚©
+‚Þ‚¿
+‚‚«‚Ñ‚Æ
+‚¨‚¤‚¶‚å
+‚ɂ΂ñ
+‚©‚ê‚ñ‚¾
+‚Ó‚ç‚¿
+‚Ó‚É‚ñ‚µ‚傤
+‚͂낤
+‚º‚ñ‚É‚¿‚¹‚¢
+‚µ‚傤‚ɂイ‚Ç‚¤
+‚³‚¢‚¿‚イ
+‚µ‚¿‚傤‚µ‚á
+‚Ȃ‚â‚Ü
+‚±‚­‚è‚‚±‚¤‚¦‚ñ
+‚¦‚«‚Ü‚¦‚Ç‚¨‚è
+‚©‚­‚µ‚«
+‚¶‚ã‚ñ‚悤‚©‚ñ
+‚ւ邵[
+‚Ó‚¯‚ñ‚±‚¤
+‚Ë‚ñ‚µ‚å
+‚µ‚ñ‚µ‚ã‚ñ
+‚Æ‚¤‚«‚傤
+‚¯‚ñ‚΂ñ
+‚¿‚Ⴄ‚·
+‚ׂñ‚µ
+‚¶‚イ‚è‚傤‚º‚¢
+‚«‚Ë‚ñ‚Ð
+‚±‚Ë‚±
+‚Ó‚­‚Ñ‚«
+‚Í‚¢‚¢‚ñ
+‚¨‚¨‚ ‚´
+‚µ‚ñ‚µ‚ñ
+‚¯‚¢‚«‚å
+‚Ý‚©‚°
+‚è‚Â
+‚â‚·‚è
+‚Ë‚ñ‚¶‚イ
+‚±‚Ý‚Á‚­
+‚¤‚é‚®‚ ‚¢
+‚Ü‚Á‚µ‚ã‚é[‚Þ
+‚΂Á‚»‚­
+‚Ä‚¢‚¿
+‚¹‚¢‚Ý‚á‚­
+‚Ê‚¢‚±
+‚³‚Ô
+‚Í‚¢‚Ï[
+‚¢‚ñ‚ê‚«
+‚¬‚Þ
+‚¢‚­‚ñ
+‚©‚¢‚©
+‚Í‚ñ‚Ç‚¤‚½‚¢
+‚ ‚­‚Ä‚¡‚Ô
+‚±‚ñ‚¯‚Â
+‚Æ‚ñ‚Ñ
+‚ß‚ñ‚«‚債‚傤
+‚¢‚¨‚½
+‚«‚ß‚Ä
+‚±‚ñ‚±[‚·
+‚°‚ñ‚¦‚«
+‚µ‚ç‚¢‚Æ
+‚Í‚´‚©‚¢‚«
+‚à‚¤‚µ‚å
+‚¶‚Ý
+‚¨‚ñ‚Ë‚ñ
+‚í‚©‚¬
+‚«‚‚Ë
+‚¹‚¢‚Ђ傤
+‚Ú‚¤‚¿‚傤‚É‚ñ
+‚É‚Á‚Ä‚¢
+‚©‚Æ
+‚¾‚ñ‚܂‚Ü
+‚Ó‚Ÿ‚­‚Æ
+‚ç‚ñ‚»‚¤
+‚«‚å‚­‚Ù‚¤
+‚¨‚ñ‚ª‚­‚©
+‚¹‚ñ‚«‚傤
+‚¬‚傤‚¶‚á
+‚¾‚¢‚ׂñ‚µ‚á
+‚ß‚¢‚¿‚á
+‚©‚·‚½[‚Ç
+‚À
+‚¶‚傶‚傤
+‚­‚Ô‚­‚è‚ñ
+‚±‚Á‚Æ‚ñ
+‚¤‚炪‚Ë
+‚¢‚½‚Ç‚è
+‚±‚¤‚¹‚¢‚µ‚傤
+‚¿‚傤‚«‚傤‚µ
+‚ä
+‚³‚¶
+‚é‚Ñ
+‚Ä‚ê‚Ù‚ñ
+‚¾‚¢‚±‚­
+‚Ü‚ñ‚°‚«‚傤
+‚Å‚Í‚È
+‚½‚¢‚Ù‚¤
+‚²‚¤‚¯‚ñ
+‚Ë‚²‚Æ
+‚Ù‚¤‚¦‚Â
+‚¤‚ê‚ä‚«
+‚¿‚イ‚¯‚¢‚«
+‚«‚傤‚â‚­
+‚Ü‚Ü
+‚Ï‚½[‚ñ
+‚Í‚ñ‚µ‚½
+‚ç‚­‚³
+‚Ù‚¤‚Ð
+‚悤‚ǂЂñ
+‚µ‚Á‚­‚·
+‚µ‚傤‚Ö‚«
+‚¤‚Ç‚ñ‚°
+‚Í‚ñ‚½‚¢
+‚©‚Ý‚Í‚ñ‚«
+‚«‚Ì‚Ý
+‚Æ‚¤‚µ‚ñ
+‚¶‚イ‚¢
+‚Í‚â‚Ô‚³
+‚µ‚Ý‚ñ‚©
+‚¶‚ñ‚±‚Â
+‚É‚ñ
+‚Ä‚¢‚ ‚Â
+‚ӂ肦‚«
+‚Ç‚­‚µ‚ñ
+‚Ó‚©‚Å
+‚©‚½‚ë‚®
+‚º‚ñ‚Ä‚¢
+‚µ‚å‚­‚µ
+‚­‚È‚¢
+‚ª‚­‚Æ‚­
+‚Ü‚Á‚Õ
+‚т傤‚É‚ñ
+‚µ‚ñ‚悤‚­‚Ý‚ ‚¢
+‚Æ‚­‚â‚­‚Ä‚ñ
+‚Æ‚¤‚¬‚è
+‚¦‚ñ‚Ä‚ñ
+‚±‚ñ‚Å‚ñ‚³
+‚â‚Ü‚Î
+‚È‚±‚¤‚Ç
+‚Ó‚ë‚ñ‚Ä‚¡‚ 
+‚Í‚È‚â
+‚¦‚½‚Ì[‚é
+‚¬‚¯‚¢
+‚Ê‚è
+‚¨‚Æ‚Æ‚µ
+‚Ó‚Á‚©‚­
+‚³‚¢‚µ‚傤‚¿
+‚ß‚¢‚Ù‚¤
+‚Ü‚ª‚¨
+‚Ç‚¤‚Æ‚­
+‚Ç‚µ‚á‚Ô‚è
+‚±‚­‚à‚Â
+‚½‚±‚­
+‚±‚¤‚Þ‚©
+‚ª‚ñ‚Ñ‚ 
+‚Ђ¾‚è‚ß
+‚Ö‚¢‚¶‚ã‚ñ
+‚µ‚Á‚Û‚¤
+‚è‚傤‚«‚ñ
+‚Ó‚¯‚ñ
+‚Ì‚«‚³‚«
+‚Ö‚Á‚Ç
+‚±‚Ý‚ã‚É‚¯[‚µ‚å
+‚Ђß
+‚±‚¤‚ç‚ñ
+‚肳[‚¿
+‚¢‚Á‚©‚¹‚¢
+‚Æ‚¤‚°‚Â
+‚·‚Ø‚é
+‚¶‚ã‚­‚Æ‚¤
+‚Ç‚¤‚¶‚å
+‚Å‚ñ‚è‚å‚­‚¯‚¢
+‚è‚­‚é[‚Æ
+‚Ë‚ñ
+‚©‚½‚Ý
+‚¦‚ñ‚¬
+‚²‚Ó‚­
+‚¢‚¯
+‚Æ‚ñ‚Å‚ñ
+‚»‚¤‚µ‚ã‚ñ
+‚Ý‚ñ‚悤
+‚ׂ‚ނË
+‚±‚¤‚ ‚Â
+‚¾‚¢‚É‚ñ‚®
+‚₶‚イ
+‚Ú‚¤‚µ‚傤
+‚Ú‚¤‚Ó
+‚¾‚ñ‚»‚¤
+‚È‚¢‚Þ
+‚°‚©
+‚¯‚¢‚©‚¢
+‚ ‚è‚ ‚¯
+‚ê‚ñ‚½
+‚‚¤‚µ‚ñ‚Í‚ñ‚΂¢
+‚µ‚¿‚â
+‚Æ‚Ñ‚¨‚è
+‚Ö‚¢‚©
+‚µ‚å‚­‚‚¤
+‚¤‚ß‚Ú‚µ
+‚Í‚ñ‚ß‚ñ
+‚µ‚å‚­‚¹‚¢‚©‚Â
+‚¢‚½‚Å
+‚©‚ñ‚³
+‚µ‚ñ‚¾‚ñ‚µ‚å
+‚¯‚Á‚³‚­
+‚³‚¢‚Æ‚è
+‚±‚·‚Æ
+‚¨‚«‚Ç‚¯‚¢
+‚­‚Ý‚¿‚傤
+‚È‚Ü
+‚»‚ç‚Ü‚ß
+‚«‚イ‚Í‚¢
+‚¬‚ñ‚©
+‚¾‚Ä
+‚Í‚¿‚Ý‚Â
+‚Ì‚¤‚ЂÂ
+‚¢‚¿‚悤
+‚¿‚è‚ ‚­‚½
+‚¶‚ñ‚©‚­‚µ‚á
+‚Ђñ‚¹‚¢
+‚¶‚イ‚»‚¤
+‚Ô‚ñ‚è‚å‚­
+‚ׂɂ₢‚½
+‚²‚µ‚Á‚­
+‚«‚͂‚ä
+‚¿‚Ⴖ‚ñ
+‚µ‚イ‚©‚¢‚¶‚å
+‚¾‚Ñ‚ñ‚®
+‚æ‚­‚¶‚傤
+‚ӂȂׂè
+‚ª‚­‚¬‚傤
+‚µ‚å‚©‚¢
+‚Ä‚ñ‚Æ‚¤
+‚³‚¢‚΂ñ‚µ‚å
+‚Æ‚±‚ë‚Ç‚±‚ë
+‚¨‚ñ‚Ý‚Â
+‚Ý‚ñ‚Ä‚Â
+‚¶‚サ‚傤‚µ‚á
+‚Í‚ñ‚悤
+‚à‚Á‚±‚¤
+‚°‚«‚‚¤
+‚¶‚イ‚²‚â
+‚¨‚±‚³‚ñ
+‚ª‚ñ‚Ä‚¢
+‚°‚ñ‚©‚­
+‚«‚イ‚¯‚‚«
+‚Þ‚©‚ñ
+‚·‚Ä‚¡‚Á‚­
+‚±‚¢‚é
+‚æ‚»
+‚¾‚¢‚©‚®‚ç
+‚µ‚ñ‚º‚ñ
+‚¹‚ñ‚¼‚­
+‚¶‚傳‚ñ‚Õ
+‚æ‚«‚傤
+‚Ú‚©‚ñ
+‚Ê‚Ì
+‚µ‚イ‚³‚¢
+‚Ä‚ñ‚È‚¢
+‚·[‚Ï
+‚Ö‚â
+‚°‚ñ‚Ç‚¤‚«
+‚Ԃ‚悭
+‚¢‚¾‚¢
+‚Ù‚ ‚ñ
+‚¯‚¢‚Æ
+‚¶‚©‚¢
+‚Ü‚¶‚ß
+‚í‚©‚­‚³
+‚É‚µ‚ª‚í
+‚Ô‚ñ‚¹‚«
+‚¹‚ñ‚É‚ñ
+‚䂤‚±‚¤
+‚Í‚­‚ ‚¢
+‚«‚½‚¢
+‚Æ‚¤‚ß‚¢
+‚Ý‚ç‚¢
+‚¿‚傤‚¶‚å
+‚¨[‚é
+‚ª‚Á‚¯‚¢
+‚¶‚傤‚è‚イ
+‚¢‚Æ‚¤
+ƒ{
+‚Ç‚¤
+‚«‚傤‚‚¤‚Ä‚ñ
+‚ê‚¢‚·‚¢
+‚¹‚«‚ß‚ñ
+‚©‚ñ‚²‚Ó
+‚Ç‚ç‚¢‚Ô‚¢‚ñ
+‚Ó‚ñ‚ɂ傤
+‚¾‚Ô‚ñ
+‚¹‚Á‚Æ‚¤‚¶
+‚Ý‚¦
+‚º‚ñ‚ª‚­
+‚Ä‚ñ‚Ä‚ñ
+‚©‚¢‚Ä‚«
+‚ ‚¢‚µ‚傤
+‚Ђª‚í‚è
+‚«‚傤‚è
+‚Þ‚È‚¬
+‚Í‚¿‚à‚Ì
+‚Ô[‚Æ
+‚Ú‚¤‚«‚å
+‚Ü‚¢‚±
+‚ê‚¢‚³‚¢
+‚Ë‚ñ‚è‚Â
+‚ ‚Ü‚Ý
+‚·‚Ø‚µ‚á‚è‚·‚Æ
+‚䂤‚µ‚傤‚«
+‚µ‚傤‚±
+‚°‚ñ‚¶‚イ‚µ‚å
+‚µ‚サ‚å‚­
+‚Ù‚¤‚Ä‚¢‚µ‚«
+‚©‚­‚¢‚ñ
+‚ӂ‚¤
+‚¯‚ñ‚¼‚¤‚Ô‚Â
+‚Ú‚¤‚Ñ‚«
+‚Ó‚®‚½‚¢‚Ä‚ñ
+‚µ‚å
+‚©‚¢‚«‚傤
+‚«‚Ý‚á‚­
+‚±‚¤‚ë
+‚³‚¢‚¿‚傤
+‚«‚ñ‚¯‚ñ
+‚Í‚â‚­
+‚¢‚¿‚°‚¢
+‚´‚Á‚«‚イ
+‚±‚¦
+‚ɂイ‚Æ‚¤
+‚¯‚¢‚¶‚΂ñ
+‚΂±
+‚«‚É‚¿
+‚ê‚Å‚¡
+‚Ƃ肯‚µ
+‚Ö‚¢‚¶‚Â
+‚¶‚イ‚·‚¢
+‚µ‚®‚³
+‚ӂ«
+‚Å‚ñ‚±‚¤
+‚©‚È‚ ‚Ý
+‚Ä‚è‚Æ‚è[
+‚µ‚×
+‚Ä‚ñ‚Ô‚ñ
+‚‚¤‚¤‚ñ
+‚µ‚ñ‚ª‚­
+‚©‚Ó‚ñ
+‚©‚ª‚Ý
+‚¶‚¯‚¢
+‚½‚ñ‚¯‚ñ
+‚ê‚¢
+‚±‚¤‚µ‚傤
+‚¢‚¦‚¶
+‚µ‚ã‚Á‚Ï‚ñ‚ª‚©‚è
+‚­‚‚¶‚å‚­
+‚Ü‚µ‚傤
+‚¿‚¶‚ñ
+‚à‚­‚Ђ¯‚ñ
+‚»‚Æ‚Ü‚í‚è
+‚²‚¢
+‚¿‚傤‚Âß
+‚Ë‚Í‚Î
+‚¦‚¾‚Ý‚¿
+‚Ç‚ñ
+‚º‚ñ‚É‚Ù‚ñ
+‚¹‚¢‚³‚ñ‚¿
+‚¤‚¡[‚ñ
+‚䂵‚ã‚Â
+‚µ‚ñ
+‚¶‚±‚¤
+‚Û‚ë
+‚¶‚ã‚ñ‚©‚‚ä
+‚Ò‚ ‚Ì‚¹‚ñ
+‚¤‚Ù‚¤
+‚½‚¢‚Ä‚¢
+‚΂¢‚¹‚¢‚Ç
+‚è‚ 
+‚¦‚ñ‚Ç‚¤
+‚â‚Ü‚¶
+‚·‚¤‚ª‚Á‚©
+‚ ‚©‚Ó‚¾
+‚ ‚Ü‚Æ‚¤
+‚¤‚ñ‚Ä‚ñ‚µ
+‚µ‚傤‚Ö‚¢
+‚Ђ²‚ë
+‚³‚ñ‚¶‚傤
+‚µ‚ß‚¢
+‚¶‚Á‚³‚¢
+‚ ‚¢
+‚·‚½‚Å‚¡
+‚µ‚ñ‚´‚¢
+‚ׂ¢‚¿‚イ
+‚Å‚ñ‚í‚«
+‚Ô‚©‚ñ
+‚¤‚邤‚Ç‚µ
+‚Ԃ‚¶‚傤
+‚µ‚Ä‚¢
+‚΂µ‚傤
+‚¾‚¢‚³‚ñ‚µ‚á
+‚µ‚Ý‚ã‚ê[‚½
+‚¬‚イ‚É‚­
+‚ª‚¢‚Ç‚­
+‚¹‚¢‚¬‚å‚«‚«
+‚Ђµ‚å‚Ô
+‚­‚ñ‚µ‚傤
+‚µ‚±‚Ý
+‚¶‚ñ‚³‚¢
+‚Þ‚¢‚¿‚à‚Â
+‚Ù‚¤‚µ‚Ђñ
+‚ ‚µ‚ã‚ç
+‚¶‚ã‚ñ
+‚ ‚©‚‚¿
+‚䂤‚΂è
+‚Í‚ê‚à‚Ì
+‚Ó‚­‚³‚ñ‚¶
+‚¹‚‚¶
+‚Ú‚ë
+‚«‚¿‚傤‚Ђñ
+‚È‚í‚΂è
+‚¬‚å‚©
+‚Ù‚¤‚¶‚ñ
+‚©‚ñ‚ª‚ñ
+‚Ä‚»‚¤
+‚Ý‚è‚ß[‚Æ‚é
+‚µ‚ñ‚±‚­‚µ‚å
+‚¬‚¹‚«
+‚¶‚ã‚­‚¶
+‚‚«‚ ‚©‚è
+‚µ‚イ‚¶‚ñ
+‚ä‚»‚¤
+‚Ö‚¢‚µ‚á
+‚¦‚¢‚¿
+‚±‚Ƃ΂©‚¢
+‚·‚¢‚³‚¢
+‚‚½
+‚®‚ë[‚Ô
+‚¶‚ã‚ñ‚¹‚¢
+‚Ó‚Ÿ‚¢‚Æ
+‚¹‚¢‚­‚¤‚¯‚ñ
+‚²‚Á‚±
+‚æ‚Ñ‚±‚¤
+‚Ú‚µ‚イ‚¾‚ñ
+‚±‚ß‚Å‚¡
+‚½‚ß
+‚¢‚ñ‚µ‚イ
+‚Ä‚ñ‚Õ
+‚µ‚イ‚Ô‚ñ
+‚¤‚°‚ñ
+‚©‚­‚¤
+‚͂‚ª‚ñ‚¹‚¢
+‚¤‚µ‚낾‚Ä
+‚µ‚傤‚©‚ñ
+‚ì
+‚µ‚傤‚¿‚傤
+‚²‚¤‚µ‚á
+‚Í‚¿‚Ô
+‚‚Ç
+‚í‚è‚ ‚¢
+‚¯‚¢‚悤‚Ç‚¤‚µ
+‚«‚傤‚ׂñ
+‚Å‚­
+‚¶‚á‚Á‚©‚ñ
+‚Æ‚Ù
+‚¢‚¿‚Ý‚á‚­
+‚»‚¤‚«‚å‚­‚¹‚ñ
+‚悤‚«‚å‚­
+‚¿‚イ‚Ä‚ñ
+‚³‚ñ‚¬‚傤‚©‚¢
+‚Ђ¢‚Ü‚²
+‚¨‚©‚ ‚¿‚á‚ñ
+‚È‚Ü‚Ý
+‚­‚é[
+‚í‚©‚È
+‚¾‚·‚Æ
+‚«‚è‚Ó‚¾
+‚´‚ñ‚¶
+‚Ý‚Ë‚ç‚é
+‚¢‚Á‚µ‚ñ‚Ó‚ç‚ñ
+‚˂‚¢
+‚낤‚«‚å‚­
+‚È‚Ó‚½‚è‚ñ
+‚Í‚­
+‚₽‚¢
+‚Ä‚±
+‚Ô‚Ç‚Ü‚è
+‚Æ‚ç‚Ì‚Ü‚«
+‚¿‚イ‚©‚¢
+‚¢‚¿‚Î
+‚ç‚Ô
+‚É‚Á‚µ‚傤‚«
+‚«‚­‚«
+‚Í
+‚Ï‚Ë‚ç
+‚‚©‚Ì‚Ü
+‚Ó‚²‚¤‚è
+‚悤‚ê‚«
+‚Ç‚ë[
+‚ª‚æ‚­
+‚½‚«‚傤
+‚‚‚¶
+‚¨‚â‚ä‚Ñ
+‚¨[‚Æ‚ß[‚µ‚å‚ñ
+‚Ù‚ñ‚¹‚«
+‚»‚¤‚肦‚«
+‚³‚±‚ñ
+‚¶‚Ç‚¤‚µ‚á
+‚¢‚µ
+‚±‚­‚³‚¢‚Ù‚¤
+‚Æ‚è‚‚¯
+‚°‚ñ‚낤
+‚É‚ã[‚¸
+‚¢[‚®‚é
+‚Ȃ肽‚¿
+‚¢‚µ‚Ô‚Ý
+‚à‚ñ‚Ò
+‚©‚­‚Ä‚ñ
+‚«‚傤‚Ä‚«
+‚¨‚à‚Ä‚à‚ñ
+‚«‚傤‚è‚å‚­‚µ‚á
+‚µ‚½‚Ñ
+‚ 
+‚±‚ë‚ ‚¢
+‚­‚¢‚¯
+‚µ‚«
+‚·‚Õ‚è‚ñ‚½[
+‚Ç‚¤‚¶
+‚ɂイ‚¶‚¢‚ñ
+‚ׂ½[
+‚±‚Æ‚µ‚¶‚イ
+‚¦‚·‚Ä‚é
+‚¬‚á‚ç‚ñ‚Ä‚¡[
+‚»‚ꂼ‚ê
+‚´‚¢‚Ù‚¤
+‚é‚¢‚²
+‚낤‚»
+‚³[‚Ñ‚·‚«‚å‚­
+‚¦‚¢‚ª
+‚È‚¦
+‚±‚Ä‚¢‚«‚á‚­
+‚µ‚«‚µ
+‚¬‚ñ‚Ü‚­
+‚ׂé‚Æ
+‚µ‚ë‚Ú‚µ
+‚·‚ ‚µ
+‚¬‚ñ‚ª‚í
+‚¨‚ñ‚¯‚¢
+‚҂肨‚Ç
+‚ç‚ñ‚Ç‚¹‚é
+‚¹‚ñ‚½‚ñ
+‚ä‚­‚¦
+‚Ï‚¢‚é
+‚µ‚イ‚Ö‚«
+‚¹‚¢‚©‚ª‚­
+‚悤‚³‚¢
+‚µ‚á‚Þ
+‚¶‚傤‚·‚¤
+‚¼
+‚Ђ©‚è
+‚©‚ê‚Á‚¶
+‚Ú[‚邪‚Ý
+‚È‚è‚«‚ñ
+‚¨‚¤‚ê‚ñ‚¸
+‚³‚©‚¢
+‚«‚傤‚Ë‚ñ
+‚Ç‚Á‚­
+‚Ë‚ç‚¢
+‚Ђµ‚傤
+‚¢‚Ì‚µ‚µ
+‚Ñ‚¨‚ñ
+‚Ђ¾‚¿
+‚Å‚ß‚è‚Á‚Æ
+‚ ‚º‚Ý‚¿
+‚«‚å‚Ë‚ñ
+‚¶‚á[‚È‚è‚·‚Æ
+‚±‚¤‚½‚¢‚¹‚¢
+‚‚¤‚µ‚ñ
+‚¨‚»‚Å
+‚±‚¤‚Ù‚¤‚ª‚©‚è
+‚¨‚à‚Ä‚ª‚í
+‚¢‚¿‚²
+‚É‚ñ‚Ò
+‚Ç‚ê
+‚΂ñ‚±‚ñ
+‚ª‚¢‚ë‚ñ
+‚Ö
+‚±‚µ
+‚´‚ñ‚Æ‚¤
+‚¬‚å‚«‚傤
+‚¿‚Ô‚³
+‚¶‚‚°‚ñ‚¹‚¢
+‚»‚Ó
+‚µ[‚Â
+‚·‚¶‚傤
+‚©‚¬‚イ
+‚Ü‚·‚­
+‚«‚á‚­‚¹‚ñ
+‚Ù‚¤‚Ë‚ñ
+‚»‚Á‚¿
+‚Ù‚¤‚¬‚å‚­
+‚µ‚è‚傤
+‚³‚¢‚Ü‚Â
+‚Ђ傤
+‚²‚½‚µ‚傤
+‚±‚ç‚Þ‚É‚·‚Æ
+‚Õ‚ë‚â‚«‚イ
+‚Í‚µ‚©
+‚É‚Á‚¯‚¢
+‚¹‚¢‚µ‚å‚­
+‚è‚Ü‚í‚è
+‚¯‚ñ‚Ü‚­
+‚¤‚ñ‚䂾‚¢‚¶‚ñ
+‚è‚á‚­‚ª
+‚¨‚ñ‚¹‚ñ
+‚ª‚낤
+‚®‚ñ‚à‚¤
+‚¶‚傤‚è
+‚Å‚ã‚ ‚é
+‚½‚ñ‚Ú
+‚©‚µ‚Â
+‚Ç‚¤‚°‚Â
+‚¯‚¢‚â‚­‚«‚ñ
+‚Ó‚¤‚»‚­
+‚Ý‚²‚ë
+‚Ä‚ê‚Ï‚µ[
+‚±‚¤‚µ
+‚Ð‚à‚­
+‚Ä‚¢‚µ‚ã‚‚Ñ
+‚¤‚¨‚¢‚¿‚Î
+‚¨‚¨‚ª‚½
+‚½‚í‚ç
+‚´‚¢‚©
+‚½‚Â
+‚ׂñ‚µ‚傤‚Ù‚¤
+‚¢‚«‚´‚Ü
+‚©‚ñ‚ª‚é[
+‚¹‚ñ‚¹‚¢‚¶‚ã‚Â
+‚ ‚È‚ë‚®
+‚΂¢‚¨‚ê‚Á‚Æ
+‚³‚¢‚¾[
+‚­‚¿‚ׂÉ
+‚Ԃ‚¼‚¤
+‚¤‚¦‚·‚Æ
+‚Ù‚¤‚¶‚ñ‚º‚¢
+‚¶‚‚¼‚¤
+‚¨‚­‚ß‚ñ
+‚È‚Á‚Æ
+‚è‚傤‚Ô‚ñ
+‚¨‚¤
+‚ê‚ñ‚«‚イ
+‚·‚ñ‚°‚«
+‚à‚Ì‚¢‚è
+‚µ‚ñ‚悤‚«‚ñ‚±
+‚ß‚®‚·‚è
+‚ê‚¢‚Æ‚¤‚«
+‚µ‚å‚­‚è‚傤‚¿‚å
+‚æ‚¢‚Ü‚¿‚®‚³
+‚Ђ炫‚Ó‚¤
+‚ß‚Æ‚ë
+‚Æ‚­‚Í‚ñ‚©
+‚Ђ肫
+‚悤‚Ђñ
+‚Æ‚­‚¢
+‚±‚ñ‚²
+‚½‚Ȃ΂½
+‚·‚Ä‚Ë
+‚µ‚Ì‚Ñ‚²‚¦
+‚Ä‚ª‚©‚è
+‚±‚¤‚·‚¢‚¶‚ã‚ñ
+‚·
+‚¢‚µ‚â
+‚³‚¢‚΂ñ‚©‚ñ
+‚Í‚Á‚±‚¤‚µ‚á
+‚Ô‚ñ‚ ‚Â
+‚ß‚Ê‚«‚Ç‚¨‚è
+‚Ô‚é‚Ç[‚´
+‚΂ñ‚¶‚ñ
+‚܂‚¶‚ß
+‚¿‚傤‚¹‚ñ‚²
+‚µ‚ñ‚Ü‚¢
+‚Ú‚¤‚¸
+‚È‚ç‚킵
+‚Ä‚Á‚Æ‚¤‚ÂÑ
+‚¿‚イ‚»‚­‚«
+‚¯‚¢‚µ‚傤
+‚»‚¤‚ׂ‚©‚¢
+‚±‚¾‚©‚ç
+‚µ‚傤‚µ‚傤
+‚È‚ñ‚¿‚傤
+‚Ó‚ë‚â
+‚µ‚傤‚³‚¢
+‚¾‚¢‚΂©‚è
+‚´‚¢‚Ô‚Â
+‚Ë‚ñ‚Ë‚ñ
+‚¤‚Å‚Ç‚¯‚¢
+‚Ä‚¢‚¯‚ñ
+‚Ä‚É‚à‚Â
+‚®‚ñ‚Æ‚¤
+‚¿‚å‚°‚ñ
+‚½‚ñ‚µ
+‚©‚í‚®‚Â
+‚Ù‚»‚ß
+‚¿‚イ‚­‚¤
+‚»‚È[
+‚©‚Á‚±
+‚¯‚¢‚è‚©
+‚Ä‚«‚µ‚å
+‚Ö‚¢‚ ‚ñ
+‚µ‚傤‚µ
+‚â‚Ü
+‚Ä‚Ü‚¿‚ñ
+‚¶‚Á‚¯‚ñ
+‚Ë‚ñ‚ª
+‚΂ñ‚±‚Á‚«
+‚°‚ñ‚»
+‚¤‚ñ‚䂵‚傤
+‚¨‚Ñ‚¶‚傤
+‚È‚¬
+‚«‚¶‚ã‚ñ‚ª‚­
+ƒS
+‚ ‚ç‚È‚í
+‚µ‚å‚­‚º‚ñ
+‚Ë‚ñ‚µ
+‚©‚ß‚é[‚ñ
+‚»‚¤‚ê‚ñ
+‚Ó‚Á‚Ä‚ñ
+‚¶‚‚è‚å‚­
+‚¦‚Ê
+‚¯‚ñ‚±‚¤‚Ù‚¯‚ñ
+‚²[‚é‚Ç
+‚Ù‚è‚à‚Ì
+‚‚è‚Ä
+‚µ‚ñ‚¶‚¯[‚Æ
+‚¤‚ç‚Í‚ç
+‚낤‚«‚ñ
+‚±‚¤‚¹‚«
+‚¹‚ñ‚µ‚イ
+‚½‚Ä‚È‚ª
+‚æ‚䂤
+‚Ù‚¤‚¢
+‚¶‚イ‚µ‚傤
+‚Ä‚¡[‚ñ
+‚¶‚Å‚ñ
+‚¶‚á‚Á‚«
+‚½‚µ‚ã
+‚©‚ñ‚µ
+‚¹‚¢‚Ó‚­
+‚Ó‚­‚µ
+‚³‚¢‚¿
+‚¯‚ñ‚¹‚‚µ‚傤
+‚­‚è[‚È
+‚Ä‚¢‚¢
+‚¹‚¢‚¶‚©
+‚Æ‚Ñ‚ç
+‚¤‚ñ‚ä
+‚¨‚¤‚Æ‚¤
+‚ª‚¢‚¢‚ñ
+‚낤‚Ë‚ñ
+‚è‚イ‚Æ‚¤
+‚µ‚¶‚Â
+‚Ù‚¤‚ß‚¢
+‚¢‚Á‚¯‚¢
+‚¤‚·‚Î
+‚Ó
+‚ê‚·‚Æ‚ç‚ñ
+‚Ù‚è‚å
+‚±‚ê
+‚Í‚¢‚®‚ñ
+‚Ђ‚ ‚Â
+‚Í‚ñ‚Ç‚é
+‚±‚¤‚Ô
+‚¨‚Æ‚È
+‚ ‚ñ‚±‚­
+‚æ‚¢
+‚¿‚á‚Ë‚é
+‚Ü‚¦‚ ‚µ
+‚Ý‚Ì‚¤‚¦
+‚Ç‚¯‚ñ‚¬‚傤
+‚ß‚¢‚«‚傤‚µ‚·‚¢
+‚Þ‚¶‚È
+‚悵
+‚½‚ñ‚¿‚å
+‚è‚å‚©‚Á‚«
+‚¼‚¤‚°
+‚Ý‚ç[
+‚©‚Ë‚à‚¿
+‚Æ‚±‚Ì‚Ü
+‚©‚ñ‚µ‚å‚­
+‚¿‚µ‚è‚傤
+‚΂®
+‚Ä‚ñ‚Ì‚¤
+‚Ó‚Æ‚¤‚µ‚«
+‚Ô‚Á‚Æ‚¤
+‚©‚Á‚¹‚ñ
+‚Ù‚­‚ë
+‚µ‚Ú
+‚µ‚炳‚¬
+‚à[‚½
+‚Ü‚Ó‚ä‚Ñ
+‚ç‚­‚²‚©
+‚Ó‚è‚å
+‚Ô‚é[
+‚Å‚¡‚ê‚­‚½[
+‚¯‚¢‚Ä‚«
+‚µ‚ã‚‚¾‚¢‚µ‚á
+‚µ‚å‚悤
+‚т傤‚Æ‚¤
+‚°‚Á‚³‚ñ
+‚ӂ˂Ђ«
+‚΂­‚ª‚Æ‚¤
+‚Ë‚±‚º
+‚¯‚ñ‚¬‚イ
+‚¯‚ñ‚Ò‚ñ
+‚»‚¤‚Î
+‚Ü‚ñ‚Ä‚ñ
+‚«‚傤‚µ‚å‚­
+‚ ‚í‚‚Ô
+‚«‚è‚à‚Ý
+‚«‚イ‚»‚­
+‚µ‚¨
+‚Ђ«‚©‚¦
+‚¢‚Á‚±‚¾‚Ä
+‚µ‚ñ‚²‚¤‚«
+‚ɂイ‚悤‚¶
+‚Ù‚µ‚á‚­‚«‚ñ
+‚­‚Ý‚ ‚¢
+‚¹‚‚¶‚å‚­‚¹‚ñ
+‚ ‚Ä‚¶
+‚Ù‚·‚Ä‚·
+‚©‚¢‚´‚ñ
+‚΂邭
+‚¢[‚½
+‚Ë‚ª‚¢
+‚à‚¤‚ª‚Á‚±‚¤
+‚Ì‚è‚à‚Ì
+‚¢‚낯‚µ
+‚È‚ñ‚µ‚Â
+‚Ç‚¤‚¢
+‚©‚ñ‚³‚©
+‚Ñ‚á‚­‚â
+‚©‚¨‚¾‚¿
+‚¬‚º‚ñ
+‚Ö‚¢‚½‚¢
+‚ç‚Ä‚¡‚·
+‚¿‚傤‚¬
+‚®‚ ‚¢
+‚µ‚²
+‚¿
+‚í‚é
+‚«‚©‚­‚ª‚©‚è
+‚‚è‚΂µ
+‚¯‚¢‚µ‚«
+‚Ô‚è
+‚¨‚¨‚¤‚肾‚µ
+‚Ô‚°‚ñ
+‚«‚Ö‚«
+‚É‚ª‚Ä
+‚Ó‚¹‚¢
+‚Ê‚¢‚ß
+‚ª‚ß‚ñ
+‚µ‚ã‚Ð
+‚»‚­‚Ä‚¢‚«
+‚‚Âè
+‚¨‚¨‚ß
+‚©‚è‚©‚½
+‚Ô‚ç‚Á‚­
+‚©‚ñ‚¢‚Á‚Ï‚Â
+‚Å‚¡‚¸‚É[
+‚°‚ñ‚·‚¢‚«
+‚¢‚»‚¤
+‚Ñ‚¶‚å
+‚È‚Ü‚è
+‚¬‚ñ‚Ù‚ñ‚¢
+‚±‚°‚¿‚á
+‚à‚­‚°‚«‚µ‚á
+‚«‚å‚Ð
+‚¨‚ñ‚¿
+‚©‚ñ‚®‚ñ
+‚Ì‚¤‚Ç
+‚Ђê
+‚Ì‚¤‚è‚Â
+‚«‚イ‚·
+‚䂤‚Ù‚Ç‚¤
+‚悱‚¶‚Ü
+‚Í‚Á‚«‚ñ
+‚Ì‚¤‚»‚ñ
+‚È‚ñ‚µ‚«
+‚©‚Ö‚¢
+‚ ‚¢‚¶
+‚¾‚µ
+‚Ô‚µ‚Â
+‚Ç‚¤‚Å‚ñ‚è‚Â
+‚킾‚¿
+‚©‚ñ‚Ò
+‚â‚Á‚±
+‚µ‚傤‚±‚¤
+‚É‚¢‚³‚ñ
+‚·‚¢‚¬‚ñ‚¿‚イ
+‚¿‚傤‚¹‚¢‚Ç
+‚¦‚ñ‚Ü‚ñ
+‚µ‚Ð
+‚±‚¤‚Þ‚Ä‚ñ
+‚¿‚傤‚»
+‚»‚­‚³‚¢
+‚æ‚­‚Ç
+‚Ä‚«‚¹‚¢
+‚è‚â
+‚Ђ傤‚à‚­
+‚»‚ñ‚¦‚¢
+‚Ó‚­‚Ü‚­
+‚µ‚ñ‚Ì‚¤
+‚¿‚イ‚Âè
+‚Ä‚È[
+‚¹‚¢‚¶‚ª‚­
+‚»‚­‚¶‚å
+‚½‚Ë‚¢‚¿
+‚Ì‚¤‚±‚¤
+‚Ղ낾‚­‚µ‚å‚ñ
+‚Ä‚¢‚¯‚¢‚ª‚¢
+‚±‚Í‚­
+‚µ‚イ‚Ñ
+‚«‚傦‚¢
+‚ꂽ‚è‚ñ‚®
+‚©‚½‚ª‚«
+‚±‚¤‚Ì‚¤
+‚É‚Á‚µ
+‚ ‚¢‚Ä‚³‚«
+‚â‚Ü‚·‚»
+‚¿‚­‚Ñ
+‚µ‚イ‚½‚¢
+‚Ç‚¤‚«‚傤
+‚½‚¯
+‚Ó‚­‚è‚イ
+‚±‚‚Ý
+‚Ђ¤‚ñ
+‚±‚¤‚©‚ª‚­
+‚¨‚ñ‚¹‚¢
+‚µ‚イ‚è‚傤
+‚ß‚¢‚ª‚ç
+‚°‚«‚Þ
+‚ЂƂƂ«
+‚Ü‚ß‚Ù‚ñ
+‚Ù‚­‚è‚­
+‚«‚ñ‚¿‚á‚­
+‚³‚¢‚¤‚æ‚­
+‚¼‚¤‚©
+‚³‚­‚ç‚»‚¤
+‚è‚傤‚µ‚á
+‚Þ
+‚Ä‚¢‚«‚イ
+‚Õ‚è
+‚¢‚ñ‚º‚¢
+‚¶‚イ‚½‚­
+‚Ù‚¤‚è‚á‚­
+‚낯[‚µ‚å‚ñ
+‚ê‚¢‚¯‚¢
+‚Ù‚¤‚ê‚¢
+‚µ‚ñ‚µ‚ë‚­
+‚µ‚à‚×
+‚±‚Ü[‚µ‚á‚é
+‚¯‚Ê‚«
+‚¹‚¾‚ñ
+‚Ò[‚±‚Á‚­
+‚µ‚á‚¿‚傤
+‚Ì
+‚±‚¤‚Í‚ñ
+‚¦‚ñ‚Æ‚ç‚ñ‚·
+‚­‚낤‚Æ
+‚¶‚º‚ñ
+‚µ‚á‚«‚ñ
+‚¿‚¢‚«‚ª‚½
+‚¯‚¢‚³‚‚©‚ñ
+‚©‚¯‚²‚Æ
+‚¿‚á‚¢‚é‚Ç
+‚»‚ñ‚Õ
+‚¿‚©‚ç‚à‚¿
+‚¹‚Ï‚ê[‚Æ
+‚¨‚Ø‚ê[‚½
+‚½‚½‚ñ
+‚¬‚½‚¢
+‚©‚½‚­
+‚µ‚ã‚ç
+‚ë[‚Ü‚¶
+‚Ñ[‚é
+‚Ó‚è‚Â
+‚à‚¤‚µ‚±‚Ý‚µ‚å
+‚ ‚­‚¬‚á‚­
+‚¦‚ñ‚¹‚ñ
+‚·‚¢‚¿‚イ
+‚·‚Æ‚ê[‚Æ
+‚Ö‚ñ‚½‚¢
+‚µ‚Í‚ç‚¢‚Ñ
+‚ª‚­‚¢
+‚¶‚¶‚Â
+‚°‚»‚­
+‚Ö‚¢‚Ä‚ñ
+‚¢‚¿‚¢
+‚¤‚µ‚ë‚Þ‚«
+‚¿‚Ù‚¤‚³‚¢
+‚Ú‚¤‚¹‚ñ
+‚°‚ñ‚³‚­
+‚Í‚Ü‚¤‚ç
+‚¤‚¿‚Ü‚½
+‚¯‚¢‚½‚¢‚悤
+‚Ђ¶‚傤
+‚¨‚è[‚Ô
+‚È‚¢‚Ô‚ñ‚Ò‚¹‚ñ
+ƒv
+‚ ‚ǂ΂½‚¢‚¸
+‚è‚悤‚è‚Â
+‚«‚¦‚ñ
+‚³‚ñ‚«
+‚ß‚¢‚Ú‚­
+‚«‚イ‚±‚ñ
+‚½‚ñ‚»‚¤
+‚Ý‚±
+‚Û‚Ä‚ñ‚µ‚á‚é
+‚¾‚ñ‚©‚¢
+‚±‚¤‚â
+‚¬‚á‚­‚´‚â
+‚Í‚©‚è
+‚Ó‚¢‚Á‚¿
+‚µ‚³‚ñ‚Ђ傤
+‚Æ‚¤‚¹‚«
+‚©‚¢‚³‚ñ‚Ô‚Â
+‚©‚ñ‚¨‚¤
+‚Ü‚ª‚è‚È‚è
+‚µ‚傱‚ñ
+‚Ö‚¢‚©‚Â
+‚¹‚¢‚æ‚­
+‚º‚¢
+‚˂΂è
+‚«‚Ä‚¢‚¿
+‚¸‚¢‚µ‚å
+‚ª‚ñ‚µ‚イ
+‚¿‚ã[‚È[
+‚Ù‚±‚¤‚µ‚á
+‚¹‚¢‚Ù‚¤
+‚³‚¢‚È‚ñ‚½‚ñ
+‚µ‚ñ‚Ô‚ñ‚µ
+‚³‚Ô‚é[‚¿‚ñ
+‚¬‚傱‚¤
+‚Ë‚²‚±‚¿
+‚¹‚¢‚ë‚ñ
+‚°‚ñ‚¾‚¢
+‚¿‚イ‚ª‚­‚¹‚¢
+‚¢‚Á‚«
+‚¤‚ñ‚Ò‚Â
+‚¢‚ñ‚²
+‚Ó‚Ÿ‚¢‚ñ
+‚¹‚ñ‚±‚­
+‚Ä‚­‚Ñ
+‚É‚Á‚µ‚傤‚¯‚ñ
+‚¨‚Æ‚¤‚¿‚á‚ñ
+‚ЂƂß
+‚¨‚è‚ ‚¢
+‚©‚¹‚Á‚Æ
+‚ ‚©‚Ë
+‚«‚ ‚Â
+‚½‚¿‚ ‚¢‚É‚ñ
+‚©‚«‚Ë
+‚¤‚µ
+‚¦‚è‚Ü‚«
+‚°‚ñ‚¶
+‚±‚ñ‚Ô
+‚¼‚ñ‚¢
+‚Ý‚³‚©‚¢
+‚ª‚ñ‚±
+‚¶‚á[‚È‚é
+‚±‚¢‚Ñ‚Æ
+‚ ‚É
+‚ß‚ñ‚Â
+‚´‚Ô‚Æ‚ñ
+‚¾‚¢‚É‚ª‚©‚è
+‚«‚Á‚¿‚傤
+‚¶‚Í‚¾
+‚Ђ²‚¤‚è
+‚¶‚傤‚«
+‚»‚ß
+‚©‚­‚±‚¤
+‚¤‚È‚¬‚Ì‚Ú‚è
+‚á
+‚È‚È‚¢‚ë
+‚ ‚Æ‚³‚«
+‚Ï‚Á‚¯[‚¶
+‚±‚¤‚Ü
+‚Ó‚½‚²
+‚¶‚ñ‚Ú‚¤
+‚¾‚¢‚¶‚á
+‚»‚¤‚¼‚­‚É‚ñ
+‚³‚ß
+‚Ý‚¸‚©‚«
+‚¤‚­‚ç‚¢‚È
+‚¶‚ã‚Ç‚¤
+‚¤‚¦‚Å‚¡‚ñ‚®
+‚Æ‚Ý‚ñ
+‚©‚¢‚¯‚‚т傤
+‚ӂ肱
+‚½‚‚¶‚ñ
+‚ª‚Þ‚µ‚á‚ç
+‚¿‚µ‚¨
+‚‚邬
+‚Ý‚¿‚·‚¤
+‚©‚Ý‚­‚¸
+‚Ü‚Á‚±‚¤
+‚Ë‚Â
+‚Ñ‚Ó‚ñ
+‚«‚è‚傤
+‚°‚¢‚Ì‚¤‚©‚¢
+‚Ï[
+‚Í‚ñ‚»‚­
+‚«‚©‚ñ‚ª‚¢
+‚Ó‚ñ‚Ê
+‚µ‚ã‚É‚ñ
+‚³‚µ‚±‚Ý
+‚½‚ñ‚҂傤
+‚Ô‚µ‚‚¯
+‚¿‚¿‚イ‚©‚¢
+‚â‚Ç‚¿‚傤
+‚È‚¢‚µ‚ñ
+‚µ‚ñ‚à‚Â
+‚Æ‚¤‚Ђ傤‚Ñ
+‚炵‚ñ
+‚®‚ç‚·
+ƒ„
+‚ ‚¸‚«
+‚¶‚傤‚¸
+‚¬‚¨‚ñ
+‚»‚æ‚©‚º
+‚¨‚µ‚¦‚²
+‚²‚Þ
+‚Þ‚µ‚Î
+‚È‚Ü‚¢‚«
+‚±‚­‚³‚¢‚¹‚ñ
+‚Ђ©‚°
+‚Ú‚½‚ñ
+‚¶‚¿‚ñ‚³‚¢
+‚Í‚­‚¹‚ñ
+‚¤‚¿‚í
+‚Í‚°
+‚Æ‚¤‚«‚µ‚å
+‚©‚±‚¤‚悤
+‚µ‚©‚¢‚µ‚á
+‚Ђ傤‚Ä‚ñ
+‚Ù‚ñ‚¾‚È
+‚µ‚イ‚ª‚­
+‚Ù‚ñ‚½‚Ä
+‚Ó‚Ì‚è
+‚®‚ë
+‚¶‚ã‚ñ‚Ë‚ñ
+‚µ‚傤‚±‚¤‚©‚¢‚¬
+‚¨‚æ‚낱‚Ñ
+‚Ë‚Á‚µ‚á‚т傤
+‚Æ‚¤‚Ó
+‚Ђ悤
+‚í‚è‚à‚Ç‚µ
+‚º‚ñ‚¾‚¢
+‚‚悲‚µ
+‚Ó‚Í‚­
+‚Õ‚è‚ñ‚·
+‚«‚ñ‚¾‚¢
+‚Ó‚Ÿ‚¢‚Î
+‚т傤‚µ‚ñ
+‚è‚イ‚º‚ñ
+‚Ù‚ñ‚Æ‚¤
+‚»‚¤‚µ‚ñ‚®
+‚ª‚­‚µ‚傤
+‚æ‚킲‚µ
+‚¬‚ñ‚΂ñ
+‚Í‚­‚¤‚ñ
+‚ӂ邳‚Æ
+‚½‚¢‚¹‚«
+‚Ù‚ñ‚ ‚ñ
+‚Æ‚Á‚«‚©
+‚µ‚サ
+‚±‚¤‚¤‚ñ‚«
+‚¬‚傹‚¢
+‚©‚Ô‚«
+‚³‚é‚Ü‚½
+‚½‚ñ‚·‚¢‚©‚Ô‚Â
+‚Ô‚é‚¢
+‚µ‚á‚Ç‚¤
+‚Ђ傤‚ß‚ñ
+‚¹‚¢‚³‚ñ‚µ‚á
+‚¤‚¨
+‚½‚ñ‚¹‚ñ
+‚à‚­‚Ђ傤
+‚ê‚Á‚µ‚ñ
+‚Ä‚Á‚Ø‚«
+‚ ‚­‚¶‚傤‚¯‚ñ
+‚³‚¢‚Ô
+‚»‚¤‚»‚ñ
+‚¦‚è‚ ‚µ
+‚ ‚µ‚È‚Ý
+‚Ü[‚ª‚ê‚Á‚Æ
+‚â‚ñ‚®
+‚½‚¢‚±
+‚Ó‚È‚Ñ‚ñ
+‚¹‚ë‚Ó‚Ÿ‚ñ
+‚à‚ñ‚Ç‚±‚ë
+‚è‚傤‚µ‚傤
+‚µ‚ç‚·
+‚±‚¤‚΂¢‚©
+‚Ú‚¤‚­‚ñ
+‚Ü‚Á‚«
+‚¨‚ñ‚è‚Â
+‚½‚‚ׂñ
+‚¿‚傤‚³‚©
+‚Ë‚¸‚Ý
+‚½‚¢‚»
+‚¤‚µ‚¨
+‚¢‚Á‚½‚¢‚©‚ñ
+‚«‚Ù‚ñ‚«‚イ
+‚«‚т傤
+‚©‚¢‚«‚å
+‚Ó‚¤‚¿‚傤
+‚Ý‚ç‚­‚é
+‚¶‚¶‚á‚­
+‚Ù‚ñ‚Î
+‚Ò‚é
+‚©‚è‚©‚ñ‚¶‚傤
+‚Ó‚ñ‚·‚¢
+‚Í‚ñ‚½‚¢‚ª‚í
+‚¦‚è‚à‚Æ
+‚¤‚炪‚«‚É‚ñ
+‚Ô‚ñ‚è‚á‚­
+‚Ý‚¿‚µ‚é‚×
+‚ë[
+‚¢‚½‚è‚ ‚²
+ƒ\
+‚Å‚Ó‚§‚é‚ß
+‚º‚¢‚Ù‚¤
+‚Ü‚ñ
+‚¦‚ê‚×[‚½
+ƒX
+‚Í‚ñ‚¢
+‚Û‚ñ‚Õ
+‚¶‚イ‚É‚ñ
+‚ ‚ñ‚¹‚¢
+‚݂‚è‚ñ
+‚±‚Ô‚è
+‚©‚Á‚­
+‚Ù‚»‚­
+‚¶‚ñ‚¶‚«‚å‚­
+‚·‚¡[
+‚¯‚ñ‚µ
+‚¹‚ñ‚Ï‚¢
+‚«‚¨‚¢
+‚½‚ñ‚¶‚©‚ñ
+‚¯‚È‚Ý
+‚Ç‚¤‚Ç‚¤‚ß‚®‚è
+‚‚é‚×
+‚µ‚悤
+‚Ç‚ç‚¢
+‚»‚ê‚­‚ç‚¢
+‚í‚©‚Ü‚Â
+‚΂­‚Ó‚¤
+‚΂¢‚»‚­
+‚»‚Ì‚Ü‚Ü
+‚Ô‚ñ‚¶‚傤‚¿
+‚Ä‚·‚¤
+‚¢‚ñ‚¿
+‚¦‚ñ‚¶‚傪‚­
+‚Ú‚­‚¬‚イ
+‚¨‚¤‚Ú‚µ‚á
+‚‚é
+‚Ä‚¨‚è
+‚½‚í[
+‚³‚ñ‚¬‚傤‚悤
+‚«‚イ‚¬
+‚«‚Ü‚¦
+‚¬‚å‚Ó
+‚Ô‚·‚¤
+‚µ‚¨‚Ç‚«
+‚¶‚Ô‚Â
+‚¾‚¢‚à‚ñ‚¾‚¢
+‚Ú
+‚«‚³‚¢
+‚è‚イ‚×
+‚®‚ñ‚悤
+‚Ô‚ñ‚«‚Ä‚ñ
+‚»‚­‚´
+‚Ä‚Ê‚®‚¢
+‚½‚ñ‚Ï‚­‚µ‚Â
+‚º‚ñ‚è‚ñ
+‚è‚イ‚·‚¢
+‚¬‚µ‚¿‚傤
+‚ ‚¨‚«
+‚Å‚ñ‚Õ‚ñ
+‚±‚¤‚¯‚ñ‚É‚ñ
+‚µ‚ウ‚ñ
+‚ ‚Ç‚ê‚·
+‚³‚ñ‚Õ‚­
+‚ ‚ñ‚µ‚Â
+‚Å‚ñ‚°‚«
+‚Ú‚±‚¤
+‚Ü‚Á‚½‚¾‚È‚©
+‚µ‚ゾ‚¢
+‚­‚è‚Á‚Õ
+‚±‚±‚¤
+‚±‚­‚Ð
+‚­‚ë‚Á‚­
+‚¶‚á‚­‚Ä‚ñ
+‚¶‚ñ‚¶‚Ô
+‚à‚ë‚Ä
+‚¨‚¨‚à‚¶
+‚µ‚¿‚Ó‚­‚¶‚ñ
+‚±‚¤‚˂‚Ð
+‚Æ‚Ç‚¯
+‚ª‚ñ‚º‚ñ
+‚±‚ñ‚Ï‚­‚Æ
+‚³‚ñ‚ä
+‚Ù‚ñ‚«‚å
+‚±‚ñ‚¹‚Õ‚Æ
+‚¢‚¦‚¢
+‚Ó‚ë‚Á‚Ò
+‚Ô‚ñ‚®
+‚Þ‚©‚ñ‚µ‚ñ
+‚±‚Ý‚¿
+‚«‚Á‚·
+‚æ‚‚¬
+‚¶‚傤‚­‚¤
+‚Ç‚È‚½
+‚Ђ傤‚΂ñ
+‚¹[‚ç[
+‚Ó‚­‚Æ‚µ‚ñ
+‚¿‚΂ñ
+‚¶‚傤‚¢
+‚º‚¢‚ª‚­
+‚¯‚¢‚³‚ñ‚Õ
+‚Ђ悯
+‚½‚«‚µ‚½
+‚Ƃт΂±
+‚±‚·‚¿‚ã[‚Þ
+‚¹‚ñ‚Å‚ñ‚Ô
+‚Ђ«‚ñ‚¼‚­
+‚¤‚¦[‚Æ
+‚½‚¿‚΂È
+‚¹‚¢‚±‚Â
+‚­‚Á‚«[
+‚Ç‚ç‚¢‚Î
+‚¶‚ã‚‚²
+‚¨‚ñ‚È‚Ì‚±
+‚©‚Ð
+‚­‚ë‚·
+‚Ê‚Ü‚¿
+‚Ù‚­‚¹‚¢
+‚Î[
+‚«‚ñ‚¶‚傤‚Ä‚Á‚Ø
+‚¤‚½‚²‚¦
+‚Å‚«‚²‚Æ
+‚©‚ê‚«
+‚«‚¹‚Â
+‚¯‚‚Ԃñ
+‚±‚Ü[‚µ‚á‚肸‚Þ
+‚©‚ñ‚Ï‚ñ
+‚¢‚¿‚Ü‚¢
+‚µ‚ã‚­‚ß‚¢
+‚É‚¬‚í‚¢
+‚Ö‚ñ‚»‚­
+‚µ‚¯‚¢‚µ‚イ
+‚Å‚ ‚µ
+‚è‚á‚­‚¬
+‚Å‚ ‚¢
+‚Ƃ‚߂ñ‚«‚傤
+‚è‚Á‚Æ‚é
+‚«‚傤‚¢
+‚³‚ñ‚ê‚‚µ‚á
+‚¤‚Ç‚ñ
+‚낤‚²‚­
+‚¨‚ñ‚°‚ñ
+‚°‚ñ
+‚¨‚ê
+‚µ‚ñ‚¬‚¶‚ã‚Â
+‚¨‚¿‚±‚Ý
+‚¨‚Õ‚Ä‚¡‚Ü‚¢‚¸
+‚è‚傤‚ ‚µ
+‚¿‚イ‚±‚ñ
+‚¨‚Î
+‚¤‚í‚Ä
+‚°‚ê‚ñ‚Å
+‚Ù‚ç
+‚¶‚Á‚¹‚«
+‚©‚ñ‚¶‚ã
+‚³‚¶‚ñ
+‚«‚á‚·‚½
+‚ê‚Î[
+‚©‚è‚«‚ã‚ç‚Þ
+‚©‚ç
+‚Ö‚ñ‚³‚¿
+‚±‚¤‚Ä‚ñ
+‚ß‚¢‚«‚イ
+‚ ‚ñ‚±[‚é
+‚¨‚Ñ‚Ç‚ß
+‚¯‚Á‚¹‚ñ
+‚µ‚ã‚т傤
+‚¨‚¨‚Ç‚¨‚è
+‚³[‚Ñ‚·‚ª‚©‚è
+‚ׂ¢‚µ‚å‚­
+‚¦‚¢‚¹‚¢‚©
+‚Ù‚Ç‚¤
+‚»‚ë‚΂ñ
+‚ӂ肾‚µ
+‚­‚¿‚®‚¹
+‚Æ‚¶‚傤‚±‚­
+‚¶‚ク‚ñ‚è‚傤
+‚ ‚­‚µ‚Å‚ñ‚Æ
+‚Æ‚¢‚ê
+‚Æ‚¤‚°‚ñ‚«‚傤
+‚Ó‚­‚ª‚ñ
+‚°‚Ђñ
+‚Ó‚ä‚Ñ
+‚ЂႭ‚Ü‚ñ‚¿‚傤
+‚¨‚«‚à‚¿
+‚¶‚ñ‚²
+‚¹‚ñ‚µ‚ゾ‚ñ
+‚´‚Á‚©‚µ‚傤
+‚¦‚¢‚Ö‚¢
+‚µ‚傤‚µ‚ñ
+‚·‚Æ‚ë[
+‚Ó‚Æ‚¤‚Ó‚­‚Â
+‚Í‚ç‚°‚¢
+‚Ù‚Ë
+‚µ‚ã‚è‚イ
+‚Ü‚ä‚°
+‚©‚¢‚Ä‚¢
+‚©‚ñ‚¿
+‚È‚¢‚¹‚ñ
+‚è‚ñ‚Ô
+‚¢‚ç‚¢‚µ‚ñ
+‚°‚¢‚Ì‚¤
+‚³‚¢‚¸
+‚₳‚«
+‚©‚¢‚Ô‚ñ
+‚«‚å‚­‚Ó
+‚¯‚¢‚½‚¢
+‚䂤‚°‚ñ
+‚ç‚¢‚Ë‚ñ‚Ç
+‚Ђ傤‚¶‚傤
+‚©‚Ç‚Ü‚Â
+‚½‚ñ‚«‚©‚ñ
+‚È‚ª‚ê‚Ú‚µ
+‚Ó‚Ÿ‚¢‚â[
+‚䂾‚â
+‚Ý‚¨‚à
+‚·‚¢‚¶‚ñ
+‚Ô‚ñ‚¿‚イ
+‚µ‚ñ‚¦‚Â
+‚Ü‚¿‚À‚イ
+‚è‚Ý‚Á‚Æ
+‚¢‚¿‚¦‚ñ
+‚±‚­‚È‚¢
+‚½‚¢‚Ú‚­
+‚¯‚¢‚¾‚¢
+‚‚¤‚±‚¤‚Ç‚ß
+‚­‚à
+‚³‚­‚¢
+‚¿‚傤‚Å‚ñ
+‚©[‚Ú‚ñ
+‚Æ‚¤‚Ô
+‚µ‚¬‚傤‚µ‚«
+‚Ä‚Î
+‚Ü‚­‚Í‚è
+‚©‚ñ‚«
+‚Ö‚ñ‚±‚¤
+‚Ù‚¤‚¯‚¢
+‚Ô‚ñ‚¾‚ñ
+‚䂤‚Ì‚¤
+‚É‚¨‚¤
+‚Ђ¶‚傤‚®‚¿
+‚¿‚á‚Ç‚±‚ë
+‚¨‚©‚ ‚³‚Ü
+‚º‚‚²
+‚±‚­‚Þ‚µ‚傤
+‚¹‚Ý
+‚·‚Û[‚Ä‚¡
+‚Ö‚¢‚ß‚ñ
+‚Ù‚Á‚³
+‚¨‚ñ‚©‚¢
+‚Ø‚¢‚ñ‚Æ
+‚º‚ñ‚¹‚Â
+‚´‚¢‚è‚傤
+‚Ú‚ñ‚¨‚Ç‚è
+‚¹‚Á‚¿‚á‚ñ
+‚«‚ñ‚ª‚í
+‚º‚ñ‚©
+‚Ó‚¤‚¤
+‚½‚©‚Ë
+‚ЂƂè‚à‚Ì
+‚µ‚ã‚ê‚ñ
+‚Ë‚ñ‚Ç
+‚Ó‚«‚Ô‚è
+‚Å‚ñ‚è‚イ
+‚«‚傤‚Ú‚­
+‚¶‚ã‚ñ‚¯‚Â
+‚µ‚Í‚ñ‚«
+‚Ù‚ñ‚µ‚á
+‚ª‚悤‚µ
+‚¤‚¿‚¤‚ç
+‚Ä‚Ù‚ñ
+‚©‚­‚¹‚¢‚´‚¢
+‚Ï[‚é
+‚È‚¢‚ß‚¢
+‚»‚¤‚¶‚«
+‚³‚ñ‚ª
+‚Ç‚ê‚·
+‚Í‚ñ‚©‚ñ
+‚±‚­‚º
+‚±‚¤‚¶‚ã‚Â
+‚²‚­‚ç‚­
+‚³‚Æ
+‚Ђ«‚킽‚µ
+‚©‚¢‚Ë
+‚Ü‚ñ‚µ‚å‚ñ
+‚µ‚‚è‚傤
+‚±‚¤‚°‚¢‚©
+‚Æ‚±‚ë
+‚µ‚ñ‚ª‚½
+‚Ђç‚â
+‚©‚­‚Í‚ñ‚«
+‚à‚Ì‚ê[‚é
+‚Ç‚¤‚¿
+‚ª‚¢‚ ‚­
+‚ ‚ñ‚Ä‚È
+‚Ђ¾‚è‚ ‚µ
+‚©‚ñ‚è‚É‚ñ
+‚ЂÁ‚¹‚«
+‚¶‚イ‚°‚«‚¹‚ñ
+‚«‚³‚Ü
+‚Í‚È‚í
+‚½‚®
+‚Æ‚¿‚ª‚ç
+‚°‚‚ꂢ
+‚­‚ñ‚Õ
+‚«‚©‚¢
+ƒV
+‚à‚ñ‚½[‚¶‚ã
+‚Ô‚ñ‚µ‚á
+‚Ó‚ê‚ñ‚Ç
+‚¤‚·‚ª‚½
+‚Ô‚ñ‚ª‚­‚Ô
+‚°‚ñ‚΂­
+‚Ù‚­‚Æ‚¤
+‚¹‚ñ‚ß‚ñ
+‚¦‚à‚Ì
+‚É‚¿‚¶‚傤
+‚µ‚ñ‚»‚¤
+‚«‚à
+‚Ý‚¾‚µ
+‚â[‚Ç
+‚悤‚Ó‚­
+‚´‚Á‚»‚­
+‚æ‚í‚Þ‚µ
+‚Ó‚ë[‚Æ
+‚¿‚傤‚³‚Ð
+‚«‚イ
+‚«‚½‚®‚¿
+‚±‚¤‚µ‚イ
+‚»‚­‚낤
+‚Í‚²‚ë‚à
+‚±‚â‚·
+‚‚Ä
+‚¾‚¢‚Ù‚ñ
+‚«‚á‚ñ‚Å[
+‚»‚¤‚¶‚イ‚µ
+‚ނ‚«
+‚°‚‚è
+‚ׂñ‚¦‚«
+‚è‚«‚イ
+‚Ü‚Á‚Ò‚Â
+‚¤‚¿‚킯‚µ‚å
+‚т傤‚»‚¤
+‚Ó‚¡‚È[‚ê
+‚¢‚¿‚ç‚ñ‚Ђ傤
+‚¶‚ã‚à‚­
+‚Ó‚¤‚¶‚ñ
+‚Ý‚¸‚ª‚ß
+‚©‚ñ‚µ‚Ⴖ‚傤
+‚¤‚í‚«
+‚Ô‚ñ‚©‚´‚¢
+‚Ú‚¤‚µ
+‚­‚¿‚­‚©‚ñ
+‚ׂñ‚¬
+‚µ‚É‚à‚Ì‚®‚é‚¢
+‚µ‚傤‚¹‚Â
+‚­‚³‚è
+‚½‚ñ‚µ‚å‚­
+‚ª‚¢‚Í‚ñ
+‚‚¤‚±‚¤‚É‚ñ
+‚¹‚¢‚è‚å‚­
+‚¢‚ñ‚·‚Ò‚ê[‚µ‚å
+‚³‚¢‚¶‚Â
+‚Ç‚¤‚«‚イ
+‚µ‚µ‚イ
+ƒR
+‚í‚´
+‚¯‚ñ‚¼‚­
+‚è[‚¾
+‚Í‚Á‚¯‚¢
+‚Ç‚ç‚Ü
+‚¨‚¤‚悤
+‚¢‚Ó‚­
+‚Í‚µ‚Âß
+‚¯‚¢‚±‚¤‚Æ‚¤
+‚¶‚³‚ñ‚É‚ñ
+‚»‚ñ‚¿‚傤
+‚Å‚à‚­‚炵[
+‚±‚¤‚³‚­‚µ‚å
+‚©‚ñ‚µ‚ã
+‚È‚¢‚Ô‚ñ‚Ò
+‚¢‚µ‚å
+‚ß‚¢‚©
+‚·‚¢‚Ö‚¢
+‚‚ç
+‚µ‚å‚­‚Ô‚ñ
+‚¹‚¢‚¾‚ñ
+‚Ђ¶‚イ
+‚¾‚¢‚Ô‚Â
+‚¤‚ß‚½‚Ä‚¿
+‚ç‚­‚悤‚¶‚ã
+‚½‚¢‚Ö‚¢
+‚Ü‚«‚à‚Ì
+‚Ì‚¤‚ß‚ñ
+‚à‚Æ‚¿‚傤
+‚ ‚¢‚µ
+‚Í‚¾‚¬
+‚ë‚­‚Ü‚­
+‚ß‚ª‚µ‚ç
+‚æ‚ñ‚ª‚©‚è
+‚ɂイ‚¹‚¢‚Ђñ
+‚͂«
+‚Ü‚¿‚Í‚¸‚ê
+‚¿‚¾‚¢
+‚½‚¢‚Ù‚¶‚傤
+‚È‚¢‚·‚ñ
+‚Ê‚¢‚΂è
+‚µ‚«‚Ü
+‚¼‚¤‚¹‚ñ‚¶‚å
+‚¹‚ñ‚¾‚Á‚Ä
+‚°‚¢‚¶‚ã‚‚³‚¢
+‚­‚Ý‚½‚Ä‚µ‚«
+‚Ú‚±‚­‚²
+‚¿‚イ‚»‚Â
+‚Ó‚Ÿ[‚Þ
+‚Ó‚é[‚Â
+‚Ë‚Á‚­
+‚Ó‚Ÿ‚­‚Æ‚è
+‚¿‚傤‚©‚­
+‚±‚¤‚Ý‚ñ
+‚ß‚µ‚‚©‚¢
+‚ß‚ñ‚´‚¢
+‚®‚»‚­
+‚Í‚¾‚ñ
+‚µ‚傪
+‚Æ‚Á‚Õ‚¤
+‚¶‚イ‚Ô‚ñ
+‚¹‚ñ‚ª‚¢
+‚¬‚¶‚ñ
+‚è‚ê‚«‚µ‚å
+‚Ü‚¢‚‚«
+‚Ï‚é‚·
+‚Ñ‚ê‚Á‚¶
+‚ЂႭ‚É‚¿
+‚½‚¢‚ 
+‚³‚Õ‚ç‚¢
+‚Í‚È‚µ‚ ‚¢‚Ä
+‚Æ‚¯‚ñ
+‚¶‚ñ‚¶‚ª‚©‚è
+‚·‚¢‚¿‚イ‚æ‚­‚¹
+‚¢‚ꂱ‚Ý
+‚悤‚¬
+‚ç‚ñ‚Ï‚­
+‚΂ñ‚«‚ñ‚®
+‚¶‚傤‚æ
+‚Ä‚Á‚³‚­
+‚Ù‚¤‚Ԃ‚¹‚ñ
+‚ ‚¢‚¿
+‚¨‚₪‚¢‚µ‚á
+‚»‚±‚¢‚ê
+‚¶‚ñ
+‚±‚¤‚è‚Â
+‚«‚ñ‚Ï‚¢
+‚ß‚¢‚¹‚«
+‚±‚ë‚ñ‚Ô‚·
+‚©‚ñ‚·‚¤‚¶
+‚Ó‚ñ‚¬‚è
+‚Ç‚¤‚¬‚²
+‚¬‚É‚ 
+‚¹[‚½[
+‚Ü‚¿‚©‚Ç
+‚€‚傤
+‚µ‚ñ‚«‚낤
+‚¿‚Á‚»
+‚«‚Ⴝ‚Â
+‚®‚¤‚·‚¤
+‚¨‚³
+‚ª‚Á‚©
+‚½‚ß‚µ
+‚ЂƂ‚Ô
+‚Ô‚ñ‚҂‚ԂÂ
+‚©[‚Ä‚ñ
+‚©‚킹
+‚³‚¢‚Å‚ñ
+‚ ‚«‚΂ê
+‚µ‚Ⴖ‚­
+‚΂ñ‚É‚ñ
+‚æ‚í‚«
+‚©‚ñ‚ª‚¦‚©‚½
+‚º‚ñ‚ ‚­
+‚«‚イ‚±‚¤‚¯‚ñ
+‚Þ‚ç‚â‚­‚Î
+‚­‚©‚ñ
+‚â‚­‚´‚¢
+‚â‚­‚¢‚ñ
+‚½‚É‚ñ‚¸‚¤
+‚¨‚ñ‚±
+‚»‚¤‚Ä‚ñ
+‚¨‚¤‚µ‚イ
+‚¨‚Æ‚¤‚³‚Ü
+‚µ‚å‚Á‚±‚¤
+‚È‚Ê‚©
+‚±‚¤‚µ‚á
+‚ª‚¢‚â
+‚ª‚¢‚ç‚¢
+‚ӂ悤
+‚Ü‚ñ‚ª
+‚µ‚イ‚¬
+‚©‚Ý‚Â
+‚Ђá‚Á‚ς‚ЂႭ
+‚Ú‚é‚Æ
+‚æ‚‚Î
+‚Ԃ悤
+‚¯‚‚¼‚­
+‚æ‚Ñ‚²‚¦
+‚¹‚ñ‚¿‚ß[‚Æ‚é
+‚ê[‚æ‚ñ
+‚‚¤‚µ‚傤
+‚Í‚È‚Ñ
+‚΂¢‚¦‚ñ
+‚³‚­‚â‚­
+‚­‚³‚Æ‚è
+‚Ô
+‚µ‚ゲ‚¤
+‚‚¤‚©‚ñ
+‚‚¬‚ß
+‚·‚Ì‚à‚Ì
+‚Õ‚ê‚Ý‚ ‚Þ
+‚Ù‚µ
+‚˂‚µ‚å‚è
+‚Å[‚½‚×[‚·
+‚²‚¢‚¿‚Ç‚¤‚³‚Ü
+‚·‚Ø‚­‚Æ‚é
+‚¯‚¢‚è‚á‚­
+‚°‚ñ‚°‚Â
+‚¬‚¶‚ã‚‚µ‚Â
+‚¤‚¦[‚Æ‚ê‚·
+‚µ‚傤‚³‚ñ
+‚±‚±‚낯
+‚܂‚悤
+‚Í‚¿‚傤
+‚«‚傤‚©‚¢
+‚Ç‚¼‚¤
+‚¢‚²‚ñ
+‚܂ǂ肸
+‚¯‚¢‚´‚¢‚«‚©‚­‚¿
+‚â‚­‚µ‚å
+‚È‚ñ‚ë
+‚Ì‚¤‚»‚Á‚¿‚イ
+‚Þ‚¿‚¤‚¿‚µ‚傤
+‚Ô‚ç‚¢‚ñ‚Ç
+‚Í‚¢‚´‚ç
+‚©‚ñ‚«‚Â
+‚Ђɂ¿
+‚­‚¿‚©‚¸
+‚Ђâ‚ß‚µ
+‚¢‚Á‚Ï‚ñ
+‚±‚¤‚µ‚ñ‚¶‚å
+‚Ô‚ñ‚Ò‚Â
+‚¶‚¥‚Á‚Æ
+‚«‚ñ‚¾
+‚¶‚¤
+‚Ë‚ª
+‚Ђ¢
+‚¶‚ã‚à‚ñ
+‚É‚¹‚à‚Ì
+‚â‚­‚Ô‚Â
+‚ ‚ׂê[‚¶
+‚ç‚è[
+‚Í‚Á‚±‚Â
+‚¶‚コ‚ñ
+‚Ó‚§‚肨
+‚¹‚¢‚µ‚傤
+‚¢‚Á‚µ‚ã
+‚«‚イ‚Ë‚Â
+‚¤‚ç‚È‚¢
+‚·‚¤‚ß‚¢
+‚©‚­‚¦‚«
+‚¨‚ñ‚¶‚ã‚ñ
+‚Æ‚¤‚¨‚¤
+‚Ä‚ñ‚¶‚å
+‚Æ‚è‚©‚²
+‚µ‚Ý
+‚Û
+‚¤‚í‚®‚Â
+‚ ‚ê‚à‚悤
+‚¹‚Á‚¯‚¢‚µ‚Â
+‚³‚ñ‚䂱‚­
+‚½‚¢‚µ‚å‚­
+‚Æ‚ë‚Ó‚¡
+‚¢‚·‚炦‚é
+‚¯‚¢‚µ‚イ
+‚Ù‚¤‚¿‚«
+‚Ý‚ê‚ñ
+‚æ‚‚ä
+‚ ‚‚łñ
+‚É‚³‚΂«
+‚¿‚イ‚낤‚¢
+‚µ‚Ђ傤
+‚©‚¯
+‚¤‚ç‚É‚¤‚Þ
+‚Âǂ¤
+‚Ђæ‚è‚Ý
+‚Í‚Á‚҂傤‚©‚¢
+‚낤‚Þ
+‚¯‚ñ‚¢‚´‚¢
+‚₪‚­
+‚Í‚­‚ 
+‚‚邩‚ß
+‚ ‚¢‚Ä
+‚ª‚¢‚±‚­‚²
+‚¨‚è‚Âé
+‚킪‚µ
+‚±‚»‚Å
+‚À
+‚É‚µ‚ñ‚Ù‚¤
+‚ ‚¢‚µ‚á
+‚½‚¢‚±‚­
+‚³‚­‚ç
+‚Ü‚È[
+‚Ô‚°‚¢
+‚©‚ß‚ñ
+‚¾‚ñ‚è‚イ
+‚«‚ñ‚µ‚á
+‚è‚Á‚«‚傤
+‚Ä‚ç
+‚Ђ傤‚¶‚«
+‚±‚¤‚­‚¤
+‚Ü‚¢‚Ø[‚·
+‚»‚è‚Ý
+‚©‚­‚Í‚ñ
+‚©‚ß‚ç
+‚¢‚¿‚ë
+‚ä‚邵
+‚ ‚«‚â
+‚‚«‚²‚µ
+‚ЂÇ
+‚ڂ‚ª
+‚¹‚«‚è‚ñ
+‚«‚イ‚Ç‚¤
+‚ق낤
+‚µ‚Ç‚¤‚µ‚á
+‚µ‚Í‚ç‚¢‚É‚ñ
+‚±‚­‚Ô‚ñ‚ª‚­
+‚¨‚΂È
+‚´‚¢‚΂Â
+‚©‚È‚ß
+‚Ó‚±‚¤‚Ö‚¢
+‚¯‚ñ‚µ‚イ
+‚à‚³
+‚©‚½‚©‚È
+‚è‚傤‚³‚­
+‚¦‚ñ‚¶‚ñ
+‚¢‚Á‚»
+‚¢‚³‚ñ
+‚¿‚傤‚¶‚イ
+‚Ù‚µ‚å‚­
+‚­‚¿‚ ‚½‚è
+‚¦‚Ò‚ë[‚®
+‚«‚³‚«
+‚·‚È‚¨
+‚悹‚¬
+‚»‚¤‚¼‚­
+‚ª‚¢‚«
+‚ß‚Ç
+‚¾‚¦‚ñ
+‚Ó‚Ù‚ñ‚¢
+‚«‚½‚É‚Ù‚ñ
+‚Ý‚É‚Ü‚Þ
+‚¹‚ñ‚©‚ñ
+‚®‚ç‚Ñ‚ 
+‚¢‚Á‚Ï‚­
+‚Ð[‚½
+‚µ‚ñ‚Æ‚¤
+‚Ñ‚Á‚®
+‚°
+‚悤‚ª
+‚«‚傤‚±‚¤‚®‚ñ
+‚܂‚Î
+‚è‚䂤
+‚±‚¤‚¯‚¢
+‚¢‚¯‚ª‚«
+‚Å‚Ó‚Ë
+‚¶‚²
+‚ЂƂƂ¨‚è
+‚Ý‚ñ‚µ‚á‚Æ‚¤
+‚«‚¨‚­‚è‚å‚­
+‚ ‚ñ‚ç‚­
+‚Æ‚¯‚¢
+‚¬‚¶‚ã‚Â
+‚¢‚ë
+‚Ù‚¤‚«‚ñ
+‚«‚Ê
+‚¿‚ñ‚¹‚«
+‚ß‚¢‚µ‚ã
+‚«‚悤
+‚Ù‚¤‚©
+‚±‚¤‚Æ‚¤‚ª‚Á‚±‚¤
+‚±‚¤‚±‚­‚©
+‚è‚©
+‚¿‚債‚å
+‚¢‚Á‚µ‚ã‚ñ
+‚Ä‚¢‚«‚¯‚ñ
+‚ЂÂ¯
+‚±‚È‚ä‚«
+‚Í‚·
+‚Ñ‚¾‚ñ
+‚Ö‚ñ‚µ‚イ‚«‚å‚­
+‚½‚¢‚Æ
+‚݂傤‚²
+‚ª‚½
+‚¾‚¢‚¢‚¿‚¬
+‚Ђ傤‚è‚傤
+‚¶‚イ‚΂±
+‚¹‚«‚ª‚¢‚¹‚ñ
+‚¶‚ñ‚¢
+‚È‚É‚í‚Ô‚µ
+‚¤‚½
+‚¬‚¦‚ñ‚«‚ñ
+‚í‚©‚à‚Ì
+‚©‚·‚½‚Þ
+‚©‚ꂵ
+‚Ô‚Á‚µ‚Â
+‚Ý‚ñ‚䂤
+‚Ó‚ ‚ñ‚È‚¢
+‚¶‚¹‚¢
+‚³‚ñ‚¯‚¢
+‚Ó‚ñ‚Ï‚ñ
+‚¿‚å‚­‚¹‚ñ
+‚©‚Ì‚¤
+‚悤‚¹‚ñ
+‚®‚ñ‚©
+‚Ä‚ñ‚ê‚¢
+‚¦‚ñ‚Ä‚ñ‚©‚‚¾‚Â
+‚à‚µ‚傤
+‚Ԃ‚è‚傤
+‚¨‚Æ‚±‚à‚Ì
+‚¶‚傤‚Þ‚©‚¢
+‚¾‚ñ‚²
+‚¶‚イ‚©‚ñ
+‚±‚¤‚Í‚Â
+‚Õ‚Á‚µ‚ã‚Ù‚ñ
+‚¶‚¿
+‚µ‚ã‚Á‚Ï‚ñ‚µ‚Â
+‚¾‚¢‚²‚Ô
+‚µ‚債‚ñ‚è‚傤
+‚Í‚­‚Ü‚¢
+‚³‚¯‚ß
+‚Ë‚ñ‚è‚ñ
+‚Ü‚Ç‚¬‚í
+‚·‚¤‚ê‚Â
+‚¢‚ª‚­‚©
+‚ª‚­‚°‚«
+‚¦‚¢‚«‚イ‚µ
+‚Í‚ñ‚¹‚¢
+‚¶‚á[‚Ȃ肸‚Þ
+‚ß‚¢‚Ç
+‚ ‚¢‚¨‚¢
+‚³‚¯
+‚»‚©‚¢
+‚«‚¸
+‚Ý‚½‚¯
+‚²‚è‚傤
+‚¤‚¨‚ª‚µ
+‚Ü‚Á‚Í
+‚¶‚傤‚æ‚­
+‚­‚â‚­‚µ‚å
+‚Ó‚°‚ñ
+‚«‚ñ‚µ‚ñ
+‚Ä‚¢‚¹‚¢
+‚Ó‚­‚Ù‚ñ
+‚¶‚á‚Ì‚ß
+‚ ‚ñ‚Ä‚¢‚©‚ñ
+‚ß‚ñ‚Ä‚¢
+‚¢‚º‚ñ
+‚Ä‚¢‚©‚©‚­
+‚¦‚Å‚¡‚Á‚Æ
+‚¿‚イ‚¢‚¶‚±‚¤
+‚µ[
+‚«‚傤‚¿
+‚¨‚ñ‚è‚傤
+‚½[‚ñ
+‚ ‚³‚¢‚Æ
+‚ç‚­‚Ä‚ñ
+‚Ñ‚í
+‚â‚©‚ñ
+‚µ‚½‚ÂÝ
+‚´‚ñ‚Ò‚ñ
+‚µ‚傤‚¹‚¢
+‚т傤‚µ‚Â
+‚݂傤‚΂ñ
+‚Ë‚ñ‚È‚¢
+‚µ‚傤‚¼‚¤
+‚Æ‚¤‚µ‚傤
+‚è‚Á‚½‚¢
+‚½‚ñ‚¹‚«
+‚æ‚Á‚Â
+‚Ö‚ñ‚µ‚‚µ‚á
+‚«‚イ‚Ë‚ñ
+‚±‚¤‚¾‚©
+‚®‚ñ‚µ‚傤
+‚Ý‚¸‚Í‚¯
+‚©[‚²
+‚ۂ肵[
+‚°‚¢‚µ‚ã‚ñ
+‚±‚¤‚Ù‚¤
+‚±‚¿‚傤
+‚º‚ñ‚±‚­
+‚è‚ñ‚â
+‚±‚¤‚¹‚ñ
+‚ׂ‚¶
+‚Ì‚Ú‚è
+‚Ђ傤‚·‚¤
+‚»‚ñ‚ª‚ñ
+‚«‚ñ‚낤‚«‚å‚­
+‚³‚µ‚킽‚µ
+‚à‚Ý
+‚Ђ´‚µ
+‚±‚¤‚¢‚ñ‚µ‚傤
+‚¿‚イ‚Ô
+‚¿‚イ‚É‚­
+‚ ‚Æ‚¿
+‚è‚傤‚Ç‚¤
+‚Ú‚¤‚¨‚ñ
+‚²‚­‚¿‚イ
+‚¢‚È‚è
+‚È‚ñ‚±‚Â
+‚«‚å‚Ô
+‚ç‚­‚¿‚イ
+‚ڂ‚˂ñ
+‚è‚イ‚Ђ傤
+‚¨‚µ‚°
+‚¶‚Ⴕ‚ñ
+‚µ‚È‚à‚Ì
+‚¹‚ñ‚Ä‚Â
+‚ [‚¿‚¥‚è
+‚¶‚ñ‚¹‚¢‚©‚ñ
+‚Ý‚«
+‚ЂĂÂ
+‚½‚¢‚¢‚­
+‚Ç‚ç‚Ó‚Æ
+‚¬‚ ‚­
+‚Ä‚Á‚±‚¤‚µ‚å
+‚͂肪‚Ý
+‚Å‚´‚¢‚È
+‚Ä‚ñ‚Ä‚«
+‚­‚è‚·‚¿‚á‚ñ
+‚°‚ñ‚Ø‚¢
+‚³‚¢‚¦‚ñ‚·
+‚è‚イ‚¶‚傤
+‚«‚イ‚¹‚«
+‚»‚¤‚µ
+‚¯‚¢‚«
+‚Ü‚¢‚Ó‚ñ
+‚₵‚ã
+‚Ö‚ñ‚Ò
+‚µ‚à‚«
+‚¬‚ ‚ñ
+‚°‚ñ‚Ç‚ª‚­
+‚¹‚¢‚¿‚á
+‚©‚ñ‚¿‚傤
+‚½‚¢‚±‚΂ñ
+‚݂傤‚è
+‚½‚ñ‚«
+‚´‚¢‚ª‚¢
+‚¢‚µ‚΂¢
+‚è‚傤‚©‚¢
+‚Í‚ñ‚ׂ¢
+‚©‚µ‚¹‚«
+‚ ‚ñ‚È‚¢‚É‚ñ
+‚×[‚·
+‚È‚ª‚ê
+‚¢‚¶‚傤
+‚¶‚Í‚ñ‚«
+‚¹‚Ô‚ñ
+‚¬‚ñ‚±‚¤
+‚¤‚¯‚Ä
+‚µ‚ê‚¢
+‚¦‚ñ‚µ‚ã‚‚©
+‚¨‚Ó‚¡‚µ‚á‚é
+‚¢‚ñ‚­
+‚¦‚¢‚¬‚傤‚µ‚å‚¿
+‚ß‚¢‚°‚ñ
+‚悪
+‚È‚©‚¹
+‚¨‚¹‚¢‚Ú
+‚½‚¢‚µ‚傤‚Ђ傤
+‚¶‚¥[
+‚ç‚¢‚¹
+‚ê‚¢‚«‚á‚­‚«
+‚ß‚¢‚¦‚ñ
+‚΂ñ‚䂤
+‚Ô‚ñ‚Ä‚ñ
+‚µ‚ñ‚΂ñ
+‚Í‚ñ‚ê‚¢
+‚Ô‚ñ‚°‚¢‚©
+‚Ђñ
+‚·‚±‚Á‚¿
+‚Æ‚¨‚â‚Ü
+‚é‚¢‚¯‚¢
+‚Ù‚ñ‚Þ
+‚±‚±‚ 
+‚©‚Á‚½‚ñ
+‚Ù‚ñ‚Ç
+‚¹‚¢‚¿
+‚Ó‚­‚悤
+‚¾‚¢‚¾‚¢‚¢‚ë
+‚¼‚¤‚µ‚«
+‚½‚¢‚ª‚¢
+‚±‚ñ‚Æ‚ç‚·‚Æ
+‚¦‚ñ‚«‚å‚­
+‚º‚Á‚Ï‚ñ
+‚©‚·‚¤‚Ô
+‚â‚­‚Ô‚ñ
+‚¤‚¿‚«‚ñ
+‚䂤‚è‚·‚¤
+‚à[‚ß‚ñ‚Æ
+‚Ђµ‚債‚Â
+‚Ý‚Ý‚½‚Ô
+‚³‚¢‚à‚­
+‚·‚«‚â
+‚È‚ñ‚È‚ñ‚Æ‚¤
+‚¦‚¢‚è
+‚«‚­‚·‚¢
+‚Ù‚¤‚à‚ñ‚³‚«
+‚±‚¤‚¶‚傤‚¿‚傤
+‚ׂ邬[
+‚䂤‚¾‚ñ‚µ‚á
+‚©‚×
+‚µ‚ñ‚Ý
+‚í‚é‚Â
+‚³‚µ‚¨‚³‚¦
+‚«‚Ñ
+‚Þ‚ê
+‚µ‚¦‚¢
+‚䂤‚ê‚¢
+‚­‚Ý
+‚¾‚¢‚·‚¤
+‚¶‚á‚Ü‚à‚Ì
+‚¢‚ñ‚ª‚¢
+‚Ó‚È‚®
+‚´‚Á‚«‚å
+‚µ‚ã‚Ђñ
+‚¹‚ñ‚¹[‚µ‚å‚ñ
+‚±‚Ç‚­
+‚Þ‚Ë‚ñ
+‚µ‚Ù‚¤
+‚ւ肱‚Õ‚½
+‚­‚¬
+‚΂½[
+‚è‚Ä‚ñ
+‚½‚‚¹
+‚±‚¤‚³
+‚Ó‚©‚µ‚ñ
+‚Ý‚¬‚µ‚½
+‚¨‚­‚É
+‚¤‚·‚­‚¿
+‚‚ڂ·‚¤
+‚¶‚å‚Ü‚­
+‚µ‚ñ‚Æ‚­
+‚µ‚Ⴖ‚Â
+‚³‚¯‚Ä‚ñ
+‚µ‚イ‚ª‚­‚©
+‚¿‚ñ‚¬‚ñ
+‚Å‚ñ‚¿
+‚¿‚傤‚¶‚©‚ñ
+‚Í‚Á‚³‚­
+‚¼‚¤‚Ù‚ñ
+‚½‚­‚킦
+‚Ó‚«‚ñ
+‚«‚傱‚ñ
+‚«‚ñ‚ç‚¢
+‚¢‚Á‚±
+‚µ‚¹‚¢‚¶
+‚Ђӂ©
+‚©‚ç‚Ä
+‚©‚è‚à‚Ì
+‚¿‚傤‚³‚ñ‚Ú‚µ
+‚¬‚傤‚©‚¢
+‚΂ñ‚³‚­
+‚Ù‚¤‚»‚­
+‚Ђñ‚µ‚Â
+‚Í‚µ
+‚ª‚Á‚«‚Ü‚Â
+‚½‚µ‚ñ
+‚ä‚´‚¢
+‚¨‚¤‚µ‚å‚­
+‚µ‚ñ‚¯‚Â
+‚â‚Ü‚Å‚ç
+‚µ‚ñ‚Õ
+‚ ‚È‚¤‚ñ‚³
+‚à‚¤‚ЂÂ
+‚܂悯
+‚³‚Ý‚Á‚Æ
+‚¢‚Ì‚¿‚ª‚¯
+‚킨‚ñ
+‚±‚¤‚Ç‚¤‚è‚å‚­
+‚Ü‚Æ
+‚³‚ñ‚Ý‚á‚­
+‚±‚¤‚±‚¤‚¬‚傤
+‚ł΂¢‚·
+‚ɂイ‚©‚¢‚«‚ñ
+‚Ü‚Ü‚Í‚Í
+‚©‚«‚‚¯
+‚©‚µ‚â
+‚°‚ñ‚½‚¢
+‚©‚é‚í‚´
+‚µ‚½
+‚΂ñ‚¯‚ñ
+‚«‚肱‚¤‚¶‚傤
+‚¢‚т傤
+‚ê‚ׂé
+‚ ‚½‚Ü‚¤‚¿
+‚½‚©‚È‚Ý
+‚µ‚傤‚¦‚Ë
+‚©‚¢‚ª‚¢
+‚ê‚¢‚Ç
+‚Ó[‚Ç
+‚Ç‚¤‚¬‚傤‚µ‚á
+‚Ö‚¢‚΂ñ
+‚ê‚ñ‚´‚ñ
+‚Ä‚ñ‚Æ
+‚¶‚傤‚È‚¢
+‚ß‚¢‚ ‚ñ
+‚Ђ傤‚æ‚Ý
+‚Æ[‚ñ
+‚¹‚¢‚¹‚ñ
+‚Ü‚¢‚©[
+‚­‚¤‚¹‚«
+‚ç‚¢‚Í‚é
+‚ß‚ª
+‚ ‚Ó‚ª‚É‚·‚½‚ñ
+‚Æ‚¤‚¶‚µ‚á
+‚Ђ¾‚Ü‚è
+‚µ‚¥‚Ó
+‚Ø‚Á‚Æ
+‚¤‚肾‚µ
+‚©‚¶‚©
+‚¦‚ñ‚®‚ñ
+‚«‚Ú‚Ë
+‚³‚¢‚Ý‚ñ
+‚¢‚Á‚Ò‚ñ
+‚¿‚イ‚Ñ
+‚ ‚Á‚¯
+‚«‚ñ‚낤‚©
+‚Ï[‚¹‚ñ‚Ä[‚¶
+‚Þ‚µ‚ñ‚¯‚¢
+‚É‚í‚¢‚µ
+‚³‚¢‚¹‚¢‚«
+‚©‚ñ‚ª‚¢
+‚¨‚ñ‚¿‚傤
+‚ë[‚ç
+‚Ù‚¤‚µ‚«
+‚¢‚Á‚Û‚¤
+‚©‚Ü‚Ú‚±
+‚Ђ«‚Æ‚è‚Ä
+‚¶‚ñ‚é‚¢‚ª‚­
+‚Ä‚²‚낳
+‚Æ‚é‚­
+‚à
+‚¨‚¤‚¯
+‚Ù‚¯‚ñ‚è‚傤
+‚µ‚傤‚ª‚Á‚±‚¤
+‚©‚ñ‚²
+‚¶‚イ‚Ü‚¢
+‚¤‚ç‚Ä
+‚Ó‚ç‚ñ
+‚ ‚Á‚Õ‚é
+‚¦‚ñ‚¿‚傤
+‚µ‚å‚¢‚ñ
+‚Ä‚Á‚­‚·
+‚¢‚ñ‚ê‚Á‚Æ
+‚¨‚¢‚ß
+‚é[‚¿‚ñ
+‚µ‚ë‚­‚ë
+‚à‚Ì‚µ‚è
+‚²‚¾‚Â
+‚Æ‚¤‚©‚­
+‚¢‚¿‚¾‚¢
+ƒL
+‚ ‚­‚Æ‚¤
+‚à‚Ó‚­
+‚Ñ‚è‚イ‚µ
+‚½‚¢‚ë
+‚»‚¤‚¾‚©
+‚Ó‚È‚Î
+‚Ý‚¬‚¤‚Å
+‚»‚Á‚«‚イ
+‚à‚­‚¼‚¤
+‚¯‚ñ‚³‚Ô
+‚¢‚ñ‚Û[‚Æ
+‚Ó‚Ý‚¢‚½
+‚µ‚䂤‚¿
+‚ӂ낵‚«
+‚³‚Ö‚ñ
+‚¶‚イ‚´‚¢
+‚ª‚¢‚悤
+‚°‚ñ‚΂­‚µ‚傤
+‚‚¤‚µ‚ñ‚Ú
+‚½‚ñ‚ß‚ñ
+‚°‚Á‚µ‚å‚­
+‚ ‚Á‚Æ
+‚×[‚µ‚Á‚­
+‚æ‚Ñ‚«
+‚©‚ñ‚¹‚¢
+‚¤‚È‚¬
+‚½‚¢‚«
+‚¤‚§[
+‚¯‚ñ‚»‚¤
+‚¿‚イ‚°‚ñ
+‚΂Á‚Û‚ñ
+‚΂ñ‚¹‚ñ
+‚é[‚¸
+‚´‚ñ‚µ‚å
+‚Ó‚ ‚ñ‚Ä‚¢
+‚¢‚ê‚Ô‚ñ
+‚²‚è‚©‚¢
+‚Å‚ç‚Á‚­‚·
+‚°‚‚߂ñ
+‚‚ß
+‚¬‚傤‚©‚¢‚µ
+‚±‚¤‚낤‚¢
+‚ق䂤‚è‚Â
+‚É‚¿‚¶
+‚¨‚¤‚¢
+‚Ö‚ñ
+‚¨‚邲[‚é
+‚Æ‚Á‚«‚債‚Â
+‚«‚ñ‚¶‚Æ‚¤
+‚±‚µ‚å
+‚è[‚®
+‚䂤‚è‚傤
+‚Ü‚¾‚¯
+‚΂¢‚½‚¢
+‚Ù‚ñ‚Û
+‚à‚è‚ ‚ª‚è
+‚¨‚·‚²‚µ
+‚¤‚Ë
+‚Í[‚Î[
+‚¨‚â‚©‚½
+‚½‚È‚´‚炵
+‚¤‚è‚ ‚°
+‚©‚¢‚µ‚傤
+‚Ù‚¤‚»‚¤
+‚ނ䂤‚т傤
+‚µ‚³‚¢
+‚Ñ‚É‚ë‚ñ
+‚Ï‚»‚±‚ñ
+‚ª‚­‚Ô‚¿
+‚Ó‚¢‚²
+‚¿‚ñ‚¶‚ã
+‚Ó‚ß‚Â
+‚݂傤‚¶
+‚Î[‚¶‚å‚ñ
+‚͂‚łñ‚«
+‚µ‚å‚©‚ñ
+‚°‚ñ‚҂傤
+‚¾‚¿‚ñ
+‚µ‚å‚«‚イ
+‚Ä‚¡‚Á‚µ‚ã
+‚Ô‚Á‚½‚¢
+‚Ý‚¸‚Þ‚µ
+‚¹‚ñ‚«
+‚è‚ׂÁ‚Æ
+‚­‚¸‚ä
+‚³‚ñ‚«‚ã[
+‚܂‚è‚イ
+‚µ‚ñ‚Õ‚¤
+‚©‚ñ‚Ԃ‚¦
+‚±‚¶‚ñ
+‚‚¢‚½‚¿
+‚¿‚傤‚»‚ñ
+‚â‚­‚¬
+‚Ù‚ñ‚«‚å‚¿
+‚µ‚¹‚¢
+‚·‚Õ[‚é
+‚·‚ë[
+‚³‚ñ‚½
+‚½‚¢‚¯
+‚±‚¤‚¶‚傤
+‚¨‚ñ‚½‚¢
+‚É‚è‚‚͂¢‚Í‚ñ
+‚¼‚­‚Ö‚ñ
+‚Í‚­‚¹‚¢
+‚Å‚ñ‚ç‚ñ
+‚Ü‚¢‚¶
+‚Ù‚­‚Æ
+‚©‚݂ЂƂ¦
+‚È‚¼
+‚«‚è
+‚ ‚ñ‚Ò
+‚«‚イ‚¹‚¢
+‚¨‚»‚¶‚à
+‚ ‚ß‚è‚©‚ñ
+‚µ‚«‚³‚¢
+‚±‚¤‚¸‚¢
+‚Ù‚ñ‚Ë
+‚¶‚¯‚ñ
+‚è‚イ‚³‚ñ
+‚ë[‚½‚è
+‚±‚Á‚¯‚¢
+‚ ‚ç‚肦‚«‚è‚Â
+‚Ü‚¢‚²‚¤
+‚¨‚¨‚¶
+‚¬‚Ù‚¤
+‚Ü‚®‚Ë‚Á‚Æ
+‚©‚­‚©‚¼‚­
+‚Ó‚µ‚ñ‚©‚ñ
+‚×[‚¶‚ã
+‚Þ‚°‚¢
+‚悵‚Ì
+‚ª‚­‚Í
+‚Ô‚¤‚ñ
+‚æ‚­‚¿‚傤
+‚¦‚¢‚Ô‚ñ
+‚ ‚¢‚æ‚­
+‚ ‚°‚ ‚µ
+‚Ü‚¢‚Æ‚µ
+‚Ä‚¢‚©
+‚°‚ñ‚µ‚ã
+‚³‚炵‚±
+‚Ú‚¤‚¿‚イ‚´‚¢
+‚¨‚ñ‚È‚ª‚½
+‚¹‚ñ‚¹‚ñ
+‚Ù‚µ‚à‚Ì
+‚¢‚±‚Â
+‚©‚ç‚­‚¿
+‚·‚ë[‚à[‚µ‚å‚ñ
+‚Ü‚é‚­‚Ñ
+‚¨‚è‚ñ‚Ò‚Á‚­
+‚Ù‚Ó
+‚Ë‚ñ‚¾‚¢
+‚¤‚¨‚Á‚¿
+‚Ä‚¢‚½‚¢‚º‚ñ‚¹‚ñ
+‚¶‚ã‚ñ‚Ó‚Ç‚¤
+‚µ‚ß‚è
+‚¢‚¿‚¶‚å
+‚¶‚ª‚¼‚¤
+‚·‚²‚Ý
+‚¿‚イ‚·‚¤
+‚ê[‚Æ
+‚©‚½‚ ‚µ
+‚½‚ñ‚è
+‚µ‚낪‚Ë
+‚Ђã[‚Ü‚É‚¸‚Þ
+‚­‚º‚Â
+‚Ô‚ñ‚µ‚イ
+‚¯‚¢‚µ‚Â
+‚¤‚µ‚ë‚Å
+‚Ó‚ç‚ñ‚·‚²
+‚µ‚ñ‚Ë‚ñ
+‚¨‚Ó‚³‚¢‚Ç
+‚Å‚«‚ ‚ª‚è
+‚¦‚¢‚ׂ¢‚©
+‚¢‚É‚µ‚á‚é
+‚½‚¢‚Õ‚ç‚¢‚½
+‚ ‚ñ‚µ‚ñ
+‚«‚ñ‚¢‚Â
+‚·‚¢‚¹‚¢
+‚»‚¤‚¾‚¢
+‚¶‚ã‚©‚¢
+‚´‚µ‚傤
+‚ª‚¢‚¿‚傤
+‚à‚悤
+‚Ù‚¢‚­‚µ‚å
+‚Õ‚ë‚Ø‚ç
+‚©‚‚¨
+‚Ï‚í‚Ó‚é
+‚©‚¹‚¢‚Ó
+‚‚¤‚«‚ñ‚Ð
+‚Ï‚ç‚»‚é
+‚Ý‚ñ‚è‚å‚­
+‚¶‚ê‚ñ‚Ü
+‚»‚Ó‚Æ
+‚¾‚µ‚á
+‚䂤‚µ‚イ
+‚¦‚¢‚±‚¹‚¢‚·‚¢
+‚Ä‚ñ‚¶‚Â
+‚Ù‚½‚é
+‚Æ‚¤‚È‚ñ‚Æ‚¤
+‚ª‚­‚µ‚á
+‚«‚イ‚µ‚ñ‚è‚å‚­
+‚¿‚å‚­‚µ
+‚È
+‚µ‚¦‚ñ‚µ‚á
+‚¢‚»‚Á‚Õ
+‚Ó‚ß‚¢‚낤
+‚¿‚‚¶‚å
+‚Þ‚Ç‚­
+‚«‚傤‚è‚Â
+‚©‚Ô‚Ê‚µ
+‚Ó‚Í‚Â
+‚è‚å‚Ä‚¢
+‚¨‚±‚¤‚Å‚ñ
+‚¶‚¤‚ñ
+‚í‚è‚‚¯
+‚Ö‚¢‚¹‚¢
+‚µ‚イ‚ª‚Á‚©
+‚Ü‚ñ‚©‚¢
+‚©‚ñ‚«‚á‚­
+‚ ‚ñ‚΂ç‚ñ‚·
+‚©‚‚è‚å‚­
+‚º‚ñ‚Ò‚ñ
+‚ ‚é‚Ý
+‚Ý‚±‚ñ
+‚¶‚傤‚°‚ñ
+‚Ó‚¡‚ñ
+‚«‚å‚­‚è‚Â
+‚Í‚­‚Î
+‚ ‚º
+‚Ý‚ñ‚Ç
+‚Ó‚­‚µ‚á‚¿‚傤
+‚Ԃ炤‚·
+‚Í‚ñ‚Æ‚¤
+‚낤
+‚·‚Ï‚°‚Á‚Ä‚¡
+‚‚¿‚â‚Ü
+‚±‚¤‚Æ‚¤‚©
+‚¦‚¢‚«‚傤‚è‚å‚­
+‚©‚¢‚ª‚¢‚©
+‚ ‚í‚ä‚«
+‚«‚Á‚³‚«
+‚­‚¹
+‚©‚í‚΂½
+‚Ü‚É‚ç
+‚Í‚©
+‚±‚­‚³‚¢
+‚Ù‚²‚µ
+‚¯‚¢‚è‚傤
+‚µ‚傤‚É‚©‚¢
+‚Ü‚Þ‚©‚¢
+‚­‚¤‚®‚ñ
+‚«‚イ‚΂ñ
+‚ß‚½‚Ì[‚é
+‚©‚Æ‚«
+‚¬
+‚¢‚³‚Ý
+‚Æ‚ñ‚µ‚á
+‚µ‚傤‚Ë
+‚³‚Ô‚ñ
+‚ ‚ç‚肦‚«
+‚³‚©‚«
+‚«‚傤‚¢‚­‚µ‚á
+‚æ‚·‚Ý
+‚¢‚¦‚·
+‚Å‚¡‚Ó‚¥‚ñ‚·
+‚Í‚ñ
+‚µ‚á‚Á‚Æ
+‚²‚µ‚傤
+‚·‚¢‚µ‚ñ‚©
+‚‚Â肩‚½
+‚¢‚Ü
+‚‚¤‚µ‚ñ‚à‚¤
+‚Ö‚¢‚Ý‚ñ
+‚Å‚ñ‚µ
+‚¢‚Ù‚ñ
+‚±‚¤‚¨‚ñ
+‚¿‚­‚³‚ñ
+‚®‚¯‚¢
+‚ç‚­‚ª‚¢
+‚©‚ñ‚¹‚¢‚Ђñ
+‚·‚È‚Í‚ç
+‚¿‚¶‚¹‚ñ
+‚¢‚ñ‚·‚¤
+‚«‚ñ‚¶‚傤
+‚͂‚ä‚ß
+‚Ñ‚¤
+‚±‚낵‚ ‚Þ
+‚«‚イ‚¾‚ñ
+‚®‚´‚¢
+‚É‚Á‚Æ
+‚©‚µ‚¾‚¨‚ê
+‚Ó‚µ‚ñ
+‚Ù‚ñ‚Û‚¤
+‚¤‚É
+‚Æ‚µ‚Ü
+‚­‚݂Ђà
+‚µ‚ñ‚肪‚­
+‚ß‚¢‚Ô‚ñ
+‚Ä‚ñ‚Ü‚¹‚ñ
+‚É‚Ù‚ñ‚ª
+‚¢‚½‚ª‚ç‚·
+‚Ý‚«‚è
+‚¬‚²‚­
+‚¿‚イ‚«‚å‚è
+‚Ü‚Á‚Æ
+‚º‚ñ‚³‚¢
+‚µ‚«‚イ‚ª‚­
+‚₹‚ñ
+‚©‚­‚Æ‚¤
+‚¢‚ª‚­‚¯‚¢
+‚µ‚傤‚Æ
+‚Ä‚·‚¤‚è‚傤
+‚Ó‚¤‚ñ
+‚Í‚­‚ß‚¢
+‚¯
+‚¶‚è‚イ
+‚¹‚¢‚¤
+‚Í‚¯
+‚‚¯‚´‚Ü
+‚Ђ¯
+‚Ù‚ñ‚µ
+‚¶‚Á‚¯‚¢
+‚¶‚ã‚ñ‚Õ‚¤
+‚ª‚­‚¹‚Â
+‚Ë‚ñ‚¿‚傤‚µ‚á
+‚½‚Ì‚¤
+‚µ‚傤‚ç‚¢‚¹‚¢
+‚±‚ñ‚¹‚«
+‚ЂƂ²‚Æ
+‚¯‚ñ‚è‚å‚­
+‚²‚é‚Ó
+‚¦‚ñ‚â‚·
+‚É‚ª‚Â
+‚Ђ¾‚è‚«‚«
+‚΂ñ‚»‚¤
+‚܂‚΂₵
+‚ß‚µ
+‚Ù‚Ù
+‚Ú‚¤‚Ç‚¤
+‚Ý‚È‚Ý‚©‚º
+‚Ì‚¤‚Ó
+‚è‚å‚©‚ñ
+‚¨‚Ñ‚Ó‚¤
+‚ ‚Ղ肯[‚µ‚å‚ñ
+‚«‚å‚­‚°‚ñ
+‚­‚¿‚®‚é‚Ü
+‚³‚¢‚µ‚イ‚Ñ‚ñ
+‚Ü‚ñ‚«
+‚Æ‚à
+‚Ó‚¯‚Â
+‚µ‚Á‚±‚¤‚䂤‚æ
+‚܂‚½‚¯
+‚¨‚ñ‚·
+‚æ‚Ñ‚Ý‚¸
+‚¸‚‚¤
+‚µ‚Ü‚®‚É
+‚¶‚ñ‚ë‚­
+‚¤‚æ‚­
+‚«‚ñ‚è‚傤
+‚Ђ¶‚傤‚¶
+‚³‚¨‚¾‚¯
+‚±‚­‚¹‚«
+‚½‚¢‚µ‚イ
+‚Á
+‚°‚¶‚ã‚ñ
+‚©‚µ‚¾‚µ
+‚¨‚È‚¶
+‚‚¤‚ë‚ñ
+‚©‚¾‚ñ
+‚Å‚¡‚·‚¯‚Á‚Æ
+‚΂ñ‚È‚ñ
+‚Ù‚ñ‚Ì‚¤
+‚´‚ñ‚¼‚¤
+‚ä‚«‚³‚«
+‚Ä‚Á‚¿‚á‚ñ
+‚Æ‚è‚¢‚ê
+‚«‚®
+‚ª‚­‚Ô
+‚±‚Á‚©‚­
+‚±‚¤‚݂傤
+‚¾‚¢‚肹‚«
+‚Ó‚ê‚ ‚¢
+‚Ì‚´‚炵
+‚«‚ñ‚É‚­
+‚©‚è‚ß‚ñ
+‚Ì‚¤‚Í
+‚¢‚ñ‚±‚¤‚©
+‚¨‚Ä‚Ü
+‚Ú‚±‚­
+‚Í‚ñ‚Ô‚ñ
+‚΂߂ñ
+‚æ‚­‚Æ‚­
+‚°‚˂‚´‚¢
+‚±‚¤‚í‚ñ
+‚±‚¶‚¢‚ñ
+‚ç‚ñ‚ª‚¢
+‚´‚Á‚©
+‚‚Ô
+‚É‚¢‚Ú‚ñ
+‚µ‚¹‚«
+‚µ‚Ô‚Â
+‚©‚Þ‚Ó‚ç[‚¶‚ã
+‚¼‚­‚Ù‚¤
+‚³‚È‚¬
+‚«‚傤‚¼‚¤
+‚±‚ñ‚Õ‚ê‚Á‚³
+‚¨‚â
+‚¢‚Ó‚¤
+‚µ‚¢‚½‚¯
+‚Ç‚¤‚¿‚傤
+‚µ‚Ⴖ
+‚Ì‚¸‚é
+‚«‚½‚Ü‚¿
+‚䂤‚Ð
+‚¢‚Á‚©‚­‚¹‚ñ‚«‚ñ
+‚¯‚Á‚±‚ñ‚µ‚«
+‚«‚傤‚»‚¤‚«‚å‚­
+‚â‚Á‚«‚å‚­
+‚¿‚¥‚·
+‚·‚¢‚Ç‚¤
+ĥ
+‚킲‚Þ
+‚«‚½‚®‚É
+‚µ‚¶‚傤
+‚³‚­‚ç‚ß‚ñ‚Æ
+‚Ä‚ñ‚à‚ñ‚¾‚¢
+‚¹‚¢‚¿‚傤
+‚ ‚Ü‚½
+‚«‚á‚­‚µ‚á
+‚«‚ñ‚¬‚ñ
+‚Þ‚©‚µ
+‚½‚ñ‚Ü‚Â
+‚è‚­‚肦[‚µ‚å‚ñ
+‚¢‚¿‚¼‚ñ
+‚³‚µ‚Ý
+‚±‚¤‚Ý
+‚±‚Ü‚­
+‚µ‚傾‚¢
+‚µ‚ç‚«
+‚º‚ñ‚è‚傤
+‚©‚¢‚³‚¢‚¿
+‚µ‚傤‚Ђñ
+‚»‚ñ‚Ò
+‚Ó‚«‚イ‚΂ñ
+‚É‚ñ‚¬‚å
+‚¨‚­‚т傤
+‚©‚Á‚»‚¤‚ë
+‚«‚ñ‚¼‚­
+‚Ê
+‚­‚³‚킯
+‚±‚¤
+‚Ç‚¤‚¢‚µ‚å
+‚¾‚µ‚à‚Ì
+‚µ‚ã‚Í‚ñ
+‚è‚è[‚·
+‚æ‚Í‚­
+‚Õ‚ê‚Í‚Ô
+‚¿‚Ⴊ‚µ
+‚¢‚è‚®‚¿
+‚°‚ñ‚ ‚ñ
+‚¨‚è
+‚µ‚®‚È‚é
+‚Í‚µ‚ã‚‚¶‚å
+‚¤‚¥‚¢‚Æ
+‚¢‚Á‚Ø‚ñ
+‚Ý‚¿‚¶‚ã‚ñ
+‚µ‚ñ‚©‚ñ‚¹‚ñ
+‚¶‚イ‚©
+‚©‚Á‚Õ
+‚悤‚¿‚イ‚¢
+‚ë‚ñ‚Ä‚ñ
+‚Í‚©‚­
+‚悤‚µ‚«
+‚Æ‚ç‚ׂé
+‚ê‚ñ‚Û‚¤
+‚¦‚®‚º‚­‚Ä‚¡‚Ô
+‚©‚Í‚ñ‚µ‚ñ
+‚Ô‚ñ‚ß‚ñ
+‚»‚¤‚±‚¤‚µ‚á
+‚Ñ‚Ä‚ñ
+‚·‚­‚è‚ã[
+‚ׂÁ‚Û‚¤
+‚Ó‚­‚µ‚ザ
+‚Ђµ‚Ⴝ‚¢
+‚΂ñ‚Ô‚Â
+‚¾‚ß
+‚¨[‚È[
+‚¶‚傤‚Ç‚¤
+‚±‚­‚±‚¤‚è‚Â
+‚­‚肦‚¢‚Æ
+‚Ë‚ñ‚µ‚傤
+‚ß‚¢‚à‚ñ‚±‚¤
+‚ß‚¢‚³‚¢‚µ‚å
+‚±‚í‚¢‚ë
+‚±‚ª‚ç
+‚·‚¸
+‚È‚ª‚µ‚¾‚¢
+‚䂤‚¾‚ñ
+‚Ý‚à‚Ì
+‚½‚½‚«‚¾‚¢
+‚݂傤
+‚Í‚©‚Î
+‚¦‚¢‚¶
+‚³‚ç‚¢‚Ë‚ñ
+‚¹‚¢‚³‚ñ‚´‚¢
+‚Ñ‚ß‚¢
+‚¶‚傤‚©‚­
+‚¢‚¿‚å
+‚Ý‚â‚°
+‚¯‚Á‚±‚¤
+‚Ò[‚Õ‚é
+‚΂ꂢ‚µ‚å
+‚ ‚Ý‚Ç
+‚²‚±‚¤‚µ
+‚½‚µ‚ã‚Ý
+‚Ä‚ñ‚½‚¢
+‚«‚ñ‚낤‚Ô
+‚Ђǂè
+‚ ‚邲‚肸‚Þ
+‚©‚Ý‚¢‚ê
+‚Í‚¶
+‚Õ‚ë‚Ò‚ê‚ñ
+‚¢‚¿‚Ô‚Ô‚ñ
+‚Ú‚¤‚Ë‚ñ‚©‚¢
+‚Ó‚Æ‚ñ
+‚ЂÂß
+‚©‚悤‚Ñ
+‚±‚Ì‚ ‚¢‚¾
+‚©‚¯‚ ‚¢
+‚â‚Æ‚¢
+‚º‚¢‚Ñ‚«‚Ü‚¦
+‚ ‚é‚«‚ß‚Å‚·
+‚è‚Û[‚½[
+‚µ‚ã‚Ñ
+‚±‚¤‚Í
+‚Ђ«‚Å‚à‚Ì
+‚¢‚¦‚ª‚ç
+‚µ‚å‚­‚Ý‚ñ‚¿
+‚Ó
+‚½‚ñ‚®‚·‚Ä‚ñ
+‚«‚¿‚ê‚¢
+‚«‚ã[‚Î
+‚ß[‚Æ‚é
+‚¿‚傤‚¢
+‚ª‚²‚¤
+‚Í‚Á‚µ‚傤‚¿
+‚₵‚ë
+‚¿‚傤‚µ‚イ
+‚æ‚‚©‚Ç
+‚µ‚傤‚Ú‚¤
+‚­‚肳‚°
+‚¢‚¿‚°‚«
+‚¦‚¢‚æ
+‚‚¶‚Ç‚¤
+‚«‚å‚«‚傶‚‚¶‚Â
+‚΂¢‚â‚­‚¸‚Ý
+‚ׂñ‚ç‚ñ
+‚¿‚傤‚±‚¤
+‚ß‚´‚Ü‚µ
+‚Ђ낢‚ñ
+‚©‚½
+‚Ñ‚¶‚ñ
+‚Ú‚ñ‚¯‚¢
+‚Ë[‚Þ
+‚ЂÁ‚³‚Â
+‚¿‚å‚Á‚©
+‚¢‚킵‚Ý‚¸
+‚©‚½‚ß‚ñ
+‚µ‚ª‚ê‚Á‚Æ
+‚²‚à‚­
+‚È‚ª‚»‚Å
+‚Þ‚ß‚ñ‚«‚å
+‚Ì‚ë‚Ü
+‚¹‚¢‚©‚­
+‚¶‚傤‚Æ‚¤
+‚©‚ª‚Ý‚¢‚µ
+‚Ó‚Ö‚¢
+‚Ô‚ ‚¢‚¹‚¢
+‚¹‚ñ‚è‚á‚­
+‚³‚¢‚°‚ñ
+‚µ‚傤‚¦‚ñ
+‚É‚­‚µ‚Ý
+‚©‚¢‚ª‚ñ
+‚Æ‚Ñ
+‚Ê‚©‚è
+‚µ‚イ‚Í‚Â
+‚킵‚«
+‚è‚­‚¿
+‚ڂ‚²
+‚Ђ³‚µ‚Ô‚è
+‚Ђñ‚Ç
+‚µ‚ñ‚µ‚å
+‚܂‚¦‚¢
+‚¢‚¨‚ñ
+‚±‚ñ‚ׂ 
+‚Í‚¦
+‚ê‚Á‚Ç
+‚¶‚ß‚ñ
+‚ ‚ñ‚à‚É‚ 
+‚Í‚­‚¿‚イ
+‚¢‚Æ‚±
+‚¹‚¢‚Ú
+‚½‚ª‚­
+‚µ‚¿‚悤
+‚°‚ñ‚¶‚傤
+‚Ù‚µ‚傤‚«‚ñ
+‚­‚è‚¢‚ê
+‚Ù‚ñ‚Æ
+‚Ï‚É‚Á‚­
+‚è‚ñ‚²‚­
+‚ނ‚¤
+‚Ý‚¸‚Æ‚è
+‚©‚«
+‚¬‚ê‚¢
+‚Ì‚¤‚Ü‚­
+‚䂤‚Ú‚­
+‚Âí‚ñ
+‚°‚ñ‚¶‚イ‚Ý‚ñ
+‚©‚¢‚ª‚¢‚Ô
+‚¦‚ñ‚¹‚¢
+‚ЂƂȂÝ
+‚©‚ñ‚Æ‚¤
+‚΂´[
+‚·‚È
+‚¯‚‚ɂ­
+‚±[‚Å‚¡‚ñ‚®
+‚‚¤‚µ‚ñ‚©
+‚‚¬‚‚¬
+‚ê‚Á‚Æ‚¤‚¹‚¢
+‚½‚ñ‚¶‚傤‚Ñ
+‚»‚¤‚©‚ñ‚²‚¤
+‚½‚¢‚µ‚å
+‚ª‚ñ‚©‚¢
+‚Ô‚ñ‚³‚¢
+‚Ö‚¢‚Ù‚¤
+‚·‚¢‚¬‚ñ
+‚Ä‚¢‚Æ
+‚µ‚イ‚Ü‚­
+‚ª‚©‚è
+‚é
+‚¤‚Í
+‚¹‚¢‚³‚ñ
+‚±‚ñ‚³‚¢
+‚ß‚É‚ã[
+‚µ‚傤‚³
+‚ׂÁ‚µ‚ã
+‚Ô‚Ñ‚«
+‚Ý‚ñ‚µ‚サ‚ガ
+‚Ђɂ­
+‚¦‚ñ‚΂ñ
+‚«‚å‚­‚¹‚ñ
+‚©‚¯‚ß
+‚®‚¿
+‚µ‚å‚䂤‚µ‚á
+‚·‚Þ[‚·
+‚µ‚ñ‚«‚ë‚­
+‚¶‚傤‚ ‚¢
+‚Ù‚Á‚«‚å‚­‚©‚¢
+‚¿‚イ‚Ô‚ñ‚é‚¢
+‚©‚ñ‚±‚¤
+‚䂤‚¶‚ñ
+‚¬‚å‚®‚ñ
+‚Ђ¾‚è‚Ä
+‚Ú‚¤‚¤
+‚µ‚á‚Ý‚¹‚ñ
+‚©‚¢‚µ‚á
+‚½‚¢‚悤
+‚«‚Ô‚Â
+‚©‚­‚¿
+‚µ‚ã‚à‚­
+‚Þ‚·‚¤
+‚낵‚ñ
+‚Ó‚¤‚è‚イ
+‚Ô‚ñ‚µ‚å‚©
+‚³‚°‚ñ
+‚¾‚¢‚±‚ñ
+‚æ‚Ñ‚©‚¯
+‚Ä‚¢‚è‚傤
+‚±‚¤‚³‚¢‚©‚¢
+‚¹‚¢‚т傤
+‚¦
+‚¶‚ñ‚¤
+‚Ђ傤‚³‚Â
+‚Ü‚¢
+‚Â
+‚Ú‚¤‚è‚å‚­
+‚Âڂ¤
+‚©‚µ‚¨‚Þ‚Â
+‚Û‚Ò‚ã‚ç[
+‚æ‚´‚¢
+‚¹‚ñ‚µ‚å‚­
+‚Ô‚¶‚ñ
+‚µ‚ñ‚É‚Ù‚ñ
+‚¢‚¿‚à‚ñ‚¢‚Á‚Æ‚¤
+‚½‚°‚¢
+‚È‚³‚¯
+‚»‚¤‚ç‚ñ
+‚¿‚傤‚¶‚­
+‚Ç‚­‚º‚ñ
+‚¹‚ë‚Í‚ñ
+‚Æ‚¤‚¢
+‚Ý‚¬‚ª‚í
+‚±‚¶‚傤
+‚Ð
+‚ª‚ñ‚Ò
+‚µ‚ñ‚«‚ñ‚©‚ñ
+‚ЂȂ½
+‚Ó‚¥‚ë[
+‚·‚Ò‚è‚Á‚Æ
+‚¾‚ê‚©
+‚µ‚Ô
+‚¿‚Ù‚¤‚µ
+‚ª‚¢‚µ‚傤‚©
+‚±‚¤‚¶‚Ô
+‚ӂ‚¤‚µ‚á
+‚‚È
+‚²‚¤‚©
+‚ׂ¢
+‚¿‚µ
+‚䂤‚è
+‚µ‚Á‚Û
+‚è‚­‚Â
+‚©‚Ô‚µ‚«
+‚è‚イ‚Ú‚­
+‚è‚傤‚Î
+‚«‚ÂÈ
+‚ß‚¢‚¨‚¤‚¹‚¢
+‚Ó‚Ÿ‚Ý‚è‚ 
+‚±‚ä‚Ñ
+‚µ‚«‚傤‚Ђñ
+‚­‚³‚Ü‚­‚ç
+‚µ‚傤‚ª‚¢‚ª‚©‚è
+‚±‚¤‚肵‚傤
+‚¶‚傳‚¢
+‚©‚­‚³
+‚½‚ñ‚±‚¤‚Ú‚ñ
+‚è‚Ó‚Æ
+‚¹‚¨‚Æ
+ƒA
+‚Ý‚ñ‚µ‚イ
+‚«‚á‚­‚è‚å‚­
+‚¦‚ñ‚Æ‚è[
+‚²‚Í‚ñ‚Ú‚¤
+‚Ç‚¤‚È‚¢
+‚µ‚傤‚Ú‚¤‚µ‚á
+‚©‚Á‚½‚Â
+‚ë‚Ü‚ñ
+‚µ‚傤‚³‚Á‚µ
+‚ê‚ñ‚½‚¢
+‚¶‚ã‚ñ‚ê‚Â
+‚ä‚Ë‚·‚±
+‚¤‚«‚­‚³
+‚ ‚È
+‚­‚é‚Ü‚¾‚¢
+‚Ç‚¤‚µ‚á
+‚«‚©‚­
+‚Ù‚í‚¢‚Æ
+‚Ý‚¸‚©‚¯‚ë‚ñ
+‚낤‚Ó
+‚ª‚¢‚¹‚ñ
+‚ ‚¢‚¶‚ñ
+‚±‚¤‚±‚­‚ª‚©‚è
+‚µ‚ñ‚Û‚¤
+‚¨‚ñ‚¢‚«
+‚±‚«‚´‚Ý
+‚¢‚à‚Ì
+‚©‚è‚傤
+‚ ‚©‚‚«
+‚©‚è‚Î
+‚䂤‚©‚ñ
+‚Í‚µ‚²
+‚Ó‚¤‚è‚ñ
+‚²‚©‚¼‚­
+‚Ó‚¤‚¹‚ñ
+‚悤‚¾‚¢
+‚ë‚­‚µ‚傤
+‚à‚¿‚«
+‚Ù‚Æ‚ñ‚Ç
+‚ӂ邬
+‚Ç‚ ‚¢
+‚º‚¢‚Ñ‚«
+‚Ü‚¢‚©‚¢
+‚Ù‚·‚Æ
+‚ ‚Ƃ̂܂‚è
+‚‚̂©‚­‚µ
+‚Ý‚Ì‚Þ‚µ
+‚ç‚¢‚©
+‚¤‚Ô
+‚­‚¸‚à‚Ì
+‚Ö‚¢‚Ô‚ñ
+‚µ‚è‚å
+‚·‚¯‚¶‚ã[‚é
+‚Í‚¢‚Æ‚¤‚è‚Â
+‚¨‚¤‚Ô‚ñ
+‚¹‚è[‚®
+‚¾‚­‚·‚¢
+‚Ü‚Ç
+‚«‚È‚±
+‚¨‚¤‚µ‚傤
+‚©‚ñ‚³‚Ô
+‚Í‚ñ‚Î
+‚µ‚ñ‚µ‚ã‚‚«‚Ú‚Â
+‚¢‚È‚¸‚Ü
+‚Ç‚¶
+‚¤‚Ë‚Ñ
+‚±‚¤‚悤
+‚È‚ñ‚±
+‚©‚¢‚¯‚¢‚©
+‚Ä‚Á‚±‚Â
+‚ ‚¢‚«‚傤
+‚¤‚·
+‚¹‚Á‚­
+‚»‚¶
+‚µ‚イ‚¹‚ñ
+‚Ü[‚¯‚Á‚Æ
+‚Ý‚¸‚µ‚傤‚΂¢
+‚¨‚¤‚悤‚è‚å‚­
+‚µ‚é‚­‚ë[‚Ç
+‚»‚ñ‚ß‚¢
+‚Å‚Ó‚ê
+‚Ñ‚±‚¤
+‚ª‚¢‚¶‚ã
+‚¿‚¢‚«
+‚©‚­‚©‚¢
+‚«‚Ú‚¤‚µ‚á
+‚¿‚ñ‚½‚¢‚µ‚á‚­
+‚±‚É‚ñ‚¸‚¤
+‚»‚¤‚µ‚イ‚Ö‚ñ
+‚Ü‚È‚Å‚µ
+‚ß‚ª‚Ý
+‚Ô‚ñ‚¯‚ñ
+‚½
+‚Æ‚ñ‚â
+‚ꂶ‚·‚½[
+‚½‚¢‚Í‚ñ
+‚à‚¤‚¶‚á
+‚¾‚¢‚½‚·‚¤
+‚«‚ñ‚´‚ñ
+‚Ü‚é‚¿
+‚Ý‚¿‚Ð
+‚½‚¢‚ª‚ñ
+‚¿‚Ç‚è‚ ‚µ
+‚Ë‚Á‚«
+‚©‚ñ‚ª‚¢‚Þ‚è‚傤
+‚ê‚¢‚¶‚ñ
+‚Ù‚ñ‚½‚­
+‚·‚¢‚³‚ñ‚©‚Ô‚Â
+‚¿‚å‚­‚ê‚Â
+‚¯‚¢‚肪‚©‚è
+‚Ó‚­‚Â
+‚Ó‚Æ‚ß
+‚Ø[‚¶
+‚Ó‚µ‚¬
+‚ë‚­‚¨‚ñ‚«
+‚Ù‚µ‚ク‚¢
+‚Ü‚µ[‚ñ
+‚µ‚ñ‚¯‚ñ
+‚¨‚¨‚¾‚¢
+‚¬‚傦‚ñ
+‚è‚ñ‚¿‚傤
+‚»[‚ç[
+‚«‚Æ
+‚©‚Ô‚ç
+‚¿‚¢‚«‚³
+‚Ñ‚ñ
+‚悤‚¿‚¦‚ñ
+‚¾‚¢‚½‚¢
+‚¹‚ñ‚Å‚ñ
+ƒd
+‚±‚­‚³‚¢‚©‚ñ
+‚¹‚¢‚¶‚ñ‚т傤
+‚ß‚ñ‚©
+‚µ‚¯
+‚ä‚ ‚©
+‚Ó‚Ç‚¤‚³‚ñ
+‚ق邾
+‚¢‚«‚©‚¢
+‚©‚ñ‚΂Â
+‚Í‚à‚ñ
+‚»‚‚¬‚傤‚µ‚«
+‚±‚ñ‚µ‚ã‚ñ
+‚æ[‚®‚é‚Æ
+‚©‚­‚Í
+‚¨‚ñ‚·‚¢‚«
+‚Ó‚­‚è
+‚¢‚Á‚µ‚ñ‚¶‚傤
+‚½‚¢‚©‚ñ
+‚±‚­‚Þ
+‚µ‚낽‚¦
+‚«‚Ç‚è
+‚ЂƂ±‚¦
+Ġ
+‚悤
+‚¿‚イ‚µ‚傤‚«‚¬
+‚Í‚ç‚ñ‚΂ñ‚¶‚傤
+‚®‚ç‚Ó‚¡‚Á‚­
+‚µ‚à‚´
+‚Ä‚ñ‚Ï‚ñ
+‚°‚ñ‚¨‚¤
+‚ê‚ñ‚½‚¢‚µ
+‚¿‚ã[‚è‚Á‚Õ
+‚Ô‚ñ‚è
+‚²‚ß‚¢‚í‚­
+‚ß‚¢‚¬‚É‚ñ
+‚ ‚³‚‚ä
+‚µ‚Ñ‚è‚ ‚ñ
+‚í‚è‚Ñ‚«‚¯‚ñ
+‚Å‚ñ‚½‚­
+‚¶‚å[‚­
+‚Ñ‚ª‚ñ
+‚¨‚¨‚ ‚ß
+‚Ù[‚ñ
+‚Ù‚ñ‚¬‚Ü‚è
+‚¿‚å
+‚¢‚½‚΂³‚Ý
+‚ӂ‚¬‚傤
+‚©‚í‚®‚¿
+‚ß‚¾‚Ü
+‚¦‚¢‚ׂ¢
+‚Ó‚®‚ ‚¢
+‚¼‚¤‚«‚ñ
+‚Ô‚ñ‚Ò‚Ô‚Â
+‚¹‚¢‚â‚­
+‚Ô‚ñ‚ç‚­
+‚¿‚ñ‚¿‚á‚­
+‚©‚ñ‚Ô‚Â
+‚Ö‚ñ‚¤‚ñ
+‚µ‚ª‚¢‚¹‚ñ
+‚¿‚イ‚º‚¢
+‚ª‚Á‚±‚¤‚Ù‚¤‚¶‚ñ
+‚¹‚‚è
+‚Ù‚ñ‚µ‚傤
+‚µ‚イ‚Æ
+‚Ì‚«
+‚¤‚»‚­
+‚¢‚ñ‚¿‚傤
+‚¤‚肱‚Ý
+‚©‚ñ‚è‚イ
+‚±‚à‚ê‚Ñ
+‚¨‚¨‚­
+‚½‚¢‚Ä‚ñ
+‚©‚­‚µ‚å
+‚¿‚傤‚¨‚ñ‚Ï
+‚«‚å‚·‚¤
+‚ׂñ‚è‚â
+‚â‚Ü‚¨‚­
+‚©‚ñ‚³‚µ‚Â
+‚«‚ñ‚¹‚«
+‚µ‚¿‚¸‚ñ
+‚¯‚ñ‚È‚ñ
+‚Å‚¡[‚º‚é
+‚©‚ñ‚¶‚傤‚©‚à‚­
+‚ ‚ñ‚¿
+‚°‚¢‚¶‚ã‚Â
+‚µ‚イ‚â
+‚Í‚É[
+‚Ђµ
+‚¨‚Ä‚·‚¤
+‚·‚ª‚½‚Ý
+‚±‚Æ‚µ
+‚Ђ傤‚¶‚ã‚ñ
+‚µ‚á‚ß‚ñ
+‚Ђª‚µ‚µ‚È‚©‚¢
+‚½‚¢‚ª[
+‚ׂñ‚³‚¢
+‚½‚Ä‚¶‚Ü
+‚¬‚ñ‚¢‚ë
+‚³‚ñ‚ª‚©‚è
+‚Ó[‚ª
+‚³‚¢‚±‚­
+‚±‚¤‚È‚¢‚¦‚ñ
+‚Ђ‚¶‚ã
+‚Ë‚ñ‚ׂÂ
+‚µ‚¢‚ê
+‚µ‚Þ‚¯
+‚¦‚µ‚«
+‚炤‚ñ‚Ç
+‚Þ[‚ñ
+‚«‚©‚­‚«‚å‚­
+‚͂₹
+‚¿‚傤‚Ö‚ñ
+‚µ‚邦‚Á‚Æ
+‚Ö‚«‚©‚¢
+‚¾‚¢‚³‚ñ‚©
+‚ß‚¢‚É‚¿
+‚½‚ê‚Ü‚­
+‚¾‚ñ‚Õ
+‚¹‚«‚¶‚Â
+‚©‚¢‚·‚¢
+‚¶‚ñ‚½‚¢
+‚Í‚ñ‚¹‚ñ
+‚­‚¤‚Ó‚­
+‚Í‚¢‚Ù‚¤
+‚«‚傤‚¶
+‚µ‚é‚­
+‚µ‚å‚Á‚Õ
+‚µ‚肤‚Ü
+‚ä‚É[‚­
+‚³‚ñ‚΂ñ
+‚Ý‚ª‚í‚è
+‚¨‚¨‚â‚Ü
+‚낤‚«‚«‚å‚­
+‚¬‚®‚ñ
+‚È‚¢‚ñ
+‚½‚¢‚µ‚á
+‚¨‚¢‚¤‚¿
+‚¯‚ñ‚º‚ñ
+‚µ‚‚Ç
+‚¦‚Ñ‚·
+‚Ý‚¸‚Ђ«
+‚₨‚à‚Ä
+‚Å‚ñ‚Ç‚¤‚è‚Â
+‚Ý‚ä‚«
+‚ß‚¢‚¶‚ñ
+‚½‚¢‚è‚å‚­
+‚Ö‚ñ‚¶‚á
+‚½‚Ë‚¢‚à
+‚È‚¢‚±‚­
+‚±‚­‚³‚ñ‚«
+‚²‚ç‚¢‚±‚¤
+‚Í‚ñ‚à‚Æ
+‚µ‚É‚ª‚¨
+‚Þ‚·‚±
+‚¦‚ñ‚´‚ñ‚µ
+‚ª‚¢‚è‚á‚­
+‚±‚ñ‚Å‚¡‚µ‚å‚ñ
+‚µ‚傼‚ñ
+‚¹‚‚ë‚ñ
+‚낤‚»‚­
+‚µ‚傤‚¯‚ñ
+‚à‚ñ‚©‚¹‚¢
+‚¿‚ã[‚ñ
+‚¶‚イ‚µ‚å‚ë‚­
+‚Ö‚¢‚¢
+‚±‚¤‚µ‚ñ
+‚è‚­‚®‚ñ
+‚‚è‚Ú‚è
+‚Ђ«‚ ‚¢
+‚©‚ñ‚©‚­
+‚ӂ肱‚Ý‚³‚«
+‚­‚肱‚µ‚«‚ñ
+‚µ‚ã
+‚»‚Æ‚Ì‚è
+‚È‚¢‚¢‚ñ
+‚¾‚ñ‚ß‚ñ‚¸
+‚«‚傤‚µ‚å
+‚¯‚¢‚â‚­‚ª‚¢
+‚©‚ñ‚è‚傤‚Ä‚«
+‚¿‚¿‚¨‚â
+‚µ‚Ⴞ‚ñ‚Ù‚¤‚¶‚ñ
+‚Í‚¢‚Å‚ñ‚΂ñ
+‚í[‚ǂՂ낹‚Á‚³
+‚«‚¯
+‚à‚­‚Î
+‚µ‚Ⴕ‚ñ‚«
+‚悤‚낤‚¢‚ñ
+‚炪‚ñ
+‚Ä‚ñ‚­‚¤
+‚Æ‚¤‚³‚ñ
+‚½‚¢‚¯‚ñ‚µ‚á
+‚©‚«‚イ‚¹‚¢
+‚Ђ³‚¢
+‚¤‚炪‚í
+‚¦‚ñ‚悤
+‚°‚ñ‚©
+‚«‚Á‚µ‚傤
+‚Ђ·‚¢
+‚ӂ䂤
+‚Ê‚·‚Ñ‚Æ
+‚¬‚傤‚Þ‚«‚å‚­
+‚µ‚Ù‚¤‚µ‚債
+‚Ç‚ñ‚‚¤
+‚Æ‚¤‚«‚Ú
+‚±‚¯
+‚º‚Á‚½‚¢‚¿
+‚²‚¤‚ª‚¢
+‚Ù‚­‚Ù‚­‚¹‚¢
+‚µ‚ñ‚ɂイ‚ª‚­
+‚±‚¾‚Ü
+‚¹‚«‚Þ
+‚²‚¤‚Ó‚­
+‚¢‚¿‚΂ñ
+‚í‚è‚´‚ñ
+‚ ‚ß‚à‚悤
+‚Ä‚Ô‚è
+‚º‚ñ‚¹‚¢‚«
+‚Í‚Ü‚×
+‚»‚­‚ß‚ñ
+‚½‚ñ‚·‚¤
+‚Ó‚¢‚ñ
+‚µ‚ñ‚Ó‚º‚ñ
+‚¹‚ñ‚¦‚ñ
+‚ß‚¶‚è
+‚ß[‚«‚á‚Á‚Õ
+‚í‚ê‚ç
+‚¤‚Å‚Ü‚¦
+‚肯‚ñ
+‚Ç‚¤‚Ô‚ñ
+‚Í‚â‚Æ
+‚¦‚ñ‚ª‚í
+‚Ù‚¤‚µ‚å
+‚¢‚ª
+‚³‚ñ‚¿‚イ
+‚¿‚Ì‚¤
+‚«‚è‚å‚­
+‚Ђӂ­
+‚ނ炳‚ß
+‚¿‚á‚è‚Ä‚¡[
+‚Ä‚«‚É‚ñ‚µ‚á
+‚µ‚á‚­‚Ç‚¤
+‚¶‚ñ‚¯‚ñ‚Ð
+‚·‚¢‚¨‚ñ
+‚È‚ñ
+‚¤‚¢‚´‚ñ
+‚Ý[‚é
+‚è‚ë
+‚¶‚イ‚Ý‚ñ‚©
+‚Ђí
+‚ ‚µ‚±‚µ
+‚Þ‚¢‚©
+‚Ù‚ñ‚¬‚傤
+‚Ó‚©‚ñ‚º‚ñ
+‚è‚å‚Ð
+‚낤‚µ‚傤
+‚悤‚ë‚­
+‚¹‚¢‚³‚¢
+‚¯‚¢‚Ђñ
+‚²‚¿‚Á‚­
+‚ª‚΂ñ
+‚³‚Æ‚²
+‚©‚·‚ª
+‚Ù‚¨
+‚Ƃ肵‚Ü‚è‚â‚­
+‚Ó‚ñ‚½‚ñ
+‚±‚¤‚±
+‚©‚Ô‚¯‚ñ
+‚Æ‚µ‚å‚©‚ñ
+‚æ‚é
+‚¢‚­‚Ç
+‚©‚¢‚Ö‚¢
+‚悤‚©
+‚Ä‚«‚³‚·
+‚Ó‚Á‚­
+‚±‚¿
+‚µ‚«‚ñ
+‚à‚¶‚ê‚Â
+‚«‚Á‚­
+‚¯‚ñ‚¤‚ñ
+‚ ‚ׂɂã[
+‚悤‚è‚傤
+‚‚Ë
+‚±‚¤‚«‚µ‚ñ
+‚­‚¿
+‚ª‚­‚Ô‚¿‚傤
+‚±‚¤‚µ‚イ‚Í
+‚¢‚Á‚҂傤
+‚»‚¤‚è‚å
+‚½‚Ü‚µ‚¢
+‚¶‚å‚Ô
+‚ç‚¢‚µ‚ñ
+‚Ù‚ñ‚è‚傤
+‚¾‚¢‚µ‚«‚イ
+‚¢‚µ‚«‚Ä‚«
+‚䂤‚«‚イ
+‚ê‚¢‚«
+‚¶‚ñ‚¹‚«
+‚µ‚傯‚¢‚Ð
+‚Ó‚«‚Å‚à‚Ì
+‚¶‚ñ‚¶‚©
+‚тЂñ
+‚µ‚ã‚­‚¸
+‚Ü
+‚¢‚Á‚©‚¢
+‚©‚µ
+‚¶‚ñ‚´‚¢
+‚Ó‚ç‚®
+‚Å‚¡‚¶‚½‚é
+‚Ù‚ç‚ ‚È
+‚µ‚á‚­‚Ü
+‚²‚ª‚ñ
+‚Ђ̂«
+‚«‚債‚å‚­
+‚ׂñ‚«‚傤‚©
+‚©‚ñ‚¶‚ñ
+‚«‚©‚­‚©
+‚È‚¢‚ß‚ñ
+‚Ó‚½‚è
+‚¹‚¢‚µ‚傤‚Ë‚ñ
+‚悤‚ª‚µ
+‚«‚ñ‚«‚å‚è
+‚è‚傤‚ª‚í
+‚©‚Ä‚¢‚悤
+‚Ƃ낤
+‚³‚ª‚µ‚à‚Ì
+‚µ‚©‚©‚è‚Ђñ
+‚Ñ‚´
+‚ä‚¢‚Ô‚Â
+‚¯‚¢‚¹‚Â
+‚±‚­‚º‚¢
+‚Ù‚¤‚µ‚å‚­‚Ä‚ñ
+‚䂤‚Æ‚¤
+‚т傤‚Ö‚«
+‚¨‚ñ‚¶‚ñ
+‚â‚­‚Ñ
+‚Ђñ‚«‚á‚­
+‚Ù[‚­
+‚º‚Á‚Æ
+‚¿‚イ‚É‚©‚¢
+‚Ô‚ñ‚µ‚Â
+‚µ‚ñ‚µ
+‚ [‚¯[‚Ç
+‚₯‚ñ
+‚©‚¢‚«‚¹‚ñ
+‚Ö‚ñ‚°‚ñ
+‚â‚Æ‚¢‚É‚ñ
+‚µ‚傶‚ã‚ñ
+‚º‚‚Þ
+‚Þ‚¾‚®‚¿
+‚±‚Ñ‚«
+‚«‚¢
+‚³‚ñ‚¾‚ñ‚ë‚ñ‚Û‚¤
+‚à‚è
+‚»‚Æ‚Ü‚²
+‚¶‚Ë‚Â
+‚Ó‚ä‚Î
+‚©‚´‚µ‚à
+‚¤‚Ü‚ê‚‚«
+‚·‚¢‚°‚ñ
+‚¢‚Á‚Û
+‚à‚¤‚µ‚±‚Ý
+‚µ‚å‚­‚Þ
+‚ª‚­‚悤‚Ђñ
+‚µ‚イ‚¹‚¢
+‚¿‚­‚´‚¢
+‚­‚Ý‚Í‚ñ
+‚ç‚ñ‚É‚ñ‚®
+‚¹‚¢‚²‚¤
+‚¤‚ñ‚Å‚¢
+‚Ý‚²‚½‚¦
+‚¨‚肦‚ñ‚Ä[‚µ‚å
+‚¿‚Ⴙ‚«
+‚æ‚­‚»‚¤
+‚Ö‚ñ‚µ‚イ‚µ‚á
+‚Ó‚¯‚¢
+‚æ‚ß‚¢
+‚µ‚悤‚è‚Â
+‚ ‚¨‚¸
+‚¸‚Ó
+‚­‚ç‚â‚Ý
+‚µ‚ñ‚´‚ñ
+‚è‚Í[‚³‚é
+‚Ó‚¤‚µ
+‚¨‚¤‚©‚­‚Ü‚­
+‚ׂÁ‚Ç
+‚ç‚Á‚©‚ñ
+‚©‚ñ‚¹‚‚Ă«
+‚½‚¢‚µ‚Â
+‚Ô‚¬
+‚¢‚¿‚®‚ñ
+‚²‚è‚Þ‚¿‚イ
+‚©‚¯‚¸
+‚Þ‚¾
+‚Ý‚ñ‚¶‚ã
+‚Ó‚È‚É
+‚䂤‚Ú‚¤
+‚Ç‚è‚å‚­‚©
+‚©‚¢‚³‚­
+‚½‚¢‚©‚¢
+‚Í‚¤‚·
+‚°‚ñ‚É‚ñ
+‚Ì‚¤‚ª‚­‚©
+‚³‚¢‚µ‚イ‚Ñ
+‚³‚ñ‚©‚ñ‚¨‚¤
+‚Ђ炢‚µ‚ñ
+‚µ‚å‚«‚¿
+‚¿‚á‚¢‚ë
+‚«‚ñ‚Æ‚¤
+‚ç‚¢‚Æ
+‚¯‚Á‚Ï‚­
+‚³‚¶‚«
+‚¤‚Å‚«‚«
+‚¢‚â‚è‚ñ‚®
+‚½‚¢‚¶
+‚è‚Á‚·‚¢
+‚à‚ñ‚µ
+‚µ‚イ‚©‚ñ‚µ
+‚à‚¸
+‚¿‚傤‚낤
+‚·‚à‚Á‚®
+‚Æ‚ñ‚Ë‚é
+‚µ‚ã‚ñ‚悤
+‚±‚¤‚©‚¢‚¼‚¤
+‚«‚΂ñ
+‚¾‚¢‚¿
+‚Å‚¼‚ß
+‚è‚傤‚¢‚ñ‚º‚¢
+‚¿‚悪‚Ý
+‚©‚¢‚®‚ñ
+‚è‚ñ‚±‚¤
+‚Ù‚ë
+‚µ‚イ‚«‚傤‚Ù‚¤
+‚¦‚¢‚Ä‚ñ
+‚«‚イ‚µ‚傤
+‚Ù‚Á‚¯[
+‚Í‚ñ‚³‚¢
+‚¸‚¯‚¢
+‚ç‚¢‚ӂ邶‚イ
+‚Ê‚è‚à‚Ì
+‚µ‚á‚¿‚イ
+‚³‚Á‚«‚å‚­‚©
+‚¾‚¢‚«‚ñ
+‚Æ‚¤‚©‚‚µ‚Â
+‚¦‚Å‚¡‚½
+‚₯
+‚Ù‚©‚ñ
+‚¨‚©‚Á‚Ä
+‚¿‚ñ‚Ï‚ñ‚¶[
+‚â‚­‚µ‚á
+‚µ‚ß
+‚¤‚Ü‚©‚½
+‚Ó‚É‚ñ‚¶‚傤
+‚¬‚傹‚ñ
+‚Ì‚è‚ ‚¢
+‚¢‚¿‚à‚¤‚¾‚¶‚ñ
+‚Ô‚Ô‚ñ
+‚¾‚¢‚¢‚¿
+‚·‚¢‚è‚å‚­
+‚¦‚¢‚©‚­
+‚ꂹ‚Õ‚µ‚å‚ñ
+‚·‚¢‚΂­
+‚Ó‚¶‚Â
+‚ª‚¢‚©‚¢
+‚í‚É‚·
+‚Ñ‚é‚Ü
+‚Ù‚ñ‚¬
+‚Ñ[‚¿
+‚µ‚傤‚Ç
+‚­‚ñ‚±‚¤
+‚Í‚¢‚䂤
+‚µ‚‚¶‚‚²‚¤‚¯‚ñ
+‚¹‚ñ‚­‚µ‚á
+‚È‚ç
+‚µ‚イ‚¿
+‚à‚¤‚±‚ñ
+‚ß‚ñ‚¶‚傤
+‚»‚­‚è‚å‚­
+‚Í‚½‚¯
+‚¤‚炳‚­
+‚ß‚´‚µ
+‚¾‚¢‚¢‚¿‚é‚¢
+‚²‚Ó‚µ‚ñ
+‚±‚­‚è‚‚¾‚¢‚ª‚­
+‚»‚¤‚Þ
+‚¦‚¢‚¬‚傤‚¿‚イ
+‚悶
+‚·‚¢‚°‚ñ‚¿
+‚ ‚µ‚©‚¯
+‚¶‚Ä‚ñ
+‚È‚ñ‚Æ‚¤
+‚Ú‚­‚Ç‚¤
+‚¿‚á‚­‚Í‚Â
+‚©‚«‚¢‚ê‚Ç‚«
+‚т悤
+‚·‚¢‚Ü
+‚®‚½‚¢
+‚±‚¤‚Ë‚ñ‚«
+‚«‚ñ‚¶‚Â
+‚µ‚ñ‚«
+‚®‚ç‚Ñ‚â
+‚Ì‚Ý‚à‚Ì
+‚Æ‚¢‚ê‚Á‚Æ
+‚Ղ肸‚Þ
+‚¨‚Ó‚¡‚·
+‚Ý‚¢‚è
+‚±‚Ê‚Ü
+‚è‚イ‚¹‚ñ‚¯‚¢
+‚à‚Æ‚«‚ñ
+‚½‚Ü‚è‚Î
+‚«‚イ‚µ‚イ
+‚´‚¢‚µ‚Â
+‚ç‚­‚â‚«
+‚Ú‚¤‚Ä‚ñ
+‚Í‚ñ‚Å‚¡
+‚»‚¤‚¾‚¿
+‚²‚¤‚Ç‚¤‚¿‚傤‚µ
+‚ä‚É‚Î[‚³‚é
+‚é‚¢‚¬‚²
+‚²
+‚¢‚Ђñ
+‚Ü‚Ó‚ä
+‚¬‚ñ‚è‚ñ
+‚Ù‚­‚¨‚¤
+‚¹‚ñ‚«‚傤‚µ
+‚¢‚Á‚¹‚ñ
+‚±‚è‚傤‚è
+‚¿‚イ‚±‚¤‚»‚¤
+‚Ö‚ñ‚Ç‚¤‚Ð
+‚낤‚µ‚イ
+‚ۂ낵‚á‚Â
+‚Ö‚ç
+‚¿‚イ‚²‚µ
+‚Ä‚ñ‚¶‚傤
+‚«‚イ‚©
+‚µ‚á‚©‚¢‚ª‚­
+‚»‚¤‚±‚¤
+‚Ý‚¸‚Ù
+‚Ù‚¤‚©‚²
+‚¤‚¥‚¢
+‚¨‚¤‚è‚å‚­
+‚Ù‚³
+‚¬‚ñ‚ª‚Ý
+‚µ‚傤‚°‚«
+‚ê‚ñ‚Ï‚ñ
+‚µ‚ã‚Á‚¿‚傤
+‚¶‚傤‚Ç
+‚©‚¨‚Ý‚µ‚è
+‚Ü‚Ù‚¤‚Ñ‚ñ
+‚¦‚«‚è
+‚¤‚«‚Ý
+‚«‚傤
+‚±‚­‚΂ñ
+‚ê‚Á‚µ‚á
+‚Ô‚ñ‚è‚«
+‚Ý‚©‚¦‚è
+‚©‚´‚Ü
+‚¹‚¢‚È‚ñ
+‚±‚Á‚±‚­
+‚Ü‚­‚ç
+‚µ‚³‚ñ
+‚Æ‚­‚µ‚Â
+‚¹‚ñ‚Ý‚ñ
+‚Æ‚Å‚ñ
+‚»‚¹‚«
+‚¬‚å‚­‚´
+‚Ô‚ñ‚±
+‚³‚ñ‚µ‚å‚­
+‚­‚·‚è
+‚Ý‚È
+‚Þ‚É
+‚¹‚ñ‚¿
+‚¨‚Ô‚¶‚¥
+‚Ä‚¢‚¹‚Â
+‚¹‚¶
+‚ª‚ñ‚¿‚­
+‚ª‚¢‚è‚ñ‚´‚ñ
+‚Õ‚Á‚µ‚ã
+‚ß‚¼‚ñ
+‚µ‚ã‚Ç‚¤
+‚µ‚ñ‚«‚å
+‚Æ‚¤‚±‚ñ
+‚³‚Æ‚Ñ‚Æ
+‚É‚å‚É‚ñ
+‚Ö‚¢‚±‚¤
+‚È‚ñ‚µ‚å‚­
+‚«‚傤‚ª
+‚Ó‚Ñ‚ñ
+‚¿‚肪‚­
+‚Ù‚ñ‚µ‚Â
+‚è‚Á‚Æ‚¤
+‚è‚傤‚Í‚µ
+‚Ï[‚Æ
+‚ç‚­‚¾‚¢‚¹‚¢
+‚µ‚Ì‚Ô
+‚Ë‚Þ‚è
+‚²‚¤‚¼‚­
+‚¼‚¤‚Ó‚­‚«
+‚悤‚è‚å‚­‚»
+‚µ‚ñ‚¹‚³‚¢‚´
+‚Ý‚µ‚ñ
+‚«‚ñ‚­
+‚¿‚イ‚É‚¿
+‚±‚邹‚Á‚Æ
+‚Ý‚¶‚ã‚­‚¶
+‚°‚ñ‚Ç‚¤‚è‚å‚­
+‚±‚¤‚´
+‚©‚炽‚¿
+‚µ‚å‚ß‚¢
+‚°‚ñ‚¶‚ã‚Â
+‚©‚ñ‚Ú‚¤
+‚ ‚Ü‚¿‚ã‚ 
+‚¿‚å[‚­
+‚¤‚ç‚Ü‚¿
+‚ ‚Ü‚Ç‚¢
+‚¿‚ß‚¢‚µ‚傤
+‚×[‚±‚ñ
+‚¨‚¤‚©
+‚Ä‚­‚Ì
+‚¿‚ñ‚¤‚Â
+ƒa
+‚à‚­‚¸
+‚Ù‚¤‚ª‚ñ
+‚Ï‚¢‚Õ‚â‚­
+‚Ñ‚½‚Ý‚ñ
+‚Ó‚Ý‚¾‚¢
+‚Þ‚ª
+‚È‚È‚ß
+‚µ‚ã[‚Æ
+‚¢‚¿‚à‚ñ‚¶
+‚Ä[‚Õ
+‚¦‚ñ‚Ú‚¤
+‚¦‚Ý‚ã‚ê[‚½
+‚·‚¤‚è
+‚‚߂ ‚Æ
+‚ ‚³‚¹
+‚Ñ‚¯‚¢
+‚â‚Á‚Â
+‚«‚á‚­‚¾‚Ë
+‚Æ‚¤‚Ù‚ñ‚Ô
+‚í‚©‚Ä
+‚Æ‚ß‚¨‚«
+‚®‚ñ‚è‚Â
+‚ê‚«‚µ‚¶‚傤
+‚¬‚µ‚å
+‚ê‚«‚ê‚«
+‚²‚¯‚¢
+‚Ó‚¾‚ñ‚¬
+‚·[‚Ï[
+‚â‚­‚·‚¤
+‚Ý‚¾‚µ‚È‚Ý
+‚«‚Á‚«‚傤
+‚µ‚ñ‚ª‚­‚Ô
+‚¢‚Ì‚¿‚Æ‚è
+‚¿‚傤‚Ý‚è‚傤
+‚ê‚¢‚¶‚傤
+‚µ‚ã‚´‚ñ
+‚¦‚¢‚è‚ñ
+ƒ[
+‚Í‚ñ‚·‚¤
+‚º‚Á‚©
+‚¦‚ª‚¨
+‚Ì‚è‚Î
+‚‚«‚æ
+‚Ý‚Â‚Ç‚à‚¦
+‚È‚¢‚³‚¢
+‚Ö‚¢‚¿
+‚¶‚ñ‚¿‚イ
+‚Ô‚ñ‚½‚¢
+‚©‚ñ‚Õ‚¤
+‚Ù‚¤‚³‚ñ
+‚«‚イ‚Æ‚¤
+‚Ù‚¢‚­‚¦‚ñ
+‚ç‚¢‚©‚ñ
+‚Ó‚É‚å‚¢
+‚Ý‚Á‚Â
+‚¢‚È‚²
+‚·‚¤‚¾‚¢
+‚₹‚¢
+‚Ü‚¢‚ ‚³
+‚Í‚à‚Ì
+‚Ó‚Ÿ‚ñ
+‚¹‚ñ‚¢‚ñ
+‚©‚­‚Ë‚ñ
+‚ ‚ñ‚¸
+‚É‚¿‚â
+‚³‚¢‚Ý‚ñ‚¶‚ã‚Â
+‚²‚Ä‚ñ
+‚«‚å‚­‚°‚¢
+‚©‚낤
+‚µ[‚ñ
+‚«‚債‚傤
+‚³‚ñ‚°‚«
+‚±‚¤‚«‚Ì‚¤
+‚Ô‚ñ‚ª‚­‚©
+‚Å
+‚©‚ñ‚±‚‚¾‚Á‚½‚¢
+‚¶‚ñ‚ ‚¢
+‚²‚¢‚Á‚Æ‚¤‚³‚Ü
+‚Ù‚ñ‚·‚¶
+‚æ‚Æ‚¤
+‚¾‚ñ‚«
+‚±‚¤‚ª‚­‚Ô
+‚¶‚å‚Ç‚¤‚µ
+‚Ƃ΂­
+‚¨‚­‚è‚Ê‚µ
+‚т傤‚°‚ñ‚½‚¢
+‚±‚ñ‚¹‚¢‚«
+‚Ö‚¢‚ß‚ñ‚¸
+‚à‚¤‚Å
+‚Í‚­‚Æ‚¤
+‚µ‚â‚­‚µ‚å
+‚Þ‚µ‚ë
+‚¦‚ñ‚©‚Â
+‚½‚‚¢
+‚µ‚傤‚Ђ´‚¢
+‚­‚낱‚°
+‚«‚傤‚Ù‚¤
+‚ß‚¢‚à‚ñ
+‚¶‚ñ‚¹‚¢‚ë‚ñ
+‚¯‚¢‚Î
+‚肸‚Þ
+‚«‚傤‚‚¤‚²
+‚Æ‚£[
+‚µ‚ã‚ñ
+‚Ü‚ñ‚¼‚­
+‚¶‚¿‚å
+‚µ‚Ñ‚ 
+‚Ü‚¢‚é
+‚³‚­‚µ‚ã‚ñ
+‚Ñ‚é
+‚µ‚傤‚¬‚傤
+‚‚¤‚»‚­
+‚Ö‚½
+‚µ‚å‚Á‚Æ
+‚³‚«‚à‚Ì
+‚¨‚¤‚Ú‚¤
+‚¶‚¥‚Ë‚ê[‚½
+‚µ‚イ‚Ú‚¤
+‚낲
+‚Æ‚Á‚«‚傪‚©‚è
+‚¤‚ñ‚¿‚ñ
+‚°‚ñ‚Ô‚ª‚ñ
+‚±‚²‚¤
+‚¹‚¢‚¼‚¤‚à‚Æ
+‚©‚È‚Ú‚¤
+‚±‚­‚¶‚ñ
+‚¹‚Á‚µ‚傤
+‚Ù‚¤‚ª‚Á‚©
+‚€
+‚ë‚΂½
+‚±‚¤‚©‚ñ‚µ‚ã
+‚Ü‚«
+‚Í‚­‚µ‚å‚­
+‚º‚ñ‚¯‚¢
+‚ç
+‚É‚©
+‚µ‚ã‚‚¦‚ñ‚µ‚á
+‚È‚Ü‚à‚Ì
+‚¤‚ç‚Ú‚ñ‚¦
+‚Ù‚¤‚¹‚¢
+‚à‚ß‚ñ
+‚¤‚·‚®‚à‚è
+‚ë‚Ú‚¤
+‚¢‚ñ‚«
+‚Ë‚ñ‚ª‚Á‚Ò
+‚Ö‚ñ‚·‚¤
+‚±‚¤‚»‚­‚Ç
+‚Ó‚Á‚«‚ñ
+‚¿‚à‚­
+‚µ‚¶
+‚®‚³
+‚Ó‚§‚ñ
+‚Ç‚¤‚¯‚¢
+‚Æ‚ç‚ñ‚¶‚·‚½
+‚Ä‚ñ‚µ‚ã‚‚Ƃǂ¯
+‚¶‚ñ‚µ‚ñ
+‚Ô‚ñ‚Ï‚¢‚è‚Â
+‚¨‚à‚¢‚Ç‚¨‚è
+‚µ‚ñ‚Ç
+‚©‚ñ‚Ø‚ñ
+‚Ђñ‚¶‚á
+‚Ó‚§[‚­
+‚½‚ׂà‚Ì
+‚Ђ¯‚Â
+‚ß‚¢‚³‚­
+‚Ø‚é[
+‚±‚Í‚Î
+‚¶‚傤‚Ù‚¤
+‚¢‚Á‚©‚ñ
+‚»‚ñ‚Ý‚ñ
+‚µ‚悤‚µ‚å
+‚䂤‚Æ‚­
+‚»‚­‚Ç‚¯‚¢
+‚ß‚Â
+‚Ý‚©‚«
+‚«‚¿‚イ
+‚³‚ñ‚΂»‚¤
+‚Ä‚µ‚Ü
+‚½‚ñ‚³‚ñ
+‚¹‚ñ‚à‚ñ‚µ‚å‚­
+‚Ü‚È‚±
+‚×[‚½‚¹‚ñ
+‚·‚¢‚¶‚ã‚ñ
+‚í‚«‚ß
+‚¾‚¢‚²‚©
+‚±‚ñ‚Ï‚·
+‚¿‚å‚­‚¹‚‚º‚¢
+‚µ‚傶‚å
+‚¬‚å‚©‚­‚¾‚©
+‚₵‚«
+‚µ‚½‚½‚©‚à‚Ì
+‚«‚½
+‚·‚Ä[‚¶
+‚Ä‚ñ‚«‚¸
+‚³‚Ñ
+‚¦‚«‚ׂñ
+‚¶‚ã‚ñ‚©‚ñ‚«
+‚ׂ‚¬
+‚Ü‚¦
+‚¿‚傤‚ǂЂñ
+‚¶‚±‚ ‚ñ‚¶
+‚¿‚ñ‚©‚­
+‚µ‚²‚Æ‚¬
+‚Ä‚¢‚µ‚ã
+‚Ó‚ ‚ñ
+‚¬‚å‚Ç‚¤
+‚à‚Ì‚²‚Æ
+‚è‚ɂイ‚µ‚å‚­
+‚¢‚ñ‚µ
+‚Ђ³‚µ
+‚Ç‚¤‚¼‚¤
+‚¢‚³‚è‚Ñ
+‚ß‚­‚ç‚΂ñ
+‚Þ‚©‚ñ‚¯‚¢
+‚낤‚³‚¢
+‚¢‚ñ‚µ‚º‚¢
+‚ ‚ñ‚º‚ñ
+‚Ô‚Á‚µ‚«
+‚¯‚ñ‚´‚¢
+‚¶‚Á‚¹‚¢
+‚»‚‚ë‚ñ
+‚Ó‚­‚©‚ñ
+‚¿‚イ‚à‚ñ‚µ‚å
+‚¬‚¶‚ë‚­
+‚Ü‚¿‚¢‚µ‚á
+‚¶‚Þ‚Ó‚­
+‚µ‚Ⴞ‚¢
+‚æ‚í‚Ë
+‚‚¢‚½‚Ä
+‚±‚¤‚Ù‚¤‚µ‚Â
+‚¶‚䂤
+‚È‚«
+‚µ‚傤‚à‚ñ
+‚ß‚¢‚Ú‚¤
+‚¨‚¿‚Î
+‚Ђ¶‚傤‚«‚ñ
+‚悤‚ª‚¢
+‚í‚ê‚í‚ê
+‚â‚­‚ª‚­‚©
+‚³‚¢‚ê‚ñ
+‚Ý‚ñ‚¿‚傤
+‚Ô‚«‚å‚­
+‚¿‚傤‚½‚ñ‚Ï
+‚ê‚ñ‚ç‚­‚³‚«
+‚¯‚¢‚Í‚­
+‚Ú‚¤‚®‚Ý
+‚«‚傤‚µ
+‚à‚Æ‚à‚Æ
+‚Þ‚¶‚ñ
+‚µ‚ñ‚»‚Â
+‚¢‚©‚ñ
+‚µ‚å‚à‚Â
+‚æ‚­‚æ‚­
+‚¹‚¢‚¿‚傤‚«
+‚â‚­‚ª‚­‚Ô
+‚Ü‚²‚±‚ë
+‚Í‚ñ‚±‚¤‚«
+‚ä‚í‚©‚µ‚«
+‚·‚©‚¢
+‚ª‚­‚°‚¢‚©‚¢
+‚½‚Ë‚¤‚Ü
+‚¢‚Æ‚ß
+‚¿‚½‚¢
+‚®‚ñ‚¼‚¤
+‚±‚´‚ñ
+‚¢‚¿‚傤
+‚»‚ñ‚©
+‚¾‚ñ‚ç‚­
+‚ ‚¢‚ ‚ñ
+‚¿‚ñ‚±‚ñ
+‚»‚¤‚è
+‚킽‚µ
+‚ɂイ‚¶
+‚Ђ ‚¢
+‚¢‚¿‚é‚¢
+‚©[‚Æ‚è‚Á‚¶
+‚¯‚Á‚¹‚«‚µ‚á
+‚«‚±‚¤‚µ
+‚Ô‚ß‚ñ
+‚Ä‚ñ‚Ú‚¤‚¾‚¢
+‚¦‚ñ‚½‚­
+‚ë‚¢‚Ç
+‚µ‚ñ‚³‚«‚å‚­
+‚¹‚¢‚¬‚å
+‚¶‚‚¦‚«
+‚ ‚­‚䂤
+‚Ý‚ñ‚©‚ñ
+‚³‚­‚炪‚¢
+‚Ђç‚ß
+‚è‚傤‚µ‚ñ
+‚Í‚ñ‚´‚¢
+‚µ‚¢‚ñ
+‚Ý‚Ë
+‚΂ñ‚¶‚á‚­
+‚«‚Ç‚¤‚µ‚á
+‚Ý‚È‚Ý‚È
+‚©‚¢‚΂Â
+‚Ù‚µ‚傤‚É‚ñ
+‚©‚º‚Þ‚«
+‚«‚á‚ñ‚Ø[‚ñ
+‚µ‚ñ‚¤‚¿
+‚«‚á‚ׂÂ
+‚¨‚ñ‚³
+‚¢‚¿‚®‚¤
+‚Ó‚¶‚ã‚ñ
+‚ ‚«‚ê‚·‚¯‚ñ
+‚ª‚ª‚­
+‚ ‚ñ‚º‚ñ‚è‚Â
+‚Í‚ñ‚‚«
+‚µ‚è‚å‚­
+‚è‚傤‚Ú
+‚©‚ñ‚΂¢
+‚³‚­‚µ‚á
+‚ׂ¢‚±‚­
+‚·‚È‚¶
+‚¦‚Ù‚ñ
+‚½‚Ä‚â‚­‚µ‚á
+‚肶‚¿‚傤
+‚è‚»‚¤
+‚Ç‚¤‚¢‚Â
+‚½‚°‚ñ
+‚Ԃ‚¬
+‚±‚¤‚¼‚¤
+‚µ‚傤‚·‚¢
+‚ӂ݂«
+‚Ü‚Ç‚ñ‚È
+‚«‚ñ‚¹‚ñ
+‚Æ‚¤‚¬
+‚¶‚傤‚µ‚イ
+‚¯‚¢‚½‚­
+‚¿‚á‚è‚Ä‚¡
+‚Ó‚¹
+‚¶‚Ê‚µ
+‚à‚Ì‚²‚µ
+‚»‚è‚イ‚µ
+‚«‚イ‚©‚­
+‚è‚イ‚¯‚Â
+‚¹‚ñ‚à‚ñ
+‚·‚¢‚Ý‚Â
+‚«‚©‚Ë‚Â
+‚È‚Â
+‚¹‚¢‚Í‚ñ‚½‚¢
+‚½‚¢‚è‚傤
+‚©‚é‚¿‚á[
+‚©‚ñ‚Ï‚É[
+‚䂸‚è
+‚ ‚¶
+‚«‚傤‚Í‚ñ
+‚͂肱
+‚º‚ñ‚µ‚イ
+‚³‚¨
+‚Æ‚¤‚©‚Â
+‚Ç‚­‚µ‚á
+‚µ‚傹‚¢
+‚©‚Á‚«‚å‚­
+‚¨‚ñ‚µ‚Â
+‚²‚±‚ñ‚¶‚傤
+‚Æ‚¤‚Ý‚ñ
+‚´‚¢‚¾‚ñ
+‚Ђ傤‚Ù‚ñ
+‚Ó‚µ‚Ô‚µ
+‚°‚ñ‚»‚ñ
+‚µ‚ã‚æ‚­
+‚±‚¤‚¸
+‚«‚催‚傤
+‚à‚ç‚é
+‚à‚­‚悤‚Ñ
+‚³[‚Ñ‚·‚©
+‚í‚è‚Ü‚µ
+‚䂤‚·‚¤
+‚«‚à‚¿
+‚¹‚¢‚Ú‚¤
+‚Í‚¢‚É‚¿
+‚¢‚¹‚«
+‚µ‚å‚­‚Î
+‚¤‚ç
+‚à‚µ‚à‚µ
+‚¿‚¿‚イ
+‚©‚­‚ª‚¢
+‚µ‚¿‚傤
+‚è‚Á‚Û‚¤
+‚䂤‚¦‚«
+‚¿‚傤‚è‚Î
+‚±‚Á‚©
+‚©‚悤
+‚©‚ñ‚¦‚¢
+‚°‚Á‚¯‚¢‚¶‚ã
+‚¶‚Á‚©
+‚©‚ñ‚¯‚ñ
+‚³‚‚«‚΂ê
+‚Ê‚©
+‚¾‚¹‚¢
+‚¿‚イ‚¶‚¦‚ñ
+‚È‚Æ‚è
+‚É‚­‚ª‚ñ
+‚µ‚¯‚ñ‚©
+‚è‚Û[‚Æ
+‚«‚Ì‚±
+‚낤‚«‚Ù‚¤
+‚Ñ‚ñ‚ç‚ñ
+‚È‚«‚²‚¦
+‚䂤‚©‚µ‚傤‚¯‚ñ
+‚â‚­‚悤
+‚´‚¢‚Ä‚­
+‚³‚ñ‚²‚­
+‚³
+‚ß‚·
+‚½‚ñ‚¨‚ñ‚©‚¢
+‚¶‚ñ‚é‚¢
+‚Ü‚ñ‚悤‚ª‚È
+‚Ô‚µ‚å
+‚¶‚¥‚Á‚Æ‚«
+‚¿‚イ‚È‚ñ‚ׂ¢
+‚¶‚‚¬‚傤‚©
+‚Ç‚¤‚µ‚傤‚¢‚Þ
+‚ê‚ñ‚¶
+‚¢‚ñ‚È‚¢
+‚¯‚¢‚Ú‚¤
+‚Ç
+‚»‚¤‚¢‚ñ
+‚¿‚傤‚³‚¢‚ñ
+‚¶‚Ú‚¤
+‚±‚Ç‚¤‚®
+‚΂ꂦ
+‚Í[‚Æ
+‚Í‚ñ‚΂¢‚©
+‚©‚¨‚Ô‚ê
+‚Ù‚¤‚ׂñ
+‚²‚Ó‚ß‚¢
+‚º‚ñ‚¯‚ñ
+‚Ö‚ñ‚ ‚‚«
+‚©‚ñ‚½‚ׂè[
+‚±‚¤‚©‚ñ
+‚Þ‚¶‚±
+‚É‚Á‚Æ‚¤
+‚¶‚á‚·‚Æ
+‚Ђ¾‚è‚Þ‚«
+‚·‚¢‚Ú‚­‚ª
+‚µ‚ã‚â‚­
+‚Ü‚ 
+‚‚܂悤‚¶
+‚ ‚‚ꂫ
+‚è‚ñ‚²
+‚Ü‚ä
+‚¶‚¾‚ç‚­
+‚Ì‚¤‚Ä‚ñ
+‚¦‚ñ‚Ô‚«‚å‚­
+‚ ‚¨‚¢
+‚¢‚Í‚ñ‚µ‚á
+‚µ‚ザ‚イ
+‚Ý‚³‚¢‚é
+‚©‚ª‚­‚¿‚傤‚Ý‚è
+‚Õ‚ë‚Ó‚¡[‚é
+‚Ó‚ä‚à‚Ì
+‚Ø
+‚½‚¢‚è‚­‚¾‚È
+‚¹‚¢‚©‚ñ
+‚©‚ ‚³‚ñ
+‚½‚¢‚¢‚­‚©
+‚Ì‚Ç
+‚Æ‚ç‚ñ‚µ[‚Î
+‚Ó‚¤‚낤
+‚µ‚²‚¹‚ñ
+‚É‚ñ‚¬‚傤
+‚¶‚Ñ
+‚ ‚´
+‚Ó‚í
+ƒ]
+‚µ‚ã‚ñ‚¬‚­
+‚º‚ñ‚µ‚å
+‚«‚傤‚©
+‚©‚¢‚µ‚á‚¢‚ñ
+‚Ý‚È‚ç‚¢
+‚ê‚ñ‚â
+‚Ì‚¤‚ª‚«
+‚Ó‚Ÿ‚­‚µ‚Ý‚è
+‚ç‚ñ‚¬‚傤
+‚Ç‚¤‚è‚å‚­‚°‚ñ
+‚Ù‚¤‚¿
+‚â‚­‚í‚è
+‚ ‚邱[‚é
+‚¯‚ñ‚¿‚傤
+‚±‚¤‚¶‚å
+‚à‚­‚¶
+‚ׂ‚ׂÂ
+‚Ƃ肪[
+‚Ó‚¹‚¢‚±‚¤‚¢
+‚«‚傤‚à‚ñ
+‚µ‚ñ‚¹‚©‚¢
+‚©‚°‚ñ
+‚¢‚ñ‚µ‚傤
+‚·‚¤‚É‚ñ
+‚Ë‚Ó‚¾
+‚µ‚å‚Á‚©‚ñ
+‚©‚Ý‚³‚Ü
+‚¨‚Ü‚í‚肳‚ñ
+‚¶‚å‚â
+‚炵‚傤‚à‚ñ
+‚ׂ¢‚µ
+‚ЂƂ ‚½‚è
+‚¬‚±‚¤
+‚«‚イ‚Ò‚Á‚¿
+‚ß‚ñ‚Î
+‚Ђâ‚Þ‚¬
+‚Ù‚µ‚­‚¸
+‚è‚ñ‚¿
+‚½‚¢‚·‚¤
+‚í‚©‚ÂÜ
+‚³‚¢‚¾‚¢‚¿
+‚Ù‚Ö‚¢
+‚â‚­‚ª‚ç
+‚¤‚¯‚Æ‚è‚É‚ñ
+‚¤‚ñ‚Ä‚ñ‚µ‚ã
+‚·‚ñ‚Û‚¤
+‚¶‚傤‚Ë‚ñ
+‚³‚ñ‚³‚¢
+‚³‚ñ‚Ô‚ñ
+‚µ‚à‚Í‚ñ‚«
+‚»‚¤‚©
+‚¹‚‚Ç
+‚½‚¿‚¬‚¦
+‚悤‚¶‚å
+‚æ‚­
+‚È‚ª‚ꂸ
+‚à‚Æ‚²‚¦
+‚È‚ñ‚¨‚¤
+‚‚¯‚Ë
+‚µ‚傤‚Ä‚ñ‚ª‚¢
+‚­‚Ý‚¢‚ñ
+‚«‚ñ‚ê‚¢
+‚¬‚Ì‚¤
+‚Æ‚¬‚©‚¢
+‚ ‚ñ‚Ý‚Â
+‚Ä‚È‚ñ‚Æ
+‚Ó‚Ä‚«
+‚ê[‚ ‚¤‚Æ
+‚¯‚¢‚³‚ñ
+‚ª‚­‚¦‚ñ‚³‚¢
+‚±‚Á‚Õ
+‚¶‚‚¬‚傤
+‚¶‚イ‚º‚ñ
+‚Ђà
+‚±‚­‚Ý‚ñ‚¹‚¢
+‚ë[‚Õ
+‚ë‚Á‚¶
+‚Þ‚ç‚Ñ‚Æ
+‚¹‚«‚¦‚¢
+‚«‚傱‚­
+‚µ‚ñ‚΂µ
+‚Ä‚Ü
+‚·‚¢‚ª‚ñ
+‚킪‚­‚É
+‚Ü‚¿‚È‚©
+‚Í‚ç
+‚ª‚«
+‚¯‚¢‚³‚‚¿‚傤
+‚Ç‚è‚ñ‚­
+‚Ó‚¹‚ñ‚ß‚¢
+‚¬‚å[‚´
+‚©‚ñ‚É‚ñ‚®
+‚¨‚Á‚¿‚á‚ñ
+‚©‚´‚®‚é‚Ü
+‚µ‚Ⴈ‚­
+‚«‚ñ‚©
+‚º‚¢‚Ñ‚«‚²
+‚±‚è
+‚´‚ñ‚µ‚傤
+‚¶‚å‚¿‚イ
+‚°‚ñ‚è
+‚Ç‚¤‚¹‚¢
+‚¢‚ñ‚©‚ñ
+‚¢‚è‚傤
+‚¾‚¢‚É‚ñ
+‚¶‚©‚ñ‚í‚è
+‚±‚¤‚΂ñ
+‚Ü‚Ç‚è
+‚¬‚䂤
+‚Ђé
+‚悤‚Ô‚ñ
+‚Ä‚¹‚¢
+‚«‚·‚¤
+‚Ü‚¦‚Ü‚¦
+‚²‚Ó‚ñ
+‚¢‚Å‚¨‚났
+‚¿‚­‚í
+‚«‚傤‚¢‚­‚ª‚©‚è
+‚·‚¢‚µ‚á
+‚¦‚±‚낶[
+‚¶‚ã‚ñ‚è
+‚©‚Ö‚ñ
+‚­‚ê[‚ñ
+‚è‚΂炢
+‚µ‚Æ
+‚ ‚¢‚»‚¤
+‚«‚«‚傤
+‚¯‚ñ‚·‚¢
+‚´‚¢‚Þ‚«‚å‚­
+‚¶‚ñ‚¶‚á
+‚­[‚Ø
+‚¹‚ñ‚ɂイ
+‚£
+‚«‚µ‚傤‚¾‚¢
+‚¯‚Á‚«
+‚·‚Û[‚­‚·‚Ü‚ñ
+‚¶‚傤‚Ý
+‚ä‚Ñ‚¨‚è
+‚¨‚à‚Ä‚Ç‚¨‚è
+‚«‚å‚­‚­‚È‚¢
+‚µ‚ã‚悤
+‚Ù‚¤
+‚¢‚¿‚ê‚¢
+‚±‚ 
+‚·‚¤‚Ý‚Â
+‚¦‚ñ‚³‚ñ
+‚Ù‚ñ‚²‚­
+‚·‚Õ[‚ñ
+‚±[‚é‚Ç
+‚¢‚낤
+‚¶‚à‚ñ
+‚¨‚µ‚ ‚킹
+‚µ‚Ⴕ‚ñ‚©‚ñ
+‚¢‚ñ‚«‚å‚­
+‚°‚ñ‚¾‚¢‚Á‚±
+‚‚¤‚Ë‚ñ
+‚²‚©‚ñ‚悤
+‚Ô‚ñ‚©‚³‚¢
+‚µ‚¨‚³‚¢
+‚à‚ñ‚Ô‚µ‚傤
+‚¦‚¢‚悤‚µ‚Á‚¿‚å
+‚±‚­‚È‚¢‚¹‚ñ
+‚Ö‚¢‚±‚¤‚¹‚ñ
+‚½‚¢‚²
+‚Ó‚Æ‚¤
+‚¹‚¢‚¯‚ñ
+‚µ‚ñ‚µ‚«
+‚¶‚½‚­
+‚Þ‚¢‚¿‚à‚ñ
+‚Ó‚ñ‚¦‚ñ
+‚µ‚â‚­
+‚©‚¢‚è‚イ
+‚°
+‚¨‚·‚Ü‚¢
+‚Ó‚Ö‚ñ
+‚ׂ‚è
+‚º‚ñ‚Ç
+‚Ý‚«‚³[
+‚¯‚¢‚¶‚Ç‚¤‚µ‚á
+‚µ‚܂‚µ‚å
+‚Æ[‚­
+‚Ó‚Á‚»
+‚ß‚Á‚¹‚ñ‚¶‚á
+‚Ý‚á‚­
+‚䂤‚º‚¢
+‚¿‚イ‚Æ‚ñ‚¿
+‚ ‚¨‚¢‚ë
+‚æ‚Ý‚à‚Ì
+‚΂ñ‚³‚ñ
+‚è‚è‚Â
+‚Ù‚¤‚à‚Â
+‚©‚É
+‚ꂬ‚ã‚ç[
+‚Ù‚¤‚ê‚Â
+‚Å‚¡[
+‚¶‚イ‚«‚å
+‚¤‚·‚à‚Ì
+‚Û‚è‚·
+‚¿‚傤‚©‚¢
+‚Ó‚­‚»‚·‚¤
+‚°‚ñ‚è‚傤
+‚Í‚¿
+‚»‚¤‚Ë‚ñ
+‚É‚Ú‚µ
+‚ ‚ñ‚È‚¢‚¶‚傤
+‚«‚イ‚Ô‚ñ
+‚ׂñ‚¿
+‚¶‚ç‚¢
+‚¿‚イ‚»‚¤
+‚¼‚¤‚è
+‚܂‚ނµ
+‚«‚傤‚¯‚ñ
+‚·‚Â[‚é
+‚µ‚«‚«‚ñ
+‚Ù‚¤‚»‚¤‚à‚¤
+‚º‚Ë‚ç‚é
+‚¨‚¨‚Ñ‚¯
+‚Í‚È‚¨
+‚Õ‚ë‚Ý‚·
+‚Ó‚½‚Â
+‚©‚¢‚È‚ñ
+‚«‚イ‚«‚イ
+‚Ç‚­‚Ô‚ñ‚ª‚­
+‚´‚·
+‚è‚‚ꂢ
+‚Ü‚¶‚å
+‚æ‚Ë‚Â
+‚Ô‚Á‚µ
+‚Æ‚¤‚Ç‚è
+‚Þ‚°
+‚Õ‚ë‚ñ‚Õ‚Æ
+‚¹‚Á‚µ‚á
+‚ä‚í‚©‚µ
+‚à‚Ì‚³‚µ
+‚·‚Ó‚¡‚ñ‚­‚·
+‚ӂ‚©‚æ‚¢
+‚݂‚Î
+‚¾‚ñ‚¶‚傤
+ƒ‘
+‚©‚µ‚¿‚ñ
+‚©‚½‚¿
+‚¢‚ñ‚½[‚¿‚¥‚ñ‚¶
+‚µ‚傶‚¿‚傤
+‚ЂƂÂÄ
+‚ê‚ñ‚²
+‚Æ‚Ë‚è
+‚΂¢‚Ä‚ñ
+‚킯
+‚Ö‚ñ‚Ä‚Â
+‚è‚ñ‚µ‚Â
+‚½‚ñ‚Å‚ñ
+‚Ã
+‚©‚¿‚ß
+‚¶‚イ‚¯‚¢‚µ‚傤
+‚ׂ·‚Æ
+‚悤‚¹‚¢
+‚µ‚ã‚Þ
+‚·‚¢‚ß‚¢
+‚±‚¶‚Â
+‚µ‚ñ‚³
+‚Í‚¢‚Ô‚Â
+‚µ‚Å‚ñ
+‚ê‚‚łñ
+‚ ‚»‚Ñ‚Î
+‚Æ‚¤‚Ù‚­‚¿‚Ù‚¤
+‚Í‚½‚ç‚«‚´‚©‚è
+‚µ‚傹‚ñ
+‚Ü‚ñ‚¢‚¿
+‚©‚ñ‚Æ‚¤‚¿‚Ù‚¤
+‚±‚¤‚¿‚傤‚è‚å‚­
+‚¿‚イ‚²‚­
+‚±‚ë‚É[
+‚µ‚Ý‚ñ‚º‚¢
+‚½‚ñ‚Ñ
+‚ç‚¢‚«‚á‚­
+‚Ù‚ñ‚©‚­‚Í
+‚¤‚¸‚µ‚¨
+‚Ù‚ñ‚µ‚ñ
+‚©‚¢‚¯‚‚³‚­
+‚í‚É
+‚µ‚È‚¶‚È
+‚±‚ñ‚΂ñ
+‚¬‚傤‚Þ‚µ‚Â
+‚»‚¤‚²‚¤
+‚³[‚Ó‚¥‚·
+‚Ý‚¨‚Ú‚¦
+‚Í‚ñ‚΂¢‚Ä‚ñ
+‚ª‚¬‚傤
+‚è‚イ‚¢‚«
+‚©‚Ñ
+‚Ö‚¢‚½‚ñ
+‚µ‚å‚­‚¦‚ñ
+‚¨‚¨‚Í‚µ
+‚È‚Ç
+‚«
+‚µ‚·‚¤
+‚±‚¤‚¬
+‚Ó‚­‚µ‚å‚­
+‚Ó‚Á‚Æ
+‚Ü‚ñ‚´
+‚â‚è‚Ä
+‚·‚Í‚¾
+‚‚݂É
+‚µ‚É‚ 
+‚©‚«‚©‚½
+‚µ‚ザ‚ñ
+‚µ‚ã‚­‚µ‚å
+‚²‚­‚µ‚á
+‚±‚¤‚¿‚ñ
+‚Ý‚¸‚ ‚©
+‚½‚Ă悱
+‚悤‚»
+‚¶‚ã‚ñ‚µ‚ñ
+‚Ù‚Á‚«‚å‚­‚¹‚¢
+‚µ‚ゼ‚¤
+‚Ђ´
+‚¹‚«‚¶‚傤
+‚Ý‚È‚à‚Æ
+‚‚¢‚Ä
+‚à‚­‚µ‚Â
+‚±‚ñ‚®‚ë‚Ü‚è‚Á‚Æ
+‚µ‚ã‚Á‚¯‚Â
+‚³‚ñ‚ª‚Â
+‚Ó‚­‚µ‚ã
+‚¤‚¿‚ä
+‚©‚¢‚±‚­
+‚ß‚¤‚¦
+‚±‚ñ‚Î[‚½
+‚æ‚ë‚¢
+‚Ù‚ñ‚â
+‚¿‚傤‚Ù‚¤
+‚ЂƂÁ‚±
+‚Æ‚¤‚Ù‚­
+‚Í‚µ‚À‚©
+‚Ü‚ñ‚ª‚ñ
+‚¯‚ñ‚É‚ñ
+‚΂Ë
+‚½‚ñ‚Ï
+‚³‚­‚¶
+‚Ђłñ
+‚Ç‚Ä
+‚©‚ñ‚Âß
+‚Å‚¢‚Ë‚¢
+‚É‚µ‚¶‚ñ‚¨‚è
+‚ª‚Á‚Æ
+‚½‚º‚¢
+‚Ԃ‚¶
+‚¦[‚¶
+‚Ö‚ñ‚µ‚イ‚Ô
+‚Ó‚¤‚µ‚イ
+‚Ì‚¤‚è‚ñ
+‚¿‚傤‚¹‚ñ
+‚Ô‚ñ‚¶‚ñ
+‚©‚ç‚Á‚Æ
+‚Ó‚¶‚ñ‚©
+‚Ó‚­‚ ‚ñ
+‚ׂñ‚¢
+‚ׂñ‚¾[
+‚肳‚¢‚­‚é
+‚肪‚¢
+‚Ù‚¤‚Ä‚ñ
+‚Ñ‚±‚¤‚ç‚ñ
+‚Ü‚²
+‚Í‚­‚µ‚²‚¤
+‚Í‚­‚µ‚ñ
+‚¦‚¢‚µ‚á
+‚¾‚Ä‚ñ
+‚±‚¶‚ñ‚³
+‚¾‚¢‚æ‚ñ‚é‚¢
+‚à‚¶‚·‚¤
+‚è‚ñ‚µ‚å‚­
+‚Ђ傤‚®
+‚Ô‚ñ‚²‚½‚¢
+‚­‚¶‚á‚­
+‚½‚Ê‚«
+‚¬‚å‚Ó‚Ì‚è
+‚Æ‚­‚¿‚傤
+‚¤‚‚Ú
+‚¨‚¨‚­‚ë
+‚ЂÁ‚±‚Ý
+‚ ‚邶‚¥‚è‚ 
+‚¿‚»‚­
+‚¨‚Æ
+‚à‚Ƃ΂炢
+‚É‚µ‚®‚¿
+‚Ü‚·
+‚µ‚傤‚Ë‚ñ‚¢‚ñ
+‚¯‚¢‚«‚ñ‚¼‚­
+‚¨‚µ‚×
+‚È‚¢‚¶‚Â
+‚è‚·‚­
+‚΂·
+‚ë‚ñ‚²
+‚Ç‚ñ‚¿‚傤
+‚¿‚イ‚ª‚¢
+‚½‚‚Ԃñ
+‚â‚«‚ñ
+‚·‚Æ‚ç‚¢‚­
+‚Å‚ñ‚©
+‚½‚ñ‚Æ‚¤‚µ‚á
+‚¾‚¢‚悤‚Ђñ
+‚µ‚¨‚¯
+‚±‚µ‚©‚¯
+‚µ‚傤‚‚«
+‚½‚Ü‚®‚µ
+‚Ä‚²‚ë
+‚Ç‚¤‚¯‚à‚Ì
+‚¹‚ñ‚ª‚­
+‚Ђª‚µ
+‚É‚Á‚µ‚ñ
+‚³‚ñ‚Ç‚¤
+‚Ù‚º‚¢
+‚¨‚©‚ ‚³‚ñ
+‚Ö‚é‚Ç
+‚¶‚µ‚ã
+‚®‚ñ‚½‚¢
+‚Þ‚³‚µ
+‚±‚¶‚Ü
+‚´‚Á‚½
+‚¹‚¢‚Ð
+‚µ‚イ‚µ‚å‚­
+‚³‚¢‚¹‚ñ‚½‚ñ
+‚µ‚傤‚ª‚¢
+‚¤‚ñ‚©‚¢
+‚¬‚¾‚䂤
+‚ׂÁ‚Æ
+‚·‚¢‚Ó
+‚¨‚¾‚­
+‚µ‚イ‚¼‚­
+‚µ‚ñ‚©‚¢‚¬‚å
+‚ ‚¢‚ë
+‚¶‚傹‚¢‚«‚ñ
+‚É‚¢‚ÂÜ
+‚¿‚å‚­‚¿‚傤
+‚Ó‚¦‚¢
+‚µ‚傤‚¹‚ñ
+‚܂‚¾‚¢
+‚¾‚¢‚¢‚¿‚Ô
+ƒ…
+‚¨‚Ý‚¨‚‚¯
+‚³‚¢‚º‚ñ
+‚¢‚»‚¬‚ ‚µ
+‚²‚Ô‚²‚Ô
+‚Ԃ䂤
+‚½‚¢‚­
+‚³‚ñ‚Ô‚Â
+‚¾‚¢‚Î
+‚´‚¼‚¤
+‚è‚傤‚Ð
+‚Ñ[
+‚²‚¤‚½‚¢
+‚â‚­‚µ‚å‚­
+‚Ù‚¤‚·‚¢
+‚±‚Â
+‚¶‚Þ‚©
+‚à‚ë‚à‚ë
+‚¿‚á‚Ô‚¾‚¢
+‚ß‚¼‚Ë‚Á‚Æ
+‚Ü‚Æ‚à
+‚È‚¢‚µ‚å
+‚µ‚å‚­‚µ‚傤
+‚¨‚Ø‚ê[‚Ä‚¡‚ñ‚®
+‚¢‚ñ‚´‚¢
+‚µ‚ñ‚Ä‚¢
+‚°‚ñ‚¿‚イ
+‚½‚­‚¶
+‚Ú‚¤‚è‚ñ‚®
+‚¦‚Ç‚Á‚±
+‚»‚µ‚È
+‚¸‚µ‚«
+‚ê‚Á‚µ‚傤
+‚Ë‚Á‚¯‚Â
+‚Ü‚Ë‚¶‚á[
+‚È‚Ý‚«
+‚΂ñ‚è
+‚©‚´‚ñ‚΂¢
+‚낵‚ ‚²
+‚Æ‚Á‚­‚è
+‚Ç‚¤‚«‚イ‚¹‚¢
+‚¯‚¨‚è‚à‚Ì
+‚Ó‚¿‚イ
+‚³‚«‚ñ
+‚©‚ñ‚º‚¢
+‚½‚ñ‚¶‚­
+‚è‚悤
+‚¶‚ã‚ñ‚Ò‚Â
+‚è‚Á‚µ‚ã‚ñ
+‚¿‚イ‚±‚µ‚á
+‚Æ‚Î
+‚©‚Á‚µ‚å‚­
+‚µ‚Ä‚ñ
+‚¯‚¢‚¿‚Â
+‚¶‚ë
+‚à[‚É‚ñ‚®
+‚»‚¤‚«‚å‚­
+‚¦‚Á‚¯‚ñ
+‚䂤‚µ‚傤
+‚©‚ñ‚Ñ
+‚»[‚·
+‚Í‚ñ‚¾
+‚½‚ñ‚·‚¢
+‚¶‚©‚¹‚¢
+‚·‚¤
+‚ ‚ñ‚È‚¢‚µ‚å
+‚ß‚¢‚¶‚Â
+‚¾‚Þ
+‚³‚ñ‚©‚­‚·
+‚¦‚¢‚¬‚傤‚©
+‚ЂƂ©‚°
+‚«‚イ‚Ä‚¢
+‚½‚¢‚µ
+‚¨‚»‚­
+‚µ‚ã‚Ù‚¤
+‚‚¿
+‚°‚ñ‚­‚ñ
+‚Ç‚¤‚é‚¢
+‚½‚¢‚µ‚å‚­‚«‚ñ
+‚¶‚µ‚傤
+‚è‚ñ‚΂ñ
+‚‚¤‚µ‚傤‚³‚ñ‚¬
+‚ ‚â
+‚»‚¤‚Ђ傤
+‚Ђ«‚·‚¤
+‚Ü‚É‚ã‚ ‚é
+‚©‚­‚¾‚ñ‚Æ‚¤
+‚ß‚è‚â‚·
+‚Ü‚­‚Ì‚¤‚¿
+‚µ‚¶‚å
+‚©‚ñ‚è‚Ô
+‚ ‚É‚«
+‚¾‚¢‚µ‚«‚傤
+‚±‚©‚¢
+‚©‚ñ‚è‚Ä‚«
+‚½‚ñ‚Ò‚ñ
+‚µ‚ã‚ñ‚±‚¤
+‚±‚à‚ñ‚¹‚ñ‚·
+‚Ë‚Á‚Õ‚¤
+‚º‚ñ‚¾‚¢‚Ý‚à‚ñ
+‚»‚±‚¤
+‚¶‚Ä‚¢
+‚¾‚¢‚ª‚­‚¢‚ñ
+‚Ý‚Ü‚¢‚«‚ñ
+‚µ‚催‚傤
+‚킽‚­‚µ‚²‚Æ
+‚è‚イ‚¬
+‚µ‚á‚È‚¢
+‚Ç‚­‚»‚¤
+‚®‚¸
+‚Ù‚«‚ñ‚µ‚á
+‚¯‚¢‚´‚¢
+‚¿‚傤‚Ý‚Â
+‚¶‚©
+‚µ‚ã‚ñ‚«
+‚¨‚à‚¿‚á
+‚à‚ñ‚Ô
+‚©‚ª‚¢‚µ‚á
+‚¨‚½‚ª‚¢
+‚¬‚á‚­‚·‚¤
+‚¼‚¤‚Æ‚¤‚Ђñ
+‚©‚ñ‚µ‚á
+‚¤‚¿‚킯
+‚¶‚µ‚á
+‚ЂÁ‚Õ
+‚¯‚ñ‚¶‚ñ
+‚¢‚í
+‚¤‚¯‚´‚ç
+‚Ù‚ñ‚è‚イ
+‚Ù‚¤‚Ú‚¤
+‚¯‚ñ‚Æ‚¤
+‚à‚ñ‚­
+‚¢‚ñ‚¹‚«
+‚‚ [
+‚Ü‚¢‚­
+‚³‚ñ‚©‚ñ
+‚Ó‚¿‚イ‚¢
+‚Ç‚¤‚à‚ñ
+‚Ë‚Ô‚­‚ë
+‚½‚³‚Â
+‚«‚ª‚½
+‚µ‚炬‚­
+‚Æ‚¤‚µ‚«
+‚ ‚ê‚¢
+‚è‚¢‚ñ
+‚Ü‚ë
+‚³‚ñ‚¾‚ñ
+‚킬‚イ
+‚©‚È‚ª‚½
+‚Ђ‚¬
+‚Ü‚µ‚傤‚ß‚ñ
+‚Ñ‚³‚¢
+‚¢‚ñ‚Ä‚ñ
+‚ë[‚ñ
+‚­‚¤‚¢
+‚·‚Ăꂨ
+‚¹‚«‚ç‚ñ‚¤‚ñ
+‚¹‚ñ‚µ‚á
+‚¹‚ñ‚Æ
+‚Ü‚¤‚ñ‚Æ
+‚à‚您‚µ‚à‚Ì
+‚¨‚«
+‚°‚ñ‚è‚イ
+‚½‚ñ‚µ‚傤
+‚³‚¢‚ª‚¢
+‚«‚á‚­‚¿‚イ
+‚¶‚±‚µ‚Ù‚ñ
+‚Ó‚Æ‚­‚¢
+‚¨‚È‚Ü‚¦
+‚͂킽‚è
+‚¨‚¨‚â
+‚à‚¤‚¶‚イ
+‚½‚¿‚«
+‚¹‚ñ‚ê‚¢
+‚·‚Ø[‚Ç
+‚Í‚ñ‚¶
+‚¹‚ñ‚­‚¿
+‚悲
+‚±[‚·
+‚Í‚â‚Ý‚¿
+‚µ‚Á‚¯‚ñ
+‚Ú‚­‚¹‚«
+‚ ‚³‚¢‚¿
+‚΂ç
+‚Ì‚¯‚à‚Ì
+‚±‚¤‚¾‚ñ
+‚µ‚ñ‚¹‚¢
+‚Ђ®‚ê
+‚Í‚Ö‚ñ
+‚©‚¿‚Ú‚µ
+‚¨‚¹‚Á‚©‚¢
+‚ׂñ‚¶‚å
+‚â‚Ü‚´‚Æ
+‚ë‚­‚ª‚Â
+‚³‚¢‚¦‚ñ
+‚«‚©‚­‚Ô
+‚Ù‚¤‚·‚ñ
+‚Í‚¾‚ ‚¢
+‚©‚ñ‚Ä‚ñ
+‚Ä‚ñ‚Ô‚­‚ë
+‚¶‚Á‚±‚¤‚è‚å‚­
+‚Ђ·‚Æ‚è[
+‚΂ñ‚µ‚ã‚ñ
+‚¶‚Ô‚ñ‚©‚Â
+‚©‚à
+‚µ‚ñ‚¶‚å
+‚·‚½‚Ý‚È
+‚¹‚¢‚â
+‚Ђé‚â‚·‚Ý
+‚æ‚Á‚¿‚á‚ñ
+‚½‚¢‚à‚¤
+‚¹‚¢‚Æ‚¤
+‚µ‚©‚­
+‚Ô‚ñ‚©‚¿‚傤
+‚®‚ñ‚Ä
+‚©‚½‚Í‚Î
+‚´‚Á‚«‚ñ
+‚Ì‚¤‚è‚傤
+‚¥
+‚µ‚ß‚ñ‚»‚©
+‚¢‚¯‚ñ
+‚«‚イ‚ß‚¢
+‚Ђë‚Î
+‚ª‚­‚Ó
+‚Ý‚©‚½
+‚È‚¢‚ª‚¢
+‚µ‚å‚Ä‚ñ‚ª‚¢
+‚í‚ç‚Ñ
+‚Ù‚Ë‚Ý
+‚ç‚Ó
+‚µ‚傤‚т傤
+‚«‚ñ‚Ú‚µ
+‚悤‚Ç
+‚Í‚³‚«
+‚¹‚‚í
+‚´‚‚¶
+‚Æ‚ñ‚Õ‚­
+‚Í‚Á‚Û‚¤
+‚Ђñ‚΂ñ
+‚µ‚Ú‚¤‚µ‚Â
+‚æ‚­‚µ‚Â
+‚°‚±
+‚¹‚ñ‚¶
+‚Ì‚¤‚°‚¢
+‚Ђñ‚Ý‚ñ
+‚«‚è‚Ý
+‚«‚ñ‚Ë‚ñ
+‚³‚­‚¹‚·
+‚ä‚É‚¨‚ñ
+‚Ü‚¦‚ª‚í
+‚¨‚­‚Ä
+‚Å‚ñ‚´‚¢
+‚ê‚ñ‚¿‚イ
+‚µ‚«‚ñ‚¹‚«
+‚Ü‚Á‚¹‚«
+‚΂ñ‚­
+‚â‚­‚ª‚¢
+‚±‚ñ‚©‚¢
+‚Ý‚ñ‚©‚Â
+‚Ñ‚ñ‚ª‚½
+‚±‚¬‚Á‚Ä
+‚µ‚í‚·
+‚Ä‚¡[
+‚Æ‚¦‚¢
+‚ׂ‚¶‚ñ
+‚º‚ñ‚à‚¤
+‚ׂñ‚º‚Â
+‚µ‚ñ‚¾‚ñ‚µ
+‚«‚イ‚Å‚ñ
+‚±‚È‚Ý‚¶‚ñ
+‚´‚¢‚³‚ñ
+‚µ‚낶
+‚±‚¤‚µ‚©‚ñ
+‚©‚Ä‚¢‚©
+‚Å‚¢‚è‚®‚¿
+‚·‚Û‚ñ‚¶
+‚è‚傤‚ ‚ñ
+‚Ç‚¤‚¹‚¢‚Ç‚¤‚ß‚¢
+‚í‚©‚½‚¯
+‚µ‚¨‚è
+‚µ‚®‚ê
+‚µ‚ñ‚¿‚å
+‚â‚­‚Ç‚µ
+‚¿‚傤‚È‚¢
+‚«‚イ‚¶‚傤
+‚ª‚è‚Î[
+‚¯‚ñ‚¨‚©‚ñ
+‚ª‚µ‚ã
+‚Ò‚Á‚¿
+‚Ù‚»‚¨‚à‚Ä
+‚í‚«‚¯
+‚ª‚¯
+‚¢‚¿‚É‚ñ‚Ü‚¦
+‚悤‚ç‚ñ
+ƒN
+‚Ç‚Ü
+‚܂‚²
+‚¾‚Ú‚­‚µ‚傤
+‚¿‚イ‚«‚傤
+‚©‚ñ‚Ï
+‚±‚¤‚Ó‚­
+‚ׂ̂¢‚½
+‚º‚ñ‚¢‚«
+‚‚肩‚í
+‚©‚Ý‚â
+‚µ‚å‚Æ‚¤
+‚´‚ñ‚¾‚©
+‚à‚­‚Ä‚«
+‚±‚ñ‚©
+‚ӂ肾‚µ‚Ñ
+‚낤‚½‚¢
+‚䂤‚ ‚¢
+‚µ‚傤‚Æ‚è‚Ђ«
+‚Ç‚¤‚»‚¤‚¹‚¢
+‚±‚ß
+‚©‚è‚イ‚Ç
+‚Å‚ñ‚«‚å‚­
+‚ç‚¢‚΂é
+‚µ‚å‚è‚«
+‚¹‚¢‚³‚­
+‚Ä‚ñ‚¶‚­
+‚Å‚Á‚Ç
+‚ê‚ñ‚¶‚ã
+‚µ‚Á‚»
+‚°‚ñ‚Ô‚ñ
+‚½‚¿‚¢‚è‚«‚ñ‚µ
+‚ ‚¾
+‚¦‚‚炭
+‚¢‚Þ
+‚­‚é‚Ü
+‚°‚ñ‚¿‚傤
+‚µ‚傤‚Ë‚ñ
+‚݂‚¯
+‚±‚à‚ñ
+‚‚¤‚µ‚ñ‚µ‚á
+‚µ‚ñ‚©‚¢‚¿
+‚µ‚ñ‚©‚¢
+‚悱‚ß
+‚í‚ç
+‚±‚ñ‚Ç‚¤
+‚¹‚ñ‚³‚¢
+‚¤‚ç‚ñ
+‚͂₤‚Ü‚ê
+‚¬‚傤‚½‚¢
+‚Ë‚ñ‚Ï‚¢
+‚·‚¢‚à‚Ì
+‚¨‚­‚ª‚¢
+‚¯‚ñ‚©‚¢
+‚ ‚è‚イ
+‚Ó‚«‚イ
+‚ӂ‚©
+‚₯‚ ‚Æ
+‚Ä‚ñ‚Ë‚ñ‚µ‚å‚­
+‚»‚¦‚¶
+‚©‚¢‚Î
+‚´‚¢‚É‚ñ
+‚í‚¢‚â
+‚Ñ‚­‚½[
+‚¯‚ñ‚³‚µ‚Â
+‚â‚Ú‚¤
+‚ë‚©‚µ
+‚¾‚­‚Ð
+‚¢‚è‚傤‚Ù‚¤‚¶‚ñ
+‚¯‚ñ‚«
+‚¹‚¢‚Å‚ñ‚«
+‚°‚ñ‚©‚¢
+‚Ó‚«‚Ê‚¯
+‚ ‚¢‚©‚¬
+‚µ‚΂Ó
+‚¢‚¿‚Ý
+‚¿‚イ‚ª‚½‚«
+‚È‚¢‚µ‚ñ‚µ‚å
+‚¦‚«‚Å‚ñ
+‚Ђç‚Æ‚è
+‚©‚¢‚͂‚Ð
+‚©‚ñ‚Æ‚­‚µ‚å
+‚Ì‚¤‚³‚­
+‚¹‚ñ‚©‚­
+‚Ô‚µ‚イ‚¬
+‚¦‚ñ‚µ‚ñ‚è‚å‚­
+‚¿‚イ‚²‚­‚²
+‚Ä‚ê‚Ñ‚¶‚å‚ñ
+‚ ‚Ƃ肦
+‚³‚ñ‚¹‚¢‚¯‚ñ
+‚µ‚‚²
+‚΂©‚¸
+‚Ђ«‚イ
+‚©‚¢‚͂‚µ‚Â
+‚ ‚¢‚¯‚ñ
+‚Ì‚ç
+‚ç‚¢‚¿‚傤
+‚µ‚¯‚ñ‚©‚ñ
+‚¤‚¿
+‚½‚©‚³‚²
+‚°‚ñ‚·‚¢
+‚±‚ñ‚Ñ‚È[‚Æ
+‚¢‚¹‚¢
+‚É‚Ù‚ñ‚±‚­
+‚¤‚¦‚«
+‚Ô‚´
+‚µ‚ñ‚¯‚¢‚µ‚Â
+‚­‚ñ‚µ
+‚©‚¢‚¦‚ñ
+‚µ‚ñ‚Æ‚¤‚è‚Â
+‚²‚Í‚Á‚Ä‚ñ
+‚¿‚傤‚¶‚è
+‚»‚¤‚Æ
+‚¿‚傤‚±‚¤‚¹‚¢
+ƒ`
+‚µ‚ñ‚¼‚¤
+‚¹‚¯‚ñ‚µ‚炸
+‚ ‚¨‚à‚Ì
+‚±‚¤‚©
+‚¬‚á‚Á‚Õ
+‚©‚ñ‚Ä‚¢‚µ
+‚Ç‚¤‚Ä‚¢
+‚³‚­‚à‚Â
+‚±‚¤‚Ä‚Â
+‚Æ‚¤‚т傤
+‚ª‚¢‚Ü‚¢
+‚Ç‚ 
+‚Ù‚¤‚«‚イ
+‚è‚傤‚·‚¢
+‚Ä‚ñ‚è
+‚Í‚Æ‚ß
+‚©‚½‚·‚©‚µ
+‚¢‚Ù‚¤
+‚¿‚«‚傤
+‚¢‚â‚­‚«‚ñ
+‚É‚¶
+‚±‚ñ‚¹‚ñ‚Æ
+‚ׂñ‚²‚É‚ñ
+‚à‚Ì‚í‚ç‚¢
+‚ß‚ñ‚Ç‚¤
+‚΂­‚µ‚イ
+‚ЂƂ܂©‚¹
+‚Ƃ肵‚ç‚×
+ƒJ
+‚¸‚¢‚ЂÂ
+‚±‚¤‚¤‚è‚傤
+‚»[‚é
+‚±[‚Û‚ê[‚µ‚å‚ñ
+‚»‚¤‚¿
+‚É‚¶‚傤
+‚°‚ñ‚Ï‚Â
+‚¾‚ñ‚¢
+‚肱
+‚µ‚傤‚¯‚ñ‚Ô
+‚«‚ñ‚¿‚イ
+‚¨‚Æ‚µ‚Ê‚µ
+‚Æ‚­‚Í‚¢‚ñ
+‚ç‚¢‚ß‚¢
+‚±‚ñ‚¾‚Ä
+‚Í‚½‚¨‚è
+‚©‚¢‚ª‚¢‚ª‚©‚è
+‚·‚¢
+‚±‚¤‚Ô‚ñ
+‚µ‚ñ‚¶
+‚Ù‚¤‚»‚¤‚«‚å‚­
+‚ ‚«‚³‚ß
+‚Ô‚ñ‚©‚‚΂炢
+‚·‚È‚Î
+‚µ‚傶
+‚Ù‚ñ‚ë‚ñ
+‚°‚ñ‚ß‚ñ
+‚ ‚¢‚Ç‚é
+‚«‚©‚ñ
+‚½‚ñ‚¿‚«
+‚Ä‚­‚̂낶
+‚΂ ‚¢
+‚±‚‚܂­
+‚Í‚¢‚Å‚ñ
+‚Ô‚ñ‚Û‚¤
+‚©‚¢‚Å‚ñ
+‚Ü‚½‚µ‚½
+‚«‚イ‚«‚å
+‚Ó‚è[
+‚©‚Ý‚Ô‚­‚ë
+‚·‚Ò[‚Å‚¡
+‚Ä‚¢‚¨‚ñ
+‚¤‚Â
+‚ä‚©‚¤‚¦
+‚Ü‚­‚µ‚½
+‚³‚¢‚­‚ñ
+‚µ‚Ⴑ‚¤
+‚°‚Á‚©‚ñ‚µ
+‚¢‚ñ‚¬
+‚¿‚イ‚¹‚¢
+‚¹‚«‚É‚ñ‚©‚ñ
+‚µ‚³‚­‚Ђñ
+‚ª‚í
+‚©‚炤‚è
+‚·‚à‚¤
+‚¾‚¢‚â
+‚µ‚ã‚ñ‚Õ‚¤
+‚Ý‚é‚­
+‚Ó‚©‚¢‚©‚ñ
+‚µ‚ã‚í
+‚´‚±
+‚Ë‚ñ‚Ü‚­
+‚ç‚ñ‚©‚ñ
+ƒf
+‚Ó‚Ÿ[
+‚Í‚ñ‚ë
+‚Ù‚¤‚¯‚ñ
+‚¶‚«‚ЂÂ
+‚Å‚ñ‚Ä‚Â
+‚¦‚ñ‚»‚¤‚µ‚á
+‚Ý‚¬‚ß
+‚½‚¢‚Æ‚é
+‚´‚ñ‚Ë‚ñ
+‚¹‚­‚µ[
+‚©‚¯‚Í‚µ
+‚¦‚ñ‚·‚¢
+‚ ‚ç‚¢‚´‚ç‚¢
+‚µ‚ã‚Á‚Ï‚ñ‚µ‚á
+‚½‚¤
+‚¦‚ñ‚´‚¢
+‚³‚¬‚傤‚è‚傤
+‚Ђª‚µ‚Í‚ñ‚«‚イ
+‚à‚­‚ê‚ñ
+‚Ý‚¯‚Â
+‚±‚¤‚«‚傤
+‚Ä‚¢‚¢‚ñ
+‚µ‚ª‚­‚¯‚¢
+‚©‚ñ‚´‚¢‚É‚ñ
+‚Æ‚­‚¾‚ñ
+‚­‚¶‚イ
+‚©‚¢‚¤‚ñ
+‚©‚­‚¹‚ñ‚»‚¤
+‚ª‚¿‚傤
+‚ß‚¢‚¬‚¶‚傤
+‚ª‚¢‚¿‚イ
+‚Ä‚¨‚­‚ê
+‚©‚¢‚Ç‚¤
+‚¸‚¢
+‚«‚傤‚µ‚イ
+‚Þ‚¶
+‚ê‚ñ‚Ë‚ñ
+‚º‚Á‚«‚傤
+‚Ò‚ñ‚Æ
+‚µ‚Ö‚ñ‚¯‚¢
+‚«‚ñ‚Ý‚á‚­
+‚‚ç‚ç
+‚ׂÁ‚҂傤
+‚°‚«‚µ‚ñ
+‚Æ‚¤‚¹‚Â
+‚½‚¢‚Ð
+‚±‚ë‚à
+‚¿‚Ý
+‚°‚ñ‚¹‚ñ
+‚肱‚¤‚ª‚­
+‚¦‚ñ‚Ä‚ñ‚©
+‚¿‚¦‚Ô‚­‚ë
+‚µ‚ª‚­‚©
+‚¨‚¤‚¶
+‚Þ‚Á‚µ‚ã[
+‚µ‚イ‚è‚Ð
+‚â‚­‚Æ‚­
+‚«‚ñ‚®
+‚»‚ñ
+‚É‚¿‚悤‚Ђñ
+‚²‚Ä
+‚΂¢‚±‚­
+‚Þ‚­‚¿
+‚Ђ²‚¤
+‚½‚è‚イ
+‚ ‚ç‚è
+‚­‚¤‚º‚ñ
+‚Ý‚¹‚à‚Ì
+‚­‚³
+‚Ç‚Á‚®
+‚³‚¢‚µ‚ñ‚©‚ñ
+‚½‚¢‚т傤
+‚©‚ç‚Þ
+‚²‚тイ
+‚¬‚µ‚傤‚´‚¢
+ƒG
+‚Ç‚¤‚­
+‚µ‚ã‚­‚¶
+‚܂‚â‚Ü
+‚í‚«‚â‚­
+‚È‚ñ‚«‚å‚­
+‚‚ꂠ‚¢
+‚Ђ‚ڂ­
+‚¨‚­‚肶‚傤
+‚΂ñ‚«‚ñ
+‚·‚«
+‚¢‚ª‚­
+‚¦‚¢‚悤‚»
+‚Í‚È‚³‚«
+‚Å‚ñ‚è‚イ‚¯‚¢
+‚â‚Ü‚â‚Ü
+‚ä‚Õ‚µ‚ë‚ñ
+‚ß‚ñ‚Æ
+‚±‚¤‚È‚¢
+‚¨‚à‚ä
+‚¹‚Á‚³‚­
+‚¹‚¢‚°‚ñ
+‚¹‚¢‚Ù‚¤‚¯‚¢
+‚Æ‚ë‚Ó‚¡[
+‚´‚¢‚ç‚¢
+‚Æ‚ê[‚ç
+‚Ó‚«‚»
+‚΂ñ‚Ä
+‚¹‚ñ‚¶‚©
+‚©‚ׂñ
+‚Ђ‚¶‚ã‚Ђñ
+‚Ý‚¸‚ ‚ß
+‚Ù‚¤‚é‚¢
+‚΂ñ‚Ñ
+‚¤‚¿‚Ú‚è
+‚ ‚Æ‚ª‚Ü
+‚³‚­‚Ë‚ñ
+‚¦‚¢‚Ó‚Â
+‚Í‚¢‚¦‚¢
+‚Æ‚¢‚¤
+‚‚«‚ׂÂ
+‚«‚å‚­‚ª‚¢
+‚悤‚낤
+‚Ñ‚¹‚¢
+‚°‚ñ‚³‚ñ
+‚³‚¢‚¾‚¢‚°‚ñ
+‚è‚傤‚Ë‚ñ
+‚©‚®‚¿‚傤
+‚·‚ñ‚º‚ñ
+‚«‚í
+‚Ó‚ñ‚¶‚ñ
+‚ê[‚·
+‚Ü‚ñ‚Ë‚ñ‚ê‚¢
+‚¹‚ñ‚¾‚Â
+‚Ý‚¸‚³‚«
+‚µ‚Í‚ç‚¢‚«
+‚±‚¤‚Ý‚á‚­
+‚ê‚Å‚¡[
+‚¿‚イ‚¨‚¤‚¿
+‚à[‚½[
+‚¤‚Ý‚¹‚ñ‚â‚Ü‚¹‚ñ
+‚í‚­‚È‚¢
+‚Ђñ‚¯‚Â
+‚¶‚Ü‚Ü
+‚¨‚à‚¢‚Ì‚Ù‚©
+‚Ó‚Ý‚ñ
+‚·‚¤‚Ù‚ñ
+‚‚¤‚¿‚Ú
+‚¯‚¢‚©‚ñ
+‚·‚¶
+‚Æ‚¤‚ª‚¢
+‚¿‚イ‚¹‚Â
+‚Þ‚Ù‚¤
+‚¯‚µ
+‚³‚©‚³‚Ü
+‚¢
+‚µ
+‚¯‚ç‚¢
+‚¨[‚Æ‚Ü
+‚Ù‚ñ‚µ‚å‚­
+‚¦‚¢‚悤‚µ
+‚½‚¢‚È‚¢
+‚©‚µ‚ç
+‚±‚Ü
+‚µ‚ズ‚¢
+‚®‚¤‚¼‚¤
+‚©‚¿‚傤‚«‚ñ
+‚»‚Å
+‚«‚½‚­
+‚¶‚ゼ‚¤‚«
+‚²‚¹‚¢‚¤‚ñ
+‚±‚¤‚µ‚Ç
+‚¤‚¦
+‚Ë‚Á‚Æ‚í[‚­
+‚Í‚­‚Ú
+‚ê‚¢‚µ‚Â
+‚ׂÁ‚±‚¤
+‚Ó‚­‚»‚¤
+‚¢‚«‚í‚©‚ê
+‚Õ‚ê
+‚¿‚¬‚å
+‚¿‚¢
+‚Ó‚¤‚µ‚å
+‚Ì‚Ý‚â
+‚­‚¿‚·‚¤
+‚«‚傤‚¢‚­‚Ô
+‚肪‚­‚Ô
+‚͂‚łñ‚µ‚å
+‚¿‚傳‚Á‚¯‚ñ
+‚Þ‚é‚¢
+‚©‚Á‚±‚­
+‚䂤‚¢‚ñ
+‚¢‚¦‚à‚Æ
+‚Þ‚©‚µ‚©‚½‚¬
+‚»‚¤‚¾
+‚ ‚ß
+‚ ‚ñ‚Ë‚¢
+‚®‚ñ‚Í‚Â
+‚è‚å‚©‚­‚¹‚ñ
+‚Ä‚¢‚¿‚傤
+‚¹‚ñ‚¦‚¢
+‚¢‚«
+‚ß‚â‚·
+‚±‚±‚ë‚¢‚ê
+‚Ђ¶‚傤‚¹‚ñ
+‚Õ
+‚¢‚Á‚¹‚¢
+‚킳‚Ñ
+‚¤‚«‚Ú‚è
+‚©‚½‚Ñ‚ç
+‚Ú‚Ð
+‚¤‚è
+‚䂤‚¯‚¢
+‚ß‚¢‚µ‚傤
+‚Ý‚Á‚Æ
+‚¯‚¢‚¶‚©
+‚킹‚¢
+‚º‚ñ‚Õ‚­
+‚«‚¼‚ñ
+‚µ‚é
+‚¨‚ñ‚«‚傤
+‚µ‚¶‚ñ
+‚ ‚ñ‚º‚ñ‚¹‚¢
+‚¶‚å[‚©[
+‚«‚á‚­‚·‚¶
+‚µ‚ã‚©‚¢
+‚©‚ñ‚¹‚‚º‚¢
+‚½‚Ë‚¤‚µ
+‚¶‚ã‚ñ‚¶‚傤
+‚µ‚ñ‚¿‚á
+‚Ô‚ñ‚©‚¢
+‚²‚¹‚ñ‚¼
+‚³‚í
+‚à‚¶‚Ç‚¨‚è
+‚í‚©‚¼‚¤
+‚¯‚ñ‚Û
+‚©‚ñ‚±‚¤‚¿‚傤
+‚Ý‚º‚ñ‚¯‚¢
+‚Ä‚ñ‚«
+‚³‚©‚â
+‚½‚®‚¢
+‚«‚Æ‚¤
+‚±‚Þ‚¬
+‚·‚¢‚Ä‚¢
+‚·‚¢‚»‚¤
+‚ ‚é‚Ó‚Ÿ‚ׂÁ‚Æ
+‚±‚¤‚©‚¢
+‚©‚ê[
+‚Ö‚¢‚¶‚傤
+‚¹‚¢‚¯‚Â
+‚«‚á‚ñ‚΂·
+‚«‚á‚­‚Ù‚ñ
+‚©‚«‚Í‚ñ
+‚­‚ë‚©‚Ý
+‚¿[‚Þ
+‚­‚É‚­
+‚Æ‚¤‚µ‚©
+‚Æ‚«‚Ç‚«
+‚¦‚Ò‚»[‚Ç
+‚¿‚イ‚Ý‚Â
+‚ª‚è‚傤‚Ä‚ñ‚¹‚¢
+‚©‚¢‚¢‚ñ
+‚¨[‚Å‚¡‚µ‚å‚ñ
+‚ׂ¢‚¦‚¢
+‚¨‚¤‚¶‚ã
+‚¢‚Á‚±‚¤
+‚¶‚Þ‚©‚ñ
+‚Ԃ‚肪‚­
+‚Ú‚¤‚¦‚¢‚¿‚傤
+‚µ‚イ‚µ‚Ó
+‚Ì‚¤‚â‚­
+‚¨‚É‚ª‚í‚ç
+‚´‚¿‚傤
+‚³‚¢‚µ‚å‚­
+‚ä‚ ‚Â
+‚т傤‚°‚ñ‚«‚ñ
+‚Æ‚­‚Æ‚¤
+‚©‚½‚è
+‚Ђ¤‚¿
+‚Ú‚¤‚è
+‚°‚è‚ç
+‚¹‚ñ‚ڂ‚µ‚á
+‚Ђ傤‚µ‚傤‚¶‚å
+‚¹‚Á‚½‚­
+‚¯‚¢‚Ù‚¤
+‚Ì‚ê‚ñ
+‚¦‚¢‚³‚¢
+‚µ‚å‚­‚Ì‚¤
+‚Ý‚¸‚Ñ‚½‚µ
+‚Í‚ª‚½
+‚¹‚‚т¶
+‚Ђ傤‚°‚ñ
+‚»‚Æ‚©‚×
+‚à‚Ì‚¨‚«
+‚Ê‚¢‚µ‚ë
+‚»‚¤‚µ‚ñ‚«
+‚°‚‚悤‚Ñ
+‚ç‚¢‚Ó
+‚±‚±‚낪‚Ü‚¦
+‚­‚¤‚Í‚­
+‚ª‚ñ‚è‚傤
+‚Æ‚à‚¦
+‚©‚©‚è‚¿‚傤
+‚¹‚©‚ñ‚Ç
+ƒk
+‚¾‚¢‚¿‚傤
+‚µ‚ã‚ñ‚©‚µ‚イ‚Æ
+‚è‚傤‚¿
+‚Å‚ñ‚«‚イ
+‚ЂÑ
+‚䂵‚ã‚‚ª‚©‚è
+‚­‚¨[‚½[
+‚¦‚¢‚Ù‚ñ
+‚¹‚Á‚¯‚¢‚Ô
+‚Ђ±‚¤‚µ‚«
+‚¿‚傤‚©‚½‚é
+‚Ü‚¦‚킽‚µ‚«‚ñ
+‚»‚Å‚®‚¿
+‚¬‚á‚ë‚Á‚Õ
+‚Å‚ñ‚µ‚«‚«
+‚ ‚¢‚Ñ‚«
+‚¿‚傤‚³‚µ‚Â
+‚â
+‚µ‚ñ‚±‚¤
+‚Ú‚¤‚¨‚ñ‚´‚¢
+‚Ԃ邶‚å‚í
+‚½‚ñ‚­
+‚à‚ñ‚҂傤
+‚ӂ悤‚¶‚傤
+‚·‚¢‚¿‚å‚­
+‚¹‚ñ‚¶‚ã‚Â
+‚¹‚Á‚µ
+‚ë‚ñ‚¿‚傤
+‚¢‚Á‚¿‚イ‚â
+‚Ì‚¤‚Ù‚¤
+‚Ђñ‚±‚ñ
+‚É‚ñ‚¿
+‚¿‚イ‚µ‚ñ‚¹‚ñ
+‚µ‚á‚䂤
+‚©‚Ä‚¢
+‚悤‚µ
+‚à‚Æ
+‚¢[
+‚©‚«‚Æ‚è
+‚¯‚ ‚È
+‚Ü‚´[
+‚Ù‚¤‚µ‚傤‚«‚ñ
+‚â‚Æ‚¢‚Ê‚µ
+‚·‚¦‚Á‚±
+‚¨‚­‚»‚±
+‚¯‚ñ‚΂¢‚«
+‚Æ‚ñ‚¶
+‚¶‚イ‚¶
+‚Ä‚¢‚µ‚«
+‚Ü‚ñ‚¶‚イ
+‚©‚킼‚±
+‚¶‚¿‚©‚¢
+‚­‚è‚¢‚ë
+‚¶‚å‚Ü‚­‚µ‚«
+‚ß‚¢‚Æ
+‚Ý‚È‚Ý
+‚±‚¢‚ñ
+‚±‚¤‚¹‚¢‚Ì‚¤
+‚¨‚¨‚¸‚à‚¤
+‚·‚ñ‚т傤
+‚©‚ñ‚ê‚¢‚º‚ñ‚¹‚ñ
+‚³‚Í‚ñ‚¶
+‚ ‚©‚µ
+‚¹‚í‚â‚­
+‚¬‚è
+‚¯‚ñ‚³‚‚¿‚傤
+‚Ë‚­‚½‚¢
+‚æ‚Ñ‚È
+‚«‚ñ‚¶‚å
+‚¨‚µ‚¢‚ê
+‚‚‚ʂ¯
+‚³‚ñ‚ª‚­
+‚â‚Ü‚Ô‚µ
+‚­[‚ç
+‚µ‚ã‚Á‚¹‚¢‚è‚Â
+‚¨‚邪‚ñ
+‚½‚¢‚µ‚傤
+‚µ‚½‚‚ÂÝ
+‚Ô‚ñ‚¿‚傤
+‚Æ‚­‚µ
+‚Ö‚ñ‚µ‚イ‚µ‚Â
+‚¿‚å‚Á‚Æ
+‚²‚è‚傤‚µ‚ñ
+‚炶‚ã[‚Þ
+‚©‚¦‚¾‚Ü
+‚¢‚Ç‚¤‚¹‚¢
+‚¹‚¢‚Ù‚ñ
+‚Ó‚é
+‚«‚傤‚µ‚Â
+‚æ‚Ä‚¢‚Ђ傤
+‚悱‚­‚Ö‚ñ
+‚Ì‚¤‚µ‚ã‚Á‚¯‚Â
+‚Ó‚ß‚¢‚æ
+‚¶‚イ‚Ý‚ñ‚º‚¢
+‚悤‚ª‚­
+‚Ó‚«
+‚Ü‚ñ‚Ü‚é
+‚¿‚傤‚¹‚«
+‚©‚É‚­
+‚»‚Á‚«‚ñ
+‚É‚Á‚µ‚á
+‚¢‚¿‚¶‚«‚ñ
+‚‚è[
+‚µ‚イ‚«‚イ
+‚ ‚ñ‚¾[
+‚Ì‚è‚Æ
+‚¶‚ñ‚¦‚¢
+‚Ђµ‚á‚­
+‚¦‚Á‚¶
+‚¦‚«‚¢‚ñ
+‚â‚Ü‚×
+‚¢‚ñ‚³‚‚«
+‚µ‚á‚¢‚ñ
+‚»‚¿‚ç
+‚¾‚ñ‚½‚¢
+‚¶‚傤‚Ë‚Â
+‚â‚Ü‚¢
+‚ ‚Ä
+‚ê‚Ó
+‚¶‚ñ‚¶‚ã‚Â
+ƒe
+‚È‚Ü‚«‚¸
+‚³‚­‚¹‚ñ
+‚¦‚ñ‚Ø‚¢
+‚Þ‚æ‚­
+‚ ‚ñ‚¾[‚ç‚¢‚ñ
+‚¨‚Á‚­‚¤
+‚³‚ñ‚©‚Á‚¯‚¢
+‚²‚«‚°‚ñ‚悤
+‚¿‚á‚­‚µ
+‚¶‚ñ
+‚Ç‚©‚ñ
+‚©‚­‚µ‚á
+‚³‚ñ‚Ó‚¶‚ñ‚©
+‚т悤‚µ
+‚»‚ꂾ‚¯
+‚¢‚낯
+‚³‚Æ‚¤
+‚¤‚ñ‚Ï‚ñ‚«
+‚±‚­‚³‚ñ‚µ‚á
+‚悤‚Ù‚¤
+‚Ä‚©‚ª‚Ý
+‚Í‚­‚悤
+‚³‚¢‚±‚¤‚³‚¢
+‚±‚Á‚Ï
+‚©‚¢‚¶‚イ
+‚¦‚Ü‚«‚à‚Ì
+‚Ђñ‚±‚¤
+‚Æ‚Á‚¿‚á‚ñ
+‚©‚°‚Þ‚µ‚á
+‚¢‚è‚Ð
+‚½‚¢‚Ë‚Â
+‚Í‚Ç‚¤
+‚Ü‚¬‚í
+‚¦‚±‚Ì‚Ý‚·‚Æ
+‚·‚Å
+‚¾‚Ô‚é
+‚µ[‚¸‚ñ
+‚µ‚Á‚½‚¢
+ƒH
+‚Ç‚ë‚Ú‚¤
+‚䂤‚Ñ‚ñ‚Ô‚Â
+‚ç‚ñ‚¿‚傤
+‚°‚ñ‚ª‚¢
+‚®‚Á‚Ç
+‚æ‚Á‚©
+‚·‚½‚Á‚­
+‚悱‚¤
+‚©‚µ‚Ù‚ñ
+‚Ђä
+‚Ý‚Ù‚ñ
+‚ç‚¢‚½[
+‚Ü‚È‚´‚µ
+‚Ç‚µ‚á
+‚­‚ç‚Á‚©[
+‚¨‚­‚Î
+‚µ‚­‚ç‚ß‚ñ
+‚Ø[‚Ï[
+‚Í‚­‚ç‚¢
+‚¤‚Ü‚²‚â
+‚½‚©‚ç‚­‚¶
+‚Ú[‚Æ
+‚ ‚­‚Ä‚ñ‚±‚¤
+‚Ó‚«‚ñ‚µ‚ñ
+‚Ó‚»
+‚¿‚ñ‚¾‚ñ
+‚µ‚Ü‚©‚°
+‚¦‚ñ‚»‚¤‚©‚¢
+‚Û[‚Æ
+‚Í‚½‚ª‚µ‚ç
+‚ä‚ß‚¶
+‚é‚‚Ú
+‚Ó‚Ý‚«‚è
+‚¾‚¢‚´
+‚«‚°‚ñ
+‚Å‚ñ‚˂‚«
+‚¾‚¢‚µ‚á
+‚±‚Á‚©‚¢
+‚«‚傤‚µ‚ñ‚µ‚傤
+‚´‚‚Þ
+‚³‚ñ‚¹‚¢
+‚Ђª‚¯
+‚ ‚½‚¢
+‚¢‚í‚Í‚¾
+‚䂤‚«
+‚à‚ç‚¢
+‚¦‚«‚¿‚イ
+‚Ç‚«‚ã‚ß‚ñ‚½‚è
+‚Ü[‚¯‚Á‚Ä‚¡‚ñ‚®
+‚µ‚傤‚Þ
+‚²‚¤‚΂ñ
+‚ ‚©
+‚ë[‚½‚è[
+‚¿‚Ù‚¤‚΂ñ
+‚±‚ñ‚Ë‚ñ
+‚µ‚傤‚½‚¢
+‚ׂñ‚²‚µ
+‚ꂱ[‚Ç
+‚Ù‚ñ‚¯‚ñ
+‚Ó‚§[‚©‚·
+‚±‚ª‚½‚«
+‚»‚Ì
+‚Ý‚¸‚½‚«
+‚Æ‚æ
+‚Ñ‚¹‚¢‚Ô‚Â
+‚Í‚¢‚¯‚¢
+‚·‚Æ‚ê‚·
+‚Í‚È‚Þ‚±
+‚¿‚イ‚«‚イ
+‚¨‚ñ‚ç‚¢‚ñ
+‚µ‚¨‚¯
+‚±‚±‚ñ
+‚¤‚Á‚½‚¦
+‚©‚«‚ñ
+‚Í‚ñ‚¸
+‚³‚Þ‚´‚Þ
+‚Æ‚Ñ‚±‚Ý‚¾‚¢
+‚¢‚¿‚Ç‚¤
+‚à‚à
+‚Ü‚ñ‚¶‚サ‚á‚°
+‚¶‚傤‚±‚ñ
+‚«‚®‚ç‚¢
+‚®‚Ü‚¢
+‚«‚ñ‚¢‚Á‚Õ‚¤
+‚ЂƂ²‚Ý
+‚¹‚Ú‚Ë
+‚¶‚ã‚ñ‚¦‚«
+‚ ‚ç‚«
+‚²‚è‚ç
+‚Ç‚¤‚¼‚­
+‚¹‚¢‚¦‚«
+‚à‚¤‚«‚ñ
+‚©‚½‚Í‚ç‚¢‚½‚¢
+‚ê‚¢‚°‚Â
+‚¶‚ク‚ñ‚Ђ傤
+‚«‚á‚ñ‚Å‚¡
+‚©‚Ý‚ª‚½
+‚Æ‚µ
+‚à‚­‚ ‚Ý
+‚悤‚ª‚ñ
+‚¶‚イ‚¨‚¤
+‚Ç‚¤‚·‚¤
+‚¶‚イ‚¾‚¢
+‚º‚¢‚©‚ñ
+‚Í‚¾‚Ý
+‚²[‚·‚Æ
+‚悤‚Ú
+‚â‚Í‚ñ
+‚¤‚邤
+‚¿‚傤‚È‚ñ
+‚©‚¶‚Â
+‚¢‚«‚¤‚‚µ
+‚¯‚¢‚Ñ‚¢‚ñ
+‚΂ñ‚Ç
+ƒT
+‚­‚‚µ‚½
+‚¬‚å‚»‚ñ
+‚¨‚Á‚Æ
+‚©‚¯‚ª‚Ë
+‚Ü‚Ô‚½
+‚Ú‚º‚ñ
+‚Ñ‚æ‚­
+‚¨‚É‚¢‚¿‚á‚ñ
+‚Â[‚é
+‚ä‚ 
+‚È‚ª‚â
+‚ß‚¢‚ñ
+‚ê‚¢‚¦‚ñ
+‚Ï‚ç‚ß[‚½
+‚µ‚イ‚°‚ñ
+‚Ù‚ñ‚«‚ñ
+‚µ‚«‚è
+‚Í[‚Ç‚¤‚¥‚ 
+‚ß‚©‚½
+‚䂤‚©
+‚¿‚·‚¢
+‚¶‚傤‚ê‚ñ
+‚½‚ñ‚Õ‚­
+‚ß‚¢‚µ‚å
+‚¿‚á[‚Æ
+‚¦‚¢‚¢
+‚è‚Á‚­
+‚¿‚イ‚Æ‚¤‚©
+‚¶‚ã‚ñ‚ß‚ñ
+‚Ô‚ñ‚â
+‚Ƃ肱
+‚¤‚ß‚¸
+‚°‚ñ‚µ‚©‚­
+‚È‚Ó‚¾
+‚炽‚¢
+‚­‚¤‚ê‚¢
+‚¯‚Þ‚µ
+‚»‚¤‚¾‚ñ‚µ‚å
+‚·‚Ý‚¦
+‚¢‚Þ‚©
+‚Ð[‚½[
+‚´‚Á‚Ò
+‚ ‚³‚Á‚Ä
+‚«‚イ‚ç‚¢
+‚䂤‚è‚å‚­‚µ‚á
+‚µ‚á‚Þ‚µ‚å
+‚­‚µ‚ª‚½
+‚«‚å‚ß‚¢
+‚æ‚Ñ‚¾‚µ
+‚â‚Ô
+‚ЂƂ΂ñ
+‚»‚ñ‚¬
+‚Ä‚ñ‚Ë‚ñ‚Æ‚¤
+‚¢‚µ‚á
+‚ß‚ñ‚悤
+‚­‚«
+‚«‚á‚Á‚Õ
+‚±‚¤‚¿‚µ‚å
+‚±‚¤‚Ђ傤
+‚¤‚è‚©‚¯
+‚©‚ñ‚Ô‚ñ
+‚µ‚«‚ñ‚°‚ñ
+‚½‚±‚¤‚µ‚«
+‚è‚傤‚¢‚«
+‚悼‚ç
+‚µ‚傤‚Ó
+‚»‚¤‚¯
+‚Ó‚ê[‚Þ
+‚¿‚イ‚Æ‚¤
+‚¾‚¢‚É‚Ô
+‚µ‚Ì‚Ì‚ß
+‚‚肠‚¢
+‚µ‚ñ‚³‚¢
+‚ä[‚·
+‚Ó‚¶‚ñ
+‚©‚©‚è
+‚¶‚±‚è‚Â
+‚¹‚é‚ë‚¢‚Ç
+‚½‚¶
+‚Þ‚¢‚Ý
+‚Ý‚É‚±‚ñ
+‚µ‚å‚­‚Ð
+‚­‚§[‚Â
+‚‚¤‚±‚¤
+‚¦‚ª‚ç
+‚±‚Ë
+‚Ù‚¯‚ñ‚µ‚á
+‚©‚·‚Ý
+‚«‚傤‚«‚ñ
+‚¯‚ñ‚Ñ‚«‚傤
+‚Ý‚¬‚Ä
+‚Ó‚©
+‚µ‚債‚ã‚ñ
+‚¤‚ç‚Ç‚¨‚è
+‚ ‚¨‚¢‚«‚Æ‚¢‚«
+‚»‚¤‚´‚¢
+‚Ó‚§[
+‚¢‚µ‚á‚è‚傤
+‚Ü‚æ‚È‚©
+‚¨‚¢
+‚¨‚«‚á‚­
+‚·‚­[‚½
+‚¢‚¦‚«
+‚¨‚©‚í‚è
+‚Ó‚¦
+‚¢‚ñ‚Ƃ낾‚­‚µ‚å
+‚±‚¤‚Ñ
+‚©‚¢‚«‚イ
+‚¬‚Ó‚ñ
+‚ ‚­‚¹‚ñ‚Æ
+‚«‚±‚¤
+‚ ‚é‚Ó‚Ÿ‚¹‚ñ
+‚Ý‚³‚¢
+‚¹‚¢‚©‚¢‚¢‚ñ
+‚Å‚¡‚Ä[‚é
+‚µ‚å‚­‚悤
+‚è‚«‚µ
+‚ ‚­‚½
+‚܂߂‚Ô
+‚¨‚µ‚¦
+‚¦‚è
+‚¹‚«‚Ë‚ñ
+‚è‚傤‚­‚¤
+‚Í‚¢‚ ‚ñ
+‚°‚¾‚ñ
+‚µ‚傤‚Ú‚¤‚µ‚å
+‚Ü‚È‚Â
+‚³‚©‚è‚Î
+‚Æ‚¤‚ß‚¢‚±‚¤‚»‚­
+‚«‚á‚­‚Ù‚ñ‚©
+‚Ù‚­‚µ‚ñ
+‚¹‚¢‚¬‚å‚«
+‚Ú‚¤‚ê‚¢
+‚±‚ñ‚³‚é‚Ä‚¡‚ñ‚®
+‚낤‚©
+‚ß‚¢
+‚Ä‚«‚´‚¢
+‚©‚ñ‚Õ‚«‚ñ
+ƒE
+‚©‚ª‚­
+‚䂦
+‚²‚ª‚©‚è
+‚ë‚ñ‚Ô‚ñ
+‚Ђª‚³
+‚ä‚°
+‚Æ
+‚³‚ñ‚»‚ñ
+‚Ì‚¤‚«‚®
+‚»[‚Æ
+‚²‚±‚¤‚Í‚¢
+‚½‚¢‚±‚¤‚Ú‚¤
+‚¨‚©‚°
+‚à‚Á‚Ä‚±‚¢
+‚¹‚¢‚¶‚傤
+‚¢‚Á‚µ‚イ
+‚Ë‚ñ‚ç‚¢
+‚Ý‚Á‚Ç‚È‚¢‚Æ
+‚Ù‚¤‚¶‚傤‚¦
+‚ ‚ç
+‚ɂイ‚¶‚傤‚¯‚ñ
+‚½‚ñ‚¶‚¥‚ñ‚Æ
+‚©‚ñ‚¾‚¢
+‚т傤‚µ‚傤
+‚²‚­
+‚µ‚イ‚΂ñ
+‚©‚­‚´‚¢
+‚ê‚·‚è‚ñ‚®
+‚µ‚傱‚¤
+‚·‚è‚«‚¸
+‚䂤‚©‚¢
+‚±‚¤‚»‚µ‚ñ
+‚°‚«‚è‚イ
+‚Ô‚è‚Á‚¶
+‚¨‚­‚½[‚Ô
+‚µ‚á‚ê
+‚¹‚¢‚ê‚¢
+‚·‚Ø‚¢‚ñ‚²
+‚«‚ë
+‚Ç‚¤‚Ä‚ñ
+‚¶‚イ‚ ‚Â
+‚¨‚µ‚ë‚¢
+‚Ђɂ傤‚«
+‚¦‚˂邬[
+‚Å‚¡‚ê‚­‚Æ‚è
+‚Ô‚ñ‚©‚¶‚ñ
+‚ª‚¢‚Ë‚ñ
+‚Æ‚¤‚¯‚¢
+‚½‚Ö‚ñ‚¯‚¢
+‚Ñ‚ç
+‚µ‚Ä‚Â
+‚±‚¤‚¬‚傤
+‚È‚í‚Æ‚Ñ
+‚Æ‚ç‚Á‚­
+‚µ‚傤‚¶‚ã‚ñ
+‚ ‚¢‚»‚­
+‚ß‚¢‚¢
+‚ׂñ‚Ü‚­
+‚‚¤‚¶‚ñ
+‚±‚ñ‚Ä‚¢
+‚Ù‚Á‚±‚­
+ƒz
+‚܂‚°
+‚à‚Ì
+‚¶‚傤‚¯‚ñ
+‚¯‚ñ‚½‚¢‚©‚ñ
+‚͂‚ª‚ñ
+‚¶‚«‚Å‚µ
+‚¼‚¤‚à‚Â
+‚ª‚¢‚µ‚á
+‚Ø‚µ‚Ý‚·‚Æ
+‚Æ‚Á‚±‚¤
+‚䂸
+‚²‚±‚¤‚¢
+‚Æ‚¤‚Ђ傤‚¶‚å
+‚²‚¯‚ñ‚±‚¤
+‚¬‚ñ‚Ä‚ñ
+‚µ‚½‚¶
+‚Ù‚¤‚±‚­
+‚Ó‚µ‚傤‚¶
+‚¢‚¿‚ª‚Â
+‚³‚ñ‚¾‚ñ‚Æ‚Ñ
+‚¹‚¢‚ׂÂ
+‚ ‚¢‚¼‚¤
+‚³[‚©‚·
+‚¨‚¢‚±‚Ý
+‚Ù‚ñ‚³‚¢
+‚µ‚å‚Á‚¯‚ñ
+‚«‚ñ‚Ä‚«
+‚Ó‚¶‚¾‚È
+‚Ä‚³‚°
+‚µ‚傤‚¶‚ñ
+‚䂤‚¬
+‚µ‚á‚è‚傤
+‚«‚傤‚Ä‚ñ
+‚Ç‚©‚½
+‚©‚ñ‚è‚傤
+‚Ƃ΂è
+‚²‚΂ñ
+‚æ‚Ô‚ñ
+‚΂ñ‚ª‚­
+‚Ä‚¢‚³‚¢
+‚¹‚«‚¸‚¢
+‚Ì‚¤‚«‚傤
+‚¶‚ã‚è‚傤‚µ‚å
+‚ׂÁ‚»‚¤
+‚΂¢‚«‚ñ
+‚ë[‚¸
+‚É‚¤‚²‚«
+‚¹‚½‚¢
+‚©‚­‚悤
+‚¨‚è‚©‚¦‚µ
+‚¦‚ñ‚«‚å‚è
+‚Æ‚¤‚È‚ñ
+‚©‚ñ‚Å‚ñ‚¿
+‚È‚Ý‚¹‚¢
+‚Ä[‚Ô‚é
+‚®
+‚±‚¤‚»‚­
+‚µ‚ñ‚¢‚«
+‚©‚°‚®‚¿
+‚©[‚Ë[‚µ‚å‚ñ
+‚¢‚Ô‚ñ
+‚¨‚¤‚²‚ñ
+‚ ‚Ԃ炳‚µ
+‚Ù‚ñ‚Ô‚ñ
+‚¨‚ñ‚®‚·‚Æ‚ë[‚Þ
+‚ª‚­‚ß‚ñ
+‚悱‚È‚ª
+‚É‚í‚©‚ ‚ß
+‚±‚悤
+‚µ‚イ‚¿‚傤
+‚¶‚ã‚­‚µ
+‚±‚Ì‚Í
+‚É‚Á‚«
+‚Ù‚¦‚«
+‚Ä‚¢‚΂ñ
+‚΂ñ‚µ‚イ
+‚µ‚Ⴙ‚Â
+‚Þ‚è
+‚°‚´
+‚Þ‚¦‚ñ‚½‚ñ
+‚¿‚傳‚­‚Ô‚Â
+‚É‚Á‚©
+‚¾‚ñ‚è‚å‚­
+‚ɂイ‚悤
+‚Ó‚­‚·‚¤
+‚º‚ñ
+‚³‚Æ‚è
+‚©‚®‚ç
+‚â‚Ü‚Í‚¾
+‚¦‚¢‚²
+‚·‚¢‚è‚傤
+‚Ó‚¡‚ç‚ß‚ñ‚Æ
+‚Ä‚ñ‚ɂイ‚Æ‚Ç‚¯
+‚à‚¿‚«‚è
+‚°‚ñ‚¹‚«
+‚«‚¶‚イ‚«
+‚«‚傤‚¶‚ã‚‚µ‚å
+‚¤
+‚è‚ñ‚ª‚­
+‚Í‚¢‚Æ‚­
+‚©‚¢‚݂傤
+‚ꂵ[‚Î
+‚±‚¤‚®‚¤
+‚Ë‚ñ‚²‚¤
+‚©‚¢‚º‚é
+‚©‚È‚è‚ 
+‚ç‚¢‚°‚Â
+‚«‚½‚©‚º
+‚Í‚¢‚Ђñ
+‚µ‚ç‚ä‚è
+‚©‚킵‚à
+‚¨‚è‚Âß
+‚©‚¦‚é
+‚Ë‚Á‚Æ‚¤
+‚²‚µ‚å
+‚µ‚ñ‚Õ‚­
+‚°‚ñ‚·‚¢‚΂­
+‚µ‚ñ‚®‚¤
+‚µ‚¶‚Ü
+‚Ù[‚Õ
+‚«‚Ê‚¢‚Æ
+‚Ä‚¢‚ª‚­
+‚ß‚¢‚æ
+‚¶‚イ‚¾‚ñ
+‚¹‚¢‚è‚イ
+‚µ‚ã‚ñ‚³‚¢
+‚¢‚Ô‚ñ‚µ
+‚ê‚«‚¹‚ñ
+‚ ‚¢‚¿‚傤
+‚µ‚å‚­‚Ԃ‚ª‚­
+‚½‚­‚ë‚ñ
+‚©‚ñ‚҂傤
+‚Ƃ肦
+‚Ó‚­‚¬‚¿‚傤
+‚ ‚¢‚¢‚ë
+‚°‚¢‚¬
+‚¦‚­‚·‚Õ‚ê‚·
+‚è‚傤‚Í
+‚䂤‚Ù‚¤
+‚í[‚Ç
+‚¯‚ñ‚µ‚イ‚µ‚å
+‚±‚ñ‚µ‚ã[‚Ü[
+‚µ‚½‚¶‚«
+‚±‚¤‚¤
+‚ ‚Æ‚«‚ñ
+‚µ‚ë‚Ý
+‚µ‚ñ‚ß
+‚¦‚Õ‚µ‚ë‚ñ
+‚à‚Æ‚Ë
+‚ ‚¨‚È
+‚·‚½‚ñ‚¾[‚Ç
+‚è‚‚«
+‚ß‚ñ‚ß‚ñ
+‚µ‚傤‚ª‚¢‚Ô
+‚µ‚낽‚΂¢‚΂¢
+‚Ä‚Ç‚è
+‚º‚Á‚Ò‚ñ
+‚´‚«‚傤
+‚Ó‚¤‚Ä‚¢
+‚µ‚邵
+‚«‚Ù‚ñ
+‚Æ‚è‚Ђ«‚³‚«
+‚·‚ç‚¢‚Ç
+‚º‚¢‚肵
+‚ ‚Ü‚ª‚³
+‚¶‚à‚Æ
+‚µ‚ñ‚ª‚­‚è‚Â
+‚»‚­‚¢‚ñ
+‚¨‚Õ‚µ‚å‚ñ
+‚½‚ñ‚Ä‚¢
+‚«‚½‚Ì‚Ü‚é
+‚±‚΂¢
+‚¿‚イ‚¯‚¢‚µ‚å
+‚©‚½‚±‚Æ
+‚Æ‚±‚΂µ‚ç
+‚°‚Á‚Õ
+‚Ý‚ª‚ç
+‚¯‚É‚ñ
+‚Æ‚ ‚Ý
+‚à‚Á‚Æ[
+‚µ‚¿‚Ó‚¾
+‚Æ‚»
+‚¨‚ñ‚Ç‚³
+‚½‚½‚Ý
+‚‚­‚è‚à‚Ì
+‚«‚傶‚Â
+‚·‚È‚â‚Ü
+‚µ‚ñ‚¹‚¢‚Ђñ
+‚ç‚¢‚È[
+‚Ù‚ñ‚©
+‚È‚¢‚µ
+‚Ó‚¶‚傤‚è
+‚ß‚ñ‚Ú‚¤
+‚Ђ¾‚肵‚½
+‚«‚å‚à‚¤
+‚±‚ê‚·‚Ä‚ë[‚é
+‚Ý‚¿‚á‚­
+‚©‚Ë‚ñ‚¹‚¢
+‚è‚Á‚Õ
+‚»‚¤‚¯‚ñ
+‚¢‚Á‚Ä‚Â
+‚¤‚¢‚É‚ñ‚®
+‚«‚ñ‚Ï‚Â
+‚¶‚傤‚É‚ñ
+‚«‚í‚ß
+‚Ä‚¢‚¯‚‚ ‚Â
+‚«‚¶‚ã‚ñ
+‚½‚¢‚Ý‚ñ‚®
+‚¯‚Á‚Ø‚«
+‚©‚ñ‚Æ‚è[
+‚ê‚ñ‚ª
+‚à‚¿‚à‚Ì
+‚¬‚á‚­‚Ó‚¤
+‚¹‚ñ‚±‚¤
+‚³‚ñ‚Õ‚è‚ñ‚®
+‚±‚¤‚΂¢‚Ô
+‚±‚ñ‚Ï‚ñ
+‚¶‚傹‚¢
+‚°‚ñ‚¹‚¢
+‚¿‚イ‚¯‚ñ
+‚Ö‚«‚ß‚ñ
+‚µ‚ñ‚ɂイ‚¹‚¢
+‚³‚ñ‚µ‚á
+‚±‚­‚ׂ‚µ‚«
+‚Ղ낶‚¥‚­‚Æ
+‚¿‚イ‚Ä‚Â
+‚Ü‚ñ‚³‚­
+‚Ó‚·‚¤
+‚Ä‚ ‚«
+‚ ‚¢‚µ‚イ
+‚¶‚ñ‚­‚·
+‚Ù‚ñ‚«
+‚‚¤‚³‚ñ‚¾‚¢‚¶‚ñ
+‚µ‚ã‚É‚­
+‚î
+‚ä‚ß
+‚Ó‚Æ‚±‚ë
+‚Ó‚Æ‚¤‚ß‚¢
+‚¿‚á‚Ì‚Ý
+‚Í‚â‚΂ñ
+‚ ‚Ý‚Ì‚ß
+‚¾‚¢‚¢
+‚¹‚¢‚µ‚ñ‚©
+‚µ‚イ‚ê‚¢
+‚Í‚Ç‚ß
+‚₦‚â‚Ü
+‚Ú‚­‚»‚¤
+‚¦‚»
+‚ª‚­‚䂤
+‚©‚½‚Æ‚«
+‚¹‚«‚Ä‚¢
+‚¼‚­‚ª‚ç
+‚¦‚³
+‚Ó‚È‚½‚Ñ
+‚Ó‚½‚¢‚Ä‚ñ
+‚¬‚å‚­‚Í‚¢
+‚Í‚Á‚Ò[
+‚¿‚Ä‚ñ
+‚³‚¢‚¾‚¢‚«‚イ
+‚Í‚­‚³‚¢
+‚¶‚Ђ傤
+‚¹‚¢‚¦‚¢
+‚³‚ñ‚¶‚ã‚Â
+‚ª‚¢‚±‚­
+‚³‚¢‚Ð
+‚½‚Ä‚à‚Ì
+‚·‚Ì[
+‚¹‚«‚¹‚‚è‚傤
+‚ç‚ñ
+‚Ì‚è
+‚Ö‚ñ‚«‚傤
+‚²‚ç‚­
+‚¹‚«
+‚Ô‚¯
+‚¾‚ñ‚·‚¤
+‚ ‚¿‚±‚¿
+‚È‚½‚Ë
+‚Å‚ñ‚Î
+‚»‚¤‚¹‚¢‚³‚ñ
+‚΂¢‚µ‚ñ‚¢‚ñ
+‚Ó‚è
+‚»‚à‚»‚à
+‚©‚¹‚ñ
+‚ª‚­‚³‚¢
+‚µ‚ç‚Æ‚è
+‚²‚¹‚¢‚¦‚¢
+‚¹‚¢‚½‚¢
+‚½‚µ‚傤
+‚¤‚‚肬
+‚ç‚ñ‚µ
+‚³‚¢‚¶‚«
+‚È‚ñ‚­‚¹
+‚±‚¤‚Ö‚ñ
+‚­‚¶‚ç
+‚«‚¯‚ñ‚Ô‚Â
+‚¢‚ñ‚µ‚å‚­‚ª‚¢
+‚Ä‚«‚Æ‚¤
+‚ЂÆ
+‚¬‚á‚­‚¶‚ã‚ñ
+‚±‚±‚­
+‚¹‚¢‚µ‚ñ‚¹‚¢‚¢
+‚¯‚ñ‚Ø‚¢‚è‚Â
+‚Æ‚«‚¨‚è
+‚ ‚¢‚Ü‚¢
+‚©‚Ì‚¶‚å
+‚¨‚©‚Ë
+‚¶‚á‚ñ‚®‚é
+‚Å‚ñ‚¬‚傤
+‚Í‚Õ‚É‚ñ‚®
+‚»‚¤‚Æ‚¤
+‚©‚¢‚«
+‚Í‚­‚Ԃ‚©‚ñ
+‚¦‚ñ‚é‚¢
+‚³‚Ü
+‚²‚¤‚©‚­‚µ‚á
+‚±‚ñ‚­[‚é
+‚ª‚¢‚¹‚ñ‚à‚ñ
+‚Þ‚¿‚á‚­‚¿‚á
+‚·‚¢‚Ä‚«
+‚©‚½‚¨‚â
+‚Ԃ‚à‚ñ
+‚ª‚­‚¶‚ã‚Â
+‚¹‚Á‚¹‚ñ
+‚µ‚ñ‚©‚ñ
+‚¯‚¢‚è‚イ
+‚¨‚¤‚¹‚‚Ü
+‚·‚Ò[‚Ç
+‚Ó‚é‚â
+ƒr
+‚º‚Á‚±‚ñ
+‚¶‚ã‚«‚イ
+‚±‚¤‚Þ‚ª‚©‚è
+‚±‚¤‚¿‚傤
+‚³‚ñ‚т傤‚µ
+‚Ú‚Å‚¡[
+‚µ‚傤‚½‚¢‚¶‚傤
+‚­‚¸
+‚¶‚¿‚¾‚¢‚¶‚ñ
+‚·‚ׂÄ
+‚¶‚å‚¿‚イ‚¬‚­
+‚³‚ç
+‚¯‚ñ‚«‚イ‚Ô
+‚©‚«‚µ‚Ô
+‚±‚¿‚ç
+‚¢‚Á‚±‚­‚¢‚¿‚¶‚å
+‚¹‚»‚¤
+‚ ‚©‚Ü‚Â
+‚È‚ª‚¿‚傤‚Î
+‚©‚Ä‚²‚è[
+‚΂ñ‚©
+‚ê‚‚¶‚傤
+‚à‚Æ‚Ý‚â
+‚Ù‚¤‚ª‚ñ‚µ
+‚ ‚Á‚©
+‚Ñ‚ª‚­‚©
+‚Ԃ炤‚ñ
+‚¶‚悤
+‚Ù‚Á‚Æ
+‚¯‚ñ‚³‚©
+‚©‚悤‚«‚å‚­
+‚¦‚¢‚¹‚¢‚«‚å‚­
+‚°‚ñ‚Ú
+‚­‚¿‚イ
+‚¯‚ñ‚ß‚¢
+‚«‚Ђñ
+‚³‚µ‚ª‚Ë
+‚è‚Ú‚ñ
+‚¨‚¤‚µ‚ñ
+‚»‚¤‚µ‚µ‚á
+‚Ñ‚é‚Å‚¡‚ñ‚®
+‚¾‚¢‚¢‚Á‚¹‚ñ
+‚½‚¢‚ç
+‚Ý‚ã[‚¶‚©‚é
+‚¢‚ç‚·‚Æ
+‚Ö‚ñ‚µ‚á
+‚ª‚¢‚·‚¤
+‚¿‚炵
+‚¿‚á‚ñ‚·
+‚±‚ñ‚è‚イ
+‚Ù‚©‚°
+‚µ‚ñ‚ ‚ñ
+‚Ý‚Æ‚¤
+‚Ü‚ª‚¢‚à‚Ì
+‚¤‚«‚悦
+‚¹‚¢‚«‚å
+‚ç‚Þ
+‚©‚ñ‚é‚¢
+‚Ý‚è‚ñ
+‚Æ‚í
+‚Ó‚ß‚ñ
+‚¨‚¨‚µ‚©
+‚«‚¿‚傤
+‚²‚°‚ñ
+‚Æ‚¤‚µ
+‚‚ª‚¢
+‚è‚ñ‚т傤
+‚©‚¢‚»‚¤
+‚¶‚á‚Þ
+‚©‚Ö‚ñ‚¿‚傤
+‚¦‚ê‚­‚Æ‚ë‚É‚­‚·
+‚¤‚¦‚³‚Ü
+‚Ï‚Æ‚©[
+‚¯‚Ú‚è
+‚í‚«
+‚Ú‚ñ‚¶‚ñ
+‚½‚¢‚«‚å‚­
+‚Ђª‚µ‚ª‚í
+‚Ë‚ñ‚¦‚«
+‚ ‚É‚ß
+‚·‚¤‚¿
+‚µ‚ñ‚½‚¢‚¹‚¢
+‚¢‚ñ‚±‚¤
+‚Ó‚«‚傤
+‚¹‚ñ‚«‚á‚­
+‚µ‚á‚è‚ñ
+‚«‚Þ‚·‚ß
+‚ª‚ñ‚Ü
+‚ê‚Á‚Ä‚é
+‚ç‚Ú
+‚¶‚®‚´‚®
+‚¿‚á‚ñ‚Ë‚é
+‚µ‚á‚Á‚½
+‚¿‚イ‚è‚イ
+‚¤‚Ü
+‚¨‚¤‚Ö‚¢
+‚â‚«‚É‚­
+‚ɂイ‚µ‚ã‚Á‚±‚­
+‚ë‚ñ‚肪‚­
+‚­‚ê‚Ï‚·
+‚­‚Á‚µ‚å‚ñ
+‚¶‚낤
+‚³‚‚¢
+‚µ‚Ó‚­
+‚æ‚Ó‚¯
+‚É‚¾
+‚«‚傦‚¢‚µ‚ñ
+‚¹‚¢‚¢
+‚»‚¤‚¬‚傤
+‚¢‚½‚¢
+‚©‚¿‚©‚ñ
+‚Ђ¶‚©‚¯
+‚µ‚ñ‚ª‚Á‚©
+‚è‚ã‚Á‚­‚³‚Á‚­
+‚º‚ñ‚É‚Á‚Û‚ñ
+‚µ‚ñ‚»‚´‚¢
+ƒW
+‚¹‚¢‚è‚イ‚«
+‚à‚ñ‚Ç‚¤
+‚í‚©‚°
+‚Í‚©‚¢
+‚»‚¤‚é‚¢
+‚µ‚¨‚ß
+‚®‚ñ‚Ô
+‚¾‚¢‚ª‚¦
+‚­‚¿‚¦
+‚É‚­
+‚ª‚ñ‚ç‚¢
+‚³‚ñ‚è‚ñ
+‚Í‚ñ‚΂¢‚ª‚©‚è
+‚悤‚Ë‚ñ
+‚µ‚å‚­‚æ‚­
+‚«‚イ‚·‚¤
+‚Æ‚¤‚©‚¢
+‚ [‚Þ
+‚«‚イ‚¹‚¢‚µ‚ã
+‚²‚µ‚ザ‚ñ
+‚³‚¢‚¶‚傤
+‚¨‚¤‚´
+‚¬‚á‚­‚¹‚¢
+‚낤‚ 
+‚¯‚ñ‚µ‚イ‚©
+‚±‚¤‚¢‚µ‚Â
+‚¶‚®
+‚Ô‚ñ‚±‚¤
+‚¢‚¿‚à‚¤‚³‚­
+‚ ‚ǂ΂¢‚´[
+‚ê‚¢‚¹‚ñ
+‚킵‚ñ
+‚è‚Ñ‚ñ‚®
+‚«‚イ‚¿‚イ
+‚µ‚傤‚Ý
+‚¢‚ª‚ñ
+‚Æ‚Ä‚¢
+‚í‚¢
+‚¨‚肱‚Ý
+‚Ç‚«‚傤
+‚¤‚í‚Þ‚«
+‚¶‚‚ꂢ
+‚¬‚ñ‚ê‚¢
+‚¿‚傤‚Ý‚ñ
+‚Å‚¡‚­‚µ‚å‚È‚è
+‚µ‚悤‚¿‚イ
+‚Ç‚¤‚®
+‚©‚â‚­
+‚è‚ñ‚¶‚ñ
+‚©‚Ó‚»‚­
+‚²‚µ
+‚«‚イ‚ ‚­
+‚µ‚¬
+‚Í‚½‚¶‚邵
+‚Ђ傤‚µ‚傤
+‚­‚¿‚½‚¦
+ƒ}
+‚«‚ꂶ
+‚¾‚¢‚³‚ñ
+‚±‚¤‚°‚ñ
+‚Ä‚«‚ê‚¢‚«
+‚Ђ³‚ß
+‚Ђ傤‚Ð
+‚©‚­‚©‚ñ
+‚悤‚¶
+‚¹‚è
+‚µ‚コ‚¢‚µ‚á
+‚¢‚ç‚¢‚µ‚å
+‚ׂ‚à‚Ì
+‚Ó‚²‚¤‚©‚­
+‚ׂÁ‚¹‚©‚¢
+‚©‚¢‚»‚­
+‚©‚½‚æ‚è
+‚±‚¤‚¹‚¢
+‚Ó‚¡‚ñ‚ª
+‚Ì‚¤‚¯‚Á‚¹‚ñ
+‚µ‚á‚Ó‚Æ
+‚Ö‚¢‚©‚¢‚µ‚«
+‚½‚¢‚Ö‚ñ
+‚·‚¬
+‚Ó‚µ‚ ‚È
+‚ç‚ñ‚Ò‚Â
+‚½‚¢‚¿
+‚Ï‚ñ‚Â
+‚«‚Ê‚à‚Ì
+‚±‚¤‚»
+‚ª‚­‚»‚Â
+‚¶‚å‚·‚¤
+‚à‚ñ‚à‚¤
+‚³‚©‚«
+‚¾‚¢‚¢‚¿‚É‚ñ‚µ‚á
+‚µ‚ç‚Í
+‚¿‚Ђ傤
+‚¢‚ñ‚É‚­
+‚¹‚¢‚É‚­
+‚è‚イ‚Í
+‚©‚ñ‚±‚¤‚«‚á‚­
+ƒp
+‚¿‚傤‚ß
+‚Ђ«‚à‚Ì
+‚¹‚¢‚Ô‚ñ
+‚¿‚イ‚©
+‚ç‚­‚¹‚¢‚µ‚«
+ƒt
+‚æ‚È‚©
+‚É‚³‚ñ‚©
+‚µ‚ã‚©‚ñ‚¬‚µ
+‚¯‚‚¦‚«
+‚è‚ñ‚³‚ñ
+‚¶‚ã‚ñ‚Ç
+‚Ý‚»‚©
+‚悵‚Ý
+‚Ä‚¢‚¢‚¿
+‚΂Ă¢
+‚¶‚ñ‚½‚ñ
+‚©‚­‚µ‚Â
+‚½‚¢‚©‚ñ‚µ‚«
+‚´‚¢‚µ‚å
+‚³‚ñ‚¾[
+‚Ç‚¤‚¦‚¢
+‚Ü‚®‚ë
+‚©‚Þ‚¿‚á‚‚©
+‚¦‚¢‚Ô‚ñ‚©
+‚¢‚­‚Ô‚ñ
+‚¨‚ñ‚ª‚­
+‚Ä‚Á‚«‚傤
+‚¿‚©‚Ü‚í‚è
+‚¹‚ñ‚¼
+‚µ‚å‚´‚¢
+‚낹‚ñ
+‚Þ‚Å‚ñ
+‚Ó‚¼‚ë‚¢
+‚©‚­‚‚«
+‚Ç‚¤‚©‚¹‚ñ
+‚¯‚¢‚±‚¤
+‚±‚Ô‚Ë
+‚¦‚±‚Ì‚Ý[
+‚ׂÁ‚Ä‚¢
+‚±‚Á‚¯‚ñ
+‚¶‚¥‚¢
+‚æ‚è‚å‚­
+‚è‚Í‚Ñ‚è
+‚µ‚å‚­‚è‚傤‚È‚ñ
+‚Ü‚¯‚Ú‚µ
+‚³‚ñ‚²‚¤
+‚Ô‚è‚«
+‚µ‚å‚¢
+‚Ó‚é‚Å‚ç
+‚ê‚Ó‚Æ
+‚°‚‚ª‚­
+‚Ë‚¦‚³‚ñ
+‚É‚ç
+‚‚«‚©‚°
+‚»‚¤‚È‚ñ‚µ‚á
+‚½‚·‚­
+‚©‚´‚Ý
+‚È‚©‚悵
+‚Ä‚ñ‚Ü‚ñ‚®‚¤
+‚Ä‚ñ‚ç‚ñ
+‚Ì‚è‚­‚Ý‚¢‚ñ
+‚¤‚«
+‚Ђµ‚傪‚©‚è
+‚ç‚¢‚ñ
+‚Ù‚ñ‚Ë‚ñ‚Ç
+‚Í‚­‚Ñ
+‚ß‚Á‚¹[‚¶
+‚Ò‚ç‚Ý‚Á‚Ç
+‚²‚Ù‚¤
+‚¶‚á‚­‚É‚­‚«‚傤
+‚ß‚ñ‚Õ
+‚܂‚©‚º
+‚¹‚ñ‚½[
+‚悤‚¿‚イ
+‚¶‚債‚å‚­
+‚½‚¿‚¨‚­‚ê
+‚È‚ñ‚Õ‚ñ
+‚µ‚傤‚É‚ñ
+‚«‚è‚·‚Æ
+‚²‚±‚¤‚¬
+‚Ђ傤‚´‚ñ
+‚©‚­‚¢
+‚©‚è
+‚è‚傤‚­‚ñ
+‚¹‚‚ª‚ñ
+‚©‚ñ‚è‚Â
+‚Ä‚«‚¶
+‚Ë‚ñ‚è
+‚Ä‚ê‚Á‚­‚·
+‚«‚Á‚©
+‚Þ‚¢
+‚»‚¤‚µ‚«
+‚΂‚®‚ñ
+‚·‚¢‚悤
+‚Å‚ñ‚í‚¿‚傤
+‚ ‚Ü‚Å‚ç
+‚Ö‚¢‚Í‚ñ
+‚¹‚¢‚Ç
+‚¬‚ñ‚´‚ñ
+‚«‚ñ‚¶‚‚¿‚イ
+‚µ‚å‚­‚¿
+‚½‚ñ‚·
+‚¤‚Ý
+‚Õ‚ç‚¢‚×[‚Æ
+‚Í‚¢‚¹‚¢
+‚í‚ñ‚È‚¢
+‚悤‚Ñ
+‚¶‚イ‚à‚ñ‚¶
+‚‚è‚Ô‚Ë
+‚¯‚¢‚©‚­‚Ô
+‚µ‚傤‚·‚¤‚Ä‚ñ
+‚¾‚¢‚ë‚­
+‚Æ‚¤‚²‚¤
+‚É‚Ì‚ ‚µ
+‚°[‚Æ
+‚‚«‚¬‚ß
+‚È‚ñ‚¾‚¢
+‚²‚¤‚ׂñ
+‚à‚¿‚©‚Ô
+‚«‚©‚¢‚²
+‚Ü‚ñ‚ß‚ñ
+‚Ì[‚·
+‚¶‚傤‚·‚¢‚Ç‚¤
+‚¬‚傯‚¢
+‚«‚Ë
+‚â‚¿‚傤
+‚ß‚®‚Ý
+‚¢‚ñ‚µ‚傤‚Ä‚«
+‚Í‚ç‚¢‚à‚Ç‚µ‚«‚ñ
+‚Å‚ñ‚Û‚¤
+‚Æ‚¨‚ ‚³
+‚±‚¤‚¶‚Â
+‚Ä‚Í‚¸
+‚¯‚¢‚ê‚«
+‚µ‚Ù‚ñ‚µ‚ガ
+‚µ‚ñ‚µ‚傤‚Ú‚¤‚¾
+‚µ‚ñ‚¢‚ñ
+‚ӂׂñ
+‚±‚¤‚É‚ñ
+‚ë‚Á‚Æ
+‚Ä‚ñ‚±‚¤
+‚¶‚«
+‚¬‚ñ‚ª
+‚½‚Ô‚ñ
+‚¢‚È‚Ñ‚©‚è
+‚­‚¸‚Ä‚Â
+‚½‚©‚µ‚Ü‚¾
+‚·‚¢‚µ‚ñ‚ª‚©‚è
+‚è‚傤‚Ä
+‚®‚ ‚Ä‚Ü‚ç
+‚¨‚Ä‚Ù‚ñ
+‚Í‚ñ‚Ø‚ñ
+‚¤‚킸‚Ý
+‚É‚Á‚³‚ñ
+‚Ù‚¤‚悤‚è‚å‚­
+‚ß
+‚µ‚ñ‚ɂイ
+‚É‚Ç
+‚©‚Ù‚¤‚í
+‚²‚¤‚µ‚傤
+‚³‚¢‚³‚ñ‚³‚¢‚µ
+‚©‚¯‚à‚Ì
+‚ç‚­‚¶‚Â
+‚©‚ñ‚Ï‚­
+‚¯‚ñ‚«‚イ‚¶‚å
+‚ê‚¢‚µ
+‚è‚傤‚¹‚¢
+‚µ‚è[‚¸
+‚¦‚¦
+‚¶‚傤‚«‚傤
+‚±‚Ô
+‚‚â
+‚±‚©‚±[‚ç
+‚낤‚Ù‚¤
+‚¨‚ñ‚¾‚ñ‚º‚ñ‚¹‚ñ
+‚¾‚Á‚µ‚ß‚ñ
+‚©‚Á‚Ä‚®‚¿
+‚Ï[‚Ü‚Ë‚ñ‚Æ
+‚«‚傽‚­
+‚«‚ñ‚ׂñ
+‚¢‚Á‚µ‚ñ
+‚¢‚í‚ ‚È
+‚¨‚ñ‚¾‚ñ
+‚­‚è‚¢‚ê‚«‚ñ
+‚Ó‚»‚­‚Ó‚è
+‚»‚¤‚Å
+‚Í‚ñ‚½[
+‚‚©‚¢‚ª‚Á‚Ä
+‚Ù‚¤‚Ù‚¤
+‚¿‚イ‚±‚¤
+‚Ç‚¤‚è‚傤
+‚»‚¤‚·‚¢
+‚¯‚ñ‚è‚傤
+‚¦‚ñ‚µ‚イ‚è‚Â
+‚Ԃ‚߂Â
+‚¢‚â‚­‚Ђñ
+‚Ü‚ñ‚ª‚©
+‚¦‚ñ‚¾‚Ä
+‚Ý‚¹‚¢‚Ë‚ñ
+‚Ù‚Ç‚Ù‚Ç
+‚·‚Û[‚‚܂ñ
+‚Ђµ‚à‚¿
+‚½‚¢‚É‚ñ
+‚¦
+‚Í‚­‚µ
+‚ë‚ñ‚µ
+‚Í‚Á‚±‚¤‚Ñ
+‚ë‚ñ
+‚Ü‚¢‚·‚¤
+‚«‚°‚ñ‚¬‚ê
+‚Í‚ñ‚¾‚¢
+‚Ú‚¤‚ª‚¢
+‚©‚ñ‚¶‚傤
+‚«‚ñ‚Ä‚¢
+‚½‚©‚Ó‚¾
+‚Ñ‚µ‚傤‚Ë‚ñ
+‚ЂƂª‚«
+‚Ó‚­‚¶‚ã
+‚³‚¢‚°‚Â
+‚¨‚­‚¹‚Â
+‚½‚¢‚¨‚ñ‚¯‚¢
+‚´‚ñ‚ª‚­
+‚¿‚傤‚¶‚ã
+‚±‚ß‚Å‚¡[
+‚¢‚²‚±‚¿
+‚È‚â
+‚³‚©‚Ý‚¿
+‚©‚­‚¯‚ñ
+‚©‚¯‚ñ
+‚»‚­‚ß‚ñ‚¸
+‚ê‚´[
+‚Ù‚¤‚µ
+‚³‚­‚¿‚イ
+‚½‚è‚Â
+‚«‚¨‚·‚­
+‚¹‚Á‚»‚¤
+‚·‚«‚á‚È
+‚«‚イ‚Ñ‚ñ
+‚µ‚傤‚ß‚¢
+‚¬‚¶‚ã‚‚Ô
+‚Ó‚Ç‚«
+‚«‚ª‚­
+‚Ù‚¤‚Æ
+‚Ђ®‚炵
+‚¶‚傤‚Þ
+‚Ô‚ñ‚ª‚Á‚©
+‚½‚É‚Ü
+‚»‚Å‚½‚¯
+‚Ú‚¤‚Ó‚¤
+‚ß‚¢‚¿‚å
+‚Ô‚¿‚傤‚Ù‚¤
+‚¢‚΂ç
+‚¹‚Ç
+‚Å‚ñ‚Ë‚Â
+‚ ‚©‚Å‚Ý[
+‚µ‚悤‚¶‚傤
+‚ ‚Ý
+‚«‚イ‚Ó‚«‚ñ
+‚µ‚å‚°‚ñ
+‚¢‚ª‚½
+‚º‚ñ‚±
+‚͂‚䂫
+‚Ü‚­‚炱‚Æ‚Î
+‚±‚¤‚¾‚ñ‚¶‚イ‚½
+‚Ë‚ñ‚±‚¤
+‚Ó‚»‚­
+‚©‚½‚Ý‚¿
+‚©‚¶‚Æ‚è
+‚ê‚¢‚Ä‚ñ
+‚Ä‚ñ‚Ì‚¤‚Ö‚¢‚©
+‚Ô‚ê[‚«
+‚©‚è‚΂炢‚«‚ñ
+‚·‚¢‚³‚ñ‚Ô‚Â
+‚Ü‚¢‚æ
+‚ª‚ñ‚«‚ñ
+‚à‚Á‚½‚¢
+‚©‚ñ‚©‚ñ‚ª‚­‚ª‚­
+‚±‚µ‚傤
+‚è‚ñ‚©‚­
+‚Ü‚Ó‚ç
+‚¦‚ñ‚µ‚ñ
+‚ [‚Æ
+‚¹‚ñ‚³
+‚¶‚Á‚·‚¤
+‚Þ‚¢‚µ‚«
+‚È‚í
+‚ç‚­‚¢‚ñ
+‚½‚«‚‚Ú
+‚Ý‚¿‚ä‚«
+‚µ‚ñ‚è‚傤
+‚æ‚ñ‚è‚ñ
+‚Ý‚È‚³‚ñ
+‚ª‚­‚΂Â
+‚±‚³‚ñ
+‚¶‚Ý‚¿
+‚¬‚å‚É‚­
+‚«‚­‚΂ñ
+‚¶[‚½
+‚Þ‚­
+‚«‚傤‚Ý‚µ‚ñ‚µ‚ñ
+‚Ô‚¿‚傤
+‚Ö‚¢‚Ë‚ñ‚È‚Ý
+‚±‚ñ‚΂ñ‚Í
+‚Æ‚¤‚ë‚­‚Ú
+‚Æ‚Á‚«‚å‚©
+‚µ‚ñ‚¿‚イ
+‚Ù‚µ‚傤‚‚«
+‚¤‚©‚¢
+‚ê‚«‚Ë‚ñ
+‚¨‚Ô‚¶‚¥‚­‚Æ
+‚Ђ«
+‚ß‚ñ‚µ‚«
+‚¨‚ß‚¢‚µ
+‚©‚â
+‚²‚¤‚¹‚ñ
+‚³‚¢‚±
+‚Í‚ç‚¢‚¹
+‚¨‚Ë
+‚¬‚á‚­‚µ‚ñ
+‚ ‚­‚Ç‚¤
+‚µ‚イ‚è‚Â
+‚°‚ñ‚«‚傤
+‚¢‚í‚¢
+‚È‚¢‚©
+‚Ó‚¤‚«
+‚«‚í‚Ý
+‚¿‚á‚Ù
+‚©‚ê
+‚ß‚½
+‚Ù‚¤‚µ‚イ
+‚ꂱ[‚¾
+‚µ‚ã‚Ó
+‚¿‚イ‚»‚­
+‚Ý‚·‚Ä[‚­
+‚µ‚Ô‚ª‚«
+‚ ‚¢‚³‚¢
+‚µ‚ã‚­‚¶‚å
+‚È‚©‚·
+‚¢‚Á‚½‚¢
+‚¿‚á‚Ý‚¹
+‚Ó‚ä‚«‚Æ‚Ç‚«
+‚Ó‚Ÿ‚¢‚ 
+‚©‚Ó‚¥‚¢‚ñ
+‚µ‚á‚­‚¿
+‚Ý‚¯
+‚Ђ悭
+‚µ‚«‚¿‚傤
+‚¢‚Á‚‚¤
+‚Ó‚Å
+‚Ô‚ñ‚Ý‚á‚­
+‚«
+‚悤‚ß‚¢
+‚½‚ê
+‚ª‚¢‚ç‚¢‚²
+‚«‚イ‚¶‚傽‚¢
+‚Ý‚»‚ç
+‚Æ‚ç‚ñ‚¶‚¥‚ñ‚Æ
+‚±‚­‚¬
+‚«‚ñ‚«‚傤
+‚Ù‚¯‚ñ‚«‚ñ
+‚«‚ñ‚¹‚¢
+‚È‚¦‚¬
+‚Æ‚­‚¹‚¢
+‚Ђ¯‚¢
+‚­‚Ñ‚Ü‚«
+‚Ђº‚É
+‚Í‚ñ‚Æ‚¤‚ß‚¢
+‚É‚Æ‚¤
+‚µ‚Ƃ낦‚ñ
+‚½‚¢‚µ‚á‚­‚½‚¢‚µ
+‚ ‚½‚è‚Ç‚µ
+‚©‚ñ‚º‚ñ
+‚낤‚¶‚ã
+‚±‚¤‚Ù‚¤‚Ô
+‚Ó‚­‚µ‚á‚«
+‚͂‚É
+‚¯‚¢‚Ú
+‚¤‚¥‚ 
+‚ª‚¢‚±‚¤‚Ä‚«
+‚©‚¢‚Í‚Â
+‚«‚債‚Â
+‚¹‚¢‚Ë‚ñ‚ª‚Á‚Ò
+‚Ù‚ñ‚é‚¢
+‚¬‚°‚¢
+‚Þ‚Ó‚¤
+‚©‚µ‚µ‚Â
+‚°‚ñ‚©‚ñ
+‚¹‚«‚Í‚ñ
+‚©‚¢‚Ñ‚á‚­
+‚è‚´[‚Ô
+‚Ђ¬‚傤
+‚»‚Æ
+‚¿‚è‚á‚­
+‚ЂÁ‚µ‚イ
+‚¨‚â‚䂸‚è
+‚³‚ñ‚Ñ‚©
+‚ׂ­‚½
+‚ß‚ñ
+‚¤‚Ô‚²‚¦
+‚ª‚ñ‚µ‚å
+‚µ‚ソ‚ñ‚Æ‚¤
+‚µ‚å‚­‚΂¢
+‚¶‚á‚ñ‚é
+‚µ‚½‚ñ
+‚Ü[‚ª‚è‚ñ
+‚¨‚Þ‚·‚Ñ
+‚³‚ñ‚ë‚­
+‚±‚¹‚«
+‚Ù‚¤‚í
+‚©‚¤‚ñ‚¹‚ç[
+‚ß‚à
+‚ ‚³
+‚Å‚±‚ê[‚µ‚å‚ñ
+‚Ü‚ß‚¾
+‚±‚¤‚Ђñ‚µ‚Â
+‚¨‚Ý‚­‚ë‚ñ
+‚‚­‚è‚΂Ȃµ
+‚¶‚­‚¤‚¯
+‚ª‚¢‚«‚ñ
+‚©‚¢‚‚¤‚µ‚«
+‚Í‚®‚ë
+‚Ý‚¸‚®‚¿
+‚Õ‚è‚ñ‚¹‚·
+‚Ï[‚Æ‚½‚¢‚Ü
+‚µ‚Ⴑ
+‚Ô‚¶‚¿‚傤
+‚³‚«‚ä‚«
+‚Ђ³
+‚ë‚Ä‚ñ
+‚Ù‚¤‚¾‚¢
+‚¦‚ñ‚¶‚É‚ ‚è‚ñ‚®
+‚µ‚å‚­‚è‚傤
+‚¢‚«‚©‚½
+‚¶‚ª‚Ë
+‚©‚½‚¢‚È‚©
+‚Ó‚°‚ñ‚¶‚Á‚±‚¤
+‚©‚ñ‚Ü‚ñ
+‚«‚µ‚Ú‚¶‚ñ
+‚Ú[‚Ç
+‚¹‚¢‚Ë‚ñ
+‚µ‚à‚ñ
+‚悤‚¶‚ñ
+‚É‚­‚ЂÂ
+‚±‚Á‚­
+‚±‚ñ‚Ñ‚Ë[‚µ‚å‚ñ
+‚É‚Á‚©‚ñ
+‚¿‚±‚¤
+‚‚­‚¾‚É
+‚´
+‚µ‚傤‚ª‚¢‚µ‚Â
+‚â‚«‚イ
+‚·‚¢‚à‚ñ
+‚¶‚イ‚悤
+‚«‚傤‚¬
+‚Þ‚¯‚Â
+‚Ý‚¸‚¬
+‚ß[‚½
+‚͂΂Â
+‚º‚ñ‚â
+‚Æ‚¤‚©‚‚«‚å‚­
+‚«‚Ì‚¦‚Ë
+‚í‚è‚Ü‚¦
+‚¦‚ñ‚Å‚ñ
+‚è‚Ó‚Ÿ‚ê‚ñ‚·
+‚Ó‚È‚¶
+‚¬‚«‚å‚­
+‚«‚³‚­
+‚±‚­‚䂤
+‚«‚¯‚ñ‚è‚Â
+‚Ê‚é‚Ü‚ä
+‚ ‚ñ‚Ô‚ñ
+‚½‚܂‚­‚è
+‚Ü‚Á‚³‚¢‚¿‚イ
+‚È‚ñ‚¢‚Ç
+‚·‚ñ‚¶
+‚¦‚½‚¢
+‚¶‚å‚ê‚Â
+‚Ä‚¢‚µ‚イ‚Í
+‚¿‚á‚­‚΂炢
+‚°‚ñ‚ª‚Á‚«
+‚Ђë‚Ü
+‚Ù‚ñ‚©‚¢‚¬
+‚µ‚ñ‚¯‚ñ‚´‚¢
+‚Ä‚«‚·‚Æ
+‚Í‚â‚­‚¿
+‚Ç‚¤‚»‚¤
+‚Æ‚¤‚¿‚µ‚á
+‚Ý‚Ú‚¤‚¶‚ñ
+‚Í‚¬
+‚킹‚ñ
+‚«‚Ý‚ª‚æ
+‚ª‚¢‚³‚¢
+‚º‚ñ‚¬‚ñ‚«‚傤
+‚µ‚ã‚ñ‚©‚ñ
+‚­‚·
+‚²‚½‚­
+‚â‚¢‚ñ
+‚µ‚ñ‚Å‚ñ‚¸
+‚Ђ¬‚µ‚á
+‚¦‚Ì‚«
+‚¹‚ñ‚ׂÂ
+‚³‚¢‚±‚¤‚«‚イ
+‚«‚Á‚·‚¢
+‚Ä‚ê
+‚»‚¤‚«
+‚¦‚¢‚¬‚傤‚Ð
+‚¹‚«‚³‚¢‚è‚傤
+‚¦‚¾‚Í
+‚©‚Ü‚à‚Æ
+‚È‚ñ‚Ä‚Â
+‚³‚©‚Ä
+‚½‚­‚ ‚ñ
+‚¦‚ñ‚»‚­
+‚т傤‚²
+‚æ‚­‚悤
+‚¾‚¢‚¸
+‚Æ‚¿
+‚‚«‚«
+‚½‚¢‚³‚ñ
+‚Æ‚ç‚ñ‚Õ
+‚Ó‚ê‚ñ‚¼‚­‚¹‚ñ
+‚í‚©‚ê‚Ý‚¿
+‚Ó‚­‚µ‚傤
+‚ ‚³‚΂ñ
+‚¹‚ñ‚°‚Â
+‚¤‚¸
+‚Ê‚Ü‚½
+‚Æ‚È‚è‚ ‚킹
+‚¿‚ñ‚¹‚¢‚´‚¢
+‚¬‚傤
+‚¹‚Á‚±‚¤
+‚ª‚¢‚±‚¤
+‚»‚¹‚ñ
+‚¹‚®‚ß‚ñ‚Æ
+‚¬‚肵‚á
+‚¨‚₲‚±‚ë
+‚¦‚«‚´‚¢
+‚·‚Á‚Æ‚ñ‚«‚傤
+‚±‚ñ
+‚©‚ñ‚ç‚­
+‚¢‚Á‚Ä‚ñ‚΂è
+‚¨‚¤‚ë
+‚ׂÁ‚¹‚¢
+‚Ë‚ñ‚Ô‚Â
+‚Í‚ñ‚µ
+‚²‚¹‚¢‚¬‚傤
+‚µ‚í‚´
+‚«‚イ‚è‚イ
+‚ß‚ñ‚»‚¤
+‚È‚Ü‚Ý‚¸
+‚©‚ñ‚±‚¤‚¿
+‚Ï‚¯‚Á‚Æ
+‚Ó‚­‚¿‚傤
+‚Ù‚¤‚µ‚傤
+‚ç‚¢‚·
+‚»‚¤‚¼‚¤‚è‚å‚­
+‚È‚ñ‚¢
+‚µ‚イ‚¬‚¢‚ñ
+‚Ó‚¶‚Ý
+‚½‚¢‚Þ
+‚ ‚¶‚‚¯‚Ì‚è
+‚ª[‚é
+‚©‚µ‚«‚ñ
+‚©‚È‚®
+‚¢‚¶‚ã‚Â
+‚«‚á‚­‚¢‚ñ
+‚Ñ‚ã[‚Ä‚¡[
+‚©‚«‚«‚イ‚©
+‚¦‚·
+‚Æ‚è‚Ђ«‚¶‚å
+‚¹‚΂ñ‚²‚¤
+‚²‚¯
+‚³‚¢‚¹‚ñ
+‚Ä‚Á‚«
+‚²‚é‚Ó‚Ÿ[
+‚µ‚ª‚ñ‚µ‚á
+‚¨
+‚Ú‚¤‚º‚ñ
+‚ɂ傽‚¢
+‚¢‚Á‚³‚ñ‚©‚½‚ñ‚»
+‚©‚炪‚¢
+‚©‚¢‚²‚낵
+‚¾‚¢‚Ç‚±‚ë
+‚Ç‚¤‚µ‚å‚­
+‚¢‚è‚傤‚Ђñ
+‚¢‚í‚ê
+‚è‚͂‚Ăñ
+‚¿‚傤‚«‚ñ‚Ä‚ ‚Ä
+‚ê‚¢‚»‚ñ
+‚»‚ê
+‚¬‚Ó
+‚Ü‚ß‚é‚¢
+‚µ‚«‚イ
+‚«‚ê‚Í‚µ
+‚ç‚¢‚Ë‚ñ
+‚«‚ª‚­‚©
+‚¹‚¢‚ß‚ñ
+‚©‚­‚ª‚½
+‚³‚¢‚½
+‚µ‚イ‚µ‚å‚­‚è‚Â
+‚¢‚Á‚Æ
+‚Æ‚Á‚©
+‚Ђ‚悤
+‚Ö
+‚«‚µ‚傤
+‚·‚Õ‚è‚ñ‚­‚ç[
+‚Ü‚ñ‚Ü‚¦
+‚ ‚µ‚ª‚©‚è
+‚±‚Á‚©‚¢‚¬‚¢‚ñ
+‚Ó‚¤‚Ó
+‚É‚ñ‚¶‚á
+‚©‚È‚½
+‚¶‚イ‚½‚­‚ª‚¢
+‚Þ‚©‚Å
+‚Þ‚µ‚傤
+‚«‚½‚¯
+‚«‚·‚¢
+‚ë‚¢‚â‚è‚Ä‚¡
+‚Æ‚±‚È‚Â
+‚³‚‚¶‚ñ
+‚®‚¤‚í
+‚Ñ‚Æ‚­
+‚ç‚­‚²
+‚º‚è[
+‚¶‚ñ‚Æ‚¤
+‚¯‚ñ‚Ú‚¤
+‚«‚Ó‚¶‚ñ
+‚₶‚ñ
+‚Æ‚­‚µ‚å‚­
+‚É‚¿‚Ç‚¤
+‚«‚«‚ß
+‚ª‚¢‚µ‚傤‚Ô
+‚¶‚イ‚Ù‚¤
+‚¶‚債‚±‚¤
+‚Ђµ‚å‚©
+‚䂤‚¹‚¢‚µ‚傤
+‚¯‚‚܂Â
+‚½‚ÂÚ
+‚«‚°‚«
+‚­‚à‚ä‚«
+‚½‚¢‚¢‚­‚©‚ñ
+‚¦‚¢‚¦‚ñ
+‚¤‚Ì‚Ý
+‚䂤‚³‚ñ
+‚Ђ‚ǂ­
+‚Ó‚©‚­‚¶‚Â
+‚µ‚傤‚»‚­
+‚Ù‚¤‚±‚­‚µ‚å
+‚¶‚傤‚ނ肶
+‚µ‚傤‚Í‚¢
+‚悱‚ÂÈ
+‚Í‚Á‚µ‚å‚­
+‚͂‚à‚Ì
+‚Ù‚Ç
+‚ê‚¢‚¶
+‚µ‚å‚¿‚傤
+‚΂ñ‚¾‚¢
+ƒP
+‚Ó‚è‚»‚Å
+‚«‚ª
+‚¨‚¤‚©‚ñ
+‚½‚«
+‚±‚Ô‚µ
+‚¾‚ñ‚µ
+‚䂤‚ª‚½
+‚¯‚µ‚ñ
+‚¢‚ñ‚ª
+‚Ó‚º‚ñ
+‚±‚ñ‚ׂñ‚µ‚å‚ñ
+‚¹‚è‚Ó
+‚¨‚¨‚Ä
+‚°‚ñ‚¿‚å
+‚¢‚ñ‚µ‚å‚­‚º‚¢
+‚Þ‚¬‚΂½‚¯
+‚µ‚¨‚ñ
+‚͂‚¦‚ñ‚Æ‚¤
+‚Ü‚­‚ë
+‚¬‚イ‚¶
+‚©‚¢‚¯‚ñ
+‚Ç‚¢‚‚²
+‚©‚Ç‚¤
+‚Ý‚¸‚³‚µ
+‚â‚­‚É‚ñ
+‚­‚è‚·‚½‚é
+‚ЂƂè
+‚¿‚傤‚¦‚¢
+‚悤‚΂¢
+‚µ‚邱
+‚±‚Á‚«‚傤
+‚©‚È‚¢
+‚Ó‚­‚¶‚ñ
+‚Ç‚¤‚½‚¢
+‚Ý‚¸‚©‚³
+‚Ü‚¦‚Þ‚«
+‚悶‚ñ
+‚Þ‚´‚¢
+‚¹‚«‚µ‚ã‚ñ
+‚¨‚ë‚©
+‚¯‚¢‚±‚¤‚½‚¢
+‚¢‚Á‚µ‚ñ‚¢‚Á‚½‚¢
+‚¢‚‚´‚¢
+‚¨‚µ‚傤
+‚½‚ñ‚°‚ñ
+‚ނЂ傤
+‚¯‚‚ڂ¤‚µ‚傤
+‚³‚Á‚©
+‚¹‚¢‚¢‚«
+‚ë‚ñ‚Û‚¤
+‚è‚イ‚è‚傤
+‚Ђª‚ß
+‚Ö‚¢‚Ó‚¤
+‚µ‚Á‚Ä‚ñ
+‚Ú‚ñ‚³‚¢
+‚¯‚Á‚µ‚傤‚¹‚ñ
+‚Ö‚¢‚Æ
+‚¹‚¢‚Ԃ‚ª‚­
+‚ª‚ñ‚¶‚Â
+‚à‚æ‚è
+‚â‚í
+‚Ó‚­‚Ö‚¢
+‚¨‚¤‚Í‚ñ
+‚Ä
+‚³‚©‚ñ
+‚¶‚ñ‚¼‚¤
+‚Ü‚·‚±‚Ý
+‚Í‚ê‚·‚ª‚½
+‚µ‚«‚イ‚Ñ
+‚è‚å‚©‚­
+‚à‚Ý‚¶
+‚¢‚Á‚Õ‚½‚³‚¢
+‚é[‚é
+‚Å‚Á‚¿
+‚©‚­‚­‚Ý
+‚Ù‚ñ‚â‚­‚«
+‚Æ‚¤‚é‚¢
+‚Ô‚ñ‚©‚©‚¢
+‚¯‚Á‚«‚イ
+‚Ђ΂È
+‚à
+‚«‚è‚Í
+‚²‚ª‚­‚©
+‚¹‚ñ‚¶‚á
+‚°‚ñ‚¶‚Â
+‚µ‚傤‚¬
+‚Í‚½‚¢‚ë
+‚¨[‚Ô‚ñ
+‚©‚¨‚â‚­
+‚¦‚¾‚Ü‚ß
+‚í‚©‚®
+‚Í‚È‚´‚©‚è
+‚è‚傤‚µ‚Â
+‚Ђ ‚µ
+‚ß‚¢‚¶‚傤
+‚Ý‚Ý
diff --git a/private/oleauto/sample/spoly/cenumpt.cpp b/private/oleauto/sample/spoly/cenumpt.cpp
new file mode 100644
index 000000000..2982fd8c3
--- /dev/null
+++ b/private/oleauto/sample/spoly/cenumpt.cpp
@@ -0,0 +1,284 @@
+/***
+*cenumpt.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module implements the CEnumPoint class.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "hostenv.h"
+#include "cenumpt.h"
+
+
+CEnumPoint::CEnumPoint()
+{
+ m_refs = 0;
+
+ m_psa = NULL;
+ m_celts = 0;
+ m_iCurrent = 0;
+}
+
+
+/***
+*HRESULT CEnumPoint::Create(SAFEARRAY*, CEnumPoint**)
+*Purpose:
+* This routine creates a CPoint enumerator from the given
+* (1 X N) SafeArray of CPoint IDispatch pointers.
+*
+*Entry:
+* psa = pointer to a SafeArray of VARIANTs
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppenum = pointer to a CPoint enumerator
+*
+***********************************************************************/
+HRESULT
+CEnumPoint::Create(SAFEARRAY FAR* psa, CEnumPoint FAR* FAR* ppenum)
+{
+ long lBound;
+ HRESULT hresult;
+ CEnumPoint FAR* penum;
+
+
+ // Verify that the SafeArray is the proper shape.
+ //
+ if(SafeArrayGetDim(psa) != 1)
+ return ResultFromScode(E_INVALIDARG);
+
+ hresult = SafeArrayGetLBound(psa, 1, &lBound);
+ if(FAILED(hresult))
+ return hresult;
+
+ if(lBound != 0)
+ return ResultFromScode(E_INVALIDARG);
+
+ penum = new FAR CEnumPoint();
+ if(penum == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+ penum->AddRef();
+
+ hresult = SafeArrayGetUBound(psa, 1, &lBound);
+ if(FAILED(hresult))
+ goto LError0;
+
+ penum->m_psa = psa;
+ penum->m_celts = lBound + 1;
+
+ *ppenum = penum;
+
+ return NOERROR;
+
+LError0:;
+ penum->Release();
+
+ return hresult;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CEnumPoint::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+
+ if(!IsEqualIID(riid, IID_IUnknown))
+ if(!IsEqualIID(riid, IID_IEnumVARIANT)) {
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+ }
+
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CEnumPoint::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CEnumPoint::Release()
+{
+ if(--m_refs == 0){
+ if(m_psa != NULL)
+ SafeArrayDestroy(m_psa);
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IEnumVARIANT methods
+//---------------------------------------------------------------------
+
+
+/***
+*HRESULT CEnumPoint::Next(unsigned long, VARIANT*, unsigned long*)
+*Purpose:
+* Attempt to get the next 'celt' items in the enumeration sequence.
+*
+*Entry:
+* celt = the number of elements to get
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* S_FALSE - the end of the sequence was reached
+*
+* rgvar = array of the next 'celt' items
+* *pceltFetched = count of the elements actually fetched.
+*
+***********************************************************************/
+STDMETHODIMP
+CEnumPoint::Next(
+ unsigned long celt,
+ VARIANT FAR* rgvar,
+ unsigned long FAR* pceltFetched)
+{
+ long ix;
+ unsigned int i;
+ HRESULT hresult;
+
+
+ for(i = 0; i < celt; ++i)
+ VariantInit(&rgvar[i]);
+
+ for(i = 0; i < celt; ++i){
+ if(m_iCurrent == m_celts){
+ hresult = ResultFromScode(S_FALSE);
+ goto LDone;
+ }
+
+ ix = m_iCurrent++;
+ hresult = SafeArrayGetElement(m_psa, &ix, &rgvar[i]);
+ if(FAILED(hresult))
+ goto LError0;
+ }
+
+ hresult = NOERROR;
+
+LDone:;
+ if (pceltFetched != NULL)
+ *pceltFetched = i;
+
+ return hresult;
+
+LError0:;
+
+ for(i = 0; i < celt; ++i)
+ VariantClear(&rgvar[i]);
+
+ return hresult;
+}
+
+
+/***
+*HRESULT CEnumPoint::Skip(unsigned long)
+*Purpose:
+* Attempt to skip over the next 'celt' elements in the enumeration
+* sequence.
+*
+*Entry:
+* celt = the count of elements to skip
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* S_FALSE - the end of the sequence was reached
+*
+***********************************************************************/
+STDMETHODIMP
+CEnumPoint::Skip(unsigned long celt)
+{
+ m_iCurrent += celt;
+
+ if(m_iCurrent > m_celts)
+ m_iCurrent = m_celts;
+
+ return (m_iCurrent == m_celts)
+ ? ResultFromScode(S_FALSE) : NOERROR;
+}
+
+
+/***
+*HRESULT CEnumPoint::Reset(void)
+*Purpose:
+* Reset the enumeration sequence back to the beginning.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = SHRESULT CODE
+* S_OK
+*
+***********************************************************************/
+STDMETHODIMP
+CEnumPoint::Reset()
+{
+ m_iCurrent = 0;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CEnumPoint::Clone(IEnumVARIANT**)
+*Purpose:
+* Retrun a CPoint enumerator with exactly the same state as the
+* current one.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_OUTOFMEMORY
+*
+***********************************************************************/
+STDMETHODIMP
+CEnumPoint::Clone(IEnumVARIANT FAR* FAR* ppenum)
+{
+ HRESULT hresult;
+ SAFEARRAY FAR* psa;
+ CEnumPoint FAR* penum;
+
+ hresult = SafeArrayCopy(m_psa, &psa);
+ if(FAILED(hresult))
+ return hresult;
+
+ hresult = CEnumPoint::Create(psa, &penum);
+ if(FAILED(hresult))
+ goto LError0;
+
+ // Assert(penum->m_celts == m_celts);
+
+ penum->m_iCurrent = m_iCurrent;
+
+ *ppenum = penum;
+
+ return NOERROR;
+
+LError0:
+ SafeArrayDestroy(psa);
+
+ return hresult;
+}
diff --git a/private/oleauto/sample/spoly/cenumpt.h b/private/oleauto/sample/spoly/cenumpt.h
new file mode 100644
index 000000000..492ce9778
--- /dev/null
+++ b/private/oleauto/sample/spoly/cenumpt.h
@@ -0,0 +1,40 @@
+/***
+*cenumpt.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CEnumPoint class.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+class CEnumPoint : public IEnumVARIANT
+{
+public:
+ static HRESULT Create(SAFEARRAY FAR* psa, CEnumPoint FAR* FAR* ppenum);
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IEnumVARIANT methods */
+ STDMETHOD(Next)(unsigned long celt, VARIANT FAR* rgvar, unsigned long FAR* pceltFetched);
+ STDMETHOD(Skip)(unsigned long celt);
+ STDMETHOD(Reset)(void);
+ STDMETHOD(Clone)(IEnumVARIANT FAR* FAR* ppenum);
+
+ CEnumPoint();
+
+private:
+
+ unsigned long m_refs;
+
+ unsigned long m_celts;
+ unsigned long m_iCurrent;
+ SAFEARRAY FAR* m_psa;
+};
+
diff --git a/private/oleauto/sample/spoly/clsid.c b/private/oleauto/sample/spoly/clsid.c
new file mode 100644
index 000000000..5994746b5
--- /dev/null
+++ b/private/oleauto/sample/spoly/clsid.c
@@ -0,0 +1,46 @@
+/***
+*clsid.c
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates and initializes the CLSIDs.
+*
+*****************************************************************************/
+
+#ifdef _PPCMAC
+#pragma data_seg ("_FAR_DATA")
+#pragma data_seg ( )
+#endif //_PPCMAC
+
+#ifdef _MAC
+# include <Types.h>
+#ifdef _MSC_VER
+# include <Processe.h>
+# include <AppleEve.h>
+#else //_MSC_VER
+# include <Processes.h>
+# include <AppleEvents.h>
+#endif //_MSC_VER
+#else
+# include <windows.h>
+#endif
+
+#ifndef WIN32
+#include <compobj.h>
+#endif //!WIN32
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+#ifndef INITGUID
+# define INITGUID
+#endif
+
+// due to the previous header, including this causes the DEFINE_GUID
+// definitions in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
+
diff --git a/private/oleauto/sample/spoly/clsid.h b/private/oleauto/sample/spoly/clsid.h
new file mode 100644
index 000000000..1a53d3043
--- /dev/null
+++ b/private/oleauto/sample/spoly/clsid.h
@@ -0,0 +1,30 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+DEFINE_GUID(CLSID_CPoly, 0x00020462, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(CLSID_CPoint, 0x00020463, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+
+#ifdef INITGUID
+# ifdef _MAC
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+/* For the PPC Metroworks build do not define these */
+# if !defined(_MW_BUILD)
+DEFINE_GUID(IID_IDispatch, 0x00020400L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IEnumVARIANT, 0x00020404L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+DEFINE_GUID(IID_IUnknown, 0x00000000L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IClassFactory, 0x00000001L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+#endif
+
+
diff --git a/private/oleauto/sample/spoly/cpoint.cpp b/private/oleauto/sample/spoly/cpoint.cpp
new file mode 100644
index 000000000..0d2661f8f
--- /dev/null
+++ b/private/oleauto/sample/spoly/cpoint.cpp
@@ -0,0 +1,389 @@
+/***
+*cpoint.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module implements the CPoint and CPointCF classes.
+*
+* This module is intended as a sample implementation of the IDispatch
+* interface, and its purpose is to demonstrate how an object can
+* expose methods and properties for programatic and cross-process
+* access via the IDispatch interface.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "spoly.h"
+#include "cpoint.h"
+
+
+CPoint::CPoint()
+{
+ m_x = 0;
+ m_y = 0;
+ m_refs = 0;
+}
+
+/***
+*CPoint::Create(void)
+*Purpose:
+* Create an instance of a CPoint object.
+*
+*Entry:
+* None
+*
+*Exit:
+* returns a CPoint*, NULL if creation failed.
+*
+***********************************************************************/
+CPoint FAR*
+CPoint::Create()
+{
+ CPoint FAR* ppoint;
+
+ if((ppoint = new FAR CPoint()) == NULL)
+ return NULL;
+ ppoint->AddRef();
+ return ppoint;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CPoint::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(!IsEqualIID(riid, IID_IUnknown))
+ if(!IsEqualIID(riid, IID_IDispatch)) {
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+ }
+
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPoint::AddRef(void)
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPoint::Release(void)
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch methods
+//---------------------------------------------------------------------
+
+/*
+ * NOTE: Support for the following two methods is not available
+ * in this version.
+ *
+ */
+
+STDMETHODIMP
+CPoint::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = 0;
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CPoint::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
+{
+ UNUSED(itinfo);
+ UNUSED(lcid);
+ UNUSED(pptinfo);
+
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+/***
+*HRESULT CPoint::GetIDsOfNames(REFIID, OLECHAR**, unsigned int, LCID, long*)
+*Purpose:
+* This method translates the given array of names to a corresponding
+* array of DISPIDs.
+*
+* Index 0 of the name array is the member name, and indices 1-N if
+* present represent named parameters on that member.
+*
+* The local ID ('lcid') is unused by this naive implementation. A more
+* sophisticated implementation, sensitive to localization and natural
+* language support would use the locale ID to interpret the given names
+* in a correct locale specific context.
+*
+*Entry:
+* rgszNames = pointer to an array of names
+* cNames = the number of names in the rgszNames array
+* lcid = the callers locale ID
+*
+*Exit:
+* return value = HRESULT
+* rgid = array of name IDs corresponding to the rgszNames array
+* this array will contain -1 for each entry that is not known.
+*
+***********************************************************************/
+STDMETHODIMP
+CPoint::GetIDsOfNames(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+static MEMBERDESC rgmdCPoint[] = {
+ {OLESTR("GETX"), IDMEMBER_CPOINT_GETX, NULL, 0},
+ {OLESTR("SETX"), IDMEMBER_CPOINT_SETX, NULL, 0},
+ {OLESTR("GETY"), IDMEMBER_CPOINT_GETY, NULL, 0},
+ {OLESTR("SETY"), IDMEMBER_CPOINT_SETY, NULL, 0}
+};
+
+ // this object only exposed the "default" interface.
+ //
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ return SPolyGetIDsOfNames(
+ rgmdCPoint, DIM(rgmdCPoint), rgszNames, cNames, lcid, rgdispid);
+}
+
+
+/***
+*HRESULT CPoint::Invoke(...)
+*Purpose:
+* Dispatch a method or property request for objects of type CPoint.
+*
+* see the IDispatch document for more information, and a general
+* description of this method.
+*
+*Entry:
+* dispidMember = the DISPID of the member being requested
+*
+* riid = reference to the interface ID of the interface on this object
+* that the requested member belongs to. IID_NULL means to interpret
+* the member as belonging to the implementation defined "default"
+* or "primary" interface.
+*
+* lcid = the caller's locale ID
+*
+* wFlags = flags indicating the type of access being requested
+*
+* pdispparams = pointer to the DISPPARAMS struct containing the
+* requested members arguments (if any) and its named parameter
+* DISPIDs (if any).
+*
+*Exit:
+* return value = HRESULT
+* see the IDispatch spec for a description of possible success codes.
+*
+* pvarResult = pointer to a caller allocated VARIANT containing
+* the members return value (if any).
+*
+* pexcepinfo = caller allocated exception info structure, this will
+* be filled in only if an exception was raised that must be passed
+* up through Invoke to an enclosing handler.
+*
+* puArgErr = pointer to a caller allocated UINT, that will contain the
+* index of the offending argument if a DISP_E_TYPEMISMATCH error
+* was returned indicating that one of the arguments was of an
+* incorrect type and/or could not be reasonably coerced to a proper
+* type.
+*
+***********************************************************************/
+STDMETHODIMP
+CPoint::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ unsigned int uArgErr;
+ HRESULT hresult;
+ VARIANTARG varg0;
+ VARIANT varResultDummy;
+
+ UNUSED(lcid);
+ UNUSED(pexcepinfo);
+
+ // make sure the wFlags are legal
+ if(wFlags & ~(DISPATCH_METHOD | DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF))
+ return ResultFromScode(E_INVALIDARG);
+
+ // this object only exposes a "default" interface.
+ //
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ // this makes the following code a bit simpler
+ if(puArgErr == NULL)
+ puArgErr = &uArgErr;
+ if(pvarResult == NULL)
+ pvarResult = &varResultDummy;
+
+ VariantInit(&varg0);
+
+ // assume the return type is void, unless we find otherwise.
+ VariantInit(pvarResult);
+
+ switch(dispidMember){
+ case IDMEMBER_CPOINT_GETX:
+ V_VT(pvarResult) = VT_I2;
+ V_I2(pvarResult) = GetX();
+ break;
+
+ case IDMEMBER_CPOINT_SETX:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+ SetX(V_I2(&varg0));
+ break;
+
+ case IDMEMBER_CPOINT_GETY:
+ V_VT(pvarResult) = VT_I2;
+ V_I2(pvarResult) = GetY();
+ break;
+
+ case IDMEMBER_CPOINT_SETY:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+ SetY(V_I2(&varg0));
+ break;
+
+ default:
+ return ResultFromScode(DISP_E_MEMBERNOTFOUND);
+ }
+ return NOERROR;
+}
+
+short PASCAL
+CPoint::GetX()
+{
+ return m_x;
+}
+
+void PASCAL
+CPoint::SetX(short x)
+{
+ m_x = x;
+}
+
+short PASCAL
+CPoint::GetY()
+{
+ return m_y;
+}
+
+void PASCAL
+CPoint::SetY(short y)
+{
+ m_y = y;
+}
+
+
+//---------------------------------------------------------------------
+// Implementation of the CPoint Class Factory
+//---------------------------------------------------------------------
+
+CPointCF::CPointCF()
+{
+ m_refs = 0;
+}
+
+IClassFactory FAR*
+CPointCF::Create()
+{
+ CPointCF FAR* pCF;
+
+ if((pCF = new FAR CPointCF()) == NULL)
+ return NULL;
+ pCF->AddRef();
+ return pCF;
+}
+
+STDMETHODIMP
+CPointCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+
+ if(!IsEqualIID(riid, IID_IUnknown))
+ if(!IsEqualIID(riid, IID_IClassFactory)) {
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+ }
+
+ *ppv = this;
+ ++m_refs;
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CPointCF::AddRef(void)
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPointCF::Release(void)
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP
+CPointCF::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+ CPoint FAR *ppoint;
+
+ UNUSED(punkOuter);
+
+ if((ppoint = CPoint::Create()) == NULL){
+ *ppv = NULL;
+ return ResultFromScode(E_OUTOFMEMORY);
+ }
+ hresult = ppoint->QueryInterface(riid, ppv);
+ ppoint->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+#ifdef _MAC
+CPointCF::LockServer(unsigned long fLock)
+#else
+CPointCF::LockServer(BOOL fLock)
+#endif
+{
+ UNUSED(fLock);
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/sample/spoly/cpoint.h b/private/oleauto/sample/spoly/cpoint.h
new file mode 100644
index 000000000..93e4bae9b
--- /dev/null
+++ b/private/oleauto/sample/spoly/cpoint.h
@@ -0,0 +1,127 @@
+/***
+*cpoint.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CPoint class.
+*
+* The CPoint object exposes two properties for programatic access
+* via the IDispatch interface.
+*
+* properties:
+* X - the 'x' coordinate of the point
+* Y - the 'y' coordinate of the point
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef CLASS
+#ifdef __TURBOC__
+#define CLASS class huge
+#else
+#define CLASS class FAR
+#endif
+#endif
+
+class CPoly;
+
+CLASS CPoint : public IDispatch {
+ friend class CPoly;
+
+public:
+ static CPoint FAR* Create();
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IDispatch methods */
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pcTypeInfo);
+
+ STDMETHOD(GetTypeInfo)(
+ unsigned int iTypeInfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* ppTypeInfo);
+
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* pwArgErr);
+
+ /* Introduced methods */
+
+ virtual short PASCAL GetX(void);
+ virtual void PASCAL SetX(short x);
+ virtual short PASCAL GetY(void);
+ virtual void PASCAL SetY(short y);
+
+private:
+ CPoint();
+
+ unsigned long m_refs;
+
+ short m_x;
+ short m_y;
+};
+
+
+// member DISPIDs
+//
+enum IDMEMBER_CPOINT {
+ IDMEMBER_CPOINT_GETX = 1,
+ IDMEMBER_CPOINT_SETX,
+ IDMEMBER_CPOINT_GETY,
+ IDMEMBER_CPOINT_SETY,
+ IDMEMBER_CPOINT_MAX
+};
+
+// structure used to link together lists of points
+//
+struct POINTLINK {
+ POINTLINK FAR* next;
+ CPoint FAR* ppoint;
+};
+
+
+// The CPoint Class Factory
+//
+CLASS CPointCF : public IClassFactory
+{
+public:
+ static IClassFactory FAR* Create();
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID iid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IClassFactory methods */
+ STDMETHOD(CreateInstance)(
+ IUnknown FAR* pUnkOuter, REFIID iid, void FAR* FAR* ppv);
+#ifdef _MAC
+ STDMETHOD(LockServer)(unsigned long fLock);
+#else
+ STDMETHOD(LockServer)(BOOL fLock);
+#endif
+
+private:
+ CPointCF();
+
+ unsigned long m_refs;
+};
diff --git a/private/oleauto/sample/spoly/cpoly.cpp b/private/oleauto/sample/spoly/cpoly.cpp
new file mode 100644
index 000000000..e934f4433
--- /dev/null
+++ b/private/oleauto/sample/spoly/cpoly.cpp
@@ -0,0 +1,1034 @@
+/***
+*CPoly.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module implements the CPoly and CPolyCF classes.
+*
+* This module is intended as a sample implementation of the IDispatch
+* interface, and its purpose is to demonstrate how an object can
+* expose methods and properties for programatic and cross-process
+* access via the IDispatch interface.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+#include "cenumpt.h"
+
+#ifndef _MAC
+extern CStatBar FAR* g_psb;
+#else
+extern "C" WindowPtr g_pwndClient;
+#endif
+
+// our global list of polygons.
+//
+POLYLINK FAR* g_ppolylink = (POLYLINK FAR*)NULL;
+
+// global count of polygons.
+//
+int g_cPoly = 0;
+
+
+CPoly::CPoly()
+{
+ m_refs = 0;
+ m_xorg = 0;
+ m_yorg = 0;
+ m_width = 0;
+ m_cPoints = 0;
+
+ m_red = 0;
+ m_green = 0;
+ m_blue = 0;
+
+ m_ppointlink = NULL;
+ m_ppointlinkLast = NULL;
+}
+
+
+/***
+*CPoly *CPoly::Create(void)
+*Purpose:
+* Create an instance of a CPoly object, and add it to the global
+* list of polygons.
+*
+*Entry:
+* None
+*
+*Exit:
+* returns a polygon object, NULL the allocation failed.
+*
+***********************************************************************/
+CPoly FAR*
+CPoly::Create()
+{
+ CPoly FAR* ppoly;
+ POLYLINK FAR* ppolylink;
+
+ if((ppolylink = new FAR POLYLINK) == (POLYLINK FAR*)NULL)
+ return (CPoly FAR*)NULL;
+
+ if((ppoly = new FAR CPoly()) == (CPoly FAR*)NULL)
+ return (CPoly FAR*)NULL;
+
+ ppoly->AddRef();
+
+ // push the new polygon onto the front of the polygon list.
+ //
+ ++g_cPoly;
+
+ ppolylink->ppoly = ppoly;
+
+ ppolylink->next = g_ppolylink;
+ g_ppolylink = ppolylink;
+
+#ifndef _MAC
+ SBprintf(g_psb, TSTR("#poly = %d"), g_cPoly);
+#endif
+
+ return ppoly;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CPoly::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown) ||
+ IsEqualIID(riid, IID_IDispatch)) {
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPoly::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPoly::Release()
+{
+ POLYLINK FAR* FAR* pppolylink, FAR* ppolylinkDead;
+
+ if(--m_refs == 0){
+ Reset(); // release all CPoints
+
+ // remove ourselves from the global list of polygons
+ //
+ for( pppolylink = &g_ppolylink;
+ *pppolylink != NULL;
+ pppolylink = &(*pppolylink)->next)
+ {
+ if((*pppolylink)->ppoly == this){
+ ppolylinkDead = *pppolylink;
+ *pppolylink = (*pppolylink)->next;
+ delete ppolylinkDead;
+ break;
+ }
+ }
+
+ --g_cPoly;
+
+#ifndef _MAC
+ SBprintf(g_psb, TSTR("#poly = %d"), g_cPoly);
+#endif
+
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch Methods
+//---------------------------------------------------------------------
+
+
+/*
+ * NOTE: Support for the following two methods is not available
+ * in this version.
+ *
+ */
+
+STDMETHODIMP
+CPoly::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = 0;
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CPoly::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
+{
+ UNUSED(itinfo);
+ UNUSED(lcid);
+ UNUSED(pptinfo);
+
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+/***
+*HRESULT CPoly::GetIDsOfNames(OLECHAR**, unsigned int, LCID, long*)
+*Purpose:
+* This method translates the given array of names to a corresponding
+* array of DISPIDs.
+*
+* This method deferrs to a common implementation shared by
+* both the CPoly and CPoint objects. See the description of
+* 'SPolyGetIDsOfNames()' in dispimpl.cpp for more information.
+*
+*Entry:
+* rgszNames = pointer to an array of names
+* cNames = the number of names in the rgszNames array
+* lcid = the callers locale ID
+*
+*Exit:
+* return value = HRESULT
+* rgdispid = array of DISPIDs corresponding to the rgszNames array
+* this array will contain -1 for each entry that is not known.
+*
+***********************************************************************/
+STDMETHODIMP
+CPoly::GetIDsOfNames(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+static PARAMDESC rgpdAddPoint[] = {
+ {OLESTR("X")}, {OLESTR("Y")}
+};
+static MEMBERDESC rgmdCPoly[] = {
+ {OLESTR("DRAW"), IDMEMBER_CPOLY_DRAW, NULL, 0},
+ {OLESTR("RESET"), IDMEMBER_CPOLY_RESET, NULL, 0},
+ {OLESTR("ADDPOINT"), IDMEMBER_CPOLY_ADDPOINT, rgpdAddPoint, 2},
+ {OLESTR("ENUMPOINTS"), IDMEMBER_CPOLY_ENUMPOINTS, NULL, 0},
+ {OLESTR("GETXORIGIN"), IDMEMBER_CPOLY_GETXORIGIN, NULL, 0},
+ {OLESTR("SETXORIGIN"), IDMEMBER_CPOLY_SETXORIGIN, NULL, 0},
+ {OLESTR("GETYORIGIN"), IDMEMBER_CPOLY_GETYORIGIN, NULL, 0},
+ {OLESTR("SETYORIGIN"), IDMEMBER_CPOLY_SETYORIGIN, NULL, 0},
+ {OLESTR("GETWIDTH"), IDMEMBER_CPOLY_GETWIDTH, NULL, 0},
+ {OLESTR("SETWIDTH"), IDMEMBER_CPOLY_SETWIDTH, NULL, 0},
+ {OLESTR("get_red"), IDMEMBER_CPOLY_GETRED, NULL, 0},
+ {OLESTR("set_red"), IDMEMBER_CPOLY_SETRED, NULL, 0},
+ {OLESTR("get_green"), IDMEMBER_CPOLY_GETGREEN, NULL, 0},
+ {OLESTR("set_green"), IDMEMBER_CPOLY_SETGREEN, NULL, 0},
+ {OLESTR("get_blue"), IDMEMBER_CPOLY_GETBLUE, NULL, 0},
+ {OLESTR("set_blue"), IDMEMBER_CPOLY_SETBLUE, NULL, 0},
+ {OLESTR("DUMP"), IDMEMBER_CPOLY_DUMP, NULL, 0}
+};
+
+ // this object only exposes a "default" interface.
+ //
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ return SPolyGetIDsOfNames(
+ rgmdCPoly, DIM(rgmdCPoly), rgszNames, cNames, lcid, rgdispid);
+}
+
+
+/***
+*HRESULT CPoly::Invoke(...)
+*Purpose:
+* Dispatch a method or property request for objects of type CPoly.
+*
+* see the IDispatch document for more information, and a general
+* description of this method.
+*
+*Entry:
+* dispidMember = the DISPID of the member being requested
+*
+* riid = reference to the interface ID of the interface on this object
+* that the requested member belongs to. IID_NULL means to interpret
+* the member as belonging to the implementation defined "default"
+* or "primary" interface.
+*
+* lcid = the caller's locale ID
+*
+* wFlags = flags indicating the type of access being requested
+*
+* pdispparams = pointer to the DISPPARAMS struct containing the
+* requested members arguments (if any) and its named parameter
+* DISPIDs (if any).
+*
+*Exit:
+* return value = HRESULT
+* see the IDispatch spec for a description of possible success codes.
+*
+* pvarResult = pointer to a caller allocated VARIANT containing
+* the members return value (if any).
+*
+* pexcepinfo = caller allocated exception info structure, this will
+* be filled in only if an exception was raised that must be passed
+* up through Invoke to an enclosing handler.
+*
+* puArgErr = pointer to a caller allocated UINT, that will contain the
+* index of the offending argument if a DISP_E_TYPEMISMATCH error
+* was returned indicating that one of the arguments was of an
+* incorrect type and/or could not be reasonably coerced to a proper
+* type.
+*
+***********************************************************************/
+STDMETHODIMP
+CPoly::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ HRESULT hresult;
+ VARIANTARG varg0, varg1;
+ VARIANT varResultDummy;
+
+ UNUSED(lcid);
+ UNUSED(pexcepinfo);
+
+ if(wFlags & ~(DISPATCH_METHOD | DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF))
+ return ResultFromScode(E_INVALIDARG);
+
+ // this object only exposes a "default" interface.
+ //
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ // This makes the following code a bit simpler if the caller
+ // happens to be ignoring the return value. Some implementations
+ // may choose to deal with this differently.
+ //
+ if(pvarResult == (VARIANT FAR*)NULL)
+ pvarResult = &varResultDummy;
+
+ VariantInit(&varg0);
+ VariantInit(&varg1);
+
+ // assume the return type is void, unless we find otherwise.
+ VariantInit(pvarResult);
+
+ switch(dispidMember){
+ case IDMEMBER_CPOLY_DRAW:
+ Draw();
+ break;
+
+ case IDMEMBER_CPOLY_RESET:
+ Reset();
+ break;
+
+ case IDMEMBER_CPOLY_DUMP:
+ Dump();
+ break;
+
+ case IDMEMBER_CPOLY_ADDPOINT:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+
+ hresult = DispGetParam(pdispparams, 1, VT_I2, &varg1, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+
+ hresult = AddPoint(V_I2(&varg1), V_I2(&varg0));
+ if(hresult != NOERROR)
+ return hresult;
+ break;
+
+ case IDMEMBER_CPOLY_ENUMPOINTS:
+ IEnumVARIANT FAR* penum;
+
+ hresult = EnumPoints(&penum);
+ if(hresult != NOERROR)
+ return hresult;
+
+ V_VT(pvarResult) = VT_UNKNOWN;
+ hresult = penum->QueryInterface(
+ IID_IUnknown, (void FAR* FAR*)&V_UNKNOWN(pvarResult));
+ if(hresult != NOERROR)
+ return hresult;
+ penum->Release();
+ break;
+
+ case IDMEMBER_CPOLY_GETXORIGIN:
+ V_VT(pvarResult) = VT_I2;
+ V_I2(pvarResult) = m_xorg;
+ break;
+
+ case IDMEMBER_CPOLY_SETXORIGIN:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+ m_xorg = V_I2(&varg0);
+ break;
+
+ case IDMEMBER_CPOLY_GETYORIGIN:
+ V_VT(pvarResult) = VT_I2;
+ V_I2(pvarResult) = m_yorg;
+ break;
+
+ case IDMEMBER_CPOLY_SETYORIGIN:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+ m_yorg = V_I2(&varg0);
+ break;
+
+ case IDMEMBER_CPOLY_GETWIDTH:
+ V_VT(pvarResult) = VT_I2;
+ V_I2(pvarResult) = GetWidth();
+ break;
+
+ case IDMEMBER_CPOLY_SETWIDTH:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+ SetWidth(V_I2(&varg0));
+ break;
+
+ case IDMEMBER_CPOLY_GETRED:
+ V_VT(pvarResult) = VT_I2;
+ V_I2(pvarResult) = get_red();
+ break;
+
+ case IDMEMBER_CPOLY_SETRED:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+ set_red(V_I2(&varg0));
+ break;
+
+ case IDMEMBER_CPOLY_GETGREEN:
+ V_VT(pvarResult) = VT_I2;
+ V_I2(pvarResult) = get_green();
+ break;
+
+ case IDMEMBER_CPOLY_SETGREEN:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+ set_green(V_I2(&varg0));
+ break;
+
+ case IDMEMBER_CPOLY_GETBLUE:
+ V_VT(pvarResult) = VT_I2;
+ V_I2(pvarResult) = get_blue();
+ break;
+
+ case IDMEMBER_CPOLY_SETBLUE:
+ hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
+ if(hresult != NOERROR)
+ return hresult;
+ set_blue(V_I2(&varg0));
+ break;
+
+ default:
+ return ResultFromScode(DISP_E_MEMBERNOTFOUND);
+ }
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// Introduced Methods
+//---------------------------------------------------------------------
+
+
+/***
+*void CPoly::Draw(void)
+*Purpose:
+* Draw the polygon, using the current x/y origin and line width
+* properties.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void PASCAL
+CPoly::Draw()
+{
+ short xorg, yorg;
+ POINTLINK FAR* ppointlinkFirst, FAR* ppointlink;
+
+ if((ppointlinkFirst = m_ppointlink) == (POINTLINK FAR*)NULL)
+ return;
+
+#ifdef _MAC /* { */
+
+ short x, y;
+ RGBColor rgb;
+ WindowPtr pwndSaved;
+
+ GetPort(&pwndSaved);
+ SetPort(g_pwndClient);
+
+ PenNormal();
+ PenSize(m_width, m_width);
+
+ rgb.red = m_red;
+ rgb.green = m_green;
+ rgb.blue = m_blue;
+ RGBForeColor(&rgb);
+
+ xorg = m_xorg;
+ yorg = m_yorg;
+
+ MoveTo(
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y);
+
+ for(ppointlink = ppointlinkFirst->next;
+ ppointlink != (POINTLINK FAR*)NULL;
+ ppointlink = ppointlink->next)
+ {
+ x = xorg + ppointlink->ppoint->m_x;
+ y = yorg + ppointlink->ppoint->m_y;
+ LineTo(x, y);
+ }
+
+ LineTo(
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y);
+
+ SetPort(pwndSaved);
+
+#else /* }{ */
+
+ HDC hdc;
+ RECT rect;
+ HPEN hpen, hpenOld;
+extern HWND g_hwndClient;
+
+ GetClientRect(g_hwndClient, &rect);
+ xorg = m_xorg + (short) rect.left;
+ yorg = m_yorg + (short) rect.top;
+
+ hdc = GetDC(g_hwndClient);
+ hpen = CreatePen(PS_SOLID, m_width, RGB(m_red, m_green, m_blue));
+ hpenOld = (HPEN)SelectObject(hdc, hpen);
+
+#ifdef WIN32
+ MoveToEx(hdc,
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y, NULL);
+#else
+ MoveTo(hdc,
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y);
+#endif
+
+ for(ppointlink = ppointlinkFirst->next;
+ ppointlink != (POINTLINK FAR*)NULL;
+ ppointlink = ppointlink->next)
+ {
+ LineTo(hdc,
+ xorg + ppointlink->ppoint->m_x,
+ yorg + ppointlink->ppoint->m_y);
+ }
+
+ LineTo(hdc,
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y);
+
+ SelectObject(hdc, hpenOld);
+ DeleteObject(hpen);
+
+ ReleaseDC(g_hwndClient, hdc);
+
+#endif /* } */
+}
+
+
+/***
+*void CPoly::Reset(void)
+*Purpose:
+* Release all points referenced by this poly.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void PASCAL
+CPoly::Reset()
+{
+ POINTLINK FAR* ppointlink, FAR* ppointlinkNext;
+
+ for(ppointlink = m_ppointlink;
+ ppointlink != (POINTLINK FAR*)NULL;
+ ppointlink = ppointlinkNext)
+ {
+ ppointlinkNext = ppointlink->next;
+ ppointlink->ppoint->Release();
+ delete ppointlink;
+ }
+
+ m_cPoints = 0;
+ m_ppointlink = NULL;
+ m_ppointlinkLast = NULL;
+}
+
+
+/***
+*HRESULT CPoly::AddPoint(short, short)
+*Purpose:
+* Add a CPoint with the given coordinates to the end of our current
+* list of points.
+*
+*Entry:
+* x,y = the x and y coordinates of the new point.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT PASCAL
+CPoly::AddPoint(short x, short y)
+{
+ CPoint FAR* ppoint;
+ POINTLINK FAR* ppointlink;
+
+ ppoint = CPoint::Create();
+ if(ppoint == (CPoint FAR*)NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+ ppoint->SetX(x);
+ ppoint->SetY(y);
+
+ ppointlink = new FAR POINTLINK;
+ if(ppointlink == (POINTLINK FAR*)NULL){
+ delete ppoint;
+ return ResultFromScode(E_OUTOFMEMORY);
+ }
+
+ ppointlink->ppoint = ppoint;
+ ppointlink->next = (POINTLINK FAR*)NULL;
+
+ if(m_ppointlinkLast == (POINTLINK FAR*)NULL){
+ m_ppointlink = m_ppointlinkLast = ppointlink;
+ }else{
+ m_ppointlinkLast->next = ppointlink;
+ m_ppointlinkLast = ppointlink;
+ }
+
+ ++m_cPoints;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CPoly::EnumPoints(IEnumVARIANT**);
+*Purpose:
+* Return and enumerator for the points in this polygon.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppenum = pointer to an IEnumVARIANT for the points in this polygon
+*
+***********************************************************************/
+HRESULT PASCAL
+CPoly::EnumPoints(IEnumVARIANT FAR* FAR* ppenum)
+{
+ unsigned int i;
+ VARIANT var;
+ HRESULT hresult;
+ SAFEARRAY FAR* psa;
+ CEnumPoint FAR* penum;
+ POINTLINK FAR* ppointlink;
+ SAFEARRAYBOUND rgsabound[1];
+
+ rgsabound[0].lLbound = 0;
+ rgsabound[0].cElements = m_cPoints;
+
+ psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
+ if(psa == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ ppointlink = m_ppointlink;
+ for(i = 0; i < m_cPoints; ++i){
+ long ix[1];
+
+ if(ppointlink == NULL){
+ // this indicates an internal consistency error.
+ // (this test should probably be an assertion)
+ hresult = ResultFromScode(E_FAIL);
+ goto LError1;
+ }
+
+ V_VT(&var) = VT_DISPATCH;
+ hresult = ppointlink->ppoint->QueryInterface(
+ IID_IDispatch, (void FAR* FAR*)&V_DISPATCH(&var));
+ if(hresult != NOERROR)
+ goto LError1;
+
+ ix[0] = i;
+ SafeArrayPutElement(psa, ix, &var);
+
+ ppointlink = ppointlink->next;
+ }
+
+ hresult = CEnumPoint::Create(psa, &penum);
+ if(hresult != NOERROR)
+ goto LError1;
+
+ *ppenum = penum;
+
+ return NOERROR;
+
+LError1:;
+ // destroy the array if we were not successful creating the enumerator.
+ SafeArrayDestroy(psa);
+
+LError0:;
+ return hresult;
+}
+
+short PASCAL
+CPoly::GetXOrigin()
+{
+ return m_xorg;
+}
+
+void PASCAL
+CPoly::SetXOrigin(short x)
+{
+ m_xorg = x;
+}
+
+short PASCAL
+CPoly::GetYOrigin()
+{
+ return m_yorg;
+}
+
+void PASCAL
+CPoly::SetYOrigin(short y)
+{
+ m_yorg = y;
+}
+
+short PASCAL
+CPoly::GetWidth()
+{
+ return m_width;
+}
+
+void PASCAL
+CPoly::SetWidth(short width)
+{
+ m_width = width;
+}
+
+short PASCAL
+CPoly::get_red()
+{
+ return m_red;
+}
+
+void PASCAL
+CPoly::set_red(short red)
+{
+ m_red = red;
+}
+
+short PASCAL
+CPoly::get_green()
+{
+ return m_green;
+}
+
+void PASCAL
+CPoly::set_green(short green)
+{
+ m_green = green;
+}
+
+short PASCAL
+CPoly::get_blue()
+{
+ return m_blue;
+}
+
+void PASCAL
+CPoly::set_blue(short blue)
+{
+ m_blue = blue;
+}
+
+
+/***
+*void CPoly::Dump(void)
+*Purpose:
+* Output a debug dump of this instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void PASCAL
+CPoly::Dump()
+{
+#ifdef _MAC
+
+ // REVIEW: implement for the mac
+
+#else
+
+ TCHAR buffer[80];
+ POINTLINK FAR* ppointlink;
+
+ wsprintf(buffer, TSTR("CPoly(0x%x) =\n"), (int)this);
+ OutputDebugString(buffer);
+
+ wsprintf(buffer,
+ TSTR(" xorg = %d, yorg = %d, width = %d, rgb = {%d,%d,%d}\n points = "),
+ m_xorg, m_yorg, m_width,
+ get_red(),
+ get_green(),
+ get_blue());
+
+ OutputDebugString(buffer);
+
+ for(ppointlink = m_ppointlink;
+ ppointlink != (POINTLINK FAR*)NULL;
+ ppointlink = ppointlink->next)
+ {
+ wsprintf(buffer, TSTR("{%d,%d}"),
+ ppointlink->ppoint->GetX(),
+ ppointlink->ppoint->GetY());
+ OutputDebugString(buffer);
+
+ wsprintf(buffer, TSTR(" "));
+ OutputDebugString(buffer);
+ }
+ wsprintf(buffer, TSTR("\n"));
+ OutputDebugString(buffer);
+
+#endif
+}
+
+/***
+*void CPoly::PolyDraw(void)
+*Purpose:
+* Draw all polygons.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CPoly::PolyDraw()
+{
+ POLYLINK FAR* polylink;
+
+ for(polylink = g_ppolylink;
+ polylink != (POLYLINK FAR*)NULL;
+ polylink = polylink->next)
+ {
+ polylink->ppoly->Draw();
+ }
+}
+
+
+/***
+*void PolyTerm(void)
+*Purpose:
+* Release all polygons.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CPoly::PolyTerm()
+{
+ POLYLINK FAR* ppolylink;
+ POLYLINK FAR* ppolylinkNext;
+
+ for(ppolylink = g_ppolylink;
+ ppolylink != (POLYLINK FAR*)NULL;
+ ppolylink = ppolylinkNext)
+ {
+ ppolylinkNext = ppolylink->next;
+ ppolylink->ppoly->Release();
+ delete ppolylink;
+ }
+ g_ppolylink = NULL;
+}
+
+
+/***
+*void PolyDump(void)
+*Purpose:
+* Invoke the debug Dump() method on all polygons were currently
+* holding on to.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CPoly::PolyDump()
+{
+ POLYLINK FAR* ppolylink;
+
+ if(g_ppolylink == (POLYLINK FAR*)NULL){
+#ifndef _MAC
+ OutputDebugString(TSTR("\t(none)\n"));
+#endif
+ return;
+ }
+
+ for(ppolylink = g_ppolylink;
+ ppolylink != (POLYLINK FAR*)NULL;
+ ppolylink = ppolylink->next)
+ {
+ ppolylink->ppoly->Dump();
+ }
+}
+
+
+//---------------------------------------------------------------------
+// Implementation of the CPoly Class Factory
+//---------------------------------------------------------------------
+
+
+CPolyCF::CPolyCF()
+{
+ m_refs = 0;
+}
+
+IClassFactory FAR*
+CPolyCF::Create()
+{
+ CPolyCF FAR* pCF;
+
+ if((pCF = new FAR CPolyCF()) == NULL)
+ return NULL;
+ pCF->AddRef();
+ return pCF;
+}
+
+STDMETHODIMP
+CPolyCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(!IsEqualIID(riid, IID_IUnknown)){
+ if(!IsEqualIID(riid, IID_IClassFactory)){
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+ }
+ }
+
+ *ppv = this;
+ ++m_refs;
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CPolyCF::AddRef(void)
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPolyCF::Release(void)
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP
+CPolyCF::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID iid,
+ void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+ CPoly FAR *ppoly;
+
+ UNUSED(punkOuter);
+
+#ifdef _MAC
+ if(GetZone() != ApplicZone()){
+#ifndef _MSC_VER
+#ifndef ConstStr255Param
+#define ConstStr255Param StringPtr
+#endif
+#endif
+ DebugStr((ConstStr255Param)"\pZones do not match");
+ }
+
+#endif
+
+ if((ppoly = CPoly::Create()) == NULL){
+ *ppv = NULL;
+ return ResultFromScode(E_OUTOFMEMORY);
+ }
+ hresult = ppoly->QueryInterface(iid, ppv);
+ ppoly->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+#ifdef _MAC
+CPolyCF::LockServer(unsigned long fLock)
+#else
+CPolyCF::LockServer(BOOL fLock)
+#endif
+{
+ UNUSED(fLock);
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/sample/spoly/cpoly.h b/private/oleauto/sample/spoly/cpoly.h
new file mode 100644
index 000000000..360056b85
--- /dev/null
+++ b/private/oleauto/sample/spoly/cpoly.h
@@ -0,0 +1,203 @@
+/***
+*cpoly.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CPoly class.
+*
+* The CPoly class defines a number of methods and exposes them for
+* external programmability via IDispatch,
+*
+* methods:
+* DRAW - draw the polygon
+* RESET - delete all points from the polygon
+*
+* ADDPOINT(X, Y) - add a point with coordinates (x,y) to the polygon
+*
+* ENUMPOINTS - return a collection of the polygon's points
+*
+* GETXORIGIN - get and set the X origin of the polygon
+* SETXORIGIN
+*
+* GETYORIGIN - get and set the Y origin of the polygon
+* SETYORIGIN
+*
+* GETWIDTH - get and set the line width of the polygon
+* SETWIDTH
+*
+* UNDONE: update description
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+#ifndef CLASS
+# ifdef __TURBOC__
+# define CLASS class huge
+# else
+# define CLASS class FAR
+# endif
+#endif
+
+class CPoint;
+
+CLASS CPoly : public IDispatch
+{
+public:
+ static CPoly FAR* Create();
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IDispatch methods */
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pcTypeInfo);
+
+ STDMETHOD(GetTypeInfo)(
+ unsigned int iTypeInfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* ppTypeInfo);
+
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ /* Introduced methods */
+
+ virtual void PASCAL Draw(void);
+ virtual void PASCAL Reset(void);
+
+ // add a point with the given 'x' and 'y' coordinates
+ virtual HRESULT PASCAL AddPoint(short x, short y);
+
+ // return a collection of the polygon's points
+ virtual HRESULT PASCAL EnumPoints(IEnumVARIANT FAR* FAR* ppenum);
+
+ // get/set the polygon's X origin property
+ virtual short PASCAL GetXOrigin(void);
+ virtual void PASCAL SetXOrigin(short x);
+
+ // get/set the polygon's Y origin property
+ virtual short PASCAL GetYOrigin(void);
+ virtual void PASCAL SetYOrigin(short y);
+
+ virtual short PASCAL GetWidth(void);
+ virtual void PASCAL SetWidth(short width);
+
+ virtual short PASCAL get_red(void);
+ virtual void PASCAL set_red(short red);
+
+ virtual short PASCAL get_green(void);
+ virtual void PASCAL set_green(short green);
+
+ virtual short PASCAL get_blue(void);
+ virtual void PASCAL set_blue(short blue);
+
+ // Debug method
+ virtual void PASCAL Dump(void);
+
+public:
+
+ // Draw all polygons.
+ static void PolyDraw(void);
+
+ // Release all polygons.
+ static void PolyTerm(void);
+
+ // Dump all polygons to dbwin.
+ static void PolyDump(void);
+
+
+private:
+ CPoly();
+
+ short m_xorg;
+ short m_yorg;
+ short m_width;
+
+ short m_red;
+ short m_green;
+ short m_blue;
+
+ unsigned long m_refs;
+ unsigned int m_cPoints;
+
+ POINTLINK FAR* m_ppointlink;
+ POINTLINK FAR* m_ppointlinkLast;
+};
+
+// DISPIDs for the members and properties available via IDispatch.
+//
+enum IDMEMBER_CPOLY {
+ IDMEMBER_CPOLY_DRAW = 1,
+ IDMEMBER_CPOLY_RESET,
+ IDMEMBER_CPOLY_ADDPOINT,
+ IDMEMBER_CPOLY_ENUMPOINTS,
+ IDMEMBER_CPOLY_GETXORIGIN,
+ IDMEMBER_CPOLY_SETXORIGIN,
+ IDMEMBER_CPOLY_GETYORIGIN,
+ IDMEMBER_CPOLY_SETYORIGIN,
+ IDMEMBER_CPOLY_GETWIDTH,
+ IDMEMBER_CPOLY_SETWIDTH,
+ IDMEMBER_CPOLY_GETRED,
+ IDMEMBER_CPOLY_SETRED,
+ IDMEMBER_CPOLY_GETGREEN,
+ IDMEMBER_CPOLY_SETGREEN,
+ IDMEMBER_CPOLY_GETBLUE,
+ IDMEMBER_CPOLY_SETBLUE,
+ IDMEMBER_CPOLY_DUMP,
+ IDMEMBER_CPOLY_MAX
+};
+
+// structure used to link together polygons
+//
+struct POLYLINK {
+ POLYLINK FAR* next;
+ CPoly FAR* ppoly;
+};
+
+
+// The CPoly class factory
+//
+CLASS CPolyCF : public IClassFactory
+{
+public:
+ static IClassFactory FAR* Create();
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IClassFactory methods */
+ STDMETHOD(CreateInstance)(
+ IUnknown FAR* pUnkOuter, REFIID riid, void FAR* FAR* ppv);
+#ifdef _MAC
+ STDMETHOD(LockServer)(unsigned long fLock);
+#else
+ STDMETHOD(LockServer)(BOOL fLock);
+#endif
+
+private:
+ CPolyCF();
+
+ unsigned long m_refs;
+};
+
diff --git a/private/oleauto/sample/spoly/hostenv.h b/private/oleauto/sample/spoly/hostenv.h
new file mode 100644
index 000000000..56a311393
--- /dev/null
+++ b/private/oleauto/sample/spoly/hostenv.h
@@ -0,0 +1,117 @@
+/***
+*hostenv.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Generic host specific includes.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(_MAC)
+
+#if defined(_PPCMAC)
+#pragma data_seg("_FAR_DATA")
+#pragma data_seg( )
+#define MAXLONG 0x7fffffff
+#define EventHandlerProcPtr AEEventHandlerUPP
+#else //_PPCMAC
+#define GetMenuItemText(mApple,menuItem,daName) GetItem(mApple,menuItem,daName)
+#endif //_PPCMAC
+
+#endif //_MAC
+
+#if defined(_MAC)
+
+#if defined(_MSC_VER)
+
+# include <values.h>
+# include <types.h>
+# include <string.h>
+# include <quickdra.h>
+# include <fonts.h>
+# include <events.h>
+# include <resource.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutil.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEve.h>
+
+#else //_MSC_VER
+
+# include <values.h>
+# include <types.h>
+# include <strings.h>
+# include <quickdraw.h>
+# include <fonts.h>
+# include <events.h>
+# include <resources.h>
+# include <windows.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutils.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEvents.h>
+
+#endif //_MSC_VER
+
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+
+#elif defined(WIN32)
+
+# include <windows.h>
+
+# if defined(UNICODE)
+ #define TCHAR WCHAR
+ #define TSTR(str) L##str
+ #define STRING(str) (str)
+ #define WIDESTRING(str) (str)
+# else
+ #define TCHAR char
+ #define TSTR(str) str
+ #define STRING(str) AnsiString(str)
+ #define WIDESTRING(str) WideString(str)
+ extern "C" char FAR* AnsiString(OLECHAR FAR* strIn);
+ extern "C" OLECHAR FAR* WideString(char FAR* strIn);
+# endif
+
+
+#else /* WIN16 */
+
+# include <windows.h>
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+#endif
+
diff --git a/private/oleauto/sample/spoly/macmain.cpp b/private/oleauto/sample/spoly/macmain.cpp
new file mode 100644
index 000000000..d6cc003d5
--- /dev/null
+++ b/private/oleauto/sample/spoly/macmain.cpp
@@ -0,0 +1,398 @@
+/***
+*macmain.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module is the main entry point for the sample IDispatch polygon
+* server, spoly.exe.
+*
+* This program is intended to demonstrate an implementation of the IDispatch
+* interface. Spoly is a very simple app, that implements two simple objects,
+* CPoly and CPoint and exposes their properties and methods for programatic
+* and cross-process access via IDispatch.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+
+#include <stdio.h>
+
+extern "C" {
+
+Boolean g_fInitOle = false;
+#ifndef _PPCMAC
+Boolean g_fInitLibraryManager = false;
+#endif //!_PPCMAC
+
+WindowPtr g_pwndClient = nil;
+
+}
+
+void Init(void);
+void EventLoop(void);
+
+void AdjustMenus(void);
+void Close(WindowPtr window);
+void DoEvent(EventRecord *pevent);
+void DoMenuCommand(long menuResult);
+void Quit(void);
+#ifndef _MSC_VER
+#ifndef ConstStr255Param
+#define ConstStr255Param StringPtr
+#endif
+#endif
+void Fatal(ConstStr255Param);
+
+Boolean
+IsAppWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : ((WindowPeek)window)->windowKind == userKind;
+}
+
+Boolean
+IsDAWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind < 0);
+}
+
+void
+main()
+{
+ Init();
+ EventLoop();
+}
+
+void
+EventLoop()
+{
+ EventRecord event;
+ RgnHandle cursorRgn;
+
+ cursorRgn = NewRgn();
+ while(1){
+ if(WaitNextEvent(everyEvent, &event, MAXLONG, cursorRgn))
+ DoEvent(&event);
+ }
+}
+
+void
+DoEvent(EventRecord *pevent)
+{
+ char key;
+ short part;
+ WindowPtr window;
+
+ switch(pevent->what){
+ case mouseDown:
+ part = FindWindow(pevent->where, &window);
+ switch(part){
+ case inMenuBar:
+ AdjustMenus();
+ DoMenuCommand(MenuSelect(pevent->where));
+ break;
+
+ case inSysWindow: /* let the system handle the mouseDown */
+ SystemClick(pevent, window);
+ break;
+
+ case inContent:
+ if(window != FrontWindow()){
+ SelectWindow(window);
+ }
+ break;
+
+ case inDrag:
+ DragWindow(window, pevent->where, &qd.screenBits.bounds);
+ break;
+ }
+ break;
+
+ case keyDown:
+ case autoKey: /* check for menukey equivalents */
+ key = (char)(pevent->message & charCodeMask);
+ if(pevent->modifiers & cmdKey){ /* Command key down */
+ if(pevent->what == keyDown){
+ /* enable/disable/check menu items properly */
+ AdjustMenus();
+ DoMenuCommand(MenuKey(key));
+ }
+ }
+ break;
+
+ case updateEvt:
+ window = (WindowPtr)pevent->message;
+ if(IsAppWindow(window)){
+ BeginUpdate(window);
+ if(!EmptyRgn(window->visRgn)){
+ SetPort(window);
+ EraseRect(&window->portRect);
+ }
+ EndUpdate(window);
+ }
+ break;
+
+ case kHighLevelEvent:
+ AEProcessAppleEvent(pevent);
+ break;
+ }
+}
+
+void
+Enable(MenuHandle hmenu, short sItem, Boolean fEnable)
+{
+ if(fEnable)
+ EnableItem(hmenu, sItem);
+ else
+ DisableItem(hmenu, sItem);
+}
+
+void
+AdjustMenus()
+{
+ Boolean fIsDA;
+ MenuHandle hmenu;
+
+ fIsDA = IsDAWindow(FrontWindow());
+
+ /* we can allow desk accessories to be closed from the menu */
+ hmenu = GetMHandle(mFile);
+ Enable(hmenu, iClose, fIsDA);
+
+ hmenu = GetMHandle(mEdit);
+ Enable(hmenu, iUndo, fIsDA);
+ Enable(hmenu, iCut, fIsDA);
+ Enable(hmenu, iCopy, fIsDA);
+ Enable(hmenu, iClear, fIsDA);
+ Enable(hmenu, iPaste, fIsDA);
+}
+
+// Spoly self test
+HRESULT
+DoPoly()
+{
+ HRESULT hresult;
+ int numpoly, i, j;
+
+static struct {
+ short x;
+ short y;
+} rgptPoly[] = {
+ { 25, 0}
+ , { 75, 0}
+ , {100, 25}
+ , {100, 75}
+ , { 75, 100}
+ , { 25, 100}
+ , { 0, 75}
+ , { 0, 25}
+};
+
+static struct {
+ short red;
+ short green;
+ short blue;
+} rgrgbColors[] = {
+ { 0, 0, 0}
+ , { 0, 0, 0x7fff}
+ , { 0, 0x7fff, 0}
+ , {0x7fff, 0, 0}
+ , {0x7fff, 0, 0x7fff}
+ , {0x7fff, 0x7fff, 0}
+ , {0x7fff, 0x7fff, 0x7fff}
+};
+
+ CPoly *rgprempoly[DIM(rgrgbColors)];
+
+ numpoly = DIM(rgprempoly);
+
+ // init
+ for(i = 0; i < numpoly; ++i)
+ rgprempoly[i] = (CPoly*)NULL;
+
+ for(i = 0; i < numpoly; ++i){
+ if((rgprempoly[i] = CPoly::Create()) == NULL)
+ goto LError0;
+
+ for(j = 0; j < DIM(rgptPoly); ++j)
+ rgprempoly[i]->AddPoint(rgptPoly[j].x, rgptPoly[j].y);
+
+ for(j = 0; j < DIM(rgrgbColors); ++j){
+ rgprempoly[i]->SetWidth(i + j);
+ rgprempoly[i]->set_red(rgrgbColors[j].red);
+ rgprempoly[i]->set_green(rgrgbColors[j].green);
+ rgprempoly[i]->set_blue(rgrgbColors[j].blue);
+ rgprempoly[i]->SetXOrigin((2*i) + j << 4);
+ rgprempoly[i]->SetYOrigin(j << 4);
+ rgprempoly[i]->Draw();
+ }
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+ for(i = 0; i < numpoly; ++i){
+ if(rgprempoly[i] != (CPoly*)NULL){
+ rgprempoly[i]->Release();
+ }
+ }
+
+ return hresult;
+}
+
+void
+DoMenuCommand(long menuResult)
+{
+ short menuID; /* the resource ID of the selected menu */
+ short menuItem; /* the item number of the selected menu */
+ Str255 daName;
+
+ menuID = HiWord(menuResult);
+ menuItem = LoWord(menuResult);
+
+ switch(menuID){
+ case mApple:
+ switch(menuItem){
+ case iAbout: /* bring up alert for About */
+ Alert(rAboutAlert, nil);
+ break;
+ default:
+ GetMenuItemText(GetMHandle(mApple), menuItem, daName);
+ OpenDeskAcc(daName);
+ break;
+ }
+ break;
+
+ case mFile:
+ switch(menuItem){
+ case iClose:
+ Close(FrontWindow());
+ break;
+ case iQuit:
+ Quit();
+ break;
+ }
+ break;
+
+ case mEdit:
+ SystemEdit(menuItem-1);
+ break;
+
+ case mSpoly:
+ switch(menuItem){
+ case iTest:
+ DoPoly();
+ break;
+ }
+ }
+
+ HiliteMenu(0);
+}
+
+void
+Close(WindowPtr window)
+{
+ if(IsDAWindow(window))
+ CloseDeskAcc(((WindowPeek)window)->windowKind);
+ else if(IsAppWindow(window))
+ CloseWindow(window);
+}
+
+#if defined(_MSC_VER)
+OSErr pascal
+#else
+pascal OSErr
+#endif
+RemoteLowLevelEvt(AppleEvent theAppEvt, AppleEvent reply, long HandlerRefCon)
+{
+ long cb;
+ OSErr err;
+ DescType descType;
+ EventRecord event;
+
+ UNUSED(reply);
+ UNUSED(HandlerRefCon);
+
+ err = AEGetKeyPtr(
+ &theAppEvt,
+ keyDirectObject,
+ typeWildCard,
+ &descType,
+ (Ptr)&event, sizeof(event), &cb);
+
+ if(err != noErr)
+ return err;
+
+ DoEvent(&event);
+
+ return noErr;
+}
+
+void
+Init()
+{
+ Handle menuBar;
+
+ MaxApplZone();
+
+ InitGraf((Ptr)&qd.thePort);
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ TEInit();
+ InitDialogs(nil);
+ InitCursor();
+ FlushEvents(everyEvent, 0);
+
+#ifndef _PPCMAC
+ if (InitOleManager(0) != NOERROR)
+ Fatal((ConstStr255Param)"\pCould not initialize OLE Applet");
+ g_fInitLibraryManager = true;
+#endif //_PPCMAC
+
+ if(InitOle() != NOERROR)
+ Fatal((ConstStr255Param)"\pUnable to Initialize Ole");
+ g_fInitOle = true;
+
+ if(AEInstallEventHandler('OLE2', 'EVNT', (EventHandlerProcPtr)RemoteLowLevelEvt, 0, false) != noErr)
+ Fatal((ConstStr255Param)"\pUnable to install handler");
+
+ if((g_pwndClient = (WindowPtr)NewPtr(sizeof(WindowRecord))) == nil)
+ Fatal((ConstStr255Param)"\pOut of memory");
+ g_pwndClient = GetNewCWindow(rWindow, (Ptr)g_pwndClient, (WindowPtr)-1);
+
+ if((menuBar = GetNewMBar(rMenuBar)) == nil)
+ Fatal((ConstStr255Param)"\pUnable to load menu bar");
+ SetMenuBar(menuBar);
+ DisposHandle(menuBar);
+ AddResMenu(GetMHandle(mApple), 'DRVR'); /* add DA names to Apple menu */
+ DrawMenuBar();
+}
+
+void
+Quit()
+{
+ if(g_fInitOle)
+ UninitOle();
+#ifndef _PPCMAC
+ if(g_fInitLibraryManager)
+ UninitOleManager(); // clean up applet
+#endif //_PPCMAC
+ ExitToShell();
+}
+
+/* display fatal error alert, and exit */
+void
+Fatal(ConstStr255Param msg)
+{
+ SetCursor(&qd.arrow);
+ ParamText(msg, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
+ Alert(rUserAlert, nil);
+ Quit();
+}
diff --git a/private/oleauto/sample/spoly/makefile b/private/oleauto/sample/spoly/makefile
new file mode 100644
index 000000000..4a473697d
--- /dev/null
+++ b/private/oleauto/sample/spoly/makefile
@@ -0,0 +1,335 @@
+##############################################################################
+#
+# (c) Copyright Microsoft Corp. 1992-1994 All Rights Reserved
+#
+# File:
+#
+# makefile - makefile for spoly.exe
+#
+# Purpose:
+#
+# Builds the OLE 2.0 sample IDispatch server, spoly.exe.
+#
+#
+# Usage:
+#
+# NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option:
+# dev = [win16 | win32 | mac] ; dev=win16 is the default
+# CPU = [i386 | M68K | MIPS | ALPHA | PPC]
+# DEBUG=[0|1] ; DEBUG=1 is the default
+#
+# Notes:
+#
+# This makefile assumes that the PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+##############################################################################
+
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if "$(dev)" == ""
+dev = win16
+!endif
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32" || "$(dev)" == "mac")
+!error Invalid dev option, choose from [win16 | win32 | mac]
+!endif
+
+!if "$(dev)" == "win16"
+TARGET = WIN16
+!endif
+
+!if "$(dev)" == "win32"
+TARGET = WIN32
+!endif
+
+!if "$(dev)" == "mac"
+TARGET = MAC
+!endif
+
+!if "$(DEBUG)" == ""
+DEBUG = 1
+!endif
+
+
+##########################################################################
+#
+# WIN16 Settings
+#
+!if "$(TARGET)" == "WIN16"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -dWIN16
+CFLAGS = -W3 -AM -GA -GEs -DWIN16
+LINKFLAGS = /NOD /NOI /BATCH /ONERROR:NOEXE
+
+LIBS = libw.lib mlibcew.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) /COD
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+LINKFLAGS = $(LINKFLAGS) /FAR /PACKC
+!endif
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARGET)" == "WIN32"
+
+!if "$(CPU)"==""
+
+!if "$(PROCESSOR_ARCHITECTURE)"=="" || "$(PROCESSOR_ARCHITECTURE)"=="x86"
+CPU=i386
+!else
+CPU=$(PROCESSOR_ARCHITECTURE)
+!endif
+
+!endif #CPU
+
+!if "$(CPU)" == "i386"
+CC = cl386
+LINK = link
+CFLAGS = -D_X86_=1
+!endif
+!if "$(CPU)" == "MIPS"
+CC = cl
+LINK = link
+CFLAGS = -D_MIPS_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "ALPHA"
+CC = claxp
+LINK = link
+CFLAGS = -D_ALPHA_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "PPC"
+CC = cl
+LINK = link
+CFLAGS = -D_PPC_=1 -DUNICODE
+!endif
+
+RCFLAGS = -dWIN32
+CFLAGS = $(CFLAGS) -nologo -W3 -DWIN32 -DINC_OLE2 -D_MT $(CL)
+LINKFLAGS = -Incremental:NO -Pdb:NONE -subsystem:windows -entry:WinMainCRTStartup -machine:$(CPU)
+
+LIBS = libc.lib kernel32.lib user32.lib gdi32.lib
+
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Z7 -D_DEBUG $(CL)
+LINKFLAGS = -debug:full -debugtype:cv,coff $(LINKFLAGS)
+!else
+CFLAGS = $(CFLAGS) -Ox
+!endif
+!endif
+
+
+##########################################################################
+#
+# MAC Settings
+#
+!if "$(TARGET)" == "MAC"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -d_MAC
+!if "$(CPU)"=="PPC"
+CFLAGS = -W3 -D_MAC -D_PPCMAC -D_pascal= -D__pascal=
+LINKFLAGS = -machine:mppc -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+LIBS = interfac.lib libc.lib ole2auto.lib ole2.lib
+!else
+CFLAGS = -W3 -AL -D_MAC
+LINKFLAGS = -machine:$(CPU) -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+LIBS = interfac.lib llibcs.lib lsanes.lib swap.lib
+!endif
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) -debug:full -debugtype:cv
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+!endif
+
+MRC = mrc
+!if "$(CPU)"=="PPC"
+MRCOPT = -D_PPCMAC -s$(VBATOOLS)\win32\ppc\lib
+!else
+MRCOPT =
+!endif
+
+MAKEPEF = makepef
+
+!endif
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+SRCDIR = $(OLEPROG)\SAMPLE\spoly
+
+!if "$(TARGET)" == "MAC" && "$(CPU)"=="PPC"
+OBJDIR=$(SRCDIR)\macppc
+!else
+OBJDIR=$(SRCDIR)\$(TARGET)
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+
+!if "$(TARGET)" == "WIN16"
+LIBS = ole2.lib compobj.lib ole2disp.lib ole2nls.lib $(LIBS)
+!else
+!if "$(TARGET)" == "WIN32"
+LIBS = ole32.lib oleaut32.lib uuid.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "MAC"
+!if "$(CPU)" != "PPC"
+LIBS = olenrf.obj oanrf.obj $(LIBS)
+!endif
+!endif
+!endif
+
+OBJS = \
+!if "$(TARGET)" == "MAC"
+ $(OBJDIR)\macmain.obj \
+!else
+ $(OBJDIR)\winmain.obj \
+!endif
+ $(OBJDIR)\cpoly.obj \
+ $(OBJDIR)\cpoint.obj \
+ $(OBJDIR)\cenumpt.obj \
+!if "$(TARGET)" != "MAC"
+ $(OBJDIR)\statbar.obj \
+!endif
+ $(OBJDIR)\clsid.obj \
+ $(OBJDIR)\misc.obj
+
+goal : setflags $(OBJDIR)\spoly.exe
+
+setflags :
+ set CL=$(CFLAGS)
+
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\spoly.exe del $(OBJDIR)\spoly.exe
+ if exist $(OBJDIR)\spoly.map del $(OBJDIR)\spoly.map
+ if exist $(OBJDIR)\spoly.res del $(OBJDIR)\spoly.res
+ if exist $(OBJDIR)\spoly.rs del $(OBJDIR)\spoly.rs
+ if exist $(SRCDIR)\*.pdb del $(SRCDIR)\*.pdb
+
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARGET)" == "WIN16"
+
+$(OBJDIR)\spoly.exe : $(OBJS) $(SRCDIR)\spoly.def $(OBJDIR)\spoly.res $(SRCDIR)\spoly.ico
+ link $(LINKFLAGS) @<<
+$(OBJS: =+^
+),
+$@,$(OBJDIR)\spoly.map/map,
+$(LIBS),
+$(SRCDIR)\spoly.def
+<<
+ rc -k -t $(OBJDIR)\spoly.res $@
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARGET)" == "WIN32"
+
+$(OBJDIR)\spoly.exe : $(OBJS) $(SRCDIR)\spoly.def $(OBJDIR)\spoly.res $(SRCDIR)\spoly.ico
+ cvtres -r -$(CPU) $(OBJDIR)\spoly.res -o $(OBJDIR)\spoly.rs
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(OBJDIR)\spoly.rs
+ $(LIBS)
+<<
+!endif
+
+##########################################################################
+#
+# Application Build (MAC Specific)
+#
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\spoly.exe : $(OBJS) $(OBJDIR)\spoly.x
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(LIBS)
+<<
+ copy $(OBJDIR)\spoly.x $(OBJDIR)\spoly
+!if "$(CPU)" == "PPC"
+ $(MAKEPEF) $(OBJDIR)\spoly.exe $(OBJDIR)\spoly.pef
+!else
+ cvpack $(OBJDIR)\spoly.exe
+ $(MRC) $(MRCOPT) -e $(OBJDIR)\spoly.exe -a -o $(OBJDIR)\spoly
+!endif
+
+$(OBJDIR)\spoly.x: $(SRCDIR)\spoly.r
+ $(MRC) $(MRCOPT) -D_MAC -o $(OBJDIR)\spoly.x $(SRCDIR)\spoly.r
+!endif
+
+##########################################################################
+#
+# Application Build (Common)
+#
+$(OBJDIR)\spoly.res : $(SRCDIR)\spoly.rc $(SRCDIR)\resource.h
+ rc $(RCFLAGS) -r -fo$@ $(SRCDIR)\spoly.rc
+
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\macmain.obj: $(SRCDIR)\macmain.cpp $(SRCDIR)\hostenv.h $(SRCDIR)\resource.h $(SRCDIR)\spoly.h $(SRCDIR)\cpoint.h $(SRCDIR)\cpoly.h $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\macmain.cpp
+!else
+$(OBJDIR)\winmain.obj: $(SRCDIR)\winmain.cpp $(SRCDIR)\hostenv.h $(SRCDIR)\resource.h $(SRCDIR)\spoly.h $(SRCDIR)\cpoint.h $(SRCDIR)\cpoly.h $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\winmain.cpp
+!endif
+
+$(OBJDIR)\cpoint.obj: $(SRCDIR)\cpoint.cpp $(SRCDIR)\cpoint.h $(SRCDIR)\hostenv.h $(SRCDIR)\spoly.h $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\cpoint.cpp
+
+$(OBJDIR)\cpoly.obj: $(SRCDIR)\cpoly.cpp $(SRCDIR)\cpoint.h $(SRCDIR)\cpoly.h $(SRCDIR)\hostenv.h $(SRCDIR)\spoly.h $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\cpoly.cpp
+
+$(OBJDIR)\clsid.obj: $(SRCDIR)\clsid.c $(SRCDIR)\clsid.h
+ $(CC) -c -Fo$@ $(SRCDIR)\clsid.c
+
+$(OBJDIR)\cenumpt.obj: $(SRCDIR)\cenumpt.cpp $(SRCDIR)\cenumpt.h
+ $(CC) -c -Fo$@ $(SRCDIR)\cenumpt.cpp
+
+!if "$(TARGET)" != "MAC"
+$(OBJDIR)\statbar.obj: $(SRCDIR)\statbar.cpp $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\statbar.cpp
+!endif
+
+$(OBJDIR)\misc.obj: $(SRCDIR)\misc.cpp $(SRCDIR)\hostenv.h $(SRCDIR)\spoly.h
+ $(CC) -c -Fo$@ $(SRCDIR)\misc.cpp
diff --git a/private/oleauto/sample/spoly/misc.cpp b/private/oleauto/sample/spoly/misc.cpp
new file mode 100644
index 000000000..569159d91
--- /dev/null
+++ b/private/oleauto/sample/spoly/misc.cpp
@@ -0,0 +1,300 @@
+/***
+*misc.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+
+#include <stdio.h>
+
+#ifdef _MAC
+# include <string.h>
+# include <ctype.h>
+#endif
+
+#ifdef WIN32 // Use native CompareString operation
+ #undef CompareString
+ #ifdef UNICODE
+ #define CompareString CompareStringW
+ #else
+ // CONSIDER: write a wrapper for CompareStringW if not available
+ #endif
+#else
+ #define CompareString CompareStringA
+#endif
+
+unsigned long g_dwPolyCF = 0;
+unsigned long g_dwPointCF = 0;
+
+IClassFactory FAR* g_ppolyCF = NULL;
+IClassFactory FAR* g_ppointCF = NULL;
+
+#ifdef _MAC
+struct regentry{
+ char *szKey;
+ char *szValue;
+} g_rgregentry[] = {
+
+ { "CLSID\\{00020462-0000-0000-C000-000000000046}",
+ "OLE Automation SPoly 1.0 Application" }
+
+ , { "CLSID\\{00020462-0000-0000-C000-000000000046}\\LocalServer",
+ "SPLy" }
+
+ , { "CLSID\\{00020462-0000-0000-C000-000000000046}\\ProgID",
+ "SPoly.Application" }
+
+ , { "CLSID\\{00020462-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "SPLy", "{00020462-0000-0000-C000-000000000046}" }
+
+ , { "SPoly.Application\\CLSID",
+ "{00020462-0000-0000-C000-000000000046}" }
+
+};
+
+HRESULT
+EnsureRegistration()
+{
+ HKEY hkey;
+
+ if(RegOpenKey(HKEY_CLASSES_ROOT, "SPLy", &hkey) == NOERROR){
+ RegCloseKey(hkey);
+ return NOERROR;
+ }
+
+ for(int i = 0; i < DIM(g_rgregentry); ++i){
+ if(RegSetValue(HKEY_CLASSES_ROOT, g_rgregentry[i].szKey, REG_SZ, g_rgregentry[i].szValue, 0) != ERROR_SUCCESS)
+ return ResultFromScode(E_FAIL);
+ }
+
+ return NOERROR;
+}
+#endif
+
+
+/***
+*HRESULT InitOle(void)
+*Purpose:
+* Initialize Ole, and register our class factories.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDAPI
+InitOle()
+{
+ HRESULT hresult;
+
+ if((hresult = OleInitialize(NULL)) != NOERROR)
+ goto LError0;
+
+#ifdef _MAC
+ if((hresult = EnsureRegistration()) != NOERROR)
+ goto LError0;
+#endif
+
+ // Register the CPoint Class Factory
+ //
+ if((g_ppointCF = CPointCF::Create()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ hresult = CoRegisterClassObject(
+ CLSID_CPoint,
+ g_ppointCF,
+ CLSCTX_LOCAL_SERVER,
+ REGCLS_MULTIPLEUSE,
+ &g_dwPointCF);
+ if(hresult != NOERROR)
+ goto LError1;
+
+ // Register the CPoly Class Factory.
+ //
+ if((g_ppolyCF = CPolyCF::Create()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ hresult = CoRegisterClassObject(
+ CLSID_CPoly,
+ g_ppolyCF,
+ CLSCTX_LOCAL_SERVER,
+ REGCLS_MULTIPLEUSE,
+ &g_dwPolyCF);
+ if(hresult != NOERROR)
+ goto LError1;
+
+ g_ppolyCF->Release();
+
+ g_ppointCF->Release();
+
+ return NOERROR;
+
+
+LError1:;
+ if(g_ppolyCF != NULL)
+ g_ppolyCF->Release();
+
+ if(g_ppointCF != NULL)
+ g_ppointCF->Release();
+
+ UninitOle();
+
+LError0:;
+ return hresult;
+}
+
+STDAPI
+UninitOle()
+{
+ // Tell Ole to release our class factories.
+ //
+ if(g_dwPointCF != 0L)
+ CoRevokeClassObject(g_dwPointCF);
+
+ if(g_dwPolyCF != 0L)
+ CoRevokeClassObject(g_dwPolyCF);
+
+ OleUninitialize();
+
+ return NOERROR;
+}
+
+/***
+*HRESULT SPolyGetIDsOfNames(MEMBERDESC*, unsigned int, char**, unsigned int, LCID, long*)
+*Purpose:
+* This is the table driven implementation of IDispatch::GetIDsOfNames
+* deferred to by both the CPoint and CPoly objects.
+*
+*Entry:
+* rgmd = pointer to an array of method descriptors
+* cMethods = number of elements in the array of method descriptors
+* rgszNames = pointer to an array of names
+* cNames = the number of names in the rgszNames array
+* lcid = the callers locale ID
+*
+*Exit:
+* return value = HRESULT
+* rgdispid = array of name IDs corresponding to the rgszNames array
+* this array will contain -1 for each entry that is not known.
+*
+***********************************************************************/
+STDAPI
+SPolyGetIDsOfNames(
+ MEMBERDESC FAR* rgmd,
+ unsigned int cMethods,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ HRESULT hresult;
+ PARAMDESC FAR* ppd;
+ MEMBERDESC FAR* pmd;
+ unsigned int iName, iTry, cParams;
+
+ hresult = NOERROR;
+
+ // first lookup the member name.
+ //
+ for(pmd = rgmd;; ++pmd){
+ if(pmd == &rgmd[cMethods])
+ goto LMemberNotFound;
+
+#if defined(WIN32) && !defined(UNICODE)
+ // CompareStringW is not available on Chicago
+ if(wcsicmp(rgszNames[0], pmd->szName) == 0)
+#else
+ if(CompareString(lcid, NORM_IGNORECASE, rgszNames[0], -1, pmd->szName, -1) == 2)
+#endif
+ {
+ rgdispid[0] = pmd->id;
+ break;
+ }
+ }
+
+ // Lookup the named parameters, if there are any.
+ if(cNames > 1){
+ cParams = pmd->cParams;
+ for(iName = 1; iName < cNames; ++iName){
+ for(iTry = 0;; ++iTry){
+ if(iTry == cParams){
+ hresult = ResultFromScode(DISP_E_UNKNOWNNAME);
+ rgdispid[iName] = -1;
+ break;
+ }
+ ppd = &pmd->rgpd[iTry];
+
+#if defined(WIN32) && !defined(UNICODE)
+ // CompareStringW is not available on Chicago
+ if(wcsicmp(rgszNames[iName], ppd->szName) == 0)
+#else
+ if(CompareString(lcid, NORM_IGNORECASE, rgszNames[iName], -1, ppd->szName, -1) == 2)
+#endif
+ {
+ // The DISPID for a named parameter is defined to be its
+ // zero based positional index. This routine assumes that
+ // that PARAMDESC array was declared in correct textual order.
+ //
+ rgdispid[iName] = iTry;
+ break;
+ }
+ }
+ }
+ }
+
+ return hresult;
+
+LMemberNotFound:;
+ // If the member name is unknown, everything is unknown.
+ for(iName = 0; iName < cNames; ++iName)
+ rgdispid[iName] = -1;
+ return ResultFromScode(DISP_E_UNKNOWNNAME);
+}
+
+
+// disable unicode expansion for assertions
+#undef UNICODE
+
+void
+Assert(int fCond, char FAR* file, int line, char FAR* message)
+{
+ char * fmt;
+ char buf[128];
+
+ if(fCond)
+ return;
+
+ fmt = (message == NULL)
+ ? "Assertion failed: %s(%d)"
+ : "Assertion failed: %s(%d) '%s'";
+ sprintf(buf, fmt, file, line, message);
+
+#ifdef _MAC
+ DebugStr(c2pstr(buf));
+#else
+#ifdef WIN32
+ OutputDebugStringA(buf);
+#else //WIN32
+ OutputDebugString(buf);
+#endif //WIN32
+ DebugBreak();
+#endif
+}
diff --git a/private/oleauto/sample/spoly/mk.bat b/private/oleauto/sample/spoly/mk.bat
new file mode 100644
index 000000000..9a07fc0d3
--- /dev/null
+++ b/private/oleauto/sample/spoly/mk.bat
@@ -0,0 +1,19 @@
+REM setup the environment for the spoly makefile
+
+set OLDLIB=%LIB%
+set OLDPATH=%PATH%
+set OLDINC=%INCLUDE%
+
+set PATH=%TOOLS%\HDOS\BIN;%TOOLS%\HDOS\C800\BIN
+set LIB=%TOOLS%\HDOS\C800\LIB;%OLEPROG%\build\DISPATCH\DWIN16;%OLEPROG%\build\ole2nls\dwin16;%OLEPROG%\OLE\WIN16\D
+set INCLUDE=%TOOLS%\HDOS\C800\INCLUDE;%OLEPROG%\OLE\WIN16;%OLEPROG%\SRC\DISPATCH
+
+nmake %1 %2 %3 %4 %5
+
+set LIB=%OLDLIB%
+set PATH=%OLDPATH%
+set INCLUDE=%OLDINC%
+
+set OLDPATH=
+set OLDINC=
+set OLDLIB=
diff --git a/private/oleauto/sample/spoly/mk.cmd b/private/oleauto/sample/spoly/mk.cmd
new file mode 100644
index 000000000..e1fd4c139
--- /dev/null
+++ b/private/oleauto/sample/spoly/mk.cmd
@@ -0,0 +1,13 @@
+REM The spoly.exe makefile assumes that PATH, LIB, and include are setup.
+
+@setlocal
+
+REM we get rc.exe and winstub.exe from \tools\win
+
+set PATH=%TOOLS%\HOS2\BIN;%TOOLS%\HOS2\C700\BIN
+set INCLUDE=%TOOLS%\HOS2\C700\INCLUDE;%OLEPROG%\ole\dwin16;%OLEPROG%\src\dispatch
+set LIB=%TOOLS%\HOS2\C700\LIB;%OLEPROG%\ole\dwin16;%OLEPROG%\build\dwin16
+
+nmake %1 %2 %3 %4 %5
+
+@endlocal
diff --git a/private/oleauto/sample/spoly/readme.txt b/private/oleauto/sample/spoly/readme.txt
new file mode 100644
index 000000000..8e6d617d3
--- /dev/null
+++ b/private/oleauto/sample/spoly/readme.txt
@@ -0,0 +1,61 @@
+------------------------------------
+OLE Automation Sample Program: SPoly
+------------------------------------
+
+SPoly is a program which draws polygons. The only way to
+make spoly draw a polygon is to use its programmability
+interface.
+
+One OLE Automation object is exposed by Spoly:
+ * spoly.application
+
+Spoly.Application is the object associated with spoly's main
+window. It controls drawing polygons and clearing the display.
+
+
+-----------------
+Program Structure
+-----------------
+SPoly implements IDispatch by hand for spoly.application.
+
+
+
+------------------------------------
+Methods defined on spoly.application
+------------------------------------
+
+
+Name Description
+------------------------------------------------------------------
+Draw() Draw the polygon.
+
+Reset() Delete all points from the polygon.
+
+AddPoint(X, Y) Add a point with coordinates (x,y)
+ to the polygon
+
+EnumPoints() as VT_ENUM Return a collection of the polygon's
+ points
+
+GetXOrigin() as short Get the X origin of the polygon.
+
+SetXOrigin(x as short) Set the X origin of the polygon.
+
+GetYOrigin() as short Get the Y origin of the polygon.
+
+SetYOrigin(y as short) Set the Y origin of the polygon.
+
+GetWidth() as short Get and the line width of the polygon.
+
+SetWidth(width as short) Set the line width of the polygon.
+
+
+
+---------------------------
+Shortcomings of this sample
+---------------------------
+1. Many items in this sample should be properties. Instead,
+they are implemented as methods. Anything which behaves like
+an attribute of the object should be a property.
+
+2. This is not a good example of how to implement a collection. \ No newline at end of file
diff --git a/private/oleauto/sample/spoly/resource.h b/private/oleauto/sample/spoly/resource.h
new file mode 100644
index 000000000..a216f97d9
--- /dev/null
+++ b/private/oleauto/sample/spoly/resource.h
@@ -0,0 +1,51 @@
+/***
+*resource.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _MAC
+
+#define kMinSize 500 /* minimum size (in K) */
+#define kPrefSize 500 /* preferred size (in K) */
+
+#define rMenuBar 128 /* menu bar */
+#define rAboutAlert 128 /* about alert */
+#define rUserAlert 129 /* error alert */
+#define rWindow 128 /* application's window */
+#define rIcon 128
+
+#define mApple 128 /* Apple menu */
+#define iAbout 1
+
+#define mFile 129 /* File menu */
+#define iNew 1
+#define iClose 4
+#define iQuit 12
+
+#define mEdit 130 /* Edit menu */
+#define iUndo 1
+#define iCut 3
+#define iCopy 4
+#define iPaste 5
+#define iClear 6
+
+#define mSpoly 131
+#define iTest 1
+
+#define kMinHeap 21 * 1024
+#define kMinSpace 8 * 1024
+
+#else /* WIN16 || WIN32 */
+
+# define IDM_CLEAR 1
+# define IDM_DUMP 2
+# define IDM_FIRSTCHILD 100
+
+#endif
+
diff --git a/private/oleauto/sample/spoly/spoly.def b/private/oleauto/sample/spoly/spoly.def
new file mode 100644
index 000000000..b5c2f06a3
--- /dev/null
+++ b/private/oleauto/sample/spoly/spoly.def
@@ -0,0 +1,14 @@
+
+NAME SPOLY
+
+DESCRIPTION 'IDispatch Polygon Test Server'
+
+EXETYPE WINDOWS
+
+STUB 'WINSTUB.EXE'
+
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MULTIPLE
+
+HEAPSIZE 4096
+STACKSIZE 8192
diff --git a/private/oleauto/sample/spoly/spoly.h b/private/oleauto/sample/spoly/spoly.h
new file mode 100644
index 000000000..c464d3325
--- /dev/null
+++ b/private/oleauto/sample/spoly/spoly.h
@@ -0,0 +1,68 @@
+/***
+*spoly.h - Application-wide definitions
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "hostenv.h"
+#include "resource.h"
+#include "clsid.h"
+
+#if defined(_MAC)
+# define PASCAL pascal
+# define STRSTR strstr
+#elif defined(WIN32)
+# include "statbar.h"
+# define STRSTR strstr
+#else /* WIN16 */
+# include "statbar.h"
+# define STRSTR _fstrstr
+#endif
+
+#ifdef _MAC
+# define UNUSED(X) ((void)(void*)&(X))
+#else
+# define UNUSED(X) (X)
+#endif
+
+#define DIM(X) (sizeof(X) / sizeof(X[0]))
+
+extern "C" void Assert(int, char FAR*, int, char FAR*);
+#define ASSERT(X) Assert(X, __FILE__, __LINE__, NULL)
+#define ASSERTSZ(X, MSG) Assert(X, __FILE__, __LINE__, MSG)
+
+
+
+// Description of a single named parameter.
+//
+typedef struct tagPARAMDESC {
+ OLECHAR FAR* szName; // parameter name
+} PARAMDESC;
+
+// Description of a single member.
+//
+typedef struct tagMEMBERDESC {
+ OLECHAR FAR* szName; // member name
+ DISPID id; // member id
+ PARAMDESC FAR* rgpd; // ptr to array of PARAMDESCs
+ unsigned int cParams; // number of parameters
+} MEMBERDESC;
+
+STDAPI
+SPolyGetIDsOfNames(
+ MEMBERDESC FAR* pmd,
+ unsigned int cMethods,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgid);
+
+
+STDAPI InitOle();
+STDAPI UninitOle();
+
diff --git a/private/oleauto/sample/spoly/spoly.ico b/private/oleauto/sample/spoly/spoly.ico
new file mode 100644
index 000000000..18311e41e
--- /dev/null
+++ b/private/oleauto/sample/spoly/spoly.ico
Binary files differ
diff --git a/private/oleauto/sample/spoly/spoly.r b/private/oleauto/sample/spoly/spoly.r
new file mode 100644
index 000000000..9be626725
--- /dev/null
+++ b/private/oleauto/sample/spoly/spoly.r
@@ -0,0 +1,298 @@
+/***
+*spoly.r
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Resource script for spoly.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _PPCMAC
+include "cfrg.rsc";
+#endif
+
+#include "types.r"
+#include "resource.h"
+
+
+/* we use an MBAR resource to conveniently load all the menus */
+
+resource 'MBAR' (rMenuBar, preload) {
+ {
+ mApple,
+ mFile,
+ mEdit,
+ mSpoly
+ }
+};
+
+
+resource 'MENU' (mApple, preload) {
+ mApple,
+ textMenuProc,
+ 0b11111111111111111111111111111101,
+ enabled,
+ apple,
+ {
+ "About Spoly\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mFile, preload) {
+ mFile,
+ textMenuProc,
+ 0b00000000000000000000100000000000,
+ enabled,
+ "File",
+ {
+ "New",
+ noicon, "N", nomark, plain;
+ "Open",
+ noicon, "O", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Close",
+ noicon, "W", nomark, plain;
+ "Save",
+ noicon, "S", nomark, plain;
+ "Save As\311",
+ noicon, nokey, nomark, plain;
+ "Revert",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Page Setup\311",
+ noicon, nokey, nomark, plain;
+ "Print\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Quit",
+ noicon, "Q", nomark, plain
+ }
+};
+
+resource 'MENU' (mEdit, preload) {
+ mEdit,
+ textMenuProc,
+ 0b00000000000000000000000000000000,
+ enabled,
+ "Edit",
+ {
+ "Undo",
+ noicon, "Z", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Cut",
+ noicon, "X", nomark, plain;
+ "Copy",
+ noicon, "C", nomark, plain;
+ "Paste",
+ noicon, "V", nomark, plain;
+ "Clear",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mSpoly, preload) {
+ mSpoly,
+ textMenuProc,
+ 0b00000000000000000000000000000001,
+ enabled,
+ "Spoly",
+ {
+ "Test", noicon, nokey, nomark, plain
+ }
+};
+
+/* this ALRT and DITL are used as an About screen */
+
+resource 'ALRT' (rAboutAlert, purgeable) {
+ {40, 20, 160, 290},
+ rAboutAlert,
+ {
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+resource 'DITL' (rAboutAlert, purgeable) {
+ { /* array DITLarray: 5 elements */
+ /* [1] */
+ {88, 180, 108, 260},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {8, 8, 24, 214},
+ StaticText {
+ disabled,
+ "IDispatch Polygon Server"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an error screen */
+
+resource 'ALRT' (rUserAlert, purgeable) {
+ {40, 20, 120, 260},
+ rUserAlert,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+
+resource 'DITL' (rUserAlert, purgeable) {
+ {
+ /* [1] */
+ {50, 150, 70, 230},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 30, 230},
+ StaticText {
+ disabled,
+ "Error. ^0"
+ },
+ /* [3] */
+ {8, 8, 40, 40},
+ Icon {
+ disabled,
+ 2
+ }
+ }
+};
+
+
+resource 'WIND' (rWindow, preload, purgeable) {
+ {60, 40, 380, 500},
+ documentProc, visible, goAway, 0x0, "Spoly"
+};
+
+
+resource 'SIZE' (-1) {
+ dontSaveScreen,
+ acceptSuspendResumeEvents,
+ enableOptionSwitch,
+ canBackground,
+ multiFinderAware,
+ backgroundAndForeground,
+ dontGetFrontClicks,
+ ignoreChildDiedEvents,
+ is32BitCompatible,
+ isHighLevelEventAware,
+ localAndRemoteHLEvents,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ kPrefSize * 1024,
+ kMinSize * 1024
+};
+
+resource 'BNDL' (133) {
+ 'SPLy',
+ 0,
+ { /* array TypeArray: 2 elements */
+ /* [1] */
+ 'FREF',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 133
+ },
+ /* [2] */
+ 'ICN#',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 133
+ }
+ }
+};
+
+data 'FREF' (133) {
+ $"4150 504C 0000 FF" /* APPL..ÿ */
+};
+
+data 'ICN#' (133) {
+ $"0000 0000 0007 FF00 000F FF00 0018 0300" /* ......ÿ...ÿ..... */
+ $"0030 0300 0030 0300 0030 0300 0030 3FF8" /* .0...0...0...0?ø */
+ $"003F FFF8 003F FF18 0001 8018 0001 8018" /* .?ÿø.?ÿ...€...€. */
+ $"0001 83FF 0001 87FF 0001 FFF9 0001 FFF9" /* ..ƒÿ..‡ÿ..ÿù..ÿù */
+ $"0000 1801 0000 1801 0002 1801 000C 1FFF" /* ...............ÿ */
+ $"003C 1FFF 00F8 0000 0078 0000 0030 0000" /* .<.ÿ.ø...x...0.. */
+ $"0090 0000 0300 0000 0F00 0000 3E00 0000" /* ...........>... */
+ $"1E00 0000 0C00 0000 0400 0000 0000 0000" /* ................ */
+ $"0000 0000 0007 FF00 000F FF00 001F FF00" /* ......ÿ...ÿ...ÿ. */
+ $"003F FF00 003F FF00 003F FF00 003F FFF8" /* .?ÿ..?ÿ..?ÿ..?ÿø */
+ $"003F FFF8 003F FFF8 0001 FFF8 0001 FFF8" /* .?ÿø.?ÿø..ÿø..ÿø */
+ $"0001 FFFF 0001 FFFF 0001 FFFF 0001 FFFF" /* ..ÿÿ..ÿÿ..ÿÿ..ÿÿ */
+ $"0000 1FFF 0000 1FFF 0002 1FFF 000C 1FFF" /* ...ÿ...ÿ...ÿ...ÿ */
+ $"003C 1FFF 00F8 0000 0078 0000 0030 0000" /* .<.ÿ.ø...x...0.. */
+ $"0090 0000 0300 0000 0F00 0000 3E00 0000" /* ...........>... */
+ $"1E00 0000 0C00 0000 0400 0000 0000 0000" /* ................ */
+};
+
+data 'icl4' (133) {
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0666 6666 6666 0000 0000" /* .......fffff.... */
+ $"0000 0000 0000 6666 6666 6666 0000 0000" /* ......ffffff.... */
+ $"0000 0000 0006 6000 0000 0066 0000 0000" /* ......`....f.... */
+ $"0000 0000 0066 0000 0000 0066 0000 0000" /* .....f.....f.... */
+ $"0000 0000 0066 0000 0000 0066 0000 0000" /* .....f.....f.... */
+ $"0000 0000 0066 0000 0000 0066 0000 0000" /* .....f.....f.... */
+ $"0000 0000 0066 0000 0033 3333 3333 3000" /* .....f...333330. */
+ $"0000 0000 0066 6666 6333 3333 3333 3000" /* .....fffc333330. */
+ $"0000 0000 0066 6666 3366 6666 0003 3000" /* .....fff3fff..0. */
+ $"0000 0000 0000 0003 3000 0000 0003 3000" /* ........0.....0. */
+ $"0000 0000 0000 0003 3000 0000 0003 3000" /* ........0.....0. */
+ $"0000 0000 0000 0003 3000 0066 6666 6666" /* ........0..fffff */
+ $"0000 0000 0000 0003 3000 0666 6666 6666" /* ........0..fffff */
+ $"0000 0000 0000 0003 3333 6633 3333 3006" /* ........33f3330. */
+ $"0000 0000 0000 0003 3336 6333 3333 3006" /* ........36c3330. */
+ $"0000 0000 0000 0000 0006 6000 0000 0006" /* ..........`..... */
+ $"0000 0000 0000 0000 0006 6000 0000 0006" /* ..........`..... */
+ $"0000 0000 0000 0030 0006 6000 0000 0006" /* .......0..`..... */
+ $"0000 0000 0000 3300 0006 6666 6666 6666" /* ......3...ffffff */
+ $"0000 0000 0033 F300 0006 6666 6666 6666" /* .....3ó...ffffff */
+ $"0000 0000 333F 3000 0000 0000 0000 0000" /* ....3?0......... */
+ $"0000 0000 03F3 3000 0000 0000 0000 0000" /* .....ó0......... */
+ $"0000 0000 0033 0000 0000 0000 0000 0000" /* .....3.......... */
+ $"0000 0000 3003 0000 0000 0000 0000 0000" /* ....0........... */
+ $"0000 0033 0000 0000 0000 0000 0000 0000" /* ...3............ */
+ $"0000 33F3 0000 0000 0000 0000 0000 0000" /* ..3ó............ */
+ $"0033 3F30 0000 0000 0000 0000 0000 0000" /* .3?0............ */
+ $"0003 F330 0000 0000 0000 0000 0000 0000" /* ..ó0............ */
+ $"0000 3300 0000 0000 0000 0000 0000 0000" /* ..3............. */
+ $"0000 0300 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+};
+
+data 'SPLy' (0, "Owner resource") {
+ $"00" /* . */
+};
diff --git a/private/oleauto/sample/spoly/spoly.r32 b/private/oleauto/sample/spoly/spoly.r32
new file mode 100644
index 000000000..4868d16ee
--- /dev/null
+++ b/private/oleauto/sample/spoly/spoly.r32
@@ -0,0 +1,27 @@
+REGEDIT
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info SPoly.Application (defaults to SPoly.Application.1)
+
+HKEY_CLASSES_ROOT\SPoly.Application = OLE Automation SPoly Application
+HKEY_CLASSES_ROOT\SPoly.Application\Clsid = {00020462-0000-0000-C000-000000000046}
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; registration info SPoly 1.0
+
+; (Application Object)
+HKEY_CLASSES_ROOT\SPoly.Application.1 = OLE Automation SPoly 1.0 Application
+HKEY_CLASSES_ROOT\SPoly.Application.1\Clsid = {00020462-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\CLSID\{00020462-0000-0000-C000-000000000046} = OLE Automation SPoly 1.0 Application
+HKEY_CLASSES_ROOT\CLSID\{00020462-0000-0000-C000-000000000046}\ProgID = SPoly.Application.1
+HKEY_CLASSES_ROOT\CLSID\{00020462-0000-0000-C000-000000000046}\VersionIndependentProgID = SPoly.Application
+HKEY_CLASSES_ROOT\CLSID\{00020462-0000-0000-C000-000000000046}\LocalServer32 = spoly.exe /Automation
+
+HKEY_CLASSES_ROOT\CLSID\{00020463-0000-0000-C000-000000000046} = SPoly.SPoint
+HKEY_CLASSES_ROOT\CLSID\{00020463-0000-0000-C000-000000000046}\ProgID = SPoly.Application.1
+HKEY_CLASSES_ROOT\CLSID\{00020463-0000-0000-C000-000000000046}\VersionIndependentProgID = SPoly.Application
+HKEY_CLASSES_ROOT\CLSID\{00020463-0000-0000-C000-000000000046}\LocalServer32 = spoly.exe /Automation
diff --git a/private/oleauto/sample/spoly/spoly.rc b/private/oleauto/sample/spoly/spoly.rc
new file mode 100644
index 000000000..82adf8fc7
--- /dev/null
+++ b/private/oleauto/sample/spoly/spoly.rc
@@ -0,0 +1,15 @@
+#define NOKERNEL
+#define NOGDI
+#define NOSOUND
+#define NOCOMM
+#define NODRIVERS
+#include "windows.h"
+#include "spoly.h"
+
+SPOLY ICON spoly.ico
+
+SPolyMenu MENU
+BEGIN
+ MENUITEM "&Clear" IDM_CLEAR
+ MENUITEM "&Dump" IDM_DUMP
+END
diff --git a/private/oleauto/sample/spoly/spoly.reg b/private/oleauto/sample/spoly/spoly.reg
new file mode 100644
index 000000000..85af31254
--- /dev/null
+++ b/private/oleauto/sample/spoly/spoly.reg
@@ -0,0 +1,22 @@
+REGEDIT
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info SPoly.Application (defaults to SPoly.Application.1)
+
+HKEY_CLASSES_ROOT\SPoly.Application = OLE Automation SPoly Application
+HKEY_CLASSES_ROOT\SPoly.Application\Clsid = {00020462-0000-0000-C000-000000000046}
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; registration info SPoly 1.0
+
+; (Application Object)
+HKEY_CLASSES_ROOT\SPoly.Application.1 = OLE Automation SPoly 1.0 Application
+HKEY_CLASSES_ROOT\SPoly.Application.1\Clsid = {00020462-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\CLSID\{00020462-0000-0000-C000-000000000046} = OLE Automation SPoly 1.0 Application
+HKEY_CLASSES_ROOT\CLSID\{00020462-0000-0000-C000-000000000046}\ProgID = SPoly.Application.1
+HKEY_CLASSES_ROOT\CLSID\{00020462-0000-0000-C000-000000000046}\VersionIndependentProgID = SPoly.Application
+HKEY_CLASSES_ROOT\CLSID\{00020462-0000-0000-C000-000000000046}\LocalServer = spoly.exe /Automation
diff --git a/private/oleauto/sample/spoly/statbar.cpp b/private/oleauto/sample/spoly/statbar.cpp
new file mode 100644
index 000000000..01feae48c
--- /dev/null
+++ b/private/oleauto/sample/spoly/statbar.cpp
@@ -0,0 +1,368 @@
+/***
+*statbar.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdarg.h>
+
+#include "hostenv.h"
+#include "statbar.h"
+
+
+extern "C" long FAR PASCAL StatBarWndProc(HWND, unsigned int, WPARAM, LPARAM);
+
+
+TCHAR FAR* CStatBar::m_szWndClass = TSTR("StatBarWndClass");
+
+
+CStatBar::CStatBar()
+{
+ m_refs = 0;
+
+ m_x = 0;
+ m_y = 0;
+ m_width = 0;
+ m_height = 0;
+
+ m_bstrMsg = NULL;
+
+ m_hfont = (HFONT)0;
+}
+
+CStatBar::~CStatBar()
+{
+ SysFreeString(m_bstrMsg);
+}
+
+
+/***
+*PUBLIC CStatBar FAR* CStatBar::Create(HINSTANCE, HWND)
+*
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+CStatBar FAR*
+CStatBar::Create(HINSTANCE hinst, HWND hwndFrame)
+{
+ CStatBar FAR* psb;
+
+ psb = new FAR CStatBar();
+ if(psb == NULL)
+ return NULL;
+ psb->AddRef();
+
+ if(!psb->Register(hinst))
+ goto LFail;
+
+ psb->m_hwnd = CreateWindow(
+ CStatBar::m_szWndClass,
+ NULL,
+ WS_CHILD | WS_CLIPSIBLINGS,
+ 0, 0, 0, 0,
+ hwndFrame,
+ 0,
+ hinst,
+ NULL);
+
+ if(!psb->m_hwnd)
+ goto LFail;
+
+ // Stash the newly created CStatBar* in the extra bytes of the
+ // associated window so we can get at the instance in the message
+ // proc.
+ //
+ // Note: we do not AddRef for this reference. We make sure that the
+ // window is destroyed when the refcnt goes to 0.
+ //
+ SetWindowLong(psb->m_hwnd, 0, (long)psb);
+
+ return psb;
+
+LFail:;
+ delete psb;
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CStatBar::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid,IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ *ppv = (void FAR*)NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStatBar::AddRef(void)
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStatBar::Release(void)
+{
+ if(--m_refs == 0){
+
+ // destroy the status bar window.
+ //
+ SendMessage(m_hwnd, WM_DESTROY, 0, 0L);
+
+ delete this;
+ return 0;
+ }
+
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// Introduced Methods
+//---------------------------------------------------------------------
+
+
+/***
+*PRIVATE BOOL CStatBar::Register(HINSTANCE)
+*
+*Purpose:
+* Register the status bar window class.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = BOOL, TRUE if successful, FALSE if not.
+*
+***********************************************************************/
+BOOL
+CStatBar::Register(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ // register the class, unless already registered.
+ if(GetClassInfo(hinst, m_szWndClass, &wc) == 0){
+ wc.style = 0;
+ wc.lpfnWndProc = StatBarWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = sizeof(CStatBar FAR*);
+ wc.hInstance = hinst;
+ wc.hIcon = 0;
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
+ wc.lpszMenuName = 0;
+ wc.lpszClassName = CStatBar::m_szWndClass;
+ if(!RegisterClass(&wc))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/***
+*PUBLIC void CStatBar::Show(void)
+*
+*Purpose:
+* Show the status bar window associated with this CStatBar instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CStatBar::Show()
+{
+ ShowWindow(m_hwnd, SW_SHOW);
+}
+
+void
+CStatBar::SetFont(HFONT hfont)
+{
+ HDC hdc;
+ TEXTMETRIC tm;
+ HFONT hfontOld;
+
+ // compute the character sizes given this new font.
+ //
+ hdc = GetDC(m_hwnd);
+ hfontOld = (HFONT)SelectObject(hdc, hfont);
+ GetTextMetrics(hdc, &tm);
+ m_dxFont = tm.tmAveCharWidth;
+ m_dyFont = tm.tmHeight + tm.tmExternalLeading;
+ SelectObject(hdc, hfontOld);
+ ReleaseDC(m_hwnd, hdc);
+
+ m_hfont = hfont;
+}
+
+/***
+*PRIVATE CStatBar::WMPaint(void)
+*
+*Purpose:
+* This method is responsible for drawing the status bar, and is called
+* in response to a WM_PAINT message.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CStatBar::WMPaint()
+{
+ HDC hdc;
+ RECT rcMsg;
+ HRGN hrgn;
+ HFONT hfontOld;
+ PAINTSTRUCT ps;
+ HPEN hpenBlack, hpenWhite, hpenGray, hpenOld;
+
+ hdc = BeginPaint(m_hwnd, &ps);
+
+ // compute the message box rect
+ //
+ rcMsg.top = 3;
+ rcMsg.bottom= m_height - 3;
+ rcMsg.left = m_dxFont;
+ rcMsg.right = m_width - m_dxFont;
+
+ // prepare the pens
+ //
+ hpenWhite = (HPEN)GetStockObject(WHITE_PEN);
+ hpenBlack = (HPEN)GetStockObject(BLACK_PEN);
+ hpenGray = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
+
+ // draw a top gray line
+ //
+ hpenOld = (HPEN)SelectObject(hdc, hpenGray);
+#if defined(WIN16)
+ MoveTo(hdc, ps.rcPaint.left, 0);
+#elif defined(WIN32)
+ MoveToEx(hdc, ps.rcPaint.left, 0, NULL);
+#endif
+ LineTo(hdc, ps.rcPaint.right, 0);
+
+ // draw a white line just under
+ //
+ SelectObject(hdc, hpenWhite);
+#if defined(WIN16)
+ MoveTo(hdc, ps.rcPaint.left, 1);
+#elif defined(WIN32)
+ MoveToEx(hdc, ps.rcPaint.left, 1, NULL);
+#endif
+ LineTo(hdc, ps.rcPaint.right, 1);
+
+ // do not overwrite the background color
+ //
+ SetBkMode(hdc, TRANSPARENT);
+
+ // message area
+ //
+ SelectObject(hdc, hpenBlack);
+#if defined(WIN16)
+ MoveTo(hdc, rcMsg.left, rcMsg.bottom);
+#elif defined(WIN32)
+ MoveToEx(hdc, rcMsg.left, rcMsg.bottom, NULL);
+#endif
+ LineTo(hdc, rcMsg.left, rcMsg.top);
+ LineTo(hdc, rcMsg.right, rcMsg.top);
+
+ SelectObject(hdc, hpenWhite);
+ LineTo(hdc, rcMsg.right, rcMsg.bottom);
+ LineTo(hdc, rcMsg.left, rcMsg.bottom);
+
+ // select the black pen for writing
+ //
+ SelectObject(hdc, hpenBlack);
+
+ // select the status bar font to write in
+ //
+ hfontOld = (HFONT)SelectObject(hdc, m_hfont);
+
+ // set the clipping region
+ //
+ hrgn = CreateRectRgn(
+ rcMsg.left, rcMsg.top, rcMsg.right, rcMsg.bottom);
+
+ SelectClipRgn(hdc, hrgn);
+
+ // draw the status message
+ //
+ TextOut(
+ hdc,
+ rcMsg.left + (m_dxFont / 2),
+ rcMsg.top + ((rcMsg.bottom - rcMsg.top - m_dyFont) / 2),
+ STRING(m_bstrMsg), (SysStringLen(m_bstrMsg)));
+
+ // cleanup
+ //
+ SelectObject(hdc, hpenOld);
+ SelectObject(hdc, hfontOld);
+
+ DeleteObject(hrgn);
+ DeleteObject(hpenGray);
+
+ EndPaint(m_hwnd, &ps);
+}
+
+extern "C" long FAR PASCAL
+StatBarWndProc(
+ HWND hwnd,
+ unsigned int message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ CStatBar FAR* psb;
+
+ switch(message){
+ case WM_SIZE:
+ return 0;
+ case WM_PAINT:
+ psb = (CStatBar FAR*)GetWindowLong(hwnd, 0);
+ psb->WMPaint();
+ return 0;
+ }
+ return(DefWindowProc(hwnd, message, wParam, lParam));
+}
+
+
+//---------------------------------------------------------------------
+// Status Bar Utilities
+//---------------------------------------------------------------------
+
+extern "C" void
+SBprintf(CStatBar FAR* psb, TCHAR FAR* szFmt, ...)
+{
+ va_list args;
+static TCHAR buf[256];
+
+ va_start(args, szFmt);
+ wvsprintf(buf, szFmt, args);
+ psb->SetText(WIDESTRING(buf));
+ psb->Update();
+}
diff --git a/private/oleauto/sample/spoly/statbar.h b/private/oleauto/sample/spoly/statbar.h
new file mode 100644
index 000000000..52523081e
--- /dev/null
+++ b/private/oleauto/sample/spoly/statbar.h
@@ -0,0 +1,142 @@
+/***
+*statbar.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Implementation Notes:
+* This file requires windows.h and ole2.h
+*
+*****************************************************************************/
+
+class CStatBar : public IUnknown {
+public:
+ static CStatBar FAR* Create(HINSTANCE hinst, HWND hwndFrame);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // Introduced methods
+ //
+ void Show(void);
+ inline void Move(void);
+ inline void Update(void);
+
+ inline int GetX(void);
+ inline void SetX(int x);
+
+ inline int GetY(void);
+ inline void SetY(int y);
+
+ inline int GetHeight(void);
+ inline void SetHeight(int height);
+
+ inline int GetWidth(void);
+ inline void SetWidth(int width);
+
+ //inline HFONT GetFont(void);
+ void SetFont(HFONT hfont);
+
+ //char FAR* GetText(void);
+ inline void SetText(OLECHAR FAR* sz);
+
+ void WMPaint(void);
+ BOOL Register(HINSTANCE);
+
+private:
+ CStatBar();
+ ~CStatBar();
+
+ unsigned long m_refs;
+
+ HWND m_hwnd; // the status bar window handle
+
+ int m_x; // x coordinate of upper left corner
+ int m_y; // y coordinate of upper left corner
+ int m_height;
+ int m_width;
+
+ HFONT m_hfont;
+ int m_dyFont; // font height
+ int m_dxFont; // font width
+
+ BSTR m_bstrMsg; // the status bar text
+
+ static TCHAR FAR* m_szWndClass;
+};
+
+inline void
+CStatBar::Move()
+{
+ MoveWindow(m_hwnd, m_x, m_y, m_width, m_height, TRUE);
+}
+
+inline void
+CStatBar::Update()
+{
+ InvalidateRect(m_hwnd, NULL, TRUE);
+ UpdateWindow(m_hwnd);
+}
+
+inline int
+CStatBar::GetX()
+{
+ return m_x;
+}
+
+inline void
+CStatBar::SetX(int x)
+{
+ m_x = x;
+}
+
+inline int
+CStatBar::GetY(void)
+{
+ return m_y;
+}
+
+inline void
+CStatBar::SetY(int y)
+{
+ m_y = y;
+}
+
+inline int
+CStatBar::GetHeight(void)
+{
+ return m_height;
+}
+
+inline void
+CStatBar::SetHeight(int height)
+{
+ m_height = height;
+}
+
+inline int
+CStatBar::GetWidth(void)
+{
+ return m_width;
+}
+
+inline void
+CStatBar::SetWidth(int width)
+{
+ m_width = width;
+}
+
+inline void
+CStatBar::SetText(OLECHAR FAR* sz)
+{
+ SysFreeString(m_bstrMsg);
+ m_bstrMsg = SysAllocString(sz);
+}
+
+extern "C" void
+SBprintf(CStatBar FAR* psb, TCHAR FAR* szFmt, ...);
diff --git a/private/oleauto/sample/spoly/winmain.cpp b/private/oleauto/sample/spoly/winmain.cpp
new file mode 100644
index 000000000..11395b3ba
--- /dev/null
+++ b/private/oleauto/sample/spoly/winmain.cpp
@@ -0,0 +1,293 @@
+/***
+*winmain.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module is the main entry point for the sample IDispatch polygon
+* server, spoly.exe.
+*
+* This program is intended to demonstrate an implementation of the IDispatch
+* interface. Spoly is a very simple app, that implements two simple objects,
+* CPoly and CPoint and exposes their properties and methods for programatic
+* and cross-process access via IDispatch.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+
+
+HINSTANCE g_hinst = 0;
+
+HWND g_hwndFrame = 0;
+HWND g_hwndClient = 0;
+
+TCHAR g_szFrameWndClass[] = TSTR("FrameWClass");
+
+CStatBar FAR* g_psb = NULL;
+
+
+BOOL InitApplication(HINSTANCE);
+BOOL InitInstance(HINSTANCE, int);
+
+extern "C" int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+extern "C" long FAR PASCAL FrameWndProc(HWND, UINT, WPARAM, LPARAM);
+
+
+extern "C" int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+ int retval;
+ HRESULT hresult;
+
+ if(!hPrevInstance)
+ if(!InitApplication(hinst))
+ return FALSE;
+
+ if((hresult = InitOle()) != NOERROR)
+ return FALSE;
+
+ if(!InitInstance(hinst, nCmdShow)){
+ retval = FALSE;
+ goto LExit;
+ }
+
+ while(GetMessage(&msg, NULL, NULL, NULL)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ g_psb->Release();
+ CPoly::PolyTerm();
+
+ retval = msg.wParam;
+
+LExit:;
+ UninitOle();
+
+ return retval;
+}
+
+
+BOOL
+InitApplication(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = FrameWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(hinst, TSTR("SPOLY"));
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1);
+ wc.lpszMenuName = TSTR("SPolyMenu");
+ wc.lpszClassName = g_szFrameWndClass;
+
+ if(!RegisterClass(&wc))
+ return FALSE;
+
+ return TRUE;
+}
+
+#ifdef WIN32
+#define szAppTitle TSTR("IDispatch Polygon Server (32-bit)")
+#else //WIN32
+#define szAppTitle TSTR("IDispatch Polygon Server")
+#endif //WIN32
+
+BOOL
+InitInstance(HINSTANCE hinst, int nCmdShow)
+{
+ g_hinst = hinst;
+
+ // Create a main frame window
+ //
+ g_hwndFrame = CreateWindow(
+ g_szFrameWndClass,
+ szAppTitle,
+ WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ NULL,
+ NULL,
+ hinst,
+ NULL);
+ if(!g_hwndFrame)
+ return FALSE;
+
+ g_hwndClient = GetWindow(g_hwndFrame, GW_CHILD);
+ if(!g_hwndClient)
+ return FALSE;
+
+ // create the status bar
+ //
+ g_psb = CStatBar::Create(g_hinst, g_hwndFrame);
+ if(!g_psb)
+ return FALSE;
+
+ // initialize and show the status bar
+ //
+ g_psb->SetHeight(GetSystemMetrics(SM_CYCAPTION) - 1);
+ g_psb->SetFont((HFONT)GetStockObject(SYSTEM_FONT));
+ g_psb->SetText(OLESTR(""));
+ g_psb->Show();
+
+ ShowWindow(g_hwndFrame, nCmdShow);
+
+ UpdateWindow(g_hwndFrame);
+
+ return TRUE;
+}
+
+
+void
+FrameWndOnCreate(HWND hwnd)
+{
+ CLIENTCREATESTRUCT ccs;
+
+ ccs.hWindowMenu = NULL;
+ ccs.idFirstChild = IDM_FIRSTCHILD;
+
+ g_hwndClient = CreateWindow(
+ TSTR("MDICLIENT"),
+ 0,
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+ 0, 0, 0, 0,
+ hwnd,
+ (HMENU) 1,
+ g_hinst,
+ &ccs);
+}
+
+
+void
+FrameWndOnSize(HWND hwnd)
+{
+ RECT rc;
+ int height;
+
+ // Get the client rectangle for the frame window
+ GetClientRect(hwnd, &rc);
+
+ height = g_psb->GetHeight();
+
+ // adjust the client win to make room for the status bar.
+ //
+ MoveWindow(
+ g_hwndClient,
+ rc.left,
+ rc.top,
+ rc.right - rc.left,
+ rc.bottom - rc.top - height,
+ TRUE);
+
+ // move the status bar to the bottom of the newly positioned window.
+ //
+ g_psb->SetX(rc.left);
+ g_psb->SetY(rc.bottom - height),
+ g_psb->SetWidth(rc.right - rc.left);
+ g_psb->Move();
+}
+
+
+extern "C" long FAR PASCAL
+FrameWndProc(
+ HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch(message){
+ case WM_COMMAND:
+ switch(wParam){
+ case IDM_DUMP:
+ CPoly::PolyDump();
+ return 0;
+
+ case IDM_CLEAR:
+ InvalidateRect(g_hwndClient, NULL, TRUE);
+ return 0;
+ }
+ break;
+
+ case WM_CREATE:
+ FrameWndOnCreate(hwnd);
+ break;
+
+ case WM_SIZE:
+ FrameWndOnSize(hwnd);
+ return 1;
+
+ case WM_PAINT:
+ CPoly::PolyDraw();
+ break;
+
+ case WM_CLOSE:
+ DestroyWindow(hwnd);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefFrameProc(hwnd, g_hwndClient, message, wParam, lParam);
+}
+
+
+#if defined(WIN32)
+
+extern "C" OLECHAR FAR*
+ConvertStrAtoW(char FAR* strIn, OLECHAR FAR* buf, UINT size)
+{
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ strIn, -1, buf, size) ;
+ return buf;
+}
+
+extern "C" OLECHAR FAR*
+WideString(char FAR* strIn)
+{
+ static OLECHAR buf[256];
+
+ return (ConvertStrAtoW(strIn, buf, 256));
+}
+
+extern "C" char FAR*
+ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size)
+{
+ int badConversion = FALSE;
+
+ WideCharToMultiByte(CP_ACP, NULL,
+ strIn, -1,
+ buf, size,
+ NULL, &badConversion);
+ return buf;
+}
+
+extern "C" char FAR*
+AnsiString(OLECHAR FAR* strIn)
+{
+ static char buf[256];
+
+ return (ConvertStrWtoA(strIn, buf, 256));
+}
+
+#endif
+
diff --git a/private/oleauto/sample/spoly2/cenumpt.cpp b/private/oleauto/sample/spoly2/cenumpt.cpp
new file mode 100644
index 000000000..178afd967
--- /dev/null
+++ b/private/oleauto/sample/spoly2/cenumpt.cpp
@@ -0,0 +1,281 @@
+/***
+*cenumpt.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module implements the CEnumPoint class.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "hostenv.h"
+#include "cenumpt.h"
+
+
+CEnumPoint::CEnumPoint()
+{
+ m_refs = 0;
+
+ m_psa = NULL;
+ m_celts = 0;
+ m_iCurrent = 0;
+}
+
+
+/***
+*HRESULT CEnumPoint::Create(SAFEARRAY*, CEnumPoint**)
+*Purpose:
+* This routine creates a CPoint enumerator from the given
+* (1 X N) SafeArray of CPoint IDispatch pointers.
+*
+*Entry:
+* psa = pointer to a SafeArray of VARIANTs
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppenum = pointer to a CPoint enumerator
+*
+***********************************************************************/
+HRESULT
+CEnumPoint::Create(SAFEARRAY FAR* psa, CEnumPoint FAR* FAR* ppenum)
+{
+ long lBound;
+ HRESULT hresult;
+ CEnumPoint FAR* penum;
+
+
+ // Verify that the SafeArray is the proper shape.
+ //
+ if(SafeArrayGetDim(psa) != 1)
+ return ResultFromScode(E_INVALIDARG);
+
+ hresult = SafeArrayGetLBound(psa, 1, &lBound);
+ if(FAILED(hresult))
+ return hresult;
+
+ if(lBound != 0)
+ return ResultFromScode(E_INVALIDARG);
+
+ penum = new FAR CEnumPoint();
+ if(penum == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+ penum->AddRef();
+
+ hresult = SafeArrayGetUBound(psa, 1, &lBound);
+ if(FAILED(hresult))
+ goto LError0;
+
+ penum->m_psa = psa;
+ penum->m_celts = lBound + 1;
+
+ *ppenum = penum;
+
+ return NOERROR;
+
+LError0:;
+ penum->Release();
+
+ return hresult;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CEnumPoint::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IEnumVARIANT) || IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CEnumPoint::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CEnumPoint::Release()
+{
+ if(--m_refs == 0){
+ if(m_psa != NULL)
+ SafeArrayDestroy(m_psa);
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IEnumVARIANT methods
+//---------------------------------------------------------------------
+
+
+/***
+*HRESULT CEnumPoint::Next(unsigned long, VARIANT*, unsigned long*)
+*Purpose:
+* Attempt to get the next 'celt' items in the enumeration sequence.
+*
+*Entry:
+* celt = the number of elements to get
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* S_FALSE - the end of the sequence was reached
+*
+* rgvar = array of the next 'celt' items
+* *pceltFetched = count of the elements actually fetched.
+*
+***********************************************************************/
+STDMETHODIMP
+CEnumPoint::Next(
+ unsigned long celt,
+ VARIANT FAR* rgvar,
+ unsigned long FAR* pceltFetched)
+{
+ long ix;
+ unsigned int i;
+ HRESULT hresult;
+
+
+ for(i = 0; i < celt; ++i)
+ VariantInit(&rgvar[i]);
+
+ for(i = 0; i < celt; ++i){
+ if(m_iCurrent == m_celts){
+ hresult = ResultFromScode(S_FALSE);
+ goto LDone;
+ }
+
+ ix = m_iCurrent++;
+ hresult = SafeArrayGetElement(m_psa, &ix, &rgvar[i]);
+ if(FAILED(hresult))
+ goto LError0;
+ }
+
+ hresult = NOERROR;
+
+LDone:;
+ if (pceltFetched != NULL)
+ *pceltFetched = i;
+
+ return hresult;
+
+LError0:;
+
+ for(i = 0; i < celt; ++i)
+ VariantClear(&rgvar[i]);
+
+ return hresult;
+}
+
+
+/***
+*HRESULT CEnumPoint::Skip(unsigned long)
+*Purpose:
+* Attempt to skip over the next 'celt' elements in the enumeration
+* sequence.
+*
+*Entry:
+* celt = the count of elements to skip
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* S_FALSE - the end of the sequence was reached
+*
+***********************************************************************/
+STDMETHODIMP
+CEnumPoint::Skip(unsigned long celt)
+{
+ m_iCurrent += celt;
+
+ if(m_iCurrent > m_celts)
+ m_iCurrent = m_celts;
+
+ return (m_iCurrent == m_celts)
+ ? ResultFromScode(S_FALSE) : NOERROR;
+}
+
+
+/***
+*HRESULT CEnumPoint::Reset(void)
+*Purpose:
+* Reset the enumeration sequence back to the beginning.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = SHRESULT CODE
+* S_OK
+*
+***********************************************************************/
+STDMETHODIMP
+CEnumPoint::Reset()
+{
+ m_iCurrent = 0;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CEnumPoint::Clone(IEnumVARIANT**)
+*Purpose:
+* Retrun a CPoint enumerator with exactly the same state as the
+* current one.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_OUTOFMEMORY
+*
+***********************************************************************/
+STDMETHODIMP
+CEnumPoint::Clone(IEnumVARIANT FAR* FAR* ppenum)
+{
+ HRESULT hresult;
+ SAFEARRAY FAR* psa;
+ CEnumPoint FAR* penum;
+
+ hresult = SafeArrayCopy(m_psa, &psa);
+ if(FAILED(hresult))
+ return hresult;
+
+ hresult = CEnumPoint::Create(psa, &penum);
+ if(FAILED(hresult))
+ goto LError0;
+
+ // Assert(penum->m_celts == m_celts);
+
+ penum->m_iCurrent = m_iCurrent;
+
+ *ppenum = penum;
+
+ return NOERROR;
+
+LError0:
+ SafeArrayDestroy(psa);
+
+ return hresult;
+}
diff --git a/private/oleauto/sample/spoly2/cenumpt.h b/private/oleauto/sample/spoly2/cenumpt.h
new file mode 100644
index 000000000..c0d670f93
--- /dev/null
+++ b/private/oleauto/sample/spoly2/cenumpt.h
@@ -0,0 +1,39 @@
+/***
+*cenumpt.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CEnumPoint class.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+class CEnumPoint : public IEnumVARIANT
+{
+public:
+ static HRESULT Create(SAFEARRAY FAR* psa, CEnumPoint FAR* FAR* ppenum);
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IEnumVARIANT methods */
+ STDMETHOD(Next)(unsigned long celt, VARIANT FAR* rgvar, unsigned long FAR* pceltFetched);
+ STDMETHOD(Skip)(unsigned long celt);
+ STDMETHOD(Reset)(void);
+ STDMETHOD(Clone)(IEnumVARIANT FAR* FAR* ppenum);
+
+ CEnumPoint();
+
+private:
+
+ unsigned long m_refs;
+
+ unsigned long m_celts;
+ unsigned long m_iCurrent;
+ SAFEARRAY FAR* m_psa;
+};
diff --git a/private/oleauto/sample/spoly2/clsid.c b/private/oleauto/sample/spoly2/clsid.c
new file mode 100644
index 000000000..5994746b5
--- /dev/null
+++ b/private/oleauto/sample/spoly2/clsid.c
@@ -0,0 +1,46 @@
+/***
+*clsid.c
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates and initializes the CLSIDs.
+*
+*****************************************************************************/
+
+#ifdef _PPCMAC
+#pragma data_seg ("_FAR_DATA")
+#pragma data_seg ( )
+#endif //_PPCMAC
+
+#ifdef _MAC
+# include <Types.h>
+#ifdef _MSC_VER
+# include <Processe.h>
+# include <AppleEve.h>
+#else //_MSC_VER
+# include <Processes.h>
+# include <AppleEvents.h>
+#endif //_MSC_VER
+#else
+# include <windows.h>
+#endif
+
+#ifndef WIN32
+#include <compobj.h>
+#endif //!WIN32
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+#ifndef INITGUID
+# define INITGUID
+#endif
+
+// due to the previous header, including this causes the DEFINE_GUID
+// definitions in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
+
diff --git a/private/oleauto/sample/spoly2/clsid.h b/private/oleauto/sample/spoly2/clsid.h
new file mode 100644
index 000000000..6e7634d47
--- /dev/null
+++ b/private/oleauto/sample/spoly2/clsid.h
@@ -0,0 +1,30 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+DEFINE_GUID(CLSID_CPoly2, 0x00020464, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(CLSID_CPoint2, 0x00020465, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+
+
+#ifdef INITGUID
+# ifdef _MAC
+/* Define this under PPC Metroworks */
+# if !defined(_MW_BUILD)
+DEFINE_GUID(IID_IDispatch, 0x00020400L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IEnumVARIANT, 0x00020404L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+DEFINE_GUID(IID_IUnknown, 0x00000000L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+DEFINE_GUID(IID_IClassFactory, 0x00000001L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+# endif
+#endif
+
diff --git a/private/oleauto/sample/spoly2/cpoint.cpp b/private/oleauto/sample/spoly2/cpoint.cpp
new file mode 100644
index 000000000..24c95fa41
--- /dev/null
+++ b/private/oleauto/sample/spoly2/cpoint.cpp
@@ -0,0 +1,356 @@
+/***
+*cpoint.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module implements the CPoint and CPointCF classes.
+*
+* This module is intended as a sample implementation of the IDispatch
+* interface, and its purpose is to demonstrate how an object can
+* expose methods and properties for programatic and cross-process
+* access via the IDispatch interface.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "spoly.h"
+#include "cpoint.h"
+
+
+CPoint::CPoint()
+{
+ m_x = 0;
+ m_y = 0;
+ m_refs = 0;
+ m_ptinfo = NULL;
+}
+
+/***
+*CPoint::Create(void)
+*Purpose:
+* Create an instance of a CPoint object.
+*
+*Entry:
+* None
+*
+*Exit:
+* returns a CPoint*, NULL if creation failed.
+*
+***********************************************************************/
+CPoint FAR*
+CPoint::Create()
+{
+ HRESULT hresult;
+ CPoint FAR* ppoint;
+ ITypeInfo FAR* ptinfo;
+extern INTERFACEDATA NEAR g_idataCPoint;
+
+
+ if((ppoint = new FAR CPoint()) == NULL)
+ return NULL;
+ ppoint->AddRef();
+
+ hresult =
+ CreateDispTypeInfo(&g_idataCPoint, LOCALE_SYSTEM_DEFAULT, &ptinfo);
+ if(hresult != NOERROR)
+ goto LError0;
+
+ ppoint->m_ptinfo = ptinfo;
+
+ return ppoint;
+
+LError0:;
+ ppoint->Release();
+
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CPoint::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IDispatch)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPoint::AddRef(void)
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPoint::Release(void)
+{
+ if(--m_refs == 0){
+ if(m_ptinfo != NULL){
+ m_ptinfo->Release();
+ }
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CPoint::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ // this object has a single *introduced* interface
+ //
+ *pctinfo = 1;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CPoint::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
+{
+ UNUSED(lcid);
+
+ if(itinfo != 0)
+ return ResultFromScode(DISP_E_BADINDEX);
+
+ m_ptinfo->AddRef();
+ *pptinfo = m_ptinfo;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CPoint::GetIDsOfNames(REFIID, char**, unsigned int, LCID, DISPID*)
+*Purpose:
+* This method translates the given array of names to a corresponding
+* array of DISPIDs.
+*
+* Index 0 of the name array is the member name, and indices 1-N if
+* present represent named parameters on that member.
+*
+* The local ID ('lcid') is unused by this naive implementation. A more
+* sophisticated implementation, sensitive to localization and natural
+* language support would use the locale ID to interpret the given names
+* in a correct locale specific context.
+*
+*Entry:
+* rgszNames = pointer to an array of names
+* cNames = the number of names in the rgszNames array
+* lcid = the callers locale ID
+*
+*Exit:
+* return value = HRESULT
+* rgid = array of name IDs corresponding to the rgszNames array
+* this array will contain -1 for each entry that is not known.
+*
+***********************************************************************/
+STDMETHODIMP
+CPoint::GetIDsOfNames(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ UNUSED(lcid);
+
+ if(!IsEqualIID(riid,IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ return DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);
+}
+
+
+/***
+*HRESULT CPoint::Invoke(...)
+*Purpose:
+* Dispatch a method or property request for objects of type CPoint.
+*
+* see the IDispatch document for more information, and a general
+* description of this method.
+*
+*Entry:
+* dispidMember = the DISPID of the member being requested
+*
+* riid = reference to the interface ID of the interface on this object
+* that the requested member belongs to. IID_NULL means to interpret
+* the member as belonging to the implementation defined "default"
+* or "primary" interface.
+*
+* lcid = the caller's locale ID
+*
+* wFlags = flags indicating the type of access being requested
+*
+* pdispparams = pointer to the DISPPARAMS struct containing the
+* requested members arguments (if any) and its named parameter
+* DISPIDs (if any).
+*
+*Exit:
+* return value = HRESULT
+* see the IDispatch spec for a description of possible success codes.
+*
+* pvarResult = pointer to a caller allocated VARIANT containing
+* the members return value (if any).
+*
+* pexcepinfo = caller allocated exception info structure, this will
+* be filled in only if an exception was raised that must be passed
+* up through Invoke to an enclosing handler.
+*
+* puArgErr = pointer to a caller allocated UINT, that will contain the
+* index of the offending argument if a DISP_E_TYPEMISMATCH error
+* was returned indicating that one of the arguments was of an
+* incorrect type and/or could not be reasonably coerced to a proper
+* type.
+*
+***********************************************************************/
+STDMETHODIMP
+CPoint::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ UNUSED(lcid);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ return DispInvoke(
+ this, m_ptinfo,
+ dispidMember, wFlags, pdispparams,
+ pvarResult, pexcepinfo, puArgErr);
+}
+
+
+//---------------------------------------------------------------------
+// Introduced methods
+//---------------------------------------------------------------------
+
+short METHODCALLTYPE EXPORT
+CPoint::GetX()
+{
+ return m_x;
+}
+
+void METHODCALLTYPE EXPORT
+CPoint::SetX(short x)
+{
+ m_x = x;
+}
+
+short METHODCALLTYPE EXPORT
+CPoint::GetY()
+{
+ return m_y;
+}
+
+void METHODCALLTYPE EXPORT
+CPoint::SetY(short y)
+{
+ m_y = y;
+}
+
+
+//---------------------------------------------------------------------
+// Implementation of the CPoint Class Factory
+//---------------------------------------------------------------------
+
+CPointCF::CPointCF()
+{
+ m_refs = 0;
+}
+
+IClassFactory FAR*
+CPointCF::Create()
+{
+ CPointCF FAR* pCF;
+
+ if((pCF = new FAR CPointCF()) == NULL)
+ return NULL;
+ pCF->AddRef();
+ return pCF;
+}
+
+STDMETHODIMP
+CPointCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)){
+ *ppv = this;
+ ++m_refs;
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CPointCF::AddRef(void)
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPointCF::Release(void)
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP
+CPointCF::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+ CPoint FAR *ppoint;
+
+ UNUSED(punkOuter);
+
+ if((ppoint = CPoint::Create()) == NULL){
+ *ppv = NULL;
+ return ResultFromScode(E_OUTOFMEMORY);
+ }
+ hresult = ppoint->QueryInterface(riid, ppv);
+ ppoint->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+#ifdef _MAC
+CPointCF::LockServer(unsigned long fLock)
+#else
+CPointCF::LockServer(BOOL fLock)
+#endif
+{
+ UNUSED(fLock);
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/sample/spoly2/cpoint.h b/private/oleauto/sample/spoly2/cpoint.h
new file mode 100644
index 000000000..c16ee20bd
--- /dev/null
+++ b/private/oleauto/sample/spoly2/cpoint.h
@@ -0,0 +1,145 @@
+/***
+*cpoint.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CPoint class.
+*
+* The CPoint object exposes two properties for programatic access
+* via the IDispatch interface.
+*
+* properties:
+* X - the 'x' coordinate of the point
+* Y - the 'y' coordinate of the point
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef CLASS
+#ifdef __TURBOC__
+#define CLASS class huge
+#else
+#define CLASS class FAR
+#endif
+#endif
+
+class CPoly;
+
+CLASS CPoint : public IDispatch {
+ friend class CPoly;
+
+public:
+ static CPoint FAR* Create();
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IDispatch methods */
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pcTypeInfo);
+
+ STDMETHOD(GetTypeInfo)(
+ unsigned int iTypeInfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* ppTypeInfo);
+
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* pwArgErr);
+
+ /* Introduced methods */
+
+ virtual short METHODCALLTYPE EXPORT GetX(void);
+ virtual void METHODCALLTYPE EXPORT SetX(short x);
+ virtual short METHODCALLTYPE EXPORT GetY(void);
+ virtual void METHODCALLTYPE EXPORT SetY(short y);
+
+private:
+ CPoint();
+
+ unsigned long m_refs;
+
+ short m_x;
+ short m_y;
+
+ ITypeInfo FAR* m_ptinfo;
+};
+
+// member DISPIDs
+//
+enum IDMEMBER_CPOINT {
+ IDMEMBER_CPOINT_GETX = 1,
+ IDMEMBER_CPOINT_SETX,
+ IDMEMBER_CPOINT_GETY,
+ IDMEMBER_CPOINT_SETY,
+ IDMEMBER_CPOINT_MAX
+};
+
+// member indices - this is an enumeration of all members on CPoint
+//
+enum IMETH_CPOINT {
+ IMETH_CPOINT_QUERYINTERFACE = 0,
+ IMETH_CPOINT_ADDREF,
+ IMETH_CPOINT_RELEASE,
+ IMETH_CPOINT_GETTYPEINFOCOUNT,
+ IMETH_CPOINT_GETTYPEINFO,
+ IMETH_CPOINT_GETIDSOFNAMES,
+ IMETH_CPOINT_INVOKE,
+
+ IMETH_CPOINT_GETX,
+ IMETH_CPOINT_SETX,
+ IMETH_CPOINT_GETY,
+ IMETH_CPOINT_SETY
+};
+
+// structure used to link together lists of points
+//
+struct POINTLINK {
+ POINTLINK FAR* next;
+ CPoint FAR* ppoint;
+};
+
+
+// The CPoint Class Factory
+//
+CLASS CPointCF : public IClassFactory
+{
+public:
+ static IClassFactory FAR* Create();
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID iid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IClassFactory methods */
+ STDMETHOD(CreateInstance)(
+ IUnknown FAR* pUnkOuter, REFIID iid, void FAR* FAR* ppv);
+#ifdef _MAC
+ STDMETHOD(LockServer)(unsigned long fLock);
+#else
+ STDMETHOD(LockServer)(BOOL fLock);
+#endif
+
+private:
+ CPointCF();
+
+ unsigned long m_refs;
+};
diff --git a/private/oleauto/sample/spoly2/cpoly.cpp b/private/oleauto/sample/spoly2/cpoly.cpp
new file mode 100644
index 000000000..5f547e39f
--- /dev/null
+++ b/private/oleauto/sample/spoly2/cpoly.cpp
@@ -0,0 +1,897 @@
+/***
+*cpoly.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module implements the CPoly and CPolyCF classes.
+*
+* This module is intended as a sample implementation of the IDispatch
+* interface, and its purpose is to demonstrate how an object can
+* expose methods and properties for programatic and cross-process
+* access via the IDispatch interface.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+#include "cenumpt.h"
+
+#ifndef _MAC
+extern CStatBar FAR* g_psb;
+#endif
+
+#ifdef _MAC
+extern "C" WindowPtr g_pwndClient;
+#endif
+
+// our global list of polygons.
+//
+POLYLINK FAR* g_ppolylink = (POLYLINK FAR*)NULL;
+
+// global count of polygons.
+//
+int g_cPoly = 0;
+
+
+CPoly::CPoly()
+{
+ m_refs = 0;
+ m_xorg = 0;
+ m_yorg = 0;
+ m_width = 0;
+ m_cPoints = 0;
+
+ m_red = 0;
+ m_green = 0;
+ m_blue = 0;
+
+ m_ptinfo = NULL;
+
+ m_ppointlink = NULL;
+ m_ppointlinkLast = NULL;
+}
+
+
+/***
+*CPoly *CPoly::Create(void)
+*Purpose:
+* Create an instance of a CPoly object, and add it to the global
+* list of polygons.
+*
+*Entry:
+* None
+*
+*Exit:
+* returns a polygon object, NULL the allocation failed.
+*
+***********************************************************************/
+CPoly FAR*
+CPoly::Create()
+{
+ HRESULT hresult;
+ CPoly FAR* ppoly;
+ ITypeInfo FAR* ptinfo;
+ POLYLINK FAR* ppolylink;
+extern INTERFACEDATA NEAR g_idataCPoly;
+
+
+ if((ppolylink = new FAR POLYLINK) == (POLYLINK FAR*)NULL)
+ return (CPoly FAR*)NULL;
+
+ if((ppoly = new FAR CPoly()) == (CPoly FAR*)NULL)
+ return (CPoly FAR*)NULL;
+
+ ppoly->AddRef();
+
+ // create and attach its TypeInfo
+ //
+ hresult = CreateDispTypeInfo(&g_idataCPoly, LOCALE_SYSTEM_DEFAULT, &ptinfo);
+ if(hresult != NOERROR)
+ goto LError0;
+
+ ppoly->m_ptinfo = ptinfo;
+
+ // push the new polygon onto the front of the polygon list.
+ //
+ ++g_cPoly;
+
+ ppolylink->ppoly = ppoly;
+
+ ppolylink->next = g_ppolylink;
+ g_ppolylink = ppolylink;
+
+#ifndef _MAC
+ SBprintf(g_psb, TSTR("#poly = %d"), g_cPoly);
+#endif
+
+ return ppoly;
+
+
+LError0:;
+ ppoly->Release();
+
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CPoly::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(!IsEqualIID(riid, IID_IUnknown))
+ if(!IsEqualIID(riid, IID_IDispatch)) {
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+ }
+
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPoly::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPoly::Release()
+{
+ POLYLINK FAR* FAR* pppolylink, FAR* ppolylinkDead;
+
+ if(--m_refs == 0){
+ Reset(); // release all CPoints
+
+ // remove ourselves from the global list of polygons
+ //
+ for( pppolylink = &g_ppolylink;
+ *pppolylink != NULL;
+ pppolylink = &(*pppolylink)->next)
+ {
+ if((*pppolylink)->ppoly == this){
+ ppolylinkDead = *pppolylink;
+ *pppolylink = (*pppolylink)->next;
+ delete ppolylinkDead;
+ break;
+ }
+ }
+
+ if(m_ptinfo != NULL){
+ m_ptinfo->Release();
+ }
+
+ --g_cPoly;
+
+#ifndef _MAC
+ SBprintf(g_psb, TSTR("#poly = %d"), g_cPoly);
+#endif
+
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CPoly::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ // This object has a single *introduced* interface
+ //
+ *pctinfo = 1;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CPoly::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
+{
+ UNUSED(lcid);
+
+ if(itinfo != 0)
+ return ResultFromScode(DISP_E_BADINDEX);
+
+ m_ptinfo->AddRef();
+ *pptinfo = m_ptinfo;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CPoly::GetIDsOfNames(char**, unsigned int, LCID, DISPID*)
+*Purpose:
+* This method translates the given array of names to a corresponding
+* array of DISPIDs.
+*
+* This method deferrs to a common implementation shared by
+* both the CPoly and CPoint objects. See the description of
+* 'SPolyGetIDsOfNames()' in dispimpl.cpp for more information.
+*
+*Entry:
+* rgszNames = pointer to an array of names
+* cNames = the number of names in the rgszNames array
+* lcid = the callers locale ID
+*
+*Exit:
+* return value = HRESULT
+* rgdispid = array of DISPIDs corresponding to the rgszNames array
+* this array will contain -1 for each entry that is not known.
+*
+***********************************************************************/
+STDMETHODIMP
+CPoly::GetIDsOfNames(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ UNUSED(lcid);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ return DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);
+}
+
+
+/***
+*HRESULT CPoly::Invoke(...)
+*Purpose:
+* Dispatch a method or property request for objects of type CPoly.
+*
+* see the IDispatch document for more information, and a general
+* description of this method.
+*
+*Entry:
+* dispidMember = the DISPID of the member being requested
+*
+* riid = reference to the interface ID of the interface on this object
+* that the requested member belongs to. IID_NULL means to interpret
+* the member as belonging to the implementation defined "default"
+* or "primary" interface.
+*
+* lcid = the caller's locale ID
+*
+* wFlags = flags indicating the type of access being requested
+*
+* pdispparams = pointer to the DISPPARAMS struct containing the
+* requested members arguments (if any) and its named parameter
+* DISPIDs (if any).
+*
+*Exit:
+* return value = HRESULT
+* see the IDispatch spec for a description of possible success codes.
+*
+* pvarResult = pointer to a caller allocated VARIANT containing
+* the members return value (if any).
+*
+* pexcepinfo = caller allocated exception info structure, this will
+* be filled in only if an exception was raised that must be passed
+* up through Invoke to an enclosing handler.
+*
+* puArgErr = pointer to a caller allocated UINT, that will contain the
+* index of the offending argument if a DISP_E_TYPEMISMATCH error
+* was returned indicating that one of the arguments was of an
+* incorrect type and/or could not be reasonably coerced to a proper
+* type.
+*
+***********************************************************************/
+STDMETHODIMP
+CPoly::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ UNUSED(lcid);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ return DispInvoke(
+ this, m_ptinfo,
+ dispidMember, wFlags, pdispparams,
+ pvarResult, pexcepinfo, puArgErr);
+}
+
+
+//---------------------------------------------------------------------
+// Introduced Methods
+//---------------------------------------------------------------------
+
+
+/***
+*void CPoly::Draw(void)
+*Purpose:
+* Draw the polygon, using the current x/y origin and line width
+* properties.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void METHODCALLTYPE EXPORT
+CPoly::Draw()
+{
+ short xorg, yorg;
+ POINTLINK FAR* ppointlinkFirst, FAR* ppointlink;
+
+ if((ppointlinkFirst = m_ppointlink) == (POINTLINK FAR*)NULL)
+ return;
+
+#ifdef _MAC /* { */
+
+ short x,y;
+ RGBColor rgb;
+ WindowPtr pwndSaved;
+
+ GetPort(&pwndSaved);
+ SetPort(g_pwndClient);
+
+ PenNormal();
+ PenSize(m_width, m_width);
+
+ rgb.red = m_red;
+ rgb.green = m_green;
+ rgb.blue = m_blue;
+ RGBForeColor(&rgb);
+
+ xorg = m_xorg;
+ yorg = m_yorg;
+
+ MoveTo(
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y);
+
+ for(ppointlink = ppointlinkFirst->next;
+ ppointlink != (POINTLINK FAR*)NULL;
+ ppointlink = ppointlink->next)
+ {
+ x = xorg + ppointlink->ppoint->m_x;
+ y = yorg + ppointlink->ppoint->m_y;
+ LineTo(x, y);
+ }
+
+ LineTo(
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y);
+
+ SetPort(pwndSaved);
+
+#else /* }{ */
+
+ HDC hdc;
+ RECT rect;
+ HPEN hpen, hpenOld;
+extern HWND g_hwndClient;
+
+ GetClientRect(g_hwndClient, &rect);
+ xorg = m_xorg + (short) rect.left;
+ yorg = m_yorg + (short) rect.top;
+
+ hdc = GetDC(g_hwndClient);
+ hpen = CreatePen(PS_SOLID, m_width, RGB(m_red, m_green, m_blue));
+ hpenOld = (HPEN)SelectObject(hdc, hpen);
+
+#ifdef WIN32
+ MoveToEx(hdc,
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y, NULL);
+#else
+ MoveTo(hdc,
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y);
+#endif
+
+ for(ppointlink = ppointlinkFirst->next;
+ ppointlink != (POINTLINK FAR*)NULL;
+ ppointlink = ppointlink->next)
+ {
+ LineTo(hdc,
+ xorg + ppointlink->ppoint->m_x,
+ yorg + ppointlink->ppoint->m_y);
+ }
+
+ LineTo(hdc,
+ xorg + ppointlinkFirst->ppoint->m_x,
+ yorg + ppointlinkFirst->ppoint->m_y);
+
+ SelectObject(hdc, hpenOld);
+ DeleteObject(hpen);
+
+ ReleaseDC(g_hwndClient, hdc);
+
+#endif /* } */
+}
+
+
+/***
+*void CPoly::Reset(void)
+*Purpose:
+* Release all points referenced by this poly.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void METHODCALLTYPE EXPORT
+CPoly::Reset()
+{
+ POINTLINK FAR* ppointlink, FAR* ppointlinkNext;
+
+ for(ppointlink = m_ppointlink;
+ ppointlink != (POINTLINK FAR*)NULL;
+ ppointlink = ppointlinkNext)
+ {
+ ppointlinkNext = ppointlink->next;
+ ppointlink->ppoint->Release();
+ delete ppointlink;
+ }
+
+ m_cPoints = 0;
+ m_ppointlink = NULL;
+ m_ppointlinkLast = NULL;
+}
+
+
+/***
+*HRESULT CPoly::AddPoint(short, short)
+*Purpose:
+* Add a CPoint with the given coordinates to the end of our current
+* list of points.
+*
+*Entry:
+* x,y = the x and y coordinates of the new point.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT METHODCALLTYPE
+CPoly::AddPoint(short x, short y)
+{
+ CPoint FAR* ppoint;
+ POINTLINK FAR* ppointlink;
+
+ ppoint = CPoint::Create();
+ if(ppoint == (CPoint FAR*)NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+ ppoint->SetX(x);
+ ppoint->SetY(y);
+
+ ppointlink = new FAR POINTLINK;
+ if(ppointlink == (POINTLINK FAR*)NULL){
+ delete ppoint;
+ return ResultFromScode(E_OUTOFMEMORY);
+ }
+
+ ppointlink->ppoint = ppoint;
+ ppointlink->next = (POINTLINK FAR*)NULL;
+
+ if(m_ppointlinkLast == (POINTLINK FAR*)NULL){
+ m_ppointlink = m_ppointlinkLast = ppointlink;
+ }else{
+ m_ppointlinkLast->next = ppointlink;
+ m_ppointlinkLast = ppointlink;
+ }
+
+ ++m_cPoints;
+
+ return NOERROR;
+}
+
+
+/***
+*IUnknown FAR* CPoly::EnumPoints(void);
+*Purpose:
+* Return and enumerator for the points in this polygon.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppenum = pointer to an IEnumVARIANT for the points in this polygon
+*
+***********************************************************************/
+IUnknown FAR* METHODCALLTYPE EXPORT
+CPoly::EnumPoints()
+{
+ unsigned int i;
+ HRESULT hresult;
+ VARIANT var;
+ SAFEARRAY FAR* psa;
+ IUnknown FAR* punk;
+ CEnumPoint FAR* penum;
+ POINTLINK FAR* ppointlink;
+ SAFEARRAYBOUND rgsabound[1];
+
+ rgsabound[0].lLbound = 0;
+ rgsabound[0].cElements = m_cPoints;
+
+ psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
+ if(psa == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ ppointlink = m_ppointlink;
+ for(i = 0; i < m_cPoints; ++i){
+ long ix[1];
+
+ if(ppointlink == NULL){
+ // this indicates an internal consistency error.
+ // (this test should probably be an assertion)
+ hresult = ResultFromScode(E_FAIL);
+ goto LError1;
+ }
+
+ V_VT(&var) = VT_DISPATCH;
+ hresult = ppointlink->ppoint->QueryInterface(
+ IID_IDispatch, (void FAR* FAR*)&V_DISPATCH(&var));
+ if(hresult != NOERROR)
+ goto LError1;
+
+ ix[0] = i;
+ SafeArrayPutElement(psa, ix, &var);
+
+ ppointlink = ppointlink->next;
+ }
+
+ hresult = CEnumPoint::Create(psa, &penum);
+ if(hresult != NOERROR)
+ goto LError1;
+
+ // ownership of the array has passed to the enumerator
+ psa = NULL;
+
+ hresult = penum->QueryInterface(IID_IUnknown, (void FAR* FAR*)&punk);
+ if(hresult != NOERROR)
+ goto LError2;
+
+ penum->Release();
+
+ return punk;
+
+LError2:;
+ penum->Release();
+
+LError1:;
+ // destroy the array if we were not successful creating the enumerator.
+ if(psa != NULL)
+ SafeArrayDestroy(psa);
+
+LError0:;
+ return NULL;
+}
+
+
+short METHODCALLTYPE EXPORT
+CPoly::GetXOrigin()
+{
+ return m_xorg;
+}
+
+void METHODCALLTYPE EXPORT
+CPoly::SetXOrigin(short x)
+{
+ m_xorg = x;
+}
+
+short METHODCALLTYPE EXPORT
+CPoly::GetYOrigin()
+{
+ return m_yorg;
+}
+
+void METHODCALLTYPE EXPORT
+CPoly::SetYOrigin(short y)
+{
+ m_yorg = y;
+}
+
+short METHODCALLTYPE EXPORT
+CPoly::GetWidth()
+{
+ return m_width;
+}
+
+
+void METHODCALLTYPE EXPORT
+CPoly::SetWidth(short width)
+{
+ m_width = width;
+}
+
+short METHODCALLTYPE EXPORT
+CPoly::get_red()
+{
+ return m_red;
+}
+
+void METHODCALLTYPE EXPORT
+CPoly::set_red(short red)
+{
+ m_red = red;
+}
+
+short METHODCALLTYPE EXPORT
+CPoly::get_green()
+{
+ return m_green;
+}
+
+void METHODCALLTYPE EXPORT
+CPoly::set_green(short green)
+{
+ m_green = green;
+}
+
+short METHODCALLTYPE EXPORT
+CPoly::get_blue()
+{
+ return m_blue;
+}
+
+void METHODCALLTYPE EXPORT
+CPoly::set_blue(short blue)
+{
+ m_blue = blue;
+}
+
+
+/***
+*void CPoly::Dump(void)
+*Purpose:
+* Output a debug dump of this instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void METHODCALLTYPE EXPORT
+CPoly::Dump()
+{
+#ifdef _MAC
+
+ // REVIEW: implement for the mac
+
+#else
+
+ TCHAR buffer[80];
+ POINTLINK FAR* ppointlink;
+
+ wsprintf(buffer, TSTR("CPoly(0x%x) =\n"), (int)this);
+ OutputDebugString(buffer);
+
+ wsprintf(buffer,
+ TSTR(" xorg = %d, yorg = %d, width = %d, rgb = {%d,%d,%d}\n points = "),
+ m_xorg, m_yorg, m_width,
+ get_red(),
+ get_green(),
+ get_blue());
+
+ OutputDebugString(buffer);
+
+ for(ppointlink = m_ppointlink;
+ ppointlink != (POINTLINK FAR*)NULL;
+ ppointlink = ppointlink->next)
+ {
+ wsprintf(buffer, TSTR("{%d,%d}"),
+ ppointlink->ppoint->GetX(),
+ ppointlink->ppoint->GetY());
+ OutputDebugString(buffer);
+
+ wsprintf(buffer, TSTR(" "));
+ OutputDebugString(buffer);
+ }
+ wsprintf(buffer, TSTR("\n"));
+ OutputDebugString(buffer);
+
+#endif
+}
+
+/***
+*void CPoly::PolyDraw(void)
+*Purpose:
+* Draw all polygons.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CPoly::PolyDraw()
+{
+ POLYLINK FAR* polylink;
+
+ for(polylink = g_ppolylink;
+ polylink != (POLYLINK FAR*)NULL;
+ polylink = polylink->next)
+ {
+ polylink->ppoly->Draw();
+ }
+}
+
+
+/***
+*void PolyTerm(void)
+*Purpose:
+* Release all polygons.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CPoly::PolyTerm()
+{
+ POLYLINK FAR* ppolylink;
+ POLYLINK FAR* ppolylinkNext;
+
+ for(ppolylink = g_ppolylink;
+ ppolylink != (POLYLINK FAR*)NULL;
+ ppolylink = ppolylinkNext)
+ {
+ ppolylinkNext = ppolylink->next;
+ ppolylink->ppoly->Release();
+ delete ppolylink;
+ }
+ g_ppolylink = NULL;
+}
+
+
+/***
+*void PolyDump(void)
+*Purpose:
+* Invoke the debug Dump() method on all polygons were currently
+* holding on to.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CPoly::PolyDump()
+{
+ POLYLINK FAR* ppolylink;
+
+ if(g_ppolylink == (POLYLINK FAR*)NULL){
+#ifndef _MAC
+ OutputDebugString(TSTR("\t(none)\n"));
+#endif
+ return;
+ }
+
+ for(ppolylink = g_ppolylink;
+ ppolylink != (POLYLINK FAR*)NULL;
+ ppolylink = ppolylink->next)
+ {
+ ppolylink->ppoly->Dump();
+ }
+}
+
+
+//---------------------------------------------------------------------
+// Implementation of the CPoly Class Factory
+//---------------------------------------------------------------------
+
+
+CPolyCF::CPolyCF()
+{
+ m_refs = 0;
+}
+
+IClassFactory FAR*
+CPolyCF::Create()
+{
+ CPolyCF FAR* pCF;
+
+ if((pCF = new FAR CPolyCF()) == NULL)
+ return NULL;
+ pCF->AddRef();
+ return pCF;
+}
+
+STDMETHODIMP
+CPolyCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)){
+ *ppv = this;
+ ++m_refs;
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CPolyCF::AddRef(void)
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPolyCF::Release(void)
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP
+CPolyCF::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID iid,
+ void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+ CPoly FAR *ppoly;
+
+ UNUSED(punkOuter);
+
+ if((ppoly = CPoly::Create()) == NULL){
+ *ppv = NULL;
+ return ResultFromScode(E_OUTOFMEMORY);
+ }
+ hresult = ppoly->QueryInterface(iid, ppv);
+ ppoly->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+#ifdef _MAC
+CPolyCF::LockServer(unsigned long fLock)
+#else
+CPolyCF::LockServer(BOOL fLock)
+#endif
+{
+ UNUSED(fLock);
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/sample/spoly2/cpoly.h b/private/oleauto/sample/spoly2/cpoly.h
new file mode 100644
index 000000000..bc1dea9fe
--- /dev/null
+++ b/private/oleauto/sample/spoly2/cpoly.h
@@ -0,0 +1,235 @@
+/***
+*cpoly.h
+*
+* Copyright (C) 1992-1994 Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CPoly class.
+*
+* The CPoly class defines a number of methods and exposes them for
+* external programmability via IDispatch,
+*
+* methods:
+* DRAW - draw the polygon
+* RESET - delete all points from the polygon
+*
+* ADDPOINT(X, Y) - add a point with coordinates (x,y) to the polygon
+*
+* ENUMPOINTS - return a collection of the polygon's points
+*
+* GETXORIGIN - get and set the X origin of the polygon
+* SETXORIGIN
+*
+* GETYORIGIN - get and set the Y origin of the polygon
+* SETYORIGIN
+*
+* GETWIDTH - get and set the line width of the polygon
+* SETWIDTH
+*
+* UNDONE: update description
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+#ifndef CLASS
+# ifdef __TURBOC__
+# define CLASS class huge
+# else
+# define CLASS class FAR
+# endif
+#endif
+
+class CPoint;
+
+CLASS CPoly : public IDispatch
+{
+public:
+ static CPoly FAR* Create();
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IDispatch methods */
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pcTypeInfo);
+
+ STDMETHOD(GetTypeInfo)(
+ unsigned int iTypeInfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* ppTypeInfo);
+
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ /* Introduced methods */
+
+ virtual void METHODCALLTYPE EXPORT Draw(void);
+ virtual void METHODCALLTYPE EXPORT Reset(void);
+
+ // add a point with the given 'x' and 'y' coordinates
+ virtual HRESULT METHODCALLTYPE EXPORT AddPoint(short x, short y);
+
+ // return a collection of the polygon's points
+ virtual IUnknown FAR* METHODCALLTYPE EXPORT EnumPoints(void);
+
+ // get/set the polygon's X origin property
+ virtual short METHODCALLTYPE EXPORT GetXOrigin(void);
+ virtual void METHODCALLTYPE EXPORT SetXOrigin(short x);
+
+ // get/set the polygon's Y origin property
+ virtual short METHODCALLTYPE EXPORT GetYOrigin(void);
+ virtual void METHODCALLTYPE EXPORT SetYOrigin(short y);
+
+ virtual short METHODCALLTYPE EXPORT GetWidth(void);
+ virtual void METHODCALLTYPE EXPORT SetWidth(short width);
+
+ virtual short METHODCALLTYPE EXPORT get_red(void);
+ virtual void METHODCALLTYPE EXPORT set_red(short red);
+
+ virtual short METHODCALLTYPE EXPORT get_green(void);
+ virtual void METHODCALLTYPE EXPORT set_green(short green);
+
+ virtual short METHODCALLTYPE EXPORT get_blue(void);
+ virtual void METHODCALLTYPE EXPORT set_blue(short blue);
+
+ // Debug method
+ virtual void METHODCALLTYPE EXPORT Dump(void);
+
+public:
+
+ // Draw all polygons.
+ static void PolyDraw(void);
+
+ // Release all polygons.
+ static void PolyTerm(void);
+
+ // Dump all polygons to dbwin.
+ static void PolyDump(void);
+
+
+private:
+ CPoly();
+
+ short m_xorg;
+ short m_yorg;
+ short m_width;
+
+ short m_red;
+ short m_green;
+ short m_blue;
+
+ unsigned long m_refs;
+ unsigned int m_cPoints;
+
+ ITypeInfo FAR* m_ptinfo;
+
+ POINTLINK FAR* m_ppointlink;
+ POINTLINK FAR* m_ppointlinkLast;
+};
+
+// DISPIDs for the members and properties available via IDispatch.
+//
+enum IDMEMBER_CPOLY {
+ IDMEMBER_CPOLY_DRAW = 1,
+ IDMEMBER_CPOLY_RESET,
+ IDMEMBER_CPOLY_ADDPOINT,
+ IDMEMBER_CPOLY_ENUMPOINTS,
+ IDMEMBER_CPOLY_GETXORIGIN,
+ IDMEMBER_CPOLY_SETXORIGIN,
+ IDMEMBER_CPOLY_GETYORIGIN,
+ IDMEMBER_CPOLY_SETYORIGIN,
+ IDMEMBER_CPOLY_GETWIDTH,
+ IDMEMBER_CPOLY_SETWIDTH,
+ IDMEMBER_CPOLY_GETRED,
+ IDMEMBER_CPOLY_SETRED,
+ IDMEMBER_CPOLY_GETGREEN,
+ IDMEMBER_CPOLY_SETGREEN,
+ IDMEMBER_CPOLY_GETBLUE,
+ IDMEMBER_CPOLY_SETBLUE,
+ IDMEMBER_CPOLY_DUMP,
+ IDMEMBER_CPOLY_MAX
+};
+
+// CPoly method indices
+//
+enum IMETH_CPOLY {
+ IMETH_CPOLY_QUERYINTERFACE = 0,
+ IMETH_CPOLY_ADDREF,
+ IMETH_CPOLY_RELEASE,
+ IMETH_CPOLY_GETTYPEINFOCOUNT,
+ IMETH_CPOLY_GETTYPEINFO,
+ IMETH_CPOLY_GETIDSOFNAMES,
+ IMETH_CPOLY_INVOKE,
+ IMETH_CPOLY_DRAW,
+ IMETH_CPOLY_RESET,
+ IMETH_CPOLY_ADDPOINT,
+ IMETH_CPOLY_ENUMPOINTS,
+ IMETH_CPOLY_GETXORIGIN,
+ IMETH_CPOLY_SETXORIGIN,
+ IMETH_CPOLY_GETYORIGIN,
+ IMETH_CPOLY_SETYORIGIN,
+ IMETH_CPOLY_GETWIDTH,
+ IMETH_CPOLY_SETWIDTH,
+ IMETH_CPOLY_GETRED,
+ IMETH_CPOLY_SETRED,
+ IMETH_CPOLY_GETGREEN,
+ IMETH_CPOLY_SETGREEN,
+ IMETH_CPOLY_GETBLUE,
+ IMETH_CPOLY_SETBLUE,
+ IMETH_CPOLY_DUMP,
+ IMETH_CPOLY_MAX
+};
+
+// structure used to link together polygons
+//
+struct POLYLINK {
+ POLYLINK FAR* next;
+ CPoly FAR* ppoly;
+};
+
+
+// The CPoly class factory
+//
+CLASS CPolyCF : public IClassFactory
+{
+public:
+ static IClassFactory FAR* Create();
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IClassFactory methods */
+ STDMETHOD(CreateInstance)(
+ IUnknown FAR* pUnkOuter, REFIID riid, void FAR* FAR* ppv);
+#ifdef _MAC
+ STDMETHOD(LockServer)(unsigned long fLock);
+#else
+ STDMETHOD(LockServer)(BOOL fLock);
+#endif
+
+private:
+ CPolyCF();
+
+ unsigned long m_refs;
+};
+
diff --git a/private/oleauto/sample/spoly2/hostenv.h b/private/oleauto/sample/spoly2/hostenv.h
new file mode 100644
index 000000000..56a311393
--- /dev/null
+++ b/private/oleauto/sample/spoly2/hostenv.h
@@ -0,0 +1,117 @@
+/***
+*hostenv.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Generic host specific includes.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(_MAC)
+
+#if defined(_PPCMAC)
+#pragma data_seg("_FAR_DATA")
+#pragma data_seg( )
+#define MAXLONG 0x7fffffff
+#define EventHandlerProcPtr AEEventHandlerUPP
+#else //_PPCMAC
+#define GetMenuItemText(mApple,menuItem,daName) GetItem(mApple,menuItem,daName)
+#endif //_PPCMAC
+
+#endif //_MAC
+
+#if defined(_MAC)
+
+#if defined(_MSC_VER)
+
+# include <values.h>
+# include <types.h>
+# include <string.h>
+# include <quickdra.h>
+# include <fonts.h>
+# include <events.h>
+# include <resource.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutil.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEve.h>
+
+#else //_MSC_VER
+
+# include <values.h>
+# include <types.h>
+# include <strings.h>
+# include <quickdraw.h>
+# include <fonts.h>
+# include <events.h>
+# include <resources.h>
+# include <windows.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutils.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEvents.h>
+
+#endif //_MSC_VER
+
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+
+#elif defined(WIN32)
+
+# include <windows.h>
+
+# if defined(UNICODE)
+ #define TCHAR WCHAR
+ #define TSTR(str) L##str
+ #define STRING(str) (str)
+ #define WIDESTRING(str) (str)
+# else
+ #define TCHAR char
+ #define TSTR(str) str
+ #define STRING(str) AnsiString(str)
+ #define WIDESTRING(str) WideString(str)
+ extern "C" char FAR* AnsiString(OLECHAR FAR* strIn);
+ extern "C" OLECHAR FAR* WideString(char FAR* strIn);
+# endif
+
+
+#else /* WIN16 */
+
+# include <windows.h>
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+#endif
+
diff --git a/private/oleauto/sample/spoly2/macmain.cpp b/private/oleauto/sample/spoly2/macmain.cpp
new file mode 100644
index 000000000..12ca8ba77
--- /dev/null
+++ b/private/oleauto/sample/spoly2/macmain.cpp
@@ -0,0 +1,397 @@
+/***
+*macmain.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This module is the main entry point for the sample IDispatch polygon
+* server, spoly2.exe.
+*
+* This program is intended to demonstrate an implementation of the IDispatch
+* interface. Spoly is a very simple app, that implements two simple objects,
+* CPoly and CPoint and exposes their properties and methods for programatic
+* and cross-process access via IDispatch.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+
+#include <stdio.h>
+
+extern "C" {
+
+Boolean g_fInitOle = false;
+#ifndef _PPCMAC
+Boolean g_fInitLibraryManager = false;
+#endif //_PPCMAC
+WindowPtr g_pwndClient = nil;
+
+}
+
+void Init(void);
+void EventLoop(void);
+
+void AdjustMenus(void);
+void Close(WindowPtr window);
+void DoEvent(EventRecord *pevent);
+void DoMenuCommand(long menuResult);
+void Quit(void);
+#ifndef _MSC_VER
+#ifndef ConstStr255Param
+#define ConstStr255Param StringPtr
+#endif
+#endif
+void Fatal(ConstStr255Param);
+
+Boolean
+IsAppWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : ((WindowPeek)window)->windowKind == userKind;
+}
+
+Boolean
+IsDAWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind < 0);
+}
+
+void
+main()
+{
+ Init();
+ EventLoop();
+}
+
+void
+EventLoop()
+{
+ EventRecord event;
+ RgnHandle cursorRgn;
+
+ cursorRgn = NewRgn();
+ while(1){
+ if(WaitNextEvent(everyEvent, &event, MAXLONG, cursorRgn))
+ DoEvent(&event);
+ }
+}
+
+void
+DoEvent(EventRecord *pevent)
+{
+ char key;
+ short part;
+ WindowPtr window;
+
+ switch(pevent->what){
+ case mouseDown:
+ part = FindWindow(pevent->where, &window);
+ switch(part){
+ case inMenuBar:
+ AdjustMenus();
+ DoMenuCommand(MenuSelect(pevent->where));
+ break;
+
+ case inSysWindow: /* let the system handle the mouseDown */
+ SystemClick(pevent, window);
+ break;
+
+ case inContent:
+ if(window != FrontWindow()){
+ SelectWindow(window);
+ }
+ break;
+
+ case inDrag:
+ DragWindow(window, pevent->where, &qd.screenBits.bounds);
+ break;
+ }
+ break;
+
+ case keyDown:
+ case autoKey: /* check for menukey equivalents */
+ key = (char)(pevent->message & charCodeMask);
+ if(pevent->modifiers & cmdKey){ /* Command key down */
+ if(pevent->what == keyDown){
+ /* enable/disable/check menu items properly */
+ AdjustMenus();
+ DoMenuCommand(MenuKey(key));
+ }
+ }
+ break;
+
+ case updateEvt:
+ window = (WindowPtr)pevent->message;
+ if(IsAppWindow(window)){
+ BeginUpdate(window);
+ if(!EmptyRgn(window->visRgn)){
+ SetPort(window);
+ EraseRect(&window->portRect);
+ }
+ EndUpdate(window);
+ }
+ break;
+
+ case kHighLevelEvent:
+ AEProcessAppleEvent(pevent);
+ break;
+ }
+}
+
+void
+Enable(MenuHandle hmenu, short sItem, Boolean fEnable)
+{
+ if(fEnable)
+ EnableItem(hmenu, sItem);
+ else
+ DisableItem(hmenu, sItem);
+}
+
+void
+AdjustMenus()
+{
+ Boolean fIsDA;
+ MenuHandle hmenu;
+
+ fIsDA = IsDAWindow(FrontWindow());
+
+ /* we can allow desk accessories to be closed from the menu */
+ hmenu = GetMHandle(mFile);
+ Enable(hmenu, iClose, fIsDA);
+
+ hmenu = GetMHandle(mEdit);
+ Enable(hmenu, iUndo, fIsDA);
+ Enable(hmenu, iCut, fIsDA);
+ Enable(hmenu, iCopy, fIsDA);
+ Enable(hmenu, iClear, fIsDA);
+ Enable(hmenu, iPaste, fIsDA);
+}
+
+// Spoly2 self test
+HRESULT
+DoPoly()
+{
+ HRESULT hresult;
+ int numpoly, i, j;
+
+static struct {
+ short x;
+ short y;
+} rgptPoly[] = {
+ { 25, 0}
+ , { 75, 0}
+ , {100, 25}
+ , {100, 75}
+ , { 75, 100}
+ , { 25, 100}
+ , { 0, 75}
+ , { 0, 25}
+};
+
+static struct {
+ short red;
+ short green;
+ short blue;
+} rgrgbColors[] = {
+ { 0, 0, 0}
+ , { 0, 0, 0x7fff}
+ , { 0, 0x7fff, 0}
+ , {0x7fff, 0, 0}
+ , {0x7fff, 0, 0x7fff}
+ , {0x7fff, 0x7fff, 0}
+ , {0x7fff, 0x7fff, 0x7fff}
+};
+
+ CPoly *rgprempoly[DIM(rgrgbColors)];
+
+ numpoly = DIM(rgprempoly);
+
+ // init
+ for(i = 0; i < numpoly; ++i)
+ rgprempoly[i] = (CPoly*)NULL;
+
+ for(i = 0; i < numpoly; ++i){
+ if((rgprempoly[i] = CPoly::Create()) == NULL)
+ goto LError0;
+
+ for(j = 0; j < DIM(rgptPoly); ++j)
+ rgprempoly[i]->AddPoint(rgptPoly[j].x, rgptPoly[j].y);
+
+ for(j = 0; j < DIM(rgrgbColors); ++j){
+ rgprempoly[i]->SetWidth(i + j);
+ rgprempoly[i]->set_red(rgrgbColors[j].red);
+ rgprempoly[i]->set_green(rgrgbColors[j].green);
+ rgprempoly[i]->set_blue(rgrgbColors[j].blue);
+ rgprempoly[i]->SetXOrigin((2*i) + j << 4);
+ rgprempoly[i]->SetYOrigin(j << 4);
+ rgprempoly[i]->Draw();
+ }
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+ for(i = 0; i < numpoly; ++i){
+ if(rgprempoly[i] != (CPoly*)NULL){
+ rgprempoly[i]->Release();
+ }
+ }
+
+ return hresult;
+}
+
+void
+DoMenuCommand(long menuResult)
+{
+ short menuID; /* the resource ID of the selected menu */
+ short menuItem; /* the item number of the selected menu */
+ Str255 daName;
+
+ menuID = HiWord(menuResult);
+ menuItem = LoWord(menuResult);
+
+ switch(menuID){
+ case mApple:
+ switch(menuItem){
+ case iAbout: /* bring up alert for About */
+ Alert(rAboutAlert, nil);
+ break;
+ default:
+ GetMenuItemText(GetMHandle(mApple), menuItem, daName);
+ OpenDeskAcc(daName);
+ break;
+ }
+ break;
+
+ case mFile:
+ switch(menuItem){
+ case iClose:
+ Close(FrontWindow());
+ break;
+ case iQuit:
+ Quit();
+ break;
+ }
+ break;
+
+ case mEdit:
+ SystemEdit(menuItem-1);
+ break;
+
+ case mSpoly:
+ switch(menuItem){
+ case iTest:
+ DoPoly();
+ break;
+ }
+ }
+
+ HiliteMenu(0);
+}
+
+void
+Close(WindowPtr window)
+{
+ if(IsDAWindow(window))
+ CloseDeskAcc(((WindowPeek)window)->windowKind);
+ else if(IsAppWindow(window))
+ CloseWindow(window);
+}
+
+#if defined(_MSC_VER)
+OSErr pascal
+#else
+pascal OSErr
+#endif
+RemoteLowLevelEvt(AppleEvent theAppEvt, AppleEvent reply, long HandlerRefCon)
+{
+ long cb;
+ OSErr err;
+ DescType descType;
+ EventRecord event;
+
+ UNUSED(reply);
+ UNUSED(HandlerRefCon);
+
+ err = AEGetKeyPtr(
+ &theAppEvt,
+ keyDirectObject,
+ typeWildCard,
+ &descType,
+ (Ptr)&event, sizeof(event), &cb);
+
+ if(err != noErr)
+ return err;
+
+ DoEvent(&event);
+
+ return noErr;
+}
+
+void
+Init()
+{
+ Handle menuBar;
+
+ MaxApplZone();
+
+ InitGraf((Ptr)&qd.thePort);
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ TEInit();
+ InitDialogs(nil);
+ InitCursor();
+ FlushEvents(everyEvent, 0);
+
+#ifndef _PPCMAC
+ if (InitOleManager(0) != NOERROR)
+ Fatal((ConstStr255Param)"\pCould not initialize OLE Applet");
+ g_fInitLibraryManager = true;
+#endif //_PPCMAC
+
+ if(InitOle() != NOERROR)
+ Fatal((ConstStr255Param)"\pUnable to Initialize Ole");
+ g_fInitOle = true;
+
+ if(AEInstallEventHandler('OLE2', 'EVNT', (EventHandlerProcPtr)RemoteLowLevelEvt, 0, false) != noErr)
+ Fatal((ConstStr255Param)"\pUnable to install handler");
+
+ if((g_pwndClient = (WindowPtr)NewPtr(sizeof(WindowRecord))) == nil)
+ Fatal((ConstStr255Param)"\pOut of memory");
+ g_pwndClient = GetNewCWindow(rWindow, (Ptr)g_pwndClient, (WindowPtr)-1);
+
+ if((menuBar = GetNewMBar(rMenuBar)) == nil)
+ Fatal((ConstStr255Param)"\pUnable to load menu bar");
+ SetMenuBar(menuBar);
+ DisposHandle(menuBar);
+ AddResMenu(GetMHandle(mApple), 'DRVR'); /* add DA names to Apple menu */
+ DrawMenuBar();
+}
+
+void
+Quit()
+{
+ if(g_fInitOle)
+ UninitOle();
+#ifndef _PPCMAC
+ if(g_fInitLibraryManager)
+ UninitOleManager(); // clean up applet
+#endif //_PPCMAC
+ ExitToShell();
+}
+
+/* display fatal error alert, and exit */
+void
+Fatal(ConstStr255Param msg)
+{
+ SetCursor(&qd.arrow);
+ ParamText(msg, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
+ Alert(rUserAlert, nil);
+ Quit();
+}
diff --git a/private/oleauto/sample/spoly2/makefile b/private/oleauto/sample/spoly2/makefile
new file mode 100644
index 000000000..dcb062a63
--- /dev/null
+++ b/private/oleauto/sample/spoly2/makefile
@@ -0,0 +1,342 @@
+##############################################################################
+#
+# (c) Copyright Microsoft Corp. 1992-1994 All Rights Reserved
+#
+# File:
+#
+# makefile - makefile for spoly2.exe
+#
+# Purpose:
+#
+# Builds the OLE 2.0 sample IDispatch server, spoly2.exe.
+#
+#
+# Usage:
+#
+# NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option:
+# dev = [win16 | win32 | mac] ; dev=win16 is the default
+# CPU = [i386 | M68K | MIPS | ALPHA | PPC]
+# DEBUG=[0|1] ; DEBUG=1 is the default
+#
+# Notes:
+#
+# This makefile assumes that the PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+##############################################################################
+
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if "$(dev)" == ""
+dev = win16
+!endif
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32" || "$(dev)" == "mac")
+!error Invalid dev option, choose from [win16 | win32 | mac]
+!endif
+
+!if "$(dev)" == "win16"
+TARGET = WIN16
+!endif
+
+!if "$(dev)" == "win32"
+TARGET = WIN32
+!endif
+
+!if "$(dev)" == "mac"
+TARGET = MAC
+!endif
+
+!if "$(DEBUG)" == ""
+DEBUG = 1
+!endif
+
+
+##########################################################################
+#
+# WIN16 Settings
+#
+!if "$(TARGET)" == "WIN16"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -dWIN16
+CFLAGS = -W3 -AM -GA -GEs -DWIN16
+LINKFLAGS = /NOD /NOI /BATCH /ONERROR:NOEXE
+
+LIBS = libw.lib mlibcew.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) /COD
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+LINKFLAGS = $(LINKFLAGS) /FAR /PACKC
+!endif
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARGET)" == "WIN32"
+
+!if "$(CPU)"==""
+
+!if "$(PROCESSOR_ARCHITECTURE)"=="" || "$(PROCESSOR_ARCHITECTURE)"=="x86"
+CPU=i386
+!else
+CPU=$(PROCESSOR_ARCHITECTURE)
+!endif
+
+!endif #CPU
+
+!if "$(CPU)" == "i386"
+CC = cl386
+LINK = link
+CFLAGS = -D_X86_=1
+!endif
+!if "$(CPU)" == "MIPS"
+CC = cl
+LINK = link
+CFLAGS = -D_MIPS_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "ALPHA"
+CC = claxp
+LINK = link
+CFLAGS = -D_ALPHA_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "PPC"
+CC = cl
+LINK = link
+CFLAGS = -D_PPC_=1 -DUNICODE
+!endif
+
+RCFLAGS = -dWIN32
+CFLAGS = $(CFLAGS) -nologo -W3 -DWIN32 -DINC_OLE2 -D_MT $(CL)
+LINKFLAGS = -Incremental:NO -Pdb:NONE -subsystem:windows -entry:WinMainCRTStartup -machine:$(CPU)
+
+LIBS = libc.lib kernel32.lib user32.lib gdi32.lib
+
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Z7 -D_DEBUG $(CL)
+LINKFLAGS = -debug:full -debugtype:cv,coff $(LINKFLAGS)
+!else
+CFLAGS = $(CFLAGS) -Ox
+!endif
+!endif
+
+
+##########################################################################
+#
+# MAC Settings
+#
+!if "$(TARGET)" == "MAC"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -d_MAC
+
+!if "$(CPU)"=="PPC"
+CFLAGS = -W3 -D_MAC -D_PPCMAC -D_pascal= -D__pascal=
+LINKFLAGS = -machine:mppc -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+LIBS = interfac.lib libc.lib ole2auto.lib ole2.lib
+!else
+CFLAGS = -W3 -AL -D_MAC
+LINKFLAGS = -machine:$(CPU) -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+LIBS = interfac.lib llibcs.lib lsanes.lib swap.lib
+!endif
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) -debug:full -debugtype:cv
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+!endif
+
+MRC = mrc
+
+!if "$(CPU)"=="PPC"
+MRCOPT = -D_PPCMAC -s$(VBATOOLS)\win32\ppc\lib
+!else
+MRCOPT =
+!endif
+
+MAKEPEF = makepef
+
+!endif
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+SRCDIR = $(OLEPROG)\SAMPLE\spoly2
+
+!if "$(TARGET)" == "MAC" && "$(CPU)"=="PPC"
+OBJDIR=$(SRCDIR)\macppc
+!else
+OBJDIR=$(SRCDIR)\$(TARGET)
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+!if "$(TARGET)" == "WIN16"
+LIBS = ole2.lib compobj.lib ole2disp.lib $(LIBS)
+!else
+!if "$(TARGET)" == "WIN32"
+LIBS = ole32.lib oleaut32.lib uuid.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "MAC"
+!if "$(CPU)" != "PPC"
+LIBS = olenrf.obj oanrf.obj $(LIBS)
+!endif
+!endif
+!endif
+
+OBJS = \
+!if "$(TARGET)" == "MAC"
+ $(OBJDIR)\macmain.obj \
+!else
+ $(OBJDIR)\winmain.obj \
+!endif
+ $(OBJDIR)\cpoly.obj \
+ $(OBJDIR)\cpoint.obj \
+ $(OBJDIR)\cenumpt.obj \
+!if "$(TARGET)" != "MAC"
+ $(OBJDIR)\statbar.obj \
+!endif
+ $(OBJDIR)\clsid.obj \
+ $(OBJDIR)\misc.obj \
+ $(OBJDIR)\tdata.obj
+
+goal : setflags $(OBJDIR)\spoly2.exe
+
+setflags :
+ set CL=$(CFLAGS)
+
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\spoly2.exe del $(OBJDIR)\spoly2.exe
+ if exist $(OBJDIR)\spoly2.map del $(OBJDIR)\spoly2.map
+ if exist $(OBJDIR)\spoly2.res del $(OBJDIR)\spoly2.res
+ if exist $(OBJDIR)\spoly2.rs del $(OBJDIR)\spoly2.rs
+ if exist $(SRCDIR)\*.pdb del $(SRCDIR)\*.pdb
+
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARGET)" == "WIN16"
+
+$(OBJDIR)\spoly2.exe : $(OBJS) $(SRCDIR)\spoly2.def $(OBJDIR)\spoly2.res $(SRCDIR)\spoly2.ico
+ link $(LINKFLAGS) @<<
+$(OBJS: =+^
+),
+$@,$(OBJDIR)\spoly2.map/map,
+$(LIBS),
+$(SRCDIR)\spoly2.def
+<<
+ rc -k -t $(OBJDIR)\spoly2.res $@
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARGET)" == "WIN32"
+
+$(OBJDIR)\spoly2.exe : $(OBJS) $(SRCDIR)\spoly2.def $(OBJDIR)\spoly2.res $(SRCDIR)\spoly2.ico
+ cvtres -r -$(CPU) $(OBJDIR)\spoly2.res -o $(OBJDIR)\spoly2.rs
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(OBJDIR)\spoly2.rs
+ $(LIBS)
+<<
+!endif
+
+
+##########################################################################
+#
+# Application Build (MAC Specific)
+#
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\spoly2.exe : $(OBJS) $(OBJDIR)\spoly2.x
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(LIBS)
+<<
+ copy $(OBJDIR)\spoly2.x $(OBJDIR)\spoly2
+!if "$(CPU)" == "PPC"
+ $(MAKEPEF) $(OBJDIR)\spoly2.exe $(OBJDIR)\spoly2.pef
+!else
+ cvpack $(OBJDIR)\spoly2.exe
+ $(MRC) $(MRCOPT) -e $(OBJDIR)\spoly2.exe -a -o $(OBJDIR)\spoly2
+!endif
+
+$(OBJDIR)\spoly2.x: $(SRCDIR)\spoly2.r
+ $(MRC) $(MRCOPT) -D_MAC -o $(OBJDIR)\spoly2.x $(SRCDIR)\spoly2.r
+!endif
+
+##########################################################################
+#
+# Application Build (Common)
+#
+$(OBJDIR)\spoly2.res : $(SRCDIR)\spoly2.rc $(SRCDIR)\resource.h
+ rc $(RCFLAGS) -r -fo$@ $(SRCDIR)\spoly2.rc
+
+
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\macmain.obj: $(SRCDIR)\macmain.cpp $(SRCDIR)\hostenv.h $(SRCDIR)\resource.h $(SRCDIR)\spoly.h $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\macmain.cpp
+!else
+$(OBJDIR)\winmain.obj: $(SRCDIR)\winmain.cpp $(SRCDIR)\hostenv.h $(SRCDIR)\resource.h $(SRCDIR)\spoly.h $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\winmain.cpp
+!endif
+
+$(OBJDIR)\cpoint.obj: $(SRCDIR)\cpoint.cpp $(SRCDIR)\cpoint.h $(SRCDIR)\hostenv.h $(SRCDIR)\spoly.h $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\cpoint.cpp
+
+$(OBJDIR)\cpoly.obj: $(SRCDIR)\cpoly.cpp $(SRCDIR)\cpoint.h $(SRCDIR)\cpoly.h $(SRCDIR)\hostenv.h $(SRCDIR)\spoly.h $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\cpoly.cpp
+
+$(OBJDIR)\clsid.obj: $(SRCDIR)\clsid.c $(SRCDIR)\clsid.h
+ $(CC) -c -Fo$@ $(SRCDIR)\clsid.c
+
+$(OBJDIR)\cenumpt.obj: $(SRCDIR)\cenumpt.cpp $(SRCDIR)\cenumpt.h
+ $(CC) -c -Fo$@ $(SRCDIR)\cenumpt.cpp
+
+!if "$(TARGET)" != "MAC"
+$(OBJDIR)\statbar.obj: $(SRCDIR)\statbar.cpp $(SRCDIR)\statbar.h
+ $(CC) -c -Fo$@ $(SRCDIR)\statbar.cpp
+!endif
+
+$(OBJDIR)\misc.obj: $(SRCDIR)\misc.cpp $(SRCDIR)\hostenv.h $(SRCDIR)\spoly.h
+ $(CC) -c -Fo$@ $(SRCDIR)\misc.cpp
+
+$(OBJDIR)\tdata.obj: $(SRCDIR)\tdata.cpp
+ $(CC) -c -Fo$@ $(SRCDIR)\tdata.cpp
diff --git a/private/oleauto/sample/spoly2/misc.cpp b/private/oleauto/sample/spoly2/misc.cpp
new file mode 100644
index 000000000..3b7c0ff69
--- /dev/null
+++ b/private/oleauto/sample/spoly2/misc.cpp
@@ -0,0 +1,215 @@
+/***
+*misc.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+
+#include <stdio.h>
+
+#ifdef _MAC
+# include <string.h>
+# include <ctype.h>
+#endif
+
+unsigned long g_dwPolyCF = 0;
+unsigned long g_dwPointCF = 0;
+
+IClassFactory FAR* g_ppolyCF = NULL;
+IClassFactory FAR* g_ppointCF = NULL;
+
+
+#ifdef _MAC
+struct regentry{
+ char *szKey;
+ char *szValue;
+} g_rgregentry[] = {
+
+ { "CLSID\\{00020464-0000-0000-C000-000000000046}",
+ "OLE Automation SPoly2 1.0 Application" }
+
+ , { "CLSID\\{00020464-0000-0000-C000-000000000046}\\LocalServer",
+ "SPL2" }
+
+ , { "CLSID\\{00020464-0000-0000-C000-000000000046}\\ProgID",
+ "SPoly2.Application" }
+
+ , { "CLSID\\{00020464-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "SPL2", "{00020464-0000-0000-C000-000000000046}" }
+
+ , { "SPoly2.Application\\CLSID",
+ "{00020464-0000-0000-C000-000000000046}" }
+
+};
+
+HRESULT
+EnsureRegistration()
+{
+ HKEY hkey;
+
+ if(RegOpenKey(HKEY_CLASSES_ROOT, "SPL2", &hkey) == NOERROR){
+ RegCloseKey(hkey);
+ return NOERROR;
+ }
+
+ for(int i = 0; i < DIM(g_rgregentry); ++i){
+ if(RegSetValue(HKEY_CLASSES_ROOT, g_rgregentry[i].szKey, REG_SZ, g_rgregentry[i].szValue, 0) != ERROR_SUCCESS)
+ return ResultFromScode(E_FAIL);
+ }
+
+ return NOERROR;
+}
+#endif
+
+/***
+*HRESULT InitOle(void)
+*Purpose:
+* Initialize Ole, and register our class factories.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDAPI
+InitOle()
+{
+ HRESULT hresult;
+
+ if((hresult = OleInitialize(NULL)) != NOERROR)
+ goto LError0;
+
+#ifdef _MAC
+ if((hresult = EnsureRegistration()) != NOERROR)
+ goto LError0;
+#endif
+
+ // Register the CPoint Class Factory
+ //
+ if((g_ppointCF = CPointCF::Create()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ hresult = CoRegisterClassObject(
+ CLSID_CPoint2,
+ g_ppointCF,
+ CLSCTX_LOCAL_SERVER,
+ REGCLS_MULTIPLEUSE,
+ &g_dwPointCF);
+ if(hresult != NOERROR)
+ goto LError1;
+
+ // Register the CPoly Class Factory.
+ //
+ if((g_ppolyCF = CPolyCF::Create()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ hresult = CoRegisterClassObject(
+ CLSID_CPoly2,
+ g_ppolyCF,
+ CLSCTX_LOCAL_SERVER,
+ REGCLS_MULTIPLEUSE,
+ &g_dwPolyCF);
+ if(hresult != NOERROR)
+ goto LError1;
+
+ g_ppolyCF->Release();
+
+ g_ppointCF->Release();
+
+ return NOERROR;
+
+
+LError1:;
+ if(g_ppolyCF != NULL)
+ g_ppolyCF->Release();
+
+ if(g_ppointCF != NULL)
+ g_ppointCF->Release();
+
+ UninitOle();
+
+LError0:;
+ return hresult;
+}
+
+STDAPI
+UninitOle()
+{
+ // Tell Ole to release our class factories.
+ //
+ if(g_dwPointCF != 0L)
+ CoRevokeClassObject(g_dwPointCF);
+
+ if(g_dwPolyCF != 0L)
+ CoRevokeClassObject(g_dwPolyCF);
+
+ OleUninitialize();
+
+ return NOERROR;
+}
+
+// disable unicode expansion for assertions
+#undef UNICODE
+
+void
+Assert(int fCond, char FAR* file, int line, char FAR* message)
+{
+ char * fmt;
+ char buf[128];
+
+ if(fCond)
+ return;
+
+ fmt = (message == NULL)
+ ? "Assertion failed: %s(%d)"
+ : "Assertion failed: %s(%d) '%s'";
+ sprintf(buf, fmt, file, line, message);
+
+#ifdef _MAC
+ DebugStr(c2pstr(buf));
+#else
+#ifdef WIN32
+ OutputDebugStringA(buf);
+#else //WIN32
+ OutputDebugString(buf);
+#endif //WIN32
+ DebugBreak();
+#endif
+}
+
+#ifdef _MAC
+#if defined(_MSC_VER)
+int pascal
+#else
+pascal int
+#endif
+stricmp(char *first, char *last)
+{
+ unsigned short f, l;
+
+ do{
+ f = tolower(*first++);
+ l = tolower(*last++);
+ }while(f && f == l);
+
+ return f - l;
+}
+#endif
+
diff --git a/private/oleauto/sample/spoly2/mk.bat b/private/oleauto/sample/spoly2/mk.bat
new file mode 100644
index 000000000..091192cd7
--- /dev/null
+++ b/private/oleauto/sample/spoly2/mk.bat
@@ -0,0 +1,19 @@
+REM setup the environment for the spoly2 makefile
+
+set OLDLIB=%LIB%
+set OLDPATH=%PATH%
+set OLDINC=%INCLUDE%
+
+set PATH=%TOOLS%\HDOS\BIN;%TOOLS%\HDOS\C800\BIN
+set LIB=%TOOLS%\HDOS\C800\LIB;%OLEPROG%\build\dispatch\DWIN16;%OLEPROG%\build\ole2nls\dwin16;%OLEPROG%\OLE\WIN16\D
+set INCLUDE=%TOOLS%\HDOS\C800\INCLUDE;%OLEPROG%\OLE\WIN16;%OLEPROG%\SRC\DISPATCH
+
+nmake %1 %2 %3 %4 %5
+
+set LIB=%OLDLIB%
+set PATH=%OLDPATH%
+set INCLUDE=%OLDINC%
+
+set OLDPATH=
+set OLDINC=
+set OLDLIB=
diff --git a/private/oleauto/sample/spoly2/mk.cmd b/private/oleauto/sample/spoly2/mk.cmd
new file mode 100644
index 000000000..cd22f7fed
--- /dev/null
+++ b/private/oleauto/sample/spoly2/mk.cmd
@@ -0,0 +1,13 @@
+REM The spoly2.exe makefile assumes that PATH, LIB, and include are setup.
+
+@setlocal
+
+REM we get rc.exe and winstub.exe from \tools\win
+
+set PATH=%TOOLS%\HOS2\BIN;%TOOLS%\HOS2\C700\BIN
+set INCLUDE=%TOOLS%\HOS2\C700\INCLUDE;%OLEPROG%\ole\dwin16;%OLEPROG%\src\dispatch
+set LIB=%TOOLS%\HOS2\C700\LIB;%OLEPROG%\ole\dwin16;%OLEPROG%\build\dwin16
+
+nmake %1 %2 %3 %4 %5
+
+@endlocal
diff --git a/private/oleauto/sample/spoly2/readme.txt b/private/oleauto/sample/spoly2/readme.txt
new file mode 100644
index 000000000..cf29f66e5
--- /dev/null
+++ b/private/oleauto/sample/spoly2/readme.txt
@@ -0,0 +1,62 @@
+-------------------------------------
+OLE Automation Sample Program: SPoly2
+-------------------------------------
+
+SPoly2 is a program which draws polygons. The only way to
+make spoly2 draw a polygon is to use its programmability
+interface.
+
+One OLE Automation object is exposed by spoly2:
+ * spoly2.application
+
+Spoly2.Application is the object associated with spoly2's main
+window. It controls drawing polygons and clearing the display.
+
+
+-----------------
+Program Structure
+-----------------
+SPoly2 implements IDispatch by using INTERFACEDATA, DispGetIDsOfNames
+and DispInvoke.
+
+
+
+------------------------------------
+Methods defined on spoly2.application
+------------------------------------
+
+
+Name Description
+------------------------------------------------------------------
+Draw() Draw the polygon.
+
+Reset() Delete all points from the polygon.
+
+AddPoint(X, Y) Add a point with coordinates (x,y)
+ to the polygon
+
+EnumPoints() as VT_ENUM Return a collection of the polygon's
+ points
+
+GetXOrigin() as short Get the X origin of the polygon.
+
+SetXOrigin(x as short) Set the X origin of the polygon.
+
+GetYOrigin() as short Get the Y origin of the polygon.
+
+SetYOrigin(y as short) Set the Y origin of the polygon.
+
+GetWidth() as short Get and the line width of the polygon.
+
+SetWidth(width as short) Set the line width of the polygon.
+
+
+
+---------------------------
+Shortcomings of this sample
+---------------------------
+1. Many items in this sample should be properties. Instead,
+they are implemented as methods. Anything which behaves like
+an attribute of the object should be a property.
+
+2. This is not a good example of how to implement a collection. \ No newline at end of file
diff --git a/private/oleauto/sample/spoly2/resource.h b/private/oleauto/sample/spoly2/resource.h
new file mode 100644
index 000000000..ebc4b78d1
--- /dev/null
+++ b/private/oleauto/sample/spoly2/resource.h
@@ -0,0 +1,50 @@
+/***
+*resource.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _MAC
+
+#define kMinSize 500 /* minimum size (in K) */
+#define kPrefSize 500 /* preferred size (in K) */
+
+#define rMenuBar 128 /* menu bar */
+#define rAboutAlert 128 /* about alert */
+#define rUserAlert 129 /* error alert */
+#define rWindow 128 /* application's window */
+
+#define mApple 128 /* Apple menu */
+#define iAbout 1
+
+#define mFile 129 /* File menu */
+#define iNew 1
+#define iClose 4
+#define iQuit 12
+
+#define mEdit 130 /* Edit menu */
+#define iUndo 1
+#define iCut 3
+#define iCopy 4
+#define iPaste 5
+#define iClear 6
+
+#define mSpoly 131
+#define iTest 1
+
+#define kMinHeap 21 * 1024
+#define kMinSpace 8 * 1024
+
+#else /* WIN16 || WIN32 */
+
+# define IDM_CLEAR 1
+# define IDM_DUMP 2
+# define IDM_FIRSTCHILD 100
+
+#endif
+
diff --git a/private/oleauto/sample/spoly2/spoly.h b/private/oleauto/sample/spoly2/spoly.h
new file mode 100644
index 000000000..c1c60567a
--- /dev/null
+++ b/private/oleauto/sample/spoly2/spoly.h
@@ -0,0 +1,71 @@
+/***
+*spoly.h - Application-wide definitions
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "hostenv.h"
+#include "resource.h"
+#include "clsid.h"
+
+#if defined(_MAC)
+# define STRSTR strstr
+#elif defined(WIN32)
+# include "statbar.h"
+# define STRSTR strstr
+#else /* WIN16 */
+# include "statbar.h"
+# define STRSTR _fstrstr
+#endif
+
+#ifdef _MAC
+# define UNUSED(X) ((void)(void*)&(X))
+#else
+# define UNUSED(X) (X)
+#endif
+
+#define DIM(X) (sizeof(X) / sizeof(X[0]))
+
+extern "C" void Assert(int, char FAR*, int, char FAR*);
+#define ASSERT(X) Assert(X, __FILE__, __LINE__, NULL)
+#define ASSERTSZ(X, MSG) Assert(X, __FILE__, __LINE__, MSG)
+
+#ifndef EXPORT
+# if defined(WIN32)
+# define EXPORT
+# elif defined(_MAC)
+# define EXPORT
+# else
+# define EXPORT __export
+# endif
+#endif
+
+#ifndef NEAR
+# if defined(WIN32)
+# define NEAR
+# elif defined(_MAC)
+# define NEAR
+# else
+# define NEAR __near
+# endif
+#endif
+
+#if defined(WIN32)
+# define CC_CALL CC_STDCALL
+# define METHODCALLTYPE __stdcall
+#elif defined(_MAC)
+# define CC_CALL CC_CDECL
+# define METHODCALLTYPE
+#else
+# define CC_CALL CC_PASCAL
+# define METHODCALLTYPE __pascal
+#endif
+
+STDAPI InitOle();
+STDAPI UninitOle();
+
diff --git a/private/oleauto/sample/spoly2/spoly2.def b/private/oleauto/sample/spoly2/spoly2.def
new file mode 100644
index 000000000..d34c3efdf
--- /dev/null
+++ b/private/oleauto/sample/spoly2/spoly2.def
@@ -0,0 +1,14 @@
+
+NAME SPOLY2
+
+DESCRIPTION 'IDispatch Polygon Test Server #2'
+
+EXETYPE WINDOWS
+
+STUB 'WINSTUB.EXE'
+
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MULTIPLE
+
+HEAPSIZE 4096
+STACKSIZE 8192
diff --git a/private/oleauto/sample/spoly2/spoly2.ico b/private/oleauto/sample/spoly2/spoly2.ico
new file mode 100644
index 000000000..27307a078
--- /dev/null
+++ b/private/oleauto/sample/spoly2/spoly2.ico
Binary files differ
diff --git a/private/oleauto/sample/spoly2/spoly2.r b/private/oleauto/sample/spoly2/spoly2.r
new file mode 100644
index 000000000..da787724d
--- /dev/null
+++ b/private/oleauto/sample/spoly2/spoly2.r
@@ -0,0 +1,298 @@
+/***
+*spoly2.r
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Resource script for spoly2.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _PPCMAC
+include "cfrg.rsc";
+#endif
+
+#include "types.r"
+#include "resource.h"
+
+/* we use an MBAR resource to conveniently load all the menus */
+
+resource 'MBAR' (rMenuBar, preload) {
+ {
+ mApple,
+ mFile,
+ mEdit,
+ mSpoly
+ }
+};
+
+
+resource 'MENU' (mApple, preload) {
+ mApple,
+ textMenuProc,
+ 0b11111111111111111111111111111101,
+ enabled,
+ apple,
+ {
+ "About Spoly2\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mFile, preload) {
+ mFile,
+ textMenuProc,
+ 0b00000000000000000000100000000000,
+ enabled,
+ "File",
+ {
+ "New",
+ noicon, "N", nomark, plain;
+ "Open",
+ noicon, "O", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Close",
+ noicon, "W", nomark, plain;
+ "Save",
+ noicon, "S", nomark, plain;
+ "Save As\311",
+ noicon, nokey, nomark, plain;
+ "Revert",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Page Setup\311",
+ noicon, nokey, nomark, plain;
+ "Print\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Quit",
+ noicon, "Q", nomark, plain
+ }
+};
+
+resource 'MENU' (mEdit, preload) {
+ mEdit,
+ textMenuProc,
+ 0b00000000000000000000000000000000,
+ enabled,
+ "Edit",
+ {
+ "Undo",
+ noicon, "Z", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Cut",
+ noicon, "X", nomark, plain;
+ "Copy",
+ noicon, "C", nomark, plain;
+ "Paste",
+ noicon, "V", nomark, plain;
+ "Clear",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mSpoly, preload) {
+ mSpoly,
+ textMenuProc,
+ 0b00000000000000000000000000000001,
+ enabled,
+ "Spoly",
+ {
+ "Test", noicon, nokey, nomark, plain
+ }
+};
+
+/* this ALRT and DITL are used as an About screen */
+
+resource 'ALRT' (rAboutAlert, purgeable) {
+ {40, 20, 160, 290},
+ rAboutAlert,
+ {
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+resource 'DITL' (rAboutAlert, purgeable) {
+ { /* array DITLarray: 5 elements */
+ /* [1] */
+ {88, 180, 108, 260},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {8, 8, 24, 214},
+ StaticText {
+ disabled,
+ "IDispatch Polygon Server"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an error screen */
+
+resource 'ALRT' (rUserAlert, purgeable) {
+ {40, 20, 120, 260},
+ rUserAlert,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+
+resource 'DITL' (rUserAlert, purgeable) {
+ {
+ /* [1] */
+ {50, 150, 70, 230},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 30, 230},
+ StaticText {
+ disabled,
+ "Error. ^0"
+ },
+ /* [3] */
+ {8, 8, 40, 40},
+ Icon {
+ disabled,
+ 2
+ }
+ }
+};
+
+
+resource 'WIND' (rWindow, preload, purgeable) {
+ {60, 40, 380, 500},
+ documentProc, visible, goAway, 0x0, "Spoly2"
+};
+
+
+resource 'SIZE' (-1) {
+ dontSaveScreen,
+ acceptSuspendResumeEvents,
+ enableOptionSwitch,
+ canBackground,
+ multiFinderAware,
+ backgroundAndForeground,
+ dontGetFrontClicks,
+ ignoreChildDiedEvents,
+ is32BitCompatible,
+ isHighLevelEventAware,
+ localAndRemoteHLEvents,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ kPrefSize * 1024,
+ kMinSize * 1024
+};
+
+resource 'BNDL' (134) {
+ 'SPL2',
+ 0,
+ { /* array TypeArray: 2 elements */
+ /* [1] */
+ 'FREF',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 134
+ },
+ /* [2] */
+ 'ICN#',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 134
+ }
+ }
+};
+
+data 'FREF' (134) {
+ $"4150 504C 0000 4E" /* APPL..N */
+};
+
+data 'ICN#' (134) {
+ $"000F FE00 001F FE00 0030 0600 0060 0600" /* ..þ...þ..0...`.. */
+ $"0060 0600 0060 0600 0060 7FF0 007F FFF0" /* .`...`...`.ð..ÿð */
+ $"007F FE30 0003 0030 0003 0030 0003 07FF" /* ..þ0...0...0...ÿ */
+ $"0003 0FFF 0003 FFF3 0003 FFF3 0000 3003" /* ...ÿ..ÿó..ÿó..0. */
+ $"0000 3003 0004 3003 0018 3FFF 0078 3FFF" /* ..0...0...?ÿ.x?ÿ */
+ $"01F0 0000 00F0 01E0 0060 0330 0120 0638" /* .ð...ð.à.`.0. .8 */
+ $"0600 0038 1E00 0070 7C00 00E0 3C00 03C0" /* ...8...p|..à<..À */
+ $"1800 0700 0800 07F8 0000 0000 0000 0000" /* .......ø........ */
+ $"000F FE00 001F FE00 003F FE00 007F FE00" /* ..þ...þ..?þ...þ. */
+ $"007F FE00 007F FE00 007F FFF0 007F FFF0" /* ..þ...þ...ÿð..ÿð */
+ $"007F FFF0 0003 FFF0 0003 FFF0 0003 FFFF" /* ..ÿð..ÿð..ÿð..ÿÿ */
+ $"0003 FFFF 0003 FFFF 0003 FFFF 0000 3FFF" /* ..ÿÿ..ÿÿ..ÿÿ..?ÿ */
+ $"0000 3FFF 0004 3FFF 0018 3FFF 0078 3FFF" /* ..?ÿ..?ÿ..?ÿ.x?ÿ */
+ $"01F0 0000 00F0 01E0 0060 0330 0120 0638" /* .ð...ð.à.`.0. .8 */
+ $"0600 0038 1E00 0070 7C00 00E0 3C00 03C0" /* ...8...p|..à<..À */
+ $"1800 0700 0800 07F8 0000 0000 0000 0000" /* .......ø........ */
+};
+
+data 'icl4' (133) {
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0666 6666 6666 0000 0000" /* .......fffff.... */
+ $"0000 0000 0000 6666 6666 6666 0000 0000" /* ......ffffff.... */
+ $"0000 0000 0006 6000 0000 0066 0000 0000" /* ......`....f.... */
+ $"0000 0000 0066 0000 0000 0066 0000 0000" /* .....f.....f.... */
+ $"0000 0000 0066 0000 0000 0066 0000 0000" /* .....f.....f.... */
+ $"0000 0000 0066 0000 0000 0066 0000 0000" /* .....f.....f.... */
+ $"0000 0000 0066 0000 0033 3333 3333 3000" /* .....f...333330. */
+ $"0000 0000 0066 6666 6333 3333 3333 3000" /* .....fffc333330. */
+ $"0000 0000 0066 6666 3366 6666 0003 3000" /* .....fff3fff..0. */
+ $"0000 0000 0000 0003 3000 0000 0003 3000" /* ........0.....0. */
+ $"0000 0000 0000 0003 3000 0000 0003 3000" /* ........0.....0. */
+ $"0000 0000 0000 0003 3000 0066 6666 6666" /* ........0..fffff */
+ $"0000 0000 0000 0003 3000 0666 6666 6666" /* ........0..fffff */
+ $"0000 0000 0000 0003 3333 6633 3333 3006" /* ........33f3330. */
+ $"0000 0000 0000 0003 3336 6333 3333 3006" /* ........36c3330. */
+ $"0000 0000 0000 0000 0006 6000 0000 0006" /* ..........`..... */
+ $"0000 0000 0000 0000 0006 6000 0000 0006" /* ..........`..... */
+ $"0000 0000 0000 0030 0006 6000 0000 0006" /* .......0..`..... */
+ $"0000 0000 0000 3300 0006 6666 6666 6666" /* ......3...ffffff */
+ $"0000 0000 0033 F300 0006 6666 6666 6666" /* .....3ó...ffffff */
+ $"0000 0000 333F 3000 0000 0000 0000 0000" /* ....3?0......... */
+ $"0000 0000 03F3 3000 0000 0000 0000 0000" /* .....ó0......... */
+ $"0000 0000 0033 0000 0000 0000 0000 0000" /* .....3.......... */
+ $"0000 0000 3003 0000 0000 0000 0000 0000" /* ....0........... */
+ $"0000 0033 0000 0000 0000 0000 0000 0000" /* ...3............ */
+ $"0000 33F3 0000 0000 0000 0000 0000 0000" /* ..3ó............ */
+ $"0033 3F30 0000 0000 0000 0000 0000 0000" /* .3?0............ */
+ $"0003 F330 0000 0000 0000 0000 0000 0000" /* ..ó0............ */
+ $"0000 3300 0000 0000 0000 0000 0000 0000" /* ..3............. */
+ $"0000 0300 0000 0000 0000 0000 0000 0000" /* ................ */
+ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
+};
+
+data 'SPL2' (0, "Owner resource") {
+ $"00" /* . */
+};
+
diff --git a/private/oleauto/sample/spoly2/spoly2.r32 b/private/oleauto/sample/spoly2/spoly2.r32
new file mode 100644
index 000000000..9f7e78a54
--- /dev/null
+++ b/private/oleauto/sample/spoly2/spoly2.r32
@@ -0,0 +1,26 @@
+REGEDIT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info SPoly2.Application (defaults to SPoly2.Application.1)
+
+HKEY_CLASSES_ROOT\SPoly2.Application = OLE Automation SPoly2 Application
+HKEY_CLASSES_ROOT\spoly2.Application\Clsid = {00020464-0000-0000-C000-000000000046}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; registration info SPoly2 1.0
+
+; (Application Object)
+HKEY_CLASSES_ROOT\SPoly2.Application.1 = OLE Automation SPoly2 1.0 Application
+HKEY_CLASSES_ROOT\SPoly2.Application.1\Clsid = {00020464-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\CLSID\{00020464-0000-0000-C000-000000000046} = OLE Automation Spoly2 1.0 Application
+HKEY_CLASSES_ROOT\CLSID\{00020464-0000-0000-C000-000000000046}\ProgID = SPoly2.Application
+HKEY_CLASSES_ROOT\CLSID\{00020464-0000-0000-C000-000000000046}\VersionIndependentProgID = SPoly2.Application
+HKEY_CLASSES_ROOT\CLSID\{00020464-0000-0000-C000-000000000046}\LocalServer32 = spoly2.exe /Automation
+
+
+HKEY_CLASSES_ROOT\CLSID\{00020465-0000-0000-C000-000000000046} = SPoly2.SPoint2
+HKEY_CLASSES_ROOT\CLSID\{00020465-0000-0000-C000-000000000046}\ProgID = SPoly2.Application.1
+HKEY_CLASSES_ROOT\CLSID\{00020465-0000-0000-C000-000000000046}\VersionIndependentProgID = SPoly.Application
+HKEY_CLASSES_ROOT\CLSID\{00020465-0000-0000-C000-000000000046}\LocalServer32 = spoly2.exe /Automation
diff --git a/private/oleauto/sample/spoly2/spoly2.rc b/private/oleauto/sample/spoly2/spoly2.rc
new file mode 100644
index 000000000..98e9daca8
--- /dev/null
+++ b/private/oleauto/sample/spoly2/spoly2.rc
@@ -0,0 +1,15 @@
+#define NOKERNEL
+#define NOGDI
+#define NOSOUND
+#define NOCOMM
+#define NODRIVERS
+#include "windows.h"
+#include "spoly.h"
+
+SPOLY ICON spoly2.ico
+
+SPolyMenu MENU
+BEGIN
+ MENUITEM "&Clear" IDM_CLEAR
+ MENUITEM "&Dump" IDM_DUMP
+END
diff --git a/private/oleauto/sample/spoly2/spoly2.reg b/private/oleauto/sample/spoly2/spoly2.reg
new file mode 100644
index 000000000..fdc7f79a8
--- /dev/null
+++ b/private/oleauto/sample/spoly2/spoly2.reg
@@ -0,0 +1,20 @@
+REGEDIT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; registration info SPoly2.Application (defaults to SPoly2.Application.1)
+
+HKEY_CLASSES_ROOT\SPoly2.Application = OLE Automation SPoly2 Application
+HKEY_CLASSES_ROOT\spoly2.Application\Clsid = {00020464-0000-0000-C000-000000000046}
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; registration info SPoly2 1.0
+
+; (Application Object)
+HKEY_CLASSES_ROOT\SPoly2.Application.1 = OLE Automation SPoly2 1.0 Application
+HKEY_CLASSES_ROOT\SPoly2.Application.1\Clsid = {00020464-0000-0000-C000-000000000046}
+
+HKEY_CLASSES_ROOT\CLSID\{00020464-0000-0000-C000-000000000046} = OLE Automation Spoly2 1.0 Application
+HKEY_CLASSES_ROOT\CLSID\{00020464-0000-0000-C000-000000000046}\ProgID = SPoly2.Application
+HKEY_CLASSES_ROOT\CLSID\{00020464-0000-0000-C000-000000000046}\VersionIndependentProgID = SPoly2.Application
+HKEY_CLASSES_ROOT\CLSID\{00020464-0000-0000-C000-000000000046}\LocalServer = spoly2.exe /Automation
diff --git a/private/oleauto/sample/spoly2/statbar.cpp b/private/oleauto/sample/spoly2/statbar.cpp
new file mode 100644
index 000000000..01feae48c
--- /dev/null
+++ b/private/oleauto/sample/spoly2/statbar.cpp
@@ -0,0 +1,368 @@
+/***
+*statbar.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdarg.h>
+
+#include "hostenv.h"
+#include "statbar.h"
+
+
+extern "C" long FAR PASCAL StatBarWndProc(HWND, unsigned int, WPARAM, LPARAM);
+
+
+TCHAR FAR* CStatBar::m_szWndClass = TSTR("StatBarWndClass");
+
+
+CStatBar::CStatBar()
+{
+ m_refs = 0;
+
+ m_x = 0;
+ m_y = 0;
+ m_width = 0;
+ m_height = 0;
+
+ m_bstrMsg = NULL;
+
+ m_hfont = (HFONT)0;
+}
+
+CStatBar::~CStatBar()
+{
+ SysFreeString(m_bstrMsg);
+}
+
+
+/***
+*PUBLIC CStatBar FAR* CStatBar::Create(HINSTANCE, HWND)
+*
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+CStatBar FAR*
+CStatBar::Create(HINSTANCE hinst, HWND hwndFrame)
+{
+ CStatBar FAR* psb;
+
+ psb = new FAR CStatBar();
+ if(psb == NULL)
+ return NULL;
+ psb->AddRef();
+
+ if(!psb->Register(hinst))
+ goto LFail;
+
+ psb->m_hwnd = CreateWindow(
+ CStatBar::m_szWndClass,
+ NULL,
+ WS_CHILD | WS_CLIPSIBLINGS,
+ 0, 0, 0, 0,
+ hwndFrame,
+ 0,
+ hinst,
+ NULL);
+
+ if(!psb->m_hwnd)
+ goto LFail;
+
+ // Stash the newly created CStatBar* in the extra bytes of the
+ // associated window so we can get at the instance in the message
+ // proc.
+ //
+ // Note: we do not AddRef for this reference. We make sure that the
+ // window is destroyed when the refcnt goes to 0.
+ //
+ SetWindowLong(psb->m_hwnd, 0, (long)psb);
+
+ return psb;
+
+LFail:;
+ delete psb;
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CStatBar::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid,IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ *ppv = (void FAR*)NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStatBar::AddRef(void)
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStatBar::Release(void)
+{
+ if(--m_refs == 0){
+
+ // destroy the status bar window.
+ //
+ SendMessage(m_hwnd, WM_DESTROY, 0, 0L);
+
+ delete this;
+ return 0;
+ }
+
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// Introduced Methods
+//---------------------------------------------------------------------
+
+
+/***
+*PRIVATE BOOL CStatBar::Register(HINSTANCE)
+*
+*Purpose:
+* Register the status bar window class.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = BOOL, TRUE if successful, FALSE if not.
+*
+***********************************************************************/
+BOOL
+CStatBar::Register(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ // register the class, unless already registered.
+ if(GetClassInfo(hinst, m_szWndClass, &wc) == 0){
+ wc.style = 0;
+ wc.lpfnWndProc = StatBarWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = sizeof(CStatBar FAR*);
+ wc.hInstance = hinst;
+ wc.hIcon = 0;
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
+ wc.lpszMenuName = 0;
+ wc.lpszClassName = CStatBar::m_szWndClass;
+ if(!RegisterClass(&wc))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/***
+*PUBLIC void CStatBar::Show(void)
+*
+*Purpose:
+* Show the status bar window associated with this CStatBar instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CStatBar::Show()
+{
+ ShowWindow(m_hwnd, SW_SHOW);
+}
+
+void
+CStatBar::SetFont(HFONT hfont)
+{
+ HDC hdc;
+ TEXTMETRIC tm;
+ HFONT hfontOld;
+
+ // compute the character sizes given this new font.
+ //
+ hdc = GetDC(m_hwnd);
+ hfontOld = (HFONT)SelectObject(hdc, hfont);
+ GetTextMetrics(hdc, &tm);
+ m_dxFont = tm.tmAveCharWidth;
+ m_dyFont = tm.tmHeight + tm.tmExternalLeading;
+ SelectObject(hdc, hfontOld);
+ ReleaseDC(m_hwnd, hdc);
+
+ m_hfont = hfont;
+}
+
+/***
+*PRIVATE CStatBar::WMPaint(void)
+*
+*Purpose:
+* This method is responsible for drawing the status bar, and is called
+* in response to a WM_PAINT message.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CStatBar::WMPaint()
+{
+ HDC hdc;
+ RECT rcMsg;
+ HRGN hrgn;
+ HFONT hfontOld;
+ PAINTSTRUCT ps;
+ HPEN hpenBlack, hpenWhite, hpenGray, hpenOld;
+
+ hdc = BeginPaint(m_hwnd, &ps);
+
+ // compute the message box rect
+ //
+ rcMsg.top = 3;
+ rcMsg.bottom= m_height - 3;
+ rcMsg.left = m_dxFont;
+ rcMsg.right = m_width - m_dxFont;
+
+ // prepare the pens
+ //
+ hpenWhite = (HPEN)GetStockObject(WHITE_PEN);
+ hpenBlack = (HPEN)GetStockObject(BLACK_PEN);
+ hpenGray = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
+
+ // draw a top gray line
+ //
+ hpenOld = (HPEN)SelectObject(hdc, hpenGray);
+#if defined(WIN16)
+ MoveTo(hdc, ps.rcPaint.left, 0);
+#elif defined(WIN32)
+ MoveToEx(hdc, ps.rcPaint.left, 0, NULL);
+#endif
+ LineTo(hdc, ps.rcPaint.right, 0);
+
+ // draw a white line just under
+ //
+ SelectObject(hdc, hpenWhite);
+#if defined(WIN16)
+ MoveTo(hdc, ps.rcPaint.left, 1);
+#elif defined(WIN32)
+ MoveToEx(hdc, ps.rcPaint.left, 1, NULL);
+#endif
+ LineTo(hdc, ps.rcPaint.right, 1);
+
+ // do not overwrite the background color
+ //
+ SetBkMode(hdc, TRANSPARENT);
+
+ // message area
+ //
+ SelectObject(hdc, hpenBlack);
+#if defined(WIN16)
+ MoveTo(hdc, rcMsg.left, rcMsg.bottom);
+#elif defined(WIN32)
+ MoveToEx(hdc, rcMsg.left, rcMsg.bottom, NULL);
+#endif
+ LineTo(hdc, rcMsg.left, rcMsg.top);
+ LineTo(hdc, rcMsg.right, rcMsg.top);
+
+ SelectObject(hdc, hpenWhite);
+ LineTo(hdc, rcMsg.right, rcMsg.bottom);
+ LineTo(hdc, rcMsg.left, rcMsg.bottom);
+
+ // select the black pen for writing
+ //
+ SelectObject(hdc, hpenBlack);
+
+ // select the status bar font to write in
+ //
+ hfontOld = (HFONT)SelectObject(hdc, m_hfont);
+
+ // set the clipping region
+ //
+ hrgn = CreateRectRgn(
+ rcMsg.left, rcMsg.top, rcMsg.right, rcMsg.bottom);
+
+ SelectClipRgn(hdc, hrgn);
+
+ // draw the status message
+ //
+ TextOut(
+ hdc,
+ rcMsg.left + (m_dxFont / 2),
+ rcMsg.top + ((rcMsg.bottom - rcMsg.top - m_dyFont) / 2),
+ STRING(m_bstrMsg), (SysStringLen(m_bstrMsg)));
+
+ // cleanup
+ //
+ SelectObject(hdc, hpenOld);
+ SelectObject(hdc, hfontOld);
+
+ DeleteObject(hrgn);
+ DeleteObject(hpenGray);
+
+ EndPaint(m_hwnd, &ps);
+}
+
+extern "C" long FAR PASCAL
+StatBarWndProc(
+ HWND hwnd,
+ unsigned int message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ CStatBar FAR* psb;
+
+ switch(message){
+ case WM_SIZE:
+ return 0;
+ case WM_PAINT:
+ psb = (CStatBar FAR*)GetWindowLong(hwnd, 0);
+ psb->WMPaint();
+ return 0;
+ }
+ return(DefWindowProc(hwnd, message, wParam, lParam));
+}
+
+
+//---------------------------------------------------------------------
+// Status Bar Utilities
+//---------------------------------------------------------------------
+
+extern "C" void
+SBprintf(CStatBar FAR* psb, TCHAR FAR* szFmt, ...)
+{
+ va_list args;
+static TCHAR buf[256];
+
+ va_start(args, szFmt);
+ wvsprintf(buf, szFmt, args);
+ psb->SetText(WIDESTRING(buf));
+ psb->Update();
+}
diff --git a/private/oleauto/sample/spoly2/statbar.h b/private/oleauto/sample/spoly2/statbar.h
new file mode 100644
index 000000000..52523081e
--- /dev/null
+++ b/private/oleauto/sample/spoly2/statbar.h
@@ -0,0 +1,142 @@
+/***
+*statbar.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Implementation Notes:
+* This file requires windows.h and ole2.h
+*
+*****************************************************************************/
+
+class CStatBar : public IUnknown {
+public:
+ static CStatBar FAR* Create(HINSTANCE hinst, HWND hwndFrame);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // Introduced methods
+ //
+ void Show(void);
+ inline void Move(void);
+ inline void Update(void);
+
+ inline int GetX(void);
+ inline void SetX(int x);
+
+ inline int GetY(void);
+ inline void SetY(int y);
+
+ inline int GetHeight(void);
+ inline void SetHeight(int height);
+
+ inline int GetWidth(void);
+ inline void SetWidth(int width);
+
+ //inline HFONT GetFont(void);
+ void SetFont(HFONT hfont);
+
+ //char FAR* GetText(void);
+ inline void SetText(OLECHAR FAR* sz);
+
+ void WMPaint(void);
+ BOOL Register(HINSTANCE);
+
+private:
+ CStatBar();
+ ~CStatBar();
+
+ unsigned long m_refs;
+
+ HWND m_hwnd; // the status bar window handle
+
+ int m_x; // x coordinate of upper left corner
+ int m_y; // y coordinate of upper left corner
+ int m_height;
+ int m_width;
+
+ HFONT m_hfont;
+ int m_dyFont; // font height
+ int m_dxFont; // font width
+
+ BSTR m_bstrMsg; // the status bar text
+
+ static TCHAR FAR* m_szWndClass;
+};
+
+inline void
+CStatBar::Move()
+{
+ MoveWindow(m_hwnd, m_x, m_y, m_width, m_height, TRUE);
+}
+
+inline void
+CStatBar::Update()
+{
+ InvalidateRect(m_hwnd, NULL, TRUE);
+ UpdateWindow(m_hwnd);
+}
+
+inline int
+CStatBar::GetX()
+{
+ return m_x;
+}
+
+inline void
+CStatBar::SetX(int x)
+{
+ m_x = x;
+}
+
+inline int
+CStatBar::GetY(void)
+{
+ return m_y;
+}
+
+inline void
+CStatBar::SetY(int y)
+{
+ m_y = y;
+}
+
+inline int
+CStatBar::GetHeight(void)
+{
+ return m_height;
+}
+
+inline void
+CStatBar::SetHeight(int height)
+{
+ m_height = height;
+}
+
+inline int
+CStatBar::GetWidth(void)
+{
+ return m_width;
+}
+
+inline void
+CStatBar::SetWidth(int width)
+{
+ m_width = width;
+}
+
+inline void
+CStatBar::SetText(OLECHAR FAR* sz)
+{
+ SysFreeString(m_bstrMsg);
+ m_bstrMsg = SysAllocString(sz);
+}
+
+extern "C" void
+SBprintf(CStatBar FAR* psb, TCHAR FAR* szFmt, ...);
diff --git a/private/oleauto/sample/spoly2/tdata.cpp b/private/oleauto/sample/spoly2/tdata.cpp
new file mode 100644
index 000000000..5bb5394c7
--- /dev/null
+++ b/private/oleauto/sample/spoly2/tdata.cpp
@@ -0,0 +1,344 @@
+/***
+*tdata.cpp
+*
+* Copyright (C) 1991-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* CPoly and CPoint type data descriptions.
+*
+* These data descriptions are used to construct TypeInfos for these
+* objects at runtime.
+*
+*****************************************************************************/
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+
+
+//---------------------------------------------------------------------
+// CPoint type data definitions
+//---------------------------------------------------------------------
+
+
+static PARAMDATA NEAR rgpdataCPointSetX[] =
+{
+ { OLESTR("X"), VT_I2 }
+};
+
+static PARAMDATA NEAR rgpdataCPointSetY[] =
+{
+ { OLESTR("Y"), VT_I2 }
+};
+
+static METHODDATA NEAR rgmdataCPoint[] =
+{
+ // CPoint::GetX()
+ {
+ OLESTR("GetX"),
+ NULL,
+ IDMEMBER_CPOINT_GETX,
+ IMETH_CPOINT_GETX,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_I2
+ },
+
+ // CPoint::SetX()
+ {
+ OLESTR("SetX"),
+ rgpdataCPointSetX,
+ IDMEMBER_CPOINT_SETX,
+ IMETH_CPOINT_SETX,
+ CC_CALL,
+ DIM(rgpdataCPointSetX),
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // CPoint::GetY()
+ {
+ OLESTR("GetY"),
+ NULL,
+ IDMEMBER_CPOINT_GETY,
+ IMETH_CPOINT_GETY,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_I2
+ },
+
+ // CPoint::SetY()
+ {
+ OLESTR("SetY"),
+ rgpdataCPointSetY,
+ IDMEMBER_CPOINT_SETY,
+ IMETH_CPOINT_SETY,
+ CC_CALL,
+ DIM(rgpdataCPointSetY),
+ DISPATCH_METHOD,
+ VT_EMPTY
+ }
+};
+
+INTERFACEDATA NEAR g_idataCPoint =
+{
+ rgmdataCPoint, DIM(rgmdataCPoint)
+};
+
+
+//---------------------------------------------------------------------
+// CPoly type data definitions
+//---------------------------------------------------------------------
+
+
+static PARAMDATA NEAR rgpdataCPolyAddPoint[] =
+{
+ { OLESTR("x"), VT_I2 },
+ { OLESTR("y"), VT_I2 }
+};
+
+static PARAMDATA NEAR rgpdataCPolySetXOrigin[] =
+{
+ { OLESTR("x"), VT_I2 }
+};
+
+static PARAMDATA NEAR rgpdataCPolySetYOrigin[] =
+{
+ { OLESTR("y"), VT_I2 }
+};
+
+static PARAMDATA NEAR rgpdataCPolySetWidth[] =
+{
+ { OLESTR("width"), VT_I2 }
+};
+
+static PARAMDATA NEAR rgpdataCPolySetRed[] =
+{
+ { OLESTR("red"), VT_I2 }
+};
+
+static PARAMDATA NEAR rgpdataCPolySetGreen[] =
+{
+ { OLESTR("green"), VT_I2 }
+};
+
+static PARAMDATA NEAR rgpdataCPolySetBlue[] =
+{
+ { OLESTR("blue"), VT_I2 }
+};
+
+static METHODDATA NEAR rgmdataCPoly[] =
+{
+ // void CPoly::Draw(void)
+ {
+ OLESTR("Draw"),
+ NULL,
+ IDMEMBER_CPOLY_DRAW,
+ IMETH_CPOLY_DRAW,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // void CPoly::Reset(void)
+ {
+ OLESTR("Reset"),
+ NULL,
+ IDMEMBER_CPOLY_RESET,
+ IMETH_CPOLY_RESET,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // HRESULT CPoly::AddPoint(short x, short y)
+ {
+ OLESTR("AddPoint"),
+ rgpdataCPolyAddPoint,
+ IDMEMBER_CPOLY_ADDPOINT,
+ IMETH_CPOLY_ADDPOINT,
+ CC_CALL,
+ DIM(rgpdataCPolyAddPoint),
+ DISPATCH_METHOD,
+ VT_ERROR
+ },
+
+ // IUnknown FAR* CPoly::EnumPoints(void)
+ {
+ OLESTR("EnumPoints"),
+ NULL,
+ IDMEMBER_CPOLY_ENUMPOINTS,
+ IMETH_CPOLY_ENUMPOINTS,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_UNKNOWN
+ },
+
+ // short CPoly::GetXOrigin(void)
+ {
+ OLESTR("GetXOrigin"),
+ NULL,
+ IDMEMBER_CPOLY_GETXORIGIN,
+ IMETH_CPOLY_GETXORIGIN,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_I2
+ },
+
+ // void CPoly::SetXOrigin(short x)
+ {
+ OLESTR("SetXOrigin"),
+ rgpdataCPolySetXOrigin,
+ IDMEMBER_CPOLY_SETXORIGIN,
+ IMETH_CPOLY_SETXORIGIN,
+ CC_CALL,
+ DIM(rgpdataCPolySetXOrigin),
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // short CPoly::GetYOrigin(void)
+ {
+ OLESTR("GetYOrigin"),
+ NULL,
+ IDMEMBER_CPOLY_GETYORIGIN,
+ IMETH_CPOLY_GETYORIGIN,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_I2
+ },
+
+ // void CPoly::SetYOrigin(short y)
+ {
+ OLESTR("SetYOrigin"),
+ rgpdataCPolySetYOrigin,
+ IDMEMBER_CPOLY_SETYORIGIN,
+ IMETH_CPOLY_SETYORIGIN,
+ CC_CALL,
+ DIM(rgpdataCPolySetYOrigin),
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // short CPoly::GetWidth(void)
+ {
+ OLESTR("GetWidth"),
+ NULL,
+ IDMEMBER_CPOLY_GETWIDTH,
+ IMETH_CPOLY_GETWIDTH,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_I2
+ },
+
+ // void CPoly::SetWidth(short width)
+ {
+ OLESTR("SetWidth"),
+ rgpdataCPolySetWidth,
+ IDMEMBER_CPOLY_SETWIDTH,
+ IMETH_CPOLY_SETWIDTH,
+ CC_CALL,
+ DIM(rgpdataCPolySetWidth),
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // short CPoly::get_red(void)
+ {
+ OLESTR("get_red"),
+ NULL,
+ IDMEMBER_CPOLY_GETRED,
+ IMETH_CPOLY_GETRED,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_I2
+ },
+
+ // void CPoly::set_red(short red)
+ {
+ OLESTR("set_red"),
+ rgpdataCPolySetRed,
+ IDMEMBER_CPOLY_SETRED,
+ IMETH_CPOLY_SETRED,
+ CC_CALL,
+ DIM(rgpdataCPolySetRed),
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // short CPoly::get_green(void)
+ {
+ OLESTR("get_green"),
+ NULL,
+ IDMEMBER_CPOLY_GETGREEN,
+ IMETH_CPOLY_GETGREEN,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_I2
+ },
+
+ // void CPoly::set_green(short green)
+ {
+ OLESTR("set_green"),
+ rgpdataCPolySetGreen,
+ IDMEMBER_CPOLY_SETGREEN,
+ IMETH_CPOLY_SETGREEN,
+ CC_CALL,
+ DIM(rgpdataCPolySetGreen),
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // short CPoly::get_blue(void)
+ {
+ OLESTR("get_blue"),
+ NULL,
+ IDMEMBER_CPOLY_GETBLUE,
+ IMETH_CPOLY_GETBLUE,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_I2
+ },
+
+ // void CPoly::set_blue(short blue)
+ {
+ OLESTR("set_blue"),
+ rgpdataCPolySetBlue,
+ IDMEMBER_CPOLY_SETBLUE,
+ IMETH_CPOLY_SETBLUE,
+ CC_CALL,
+ DIM(rgpdataCPolySetBlue),
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+ // void CPoly::Dump(void)
+ {
+ OLESTR("Dump"),
+ NULL,
+ IDMEMBER_CPOLY_DUMP,
+ IMETH_CPOLY_DUMP,
+ CC_CALL,
+ 0,
+ DISPATCH_METHOD,
+ VT_EMPTY
+ },
+
+};
+
+INTERFACEDATA NEAR g_idataCPoly =
+{
+ rgmdataCPoly, DIM(rgmdataCPoly)
+};
diff --git a/private/oleauto/sample/spoly2/winmain.cpp b/private/oleauto/sample/spoly2/winmain.cpp
new file mode 100644
index 000000000..c3c8b9a78
--- /dev/null
+++ b/private/oleauto/sample/spoly2/winmain.cpp
@@ -0,0 +1,293 @@
+/***
+*winmain.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module is the main entry point for the sample IDispatch polygon
+* server, spoly2.exe.
+*
+* This program is intended to demonstrate an implementation of the IDispatch
+* interface. Spoly2 is a very simple app, that implements two simple objects,
+* CPoly and CPoint and exposes their properties and methods for programatic
+* and cross-process access via IDispatch.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "spoly.h"
+#include "cpoint.h"
+#include "cpoly.h"
+
+
+HINSTANCE g_hinst = 0;
+
+HWND g_hwndFrame = 0;
+HWND g_hwndClient = 0;
+
+TCHAR g_szFrameWndClass[] = TSTR("FrameWClass");
+
+CStatBar FAR* g_psb = NULL;
+
+
+BOOL InitApplication(HINSTANCE);
+BOOL InitInstance(HINSTANCE, int);
+
+extern "C" int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+extern "C" long FAR PASCAL FrameWndProc(HWND, UINT, WPARAM, LPARAM);
+
+
+extern "C" int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+ int retval;
+ HRESULT hresult;
+
+ if(!hPrevInstance)
+ if(!InitApplication(hinst))
+ return FALSE;
+
+ if((hresult = InitOle()) != NOERROR)
+ return FALSE;
+
+ if(!InitInstance(hinst, nCmdShow)){
+ retval = FALSE;
+ goto LExit;
+ }
+
+ while(GetMessage(&msg, NULL, NULL, NULL)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ g_psb->Release();
+ CPoly::PolyTerm();
+
+ retval = msg.wParam;
+
+LExit:;
+ UninitOle();
+
+ return retval;
+}
+
+
+BOOL
+InitApplication(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = FrameWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(hinst, TSTR("SPOLY"));
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1);
+ wc.lpszMenuName = TSTR("SPolyMenu");
+ wc.lpszClassName = g_szFrameWndClass;
+
+ if(!RegisterClass(&wc))
+ return FALSE;
+
+ return TRUE;
+}
+
+#ifdef WIN32
+#define szAppTitle TSTR("IDispatch Polygon Server #2 (32-bit)")
+#else //WIN32
+#define szAppTitle TSTR("IDispatch Polygon Server #2")
+#endif //WIN32
+
+BOOL
+InitInstance(HINSTANCE hinst, int nCmdShow)
+{
+ g_hinst = hinst;
+
+ // Create a main frame window
+ //
+ g_hwndFrame = CreateWindow(
+ g_szFrameWndClass,
+ szAppTitle,
+ WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ NULL,
+ NULL,
+ hinst,
+ NULL);
+ if(!g_hwndFrame)
+ return FALSE;
+
+ g_hwndClient = GetWindow(g_hwndFrame, GW_CHILD);
+ if(!g_hwndClient)
+ return FALSE;
+
+ // create the status bar
+ //
+ g_psb = CStatBar::Create(g_hinst, g_hwndFrame);
+ if(!g_psb)
+ return FALSE;
+
+ // initialize and show the status bar
+ //
+ g_psb->SetHeight(GetSystemMetrics(SM_CYCAPTION) - 1);
+ g_psb->SetFont((HFONT)GetStockObject(SYSTEM_FONT));
+ g_psb->SetText(OLESTR(""));
+ g_psb->Show();
+
+ ShowWindow(g_hwndFrame, nCmdShow);
+
+ UpdateWindow(g_hwndFrame);
+
+ return TRUE;
+}
+
+
+void
+FrameWndOnCreate(HWND hwnd)
+{
+ CLIENTCREATESTRUCT ccs;
+
+ ccs.hWindowMenu = NULL;
+ ccs.idFirstChild = IDM_FIRSTCHILD;
+
+ g_hwndClient = CreateWindow(
+ TSTR("MDICLIENT"),
+ 0,
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+ 0, 0, 0, 0,
+ hwnd,
+ (HMENU) 1,
+ g_hinst,
+ &ccs);
+}
+
+
+void
+FrameWndOnSize(HWND hwnd)
+{
+ RECT rc;
+ int height;
+
+ // Get the client rectangle for the frame window
+ GetClientRect(hwnd, &rc);
+
+ height = g_psb->GetHeight();
+
+ // adjust the client win to make room for the status bar.
+ //
+ MoveWindow(
+ g_hwndClient,
+ rc.left,
+ rc.top,
+ rc.right - rc.left,
+ rc.bottom - rc.top - height,
+ TRUE);
+
+ // move the status bar to the bottom of the newly positioned window.
+ //
+ g_psb->SetX(rc.left);
+ g_psb->SetY(rc.bottom - height),
+ g_psb->SetWidth(rc.right - rc.left);
+ g_psb->Move();
+}
+
+
+extern "C" long FAR PASCAL
+FrameWndProc(
+ HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch(message){
+ case WM_COMMAND:
+ switch(wParam){
+ case IDM_DUMP:
+ CPoly::PolyDump();
+ return 0;
+
+ case IDM_CLEAR:
+ InvalidateRect(g_hwndClient, NULL, TRUE);
+ return 0;
+ }
+ break;
+
+ case WM_CREATE:
+ FrameWndOnCreate(hwnd);
+ break;
+
+ case WM_SIZE:
+ FrameWndOnSize(hwnd);
+ return 1;
+
+ case WM_PAINT:
+ CPoly::PolyDraw();
+ break;
+
+ case WM_CLOSE:
+ DestroyWindow(hwnd);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefFrameProc(hwnd, g_hwndClient, message, wParam, lParam);
+}
+
+
+#if defined(WIN32)
+
+extern "C" OLECHAR FAR*
+ConvertStrAtoW(char FAR* strIn, OLECHAR FAR* buf, UINT size)
+{
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ strIn, -1, buf, size) ;
+ return buf;
+}
+
+extern "C" OLECHAR FAR*
+WideString(char FAR* strIn)
+{
+ static OLECHAR buf[256];
+
+ return (ConvertStrAtoW(strIn, buf, 256));
+}
+
+extern "C" char FAR*
+ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size)
+{
+ int badConversion = FALSE;
+
+ WideCharToMultiByte(CP_ACP, NULL,
+ strIn, -1,
+ buf, size,
+ NULL, &badConversion);
+ return buf;
+}
+
+extern "C" char FAR*
+AnsiString(OLECHAR FAR* strIn)
+{
+ static char buf[256];
+
+ return (ConvertStrWtoA(strIn, buf, 256));
+}
+
+#endif
+
diff --git a/private/oleauto/sample/tibrowse/makefile b/private/oleauto/sample/tibrowse/makefile
new file mode 100644
index 000000000..213a5a023
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/makefile
@@ -0,0 +1,323 @@
+####
+#makefile - makefile for tibrowse.exe
+#
+# Copyright (C) 1992-1994, Microsoft Corporation
+#
+#Purpose:
+# Builds the OLE 2.0 sample IDispatch server, tibrowse.exe.
+#
+#
+# Usage: NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option:
+# dev = [win16 | win32 | mac] ; dev=win16 is the default
+# CPU = [i386 | M68K | MIPS | ALPHA | PPC]
+# DEBUG=[0|1] ; DEBUG=1 is the default
+#
+#Notes:
+# This makefile assumes that the PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+##############################################################################
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if "$(dev)" == ""
+dev = win16
+!endif
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32" || "$(dev)" == "mac")
+!error Invalid dev option, choose from [win16 | win32 | mac]
+!endif
+
+!if "$(dev)" == "win16"
+TARGET = WIN16
+!endif
+
+!if "$(dev)" == "win32"
+TARGET = WIN32
+!endif
+
+!if "$(dev)" == "mac"
+TARGET = MAC
+!endif
+
+!if "$(DEBUG)" == ""
+DEBUG = 1
+!endif
+
+
+##########################################################################
+#
+# WIN16 Settings
+#
+!if "$(TARGET)" == "WIN16"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -dWIN16
+CFLAGS = -W3 -AM -GA -GEs -DWIN16
+LINKFLAGS = /NOD /NOI /BATCH /ONERROR:NOEXE
+
+LIBS = libw.lib mlibcew.lib
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) /COD
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+LINKFLAGS = $(LINKFLAGS) /FAR /PACKC
+!endif
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARGET)" == "WIN32"
+
+!if "$(CPU)"==""
+
+!if "$(PROCESSOR_ARCHITECTURE)"=="" || "$(PROCESSOR_ARCHITECTURE)"=="x86"
+CPU=i386
+!else
+CPU=$(PROCESSOR_ARCHITECTURE)
+!endif
+
+!endif #CPU
+
+!if "$(CPU)" == "i386"
+CC = cl386
+LINK = link
+CFLAGS = -D_X86_=1
+!endif
+!if "$(CPU)" == "MIPS"
+CC = cl
+LINK = link
+CFLAGS = -D_MIPS_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "ALPHA"
+CC = claxp
+LINK = link
+CFLAGS = -D_ALPHA_=1 -DUNICODE
+!endif
+!if "$(CPU)" == "PPC"
+CC = cl
+LINK = link
+CFLAGS = -D_PPC_=1 -DUNICODE
+!endif
+
+RCFLAGS = -dWIN32
+CFLAGS = $(CFLAGS) -nologo -W3 -DWIN32 -DINC_OLE2 -D_MT $(CL)
+LINKFLAGS = -Incremental:NO -Pdb:NONE -subsystem:windows -entry:WinMainCRTStartup -machine:$(CPU)
+
+LIBS = libc.lib kernel32.lib user32.lib
+
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Z7 -D_DEBUG $(CL)
+LINKFLAGS = -debug:full -debugtype:cv,coff $(LINKFLAGS)
+!else
+CFLAGS = $(CFLAGS) -Ox
+!endif
+!endif
+
+
+##########################################################################
+#
+# MAC Settings
+#
+!if "$(TARGET)" == "MAC"
+
+CC = cl
+LINK = link
+
+RCFLAGS = -d_MAC
+!if "$(CPU)"=="PPC"
+CFLAGS = -W3 -D_MAC -D_PPCMAC -D_pascal= -D__pascal=
+LIBS = interfac.lib libc.lib ole2.lib ole2auto.lib
+LINKFLAGS = -machine:mppc -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+!else
+LIBS = interfac.lib llibcs.lib lsanes.lib swap.lib
+CFLAGS = -W3 -AL -D_MAC
+LINKFLAGS = -machine:$(CPU) -ENTRY:mainCRTStartup -NOPACK -NODEFAULTLIB
+!endif
+
+!if "$(DEBUG)" == "1"
+CFLAGS = $(CFLAGS) -Od -Zi -D_DEBUG $(CL)
+LINKFLAGS = $(LINKFLAGS) -debug:full -debugtype:cv
+!else
+CFLAGS = $(CFLAGS) -Ox $(CL)
+!endif
+
+MRC = mrc
+!if "$(CPU)"=="PPC"
+MRCOPT = -D_PPCMAC -s$(VBATOOLS)\win32\ppc\lib
+!else
+MRCOPT =
+!endif
+
+MAKEPEF = makepef
+!endif
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+APPS = tibrowse
+
+SRCDIR = $(OLEPROG)\SAMPLE\$(APPS)
+
+!if "$(TARGET)" == "MAC" && "$(CPU)"=="PPC"
+OBJDIR=$(SRCDIR)\macppc
+!else
+OBJDIR=$(SRCDIR)\$(TARGET)
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+
+!if "$(TARGET)" == "WIN16"
+LIBS = ole2.lib compobj.lib ole2disp.lib typelib.lib commdlg.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "WIN32"
+LIBS = ole32.lib oleaut32.lib uuid.lib comdlg32.lib $(LIBS)
+!endif
+!if "$(TARGET)" == "MAC"
+!if "$(CPU)"!="PPC"
+LIBS = olenrf.obj oanrf.obj $(LIBS)
+!endif
+!endif
+
+OBJS = \
+ $(OBJDIR)\tibrowse.obj
+
+
+##########################################################################
+#
+# Build rules
+#
+
+{$(SRCDIR)}.cpp{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+{$(SRCDIR)}.c{$(OBJDIR)}.obj:
+ @echo Compiling $<...
+ $(CC) -c -Fo$@ $<
+
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+goal : setflags $(OBJDIR)\$(APPS).exe
+
+setflags :
+ set CL=$(CFLAGS)
+
+
+##########################################################################
+#
+# Clean (erase) generated files
+#
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\$(APPS).exe del $(OBJDIR)\$(APPS).exe
+ if exist $(OBJDIR)\$(APPS).map del $(OBJDIR)\$(APPS).map
+ if exist $(OBJDIR)\$(APPS).res del $(OBJDIR)\$(APPS).res
+ if exist $(OBJDIR)\$(APPS).rs del $(OBJDIR)\$(APPS).rs
+ if exist $(SRCDIR)\*.pdb del $(SRCDIR)\*.pdb
+
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARGET)" == "WIN16"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ link $(LINKFLAGS) @<<
+$(OBJS),
+$@,$(OBJDIR)\$(APPS).map/map,
+$(LIBS),
+$(SRCDIR)\$(APPS).def
+<<
+ rc -k -t $(OBJDIR)\$(APPS).res $@
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARGET)" == "WIN32"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(SRCDIR)\$(APPS).def $(OBJDIR)\$(APPS).res $(SRCDIR)\$(APPS).ico
+ cvtres -r -$(CPU) $(OBJDIR)\$(APPS).res -o $(OBJDIR)\$(APPS).rs
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(OBJDIR)\$(APPS).rs
+ $(LIBS)
+<<
+!endif
+
+
+##########################################################################
+#
+# Application Build (MAC Specific)
+#
+!if "$(TARGET)" == "MAC"
+$(OBJDIR)\$(APPS).exe : $(OBJS) $(OBJDIR)\$(APPS).x
+ $(LINK) @<<
+ $(LINKFLAGS)
+ -out:$@
+ -map:$*.map
+ $(OBJS)
+ $(LIBS)
+<<
+ copy $(OBJDIR)\$(APPS).x $(OBJDIR)\$(APPS)
+!if "$(CPU)"=="PPC"
+ $(MAKEPEF) $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).pef
+!else
+ cvpack $(OBJDIR)\$(APPS).exe
+ $(MRC) $(MRCOPT) -e $(OBJDIR)\$(APPS).exe -a -o $(OBJDIR)\$(APPS)
+!endif
+
+$(OBJDIR)\$(APPS).x: $(SRCDIR)\$(APPS).r
+ $(MRC) $(MRCOPT) -D_MAC -o $(OBJDIR)\$(APPS).x $(SRCDIR)\$(APPS).r
+!endif
+
+
+##########################################################################
+#
+# Application Build (Common)
+#
+
+$(OBJDIR)\$(APPS).res : $(SRCDIR)\$(APPS).rc
+ rc $(RCFLAGS) -r -fo$@ $?
+
+
+##########################################################################
+#
+# Dependencies
+#
+
+
+$(OBJDIR)\tibrowse.obj : $(SRCDIR)\tibrowse.cpp $(SRCDIR)\tibrowse.h $(SRCDIR)\resource.h
+ $(CC) -c -Fo$@ $(SRCDIR)\tibrowse.cpp
diff --git a/private/oleauto/sample/tibrowse/mk.bat b/private/oleauto/sample/tibrowse/mk.bat
new file mode 100644
index 000000000..723e7a150
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/mk.bat
@@ -0,0 +1,19 @@
+REM setup the environment for the tibrowse makefile
+
+set OLDLIB=%LIB%
+set OLDPATH=%PATH%
+set OLDINC=%INCLUDE%
+
+set PATH=%TOOLS%\HDOS\BIN;%TOOLS%\HDOS\C800\BIN
+set LIB=%TOOLS%\HDOS\C800\LIB;%OLEPROG%\build\dispatch\DWIN16;%OLEPROG%\OLE\WIN16\D;%OLEPROG%\OB\DWIN16
+set INCLUDE=%TOOLS%\HDOS\C800\INCLUDE;%OLEPROG%\OLE\WIN16;%OLEPROG%\SRC\DISPATCH
+
+nmake %1 %2 %3 %4 %5
+
+set LIB=%OLDLIB%
+set PATH=%OLDPATH%
+set INCLUDE=%OLDINC%
+
+set OLDPATH=
+set OLDINC=
+set OLDLIB=
diff --git a/private/oleauto/sample/tibrowse/readme.txt b/private/oleauto/sample/tibrowse/readme.txt
new file mode 100644
index 000000000..8b2502e93
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/readme.txt
@@ -0,0 +1,23 @@
+---------------------------------------
+OLE Automation Sample Program: TiBrowse
+---------------------------------------
+
+Tibrowse is a sample OLE Automation browser. When started,
+it asks the user to selected a type library (.tlb) file.
+The browser then displays the contents of this file.
+
+
+
+
+---------------------------
+Shortcomings of this sample
+---------------------------
+1. This browser is not suitable for use by end users. It is
+deficient in many ways. A few of them:
+ - Users should never have to know that uuid's exist. Thus,
+ they should not be displayed in a browser.
+ - Items that are restricted or that start with underscore
+ should not be displayed in a browser.
+ - Duplicates for propery get/set pairs should be removed
+ since users think about properties, not about get/set
+ pairs. \ No newline at end of file
diff --git a/private/oleauto/sample/tibrowse/resource.h b/private/oleauto/sample/tibrowse/resource.h
new file mode 100644
index 000000000..4f788813f
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/resource.h
@@ -0,0 +1,54 @@
+/***
+*resource.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# define IDC_BASE 0
+
+# define kMinSize 1000 /* minimum size (in K) */
+# define kPrefSize 1000 /* preferred size (in K) */
+# define kMinHeap 21 * 1024
+# define kMinSpace 8 * 1024
+
+# define rMenuBar 128 /* menu bar */
+# define rAboutAlert 128 /* about alert */
+# define rUserAlert 129 /* error alert */
+# define rDlg 130
+
+# define mApple 128 /* Apple menu */
+# define iAbout 1
+
+# define mFile 129 /* File menu */
+# define iOpen 2
+# define iClose 4
+# define iQuit 12
+
+# define mEdit 130 /* Edit menu */
+# define iUndo 1
+# define iCut 3
+# define iCopy 4
+# define iPaste 5
+# define iClear 6
+
+#else
+# define IDC_BASE 1000
+#endif
+
+
+#define IDC_TYPELIST (IDC_BASE+1)
+#define IDC_MEMBERLIST (IDC_BASE+2)
+#define IDC_PARAMLIST (IDC_BASE+3)
+#define IDC_TYPEKIND (IDC_BASE+5)
+#define IDC_VERSION (IDC_BASE+7)
+#define IDC_GUID (IDC_BASE+9)
+#define IDC_HELPSTRING (IDC_BASE+11)
+#define IDC_HELPCONTEXT (IDC_BASE+13)
+
+#define IDC_STATIC -1
diff --git a/private/oleauto/sample/tibrowse/src2mac.cmd b/private/oleauto/sample/tibrowse/src2mac.cmd
new file mode 100644
index 000000000..7df884c6b
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/src2mac.cmd
@@ -0,0 +1,12 @@
+@rem
+@rem Copy Ole Automation sources to the Mac
+@rem
+@rem must be run from your local OS/2 box
+@rem
+
+rem echo off
+
+setlocal
+set path=%tools%\hnt\wings\bin
+nmake -f src2mac.mak
+endlocal
diff --git a/private/oleauto/sample/tibrowse/src2mac.mak b/private/oleauto/sample/tibrowse/src2mac.mak
new file mode 100644
index 000000000..2df88e6cc
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/src2mac.mak
@@ -0,0 +1,75 @@
+#***
+#src2mac.mak
+#
+# Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+# Information Contained Herein Is Proprietary and Confidential.
+#
+#Purpose:
+# This makefile copies tibrowse sources to the mac.
+#
+#
+#Revision History:
+#
+# [00] 02-Aug-93 bradlo: Created.
+#
+#Implementation Notes:
+#
+#****************************************************************************/
+
+.SUFFIXES: .c .cpp .h
+
+all: setflags files
+
+# source directories
+#
+SRCTBRW = $(OLEPROG)\SAMPLE\TIBROWSE
+
+# destination directories
+#
+MACTBRW = :hd:ole2auto:sample:tibrowse:
+
+# timestamp directories
+#
+TMPTBRW = $(TMP)\tibrowse
+
+CP2MAC=ec copy -l -t TEXT -c "MPS "
+
+setflags:
+ set path=%tools%\hnt\wings\bin;%oleprog%\bin
+ if not exist %TMP%\tibrowse mkdir %TMP%\tibrowse
+
+files : \
+ $(TMPTBRW)\tibrowse.h \
+ $(TMPTBRW)\resource.h \
+ $(TMPTBRW)\tibrowse.cpp \
+ $(TMPTBRW)\tibrowse.r \
+ $(TMPTBRW)\makefile.tmp
+
+
+{$(SRCTBRW)}.h{$(TMPTBRW)}.h:
+ $(CP2MAC) $< $(MACTBRW)$(@F)
+ echo $(@F) > $@
+
+{$(SRCTBRW)}.c{$(TMPTBRW)}.c:
+ $(CP2MAC) $< $(MACTBRW)$(@F)
+ echo $(@F) > $@
+
+{$(SRCTBRW)}.cpp{$(TMPTBRW)}.cpp:
+ $(CP2MAC) $< $(MACTBRW)$(@F)
+ echo $(@F) > $@
+
+
+$(TMPTBRW)\tibrowse.h : $(SRCTBRW)\tibrowse.h
+
+$(TMPTBRW)\resource.h : $(SRCTBRW)\resource.h
+
+$(TMPTBRW)\tibrowse.cpp : $(SRCTBRW)\tibrowse.cpp
+
+$(TMPTBRW)\tibrowse.r : $(SRCTBRW)\tibrowse.r
+ $(CP2MAC) $(SRCTBRW)\tibrowse.r $(MACTBRW)$(@F)
+ echo $(@F) > $@
+
+$(TMPTBRW)\makefile.tmp : $(SRCTBRW)\makefile.mpw
+ mungemak $(SRCTBRW)\makefile.mpw > $(TMPTBRW)\makefile.tmp
+ $(CP2MAC) $(TMPTBRW)\makefile.tmp $(MACTBRW)makefile
+
diff --git a/private/oleauto/sample/tibrowse/tibrowse.cpp b/private/oleauto/sample/tibrowse/tibrowse.cpp
new file mode 100644
index 000000000..5fdfe7670
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/tibrowse.cpp
@@ -0,0 +1,1156 @@
+/***
+*tibrowse.cpp
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Type Information Browser
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(_MAC)
+
+#if defined(_PPCMAC)
+#pragma data_seg("_FAR_DATA")
+#pragma data_seg( )
+#define MAXLONG 0x7fffffff
+#define EventHandlerProcPtr AEEventHandlerUPP
+#else //_PPCMAC
+#define GetMenuItemText(mApple,menuItem,daName) GetItem(mApple,menuItem,daName)
+#endif //_PPCMAC
+
+#endif //_MAC
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "tibrowse.h"
+
+#ifdef WIN32
+ #define SPRINTF swprintf
+#else
+ #define SPRINTF sprintf
+#endif
+
+#if defined(UNICODE)
+ #define TCHAR WCHAR
+ #define TSTR(str) L##str
+#else
+ #define TCHAR char
+ #define TSTR(str) str
+ #ifndef LPTSTR
+ #define LPTSTR LPSTR
+ #endif
+#endif
+
+#ifdef _MAC
+DECLARE_ROUTINE_DESC(UserItemUPP,DrawListbox);
+#endif
+
+#ifdef _MAC
+DialogPtr g_pdlg = NULL;
+ListHandle g_rghlist[IDC_PARAMLIST+1] = {NULL};
+#else
+HWND g_hwnd;
+TCHAR g_szAppName[] = TSTR("TiBrowse");
+#endif
+
+ITypeLib FAR *g_ptlib = NULL;
+ITypeInfo FAR *g_ptinfoCur = NULL;
+TYPEATTR FAR *g_ptattrCur = NULL;
+
+OLECHAR * g_rgszTKind[] = {
+ OLESTR("Enum"), /* TKIND_ENUM */
+ OLESTR("Struct"), /* TKIND_RECORD */
+ OLESTR("Module"), /* TKIND_MODULE */
+ OLESTR("Interface"), /* TKIND_INTERFACE */
+ OLESTR("Dispinterface"), /* TKIND_DISPATCH */
+ OLESTR("Coclass"), /* TKIND_COCLASS */
+ OLESTR("Typedef"), /* TKIND_ALIAS */
+ OLESTR("Union"), /* TKIND_UNION */
+};
+
+
+// Set the text of the control identified by the given control id
+void
+XSetDlgItemText(int ctlid, OLECHAR FAR* psz)
+{
+#ifdef _MAC
+ Rect rc;
+ Handle h;
+ short kind;
+ char buf[255];
+
+ strcpy(buf, psz);
+ GetDItem(g_pdlg, ctlid, &kind, &h, &rc);
+ SetIText(h, c2pstr(buf));
+#else
+#if defined(WIN32) && !defined(UNICODE)
+ char bufA[256];
+ WideCharToMultiByte(CP_ACP, NULL, psz, -1, bufA, 256, NULL, NULL);
+ SendDlgItemMessage(g_hwnd, ctlid, WM_SETTEXT, 0, (LPARAM)&bufA);
+#else
+ SendDlgItemMessage(g_hwnd, ctlid, WM_SETTEXT, 0, (LPARAM)psz);
+#endif
+#endif
+}
+
+// Clear the listbox identified by the given control id
+void
+XClrDlgItemList(int ctlid)
+{
+#ifdef _MAC
+ LDelRow(0, 0, g_rghlist[ctlid]); // delete everything
+#else
+ SendMessage(GetDlgItem(g_hwnd, ctlid), LB_RESETCONTENT, 0, 0L);
+#endif
+}
+
+// Add the given string to the listbox identified by the given control id
+void
+XAddDlgItemList(int ctlid, OLECHAR FAR* psz)
+{
+#ifdef _MAC
+ int row;
+ Point pt;
+ ListHandle hlist;
+
+ hlist = g_rghlist[ctlid];
+ row = LAddRow(1, -1, hlist);
+ pt.v = row, pt.h = 0;
+ LSetCell(psz, strlen(psz), pt, hlist);
+#else
+#if defined(WIN32) && !defined(UNICODE)
+ char bufA[256];
+ WideCharToMultiByte(CP_ACP, NULL, psz, -1, bufA, 256, NULL, NULL);
+ SendDlgItemMessage(g_hwnd, ctlid, LB_ADDSTRING, 0, (LPARAM)&bufA);
+#else
+ SendDlgItemMessage(g_hwnd, ctlid, LB_ADDSTRING, 0, (LPARAM)psz);
+#endif
+#endif
+}
+
+void Cleanup()
+{
+ if(g_ptinfoCur != NULL){
+ if(g_ptattrCur != NULL)
+ g_ptinfoCur->ReleaseTypeAttr(g_ptattrCur);
+ g_ptinfoCur->Release();
+ g_ptinfoCur = NULL;
+ }
+ if(g_ptlib != NULL){
+ g_ptlib->Release();
+ g_ptlib = NULL;
+ }
+}
+
+void Uninit()
+{
+ OleUninitialize();
+#ifdef _MAC
+#ifndef _PPCMAC
+ UninitOleManager(); // clean up applet
+#endif
+#endif
+}
+
+
+void
+OpenTypeLib(OLECHAR FAR *sztlib)
+{
+ unsigned int utypeinfoCount, i;
+ BSTR bstrName;
+ TLIBATTR FAR* ptlibattr;
+
+ /* clear out globals */
+ Cleanup();
+
+ /* clear out listboxes */
+ XClrDlgItemList(IDC_TYPELIST);
+ XClrDlgItemList(IDC_MEMBERLIST);
+ XClrDlgItemList(IDC_PARAMLIST);
+
+ /* load the type library */
+ CHECKRESULT(LoadTypeLib(sztlib, &g_ptlib));
+
+ /* get library attributes for the fun of it */
+ CHECKRESULT(g_ptlib->GetLibAttr(&ptlibattr));
+
+ /* release library attributes */
+ g_ptlib->ReleaseTLibAttr(ptlibattr);
+
+ /* Now add each of the names to the type list */
+ utypeinfoCount = g_ptlib->GetTypeInfoCount();
+ for(i = 0; i < utypeinfoCount; i++){
+ CHECKRESULT(g_ptlib->GetDocumentation(i, &bstrName, NULL, NULL, NULL));
+ ASSERT(bstrName);
+ XAddDlgItemList(IDC_TYPELIST, bstrName);
+ SysFreeString(bstrName);
+ }
+}
+
+#ifdef WIN32
+void
+OpenTypeLib(char FAR *sztlib)
+{
+ OLECHAR buf[MAX_PATH];
+
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ sztlib, -1, buf, MAX_PATH);
+ OpenTypeLib(buf);
+}
+#endif
+
+
+/***
+*void SetSelectedType
+*Purpose:
+* When the user changes the selection of a type, this function updates the
+* dialog by changing the member list and the help for the type. It also sets
+* g_ptinfoCur to refer to the typeinfo.
+*
+*Entry:
+* dwIndex =
+*
+*Exit:
+* return value = None
+*
+***********************************************************************/
+void
+SetSelectedType(unsigned long dwIndex)
+{
+ HRESULT hr;
+ BSTR bstrDoc;
+ OLECHAR FAR* psz;
+ OLECHAR szBuf[40];
+ unsigned long dwHelpContext;
+ TYPEKIND tkind;
+
+ if(g_ptinfoCur != NULL){
+ g_ptinfoCur->ReleaseTypeAttr(g_ptattrCur);
+ g_ptinfoCur->Release();
+ }
+
+ /* Clear out the member list */
+ XClrDlgItemList(IDC_MEMBERLIST);
+
+ if(g_ptlib == NULL)
+ return;
+
+ // Note: the index in the list box is conveniently the same as the
+ // one to pass to GetTypeInfo/GetTypeInfoType
+
+ // typeinfo type can be obtained without actually loading the typeinfo
+ CHECKRESULT(g_ptlib->GetTypeInfoType((unsigned int)dwIndex, &tkind));
+ XSetDlgItemText(IDC_TYPEKIND, g_rgszTKind[tkind]);
+
+ CHECKRESULT(g_ptlib->GetTypeInfo((unsigned int)dwIndex, &g_ptinfoCur));
+ CHECKRESULT(g_ptinfoCur->GetTypeAttr(&g_ptattrCur));
+
+ // GUID
+ hr = StringFromCLSID(g_ptattrCur->guid, &psz);
+ ASSERT(hr == NOERROR);
+ XSetDlgItemText(IDC_GUID, psz);
+ MemFree(psz);
+
+ // Version
+ SPRINTF(szBuf, OLESTR("%u.%02u"),
+ g_ptattrCur->wMajorVerNum, g_ptattrCur->wMinorVerNum);
+ XSetDlgItemText(IDC_VERSION, szBuf);
+
+ CHECKRESULT(
+ g_ptlib->GetDocumentation(
+ (unsigned int)dwIndex, NULL, &bstrDoc, &dwHelpContext, NULL));
+
+ // Help Context
+ SPRINTF(szBuf, OLESTR("%ld"), dwHelpContext);
+ XSetDlgItemText(IDC_HELPCONTEXT, szBuf);
+
+ // Documentation string
+ psz = (bstrDoc != NULL) ? bstrDoc : OLESTR("<none>");
+ XSetDlgItemText(IDC_HELPSTRING, psz);
+ SysFreeString(bstrDoc);
+
+ FillMemberList(g_ptinfoCur, g_ptattrCur, IDC_MEMBERLIST);
+
+ XClrDlgItemList(IDC_PARAMLIST);
+}
+
+/***
+*void FillMemberList
+*Purpose:
+* Sets the current typeinfo to the typeinfo indexed by dwIndex, and
+* then fills in the list box with the members of the type.
+*
+*Entry:
+* ptinfo =
+* ptypeattr =
+*
+*Exit:
+* return value = None
+*
+***********************************************************************/
+void
+FillMemberList(
+ ITypeInfo FAR *ptinfo,
+ TYPEATTR FAR *ptypeattr,
+ int ctlid)
+{
+ MEMBERID memid;
+ BSTR bstrName;
+ unsigned int i;
+ FUNCDESC FAR *pfuncdesc;
+ VARDESC FAR *pvardesc;
+
+ /* Now add all of the functions and all of the vars.
+ * This is somewhat roundabout.
+ * For each one, we need to get the funcdesc, or the vardesc.
+ * From that we get the MEMBERID, and finally can get to the name.
+ */
+ for(i = 0; i < ptypeattr->cFuncs; i++){
+ CHECKRESULT(ptinfo->GetFuncDesc(i, &pfuncdesc));
+ memid = pfuncdesc->memid;
+ CHECKRESULT(ptinfo->GetDocumentation(memid, &bstrName, NULL, NULL, NULL));
+ ptinfo->ReleaseFuncDesc(pfuncdesc);
+ pfuncdesc = NULL;
+
+ ASSERT(bstrName);
+ XAddDlgItemList(ctlid, bstrName);
+ SysFreeString(bstrName);
+ }
+
+ for(i = 0; i < ptypeattr->cVars; i++)
+ {
+ CHECKRESULT(ptinfo->GetVarDesc(i, &pvardesc));
+ memid = pvardesc->memid;
+ CHECKRESULT(ptinfo->GetDocumentation(memid, &bstrName, NULL, NULL, NULL));
+ ptinfo->ReleaseVarDesc(pvardesc);
+ pvardesc = NULL;
+
+ ASSERT(bstrName);
+ XAddDlgItemList(ctlid, bstrName);
+ SysFreeString(bstrName);
+ }
+}
+
+/***
+*void SetSelectedMember
+*Purpose:
+* When a member of a type is selected, update the help to be the help
+* of the member, and if the member is a function update the parameter
+* list to reflect that it is a function.
+*
+*Entry:
+* dwIndex =
+*
+*Exit:
+* return value = None
+*
+***********************************************************************/
+void
+SetSelectedMember(unsigned long dwIndex)
+{
+ MEMBERID memid;
+
+ /* In any case, we'll need to clear out the parameter list. */
+ XClrDlgItemList(IDC_PARAMLIST);
+
+ if(g_ptattrCur == NULL)
+ return;
+
+ /* if this is a function, fill the param list, otherwise just fill
+ * in the item info.
+ */
+ if(dwIndex < g_ptattrCur->cFuncs){
+ unsigned short i;
+ unsigned int cNames;
+ FUNCDESC FAR *pfuncdesc;
+ const unsigned int MAX_NAMES = 40;
+ BSTR rgNames[MAX_NAMES];
+
+ CHECKRESULT(g_ptinfoCur->GetFuncDesc((unsigned int) dwIndex, &pfuncdesc));
+ memid = pfuncdesc->memid;
+ UpdateMemberInfo(memid);
+
+ CHECKRESULT(g_ptinfoCur->GetNames(memid, rgNames, MAX_NAMES,&cNames));
+ for(i = 1; i < cNames; i++){
+ ASSERT(rgNames[i])
+ XAddDlgItemList(IDC_PARAMLIST, rgNames[i]);
+ SysFreeString(rgNames[i]);
+ }
+ ASSERT(rgNames[0]);
+ SysFreeString(rgNames[0]);
+ g_ptinfoCur->ReleaseFuncDesc(pfuncdesc);
+ }
+ else
+ {
+ VARDESC FAR *pvardesc;
+
+ CHECKRESULT(
+ g_ptinfoCur->GetVarDesc(
+ (unsigned int)(dwIndex - g_ptattrCur->cFuncs), &pvardesc));
+ memid = pvardesc->memid;
+ UpdateMemberInfo(memid);
+ g_ptinfoCur->ReleaseVarDesc(pvardesc);
+ }
+}
+
+/***
+*void UpdateMemberInfo
+*Purpose:
+* sets fields on the dialog (such as help string and help context) from
+* the type information.
+*
+*Entry:
+* memid =
+*
+*Exit:
+* return value = None
+*
+***********************************************************************/
+void
+UpdateMemberInfo(MEMBERID memid)
+{
+ BSTR bstrDoc;
+ OLECHAR buf[40];
+ unsigned long dwHelpContext;
+
+ /* get the member information */
+ CHECKRESULT(g_ptinfoCur->GetDocumentation(
+ memid, NULL, &bstrDoc, &dwHelpContext, NULL));
+
+ /* update the help string displayed in the dialog */
+ XSetDlgItemText(IDC_HELPSTRING, (bstrDoc != NULL) ?
+ bstrDoc : OLESTR("<none>"));
+ SysFreeString(bstrDoc);
+
+ /* update the help context displayed in the dialog */
+ SPRINTF(buf, OLESTR("%ld"), dwHelpContext);
+ XSetDlgItemText(IDC_HELPCONTEXT, buf);
+}
+
+/***
+*void SetSelectedParam
+*Purpose:
+* CONSIDER: Enhance to show parameter type information here.
+*
+*Entry:
+* dwIndex =
+*
+*Exit:
+* return value = None
+*
+***********************************************************************/
+void
+SetSelectedParam(unsigned long dwIndex)
+{
+}
+
+
+HRESULT
+GetFileName(BSTR FAR* pbstrFileName)
+{
+ OLECHAR buf[1024];
+ BSTR bstrFileName;
+
+#ifdef _MAC
+
+ int i;
+ Point pt;
+ long dirID;
+ char *p, *q;
+ SFReply sfr;
+ SFTypeList sftl;
+ short sRefNumReal;
+
+ SetPt(&pt, 100, 100);
+ //sftl[0] = 'OTLB';
+ sftl[0] = 0; // currently allow all file types
+ SFGetFile(pt, NULL, NULL, -1, sftl, NULL, &sfr);
+
+ if(!sfr.good)
+ return ResultFromScode(E_FAIL);
+
+ // translate sfr.vRefNum into a dirID
+ {
+ WDPBRec wdpbr;
+
+ wdpbr.ioWDIndex = 0;
+ wdpbr.ioVRefNum = sfr.vRefNum;
+ wdpbr.ioWDVRefNum = 0;
+ wdpbr.ioWDIndex = 0;
+ wdpbr.ioWDProcID = 0;
+ wdpbr.ioNamePtr = (StringPtr)buf;
+
+ if(PBGetWDInfoSync (&wdpbr) != noErr)
+ return ResultFromScode(E_FAIL);
+
+ sRefNumReal = wdpbr.ioWDVRefNum;
+ dirID = wdpbr.ioWDDirID;
+ }
+
+ {
+ Str255 stDir;
+ CInfoPBRec pb;
+ DirInfo *pdirinfo = (DirInfo*)&pb;
+ char rgchTemp[256]; // REVIEW: what should the size be?
+
+ pdirinfo->ioNamePtr = stDir;
+ pdirinfo->ioVRefNum = sRefNumReal;
+ pdirinfo->ioDrParID = dirID;
+ pdirinfo->ioFDirIndex = -1; // get info on a dir
+
+ buf[0] = '\0';
+
+ // loop until we hit the root dir
+ do{
+ pdirinfo->ioDrDirID = pdirinfo->ioDrParID;
+ if(PBGetCatInfoSync (&pb) != noErr)
+ return ResultFromScode(E_FAIL);
+ strncpy(rgchTemp, (char*)stDir, 64);
+ p2cstr((StringPtr)rgchTemp);
+ strcat(rgchTemp, ":");
+ strcat(rgchTemp, buf);
+ strcpy(buf, rgchTemp);
+ }while(pdirinfo->ioDrDirID != fsRtDirID);
+
+ }
+
+ q = (char*)sfr.fName;
+ i = (int)*q++;
+ p = &buf[strlen(buf)];
+ while(i-->0)
+ *p++ = *q++;
+ *p = '\0';
+
+ if((bstrFileName = SysAllocString(buf)) == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+#else
+
+ OPENFILENAME ofn;
+
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = g_hwnd;
+ ofn.lpstrFile = (LPTSTR) &buf;
+ ofn.nMaxFile = sizeof(buf);
+ *buf = OLESTR('\0');
+ ofn.lpstrFilter = TSTR("Type Libraries\0*.tlb\0\0");
+ ofn.nFilterIndex = 1;
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_SHAREAWARE;
+ if(GetOpenFileName(&ofn) == 0){
+ // REVIEW: we can probably do something smarter with this error
+ DWORD dwerr = CommDlgExtendedError();
+ return ResultFromScode(E_FAIL);
+ }
+#if defined(WIN32) && !defined(UNICODE)
+ OLECHAR szFileW[_MAX_PATH];
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ ofn.lpstrFile, -1, szFileW, _MAX_PATH);
+ if((bstrFileName = SysAllocString(szFileW)) == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+#else
+ if((bstrFileName = SysAllocString(ofn.lpstrFile)) == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+#endif
+
+#endif
+
+ *pbstrFileName = bstrFileName;
+ return NOERROR;
+}
+
+void
+AssertFail(char FAR* file, int line)
+{
+ // Ansi Output for Assertion
+ #ifdef UNICODE
+ #define OUTPUTDEBUGSTRING OutputDebugStringA
+ #define MESSAGEBOX MessageBoxA
+ #else
+ #define OUTPUTDEBUGSTRING OutputDebugString
+ #define MESSAGEBOX MessageBox
+ #endif
+
+ char buf[128];
+
+ sprintf(buf, "Assertion failed: %s(%d)", file, line);
+
+#ifdef _MAC
+ DebugStr(c2pstr(buf));
+#else
+ OUTPUTDEBUGSTRING(buf);
+ if(MESSAGEBOX(NULL, buf,
+ "TiBrowse Assertion. OK to continue, CANCEL to quit.",
+ MB_OKCANCEL | MB_TASKMODAL) == IDCANCEL)
+ exit(1);
+ DebugBreak();
+#endif
+}
+
+#ifdef _MAC /* { */
+
+void Init(void);
+void EventLoop(void);
+
+void AdjustMenus(void);
+void DoEvent(EventRecord *pevent);
+void DoMenuCommand(long menuResult);
+void Quit(void);
+#ifndef _MSC_VER
+#ifndef ConstStr255Param
+#define ConstStr255Param StringPtr
+#endif
+#endif
+void Fatal(ConstStr255Param);
+
+Boolean
+IsAppWindow(WindowPtr window)
+{
+ return (window == NULL)
+ ? false : ((WindowPeek)window)->windowKind == userKind;
+}
+
+Boolean
+IsDAWindow(WindowPtr window)
+{
+ return (window == NULL)
+ ? false : (((WindowPeek)window)->windowKind < 0);
+}
+
+void
+main()
+{
+ Init();
+// ShowWindow(g_pdlg); // REVIEW: necessarry?
+ EventLoop();
+}
+
+void
+DoDialogEvent(EventRecord *pevent, short sItem)
+{
+ Point pt;
+ GrafPtr pport;
+ ListHandle hlist;
+
+ switch(sItem){
+ case IDC_TYPELIST:
+ case IDC_MEMBERLIST:
+ case IDC_PARAMLIST:
+ if(pevent->what == mouseDown){
+ GetPort(&pport);
+ SetPort(g_pdlg);
+ GlobalToLocal(&pevent->where);
+ hlist = g_rghlist[sItem];
+ LClick(pevent->where, pevent->modifiers, hlist);
+ SetPt(&pt, 0, 0);
+ if(LGetSelect(true, &pt, hlist)){
+ switch(sItem){
+ case IDC_TYPELIST:
+ SetSelectedType(pt.v);
+ break;
+ case IDC_MEMBERLIST:
+ SetSelectedMember(pt.v);
+ break;
+ case IDC_PARAMLIST:
+ SetSelectedParam(pt.v);
+ break;
+ }
+ }
+ SetPort(pport);
+ }
+ break;
+ }
+}
+
+void
+EventLoop()
+{
+ short sItem;
+ DialogPtr pdlg;
+ EventRecord event;
+ RgnHandle cursorRgn;
+
+ cursorRgn = NewRgn();
+ while(1){
+ if(WaitNextEvent(everyEvent, &event, MAXLONG, cursorRgn)){
+ if (FrontWindow() != NULL
+ && event.what != diskEvt
+ && (event.what != keyDown || (event.modifiers & cmdKey) == 0)
+ && IsDialogEvent(&event))
+ {
+ if(DialogSelect(&event, &pdlg, &sItem)){
+ ASSERT(pdlg == g_pdlg);
+ DoDialogEvent(&event, sItem);
+ }
+ }else{
+ DoEvent(&event);
+ }
+ }
+ }
+}
+
+void
+DoEvent(EventRecord *pevent)
+{
+ char key;
+ short part;
+ WindowPtr window;
+
+ switch(pevent->what){
+ case mouseDown:
+ part = FindWindow(pevent->where, &window);
+ switch(part){
+ case inMenuBar:
+ AdjustMenus();
+ DoMenuCommand(MenuSelect(pevent->where));
+ break;
+
+ case inSysWindow: /* let the system handle the mouseDown */
+ SystemClick(pevent, window);
+ break;
+
+ case inContent:
+ if(window != FrontWindow()){
+ SelectWindow(window);
+ }
+ break;
+
+ case inDrag:
+ DragWindow(window, pevent->where, &qd.screenBits.bounds);
+ break;
+ }
+ break;
+
+ case keyDown:
+ case autoKey: /* check for menukey equivalents */
+ key = (char)(pevent->message & charCodeMask);
+ if(pevent->modifiers & cmdKey){ /* Command key down */
+ if(pevent->what == keyDown){
+ /* enable/disable/check menu items properly */
+ AdjustMenus();
+ DoMenuCommand(MenuKey(key));
+ }
+ }
+ break;
+ }
+}
+
+void
+Enable(MenuHandle hmenu, short sItem, Boolean fEnable)
+{
+ if(fEnable)
+ EnableItem(hmenu, sItem);
+ else
+ DisableItem(hmenu, sItem);
+}
+
+void
+AdjustMenus()
+{
+ Boolean fIsDA;
+ MenuHandle hmenu;
+
+ fIsDA = IsDAWindow(FrontWindow());
+
+ /* we can allow desk accessories to be closed from the menu */
+ hmenu = GetMHandle(mFile);
+ Enable(hmenu, iClose, fIsDA);
+
+ hmenu = GetMHandle(mEdit);
+ Enable(hmenu, iUndo, fIsDA);
+ Enable(hmenu, iCut, fIsDA);
+ Enable(hmenu, iCopy, fIsDA);
+ Enable(hmenu, iPaste, fIsDA);
+ Enable(hmenu, iClear, fIsDA);
+}
+
+void
+DoMenuCommand(long menuResult)
+{
+ short menuID; /* the resource ID of the selected menu */
+ short menuItem; /* the item number of the selected menu */
+ Str255 daName;
+
+ menuID = HiWord(menuResult);
+ menuItem = LoWord(menuResult);
+
+ switch(menuID){
+ case mApple:
+ switch(menuItem){
+ case iAbout: /* bring up alert for About */
+ Alert(rAboutAlert, NULL);
+ break;
+ default:
+ GetMenuItemText(GetMHandle(mApple), menuItem, daName);
+ OpenDeskAcc(daName);
+ break;
+ }
+ break;
+
+ case mFile:
+ switch(menuItem){
+ case iOpen:
+ {
+ BSTR bstrFileName;
+ if(GetFileName(&bstrFileName) != NOERROR)
+ {
+ // REVIEW: shouldnt just bag out here
+ Fatal((ConstStr255Param)"\pUnable to open Type Library");
+ }
+ OpenTypeLib(bstrFileName);
+ }
+ break;
+
+ case iQuit:
+ Quit();
+ break;
+ }
+ break;
+
+ case mEdit:
+ SystemEdit(menuItem-1);
+ break;
+ }
+
+ HiliteMenu(0);
+}
+
+extern "C" {
+
+#if defined(_MSC_VER)
+void pascal
+#else
+pascal void
+#endif
+DrawListbox(DialogPtr pdlg, short sItem)
+{
+ Rect rc;
+ Handle h;
+ short kind;
+ GrafPtr port;
+ ListHandle hlist;
+
+ ASSERT(sItem == IDC_TYPELIST
+ || sItem == IDC_MEMBERLIST
+ || sItem == IDC_PARAMLIST);
+
+ GetPort(&port);
+ SetPort(pdlg);
+ hlist = g_rghlist[sItem];
+ LUpdate(pdlg->visRgn, hlist);
+ GetDItem(pdlg, sItem, &kind, &h, &rc);
+ InsetRect(&rc, -1, -1);
+ FrameRect(&rc);
+ SetPort(port);
+}
+
+}
+
+
+/***
+*ListHandle CreateListBox(DialogPtr, int)
+*Purpose:
+* Create a listbox on the given dialog, associated with the given
+* control id.
+*
+*Entry:
+* pdlg =
+* ctlid =
+*
+*Exit:
+* return value = ListHandle
+*
+***********************************************************************/
+ListHandle
+CreateListbox(DialogPtr pdlg, int ctlid)
+{
+ Handle h;
+ short kind;
+ Point ptCell;
+ ListHandle hlist;
+ Rect rcView, rcBounds;
+
+ INIT_ROUTINE_DESC(NewUserItemProc,DrawListbox);
+
+ GetDItem(pdlg, ctlid, &kind, &h, &rcView);
+ SetDItem(pdlg, ctlid, kind, (Handle) ROUTINE_DESC(DrawListbox), &rcView);
+
+ // make room for scroll bars
+ rcView.right -= 15;
+
+ // list is 1 wide
+ SetRect(&rcBounds, 0, 0, 1, 0);
+
+ SetPt(&ptCell, 0, 0);
+
+ hlist = LNew(
+ &rcView,
+ &rcBounds,
+ ptCell,
+ 0, (WindowPtr)pdlg, true, false, false, true);
+
+ ASSERT(hlist != NULL);
+
+ (*hlist)->selFlags = lUseSense | lNoRect | lNoExtend | lOnlyOne;
+
+ return hlist;
+}
+
+/***
+*DialogPtr CreateDialog(void)
+*Purpose:
+* Create the TiBrowse dialog
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = DialogPtr
+*
+***********************************************************************/
+DialogPtr
+CreateDialog()
+{
+ int i;
+ Point pt;
+ DialogPtr pdlg;
+ ListHandle hlist;
+static short rgctl[] = {IDC_TYPELIST, IDC_MEMBERLIST, IDC_PARAMLIST};
+
+ if((pdlg = GetNewDialog(rDlg, NULL, (WindowPtr)-1)) == NULL)
+ return NULL;
+
+ for(i = 0; i < DIM(rgctl); ++i){
+ g_rghlist[rgctl[i]] = CreateListbox(pdlg, rgctl[i]);
+ }
+
+ SetPt(&pt, 0, 0);
+ for(i = 0; i < DIM(rgctl); ++i){
+ hlist = g_rghlist[rgctl[i]];
+ LSetSelect(true, pt, hlist);
+ LDoDraw(true, hlist);
+ }
+
+ return pdlg;
+}
+
+
+void
+Init()
+{
+ Handle menuBar;
+
+ MaxApplZone();
+
+ InitGraf((Ptr)&qd.thePort);
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ TEInit();
+ InitDialogs(NULL);
+ InitCursor();
+ FlushEvents(everyEvent, 0);
+
+#ifndef _PPCMAC
+ if (InitOleManager(0) != NOERROR)
+ Fatal((ConstStr255Param)"\pCould not initialize OLE Applet");
+#endif
+
+ if(OleInitialize(NULL) != NOERROR)
+ Fatal((ConstStr255Param)"\pUnable to Initialize Ole");
+
+ if((menuBar = GetNewMBar(rMenuBar)) == NULL)
+ Fatal((ConstStr255Param)"\pUnable to load menu bar");
+ SetMenuBar(menuBar);
+ DisposHandle(menuBar);
+ AddResMenu(GetMHandle(mApple), 'DRVR');
+ DrawMenuBar();
+
+ if((g_pdlg = CreateDialog()) == NULL)
+ Fatal((ConstStr255Param)"\pUnable to create dialog");
+}
+
+void
+Quit()
+{
+ Cleanup();
+ Uninit();
+ ExitToShell();
+}
+
+/* display fatal error alert, and exit */
+void
+Fatal(ConstStr255Param msg)
+{
+ SetCursor(&qd.arrow);
+ ParamText(msg, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
+ Alert(rUserAlert, nil);
+ Quit();
+}
+
+#else /* }{ */
+
+long FAR PASCAL EXPORT WndProc (HWND, UINT, WPARAM, LPARAM) ;
+
+int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hinstPrev,
+ LPSTR lpszCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+ WNDCLASS wndclass;
+
+ if(!hinstPrev){
+ wndclass.style = CS_HREDRAW | CS_VREDRAW;
+ wndclass.lpfnWndProc = WndProc ;
+ wndclass.cbClsExtra = 0 ;
+ wndclass.cbWndExtra = DLGWINDOWEXTRA ;
+ wndclass.hInstance = hinst ;
+ wndclass.hIcon = LoadIcon (hinst, g_szAppName) ;
+ wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
+ wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
+ wndclass.lpszMenuName = NULL ;
+ wndclass.lpszClassName = g_szAppName ;
+
+ RegisterClass (&wndclass) ;
+ }
+
+ if(OleInitialize(NULL) != NOERROR){
+ MessageBox(NULL, TSTR("unable to initialize Ole"),
+ g_szAppName, MB_OK);
+ return 0;
+ }
+
+ g_hwnd = CreateDialog(hinst, g_szAppName, 0, NULL);
+
+ if(*lpszCmdLine == '\0'){
+ BSTR bstrFileName;
+ if(GetFileName(&bstrFileName) != NOERROR){
+ Cleanup();
+ Uninit();
+ exit(-1);
+ }
+ OpenTypeLib(bstrFileName);
+ SysFreeString(bstrFileName);
+ }else{
+ OpenTypeLib(lpszCmdLine);
+ }
+
+ ShowWindow(g_hwnd, nCmdShow);
+
+ while(GetMessage (&msg, NULL, 0, 0)){
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ Cleanup();
+ Uninit();
+ return msg.wParam;
+}
+
+long FAR PASCAL EXPORT
+WndProc(
+ HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ unsigned long dwIndex;
+
+ switch(message){
+ case WM_COMMAND:
+ /* We deal with the following events:
+ * The selection changes on the type list and we have
+ * to update the member list & type info.
+ * The selection changes on the member list and we have
+ * to update the param list & member info.
+ * Selection changes on a parameter and we have to
+ * update the param info.
+ */
+#ifdef WIN32
+# define wParamX LOWORD(wParam)
+# define notifyMsg HIWORD(wParam)
+#else
+# define wParamX wParam
+# define notifyMsg HIWORD(lParam)
+#endif
+ switch(wParamX){
+ case IDC_TYPELIST:
+ if(notifyMsg == LBN_SELCHANGE){
+ dwIndex = SendDlgItemMessage(hwnd, IDC_TYPELIST, LB_GETCURSEL, 0, 0L);
+ if(dwIndex != LB_ERR)
+ SetSelectedType(dwIndex);
+ }
+ break;
+ case IDC_MEMBERLIST:
+ if(notifyMsg == LBN_SELCHANGE){
+ dwIndex = SendDlgItemMessage(hwnd, IDC_MEMBERLIST, LB_GETCURSEL,0,0L);
+ if(dwIndex != LB_ERR)
+ SetSelectedMember(dwIndex);
+ }
+ break;
+ case IDC_PARAMLIST:
+ if(notifyMsg == LBN_SELCHANGE){
+ dwIndex = SendDlgItemMessage(hwnd, IDC_PARAMLIST, LB_GETCURSEL, 0,0L);
+ if(dwIndex != LB_ERR)
+ SetSelectedParam(dwIndex);
+ }
+ break;
+ }
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0 ;
+ }
+ return DefWindowProc (hwnd, message, wParam, lParam) ;
+}
+
+#endif /* } */
+
+void
+MethodError(HRESULT hresult)
+{
+ /* CONSIDER: add code to figure out what specific error this is */
+ UNUSED(hresult);
+
+#ifdef _MAC
+ Fatal((ConstStr255Param)"\pType Library");
+#else
+ MessageBox(NULL, TSTR("Error returned from TYPELIB.DLL"),
+ g_szAppName, MB_OK);
+ exit(1);
+#endif
+}
+
+/* free using the task allocator */
+void
+MemFree(void FAR* pv)
+{
+ HRESULT hresult;
+ IMalloc FAR* pmalloc;
+
+ hresult = CoGetMalloc(MEMCTX_TASK, &pmalloc);
+
+ if(hresult != NOERROR){
+#ifdef _MAC
+ Fatal((ConstStr255Param)"\pError accessing task allocator");
+#else
+ MessageBox(NULL, TSTR("Error accessing task allocator"),
+ g_szAppName, MB_OK);
+#endif
+ return;
+ }
+
+ pmalloc->Free(pv);
+ pmalloc->Release();
+}
+
diff --git a/private/oleauto/sample/tibrowse/tibrowse.def b/private/oleauto/sample/tibrowse/tibrowse.def
new file mode 100644
index 000000000..89d1dc8b1
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/tibrowse.def
@@ -0,0 +1,13 @@
+;------------------------------------
+; TIBROWSE.DEF module definition file
+;------------------------------------
+
+NAME TIBROWSE
+
+DESCRIPTION 'Type library browser'
+EXETYPE WINDOWS
+STUB 'WINSTUB.EXE'
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MOVEABLE MULTIPLE
+HEAPSIZE 1024
+STACKSIZE 10240
diff --git a/private/oleauto/sample/tibrowse/tibrowse.h b/private/oleauto/sample/tibrowse/tibrowse.h
new file mode 100644
index 000000000..03989cc98
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/tibrowse.h
@@ -0,0 +1,131 @@
+/***
+*tibrowse.h
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(_MAC)
+
+#if defined(_MSC_VER)
+
+# include <values.h>
+# include <types.h>
+# include <string.h>
+# include <quickdra.h>
+# include <fonts.h>
+# include <events.h>
+# include <resource.h>
+# include <menus.h>
+# include <lists.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutil.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEve.h>
+# include <standard.h>
+
+#else //_MSC_VER
+
+# include <values.h>
+# include <types.h>
+# include <strings.h>
+# include <quickdraw.h>
+# include <fonts.h>
+# include <events.h>
+# include <resources.h>
+# include <windows.h>
+# include <menus.h>
+# include <lists.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <desk.h>
+# include <toolutils.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <osevents.h>
+# include <diskinit.h>
+# include <packages.h>
+# include <traps.h>
+# include <AppleEvents.h>
+# include <StandardFile.h>
+
+#endif //_MSC_VER
+
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+#elif defined(WIN32)
+
+# include <windows.h>
+# include <commdlg.h>
+
+#else /* WIN16 */
+
+# include <windows.h>
+# include <commdlg.h>
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+
+#endif
+
+#include "resource.h"
+
+#ifdef WIN32
+# define EXPORT
+#else
+# define EXPORT _export
+#endif
+
+#ifdef _MAC
+# define UNUSED(X) ((void)(void*)&(X))
+#else
+# define UNUSED(X) (X)
+#endif
+
+#define DIM(X) (sizeof(X) / sizeof(X[0]))
+
+void AssertFail(char FAR*, int);
+#define ASSERT(X) if (!(X)) { AssertFail(__FILE__, __LINE__); } else {}
+
+#define CHECKRESULT(X) \
+ {HRESULT hresult = (X); \
+ if(hresult != NOERROR && FAILED(GetScode(hresult))) MethodError(hresult); }
+
+
+HRESULT OpenFile(BSTR FAR* pbstrFileName);
+void OpenTypeLib(char FAR*);
+void SetSelectedType(unsigned long);
+void FillMemberList(ITypeInfo FAR *, TYPEATTR FAR *, int cltid);
+void SetSelectedMember(unsigned long);
+void SetSelectedParam(unsigned long dwIndex);
+void UpdateMemberInfo(MEMBERID memid);
+void AssertFail(char FAR*, int);
+void MethodError(HRESULT hresult);
+void Cleanup(void);
+void MemFree(void FAR*);
+
+#ifdef _PPCMAC
+#define ROUTINE_DESC(proc) g_rd##proc
+#define DECLARE_ROUTINE_DESC(type,proc) static type ROUTINE_DESC(proc)=0
+#define INIT_ROUTINE_DESC(init,proc) { if (!ROUTINE_DESC(proc)) ROUTINE_DESC(proc)=init(proc); }
+
+#else // _PPCMAC
+#define ROUTINE_DESC(proc) proc
+#define INIT_ROUTINE_DESC(init,proc)
+#define DECLARE_ROUTINE_DESC(type,proc)
+#endif // _PPCMAC
diff --git a/private/oleauto/sample/tibrowse/tibrowse.ico b/private/oleauto/sample/tibrowse/tibrowse.ico
new file mode 100644
index 000000000..53d99ad2d
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/tibrowse.ico
Binary files differ
diff --git a/private/oleauto/sample/tibrowse/tibrowse.r b/private/oleauto/sample/tibrowse/tibrowse.r
new file mode 100644
index 000000000..bc2c36787
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/tibrowse.r
@@ -0,0 +1,384 @@
+/***
+*tibrowse.r
+*
+* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* Resource script for spoly.
+*
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "types.r"
+#include "resource.h"
+
+#if defined (_PPCMAC)
+include "cfrg.rsc";
+#endif
+
+/* we use an MBAR resource to conveniently load all the menus */
+
+resource 'MBAR' (rMenuBar, preload) {
+ { mApple, mFile, mEdit }
+};
+
+
+resource 'MENU' (mApple, preload) {
+ mApple,
+ textMenuProc,
+ 0b11111111111111111111111111111101,
+ enabled,
+ apple,
+ {
+ "About TiBrowse\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mFile, preload) {
+ mFile,
+ textMenuProc,
+ 0b00000000000000000000100000000010,
+ enabled,
+ "File",
+ {
+ "New",
+ noicon, "N", nomark, plain;
+ "Open",
+ noicon, "O", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Close",
+ noicon, "W", nomark, plain;
+ "Save",
+ noicon, "S", nomark, plain;
+ "Save As\311",
+ noicon, nokey, nomark, plain;
+ "Revert",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Page Setup\311",
+ noicon, nokey, nomark, plain;
+ "Print\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Quit",
+ noicon, "Q", nomark, plain
+ }
+};
+
+resource 'MENU' (mEdit, preload) {
+ mEdit,
+ textMenuProc,
+ 0b00000000000000000000000000000000,
+ enabled,
+ "Edit",
+ {
+ "Undo",
+ noicon, "Z", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Cut",
+ noicon, "X", nomark, plain;
+ "Copy",
+ noicon, "C", nomark, plain;
+ "Paste",
+ noicon, "V", nomark, plain;
+ "Clear",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'DLOG' (rDlg) {
+ {40, 40, 360, 485},
+ rDocProc,
+ visible,
+ noGoAway,
+ 0x0,
+ rDlg,
+ "Type Library Browser"
+};
+
+resource 'DITL' (rDlg) {
+ { /* array DITLarray: 16 elements */
+ /* [1] */
+ {30, 10, 190, 145},
+ UserItem {
+ enabled
+ },
+ /* [2] */
+ {30, 155, 190, 290},
+ UserItem {
+ enabled
+ },
+ /* [3] */
+ {30, 300, 190, 435},
+ UserItem {
+ enabled
+ },
+ /* [4] */
+ {200, 10, 219, 100},
+ StaticText {
+ disabled,
+ "Type Kind:"
+ },
+ /* [5] */
+ {200, 115, 219, 435},
+ StaticText {
+ enabled,
+ ""
+ },
+ /* [6] */
+ {220, 10, 239, 100},
+ StaticText {
+ disabled,
+ "Version:"
+ },
+ /* [7] */
+ {220, 115, 239, 435},
+ StaticText {
+ enabled,
+ ""
+ },
+ /* [8] */
+ {240, 10, 259, 100},
+ StaticText {
+ disabled,
+ "GUID:"
+ },
+ /* [9] */
+ {240, 115, 259, 435},
+ StaticText {
+ enabled,
+ ""
+ },
+ /* [10] */
+ {260, 10, 279, 100},
+ StaticText {
+ disabled,
+ "Help Context:"
+ },
+ /* [11] */
+ {260, 115, 279, 435},
+ StaticText {
+ enabled,
+ ""
+ },
+ /* [12] */
+ {280, 10, 299, 100},
+ StaticText {
+ disabled,
+ "Help String:"
+ },
+ /* [13] */
+ {280, 115, 299, 435},
+ StaticText {
+ enabled,
+ ""
+ },
+ /* [14] */
+ {10, 10, 29, 145},
+ StaticText {
+ disabled,
+ "Type"
+ },
+ /* [15] */
+ {10, 155, 29, 290},
+ StaticText {
+ disabled,
+ "Members"
+ },
+ /* [16] */
+ {10, 300, 29, 435},
+ StaticText {
+ disabled,
+ "Parameters"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an About screen */
+
+resource 'ALRT' (rAboutAlert, purgeable) {
+ {40, 20, 160, 290},
+ rAboutAlert,
+ {
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+resource 'DITL' (rAboutAlert, purgeable) {
+ { /* array DITLarray: 5 elements */
+ /* [1] */
+ {88, 180, 108, 260},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {8, 8, 24, 214},
+ StaticText {
+ disabled,
+ "IDispatch Polygon Server"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an error screen */
+
+resource 'ALRT' (rUserAlert, purgeable) {
+ {40, 20, 120, 260},
+ rUserAlert,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+
+resource 'DITL' (rUserAlert, purgeable) {
+ {
+ /* [1] */
+ {50, 150, 70, 230},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 30, 230},
+ StaticText {
+ disabled,
+ "Error. ^0"
+ },
+ /* [3] */
+ {8, 8, 40, 40},
+ Icon {
+ disabled,
+ 2
+ }
+ }
+};
+
+
+resource 'SIZE' (-1) {
+ dontSaveScreen,
+ acceptSuspendResumeEvents,
+ enableOptionSwitch,
+ canBackground,
+ multiFinderAware,
+ backgroundAndForeground,
+ dontGetFrontClicks,
+ ignoreChildDiedEvents,
+ is32BitCompatible,
+ isHighLevelEventAware,
+ localAndRemoteHLEvents,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ kPrefSize * 1024,
+ kMinSize * 1024
+};
+
+resource 'BNDL' (132) {
+ 'TIBR',
+ 0,
+ { /* array TypeArray: 2 elements */
+ /* [1] */
+ 'FREF',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 132
+ },
+ /* [2] */
+ 'ICN#',
+ { /* array IDArray: 1 elements */
+ /* [1] */
+ 0, 132
+ }
+ }
+};
+
+data 'FREF' (132) {
+ $"4150 504C 0000 7F" /* APPL... */
+};
+
+data 'ICN#' (132) {
+ $"0007 F800 0018 0600 0021 0180 0041 0040" /* ..ø......!.€.A.@ */
+ $"0083 0020 0100 0010 0108 0010 0278 0008" /* .ƒ. .........x.. */
+ $"0200 0018 047F FFFC 047F FFFC 0460 0006" /* ......ÿü..ÿü.`.. */
+ $"0460 1E07 0460 FE05 0467 FC0D 0463 FC0D" /* .`...`þ..güÂ.cü */
+ $"0263 FC09 0261 F809 0160 F809 0160 7819" /* .cüÆ.aøÆ.`øÆ.`x. */
+ $"02E0 3061 0540 11E1 0AB0 01C1 055C 0601" /* .à0a.@.á.°.Á.\.. */
+ $"12B3 F809 2160 0031 40C0 F0F1 8113 E3E1" /* .³øÆ!`.1@Àðñ.ãá */
+ $"0211 E1E1 0410 C0C1 0810 4041 001F FFFF" /* ..áá..ÀÁ..@A..ÿÿ */
+ $"0007 F800 001F FE00 003F FF80 007F FFC0" /* ..ø...þ..?ÿ€..ÿÀ */
+ $"00FF FFE0 01FF FFF0 01FF FFF0 03FF FFF8" /* .ÿÿà.ÿÿð.ÿÿð.ÿÿø */
+ $"03FF FFF8 07FF FFFC 07FF FFFC 07FF FFFE" /* .ÿÿø.ÿÿü.ÿÿü.ÿÿþ */
+ $"07FF FFFF 07FF FFFD 07FF FFFD 07FF FFFD" /* .ÿÿÿ.ÿÿý.ÿÿý.ÿÿý */
+ $"03FF FFF9 03FF FFF9 01FF FFF9 01FF FFF9" /* .ÿÿù.ÿÿù.ÿÿù.ÿÿù */
+ $"03FF FFE1 07FF FFE1 0FFF FFC1 07FF FE01" /* .ÿÿá.ÿÿá.ÿÿÁ.ÿþ. */
+ $"13F3 F809 21E0 0031 40C0 F0F1 8113 E3E1" /* .óøÆ!à.1@Àðñ.ãá */
+ $"0211 E1E1 0410 C0C1 0810 4041 001F FFFF" /* ..áá..ÀÁ..@A..ÿÿ */
+};
+
+data 'icl4' (132) {
+ $"0000 0000 0000 0FFF FFFF F000 0000 0000" /* .......ÿÿÿð..... */
+ $"0000 0000 000F FDDD DDDD DFF0 0000 0000" /* ......ýÝÝÝßð.... */
+ $"0000 0000 00FD DDDF DDDD DDDF F000 0000" /* .....ýÝßÝÝÝßð... */
+ $"0000 0000 0FDD DDDF DCCC CCDD DF00 0000" /* .....ÝÝßÜÌÌÝß... */
+ $"0000 0000 FDDD DDFF CCCC CCCC DDF0 0000" /* ....ýÝÝÿÌÌÌÌÝð.. */
+ $"0000 000F DDDD DCCC CCCC CCCC CDDF 0000" /* ....ÝÝÜÌÌÌÌÌÍß.. */
+ $"0000 000F DDDD FCCC CCCC CCCC CCDF 0000" /* ....ÝÝüÌÌÌÌÌÌß.. */
+ $"0000 00FD DFFF FCCC CCCC CCCC CCCD F000" /* ...ýßÿüÌÌÌÌÌÌÍð. */
+ $"0000 00FD DDDD DCCC CCCC CCCC CCCF F000" /* ...ýÝÝÜÌÌÌÌÌÌÏð. */
+ $"0000 0FDD DFFF FFFF FFFF FFFF FFFF FF00" /* ...Ýßÿÿÿÿÿÿÿÿÿÿ. */
+ $"0000 0FDD CFFF FFFF FFFF FFFF FFFF FF00" /* ...ÝÏÿÿÿÿÿÿÿÿÿÿ. */
+ $"0000 0FDD 0FF0 0000 0000 0000 0000 DFF0" /* ...Ý.ð........ßð */
+ $"0000 0FDD 0FF0 0000 0003 3330 0000 DFFF" /* ...Ý.ð....30..ßÿ */
+ $"0000 0FDD 0FF0 0000 3333 3330 0000 DF0F" /* ...Ý.ð..3330..ß. */
+ $"0000 0FDD 0FF0 0333 333F F300 0000 FF0F" /* ...Ý.ð.33?ó...ÿ. */
+ $"0000 0FDD CFF0 0033 3FFF F300 0000 7F0F" /* ...ÝÏð.3?ÿó..... */
+ $"0000 00FD DFF0 0033 3FFF 3300 0000 F00F" /* ...ýßð.3?ÿ3...ð. */
+ $"0000 00FD DFF0 0003 33FF 3000 000D F00F" /* ...ýßð..3ÿ0..Âð. */
+ $"0000 000F DFF0 0000 3333 3000 000D F00F" /* ....ßð..330..Âð. */
+ $"0000 000F DFF0 0000 0333 3000 00DF F00F" /* ....ßð...30..ßð. */
+ $"0000 00F1 FFFD 0000 0033 0000 0FF0 000F" /* ...ñÿý...3...ð.. */
+ $"0000 0F1F 0FDD D000 0003 000F 7FF0 000F" /* .....ÝÐ......ð.. */
+ $"0000 F1F0 FBFF DDC0 0000 000F FFD0 000F" /* ..ñðûÿÝÀ....ÿÐ.. */
+ $"0000 DF0F BFBF FFDD 0000 0FFD DD00 000F" /* ..ß.¿¿ÿÝ...ýÝ... */
+ $"000F BBFB FBFF DDFF FFFF FDDD 0000 300F" /* ..»ûûÿÝÿÿÿýÝ..0. */
+ $"00FB 1BBF BFFD D0DD DDDD DD00 0033 000F" /* .û.¿¿ýÐÝÝÝÝ..3.. */
+ $"0FB0 BBBB FFDD 0000 33F3 0000 33F3 000F" /* .°»»ÿÝ..3ó..3ó.. */
+ $"FB1B BBBF DDDF 0033 3F30 0033 3F30 000F" /* û.»¿Ýß.3?0.3?0.. */
+ $"B0BB BBFD 000F 0003 F330 0003 F330 000F" /* °»»ý....ó0..ó0.. */
+ $"1BBB BFD0 000F 0000 3300 0000 3300 000F" /* .»¿Ð....3...3... */
+ $"BBBB FD00 000F C000 0300 0000 0300 000F" /* »»ý...À......... */
+ $"0000 0000 000F FFFF FFFF FFFF FFFF FFFF" /* ......ÿÿÿÿÿÿÿÿÿÿ */
+};
+
+data 'TIBR' (0, "Owner resource") {
+ $"00" /* . */
+};
diff --git a/private/oleauto/sample/tibrowse/tibrowse.rc b/private/oleauto/sample/tibrowse/tibrowse.rc
new file mode 100644
index 000000000..b88617ce9
--- /dev/null
+++ b/private/oleauto/sample/tibrowse/tibrowse.rc
@@ -0,0 +1,33 @@
+#include "windows.h"
+#include "resource.h"
+
+
+TIBROWSE ICON DISCARDABLE "TIBROWSE.ICO"
+
+TIBROWSE DIALOG DISCARDABLE -32768, 0, 272, 192
+STYLE WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU
+CAPTION "Type Library Browser"
+CLASS "TiBrowse"
+FONT 8, "System"
+BEGIN
+ LTEXT "&Type",IDC_STATIC,10,10,62,9
+ LISTBOX IDC_TYPELIST,10,20,80,80,LBS_NOINTEGRALHEIGHT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Members",IDC_STATIC,100,10,62,9
+ LISTBOX IDC_MEMBERLIST,100,20,80,80,LBS_NOINTEGRALHEIGHT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Parameters",IDC_STATIC,190,10,62,9
+ LISTBOX IDC_PARAMLIST,190,20,75,80,LBS_NOINTEGRALHEIGHT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "",IDC_HELPSTRING,60,170,205,18
+ CONTROL "",IDC_HELPCONTEXT,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,
+ 60,155,140,7
+ LTEXT "Help String:",IDC_STATIC,10,170,45,8
+ LTEXT "Help Context:",IDC_STATIC,10,155,45,8
+ LTEXT "Type Kind:",IDC_STATIC,10,110,45,8
+ LTEXT "",IDC_TYPEKIND,60,110,140,8
+ LTEXT "GUID:",IDC_STATIC,10,140,45,8
+ LTEXT "",IDC_GUID,60,140,160,8
+ LTEXT "Version:",IDC_STATIC,10,125,45,8
+ LTEXT "",IDC_VERSION,60,125,140,8
+END
diff --git a/private/oleauto/sample/tomac.cmd b/private/oleauto/sample/tomac.cmd
new file mode 100644
index 000000000..d1d67eb9b
--- /dev/null
+++ b/private/oleauto/sample/tomac.cmd
@@ -0,0 +1,50 @@
+@echo off
+set srcdir=c:\oledisp\sample
+
+echo Copying %srcdir%\dispcalc\dispcalc
+%vbatools%\win32\mac\bin\ec copy -r -t APPL -c DCLC %srcdir%\dispcalc\dispcalc :HD:oa:dispcalc
+if errorlevel 1 goto cantCopy
+
+echo Copying %srcdir%\dispdemo\dispdemo
+%vbatools%\win32\mac\bin\ec copy -r -t APPL -c ???? %srcdir%\dispdemo\dispdemo :HD:oa:dispdemo
+if errorlevel 1 goto cantCopy
+
+echo Copying %srcdir%\spoly\spoly
+%vbatools%\win32\mac\bin\ec copy -r -t APPL -c SPLy %srcdir%\spoly\spoly :HD:oa:spoly
+if errorlevel 1 goto cantCopy
+
+echo Copying %srcdir%\spoly2\spoly2
+%vbatools%\win32\mac\bin\ec copy -r -t APPL -c SPL2 %srcdir%\spoly2\spoly2 :HD:oa:spoly2
+if errorlevel 1 goto cantCopy
+
+echo Copying %srcdir%\dspcalc2\dspcalc2
+%vbatools%\win32\mac\bin\ec copy -r -t APPL -c DCL2 %srcdir%\dspcalc2\dspcalc2 :HD:oa:dspcalc2
+if errorlevel 1 goto cantCopy
+
+echo Copying %srcdir%\dspcalc2\stdole.tlb
+%vbatools%\win32\mac\bin\ec copy -t OTLB -c ???? %srcdir%\dspcalc2\stdole.tlb ":HD:oa:Standard OLE Types"
+if errorlevel 1 goto cantCopy
+
+echo Copying %srcdir%\dspcalc2\dspcalc2.tlb
+%vbatools%\win32\mac\bin\ec copy -t OTLB -c ???? %srcdir%\dspcalc2\dspcalc2.tlb :HD:oa:dspcalc2.tlb
+if errorlevel 1 goto cantCopy
+
+echo Copying %srcdir%\tibrowse\tibrowse
+%vbatools%\win32\mac\bin\ec copy -r -t APPL -c ???? %srcdir%\tibrowse\tibrowse :HD:oa:tibrowse
+if errorlevel 1 goto cantCopy
+
+REM no hello for the mac yet...
+REM echo Copying %srcdir%\hello\hello
+REM %vbatools%\win32\mac\bin\ec copy -r -t APPL -c olea %srcdir%\hello\hello :HD:oa:hello
+REM if errorlevel 1 goto cantCopy
+
+echo Done.
+
+goto done
+
+
+:cantCopy
+echo ******** CAN'T COPY *******
+
+
+:done
diff --git a/private/oleauto/sample/toppc.cmd b/private/oleauto/sample/toppc.cmd
new file mode 100644
index 000000000..a40da0ad4
--- /dev/null
+++ b/private/oleauto/sample/toppc.cmd
@@ -0,0 +1,86 @@
+@echo off
+echo on
+if '%OLEPROG%' == '' then goto Error
+set srcdir=%OLEPROG%\sample
+if '%MACVOL%' == '' set MACVOL=HD
+
+set destdir=:%MACVOL%:oledisp
+if '%2' == '' goto gotdest
+set destdir=:%MACVOL%:%2
+:gotdest
+
+if not '%1' == '' goto %1
+:Dispcalc
+echo Copying %srcdir%\dispcalc\dispcalc and dispcalc.pef
+%vbatools%\win32\ppc\bin\mfile copy -t APPL -c DCLC %srcdir%\dispcalc\dispcalc.pef %destdir%:dispcalc
+if errorlevel 1 goto cantCopy
+%vbatools%\win32\ppc\bin\mfile copy -r -t APPL -c DCLC %srcdir%\dispcalc\dispcalc %destdir%:dispcalc
+if errorlevel 1 goto cantCopy
+if not '%1' == '' goto CopyOle
+
+:spoly
+echo Copyint %srcdir%\spoly\spoly and spoly.pef
+%vbatools%\win32\ppc\bin\mfile copy -t APPL -c SPLy %srcdir%\spoly\spoly.pef %destdir%:spoly
+if errorlevel 1 goto cantCopy
+%vbatools%\win32\ppc\bin\mfile copy -r -t APPL -c SPLy %srcdir%\spoly\spoly %destdir%:spoly
+if errorlevel 1 goto cantCopy
+if not '%1' == '' goto CopyOle
+
+:spoly2
+%vbatools%\win32\ppc\bin\mfile copy -t APPL -c SPL2 %srcdir%\spoly2\spoly2.pef %destdir%:spoly2
+if errorlevel 1 goto cantCopy
+%vbatools%\win32\ppc\bin\mfile copy -r -t APPL -c SPL2 %srcdir%\spoly2\spoly2 %destdir%:spoly2
+if errorlevel 1 goto cantCopy
+if not '%1' == '' goto CopyOle
+
+:dispdemo
+%vbatools%\win32\ppc\bin\mfile copy -t APPL -c DDMO %srcdir%\dispdemo\dispdemo.pef %destdir%:dispdemo
+if errorlevel 1 goto cantCopy
+%vbatools%\win32\ppc\bin\mfile copy -r -t APPL -c DDMO %srcdir%\dispdemo\dispdemo %destdir%:dispdemo
+if errorlevel 1 goto cantCopy
+if not '%1' == '' goto CopyOle
+
+:tibrowse
+%vbatools%\win32\ppc\bin\mfile copy -t APPL -c TIBR %srcdir%\tibrowse\tibrowse.pef %destdir%:tibrowse
+if errorlevel 1 goto cantCopy
+%vbatools%\win32\ppc\bin\mfile copy -r -t APPL -c TIBR %srcdir%\tibrowse\tibrowse %destdir%:tibrowse
+if errorlevel 1 goto cantCopy
+if not '%1' == '' goto CopyOle
+
+:dspcalc2
+@ECHO COPYING DSPCALC2
+%vbatools%\win32\ppc\bin\mfile copy -t APPL -c DCL2 %srcdir%\dspcalc2\dspcalc2.pef %destdir%:dspcalc2
+if errorlevel 1 goto cantCopy
+%vbatools%\win32\ppc\bin\mfile copy -r -t APPL -c DCL2 %srcdir%\dspcalc2\dspcalc2 %destdir%:dspcalc2
+if errorlevel 1 goto cantCopy
+
+%vbatools%\win32\ppc\bin\mfile copy -t OTLB -c Ole2 %srcdir%\dspcalc2\dspcalc2.tlb %destdir%:dspcalc2.tlb
+if errorlevel 1 goto cantCopy
+
+%vbatools%\win32\ppc\bin\mfile copy -t OTLB -c Ole2 %srcdir%\dspcalc2\stdole.tlb "%destdir%:Standard Ole Types (PowerMac)"
+if errorlevel 1 goto cantCopy
+
+:CopyOle
+echo COPYING ole2auto.dll and vba.dll into subdirectories for testing
+echo purposes.
+
+if not '%1' == '' goto specific
+for %%a in (dispdemo spoly spoly2 tibrowse dspcalc2) do copy %vba93%\dppcns\ole2auto.dll "%%a\MicrosoftOLE2AutomationLib"
+REM for %%a in (dispdemo spoly spoly2 tibrowse dspcalc2) do copy %vba93%\dppcns\ole2auto.pdb %%a
+goto done
+
+:specific
+copy %vba93%\dppcns\ole2auto.dll "%1\MicrosoftOLE2AutomationLib"
+REM copy %vba93%\dppcns\ole2auto.pdb %1
+
+goto done
+
+:Error
+Echo Please make environment OLEPROG and VBATOOLS set
+
+:cantCopy
+echo ******** CAN'T COPY *******
+
+
+:done
+echo Done.
diff --git a/private/oleauto/src/dispatch/asmhelp.c b/private/oleauto/src/dispatch/asmhelp.c
new file mode 100644
index 000000000..72526a8d0
--- /dev/null
+++ b/private/oleauto/src/dispatch/asmhelp.c
@@ -0,0 +1,55 @@
+/***
+*asmhelp.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Misc asm interfacing stuff.
+*
+*
+*Revision History:
+*
+* [00] 03-Jun-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+
+/* Max and min floating point values that can fit in a currency
+ * Used for overflow detection in some of the currency coersion routines.
+ * Numbers are scaled by 10,000
+ */
+
+#if _MAC
+#pragma code_seg("OLECONV")
+double __declspec(allocate("_CODE")) g_dblMaxPosCy = 9.223372036854775807e+18;
+double __declspec(allocate("_CODE")) g_dblMaxNegCy = -9.223372036854775808e+18;
+#pragma code_seg()
+#else
+
+double NEARDATA g_dblMaxPosCy = 9.223372036854775807e+18;
+double NEARDATA g_dblMaxNegCy = -9.223372036854775808e+18;
+#endif
+
+/* These routines is called by some of the assembly helpers to
+ * assist in returning an appropriate HRESULT. We do this here
+ * in C because the Ole2 routines used to report an HRESULT are
+ * different and in a state of flux on our various platforms,
+ * so this helps insulate... a bit.
+ */
+INTERNAL_(HRESULT)
+ReportOverflow()
+{
+ return RESULT(DISP_E_OVERFLOW);
+}
+
+INTERNAL_(HRESULT)
+ReportInvalidarg()
+{
+ return RESULT(E_INVALIDARG);
+}
+
diff --git a/private/oleauto/src/dispatch/assert.cpp b/private/oleauto/src/dispatch/assert.cpp
new file mode 100644
index 000000000..76d7e1585
--- /dev/null
+++ b/private/oleauto/src/dispatch/assert.cpp
@@ -0,0 +1,134 @@
+/***
+*assert.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Internal assertion support.
+*
+*Revision History:
+*
+* [00] 22-May-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+// Disable Unicode expansion for assertions
+#ifdef WIN32
+# undef UNICODE
+#endif
+
+#include "oledisp.h"
+#include "assrtdlg.h"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+#include <stdio.h> // sprintf
+
+
+#ifdef _DEBUG // {
+
+#ifndef _MAC // {
+
+// this is setup in the DLL's LibMain
+extern "C" {
+extern HINSTANCE g_hinstDLL;
+}
+
+LPSTR g_szLoc;
+LPSTR g_szMsg;
+
+BOOL EXPORT FAR PASCAL
+AssertDlgProc(
+ HWND hdlg,
+ WORD message,
+ WORD wParam,
+ LONG lParam)
+{
+ switch (message){
+ case WM_INITDIALOG:
+ SetDlgItemText(hdlg, ASSERT_ID_LOC, g_szLoc);
+ if(g_szMsg)
+ SetDlgItemText(hdlg, ASSERT_ID_MSG, g_szMsg);
+ break;
+
+ case WM_COMMAND:
+ switch(wParam){
+ case ASSERT_ID_BREAK:
+ case ASSERT_ID_EXIT:
+ case ASSERT_ID_IGNORE:
+ EndDialog(hdlg, wParam);
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+#endif // }
+
+#endif // }
+
+STDAPI_(void)
+DispAssert(
+ char FAR* szMsg,
+ char FAR* szFileName,
+ int line)
+{
+#ifdef _DEBUG // {
+
+ char rgchBuf[200];
+ char rgchLoc[200];
+
+#ifdef _MAC // {
+
+ SPRINTF(rgchLoc, "File %s, line %d", szFileName, line);
+ rgchBuf[0] = SPRINTF(
+ rgchBuf+1, "Assertion failed: %s %s\n",
+ rgchLoc, szMsg == NULL ? "" : szMsg);
+ --rgchBuf[0]; // kill the cr in string
+ DebugStr((const unsigned char FAR*)rgchBuf);
+
+#else // }{
+
+ int i;
+ FARPROC pfnAssertDlgProc;
+
+ pfnAssertDlgProc = MakeProcInstance((FARPROC)AssertDlgProc, g_hinstDLL);
+ SPRINTF(rgchBuf, "Assertion failed: ");
+ SPRINTF(rgchLoc, "File %s, line %d", szFileName, line);
+
+ OutputDebugString(rgchBuf);
+ OutputDebugString(rgchLoc);
+ if(szMsg){
+ OutputDebugString("\r\n");
+ OutputDebugString(szMsg);
+ }
+ OutputDebugString("\r\n");
+
+ g_szMsg = szMsg;
+ g_szLoc = rgchLoc;
+
+#ifdef WIN32 // required by new Daytona headers
+ i = DialogBox(g_hinstDLL, "AssertFailDlg", NULL, (DLGPROC)pfnAssertDlgProc);
+#else //WIN32
+ i = DialogBox(g_hinstDLL, "AssertFailDlg", NULL, pfnAssertDlgProc);
+#endif //WIN32
+ FreeProcInstance(pfnAssertDlgProc);
+
+ switch(i){
+ case ASSERT_ID_BREAK:
+ DebugBreak();
+ break;
+ case ASSERT_ID_EXIT:
+ FatalAppExit(0, "Assertion failure");
+ break;
+ }
+
+#endif // }
+#endif // }
+}
diff --git a/private/oleauto/src/dispatch/assert.dlg b/private/oleauto/src/dispatch/assert.dlg
new file mode 100644
index 000000000..d520400ee
--- /dev/null
+++ b/private/oleauto/src/dispatch/assert.dlg
@@ -0,0 +1,13 @@
+#include "assrtdlg.h"
+
+ASSERTFAILDLG DIALOG 72, 32, 260, 67
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "Assertion failure!"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CTEXT "", ASSERT_ID_LOC, 11, 15, 240, 8
+ CTEXT "", ASSERT_ID_MSG, 11, 28, 240, 8
+ PUSHBUTTON "&Break", ASSERT_ID_BREAK, 54, 47, 40, 14
+ PUSHBUTTON "E&xit", ASSERT_ID_EXIT, 110, 47, 40, 14
+ PUSHBUTTON "&Ignore", ASSERT_ID_IGNORE, 166, 47, 40, 14
+END
diff --git a/private/oleauto/src/dispatch/assrtdlg.h b/private/oleauto/src/dispatch/assrtdlg.h
new file mode 100644
index 000000000..2d2864efb
--- /dev/null
+++ b/private/oleauto/src/dispatch/assrtdlg.h
@@ -0,0 +1,29 @@
+/***
+*assrtdlg.h
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Constants for the assert dialog.
+*
+*Revision History:
+*
+* [00] 05-Jun-92 bradlo: Added header.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef _ASSRTDLG_H_
+#define _ASSRTDLG_H_
+
+#define ASSERT_ID_BREAK 5103
+#define ASSERT_ID_EXIT 5104
+#define ASSERT_ID_IGNORE 5105
+#define ASSERT_ID_LOC 5106
+#define ASSERT_ID_EXPR 5107
+#define ASSERT_ID_MSG 5108
+
+#endif
+
diff --git a/private/oleauto/src/dispatch/bstr.cpp b/private/oleauto/src/dispatch/bstr.cpp
new file mode 100644
index 000000000..4f82f7b8c
--- /dev/null
+++ b/private/oleauto/src/dispatch/bstr.cpp
@@ -0,0 +1,615 @@
+/***
+*bstr.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The module contains the implementation of the BSTR API.
+*
+*
+*Revision History:
+*
+* [00] 24-Apr-93 bradlo: Created
+* [01] 27-Apr-93 tomteng: Add Unicode support for WIN32
+*
+*Implementation Notes:
+*
+* BSTR is implemented as a NULL terminated string with a unsigned
+* long length field prefix. The length field indicates the number
+* of 'characters' defined in the BSTR, where 'character' is define
+* as bytes for ANSI and word (16-bits) for Unicode BSTR.
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+ASSERTDATA
+
+#if OE_WIN16
+
+// Answer if there is room for the given count of bytes between the
+// given pointer, and the end of its segment.
+//
+// (64k - offset(ptr)) >= cb ?
+//
+#define PTROFFSET(PV) \
+ ((USHORT)*(USHORT FAR*)&(PV))
+
+#define ROOMINSEG(PV, CB) \
+ (((1024UL*64UL) - (DWORD)PTROFFSET(PV)) >= (CB))
+
+#endif
+
+// only turn on BSTR cache for WIN32 builds at the moment
+#define CACHE OE_WIN32
+
+#if CACHE
+#define ROUNDUP 1 // round up string alloc requests to nearest N-byte
+ // boundary, since allocator will round up anyway.
+ // improves cache hits.
+
+#define ALLOC_ALIGN (4 - 1) // UNDONE: optimal for Chicago is 4
+ // UNDONE: optimal for Daytona is 32
+ // UNDONE: 4 didn't help the a$ = a$ + "x" case at all.
+ // UNDONE: 8 did (gave 50% cache hit)
+#define ALIGN_MASK ~ALLOC_ALIGN
+
+#define CB_MAX_CACHE 0x0000ffff // biggest block we'll cache
+#ifdef _DEBUG
+#define PROFILE 0 // TEMPORARY TESTING
+#endif //DEBUG
+#if PROFILE
+DWORD g_cAllocTot = 0;
+DWORD g_cReallocTot = 0;
+DWORD g_cFreeTot = 0;
+DWORD g_cAllocHits = 0;
+DWORD g_cFreeHits = 0;
+#endif //PROFILE
+
+#endif //CACHE
+
+
+// these routines are not needed for network automation
+#if !defined(NETDISP)
+/***
+*BSTR SysAllocString(char*)
+*Purpose:
+* UNDONE
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = BSTR, NULL if allocation failed
+*
+***********************************************************************/
+STDAPI_(BSTR)
+SysAllocString(const OLECHAR FAR* psz)
+{
+ if(psz == NULL)
+ return NULL;
+
+ return SysAllocStringLen(psz, STRLEN(psz));
+}
+
+
+/***
+*BSTR SysAllocStringLen(char*, unsigned int)
+*Purpose:
+* UNDONE
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = BSTR, NULL if the allocation failed.
+*
+***********************************************************************/
+STDAPI_(BSTR)
+SysAllocStringLen(const OLECHAR FAR* psz, unsigned int len)
+{
+ BSTR bstr;
+ IMalloc FAR* pmalloc;
+ DWORD cbTotal;
+#if CACHE
+ APP_DATA *pappdata;
+#endif //CACHE
+
+#if OE_WIN32
+#if ROUNDUP
+ cbTotal = ((DWORD)len*2 + sizeof(DWORD) + 2L + ALLOC_ALIGN) & ALIGN_MASK;
+#else //ROUNDUP
+ cbTotal = (DWORD)len*2 + sizeof(DWORD) + 2L;
+#endif //ROUNDUP
+#else
+ cbTotal = (DWORD)len + sizeof(DWORD) + 1L;
+#endif
+
+#if OE_WIN16
+ // BSTRs are limited to 64k on Win16
+ if(cbTotal > 65535)
+ return NULL;
+#endif
+
+#if CACHE
+#if PROFILE
+ g_cAllocTot++;
+#endif //PROFILE
+ if (FAILED(GetAppData(&pappdata)))
+ return NULL;
+ if (pappdata->m_cbFreeBlock >= cbTotal) {
+ // found big enough block in cache
+ bstr = pappdata->m_pbFreeBlock;
+ pappdata->m_cbFreeBlock = 0;
+#if PROFILE
+ g_cAllocHits++;
+#endif //PROFILE
+ goto GotBlock;
+ }
+ pmalloc = pappdata->m_pimalloc;
+
+#else //CACHE
+ if(GetMalloc(&pmalloc) != NOERROR)
+ return NULL;
+#endif //CACHE
+
+ bstr = (BSTR)pmalloc->Alloc(cbTotal);
+
+ if(bstr != NULL){
+#if OE_WIN16
+ // Even if IMalloc was able to allocate the ammount we asked
+ // for, we need to make sure that there is enough room in the
+ // first segment of the allocation for the string, because BSTRs
+ // aren't HUGE pts on Win16.
+ //
+ if(!ROOMINSEG(bstr, cbTotal))
+ {
+ pmalloc->Free(bstr);
+ bstr = NULL;
+ }
+ else
+#endif
+
+#if CACHE
+GotBlock:
+#endif //CACHE
+
+ {
+#if OE_WIN32
+ *(DWORD FAR*)bstr = (DWORD)len*2;
+
+ bstr = (WCHAR*) ((char*) bstr + sizeof(DWORD));
+
+ if(psz != NULL){
+ MEMCPY(bstr, psz, len*2);
+ }
+
+ bstr[len] = L'\0'; // always 0 terminate
+
+#else
+ *(DWORD FAR*)bstr = (DWORD)len;
+
+ bstr += sizeof(DWORD);
+
+ if(psz != NULL){
+ MEMCPY(bstr, psz, len);
+ }
+
+ bstr[len] = '\0'; // always 0 terminate
+#endif
+
+ }
+ }
+
+ return bstr;
+}
+
+
+/***
+*int SysReAllocString(BSTR*, char*)
+*Purpose:
+* UNDONE
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = int. TRUE = success, FALSE = failure
+*
+***********************************************************************/
+STDAPI_(int)
+SysReAllocString(BSTR FAR* pbstr, const OLECHAR FAR* psz)
+{
+ if(psz == NULL)
+ {
+ SysFreeString(*pbstr);
+ *pbstr = NULL;
+ return TRUE;
+ }
+
+ return SysReAllocStringLen(pbstr, psz, STRLEN(psz));
+}
+
+
+/***
+*int SysReAllocStringLen(BSTR*, char*, unsigned int)
+*Purpose:
+* UNDONE
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = int. TRUE = success, FALSE = failure
+*
+***********************************************************************/
+STDAPI_(int)
+SysReAllocStringLen(BSTR FAR* pbstr, const OLECHAR FAR* psz, unsigned int len)
+{
+ BSTR bstr;
+ IMalloc FAR* pmalloc;
+ DWORD cbTotal;
+
+#if OE_WIN32
+#if ROUNDUP
+ cbTotal = ((DWORD)len*2 + sizeof(DWORD) + 2L + ALLOC_ALIGN) & ALIGN_MASK;
+#else //ROUNDUP
+ cbTotal = (DWORD)len*2 + sizeof(DWORD) + 2L;
+#endif //ROUNDUP
+#else
+ cbTotal = (DWORD)len + sizeof(DWORD) + 1L;
+#endif
+
+#if OE_WIN16
+ // BSTRs are limited to 64k on Win16
+ if(cbTotal > 65535)
+ return NULL;
+#endif
+
+ if(GetMalloc(&pmalloc) != NOERROR)
+ return NULL;
+
+ bstr = *pbstr;
+ if (bstr != NULL)
+ {
+ if (psz == bstr)
+ psz = NULL; // don't do a copy to self
+ bstr -= sizeof(long) / sizeof(*bstr);
+ }
+
+#if PROFILE
+ g_cReallocTot++;
+#endif //PROFILE
+ bstr = (BSTR)pmalloc->Realloc(bstr, cbTotal);
+ if(bstr == NULL)
+ return FALSE;
+
+#if OE_WIN16
+ // Even if IMalloc was able to allocate the ammount we asked
+ // for, we need to make sure that there is enough room in the
+ // first segment of the allocation for the string, because BSTRs
+ // aren't HUGE pts on Win16.
+ //
+ if(!ROOMINSEG(bstr, cbTotal))
+ {
+ pmalloc->Free(bstr);
+ bstr = NULL;
+ }
+ else
+#endif
+ {
+#if OE_WIN32
+ *(DWORD FAR*)bstr = (DWORD)len*2;
+ bstr = (WCHAR*) ((char*) bstr + sizeof(DWORD));
+
+ if(psz != NULL)
+ MEMCPY(bstr, psz, len*2);
+
+ bstr[len] = L'\0'; // always 0 terminate
+
+#else
+ *(DWORD FAR*)bstr = (DWORD)len;
+ bstr += sizeof(DWORD);
+
+ if(psz != NULL)
+ MEMCPY(bstr, psz, len);
+
+ bstr[len] = '\0'; // always 0 terminate
+#endif
+ }
+
+ *pbstr = bstr;
+ return TRUE;
+}
+
+
+/***
+*void SysFreeString(BSTR)
+*Purpose:
+* Free the given BSTR.
+*
+*Entry:
+* bstr = the BSTR to free
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDAPI_(void)
+SysFreeString(BSTR bstr)
+{
+ IMalloc FAR* pmalloc;
+
+
+ if(bstr == NULL)
+ return;
+
+#if OE_WIN32
+ bstr = (WCHAR*) ((char *) bstr - sizeof(DWORD));
+#else
+ bstr -= sizeof(DWORD);
+#endif
+
+#if CACHE
+#if ROUNDUP
+ DWORD cbFree = (*((DWORD FAR*)bstr) + sizeof(DWORD) + 2L + ALLOC_ALIGN) & ALIGN_MASK;
+#else //ROUNDUP
+ DWORD cbFree = *((DWORD FAR*)bstr) + sizeof(DWORD) + 2L;
+#endif //ROUNDUP
+#if PROFILE
+ g_cFreeTot++;
+#endif //PROFILE
+ APP_DATA * pappdata = Pappdata();
+ if (pappdata == NULL) {
+ // we MUST be being called after OleUninitialize. This is wierd,
+ // but I don't want to do a GetAppData in this case (init's way too
+ // much stuff to just do a free. So just do it the fat way instead.
+ if (FAILED(CoGetMalloc(MEMCTX_TASK, &pmalloc)))
+ return;
+ pmalloc->Free(bstr);
+ pmalloc->Release();
+ return;
+ }
+ if (cbFree > pappdata->m_cbFreeBlock && cbFree <= CB_MAX_CACHE) {
+ // If this block is better than the one in the cache (if any), and
+ // is less than our threshhold for keeping memory (we don't want to
+ // hold onto too much memory), then cache this block instead of
+ // freeing it.
+ if (pappdata->m_cbFreeBlock) {
+ // free the old one in the cache
+ pmalloc = pappdata->m_pimalloc;
+ ASSERT(pmalloc != NULL);
+ pmalloc->Free(pappdata->m_pbFreeBlock);
+ }
+#if PROFILE
+ else
+ g_cFreeHits++;
+#endif //PROFILE
+ // put this block in the cache
+ pappdata->m_cbFreeBlock = cbFree;
+ pappdata->m_pbFreeBlock = bstr;
+ return;
+ }
+ pmalloc = pappdata->m_pimalloc;
+ ASSERT(pmalloc != NULL);
+
+#else //CACHE
+ if(GetMalloc(&pmalloc) != NOERROR)
+ return; // REVIEW: shouldnt this be an error?
+#endif //CACHE
+
+ pmalloc->Free(bstr);
+}
+
+
+/***
+*unsigned int SysStringLen(BSTR)
+*Purpose:
+* return the length in bytes of the given BSTR.
+*
+*Entry:
+* bstr = the BSTR to return the length of
+*
+*Exit:
+* return value = unsigned int, length in bytes.
+*
+***********************************************************************/
+STDAPI_(unsigned int)
+SysStringLen(BSTR bstr)
+{
+ if(bstr == NULL)
+ return 0;
+#if OE_WIN32
+ return (unsigned int)((((DWORD FAR*)bstr)[-1]) / 2);
+#else
+ return (unsigned int)(((DWORD FAR*)bstr)[-1]);
+#endif
+}
+#endif // !NETDISP
+
+
+/***
+*PRIVATE HRESULT ErrSysAllocString(char*, BSTR*)
+*Purpose:
+* This is an implementation of SysAllocString that check for the
+* NULL return value and return the corresponding error - E_OUTOFMEMORY.
+*
+* This is simply a convenience, and this routine is only used
+* internally by the oledisp component.
+*
+*Entry:
+* psz = the source string
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_OUTOFMEMORY
+*
+* *pbstrOut = the newly allocated BSTR
+*
+***********************************************************************/
+EXTERN_C INTERNAL_(HRESULT)
+ErrSysAllocString(const OLECHAR FAR* psz, BSTR FAR* pbstrOut)
+{
+ BSTR bstrNew;
+
+
+ if(psz == NULL){
+ *pbstrOut = NULL;
+ return NOERROR;
+ }
+
+ if((bstrNew = SysAllocString(psz)) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ *pbstrOut = bstrNew;
+
+ return NOERROR;
+}
+
+
+EXTERN_C INTERNAL_(HRESULT)
+ErrSysAllocStringLen(const OLECHAR FAR* psz, unsigned int len, BSTR FAR* pbstrOut)
+{
+ BSTR bstrNew;
+
+ if((bstrNew = SysAllocStringLen(psz, len)) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ *pbstrOut = bstrNew;
+
+ return NOERROR;
+}
+
+#if OE_WIN32
+// Helper function that will correctly handle odd-length ANSI BSTR's (BSTRA's)
+EXTERN_C INTERNAL_(HRESULT)
+ErrStringCopy(BSTR bstrSrc, BSTR FAR * pbstrOut)
+{
+ BSTR bstrNew;
+
+ if((bstrNew = SysAllocStringByteLen((char FAR *)bstrSrc,
+ SysStringByteLen(bstrSrc))) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ *pbstrOut = bstrNew;
+
+ return NOERROR;
+}
+#endif //OE_WIN32
+
+// these routines are not needed for network automation
+#if !defined(NETDISP)
+#if OE_WIN32
+/************************************************************************/
+/************************ Win32 Unicode Support *************************/
+/************************************************************************/
+
+STDAPI_(unsigned int)
+SysStringByteLen(BSTR bstr)
+{
+ if(bstr == NULL)
+ return 0;
+ return (unsigned int)(((DWORD FAR*)bstr)[-1]);
+}
+
+
+STDAPI_(BSTR)
+SysAllocStringByteLen(const char FAR* psz, unsigned int len)
+{
+ BSTR bstr;
+ IMalloc FAR* pmalloc;
+ DWORD cbTotal;
+#if CACHE
+ APP_DATA *pappdata;
+#endif //CACHE
+
+#if ROUNDUP
+ cbTotal = ((DWORD)len + sizeof(DWORD) + 2L + ALLOC_ALIGN) & ALIGN_MASK;
+#else //ROUNDUP
+ cbTotal = (DWORD)len + sizeof(DWORD) + sizeof(OLECHAR);
+#endif //ROUNDUP
+
+#if CACHE
+#if PROFILE
+ g_cAllocTot++;
+#endif //PROFILE
+ if (FAILED(GetAppData(&pappdata)))
+ return NULL;
+ if (pappdata->m_cbFreeBlock >= cbTotal) {
+ // found big enough block in cache
+ bstr = pappdata->m_pbFreeBlock;
+ pappdata->m_cbFreeBlock = 0;
+#if PROFILE
+ g_cAllocHits++;
+#endif //PROFILE
+ goto GotBlock;
+ }
+ pmalloc = pappdata->m_pimalloc;
+#else //CACHE
+ if(GetMalloc(&pmalloc) != NOERROR)
+ return NULL;
+#endif //CACHE
+
+ bstr = (BSTR)pmalloc->Alloc(cbTotal);
+
+ if(bstr != NULL){
+#if CACHE
+GotBlock:
+#endif //CACHE
+ *(DWORD FAR*)bstr = (DWORD)len;
+
+ bstr = (WCHAR*) ((char*) bstr + sizeof(DWORD));
+
+ if(psz != NULL){
+ MEMCPY(bstr, psz, len);
+ }
+
+ *(WCHAR UNALIGNED*)((char *)bstr + len) = L'\0';
+ // always 0 terminate with a WIDE zero
+ }
+
+ return bstr;
+}
+#endif //OE_WIN32
+#endif // !NETDISP
+
+#if CACHE
+// called right before the appdata structure is being destroyed -- we release
+// any cached free block(s) here.
+STDAPI_(void) ReleaseBstrCache(APP_DATA * pappdata)
+{
+ IMalloc FAR* pmalloc;
+ if (pappdata->m_cbFreeBlock) {
+ // free the old one in the cache
+ pmalloc = pappdata->m_pimalloc;
+ ASSERT(pmalloc != NULL);
+ pmalloc->Free(pappdata->m_pbFreeBlock);
+ pappdata->m_cbFreeBlock = 0;
+#if PROFILE
+ g_cFreeHits--; // make the numbers balance. We counted
+ // this as a free "hit" before, but
+ // we eventually have to free it.
+#endif //PROFILE
+ }
+
+#if PROFILE // dumps statistics about the BSTR cache
+ {
+ char buffer[256];
+
+#if 0
+ sprintf(buffer, "cAllocTot = %ld, cReallocTot = %ld, cFreeTot = %ld, cAllocHits = %ld, cFreeHits = %ld", g_cAllocTot, g_cReallocTot, g_cFreeTot, g_cAllocHits, g_cFreeHits);
+ MessageBox(NULL, buffer, "BSTR cache statistics", MB_OK);
+#else //0
+ sprintf(buffer, "BSTR cache stats: cAllocTot = %ld, cReallocTot = %ld, cFreeTot = %ld, cAllocHits = %ld, cFreeHits = %ld", g_cAllocTot, g_cReallocTot, g_cFreeTot, g_cAllocHits, g_cFreeHits);
+ OutputDebugString(buffer);
+#endif //0
+ }
+#endif //PROFILE
+}
+#endif //CACHE
diff --git a/private/oleauto/src/dispatch/bstrdate.c b/private/oleauto/src/dispatch/bstrdate.c
new file mode 100644
index 000000000..791ab433b
--- /dev/null
+++ b/private/oleauto/src/dispatch/bstrdate.c
@@ -0,0 +1,2802 @@
+/**
+*bstrdate.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the BSTR<->DATE coersion support routines.
+*
+*
+*Revision History:
+*
+* [00] 14-Feb-92 bradlo: Created.
+* [01] 25-Jul-93 bassams: DBCS enable date coersion routines.
+* [02] 15-May-94 makotom: VBA2: Enable ambiguous date format.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifdef FE_DBCS
+#include "dbcsdate.h" // DBCS date constant strings
+#endif //FE_DBCS
+
+ASSERTDATA
+
+
+#if 0
+
+INTERNAL_(HRESULT)
+StringOfInt(int, OLECHAR FAR*, int FAR* pcbLen);
+
+#endif
+
+INTERNAL_(HRESULT)
+IntOfString(LCID lcid, OLECHAR FAR*, int FAR*);
+
+#define ISWHITE(L,X) (IsCharType(L,X, C1_SPACE))
+#define ISDIGIT(L,X) (IsCharType(L,X, C1_DIGIT))
+#define ISALPHA(L,X) (IsCharType(L,X, C1_ALPHA))
+#define ISALPHANUM(L,X) (IsCharType(L,X, C1_ALPHA | C1_DIGIT))
+#define EATWHITE(L,X) while(ISWHITE((L),*(X))){++(X);}
+
+int
+IsCharType(LCID lcid, OLECHAR ch, DWORD dwType)
+{
+ WORD wOut[2];
+ OLECHAR str[2];
+ BOOL bRet;
+
+#if !OE_WIN32
+ //REVIEW: OLE GetStringTypeA seems to think ascii 0 is a digit.
+ if (ch == 0)
+ return 0;
+#endif
+
+ str[0] = ch;
+ str[1] = 0;
+
+ bRet = GETSTRINGTYPE(lcid, CT_CTYPE1, str, -1, wOut);
+
+ ASSERT(bRet);
+
+ return (int)(wOut[0]&dwType);
+}
+
+
+//---------------------------------------------------------------------
+// DATE from BSTR
+//---------------------------------------------------------------------
+
+// Date Format Ordering (DFO_*)
+
+// Note! there is code that depends on the values of the following enum
+
+enum {
+ DFO_MDY = 0,
+ DFO_DMY,
+ DFO_YMD,
+ DFO_MAX /* marker */
+};
+
+
+#ifdef FE_DBCS
+
+// Imperial Date Info
+
+#define MAX_ERA_NAMES 3
+#define MAX_EMPERORS 4
+
+typedef struct tagIMPERIALERA {
+ UDS beginDate;
+ OLECHAR FAR* szName[MAX_ERA_NAMES];
+} IMPERIALERA;
+
+
+#define MAX_REPUBLIC_NAMES 2
+#define MAX_REPUBLIC_ERAS 2
+
+typedef struct tagREPUBLICERA {
+ BOOL Before1912;
+ OLECHAR FAR* szName[MAX_REPUBLIC_NAMES];
+} REPUBLICERA;
+
+#define BADERA -1
+
+#endif // FE_DBCS
+
+
+// the following struct holds locale specific info needed
+// to parse (input) and render (output) a date string
+
+// REVIEW: the size of the fields in the following struct - the idea
+// is for them to be large enough to hold locale specific info for
+// any locale we can concieve of supporting.
+
+typedef struct tagDATEINFO {
+ LCID lcid; // LOCALE_USER_DEFAULT
+#if OE_WIN16
+ DWORD dwFlags; // flags used to build this dateinfo
+#endif //OE_WIN16
+ int dfo; // derived from LOCALE_IDATE
+ OLECHAR sz1159[12]; // AM designator
+ OLECHAR sz2359[12]; // PM designator
+ OLECHAR szDatesep[8]; // date separator character(s)
+ OLECHAR szTimesep[8]; // time separator character(s)
+ BOOL fTlzero; // does hour have leading zero?
+ BOOL fAmpm; // does time output use 24hour or Ampm format?
+
+#ifdef FE_DBCS
+ // date information specific to DBCS. Note imperial era is only valid
+ // on certain DBCS locales (Japan for now).
+ union eras {
+ IMPERIALERA impEras[MAX_EMPERORS]; // imperial era information
+ REPUBLICERA repEras[MAX_REPUBLIC_ERAS]; // republic eras for taiwan
+ OLECHAR FAR* dbEraName; // era string for simplified chinese
+ };
+ OLECHAR FAR* dbYearSuff; // year suffix DBCS character
+ OLECHAR FAR* dbMonthSuff; // month suffix DBCS character
+ OLECHAR FAR* dbDaySuff; // day suffix DBCS character
+ OLECHAR FAR* dbHourSuff; // hour suffix DBCS character
+ OLECHAR FAR* dbMinuteSuff; // minute suffix DBCS character
+ OLECHAR FAR* dbSecondSuff; // second suffix DBCS character
+ OLECHAR FAR* db1159; // hard-coded double byte AM (lcid-based)
+ OLECHAR FAR* db2359; // hard-coded double byte PM (lcid-based)
+ OLECHAR hp1159[12]; // half-pitch c.p. am string
+ OLECHAR hp2359[12]; // half-pitch c.p. pm string
+ BOOL fAmPmPrefix; // TRUE if am/pm is at start of time str
+ BOOL IsDBCS; // value of IsDBCS(pdi->lcid)
+#endif // FE_DBCS
+
+} DATEINFO;
+
+#if OE_WIN16
+DATEINFO g_diCache; // cached DATEINFO from last LCID used
+#endif // OE_WIN16
+
+
+// Date Token Types (DTT_*)
+//
+// Following is the set of tokens that can be generated from a date
+// string. Notice that the legal set of trailing separators have been
+// folded in with the date number, and month name tokens. This set
+// of tokens is chosen to reduce the number of date parse states.
+
+enum {
+ DTT_End, // '\0'
+ DTT_NumEnd, // Num[ ]*[\0]
+ DTT_NumAmpm, // Num[ ]+AmPm
+ DTT_NumSpace, // Num[ ]+^[Dsep|Tsep|'0\']
+ DTT_NumDatesep, // Num[ ]*Dsep
+ DTT_NumTimesep, // Num[ ]*Tsep
+ DTT_MonthEnd, // Month[ ]*'\0'
+ DTT_MonthSpace, // Month[ ]+^[Dsep|Tsep|'\0']
+ DTT_MonthDatesep, // Month[ ]*Dsep
+#ifdef FE_DBCS
+ DTT_NumDatesuff, // Month[ ]*DSuff
+ DTT_NumTimesuff, // Month[ ]*TSuff
+#endif // FE_DBCS
+ DTT_Unk, // unknown (not one of the following
+ DTT_Max /* marker */
+};
+
+typedef enum tagAMPM {
+ AMPM_NONE = 0,
+ AMPM_AM,
+ AMPM_PM,
+ AMPM_MAX /* marker */
+} AMPM;
+
+#ifdef FE_DBCS
+// DBCS Suffix formats
+typedef enum tagSuffixes {
+ SUFFIX_NONE,
+ SUFFIX_YEAR,
+ SUFFIX_MONTH,
+ SUFFIX_DAY,
+ SUFFIX_HOUR,
+ SUFFIX_MINUTE,
+ SUFFIX_SECOND,
+ SUFFIX_MAX
+} SUFFIX;
+#endif // FE_DBCS
+
+typedef struct tagDATETOK {
+ int dtt; // token type
+ int num; // DTT_Num*, DTT_Month*
+ AMPM ampm; // DTT_NumAmpm
+#ifdef FE_DBCS
+ SUFFIX suffix;
+#endif // FE_DBCS
+} DATETOK;
+
+
+typedef struct tagDATERAW {
+ AMPM ampm; // ampm designator, if any
+ int num[3]; // parsed numbers, as they appear left to right
+ int FAR* pnum;
+ int month; // index of the month (if any), 1-12
+} DATERAW;
+
+PRIVATE_(BOOL) DayOfNN(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds);
+PRIVATE_(BOOL) DayOfNNN(DATERAW FAR* praw, DATEINFO FAR*pdi, UDS FAR* puds);
+PRIVATE_(BOOL) DayOfMN(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds);
+PRIVATE_(BOOL) DayOfMNN(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds);
+PRIVATE_(void) AdjustTime(UDS FAR* puds, AMPM ampm);
+#ifdef FE_DBCS
+PRIVATE_(BOOL) AdjustUDSTime(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds);
+PRIVATE_(BOOL) AdjustUDSDate(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds);
+PRIVATE_(BOOL) IsImperialEra(OLECHAR FAR* FAR* pszIn, DATEINFO FAR* pdi, int FAR* year);
+PRIVATE_(BOOL) IsRepublicEra(OLECHAR FAR* FAR* pszIn, DATEINFO FAR* pdi, int FAR* year);
+PRIVATE_(int) GetImperialEra(UDS FAR* pdate, DATEINFO FAR* pdi);
+#endif // FE_DBCS
+
+/***
+*PRIVATE int MonthNumOfMonthName(char*, DATEINFO*)
+*Purpose:
+* return the (one-based) number of the month with the given
+* (locale specific) month name.
+*
+*Entry:
+* psz = the name of the month to lookup.
+* pdi = the locale specific dateinfo
+*
+*Exit:
+* return value = int, 0 if the month was not found, 1-12 if it was.
+*
+***********************************************************************/
+PRIVATE_(int)
+MonthNumOfMonthName(OLECHAR FAR* psz, DATEINFO FAR* pdi)
+{
+ int mm, len;
+ OLECHAR rgch[32];
+
+
+ len = STRLEN(psz);
+
+ // any prefix of 3 or more characters will match
+
+ if(len >= 3){
+
+ for(mm = 0; mm < 12; ++mm) {
+
+ // Note: the following assumes that the definitions for
+ // LOCALE_SMONTHNAME1 -> LOCALE_SMONTHNAME12 are consecutive
+ //
+ // This code also assumes that the short month name is a subset
+ // of the long month name (ie, a short month name of length n
+ // will match the first n characters of the long month name).
+
+ // REVIEW: is the following the correct action to take if the
+ // GetLocalInfo call fails?
+
+ // REVIEW: should the following try for NOUSEROVERRIDE if the
+ // call fails (its possible that the user may have modified
+ // the following value to an empty string)
+
+ if(GetLocaleInfo(pdi->lcid, LOCALE_SMONTHNAME1 + mm, rgch, sizeof(rgch)) == 0)
+ continue;
+
+ if(CompareString(pdi->lcid, NORM_IGNORECASE, psz, len, rgch, len) == 2)
+ return mm + 1;
+
+#ifdef FE_DBCS
+ if (pdi->IsDBCS) {
+ // Also check if we have an english month in the date.
+ // REVIEW: Is there a const for US lcid's.
+ if(GetLocaleInfo(0x409, LOCALE_SMONTHNAME1 + mm, rgch, sizeof(rgch)) == 0)
+ continue;
+
+ if(CompareString(0x409, NORM_IGNORECASE, psz, len, rgch, len) == 2)
+ return mm + 1;
+ }
+#endif // FE_DBCS
+ }
+ }
+
+ return 0; // not found
+}
+
+
+// this routine handles overriding the user specified locale info if the
+// user has somehow hammered their win.ini to an invalid (or nonexistant)
+// string.
+
+INTERNAL_(HRESULT)
+SafeGetLocaleInfo(LCID lcid, LCTYPE lctype, OLECHAR FAR* rgch, int size)
+{
+ int len;
+
+ len = GetLocaleInfo(lcid, lctype, rgch, size);
+ if(len < 2)
+ goto LNoUserOverride;
+
+ switch(lctype){
+ case LOCALE_IDATE:
+ if(len != 2 ||
+ (*rgch != OASTR('0') && *rgch != OASTR('1') && *rgch != OASTR('2')))
+ goto LNoUserOverride;
+ break;
+ case LOCALE_ITIME:
+ case LOCALE_ITLZERO:
+ if(len != 2 || (*rgch != OASTR('0') && *rgch != OASTR('1')))
+ goto LNoUserOverride;
+ break;
+ }
+
+ return NOERROR;
+
+LNoUserOverride:;
+
+ // if string is empty or bogus, retry with NOUSEROVERRIDE
+
+ len = GetLocaleInfo(lcid, lctype|LOCALE_NOUSEROVERRIDE, rgch, size);
+ if(len < 2)
+ return RESULT(E_FAIL);
+
+ return NOERROR;
+}
+
+
+/***
+*PRIVATE BOOL GetDateInfo(DATEINFO*)
+*Purpose:
+* Fill in the given DATEINFO structure.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = BOOL. TRUE if successful, FALSE if not
+*
+* *pdi = the filled DATEINFO struct
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+GetDateInfo(DATEINFO FAR* pdi, LCID lcid, unsigned long dwFlags)
+{
+ OLECHAR szTmp[2];
+#ifdef FE_DBCS
+ int len;
+#endif
+
+#if OE_WIN16
+ if (g_diCache.lcid == lcid && g_diCache.dwFlags == dwFlags) {
+ memcpy(pdi, &g_diCache, sizeof(DATEINFO));
+ return NOERROR;
+ }
+ // Else cache is marked invalid (lcid==-1), or cache contains info
+ // for another lcid. In either case, must build a new DATEINFO
+#endif //OE_WIN16
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ pdi->lcid = lcid;
+#ifdef FE_DBCS
+ pdi->IsDBCS = IsDBCS(lcid); // cache (it's somewhat slow)
+#endif
+
+ // date format ordering
+ // "0" = MDY, "1" = DMY, "2" = YMD
+ IfFailRet(
+ SafeGetLocaleInfo(lcid, LOCALE_IDATE | dwFlags,
+ szTmp, SIZEOFCH(szTmp)));
+
+ pdi->dfo = szTmp[0] - OASTR('0');
+ ASSERT(pdi->dfo >= 0 && pdi->dfo < DFO_MAX);
+
+ // Note: dont override the Ampm designators. If the current settings
+ // specify 24hour format, then these strings may be empty and if the
+ // user has hammered these to something bizarre - then so be it.
+
+ if(GetLocaleInfo(lcid, LOCALE_S1159 | dwFlags,
+ pdi->sz1159, SIZEOFCH(pdi->sz1159)) == 0){
+ pdi->sz1159[0] = OASTR('\0');
+ }
+
+ if(GetLocaleInfo(lcid, LOCALE_S2359 | dwFlags,
+ pdi->sz2359, SIZEOFCH(pdi->sz2359)) == 0){
+ pdi->sz2359[0] = OASTR('\0');
+ }
+#ifdef FE_DBCS
+ if (pdi->IsDBCS) {
+ len = STRLEN(pdi->sz1159)+1;
+ LCMapString(lcid, LCMAP_HALFWIDTH, pdi->sz1159, len, pdi->hp1159, len);
+ len = STRLEN(pdi->sz2359)+1;
+ LCMapString(lcid, LCMAP_HALFWIDTH, pdi->sz2359, len, pdi->hp2359, len);
+ }
+#endif
+ IfFailRet(
+ SafeGetLocaleInfo(
+ lcid, LOCALE_SDATE | dwFlags,
+ pdi->szDatesep, SIZEOFCH(pdi->szDatesep)));
+
+ IfFailRet(
+ SafeGetLocaleInfo(
+ lcid, LOCALE_STIME | dwFlags,
+ pdi->szTimesep, SIZEOFCH(pdi->szTimesep)));
+
+ // "0" == no leading zero on hour
+ // "1" == output hour with leading zero
+ //
+ IfFailRet(
+ SafeGetLocaleInfo(lcid, LOCALE_ITLZERO | dwFlags,
+ szTmp, SIZEOFCH(szTmp)));
+ ASSERT(szTmp[0] == OASTR('0') || szTmp[0] == OASTR('1'));
+ pdi->fTlzero = szTmp[0] - OASTR('0');
+
+ // "0" == use 12 hour (ampm) format
+ // "1" == use 24 hour format
+ //
+ IfFailRet(
+ SafeGetLocaleInfo(lcid, LOCALE_ITIME | dwFlags,
+ szTmp, SIZEOFCH(szTmp)));
+ ASSERT(szTmp[0] == OASTR('0') || szTmp[0] == OASTR('1'));
+ pdi->fAmpm = (szTmp[0] == OASTR('0'));
+
+#ifdef FE_DBCS
+ if (IsJapan(lcid)) {
+
+ pdi->impEras[0].beginDate.Year = 1868;
+ pdi->impEras[0].beginDate.Month = 10;
+ pdi->impEras[0].beginDate.DayOfMonth = 23;
+ pdi->impEras[0].szName[0] = OLESTR("M");
+ pdi->impEras[0].szName[1] = szJapanimpEras0Name1;
+ pdi->impEras[0].szName[2] = szJapanimpEras0Name2;
+ pdi->impEras[1].beginDate.Year = 1912;
+ pdi->impEras[1].beginDate.Month = 7;
+ pdi->impEras[1].beginDate.DayOfMonth = 30;
+ pdi->impEras[1].szName[0] = OLESTR("T");
+ pdi->impEras[1].szName[1] = szJapanimpEras1Name1;
+ pdi->impEras[1].szName[2] = szJapanimpEras1Name2;
+ pdi->impEras[2].beginDate.Year = 1926;
+ pdi->impEras[2].beginDate.Month = 12;
+ pdi->impEras[2].beginDate.DayOfMonth = 25;
+ pdi->impEras[2].szName[0] = OLESTR("S");
+ pdi->impEras[2].szName[1] = szJapanimpEras2Name1;
+ pdi->impEras[2].szName[2] = szJapanimpEras2Name2;
+ pdi->impEras[3].beginDate.Year = 1989;
+ pdi->impEras[3].beginDate.Month = 1;
+ pdi->impEras[3].beginDate.DayOfMonth = 8;
+ pdi->impEras[3].szName[0] = OLESTR("H");
+ pdi->impEras[3].szName[1] = szJapanimpEras3Name1;
+ pdi->impEras[3].szName[2] = szJapanimpEras3Name2;
+
+ pdi->dbYearSuff = szJapandbYearSuff;
+ pdi->dbMonthSuff = szJapandbMonthSuff;
+ pdi->dbDaySuff = szJapandbDaySuff;
+ pdi->dbHourSuff = szJapandbHourSuff;
+ pdi->dbMinuteSuff = szJapandbMinuteSuff;
+ pdi->dbSecondSuff = szJapandbSecondSuff;
+
+ pdi->db1159 = szJapandb1159;
+ pdi->db2359 = szJapandb2359;
+
+ } else if (IsKorea(pdi->lcid)) {
+ pdi->dbYearSuff = szKoreadbYearSuff;
+ pdi->dbMonthSuff = szKoreadbMonthSuff;
+ pdi->dbDaySuff = szKoreadbDaySuff;
+ pdi->dbHourSuff = szKoreadbHourSuff;
+ pdi->dbMinuteSuff = szKoreadbMinuteSuff;
+ pdi->dbSecondSuff = szKoreadbSecondSuff;
+
+ pdi->db1159 = szKoreadb1159;
+ pdi->db2359 = szKoreadb2359;
+
+ } else if (IsTaiwan(lcid)) {
+ pdi->dbYearSuff = szTaiwandbYearSuff;
+ pdi->dbMonthSuff = szTaiwandbMonthSuff;
+ pdi->dbDaySuff = szTaiwandbDaySuff;
+ pdi->dbHourSuff = szTaiwandbHourSuff;
+ pdi->dbMinuteSuff = szTaiwandbMinuteSuff;
+ pdi->dbSecondSuff = szTaiwandbSecondSuff;
+
+ pdi->db1159 = szTaiwandb1159;
+ pdi->db2359 = szTaiwandb2359;
+
+ pdi->repEras[0].Before1912 = TRUE;
+ pdi->repEras[0].szName[0] = szTaiwanrepEras0Name0;
+ pdi->repEras[0].szName[1] = szTaiwanrepEras0Name1;
+
+ pdi->repEras[1].Before1912 = FALSE;
+ pdi->repEras[1].szName[0] = szTaiwanrepEras1Name0;
+ pdi->repEras[1].szName[1] = szTaiwanrepEras1Name1;
+
+ } else if (IsChina(lcid)) {
+ pdi->dbYearSuff = szChinadbYearSuff;
+ pdi->dbMonthSuff = szChinadbMonthSuff;
+ pdi->dbDaySuff = szChinadbDaySuff;
+ pdi->dbHourSuff = szChinadbHourSuff;
+ pdi->dbMinuteSuff = szChinadbMinuteSuff;
+ pdi->dbSecondSuff = szChinadbSecondSuff;
+
+ pdi->db1159 = szChinadb1159;
+ pdi->db2359 = szChinadb2359;
+
+ pdi->dbEraName = szChinadbEraName;
+ } else {
+ // UNDONE: bassams: What should DBCS chars be initialized to
+ // if none of the above ???
+ }
+
+ if (pdi->IsDBCS) {
+ // UNDONE: bassams: We need to get this value from the NLS api once it
+ // is defined. For now, grab it directly from the INI file if
+ // running under win16 or win32. For all other system, set to false.
+#if OE_WIN
+#ifdef UNICODE
+ pdi->fAmPmPrefix = GetProfileIntW(OASTR("intl"), OASTR("iTimePrefix"), FALSE);
+#else //UNICODE
+ pdi->fAmPmPrefix = GetProfileInt("intl", "iTimePrefix", FALSE);
+#endif //UNICODE
+#else // MAC
+ pdi->fAmPmPrefix = FALSE;
+#endif // OE_WIN16
+ }
+
+#endif // FE_DBCS
+
+#if OE_WIN16
+ pdi->dwFlags = dwFlags; // cache hit requires both LCID and flags
+ // cache the DATEINFO for subsequent calls
+ memcpy(&g_diCache, pdi, sizeof(DATEINFO));
+#endif //OE_WIN16
+ return NOERROR;
+}
+
+// locale specific case insensitive string compare using the Ole NLS dll
+#define STRICMPA(LCID, SZ1, SZ2) \
+ (CompareString((LCID), NORM_IGNORECASE , (SZ1), -1, (SZ2), -1) - 2)
+#define STRNICMPA(LCID, SZ1, SZ2, LEN) \
+ (CompareString((LCID), NORM_IGNORECASE, (SZ1), \
+ MIN(STRLEN(SZ1),LEN), (SZ2), MIN(STRLEN(SZ2),LEN)) - 2)
+
+
+// separator types
+enum {
+ SEP_Unk,
+ SEP_End,
+ SEP_Space,
+ SEP_Am,
+ SEP_Pm,
+ SEP_Date,
+ SEP_Time,
+#ifdef FE_DBCS
+ SEP_YearSuff,
+ SEP_MonthSuff,
+ SEP_DaySuff,
+ SEP_HourSuff,
+ SEP_MinuteSuff,
+ SEP_SecondSuff,
+#endif // FE_DBCS
+ SEP_Max
+};
+
+/***
+*PRIVATE int IsImperialEra
+*Purpose:
+* Given a pointer to a str, determine if the next token is an imperial
+* era of the form: emperor offset [year-suffix]
+*
+*Exit:
+* return value = 0 Not imperial era
+* 1 Imperial era. year contains equivalent gregorian year
+* or BADERA. No suffix specified.
+* 2 Imperial era with a suffix. year contains equivalent
+* gregorian year.
+*
+***********************************************************************/
+#ifdef FE_DBCS
+PRIVATE_(int)
+IsImperialEra(OLECHAR FAR* FAR* pszIn, DATEINFO FAR* pdi, int FAR* year)
+{
+ int emperorIndex, nameIndex, tmpIndex = 0;
+ IMPERIALERA emperor;
+ OLECHAR szTmp[32];
+ OLECHAR *pszTmp = *pszIn;
+
+ // search for emperor name in the emperor structure.
+
+ ASSERT(IsJapan(pdi->lcid));// Lcid must be Japan to call this function
+
+ for (emperorIndex = 0; emperorIndex < MAX_EMPERORS; emperorIndex++) {
+ emperor = pdi->impEras[emperorIndex];
+
+ for (nameIndex = MAX_ERA_NAMES-1; nameIndex >= 0; nameIndex--) {
+
+ //NOTE: code below depends on the emperor names to be sorted based
+ //on the length of the szName string:
+ // strlen(szName[0]) <= strlen(szName[1]) <= strlen(szName[2]) ...
+
+ if (!STRNICMPA(pdi->lcid, pszTmp, emperor.szName[nameIndex],
+ STRLEN(emperor.szName[nameIndex]))) {
+
+ // found emperor; skip over name to the index of emperor era.
+ pszTmp += STRLEN(emperor.szName[nameIndex]);
+ EATWHITE(pdi->lcid, pszTmp);
+ if(STRCHR(pdi->szDatesep, *pszTmp) ||
+ STRCHR(OASTR(",/-"), *pszTmp) ) {
+
+ // skip over date separator
+ pszTmp++;
+ }
+ EATWHITE(pdi->lcid, pszTmp);
+
+ if (!ISDIGIT(pdi->lcid, *pszTmp))
+ return 0;
+
+ // calculate "offset" into imperial era.
+ while (ISDIGIT(pdi->lcid, *pszTmp) && pszTmp != 0) {
+ szTmp[tmpIndex++] = *pszTmp;
+ pszTmp++;
+ }
+ szTmp[tmpIndex] = 0;
+ IntOfString(pdi->lcid, szTmp, year); // REVIEW: check return value?
+
+ if (*year <= 0) {
+ *year = BADERA;
+ return 1;
+ }
+
+ // calcualate gergorian year from "offset" into imperial era.
+ *year += emperor.beginDate.Year -1;
+
+ // validate imperial era.
+ if (emperorIndex < MAX_EMPERORS &&
+ (*year < emperor.beginDate.Year ||
+ (emperorIndex == 3 ? 0 :
+ *year > pdi->impEras[emperorIndex+1].beginDate.Year))) {
+ *year = BADERA;
+ return 1;
+ }
+ // era found: Year now contains either the appropriate
+ // gregorian year or BADERA; Eat up the year
+ // suffix if one exists and return TRUE.
+
+ EATWHITE(pdi->lcid, pszTmp);
+
+ // REVIEW: assuming year suffix is always 1 db char.
+ if( !STRNICMPA(pdi->lcid, pszTmp, pdi->dbYearSuff, 2) ) {
+ *pszIn = pszTmp+2;
+ return 2;
+
+ } else if(STRCHR(pdi->szDatesep, *pszTmp) ||
+ STRCHR(OASTR(",/-"), *pszTmp) ) {
+
+ // skip over date separator
+ pszTmp++;
+ }
+
+
+ *pszIn = pszTmp;
+ return 1;
+ }
+ }
+ }
+ return 0; // No imperial era found. year is undefined.
+}
+
+
+/***
+*PRIVATE int IsRepublicEra
+*Purpose:
+* Given a pointer to a str, determine if the next token is an republic
+* era for simplified and traditional Chinese : era offset year-suffix
+*
+*Exit:
+* return value = 0 Not republic era
+* 1 republic era. year contains equivalent gregorian year
+* or BADERA.
+*
+***********************************************************************/
+PRIVATE_(int)
+IsRepublicEra(OLECHAR FAR* FAR* pszIn, DATEINFO FAR* pdi, int FAR* year)
+{
+ int eraIndex, nameIndex, tmpIndex = 0;
+ REPUBLICERA era;
+ OLECHAR szTmp[32];
+ OLECHAR *pszTmp = *pszIn;
+
+ // search for emperor name in the emperor structure.
+ if (IsChina(pdi->lcid)) {
+ if (!STRNICMPA(pdi->lcid, pszTmp, pdi->dbEraName,
+ STRLEN(pdi->dbEraName))) {
+ *pszIn += STRLEN(pdi->dbEraName);
+ EATWHITE(pdi->lcid, *pszIn);
+ // since the era string in simplified chinese does nothing to the
+ // date, just eat it up and let the normal code path handle the year
+ // and the prefix.
+ }
+ return FALSE;
+
+ }
+
+ ASSERT(IsTaiwan(pdi->lcid));// LCID must be either china or taiwan to call this func
+
+ for (eraIndex = 0; eraIndex < MAX_REPUBLIC_ERAS; eraIndex++) {
+ era = pdi->repEras[eraIndex];
+
+ for (nameIndex = MAX_REPUBLIC_NAMES-1; nameIndex >= 0; nameIndex--) {
+
+ //NOTE: code below depends on the era names to be sorted based
+ //on the length of the szName string:
+ // strlen(szName[0]) <= strlen(szName[1]) <= strlen(szName[2]) ...
+
+ if (!STRNICMPA(pdi->lcid, pszTmp, era.szName[nameIndex],
+ STRLEN(era.szName[nameIndex]))) {
+
+ // found era; skip over name to the index of emperor era.
+ pszTmp += STRLEN(era.szName[nameIndex]);
+ EATWHITE(pdi->lcid, pszTmp);
+ if(STRCHR(pdi->szDatesep, *pszTmp) ||
+ STRCHR(OASTR(",/-"), *pszTmp) ) {
+
+ // skip over date separator
+ pszTmp++;
+ }
+ EATWHITE(pdi->lcid, pszTmp);
+
+ // calculate "offset" into republic era.
+ while (ISDIGIT(pdi->lcid, *pszTmp) && pszTmp != 0) {
+ szTmp[tmpIndex++] = *pszTmp;
+ pszTmp++;
+ }
+ szTmp[tmpIndex] = 0;
+ IntOfString(pdi->lcid, szTmp, year); // REVIEW: check return value?
+
+ if (*year <= 0) {
+ *year = BADERA;
+ return 1;
+ }
+
+ // calcualate gergorian year from republic era year
+ if (era.Before1912)
+ *year = 1912 - *year;
+ else
+ *year = 1911 + *year;
+
+ // era found: Year now contains the appropriate
+ // gregorian year
+ if (*year <= 0) {
+ *year = BADERA;
+ return 1;
+ }
+
+ EATWHITE(pdi->lcid, pszTmp);
+
+ // REVIEW: assuming year suffix is always 1 db char.
+ if(!STRNICMPA(pdi->lcid, pszTmp, pdi->dbYearSuff, 2) ) {
+ // skip past the suffix
+ *pszIn = pszTmp+2;
+ return 2;
+ } else if(STRCHR(pdi->szDatesep, *pszTmp) ||
+ STRCHR(OASTR(",/-"), *pszTmp) ) {
+
+ // skip over date separator
+ pszTmp++;
+ }
+
+ *pszIn = pszTmp;
+ return 1;
+ }
+ }
+ }
+ return 0; // No republic era found. year is undefined.
+}
+
+
+
+PRIVATE_(unsigned int)
+IsDBCSAmPm(DATEINFO *pdi, OLECHAR FAR* pszIn, unsigned int * plen)
+{
+
+ if(pdi->IsDBCS) {
+ if (pdi->hp1159[0] != 0 &&
+ !STRNICMPA(pdi->lcid, pszIn,
+ pdi->hp1159, *plen = STRLEN(pdi->hp1159)) ||
+ !STRNICMPA(pdi->lcid, pszIn,
+ pdi->db1159, *plen = STRLEN(pdi->db1159))) {
+ return AMPM_AM;
+ } else if (!STRNICMPA(pdi->lcid, pszIn, OASTR("am"), 2)) {
+ *plen = 2;
+ return AMPM_AM;
+#if !VBA2
+ } else if (!STRNICMPA(pdi->lcid, pszIn, OASTR("a"), 1)
+ && !ISALPHA(pdi->lcid, *(pszIn+1))) {
+ *plen = 1;
+ return AMPM_AM;
+#endif
+ } else if (pdi->hp2359[0] != 0 &&
+ !STRNICMPA(pdi->lcid, pszIn,
+ pdi->hp2359, *plen = STRLEN(pdi->hp2359)) ||
+ !STRNICMPA(pdi->lcid, pszIn,
+ pdi->db2359, *plen = STRLEN(pdi->db2359))) {
+ return AMPM_PM;
+ } else if (!STRNICMPA(pdi->lcid, pszIn, OASTR("pm"), 2)) {
+ *plen = 2;
+ return AMPM_PM;
+#if !VBA2
+ } else if (!STRNICMPA(pdi->lcid, pszIn, OASTR("p"), 1)
+ && !ISALPHA(pdi->lcid, *(pszIn+1))) {
+ *plen = 1;
+ return AMPM_PM;
+#endif
+ }
+ }
+ return 0;
+}
+
+
+#endif // FE_DBCS
+
+
+PRIVATE_(int)
+ddsep(OLECHAR FAR* FAR* ppsz, DATEINFO FAR* pdi, DATERAW FAR *praw)
+{
+ int sep;
+ OLECHAR rgch[32]; // REVIEW
+ OLECHAR FAR* pszIn, FAR* pszOut, FAR* pszTmp;
+#ifdef FE_DBCS
+ unsigned int len;
+ AMPM ampm;
+#endif
+
+ pszIn = *ppsz;
+ sep = SEP_Unk;
+
+ if(ISWHITE(pdi->lcid, *pszIn)){
+ EATWHITE(pdi->lcid, pszIn);
+ sep = SEP_Space;
+ }
+
+ if(*pszIn == OASTR('\0')){
+
+ sep = SEP_End;
+
+#ifdef FE_DBCS
+ // check for special case DBCS am/pm both hard-code and
+ // from the control panel.
+ } else if (ampm = IsDBCSAmPm(pdi, pszIn, &len)) {
+ pszTmp = pszIn + len;
+ EATWHITE(pdi->lcid, pszTmp);
+ if (praw->ampm || *pszTmp != 0) {
+ sep = SEP_Space;
+ goto LDone;
+ }
+ sep = (ampm == AMPM_AM ? SEP_Am : SEP_Pm);
+ pszIn = pszTmp;
+ goto LDone;
+#endif
+ }else if(ISALPHA(pdi->lcid, *pszIn)){
+
+ // check for special case strings: am/pm...
+
+ pszOut = rgch;
+ pszTmp = pszIn;
+ while(ISALPHANUM(pdi->lcid, *pszTmp)) {
+ if (pszOut >= &rgch[DIM(rgch)-1]) // overrun buffer
+ return SEP_Unk;
+ *pszOut++ = *pszTmp++;
+ }
+ *pszOut = OASTR('\0');
+
+ // make sure we didn't overwrite the buffer
+ //ASSERT(pszOut < &rgch[DIM(rgch)]);
+
+#ifdef FE_DBCS
+ // use sz1159 converted to half-pitch
+ if(pdi->IsDBCS && !STRICMPA(pdi->lcid, rgch, pdi->hp1159)){
+ sep = SEP_Am;
+ }else if(pdi->IsDBCS && !STRICMPA(pdi->lcid, rgch, pdi->hp2359)){
+ sep = SEP_Pm;
+ }else
+#endif
+ if(!STRICMPA(pdi->lcid, rgch, pdi->sz1159)){
+ sep = SEP_Am;
+ }else if(!STRICMPA(pdi->lcid, rgch, pdi->sz2359)){
+ sep = SEP_Pm;
+ }else
+#if !VBA2
+ if(!STRICMPA(pdi->lcid, rgch, OASTR("am")) ||
+ !STRICMPA(pdi->lcid, rgch, OASTR("a"))){
+#else
+ if(!STRICMPA(pdi->lcid, rgch, OASTR("am")) ||
+ (!STRICMPA(pdi->lcid, rgch, OASTR("a")) &&
+ !ISALPHA(pdi->lcid, *(rgch+1))) ){
+#endif
+ sep = SEP_Am;
+ }else
+#if !VBA2
+ if(!STRICMPA(pdi->lcid, rgch, OASTR("pm")) ||
+ !STRICMPA(pdi->lcid, rgch, OASTR("p"))){
+#else
+ if(!STRICMPA(pdi->lcid, rgch, OASTR("pm")) ||
+ !STRICMPA(pdi->lcid, rgch, OASTR("p")) &&
+ !ISALPHA(pdi->lcid, *(rgch+1)) ){
+#endif
+ sep = SEP_Pm;
+ }else
+ goto LDone;
+
+ // it was something we recognized, so accept the token.
+
+#ifdef FE_DBCS
+ if (pdi->IsDBCS) {
+ EATWHITE(pdi->lcid, pszTmp);
+ if (praw->ampm || *pszTmp != 0) {
+ sep = SEP_Space;
+ goto LDone;
+ }
+ }
+#endif
+
+ pszIn = pszTmp;
+
+ }else{
+
+ // Note: the following code assumes that a date/time
+ // separator is a single character.
+
+ if(STRCHR(pdi->szDatesep, *pszIn)){ // locale date sep
+ sep = SEP_Date;
+ ++pszIn;
+ }else if(STRCHR(pdi->szTimesep, *pszIn)){ // locale time sep
+ sep = SEP_Time;
+ ++pszIn;
+ }else if(STRCHR(OASTR(",/-"), *pszIn)){ // default date sep
+ sep = SEP_Date;
+ ++pszIn;
+ }else if(STRCHR(OASTR(".:"), *pszIn)){ // default time sep
+ sep = SEP_Time;
+ ++pszIn;
+
+#ifdef FE_DBCS
+ }else if (pdi->IsDBCS) {
+
+ // REVIEW: bassams: is the suffix always a one dbcs character?
+ if(!STRNICMPA(pdi->lcid, pszIn, pdi->dbYearSuff, 2) ){
+ sep = SEP_YearSuff;
+ pszIn += 2;
+ }else if(!STRNICMPA(pdi->lcid, pszIn, pdi->dbMonthSuff, 2) ){
+ sep = SEP_MonthSuff;
+ pszIn += 2;
+ }else if(!STRNICMPA(pdi->lcid, pszIn, pdi->dbDaySuff, 2) ){
+ sep = SEP_DaySuff;
+ pszIn += 2;
+ }else if(!STRNICMPA(pdi->lcid, pszIn, pdi->dbHourSuff, 2) ){
+ sep = SEP_HourSuff;
+ pszIn += 2;
+ }else if(!STRNICMPA(pdi->lcid, pszIn, pdi->dbMinuteSuff, 2) ){
+ sep = SEP_MinuteSuff;
+ pszIn += 2;
+ }else if(!STRNICMPA(pdi->lcid, pszIn, pdi->dbSecondSuff, 2) ){
+ sep = SEP_SecondSuff;
+ pszIn += 2;
+ }
+ if (sep == SEP_HourSuff || sep == SEP_MinuteSuff || sep == SEP_SecondSuff) {
+ EATWHITE(pdi->lcid, pszIn);
+ if (ampm = IsDBCSAmPm(pdi, pszIn, &len)) {
+ pszTmp = pszIn + len;
+ EATWHITE(pdi->lcid, pszTmp);
+ if (praw->ampm == AMPM_NONE && *pszTmp == 0) {
+ pszIn = pszTmp;
+ praw->ampm= ampm;
+ }
+ }
+ }
+#endif // FE_DBCS
+ }
+ }
+
+LDone:;
+
+ *ppsz = pszIn;
+
+ return sep;
+}
+
+
+/***
+*PRIVATE void ddlex(char**, DATEINFO*, DATETOK*)
+*Purpose:
+* This routine returns the next date token (DATETOK) in the given
+* date string, and the separator following it (if any).
+*
+*Entry:
+* ppsz = the string to lex
+* pdi = locale specific date info required to lex the date string
+*
+*Exit:
+* return value = 0 error
+* 1 successful
+*
+***********************************************************************/
+
+PRIVATE_(int)
+ddlex(OLECHAR FAR* FAR* ppsz, DATEINFO FAR* pdi, DATETOK FAR* pdtok, DATERAW FAR* praw)
+{
+ int nMonth;
+ OLECHAR rgch[32]; // REVIEW
+ OLECHAR FAR* pszIn, FAR* pszOut, FAR* pszTmp;
+#ifdef FE_DBCS
+ int year; // gregorian year from imperial era.
+ unsigned int len;
+ AMPM ampm;
+#endif // FE_DBCS
+
+
+ pszIn = *ppsz;
+ pszOut = rgch;
+ pdtok->dtt = DTT_Unk;
+#ifdef FE_DBCS
+ pdtok->suffix = SUFFIX_NONE;
+#endif // FE_DBCS
+
+ EATWHITE(pdi->lcid, pszIn);
+
+ if(*pszIn == OASTR('\0')){
+ pdtok->dtt = DTT_End;
+ goto LDone;
+ }
+
+#ifdef FE_DBCS
+ if (IsJapan(pdi->lcid)) {
+
+ switch (IsImperialEra(&pszIn, pdi, &year)) {
+ case 1:
+ pdtok->dtt = DTT_NumDatesep;
+ pdtok->num = year;
+ goto LDone;
+
+ case 2:
+ if(year == BADERA)
+ goto LDone;
+
+ pdtok->dtt = DTT_NumDatesuff;
+ pdtok->suffix = SUFFIX_YEAR;
+ pdtok->num = year;
+ goto LDone;
+ }
+ }
+
+ if (IsChina(pdi->lcid) || IsTaiwan(pdi->lcid)) {
+ switch (IsRepublicEra(&pszIn, pdi, &year)) {
+ case 1:
+ pdtok->dtt = DTT_NumDatesep;
+ pdtok->num = year;
+ goto LDone;
+
+ case 2:
+ if(year == BADERA)
+ goto LDone;
+
+ pdtok->dtt = DTT_NumDatesuff;
+ pdtok->suffix = SUFFIX_YEAR;
+ pdtok->num = year;
+ goto LDone;
+ }
+ }
+
+ if (ampm = IsDBCSAmPm(pdi, pszIn, &len)) {
+ pszTmp = pszIn + len;
+ EATWHITE(pdi->lcid, pszTmp);
+ if (praw->ampm == AMPM_NONE && *pszTmp != 0 &&
+ praw->pnum == praw->num) {
+ pszIn = pszTmp;
+ praw->ampm= ampm;
+ }
+ }
+
+#endif // FE_DBCS
+
+ if(ISALPHA(pdi->lcid, *pszIn)){
+
+ while(ISALPHANUM(pdi->lcid, *pszIn)) {
+ if (pszOut >= &rgch[DIM(rgch)-1]) return 0; // overflow buffer
+ *pszOut++ = *pszIn++;
+ }
+ *pszOut = OASTR('\0');
+
+ // Eat "." to be VB3 compatible (oob#3876) (e.g., "dec.")
+ if (*pszIn == OASTR('.'))
+ pszIn++;
+
+ if((nMonth = MonthNumOfMonthName(rgch, pdi)) != 0){
+ pszTmp = pszIn;
+
+ switch(ddsep(&pszTmp, pdi, praw)){
+ case SEP_End:
+ pdtok->dtt = DTT_MonthEnd;
+ break;
+ case SEP_Space:
+ pdtok->dtt = DTT_MonthSpace;
+ break;
+ case SEP_Date:
+ pdtok->dtt = DTT_MonthDatesep;
+ break;
+ default:
+ goto LDone; // we didnt recognize it after all
+ }
+
+ // recognized the month and the trailing separator, so accept
+
+ pszIn = pszTmp;
+ pdtok->num = nMonth;
+ }
+
+
+ }else if(ISDIGIT(pdi->lcid, *pszIn)){
+
+ while(ISDIGIT(pdi->lcid, *pszIn)) {
+ if (pszOut >= &rgch[DIM(rgch)-1]) return 0; // overflow buffer
+ *pszOut++ = *pszIn++;
+ }
+ *pszOut = OASTR('\0');
+
+ // It looks like a DTT_Num*, check the trailing separator
+
+ pszTmp = pszIn;
+ switch(ddsep(&pszTmp, pdi, praw)){
+ case SEP_End:
+ pdtok->dtt = DTT_NumEnd;
+ break;
+ case SEP_Am:
+ pdtok->ampm = AMPM_AM;
+ pdtok->dtt = DTT_NumAmpm;
+ break;
+ case SEP_Pm:
+ pdtok->ampm = AMPM_PM;
+ pdtok->dtt = DTT_NumAmpm;
+ break;
+ case SEP_Space:
+ pdtok->dtt = DTT_NumSpace;
+ break;
+ case SEP_Date:
+ pdtok->dtt = DTT_NumDatesep;
+ break;
+ case SEP_Time:
+ pdtok->dtt = DTT_NumTimesep;
+ break;
+#ifdef FE_DBCS
+ case SEP_YearSuff:
+ pdtok->dtt = DTT_NumDatesuff;
+ pdtok->suffix = SUFFIX_YEAR;
+ break;
+ case SEP_MonthSuff:
+ pdtok->dtt = DTT_NumDatesuff;
+ pdtok->suffix = SUFFIX_MONTH;
+ break;
+ case SEP_DaySuff:
+ pdtok->dtt = DTT_NumDatesuff;
+ pdtok->suffix = SUFFIX_DAY;
+ break;
+ case SEP_HourSuff:
+ pdtok->dtt = DTT_NumTimesuff;
+ pdtok->suffix = SUFFIX_HOUR;
+ break;
+ case SEP_MinuteSuff:
+ pdtok->dtt = DTT_NumTimesuff;
+ pdtok->suffix = SUFFIX_MINUTE;
+ break;
+ case SEP_SecondSuff:
+ pdtok->dtt = DTT_NumTimesuff;
+ pdtok->suffix = SUFFIX_SECOND;
+ break;
+#endif // FE_DBCS
+
+ default:
+ goto LDone; // didnt recognize it after all;
+ }
+
+ // recognized a num with a legal trailing separator, so accept
+
+ pszIn = pszTmp;
+
+ IntOfString(pdi->lcid, rgch, &pdtok->num); // REVIEW: check return value?
+
+ }
+
+LDone:;
+
+ // make sure we didn't overwrite the buffer
+ ASSERT(pszOut < &rgch[DIM(rgch)]);
+
+ if(pdtok->dtt != DTT_Unk)
+ *ppsz = pszIn;
+
+ return 1;
+}
+
+
+// Date parse States (DS_*)
+//
+// DS_* unqualified states
+// DS_D_* day parse states
+// DS_T_* time parse states
+// DS_DX_* day terminal states
+// DS_TX_* time terminal states
+
+enum
+{
+ DS_BEGIN = 0,
+ DS_N, // have one number
+ DS_NN, // have two numbers
+
+ // following are known to be part of a date
+
+ DS_D_Nd, // have number followed by date separator
+ DS_D_NN, // have 2 numbers
+ DS_D_NNd, // have 2 numbers followed by date separator
+ DS_D_M, // have a month
+ DS_D_MN, // have a month and a number
+ DS_D_MNd, // have a month and number followed by date separator
+
+ // following are known to be part of a time
+
+ DS_T_Nt, // have num followed by time separator
+ DS_T_NNt, // have 2 num followed by time separator
+
+#ifdef FE_DBCS
+ DS_D_S, // have number followed by a date suffix.
+ DS_T_S, // have number followed by a time suffix.
+#endif // FE_DBCS
+
+ DS_ERROR,
+
+ // The following are terminal states. These all have an action
+ // associated with them, and transition back to DS_BEGIN.
+
+ DS_DX_NN, // day from two numbers
+ DS_DX_NNN, // day from three numbers
+ DS_DX_MN, // day from month and one number
+ DS_DX_MNN, // day from month and two numbers
+#ifdef FE_DBCS
+ DS_DX_DS, // a set of date suffixed numbers.
+#endif // FE_DBCS
+ DS_TX_N, // time from one number (must have ampm)
+ DS_TX_NN, // time from two numbers
+ DS_TX_NNN, // time from three numbers
+#ifdef FE_DBCS
+ DS_TX_TS, // a set of time suffixed numbers.
+#endif // FE_DBCS
+
+ DS_MAX /* marker: end of enum */
+};
+
+#define DS_ISTERMINAL(X) ((X) >= DS_ERROR)
+
+
+#ifdef FE_DBCS
+
+// DPSDAT() - This macro is used to define the date parse state
+// transition table.
+//
+// the arguments are for each date token (DTT_*), in increasing order
+// (as declared)
+//
+#define DPSDAT(END, NEND, NAMPM, NSPACE, NDSEP, NTSEP, MEND, MSPACE, MDSEP, NDS, NTS) \
+ { DS_ ## END, \
+ DS_ ## NEND, \
+ DS_ ## NAMPM, \
+ DS_ ## NSPACE, \
+ DS_ ## NDSEP, \
+ DS_ ## NTSEP, \
+ DS_ ## MEND, \
+ DS_ ## MSPACE, \
+ DS_ ## MDSEP, \
+ DS_ ## NDS, \
+ DS_ ## NTS }
+
+
+// NOTE: the following table is dependent on the order of the
+// DS_ and DTT_ enumerations.
+
+// For each non terminal state, the following table defines the next state
+// for each given date token type.
+
+// End
+// NumEnd
+// NumAmPm
+// NumSpace
+// NumDaySep
+// NumTimesep
+// MonthEnd
+// MonthSpace
+// MonthDSep
+// NumDateSuff
+// NumTimeSuff
+char g_dpsNext[DS_MAX-1][DTT_Max-1] =
+{
+// DS_BEGIN
+DPSDAT( ERROR, ERROR, TX_N, N, D_Nd, T_Nt, ERROR, D_M, D_M, D_S, T_S),
+
+// DS_N
+DPSDAT( ERROR, DX_NN, ERROR, NN, D_NNd, ERROR, D_MN, D_MN, D_MNd, ERROR, ERROR),
+
+// DS_NN
+DPSDAT( DX_NN, DX_NNN, TX_N, DX_NNN, ERROR, T_Nt, DX_MNN, DX_MNN, ERROR, ERROR, T_S),
+
+// DS_D_Nd
+DPSDAT( ERROR, DX_NN, ERROR, D_NN, D_NNd, ERROR, D_MN, D_MN, D_MNd, ERROR, ERROR),
+
+// DS_D_NN
+DPSDAT( DX_NN, DX_NNN, TX_N, DX_NNN, ERROR, T_Nt, DX_MNN, DX_MNN, ERROR, DX_DS, T_S),
+
+// DS_D_NNd
+DPSDAT( ERROR, DX_NNN, ERROR, DX_NNN, ERROR, ERROR, DX_MNN, DX_MNN, ERROR, DX_DS, ERROR),
+
+// DS_D_M
+DPSDAT( ERROR, D_MN, ERROR, D_MN, D_MNd, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR),
+
+// DS_D_MN
+DPSDAT( DX_MN, DX_MNN, TX_N, DX_MNN, ERROR, T_Nt, ERROR, ERROR, ERROR, DX_DS, T_S),
+
+// DS_D_MNd
+DPSDAT( ERROR, DX_MNN, ERROR, DX_MNN, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR),
+
+// DS_T_Nt
+DPSDAT( ERROR, TX_NN, TX_NN, TX_NN, ERROR, T_NNt, ERROR, ERROR, ERROR, ERROR, T_S),
+
+// DS_T_NNt
+DPSDAT( ERROR, TX_NNN, TX_NNN, TX_NNN, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, T_S),
+
+// DS_D_S
+DPSDAT( DX_DS, ERROR, TX_N, T_Nt, ERROR, T_Nt, ERROR, ERROR, ERROR, D_S, T_S),
+
+// DS_T_S
+#if !VBA2
+DPSDAT( TX_TS, TX_TS, TX_TS, T_Nt, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, T_S),
+#else
+DPSDAT( TX_TS, TX_TS, TX_TS, T_Nt, D_Nd, ERROR, ERROR, ERROR, ERROR, D_S, T_S),
+#endif
+
+};
+
+
+
+#else // !FE_DBCS
+
+// DPSDAT() - This macro is used to define the date parse state
+// transition table.
+//
+// the arguments are for each date token (DTT_*), in increasing order
+// (as declared)
+//
+#define DPSDAT(END, NEND, NAMPM, NSPACE, NDSEP, NTSEP, MEND, MSPACE, MDSEP) \
+ { DS_ ## END, \
+ DS_ ## NEND, \
+ DS_ ## NAMPM, \
+ DS_ ## NSPACE, \
+ DS_ ## NDSEP, \
+ DS_ ## NTSEP, \
+ DS_ ## MEND, \
+ DS_ ## MSPACE, \
+ DS_ ## MDSEP }
+
+
+// NOTE: the following table is dependent on the order of the
+// DS_ and DTT_ enumerations.
+
+// For each non terminal state, the following table defines the next state
+// for each given date token type.
+
+// End
+// NumEnd
+// NumAmPm
+// NumSpace
+// NumDaySep
+// NumTimesep
+// MonthEnd
+// MonthSpace
+// MonthDSep
+char g_dpsNext[DS_MAX-1][DTT_Max-1] =
+{
+// DS_BEGIN
+DPSDAT( ERROR, ERROR, TX_N, N, D_Nd, T_Nt, ERROR, D_M, D_M),
+
+// DS_N
+DPSDAT( ERROR, DX_NN, ERROR, NN, D_NNd, ERROR, D_MN, D_MN, D_MNd),
+
+// DS_NN
+DPSDAT( DX_NN, DX_NNN, TX_N, DX_NNN, ERROR, T_Nt, DX_MNN, DX_MNN, ERROR),
+
+// DS_D_Nd
+DPSDAT( ERROR, DX_NN, ERROR, D_NN, D_NNd, ERROR, D_MN, D_MN, D_MNd),
+
+// DS_D_NN
+DPSDAT( DX_NN, DX_NNN, TX_N, DX_NNN, ERROR, T_Nt, DX_MNN, DX_MNN, ERROR),
+
+// DS_D_NNd
+DPSDAT( ERROR, DX_NNN, ERROR, DX_NNN, ERROR, ERROR, DX_MNN, DX_MNN, ERROR),
+
+// DS_D_M
+DPSDAT( ERROR, D_MN, ERROR, D_MN, D_MNd, ERROR, ERROR, ERROR, ERROR),
+
+// DS_D_MN
+DPSDAT( DX_MN, DX_MNN, TX_N, DX_MNN, ERROR, T_Nt, ERROR, ERROR, ERROR),
+
+// DS_D_MNd
+DPSDAT( ERROR, DX_MNN, ERROR, DX_MNN, ERROR, ERROR, ERROR, ERROR, ERROR),
+
+// DS_T_Nt
+DPSDAT( ERROR, TX_NN, TX_NN, TX_NN, ERROR, T_NNt, ERROR, ERROR, ERROR),
+
+// DS_T_NNt
+DPSDAT( ERROR, TX_NNN, TX_NNN, TX_NNN, ERROR, ERROR, ERROR, ERROR, ERROR)
+};
+
+#endif // FE_DBCS
+
+STDAPI
+
+VarDateFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, DATE FAR* pdateOut)
+{
+ int dps; // date parse state
+ UDS uds;
+ DATERAW raw;
+ DATEINFO di;
+ DATETOK dtok;
+ OLECHAR FAR* pch;
+ BOOL fDay, fTime;
+ HRESULT hr = RESULT(DISP_E_TYPEMISMATCH);
+
+#ifdef FE_DBCS
+#if !VBA2
+ BOOL fTimeElement = FALSE;
+#endif
+#endif
+ OLECHAR FAR* lpStr;
+
+#if HC_MPW
+ PRIVATECALLTYPE BOOL (*pfnUdsOfRaw)(DATERAW FAR*, DATEINFO FAR*, UDS FAR*);
+#else
+ BOOL (PRIVATECALLTYPE *pfnUdsOfRaw)(DATERAW FAR*, DATEINFO FAR*, UDS FAR*);
+#endif
+
+ ASSERT(!(dwFlags & ~(LOCALE_NOUSEROVERRIDE |
+ VAR_TIMEVALUEONLY |
+ VAR_DATEVALUEONLY)));
+
+
+ // aquire the locale info required to parse a date string
+
+
+ IfFailRet(GetDateInfo(&di, lcid, dwFlags & LOCALE_NOUSEROVERRIDE));
+
+#ifdef FE_DBCS
+ if(di.IsDBCS) {
+ IfFailRet(MapHalfWidth(lcid, strIn, &lpStr));
+ pch = lpStr;
+ } else
+ pch = lpStr = strIn;
+#else
+ pch = lpStr = strIn;
+#endif
+
+ dps = DS_BEGIN;
+ fDay = FALSE;
+ fTime = FALSE;
+ uds.Year = uds.Month = uds.DayOfMonth = uds.Hour = uds.Minute = uds.Second = -1;
+ raw.month = 0;
+#if VBA2
+ raw.ampm = AMPM_NONE;
+#endif
+
+ while(1){
+
+ // reset the rawdate struct, if appropriate
+
+ if(dps == DS_BEGIN){
+ raw.pnum = raw.num;
+#if !VBA2
+ raw.ampm = AMPM_NONE;
+#endif
+ }
+
+ // if not at a terminal state, then grab the next token
+ // from the input string.
+
+ if(!DS_ISTERMINAL(dps)){
+
+ if (ddlex(&pch, &di, &dtok, &raw) == 0)
+ goto LNotDate;
+
+ // default actions
+
+ switch(dtok.dtt){
+#ifdef FE_DBCS
+ // Note for suffixed DBCS numbers, we'll modifiy the uds directly
+ // (no need to use the raw struct). The functions AdjustUDSDate
+ // and AdjustUDSTime will post-process the struct for validity.
+ // The reason it is done this way is because having one state for
+ // each suffix type will require a huge state table.
+ case DTT_NumDatesuff:
+ case DTT_NumTimesuff:
+ switch (dtok.suffix) {
+ case SUFFIX_YEAR:
+#if !VBA2
+ if (fTimeElement || fTime || fDay || uds.Year != -1)
+#else
+ if (fDay || uds.Year != -1)
+#endif
+ goto LNotDate;
+ uds.Year = dtok.num;
+ break;
+ case SUFFIX_MONTH:
+#if !VBA2
+ if (fTimeElement || fTime || fDay || uds.Month != -1)
+#else
+ if (fDay || uds.Month != -1)
+#endif
+ goto LNotDate;
+ uds.Month = dtok.num;
+ break;
+ case SUFFIX_DAY:
+#if !VBA2
+ if (fTimeElement || fTime || fDay || uds.DayOfMonth != -1)
+#else
+ if (fDay || uds.DayOfMonth != -1)
+#endif
+ goto LNotDate;
+ uds.DayOfMonth = dtok.num;
+ break;
+ case SUFFIX_HOUR:
+#if !VBA2
+ if (fTime || uds.Hour != -1)
+ goto LNotDate;
+ fTimeElement = TRUE;
+#else
+ if (uds.Hour != -1)
+ goto LNotDate;
+#endif
+ uds.Hour = dtok.num;
+ break;
+ case SUFFIX_MINUTE:
+#if !VBA2
+ if (fTime || uds.Minute != -1)
+ goto LNotDate;
+ fTimeElement = TRUE;
+#else
+ if (uds.Minute != -1)
+ goto LNotDate;
+#endif
+ uds.Minute = dtok.num;
+ break;
+ case SUFFIX_SECOND:
+#if !VBA2
+ if (fTime || uds.Second != -1)
+ goto LNotDate;
+ fTimeElement = TRUE;
+#else
+ if (uds.Second != -1)
+ goto LNotDate;
+#endif
+ uds.Second = dtok.num;
+ break;
+ default:
+ ASSERT(UNREACHED);
+ break;
+
+ }
+ break;
+#endif // FE_DBCS
+ case DTT_NumAmpm:
+ // Note: if this was not a legal place for an ampm designator,
+ // then the error will be caught below in our state transition.
+ raw.ampm = dtok.ampm;
+
+ /* FALLTHROUGH */
+ case DTT_NumDatesep:
+ case DTT_NumTimesep:
+ case DTT_NumEnd:
+ case DTT_NumSpace:
+ ASSERT(raw.pnum < &raw.num[DIM(raw.num)]);
+ *raw.pnum++ = dtok.num;
+ break;
+
+ case DTT_MonthEnd:
+ case DTT_MonthSpace:
+ case DTT_MonthDatesep:
+ raw.month = dtok.num;
+ break;
+ }
+ }
+
+ // process the current state - handling special case transitional
+ // states, or executing terminal state actions.
+
+ switch(dps){
+ case DS_BEGIN:
+ if(dtok.dtt == DTT_End)
+ goto LDone;
+ break;
+
+
+ case DS_NN:
+ case DS_D_NN:
+ switch(dtok.dtt){
+ case DTT_NumAmpm:
+ case DTT_NumTimesep:
+
+ // special case: we have 3 numbers, the last of which is
+ // followed by either a timesep or an ampm marker. So we
+ // assume the first 2 were the date, and the third is the
+ // time. For example,
+ //
+ // "1 93 1 pm" would be "january 1, 1993 23:00:00"
+ //
+
+ pfnUdsOfRaw = DayOfNN;
+ goto LSpecial;
+ }
+ break;
+
+ case DS_D_MN:
+ switch(dtok.dtt){
+ case DTT_NumAmpm:
+ case DTT_NumTimesep:
+
+ // special case: we have month and two numbers, where the last
+ // number is followed by a timesep or an ampm designator. So
+ // we assume that the first month and number were the date, and
+ // the last number is the time. For example,
+ //
+ // "jan 93 1:00" would be "january 1, 1993 01:00:00"
+
+ pfnUdsOfRaw = DayOfMN;
+
+LSpecial:;
+ // compose the day
+ if(fDay || !pfnUdsOfRaw(&raw, &di, &uds))
+ goto LNotDate;
+ fDay = TRUE;
+
+ // start the time
+ raw.ampm = dtok.ampm;
+ raw.pnum = raw.num;
+ *raw.pnum++ = dtok.num;
+ break;
+ }
+ break;
+
+ // The following are terminal states that compute a UDS from a rawdate
+
+ case DS_DX_NN:
+ pfnUdsOfRaw = DayOfNN;
+ goto LDay;
+
+ case DS_DX_NNN:
+ pfnUdsOfRaw = DayOfNNN;
+ goto LDay;
+
+ case DS_DX_MN:
+ pfnUdsOfRaw = DayOfMN;
+ goto LDay;
+
+ case DS_DX_MNN:
+ pfnUdsOfRaw = DayOfMNN;
+LDay:;
+ if(fDay || !pfnUdsOfRaw(&raw, &di, &uds))
+ goto LNotDate;
+ fDay = TRUE;
+ break;
+
+ case DS_TX_N:
+ // if there is only a single time number, then we require
+ // an ampm designator
+ if(raw.ampm == AMPM_NONE)
+ goto LNotDate;
+ uds.Hour = raw.num[0];
+ uds.Minute = 0;
+ uds.Second = 0;
+ goto LTime;
+
+ case DS_TX_NN:
+ uds.Hour = raw.num[0];
+ uds.Minute = raw.num[1];
+ uds.Second = 0;
+ goto LTime;
+
+ case DS_TX_NNN:
+ uds.Hour = raw.num[0];
+ uds.Minute = raw.num[1];
+ uds.Second = raw.num[2];
+LTime:;
+ if(fTime)
+ goto LNotDate;
+#ifdef FE_DBCS
+LTime2:;
+#endif
+ AdjustTime(&uds, raw.ampm);
+ fTime = TRUE;
+#if VBA2
+ raw.ampm = AMPM_NONE;
+#endif
+ break;
+
+#ifdef FE_DBCS
+ case DS_TX_TS: // Done with time. Adjust UDS
+ if (!AdjustUDSTime(&raw, &di, &uds))
+ goto LNotDate;
+ goto LTime2; // fTime will already be set to true, so skip check
+ break;
+
+ case DS_DX_DS: // Done with date. Adjust.
+LDateSep:;
+ if (!AdjustUDSDate(&raw, &di, &uds))
+ goto LNotDate;
+ fDay = TRUE;
+ break;
+#endif // FE_DBCS
+
+ // the following are transitional states, with no special cases
+ // actions. (Note: these are split out into separate cases to
+ // make tracing the state transitions easier when debugging).
+
+ case DS_N:
+ break;
+
+ case DS_D_Nd:
+ break;
+
+ case DS_D_NNd:
+ break;
+
+ case DS_D_M:
+ break;
+
+ case DS_D_MNd:
+ break;
+
+ case DS_T_Nt:
+ break;
+
+ case DS_T_NNt:
+ break;
+
+#ifdef FE_DBCS
+ case DS_D_S: // date suffix.
+ // this case is handled differently. If the next token is not a
+ // date-suffixed number, it means we are done with the date and we
+ // need to adjust the UDS and set fDay to true. Otherwise, this is
+ // just another state transition.
+ if (dtok.dtt != DTT_NumDatesuff)
+ goto LDateSep;
+ break;
+
+ case DS_T_S: // time suffix.
+#if VBA2
+ fTime = TRUE;
+#endif
+ break;
+#endif // FE_DBCS
+
+
+ case DS_ERROR:
+ goto LNotDate;
+
+ default:
+ ASSERT(UNREACHED);
+ goto LNotDate;
+ }
+
+ // advance to the next state, and continue
+ dps = (dps < DS_ERROR) ? g_dpsNext[dps][dtok.dtt] : DS_BEGIN;
+
+ ASSERT(dps >= 0 && dps < DS_MAX);
+ }
+
+LDone:;
+
+ if(fDay || fTime){
+ VARIANT var;
+
+ if(!fDay){
+ // default the day
+ uds.Month = 12;
+ uds.DayOfMonth = 30;
+ uds.Year = 1899;
+ }
+
+ if(!fTime){
+ // default the time
+ uds.Hour = 0;
+ uds.Minute = 0;
+ uds.Second = 0;
+ }
+#if VBA2
+ else {
+ AdjustTime(&uds, raw.ampm);
+ }
+#endif
+
+ if(ErrPackDate(&uds, &var, TRUE, dwFlags) == NOERROR){
+ *pdateOut = V_DATE(&var);
+ hr = NOERROR; // success!
+ }
+ }
+
+LNotDate:;
+
+#ifdef FE_DBCS
+ if(di.IsDBCS) {
+ DispFree(lpStr);
+ }
+#endif
+
+ return hr;
+}
+
+
+/* following are the utilites for constructing a proper UDS from
+ * a raw set of numbers (or month and numbers).
+ *
+ * These utilities encapsulate the knowledge of how to interpret
+ * the set of numbers based on locale info, and what our defaulting
+ * rules (poorly defined though they are) when given an incomplete
+ * date.
+ *
+ */
+#if !VBA2
+#define LEGAL_DAY(DAY) ((DAY)>0 && (DAY)<=31)
+#define LEGAL_MONTH(MON) ((MON)>0 && (MON)<=12)
+#else //VBA2
+#define LEGAL_MONTH(MON) ((MON)>0 && (MON)<=12)
+int g_fDay31th[] = { 0,/*0*/ 1,/*Jan*/ 0,/*Feb*/ 1,0,1,0,1,1,0,1,0,1 };
+PRIVATE_(BOOL)
+LEGAL_DAY(int Year, int Month, int Day)
+{
+ if (Day <= 0) return FALSE;
+ if (Day > 31) return FALSE;
+ if ((Day == 31) && (LEGAL_MONTH(Month))) {
+ if (! g_fDay31th[Month]) return FALSE;
+ }
+ if (Month == 2) {
+ if (Day == 30) return FALSE;
+ if (Day == 29) { //for leap year
+ if (! (((Year & 3) == 0) && ((Year % 100) != 0 || (Year % 400) == 0)))
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+#endif //VBA2
+
+#if !VBA2
+// Fillin the day and year of the given uds, using the given
+// tentative day - default either the year or the day appropriately.
+
+PRIVATE_(BOOL)
+DefaultDayOrYear(UDS FAR* puds, int day)
+{
+ if(!LEGAL_DAY(day)){
+
+ // If the day is not valid then assume it was really a year,
+ // and default the day to 1.
+
+ // Note: the check for <31 should really be a check
+ // for <max_days(puds->Month), but this is the way EB did it.
+
+ puds->Year = day;
+ puds->DayOfMonth = 1;
+
+ }else{
+
+ puds->DayOfMonth = day;
+
+ // fillin the year with the current year
+ puds->Year = GetCurrentYear();
+ }
+
+ return TRUE;
+}
+#endif //!VBA2
+
+#if VBA2
+// fillin the uds day given params
+//PRIVATE_(VOID)
+void SetUDSfromYMD(UDS FAR* puds, int Y, int M, int D)
+{
+ puds->Year = Y;
+ puds->Month = M;
+ puds->DayOfMonth = D;
+}
+#endif //VBA2
+
+// fillin the uds day given two numbers
+
+PRIVATE_(BOOL)
+DayOfNN(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds)
+{
+#if !VBA2
+ int n1, n2;
+
+ switch(pdi->dfo){
+ case DFO_MDY:
+ puds->Month = praw->num[0];
+ return DefaultDayOrYear(puds, praw->num[1]);
+
+ case DFO_DMY:
+ puds->Month = praw->num[1];
+ return DefaultDayOrYear(puds, praw->num[0]);
+
+ // This case is somewhat strange - we assume that the two
+ // given numbers are a day and a month, and we default the
+ // year.
+ case DFO_YMD:
+ n1 = praw->num[0], n2 = praw->num[1];
+ if(LEGAL_MONTH(n1) && LEGAL_DAY(n2)){
+ puds->Month = n1, puds->DayOfMonth = n2;
+ }else
+ if(LEGAL_MONTH(n2) && LEGAL_DAY(n1)){
+ puds->Month = n2, puds->DayOfMonth = n1;
+ }else
+ return FALSE;
+ puds->Year = GetCurrentYear();
+ return TRUE;
+ }
+ ASSERT(UNREACHED);
+ return FALSE;
+#else //VBA2
+ int n1 = praw->num[0];
+ int n2 = praw->num[1];
+ int nCurrentYear = GetCurrentYear();
+
+ switch (pdi->dfo) {
+ case DFO_YMD:
+ if (LEGAL_MONTH(n1) && LEGAL_DAY(nCurrentYear, n1, n2)) //M and D
+ SetUDSfromYMD(puds, nCurrentYear, n1, n2);
+ else if (LEGAL_MONTH(n2) && LEGAL_DAY(nCurrentYear, n2, n1)) //D and M
+ SetUDSfromYMD(puds, nCurrentYear, n2, n1);
+ else if (LEGAL_MONTH(n2)) //Y and M
+ SetUDSfromYMD(puds, n1, n2, 1);
+ else if (LEGAL_MONTH(n1)) //M and Y
+ SetUDSfromYMD(puds, n2, n1, 1);
+ else
+ return FALSE;
+ return TRUE;
+
+ case DFO_MDY:
+ if (LEGAL_MONTH(n1) && LEGAL_DAY(nCurrentYear, n1, n2)) //M and D
+ SetUDSfromYMD(puds, nCurrentYear, n1, n2);
+ else if (LEGAL_MONTH(n2) && LEGAL_DAY(nCurrentYear, n2, n1)) //D and M
+ SetUDSfromYMD(puds, nCurrentYear, n2, n1);
+ else if (LEGAL_MONTH(n1)) //M and Y
+ SetUDSfromYMD(puds, n2, n1, 1);
+ else if (LEGAL_MONTH(n2)) //Y and M
+ SetUDSfromYMD(puds, n1, n2, 1);
+ else
+ return FALSE;
+ return TRUE;
+
+ case DFO_DMY:
+ if (LEGAL_MONTH(n2) && LEGAL_DAY(nCurrentYear, n2, n1)) //D and M
+ SetUDSfromYMD(puds, nCurrentYear, n2, n1);
+ else if (LEGAL_MONTH(n1) && LEGAL_DAY(nCurrentYear, n1, n2)) //M and D
+ SetUDSfromYMD(puds, nCurrentYear, n1, n2);
+ else if (LEGAL_MONTH(n1)) //M and Y
+ SetUDSfromYMD(puds, n2, n1, 1);
+ else if (LEGAL_MONTH(n2)) //Y and M
+ SetUDSfromYMD(puds, n1, n2, 1);
+ else
+ return FALSE;
+ return TRUE;
+ }
+ ASSERT(UNREACHED);
+ return FALSE;
+#endif //VBA2
+}
+
+
+/***
+*PRIVATE BOOL DayOfNNN
+*Purpose:
+* Build a UDS date given three raw integers, in the textual order
+* that they appeared.
+*
+* There a 6 possible ways for the 3 raw numbers to be interpreted
+* as a m-d-y sequence. Choose the best fit, first based on the NLS
+* date-format ordering, and second on the legality of the actual
+* values.
+*
+*Entry:
+* praw = the raw values to process
+* pdi = the dateinfo (nls info)
+*
+*Exit:
+* return value = BOOL
+*
+* puds = the
+*
+***********************************************************************/
+PRIVATE_(BOOL)
+DayOfNNN(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds)
+{
+#if !VBA2
+ int m, d, y, n0, n1, n2, a, b;
+
+ n0 = praw->num[0];
+ n1 = praw->num[1];
+ n2 = praw->num[2];
+
+ // Note: if none of the values for month or day are legally in
+ // range, then we default to the textual order (according to the
+ // nls date-info), and let the chips fall...
+
+ // remember when looking at the following code that
+ // *any* number is a legal year (ie, there are no checks
+ // for LEGAL_YEAR()
+
+ switch(pdi->dfo){
+ case DFO_MDY:
+ // 1. try to match the locale's date format ordering
+ if(LEGAL_MONTH(n0) && LEGAL_DAY(n1)){
+ m = n0, d = n1, y = n2;
+ break;
+ }
+ // 2. try universal date format: YMD
+ if(LEGAL_MONTH(n1) && LEGAL_DAY(n2)){
+ y = n0, m = n1, d = n2;
+ break;
+ }
+ // 3. try to find a some other reasonable fit for the numbers
+ if(LEGAL_MONTH(n0)){
+ goto Lmdy0;
+ }else if(LEGAL_MONTH(n1)){
+ m = n1; a = n0; b = n2;
+ }else if(LEGAL_MONTH(n2)){
+ m = n2; a = n0; b = n1;
+ }else{
+Lmdy0:; m = n0; a = n1; b = n2;
+ }
+ if(LEGAL_DAY(a)){
+ goto Lmdy1;
+ }else if(LEGAL_DAY(b)){
+ d = b; y = a;
+ }else{
+Lmdy1:; d = a; y = b;
+ }
+ break;
+
+ case DFO_DMY:
+ // 1. try to match the locale's date format ordering
+ if(LEGAL_DAY(n0) && LEGAL_MONTH(n1)){
+ d = n0, m = n1, y = n2;
+ break;
+ }
+ // 2. try universal date format: YMD
+ if(LEGAL_MONTH(n1) && LEGAL_DAY(n2)){
+ y = n0, m = n1, d = n2;
+ break;
+ }
+ // 3. try to find some other reasonable fit
+ if(LEGAL_DAY(n0)){
+ goto Ldmy0;
+ }else if(LEGAL_DAY(n1)){
+ d = n1; a = n0; b = n2;
+ }else if(LEGAL_DAY(n2)){
+ d = n2; a = n0; b = n1;
+ }else{
+Ldmy0:; d = n0; a = n1; b = n2;
+ }
+ if(LEGAL_MONTH(a)){
+ goto Ldmy1;
+ }else if(LEGAL_MONTH(b)){
+ m = b; y = a;
+ }else{
+Ldmy1:; m = a; y = b;
+ }
+ break;
+
+ case DFO_YMD:
+ y = n0; a = n1; b = n2;
+ if(LEGAL_MONTH(a)){
+ goto Lymd;
+ }else if(LEGAL_MONTH(b)){
+ m = b; d = a;
+ }else{
+Lymd:; m = a; d = b;
+ }
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ }
+
+ puds->Month = m;
+ puds->DayOfMonth = d;
+ puds->Year = y;
+
+ return TRUE;
+
+#else //VBA2
+ int n1 = praw->num[0];
+ int n2 = praw->num[1];
+ int n3 = praw->num[2];
+ int nCurrentYear = GetCurrentYear();
+
+ switch (pdi->dfo) {
+ case DFO_YMD:
+ if (LEGAL_MONTH(n2) && LEGAL_DAY(n1, n2, n3)) //Y&M&D
+ SetUDSfromYMD(puds, n1, n2, n3);
+ else if (LEGAL_MONTH(n1) && LEGAL_DAY(n3, n1, n2)) //M&D&Y
+ SetUDSfromYMD(puds, n3, n1, n2);
+ else if (LEGAL_MONTH(n2) && LEGAL_DAY(n3, n2, n1)) //D&M&Y
+ SetUDSfromYMD(puds, n3, n2, n1);
+ else
+ return FALSE;
+ return TRUE;
+
+ case DFO_MDY:
+ if (LEGAL_MONTH(n1) && LEGAL_DAY(n3, n1, n2)) //M&D&Y
+ SetUDSfromYMD(puds, n3, n1, n2);
+ else if (LEGAL_MONTH(n2) && LEGAL_DAY(n1, n2, n3)) //Y&M&D
+ SetUDSfromYMD(puds, n1, n2, n3);
+ else if (LEGAL_MONTH(n2) && LEGAL_DAY(n3, n2, n1)) //D&M&Y
+ SetUDSfromYMD(puds, n3, n2, n1);
+ else
+ return FALSE;
+ return TRUE;
+
+ case DFO_DMY:
+ if (LEGAL_MONTH(n2) && LEGAL_DAY(n3, n2, n1)) //D&M&Y
+ SetUDSfromYMD(puds, n3, n2, n1);
+ else if (LEGAL_MONTH(n2) && LEGAL_DAY(n1, n2, n3)) //Y&M&D
+ SetUDSfromYMD(puds, n1, n2, n3);
+ else if (LEGAL_MONTH(n1) && LEGAL_DAY(n3, n1, n2)) //M&D&Y
+ SetUDSfromYMD(puds, n3, n1, n2);
+ else
+ return FALSE;
+ return TRUE;
+ }
+ return TRUE;
+#endif //VBA2
+}
+
+
+// fillin the uds day given one number and a month
+
+PRIVATE_(BOOL)
+DayOfMN(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds)
+{
+#if !VBA2
+ puds->Month = praw->month;
+
+ switch(pdi->dfo){
+ case DFO_MDY:
+ case DFO_DMY:
+ return DefaultDayOrYear(puds, praw->num[0]);
+
+ case DFO_YMD:
+ puds->DayOfMonth = 1;
+ puds->Year = praw->num[0];
+ return TRUE;
+ }
+
+ ASSERT(UNREACHED);
+ return FALSE;
+
+#else //VBA2
+ int nCurrentYear = GetCurrentYear();
+
+ if (LEGAL_DAY(nCurrentYear, praw->month, praw->num[0]))
+ SetUDSfromYMD(puds, nCurrentYear, praw->month, praw->num[0]);
+ else
+ SetUDSfromYMD(puds, praw->num[0], praw->month, 1);
+ return TRUE;
+#endif //VBA2
+}
+
+
+// fillin the uds day given a month and two numbers
+
+PRIVATE_(BOOL)
+DayOfMNN(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds)
+{
+#if !VBA2
+ puds->Month = praw->month;
+
+ switch(pdi->dfo){
+ case DFO_MDY:
+ case DFO_DMY:
+ puds->DayOfMonth = praw->num[0];
+ puds->Year = praw->num[1];
+ break;
+
+ case DFO_YMD:
+ puds->DayOfMonth = praw->num[1];
+ puds->Year = praw->num[0];
+ break;
+ }
+
+ return TRUE;
+
+#else //VBA2
+ int n1 = praw->num[0];
+ int n2 = praw->num[1];
+
+ switch (pdi->dfo) {
+ case DFO_YMD: //YD, DY
+ if (LEGAL_DAY(n1, praw->month, n2))
+ SetUDSfromYMD(puds, n1, praw->month, n2);
+ else
+ SetUDSfromYMD(puds, n2, praw->month, n1);
+ break;
+ case DFO_MDY: //DY, YD
+ if (LEGAL_DAY(n2, praw->month, n1))
+ SetUDSfromYMD(puds, n2, praw->month, n1);
+ else
+ SetUDSfromYMD(puds, n1, praw->month, n2);
+ break;
+ case DFO_DMY: //DY, YD
+ if (LEGAL_DAY(n2, praw->month, n1))
+ SetUDSfromYMD(puds, n2, praw->month, n1);
+ else
+ SetUDSfromYMD(puds, n1, praw->month, n2);
+ break;
+ }
+ return TRUE;
+#endif //VBA2
+}
+
+
+// adjust the given time according to the given ampm designator
+
+PRIVATE_(void)
+AdjustTime(UDS FAR* puds, AMPM ampm)
+{
+ // REVIEW: check for invalid time here?
+
+ switch(ampm){
+ case AMPM_PM:
+ if(puds->Hour != 12)
+ puds->Hour += 12;
+ break;
+ case AMPM_AM:
+ if(puds->Hour == 12)
+ puds->Hour = 0;
+ break;
+ }
+}
+
+
+#ifdef FE_DBCS
+PRIVATE_(BOOL)
+AdjustUDSTime(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds)
+{
+ // UDS already contains all the suffixed time information.
+ // just fill in remaining defaults. Make sure there are no numbers
+ // without suffixes..
+
+ if (praw->pnum != praw->num)
+ return FALSE;
+
+ if (puds->Hour == -1) puds->Hour = 0;
+ if (puds->Minute == -1) puds->Minute = 0;
+ if (puds->Second == -1) puds->Second = 0;
+
+ return TRUE;
+
+}
+
+
+PRIVATE_(BOOL)
+AdjustUDSDate(DATERAW FAR* praw, DATEINFO FAR* pdi, UDS FAR* puds)
+{
+ // UDS already contains all the suffixed date information.
+ // Just fill in remaining defaults. Verify enough information
+ // is provided.
+
+ if (praw->pnum > praw->num+1)
+ return FALSE;
+
+ if (puds->Year == -1 && puds->Month != -1 && puds->DayOfMonth != -1)
+ puds->Year = GetCurrentYear();
+ if (puds->DayOfMonth == -1 && puds->Year != -1 && puds->Month != -1)
+ puds->DayOfMonth = 1;
+
+ if (puds->Year == -1 || puds->Month == -1 || puds->DayOfMonth == -1)
+ return FALSE;
+
+ return TRUE;
+
+}
+#endif // FE_DBCS
+
+//---------------------------------------------------------------------
+// BSTR from DATE
+//---------------------------------------------------------------------
+
+#ifdef FE_DBCS
+
+// Given a UDS date, return an index into the impEras table for the
+// appropriate imperail era. If date falls before first imperial range,
+// return -1.
+
+PRIVATE_(int)
+GetImperialEra(UDS FAR* pdate, DATEINFO FAR* pdi)
+{
+ int i;
+ VARIANT find;
+ VARIANT first;
+ VARIANT next;
+
+ if (ErrPackDate(pdate, &find, TRUE, 0) != NOERROR)
+ return -1;
+
+ if (ErrPackDate(&pdi->impEras[0].beginDate, &first, TRUE, 0) != NOERROR)
+ return -1;
+
+ if (V_DATE(&find) < V_DATE(&first)) {
+ return -1;
+
+ } else for (i = 0; i < MAX_EMPERORS-1; i++) {
+ if (ErrPackDate(&pdi->impEras[i+1].beginDate, &next, TRUE, 0) != NOERROR)
+ return -1;
+
+ if (V_DATE(&find) >= V_DATE(&first) && V_DATE(&find) < V_DATE(&next))
+ return i;
+
+ V_DATE(&first) = V_DATE(&next);
+ }
+
+ return MAX_EMPERORS -1;
+}
+
+#endif // FE_DBCS
+
+
+
+/***
+*PRIVATE HRESULT RenderDate
+*Purpose:
+* Render the given date as a string. The string is formatted
+* based on the short date format for the current locale. The
+* possible (legal) date formatting characters that may appear
+* in a short date format string are,
+*
+* m month, 1-12
+* mm month with leading zero, 01-12
+*
+* M same as 'm'
+* MM same as 'mm'
+*
+* d day, 1-31
+* dd day with leading zero, 01-31
+*
+* yy year as two digit number, 00-99 (if current century)
+* yyyy year as four digit number, 100-9999
+*
+*
+*Entry:
+* puds = pointer to the unpacked date
+* pdi = pointer to the locale specific date info
+* pszFmt = the short date format string
+* *pszOut = the buffer to format the string into
+*
+*Exit:
+* return value = HRESULT
+*
+* *pszOut = pointer to the end of the formatted string
+*
+***********************************************************************/
+
+PRIVATE_(HRESULT)
+RenderDate(
+ UDS FAR* puds,
+ DATEINFO FAR* pdi,
+ OLECHAR FAR* pszFmt,
+ OLECHAR FAR* FAR* pszOut)
+{
+ int len, num;
+ OLECHAR ch, FAR* psz;
+
+ UNUSED(pdi);
+
+ psz = *pszOut;
+
+ while(*pszFmt != OASTR('\0')){
+ switch(*pszFmt){
+#if 0
+// I dont remember why I thought we should treat a backslash as an
+// escape character. There are no cases in our locale info that it
+// is used this way, and treating it this way breaks its (obscure)
+// use as a date separator. -BHL
+ case OASTR('\\'):
+ // copy out escaped character
+ ++pszFmt;
+ if(*pszFmt != OASTR('\0'))
+ *psz++ = *pszFmt++;
+ break;
+#endif
+
+ case OASTR('\''):
+ // copy out the quoted string
+ ++pszFmt;
+ while(*pszFmt != OASTR('\0')){
+ if((ch = *pszFmt++) == OASTR('\''))
+ break;
+ *psz++ = ch;
+ }
+ break;
+
+ case OASTR('d'): // handle 'd' and 'dd'
+ num = puds->DayOfMonth;
+ goto LDayOrMonth;
+
+ case OASTR('m'): // handle 'm' and 'mm'
+ case OASTR('M'): // handle 'M' and 'MM'
+ num = puds->Month;
+LDayOrMonth:;
+ if(pszFmt[0] == pszFmt[1]){
+ pszFmt += 2;
+ if(num < 10)
+ *psz++ = OASTR('0'); // leading zero if appropriate
+ }else{
+ pszFmt += 1;
+ }
+ ASSERT(num >= 0);
+ disp_itoa(num, psz, 10);
+ len = STRLEN(psz);
+ ASSERT(len <= 2);
+ psz += len;
+ break;
+
+ case 'y': // handle 'yy' or 'yyyy'
+ if(pszFmt[1] == OASTR('y')){
+ num = puds->Year;
+ ASSERT(num >= 0 && num <= 9999);
+ if(pszFmt[2] == OASTR('y') && pszFmt[3] == OASTR('y')){
+ // date as a four digit number
+ pszFmt += 4;
+ }else{
+ // date as a two digit number
+ pszFmt += 2;
+ if((num / 100) == 19)
+ num %= 100;
+ if(num < 10)
+ *psz++ = OASTR('0'); // leading zero if appropriate
+ }
+ ASSERT(num >= 0);
+ disp_itoa(num, psz, 10);
+ len = STRLEN(psz);
+ ASSERT(len <= 4);
+ psz += len;
+ break;
+ }
+#ifdef FE_DBCS
+ case OASTR('e'):
+ case OASTR('E'):
+ pszFmt++;
+
+ if (IsJapan(pdi->lcid)) {
+ int era;
+ short fLeadZero = 0;
+
+ if (pszFmt[0] == OASTR('e') || pszFmt[0] == OASTR('E')) {
+ fLeadZero = 1;
+ pszFmt++;
+ }
+
+ // find imperial era
+ if ( (era = GetImperialEra(puds, pdi)) >= 0 ) {
+ int year = puds->Year - pdi->impEras[era].beginDate.Year + 1;
+ if (year < 10 && fLeadZero)
+ *psz++ = OASTR('0');
+ disp_itoa(year, psz, 10);
+ psz += STRLEN(psz);
+ }
+
+ } else {
+ // UNDONE: bassams: What should we do here. 'ee' on a non-japanese machine.
+ }
+ break;
+
+ case OASTR('g'):
+ case OASTR('G'): // Japanese imperial eras.
+ pszFmt++;
+ if (IsJapan(pdi->lcid)) {
+ int era;
+ short sFmt = 0;
+
+ if (pszFmt[0] == OASTR('g') || pszFmt[0] == OASTR('G')) {
+ if (pszFmt[1] == OASTR('g') || pszFmt[0] == OASTR('G')) {
+ // three 'g's
+ sFmt = 2;
+ } else {
+ // two 'g's
+ sFmt = 1;
+ }
+ }
+
+ pszFmt += sFmt;
+ // find imperial era
+ if ( (era = GetImperialEra(puds, pdi)) < 0 ) {
+ // Use gregorian year.
+ disp_itoa(puds->Year, psz, 10);
+ len = STRLEN(psz);
+ ASSERT(len <= 4);
+ psz += len;
+
+ } else {
+ STRCPY(psz, pdi->impEras[era].szName[sFmt]);
+ psz += STRLEN(psz);
+ }
+
+ } else {
+ // UNDONE: bassams: What should we do here. 'ggg' on non-Japanese.
+ }
+ break;
+#endif // FE_DBCS
+
+ /* else FALLTHROUGH */
+
+ default:
+ *psz++ = *pszFmt++;
+ break;
+ }
+ }
+
+ *psz = OASTR('\0');
+
+ *pszOut = psz;
+
+ return NOERROR;
+}
+
+
+// tack on the Ampm designator -
+//
+PRIVATE_(void)
+AppendAmPm(
+ DATEINFO FAR *pdi,
+ OLECHAR FAR* FAR* psz,
+ UDS FAR* puds,
+ BOOL fAmPmPrefix)
+{
+ OLECHAR FAR* pszAmpm;
+
+ // Note: If were using a 24hour format, then we still tack on the
+ // s2359 string. Although this will typically be empty, the user may
+ // enter something in their intl settings, and this is what basic does.
+ // (oleprog#186)
+ pszAmpm = (!pdi->fAmpm)
+ ? pdi->sz2359
+ : (puds->Hour < 12) ? pdi->sz1159 : pdi->sz2359;
+
+ if(*pszAmpm != OASTR('\0')){
+ if(!fAmPmPrefix)
+ *(*psz)++ = OASTR(' ');
+
+ while(*pszAmpm != OASTR('\0'))
+ *(*psz)++ = *pszAmpm++;
+
+ if(fAmPmPrefix)
+ *(*psz)++ = OASTR(' ');
+ }
+}
+
+/***
+*PRIVATE HRESULT RenderTime
+*Purpose:
+* Render the given time as a string. All times are formatted
+* as Hour:Minute:Second, with the following options,
+*
+* - locale specific time separator
+* - optional leading zero on time
+* - 12hour format with locale specific am/pm designator, or 24hour fmt.
+*
+*Entry:
+* puds = the unpacked time to render
+* pdi = pointer to the DATEINFO struct with the appropriate locale info
+* *pszOut = the buffer to format into
+*
+*Exit:
+* return value = HRESULT
+*
+* *pszOut = pointer to the end of the formatted string.
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+RenderTime(UDS FAR* puds, DATEINFO FAR* pdi, OLECHAR FAR* FAR* pszOut)
+{
+ OLECHAR FAR* psz;
+ int i, len, hms[3];
+
+ psz = *pszOut;
+
+#ifdef FE_DBCS
+ if (pdi->IsDBCS && pdi->fAmPmPrefix)
+ AppendAmPm(pdi, &psz, puds, TRUE);
+#endif // FE_DBCS
+
+ hms[0] = puds->Hour;
+ if(pdi->fAmpm){
+ if(hms[0] > 12)
+ hms[0] -= 12;
+ else if(hms[0] == 0)
+ hms[0] = 12;
+ }
+ hms[1] = puds->Minute;
+ hms[2] = puds->Second;
+
+ for(i = 0; i < 3; ++i){
+ if(hms[i] < 10 && (i > 0 || pdi->fTlzero))
+ *psz++ = OASTR('0');
+ disp_itoa(hms[i], psz, 10);
+ len = STRLEN(psz);
+ ASSERT(len <= 2);
+ psz += len;
+ if (i < 2)
+ *psz++ = pdi->szTimesep[0];
+ }
+
+#ifdef FE_DBCS
+ if (pdi->IsDBCS) {
+ if (!pdi->fAmPmPrefix)
+ AppendAmPm(pdi, &psz, puds, FALSE);
+ } else
+#endif
+ AppendAmPm(pdi, &psz, puds, FALSE);
+
+ *psz = OASTR('\0');
+ *pszOut = psz;
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC HRESULT VarBstrFromDate(DATE, LCID, unsigned long, BSTR FAR*);
+*Purpose:
+*
+*Entry:
+* date = the date to coerce
+*
+*Exit:
+* return value = HRESULT
+*
+* *pszOut = the resulting string
+*
+***********************************************************************/
+
+STDAPI
+VarBstrFromDate(
+ DATE dateIn,
+ LCID lcid,
+ unsigned long dwFlags,
+ BSTR FAR* pbstrOut)
+{
+ UDS uds;
+ VARIANT var;
+ DATEINFO di;
+ BOOL fNoDate;
+ OLECHAR FAR* psz;
+ OLECHAR rgchFmt[64]; // REVIEW
+ OLECHAR rgchBuf[128]; // REVIEW
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ IfFailRet(GetDateInfo(&di, lcid, dwFlags));
+
+ // get the short date format string
+
+ IfFailRet(
+ SafeGetLocaleInfo(
+ di.lcid, LOCALE_SSHORTDATE | dwFlags, rgchFmt, sizeof(rgchFmt)));
+
+ // unpack the serial date
+
+ V_VT(&var) = VT_DATE;
+ V_DATE(&var) = dateIn;
+ IfFailRet(ErrUnpackDate(&uds, &var));
+
+ psz = rgchBuf;
+
+ // dont render the date if the serialized date is 0,
+ // which corresponds to an unpacked date of 12/30/1899
+
+ fNoDate = (uds.Month == 12 && uds.DayOfMonth == 30 && uds.Year == 1899);
+ if(!fNoDate){
+ IfFailRet(RenderDate(&uds, &di, rgchFmt, &psz));
+ }
+
+ // append the time to the string if its != 0:0:0, or we didnt render
+ // the date.
+
+ if(fNoDate || uds.Hour != 0 || uds.Minute != 0 || uds.Second != 0){
+ if(!fNoDate)
+ *psz++ = OASTR( ' ');
+ IfFailRet(RenderTime(&uds, &di, &psz));
+ }
+
+ ASSERT(psz < &rgchBuf[DIM(rgchBuf)]);
+
+ return ErrSysAllocString(rgchBuf, pbstrOut);
+}
+
+INTERNAL_(HRESULT)
+IntOfString(LCID lcid, OLECHAR FAR* psz, int FAR* pval)
+{
+ int val;
+ OLECHAR chSign;
+
+ EATWHITE(lcid, psz);
+
+ chSign = *psz;
+ if(*psz == OASTR('-') || *psz == OASTR('+'))
+ ++psz;
+
+ for(val = 0; *psz >= OASTR('0') && *psz <= OASTR('9') ; ++psz){
+ val = (val*10) + (*psz - OASTR('0'));
+ }
+
+ EATWHITE(lcid, psz);
+
+ if(*psz != OASTR('\0'))
+ return RESULT(E_INVALIDARG);;
+
+ *pval = (chSign == OASTR('-')) ? -val : val;
+
+ return NOERROR;
+}
+
+#if 0
+
+INTERNAL_(HRESULT)
+StringOfInt(int val, OLECHAR FAR* pszOut, int FAR* pcbLen)
+{
+ int v, r;
+ OLECHAR FAR* psz;
+
+ if(val == 0){
+ pszOut[0] = OASTR('0');
+ pszOut[1] = OASTR('\0');
+ *pcbLen = 1;
+ return NOERROR;
+ }
+
+ psz = pszOut;
+ for(v = val; v != 0;){
+ r = v % 10;
+ v = v / 10;
+ *psz++ = r + OASTR('0');
+ }
+ if(val < 0)
+ *psz++ = OASTR('-');
+ *psz = OASTR('\0');
+
+ STRREV(pszOut);
+
+ *pcbLen = psz - pszOut;
+ ASSERT(*pcbLen >= 1);
+ return NOERROR;
+}
+
+#endif
+
+#if OE_WIN16
+/***
+*PUBLIC void NLSInfoChangedHandler(void)
+*Purpose:
+* When WIN.INI changes, the DATEINFO cache must be invalidated. This
+* routine is called by ole2nls.dll when WIN.INI changes, and once when
+* ole2nls.dll creates its hidden window.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+#pragma code_seg("_TEXT") // called during ole2disp startup
+EXTERN_C void EXPORT CALLBACK NLSInfoChangedHandler(void)
+{
+ // flag the cache as invalid
+ g_diCache.lcid = 0xffffffff;
+}
+#pragma code_seg()
+#endif
diff --git a/private/oleauto/src/dispatch/cdispti.cpp b/private/oleauto/src/dispatch/cdispti.cpp
new file mode 100644
index 000000000..29b2d2e9c
--- /dev/null
+++ b/private/oleauto/src/dispatch/cdispti.cpp
@@ -0,0 +1,1360 @@
+/***
+*cdispti.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements CDispTypeInfo, which is an INTERFACEDATA
+* driven implementation of the TypeInfo interface.
+*
+*
+*Revision History:
+*
+* [00] 19-Nov-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+ASSERTDATA
+
+
+// the following structure is used to assemble the arguments for
+// use by the low level invocation helper - DoInvokeMethod()
+
+typedef struct tagINVOKEARGS{
+ unsigned int cArgs;
+ VARTYPE FAR* rgvt;
+ VARIANTARG FAR* FAR* rgpvarg;
+ VARIANTARG FAR* rgvarg;
+} INVOKEARGS;
+
+
+// REVIEW: this should support aggregation
+
+class CDispTypeInfo : public ITypeInfo {
+public:
+ static HRESULT Create(
+ TYPEKIND tkind,
+ INTERFACEDATA FAR* pidata,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+
+ // ITypeInfo methods
+ //
+ STDMETHOD(GetTypeAttr)(TYPEATTR FAR* FAR* pptattr);
+
+ STDMETHOD(GetTypeComp)(ITypeComp FAR* FAR* pptcomp);
+
+ STDMETHOD(GetFuncDesc)(unsigned int index, FUNCDESC FAR* FAR* ppfuncdesc);
+
+ STDMETHOD(GetVarDesc)(unsigned int index, VARDESC FAR* FAR* ppvardesc);
+
+ STDMETHOD(GetNames)(
+ MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ unsigned int cMaxNames,
+ unsigned int FAR* pcNames);
+
+ STDMETHOD(GetRefTypeOfImplType)(
+ unsigned int index,
+ HREFTYPE FAR* phreftype);
+
+ STDMETHOD(GetImplTypeFlags)(
+ unsigned int index,
+ int FAR* pimpltypeflags);
+
+ STDMETHOD(GetIDsOfNames)(
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ MEMBERID FAR* rgmemid);
+
+ STDMETHOD(Invoke)(
+ void FAR* pvInstance,
+ MEMBERID memid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ STDMETHOD(GetDocumentation)(
+ MEMBERID memid,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile);
+
+ STDMETHOD(GetDllEntry)(
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ BSTR FAR* pbstrDllName,
+ BSTR FAR* pbstrName,
+ unsigned short FAR* pwOrdinal);
+
+ STDMETHOD(GetRefTypeInfo)(
+ HREFTYPE hreftype, ITypeInfo FAR* FAR* pptinfo);
+
+ STDMETHOD(AddressOfMember)(
+ MEMBERID memid, INVOKEKIND invkind, void FAR* FAR* ppv);
+
+ STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv);
+
+ STDMETHOD(GetMops)(MEMBERID memid, BSTR FAR* pbstrMops);
+
+ STDMETHOD(GetContainingTypeLib)(
+ ITypeLib FAR* FAR* pptlib, unsigned int FAR* pindex);
+
+ STDMETHOD_(void, ReleaseTypeAttr)(TYPEATTR FAR* ptattr);
+ STDMETHOD_(void, ReleaseFuncDesc)(FUNCDESC FAR* pfuncdesc);
+ STDMETHOD_(void, ReleaseVarDesc)(VARDESC FAR* pvardesc);
+
+ inline int StrICmp(OLECHAR FAR* sz1, int len1, OLECHAR FAR* sz2, int len2)
+ {
+ LCTYPE type = NORM_IGNORECASE; // all versions are case insensitive
+
+#ifdef FE_DBCS
+ if (IsDBCS(m_lcid)) {
+ type |= NORM_IGNOREWIDTH; // DBCS is width insensitive
+
+ if (IsJapan(m_lcid))
+ type |= NORM_IGNOREKANATYPE; // Japan is Kanatype insensitive
+
+ } else
+#endif
+ type |= NORM_IGNORENONSPACE; // US-Euro only
+
+ return CompareString(m_lcid, type, sz1, len1, sz2, len2) - 2;
+ }
+
+ CDispTypeInfo();
+
+private:
+
+ HRESULT PmdataOfDispid(
+ MEMBERID memid, unsigned short wFlags, METHODDATA FAR* FAR* ppmdata);
+
+ inline HRESULT PmdataOfPropGet(
+ MEMBERID memid, METHODDATA FAR* FAR* ppmdata)
+ {
+ return PmdataOfDispid(memid, DISPATCH_PROPERTYGET, ppmdata);
+ }
+
+ HRESULT AllocInvokeArgs(
+ unsigned int cArgs,
+ INVOKEARGS FAR* FAR* ppinvargs);
+
+ HRESULT GetInvokeArgs(
+ METHODDATA FAR* pmdata,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ INVOKEARGS FAR* FAR* pinvargsOut,
+ unsigned int FAR* puArgErr);
+
+ void ReleaseInvokeArgs(INVOKEARGS FAR* pinvargs);
+
+ inline BOOL IsPropGet(unsigned short wFlags) const {
+ return ((wFlags & DISPATCH_PROPERTYGET) != 0);
+ }
+
+ inline BOOL IsPropPut(unsigned short wFlags) const {
+ return ((wFlags & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) != 0);
+ }
+
+ inline BOOL IsLegalInvokeFlags(unsigned short wFlags) const {
+ return ((wFlags & ~(DISPATCH_METHOD | DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) == 0);
+ }
+
+ unsigned long m_refs;
+ LCID m_lcid;
+ TYPEKIND m_tkind;
+ INTERFACEDATA FAR* m_pidata;
+};
+
+
+#if 0
+LOCAL HRESULT
+PmdataOfImeth(INTERFACEDATA FAR*, unsigned int, METHODDATA FAR* FAR*);
+#endif
+
+
+// REVIEW: we really should have a separate error to indicate not-supported
+#define E_NOTSUPPORTED E_NOTIMPL
+
+
+/***
+*HRESULT CDispTypeInfo::Create
+*Purpose:
+* Create an instance of CDispTypeInfo
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = CDispTypeInfo*. NULL if create failed.
+*
+***********************************************************************/
+HRESULT
+CDispTypeInfo::Create(
+ TYPEKIND tkind,
+ INTERFACEDATA FAR* pidata,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ CDispTypeInfo FAR* ptinfo;
+
+ if((ptinfo = new FAR CDispTypeInfo()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ ptinfo->AddRef();
+
+ ptinfo->m_lcid = lcid;
+ ptinfo->m_tkind = tkind;
+ ptinfo->m_pidata = pidata;
+
+ *pptinfo = ptinfo;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CreateDispTypeInfo(INTERFACEDATA*, CDispTypeInfo**)
+*Purpose:
+* Create a CDispTypeInfo and initialize it from the given
+* INTERFACEDATA
+*
+*Entry:
+* pidata = pointer to an INTERFACEDATA
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_OUTOFMEMORY
+*
+* *pptinfo = pointer to the created CDispTypeInfo
+*
+*Note:
+* UNDONE: This function currently returns an CDispTypeInfo*, it
+* should return an ITypeInfo*, but the currently implementation is
+* not complete... this will change.
+*
+***********************************************************************/
+STDAPI
+CreateDispTypeInfo(
+ INTERFACEDATA FAR* pidata,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ ITypeInfo FAR* ptinfo;
+
+ IfFailRet(CDispTypeInfo::Create(TKIND_COCLASS, pidata, lcid, &ptinfo));
+
+ *pptinfo = ptinfo;
+
+ return NOERROR;
+}
+
+CDispTypeInfo::CDispTypeInfo()
+{
+ m_refs = 0;
+ m_pidata = NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CDispTypeInfo::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ }else if(IsEqualIID(riid, IID_ITypeInfo)){
+ *ppv = this;
+ AddRef();
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDispTypeInfo::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDispTypeInfo::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeInfo methods
+//---------------------------------------------------------------------
+
+
+/***
+*PUBLIC CDispTypeInfo::GetTypeAttr(TYPEATTR**)
+*Purpose:
+* Return a TYPEATTR that contains info about the described type.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_OUTOFMEMORY
+*
+* *pptattr = filled in TYPEATTR structure
+*
+***********************************************************************/
+STDMETHODIMP
+CDispTypeInfo::GetTypeAttr(TYPEATTR FAR* FAR* pptattr)
+{
+ TYPEATTR FAR* ptattr;
+
+ if((ptattr = new FAR TYPEATTR) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ ptattr->typekind = m_tkind;
+ ptattr->lcid = m_lcid;
+
+ ptattr->wMajorVerNum = 0;
+ ptattr->wMinorVerNum = 0;
+
+ ptattr->cVars = 0;
+
+ switch(m_tkind){
+ case TKIND_COCLASS:
+ ptattr->cFuncs = 0;
+ ptattr->cImplTypes = 1;
+ break;
+ case TKIND_INTERFACE:
+ ptattr->cFuncs = m_pidata->cMembers;
+ ptattr->cImplTypes = 0;
+ break;
+ default:;
+ ASSERT(UNREACHED);
+ break;
+ }
+
+ ptattr->guid = GUID_NULL;
+ ptattr->wTypeFlags = 0;
+
+ ptattr->cbSizeVft = (unsigned short)-1; // REVIEW: UNKNOWN?
+ ptattr->cbSizeInstance = (unsigned short)-1;// REVIEW: UNKNOWN?
+
+ // REVIEW: the following is Win16 specific
+ ptattr->cbAlignment = 2; // WORD align;
+
+ ptattr->idldescType.wIDLFlags = IDLFLAG_NONE;
+#if defined(WIN16)
+ ptattr->idldescType.bstrIDLInfo = NULL;
+#else
+ ptattr->idldescType.dwReserved = 0;
+#endif
+ ptattr->memidDestructor = DISPID_UNKNOWN;
+ ptattr->memidConstructor = DISPID_UNKNOWN;
+
+ *pptattr = ptattr;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CDispTypeInfo::GetTypeComp(ITypeComp FAR* FAR* pptcomp)
+{
+ UNUSED(pptcomp);
+
+ return RESULT(E_NOTSUPPORTED);
+}
+
+
+PRIVATE_(HRESULT)
+InvkindOfDispkind(unsigned short wFlags, INVOKEKIND FAR* pinvkind)
+{
+ switch(wFlags){
+ case DISPATCH_METHOD:
+ *pinvkind = INVOKE_FUNC;
+ break;
+ case DISPATCH_PROPERTYGET:
+ *pinvkind = INVOKE_PROPERTYGET;
+ break;
+ case DISPATCH_PROPERTYPUT:
+ *pinvkind = INVOKE_PROPERTYPUT;
+ break;
+ case DISPATCH_PROPERTYPUTREF:
+ *pinvkind = INVOKE_PROPERTYPUTREF;
+ break;
+ default:
+ return RESULT(E_FAIL); // bad dispkind
+ }
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTypeInfo::GetFuncDesc(
+ unsigned int index,
+ FUNCDESC FAR* FAR* ppfuncdesc)
+{
+ unsigned int u;
+ HRESULT hresult;
+ FUNCDESC FAR* pfuncdesc;
+ METHODDATA FAR* pmdata;
+ ELEMDESC FAR* rgelemdesc;
+
+ // can only return a funcdesc on an interface
+ if(m_tkind != TKIND_INTERFACE)
+ return RESULT(E_FAIL);
+
+#if 0
+ // lookup the METHODDATA that corresponds to the given index.
+ IfFailGo(PmdataOfImeth(m_pidata, index, &pmdata), LError0);
+#else
+ if(index >= m_pidata->cMembers)
+ return RESULT(DISP_E_MEMBERNOTFOUND);
+ pmdata = &m_pidata->pmethdata[index];
+#endif
+
+ if((pfuncdesc = new FAR FUNCDESC) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ if((rgelemdesc = new FAR ELEMDESC [pmdata->cArgs]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ pfuncdesc->memid = pmdata->dispid;
+ pfuncdesc->funckind = FUNC_VIRTUAL;
+ IfFailGo(InvkindOfDispkind(pmdata->wFlags, &pfuncdesc->invkind), LError2);
+ pfuncdesc->callconv = pmdata->cc;
+ pfuncdesc->cParams = pmdata->cArgs;
+ pfuncdesc->cParamsOpt = 0;
+ pfuncdesc->oVft = pmdata->iMeth * sizeof(void FAR*);
+ pfuncdesc->wFuncFlags = 0;
+
+ pfuncdesc->elemdescFunc.tdesc.vt = pmdata->vtReturn;
+ pfuncdesc->elemdescFunc.idldesc.wIDLFlags = IDLFLAG_NONE;
+
+#if defined(WIN16)
+ pfuncdesc->elemdescFunc.idldesc.bstrIDLInfo = NULL;
+#else
+ pfuncdesc->elemdescFunc.idldesc.dwReserved = 0;
+#endif
+
+ for(u = 0; u < pmdata->cArgs; ++u){
+ rgelemdesc[u].tdesc.vt = pmdata->ppdata[u].vt;
+ rgelemdesc[u].idldesc.wIDLFlags = IDLFLAG_NONE;
+#if defined(WIN16)
+ rgelemdesc[u].idldesc.bstrIDLInfo = NULL;
+#else
+ rgelemdesc[u].idldesc.dwReserved = 0;
+#endif
+ }
+ pfuncdesc->lprgelemdescParam = rgelemdesc;
+
+ *ppfuncdesc = pfuncdesc;
+
+ return NOERROR;
+
+LError2:
+ delete rgelemdesc;
+
+LError1:
+ delete pfuncdesc;
+
+LError0:
+ return hresult;
+}
+
+
+STDMETHODIMP
+CDispTypeInfo::GetVarDesc(
+ unsigned int index,
+ VARDESC FAR* FAR* ppvardesc)
+{
+ UNUSED(index);
+ UNUSED(ppvardesc);
+
+ // there are no variables described an an INTERFACEDATA
+ //
+ return RESULT(DISP_E_MEMBERNOTFOUND);
+}
+
+
+STDMETHODIMP
+CDispTypeInfo::GetNames(
+ MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ unsigned int cMaxNames,
+ unsigned int FAR* pcNames)
+{
+ unsigned short wFlags;
+ unsigned int u, cNames;
+ HRESULT hresult;
+ METHODDATA FAR* pmdata;
+
+
+ if(m_tkind != TKIND_INTERFACE || cMaxNames == 0){
+ *pcNames = 0;
+ return NOERROR;
+ }
+
+ wFlags = DISPATCH_METHOD|DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF|DISPATCH_PROPERTYGET;
+ // lookup the METHODDATA with the corresponding DISPID.
+ IfFailGo(PmdataOfDispid(memid, wFlags, &pmdata), LError0);
+
+ cNames = MIN(pmdata->cArgs+1, cMaxNames);
+
+ MEMSET(rgbstrNames, 0, cNames);
+
+ IfFailGo(ErrSysAllocString(pmdata->szName, &rgbstrNames[0]), LError1);
+
+ for(u = 1; u < cNames; ++u){
+ IfFailGo(
+ ErrSysAllocString(pmdata->ppdata[u-1].szName, &rgbstrNames[u]),
+ LError1);
+ }
+
+ *pcNames = cNames;
+
+ return NOERROR;
+
+LError1:;
+ // unwind BSTR allocations
+ for(u = 0; u <= pmdata->cArgs; ++u){
+ if(rgbstrNames[u] == NULL)
+ break;
+ SysFreeString(rgbstrNames[0]);
+ rgbstrNames[u] = NULL;
+ }
+
+LError0:;
+ return hresult;
+}
+
+
+STDMETHODIMP
+CDispTypeInfo::GetRefTypeOfImplType(
+ unsigned int index,
+ HREFTYPE FAR* phreftype)
+{
+ UNUSED(index);
+
+ if(m_tkind != TKIND_COCLASS)
+ return RESULT(E_UNEXPECTED); // REVIEW
+
+ *phreftype = 0;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTypeInfo::GetImplTypeFlags(
+ unsigned int index,
+ int FAR* pimpltypeflags)
+{
+ UNUSED(index);
+ UNUSED(pimpltypeflags);
+
+ return RESULT(E_NOTSUPPORTED);
+}
+
+/***
+*HRESULT CDispTypeInfo::GetIDsOfNames
+*Purpose:
+* Translate the given array of names (method and optional params)
+* into a corresponding array of DISPIDs.
+*
+*Entry:
+* rgszNames = the array of names to translate
+* cNames = count of names
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+* DISP_E_UNKNOWNNAME
+*
+* rgmemid[] = array of DISPIDs corresponding to the given array of names
+*
+*Note:
+*
+* This routine depends on the PARAMDATA structure being declared in
+* the correct positional order - because the DISPID of a param name
+* is its one based positional index (textually). Unfortunately there
+* is no way to verify that this structure was declared properly by
+* the caller.
+*
+***********************************************************************/
+STDMETHODIMP
+CDispTypeInfo::GetIDsOfNames(
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ MEMBERID FAR* rgmemid)
+{
+ int cbName;
+ HRESULT hresult;
+ METHODDATA FAR* pmdata;
+ unsigned int iName, nName, cMembers, cArgs;
+
+ // REVIEW: do we really want to error on the following?
+ if(cNames == 0)
+ return RESULT(E_INVALIDARG);
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(rgszNames, cNames * sizeof(OLECHAR FAR*)))
+ return RESULT(E_INVALIDARG);
+ for(iName = 0; iName < cNames; ++iName){
+ if(FIsBadStringPtr(rgszNames[iName], (unsigned int)-1))
+ return RESULT(E_INVALIDARG);
+ }
+ if(IsBadWritePtr(rgmemid, cNames * sizeof(DISPID)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ // Lookup the member name
+ cbName = STRLEN(rgszNames[0]);
+ cMembers = m_pidata->cMembers;
+ for(iName = 0;; ++iName){
+ if(iName == cMembers)
+ goto LMemberNotFound;
+ pmdata = &m_pidata->pmethdata[iName];
+ if(StrICmp(rgszNames[0], cbName, pmdata->szName, -1) == 0){
+ rgmemid[0] = pmdata->dispid;
+ break;
+ }
+ }
+
+ hresult = NOERROR;
+
+ if(cNames > 1){
+ // Lookup the named parameters.
+ cArgs = pmdata->cArgs;
+ for(iName = 1; iName < cNames; ++iName){
+
+ cbName = STRLEN(rgszNames[iName]);
+
+ for(nName = 0;; nName++) {
+
+ if(nName == cArgs) {
+ hresult = RESULT(DISP_E_UNKNOWNNAME);
+ rgmemid[iName] = -1;
+ break;
+ }
+
+ if(StrICmp(rgszNames[iName], cbName,
+ pmdata->ppdata[nName].szName, -1) == 0) {
+ // the named param ID is defined to be its zero based
+ // positional index.
+ //
+ // Note: this requires that the paramdata array be declared
+ // in positional order.
+ //
+ rgmemid[iName] = (DISPID) nName;
+ break;
+ }
+ }
+ }
+ }
+
+ return hresult;
+
+LMemberNotFound:;
+ // If we can't find the member name, then we can find the named
+ // params either, so everything is unknown.
+ MEMSET(rgmemid, 0xFF, cNames * sizeof(DISPID));
+
+ return RESULT(DISP_E_UNKNOWNNAME);
+}
+
+
+EXTERN_C INTERNAL_(HRESULT)
+IndexOfParam(
+ DISPPARAMS FAR* pdispparams,
+ unsigned int uPosition,
+ unsigned int FAR* puArgIndex);
+
+
+/***
+*PUBLIC HRESULT CDispTypeInfo::Invoke(...)
+*Purpose:
+* Implementation of ITypeInfo::Invoke
+*
+*Entry:
+* UNDONE
+* ...
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+* E_OUTOFMEMORY
+* DISP_E_TYPEMISMATCH - could not coerce arg to expected type
+* DISP_E_PARAMNOTFOUND - could not locate the param in the DISPPARAMS
+*
+* *pvarResult = UNDONE
+* *pexcepinfo = UNDONE
+* *puArgErr = UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CDispTypeInfo::Invoke(
+ void FAR* pvInstance,
+ MEMBERID memid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ unsigned int uArgErr;
+ HRESULT hresult;
+ VARIANT varResultTmp;
+ METHODDATA FAR* pmdata;
+ INVOKEARGS FAR* pinvargs;
+
+ // the caller may be ignoring these... this simplifies the following code
+ //
+ V_VT(&varResultTmp) = VT_EMPTY;
+ if(pvarResult == NULL)
+ pvarResult = &varResultTmp;
+ if(puArgErr == NULL)
+ puArgErr = &uArgErr;
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(pvInstance, sizeof(void FAR*)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadDispParams(pdispparams))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pvarResult, sizeof(*pvarResult)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(puArgErr, sizeof(*puArgErr)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if(!IsLegalInvokeFlags(wFlags))
+ return RESULT(E_INVALIDARG);
+
+ if(PmdataOfDispid(memid, wFlags, &pmdata) == NOERROR){
+
+ if(pdispparams->cArgs == pmdata->cArgs){
+
+ goto LInvokeStandard;
+
+ }else if(pdispparams->cArgs > pmdata->cArgs){
+
+ // handle possible indexed collection property access
+
+ if(IsPropGet(wFlags)){
+
+ if(IsPropGet(pmdata->wFlags) && pmdata->cArgs == 0)
+ goto LCollectionProperty;
+
+ }else if(IsPropPut(wFlags)){
+
+ if(IsPropPut(pmdata->wFlags) && pmdata->cArgs == 1){
+ if(PmdataOfPropGet(memid, &pmdata) == NOERROR && pmdata->cArgs == 0)
+ goto LCollectionProperty;
+ }
+ }
+
+ }else{ // pdispparams->cArgs < pmdata->cArgs
+
+ // handle possible optional arguments
+
+ // Note: DispTypeInfo doesnt support optional parameters
+
+ }
+
+ return RESULT(DISP_E_BADPARAMCOUNT);
+ }
+
+ // Member not found - but there is one more special case to check for.
+ //
+ // This may be an indexed collection PropertyPut where the collection
+ // property itself has only a get method.
+
+ if(IsPropPut(wFlags) &&
+ (GetScode(PmdataOfDispid(memid,
+ (wFlags == DISPATCH_PROPERTYPUT) ?
+ DISPATCH_PROPERTYPUTREF :
+ DISPATCH_PROPERTYPUT,
+ &pmdata)) == DISP_E_MEMBERNOTFOUND))
+ {
+ if(PmdataOfPropGet(memid, &pmdata) == NOERROR && pmdata->cArgs == 0)
+ goto LCollectionProperty;
+ }
+
+ return RESULT(DISP_E_MEMBERNOTFOUND);
+
+// standard method or property invocation
+//
+LInvokeStandard:;
+
+ IfFailGo(
+ GetInvokeArgs(pmdata, wFlags, pdispparams, &pinvargs, puArgErr),
+ LError0);
+
+ hresult = DoInvokeMethod(
+ pvInstance,
+ pmdata->iMeth * sizeof(void FAR*),
+ pmdata->cc,
+ pmdata->vtReturn,
+ pinvargs->cArgs,
+ pinvargs->rgvt,
+ pinvargs->rgpvarg,
+ pvarResult);
+
+ ReleaseInvokeArgs(pinvargs);
+
+ if(V_VT(&varResultTmp) != VT_EMPTY)
+ VariantClear(&varResultTmp);
+
+ return hresult;
+
+
+LCollectionProperty:;
+
+ VARIANT varTmp;
+
+ ASSERT(pmdata->cArgs == 0 && IsPropGet(pmdata->wFlags));
+
+ IfFailGo(
+ DoInvokeMethod(
+ pvInstance,
+ pmdata->iMeth * sizeof(void FAR*),
+ pmdata->cc,
+ pmdata->vtReturn,
+ 0, NULL, NULL, &varTmp),
+ LError0);
+
+ if ((V_VT(&varTmp) != VT_DISPATCH))
+ hresult = RESULT(DISP_E_NOTACOLLECTION);
+ else {
+ IDispatch FAR* pdisp;
+
+ pdisp = V_DISPATCH(&varTmp);
+ hresult = pdisp ?
+ pdisp->Invoke(DISPID_VALUE, IID_NULL,
+ m_lcid, wFlags, pdispparams,
+ pvarResult, pexcepinfo, puArgErr) :
+ RESULT(DISP_E_MEMBERNOTFOUND);
+ }
+
+ VariantClear(&varTmp);
+
+ if(V_VT(&varResultTmp) != VT_EMPTY)
+ VariantClear(&varResultTmp);
+
+ return hresult;
+
+
+LError0:;
+ return hresult;
+}
+
+
+/***
+*PRIVATE HRESULT CDispTypeInfo::AllocInvokeArgs
+*Purpose:
+* Allocate and initialize an INVOKEARGS structure
+*
+*Entry:
+* cArgs = the count of args to be held by the invokeargs struct
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppinvargs = ptr to a newly allocated INVOKEARGS struct
+*
+* REVIEW: the following could be optimized by allocating a single block
+* for the whole deal - and then fixeing up the ptrs accordingly...
+*
+***********************************************************************/
+HRESULT
+CDispTypeInfo::AllocInvokeArgs(unsigned int cArgs, INVOKEARGS FAR* FAR* ppinvargs)
+{
+ INVOKEARGS FAR* pinvargs;
+
+ if((pinvargs = new FAR INVOKEARGS) == NULL)
+ goto LError0;
+ pinvargs->cArgs = cArgs;
+ if(cArgs == 0){
+ pinvargs->rgvarg = NULL;
+ pinvargs->rgpvarg = NULL;
+ pinvargs->rgvt = NULL;
+ }else{
+ if((pinvargs->rgvarg = new FAR VARIANTARG[cArgs]) == NULL)
+ goto LError1;
+ if((pinvargs->rgpvarg = new FAR VARIANTARG FAR*[cArgs]) == NULL)
+ goto LError2;
+ if((pinvargs->rgvt = new FAR VARTYPE[cArgs]) == NULL)
+ goto LError3;
+
+ for(unsigned int u = 0; u < cArgs; ++u)
+ V_VT(&pinvargs->rgvarg[u]) = VT_EMPTY;
+ }
+ *ppinvargs = pinvargs;
+ return NOERROR;
+
+LError3:;
+ delete pinvargs->rgpvarg;
+LError2:;
+ delete pinvargs->rgvarg;
+LError1:;
+ delete pinvargs;
+LError0:;
+ return RESULT(E_OUTOFMEMORY);
+}
+
+
+/***
+*PRIVATE HRESULT CDispTypeInfo::GetInvokeArgs
+*Purpose:
+* Gather all arguments (looking up by position or name), coerce
+* to the expected type (if possible) and build a linearized
+* positional array of pointers to those arguments.
+*
+* Note: this is a helper for ITypeInfo::Invoke implementations
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppinvargs =
+* *puArgErr = if there was an error coercing an argument, this is the
+* index in the pdispparams->rgvarg array of the problem arg.
+*
+***********************************************************************/
+HRESULT
+CDispTypeInfo::GetInvokeArgs(
+ METHODDATA FAR* pmdata,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ INVOKEARGS FAR* FAR* ppinvargs,
+ unsigned int FAR* puArgErr)
+{
+ VARTYPE vt;
+ HRESULT hresult;
+ PARAMDATA FAR* ppdata;
+ unsigned int u, uArgIndex, cArgs;
+ INVOKEARGS FAR* pinvargs;
+ VARIANTARG FAR* pvarg, FAR* pvargSrc;
+
+ // DispTypeInfo doesnt support optional arguments of any kind...
+ ASSERT(pmdata->cArgs == pdispparams->cArgs);
+
+ IfFailRet(AllocInvokeArgs(pdispparams->cArgs, &pinvargs));
+
+ if((cArgs = pinvargs->cArgs) == 0)
+ goto LDone;
+
+ ppdata = pmdata->ppdata;
+
+ // Gather actuals based on expected argument type. Note that
+ // the interpretation of VARTYPE as an argument type is a bit
+ // different that its interpretation as a VARIANT type tag
+ // (see VT_VARIANT below).
+ //
+ for(u = 0; u < cArgs; ++u){
+
+ // locate the index of the param identified by position 'u'
+ // in the dispparams rgvarg array
+
+ // special case the handling of the rhs of a property put
+
+ if(u == (cArgs-1) && IsPropPut(wFlags)){
+
+ if (pdispparams->cNamedArgs == 0
+ || pdispparams->rgdispidNamedArgs[0] != DISPID_PROPERTYPUT)
+ {
+ hresult = RESULT(DISP_E_PARAMNOTOPTIONAL); // REVIEW: correct error?
+ goto LError0;
+ }
+
+ uArgIndex = 0;
+
+ }else{
+
+ IfFailGo(IndexOfParam(pdispparams, u, &uArgIndex), LError0);
+ }
+
+ pvargSrc = &pdispparams->rgvarg[uArgIndex];
+
+ // attempt to coerce the actual to the expected type
+
+ vt = pinvargs->rgvt[u] = ppdata[u].vt;
+
+ switch(vt){
+#if VBA2
+ case VT_UI1:
+#endif //VBA2
+ case VT_I2:
+ case VT_I4:
+ case VT_R4:
+ case VT_R8:
+ case VT_CY:
+ case VT_DATE:
+ case VT_BSTR:
+ case VT_ERROR:
+ case VT_BOOL:
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ pvarg = &pinvargs->rgvarg[u];
+ hresult = VariantChangeType(pvarg, pvargSrc, 0, vt);
+ if(hresult != NOERROR){
+ *puArgErr = uArgIndex;
+ // If VariantChangeType returned a TypeMismatch, and the
+ // TypeMismatch was do to an attempt to pass an unsupplied
+ // optional param to a non variant argument, then translate
+ // the error to the more appropriate DISP_E_PARAMNOTOPTIONAL
+ //
+ // Remember: unsupplied optional params are passed by the
+ // client as VT_ERROR(DISP_E_PARAMNOTFOUND)
+ //
+ if(GetScode(hresult) == DISP_E_TYPEMISMATCH){
+ if (V_VT(pvargSrc) == VT_ERROR
+ && V_ERROR(pvargSrc) == DISP_E_PARAMNOTFOUND)
+ {
+ hresult = RESULT(DISP_E_PARAMNOTOPTIONAL);
+ }
+ }
+ goto LError0;
+ }
+ pinvargs->rgpvarg[u] = pvarg;
+ break;
+
+ // Note that VT_VARIANT is not a legal VARIANT type tag, but
+ // as an argument type, it means to simply pass the entire
+ // VARIANTARG to the member as-is.
+ //
+ case VT_VARIANT:
+ pinvargs->rgpvarg[u] = pvargSrc;
+ break;
+
+ default:
+ if(vt & (VT_BYREF | VT_ARRAY)){
+ // If the target argument is ByRef (or Array), then we
+ // require an exact match in type between formal and actual
+ // because we want the original copy to get updated, and
+ // we cant of course coerce the original in place (and we
+ // dont have rules for the coersion of an Array).
+ //
+ if(V_VT(pvargSrc) != vt){
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ goto LError0;
+ }
+ pinvargs->rgpvarg[u] = pvargSrc;
+ break;
+ }
+
+ // Otherwise: unrecognized or unsupported member argument type.
+ // this means there is a problem with the given method description.
+ //
+ // REVIEW: probably need better error code
+ //
+ hresult = RESULT(E_INVALIDARG);
+ goto LError0;
+ }
+ }
+
+LDone:;
+ *ppinvargs = pinvargs;
+ return NOERROR;
+
+LError0:;
+ ReleaseInvokeArgs(pinvargs);
+ *ppinvargs = NULL;
+ return hresult;
+}
+
+
+void
+CDispTypeInfo::ReleaseInvokeArgs(INVOKEARGS FAR* pinvargs)
+{
+ if(pinvargs != NULL){
+ if(pinvargs->rgvarg != NULL){
+ for(unsigned int u = 0; u < pinvargs->cArgs; ++u)
+ VariantClear(&pinvargs->rgvarg[u]);
+ delete pinvargs->rgvarg;
+ }
+ if(pinvargs->rgpvarg != NULL)
+ delete pinvargs->rgpvarg;
+ if(pinvargs->rgvt != NULL)
+ delete pinvargs->rgvt;
+ delete pinvargs;
+ }
+}
+
+
+STDMETHODIMP
+CDispTypeInfo::GetDocumentation(
+ MEMBERID memid,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile)
+{
+ HRESULT hresult;
+ unsigned short wFlags;
+ METHODDATA FAR* pmdata;
+
+#if 0
+ // REVIEW: add this if we decide to add an szName field to the
+ // INTERFACEDATA struct.
+
+ // get documentation of the TypeInfo itself
+ //
+ if(memid == DISPID_NONE){
+ if(pbstrName != NULL)
+ return ErrSysAllocString(m_pidata->szName, pbstrName);
+ }
+#endif
+
+ wFlags = DISPATCH_METHOD|DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF|DISPATCH_PROPERTYGET;
+ IfFailGo(PmdataOfDispid(memid, wFlags, &pmdata), LError0);
+
+ if(pbstrName != NULL){
+ IfFailGo(ErrSysAllocString(pmdata->szName, pbstrName), LError0);
+ }
+
+ // INTERFACEDATA does not supply the following info
+ //
+ *pbstrDocString = NULL;
+ *pdwHelpContext = 0L;
+ *pbstrHelpFile = NULL;
+
+ return NOERROR;
+
+LError0:;
+ return hresult;
+}
+
+
+STDMETHODIMP
+CDispTypeInfo::GetDllEntry(
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ BSTR FAR* pbstrDllName,
+ BSTR FAR* pbstrName,
+ unsigned short FAR* pwOrdinal)
+{
+ UNUSED(memid);
+ UNUSED(invkind);
+ UNUSED(pbstrDllName);
+ UNUSED(pbstrName);
+ UNUSED(pwOrdinal);
+
+ return RESULT(E_NOTSUPPORTED);
+}
+
+
+STDMETHODIMP
+CDispTypeInfo::GetRefTypeInfo(
+ HREFTYPE hreftype,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ ITypeInfo FAR* ptinfo;
+
+ if(m_tkind != TKIND_COCLASS)
+ return RESULT(E_FAIL);
+
+ // INTERFACEDATA only describes a CoClass with a single reftype
+ if(hreftype != 0)
+ return RESULT(E_FAIL);
+
+ IfFailRet(
+ CDispTypeInfo::Create(TKIND_INTERFACE, m_pidata, m_lcid, &ptinfo));
+
+ *pptinfo = ptinfo;
+
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTypeInfo::AddressOfMember(
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ void FAR* FAR* ppv)
+{
+ UNUSED(memid);
+ UNUSED(invkind);
+ UNUSED(ppv);
+
+ return RESULT(E_NOTSUPPORTED);
+}
+
+STDMETHODIMP
+CDispTypeInfo::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv)
+{
+ UNUSED(ppv);
+
+ return RESULT(E_NOTSUPPORTED);
+}
+
+STDMETHODIMP
+CDispTypeInfo::GetMops(
+ MEMBERID memid,
+ BSTR FAR* pbstrMops)
+{
+ UNUSED(memid);
+ UNUSED(pbstrMops);
+
+ return RESULT(E_NOTSUPPORTED);
+}
+
+STDMETHODIMP
+CDispTypeInfo::GetContainingTypeLib(
+ ITypeLib FAR* FAR* pptlib,
+ unsigned int FAR* pindex)
+{
+ UNUSED(pptlib);
+ UNUSED(pindex);
+
+ return RESULT(E_NOTSUPPORTED);
+}
+
+STDMETHODIMP_(void)
+CDispTypeInfo::ReleaseTypeAttr(TYPEATTR FAR* ptattr)
+{
+ delete ptattr;
+}
+
+STDMETHODIMP_(void)
+CDispTypeInfo::ReleaseFuncDesc(FUNCDESC FAR* pfuncdesc)
+{
+ delete pfuncdesc->lprgelemdescParam;
+ delete pfuncdesc;
+}
+
+STDMETHODIMP_(void)
+CDispTypeInfo::ReleaseVarDesc(VARDESC FAR* pvardesc)
+{
+ UNUSED(pvardesc);
+
+#ifdef _DEBUG
+ // an INTERFACEDATA driven typeinfo never returns a
+ // VARDESC (because it cannot describe variables), so
+ // we should never try to free one.
+ //
+ ASSERT(UNREACHED);
+#endif
+}
+
+
+//---------------------------------------------------------------------
+// utilities
+//---------------------------------------------------------------------
+
+
+#if 0
+/***
+*PRIVATE HRESULT PmdataOfImeth(INTERFACEDATA*, unsigned int, METHODDATA**)
+*Purpose:
+* Return the METHODDATA that corresponds to the method with the
+* given method index (iMeth).
+*
+*Entry:
+* pidata = the INTERFACEDATA to do the lookup on
+* iMeth = the method index
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* DISP_E_MEMBERNOTFOUND
+*
+* *ppmdata = the method data of the given index
+*
+***********************************************************************/
+HRESULT
+PmdataOfImeth(
+ INTERFACEDATA FAR* pidata,
+ unsigned int iMeth,
+ METHODDATA FAR* FAR* ppmdata)
+{
+ METHODDATA FAR* pmdata, FAR* pmdataEnd;
+
+
+ pmdata = pidata->pmethdata;
+ pmdataEnd = &pmdata[pidata->cMembers];
+ for(; pmdata < pmdataEnd; ++pmdata){
+ if(pmdata->iMeth == iMeth){
+ *ppmdata = pmdata;
+ return NOERROR;
+ }
+ }
+ return RESULT(DISP_E_MEMBERNOTFOUND);
+}
+
+#endif
+
+/***
+*PRIVATE HRESULT CDispTypeInfo::PmdataOfDispid
+*Purpose:
+* Return the METHODDATA that corresponds to the given memberid
+* and invoke flags.
+*
+*Entry:
+* memid = the method id
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* DISP_E_MEMBERNOTFOUND
+*
+* *ppmdata = the method data of the given member id
+*
+***********************************************************************/
+HRESULT
+CDispTypeInfo::PmdataOfDispid(
+ MEMBERID memid,
+ unsigned short wFlags,
+ METHODDATA FAR* FAR* ppmdata)
+{
+ METHODDATA FAR* pmdata, FAR* pmdataEnd;
+
+ pmdata = m_pidata->pmethdata;
+ pmdataEnd = &pmdata[m_pidata->cMembers];
+ for(; pmdata < pmdataEnd; ++pmdata){
+ if(pmdata->dispid == (DISPID)memid && (pmdata->wFlags & wFlags) != 0){
+ *ppmdata = pmdata;
+ return NOERROR;
+ }
+ }
+ return RESULT(DISP_E_MEMBERNOTFOUND);
+}
diff --git a/private/oleauto/src/dispatch/cdispti.h b/private/oleauto/src/dispatch/cdispti.h
new file mode 100644
index 000000000..e0903a731
--- /dev/null
+++ b/private/oleauto/src/dispatch/cdispti.h
@@ -0,0 +1,111 @@
+/***
+*cdispti.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of CDispTypeInfo.
+*
+*
+*Revision History:
+*
+* [00] 19-Nov-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+class CDispTypeInfo : public ITypeInfo {
+public:
+ static HRESULT Create(CDispTypeInfo FAR* FAR* pptinfo);
+
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+
+ // ITypeInfo methods
+ //
+ STDMETHOD(GetTypeAttr)(TYPEATTR FAR* FAR* pptattr);
+
+ STDMETHOD(GetTypeComp)(ITypeComp FAR* FAR* pptcomp);
+
+ STDMETHOD(GetFuncDesc)(unsigned int index, FUNCDESC FAR* FAR* ppfuncdesc);
+
+ STDMETHOD(GetVarDesc)(unsigned int index, VARDESC FAR* FAR* ppvardesc);
+
+ STDMETHOD(GetNames)(
+ MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ unsigned int cMaxNames,
+ unsigned int FAR* pcNames);
+
+ STDMETHOD(GetRefTypeOfImplType)(
+ unsigned int index,
+ HREFTYPE FAR* phreftype);
+
+ STDMETHOD(GetImplTypeFlags)(
+ unsigned int index,
+ int FAR* pimpltypeflags);
+
+ STDMETHOD(GetIDsOfNames)(
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ MEMBERID FAR* rgmemid);
+
+ STDMETHOD(Invoke)(
+ void FAR* pvInstance,
+ MEMBERID memid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ STDMETHOD(GetDocumentation)(
+ MEMBERID memid,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile);
+
+ STDMETHOD(GetDllEntry)(
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ BSTR FAR* pbstrDllName,
+ BSTR FAR* pbstrName,
+ unsigned short FAR* pwOrdinal);
+
+ STDMETHOD(GetRefTypeInfo)(
+ HREFTYPE hreftype, ITypeInfo FAR* FAR* pptinfo);
+
+ STDMETHOD(AddressOfMember)(
+ MEMBERID memid, INVOKEKIND invkind, void FAR* FAR* ppv);
+
+ STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv);
+
+ STDMETHOD(GetMops)(MEMBERID memid, BSTR FAR* pbstrMops);
+
+ STDMETHOD(GetContainingTypeLib)(
+ ITypeLib FAR* FAR* pptlib, unsigned int FAR* pindex);
+
+ STDMETHOD_(void, ReleaseTypeAttr)(TYPEATTR FAR* ptattr);
+ STDMETHOD_(void, ReleaseFuncDesc)(FUNCDESC FAR* pfuncdesc);
+ STDMETHOD_(void, ReleaseVarDesc)(VARDESC FAR* pvardesc);
+
+ CDispTypeInfo();
+
+ LCID m_lcid;
+
+ INTERFACEDATA FAR* m_pidata;
+
+private:
+
+ unsigned long m_refs;
+};
diff --git a/private/oleauto/src/dispatch/clsid.c b/private/oleauto/src/dispatch/clsid.c
new file mode 100644
index 000000000..7d2fea73d
--- /dev/null
+++ b/private/oleauto/src/dispatch/clsid.c
@@ -0,0 +1,54 @@
+/***
+*clsid.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates and initializes the CLSIDs.
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# ifdef _MSC_VER
+# include <macos/types.h>
+# include <macos/packages.h>
+# include <macos/resource.h>
+# include <macos/menus.h>
+# include <macos/windows.h>
+# include <macos/osutils.h>
+# include <macos/appleeve.h>
+# define far
+# define FAR far
+# define near
+# define NEAR near
+# ifndef _PPCMAC
+# define pascal _pascal
+# endif
+# define PASCAL pascal
+# define cdecl _cdecl
+# define CDECL cdecl
+# else
+# include <types.h>
+# include <packages.h>
+# include <resources.h>
+# include <menus.h>
+# include <windows.h>
+# include <appleevents.h>
+# include <osutils.h>
+# include <AppleEvents.h>
+# endif
+#else
+# include <windows.h>
+#endif
+#include <ole2.h>
+
+// this redefines the Ole DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+// due to the previous header, including this causes the DEFINE_GUID
+// definitions in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
+
diff --git a/private/oleauto/src/dispatch/clsid.h b/private/oleauto/src/dispatch/clsid.h
new file mode 100644
index 000000000..2cd71d998
--- /dev/null
+++ b/private/oleauto/src/dispatch/clsid.h
@@ -0,0 +1,28 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(WIN32) && 0
+DEFINE_OLEGUID(CLSID_PSDispatch, 0x00020400, 0, 0);
+DEFINE_OLEGUID(CLSID_PSEnumVARIANT, 0x00020404, 0, 0);
+DEFINE_OLEGUID(CLSID_PSTypeInfo, 0x00020401, 0, 0);
+DEFINE_OLEGUID(CLSID_PSTypeLib, 0x00020402, 0, 0);
+#else
+DEFINE_OLEGUID(CLSID_PSDispatch, 0x00020420, 0, 0);
+DEFINE_OLEGUID(CLSID_PSEnumVARIANT, 0x00020421, 0, 0);
+DEFINE_OLEGUID(CLSID_PSTypeInfo, 0x00020422, 0, 0);
+DEFINE_OLEGUID(CLSID_PSTypeLib, 0x00020423, 0, 0);
+#endif
+
+DEFINE_OLEGUID(CLSID_PSAutomation, 0x00020424, 0, 0);
+DEFINE_OLEGUID(CLSID_PSTypeComp, 0x00020425, 0, 0);
+
diff --git a/private/oleauto/src/dispatch/convert.cpp b/private/oleauto/src/dispatch/convert.cpp
new file mode 100644
index 000000000..df899762a
--- /dev/null
+++ b/private/oleauto/src/dispatch/convert.cpp
@@ -0,0 +1,2939 @@
+/***
+*convert.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module contains the low level VARTYPE coersion API.
+*
+*
+*Revision History:
+*
+* [00] 17-May-93 tomteng: from VBA oleconv.c
+* [01] 27-Jun-93 bassams: Enable LCID-based to/from string conversions.
+* recognize currency and various negative formats
+* in VarCyFromStr.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+#include <ctype.h>
+#if !OE_MAC || HC_MPW
+// something in the wings errno.h is conflicting with stdlib.h
+#include <errno.h>
+#endif
+#include <stdlib.h>
+
+ASSERTDATA
+
+#ifndef EZERO
+# define EZERO 0
+#endif
+
+
+#if _X86_ || OE_WIN16
+
+typedef struct {
+ BYTE lo:4;
+ BYTE hi:4;
+} DIGARY[10];
+
+typedef struct {
+ ULONG mantLo;
+ ULONG mantHi:19;
+ ULONG mantMSB:1;
+ ULONG exp:11;
+ ULONG sign:1;
+} DBLSTRUCT;
+
+OLECHAR pstrInf[] = OASTR("INF");
+OLECHAR pstrInd[] = OASTR("IND");
+OLECHAR pstrNan[] = OASTR("NAN");
+
+#endif // _X86_ || OE_WIN16
+
+
+// The following are supplied by $(TARG)\oleconva.$(A)
+
+extern "C" {
+
+// Note: the floating point IN params on the following utilities are
+// passed byref, because mpw and wings pass floating point values
+// differently byval, and we need to interface these asm routines
+// with both compilers.
+
+INTERNAL_(HRESULT) ErrCyFromI2(short sIn, CY FAR* pcyOut);
+INTERNAL_(HRESULT) ErrCyFromI4(long lIn, CY FAR* pcyOut);
+INTERNAL_(HRESULT) ErrCyFromR4(float FAR* pfltIn, CY FAR* pcyOut);
+INTERNAL_(HRESULT) ErrCyFromR8(double FAR* pdlbIn, CY FAR* pcyOut);
+INTERNAL_(HRESULT) ErrI2FromCy(CY cyIn, short FAR* psOut);
+INTERNAL_(HRESULT) ErrI4FromCy(CY cyIn, long FAR* plOut);
+INTERNAL_(HRESULT) ErrR4FromCy(CY cyIn, float FAR* pfltOut);
+INTERNAL_(HRESULT) ErrR8FromCy(CY cyIn, double FAR* pdblOut);
+INTERNAL_(HRESULT) ErrMultCyI4(CY cyIn, long lIn, CY FAR* pcyOut);
+
+#if OE_WIN16 || _X86_
+int PASCAL ConvFloatToAscii(double dblIn, DIGARY NEAR *pdigOut);
+
+// WARNING: Do not call this on Win16 if there is no math coprocessor
+// WARNING: present - the win87em.dll emulator does not implement
+// WARNING: fbstp. The FP stack will remain unchanged and the destination
+// WARNING: address is not written to. VBA #3514 (Win32 emulator is OK)
+void NEAR PASCAL DoFbstp(CY NEAR *pcyIn, DIGARY NEAR *pdigOut);
+#endif
+
+}
+
+OLECHAR CurrencyFromLcid(LCID lcid, unsigned long dwFlags);
+OLECHAR DecimalFromLcid(LCID lcid, unsigned long dwFlags);
+OLECHAR ThousandFromLcid(LCID lcid, unsigned long dwFlags);
+INTERNAL_(HRESULT) StripThousandSeparator(OLECHAR FAR* strIn,
+ OLECHAR FAR* strOut, LCID lcid, long dwFlags);
+
+PRIVATE_(long)
+ConvI4FromR8(double FAR* pdblVal);
+
+PRIVATE_(HRESULT)
+StrToCy(OLECHAR FAR*, OLECHAR FAR* FAR*, int, CY FAR*, LCID, unsigned long dwFlags);
+
+PRIVATE_(long)
+StrToLong(OLECHAR FAR* pchInput, OLECHAR FAR* FAR* ppchAfter);
+
+PRIVATE_(unsigned long)
+StrToOct(OLECHAR FAR* pchIn, OLECHAR FAR* FAR* ppchAfter);
+
+PRIVATE_(unsigned long)
+StrToHex(OLECHAR FAR* pchIn, OLECHAR FAR* FAR* ppchAfter);
+
+PRIVATE_(long)
+HexOctStrToLong(OLECHAR FAR* pchInput, OLECHAR FAR* FAR* ppchAfter);
+
+PRIVATE_(void)
+EditStrFromReal(OLECHAR FAR* pchBuffer, int cDigits, LCID lcid, unsigned long dwFlags);
+
+PRIVATE_(int)
+FMakePosCy(CY FAR* pcyValue);
+
+PRIVATE_(void)
+NegCyNoOflo(CY FAR* pcyInput);
+
+PRIVATE_(int)
+FixNegativeCyStr(OLECHAR FAR* pInput, OLECHAR cDecimal, int FAR* fReturnNegative);
+
+PRIVATE_(int)
+fStripCurrency (OLECHAR FAR* FAR* ppch, OLECHAR FAR* FAR* ppchLast, OLECHAR FAR* cySymbol);
+
+PRIVATE_(int)
+fParseEnd (OLECHAR FAR* FAR* ppchLast, OLECHAR FAR* sz, OLECHAR FAR* lpchFirst);
+
+PRIVATE_(int)
+fParseBegin (OLECHAR FAR* FAR* ppch, OLECHAR FAR* sz, OLECHAR FAR* lpchLast);
+
+PRIVATE_(HRESULT)
+GetDispProperty(
+ IDispatch FAR* pdisp,
+ LCID lcid,
+ VARTYPE vt,
+ VARIANT FAR* pvarResult);
+
+extern "C" {
+
+INTERNAL_(HRESULT)
+DispAlloc(size_t cb, void FAR* FAR* ppv)
+{
+ void FAR* pv;
+ HRESULT hresult;
+ IMalloc FAR* pmalloc;
+
+ IfFailRet(GetMalloc(&pmalloc));
+
+ hresult = NOERROR;
+ if((pv = (void FAR*)pmalloc->Alloc(cb)) == NULL)
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+
+ *ppv = pv;
+
+ return hresult;
+}
+
+INTERNAL_(void)
+DispFree(void FAR* pv)
+{
+ IMalloc FAR* pmalloc;
+
+ if(pv == NULL)
+ return;
+
+ if(GetMalloc(&pmalloc) == NOERROR) {
+ pmalloc->Free(pv);
+ }
+}
+
+};
+
+
+#if VBA2
+STDAPI
+VarBoolFromUI1(unsigned char bIn, VARIANT_BOOL FAR* pboolOut)
+{
+ *pboolOut = (bIn != 0) ? -1 : 0;
+ return NOERROR;
+}
+#endif //VBA2
+
+STDAPI
+VarBoolFromI2(short sIn, VARIANT_BOOL FAR* pboolOut)
+{
+ *pboolOut = (sIn != 0) ? -1 : 0;
+ return NOERROR;
+}
+
+STDAPI
+VarBoolFromI4(long lIn, VARIANT_BOOL FAR* pboolOut)
+{
+ *pboolOut = (lIn != 0L) ? -1 : 0;
+ return NOERROR;
+}
+
+STDAPI
+VarBoolFromR4(
+ float fltIn,
+ VARIANT_BOOL FAR* pboolOut)
+{
+ *pboolOut = (fltIn != 0.0) ? -1 : 0;
+ return NOERROR;
+}
+
+STDAPI
+VarBoolFromR8(double dblIn, VARIANT_BOOL FAR* pboolOut)
+{
+ *pboolOut = (dblIn != 0.0) ? -1 : 0;
+ return NOERROR;
+}
+
+STDAPI
+VarBoolFromDate(DATE dateIn, VARIANT_BOOL FAR* pboolOut)
+{
+ return VarBoolFromR8(dateIn, pboolOut);
+}
+
+STDAPI
+VarBoolFromCy(CY cyIn, VARIANT_BOOL FAR* pboolOut)
+{
+ *pboolOut = ((cyIn.Hi | cyIn.Lo) != 0) ? -1 : 0;
+ return NOERROR;
+}
+
+STDAPI
+VarBoolFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, VARIANT_BOOL FAR* pboolOut)
+{
+ unsigned int cbLength;
+ double dblVal;
+ HRESULT hresult;
+ OLECHAR FAR* lpStr = strIn;
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ hresult = NOERROR;
+
+ cbLength = STRLEN(strIn);
+
+ if(cbLength == 0)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ IfFailRet(MapHalfWidth(lcid, strIn, &lpStr));
+ }
+#endif
+
+ if((STRCMP(lpStr, OASTR("#FALSE#")) == 0 &&
+ cbLength == SIZEOFSTRING(OASTR("#FALSE#"))) ||
+ (STRICMP(lpStr, OASTR("FALSE")) == 0 &&
+ cbLength == SIZEOFSTRING(OASTR("FALSE"))))
+ *pboolOut = 0;
+ else if((STRCMP(lpStr, OASTR("#TRUE#")) == 0 &&
+ cbLength == SIZEOFSTRING(OASTR("#TRUE#"))) ||
+ (STRICMP(lpStr, OASTR("TRUE")) == 0 &&
+ cbLength == SIZEOFSTRING(OASTR("TRUE"))))
+ *pboolOut = -1;
+
+ else if((hresult = VarR8FromStr(lpStr, lcid, dwFlags, &dblVal)) == NOERROR)
+ *pboolOut = (short)(dblVal != 0.0) ? -1 : 0;
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ DispFree(lpStr);
+ }
+#endif
+
+ return hresult;
+}
+
+STDAPI
+VarBoolFromDisp(IDispatch FAR* pdispIn, LCID lcid, VARIANT_BOOL FAR* pboolOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ hresult = GetDispProperty(pdispIn, lcid, VT_BOOL, &varTmp);
+ if (hresult == NOERROR)
+ *pboolOut = V_BOOL(&varTmp);
+ return hresult;
+}
+
+
+#if VBA2
+STDAPI
+VarUI1FromI2(short sIn, unsigned char FAR* pbOut)
+{
+ if((unsigned short)sIn <= 255L){
+ *pbOut = (unsigned char)sIn;
+ return NOERROR;
+ }
+ return RESULT(DISP_E_OVERFLOW);
+}
+
+STDAPI
+VarUI1FromI4(long lIn, unsigned char FAR* pbOut)
+{
+ if((unsigned long)lIn <= 255L){
+ *pbOut = (unsigned char)lIn;
+ return NOERROR;
+ }
+ return RESULT(DISP_E_OVERFLOW);
+}
+
+STDAPI
+VarUI1FromR4(
+ float fltIn,
+ unsigned char FAR* pbOut)
+{
+ double dblIn = (double) fltIn;
+ return VarUI1FromR8(dblIn, pbOut);
+}
+
+
+STDAPI
+VarUI1FromR8(double dblIn, unsigned char FAR* pbOut)
+{
+ if(dblIn >= -0.5 && dblIn < 255.5){
+ *pbOut = (unsigned char)ConvI4FromR8(&dblIn);
+ return NOERROR;
+ }
+ return RESULT(DISP_E_OVERFLOW);
+}
+
+STDAPI
+VarUI1FromCy(CY cyIn, unsigned char FAR* pbOut)
+{
+ short sVal;
+ HRESULT hresult;
+
+ hresult = ErrI2FromCy(cyIn, &sVal);
+ if (hresult == NOERROR) {
+ hresult = VarUI1FromI2(sVal, pbOut);
+ }
+ return hresult;
+}
+
+STDAPI
+VarUI1FromDate(DATE dateIn, unsigned char FAR* pbOut)
+{
+ return VarUI1FromR8(dateIn, pbOut);
+}
+
+STDAPI
+VarUI1FromBool(VARIANT_BOOL boolIn, unsigned char FAR* pbOut)
+{
+ *pbOut = (unsigned char)boolIn; // UNDONE: correct???
+ return NOERROR;
+}
+
+STDAPI
+VarUI1FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, unsigned char FAR* pbOut)
+{
+ short sVal;
+ HRESULT hresult;
+
+ hresult = VarI2FromStr(strIn, lcid, dwFlags, &sVal);
+ if (hresult == NOERROR) {
+ hresult = VarUI1FromI2(sVal, pbOut);
+ }
+ return hresult;
+}
+
+STDAPI
+VarUI1FromDisp(IDispatch FAR* pdispIn, LCID lcid, unsigned char FAR* pbOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ hresult = GetDispProperty(pdispIn, lcid, VT_UI1, &varTmp);
+ if (hresult == NOERROR)
+ *pbOut = V_UI1(&varTmp);
+ return hresult;
+}
+#endif //VBA2
+
+#if VBA2
+STDAPI
+VarI2FromUI1(unsigned char bIn, short FAR* psOut)
+{
+ *psOut = (short)(unsigned short)bIn;
+ return NOERROR;
+}
+#endif //VBA2
+
+STDAPI
+VarI2FromI4(long lIn, short FAR* psOut)
+{
+ if(lIn >= -32768L && lIn <= 32767L){
+ *psOut = (short)lIn;
+ return NOERROR;
+ }
+ return RESULT(DISP_E_OVERFLOW);
+}
+
+STDAPI
+VarI2FromR4(
+ float fltIn,
+ short FAR* psOut)
+{
+ double dblIn = (double) fltIn;
+ return VarI2FromR8(dblIn, psOut);
+}
+
+
+STDAPI
+VarI2FromR8(double dblIn, short FAR* psOut)
+{
+ if(dblIn >= -32768.5 && dblIn < 32767.5){
+ *psOut = (short)ConvI4FromR8(&dblIn);
+ return NOERROR;
+ }
+ return RESULT(DISP_E_OVERFLOW);
+}
+
+STDAPI
+VarI2FromCy(CY cyIn, short FAR* psOut)
+{
+ return ErrI2FromCy(cyIn, psOut);
+}
+
+STDAPI
+VarI2FromDate(DATE dateIn, short FAR* psOut)
+{
+ return VarI2FromR8(dateIn, psOut);
+}
+
+STDAPI
+VarI2FromBool(VARIANT_BOOL boolIn, short FAR* psOut)
+{
+ *psOut = boolIn;
+ return NOERROR;
+}
+
+STDAPI
+VarI2FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, short FAR* psOut)
+{
+ long lVal;
+ HRESULT hresult;
+ OLECHAR FAR* pchStart;
+ OLECHAR FAR* lpStr;
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ if(strIn == NULL)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ IfFailRet(MapHalfWidth(lcid, strIn, &lpStr));
+ pchStart = lpStr;
+ } else
+ pchStart = lpStr = strIn;
+#else
+ pchStart = lpStr = strIn;
+#endif
+
+ // if not null, point pchStart to the first nonblank character
+ while(isspace(*pchStart))
+ pchStart++;
+
+ if((hresult = VarI4FromStr(strIn, lcid, dwFlags, &lVal)) == NOERROR){
+
+ // do special sign-extending for octal/hex value
+ if(*pchStart == OASTR('&') && lVal >= 0x8000L && lVal <= 0xffffL)
+ lVal |= 0xffff0000L;
+
+ hresult = VarI2FromI4(lVal, psOut);
+ }
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ DispFree(lpStr);
+ }
+#endif
+
+ return hresult;
+}
+
+STDAPI
+VarI2FromDisp(IDispatch FAR* pdispIn, LCID lcid, short FAR* psOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ hresult = GetDispProperty(pdispIn, lcid, VT_I2, &varTmp);
+ if (hresult == NOERROR)
+ *psOut = V_I2(&varTmp);
+ return hresult;
+}
+
+#if VBA2
+STDAPI
+VarI4FromUI1(unsigned char bIn, long FAR* plOut)
+{
+ *plOut = (long)(unsigned long)bIn;
+ return NOERROR;
+}
+#endif //VBA2
+
+STDAPI
+VarI4FromI2(short sIn, long FAR* plOut)
+{
+ *plOut = (long)sIn;
+ return NOERROR;
+}
+
+STDAPI
+VarI4FromBool(VARIANT_BOOL boolIn, long FAR* plOut)
+{
+ return VarI4FromI2(boolIn, plOut);
+}
+
+STDAPI
+VarI4FromR4(
+ float fltIn,
+ long FAR* plOut)
+{
+ return VarI4FromR8((double)fltIn, plOut);
+}
+
+STDAPI
+VarI4FromR8(double dblIn, long FAR* plOut)
+{
+ if(dblIn >= -2147483648.5 && dblIn < 2147483647.5){
+ *plOut = ConvI4FromR8(&dblIn);
+ return NOERROR;
+ }
+ return RESULT(DISP_E_OVERFLOW);
+}
+
+STDAPI
+VarI4FromCy(CY cyIn, long FAR* plOut)
+{
+ return ErrI4FromCy(cyIn, plOut);
+}
+
+STDAPI
+VarI4FromDate(DATE dateIn, long FAR* plOut)
+{
+ return VarI4FromR8(dateIn, plOut);
+}
+
+STDAPI
+VarI4FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, long FAR* plOut)
+{
+ long lVal;
+ unsigned int cbLen;
+ double dblVal;
+ HRESULT hresult;
+ OLECHAR FAR* pchStart;
+ OLECHAR FAR* pchAfter;
+ OLECHAR FAR* lpStr;
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ if (strIn == NULL)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ IfFailRet(MapHalfWidth(lcid, strIn, &lpStr));
+ pchStart = lpStr;
+ } else
+ pchStart = lpStr = strIn;
+#else
+ pchStart = lpStr = strIn;
+#endif
+
+ while (isspace(*pchStart))
+ pchStart++;
+
+ if (*pchStart == OASTR('\0')) {
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ goto LError0;
+ }
+
+ errno = EZERO;
+
+ if (*pchStart == OASTR('&'))
+ lVal = HexOctStrToLong(pchStart, &pchAfter);
+ else
+ lVal = StrToLong(pchStart, &pchAfter);
+
+ while (isspace(*pchAfter))
+ pchAfter++;
+
+ cbLen = STRLEN(lpStr);
+
+ if (pchAfter == (lpStr + cbLen) && errno == EZERO)
+ hresult = NOERROR;
+
+ else if ((hresult = VarR8FromStr(strIn, lcid, dwFlags, &dblVal)) == NOERROR)
+ hresult = VarI4FromR8(dblVal, &lVal);
+
+ // assign the return value if the coersion was successful
+ if(hresult == NOERROR)
+ *plOut = lVal;
+
+
+LError0:
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ DispFree(lpStr);
+ }
+#endif
+
+ return hresult;
+}
+
+STDAPI
+VarI4FromDisp(IDispatch FAR* pdispIn, LCID lcid, long FAR* plOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ hresult = GetDispProperty(pdispIn, lcid, VT_I4, &varTmp);
+ if (hresult == NOERROR)
+ *plOut = V_I4(&varTmp);
+ return hresult;
+}
+
+PRIVATE_(long)
+ConvI4FromR8(double FAR* pdblVal)
+{
+ long lResult;
+ double dblInt, dblFrac;
+
+ // split double value into integer and fractional parts
+
+ dblFrac = modf(*pdblVal, &dblInt);
+
+
+ // convert the integer part to a long value
+ //[barrybo] WARNING: the caller must ensure that the R8 to I4 conversion
+ // will not overflow the I4. If it does, the Win16
+ // compiler doesn't call FWAIT after the _aFftol call
+ // so the exception won't be raised until the next
+ // FWAIT, which may not be for a very long time.
+ // Ole2Disp isn't supposed to raise exceptions, so
+ // it is a bug if a subsequent FWAIT causes an exception.
+ lResult = (long)dblInt;
+
+ // round to the nearer integer, if at midpoint,
+ // towards the integer with the LSB zero
+
+ if (dblFrac > 0.5 || (dblFrac == 0.5 && (lResult & 1)))
+ lResult++;
+
+ else if (dblFrac < -0.5 || (dblFrac == -0.5 && (lResult & 1)))
+ lResult--;
+
+ return lResult;
+}
+
+#if VBA2
+STDAPI
+VarR4FromUI1(unsigned char bIn, float FAR* pfltOut)
+{
+ *pfltOut = (float)bIn;
+ return NOERROR;
+}
+#endif //VBA2
+
+STDAPI
+VarR4FromI2(short sIn, float FAR* pfltOut)
+{
+ *pfltOut = (float)sIn;
+ return NOERROR;
+}
+
+STDAPI
+VarR4FromBool(VARIANT_BOOL boolIn, float FAR* pfltOut)
+{
+ return VarR4FromI2(boolIn, pfltOut);
+}
+
+STDAPI
+VarR4FromI4(long lIn, float FAR* pfltOut)
+{
+ *pfltOut = (float)lIn;
+ return NOERROR;
+}
+
+STDAPI
+VarR4FromR8(double dblIn, float FAR* pfltOut)
+{
+ if(dblIn > -3.402823466e+38 && dblIn < 3.402823466e+38){
+ *pfltOut = (float)dblIn;
+ return NOERROR;
+ }
+ return RESULT(DISP_E_OVERFLOW);
+}
+
+STDAPI
+VarR4FromCy(CY cyIn, float FAR* pfltOut)
+{
+ return ErrR4FromCy(cyIn, pfltOut);
+}
+
+STDAPI
+VarR4FromDate(DATE dateIn, float FAR* pfltOut)
+{
+ return VarR4FromR8(dateIn, pfltOut);
+}
+
+STDAPI
+VarR4FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, float FAR* pfltOut)
+{
+ double dblVal;
+ HRESULT hresult;
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ if((hresult = VarR8FromStr(strIn, lcid, dwFlags, &dblVal)) == NOERROR)
+ hresult = VarR4FromR8(dblVal, pfltOut);
+ return hresult;
+}
+
+STDAPI
+VarR4FromDisp(IDispatch FAR* pdispIn, LCID lcid, float FAR* pfltOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ hresult = GetDispProperty(pdispIn, lcid, VT_R4, &varTmp);
+ if (hresult == NOERROR)
+ *pfltOut = V_R4(&varTmp);
+ return hresult;
+}
+
+
+#if VBA2
+STDAPI
+VarR8FromUI1(unsigned char bIn, double FAR* pdblOut)
+{
+ *pdblOut = (double)bIn;
+ return NOERROR;
+}
+
+#endif //VBA2
+
+STDAPI
+VarR8FromI2(short sIn, double FAR* pdblOut)
+{
+ *pdblOut = (double)sIn;
+ return NOERROR;
+}
+
+STDAPI
+VarR8FromBool(VARIANT_BOOL boolIn, double FAR* pdblOut)
+{
+ return VarR8FromI2(boolIn, pdblOut);
+}
+
+STDAPI
+VarR8FromI4(long lIn, double FAR* pdblOut)
+{
+ *pdblOut = (double)lIn;
+ return NOERROR;
+}
+
+STDAPI
+VarR8FromR4(
+ float fltIn,
+ double FAR* pdblOut)
+{
+ *pdblOut = (double)fltIn;
+ return NOERROR;
+}
+
+STDAPI
+VarR8FromCy(CY cyIn, double FAR* pdblOut)
+{
+ return ErrR8FromCy(cyIn, pdblOut);
+}
+
+STDAPI
+VarR8FromDate(DATE dateIn, double FAR* pdblOut)
+{
+ *pdblOut = dateIn;
+ return NOERROR;
+}
+
+STDAPI
+VarR8FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, double FAR* pdblOut)
+{
+ int count;
+ unsigned int cbLen;
+ double dblVal;
+ OLECHAR FAR* pchStart;
+ OLECHAR FAR* pchAfter;
+ OLECHAR FAR* pchTemp;
+ OLECHAR FAR* pchSave = NULL;
+ OLECHAR chSave;
+ OLECHAR chDecimal;
+ OLECHAR FAR* buf;
+ OLECHAR FAR* lpStr;
+ HRESULT hresult;
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ count = 0;
+
+ if (strIn == NULL)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ IfFailRet(MapHalfWidth(lcid, strIn, &lpStr));
+ pchStart = lpStr;
+ } else
+ pchStart = lpStr = strIn;
+#else
+ pchStart = lpStr = strIn;
+#endif
+
+ while (isspace(*pchStart))
+ pchStart++;
+
+ if (*pchStart == OASTR('\0')) {
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ goto LError0;
+ }
+
+ errno = EZERO;
+
+ IfFailRet(DispAlloc(BYTELEN(pchStart), (void FAR* FAR*)&buf));
+
+ if(*pchStart == OASTR('&')){
+
+ dblVal = (double)HexOctStrToLong(pchStart, &pchAfter);
+
+ }else{
+
+ // strip off all currency (thousand) separator
+ // before being process by strtod
+ IfFailGo(StripThousandSeparator(pchStart, buf, lcid, dwFlags), LError);
+
+ // unfortunetly, the C-runtime is not locale-aware, so we
+ // have to replace the locale decimal with a '.'.
+ // If the locale decimal is not a period and the string does
+ // contain a period '.', then replace the '.' in the buffer
+ // by the locale decimal so it does not get recognized by strtod.
+ // Save the original char and the location and restore after
+ // doing the conversion.
+
+ pchTemp = pchStart = buf;
+ chDecimal = DecimalFromLcid(lcid, dwFlags);
+ while(*pchTemp) {
+ if (*pchTemp == OASTR('.') && chDecimal != OASTR('.')) {
+ pchSave = pchTemp;
+ chSave = *pchTemp;
+ *pchTemp = chDecimal;
+ break;
+ } else if (*pchTemp == chDecimal) {
+ pchSave = pchTemp;
+ chSave = *pchTemp;
+ *pchTemp = OASTR('.');
+ break;
+ }
+ pchTemp++;
+ }
+
+ dblVal = disp_strtod(pchStart, &pchAfter);
+
+ // Restore the decimal point
+ if (pchSave)
+ *pchSave = chSave;
+
+ // ignore underflow error
+ if (errno == ERANGE && dblVal == 0.0)
+ errno = EZERO;
+ }
+
+ while(isspace(*pchAfter))
+ pchAfter++;
+
+ cbLen = STRLEN(pchStart);
+
+ if(pchAfter == (pchStart + cbLen) && errno == EZERO){
+ *pdblOut = dblVal;
+ hresult = NOERROR;
+ }
+ else
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+
+LError:
+ DispFree(buf);
+
+LError0:
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ DispFree(lpStr);
+ }
+#endif
+
+ return hresult;
+}
+
+STDAPI
+VarR8FromDisp(IDispatch FAR* pdispIn, LCID lcid, double FAR* pdblOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ hresult = GetDispProperty(pdispIn, lcid, VT_R8, &varTmp);
+ if (hresult == NOERROR)
+ *pdblOut = V_R8(&varTmp);
+ return hresult;
+}
+
+#if VBA2
+STDAPI
+VarDateFromUI1(unsigned char bIn, DATE FAR* pdateOut)
+{
+ return VarDateFromI2((short)(unsigned short)bIn, pdateOut);
+}
+#endif //VBA2
+
+STDAPI
+VarDateFromI2(short sIn, DATE FAR* pdateOut)
+{
+ HRESULT hresult;
+
+ hresult = IsValidDate((DATE) sIn);
+ if (hresult == NOERROR)
+ *pdateOut = (DATE) sIn;
+ return hresult;
+}
+
+STDAPI
+VarDateFromBool(VARIANT_BOOL boolIn, DATE FAR* pdateOut)
+{
+ return VarDateFromI2(boolIn, pdateOut);
+}
+
+STDAPI
+VarDateFromI4(long lIn, DATE FAR* pdateOut)
+{
+ HRESULT hresult;
+
+ hresult = IsValidDate((DATE) lIn);
+ if (hresult == NOERROR)
+ *pdateOut = (DATE) lIn;
+ return hresult;
+}
+
+STDAPI
+VarDateFromR4(
+ float fltIn,
+ DATE FAR* pdateOut)
+{
+
+ HRESULT hresult;
+
+ hresult = IsValidDate((DATE) fltIn);
+ if (hresult == NOERROR)
+ *pdateOut = (DATE) fltIn;
+ return hresult;
+}
+
+STDAPI
+VarDateFromR8(double dblIn, DATE FAR* pdateOut)
+{
+ HRESULT hresult;
+
+ hresult = IsValidDate((DATE) dblIn);
+ if (hresult == NOERROR)
+ *pdateOut = (DATE) dblIn;
+ return hresult;
+}
+
+STDAPI
+VarDateFromCy(CY cyIn, DATE FAR* pdateOut)
+{
+ double r8;
+ HRESULT hresult;
+
+ VarR8FromCy(cyIn, &r8);
+ hresult = IsValidDate((DATE) r8);
+ if (hresult == NOERROR)
+ *pdateOut = (DATE) r8;
+ return hresult;
+}
+
+INTERNAL_(HRESULT)
+IsValidDate(DATE date)
+{
+ UDS uds;
+ VARIANT var;
+
+ V_VT(&var) = VT_DATE;
+ V_DATE(&var) = date;
+ return ErrUnpackDate(&uds, &var);
+}
+
+STDAPI
+VarDateFromDisp(IDispatch FAR* pdispIn, LCID lcid, DATE FAR* pdateOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ hresult = GetDispProperty(pdispIn, lcid, VT_DATE, &varTmp);
+ if (hresult == NOERROR)
+ *pdateOut = V_DATE(&varTmp);
+ return hresult;
+}
+
+#if VBA2
+STDAPI
+VarCyFromUI1(unsigned char bIn, CY FAR* pcyOut)
+{
+ return ErrCyFromI2((short)(unsigned short)bIn, pcyOut);
+}
+#endif //VBA2
+
+STDAPI
+VarCyFromI2(short sIn, CY FAR* pcyOut)
+{
+ return ErrCyFromI2(sIn, pcyOut);
+}
+
+STDAPI
+VarCyFromI4(long lIn, CY FAR* pcyOut)
+{
+ return ErrCyFromI4(lIn, pcyOut);
+}
+
+STDAPI
+VarCyFromR4(
+ float fltIn,
+ CY FAR* pcyOut)
+{
+ return ErrCyFromR4(&fltIn, pcyOut);
+}
+
+STDAPI
+VarCyFromR8(double dlbIn, CY FAR* pcyOut)
+{
+ return ErrCyFromR8(&dlbIn, pcyOut);
+}
+
+STDAPI
+VarCyFromDate(DATE dateIn, CY FAR* pcyOut)
+{
+ return VarCyFromR8(dateIn, pcyOut);
+}
+
+STDAPI
+VarCyFromBool(VARIANT_BOOL boolIn, CY FAR* pcyOut)
+{
+ return VarCyFromI2(boolIn, pcyOut);
+}
+
+
+STDAPI
+VarCyFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, CY FAR* pcyOut)
+{
+ CY cyTemp;
+ BSTR bstr;
+ long lTemp;
+ HRESULT hresult;
+ unsigned int cbLen;
+ OLECHAR FAR* pch;
+ OLECHAR FAR* pchAfter;
+ OLECHAR rgchCySym[10];
+ int fNegative;
+ OLECHAR FAR *buf;
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+
+#ifdef FE_DBCS
+ if(IsDBCS(lcid)) {
+ IfFailRet(MapHalfWidth(lcid, strIn, &buf));
+ } else {
+ IfFailRet(DispAlloc(BYTELEN(strIn), (void FAR* FAR*)&buf));
+ STRCPY(buf, strIn);
+ }
+#else
+ IfFailRet(DispAlloc(BYTELEN(strIn), (void FAR* FAR*)&buf));
+ STRCPY(buf, strIn);
+#endif
+
+ IfFailGo(StripThousandSeparator(buf, buf, lcid, dwFlags), LError0);
+
+ IfFailGo(ErrSysAllocString(buf, &bstr), LError0);
+
+ pch = (OLECHAR FAR*)bstr;
+
+ // first, determine if this is a negative number (of all formats)
+ // and if so, strip negative indicator ('-', or '()')
+
+ if(!FixNegativeCyStr(pch, DecimalFromLcid(lcid, dwFlags), &fNegative)){
+ hresult = RESULT(DISP_E_TYPEMISMATCH); // bad format.
+ goto LRet;
+ }
+
+ // read past leading spaces
+
+ while(*pch == OASTR(' '))
+ pch++;
+
+ // remove currency symbol
+
+ pchAfter = pch + STRLEN(pch) - 1;
+
+ while (*pchAfter == OASTR(' '))
+ pchAfter--;
+
+ if(GetLocaleInfo(lcid, LOCALE_SCURRENCY | dwFlags, rgchCySym, SIZEOFCH(rgchCySym)) <= 0){
+ rgchCySym[0] = OASTR('$');
+ rgchCySym[1] = OASTR('\0');
+ }
+
+ // convert both the initial string and the currency to lower case
+ // so that the comparison for currency is not case sensitive.
+ // do a locale-aware case mapping in place.
+
+ { int len = STRLEN(pch);
+ LCMapString(lcid, LCMAP_LOWERCASE, pch, len, pch, len);
+ }
+
+ { int len = STRLEN(rgchCySym);
+ LCMapString(lcid, LCMAP_LOWERCASE, rgchCySym, len, rgchCySym, len);
+ }
+
+ if(fStripCurrency(&pch, &pchAfter, rgchCySym)) {
+ *(pchAfter + 1) = OASTR('\0'); // terminate new string.
+ }
+
+ // read past any remaining spaces
+ while(*pch == OASTR(' '))
+ pch++;
+
+#if 0
+ STRCPY(bstr, pch);
+ pch = bstr;
+#endif
+
+ // test for hex or octal constant
+
+ if(*pch == OASTR('&')) {
+ hresult = VarI4FromStr(pch, lcid, dwFlags, &lTemp);
+ if (hresult == NOERROR)
+ hresult = VarCyFromI4(lTemp, pcyOut);
+ goto LRet;
+ }
+
+ // convert string to currency value
+
+ errno = EZERO;
+
+ hresult = StrToCy(pch, &pchAfter, FALSE, &cyTemp, lcid, dwFlags);
+ if(hresult != NOERROR)
+ goto LRet;
+
+ if(errno == ERANGE){
+ hresult = RESULT(DISP_E_OVERFLOW);
+ goto LRet;
+ }
+
+ // skip over any trailing spaces and test for end of BSTR
+
+ while (*pchAfter++ == OASTR(' '));
+
+ cbLen = STRLEN(pch);
+ if (pchAfter != (OLECHAR FAR*)pch + cbLen + 1){
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ goto LRet;
+ }
+
+ // assign value and return
+
+ pcyOut->Hi = cyTemp.Hi;
+ pcyOut->Lo = cyTemp.Lo;
+
+ if(fNegative)
+ NegCyNoOflo(pcyOut);
+
+ hresult = NOERROR;
+
+LRet:;
+ DispFree(buf);
+ SysFreeString(bstr);
+ return hresult;
+
+LError0:;
+ DispFree(buf);
+ return hresult;
+
+}
+
+STDAPI
+VarCyFromDisp(IDispatch FAR* pdispIn, LCID lcid, CY FAR* pcyOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ hresult = GetDispProperty(pdispIn, lcid, VT_CY, &varTmp);
+ if (hresult == NOERROR)
+ *pcyOut = V_CY(&varTmp);
+ return hresult;
+}
+
+OLECHAR
+CurrencyFromLcid(LCID lcid, unsigned long dwFlags)
+{
+ OLECHAR szBuff[2];
+
+ if (GetLocaleInfo(lcid,
+ LOCALE_SCURRENCY | dwFlags,
+ szBuff,
+ SIZEOFCH(szBuff)) <= 0)
+ return OASTR('$');
+ else
+ return szBuff[0];
+}
+
+OLECHAR
+DecimalFromLcid(LCID lcid, unsigned long dwFlags)
+{
+ OLECHAR szBuff[2];
+
+ if (GetLocaleInfo(lcid, LOCALE_SDECIMAL | dwFlags, szBuff, SIZEOFCH(szBuff)) <= 0)
+ return OASTR('.');
+ else
+ return szBuff[0];
+}
+
+#ifdef FE_DBCS
+EXTERN_C
+INTERNAL_(HRESULT)
+MapHalfWidth(LCID lcid, OLECHAR FAR* strIn, OLECHAR FAR* FAR* ppv)
+{
+ size_t cb;
+
+ *ppv = NULL;
+ cb = BYTELEN(strIn);
+
+ IfFailRet(DispAlloc(cb, (void FAR* FAR*) ppv));
+
+ // Map any full-pitch chars to half-pitch
+ if (LCMapString(lcid, LCMAP_HALFWIDTH,
+ strIn, -1,
+ *ppv, cb) == 0) {
+ DispFree(*ppv);
+ return RESULT(DISP_E_TYPEMISMATCH);
+ }
+ return NOERROR;
+}
+#endif
+
+
+
+OLECHAR
+ThousandFromLcid(LCID lcid, unsigned long dwFlags)
+{
+ OLECHAR szBuff[2];
+
+ if (GetLocaleInfo(lcid, LOCALE_STHOUSAND | dwFlags,
+ szBuff, SIZEOFCH(szBuff)) <= 0)
+ return OASTR(',');
+ else
+ return szBuff[0];
+}
+
+
+
+INTERNAL_(HRESULT)
+StripThousandSeparator(OLECHAR FAR* strIn, OLECHAR FAR* strOut, LCID lcid, long dwFlags)
+{
+ int loc;
+ OLECHAR chThousand;
+ int fNBSpace = 0;
+
+// UNDONE: On the MAC, the following 2 locales have a different
+// non-breaking space code:
+// Arabic 0x81
+// Thai 0xA0
+
+#if OE_MAC
+ static unsigned char chNBSpace = (unsigned char) 0xCA;
+#else /* !OE_MAC */
+ static unsigned char chNBSpace = (unsigned char) 0xA0;
+#endif /* OE_MAC */
+
+ loc = 0;
+ chThousand = ThousandFromLcid(lcid, dwFlags);
+ if (chThousand == OASTR(' ') || chThousand == chNBSpace)
+ fNBSpace = 1;
+
+ // strip off all currency (thousand) separator
+ while (*strIn) {
+ if (fNBSpace && *strIn != chThousand && *strIn != chNBSpace)
+ strOut[loc++] = *strIn;
+ else if (*strIn != chThousand)
+ strOut[loc++] = *strIn;
+ strIn++;
+ }
+ strOut[loc] = NULL;
+
+ if (strOut[0] == 0)
+ // error: string only contained thousands sep.
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ return NOERROR;
+}
+
+
+// Mpw errors (!) on inline routines containing 'vector' temps
+#ifndef HC_MPW
+inline
+#endif
+int
+LeadingZeroForDecimalFromLcid(LCID lcid, unsigned long dwFlags)
+{
+ char szBuff[2];
+
+ GetLocaleInfoA(lcid, LOCALE_ILZERO | dwFlags, szBuff, SIZEOFCH(szBuff));
+ return (szBuff[0] == OASTR('0')) ? 0 : 1;
+}
+
+
+/***
+* FMakePosCy - make a positive currency value and return sign
+* Purpose:
+* Return the positive value of the input currency value and a
+* flag with the sign of the original value.
+*
+* Entry:
+* pcyValue - pointer to currency input value
+*
+* Exit:
+* pcyValue - pointer to positive currency value
+* returns: FALSE if positive, TRUE if negative
+*
+* Exceptions:
+*
+* Note:
+* A maximum negative value input is returned unchanged, but
+* treated as an unsigned value by the calling routines.
+*
+***********************************************************************/
+
+PRIVATE_(int)
+FMakePosCy(CY FAR* pcy)
+{
+ int fNegative;
+
+ fNegative = FALSE;
+ if(pcy->Hi < 0){
+ pcy->Hi = ~pcy->Hi;
+ if((pcy->Lo = (unsigned long)(-(long)pcy->Lo)) == 0)
+ pcy->Hi++;
+ fNegative = TRUE;
+ }
+ return fNegative;
+}
+
+/***
+* UnpackCy - separate currency value into four two-byte integers
+* Purpose:
+* Unpack the currency value input into the lower half of the
+* specified pointer to an array of unsigned longs. The array
+* goes from least- to most-significant values.
+*
+* Entry:
+* pcy - pointer to currency input value
+*
+* Exit:
+* plValues - pointer to start of unsigned long array
+*
+* Exceptions:
+*
+***********************************************************************/
+
+PRIVATE_(void)
+UnpackCy(CY FAR* pcy, unsigned long FAR* plValues)
+{
+ *plValues++ = pcy->Lo & 0xffff;
+ *plValues++ = pcy->Lo >> 16;
+ *plValues++ = (unsigned long)pcy->Hi & 0xffff;
+ *plValues = (unsigned long)pcy->Hi >> 16;
+}
+
+// pcyInput = -pcyInput
+//
+PRIVATE_(void)
+NegCyNoOflo(CY FAR* pcyInput)
+{
+ CY cyResult;
+
+ cyResult.Hi = ~pcyInput->Hi;
+ cyResult.Lo = (unsigned long)(-(long)pcyInput->Lo);
+
+ if (cyResult.Lo == 0)
+ cyResult.Hi++;
+
+ *pcyInput = cyResult;
+}
+
+// pcyInput1 += pcyInput2
+//
+PRIVATE_(void)
+AddCyNoOflo(CY FAR* pcyInput1, CY FAR* pcyInput2)
+{
+ CY cySum;
+
+ // add high and low parts separately
+
+ cySum.Hi = pcyInput1->Hi + pcyInput2->Hi;
+ cySum.Lo = pcyInput1->Lo + pcyInput2->Lo;
+
+ // test for carry out of the low part and propagate to
+ // the high part
+
+ if(cySum.Lo < pcyInput2->Lo)
+ cySum.Hi++;
+
+ pcyInput1->Lo = cySum.Lo;
+ pcyInput1->Hi = cySum.Hi;
+}
+
+#if VBA2
+STDAPI
+VarBstrFromUI1(unsigned char bVal, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut)
+{
+ return VarBstrFromI2((short)(unsigned short)bVal, lcid, dwFlags, pbstrOut);
+}
+#endif //VBA2
+
+STDAPI
+VarBstrFromI2(short iVal, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut)
+{
+ OLECHAR buffer[40];
+ OLECHAR FAR* pchBuffer;
+
+ // integers have no decimals, and thus they are locale-unaware.
+ // lcid remains unused
+
+ UNUSED(lcid);
+ UNUSED(dwFlags);
+
+ pchBuffer = buffer;
+
+ disp_itoa((int)iVal, pchBuffer, 10);
+
+ return ErrSysAllocString(buffer, pbstrOut);
+}
+
+STDAPI
+VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut)
+{
+ OLECHAR buffer[40];
+
+ UNUSED(lcid);
+ UNUSED(dwFlags);
+
+ STRCPY(buffer, boolIn ? OASTR("True") : OASTR("False"));
+ return ErrSysAllocString(buffer, pbstrOut);
+}
+
+STDAPI
+VarBstrFromI4(long lIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut)
+{
+ OLECHAR buffer[40];
+ OLECHAR FAR* pchBuffer = buffer;
+
+ UNUSED(lcid);
+ UNUSED(dwFlags);
+
+ // longs have no decimals, and thus they are locale-unaware.
+ // lcid remains unused
+
+ disp_ltoa(lIn, pchBuffer, 10);
+
+ return ErrSysAllocString(buffer, pbstrOut);
+}
+
+
+// if on Win32, or real Win16 (not WOW), include this code
+#if (OE_WIN16 && !defined(WOW)) || _X86_
+
+HRESULT BstrFromFloat(double dblIn, LCID lcid, DWORD dwFlags,
+ BSTR FAR* pbstrOut, int cDigits)
+{
+ OLECHAR buffer[40];
+ DIGARY digits;
+ int i;
+ int power;
+ int iCur;
+ BOOL fZero;
+ OLECHAR *pstr;
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ if ( ((DBLSTRUCT *)&dblIn)->exp == 0x7FF ) // Is exponent max value?
+ {
+ // Have infinity or NAN
+ //
+ buffer[1] = '1';
+ buffer[2] = DecimalFromLcid(lcid, dwFlags);
+ buffer[3] = '#';
+ iCur = 4;
+
+ if ( ((DBLSTRUCT *)&dblIn)->mantLo == 0 && ((DBLSTRUCT *)&dblIn)->mantHi == 0 )
+ {
+ if ( ((DBLSTRUCT *)&dblIn)->mantMSB == 0 ) // Infinity?
+ {
+ pstr = pstrInf;
+ goto CopyName;
+ }
+ else if ( ((DBLSTRUCT *)&dblIn)->sign == 1 ) // Indefinite?
+ {
+ pstr = pstrInd;
+ goto CopyName;
+ }
+ }
+ // Have a NAN.
+ //
+ buffer[4] = ((DBLSTRUCT *)&dblIn)->mantMSB ? 'Q' : 'S';
+ iCur = 5;
+ pstr = pstrNan;
+
+CopyName:
+ buffer[iCur++] = *pstr++;
+ buffer[iCur++] = *pstr++;
+ buffer[iCur] = *pstr;
+ }
+ else
+ {
+ if (dblIn == 0.0)
+ return ErrSysAllocStringLen(OASTR("0"), 1, pbstrOut);
+
+#if OE_WIN16
+ ASSERT(g_fbstpImplemented);
+#endif //OE_WIN16
+ power = ConvFloatToAscii(dblIn, (DIGARY NEAR *)&digits) + 17;
+
+ iCur = 1; // leave room for sign
+
+ // Check for leading zero. Never more than one.
+ //
+ if (digits[8].hi == 0)
+ {
+ power--;
+ iCur--; // leading zero will be overwritten by sign
+ ASSERT(digits[8].lo != 0)
+ }
+
+ for (i = 8; i >= 0; i--)
+ {
+ // Extract each pair of digits.
+ //
+ buffer[iCur++] = '0' + digits[i].hi;
+ buffer[iCur++] = '0' + digits[i].lo;
+
+ } //for
+
+ // Round to the number of digits requested and strip trailing zeros.
+ //
+ iCur = cDigits + 1;
+
+ if ( buffer[iCur--] >= '5' ) // need to round up?
+ {
+ while (buffer[iCur] == '9')
+ iCur--; // it's now a trailing zero, just strip it off
+ buffer[iCur]++;
+ if (iCur == 0) // we had all 9's
+ {
+ buffer[1] = '1';
+ iCur = 1;
+ power++;
+ }
+ }
+ else
+ {
+ while (buffer[iCur] == '0')
+ iCur--; // strip off trailing zeros
+ }
+
+ // Now we know where we stand:
+ // power = power of 10 of leading digit (power to use if E notation).
+ // iCur = index of last digit = no. of digits
+ //
+ // Check for scientific notation.
+ //
+ if (power >= cDigits || iCur - power > cDigits + 1)
+ {
+ // Format scientific notation
+ //
+ if (iCur > 1) // Need to make room for decimal point
+ {
+ for (i = iCur; i >= 2; i--)
+ buffer[i+1] = buffer[i];
+ buffer[2] = DecimalFromLcid(lcid, dwFlags);
+ iCur++; // include decimal in count
+ }
+
+ buffer[++iCur] = 'E';
+ if (power < 0)
+ {
+ buffer[++iCur] = '-';
+ power = -power;
+ }
+ else
+ buffer[++iCur] = '+';
+
+ if (power >= 100)
+ {
+ buffer[++iCur] = power / 100 + '0';
+ power = power % 100;
+ }
+
+ buffer[++iCur] = power / 10 + '0';
+ buffer[++iCur] = power % 10 + '0';
+ }
+ else
+ {
+ // Fixed-point notation
+ //
+ while (iCur <= power) // Need trailing zeros
+ buffer[++iCur] = '0';
+
+ if (iCur > power + 1) // Need decimal point
+ {
+ if (power <= -1)
+ {
+ // Make room for leading zero, decimal point, and zeros following it
+ //
+ if ( fZero = LeadingZeroForDecimalFromLcid(lcid, dwFlags) )
+ power--;
+
+ for (i = iCur; i >= 1; i--)
+ buffer[i-power] = buffer[i];
+
+ iCur -= power;
+ i = 1;
+ if (fZero)
+ {
+ buffer[1] = '0';
+ i = 2;
+ }
+ buffer[i++] = DecimalFromLcid(lcid, dwFlags);
+ for ( ; i < 1-power; i++)
+ buffer[i] = '0';
+ }
+ else
+ {
+ for (i = iCur; i > power+1; i--)
+ buffer[i+1] = buffer[i];
+ buffer[power+2] = DecimalFromLcid(lcid, dwFlags);
+ iCur++; // include decimal in count
+ }
+ }
+ }
+ } // else exponent == max value
+
+ // Check sign
+ //
+ buffer[0] = '-'; // just in case
+ i = 1; // return index if positive
+ if ( ((DBLSTRUCT *)&dblIn)->sign == 1 ) // negative?
+ {
+ iCur++; // one more char
+ i = 0; // include '-' sign
+ }
+
+ return ErrSysAllocStringLen( &buffer[i], iCur, pbstrOut );
+
+}
+#endif // OE_WIN16 || _X86_
+
+
+STDAPI
+VarBstrFromR4(
+ float fltIn,
+ LCID lcid,
+ unsigned long dwFlags,
+ BSTR FAR* pbstrOut)
+{
+#if _X86_
+
+ return BstrFromFloat((double)fltIn, lcid, dwFlags, pbstrOut, 7);
+
+#else
+#if OE_WIN16 && !defined(WOW)
+ if (g_fbstpImplemented)
+ return BstrFromFloat((double)fltIn, lcid, dwFlags, pbstrOut, 7);
+#endif //OE_WIN16
+
+ OLECHAR buffer[40];
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ disp_gcvt((double)fltIn, 7, buffer, 40);
+
+ // process the string to the BASIC format
+ EditStrFromReal(buffer, 7, lcid, dwFlags);
+
+ return ErrSysAllocString(buffer, pbstrOut);
+
+#endif
+}
+
+STDAPI
+VarBstrFromR8(double dblIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut)
+{
+#if _X86_
+
+ return BstrFromFloat(dblIn, lcid, dwFlags, pbstrOut, 15);
+
+#else
+#if OE_WIN16 && !defined(WOW)
+ if (g_fbstpImplemented)
+ return BstrFromFloat(dblIn, lcid, dwFlags, pbstrOut, 15);
+#endif //OE_WIN16
+
+ OLECHAR buffer[40];
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ disp_gcvt(dblIn, 15, buffer, 40);
+
+ // process the string to the BASIC format
+ EditStrFromReal(buffer, 15, lcid, dwFlags);
+
+ return ErrSysAllocString(buffer, pbstrOut);
+
+#endif
+}
+
+
+STDAPI
+VarBstrFromCy(CY cyIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut)
+{
+ OLECHAR buffer[40];
+
+#if _X86_ || (OE_WIN16 && !defined(WOW))
+
+#if OE_WIN16
+ if (g_fbstpImplemented) {
+#endif //OE_WIN16
+
+ OLECHAR hi,lo;
+ int i;
+ int iCur;
+ DIGARY digits;
+
+ if ((cyIn.Hi | cyIn.Lo) == 0)
+ return ErrSysAllocStringLen(OASTR("0"), 1, pbstrOut);
+
+ // Execute the x87 FBSTP instruction. This assembly-language
+ // routine actually extends the instruction to handle a 19th
+ // digit.
+ //
+ DoFbstp( (CY NEAR *)&cyIn, (DIGARY NEAR *)&digits );
+
+ iCur = 1;
+ lo = digits[9].lo;
+ if (lo != 0)
+ {
+ buffer[1] = '0' + lo;
+ iCur = 2;
+ }
+
+ for (i = 8; i >= 2; i--)
+ {
+ // Extract each pair of digits. Strip off leading zeros.
+ //
+ hi = digits[i].hi;
+ lo = digits[i].lo;
+
+ if (iCur == 1) // still scanning leading zeros?
+ if (hi == 0)
+ {
+ if (lo != 0)
+ goto LoDigit;
+ continue;
+ }
+ buffer[iCur++] = '0' + hi;
+LoDigit:
+ buffer[iCur++] = '0' + lo;
+
+ } //for
+
+ // Last 4 digits remain.
+ //
+ if ( *((WORD *)digits) != 0 ) // Low 4 digits non-zero?
+ {
+ // See if we need leading zero before decimal point
+ //
+ if (iCur == 1 && LeadingZeroForDecimalFromLcid(lcid, dwFlags) )
+ {
+ buffer[1] = '0';
+ iCur = 2;
+ }
+
+ buffer[iCur++] = DecimalFromLcid(lcid, dwFlags);
+ buffer[iCur++] = '0' + digits[1].hi;
+
+ if ( (*(WORD *)digits & 0xFFF) != 0 ) // Low 3 digits non-zero?
+ {
+ buffer[iCur++] = '0' + digits[1].lo;
+
+ if ( *(BYTE *)digits != 0 ) // Low 2 digits non-zero?
+ {
+ buffer[iCur++] = '0' + digits[0].hi;
+
+ if ( digits[0].lo != 0 ) // Low digit non-zero?
+ buffer[iCur++] = '0' + digits[0].lo;
+ }
+ }
+ }
+
+ // Check sign
+ //
+ buffer[0] = '-'; // just in case
+ i = 1; // return index if positive
+ if (digits[9].hi & 8) // negative?
+ {
+ iCur++; // one more char
+ i = 0; // include '-' sign
+ }
+
+ return ErrSysAllocStringLen( &buffer[i], iCur-1, pbstrOut );
+
+#if OE_WIN16
+ } // if g_fbstpImplemented
+#endif //OE_WIN16
+
+
+#endif // _X86_ || (OE_WIN16 && !defined(WOW))
+
+
+#if !_X86_
+
+ OLECHAR * pchBuffer = buffer;
+
+#define CYSTRMAX 32
+
+ int index;
+ int grpValue;
+ int indResult;
+ int fNegative;
+ int fNzQuotient;
+ OLECHAR chResult[CYSTRMAX];
+ unsigned long input[4];
+
+ ASSERT(dwFlags == 0 || dwFlags == LOCALE_NOUSEROVERRIDE);
+
+ // if value is negative, set flag and negate
+ // (max. negative value 0x80...0 works since it inverts to itself)
+
+ fNegative = FMakePosCy(&cyIn);
+
+ // split number into four short values
+
+ UnpackCy(&cyIn, input);
+
+ // string will be built from right to left
+ // index to the end of the string (null-to-be)
+
+ indResult = CYSTRMAX - 1;
+
+ // outer loop to divide input array by 10000 repeatedly
+
+ do {
+ // flag is set if any quotient is nonzero to stop dividing
+
+ fNzQuotient = FALSE;
+
+ // divide the value in input by 10000, with the remainder
+ // in grpValue
+
+ for (index = 3; index > 0; index--) {
+
+ input[index - 1] |= (input[index] % 10000) << 16;
+ if ((input[index] /= 10000) != 0)
+ fNzQuotient = TRUE;
+ }
+
+ grpValue = (int)(input[index] % 10000);
+ if ((input[0] /= 10000) != 0)
+ fNzQuotient = TRUE;
+
+ // inner loop divides grpValue by 10 repeatedly to get digits
+
+ for (index = 0; index < 4; index++) {
+ chResult[--indResult] = (OLECHAR)(grpValue % 10 + OASTR('0'));
+ grpValue /= 10;
+ }
+
+ // for first grouping, put in decimal point
+
+ if (indResult == CYSTRMAX - 5)
+ chResult[--indResult] = DecimalFromLcid(lcid, dwFlags);
+
+ }while (fNzQuotient);
+
+ // trim any leading zeroes from the string
+
+ while (chResult[indResult] == OASTR('0'))
+ indResult++;
+
+ // remove a leading zero to a decimal point depending on Locale setting
+
+ if (LeadingZeroForDecimalFromLcid(lcid, dwFlags) &&
+ chResult[indResult] == DecimalFromLcid(lcid, dwFlags))
+ chResult[--indResult] = OASTR('0');
+
+ // trim any trailing zeroes from the string
+
+ index = CYSTRMAX - 2;
+ while (chResult[index] == OASTR('0'))
+ index--;
+
+ // process trailing decimal point
+
+ if (chResult[index] == DecimalFromLcid(lcid, dwFlags)) {
+
+ // if just decimal point, put in a zero before it depending on locale
+
+ if (index == indResult)
+ chResult[--indResult] = OASTR('0');
+
+ // move before the decimal point
+
+ index--;
+ }
+
+ // fix the end of the string
+
+ chResult[++index] = OASTR('\0');
+
+ // if negative, put sign in buffer
+ if(fNegative)
+ *pchBuffer++ = OASTR('-');
+
+ STRCPY(pchBuffer, &chResult[indResult]);
+
+ return ErrSysAllocString(buffer, pbstrOut);
+
+#endif // !_X86_
+}
+
+
+STDAPI
+VarBstrFromDisp(IDispatch FAR* pdispIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut)
+{
+ VARIANT varTmp;
+ HRESULT hresult;
+
+ UNUSED(dwFlags);
+ hresult = GetDispProperty(pdispIn, lcid, VT_BSTR, &varTmp);
+ if (hresult == NOERROR)
+ *pbstrOut = V_BSTR(&varTmp);
+ return hresult;
+}
+
+// Return TRUE if this is a legal Cy number. Return FALSE otherwise.
+// On exit, fNegative will be TRUE if this is a negative number
+//
+PRIVATE_(int)
+FixNegativeCyStr(OLECHAR FAR* pInput, OLECHAR cDecimal, int FAR* fReturnNegative)
+{
+ int fSignFound = FALSE;
+ int fOpenParenFound = FALSE;
+ int fNegative = FALSE;
+ int fNumberFound = FALSE;
+
+ *fReturnNegative = FALSE;
+
+ while (*pInput) {
+ switch(*pInput) {
+ case OASTR('+'):
+ case OASTR('-'):
+ if (fSignFound || fOpenParenFound)
+ return FALSE;
+ fNegative = (*pInput == OASTR('-'));
+ *pInput++ = OASTR(' ');
+ fSignFound = TRUE;
+ break;
+
+ case OASTR('('):
+ if (fSignFound || fNumberFound)
+ return FALSE;
+ *pInput++ = OASTR(' ');
+ fOpenParenFound = TRUE;
+ break;
+
+ case OASTR(')'):
+ if (!fOpenParenFound || fSignFound || !fNumberFound)
+ return FALSE;
+ *pInput++ = OASTR(' ');
+ fSignFound = TRUE;
+ fNegative = TRUE;
+ break;
+
+ default:
+ // start of a possible number; zip through it.
+ if((*pInput >= OASTR('0') && *pInput <= OASTR('9'))
+ || *pInput == OASTR('&')
+ || *pInput == cDecimal)
+ {
+ fNumberFound = TRUE;
+ while((*pInput != OASTR(' '))
+ && (*pInput != OASTR('\0'))
+ && (*pInput != OASTR('+'))
+ && (*pInput != OASTR('-'))
+ && (*pInput != OASTR(')')))
+ {
+ pInput++;
+ }
+ }else{
+ pInput++;
+ }
+
+ break;
+ }
+ }
+
+ if (fOpenParenFound && !fNegative)
+ return FALSE; // not balanced.
+
+ if (fNegative)
+ *fReturnNegative = TRUE;
+
+ return TRUE;
+}
+
+// FParseBegin - check if next token matches given string.
+// If it matches sz, point after it and any spaces and
+// return true. If not, stay put and return FALSE.
+//
+PRIVATE_(int)
+fParseBegin (OLECHAR FAR* FAR* ppch, OLECHAR FAR* sz, OLECHAR FAR* lpchLast)
+{
+ OLECHAR FAR* lpch;
+
+ lpch = *ppch;
+
+ for (; *sz != 0; lpch++, sz++)
+ if (lpch > lpchLast || *lpch != *sz)
+ return FALSE;
+
+ while (lpch <= lpchLast && *lpch == OASTR(' '))
+ lpch++;
+
+ *ppch = lpch;
+ return TRUE;
+}
+
+// FParseEnd - check if last token matches given string.
+// If it matches sz, strip it and trailing blanks and
+// return true. If not, stay put and return FALSE.
+
+PRIVATE_(int)
+fParseEnd (OLECHAR FAR* FAR* ppchLast, OLECHAR FAR* sz, OLECHAR FAR* lpchFirst)
+{
+ OLECHAR FAR* lpch;
+ int cch = STRLEN(sz);
+
+ if (cch > *ppchLast - lpchFirst + 1)
+ return FALSE;
+
+ lpch = *ppchLast - cch + 1;
+
+ for (; *sz != 0; lpch++, sz++)
+ if (*lpch != *sz)
+ return FALSE;
+
+ for (lpch = *ppchLast - cch;
+ lpch >= lpchFirst && *lpch == OASTR(' ');
+ lpch--)
+ {}
+
+ *ppchLast = lpch;
+ return TRUE;
+}
+
+// fStripCurrency -
+// strip currency from beginning or end of string;
+// return true iff currency found.
+//
+PRIVATE_(int)
+fStripCurrency(OLECHAR FAR* FAR* ppch, OLECHAR FAR* FAR* ppchLast, OLECHAR FAR* cySymbol)
+{
+ return(fParseBegin(ppch, cySymbol, *ppchLast)
+ || fParseEnd(ppchLast, cySymbol, *ppch));
+}
+
+PRIVATE_(HRESULT)
+StrToCy(
+ OLECHAR FAR* pchIn,
+ OLECHAR FAR* FAR* ppchAfter,
+ int fRoundAllowed,
+ CY FAR* pcyOut,
+ LCID lcid,
+ unsigned long dwFlags)
+{
+ HRESULT err;
+
+ OLECHAR ch;
+ OLECHAR chSign;
+ OLECHAR chNumber[10];
+ OLECHAR chAfterFifth;
+
+ OLECHAR FAR* pchInt;
+ OLECHAR FAR* pchFrac;
+
+ CY cyOut;
+ CY cyUpper;
+ CY cyLower;
+ CY cyMiddle;
+
+ int cntInt = 0;
+ int cntFrac = 0;
+ int cmpIntMax;
+ int fRounding = FALSE;
+
+ unsigned long upperVal = 0L;
+ unsigned long middleVal = 0L;
+ unsigned long lowerVal = 0L;
+
+ chSign = OASTR('+');
+ chAfterFifth = OASTR('0');
+ fRounding = FALSE;
+
+ if(ppchAfter)
+ *ppchAfter = pchIn;
+
+ cyOut.Lo = 0L;
+ cyOut.Hi = 0L;
+
+ cyUpper.Lo = 0L;
+ cyUpper.Hi = 0L;
+
+ cyMiddle.Lo = 0L;
+ cyMiddle.Hi = 0L;
+
+ cyLower.Lo = 0L;
+ cyLower.Hi = 0L;
+
+ ch = *pchIn++;
+
+ // process any sign
+
+ if(ch == OASTR('+') || ch == OASTR('-')){
+ chSign = ch;
+ ch = *pchIn++;
+ }
+
+ // skip over any leading zeroes
+
+ while (ch == OASTR('0'))
+ ch = *pchIn++;
+
+ // scan to determine count of integer digits and
+ // point to just past the terminating byte
+
+ while (ch >= OASTR('0') && ch <= OASTR('9')) {
+ cntInt++;
+ ch = *pchIn++;
+ }
+
+ pchInt = pchIn;
+
+ // if too many integer digits, or integer value
+ // too large, return overflow
+
+ cmpIntMax = ( (cntInt == 15) ? STRNCMP(pchInt - 16,
+ OASTR("922337203685477"), 15) :
+ -1);
+ if(cntInt > 15 ||
+ (cntInt == 15 &&
+ (cmpIntMax > 0)))
+ {
+ errno = ERANGE;
+ *pcyOut = cyOut;
+ return RESULT(DISP_E_OVERFLOW);
+ }
+
+ // if terminator was decimal separator, scan for number
+ // of decimal digits (up to 4) and point to terminating byte
+
+ if(ch == DecimalFromLcid(lcid, dwFlags)){
+
+ ch = *pchIn++;
+
+ while (ch >= OASTR('0') && ch <= OASTR('9') && cntFrac < 4) {
+ cntFrac++;
+ ch = *pchIn++;
+ }
+
+ pchFrac = pchIn;
+
+ // determine if extra digits at end of fraction for rounding
+
+ if (ch >= OASTR('0') && ch <= OASTR('9')) {
+
+ // if no rounding, then give type-mismatch error by
+ // returning with ppchAfter pointing to string start
+
+ if (!fRoundAllowed) {
+ *pcyOut = cyOut;
+ return RESULT(NOERROR);
+ }
+
+ // note the largest value after the fifth decimal digit
+
+ ch = *pchIn++;
+
+ while (ch >= OASTR('0') && ch <= OASTR('9')) {
+ if (ch > chAfterFifth)
+ ch = chAfterFifth;
+ ch = *pchIn++;
+ }
+
+ // Rounding occurs if:
+ // - the fifth decimal digit is greater than 5, or
+ // - the fifth decimal digit is equal to 5, and
+ // a nonzero decimal digit follows, or
+ // the fourth decimal digit is odd
+ //
+ fRounding = *(pchFrac - 1) > OASTR('5')
+ || (*(pchFrac - 1) == OASTR('5')
+ && (chAfterFifth > OASTR('0')
+ || (*(pchFrac - 2) & 1)));
+ }
+ }
+
+ // if maximum integer value, test fraction for overflow
+
+ if (cmpIntMax == 0) {
+
+ // set maximum fraction for positive value
+
+ STRCPY(chNumber, OASTR("5807"));
+
+ // if negative, increase value by one
+
+ chNumber[3] += (chSign == OASTR('-'));
+
+ // if rounding is set, decrease value by one
+
+ chNumber[3] -= fRounding;
+
+ // compare fraction digits with adjusted maximum
+ // fraction - overflow if greater
+
+ if (STRNCMP(pchFrac - cntFrac - 1, chNumber, cntFrac) > 0){
+
+ errno = ERANGE;
+
+ *pcyOut = cyOut;
+
+ return RESULT(DISP_E_OVERFLOW);
+ }
+ }
+
+ // if start of exponent is next, return type-mismatch
+
+ ch = (OLECHAR) TOLOWER(ch);
+
+ if (ch == OASTR('d') || ch == OASTR('e')) {
+ *pcyOut = cyOut;
+ return NOERROR;
+ }
+
+ // point to terminating byte
+
+ if(ppchAfter)
+ *ppchAfter = pchIn - 1;
+
+ //-------------------------------------------------------------
+ //
+ // scan is finished - compose upperVal, middleVal, lowerVal
+ //
+ //-------------------------------------------------------------
+
+ // process upper value
+
+ if (cntInt == 15) {
+ chNumber[0] = *(pchInt - 16);
+ chNumber[1] = OASTR('\0');
+ cyUpper.Lo = (unsigned long)StrToLong(chNumber, NULL);
+ cntInt--;
+ }
+
+ // process middle value
+
+ if(cntInt > 5){
+ MEMCPY(chNumber, pchInt - cntInt - 1, (cntInt - 5) * sizeof(OLECHAR));
+ chNumber[cntInt - 5] = OASTR('\0');
+ cyMiddle.Lo = (unsigned long)StrToLong(chNumber, NULL);
+ cntInt = 5;
+ }
+
+ // copy integer part of lower value
+
+ if (cntInt > 0)
+ MEMCPY(chNumber, pchInt - cntInt - 1, cntInt * sizeof(OLECHAR));
+
+ // copy fractional part of lower value
+
+ if (cntFrac > 0)
+ MEMCPY(&chNumber[cntInt], pchFrac - cntFrac - 1, cntFrac * sizeof(OLECHAR));
+
+ // add any trailing zeroes as needed
+
+ if (cntFrac < 4)
+#if OE_WIN32
+ // UNDONE: is there an equivelent of 'wmemset'?
+ wcsncpy(&chNumber[cntInt + cntFrac], OLESTR("0000"), 4 - cntFrac);
+#else
+ MEMSET(&chNumber[cntInt + cntFrac], OASTR('0'), 4 - cntFrac);
+#endif
+ // add ending null past last fractional digit
+
+ chNumber[cntInt + 4] = OASTR('\0');
+
+ // convert the lower component and add rounding if needed
+
+ cyLower.Lo = (unsigned long)StrToLong(chNumber, NULL) + (unsigned long)fRounding;
+
+ //--------------------------------------------------------
+ // cyUpper, cyMiddle, and cyLower contain
+ // the component values of the input.
+ //
+ // overflow has already been checked.
+ //
+ // rounding has been added if needed.
+ //--------------------------------------------------------
+
+ // if cyUpper is nonzero, set result to it multiplied by 10**9.
+
+ if(cyUpper.Lo != 0L){
+ err = ErrMultCyI4(cyUpper, 1000000000L, &cyOut);
+ if(err != NOERROR)
+ return err;
+ }
+
+ // if either upperVal or middleVal is nonzero, add
+ // cyMiddle to the result and multiply by 10**9.
+
+ if(cyUpper.Lo != 0L || cyMiddle.Lo != 0L){
+ AddCyNoOflo(&cyOut, &cyMiddle);
+ if((err = ErrMultCyI4(cyOut, 1000000000L, &cyOut)) != NOERROR)
+ return err;
+ }
+
+ // add cyLower to result
+
+ AddCyNoOflo(&cyOut, &cyLower);
+
+ // if sign was '-', negate the value
+
+ if(chSign == OASTR('-'))
+ NegCyNoOflo(&cyOut);
+
+ *pcyOut = cyOut;
+ return NOERROR;
+}
+
+PRIVATE_(long)
+StrToLong(OLECHAR FAR* pchInput, OLECHAR FAR* FAR* ppchAfter)
+{
+ OLECHAR chSign, chInput;
+ unsigned long ulResult, ulMaxValue;
+
+ chSign = OASTR('+');
+ ulResult = 0;
+ chInput = *pchInput++;
+
+ // process any leading sign
+
+ if (chInput == OASTR('+') || chInput == OASTR('-')) {
+ chSign = chInput;
+ chInput = *pchInput++;
+ }
+
+ // compute maximum value for sign
+
+ ulMaxValue = 0x7fffffffL + (unsigned long)(chSign == OASTR('-'));
+
+ // process any decimal digits until overflow
+
+ while (chInput >= OASTR('0') && chInput <= OASTR('9')) {
+ // test for overflow - if the conversion does not cause
+ // overflow, go ahead and perform it; otherwise, return. [01]
+
+ if (ulResult < (0xffffffffL -
+ (unsigned long)(chInput - OASTR('0')))/10) {
+
+ ulResult = ulResult * 10 + (unsigned long)(chInput - OASTR('0'));
+
+ } else {
+
+ if (ppchAfter)
+ *ppchAfter = pchInput - 1;
+ errno = ERANGE;
+ return (long)ulMaxValue;
+ }
+
+ chInput = *pchInput++;
+ }
+
+ // test for range of result
+
+ if (ulResult > ulMaxValue) {
+ if (ppchAfter)
+ *ppchAfter = pchInput - 1;
+ errno = ERANGE;
+ return (long)ulMaxValue;
+ }
+
+ // set sign, pointer, and return
+
+ if (chSign == OASTR('-'))
+ ulResult = (unsigned long)-(long)ulResult;
+
+ if (ppchAfter)
+ *ppchAfter = pchInput - 1;
+
+ return (long)ulResult;
+}
+
+PRIVATE_(long)
+HexOctStrToLong(OLECHAR FAR* pchInput, OLECHAR FAR* FAR* ppchAfter)
+{
+ OLECHAR chInput;
+ unsigned long ulResult;
+
+ ulResult = 0;
+ chInput = *pchInput++;
+
+ // first character must be a '&'
+
+ if (chInput == OASTR('&')) {
+
+ chInput = *pchInput++;
+ chInput = (OLECHAR) TOLOWER(chInput);
+
+ // process as hex if prefix is 'h'
+
+ if(chInput == OASTR('h')){
+ ulResult = StrToHex(pchInput, ppchAfter);
+
+ // process as octal otherwise
+
+ }else{
+
+ // Have string of the form:
+ // &o<octal digits>
+ // &o<not octal digits>
+ // &<digits>
+ // &<not octal digits>
+
+ if (chInput != OASTR('o')) {
+ // if no octal prefix, back up over char, so we point to the first
+ // digit (if it exists).
+ pchInput--;
+ if (chInput < OLECHAR('0') || chInput > OLECHAR('7'))
+ goto NotHexOctNum; // if no digit, then error
+ }
+
+ ulResult = StrToOct(pchInput, ppchAfter);
+ }
+ }
+
+ // if no legal prefix, set pointer to start of string
+
+ else {
+NotHexOctNum:
+ if (ppchAfter)
+ *ppchAfter = pchInput - 1;
+ }
+
+ return (long)ulResult;
+}
+
+PRIVATE_(unsigned long)
+StrToHex(OLECHAR FAR* pchIn, OLECHAR FAR* FAR* ppchAfter)
+{
+ OLECHAR ch;
+ unsigned long ulResult;
+
+ ulResult = 0L;
+
+ ch = *pchIn;
+ ch = (OLECHAR) TOLOWER(ch);
+
+ if (ch != 0)
+ pchIn++;
+
+ while ((ch >= OASTR('0') && ch <= OASTR('9')) ||
+ (ch >= OASTR('a') && ch <= OASTR('f'))) {
+
+ // first test for overflow by a high-order
+ // nonzero hex digit in the result
+
+ if (ulResult & 0xf0000000L) {
+ if(ppchAfter)
+ *ppchAfter = pchIn - 1;
+ errno = ERANGE;
+ return ulResult;
+ }
+
+ // adjust the hex letter value 'a'-'f' to '9'+1 to '9'+6
+ if (ch >= OASTR('a'))
+ ch -= OASTR('a') - OASTR('9') - 1;
+
+ // shift result one hex digit and add digit relative to '0'
+
+ ulResult = (ulResult << 4) + (unsigned long)(ch - OASTR('0'));
+
+ ch = *pchIn++;
+ ch = (OLECHAR) TOLOWER(ch);
+ }
+
+ // point past last character used
+
+ if (ppchAfter)
+ *ppchAfter = pchIn - 1;
+
+ return ulResult;
+}
+
+PRIVATE_(unsigned long)
+StrToOct (OLECHAR FAR* pchIn, OLECHAR FAR* FAR* ppchAfter)
+{
+ OLECHAR ch;
+ unsigned long ulResult;
+
+ ulResult = 0L;
+
+ ch = *pchIn;
+ ch = (OLECHAR) TOLOWER(ch);
+
+ if (ch != 0)
+ pchIn++;
+
+ while (ch >= OASTR('0') && ch <= OASTR('7')) {
+
+ // first test for overflow by a high-order
+ // nonzero octal digit in the result
+
+ if(ulResult & 0xe0000000L){
+ if(ppchAfter)
+ *ppchAfter = pchIn - 1;
+ errno = ERANGE;
+ return ulResult;
+ }
+
+ // shift result one octal digit and add digit relative to '0'
+
+ ulResult = (ulResult << 3) + (unsigned long)(ch - OASTR('0'));
+
+ ch = *pchIn++;
+ ch = (OLECHAR) TOLOWER(ch);
+ }
+
+ // point past last character used
+
+ if(ppchAfter)
+ *ppchAfter = pchIn - 1;
+
+ return ulResult;
+}
+
+/***
+* EditStrFromReal - edit real string to BASIC format
+*
+* Purpose:
+*
+* Convert the given string in place to the BASIC format.RR
+*
+* Fractions less than .1 are output in C in exponent format;
+* e.g., BASIC: .00777 --> C: 7.77e-003
+* Exponents in C use 'e' while BASIC uses 'E'.
+* Exponents in C use three-digit exponents always, BASIC uses
+* two if three are not needed.
+* e.g., BASIC: 3.456E+4 --> C: 3.456e+004
+* Trailing decimals used in C, not in BASIC
+* e.g., BASIC: 1234 --> C: 1234.
+* Fractions less than 1.0 are output with a leading zero depending
+* the locale setting LOCALE_ILZERO
+* e.g., .1234 or 0.1234
+* Maximum length integers are output in C as exponential, but
+* as integers in BASIC
+* e.g., BASIC: 1234567 --> 1.234567e+006
+*
+* Entry:
+* pchBuffer - pointer to string to be processed
+* cDigits - number of signficant digits, or maximum decimal
+*
+* Exit:
+* pchBuffer - converted string of the real value
+*
+* Exceptions:
+***********************************************************************/
+
+PRIVATE_(void)
+EditStrFromReal(OLECHAR FAR* pchBuffer, int cDigits, LCID lcid, unsigned long dwFlags)
+{
+ OLECHAR FAR* pchTemp;
+ OLECHAR FAR* pchEnd;
+ int length, lenFrac, valExp;
+
+ // first, replace the '.' returned by the C-rutime gcvt function with
+ // the locale-specific decimal.
+
+ pchTemp = pchBuffer;
+ while(*pchTemp) {
+ if (*pchTemp == OASTR('.')) {
+ *pchTemp = DecimalFromLcid(lcid, dwFlags);
+ break;
+ }
+ pchTemp++;
+ }
+
+
+ // skip over a leading minus sign
+
+ if(*pchBuffer == OASTR('-'))
+ pchBuffer++;
+
+ // get length and point to 'e' if exponental value
+ length = STRLEN(pchBuffer);
+ pchTemp = pchBuffer + length - 5;
+
+ // test if exponential value
+ if (length > 6 && *pchTemp == OASTR('e')) {
+
+ // test if negative exponent
+ if (*(pchTemp + 1) == OASTR('-')) {
+
+ // point to first exponent digit
+ pchTemp += 2;
+
+ // calcuate length of fraction
+ // "d.mm--mme-nnn" - two before, five after
+
+ lenFrac = length - 7;
+
+ // evaluate exponent value
+
+ valExp = *pchTemp++ - OASTR('0');
+ valExp = valExp * 10 + *pchTemp++ - OASTR('0');
+ valExp = valExp * 10 + *pchTemp - OASTR('0');
+
+ // determine if number can be a fraction...
+ // length is:
+ // valExp - 1 leading zeroes
+ // lenFrac + 1 digits (frac plus first digit)
+ //
+ if (valExp + lenFrac <= cDigits) {
+ // point past new end of fraction and
+ // to end of fraction in exponent
+
+ pchEnd = pchBuffer + valExp + lenFrac + 1;
+ pchTemp = pchBuffer + lenFrac + 1;
+
+ // write null for new fraction
+
+ *pchEnd-- = OASTR('\0');
+
+ // copy exponent fraction to new fraction
+ while(lenFrac--)
+ *pchEnd-- = *pchTemp--;
+
+ // copy leading digit
+ *pchEnd-- = *pchBuffer;
+
+ // set the leading zeroes, if any
+ while (pchEnd > pchBuffer)
+ *pchEnd-- = OASTR('0');
+
+ // set the decimal point of new fraction
+ *pchEnd-- = DecimalFromLcid(lcid, dwFlags);
+
+ // add a leading zero to a decimal point depending on Locale setting
+ // this is OK so long as the input buffer is really greater than
+ // cDigit, which is the case on all call here (buf[40])
+ if (LeadingZeroForDecimalFromLcid(lcid, dwFlags)) {
+ MEMMOVE(pchBuffer+1, pchBuffer, BYTELEN(pchBuffer));
+ *pchBuffer = OASTR('0');
+ }
+
+ }
+ else // if no conversion, point back to 'e' in value
+ pchTemp = pchBuffer + length - 5;
+ }
+ // test if positive exponent
+ else if (*(pchTemp + 1) == OASTR('+')) {
+
+ // point to first exponent digit
+
+ pchTemp += 2;
+
+ // calcuate length of fraction
+ // "d.mm--mme-nnn" - two before, five after
+
+ lenFrac = length - 7;
+
+ // evaluate exponent value
+
+ valExp = *pchTemp++ - OASTR('0');
+ valExp = valExp * 10 + *pchTemp++ - OASTR('0');
+ valExp = valExp * 10 + *pchTemp - OASTR('0');
+
+ // the only conversion done is when the exponent
+ // is one less than the number of digits to make
+ // an integer of length cDigits
+
+ if (valExp == cDigits - 1) {
+
+ // point to first fraction digit
+
+ pchTemp = pchBuffer + 2;
+
+ // copy fraction digits one location to the left
+
+ while (*pchTemp >= OASTR('0') && *pchTemp <= OASTR('9')) {
+ *(pchTemp - 1) = *pchTemp;
+ pchTemp++;
+ valExp--;
+ }
+
+ // zero-fill any remaining digits and terminate
+ // pchTemp is left on null, so exponent is not
+ // processed
+
+ pchTemp--;
+
+ while (valExp--)
+ *pchTemp++ = OASTR('0');
+ *pchTemp = OASTR('\0');
+
+ }
+ else
+ // if no conversion, point back to 'e' in value
+ pchTemp = pchBuffer + length - 5;
+ }
+
+ // if pchTemp points to an 'e', process the exponential
+
+ if (*pchTemp == OASTR('e')) {
+
+ // convert 'e' to upper case
+ *pchTemp = OASTR('E');
+
+ // if first exponent digit is a zero, remove it
+ if (*(pchTemp + 2) == OASTR('0'))
+ MEMMOVE(pchTemp+2, pchTemp+3, BYTELEN(pchTemp));
+
+ // if exponent is preceded by a decimal point, remove it
+ if (*(pchTemp - 1) == DecimalFromLcid(lcid, dwFlags))
+ MEMMOVE(pchTemp -1, pchTemp, BYTELEN(pchTemp));
+ }
+
+ }
+
+ // if not an exponent, do some processing
+
+ else {
+
+ // remove any trailing decimal point
+
+ pchTemp = pchBuffer + length - 1;
+
+ if(*pchTemp == DecimalFromLcid(lcid, dwFlags))
+ *pchTemp = OASTR('\0');
+
+ // remove a leading zero to a decimal point depending on Locale setting
+
+ if (!LeadingZeroForDecimalFromLcid(lcid, dwFlags) &&
+ (*pchBuffer == OASTR('0')) &&
+ (*(pchBuffer + 1) == DecimalFromLcid(lcid, dwFlags)))
+ MEMMOVE(pchBuffer, pchBuffer + 1, BYTELEN(pchBuffer));
+ }
+}
+
+
+PRIVATE_(HRESULT)
+GetDispProperty(
+ IDispatch FAR* pdisp,
+ LCID lcid,
+ VARTYPE vt,
+ VARIANT FAR* pvarResult)
+{
+ DISPPARAMS dispparams;
+ HRESULT hresult;
+
+ if (pdisp == NULL)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ pdisp->AddRef();
+
+ V_VT(pvarResult) = VT_EMPTY;
+
+ dispparams.cArgs = 0;
+ dispparams.rgvarg = NULL;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+
+ hresult = pdisp->Invoke(
+ DISPID_VALUE,
+ IID_NULL,
+ lcid,
+ DISPATCH_PROPERTYGET,
+ &dispparams, pvarResult, NULL, NULL);
+
+ pdisp->Release();
+
+ // if there was an error extracting the value property, then
+ // we simply report a type-mismatch.
+ //
+ if (hresult != NOERROR)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ // else coerse the variant to the desire variant type
+ return VariantChangeTypeInternal(pvarResult, lcid, vt);
+}
+
+
+#ifdef FE_DBCS
+
+// FE specific functions used within convert.cpp & bstrdate.c
+
+#define LCID_CHINA_T 0x404 // traditional
+#define LCID_CHINA_S 0x804 // simplified
+#define LCID_JAPAN 0x411
+#define LCID_KOREA 0x412
+
+EXTERN_C INTERNAL_(int)
+IsDBCS(LCID lcid)
+{
+ if (lcid == LOCALE_USER_DEFAULT || lcid == 0)
+ lcid = GetUserDefaultLCID();
+ return ( (lcid == LCID_JAPAN) ||
+ (lcid == LCID_KOREA) ||
+ (lcid == LCID_CHINA_S) || (lcid == LCID_CHINA_T) );
+}
+
+
+EXTERN_C INTERNAL_(int)
+IsJapan(LCID lcid)
+{
+ if (lcid == LOCALE_USER_DEFAULT || lcid == 0)
+ lcid = GetUserDefaultLCID();
+ return (lcid == LCID_JAPAN);
+}
+
+EXTERN_C INTERNAL_(int)
+IsKorea(LCID lcid)
+{
+ if (lcid == LOCALE_USER_DEFAULT || lcid == 0)
+ lcid = GetUserDefaultLCID();
+ return (lcid == LCID_KOREA);
+}
+
+EXTERN_C INTERNAL_(int)
+IsTaiwan(LCID lcid)
+{
+ if (lcid == LOCALE_USER_DEFAULT || lcid == 0)
+ lcid = GetUserDefaultLCID();
+ return (lcid == LCID_CHINA_T);
+}
+
+EXTERN_C INTERNAL_(int)
+IsChina(LCID lcid)
+{
+ if (lcid == LOCALE_USER_DEFAULT || lcid == 0)
+ lcid = GetUserDefaultLCID();
+ return (lcid == LCID_CHINA_S);
+}
+
+
+#endif // FE_DBCS
+
+
+#if OE_MAC /* { */
+
+/* Mac Note: On the Mac, the coersion functions support the
+ * Symantec C++ calling convention for float/double. To support
+ * float/double arguments compiled with the MPW C compiler,
+ * use the following APIs to move MPW float/double values into
+ * a VARIANT.
+ */
+
+
+STDAPI MPWVarFromR4(float FAR* pfltIn, VARIANT FAR* pvarOut)
+{
+
+ V_R4(pvarOut) = *pfltIn;
+ return NOERROR;
+}
+
+
+STDAPI MPWVarFromR8(double FAR* pdblIn, VARIANT FAR* pvarOut)
+{
+ V_R8(pvarOut) = *pdblIn;
+ return NOERROR;
+}
+
+
+STDAPI MPWR4FromVar(VARIANT FAR* pvarIn, float FAR* pfltOut)
+{
+ *pfltOut = V_R4(pvarIn);
+ return NOERROR;
+}
+
+
+STDAPI MPWR8FromVar(VARIANT FAR* pvarIn, double FAR* pdblOut)
+{
+ *pdblOut = V_R8(pvarIn);
+ return NOERROR;
+}
+
+#endif /* } */
diff --git a/private/oleauto/src/dispatch/crtstuff.c b/private/oleauto/src/dispatch/crtstuff.c
new file mode 100644
index 000000000..8b9d1d193
--- /dev/null
+++ b/private/oleauto/src/dispatch/crtstuff.c
@@ -0,0 +1,214 @@
+/***
+*crtstuff.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Misc C Runtime style helper functions.
+*
+* disp_itoa
+* disp_ltoa
+* disp_floor
+*
+*Revision History:
+*
+* [00] 09-Jun-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#include <stdlib.h>
+#include <limits.h>
+#include <math.h> // floor()
+
+/* helper routine that does the main job. */
+
+INTERNAL_(void)
+xtoa(unsigned long val, OLECHAR FAR* buf, unsigned radix, int is_neg)
+{
+ OLECHAR FAR* p; /* pointer to traverse string */
+ OLECHAR FAR* firstdig; /* pointer to first digit */
+ OLECHAR temp; /* temp char */
+ unsigned digval; /* value of digit */
+
+ p = buf;
+
+ if (is_neg) {
+ /* negative, so output '-' and negate */
+ *p++ = OASTR('-');
+ val = (unsigned long)-(long)val;
+ }
+
+ firstdig = p; /* save pointer to first digit */
+
+ do {
+ digval = (unsigned) (val % radix);
+ val /= radix; /* get next digit */
+
+ /* convert to ascii and store */
+ if (digval > 9)
+ *p++ = (OLECHAR) (digval - 10 + OASTR('a')); /* a letter */
+ else
+ *p++ = (OLECHAR) (digval + OASTR('0')); /* a digit */
+ } while (val > 0);
+
+ /* We now have the digit of the number in the buffer, but in reverse
+ order. Thus we reverse them now. */
+
+ *p-- = OASTR('\0'); /* terminate string; p points to last digit */
+
+ do {
+ temp = *p;
+ *p = *firstdig;
+ *firstdig = temp; /* swap *p and *firstdig */
+ --p;
+ ++firstdig; /* advance to next two digits */
+ } while (firstdig < p); /* repeat until halfway */
+}
+
+
+/* Actual functions just call conversion helper with neg flag set correctly,
+ and return pointer to buffer. */
+
+INTERNAL_(OLECHAR FAR*)
+disp_itoa(int val, OLECHAR FAR* buf, int radix)
+{
+ if (radix == 10 && val < 0)
+ xtoa((unsigned long)val, buf, radix, 1);
+ else
+ xtoa((unsigned long)(unsigned int)val, buf, radix, 0);
+ return buf;
+}
+
+INTERNAL_(OLECHAR FAR*)
+disp_ltoa(long val, OLECHAR FAR* buf, int radix)
+{
+ xtoa((unsigned long)val, buf, radix, (radix == 10 && val < 0));
+ return buf;
+}
+
+#if 0 /* currently unused */
+
+INTERNAL_(OLECHAR FAR*)
+disp_ultoa(unsigned long val, OLECHAR FAR* buf, int radix)
+{
+ xtoa(val, buf, radix, 0);
+ return buf;
+}
+
+#endif
+
+
+INTERNAL_(double)
+disp_floor(double dbl)
+{
+#if HC_MPW
+
+ GlobalWorld gworld;
+
+ gworld = OpenGlobalWorld();
+
+ dbl = (double)floor((extended)dbl);
+
+ CloseGlobalWorld(gworld);
+
+ return dbl;
+
+#else
+
+ return floor(dbl); // just use the c runtime
+
+#endif
+}
+
+
+#if HC_MPW
+
+INTERNAL_(int)
+disp_stricmp(char *first, char *last)
+{
+ unsigned short f, l;
+
+ do{
+ f = tolower(*first++);
+ l = tolower(*last++);
+ }while(f && f == l);
+
+ return f - l;
+}
+
+#endif
+
+
+INTERNAL_(void)
+disp_gcvt(double dblIn, int ndigits, OLECHAR FAR* pchOut, int bufSize)
+{
+#if HC_MPW
+
+ char *pch;
+ char *pchTmp;
+ extended extIn;
+ int decpt, sign;
+ GlobalWorld gworld;
+
+ pch = pchOut;
+
+ gworld = OpenGlobalWorld();
+
+ extIn = (extended)dblIn;
+ pchTmp = fcvt(extIn, ndigits, &decpt, &sign);
+
+ if(sign < 0)
+ *pch++ = '-';
+
+ if(decpt < 0){
+ *pch++ = '.';
+ while(decpt++ < 0)
+ *pch++ = '0';
+ }else{
+ while(decpt-- > 0)
+ *pch++ = *pchTmp++;
+ *pch++ = '.';
+ }
+ while(*pchTmp != '\0')
+ *pch++ = *pchTmp++;
+ *pch = '\0';
+
+ CloseGlobalWorld(gworld);
+
+#else
+# if OE_WIN32
+ char buf[40];
+
+ _gcvt(dblIn, ndigits, buf);
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, buf, -1, pchOut, bufSize);
+# else
+ UNUSED(bufSize);
+ _gcvt(dblIn, ndigits, pchOut);
+# endif
+#endif
+}
+
+INTERNAL_(double)
+disp_strtod(OLECHAR FAR* strIn, OLECHAR FAR* FAR* ppchEnd)
+{
+#if HC_MPW
+ double dbl;
+ GlobalWorld gworld;
+
+ gworld = OpenGlobalWorld();
+ dbl = strtod(strIn, ppchEnd);
+ CloseGlobalWorld(gworld);
+
+ return dbl;
+
+#else
+
+ return STRTOD(strIn, ppchEnd);
+
+#endif
+}
diff --git a/private/oleauto/src/dispatch/crtstuff.h b/private/oleauto/src/dispatch/crtstuff.h
new file mode 100644
index 000000000..877bde889
--- /dev/null
+++ b/private/oleauto/src/dispatch/crtstuff.h
@@ -0,0 +1,47 @@
+
+/***
+*crtstuff.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Misc C Runtime style helper functions.
+*
+*Revision History:
+*
+* [00] 09-Jun-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+INTERNAL_(HRESULT) DispAlloc(size_t cb, void FAR* FAR* ppv);
+
+INTERNAL_(void) DispFree(void FAR* pv);
+
+INTERNAL_(char FAR*) disp_itoa(int val, char FAR* buf, int radix);
+
+INTERNAL_(char FAR*) disp_ltoa(long val, char FAR* buf, int radix);
+
+INTERNAL_(double) disp_floor(double dbl);
+
+INTERNAL_(void) disp_gcvt(double dblIn, int ndigits, char FAR* pchOut);
+
+INTERNAL_(double) disp_strtod(char FAR* strIn, char FAR* FAR* pchEnd);
+
+#if HC_MPW
+
+INTERNAL_(int) disp_stricmp(char*, char*);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/private/oleauto/src/dispatch/dbcsdate.c b/private/oleauto/src/dispatch/dbcsdate.c
new file mode 100644
index 000000000..c8dc6a10a
--- /dev/null
+++ b/private/oleauto/src/dispatch/dbcsdate.c
@@ -0,0 +1,87 @@
+// code fragment I used to generate the contents of DBCSDATE.H
+// Needs to be updated & re-run when changing this info. You must have
+// all 4 code pages installed on a DaytonaJ machine in ordedr
+
+void DoIt(int codepage, char * szName, char * szDataA) {
+WCHAR szDataW[20];
+char szBuffer[80];
+char *pch;
+char *pchOut;
+int cb;
+
+ printf("#if OE_WIN32\n");
+ szDataW[0] = 0;
+ MultiByteToWideChar(codepage, MB_PRECOMPOSED, szDataA, strlen(szDataA)+1,
+ szDataW, sizeof(szDataW));
+
+ szBuffer[0] = 0;
+ cb = wcslen(szDataW) * sizeof(WCHAR);
+ for (pchOut = szBuffer, pch = (char *)szDataW; cb > 0; pch++, cb--) {
+ pchOut += sprintf(pchOut, "\\x%x", (unsigned char)*pch);
+ }
+ printf("#define %s (WCHAR *)\"%s\"\n", szName, szBuffer);
+
+ printf("#else \\\\OE_WIN32\n");
+
+ szBuffer[0] = 0;
+ cb = strlen(szDataA);
+ for (pchOut = szBuffer, pch = (char *)szDataA; cb > 0; pch++, cb--) {
+ pchOut += sprintf(pchOut, "\\x%x", (unsigned char)*pch);
+ }
+ printf("#define %s \"%s\"\n", szName, szBuffer);
+
+ printf("#endif \\\\OE_WIN32\n");
+}
+
+int TempDump() {
+ DoIt(932, "szJapanimpEras0Name1", "\x96\xbe");
+ DoIt(932, "szJapanimpEras0Name2", "\x96\xbe\x8e\xa1");
+ DoIt(932, "szJapanimpEras1Name1", "\x91\xe5");
+ DoIt(932, "szJapanimpEras1Name2", "\x91\xe5\x90\xb3");
+ DoIt(932, "szJapanimpEras2Name1", "\x8f\xba");
+ DoIt(932, "szJapanimpEras2Name2", "\x8f\xba\x98\x61");
+ DoIt(932, "szJapanimpEras3Name1", "\x95\xbd");
+ DoIt(932, "szJapanimpEras3Name2", "\x95\xbd\x90\xac");
+ DoIt(932, "szJapandbYearSuff", "\x94\x4e");
+ DoIt(932, "szJapandbMonthSuff", "\x8c\x8e");
+ DoIt(932, "szJapandbDaySuff", "\x93\xfa");
+ DoIt(932, "szJapandbHourSuff", "\x8e\x9e");
+ DoIt(932, "szJapandbMinuteSuff", "\x95\xaa");
+ DoIt(932, "szJapandbSecondSuff", "\x95\x62");
+ DoIt(932, "szJapandb1159", "\x8c\xdf\x91\x4f");
+ DoIt(932, "szJapandb2359", "\x8c\xdf\x8c\xe3");
+
+ DoIt(949, "szKoreadbYearSuff", "\xb3\xe2");
+ DoIt(949, "szKoreadbMonthSuff", "\xbf\xf9");
+ DoIt(949, "szKoreadbDaySuff", "\xc0\xcf");
+ DoIt(949, "szKoreadbHourSuff", "\xbd\xc3");
+ DoIt(949, "szKoreadbMinuteSuff", "\xba\xd0");
+ DoIt(949, "szKoreadbSecondSuff", "\xc3\xca");
+ DoIt(949, "szKoreadb1159", "\xbf\xc0\xc0\xfc");
+ DoIt(949, "szKoreadb2359", "\xbf\xc0\xc8\xc4");
+
+ DoIt(950, "szTaiwandbYearSuff", "\xa6\x7e");
+ DoIt(950, "szTaiwandbMonthSuff", "\xa4\xeb");
+ DoIt(950, "szTaiwandbDaySuff", "\xa4\xe9");
+ DoIt(950, "szTaiwandbHourSuff", "\xae\xc9");
+ DoIt(950, "szTaiwandbMinuteSuff", "\xa4\xc0");
+ DoIt(950, "szTaiwandbSecondSuff", "\xac\xed");
+ DoIt(950, "szTaiwandb1159", "\xa4\x57\xa4\xc8");
+ DoIt(950, "szTaiwandb2359", "\xa4\x55\xa4\xc8");
+ DoIt(950, "szTaiwanrepEras0Name0", "\xa5\xc1\xb0\xea\xab\x65");
+ DoIt(950, "szTaiwanrepEras0Name1", "\xa4\xa4\xb5\xd8\xa5\xc1\xb0\xea\xab\x65");
+ DoIt(950, "szTaiwanrepEras1Name0", "\xa5\xc1\xb0\xea");
+ DoIt(950, "szTaiwanrepEras1Name1", "\xa4\xa4\xb5\xd8\xa5\xc1\xb0\xea");
+
+ DoIt(936, "szChinadbYearSuff", "\xc4\xea");
+ DoIt(936, "szChinadbMonthSuff", "\xd4\xc2");
+ DoIt(936, "szChinadbDaySuff", "\xc8\xd5");
+ DoIt(936, "szChinadbHourSuff", "\xca\xb1");
+ DoIt(936, "szChinadbMinuteSuff", "\xb7\xd6");
+ DoIt(936, "szChinadbSecondSuff", "\xc3\xeb");
+ DoIt(936, "szChinadb1159", "\xc9\xcf\xce\xe7");
+ DoIt(936, "szChinadb2359", "\xcf\xc2\xce\xe7");
+ DoIt(936, "szChinadbEraName", "\xb9\xab\xd4\xaa");
+
+ return 1;
+}
diff --git a/private/oleauto/src/dispatch/dbcsdate.h b/private/oleauto/src/dispatch/dbcsdate.h
new file mode 100644
index 000000000..547bcb278
--- /dev/null
+++ b/private/oleauto/src/dispatch/dbcsdate.h
@@ -0,0 +1,228 @@
+// machine-generated mapping of Ansi DBCS strings to UNICODE strings.
+// See dbcsdate.c for code used to generate this.
+
+#if OE_WIN32
+#define szJapanimpEras0Name1 (WCHAR *)"\xe\x66"
+#else //OE_WIN32
+#define szJapanimpEras0Name1 "\x96\xbe"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapanimpEras0Name2 (WCHAR *)"\xe\x66\xbb\x6c"
+#else //OE_WIN32
+#define szJapanimpEras0Name2 "\x96\xbe\x8e\xa1"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapanimpEras1Name1 (WCHAR *)"\x27\x59"
+#else //OE_WIN32
+#define szJapanimpEras1Name1 "\x91\xe5"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapanimpEras1Name2 (WCHAR *)"\x27\x59\x63\x6b"
+#else //OE_WIN32
+#define szJapanimpEras1Name2 "\x91\xe5\x90\xb3"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapanimpEras2Name1 (WCHAR *)"\x2d\x66"
+#else //OE_WIN32
+#define szJapanimpEras2Name1 "\x8f\xba"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapanimpEras2Name2 (WCHAR *)"\x2d\x66\x8c\x54"
+#else //OE_WIN32
+#define szJapanimpEras2Name2 "\x8f\xba\x98\x61"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapanimpEras3Name1 (WCHAR *)"\x73\x5e"
+#else //OE_WIN32
+#define szJapanimpEras3Name1 "\x95\xbd"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapanimpEras3Name2 (WCHAR *)"\x73\x5e\x10\x62"
+#else //OE_WIN32
+#define szJapanimpEras3Name2 "\x95\xbd\x90\xac"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapandbYearSuff (WCHAR *)"\x74\x5e"
+#else //OE_WIN32
+#define szJapandbYearSuff "\x94\x4e"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapandbMonthSuff (WCHAR *)"\x8\x67"
+#else //OE_WIN32
+#define szJapandbMonthSuff "\x8c\x8e"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapandbDaySuff (WCHAR *)"\xe5\x65"
+#else //OE_WIN32
+#define szJapandbDaySuff "\x93\xfa"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapandbHourSuff (WCHAR *)"\x42\x66"
+#else //OE_WIN32
+#define szJapandbHourSuff "\x8e\x9e"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapandbMinuteSuff (WCHAR *)"\x6\x52"
+#else //OE_WIN32
+#define szJapandbMinuteSuff "\x95\xaa"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapandbSecondSuff (WCHAR *)"\xd2\x79"
+#else //OE_WIN32
+#define szJapandbSecondSuff "\x95\x62"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapandb1159 (WCHAR *)"\x48\x53\x4d\x52"
+#else //OE_WIN32
+#define szJapandb1159 "\x8c\xdf\x91\x4f"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szJapandb2359 (WCHAR *)"\x48\x53\x8c\x5f"
+#else //OE_WIN32
+#define szJapandb2359 "\x8c\xdf\x8c\xe3"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szKoreadbYearSuff (WCHAR *)"\x5b\x35"
+#else //OE_WIN32
+#define szKoreadbYearSuff "\xb3\xe2"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szKoreadbMonthSuff (WCHAR *)"\xda\x39"
+#else //OE_WIN32
+#define szKoreadbMonthSuff "\xbf\xf9"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szKoreadbDaySuff (WCHAR *)"\xe\x3a"
+#else //OE_WIN32
+#define szKoreadbDaySuff "\xc0\xcf"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szKoreadbHourSuff (WCHAR *)"\xe8\x38"
+#else //OE_WIN32
+#define szKoreadbHourSuff "\xbd\xc3"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szKoreadbMinuteSuff (WCHAR *)"\xdb\x37"
+#else //OE_WIN32
+#define szKoreadbMinuteSuff "\xba\xd0"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szKoreadbSecondSuff (WCHAR *)"\x23\x3b"
+#else //OE_WIN32
+#define szKoreadbSecondSuff "\xc3\xca"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szKoreadb1159 (WCHAR *)"\xa1\x39\x3b\x3a"
+#else //OE_WIN32
+#define szKoreadb1159 "\xbf\xc0\xc0\xfc"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szKoreadb2359 (WCHAR *)"\xa1\x39\xf3\x3c"
+#else //OE_WIN32
+#define szKoreadb2359 "\xbf\xc0\xc8\xc4"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwandbYearSuff (WCHAR *)"\x74\x5e"
+#else //OE_WIN32
+#define szTaiwandbYearSuff "\xa6\x7e"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwandbMonthSuff (WCHAR *)"\x8\x67"
+#else //OE_WIN32
+#define szTaiwandbMonthSuff "\xa4\xeb"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwandbDaySuff (WCHAR *)"\xe5\x65"
+#else //OE_WIN32
+#define szTaiwandbDaySuff "\xa4\xe9"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwandbHourSuff (WCHAR *)"\x42\x66"
+#else //OE_WIN32
+#define szTaiwandbHourSuff "\xae\xc9"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwandbMinuteSuff (WCHAR *)"\x6\x52"
+#else //OE_WIN32
+#define szTaiwandbMinuteSuff "\xa4\xc0"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwandbSecondSuff (WCHAR *)"\xd2\x79"
+#else //OE_WIN32
+#define szTaiwandbSecondSuff "\xac\xed"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwandb1159 (WCHAR *)"\xa\x4e\x48\x53"
+#else //OE_WIN32
+#define szTaiwandb1159 "\xa4\x57\xa4\xc8"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwandb2359 (WCHAR *)"\xb\x4e\x48\x53"
+#else //OE_WIN32
+#define szTaiwandb2359 "\xa4\x55\xa4\xc8"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwanrepEras0Name0 (WCHAR *)"\x11\x6c\xb\x57\x4d\x52"
+#else //OE_WIN32
+#define szTaiwanrepEras0Name0 "\xa5\xc1\xb0\xea\xab\x65"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwanrepEras0Name1 (WCHAR *)"\x2d\x4e\xef\x83\x11\x6c\xb\x57\x4d\x52"
+#else //OE_WIN32
+#define szTaiwanrepEras0Name1 "\xa4\xa4\xb5\xd8\xa5\xc1\xb0\xea\xab\x65"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwanrepEras1Name0 (WCHAR *)"\x11\x6c\xb\x57"
+#else //OE_WIN32
+#define szTaiwanrepEras1Name0 "\xa5\xc1\xb0\xea"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szTaiwanrepEras1Name1 (WCHAR *)"\x2d\x4e\xef\x83\x11\x6c\xb\x57"
+#else //OE_WIN32
+#define szTaiwanrepEras1Name1 "\xa4\xa4\xb5\xd8\xa5\xc1\xb0\xea"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadbYearSuff (WCHAR *)"\x74\x5e"
+#else //OE_WIN32
+#define szChinadbYearSuff "\xc4\xea"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadbMonthSuff (WCHAR *)"\x8\x67"
+#else //OE_WIN32
+#define szChinadbMonthSuff "\xd4\xc2"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadbDaySuff (WCHAR *)"\xe5\x65"
+#else //OE_WIN32
+#define szChinadbDaySuff "\xc8\xd5"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadbHourSuff (WCHAR *)"\xf6\x65"
+#else //OE_WIN32
+#define szChinadbHourSuff "\xca\xb1"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadbMinuteSuff (WCHAR *)"\x6\x52"
+#else //OE_WIN32
+#define szChinadbMinuteSuff "\xb7\xd6"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadbSecondSuff (WCHAR *)"\xd2\x79"
+#else //OE_WIN32
+#define szChinadbSecondSuff "\xc3\xeb"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadb1159 (WCHAR *)"\xa\x4e\x48\x53"
+#else //OE_WIN32
+#define szChinadb1159 "\xc9\xcf\xce\xe7"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadb2359 (WCHAR *)"\xb\x4e\x48\x53"
+#else //OE_WIN32
+#define szChinadb2359 "\xcf\xc2\xce\xe7"
+#endif //OE_WIN32
+#if OE_WIN32
+#define szChinadbEraName (WCHAR *)"\x6c\x51\x43\x51"
+#else //OE_WIN32
+#define szChinadbEraName "\xb9\xab\xd4\xaa"
+#endif //OE_WIN32
diff --git a/private/oleauto/src/dispatch/dispbind.cpp b/private/oleauto/src/dispatch/dispbind.cpp
new file mode 100644
index 000000000..2fe0130d2
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispbind.cpp
@@ -0,0 +1,221 @@
+/***
+*dispbind.cpp - Remote object binding support.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains helpers for creating and connecting to an
+* instance of a remote object.
+*
+* The information for binding to an object by name is stored in
+* the windows registry in the following format,
+*
+#if 0
+* \{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} = fullname
+* \AuxUserType\1 = fullname
+* \AuxUserType\2 = shortname
+* \AuxUserType\3 = progname
+#else
+*
+* // registry have changed (again), now progname is registered as follows,
+*
+* \CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} = fullname
+* \CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\ProgID = progname
+*
+#endif
+*
+* Where the name we bind to is the progname associated with the subkey
+* \AuxUserType\3.
+#
+*
+*Revision History:
+*
+* [00] 18-Sep-92 bradlo: Created.
+* 18-Jan-92 bradlo: updated to Ole2 beta2 registry format
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# include <macos/types.h>
+# include <macos/menus.h>
+# include <macos/windows.h>
+# include "machack.h"
+#else
+# include <windows.h>
+#endif
+
+#include <ole2.h>
+#include <dispatch.h>
+
+#ifndef _MAC
+extern "C"
+{
+#include <shellapi.h>
+}
+#endif
+
+
+#if 0
+
+// the following has been replaced with the Ole2 supplied
+// API, CLSIDFromProgID()
+
+/***
+*PRIVATE HRESULT ClsidOfClassName(char*, CLSID*)
+*Purpose:
+* Lookup the given class name in the registry, and return the
+* associated CLSID.
+*
+* If there are multiple CLSIDs with the same name, then we
+* simply return the first one we come across.
+*
+* Class names matches are case insensitive.
+*
+*Entry:
+* szProgName = the textual name of the class to lookup
+*
+*Exit:
+* return value = HRESULT
+* S_OK - got it!
+* S_FALSE - name not found
+*
+* *pclsid = the CLSID of the given name
+*
+*Note:
+* This is a very nieve implementation, I haven't bothered to
+* optimize this function at all. The registry search is largely
+* stolen from an SDK example, and there may well be more
+* efficient ways to do this.
+*
+***********************************************************************/
+HRESULT
+ClsidOfClassName(char FAR* szProgName, CLSID FAR* pclsid)
+{
+ LONG cb;
+ HRESULT hresult;
+ HKEY hkRoot, hkAux;
+ unsigned long dwIndex;
+ char szKey[256], szValue[256]; // REVIEW: how big can a key/value be?
+
+
+#ifdef _DEBUG // param validation
+ // REVIEW: should validate szProgName as well
+
+ if(IsBadWritePtr(pclsid, sizeof(*pclsid)))
+ return ResultFromScode(E_INVALIDARG);
+#endif
+
+ if(RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hkRoot) != ERROR_SUCCESS){
+ hresult = ResultFromScode(OLE_E_REGDB_KEY);
+ goto LExit;
+ }
+
+ // Scan all top level keys in the registry. If the key begins with
+ // a '{', then assume its a CLSID and look a bit further
+ //
+ for(dwIndex = 0;; ++dwIndex)
+ {
+ if(RegEnumKey(hkRoot, dwIndex, szKey, sizeof(szKey)) != ERROR_SUCCESS){
+ hresult = ResultFromScode(OLE_E_REGDB_KEY);
+ goto LClose0;
+ }
+
+ // if the key's prefix looks like it might be a CLSID, then
+ // examine this entry a bit closer.
+ //
+ if(*szKey == '{')
+ {
+ // if we can convert it successfully, then we assume it
+ // *was* a valid CLSID.
+ //
+ if(CLSIDFromString(szKey, pclsid) == NOERROR)
+ {
+ if(RegOpenKey(hkRoot, szKey, &hkAux) == ERROR_SUCCESS)
+ {
+ cb = sizeof(szValue);
+ if(RegQueryValue(
+ hkAux, "AuxUserType\\3", szValue, &cb) == ERROR_SUCCESS)
+ {
+ // if the name matches, then we have found it
+ //
+ if(!_fstricmp(szValue, szProgName)){
+ hresult = NOERROR;
+ goto LClose1;
+ }
+ }
+
+ RegCloseKey(hkAux);
+ }
+ }
+ }
+ }
+ RegCloseKey(hkRoot);
+
+ // unknown CLSID
+ return ResultFromScode(OLE_E_CLSID);
+
+LClose1:;
+ RegCloseKey(hkAux);
+
+LClose0:;
+ RegCloseKey(hkRoot);
+
+LExit:;
+ return hresult;
+}
+
+#endif
+
+
+/***
+*HRESULT dispbind(char*, IDispatch **)
+*
+*Purpose:
+* Connect to the IDispatch interface on a *new* instance of a class
+* with the given class ID.
+*
+*Entry:
+* szProgName = the name of the class.
+*
+*Exit:
+* return value = HRESULT
+* NOERROR
+* E_FAIL - couldn't bind (REVIEW: need a better error for this?)
+*
+* *ppdisp = pointer to an IDispatch* if the connect was successful.
+*
+***********************************************************************/
+STDAPI
+CreateObject(char FAR* szProgName, IDispatch FAR* FAR* ppdisp)
+{
+ CLSID clsid;
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+
+ // map the given class name to a CLSID
+ //
+ hresult = CLSIDFromProgID(szProgName, &clsid);
+ if(hresult != NOERROR)
+ goto LError0;
+
+
+ // Create an instance of a class with the given CLSID
+ //
+ hresult = CoCreateInstance(
+ clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void FAR* FAR*)&punk);
+ if(hresult != NOERROR)
+ goto LError0;
+
+ // Create the proxies
+ //
+ hresult = punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)ppdisp);
+
+ punk->Release();
+
+LError0:;
+ return hresult;
+}
diff --git a/private/oleauto/src/dispatch/disphelp.cpp b/private/oleauto/src/dispatch/disphelp.cpp
new file mode 100644
index 000000000..15add75b4
--- /dev/null
+++ b/private/oleauto/src/dispatch/disphelp.cpp
@@ -0,0 +1,229 @@
+/***
+*disphelp.cpp - App hosted IDispatch implementation helpers
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+* [00] 23-Sep-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#include <stdarg.h>
+
+#include "cdispti.h"
+
+ASSERTDATA
+
+
+EXTERN_C INTERNAL_(HRESULT)
+IndexOfParam(DISPPARAMS FAR* pdispparams, unsigned int uPosition, unsigned int FAR* puIndex)
+{
+ int i;
+
+ // try for named parameter first (if there are any)
+ //
+ for(i = 0; i < (int)pdispparams->cNamedArgs; ++i)
+ // sign extend uPosition so any special values will be properly
+ // expanded to 32 bits on win16.
+ //
+ if(pdispparams->rgdispidNamedArgs[i] == (DISPID)((int)uPosition))
+ goto LGotIt;
+
+ i = pdispparams->cArgs - (int)uPosition - 1;
+
+ if(i < (int)pdispparams->cNamedArgs)
+ return RESULT(DISP_E_PARAMNOTFOUND);
+
+ ASSERT(i >= (int)pdispparams->cNamedArgs
+ && i < (int)pdispparams->cArgs);
+
+LGotIt:;
+ *puIndex = (unsigned int)i;
+
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC HRESULT DispGetParam(DISPPARAMS*, unsigned int, VARTYPE, VARIANTARG*, unsigned int*)
+*Purpose:
+* Utility for extracting a parameter from the IDispatch variant array.
+*
+*Entry:
+* pdispparams = pointer to DISPPARAMS struct
+* dispidName = name of the desired param.
+* uPosition = position of the desired parameters.
+* pvarResult = return parameter. This is passed in with the VARTYPE
+* set to the desired result.
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+* E_OUTOFMEMORY
+* DISP_E_OVERFLOW
+* DISP_E_BADVARTYPE
+* DISP_E_TYPEMISMATCH
+* DISP_E_PARAMNOTFOUND
+*
+* pvarResult = pointer to the properly coerced parameter.
+* puArgErr = if the coersion failed, this will be the index of the
+* source param in the dispparams.rgvarg array.
+*
+***********************************************************************/
+STDAPI
+DispGetParam(
+ DISPPARAMS FAR* pdispparams,
+ unsigned int uPosition,
+ VARTYPE vtTarg,
+ VARIANT FAR* pvarResult,
+ unsigned int FAR* puArgErr)
+{
+ unsigned int uIndex;
+ HRESULT hresult;
+
+ IfFailRet(IndexOfParam(pdispparams, uPosition, &uIndex));
+
+ hresult = VariantChangeType(
+ pvarResult, &pdispparams->rgvarg[uIndex], 0, vtTarg);
+
+ if(hresult != NOERROR && puArgErr != NULL)
+ *puArgErr = uIndex;
+
+ return hresult;
+}
+
+#if OE_WIN32 && 0
+STDAPI
+DispGetParamW(
+ DISPPARAMS FAR* pdispparams,
+ unsigned int uPosition,
+ VARTYPE vtTarg,
+ VARIANT FAR* pvarResult,
+ unsigned int FAR* puArgErr)
+{
+ return DispGetParam(pdispparams, uPosition, vtTarg, pvarResult, puArgErr);
+}
+#endif
+
+/***
+*PUBLIC HRESULT DispGetIDsOfNames(ITypeInfo*, char**, unsigned int, DISPID*)
+*Purpose:
+* Default table driven implementation of IDispatch::GetIDsOfNames().
+*
+*Entry:
+* ptinfo = the typeinfo to use to map the names
+* rgszNames = the array of names to translate
+* cNames = count of names
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+* DISP_E_UNKNOWNNAME
+*
+* rgdispid[] = array of DISPIDs corresponding to given array of names
+*
+*Note:
+* this routine that the PARAMDATA structure was declared in the proper
+* order - unfortunately there is no way to verify this. The proper
+* order to declare is in the same textual order that the parameters
+* appear on the argument list.
+*
+***********************************************************************/
+STDAPI
+DispGetIDsOfNames(
+ ITypeInfo FAR* ptinfo,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ DISPID FAR* rgdispid)
+{
+ return ptinfo->GetIDsOfNames(rgszNames, cNames, rgdispid);
+}
+
+#if OE_WIN32 && 0
+STDAPI
+DispGetIDsOfNamesW(
+ ITypeInfoW FAR* ptinfo,
+ WCHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ DISPID FAR* rgdispid)
+{
+ return ptinfo->GetIDsOfNames(rgszNames, cNames, rgdispid);
+}
+#endif
+
+
+
+/***
+*PUBLIC HRESULT DispInvoke(...)
+*Purpose:
+* Default table driven implementation of IDispatch::Invoke()
+*
+*Entry:
+* _this = UNDONE
+* pmethdata = pointer to the METHODDATA struct describing the method
+* we are going to invoke.
+* pdispparams = pointer to the DISPPARAMS structure for this method.
+* pvarResult = pointer to a VARIANT for the return value.
+* ...
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+* E_OUTOFMEMORY
+* DISP_E_TYPEMISMATCH - could not coerce arg to expected type
+* DISP_E_PARAMNOTFOUND - could not locate the param in the DISPPARAMS
+*
+* *pvarResult = UNDONE
+* *pexcepinfo = UNDONE
+* *puArgErr = UNDONE
+*
+***********************************************************************/
+
+STDAPI
+DispInvoke(
+ void FAR* _this,
+ ITypeInfo FAR* ptinfo,
+ DISPID dispidMember,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ return
+ ptinfo->Invoke(
+ _this,
+ dispidMember, wFlags, pdispparams,
+ pvarResult, pexcepinfo, puArgErr);
+}
+
+#if OE_WIN32 && 0
+STDAPI
+DispInvokeW(
+ void FAR* _this,
+ ITypeInfoW FAR* ptinfo,
+ DISPID dispidMember,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ WEXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ return
+ ptinfo->Invoke(
+ _this,
+ dispidMember, wFlags, pdispparams,
+ pvarResult, pexcepinfo, puArgErr);
+}
+#endif
diff --git a/private/oleauto/src/dispatch/dispiid.c b/private/oleauto/src/dispatch/dispiid.c
new file mode 100644
index 000000000..bf4bee904
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispiid.c
@@ -0,0 +1,59 @@
+/***
+*dispiid.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates (via Ole macro mania) the IDispatch related IIDs.
+*
+*Revision History:
+*
+* [00] 05-Oct-92 bradlo: Created.
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# ifdef _MSC_VER
+# include <macos/types.h>
+# include <macos/packages.h>
+# include <macos/resource.h>
+# include <macos/menus.h>
+# include <macos/windows.h>
+# include <macos/osutils.h>
+# include <macos/appleeve.h>
+# define far
+# define FAR far
+# define near
+# define NEAR near
+# ifndef _PPCMAC
+# define pascal _pascal
+# endif
+# define PASCAL pascal
+# define cdecl _cdecl
+# define CDECL cdecl
+# else
+# include <types.h>
+# include <packages.h>
+# include <resources.h>
+# include <menus.h>
+# include <windows.h>
+# include <appleevents.h>
+# include <osutils.h>
+# include <AppleEvents.h>
+# endif
+#else
+# include <windows.h>
+#endif
+#include <ole2.h>
+
+// this redefines the Ole DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+// due to the previous header, including this causes our DEFINE_GUID
+// definitions in the following headers to actually allocate data.
+
+// instantiate the dispatch related guids
+#include "dispatch.h"
+
diff --git a/private/oleauto/src/dispatch/dispmrsh.cpp b/private/oleauto/src/dispatch/dispmrsh.cpp
new file mode 100644
index 000000000..6c8786593
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispmrsh.cpp
@@ -0,0 +1,1894 @@
+/***
+*dispmrsh.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Low level IDispatch marshaling support.
+*
+*Revision History:
+*
+* [00] 08-Nov-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+* There are assumptions in this marshaling code that the endianness
+* of the caller and callee are the same.
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+
+ASSERTDATA
+
+#define SAFEARRAYOVERFLOW 0xffffffff
+
+#if OE_WIN32
+# define BSTRBYTELEN(x) (SysStringByteLen(x))
+#else
+# define BSTRBYTELEN(x) (SysStringLen(x))
+#endif
+
+PRIVATE_(HRESULT)
+SafeArrayReadExisting(
+ IStream FAR*,
+ unsigned char,
+ SAFEARRAY FAR* FAR*,
+ SYSKIND);
+
+
+//---------------------------------------------------------------------
+// VARIANT Marshaling Support
+//---------------------------------------------------------------------
+
+// NOTE: the following table is order dependent on VARENUM
+
+// 0 indicates N/A
+
+unsigned char g_cbVtSizes[] = {
+ 0 // VT_EMPTY
+ , 0 // VT_NULL,
+ , 2 // VT_I2,
+ , 4 // VT_I4,
+ , 4 // VT_R4,
+ , 8 // VT_R8,
+ , 8 // VT_CY,
+ , 8 // VT_DATE,
+ , 0 // VT_BSTR,
+ , 0 // VT_DISPATCH,
+ , 4 // VT_ERROR,
+ , 2 // VT_BOOL,
+ , 0 // VT_VARIANT,
+ , 0 // VT_UNKNOWN,
+ , 0 // unused
+ , 0 // unused
+ , 1 // VT_I1
+ , 1 // VT_UI1
+};
+
+
+/***
+*PRIVATE HRESULT BstrWrite(IStream*, BSTR)
+*Purpose:
+* Write the given BSTR to the given stream
+*
+*Entry:
+* pstm = pointer to the IStream to write the BSTR into
+* bstr = the BSTR to write
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT BstrWrite(IStream FAR* pstm, BSTR bstr, SYSKIND syskind)
+{
+ unsigned int cbSize;
+ unsigned char fIsNull;
+ unsigned long _cbSize;
+
+ cbSize = BSTRBYTELEN(bstr);
+ _cbSize = (unsigned long) cbSize;
+
+ // A Bstr of length 0 may be either a Null, or an empty string ("").
+ // we want to remember which of these it was, so we can reconstitute
+ // it in exactly the same way.
+ if(cbSize == 0){
+ IfFailRet(PUT(pstm, _cbSize));
+ fIsNull = (bstr == NULL) ? TRUE : FALSE;
+ return PUT(pstm, fIsNull);
+ }
+
+#if OE_WIN32 /* enable 16/32 interoperablity support */
+ if (syskind == SYS_WIN16) {
+ char *pBuf;
+ HRESULT hresult;
+
+ cbSize = SysStringLen(bstr);
+ _cbSize = (unsigned long) cbSize;
+ IfFailRet(PUT(pstm, _cbSize));
+
+ // convert UNICODE string to ANSI and stream it
+ if ((pBuf = new FAR char [cbSize]) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ WideCharToMultiByte(CP_ACP, NULL, (WCHAR *) bstr, cbSize,
+ pBuf, cbSize, NULL, NULL);
+ hresult = pstm->Write(pBuf, cbSize, NULL);
+ delete pBuf;
+ return hresult;
+ } else
+#endif
+ {
+ IfFailRet(PUT(pstm, _cbSize));
+ return pstm->Write(bstr, cbSize, NULL);
+ }
+}
+
+/***
+*PRIVATE HRESULT BstrRead(IStream*, BSTR*, SYSKIND)
+*Purpose:
+* Read a BSTR from the given stream.
+*
+*Entry:
+* pstm = the IStream to read the BSTR from.
+*
+*Exit:
+* *pbstr = the reconstituted BSTR
+*
+***********************************************************************/
+HRESULT BstrRead(IStream FAR* pstm, BSTR FAR* pbstr, SYSKIND syskind)
+{
+ BSTR bstr;
+ HRESULT hresult;
+ unsigned int cbSize;
+ unsigned char fIsNull;
+ unsigned long _cbSize;
+
+ IfFailRet(GET(pstm, _cbSize));
+ cbSize = (unsigned int) _cbSize;
+
+ if(cbSize == 0){
+
+ // reconstitute the zero length bstr as either a Null, or an empty
+ // string (""), depending on how it was originally written into
+ // the stream.
+
+ IfFailRet(GET(pstm, fIsNull));
+ if(fIsNull){
+ *pbstr = NULL;
+ return NOERROR;
+ }
+ return ErrSysAllocStringLen(NULL, 0, pbstr);
+ }
+
+ // Note: SysAllocStringLen allways allocates an extra byte (thats
+ // not counted in the bstr length) and puts a '\0' at the end of the
+ // allocated block (ie, block[cbSize] = '\0')
+
+#if OE_WIN32 /* enable 16/32 interoperablity support */
+ if (syskind == SYS_WIN16) {
+ char *pBuf;
+
+ // Get ANSI string from stream
+ if ((pBuf = new FAR char [cbSize]) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ IfFailGo(pstm->Read((void FAR*) pBuf, cbSize, NULL), LError0);
+
+ // convert it to UNICODE bstr
+ IfFailRet(ErrSysAllocStringLen(NULL, cbSize, &bstr));
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ pBuf, cbSize,
+ bstr, cbSize);
+ delete pBuf;
+ } else
+#endif
+ {
+ IfFailRet(ErrSysAllocStringLen(NULL, CHLEN(cbSize), &bstr));
+
+ IfFailGo(pstm->Read(bstr, cbSize, NULL), LError0);
+ }
+
+ *pbstr = bstr;
+
+ return NOERROR;
+
+LError0:
+ SysFreeString(bstr);
+
+ return hresult;
+}
+
+
+#if OE_WIN32 // 16/32 interop support
+/***
+*INTERNAL DispMarshalHresult
+*Purpose:
+* Map hresults that have changed between 16-bit and 32-bit to their 16-bit
+* values.
+*
+*Entry:
+* pstm = the stream to marshal into
+* hresult = the hresult to marshal
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+DispMarshalHresult(
+ IStream FAR* pstm,
+ HRESULT hresult)
+{
+ // map 32-bit values that have changed to the 16-bit values
+ switch (hresult) {
+ case E_NOTIMPL:
+ hresult = 0x80000001;
+ break;
+ case E_OUTOFMEMORY:
+ hresult = 0x80000002;
+ break;
+ case E_INVALIDARG:
+ hresult = 0x80000003;
+ break;
+ case E_NOINTERFACE:
+ hresult = 0x80000004;
+ break;
+ case E_POINTER:
+ hresult = 0x80000005;
+ break;
+ case E_HANDLE:
+ hresult = 0x80000006;
+ break;
+ case E_ABORT:
+ hresult = 0x80000007;
+ break;
+ case E_FAIL:
+ hresult = 0x80000008;
+ break;
+ case E_ACCESSDENIED:
+ hresult = 0x80000009;
+ break;
+ default:
+ break;
+ }
+ return CoMarshalHresult(pstm, hresult);
+}
+
+
+/***
+*INTERNAL HRESULT DispUnmarshalHresult
+*Purpose:
+* Unmarshal hresults that has changed between 16-bit and 32-bit to their
+* 32-bit values.
+*
+*Entry:
+* pstm = the stream to unmarshal from
+*
+*Exit:
+* return value = HRESULT
+*
+* *phresult = the unmarshaled hresult.
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+DispUnmarshalHresult(
+ IStream FAR* pstm,
+ HRESULT FAR* phresult)
+{
+ IfFailRet(CoUnmarshalHresult(pstm, phresult));
+
+ // map 16-bit values that have changed to the 32-bit values
+ switch ((DWORD)*phresult) {
+ case 0x80000001L:
+ *phresult = E_NOTIMPL;
+ break;
+ case 0x80000002L:
+ *phresult = E_OUTOFMEMORY;
+ break;
+ case 0x80000003L:
+ *phresult = E_INVALIDARG;
+ break;
+ case 0x80000004L:
+ *phresult = E_NOINTERFACE;
+ break;
+ case 0x80000005L:
+ *phresult = E_POINTER;
+ break;
+ case 0x80000006L:
+ *phresult = E_HANDLE;
+ break;
+ case 0x80000007L:
+ *phresult = E_ABORT;
+ break;
+ case 0x80000008L:
+ *phresult = E_FAIL;
+ break;
+ case 0x80000009L:
+ *phresult = E_ACCESSDENIED;
+ break;
+ default:
+ break;
+ }
+ return NOERROR;
+}
+#endif //OE_WIN32
+
+
+/***
+*PRIVATE HRESULT VariantWrite(IStream*, VARIANTARG*)
+*Purpose:
+* Write the given VARIANTARG to the given stream.
+*
+*Entry:
+* pvarg = the VARIANTARG to write
+* pstm = the stream to write it into
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+*
+**************************************************************************/
+HRESULT
+VariantWrite(IStream FAR* pstm, VARIANTARG FAR* pvarg, SYSKIND syskind)
+{
+ VARTYPE vt;
+ unsigned int cbSize;
+ void FAR* pv;
+
+#ifdef _DEBUG
+ if(pstm == NULL)
+ return RESULT(E_INVALIDARG);
+ if(IsBadReadPtr(pvarg, sizeof(*pvarg)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailRet(PUT(pstm, V_VT(pvarg)));
+
+ switch(V_VT(pvarg)){
+#if VBA2
+ case VT_UI1 | VT_BYREF:
+#endif //VBA2
+ case VT_I2 | VT_BYREF:
+ case VT_I4 | VT_BYREF:
+ case VT_R4 | VT_BYREF:
+ case VT_R8 | VT_BYREF:
+ case VT_CY | VT_BYREF:
+ case VT_BOOL | VT_BYREF:
+ case VT_DATE | VT_BYREF:
+#if !OE_WIN32
+ case VT_ERROR | VT_BYREF:
+#endif //OE_WIN32
+ pv = V_BYREF(pvarg);
+ goto LWriteVal;
+
+#if VBA2
+ case VT_UI1:
+#endif //VBA2
+ case VT_I2:
+ case VT_I4:
+ case VT_R4:
+ case VT_R8:
+ case VT_CY:
+ case VT_BOOL:
+ case VT_DATE:
+#if !OE_WIN32
+ case VT_ERROR:
+#endif //OE_WIN32
+ pv = &V_NONE(pvarg);
+
+LWriteVal:;
+ vt = V_VT(pvarg) & ~(VT_BYREF|VT_ARRAY);
+ ASSERT(vt < DIM(g_cbVtSizes));
+
+ cbSize = g_cbVtSizes[vt];
+ ASSERT(cbSize != 0);
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(pv, cbSize))
+ return RESULT(E_INVALIDARG);
+#endif
+ return pstm->Write(pv, cbSize, NULL);
+
+ case VT_BSTR:
+ return BstrWrite(pstm, V_BSTR(pvarg), syskind);
+
+ case VT_BSTR | VT_BYREF:
+ return BstrWrite(pstm, *V_BSTRREF(pvarg), syskind);
+
+#if OE_WIN32
+ case VT_ERROR:
+ return DispMarshalHresult(pstm, V_ERROR(pvarg));
+
+ case VT_ERROR | VT_BYREF:
+ return DispMarshalHresult(pstm, *V_ERRORREF(pvarg));
+#endif //OE_WIN32
+
+ case VT_UNKNOWN:
+ return DispMarshalInterface(pstm, IID_IUnknown, V_UNKNOWN(pvarg));
+
+ case VT_UNKNOWN | VT_BYREF:
+ return DispMarshalInterface(pstm, IID_IUnknown, *V_UNKNOWNREF(pvarg));
+
+ case VT_DISPATCH:
+ return DispMarshalInterface(pstm, IID_IDispatch, V_DISPATCH(pvarg));
+
+ case VT_DISPATCH | VT_BYREF:
+ return DispMarshalInterface(pstm, IID_IDispatch, *V_DISPATCHREF(pvarg));
+
+ case VT_VARIANT | VT_BYREF:
+ return VariantWrite(pstm, V_VARIANTREF(pvarg), syskind);
+
+ case VT_NULL:
+ case VT_EMPTY: // nothing to write for these guys.
+ return NOERROR;
+
+ // VT_INTERFACE is an internal type that is used for Marshaling
+ // custom interfaces. This should never be seen by the outside world.
+ //
+ case VT_INTERFACE:
+ { REFIID riid = *((VARIANTX FAR*)pvarg)->piid;
+ IfFailRet(pstm->Write((const void FAR*)&riid, sizeof(IID), NULL));
+ return DispMarshalInterface(pstm, riid, V_UNKNOWN(pvarg));
+ }
+
+ case VT_INTERFACE | VT_BYREF:
+ { REFIID riid = *((VARIANTX FAR*)pvarg)->piid;
+ IfFailRet(pstm->Write((const void FAR*)&riid, sizeof(IID), NULL));
+ return DispMarshalInterface(pstm, riid, *V_UNKNOWNREF(pvarg));
+ }
+
+ default:
+ if(V_VT(pvarg) & VT_ARRAY){
+ // Dont currently support arrays of custom interfaces
+ ASSERT((V_VT(pvarg) & ~(VT_BYREF|VT_ARRAY)) != VT_INTERFACE);
+ return SafeArrayWrite(pstm,
+ V_ISBYREF(pvarg)
+ ? *V_ARRAYREF(pvarg)
+ : V_ARRAY(pvarg),
+ syskind);
+ }
+ return RESULT(E_INVALIDARG);
+ }
+
+ ASSERT(UNREACHED);
+ return RESULT(E_FAIL);
+}
+
+
+/***
+*PRIVATE HRESULT VariantRead(IStream*, VARIANTARG*, VARIANT*)
+*Purpose:
+* Read a VARIANTARG from the given stream.
+*
+*Entry:
+* pstm = pointer to the IStream interface we are to read from
+* pvarg = the VARIANTARG to read into
+* pv = pointer to memory to use for ByRef values. If pv is NULL, then
+* the caller is not expecting a ByRef value, and we return an error.
+*
+*Exit:
+* return value = HRESULT
+* [UNDONE: enumerate results]
+*
+* *pvarg = the unmarshalled VARIANTARG.
+*
+**************************************************************************/
+HRESULT
+VariantRead(IStream FAR* pstm,
+ VARIANTARG FAR* pvarg,
+ VARIANT FAR* pvarRef,
+ SYSKIND syskind)
+{
+ VARTYPE vt;
+ unsigned int cbSize;
+ void FAR* pv;
+
+#ifdef _DEBUG
+ if(pstm == NULL)
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pvarg, sizeof(*pvarg)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailRet(GET(pstm, V_VT(pvarg)));
+
+ if(V_ISBYREF(pvarg)){
+ if(pvarRef == NULL)
+ return RESULT(E_INVALIDARG);
+#ifdef _DEBUG
+ if(IsBadWritePtr(pvarRef, sizeof(*pvarRef)))
+ return RESULT(E_INVALIDARG);
+#endif
+ V_BYREF(pvarg) = &V_NONE(pvarRef);
+ V_VT(pvarRef) = (V_VT(pvarg) & ~VT_BYREF);
+ }
+
+ switch(V_VT(pvarg)){
+#if VBA2
+ case VT_BYREF | VT_UI1:
+#endif //VBA2
+ case VT_BYREF | VT_I2:
+ case VT_BYREF | VT_I4:
+ case VT_BYREF | VT_R4:
+ case VT_BYREF | VT_R8:
+ case VT_BYREF | VT_CY:
+ case VT_BYREF | VT_BOOL:
+ case VT_BYREF | VT_DATE:
+#if !OE_WIN32
+ case VT_ERROR | VT_BYREF:
+#endif //!OE_WIN32
+ pv = (void FAR*)V_BYREF(pvarg);
+ goto LReadVal;
+
+#if VBA2
+ case VT_UI1:
+#endif //VBA2
+ case VT_I2:
+ case VT_I4:
+ case VT_R4:
+ case VT_R8:
+ case VT_CY:
+ case VT_BOOL:
+ case VT_DATE:
+#if !OE_WIN32
+ case VT_ERROR:
+#endif //!OE_WIN32
+ pv = (void FAR*)&V_NONE(pvarg);
+
+LReadVal:;
+ vt = V_VT(pvarg) & ~(VT_BYREF|VT_ARRAY);
+ ASSERT(vt < DIM(g_cbVtSizes));
+
+ cbSize = g_cbVtSizes[vt];
+ ASSERT(cbSize != 0);
+
+ return pstm->Read(pv, cbSize, NULL);
+
+ case VT_BSTR:
+ return BstrRead(pstm, &V_BSTR(pvarg), syskind);
+
+ case VT_BSTR | VT_BYREF:
+ return BstrRead(pstm, V_BSTRREF(pvarg), syskind);
+
+#if OE_WIN32
+ case VT_ERROR:
+ return DispUnmarshalHresult(pstm, &V_ERROR(pvarg));
+
+ case VT_ERROR | VT_BYREF:
+ return DispUnmarshalHresult(pstm, V_ERRORREF(pvarg));
+#endif //OE_WIN32
+
+ case VT_UNKNOWN:
+ return DispUnmarshalInterface(
+ pstm, IID_IUnknown, (void FAR* FAR*)&V_UNKNOWN(pvarg));
+
+ case VT_BYREF | VT_UNKNOWN:
+ return DispUnmarshalInterface(
+ pstm, IID_IUnknown, (void FAR* FAR*)V_UNKNOWNREF(pvarg));
+
+ case VT_DISPATCH:
+ return DispUnmarshalInterface(
+ pstm, IID_IDispatch, (void FAR* FAR*)&V_DISPATCH(pvarg));
+
+ case VT_BYREF | VT_DISPATCH:
+ return DispUnmarshalInterface(
+ pstm, IID_IDispatch, (void FAR* FAR*)V_DISPATCHREF(pvarg));
+
+ case VT_VARIANT | VT_BYREF:
+ V_VARIANTREF(pvarg) = pvarRef;
+ return VariantRead(pstm, pvarRef, NULL, syskind);
+
+ // VT_INTERFACE is an internal type that is used for Marshaling
+ // custom interfaces. This should never be seen by the outside world.
+ //
+ case VT_INTERFACE:
+ pv = &V_UNKNOWN(pvarg);
+ goto VtInterface;
+ case VT_INTERFACE | VT_BYREF:
+ pv = V_UNKNOWN(pvarg);
+ // FALLTHROUGH
+VtInterface:;
+ { VARIANTX FAR* pvarx = (VARIANTX FAR*)pvarg;
+ REFIID riid = *(pvarx->piid);
+ if((pvarx->piid = new IID) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ IfFailRet(pstm->Read(pvarx->piid, sizeof(IID), NULL));
+ return DispUnmarshalInterface(pstm, riid, (void FAR* FAR*)pv);
+ }
+
+ case VT_NULL:
+ V_I4(pvarg) = 0L;
+ case VT_EMPTY:
+ return NOERROR;
+
+ default:
+ if(V_VT(pvarg) & VT_ARRAY){
+ return SafeArrayRead(
+ pstm,
+ (V_ISBYREF(pvarg)) ? V_ARRAYREF(pvarg) : &V_ARRAY(pvarg),
+ syskind);
+ }
+ return RESULT(E_INVALIDARG);
+ }
+
+ ASSERT(UNREACHED);
+ return RESULT(E_FAIL);
+}
+
+
+/***
+*HRESULT VariantReadType(IStream*, VARIANTARG*)
+*Purpose:
+* Read a VARIANTARG of the type indicated by the given 'pvarg',
+* *and* read it into the given 'pvarg'. This will require releasing
+* the current contents of 'pvarg'.
+*
+*Entry:
+* pstm = pointer to the IStream interface we are to read from
+* pvarg = pointer to a valid VARIANTARG whose contents we are to
+* release and overwrite with date of the same type.
+*
+*Exit:
+* return value = HRESULT
+*
+* *pvarg = the reconstituted VARIANTARG
+*
+**************************************************************************/
+HRESULT
+VariantReadType(IStream FAR* pstm, VARIANTARG FAR* pvarg, SYSKIND syskind)
+{
+ VARTYPE vt;
+ GUID guid;
+ void FAR* pv;
+ unsigned int cbSize;
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+#ifdef _DEBUG
+ if(pstm == NULL)
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pvarg, sizeof(*pvarg)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailRet(GET(pstm, vt));
+
+ if(vt != V_VT(pvarg))
+ return RESULT(E_INVALIDARG); // REVIEW: is this the proper error for this?
+
+ switch(vt){
+#if VBA2
+ case VT_UI1 | VT_BYREF:
+#endif //VBA2
+ case VT_I2 | VT_BYREF:
+ case VT_I4 | VT_BYREF:
+ case VT_R4 | VT_BYREF:
+ case VT_R8 | VT_BYREF:
+ case VT_CY | VT_BYREF:
+ case VT_BOOL | VT_BYREF:
+ case VT_DATE | VT_BYREF:
+#if !OE_WIN32
+ case VT_ERROR | VT_BYREF:
+#endif //!OE_WIN32
+ pv = V_BYREF(pvarg);
+ goto LReadVal;
+
+#if VBA2
+ case VT_UI1:
+#endif //VBA2
+ case VT_I2:
+ case VT_I4:
+ case VT_R4:
+ case VT_R8:
+ case VT_CY:
+ case VT_BOOL:
+ case VT_DATE:
+#if !OE_WIN32
+ case VT_ERROR:
+#endif //!OE_WIN32
+ pv = &V_NONE(pvarg);
+LReadVal:;
+ vt &= ~(VT_BYREF|VT_ARRAY);
+ ASSERT(vt < DIM(g_cbVtSizes));
+ cbSize = g_cbVtSizes[vt];
+ ASSERT(cbSize != 0);
+ return pstm->Read(pv, cbSize, NULL);
+
+ case VT_BSTR:
+ SysFreeString(V_BSTR(pvarg));
+ return BstrRead(pstm, &V_BSTR(pvarg), syskind);
+
+ case VT_BSTR | VT_BYREF:
+ SysFreeString(*V_BSTRREF(pvarg));
+ return BstrRead(pstm, V_BSTRREF(pvarg), syskind);
+
+#if OE_WIN32
+ case VT_ERROR:
+ return DispUnmarshalHresult(pstm, &V_ERROR(pvarg));
+
+ case VT_ERROR | VT_BYREF:
+ return DispUnmarshalHresult(pstm, V_ERRORREF(pvarg));
+#endif //OE_WIN32
+
+ case VT_UNKNOWN:
+ IfFailRet(DispUnmarshalInterface(
+ pstm, IID_IUnknown, (void FAR* FAR*)&punk));
+ if(V_UNKNOWN(pvarg) != NULL)
+ V_UNKNOWN(pvarg)->Release();
+ V_UNKNOWN(pvarg) = punk;
+ return NOERROR;
+
+ case VT_BYREF | VT_UNKNOWN:
+ IfFailRet(DispUnmarshalInterface(
+ pstm, IID_IUnknown, (void FAR* FAR*)&punk));
+ if((*V_UNKNOWNREF(pvarg)) != NULL)
+ (*V_UNKNOWNREF(pvarg))->Release();
+ *V_UNKNOWNREF(pvarg) = punk;
+ return NOERROR;
+
+ case VT_DISPATCH:
+ IfFailRet(DispUnmarshalInterface(
+ pstm, IID_IDispatch, (void FAR* FAR*)&pdisp));
+ if(V_DISPATCH(pvarg) != NULL)
+ V_DISPATCH(pvarg)->Release();
+ V_DISPATCH(pvarg) = pdisp;
+ return NOERROR;
+
+ case VT_BYREF | VT_DISPATCH:
+ IfFailRet(DispUnmarshalInterface(
+ pstm, IID_IDispatch, (void FAR* FAR*)&pdisp));
+ if((*V_DISPATCHREF(pvarg)) != NULL)
+ (*V_DISPATCHREF(pvarg))->Release();
+ *V_DISPATCHREF(pvarg) = pdisp;
+ return NOERROR;
+
+ // VT_INTERFACE is an internal type that is used for Marshaling
+ // custom interfaces. This should never be seen by the outside world.
+ //
+ case VT_INTERFACE:
+ case VT_INTERFACE | VT_BYREF:
+ { VARIANTX FAR* pvarx = (VARIANTX FAR*)pvarg;
+ IfFailRet(GET(pstm, guid));
+ IfFailRet(DispUnmarshalInterface(pstm, guid, (void FAR* FAR*)&punk));
+ ASSERT(pvarx->piid != NULL && *pvarx->piid == guid);
+ if(vt & VT_BYREF){
+ if(*(pvarx->ppunk) != NULL)
+ (*(pvarx->ppunk))->Release();
+ *(pvarx->ppunk) = punk;
+ }else{
+ if(pvarx->punk != NULL)
+ pvarx->punk->Release();
+ pvarx->punk = punk;
+ }
+ }
+ return NOERROR;
+
+ case VT_VARIANT | VT_BYREF:
+
+ VARIANT var;
+ HRESULT hr;
+
+ MEMCPY(&var, V_VARIANTREF(pvarg), sizeof(VARIANT));
+ if ((hr = VariantRead(pstm, V_VARIANTREF(pvarg), NULL, syskind)) == NOERROR)
+ VariantClear(&var);
+ else
+ MEMCPY(V_VARIANTREF(pvarg), &var, sizeof(VARIANT));
+ return hr;
+
+ case VT_NULL:
+ V_I4(pvarg) = 0L;
+ case VT_EMPTY:
+ return NOERROR;
+
+ default:
+ if(vt & VT_ARRAY){
+ if(V_ISBYREF(pvarg)){
+ return SafeArrayReadExisting(pstm, TRUE, V_ARRAYREF(pvarg), syskind);
+ }else{
+ return SafeArrayReadExisting(pstm, FALSE, &V_ARRAY(pvarg), syskind);
+ }
+ }
+
+ return RESULT(E_INVALIDARG);
+ }
+
+ ASSERT(UNREACHED);
+ return RESULT(E_FAIL);
+}
+
+
+//---------------------------------------------------------------------
+// EXCEPINFO Marshaling Support
+//---------------------------------------------------------------------
+
+
+/***
+*HRESULT ExcepinfoRead(IStream*, EXCEPINFO*)
+*Purpose:
+* Read an EXCEPINFO from the given stream.
+*
+* Out: <EXCEPINFO>
+* <BSTR bstrSource>
+* <BSTR bstrDescription>
+* <BSTR bstrHelpFile>
+*
+* Note: this routines sets pfnDeferredFillIn to NULL because it
+* must have already been called when the EXCEPINFO was serialized.
+*
+*Entry:
+* pstm = the IStream to read from
+*
+*Exit:
+* return value = HRESULT
+*
+* *pexcepinfo = the EXCEPINFO read from the stream
+*
+***********************************************************************/
+HRESULT
+ExcepinfoRead(IStream FAR* pstm, EXCEPINFO FAR* pexcepinfo, SYSKIND syskind)
+{
+#ifdef _DEBUG
+ if(IsBadWritePtr(pexcepinfo, sizeof(*pexcepinfo)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailRet(pstm->Read(pexcepinfo, sizeof(*pexcepinfo), NULL));
+
+ IfFailRet(BstrRead(pstm, &(pexcepinfo->bstrSource), syskind));
+
+ IfFailRet(BstrRead(pstm, &(pexcepinfo->bstrDescription), syskind));
+
+ IfFailRet(BstrRead(pstm, &(pexcepinfo->bstrHelpFile), syskind));
+
+ pexcepinfo->pfnDeferredFillIn = NULL;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT ExcepinfoWrite(IStream*, EXCEPINFO*)
+*Purpose:
+* Write the given EXCEPINFO into the given stream.
+*
+* Note: must invoke the pfnDeferredFillIn function (if there is one)
+* because there is no way to serialize the function.
+*
+*Entry:
+* pstm = the IStream to write into
+* pexcepinfo = the EXCEPINFO to write
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+ExcepinfoWrite(IStream FAR* pstm, EXCEPINFO FAR* pexcepinfo, SYSKIND syskind)
+{
+#ifdef _DEBUG
+ if(IsBadReadPtr(pexcepinfo, sizeof(*pexcepinfo)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if(pexcepinfo->pfnDeferredFillIn != NULL)
+ IfFailRet(pexcepinfo->pfnDeferredFillIn(pexcepinfo));
+
+ IfFailRet(pstm->Write(pexcepinfo, sizeof(*pexcepinfo), NULL));
+
+ IfFailRet(BstrWrite(pstm, pexcepinfo->bstrSource, syskind));
+
+ IfFailRet(BstrWrite(pstm, pexcepinfo->bstrDescription, syskind));
+
+ IfFailRet(BstrWrite(pstm, pexcepinfo->bstrHelpFile, syskind));
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// Rich Error marshaling support
+//---------------------------------------------------------------------
+
+#if VBA2
+/***
+*PRIVATE HRESULT MarshalErrorInfo
+*Purpose:
+* Marshal the current Rich Error state into the given stream.
+*
+*Entry:
+* pstm = the stream to marshal into
+*
+* Format:
+* long fHasInfo
+* if(fHasInfo){
+* DWORD dwHelpContext
+* GUID guid
+* BSTR bstrSource
+* BSTR bstrDescription
+* BSTR bstrHelpFile
+* }
+*
+*Exit:
+* return value = HRESULT
+*
+*NOTE:
+* This routine has the side effect of removing the current threads
+* rich error state. In effect, it has moved from its physical thread
+* storage, into the given stream.
+*
+***********************************************************************/
+HRESULT
+MarshalErrorInfo(IStream FAR* pstm, SYSKIND syskind)
+{
+ GUID guid;
+ long fHasInfo;
+ HRESULT hresult;
+ DWORD dwHelpContext;
+ IErrorInfo FAR* perrinfo;
+ BSTR bstrSource, bstrDescription, bstrHelpFile;
+
+ perrinfo = NULL;
+
+ guid = GUID_NULL;
+ bstrSource = NULL;
+ bstrDescription = NULL;
+ bstrHelpFile = NULL;
+ dwHelpContext = 0L;
+
+ if(GetErrorInfo(0L, &perrinfo) != NOERROR){
+ fHasInfo = FALSE;
+ IfFailGo(PUT(pstm, fHasInfo), Error);
+ }else{
+ perrinfo->GetGUID(&guid);
+ perrinfo->GetSource(&bstrSource);
+ perrinfo->GetDescription(&bstrDescription);
+ perrinfo->GetHelpFile(&bstrHelpFile);
+ perrinfo->GetHelpContext(&dwHelpContext);
+
+ fHasInfo = TRUE;
+ IfFailGo(PUT(pstm, fHasInfo), Error);
+ IfFailGo(PUT(pstm, dwHelpContext), Error);
+ IfFailGo(PUT(pstm, guid), Error);
+ IfFailGo(BstrWrite(pstm, bstrSource, syskind), Error);
+ IfFailGo(BstrWrite(pstm, bstrDescription, syskind), Error);
+ IfFailGo(BstrWrite(pstm, bstrHelpFile, syskind), Error);
+ }
+
+ hresult = NOERROR;
+
+Error:;
+ SysFreeString(bstrSource);
+ SysFreeString(bstrDescription);
+ SysFreeString(bstrHelpFile);
+ if(perrinfo != NULL)
+ perrinfo->Release();
+ return hresult;
+}
+
+HRESULT
+UnmarshalErrorInfo(IStream FAR* pstm, SYSKIND syskind)
+{
+ GUID guid;
+ long fHasInfo;
+ HRESULT hresult;
+ DWORD dwHelpContext;
+ IErrorInfo FAR* perrinfo;
+ ICreateErrorInfo FAR* pcerrinfo;
+ BSTR bstrSource, bstrDescription, bstrHelpFile;
+
+ perrinfo = NULL;
+ pcerrinfo = NULL;
+
+ guid = GUID_NULL;
+ bstrSource = NULL;
+ bstrDescription = NULL;
+ bstrHelpFile = NULL;
+ dwHelpContext = 0L;
+
+ IfFailGo(GET(pstm, fHasInfo), Error);
+
+ if(!fHasInfo){
+ SetErrorInfo(0L, NULL);
+ return NOERROR;
+ }
+
+ IfFailGo(GET(pstm, dwHelpContext), Error);
+ IfFailGo(GET(pstm, guid), Error);
+ IfFailGo(BstrRead(pstm, &bstrSource, syskind), Error);
+ IfFailGo(BstrRead(pstm, &bstrDescription, syskind), Error);
+ IfFailGo(BstrRead(pstm, &bstrHelpFile, syskind), Error);
+
+ if(CreateErrorInfo(&pcerrinfo) == NOERROR){
+ pcerrinfo->SetGUID(guid);
+ pcerrinfo->SetSource(bstrSource);
+ pcerrinfo->SetDescription(bstrDescription);
+ pcerrinfo->SetHelpFile(bstrHelpFile);
+ pcerrinfo->SetHelpContext(dwHelpContext);
+ if(pcerrinfo->QueryInterface(IID_IErrorInfo, (void FAR* FAR*)&perrinfo) == NOERROR)
+ SetErrorInfo(0L, perrinfo);
+ }
+
+ hresult = NOERROR;
+
+Error:
+ SysFreeString(bstrSource);
+ SysFreeString(bstrDescription);
+ SysFreeString(bstrHelpFile);
+ if(pcerrinfo != NULL)
+ pcerrinfo->Release();
+ if(perrinfo != NULL)
+ perrinfo->Release();
+ return hresult;
+}
+#endif //VBA2
+
+//---------------------------------------------------------------------
+// SafeArray Marshaling Support
+//---------------------------------------------------------------------
+
+/***
+*PRIVATE HRESULT SafeArrayWrite(IStream*, SAFEARRAY)
+*Purpose:
+* Write the given SafeArray into the given stream.
+*
+* Out:
+* unsigned char fIsNull - was the SAFEARRAY ptr Null?
+* unsigned short cDims
+* unsigned short fFeatures
+* unsigned short cbElements
+* SAFEARRAYBOUND rgsabound
+* BYTEs pvData
+*
+*Entry:
+* pstm = the stream to write the SafeArray into
+* psa = pointer to the SafeArray
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+LOCAL HRESULT
+SafeArrayWrite(IStream FAR* pstm, SAFEARRAY FAR* psa, SYSKIND syskind)
+{
+ unsigned char fIsNull;
+ unsigned long i, size, cElements;
+ unsigned long _cbElements;
+
+ if(psa == NULL){
+ fIsNull = TRUE;
+ IfFailRet(PUT(pstm, fIsNull));
+ return NOERROR;
+ }
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(psa, sizeof(*psa)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ fIsNull = FALSE;
+ IfFailRet(PUT(pstm, fIsNull));
+ IfFailRet(PUT(pstm, psa->cDims));
+ //[bb] C9.00 parser bug: (psa->fFeatures & ~FADF_FEATURES) gets the "&"
+ //[bb] operator wrong and tries to take the address of FADF_FEATURES!
+ //[bb] Copy psa->fFeatures into a local and use "&=" to get things to work.
+ unsigned short usFeatures = psa->fFeatures;
+ usFeatures &= ~FADF_FORCEFREE;
+ IfFailRet(PUT(pstm, usFeatures));
+ _cbElements = (unsigned long) psa->cbElements;
+ IfFailRet(PUT(pstm, _cbElements));
+ IfFailRet(
+ pstm->Write(psa->rgsabound, psa->cDims * sizeof(SAFEARRAYBOUND), NULL));
+
+ size = SafeArraySize(psa);
+ ASSERT(size != SAFEARRAYOVERFLOW); // existing array, no overflow possible
+ cElements = size / psa->cbElements;
+
+ SafeArrayLock(psa);
+
+ if(psa->fFeatures & FADF_BSTR){
+
+ BSTR HUGEP *pbstr = (BSTR HUGEP*)psa->pvData;
+ for(i = 0; i < cElements; ++i, ++pbstr)
+ IfFailRet(BstrWrite(pstm, *pbstr, syskind));
+
+ }else if(psa->fFeatures & FADF_VARIANT){
+
+ VARIANT HUGEP* pvar = (VARIANT HUGEP*)psa->pvData;
+ for(i = 0; i < cElements; ++i, ++pvar)
+ IfFailRet(VariantWrite(pstm, pvar, syskind));
+
+ }else if(psa->fFeatures & FADF_UNKNOWN){
+
+ IUnknown FAR* HUGEP* ppunk = (IUnknown FAR* HUGEP*)psa->pvData;
+ for(i = 0; i < cElements; ++i, ++ppunk){
+ IfFailRet(DispMarshalInterface(pstm, IID_IUnknown, *ppunk));
+ }
+
+ }else if(psa->fFeatures & FADF_DISPATCH){
+
+ IDispatch FAR* HUGEP* ppdisp = (IDispatch FAR* HUGEP*)psa->pvData;
+ for(i = 0; i < cElements; ++i, ++ppdisp){
+ IfFailRet(DispMarshalInterface(pstm, IID_IDispatch, *ppdisp));
+ }
+
+ }else{
+
+ IfFailRet(pstm->Write(psa->pvData, size, NULL));
+
+ }
+
+ SafeArrayUnlock(psa);
+
+ return NOERROR;
+}
+
+
+/***
+*PRIVATE HRESULT SafeArrayReadData(IStream*, SAFEARRAY*, SYSKIND)
+*Purpose:
+* Read the data for the given SafeArray from the given stream into
+* the given safe array. This routine releases any existing array
+* contents as it goes.
+*
+*Entry:
+* pstm = the IStream to read from
+* psa = the SafeArray to read the data into
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+LOCAL HRESULT
+SafeArrayReadData(IStream FAR* pstm, SAFEARRAY FAR* psa, SYSKIND syskind)
+{
+ HRESULT hresult;
+ unsigned long i, size, cElements;
+
+
+ size = SafeArraySize(psa);
+ ASSERT(size != SAFEARRAYOVERFLOW); // existing array, no overflow possible
+ cElements = size / psa->cbElements;
+
+ SafeArrayLock(psa);
+
+ if(psa->fFeatures & FADF_BSTR){
+
+ BSTR HUGEP *pbstr = (BSTR HUGEP*)psa->pvData;
+ for(i = 0; i < cElements; ++i, ++pbstr){
+ if(*pbstr != NULL)
+ SysFreeString(*pbstr);
+ IfFailGo(BstrRead(pstm, pbstr, syskind), LError0);
+ }
+
+ }else if(psa->fFeatures & FADF_VARIANT){
+
+ VARIANT HUGEP* pvar = (VARIANT HUGEP*)psa->pvData;
+ for(i = 0; i < cElements; ++i, ++pvar){
+ IfFailGo(VariantClear(pvar), LError0);
+ IfFailGo(VariantRead(pstm, pvar, NULL, syskind), LError0);
+ }
+
+ }else if(psa->fFeatures & FADF_UNKNOWN){
+
+ IUnknown FAR* HUGEP* ppunk = (IUnknown FAR* HUGEP*)psa->pvData;
+ for(i = 0; i < cElements; ++i, ++ppunk){
+ if(*ppunk != NULL)
+ (*ppunk)->Release();
+ IfFailGo(
+ DispUnmarshalInterface(pstm,
+ IID_IUnknown, (void FAR* FAR*)ppunk),
+ LError0);
+ }
+
+ }else if(psa->fFeatures & FADF_DISPATCH){
+
+ IDispatch FAR* HUGEP* ppdisp = (IDispatch FAR* HUGEP*)psa->pvData;
+ for(i = 0; i < cElements; ++i, ++ppdisp){
+ if(*ppdisp != NULL)
+ (*ppdisp)->Release();
+ IfFailGo(
+ DispUnmarshalInterface(pstm,
+ IID_IDispatch, (void FAR* FAR*)ppdisp),
+ LError0);
+ }
+
+ }else{
+
+ IfFailGo(pstm->Read(psa->pvData, size, NULL), LError0);
+
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+ SafeArrayUnlock(psa);
+ return hresult;
+}
+
+
+/***
+*PRIVATE HRESULT SafeArrayRead(IStream*, SAFEARRAY**, SYSKIND)
+*Purpose:
+* Read a SafeArray from the given stream
+*
+* In:
+* unsigned short cDims
+* unsigned short fFeatures
+* unsigned short cbElements
+* SAFEARRAYBOUND rgbound
+* BYTEs pvData
+*
+*Entry:
+* pstm = stream to read the SafeArray from
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_OUTOFMEMORY
+*
+* *ppsa = pointer to the reconstituted SafeArray.
+*
+***********************************************************************/
+LOCAL HRESULT
+SafeArrayRead(IStream FAR* pstm, SAFEARRAY FAR* FAR* ppsa, SYSKIND syskind)
+{
+ HRESULT hresult;
+ SAFEARRAY FAR* psa;
+ unsigned short cDims;
+ unsigned char fIsNull;
+ unsigned long _cbElements;
+
+#ifdef _DEBUG
+ if(pstm == NULL)
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(ppsa, sizeof(*ppsa)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailGo(GET(pstm, fIsNull), LError0);
+
+ if(fIsNull){
+ *ppsa = NULL;
+ return NOERROR;
+ }
+
+ IfFailGo(GET(pstm, cDims), LError0);
+
+ // allocate the safe array descriptor
+ IfFailRet(SafeArrayAllocDescriptor(cDims, &psa));
+
+ psa->cDims = cDims;
+ IfFailGo(GET(pstm, psa->fFeatures), LError1);
+ // Even if the array's features indicate that it was not dynamically
+ // allocated, the proxy-side really did dynamically allocate the array,
+ // so set FADF_FORCEFREE to force SafeArrayFree() to ignore FADF_STATIC,
+ // etc. and really free the array. We can't simply clear the FADF_STATIC
+ // because the fFeatures gets marshalled upon function exit to be passed
+ // back the the stub.
+ ASSERT((psa->fFeatures & FADF_FORCEFREE) == 0);
+ if (psa->fFeatures & (FADF_AUTO|FADF_STATIC|FADF_EMBEDDED))
+ psa->fFeatures |= FADF_FORCEFREE;
+ IfFailGo(GET(pstm, _cbElements), LError1);
+ psa->cbElements = (unsigned int)_cbElements;
+ IfFailGo(
+ pstm->Read(psa->rgsabound, cDims * sizeof(SAFEARRAYBOUND), NULL),
+ LError1);
+
+ // allocate memory for the array data.
+ IfFailGo(SafeArrayAllocData(psa), LError1);
+
+ IfFailGo(SafeArrayReadData(pstm, psa, syskind), LError1);
+
+ *ppsa = psa;
+
+ return NOERROR;
+
+LError1:;
+ SafeArrayDestroy(psa);
+
+LError0:;
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT SafeArrayReadExisting(IStream*, SAFEARRAY**, SYSKIND)
+*Purpose:
+* Read a SafeArray from the given stream into an *existing* array.
+*
+* In:
+* unsigned char fIsNull
+* unsigned short cDims
+* unsigned short fFeatures
+* unsigned short cbElements
+* SAFEARRAYBOUND rgbound
+* BYTEs pvData
+*
+*Entry:
+* pstm = stream to read the SafeArray from
+* psa = SafeArray to unmarshal the array into.
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_OUTOFMEMORY
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+SafeArrayReadExisting(
+ IStream FAR* pstm,
+ unsigned char fByRef,
+ SAFEARRAY FAR* FAR* ppsa,
+ SYSKIND syskind)
+{
+ HRESULT hresult;
+ unsigned char fIsNull;
+ unsigned char fReAlloc;
+ unsigned short cDims;
+ unsigned long cbBounds;
+ SAFEARRAY FAR* psaNew, FAR* psa;
+ unsigned long _cbElements;
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(ppsa, sizeof(*ppsa)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ psa = *ppsa;
+
+#ifdef _DEBUG
+ if(psa != NULL && IsBadWritePtr(psa, sizeof(*psa)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ psaNew = NULL;
+ fReAlloc = FALSE;
+
+ // handle case of callee returning a null array
+ IfFailGo(GET(pstm, fIsNull), LError0);
+ if(fIsNull){
+ if(psa == NULL)
+ return NOERROR;
+ if(fByRef){
+ IfFailGo(SafeArrayDestroy(psa), LError0);
+ *ppsa = NULL;
+ return NOERROR;
+ }
+ // callee tried to Erase an array that was not ByRef
+ return RESULT(DISP_E_BADCALLEE);
+ }
+
+ IfFailGo(GET(pstm, cDims), LError0);
+
+ // the callee isnt allowed to change the number of dimensions
+ // (unless the array wasn't allocated, ie psa==NULL).
+ if(psa != NULL && cDims != psa->cDims){
+ hresult = RESULT(DISP_E_BADCALLEE);
+ goto LError0;
+ }
+
+ IfFailGo(SafeArrayAllocDescriptor(cDims, &psaNew), LError0);
+
+ IfFailGo(GET(pstm, psaNew->fFeatures), LError0);
+ ASSERT((psaNew->fFeatures & FADF_FORCEFREE) == 0);
+ IfFailGo(GET(pstm, _cbElements), LError0);
+ psaNew->cbElements = (unsigned int)_cbElements;
+
+ cbBounds = psaNew->cDims * sizeof(SAFEARRAYBOUND);
+ IfFailGo(pstm->Read(psaNew->rgsabound, cbBounds, NULL), LError0);
+
+ if(psa == NULL){
+
+ fReAlloc = TRUE;
+
+ // If the callee allocated the array, it must be dynamic
+ if(psaNew->fFeatures & (FADF_AUTO | FADF_STATIC)){
+ hresult = RESULT(DISP_E_BADCALLEE);
+ goto LError0;
+ }
+
+ }else{
+
+ if(psa->fFeatures != psaNew->fFeatures){
+ // the callee isn't allowed to change the allocation features.
+ //
+ // CONSIDER: should probably check everything *except* the
+ // element type features (bstr|var|disp).
+ //
+ if((psaNew->fFeatures ^ psa->fFeatures) & (FADF_AUTO | FADF_STATIC)){
+ hresult = RESULT(DISP_E_BADCALLEE);
+ goto LError0;
+ }
+ fReAlloc = TRUE;
+ }
+
+ if(psa->cbElements != psaNew->cbElements)
+ fReAlloc = TRUE;
+
+ if(MEMCMP(&psa->rgsabound, &psaNew->rgsabound, (size_t)cbBounds))
+ fReAlloc = TRUE;
+ }
+
+ // If the size of the array has changed, then re-allocate the
+ // memory for the array data.
+ //
+ if(fReAlloc){
+
+ if(!fByRef){
+ hresult = RESULT(DISP_E_BADCALLEE);
+ goto LError0;
+ }
+
+ if(psa == NULL){
+ *ppsa = psa = psaNew;
+ psaNew = NULL;
+ }else{
+ IfFailGo(SafeArrayDestroyData(psa), LError0);
+ psa->fFeatures = psaNew->fFeatures;
+ psa->cbElements = psaNew->cbElements;
+ MEMCPY(&psa->rgsabound, &psaNew->rgsabound, (size_t)cbBounds);
+ }
+ IfFailGo(SafeArrayAllocData(psa), LError0);
+ }
+
+ IfFailGo(SafeArrayReadData(pstm, psa, syskind), LError0);
+
+ hresult = NOERROR;
+
+LError0:;
+ if(psaNew != NULL) {
+ // force the array to be freed, even if it is marked as FADF_STATIC:
+ // it is really a dynamically allocated array read from the stream.
+ psaNew->fFeatures |= FADF_FORCEFREE;
+ SafeArrayDestroy(psaNew);
+ }
+
+ return hresult;
+}
+
+
+//---------------------------------------------------------------------
+// table driven structure marshalers
+//---------------------------------------------------------------------
+
+
+// NOTE: the following table is order dependent on FIELD_TYPE
+
+// The numbers that are hard-coded in the following table are assumed,
+// to be machine independent. If we ever deal with a target where this
+// assumption does not hold, then the following code must be reviewed.
+
+// 0 indicates N/A
+
+unsigned char g_cbFtype[] = {
+ 0 // FT_NONE
+ , 1 // FT_CHAR
+ , 1 // FT_UCHAR
+ , 2 // FT_SHORT
+ , 2 // FT_USHORT
+ , 4 // FT_LONG
+ , 4 // FT_ULONG
+ , sizeof(int) // FT_INT (MD)
+ , sizeof(unsigned int) // FT_UINT (MD)
+ , sizeof(int) // FT_ENUM (MD)
+
+ /* sizes of other field types are N/A */
+};
+
+
+/***
+*HRESULT StructWrite
+*Purpose:
+* Write the given structure to the given stream based on the
+* given field descriptor array.
+*
+*Entry:
+* pstm = the stream to marshal into
+* prgfdesc = pointer to the field descriptor array
+* pvStruct = void* to the struct to write
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+StructWrite(
+ IStream FAR* pstm,
+ FIELDDESC FAR* prgfdesc,
+ void FAR* pvStruct,
+ SYSKIND syskind)
+{
+ long l;
+ unsigned long ul;
+ unsigned long cb;
+ void FAR* pvField;
+ FIELDDESC FAR* pfdesc;
+
+ for(pfdesc = prgfdesc; FD_FTYPE(pfdesc) != FT_NONE; ++pfdesc){
+
+ pvField = (char FAR*)pvStruct + FD_OFIELD(pfdesc);
+
+ switch(FD_FTYPE(pfdesc)){
+ case FT_CHAR:
+ case FT_UCHAR:
+ case FT_SHORT:
+ case FT_USHORT:
+ case FT_LONG:
+ case FT_ULONG:
+ ASSERT(FD_FTYPE(pfdesc) < DIM(g_cbFtype));
+ cb = g_cbFtype[FD_FTYPE(pfdesc)];
+ ASSERT(cb != 0);
+ IfFailRet(pstm->Write(pvField, cb, NULL));
+ break;
+
+ case FT_MBYTE:
+ IfFailRet(pstm->Write(pvField, FD_CBFIELD(pfdesc), NULL));
+ break;
+
+ case FT_STRUCT:
+ IfFailRet(StructWrite(pstm, FD_PRGFDESC(pfdesc), pvField, syskind));
+ break;
+
+ case FT_BSTR:
+ IfFailRet(BstrWrite(pstm, *(BSTR FAR*)pvField, syskind));
+ break;
+
+ case FT_SPECIAL:
+ IfFailRet(FD_PFNSPECIAL(pfdesc)(pstm, FALSE, pvField));
+ break;
+
+ // The following are machine-int size dependent. They are written
+ // in a fixed size to facilitate 16/32 interoperability.
+
+ case FT_INT:
+ case FT_ENUM:
+ l = (long)*(int FAR*)pvField;
+ IfFailRet(PUT(pstm, l));
+ break;
+
+ case FT_UINT:
+ ul = (unsigned long)*(unsigned int FAR*)pvField;
+ IfFailRet(PUT(pstm, ul));
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ return RESULT(E_UNEXPECTED);
+ }
+ }
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT StructRead
+*Purpose:
+* Read a struct from the given stream into the caller provided
+* structure based on the given array of structure field descriptors.
+*
+*Entry:
+* pstm = the stream to unmarshal from
+* prgfdesc = pointer to the array of field descriptors
+*
+*Exit:
+* return value = HRESULT
+*
+* *pvStruct = structure containing unmarshaled values
+*
+***********************************************************************/
+HRESULT
+StructRead(
+ IStream FAR* pstm,
+ FIELDDESC FAR* prgfdesc,
+ void FAR* pvStruct,
+ SYSKIND syskind)
+{
+ long l;
+ unsigned long ul;
+ unsigned long cb;
+ void FAR* pvField;
+ FIELDDESC FAR* pfdesc;
+
+ for(pfdesc = prgfdesc; FD_FTYPE(pfdesc) != FT_NONE; ++pfdesc){
+
+ pvField = (char FAR*)pvStruct + FD_OFIELD(pfdesc);
+
+ switch(FD_FTYPE(pfdesc)){
+ case FT_CHAR:
+ case FT_UCHAR:
+ case FT_SHORT:
+ case FT_USHORT:
+ case FT_LONG:
+ case FT_ULONG:
+ ASSERT(FD_FTYPE(pfdesc) < DIM(g_cbFtype));
+ cb = g_cbFtype[FD_FTYPE(pfdesc)];
+ ASSERT(cb != 0);
+ IfFailRet(pstm->Read(pvField, cb, NULL));
+ break;
+
+ case FT_MBYTE:
+ IfFailRet(pstm->Read(pvField, FD_CBFIELD(pfdesc), NULL));
+ break;
+
+ case FT_STRUCT:
+ IfFailRet(StructRead(pstm, FD_PRGFDESC(pfdesc), pvField, syskind));
+ break;
+
+ case FT_BSTR:
+ IfFailRet(BstrRead(pstm, (BSTR FAR*)pvField, syskind));
+ break;
+
+ case FT_SPECIAL:
+ IfFailRet(FD_PFNSPECIAL(pfdesc)(pstm, TRUE, pvField));
+ break;
+
+ // The following are machine-int size dependent. They are written
+ // in a fixed size to facilitate 16/32 interoperability.
+
+ case FT_INT:
+ case FT_ENUM:
+ IfFailRet(GET(pstm, l));
+ *(int FAR*)pvField = (int)l;
+ break;
+
+ case FT_UINT:
+ IfFailRet(GET(pstm, ul));
+ *(unsigned int FAR*)pvField = (unsigned int)ul;
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ return RESULT(E_UNEXPECTED);
+ }
+ }
+
+ return NOERROR;
+}
+
+
+// network automation provides different implementations of these (netmrsh.cpp)
+#if !defined(NETDISP)
+//---------------------------------------------------------------------
+// Interface marshaling helpers
+//---------------------------------------------------------------------
+
+/*
+ * IMPORTANT NOTE ON INTERFACE MARSHALING:
+ *
+ * On Win16, when marshaling an interface on a proxy, OLE does
+ * not add a reference to the original server. As a result, if
+ * the proxy is the only reference to the server, once we have
+ * marshaled the proxy and released it the server will go away
+ * and we will be unable to extract the interface on the other
+ * side.
+ *
+ * In order to work around this problem, whenever we marshal an
+ * interface, we create a small holder object that holds an extra
+ * reference to the proxy, and marshal it along with the interface.
+ * Once the original interface has been successfully extracted on
+ * the other side, then we release this holder object which triggers
+ * the release on the proxy in the source process.
+ *
+ * This problem doesn't exist on Win32, or in the 16 bit WOW Dlls
+ * which thunk to the 32bit Dlls. We only use this technique on Win16 and
+ * when running the 32-bit DLLs on Win32s.
+ *
+ */
+
+#if (OE_WIN16 && !defined(WOW)) || OE_WIN32 && defined(_X86_)
+# define USE_HOLDER 1
+#else
+# define USE_HOLDER 0
+#endif
+
+
+#if USE_HOLDER
+
+// This is a trivial interface-holder class
+class FAR CHolder : public IUnknown
+{
+public:
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ CHolder();
+ ~CHolder();
+
+ unsigned long m_cRefs;
+ IUnknown FAR* m_punk;
+};
+
+CHolder::CHolder()
+{
+ m_cRefs = 1;
+ m_punk = NULL;
+}
+
+CHolder::~CHolder()
+{
+ if(m_punk != NULL)
+ m_punk->Release();
+}
+
+STDMETHODIMP
+CHolder::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(riid == IID_IUnknown){
+ *ppv = this;
+ ++m_cRefs;
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CHolder::AddRef()
+{
+ return ++m_cRefs;
+}
+
+STDMETHODIMP_(unsigned long)
+CHolder::Release()
+{
+ if(--m_cRefs == 0){
+ delete this;
+ return 0;
+ }
+ return m_cRefs;
+}
+#endif
+
+/***
+*INTERNAL DispMarshalInterface
+*Purpose:
+* The ole routine CoMarshalInterface doesnt allow marshaling
+* NULL interface ptrs, so this wrapper adds some extra info to
+* the stream to allow us to do this.
+*
+*Entry:
+* pstm = the stream to marshal into
+* riid = the IID of the interface we are marshaling
+* punk = an IUnknown* of the interface being marshaled.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+DispMarshalInterface(
+ IStream FAR* pstm,
+ REFIID riid,
+ IUnknown FAR* punk)
+{
+ HRESULT hresult;
+ unsigned char fIsNull;
+#if USE_HOLDER
+ CHolder FAR* pholder = NULL;
+#endif
+
+ if(punk == NULL){
+ fIsNull = TRUE;
+ IfFailRet(PUT(pstm, fIsNull));
+ return NOERROR;
+ }
+
+ fIsNull = FALSE;
+ IfFailRet(PUT(pstm, fIsNull));
+
+#if USE_HOLDER
+#if OE_WIN32
+ // Only do this on WIN32S
+ if (g_fWin32s) {
+#endif // OE_WIN32
+ // Create the holder
+ if((pholder = new FAR CHolder()) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto Error;
+ }
+
+ // stuff the interface were marshaling into the holder
+ punk->AddRef();
+ pholder->m_punk = punk;
+
+ // marshaler the holder
+ IfFailGo(CoMarshalInterface(pstm,
+ IID_IUnknown,
+ (IUnknown FAR*)pholder,
+ 0L,
+ NULL,
+ MSHLFLAGS_NORMAL), Error);
+#if OE_WIN32
+ }
+#endif // OE_WIN32
+#endif
+
+ // marshal the interface
+ IfFailGo(CoMarshalInterface(pstm,
+ riid,
+ punk,
+ 0L,
+ NULL,
+ MSHLFLAGS_NORMAL), Error);
+
+ hresult = NOERROR;
+
+Error:;
+#if USE_HOLDER
+ if(pholder != NULL)
+ pholder->Release();
+#endif
+ return hresult;
+}
+
+
+/***
+*INTERNAL HRESULT DispUnmarshalInterface
+*Purpose:
+* Unmarshal an interface from the given stream, properly handling
+* NULL interface ptrs. See comment for DispMarshalInterface().
+*
+*Entry:
+* pstm = the stream to unmarshal from
+* riid = the IID of the interface were unmarshaling
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppv = the newly reconstituted interface
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+DispUnmarshalInterface(
+ IStream FAR* pstm,
+ REFIID riid,
+ void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+ unsigned char fIsNull;
+#if USE_HOLDER
+ IUnknown FAR* punkHolder = NULL;
+#endif
+
+ IfFailRet(GET(pstm, fIsNull));
+
+ if(fIsNull){
+ *ppv = NULL;
+ return NOERROR;
+ }
+
+#if USE_HOLDER
+#if OE_WIN32
+ if (g_fWin32s)
+#endif // OE_WIN32
+ // extract the holder
+ IfFailGo(CoUnmarshalInterface(pstm,
+ IID_IUnknown,
+ (void FAR* FAR*)&punkHolder), Error);
+#endif
+
+ // extract the interface
+ IfFailGo(CoUnmarshalInterface(pstm, riid, ppv), Error);
+
+ hresult = NOERROR;
+
+Error:;
+#if USE_HOLDER
+ // Release the holder. This will in turn release the extra
+ // reference that it is holding onto in the other process.
+ if(punkHolder != NULL)
+ punkHolder->Release();
+#endif
+
+ return hresult;
+}
+#endif // !defined(NETDISP)
+
diff --git a/private/oleauto/src/dispatch/dispmrsh.h b/private/oleauto/src/dispatch/dispmrsh.h
new file mode 100644
index 000000000..934fa0419
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispmrsh.h
@@ -0,0 +1,316 @@
+/***
+*dispmrsh.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the marshaling utilities used by ole2disp.dll
+*
+*Revision History:
+*
+* [00] 05-Mar-93 bradlo: Created (split off from dispps.h).
+* [01] 06-Mar-93 bradlo: added structure marshaling stuff.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+// Shared macro definitions used by all OA proxy/stub/marshalling code.
+// Win32 builds based on Cario sources only supports buffer I/O whereas
+// Win16/Mac only supports simple stream. Buffered interfaces are not
+// publicly exposed, hence, their definitions here.
+
+#if ((OE_WIN32 || defined(WOW)) && defined(__cplusplus))
+ #define IPSFACTORY IPSFactoryBuffer
+ #define IPROXY IRpcProxyBuffer
+ #define ISTUB IRpcStubBuffer
+ #define ICHANNEL IRpcChannelBuffer
+ #define IID_IPSFACTORY IID_IPSFactoryBuffer
+ #define IID_IPROXY IID_IRpcProxyBuffer
+ #define IID_ISTUB IID_IRpcStubBuffer
+ #define IID_ICHANNEL IID_IRpcChannelBuffer
+
+ #define OPEN_STREAM(plrpc, pstm, iMeth, size, iid) \
+ RPCOLEMESSAGE message; \
+ \
+ pstm = new CStreamOnBuffer(plrpc, &message, iid, iMeth); \
+ if(pstm == NULL) \
+ return RESULT(E_OUTOFMEMORY); \
+ IfFailRet(((CStreamOnBuffer *) pstm)->ResizeBuffer(size));
+
+ #define OPEN_STUB_STREAM(pstm, pRpcChannel, pMessage, iid) \
+ pstm = new CStreamOnBuffer(pRpcChannel, pMessage, iid, 0xffffffff); \
+ if(pstm == NULL) \
+ return RESULT(E_OUTOFMEMORY); \
+
+ #define INVOKE_CALL(plrpc, pstm, label) \
+ IfFailGo( \
+ (((CStreamOnBuffer *) pstm)->Call()), label)
+
+ #define RESET_STREAM(pstm) \
+ ((CStreamOnBuffer *) pstm)->ResetBuffer()
+
+ #define RESIZE_STREAM(pstm, size) \
+ ((CStreamOnBuffer *) pstm)->ResizeBuffer(size)
+
+ #define REWIND_STREAM(pstm) \
+ ((CStreamOnBuffer *) pstm)->RewindBuffer()
+
+ #define DELETE_STREAM(pstm) \
+ delete (CStreamOnBuffer *) pstm;
+
+ #define GET_IMETHOD(pmessage) \
+ pmessage->iMethod
+
+ extern "C" const IID IID_IPSFactoryBuffer;
+ extern "C" const IID IID_IRpcProxyBuffer;
+ extern "C" const IID IID_IRpcStubBuffer;
+ extern "C" const IID IID_IRpcChannelBuffer;
+
+ typedef unsigned long RPCOLEDATAREP;
+ #define NDR_LOCAL_DATA_REPRESENTATION (unsigned long)0X00000010L
+
+#ifndef WIN32 // already defined in new header files
+ typedef struct tagRPCOLEMESSAGE
+ {
+ void *reserved1;
+ RPCOLEDATAREP dataRepresentation;
+ void *Buffer;
+ ULONG cbBuffer;
+ ULONG iMethod;
+ void *reserved2[5];
+ ULONG rpcFlags;
+ } RPCOLEMESSAGE;
+
+ typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
+
+ interface IRpcChannelBuffer : IUnknown
+ {
+ STDMETHOD(GetBuffer)(RPCOLEMESSAGE FAR* pMessage,
+ REFIID riid) = 0;
+ STDMETHOD(SendReceive)(RPCOLEMESSAGE FAR* pMessage,
+ ULONG FAR* pStatus) = 0;
+ STDMETHOD(FreeBuffer)(RPCOLEMESSAGE FAR* pMessage) = 0;
+ STDMETHOD(GetDestCtx)(DWORD FAR* lpdwDestCtx,
+ LPVOID FAR* lplpvDestCtx) = 0;
+ STDMETHOD(IsConnected)(void) = 0;
+ };
+
+ interface IRpcProxyBuffer : IUnknown
+ {
+ STDMETHOD(Connect)(IRpcChannelBuffer FAR* pRpcChannel) = 0;
+ STDMETHOD_(void, Disconnect)(void) = 0;
+ };
+
+ interface IRpcStubBuffer : IUnknown
+ {
+ STDMETHOD(Connect)(IUnknown FAR* pUnk) = 0;
+ STDMETHOD_(void, Disconnect)(void) = 0;
+ /*STDMETHOD(Invoke)(REFIID iid, int iMethod, IStream FAR* pIStream,
+ DWORD dwDestCtx, LPVOID lpvDestCtx) = 0;*/
+ STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg,
+ IRpcChannelBuffer FAR* pRpcChannel) = 0;
+ STDMETHOD_(IRpcStubBuffer *, IsIIDSupported)(REFIID iid) = 0;
+ STDMETHOD_(ULONG, CountRefs)(void) = 0;
+
+ STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv) = 0;
+ STDMETHOD_(void, DebugServerRelease)(void FAR* pv) = 0;
+ };
+
+ interface IPSFactoryBuffer : IUnknown
+ {
+ STDMETHOD(CreateProxy)(IUnknown FAR* pUnkOuter, REFIID riid,
+ IRpcProxyBuffer FAR* FAR* ppProxy, void FAR* FAR* ppv) = 0;
+ STDMETHOD(CreateStub)(REFIID riid, IUnknown FAR* pUnkServer,
+ IRpcStubBuffer FAR* FAR* ppStub) = 0;
+ };
+#endif //!WIN32
+
+ #include "dispstrm.h"
+
+#else
+ #define IPSFACTORY IPSFactory
+ #define IPROXY IRpcProxy
+ #define ISTUB IRpcStub
+ #define ICHANNEL IRpcChannel
+ #define IID_IPSFACTORY IID_IPSFactory
+ #define IID_IPROXY IID_IRpcProxy
+ #define IID_ISTUB IID_IRpcStub
+ #define IID_ICHANNEL IID_IRpcChannel
+
+ #define OPEN_STREAM(plrpc, pstm, iMeth, size, iid) \
+ IfFailRet(plrpc->GetStream(iid, iMeth, FALSE, FALSE, size, &pstm))
+ #define INVOKE_CALL(plrpc, pstm, label) \
+ IfFailGo(plrpc->Call(pstm), label)
+
+ #define RESET_STREAM(pstm)
+
+ #define RESIZE_STREAM(pstm, size)
+
+ #define REWIND_STREAM(pstm) (Rewind(pstm))
+
+ #define DELETE_STREAM(pstm)
+
+ #define GET_IMETHOD(pmessage) iMethod
+
+#endif
+
+
+
+
+
+// VARIANT marshaling utilities
+
+HRESULT VariantWrite(IStream FAR*, VARIANTARG FAR*, SYSKIND);
+HRESULT VariantReadType(IStream FAR*, VARIANTARG FAR*, SYSKIND);
+HRESULT VariantRead(IStream FAR*, VARIANTARG FAR*, VARIANT FAR*, SYSKIND);
+
+// BSTR marshaling utilities
+
+HRESULT BstrWrite(IStream FAR* pstm, BSTR bstr, SYSKIND);
+HRESULT BstrRead(IStream FAR* pstm, BSTR FAR* pbstr, SYSKIND);
+
+
+// SafeArray marshaling utilities
+
+HRESULT SafeArrayRead(IStream FAR* pstm, SAFEARRAY FAR* FAR* ppsarray, SYSKIND syskind);
+HRESULT SafeArrayWrite(IStream FAR* pstm, SAFEARRAY FAR* psarray, SYSKIND syskind);
+
+
+// EXCEPINFO marshaling utilities
+
+HRESULT ExcepinfoRead(IStream FAR* pstm, EXCEPINFO FAR* pexcepinfo, SYSKIND syskind);
+HRESULT ExcepinfoWrite(IStream FAR* pstm, EXCEPINFO FAR* pexcepinfo, SYSKIND syskind);
+
+// Rich Error state marhsaling utilities
+HRESULT MarshalErrorInfo(IStream FAR* pstm, SYSKIND syskind);
+HRESULT UnmarshalErrorInfo(IStream FAR* pstm, SYSKIND syskind);
+
+
+// helpful macros used by the marshaling/unmarshaling code.
+
+#define GET(PSTREAM, X) ((PSTREAM)->Read(&(X), sizeof(X), NULL))
+#define PUT(PSTREAM, X) ((PSTREAM)->Write(&(X), sizeof(X), NULL))
+
+
+// structure marshaling support
+
+enum FIELD_TYPE {
+ FT_NONE = 0,
+ FT_CHAR,
+ FT_UCHAR,
+ FT_SHORT,
+ FT_USHORT,
+ FT_LONG,
+ FT_ULONG,
+ FT_INT,
+ FT_UINT,
+ FT_ENUM,
+ FT_MBYTE, // multi-byte member (array)
+ FT_STRUCT, // nested struct
+ FT_BSTR,
+ FT_WBSTR,
+ FT_SPECIAL,
+ FT_MAX,
+
+ // following based on definitions from windows.h
+
+ FT_BYTE = FT_UCHAR,
+ FT_WORD = FT_USHORT,
+ FT_DWORD = FT_ULONG
+};
+
+// The following structure contains the description of a
+// single structure field. An array of these descriptions
+// describes a structure for the table driven struct marshalers.
+
+typedef struct tagFIELDDESC FIELDDESC;
+struct tagFIELDDESC{
+ long ftype; // field machine type
+ long oField; // field offset
+ long cbField; // field size
+ union {
+ void FAR* pv;
+ FIELDDESC FAR* prgfdesc; // for FT_STRUCT
+
+ HRESULT (FAR* pfnSpecial)( // for FT_SPECIAL
+ IStream FAR* pstm,
+ BOOL fRead, // read or write?
+ void FAR* pvField);
+ }u;
+};
+
+// FIELDDESC accessor macros
+//
+#define FD_FTYPE(X) ((X)->ftype)
+#define FD_OFIELD(X) ((X)->oField)
+#define FD_CBFIELD(X) ((X)->cbField)
+
+#define FD_PV(X) ((X)->u.pv)
+#define FD_PRGFDESC(X) ((X)->u.prgfdesc)
+#define FD_PFNSPECIAL(X) ((X)->u.pfnSpecial)
+
+
+#define OA_FIELD_SIZE(TYPE, FIELD) (sizeof(((TYPE NEAR*)1)->FIELD))
+
+#define OA_FIELD_OFFSET(TYPE, FIELD) ((int)(&((TYPE NEAR*)1)->FIELD)-1)
+
+// the following macro is used to initialize a single entry in
+// a structure marshal info array.
+
+#define FIELDDAT(TYPE, FTYPE, FIELD, PRGFDESC) \
+ { FTYPE, OA_FIELD_OFFSET(TYPE, FIELD), OA_FIELD_SIZE(TYPE, FIELD), PRGFDESC }
+
+// end if table marker
+#define FIELDEND() \
+ { FT_NONE, -1, -1, NULL }
+
+// table driver structure marshaler
+
+HRESULT
+StructWrite(
+ IStream FAR* pstm,
+ FIELDDESC FAR* prgfdesc,
+ void FAR* pvStruct,
+ SYSKIND);
+
+// table driven structure unmarshaler
+
+HRESULT
+StructRead(
+ IStream FAR* pstm,
+ FIELDDESC FAR* prgfdesc,
+ void FAR* pvStruct,
+ SYSKIND);
+
+
+#ifdef __cplusplus /* { */
+
+/***
+*PRIVATE HRESULT Rewind(IStream*)
+*Purpose:
+* Rewind the given stream (seek to offset 0LL). This function really
+* only exists due to the hassles of setting up a large int (longlong)
+* constant - so we abstract it out here.
+*
+*
+*Entry:
+* pstm = the stream to rewind.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+inline HRESULT Rewind(IStream FAR* pstm)
+{
+#if (OE_WIN32 || HC_MPW)
+ LARGE_INTEGER ll0;
+ LISet32(ll0, 0);
+#else
+static const LARGE_INTEGER NEAR ll0 = {0,0};
+#endif
+ return pstm->Seek(ll0, STREAM_SEEK_SET, NULL);
+}
+
+#endif /* } */
diff --git a/private/oleauto/src/dispatch/disppch.cpp b/private/oleauto/src/dispatch/disppch.cpp
new file mode 100644
index 000000000..ddbae05ca
--- /dev/null
+++ b/private/oleauto/src/dispatch/disppch.cpp
@@ -0,0 +1,3 @@
+// This file is used to construct the oledisp precompiled header.
+
+#include "oledisp.h"
diff --git a/private/oleauto/src/dispatch/dispprox.cpp b/private/oleauto/src/dispatch/dispprox.cpp
new file mode 100644
index 000000000..2c160b95f
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispprox.cpp
@@ -0,0 +1,707 @@
+/***
+*dispprox.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Implements custom proxy support for the IDispatch interface.
+*
+*Revision History:
+*
+* [00] 18-Sep-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+* There are assumptions in the following marshaling code that the
+* endianness of the caller and callee are the same.
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "dispps.h"
+
+
+static EXCEPINFO NEARDATA g_excepinfoNull = {0};
+
+
+CProxDisp::CProxDisp(IUnknown FAR* punkOuter, REFIID riid)
+ : m_unk(this), m_proxy(this), m_disp(this)
+{
+ if(punkOuter == NULL)
+ punkOuter = &m_unk;
+ m_punkOuter = punkOuter;
+ m_dispInterface = riid;
+}
+
+CProxDisp::~CProxDisp()
+{
+
+}
+
+
+IUnknown FAR*
+CProxDisp::Create(IUnknown FAR* punkOuter, REFIID riid)
+{
+ CProxDisp FAR* pproxdisp;
+
+ if(pproxdisp = new FAR CProxDisp(punkOuter, riid)){
+ pproxdisp->m_refs = 1;
+ return &pproxdisp->m_unk;
+ }
+ return NULL;
+}
+
+//---------------------------------------------------------------------
+// IDispatch proxy class IUnknown implementation
+//---------------------------------------------------------------------
+
+CPDUnkImpl::CPDUnkImpl(CProxDisp FAR* pproxdisp)
+{
+ m_pproxdisp = pproxdisp;
+}
+
+CPDUnkImpl::~CPDUnkImpl()
+{
+
+}
+
+STDMETHODIMP
+CPDUnkImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = (void FAR*)&m_pproxdisp->m_unk;
+ AddRef();
+ return NOERROR;
+ }
+
+ if(IsEqualIID(riid, IID_IPROXY)){
+ *ppv = (void FAR*)&(m_pproxdisp->m_proxy);
+ AddRef();
+ return NOERROR;
+ }
+
+ if(IsEqualIID(riid, IID_IDispatch) ||
+ IsEqualIID(riid, m_pproxdisp->m_dispInterface)){
+ *ppv = (void FAR*)&(m_pproxdisp->m_disp);
+ m_pproxdisp->m_punkOuter->AddRef();
+ return NOERROR;
+ }
+
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPDUnkImpl::AddRef()
+{
+ return ++m_pproxdisp->m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CPDUnkImpl::Release()
+{
+ if(--m_pproxdisp->m_refs==0){
+ delete m_pproxdisp;
+ return 0;
+ }
+ return m_pproxdisp->m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch proxy class' IRpcProxy implementation
+//---------------------------------------------------------------------
+
+CPDProxImpl::CPDProxImpl(CProxDisp FAR* pproxdisp)
+{
+ m_pproxdisp = pproxdisp;
+}
+
+CPDProxImpl::~CPDProxImpl()
+{
+ if(m_pproxdisp->m_plrpc)
+ m_pproxdisp->m_plrpc->Release();
+ m_pproxdisp->m_plrpc = NULL;
+}
+
+STDMETHODIMP
+CPDProxImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxdisp->m_unk.QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPDProxImpl::AddRef()
+{
+ return m_pproxdisp->m_unk.AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPDProxImpl::Release()
+{
+ return m_pproxdisp->m_unk.Release();
+}
+
+STDMETHODIMP
+CPDProxImpl::Connect(ICHANNEL FAR* plrpc)
+{
+ if(plrpc){
+ plrpc->AddRef();
+ m_pproxdisp->m_plrpc = plrpc;
+ m_pproxdisp->m_disp.SysKind();
+ return NOERROR;
+ }
+ return RESULT(E_FAIL);
+}
+
+
+STDMETHODIMP_(void)
+CPDProxImpl::Disconnect(void)
+{
+ if(m_pproxdisp->m_plrpc)
+ m_pproxdisp->m_plrpc->Release();
+ m_pproxdisp->m_plrpc = NULL;
+}
+
+//---------------------------------------------------------------------
+// IDispatch proxy class' IDispatch implementation
+//---------------------------------------------------------------------
+
+CPDDispImpl::CPDDispImpl(CProxDisp FAR* pproxdisp)
+{
+ m_pproxdisp = pproxdisp;
+}
+
+CPDDispImpl::~CPDDispImpl()
+{
+
+}
+
+
+STDMETHODIMP
+CPDDispImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxdisp->m_punkOuter->QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPDDispImpl::AddRef()
+{
+ return m_pproxdisp->m_punkOuter->AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPDDispImpl::Release()
+{
+ return m_pproxdisp->m_punkOuter->Release();
+}
+
+STDMETHODIMP
+CPDDispImpl::SysKind()
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult;
+ unsigned long _stubSysKind;
+
+ if((plrpc = m_pproxdisp->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_SYSKIND, 32, IID_IDispatch);
+
+ INVOKE_CALL(plrpc, pstm, LRelease);
+
+ IfFailGo(GET(pstm, _stubSysKind), LRelease);
+ m_syskindStub = (SYSKIND) _stubSysKind;
+
+LRelease:
+
+ pstm->Release();
+ return hresult;
+}
+
+
+/***
+*HRESULT CPDDispImpl::GetTypeInfoCount(unsigned int*)
+*Purpose:
+*
+* Out:
+* <nothing>
+*
+* In:
+* <HRESULT = return value>
+* <unsigned int = count>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pctinfo = count of TypeInfos
+*
+***********************************************************************/
+HRESULT
+ProxyGetTypeInfoCount(ICHANNEL FAR* plrpc,
+ SYSKIND syskindStub,
+ unsigned int FAR* pctinfo)
+{
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+ unsigned long _ctinfo;
+
+#ifdef _DEBUG
+ IfFailRet(ValidateWritePtr(pctinfo, sizeof(*pctinfo)));
+#endif
+
+ if(plrpc == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_GETTYPEINFOCOUNT, 32, IID_IDispatch);
+
+ INVOKE_CALL(plrpc, pstm, LRelease);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LRelease);
+
+ if(HRESULT_FAILED(hresultRet)){
+ hresult = hresultRet;
+ goto LRelease;
+ }
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(pstm->Read(&_ctinfo, sizeof(unsigned long), NULL), LRelease);
+ *pctinfo = (unsigned int) _ctinfo;
+
+ hresult = hresultRet;
+
+LRelease:
+ pstm->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+CPDDispImpl::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ return ProxyGetTypeInfoCount(m_pproxdisp->m_plrpc,
+ m_syskindStub,
+ pctinfo);
+
+}
+
+/***
+*HRESULT CPDDispImpl::GetTypeInfo(unsigned int, LCID, ITypeInfo**)
+*Purpose:
+*
+* Out:
+* <unsigned int = itinfo>
+* <LCID = lcid>
+* <HRESULT = return value>
+* <ITypeInfo* = pptinfo>
+*
+*Entry:
+* itinfo = index of the TypeInfo to retrieve
+* lcid = the locale ID of the caller
+*
+*Exit:
+* return value = HRESULT
+*
+* *pptinfo = TypeInfo of the given index
+*
+***********************************************************************/
+HRESULT
+ProxyGetTypeInfo(ICHANNEL FAR* plrpc,
+ SYSKIND syskindStub,
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ IStream FAR* pstm;
+ unsigned long _itinfo;
+ HRESULT hresult, hresultRet;
+
+#ifdef _DEBUG
+ IfFailRet(ValidateWritePtr(pptinfo, sizeof(*pptinfo)));
+#endif
+
+ if(plrpc == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm,
+ IMETH_GETTYPEINFO,
+ 256, /* (sizeof(SCODE)+sizeof(IID)), */
+ IID_IDispatch);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _itinfo = itinfo;
+ IfFailGo(PUT(pstm, _itinfo), LRelease);
+
+ IfFailGo(PUT(pstm, lcid), LRelease);
+
+ INVOKE_CALL(plrpc, pstm, LRelease);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LRelease);
+
+ if(HRESULT_FAILED(hresultRet)){
+ hresult = hresultRet;
+ goto LRelease;
+ }
+
+ IfFailGo(DispUnmarshalInterface(
+ pstm, IID_ITypeInfo, (void FAR* FAR*)pptinfo), LRelease);
+
+ hresult = hresultRet;
+
+LRelease:
+ pstm->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+CPDDispImpl::GetTypeInfo(unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ return ProxyGetTypeInfo(m_pproxdisp->m_plrpc,
+ m_syskindStub,
+ itinfo,
+ lcid,
+ pptinfo);
+}
+
+
+/***
+*HRESULT CPDDispImpl::GetIDsOfNames(REFIID, char**, unsigned int, LCID, DISPID*)
+*
+*Purpose:
+* Out:
+* <REFIID riid>
+* <LCID = lcid>
+* <unsigned int = cNames>
+* [(len, sz)]+ ; names
+*
+* In:
+* <HRESULT = return value>
+* [DISPID]+
+*
+*Entry:
+* riid = reference to an interface ID
+* rgszNames = array of names to find the DISPIDs for
+* cNames = count of names in the rgszNames array
+* lcid = the locale id
+*
+*Exit:
+* return value = HRESULT
+* [UNDONE: enumerate return codes]
+* rgdispid = array of DISPIDs corresponding to the passed in array of names.
+*
+***********************************************************************/
+HRESULT
+ProxyGetIDsOfNames(ICHANNEL FAR* plrpc,
+ SYSKIND syskindStub,
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ unsigned int i;
+ unsigned long len;
+ unsigned long _cNames;
+ unsigned long _proxySysKind;
+
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+ int size = sizeof(IID) + sizeof(lcid) + sizeof(_cNames) + 64;
+
+ if(cNames == 0)
+ return RESULT(E_INVALIDARG);
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(rgszNames, cNames * sizeof(OLECHAR FAR*)))
+ return RESULT(E_INVALIDARG);
+
+ // make sure each of the entries in the name array is valid.
+ for(i = 0; i < cNames; ++i)
+ if(IsBadReadPtr(rgszNames[i], sizeof(OLECHAR)))
+ return RESULT(E_INVALIDARG);
+
+ if(IsBadWritePtr(rgdispid, cNames * sizeof(DISPID)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if(plrpc == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ // calculate the size needed for stream
+ for(i = 0; i < cNames; ++i)
+ size += BYTELEN(rgszNames[i]) + sizeof(len);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_GETIDSOFNAMES, size, IID_IDispatch);
+
+ _proxySysKind = (unsigned long)SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LRelease);
+
+ IfFailGo(pstm->Write((const void FAR*)&riid, sizeof(IID), NULL), LRelease);
+ IfFailGo(PUT(pstm, lcid), LRelease);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _cNames = cNames;
+ IfFailGo(PUT (pstm, _cNames), LRelease);
+
+#if OE_WIN32 /* enable 16/32 interoperablity support */
+ if (syskindStub == SYS_WIN16) {
+ char buf[128];
+ char *pBuf = buf;
+
+ for(i=0; i<cNames; ++i){
+ len = STRLEN(rgszNames[i])+1;
+ IfFailGo(PUT(pstm, len), LRelease);
+
+ // optimization for names under 128 bytes
+ if (len > 128) {
+ if ((pBuf = new FAR char [len]) == NULL) {
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LRelease;
+ }
+ }
+
+ // convert UNICODE string to ANSI and stream it
+ WideCharToMultiByte(CP_ACP, NULL, rgszNames[i], -1,
+ pBuf, len, NULL, NULL);
+ IfFailGo(pstm->Write((void FAR*) pBuf, len, NULL), LRelease);
+
+ if (len > 128)
+ delete pBuf;
+ }
+ } else
+#endif
+ {
+ for(i=0; i<cNames; ++i){
+ len = BYTELEN(rgszNames[i]);
+ IfFailGo(PUT(pstm, len), LRelease);
+ IfFailGo(pstm->Write((const void FAR*) rgszNames[i], len, NULL), LRelease);
+ }
+ }
+
+ INVOKE_CALL(plrpc, pstm, LRelease);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LRelease);
+
+ for(i=0; i<cNames; ++i)
+ IfFailGo(pstm->Read(&rgdispid[i], sizeof(rgdispid[0]), NULL), LRelease);
+
+ hresult = hresultRet;
+
+LRelease:;
+ pstm->Release();
+
+ return hresult;
+}
+
+STDMETHODIMP
+CPDDispImpl::GetIDsOfNames(REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ return ProxyGetIDsOfNames(m_pproxdisp->m_plrpc,
+ m_syskindStub,
+ riid,
+ rgszNames,
+ cNames,
+ lcid,
+ rgdispid);
+}
+
+/***
+*HRESULT CPDDispImpl::Invoke()
+*
+*Purpose:
+* Marshal the parameters and invoke the remote method.
+*
+* Out:
+* <struct MARSHAL_INVOKE> ; fixed arguments - see dispps.h
+* <IID iid> ; Interface ID - required
+* <arguments>* [<VARTYPE vt><vargData>]
+* <name ids>* [DISPID id]
+* <VARIANT varResult>?
+* <EXCEPINFO excepinfo>?
+* <unsigned int uArgErr>?
+*
+* In:
+* <HRESULT = return value>
+* <Out params>* [<VARTYPE vt><vargData>]
+* <varResult>?
+* <excepinfo>?
+* <uArgErr>?
+*
+*Entry:
+* dispidMember = the DISPID of the requested member function or property
+* riid = the IID of the interface to which this member belongs
+* lcid = the locale ID of the caller
+* wFlags = the context of the call, method or property access, etc.
+* pdispparams = DISPPARAMS struct containing the method's args
+*
+*Exit:
+* return value = HRESULT
+*
+* pvarResult =
+* pexcepinfo =
+* puArgErr =
+*
+***********************************************************************/
+HRESULT
+ProxyInvoke(ICHANNEL FAR* plrpc,
+ SYSKIND syskindStub,
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ IStream FAR* pstm;
+ MARSHAL_INVOKE mi;
+ VARIANTARG FAR* pvarg;
+ HRESULT hresult, hresultRet;
+ unsigned long _proxySysKind;
+ unsigned long _uArgErr;
+
+#ifdef _DEBUG
+ if(IsBadDispParams(pdispparams))
+ return RESULT(E_INVALIDARG);
+ if(pvarResult != NULL && IsBadWritePtr(pvarResult, sizeof(*pvarResult)))
+ return RESULT(E_INVALIDARG);
+ if(pexcepinfo != NULL && IsBadWritePtr(pexcepinfo, sizeof(*pexcepinfo)))
+ return RESULT(E_INVALIDARG);
+ if(puArgErr != NULL && IsBadWritePtr(puArgErr, sizeof(*puArgErr)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if(plrpc == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_INVOKE, 1024, IID_IDispatch);
+
+ _proxySysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LRelease);
+
+ mi.dispidMember = dispidMember;
+ mi.lcid = lcid;
+ mi.wFlags = wFlags;
+ mi.cArgs = pdispparams->cArgs;
+ mi.cNamedArgs = pdispparams->cNamedArgs;
+ mi.flags = 0;
+
+ if(pvarResult != NULL)
+ mi.flags |= MARSHAL_INVOKE_fHasResult;
+ if(pexcepinfo != NULL)
+ mi.flags |= MARSHAL_INVOKE_fHasExcepinfo;
+ if(puArgErr != NULL)
+ mi.flags |= MARSHAL_INVOKE_fHasArgErr;
+
+ IfFailGo(PUT(pstm, mi), LRelease);
+
+ IfFailGo(pstm->Write((const void FAR*)&riid, sizeof(IID), NULL), LRelease);
+
+ // pdispparams->rgvarg
+ //
+ for(pvarg = pdispparams->rgvarg;
+ pvarg < &pdispparams->rgvarg[mi.cArgs]; ++pvarg)
+ {
+ IfFailGo(VariantWrite(pstm, pvarg, syskindStub), LRelease);
+ }
+
+ // pdispparams->rgdispid
+ //
+ if(mi.cNamedArgs > 0){
+ IfFailGo(
+ pstm->Write(
+ pdispparams->rgdispidNamedArgs,
+ mi.cNamedArgs * sizeof(pdispparams->rgdispidNamedArgs[0]),
+ NULL),
+ LRelease);
+ }
+
+ if(mi.flags & MARSHAL_INVOKE_fHasResult)
+ IfFailGo(VariantWrite(pstm, pvarResult, syskindStub), LRelease);
+
+ if(mi.flags & MARSHAL_INVOKE_fHasExcepinfo)
+ IfFailGo(ExcepinfoWrite(pstm, &g_excepinfoNull, syskindStub), LRelease);
+
+ if(mi.flags & MARSHAL_INVOKE_fHasArgErr) {
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _uArgErr = *puArgErr;
+ IfFailGo(pstm->Write(&_uArgErr, sizeof(_uArgErr), NULL), LRelease);
+ }
+
+ INVOKE_CALL(plrpc, pstm, LRelease);
+
+ // the return value
+ //
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LRelease);
+
+ // read the ByRef (Out) params.
+ //
+ for(pvarg = pdispparams->rgvarg;
+ pvarg < &pdispparams->rgvarg[mi.cArgs]; ++pvarg)
+ {
+ if(V_ISBYREF(pvarg))
+ IfFailGo(VariantReadType(pstm, pvarg, syskindStub), LRelease);
+ }
+
+ if(mi.flags & MARSHAL_INVOKE_fHasResult)
+ IfFailGo(VariantRead(pstm, pvarResult, NULL, syskindStub), LRelease);
+
+ if(mi.flags & MARSHAL_INVOKE_fHasExcepinfo){
+ IfFailGo(ExcepinfoRead(pstm, pexcepinfo, syskindStub), LRelease);
+ }
+
+ if(mi.flags & MARSHAL_INVOKE_fHasArgErr) {
+ IfFailGo(pstm->Read(&_uArgErr, sizeof(_uArgErr), NULL), LRelease);
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ *puArgErr = (unsigned int)_uArgErr;
+ }
+
+ hresult = hresultRet;
+
+LRelease:;
+ pstm->Release();
+
+ return hresult;
+}
+
+STDMETHODIMP
+CPDDispImpl::Invoke(DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ return ProxyInvoke(m_pproxdisp->m_plrpc,
+ m_syskindStub,
+ dispidMember,
+ riid,
+ lcid,
+ wFlags,
+ pdispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+}
+
diff --git a/private/oleauto/src/dispatch/dispps.h b/private/oleauto/src/dispatch/dispps.h
new file mode 100644
index 000000000..84017ccc8
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispps.h
@@ -0,0 +1,267 @@
+/***
+*dispps.h - IDispatch Proxy and Stub object header.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the following IDispatch Proxy and Stub objects.
+*
+* CProxDisp -- the IDispatch proxy class
+* CPDUnkImpl - CProxDisp implementation of IUnknown
+* CPDProxImpl - CProxDisp implementation of IRpcProxy
+* CPDDispImpl - CProxDisp implementation of IDispatch
+*
+* CStubDisp -- the IDispatch stub class
+*
+*Revision History:
+*
+* [00] 24-Sep-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+#ifndef __dispps_h__
+#define __dispps_h__
+
+
+#pragma warning(4:4355)
+
+// forward declarations
+class FAR CProxDisp;
+class FAR CStubDisp;
+
+
+// IDispatch proxy class' IUnknown implementation
+class FAR CPDUnkImpl : public IUnknown
+{
+public:
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ CPDUnkImpl(CProxDisp FAR* pproxdisp);
+ ~CPDUnkImpl();
+
+private:
+ CProxDisp FAR* m_pproxdisp;
+};
+
+// IDispatch proxy class IRpcProxy implementation
+class FAR CPDProxImpl : public IPROXY
+{
+public:
+ CPDProxImpl(CProxDisp FAR* pproxdisp);
+ ~CPDProxImpl();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(Connect)(ICHANNEL FAR* plrpc);
+ STDMETHOD_(void, Disconnect)(void);
+
+private:
+ CProxDisp FAR* m_pproxdisp;
+};
+
+// IDispatch proxy class IDispatch implementation
+class FAR CPDDispImpl : public IDispatch
+{
+public:
+
+ CPDDispImpl(CProxDisp FAR* pproxdisp);
+ ~CPDDispImpl();
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IDispatch methods
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo);
+
+ STDMETHOD(GetTypeInfo)(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ STDMETHOD(SysKind)();
+
+private:
+ CProxDisp FAR* m_pproxdisp;
+ SYSKIND m_syskindStub;
+};
+
+// the IDispatch Proxy Class
+class FAR CProxDisp
+{
+public:
+ static IUnknown FAR* Create(IUnknown FAR* punkOuter, REFIID riid);
+
+private:
+ CProxDisp(IUnknown FAR* punkOuter, REFIID riid);
+ ~CProxDisp();
+
+ friend CPDUnkImpl;
+ friend CPDProxImpl;
+ friend CPDDispImpl;
+
+ CPDUnkImpl m_unk;
+ CPDProxImpl m_proxy;
+ CPDDispImpl m_disp;
+ GUID m_dispInterface;
+
+private:
+ unsigned long m_refs;
+ ICHANNEL FAR* m_plrpc;
+ IUnknown FAR* m_punkOuter;
+};
+
+// IDispatch Stub Class
+//
+class FAR CStubDisp : public ISTUB
+{
+public:
+ static HRESULT Create(IUnknown FAR* punkServer,
+#if (defined(WIN32) || defined(WOW))
+ REFIID riid,
+#endif
+ ISTUB FAR* FAR* ppstub);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IRpcStub methods
+ //
+#if (OE_WIN32 || defined(WOW))
+ STDMETHOD(Connect)(IUnknown FAR* pUnk);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg,
+ IRpcChannelBuffer FAR* pRpcChannel);
+ STDMETHOD_(IRpcStubBuffer *, IsIIDSupported)(REFIID iid);
+ STDMETHOD_(ULONG, CountRefs)(void);
+ STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv);
+ STDMETHOD_(void, DebugServerRelease)(void FAR* pv);
+#else
+ STDMETHOD(Connect)(IUnknown FAR* punkObject);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(
+ REFIID riid,
+ int imeth,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx);
+#if OE_MAC
+ STDMETHOD_(unsigned long, IsIIDSupported)(REFIID riid);
+#else
+ STDMETHOD_(BOOL, IsIIDSupported)(REFIID riid);
+#endif
+ STDMETHOD_(unsigned long, CountRefs)(void);
+#endif
+
+private:
+ CStubDisp(void);
+ ~CStubDisp(void);
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punkObj;
+ IDispatch FAR* m_pdispObj;
+#if (defined(WIN32) || defined(WOW))
+ IID m_iid;
+#endif
+};
+
+
+// IDispatch method indices
+//
+#define IMETH_QUERYINTERFACE 0 /* Placeholder */
+#define IMETH_ADDREF 1 /* Placeholder */
+#define IMETH_RELEASE 2 /* Placeholder */
+#define IMETH_GETTYPEINFOCOUNT 3
+#define IMETH_GETTYPEINFO 4
+#define IMETH_GETIDSOFNAMES 5
+#define IMETH_INVOKE 6
+#define IMETH_SYSKIND 7
+
+
+// the following structure is used to marshal the parameters
+// for IDispatch::Invoke().
+//
+typedef struct tagMARSHAL_INVOKE MARSHAL_INVOKE;
+struct tagMARSHAL_INVOKE {
+ DISPID dispidMember;
+ LCID lcid;
+ unsigned long cArgs;
+ unsigned long cNamedArgs;
+ unsigned short wFlags;
+ unsigned char flags;
+};
+
+#define MARSHAL_INVOKE_fHasResult 0x02
+#define MARSHAL_INVOKE_fHasExcepinfo 0x04
+#define MARSHAL_INVOKE_fHasArgErr 0x08
+
+
+// IDispatch proxy routines -
+// used by both the IDispatch proxy class and the Universal proxy class
+
+HRESULT ProxyGetTypeInfoCount(ICHANNEL FAR* plrpc,
+ SYSKIND syskindStub,
+ unsigned int FAR* pctinfo);
+
+HRESULT ProxyGetTypeInfo(ICHANNEL FAR* plrpc,
+ SYSKIND syskindStub,
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+HRESULT ProxyGetIDsOfNames(ICHANNEL FAR* plrpc,
+ SYSKIND syskindStub,
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+HRESULT ProxyInvoke(ICHANNEL FAR* plrpc,
+ SYSKIND syskindStub,
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+// IDispatch Stub routines -
+// Used by both the IDispatch stub class, and the Universal stub class
+
+HRESULT StubGetTypeInfoCount(IDispatch FAR* pdisp, IStream FAR* pstm);
+HRESULT StubGetTypeInfo(IDispatch FAR* pdisp, IStream FAR* pstm);
+HRESULT StubGetIDsOfNames(IDispatch FAR* pdisp, IStream FAR* pstm);
+HRESULT StubInvoke(IDispatch FAR* pdisp, IStream FAR* pstm);
+
+#endif __dispps_h__
diff --git a/private/oleauto/src/dispatch/dispstrm.cpp b/private/oleauto/src/dispatch/dispstrm.cpp
new file mode 100644
index 000000000..c048f4751
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispstrm.cpp
@@ -0,0 +1,375 @@
+//+-------------------------------------------------------------------------
+//
+// Microsoft Windows
+// Copyright (C) Microsoft Corporation, 1992 - 1993.
+//
+// File: dipstrm.cpp
+//
+// Classes: CStreamOnBuffer
+//
+//--------------------------------------------------------------------------
+
+#include <oledisp.h>
+#include <dispmrsh.h>
+#include <dispstrm.h>
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+ASSERTDATA
+
+#if OE_WIN16
+#define HMEMCPY(DST, SRC, SIZE) hmemcpy(DST, SRC, SIZE)
+#else //OE_WIN16
+#define HMEMCPY(DST, SRC, SIZE) memcpy(DST, SRC, (size_t)SIZE)
+#endif //OE_WIN16
+
+CStreamOnBuffer::CStreamOnBuffer(ICHANNEL *pRpcChannel,
+ RPCOLEMESSAGE *pMessage,
+ REFIID riid,
+ ULONG iMeth)
+ : _refCount(1), _pMessage(pMessage),
+ _pRpcChannel(pRpcChannel)
+{
+ _riid = riid;
+ _pmalloc = NULL; // no iMalloc yet.
+
+ // write to an IMalloc'ed buffer (alloc'ed later on)
+ _writeBuffer = NULL; // no buffer allocated yet
+ _cbWriteBuffer = 0; // no data yet
+
+
+ // hack to see if we are being called from the proxy or the stub
+ if (iMeth != 0xffffffff) { // proxy side
+
+ // prepare the message packet
+ memset(_pMessage, 0, sizeof(RPCOLEMESSAGE));
+ _pMessage->dataRepresentation = NDR_LOCAL_DATA_REPRESENTATION;
+ _pMessage->iMethod = iMeth;
+ //_pMessage.cbBuffer = size; set to exact size later on
+
+ // can't read/write yet.
+ _buffer = NULL; // no current pointer yet
+ _cbBuffer = 0;
+
+ } else { // stub side
+ // can start reading right away. Read directly out of the
+ // incoming message buffer.
+ _buffer = (unsigned char FAR*)_pMessage->Buffer;
+ _cbBuffer = _pMessage->cbBuffer;
+ }
+ _bufferBase = _buffer; // starting offset of buffer
+}
+
+
+CStreamOnBuffer::~CStreamOnBuffer()
+{
+
+ // free any malloc'ed write buffer
+ if (_writeBuffer)
+ _pmalloc->Free(_writeBuffer);
+
+ // DON'T release the _pmalloc -- it wasn't addref'ed
+}
+
+
+STDMETHODIMP CStreamOnBuffer::QueryInterface( REFIID riid, LPVOID FAR* ppvObj)
+{
+ *ppvObj = NULL;
+ if (IsEqualIID(riid, IID_IUnknown))
+ *ppvObj = (IUnknown *) this;
+ else if (IsEqualIID(riid, IID_IStream))
+ *ppvObj = (IStream *) this;
+ else
+ return ResultFromScode(E_NOINTERFACE);
+
+ AddRef();
+ return ResultFromScode(S_OK);
+}
+
+
+STDMETHODIMP_(ULONG) CStreamOnBuffer::AddRef( THIS )
+{
+ return _refCount += 1;
+}
+
+
+STDMETHODIMP_(ULONG) CStreamOnBuffer::Release( THIS )
+{
+ _refCount -= 1;
+ if (_refCount == 0)
+ {
+ _pRpcChannel->FreeBuffer(_pMessage);
+ delete this;
+ return 0;
+ }
+ else
+ return _refCount;
+
+}
+
+
+STDMETHODIMP CStreamOnBuffer::Read(THIS_ VOID HUGEP *pv,
+ ULONG cb, ULONG *pcbRead)
+{
+
+ // must have set ourselves up for reading, or else we're in trouble....
+ ASSERT(_bufferBase == (unsigned char HUGEP*)_pMessage->Buffer);
+ ASSERT(_buffer != 0);
+
+ // verify that our message buffer isn't overrunned (shouldn't ever happen)
+ if (((char FAR*)_buffer + cb) > ((char FAR*)_pMessage->Buffer + _pMessage->cbBuffer)) {
+ ASSERT(FALSE);
+ return RESULT(RPC_E_INVALID_DATAPACKET);
+ }
+
+ // read data out of our local buffer
+ HMEMCPY( pv, _buffer, cb );
+ _buffer = _buffer + cb;
+
+ if (pcbRead != NULL)
+ *pcbRead = cb;
+ return ResultFromScode(S_OK);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::Write(THIS_ VOID const HUGEP *pv,
+ ULONG cb,
+ ULONG *pcbWritten)
+{
+ ULONG size;
+
+ // verify that our local buffer isn't overrunned
+ if ((_buffer + cb) > (_bufferBase + _cbBuffer)) {
+ if (_bufferBase == _writeBuffer) {
+ // if we're writing, then we can grow our buffer
+ size = _cbWriteBuffer*2; // guess at doubling our size
+ if ((_buffer + cb) > (_writeBuffer + size))
+ size = _cbWriteBuffer + cb; // if it won't fit into the doubled value
+ IfFailRet(ResizeBuffer(size));
+ } else {
+ // writing into our read buffer (wierd, but CoUnMarshalInterface does
+ // this). Better not have to grow the buffer!
+ ASSERT(FALSE);
+ return RESULT(RPC_E_INVALID_DATAPACKET);
+ }
+ }
+
+ // put the data into our local buffer
+ HMEMCPY(_buffer, pv, cb );
+ _buffer = _buffer + cb;
+ if (pcbWritten != NULL)
+ *pcbWritten = cb;
+ return ResultFromScode(S_OK);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::Seek(THIS_ LARGE_INTEGER dlibMove,
+ DWORD dwOrigin,
+ ULARGE_INTEGER *plibNewPosition)
+{
+ ULONG pos;
+
+ // Verify that the offset isn't out of range.
+ if (dlibMove.HighPart != 0)
+ return ResultFromScode( E_FAIL );
+
+ // Determine the new seek pointer.
+ switch (dwOrigin)
+ {
+ case STREAM_SEEK_SET:
+ pos = dlibMove.LowPart;
+ break;
+
+ case STREAM_SEEK_CUR:
+ /* Must use signed math here. */
+ pos = _buffer - _bufferBase;
+ if ((long) dlibMove.LowPart < 0 &&
+ pos < (unsigned long) - (long) dlibMove.LowPart)
+ return ResultFromScode( E_FAIL );
+ pos += (long) dlibMove.LowPart;
+ break;
+
+ case STREAM_SEEK_END:
+ return ResultFromScode(E_NOTIMPL);
+ break;
+
+ default:
+ return ResultFromScode( E_FAIL );
+ }
+
+ // Set the seek pointer.
+ _buffer = _bufferBase + pos;
+ if (plibNewPosition != NULL)
+ {
+ plibNewPosition->LowPart = pos;
+ plibNewPosition->HighPart = 0;
+ }
+ return ResultFromScode(S_OK);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::SetSize(THIS_ ULARGE_INTEGER libNewSize)
+{
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::CopyTo(THIS_ IStream *pstm,
+ ULARGE_INTEGER cb,
+ ULARGE_INTEGER *pcbRead,
+ ULARGE_INTEGER *pcbWritten)
+{
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::Commit(THIS_ DWORD grfCommitFlags)
+{
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::Revert(THIS)
+{
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::LockRegion(THIS_ ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType)
+{
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+
+STDMETHODIMP CStreamOnBuffer::UnlockRegion(THIS_ ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType)
+{
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::Stat(THIS_ STATSTG *pstatstg, DWORD grfStatFlag)
+{
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::Clone(THIS_ IStream * *ppstm)
+{
+ return ResultFromScode(E_NOTIMPL);
+}
+
+
+STDMETHODIMP CStreamOnBuffer::Call( THIS )
+{
+ DWORD status;
+ HRESULT hresult;
+
+ ULONG cbSend;
+
+ // create the minimum size buffer
+ cbSend = (_buffer - _writeBuffer); // # of bytes to write
+
+ _pMessage->cbBuffer = max(cbSend, 16); // get the buffer & copy data into it
+ // zero-length buffers seem to be flakey
+ IfFailRet(_pRpcChannel->GetBuffer(_pMessage, _riid));
+ ASSERT(_pMessage->cbBuffer >= cbSend);
+
+ HMEMCPY(_pMessage->Buffer, _writeBuffer, cbSend);
+
+ // write the data, get the resulting data back.
+ hresult = _pRpcChannel->SendReceive(_pMessage, &status);
+ if (hresult != NOERROR) {
+ _pMessage->Buffer = NULL; // so we don't crash on FreeBuffer
+ return hresult;
+ }
+
+ // now switch over to read mode. We read directly out of the message buffer.
+ _buffer = (unsigned char FAR*)_pMessage->Buffer;
+ _cbBuffer = _pMessage->cbBuffer;
+ _bufferBase = _buffer;
+
+ // CONSIDER: throw away our malloc'ed buffer now (gets tossed later, but
+ // CONSIDER: we're done with it now).
+
+ return NOERROR;
+}
+
+
+// called from the stub side when it is done reading and wants to write
+STDMETHODIMP CStreamOnBuffer::RewindBuffer( THIS_)
+{
+ HRESULT hresult;
+ ULONG cbWriteBuffer;
+
+ // alloc a separate buffer so we can pass all our data back to the proxy
+ _buffer = NULL; // not reading anymore
+ ASSERT(_writeBuffer == NULL); // haven't written yet
+ // having both of these NULL will cause ResizeBuffer to alloc
+ // a new write buffer, and position us at the front.
+
+ // Start our write buffer at the size of the incoming RPC buffer (just
+ // an arbitrary guess). The incoming size may be zero, hence the 'max' check.
+ cbWriteBuffer = max(_pMessage->cbBuffer, 16);
+
+ hresult = ResizeBuffer(cbWriteBuffer); // alloc the write buffer
+ ASSERT(_buffer == _writeBuffer);
+ return hresult;
+}
+
+// called from the stub side when it is done writing, before the stream
+// is destroyed.
+STDMETHODIMP CStreamOnBuffer::ResetBuffer( THIS )
+{
+ ULONG cbSend;
+
+ ASSERT(_writeBuffer != NULL);
+ cbSend = (_buffer - _writeBuffer);
+
+ // get a new buffer to talk to the proxy.
+ _pMessage->cbBuffer = max(cbSend, 16); // get the buffer & copy data into it
+ // zero-length buffers seem to be flakey
+ IfFailRet(_pRpcChannel->GetBuffer(_pMessage, _riid));
+ ASSERT(_pMessage->cbBuffer >= cbSend);
+
+ // copy the data into the stream
+ HMEMCPY(_pMessage->Buffer, _writeBuffer, cbSend);
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP CStreamOnBuffer::ResizeBuffer( THIS_ ULONG cbNew)
+{
+ void HUGEP* buffer;
+ ULONG oldOffset;
+
+ if (_pmalloc == NULL) {
+ // NOTE: this does not addref the malloc pointer
+ IfFailRet(GetMalloc(&_pmalloc));
+ // the realloc below is supposed to do Alloc if it the input parm is NULL.
+ }
+
+ ASSERT(cbNew != 0); // realloc(NULL) means free -- our caller should
+ // have checked for this condition.
+
+ // save current offset into buffer
+ oldOffset = _buffer - _writeBuffer;
+
+ buffer = _pmalloc->Realloc(_writeBuffer, cbNew);
+ if (buffer == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ _writeBuffer = (unsigned char *)buffer; // point to new block
+ _cbWriteBuffer = cbNew;
+ _bufferBase = _writeBuffer; // new base pointer
+ _cbBuffer = _cbWriteBuffer;
+ _buffer = _writeBuffer + oldOffset; // update current pointer
+
+ return ResultFromScode(S_OK);
+}
diff --git a/private/oleauto/src/dispatch/dispstrm.h b/private/oleauto/src/dispatch/dispstrm.h
new file mode 100644
index 000000000..bc0630279
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispstrm.h
@@ -0,0 +1,78 @@
+//+-------------------------------------------------------------------------
+//
+// Microsoft Windows
+// Copyright (C) Microsoft Corporation, 1992 - 1993.
+//
+// File: dispstrm.h
+//
+// Contents: Private header file for layering IStream on top of
+// IRpcChannelBuffer
+//
+//
+//--------------------------------------------------------------------------
+#ifndef __dispstrm_h__
+#define __dispstrm_h__
+
+
+#pragma warning(4:4355)
+
+class CStreamOnBuffer : public IStream
+{
+
+ public:
+
+ // IUnknown Methods
+ STDMETHOD (QueryInterface) ( THIS_ REFIID riid, LPVOID FAR* ppvObj);
+ STDMETHOD_(ULONG,AddRef) ( THIS );
+ STDMETHOD_(ULONG,Release) ( THIS );
+
+ // IStream Methods
+ STDMETHOD (Read) (THIS_ VOID HUGEP *pv,
+ ULONG cb, ULONG *pcbRead) ;
+ STDMETHOD (Write) (THIS_ VOID const HUGEP *pv,
+ ULONG cb,
+ ULONG *pcbWritten) ;
+ STDMETHOD (Seek) (THIS_ LARGE_INTEGER dlibMove,
+ DWORD dwOrigin,
+ ULARGE_INTEGER *plibNewPosition) ;
+ STDMETHOD (SetSize) (THIS_ ULARGE_INTEGER libNewSize) ;
+ STDMETHOD (CopyTo) (THIS_ IStream *pstm,
+ ULARGE_INTEGER cb,
+ ULARGE_INTEGER *pcbRead,
+ ULARGE_INTEGER *pcbWritten) ;
+ STDMETHOD (Commit) (THIS_ DWORD grfCommitFlags) ;
+ STDMETHOD (Revert) (THIS) ;
+ STDMETHOD (LockRegion) (THIS_ ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType) ;
+ STDMETHOD (UnlockRegion) (THIS_ ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType) ;
+ STDMETHOD (Stat) (THIS_ STATSTG *pstatstg, DWORD grfStatFlag) ;
+ STDMETHOD (Clone) (THIS_ IStream * *ppstm) ;
+
+ CStreamOnBuffer( ICHANNEL *pRpcChannel,
+ RPCOLEMESSAGE *pMessage,
+ REFIID riid,
+ ULONG iMeth);
+ ~CStreamOnBuffer();
+
+ STDMETHOD (Call) ();
+ STDMETHOD (ResetBuffer) ();
+ STDMETHOD (ResizeBuffer) (ULONG size);
+ STDMETHOD (RewindBuffer) ();
+
+
+ unsigned char HUGEP *_writeBuffer;
+ ULONG _cbWriteBuffer;
+ unsigned char HUGEP *_bufferBase;
+ unsigned char HUGEP *_buffer;
+ ULONG _cbBuffer;
+ IMalloc *_pmalloc;
+ RPCOLEMESSAGE *_pMessage;
+ ICHANNEL *_pRpcChannel;
+ ULONG _refCount;
+ GUID _riid;
+};
+
+#endif //__dispstrm_h__
diff --git a/private/oleauto/src/dispatch/dispstub.cpp b/private/oleauto/src/dispatch/dispstub.cpp
new file mode 100644
index 000000000..082d6b8cb
--- /dev/null
+++ b/private/oleauto/src/dispatch/dispstub.cpp
@@ -0,0 +1,803 @@
+/***
+*dispstub.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the custom 'stub', remoting support for
+* the IDispatch interface.
+*
+*Revision History:
+*
+* [00] 18-Sep-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+* There are assumptions in the following marshaling code that the
+* endianness of the caller and callee are the same.
+*
+* The difference between the IDispatch vs. IDispatchW implementation
+* is a parameterized type. Unfortunately, C7/C8 doesn't support C++
+* templates, hence the near duplication of code between the IDispatch
+* and IDispatchW stub implementation (as well as common code between the
+* stubs of IDispatch & ITypeLib/ITypeInfo).
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "dispps.h"
+
+ASSERTDATA
+
+CStubDisp::CStubDisp()
+{
+ m_refs = 0;
+ m_punkObj = NULL;
+ m_pdispObj = NULL;
+#if (defined(WIN32) || defined(WOW))
+ m_iid = IID_NULL;
+#endif
+}
+
+CStubDisp::~CStubDisp()
+{
+ Disconnect();
+}
+
+HRESULT
+CStubDisp::Create(IUnknown FAR* punkServer,
+#if (defined(WIN32) || defined(WOW))
+ REFIID riid,
+#endif
+ ISTUB FAR* FAR* ppstub)
+{
+ CStubDisp FAR* pstub;
+
+ if((pstub = new FAR CStubDisp()) != NULL){
+ pstub->AddRef();
+ *ppstub = pstub;
+#if (defined(WIN32) || defined(WOW))
+ pstub->m_iid = riid;
+#endif
+ if (punkServer)
+ return pstub->Connect(punkServer);
+ return NOERROR;
+ }
+ return RESULT(E_OUTOFMEMORY);
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CStubDisp::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else if(IsEqualIID(riid, IID_ISTUB)){
+ *ppv = this;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ ++m_refs;
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubDisp::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubDisp::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IRpcStub Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CStubDisp::Connect(IUnknown FAR* punkObj)
+{
+#if (defined(WIN32) || defined(WOW))
+ ASSERT(m_punkObj == NULL && m_pdispObj == NULL);
+ //This will keep the server object alive until we disconnect.
+ IfFailRet(punkObj->QueryInterface(m_iid, (void FAR* FAR*)&m_pdispObj));
+ punkObj->AddRef();
+ m_punkObj = punkObj;
+ return NOERROR;
+#else
+ if(m_punkObj)
+ return RESULT(E_FAIL); // call Disconnect first
+
+ if (punkObj) {
+ punkObj->AddRef();
+ m_punkObj = punkObj;
+ }
+ return NOERROR;
+#endif
+}
+
+
+STDMETHODIMP_(void)
+CStubDisp::Disconnect()
+{
+ if(m_punkObj){
+ m_punkObj->Release();
+ m_punkObj = NULL;
+ }
+ if(m_pdispObj){
+ m_pdispObj->Release();
+ m_pdispObj = NULL;
+ }
+}
+
+PRIVATE_(HRESULT)
+DispatchGetSysKind(IStream FAR* pstm)
+{
+ unsigned long _sysKind;
+
+ REWIND_STREAM(pstm);
+
+ _sysKind = (unsigned long) SYS_CURRENT;
+ IfFailRet(PUT(pstm, _sysKind));
+
+ return NOERROR;
+}
+
+/***
+*PRIVATE HRESULT StubGetTypeInfoCount(IDispatch*, IStream*)
+*Purpose:
+*
+* In:
+* <nothing>
+*
+* Out:
+* <HRESULT = return value>
+* <unsigned int = ctinfo>
+*
+*Entry:
+* pdisp =
+* pstm =
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+StubGetTypeInfoCount(IDispatch FAR* pdisp, IStream FAR* pstm)
+{
+ unsigned int ctinfo;
+ unsigned long _ctinfo;
+ HRESULT hresultRet;
+
+ hresultRet = pdisp->GetTypeInfoCount(&ctinfo);
+
+ REWIND_STREAM(pstm);
+
+ IfFailRet(DispMarshalHresult(pstm, hresultRet));
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _ctinfo = ctinfo;
+ IfFailRet(PUT(pstm, _ctinfo));
+
+ return NOERROR;
+}
+
+
+/***
+*PRIVATE HRESULT StubGetTypeInfo(IDispatch*, IStream*)
+*Purpose:
+*
+* In:
+* <unsigned int = itinfo>
+* <LCID = lcid>
+*
+* Out:
+* <HRESULT = return value>
+* <ITypeInfo* = pptinfo>
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+HRESULT
+StubGetTypeInfo(IDispatch FAR* pdisp, IStream FAR* pstm)
+{
+ LCID lcid;
+ unsigned int itinfo;
+ unsigned long _itinfo;
+ ITypeInfo FAR* ptinfo;
+ HRESULT hresult, hresultRet;
+
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(pstm, _itinfo), LExit);
+ itinfo = (unsigned int) _itinfo;
+
+ IfFailGo(GET(pstm, lcid), LExit);
+
+ hresultRet = pdisp->GetTypeInfo(itinfo, lcid, &ptinfo);
+
+ IfFailGo(REWIND_STREAM(pstm), LExit2);
+
+ IfFailGo(DispMarshalHresult(pstm, hresultRet), LExit2);
+
+ if(HRESULT_SUCCESS(hresultRet)){
+ // dont bother marhshaling the interface ptr unless the
+ // GetTypeInfo call succeeded.
+ //
+ hresult = DispMarshalInterface(pstm, IID_ITypeInfo, ptinfo);
+ }
+
+LExit2:
+ if(hresultRet == NOERROR)
+ ptinfo->Release();
+
+LExit:;
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT StubGetIDsOfNames(IDispatch*, IStream*)
+*
+*Purpose:
+*
+* In:
+* <REFIID = riid>
+* <LCID = lcid>
+* <unsigned int = cNames>
+* [(len,sz)]+
+*
+* Out:
+* <HRESULT = return value>
+* [DISPID]+
+*
+*Entry:
+* pdisp =
+* pstm =
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+StubGetIDsOfNames(IDispatch FAR* pdisp, IStream FAR* pstm)
+{
+ IID iid;
+ LCID lcid;
+ int iAlloc;
+ unsigned long len;
+ //REFIID riid = iid;
+ DISPID FAR* rgdispid;
+ unsigned int cNames;
+ OLECHAR FAR* FAR* rgszNames;
+ HRESULT hresult, hresultRet;
+ unsigned long _proxySysKind;
+ unsigned long _cNames;
+ unsigned int iName;
+
+ IfFailGo(GET(pstm, _proxySysKind), LExit);
+
+ IfFailGo(pstm->Read((void FAR*)&iid, sizeof(IID), NULL), LExit);
+
+ IfFailGo(GET(pstm, lcid), LExit);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(pstm, _cNames), LExit);
+ cNames = (unsigned int) _cNames;
+
+ if((rgdispid = new FAR DISPID[cNames]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LExit;
+ }
+
+ if((rgszNames = new FAR OLECHAR FAR* [cNames]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LFreeRGID;
+ }
+
+ iAlloc = -1;
+
+#if OE_WIN32 /* enable 16/32 interoperablity support */
+ if ((SYSKIND) _proxySysKind == SYS_WIN16) {
+ char buf[128];
+ char *pBuf = buf;
+
+ for(iName = 0; iName<cNames; ++iName){
+ IfFailGo(GET(pstm, len), LFree);
+
+ // optimization for names under 128 bytes
+ if (len > 128) {
+ if ((pBuf = new FAR char [len]) == NULL) {
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LFree;
+ }
+ }
+
+ // Get ANSI string from stream and convert it to UNICODE
+ IfFailGo(pstm->Read((void FAR*) pBuf, len, NULL), LFree);
+ IfFailGo(ConvertStringToW(pBuf, &rgszNames[iName]), LFree);
+
+ // remember how far we got so we can unwind allocations on exit
+ ++iAlloc;
+
+ if (len > 128)
+ delete pBuf;
+ }
+ } else
+#endif
+ {
+ for(iName = 0; iName<cNames; ++iName){
+ IfFailGo(GET(pstm, len), LFree);
+
+ if((rgszNames[iName] = new FAR OLECHAR [CHLEN(len)]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LFree;
+ }
+
+ // remember how far we got so we can unwind allocations on exit
+ ++iAlloc;
+
+ IfFailGo(pstm->Read((void FAR*) rgszNames[iName], len, NULL), LFree);
+ }
+
+ }
+
+ hresultRet = pdisp->GetIDsOfNames(iid, rgszNames, cNames, lcid, rgdispid);
+
+ IfFailGo(REWIND_STREAM(pstm), LFree);
+
+ IfFailGo(DispMarshalHresult(pstm, hresultRet), LFree);
+
+ unsigned int i;
+ for(i=0; i<cNames; ++i)
+ IfFailGo(pstm->Write(&rgdispid[i], sizeof(rgdispid[0]), NULL), LFree);
+
+ hresult = NOERROR;
+
+LFree:;
+ for(; iAlloc >= 0; --iAlloc)
+ delete rgszNames[iAlloc];
+ delete rgszNames;
+
+LFreeRGID:;
+ delete rgdispid;
+
+LExit:;
+ return hresult;
+}
+
+
+/***
+*PRIVATE HRESULT StubInvoke(IDispatch*, IStream*)
+*
+*Purpose:
+* Read the marshalled Invoke parameters from the given stream,
+* repackage them and pass them onto the Invoke member of the given
+* IDispatch interface pointer.
+*
+* Then reset the stream, gather the results of the Invoke call and
+* marshal them back into the given stream to be returned to the cross
+* process caller.
+*
+* Marshaling format for IDispatch::Invoke()
+*
+* In:
+* <struct MARSHAL_INVOKE>
+* <IID iid>
+* <arguments>*
+* <name DISPIDs>*
+* <VARIANT varResult>?
+* <EXCEPINFO excepinfo>?
+* <unsigned int uArgErr>?
+*
+* Out:
+* <HRESULT = return value>
+* <Out params>?
+* <VARIANT varResult>?
+* <EXCEPINFO excepinfo>?
+* <unsigned int uArgErr>?
+*
+*Entry:
+* pdisp = the IDispatch* to invoke on
+* pstm = the stream containing the marshaled actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+StubInvoke(IDispatch FAR* pdisp, IStream FAR* pstm)
+{
+ unsigned int i;
+ IID iid;
+ //REFIID riid = iid; // WIN32 bug, references a temp object of class GUID
+ MARSHAL_INVOKE mi;
+ VARTYPE FAR* rgvtSaved;
+ DISPPARAMS dispparams;
+ HRESULT hresult, hresultRet;
+ unsigned long _uArgErr;
+ unsigned int FAR* puArgErr;
+ EXCEPINFO excepinfo, FAR* pexcepinfo;
+ VARIANT varResult, FAR* pvarResult;
+ VARIANTARG FAR* rgvargRef, FAR* pvarg;
+ unsigned long _proxySysKind;
+
+ rgvtSaved = NULL;
+ rgvargRef = NULL;
+ dispparams.rgvarg = (VARIANTARG FAR*)NULL;
+ dispparams.rgdispidNamedArgs = (DISPID FAR*)NULL;
+
+ // read the System Kind
+ //
+ IfFailGo(GET(pstm, _proxySysKind), LExit);
+
+ // read the MARSHAL_INTERFACE struct.
+ //
+ IfFailGo(GET(pstm, mi), LExit);
+
+ // Read the interface ID if it was non-null.
+ //
+ IfFailGo(pstm->Read((void FAR*)&iid, sizeof(IID), NULL), LExit);
+
+ if(mi.cArgs > 0){
+ if((rgvtSaved = new FAR VARTYPE[mi.cArgs]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LExit;
+ }
+
+ // Allocate the max possible space required to hold the ByRef values.
+ // (this is cArgs * sizeof(VARIANTARG) in the case that each rgvarg
+ // entry is a VT_VARIANT).
+ //
+ if((rgvargRef = new FAR VARIANTARG[mi.cArgs]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LFreeRgVtSaved;
+ }
+
+ // init the ByRef arg array
+ for(pvarg = rgvargRef; pvarg < &rgvargRef[mi.cArgs]; ++pvarg)
+ V_VT(pvarg) = VT_EMPTY;
+
+ if((dispparams.rgvarg = new FAR VARIANTARG[mi.cArgs]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LFreeRgVargRef;
+ }
+
+ // read pdispparams->rgvarg[]
+ //
+ for(unsigned int i = 0; i < mi.cArgs; ++i){
+ IfFailGo(
+ VariantRead(pstm,
+ &dispparams.rgvarg[i],
+ &rgvargRef[i],
+ (SYSKIND) _proxySysKind),
+ LFreeRgVarg);
+
+ // stash away the passed-in vartype so we can verify later
+ // that the callee did not hammer the rgvarg arrary.
+ //
+ rgvtSaved[i] = V_VT(&dispparams.rgvarg[i]);
+ }
+ }
+
+ // read the named parameter DISPIDs
+ //
+ if(mi.cNamedArgs > 0){
+ dispparams.rgdispidNamedArgs = new FAR DISPID[mi.cNamedArgs];
+ if(dispparams.rgdispidNamedArgs == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LFreeRgVarg;
+ }
+ IfFailGo(
+ pstm->Read(
+ dispparams.rgdispidNamedArgs,
+ mi.cNamedArgs * sizeof(dispparams.rgdispidNamedArgs[0]), NULL),
+ LFree);
+ }
+
+ dispparams.cArgs = (unsigned int)mi.cArgs;
+ dispparams.cNamedArgs = (unsigned int)mi.cNamedArgs;
+
+ if((mi.flags & MARSHAL_INVOKE_fHasResult) == 0){
+ pvarResult = NULL;
+ }else{
+ pvarResult = &varResult;
+ IfFailGo(VariantRead(pstm, pvarResult, NULL, (SYSKIND) _proxySysKind), LFree);
+ }
+
+ if((mi.flags & MARSHAL_INVOKE_fHasExcepinfo) == 0){
+ pexcepinfo = NULL;
+ }else{
+ pexcepinfo = &excepinfo;
+ IfFailGo(ExcepinfoRead(pstm, pexcepinfo, (SYSKIND) _proxySysKind), LFree);
+ }
+
+ if((mi.flags & MARSHAL_INVOKE_fHasArgErr) == 0){
+ puArgErr = NULL;
+ }else{
+ puArgErr = (unsigned int FAR*)&_uArgErr;
+ IfFailGo(GET(pstm, _uArgErr), LFree);
+ }
+
+
+ hresultRet = pdisp->Invoke(
+ mi.dispidMember,
+ iid,
+ mi.lcid,
+ mi.wFlags,
+ &dispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+
+
+ // verify that the callee didnt hammer the rgvarg array.
+ for(i = 0; i < mi.cArgs; ++i){
+ if(V_VT(&dispparams.rgvarg[i]) != rgvtSaved[i]){
+ hresult = RESULT(DISP_E_BADCALLEE);
+ goto LFree;
+ }
+ }
+
+ IfFailGo(REWIND_STREAM(pstm), LFree);
+
+ // write the return value
+ //
+ IfFailGo(DispMarshalHresult(pstm, hresultRet), LFree);
+
+ // write back the ByRef params, freeing them as we go.
+ //
+ for(pvarg = dispparams.rgvarg;
+ pvarg < &dispparams.rgvarg[mi.cArgs]; ++pvarg)
+ {
+ if(V_ISBYREF(pvarg))
+ IfFailGo(VariantWrite(pstm, pvarg, (SYSKIND) _proxySysKind), LFree);
+ hresult = VariantClear(pvarg);
+ ASSERT(hresult == NOERROR);
+ }
+
+ if(mi.flags & MARSHAL_INVOKE_fHasResult){
+ // make sure the callee doesnt try to return a reference
+ if(V_ISBYREF(pvarResult)){
+ hresult = RESULT(DISP_E_BADCALLEE);
+ goto LFree;
+ }
+ IfFailGo(VariantWrite(pstm, pvarResult, (SYSKIND) _proxySysKind), LFree);
+ VariantClear(pvarResult);
+ }
+
+ if(mi.flags & MARSHAL_INVOKE_fHasExcepinfo){
+ IfFailGo(ExcepinfoWrite(pstm, pexcepinfo, (SYSKIND) _proxySysKind), LFree);
+ SysFreeString(pexcepinfo->bstrSource);
+ SysFreeString(pexcepinfo->bstrDescription);
+ SysFreeString(pexcepinfo->bstrHelpFile);
+ }
+
+ if(mi.flags & MARSHAL_INVOKE_fHasArgErr)
+ IfFailGo(PUT(pstm, _uArgErr), LFree);
+
+ hresult = NOERROR;
+
+LFree:;
+ delete dispparams.rgdispidNamedArgs;
+
+LFreeRgVarg:;
+ delete dispparams.rgvarg;
+
+LFreeRgVargRef:;
+ if(rgvargRef != NULL){
+ // clear the contents of the ByRef varg array
+ for(pvarg = rgvargRef; pvarg < &rgvargRef[mi.cArgs]; ++pvarg)
+ if(V_VT(pvarg) != VT_EMPTY) // speedup
+ VariantClear(pvarg);
+ delete rgvargRef;
+ }
+
+LFreeRgVtSaved:;
+ delete rgvtSaved;
+
+LExit:;
+ return hresult;
+}
+
+
+/***
+*HRESULT CStubDisp::Invoke(REFIID, int, IStream*, unsigned long, void*)
+*
+*Purpose:
+* Dispatch the method with the given index (iMethod) on the given
+* interface, using the arguments serialized in the given stream.
+*
+* This function is the callee side of an LRPC call.
+*
+*Entry:
+* riid = the IID of the interface on which we are to make the call
+* iMethod = the method index
+* pstm = the IStream containing the method's actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CStubDisp::Invoke(
+#if (OE_WIN32 || defined(WOW))
+ RPCOLEMESSAGE *pMessage,
+ ICHANNEL *pRpcChannel)
+{
+ HRESULT hresult;
+ IStream FAR* pstm;
+
+ if(!m_punkObj)
+ return RESULT(E_FAIL);
+
+ OPEN_STUB_STREAM(pstm, pRpcChannel, pMessage, IID_IDispatch);
+
+#else
+ REFIID riid,
+ int iMethod,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx)
+
+{
+ HRESULT hresult;
+
+ UNUSED(dwDestCtx);
+ UNUSED(pvDestCtx);
+
+
+ if(!IsEqualIID(riid,IID_IDispatch))
+ return RESULT(E_NOINTERFACE);
+
+ if(!m_punkObj)
+ return RESULT(E_FAIL);
+
+ if(m_pdispObj == NULL)
+ IfFailRet(m_punkObj->QueryInterface(riid, (void FAR* FAR*)&m_pdispObj));
+
+#endif
+
+ switch(GET_IMETHOD(pMessage)){
+ case IMETH_GETTYPEINFOCOUNT:
+ hresult = StubGetTypeInfoCount(m_pdispObj, pstm);
+ break;
+
+ case IMETH_GETTYPEINFO:
+ hresult = StubGetTypeInfo(m_pdispObj, pstm);
+ break;
+
+ case IMETH_GETIDSOFNAMES:
+ hresult = StubGetIDsOfNames(m_pdispObj, pstm);
+ break;
+
+ case IMETH_INVOKE:
+ hresult = StubInvoke(m_pdispObj, pstm);
+ break;
+
+ case IMETH_SYSKIND:
+ hresult = DispatchGetSysKind(pstm);
+ break;
+
+ default:
+ hresult = INVALIDARG;
+ break;
+ }
+
+ RESET_STREAM(pstm);
+
+ DELETE_STREAM(pstm);
+
+ return hresult;
+}
+
+
+/***
+*IRpcStubBuffer * CStubDisp::IsIIDSupported(REFIID)
+*
+*Purpose:
+* Answer if the given IID is supported by this stub.
+*
+*Entry:
+* riid = the IID to query for support
+*
+*Exit:
+* return value = IRpcStubBuffer
+*
+***********************************************************************/
+#if OE_MAC
+STDMETHODIMP_(unsigned long)
+#elif (OE_WIN32 || defined(WOW))
+STDMETHODIMP_(IRpcStubBuffer *)
+#else
+STDMETHODIMP_(BOOL)
+#endif
+CStubDisp::IsIIDSupported(REFIID riid)
+{
+#if (OE_WIN32 || defined(WOW))
+ IRpcStubBuffer *pStub = 0;
+ if (IsEqualIID(riid, IID_IDispatch)) {
+ AddRef();
+ pStub = (IRpcStubBuffer *) this;
+ }
+ return pStub;
+#else
+
+ // REVIEW: I don't understand this, but thats the way Ole does it...
+ if(m_punkObj == NULL)
+ return FALSE;
+
+ return(IsEqualIID(riid, IID_IDispatch));
+#endif
+}
+
+
+/***
+*unsigned long CStubDisp::CountRefs
+*Purpose:
+* Return a count of the object refs held by this stub.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long, the count of refs.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CStubDisp::CountRefs()
+{
+ unsigned long refs;
+
+ refs = 0;
+
+ if(m_punkObj != NULL)
+ ++refs;
+
+ if(m_pdispObj != NULL)
+ ++refs;
+
+ return refs;
+}
+
+
+#if (OE_WIN32 || defined(WOW))
+
+STDMETHODIMP
+CStubDisp::DebugServerQueryInterface(void FAR* FAR* ppv)
+{
+ *ppv = m_pdispObj;
+ return S_OK;
+}
+
+
+STDMETHODIMP_(void)
+CStubDisp::DebugServerRelease(void FAR* ppv)
+{
+
+}
+
+#endif
diff --git a/private/oleauto/src/dispatch/errinfo.cpp b/private/oleauto/src/dispatch/errinfo.cpp
new file mode 100644
index 000000000..39ee45efd
--- /dev/null
+++ b/private/oleauto/src/dispatch/errinfo.cpp
@@ -0,0 +1,680 @@
+/***
+*errinfo.cpp
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Implementation of the System Error Info objects and APIs.
+*
+*Revision History:
+*
+* [00] 18-May-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+ASSERTDATA
+
+#if !OE_WIN32
+//---------------------------------------------------------------------
+// CProcessInfo
+//---------------------------------------------------------------------
+
+PROCESSINFO NEARDATA pinfoCache; // declare per-process data cache
+#if OE_WIN16 || _X86_
+WORD NEARDATA uProcessID;
+#else
+DWORD NEARDATA uProcessID;
+#endif
+
+#if _X86_
+DWORD NEARDATA dwWin32sPID; // only valid if running under win32s
+#endif
+
+// CProcessInfo
+//
+// Per-thread data class.
+//
+class FAR CProcessInfo : public IUnknown
+{
+public:
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ CProcessInfo();
+ ~CProcessInfo();
+
+ PROCESSINFO m_info;
+
+private:
+ unsigned long m_cRefs;
+
+};
+
+CProcessInfo::CProcessInfo()
+{
+ m_cRefs = 0;
+ m_info.perrinfo = NULL;
+ m_info.pmalloc = NULL;
+#if OE_WIN16
+ m_info.hinstTypeLibDLL = NULL;
+ m_info.pfnLoadTypeLib = NULL;
+#endif //OE_WIN16
+}
+
+CProcessInfo::~CProcessInfo()
+{
+#if OE_WIN16
+ if (m_info.hinstTypeLibDLL != NULL)
+ FreeLibrary(m_info.hinstTypeLibDLL);
+#endif //OE_WIN16
+
+ if (m_info.perrinfo != NULL)
+ m_info.perrinfo->Release();
+
+ if (m_info.pmalloc != NULL)
+ m_info.pmalloc->Release();
+}
+
+STDMETHODIMP
+CProcessInfo::QueryInterface(REFIID riid, void FAR* FAR* ppvObj)
+{
+ if(riid != IID_IUnknown)
+ {
+ *ppvObj = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+
+ *ppvObj = this;
+ AddRef();
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CProcessInfo::AddRef()
+{
+ return ++m_cRefs;
+}
+
+STDMETHODIMP_(unsigned long)
+CProcessInfo::Release()
+{
+ ASSERT(m_cRefs > 0);
+
+ // Don't decrement ref count if we're releasing. This
+ // allows delete operator to use cache with recursing.
+ //
+ if(m_cRefs <= 1){
+ // do *not* want to ever get back into GetProcessInfo() -- it's bad news.
+ // most likely we are being called via OleUninitialize, and we don't want
+ // to end up re-caching the state.
+ IMalloc * pmalloc;
+
+ // get an IMalloc for use by the "delete this;" and everything it calls.
+ // The one in the cache might be ok, but then we've problems with when
+ // to free it. This is simpler.
+ if ( CoGetMalloc(MEMCTX_TASK, &pmalloc) != S_OK || pmalloc == NULL)
+ return 0; // on failure leak, but don't crash
+
+ pinfoCache.pmalloc = pmalloc; // pretend this one is in the cache
+#if _X86_
+ if (g_fWin32s) {
+ ASSERT(uProcessID == 0); // must remain 0 on win32s
+ dwWin32sPID = GetCurrentProcessId();
+ } else
+#endif //_X86_
+ uProcessID = GetPID(); // so cache lookup will always succeed,
+ // and GetProcessInfo won't ever be
+ // called.
+
+ // NOTE: assumes nothing that is done by the delete operator will yield
+ // NOTE: and cause uProcessID & pinfoCache.pmalloc to be changed
+
+ delete this; // free up everything, using the IMalloc
+ // we just got.
+
+#if _X86_
+ ASSERT(((g_fWin32s && dwWin32sPID == GetCurrentProcessId()) ||
+ (!g_fWin32s && uProcessID == GetPID()))
+ && pinfoCache.pmalloc == pmalloc);
+#else //_X86_
+ ASSERT(uProcessID == GetPID() && pinfoCache.pmalloc == pmalloc);
+#endif //_X86_
+ pmalloc->Release(); // done with the IMalloc
+
+ // Release is called when a process terminates. This is the
+ // whole reason the cache is tied into Co[G|S]etState() - to
+ // invalidate it on termination.
+ uProcessID = 0; // nothing in the cache anymore
+#if _X86_
+ dwWin32sPID = 0;
+#endif //_X86_
+ return 0;
+ }
+
+ return --m_cRefs;
+}
+
+
+#if _X86_
+// returns non-zero if process info cache loaded successfully
+CProcessInfo FAR * GetProcessInfoCache()
+{
+ if (g_fWin32s && dwWin32sPID == GetCurrentProcessId())
+ return (CProcessInfo FAR*)1; // cached data is already valid
+
+ return GetProcessInfo();
+}
+#endif //_X86_
+
+CProcessInfo FAR * GetProcessInfo()
+{
+ CProcessInfo FAR * pprocessinfo;
+
+#if _X86_
+ if (g_fWin32s)
+ dwWin32sPID = GetCurrentProcessId(); // indicate cache is valid
+ else
+#endif //_X86_
+ uProcessID = GetPID();
+
+ pprocessinfo = NULL;
+ DoCoGetState( (IUnknown FAR* FAR*)&pprocessinfo );
+
+ if (pprocessinfo == NULL)
+ {
+ // Don't have IMalloc or process info yet
+ //
+ if ( CoGetMalloc(MEMCTX_TASK, &pinfoCache.pmalloc) != S_OK ||
+ pinfoCache.pmalloc == NULL)
+ goto Failed;
+
+ // No process info is registered. Create one.
+ //
+ // Note that the NEW operator needs the IMalloc we just
+ // fetched above. We have set up the cache so it will
+ // find it without calling us recursively.
+ //
+ if( (pprocessinfo = new CProcessInfo) == NULL)
+ {
+ pinfoCache.pmalloc->Release(); // didn't keep it after all
+Failed:
+ uProcessID = 0;
+ return NULL;
+ }
+ DoCoSetState( (IUnknown FAR*)pprocessinfo );
+
+ pprocessinfo->m_info.pmalloc = pinfoCache.pmalloc;
+
+ } else {
+
+ ASSERT(pprocessinfo->m_info.pmalloc != NULL);
+
+ // Reverse the AddRef() done by DoCoGetState()
+ //
+ DWORD cRefs = pprocessinfo->Release();
+
+ // we should still be holding onto a reference for this guy
+ ASSERT(cRefs != 0);
+
+ }
+
+ // Copy info we have into cache
+ //
+ pinfoCache = pprocessinfo->m_info;
+
+ return pprocessinfo;
+}
+#endif // !OE_WIN32
+
+//---------------------------------------------------------------------
+// CErrorInfo
+//---------------------------------------------------------------------
+
+// Duplicate the given bstr.
+//
+static HRESULT
+HrDupBstr(BSTR bstrIn, BSTR FAR* pbstrOut)
+{
+ unsigned int len;
+ BSTR bstr;
+
+ if(bstrIn == NULL){
+ bstr = NULL;
+ }else{
+ // Note: the following makes sure we dont drop embedded NULLs.
+ len = SysStringLen(bstrIn);
+ if((bstr = SysAllocStringLen(NULL, len)) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ memcpy(bstr, bstrIn, len*sizeof(OLECHAR));
+ }
+ *pbstrOut = bstr;
+ return NOERROR;
+}
+
+// CErrorInfo - 'errinfo'
+//
+// The standard system error object class.
+//
+class FAR CErrorInfo : public IErrorInfo, public ICreateErrorInfo
+{
+public:
+ static HRESULT Create(CErrorInfo FAR* FAR* pperrinfo);
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IErrorInfo methods */
+ STDMETHOD(GetGUID)(GUID FAR* pguid);
+ STDMETHOD(GetSource)(BSTR FAR* pbstrSource);
+ STDMETHOD(GetDescription)(BSTR FAR* pbstrDescription);
+ STDMETHOD(GetHelpFile)(BSTR FAR* pbstrHelpFile);
+ STDMETHOD(GetHelpContext)(unsigned long FAR* pdwHelpContext);
+
+ /* ICreateErrorInfo methods */
+ STDMETHOD(SetGUID)(REFGUID rguid);
+ STDMETHOD(SetSource)(LPOLESTR szSource);
+ STDMETHOD(SetDescription)(LPOLESTR szDescription);
+ STDMETHOD(SetHelpFile)(LPOLESTR szHelpFile);
+ STDMETHOD(SetHelpContext)(unsigned long dwHelpContext);
+
+ CErrorInfo();
+ ~CErrorInfo();
+
+private:
+ unsigned long m_cRefs;
+
+ GUID m_guid;
+ BSTR m_bstrSource;
+ BSTR m_bstrDescription;
+ BSTR m_bstrHelpFile;
+ unsigned long m_dwHelpContext;
+};
+
+CErrorInfo::CErrorInfo()
+{
+ m_cRefs = 0;
+ m_guid = GUID_NULL;
+ m_bstrSource = NULL;
+ m_bstrDescription = NULL;
+ m_bstrHelpFile = NULL;
+ m_dwHelpContext = 0;
+}
+
+CErrorInfo::~CErrorInfo()
+{
+ SysFreeString(m_bstrSource);
+ SysFreeString(m_bstrDescription);
+ SysFreeString(m_bstrHelpFile);
+}
+
+HRESULT
+CErrorInfo::Create(CErrorInfo FAR* FAR* pperrinfo)
+{
+ CErrorInfo FAR* perrinfo;
+
+ if((perrinfo = new CErrorInfo()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ perrinfo->m_cRefs = 1;
+ *pperrinfo = perrinfo;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CErrorInfo::QueryInterface(REFIID riid, void FAR* FAR* ppvObj)
+{
+ *ppvObj = NULL;
+ if(riid == IID_IUnknown){
+ *ppvObj = this;
+ }else
+ if(riid == IID_IErrorInfo){
+ *ppvObj = (IErrorInfo FAR*)this;
+ }else
+ if(riid == IID_ICreateErrorInfo){
+ *ppvObj = (ICreateErrorInfo FAR*)this;
+ }
+
+ if(*ppvObj == NULL)
+ return RESULT(E_NOINTERFACE);
+
+ (*(IUnknown FAR* FAR*)ppvObj)->AddRef();
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CErrorInfo::AddRef()
+{
+ return ++m_cRefs;
+}
+
+STDMETHODIMP_(unsigned long)
+CErrorInfo::Release()
+{
+ ASSERT(m_cRefs > 0);
+ if(--m_cRefs == 0){
+ delete this;
+ return 0;
+ }
+ return m_cRefs;
+}
+
+//---------------------------------------------------------------------
+// IErrorInfo methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CErrorInfo::GetGUID(GUID FAR* pguid)
+{
+#ifdef _DEBUG
+ IfFailRet(ValidateWritePtr(pguid, sizeof(*pguid)));
+#endif
+ *pguid = m_guid;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CErrorInfo::GetSource(BSTR FAR* pbstrSource)
+{
+#ifdef _DEBUG
+ IfFailRet(ValidateWritePtr(pbstrSource, sizeof(*pbstrSource)));
+#endif
+ return HrDupBstr(m_bstrSource, pbstrSource);
+}
+
+STDMETHODIMP
+CErrorInfo::GetDescription(BSTR FAR* pbstrDescription)
+{
+#ifdef _DEBUG
+ IfFailRet(ValidateWritePtr(pbstrDescription, sizeof(*pbstrDescription)));
+#endif
+ return HrDupBstr(m_bstrDescription, pbstrDescription);
+}
+
+STDMETHODIMP
+CErrorInfo::GetHelpFile(BSTR FAR* pbstrHelpFile)
+{
+#ifdef _DEBUG
+ IfFailRet(ValidateWritePtr(pbstrHelpFile, sizeof(*pbstrHelpFile)));
+#endif
+ return HrDupBstr(m_bstrHelpFile, pbstrHelpFile);
+}
+
+STDMETHODIMP
+CErrorInfo::GetHelpContext(unsigned long FAR* pdwHelpContext)
+{
+#ifdef _DEBUG
+ IfFailRet(ValidateWritePtr(pdwHelpContext, sizeof(*pdwHelpContext)));
+#endif
+ *pdwHelpContext = m_dwHelpContext;
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// ICreateErrorInfo methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CErrorInfo::SetGUID(REFGUID rguid)
+{
+#ifdef _DEBUG
+ IfFailRet(ValidateReadPtr(&rguid, sizeof(REFGUID)));
+#endif
+ m_guid = rguid;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CErrorInfo::SetSource(LPOLESTR szSource)
+{
+#ifdef _DEBUG
+ if(szSource != NULL && FIsBadStringPtr(szSource, (UINT)-1))
+ return RESULT(E_INVALIDARG);
+#endif
+ SysFreeString(m_bstrSource);
+ m_bstrSource = NULL;
+ return ErrSysAllocString(szSource, &m_bstrSource);
+}
+
+STDMETHODIMP
+CErrorInfo::SetDescription(LPOLESTR szDescription)
+{
+#ifdef _DEBUG
+ if(szDescription != NULL && FIsBadStringPtr(szDescription, (UINT)-1))
+ return RESULT(E_INVALIDARG);
+#endif
+ SysFreeString(m_bstrDescription);
+ m_bstrDescription = NULL;
+ return ErrSysAllocString(szDescription, &m_bstrDescription);
+}
+
+STDMETHODIMP
+CErrorInfo::SetHelpFile(LPOLESTR szHelpFile)
+{
+#ifdef _DEBUG
+ if(szHelpFile != NULL && FIsBadStringPtr(szHelpFile, (UINT)-1))
+ return RESULT(E_INVALIDARG);
+#endif
+ SysFreeString(m_bstrHelpFile);
+ m_bstrHelpFile = NULL;
+ return ErrSysAllocString(szHelpFile, &m_bstrHelpFile);
+}
+
+STDMETHODIMP
+CErrorInfo::SetHelpContext(unsigned long dwHelpContext)
+{
+ m_dwHelpContext = dwHelpContext;
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// Error Info APIs
+//---------------------------------------------------------------------
+
+STDAPI
+SetErrorInfo(unsigned long dwReserved, IErrorInfo FAR* perrinfo)
+{
+#ifdef _DEBUG
+ if(dwReserved != 0)
+ return RESULT(E_INVALIDARG);
+ if(perrinfo != NULL && FIsBadInterface(perrinfo, CMETH_IErrorInfo))
+ return RESULT(E_INVALIDARG);
+#endif
+
+#if OE_WIN32
+ APP_DATA FAR *pappdata;
+ HRESULT hresult;
+
+ if (FAILED(hresult = GetAppData(&pappdata))) {
+ return hresult;
+ }
+
+ if (pappdata->m_perrinfo != NULL) {
+ pappdata->m_perrinfo->Release();
+ }
+
+ pappdata->m_perrinfo = perrinfo;
+
+ if (perrinfo) {
+ perrinfo->AddRef();
+ }
+#else // !OE_WIN32
+ CProcessInfo FAR * pprocessinfo;
+
+ pprocessinfo = GetProcessInfo();
+ if (pprocessinfo == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ if (pinfoCache.perrinfo != NULL)
+ pinfoCache.perrinfo->Release();
+
+ pprocessinfo->m_info.perrinfo = perrinfo;
+ if (perrinfo != NULL)
+ perrinfo->AddRef();
+#endif // !OE_WIN32
+
+ return NOERROR;
+}
+
+STDAPI
+GetErrorInfo(unsigned long dwReserved, IErrorInfo FAR* FAR* pperrinfo)
+{
+#ifdef _DEBUG
+ if(dwReserved != 0)
+ return RESULT(E_INVALIDARG);
+ IfFailRet(ValidateWritePtr(pperrinfo, sizeof(*pperrinfo)));
+#endif
+
+#if OE_WIN32
+ APP_DATA FAR *pappdata;
+ HRESULT hresult;
+
+ if (FAILED(hresult = GetAppData(&pappdata))) {
+ return hresult;
+ }
+
+ *pperrinfo = pappdata->m_perrinfo;
+
+ if (*pperrinfo == NULL) {
+ return ResultFromScode(S_FALSE);
+ }
+
+ pappdata->m_perrinfo = NULL;
+#else // !OE_WIN32
+ CProcessInfo FAR * pprocessinfo;
+
+ *pperrinfo = NULL;
+ pprocessinfo = GetProcessInfo();
+ if (pprocessinfo == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ if (pinfoCache.perrinfo == NULL)
+ return ResultFromScode(S_FALSE);
+
+ *pperrinfo = pinfoCache.perrinfo;
+ pprocessinfo->m_info.perrinfo = NULL;
+#endif // !OE_WIN32
+
+ return NOERROR;
+}
+
+STDAPI
+CreateErrorInfo(ICreateErrorInfo FAR* FAR* pperrinfo)
+{
+ CErrorInfo FAR* perrinfo;
+
+#ifdef _DEBUG
+ IfFailRet(ValidateWritePtr(pperrinfo, sizeof(*pperrinfo)));
+#endif
+
+ IfFailRet(CErrorInfo::Create(&perrinfo));
+ *pperrinfo = (ICreateErrorInfo FAR*)perrinfo;
+ return NOERROR;
+}
+
+
+#if OE_WIN16
+/***
+*PRIVATE HRESULT DoLoadTypeLib
+*Purpose:
+* Internal version of LoadTypeLib that dynamically binds to typelib.dll
+*
+*Entry:
+* szName = the szName arg for LoadTypeLib()
+* pptlib = the pptlib out param for LoadTypeLib()
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+#pragma code_seg("RPC2")
+INTERNAL_(HRESULT)
+DoLoadTypeLib(const OLECHAR FAR* szName, ITypeLib FAR* FAR* pptlib)
+{
+ CProcessInfo FAR * pprocessinfo;
+ HINSTANCE hinstTypeLibDLL;
+ PFNLOADTYPELIB pfnLoadTypeLib;
+ UINT emPrev;
+
+ pprocessinfo = GetProcessInfo();
+ if (pprocessinfo == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ if (pinfoCache.pfnLoadTypeLib == NULL) {
+
+ ASSERT(pinfoCache.hinstTypeLibDLL == NULL);
+ // don't display the open file dialog if the LoadLibrary fails
+ emPrev = SetErrorMode(SEM_NOOPENFILEERRORBOX);
+ hinstTypeLibDLL = LoadLibrary("typelib.dll");
+ SetErrorMode(emPrev);
+ if(hinstTypeLibDLL <= HINSTANCE_ERROR){
+ // LoadLibrary failed...
+ // try to map some of the more common errors to something reasonable
+ switch(hinstTypeLibDLL){
+ case 0: // out of memory
+ case 8: // insufficient memory to start the application
+ return RESULT(E_OUTOFMEMORY);
+ case 2: // file not found
+ case 3: // path not found
+ case 11: // exe image invalid
+ case 20: // dll was invalid
+ default:
+ // UNDONE: should be able to give better errors for some of these
+ return RESULT(E_FAIL);
+ }
+ }
+
+ pfnLoadTypeLib = (PFNLOADTYPELIB)GetProcAddress(hinstTypeLibDLL,
+ "LoadTypeLib");
+ if(pfnLoadTypeLib == NULL) {
+ FreeLibrary(hinstTypeLibDLL);
+ return RESULT(E_FAIL);
+ }
+
+ // update process info structure, so next time this is fast.
+ pprocessinfo->m_info.hinstTypeLibDLL = hinstTypeLibDLL;
+ pprocessinfo->m_info.pfnLoadTypeLib = pfnLoadTypeLib;
+ pinfoCache.pfnLoadTypeLib = pfnLoadTypeLib; // update cache
+ }
+
+ return (pinfoCache.pfnLoadTypeLib)(szName, pptlib);
+
+}
+#pragma code_seg()
+
+#endif //OE_WIN16
+
+#if OE_MACPPC // UNDONE: TEMPORARY!!!!
+IUnknown FAR* g_punkTempHack = NULL;
+
+STDAPI CoSetState(IUnknown FAR* punk)
+{
+ if (g_punkTempHack)
+ g_punkTempHack->Release();
+
+ punk->AddRef();
+ g_punkTempHack = punk;
+ return NOERROR;
+}
+
+STDAPI CoGetState(IUnknown FAR* FAR* ppunk) {
+ if (g_punkTempHack)
+ g_punkTempHack->AddRef();
+ *ppunk = g_punkTempHack;
+ return NOERROR;
+}
+
+#endif //OE_MACPPC // UNDONE: TEMPORARY!!!!
diff --git a/private/oleauto/src/dispatch/evprox.cpp b/private/oleauto/src/dispatch/evprox.cpp
new file mode 100644
index 000000000..f9e8caf76
--- /dev/null
+++ b/private/oleauto/src/dispatch/evprox.cpp
@@ -0,0 +1,402 @@
+/***
+*evprox.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the IEnumVARIANT proxy class.
+*
+*Revision History:
+*
+* [00] 06-Dec-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "evps.h"
+
+
+CProxEnumVARIANT::CProxEnumVARIANT(IUnknown FAR* punkOuter)
+ : m_unk(this), m_proxy(this), m_enum(this)
+{
+ if(punkOuter == NULL)
+ punkOuter = &m_unk;
+ m_punkOuter = punkOuter;
+}
+
+IUnknown FAR*
+CProxEnumVARIANT::Create(IUnknown FAR* punkOuter)
+{
+ CProxEnumVARIANT FAR* pproxenum;
+
+ if(pproxenum = new FAR CProxEnumVARIANT(punkOuter)){
+ pproxenum->m_refs = 1;
+ return &pproxenum->m_unk;
+ }
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IEnumVARIANT Proxy class' IUnknown implementation
+//---------------------------------------------------------------------
+
+CPEVUnkImpl::CPEVUnkImpl(CProxEnumVARIANT FAR* pproxenum)
+{
+ m_pproxenum = pproxenum;
+}
+
+STDMETHODIMP
+CPEVUnkImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = (void FAR*)&(m_pproxenum->m_unk);
+ AddRef();
+ return NOERROR;
+ }
+
+ if(IsEqualIID(riid, IID_IPROXY)){
+ *ppv = (void FAR*)&(m_pproxenum->m_proxy);
+ AddRef();
+ return NOERROR;
+ }
+
+ if(IsEqualIID(riid, IID_IEnumVARIANT)){
+ *ppv = (void FAR*)&(m_pproxenum->m_enum);
+ m_pproxenum->m_punkOuter->AddRef();
+ return NOERROR;
+ }
+
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CPEVUnkImpl::AddRef()
+{
+ return ++m_pproxenum->m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPEVUnkImpl::Release()
+{
+ if(--m_pproxenum->m_refs == 0){
+ delete m_pproxenum;
+ return 0;
+ }
+ return m_pproxenum->m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IEnumVARIANT proxy class' IRpcProxy implementation
+//---------------------------------------------------------------------
+
+CPEVProxImpl::CPEVProxImpl(CProxEnumVARIANT FAR* pproxenum)
+{
+ m_pproxenum = pproxenum;
+}
+
+CPEVProxImpl::~CPEVProxImpl()
+{
+ if(m_pproxenum->m_plrpc)
+ m_pproxenum->m_plrpc->Release();
+}
+
+STDMETHODIMP
+CPEVProxImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxenum->m_unk.QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPEVProxImpl::AddRef()
+{
+ return m_pproxenum->m_unk.AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPEVProxImpl::Release()
+{
+ return m_pproxenum->m_unk.Release();
+}
+
+STDMETHODIMP
+CPEVProxImpl::Connect(ICHANNEL FAR* plrpc)
+{
+ if(plrpc){
+ plrpc->AddRef();
+ m_pproxenum->m_plrpc = plrpc;
+ return NOERROR;
+ }
+ return RESULT(E_FAIL);
+}
+
+
+STDMETHODIMP_(void)
+CPEVProxImpl::Disconnect(void)
+{
+ if(m_pproxenum->m_plrpc)
+ m_pproxenum->m_plrpc->Release();
+ m_pproxenum->m_plrpc = NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IEnumVARIANT proxy class' IEnumVARIANT implementation
+//---------------------------------------------------------------------
+
+CPEVEnumVARIANTImpl::CPEVEnumVARIANTImpl(CProxEnumVARIANT FAR* pproxenum)
+{
+ m_pproxenum = pproxenum;
+}
+
+STDMETHODIMP
+CPEVEnumVARIANTImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxenum->m_punkOuter->QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPEVEnumVARIANTImpl::AddRef()
+{
+ return m_pproxenum->m_punkOuter->AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPEVEnumVARIANTImpl::Release()
+{
+ return m_pproxenum->m_punkOuter->Release();
+}
+
+/***
+*HRESULT CPEVEnumVARIANTImpl::Next(unsigned long, VARAINT*, unsigned long*)
+*Purpose:
+* Proxy implementation of IEnumVARIANT::Next()
+*
+* Out:
+* <unsigned long celt>
+*
+* In:
+* <HRESULT = return value>
+* <unsigned long = celtFetched>
+* <VARIANT[] = rgvar[]>
+*
+*Entry:
+* celt = count of elements to fetch
+*
+*Exit:
+* return value = HRESULT
+*
+* rgvar = array of variants
+* *pceltFetched = count of elements fetched.
+*
+***********************************************************************/
+STDMETHODIMP
+CPEVEnumVARIANTImpl::Next(
+ unsigned long celt,
+ VARIANT FAR* rgvar,
+ unsigned long FAR* pceltFetched)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+ unsigned long i, celtTmp, celtFetched;
+ unsigned long _proxySysKind, _stubSysKind;
+
+ if(pceltFetched == NULL)
+ pceltFetched = &celtTmp;
+
+#ifdef _DEBUG
+ if(IsBadWritePtr(pceltFetched, sizeof(*pceltFetched)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(rgvar, (size_t)celt * sizeof(VARIANT)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if((plrpc = m_pproxenum->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_ENUMVARIANT_NEXT, 100, IID_IEnumVARIANT);
+
+ _proxySysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LError0);
+
+ IfFailGo(PUT(pstm, celt), LError0);
+
+ INVOKE_CALL(plrpc, pstm, LError0);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError0);
+
+ if(FAILED(hresultRet)){
+ hresult = hresultRet;
+ goto LError0;
+ }
+
+ IfFailGo(GET(pstm, _stubSysKind), LError0);
+
+ IfFailGo(GET(pstm, celtFetched), LError0);
+
+ for(i = 0; i < celtFetched; ++i){
+ IfFailGo(VariantRead(pstm, &rgvar[i], NULL, (SYSKIND) _stubSysKind), LError0);
+ }
+
+ *pceltFetched = celtFetched;
+
+ hresult = hresultRet;
+
+LError0:
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPEVEnumVARIANTImpl::Skip(unsigned long)
+*Purpose:
+* Proxy implementation of IEnumVARIANT::Skip()
+*
+* Out:
+* <unsigned long = celt>
+*
+* In:
+* <HRESULT = return value>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPEVEnumVARIANTImpl::Skip(unsigned long celt)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+
+
+ if((plrpc = m_pproxenum->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+
+ OPEN_STREAM(plrpc, pstm, IMETH_ENUMVARIANT_SKIP, 100, IID_IEnumVARIANT);
+
+ IfFailGo(PUT(pstm, celt), LError0);
+
+ INVOKE_CALL(plrpc, pstm, LError0);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError0);
+
+ hresult = hresultRet;
+
+LError0:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPEVEnumVARIANTImpl::Reset()
+*Purpose:
+* Proxy implementation of IEnumVARIANT::Reset()
+*
+* Out:
+* None
+*
+* In:
+* <HRESULT = return value>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPEVEnumVARIANTImpl::Reset()
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+
+
+ if((plrpc = m_pproxenum->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_ENUMVARIANT_RESET, 100, IID_IEnumVARIANT);
+
+ INVOKE_CALL(plrpc, pstm, LError0);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError0);
+
+ hresult = hresultRet;
+
+LError0:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPEVEnumVARIANTImpl::Clone(IEnumVARIANT**)
+*Purpose:
+* Proxy implementation of IEnumVARIANT::Clone()
+*
+* Out:
+* None
+*
+* In:
+* <HRESULT = return value>
+* <IEnumVARIANT = ppenum>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppenum = pointer to a clone of this EnumVARIANT
+*
+***********************************************************************/
+STDMETHODIMP
+CPEVEnumVARIANTImpl::Clone(IEnumVARIANT FAR* FAR* ppenum)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+
+
+ if((plrpc = m_pproxenum->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_ENUMVARIANT_CLONE, 256, IID_IEnumVARIANT);
+
+ INVOKE_CALL(plrpc, pstm, LError0);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError0);
+
+ if(FAILED(hresultRet)){
+ hresult = hresultRet;
+ goto LError0;
+ }
+
+ IfFailGo(
+ DispUnmarshalInterface(
+ pstm, IID_IEnumVARIANT, (void FAR* FAR*)ppenum), LError0);
+
+ hresult = hresultRet;
+
+LError0:;
+ pstm->Release();
+ return hresult;
+}
+
diff --git a/private/oleauto/src/dispatch/evps.h b/private/oleauto/src/dispatch/evps.h
new file mode 100644
index 000000000..3fb2780ae
--- /dev/null
+++ b/private/oleauto/src/dispatch/evps.h
@@ -0,0 +1,179 @@
+/***
+*evps.h - IEnumVARIANT Proxy and Stub class definitions
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the IEnumVARIANT Proxy and Stub classes.
+*
+* CProxEnumVARIANT -- the IEnumVARIANT proxy class
+* CPEVUnkImpl - CProxEnumVARIANT implementation of IUnknown
+* CPEVProxImpl - CProxEnumVARIANT implementation of IRpcProxy
+* CPEVEnumVARIANTImpl - CProxEnumVARIANT implementation of IEnumVARIANT
+*
+* CStubEnumVARIANT -- the IEnumVARIANT stub class
+*
+*Revision History:
+*
+* [00] 05-Nov-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef __evps_h__
+#define __evps_h__
+
+#pragma warning(4:4355)
+
+
+// forward declarations
+class FAR CProxEnumVARIANT;
+class FAR CStubEnumVARIANT;
+
+
+// IEnumVARIANT proxy class' IUnknown implementation
+class FAR CPEVUnkImpl : public IUnknown
+{
+public:
+ CPEVUnkImpl(CProxEnumVARIANT FAR* pproxenum);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+private:
+ CProxEnumVARIANT FAR* m_pproxenum;
+};
+
+
+// IEnumVARIANT proxy class' IRpcProxy implementation
+class CPEVProxImpl : public IPROXY
+{
+public:
+ CPEVProxImpl(CProxEnumVARIANT FAR* pproxenum);
+ ~CPEVProxImpl();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(Connect)(ICHANNEL FAR* plrpc);
+ STDMETHOD_(void, Disconnect)(void);
+
+private:
+ CProxEnumVARIANT FAR* m_pproxenum;
+};
+
+
+// IEnumVARIANT
+//
+class CPEVEnumVARIANTImpl : public IEnumVARIANT
+{
+public:
+ CPEVEnumVARIANTImpl(CProxEnumVARIANT FAR* pproxy);
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IEnumVARIANT methods
+ STDMETHOD(Next)(unsigned long celt, VARIANT FAR* rgvar, unsigned long FAR* pceltFetched);
+ STDMETHOD(Skip)(unsigned long celt);
+ STDMETHOD(Reset)(void);
+ STDMETHOD(Clone)(IEnumVARIANT FAR* FAR* ppenum);
+
+private:
+ CProxEnumVARIANT FAR* m_pproxenum;
+};
+
+
+// IEnumVARIANT Proxy Class
+class FAR CProxEnumVARIANT
+{
+public:
+ static IUnknown FAR* Create(IUnknown FAR* punkOuter);
+
+private:
+ CProxEnumVARIANT(IUnknown FAR* punkOuter);
+
+ friend CPEVUnkImpl;
+ friend CPEVProxImpl;
+ friend CPEVEnumVARIANTImpl;
+
+ CPEVUnkImpl m_unk;
+ CPEVProxImpl m_proxy;
+ CPEVEnumVARIANTImpl m_enum;
+
+private:
+ unsigned long m_refs;
+ ICHANNEL FAR* m_plrpc;
+ IUnknown FAR* m_punkOuter;
+};
+
+
+// IEnumVARIANT Stub Class
+//
+class FAR CStubEnumVARIANT : public ISTUB
+{
+public:
+ static HRESULT Create(IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IRpcStub methods
+ //
+#if (OE_WIN32 || defined(WOW))
+ STDMETHOD(Connect)(IUnknown FAR* pUnk);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg,
+ IRpcChannelBuffer FAR* pRpcChannel);
+ STDMETHOD_(IRpcStubBuffer *, IsIIDSupported)(REFIID iid);
+ STDMETHOD_(ULONG, CountRefs)(void);
+ STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv);
+ STDMETHOD_(void, DebugServerRelease)(void FAR* pv);
+#else
+ STDMETHOD(Connect)(IUnknown FAR* punkObject);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(
+ REFIID riid,
+ int imeth,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx);
+#if OE_MAC
+ STDMETHOD_(unsigned long, IsIIDSupported)(REFIID riid);
+#else
+ STDMETHOD_(BOOL, IsIIDSupported)(REFIID riid);
+#endif
+ STDMETHOD_(unsigned long, CountRefs)(void);
+#endif
+
+private:
+ CStubEnumVARIANT();
+ ~CStubEnumVARIANT();
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punk;
+ IEnumVARIANT FAR* m_penum;
+};
+
+
+// IEnumVARIANT method indices
+//
+#define IMETH_ENUMVARIANT_QUERYINTERFACE 0 /* Placeholder */
+#define IMETH_ENUMVARIANT_ADDREF 1 /* Placeholder */
+#define IMETH_ENUMVARIANT_RELEASE 2 /* Placeholder */
+
+#define IMETH_ENUMVARIANT_NEXT 3
+#define IMETH_ENUMVARIANT_SKIP 4
+#define IMETH_ENUMVARIANT_RESET 5
+#define IMETH_ENUMVARIANT_CLONE 6
+
+#endif __evps_h__
diff --git a/private/oleauto/src/dispatch/evstub.cpp b/private/oleauto/src/dispatch/evstub.cpp
new file mode 100644
index 000000000..7989c31ca
--- /dev/null
+++ b/private/oleauto/src/dispatch/evstub.cpp
@@ -0,0 +1,500 @@
+/***
+*evstub.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the IEnumVARIANT stub class.
+*
+*Revision History:
+*
+* [00] 06-Dec-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "evps.h"
+
+ASSERTDATA
+
+CStubEnumVARIANT::CStubEnumVARIANT()
+{
+ m_refs = 0;
+ m_punk = NULL;
+ m_penum = NULL;
+}
+
+CStubEnumVARIANT::~CStubEnumVARIANT()
+{
+ Disconnect();
+}
+
+
+HRESULT
+CStubEnumVARIANT::Create(IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub)
+{
+ CStubEnumVARIANT FAR* pstub;
+
+ if(pstub = new FAR CStubEnumVARIANT()){
+ pstub->m_refs = 1;
+ *ppstub = pstub;
+ if (punkServer)
+ return pstub->Connect(punkServer);
+ return NOERROR;
+ }
+ return RESULT(E_OUTOFMEMORY);
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CStubEnumVARIANT::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else if(IsEqualIID(riid, IID_ISTUB)){
+ *ppv = this;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ ++m_refs;
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStubEnumVARIANT::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStubEnumVARIANT::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IRpcStub Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CStubEnumVARIANT::Connect(IUnknown FAR* punkObj)
+{
+#if (defined(WIN32) || defined(WOW))
+ ASSERT(m_punk == NULL && m_penum == NULL);
+ //This will keep the server object alive until we disconnect.
+ IfFailRet(punkObj->QueryInterface(IID_IEnumVARIANT, (void FAR* FAR*)&m_penum));
+ punkObj->AddRef();
+ m_punk = punkObj;
+ return NOERROR;
+#else
+ if(m_punk)
+ return RESULT(E_FAIL); // call Disconnect first
+
+ if (punkObj) {
+ punkObj->AddRef();
+ m_punk = punkObj;
+ }
+ return NOERROR;
+#endif
+}
+
+
+STDMETHODIMP_(void)
+CStubEnumVARIANT::Disconnect()
+{
+ if(m_punk){
+ m_punk->Release();
+ m_punk = NULL;
+ }
+ if(m_penum){
+ m_penum->Release();
+ m_penum = NULL;
+ }
+}
+
+
+/***
+*PRIVATE HRESULT DispatchNext(IEnumVARIANT FAR*, IStream*)
+*Purpose:
+* Stub implementation of IEnumVARIANT::Next()
+*
+* In:
+* <unsigned long = celt>
+*
+* Out:
+* <HRESULT = return value>
+* <unsigned long = pceltFetched>
+* <VARIANT[] = rgvar[]>
+*
+*Entry:
+* penum = the IEnumVARIANT* to dispatch on
+* pstm = the stream containing the actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+DispatchNext(IEnumVARIANT FAR* penum, IStream FAR* pstm)
+{
+ unsigned int i;
+ VARIANT FAR* rgvar;
+ unsigned long celt, celtFetched;
+ HRESULT hresult, hresultRet;
+ unsigned long _proxySysKind, _stubSysKind;
+
+ IfFailGo(GET(pstm, _proxySysKind), LError0);
+
+ IfFailGo(GET(pstm, celt), LError0);
+
+ if((rgvar = new FAR VARIANT[(size_t)celt]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ celtFetched = 0;
+ for(i = 0; i < celt; ++i)
+ VariantInit(&rgvar[i]);
+
+ hresultRet = penum->Next(celt, rgvar, &celtFetched);
+
+ IfFailGo(REWIND_STREAM(pstm), LError0);
+
+ IfFailGo(DispMarshalHresult(pstm, hresultRet), LError1);
+
+ // only marshal the out params if the call succeeded.
+ //
+ if(SUCCEEDED(hresultRet)){
+
+ _stubSysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _stubSysKind), LError1);
+
+ IfFailGo(PUT(pstm, celtFetched), LError1);
+
+ for(i = 0; i < celtFetched; ++i){
+ IfFailGo(VariantWrite(pstm, &rgvar[i], (SYSKIND) _proxySysKind), LError1);
+ }
+ }
+
+ hresult = NOERROR;
+
+LError1:;
+ for(i = 0; i < celtFetched; ++i)
+ VariantClear(&rgvar[i]);
+
+ delete rgvar;
+
+LError0:;
+ return hresult;
+}
+
+
+/***
+*PRIVATE HRESULT DispatchSkip(IEnumVARIANT*, IStream*)
+*Purpose:
+* Stub implementation of IEnumVARIANT::Skip()
+*
+* In:
+* <unsigned long = celt>
+*
+* Out:
+* <HRESULT = return value>
+*
+*Entry:
+* penum = the IEnumVARIANT* to dispatch on
+* pstm = the stream containing the actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+DispatchSkip(IEnumVARIANT FAR* penum, IStream FAR* pstm)
+{
+ unsigned long celt;
+ HRESULT hresult, hresultRet;
+
+
+ IfFailGo(GET(pstm, celt), LError0);
+
+ hresultRet = penum->Skip(celt);
+
+ IfFailGo(REWIND_STREAM(pstm), LError0);
+
+ IfFailGo(DispMarshalHresult(pstm, hresultRet), LError0);
+
+ hresult = NOERROR;
+
+LError0:;
+ return hresult;
+}
+
+
+/***
+*PRIVATE HRESULT DispatchReset(IEnumVARIANT*, IStream*)
+*Purpose:
+* Stub implementation of IEnumVARIANT::Reset()
+*
+* In:
+* None
+*
+* Out:
+* <HRESULT = return value>
+*
+*Entry:
+* penum = the IEnumVARIANT* to dispatch on
+* pstm = the stream containing the actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+DispatchReset(IEnumVARIANT FAR* penum, IStream FAR* pstm)
+{
+ HRESULT hresultRet;
+
+ hresultRet = penum->Reset();
+
+ REWIND_STREAM(pstm);
+
+ return DispMarshalHresult(pstm, hresultRet);
+}
+
+
+/***
+*PRIVATE HRESULT DispatchClone(IEnumVARIANT*, IStream*)
+*Purpose:
+* Stub implementation of IEnumVARIANT::Clone()
+*
+* In:
+* None
+*
+* Out:
+* <HRESULT = return value>
+* <IEnumVARIANT = cloned enum>
+*
+*Entry:
+* penum = the IEnumVARIANT* to dispatch on
+* pstm = the stream containing the actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+DispatchClone(IEnumVARIANT FAR* penum, IStream FAR* pstm)
+{
+ HRESULT hresult, hresultRet;
+ IEnumVARIANT FAR* penumClone;
+
+
+ hresultRet = penum->Clone(&penumClone);
+
+ REWIND_STREAM(pstm);
+
+ IfFailGo(DispMarshalHresult(pstm, hresultRet), LError0);
+
+ // dont bother marshaling the interface if the call failed.
+ if(SUCCEEDED(hresultRet)){
+ hresult = DispMarshalInterface(pstm, IID_IEnumVARIANT, penumClone);
+ }
+
+LError0:;
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT CStubEnumVARIANT::Invoke(REFIID, int, IStream*, unsigned long, void*)
+*
+*Purpose:
+* Dispatch the method with the given index (iMethod) on the given
+* interface, using the arguments serialized in the given stream.
+*
+* This function is the callee side of an LRPC call.
+*
+*Entry:
+* iid = the IID of the interface on which we are to make the call
+* iMethod = the method index
+* pstm = the IStream containing the method's actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CStubEnumVARIANT::Invoke(
+#if (OE_WIN32 || defined(WOW))
+ RPCOLEMESSAGE *pMessage,
+ ICHANNEL *pRpcChannel)
+{
+ HRESULT hresult;
+ IStream FAR* pstm;
+
+ if(!m_punk)
+ return RESULT(E_FAIL);
+
+ OPEN_STUB_STREAM(pstm, pRpcChannel, pMessage, IID_IEnumVARIANT);
+
+#else
+ REFIID riid,
+ int iMethod,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx)
+{
+ HRESULT hresult;
+
+ UNUSED(dwDestCtx);
+ UNUSED(pvDestCtx);
+
+ if(!IsEqualIID(riid, IID_IEnumVARIANT))
+ return RESULT(E_NOINTERFACE);
+
+ if(!m_punk)
+ return RESULT(E_FAIL);
+
+ if(m_penum == NULL)
+ IfFailRet(m_punk->QueryInterface(IID_IEnumVARIANT, (void FAR* FAR*)&m_penum));
+
+#endif
+
+ switch(GET_IMETHOD(pMessage)){
+ case IMETH_ENUMVARIANT_NEXT:
+ hresult = DispatchNext(m_penum, pstm);
+ break;
+
+ case IMETH_ENUMVARIANT_SKIP:
+ hresult = DispatchSkip(m_penum, pstm);
+ break;
+
+ case IMETH_ENUMVARIANT_RESET:
+ hresult = DispatchReset(m_penum, pstm);
+ break;
+
+ case IMETH_ENUMVARIANT_CLONE:
+ hresult = DispatchClone(m_penum, pstm);
+ break;
+
+ default:
+ hresult = INVALIDARG;
+ break;
+ }
+
+ RESET_STREAM(pstm);
+
+ DELETE_STREAM(pstm);
+
+ return hresult;
+}
+
+
+/***
+*PUBLIC BOOL CStubEnumVARIANT::IsIIDSupported(REFIID)
+*
+*Purpose:
+* Answer if the given IID is supported by this stub.
+*
+*Entry:
+* iid = the IID to query for support
+*
+*Exit:
+* return value = BOOL. TRUE if IID is supported, FALSE otherwise.
+*
+***********************************************************************/
+#if OE_MAC
+STDMETHODIMP_(unsigned long)
+#elif (OE_WIN32 || defined(WOW))
+STDMETHODIMP_(IRpcStubBuffer *)
+#else
+STDMETHODIMP_(BOOL)
+#endif
+CStubEnumVARIANT::IsIIDSupported(REFIID riid)
+{
+#if (OE_WIN32 || defined(WOW))
+ IRpcStubBuffer *pStub = 0;
+ if (IsEqualIID(riid, IID_IEnumVARIANT)) {
+ AddRef();
+ pStub = (IRpcStubBuffer *) this;
+ }
+ return pStub;
+#else
+
+ // REVIEW: I don't understand this, but thats the way Ole does it...
+ if(m_punk == NULL)
+ return FALSE;
+
+ return(IsEqualIID(riid, IID_IEnumVARIANT));
+#endif
+}
+
+
+/***
+*unsigned long CStubEnumVARIANT::CountRefs
+*Purpose:
+* Return the count of references held by this stub.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long, the count of references.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CStubEnumVARIANT::CountRefs()
+{
+ unsigned long refs;
+
+ refs = 0;
+
+ if(m_punk != NULL)
+ ++refs;
+
+ if(m_penum != NULL)
+ ++refs;
+
+ return refs;
+}
+
+
+#if (OE_WIN32 || defined(WOW))
+
+STDMETHODIMP
+CStubEnumVARIANT::DebugServerQueryInterface(void FAR* FAR* ppv)
+{
+ *ppv = m_penum;
+ return S_OK;
+}
+
+
+STDMETHODIMP_(void)
+CStubEnumVARIANT::DebugServerRelease(void FAR* ppv)
+{
+
+}
+
+#endif
diff --git a/private/oleauto/src/dispatch/getobj.cpp b/private/oleauto/src/dispatch/getobj.cpp
new file mode 100644
index 000000000..bd7839845
--- /dev/null
+++ b/private/oleauto/src/dispatch/getobj.cpp
@@ -0,0 +1,202 @@
+/***
+*getobj.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the Get Active Object API.
+*
+*
+*Revision History:
+*
+* [00] 02-Mar-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+* This is done with a bit of a hack. We use a file moniker, and
+* create a fake file name by stringizing the CLSID. The "right"
+* solution is to create a "real" active object moniker.
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+
+/***
+*PRIVATE CreateActiveObjectMoniker
+*Purpose:
+* Create an ActiveObject moniker from the given CLSID.
+*
+* Note: this is really a FileMoniker with a stringized clsid
+* as the pseudo-filename. Someday we should probably have a
+* real moniker for this.
+*
+*Entry:
+* rclsid = the clsid
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppmk = the newly created active object moniker
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+CreateActiveObjectMoniker(REFCLSID rclsid, IMoniker FAR* FAR* ppmk)
+{
+ OLECHAR FAR* psz;
+ HRESULT hresult;
+
+
+ IfFailGo(StringFromCLSID(rclsid, &psz), LError0);
+
+ IfFailGo(CreateFileMoniker(psz, ppmk), LError1);
+
+ hresult = NOERROR;
+
+LError1:;
+ // delete with the standard task allocator
+ delete psz;
+
+LError0:;
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT RegisterActiveObject
+*Purpose:
+* Register the given IUnknown, with the given CLSID as running
+* in the running object table.
+*
+*Entry:
+* punk = the object to register as active
+* rclsid = the clsid of the object
+* pvReserved = reserved for future use
+*
+*Exit:
+* return value = HRESULT
+*
+* *pdwReserved = registration value (used to revoke the object).
+*
+***********************************************************************/
+STDAPI
+RegisterActiveObject(
+ IUnknown FAR* punk,
+ REFCLSID rclsid,
+#if VBA2
+ unsigned long dwFlags,
+#else
+ void FAR* pvReserved,
+#endif
+ unsigned long FAR* pdwRegister)
+{
+ HRESULT hresult;
+ IMoniker FAR* pmk;
+ IRunningObjectTable FAR* prot;
+
+#ifndef VBA2
+ UNUSED(pvReserved);
+#endif //!VBA2
+
+#ifdef _DEBUG
+ if(IsBadWritePtr(pdwRegister, sizeof(*pdwRegister)))
+ return RESULT(E_INVALIDARG);
+#if VBA2
+ if (dwFlags > ACTIVEOBJECT_WEAK) // only support 0 and 1 now
+ return RESULT(E_INVALIDARG);
+#endif //VBA2
+#endif //_DEBUG
+
+#if VBA2
+ unsigned long rotFlags = 1; // strong
+ if (dwFlags == ACTIVEOBJECT_WEAK)
+ rotFlags = 0; // weak
+#else //!VBA2
+ #define rotFlags 1 // always strong
+#endif //!VBA2
+
+ IfFailGo(CreateActiveObjectMoniker(rclsid, &pmk), LError0);
+
+ IfFailGo(GetRunningObjectTable(0, &prot), LError1);
+
+ // the first param indicates strong or weak reference (0=weak, 1=strong)
+ IfFailGo(prot->Register(rotFlags, punk, pmk, pdwRegister), LError2);
+
+ hresult = NOERROR;
+
+LError2:;
+ prot->Release();
+
+LError1:;
+ pmk->Release();
+
+LError0:;
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT RevokeActiveObject
+*Purpose:
+* Remove the object identified with the given registration value
+* from the running object table.
+*
+*Entry:
+* dwRegister = registration value of the object to revoke.
+* pvReserved = reserved for future use
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+RevokeActiveObject(
+ unsigned long dwRegister,
+ void FAR* pvReserved)
+{
+ HRESULT hresult;
+ IRunningObjectTable FAR* prot;
+
+ UNUSED(pvReserved);
+
+ IfFailGo(GetRunningObjectTable(0, &prot), LError0);
+
+ IfFailGo(prot->Revoke(dwRegister), LError1);
+
+ hresult = NOERROR;
+
+LError1:;
+ prot->Release();
+
+LError0:;
+ return hresult;
+}
+
+
+STDAPI
+GetActiveObject(
+ REFCLSID rclsid,
+ void FAR* pvReserved,
+ IUnknown FAR* FAR* ppunk)
+{
+ HRESULT hresult;
+ IMoniker FAR* pmk;
+ IRunningObjectTable FAR* prot;
+
+ UNUSED(pvReserved);
+
+ IfFailGo(CreateActiveObjectMoniker(rclsid, &pmk), LError0);
+
+ IfFailGo(GetRunningObjectTable(0, &prot), LError1);
+
+ hresult = prot->GetObject(pmk, ppunk);
+
+ prot->Release();
+
+LError1:;
+ pmk->Release();
+
+LError0:;
+ return hresult;
+}
diff --git a/private/oleauto/src/dispatch/idispiid.c b/private/oleauto/src/dispatch/idispiid.c
new file mode 100644
index 000000000..8f6b91212
--- /dev/null
+++ b/private/oleauto/src/dispatch/idispiid.c
@@ -0,0 +1,58 @@
+/***
+*dispiid.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates (via Ole macro mania) the IDispatch related IIDs.
+*
+*Revision History:
+*
+* [00] 07-May-93 tomteng: Created.
+*
+*****************************************************************************/
+#ifdef _MAC
+# ifdef _MSC_VER
+# include <macos/types.h>
+# include <macos/packages.h>
+# include <macos/resource.h>
+# include <macos/menus.h>
+# include <macos/windows.h>
+# include <macos/osutils.h>
+# include <macos/appleeve.h>
+# define far
+# define FAR far
+# define near
+# define NEAR near
+# define pascal _pascal
+# define PASCAL pascal
+# define cdecl _cdecl
+# define CDECL cdecl
+# else
+# include <types.h>
+# include <packages.h>
+# include <resources.h>
+# include <menus.h>
+# include <windows.h>
+# include <appleevents.h>
+# include <osutils.h>
+# include <AppleEvents.h>
+# endif
+#else
+# include <windows.h>
+#endif
+#include <ole2.h>
+
+// this redefines the Ole DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+// due to the previous header, including this causes our DEFINE_GUID
+// definitions in the following headers to actually allocate data.
+//
+
+// Exported IDispatch & IEnumVARIANT GUIDs for Win32
+DEFINE_OLEGUID(IID_IDispatch, 0x00020400L, 0, 0);
+DEFINE_OLEGUID(IID_IDispatchW, 0x00020407L, 0, 0);
+DEFINE_OLEGUID(IID_IEnumVARIANT, 0x00020404L, 0, 0);
diff --git a/private/oleauto/src/dispatch/invhelp.cpp b/private/oleauto/src/dispatch/invhelp.cpp
new file mode 100644
index 000000000..7b7d348c2
--- /dev/null
+++ b/private/oleauto/src/dispatch/invhelp.cpp
@@ -0,0 +1,154 @@
+/***
+*invhelp.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file interfaces with the assembly invocation helpers.
+*
+*Revision History:
+*
+* [00] 23-Mar-93 bradlo: Created.
+* [01] 29-Jun-93 bradlo: Added Mac support
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+
+// the following data is referenced by assembly support routines.
+//
+extern "C" {
+
+SCODE g_S_OK = S_OK;
+SCODE g_E_INVALIDARG = E_INVALIDARG;
+
+// typedef for the low-level assembly invoke helper
+#if HC_MPW
+typedef SCODE (INVPROC)
+#else
+typedef SCODE (__cdecl FAR INVPROC)
+#endif
+(
+ void FAR* _this,
+#if OE_MAC68K
+ CALLCONV cc,
+#endif
+ unsigned int oVft,
+ unsigned int vtReturn,
+ unsigned int cActuals,
+ VARTYPE FAR* rgvt,
+ VARIANTARG FAR* FAR* rgpvarg,
+ VARIANT FAR* pvarResult
+);
+
+#if OE_WIN16
+
+extern INVPROC InvokePascal;
+extern INVPROC InvokeCdecl;
+
+#elif OE_WIN32 && _X86_
+
+extern INVPROC InvokeCdecl;
+extern INVPROC InvokeStdCall;
+
+#elif OE_WIN32 && !_X86
+
+extern INVPROC InvokeStdCall;
+
+#elif OE_MAC68K
+
+extern INVPROC InvokePascal;
+extern INVPROC InvokeCdecl;
+
+#elif OE_MACPPC
+
+extern INVPROC InvokeStdCall;
+
+#endif
+
+}
+
+
+STDAPI
+DoInvokeMethod(
+ void FAR* pvInstance,
+ unsigned int oVft,
+ CALLCONV cc,
+ VARTYPE vtReturn,
+ unsigned int cActuals,
+ VARTYPE FAR* rgvt,
+ VARIANTARG FAR* FAR* rgpvarg,
+ VARIANT FAR* pvarResult)
+{
+ SCODE sc;
+
+ INVPROC FAR* pfnInvoke;
+
+ if((vtReturn & (VT_BYREF)) != 0)
+ return RESULT(E_INVALIDARG);
+
+ switch(cc){
+#if OE_WIN16
+ case CC_CDECL:
+ pfnInvoke = InvokeCdecl;
+ break;
+ case CC_MSCPASCAL:
+ pfnInvoke = InvokePascal;
+ break;
+#elif OE_WIN32 && _X86_
+ case CC_CDECL:
+ pfnInvoke = InvokeCdecl;
+ break;
+ case CC_STDCALL:
+ pfnInvoke = InvokeStdCall;
+ break;
+#elif OE_WIN32 && !_X86_
+ case CC_CDECL:
+ case CC_STDCALL:
+ pfnInvoke = InvokeStdCall;
+ break;
+#elif OE_MAC68K
+ case CC_CDECL:
+ case CC_MPWCDECL:
+ pfnInvoke = InvokeCdecl;
+ break;
+ case CC_MSCPASCAL:
+ case CC_MACPASCAL:
+ case CC_MPWPASCAL:
+ pfnInvoke = InvokePascal;
+ break;
+#elif OE_MACPPC
+ case CC_CDECL:
+ case CC_STDCALL:
+ pfnInvoke = InvokeStdCall;
+ break;
+#endif
+ default:
+ return RESULT(E_INVALIDARG);
+ }
+
+#if OE_MAC68K || OE_MACPPC // UNDONE: PPC version seems to
+ // UNDONE: want the +4 too. Why?
+ // Mac-MPW Vtables have an extra "pad" word at the top
+ oVft += 4;
+#endif
+
+ sc = pfnInvoke(
+ pvInstance,
+#if OE_MAC68K
+ cc,
+#endif
+ oVft,
+ (unsigned int)vtReturn,
+ cActuals,
+ rgvt,
+ rgpvarg,
+ pvarResult);
+
+ return (sc == S_OK) ? NOERROR : RESULT(sc);
+}
+
diff --git a/private/oleauto/src/dispatch/memory.cpp b/private/oleauto/src/dispatch/memory.cpp
new file mode 100644
index 000000000..727308fd2
--- /dev/null
+++ b/private/oleauto/src/dispatch/memory.cpp
@@ -0,0 +1,64 @@
+/***
+*memory.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* memory allocation routines for oledisp.dll
+*
+*Revision History:
+*
+* [00] 15-Oct-92 Bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+#include <new.h>
+
+#if OE_WIN16
+ASSERTDATA
+#endif
+
+#if OE_WIN16
+void NEAR* operator new(size_t )
+{
+ ASSERT(UNREACHED);
+ return NULL;
+}
+
+void operator delete(void NEAR* )
+{
+ ASSERT(UNREACHED);
+}
+#endif
+
+void FAR* operator new(size_t size)
+{
+ void FAR* pv;
+ IMalloc FAR* pMalloc;
+
+ if(GetMalloc(&pMalloc) == 0){
+ pv = pMalloc->Alloc(size);
+ return pv;
+ }
+ return NULL;
+}
+
+void operator delete(void FAR* pv)
+{
+ if(pv == NULL)
+ return;
+
+ IMalloc FAR* pMalloc;
+ if(GetMalloc(&pMalloc) == 0)
+ pMalloc->Free(pv);
+}
+
diff --git a/private/oleauto/src/dispatch/namemacs.h b/private/oleauto/src/dispatch/namemacs.h
new file mode 100644
index 000000000..9c0f32771
--- /dev/null
+++ b/private/oleauto/src/dispatch/namemacs.h
@@ -0,0 +1,1305 @@
+ #undef StgCreateDocfile
+ #undef StgCreateDocfileOnILockBytes
+ #undef StgOpenStorage
+ #undef StgOpenStorageOnILockBytes
+ #undef StgIsStorageFile
+ #undef StgIsStorageILockBytes
+ #undef StgSetTimes
+ #undef StgSetTimesMac
+ #undef StgSetTimesFSp
+ #undef DllGetClassObject
+ #undef StgCreateDocfileFSp
+ #undef StgOpenStorageFSp
+ #undef StgCreateDocfileMac
+ #undef StgOpenStorageMac
+ #undef StgIsStorageFileMac
+ #undef StgIsStorageFileFSp
+ #undef StgGetFSpFromIStorage
+ #undef StgGetFRefFromIStorage
+ #undef OleregOpenRegistration
+ #undef OleregCloseRegistration
+ #undef OleregGetValue
+ #undef OleregSetValue
+ #undef OleregRemoveKey
+ #undef OleGlobalAddAtom
+ #undef OleGlobalDuplicateAtom
+ #undef OleGlobalDeleteAtom
+ #undef OleGlobalFindAtom
+ #undef OleGlobalGetAtomName
+ #undef OleGlobalAlloc
+ #undef OleGlobalCompact
+ #undef OleGlobalFree
+ #undef OleGlobalHandle
+ #undef OleGlobalLock
+ #undef OleGlobalReAlloc
+ #undef OleGlobalSize
+ #undef OleGlobalUnlock
+ #undef RegQueryValue
+ #undef RegOpenKey
+ #undef RegSetValue
+ #undef RegEnumKey
+ #undef RegEnumProgID
+ #undef RegDeleteKey
+ #undef RegCreateKey
+ #undef RegCloseKey
+ #undef RegInitialize
+ #undef InitUserData
+ #undef SendHighLevelEvent
+ #undef OleWinExec
+ #undef InitDB
+ #undef CloseDB
+ #undef OleGetCurrentTask
+ #undef OleGetProcAddress
+ #undef OleLoadLibrary
+ #undef OleFreeLibrary
+ #undef OutputDebugString
+ #undef SoftAssert
+ #undef FnAssert
+ #undef IsValidInterface
+ #undef IsValidIid
+ #undef IsValidHandle
+ #undef EnterOLEApi
+ #undef ExitOLEApi
+ #undef FnAssertOn
+ #undef GlobalFreePtr
+ #undef GlobalAllocPtr
+ #undef UserInitialize
+ #undef UserUninitialize
+ #undef IsValidInPtr
+ #undef IsValidOutPtr
+ #undef RegQueryValueEx
+ #undef RegFlush
+ #undef RegDeleteValue
+ #undef RegSetValueEx
+ #undef RegEnumValue
+ #undef OLEInitDBCSCountry
+ #undef IAnsiNext
+ #undef IAnsiPrev
+ #undef OleMakeFSSpec
+ #undef OleFullPathFromFSSpec
+ #undef OleGetFSSpecInfo
+ #undef DllGetClassObject
+ #undef SysAllocString
+ #undef SysReAllocString
+ #undef SysAllocStringLen
+ #undef SysReAllocStringLen
+ #undef SysFreeString
+ #undef SysStringLen
+ #undef VariantInit
+ #undef VariantClear
+ #undef VariantCopy
+ #undef VariantCopyInd
+ #undef VariantChangeType
+ #undef VarI2FromI4
+ #undef VarI2FromR4
+ #undef VarI2FromR8
+ #undef VarI2FromCy
+ #undef VarI2FromDate
+ #undef VarI2FromStr
+ #undef VarI2FromDisp
+ #undef VarI2FromBool
+ #undef VarI4FromI2
+ #undef VarI4FromR4
+ #undef VarI4FromR8
+ #undef VarI4FromCy
+ #undef VarI4FromDate
+ #undef VarI4FromStr
+ #undef VarI4FromDisp
+ #undef VarI4FromBool
+ #undef VarR4FromI2
+ #undef VarR4FromI4
+ #undef VarR4FromR8
+ #undef VarR4FromCy
+ #undef VarR4FromDate
+ #undef VarR4FromStr
+ #undef VarR4FromDisp
+ #undef VarR4FromBool
+ #undef VarR8FromI2
+ #undef VarR8FromI4
+ #undef VarR8FromR4
+ #undef VarR8FromCy
+ #undef VarR8FromDate
+ #undef VarR8FromStr
+ #undef VarR8FromDisp
+ #undef VarR8FromBool
+ #undef VarDateFromI2
+ #undef VarDateFromI4
+ #undef VarDateFromR4
+ #undef VarDateFromR8
+ #undef VarDateFromCy
+ #undef VarDateFromStr
+ #undef VarDateFromDisp
+ #undef VarDateFromBool
+ #undef VarCyFromI2
+ #undef VarCyFromI4
+ #undef VarCyFromR4
+ #undef VarCyFromR8
+ #undef VarCyFromDate
+ #undef VarCyFromStr
+ #undef VarCyFromDisp
+ #undef VarCyFromBool
+ #undef VarBstrFromI2
+ #undef VarBstrFromI4
+ #undef VarBstrFromR4
+ #undef VarBstrFromR8
+ #undef VarBstrFromCy
+ #undef VarBstrFromDate
+ #undef VarBstrFromDisp
+ #undef VarBstrFromBool
+ #undef VarBoolFromI2
+ #undef VarBoolFromI4
+ #undef VarBoolFromR4
+ #undef VarBoolFromR8
+ #undef VarBoolFromDate
+ #undef VarBoolFromCy
+ #undef VarBoolFromStr
+ #undef VarBoolFromDisp
+ #undef SafeArrayCreate
+ #undef SafeArrayDestroy
+ #undef SafeArrayGetDim
+ #undef SafeArrayGetElemsize
+ #undef SafeArrayGetUBound
+ #undef SafeArrayGetLBound
+ #undef SafeArrayLock
+ #undef SafeArrayUnlock
+ #undef SafeArrayAccessData
+ #undef SafeArrayUnaccessData
+ #undef SafeArrayGetElement
+ #undef SafeArrayPutElement
+ #undef SafeArrayCopy
+ #undef SafeArrayAllocDescriptor
+ #undef SafeArrayAllocData
+ #undef SafeArrayDestroyDescriptor
+ #undef SafeArrayDestroyData
+ #undef SafeArrayRedim
+ #undef VariantTimeToDosDateTime
+ #undef DosDateTimeToVariantTime
+ #undef DispGetParam
+ #undef DispGetIDsOfNames
+ #undef DispInvoke
+ #undef CreateDispTypeInfo
+ #undef CreateStdDispatch
+ #undef RegisterActiveObject
+ #undef RevokeActiveObject
+ #undef GetActiveObject
+ #undef DoInvokeMethod
+ #undef VariantChangeTypeEx
+ #undef SafeArrayPtrOfIndex
+ #undef MPWVarFromR4
+ #undef MPWVarFromR8
+ #undef MPWR4FromVar
+ #undef MPWR8FromVar
+ #undef CreateTypeLib
+ #undef LoadTypeLib
+ #undef LoadRegTypeLib
+ #undef RegisterTypeLib
+ #undef LHashValOfNameSys
+ #undef QueryPathOfRegTypeLib
+ #undef LoadTypeLibFSp
+ #undef RegisterTypeLibFolder
+ #undef QueryTypeLibFolder
+ #undef OleBuildVersion
+ #undef OleInitialize
+ #undef OleUninitialize
+ #undef DllGetClassObject
+ #undef OleQueryLinkFromData
+ #undef OleQueryCreateFromData
+ #undef OleCreateFromData
+ #undef OleCreateLinkFromData
+ #undef OleCreate
+ #undef OleCreateLink
+ #undef OleLoad
+ #undef OleSave
+ #undef OleRun
+ #undef OleIsRunning
+ #undef OleLockRunning
+ #undef ReadClassStg
+ #undef WriteClassStg
+ #undef ReadClassStm
+ #undef WriteClassStm
+ #undef BindMoniker
+ #undef MkParseDisplayName
+ #undef OleSaveToStream
+ #undef OleLoadFromStream
+ #undef CreateBindCtx
+ #undef CreateItemMoniker
+ #undef CreateFileMoniker
+ #undef CreateGenericComposite
+ #undef GetRunningObjectTable
+ #undef OleGetMalloc
+ #undef ReleaseStgMedium
+ #undef ReadStringStream
+ #undef WriteStringStream
+ #undef RegisterDragDrop
+ #undef RevokeDragDrop
+ #undef DoDragDrop
+ #undef CreateOleAdviseHolder
+ #undef CreateDataAdviseHolder
+ #undef OpenOrCreateStream
+ #undef CreateAntiMoniker
+ #undef CreatePointerMoniker
+ #undef MonikerRelativePathTo
+ #undef MonikerCommonPrefixWith
+ #undef OleSetClipboard
+ #undef OleGetClipboard
+ #undef OleDuplicateData
+ #undef CreateILockBytesOnHGlobal
+ #undef GetHGlobalFromILockBytes
+ #undef GetClassFile
+ #undef OleDraw
+ #undef OleCreateDefaultHandler
+ #undef OleCreateEmbeddingHelper
+ #undef OleConvertIStorageToOLESTREAMEx
+ #undef OleConvertOLESTREAMToIStorageEx
+ #undef SetDocumentBitStg
+ #undef GetDocumentBitStg
+ #undef WriteOleStg
+ #undef ReadOleStg
+ #undef OleCreateFromFile
+ #undef OleCreateLinkToFile
+ #undef CreateDataCache
+ #undef OleConvertIStorageToOLESTREAM
+ #undef OleConvertOLESTREAMToIStorage
+ #undef ReadFmtUserTypeStg
+ #undef WriteFmtUserTypeStg
+ #undef OleFlushClipboard
+ #undef OleIsCurrentClipboard
+ #undef OleTranslateAccelerator
+ #undef OleDoAutoConvert
+ #undef OleGetAutoConvert
+ #undef OleSetAutoConvert
+ #undef GetConvertStg
+ #undef SetConvertStg
+ #undef CreateStreamOnHGlobal
+ #undef GetHGlobalFromStream
+ #undef OleDuplicateMedium
+ #undef OleSetContainedObject
+ #undef OleNoteObjectVisible
+ #undef OleCreateStaticFromData
+ #undef OleRegGetUserType
+ #undef OleRegGetMiscStatus
+ #undef OleRegEnumFormatEtc
+ #undef OleRegEnumVerbs
+ #undef OleGetEnumFormatEtc
+ #undef OleSetEnumFormatEtc
+ #undef OleRemoveEnumFormatEtc
+ #undef OleSendLLE
+ #undef OleSetInPlaceWindow
+ #undef OleUnSetInPlaceWindow
+ #undef OleClipWindow
+ #undef OleClipWindows
+ #undef OleInsertMenus
+ #undef OleHashMenuID
+ #undef OleUnhashMenuID
+ #undef OlePatchGetMHandle
+ #undef OleUnpatchGetMHandle
+ #undef OleAddMBarMenu
+ #undef OleSetInPlaceRects
+ #undef OleMaskMouse
+ #undef OleMoveWindow
+ #undef OleSizeParentWindow
+ #undef OleSizeObjectWindow
+ #undef OleDragParentWindow
+ #undef OleDragObjectWindow
+ #undef OleGrowParentWindow
+ #undef OleGrowObjectWindow
+ #undef OleNewMBar
+ #undef OleDisposeMBar
+ #undef OleProcessDdeAE
+ #undef OleProcessClipboardAE
+ #undef InitializeClipboard
+ #undef UnInitializeClipboard
+ #undef OleIsClipboardFormatAvailable
+ #undef OleGetClipboardData
+ #undef OleSetClipboardData
+ #undef OleEnumClipboardFormats
+ #undef StoreClap
+ #undef OleCountClipboardFormats
+ #undef OleCloseClipboard
+ #undef OleEmptyClipboard
+ #undef OleSetClipboardEx
+ #undef OleZoomParentWindow
+ #undef OleSetParentRgns
+ #undef CreateFileMonikerFSp
+ #undef OleCreateFromFSp
+ #undef OleCreateLinkToFSp
+ #undef OleGetCursor
+ #undef OleSetCursor
+ #undef OleUpdateCursor
+ #undef GetClassFSp
+ #undef ReadOle1FmtProgIDStgMac
+ #undef WriteOle1FmtProgIDStgMac
+ #undef OleGetIconOfFile
+ #undef OleGetIconOfClass
+ #undef OleGetIconOfFSp
+ #undef OlePictFromIconAndLabel
+ #undef OleGetIconFromIconSuite
+ #undef OleUIPictIconFree
+ #undef OleUIPictIconDraw
+ #undef OleUIPictExtractIcon
+ #undef OleUIPictExtractLabel
+ #undef OleUIPictExtractIconSource
+ #undef OleMetaFileToPict
+ #undef OleQueryCreateAll
+ #undef OleWhichGrowHandle
+ #undef MkGetMacNetInfo
+ #undef CoBuildVersion
+ #undef CoInitialize
+ #undef CoUninitialize
+ #undef CoGetMalloc
+ #undef CoRegisterClassObject
+ #undef CoRevokeClassObject
+ #undef CoGetClassObject
+ #undef CoMarshalInterface
+ #undef CoUnmarshalInterface
+ #undef CoLoadLibrary
+ #undef CoFreeLibrary
+ #undef CoFreeAllLibraries
+ #undef CoCreateInstance
+ #undef StringFromIID
+ #undef CoDisconnectObject
+ #undef CoReleaseMarshalData
+ #undef CoFreeUnusedLibraries
+ #undef IsEqualGUID
+ #undef StringFromCLSID
+ #undef CLSIDFromString
+ #undef RESULTFROMSCODE
+ #undef GETSCODE
+ #undef CoRegisterMessageFilter
+ #undef CoIsHandlerConnected
+ #undef CoMarshalHresult
+ #undef CoUnmarshalHresult
+ #undef CoGetCurrentProcess
+ #undef CoIsOle1Class
+ #undef CLSIDFromProgID
+ #undef ProgIDFromCLSID
+ #undef CoLockObjectExternal
+ #undef CoGetTreatAsClass
+ #undef CoTreatAsClass
+ #undef CoGetStandardMarshal
+ #undef PropagateResult
+ #undef IIDFromString
+ #undef CoCreateStandardMalloc
+ #undef CoCreateGuid
+ #undef StringFromGUID2
+ #undef CoGetClassExt
+ #undef Ole1ClassFromCLSID2
+ #undef CLSIDFromOle1Class
+ #undef CoOpenClassKey
+ #undef GUIDFromString
+ #undef CoFileTimeNow
+ #undef RemAllocOID
+ #undef RemFreeOID
+ #undef RemCreateRemoteHandler
+ #undef RemConnectToObject
+ #undef RemGetInfoForCid
+ #undef LrpcCall
+ #undef LrpcDispatch
+ #undef LrpcRegisterMonitor
+ #undef LrpcRevokeMonitor
+ #undef LrpcGetThreadWindow
+ #undef LookupEtask
+ #undef SetEtask
+ #undef RemLookupSHUnk
+ #undef CoMemctxOf
+ #undef CoMemAlloc
+ #undef CoMemFree
+ #undef CoRunModalLoop
+ #undef CoHandleIncomingCall
+ #undef CoSetAckState
+ #undef OleProcessLrpcAE
+ #undef CoFileTimeToMacDateTime
+ #undef CoMacDateTimeToFileTime
+ #undef InternalCoInitialize
+ #undef CoHandlePendingMessage
+ #undef DllGetClassObject
+ #undef CompareStringA
+ #undef LCMapStringA
+ #undef GetLocaleInfoA
+ #undef GetStringTypeA
+ #undef GetSystemDefaultLangID
+ #undef GetUserDefaultLangID
+ #undef GetSystemDefaultLCID
+ #undef GetUserDefaultLCID
+#if ID_MUNGE_STAT_NAMES
+#if ID_OLE_STAT_DOCFILE
+ #define StgCreateDocfile StaticStgCreateDocfile
+ #define StgCreateDocfileOnILockBytes StaticStgCreateDocfileOnILockBytes
+ #define StgOpenStorage StaticStgOpenStorage
+ #define StgOpenStorageOnILockBytes StaticStgOpenStorageOnILockBytes
+ #define StgIsStorageFile StaticStgIsStorageFile
+ #define StgIsStorageILockBytes StaticStgIsStorageILockBytes
+ #define StgSetTimes StaticStgSetTimes
+ #define StgSetTimesMac StaticStgSetTimesMac
+ #define StgSetTimesFSp StaticStgSetTimesFSp
+ #define DllGetClassObject StaticDllGetClassObject
+ #define StgCreateDocfileFSp StaticStgCreateDocfileFSp
+ #define StgOpenStorageFSp StaticStgOpenStorageFSp
+ #define StgCreateDocfileMac StaticStgCreateDocfileMac
+ #define StgOpenStorageMac StaticStgOpenStorageMac
+ #define StgIsStorageFileMac StaticStgIsStorageFileMac
+ #define StgIsStorageFileFSp StaticStgIsStorageFileFSp
+ #define StgGetFSpFromIStorage StaticStgGetFSpFromIStorage
+ #define StgGetFRefFromIStorage StaticStgGetFRefFromIStorage
+#endif // ID_OLE_STAT_DOCFILE
+#if ID_OLE_STAT_USER
+ #define OleregOpenRegistration StaticOleregOpenRegistration
+ #define OleregCloseRegistration StaticOleregCloseRegistration
+ #define OleregGetValue StaticOleregGetValue
+ #define OleregSetValue StaticOleregSetValue
+ #define OleregRemoveKey StaticOleregRemoveKey
+ #define OleGlobalAddAtom StaticOleGlobalAddAtom
+ #define OleGlobalDuplicateAtom StaticOleGlobalDuplicateAtom
+ #define OleGlobalDeleteAtom StaticOleGlobalDeleteAtom
+ #define OleGlobalFindAtom StaticOleGlobalFindAtom
+ #define OleGlobalGetAtomName StaticOleGlobalGetAtomName
+ #define OleGlobalAlloc StaticOleGlobalAlloc
+ #define OleGlobalCompact StaticOleGlobalCompact
+ #define OleGlobalFree StaticOleGlobalFree
+ #define OleGlobalHandle StaticOleGlobalHandle
+ #define OleGlobalLock StaticOleGlobalLock
+ #define OleGlobalReAlloc StaticOleGlobalReAlloc
+ #define OleGlobalSize StaticOleGlobalSize
+ #define OleGlobalUnlock StaticOleGlobalUnlock
+ #define RegQueryValue StaticRegQueryValue
+ #define RegOpenKey StaticRegOpenKey
+ #define RegSetValue StaticRegSetValue
+ #define RegEnumKey StaticRegEnumKey
+ #define RegEnumProgID StaticRegEnumProgID
+ #define RegDeleteKey StaticRegDeleteKey
+ #define RegCreateKey StaticRegCreateKey
+ #define RegCloseKey StaticRegCloseKey
+ #define RegInitialize StaticRegInitialize
+ #define InitUserData StaticInitUserData
+ #define SendHighLevelEvent StaticSendHighLevelEvent
+ #define OleWinExec StaticOleWinExec
+ #define InitDB StaticInitDB
+ #define CloseDB StaticCloseDB
+ #define OleGetCurrentTask StaticOleGetCurrentTask
+ #define OleGetProcAddress StaticOleGetProcAddress
+ #define OleLoadLibrary StaticOleLoadLibrary
+ #define OleFreeLibrary StaticOleFreeLibrary
+ #define OutputDebugString StaticOutputDebugString
+ #define SoftAssert StaticSoftAssert
+ #define FnAssert StaticFnAssert
+ #define IsValidInterface StaticIsValidInterface
+ #define IsValidIid StaticIsValidIid
+ #define IsValidHandle StaticIsValidHandle
+ #define EnterOLEApi StaticEnterOLEApi
+ #define ExitOLEApi StaticExitOLEApi
+ #define FnAssertOn StaticFnAssertOn
+ #define GlobalFreePtr StaticGlobalFreePtr
+ #define GlobalAllocPtr StaticGlobalAllocPtr
+ #define UserInitialize StaticUserInitialize
+ #define UserUninitialize StaticUserUninitialize
+ #define IsValidInPtr StaticIsValidInPtr
+ #define IsValidOutPtr StaticIsValidOutPtr
+ #define RegQueryValueEx StaticRegQueryValueEx
+ #define RegFlush StaticRegFlush
+ #define RegDeleteValue StaticRegDeleteValue
+ #define RegSetValueEx StaticRegSetValueEx
+ #define RegEnumValue StaticRegEnumValue
+ #define OLEInitDBCSCountry StaticOLEInitDBCSCountry
+ #define IAnsiNext StaticIAnsiNext
+ #define IAnsiPrev StaticIAnsiPrev
+ #define OleMakeFSSpec StaticOleMakeFSSpec
+ #define OleFullPathFromFSSpec StaticOleFullPathFromFSSpec
+ #define OleGetFSSpecInfo StaticOleGetFSSpecInfo
+#endif //ID_OLE_STAT_USER
+#if ID_OLE_STAT_OLE2DISP
+ #define DllGetClassObject StaticDllGetClassObject
+ #define SysAllocString StaticSysAllocString
+ #define SysReAllocString StaticSysReAllocString
+ #define SysAllocStringLen StaticSysAllocStringLen
+ #define SysReAllocStringLen StaticSysReAllocStringLen
+ #define SysFreeString StaticSysFreeString
+ #define SysStringLen StaticSysStringLen
+ #define VariantInit StaticVariantInit
+ #define VariantClear StaticVariantClear
+ #define VariantCopy StaticVariantCopy
+ #define VariantCopyInd StaticVariantCopyInd
+ #define VariantChangeType StaticVariantChangeType
+ #define VarI2FromI4 StaticVarI2FromI4
+ #define VarI2FromR4 StaticVarI2FromR4
+ #define VarI2FromR8 StaticVarI2FromR8
+ #define VarI2FromCy StaticVarI2FromCy
+ #define VarI2FromDate StaticVarI2FromDate
+ #define VarI2FromStr StaticVarI2FromStr
+ #define VarI2FromDisp StaticVarI2FromDisp
+ #define VarI2FromBool StaticVarI2FromBool
+ #define VarI4FromI2 StaticVarI4FromI2
+ #define VarI4FromR4 StaticVarI4FromR4
+ #define VarI4FromR8 StaticVarI4FromR8
+ #define VarI4FromCy StaticVarI4FromCy
+ #define VarI4FromDate StaticVarI4FromDate
+ #define VarI4FromStr StaticVarI4FromStr
+ #define VarI4FromDisp StaticVarI4FromDisp
+ #define VarI4FromBool StaticVarI4FromBool
+ #define VarR4FromI2 StaticVarR4FromI2
+ #define VarR4FromI4 StaticVarR4FromI4
+ #define VarR4FromR8 StaticVarR4FromR8
+ #define VarR4FromCy StaticVarR4FromCy
+ #define VarR4FromDate StaticVarR4FromDate
+ #define VarR4FromStr StaticVarR4FromStr
+ #define VarR4FromDisp StaticVarR4FromDisp
+ #define VarR4FromBool StaticVarR4FromBool
+ #define VarR8FromI2 StaticVarR8FromI2
+ #define VarR8FromI4 StaticVarR8FromI4
+ #define VarR8FromR4 StaticVarR8FromR4
+ #define VarR8FromCy StaticVarR8FromCy
+ #define VarR8FromDate StaticVarR8FromDate
+ #define VarR8FromStr StaticVarR8FromStr
+ #define VarR8FromDisp StaticVarR8FromDisp
+ #define VarR8FromBool StaticVarR8FromBool
+ #define VarDateFromI2 StaticVarDateFromI2
+ #define VarDateFromI4 StaticVarDateFromI4
+ #define VarDateFromR4 StaticVarDateFromR4
+ #define VarDateFromR8 StaticVarDateFromR8
+ #define VarDateFromCy StaticVarDateFromCy
+ #define VarDateFromStr StaticVarDateFromStr
+ #define VarDateFromDisp StaticVarDateFromDisp
+ #define VarDateFromBool StaticVarDateFromBool
+ #define VarCyFromI2 StaticVarCyFromI2
+ #define VarCyFromI4 StaticVarCyFromI4
+ #define VarCyFromR4 StaticVarCyFromR4
+ #define VarCyFromR8 StaticVarCyFromR8
+ #define VarCyFromDate StaticVarCyFromDate
+ #define VarCyFromStr StaticVarCyFromStr
+ #define VarCyFromDisp StaticVarCyFromDisp
+ #define VarCyFromBool StaticVarCyFromBool
+ #define VarBstrFromI2 StaticVarBstrFromI2
+ #define VarBstrFromI4 StaticVarBstrFromI4
+ #define VarBstrFromR4 StaticVarBstrFromR4
+ #define VarBstrFromR8 StaticVarBstrFromR8
+ #define VarBstrFromCy StaticVarBstrFromCy
+ #define VarBstrFromDate StaticVarBstrFromDate
+ #define VarBstrFromDisp StaticVarBstrFromDisp
+ #define VarBstrFromBool StaticVarBstrFromBool
+ #define VarBoolFromI2 StaticVarBoolFromI2
+ #define VarBoolFromI4 StaticVarBoolFromI4
+ #define VarBoolFromR4 StaticVarBoolFromR4
+ #define VarBoolFromR8 StaticVarBoolFromR8
+ #define VarBoolFromDate StaticVarBoolFromDate
+ #define VarBoolFromCy StaticVarBoolFromCy
+ #define VarBoolFromStr StaticVarBoolFromStr
+ #define VarBoolFromDisp StaticVarBoolFromDisp
+ #define SafeArrayCreate StaticSafeArrayCreate
+ #define SafeArrayDestroy StaticSafeArrayDestroy
+ #define SafeArrayGetDim StaticSafeArrayGetDim
+ #define SafeArrayGetElemsize StaticSafeArrayGetElemsize
+ #define SafeArrayGetUBound StaticSafeArrayGetUBound
+ #define SafeArrayGetLBound StaticSafeArrayGetLBound
+ #define SafeArrayLock StaticSafeArrayLock
+ #define SafeArrayUnlock StaticSafeArrayUnlock
+ #define SafeArrayAccessData StaticSafeArrayAccessData
+ #define SafeArrayUnaccessData StaticSafeArrayUnaccessData
+ #define SafeArrayGetElement StaticSafeArrayGetElement
+ #define SafeArrayPutElement StaticSafeArrayPutElement
+ #define SafeArrayCopy StaticSafeArrayCopy
+ #define SafeArrayAllocDescriptor StaticSafeArrayAllocDescriptor
+ #define SafeArrayAllocData StaticSafeArrayAllocData
+ #define SafeArrayDestroyDescriptor StaticSafeArrayDestroyDescriptor
+ #define SafeArrayDestroyData StaticSafeArrayDestroyData
+ #define SafeArrayRedim StaticSafeArrayRedim
+ #define VariantTimeToDosDateTime StaticVariantTimeToDosDateTime
+ #define DosDateTimeToVariantTime StaticDosDateTimeToVariantTime
+ #define DispGetParam StaticDispGetParam
+ #define DispGetIDsOfNames StaticDispGetIDsOfNames
+ #define DispInvoke StaticDispInvoke
+ #define CreateDispTypeInfo StaticCreateDispTypeInfo
+ #define CreateStdDispatch StaticCreateStdDispatch
+ #define RegisterActiveObject StaticRegisterActiveObject
+ #define RevokeActiveObject StaticRevokeActiveObject
+ #define GetActiveObject StaticGetActiveObject
+ #define DoInvokeMethod StaticDoInvokeMethod
+ #define VariantChangeTypeEx StaticVariantChangeTypeEx
+ #define SafeArrayPtrOfIndex StaticSafeArrayPtrOfIndex
+ #define MPWVarFromR4 StaticMPWVarFromR4
+ #define MPWVarFromR8 StaticMPWVarFromR8
+ #define MPWR4FromVar StaticMPWR4FromVar
+ #define MPWR8FromVar StaticMPWR8FromVar
+#endif //ID_OLE_STAT_OLE2DISP
+#if ID_OLE_STAT_TYPELIB
+ #define CreateTypeLib StaticCreateTypeLib
+ #define LoadTypeLib StaticLoadTypeLib
+ #define LoadRegTypeLib StaticLoadRegTypeLib
+ #define RegisterTypeLib StaticRegisterTypeLib
+ #define LHashValOfNameSys StaticLHashValOfNameSys
+ #define QueryPathOfRegTypeLib StaticQueryPathOfRegTypeLib
+ #define LoadTypeLibFSp StaticLoadTypeLibFSp
+ #define RegisterTypeLibFolder StaticRegisterTypeLibFolder
+ #define QueryTypeLibFolder StaticQueryTypeLibFolder
+#endif //ID_OLE_STAT_TYPELIB
+#if ID_OLE_STAT_DEF
+ #define OleBuildVersion StaticOleBuildVersion
+ #define OleInitialize StaticOleInitialize
+ #define OleUninitialize StaticOleUninitialize
+ #define DllGetClassObject StaticDllGetClassObject
+ #define OleQueryLinkFromData StaticOleQueryLinkFromData
+ #define OleQueryCreateFromData StaticOleQueryCreateFromData
+ #define OleCreateFromData StaticOleCreateFromData
+ #define OleCreateLinkFromData StaticOleCreateLinkFromData
+ #define OleCreate StaticOleCreate
+ #define OleCreateLink StaticOleCreateLink
+ #define OleLoad StaticOleLoad
+ #define OleSave StaticOleSave
+ #define OleRun StaticOleRun
+ #define OleIsRunning StaticOleIsRunning
+ #define OleLockRunning StaticOleLockRunning
+ #define ReadClassStg StaticReadClassStg
+ #define WriteClassStg StaticWriteClassStg
+ #define ReadClassStm StaticReadClassStm
+ #define WriteClassStm StaticWriteClassStm
+ #define BindMoniker StaticBindMoniker
+ #define MkParseDisplayName StaticMkParseDisplayName
+ #define OleSaveToStream StaticOleSaveToStream
+ #define OleLoadFromStream StaticOleLoadFromStream
+ #define CreateBindCtx StaticCreateBindCtx
+ #define CreateItemMoniker StaticCreateItemMoniker
+ #define CreateFileMoniker StaticCreateFileMoniker
+ #define CreateGenericComposite StaticCreateGenericComposite
+ #define GetRunningObjectTable StaticGetRunningObjectTable
+ #define OleGetMalloc StaticOleGetMalloc
+ #define ReleaseStgMedium StaticReleaseStgMedium
+ #define ReadStringStream StaticReadStringStream
+ #define WriteStringStream StaticWriteStringStream
+ #define RegisterDragDrop StaticRegisterDragDrop
+ #define RevokeDragDrop StaticRevokeDragDrop
+ #define DoDragDrop StaticDoDragDrop
+ #define CreateOleAdviseHolder StaticCreateOleAdviseHolder
+ #define CreateDataAdviseHolder StaticCreateDataAdviseHolder
+ #define OpenOrCreateStream StaticOpenOrCreateStream
+ #define CreateAntiMoniker StaticCreateAntiMoniker
+ #define CreatePointerMoniker StaticCreatePointerMoniker
+ #define MonikerRelativePathTo StaticMonikerRelativePathTo
+ #define MonikerCommonPrefixWith StaticMonikerCommonPrefixWith
+ #define OleSetClipboard StaticOleSetClipboard
+ #define OleGetClipboard StaticOleGetClipboard
+ #define OleDuplicateData StaticOleDuplicateData
+ #define CreateILockBytesOnHGlobal StaticCreateILockBytesOnHGlobal
+ #define GetHGlobalFromILockBytes StaticGetHGlobalFromILockBytes
+ #define GetClassFile StaticGetClassFile
+ #define OleDraw StaticOleDraw
+ #define OleCreateDefaultHandler StaticOleCreateDefaultHandler
+ #define OleCreateEmbeddingHelper StaticOleCreateEmbeddingHelper
+ #define OleConvertIStorageToOLESTREAMEx StaticOleConvertIStorageToOLESTREAMEx
+ #define OleConvertOLESTREAMToIStorageEx StaticOleConvertOLESTREAMToIStorageEx
+ #define SetDocumentBitStg StaticSetDocumentBitStg
+ #define GetDocumentBitStg StaticGetDocumentBitStg
+ #define WriteOleStg StaticWriteOleStg
+ #define ReadOleStg StaticReadOleStg
+ #define OleCreateFromFile StaticOleCreateFromFile
+ #define OleCreateLinkToFile StaticOleCreateLinkToFile
+ #define CreateDataCache StaticCreateDataCache
+ #define OleConvertIStorageToOLESTREAM StaticOleConvertIStorageToOLESTREAM
+ #define OleConvertOLESTREAMToIStorage StaticOleConvertOLESTREAMToIStorage
+ #define ReadFmtUserTypeStg StaticReadFmtUserTypeStg
+ #define WriteFmtUserTypeStg StaticWriteFmtUserTypeStg
+ #define OleFlushClipboard StaticOleFlushClipboard
+ #define OleIsCurrentClipboard StaticOleIsCurrentClipboard
+ #define OleTranslateAccelerator StaticOleTranslateAccelerator
+ #define OleDoAutoConvert StaticOleDoAutoConvert
+ #define OleGetAutoConvert StaticOleGetAutoConvert
+ #define OleSetAutoConvert StaticOleSetAutoConvert
+ #define GetConvertStg StaticGetConvertStg
+ #define SetConvertStg StaticSetConvertStg
+ #define CreateStreamOnHGlobal StaticCreateStreamOnHGlobal
+ #define GetHGlobalFromStream StaticGetHGlobalFromStream
+ #define OleDuplicateMedium StaticOleDuplicateMedium
+ #define OleSetContainedObject StaticOleSetContainedObject
+ #define OleNoteObjectVisible StaticOleNoteObjectVisible
+ #define OleCreateStaticFromData StaticOleCreateStaticFromData
+ #define OleRegGetUserType StaticOleRegGetUserType
+ #define OleRegGetMiscStatus StaticOleRegGetMiscStatus
+ #define OleRegEnumFormatEtc StaticOleRegEnumFormatEtc
+ #define OleRegEnumVerbs StaticOleRegEnumVerbs
+ #define OleGetEnumFormatEtc StaticOleGetEnumFormatEtc
+ #define OleSetEnumFormatEtc StaticOleSetEnumFormatEtc
+ #define OleRemoveEnumFormatEtc StaticOleRemoveEnumFormatEtc
+ #define OleSendLLE StaticOleSendLLE
+ #define OleSetInPlaceWindow StaticOleSetInPlaceWindow
+ #define OleUnSetInPlaceWindow StaticOleUnSetInPlaceWindow
+ #define OleClipWindow StaticOleClipWindow
+ #define OleClipWindows StaticOleClipWindows
+ #define OleInsertMenus StaticOleInsertMenus
+ #define OleHashMenuID StaticOleHashMenuID
+ #define OleUnhashMenuID StaticOleUnhashMenuID
+ #define OlePatchGetMHandle StaticOlePatchGetMHandle
+ #define OleUnpatchGetMHandle StaticOleUnpatchGetMHandle
+ #define OleAddMBarMenu StaticOleAddMBarMenu
+ #define OleSetInPlaceRects StaticOleSetInPlaceRects
+ #define OleMaskMouse StaticOleMaskMouse
+ #define OleMoveWindow StaticOleMoveWindow
+ #define OleSizeParentWindow StaticOleSizeParentWindow
+ #define OleSizeObjectWindow StaticOleSizeObjectWindow
+ #define OleDragParentWindow StaticOleDragParentWindow
+ #define OleDragObjectWindow StaticOleDragObjectWindow
+ #define OleGrowParentWindow StaticOleGrowParentWindow
+ #define OleGrowObjectWindow StaticOleGrowObjectWindow
+ #define OleNewMBar StaticOleNewMBar
+ #define OleDisposeMBar StaticOleDisposeMBar
+ #define OleProcessDdeAE StaticOleProcessDdeAE
+ #define OleProcessClipboardAE StaticOleProcessClipboardAE
+ #define InitializeClipboard StaticInitializeClipboard
+ #define UnInitializeClipboard StaticUnInitializeClipboard
+ #define OleIsClipboardFormatAvailable StaticOleIsClipboardFormatAvailable
+ #define OleGetClipboardData StaticOleGetClipboardData
+ #define OleSetClipboardData StaticOleSetClipboardData
+ #define OleEnumClipboardFormats StaticOleEnumClipboardFormats
+ #define StoreClap StaticStoreClap
+ #define OleCountClipboardFormats StaticOleCountClipboardFormats
+ #define OleCloseClipboard StaticOleCloseClipboard
+ #define OleEmptyClipboard StaticOleEmptyClipboard
+ #define OleSetClipboardEx StaticOleSetClipboardEx
+ #define OleZoomParentWindow StaticOleZoomParentWindow
+ #define OleSetParentRgns StaticOleSetParentRgns
+ #define CreateFileMonikerFSp StaticCreateFileMonikerFSp
+ #define OleCreateFromFSp StaticOleCreateFromFSp
+ #define OleCreateLinkToFSp StaticOleCreateLinkToFSp
+ #define OleGetCursor StaticOleGetCursor
+ #define OleSetCursor StaticOleSetCursor
+ #define OleUpdateCursor StaticOleUpdateCursor
+ #define GetClassFSp StaticGetClassFSp
+ #define ReadOle1FmtProgIDStgMac StaticReadOle1FmtProgIDStgMac
+ #define WriteOle1FmtProgIDStgMac StaticWriteOle1FmtProgIDStgMac
+ #define OleGetIconOfFile StaticOleGetIconOfFile
+ #define OleGetIconOfClass StaticOleGetIconOfClass
+ #define OleGetIconOfFSp StaticOleGetIconOfFSp
+ #define OlePictFromIconAndLabel StaticOlePictFromIconAndLabel
+ #define OleGetIconFromIconSuite StaticOleGetIconFromIconSuite
+ #define OleUIPictIconFree StaticOleUIPictIconFree
+ #define OleUIPictIconDraw StaticOleUIPictIconDraw
+ #define OleUIPictExtractIcon StaticOleUIPictExtractIcon
+ #define OleUIPictExtractLabel StaticOleUIPictExtractLabel
+ #define OleUIPictExtractIconSource StaticOleUIPictExtractIconSource
+ #define OleMetaFileToPict StaticOleMetaFileToPict
+ #define OleQueryCreateAll StaticOleQueryCreateAll
+ #define OleWhichGrowHandle StaticOleWhichGrowHandle
+ #define MkGetMacNetInfo StaticMkGetMacNetInfo
+#endif //ID_OLE_STAT_DEF
+#if ID_OLE_STAT_COMPOBJ
+ #define CoBuildVersion StaticCoBuildVersion
+ #define CoInitialize StaticCoInitialize
+ #define CoUninitialize StaticCoUninitialize
+ #define CoGetMalloc StaticCoGetMalloc
+ #define CoRegisterClassObject StaticCoRegisterClassObject
+ #define CoRevokeClassObject StaticCoRevokeClassObject
+ #define CoGetClassObject StaticCoGetClassObject
+ #define CoMarshalInterface StaticCoMarshalInterface
+ #define CoUnmarshalInterface StaticCoUnmarshalInterface
+ #define CoLoadLibrary StaticCoLoadLibrary
+ #define CoFreeLibrary StaticCoFreeLibrary
+ #define CoFreeAllLibraries StaticCoFreeAllLibraries
+ #define CoCreateInstance StaticCoCreateInstance
+ #define StringFromIID StaticStringFromIID
+ #define CoDisconnectObject StaticCoDisconnectObject
+ #define CoReleaseMarshalData StaticCoReleaseMarshalData
+ #define CoFreeUnusedLibraries StaticCoFreeUnusedLibraries
+ #define IsEqualGUID StaticIsEqualGUID
+ #define StringFromCLSID StaticStringFromCLSID
+ #define CLSIDFromString StaticCLSIDFromString
+ #define RESULTFROMSCODE StaticRESULTFROMSCODE
+ #define GETSCODE StaticGETSCODE
+ #define CoRegisterMessageFilter StaticCoRegisterMessageFilter
+ #define CoIsHandlerConnected StaticCoIsHandlerConnected
+ #define CoMarshalHresult StaticCoMarshalHresult
+ #define CoUnmarshalHresult StaticCoUnmarshalHresult
+ #define CoGetCurrentProcess StaticCoGetCurrentProcess
+ #define CoIsOle1Class StaticCoIsOle1Class
+ #define CLSIDFromProgID StaticCLSIDFromProgID
+ #define ProgIDFromCLSID StaticProgIDFromCLSID
+ #define CoLockObjectExternal StaticCoLockObjectExternal
+ #define CoGetTreatAsClass StaticCoGetTreatAsClass
+ #define CoTreatAsClass StaticCoTreatAsClass
+ #define CoGetStandardMarshal StaticCoGetStandardMarshal
+ #define PropagateResult StaticPropagateResult
+ #define IIDFromString StaticIIDFromString
+ #define CoCreateStandardMalloc StaticCoCreateStandardMalloc
+ #define CoCreateGuid StaticCoCreateGuid
+ #define StringFromGUID2 StaticStringFromGUID2
+ #define CoGetClassExt StaticCoGetClassExt
+ #define Ole1ClassFromCLSID2 StaticOle1ClassFromCLSID2
+ #define CLSIDFromOle1Class StaticCLSIDFromOle1Class
+ #define CoOpenClassKey StaticCoOpenClassKey
+ #define GUIDFromString StaticGUIDFromString
+ #define CoFileTimeNow StaticCoFileTimeNow
+ #define RemAllocOID StaticRemAllocOID
+ #define RemFreeOID StaticRemFreeOID
+ #define RemCreateRemoteHandler StaticRemCreateRemoteHandler
+ #define RemConnectToObject StaticRemConnectToObject
+ #define RemGetInfoForCid StaticRemGetInfoForCid
+ #define LrpcCall StaticLrpcCall
+ #define LrpcDispatch StaticLrpcDispatch
+ #define LrpcRegisterMonitor StaticLrpcRegisterMonitor
+ #define LrpcRevokeMonitor StaticLrpcRevokeMonitor
+ #define LrpcGetThreadWindow StaticLrpcGetThreadWindow
+ #define LookupEtask StaticLookupEtask
+ #define SetEtask StaticSetEtask
+ #define RemLookupSHUnk StaticRemLookupSHUnk
+ #define CoMemctxOf StaticCoMemctxOf
+ #define CoMemAlloc StaticCoMemAlloc
+ #define CoMemFree StaticCoMemFree
+ #define CoRunModalLoop StaticCoRunModalLoop
+ #define CoHandleIncomingCall StaticCoHandleIncomingCall
+ #define CoSetAckState StaticCoSetAckState
+ #define OleProcessLrpcAE StaticOleProcessLrpcAE
+ #define CoFileTimeToMacDateTime StaticCoFileTimeToMacDateTime
+ #define CoMacDateTimeToFileTime StaticCoMacDateTimeToFileTime
+ #define InternalCoInitialize StaticInternalCoInitialize
+ #define CoHandlePendingMessage StaticCoHandlePendingMessage
+#endif //ID_OLE_STAT_COMPOBJ
+#if ID_OLE_STAT_PROXY
+ #define DllGetClassObject StaticDllGetClassObject
+#endif //ID_OLE_STAT_PROXY
+#if ID_OLE_STAT_OLE2NLS
+ #define CompareStringA StaticCompareStringA
+ #define LCMapStringA StaticLCMapStringA
+ #define GetLocaleInfoA StaticGetLocaleInfoA
+ #define GetStringTypeA StaticGetStringTypeA
+ #define GetSystemDefaultLangID StaticGetSystemDefaultLangID
+ #define GetUserDefaultLangID StaticGetUserDefaultLangID
+ #define GetSystemDefaultLCID StaticGetSystemDefaultLCID
+ #define GetUserDefaultLCID StaticGetUserDefaultLCID
+#endif //ID_OLE_STAT_OLE2NLS
+#endif //ID_MUNGE_STAT_NAMES
+#if ID_MUNGE_DLL_NAMES
+#if !ID_OLE_STAT_DOCFILE
+ #define StgCreateDocfile _DllStgCreateDocfile
+ #define StgCreateDocfileOnILockBytes _DllStgCreateDocfileOnILockBytes
+ #define StgOpenStorage _DllStgOpenStorage
+ #define StgOpenStorageOnILockBytes _DllStgOpenStorageOnILockBytes
+ #define StgIsStorageFile _DllStgIsStorageFile
+ #define StgIsStorageILockBytes _DllStgIsStorageILockBytes
+ #define StgSetTimes _DllStgSetTimes
+ #define StgSetTimesMac _DllStgSetTimesMac
+ #define StgSetTimesFSp _DllStgSetTimesFSp
+ #define DllGetClassObject _DllDllGetClassObject
+ #define StgCreateDocfileFSp _DllStgCreateDocfileFSp
+ #define StgOpenStorageFSp _DllStgOpenStorageFSp
+ #define StgCreateDocfileMac _DllStgCreateDocfileMac
+ #define StgOpenStorageMac _DllStgOpenStorageMac
+ #define StgIsStorageFileMac _DllStgIsStorageFileMac
+ #define StgIsStorageFileFSp _DllStgIsStorageFileFSp
+ #define StgGetFSpFromIStorage _DllStgGetFSpFromIStorage
+ #define StgGetFRefFromIStorage _DllStgGetFRefFromIStorage
+#endif // ID_OLE_STAT_DOCFILE
+#if !ID_OLE_STAT_USER
+ #define OleregOpenRegistration _DllOleregOpenRegistration
+ #define OleregCloseRegistration _DllOleregCloseRegistration
+ #define OleregGetValue _DllOleregGetValue
+ #define OleregSetValue _DllOleregSetValue
+ #define OleregRemoveKey _DllOleregRemoveKey
+ #define OleGlobalAddAtom _DllOleGlobalAddAtom
+ #define OleGlobalDuplicateAtom _DllOleGlobalDuplicateAtom
+ #define OleGlobalDeleteAtom _DllOleGlobalDeleteAtom
+ #define OleGlobalFindAtom _DllOleGlobalFindAtom
+ #define OleGlobalGetAtomName _DllOleGlobalGetAtomName
+ #define OleGlobalAlloc _DllOleGlobalAlloc
+ #define OleGlobalCompact _DllOleGlobalCompact
+ #define OleGlobalFree _DllOleGlobalFree
+ #define OleGlobalHandle _DllOleGlobalHandle
+ #define OleGlobalLock _DllOleGlobalLock
+ #define OleGlobalReAlloc _DllOleGlobalReAlloc
+ #define OleGlobalSize _DllOleGlobalSize
+ #define OleGlobalUnlock _DllOleGlobalUnlock
+ #define RegQueryValue _DllRegQueryValue
+ #define RegOpenKey _DllRegOpenKey
+ #define RegSetValue _DllRegSetValue
+ #define RegEnumKey _DllRegEnumKey
+ #define RegEnumProgID _DllRegEnumProgID
+ #define RegDeleteKey _DllRegDeleteKey
+ #define RegCreateKey _DllRegCreateKey
+ #define RegCloseKey _DllRegCloseKey
+ #define RegInitialize _DllRegInitialize
+ #define InitUserData _DllInitUserData
+ #define SendHighLevelEvent _DllSendHighLevelEvent
+ #define OleWinExec _DllOleWinExec
+ #define InitDB _DllInitDB
+ #define CloseDB _DllCloseDB
+ #define OleGetCurrentTask _DllOleGetCurrentTask
+ #define OleGetProcAddress _DllOleGetProcAddress
+ #define OleLoadLibrary _DllOleLoadLibrary
+ #define OleFreeLibrary _DllOleFreeLibrary
+ #define OutputDebugString _DllOutputDebugString
+ #define SoftAssert _DllSoftAssert
+ #define FnAssert _DllFnAssert
+ #define IsValidInterface _DllIsValidInterface
+ #define IsValidIid _DllIsValidIid
+ #define IsValidHandle _DllIsValidHandle
+ #define EnterOLEApi _DllEnterOLEApi
+ #define ExitOLEApi _DllExitOLEApi
+ #define FnAssertOn _DllFnAssertOn
+ #define GlobalFreePtr _DllGlobalFreePtr
+ #define GlobalAllocPtr _DllGlobalAllocPtr
+ #define UserInitialize _DllUserInitialize
+ #define UserUninitialize _DllUserUninitialize
+ #define IsValidInPtr _DllIsValidInPtr
+ #define IsValidOutPtr _DllIsValidOutPtr
+ #define RegQueryValueEx _DllRegQueryValueEx
+ #define RegFlush _DllRegFlush
+ #define RegDeleteValue _DllRegDeleteValue
+ #define RegSetValueEx _DllRegSetValueEx
+ #define RegEnumValue _DllRegEnumValue
+ #define OLEInitDBCSCountry _DllOLEInitDBCSCountry
+ #define IAnsiNext _DllIAnsiNext
+ #define IAnsiPrev _DllIAnsiPrev
+ #define OleMakeFSSpec _DllOleMakeFSSpec
+ #define OleFullPathFromFSSpec _DllOleFullPathFromFSSpec
+ #define OleGetFSSpecInfo _DllOleGetFSSpecInfo
+#endif //ID_OLE_STAT_USER
+#if !ID_OLE_STAT_OLE2DISP
+ #define DllGetClassObject _DllDllGetClassObject
+ #define SysAllocString _DllSysAllocString
+ #define SysReAllocString _DllSysReAllocString
+ #define SysAllocStringLen _DllSysAllocStringLen
+ #define SysReAllocStringLen _DllSysReAllocStringLen
+ #define SysFreeString _DllSysFreeString
+ #define SysStringLen _DllSysStringLen
+ #define VariantInit _DllVariantInit
+ #define VariantClear _DllVariantClear
+ #define VariantCopy _DllVariantCopy
+ #define VariantCopyInd _DllVariantCopyInd
+ #define VariantChangeType _DllVariantChangeType
+ #define VarI2FromI4 _DllVarI2FromI4
+ #define VarI2FromR4 _DllVarI2FromR4
+ #define VarI2FromR8 _DllVarI2FromR8
+ #define VarI2FromCy _DllVarI2FromCy
+ #define VarI2FromDate _DllVarI2FromDate
+ #define VarI2FromStr _DllVarI2FromStr
+ #define VarI2FromDisp _DllVarI2FromDisp
+ #define VarI2FromBool _DllVarI2FromBool
+ #define VarI4FromI2 _DllVarI4FromI2
+ #define VarI4FromR4 _DllVarI4FromR4
+ #define VarI4FromR8 _DllVarI4FromR8
+ #define VarI4FromCy _DllVarI4FromCy
+ #define VarI4FromDate _DllVarI4FromDate
+ #define VarI4FromStr _DllVarI4FromStr
+ #define VarI4FromDisp _DllVarI4FromDisp
+ #define VarI4FromBool _DllVarI4FromBool
+ #define VarR4FromI2 _DllVarR4FromI2
+ #define VarR4FromI4 _DllVarR4FromI4
+ #define VarR4FromR8 _DllVarR4FromR8
+ #define VarR4FromCy _DllVarR4FromCy
+ #define VarR4FromDate _DllVarR4FromDate
+ #define VarR4FromStr _DllVarR4FromStr
+ #define VarR4FromDisp _DllVarR4FromDisp
+ #define VarR4FromBool _DllVarR4FromBool
+ #define VarR8FromI2 _DllVarR8FromI2
+ #define VarR8FromI4 _DllVarR8FromI4
+ #define VarR8FromR4 _DllVarR8FromR4
+ #define VarR8FromCy _DllVarR8FromCy
+ #define VarR8FromDate _DllVarR8FromDate
+ #define VarR8FromStr _DllVarR8FromStr
+ #define VarR8FromDisp _DllVarR8FromDisp
+ #define VarR8FromBool _DllVarR8FromBool
+ #define VarDateFromI2 _DllVarDateFromI2
+ #define VarDateFromI4 _DllVarDateFromI4
+ #define VarDateFromR4 _DllVarDateFromR4
+ #define VarDateFromR8 _DllVarDateFromR8
+ #define VarDateFromCy _DllVarDateFromCy
+ #define VarDateFromStr _DllVarDateFromStr
+ #define VarDateFromDisp _DllVarDateFromDisp
+ #define VarDateFromBool _DllVarDateFromBool
+ #define VarCyFromI2 _DllVarCyFromI2
+ #define VarCyFromI4 _DllVarCyFromI4
+ #define VarCyFromR4 _DllVarCyFromR4
+ #define VarCyFromR8 _DllVarCyFromR8
+ #define VarCyFromDate _DllVarCyFromDate
+ #define VarCyFromStr _DllVarCyFromStr
+ #define VarCyFromDisp _DllVarCyFromDisp
+ #define VarCyFromBool _DllVarCyFromBool
+ #define VarBstrFromI2 _DllVarBstrFromI2
+ #define VarBstrFromI4 _DllVarBstrFromI4
+ #define VarBstrFromR4 _DllVarBstrFromR4
+ #define VarBstrFromR8 _DllVarBstrFromR8
+ #define VarBstrFromCy _DllVarBstrFromCy
+ #define VarBstrFromDate _DllVarBstrFromDate
+ #define VarBstrFromDisp _DllVarBstrFromDisp
+ #define VarBstrFromBool _DllVarBstrFromBool
+ #define VarBoolFromI2 _DllVarBoolFromI2
+ #define VarBoolFromI4 _DllVarBoolFromI4
+ #define VarBoolFromR4 _DllVarBoolFromR4
+ #define VarBoolFromR8 _DllVarBoolFromR8
+ #define VarBoolFromDate _DllVarBoolFromDate
+ #define VarBoolFromCy _DllVarBoolFromCy
+ #define VarBoolFromStr _DllVarBoolFromStr
+ #define VarBoolFromDisp _DllVarBoolFromDisp
+ #define SafeArrayCreate _DllSafeArrayCreate
+ #define SafeArrayDestroy _DllSafeArrayDestroy
+ #define SafeArrayGetDim _DllSafeArrayGetDim
+ #define SafeArrayGetElemsize _DllSafeArrayGetElemsize
+ #define SafeArrayGetUBound _DllSafeArrayGetUBound
+ #define SafeArrayGetLBound _DllSafeArrayGetLBound
+ #define SafeArrayLock _DllSafeArrayLock
+ #define SafeArrayUnlock _DllSafeArrayUnlock
+ #define SafeArrayAccessData _DllSafeArrayAccessData
+ #define SafeArrayUnaccessData _DllSafeArrayUnaccessData
+ #define SafeArrayGetElement _DllSafeArrayGetElement
+ #define SafeArrayPutElement _DllSafeArrayPutElement
+ #define SafeArrayCopy _DllSafeArrayCopy
+ #define SafeArrayAllocDescriptor _DllSafeArrayAllocDescriptor
+ #define SafeArrayAllocData _DllSafeArrayAllocData
+ #define SafeArrayDestroyDescriptor _DllSafeArrayDestroyDescriptor
+ #define SafeArrayDestroyData _DllSafeArrayDestroyData
+ #define SafeArrayRedim _DllSafeArrayRedim
+ #define VariantTimeToDosDateTime _DllVariantTimeToDosDateTime
+ #define DosDateTimeToVariantTime _DllDosDateTimeToVariantTime
+ #define DispGetParam _DllDispGetParam
+ #define DispGetIDsOfNames _DllDispGetIDsOfNames
+ #define DispInvoke _DllDispInvoke
+ #define CreateDispTypeInfo _DllCreateDispTypeInfo
+ #define CreateStdDispatch _DllCreateStdDispatch
+ #define RegisterActiveObject _DllRegisterActiveObject
+ #define RevokeActiveObject _DllRevokeActiveObject
+ #define GetActiveObject _DllGetActiveObject
+ #define DoInvokeMethod _DllDoInvokeMethod
+ #define VariantChangeTypeEx _DllVariantChangeTypeEx
+ #define SafeArrayPtrOfIndex _DllSafeArrayPtrOfIndex
+ #define MPWVarFromR4 _DllMPWVarFromR4
+ #define MPWVarFromR8 _DllMPWVarFromR8
+ #define MPWR4FromVar _DllMPWR4FromVar
+ #define MPWR8FromVar _DllMPWR8FromVar
+#endif //ID_OLE_STAT_OLE2DISP
+#if !ID_OLE_STAT_TYPELIB
+ #define CreateTypeLib _DllCreateTypeLib
+ #define LoadTypeLib _DllLoadTypeLib
+ #define LoadRegTypeLib _DllLoadRegTypeLib
+ #define RegisterTypeLib _DllRegisterTypeLib
+ #define LHashValOfNameSys _DllLHashValOfNameSys
+ #define QueryPathOfRegTypeLib _DllQueryPathOfRegTypeLib
+ #define LoadTypeLibFSp _DllLoadTypeLibFSp
+ #define RegisterTypeLibFolder _DllRegisterTypeLibFolder
+ #define QueryTypeLibFolder _DllQueryTypeLibFolder
+#endif //ID_OLE_STAT_TYPELIB
+#if !ID_OLE_STAT_DEF
+ #define OleBuildVersion _DllOleBuildVersion
+ #define OleInitialize _DllOleInitialize
+ #define OleUninitialize _DllOleUninitialize
+ #define DllGetClassObject _DllDllGetClassObject
+ #define OleQueryLinkFromData _DllOleQueryLinkFromData
+ #define OleQueryCreateFromData _DllOleQueryCreateFromData
+ #define OleCreateFromData _DllOleCreateFromData
+ #define OleCreateLinkFromData _DllOleCreateLinkFromData
+ #define OleCreate _DllOleCreate
+ #define OleCreateLink _DllOleCreateLink
+ #define OleLoad _DllOleLoad
+ #define OleSave _DllOleSave
+ #define OleRun _DllOleRun
+ #define OleIsRunning _DllOleIsRunning
+ #define OleLockRunning _DllOleLockRunning
+ #define ReadClassStg _DllReadClassStg
+ #define WriteClassStg _DllWriteClassStg
+ #define ReadClassStm _DllReadClassStm
+ #define WriteClassStm _DllWriteClassStm
+ #define BindMoniker _DllBindMoniker
+ #define MkParseDisplayName _DllMkParseDisplayName
+ #define OleSaveToStream _DllOleSaveToStream
+ #define OleLoadFromStream _DllOleLoadFromStream
+ #define CreateBindCtx _DllCreateBindCtx
+ #define CreateItemMoniker _DllCreateItemMoniker
+ #define CreateFileMoniker _DllCreateFileMoniker
+ #define CreateGenericComposite _DllCreateGenericComposite
+ #define GetRunningObjectTable _DllGetRunningObjectTable
+ #define OleGetMalloc _DllOleGetMalloc
+ #define ReleaseStgMedium _DllReleaseStgMedium
+ #define ReadStringStream _DllReadStringStream
+ #define WriteStringStream _DllWriteStringStream
+ #define RegisterDragDrop _DllRegisterDragDrop
+ #define RevokeDragDrop _DllRevokeDragDrop
+ #define DoDragDrop _DllDoDragDrop
+ #define CreateOleAdviseHolder _DllCreateOleAdviseHolder
+ #define CreateDataAdviseHolder _DllCreateDataAdviseHolder
+ #define OpenOrCreateStream _DllOpenOrCreateStream
+ #define CreateAntiMoniker _DllCreateAntiMoniker
+ #define CreatePointerMoniker _DllCreatePointerMoniker
+ #define MonikerRelativePathTo _DllMonikerRelativePathTo
+ #define MonikerCommonPrefixWith _DllMonikerCommonPrefixWith
+ #define OleSetClipboard _DllOleSetClipboard
+ #define OleGetClipboard _DllOleGetClipboard
+ #define OleDuplicateData _DllOleDuplicateData
+ #define CreateILockBytesOnHGlobal _DllCreateILockBytesOnHGlobal
+ #define GetHGlobalFromILockBytes _DllGetHGlobalFromILockBytes
+ #define GetClassFile _DllGetClassFile
+ #define OleDraw _DllOleDraw
+ #define OleCreateDefaultHandler _DllOleCreateDefaultHandler
+ #define OleCreateEmbeddingHelper _DllOleCreateEmbeddingHelper
+ #define OleConvertIStorageToOLESTREAMEx _DllOleConvertIStorageToOLESTREAMEx
+ #define OleConvertOLESTREAMToIStorageEx _DllOleConvertOLESTREAMToIStorageEx
+ #define SetDocumentBitStg _DllSetDocumentBitStg
+ #define GetDocumentBitStg _DllGetDocumentBitStg
+ #define WriteOleStg _DllWriteOleStg
+ #define ReadOleStg _DllReadOleStg
+ #define OleCreateFromFile _DllOleCreateFromFile
+ #define OleCreateLinkToFile _DllOleCreateLinkToFile
+ #define CreateDataCache _DllCreateDataCache
+ #define OleConvertIStorageToOLESTREAM _DllOleConvertIStorageToOLESTREAM
+ #define OleConvertOLESTREAMToIStorage _DllOleConvertOLESTREAMToIStorage
+ #define ReadFmtUserTypeStg _DllReadFmtUserTypeStg
+ #define WriteFmtUserTypeStg _DllWriteFmtUserTypeStg
+ #define OleFlushClipboard _DllOleFlushClipboard
+ #define OleIsCurrentClipboard _DllOleIsCurrentClipboard
+ #define OleTranslateAccelerator _DllOleTranslateAccelerator
+ #define OleDoAutoConvert _DllOleDoAutoConvert
+ #define OleGetAutoConvert _DllOleGetAutoConvert
+ #define OleSetAutoConvert _DllOleSetAutoConvert
+ #define GetConvertStg _DllGetConvertStg
+ #define SetConvertStg _DllSetConvertStg
+ #define CreateStreamOnHGlobal _DllCreateStreamOnHGlobal
+ #define GetHGlobalFromStream _DllGetHGlobalFromStream
+ #define OleDuplicateMedium _DllOleDuplicateMedium
+ #define OleSetContainedObject _DllOleSetContainedObject
+ #define OleNoteObjectVisible _DllOleNoteObjectVisible
+ #define OleCreateStaticFromData _DllOleCreateStaticFromData
+ #define OleRegGetUserType _DllOleRegGetUserType
+ #define OleRegGetMiscStatus _DllOleRegGetMiscStatus
+ #define OleRegEnumFormatEtc _DllOleRegEnumFormatEtc
+ #define OleRegEnumVerbs _DllOleRegEnumVerbs
+ #define OleGetEnumFormatEtc _DllOleGetEnumFormatEtc
+ #define OleSetEnumFormatEtc _DllOleSetEnumFormatEtc
+ #define OleRemoveEnumFormatEtc _DllOleRemoveEnumFormatEtc
+ #define OleSendLLE _DllOleSendLLE
+ #define OleSetInPlaceWindow _DllOleSetInPlaceWindow
+ #define OleUnSetInPlaceWindow _DllOleUnSetInPlaceWindow
+ #define OleClipWindow _DllOleClipWindow
+ #define OleClipWindows _DllOleClipWindows
+ #define OleInsertMenus _DllOleInsertMenus
+ #define OleHashMenuID _DllOleHashMenuID
+ #define OleUnhashMenuID _DllOleUnhashMenuID
+ #define OlePatchGetMHandle _DllOlePatchGetMHandle
+ #define OleUnpatchGetMHandle _DllOleUnpatchGetMHandle
+ #define OleAddMBarMenu _DllOleAddMBarMenu
+ #define OleSetInPlaceRects _DllOleSetInPlaceRects
+ #define OleMaskMouse _DllOleMaskMouse
+ #define OleMoveWindow _DllOleMoveWindow
+ #define OleSizeParentWindow _DllOleSizeParentWindow
+ #define OleSizeObjectWindow _DllOleSizeObjectWindow
+ #define OleDragParentWindow _DllOleDragParentWindow
+ #define OleDragObjectWindow _DllOleDragObjectWindow
+ #define OleGrowParentWindow _DllOleGrowParentWindow
+ #define OleGrowObjectWindow _DllOleGrowObjectWindow
+ #define OleNewMBar _DllOleNewMBar
+ #define OleDisposeMBar _DllOleDisposeMBar
+ #define OleProcessDdeAE _DllOleProcessDdeAE
+ #define OleProcessClipboardAE _DllOleProcessClipboardAE
+ #define InitializeClipboard _DllInitializeClipboard
+ #define UnInitializeClipboard _DllUnInitializeClipboard
+ #define OleIsClipboardFormatAvailable _DllOleIsClipboardFormatAvailable
+ #define OleGetClipboardData _DllOleGetClipboardData
+ #define OleSetClipboardData _DllOleSetClipboardData
+ #define OleEnumClipboardFormats _DllOleEnumClipboardFormats
+ #define StoreClap _DllStoreClap
+ #define OleCountClipboardFormats _DllOleCountClipboardFormats
+ #define OleCloseClipboard _DllOleCloseClipboard
+ #define OleEmptyClipboard _DllOleEmptyClipboard
+ #define OleSetClipboardEx _DllOleSetClipboardEx
+ #define OleZoomParentWindow _DllOleZoomParentWindow
+ #define OleSetParentRgns _DllOleSetParentRgns
+ #define CreateFileMonikerFSp _DllCreateFileMonikerFSp
+ #define OleCreateFromFSp _DllOleCreateFromFSp
+ #define OleCreateLinkToFSp _DllOleCreateLinkToFSp
+ #define OleGetCursor _DllOleGetCursor
+ #define OleSetCursor _DllOleSetCursor
+ #define OleUpdateCursor _DllOleUpdateCursor
+ #define GetClassFSp _DllGetClassFSp
+ #define ReadOle1FmtProgIDStgMac _DllReadOle1FmtProgIDStgMac
+ #define WriteOle1FmtProgIDStgMac _DllWriteOle1FmtProgIDStgMac
+ #define OleGetIconOfFile _DllOleGetIconOfFile
+ #define OleGetIconOfClass _DllOleGetIconOfClass
+ #define OleGetIconOfFSp _DllOleGetIconOfFSp
+ #define OlePictFromIconAndLabel _DllOlePictFromIconAndLabel
+ #define OleGetIconFromIconSuite _DllOleGetIconFromIconSuite
+ #define OleUIPictIconFree _DllOleUIPictIconFree
+ #define OleUIPictIconDraw _DllOleUIPictIconDraw
+ #define OleUIPictExtractIcon _DllOleUIPictExtractIcon
+ #define OleUIPictExtractLabel _DllOleUIPictExtractLabel
+ #define OleUIPictExtractIconSource _DllOleUIPictExtractIconSource
+ #define OleMetaFileToPict _DllOleMetaFileToPict
+ #define OleQueryCreateAll _DllOleQueryCreateAll
+ #define OleWhichGrowHandle _DllOleWhichGrowHandle
+ #define MkGetMacNetInfo _DllMkGetMacNetInfo
+#endif //ID_OLE_STAT_DEF
+#if !ID_OLE_STAT_COMPOBJ
+ #define CoBuildVersion _DllCoBuildVersion
+ #define CoInitialize _DllCoInitialize
+ #define CoUninitialize _DllCoUninitialize
+ #define CoGetMalloc _DllCoGetMalloc
+ #define CoRegisterClassObject _DllCoRegisterClassObject
+ #define CoRevokeClassObject _DllCoRevokeClassObject
+ #define CoGetClassObject _DllCoGetClassObject
+ #define CoMarshalInterface _DllCoMarshalInterface
+ #define CoUnmarshalInterface _DllCoUnmarshalInterface
+ #define CoLoadLibrary _DllCoLoadLibrary
+ #define CoFreeLibrary _DllCoFreeLibrary
+ #define CoFreeAllLibraries _DllCoFreeAllLibraries
+ #define CoCreateInstance _DllCoCreateInstance
+ #define StringFromIID _DllStringFromIID
+ #define CoDisconnectObject _DllCoDisconnectObject
+ #define CoReleaseMarshalData _DllCoReleaseMarshalData
+ #define CoFreeUnusedLibraries _DllCoFreeUnusedLibraries
+ #define IsEqualGUID _DllIsEqualGUID
+ #define StringFromCLSID _DllStringFromCLSID
+ #define CLSIDFromString _DllCLSIDFromString
+ #define RESULTFROMSCODE _DllRESULTFROMSCODE
+ #define GETSCODE _DllGETSCODE
+ #define CoRegisterMessageFilter _DllCoRegisterMessageFilter
+ #define CoIsHandlerConnected _DllCoIsHandlerConnected
+ #define CoMarshalHresult _DllCoMarshalHresult
+ #define CoUnmarshalHresult _DllCoUnmarshalHresult
+ #define CoGetCurrentProcess _DllCoGetCurrentProcess
+ #define CoIsOle1Class _DllCoIsOle1Class
+ #define CLSIDFromProgID _DllCLSIDFromProgID
+ #define ProgIDFromCLSID _DllProgIDFromCLSID
+ #define CoLockObjectExternal _DllCoLockObjectExternal
+ #define CoGetTreatAsClass _DllCoGetTreatAsClass
+ #define CoTreatAsClass _DllCoTreatAsClass
+ #define CoGetStandardMarshal _DllCoGetStandardMarshal
+ #define PropagateResult _DllPropagateResult
+ #define IIDFromString _DllIIDFromString
+ #define CoCreateStandardMalloc _DllCoCreateStandardMalloc
+ #define CoCreateGuid _DllCoCreateGuid
+ #define StringFromGUID2 _DllStringFromGUID2
+ #define CoGetClassExt _DllCoGetClassExt
+ #define Ole1ClassFromCLSID2 _DllOle1ClassFromCLSID2
+ #define CLSIDFromOle1Class _DllCLSIDFromOle1Class
+ #define CoOpenClassKey _DllCoOpenClassKey
+ #define GUIDFromString _DllGUIDFromString
+ #define CoFileTimeNow _DllCoFileTimeNow
+ #define RemAllocOID _DllRemAllocOID
+ #define RemFreeOID _DllRemFreeOID
+ #define RemCreateRemoteHandler _DllRemCreateRemoteHandler
+ #define RemConnectToObject _DllRemConnectToObject
+ #define RemGetInfoForCid _DllRemGetInfoForCid
+ #define LrpcCall _DllLrpcCall
+ #define LrpcDispatch _DllLrpcDispatch
+ #define LrpcRegisterMonitor _DllLrpcRegisterMonitor
+ #define LrpcRevokeMonitor _DllLrpcRevokeMonitor
+ #define LrpcGetThreadWindow _DllLrpcGetThreadWindow
+ #define LookupEtask _DllLookupEtask
+ #define SetEtask _DllSetEtask
+ #define RemLookupSHUnk _DllRemLookupSHUnk
+ #define CoMemctxOf _DllCoMemctxOf
+ #define CoMemAlloc _DllCoMemAlloc
+ #define CoMemFree _DllCoMemFree
+ #define CoRunModalLoop _DllCoRunModalLoop
+ #define CoHandleIncomingCall _DllCoHandleIncomingCall
+ #define CoSetAckState _DllCoSetAckState
+ #define OleProcessLrpcAE _DllOleProcessLrpcAE
+ #define CoFileTimeToMacDateTime _DllCoFileTimeToMacDateTime
+ #define CoMacDateTimeToFileTime _DllCoMacDateTimeToFileTime
+ #define InternalCoInitialize _DllInternalCoInitialize
+ #define CoHandlePendingMessage _DllCoHandlePendingMessage
+#endif //ID_OLE_STAT_COMPOBJ
+#if !ID_OLE_STAT_PROXY
+ #define DllGetClassObject _DllDllGetClassObject
+#endif //ID_OLE_STAT_PROXY
+#if !ID_OLE_STAT_OLE2NLS
+ #define CompareStringA _DllCompareStringA
+ #define LCMapStringA _DllLCMapStringA
+ #define GetLocaleInfoA _DllGetLocaleInfoA
+ #define GetStringTypeA _DllGetStringTypeA
+ #define GetSystemDefaultLangID _DllGetSystemDefaultLangID
+ #define GetUserDefaultLangID _DllGetUserDefaultLangID
+ #define GetSystemDefaultLCID _DllGetSystemDefaultLCID
+ #define GetUserDefaultLCID _DllGetUserDefaultLCID
+#endif //ID_OLE_STAT_OLE2NLS
+#endif //ID_MUNGE_DLL_NAMES
diff --git a/private/oleauto/src/dispatch/nlsapi.c b/private/oleauto/src/dispatch/nlsapi.c
new file mode 100644
index 000000000..17b16003b
--- /dev/null
+++ b/private/oleauto/src/dispatch/nlsapi.c
@@ -0,0 +1,3148 @@
+/***
+*nlsapi.c - National language support functions.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains a partial implementation of the NLS API
+* from Win32 for the Win16/Mac platform platform.
+*
+*Revision History:
+*
+* [00] 12-Nov-92 petergo: Created.
+* [01] 14-Apr-93 petergo: Major revisions for performance.
+* [02] 01-Sep-93 bradlo: Major revisions to bring in line w/NT.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#if OE_WIN16
+# define FASTCALL /* __fastcall disable because of a c8 compiler bug */
+# define SSBASE __based(__segname("_STACK")) /* For stack based pointers */
+#elif OE_MAC
+ // REVIEW: is this definition of lstrlen correct?
+# define lstrlen strlen
+# define FASTCALL
+# define SSBASE
+typedef int BOOL;
+# define TRUE 1
+# define FALSE 0
+ // REVIEW: can we do something better with the following?
+# define LogParamError(A,B,C)
+#endif
+
+ASSERTDATA
+
+#include "nlsintrn.h"
+#ifdef FE_DBCS
+//# include <stdlib.h>
+# include "nlsdbcs.h"
+#endif
+
+
+// no C run-time library.
+#pragma intrinsic(MEMCPY, MEMCMP, MEMSET, STRCPY, STRLEN)
+
+
+#if OE_WIN
+# define NLSDAT(L, R, CCHICOUNTRY, SZICOUNTRY, CCHSABBREVLANG, SZSABBREVLANG) \
+ {0x ## L, \
+ {CCHICOUNTRY, SZICOUNTRY}, \
+ {CCHSABBREVLANG, SZSABBREVLANG}, \
+ g_rglcinfo ## L, (STRINFO FAR*)&g_strinfo ## L }
+#else
+# define NLSDAT(L, R, CCHICOUNTRY, SZICOUNTRY, CCHSABBREVLANG, SZSABBREVLANG) \
+ {0x ## L, R, LoadNlsInfo ## L, NULL }
+#endif
+
+
+#if OE_MAC // we now have to write to this...
+NLSDATA g_rgnls[] =
+#else
+static NLSDATA NEARDATA g_rgnls[] =
+#endif
+{
+ NLSDAT(0403, 8, 2, "34", 3, "CAT"), // UNDONE: verify MAC region code
+#ifdef FE_DBCS
+ NLSDAT(0404, 53, 3,"886", 3, "CHT"),
+#endif
+ NLSDAT(0405, -1, 2, "42", 3, "CSY"),
+ NLSDAT(0406, 9, 2, "45", 3, "DAN"),
+ NLSDAT(0407, 3, 2, "49", 3, "DEU"),
+ NLSDAT(0408, 20, 2, "30", 3, "ELL"),
+ NLSDAT(0409, 0, 1, "1", 3, "ENU"),
+ NLSDAT(040a, 8, 2, "34", 3, "ESP"),
+ NLSDAT(040b, 17, 3,"358", 3, "FIN"),
+ NLSDAT(040c, 1, 2, "33", 3, "FRA"),
+ NLSDAT(040e, 43, 2, "36", 3, "HUN"),
+ NLSDAT(040f, -1, 3,"354", 3, "ISL"), //UNDONE: change region = 21
+ // once CP ? is available
+ NLSDAT(0410, 4, 2, "39", 3, "ITA"),
+#ifdef FE_DBCS
+ NLSDAT(0411, 14, 2, "81", 3, "JPN"),
+ NLSDAT(0412, 51, 2, "82", 3, "KOR"),
+#endif
+ NLSDAT(0413, 5, 2, "31", 3, "NLD"),
+ NLSDAT(0414, 12, 2, "47", 3, "NOR"),
+ NLSDAT(0415, 42, 2, "48", 3, "PLK"),
+ NLSDAT(0816, 10, 3,"351", 3, "PTG"), // Mac: VerPort is 0816
+ NLSDAT(0416, 10, 2, "55", 3, "PTB"),
+ NLSDAT(0419, 49, 1, "7", 3, "RUS"),
+ NLSDAT(041b, -1, 2, "42", 3, "SKY"),
+ NLSDAT(041d, 7, 2, "46", 3, "SVE"),
+ NLSDAT(041f, 24, 2, "90", 3, "TRK"),
+#ifdef FE_DBCS
+ NLSDAT(0804, 52, 2, "86", 3, "CHS"),
+#endif
+ NLSDAT(0807, 19, 2, "41", 3, "DES"),
+ NLSDAT(0809, 2, 2, "44", 3, "ENG"),
+ NLSDAT(080a, -1, 2, "52", 3, "ESM"),
+ NLSDAT(080c, 6, 2, "32", 3, "FRB"),
+ NLSDAT(0810, -1, 2, "41", 3, "ITS"),
+ NLSDAT(0813, -1, 2, "32", 3, "NLB"),
+ NLSDAT(0814, 12, 2, "47", 3, "NON"),
+ NLSDAT(0c07, -1, 2, "43", 3, "DEA"),
+ NLSDAT(0c09, 15, 2, "61", 3, "ENA"),
+ NLSDAT(0c0a, -1, 2, "34", 3, "ESN"),
+ NLSDAT(0c0c, 11, 1, "2", 3, "FRC"),
+ NLSDAT(1009, -1, 1, "2", 3, "ENC"),
+ NLSDAT(100c, 18, 2, "41", 3, "FRS"),
+ NLSDAT(1409, -1, 2, "64", 3, "ENZ"),
+ NLSDAT(1809, 50, 3,"353", 3, "ENI"),
+
+ NLSDAT(040d, -1, 3,"972", 3, "HEB"), // UNDONE: verify MAC region code
+ NLSDAT(0401, -1, 3,"966", 3, "ARA"), // UNDONE: verify MAC region code
+ NLSDAT(0801, -1, 3,"964", 3, "ARI"), // UNDONE: verify MAC region code
+ NLSDAT(0c01, -1, 2, "20", 3, "ARE"), // UNDONE: verify MAC region code
+ NLSDAT(1001, -1, 3,"218", 3, "ARL"), // UNDONE: verify MAC region code
+ NLSDAT(1401, -1, 3,"213", 3, "ARG"), // UNDONE: verify MAC region code
+ NLSDAT(1801, -1, 3,"212", 3, "ARM"), // UNDONE: verify MAC region code
+ NLSDAT(1c01, -1, 3,"216", 3, "ART"), // UNDONE: verify MAC region code
+ NLSDAT(2001, -1, 3,"968", 3, "ARO"), // UNDONE: verify MAC region code
+ NLSDAT(2401, -1, 3,"967", 3, "ARY"), // UNDONE: verify MAC region code
+ NLSDAT(2801, -1, 3,"963", 3, "ARS"), // UNDONE: verify MAC region code
+ NLSDAT(2c01, -1, 3,"962", 3, "ARJ"), // UNDONE: verify MAC region code
+ NLSDAT(3001, -1, 3,"961", 3, "ARB"), // UNDONE: verify MAC region code
+ NLSDAT(3401, -1, 3,"965", 3, "ARK"), // UNDONE: verify MAC region code
+ NLSDAT(3801, -1, 3,"971", 3, "ARU"), // UNDONE: verify MAC region code
+ NLSDAT(3c01, -1, 3,"973", 3, "ARH"), // UNDONE: verify MAC region code
+ NLSDAT(4001, -1, 3,"974", 3, "ARQ"), // UNDONE: verify MAC region code
+ NLSDAT(0429, -1, 3,"981", 3, "FAR"), // UNDONE: verify MAC region code
+
+};
+#undef NLSDAT
+
+// cached nls info pointer
+#ifdef _MAC
+NLSDATA NEARDATA *g_pnls = NULL;
+STRINFO NEARDATA FAR* g_pstrinfo = NULL;
+#else
+NLSDATA * NEARDATA g_pnls = NULL;
+STRINFO FAR* NEARDATA g_pstrinfo = NULL;
+#endif
+
+static LCID NEARDATA g_lcidSystem = (LCID)-1; // current system lcid.
+
+// This is the "current" LCID; i.e., the LCID we have cached
+// information for. This is not necessarily the system default locale.
+static LCID NEARDATA g_lcidCurrent = (LCID)-1;
+
+#if OE_WIN // {
+
+// Windows specific globals
+
+HINSTANCE g_hinstDLL = (HINSTANCE)NULL; // Instance handle
+
+// Win.INI section with INTL setting.
+static char NEARDATA g_szIntl[] = "intl";
+
+// notification window.
+static HWND NEARDATA g_hwndNotify;
+
+// task of notification window.
+static HTASK NEARDATA g_htaskNotify;
+
+static LCID PASCAL LcidFromWinIni(void);
+
+// Cache characters needed for string<->number conversions
+static char g_chDecimal;
+static char g_chThousand;
+static char g_chILZERO;
+
+//REVIEW: caching only 10 chars of the currency symbol.
+//REVIEW: the control panel allows you to enter only 5.
+static char g_szCurrency[11];
+
+// Callback function into ole2disp.dll when WIN.INI changes
+static FARPROC g_pfnCacheNotifyProc;
+
+#endif // }
+
+
+#if OE_WIN /* { */
+
+/***
+*LibMain - library initialization
+*Purpose:
+* Called when the DLL is loaded.
+*
+*Entry:
+* hinst - instance handle
+* wDataSeg - data segment
+* cbHeapSize - size of default heap
+* lpszCmdLine - command line
+*
+*Exit:
+* returns 1 on success, 0 on failure.
+*
+***********************************************************************/
+
+int FAR PASCAL EXPORT
+LibMain(
+ HINSTANCE hinst,
+ unsigned short wDataSeg,
+ unsigned short cbHeapSize,
+ char FAR* lpszCmdLine)
+{
+ g_hinstDLL = hinst;
+
+ return 1; // Success.
+}
+
+/***
+*NotifyWindowProc
+*Purpose:
+* window proc for the window that we get Win.INI change notifications
+* from
+*
+***********************************************************************/
+LRESULT CALLBACK EXPORT
+NotifyWindowProc(HWND hwnd, unsigned int uMsg, WPARAM wp, LPARAM lp)
+{
+ switch (uMsg) {
+ case WM_CREATE:
+ case WM_WININICHANGE:
+ g_lcidSystem = LcidFromWinIni();
+ NotifyNLSInfoChanged();
+ return 0;
+ default:
+ return DefWindowProc(hwnd, uMsg, wp, lp);
+ }
+}
+
+/***
+*void WEP(BOOL)
+*
+*Purpose:
+* Handle exit notification from Windows.
+* This routine is called by Windows when the library is freed
+* by its last client.
+*
+* NOTE: other one time termination occurs in dtors for global objects
+*
+* REVIEW: this should be put in its own fixed segment to prevent a crash
+* when reloading this segment during shutdown. This may not be a problem
+* on Win31 and if we require Win31.
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value =
+*
+***********************************************************************/
+void FAR PASCAL EXPORT
+WEP(BOOL fSystemExit)
+{
+ if (fSystemExit == WEP_FREE_DLL) {
+ // Destroy the notification window.
+ if (g_hwndNotify
+ && IsWindow(g_hwndNotify)
+ && GetWindowWord(g_hwndNotify, GWW_HINSTANCE) == g_hinstDLL)
+ {
+ DestroyWindow(g_hwndNotify);
+ }
+ }
+}
+
+#endif /* } */
+
+#ifdef _MAC /* { */
+
+/***
+*PRIVATE LCID LcidFromIntl0
+*Purpose:
+* Determines the current system LCID by reading looking at
+* the region code in the intl0 resource.
+*
+* On the mac we scan our nlsdata structs for the entry with
+* a region code that matches the region code of the systems
+* intl0 resource, and return the lcid of that entry.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = LCID. The current system locale ID.
+*
+***********************************************************************/
+PRIVATE_(LCID)
+LcidFromIntl0()
+{
+ Intl0Hndl intl0;
+ unsigned char region;
+ NLSDATA *pnls, *pnlsEnd;
+
+ intl0 = (Intl0Hndl)IUGetIntl(0);
+ region = ((*intl0)->intl0Vers >> 8) & 0xff;
+
+ pnlsEnd = &g_rgnls[DIM(g_rgnls)];
+ for(pnls = g_rgnls; pnls < pnlsEnd; ++pnls){
+ // (-1) means there is no mac region corresponding to this lcid
+ if(pnls->region == -1)
+ continue;
+ if(pnls->region == region)
+ return pnls->lcid;
+ }
+
+ return 0; // unknown
+}
+
+#else /* }{ */
+
+/***
+*LcidFromWinIni - determine current system LCID
+*Purpose:
+* Determines the current system LCID by reading the intl section
+* of WIN.INI.
+*
+* The mapping is made by looking at the language and country settings;
+* the language setting is given precidence if they conflict.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns the system LCID. If WIN.INI information could not be
+* read, or the country/language information did not match any of the
+* locales in the resource, then 0 is returned.
+*
+***********************************************************************/
+
+PRIVATE_(LCID)
+LcidFromWinIni()
+{
+ LCID lcid; // Best match found so far.
+ char szCountry[6]; // Country code
+ char szLangAbbrev[4]; // Language abbreviation.
+#if OE_WIN
+ char szDecimal[2];
+#endif // OE_WIN
+ LCINFO FAR* plcinfo;
+ NLSDATA *pnls, *pnlsEnd;
+ int cchCountry, cchLangAbbrev;
+ int fLangMatch, fCountryMatch, fPartLangMatch;
+
+static char NEARDATA szLastSLang[4]; // last read sLanguage
+static char NEARDATA szLastICountry[6]; // last read iCountry
+static LCID NEARDATA lcidLastCur = (LCID)-1; // last known system LCID
+
+ enum {
+ NOMATCH,
+ PARTLANG,
+ FULLLANG,
+ PARTLANGCOUNTRY,
+ FULLLANGCOUNTRY
+ } matchBest; // kind of best match so far
+
+ lcid = 0; // Keeps track of best match so far.
+ matchBest = NOMATCH;
+
+#if OE_WIN
+ if ( GetProfileString(g_szIntl, "sDecimal", "", szDecimal, sizeof(szDecimal)) > 0 )
+ g_chDecimal = szDecimal[0];
+ else
+ g_chDecimal = '\0';
+
+ if ( GetProfileString(g_szIntl, "sThousand", "", szDecimal, sizeof(szDecimal)) > 0 )
+ g_chThousand = szDecimal[0];
+ else
+ g_chThousand = '\0';
+
+ if ( GetProfileString(g_szIntl, "iLzero", "", szDecimal, sizeof(szDecimal)) > 0 )
+ g_chILZERO = szDecimal[0];
+ else
+ g_chILZERO = '\0';
+
+ if ( GetProfileString(g_szIntl, "sCurrency", "", g_szCurrency, sizeof(g_szCurrency)) <= 0 )
+ g_szCurrency[0] = '\0';
+#endif // OE_WIN
+
+ // Get language code and country code to match against stored values.
+ cchLangAbbrev = GetProfileString(g_szIntl, "sLanguage", "",
+ szLangAbbrev, sizeof(szLangAbbrev));
+ if (cchLangAbbrev == 0)
+ return lcid;
+
+ AnsiUpper(szLangAbbrev);
+
+ // A few Win3.1 abbreviations don't match at all the "correct"
+ // ones. Translate them to match.
+ if (lstrcmpi(szLangAbbrev, "cro") == 0)
+ STRCPY(szLangAbbrev, "SHL"); // Croation.
+ if (lstrcmpi(szLangAbbrev, "cyr") == 0)
+ STRCPY(szLangAbbrev, "RUS"); // Russian.
+ if (lstrcmpi(szLangAbbrev, "grk") == 0)
+ STRCPY(szLangAbbrev, "ELL"); // Greek
+
+ cchCountry = GetProfileString(g_szIntl, "iCountry", "",
+ szCountry, sizeof(szCountry));
+ if (cchCountry == 0)
+ return lcid;
+
+ // Check if they match the last read ones, and if so, return
+ // last read lcid. This saves much extra processing.
+ if (lcidLastCur != (LCID) -1) {
+ if (MEMCMP(szLangAbbrev, szLastSLang, cchLangAbbrev) == 0 &&
+ MEMCMP(szCountry, szLastICountry, cchCountry) == 0)
+ return lcidLastCur;
+ }
+
+ // Next, try to match against stored values by going through values
+ // in order.
+ pnlsEnd = &g_rgnls[DIM(g_rgnls)];
+ for(pnls = g_rgnls; pnls < pnlsEnd; ++pnls){
+
+ fLangMatch = fPartLangMatch = fCountryMatch = FALSE;
+
+ // Check for language match.
+ plcinfo = &pnls->lcinfoSABBREVLANGNAME;
+#ifdef _DEBUG
+ // make sure that the local copy of the SABBREVLANGNAME
+ // matches that in the locale's lcinfo data.
+ { LCINFO FAR* plcinfoTmp;
+ plcinfoTmp = &pnls->prglcinfo[LOCALE_SABBREVLANGNAME];
+ ASSERT(plcinfo->cch == plcinfoTmp->cch);
+ ASSERT(MEMCMP(plcinfo->prgb, plcinfoTmp->prgb, plcinfo->cch) == 0);
+ }
+#endif
+ if (cchLangAbbrev == (int)plcinfo->cch
+ && MEMCMP(plcinfo->prgb, szLangAbbrev, cchLangAbbrev) == 0)
+ {
+ // Language match.
+ fLangMatch = TRUE;
+ }
+ else if (MEMCMP(plcinfo->prgb, szLangAbbrev, 2) == 0) {
+ // Partial (2-letter) language match
+ fPartLangMatch = TRUE;
+ }
+
+ // Check for country match.
+ plcinfo = &pnls->lcinfoICOUNTRY;
+#ifdef _DEBUG
+ // make sure that the local copy of the ICOUNTRY
+ // matches that in the locale's lcinfo data.
+ { LCINFO FAR* plcinfoTmp;
+ plcinfoTmp = &pnls->prglcinfo[LOCALE_ICOUNTRY];
+ ASSERT(plcinfo->cch == plcinfoTmp->cch);
+ ASSERT(MEMCMP(plcinfo->prgb, plcinfoTmp->prgb, plcinfo->cch) == 0);
+ }
+#endif
+ if (cchCountry == (int)plcinfo->cch
+ && MEMCMP(plcinfo->prgb, szCountry, cchCountry) == 0)
+ {
+ // Country match.
+ fCountryMatch = TRUE;
+ }
+
+ // Check if this locale matches better than previous best match.
+ if (fLangMatch && fCountryMatch && matchBest < FULLLANGCOUNTRY) {
+ matchBest = FULLLANGCOUNTRY;
+ lcid = pnls->lcid;
+ }
+ else if (fPartLangMatch && fCountryMatch && matchBest < PARTLANGCOUNTRY) {
+ matchBest = PARTLANGCOUNTRY;
+ lcid = pnls->lcid;
+ }
+ else if (fLangMatch && matchBest < FULLLANG) {
+ matchBest = FULLLANG;
+ lcid = pnls->lcid;
+ }
+ else if (fPartLangMatch && matchBest < PARTLANG) {
+ matchBest = PARTLANG;
+ lcid = pnls->lcid;
+ }
+ }
+
+ return lcid; // Return best matching LCID found.
+}
+
+#endif /* } */
+
+/***
+*SystemLcid
+*Purpose:
+* Get the system LCID
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns the system LCID. I
+*
+***********************************************************************/
+PRIVATE_(LCID)
+SystemLcid()
+{
+#ifdef _MAC /* { */
+
+ if(g_lcidSystem != (LCID)-1)
+ return g_lcidSystem;
+
+ return g_lcidSystem = LcidFromIntl0();
+
+#else /* }{ */
+
+ // When the client process that we created the notification window
+ // with goes away, Windows will kill the notification window too.
+ // So we must test to see if it is still there before using the
+ // cached value of g_lcidSystem. Note that window handles can be
+ // reused; hence the test of the hinstance.
+
+ if (g_hwndNotify && IsWindow(g_hwndNotify) &&
+ GetWindowWord(g_hwndNotify, GWW_HINSTANCE) == g_hinstDLL)
+ {
+ // The notification window is up and running. The cached
+ // LCID must be correct.
+ return g_lcidSystem;
+ }
+ else {
+ WNDCLASS wc;
+ char FAR* szClassName = "OLE2NLS";
+
+ // register window class.
+ if (! GetClassInfo(g_hinstDLL, szClassName, &wc)) {
+ wc.style = 0;
+ wc.lpfnWndProc = NotifyWindowProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = g_hinstDLL;
+ wc.hIcon = 0;
+ wc.hCursor = 0;
+ wc.hbrBackground = 0;
+ wc.lpszMenuName = 0;
+ wc.lpszClassName = szClassName;
+ if (! RegisterClass(&wc))
+ return LcidFromWinIni();
+ }
+
+ g_hwndNotify = CreateWindow(
+ "OLE2NLS", NULL, WS_OVERLAPPED,
+ 0, 0, 0, 0,
+ (HWND) NULL, (HMENU) NULL,
+ g_hinstDLL, NULL);
+ if (! g_hwndNotify)
+ return LcidFromWinIni();
+ else
+ return g_lcidSystem; // updated by WM_CREATE processing.
+ }
+
+#endif /* } */
+}
+
+#ifdef _MAC /* { */
+
+static int
+StringNCopyQuote(char *szDst, char *szSrc, int max)
+{
+ int n;
+
+ if (*szSrc == '\0')
+ return 0;
+
+ n = 0;
+ *szDst++ = '\'';
+ while(*szSrc != '\0'){
+ *szDst++ = *szSrc++;
+ if(++n == max)
+ break;
+ }
+ *szDst++ = '\'';
+ return n+2;
+}
+
+static int
+StringNCopy(char *szDst, char *szSrc, int max)
+{
+ int n;
+
+ n = 0;
+ while(*szSrc != '\0'){
+ *szDst++ = *szSrc++;
+ if(++n == max)
+ return n;
+ }
+ *szDst = '\0';
+ return n;
+}
+
+
+/***
+*PRIVATE int LongDateFmtFromIntl1
+*Purpose:
+* Construct a long date format string from the information in
+* the intl1 resource. Because different versions of the MacOS
+* have different flavors of info (latter versions have additional
+* info) in the intl1 resource, we build this format string in
+* a two step process. First we build a template that describes
+* the components of this format string - the purpose of this
+* template is to factor out all the OS version specific info.
+* And then we use the template to build the actual long date
+* format string.
+*
+*Entry:
+* cchMax = the max allowable size for the format string.
+*
+*Exit:
+* return value = int, length of the format string (Not including
+* the Null terminator!)
+*
+* A return value of 0 means the string is not available for some reason.
+*
+* szBuf = the long date format string
+*
+***********************************************************************/
+static int
+LongDateFmtFromIntl1(char *szBuf, int cchMax)
+{
+ int i, j, len;
+ Intl1Hndl intl1;
+ unsigned char lngDateFmt, suppressDay;
+ char *pbuf, *pch, *szTmpl, szTmplBuf[5];
+ int fSupDay, fSupWeek, fSupMonth, fSupYear;
+
+// the following structure maps long date format bits to
+// template string characters.
+static rgchTmpl[] = {
+ 'D' // longDay = 0 (day of month)
+ , 'd' // longWeek = 1 (day of week - day name)
+ , 'M' // longMonth = 2 (month of the year)
+ , 'y' // longYear = 3 (year)
+};
+
+ szTmpl = szTmplBuf;
+
+ intl1 = (Intl1Hndl)IUGetIntl(1);
+ lngDateFmt = (*intl1)->lngDateFmt;
+ suppressDay = (*intl1)->suppressDay;
+
+ // build the format string template
+ switch(lngDateFmt){
+ case 0: // day_name-day-month-year
+ szTmpl = "dDMy";
+ break;
+ case 255: // day_name-month-day-year
+ szTmpl = "dMDy";
+ break;
+ default:
+ // for all other values, the field is interpreted as 4
+ // bitfields of 2 bits easch, specifying in textual order
+ // the individual components of the long date.
+ for(i = 0; i < 4; ++i)
+ szTmpl[i] = rgchTmpl[(lngDateFmt >> (i*2)) & 0x3];
+ szTmpl[4] = '\0';
+ break;
+ }
+ ASSERT(STRLEN(szTmpl) == 4);
+
+ switch(suppressDay){
+ case 0: // dont suppress name of day
+ case 255: // suppress name of day
+ fSupDay = FALSE;
+ fSupWeek = (suppressDay == 255);
+ fSupMonth = FALSE;
+ fSupYear = FALSE;
+ break;
+ default:
+ // all other values are interpreted as a bitmask specifying
+ // suppression of the individual components of the long date format
+ fSupDay = (suppressDay & supDay);
+ fSupWeek = (suppressDay & supWeek);
+ fSupMonth = (suppressDay & supMonth);
+ fSupYear = (suppressDay & supYear);
+ break;
+ }
+
+ // now use this template to build the long date format string
+
+ pbuf = szBuf;
+ pbuf += StringNCopyQuote(pbuf, (*intl1)->st0, 4);
+
+ for(i = 0; i < 4; ++i){
+ switch(szTmpl[i]){
+ case 'D': // day of month - "d" or "dd"
+ if(fSupDay)
+ continue;
+ *pbuf++ = 'd';
+ if((*intl1)->dayLeading0 == 255)
+ *pbuf++ = 'd';
+ break;
+ case 'd': // day of week - day name "dddd"
+ if(fSupWeek)
+ continue;
+ goto LCom;
+ case 'M': // month of year - "MMMM"
+ if(fSupMonth)
+ continue;
+ goto LCom;
+ case 'y': // year - "yyyy"
+ if(fSupYear)
+ continue;
+ goto LCom;
+LCom:;
+ for(j = 0; j < 4; ++j)
+ *pbuf++ = szTmpl[i];
+ break;
+ default:
+ ASSERT(UNREACHED);
+ break;
+ }
+
+ // determine which separator string to append
+ switch(i){
+ case 0: pch = (*intl1)->st1; break;
+ case 1: pch = (*intl1)->st2; break;
+ case 2: pch = (*intl1)->st3; break;
+ case 3: pch = (*intl1)->st4; break;
+ default:
+ ASSERT(UNREACHED);
+ break;
+ }
+ pbuf += StringNCopyQuote(pbuf, pch, 4);
+ }
+
+ *pbuf = '\0';
+ len = (pbuf - szBuf);
+ ASSERT(len < cchMax);
+ return len;
+}
+
+/***
+*GetIntlInfo - get a piece of locale info from the intl0 resource.
+*Purpose:
+* Retrieves a piece of locale info from intl0/1 resources. If
+* the requested type of information is not in intl resource 0
+* is returned.
+*
+*Entry:
+* lctype - type of locale info
+* szDest - buffer to place in
+* cchMax - size of buffer, or 0 to get required size of buffer.
+*
+*Exit:
+* returns number of characters copied (including NUL), or 0
+* if not enough room or other error.
+*
+* returns -1 if lctype is not a valid type of info to read
+* from intl0.
+*
+* returns size needed if cchMax was 0
+*
+***********************************************************************/
+
+static int
+GetIntlInfo(LCTYPE lctype, char FAR* szDest, int cchMax)
+{
+ int len;
+ char *pch;
+ char *pbuf;
+ char *szFmt;
+ char rgchBuf[100]; // > max size for any entry
+ Intl0Hndl intl0;
+
+ pbuf = rgchBuf;
+ intl0 = (Intl0Hndl)IUGetIntl(0);
+
+ switch((unsigned short)lctype){
+ // short date format ordering
+ // '0' - month-day-year
+ // '1' - day-month-year
+ // '2' - year-month-day
+ //
+ case LOCALE_IDATE:
+ switch((*intl0)->dateOrder){
+ case mdy: *pbuf = '0'; break;
+ case dmy: *pbuf = '1'; break;
+ case ymd: *pbuf = '2'; break;
+ default: // myd, dym, ydm
+ return -1;
+ }
+ pbuf++;
+ break;
+
+ // time format spec ('0'=12 hr, '1'=24hr)
+ case LOCALE_ITIME:
+ *pbuf++ = (((*intl0)->timeCycle) == 0) ? '1' : '0';
+ break;
+
+ // use leading zeros in time fields?
+ case LOCALE_ITLZERO:
+ *pbuf++ = ((*intl0)->timeFmt & hrLeadingZ) ? '1' : '0';
+ break;
+
+ // positive currency mode
+ // '0' - prefix, no separation
+ // '1' - suffix, no separation
+ // '2' - prefix, 1 char separation
+ // '3' - suffix, 1 char separation
+ //
+ case LOCALE_ICURRENCY:
+ // mac does not support space between currency symbol and the number
+ *pbuf++ = ((*intl0)->currFmt & currSymLead) ? '0' : '1';
+ break;
+
+ // Negative currency mode (most of these dont occur on the mac)
+ //
+ // '0' - ($1.1)
+ // '1' - -$1.1
+ // '2' - $-1.1
+ // '3' - $1.1-
+ // '4' - (1.1$)
+ // '5' - -1.1$
+ // '6' - 1.1-$
+ // '7' - 1.1$-
+ // '8' - -1.1 $ (space before $)
+ // '9' - -$ 1.1 (space after $)
+ // '10'- 1.1 $- (space before $)
+ //
+ case LOCALE_INEGCURR:
+ if((*intl0)->currFmt & currSymLead){
+ *pbuf++ = ((*intl0)->currFmt & currNegSym) ? '1' : '0';
+ }else{
+ *pbuf++ = ((*intl0)->currFmt & currNegSym) ? '5' : '4';
+ }
+ break;
+
+ // Leading zeros in decimal fields?
+ //
+ // '0' - use no leading zeros
+ // '1' - use leading zeros
+ //
+ case LOCALE_ILZERO:
+ // Note: Inside Mac Volume 1 says: "you can also apply the
+ // currency format's leading and trailing zero indicators to
+ // the number format if desired"
+ *pbuf++ = ((*intl0)->currFmt & currLeadingZ) ? '1' : '0';
+ break;
+
+ // System of measurement
+ //
+ // '0' - metric system (S.I.)
+ // '1' - U.S system of measurement
+ //
+ case LOCALE_IMEASURE:
+ *pbuf++ = (((*intl0)->metricSys) == 255) ? '0' : '1';
+ break;
+
+ // string for the Am designator
+ case LOCALE_S1159:
+ pch = (*intl0)->mornStr;
+ goto LAmpmStr;
+
+ // string for the Pm designator
+ case LOCALE_S2359:
+ pch = (*intl0)->eveStr;
+ goto LAmpmStr;
+
+LAmpmStr:;
+ len = 4;
+ if(*pch == ' '){ // skip leading space
+ len = 3; ++pch;
+ }
+ pbuf += StringNCopy(pbuf, pch, len);
+ break;
+
+ // string used as the local monetary symbol
+ case LOCALE_SCURRENCY:
+ *pbuf++ = (*intl0)->currSym1;
+ *pbuf++ = (*intl0)->currSym2;
+ *pbuf++ = (*intl0)->currSym3;
+ break;
+
+ // The character used as separator between
+ // groups of digits left of the decimal.
+ case LOCALE_STHOUSAND:
+ *pbuf++ = (*intl0)->thousSep;
+ break;
+
+ // The character used as the decimal separator
+ case LOCALE_SDECIMAL:
+ *pbuf++ = (*intl0)->decimalPt;
+ break;
+
+ // The character used as the date separator
+ case LOCALE_SDATE:
+ *pbuf++ = (*intl0)->dateSep;
+ break;
+
+ // The character used as the time separator
+ case LOCALE_STIME:
+ *pbuf++ = (*intl0)->timeSep;
+ break;
+
+ // The character used to separate list items
+ case LOCALE_SLIST:
+ *pbuf++ = (*intl0)->listSep;
+ break;
+
+ // The short and long date format strings use the following
+ // date format characters,
+ //
+ // M month, 1-12
+ // MM month with leading zero, 01-12
+ // MMMM month name
+ // d day, 1-31
+ // dd day with leading zero, 01-31
+ // dddd day of week name
+ // yy year as 2 digit number, 00-99 (if current century)
+ // yyyy year as 4 digit number, 100-9999
+ //
+ case LOCALE_SSHORTDATE:
+ switch((*intl0)->dateOrder){
+ case mdy: szFmt = "mdy"; break;
+ case dmy: szFmt = "dmy"; break;
+ case ymd: szFmt = "ymd"; break;
+ default:
+ return -1;
+ }
+ while(1){
+ switch(*szFmt){
+ case 'm':
+ *pbuf++ = 'M';
+ if((*intl0)->shrtDateFmt & mntLdingZ)
+ *pbuf++ = 'M';
+ break;
+ case 'd':
+ *pbuf++ = 'd';
+ if((*intl0)->shrtDateFmt & dayLdingZ)
+ *pbuf++ = 'd';
+ break;
+ case 'y':
+ *pbuf++ = 'y'; *pbuf++ = 'y';
+ if((*intl0)->shrtDateFmt & century){
+ *pbuf++ = 'y'; *pbuf++ = 'y';
+ }
+ break;
+ default:
+ ASSERT(UNREACHED);
+ }
+ if(*++szFmt == '\0')
+ break;
+ *pbuf++ = (*intl0)->dateSep;
+ }
+ break;
+
+ case LOCALE_SLONGDATE:
+ len = LongDateFmtFromIntl1(pbuf, sizeof(rgchBuf));
+ goto LHaveLength;
+
+ // number of fractional digits for the local monetary format
+ case LOCALE_ICURRDIGITS:
+ // The mac does not have an equiv of this. It does have a
+ // flag indicating if the currency representation should
+ // have a trailing zero - but Im not sure how we would use this.
+ return -1;
+
+ // number of fractional digits
+ case LOCALE_IDIGITS:
+ return -1; // not available on the mac
+
+ // full localized name of the country
+ case LOCALE_SCOUNTRY:
+ return -1; // not available on the mac
+
+ // the country code
+ case LOCALE_ICOUNTRY:
+ return -1; // not available on the mac
+
+ // abbreviated language name
+ case LOCALE_SABBREVLANGNAME:
+ return -1; // not available on the mac
+
+ default:
+ return -1;
+ }
+
+ *pbuf = '\0';
+ len = STRLEN(rgchBuf);
+
+LHaveLength:;
+ if(len == 0) // not available
+ return 0;
+
+ ++len; // we count the null
+
+ // if cchMax is 0, then the caller is just asking for the length
+ if(cchMax != 0){
+ if(len > cchMax)
+ return 0; // error: buffer too small
+ MEMCPY(szDest, rgchBuf, len);
+ }
+
+ return len;
+}
+
+#else /* }{ */
+
+/***
+*GetWinIniInfo - get a piece of locale info from Win.INI.
+*Purpose:
+* Retrieves a piece of locale info from WIN.INI. If the request
+* type of information is not in WIN.INI, 0 is returned.
+*
+*Entry:
+* lctype - type of locale info
+* szDest - buffer to place in
+* cchMax - size of buffer, or 0 to get required size of buffer.
+*
+*Exit:
+* returns number of characters copied (including NUL), or 0
+* if not enough room or other error.
+*
+* returns -1 if lctype is not a valid type of info to read from
+* WIN.INI
+*
+* returns size needed if cchMax was 0
+*
+***********************************************************************/
+static int
+GetWinIniInfo(LCTYPE lctype, char FAR* szDest, int cchMax)
+{
+ int cchCopy;
+ char szBuffer[100]; // > max size for any entry
+ const char FAR* psz;
+static char szDummy[] = "\xff\xac\0"; // default value
+
+ switch ((unsigned short)lctype) {
+ case LOCALE_SABBREVLANGNAME:
+ cchCopy = GetProfileString(g_szIntl, "sLanguage", szDummy,
+ szBuffer, sizeof(szBuffer));
+ // For consistency with internal values, always uppercase.
+ if (cchCopy)
+ AnsiUpperBuff(szBuffer, cchCopy);
+ break;
+
+ case LOCALE_SDECIMAL:
+#if OE_WIN
+ // Get decimal character from cache, if any
+ //
+ if (cchMax) {
+ if (g_chDecimal == '\0' || cchMax < 2)
+ return 0; // no cached value or buffer too small
+
+ szDest[0] = g_chDecimal;
+ szDest[1] = '\0';
+ }
+ return 2;
+#else // OE_WIN
+ psz = "sDecimal"; goto LGet;
+#endif // else OE_WIN
+
+ case LOCALE_STHOUSAND:
+#if OE_WIN
+ // Get Thousands character from cache, if any
+ //
+ if (cchMax) {
+ if (cchMax < 2)
+ return 0; // buffer too small
+
+ szDest[0] = g_chThousand;
+ szDest[1] = '\0';
+ }
+ return 2;
+#else // OE_WIN
+ psz = "sThousand"; goto LGet;
+#endif // else OE_WIN
+
+ case LOCALE_ILZERO:
+#if OE_WIN
+ // Get leading zero flag character from cache, if any
+ //
+ if (cchMax) {
+ if (g_chILZERO == '\0' || cchMax < 2)
+ return 0; // no cached value or buffer too small
+
+ szDest[0] = g_chILZERO;
+ szDest[1] = '\0';
+ }
+ return 2;
+#else // OE_WIN
+ psz = "iLzero"; goto LGet;
+#endif // else OE_WIN
+
+ case LOCALE_SCURRENCY:
+#if OE_WIN
+ // Get decimal character from cache, if any
+ //
+ if (cchMax) {
+ if (g_szCurrency[0] == '\0' || cchMax < STRLEN(g_szCurrency))
+ return 0; // no cached value or buffer too small
+
+ STRCPY(szDest, g_szCurrency);
+ }
+ return STRLEN(g_szCurrency);
+#else // OE_WIN
+ psz = "sCurrency"; goto LGet;
+#endif // else OE_WIN
+
+
+ case LOCALE_SCOUNTRY: psz = "sCountry"; goto LGet;
+ case LOCALE_ICOUNTRY: psz = "iCountry"; goto LGet;
+ case LOCALE_IDATE: psz = "iDate"; goto LGet;
+ case LOCALE_ITIME: psz = "iTime"; goto LGet;
+ case LOCALE_ITLZERO: psz = "iTLZero"; goto LGet;
+ case LOCALE_ICURRENCY: psz = "iCurrency"; goto LGet;
+ case LOCALE_ICURRDIGITS: psz = "iCurrDigits"; goto LGet;
+ case LOCALE_INEGCURR: psz = "iNegCurr"; goto LGet;
+ case LOCALE_IDIGITS: psz = "iDigits"; goto LGet;
+ case LOCALE_IMEASURE: psz = "iMeasure"; goto LGet;
+ case LOCALE_S1159: psz = "s1159"; goto LGet;
+ case LOCALE_S2359: psz = "s2359"; goto LGet;
+ case LOCALE_SDATE: psz = "sDate"; goto LGet;
+ case LOCALE_STIME: psz = "sTime"; goto LGet;
+ case LOCALE_SLIST: psz = "sList"; goto LGet;
+ case LOCALE_SSHORTDATE: psz = "sShortDate"; goto LGet;
+ case LOCALE_SLONGDATE: psz = "sLongDate"; goto LGet;
+LGet:;
+ cchCopy = GetProfileString(
+ g_szIntl, psz, szDummy, szBuffer, sizeof(szBuffer));
+ break;
+
+ default:
+ return -1;
+ }
+
+ if (cchCopy == 2 && szBuffer[0] == szDummy[0] && szBuffer[1] == szDummy[1])
+ return 0; // Got default value; not available.
+
+ // Copy string and return correct value.
+ ++cchCopy; // For trailing NUL.
+ if (cchMax != 0) {
+ if (cchMax >= cchCopy) {
+ MEMCPY(szDest, szBuffer, cchCopy);
+ }
+ else {
+ return 0; // Error: buffer too small
+ }
+ }
+ return cchCopy;
+}
+
+#endif /* } */
+
+/***
+*SetupLcid - normalize and setup LCID
+*Purpose:
+* Normalizes an LCID, by mapping the special values LOCALE_USER_DEFAULT
+* or LOCALE_SYSTEM_DEFAULT to the current system LCID.
+* Also handles SUBLANG_NEUTRAL by mapping it to SUBLANG 1.
+*
+* After that, gets the pointers to the correct locale info into
+* the global cache.
+*
+*Entry:
+* lcid - locale id to setup.
+*
+*Exit:
+* Returns TRUE on success, FALSE on failure.
+***********************************************************************/
+
+static int FASTCALL
+SetupLcid(LCID lcid)
+{
+ NLSDATA *pnls, *pnlsEnd;
+
+ if (lcid == LOCALE_USER_DEFAULT
+ || lcid == LOCALE_SYSTEM_DEFAULT
+ || lcid == MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)))
+ {
+ lcid = SystemLcid();
+ if (lcid == (LCID)-1)
+ goto LError0; // Couldn't get lcid.
+ }
+ else if (SUBLANGID(LANGIDFROMLCID(lcid)) == SUBLANG_NEUTRAL)
+ {
+ lcid = MAKELCID(MAKELANGID(PRIMARYLANGID(LANGIDFROMLCID(lcid)), 1));
+ }
+
+#if 0 // Disable for Eastern European special generation
+ // default to USA Locale for stubs
+ for (i = 0; i < DIM(g_stubLCID); i++) {
+ if (lcid == g_stubLCID[i]) {
+ lcid = 0x0409;
+ break;
+ }
+ }
+#endif
+
+ if (lcid == g_lcidCurrent)
+ return TRUE; // already setup
+
+ pnlsEnd = &g_rgnls[DIM(g_rgnls)];
+ for(pnls = g_rgnls; pnls < pnlsEnd; ++pnls){
+ if(pnls->lcid == lcid){
+#ifdef FE_DBCS
+ // CONSIDER: this could be sped up by storing the FE bit in
+ // the NLS table. this would save us the following 4 long
+ // compares per cal to SetupLcid
+ if(lcid == LCID_JAPAN){
+ bFEflag = bitJapan;
+ }else if(lcid == LCID_KOREA){
+ bFEflag = bitKorea;
+ }else if(lcid == LCID_CHINA_T){
+ bFEflag = bitTaiwan;
+ }else if(lcid == LCID_CHINA_S){
+ bFEflag = bitPrc;
+ }else
+ bFEflag = 0;
+
+#endif
+ g_pnls = pnls;
+#if OE_MAC
+ // call into the proper NLS info file. This loads our tables
+ // for us. We rely on our client to have run a .R file that
+ // marks all these code segments as non-discardable.
+ pnls->LoadNlsInfo(&pnls->prglcinfo, &g_pstrinfo);
+#else //OE_MAC
+ g_pstrinfo = pnls->pstrinfo;
+#endif //OE_MAC
+ g_lcidCurrent = lcid;
+ return TRUE;
+ }
+ }
+
+LError0:;
+#ifdef FE_DBCS
+ bFEflag = 0;
+#endif
+ g_pnls = NULL;
+ g_pstrinfo = NULL;
+ g_lcidCurrent = (LCID) -1;
+ return FALSE;
+}
+
+
+/***
+*GetUserDefaultLCID, GetSystemDefaultLCID - get system LCID
+*Purpose:
+* Returns the system LCID.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns the system LCID.
+***********************************************************************/
+
+NLSAPI_(LCID) EXPORT
+GetUserDefaultLCID()
+{
+ return SystemLcid();
+}
+
+NLSAPI_(LCID) EXPORT
+GetSystemDefaultLCID()
+{
+ return SystemLcid();
+}
+
+
+/***
+*GetUserDefaultLangID, GetSystemDefaultLangID - get system LangID
+*Purpose:
+* Returns the system LangID.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns the system LangID.
+***********************************************************************/
+NLSAPI_(LANGID) EXPORT
+GetUserDefaultLangID()
+{
+ LCID lcid;
+
+ lcid = SystemLcid();
+ return LANGIDFROMLCID(lcid);
+}
+
+NLSAPI_(LANGID) EXPORT
+GetSystemDefaultLangID()
+{
+ LCID lcid;
+
+ lcid = SystemLcid();
+ return LANGIDFROMLCID(lcid);
+}
+
+/***
+*GetLocaleInfoA - get a piece of locale information.
+*Purpose:
+* Gets a piece of locale information about the specified locale. The
+* information is always returns as a null-terminated string, with the
+* implied codepage being the ANSI codepage for that locale.
+*
+*Entry:
+* lcid - locale to get information for
+* lctype - type of information to get
+* szDest - buffer to store string in
+* cchMax - size of buffer. If 0, szDest is ignored and the number of
+* characters needed is returned.
+*Exit:
+* On success, returns the number of characters copied.
+* On failure, returns 0. Possible failure reasons are:
+* Unknown LCID
+* Unknown LCTYPE
+* Bad szDest pointer
+* Buffer too small.
+* Out of memory
+*
+* There is no way to determine which of these conditions caused the failure.
+*
+***********************************************************************/
+
+NLSAPI_(int) EXPORT
+GetLocaleInfoA(LCID lcid, LCTYPE lctype, char FAR* szDest, int cchMax)
+{
+ int cchCopy;
+ ILCINFO ilcinfo;
+ LCINFO FAR* plcinfo;
+ int fNoUserOverride;
+
+ cchCopy = 0; // for errors.
+
+#ifdef _DEBUG
+ // Parameter Validation.
+ if (cchMax != 0 && IsBadWritePtr(szDest, cchMax))
+ {LogParamError(ERR_BAD_PTR, GetLocaleInfoA, 0); return 0;}
+#endif
+
+ fNoUserOverride = ((lctype & LOCALE_NOUSEROVERRIDE) != 0);
+
+ // Except for the two exceptions (SENGCOUNT and SENGLANGUAGE)
+ // the LCTYPE can be used as the index into the locale info
+ // array (once the NOUSEROVERRIDE bit has been stripped).
+
+ lctype &= ~LOCALE_NOUSEROVERRIDE;
+ if (lctype == LOCALE_SENGCOUNTRY)
+ ilcinfo = ILCINFO_SENGCOUNTRY;
+ else if (lctype == LOCALE_SENGLANGUAGE)
+ ilcinfo = ILCINFO_SENGLANGUAGE;
+#if VBA2
+ else if (lctype == LOCALE_IFIRSTDAYOFWEEK)
+ ilcinfo = ILCINFO_IFIRSTDAYOFWEEK;
+ else if (lctype == LOCALE_IFIRSTWEEKOFYEAR)
+ ilcinfo = ILCINFO_IFIRSTWEEKOFYEAR;
+ else if (lctype == LOCALE_IDEFAULTANSICODEPAGE)
+ ilcinfo = ILCINFO_IDEFAULTANSICODEPAGE;
+ else if (lctype == LOCALE_INEGNUMBER)
+ ilcinfo = ILCINFO_INEGNUMBER;
+ else if (lctype == LOCALE_STIMEFORMAT)
+ ilcinfo = ILCINFO_STIMEFORMAT;
+ else if (lctype == LOCALE_ITIMEMARKPOSN)
+ ilcinfo = ILCINFO_ITIMEMARKPOSN;
+ else if (lctype == LOCALE_ICALENDARTYPE)
+ ilcinfo = ILCINFO_ICALENDARTYPE;
+ else if (lctype == LOCALE_IOPTIONALCALENDAR)
+ ilcinfo = ILCINFO_IOPTIONALCALENDAR;
+ else if (lctype == LOCALE_SMONTHNAME13)
+ ilcinfo = ILCINFO_SMONTHNAME13;
+ else if (lctype == LOCALE_SABBREVMONTHNAME13)
+ ilcinfo = ILCINFO_SABBREVMONTHNAME13;
+#endif
+ else if (lctype >= 1 && lctype < LCTYPE_MAX)
+ ilcinfo = (ILCINFO)(lctype);
+ else
+ return 0; // Error - bad lctype.
+
+ // Check for request for information that is in WIN.INI;
+ // only valid for current locale.
+ if (!fNoUserOverride) {
+ LCID lcidSystem;
+
+ if (lcid == LOCALE_USER_DEFAULT
+ || lcid == LOCALE_SYSTEM_DEFAULT
+ || lcid == MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL))
+ || lcid == (lcidSystem = SystemLcid())
+ || (SUBLANGID(LANGIDFROMLCID(lcid)) == SUBLANG_NEUTRAL
+ && PRIMARYLANGID(LANGIDFROMLCID(lcid)) ==
+ PRIMARYLANGID(LANGIDFROMLCID(lcidSystem))))
+ {
+#ifdef _MAC
+ if ((cchCopy = GetIntlInfo(lctype, szDest, cchMax)) >= 0)
+ return cchCopy;
+#else
+ if ((cchCopy = GetWinIniInfo(lctype, szDest, cchMax)) >= 0)
+ return cchCopy;
+#endif
+ }
+ }
+
+ if (lcid != g_lcidCurrent) {
+ if (!SetupLcid(lcid))
+ goto Error;
+ }
+
+ plcinfo = &g_pnls->prglcinfo[ilcinfo];
+
+ // Copy requested information, up to limit specified.
+ cchCopy = (int)plcinfo->cch + 1;
+ if (cchMax != 0) {
+ if (cchMax >= cchCopy) {
+ MEMCPY(szDest, plcinfo->prgb, cchCopy-1);
+ szDest[cchCopy-1] = '\0';
+ }
+ else {
+ return 0; // Error: buffer too small
+ }
+ }
+
+ /* DROP THRU */
+Error:
+ return cchCopy;
+}
+
+
+#ifdef FE_DBCS /* { */
+
+/***
+* GetSortWeightJ - get the sort weight for Japan.
+* ( handles diacritical merging )
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+* returns TRUE :
+* FALSE :
+*Note:
+* Priwt : Word
+* Secwt : Byte, contains 2nd, 3rd .. 6th order sorting values
+* SecFlg: Byte, contains flags to say which orders to use
+*
+***********************************************************************/
+int
+GetSortWeightJ(
+ const unsigned char FAR* FAR*plpstr1,
+ int cch1,
+ COMPSTRINGINFO FAR *pcompstrinfo)
+{
+ STRINFO_J FAR* pstrinfo;
+ unsigned Priwt, NextCh;
+ unsigned char Secwt, SecFlg;
+ const unsigned char FAR* lpstr1 = *plpstr1;
+ unsigned char FAR* pbMasks;
+
+ pstrinfo = (STRINFO_J FAR*)g_pstrinfo;
+
+ /* first pick up the next whole character */
+ Priwt = *lpstr1++;
+ cch1--;
+
+ if (cch1 && isDbcsJ(Priwt, 0)) {
+ Priwt = (Priwt << 8) + *lpstr1++;
+ cch1--;
+ }
+
+ /* if this a Kanji outside our tables force the correct values */
+ if (Priwt >= 0x87A0) {
+ Priwt |= 0x4000; /* 0x8nnn -> 0xCnnn, 9->D, E->E, F->F */
+ Secwt = 0x00;
+ SecFlg = 0x04; /* for repeat character order */
+ goto AllDone;
+ }
+
+ /* Char can be sorted by table, so mask into range & get table values */
+ Priwt &= 0x0FFF; /* 0x00nn -> 0x00nn, 81->01, 82->02, 83->03 */
+
+ Secwt = pstrinfo->pbSecWgt[Priwt];
+ SecFlg = pstrinfo->pbSecFlg[Priwt];
+ Priwt = (pstrinfo->pbPriHi[Priwt] << 8) + pstrinfo->pbPriLo[Priwt];
+
+ /* Most characters now complete, but a few need extra processing */
+ /* eg. Kana that can have Daku-ten or Handaku-ten, Cho-on or repeat chars */
+ if ( (Priwt&0x00FF) != 0x00FF )
+ goto AllDone;
+
+ Priwt &= 0xFF00; /* mask off the special flag */
+
+ /* If we have a Kana, test for following Daku-ten or Handaku-ten */
+ if (Priwt >= 0x8700) {
+ if (cch1) {
+ NextCh = *lpstr1;
+ if (cch1>=2 && isDbcsJ(NextCh, 0))
+ NextCh = (NextCh << 8) + *(lpstr1+1);
+ if (NextCh==0x00DE || NextCh==0x814A) {
+ lpstr1 += (NextCh==0x00DE) ? 1 : 2;
+ cch1 -= (NextCh==0x00DE) ? 1 : 2;
+ Secwt |= 0x01;
+ } else if (NextCh==0x00DF || NextCh==0x814B) {
+ lpstr1 += (NextCh==0x00DF) ? 1 : 2;
+ cch1 -= (NextCh==0x00DF) ? 1 : 2;
+ Secwt |= 0x02;
+ }
+ }
+ goto AllDone;
+ }
+
+ /* If not kana, must be Cho-on or a repeat character - try Kanji repeat */
+ if (Priwt==0x3A00) {
+ if ( pcompstrinfo->priwt >= 0xC7A0 ) /* if prev was Kanji, use it */
+ Priwt = pcompstrinfo->priwt;
+ Secwt = pcompstrinfo->secwt | 0x08; /* with a repeat marker */
+ SecFlg = pcompstrinfo->secflg;
+ goto AllDone;
+ }
+
+ /* Cho-on and Kana repeat chars only used if they actually follow a kana */
+ if (pcompstrinfo->priwt<0x8700 || pcompstrinfo->priwt>0xB9FF)
+ goto AllDone;
+
+ /* Cho-on characters duplicate the vowel sound of the prev. charater */
+ /* except when they follow a N, in which case they act like repeat */
+ if ((Priwt==0x4400 || Priwt==0x3500) && pcompstrinfo->priwt<0xB900) {
+ Priwt = ((pcompstrinfo->priwt % 5) << 8) + 0x8700;
+ Secwt |= (pcompstrinfo->secwt&0x20);
+ SecFlg = 0x37;
+ goto AllDone;
+ }
+
+ /* Kana repeat is the only special character left */
+ /* second order values should be merged with those of previous character */
+ Priwt = pcompstrinfo->priwt;
+ Secwt = (pcompstrinfo->secwt&0xE4) | (Secwt&0x1B); /* merge minus some bits */
+ SecFlg = pcompstrinfo->secflg;
+
+AllDone: /* we have the full 50-on sorting values now */
+
+ /* mask off any bits that we want to ignore during this compare */
+ if (g_dwFlags & ~NORM_IGNORESYMBOLS) {
+ //Special kludges to make some pairs of full-pitch chars that
+ //sort as different chars both convert to the same half-pitch char
+ if (g_dwFlags & NORM_IGNOREWIDTH) {
+ if (SecFlg==0x22 && (Secwt&0x40))
+ Secwt = 0x04;
+ if (Priwt==0x3500)
+ Priwt = 0x4400;
+ }
+ for (pbMasks=pstrinfo->pbIgnore; *pbMasks; pbMasks+=4) {
+ unsigned nIgnore = (pbMasks[2] << 8) + pbMasks[3];
+ if( (g_dwFlags&nIgnore) && (SecFlg&pbMasks[1]) ){
+ Secwt &= ~pbMasks[0];
+ SecFlg &= ~pbMasks[1];
+ }
+ }
+ }
+
+ pcompstrinfo->priwt = Priwt;
+ pcompstrinfo->secwt = Secwt;
+ pcompstrinfo->secflg = SecFlg;
+ *plpstr1 = lpstr1;
+ return(cch1);
+}
+
+int
+CompareStringJ(
+ unsigned long dwFlags,
+ const unsigned char FAR* lpstr1, int cch1,
+ const unsigned char FAR* lpstr2, int cch2)
+{
+ STRINFO_J FAR* pstrinfo;
+ unsigned char FAR* pbMasks;
+ unsigned char b1stDiff, b1stDiffValue;
+ unsigned char bFlgMask, bWgtMask, bTemp;
+ COMPSTRINGINFO compstrinfo1, compstrinfo2;
+
+ ASSERT(fJapan);
+
+ pstrinfo = (STRINFO_J FAR*)g_pstrinfo;
+
+ b1stDiff=0;
+ b1stDiffValue=0;
+
+ /* initialise to indicate no previous character */
+ g_dwFlags = dwFlags;
+ compstrinfo1.priwt = compstrinfo1.secwt = 0;
+ compstrinfo2.priwt = compstrinfo2.secwt = 0;
+
+ /* must continue even if one string empty, to ignore trailing punc */
+ while (cch1 || cch2) {
+ /* get the sorting codes & if not equal, return the difference */
+ /* if we must ignore punc, then loop over them */
+ if (!cch1)
+ compstrinfo1.priwt = compstrinfo1.secwt = 0;
+ else{
+ do {
+ cch1 = GetSortWeightJ(&lpstr1, cch1, &compstrinfo1);
+ if ( (g_dwFlags&NORM_IGNORESYMBOLS) &&
+ compstrinfo1.priwt>=0x1400 &&
+ compstrinfo1.priwt<=0x54FF )
+ compstrinfo1.priwt = compstrinfo1.secwt = 0;
+ } while ( cch1 && compstrinfo1.priwt==0 );
+ }
+
+ if (!cch2)
+ compstrinfo2.priwt = compstrinfo2.secwt = 0;
+ else{
+ do {
+ cch2 = GetSortWeightJ(&lpstr2, cch2, &compstrinfo2);
+ if ( (g_dwFlags&NORM_IGNORESYMBOLS) &&
+ compstrinfo2.priwt>=0x1400 &&
+ compstrinfo2.priwt<=0x54FF )
+ compstrinfo2.priwt = compstrinfo2.secwt = 0;
+ } while ( cch2 && compstrinfo2.priwt==0 );
+ }
+
+ /* This exit path also used when just one string is empty */
+ if (compstrinfo1.priwt!=compstrinfo2.priwt)
+ return (compstrinfo1.priwt>compstrinfo2.priwt) ? 3 : 1;
+
+ /* first order values same, so check 2nd, 3rd .. 6th for differences */
+ /* stop scanning when we reach an order where we have a previous diff */
+ if (compstrinfo1.secwt!=compstrinfo2.secwt) {
+ for( pbMasks=pstrinfo->pbMasks;
+ (bFlgMask=pbMasks[1]) && bFlgMask!=b1stDiff; pbMasks+=4 ) {
+ if (bFlgMask & compstrinfo1.secflg) {
+ bWgtMask = pbMasks[0];
+ bTemp = (compstrinfo1.secwt & bWgtMask) - (compstrinfo2.secwt & bWgtMask);
+
+ /* if we find a difference it must be the most important so far */
+ /* so save it and remember which order it belongs to - then stop */
+ if (bTemp) {
+ b1stDiffValue = bTemp;
+ b1stDiff = bFlgMask;
+ break; /* move onto the next character pair */
+ }
+ }
+ }
+ }
+ }
+
+ /* no 1st order diffs, so ret by 2nd..6th order diff */
+ if (b1stDiff)
+ return (b1stDiffValue&0x80) ? 1 : 3;
+
+ return 2;
+}
+
+/***
+*BOOL GetSortWeightKTP - get the sort weight for most FE countries.
+* ( in the old style ) Japan is a seperate routine
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+* returns TRUE : If we used up both ch, chNext ( DB char/Digraphs )
+* The caller should fill chNext with the next char.
+* FALSE : If we didn't use chNext.
+*Note:
+* Priwt : Word for Korea, Taiwan and Prc(Mainland China).
+* Secwt : Byte for all FE countries, but different meaning.
+***********************************************************************/
+BOOL
+GetSortWeightKTP(unsigned ch, unsigned chNext, COMPSTRINGINFO FAR *pcompstrinfo)
+{
+ unsigned Priwt;
+ unsigned char Secwt;
+ BOOL fNeedNextByte = FALSE;
+ SORTWEIGHT FAR* prgsortweight;
+ unsigned cSortweight, uMin, uMax, uMid, wOffset;
+
+ ASSERT(fKoreaTaiwanPrc);
+
+ cSortweight = ((STRINFO_KTP FAR*)g_pstrinfo)->cSortweight;
+ prgsortweight = ((STRINFO_KTP FAR*)g_pstrinfo)->prgsortweight;
+
+ if( (fKorea && isDbcsK(ch, chNext))
+ || (fTaiwan && isDbcsT(ch, chNext))
+ || (fPrc && isDbcsP(ch, chNext))) {
+ ch = (ch << 8) + chNext;
+ fNeedNextByte = TRUE;
+ }
+ uMin = 0;
+ // out of array bound - seems tricky, but we'll never look at [uMax] !!
+ uMax = cSortweight;
+
+ while( uMin + 1 < uMax ) { // binary search
+ uMid = (uMin + uMax)/2;
+
+ if(prgsortweight[uMid].wStart > ch)
+ uMax = uMid;
+ else // if (prgsortweight[uMid].wStart <= ch)
+ uMin = uMid;
+ }
+ // we'll use uMin, not uMid !!
+ wOffset = ch - prgsortweight[uMin].wStart;
+ Priwt = prgsortweight[uMin].wPriwt; // WORD ( unsigned int )
+ Secwt = prgsortweight[uMin].bSecwt; // unsigned char
+
+ switch(prgsortweight[uMin].bMode){
+ case MODE_1TO1:
+ // Normal mapping : add wOffset to Primary weight
+ Priwt += wOffset;
+ break;
+
+ case MODE_MTO1:
+ // Many-to-1 mapping : Use the same Priwt, add wOffset to Secwt
+ Secwt += wOffset;
+ break;
+
+ case MODE_CONV:
+ // Secwt has the case & pitch info
+ Priwt += wOffset;
+
+ if(g_dwFlags & NORM_IGNORECASE)
+ Secwt &= ~(unsigned)KOR_CASEBIT;
+
+ if(g_dwFlags & NORM_IGNOREWIDTH)
+ Secwt &= ~(unsigned)KOR_PITCHBIT;
+ break;
+ }
+ pcompstrinfo->priwt = Priwt;
+ pcompstrinfo->secwt = Secwt;
+ return(fNeedNextByte);
+}
+
+int
+CompareStringKTP(
+ unsigned long dwFlags,
+ const unsigned char FAR* lpstr1, int cch1,
+ const unsigned char FAR* lpstr2, int cch2)
+{
+ COMPSTRINGINFO compstrinfo1, compstrinfo2;
+ const char FAR *lpstrEnd1, FAR *lpstrEnd2;
+ unsigned char fEnd1, fEnd2, ch1, ch2, chNext1, chNext2, secresult;
+
+ ASSERT(fKoreaTaiwanPrc);
+
+ // parameter validation : NYI.
+
+ g_dwFlags = dwFlags;
+
+ fEnd1 = FALSE;
+ fEnd2 = FALSE;
+ secresult = 2;
+
+ lpstrEnd1 = lpstr1 + cch1;
+ lpstrEnd2 = lpstr2 + cch2;
+
+ if (cch1 > 0)
+ chNext1 = *lpstr1++;
+ else
+ fEnd1 = TRUE;
+
+ if (cch2 > 0)
+ chNext2 = *lpstr2++;
+ else
+ fEnd2 = TRUE;
+
+ for (;;) {
+ ch2 = chNext2;
+ ch1 = chNext1;
+ if (fEnd1){
+ if (fEnd2)
+ return secresult; // hit both ends of string at once
+ else
+ return 1; // hit end of 1 first.
+ }
+ if (fEnd2)
+ return 3; // hit end of 2 first.
+
+ if (lpstr2 < lpstrEnd2)
+ chNext2 = *lpstr2++;
+ else
+ fEnd2 = TRUE, chNext2 = 0;
+
+ if (lpstr1 < lpstrEnd1)
+ chNext1 = *lpstr1++;
+ else
+ fEnd1 = TRUE, chNext1 = 0;
+
+ if(GetSortWeightKTP(ch1, chNext1, &compstrinfo1)){
+ if (lpstr1 < lpstrEnd1)
+ chNext1 = *lpstr1++;
+ else
+ fEnd1 = TRUE; // don't need to update chNext (we'll break)
+ }
+
+ if(GetSortWeightKTP(ch2, chNext2, &compstrinfo2)){
+ if (lpstr2 < lpstrEnd2)
+ chNext2 = *lpstr2++;
+ else
+ fEnd2 = TRUE;
+ }
+
+ if (compstrinfo1.priwt != compstrinfo2.priwt) {
+ if (compstrinfo1.priwt > compstrinfo2.priwt)
+ return 3;
+ else
+ return 1;
+ }
+
+ // The results from the secondary weight check are stored in
+ // secresult, if not 2 then we've already found a secondary weight
+ // winner.
+ if (secresult == 2) {
+ if (compstrinfo1.secwt > compstrinfo2.secwt)
+ secresult = 3;
+ else if (compstrinfo1.secwt < compstrinfo2.secwt)
+ secresult = 1;
+ }
+ }
+
+ ASSERT(UNREACHED);
+}
+
+#endif /* } */
+
+/***
+*CompareStringA - compare two strings
+*Purpose:
+* Compares two strings for sorting order.
+*
+*Entry:
+* lcid - locale governing the mapping
+* dwFlags - zero or more of
+* NORM_IGNORECASE
+* NORM_IGNORENONSPACE
+* NORM_IGNORESYMBOLS
+* lpStr1 - pointer to string to compare
+* cch1 - length of string, or -1 for NULL terminated
+* lpStr2 - pointer to string to compare
+* cch2 - length of string, or -1 for NULL terminated
+*
+*Exit:
+* On Sucess: 1 = str1 < str2
+* 2 = str1 == str2
+* 3 = str1 > str2
+* On error, returns 0.
+*
+***********************************************************************/
+
+NLSAPI_(int) EXPORT
+CompareStringA(
+ LCID lcid,
+ unsigned long dwFlags,
+ const char FAR* pch1, int cch1,
+ const char FAR* pch2, int cch2)
+{
+#ifdef _DEBUG
+ // Parameter validation.
+ if (cch1 < -1 || cch2 < -1)
+ {LogParamError(ERR_BAD_VALUE, CompareStringA, 0); return 0;}
+ if (cch1 != -1 && IsBadReadPtr(pch1, cch1))
+ {LogParamError(ERR_BAD_PTR, CompareStringA, 0); return 0;}
+ if (cch1 == -1 && IsBadStringPtr(pch1, 0x7FFF))
+ {LogParamError(ERR_BAD_STRING_PTR, CompareStringA, 0); return 0;}
+ if (cch2 != -1 && IsBadReadPtr(pch2, cch2))
+ {LogParamError(ERR_BAD_PTR, CompareStringA, 0); return 0;}
+ if (cch2 == -1 && IsBadStringPtr(pch2, 0x7FFF))
+ {LogParamError(ERR_BAD_STRING_PTR, CompareStringA, 0); return 0;}
+ if ((dwFlags != 0) &&
+ (dwFlags & ~(NORM_IGNORECASE | NORM_IGNORENONSPACE |
+ NORM_IGNORESYMBOLS | NORM_IGNOREKANATYPE |
+ NORM_IGNOREWIDTH)))
+ {LogParamError(ERR_BAD_FLAGS, CompareStringA, 0); return 0;}
+#endif
+ // Set up for comparing routines.
+ if (lcid != g_lcidCurrent) {
+ if (!SetupLcid(lcid))
+ return 0; // error.
+ }
+
+#ifdef FE_DBCS
+ if(fDBCS){
+ if(cch1 == -1)
+ cch1 = STRLEN(pch1);
+ if(cch2 == -1)
+ cch2 = STRLEN(pch2);
+ return ((fJapan) ? CompareStringJ : CompareStringKTP)
+ (dwFlags, pch1, cch1, pch2, cch2);
+ }
+#endif
+
+ // use optimized routine, for non-FE locales when
+ // - both strings are zero terminated
+ // - we are *not* ignoring symbols
+ // - it is not a reverse-diacritic weight locale
+ // - the locale has no digraphs
+ //
+ if (cch1 == -1
+ && cch2 == -1
+ && (dwFlags & NORM_IGNORESYMBOLS) == 0
+ && g_pstrinfo->fRevDW == 0
+ && g_pstrinfo->prgdig == NULL)
+ {
+ return ZeroTermNoIgnoreSym(dwFlags, pch1, pch2);
+ }
+
+ if(cch1 == -1)
+ cch1 = STRLEN(pch1);
+ if(cch2 == -1)
+ cch2 = STRLEN(pch2);
+
+ // Default compare - less optimized, handles all cases (non FE locales).
+ return DefCompareStringA(dwFlags, pch1, cch1, pch2, cch2);
+}
+
+/***
+*CreateSortKey - map a string to its sort key
+*Purpose:
+* This is used from LCMapStringA for the LCMAP_SORTKEY option.
+* It creates a sort key.
+*
+* All parameters have been validated.
+*
+* The format of the sortkey for all single byte locales is,
+*
+* <AW>1<DW>1<CW>0
+*
+* where AW is the Arithmetic weight, DW is the diacritic weight
+* and CW is the case weight.
+*
+*Entry:
+* pchSrc - source string
+* cchSrc - length (-1 = null term)
+* pchDst - destination
+* cchDst - length, or zero to get needed length.
+* dwFlags - flags.
+*
+*Exit:
+* returns number of characters needed/written.
+*
+*Notes:
+* This routine makes up to 4 passes over the source string,
+*
+* pass 1 = calculate the size of the sort key
+* pass 2 = put down the AW field
+* pass 3 = put down the DW field
+* pass 4 = put down the CW field
+*
+***********************************************************************/
+static int
+CreateSortKey(
+ const char FAR* pchSrc,
+ int cchSrc,
+ char FAR* pchDst,
+ int cchDst,
+ unsigned long dwFlags)
+{
+ BYTE aw;
+ WORD FAR* prgw;
+ EXPANSION FAR* pexp;
+ int iPass, cb, cbTotal;
+ WORD w, wEx, wSymbolBit;
+ DIGRAPH FAR* pdig, FAR* pdigEnd;
+ const char FAR* pch, FAR* pchEnd;
+
+// the skip flags for each pass
+static DWORD rgdwSkip[] = {
+ 0, // calculate key size
+ 0, // AW
+ NORM_IGNORENONSPACE, // DW
+ NORM_IGNORECASE // CW
+};
+
+ // cchSrc must be set by caller
+ ASSERT(cchSrc != -1);
+
+ prgw = g_pstrinfo->prgwSort;
+
+ pchEnd = &pchSrc[cchSrc];
+
+ cb = 0;
+ wEx = 0;
+ wSymbolBit = (dwFlags & NORM_IGNORESYMBOLS) ? SYMBOLBIT : 0;
+
+ for(iPass = 0; iPass < 4; ++iPass){
+
+ if((rgdwSkip[iPass] & dwFlags) == 0){
+
+ for(pch = pchSrc; pch < pchEnd;){
+
+ // get the next weight
+ if(wEx){
+ // grab the second weight of the expansion, if there is one
+ w = wEx;
+ wEx = 0;
+ }else{
+ w = prgw[(BYTE)*pch++];
+ if(w & wSymbolBit)
+ continue; // ignore
+ }
+#if 1
+ if (w & SPECIALBIT)
+ continue; // these get no weight
+#endif //1
+
+ // handle special cases
+ aw = (BYTE)(w & AWMASK);
+ switch(aw){
+#if 0
+ case AW_SW1:
+ case AW_SW2:
+ case AW_SW3:
+#endif //0
+ case AW_UNSORTABLE:
+ continue; // these get no weight
+ case AW_EXPANSION:
+ pexp = &g_pstrinfo->prgexp[(w>>8)&0xff];
+ w = pexp->w1;
+ wEx = pexp->w2;
+ break;
+ case AW_DIGRAPH:
+ pdig = &g_pstrinfo->prgdig[(w>>8)&0xff];
+ pdigEnd = pdig + D_ENTRY(pdig);
+ w = pdig->w; // weight if not a digraph
+ if(pch < pchEnd){
+ for(++pdig; pdig <= pdigEnd; ++pdig){
+ if(D_CH(pdig) == *pch){
+ ++pch; // consume second char of digraph
+ w = pdig->w;
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+ // take action according to pass
+ switch(iPass){
+ case 0:
+ ++cb;
+ break;
+ case 1:
+ *pchDst++ = aw;
+ break;
+ case 2:
+ *pchDst++ = (BYTE)((w & DWMASK) >> DWSHIFT);
+ break;
+ case 3:
+ *pchDst++ = (BYTE)((w & CWMASK) >> CWSHIFT);
+ break;
+ default:
+ ASSERT(UNREACHED);
+ break;
+ }
+ }
+ }
+
+ switch(iPass){
+ case 0: // End of pass#1: compute the total bytes required for the key
+ cbTotal = cb;
+ cbTotal += 1; // +1 for the AW separator
+ if((dwFlags & NORM_IGNORENONSPACE) == 0)
+ cbTotal += cb;
+ cbTotal += 1; // +1 for the DW separator
+ if((dwFlags & NORM_IGNORECASE) == 0)
+ cbTotal += cb;
+ cbTotal += 1; // +1 for the terminating NULL
+ if(cchDst == -1)
+ return cbTotal;
+ if(cbTotal > cchDst)
+ return 0;
+ break;
+ case 1:
+ case 2:
+ *pchDst++ = 1;
+ break;
+ case 3:
+ *pchDst++ = 0;
+ break;
+ }
+ }
+
+ return cbTotal;
+}
+
+#ifdef FE_DBCS /* { */
+
+// OK, here is the strategy. Japanese uses 6 levels of sort orders, where
+// the first sort order can be one or two bytes and the rest of the sort
+// orders are one or two bits.
+// To place the orders efficiently we traverse the string twice, once to
+// find out how many of each order we have, and then again to place the
+// bytes and bits in the correct string positions.
+//
+int
+CreateSortKeyJ(
+ const char FAR* lpSrcStr, int cchSrc,
+ char FAR* lpDestStr, int cchDest,
+ unsigned long dwFlags)
+{
+ STRINFO_J FAR* pstrinfo;
+ COMPSTRINGINFO compstrinfo;
+ unsigned char FAR* pbMasks;
+ int nOrder1, nOrder2[5], nShift[6], i;
+ char FAR* lpEndStr=lpDestStr+cchDest, FAR* lpOrder1, FAR* lpOrder2[6];
+ const char FAR* lpSrcTmp = lpSrcStr;
+ int cchTmp = cchSrc;
+
+ g_dwFlags = dwFlags;
+
+ pstrinfo = (STRINFO_J FAR*)g_pstrinfo;
+
+ // Initialize ready for the first scan
+ nOrder1 = nOrder2[0] = nOrder2[1] = nOrder2[2] =
+ nOrder2[3] = nOrder2[4] = 0;
+ // then loop around counting all of the sorting orders
+ compstrinfo.priwt = compstrinfo.secwt = 0;
+ while (cchTmp) {
+ do { // don't forget to skip punctuation if we want to
+ cchTmp = GetSortWeightJ(&lpSrcTmp, cchTmp, &compstrinfo);
+ if ( (g_dwFlags&NORM_IGNORESYMBOLS) &&
+ compstrinfo.priwt>=0x1400 && compstrinfo.priwt<=0x54FF )
+ compstrinfo.priwt = 0;
+ } while ( cchTmp && compstrinfo.priwt==0 );
+
+ if(compstrinfo.priwt) {
+ nOrder1 += (compstrinfo.priwt & 0xFF) ? 2 : 1;
+ for(i=0,pbMasks=pstrinfo->pbMasks; i<5; pbMasks+=4,i++){
+ if (pbMasks[1] & compstrinfo.secflg)
+ nOrder2[i] += pbMasks[3];
+ }
+ }
+ }
+
+ // Initialize ready for the second scan
+ // This includes working out the byte and bit offset positions for each
+ // of the sorting orders to be put into the output
+ //
+ lpOrder2[0] = lpDestStr + nOrder1 + 1;
+ nShift[0] = 7;
+ for( i=0,pbMasks=pstrinfo->pbMasks; i<5; pbMasks+=4,i++ ) {
+ // must adjust two bit orders so that both bits fit
+ if (pbMasks[3]==2) {
+ nShift[i]--;
+ if (nShift[i]&0x01) // avoid spanning byte boundries - for speed
+ nShift[i]--;
+ if (nShift[i]<0) {
+ lpOrder2[i]++;
+ nShift[i] += 8;
+ }
+ }
+ // the next order start is fixed by the number of bits in this order
+ // do this even for last order, so that we can find real end
+ nShift[i+1] = nShift[i] - nOrder2[i];
+ lpOrder2[i+1] = lpOrder2[i];
+ while (nShift[i+1]<0) {
+ lpOrder2[i+1]++;
+ nShift[i+1] += 8;
+ }
+ // final adjustment for end of buffer, to include final bits
+ if (i==4 && (nShift[5]+pbMasks[3])<8)
+ lpOrder2[5]++;
+ }
+ // Adjust the end point if the output buffer won't be filled
+ if (lpEndStr>lpOrder2[5])
+ lpEndStr = lpOrder2[5];
+
+ // blank out all of the secondary bits, before OR'ing in the parts
+ for (lpOrder1=lpOrder2[0]; lpOrder1<lpEndStr; lpOrder1++)
+ *lpOrder1 = 0;
+
+ // then loop around placing all of the sorting orders into the output
+ lpOrder1 = lpDestStr;
+ compstrinfo.priwt = compstrinfo.secwt = 0;
+ while (cchSrc && lpOrder1<lpEndStr) {
+ do { // don't forget to skip punctuation if we want to
+ cchSrc = GetSortWeightJ(&lpSrcStr, cchSrc, &compstrinfo);
+ if ( (g_dwFlags&NORM_IGNORESYMBOLS) &&
+ compstrinfo.priwt>=0x1400 && compstrinfo.priwt<=0x54FF )
+ compstrinfo.priwt = 0;
+ } while ( cchSrc && compstrinfo.priwt==0 );
+
+ if (compstrinfo.priwt) {
+ *lpOrder1++ = (compstrinfo.priwt>>8);
+ if (lpOrder1<lpEndStr && (compstrinfo.priwt&0xFF))
+ *lpOrder1++ = (compstrinfo.priwt&0xFF);
+
+ for( i=0,pbMasks=pstrinfo->pbMasks; pbMasks[1]; pbMasks+=4,i++ ) {
+ if (lpOrder2[i]>=lpEndStr)
+ break;
+ if (pbMasks[1] & compstrinfo.secflg) {
+ *lpOrder2[i] |= (char)(((pbMasks[0] & compstrinfo.secwt)
+ >> pbMasks[2]) << nShift[i]);
+ nShift[i] -= pbMasks[3];
+ if (nShift[i]<0) {
+ lpOrder2[i]++;
+ nShift[i] += 8;
+ }
+ }
+ }
+ }
+ }
+
+ // Finish the first order bytes with a seperator
+ if (lpOrder1<lpEndStr)
+ *lpOrder1 = 0x01;
+
+ return (int)(lpEndStr-lpDestStr);
+}
+
+int
+CreateSortKeyKTP(
+ const char FAR* lpSrcStr, int cchSrc,
+ char FAR* lpDestStr, int cchDest,
+ unsigned long dwFlags)
+{
+ // don't change ch,chNext to 16bit or you'll screw up FE features
+ unsigned char ch, chNext;
+#if 0
+ unsigned short wt;
+#endif
+ COMPSTRINGINFO compstrinfo;
+ unsigned char FAR* pbDest;
+ int fEnd, cNumWts, cOverall;
+ const unsigned char FAR* lpstr;
+ const unsigned char FAR* lpstrEnd;
+ unsigned char FAR *pbSecwt, FAR *lpDestBndry;
+
+
+ ASSERT(fKoreaTaiwanPrc);
+
+ // Let's turn off NORM_IGNORESYMBOLS for FE countries.
+ // CONSIDER: This is not needed for Japan, can switch on again for
+ // Korea/Taiwan if you want.
+ //
+ dwFlags &= ~(unsigned long)NORM_IGNORESYMBOLS;
+ g_dwFlags = dwFlags;
+
+ lpstr = lpSrcStr;
+ lpstrEnd = lpSrcStr + cchSrc;
+ cNumWts = 0;
+ fEnd = FALSE;
+
+ for (;;) { // Get next char, handle end of string and symbol skipping.
+ if(lpstr >= lpstrEnd){
+ fEnd = TRUE;
+ chNext = 0;
+ break;
+ }
+ chNext = *lpstr++;
+ break;
+ }
+
+ while(!fEnd){
+
+ ch = chNext;
+
+ // Get next char, handle end of string and symbol skipping.
+ for(;;){
+ if(lpstr >= lpstrEnd){
+ fEnd = TRUE;
+ chNext = 0;
+ break;
+ }
+ chNext = *lpstr++;
+ break;
+ }
+
+ if ((fKorea && isDbcsK(ch, chNext))
+ || (fTaiwan && isDbcsT(ch, chNext))
+ || (fPrc && isDbcsP(ch, chNext)))
+ {
+ if (lpstr >= lpstrEnd)
+ fEnd = TRUE;
+ else
+ chNext = *lpstr++;
+ }
+ cNumWts++;
+ }
+
+ // we use word-priwt & byte-secwt.
+ // so we need cNumWts*2 + 1 + cNumWts + 1.
+
+ pbSecwt = lpDestStr + (cNumWts << 1);
+ cOverall = (cNumWts << 1) + cNumWts + 2;
+
+ if(!cchDest)
+ return cOverall;
+
+ // ***********************************************************
+ //
+ // Now we'll WRITE weights into the dest string.
+ // Don't worry, we know the length !
+ //
+ // ***********************************************************
+
+ lpstr = (unsigned char FAR*) lpSrcStr;
+ lpstrEnd = lpstr + cchSrc;
+ fEnd = FALSE;
+
+ pbDest = (unsigned char FAR*) lpDestStr;
+
+ lpDestBndry = lpDestStr + cchDest;
+
+ if( pbSecwt < lpDestBndry )
+ *pbSecwt++ = 1; // separator
+
+ if( cOverall <= cchDest )
+ *(pbDest + cOverall - 1) = 0; // zero terminator
+
+ // ****************************
+ // Start of the second loop.
+ // ****************************
+
+ for (;;) { // Get next char, handle end of string and symbol skipping.
+ if (lpstr >= lpstrEnd) {
+ fEnd = TRUE;
+ chNext = 0;
+ break;
+ }
+ chNext = *lpstr;
+ break;
+ }
+ ++lpstr;
+
+ while(!fEnd){
+ ch = chNext;
+ for (;;){
+ if(lpstr >= lpstrEnd){
+ fEnd = TRUE;
+ chNext = 0;
+ break;
+ }
+ chNext = *lpstr;
+ break;
+ }
+ ++lpstr;
+
+ // Important note:
+ //
+ // - if 2 chars were treated as 1 char(DB or digraph)
+ // then you should read 1 char from lpstr into chNext.
+ // (also you should increase lpstr by 1)
+ // - if you see SB char, then you don't have to do anything.
+
+ if(GetSortWeightKTP(ch, chNext, &compstrinfo)){
+ if (lpstr >= lpstrEnd)
+ fEnd = TRUE; // don't need to update chNext, we'll break
+ else
+ chNext = *lpstr++;
+ }
+
+ // Let's write weights into the Dest string.
+
+ if(pbSecwt < lpDestBndry){ // writing priwt & secwt.
+ *pbSecwt++ = (unsigned char)compstrinfo.secwt + 2;
+ *pbDest++ = compstrinfo.priwt >> 8;
+ *pbDest++ = compstrinfo.priwt & 0xFF;
+ }
+ else if(pbDest < lpDestBndry - 1){ // writing priwt only
+ *pbDest++ = compstrinfo.priwt >> 8;
+ *pbDest++ = compstrinfo.priwt & 0xFF;
+ }
+ else{ // we don't have any room for writing weights
+ if(pbDest < lpDestBndry)
+ *pbDest++ = compstrinfo.priwt >> 8; // write the last 1 byte
+ break; // get out of this loop
+ }
+ }
+
+ // Return number of characters copied/needed, unless we ran out
+ // of space.
+
+ // Note : we already took care of the case (cchDest==0)
+ // *before* we entered the second loop.
+
+ if(cOverall <= cchDest)
+ return cOverall;
+ else
+ return 0; // fTooLittleSpace == TRUE.
+}
+
+int
+nDecodeSortWeightJ(COMPSTRINGINFO FAR *pcompstrinfo)
+{
+ int i;
+ STRINFO_J FAR* pstrinfo;
+ unsigned char bPriwtHi = (pcompstrinfo->priwt >> 8);
+ unsigned char bPriwtLo = (pcompstrinfo->priwt & 0x00FF);
+ unsigned char bSecwt = pcompstrinfo->secwt;
+ unsigned char bSecflg = pcompstrinfo->secflg;
+ unsigned char fKanaOn = 0;
+
+ pstrinfo = (STRINFO_J FAR*)g_pstrinfo;
+
+ /* if we are looking for half-pitch kana, then Daku-on or Handaku-on */
+ /* must be rendered as a seperate character. Adjust before & after */
+ if ((bSecflg&0x21)==0x21 && !(bSecwt&0x40)) {
+ fKanaOn = bSecwt&0x03;
+ bSecwt &= 0xFC;
+ }
+
+ /* scan for the character that we would like to get */
+ for (i=0; i<0x492; i++) {
+ if ((bPriwtHi==pstrinfo->pbPriHi[i]) &&
+ (bSecwt==pstrinfo->pbSecWgt[i]) &&
+ ((bPriwtLo==pstrinfo->pbPriLo[i]) ||
+ (!bPriwtLo && (pstrinfo->pbPriLo[i]==0xFF))))
+ break;
+ }
+ if (i==0x492)
+ return 0;
+
+ /* We found a character to return. If half-pitch kana and daku-on or */
+ /* handaku-on is required, then return the two 1-byte chars together */
+ if (i<0x00FF){
+ if (fKanaOn)
+ i = (i<<8) + ((fKanaOn==1) ? 0xDE : 0xDF);
+ return i;
+ }
+
+ /* force two byte chars back into the two byte range. */
+ return (i | 0x8000);
+}
+
+int
+MapStringJ(
+ unsigned long dwMapFlags,
+ const unsigned char FAR* lpSrcStr, int cchSrc,
+ unsigned char FAR* lpDestStr, int cchDest)
+{
+ STRINFO_J FAR* pstrinfo;
+ COMPSTRINGINFO compstrinfo;
+ int cchActDest = 0;
+ const char FAR * lpStrEnd;
+ BOOL fEnd = FALSE;
+
+ ASSERT(fJapan);
+
+ pstrinfo = (STRINFO_J FAR*)g_pstrinfo;
+
+ // Assumption :
+ // The caller must calculate the length of Src string,
+ // and give the result by cchSrc..
+
+ // we'll use sortweights for mapping strings.
+ // so let's turn off the global flag - to get CLEAN SortWeights.
+ // ( we should not ignore any info - case, pitch(SB/DB), etc. )
+
+ g_dwFlags = 0;
+
+ if (lpDestStr==lpSrcStr && (dwMapFlags & LCMAP_FULLWIDTH))
+ return 0; // dangerous - in this case src chars can be destroyed
+ // before we read them..
+
+ while (cchSrc) {
+ BOOL fSearch;
+ unsigned char FAR* pbMasks;
+
+ /* Save a copy of the next character in the string */
+ unsigned wCh = *lpSrcStr, wChNew;
+ int cch = (cchSrc>1 && isDbcsJ(wCh,0)) ? 2 : 1;
+ int cch2 = cch;
+ if (cch==2)
+ wCh = (wCh << 8) + *(lpSrcStr+1);
+
+ /* Special code to allow half pitch kana with accents to be */
+ /* comibined into a single full pitch character */
+ if ((dwMapFlags&LCMAP_FULLWIDTH) && cch==1) {
+ lpStrEnd = lpSrcStr;
+ compstrinfo.priwt = compstrinfo.secwt = 0;
+ cch2 = cchSrc - GetSortWeightJ(&lpStrEnd, cchSrc, &compstrinfo);
+
+ /* only use this code if we actually picked up an accent */
+ if (cch2!=cch) {
+ /* scan the table of conversions that we know how to do */
+ fSearch = FALSE;
+ /* special kludges to convert the kana repeat marks */
+ if (dwMapFlags&LCMAP_KATAKANA) {
+ if (compstrinfo.priwt==0x4100 || compstrinfo.priwt==0x4200 ) {
+ compstrinfo.priwt += 0x0400;
+ fSearch = TRUE;
+ }
+ }
+ if (dwMapFlags&LCMAP_HIRAGANA) {
+ if (compstrinfo.priwt==0x4500 || compstrinfo.priwt==0x4600 ) {
+ compstrinfo.priwt -= 0x0400;
+ fSearch = TRUE;
+ }
+ }
+ for (pbMasks=pstrinfo->pbMaps; *pbMasks; pbMasks+=6) {
+ if (compstrinfo.secflg & pbMasks[1]) {
+ unsigned nForceOn = (pbMasks[2] << 8) + pbMasks[3];
+ unsigned nForceOff = (pbMasks[4] << 8) + pbMasks[5];
+ if (dwMapFlags & nForceOn ) {
+ compstrinfo.secwt |= pbMasks[0];
+ fSearch = TRUE;
+ }
+ if (dwMapFlags & nForceOff) {
+ compstrinfo.secwt &= ~pbMasks[0];
+ fSearch = TRUE;
+ }
+ }
+ }
+ /* if a conversion is possible, look for a new char */
+ if (fSearch && (wChNew=nDecodeSortWeightJ(&compstrinfo))) {
+ /* Save the new 2 byte character */
+ cchActDest += 2;
+ if (cchDest && cchActDest>cchDest)
+ return 0;
+ if (cchDest) {
+ *lpDestStr++ = (wChNew >> 8);
+ *lpDestStr++ = wChNew;
+ }
+
+ /* Then go onto the next character */
+ cchSrc -= cch2;
+ lpSrcStr += cch2;
+ continue;
+ }
+ }
+ }
+
+ /* If the accent tests failed check for normal conversion in a */
+ /* character-by-character mode */
+ compstrinfo.priwt = compstrinfo.secwt = 0;
+ GetSortWeightJ(&lpSrcStr, cch, &compstrinfo);
+ cchSrc -= cch;
+
+ /* now scan the table of conversions that we know how to do */
+ /* check if one of these is requested & this char is elegible */
+ /* & that the char is not already in the mode requested */
+ fSearch = FALSE;
+ //
+ //Special kludges to make some pairs of full-pitch chars that
+ //sort as different chars both convert to the same half-pitch char
+ if (dwMapFlags&LCMAP_HALFWIDTH) {
+ /* the single & double quotation marks */
+ if (compstrinfo.secflg==0x22 && (compstrinfo.secwt&0x40)) {
+ compstrinfo.secwt = 0x04;
+ fSearch = TRUE;
+ }
+ /* the cho-on markers */
+ if (compstrinfo.priwt==0x3500) {
+ compstrinfo.priwt = 0x4400;
+ fSearch = TRUE;
+ }
+ }
+ /* special kludges to convert the kana repeat marks */
+ if (dwMapFlags&LCMAP_KATAKANA) {
+ if (compstrinfo.priwt==0x4100 || compstrinfo.priwt==0x4200 ) {
+ compstrinfo.priwt += 0x0400;
+ fSearch = TRUE;
+ }
+ }
+ if (dwMapFlags&LCMAP_HIRAGANA) {
+ if (compstrinfo.priwt==0x4500 || compstrinfo.priwt==0x4600 ) {
+ compstrinfo.priwt -= 0x0400;
+ fSearch = TRUE;
+ }
+ }
+ for (pbMasks=pstrinfo->pbMaps; *pbMasks; pbMasks+=6) {
+ if (compstrinfo.secflg & pbMasks[1]) {
+ unsigned nForceOn = (pbMasks[2] << 8) + pbMasks[3];
+ unsigned nForceOff = (pbMasks[4] << 8) + pbMasks[5];
+ if (dwMapFlags & nForceOn) {
+ if (pbMasks[1]==0x10) { /* some hiragana conversions bad */
+ /* don't do 'V' characters */
+ if (compstrinfo.priwt==0x8900 && (compstrinfo.secwt&0x03))
+ continue;
+ }
+ compstrinfo.secwt |= pbMasks[0];
+ fSearch = TRUE;
+ }
+ if (dwMapFlags & nForceOff) {
+ if (pbMasks[1]==0x20) { /* some halfwidth conversions bad */
+ /* don't do small 'WA' characters */
+ if (compstrinfo.priwt==0xB400 && !(compstrinfo.secwt&0x04))
+ continue;
+ /* don't do together with hiragana conversions (except V) */
+ if ((dwMapFlags&LCMAP_HIRAGANA) && (compstrinfo.secflg&0x10)
+ && !(compstrinfo.priwt==0x8900 && (compstrinfo.secwt&0x03)))
+ continue;
+ }
+ compstrinfo.secwt &= ~pbMasks[0];
+ fSearch = TRUE;
+ }
+ }
+ }
+
+ /* if a conversion is possible, look for a new char */
+ if (fSearch && (wChNew=nDecodeSortWeightJ(&compstrinfo)))
+ wCh = wChNew;
+
+ /* Save the new (or old) 1 or 2 byte character */
+ cchActDest += (wCh > 0x00FF) ? 2 : 1;
+ if (cchDest) {
+ if (cchActDest>cchDest)
+ return 0;
+ if (wCh > 0x00FF)
+ *lpDestStr++ = (wCh >> 8);
+ *lpDestStr++ = wCh;
+ }
+ }
+
+ // don't worry about NULL termination.
+ // it's already taken care of.. ( cchSrc = lstrlen(lpSrcStr) + 1 )
+ return cchActDest;
+}
+
+int
+MapStringKTP(
+ unsigned long dwMapFlags,
+ const unsigned char FAR* lpSrcStr, int cchSrc,
+ unsigned char FAR* lpDestStr, int cchDest)
+{
+ MAPTABLE FAR* prgmaptable;
+ COMPSTRINGINFO compstrinfo;
+ int cchActDest = 0;
+ const char FAR * lpStrEnd;
+ BOOL fEnd = FALSE;
+ unsigned cMaptable, uMin, uMax, uMid, wOffset, ch;
+ unsigned char chNext; // important.. not to get SIGN-EXTENDED int
+
+ ASSERT(fKoreaTaiwanPrc);
+
+ cMaptable = ((STRINFO_KTP FAR*)g_pstrinfo)->cMaptable;
+ prgmaptable = ((STRINFO_KTP FAR*)g_pstrinfo)->prgmaptable;
+
+ // Assumption :
+ // The caller must calculate the length of Src string,
+ // and give the result by cchSrc..
+
+ // we'll use sortweights for mapping strings.
+ // so let's turn off the global flag - to get CLEAN SortWeights.
+ // ( we should not ignore any info - case, pitch(SB/DB), etc. )
+
+ g_dwFlags = 0;
+
+ if (lpDestStr==lpSrcStr && (dwMapFlags & LCMAP_FULLWIDTH))
+ return 0; // dangerous - in this case src chars can be destroyed
+ // before we read them..
+
+ lpStrEnd = lpSrcStr + cchSrc;
+
+ if (lpSrcStr >= lpStrEnd)
+ fEnd = TRUE, chNext = 0;
+ else
+ chNext = (unsigned char)*lpSrcStr++;
+
+ while (!fEnd) {
+ ch = chNext;
+
+ if (lpSrcStr >= lpStrEnd)
+ fEnd = TRUE, chNext = 0;
+ else
+ chNext = *lpSrcStr++;
+
+ if(GetSortWeightKTP(ch, chNext, &compstrinfo)) { // DB ??
+
+ // ch will be re-used when we cannot convert the char.
+ ch = (ch << 8) + chNext;
+
+ if (lpSrcStr >= lpStrEnd)
+ fEnd = TRUE, chNext = 0;
+ else
+ chNext = *lpSrcStr++;
+ }
+
+ uMin = 0;
+ uMax = cMaptable; // out of array bound - seems tricky, too
+
+ while( uMin + 1 < uMax ) { // binary search
+ uMid = (uMin + uMax)/2;
+ if (prgmaptable[uMid].wPriwt > (unsigned)compstrinfo.priwt)
+ uMax = uMid;
+ else
+ uMin = uMid;
+ }
+
+ // we'll use uMin, not uMid !!
+ wOffset = (unsigned)compstrinfo.priwt - prgmaptable[uMin].wPriwt;
+
+ if( wOffset < prgmaptable[uMin].wCount ) { // There's a matching range
+ // just to be careful..
+ // iCase will be used as one of table indices.
+ int iCase = compstrinfo.secwt & (KOR_PITCHBIT | KOR_CASEBIT);
+
+ if (dwMapFlags & LCMAP_UPPERCASE)
+ iCase &= ~(unsigned)KOR_CASEBIT;
+ else if (dwMapFlags & LCMAP_LOWERCASE)
+ iCase |= (unsigned)KOR_CASEBIT;
+
+ if (dwMapFlags & LCMAP_HALFWIDTH)
+ iCase &= ~(unsigned)KOR_PITCHBIT;
+ else if (dwMapFlags & LCMAP_FULLWIDTH)
+ iCase |= (unsigned)KOR_PITCHBIT;
+
+ ch = prgmaptable[uMin].wCode[iCase] + wOffset; // Map a character
+ }
+
+ if(ch>0x100) { // DB char
+ if (cchDest == 0)
+ cchActDest+=2;
+ else if (cchActDest + 1 < cchDest ) {
+ *lpDestStr++ = ch >> 8;
+ *lpDestStr++ = ch & 0xFF;
+ cchActDest+=2;
+ } else
+ return 0;
+ } else {
+ if (cchDest == 0)
+ cchActDest++;
+ else if (cchActDest < cchDest ) {
+ *lpDestStr++ = ch;
+ cchActDest++;
+ } else
+ return 0;
+ }
+ }
+
+ // don't worry about NULL termination.
+ // it's already taken care of.. ( cchSrc = lstrlen(lpSrcStr) + 1 )
+
+ return cchActDest;
+}
+
+#endif /* } */
+
+/***
+*LCMapStringA - map a string
+*Purpose:
+* Maps a string to lowercase, uppercase, or to a sort key.
+*
+*Entry:
+* lcid - locale governing the mapping
+* dwMapFlags - one of
+* LCMAP_LOWERCASE
+* LCMAP_UPPERCASE
+* LCMAP_SORTKEY
+* if LCMAP_SORTKEY, can be or'ed with:
+* NORM_IGNORECASE
+* NORM_IGNORENONSPACE
+* NORM_IGNORESYMBOLS
+* lpSrcStr - pointer to sting to map
+* cchSrc - length of string, or -1 for NULL terminated
+* lpDestStr - pointer to destination, may not be lpSrcStr
+* cchDest - size of buffer. If cchDest is 0, the return value
+* is the number of characters needed.
+*
+* UNDONE: LCMAP_SORTKEY not yet implemented.
+*
+*Exit:
+* returns number of characters written, or number of characters
+* needed if cchDest is 0.
+* On error, returns 0.
+*
+***********************************************************************/
+
+NLSAPI_(int) EXPORT
+LCMapStringA(
+ LCID lcid,
+ unsigned long dwMapFlags,
+ const char FAR* lpSrcStr, int cchSrc,
+ char FAR* lpDestStr, int cchDest)
+{
+ int retval;
+ char FAR* pMap;
+
+#ifdef _DEBUG
+ // Parameter validation.
+ if (cchSrc < -1 || cchDest < 0)
+ {LogParamError(ERR_BAD_VALUE, LCMapStringA, 0); return 0;}
+ if (cchDest != 0 && IsBadWritePtr(lpDestStr, cchDest))
+ {LogParamError(ERR_BAD_PTR, LCMapStringA, 0); return 0;}
+ if (cchSrc != -1 && IsBadReadPtr(lpSrcStr, cchSrc))
+ {LogParamError(ERR_BAD_PTR, LCMapStringA, 0); return 0;}
+ if (cchSrc == -1 && IsBadStringPtr(lpSrcStr, 0x7FFF))
+ {LogParamError(ERR_BAD_STRING_PTR, LCMapStringA, 0); return 0;}
+#ifdef FE_DBCS
+ /* check for any flags not in the known set of flags */
+ if (dwMapFlags & ~(LCMAP_UPPERCASE | LCMAP_LOWERCASE |
+ LCMAP_HALFWIDTH | LCMAP_FULLWIDTH | LCMAP_HIRAGANA | LCMAP_KATAKANA |
+ LCMAP_SORTKEY | NORM_IGNORECASE | NORM_IGNORENONSPACE |
+ NORM_IGNORESYMBOLS | NORM_IGNOREWIDTH | NORM_IGNOREKANATYPE))
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+
+ /* check for sortkey options combined with non-sortkey options */
+ if ((dwMapFlags & (LCMAP_UPPERCASE | LCMAP_LOWERCASE | LCMAP_HALFWIDTH |
+ LCMAP_FULLWIDTH | LCMAP_HIRAGANA | LCMAP_KATAKANA)) &&
+ (dwMapFlags & (LCMAP_SORTKEY | NORM_IGNORECASE | NORM_IGNORENONSPACE |
+ NORM_IGNORESYMBOLS | NORM_IGNOREWIDTH | NORM_IGNOREKANATYPE)))
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+
+ /* check for bad pairs of flags */
+ if ((dwMapFlags & LCMAP_LOWERCASE) && (dwMapFlags & LCMAP_UPPERCASE))
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+ if ((dwMapFlags & LCMAP_HALFWIDTH) && (dwMapFlags & LCMAP_FULLWIDTH))
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+ if ((dwMapFlags & LCMAP_KATAKANA) && (dwMapFlags & LCMAP_HIRAGANA))
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+
+// if ((dwMapFlags != 0) &&
+// ((dwMapFlags & (LCMAP_LOWERCASE | LCMAP_UPPERCASE | LCMAP_SORTKEY |
+// NORM_IGNORECASE | NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS |
+// NORM_IGNOREWIDTH | NORM_IGNOREKANATYPE |
+// LCMAP_HALFWIDTH | LCMAP_FULLWIDTH | LCMAP_HIRAGANA | LCMAP_KATAKANA))
+// == 0))
+// {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+#else
+ if ((dwMapFlags & (LCMAP_UPPERCASE | LCMAP_LOWERCASE | LCMAP_SORTKEY |
+ NORM_IGNORECASE | NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS)) == 0)
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+ if ((dwMapFlags & LCMAP_LOWERCASE) && (dwMapFlags & ~LCMAP_LOWERCASE) != 0)
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+ if ((dwMapFlags & LCMAP_UPPERCASE) && (dwMapFlags & ~LCMAP_UPPERCASE) != 0)
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+ if ((dwMapFlags & LCMAP_SORTKEY) &&
+ (dwMapFlags & ~(LCMAP_SORTKEY | NORM_IGNORECASE |
+ NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS)) != 0)
+ {LogParamError(ERR_BAD_FLAGS, LCMapStringA, 0); return 0;}
+#endif
+#endif
+
+ if (lcid != g_lcidCurrent) {
+ if (!SetupLcid(lcid))
+ {retval = 0; goto Finish; }
+ }
+
+ // Get length of string if needed.
+ if (cchSrc == -1)
+ cchSrc = STRLEN(lpSrcStr) + 1;
+
+ // Handle SortKey case with seperate routine.
+ if (dwMapFlags & LCMAP_SORTKEY) {
+#ifdef FE_DBCS
+ if(fDBCS){
+ return ((fJapan) ? CreateSortKeyJ : CreateSortKeyKTP)
+ (lpSrcStr, cchSrc, lpDestStr, cchDest, dwMapFlags);
+ }
+#endif
+ return CreateSortKey(
+ lpSrcStr, cchSrc, lpDestStr, cchDest, dwMapFlags);
+ }
+
+#ifdef FE_DBCS
+ if(fDBCS)
+ return ((fJapan) ? MapStringJ : MapStringKTP)
+ (dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest);
+
+ // else use the Single Byte code system.
+ //
+ // Note : in FE countries, we often map DB chars into SB chars.
+ // So we can map one string into the SHORTER length.
+ // This is why we don't compare cchDest with cchSrc...
+#endif
+
+ // See if user requested destination size, and check dest size big enough
+ if (cchDest == 0)
+ {retval = cchSrc; goto Finish;} // cchSrc = size needed including NUL
+ else if (cchDest < cchSrc)
+ {retval = 0; goto Finish;} // Error - dest too small
+
+ retval = cchSrc;
+
+ if (dwMapFlags & (LCMAP_LOWERCASE | LCMAP_UPPERCASE)) {
+ // Get pointer mapping table.
+ pMap = (dwMapFlags & LCMAP_LOWERCASE)
+ ? g_pstrinfo->prgbLCase : g_pstrinfo->prgbUCase;
+
+ // Loop through each character, and map.
+ while (cchSrc--) {
+ *lpDestStr++ = pMap[(unsigned char) *lpSrcStr++];
+ }
+ } else
+ MEMCPY(lpDestStr, lpSrcStr, cchSrc);
+
+
+ /* DROP THRU */
+Finish:
+ return retval;
+
+}
+
+#ifdef FE_DBCS /* { */
+
+int
+GetStringTypeJ(
+ unsigned long dwInfoType,
+ const unsigned char FAR* lpSrcStr, int cchSrc,
+ unsigned short FAR* lpwDest)
+{
+ STRINFO_J FAR* pstrinfo;
+
+ // Assumption : cchSrc should have the correct length.
+ // the caller is responsible for setting cchSrc.
+
+ ASSERT(fJapan);
+ g_dwFlags = 0;
+ pstrinfo = (STRINFO_J FAR*)g_pstrinfo;
+
+ while (cchSrc)
+ {
+ /* Get a copy of the next character in the string (inc ptrs later) */
+ unsigned wCh = *lpSrcStr;
+ int cch = (cchSrc>1 && isDbcsJ(wCh,0)) ? 2 : 1;
+ if (cch==2)
+ wCh = (wCh << 8) + *(lpSrcStr+1);
+
+ /* if it can map through the tables, convert to an index */
+ if (wCh < 0x87A0)
+ wCh &= 0x0FFF; /* 0x00nn -> 0x00nn, 81nn->01nn, etc.. */
+
+ /* Now convert the character to the required CTYPE value */
+ switch (dwInfoType) {
+ default: // CT_CTYPE1
+ if (wCh & 0x8000)
+ *lpwDest = C1_ALPHA; /* all Kanji are text */
+ else
+ {
+ wCh <<= 1; /* WORD offset, not BYTE */
+ *lpwDest = (unsigned short)
+ (pstrinfo->pbC1JPN[wCh]*256 + pstrinfo->pbC1JPN[wCh+1]);
+ }
+ break;
+
+ case CT_CTYPE2:
+ if (wCh & 0x8000)
+ *lpwDest = 0;
+ else
+ *lpwDest = (unsigned short)(pstrinfo->pbC2JPN[wCh]);
+ break;
+
+ case CT_CTYPE3:
+ if (wCh & 0x8000)
+ *lpwDest = C3_IDEOGRAPH+C3_ALPHA; /* All Kanji are text */
+ else
+ {
+ wCh <<= 1; /* WORD offset, not BYTE */
+ *lpwDest = (unsigned short)
+ (pstrinfo->pbC3JPN[wCh]*256 + pstrinfo->pbC3JPN[wCh+1]);
+ }
+ break;
+ }
+ /* Prepare for the next character in the stream (inc pointers) */
+ cchSrc -= cch;
+ lpSrcStr += cch;
+ lpwDest++;
+ }
+ return TRUE;
+}
+
+int
+GetStringTypeKTP(
+ unsigned long dwInfoType,
+ const unsigned char FAR* lpSrcStr, int cchSrc,
+ unsigned short FAR* lpwDest)
+{
+ TYPETABLE FAR* prgtypetable;
+ unsigned cTypetable, uMin, uMax, uMid, ch;
+
+ // Assumption : cchSrc should have the correct length.
+ // the caller is responsible for setting cchSrc.
+
+ ASSERT(fKoreaTaiwanPrc);
+
+ cTypetable = ((STRINFO_KTP FAR*)g_pstrinfo)->cTypetable;
+ prgtypetable = ((STRINFO_KTP FAR*)g_pstrinfo)->prgtypetable;
+
+ while (cchSrc--) {
+
+ ch = *lpSrcStr++;
+ if (cchSrc
+ && ( (fKorea && isDbcsK(ch, *lpSrcStr))
+ || (fTaiwan && isDbcsT(ch, *lpSrcStr))
+ || (fPrc && isDbcsP(ch, *lpSrcStr))))
+ cchSrc--, ch = (ch << 8) + *lpSrcStr++;
+
+ uMin = 0;
+ uMax = cTypetable; // out of array bound - seems tricky, too
+
+ while( uMin + 1 < uMax ) { // binary search
+ uMid = (uMin + uMax)/2;
+ if (prgtypetable[uMid].wStart > ch)
+ uMax = uMid;
+ else
+ uMin = uMid;
+ }
+
+ // we'll use uMin, not uMid !!
+ switch(dwInfoType){
+ case CT_CTYPE1:
+ *lpwDest = prgtypetable[uMin].TypeC1;
+ break;
+ case CT_CTYPE2:
+ *lpwDest = prgtypetable[uMin].TypeC2;
+ break;
+ case CT_CTYPE3:
+ *lpwDest = prgtypetable[uMin].TypeC3;
+ break;
+ }
+ ++lpwDest;
+ }
+
+ return TRUE;
+}
+
+#endif /* } */
+
+/***
+*GetStringTypeA - get character types
+*Purpose:
+* Gets character types for a string.
+*
+*Entry:
+* lcid - locale governing the mapping
+* dwInfoType - one of
+* CT_CTYPE1
+* CT_CTYPE2
+* CT_CTYPE3
+* lpSrcStr - pointer to sting to map
+* cchSrc - length of string, or -1 for NULL terminated
+* lpwDest - pointer to word array of length cchSrc
+*
+*Exit:
+* returns TRUE on succes, FALSE on failure.
+*
+***********************************************************************/
+NLSAPI_(int) EXPORT
+GetStringTypeA(
+ LCID lcid,
+ unsigned long dwInfoType,
+ const char FAR* lpSrcStr, int cchSrc,
+ unsigned short FAR* lpwDest)
+{
+ unsigned short FAR* pwCur;
+ const unsigned char FAR *pchCur;
+
+#ifdef _DEBUG
+ // Parameter validation.
+ if (cchSrc < -1)
+ {LogParamError(ERR_BAD_VALUE, GetStringTypeA, 0); return FALSE;}
+ if (cchSrc != -1 && IsBadReadPtr(lpSrcStr, cchSrc))
+ {LogParamError(ERR_BAD_PTR, GetStringTypeA, 0); return FALSE;}
+ if (cchSrc == -1 && IsBadStringPtr(lpSrcStr, 0x7FFF))
+ {LogParamError(ERR_BAD_STRING_PTR, GetStringTypeA, 0); return FALSE;}
+ if (dwInfoType != CT_CTYPE1 && dwInfoType != CT_CTYPE2 &&
+ dwInfoType != CT_CTYPE3)
+ {LogParamError(ERR_BAD_FLAGS, GetStringTypeA, 0); return FALSE;}
+#endif
+
+ // Get length of string if needed.
+ if (cchSrc == -1)
+ cchSrc = lstrlen(lpSrcStr);
+
+#ifdef _DEBUG
+ // More param validation.
+ if (IsBadWritePtr(lpwDest, cchSrc * sizeof(unsigned short)))
+ {LogParamError(ERR_BAD_PTR, GetStringTypeA, 0); return FALSE;}
+#endif
+
+ // Get pointer to tables.
+ if (lcid != g_lcidCurrent) {
+ if (!SetupLcid(lcid))
+ goto Error; // Error - bad lcid.
+ }
+
+#ifdef FE_DBCS
+ if(fDBCS)
+ return ((fJapan) ? GetStringTypeJ : GetStringTypeKTP)
+ (dwInfoType, lpSrcStr, cchSrc, lpwDest);
+#endif
+
+ // Loop through each character, and get type.
+ pwCur = lpwDest;
+ pchCur = lpSrcStr;
+
+ {
+ WORD w;
+ WORD FAR* prgw = (dwInfoType == CT_CTYPE3)
+ ? g_pstrinfo->prgwCType3 : g_pstrinfo->prgwCType12;
+ while (cchSrc--) {
+ w = prgw[(BYTE)*pchCur++];
+ // combining ctype1 and ctype2 into the same table saves 4K from the DLL
+ switch (dwInfoType) {
+ case CT_CTYPE1:
+ w = w & 0x0fff; // extract ctype1 bits
+ break;
+ case CT_CTYPE2:
+ w = (w & 0xf000) >> 12; // extract ctype2 bits
+ break;
+ default:
+ break;
+ }
+ *pwCur++ = w;
+ }
+ }
+
+ return TRUE;
+
+Error:
+ return FALSE;
+}
+
+
+#if OE_WIN
+/***
+*NotifyNLSInfoChanged - Notify ole2disp that WIN.INI has changed
+*Purpose:
+* BSTR->Date and Date->BSTR conversions in ole2disp make heavy use of
+* NLS functions. For speed, they cache NLS info, but if the WIN.INI
+* changes, the cache must be invalidated. This function calls a callback
+* in ole2disp, if the callback function is registered.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void NotifyNLSInfoChanged(void)
+{
+ // if the callback is registered, call it
+ if (g_pfnCacheNotifyProc)
+ (*g_pfnCacheNotifyProc)();
+}
+
+/***
+*RegisterNLSInfoChanged - Private API for ole2disp to get WM_WININICHANGED
+*Purpose:
+* ole2disp.dll calls this to register a callback function which will be
+* called whenever the WIN.INI file changes.
+*
+*Entry:
+* lpfnNotifyProc - pointer to notify callback function, or NULL to
+* unhook the callback
+*
+*Exit:
+* TRUE if callback function set or cleared successfully.
+* FALSE if another callback is already registered. Note that only one
+* callback can be registered (that is, only ole2disp can use it)
+*
+***********************************************************************/
+NLSAPI_(int) EXPORT
+RegisterNLSInfoChanged(FARPROC lpfnNotifyProc)
+{
+ if (lpfnNotifyProc == NULL) { // caller wants to un-register itself
+ g_pfnCacheNotifyProc = NULL;
+ return TRUE;
+ }
+
+ if (g_pfnCacheNotifyProc)
+ return FALSE;
+
+ g_pfnCacheNotifyProc = lpfnNotifyProc;
+ return TRUE;
+}
+
+#endif
diff --git a/private/oleauto/src/dispatch/nlsdbcs.h b/private/oleauto/src/dispatch/nlsdbcs.h
new file mode 100644
index 000000000..804e746fc
--- /dev/null
+++ b/private/oleauto/src/dispatch/nlsdbcs.h
@@ -0,0 +1,176 @@
+// FE specific flags
+
+// Country informations
+
+#define LCID_CHINA_T 0x404 // traditional
+#define LCID_CHINA_S 0x804 // simplified
+#define LCID_JAPAN 0x411
+#define LCID_KOREA 0x412
+
+unsigned char bFEflag;
+
+#define bitJapan 1
+#define bitKorea 2
+#define bitChinaT 4 // Traditional
+#define bitChinaS 8 // Simplified
+#define bitTaiwan bitChinaT
+#define bitPrc bitChinaS
+
+#define fDBCS (bFEflag)
+
+#define fJapan (bFEflag & bitJapan)
+#define fKorea (bFEflag & bitKorea)
+#define fTaiwan (bFEflag & bitTaiwan)
+#define fPrc (bFEflag & bitPrc)
+
+#define fJapanKorea (bFEflag & (bitJapan | bitKorea))
+#define fJapanTaiwan (bFEflag & (bitJapan | bitTaiwan))
+#define fKoreaTaiwan (bFEflag & (bitKorea | bitTaiwan))
+
+#define fJapanKoreaPrc (bFEflag & (bitJapan | bitKorea | bitPrc))
+#define fJapanTaiwanPrc (bFEflag & (bitJapan | bitTaiwan | bitPrc))
+#define fKoreaTaiwanPrc (bFEflag & (bitKorea | bitTaiwan | bitPrc))
+
+#define isDbcsJ( c, next) ((c >= 0x80 && c <= 0xA0) || (c >= 0xE0 && c <= 0xFF))
+#define isDbcsK( c1, c2 ) (c1 > 0xA0 && c1 < 0xFF && c2 > 0xA0 && c2 < 0xFF)
+#define isDbcsT( c1, c2 ) (c1 > 0x80 && c1 < 0xFF && c2 > 0x3F && c2 < 0xFF)
+#define isDbcsP( c1, c2 ) (c1 > 0xA0 && c1 < 0xFF && c2 > 0xA0 && c2 < 0xFF)
+
+
+// for FE string comparison
+
+unsigned long g_dwFlags; // global flag
+
+typedef struct tagCOMPSTRINGINFO{
+ unsigned priwt;
+ unsigned char secwt;
+ unsigned char secflg; //(only needed for Japan)
+} COMPSTRINGINFO;
+
+
+// Japanese specific constants, globals
+
+/* charcter type */
+//#define chTypePunc 0
+//#define chTypeNum 1
+//#define chTypeRoman 2
+//#define chTypeGreek 3
+//#define chTypeRuss 4
+//#define chTypeKana 5
+//#define chTypeKanji 6
+
+//typedef struct JPNConvCode
+//{
+// unsigned char bSrcHi; // 1st byte of source char
+// unsigned char bSrcLo; // 2nd
+// unsigned char bPriwt;
+// unsigned char bSecwt;
+//} JPNConvCode;
+
+//typedef struct JPNConvSort
+//{
+// unsigned char bPriwt;
+// unsigned char bSecwt;
+// unsigned char bSrcHi;
+// unsigned char bSrcLo;
+//} JPNConvSort;
+
+// Indices of the masks in the sortmasks words
+//#define JPN_MASK_CHARTYPE 0 // Mask to give character type
+//#define JPN_MASK_NORMALKANA 1 // Mask to give normal naka
+//#define JPN_MASK_IGNORECASE 2 // Maks for ignoring case
+//#define JPN_MASK_IGNOREKANATYPE 3 // Maks for ignoring japanese kana type
+//#define JPN_MASK_IGNOREWIDTH 4 // Mask for ignoring width pitch character
+
+// japanese sort weight bit
+//#define JPN_PITCHBIT 0x01
+//#define JPN_CASEBIT 0x02
+//#define JPN_NORMALKANABIT 0x04
+
+//#define JPN_SB_KANA 0xA4 // single-byte katakana secondary weight
+//#define JPN_SB_TEN 0xDE // single-byte katakana ten
+//#define JPN_SB_MARU 0xDF // single-byte katakana maru
+
+//unsigned short cKana2Sort, cCode2Sort, cSort2Code;
+
+//#define isJpnKanjiPriwt(priwt) ((priwt >= 0xBF) && (priwt <= 0xFE))
+
+
+// Korean specific constants, globals
+
+typedef struct SORTWEIGHT
+{
+ unsigned wStart; // Starting code value of a segment
+ unsigned wPriwt; // Primary Weight
+ unsigned char bSecwt; // Secondary Weight
+ unsigned char bMode; // Mapping mode : 1to1, Many_to1, case/pitch
+} SORTWEIGHT;
+
+typedef struct MAPTABLE
+{
+ unsigned wPriwt; // Starting Priwt value of a segment
+ unsigned wCount; // Number of chars in one segment
+ unsigned wCode[4]; // Starting Code value of dst. segment
+} MAPTABLE;
+
+typedef struct TYPETABLE
+{
+ unsigned wStart;
+ unsigned int TypeC1;
+ unsigned char TypeC2;
+ unsigned char TypeC3;
+} TYPETABLE;
+
+#define MODE_1TO1 0 // Constants for SORTWEIGHT.bMode field
+#define MODE_MTO1 1
+#define MODE_CONV 2
+
+#define KOR_CASEBIT 2
+#define KOR_PITCHBIT 1
+
+typedef struct tagSTRINFO_KTP
+{
+ SORTWEIGHT FAR* prgsortweight;
+ MAPTABLE FAR* prgmaptable;
+ TYPETABLE FAR* prgtypetable;
+
+ unsigned int cSortweight;
+ unsigned int cMaptable;
+ unsigned int cTypetable;
+}
+STRINFO_KTP;
+
+typedef struct tagSTRINFO_J
+{
+ unsigned char FAR* pbPriHi;
+ unsigned char FAR* pbPriLo;
+ unsigned char FAR* pbSecWgt;
+ unsigned char FAR* pbSecFlg;
+ unsigned char FAR* pbMasks;
+ unsigned char FAR* pbMaps;
+ unsigned char FAR* pbIgnore;
+ unsigned char FAR* pbC1JPN;
+ unsigned char FAR* pbC2JPN;
+ unsigned char FAR* pbC3JPN;
+}
+STRINFO_J;
+
+
+#if OE_MAC
+extern void LoadNlsInfo0404(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0411(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0412(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0804(LCINFO **, STRINFO **);
+#else //OE_MAC
+extern STRINFO_KTP NLSALLOC(0404) g_strinfo0404;
+extern LCINFO NLSALLOC(0404) g_rglcinfo0404[];
+
+extern STRINFO_J NLSALLOC(0411) g_strinfo0411;
+extern LCINFO NLSALLOC(0411) g_rglcinfo0411[];
+
+extern STRINFO_KTP NLSALLOC(0412) g_strinfo0412;
+extern LCINFO NLSALLOC(0412) g_rglcinfo0412[];
+
+extern STRINFO_KTP NLSALLOC(0804) g_strinfo0804;
+extern LCINFO NLSALLOC(0804) g_rglcinfo0804[];
+#endif //OE_MAC
diff --git a/private/oleauto/src/dispatch/nlshelp.cpp b/private/oleauto/src/dispatch/nlshelp.cpp
new file mode 100644
index 000000000..82ac54323
--- /dev/null
+++ b/private/oleauto/src/dispatch/nlshelp.cpp
@@ -0,0 +1,276 @@
+/***
+*nlshelp.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+* This module implements Ansi NLS wrapper functions for WIN32
+*
+*Revision History:
+*
+* [00] 30-Jun-93 tomteng: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+ASSERTDATA
+
+#if OE_WIN32
+
+#if defined(_X86_) // only need this stuff if supporting Chicago
+
+// Chicago doesn't have these functions, hence we switch at run-time for speed
+// on Daytona.
+//---------------------------------------------------------------------
+// Unicode NLS Wrapper Functions (for Win32)
+//---------------------------------------------------------------------
+
+
+// REVIEW: The code page used in the MultiByteToWideChar & WideCharToMultByte
+// functions should really be the primary code page assoicated with
+// the inputed lcid instead of the default Ansi code page (CP_ACP).
+// Need to correct this.
+
+
+EXTERN_C INTERNAL_(int)
+CompareString(
+ LCID lcid,
+ unsigned long dwFlags,
+ LPWSTR lpwStr1, int cch1,
+ LPWSTR lpwStr2, int cch2)
+{
+ int iRet;
+ int cbStr1, cbStr2;
+ LPSTR lpStr1, lpStr2;
+ BOOL badConversion;
+
+ if (!g_fChicago) {
+ return CompareStringW(lcid, dwFlags, lpwStr1, cch1, lpwStr2, cch2);
+ }
+
+ iRet = 0;
+ lpStr1 = lpStr2 = NULL;
+ badConversion = FALSE;
+
+ // special case zero-length strings -- conversions below would screw up
+ // required behavior.
+
+ if (cch1 == 0) {
+ if (cch2 == 0)
+ return 2; // 1 == 2
+ else
+ return 1; // 1 < 2
+ } else if (cch2 == 0) {
+ return 3; // 1 > 2
+ }
+
+ cbStr1 = WideCharToMultiByte(CP_ACP, NULL, lpwStr1, cch1,
+ NULL, 0, NULL, &badConversion);
+ if (cbStr1 == 0 || badConversion)
+ goto LError0;
+
+ cbStr2 = WideCharToMultiByte(CP_ACP, NULL, lpwStr2, cch2,
+ NULL, 0, NULL, &badConversion);
+ if (cbStr2 == 0 || badConversion)
+ goto LError0;
+
+ if(DispAlloc(cbStr1, (VOID FAR* FAR*) &lpStr1) != NOERROR)
+ goto LError0;
+
+ if(DispAlloc(cbStr2, (VOID FAR* FAR*) &lpStr2) != NOERROR)
+ goto LError0;
+
+ WideCharToMultiByte(CP_ACP, NULL, lpwStr1, cch1,
+ lpStr1, cbStr1, NULL, &badConversion);
+ if (badConversion) // UNDONE: need to check the 2nd time?
+ goto LError0;
+
+ WideCharToMultiByte(CP_ACP, NULL, lpwStr2, cch2,
+ lpStr2, cbStr2, NULL, &badConversion);
+ if (badConversion) // UNDONE: need to check the 2nd time?
+ goto LError0;
+
+ iRet = CompareStringA(lcid, dwFlags, lpStr1, cbStr1, lpStr2, cbStr2);
+
+LError0:
+
+ DispFree(lpStr1);
+ DispFree(lpStr2);
+
+ return iRet;
+}
+
+
+EXTERN_C INTERNAL_(int)
+LCMapString(
+ LCID lcid,
+ unsigned long dwMapFlags,
+ const WCHAR FAR* lpwSrcStr,
+ int cchSrc,
+ WCHAR FAR* lpwDestStr,
+ int cchDest)
+{
+ BOOL badConversion;
+ LPSTR lpSrcStr, lpDestStr;
+ int iRet, cbSrcStr, cbDestStr;
+
+ if (!g_fChicago) {
+ return LCMapStringW(lcid, dwMapFlags,
+ lpwSrcStr, cchSrc,
+ lpwDestStr, cchDest);
+ }
+
+ iRet = 0;
+ badConversion = FALSE;
+ lpSrcStr = lpDestStr = NULL;
+
+ // Translate source string to ansi
+ cbSrcStr = WideCharToMultiByte(CP_ACP, NULL, lpwSrcStr, cchSrc,
+ NULL, 0, NULL, &badConversion);
+
+ // NOTE: a zero-length source string should fall out here & return 0
+ if (cbSrcStr == 0 || badConversion)
+ goto LError0;
+
+ if(DispAlloc(cbSrcStr, (VOID FAR* FAR*) &lpSrcStr) != NOERROR)
+ goto LError0;
+
+ WideCharToMultiByte(CP_ACP, NULL, lpwSrcStr, cchSrc,
+ lpSrcStr, cbSrcStr, NULL, &badConversion);
+ if (badConversion) // UNDONE: need to check the 2nd time?
+ goto LError0;
+
+ // Alloc Destination ANSI string space
+ if ((cbDestStr = LCMapStringA(lcid, dwMapFlags,
+ lpSrcStr, cbSrcStr, NULL, 0)) == 0)
+ goto LError0;
+
+ if(DispAlloc(cbDestStr, (VOID FAR* FAR*) &lpDestStr) != NOERROR)
+ goto LError0;
+
+ // Map characters
+ if ((iRet = LCMapStringA(lcid, dwMapFlags,
+ lpSrcStr, cbSrcStr,
+ lpDestStr, cbDestStr)) == 0)
+ goto LError0;
+
+ // Convert ansi character back to wide characters
+ if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ lpDestStr, cbDestStr, lpwDestStr, cchDest) == 0)
+ iRet = 0;
+
+LError0:;
+ DispFree(lpDestStr);
+ DispFree(lpSrcStr);
+ return iRet;
+}
+
+
+EXTERN_C INTERNAL_(int)
+GetStringTypeEx(
+ LCID Locale,
+ DWORD dwInfoType,
+ const WCHAR FAR* lpwSrcStr,
+ int cchSrc,
+ LPWORD lpCharType)
+{
+ BOOL badConversion;
+ #define MAX_BUFSIZE 512
+ char lpStr[MAX_BUFSIZE];
+ int result, cbSrcStr;
+
+ if (!g_fChicago) {
+ return(GetStringTypeExW(Locale, dwInfoType, lpwSrcStr, cchSrc, lpCharType));
+ }
+
+ result=0;
+ badConversion = FALSE;
+
+ // Translate source string to ansi
+ cbSrcStr = WideCharToMultiByte(CP_ACP, NULL, lpwSrcStr, cchSrc,
+ lpStr, MAX_BUFSIZE, NULL, &badConversion);
+
+ // NOTE: a zero-length source string should fall out here & return 0
+ if (cbSrcStr == 0 || badConversion)
+ goto LError0;
+
+ result = GetStringTypeExA(Locale, dwInfoType, lpStr, cbSrcStr, lpCharType);
+
+LError0:;
+ return result;
+
+} /* GetStringTypeEx */
+
+EXTERN_C INTERNAL_(int)
+GetLocaleInfo(
+ LCID lcid,
+ LCTYPE lcType,
+ WCHAR FAR* lpwStr,
+ int cch)
+{
+ #define MAX_BUFSIZE 512
+ char lpStr[MAX_BUFSIZE];
+ int result;
+
+ if (!g_fChicago) {
+ return GetLocaleInfoW(lcid, lcType, lpwStr, cch);
+ }
+
+ result = GetLocaleInfoA(lcid, lcType, lpStr, MAX_BUFSIZE);
+
+ if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ lpStr, -1, lpwStr, cch) == 0)
+ return 0;
+
+ return result;
+}
+
+EXTERN_C INTERNAL_(int)
+IsCharAlpha(WCHAR ch)
+{
+ char chA;
+ BOOL badConversion;
+
+ if (!g_fChicago) {
+ return IsCharAlphaW(ch);
+ }
+
+ badConversion = FALSE;
+
+ // Translate source char to ansi
+ WideCharToMultiByte(CP_ACP, NULL, &ch, 1, &chA, 1, NULL, &badConversion);
+ if (badConversion)
+ return 0;
+
+ return IsCharAlphaA(chA);
+}
+
+EXTERN_C INTERNAL_(int)
+IsCharAlphaNumeric(WCHAR ch)
+{
+ char chA;
+ BOOL badConversion;
+
+ if (!g_fChicago) {
+ return IsCharAlphaNumericW(ch);
+ }
+
+ badConversion = FALSE;
+
+ // Translate source char to ansi
+ WideCharToMultiByte(CP_ACP, NULL, &ch, 1, &chA, 1, NULL, &badConversion);
+ if (badConversion)
+ return 0;
+
+ return IsCharAlphaNumericA(chA);
+
+}
+
+#endif //_X86_
+
+#endif //OE_WIN32
diff --git a/private/oleauto/src/dispatch/nlsintrn.h b/private/oleauto/src/dispatch/nlsintrn.h
new file mode 100644
index 000000000..12af159f6
--- /dev/null
+++ b/private/oleauto/src/dispatch/nlsintrn.h
@@ -0,0 +1,409 @@
+/***
+*nlsintrn.h - National language support functions.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the layout of the NLS resource used by the
+* NLS functions.
+*
+*Revision History:
+*
+* [00] 12-Nov-92 petergo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef RC_INVOKED
+# pragma pack(1)
+#endif
+
+/***
+*types
+*
+***********************************************************************/
+
+typedef unsigned int ILCINFO; // index into rglcinfo array into header
+
+
+/***
+*constants
+*
+***********************************************************************/
+
+// Index 0 is unused
+#define ILCINFO_FIRST 1
+
+// maximum of the sequential LCTYPEs from olenls.h
+//
+#define LCTYPE_LAST LOCALE_INEGSEPBYSPACE
+#define LCTYPE_MAX LCTYPE_LAST+1
+
+#define ILCINFO_SENGCOUNTRY LCTYPE_LAST+1 // ILCINFO for LOCALE_SENGCOUNTRY
+#define ILCINFO_SENGLANGUAGE LCTYPE_LAST+2 // ILCINFO for LOCALE_SENGLANGUAGE
+
+#if VBA2
+#define ILCINFO_IFIRSTDAYOFWEEK LCTYPE_LAST+3
+#define ILCINFO_IFIRSTWEEKOFYEAR LCTYPE_LAST+4
+#define ILCINFO_IDEFAULTANSICODEPAGE LCTYPE_LAST+5
+#define ILCINFO_INEGNUMBER LCTYPE_LAST+6
+#define ILCINFO_STIMEFORMAT LCTYPE_LAST+7
+#define ILCINFO_ITIMEMARKPOSN LCTYPE_LAST+8
+#define ILCINFO_ICALENDARTYPE LCTYPE_LAST+9
+#define ILCINFO_IOPTIONALCALENDAR LCTYPE_LAST+10
+#define ILCINFO_SMONTHNAME13 LCTYPE_LAST+11
+#define ILCINFO_SABBREVMONTHNAME13 LCTYPE_LAST+12
+
+#define ILCINFO_LAST ILCINFO_SABBREVMONTHNAME13
+#else
+#define ILCINFO_LAST ILCINFO_SENGLANGUAGE
+#endif
+#define ILCINFO_MAX ILCINFO_LAST+1
+
+// A single item of locale info
+typedef struct tagLCINFO{
+ unsigned char cch;
+ BYTE FAR* prgb; // UNDONE: make NEAR, if possible!!!
+}LCINFO;
+
+
+// expansion table entry
+typedef struct tagEXPANSION{
+ WORD w1;
+ WORD w2;
+}EXPANSION;
+
+// digraph table entry
+typedef struct tagDIGRAPH{
+ WORD w;
+ union{
+ BYTE cEntries;
+ BYTE ch2;
+ }
+#if defined(NONAMELESSUNION) || (defined(_MAC) && !defined(__cplusplus) && !defined(_MSC_VER))
+ u
+#endif
+ ;
+}DIGRAPH;
+
+
+#if defined(NONAMELESSUNION) || (defined(_MAC) && !defined(__cplusplus) && !defined(_MSC_VER))
+# define D_UNION(X, Y) ((X)->u.Y)
+#else
+# define D_UNION(X, Y) ((X)->Y)
+#endif
+
+#define D_ENTRY(X) D_UNION(X, cEntries)
+#define D_CH(X) D_UNION(X, ch2)
+
+
+// The string info for a single locale
+//
+// (NOTE: the STRINFO struct for FE locales will be totally different
+// see nlsdbcs.h for the corresponding FE structs)
+//
+
+typedef struct tagSTRINFO
+{
+ BYTE FAR* prgbUCase;
+ BYTE FAR* prgbLCase;
+
+ WORD FAR* prgwCType12;
+ WORD FAR* prgwCType3;
+
+ WORD FAR* prgwSort;
+ EXPANSION FAR* prgexp;
+ DIGRAPH FAR* prgdig;
+
+ int fRevDW;
+
+} STRINFO;
+
+typedef struct tagNLSDATA {
+ LCID lcid;
+#if OE_MAC
+ int region; // mac region code
+#endif
+#if OE_WIN
+ LCINFO lcinfoICOUNTRY;
+ LCINFO lcinfoSABBREVLANGNAME;
+#endif
+#if OE_MAC
+ void (FAR* LoadNlsInfo) (LCINFO **, STRINFO **);
+#endif //OE_MAC
+ LCINFO FAR* prglcinfo;
+#if !OE_MAC // not needed for mac
+ STRINFO FAR* pstrinfo;
+#endif //!OE_MAC
+} NLSDATA;
+
+
+/*
+ * The sortweight WORD is organized as follows,
+ *
+ * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ * | X | S | CW | DW | AW |
+ * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ *
+ * AW = Alphanumeric Weight
+ * DW = Diacritic Weight
+ * CW = Case Weight
+ * S = Symbol Bit
+ * X = Special Weight Bit
+ *
+ */
+
+#define AWMASK 0x00FF // Alphanumeric Weight field
+#define AWSHIFT 0
+
+#define DWMASK 0x0700 // Diacritic Weight field
+#define DWSHIFT 8
+
+#define CWMASK 0x3800 // Case Weight field
+#define CWSHIFT 11
+
+#define SYMBOLBIT 0x4000
+#define SPECIALBIT 0x8000 // Indicates Alphanumeric Weight field contains
+ // the special weight
+
+
+//
+// The following AW values have special meaning
+//
+
+// The following marks an "unsortable" character - this is totaly
+// ignored in a string compare.
+#define AW_UNSORTABLE 0 // indicates character is unsortable
+
+// 1 is not used as a weight, it is used as the sort key field separator
+#define AW_DONTUSE 1
+
+#if 0 // these are now encoded in the entire AlphaNumeric weight
+ // field, using the 'SPECIALBIT' field as an indicator.
+// The following special weights mark "unsortable" characters
+// that nudge the string compare slightly
+#define AW_SW1 2 // special weight #1
+#define AW_SW2 3 // special weight #2
+#define AW_SW3 4 // special weight #3
+#define AW_MAXSW 4 // the max special weight
+#endif //0
+
+// the marks an expansion character
+#define AW_EXPANSION 5 // hi byte gives index into expansion table
+
+// this special weight marks the first char of a possible digraph sequence
+#define AW_DIGRAPH 6 // hi byte gives index into compression table
+
+#define AW_MAXSPECIAL 6 // max special AW value
+
+
+
+#if OE_WIN
+# define STRING(X) #X
+# define NLSALLOC(X) __based(__segname(STRING(NLS ## X ## _TEXT)))
+#else
+# define NLSALLOC(X)
+#endif
+
+#if defined(_MAC) && !defined(_PPCMAC)
+#define MACCS __declspec(allocate("_CODE"))
+#else //_MAC
+#define MACCS
+#endif //_MAC
+
+#if OE_MAC
+extern void LoadNlsInfo0403(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0405(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0406(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0407(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0408(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0409(LCINFO **, STRINFO **);
+extern void LoadNlsInfo040a(LCINFO **, STRINFO **);
+extern void LoadNlsInfo040b(LCINFO **, STRINFO **);
+extern void LoadNlsInfo040c(LCINFO **, STRINFO **);
+extern void LoadNlsInfo040e(LCINFO **, STRINFO **);
+extern void LoadNlsInfo040f(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0410(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0413(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0414(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0415(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0416(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0419(LCINFO **, STRINFO **);
+extern void LoadNlsInfo041b(LCINFO **, STRINFO **);
+extern void LoadNlsInfo041d(LCINFO **, STRINFO **);
+extern void LoadNlsInfo041f(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0807(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0809(LCINFO **, STRINFO **);
+extern void LoadNlsInfo080a(LCINFO **, STRINFO **);
+extern void LoadNlsInfo080c(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0810(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0813(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0814(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0816(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0c07(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0c09(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0c0a(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0c0c(LCINFO **, STRINFO **);
+extern void LoadNlsInfo1009(LCINFO **, STRINFO **);
+extern void LoadNlsInfo100c(LCINFO **, STRINFO **);
+extern void LoadNlsInfo1409(LCINFO **, STRINFO **);
+extern void LoadNlsInfo1809(LCINFO **, STRINFO **);
+// BIDI locales
+extern void LoadNlsInfo040d(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0401(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0801(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0c01(LCINFO **, STRINFO **);
+extern void LoadNlsInfo1001(LCINFO **, STRINFO **);
+extern void LoadNlsInfo1401(LCINFO **, STRINFO **);
+extern void LoadNlsInfo1801(LCINFO **, STRINFO **);
+extern void LoadNlsInfo1c01(LCINFO **, STRINFO **);
+extern void LoadNlsInfo2001(LCINFO **, STRINFO **);
+extern void LoadNlsInfo2401(LCINFO **, STRINFO **);
+extern void LoadNlsInfo2801(LCINFO **, STRINFO **);
+extern void LoadNlsInfo2c01(LCINFO **, STRINFO **);
+extern void LoadNlsInfo3001(LCINFO **, STRINFO **);
+extern void LoadNlsInfo3401(LCINFO **, STRINFO **);
+extern void LoadNlsInfo3801(LCINFO **, STRINFO **);
+extern void LoadNlsInfo3c01(LCINFO **, STRINFO **);
+extern void LoadNlsInfo4001(LCINFO **, STRINFO **);
+extern void LoadNlsInfo0429(LCINFO **, STRINFO **);
+
+#else //OE_MAC
+extern LCINFO NLSALLOC(0403) g_rglcinfo0403[];
+extern LCINFO NLSALLOC(0405) g_rglcinfo0405[];
+extern LCINFO NLSALLOC(0406) g_rglcinfo0406[];
+extern LCINFO NLSALLOC(0407) g_rglcinfo0407[];
+extern LCINFO NLSALLOC(0408) g_rglcinfo0408[];
+extern LCINFO NLSALLOC(0409) g_rglcinfo0409[];
+extern LCINFO NLSALLOC(040a) g_rglcinfo040a[];
+extern LCINFO NLSALLOC(040b) g_rglcinfo040b[];
+extern LCINFO NLSALLOC(040c) g_rglcinfo040c[];
+extern LCINFO NLSALLOC(040e) g_rglcinfo040e[];
+extern LCINFO NLSALLOC(040f) g_rglcinfo040f[];
+extern LCINFO NLSALLOC(0410) g_rglcinfo0410[];
+extern LCINFO NLSALLOC(0413) g_rglcinfo0413[];
+extern LCINFO NLSALLOC(0414) g_rglcinfo0414[];
+extern LCINFO NLSALLOC(0415) g_rglcinfo0415[];
+extern LCINFO NLSALLOC(0416) g_rglcinfo0416[];
+extern LCINFO NLSALLOC(0419) g_rglcinfo0419[];
+extern LCINFO NLSALLOC(041b) g_rglcinfo041b[];
+extern LCINFO NLSALLOC(041d) g_rglcinfo041d[];
+extern LCINFO NLSALLOC(041f) g_rglcinfo041f[];
+extern LCINFO NLSALLOC(0807) g_rglcinfo0807[];
+extern LCINFO NLSALLOC(0809) g_rglcinfo0809[];
+extern LCINFO NLSALLOC(080a) g_rglcinfo080a[];
+extern LCINFO NLSALLOC(080c) g_rglcinfo080c[];
+extern LCINFO NLSALLOC(0810) g_rglcinfo0810[];
+extern LCINFO NLSALLOC(0813) g_rglcinfo0813[];
+extern LCINFO NLSALLOC(0814) g_rglcinfo0814[];
+extern LCINFO NLSALLOC(0816) g_rglcinfo0816[];
+extern LCINFO NLSALLOC(0c07) g_rglcinfo0c07[];
+extern LCINFO NLSALLOC(0c09) g_rglcinfo0c09[];
+extern LCINFO NLSALLOC(0c0a) g_rglcinfo0c0a[];
+extern LCINFO NLSALLOC(0c0c) g_rglcinfo0c0c[];
+extern LCINFO NLSALLOC(1009) g_rglcinfo1009[];
+extern LCINFO NLSALLOC(100c) g_rglcinfo100c[];
+extern LCINFO NLSALLOC(1409) g_rglcinfo1409[];
+extern LCINFO NLSALLOC(1809) g_rglcinfo1809[];
+// BIDI locales
+extern LCINFO NLSALLOC(040d) g_rglcinfo040d[];
+extern LCINFO NLSALLOC(0401) g_rglcinfo0401[];
+extern LCINFO NLSALLOC(0801) g_rglcinfo0801[];
+extern LCINFO NLSALLOC(0c01) g_rglcinfo0c01[];
+extern LCINFO NLSALLOC(1001) g_rglcinfo1001[];
+extern LCINFO NLSALLOC(1401) g_rglcinfo1401[];
+extern LCINFO NLSALLOC(1801) g_rglcinfo1801[];
+extern LCINFO NLSALLOC(1c01) g_rglcinfo1c01[];
+extern LCINFO NLSALLOC(2001) g_rglcinfo2001[];
+extern LCINFO NLSALLOC(2401) g_rglcinfo2401[];
+extern LCINFO NLSALLOC(2801) g_rglcinfo2801[];
+extern LCINFO NLSALLOC(2c01) g_rglcinfo2c01[];
+extern LCINFO NLSALLOC(3001) g_rglcinfo3001[];
+extern LCINFO NLSALLOC(3401) g_rglcinfo3401[];
+extern LCINFO NLSALLOC(3801) g_rglcinfo3801[];
+extern LCINFO NLSALLOC(3c01) g_rglcinfo3c01[];
+extern LCINFO NLSALLOC(4001) g_rglcinfo4001[];
+extern LCINFO NLSALLOC(0429) g_rglcinfo0429[];
+
+
+extern STRINFO NLSALLOC(0403) g_strinfo0403;
+extern STRINFO NLSALLOC(0405) g_strinfo0405;
+extern STRINFO NLSALLOC(0406) g_strinfo0406;
+extern STRINFO NLSALLOC(0407) g_strinfo0407;
+extern STRINFO NLSALLOC(0408) g_strinfo0408;
+extern STRINFO NLSALLOC(0409) g_strinfo0409;
+extern STRINFO NLSALLOC(040a) g_strinfo040a;
+extern STRINFO NLSALLOC(040b) g_strinfo040b;
+extern STRINFO NLSALLOC(040c) g_strinfo040c;
+extern STRINFO NLSALLOC(040e) g_strinfo040e;
+extern STRINFO NLSALLOC(040f) g_strinfo040f;
+extern STRINFO NLSALLOC(0410) g_strinfo0410;
+extern STRINFO NLSALLOC(0413) g_strinfo0413;
+extern STRINFO NLSALLOC(0414) g_strinfo0414;
+extern STRINFO NLSALLOC(0415) g_strinfo0415;
+extern STRINFO NLSALLOC(0416) g_strinfo0416;
+extern STRINFO NLSALLOC(0419) g_strinfo0419;
+extern STRINFO NLSALLOC(041b) g_strinfo041b;
+extern STRINFO NLSALLOC(041d) g_strinfo041d;
+extern STRINFO NLSALLOC(041f) g_strinfo041f;
+extern STRINFO NLSALLOC(0807) g_strinfo0807;
+extern STRINFO NLSALLOC(0809) g_strinfo0809;
+extern STRINFO NLSALLOC(080a) g_strinfo080a;
+extern STRINFO NLSALLOC(080c) g_strinfo080c;
+extern STRINFO NLSALLOC(0810) g_strinfo0810;
+extern STRINFO NLSALLOC(0813) g_strinfo0813;
+extern STRINFO NLSALLOC(0814) g_strinfo0814;
+extern STRINFO NLSALLOC(0816) g_strinfo0816;
+extern STRINFO NLSALLOC(0c07) g_strinfo0c07;
+extern STRINFO NLSALLOC(0c09) g_strinfo0c09;
+extern STRINFO NLSALLOC(0c0a) g_strinfo0c0a;
+extern STRINFO NLSALLOC(0c0c) g_strinfo0c0c;
+extern STRINFO NLSALLOC(1009) g_strinfo1009;
+extern STRINFO NLSALLOC(100c) g_strinfo100c;
+extern STRINFO NLSALLOC(1409) g_strinfo1409;
+extern STRINFO NLSALLOC(1809) g_strinfo1809;
+// BIDI locales
+extern STRINFO NLSALLOC(040d) g_strinfo040d;
+extern STRINFO NLSALLOC(0401) g_strinfo0401;
+extern STRINFO NLSALLOC(0801) g_strinfo0801;
+extern STRINFO NLSALLOC(0c01) g_strinfo0c01;
+extern STRINFO NLSALLOC(1001) g_strinfo1001;
+extern STRINFO NLSALLOC(1401) g_strinfo1401;
+extern STRINFO NLSALLOC(1801) g_strinfo1801;
+extern STRINFO NLSALLOC(1c01) g_strinfo1c01;
+extern STRINFO NLSALLOC(2001) g_strinfo2001;
+extern STRINFO NLSALLOC(2401) g_strinfo2401;
+extern STRINFO NLSALLOC(2801) g_strinfo2801;
+extern STRINFO NLSALLOC(2c01) g_strinfo2c01;
+extern STRINFO NLSALLOC(3001) g_strinfo3001;
+extern STRINFO NLSALLOC(3401) g_strinfo3401;
+extern STRINFO NLSALLOC(3801) g_strinfo3801;
+extern STRINFO NLSALLOC(3c01) g_strinfo3c01;
+extern STRINFO NLSALLOC(4001) g_strinfo4001;
+extern STRINFO NLSALLOC(0429) g_strinfo0429;
+
+#endif //OE_MAC
+
+
+#ifndef RC_INVOKED
+# pragma pack()
+#endif
+
+extern int
+DefCompareStringA(
+ unsigned long,
+ const char FAR* pch1, int cch1,
+ const char FAR* pch2, int cch2);
+
+extern int
+ZeroTermNoIgnoreSym(
+ unsigned long,
+ const char FAR* pch1,
+ const char FAR* pch2);
+
+#if OE_WIN
+void NotifyNLSInfoChanged(void);
+#endif
diff --git a/private/oleauto/src/dispatch/oaglue.c b/private/oleauto/src/dispatch/oaglue.c
new file mode 100644
index 000000000..b1f16b733
--- /dev/null
+++ b/private/oleauto/src/dispatch/oaglue.c
@@ -0,0 +1,664 @@
+#ifndef _PPCMAC
+#include <ole2.h>
+#include "olenls.h"
+#include "dispatch.h"
+
+#include "oavtbl.h"
+
+extern oavtbl * poavtbl; // initialized by OLE
+#define RETURN(x) return x
+#define RETURNVOID(x) x
+#define RETURN_(typ, x) return x
+
+#else //!_PPCMAC
+
+#include "oaimp.h" // stubs for all the types (simplifies build)
+
+#define RETURN(x) return (HRESULT)0
+#define RETURNVOID(x)
+#define RETURN_(typ, x) return (typ)0
+#endif //!_PPCMAC
+
+
+//********************
+// Items from OLENLS.H
+//********************
+
+STDAPI_(int)
+CompareStringA(LCID lcid, unsigned long ul1, const char FAR* pch1, int i1, const char FAR* pch2, int i2) {
+ RETURN_(int, poavtbl->CompareStringA(lcid, ul1, pch1, i1, pch2, i2));
+}
+
+STDAPI_(int)
+LCMapStringA(LCID lcid, unsigned long ul1, const char FAR* pch1, int i1, char FAR* pch2, int i2) {
+ RETURN_(int, poavtbl->LCMapStringA(lcid, ul1, pch1, i1, pch2, i2));
+}
+
+STDAPI_(int)
+GetLocaleInfoA(LCID lcid, LCTYPE lctype, char FAR* pch1, int i1) {
+ RETURN_(int, poavtbl->GetLocaleInfoA(lcid, lctype, pch1, i1));
+}
+
+STDAPI_(int)
+GetStringTypeA(LCID lcid, unsigned long ul1, const char FAR* pch1, int i1, unsigned short FAR* pus1) {
+ RETURN_(int, poavtbl->GetStringTypeA(lcid, ul1, pch1, i1, pus1));
+}
+
+STDAPI_(LANGID)
+GetSystemDefaultLangID(void) {
+ RETURN_(LANGID, poavtbl->GetSystemDefaultLangID());
+}
+
+STDAPI_(LANGID)
+GetUserDefaultLangID(void) {
+ RETURN_(LANGID, poavtbl->GetUserDefaultLangID());
+}
+
+STDAPI_(LCID)
+GetSystemDefaultLCID(void) {
+ RETURN_(LCID, poavtbl->GetSystemDefaultLCID());
+}
+
+STDAPI_(LCID)
+GetUserDefaultLCID(void) {
+ RETURN_(LCID, poavtbl->GetUserDefaultLCID());
+}
+
+//**********************
+// Items from DISPATCH.H
+//**********************
+STDAPI_(BSTR)
+SysAllocString(const OLECHAR FAR* pch) {
+ RETURN_(BSTR, poavtbl->SysAllocString(pch));
+}
+STDAPI_(int)
+SysReAllocString(BSTR FAR* pbstr, const OLECHAR FAR* pch) {
+ RETURN_(int, poavtbl->SysReAllocString(pbstr, pch));
+}
+STDAPI_(BSTR)
+SysAllocStringLen(const OLECHAR FAR* pch, unsigned int cb) {
+ RETURN_(BSTR, poavtbl->SysAllocStringLen(pch, cb));
+}
+STDAPI_(int)
+SysReAllocStringLen(BSTR FAR* pbstr, const OLECHAR FAR* pch, unsigned int cb) {
+ RETURN_(int, poavtbl->SysReAllocStringLen(pbstr, pch, cb));
+}
+STDAPI_(void) SysFreeString(BSTR bstr) {
+ RETURNVOID(poavtbl->SysFreeString(bstr));
+}
+STDAPI_(unsigned int) SysStringLen(BSTR bstr) {
+ RETURN_(unsigned int, poavtbl->SysStringLen(bstr));
+}
+
+STDAPI_(int)
+DosDateTimeToVariantTime(
+ unsigned short wDosDate,
+ unsigned short wDosTime,
+ double FAR* pvtime) {
+ RETURN_(int, poavtbl->DosDateTimeToVariantTime(wDosDate, wDosTime, pvtime));
+}
+
+STDAPI_(int)
+VariantTimeToDosDateTime(
+ double vtime,
+ unsigned short FAR* pwDosDate,
+ unsigned short FAR* pwDosTime) {
+ RETURN_(int, poavtbl->VariantTimeToDosDateTime(vtime, pwDosDate, pwDosTime));
+}
+
+STDAPI
+SafeArrayAllocDescriptor(unsigned int cDims, SAFEARRAY FAR* FAR* ppsaOut) {
+ RETURN(poavtbl->SafeArrayAllocDescriptor(cDims, ppsaOut));
+}
+
+STDAPI SafeArrayAllocData(SAFEARRAY FAR* psa) {
+ RETURN(poavtbl->SafeArrayAllocData(psa));
+}
+
+STDAPI_(SAFEARRAY FAR*)
+SafeArrayCreate(VARTYPE vt, unsigned int cDims, SAFEARRAYBOUND FAR* rgsabound) {
+ RETURN_(SAFEARRAY FAR*, poavtbl->SafeArrayCreate(vt, cDims, rgsabound));
+}
+
+STDAPI SafeArrayDestroyDescriptor(SAFEARRAY FAR* psa) {
+ RETURN(poavtbl->SafeArrayDestroyDescriptor(psa));
+}
+
+STDAPI SafeArrayDestroyData(SAFEARRAY FAR* psa) {
+ RETURN(poavtbl->SafeArrayDestroyData(psa));
+}
+
+STDAPI SafeArrayDestroy(SAFEARRAY FAR* psa) {
+ RETURN(poavtbl->SafeArrayDestroy(psa));
+}
+
+STDAPI SafeArrayRedim(SAFEARRAY FAR* psa, SAFEARRAYBOUND FAR* psaboundNew) {
+ RETURN(poavtbl->SafeArrayRedim(psa, psaboundNew));
+}
+
+STDAPI_(unsigned int) SafeArrayGetDim(SAFEARRAY FAR* psa) {
+ RETURN_(unsigned int, poavtbl->SafeArrayGetDim(psa));
+}
+
+STDAPI_(unsigned int) SafeArrayGetElemsize(SAFEARRAY FAR* psa) {
+ RETURN_(unsigned int, poavtbl->SafeArrayGetElemsize(psa));
+}
+
+STDAPI
+SafeArrayGetUBound(SAFEARRAY FAR* psa, unsigned int nDim, long FAR* plUbound) {
+ RETURN(poavtbl->SafeArrayGetUBound(psa, nDim, plUbound));
+}
+
+STDAPI
+SafeArrayGetLBound(SAFEARRAY FAR* psa, unsigned int nDim, long FAR* plLbound) {
+ RETURN(poavtbl->SafeArrayGetLBound(psa, nDim, plLbound));
+}
+
+STDAPI SafeArrayLock(SAFEARRAY FAR* psa) {
+ RETURN(poavtbl->SafeArrayLock(psa));
+}
+
+STDAPI SafeArrayUnlock(SAFEARRAY FAR* psa) {
+ RETURN(poavtbl->SafeArrayUnlock(psa));
+}
+
+STDAPI SafeArrayAccessData(SAFEARRAY FAR* psa, void HUGEP* FAR* ppvData) {
+ RETURN(poavtbl->SafeArrayAccessData(psa, ppvData));
+}
+
+STDAPI SafeArrayUnaccessData(SAFEARRAY FAR* psa) {
+ RETURN(poavtbl->SafeArrayUnaccessData(psa));
+}
+
+STDAPI
+SafeArrayGetElement(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void FAR* pv) {
+ RETURN(poavtbl->SafeArrayGetElement(psa, rgIndices, pv));
+}
+
+STDAPI
+SafeArrayPutElement(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void FAR* pv) {
+ RETURN(poavtbl->SafeArrayPutElement(psa, rgIndices, pv));
+}
+
+STDAPI
+SafeArrayCopy(
+ SAFEARRAY FAR* psa,
+ SAFEARRAY FAR* FAR* ppsaOut) {
+ RETURN(poavtbl->SafeArrayCopy( psa, ppsaOut));
+}
+
+STDAPI
+SafeArrayPtrOfIndex(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void HUGEP* FAR* ppvData) {
+ RETURN(poavtbl->SafeArrayPtrOfIndex(psa, rgIndices, ppvData));
+}
+
+
+STDAPI_(void)
+VariantInit(VARIANTARG FAR* pvarg) {
+ RETURNVOID(poavtbl->VariantInit(pvarg));
+}
+
+STDAPI
+VariantClear(VARIANTARG FAR* pvarg) {
+ RETURN(poavtbl->VariantClear(pvarg));
+}
+
+STDAPI
+VariantCopy( VARIANTARG FAR* pvargDest, VARIANTARG FAR* pvargSrc) {
+ RETURN(poavtbl->VariantCopy(pvargDest, pvargSrc));
+}
+
+STDAPI
+VariantCopyInd( VARIANT FAR* pvarDest, VARIANTARG FAR* pvargSrc) {
+ RETURN(poavtbl->VariantCopyInd(pvarDest, pvargSrc));
+}
+
+STDAPI
+VariantChangeType(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvarSrc,
+ unsigned short wFlags,
+ VARTYPE vt) {
+ RETURN(poavtbl->VariantChangeType(pvargDest, pvarSrc, wFlags, vt));
+}
+
+STDAPI
+VariantChangeTypeEx(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvarSrc,
+ LCID lcid,
+ unsigned short wFlags,
+ VARTYPE vt) {
+ RETURN(poavtbl->VariantChangeTypeEx(pvargDest, pvarSrc, lcid, wFlags, vt));
+}
+
+STDAPI VarI2FromI4(long lIn, short FAR* psOut) {
+ RETURN(poavtbl->VarI2FromI4(lIn, psOut));
+}
+
+STDAPI VarI2FromR4(float fltIn, short FAR* psOut) {
+ RETURN(poavtbl->VarI2FromR4(fltIn, psOut));
+}
+
+STDAPI VarI2FromR8(double dblIn, short FAR* psOut) {
+ RETURN(poavtbl->VarI2FromR8(dblIn, psOut));
+}
+
+STDAPI VarI2FromCy(CY cyIn, short FAR* psOut) {
+ RETURN(poavtbl->VarI2FromCy(cyIn, psOut));
+}
+
+STDAPI VarI2FromDate(DATE dateIn, short FAR* psOut) {
+ RETURN(poavtbl->VarI2FromDate(dateIn, psOut));
+}
+
+STDAPI VarI2FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, short FAR* psOut) {
+ RETURN(poavtbl->VarI2FromStr(strIn, lcid, dwFlags, psOut));
+}
+
+STDAPI VarI2FromDisp(IDispatch FAR* pdispIn, LCID lcid, short FAR* psOut) {
+ RETURN(poavtbl->VarI2FromDisp(pdispIn, lcid, psOut));
+}
+
+STDAPI VarI2FromBool(VARIANT_BOOL boolIn, short FAR* psOut) {
+ RETURN(poavtbl->VarI2FromBool(boolIn, psOut));
+}
+
+
+STDAPI VarI4FromI2(short sIn, long FAR* plOut) {
+ RETURN(poavtbl->VarI4FromI2(sIn, plOut));
+}
+
+STDAPI VarI4FromR4(float fltIn, long FAR* plOut) {
+ RETURN(poavtbl->VarI4FromR4(fltIn, plOut));
+}
+
+STDAPI VarI4FromR8(double dblIn, long FAR* plOut) {
+ RETURN(poavtbl->VarI4FromR8(dblIn, plOut));
+}
+
+STDAPI VarI4FromCy(CY cyIn, long FAR* plOut) {
+ RETURN(poavtbl->VarI4FromCy(cyIn, plOut));
+}
+
+STDAPI VarI4FromDate(DATE dateIn, long FAR* plOut) {
+ RETURN(poavtbl->VarI4FromDate(dateIn, plOut));
+}
+
+STDAPI VarI4FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, long FAR* plOut) {
+ RETURN(poavtbl->VarI4FromStr(strIn, lcid, dwFlags, plOut));
+}
+
+STDAPI VarI4FromDisp(IDispatch FAR* pdispIn, LCID lcid, long FAR* plOut) {
+ RETURN(poavtbl->VarI4FromDisp(pdispIn, lcid, plOut));
+}
+
+STDAPI VarI4FromBool(VARIANT_BOOL boolIn, long FAR* plOut) {
+ RETURN(poavtbl->VarI4FromBool(boolIn, plOut));
+}
+
+
+STDAPI VarR4FromI2(short sIn, float FAR* pfltOut) {
+ RETURN(poavtbl->VarR4FromI2(sIn, pfltOut));
+}
+
+STDAPI VarR4FromI4(long lIn, float FAR* pfltOut) {
+ RETURN(poavtbl->VarR4FromI4(lIn, pfltOut));
+}
+
+STDAPI VarR4FromR8(double dblIn, float FAR* pfltOut) {
+ RETURN(poavtbl->VarR4FromR8(dblIn, pfltOut));
+}
+
+STDAPI VarR4FromCy(CY cyIn, float FAR* pfltOut) {
+ RETURN(poavtbl->VarR4FromCy(cyIn, pfltOut));
+}
+
+STDAPI VarR4FromDate(DATE dateIn, float FAR* pfltOut) {
+ RETURN(poavtbl->VarR4FromDate(dateIn, pfltOut));
+}
+
+STDAPI VarR4FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, float FAR* pfltOut) {
+ RETURN(poavtbl->VarR4FromStr(strIn, lcid, dwFlags, pfltOut));
+}
+
+STDAPI VarR4FromDisp(IDispatch FAR* pdispIn, LCID lcid, float FAR* pfltOut) {
+ RETURN(poavtbl->VarR4FromDisp(pdispIn, lcid, pfltOut));
+}
+
+STDAPI VarR4FromBool(VARIANT_BOOL boolIn, float FAR* pfltOut) {
+ RETURN(poavtbl->VarR4FromBool(boolIn, pfltOut));
+}
+
+
+STDAPI VarR8FromI2(short sIn, double FAR* pdblOut) {
+ RETURN(poavtbl->VarR8FromI2(sIn, pdblOut));
+}
+
+STDAPI VarR8FromI4(long lIn, double FAR* pdblOut) {
+ RETURN(poavtbl->VarR8FromI4(lIn, pdblOut));
+}
+
+STDAPI VarR8FromR4(float fltIn, double FAR* pdblOut) {
+ RETURN(poavtbl->VarR8FromR4(fltIn, pdblOut));
+}
+
+STDAPI VarR8FromCy(CY cyIn, double FAR* pdblOut) {
+ RETURN(poavtbl->VarR8FromCy(cyIn, pdblOut));
+}
+
+STDAPI VarR8FromDate(DATE dateIn, double FAR* pdblOut) {
+ RETURN(poavtbl->VarR8FromDate(dateIn, pdblOut));
+}
+
+STDAPI VarR8FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, double FAR* pdblOut) {
+ RETURN(poavtbl->VarR8FromStr(strIn, lcid, dwFlags, pdblOut));
+}
+
+STDAPI VarR8FromDisp(IDispatch FAR* pdispIn, LCID lcid, double FAR* pdblOut) {
+ RETURN(poavtbl->VarR8FromDisp(pdispIn, lcid, pdblOut));
+}
+
+STDAPI VarR8FromBool(VARIANT_BOOL boolIn, double FAR* pdblOut) {
+ RETURN(poavtbl->VarR8FromBool(boolIn, pdblOut));
+}
+
+
+STDAPI VarDateFromI2(short sIn, DATE FAR* pdateOut) {
+ RETURN(poavtbl->VarDateFromI2(sIn, pdateOut));
+}
+
+STDAPI VarDateFromI4(long lIn, DATE FAR* pdateOut) {
+ RETURN(poavtbl->VarDateFromI4(lIn, pdateOut));
+}
+
+STDAPI VarDateFromR4(float fltIn, DATE FAR* pdateOut) {
+ RETURN(poavtbl->VarDateFromR4(fltIn, pdateOut));
+}
+
+STDAPI VarDateFromR8(double dblIn, DATE FAR* pdateOut) {
+ RETURN(poavtbl->VarDateFromR8(dblIn, pdateOut));
+}
+
+STDAPI VarDateFromCy(CY cyIn, DATE FAR* pdateOut) {
+ RETURN(poavtbl->VarDateFromCy(cyIn, pdateOut));
+}
+
+STDAPI VarDateFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, DATE FAR* pdateOut) {
+ RETURN(poavtbl->VarDateFromStr(strIn, lcid, dwFlags, pdateOut));
+}
+
+STDAPI VarDateFromDisp(IDispatch FAR* pdispIn, LCID lcid, DATE FAR* pdateOut) {
+ RETURN(poavtbl->VarDateFromDisp(pdispIn, lcid, pdateOut));
+}
+
+STDAPI VarDateFromBool(VARIANT_BOOL boolIn, DATE FAR* pdateOut) {
+ RETURN(poavtbl->VarDateFromBool(boolIn, pdateOut));
+}
+
+
+STDAPI VarCyFromI2(short sIn, CY FAR* pcyOut) {
+ RETURN(poavtbl->VarCyFromI2(sIn, pcyOut));
+}
+
+STDAPI VarCyFromI4(long lIn, CY FAR* pcyOut) {
+ RETURN(poavtbl->VarCyFromI4(lIn, pcyOut));
+}
+
+STDAPI VarCyFromR4(float fltIn, CY FAR* pcyOut) {
+ RETURN(poavtbl->VarCyFromR4(fltIn, pcyOut));
+}
+
+STDAPI VarCyFromR8(double dblIn, CY FAR* pcyOut) {
+ RETURN(poavtbl->VarCyFromR8(dblIn, pcyOut));
+}
+
+STDAPI VarCyFromDate(DATE dateIn, CY FAR* pcyOut) {
+ RETURN(poavtbl->VarCyFromDate(dateIn, pcyOut));
+}
+
+STDAPI VarCyFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, CY FAR* pcyOut) {
+ RETURN(poavtbl->VarCyFromStr(strIn, lcid, dwFlags, pcyOut));
+}
+
+STDAPI VarCyFromDisp(IDispatch FAR* pdispIn, LCID lcid, CY FAR* pcyOut) {
+ RETURN(poavtbl->VarCyFromDisp(pdispIn, lcid, pcyOut));
+}
+
+STDAPI VarCyFromBool(VARIANT_BOOL boolIn, CY FAR* pcyOut) {
+ RETURN(poavtbl->VarCyFromBool(boolIn, pcyOut));
+}
+
+
+STDAPI VarBstrFromI2(short iVal, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut) {
+ RETURN(poavtbl->VarBstrFromI2(iVal, lcid, dwFlags, pbstrOut));
+}
+
+STDAPI VarBstrFromI4(long lIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut) {
+ RETURN(poavtbl->VarBstrFromI4(lIn, lcid, dwFlags, pbstrOut));
+}
+
+STDAPI VarBstrFromR4(float fltIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut) {
+ RETURN(poavtbl->VarBstrFromR4(fltIn, lcid, dwFlags, pbstrOut));
+}
+
+STDAPI VarBstrFromR8(double dblIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut) {
+ RETURN(poavtbl->VarBstrFromR8(dblIn, lcid, dwFlags, pbstrOut));
+}
+
+STDAPI VarBstrFromCy(CY cyIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut) {
+ RETURN(poavtbl->VarBstrFromCy(cyIn, lcid, dwFlags, pbstrOut));
+}
+
+STDAPI VarBstrFromDate(DATE dateIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut) {
+ RETURN(poavtbl->VarBstrFromDate(dateIn, lcid, dwFlags, pbstrOut));
+}
+
+STDAPI VarBstrFromDisp(IDispatch FAR* pdispIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut) {
+ RETURN(poavtbl->VarBstrFromDisp(pdispIn, lcid, dwFlags, pbstrOut));
+}
+
+STDAPI VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut) {
+ RETURN(poavtbl->VarBstrFromBool(boolIn, lcid, dwFlags, pbstrOut));
+}
+
+
+STDAPI VarBoolFromI2(short sIn, VARIANT_BOOL FAR* pboolOut) {
+ RETURN(poavtbl->VarBoolFromI2(sIn, pboolOut));
+}
+
+STDAPI VarBoolFromI4(long lIn, VARIANT_BOOL FAR* pboolOut) {
+ RETURN(poavtbl->VarBoolFromI4(lIn, pboolOut));
+}
+
+STDAPI VarBoolFromR4(float fltIn, VARIANT_BOOL FAR* pboolOut) {
+ RETURN(poavtbl->VarBoolFromR4(fltIn, pboolOut));
+}
+
+STDAPI VarBoolFromR8(double dblIn, VARIANT_BOOL FAR* pboolOut) {
+ RETURN(poavtbl->VarBoolFromR8(dblIn, pboolOut));
+}
+
+STDAPI VarBoolFromDate(DATE dateIn, VARIANT_BOOL FAR* pboolOut) {
+ RETURN(poavtbl->VarBoolFromDate(dateIn, pboolOut));
+}
+
+STDAPI VarBoolFromCy(CY cyIn, VARIANT_BOOL FAR* pboolOut) {
+ RETURN(poavtbl->VarBoolFromCy(cyIn, pboolOut));
+}
+
+STDAPI VarBoolFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, VARIANT_BOOL FAR* pboolOut) {
+ RETURN(poavtbl->VarBoolFromStr(strIn, lcid, dwFlags, pboolOut));
+}
+
+STDAPI VarBoolFromDisp(IDispatch FAR* pdispIn, LCID lcid, VARIANT_BOOL FAR* pboolOut) {
+ RETURN(poavtbl->VarBoolFromDisp(pdispIn, lcid, pboolOut));
+}
+
+
+STDAPI MPWVarFromR4(float FAR* pfltIn, VARIANT FAR* pvarOut) {
+ RETURN(poavtbl->MPWVarFromR4(pfltIn, pvarOut));
+}
+
+STDAPI MPWVarFromR8(double FAR* pdblIn, VARIANT FAR* pvarOut) {
+ RETURN(poavtbl->MPWVarFromR8(pdblIn, pvarOut));
+}
+
+STDAPI MPWR4FromVar(VARIANT FAR* pvarIn, float FAR* pfltOut) {
+ RETURN(poavtbl->MPWR4FromVar(pvarIn, pfltOut));
+}
+
+STDAPI MPWR8FromVar(VARIANT FAR* pvarIn, double FAR* pdblOut) {
+ RETURN(poavtbl->MPWR8FromVar(pvarIn, pdblOut));
+}
+
+
+STDAPI_(unsigned long)
+LHashValOfNameSys(SYSKIND syskind, LCID lcid, OLECHAR FAR* szName) {
+ RETURN_(unsigned long, poavtbl->LHashValOfNameSys(syskind, lcid, szName));
+}
+
+
+STDAPI
+LoadTypeLib(OLECHAR FAR* szFile, ITypeLib FAR* FAR* pptlib) {
+ RETURN(poavtbl->LoadTypeLib(szFile, pptlib));
+}
+
+STDAPI
+LoadRegTypeLib(
+ REFGUID rguid,
+ unsigned short wVerMajor,
+ unsigned short wVerMinor,
+ LCID lcid,
+ ITypeLib FAR* FAR* pptlib) {
+ RETURN(poavtbl->LoadRegTypeLib(rguid, wVerMajor, wVerMinor, lcid, pptlib));
+}
+
+STDAPI
+QueryPathOfRegTypeLib(
+ REFGUID guid,
+ unsigned short wMaj,
+ unsigned short wMin,
+ LCID lcid,
+ LPBSTR lpbstrPathName) {
+ RETURN(poavtbl->QueryPathOfRegTypeLib(guid, wMaj, wMin, lcid, lpbstrPathName));
+}
+
+STDAPI
+RegisterTypeLib(
+ ITypeLib FAR* ptlib,
+ OLECHAR FAR* szFullPath,
+ OLECHAR FAR* szHelpDir) {
+ RETURN(poavtbl->RegisterTypeLib(ptlib, szFullPath, szHelpDir));
+}
+
+STDAPI
+CreateTypeLib(SYSKIND syskind, OLECHAR FAR* szFile, ICreateTypeLib FAR* FAR* ppctlib) {
+ RETURN(poavtbl->CreateTypeLib(syskind, szFile, ppctlib));
+}
+
+STDAPI
+LoadTypeLibFSp(const FSSpec *pfsspec, ITypeLib FAR* FAR* pptlib) {
+ RETURN(poavtbl->LoadTypeLibFSp(pfsspec, pptlib));
+}
+
+STDAPI
+RegisterTypeLibFolder(OLECHAR FAR* szFullPath) {
+ RETURN(poavtbl->RegisterTypeLibFolder(szFullPath));
+}
+
+STDAPI
+QueryTypeLibFolder(LPBSTR pbstr) {
+ RETURN(poavtbl->QueryTypeLibFolder(pbstr));
+}
+
+
+STDAPI
+DispGetParam(
+ DISPPARAMS FAR* pdispparams,
+ unsigned int position,
+ VARTYPE vtTarg,
+ VARIANT FAR* pvarResult,
+ unsigned int FAR* puArgErr) {
+ RETURN(poavtbl->DispGetParam(pdispparams, position, vtTarg, pvarResult, puArgErr));
+}
+
+STDAPI
+DispGetIDsOfNames(
+ ITypeInfo FAR* ptinfo,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ DISPID FAR* rgdispid) {
+ RETURN(poavtbl->DispGetIDsOfNames(ptinfo, rgszNames, cNames, rgdispid));
+}
+
+STDAPI
+DispInvoke(
+ void FAR* _this,
+ ITypeInfo FAR* ptinfo,
+ DISPID dispidMember,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr) {
+ RETURN(poavtbl->DispInvoke(_this, ptinfo, dispidMember, wFlags, pparams,
+ pvarResult, pexcepinfo, puArgErr));
+}
+
+STDAPI
+CreateDispTypeInfo(
+ INTERFACEDATA FAR* pidata,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo) {
+ RETURN(poavtbl->CreateDispTypeInfo(pidata, lcid, pptinfo));
+}
+
+STDAPI
+CreateStdDispatch(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* ppunkStdDisp) {
+ RETURN(poavtbl->CreateStdDispatch(punkOuter, pvThis, ptinfo, ppunkStdDisp));
+}
+
+STDAPI
+RegisterActiveObject(
+ IUnknown FAR* punk,
+ REFCLSID rclsid,
+ void FAR* pvReserved,
+ unsigned long FAR* pdwRegister) {
+ RETURN(poavtbl->RegisterActiveObject(punk, rclsid, pvReserved, pdwRegister));
+}
+
+STDAPI
+RevokeActiveObject(
+ unsigned long dwRegister,
+ void FAR* pvReserved) {
+ RETURN(poavtbl->RevokeActiveObject(dwRegister, pvReserved));
+}
+
+STDAPI
+GetActiveObject(
+ REFCLSID rclsid,
+ void FAR* pvReserved,
+ IUnknown FAR* FAR* ppunk) {
+ RETURN(poavtbl->GetActiveObject(rclsid, pvReserved, ppunk));
+}
+
+#ifdef _PPCMAC
+// UNDONE: fix these right!!
+STDAPI DllGetClassObject(void) { return (HRESULT)0; };
+STDAPI_(void) IID_IDispatch(void) { return; };
+STDAPI_(void) IID_IEnumVARIANT(void) { return; };
+#endif
diff --git a/private/oleauto/src/dispatch/oaglue.v b/private/oleauto/src/dispatch/oaglue.v
new file mode 100644
index 000000000..416d94978
--- /dev/null
+++ b/private/oleauto/src/dispatch/oaglue.v
@@ -0,0 +1,126 @@
+CompareStringA
+LCMapStringA
+GetLocaleInfoA
+GetStringTypeA
+GetSystemDefaultLangID
+GetUserDefaultLangID
+GetSystemDefaultLCID
+GetUserDefaultLCID
+SysAllocString
+SysReAllocString
+SysAllocStringLen
+SysReAllocStringLen
+SysFreeString
+SysStringLen
+DosDateTimeToVariantTime
+VariantTimeToDosDateTime
+SafeArrayAllocDescriptor
+SafeArrayAllocData
+SafeArrayCreate
+SafeArrayDestroyDescriptor
+SafeArrayDestroyData
+SafeArrayDestroy
+SafeArrayRedim
+SafeArrayGetDim
+SafeArrayGetElemsize
+SafeArrayGetUBound
+SafeArrayGetLBound
+SafeArrayLock
+SafeArrayUnlock
+SafeArrayAccessData
+SafeArrayUnaccessData
+SafeArrayGetElement
+SafeArrayPutElement
+SafeArrayCopy
+SafeArrayPtrOfIndex
+VariantInit
+VariantClear
+VariantCopy
+VariantCopyInd
+VariantChangeType
+VariantChangeTypeEx
+VarI2FromI4
+VarI2FromR4
+VarI2FromR8
+VarI2FromCy
+VarI2FromDate
+VarI2FromStr
+VarI2FromDisp
+VarI2FromBool
+VarI4FromI2
+VarI4FromR4
+VarI4FromR8
+VarI4FromCy
+VarI4FromDate
+VarI4FromStr
+VarI4FromDisp
+VarI4FromBool
+VarR4FromI2
+VarR4FromI4
+VarR4FromR8
+VarR4FromCy
+VarR4FromDate
+VarR4FromStr
+VarR4FromDisp
+VarR4FromBool
+VarR8FromI2
+VarR8FromI4
+VarR8FromR4
+VarR8FromCy
+VarR8FromDate
+VarR8FromStr
+VarR8FromDisp
+VarR8FromBool
+VarDateFromI2
+VarDateFromI4
+VarDateFromR4
+VarDateFromR8
+VarDateFromCy
+VarDateFromStr
+VarDateFromDisp
+VarDateFromBool
+VarCyFromI2
+VarCyFromI4
+VarCyFromR4
+VarCyFromR8
+VarCyFromDate
+VarCyFromStr
+VarCyFromDisp
+VarCyFromBool
+VarBstrFromI2
+VarBstrFromI4
+VarBstrFromR4
+VarBstrFromR8
+VarBstrFromCy
+VarBstrFromDate
+VarBstrFromDisp
+VarBstrFromBool
+VarBoolFromI2
+VarBoolFromI4
+VarBoolFromR4
+VarBoolFromR8
+VarBoolFromDate
+VarBoolFromCy
+VarBoolFromStr
+VarBoolFromDisp
+MPWVarFromR4
+MPWVarFromR8
+MPWR4FromVar
+MPWR8FromVar
+LHashValOfNameSys
+LoadTypeLib
+LoadRegTypeLib
+QueryPathOfRegTypeLib
+RegisterTypeLib
+CreateTypeLib
+LoadTypeLibFSp
+RegisterTypeLibFolder
+QueryTypeLibFolder
+DispGetParam
+DispGetIDsOfNames
+DispInvoke
+CreateDispTypeInfo
+CreateStdDispatch
+RegisterActiveObject
+RevokeActiveObject
+GetActiveObject
diff --git a/private/oleauto/src/dispatch/oaimp.h b/private/oleauto/src/dispatch/oaimp.h
new file mode 100644
index 000000000..ff8294792
--- /dev/null
+++ b/private/oleauto/src/dispatch/oaimp.h
@@ -0,0 +1,164 @@
+/* ===========================================================================
+ = File: OLE2Impl.h
+ =
+ = Description: Header needed to build the MPW OLE2 Import library for
+ = the OLE2.02 CFM DLL
+ =
+ = Copyright: © 1994 Microsoft corporation Inc., All rights reserved
+ =========================================================================== */
+
+#ifndef __OLE2IMPL_H
+#define __OLE2IMPL_H
+
+#include "types.h"
+#include "fragload.h"
+#include "files.h"
+
+#ifdef __cplusplus
+ #define EXTERN_C extern "C"
+#else
+ #define EXTERN_C extern
+#endif
+
+#define STDAPI EXTERN_C HRESULT
+#define STDAPI_(type) EXTERN_C type
+
+#define RETURN_VALUE(type) return (type)0
+#define RETURN_VALUE_VOID return
+
+#define HRESULT void*
+#define OLEREG_HKEY long
+#define OLELONG long
+#define OLEREGSTATUS long
+#define OLEREG_VALUE char*
+#define OLEREG_ORDER long
+#define LPCSTR char*
+#define ATOM unsigned short
+#define WORD unsigned short
+#define LPSTR char*
+#define DWORD unsigned long
+#define PTR char*
+#define LONG long
+#define HKEY unsigned long
+#define HINSTANCE ConnectionID
+#define UINT unsigned int
+#define REFIID void*
+#define BYTE unsigned char
+#define ULONG unsigned long
+#define LPMALLOC void*
+#define REFCLSID void*
+#define LPUNKNOWN void*
+#define LPDWORD unsigned long*
+#define LPVOID void*
+#define LPSTREAM void*
+#define REFGUID void*
+#define LPCLSID void*
+#define SCODE long
+#define LPMESSAGEFILTER void*
+#define LPCLSID void*
+#define LPMARSHAL void*
+#define LPIID void*
+#define LPFILETIME void*
+#define OID long
+#define LPIStubManager void*
+#define LPILrpc void*
+#define LPFNI void*
+#define HWND void*
+#define LPTASK void*
+#define LPETASK void*
+#define HTASK long
+#define SHREG void*
+#define LPCALLINFO void*
+#define ProcessSerialNumberPtr void*
+#define LPINTERFACEINFO void*
+#define LPAppleEvent void*
+#define LPSTORAGE void*
+#define LPILockBytes void*
+#define SNB void*
+#define ScriptCode short
+#define LPDATAOBJECT void*
+#define LPOLECLIENTSITE void*
+#define LPFORMATETC void*
+#define LPMONIKER void*
+#define LPPERSISTSTORAGE void*
+#define LPOLEOBJECT void*
+#define LPBC void*
+#define LPRUNNINGOBJECTTABLE void*
+#define LPIMALLOC void*
+#define LPSTGMEDIUM void*
+#define LPDROPTARGET void*
+#define LPDROPSOURCE void*
+#define LPOLEADVISEHOLDER void*
+#define LPDATAADVISEHOLDER void*
+#define CLIPFORMAT ResType
+#define LPLOCKBYTES void*
+#define HGLOBAL Handle
+#define LPCRECT void*
+#define HDC void*
+#define LPCLASSFACTORY void*
+#define LPOLESTREAM void*
+#define LPDVTARGETDEVICE void*
+#define LPOLEOBJECT void*
+#define LPOLEINPLACEFRAME void*
+#define LPMSG void*
+#define LPENUMOLEVERB void*
+#define LPEVENTRECORD void*
+#define LPOLEINPLACEFRAMEINFO void*
+#define WindowPtr void*
+#define OleMBarHandle Handle
+#define MenuHandle Handle
+#define RgnHandle Handle
+#define Point void*
+#define ProcPtr void*
+#define BOOL unsigned long
+#define CursPtr void*
+#define PicHandle Handle
+#define LPOleIconSource void*
+#define GrafPtr void*
+#define HMODULE ConnectionID
+#define LPGUID void*
+#define LPPERSISTSTREAM void*
+#define LPENUMFORMATETC void*
+
+// stuff from olenls.h
+#define FAR
+#define HUGEP
+typedef unsigned long LCID;
+typedef unsigned short LANGID;
+typedef unsigned long LCTYPE;
+
+// stuff from variant.h
+typedef char OLECHAR;
+typedef OLECHAR FAR* LPOLESTR;
+typedef const OLECHAR FAR* LPCOLESTR;
+typedef unsigned short VARTYPE;
+#define VARIANTARG void
+#define VARIANT_BOOL short
+
+// stuff from dispatch.h
+typedef OLECHAR FAR* BSTR;
+typedef BSTR FAR* LPBSTR;
+#define SAFEARRAY void
+#define SAFEARRAYBOUND void
+#define CY double // close...
+#define DATE double
+#define SYSKIND int
+#define DISPID unsigned long
+
+#define IDispatch void
+#define IEnumVARIANT void
+#define ITypeInfo void
+#define ICreateTypeInfo void
+#define ITypeLib void
+#define ICreateTypeLib void
+#define ITypeComp void
+#define IUnknown void
+
+// bogus ones
+#define VARIANT void
+#define DISPPARAMS void
+#define EXCEPINFO void
+#define INTERFACEDATA void
+
+#endif // __OLE2IMPL_H
+
diff --git a/private/oleauto/src/dispatch/oaimp.mak b/private/oleauto/src/dispatch/oaimp.mak
new file mode 100644
index 000000000..040619a27
--- /dev/null
+++ b/private/oleauto/src/dispatch/oaimp.mak
@@ -0,0 +1,172 @@
+# ===============================================================================
+# = File: OaImp.make
+# =
+# = Description: This file is an MPW makefile that builds an XCOFF import
+# = library for the OLE 2.02 Shared Library
+# =
+# = History: 07/7/94 dtf Created
+# ===============================================================================
+
+# -------------------------------------------------------------------------------
+# - Variables
+# -------------------------------------------------------------------------------
+
+LibName = MicrosoftOLE2AutomationLib
+LibType = 'shlb'
+LibCreator = 'cfmg'
+LibObjects = OaImp.c.o
+LibHeader = OaImp.h
+LibSource = Oaglue.c
+
+LibExports = ¶
+ -export DllGetClassObject ¶
+ -export SysAllocString ¶
+ -export SysReAllocString ¶
+ -export SysAllocStringLen ¶
+ -export SysReAllocStringLen ¶
+ -export SysFreeString ¶
+ -export SysStringLen ¶
+ -export VariantInit ¶
+ -export VariantClear ¶
+ -export VariantCopy ¶
+ -export VariantCopyInd ¶
+ -export VariantChangeType ¶
+ -export VariantTimeToDosDateTime ¶
+ -export DosDateTimeToVariantTime ¶
+ -export SafeArrayCreate ¶
+ -export SafeArrayDestroy ¶
+ -export SafeArrayGetDim ¶
+ -export SafeArrayGetElemsize ¶
+ -export SafeArrayGetUBound ¶
+ -export SafeArrayGetLBound ¶
+ -export SafeArrayLock ¶
+ -export SafeArrayUnlock ¶
+ -export SafeArrayAccessData ¶
+ -export SafeArrayUnaccessData ¶
+ -export SafeArrayGetElement ¶
+ -export SafeArrayPutElement ¶
+ -export SafeArrayCopy ¶
+ -export DispGetParam ¶
+ -export DispGetIDsOfNames ¶
+ -export DispInvoke ¶
+ -export CreateDispTypeInfo ¶
+ -export CreateStdDispatch ¶
+ -export RegisterActiveObject ¶
+ -export RevokeActiveObject ¶
+ -export GetActiveObject ¶
+ -export SafeArrayAllocDescriptor ¶
+ -export SafeArrayAllocData ¶
+ -export SafeArrayDestroyDescriptor ¶
+ -export SafeArrayDestroyData ¶
+ -export SafeArrayRedim ¶
+ -export VarI2FromI4 ¶
+ -export VarI2FromR4 ¶
+ -export VarI2FromR8 ¶
+ -export VarI2FromCy ¶
+ -export VarI2FromDate ¶
+ -export VarI2FromStr ¶
+ -export VarI2FromDisp ¶
+ -export VarI2FromBool ¶
+ -export VarI4FromI2 ¶
+ -export VarI4FromR4 ¶
+ -export VarI4FromR8 ¶
+ -export VarI4FromCy ¶
+ -export VarI4FromDate ¶
+ -export VarI4FromStr ¶
+ -export VarI4FromDisp ¶
+ -export VarI4FromBool ¶
+ -export VarR4FromI2 ¶
+ -export VarR4FromI4 ¶
+ -export VarR4FromR8 ¶
+ -export VarR4FromCy ¶
+ -export VarR4FromDate ¶
+ -export VarR4FromStr ¶
+ -export VarR4FromDisp ¶
+ -export VarR4FromBool ¶
+ -export VarR8FromI2 ¶
+ -export VarR8FromI4 ¶
+ -export VarR8FromR4 ¶
+ -export VarR8FromCy ¶
+ -export VarR8FromDate ¶
+ -export VarR8FromStr ¶
+ -export VarR8FromDisp ¶
+ -export VarR8FromBool ¶
+ -export VarDateFromI2 ¶
+ -export VarDateFromI4 ¶
+ -export VarDateFromR4 ¶
+ -export VarDateFromR8 ¶
+ -export VarDateFromCy ¶
+ -export VarDateFromStr ¶
+ -export VarDateFromDisp ¶
+ -export VarDateFromBool ¶
+ -export VarCyFromI2 ¶
+ -export VarCyFromI4 ¶
+ -export VarCyFromR4 ¶
+ -export VarCyFromR8 ¶
+ -export VarCyFromDate ¶
+ -export VarCyFromStr ¶
+ -export VarCyFromDisp ¶
+ -export VarCyFromBool ¶
+ -export VarBstrFromI2 ¶
+ -export VarBstrFromI4 ¶
+ -export VarBstrFromR4 ¶
+ -export VarBstrFromR8 ¶
+ -export VarBstrFromCy ¶
+ -export VarBstrFromDate ¶
+ -export VarBstrFromDisp ¶
+ -export VarBstrFromBool ¶
+ -export VarBoolFromI2 ¶
+ -export VarBoolFromI4 ¶
+ -export VarBoolFromR4 ¶
+ -export VarBoolFromR8 ¶
+ -export VarBoolFromDate ¶
+ -export VarBoolFromCy ¶
+ -export VarBoolFromStr ¶
+ -export VarBoolFromDisp ¶
+ -export IID_IDispatch ¶
+ -export IID_IEnumVARIANT ¶
+ -export VariantChangeTypeEx ¶
+ -export SafeArrayPtrOfIndex ¶
+ -export CreateTypeLib ¶
+ -export LoadTypeLib ¶
+ -export LoadRegTypeLib ¶
+ -export RegisterTypeLib ¶
+ -export QueryPathOfRegTypeLib ¶
+ -export LHashValOfNameSys ¶
+ -export LoadTypeLibFSp ¶
+ -export QueryTypeLibFolder ¶
+ -export RegisterTypeLibFolder ¶
+ -export CompareStringA ¶
+ -export LCMapStringA ¶
+ -export GetLocaleInfoA ¶
+ -export GetStringTypeA ¶
+ -export GetSystemDefaultLangID ¶
+ -export GetUserDefaultLangID ¶
+ -export GetSystemDefaultLCID ¶
+ -export GetUserDefaultLCID
+
+PPCCOptions = -w conformance -appleext on
+
+PPCLibs = "{PPCLibraries}"InterfaceLib.xcoff ¶
+ "{PPCLibraries}"MathLib.xcoff ¶
+ "{PPCLibraries}"StdCLib.xcoff ¶
+ "{PPCLibraries}"StdCRuntime.o ¶
+ "{PPCLibraries}"PPCCRuntime.o
+
+PPCLibEquates = -l InterfaceLib.xcoff=InterfaceLib ¶
+ -l MathLib.xcoff=MathLib ¶
+ -l StdCLib.xcoff=StdCLib ¶
+ -l {LibName}.xcoff={LibName}
+
+# -------------------------------------------------------------------------------
+# - Productions
+# -------------------------------------------------------------------------------
+
+
+{LibName}.xcoff Ä {LibObjects}
+ PPCLink -xm s {LibExports} {LibObjects} {PPCLibs} -o {Targ}
+
+{LibObjects} Ä {LibSource} {LibHeader}
+ PPCC {PPCCOptions} {LibSource} -o {LibObjects}
+
+
diff --git a/private/oleauto/src/dispatch/oavtbl.c b/private/oleauto/src/dispatch/oavtbl.c
new file mode 100644
index 000000000..4e2acbacf
--- /dev/null
+++ b/private/oleauto/src/dispatch/oavtbl.c
@@ -0,0 +1,156 @@
+#include "oledisp.h"
+
+#include "oavtbl.h"
+
+oavtbl OAVtbl = {
+
+VTABLE_VERSION, // version
+
+//********************
+// Items from OLENLS.H
+//********************
+
+CompareStringA,
+LCMapStringA,
+GetLocaleInfoA,
+GetStringTypeA,
+GetSystemDefaultLangID,
+GetUserDefaultLangID,
+GetSystemDefaultLCID,
+GetUserDefaultLCID,
+
+//**********************
+// Items from DISPATCH.H
+//**********************
+SysAllocString,
+SysReAllocString,
+SysAllocStringLen,
+SysReAllocStringLen,
+SysFreeString,
+SysStringLen,
+DosDateTimeToVariantTime,
+VariantTimeToDosDateTime,
+SafeArrayAllocDescriptor,
+SafeArrayAllocData,
+SafeArrayCreate,
+SafeArrayDestroyDescriptor,
+SafeArrayDestroyData,
+SafeArrayDestroy,
+SafeArrayRedim,
+SafeArrayGetDim,
+SafeArrayGetElemsize,
+SafeArrayGetUBound,
+SafeArrayGetLBound,
+SafeArrayLock,
+SafeArrayUnlock,
+SafeArrayAccessData,
+SafeArrayUnaccessData,
+SafeArrayGetElement,
+SafeArrayPutElement,
+SafeArrayCopy,
+SafeArrayPtrOfIndex,
+VariantInit,
+VariantClear,
+VariantCopy,
+VariantCopyInd,
+VariantChangeType,
+VariantChangeTypeEx,
+
+VarI2FromI4,
+VarI2FromR4,
+VarI2FromR8,
+VarI2FromCy,
+VarI2FromDate,
+VarI2FromStr,
+VarI2FromDisp,
+VarI2FromBool,
+
+VarI4FromI2,
+VarI4FromR4,
+VarI4FromR8,
+VarI4FromCy,
+VarI4FromDate,
+VarI4FromStr,
+VarI4FromDisp,
+VarI4FromBool,
+
+VarR4FromI2,
+VarR4FromI4,
+VarR4FromR8,
+VarR4FromCy,
+VarR4FromDate,
+VarR4FromStr,
+VarR4FromDisp,
+VarR4FromBool,
+
+VarR8FromI2,
+VarR8FromI4,
+VarR8FromR4,
+VarR8FromCy,
+VarR8FromDate,
+VarR8FromStr,
+VarR8FromDisp,
+VarR8FromBool,
+
+VarDateFromI2,
+VarDateFromI4,
+VarDateFromR4,
+VarDateFromR8,
+VarDateFromCy,
+VarDateFromStr,
+VarDateFromDisp,
+VarDateFromBool,
+
+VarCyFromI2,
+VarCyFromI4,
+VarCyFromR4,
+VarCyFromR8,
+VarCyFromDate,
+VarCyFromStr,
+VarCyFromDisp,
+VarCyFromBool,
+VarBstrFromI2,
+VarBstrFromI4,
+VarBstrFromR4,
+VarBstrFromR8,
+VarBstrFromCy,
+VarBstrFromDate,
+VarBstrFromDisp,
+VarBstrFromBool,
+VarBoolFromI2,
+VarBoolFromI4,
+VarBoolFromR4,
+VarBoolFromR8,
+VarBoolFromDate,
+VarBoolFromCy,
+VarBoolFromStr,
+VarBoolFromDisp,
+
+MPWVarFromR4,
+MPWVarFromR8,
+MPWR4FromVar,
+MPWR8FromVar,
+
+LHashValOfNameSys,
+LoadTypeLib,
+LoadRegTypeLib,
+QueryPathOfRegTypeLib,
+RegisterTypeLib,
+CreateTypeLib,
+LoadTypeLibFSp,
+RegisterTypeLibFolder,
+QueryTypeLibFolder,
+
+DispGetParam,
+DispGetIDsOfNames,
+DispInvoke,
+CreateDispTypeInfo,
+CreateStdDispatch,
+RegisterActiveObject,
+RevokeActiveObject,
+GetActiveObject
+
+};
+
+void *pOAVtbl = (void *)&OAVtbl;
+
diff --git a/private/oleauto/src/dispatch/oavtbl.h b/private/oleauto/src/dispatch/oavtbl.h
new file mode 100644
index 000000000..4ee589aee
--- /dev/null
+++ b/private/oleauto/src/dispatch/oavtbl.h
@@ -0,0 +1,293 @@
+#define VTABLE_VERSION 1
+
+#ifndef _MSC_VER
+#define pSTDAPI(fcn) pascal HRESULT (* fcn)
+#define pSTDAPI_(fcn,type) pascal type (* fcn)
+#else
+#define pSTDAPI(fcn) HRESULT (STDAPICALLTYPE FAR* fcn)
+#define pSTDAPI_(fcn,type) type (STDAPICALLTYPE FAR* fcn)
+#endif
+
+
+typedef struct {
+
+long version;
+
+//********************
+// Items from OLENLS.H
+//********************
+
+pSTDAPI_(CompareStringA, int)(LCID, unsigned long, const char FAR*, int, const char FAR*, int);
+
+pSTDAPI_(LCMapStringA, int)(LCID, unsigned long, const char FAR*, int, char FAR*, int);
+
+pSTDAPI_(GetLocaleInfoA, int)(LCID, LCTYPE, char FAR*, int);
+
+pSTDAPI_(GetStringTypeA, int)(LCID, unsigned long, const char FAR*, int, unsigned short FAR*);
+
+pSTDAPI_(GetSystemDefaultLangID, LANGID)(void);
+
+pSTDAPI_(GetUserDefaultLangID, LANGID)(void);
+
+pSTDAPI_(GetSystemDefaultLCID, LCID)(void);
+
+pSTDAPI_(GetUserDefaultLCID, LCID)(void);
+
+//**********************
+// Items from DISPATCH.H
+//**********************
+pSTDAPI_(SysAllocString, BSTR)(const OLECHAR FAR*);
+pSTDAPI_(SysReAllocString, int)(BSTR FAR*, const OLECHAR FAR*);
+pSTDAPI_(SysAllocStringLen, BSTR)(const OLECHAR FAR*, unsigned int);
+pSTDAPI_(SysReAllocStringLen, int)(BSTR FAR*, const OLECHAR FAR*, unsigned int);
+pSTDAPI_(SysFreeString, void)(BSTR);
+pSTDAPI_(SysStringLen, unsigned int)(BSTR);
+
+pSTDAPI_(DosDateTimeToVariantTime, int)(
+ unsigned short wDosDate,
+ unsigned short wDosTime,
+ double FAR* pvtime);
+
+pSTDAPI_(VariantTimeToDosDateTime, int)(
+ double vtime,
+ unsigned short FAR* pwDosDate,
+ unsigned short FAR* pwDosTime);
+
+pSTDAPI(SafeArrayAllocDescriptor)(unsigned int cDims, SAFEARRAY FAR* FAR* ppsaOut);
+
+pSTDAPI(SafeArrayAllocData)(SAFEARRAY FAR* psa);
+
+pSTDAPI_(SafeArrayCreate, SAFEARRAY FAR*) (
+ VARTYPE vt,
+ unsigned int cDims,
+ SAFEARRAYBOUND FAR* rgsabound);
+
+pSTDAPI(SafeArrayDestroyDescriptor)(SAFEARRAY FAR* psa);
+
+pSTDAPI(SafeArrayDestroyData)(SAFEARRAY FAR* psa);
+
+pSTDAPI(SafeArrayDestroy)(SAFEARRAY FAR* psa);
+
+pSTDAPI(SafeArrayRedim)(SAFEARRAY FAR* psa, SAFEARRAYBOUND FAR* psaboundNew);
+
+pSTDAPI_(SafeArrayGetDim, unsigned int)(SAFEARRAY FAR* psa);
+
+pSTDAPI_(SafeArrayGetElemsize, unsigned int)(SAFEARRAY FAR* psa);
+
+pSTDAPI(SafeArrayGetUBound)(SAFEARRAY FAR* psa, unsigned int nDim, long FAR* plUbound);
+
+pSTDAPI(SafeArrayGetLBound)(SAFEARRAY FAR* psa, unsigned int nDim, long FAR* plLbound);
+
+pSTDAPI(SafeArrayLock)(SAFEARRAY FAR* psa);
+
+pSTDAPI(SafeArrayUnlock)(SAFEARRAY FAR* psa);
+
+pSTDAPI(SafeArrayAccessData)(SAFEARRAY FAR* psa, void HUGEP* FAR* ppvData);
+
+pSTDAPI(SafeArrayUnaccessData)(SAFEARRAY FAR* psa);
+
+pSTDAPI(SafeArrayGetElement)(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void FAR* pv);
+
+pSTDAPI(SafeArrayPutElement)(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void FAR* pv);
+
+pSTDAPI(SafeArrayCopy)(
+ SAFEARRAY FAR* psa,
+ SAFEARRAY FAR* FAR* ppsaOut);
+
+pSTDAPI(SafeArrayPtrOfIndex)(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void HUGEP* FAR* ppvData);
+
+
+pSTDAPI_(VariantInit, void)(VARIANTARG FAR* pvarg);
+
+pSTDAPI(VariantClear)(VARIANTARG FAR* pvarg);
+
+pSTDAPI(VariantCopy)(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvargSrc);
+
+pSTDAPI(VariantCopyInd)(
+ VARIANT FAR* pvarDest,
+ VARIANTARG FAR* pvargSrc);
+
+pSTDAPI(VariantChangeType)(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvarSrc,
+ unsigned short wFlags,
+ VARTYPE vt);
+
+pSTDAPI(VariantChangeTypeEx)(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvarSrc,
+ LCID lcid,
+ unsigned short wFlags,
+ VARTYPE vt);
+
+pSTDAPI(VarI2FromI4)(long lIn, short FAR* psOut);
+pSTDAPI(VarI2FromR4)(float fltIn, short FAR* psOut);
+pSTDAPI(VarI2FromR8)(double dblIn, short FAR* psOut);
+pSTDAPI(VarI2FromCy)(CY cyIn, short FAR* psOut);
+pSTDAPI(VarI2FromDate)(DATE dateIn, short FAR* psOut);
+pSTDAPI(VarI2FromStr)(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, short FAR* psOut);
+pSTDAPI(VarI2FromDisp)(IDispatch FAR* pdispIn, LCID lcid, short FAR* psOut);
+pSTDAPI(VarI2FromBool)(VARIANT_BOOL boolIn, short FAR* psOut);
+
+pSTDAPI(VarI4FromI2)(short sIn, long FAR* plOut);
+pSTDAPI(VarI4FromR4)(float fltIn, long FAR* plOut);
+pSTDAPI(VarI4FromR8)(double dblIn, long FAR* plOut);
+pSTDAPI(VarI4FromCy)(CY cyIn, long FAR* plOut);
+pSTDAPI(VarI4FromDate)(DATE dateIn, long FAR* plOut);
+pSTDAPI(VarI4FromStr)(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, long FAR* plOut);
+pSTDAPI(VarI4FromDisp)(IDispatch FAR* pdispIn, LCID lcid, long FAR* plOut);
+pSTDAPI(VarI4FromBool)(VARIANT_BOOL boolIn, long FAR* plOut);
+
+pSTDAPI(VarR4FromI2)(short sIn, float FAR* pfltOut);
+pSTDAPI(VarR4FromI4)(long lIn, float FAR* pfltOut);
+pSTDAPI(VarR4FromR8)(double dblIn, float FAR* pfltOut);
+pSTDAPI(VarR4FromCy)(CY cyIn, float FAR* pfltOut);
+pSTDAPI(VarR4FromDate)(DATE dateIn, float FAR* pfltOut);
+pSTDAPI(VarR4FromStr)(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, float FAR* pfltOut);
+pSTDAPI(VarR4FromDisp)(IDispatch FAR* pdispIn, LCID lcid, float FAR* pfltOut);
+pSTDAPI(VarR4FromBool)(VARIANT_BOOL boolIn, float FAR* pfltOut);
+
+pSTDAPI(VarR8FromI2)(short sIn, double FAR* pdblOut);
+pSTDAPI(VarR8FromI4)(long lIn, double FAR* pdblOut);
+pSTDAPI(VarR8FromR4)(float fltIn, double FAR* pdblOut);
+pSTDAPI(VarR8FromCy)(CY cyIn, double FAR* pdblOut);
+pSTDAPI(VarR8FromDate)(DATE dateIn, double FAR* pdblOut);
+pSTDAPI(VarR8FromStr)(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, double FAR* pdblOut);
+pSTDAPI(VarR8FromDisp)(IDispatch FAR* pdispIn, LCID lcid, double FAR* pdblOut);
+pSTDAPI(VarR8FromBool)(VARIANT_BOOL boolIn, double FAR* pdblOut);
+
+pSTDAPI(VarDateFromI2)(short sIn, DATE FAR* pdateOut);
+pSTDAPI(VarDateFromI4)(long lIn, DATE FAR* pdateOut);
+pSTDAPI(VarDateFromR4)(float fltIn, DATE FAR* pdateOut);
+pSTDAPI(VarDateFromR8)(double dblIn, DATE FAR* pdateOut);
+pSTDAPI(VarDateFromCy)(CY cyIn, DATE FAR* pdateOut);
+pSTDAPI(VarDateFromStr)(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, DATE FAR* pdateOut);
+pSTDAPI(VarDateFromDisp)(IDispatch FAR* pdispIn, LCID lcid, DATE FAR* pdateOut);
+pSTDAPI(VarDateFromBool)(VARIANT_BOOL boolIn, DATE FAR* pdateOut);
+
+pSTDAPI(VarCyFromI2)(short sIn, CY FAR* pcyOut);
+pSTDAPI(VarCyFromI4)(long lIn, CY FAR* pcyOut);
+pSTDAPI(VarCyFromR4)(float fltIn, CY FAR* pcyOut);
+pSTDAPI(VarCyFromR8)(double dblIn, CY FAR* pcyOut);
+pSTDAPI(VarCyFromDate)(DATE dateIn, CY FAR* pcyOut);
+pSTDAPI(VarCyFromStr)(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, CY FAR* pcyOut);
+pSTDAPI(VarCyFromDisp)(IDispatch FAR* pdispIn, LCID lcid, CY FAR* pcyOut);
+pSTDAPI(VarCyFromBool)(VARIANT_BOOL boolIn, CY FAR* pcyOut);
+
+pSTDAPI(VarBstrFromI2)(short iVal, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+pSTDAPI(VarBstrFromI4)(long lIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+pSTDAPI(VarBstrFromR4)(float fltIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+pSTDAPI(VarBstrFromR8)(double dblIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+pSTDAPI(VarBstrFromCy)(CY cyIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+pSTDAPI(VarBstrFromDate)(DATE dateIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+pSTDAPI(VarBstrFromDisp)(IDispatch FAR* pdispIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+pSTDAPI(VarBstrFromBool)(VARIANT_BOOL boolIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+
+pSTDAPI(VarBoolFromI2)(short sIn, VARIANT_BOOL FAR* pboolOut);
+pSTDAPI(VarBoolFromI4)(long lIn, VARIANT_BOOL FAR* pboolOut);
+pSTDAPI(VarBoolFromR4)(float fltIn, VARIANT_BOOL FAR* pboolOut);
+pSTDAPI(VarBoolFromR8)(double dblIn, VARIANT_BOOL FAR* pboolOut);
+pSTDAPI(VarBoolFromDate)(DATE dateIn, VARIANT_BOOL FAR* pboolOut);
+pSTDAPI(VarBoolFromCy)(CY cyIn, VARIANT_BOOL FAR* pboolOut);
+pSTDAPI(VarBoolFromStr)(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, VARIANT_BOOL FAR* pboolOut);
+pSTDAPI(VarBoolFromDisp)(IDispatch FAR* pdispIn, LCID lcid, VARIANT_BOOL FAR* pboolOut);
+
+pSTDAPI(MPWVarFromR4)(float FAR* pfltIn, VARIANT FAR* pvarOut);
+pSTDAPI(MPWVarFromR8)(double FAR* pdblIn, VARIANT FAR* pvarOut);
+pSTDAPI(MPWR4FromVar)(VARIANT FAR* pvarIn, float FAR* pfltOut);
+pSTDAPI(MPWR8FromVar)(VARIANT FAR* pvarIn, double FAR* pdblOut);
+
+pSTDAPI_(LHashValOfNameSys, unsigned long)(SYSKIND syskind, LCID lcid, OLECHAR FAR* szName);
+
+pSTDAPI(LoadTypeLib)(OLECHAR FAR* szFile, ITypeLib FAR* FAR* pptlib);
+
+pSTDAPI(LoadRegTypeLib)(
+ REFGUID rguid,
+ unsigned short wVerMajor,
+ unsigned short wVerMinor,
+ LCID lcid,
+ ITypeLib FAR* FAR* pptlib);
+
+pSTDAPI(QueryPathOfRegTypeLib)(
+ REFGUID guid,
+ unsigned short wMaj,
+ unsigned short wMin,
+ LCID lcid,
+ LPBSTR lpbstrPathName);
+
+pSTDAPI(RegisterTypeLib)(
+ ITypeLib FAR* ptlib,
+ OLECHAR FAR* szFullPath,
+ OLECHAR FAR* szHelpDir);
+
+pSTDAPI(CreateTypeLib)(SYSKIND syskind, OLECHAR FAR* szFile, ICreateTypeLib FAR* FAR* ppctlib);
+
+pSTDAPI(LoadTypeLibFSp)(const FSSpec *pfsspec, ITypeLib FAR* FAR* pptlib);
+
+pSTDAPI(RegisterTypeLibFolder)(OLECHAR FAR* szFullPath);
+
+pSTDAPI(QueryTypeLibFolder)(LPBSTR pbstr);
+
+pSTDAPI(DispGetParam)(
+ DISPPARAMS FAR* pdispparams,
+ unsigned int position,
+ VARTYPE vtTarg,
+ VARIANT FAR* pvarResult,
+ unsigned int FAR* puArgErr);
+
+pSTDAPI(DispGetIDsOfNames)(
+ ITypeInfo FAR* ptinfo,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ DISPID FAR* rgdispid);
+
+pSTDAPI(DispInvoke)(
+ void FAR* _this,
+ ITypeInfo FAR* ptinfo,
+ DISPID dispidMember,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+pSTDAPI(CreateDispTypeInfo)(
+ INTERFACEDATA FAR* pidata,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+pSTDAPI(CreateStdDispatch)(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* ppunkStdDisp);
+
+pSTDAPI(RegisterActiveObject)(
+ IUnknown FAR* punk,
+ REFCLSID rclsid,
+ void FAR* pvReserved,
+ unsigned long FAR* pdwRegister);
+
+pSTDAPI(RevokeActiveObject)(
+ unsigned long dwRegister,
+ void FAR* pvReserved);
+
+pSTDAPI(GetActiveObject)(
+ REFCLSID rclsid,
+ void FAR* pvReserved,
+ IUnknown FAR* FAR* ppunk);
+
+
+} oavtbl;
+
diff --git a/private/oleauto/src/dispatch/ole2.ini b/private/oleauto/src/dispatch/ole2.ini
new file mode 100644
index 000000000..4d02a080b
--- /dev/null
+++ b/private/oleauto/src/dispatch/ole2.ini
@@ -0,0 +1,275 @@
+// ole2.ini format:
+// -- list of names for the Insert New Object dialog
+// [insert]
+// <class name1>=
+// <class name2>=
+// <class name3>=
+//
+// --many instances of the following...
+// [<classname>]
+// handler=<dll name>
+// server=<exe name>
+// links=<class name>
+//
+// --one instance of the following (do not name a class "extensions")
+// [extensions]
+// xxx=<classname>
+// yyy=<classname>
+// ...
+
+[insert]
+
+// OLE2.0 servers
+EllipseWT=
+SDemo1=
+InPlaceSDemo1=
+OLineS=
+
+// Testing group's OLE2.0 servers
+Cl2Test=
+miCl2Test=
+Sr2Test=
+Sr2Inv=
+Sr2_1Test=
+miSr2Test=
+miSr2Inv=
+miSr2_1Test=
+
+
+// OLE1.0 servers
+ExcelWorksheet=
+ExcelChart=
+ExcelMacroSheet=
+MsGraph=
+MsDraw=
+WordArt=
+ServerDemo=
+SrTest=
+Shapes=
+MiShapes=
+WordDocument=
+SoundRec=
+PBrush=
+Equation=
+MSPowerPoint=
+MSPowerPointSho=
+Package=
+
+
+// Development's unit testing related stuff
+[TestServer1]
+handler=server1.dll
+
+[AltServer1]
+handler=server1.dll
+
+[CFileMoniker]
+handler=ole2.dll
+
+[CItemMoniker]
+handler=ole2.dll
+
+[CCompositeMoniker]
+handler=ole2.dll
+
+[TestRem]
+
+[MainTestRem]
+server=testrem.exe
+
+// IDispatch testing stuff
+[CDispTst]
+server=sdisptst.exe
+
+[CSArray]
+server=sdisptst.exe
+
+// IDispatch sample code stuff
+[CPoly]
+server=spoly.exe
+
+[CPoint]
+server=spoly.exe
+
+
+// OLE2.0 servers' info
+[EllipseWT]
+handler=ellipswt.dll
+
+[SDemo1]
+handler=ole2.dll
+server=sdemo1.exe
+verb 0=&Play
+verb 1=&Edit
+
+[InPlaceSDemo1]
+handler=ole2.dll
+server=ipsdemo1.exe
+
+[OLineS]
+handler=ole2.dll
+server=olines.exe
+
+[DfMarshal]
+handler=ole2.dll
+
+[StdMemStm]
+handler=ole2.dll
+
+[StdMemBytes]
+handler=ole2.dll
+
+[StdOleLink]
+handler=ole2.dll
+
+[CFileMoniker]
+handler=ole2.dll
+
+[CItemMoniker]
+handler=ole2.dll
+
+[CCompositeMoniker]
+handler=ole2.dll
+
+[CAntiMoniker]
+handler=ole2.dll
+
+
+// Testing group's OLE2.0 servers' info
+[Cl2Test]
+handler=ole2.dll
+server=cl2test.exe
+
+[miCl2Test]
+handler=ole2.dll
+server=micl2.exe
+
+
+[Sr2Test]
+handler=ole2.dll
+server=sr2test.exe
+verb 0=&Play
+verb 1=&Edit
+
+[Sr2Inv]
+handler=ole2.dll
+server=sr2test.exe
+verb 0=&Play
+verb 1=&Edit
+
+[Sr2_1Test]
+handler=ole2.dll
+server=sr2_1.exe
+verb 0=&Play
+verb 1=&Edit
+
+[miSr2Test]
+handler=ole2.dll
+server=misr2.exe
+verb 0=&Play
+verb 1=&Edit
+
+[miSr2Inv]
+handler=ole2.dll
+server=misr2.exe
+verb 0=&Play
+verb 1=&Edit
+
+[miSr2_1Test]
+handler=ole2.dll
+server=misr2_1.exe
+verb 0=&Play
+verb 1=&Edit
+
+
+// OLE1.0 servers' info
+[ExcelWorksheet]
+handler=ole2.dll
+ole10server=1
+
+[ExcelChart]
+handler=ole2.dll
+ole10server=1
+
+[ExcelMacroSheet]
+handler=ole2.dll
+ole10server=1
+
+[MsGraph]
+handler=ole2.dll
+ole10server=1
+
+[MsDraw]
+handler=ole2.dll
+ole10server=1
+
+[WordArt]
+handler=ole2.dll
+ole10server=1
+
+[ServerDemo]
+handler=ole2.dll
+ole10server=1
+
+[SrTest]
+handler=ole2.dll
+ole10server=1
+
+[Shapes]
+handler=ole2.dll
+ole10server=1
+
+[MiShapes]
+handler=ole2.dll
+ole10server=1
+
+[WordDocument]
+handler=ole2.dll
+ole10server=1
+
+[SoundRec]
+handler=ole2.dll
+ole10server=1
+
+[PBrush]
+handler=ole2.dll
+ole10server=1
+
+[Equation]
+handler=ole2.dll
+ole10server=1
+
+[MSPowerPoint]
+handler=ole2.dll
+ole10server=1
+
+[MSPowerPointSho]
+handler=ole2.dll
+ole10server=1
+
+[Package]
+handler=ole2.dll
+ole10server=1
+
+
+// Extensions
+[extensions]
+foo=CFoo
+sd=SDemo1
+oln=OLineS
+xlc=ExcelChart
+clt=Cl2Test
+mct=miCl2Test
+sr2=Sr2Test
+si2=Sr2Inv
+s21=Sr2_1Test
+mr2=miSr2Test
+mi2=miSr2Inv
+m21=miSr2_1Test
+
+// Interfaces
+[interfaces]
+IID(516 0 0 0 192 0 0 17920)=testprox.dll, ITestRem1
+
+IID(1024 2 0 0 192 0 0 17920)=oledisp.dll, IDispatch
+IID(1025 2 0 0 192 0 0 17920)=oledisp.dll, ITypeInfo
diff --git a/private/oleauto/src/dispatch/ole2auto.reg b/private/oleauto/src/dispatch/ole2auto.reg
new file mode 100644
index 000000000..c315a581a
--- /dev/null
+++ b/private/oleauto/src/dispatch/ole2auto.reg
@@ -0,0 +1,79 @@
+REGEDIT
+
+; registration info for the ole programmability component
+
+
+-- IDispatch
+
+HKEY_CLASSES_ROOT\Interface\{00020400-0000-0000-C000-000000000046} = IDispatch
+HKEY_CLASSES_ROOT\Interface\{00020400-0000-0000-C000-000000000046}\NumMethods = 7
+HKEY_CLASSES_ROOT\Interface\{00020400-0000-0000-C000-000000000046}\ProxyStubClsid = {00020420-0000-0000-C000-000000000046}
+
+
+-- IEnumVARIANT
+
+HKEY_CLASSES_ROOT\Interface\{00020404-0000-0000-C000-000000000046} = IEnumVARIANT
+HKEY_CLASSES_ROOT\Interface\{00020404-0000-0000-C000-000000000046}\NumMethods = 7
+HKEY_CLASSES_ROOT\Interface\{00020404-0000-0000-C000-000000000046}\ProxyStubClsid = {00020421-0000-0000-C000-000000000046}
+
+
+-- ITypeInfo
+
+HKEY_CLASSES_ROOT\Interface\{00020401-0000-0000-C000-000000000046} = ITypeInfo
+HKEY_CLASSES_ROOT\Interface\{00020401-0000-0000-C000-000000000046}\NumMethods = 22
+HKEY_CLASSES_ROOT\Interface\{00020401-0000-0000-C000-000000000046}\ProxyStubClsid = {00020422-0000-0000-C000-000000000046}
+
+
+-- ITypeLib
+
+HKEY_CLASSES_ROOT\Interface\{00020402-0000-0000-C000-000000000046} = ITypeLib
+HKEY_CLASSES_ROOT\Interface\{00020402-0000-0000-C000-000000000046}\NumMethods = 13
+HKEY_CLASSES_ROOT\Interface\{00020402-0000-0000-C000-000000000046}\ProxyStubClsid = {00020423-0000-0000-C000-000000000046}
+
+
+-- ITypeComp
+
+HKEY_CLASSES_ROOT\Interface\{00020403-0000-0000-C000-000000000046} = ITypeComp
+HKEY_CLASSES_ROOT\Interface\{00020403-0000-0000-C000-000000000046}\NumMethods = 5
+HKEY_CLASSES_ROOT\Interface\{00020403-0000-0000-C000-000000000046}\ProxyStubClsid = {00020425-0000-0000-C000-000000000046}
+
+-- ICreateTypeInfo
+
+HKEY_CLASSES_ROOT\Interface\{00020405-0000-0000-C000-000000000046} = ICreateTypeInfo
+HKEY_CLASSES_ROOT\Interface\{00020405-0000-0000-C000-000000000046}\NumMethods = 26
+
+
+-- ICreateTypeLib
+
+HKEY_CLASSES_ROOT\Interface\{00020406-0000-0000-C000-000000000046} = ICreateTypeLib
+HKEY_CLASSES_ROOT\Interface\{00020406-0000-0000-C000-000000000046}\NumMethods = 13
+
+
+-- OLE Automation stdole.tlb registration
+
+HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}\1.0 = OLE Automation
+HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}\1.0\HELPDIR =
+HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}\1.0\0\win16 = stdole.tlb
+
+
+-- Registration info for OLE Automation private classes
+
+HKEY_CLASSES_ROOT\CLSID\{00020420-0000-0000-C000-000000000046} = PSDispatch
+HKEY_CLASSES_ROOT\CLSID\{00020420-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00020421-0000-0000-C000-000000000046} = PSEnumVARIANT
+HKEY_CLASSES_ROOT\CLSID\{00020421-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00020422-0000-0000-C000-000000000046} = PSTypeInfo
+HKEY_CLASSES_ROOT\CLSID\{00020422-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00020423-0000-0000-C000-000000000046} = PSTypeLib
+HKEY_CLASSES_ROOT\CLSID\{00020423-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00020425-0000-0000-C000-000000000046} = PSTypeComp
+HKEY_CLASSES_ROOT\CLSID\{00020425-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
+HKEY_CLASSES_ROOT\CLSID\{00020424-0000-0000-C000-000000000046} = PSAutomation
+HKEY_CLASSES_ROOT\CLSID\{00020424-0000-0000-C000-000000000046}\InprocServer = ole2disp.dll
+
diff --git a/private/oleauto/src/dispatch/oledate.c b/private/oleauto/src/dispatch/oledate.c
new file mode 100644
index 000000000..03a3b93a5
--- /dev/null
+++ b/private/oleauto/src/dispatch/oledate.c
@@ -0,0 +1,370 @@
+/***
+* Rtdate.c - Date/time support
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Purpose:
+* This source contains the date/time support that are exported
+* for use in the ole dlls.
+*
+* Revision History:
+*
+* [00] 17-Dec-92 bradlo: Split off from rtdate.c
+*
+* Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#include <stdio.h>
+#include <math.h>
+#include <time.h>
+#include <stdlib.h>
+
+ASSERTDATA
+
+
+#define HALF_SECOND (1.0/172800.0)
+
+// Map from month number (0-based) to day of year month starts (0-based)
+// Good for non-leap years. Last entry is 365 (days in a year)
+//
+const int NEARDATA mpmmdd[13] = {
+ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
+};
+
+/***
+*ErrPackDate - pack a UDS into a date/time serial number
+*
+*Purpose:
+* Generate a date/time serial number from a UDS
+*
+*Entry:
+* UDS *puds = pointer to UDS to pack
+* VARIANT *pvarDate = pointer to serial date to be filled
+* int fValidDate =
+* TRUE - the UDS is known to contain a valid date
+* FALSE - perform more checks and work to pack a possibly invalid date
+* dwFlags =
+* VAR_TIMEVALUEONLY - return only time value
+* VAR_DATEVALUEONLY - return only date value
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+EXTERN_C INTERNAL_(HRESULT)
+ErrPackDate(UDS FAR* puds, VARIANT FAR* pvarDate, int fValidDate, unsigned long dwFlags)
+{
+ long lDate;
+ double dblTime;
+ int fLeapYear;
+ short mm, dd, yy;
+
+ /* put uds stuff in local vars
+ also, make months zero based and adjust for out of range
+ months (for date calculations using DateSerial) */
+
+ yy = puds->Year;
+ mm = puds->Month - 1;
+
+ if(!fValidDate){
+ if (mm < 0) {
+ yy -= 1 + (-mm / 12);
+ mm = 12 - (-mm % 12);
+ } else {
+ yy += mm / 12;
+ mm = mm % 12;
+ }
+ }
+
+ if(yy < 100)
+ yy += 1900;
+
+ dd = puds->DayOfMonth;
+
+ /* Check for leap year */
+
+ fLeapYear = ((yy & 3) == 0) && ((yy % 100) != 0 || (yy % 400) == 0);
+
+ /* Check if it's a valid date */
+
+ if(yy < 0 || yy > 9999 || mm < 0 || mm > 12)
+ return RESULT(DISP_E_TYPEMISMATCH); /* REVIEW: correct error? */
+
+ if(fValidDate
+ && (mm > 11 || dd < 1 || dd > mpmmdd[mm + 1] - mpmmdd[mm])
+ && !(mm == 1 && dd == 29 && fLeapYear))
+ {
+ return RESULT(DISP_E_TYPEMISMATCH); /* REVIEW: correct error? */
+ }
+
+ /* It is a valid date; make Jan 1, 1AD be 1 */
+
+ lDate = yy * 365L + (yy / 4) - yy/100 + yy/400 + mpmmdd[mm] + dd;
+
+ /* If we are a leap year and it's before March, subtract 1:
+ we haven't leapt yet! */
+
+ if(mm < 2 && fLeapYear)
+ --lDate;
+
+ /* Offset so that 12/30/1899 is 0 */
+
+ lDate -= 693959L;
+
+ if(lDate > 2958465 || lDate < -657434)
+ return RESULT(DISP_E_TYPEMISMATCH); /* REVIEW: correct error? */
+
+ if (fValidDate
+ && (puds->Hour < 0 || puds->Hour > 23
+ || puds->Minute < 0 || puds->Minute > 59
+ || puds->Second < 0 || puds->Second > 59))
+ {
+ return RESULT(DISP_E_TYPEMISMATCH); /* REVIEW: correct error? */
+ }
+
+ dblTime = (((long)puds->Hour * 3600L) + // hrs in seconds
+ ((long)puds->Minute * 60L) + // mins in seconds
+ ((long)puds->Second)) * (1. / 86400.);
+
+ V_VT(pvarDate) = VT_DATE;
+ if (dwFlags & VAR_TIMEVALUEONLY)
+ V_DATE(pvarDate) = dblTime;
+ else if (dwFlags & VAR_DATEVALUEONLY)
+ V_DATE(pvarDate) = (double)lDate;
+ else
+ V_DATE(pvarDate) = (double)lDate + ((lDate >= 0) ? dblTime : -dblTime);
+
+ return NOERROR;
+}
+
+/***
+* ErrUnpackDate - unpack a date/time serial number into a UDS
+*
+* Purpose:
+* Generate a UDS from a packed date/time serial number
+*
+* Entry:
+* UDS *puds = pointer to UDS to unpack into
+* double serialDate = serial number to unpack
+*
+* Exit:
+* EBERR_None = *puds is the unpacked date
+* EBERR_IllegalFuncCall = serialDate is out-of-range
+*
+* Exceptions:
+*
+***********************************************************************/
+EXTERN_C INTERNAL_(HRESULT)
+ErrUnpackDate(UDS FAR* puds, VARIANT FAR* pvar)
+{
+ int mm;
+ int nTime;
+ int fLeapOly;
+ int const * lpdd;
+ double serialDate, roundDate;
+ long lDate, lTime;
+ int oly, nDate, y, c4, cty;
+
+ fLeapOly = TRUE; // assume true
+
+ if(V_VT(pvar) != VT_DATE && V_VT(pvar) != VT_R8)
+ return RESULT(E_INVALIDARG);
+
+ roundDate = serialDate = V_DATE(pvar);
+
+ /* Local variables:
+ *
+ * lDate day based on 0 as 1/1/0 (note different from input)
+ * so 1/1/1900 is 693961 under this system.
+ * lTime time in seconds since midnight
+ * c4 number of 400-year blocks since 1/1/0
+ * cty century within c4 (0-3)
+ * oly olympiad (starting with oly 0 is years AD 0-3)
+ * nDate day number within oly (0 is 1/1 of 1st year;
+ * 1460 is 12/31 of 4th)
+ * y year in oly (0-3)
+ * fLeapOly true if the date is in a leap oly
+ */
+
+ /* WARNING: DO NOT CAST serialDate TO A 'long' BEFORE VERIFYING
+ THAT IT WILL NOT CAUSE A FLOATING-POINT EXCEPTION DUE TO
+ OVERFLOW. _aFftol IS NOT FOLLOWED BY AN FWAIT INSTRUCTION,
+ SO THE FP EXCEPTION WON'T BE RAISED UNTIL SOME OTHER CODE
+ CALLS FWAIT. ErrUnpackDate() CANNOT RAISE EXCEPTIONS - IT
+ MUST RETURN AN ERROR CODE. VBA2 #1914
+ */
+ if(serialDate >= 2958466.0 || serialDate <= -657435.0)
+ return RESULT(DISP_E_TYPEMISMATCH); // REVIEW: correct error?
+
+ // prep for round to the sec
+ roundDate += (serialDate > 0.0) ? HALF_SECOND : -HALF_SECOND;
+
+ if(roundDate <= 2958465.0 && roundDate >= -657435.0)
+ serialDate = roundDate;
+
+ lDate = (long)serialDate + 693959L; // Add days from 1/1/0 to 12/30/1899
+
+ if(serialDate < 0)
+ serialDate = -serialDate;
+
+ lTime = (long)((serialDate - disp_floor(serialDate)) * 86400.);
+
+ if (lDate < 0)
+ lDate = 0;
+
+ /* Leap years are every 4 years except centuries that are
+ not multiples of 400. */
+
+ c4 = (int)(lDate / 146097L);
+
+ // Now lDate is day within 400-year block
+ lDate %= 146097L;
+
+ // -1 because first century has extra day
+ cty = (int)((lDate - 1) / 36524L);
+
+ if(cty != 0){ // Non-leap century
+
+ // Now lDate is day within century
+ lDate = (lDate - 1) % 36524L;
+
+ // +1 because 1st oly has 1460 days
+ oly = (int) ((lDate + 1) / 1461L);
+
+ if(oly != 0){
+
+ nDate = (int)((lDate + 1) % 1461L);
+
+ }else{
+
+ fLeapOly = FALSE;
+ nDate = (int)lDate;
+
+ }
+
+ } else { // Leap century - not special case!
+
+ oly = (int)(lDate / 1461L);
+ nDate = (int)(lDate % 1461L);
+
+ }
+
+ if (fLeapOly) {
+
+ y = (nDate - 1) / 365; // -1 because first year has 366 days
+ if(y != 0)
+ nDate = (nDate - 1) % 365;
+
+ } else {
+
+ y = nDate / 365;
+ nDate %= 365;
+
+ }
+
+ // nDate is now 0-based day of year. Save 1-based day of year, year number
+
+ puds->Year = c4 * 400 + cty * 100 + oly * 4 + y;
+
+ // Handle leap year: before, on, and after Feb. 29.
+
+ if (y == 0 && fLeapOly) { // Leap Year
+
+ if (nDate == 59) {
+
+ /* Feb. 29 */
+ puds->Month = 2;
+ puds->DayOfMonth = 29;
+ goto DoTime;
+
+ }
+
+ if (nDate >= 60)
+ --nDate; // Pretend it's not a leap year for month/day comp.
+ }
+
+ // Code from here to DoTime computes month/day for everything but Feb. 29.
+
+ ++nDate; /* Make it 1-based rather than 0-based */
+
+ // nDate is now 1-based day of non-leap year.
+
+ /* Month number will always be >= n/32, so save some loop time */
+
+ for (mm = (nDate >> 5) + 1, lpdd = &mpmmdd[mm];
+ nDate > *lpdd; mm++, lpdd++);
+
+ puds->Month = (short)mm;
+ puds->DayOfMonth = (short)(nDate - lpdd[-1]);
+
+DoTime:;
+
+ // We have all date info in uds.
+
+ if(lTime == 0){ // avoid the divisions
+
+ puds->Second = puds->Minute = puds->Hour = 0;
+
+ }else{
+ puds->Second = (short)(lTime % 60L);
+ nTime = (int)(lTime / 60L);
+ puds->Minute = (short)(nTime % 60);
+ puds->Hour = (short)(nTime / 60);
+ }
+
+ return NOERROR;
+}
+
+/***
+* int GetCurrentYear - returns the current year
+*
+* Purpose:
+* Get the current year
+*
+* Entry:
+* None
+*
+* Exit:
+* returns current year
+*
+*
+* Exceptions:
+*
+***********************************************************************/
+
+INTERNAL_(int)
+GetCurrentYear(void)
+{
+#if OE_MAC
+
+ DateTimeRec d;
+ unsigned long secs;
+
+ GetDateTime(&secs);
+ Secs2Date(secs, &d);
+ return (int)d.year;
+
+#elif OE_WIN32
+
+ SYSTEMTIME s;
+
+ GetLocalTime(&s);
+ return s.wYear;
+
+#else
+ void PASCAL DOS3CALL(void);
+ int iYear;
+
+ _asm {
+ mov ah, 0x2a // 2a = Get Date Function
+ call DOS3CALL // Int 21 call
+ mov iYear, cx
+ }
+
+ return iYear;
+#endif
+}
diff --git a/private/oleauto/src/dispatch/oledisp.h b/private/oleauto/src/dispatch/oledisp.h
new file mode 100644
index 000000000..a34576c7a
--- /dev/null
+++ b/private/oleauto/src/dispatch/oledisp.h
@@ -0,0 +1,817 @@
+/***
+*oledisp.h - misc Oledisp wide definitions.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*
+*Revision History:
+*
+* [00] 07-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef _OLEDISP_H_ /* { */
+#define _OLEDISP_H_
+
+/* set Operating Environment switches */
+#define FE_DBCS // DBCS support for all platforms
+
+#ifdef _MAC
+# define OE_MAC 1
+# define OE_WIN 0
+# define OE_WIN16 0
+# define OE_WIN32 0
+#else
+# ifdef WIN32
+# define OE_WIN 1
+# define OE_MAC 0
+# define OE_WIN16 0
+# define OE_WIN32 1
+# else
+# define OE_WIN 1
+# define OE_MAC 0
+# define OE_WIN16 1
+# define OE_WIN32 0
+# endif
+#endif
+
+/* set Host Compiler Switches */
+
+#if OE_MAC
+# if defined(_PPCMAC)
+# define OE_MACPPC 1
+# define OE_MAC68K 0
+# else
+# define OE_MACPPC 0
+# define OE_MAC68K 1
+# endif
+# if defined(_MSC_VER)
+# define HC_MSC 1
+# define HC_MPW 0
+# else
+# define HC_MSC 0
+# define HC_MPW 1
+# endif
+# define IfWin(X)
+# define IfMac(X) (X)
+#else
+# define HC_MSC 1
+# define HC_MPW 0
+# define IfWin(X) (X)
+# define IfMac(X)
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#if OE_WIN16
+# include <windows.h>
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+# pragma warning(disable:4355)
+#else
+# if OE_WIN32
+#define _OLEAUT32_ // for the new oleauto.h when we pick it up
+// Yea, right...
+#define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# pragma warning(disable:4355)
+# else
+# if OE_MAC
+#ifdef STATIC_LIB
+ #define OLENAMES_MUNGE_FOR_STATIC 1
+# include "olenames.h"
+#endif
+typedef int BOOL;
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned long DWORD;
+typedef unsigned short USHORT;
+typedef unsigned int UINT;
+# define TRUE 1
+# define FALSE 0
+# if HC_MPW
+# include <types.h>
+# include <packages.h>
+# include <resources.h>
+# include <menus.h>
+# include <windows.h>
+# include <appleevents.h>
+# include <osutils.h>
+# include <LibraryManager.h>
+# include <LibraryManagerUtilities.h>
+# else
+# include <macos/types.h>
+# include <macos/packages.h>
+# include <macos/script.h>
+# include <macos/resource.h>
+# include <macos/menus.h>
+# include <macos/windows.h>
+# include <macos/osutils.h>
+# include <macos/memory.h>
+# include <macos/appleeve.h>
+# define far
+# define FAR far
+# define near
+# define NEAR near
+# if !OE_MACPPC
+# define pascal _pascal
+# endif
+# define PASCAL pascal
+# define cdecl _cdecl
+# define CDECL cdecl
+# endif
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+# else
+# error UNKNOWN OE
+# endif
+# endif
+#endif
+
+#if OE_MAC
+# ifdef _SLM
+ /* WARNING: Dont use the C runtime's version of sprintf from an ASLM Dll. */
+# undef sprintf
+# define sprintf USE_THIS_AND_DIE
+# define SPRINTF SLMsprintf
+# else
+# define SPRINTF sprintf
+# endif
+#else
+# define SPRINTF wsprintf
+#endif
+
+#if OE_WIN32
+# define SYS_CURRENT SYS_WIN32
+#elif OE_WIN16
+# define SYS_CURRENT SYS_WIN16
+#elif OE_MAC
+# define SYS_CURRENT SYS_MAC
+#endif
+
+#if OE_WIN16
+#pragma intrinsic(memcpy)
+#pragma intrinsic(memcmp)
+#pragma intrinsic(memset)
+#pragma intrinsic(strcpy)
+#pragma intrinsic(_fmemcpy)
+#pragma intrinsic(_fmemcmp)
+#pragma intrinsic(_fmemset)
+#pragma intrinsic(_fstrcpy)
+# define OLEBOOL BOOL
+# define STRLEN _fstrlen
+# define STRCPY _fstrcpy
+# define STRCAT _fstrcat
+# define STRCHR _fstrchr
+# define STRREV _fstrrev
+# define STRUPR _fstrupr
+# define STRCMP _fstrcmp
+# define STRNCMP _fstrncmp
+# define STRSTR _fstrstr
+# define STRTOD strtod
+# define TOLOWER tolower
+# define MEMCPY _fmemcpy
+# define MEMCMP _fmemcmp
+# define MEMSET _fmemset
+# define MEMMOVE _fmemmove
+# define STRICMP _fstricmp
+# define OASTR(str) str
+# define SIZEOFCH(x) sizeof(x)
+# define SIZEOFSTRING(x) (sizeof(x) - 1)
+# define BYTELEN(x) (STRLEN(x)+1)
+# define CHLEN(x) (x)
+# define CompareString CompareStringA
+# define GetLocaleInfo GetLocaleInfoA
+# define LCMapString LCMapStringA
+# define GETSTRINGTYPE GetStringTypeA
+# define STRCPY_A STRCPY
+# define STRCAT_A STRCAT
+# define STRICMP_A STRICMP
+#endif
+
+#if OE_WIN32
+# define OLEBOOL BOOL
+# define MEMCPY memcpy
+# define MEMCMP memcmp
+# define MEMSET memset
+# define MEMMOVE memmove
+# // all assume we are operating on unicode characters
+# define STRLEN wcslen
+# define STRCPY wcscpy
+# define STRCAT wcscat
+# define STRCMP wcscmp
+# define STRICMP wcsicmp
+# define STRSTR wcsstr
+# define STRREV _wcsrev
+# define STRCHR wcschr
+# define STRNCMP wcsncmp
+# define STRTOD wcstod
+# define TOLOWER towlower
+# define SIZEOFCH(x) (sizeof(x)/2)
+# define SIZEOFSTRING(x) (sizeof(x)/2 - 1)
+# define OASTR(str) L##str
+# define BYTELEN(x) (STRLEN(x)*2+2)
+# define CHLEN(x) (x/2)
+# define STRCPY_A strcpy
+# define STRCAT_A strcat
+# define STRICMP_A stricmp
+#endif
+
+#if OE_MAC
+# define OLEBOOL unsigned long
+# define STRLEN strlen
+# define STRCPY strcpy
+# define STRCAT strcat
+# define STRCHR strchr
+# define STRREV _strrev
+# define STRUPR _strupr
+# define STRCMP strcmp
+# define STRNCMP strncmp
+# define STRSTR strstr
+# define STRTOD strtod
+# define TOLOWER tolower
+# define MEMCPY memcpy
+# define MEMCMP memcmp
+# define MEMSET memset
+# define MEMMOVE memmove
+# define SIZEOFCH(x) sizeof(x)
+# define SIZEOFSTRING(x) (sizeof(x) - 1)
+# define OASTR(str) str
+# define BYTELEN(x) (STRLEN(x)+1)
+# define CHLEN(x) (x)
+# define CompareString CompareStringA
+# define GetLocaleInfo GetLocaleInfoA
+# define LCMapString LCMapStringA
+# define GETSTRINGTYPE GetStringTypeA
+# if HC_MPW
+# define STRICMP disp_stricmp
+# else
+# define STRICMP _stricmp
+# endif
+# define STRCPY_A STRCPY
+# define STRCAT_A STRCAT
+# define STRICMP_A STRICMP
+#endif
+
+#ifndef INLINE
+# define INLINE
+#endif
+
+#ifndef EXPORT
+# if OE_MAC || OE_WIN32
+# define EXPORT
+# else
+# define EXPORT __export
+# endif
+#endif
+
+#ifndef NEAR
+# if OE_MAC || OE_WIN32
+# define NEAR
+# else
+# define NEAR __near
+# endif
+#endif
+
+#ifndef NEARDATA
+# if OE_WIN16
+# define NEARDATA __near
+# elif OE_WIN32
+# define NEARDATA
+# elif OE_MAC
+# if HC_MPW
+# define NEARDATA /* REVIEW */
+# else
+# define NEARDATA /* __declspec(allocate("_DATA")) */
+# endif
+# endif
+#endif
+
+#if OE_WIN32
+# define CDECLMETHODCALLTYPE STDMETHODVCALLTYPE
+#else
+# define CDECLMETHODCALLTYPE STDMETHODCALLTYPE
+#endif
+
+
+// char count of a guid in ansi/unicode form (including trailing Null).
+#define CCH_SZGUID0 39
+
+// Method counts - used in validating interfaces
+#define CMETH_IUnknown 3
+#define CMETH_IDispatch 7
+#define CMETH_ITypeLib 13
+#define CMETH_ITypeInfo 22
+#define CMETH_IStorage 18
+#define CMETH_IMoniker 23
+#define CMETH_IBindCtx 13
+#define CMETH_IErrorInfo 8
+
+// UNDONE: Move this into variant.h
+#define FADF_FORCEFREE 0x1000 /* SafeArrayFree() ignores FADF_STATIC and frees anyway */
+
+
+#ifndef EXTERN_C
+# ifdef __cplusplus
+# define EXTERN_C extern "C"
+# else
+# define EXTERN_C extern
+# endif
+#endif
+
+#ifdef _DEBUG
+# define LOCAL
+
+STDAPI_(void)
+DispAssert(
+ char FAR* szMsg,
+ char FAR* szFile,
+ int line);
+
+# define ASSERT(X) \
+ if(!(X)){DispAssert(NULL, g_szFileName, __LINE__);}else{}
+# define ASSERTSZ(X, MSG) \
+ if(!(X)){DispAssert( MSG, g_szFileName, __LINE__);}else{}
+# define ASSERTDATA static char g_szFileName[] = __FILE__;
+#else
+# define LOCAL static
+# define ASSERT(X)
+# define ASSERTSZ(X, SZ)
+# define ASSERTDATA
+#endif
+
+// PRIVATE - a routine that is local to its module
+// INTERNAL - a routine that is local to the DLL
+
+#if OE_WIN16
+
+# define PRIVATECALLTYPE NEAR __pascal
+# define PRIVATECALL_(TYPE) TYPE PRIVATECALLTYPE
+# define INTERNALCALLTYPE FAR __pascal
+# define INTERNALCALL_(TYPE) TYPE INTERNALCALLTYPE
+
+#elif OE_WIN32
+
+# define PRIVATECALLTYPE __stdcall
+# define PRIVATECALL_(TYPE) TYPE PRIVATECALLTYPE
+# define INTERNALCALLTYPE __stdcall
+# define INTERNALCALL_(TYPE) TYPE INTERNALCALLTYPE
+
+#elif OE_MAC
+
+// Note: cdecl is used for the INTERNALCALLTYPE because this is
+// what is used for interfacing with assembly helpers, and the
+// cdecl return convention is much more reasonable on the mac.
+
+// REVIEW: investigate NEAR/FAR for mac build
+
+# ifdef _MSC_VER
+# define PRIVATECALLTYPE __pascal
+# define PRIVATECALL_(TYPE) TYPE PRIVATECALLTYPE
+# define INTERNALCALLTYPE __cdecl
+# define INTERNALCALL_(TYPE) TYPE INTERNALCALLTYPE
+# else
+# define PRIVATECALLTYPE pascal
+# define PRIVATECALL_(TYPE) PRIVATECALLTYPE TYPE
+# define INTERNALCALLTYPE
+# define INTERNALCALL_(TYPE) INTERNALCALLTYPE TYPE
+# endif
+#endif
+
+#define PRIVATE_(TYPE) LOCAL PRIVATECALL_(TYPE)
+#define INTERNAL_(TYPE) INTERNALCALL_(TYPE)
+
+/* VT_VMAX is the first VARENUM value that is *not* legal in a VARIANT.
+ * Currently, the legal vartypes that can appear in a variant can be
+ * expressed as (ignoring ByRef, Array, etc),
+ *
+ * 0 <= vt < VT_MAX
+ *
+ * Note: if the list of legal VARIANT types ever becomes non-
+ * contiguous, then there are a couple of places in the code that
+ * validate vartype by checking for < VT_VMAX that will have to be
+ * changed.
+ *
+ */
+#define VT_VMAX VT_UNKNOWN+1
+
+// The largest unused value in VARENUM enumeration
+#define VT_MAX VT_CLSID
+
+// This is a special value that is used internally for marshaling interfaces
+#define VT_INTERFACE VT_MAX
+
+// Following is the internal definition of a VARIANT of type VT_INTERFACE.
+// This contains an IUnknown*, and its IID. If a VARIANT is of type
+// VT_INTERFACE, it can be cast to this type and the appropriate components
+// extracted.
+//
+// Note: the following struct must correctly overlay a VARIANT
+//
+typedef struct FARSTRUCT tagVARIANTX VARIANTX;
+struct FARSTRUCT tagVARIANTX
+{
+ VARTYPE vt;
+ unsigned short wReserved3; // assumes sizeof(piid) == 4
+ IID FAR* piid; // ptr to IMalloc allocated IID
+ union{
+ IUnknown FAR* punk; // VT_INTERFACE
+ IUnknown FAR* FAR* ppunk; // VT_BYREF | VT_INTERFACE
+ };
+ unsigned long dwReserved; // assumes sizeof(punk) == 4
+};
+
+
+#define UNREACHED 0
+#if HC_MPW
+# define UNUSED(X) ((void)((void*)&(X)))
+#else
+# define UNUSED(X) (X)
+#endif
+
+#define DIM(X) (sizeof(X) / sizeof((X)[0]))
+
+#define MIN(X, Y) (((X) <= (Y)) ? (X) : (Y))
+
+#define MAX(X, Y) (((X) >= (Y)) ? (X) : (Y))
+
+
+#define HRESULT_FAILED(X) ((X) != NOERROR && FAILED(GetScode(X)))
+
+#define HRESULT_SUCCESS(X) ((X) == NOERROR || !FAILED(GetScode(X)))
+
+#define IfFailGo(expression, label) \
+ { hresult = (expression); \
+ if(HRESULT_FAILED(hresult)) \
+ goto label; \
+ }
+
+#define IfFailRet(expression) \
+ { HRESULT hresult = (expression); \
+ if(HRESULT_FAILED(hresult)) \
+ return hresult; \
+ }
+
+#define RESULT(X) ResultFromScode(X)
+
+// shortcut macro used by param validation code
+#define INVALIDARG RESULT(E_INVALIDARG)
+
+
+// C Runtime style helper functions
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+INTERNAL_(HRESULT) DispAlloc(size_t cb, void FAR* FAR* ppv);
+
+INTERNAL_(void) DispFree(void FAR* pv);
+
+INTERNAL_(OLECHAR FAR*) disp_itoa(int val, OLECHAR FAR* buf, int radix);
+
+INTERNAL_(OLECHAR FAR*) disp_ltoa(long val, OLECHAR FAR* buf, int radix);
+
+INTERNAL_(double) disp_floor(double dbl);
+
+INTERNAL_(void) disp_gcvt(double dblIn, int ndigits, OLECHAR FAR* pchOut, int bufSize);
+
+INTERNAL_(double) disp_strtod(OLECHAR FAR* strIn, OLECHAR FAR* FAR* pchEnd);
+
+#if HC_MPW
+
+INTERNAL_(int) disp_stricmp(char*, char*);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+// private SysAllocString helper that return an HRESULT
+
+EXTERN_C INTERNAL_(HRESULT)
+ErrSysAllocString(const OLECHAR FAR* psz, BSTR FAR* pbstrOut);
+
+EXTERN_C INTERNAL_(HRESULT)
+ErrSysAllocStringLen(const OLECHAR FAR* psz, unsigned int len, BSTR FAR* pbstrOut);
+
+#if !OE_WIN32
+#define ErrStringCopy(bstrSrc, pbstrOut) \
+ ErrSysAllocStringLen(bstrSrc, SysStringLen(bstrSrc), pbstrOut)
+#else
+EXTERN_C INTERNAL_(HRESULT)
+ErrStringCopy(BSTR bstrSrc, BSTR FAR * pbstrOut);
+#endif
+
+EXTERN_C INTERNAL_(HRESULT)
+DispMarshalInterface(IStream FAR* pstm, REFIID riid, IUnknown FAR* punk);
+
+EXTERN_C INTERNAL_(HRESULT)
+DispUnmarshalInterface(IStream FAR* pstm, REFIID riid, void FAR* FAR* ppunk);
+
+#if OE_WIN32
+EXTERN_C INTERNAL_(HRESULT)
+DispMarshalHresult(IStream FAR* pstm, HRESULT hresult);
+
+EXTERN_C INTERNAL_(HRESULT)
+DispUnmarshalHresult(IStream FAR* pstm, HRESULT FAR* phresult);
+
+#else //OE_WIN32
+// no special work to do
+#define DispMarshalHresult CoMarshalHresult
+#define DispUnmarshalHresult CoUnmarshalHresult
+#endif //OE_WIN32
+
+
+// private SafeArray helpers
+
+INTERNAL_(unsigned long)
+SafeArraySize(SAFEARRAY FAR* psa);
+
+
+// private date related helpers
+//
+
+// Unpacked Date Structure
+typedef struct tagUDS {
+ short Year;
+ short Month;
+ short DayOfMonth;
+ short Hour;
+ short Minute;
+ short Second;
+} UDS;
+
+EXTERN_C INTERNAL_(HRESULT)
+ErrPackDate(
+ UDS FAR* puds,
+ VARIANT FAR* pvar,
+ int fValidate,
+ unsigned long dwFlags);
+
+EXTERN_C INTERNAL_(HRESULT)
+ErrUnpackDate(
+ UDS FAR* puds,
+ VARIANT FAR* pvar);
+
+EXTERN_C INTERNAL_(int)
+GetCurrentYear(void);
+
+#ifdef FE_DBCS
+// DBCS: map full-width strings to half-width
+EXTERN_C
+INTERNAL_(HRESULT)
+MapHalfWidth(LCID lcid, OLECHAR FAR* strIn, OLECHAR FAR* FAR* ppv);
+#endif
+
+// answers S_OK if the given VARTYPE is legal, DISP_E_BADVARTYPE if not.
+// (variant.cpp)
+INTERNAL_(HRESULT)
+IsLegalVartype(VARTYPE vt);
+
+INTERNAL_(HRESULT)
+VariantChangeTypeInternal(VARIANT FAR* pvar, LCID lcid, VARTYPE vt);
+
+// convert.cpp
+//
+INTERNAL_(HRESULT)
+IsValidDate(DATE date);
+
+#ifdef FE_DBCS
+EXTERN_C INTERNAL_(int) IsDBCS(LCID lcid);
+EXTERN_C INTERNAL_(int) IsJapan(LCID lcid);
+EXTERN_C INTERNAL_(int) IsKorea(LCID lcid);
+EXTERN_C INTERNAL_(int) IsTaiwan(LCID lcid);
+EXTERN_C INTERNAL_(int) IsChina(LCID lcid);
+#endif
+
+
+// invhelp.cpp
+//
+STDAPI
+DoInvokeMethod(
+ void FAR* pvInstance,
+ unsigned int oVft,
+ CALLCONV cc,
+ VARTYPE vtReturn,
+ unsigned int cActuals,
+ VARTYPE FAR* prgvt,
+ VARIANTARG FAR* FAR* prgpvarg,
+ VARIANT FAR* pvargResult);
+
+// tiutil.cpp
+//
+INTERNAL_(HRESULT)
+GetPrimaryInterface(
+ ITypeInfo FAR* ptinfo,
+ ITypeInfo FAR* FAR* pptinfoPri);
+
+
+// On Win16, the typelib routines are in another DLL, so we dynamically
+// bind to them only if there needed. This saves clients who dont use
+// the functionality from loading typelib.dll just because they link
+// to ole2disp.dll. On all other platforms, there all in the same
+// DLL, so there is no need.
+//
+#if OE_WIN16
+typedef HRESULT (STDAPICALLTYPE FAR* PFNLOADTYPELIB)(const OLECHAR FAR*,
+ ITypeLib FAR* FAR*);
+EXTERN_C BOOL g_fbstpImplemented;
+INTERNAL_(HRESULT) DoLoadTypeLib(const OLECHAR FAR* szFile,
+ ITypeLib FAR* FAR* pptlib);
+#else
+# define DoLoadTypeLib LoadTypeLib
+#endif
+
+#if _X86_
+EXTERN_C BOOL g_fWin32s;
+EXTERN_C BOOL g_fChicago;
+#endif //_X86_
+
+// CoGetState/CoSetState are private core OLE APIs that are
+// exported specifically to enable the Automation DLL(s) to store
+// a single per-thread object, that gets released at OleUninitialize
+// time.
+//
+STDAPI CoSetState(IUnknown FAR* punk);
+STDAPI CoGetState(IUnknown FAR* FAR* ppunk);
+# define DoCoGetState CoGetState
+# define DoCoSetState CoSetState
+
+
+#if !defined(NO_PROCESS_CACHE) && !OE_WIN32
+// Per-process cache info.
+//
+#ifdef __cplusplus
+extern "C" {
+class CProcessInfo;
+#else
+typedef int CProcessInfo;
+#endif
+
+typedef struct
+{
+ IMalloc FAR* pmalloc;
+ IErrorInfo FAR* perrinfo; // this is NOT kept valid in the cache!
+#if OE_WIN16
+ HINSTANCE hinstTypeLibDLL; // this is NOT kept valid in the cache!
+ PFNLOADTYPELIB pfnLoadTypeLib;
+#endif //OE_WIN16
+} PROCESSINFO;
+
+extern PROCESSINFO NEARDATA pinfoCache; // declare per-process data cache
+#if OE_WIN16 || _X86_
+extern WORD NEARDATA uProcessID;
+#else
+extern DWORD NEARDATA uProcessID;
+#endif
+
+#if OE_MAC68K
+static const DWORD *pCurrentA5 = (DWORD *)(0x904);
+__inline DWORD GetPID() {return *pCurrentA5;}
+#elif OE_WIN16
+__inline WORD GetPID() {WORD tid; return (_segment)&tid;}
+#elif _X86_
+__inline WORD GetPID() {WORD tid; _asm {mov tid,ss} return tid;}
+#else
+__inline DWORD GetPID() {return 1;}
+#endif
+
+CProcessInfo FAR * GetProcessInfo();
+
+#if _X86_
+CProcessInfo FAR * GetProcessInfoCache();
+#else //_X86_
+#define GetProcessInfoCache GetProcessInfo
+#endif //_X86_
+
+__inline HRESULT GetMalloc(IMalloc FAR** ppmalloc)
+{
+ if ( GetPID() != uProcessID )
+ if (GetProcessInfoCache() == NULL)
+ return RESULT(E_FAIL);
+ *ppmalloc = pinfoCache.pmalloc;
+ return NOERROR;
+}
+
+#ifdef __cplusplus
+}
+#endif
+#elif !OE_WIN32 // !NO_PROCESS_CACHE
+// process cache is turned off for network automation
+HRESULT GetMalloc(IMalloc FAR** ppMalloc);
+#endif //NO_PROCESS_CACHE
+
+
+// private NLS wrapper functions (for WIN32)
+
+#if OE_WIN32
+
+// functions defined in ANSI wrapper helper modules
+#define FASTCALL __fastcall
+HRESULT FASTCALL ConvertStringToW(LPCSTR, LPOLESTR *);
+HRESULT FASTCALL ConvertStringToA(LPCOLESTR, LPSTR *);
+
+
+#ifdef _X86_ // only for Chicago-compatibility
+ // nuke the A/W versions if they exist
+ #undef CompareString
+ #undef LCMapString
+ #undef GetLocaleInfo
+ #undef IsCharAlpha
+ #undef IsCharAlphaNumeric
+ #undef GetStringTypeEx
+
+// real helpers that either call the Wide version or xlat & call the Ansi
+EXTERN_C INTERNAL_(int)
+CompareString(LCID lcid, DWORD dwFlags,
+ LPWSTR lpwStr1, int cch1,
+ LPWSTR lpwStr2, int cch2);
+
+EXTERN_C INTERNAL_(int)
+LCMapString(LCID, unsigned long, const WCHAR FAR*, int, WCHAR FAR*, int);
+
+EXTERN_C INTERNAL_(int)
+GetLocaleInfo(LCID, LCTYPE, WCHAR FAR*, int);
+
+EXTERN_C INTERNAL_(int)
+IsCharAlpha(WCHAR ch);
+
+EXTERN_C INTERNAL_(int)
+IsCharAlphaNumeric(WCHAR ch);
+EXTERN_C INTERNAL_(int) GetStringTypeEx(
+ LCID Locale,
+ DWORD dwInfoType,
+ LPCWSTR lpSrcStr,
+ int cchSrc,
+ LPWORD lpCharType);
+#define GETSTRINGTYPE GetStringTypeEx
+
+#else //_X86_
+#define GETSTRINGTYPE GetStringTypeEx
+#endif //_X86_
+
+#endif //OE_WIN32
+
+#if OE_WIN16
+// private function in ole2nls.dll for use by ole2disp.dll.
+NLSAPI_(int) EXPORT
+RegisterNLSInfoChanged(FARPROC lpfnNotifyProc);
+
+// callback function in ole2disp.dll, called by ole2nls.dll when WIN.INI changes
+EXTERN_C void CALLBACK NLSInfoChangedHandler(void);
+#endif //OE_WIN16
+
+
+// debugging functions
+#ifdef _DEBUG /* { */
+
+INTERNAL_(int) FIsBadReadPtr(const void FAR* pv, unsigned int cb);
+INTERNAL_(int) FIsBadWritePtr(void FAR* pv, unsigned int cb);
+INTERNAL_(int) FIsBadCodePtr(void FAR* pv);
+INTERNAL_(int) FIsBadStringPtr(OLECHAR FAR* psz, unsigned int cchMax);
+INTERNAL_(int) FIsBadInterface(void FAR* pv, unsigned int cMethods);
+
+INTERNAL_(int) IsBadDispParams(DISPPARAMS FAR* pdispparams);
+INTERNAL_(int) IsBadReadSA(SAFEARRAY FAR* psa);
+INTERNAL_(int) IsBadWriteSA(SAFEARRAY FAR* psa);
+
+#if OE_MAC /* { */
+// We supply the following APIs, which arent available on the MAC.
+EXTERN_C INTERNAL_(int) IsBadReadPtr(const void FAR* lp, unsigned int cb);
+EXTERN_C INTERNAL_(int) IsBadWritePtr(void FAR* lp, unsigned int cb);
+EXTERN_C INTERNAL_(int) IsBadStringPtr(const OLECHAR FAR* lpsz, unsigned int cchMax);
+#endif /* } */
+
+HRESULT __inline
+ValidateReadPtr(const void FAR* pv, unsigned int cb)
+{ return FIsBadReadPtr(pv, cb) ? RESULT(E_INVALIDARG) : NOERROR; }
+
+HRESULT __inline
+ValidateWritePtr(void FAR* pv, unsigned int cb)
+{ return FIsBadWritePtr(pv, cb) ? RESULT(E_INVALIDARG) : NOERROR; }
+
+HRESULT __inline
+ValidateCodePtr(void FAR* pv)
+{ return FIsBadCodePtr(pv) ? RESULT(E_INVALIDARG) : NOERROR; }
+
+HRESULT __inline
+ValidateStringPtr(OLECHAR FAR* pv, unsigned int cchMax)
+{ return FIsBadStringPtr(pv, cchMax) ? RESULT(E_INVALIDARG) : NOERROR; }
+
+HRESULT __inline
+ValidateInterface(void FAR* pv, unsigned int cMethods)
+{ return FIsBadInterface(pv, cMethods) ? RESULT(E_INVALIDARG) : NOERROR; }
+
+#endif /* } _DEBUG */
+#endif /* } _OLEDISP_H_ */
diff --git a/private/oleauto/src/dispatch/oleguids.c b/private/oleauto/src/dispatch/oleguids.c
new file mode 100644
index 000000000..f90212e84
--- /dev/null
+++ b/private/oleauto/src/dispatch/oleguids.c
@@ -0,0 +1,27 @@
+/***
+*oleguids.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates (via Ole macro mania) the Ole GUIDS that are
+* referenced by the OLEDISP dll.
+*
+*Revision History:
+*
+* [00] 21-Jan-93 bradlo: Created.
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+// this redefines the Ole DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+// due to the previous header, including this causes our DEFINE_GUID
+// definitions in the following headers to actually allocate data.
+
+// instantiate the ole2 guids that we use
+#include "oleguids.h"
diff --git a/private/oleauto/src/dispatch/oleguids.h b/private/oleauto/src/dispatch/oleguids.h
new file mode 100644
index 000000000..f4a73b321
--- /dev/null
+++ b/private/oleauto/src/dispatch/oleguids.h
@@ -0,0 +1,71 @@
+/***
+*oleguids.h
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is a subset of the Ole2 guid header: coguid.h.
+*
+* This file is used to instantiate the data for the Ole2 IIDs that
+* are used in OLEDISP.DLL, rather than linking with the Ole2 implib,
+* which causes us to pull in way more IID and CLSID definitions than
+* we want.
+*
+* NOTE: the GUIDs below must be *exactly* the same as those assigned
+* by the Ole group - If the Ole group ever changes their numbers, we
+* must change accordingly.
+*
+*Revision History:
+*
+* [00] 19-Jan-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0);
+//DEFINE_OLEGUID(IID_IClassFactory, 0x00000001L, 0, 0);
+//DEFINE_OLEGUID(IID_IMalloc, 0x00000002L, 0, 0);
+//DEFINE_OLEGUID(IID_IMarshal, 0x00000003L, 0, 0);
+
+/* RPC related interfaces */
+//DEFINE_OLEGUID(IID_IRpcChannel, 0x00000004L, 0, 0);
+DEFINE_OLEGUID(IID_IRpcStub, 0x00000005L, 0, 0);
+//DEFINE_OLEGUID(IID_IStubManager, 0x00000006L, 0, 0);
+DEFINE_OLEGUID(IID_IRpcProxy, 0x00000007L, 0, 0);
+//DEFINE_OLEGUID(IID_IProxyManager, 0x00000008L, 0, 0);
+DEFINE_OLEGUID(IID_IPSFactory, 0x00000009L, 0, 0);
+
+DEFINE_GUID(IID_IPSFactoryBuffer,
+ 0xD5F569D0, 0x593B, 0x101A,
+ 0xB5,0x69,0x08,0x00,0x2B,0x2D,0xBF,0x7A);
+
+DEFINE_GUID(IID_IRpcProxyBuffer,
+ 0xD5F56A34,0x593B,0x101A,
+ 0xB5,0x69,0x08,0x00,0x2B,0x2D,0xBF,0x7A);
+
+DEFINE_GUID(IID_IRpcStubBuffer,
+ 0xD5F56AFC,0x593B,0x101A,
+ 0xB5,0x69,0x08,0x00,0x2B,0x2D,0xBF,0x7A);
+
+DEFINE_GUID(IID_IRpcChannelBuffer,
+ 0xD5F56B60,0x593B,0x101A,
+ 0xB5,0x69,0x08,0x00,0x2B,0x2D,0xBF,0x7A);
+
+
+/* storage related interfaces */
+//DEFINE_OLEGUID(IID_ILockBytes, 0x0000000aL, 0, 0);
+//DEFINE_OLEGUID(IID_IStorage, 0x0000000bL, 0, 0);
+DEFINE_OLEGUID(IID_IStream, 0x0000000cL, 0, 0);
+//DEFINE_OLEGUID(IID_IEnumSTATSTG, 0x0000000dL, 0, 0);
+
+/* moniker related interfaces */
+//DEFINE_OLEGUID(IID_IBindCtx, 0x0000000eL, 0, 0);
+//DEFINE_OLEGUID(IID_IMoniker, 0x0000000fL, 0, 0);
+//DEFINE_OLEGUID(IID_IRunningObjectTable, 0x00000010L, 0, 0);
+//DEFINE_OLEGUID(IID_IInternalMoniker, 0x00000011L, 0, 0);
+
diff --git a/private/oleauto/src/dispatch/olenames.h b/private/oleauto/src/dispatch/olenames.h
new file mode 100644
index 000000000..806384d6c
--- /dev/null
+++ b/private/oleauto/src/dispatch/olenames.h
@@ -0,0 +1,100 @@
+/*==========================================================================*
+ | olenames.h - redefinition of OLE function names for DLL entry points
+ |
+ | Purpose:
+ |
+ |
+ | Revision History:
+ |
+ |---------------------------------------------------------------------------
+ | Implementation Notes:
+ |
+ | The actual macros are generated via AWK from the OLE def files.
+ |
+ *==========================================================================*
+ | Copyright: (c) 1992, 1993 Microsoft Corporation, all rights reserved.
+ | Information Contained Herin is Proprietary and Confidential.
+ *==========================================================================*/
+
+
+
+#if !OE_MAC
+#error !This file is intended for Macintosh only
+#endif
+
+//==============================================================================
+//
+// MAC PPC Definitions
+//
+//==============================================================================
+#if OE_MACPPC
+#define ID_OLE_STAT_DOCFILE 0
+#define ID_OLE_STAT_USER 0
+#define ID_OLE_STAT_OLE2DISP 0
+#define ID_OLE_STAT_TYPELIB 0
+#define ID_OLE_STAT_DEF 0
+#define ID_OLE_STAT_COMPOBJ 0
+#define ID_OLE_STAT_PROXY 0
+#define ID_OLE_STAT_OLE2NLS 0
+
+#define ID_MUNGE_DLL_NAMES 0
+#define ID_MUNGE_STAT_NAMES 1
+
+#else // OE_MACPPC
+
+#if defined( OLENAMES_MUNGE_FOR_STATIC )
+
+#define ID_OLE_STAT_DOCFILE 1
+#define ID_OLE_STAT_USER 1
+#define ID_OLE_STAT_OLE2DISP 1
+#define ID_OLE_STAT_TYPELIB 1
+#define ID_OLE_STAT_DEF 1
+#define ID_OLE_STAT_COMPOBJ 1
+#define ID_OLE_STAT_PROXY 0
+#define ID_OLE_STAT_OLE2NLS 1
+
+#define ID_MUNGE_DLL_NAMES 0
+#define ID_MUNGE_STAT_NAMES 1
+
+#endif // OLENAMES_MUNGE_FOR_STATIC
+
+#if defined( OLENAMES_MUNGE_FOR_DLL ) // No DLL munging at this time,
+ // keep the functionality just in
+ // case we need it later!
+
+#define ID_OLE_STAT_DOCFILE 0
+#define ID_OLE_STAT_USER 0
+#define ID_OLE_STAT_OLE2DISP 0
+#define ID_OLE_STAT_TYPELIB 0
+#define ID_OLE_STAT_DEF 0
+#define ID_OLE_STAT_COMPOBJ 0
+#define ID_OLE_STAT_PROXY 0
+#define ID_OLE_STAT_OLE2NLS 0
+
+#define ID_MUNGE_DLL_NAMES 0
+#define ID_MUNGE_STAT_NAMES 0
+
+#endif // OLENAMES_MUNGE_FOR_DLL
+
+#endif// OE_MACPPC
+
+#include "namemacs.h"
+
+#if OE_MAC68K
+
+#undef ID_OLE_STAT_DOCFILE
+#undef ID_OLE_STAT_USER
+#undef ID_OLE_STAT_OLE2DISP
+#undef ID_OLE_STAT_TYPELIB
+#undef ID_OLE_STAT_DEF
+#undef ID_OLE_STAT_COMPOBJ
+#undef ID_OLE_STAT_PROXY
+#undef ID_OLE_STAT_OLE2NLS
+#undef ID_MUNGE_STAT_NAMES
+#undef ID_MUNGE_DLL_NAMES
+
+#undef OLENAMES_MUNGE_FOR_STATIC
+#undef OLENAMES_MUNGE_FOR_DLL
+
+#endif // OE_MAC68K
+
diff --git a/private/oleauto/src/dispatch/psfactry.cpp b/private/oleauto/src/dispatch/psfactry.cpp
new file mode 100644
index 000000000..94cb2d35f
--- /dev/null
+++ b/private/oleauto/src/dispatch/psfactry.cpp
@@ -0,0 +1,434 @@
+/***
+*psfactry.cpp - Implementation of the Ole programmability Proxy/Stub factory.
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the Ole Programmability Proxy/Stub Factory
+* class. Ole binds to an instance of this object when a client does
+* a QueryInterface to IID_IDispatch, and calls methods on the IPSFactory
+* interface to create instances of the IDispatch Proxy and Stub objects.
+* (more or less).
+*
+*Revision History:
+*
+* [00] 18-Sep-92 bradlo: Created.
+* [01] 06-Dec-92 bradlo: Added support for IEnumVARIANT
+* [02] 06-Mar-93 bradlo: Added support for ITypeInfo
+* [03] 28-May-93 tomteng: Added Unicode support
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+ASSERTDATA
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "clsid.h"
+#include "dispmrsh.h"
+#include "dispps.h"
+#include "evps.h"
+#include "tips.h"
+#include "tlps.h"
+#include "tcps.h"
+#include "ups.h"
+#include "psfactry.h"
+
+#if OE_WIN16
+# include <shellapi.h>
+#endif
+
+HRESULT ProxyStubCLSIDOfInterface(REFIID riid, CLSID FAR* pclsid);
+
+#if OE_WIN32
+// use the one from the wrappers
+STDAPI_(int) StringFromGUID2A(REFGUID rguid, char FAR* lpsz, int cbMax);
+#else //OE_WIN32
+#define StringFromGUID2A StringFromGUID2
+#endif
+
+IPSFACTORY FAR*
+COleAutomationPSFactory::Create()
+{
+ COleAutomationPSFactory FAR* ppsf;
+
+ if((ppsf = new FAR COleAutomationPSFactory()) != NULL)
+ ppsf->AddRef();
+
+ return ppsf;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+COleAutomationPSFactory::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else if(IsEqualIID(riid, IID_IPSFACTORY)){
+ *ppv = this;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ ++m_refs;
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(unsigned long)
+COleAutomationPSFactory::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+COleAutomationPSFactory::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IPSFactory Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+COleAutomationPSFactory::CreateProxy(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ IPROXY FAR* FAR* ppproxy,
+ void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+ IPROXY FAR* pproxy;
+ IUnknown FAR* punk;
+
+ *ppv = NULL;
+ *ppproxy = NULL;
+
+ if(IsEqualIID(riid, IID_IDispatch)){
+
+ punk = CProxDisp::Create(punkOuter, riid);
+
+ }else if(IsEqualIID(riid, IID_IEnumVARIANT)){
+
+ punk = CProxEnumVARIANT::Create(punkOuter);
+
+ }else if(IsEqualIID(riid, IID_ITypeInfo)){
+
+ punk = CProxTypeInfo::Create(punkOuter);
+
+ }else if(IsEqualIID(riid, IID_ITypeLib)){
+
+ punk = CProxTypeLib::Create(punkOuter);
+
+ }else if(IsEqualIID(riid, IID_ITypeComp)){
+
+ punk = CProxTypeComp::Create(punkOuter);
+
+ }else{
+
+ CLSID clsid;
+
+ IfFailRet(ProxyStubCLSIDOfInterface(riid, &clsid));
+
+ if(clsid == CLSID_PSDispatch){
+ punk = CProxDisp::Create(punkOuter, riid);
+ }
+ else
+ if(clsid == CLSID_PSAutomation){
+ IfFailRet(CProxUniv::Create(punkOuter, riid, &punk));
+ }
+ else{
+ return RESULT(E_FAIL);
+ }
+
+ }
+
+ if(punk == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LExit;
+ }
+
+ IfFailGo(
+ punk->QueryInterface(IID_IPROXY, (void FAR* FAR*)&pproxy),
+ LReleaseUnk);
+
+ IfFailGo(punk->QueryInterface(riid, ppv), LReleaseProxy);
+
+
+// Disable for now until OLE32.dll actual incorporate change
+#if defined(WIN32) && 0
+ // This code only applies to Daytona Beta1 (for backward compatibility)
+ // RemoteHandler will addref again, so release here...
+
+ DWORD dwBuildVersion;
+
+ dwBuildVersion = OleBuildVersion();
+ if ((HIWORD(dwBuildVersion) <= 23) && (LOWORD(dwBuildVersion) <= 772))
+ ((IUnknown FAR*) *ppv)->Release();
+#endif
+
+#if 0
+ ((IUnknown FAR*) *ppv)->Release();
+#endif
+
+ punk->Release();
+
+ *ppproxy = pproxy;
+
+ return NOERROR;
+
+LReleaseProxy:;
+ pproxy->Release();
+
+LReleaseUnk:;
+ punk->Release();
+
+LExit:;
+ return hresult;
+}
+
+
+STDMETHODIMP
+COleAutomationPSFactory::CreateStub(
+ REFIID riid,
+ IUnknown FAR* punkServer,
+ ISTUB FAR* FAR* ppstub)
+{
+ ISTUB FAR* pstub;
+ HRESULT hresult;
+
+ *ppstub = NULL;
+
+
+// Cario's CRemoteHdlr::CreateInterfaceStub implementation calls this
+// method with punkServer = NULL. Need to defer punkServer object assignment
+// until a Connect method is called on the stub.
+
+ if(punkServer != NULL) {
+
+ // Make sure that the requested riid is actually supported
+ // by the real server object.
+ //
+ IUnknown FAR* punkRequested;
+ IfFailRet(punkServer->QueryInterface(riid, (void FAR* FAR*)&punkRequested));
+ punkRequested->Release();
+ }
+
+ if(IsEqualIID(riid, IID_IDispatch)){
+
+ hresult = CStubDisp::Create(punkServer,
+#if (defined(WIN32) || defined(WOW))
+ riid,
+#endif
+ &pstub);
+
+ }else if(IsEqualIID(riid, IID_IEnumVARIANT)){
+
+ hresult = CStubEnumVARIANT::Create(punkServer, &pstub);
+
+ }else if(IsEqualIID(riid, IID_ITypeInfo)){
+
+ hresult = CStubTypeInfo::Create(punkServer, &pstub);
+
+ }else if(IsEqualIID(riid, IID_ITypeLib)){
+
+ hresult = CStubTypeLib::Create(punkServer, &pstub);
+
+ }else if(IsEqualIID(riid, IID_ITypeComp)){
+
+ hresult = CStubTypeComp::Create(punkServer, &pstub);
+
+ }else{
+
+ CLSID clsid;
+
+ IfFailRet(ProxyStubCLSIDOfInterface(riid, &clsid));
+
+ if(clsid == CLSID_PSDispatch){
+ hresult = CStubDisp::Create(punkServer,
+#if (defined(WIN32) || defined(WOW))
+ riid,
+#endif
+ &pstub);
+ }
+ else
+ if(clsid == CLSID_PSAutomation){
+ hresult = CStubUniv::Create(punkServer, riid, &pstub);
+ }
+ else{
+ hresult = RESULT(E_FAIL);
+ }
+ }
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ *ppstub = pstub;
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// PSFactory API
+//---------------------------------------------------------------------
+
+// Is the given CLSID one that we know how to make a class factory for?
+
+#if OE_MAC68K
+// This is called by the OLE APPLET's DllGetClassObject to determine if
+// this is one of OLE Automation's CLSID's
+STDAPI_(int)
+#else
+int
+#endif
+IsAutomationCLSID(REFCLSID rclsid)
+{
+ // UNDONE: could speed this up since the guids are contiguious
+ if(IsEqualCLSID(rclsid, CLSID_PSDispatch))
+ return 1;
+ if(IsEqualCLSID(rclsid, CLSID_PSTypeInfo))
+ return 1;
+ if(IsEqualCLSID(rclsid, CLSID_PSTypeLib))
+ return 1;
+ if(IsEqualCLSID(rclsid, CLSID_PSTypeComp))
+ return 1;
+ if(IsEqualCLSID(rclsid, CLSID_PSAutomation))
+ return 1;
+ if(IsEqualCLSID(rclsid, CLSID_PSEnumVARIANT))
+ return 1;
+ return 0;
+}
+
+
+// network automation replaces this routine (netprxcf.cpp)
+#if !defined(NETDISP)
+/***
+*PUBLIC HRESULT DllGetClassObject(REFCLSID, REFIID, void**)
+*Purpose:
+* Return the Class Object for the given CLSID.
+*
+*Entry:
+* rclsid = class id
+* riid = interface id
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppv = the class object for the given CLSID
+*
+***********************************************************************/
+STDAPI
+#if OE_MAC68K
+// This is called by the OLE APPLET's DllGetClassObject for our CLSID's
+AutomationDllGetClassObject(REFCLSID rclsid, REFIID riid, void FAR* FAR* ppv)
+#else
+DllGetClassObject(REFCLSID rclsid, REFIID riid, void FAR* FAR* ppv)
+#endif
+{
+
+#if OE_MAC68K
+ ASSERT(IsAutomationCLSID(rclsid));
+#else
+ *ppv = NULL;
+
+ if(!IsAutomationCLSID(rclsid))
+ return RESULT(E_UNEXPECTED);
+#endif
+
+ if((*ppv = (void FAR*) COleAutomationPSFactory::Create()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ return NOERROR;
+}
+#endif // !NETDISP
+
+
+/***
+* PUBLIC int IsValidDispInterface(REFIID)
+* Purpose:
+* Validate that the riid is a legal dispinterface.
+*
+* The registry database will have the following entries for dispinterface:
+* \Interface\{<iid of dispinterface>}= <dispinterface textual info>
+* \ProxyStubClsid={00020420-0000-0000-C000-000000000046}
+*
+* This routine queries the registry database using the riid passed in for
+* the above information. It return 0 if it fails and 1 if successful.
+***********************************************************************/
+
+// We want to use the ANSI Registry API here, so it's best if this function is
+// just pure ansi.
+// CONSIDER: use UNICODE registry api for UNICODE (RISC) builds?
+#ifdef UNICODE
+#undef UNICODE
+
+#undef STRCPY
+#define STRCPY strcpy
+#undef STRCAT
+#define STRCAT strcat
+#undef STRICMP
+#define STRICMP stricmp
+#undef RegQueryValue
+#define RegQueryValue RegQueryValueA
+
+#endif //UNICODE
+
+HRESULT
+ProxyStubCLSIDOfInterface(REFIID riid, CLSID FAR* pclsid)
+{
+ long cb;
+ char szKey[128], szValue[CCH_SZGUID0];
+static char szPSDispatch[] = "{00020420-0000-0000-C000-000000000046}";
+static char szPSAutomation[] = "{00020424-0000-0000-C000-000000000046}";
+
+ // Construct ProxyStubClsid key for dispinterface
+ STRCPY_A(szKey, "Interface\\");
+ StringFromGUID2A(riid, szKey+sizeof("Interface\\")-1, 40);
+#if OE_WIN32
+ STRCAT_A(szKey, "\\ProxyStubClsid32");
+#else
+ STRCAT_A(szKey, "\\ProxyStubClsid");
+#endif
+
+ // Check if valid dispinterface
+ cb = DIM(szValue);
+ if(RegQueryValue(HKEY_CLASSES_ROOT, szKey, szValue, &cb) != ERROR_SUCCESS)
+ return RESULT(REGDB_E_IIDNOTREG);
+
+ if(!STRICMP_A(szValue, szPSDispatch)){
+ *pclsid = CLSID_PSDispatch;
+ return NOERROR;
+ }
+
+ if(!STRICMP_A(szValue, szPSAutomation)){
+ *pclsid = CLSID_PSAutomation;
+ return NOERROR;
+ }
+
+ // No match
+ return RESULT(E_FAIL);
+}
+
+// WARNING: UNICODE is now turned OFF
+
+
+
diff --git a/private/oleauto/src/dispatch/psfactry.h b/private/oleauto/src/dispatch/psfactry.h
new file mode 100644
index 000000000..5c4dccf95
--- /dev/null
+++ b/private/oleauto/src/dispatch/psfactry.h
@@ -0,0 +1,52 @@
+/***
+*psfactry.h
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of automation proxy/stub factory.
+*
+*Revision History:
+*
+* [00] 06-Sep-94 erikc: Added header.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+#ifndef _PSFACTRY_H_
+#define _PSFACTRY_H_
+
+class FAR COleAutomationPSFactory : public IPSFACTORY
+{
+public:
+ static IPSFACTORY FAR* Create(void);
+
+ // IUnknown Methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IPSFactory Methods
+ //
+ STDMETHOD(CreateProxy)(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ IPROXY FAR* FAR* ppproxy,
+ void FAR* FAR* ppv);
+
+ STDMETHOD(CreateStub)(
+ REFIID riid, IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub);
+
+ COleAutomationPSFactory(){
+ m_refs = 0;
+ }
+
+private:
+
+ unsigned long m_refs;
+};
+
+#endif // _PSFACTRY_H_
+
diff --git a/private/oleauto/src/dispatch/sarray.cpp b/private/oleauto/src/dispatch/sarray.cpp
new file mode 100644
index 000000000..75b8997da
--- /dev/null
+++ b/private/oleauto/src/dispatch/sarray.cpp
@@ -0,0 +1,1713 @@
+/***
+sarray.cpp - SafeArray Runtime
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the SafeArray runtime support for the Ole
+* programmability component.
+*
+*Revision History:
+*
+* [00] 27-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+* The bounds are indexed from 0, however the dimentions are
+* indexed from 1. ie, the first dimention is 1.
+*
+* The bounds are stored in the rgsabound array 'backwards', from N to 0.
+* (the bounds for array index N are at index 0 in the rgsabound array,
+* and so on). This was done to optimize array address computation.
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+#include <limits.h>
+
+#ifdef _MAC
+ #define PHDATA ((void *) psa->handle)
+ #define PVDATA *(psa->handle)
+ #define HANDLELOCK HLock(psa->handle); psa->pvData = *(psa->handle)
+ #define HANDLEUNLOCK HUnlock(psa->handle)
+#else
+ #define PHDATA psa->pvData
+ #define PVDATA psa->pvData
+ #define HANDLELOCK
+ #define HANDLEUNLOCK
+#endif
+
+#define SAFEARRAYOVERFLOW 0xffffffff
+
+ASSERTDATA
+
+
+// network automation does not need these routines
+#if !defined(NETDISP)
+#ifdef WIN16 // {
+
+
+// hSizeToAlloc & hAccessElement (from satishc) supports Win16 huge
+// arrays. Logic supports SafeArrays that can be allocated with
+// all elements up to 65535. Also support huge array that does not
+// neccessarily have to begin at a segment boundary. For example, EXCEL
+// put in a 6-byte data field before the beginning of the data array
+// (data array starts at SEMENT:0006).
+//
+
+INTERNAL_(unsigned long)
+hSizeToAlloc(LPSAFEARRAY psa, unsigned long iActual)
+{
+ unsigned long iSegPad = 65536 % psa->cbElements; // pad per segment.
+ unsigned long cSeg = iActual / (65536 - iSegPad); // number of segment
+ // needed for the array
+
+ // Since we are adding an extra element to take care of possible
+ // misalignment in the first segment, we can reduce the per segmemnt
+ // pad count by 1.
+ return (iActual + iSegPad*cSeg + psa->cbElements);
+}
+
+
+INTERNAL_(void HUGEP*)
+hAccessElement(
+ LPSAFEARRAY psa,
+ unsigned long lIndex
+)
+{
+ unsigned long cbFirst = (unsigned long) (65536 - LOWORD(psa->pvData));
+ unsigned long cElemFirst = cbFirst / psa->cbElements;
+ void HUGEP* pdata;
+ unsigned long offset;
+
+ if (cElemFirst > lIndex)
+ pdata = (void HUGEP*) ((BYTE HUGEP*) psa->pvData +
+ (lIndex * psa->cbElements));
+ else {
+ unsigned long cElemSeg = (unsigned long) (65536 / psa->cbElements);
+ unsigned long cbSeg;
+ lIndex -= cElemFirst;
+ cbSeg = (unsigned long) (lIndex / cElemSeg);
+ offset = (lIndex % cElemSeg) * psa->cbElements;
+ pdata = (void HUGEP*) ((BYTE HUGEP*) psa->pvData +
+ cbFirst +
+ (cbSeg * 65536) +
+ offset);
+
+ }
+ return pdata;
+}
+
+INTERNAL_(void HUGEP*)
+hAccessElement(
+ void HUGEP* pvData,
+ unsigned short cbElements,
+ unsigned long lIndex
+)
+{
+ unsigned long cbFirst = (unsigned long) (65536 - LOWORD(pvData));
+ unsigned long cElemFirst = cbFirst / cbElements;
+ void HUGEP* pdata;
+ unsigned long offset;
+
+ if (cElemFirst > lIndex)
+ pdata = (void HUGEP*) ((BYTE HUGEP*) pvData +
+ (lIndex * cbElements));
+ else {
+ unsigned long cElemSeg = (unsigned long) (65536 / cbElements);
+ unsigned long cbSeg;
+ lIndex -= cElemFirst;
+ cbSeg = (unsigned long) (lIndex / cElemSeg);
+ offset = (lIndex % cElemSeg) * cbElements;
+ pdata = (void HUGEP*) ((BYTE HUGEP*) pvData +
+ cbFirst +
+ (cbSeg * 65536) +
+ offset);
+ }
+ return pdata;
+}
+
+INTERNAL_(void)
+hmemset(void HUGEP* pv, int val, unsigned long size)
+{
+ size_t cb;
+ char HUGEP* pdata;
+
+ pdata = (char HUGEP*)pv;
+
+ // compute the # of bytes to the end of the current segment.
+ cb = (size_t)((unsigned long)UINT_MAX + (unsigned long)1 - ((unsigned long)pdata&(unsigned long)UINT_MAX));
+
+ if(size <= cb){
+ // easy, the entire area fits within the current segment
+ MEMSET(pdata, val, (size_t)size);
+ return;
+ }
+
+ // clear out to the end of the current segment.
+ MEMSET(pdata, val, cb);
+ size -= cb;
+ pdata += cb;
+
+ // loop through the remaining segments
+ while(size > 0){
+ // we assume were at the beginning of a segment here...
+ ASSERT((unsigned short)pdata == 0);
+
+ if(size <= UINT_MAX){
+ MEMSET(pdata, val, (size_t)size);
+ break;
+ }
+
+ // otherwise, fill as much as we can with one call to memset
+
+ MEMSET(pdata, val, UINT_MAX);
+
+ // the following leaves us pointing @ the last byte of the segment.
+ pdata += UINT_MAX;
+ ASSERT((unsigned short)pdata == 0xffff);
+
+ // fill the last byte of the segment, and move on to the next segment.
+ *pdata++ = (char)val;
+
+ size -= ((unsigned long)UINT_MAX+1UL);
+ }
+}
+
+
+
+#define HMEMSET(DST, VAL, SIZE) hmemset(DST, VAL, SIZE)
+#define HMEMCPY(DST, SRC, SIZE) hmemcpy(DST, SRC, SIZE)
+
+#else // }{
+
+#define HMEMSET(DST, VAL, SIZE) MEMSET(DST, VAL, (size_t)SIZE)
+#define HMEMCPY(DST, SRC, SIZE) MEMCPY(DST, SRC, (size_t)SIZE)
+
+#endif // }
+
+
+/***
+*PRIVATE SAFEARRAY* SafeArrayAllocDescriptor(unsigned int, SAFEARRAY**)
+*Purpose:
+* Allocate a SafeArray descriptor for an array with the given number
+* of dimentions.
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+SafeArrayAllocDescriptor(unsigned int cDims, SAFEARRAY FAR* FAR* ppsaOut)
+{
+ int cb;
+ SAFEARRAY FAR* psa;
+
+#ifdef _DEBUG
+ if(cDims == 0)
+ return RESULT(E_INVALIDARG);
+#endif
+
+ cb = sizeof(SAFEARRAY) + (((int)cDims - 1) * sizeof(SAFEARRAYBOUND));
+
+ if((psa = (SAFEARRAY FAR*)new FAR unsigned char[cb]) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ MEMSET(psa, 0, cb);
+
+ psa->cDims = cDims;
+
+ *ppsaOut = psa;
+
+ return NOERROR;
+}
+
+
+STDAPI
+SafeArrayAllocData(SAFEARRAY FAR* psa)
+{
+ unsigned long cbSize;
+
+ if(psa == NULL)
+ return RESULT(E_INVALIDARG);
+
+#ifdef _DEBUG
+ if(IsBadWriteSA(psa))
+ return RESULT(E_INVALIDARG);
+#endif
+
+#ifdef WIN16
+ unsigned long cbActual = SafeArraySize(psa);
+ if (cbActual == SAFEARRAYOVERFLOW) {
+ return RESULT(E_OUTOFMEMORY);
+ }
+ cbSize = hSizeToAlloc(psa, cbActual);
+ if (cbSize < cbActual) // error if adding padding overflowed us
+ return RESULT(E_OUTOFMEMORY);
+#else
+ cbSize = SafeArraySize(psa);
+ if (cbSize == SAFEARRAYOVERFLOW) {
+ return RESULT(E_OUTOFMEMORY);
+ }
+#endif
+
+#ifdef _MAC
+ psa->pvData = NULL;
+ if ((psa->handle = NewHandle(cbSize)) == 0)
+ return RESULT(E_OUTOFMEMORY);
+
+ // zero out the allocated data
+ HLock(psa->handle);
+ HMEMSET(*(psa->handle), 0, cbSize);
+ HUnlock(psa->handle);
+
+ return NOERROR;
+#else
+ IMalloc FAR* pmalloc;
+
+ IfFailRet(GetMalloc(&pmalloc));
+
+ psa->pvData = pmalloc->Alloc(cbSize);
+
+ if(psa->pvData == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ // REVIEW: temporary until we allocate in moveable memory
+ //IfMac(psa->handle = (Handle)&psa->pvData);
+
+ // zero out the allocated data
+
+ HMEMSET(psa->pvData, 0, cbSize);
+
+ return NOERROR;
+#endif
+}
+
+
+/***
+*PUBLIC SAFEARRAY* SafeArrayCreate(VARTYPE, unsigned int, SAFEARRAYBOUND*)
+*Purpose:
+* Create and return a SafeArray of the given VARTYPE, with the
+* given number of dimentions and with the given bounds.
+*
+*Entry:
+* vt = the VARTYPE of the array that is to be created
+* cDims = count of the number of dimentions of the array
+* rgbound = the array bounds
+*
+*Exit:
+* return value = SAFEARRAY*, NULL if unable to create.
+*
+***********************************************************************/
+STDAPI_(SAFEARRAY FAR*)
+SafeArrayCreate(VARTYPE vt, unsigned int cDims, SAFEARRAYBOUND FAR* rgsabound)
+{
+ unsigned int i;
+ HRESULT hresult;
+ SAFEARRAY FAR* psa;
+ unsigned short size, features;
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(rgsabound, sizeof(SAFEARRAYBOUND) * cDims))
+ return NULL;
+#endif
+
+ // Check that safearraybound dimension elements are greater than zero
+ // (Oleprog#302)
+ for (i = 0; i < cDims; i++)
+ if (rgsabound[i].cElements < 1)
+ return NULL;
+
+ if(cDims == 0)
+ return NULL;
+
+ features = 0;
+
+ // Note: the types that are legal for arrays are slightly different
+ // than the types that can be held by a VARIANT or VARIANTARG.
+ //
+ switch(vt){
+
+#if VBA2
+ case VT_UI1:
+ size = sizeof(char);
+ break;
+#endif
+
+ case VT_I2:
+ case VT_BOOL:
+ size = sizeof(short);
+ break;
+
+ case VT_I4:
+ case VT_ERROR:
+ case VT_R4:
+ size = sizeof(long);
+ break;
+
+ case VT_R8:
+ case VT_CY:
+ case VT_DATE:
+ size = sizeof(double);
+ break;
+
+ case VT_BSTR:
+ features = FADF_BSTR;
+ size = sizeof(BSTR);
+ break;
+
+ case VT_VARIANT:
+ features = FADF_VARIANT;
+ size = sizeof(VARIANT);
+ break;
+
+ case VT_UNKNOWN:
+ features = FADF_UNKNOWN;
+ size = sizeof(IUnknown FAR*);
+ break;
+
+ case VT_DISPATCH:
+ features = FADF_DISPATCH;
+ size = sizeof(IDispatch FAR*);
+ break;
+
+ default:
+ return NULL;
+ }
+
+ IfFailGo(SafeArrayAllocDescriptor(cDims, &psa), LError0);
+
+ psa->cDims = cDims;
+ psa->cbElements = size;
+ psa->fFeatures = features;
+
+ // the bounds are stored in the array descriptor in reverse-textual
+ // order, but are passed to this routine in textual order - so reverse
+ // as we copy them into the array
+
+ for(i = 0; i < cDims; ++i){
+ psa->rgsabound[i] = rgsabound[cDims-i-1];
+ }
+
+ IfFailGo(SafeArrayAllocData(psa), LError1);
+
+ return psa;
+
+LError1:;
+ SafeArrayDestroy(psa);
+
+LError0:;
+ return NULL;
+}
+
+
+/***
+*PRIVATE void ReleaseResources(void*, unsigned long, unsigned short, unsigned short/long)
+*Purpose:
+* Release any resources held by the given chunk of memory.
+*
+*Entry:
+* pv = the chunk
+* cbSize = the size of the chunk in bytes
+* fFeatures = features bits describing the chunk
+* cbElement = the size of each element of the chunk
+*
+*Exit:
+* return value =
+*
+***********************************************************************/
+// release the resources held by the given chunk of memory
+INTERNAL_(void)
+ReleaseResources(
+ void HUGEP* pv,
+ unsigned long cbSize,
+ unsigned short fFeatures,
+#ifdef WIN32
+ unsigned long cbElement
+#else //WIN32
+ unsigned short cbElement
+#endif //WIN32
+)
+{
+ unsigned long i, cElements;
+
+ cElements = cbSize / cbElement;
+
+ if(fFeatures & FADF_BSTR){
+#ifdef WIN16
+ for(i = 0; i < cElements; ++i)
+ SysFreeString(*(BSTR HUGEP*) hAccessElement(pv, cbElement, i));
+#else
+ BSTR HUGEP* pbstr;
+
+ pbstr = (BSTR HUGEP*)pv;
+ for(i = 0; i < cElements; ++i)
+ SysFreeString(*pbstr++);
+#endif
+
+
+ }else if(fFeatures & FADF_UNKNOWN){
+
+ IUnknown FAR* HUGEP* ppunk;
+
+#ifdef WIN16
+ for(i = 0; i < cElements; ++i) {
+ ppunk = (IUnknown FAR* HUGEP*) hAccessElement(pv, cbElement, i);
+ if(*ppunk != NULL)
+ (*ppunk)->Release();
+ }
+#else
+ ppunk = (IUnknown FAR* HUGEP*)pv;
+ for(i = 0; i < cElements; ++i){
+ if(*ppunk != NULL)
+ (*ppunk)->Release();
+ ++ppunk;
+ }
+#endif
+
+ }else if(fFeatures & FADF_DISPATCH){
+
+ IDispatch FAR* HUGEP* ppdisp;
+
+#ifdef WIN16
+ for(i = 0; i < cElements; ++i) {
+ ppdisp = (IDispatch FAR* HUGEP*) hAccessElement(pv, cbElement, i);
+ if(*ppdisp != NULL)
+ (*ppdisp)->Release();
+ }
+#else
+ ppdisp = (IDispatch FAR* HUGEP*)pv;
+ for(i = 0; i < cElements; ++i){
+ if(*ppdisp != NULL)
+ (*ppdisp)->Release();
+ ++ppdisp;
+ }
+#endif
+
+
+ }else if(fFeatures & FADF_VARIANT){
+#ifdef WIN16
+ for(i = 0; i < cElements; ++i)
+ VariantClear((VARIANT HUGEP*) hAccessElement(pv, cbElement, i));
+#else
+ VARIANT HUGEP* pvar;
+
+ pvar = (VARIANT HUGEP*)pv;
+ for(i = 0; i < cElements; ++i)
+ VariantClear(pvar++);
+#endif
+
+ }
+}
+
+
+/***
+*PRIVATE HRESULT SafeArrayDestroyData(SAFEARRAY*)
+*Purpose:
+* Release the contents of the given SafeArray.
+*
+*Entry:
+* psa = pointer the the array descriptor of the array to erase
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+SafeArrayDestroyData(SAFEARRAY FAR* psa)
+{
+ unsigned long cbSize;
+
+ if(psa == NULL)
+ return NOERROR;
+
+ if(psa->cLocks > 0)
+ return RESULT(DISP_E_ARRAYISLOCKED);
+
+ if(PHDATA == NULL)
+ return NOERROR;
+
+#ifdef _DEBUG
+ if(IsBadWriteSA(psa))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ HANDLELOCK;
+
+ cbSize = SafeArraySize(psa);
+ ASSERT(cbSize != SAFEARRAYOVERFLOW); // existing array, no overflow possible
+
+#if ID_DEBUG
+ // only check the pointer if it points to a non-zero sized allocation.
+ // In this case, the Chicago IMalloc returns a valid pointer, but
+ // IsBadWritePtr fails.
+ if (cbSize) {
+#ifdef _MAC
+ HANDLELOCK;
+ if(IsBadWritePtr(psa->pvData, 1)) {
+ HANDLEUNLOCK;
+ return RESULT(E_INVALIDARG);
+ }
+ HANDLEUNLOCK;
+#else
+ if(IsBadWritePtr(psa->pvData, 1))
+ return RESULT(E_INVALIDARG);
+#endif
+ }
+#endif //ID_DEBUG
+
+ ReleaseResources(
+ psa->pvData,
+ cbSize,
+ psa->fFeatures,
+ psa->cbElements);
+
+ if(psa->fFeatures & FADF_STATIC){
+#ifdef WIN16
+ if (psa->fFeatures & FADF_EMBEDDED)
+ // Assume embedded can't be huge. Only zero out actual
+ // amount used.
+ MEMSET(psa->pvData, 0, (UINT)cbSize);
+ else
+ HMEMSET(psa->pvData, 0, hSizeToAlloc(psa, cbSize));
+ // hSizeToAlloc can't overflow here (couldn't have created it)
+#else
+ HMEMSET(psa->pvData, 0, cbSize);
+#endif
+ }
+
+ if((psa->fFeatures & (FADF_AUTO|FADF_STATIC|FADF_EMBEDDED)) == 0 ||
+ (psa->fFeatures & FADF_FORCEFREE)){
+
+ // If none of the allocation attribute bits are set, then the
+ // array is dynamically allocated, and we need to free it.
+
+ HANDLEUNLOCK;
+
+#ifdef _MAC
+ DisposeHandle(psa->handle);
+ psa->handle = 0;
+ psa->pvData = 0;
+#else
+ IMalloc FAR* pmalloc;
+ IfFailRet(GetMalloc(&pmalloc));
+ pmalloc->Free(psa->pvData);
+ psa->pvData = NULL;
+#endif
+ }
+ return NOERROR;
+}
+
+/***
+*PUBLIC HRESULT SafeArrayDestroyDescriptor(SAFEARRAY*)
+*Purpose:
+* Free the given SafeArray descriptor.
+*
+*Entry:
+* psa - the SafeArray descriptor to release.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+SafeArrayDestroyDescriptor(SAFEARRAY FAR* psa)
+{
+ if(psa == NULL)
+ return NOERROR;
+
+#ifdef _DEBUG
+ if(IsBadWriteSA(psa))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ // cannot destroy an array that is still locked
+ if(psa->cLocks > 0)
+ return RESULT(DISP_E_ARRAYISLOCKED);
+
+ delete psa;
+
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayDestroy(SAFEARRAY*)
+*Purpose:
+* Free the given SafeArray.
+*
+*REVIEW: what happens if we destroy an array that is locked?
+*
+*Entry:
+* psa = the SafeArray descriptor of the array to free.
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* E_INVALIDARG
+* DISP_E_ARRAYISLOCKED
+*
+***********************************************************************/
+STDAPI
+SafeArrayDestroy(SAFEARRAY FAR* psa)
+{
+ if(psa == NULL)
+ return NOERROR;
+#ifdef _DEBUG
+ if(IsBadWriteSA(psa))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ // cannot destroy an array that is still locked
+ if(psa->cLocks > 0)
+ return RESULT(DISP_E_ARRAYISLOCKED);
+
+ if(PHDATA != NULL){
+ IfFailRet(SafeArrayDestroyData(psa));
+ }
+
+ if(!(psa->fFeatures & (FADF_AUTO|FADF_STATIC|FADF_EMBEDDED)) ||
+ (psa->fFeatures & FADF_FORCEFREE))
+ delete psa;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT SafeArrayRedim(SAFEARRAY*, SAFEARRAYBOUND**)
+*Purpose:
+* Realloc the given array, using the given SAFEARRAYBOUND as
+* the new bounds for the least significant dimention of the
+* given array (the textually rightmost dimention).
+*
+* Note: this routine only supports changing the size of the
+* last dimention!
+*
+* The routine preserves the contents of the given array, that
+* fall within the bounds of the new array. If the new array
+* is smaller, then any resources held by the old array that
+* do not fall in the new array are released. If the new
+* array is larger, then the newly allocated memory is zero
+* filled.
+*
+*
+*Entry:
+* psa = the SafeArray to re-allocate
+* psabounds = the new bounds for the least significant index
+* (textually rightmost index)
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+SafeArrayRedim(
+ SAFEARRAY FAR* psa,
+ SAFEARRAYBOUND FAR* psaboundNew)
+{
+ HRESULT hresult;
+ void HUGEP* pvTmp;
+ void HUGEP* pvData;
+ long cbDelta;
+ unsigned long cbSizeNew, cbSizeOld;
+#ifdef WIN16
+ void HUGEP* pvDataEnd;
+ unsigned long cb, i, cbOldActual, cbNewActual, cOld, cNew, cDelta;
+#endif
+ SAFEARRAYBOUND saboundOld;
+
+ if(psa == NULL)
+ return RESULT(E_INVALIDARG);
+#ifdef _DEBUG
+ if(IsBadWriteSA(psa))
+ return RESULT(E_INVALIDARG);
+ if(IsBadReadPtr(psaboundNew, sizeof(*psaboundNew)))
+ return RESULT(E_INVALIDARG);
+ if(psa->cDims == 0)
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if(psa->cLocks > 0 || psa->fFeatures & FADF_FIXEDSIZE)
+ return RESULT(DISP_E_ARRAYISLOCKED);
+
+ pvTmp = NULL;
+
+#ifdef _MAC
+ Handle oldHandle = NULL, tmpHandle, reallocHandle;
+ HLock(psa->handle);
+ psa->pvData = *(psa->handle);
+#else
+ IMalloc FAR* pmalloc;
+ pmalloc = NULL;
+ IfFailGo(GetMalloc(&pmalloc), LError0);
+#endif
+
+#ifdef WIN16
+ cbOldActual = SafeArraySize(psa);
+ ASSERT(cbOldActual != SAFEARRAYOVERFLOW); // existing array, no overflow possible
+ cbSizeOld = hSizeToAlloc(psa, cbOldActual);
+ // hSizeToAlloc can't overflow here (couldn't have created it)
+ cOld = cbOldActual/psa->cbElements;
+#else
+ cbSizeOld = SafeArraySize(psa);
+ ASSERT(cbSizeOld != SAFEARRAYOVERFLOW); // existing array, no overflow possible
+#endif
+
+ // save the old bounds so we can restore if the realloc fails
+ saboundOld = psa->rgsabound[0];
+ psa->rgsabound[0] = *psaboundNew;
+
+
+#ifdef WIN16
+ cbNewActual = SafeArraySize(psa);
+ if (cbNewActual == SAFEARRAYOVERFLOW) {
+ goto OOMError;
+ }
+ cbSizeNew = hSizeToAlloc(psa, cbNewActual);
+
+ if (cbSizeNew < cbNewActual) { // error if adding padding overflowed us
+OOMError:
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ cNew = cbNewActual/psa->cbElements;
+ // needed for the copy if old has more elements than new.
+ cDelta = (cbOldActual - cbNewActual)/psa->cbElements;
+#else
+ cbSizeNew = SafeArraySize(psa);
+ if (cbSizeNew == SAFEARRAYOVERFLOW) {
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+#endif
+
+ // Reallocing to size zero will return NULL, which we're not prepared
+ // to handle (VBA94 Bug #4665). So always alloc at least one byte.
+ //
+ if (cbSizeNew == 0) {
+ cbSizeNew = 1;
+ }
+
+ cbDelta = cbSizeNew - cbSizeOld;
+
+ if(cbDelta == 0){
+ hresult = NOERROR;
+ goto LError0;
+ }
+
+ if(cbDelta < 0){
+
+ // the new array is smaller, so copy any resources held by the
+ // old array that wont fit into the new array to a temporary
+ // location so that we can free them if the realloc succeeds.
+
+ if(psa->fFeatures & (FADF_BSTR|FADF_UNKNOWN|FADF_DISPATCH|FADF_VARIANT)) {
+
+#ifdef _MAC
+ if((tmpHandle = NewHandle(-cbDelta)) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ HLock(tmpHandle);
+ pvTmp = *tmpHandle;
+#else
+ if((pvTmp = (void HUGEP*)pmalloc->Alloc(-cbDelta)) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+#endif
+
+#ifdef WIN16
+ cb = (unsigned long) psa->rgsabound[0].cElements;
+ for(i = 1; i < psa->cDims; ++i){
+ cb *= psa->rgsabound[i].cElements;
+ }
+ pvData = hAccessElement(psa, cb);
+ if(psa->fFeatures & (FADF_BSTR | FADF_UNKNOWN | FADF_DISPATCH) ){
+
+ // Since these are all pointer, we'll just copy them as 4 byte
+ // elements.
+ for(i = 0; i < cDelta; ++i)
+ *(unsigned long HUGEP*) hAccessElement(pvTmp, sizeof(unsigned long), i)=
+ *(unsigned long HUGEP*) hAccessElement(pvData, sizeof(unsigned long), i);
+
+ }else if(psa->fFeatures & FADF_VARIANT){
+
+ for(i = 0; i < cDelta; ++i)
+ *(VARIANT HUGEP*) hAccessElement(pvTmp, sizeof(VARIANT), i) =
+ *(VARIANT HUGEP*) hAccessElement(pvData, sizeof(VARIANT), i);
+ }
+#else
+ pvData = (void HUGEP*)((char HUGEP*)psa->pvData + cbSizeNew);
+ HMEMCPY(pvTmp, pvData, -cbDelta);
+#endif
+ }
+ }
+
+//[CSK]: Note that there will be a problem here if huge allocation
+//[CSK]: do not always begin at the same :OFFSET in the first
+//[CSK]: segment. With EbApp's & Excel's allocator this is
+//[CSK]: currently not a problem since they defer to Halloc
+//[CSK]: and prefixes are always of fixed size.
+//[CSK]: I am not sure if this will always be true.
+#ifdef _MAC
+ if ((reallocHandle = NewHandle(cbSizeNew)) == 0) {
+ psa->rgsabound[0] = saboundOld; // restore original state
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ HLock(reallocHandle);
+ if (cbSizeNew <= cbSizeOld)
+ HMEMCPY(*reallocHandle, *(psa->handle), cbSizeNew);
+ else
+ HMEMCPY(*reallocHandle, *(psa->handle), cbSizeOld);
+
+ oldHandle = psa->handle;
+ psa->handle = reallocHandle;
+ psa->pvData = *reallocHandle;
+
+
+#else
+ if((pvData = pmalloc->Realloc(psa->pvData, cbSizeNew)) == NULL){
+ psa->rgsabound[0] = saboundOld; // restore original state
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ psa->pvData = pvData;
+#endif
+
+
+ if(cbDelta < 0){
+
+ // new array is smaller, so release resources that got chopped off.
+ if(pvTmp != NULL){
+#ifdef WIN16
+ ReleaseResources(pvTmp, cbOldActual - cbNewActual, psa->fFeatures, psa->cbElements);
+#else
+ ReleaseResources(pvTmp, -cbDelta, psa->fFeatures, psa->cbElements);
+#endif
+ }
+
+ }else{ // cbDelta > 0
+
+ // the new array is large, so zero fill the newly allocated memory
+#ifdef WIN16
+ pvData = hAccessElement(psa, cOld);
+ pvDataEnd = hAccessElement(psa, cNew);
+ HMEMSET(pvData, 0, (BYTE HUGEP*) pvDataEnd - (BYTE HUGEP*) pvData);
+#else
+ pvData = (void HUGEP*)((char HUGEP*)psa->pvData + cbSizeOld);
+ HMEMSET(pvData, 0, cbDelta);
+#endif
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+#ifndef _MAC
+ if(pvTmp != 0){
+ ASSERT(pmalloc != NULL);
+ pmalloc->Free(pvTmp);
+ }
+#else
+ if(pvTmp != 0){
+ HUnlock(tmpHandle);
+ DisposeHandle(tmpHandle);
+ }
+ if (oldHandle) {
+ HUnlock(oldHandle);
+ DisposeHandle(oldHandle);
+ }
+
+ HUnlock(psa->handle);
+#endif
+
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayCopy(SAFEARRAY*, SAFEARRAY**)
+*Purpose:
+* Return a copy of the given SafeArray.
+*
+*Entry:
+* psa = pointer to the SafeArray to copy
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+* E_OUTOFMEMORY
+*
+* *ppsaOut = a copy of the given SafeArray
+*
+***********************************************************************/
+STDAPI
+SafeArrayCopy(SAFEARRAY FAR* psa, SAFEARRAY FAR* FAR* ppsaOut)
+{
+ unsigned long i;
+ unsigned long cbSize;
+ unsigned long cElements;
+ HRESULT hresult;
+ SAFEARRAY FAR* psaNew;
+
+ if(psa == NULL){
+ *ppsaOut = NULL;
+ return NOERROR;
+ }
+
+#ifdef _DEBUG
+ if(IsBadReadSA(psa))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(ppsaOut, sizeof(*ppsaOut)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailRet(SafeArrayAllocDescriptor(psa->cDims, &psaNew));
+
+ psaNew->cLocks = 0;
+ psaNew->cDims = psa->cDims;
+ psaNew->fFeatures = psa->fFeatures &
+ ~(FADF_AUTO|FADF_STATIC|FADF_EMBEDDED|FADF_FORCEFREE);
+
+ psaNew->cbElements = psa->cbElements;
+
+ MEMCPY(
+ psaNew->rgsabound,
+ psa->rgsabound,
+ sizeof(SAFEARRAYBOUND) * psa->cDims);
+
+ IfFailGo(SafeArrayAllocData(psaNew), LError0);
+
+ IfFailGo(SafeArrayLock(psa), LError0);
+
+ IfFailGo(SafeArrayLock(psaNew), LError1);
+
+ cbSize = SafeArraySize(psa);
+ ASSERT(cbSize != SAFEARRAYOVERFLOW); // existing array, no overflow possible
+
+ cElements = cbSize / psa->cbElements;
+
+ if(psa->fFeatures & FADF_BSTR){
+
+#ifdef WIN16
+ BSTR bstrSrc;
+ for(i = 0; i < cElements; ++i) {
+ bstrSrc = *(BSTR HUGEP*) hAccessElement(psa, i);
+ IfFailGo(ErrStringCopy(
+ bstrSrc,
+ (BSTR HUGEP*) hAccessElement(psaNew, i)),
+ LError2);
+ }
+#else
+ BSTR HUGEP* pbstrDst, HUGEP* pbstrSrc;
+
+ pbstrSrc = (BSTR HUGEP*)psa->pvData;
+ pbstrDst = (BSTR HUGEP*)psaNew->pvData;
+
+ for(i = 0; i < cElements; ++i){
+ IfFailGo(ErrStringCopy(*pbstrSrc, pbstrDst), LError2);
+ ++pbstrDst, ++pbstrSrc;
+ }
+#endif
+
+ }else if(psa->fFeatures & FADF_UNKNOWN){
+
+ IUnknown FAR* HUGEP* ppunkDst, FAR* HUGEP* ppunkSrc;
+
+#ifdef WIN16
+ for(i = 0; i < cElements; ++i) {
+ ppunkSrc = (IUnknown FAR* HUGEP*) hAccessElement(psa, i);
+ ppunkDst = (IUnknown FAR* HUGEP*) hAccessElement(psaNew, i);
+ if(*ppunkSrc != NULL)
+ (*ppunkSrc)->AddRef();
+ *ppunkDst = *ppunkSrc;
+ }
+#else
+ ppunkSrc = (IUnknown FAR* HUGEP*)psa->pvData;
+ ppunkDst = (IUnknown FAR* HUGEP*)psaNew->pvData;
+
+ for(i = 0; i < cElements; ++i){
+ if(*ppunkSrc != NULL)
+ (*ppunkSrc)->AddRef();
+ *ppunkDst = *ppunkSrc;
+ ++ppunkDst, ++ppunkSrc;
+ }
+#endif
+
+ }else if(psa->fFeatures & FADF_DISPATCH){
+
+ IDispatch FAR* HUGEP* ppdispDst, FAR* HUGEP* ppdispSrc;
+
+#ifdef WIN16
+ for(i = 0; i < cElements; ++i) {
+ ppdispSrc = (IDispatch FAR* HUGEP*) hAccessElement(psa, i);
+ ppdispDst = (IDispatch FAR* HUGEP*) hAccessElement(psaNew, i);
+ if(*ppdispSrc != NULL)
+ (*ppdispSrc)->AddRef();
+ *ppdispDst = *ppdispSrc;
+ }
+#else
+ ppdispSrc = (IDispatch FAR* HUGEP*)psa->pvData;
+ ppdispDst = (IDispatch FAR* HUGEP*)psaNew->pvData;
+
+ for(i = 0; i < cElements; ++i){
+ if(*ppdispSrc != NULL)
+ (*ppdispSrc)->AddRef();
+ *ppdispDst = *ppdispSrc;
+ ++ppdispDst, ++ppdispSrc;
+ }
+#endif
+
+ }else if(psa->fFeatures & FADF_VARIANT){
+
+#ifdef WIN16
+ for(i = 0; i < cElements; ++i)
+ IfFailGo(VariantCopy(
+ (VARIANT HUGEP*) hAccessElement(psaNew, i),
+ (VARIANT HUGEP*) hAccessElement(psa, i)),
+ LError2);
+#else
+ VARIANT HUGEP* pvarDst, HUGEP* pvarSrc;
+
+ pvarSrc = (VARIANT HUGEP*)psa->pvData;
+ pvarDst = (VARIANT HUGEP*)psaNew->pvData;
+
+ for(i = 0; i < cElements; ++i){
+ IfFailGo(VariantCopy(pvarDst, pvarSrc), LError2);
+ ++pvarDst, ++pvarSrc;
+ }
+#endif
+
+ }else{
+
+#ifdef WIN16
+ // hSizeToAlloc can't overflow here (couldn't have created original)
+ HMEMCPY(psaNew->pvData, psa->pvData, hSizeToAlloc(psa, cbSize));
+#else
+ HMEMCPY(psaNew->pvData, psa->pvData, cbSize);
+#endif
+
+ }
+
+
+ IfFailGo(SafeArrayUnlock(psaNew), LError1);
+
+ IfFailGo(SafeArrayUnlock(psa), LError0);
+
+ *ppsaOut = psaNew;
+
+ return NOERROR;
+
+
+LError2:;
+ SafeArrayUnlock(psaNew);
+
+LError1:;
+ SafeArrayUnlock(psa);
+
+LError0:;
+ SafeArrayDestroy(psaNew);
+
+ return hresult;
+}
+
+
+/***
+*PUBLIC unsigned int SafeArrayGetDim(SAFEARRAY*)
+*Purpose:
+* Return a count of the number of dimentions in the given array.
+*
+*Entry:
+* psa = the SafeArray descriptor
+*
+*Exit:
+* return value = unsigned int, count of dimentions in the array
+*
+***********************************************************************/
+STDAPI_(unsigned int)
+SafeArrayGetDim(SAFEARRAY FAR* psa)
+{
+ ASSERT(!IsBadReadSA(psa));
+
+ return psa->cDims;
+}
+
+
+/***
+*PUBLIC unsigned int SafeArrayGetElemsize(SAFEARRAY*)
+*Purpose:
+* Return the size in bytes of the elements of the given array.
+*
+*Entry:
+* psa = pointer to the SafeArray descriptor to return the elemsize of.
+*
+*Exit:
+* return value = unsigned int. size in bytes of the elements of the given array.
+*
+***********************************************************************/
+STDAPI_(unsigned int)
+SafeArrayGetElemsize(SAFEARRAY FAR* psa)
+{
+ ASSERT(!IsBadReadSA(psa));
+
+ return psa->cbElements;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayGetUBound(SAFEARRAY*, unsigned int, unsigned int*)
+*Purpose:
+* Return the Upper bound for the given dimention, where the
+* upper bound is defined as the largest existant element of
+* the given dimention.
+*
+*Entry:
+* psa = the SafeArray descriptor
+* uDim = the dimention to return the upper bound for
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* E_INVALIDARG
+* DISP_E_BADINDEX
+*
+***********************************************************************/
+STDAPI
+SafeArrayGetUBound(SAFEARRAY FAR* psa, unsigned int uDim, long FAR* pUbound)
+{
+ SAFEARRAYBOUND FAR* psb;
+
+ if(psa == NULL)
+ return RESULT(E_INVALIDARG);
+#ifdef _DEBUG
+ if(IsBadReadSA(psa))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if(uDim == 0 || uDim > psa->cDims)
+ return RESULT(DISP_E_BADINDEX);
+
+ psb = &psa->rgsabound[psa->cDims - uDim];
+
+ *pUbound = (psb->lLbound + (long)psb->cElements - 1);
+
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayGetLBound(SAFEARRAY*, unsigned int, unsigned int*)
+*Purpose:
+* Return the Lower bound for the given dimention, where the
+* lower bound is defined as the smallest existant element
+* of the given dimention.
+*
+*Entry:
+* psa = the SafeArray Descriptor
+* uDim = the dimention to return the lower bound for
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* E_INVALIDARG
+* DISP_E_BADINDEX
+*
+***********************************************************************/
+STDAPI
+SafeArrayGetLBound(SAFEARRAY FAR* psa, unsigned int uDim, long FAR* pLbound)
+{
+ if(psa == NULL)
+ return RESULT(E_INVALIDARG);
+#ifdef _DEBUG
+ if(IsBadReadSA(psa))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if(uDim == 0 || uDim > psa->cDims)
+ return RESULT(DISP_E_BADINDEX);
+
+ *pLbound = psa->rgsabound[psa->cDims - uDim].lLbound;
+
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayLock(SAFEARRAY*)
+*Purpose:
+* Lock the given SafeArray.
+*
+*Entry:
+* psa = the SafeArray descriptor
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* E_INVALIDARG
+* E_UNEXPECTED - if call would overflow lock count
+*
+***********************************************************************/
+STDAPI
+SafeArrayLock(SAFEARRAY FAR* psa)
+{
+ if(psa == NULL)
+ return RESULT(E_INVALIDARG);
+#ifdef _DEBUG
+ if(IsBadWriteSA(psa))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ // error if one more lock will cause the count to overflow
+ if(psa->cLocks == USHRT_MAX)
+ return RESULT(E_UNEXPECTED);
+
+ ++psa->cLocks;
+
+#ifdef _MAC
+ if (psa->cLocks == 1) {
+ HLock(psa->handle);
+ psa->pvData = *(psa->handle);
+ }
+#endif
+
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayUnlock(SAFEARRAY*)
+*Purpose:
+* Unlock the given SafeArray.
+*
+*Entry:
+* psa = the SafeArray descriptor of the array to unlock.
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* E_INVALIDARG
+* E_UNEXPECTED - if call would underflow lock count
+*
+***********************************************************************/
+STDAPI
+SafeArrayUnlock(SAFEARRAY FAR* psa)
+{
+ if(psa == NULL)
+ return RESULT(E_INVALIDARG);
+#ifdef _DEBUG
+ if(IsBadWriteSA(psa))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if(psa->cLocks == 0)
+ return RESULT(E_UNEXPECTED);
+
+ --psa->cLocks;
+
+#ifdef _MAC
+ if (psa->cLocks == 0) {
+ HUnlock(psa->handle);
+ psa->pvData = NULL;
+ }
+#endif
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT SafeArrayAccessData(SAFEARRAY*, void**)
+*Purpose:
+* Lock the given SafeArray and return a pointer to its data.
+*
+*Entry:
+* psa = the SafeArray to access
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+* E_UNEXPECTED
+*
+* *ppvData = pointer to the arrary data
+*
+***********************************************************************/
+STDAPI
+SafeArrayAccessData(SAFEARRAY FAR* psa, void HUGEP* FAR* ppvData)
+{
+ IfFailRet(SafeArrayLock(psa));
+
+ *ppvData = psa->pvData;
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT SafeArrayUnaccessData(SAFEARRAY*)
+*Purpose:
+* Unaccess the given SafeArray's data.
+*
+*Entry:
+* psa = the SafeArray to unaccess.
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+* E_UNEXPECTED
+*
+***********************************************************************/
+STDAPI
+SafeArrayUnaccessData(SAFEARRAY FAR* psa)
+{
+ return SafeArrayUnlock(psa);
+}
+
+
+/***
+*PRIVATE HRESULT SafeArrayPtrOfIndex(SAFEARRAY*, long*)
+*Purpose:
+* Return a pointer to the array element with the given indices.
+*
+*Entry:
+* psa = the SafeArray descriptor
+* rgIndices = array of indices
+*
+* Note: The indices are passed in textual order, while the array
+* of bounds is passed in reverse-textual order.
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* DISP_E_BADINDEX
+*
+* ppvData = pointer to the array element with the given indices
+*
+***********************************************************************/
+STDAPI
+SafeArrayPtrOfIndex(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void HUGEP* FAR* ppvData)
+{
+ unsigned long ofs;
+ long ix, FAR* pix;
+ SAFEARRAYBOUND FAR* pbound;
+
+ if(psa->cDims == 0)
+ return RESULT(DISP_E_BADINDEX);
+
+#ifdef _MAC
+ if(psa->cLocks == 0)
+ return RESULT(E_FAIL); // UNDONE: This needs to be a more descriptive
+ // HRESULT, probably DISP_E_ARRAYISNOTLOCK
+#endif
+
+
+ // compute the offset represented by the given indices
+
+ ofs = 0;
+ pbound = psa->rgsabound;
+ pix = &rgIndices[psa->cDims - 1];
+
+ while(1){
+
+ ix = *pix - pbound->lLbound;
+ if(ix < 0 || ix >= (long)pbound->cElements)
+ return RESULT(DISP_E_BADINDEX);
+
+ ofs += ix;
+
+ if(pix == rgIndices)
+ break;
+
+ --pix;
+ ++pbound;
+
+ ofs *= pbound->cElements;
+ }
+
+#ifdef WIN16
+ *ppvData = hAccessElement(psa, ofs);
+#else
+ ofs *= psa->cbElements;
+ *ppvData = ((unsigned char HUGEP*)psa->pvData) + ofs;
+#endif
+
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayGetElement(SAFEARRAY*, long*, void*)
+*Purpose:
+* Extract the element at the given indices from the given SafeArray.
+*
+*Entry:
+* psa = the SafeArray descriptor
+* rgIndices = an array of indices
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* E_INVALIDARG
+* E_OUTOFMEMORY
+* DISP_E_BADINDEX
+*
+* pv = pointer to a copy of the extracted data
+*
+***********************************************************************/
+STDAPI
+SafeArrayGetElement(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void FAR* pv)
+{
+ HRESULT hresult;
+ void HUGEP* pvData;
+
+ if(psa == NULL)
+ return RESULT(E_INVALIDARG);
+#ifdef _DEBUG
+ if(IsBadReadSA(psa))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pv, psa->cbElements))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailGo(SafeArrayLock(psa), LError0);
+
+ IfFailGo(SafeArrayPtrOfIndex(psa, rgIndices, &pvData), LError0);
+
+ if(psa->fFeatures & FADF_BSTR){
+
+ IfFailGo(ErrStringCopy(*(BSTR HUGEP*)pvData,
+ (BSTR FAR*)pv), LError0);
+
+ }else if(psa->fFeatures & FADF_UNKNOWN){
+
+ IUnknown FAR* punk = *(IUnknown FAR* HUGEP*)pvData;
+ *((IUnknown FAR* FAR*)pv) = punk;
+ if(punk != NULL)
+ punk->AddRef();
+
+ }else if(psa->fFeatures & FADF_DISPATCH){
+
+ IDispatch FAR* pdisp = *(IDispatch FAR* HUGEP*)pvData;
+ *((IDispatch FAR* FAR*)pv) = pdisp;
+ if(pdisp != NULL)
+ pdisp->AddRef();
+
+ }else if(psa->fFeatures & FADF_VARIANT){
+
+ VARIANT FAR* pvarTo;
+ VARIANT FAR* pvarFrom;
+
+ pvarTo = (VARIANT FAR*)pv;
+ pvarFrom = (VARIANT HUGEP*)pvData;
+
+ V_VT(pvarTo) = VT_EMPTY;
+ IfFailGo(VariantCopy(pvarTo, pvarFrom), LError0);
+
+ }else{
+
+ MEMCPY(pv, pvData, psa->cbElements);
+
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+ SafeArrayUnlock(psa);
+
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayPutElement(SAFEARRAY*, long*, void*)
+*Purpose:
+* Put the given data at the given location in the given array.
+*
+*Entry:
+* psa = the SafeArray descriptor
+* rgIndices = an array of indices
+* pv = pointer to the data to copy into the array.
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* E_INVALIDARG
+* E_OUTOFMEMORY
+* DISP_E_BADINDEX
+*
+***********************************************************************/
+STDAPI
+SafeArrayPutElement(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void FAR* pv)
+{
+ HRESULT hresult;
+ void HUGEP* pvData;
+
+ if(psa == NULL)
+ return RESULT(E_INVALIDARG);
+#ifdef _DEBUG
+ if(IsBadWriteSA(psa))
+ return RESULT(E_INVALIDARG);
+ if(IsBadReadPtr(pv, psa->cbElements))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailGo(SafeArrayLock(psa), LError0);
+
+ IfFailGo(SafeArrayPtrOfIndex(psa, rgIndices, &pvData), LError1);
+
+ if(psa->fFeatures & FADF_BSTR){
+
+ BSTR bstrNew;
+ BSTR FAR* pbstrOld;
+
+ bstrNew = (BSTR)pv;
+ pbstrOld = (BSTR HUGEP*)pvData;
+
+ BSTR bstrTmp = *pbstrOld;
+
+ IfFailGo(ErrStringCopy(bstrNew, pbstrOld), LError1);
+
+ SysFreeString(bstrTmp);
+
+ }else if(psa->fFeatures & FADF_UNKNOWN){
+
+ IUnknown FAR* punkNew;
+ IUnknown FAR* FAR* ppunkOld;
+
+ punkNew = (IUnknown FAR*)pv;
+ ppunkOld = (IUnknown FAR* HUGEP*)pvData;
+
+ if(*ppunkOld != NULL)
+ (*ppunkOld)->Release();
+ *ppunkOld = punkNew;
+ if(punkNew != NULL)
+ punkNew->AddRef();
+
+ }else if(psa->fFeatures & FADF_DISPATCH){
+
+ IDispatch FAR* pdispNew;
+ IDispatch FAR* FAR* ppdispOld;
+
+ pdispNew = (IDispatch FAR*)pv;
+ ppdispOld = (IDispatch FAR* HUGEP*)pvData;
+
+ if(*ppdispOld != NULL)
+ (*ppdispOld)->Release();
+ *ppdispOld = pdispNew;
+ if(pdispNew != NULL)
+ pdispNew->AddRef();
+
+ }else if(psa->fFeatures & FADF_VARIANT){
+
+ VARIANT FAR* pvarNew;
+ VARIANT FAR* pvarOld;
+
+ pvarNew = (VARIANT FAR*)pv;
+ pvarOld = (VARIANT HUGEP*)pvData;
+
+ IfFailGo(VariantCopy(pvarOld, pvarNew), LError1);
+
+ }else{
+
+ MEMCPY(pvData, pv, psa->cbElements);
+
+ }
+
+ hresult = NOERROR;
+
+LError1:;
+ SafeArrayUnlock(psa);
+
+LError0:;
+ return hresult;
+}
+
+#endif // !NETDISP
+
+#if OE_MAC && !defined(HIWORD)
+#define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xFFFF))
+#define LOWORD(l) ((WORD)(DWORD)(l))
+#define MAKELONG(low, high) ((DWORD)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
+#endif //OE_MAC !defined(HIWORD)
+
+
+INTERNAL_(unsigned long)
+SafeArraySize(SAFEARRAY FAR* psa)
+{
+ unsigned long cb;
+ unsigned long dw1;
+ unsigned long dw2;
+ unsigned short us;
+ unsigned short cDims;
+ SAFEARRAYBOUND FAR* psabound;
+
+ cb = 0L;
+ if(cDims = psa->cDims){
+ psabound = &psa->rgsabound[cDims - 1];
+ cb = (unsigned long)psa->cbElements;
+ for(us = 0; us < cDims; ++us){
+ dw1 = cb;
+ dw2 = psabound->cElements;
+
+ // now do a 32x32 multiply, with overflow checking
+ // cb = dw1 * dw2;
+
+ // note: DWORD casts on all 16x16 multiplies so that we don't
+ // lose the high word of the result.
+
+ if (HIWORD(dw1) == 0 && HIWORD(dw2) == 0) {
+ // simple case of 16 x 16 -- can't overflow
+ cb = (DWORD)LOWORD(dw1) * LOWORD(dw2);
+ } else if (HIWORD(dw1) != 0 && HIWORD(dw2) != 0) {
+ // 32 x 32 -- no way
+ return SAFEARRAYOVERFLOW;
+ } else {
+ // 16 x 32 or 32 x 16
+ if (HIWORD(dw2) != 0) { // swap so dw2 is always 16 bit
+ cb = dw1;
+ dw1 = dw2;
+ dw2 = cb;
+ }
+ // 32(dw1) x 16(dw2)
+ ASSERT(HIWORD(dw2) == 0);
+
+ // do first 16 x 16 multiply
+ cb = ((DWORD)HIWORD(dw1)) * LOWORD(dw2);
+ if (HIWORD(cb) != 0)
+ return SAFEARRAYOVERFLOW;
+ // do second multiply
+ dw1 = ((DWORD)LOWORD(dw1)) * LOWORD(dw2); // dw1 = 2nd partial product
+ dw2 = MAKELONG(0, LOWORD(cb)); // dw2 = 1st partial product
+ cb = dw1+dw2; // cb = sum of partial products
+ if (cb < dw1) // check for overflow
+ return SAFEARRAYOVERFLOW;
+ }
+
+ --psabound;
+ }
+ }
+
+ return cb;
+}
diff --git a/private/oleauto/src/dispatch/stddisp.cpp b/private/oleauto/src/dispatch/stddisp.cpp
new file mode 100644
index 000000000..7db2e32c4
--- /dev/null
+++ b/private/oleauto/src/dispatch/stddisp.cpp
@@ -0,0 +1,856 @@
+/***
+*stddisp.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* UNDONE
+*
+*
+*Revision History:
+*
+* [00] 09-Feb-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "stddisp.h"
+
+
+STDAPI
+CreateStdDispatch(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* ppunk)
+
+{
+#if OE_WIN32 && 0
+ return CDualStdDisp::Create(punkOuter, pvThis, ptinfo, ppunk);
+#else
+ return CStdDisp::Create(punkOuter, pvThis, ptinfo, ppunk);
+#endif
+}
+
+
+CStdDisp::CStdDisp() : m_unk(this)
+{
+ m_refs = 1;
+ m_punk = NULL;
+ m_this = NULL;
+ m_ptinfo = NULL;
+}
+
+
+/***
+, void*, LCID, ITypeInfo*, IDispatch**)
+*Purpose:
+* Create an instance of the standard IDispatch implementation and
+* initialize it with the given 'this' pointer, locale id (lcid) and
+* TypeInfo.
+*
+*Entry:
+* punkOuter - the controlling unknown (if any). NULL means use the
+* default CStdDisp IUnknown implementation (ie, were not nested).
+* pvThis - the this pointer of the object we will be dispatching on.
+* lcid - the single locale id supported by the object we are dispatching on.
+* ptinfo - the TypeInfo describing the single programmability interface
+* supported by the object we are dispatching on.
+*
+*Exit:
+* return value = HRESULT
+*
+* *pdisp = pointer to newly constructed IDispatch implementation.
+*
+***********************************************************************/
+HRESULT
+CStdDisp::Create(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* ppunk)
+{
+ CStdDisp FAR* pdisp;
+
+#ifdef _DEBUG
+ // REVIEW: add parameter validation code
+#endif
+
+ if(ptinfo == NULL || pvThis == NULL)
+ return RESULT(E_INVALIDARG);
+
+ if((pdisp = new FAR CStdDisp()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ if(punkOuter == NULL)
+ punkOuter = &pdisp->m_unk;
+ pdisp->m_punk = punkOuter;
+ pdisp->m_this = pvThis;
+
+ ptinfo->AddRef();
+ pdisp->m_ptinfo = ptinfo;
+
+ *ppunk = &pdisp->m_unk;
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// default IUnknown implementation
+//---------------------------------------------------------------------
+
+CStdDispUnkImpl::CStdDispUnkImpl(CStdDisp FAR* pstddisp)
+{
+ m_pstddisp = pstddisp;
+}
+
+STDMETHODIMP
+CStdDispUnkImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ }else if(IsEqualIID(riid, IID_IDispatch)){
+ *ppv = m_pstddisp;
+ m_pstddisp->AddRef();
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CStdDispUnkImpl::AddRef()
+{
+ return ++m_pstddisp->m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CStdDispUnkImpl::Release()
+{
+ if(--m_pstddisp->m_refs == 0){
+ if(m_pstddisp->m_ptinfo != NULL)
+ m_pstddisp->m_ptinfo->Release();
+ delete m_pstddisp;
+ return 0;
+ }
+ return m_pstddisp->m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch implementation
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CStdDisp::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_punk->QueryInterface(riid, ppv);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStdDisp::AddRef()
+{
+ return m_punk->AddRef();
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStdDisp::Release()
+{
+ return m_punk->Release();
+}
+
+
+STDMETHODIMP
+CStdDisp::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = (m_ptinfo == NULL) ? 0 : 1;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CStdDisp::GetTypeInfo(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ UNUSED(lcid);
+
+ if(itinfo != 0)
+ return RESULT(DISP_E_BADINDEX);
+
+ *pptinfo = m_ptinfo;
+ m_ptinfo->AddRef();
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CStdDisp::GetIDsOfNames(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ UNUSED(lcid);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return RESULT(DISP_E_UNKNOWNINTERFACE);
+
+ return DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);
+}
+
+
+STDMETHODIMP
+CStdDisp::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ UNUSED(lcid);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return RESULT(DISP_E_UNKNOWNINTERFACE);
+
+ return DispInvoke(
+ m_this, m_ptinfo,
+ dispidMember, wFlags, pdispparams,
+ pvarResult, pexcepinfo, puArgErr);
+}
+
+
+
+#if OE_WIN32 && 0 /* { */
+
+// IDispatchW Default Implementation
+
+STDAPI
+CreateStdDispatchW(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfoW FAR* ptinfo,
+ IUnknown FAR* FAR* ppunk)
+{
+ return CDualStdDisp::Create(punkOuter, pvThis, ptinfo, ppunk);
+}
+
+
+CStdDispW::CStdDispW() : m_unk(this)
+{
+ m_refs = 1;
+ m_punk = NULL;
+ m_this = NULL;
+ m_ptinfo = NULL;
+}
+
+
+/***
+*HRESULT CStdDispW::Create(IUnknown*, void*, LCID, ITypeInfo*, IDispatch**)
+*Purpose:
+* Create an instance of the standard IDispatch implementation and
+* initialize it with the given 'this' pointer, locale id (lcid) and
+* TypeInfo.
+*
+*Entry:
+* punkOuter - the controlling unknown (if any). NULL means use the
+* default CStdDispW IUnknown implementation (ie, were not nested).
+* pvThis - the this pointer of the object we will be dispatching on.
+* lcid - the single locale id supported by the object we are dispatching on.
+* ptinfo - the TypeInfo describing the single programmability interface
+* supported by the object we are dispatching on.
+*
+*Exit:
+* return value = HRESULT
+*
+* *pdisp = pointer to newly constructed IDispatch implementation.
+*
+***********************************************************************/
+HRESULT
+CStdDispW::Create(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfoW FAR* ptinfo,
+ IUnknown FAR* FAR* ppunk)
+{
+ CStdDispW FAR* pdisp;
+
+#ifdef _DEBUG
+ // REVIEW: add parameter validation code
+#endif
+
+ if(ptinfo == NULL || pvThis == NULL)
+ return RESULT(E_INVALIDARG);
+
+ if((pdisp = new FAR CStdDispW()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ if(punkOuter == NULL)
+ punkOuter = &pdisp->m_unk;
+ pdisp->m_punk = punkOuter;
+ pdisp->m_this = pvThis;
+
+ ptinfo->AddRef();
+ pdisp->m_ptinfo = ptinfo;
+
+ *ppunk = &pdisp->m_unk;
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// default IUnknown implementation
+//---------------------------------------------------------------------
+
+CStdDispWUnkImpl::CStdDispWUnkImpl(CStdDispW FAR* pstddisp)
+{
+ m_pstddisp = pstddisp;
+}
+
+STDMETHODIMP
+CStdDispWUnkImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ }else if(IsEqualIID(riid, IID_IDispatchW)){
+ *ppv = m_pstddisp;
+ m_pstddisp->AddRef();
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CStdDispWUnkImpl::AddRef()
+{
+ return ++m_pstddisp->m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CStdDispWUnkImpl::Release()
+{
+ if(--m_pstddisp->m_refs == 0){
+ if(m_pstddisp->m_ptinfo != NULL)
+ m_pstddisp->m_ptinfo->Release();
+ delete m_pstddisp;
+ return 0;
+ }
+ return m_pstddisp->m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch implementation
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CStdDispW::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_punk->QueryInterface(riid, ppv);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStdDispW::AddRef()
+{
+ return m_punk->AddRef();
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStdDispW::Release()
+{
+ return m_punk->Release();
+}
+
+
+STDMETHODIMP
+CStdDispW::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = (m_ptinfo == NULL) ? 0 : 1;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CStdDispW::GetTypeInfo(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfoW FAR* FAR* pptinfo)
+{
+ UNUSED(lcid);
+
+ if(itinfo != 0)
+ return RESULT(DISP_E_BADINDEX);
+
+ *pptinfo = m_ptinfo;
+ m_ptinfo->AddRef();
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CStdDispW::GetIDsOfNames(
+ REFIID riid,
+ WCHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ UNUSED(lcid);
+
+ if(riid != IID_NULL)
+ return RESULT(DISP_E_UNKNOWNINTERFACE);
+
+ return DispGetIDsOfNamesW(m_ptinfo, rgszNames, cNames, rgdispid);
+}
+
+
+STDMETHODIMP
+CStdDispW::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ WEXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ UNUSED(lcid);
+
+ if(riid != IID_NULL)
+ return RESULT(DISP_E_UNKNOWNINTERFACE);
+
+ return DispInvokeW(
+ m_this, m_ptinfo,
+ dispidMember, wFlags, pdispparams,
+ pvarResult, pexcepinfo, puArgErr);
+}
+
+
+
+//---------------------------------------------------------------------
+// CDualStdDisp Constructor/Creation Functions
+//---------------------------------------------------------------------
+
+CDualStdDisp::CDualStdDisp() : m_unk(this)
+{
+ m_refs = 1;
+ m_punk = NULL;
+ m_this = NULL;
+ m_pAnsiDispatch = NULL;
+ m_pUnicodeDispatch = NULL;
+}
+
+HRESULT
+CDualStdDisp::Create(
+ IUnknown FAR* pUnkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* ppunk)
+{
+ CDualStdDisp FAR* pdisp;
+
+ if(ptinfo == NULL || pvThis == NULL)
+ return RESULT(E_INVALIDARG);
+
+ if((pdisp = new FAR CDualStdDisp()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ if(pUnkOuter == NULL)
+ pUnkOuter = &pdisp->m_unk;
+ pdisp->m_punk = pUnkOuter;
+ pdisp->m_this = pvThis;
+
+ IfFailRet(CStdDisp::Create(pUnkOuter,
+ pvThis,
+ ptinfo,
+ &(pdisp->m_pAnsiDispatch)));
+
+ *ppunk = &pdisp->m_unk;
+
+ return NOERROR;
+}
+
+HRESULT
+CDualStdDisp::Create(
+ IUnknown FAR* pUnkOuter,
+ void FAR* pvThis,
+ ITypeInfoW FAR* ptinfo,
+ IUnknown FAR* FAR* ppunk)
+{
+ CDualStdDisp FAR* pdisp;
+
+ if(ptinfo == NULL || pvThis == NULL)
+ return RESULT(E_INVALIDARG);
+
+ if((pdisp = new FAR CDualStdDisp()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ if(pUnkOuter == NULL)
+ pUnkOuter = &pdisp->m_unk;
+ pdisp->m_punk = pUnkOuter;
+ pdisp->m_this = pvThis;
+
+ IfFailRet(CStdDispW::Create(pUnkOuter,
+ pvThis,
+ ptinfo,
+ &(pdisp->m_pUnicodeDispatch)));
+
+ *ppunk = &pdisp->m_unk;
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// default IUnknown implementation
+//---------------------------------------------------------------------
+
+CDualStdDispUnkImpl::CDualStdDispUnkImpl(CDualStdDisp FAR* pstddisp)
+{
+ m_pstddisp = pstddisp;
+}
+
+STDMETHODIMP
+CDualStdDispUnkImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ }else if(IsEqualIID(riid, IID_IDispatch)){
+ if ((m_pstddisp->m_pAnsiDispatch == NULL) &&
+ (hresult = m_pstddisp->CreateAnsiTable()) != NOERROR)
+ return(hresult);
+ return m_pstddisp->m_pAnsiDispatch->QueryInterface(riid, ppv);
+ }else if(IsEqualIID(riid, IID_IDispatchW)){
+ if ((m_pstddisp->m_pUnicodeDispatch == NULL) &&
+ (hresult = m_pstddisp->CreateUnicodeTable()) != NOERROR)
+ return(hresult);
+ return m_pstddisp->m_pUnicodeDispatch->QueryInterface(riid, ppv);
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CDualStdDispUnkImpl::AddRef()
+{
+ return ++m_pstddisp->m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CDualStdDispUnkImpl::Release()
+{
+ if(--m_pstddisp->m_refs == 0){
+ if(m_pstddisp->m_pAnsiDispatch != NULL)
+ m_pstddisp->m_pAnsiDispatch->Release();
+ if(m_pstddisp->m_pUnicodeDispatch != NULL)
+ m_pstddisp->m_pUnicodeDispatch->Release();
+ delete m_pstddisp;
+ return 0;
+ }
+ return m_pstddisp->m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch implementation
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CDualStdDisp::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_punk->QueryInterface(riid, ppv);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDualStdDisp::AddRef()
+{
+ return m_punk->AddRef();
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDualStdDisp::Release()
+{
+ return m_punk->Release();
+}
+
+
+
+
+//---------------------------------------------------------------------
+// CDualStdDisp private implementation
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CDualStdDisp::CreateAnsiTable(void)
+{
+ HRESULT hresult;
+
+ IDispatchW FAR* pdisp;
+ ITypeInfo FAR* ptinfo;
+ ITypeInfoW FAR* ptinfoW, FAR* ptinfoW2;
+
+ WTYPEATTR FAR* ptattr;
+ WFUNCDESC *pfuncdesc;
+ unsigned int i, count, funcIndex, paramIndex;
+
+ const unsigned int rgbstrMax = 16; //REVIEW: Is this large enough?
+ WBSTR FAR rgbstrNames[rgbstrMax];
+ unsigned int lpcName;
+
+ INTERFACEDATA FAR *idata;
+ METHODDATA FAR* pmdata;
+
+
+ // TypeInfo must exists to create UnicodeTable
+ //
+ if (m_pUnicodeDispatch == NULL ||
+ m_pUnicodeDispatch->QueryInterface(IID_IDispatchW,
+ (void FAR* FAR*) &pdisp) != NOERROR)
+ return RESULT(E_FAIL);
+ if (pdisp->GetTypeInfoCount(&count) != NOERROR ||
+ count == 0 ||
+ pdisp->GetTypeInfo(0, LOCALE_USER_DEFAULT, &ptinfoW) != NOERROR) {
+ pdisp->Release();
+ return RESULT(E_FAIL);
+ }
+
+
+ // Query TypeInfo for members & generate equivalent
+ // INTERFACEDATA AnsiTable
+ //
+ IfFailGo(ptinfoW->GetRefTypeInfo(0, &ptinfoW2), LError0);
+ ptinfoW->Release();
+ IfFailGo(ptinfoW2->GetTypeAttr(&ptattr), LError0);
+ idata = new FAR INTERFACEDATA;
+ idata->cMembers = ptattr->cFuncs;
+ idata->pmethdata = new FAR METHODDATA[idata->cMembers];
+ for (funcIndex = 0; funcIndex < idata->cMembers; funcIndex++) {
+ IfFailGo(ptinfoW2->GetFuncDesc(funcIndex, &pfuncdesc), LError1);
+ IfFailGo(ptinfoW2->GetNames(pfuncdesc->memid,
+ rgbstrNames,
+ rgbstrMax,
+ &lpcName),
+ LError1);
+ if(lpcName != (unsigned int) pfuncdesc->cParams+1) goto LError2;
+
+ // Fill out methoddata info
+ //
+ pmdata = &(idata->pmethdata[funcIndex]);
+ pmdata->szName = SysStringWtoA(rgbstrNames[0], CP_ACP);
+ pmdata->cArgs = pfuncdesc->cParams;
+ pmdata->ppdata = pmdata->cArgs ?
+ new FAR PARAMDATA[pmdata->cArgs] : NULL;
+ pmdata->dispid = pfuncdesc->memid;
+ pmdata->iMeth = pfuncdesc->oVft / sizeof(void FAR*);
+ pmdata->cc = pfuncdesc->callconv;
+ pmdata->vtReturn = pfuncdesc->elemdescFunc.tdesc.vt;
+ for (paramIndex = 0; paramIndex < pmdata->cArgs; paramIndex++) {
+ pmdata->ppdata[paramIndex].szName =
+ SysStringWtoA(rgbstrNames[paramIndex+1], CP_ACP);
+ pmdata->ppdata[paramIndex].vt =
+ pfuncdesc->lprgelemdescParam[paramIndex].tdesc.vt;
+ }
+ switch(pfuncdesc->invkind) {
+ case INVOKE_FUNC:
+ pmdata->wFlags = DISPATCH_METHOD;
+ break;
+ case INVOKE_PROPERTYGET:
+ pmdata->wFlags = DISPATCH_PROPERTYGET;
+ break;
+ case INVOKE_PROPERTYPUT:
+ pmdata->wFlags = DISPATCH_PROPERTYPUT;
+ break;
+ case INVOKE_PROPERTYPUTREF:
+ pmdata->wFlags = DISPATCH_PROPERTYPUTREF;
+ break;
+ }
+
+ // Free temporary info
+ //
+ ptinfoW2->ReleaseFuncDesc(pfuncdesc);
+ for (i = 0; i < lpcName; i++)
+ SysFreeStringW(rgbstrNames[i]);
+ lpcName = 0;
+ }
+
+
+ // Create ITypeInfoW & IDispatchW Interfaces
+ //
+ IfFailGo(CreateDispTypeInfo(idata, LOCALE_USER_DEFAULT, &ptinfo),
+ LError1);
+ IfFailGo(CStdDisp::Create(this, m_this, ptinfo,
+ (IUnknown FAR* FAR*) &m_pAnsiDispatch),
+ LError3);
+ hresult = NOERROR;
+
+LError3:
+ ptinfo->Release();
+
+LError2:
+ for (i = 0; i < lpcName; i++)
+ SysFreeStringW(rgbstrNames[i]);
+
+LError1:
+ ptinfoW2->ReleaseTypeAttr(ptattr);
+
+LError0:
+ ptinfoW2->Release();
+ pdisp->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+CDualStdDisp::CreateUnicodeTable(void)
+{
+ HRESULT hresult;
+
+ IDispatch FAR* pdisp;
+ ITypeInfo FAR* ptinfo, FAR* ptinfo2;
+ ITypeInfoW FAR* ptinfoW;
+
+ TYPEATTR FAR* ptattr;
+ FUNCDESC *pfuncdesc;
+ unsigned int i, count, funcIndex, paramIndex;
+
+ const unsigned int rgbstrMax = 16; //REVIEW: Is this large enough?
+ BSTR FAR rgbstrNames[rgbstrMax];
+ unsigned int lpcName;
+
+ WINTERFACEDATA FAR *widata;
+ WMETHODDATA FAR* pmdata;
+
+
+ // TypeInfo must exists to create UnicodeTable
+ //
+ if (m_pAnsiDispatch == NULL ||
+ m_pAnsiDispatch->QueryInterface(IID_IDispatch,
+ (void FAR* FAR*) &pdisp) != NOERROR)
+ return RESULT(E_FAIL);
+ if (pdisp->GetTypeInfoCount(&count) != NOERROR ||
+ count == 0 ||
+ pdisp->GetTypeInfo(0, LOCALE_USER_DEFAULT, &ptinfo) != NOERROR) {
+ pdisp->Release();
+ return RESULT(E_FAIL);
+ }
+
+
+ // Query TypeInfo for members & generate equivalent
+ // WINTERFACEDATA UnicodeTable
+ //
+ IfFailGo(ptinfo->GetRefTypeInfo(0, &ptinfo2), LError0);
+ ptinfo->Release();
+ IfFailGo(ptinfo2->GetTypeAttr(&ptattr), LError0);
+ widata = new FAR WINTERFACEDATA;
+ widata->cMembers = ptattr->cFuncs;
+ widata->pmethdata = new FAR WMETHODDATA[widata->cMembers];
+ for (funcIndex = 0; funcIndex < widata->cMembers; funcIndex++) {
+ IfFailGo(ptinfo2->GetFuncDesc(funcIndex, &pfuncdesc), LError1);
+ IfFailGo(ptinfo2->GetNames(pfuncdesc->memid,
+ rgbstrNames,
+ rgbstrMax,
+ &lpcName),
+ LError1);
+ if(lpcName != (unsigned int) pfuncdesc->cParams+1) goto LError2;
+
+ // Fill out methoddata info
+ //
+ pmdata = &(widata->pmethdata[funcIndex]);
+ pmdata->szName = SysStringAtoW(rgbstrNames[0], CP_ACP);
+ pmdata->cArgs = pfuncdesc->cParams;
+ pmdata->ppdata = pmdata->cArgs ?
+ new FAR WPARAMDATA[pmdata->cArgs] : NULL;
+ pmdata->dispid = pfuncdesc->memid;
+ pmdata->iMeth = pfuncdesc->oVft / sizeof(void FAR*);
+ pmdata->cc = pfuncdesc->callconv;
+ pmdata->vtReturn = pfuncdesc->elemdescFunc.tdesc.vt;
+ for (paramIndex = 0; paramIndex < pmdata->cArgs; paramIndex++) {
+ pmdata->ppdata[paramIndex].szName =
+ SysStringAtoW(rgbstrNames[paramIndex+1], CP_ACP);
+ pmdata->ppdata[paramIndex].vt =
+ pfuncdesc->lprgelemdescParam[paramIndex].tdesc.vt;
+ }
+ switch(pfuncdesc->invkind) {
+ case INVOKE_FUNC:
+ pmdata->wFlags = DISPATCH_METHOD;
+ break;
+ case INVOKE_PROPERTYGET:
+ pmdata->wFlags = DISPATCH_PROPERTYGET;
+ break;
+ case INVOKE_PROPERTYPUT:
+ pmdata->wFlags = DISPATCH_PROPERTYPUT;
+ break;
+ case INVOKE_PROPERTYPUTREF:
+ pmdata->wFlags = DISPATCH_PROPERTYPUTREF;
+ break;
+ }
+
+ // Free temporary info
+ //
+ ptinfo2->ReleaseFuncDesc(pfuncdesc);
+ for (i = 0; i < lpcName; i++)
+ SysFreeString(rgbstrNames[i]);
+ lpcName = 0;
+ }
+
+
+ // Create ITypeInfoW & IDispatchW Interfaces
+ //
+ IfFailGo(CreateDispTypeInfoW(widata, LOCALE_USER_DEFAULT, &ptinfoW),
+ LError1);
+ IfFailGo(CStdDispW::Create(this, m_this, ptinfoW,
+ (IUnknown FAR* FAR*) &m_pUnicodeDispatch),
+ LError3);
+ hresult = NOERROR;
+
+LError3:
+ ptinfoW->Release();
+
+LError2:
+ for (i = 0; i < lpcName; i++)
+ SysFreeString(rgbstrNames[i]);
+
+LError1:
+ ptinfo2->ReleaseTypeAttr(ptattr);
+
+LError0:
+ ptinfo2->Release();
+ pdisp->Release();
+ return hresult;
+}
+
+#endif /* } */
+
diff --git a/private/oleauto/src/dispatch/stddisp.h b/private/oleauto/src/dispatch/stddisp.h
new file mode 100644
index 000000000..d77a6f4c5
--- /dev/null
+++ b/private/oleauto/src/dispatch/stddisp.h
@@ -0,0 +1,325 @@
+/***
+*stddisp.h
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file declares the CStdDisp class. This 'standard' IDispatch
+* implementation that supports a single locale, and a single exposed
+* programmability interface (identified by IID_NULL), described by a
+* single TypeInfo.
+*
+*
+* Sample usage:
+*
+* class CMyObj : public IUnknown {
+* public:
+*
+* STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+* STDMETHOD(AddRef)(void);
+* STDMETHOD(Release)(void);
+*
+* <introduced methods described by a TypeInfo>
+*
+* private:
+* unsigned long m_refs;
+* IUnknown FAR* m_punkDisp;
+* };
+*
+* CMyObj::Create()
+* {
+* CMyObj FAR* pme;
+* ITypeInfo FAR* ptinfo;
+* IUnknown FAR* punkDisp;
+*
+* if((pme = new FAR CMyObj()) == NULL){
+* hresult = ResultFromScode(E_OUTOFMEMORY);
+* goto LError0;
+* }
+*
+* if((hresult = CreateDispTypeInfo(..., &ptinfo)) != NOERROR)
+* goto LError1;
+*
+* // create 'standard' IDispatch implementation, and initialize
+* // with this instances 'this' pointer, the desired locale, and
+* // the TypeInfo that describes the exposed interface.
+* //
+* if((hresult = CreateStdDispatch(
+* NULL, pme, LCID_USER_DEFAULT, ptinfo, &punkDisp)) != NOERROR)
+* return hresult;
+*
+* m_punkDisp = punkDisp;
+*
+* return pme;
+*
+* LError1:;
+* delete pme;
+*
+* LError0:;
+* return hresult;
+* }
+*
+* CMyObj::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+* {
+* if(riid == IID_IUnknown){
+* *ppv = this;
+* }else if(riid == IID_IDispatch){
+* return m_punkDisp->QueryInterface(riid, ppv);
+* }else
+* return ResultFromScode(E_NOINTERFACE);
+* return NOERROR;
+* }
+*
+* CMyObj::AddRef()
+* {
+* return ++m_refs;
+* }
+*
+* CMyObj::Release()
+* {
+* if(--m_refs == 0){
+* m_punkDisp->Release();
+* delete this;
+* return 0;
+* }
+* return m_refs;
+* }
+*
+*
+*Revision History:
+*
+* [00] 09-Feb-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+// forward declarations
+class FAR CStdDisp;
+
+
+STDAPI
+CreateStdDisp(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* punkStdDisp);
+
+
+// "private" IUnknown implementation
+class FAR CStdDispUnkImpl : public IUnknown
+{
+public:
+ CStdDispUnkImpl(CStdDisp FAR* pstddisp);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+private:
+ CStdDisp FAR* m_pstddisp;
+};
+
+
+class FAR CStdDisp : public IDispatch
+{
+public:
+ static HRESULT Create(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* punkStdDisp);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo);
+
+ STDMETHOD(GetTypeInfo)(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ CStdDisp();
+
+ friend CStdDispUnkImpl;
+ CStdDispUnkImpl m_unk; // 'private' unknown
+
+private:
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punk; // pointer to the controlling unknown
+
+ // 'this' ptr of the interface we are dispatching on
+ void FAR* m_this;
+
+ // typeinfo describing the interface we are dispatching on
+ ITypeInfo FAR* m_ptinfo;
+};
+
+
+#if OE_WIN32 && 0 /* { */
+
+// forward declarations
+class FAR CStdDispW;
+
+
+STDAPI
+CreateStdDispW(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfoW FAR* ptinfo,
+ IUnknown FAR* FAR* punkStdDispW);
+
+
+// "private" IUnknown implementation
+class FAR CStdDispWUnkImpl : public IUnknown
+{
+public:
+ CStdDispWUnkImpl(CStdDispW FAR* pstddisp);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+private:
+ CStdDispW FAR* m_pstddisp;
+};
+
+
+class FAR CStdDispW : public IDispatchW
+{
+public:
+ static HRESULT Create(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfoW FAR* ptinfo,
+ IUnknown FAR* FAR* punkStdDispW);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo);
+
+ STDMETHOD(GetTypeInfo)(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfoW FAR* FAR* pptinfo);
+
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ WCHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ WEXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ CStdDispW();
+
+ friend CStdDispWUnkImpl;
+ CStdDispWUnkImpl m_unk; // 'private' unknown
+
+private:
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punk; // pointer to the controlling unknown
+
+ // 'this' ptr of the interface we are dispatching on
+ void FAR* m_this;
+
+ // typeinfo describing the interface we are dispatching on
+ ITypeInfoW FAR* m_ptinfo;
+};
+
+
+// Forward Declaration
+class FAR CDualStdDisp;
+
+
+// "private" IUnknown implementation
+class FAR CDualStdDispUnkImpl : public IUnknown
+{
+public:
+ CDualStdDispUnkImpl(CDualStdDisp FAR* pstddisp);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+private:
+ CDualStdDisp FAR* m_pstddisp;
+};
+
+
+class CDualStdDisp : public IUnknown {
+
+ public:
+
+ static HRESULT Create(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* punkStdDisp);
+
+ static HRESULT Create(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfoW FAR* ptinfo,
+ IUnknown FAR* FAR* punkStdDispW);
+
+ // IUnknown Methods
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ friend CDualStdDispUnkImpl;
+ CDualStdDispUnkImpl m_unk; // 'private' unknown
+
+ protected:
+
+ CDualStdDisp();
+ virtual ~CDualStdDisp() {}
+
+ STDMETHOD(CreateUnicodeTable)(void);
+ STDMETHOD(CreateAnsiTable)(void);
+
+ private:
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punk; // pointer to the controlling unknown
+ void FAR* m_this;
+
+ IUnknown FAR* m_pAnsiDispatch;
+ IUnknown FAR* m_pUnicodeDispatch;
+};
+
+#endif /* } */
diff --git a/private/oleauto/src/dispatch/string.c b/private/oleauto/src/dispatch/string.c
new file mode 100644
index 000000000..c207fd137
--- /dev/null
+++ b/private/oleauto/src/dispatch/string.c
@@ -0,0 +1,530 @@
+/***
+*string.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the string comparrison routines for the
+* Ole2 NLS API. These routines support the implementation of
+* CompareStringA.
+*
+*
+*Revision History:
+*
+* [00] 08-30-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+ASSERTDATA
+
+#define HAVE_DW 0x01
+#define HAVE_CW 0x02
+#define HAVE_SW 0x04
+
+extern STRINFO FAR* g_pstrinfo;
+
+// Optimized version of CompareStringA -
+//
+// This version assumes,
+// - The locale has no compressions
+// - Both strings are zero terminated
+// - We are *not* ignoring symbols
+// - This locale does not have reversed diacritic weights
+//
+int
+ZeroTermNoIgnoreSym(
+ unsigned long dwFlags,
+ const char FAR* pch1,
+ const char FAR* pch2)
+{
+ BYTE ch;
+ int dw, cw, sw;
+ int fEnd, fRedo;
+ WORD wHave;
+ WORD w1, w2;
+ WORD wEx1, wEx2;
+ WORD FAR* prgw;
+ WORD aw1, aw2;
+ WORD dw1, dw2;
+ WORD cw1, cw2;
+ WORD sw1, sw2;
+ EXPANSION FAR* pexp;
+
+ ASSERT(g_pstrinfo->fRevDW == 0);
+ ASSERT(g_pstrinfo->prgdig == NULL);
+ ASSERT((dwFlags & NORM_IGNORESYMBOLS) == 0);
+
+ wHave = 0;
+
+ sw1 = 0;
+ sw2 = 0;
+
+ wEx1 = 0;
+ wEx2 = 0;
+
+ fEnd = 0;
+ fRedo = 0;
+
+ prgw = g_pstrinfo->prgwSort; // sort weight table
+
+ while(1){
+
+ // get the next weight from string #1
+ if(wEx1){ // we have the second weight of an expansion
+ w1 = wEx1;
+ wEx1 = 0;
+ }else{
+ if((ch = *pch1) == '\0'){
+ fEnd |= 0x1;
+ }else{
+ ++pch1;
+ w1 = prgw[(BYTE)ch];
+ }
+ }
+
+ // get the next weight from string #2
+ if(wEx2){ // we have the second weight of an expansion
+ w2 = wEx2;
+ wEx2 = 0;
+ }else{
+ if((ch = *pch2) == '\0'){
+ fEnd |= 0x2;
+ }else{
+ ++pch2;
+ w2 = prgw[(BYTE)ch];
+ }
+ }
+
+Lredo_chkend:;
+ if(fEnd){ // reached the end of one of our strings
+ if(fEnd & 0x1){
+ if(fEnd & 0x2) // reached end of both at the same time
+ goto Lend;
+ goto Lscan2;
+ }else{
+ ASSERT(fEnd&0x2);
+ goto Lscan1;
+ }
+ }
+
+ // Note: we can short circuit here if the entire weights are
+ // equal, because we know the locale has no compressions
+ //
+ if(w1 != w2){
+
+ aw1 = w1 & AWMASK;
+ aw2 = w2 & AWMASK;
+
+ // handle special cases for w1
+#if 0
+ if(aw1 >= AW_UNSORTABLE && aw1 <= AW_MAXSW)
+#else //0
+ if(aw1 == AW_UNSORTABLE || w1 & SPECIALBIT)
+#endif //0
+ {
+ sw1 = aw1;
+ fRedo |= 0x1;
+ }
+
+#if 0
+ if(aw2 >= AW_UNSORTABLE && aw2 <= AW_MAXSW)
+#else //0
+ if(aw2 == AW_UNSORTABLE || w2 & SPECIALBIT)
+#endif //0
+ {
+ sw2 = aw2;
+ fRedo |= 0x2;
+ }
+
+ if(fRedo){
+ if(fRedo & 0x1){
+ if((ch = *pch1) == '\0'){
+ fEnd |= 0x1;
+ }else{
+ ++pch1;
+ w1 = prgw[(BYTE)ch];
+ }
+ }
+ if(fRedo & 0x2){
+ if((ch = *pch2) == '\0'){
+ fEnd |= 0x2;
+ }else{
+ ++pch2;
+ w2 = prgw[(BYTE)ch];
+ }
+ }
+ if((wHave & HAVE_SW) == 0){
+ if(sw1 != sw2){
+ sw = (sw1 < sw2) ? 1 : 3;
+ wHave |= HAVE_SW;
+ }
+ sw1 = sw2 = 0;
+ }
+ fRedo = 0;
+ goto Lredo_chkend; // may have reached the end-of-str
+ }
+
+ ASSERT(aw1 != AW_DONTUSE && aw1 != AW_DIGRAPH);
+ if(aw1 == AW_EXPANSION){
+ pexp = &g_pstrinfo->prgexp[(w1 >> 8) & 0xFF];
+ w1 = pexp->w1;
+ wEx1 = pexp->w2;
+ aw1 = w1 & AWMASK;
+ }
+
+ ASSERT(aw2 != AW_DONTUSE && aw2 != AW_DIGRAPH);
+ if(aw2 == AW_EXPANSION){
+ pexp = &g_pstrinfo->prgexp[(w2 >> 8) & 0xFF];
+ w2 = pexp->w1;
+ wEx2 = pexp->w2;
+ aw2 = w2 & AWMASK;
+ }
+
+ if(aw1 != aw2)
+ return (aw1 < aw2) ? 1 : 3;
+
+ if((wHave & HAVE_DW) == 0){
+ dw1 = (w1 & DWMASK);
+ dw2 = (w2 & DWMASK);
+ if(dw1 != dw2){
+ dw = (dw1 < dw2) ? 1 : 3;
+ wHave |= HAVE_DW;
+ }
+ }
+
+ if((wHave & HAVE_CW) == 0){
+ cw1 = (w1 & CWMASK);
+ cw2 = (w2 & CWMASK);
+ if(cw1 != cw2){
+ cw = (cw1 < cw2) ? 1 : 3;
+ wHave |= HAVE_CW;
+ }
+ }
+ }
+ }
+
+
+#define IGNORE_WEIGHT(W) \
+ (((W) & AWMASK) == AW_UNSORTABLE)
+
+Lscan1:;
+ // Is there anything in the remainder of string #1 that we shouldn't ignore?
+ if(!IGNORE_WEIGHT(w1) || wEx1)
+ return 3;
+ while((ch = *pch1) != '\0'){
+ ++pch1;
+ w1 = prgw[(BYTE)ch];
+ if(!IGNORE_WEIGHT(w1))
+ return 3;
+ }
+ goto Lend;
+
+Lscan2:;
+ // Is there anything in the remainder of string #2 that we shouldn't ignore?
+ if(!IGNORE_WEIGHT(w2) || wEx2)
+ return 1;
+ while((ch = *pch2) != '\0'){
+ ++pch2;
+ w2 = prgw[(BYTE)ch];
+ if(!IGNORE_WEIGHT(w2))
+ return 1;
+ }
+ goto Lend;
+
+#undef IGNORE_WEIGHT
+
+Lend:;
+
+ // reached the end of both strings without a decision
+ if((wHave & HAVE_DW) != 0 && (dwFlags & NORM_IGNORENONSPACE) == 0)
+ return dw;
+
+ if((wHave & HAVE_CW) != 0 && (dwFlags & NORM_IGNORECASE) == 0)
+ return cw;
+
+ if((wHave & HAVE_SW) != 0)
+ return sw;
+
+ return 2; // they're the same
+}
+
+
+// Default - handles all cases
+int
+DefCompareStringA(
+ unsigned long dwFlags,
+ const char FAR* pch1, int cch1,
+ const char FAR* pch2, int cch2)
+{
+ int dw, cw, sw;
+ int fEnd, fRedo;
+ WORD wHave;
+ WORD FAR* prgw;
+ WORD wSymbolBit;
+ WORD w1, w2;
+ WORD wEx1, wEx2;
+ WORD aw1, aw2;
+ WORD dw1, dw2;
+ WORD cw1, cw2;
+ WORD sw1, sw2;
+ EXPANSION FAR* pexp;
+ DIGRAPH FAR* pdig, FAR* pdigEnd;
+ const char FAR* pchEnd1, FAR* pchEnd2;
+
+ ASSERT(cch1 >= 0 && cch2 >= 0); // lengths must be computed by caller
+
+ wHave = 0;
+
+ sw1 = 0;
+ sw2 = 0;
+
+ wEx1 = 0;
+ wEx2 = 0;
+
+ wSymbolBit = (dwFlags & NORM_IGNORESYMBOLS) ? SYMBOLBIT : 0;
+
+ fEnd = 0;
+ fRedo = 0;
+
+ pchEnd1 = &pch1[cch1];
+ pchEnd2 = &pch2[cch2];
+
+ prgw = g_pstrinfo->prgwSort; // sort weight table
+
+ while(1){
+
+ // get the next weight from string #1
+ if(wEx1){ // we have the second weight of an expansion
+ w1 = wEx1;
+ wEx1 = 0;
+ }else{
+ if(pch1 == pchEnd1){
+ fEnd |= 0x1;
+ }else{
+ w1 = prgw[(BYTE)*pch1++];
+ }
+ }
+
+ // get the next weight from string #2
+ if(wEx2){ // we have the second weight of an expansion
+ w2 = wEx2;
+ wEx2 = 0;
+ }else{
+ if(pch2 == pchEnd2){
+ fEnd |= 0x2;
+ }else{
+ w2 = prgw[(BYTE)*pch2++];
+ }
+ }
+
+Lredo_chkend:;
+ if(fEnd){ // reached the end of one of our strings
+ if(fEnd & 0x1){
+ if(fEnd & 0x2) // reached end of both at the same time
+ goto Lend;
+ goto Lscan2;
+ }else{
+ ASSERT(fEnd&0x2);
+ goto Lscan1;
+ }
+ }
+
+ //if(w1 != w2)
+ {
+
+ aw1 = w1 & AWMASK;
+ aw2 = w2 & AWMASK;
+
+ //if(aw1 != aw2)
+ {
+
+ // handle special cases for w1
+#if 0
+ if(aw1 >= AW_UNSORTABLE && aw1 <= AW_MAXSW)
+#else //0
+ if(aw1 == AW_UNSORTABLE || w1 & SPECIALBIT)
+#endif //0
+ {
+ if((w1 & wSymbolBit) == 0)
+ sw1 = aw1;
+ fRedo |= 0x1;
+ }else if(w1 & wSymbolBit){
+ fRedo |= 0x1;
+ }
+
+#if 0
+ if(aw2 >= AW_UNSORTABLE && aw2 <= AW_MAXSW)
+#else //0
+ if(aw2 == AW_UNSORTABLE || w2 & SPECIALBIT)
+#endif //0
+ {
+ if((w2 & wSymbolBit) == 0)
+ sw2 = aw2;
+ fRedo |= 0x2;
+ }else if(w2 & wSymbolBit){
+ fRedo |= 0x2;
+ }
+
+ if(fRedo){
+ if(fRedo & 0x1){
+ if(pch1 == pchEnd1){
+ fEnd |= 0x1;
+ }else{
+ w1 = prgw[(BYTE)*pch1++];
+ }
+ }
+ if(fRedo & 0x2){
+ if(pch2 == pchEnd2){
+ fEnd |= 0x2;
+ }else{
+ w2 = prgw[(BYTE)*pch2++];
+ }
+ }
+ if((wHave & HAVE_SW) == 0){
+ if(sw1 != sw2){
+ sw = (sw1 < sw2) ? 1 : 3;
+ wHave |= HAVE_SW;
+ }
+ sw1 = sw2 = 0;
+ }
+ fRedo = 0;
+ goto Lredo_chkend; // may have reached the end-of-str
+ }
+
+ switch(aw1){
+#ifdef _DEBUG
+ case AW_DONTUSE:
+ ASSERT(UNREACHED);
+ break;
+#endif
+ case AW_EXPANSION:
+ pexp = &g_pstrinfo->prgexp[(w1 >> 8) & 0xFF];
+ w1 = pexp->w1;
+ wEx1 = pexp->w2;
+ aw1 = w1 & AWMASK;
+ break;
+ case AW_DIGRAPH:
+ pdig = &g_pstrinfo->prgdig[(w1 >> 8) & 0xFF];
+ w1 = pdig->w; // if its not a digraph, we use will this
+ // it cant be a digraph if were at the end of the string
+ if(pch1 < pchEnd1){
+ BYTE chNext = *pch1;
+ pdigEnd = pdig + D_ENTRY(pdig);
+ for(++pdig; pdig <= pdigEnd; ++pdig){
+ if(D_CH(pdig) == chNext){
+ ++pch1; // consume the second character
+ w1 = pdig->w; // use the digraph weight
+ break;
+ }
+ }
+ }
+ aw1 = w1 & AWMASK;
+ break;
+ }
+
+ switch(aw2){
+#ifdef _DEBUG
+ case AW_DONTUSE:
+ ASSERT(UNREACHED);
+ break;
+#endif
+ case AW_EXPANSION:
+ pexp = &g_pstrinfo->prgexp[(w2 >> 8) & 0xFF];
+ w2 = pexp->w1;
+ wEx2 = pexp->w2;
+ aw2 = w2 & AWMASK;
+ break;
+ case AW_DIGRAPH:
+ pdig = &g_pstrinfo->prgdig[(w2 >> 8) & 0xFF];
+ w2 = pdig->w; // if its not a digraph, we use will this
+ // it cant be a digraph if were at the end of the string
+ if(pch2 < pchEnd2){
+ BYTE chNext = *pch2;
+ pdigEnd = pdig + D_ENTRY(pdig);
+ for(++pdig; pdig <= pdigEnd; ++pdig){
+ if(D_CH(pdig) == chNext){
+ ++pch2; // consume the second character
+ w2 = pdig->w; // use the digraph weight
+ break;
+ }
+ }
+ }
+ aw2 = w2 & AWMASK;
+ break;
+ }
+
+ if(aw1 != aw2)
+ return (aw1 < aw2) ? 1 : 3;
+ }
+
+ // If were in a reverse diacritic locale, then we
+ // remember the last DW difference we see, not the first.
+ if((wHave & HAVE_DW) == 0 || g_pstrinfo->fRevDW){
+ dw1 = (w1 & DWMASK);
+ dw2 = (w2 & DWMASK);
+ if(dw1 != dw2){
+ dw = (dw1 < dw2) ? 1 : 3;
+ wHave |= HAVE_DW;
+ }
+ }
+
+ if((wHave & HAVE_CW) == 0){
+ cw1 = (w1 & CWMASK);
+ cw2 = (w2 & CWMASK);
+ if(cw1 != cw2){
+ cw = (cw1 < cw2) ? 1 : 3;
+ wHave |= HAVE_CW;
+ }
+ }
+
+ } /* w1 != w2 */
+ }
+
+#define IGNORE_WEIGHT(W) \
+ (((W) & AWMASK) == AW_UNSORTABLE || ((W) & wSymbolBit))
+
+Lscan1:;
+ // Is there anything in the remainder of string #1 that we shouldn't ignore?
+ if(!IGNORE_WEIGHT(w1) || wEx1)
+ return 3;
+ while(pch1 < pchEnd1){
+ w1 = prgw[(BYTE)*pch1++];
+ if(!IGNORE_WEIGHT(w1))
+ return 3;
+ }
+ goto Lend;
+
+Lscan2:;
+ // Is there anything in the remainder of string #2 that we shouldn't ignore?
+ if(!IGNORE_WEIGHT(w2) || wEx2)
+ return 1;
+ while(pch2 < pchEnd2){
+ w2 = prgw[(BYTE)*pch2++];
+ if(!IGNORE_WEIGHT(w2))
+ return 1;
+ }
+ goto Lend;
+
+#undef IGNORE_WEIGHT
+
+Lend:;
+
+ // reached the end of both strings without a decision
+ if((wHave & HAVE_DW) != 0 && (dwFlags & NORM_IGNORENONSPACE) == 0)
+ return dw;
+
+ if((wHave & HAVE_CW) != 0 && (dwFlags & NORM_IGNORECASE) == 0)
+ return cw;
+
+ if((wHave & HAVE_SW) != 0 && (dwFlags & NORM_IGNORESYMBOLS) == 0)
+ return sw;
+
+ return 2; // they're the same
+}
+
diff --git a/private/oleauto/src/dispatch/tables.c b/private/oleauto/src/dispatch/tables.c
new file mode 100644
index 000000000..1276697f1
--- /dev/null
+++ b/private/oleauto/src/dispatch/tables.c
@@ -0,0 +1,95 @@
+/***
+*tables.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Thie file contains the tables that describe the marshaling information
+* for the various TypeInfo related structures.
+*
+*Revision History:
+*
+* [00] 08-Mar-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "dispmrsh.h"
+
+
+HRESULT TypedescReadOrWrite(IStream FAR*, BOOL, void FAR*);
+
+FIELDDESC NEAR g_rgfdescIdldesc[] = {
+ FIELDDAT(IDLDESC, FT_WORD, wIDLFlags, NULL)
+#if defined(WIN16)
+ // this field is always zero. We mis-type it here as a LONG instead of
+ // a BSTR for 16/32 interop
+ , FIELDDAT(IDLDESC, FT_LONG, bstrIDLInfo, NULL)
+#else
+ , FIELDDAT(IDLDESC, FT_LONG, dwReserved, NULL)
+#endif
+ , FIELDEND()
+};
+
+FIELDDESC NEAR g_rgfdescElemdesc[] = {
+ FIELDDAT(ELEMDESC, FT_SPECIAL, tdesc, TypedescReadOrWrite)
+ , FIELDDAT(ELEMDESC, FT_STRUCT, idldesc, g_rgfdescIdldesc)
+ , FIELDEND()
+};
+
+// Note: be careful with the ordering of the following table. I
+// moved the entry for 'idldescType' to the front of the table to
+// work around a C7/C8 compiler bug that was generating an incorrect
+// fixup with it was in the table in its position as declared in
+// the TYPEATTR struct.
+
+FIELDDESC NEAR g_rgfdescTypeattr[] = {
+ FIELDDAT(TYPEATTR, FT_STRUCT, idldescType, g_rgfdescIdldesc)
+ , FIELDDAT(TYPEATTR, FT_ENUM, typekind, NULL)
+ , FIELDDAT(TYPEATTR, FT_WORD, wMajorVerNum, NULL)
+ , FIELDDAT(TYPEATTR, FT_WORD, wMinorVerNum, NULL)
+ , FIELDDAT(TYPEATTR, FT_LONG, lcid, NULL)
+ , FIELDDAT(TYPEATTR, FT_WORD, cFuncs, NULL)
+ , FIELDDAT(TYPEATTR, FT_WORD, cVars, NULL)
+ , FIELDDAT(TYPEATTR, FT_WORD, cImplTypes, NULL)
+ , FIELDDAT(TYPEATTR, FT_MBYTE, guid, NULL)
+ , FIELDDAT(TYPEATTR, FT_WORD, wTypeFlags, NULL)
+ , FIELDDAT(TYPEATTR, FT_WORD, cbAlignment, NULL)
+ , FIELDDAT(TYPEATTR, FT_LONG, cbSizeInstance, NULL)
+ , FIELDDAT(TYPEATTR, FT_WORD, cbSizeVft, NULL)
+ , FIELDDAT(TYPEATTR, FT_LONG, memidConstructor,NULL)
+ , FIELDDAT(TYPEATTR, FT_LONG, memidDestructor, NULL)
+ , FIELDEND()
+
+ /* NOTE: tdescAlias is read by hand, if typekind == TKIND_ALIAS */
+};
+
+FIELDDESC NEAR g_rgfdescFuncdesc[] = {
+ FIELDDAT(FUNCDESC, FT_STRUCT, elemdescFunc, g_rgfdescElemdesc)
+ , FIELDDAT(FUNCDESC, FT_LONG, memid, NULL)
+ , FIELDDAT(FUNCDESC, FT_ENUM, funckind, NULL)
+ , FIELDDAT(FUNCDESC, FT_ENUM, invkind, NULL)
+ , FIELDDAT(FUNCDESC, FT_ENUM, callconv, NULL)
+ , FIELDDAT(FUNCDESC, FT_SHORT, cParams, NULL)
+ , FIELDDAT(FUNCDESC, FT_SHORT, cParamsOpt, NULL)
+ , FIELDDAT(FUNCDESC, FT_SHORT, oVft, NULL)
+ , FIELDDAT(FUNCDESC, FT_WORD, wFuncFlags, NULL)
+ , FIELDEND()
+
+ /* NOTE: lprgelemdescParams is read by hand */
+};
+
+FIELDDESC NEAR g_rgfdescVardesc[] = {
+ FIELDDAT(VARDESC, FT_LONG, memid, NULL)
+ , FIELDDAT(VARDESC, FT_ENUM, varkind, NULL)
+ , FIELDDAT(VARDESC, FT_STRUCT, elemdescVar, g_rgfdescElemdesc)
+ , FIELDDAT(VARDESC, FT_WORD, wVarFlags, NULL)
+ , FIELDEND()
+
+ /* NOTE: the VARDESC union is read by hand */
+};
+
+
diff --git a/private/oleauto/src/dispatch/tcprox.cpp b/private/oleauto/src/dispatch/tcprox.cpp
new file mode 100644
index 000000000..9007030d1
--- /dev/null
+++ b/private/oleauto/src/dispatch/tcprox.cpp
@@ -0,0 +1,440 @@
+/***
+*tcprox.cpp
+*
+* Copyright (C) 1992-94, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the ITypeComp proxy class.
+*
+*Revision History:
+*
+* [00] 13-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "tcps.h"
+#include "tips.h"
+
+ASSERTDATA
+
+
+CProxTypeComp::CProxTypeComp(IUnknown FAR* punkOuter)
+ : m_unk(this), m_proxy(this), m_tcomp(this)
+{
+ if(punkOuter == NULL)
+ punkOuter = &m_unk;
+ m_punkOuter = punkOuter;
+}
+
+IUnknown FAR*
+CProxTypeComp::Create(IUnknown FAR* punkOuter)
+{
+ CProxTypeComp FAR* pproxtcomp;
+
+ if((pproxtcomp = new FAR CProxTypeComp(punkOuter)) != NULL){
+ pproxtcomp->m_refs = 1;
+ return &pproxtcomp->m_unk;
+ }
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeComp proxy class' IUnknown implementation
+//---------------------------------------------------------------------
+
+CPTCompUnkImpl::CPTCompUnkImpl(CProxTypeComp FAR* pproxtcomp)
+{
+ m_pproxtcomp = pproxtcomp;
+}
+
+STDMETHODIMP
+CPTCompUnkImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ *ppv = NULL;
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = (void FAR*)&(m_pproxtcomp->m_unk);
+ }else
+ if(IsEqualIID(riid, IID_IPROXY)){
+ *ppv = (void FAR*)&(m_pproxtcomp->m_proxy);
+ }else
+ if(IsEqualIID(riid, IID_ITypeComp)){
+ *ppv = (void FAR*)&(m_pproxtcomp->m_tcomp);
+ }
+ if(*ppv == NULL)
+ return RESULT(E_NOINTERFACE);
+ ((IUnknown FAR*)*ppv)->AddRef();
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CPTCompUnkImpl::AddRef()
+{
+ return ++m_pproxtcomp->m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPTCompUnkImpl::Release()
+{
+ if(--m_pproxtcomp->m_refs==0){
+ delete m_pproxtcomp;
+ return 0;
+ }
+ return m_pproxtcomp->m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeComp proxy class' IRpcProxy implementation
+//---------------------------------------------------------------------
+
+CPTCompProxImpl::CPTCompProxImpl(CProxTypeComp FAR* pproxtcomp)
+{
+ m_pproxtcomp = pproxtcomp;
+}
+
+CPTCompProxImpl::~CPTCompProxImpl()
+{
+ if(m_pproxtcomp->m_plrpc)
+ m_pproxtcomp->m_plrpc->Release();
+}
+
+STDMETHODIMP
+CPTCompProxImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxtcomp->m_unk.QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPTCompProxImpl::AddRef()
+{
+ return m_pproxtcomp->m_unk.AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPTCompProxImpl::Release()
+{
+ return m_pproxtcomp->m_unk.Release();
+}
+
+STDMETHODIMP
+CPTCompProxImpl::Connect(ICHANNEL FAR* plrpc)
+{
+ if(plrpc){
+ plrpc->AddRef();
+ m_pproxtcomp->m_plrpc = plrpc;
+ return m_pproxtcomp->m_tcomp.SysKind();
+ }
+ return RESULT(E_FAIL);
+}
+
+STDMETHODIMP_(void)
+CPTCompProxImpl::Disconnect()
+{
+ if(m_pproxtcomp->m_plrpc)
+ m_pproxtcomp->m_plrpc->Release();
+ m_pproxtcomp->m_plrpc = NULL;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeComp proxy class' ITypeComp methods
+//---------------------------------------------------------------------
+
+CPTCompTypeCompImpl::CPTCompTypeCompImpl(CProxTypeComp FAR* pproxtcomp)
+{
+ m_pproxtcomp = pproxtcomp;
+ m_syskindStub = (SYSKIND)-1; // something invalid
+}
+
+STDMETHODIMP
+CPTCompTypeCompImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxtcomp->m_punkOuter->QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPTCompTypeCompImpl::AddRef()
+{
+ return m_pproxtcomp->m_punkOuter->AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPTCompTypeCompImpl::Release()
+{
+ return m_pproxtcomp->m_punkOuter->Release();
+}
+
+//
+// ITypeComp methods
+//
+
+/***
+*HRESULT CPTCompTypeCompImpl::Bind
+*Purpose:
+* Proxy implementation of ITypeComp::Bind
+*
+* Marshal out:
+* ULONG lHashVal
+* WORD wFlags
+* BSTR bstrName
+*
+* Marshal in:
+* HRESULT hresultRet
+* ULONG desckind
+* BINDPTR bindptr
+* if(desckind == DESCKIND_FUNCDESC || desckind == DESCKIND_VARDESC)
+* ITypeInfo* ptinfo
+*
+*Entry:
+* szName =
+* lHashVal =
+* wFlags =
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPTCompTypeCompImpl::Bind(
+ OLECHAR FAR* szName,
+ unsigned long lHashVal,
+ unsigned short wFlags,
+ ITypeInfo FAR* FAR* pptinfo,
+ DESCKIND FAR* pdesckind,
+ BINDPTR FAR* pbindptr)
+{
+ BSTR bstr;
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ VARDESC FAR* pvardesc;
+ FUNCDESC FAR* pfuncdesc;
+ unsigned long ulDesckind;
+ HRESULT hresult, hresultRet;
+
+#if ID_DEBUG
+ if(IsBadWritePtr(pptinfo, sizeof(*pptinfo)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pdesckind, sizeof(*pdesckind)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pbindptr, sizeof(*pbindptr)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ pstm = NULL;
+ bstr = NULL;
+ pvardesc = NULL;
+ pfuncdesc = NULL;
+
+ if((plrpc = m_pproxtcomp->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPECOMP_BIND, 256, IID_ITypeComp);
+
+ IfFailGo(PUT(pstm, lHashVal), LError1);
+ IfFailGo(PUT(pstm, wFlags), LError1);
+ IfFailGo(ErrSysAllocString(szName, &bstr), LError1);
+ IfFailGo(BstrWrite(pstm, bstr, m_syskindStub), LError1);
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, ulDesckind), LError1);
+ *pdesckind = (DESCKIND)ulDesckind;
+
+ if(ulDesckind == DESCKIND_IMPLICITAPPOBJ)
+ ulDesckind = DESCKIND_VARDESC; // it looks like a VARDESC to us
+
+ switch(ulDesckind){
+ case DESCKIND_NONE:
+ break;
+
+ case DESCKIND_VARDESC:
+ if((pvardesc = new VARDESC) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+ IfFailGo(VardescRead(pstm, pvardesc, m_syskindStub), LError1);
+ DispUnmarshalInterface(pstm, IID_ITypeInfo, (void FAR* FAR*)pptinfo);
+ pbindptr->lpvardesc = pvardesc;
+ pvardesc = NULL;
+ break;
+
+ case DESCKIND_FUNCDESC:
+ if((pfuncdesc = new FUNCDESC) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+ IfFailGo(FuncdescRead(pstm, pfuncdesc, m_syskindStub), LError1);
+ DispUnmarshalInterface(pstm, IID_ITypeInfo, (void FAR* FAR*)pptinfo);
+ pbindptr->lpfuncdesc = pfuncdesc;
+ pfuncdesc = NULL;
+ break;
+
+ case DESCKIND_TYPECOMP:
+ *pptinfo = NULL;
+ IfFailGo(
+ DispUnmarshalInterface(pstm, IID_ITypeComp, (void FAR* FAR*)&pbindptr->lptcomp),
+ LError1);
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ }
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ if(pvardesc != NULL)
+ DoReleaseVarDesc(pvardesc);
+ if(pfuncdesc != NULL)
+ DoReleaseFuncDesc(pfuncdesc);
+ SysFreeString(bstr);
+ if(pstm != NULL)
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTCompTypeCompImpl::BindType
+*Purpose:
+* Proxy implementation of ITypeComp::BindType
+*
+* Marshal out:
+* ULONG lHashVal
+* OLECHAR* szName
+*
+* Marshal in:
+* HRESULT hresultRet
+* ITypeInfo *ptinfo
+* ITypeComp *ptcomp
+*
+*Entry:
+* szName =
+* lHashVal =
+*
+*Exit:
+* return value = HRESULT
+*
+* *pptinfo =
+* *pptcompReserved =
+*
+***********************************************************************/
+STDMETHODIMP
+CPTCompTypeCompImpl::BindType(
+ OLECHAR FAR* szName,
+ unsigned long lHashVal,
+ ITypeInfo FAR* FAR* pptinfo,
+ ITypeComp FAR* FAR* pptcompReserved)
+{
+ BSTR bstr;
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ ITypeInfo FAR* ptinfo;
+ HRESULT hresult, hresultRet;
+
+#if ID_DEBUG
+ if(IsBadWritePtr(pptinfo, sizeof(*pptinfo)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pptcompReserved, sizeof(*pptcompReserved)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ pstm = NULL;
+ bstr = NULL;
+ ptinfo = NULL;
+ *pptcompReserved = NULL; // set reserved out parm to NULL
+
+ if((plrpc = m_pproxtcomp->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPECOMP_BINDTYPE, 256, IID_ITypeComp);
+
+ IfFailGo(PUT(pstm, lHashVal), LError1);
+ IfFailGo(ErrSysAllocString(szName, &bstr), LError1);
+ IfFailGo(BstrWrite(pstm, bstr, m_syskindStub), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(DispUnmarshalInterface(pstm, IID_ITypeInfo, (void FAR* FAR*)&ptinfo), LError1);
+
+ if(pptinfo != NULL){
+ if(ptinfo != NULL)
+ ptinfo->AddRef();
+ *pptinfo = ptinfo;
+ }
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ if(ptinfo != NULL)
+ ptinfo->Release();
+ SysFreeString(bstr);
+ if(pstm != NULL)
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTCompTypeCompImpl::SysKind
+*Purpose:
+* Exchange syskinds between proxy and stub.
+*
+* Marshal In:
+* ULONG syskindProxy
+*
+* Marshal Out:
+* ULONG syskindStub
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CPTCompTypeCompImpl::SysKind()
+{
+ HRESULT hresult;
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ unsigned long syskind;
+
+ if((plrpc = m_pproxtcomp->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPECOMP_SYSKIND, 32, IID_ITypeComp);
+
+ syskind = (unsigned long)SYS_CURRENT;
+ IfFailGo(PUT(pstm, syskind), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(GET(pstm, syskind), LError1);
+ m_syskindStub = (SYSKIND)syskind;
+
+LError1:
+ pstm->Release();
+ return hresult;
+}
diff --git a/private/oleauto/src/dispatch/tcps.h b/private/oleauto/src/dispatch/tcps.h
new file mode 100644
index 000000000..20b35e6f7
--- /dev/null
+++ b/private/oleauto/src/dispatch/tcps.h
@@ -0,0 +1,196 @@
+/***
+*tcps.h - ITypeComp Proxy and Stub class definitions
+*
+* Copyright (C) 1992-94, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the ITypeComp Proxy and Stub classes.
+*
+* CProxTypeComp -- the ITypeComp proxy class
+* CPTCompUnkImpl - CProxTypeComp implementation of IUnknown
+* CPTCompProxImpl - CProxTypeComp implementation of IRpcProxy
+* CPTCompTypeCompImpl - CProxTypeComp implementation of ITypeComp
+*
+* CStubTypeComp -- the ITypeComp stub class
+*
+*Revision History:
+*
+* [00] 13-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+// forward declarations
+class FAR CProxTypeComp;
+class FAR CStubTypeComp;
+
+
+// ITypeComp proxy class' IUnknown implementation
+class FAR CPTCompUnkImpl : public IUnknown
+{
+public:
+ CPTCompUnkImpl(CProxTypeComp FAR* pproxtcomp);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+private:
+ CProxTypeComp FAR* m_pproxtcomp;
+};
+
+
+// ITypeComp proxy class' IRpcProxy implementation
+class FAR CPTCompProxImpl : public IPROXY
+{
+public:
+ CPTCompProxImpl(CProxTypeComp FAR* pproxtcomp);
+ ~CPTCompProxImpl();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(Connect)(ICHANNEL FAR* plrpc);
+ STDMETHOD_(void, Disconnect)(void);
+
+private:
+ CProxTypeComp FAR* m_pproxtcomp;
+};
+
+
+// ITypeComp
+class FAR CPTCompTypeCompImpl : public ITypeComp
+{
+public:
+ CPTCompTypeCompImpl(CProxTypeComp FAR* pproxtcomp);
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // ITypeComp methods
+ STDMETHOD(Bind)(
+ OLECHAR FAR* szName,
+ unsigned long lHashVal,
+ unsigned short wflags,
+ ITypeInfo FAR* FAR* pptinfo,
+ DESCKIND FAR* pdesckind,
+ BINDPTR FAR* pbindptr);
+
+ STDMETHOD(BindType)(
+ OLECHAR FAR* szName,
+ unsigned long lHashVal,
+ ITypeInfo FAR* FAR* pptinfo,
+ ITypeComp FAR* FAR* pptcomp);
+
+ HRESULT SysKind(void);
+
+private:
+ SYSKIND m_syskindStub;
+ CProxTypeComp FAR* m_pproxtcomp;
+};
+
+// ITypeComp Proxy Class
+class FAR CProxTypeComp
+{
+public:
+ static IUnknown FAR* Create(IUnknown FAR* punkOuter);
+
+private:
+ CProxTypeComp(IUnknown FAR* punkOuter);
+
+ friend CPTCompUnkImpl;
+ friend CPTCompProxImpl;
+ friend CPTCompTypeCompImpl;
+
+ CPTCompUnkImpl m_unk;
+ CPTCompProxImpl m_proxy;
+ CPTCompTypeCompImpl m_tcomp;
+
+private:
+
+ unsigned long m_refs;
+ ICHANNEL FAR* m_plrpc;
+ IUnknown FAR* m_punkOuter;
+};
+
+// ITypeComp Stub Class
+//
+class FAR CStubTypeComp : public ISTUB
+{
+public:
+ static HRESULT Create(IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IRpcStub methods
+ //
+#if (OE_WIN32 || defined(WOW))
+ STDMETHOD(Connect)(IUnknown FAR* pUnk);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg,
+ IRpcChannelBuffer FAR* pRpcChannel);
+ STDMETHOD_(IRpcStubBuffer *, IsIIDSupported)(REFIID iid);
+ STDMETHOD_(ULONG, CountRefs)(void);
+ STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv);
+ STDMETHOD_(void, DebugServerRelease)(void FAR* pv);
+#else
+ STDMETHOD(Connect)(IUnknown FAR* punkObject);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(
+ REFIID riid,
+ int imeth,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx);
+#if OE_MAC
+ STDMETHOD_(unsigned long, IsIIDSupported)(REFIID riid);
+#else
+ STDMETHOD_(BOOL, IsIIDSupported)(REFIID riid);
+#endif
+ STDMETHOD_(unsigned long, CountRefs)(void);
+#endif
+
+ // introduced methods
+ HRESULT Bind(void);
+ HRESULT BindType(void);
+
+ HRESULT SysKind(void);
+
+ // helpers
+ HRESULT MarshalResult(void);
+
+private:
+ CStubTypeComp();
+ ~CStubTypeComp();
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punk;
+ ITypeComp FAR* m_ptcomp;
+ IStream FAR* m_pstm;
+ SYSKIND m_syskindProxy;
+};
+
+
+// ITypeComp method indices
+//
+enum IMETH_TYPECOMP {
+ IMETH_TYPECOMP_QUERYINTERFACE = 0,
+ IMETH_TYPECOMP_ADDREF,
+ IMETH_TYPECOMP_RELEASE,
+
+ IMETH_TYPECOMP_BIND,
+ IMETH_TYPECOMP_BINDTYPE,
+
+ IMETH_TYPECOMP_SYSKIND
+};
+
diff --git a/private/oleauto/src/dispatch/tcstub.cpp b/private/oleauto/src/dispatch/tcstub.cpp
new file mode 100644
index 000000000..0a1e07856
--- /dev/null
+++ b/private/oleauto/src/dispatch/tcstub.cpp
@@ -0,0 +1,496 @@
+/***
+*tcstub.cpp
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the ITypeComp stub class.
+*
+*Revision History:
+*
+* [00] 05-Apr-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "tcps.h"
+#include "tips.h"
+
+ASSERTDATA
+
+
+CStubTypeComp::CStubTypeComp()
+{
+ m_refs = 0;
+ m_pstm = NULL;
+ m_punk = NULL;
+ m_ptcomp = NULL;
+ m_syskindProxy = (SYSKIND)-1; // something invalid
+}
+
+CStubTypeComp::~CStubTypeComp()
+{
+ Disconnect();
+}
+
+HRESULT
+CStubTypeComp::Create(IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub)
+{
+ CStubTypeComp FAR* pstub;
+
+ if(pstub = new FAR CStubTypeComp()){
+ pstub->m_refs = 1;
+ *ppstub = pstub;
+ if (punkServer)
+ return pstub->Connect(punkServer);
+ return NOERROR;
+ }
+ return RESULT(E_OUTOFMEMORY);
+}
+
+
+//---------------------------------------------------------------------
+// ITypeComp stub class' IUnknown implementation
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CStubTypeComp::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else if(IsEqualIID(riid, IID_ISTUB)){
+ *ppv = this;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ ++m_refs;
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubTypeComp::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubTypeComp::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeComp stub class' IRpcStub implementation
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CStubTypeComp::Connect(IUnknown FAR* punkObj)
+{
+#if (defined(WIN32) || defined(WOW))
+ ASSERT(m_punk == NULL && m_ptcomp == NULL);
+ //This will keep the server object alive until we disconnect.
+ IfFailRet(punkObj->QueryInterface(IID_ITypeComp, (void FAR* FAR*)&m_ptcomp));
+ punkObj->AddRef();
+ m_punk = punkObj;
+ return NOERROR;
+#else
+ if(m_punk)
+ return RESULT(E_FAIL); // call Disconnect first
+
+ if (punkObj) {
+ punkObj->AddRef();
+ m_punk = punkObj;
+ }
+ return NOERROR;
+#endif
+}
+
+STDMETHODIMP_(void)
+CStubTypeComp::Disconnect()
+{
+ if(m_punk){
+ m_punk->Release();
+ m_punk = NULL;
+ }
+ if(m_ptcomp){
+ m_ptcomp->Release();
+ m_ptcomp = NULL;
+ }
+}
+
+/***
+*PUBLIC HRESULT CStubTypeComp::Invoke
+*
+*Purpose:
+* Dispatch the method with the given index (imeth) on the given
+* interface, using the arguments serialized in the given stream.
+*
+* This function is the callee side of an LRPC call.
+*
+*Entry:
+* iid = the IID of the interface on which we are to make the call
+* imeth = the method index
+* pstm = the IStream containing the method's actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CStubTypeComp::Invoke(
+#if (OE_WIN32 || defined(WOW))
+ RPCOLEMESSAGE *pMessage,
+ ICHANNEL *pRpcChannel)
+#else
+ REFIID riid,
+ int iMethod,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx)
+#endif
+{
+ HRESULT hresult;
+
+#if (OE_WIN32 || defined(WOW))
+ IStream FAR* pstm;
+
+ if(!m_punk)
+ return RESULT(E_FAIL);
+
+ OPEN_STUB_STREAM(pstm, pRpcChannel, pMessage, IID_ITypeComp);
+
+#else
+ UNUSED(dwDestCtx);
+ UNUSED(pvDestCtx);
+
+ if(!IsEqualIID(riid, IID_ITypeComp))
+ return RESULT(E_NOINTERFACE);
+
+ if(!m_punk)
+ return RESULT(E_FAIL);
+
+ if(m_ptcomp == NULL)
+ IfFailRet(m_punk->QueryInterface(IID_ITypeComp, (void FAR* FAR*)&m_ptcomp));
+#endif
+
+
+ m_pstm = pstm;
+
+ switch(GET_IMETHOD(pMessage)){
+ case IMETH_TYPECOMP_BIND:
+ hresult = Bind();
+ break;
+ case IMETH_TYPECOMP_BINDTYPE:
+ hresult = BindType();
+ break;
+ case IMETH_TYPECOMP_SYSKIND:
+ hresult = SysKind();
+ break;
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+
+ RESET_STREAM(pstm);
+ DELETE_STREAM(pstm);
+ m_pstm = NULL;
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT CStubTypeComp::IsIIDSupported(REFIID)
+*Purpose:
+* Answer if the given IID is supported by this stub.
+*
+*Entry:
+* iid = the IID to query for support
+*
+*Exit:
+* return value = BOOL. TRUE if IID is supported, FALSE otherwise.
+*
+***********************************************************************/
+#if OE_MAC
+STDMETHODIMP_(unsigned long)
+#elif (OE_WIN32 || defined(WOW))
+STDMETHODIMP_(IRpcStubBuffer *)
+#else
+STDMETHODIMP_(BOOL)
+#endif
+CStubTypeComp::IsIIDSupported(REFIID riid)
+{
+#if (OE_WIN32 || defined(WOW))
+ IRpcStubBuffer *pStub = 0;
+ if (IsEqualIID(riid, IID_ITypeComp)) {
+ AddRef();
+ pStub = (IRpcStubBuffer *) this;
+ }
+ return pStub;
+#else
+ // REVIEW: I don't understand this, but thats the way Ole does it...
+ if(m_punk == NULL)
+ return FALSE;
+
+ return(IsEqualIID(riid, IID_ITypeComp));
+#endif
+}
+
+/***
+*unsigned long CStubTypeComp::CountRefs
+*Purpose:
+* Return the count of references held by this stub.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long, the count of refs.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CStubTypeComp::CountRefs()
+{
+ unsigned long refs;
+
+ refs = 0;
+
+ if(m_punk != NULL)
+ ++refs;
+
+ if(m_ptcomp != NULL)
+ ++refs;
+
+ return refs;
+}
+
+/***
+*PRIVATE HRESULT CStubTypeComp::Bind
+*Purpose:
+* The stub implementation of ITypeComp::Bind
+*
+*Entry:
+* None
+*
+* Marshal In:
+* ULONG lHashVal
+* WORD wFlags
+* BSTR bstrName
+*
+* Marshal Out:
+* HRESULT hresultRet
+* ULONG desckind
+* BINDPTR bindptr
+* if(desckind == DESCKIND_VARDESC || desckind == DESCKIND_FUNCDESC)
+* ITypeInfo *ptinfo;
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeComp::Bind()
+{
+ BSTR bstrName;
+ BINDPTR bindptr;
+ DESCKIND desckind;
+ ITypeInfo FAR* ptinfo;
+ unsigned short wFlags;
+ unsigned long lHashVal;
+ unsigned long ulDesckind;
+ HRESULT hresult, hresultRet;
+
+ ptinfo = NULL;
+ bstrName = NULL;
+ hresult = NOERROR;
+ desckind = DESCKIND_NONE;
+
+ IfFailGo(GET(m_pstm, lHashVal), LError1);
+ IfFailGo(GET(m_pstm, wFlags), LError1);
+ IfFailGo(BstrRead(m_pstm, &bstrName, m_syskindProxy), LError1);
+
+ hresultRet = m_ptcomp->Bind(bstrName,
+ lHashVal,
+ wFlags,
+ &ptinfo,
+ &desckind,
+ &bindptr);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ ulDesckind = (unsigned long)desckind;
+ IfFailGo(PUT(m_pstm, ulDesckind), LError1);
+
+ switch(desckind){
+ case DESCKIND_NONE:
+ break;
+ case DESCKIND_VARDESC:
+ case DESCKIND_IMPLICITAPPOBJ:
+ IfFailGo(VardescWrite(m_pstm, bindptr.lpvardesc, m_syskindProxy),LError1);
+ IfFailGo(DispMarshalInterface(m_pstm, IID_ITypeInfo, ptinfo), LError1);
+ break;
+ case DESCKIND_FUNCDESC:
+ IfFailGo(FuncdescWrite(m_pstm,bindptr.lpfuncdesc,m_syskindProxy),LError1);
+ IfFailGo(DispMarshalInterface(m_pstm, IID_ITypeInfo, ptinfo), LError1);
+ break;
+ case DESCKIND_TYPECOMP:
+ IfFailGo(
+ DispMarshalInterface(m_pstm, IID_ITypeComp, bindptr.lptcomp),
+ LError1);
+ break;
+ default:
+ ASSERT(UNREACHED);
+ hresult = RESULT(DISP_E_BADCALLEE); // REVIEW: error code?
+ goto LError1;
+ }
+
+ hresult = NOERROR;
+
+LError1:;
+ switch(desckind){
+ case DESCKIND_VARDESC:
+ case DESCKIND_IMPLICITAPPOBJ:
+ ASSERT(ptinfo != NULL);
+ ptinfo->ReleaseVarDesc(bindptr.lpvardesc);
+ break;
+ case DESCKIND_FUNCDESC:
+ ASSERT(ptinfo != NULL);
+ ptinfo->ReleaseFuncDesc(bindptr.lpfuncdesc);
+ break;
+ case DESCKIND_TYPECOMP:
+ bindptr.lptcomp->Release();
+ break;
+ }
+ if(ptinfo != NULL)
+ ptinfo->Release();
+ SysFreeString(bstrName);
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT CStubTypeComp::BindType
+*Purpose:
+* The stub implementation of ITypeComp::BindType
+*
+*Entry:
+* None
+*
+* Marshal In:
+* ULONG lHashVal
+* BSTR bstrName
+*
+* Marshal Out:
+* HRESULT hresultRet
+* ITypeInfo *ptinfo
+* ITypeComp *ptcomp
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeComp::BindType()
+{
+ BSTR bstrName;
+ ITypeInfo FAR* ptinfo;
+ ITypeComp FAR* ptcomp;
+ unsigned long lHashVal;
+ HRESULT hresult, hresultRet;
+
+ ptinfo = NULL;
+ bstrName = NULL;
+
+ IfFailGo(GET(m_pstm, lHashVal), LError1);
+ IfFailGo(BstrRead(m_pstm, &bstrName, m_syskindProxy), LError1);
+
+ // NOTE: ptcomp is unused (reserved for future use). The docs say
+ // to pass NULL, but thats not right, we must pass something
+ // because typelib.dll assigns NULL to it!
+ ptcomp = NULL;
+ hresultRet = m_ptcomp->BindType(bstrName, lHashVal, &ptinfo, &ptcomp);
+ ASSERT(ptcomp == NULL);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ hresult = DispMarshalInterface(m_pstm, IID_ITypeInfo, ptinfo);
+
+LError1:;
+ if(ptinfo != NULL)
+ ptinfo->Release();
+ SysFreeString(bstrName);
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeComp::SysKind
+*Purpose:
+* Exchange syskinds with the proxy were connected to.
+*
+* Marshal In:
+* ULONG syskindProxy
+*
+* Marshal Out:
+* ULONG syskindStub
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeComp::SysKind()
+{
+ unsigned long syskind;
+
+ IfFailRet(GET(m_pstm, syskind));
+ m_syskindProxy = (SYSKIND)syskind;
+ syskind = (unsigned long)SYS_CURRENT;
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailRet(PUT(m_pstm, syskind));
+
+ return NOERROR;
+}
+
+#if (OE_WIN32 || defined(WOW))
+
+STDMETHODIMP
+CStubTypeComp::DebugServerQueryInterface(void FAR* FAR* ppv)
+{
+ *ppv = m_ptcomp;
+ return S_OK;
+}
+
+
+STDMETHODIMP_(void)
+CStubTypeComp::DebugServerRelease(void FAR* ppv)
+{ }
+
+#endif
diff --git a/private/oleauto/src/dispatch/time-api.cpp b/private/oleauto/src/dispatch/time-api.cpp
new file mode 100644
index 000000000..9f7df6685
--- /dev/null
+++ b/private/oleauto/src/dispatch/time-api.cpp
@@ -0,0 +1,173 @@
+/***
+*time-api.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Variant (application) time conversion routines.
+*
+* DosDateTimeToVariantTime()
+* VariantTimeToDosDateTime()
+*
+*
+*Revision History:
+*
+* [00] 15-Dec-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+* Variant time format
+* -------------------
+* This is also know as application time because its the format many
+* applications use. It is also the BASIC serialized or packed time format.
+*
+* A Variant time is stored in an 8 byte real (double), whose range
+* of values represent the dates from January 1, 1753 and
+* December 31, 2078 inclusive, where 2.0 represents January 1, 1900.
+* Negative numbers represent the dates prior to December 30, 1899.
+*
+*
+* Dos date/time format
+* --------------------
+*
+* The Dos date and time are stored in two packed 16-bit words as follows:
+*
+* Dos Date,
+*
+* 15 9 8 5 4 0
+* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+* | year (7) | month (4) | day (5) |
+* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+*
+* Year 1980 = 0
+* month january = 1
+* day first = 1
+*
+*
+* Dos Time,
+*
+* 15 11 10 5 4 0
+* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+* | hour (5) | min (6) | sec (5) |
+* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+*
+* hour 0-23
+* min 0-59
+* sec 0-29 (in 2 second increments)
+*
+*
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+ASSERTDATA
+
+
+/***
+*PUBLIC HRESULT DosDateTimeToVariantTime(unsigned short, unsigned short, double*)
+*Purpose:
+* Convert the given Dos date/time to a VARIANT time.
+*
+*Entry:
+* wDosDate = Dos date word
+* wDosTime = Dos time word
+*
+*Exit:
+* return value = int, TRUE if successful, FALSE if not.
+*
+* *pvtime = VARIANT time
+*
+***********************************************************************/
+STDAPI_(int)
+DosDateTimeToVariantTime(
+ unsigned short wDosDate,
+ unsigned short wDosTime,
+ double FAR* pvtime)
+{
+ UDS uds;
+ VARIANT var;
+
+#ifdef _DEBUG
+ if(IsBadWritePtr(pvtime, sizeof(*pvtime)))
+ return FALSE;
+#endif
+
+ uds.Year = ((wDosDate >> 9) & 0x7f) + 1980;
+ uds.Month = ((wDosDate >> 5) & 0x0f);
+ uds.DayOfMonth = ((wDosDate >> 0) & 0x1f);
+
+ uds.Hour = (wDosTime >> 11) & 0x1f;
+ uds.Minute = (wDosTime >> 5) & 0x3f;
+ uds.Second = ((wDosTime >> 0) & 0x1f) * 2;
+
+ if(uds.Year < 0 || uds.Month < 0 || uds.DayOfMonth < 0)
+ return FALSE;
+ if(uds.Year > 2099 || uds.Month > 12 || uds.DayOfMonth > 31)
+ return FALSE;
+ if(uds.Hour < 0 || uds.Minute < 0 || uds.Second < 0)
+ return FALSE;
+ if(uds.Hour > 23 || uds.Minute > 59 || uds.Second > 59)
+ return FALSE;
+
+ V_VT(&var) = VT_EMPTY;
+
+ if(ErrPackDate(&uds, &var, FALSE, 0) != NOERROR)
+ return FALSE;
+
+ ASSERT(V_VT(&var) == VT_DATE);
+
+ *pvtime = V_R8(&var);
+
+ return TRUE;
+}
+
+
+/***
+*HRESULT VariantTimeToDosDateTime(double, unsigned short*, unsigned short)
+*Purpose:
+* Convert a VARIANT time to a Dos date and time words.
+*
+*Entry:
+* vtime = VARIANT TIME
+*
+*Exit:
+* return value = HRESULT
+*
+* *pwDosDate = Dos date word
+* *pwDosTime = Dos time word
+*
+***********************************************************************/
+STDAPI_(int)
+VariantTimeToDosDateTime(
+ double vtime,
+ unsigned short FAR* pwDosDate,
+ unsigned short FAR* pwDosTime)
+{
+ UDS uds;
+ VARIANT var;
+
+#ifdef _DEBUG
+ if(IsBadWritePtr(pwDosDate, sizeof(*pwDosDate)))
+ return FALSE;
+ if(IsBadWritePtr(pwDosTime, sizeof(*pwDosTime)))
+ return FALSE;
+#endif
+
+ V_VT(&var) = VT_R8;
+ V_R8(&var) = vtime;
+ if(ErrUnpackDate(&uds, &var) != NOERROR)
+ return FALSE;
+
+ if(uds.Year < 1980 || uds.Year > 2099)
+ return FALSE;
+
+ uds.Year -= 1980;
+ uds.Second /= 2;
+
+ *pwDosDate = (uds.Year << 9) + (uds.Month << 5) + uds.DayOfMonth;
+ *pwDosTime = (uds.Hour << 11) + (uds.Minute << 5) + uds.Second;
+
+ return TRUE;
+}
diff --git a/private/oleauto/src/dispatch/tiprox.cpp b/private/oleauto/src/dispatch/tiprox.cpp
new file mode 100644
index 000000000..59999a62c
--- /dev/null
+++ b/private/oleauto/src/dispatch/tiprox.cpp
@@ -0,0 +1,1627 @@
+/***
+*tiprox.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the ITypeInfo proxy class.
+*
+*Revision History:
+*
+* [00] 06-Dec-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "tips.h"
+
+
+CProxTypeInfo::CProxTypeInfo(IUnknown FAR* punkOuter)
+ : m_unk(this), m_proxy(this), m_tinfo(this)
+{
+ if(punkOuter == NULL)
+ punkOuter = &m_unk;
+ m_punkOuter = punkOuter;
+}
+
+IUnknown FAR*
+CProxTypeInfo::Create(IUnknown FAR* punkOuter)
+{
+ CProxTypeInfo FAR* pproxtinfo;
+
+ if((pproxtinfo = new FAR CProxTypeInfo(punkOuter)) != NULL){
+ pproxtinfo->m_refs = 1;
+ return &pproxtinfo->m_unk;
+ }
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeInfo proxy class' IUnknown implementation
+//---------------------------------------------------------------------
+
+CPTIUnkImpl::CPTIUnkImpl(CProxTypeInfo FAR* pproxtinfo)
+{
+ m_pproxtinfo = pproxtinfo;
+}
+
+STDMETHODIMP
+CPTIUnkImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = (void FAR*)&(m_pproxtinfo->m_unk);
+ AddRef();
+ return NOERROR;
+ }
+
+ if(IsEqualIID(riid, IID_IPROXY)){
+ *ppv = (void FAR*)&(m_pproxtinfo->m_proxy);
+ AddRef();
+ return NOERROR;
+ }
+
+ if(IsEqualIID(riid, IID_ITypeInfo)){
+ *ppv = (void FAR*)&(m_pproxtinfo->m_tinfo);
+ m_pproxtinfo->m_punkOuter->AddRef();
+ return NOERROR;
+ }
+
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CPTIUnkImpl::AddRef()
+{
+ return ++m_pproxtinfo->m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPTIUnkImpl::Release()
+{
+ if(--m_pproxtinfo->m_refs==0){
+ delete m_pproxtinfo;
+ return 0;
+ }
+ return m_pproxtinfo->m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeInfo proxy class' IRpcProxy implementation
+//---------------------------------------------------------------------
+
+CPTIProxImpl::CPTIProxImpl(CProxTypeInfo FAR* pproxtinfo)
+{
+ m_pproxtinfo = pproxtinfo;
+}
+
+CPTIProxImpl::~CPTIProxImpl()
+{
+ if(m_pproxtinfo->m_plrpc)
+ m_pproxtinfo->m_plrpc->Release();
+}
+
+STDMETHODIMP
+CPTIProxImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxtinfo->m_unk.QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPTIProxImpl::AddRef()
+{
+ return m_pproxtinfo->m_unk.AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPTIProxImpl::Release()
+{
+ return m_pproxtinfo->m_unk.Release();
+}
+
+STDMETHODIMP
+CPTIProxImpl::Connect(ICHANNEL FAR* plrpc)
+{
+ if(plrpc){
+ plrpc->AddRef();
+ m_pproxtinfo->m_plrpc = plrpc;
+ return NOERROR;
+ }
+ return RESULT(E_FAIL);
+}
+
+STDMETHODIMP_(void)
+CPTIProxImpl::Disconnect()
+{
+ if(m_pproxtinfo->m_plrpc)
+ m_pproxtinfo->m_plrpc->Release();
+ m_pproxtinfo->m_plrpc = NULL;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeInfo proxy class' ITypeInfo methods
+//---------------------------------------------------------------------
+
+CPTITypeInfoImpl::CPTITypeInfoImpl(CProxTypeInfo FAR* pproxtinfo)
+{
+ m_pproxtinfo = pproxtinfo;
+}
+
+STDMETHODIMP
+CPTITypeInfoImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxtinfo->m_punkOuter->QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPTITypeInfoImpl::AddRef()
+{
+ return m_pproxtinfo->m_punkOuter->AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPTITypeInfoImpl::Release()
+{
+ return m_pproxtinfo->m_punkOuter->Release();
+}
+
+/***
+*HRESULT CPTITypeInfoImpl::GetTypeAttr
+*Purpose:
+*
+* Out:
+* None
+*
+* In:
+* <HRESULT hresultRet>
+* <TYPEATTR typeattr>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetTypeAttr(TYPEATTR FAR* FAR* pptypeattr)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ TYPEATTR FAR* ptypeattr;
+ HRESULT hresult, hresultRet;
+ unsigned long _proxySysKind, _stubSysKind;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETTYPEATTR, 256, IID_ITypeInfo);
+
+ _proxySysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, _stubSysKind), LError1);
+
+ if((ptypeattr = new FAR TYPEATTR) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ IfFailGo(TypeattrRead(pstm, ptypeattr, (SYSKIND) _stubSysKind), LError1);
+
+ *pptypeattr = ptypeattr;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+
+/***
+*CPTITypeInfoImpl::GetTypeComp
+*Purpose:
+*
+* Out:
+* None
+*
+* In:
+* <HRESULT hresultRet>
+* <ITypeComp tcomp>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetTypeComp(ITypeComp FAR* FAR* pptcomp)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETTYPECOMP, 256, IID_ITypeInfo);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(
+ DispUnmarshalInterface(pstm, IID_ITypeComp, (void FAR* FAR*)pptcomp),
+ LError1);
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+
+/***
+*CPTITypeInfoImpl::GetFuncDesc
+*Purpose:
+*
+* Out:
+* <unsigned int index>
+*
+* In:
+* <HRESULT hresultRet>
+* <FUNCDESC funcdesc>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetFuncDesc(
+ unsigned int index,
+ FUNCDESC FAR* FAR* ppfuncdesc)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ FUNCDESC FAR* pfuncdesc;
+ HRESULT hresult, hresultRet;
+ unsigned long _proxySysKind, _stubSysKind;
+ unsigned long _index;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETFUNCDESC, 256, IID_ITypeInfo);
+
+
+ _proxySysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LError1);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _index = index;
+ IfFailGo(PUT(pstm, _index), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, _stubSysKind), LError1);
+
+ if((pfuncdesc = new FAR FUNCDESC) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ IfFailGo(FuncdescRead(pstm, pfuncdesc, (SYSKIND) _stubSysKind), LError1);
+
+ *ppfuncdesc = pfuncdesc;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+
+/***
+*CPTITypeInfoImpl::GetVarDesc
+*Purpose:
+*
+* Out:
+* <unsigned int index>
+*
+* In:
+* <HRESULT hresultRet>
+* <VARDESC vardesc>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetVarDesc(
+ unsigned int index,
+ VARDESC FAR* FAR* ppvardesc)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ VARDESC FAR* pvardesc;
+ HRESULT hresult, hresultRet;
+ unsigned long _proxySysKind, _stubSysKind;
+ unsigned long _index;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETVARDESC, 256, IID_ITypeInfo);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _proxySysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LError1);
+
+ _index = index;
+ IfFailGo(PUT(pstm, _index), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, _stubSysKind), LError1);
+
+ if((pvardesc = new FAR VARDESC) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ IfFailGo(VardescRead(pstm, pvardesc, (SYSKIND) _stubSysKind), LError1);
+
+ *ppvardesc = pvardesc;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+
+/***
+*CPTITypeInfoImpl::GetNames
+*Purpose:
+*
+* Out:
+* <MEMBERID memid>
+* <unsigned int cMaxNames>
+*
+* In:
+* <HRESULT hresultRet>
+* <unsigned int cNames>
+* <BSTR bstrName>*
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value =
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetNames(
+ MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ unsigned int cMaxNames,
+ unsigned int FAR* pcNames)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+ unsigned int u, cNames;
+ unsigned long _cMaxNames, _cNames;
+ unsigned long _proxySysKind, _stubSysKind;
+
+#ifdef _DEBUG
+ if(IsBadWritePtr(rgbstrNames, sizeof(BSTR) * cMaxNames))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pcNames, sizeof(*pcNames)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETNAMES, 512, IID_ITypeInfo);
+
+ _proxySysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LError1);
+
+ IfFailGo(PUT(pstm, memid), LError1);
+
+ // unsigned int always marshal/unmarshal as long (4 bytes)
+ _cMaxNames = cMaxNames;
+ IfFailGo(PUT(pstm, _cMaxNames), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet)){
+ hresult = hresultRet;
+ goto LError1;
+ }
+
+ IfFailGo(GET(pstm, _stubSysKind), LError1);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(pstm, _cNames), LError1);
+ cNames = (unsigned int) _cNames;
+
+ // init the array to simplify unwinding if there is an error
+ for(u = 0; u < cNames; ++u)
+ rgbstrNames[u] = NULL;
+
+ for(u = 0; u < cNames; ++u)
+ IfFailGo(BstrRead(pstm, &rgbstrNames[u], (SYSKIND) _stubSysKind), LError2);
+
+ *pcNames = cNames;
+
+ hresult = hresultRet;
+
+LError2:;
+ // unwind string allocations if we failed
+ if(HRESULT_FAILED(hresult)){
+ for(u = 0; u < cNames; ++u){
+ if(rgbstrNames[u] == NULL)
+ break;
+ SysFreeString(rgbstrNames[u]);
+ rgbstrNames[u] = NULL;
+ }
+ }
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*CPTITypeInfoImpl::GetRefTypeOfImplType
+*Purpose:
+*
+* Out:
+* <unsigned int index>
+*
+* In:
+* <HRESULT hresultRet>
+* <HREFTYPE hreftype>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetRefTypeOfImplType(
+ unsigned int index,
+ HREFTYPE FAR* phreftype)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HREFTYPE hreftype;
+ HRESULT hresult, hresultRet;
+ unsigned long _index;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETREFTYPEOFIMPLTYPE, 100, IID_ITypeInfo);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ //
+ // NOTE: We have to sign extend the index so that any special
+ // values (which are negative) are expanded to 32 bits on Win16.
+ //
+ _index = (int)index;
+ IfFailGo(PUT(pstm, _index), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, hreftype), LError1);
+
+ *phreftype = hreftype;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+
+/***
+*CPTITypeInfoImpl::GetImplTypeFlags
+*Purpose:
+*
+* Out:
+* <unsigned int index>
+*
+* In:
+* <HRESULT hresultRet>
+* <int impltypeflags>
+*
+*Entry:
+* index =
+*
+*Exit:
+* return value = HRESULT
+*
+* *pimpltypeflags =
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetImplTypeFlags(
+ unsigned int index,
+ int FAR* pimpltypeflags)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+ unsigned long _index;
+ unsigned long _impltypeflags;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETIMPLTYPEFLAGS, 100, IID_ITypeInfo);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _index = index;
+ IfFailGo(PUT(pstm, _index), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, _impltypeflags), LError1);
+ *pimpltypeflags = (unsigned int) _impltypeflags;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*CPTITypeInfoImpl::GetIDsOfNames
+*Purpose:
+* UNDONE
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetIDsOfNames(
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ MEMBERID FAR* rgmemid)
+{
+ UNUSED(rgszNames);
+ UNUSED(cNames);
+ UNUSED(rgmemid);
+
+ // REVIEW: factor out and share support from dispprox
+ return RESULT(E_NOTIMPL);
+}
+
+STDMETHODIMP
+CPTITypeInfoImpl::Invoke(
+ void FAR* pvInstance,
+ MEMBERID memid,
+ unsigned short wFlags,
+ DISPPARAMS FAR *pdispparams,
+ VARIANT FAR *pvarResult,
+ EXCEPINFO FAR *pexcepinfo,
+ unsigned int FAR *puArgErr)
+{
+ UNUSED(pvInstance);
+ UNUSED(memid);
+ UNUSED(wFlags);
+ UNUSED(pdispparams);
+ UNUSED(pvarResult);
+ UNUSED(pexcepinfo);
+ UNUSED(puArgErr);
+
+ return RESULT(E_NOTIMPL);
+}
+
+
+/***
+*CPTITypeInfoImpl::GetDocumentation
+*Purpose:
+*
+* Out:
+* <MEMBERID memid>
+*
+* In:
+* <HRESULT hresultRet>
+* <unsigned long dwHelpContext>
+* <BSTR bstrName>
+* <BSTR bstrDocString>
+* <BSTR bstrHelpFile>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetDocumentation(
+ MEMBERID memid,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ unsigned long dwHelpContext;
+ HRESULT hresult, hresultRet;
+ BSTR bstrName, bstrDocString, bstrHelpFile;
+ unsigned long _proxySysKind, _stubSysKind;
+
+#ifdef _DEBUG
+ if(pdwHelpContext != NULL
+ && IsBadWritePtr(pdwHelpContext, sizeof(*pdwHelpContext)))
+ return RESULT(E_INVALIDARG);
+ if(pbstrName != NULL
+ && IsBadWritePtr(pbstrName, sizeof(*pbstrName)))
+ return RESULT(E_INVALIDARG);
+ if(pbstrDocString != NULL
+ && IsBadWritePtr(pbstrDocString, sizeof(*pbstrDocString)))
+ return RESULT(E_INVALIDARG);
+ if(pbstrHelpFile != NULL
+ && IsBadWritePtr(pbstrHelpFile, sizeof(*pbstrHelpFile)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ bstrName = NULL;
+ bstrDocString = NULL;
+ bstrHelpFile = NULL;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETDOCUMENTATION, 512, IID_ITypeInfo);
+
+ _proxySysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LError1);
+
+ IfFailGo(PUT(pstm, memid), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet)){
+ hresult = hresultRet;
+ goto LError1;
+ }
+
+ IfFailGo(GET(pstm, _stubSysKind), LError1);
+ IfFailGo(GET(pstm, dwHelpContext), LError1);
+ IfFailGo(BstrRead(pstm, &bstrName, (SYSKIND) _stubSysKind), LError1);
+ IfFailGo(BstrRead(pstm, &bstrDocString, (SYSKIND) _stubSysKind), LError2);
+ IfFailGo(BstrRead(pstm, &bstrHelpFile, (SYSKIND) _stubSysKind), LError3);
+
+ if(pdwHelpContext != NULL)
+ *pdwHelpContext = dwHelpContext;
+
+ if(pbstrName != NULL)
+ *pbstrName = bstrName;
+ else
+ SysFreeString(bstrName);
+
+ if(pbstrDocString != NULL)
+ *pbstrDocString = bstrDocString;
+ else
+ SysFreeString(bstrDocString);
+
+ if(pbstrHelpFile != NULL)
+ *pbstrHelpFile = bstrHelpFile;
+ else
+ SysFreeString(bstrHelpFile);
+
+ pstm->Release();
+
+ return hresultRet;
+
+LError3:;
+ SysFreeString(bstrDocString);
+
+LError2:;
+ SysFreeString(bstrName);
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*CPTITypeInfoImpl::GetDllEntry
+*Purpose:
+*
+* Out:
+* <MEMBERID memid>
+*
+* In:
+* <HRESULT hresultRet>
+* <unsigned short wOrdinal>
+* <BSTR bstrDllName>
+* <BSTR bstrName>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetDllEntry(
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ BSTR FAR* pbstrDllName,
+ BSTR FAR* pbstrName,
+ unsigned short FAR* pwOrdinal)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ unsigned short wOrdinal;
+ HRESULT hresult, hresultRet;
+ unsigned long _proxySysKind, _stubSysKind;
+ unsigned long _invkind;
+ BSTR bstrTemp;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETDLLENTRY, 256, IID_ITypeInfo);
+
+ _proxySysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(pstm, _proxySysKind), LError1);
+
+ IfFailGo(PUT(pstm, memid), LError1);
+
+ _invkind = (unsigned long) invkind;
+ IfFailGo(PUT(pstm, _invkind), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet)){
+ hresult = hresultRet;
+ goto LError1;
+ }
+ IfFailGo(GET(pstm, _stubSysKind), LError1);
+ IfFailGo(GET(pstm, wOrdinal), LError1);
+ IfFailGo(BstrRead(pstm, &bstrTemp, (SYSKIND) _stubSysKind), LError1);
+ if (pbstrDllName) {
+ *pbstrDllName = bstrTemp;
+ } else {
+ SysFreeString(bstrTemp); // toss it
+ }
+
+ IfFailGo(BstrRead(pstm, &bstrTemp, (SYSKIND) _stubSysKind), LError2);
+ if (pbstrName) {
+ *pbstrName = bstrTemp;
+ } else {
+ SysFreeString(bstrTemp); // toss it
+ }
+
+ if (pwOrdinal)
+ *pwOrdinal = wOrdinal;
+
+ pstm->Release();
+
+ return hresultRet;
+
+LError2:;
+ SysFreeString(*pbstrDllName);
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*CPTITypeInfoImpl::GetRefTypeInfo
+*Purpose:
+*
+* Out:
+* <HREFTYPE hreftype>
+*
+* In:
+* <HRESULT hresultRet>
+* <ITypeInfo itinfo>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetRefTypeInfo(
+ HREFTYPE hreftype,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ ICHANNEL FAR* plrpc;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETREFTYPEINFO, 256, IID_ITypeInfo);
+
+ IfFailGo(PUT(pstm, hreftype), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(
+ DispUnmarshalInterface(pstm, IID_ITypeInfo, (void FAR* FAR*)pptinfo),
+ LError1);
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+CPTITypeInfoImpl::AddressOfMember(
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ void FAR* FAR* ppv)
+{
+ UNUSED(memid);
+ UNUSED(invkind);
+ UNUSED(ppv);
+
+ return RESULT(E_NOTIMPL);
+}
+
+/***
+*UNDONE
+*Purpose:
+* Proxy implementation of ITypeInfo::CreateInstance
+*
+* Marshal Out:
+* IID
+*
+* Marshal Back:
+* newly created interface ptr.
+*
+*Entry:
+* punkOuter = controlling unknown
+* riid = the requested private interface
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppvObj = the new instance, if successful.
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::CreateInstance(IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppvObj)
+{
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ // Ole doesn't (currently) support cross process aggregation
+ if(punkOuter != NULL)
+ return RESULT(CLASS_E_NOAGGREGATION);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_CREATEINSTANCE, 256, IID_ITypeInfo);
+
+ IfFailGo(pstm->Write((const void FAR*)&riid, sizeof(IID), NULL), Error);
+
+ INVOKE_CALL(plrpc, pstm, Error);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), Error);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto Error2;
+
+ IfFailGo(DispUnmarshalInterface(pstm, riid, ppvObj), Error);
+
+Error2:;
+ hresult = hresultRet;
+
+Error:;
+ pstm->Release();
+ return hresult;
+}
+
+STDMETHODIMP
+CPTITypeInfoImpl::GetMops(
+ MEMBERID memid,
+ BSTR FAR* pbstrMops)
+{
+ UNUSED(memid);
+
+ *pbstrMops = NULL; // real implementation just returns a null
+ // string, we can do the same.
+ return NOERROR;
+}
+
+/***
+*CPTITypeInfoImpl::GetContainingTypeLib
+*Purpose:
+*
+* Out:
+* None
+*
+* In:
+* <HRESULT hresultRet>
+* <unsigned int index>
+* <ITypeLib tlib>
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value = HRESULT
+*
+* UNDONE
+*
+***********************************************************************/
+STDMETHODIMP
+CPTITypeInfoImpl::GetContainingTypeLib(
+ ITypeLib FAR* FAR* pptlib,
+ unsigned int FAR* pindex)
+{
+ ICHANNEL FAR* plrpc;
+ unsigned int index;
+ IStream FAR* pstm;
+ HRESULT hresult, hresultRet;
+ unsigned long _index;
+
+ if((plrpc = m_pproxtinfo->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPEINFO_GETCONTAININGTYPELIB, 256, IID_ITypeInfo);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(pstm, _index), LError1);
+ index = (unsigned int) _index;
+
+ IfFailGo(
+ DispUnmarshalInterface(pstm, IID_ITypeLib, (void FAR* FAR*)pptlib),
+ LError1);
+
+ *pindex = index;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT CPTITypeInfoImpl::ReleaseTypeAttr
+*Purpose:
+* Free the given TYPEATTR
+*
+*Entry:
+* ptypeattr = the TYPEATTR to free
+*
+*Exit:
+* None
+*
+***********************************************************************/
+STDMETHODIMP_(void)
+CPTITypeInfoImpl::ReleaseTypeAttr(TYPEATTR FAR* ptypeattr)
+{
+#if defined(WIN16)
+ SysFreeString(ptypeattr->idldescType.bstrIDLInfo);
+#endif
+ delete ptypeattr;
+}
+
+
+/***
+* DoReleaseDanglingTypeDesc
+*Purpose:
+* Release any typedescs that are 'dangling' off of the current one.
+*
+*Entry:
+* ptypedesc = TYPEDESC to release from.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+INTERNAL_(void)
+DoReleaseDanglingTypeDesc(TYPEDESC FAR* ptypedesc)
+{
+ TYPEDESC FAR* ptypedescPrev;
+ short iType = 0;
+
+ if (ptypedesc->vt == VT_SAFEARRAY
+ || ptypedesc->vt == VT_PTR
+ || ptypedesc->vt == VT_CARRAY) {
+
+ do {
+ if (ptypedesc->vt == VT_SAFEARRAY || ptypedesc->vt == VT_PTR) {
+ ptypedescPrev = ptypedesc;
+ ptypedesc = ptypedesc->lptdesc;
+ }
+ else {
+ if (ptypedesc->vt == VT_CARRAY) {
+ DoReleaseDanglingTypeDesc(&ptypedesc->lpadesc->tdescElem);
+ delete ptypedesc->lpadesc;
+ }
+
+ ptypedescPrev = ptypedesc;
+ ptypedesc = NULL;
+ }
+
+ if (iType++) {
+ delete ptypedescPrev;
+ }
+
+ } while (ptypedesc != NULL);
+ }
+}
+
+
+/***
+*PUBLIC HRESULT CPTITypeInfoImpl::ReleaseFuncDesc
+*Purpose:
+* Free the given FUNCDESC
+*
+*Entry:
+* pfuncdesc = the FUNCDESC to free
+*
+*Exit:
+* None
+*
+***********************************************************************/
+INTERNAL_(void)
+DoReleaseFuncDesc(FUNCDESC FAR* pfuncdesc)
+{
+ short iParam;
+
+#if defined(WIN16)
+ SysFreeString(pfuncdesc->elemdescFunc.idldesc.bstrIDLInfo);
+#endif
+
+ for(iParam = 0; iParam < pfuncdesc->cParams; ++iParam) {
+#if defined(WIN16)
+ SysFreeString(pfuncdesc->lprgelemdescParam[iParam].idldesc.bstrIDLInfo);
+#endif
+
+ DoReleaseDanglingTypeDesc(&pfuncdesc->lprgelemdescParam[iParam].tdesc);
+ }
+
+ delete pfuncdesc->lprgelemdescParam;
+
+ DoReleaseDanglingTypeDesc(&pfuncdesc->elemdescFunc.tdesc);
+ delete pfuncdesc;
+}
+
+
+STDMETHODIMP_(void)
+CPTITypeInfoImpl::ReleaseFuncDesc(FUNCDESC FAR* pfuncdesc)
+{
+ DoReleaseFuncDesc(pfuncdesc);
+}
+
+
+/***
+*PUBLIC HRESULT CPTITypeInfoImpl::ReleaseVarDesc
+*Purpose:
+* Free the given VARDESC
+*
+*Entry:
+* pvardesc = the VARDESC to free
+*
+*Exit:
+* None
+*
+***********************************************************************/
+INTERNAL_(void)
+DoReleaseVarDesc(VARDESC FAR* pvardesc)
+{
+ DoReleaseDanglingTypeDesc(&pvardesc->elemdescVar.tdesc);
+ delete pvardesc;
+}
+
+STDMETHODIMP_(void)
+CPTITypeInfoImpl::ReleaseVarDesc(VARDESC FAR* pvardesc)
+{
+ DoReleaseVarDesc(pvardesc);
+}
+
+
+//---------------------------------------------------------------------
+// introduced methods
+//---------------------------------------------------------------------
+
+HRESULT
+CPTITypeInfoImpl::GetStream(
+ int imeth,
+ unsigned long size,
+ IStream FAR* FAR* ppstm)
+{
+ return NOERROR;
+}
+
+
+/***
+*CPTITypeInfoImpl::LrpcCall
+*Purpose:
+* Execute the LRPC call on the given stream.
+*
+* This routine is a helper for the ITypeInfo proxy methods.
+*
+*Entry:
+* pstm = the stream to execute the call on
+*
+*Exit:
+* return value = HRESULT
+*
+* *phresultRet = the HRESULT of the remote method invocation
+*
+***********************************************************************/
+HRESULT
+CPTITypeInfoImpl::LrpcCall(IStream FAR* pstm, HRESULT FAR* phresultRet)
+{
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// utilities
+//---------------------------------------------------------------------
+
+/***
+*HRESULT TypedescRead
+*Purpose:
+* Read a TYPEDESC from the given stream into the caller
+* allocated struct.
+*
+*Entry:
+* pstm = the stream to read from
+* ptdesc = where to put the reconstituted TYPEDESC.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+extern "C" HRESULT
+TypedescRead(IStream FAR* pstm, TYPEDESC FAR* ptdesc, SYSKIND sysKind)
+{
+ TYPEDESC FAR* ptdescPtr;
+ ARRAYDESC FAR* lpadesc;
+ unsigned short cDims;
+ HRESULT hresult;
+
+ IfFailRet(GET(pstm, ptdesc->vt));
+
+ switch(ptdesc->vt){
+ case VT_SAFEARRAY:
+ case VT_PTR:
+ if((ptdescPtr = new FAR TYPEDESC) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ hresult = TypedescRead(pstm, ptdescPtr, sysKind);
+ if (hresult != NOERROR) {
+ delete ptdescPtr;
+ return hresult;
+ }
+ ptdesc->lptdesc = ptdescPtr;
+ break;
+
+ case VT_CARRAY:
+ IfFailRet(GET(pstm, cDims));
+ if ((lpadesc = (ARRAYDESC FAR*) new FAR char [sizeof(ARRAYDESC) + (cDims-1) * sizeof(SAFEARRAYBOUND)]) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ lpadesc->cDims = cDims;
+ hresult = TypedescRead(pstm, &lpadesc->tdescElem, sysKind);
+ while (hresult == NOERROR && cDims > 0) {
+ cDims--;
+ hresult = GET(pstm, lpadesc->rgbounds[cDims].cElements);
+ if (hresult == NOERROR) {
+ hresult = GET(pstm, lpadesc->rgbounds[cDims].lLbound);
+ }
+ }
+ if (hresult != NOERROR) {
+ delete lpadesc;
+ return hresult;
+ }
+ ptdesc->lpadesc = lpadesc;
+ break;
+
+#if 0
+ case VT_FIXEDSTRING:
+ IfFailRet(GET(pstm, ptdesc->cbSize));
+ break;
+#endif
+
+ case VT_USERDEFINED:
+ IfFailRet(GET(pstm, ptdesc->hreftype));
+ break;
+ }
+
+ return NOERROR;
+}
+
+
+HRESULT
+TypedescWrite(IStream FAR* pstm, TYPEDESC FAR* ptdesc, SYSKIND sysKind)
+{
+ unsigned short cDims;
+
+ IfFailRet(PUT(pstm, ptdesc->vt));
+
+ switch(ptdesc->vt){
+ case VT_SAFEARRAY:
+ case VT_PTR:
+ IfFailRet(TypedescWrite(pstm, ptdesc->lptdesc, sysKind));
+ break;
+
+ case VT_CARRAY:
+ cDims = ptdesc->lpadesc->cDims;
+ IfFailRet(PUT(pstm, cDims));
+ IfFailRet(TypedescWrite(pstm, &ptdesc->lpadesc->tdescElem, sysKind));
+ while (cDims > 0) {
+ cDims--;
+ IfFailRet(PUT(pstm, ptdesc->lpadesc->rgbounds[cDims].cElements));
+ IfFailRet(PUT(pstm, ptdesc->lpadesc->rgbounds[cDims].lLbound));
+ }
+ break;
+
+#if 0
+ case VT_FIXEDSTRING:
+ IfFailRet(PUT(pstm, ptdesc->cbSize));
+ break;
+#endif
+
+ case VT_USERDEFINED:
+ IfFailRet(PUT(pstm, ptdesc->hreftype));
+ break;
+ }
+
+ return NOERROR;
+}
+
+
+extern "C" HRESULT
+TypedescReadOrWrite(IStream FAR* pstm, BOOL fRead, void FAR* pvStruct, SYSKIND sysKind)
+{
+ return
+ (fRead ? TypedescRead : TypedescWrite)(pstm, (TYPEDESC FAR*)pvStruct, sysKind);
+}
+
+
+extern "C" {
+extern FIELDDESC NEARDATA g_rgfdescIdldesc[];
+extern FIELDDESC NEARDATA g_rgfdescElemdesc[];
+extern FIELDDESC NEARDATA g_rgfdescTypeattr[];
+extern FIELDDESC NEARDATA g_rgfdescFuncdesc[];
+extern FIELDDESC NEARDATA g_rgfdescVardesc[];
+}
+
+
+/***
+*PRIVATE HRESULT TypeattrWrite
+*Purpose:
+* Write the given TYPEATTR into the given stream.
+*
+*Entry:
+* pstm = the stream to write into
+* ptypeattr = the typeattr to write
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+TypeattrWrite(IStream FAR* pstm, TYPEATTR FAR* ptypeattr, SYSKIND sysKind)
+{
+ IfFailRet(StructWrite(pstm, g_rgfdescTypeattr, ptypeattr, sysKind));
+
+ if(ptypeattr->typekind == TKIND_ALIAS){
+ IfFailRet(TypedescWrite(pstm, &ptypeattr->tdescAlias, sysKind));
+ }
+
+ return NOERROR;
+}
+
+
+/***
+*PRIVATE HRESULT TypeattrRead
+*Purpose:
+* Read a TYPEATTR from the given stream
+*
+*Entry:
+* pstm = the stream to read from
+* ptypeattr = the struct to read into
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+TypeattrRead(IStream FAR* pstm, TYPEATTR FAR* ptypeattr, SYSKIND sysKind)
+{
+ IfFailRet(StructRead(pstm, g_rgfdescTypeattr, ptypeattr, sysKind));
+
+ if(ptypeattr->typekind == TKIND_ALIAS){
+ IfFailRet(TypedescRead(pstm, &ptypeattr->tdescAlias, sysKind));
+ }
+ ptypeattr->dwReserved = 0; // init un-marshalled fields to 0
+ ptypeattr->lpstrSchema = NULL;
+
+ return NOERROR;
+}
+
+
+/***
+*PRIVATE HRESULT FuncdescWrite
+*Purpose:
+* Write the given FUNCDESC into the given stream.
+*
+*Entry:
+* pstm = the stream to write into
+* pfuncdesc = the FUNCDESC to write
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+FuncdescWrite(IStream FAR* pstm, FUNCDESC FAR* pfuncdesc, SYSKIND sysKind)
+{
+ IfFailRet(StructWrite(pstm, g_rgfdescFuncdesc, pfuncdesc, sysKind));
+
+ // write the lprgelemdescParam by hand
+
+ for(int i = 0; i < pfuncdesc->cParams; ++i){
+ IfFailRet(
+ StructWrite(
+ pstm, g_rgfdescElemdesc, &pfuncdesc->lprgelemdescParam[i], sysKind));
+ }
+
+ return NOERROR;
+}
+
+
+/***
+*PRIVATE HRESULT FuncdescRead
+*Purpose:
+* Read a FUNCDESC from the given stream.
+*
+*Entry:
+* pstm = the stream to read from
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppfuncdesc = the reconstituted FUNCDESC
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+FuncdescRead(IStream FAR* pstm, FUNCDESC FAR* pfuncdesc, SYSKIND sysKind)
+{
+ HRESULT hresult;
+ ELEMDESC FAR* prgelemdescParam;
+
+ prgelemdescParam = NULL;
+
+ IfFailRet(StructRead(pstm, g_rgfdescFuncdesc, pfuncdesc, sysKind));
+
+ if(pfuncdesc->cParams > 0){
+
+ if((prgelemdescParam = new FAR ELEMDESC [pfuncdesc->cParams]) == NULL){
+ return RESULT(E_OUTOFMEMORY);
+ }
+
+ for(int i = 0; i < pfuncdesc->cParams; ++i){
+ IfFailGo(
+ StructRead(pstm, g_rgfdescElemdesc, &prgelemdescParam[i], sysKind),
+ LError0);
+ }
+ }
+
+ pfuncdesc->lprgelemdescParam = prgelemdescParam;
+
+ pfuncdesc->lprgscode = NULL; // init reserved fields to zero
+ pfuncdesc->cScodes = 0;
+
+ return NOERROR;
+
+LError0:
+ delete prgelemdescParam;
+
+ return hresult;
+}
+
+
+/***
+*PRIVATE HRESULT VardescWrite
+*Purpose:
+* Write the given VARDESC into the given stream.
+*
+*Entry:
+* pstm = the stream to write into
+* pvardesc = the VARDESC to write
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+VardescWrite(IStream FAR* pstm, VARDESC FAR* pvardesc, SYSKIND sysKind)
+{
+ IfFailRet(StructWrite(pstm, g_rgfdescVardesc, pvardesc, sysKind));
+
+ switch(pvardesc->varkind){
+ case VAR_CONST:
+ IfFailRet(VariantWrite(pstm, pvardesc->lpvarValue, sysKind));
+ break;
+
+ case VAR_PERINSTANCE:
+ case VAR_DISPATCH:
+ IfFailRet(PUT(pstm, pvardesc->oInst));
+ break;
+ }
+
+ return NOERROR;
+}
+
+
+/***
+*PRIVATE HRESULT VardescRead
+*Purpose:
+* Read a VARDESC from the given stream
+*
+*Entry:
+* pstm = the stream to read from
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppvardesc = the reconstituted VARDESC
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+VardescRead(IStream FAR* pstm, VARDESC FAR* pvardesc, SYSKIND sysKind)
+{
+ HRESULT hresult;
+ VARIANT FAR* pvar;
+
+ IfFailRet(StructRead(pstm, g_rgfdescVardesc, pvardesc, sysKind));
+
+ switch(pvardesc->varkind){
+ case VAR_CONST:
+ if((pvar = new FAR VARIANT) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ if((hresult = VariantRead(pstm, pvar, NULL, sysKind)) != NOERROR){
+ delete pvar;
+ return hresult;
+ }
+ pvardesc->lpvarValue = pvar;
+ break;
+
+ case VAR_PERINSTANCE:
+ case VAR_DISPATCH:
+ IfFailRet(GET(pstm, pvardesc->oInst));
+ break;
+ }
+ pvardesc->lpstrSchema = NULL; // reserved
+
+ return NOERROR;
+}
diff --git a/private/oleauto/src/dispatch/tips.h b/private/oleauto/src/dispatch/tips.h
new file mode 100644
index 000000000..0141a71ac
--- /dev/null
+++ b/private/oleauto/src/dispatch/tips.h
@@ -0,0 +1,297 @@
+/***
+*tips.h - ITypeInfo Proxy and Stub class definitions
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the ITypeInfo Proxy and Stub classes.
+*
+* CProxTypeInfo -- the ITypeInfo proxy class
+* CPTIUnkImpl - CProxTypeInfo implementation of IUnknown
+* CPTIProxImpl - CProxTypeInfo implementation of IRpcProxy
+* CPTITypeInfoImpl - CProxTypeInfo implementation of ITypeInfo
+*
+* CStubTypeInfo -- the ITypeInfo stub class
+*
+*Revision History:
+*
+* [00] 05-Mar-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+#ifndef __tips_h__
+#define __tips_h__
+
+#pragma warning(4:4355)
+
+
+// forward declarations
+class FAR CProxTypeInfo;
+class FAR CStubTypeInfo;
+
+
+// ITypeInfo proxy class' IUnknown implementation
+class FAR CPTIUnkImpl : public IUnknown
+{
+public:
+ CPTIUnkImpl(CProxTypeInfo FAR* pproxtinfo);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+private:
+ CProxTypeInfo FAR* m_pproxtinfo;
+};
+
+
+// ITypeInfo proxy class' IRpcProxy implementation
+class FAR CPTIProxImpl : public IPROXY
+{
+public:
+ CPTIProxImpl(CProxTypeInfo FAR* pproxtinfo);
+ ~CPTIProxImpl();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(Connect)(ICHANNEL FAR* plrpc);
+ STDMETHOD_(void, Disconnect)(void);
+
+private:
+ CProxTypeInfo FAR* m_pproxtinfo;
+};
+
+
+// ITypeInfo
+class FAR CPTITypeInfoImpl : public ITypeInfo
+{
+public:
+ CPTITypeInfoImpl(CProxTypeInfo FAR* pproxtinfo);
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // ITypeInfo methods
+ STDMETHOD(GetTypeAttr)(TYPEATTR FAR* FAR* pptypeattr);
+
+ STDMETHOD(GetTypeComp)(ITypeComp FAR* FAR* pptcomp);
+
+ STDMETHOD(GetFuncDesc)(
+ unsigned int index, FUNCDESC FAR* FAR* ppfuncdesc);
+
+ STDMETHOD(GetVarDesc)(unsigned int index, VARDESC FAR* FAR* ppvardesc);
+
+ STDMETHOD(GetNames)(
+ MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ unsigned int cMaxNames,
+ unsigned int FAR* pcNames);
+
+ STDMETHOD(GetRefTypeOfImplType)(
+ unsigned int index, HREFTYPE FAR* phreftype);
+
+ STDMETHOD(GetImplTypeFlags)(
+ unsigned int index, int FAR* pimpltypeflags);
+
+ STDMETHOD(GetIDsOfNames)(
+ OLECHAR FAR* FAR* rgszNames, unsigned int cNames, MEMBERID FAR* rgmemid);
+
+ STDMETHOD(Invoke)(
+ void FAR* pvInstance,
+ MEMBERID memid,
+ unsigned short wFlags,
+ DISPPARAMS FAR *pdispparams,
+ VARIANT FAR *pvarResult,
+ EXCEPINFO FAR *pexcepinfo,
+ unsigned int FAR *puArgErr);
+
+ STDMETHOD(GetDocumentation)(
+ MEMBERID memid,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile);
+
+ STDMETHOD(GetDllEntry)(
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ BSTR FAR* pbstrDllName,
+ BSTR FAR* pbstrName,
+ unsigned short FAR* pwOrdinal);
+
+ STDMETHOD(GetRefTypeInfo)(
+ HREFTYPE hreftype, ITypeInfo FAR* FAR* pptinfo);
+
+ STDMETHOD(AddressOfMember)(
+ MEMBERID memid, INVOKEKIND invkind, void FAR* FAR* ppv);
+
+ STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppvObj);
+
+ STDMETHOD(GetMops)(MEMBERID memid, BSTR FAR* pbstrMops);
+
+ STDMETHOD(GetContainingTypeLib)(
+ ITypeLib FAR* FAR* pptlib, unsigned int FAR* pindex);
+
+ STDMETHOD_(void, ReleaseTypeAttr)(TYPEATTR FAR* ptypeattr);
+ STDMETHOD_(void, ReleaseFuncDesc)(FUNCDESC FAR* pfuncdesc);
+ STDMETHOD_(void, ReleaseVarDesc)(VARDESC FAR* pvardesc);
+
+ // introduced methods
+
+ HRESULT GetStream(int imeth, unsigned long size, IStream FAR* FAR* ppstm);
+ HRESULT LrpcCall(IStream FAR* pstm, HRESULT FAR* phresultRet);
+
+private:
+ CProxTypeInfo FAR* m_pproxtinfo;
+};
+
+// ITypeInfo Proxy Class
+class FAR CProxTypeInfo
+{
+public:
+ static IUnknown FAR* Create(IUnknown FAR* punkOuter);
+
+private:
+ CProxTypeInfo(IUnknown FAR* punkOuter);
+
+ friend CPTIUnkImpl;
+ friend CPTIProxImpl;
+ friend CPTITypeInfoImpl;
+
+ CPTIUnkImpl m_unk;
+ CPTIProxImpl m_proxy;
+ CPTITypeInfoImpl m_tinfo;
+
+private:
+
+ unsigned long m_refs;
+ ICHANNEL FAR* m_plrpc;
+ IUnknown FAR* m_punkOuter;
+};
+
+// ITypeInfo Stub Class
+//
+class FAR CStubTypeInfo : public ISTUB
+{
+public:
+ static HRESULT Create(IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IRpcStub methods
+ //
+#if (OE_WIN32 || defined(WOW))
+ STDMETHOD(Connect)(IUnknown FAR* pUnk);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg,
+ IRpcChannelBuffer FAR* pRpcChannel);
+ STDMETHOD_(IRpcStubBuffer *, IsIIDSupported)(REFIID iid);
+ STDMETHOD_(ULONG, CountRefs)(void);
+ STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv);
+ STDMETHOD_(void, DebugServerRelease)(void FAR* pv);
+#else
+ STDMETHOD(Connect)(IUnknown FAR* punkObject);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(
+ REFIID riid,
+ int imeth,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx);
+#if OE_MAC
+ STDMETHOD_(unsigned long, IsIIDSupported)(REFIID riid);
+#else
+ STDMETHOD_(BOOL, IsIIDSupported)(REFIID riid);
+#endif
+ STDMETHOD_(unsigned long, CountRefs)(void);
+#endif
+
+ // introduced methods
+ //
+ HRESULT GetTypeAttr(void);
+ HRESULT GetTypeComp(void);
+ HRESULT GetFuncDesc(void);
+ HRESULT GetVarDesc(void);
+ HRESULT GetNames(void);
+ HRESULT GetRefTypeOfImplType(void);
+ HRESULT GetImplTypeFlags(void);
+ HRESULT GetIDsOfNames(void);
+ HRESULT GetDocumentation(void);
+ HRESULT GetDllEntry(void);
+ HRESULT GetRefTypeInfo(void);
+ HRESULT CreateInstance(void);
+ HRESULT GetContainingTypeLib(void);
+
+ // helpers
+ HRESULT MarshalResult(void);
+
+private:
+ CStubTypeInfo();
+ ~CStubTypeInfo();
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punk;
+ ITypeInfo FAR* m_ptinfo;
+
+ IStream FAR* m_pstm;
+ HRESULT m_hresultRet;
+};
+
+
+// ITypeInfo method indices
+//
+enum IMETH_TYPEINFO {
+ IMETH_TYPEINFO_QUERYINTERFACE = 0,
+ IMETH_TYPEINFO_ADDREF,
+ IMETH_TYPEINFO_RELEASE,
+
+ IMETH_TYPEINFO_GETTYPEATTR,
+ IMETH_TYPEINFO_GETTYPECOMP,
+ IMETH_TYPEINFO_GETFUNCDESC,
+ IMETH_TYPEINFO_GETVARDESC,
+ IMETH_TYPEINFO_GETNAMES,
+ IMETH_TYPEINFO_GETREFTYPEOFIMPLTYPE,
+ IMETH_TYPEINFO_GETIMPLTYPEFLAGS,
+ IMETH_TYPEINFO_GETIDSOFNAMES,
+ IMETH_TYPEINFO_INVOKE,
+ IMETH_TYPEINFO_GETDOCUMENTATION,
+ IMETH_TYPEINFO_GETDLLENTRY,
+ IMETH_TYPEINFO_GETREFTYPEINFO,
+ IMETH_TYPEINFO_ADDRESSOFMEMBER,
+ IMETH_TYPEINFO_CREATEINSTANCE,
+ IMETH_TYPEINFO_GETMOPS,
+ IMETH_TYPEINFO_GETCONTAININGTYPELIB,
+
+ IMETH_TYPEINFO_RELEASETYPEATTR,
+ IMETH_TYPEINFO_RELEASEFUNCDESC,
+ IMETH_TYPEINFO_RELEASEVARDESC
+};
+
+
+INTERNAL_(void) DoReleaseVarDesc(VARDESC FAR* pvardesc);
+INTERNAL_(void) DoReleaseFuncDesc(FUNCDESC FAR* pvardesc);
+
+
+// TypeInfo marshaling utilities
+
+INTERNAL_(HRESULT) TypeattrRead(IStream FAR*, TYPEATTR FAR*, SYSKIND);
+INTERNAL_(HRESULT) FuncdescRead(IStream FAR*, FUNCDESC FAR*, SYSKIND);
+INTERNAL_(HRESULT) VardescRead(IStream FAR*, VARDESC FAR*, SYSKIND);
+
+INTERNAL_(HRESULT) TypeattrWrite(IStream FAR*, TYPEATTR FAR*, SYSKIND);
+INTERNAL_(HRESULT) FuncdescWrite(IStream FAR*, FUNCDESC FAR*, SYSKIND);
+INTERNAL_(HRESULT) VardescWrite(IStream FAR*, VARDESC FAR*, SYSKIND);
+
+#endif __tips_h__
diff --git a/private/oleauto/src/dispatch/tistub.cpp b/private/oleauto/src/dispatch/tistub.cpp
new file mode 100644
index 000000000..ab0d89bfd
--- /dev/null
+++ b/private/oleauto/src/dispatch/tistub.cpp
@@ -0,0 +1,1034 @@
+/***
+*tistub.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the ITypeInfo stub class.
+*
+*Revision History:
+*
+* [00] 05-Mar-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "tips.h"
+
+ASSERTDATA
+
+CStubTypeInfo::CStubTypeInfo()
+{
+ m_refs = 0;
+ m_pstm = NULL;
+ m_punk = NULL;
+ m_ptinfo = NULL;
+}
+
+CStubTypeInfo::~CStubTypeInfo()
+{
+ Disconnect();
+}
+
+HRESULT
+CStubTypeInfo::Create(IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub)
+{
+ CStubTypeInfo FAR* pstub;
+
+ if(pstub = new FAR CStubTypeInfo()){
+ pstub->m_refs = 1;
+ *ppstub = pstub;
+ if (punkServer)
+ return pstub->Connect(punkServer);
+ return NOERROR;
+ }
+ return RESULT(E_OUTOFMEMORY);
+}
+
+
+//---------------------------------------------------------------------
+// ITypeInfo stub class' IUnknown implementation
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CStubTypeInfo::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else if(IsEqualIID(riid, IID_ISTUB)){
+ *ppv = this;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ ++m_refs;
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubTypeInfo::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubTypeInfo::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeInfo stub class' IRpcStub implementation
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CStubTypeInfo::Connect(IUnknown FAR* punkObj)
+{
+#if (defined(WIN32) || defined(WOW))
+ ASSERT(m_punk == NULL && m_ptinfo == NULL);
+ //This will keep the server object alive until we disconnect.
+ IfFailRet(punkObj->QueryInterface(IID_ITypeInfo, (void FAR* FAR*)&m_ptinfo));
+ punkObj->AddRef();
+ m_punk = punkObj;
+ return NOERROR;
+#else
+ if(m_punk)
+ return RESULT(E_FAIL); // call Disconnect first
+ if (punkObj) {
+ punkObj->AddRef();
+ m_punk = punkObj;
+ }
+ return NOERROR;
+#endif
+}
+
+STDMETHODIMP_(void)
+CStubTypeInfo::Disconnect()
+{
+ if(m_punk){
+ m_punk->Release();
+ m_punk = NULL;
+ }
+ if(m_ptinfo){
+ m_ptinfo->Release();
+ m_ptinfo = NULL;
+ }
+}
+
+/***
+*PUBLIC HRESULT CStubTypeInfo::Invoke
+*
+*Purpose:
+* Dispatch the method with the given index (imeth) on the given
+* interface, using the arguments serialized in the given stream.
+*
+* This function is the callee side of an LRPC call.
+*
+*Entry:
+* iid = the IID of the interface on which we are to make the call
+* imeth = the method index
+* pstm = the IStream containing the method's actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CStubTypeInfo::Invoke(
+#if (OE_WIN32 || defined(WOW))
+ RPCOLEMESSAGE *pMessage,
+ ICHANNEL *pRpcChannel)
+{
+ HRESULT hresult;
+ IStream FAR* pstm;
+
+ if(!m_punk)
+ return RESULT(E_FAIL);
+
+ OPEN_STUB_STREAM(pstm, pRpcChannel, pMessage, IID_ITypeInfo);
+
+#else
+ REFIID riid,
+ int iMethod,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx)
+{
+ HRESULT hresult;
+
+ UNUSED(dwDestCtx);
+ UNUSED(pvDestCtx);
+
+ if(!IsEqualIID(riid, IID_ITypeInfo))
+ return RESULT(E_NOINTERFACE);
+
+ if(!m_punk)
+ return RESULT(E_FAIL);
+
+ if(m_ptinfo == NULL)
+ IfFailRet(m_punk->QueryInterface(IID_ITypeInfo, (void FAR* FAR*)&m_ptinfo));
+#endif
+
+ m_pstm = pstm;
+
+ switch(GET_IMETHOD(pMessage)){
+ case IMETH_TYPEINFO_GETTYPEATTR:
+ hresult = GetTypeAttr();
+ break;
+
+ case IMETH_TYPEINFO_GETTYPECOMP:
+ hresult = GetTypeComp();
+ break;
+
+ case IMETH_TYPEINFO_GETFUNCDESC:
+ hresult = GetFuncDesc();
+ break;
+
+ case IMETH_TYPEINFO_GETVARDESC:
+ hresult = GetVarDesc();
+ break;
+
+ case IMETH_TYPEINFO_GETNAMES:
+ hresult = GetNames();
+ break;
+
+ case IMETH_TYPEINFO_GETREFTYPEOFIMPLTYPE:
+ hresult = GetRefTypeOfImplType();
+ break;
+
+ case IMETH_TYPEINFO_GETIMPLTYPEFLAGS:
+ hresult = GetImplTypeFlags();
+ break;
+
+ case IMETH_TYPEINFO_GETIDSOFNAMES:
+ hresult = GetIDsOfNames();
+ break;
+
+ case IMETH_TYPEINFO_GETDOCUMENTATION:
+ hresult = GetDocumentation();
+ break;
+
+ case IMETH_TYPEINFO_GETDLLENTRY:
+ hresult = GetDllEntry();
+ break;
+
+ case IMETH_TYPEINFO_GETREFTYPEINFO:
+ hresult = GetRefTypeInfo();
+ break;
+
+ case IMETH_TYPEINFO_CREATEINSTANCE:
+ hresult = CreateInstance();
+ break;
+
+ case IMETH_TYPEINFO_GETCONTAININGTYPELIB:
+ hresult = GetContainingTypeLib();
+ break;
+
+ case IMETH_TYPEINFO_GETMOPS:
+ hresult = RESULT(E_NOTIMPL);
+ break;
+
+ // we should never see the following,
+ case IMETH_TYPEINFO_INVOKE: // not remotable
+ case IMETH_TYPEINFO_ADDRESSOFMEMBER: // not remotable(?)
+ case IMETH_TYPEINFO_RELEASETYPEATTR: // handled in proxy
+ case IMETH_TYPEINFO_RELEASEFUNCDESC: // handled in proxy
+ case IMETH_TYPEINFO_RELEASEVARDESC: // handled in proxy
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+
+ RESET_STREAM(pstm);
+
+ DELETE_STREAM(pstm);
+
+ m_pstm = NULL;
+
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT CStubTypeInfo::IsIIDSupported(REFIID)
+*Purpose:
+* Answer if the given IID is supported by this stub.
+*
+*Entry:
+* iid = the IID to query for support
+*
+*Exit:
+* return value = BOOL. TRUE if IID is supported, FALSE otherwise.
+*
+***********************************************************************/
+#if OE_MAC
+STDMETHODIMP_(unsigned long)
+#elif (OE_WIN32 || defined(WOW))
+STDMETHODIMP_(IRpcStubBuffer *)
+#else
+STDMETHODIMP_(BOOL)
+#endif
+CStubTypeInfo::IsIIDSupported(REFIID riid)
+{
+#if (OE_WIN32 || defined(WOW))
+ IRpcStubBuffer *pStub = 0;
+ if (IsEqualIID(riid, IID_ITypeInfo)) {
+ AddRef();
+ pStub = (IRpcStubBuffer *) this;
+ }
+ return pStub;
+#else
+ // REVIEW: I don't understand this, but thats the way Ole does it...
+ if(m_punk == NULL)
+ return FALSE;
+
+ return(IsEqualIID(riid, IID_ITypeInfo));
+#endif
+}
+
+/***
+*unsigned long CStubTypeInfo::CountRefs
+*Purpose:
+* Return the count of references held by this stub.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long, the count of refs.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CStubTypeInfo::CountRefs()
+{
+ unsigned long refs;
+
+ refs = 0;
+
+ if(m_punk != NULL)
+ ++refs;
+
+ if(m_ptinfo != NULL)
+ ++refs;
+
+ return refs;
+}
+
+/***
+*HRESULT CStubTypeInfo::GetTypeAttr
+*Purpose:
+*
+* In:
+* None
+*
+* Out:
+* <HRESULT hresult>
+* <TYPEATTR tattr>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetTypeAttr()
+{
+ HRESULT hresult;
+ TYPEATTR FAR* ptypeattr;
+ unsigned long _proxySysKind, _stubSysKind;
+
+ IfFailGo(GET(m_pstm, _proxySysKind), LError0);
+ REWIND_STREAM(m_pstm);
+
+ ptypeattr = NULL;
+ m_hresultRet = m_ptinfo->GetTypeAttr(&ptypeattr);
+
+ IfFailGo(DispMarshalHresult(m_pstm, m_hresultRet), LError0);
+
+ // if call failed, do bother marshaling "out" params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError0;
+
+ _stubSysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(m_pstm, _stubSysKind), LError0);
+
+ hresult = TypeattrWrite(m_pstm, ptypeattr, (SYSKIND) _proxySysKind);
+
+LError0:;
+ if(ptypeattr != NULL)
+ m_ptinfo->ReleaseTypeAttr(ptypeattr);
+
+ return hresult;
+
+}
+
+
+/***
+*HRESULT CStubTypeInfo::GetTypeComp
+*Purpose:
+*
+* In:
+* None
+*
+* Out:
+* <HRESULT hresultRet>
+* <ITypeComp tcomp>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetTypeComp()
+{
+ HRESULT hresult;
+ ITypeComp FAR* ptcomp;
+
+ ptcomp = NULL;
+ m_hresultRet = m_ptinfo->GetTypeComp(&ptcomp);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, m_hresultRet), LError0);
+
+ // if call failed, do bother marshaling "out" params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError0;
+
+ hresult = DispMarshalInterface(m_pstm, IID_ITypeComp, ptcomp);
+
+LError0:;
+ if(ptcomp != NULL)
+ ptcomp->Release();
+
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeInfo::GetFuncDesc
+*Purpose:
+*
+* In:
+* <unsigned int index>
+*
+* Out:
+* <HRESULT hresult>
+* <FUNCDESC funcdesc>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value =
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetFuncDesc()
+{
+ unsigned int index;
+ HRESULT hresult;
+ FUNCDESC FAR* pfuncdesc;
+ unsigned long _proxySysKind, _stubSysKind;
+ unsigned long _index;
+
+ IfFailGo(GET(m_pstm, _proxySysKind), LError0);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(m_pstm, _index), LError0);
+ index = (unsigned int) _index;
+
+ pfuncdesc = NULL;
+ m_hresultRet = m_ptinfo->GetFuncDesc(index, &pfuncdesc);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), LError0);
+
+ // if call failed, do bother marshaling "out" params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError0;
+
+ _stubSysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(m_pstm, _stubSysKind), LError0);
+
+ hresult = FuncdescWrite(m_pstm, pfuncdesc, (SYSKIND) _proxySysKind);
+
+LError0:;
+ if(pfuncdesc != NULL)
+ m_ptinfo->ReleaseFuncDesc(pfuncdesc);
+
+ return hresult;
+}
+
+/***
+*HRESULT GetTypeInfoStub::GetVarDesc
+*Purpose:
+*
+* In:
+* <unsigned int index>
+*
+* Out:
+* <HRESULT hresult>
+* <VARDESC vardesc>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetVarDesc()
+{
+ unsigned int index;
+ HRESULT hresult;
+ VARDESC FAR* pvardesc;
+ unsigned long _proxySysKind, _stubSysKind;
+ unsigned long _index;
+
+ IfFailGo(GET(m_pstm, _proxySysKind), LError0);
+
+ // unsigned int always marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(m_pstm, _index), LError0);
+ index = (unsigned int) _index;
+
+ pvardesc = NULL;
+ m_hresultRet = m_ptinfo->GetVarDesc(index, &pvardesc);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), LError1);
+
+ // if call failed, don't bother marshaling "out" params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError1;
+
+ _stubSysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(m_pstm, _stubSysKind), LError1);
+
+ IfFailGo(VardescWrite(m_pstm, pvardesc, (SYSKIND) _proxySysKind), LError1);
+
+LError1:;
+ if(pvardesc != NULL)
+ m_ptinfo->ReleaseVarDesc(pvardesc);
+
+LError0:;
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeInfo::GetNames
+*Purpose:
+*
+* In:
+* <MEMBERID memid>
+* <unsigned int cMaxNames>
+*
+* Out:
+* <HRESULT hresultRet>
+* <unsigned int cNames>
+* <BSTR bstrName>*
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetNames()
+{
+ MEMBERID memid;
+ HRESULT hresult;
+ BSTR FAR* rgbstrNames;
+ unsigned int u, cNames, cMaxNames;
+ unsigned long _cNames, _cMaxNames;
+ unsigned long _proxySysKind, _stubSysKind;
+
+ IfFailGo(GET(m_pstm, _proxySysKind), LError0);
+
+ IfFailGo(GET(m_pstm, memid), LError0);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(m_pstm, _cMaxNames), LError0);
+ cMaxNames = (unsigned int) _cMaxNames;
+
+ if((rgbstrNames = new FAR BSTR [cMaxNames]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ cNames = 0;
+ // REVIEW: should we init rgbstrNames to null here, just to be safe?
+ m_hresultRet = m_ptinfo->GetNames(memid, rgbstrNames, cMaxNames, &cNames);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), LError1);
+
+ // if call failed, do bother marshaling "out" params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError1;
+
+ _stubSysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(m_pstm, _stubSysKind), LError1);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _cNames = cNames;
+ IfFailGo(PUT(m_pstm, _cNames), LError1);
+
+ for(u = 0; u < cNames; ++u){
+ IfFailGo(BstrWrite(m_pstm, rgbstrNames[u], (SYSKIND) _proxySysKind), LError1);
+ }
+
+LError1:;
+ // assume no names were allocated unless the call succeeded
+ if(HRESULT_SUCCESS(m_hresultRet)){
+ for(u = 0; u < cNames; ++u)
+ SysFreeString(rgbstrNames[u]);
+ }
+ delete rgbstrNames;
+
+LError0:;
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeInfo::GetRefTypeOfImplType
+*Purpose:
+*
+* In:
+* <unsigned int index>
+*
+* Out:
+* <HRESULT hresultRet>
+* <HREFTYPE hreftype>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetRefTypeOfImplType()
+{
+ unsigned int index;
+ HRESULT hresult;
+ HREFTYPE hreftype;
+ unsigned long _index;
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(m_pstm, _index), LError1);
+ index = (unsigned int) _index;
+
+ m_hresultRet = m_ptinfo->GetRefTypeOfImplType(index, &hreftype);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), LError1);
+
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError1;
+
+ hresult = PUT(m_pstm, hreftype);
+
+LError1:;
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeInfo::GetImplTypeFlags
+*Purpose:
+*
+* In:
+* <unsigned int index>
+*
+* Out:
+* <HRESULT hresultRet>
+* <int impltypeflags>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetImplTypeFlags()
+{
+ unsigned int index;
+ HRESULT hresult;
+ int impltypeflags;
+ unsigned long _impltypeflags;
+ unsigned long _index;
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ IfFailGo(GET(m_pstm, _index), LError1);
+ index = (unsigned int) _index;
+
+ m_hresultRet = m_ptinfo->GetImplTypeFlags(index, &impltypeflags);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), LError1);
+
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError1;
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _impltypeflags = impltypeflags;
+ hresult = PUT(m_pstm, _impltypeflags);
+
+LError1:;
+ return hresult;
+}
+
+HRESULT
+CStubTypeInfo::GetIDsOfNames()
+{
+ return RESULT(E_NOTIMPL);
+}
+
+/***
+*HRESULT CStubTypeInfo::GetDocumentation
+*Purpose:
+*
+* In:
+* <MEMBERID memid>
+*
+* Out:
+* <HRESULT hresultRet>
+* <unsigned long dwHelpContext>
+* <BSTR bstrName>
+* <BSTR bstrDocString>
+* <BSTR bstrHelpFile>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetDocumentation()
+{
+ MEMBERID memid;
+ HRESULT hresult;
+ unsigned long dwHelpContext;
+ BSTR bstrName, bstrDocString, bstrHelpFile;
+ unsigned long _proxySysKind, _stubSysKind;
+
+ IfFailGo(GET(m_pstm, _proxySysKind), LError0);
+
+ IfFailGo(GET(m_pstm, memid), LError0);
+
+ bstrName = NULL;
+ bstrHelpFile = NULL;
+ bstrDocString = NULL;
+
+ m_hresultRet = m_ptinfo->GetDocumentation(
+ memid, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), LError1);
+
+ // if call failed, dont marshal "out" params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError1;
+
+ _stubSysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(m_pstm, _stubSysKind), LError1);
+
+ IfFailGo(PUT(m_pstm, dwHelpContext), LError1);
+ IfFailGo(BstrWrite(m_pstm, bstrName, (SYSKIND) _proxySysKind), LError1);
+ IfFailGo(BstrWrite(m_pstm, bstrDocString, (SYSKIND) _proxySysKind), LError1);
+ IfFailGo(BstrWrite(m_pstm, bstrHelpFile, (SYSKIND) _proxySysKind), LError1);
+
+ hresult = NOERROR;
+
+LError1:;
+ // assume none of these were allocated if the call failed
+ if(HRESULT_SUCCESS(m_hresultRet)){
+ SysFreeString(bstrName);
+ SysFreeString(bstrHelpFile);
+ SysFreeString(bstrDocString);
+ }
+
+LError0:;
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeInfo::GetDllEntry
+*Purpose:
+*
+* In:
+* <MEMBERID memid>
+*
+* Out:
+* <HRESULT hresultRet>
+* <unsigned short wOrdinal>
+* <BSTR bstrDllName>
+* <BSTR bstrName>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetDllEntry()
+{
+ MEMBERID memid;
+ INVOKEKIND invkind;
+ HRESULT hresult;
+ unsigned short wOrdinal;
+ BSTR bstrName, bstrDllName;
+ unsigned long _proxySysKind, _stubSysKind;
+ unsigned long _invkind;
+
+ IfFailGo(GET(m_pstm, _proxySysKind), LError0);
+
+ IfFailGo(GET(m_pstm, memid), LError0);
+
+ IfFailGo(GET(m_pstm, _invkind), LError0);
+ invkind = (INVOKEKIND) _invkind;
+
+ bstrName = NULL;
+ bstrDllName = NULL;
+
+ m_hresultRet = m_ptinfo->GetDllEntry(
+ memid, invkind, &bstrDllName, &bstrName, &wOrdinal);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), LError1);
+
+ // if call failed, dont marshal "out" params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError1;
+
+ _stubSysKind = (unsigned long) SYS_CURRENT;
+ IfFailGo(PUT(m_pstm, _stubSysKind), LError1);
+
+ IfFailGo(PUT(m_pstm, wOrdinal), LError1);
+ IfFailGo(BstrWrite(m_pstm, bstrDllName, (SYSKIND) _proxySysKind), LError1);
+ IfFailGo(BstrWrite(m_pstm, bstrName, (SYSKIND) _proxySysKind), LError1);
+
+ hresult = NOERROR;
+
+LError1:;
+ // assume none of these were allocated if the call failed
+ if(HRESULT_SUCCESS(m_hresultRet)){
+ SysFreeString(bstrName);
+ SysFreeString(bstrDllName);
+ }
+
+LError0:;
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeInfo::GetRefTypeInfo
+*Purpose:
+*
+* In:
+* <HREFTYPE hreftype>
+*
+* Out:
+* <HRESULT hresultRet>
+* <ITypeInfo itinfo>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetRefTypeInfo()
+{
+ HREFTYPE hreftype;
+ HRESULT hresult;
+ ITypeInfo FAR* ptinfo;
+
+ IfFailGo(GET(m_pstm, hreftype), LError0);
+
+ ptinfo = NULL;
+ m_hresultRet = m_ptinfo->GetRefTypeInfo(hreftype, &ptinfo);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), LError1);
+
+ // if call failed, do bother marshaling "out" params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto LError1;
+
+ hresult = DispMarshalInterface(m_pstm, IID_ITypeInfo, ptinfo);
+
+LError1:;
+ if(ptinfo != NULL)
+ ptinfo->Release();
+
+LError0:;
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeInfo::CreateInstance
+*Purpose:
+* Stub implementation of ITypeInfo::CreateInstance
+*
+* Marshal In:
+* IID
+*
+* Marshal Out:
+* newly create interface ptr.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::CreateInstance()
+{
+ IID iid;
+ HRESULT hresult;
+ void FAR* pvObj;
+
+ IfFailGo(m_pstm->Read((void FAR*)&iid, sizeof(IID), NULL), Error);
+
+ m_hresultRet = m_ptinfo->CreateInstance(NULL, iid, &pvObj);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(MarshalResult(), Error);
+
+ // If call failed, don't marshal the out params
+ if(HRESULT_FAILED(m_hresultRet))
+ goto Error;
+
+ hresult = DispMarshalInterface(m_pstm, iid, (IUnknown FAR*)pvObj);
+
+ ((IUnknown FAR*)pvObj)->Release();
+
+Error:;
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeInfo::GetContainingTypeLib
+*Purpose:
+*
+* In:
+* None
+*
+* Out:
+* <HRESULT hresultRet>
+* <unsigned int index>
+* <ITypeLib tlib>
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeInfo::GetContainingTypeLib()
+{
+ unsigned int index;
+ HRESULT hresult;
+ ITypeLib FAR* ptlib;
+ unsigned long _index;
+
+ ptlib = NULL;
+ m_hresultRet = m_ptinfo->GetContainingTypeLib(&ptlib, &index);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, m_hresultRet), LError0);
+
+ // unsigned int alway marshal/unmarshal as long (4 bytes)
+ _index = index;
+ IfFailGo(PUT(m_pstm, _index), LError0);
+
+ hresult = DispMarshalInterface(m_pstm, IID_ITypeLib, ptlib);
+
+
+LError0:;
+ if(ptlib != NULL)
+ ptlib->Release();
+
+ return hresult;
+}
+
+
+//---------------------------------------------------------------------
+// helpers
+//---------------------------------------------------------------------
+
+// this is a helper for the TypeInfo stub methods, that all return
+// the called methods hresult as the first marshaled result.
+
+HRESULT
+CStubTypeInfo::MarshalResult()
+{
+ /*IfFailRet(Rewind(m_pstm));*/
+
+ return DispMarshalHresult(m_pstm, m_hresultRet);
+}
+
+
+
+#if (OE_WIN32 || defined(WOW))
+
+STDMETHODIMP
+CStubTypeInfo::DebugServerQueryInterface(void FAR* FAR* ppv)
+{
+ *ppv = m_ptinfo;
+ return S_OK;
+}
+
+
+STDMETHODIMP_(void)
+CStubTypeInfo::DebugServerRelease(void FAR* ppv)
+{
+
+}
+
+#endif
diff --git a/private/oleauto/src/dispatch/tiutil.cpp b/private/oleauto/src/dispatch/tiutil.cpp
new file mode 100644
index 000000000..a63c693ba
--- /dev/null
+++ b/private/oleauto/src/dispatch/tiutil.cpp
@@ -0,0 +1,99 @@
+/***
+*tiutil.cxx - TypeInfo/TypeLib Utilities
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains misc TypeInfo/TypeLib releated utilities.
+*
+*Documentation:
+*
+*Revision History:
+*
+* [00] 23-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+ASSERTDATA
+
+
+/***
+*PUBLIC HRESULT GetPrimaryInterface
+*Purpose:
+* Given a TypeInfo describing a Coclass, search for and return
+* type TypeInfo that describes that class' primary interface.
+*
+*Entry:
+* ptinfo = the TypeInfo of the base class.
+*
+*Exit:
+* return value = HRESULT
+*
+* *ptinfoPrimary = the TypeInfo of the primary interface, NULL
+* if the class does not have a primary interface.
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+GetPrimaryInterface(ITypeInfo *ptinfo, ITypeInfo **pptinfoPri)
+{
+ BOOL fIsDual;
+ TYPEKIND tkind;
+ HRESULT hresult;
+ HREFTYPE hreftype;
+ int impltypeflags;
+ TYPEATTR *ptattr;
+ unsigned int iImplType, cImplTypes;
+ ITypeInfo *ptinfoRef;
+
+ ptinfoRef = NULL;
+
+ IfFailGo(ptinfo->GetTypeAttr(&ptattr), Error);
+ cImplTypes = ptattr->cImplTypes;
+ tkind = ptattr->typekind;
+ ptinfo->ReleaseTypeAttr(ptattr);
+
+ if(tkind != TKIND_COCLASS)
+ return RESULT(E_INVALIDARG);
+
+ // Look for the interface marked [default] and not [source]
+ for(iImplType = 0; iImplType < cImplTypes; ++iImplType){
+ IfFailGo(ptinfo->GetImplTypeFlags(iImplType, &impltypeflags), Error);
+ if(IMPLTYPEFLAG_FDEFAULT
+ == (impltypeflags & (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE)))
+ {
+ // Found It!
+ IfFailGo(ptinfo->GetRefTypeOfImplType(iImplType, &hreftype), Error);
+ IfFailGo(ptinfo->GetRefTypeInfo(hreftype, &ptinfoRef), Error);
+
+ // If its dual, get the interface portion
+ IfFailGo(ptinfoRef->GetTypeAttr(&ptattr), Error);
+ fIsDual = (ptattr->wTypeFlags & TYPEFLAG_FDUAL)
+ && (ptattr->typekind == TKIND_DISPATCH);
+ ptinfoRef->ReleaseTypeAttr(ptattr);
+
+ if (fIsDual) {
+ IfFailGo(ptinfoRef->GetRefTypeOfImplType((UINT)-1, &hreftype), Error);
+ IfFailGo(ptinfoRef->GetRefTypeInfo(hreftype, pptinfoPri), Error);
+ ptinfoRef->Release();
+ }
+ else {
+ *pptinfoPri = ptinfoRef;
+ }
+
+ return NOERROR;
+ }
+ }
+ // NotFound
+ *pptinfoPri = NULL;
+ return NOERROR;
+
+Error:
+ if(ptinfoRef != NULL)
+ ptinfoRef->Release();
+ return hresult;
+}
+
diff --git a/private/oleauto/src/dispatch/tlprox.cpp b/private/oleauto/src/dispatch/tlprox.cpp
new file mode 100644
index 000000000..05d6d4938
--- /dev/null
+++ b/private/oleauto/src/dispatch/tlprox.cpp
@@ -0,0 +1,867 @@
+/***
+*tlprox.cpp
+*
+* Copyright (C) 1992-94, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the ITypeLib proxy class.
+*
+*Revision History:
+*
+* [00] 05-Apr-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "tlps.h"
+//#include "dispstrm.h"
+
+ASSERTDATA
+
+
+CProxTypeLib::CProxTypeLib(IUnknown FAR* punkOuter)
+ : m_unk(this), m_proxy(this), m_tlib(this)
+{
+ if(punkOuter == NULL)
+ punkOuter = &m_unk;
+ m_punkOuter = punkOuter;
+}
+
+IUnknown FAR*
+CProxTypeLib::Create(IUnknown FAR* punkOuter)
+{
+ CProxTypeLib FAR* pproxtinfo;
+
+ if((pproxtinfo = new FAR CProxTypeLib(punkOuter)) != NULL){
+ pproxtinfo->m_refs = 1;
+ return &pproxtinfo->m_unk;
+ }
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeLib proxy class' IUnknown implementation
+//---------------------------------------------------------------------
+
+CPTLibUnkImpl::CPTLibUnkImpl(CProxTypeLib FAR* pproxtlib)
+{
+ m_pproxtlib = pproxtlib;
+}
+
+STDMETHODIMP
+CPTLibUnkImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ *ppv = NULL;
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = (void FAR*)&(m_pproxtlib->m_unk);
+ }else
+ if(IsEqualIID(riid, IID_IPROXY)){
+ *ppv = (void FAR*)&(m_pproxtlib->m_proxy);
+ }else
+ if(IsEqualIID(riid, IID_ITypeLib)){
+ *ppv = (void FAR*)&(m_pproxtlib->m_tlib);
+ }
+ if(*ppv == NULL)
+ return RESULT(E_NOINTERFACE);
+ ((IUnknown FAR*)*ppv)->AddRef();
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CPTLibUnkImpl::AddRef()
+{
+ return ++m_pproxtlib->m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPTLibUnkImpl::Release()
+{
+ if(--m_pproxtlib->m_refs==0){
+ delete m_pproxtlib;
+ return 0;
+ }
+ return m_pproxtlib->m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeLib proxy class' IRpcProxy implementation
+//---------------------------------------------------------------------
+
+CPTLibProxImpl::CPTLibProxImpl(CProxTypeLib FAR* pproxtlib)
+{
+ m_pproxtlib = pproxtlib;
+}
+
+CPTLibProxImpl::~CPTLibProxImpl()
+{
+ if(m_pproxtlib->m_plrpc)
+ m_pproxtlib->m_plrpc->Release();
+}
+
+STDMETHODIMP
+CPTLibProxImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxtlib->m_unk.QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPTLibProxImpl::AddRef()
+{
+ return m_pproxtlib->m_unk.AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPTLibProxImpl::Release()
+{
+ return m_pproxtlib->m_unk.Release();
+}
+
+STDMETHODIMP
+CPTLibProxImpl::Connect(ICHANNEL FAR* plrpc)
+{
+ if(plrpc){
+ plrpc->AddRef();
+ m_pproxtlib->m_plrpc = plrpc;
+ return m_pproxtlib->m_tlib.SysKind();
+ }
+ return RESULT(E_FAIL);
+}
+
+STDMETHODIMP_(void)
+CPTLibProxImpl::Disconnect()
+{
+ if(m_pproxtlib->m_plrpc)
+ m_pproxtlib->m_plrpc->Release();
+ m_pproxtlib->m_plrpc = NULL;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeLib proxy class' ITypeLib methods
+//---------------------------------------------------------------------
+
+CPTLibTypeLibImpl::CPTLibTypeLibImpl(CProxTypeLib FAR* pproxtlib)
+{
+ m_pproxtlib = pproxtlib;
+ m_syskindStub = (SYSKIND)-1; // something invalid
+}
+
+STDMETHODIMP
+CPTLibTypeLibImpl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ return m_pproxtlib->m_punkOuter->QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP_(unsigned long)
+CPTLibTypeLibImpl::AddRef()
+{
+ return m_pproxtlib->m_punkOuter->AddRef();
+}
+
+STDMETHODIMP_(unsigned long)
+CPTLibTypeLibImpl::Release()
+{
+ return m_pproxtlib->m_punkOuter->Release();
+}
+
+//
+// ITypeLib methods
+//
+
+/***
+*unsigned int CPTLibTypeLibImpl::GetTypeInfoCount
+*Purpose:
+* The proxy implementation of ITypeLib::GetTypeInfoCount
+*
+* Marshal In:
+* None
+*
+* Marshal Out:
+* ULONG cTypeInfo
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT CPTLibTypeLibImpl::DoGetTypeInfoCount(unsigned int FAR* pcTinfo)
+{
+ HRESULT hresult;
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ unsigned long ulCount;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_GETTYPEINFOCOUNT, 256, IID_ITypeLib);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(GET(pstm, ulCount), LError1);
+
+ *pcTinfo = (unsigned int)ulCount;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+STDMETHODIMP_(unsigned int)
+CPTLibTypeLibImpl::GetTypeInfoCount(void)
+{
+ unsigned int cTinfo;
+ HRESULT hresult;
+
+ hresult = DoGetTypeInfoCount(&cTinfo);
+ if(HRESULT_FAILED(hresult))
+ return 0;
+ return cTinfo;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::GetTypeInfo
+*Purpose:
+* The proxy implementation of ITypeLib::GetTypeInfo
+*
+*Entry:
+* index = the index of the the typeinfo were retrieving.
+*
+* Marshal In:
+* ULONG index
+*
+* Marshal Out:
+* HRESULT hresult
+* ITypeLib* ptlib
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPTLibTypeLibImpl::GetTypeInfo(unsigned int index, ITypeInfo FAR* FAR* pptinfo)
+{
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ unsigned long ulIndex;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_GETTYPEINFO, 256, IID_ITypeLib);
+
+ ulIndex = (unsigned long)index;
+ IfFailGo(PUT(pstm, ulIndex), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(
+ DispUnmarshalInterface(pstm, IID_ITypeInfo, (void FAR* FAR*)pptinfo),
+ LError1);
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::GetTypeInfoType
+*Purpose:
+* The proxy implementation of ITypeLib::GetTypeInfoType
+*
+* Marshal In:
+* ULONG index
+*
+* Marshal Out:
+* HRESULT hresult
+* ULONG tkind
+*
+*Entry:
+* index = the index of the typeinfo whose type were retrieving
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPTLibTypeLibImpl::GetTypeInfoType(unsigned int index, TYPEKIND FAR* ptkind)
+{
+ TYPEKIND tkind;
+ unsigned long ulTkind;
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ unsigned long ulIndex;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_GETTYPEINFOTYPE, 256, IID_ITypeLib);
+
+ ulIndex = (unsigned long)index;
+ IfFailGo(PUT(pstm, ulIndex), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, ulTkind), LError1);
+ tkind = (TYPEKIND)ulTkind;
+
+ *ptkind = tkind;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::GetTypeInfoOfGuid
+*Purpose:
+* The proxy implementation of ITypeLib::GetTypeInfoOfGuid
+*
+* Marshal In:
+* GUID guid
+*
+* Marshal Out:
+* HRESULT hresult
+* ITypeInfo* ptinfo
+*
+*Entry:
+* guid = the guid of the typeinfo to retrieve
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPTLibTypeLibImpl::GetTypeInfoOfGuid(REFGUID guid, ITypeInfo FAR* FAR* pptinfo)
+{
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_GETTYPEINFOOFGUID, 256,IID_ITypeLib);
+
+ // Write the guid
+ IfFailGo(pstm->Write((const void FAR*)&guid, sizeof(GUID), NULL), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(
+ DispUnmarshalInterface(pstm, IID_ITypeInfo, (void FAR* FAR*)pptinfo),
+ LError1);
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::GetLibAttr
+*Purpose:
+* The proxy implementation of ITypeLib::GetLibAttr
+*
+* Marshal In:
+* None
+*
+* Marshal Out:
+* HRESULT hresult
+* TLIBATTR tlibattr
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPTLibTypeLibImpl::GetLibAttr(TLIBATTR FAR* FAR* pptlibattr)
+{
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ TLIBATTR FAR* ptlibattr;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_GETLIBATTR, 256, IID_ITypeLib);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ if((ptlibattr = new TLIBATTR) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ hresult = ReadLibAttr(pstm, ptlibattr);
+
+ if(HRESULT_FAILED(hresult)){
+ delete ptlibattr;
+ goto LError1;
+ }
+
+ *pptlibattr = ptlibattr;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::GetTypeComp
+*Purpose:
+* The proxy implementation of ITypeLib::GetTypeComp
+*
+*Entry:
+* None
+*
+* Marshal In:
+* None
+*
+* Marshal Out:
+* HRESULT hresult
+* ITypeComp *ptcomp
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPTLibTypeLibImpl::GetTypeComp(ITypeComp FAR* FAR* pptcomp)
+{
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_GETTYPECOMP, 256, IID_ITypeLib);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(
+ DispUnmarshalInterface(pstm, IID_ITypeComp, (void FAR* FAR*)pptcomp),
+ LError1);
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::GetDocumentation
+*Purpose:
+*
+* Marshal In:
+* ULONG index
+* UCHAR fHelpContext
+* UCHAR fName
+* UCHAR fDocString
+* UCHAR fHelpFile
+
+* Marshal Out:
+* HRESULT hresult
+* if(fHelpContext) ULONG dwHelpContext
+* if(fName) BSTR bstrName
+* if(fDocString) BSTR bstrDocString
+* if(fHelpFile) BSTR bstrHelpFile
+*
+*Entry:
+* index = the index of the typeinfo to get the documentation for.
+*
+*Exit:
+* return value = HRESULT
+*
+* *pbstrName = the name of the typeinfo
+* *pbstrDocString = a doc string describing the typeinfo
+* *pdwHelpContext = a help context for the typeinfo
+* *pbstrHelpFile = path to the help file for the typeinfo
+*
+***********************************************************************/
+STDMETHODIMP
+CPTLibTypeLibImpl::GetDocumentation(
+ int index,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile)
+{
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ unsigned long ulIndex;
+ HRESULT hresult, hresultRet;
+ unsigned char fHelpContext, fName, fDocString, fHelpFile;
+
+ BSTR bstrName;
+ BSTR bstrDocString;
+ BSTR bstrHelpFile;
+ unsigned long dwHelpContext;
+
+ bstrName = NULL;
+ bstrDocString = NULL;
+ bstrHelpFile = NULL;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_GETDOCUMENTATION, 256, IID_ITypeLib);
+
+ ulIndex = (unsigned long)index;
+ IfFailGo(PUT(pstm, ulIndex), LError1);
+
+ fHelpContext = (pdwHelpContext != NULL);
+ IfFailGo(PUT(pstm, fHelpContext), LError1);
+
+ fName = (pbstrName != NULL);
+ IfFailGo(PUT(pstm, fName), LError1);
+
+ fDocString = (pbstrDocString != NULL);
+ IfFailGo(PUT(pstm, fDocString), LError1);
+
+ fHelpFile = (pbstrHelpFile != NULL);
+ IfFailGo(PUT(pstm, fHelpFile), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ if(fHelpContext)
+ IfFailGo(GET(pstm, dwHelpContext), LError1);
+ if(fName)
+ IfFailGo(BstrRead(pstm, &bstrName, m_syskindStub), LError1);
+ if(fDocString)
+ IfFailGo(BstrRead(pstm, &bstrDocString, m_syskindStub), LError1);
+ if(fHelpFile)
+ IfFailGo(BstrRead(pstm, &bstrHelpFile, m_syskindStub), LError1);
+
+ // Success! assign the out params..
+ if(fHelpContext)
+ *pdwHelpContext = dwHelpContext;
+ if(fName)
+ *pbstrName = bstrName;
+ if(fDocString)
+ *pbstrDocString = bstrDocString;
+ if(fHelpFile)
+ *pbstrHelpFile = bstrHelpFile;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ if(HRESULT_FAILED(hresult)){
+ if(bstrName != NULL)
+ SysFreeString(bstrName);
+ if(bstrDocString != NULL)
+ SysFreeString(bstrDocString);
+ if(bstrHelpFile != NULL)
+ SysFreeString(bstrHelpFile);
+ }
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::IsName
+*Purpose:
+* The proxy implementation of ITypeLib::IsName
+*
+* Marshal In:
+* long lHashVal
+* BSTR name
+*
+* Marshal Out:
+* HRESULT hresult
+* long fName
+*
+*Entry:
+* szNameBuf = the name to check for
+* lHashVal = the hash value of the name where checking for
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CPTLibTypeLibImpl::IsName(
+ OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ int FAR* pfName)
+{
+ BSTR bstr;
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ unsigned long fName;
+ HRESULT hresult, hresultRet;
+
+ bstr = NULL;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_ISNAME, 256, IID_ITypeLib);
+
+ IfFailGo(PUT(pstm, lHashVal), LError1);
+
+ IfFailGo(ErrSysAllocString(szNameBuf, &bstr), LError1);
+ IfFailGo(BstrWrite(pstm, bstr, m_syskindStub), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, fName), LError1);
+ *pfName = (int)fName;
+
+LError2:;
+ hresult = hresultRet;
+
+LError1:;
+ SysFreeString(bstr);
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::FindName
+*Purpose:
+* The proxy implementation of ITypeLib::FindName
+*
+* Marshal In:
+* ULONG cFound;
+* ULONG lHashVal
+* BSTR szNameBuf
+*
+* Marshal Out:
+* HRESULT hresult
+* ULONG cFound
+* MEMID[cFound] rgmemid
+* ITypeInfo[cFOund] rgptinfo
+*
+*Entry:
+* szNameBuf = the name to look for
+* lHashVal = the hash value of the name were looking for
+*
+*Exit:
+* return value = HRESULT
+*
+* rgptinfo = array populated with typeinfos where the name was found
+* rgmemid = array of memids indicating where on the corresponding
+* typeinfo the name was found.
+* *pcFound = the number of occurances that were found.
+*
+***********************************************************************/
+STDMETHODIMP
+CPTLibTypeLibImpl::FindName(
+ OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ ITypeInfo FAR* FAR* rgptinfo,
+ MEMBERID FAR* rgmemid,
+ unsigned short FAR* pcFound)
+{
+ BSTR bstr;
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ unsigned long i, cFound;
+ HRESULT hresult, hresultRet;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_FINDNAME, 256, IID_ITypeLib);
+
+ bstr = NULL;
+ cFound = (unsigned long)*pcFound;
+ for(i = 0; i < cFound; ++i)
+ rgptinfo[i] = NULL;
+
+ IfFailGo(PUT(pstm, cFound), LError1);
+ IfFailGo(PUT(pstm, lHashVal), LError1);
+ IfFailGo(ErrSysAllocString(szNameBuf, &bstr), LError1);
+ IfFailGo(BstrWrite(pstm, bstr, m_syskindStub), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), LError1);
+ if(HRESULT_FAILED(hresultRet))
+ goto LError2;
+
+ IfFailGo(GET(pstm, cFound), LError1);
+ ASSERT(cFound <= (unsigned long)*pcFound);
+
+ IfFailGo(
+ pstm->Read(rgmemid, cFound * sizeof(MEMBERID), NULL),
+ LError1);
+
+ for(i = 0; i < cFound; ++i){
+ IfFailGo(
+ DispUnmarshalInterface(
+ pstm, IID_ITypeInfo, (void FAR* FAR*)&rgptinfo[i]),
+ LError1);
+ }
+ *pcFound = (unsigned short)cFound; // return count actually found
+
+LError2:;
+ hresult = hresultRet;
+LError1:;
+ if(HRESULT_FAILED(hresult)){
+ // cleanup if call failed.
+ for(i = 0; i < cFound; ++i){
+ if(rgptinfo[i] == NULL)
+ break;
+ rgptinfo[i]->Release();
+ rgptinfo[i] = NULL;
+ }
+ }
+ SysFreeString(bstr);
+ pstm->Release();
+ return hresult;
+}
+
+STDMETHODIMP_(void)
+CPTLibTypeLibImpl::ReleaseTLibAttr(TLIBATTR FAR* ptlibattr)
+{
+ if(ptlibattr != NULL)
+ delete ptlibattr;
+}
+
+/***
+*HRESULT CPTLibTypeLibImpl::SysKind
+*Purpose:
+* Exchange syskinds between proxy and stub.
+*
+* Marshal In:
+* ULONG syskindProxy
+*
+* Marshal Out:
+* ULONG syskindStub
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CPTLibTypeLibImpl::SysKind()
+{
+ HRESULT hresult;
+ IStream FAR* pstm;
+ ICHANNEL FAR* plrpc;
+ unsigned long syskind;
+
+ if((plrpc = m_pproxtlib->m_plrpc) == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ OPEN_STREAM(plrpc, pstm, IMETH_TYPELIB_SYSKIND, 32, IID_ITypeLib);
+
+ syskind = (unsigned long)SYS_CURRENT;
+ IfFailGo(PUT(pstm, syskind), LError1);
+
+ INVOKE_CALL(plrpc, pstm, LError1);
+
+ IfFailGo(GET(pstm, syskind), LError1);
+ m_syskindStub = (SYSKIND)syskind;
+
+LError1:
+ pstm->Release();
+ return hresult;
+}
+
+
+//---------------------------------------------------------------------
+// utilities
+//---------------------------------------------------------------------
+
+INTERNAL_(HRESULT)
+ReadLibAttr(IStream FAR* pstm, TLIBATTR FAR* ptlibattr)
+{
+ unsigned long syskind;
+
+ IfFailRet(GET(pstm, ptlibattr->guid));
+ IfFailRet(GET(pstm, ptlibattr->lcid));
+ IfFailRet(GET(pstm, syskind));
+ ptlibattr->syskind = (SYSKIND)syskind;
+ IfFailRet(GET(pstm, ptlibattr->wMajorVerNum));
+ IfFailRet(GET(pstm, ptlibattr->wMinorVerNum));
+ IfFailRet(GET(pstm, ptlibattr->wLibFlags));
+ return NOERROR;
+}
+
+INTERNAL_(HRESULT)
+WriteLibAttr(IStream FAR* pstm, TLIBATTR FAR* ptlibattr)
+{
+ unsigned long syskind;
+
+ IfFailRet(PUT(pstm, ptlibattr->guid));
+ IfFailRet(PUT(pstm, ptlibattr->lcid));
+ syskind = (unsigned long)ptlibattr->syskind;
+ IfFailRet(PUT(pstm, syskind));
+ IfFailRet(PUT(pstm, ptlibattr->wMajorVerNum));
+ IfFailRet(PUT(pstm, ptlibattr->wMinorVerNum));
+ IfFailRet(PUT(pstm, ptlibattr->wLibFlags));
+ return NOERROR;
+}
+
diff --git a/private/oleauto/src/dispatch/tlps.h b/private/oleauto/src/dispatch/tlps.h
new file mode 100644
index 000000000..3e8c90683
--- /dev/null
+++ b/private/oleauto/src/dispatch/tlps.h
@@ -0,0 +1,226 @@
+/***
+*tlps.h - ITypeLib Proxy and Stub class definitions
+*
+* Copyright (C) 1992-94, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the ITypeLib Proxy and Stub classes.
+*
+* CProxTypeLib -- the ITypeLib proxy class
+* CPTLibUnkImpl - CProxTypeLib implementation of IUnknown
+* CPTLibProxImpl - CProxTypeLib implementation of IRpcProxy
+* CPTLibTypeLibImpl - CProxTypeLib implementation of ITypeLib
+*
+* CStubTypeLib -- the ITypeLib stub class
+*
+*Revision History:
+*
+* [00] 05-Apr-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+// forward declarations
+class FAR CProxTypeLib;
+class FAR CStubTypeLib;
+
+
+// ITypeLib proxy class' IUnknown implementation
+class FAR CPTLibUnkImpl : public IUnknown
+{
+public:
+ CPTLibUnkImpl(CProxTypeLib FAR* pproxtlib);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+private:
+ CProxTypeLib FAR* m_pproxtlib;
+};
+
+
+// ITypeLib proxy class' IRpcProxy implementation
+class FAR CPTLibProxImpl : public IPROXY
+{
+public:
+ CPTLibProxImpl(CProxTypeLib FAR* pproxtlib);
+ ~CPTLibProxImpl();
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(Connect)(ICHANNEL FAR* plrpc);
+ STDMETHOD_(void, Disconnect)(void);
+
+private:
+ CProxTypeLib FAR* m_pproxtlib;
+};
+
+
+// ITypeLib
+class FAR CPTLibTypeLibImpl : public ITypeLib
+{
+public:
+ CPTLibTypeLibImpl(CProxTypeLib FAR* pproxtlib);
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // ITypeLib methods
+ STDMETHOD_(unsigned int, GetTypeInfoCount)(THIS);
+ STDMETHOD(GetTypeInfo)(unsigned int index, ITypeInfo FAR* FAR* pptinfo);
+ STDMETHOD(GetTypeInfoType)(unsigned int index, TYPEKIND FAR* ptypekind);
+ STDMETHOD(GetTypeInfoOfGuid)(REFGUID guid, ITypeInfo FAR* FAR* pptinfo);
+ STDMETHOD(GetLibAttr)(TLIBATTR FAR* FAR* pptlibattr);
+ STDMETHOD(GetTypeComp)(ITypeComp FAR* FAR* pptcomp);
+ STDMETHOD(GetDocumentation)(
+ int index,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile);
+ STDMETHOD(IsName)(
+ OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ int FAR* lpfName);
+ STDMETHOD(FindName)(
+ OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ ITypeInfo FAR* FAR* rgptinfo,
+ MEMBERID FAR* rgmemid,
+ unsigned short FAR* pcFound);
+ STDMETHOD_(void, ReleaseTLibAttr)(TLIBATTR FAR* ptlibattr);
+
+ HRESULT SysKind(void);
+ HRESULT DoGetTypeInfoCount(unsigned int FAR* pcTinfo);
+
+private:
+ SYSKIND m_syskindStub;
+ CProxTypeLib FAR* m_pproxtlib;
+};
+
+// ITypeLib Proxy Class
+class FAR CProxTypeLib
+{
+public:
+ static IUnknown FAR* Create(IUnknown FAR* punkOuter);
+
+private:
+ CProxTypeLib(IUnknown FAR* punkOuter);
+
+ friend CPTLibUnkImpl;
+ friend CPTLibProxImpl;
+ friend CPTLibTypeLibImpl;
+
+ CPTLibUnkImpl m_unk;
+ CPTLibProxImpl m_proxy;
+ CPTLibTypeLibImpl m_tlib;
+
+private:
+
+ unsigned long m_refs;
+ ICHANNEL FAR* m_plrpc;
+ IUnknown FAR* m_punkOuter;
+};
+
+// ITypeLib Stub Class
+//
+class FAR CStubTypeLib : public ISTUB
+{
+public:
+ static HRESULT Create(IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IRpcStub methods
+ //
+#if (OE_WIN32 || defined(WOW))
+ STDMETHOD(Connect)(IUnknown FAR* pUnk);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg,
+ IRpcChannelBuffer FAR* pRpcChannel);
+ STDMETHOD_(IRpcStubBuffer *, IsIIDSupported)(REFIID iid);
+ STDMETHOD_(ULONG, CountRefs)(void);
+ STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv);
+ STDMETHOD_(void, DebugServerRelease)(void FAR* pv);
+#else
+ STDMETHOD(Connect)(IUnknown FAR* punkObject);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(
+ REFIID riid,
+ int imeth,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx);
+#if OE_MAC
+ STDMETHOD_(unsigned long, IsIIDSupported)(REFIID riid);
+#else
+ STDMETHOD_(BOOL, IsIIDSupported)(REFIID riid);
+#endif
+ STDMETHOD_(unsigned long, CountRefs)(void);
+#endif
+
+ // introduced methods
+ HRESULT GetTypeInfoCount(void);
+ HRESULT GetTypeInfo(void);
+ HRESULT GetTypeInfoType(void);
+ HRESULT GetTypeInfoOfGuid(void);
+ HRESULT GetLibAttr(void);
+ HRESULT GetTypeComp(void);
+ HRESULT GetDocumentation(void);
+ HRESULT IsName(void);
+ HRESULT FindName(void);
+
+ HRESULT SysKind(void);
+
+ // helpers
+ HRESULT MarshalResult(void);
+
+private:
+ CStubTypeLib();
+ ~CStubTypeLib();
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punk;
+ ITypeLib FAR* m_ptlib;
+ IStream FAR* m_pstm;
+ SYSKIND m_syskindProxy;
+};
+
+
+// ITypeLib method indices
+//
+enum IMETH_TYPELIB {
+ IMETH_TYPELIB_QUERYINTERFACE = 0,
+ IMETH_TYPELIB_ADDREF,
+ IMETH_TYPELIB_RELEASE,
+
+ IMETH_TYPELIB_GETTYPEINFOCOUNT,
+ IMETH_TYPELIB_GETTYPEINFO,
+ IMETH_TYPELIB_GETTYPEINFOTYPE,
+ IMETH_TYPELIB_GETTYPEINFOOFGUID,
+ IMETH_TYPELIB_GETLIBATTR,
+ IMETH_TYPELIB_GETTYPECOMP,
+ IMETH_TYPELIB_GETDOCUMENTATION,
+ IMETH_TYPELIB_ISNAME,
+ IMETH_TYPELIB_FINDNAME,
+ IMETH_TYPELIB_RELEASETLIBATTR,
+
+ IMETH_TYPELIB_SYSKIND
+};
+
+// TypeLib marshaling utilities
+INTERNAL_(HRESULT) ReadLibAttr(IStream FAR* pstm, TLIBATTR FAR* ptlibattr);
+INTERNAL_(HRESULT) WriteLibAttr(IStream FAR* pstm, TLIBATTR FAR* ptlibattr);
+
diff --git a/private/oleauto/src/dispatch/tlstub.cpp b/private/oleauto/src/dispatch/tlstub.cpp
new file mode 100644
index 000000000..ce16dbfcd
--- /dev/null
+++ b/private/oleauto/src/dispatch/tlstub.cpp
@@ -0,0 +1,846 @@
+/***
+*tlstub.cpp
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the ITypeLib stub class.
+*
+*Revision History:
+*
+* [00] 05-Apr-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifndef WIN32
+#include <cobjps.h>
+#endif //!WIN32
+
+#include "dispmrsh.h"
+#include "tlps.h"
+//#include "dispstrm.h"
+
+ASSERTDATA
+
+
+CStubTypeLib::CStubTypeLib()
+{
+ m_refs = 0;
+ m_pstm = NULL;
+ m_punk = NULL;
+ m_ptlib = NULL;
+ m_syskindProxy = (SYSKIND)-1; // something invalid
+}
+
+CStubTypeLib::~CStubTypeLib()
+{
+ Disconnect();
+}
+
+HRESULT
+CStubTypeLib::Create(IUnknown FAR* punkServer, ISTUB FAR* FAR* ppstub)
+{
+ CStubTypeLib FAR* pstub;
+
+ if(pstub = new FAR CStubTypeLib()){
+ pstub->m_refs = 1;
+ *ppstub = pstub;
+ if (punkServer)
+ return pstub->Connect(punkServer);
+ return NOERROR;
+ }
+ return RESULT(E_OUTOFMEMORY);
+}
+
+
+//---------------------------------------------------------------------
+// ITypeLib stub class' IUnknown implementation
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CStubTypeLib::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else if(IsEqualIID(riid, IID_ISTUB)){
+ *ppv = this;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ ++m_refs;
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubTypeLib::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubTypeLib::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// ITypeLib stub class' IRpcStub implementation
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CStubTypeLib::Connect(IUnknown FAR* punkObj)
+{
+#if (defined(WIN32) || defined(WOW))
+ ASSERT(m_punk == NULL && m_ptlib == NULL);
+ //This will keep the server object alive until we disconnect.
+ IfFailRet(punkObj->QueryInterface(IID_ITypeLib, (void FAR* FAR*)&m_ptlib));
+ punkObj->AddRef();
+ m_punk = punkObj;
+ return NOERROR;
+#else
+ if(m_punk)
+ return RESULT(E_FAIL); // call Disconnect first
+
+ if (punkObj) {
+ punkObj->AddRef();
+ m_punk = punkObj;
+ }
+ return NOERROR;
+#endif
+}
+
+STDMETHODIMP_(void)
+CStubTypeLib::Disconnect()
+{
+ if(m_punk){
+ m_punk->Release();
+ m_punk = NULL;
+ }
+ if(m_ptlib){
+ m_ptlib->Release();
+ m_ptlib = NULL;
+ }
+}
+
+/***
+*PUBLIC HRESULT CStubTypeLib::Invoke
+*
+*Purpose:
+* Dispatch the method with the given index (imeth) on the given
+* interface, using the arguments serialized in the given stream.
+*
+* This function is the callee side of an LRPC call.
+*
+*Entry:
+* iid = the IID of the interface on which we are to make the call
+* imeth = the method index
+* pstm = the IStream containing the method's actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CStubTypeLib::Invoke(
+#if (OE_WIN32 || defined(WOW))
+ RPCOLEMESSAGE *pMessage,
+ ICHANNEL *pRpcChannel)
+#else
+ REFIID riid,
+ int iMethod,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx)
+#endif
+{
+ HRESULT hresult;
+
+#if (OE_WIN32 || defined(WOW))
+ IStream FAR* pstm;
+
+ if(!m_punk)
+ return RESULT(E_FAIL);
+
+ OPEN_STUB_STREAM(pstm, pRpcChannel, pMessage, IID_ITypeLib);
+
+#else
+ UNUSED(dwDestCtx);
+ UNUSED(pvDestCtx);
+
+ if(!IsEqualIID(riid, IID_ITypeLib))
+ return RESULT(E_NOINTERFACE);
+
+ if(!m_punk)
+ return RESULT(E_FAIL);
+
+ if(m_ptlib == NULL)
+ IfFailRet(m_punk->QueryInterface(IID_ITypeLib, (void FAR* FAR*)&m_ptlib));
+#endif
+
+
+ m_pstm = pstm;
+
+ switch(GET_IMETHOD(pMessage)){
+ case IMETH_TYPELIB_GETTYPEINFOCOUNT:
+ hresult = GetTypeInfoCount();
+ break;
+ case IMETH_TYPELIB_GETTYPEINFO:
+ hresult = GetTypeInfo();
+ break;
+ case IMETH_TYPELIB_GETTYPEINFOTYPE:
+ hresult = GetTypeInfoType();
+ break;
+ case IMETH_TYPELIB_GETTYPEINFOOFGUID:
+ hresult = GetTypeInfoOfGuid();
+ break;
+ case IMETH_TYPELIB_GETLIBATTR:
+ hresult = GetLibAttr();
+ break;
+ case IMETH_TYPELIB_GETTYPECOMP:
+ hresult = GetTypeComp();
+ break;
+ case IMETH_TYPELIB_GETDOCUMENTATION:
+ hresult = GetDocumentation();
+ break;
+ case IMETH_TYPELIB_ISNAME:
+ hresult = IsName();
+ break;
+ case IMETH_TYPELIB_FINDNAME:
+ hresult = FindName();
+ break;
+ case IMETH_TYPELIB_SYSKIND:
+ hresult = SysKind();
+ break;
+
+ case IMETH_TYPELIB_RELEASETLIBATTR: // should be handled by the proxy!
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+
+ RESET_STREAM(pstm);
+ DELETE_STREAM(pstm);
+ m_pstm = NULL;
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT CStubTypeLib::IsIIDSupported(REFIID)
+*Purpose:
+* Answer if the given IID is supported by this stub.
+*
+*Entry:
+* iid = the IID to query for support
+*
+*Exit:
+* return value = BOOL. TRUE if IID is supported, FALSE otherwise.
+*
+***********************************************************************/
+#if OE_MAC
+STDMETHODIMP_(unsigned long)
+#elif (OE_WIN32 || defined(WOW))
+STDMETHODIMP_(IRpcStubBuffer *)
+#else
+STDMETHODIMP_(BOOL)
+#endif
+CStubTypeLib::IsIIDSupported(REFIID riid)
+{
+#if (OE_WIN32 || defined(WOW))
+ IRpcStubBuffer *pStub = 0;
+ if (IsEqualIID(riid, IID_ITypeLib)) {
+ AddRef();
+ pStub = (IRpcStubBuffer *) this;
+ }
+ return pStub;
+#else
+ // REVIEW: I don't understand this, but thats the way Ole does it...
+ if(m_punk == NULL)
+ return FALSE;
+
+ return(IsEqualIID(riid, IID_ITypeLib));
+#endif
+}
+
+/***
+*unsigned long CStubTypeLib::CountRefs
+*Purpose:
+* Return the count of references held by this stub.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long, the count of refs.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CStubTypeLib::CountRefs()
+{
+ unsigned long refs;
+
+ refs = 0;
+
+ if(m_punk != NULL)
+ ++refs;
+
+ if(m_ptlib != NULL)
+ ++refs;
+
+ return refs;
+}
+
+/***
+*UNDONE
+*Purpose:
+*
+* Marshal In:
+* None.
+*
+* Marshal Out:
+* ULONG cTypeInfo
+*
+*Entry:
+* UNDONE
+*
+*Exit:
+* return value =
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::GetTypeInfoCount()
+{
+ unsigned long cTypeInfo;
+
+ cTypeInfo = (unsigned long)m_ptlib->GetTypeInfoCount();
+
+ REWIND_STREAM(m_pstm);
+
+ return PUT(m_pstm, cTypeInfo);
+}
+
+/***
+*HRESULT CStubTypeLib::GetTypeInfo
+*Purpose:
+* The stub implementation of ITypeLib::GetTypeInfo
+*
+* Marshal In:
+* ULONG index
+*
+* Marshal Out:
+* HRESULT hresult
+* ITypeInfo* ptinfo
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::GetTypeInfo()
+{
+ int index;
+ unsigned long ulIndex;
+ ITypeInfo FAR* ptinfo;
+ HRESULT hresult, hresultRet;
+
+ hresult = NOERROR;
+ ptinfo = NULL;
+
+ IfFailGo(GET(m_pstm, ulIndex), LError1);
+ index = (int)ulIndex;
+
+ hresultRet = m_ptlib->GetTypeInfo(index, &ptinfo);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ IfFailGo(
+ DispMarshalInterface(m_pstm, IID_ITypeInfo, ptinfo),
+ LError1);
+
+LError1:;
+ if(ptinfo != NULL)
+ ptinfo->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeLib::GetTypeInfoType
+*Purpose:
+* The stub implementation of ITypeLib::GetTypeInfoType
+*
+* Marshal In:
+* ULONG index
+*
+* Marshal Out:
+* HRESULT hresult
+* ULONG tkind
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::GetTypeInfoType()
+{
+ int index;
+ TYPEKIND tkind;
+ unsigned long ulTkind;
+ unsigned long ulIndex;
+ HRESULT hresult, hresultRet;
+
+ hresult = NOERROR;
+
+ IfFailGo(GET(m_pstm, ulIndex), LError1);
+ index = (int)ulIndex;
+
+ hresultRet = m_ptlib->GetTypeInfoType(index, &tkind);
+ ulTkind = (unsigned long)tkind;
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ IfFailGo(PUT(m_pstm, ulTkind), LError1);
+
+LError1:;
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeLib::GetTypeInfoOfGuid
+*Purpose:
+* The stub implementation of ITypeLib::GetTypeInfoOfGuid
+*
+* Marshal In:
+* GUID guid
+*
+* Marshal Out:
+* HRESULT hresult
+* ITypeInfo* ptinfo
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::GetTypeInfoOfGuid()
+{
+ GUID guid;
+ ITypeInfo FAR* ptinfo;
+ HRESULT hresult, hresultRet;
+
+ hresult = NOERROR;
+ ptinfo = NULL;
+
+ IfFailGo(m_pstm->Read(&guid, sizeof(GUID), NULL), LError1);
+
+ hresultRet = m_ptlib->GetTypeInfoOfGuid(guid, &ptinfo);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ IfFailGo(
+ DispMarshalInterface(m_pstm, IID_ITypeInfo, ptinfo),
+ LError1);
+
+LError1:;
+ if(ptinfo != NULL)
+ ptinfo->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeLib::GetLibAttr
+*Purpose:
+* The stub implementation of ITypeLib::GetLibAttr
+*
+* Marshal In:
+* None
+*
+* Marshal Out:
+* HRESULT hresult
+* TLIBATTR tlibattr
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::GetLibAttr()
+{
+ TLIBATTR FAR* ptlibattr;
+ HRESULT hresult, hresultRet;
+
+ hresult = NOERROR;
+ ptlibattr = NULL;
+
+ hresultRet = m_ptlib->GetLibAttr(&ptlibattr);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ IfFailGo(WriteLibAttr(m_pstm, ptlibattr), LError1);
+
+LError1:;
+ if(ptlibattr != NULL)
+ m_ptlib->ReleaseTLibAttr(ptlibattr);
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeLib::GetTypeComp
+*Purpose:
+* The stub implementation of ITypeLib::GetTypeComp
+*
+* Marshal In:
+* None
+*
+* Marshal Out:
+* HRESULT hresult
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::GetTypeComp()
+{
+ ITypeComp FAR* ptcomp;
+ HRESULT hresult, hresultRet;
+
+ ptcomp = NULL;
+ hresult = NOERROR;
+
+ hresultRet = m_ptlib->GetTypeComp(&ptcomp);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ IfFailGo(
+ DispMarshalInterface(m_pstm, IID_ITypeComp, ptcomp),
+ LError1);
+
+LError1:;
+ if(ptcomp != NULL)
+ ptcomp->Release();
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeLib::GetDocumentation
+*Purpose:
+* The stub implementation of ITypeLib::GetDocumentation
+*
+* Marshal In:
+* ULONG index
+* UCHAR fHelpContext
+* UCHAR fName
+* UCHAR fDocString
+* UCHAR fHelpFile
+*
+* Marshal Out:
+* HRESULT hresult
+* if(fHelpContext) ULONG dwHelpContext
+* if(fName) BSTR bstrName
+* if(fDocString) BSTR bstrDocString
+* if(fHelpFile) BSTR bstrHelpFile
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::GetDocumentation()
+{
+ int index;
+ unsigned long ulIndex;
+ HRESULT hresult, hresultRet;
+ BSTR bstrName, FAR* pbstrName;
+ BSTR bstrHelpFile, FAR* pbstrHelpFile;
+ BSTR bstrDocString, FAR* pbstrDocString;
+ unsigned long dwHelpContext, FAR* pdwHelpContext;
+ unsigned char fHelpContext, fName, fDocString, fHelpFile;
+
+ hresult = NOERROR;
+ bstrName = NULL;
+ bstrDocString = NULL;
+ bstrHelpFile = NULL;
+
+ IfFailGo(GET(m_pstm, ulIndex), LError1);
+ index = (int)ulIndex;
+ IfFailGo(GET(m_pstm, fHelpContext), LError1);
+ IfFailGo(GET(m_pstm, fName), LError1);
+ IfFailGo(GET(m_pstm, fDocString), LError1);
+ IfFailGo(GET(m_pstm, fHelpFile), LError1);
+
+ pdwHelpContext = fHelpContext ? &dwHelpContext : NULL;
+ pbstrName = fName ? &bstrName : NULL;
+ pbstrDocString = fDocString ? &bstrDocString : NULL;
+ pbstrHelpFile = fHelpFile ? &bstrHelpFile : NULL;
+
+ hresultRet = m_ptlib->GetDocumentation(
+ index, pbstrName, pbstrDocString, pdwHelpContext, pbstrHelpFile);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ if(fHelpContext)
+ IfFailGo(PUT(m_pstm, dwHelpContext), LError1);
+ if(fName)
+ IfFailGo(BstrWrite(m_pstm, bstrName, m_syskindProxy), LError1);
+ if(fDocString)
+ IfFailGo(BstrWrite(m_pstm, bstrDocString, m_syskindProxy), LError1);
+ if(fHelpFile)
+ IfFailGo(BstrWrite(m_pstm, bstrHelpFile, m_syskindProxy), LError1);
+
+LError1:;
+ SysFreeString(bstrName);
+ SysFreeString(bstrDocString);
+ SysFreeString(bstrHelpFile);
+
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeLib::IsName
+*Purpose:
+* The stub implementation of ITypeLib::IsName
+*
+* Marshal In:
+* ULONG lHashVal
+* BSTR bstrName
+*
+* Marshal Out:
+* HRESULT hresult
+* ULONG fName
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::IsName()
+{
+ int fIsName;
+ BSTR bstrName;
+ unsigned long lHashVal;
+ unsigned long ulIsName;
+ HRESULT hresult, hresultRet;
+
+ hresult = NOERROR;
+ bstrName = NULL;
+
+ IfFailGo(GET(m_pstm, lHashVal), LError1);
+ IfFailGo(BstrRead(m_pstm, &bstrName, m_syskindProxy), LError1);
+
+ hresultRet = m_ptlib->IsName(bstrName, lHashVal, &fIsName);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ ulIsName = (unsigned long)fIsName;
+ IfFailGo(PUT(m_pstm, ulIsName), LError1);
+
+LError1:;
+ SysFreeString(bstrName);
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeLib::FindName
+*Purpose:
+* Stub implementation of ITypeLib::FindName.
+*
+* Marshal In:
+* ULONG cFound
+* ULONG lHashVal
+* BSTR bstrName
+*
+* Marshal Out:
+* HRESULT hresult
+* ULONG cFound
+* MEMID[cFound] rgmemid
+* ITypeInfo[cFound] rgptinfo
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::FindName()
+{
+ BSTR bstrName;
+ MEMBERID FAR* rgmemid;
+ ITypeInfo FAR* FAR* rgptinfo;
+ unsigned short us, cFound;
+ HRESULT hresult, hresultRet;
+ unsigned long ul, ulFound, cFoundIn, lHashVal;
+
+ hresult = NOERROR;
+ bstrName = NULL;
+ rgmemid = NULL;
+ rgptinfo = NULL;
+ cFound = 0; // in case of error
+
+ IfFailGo(GET(m_pstm, cFoundIn), LError1);
+ cFound = (unsigned short)cFoundIn;
+ IfFailGo(GET(m_pstm, lHashVal), LError1);
+ IfFailGo(BstrRead(m_pstm, &bstrName, m_syskindProxy), LError1);
+
+ if((rgmemid = new FAR MEMBERID[cFound]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ if((rgptinfo = new FAR ITypeInfo FAR* [cFound]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+ //memset(rgptinfo, 0, cFound * sizeof(ITypeInfo FAR*));
+
+ hresultRet = m_ptlib->FindName(
+ bstrName, lHashVal, rgptinfo, rgmemid, &cFound);
+ ASSERT(cFound <= (unsigned short)cFoundIn);
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), LError1);
+
+ if(HRESULT_FAILED(hresultRet))
+ goto LError1;
+
+ ulFound = (unsigned long)cFound;
+ IfFailGo(PUT(m_pstm, ulFound), LError1);
+ IfFailGo(m_pstm->Write(rgmemid, sizeof(MEMBERID) * cFound, NULL), LError1);
+ for(us = 0; us < cFound; ++us){
+ IfFailGo(
+ DispMarshalInterface(m_pstm, IID_ITypeInfo, rgptinfo[us]),
+ LError1);
+ }
+
+LError1:;
+ if(rgmemid != NULL)
+ delete rgmemid;
+ if(rgptinfo != NULL){
+ for(ul = 0; ul < cFound; ++ul){
+ ASSERT(rgptinfo[ul] != NULL);
+ rgptinfo[ul]->Release();
+ }
+ delete rgptinfo;
+ }
+ SysFreeString(bstrName);
+ return hresult;
+}
+
+/***
+*HRESULT CStubTypeLib::SysKind
+*Purpose:
+* Exchange syskinds with the proxy were connected to.
+*
+* Marshal In:
+* ULONG syskindProxy
+*
+* Marshal Out:
+* ULONG syskindStub
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubTypeLib::SysKind()
+{
+ unsigned long syskind;
+
+ IfFailRet(GET(m_pstm, syskind));
+ m_syskindProxy = (SYSKIND)syskind;
+ syskind = (unsigned long)SYS_CURRENT;
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailRet(PUT(m_pstm, syskind));
+
+ return NOERROR;
+}
+
+#if (OE_WIN32 || defined(WOW))
+
+STDMETHODIMP
+CStubTypeLib::DebugServerQueryInterface(void FAR* FAR* ppv)
+{
+ *ppv = m_ptlib;
+ return S_OK;
+}
+
+
+STDMETHODIMP_(void)
+CStubTypeLib::DebugServerRelease(void FAR* ppv)
+{ }
+
+#endif
diff --git a/private/oleauto/src/dispatch/ups.cpp b/private/oleauto/src/dispatch/ups.cpp
new file mode 100644
index 000000000..f8afeb715
--- /dev/null
+++ b/private/oleauto/src/dispatch/ups.cpp
@@ -0,0 +1,1719 @@
+/***
+*ups.cpp
+*
+* Copyright (C) 1992-94, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the Universal Proxy and Stub classes.
+*
+*Revision History:
+*
+* [00] 21-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#if !OE_WIN32
+# include <cobjps.h>
+#endif
+#include "dispmrsh.h"
+#include "ups.h"
+#include "dispps.h"
+#include <stdarg.h>
+#include <stdlib.h>
+#if OE_WIN
+# include <shellapi.h>
+#endif
+
+ASSERTDATA
+
+// In all builds, we use the Ansi registry.
+#if !OE_WIN32
+# define StringFromGUID2A StringFromGUID2
+# define RegQueryValueA RegQueryValue
+# define RegOpenKeyA RegOpenKey
+# define RegEnumKeyA RegEnumKey
+#else
+STDAPI_(int) StringFromGUID2A(REFGUID rguid, char FAR* szGuid, long cbMax);
+#endif
+
+extern long g_cfnUnk;
+extern void FAR* FAR g_rgpfnUnk[];
+
+extern long g_cfnDisp;
+extern void FAR* FAR g_rgpfnDisp[];
+
+
+HRESULT
+VarVtOfTypeDesc(ITypeInfo FAR* ptinfo,
+ TYPEDESC FAR* ptdesc,
+ VARTYPE FAR* pvt,
+ GUID FAR* pguid);
+HRESULT
+VarVtOfUDT(ITypeInfo FAR* ptinfo,
+ TYPEDESC FAR* ptdesc,
+ VARTYPE FAR* pvt,
+ GUID FAR* pguid);
+
+HRESULT
+GetTypeInfoOfIID(REFIID riid, ITypeInfo FAR* FAR* pptinfo);
+
+#if OE_WIN16
+INTERNAL_(HRESULT)
+DoLoadTypeLib(const OLECHAR FAR* szFile, ITypeLib FAR* FAR* pptlib);
+#else
+# define DoLoadTypeLib LoadTypeLib
+#endif
+
+
+CProxUniv::CProxUniv(IUnknown FAR* punkOuter)
+{
+ // Verify that the vtable ptr for the interface pointer that
+ // we are remoting is at the address point of the proxy.
+ ASSERT(OA_FIELD_OFFSET(CProxUniv, m_pvtbl) == 0);
+
+ m_cRefs = 0;
+ m_plrpc = NULL;
+ if(punkOuter == NULL)
+ punkOuter = (IUnknown FAR*)&m_priv;
+ m_punkOuter = punkOuter;
+ m_syskindStub = (SYSKIND)-1; // something invalid
+ m_fIsDual = 0;
+ m_iid = IID_NULL;
+ m_cFuncs = 0;
+ m_rgMethInfo = NULL;
+}
+
+CProxUniv::~CProxUniv()
+{
+ if (m_rgMethInfo != NULL) {
+ for (UINT i=0; i<m_cFuncs; ++i) {
+ if (m_rgMethInfo[i].ptinfo) {
+ m_rgMethInfo[i].ptinfo->ReleaseFuncDesc(m_rgMethInfo[i].pfdesc);
+ m_rgMethInfo[i].ptinfo->Release();
+ }
+ }
+ delete m_rgMethInfo;
+ }
+}
+
+/***
+*PRIVATE HRESULT CanWeRemoteIt
+*Purpose:
+* Answer if the given typeinfo describes an interface that can
+* be remoted by the Universal marshaler.
+*
+* 1. Must be OA-compatable (ie, use only OA types)
+* 2. All methods must return HRESULTs
+* 3. All methods must be CDECL
+* 4. Must have fewer than 512 methods
+*
+*Entry:
+* ptinfo = the TypeInfo that describes the interface were going to remote.
+*
+*Exit:
+* *pcFuncs = the TOTAL # of functions in the inheritance heirarchy for this
+* typeinfo.
+* *pfIsDual = TRUE if this is a dispinterface portion of a dual interface
+* return value = HRESULT. NOERROR if it can be remoted.
+*
+***********************************************************************/
+HRESULT
+CanWeRemoteIt(ITypeInfo FAR* ptinfo, USHORT FAR* pcFuncs, BOOL FAR* pfIsDual)
+{
+ HRESULT hresult;
+ TYPEATTR FAR* ptattr;
+ BOOL fIsDual;
+ USHORT cFuncs;
+
+ ptattr = NULL;
+
+ IfFailGo(ptinfo->GetTypeAttr(&ptattr), Error);
+
+ // If either "dual" or "oleautomation" is specified, then we
+ // know that mktyplib verified that the interface consists entirely
+ // of Automation compatable types.
+ if((ptattr->wTypeFlags & (TYPEFLAG_FDUAL | TYPEFLAG_FOLEAUTOMATION)) == 0){
+ hresult = RESULT(E_FAIL);
+ goto Error;
+ }
+
+ fIsDual = ((ptattr->wTypeFlags & TYPEFLAG_FDUAL) != 0)
+ && (ptattr->typekind == TKIND_DISPATCH);
+ *pfIsDual = fIsDual;
+
+ // The dispinteface version of a dual interface has it's heirarchy
+ // "flattened", so ptattr->cFuncs is the correct # of functions.
+ cFuncs = ptattr->cFuncs; // assume dual interface
+
+ if (!fIsDual) {
+ // For non-dual intefaces, take the sizeof the VFT, and divide by 4
+ // to get total # of functions in inheritance heirarchy. This is
+ // exactly how cFuncs is computed in the DUAL case.
+ cFuncs = ptattr->cbSizeVft / sizeof(void FAR*);
+ }
+
+ if(cFuncs >= (unsigned short)g_cfnDisp){
+ hresult = RESULT(E_FAIL);
+ goto Error;
+ }
+
+ // CONSIDER: should check the calling convention and return type
+ // CONSIDER: of each method...
+
+ *pcFuncs = cFuncs;
+ hresult = NOERROR;
+
+Error:;
+ if(ptattr != NULL)
+ ptinfo->ReleaseTypeAttr(ptattr);
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT CProxUniv::Create
+*Purpose:
+* Create an instance of the Universal Proxy.
+*
+*Entry:
+* punkOuter = the controlling unknown
+* riid = the IID of the interface for which the instance will be a proxy
+*
+*Exit:
+* return value = HRESULT
+*
+* *pprox = the newly created instance, if successful.
+*
+***********************************************************************/
+HRESULT
+CProxUniv::Create(IUnknown FAR* punkOuter,
+ REFIID riid,
+ IUnknown FAR* FAR* ppunk)
+{
+ USHORT cFuncs;
+ HRESULT hresult;
+ CProxUniv FAR* pprox;
+ ITypeInfo FAR* ptinfo;
+ ITypeInfo FAR* ptinfoProxy;
+ BOOL fIsDual;
+ HREFTYPE hreftype;
+
+ pprox = NULL;
+ ptinfo = NULL;
+ ptinfoProxy = NULL;
+
+ // Lookup the LIBID for the given IID
+ IfFailGo(GetTypeInfoOfIID(riid, &ptinfo), Error);
+
+ IfFailGo(CanWeRemoteIt(ptinfo, &cFuncs, &fIsDual), Error);
+
+ if((pprox = new CProxUniv(punkOuter)) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto Error;
+ }
+ pprox->m_iid = riid;
+ pprox->m_cFuncs = cFuncs;
+ pprox->m_fIsDual = fIsDual;
+
+ if(fIsDual){
+ // get the dual interface typeinfo
+ IfFailGo(ptinfo->GetRefTypeOfImplType((UINT)-1, &hreftype), Error);
+ IfFailGo(ptinfo->GetRefTypeInfo(hreftype, &ptinfoProxy), Error);
+ pprox->m_pvtbl = g_rgpfnDisp;
+ }else{
+ // the typeinfo we've got is good enough
+ ptinfo->AddRef();
+ ptinfoProxy = ptinfo;
+ pprox->m_pvtbl = g_rgpfnUnk;
+ }
+
+ // allocate space for per-method data
+ if ((pprox->m_rgMethInfo = new METHINFO[cFuncs]) == NULL) {
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto Error;
+ }
+ memset(pprox->m_rgMethInfo, 0, sizeof(METHINFO)*cFuncs);
+
+ IfFailGo(pprox->CacheFuncDescs(ptinfoProxy), Error);
+
+ pprox->m_priv.AddRef();
+ *ppunk = (IUnknown FAR*)&pprox->m_priv;
+ pprox = NULL;
+
+ hresult = NOERROR;
+
+Error:;
+ if(ptinfo != NULL)
+ ptinfo->Release();
+ if(ptinfoProxy != NULL)
+ ptinfoProxy->Release();
+ if(pprox != NULL)
+ delete pprox;
+ return hresult;
+}
+
+
+HRESULT
+CProxUniv::CacheFuncDescs(ITypeInfo *ptinfo)
+{
+ HRESULT hresult;
+ unsigned int i, iFuncIndex;
+ FUNCDESC *pfdesc;
+ HREFTYPE hRefType;
+ ITypeInfo *ptinfoBase = NULL;
+ TYPEATTR FAR* ptattr = NULL;
+
+ IfFailGo(ptinfo->GetTypeAttr(&ptattr), Error);
+
+ // first walk any base type infos
+ if (ptattr->cImplTypes) {
+
+ // if this is IDispatch, stop recursing - IDispatch itself is not
+ // OA-compatible because of the 'unsigned int' parameters to
+ // GetTypeInfoCount() and others...
+ if (IsEqualIID(IID_IDispatch, ptattr->guid))
+ goto Error; // just return NOERROR
+
+ IfFailGo(ptinfo->GetRefTypeOfImplType(0, &hRefType), Error);
+ IfFailGo(ptinfo->GetRefTypeInfo(hRefType, &ptinfoBase), Error);
+ IfFailGo(CacheFuncDescs(ptinfoBase), Error);
+ } else {
+ // know that IUnknown is at the bottom of everybody
+ // optimization: don't need to cache it's funcdesc's
+
+ ASSERT(IsEqualIID(IID_IUnknown, ptattr->guid))
+
+ goto Error; // just return NOERROR
+ }
+
+ // get and cache funcdescs for each method
+ for (i=0; i<ptattr->cFuncs; ++i) {
+
+ // get the funcdesc
+ IfFailGo(ptinfo->GetFuncDesc(i, &pfdesc), Error);
+
+ // figure out which method we got, based on the vtable offset
+ iFuncIndex = pfdesc->oVft/sizeof(void FAR*);
+
+ // Make sure we haven't already seen this funcdesc
+ // CONSIDER: if a derived class overrides a function in a base class,
+ // CONSIDER: then the new pfdesc and ptinfo should NOT overwrite the
+ // CONSIDER: ones in m_rgMethInfo[] - they should simply be tossed.
+ // CONSIDER: The functions are written in from most derived class to
+ // CONSIDER: base class, so the function we really want to call is the
+ // CONSIDER: first one encountered.
+ ASSERT(m_rgMethInfo[iFuncIndex].pfdesc == NULL);
+
+ // cache the funcdesc
+ m_rgMethInfo[iFuncIndex].pfdesc = pfdesc;
+
+ // cache the typeinfo
+ ptinfo->AddRef();
+ m_rgMethInfo[iFuncIndex].ptinfo = ptinfo;
+
+#if defined(_X86_)
+
+ // Compute the size of the arguments which need to be cleaned up
+ IfFailGo(GetCbStackCleanupOfFuncDesc(pfdesc, ptinfo,
+ &m_rgMethInfo[iFuncIndex].cbStackCleanup), Error);
+
+#endif //defined(_X86_)
+
+ }
+
+Error:
+ if (ptattr)
+ ptinfo->ReleaseTypeAttr(ptattr);
+ if (ptinfoBase)
+ ptinfoBase->Release();
+ return hresult;
+}
+
+//---------------------------------------------------------------------
+// The Proxy Class' private IUnknown and IProxy implementations
+//---------------------------------------------------------------------
+
+/***
+*PRIVATE CProxUniv FAR* PProx
+*Purpose:
+* Returns a pointer to the containing CProxUniv instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = CProxUniv*
+*
+***********************************************************************/
+inline CProxUniv FAR* CProxUniv::CPriv::PProx()
+{
+ CProxUniv FAR* pprox;
+
+ pprox = (CProxUniv FAR*)((unsigned char FAR*)this - OA_FIELD_OFFSET(CProxUniv, m_priv));
+
+ // Make sure we got where we expected. The following test works
+ // because all universal proxies have a pointer to the universal
+ // delegator at the address point of their instance.
+ ASSERT(*(void FAR* FAR*)pprox == g_rgpfnUnk
+ || *(void FAR* FAR*)pprox == g_rgpfnDisp);
+
+ return pprox;
+}
+
+STDMETHODIMP
+CProxUniv::CPriv::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ CProxUniv FAR* pprox;
+
+ if(riid == IID_IUnknown || riid == IID_IPROXY){
+ *ppv = this;
+ }else{
+ pprox = PProx();
+ if(riid == pprox->m_iid){
+ *ppv = pprox;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ }
+ ((IUnknown FAR*)*ppv)->AddRef();
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CProxUniv::CPriv::AddRef()
+{
+ CProxUniv FAR* pprox = PProx();
+
+ return ++pprox->m_cRefs;
+}
+
+STDMETHODIMP_(unsigned long)
+CProxUniv::CPriv::Release()
+{
+ CProxUniv FAR* pprox = PProx();
+
+ if(--pprox->m_cRefs == 0){
+ delete pprox;
+ return 0;
+ }
+ return pprox->m_cRefs;
+}
+
+STDMETHODIMP
+CProxUniv::CPriv::Connect(ICHANNEL FAR* plrpc)
+{
+ CProxUniv FAR* pprox = PProx();
+
+ if(plrpc == NULL)
+ return RESULT(E_FAIL);
+
+ plrpc->AddRef();
+ pprox->m_plrpc = plrpc;
+ IfFailRet(pprox->PSInit());
+ return NOERROR;
+}
+
+STDMETHODIMP_(void)
+CProxUniv::CPriv::Disconnect(void)
+{
+ CProxUniv FAR* pprox = PProx();
+
+ if(pprox->m_plrpc != NULL)
+ pprox->m_plrpc->Release();
+ pprox->m_plrpc = NULL;
+ pprox->m_syskindStub = (SYSKIND)-1; // something invalid
+}
+
+/***
+*PRIVATE HRESULT CProxUniv::PSInit
+*Purpose:
+* Internal init routine that exchanges info between the proxy and
+* stub at connect time.
+*
+* Marshaled out:
+* ULONG syskindProxy
+* ULONG fIsDual
+* IID m_iid
+*
+* Marshaled in:
+* ULONG syskindStub
+*
+*Entry:
+* None
+*
+*Exit:
+* return value =
+*
+***********************************************************************/
+HRESULT
+CProxUniv::PSInit()
+{
+ HRESULT hresult;
+ IStream FAR* pstm;
+ unsigned long fIsDual;
+ unsigned long syskindStub;
+ unsigned long syskindProxy;
+
+ pstm = NULL;
+
+ ASSERT(m_plrpc != NULL);
+ OPEN_STREAM(m_plrpc, pstm, IMETH_UNIVERSAL_PSInit, 256, m_iid);
+
+ syskindProxy = SYS_CURRENT;
+ IfFailGo(PUT(pstm, syskindProxy), Error);
+
+ fIsDual = m_fIsDual;
+ IfFailGo(PUT(pstm, fIsDual), Error);
+
+ IfFailGo(PUT(pstm, m_iid), Error);
+
+ INVOKE_CALL(m_plrpc, pstm, Error);
+
+ IfFailGo(GET(pstm, syskindStub), Error);
+ m_syskindStub = (SYSKIND)syskindStub;
+
+ hresult = NOERROR;
+
+Error:;
+ if(pstm != NULL)
+ pstm->Release();
+ return hresult;
+}
+
+/***
+*HRESULT ProxyMethod
+*Purpose:
+* The Universal marshaler.
+*
+*Entry:
+* pprox = ptr to CProxUniv instance (ProxyMethod is called from native code)
+* iMeth = the method index
+* args = ptr to arg list
+*if defined(_X86_)
+* pcbStackCleanup = ptr to OUT parm: amount of stack to clean up after
+* the _stdcall
+*endif //defined(_X86_)
+*
+* Marshaled Out:
+* long cArgs
+* VARTYPE[] rgVt = array of argument types
+* VARIANT[] rgArgs = array of argument values
+*
+* Marhsaled In:
+* hresult hresultRet = return value
+* VARIANT[] rgArgsOut = out params
+* Rich Error state (if any)
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI_(HRESULT)
+ProxyMethod(CProxUniv *pprox, int iMeth, va_list args
+#if defined(_X86_)
+ ,int *pcbStackCleanup
+#endif //defined(_X86_)
+ )
+{
+ GUID guid;
+ long cArgs;
+ long ccTemp;
+ int i, oVft;
+ IStream FAR* pstm;
+ VARIANTX FAR* pvarx;
+ TYPEDESC FAR* ptdesc;
+ FUNCDESC FAR* pfdesc;
+ HRESULT hresult, hresultRet;
+ VARTYPE FAR* prgvt, rgvt[16];
+ VARIANT FAR* prgvar, rgvar[16], FAR* pvar;
+
+ // We should never get called for QI, AddRef or Release
+ ASSERT(iMeth > 2);
+
+#if defined(_X86_)
+ // WARNING: *pcbStackCleanup must be set before *any* return! Otherwise,
+ // WARNING: the caller won't know how to clean its parameters on the
+ // WARNING: stack, so we'll crash on the return, because the Universal
+ // WARNING: Method was called using _stdcall (callee cleans up).
+
+ *pcbStackCleanup = pprox->m_rgMethInfo[iMeth].cbStackCleanup;
+#endif //defined(_X86_)
+
+ if(pprox->m_plrpc == NULL)
+ return RESULT(OLE_E_NOTRUNNING);
+
+ pstm = NULL;
+ prgvt = NULL;
+ prgvar = NULL;
+ pfdesc = NULL;
+ oVft = iMeth * sizeof(void FAR*);
+
+ OPEN_STREAM(pprox->m_plrpc, pstm, iMeth, 256, pprox->m_iid);
+
+ // Aquire the FUNCDESC that describe the method we're marshaling
+ pfdesc = pprox->m_rgMethInfo[iMeth].pfdesc;
+ if (pfdesc == NULL) {
+ ASSERT(FALSE); // the funcdesc should be non-NULL after Create() is done
+ hresult = RESULT(E_FAIL);
+ goto Error;
+ }
+
+ cArgs = (long)pfdesc->cParams;
+
+ if(cArgs == 0){
+ prgvt = NULL;
+ prgvar = NULL;
+ }else if(cArgs < DIM(rgvar)){
+ prgvt = rgvt;
+ prgvar = rgvar;
+ }else{
+ if((prgvt = new FAR VARTYPE[cArgs]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto Error;
+ }
+ if((prgvar = new FAR VARIANT[cArgs]) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto Error;
+ }
+ }
+
+ // Build array of VARIANTs containing the arguments to be Marshaled
+ // and a corresponding array of argument types.
+
+ for(i = 0; i < cArgs; ++i){
+
+ pvar = &prgvar[i];
+
+ ptdesc = &pfdesc->lprgelemdescParam[i].tdesc;
+ IfFailGo(VarVtOfTypeDesc(pprox->m_rgMethInfo[iMeth].ptinfo,
+ ptdesc,
+ &V_VT(pvar),
+ &guid), Error);
+
+ switch(V_VT(pvar)){
+ case VT_INTERFACE:
+ prgvt[i] = VT_UNKNOWN;
+ goto StuffIID;
+ case VT_INTERFACE | VT_BYREF:
+ prgvt[i] = VT_UNKNOWN | VT_BYREF;
+StuffIID:;
+ pvarx = (VARIANTX FAR*)pvar;
+ if((pvarx->piid = new IID) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto Error;
+ }
+ *pvarx->piid = guid;
+ break;
+ default:
+ prgvt[i] = V_VT(pvar);
+ break;
+ }
+
+ switch(prgvt[i]){
+ case VT_UI1:
+ V_UI1(pvar) = va_arg(args, unsigned char);
+ break;
+ case VT_I2:
+ case VT_BOOL:
+ V_I2(pvar) = va_arg(args, short);
+ break;
+ case VT_I4:
+ case VT_ERROR:
+ V_I4(pvar) = va_arg(args, long);
+ break;
+ case VT_CY:
+ V_CY(pvar) = va_arg(args, CY);
+ break;
+ case VT_R4: // in C++, floats are passed as floats (I think...)
+ V_R4(pvar) = va_arg(args, float);
+ break;
+ case VT_R8:
+ case VT_DATE:
+ V_R8(pvar) = va_arg(args, double);
+ break;
+ case VT_VARIANT:
+ *pvar = va_arg(args, VARIANT);
+ break;
+ case VT_BSTR:
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+LPointer:;
+ V_BYREF(pvar) = va_arg(args, void FAR*);
+ break;
+ default:
+ if(prgvt[i] & (VT_BYREF|VT_ARRAY))
+ goto LPointer;
+ // FALLTHROUGH
+ case VT_NULL: // cant show up as arg type
+ case VT_EMPTY: // cant show up as arg type
+ ASSERT(UNREACHED);
+ hresult = RESULT(E_FAIL);
+ goto Error;
+ }
+ }
+
+ // Write the server function's calling convention (always marshal as long)
+ ccTemp = (long)pfdesc->callconv;
+ IfFailGo(PUT(pstm, ccTemp), Error);
+
+ // Write the argument count
+ IfFailGo(PUT(pstm, cArgs), Error);
+
+ // Marshal the array of argument types
+ if(cArgs > 0){
+ IfFailGo(pstm->Write(prgvt, cArgs*sizeof(VARTYPE), NULL), Error);
+
+ // Marshal the array of arguments
+ for(i = 0; i < cArgs; ++i)
+ IfFailGo(VariantWrite(pstm, &prgvar[i], pprox->m_syskindStub), Error);
+ }
+
+ INVOKE_CALL(pprox->m_plrpc, pstm, Error);
+
+ IfFailGo(DispUnmarshalHresult(pstm, &hresultRet), Error);
+
+ // Unmarshal the out params
+ for(i = 0; i < cArgs; ++i){
+ if(prgvt[i] & VT_BYREF)
+ IfFailGo(VariantReadType(pstm, &prgvar[i], pprox->m_syskindStub), Error);
+ }
+
+ // Unmarshal the Rich Error state (if any)
+ IfFailGo(UnmarshalErrorInfo(pstm, pprox->m_syskindStub), Error);
+
+ hresult = hresultRet;
+
+Error:;
+ if(prgvt != NULL && prgvt != rgvt)
+ delete prgvt;
+ if(prgvar != NULL){
+ VARIANTX FAR* pvarxEnd = (VARIANTX FAR*)&prgvar[cArgs];
+ for(pvarx = (VARIANTX FAR*)prgvar; pvarx < pvarxEnd; ++pvarx){
+ if((V_VT(pvarx) & ~VT_BYREF) == VT_INTERFACE){
+ if(pvarx->piid != NULL)
+ delete pvarx->piid;
+ }
+ }
+ if(prgvar != rgvar)
+ delete prgvar;
+ }
+ if(pstm != NULL)
+ pstm->Release();
+ return hresult;
+}
+
+//---------------------------------------------------------------------
+// Implementation of the Universal Marshaler Stub class
+//---------------------------------------------------------------------
+
+
+CStubUniv::CStubUniv()
+{
+ m_cRefs = 0;
+ m_pstm = NULL;
+ m_punk = NULL;
+ m_fIsDual = FALSE;
+ m_syskindProxy = (SYSKIND)-1; // something invalid
+ m_iid = IID_NULL;
+ m_punkCustom = NULL;
+}
+
+CStubUniv::~CStubUniv()
+{
+ Disconnect();
+}
+
+HRESULT
+CStubUniv::Create(IUnknown FAR* punkServer,
+ REFIID riid,
+ ISTUB FAR* FAR* ppstub)
+{
+ CStubUniv FAR* pstub;
+
+ if((pstub = new FAR CStubUniv()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ pstub->AddRef();
+ pstub->m_iid = riid;
+ if (punkServer)
+ pstub->Connect(punkServer);
+ *ppstub = pstub;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CStubUniv::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ }else if(IsEqualIID(riid, IID_ISTUB)){
+ *ppv = this;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ ++m_cRefs;
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubUniv::AddRef()
+{
+ return ++m_cRefs;
+}
+
+STDMETHODIMP_(unsigned long)
+CStubUniv::Release()
+{
+ if(--m_cRefs == 0){
+ delete this;
+ return 0;
+ }
+ return m_cRefs;
+}
+
+//---------------------------------------------------------------------
+// Universal Stub class' IRpcStub implementation
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CStubUniv::Connect(IUnknown FAR* punkObj)
+{
+#if (defined(WIN32) || defined(WOW))
+ ASSERT(m_punk == NULL && m_punkCustom == NULL);
+ IfFailRet(punkObj->QueryInterface(m_iid, (void FAR* FAR*)&m_punkCustom));
+ punkObj->AddRef();
+ m_punk = punkObj;
+ return NOERROR;
+#else
+ if(m_punk)
+ return RESULT(E_FAIL); // call Disconnect first
+
+ if (punkObj) {
+ punkObj->AddRef();
+ m_punk = punkObj;
+ }
+ return NOERROR;
+#endif
+}
+
+STDMETHODIMP_(void)
+CStubUniv::Disconnect()
+{
+ if(m_punk){
+ m_punk->Release();
+ m_punk = NULL;
+ }
+ if(m_punkCustom){
+ m_punkCustom->Release();
+ m_punkCustom = NULL;
+ }
+}
+
+/***
+*PUBLIC HRESULT CStubUniv::Invoke
+*
+*Purpose:
+* Dispatch the method with the given index (imeth) on the given
+* interface, using the arguments serialized in the given stream.
+*
+* This function is the callee side of an LRPC call.
+*
+*Entry:
+* iid = the IID of the interface on which we are to make the call
+* imeth = the method index
+* pstm = the IStream containing the method's actuals
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CStubUniv::Invoke(
+#if (OE_WIN32 || defined(WOW))
+ RPCOLEMESSAGE *pmessage,
+ ICHANNEL *pchannel)
+#else
+ REFIID riid,
+ int iMethod,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx)
+#endif
+{
+ int iMeth;
+ HRESULT hresult;
+
+#if (OE_WIN32 || defined(WOW))
+ IStream FAR* pstm;
+
+ OPEN_STUB_STREAM(pstm, pchannel, pmessage, m_iid);
+
+ iMeth = pmessage->iMethod;
+#else
+ UNUSED(dwDestCtx);
+ UNUSED(pvDestCtx);
+
+ iMeth = iMethod;
+ ASSERT(riid == m_iid);
+#endif
+
+ if(m_punk == NULL)
+ return RESULT(E_FAIL);
+
+ m_pstm = pstm;
+
+ if(m_punkCustom == NULL)
+ IfFailRet(m_punk->QueryInterface(m_iid, (void FAR* FAR*)&m_punkCustom));
+
+ switch(iMeth){
+ case IMETH_UNIVERSAL_GetTypeInfoCount:
+ if(!m_fIsDual)
+ goto LMethod;
+ hresult = StubGetTypeInfoCount((IDispatch FAR*)m_punkCustom, pstm);
+ break;
+
+ case IMETH_UNIVERSAL_GetTypeInfo:
+ if(!m_fIsDual)
+ goto LMethod;
+ hresult = StubGetTypeInfo((IDispatch FAR*)m_punkCustom, pstm);
+ break;
+
+ case IMETH_UNIVERSAL_GetIDsOfNames:
+ if(!m_fIsDual)
+ goto LMethod;
+ hresult = StubGetIDsOfNames((IDispatch FAR*)m_punkCustom, pstm);
+ break;
+
+ case IMETH_UNIVERSAL_Invoke:
+ if(!m_fIsDual)
+ goto LMethod;
+ hresult = StubInvoke((IDispatch FAR*)m_punkCustom, pstm);
+ break;
+
+ case IMETH_UNIVERSAL_PSInit:
+ hresult = PSInit();
+ break;
+
+ default:
+ if(iMeth <= IMETH_UNIVERSAL_Release || iMeth >= g_cfnDisp){
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+LMethod:;
+ hresult = DispatchMethod(iMeth);
+ break;
+ }
+
+ RESET_STREAM(pstm);
+ DELETE_STREAM(pstm);
+ m_pstm = NULL;
+ return hresult;
+}
+
+
+/***
+*PUBLIC HRESULT CStubUniv::IsIIDSupported(REFIID)
+*Purpose:
+* Answer if the given IID is supported by this stub.
+*
+*Entry:
+* iid = the IID to query for support
+*
+*Exit:
+* return value = BOOL. TRUE if IID is supported, FALSE otherwise.
+*
+***********************************************************************/
+#if (OE_WIN32 || defined(WOW))
+STDMETHODIMP_(IRpcStubBuffer *)
+#else
+STDMETHODIMP_(OLEBOOL)
+#endif
+CStubUniv::IsIIDSupported(REFIID riid)
+{
+#if (OE_WIN32 || defined(WOW))
+ IRpcStubBuffer *prpcsbuf = 0;
+ if (IsEqualIID(riid, m_iid)){
+ AddRef();
+ prpcsbuf = (IRpcStubBuffer*)this;
+ }
+ return prpcsbuf;
+#else
+ // REVIEW: I don't understand this, but thats the way Ole does it...
+ if(m_punk == NULL)
+ return FALSE;
+ return(IsEqualIID(riid, m_iid));
+#endif
+}
+
+/***
+*unsigned long CStubUniv::CountRefs
+*Purpose:
+* Return the count of references held by this stub.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long, the count of refs.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CStubUniv::CountRefs()
+{
+ unsigned long refs;
+
+ refs = 0;
+ if(m_punk != NULL)
+ ++refs;
+ if(m_punkCustom != NULL)
+ ++refs;
+ return refs;
+}
+
+#if (OE_WIN32 || defined(WOW))
+
+STDMETHODIMP
+CStubUniv::DebugServerQueryInterface(void FAR* FAR* ppv)
+{
+ *ppv = m_punkCustom;
+ return S_OK;
+}
+
+
+STDMETHODIMP_(void)
+CStubUniv::DebugServerRelease(void FAR* ppv)
+{ }
+
+#endif
+
+
+/***
+*HRESULT CStubUniv::PSInit
+*Purpose:
+* Exchange info between proxy and stub at connect time.
+*
+* Marshaled out:
+* ULONG syskindProxy
+* ULONG fIsDual
+* IID m_iid
+*
+* Marshaled in:
+* ULONG syskindStub
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CStubUniv::PSInit()
+{
+ HRESULT hresult;
+ unsigned long fIsDual;
+ unsigned long syskindStub;
+ unsigned long syskindProxy;
+
+ IfFailGo(GET(m_pstm, syskindProxy), Error);
+ m_syskindProxy = (SYSKIND)syskindProxy;
+
+ IfFailGo(GET(m_pstm, fIsDual), Error);
+ m_fIsDual = (BOOL)fIsDual;
+
+ IfFailGo(GET(m_pstm, m_iid), Error);
+
+ REWIND_STREAM(m_pstm);
+
+ syskindStub = SYS_CURRENT;
+ IfFailGo(PUT(m_pstm, syskindStub), Error);
+
+ hresult = NOERROR;
+
+Error:;
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT CStubUniv::DispatchMethod
+*Purpose:
+* Dispatch a vtable method based on the contents of the current stream.
+*
+* Marshaled In:
+* long cArgs
+* VARTYPE[] rgVt = array of argument types
+* VARIANT[] rgArgs = array of argument values
+*
+* Marhsaled Out:
+* hresult hresultRet = return value
+* VARIANT[] rgArgsOut = out params
+* Rich Error State (if any)
+*
+*
+*Entry:
+* iMeth = the index of the method to invoke.
+*
+*Exit:
+* return value =
+*
+***********************************************************************/
+HRESULT
+CStubUniv::DispatchMethod(int iMeth)
+{
+ int i;
+ long cArgs;
+ long cc; // really a CALLCONV, but don't marshal ints!
+ HRESULT hresult, hresultRet;
+ VARTYPE rgvt[16], FAR* prgvt;
+ VARIANT rgvar[16], FAR* prgvar;
+ VARIANT rgvarRef[16], FAR* prgvarRef;
+ VARIANT FAR* rgpvar[16], FAR* FAR* prgpvar;
+ VARIANT varRet;
+
+ // NOTE: do not go to "Error" until prgvt, prgvar, prgvarRef, and prgpvar
+ // are all initialized.
+
+ IfFailRet(GET(m_pstm, cc));
+ IfFailRet(GET(m_pstm, cArgs));
+
+ if(cArgs == 0){
+ prgvt = NULL;
+ prgvar = NULL;
+ prgvarRef = NULL;
+ prgpvar = NULL;
+ }else if(cArgs < DIM(rgvar)){
+ prgvt = rgvt;
+ prgvar = rgvar;
+ memset(prgvar, 0, (int)cArgs * sizeof(VARIANT));
+ prgvarRef = rgvarRef;
+ memset(prgvarRef, 0, (int)cArgs * sizeof(VARIANT));
+ prgpvar = rgpvar;
+ }else{
+
+ // init in case of error
+ prgvt = NULL;
+ prgvar = NULL;
+ prgvarRef = NULL;
+ prgpvar = NULL;
+
+ if((prgvt = new FAR VARTYPE[cArgs]) == NULL)
+ goto ErrorOOM;
+ if((prgvar = new FAR VARIANT[cArgs]) == NULL)
+ goto ErrorOOM;
+ memset(prgvar, 0, (int)cArgs * sizeof(VARIANT));
+ if((prgvarRef = new FAR VARIANT[cArgs]) == NULL)
+ goto ErrorOOM;
+ memset(prgvarRef, 0, (int)cArgs * sizeof(VARIANT));
+ if((prgpvar = new FAR VARIANT FAR*[cArgs]) == NULL)
+ goto ErrorOOM;
+ }
+
+ if(cArgs > 0){
+ IfFailGo(m_pstm->Read(prgvt, cArgs * sizeof(VARTYPE), NULL), Error);
+ for(i = 0; i < cArgs; ++i){
+ IfFailGo(VariantRead(m_pstm,
+ &prgvar[i],
+ &rgvarRef[i],
+ m_syskindProxy),
+ Error);
+ prgpvar[i] = &prgvar[i];
+ }
+ }
+
+ hresult = DoInvokeMethod(m_punkCustom,
+ iMeth * sizeof(void FAR*),
+ (CALLCONV)cc,
+ VT_ERROR,
+ (unsigned int)cArgs,
+ prgvt,
+ prgpvar,
+ &varRet);
+
+ if(HRESULT_FAILED(hresult)){
+ hresultRet = hresult;
+ }else{
+ ASSERT(V_VT(&varRet) = VT_ERROR);
+ hresultRet = (HRESULT)V_ERROR(&varRet);
+ }
+
+ REWIND_STREAM(m_pstm);
+
+ IfFailGo(DispMarshalHresult(m_pstm, hresultRet), Error);
+
+ // Marshal back the Out params
+ for(i = 0; i < cArgs; ++i){
+ if(prgvt[i] & VT_BYREF)
+ IfFailGo(VariantWrite(m_pstm, &prgvar[i], m_syskindProxy), Error);
+ }
+
+ // Marshal the Rich Error state (if any)
+ IfFailGo(MarshalErrorInfo(m_pstm, m_syskindProxy), Error);
+
+ hresult = NOERROR;
+
+Error:;
+
+ VARIANT FAR* pvar, FAR* pvarEnd;
+
+ if(prgpvar != NULL && prgpvar != rgpvar)
+ delete prgpvar;
+
+ if(prgvarRef != NULL){
+ pvarEnd = &prgvarRef[cArgs];
+ for(pvar = prgvarRef; pvar < pvarEnd; ++pvar)
+ if(V_VT(pvar) != VT_EMPTY)
+ VariantClear(pvar);
+ if(prgvarRef != rgvarRef)
+ delete prgvarRef;
+ }
+ if(prgvar != NULL){
+ pvarEnd = &prgvar[cArgs];
+ for(pvar = prgvar; pvar < pvarEnd; ++pvar)
+ VariantClear(pvar);
+ if(prgvar != rgvar)
+ delete prgvar;
+ }
+ if(prgvt != NULL && prgvt != rgvt)
+ delete prgvt;
+ return hresult;
+
+ErrorOOM:
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto Error;
+}
+
+
+//---------------------------------------------------------------------
+// Utilities
+//---------------------------------------------------------------------
+
+HRESULT
+VarVtOfIface(ITypeInfo FAR* ptinfo,
+ TYPEATTR FAR* ptattr,
+ VARTYPE FAR* pvt,
+ GUID FAR* pguid)
+{
+ HRESULT hresult;
+
+ switch(ptattr->typekind){
+ case TKIND_DISPATCH:
+ if ((ptattr->wTypeFlags & TYPEFLAG_FDUAL) == 0) {
+ // regular (non-dual) dispinterface is just VT_DISPATCH.
+ *pvt = VT_DISPATCH;
+ // don't have to set up *pguid, since not VT_INTERFACE
+ break;
+ }
+ // The interface typeinfo version of a dual interface has the same
+ // same guid as the dispinterface portion does, hence we can just use
+ // the dispinterface guid here.
+ /* FALLTHROUGH */
+
+ case TKIND_INTERFACE:
+ *pvt = VT_INTERFACE;
+ *pguid = ptattr->guid;
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ hresult = RESULT(DISP_E_BADVARTYPE);
+ goto Error;
+ }
+
+ hresult = NOERROR;
+
+Error:;
+ return hresult;
+}
+
+HRESULT
+VarVtOfUDT(ITypeInfo FAR* ptinfo,
+ TYPEDESC FAR* ptdesc,
+ VARTYPE FAR* pvt,
+ GUID FAR* pguid)
+{
+ HRESULT hresult;
+ TYPEATTR FAR* ptattrRef;
+ ITypeInfo FAR* ptinfoRef;
+
+ ASSERT(ptdesc->vt == VT_USERDEFINED);
+
+ ptinfoRef = NULL;
+ ptattrRef = NULL;
+
+ IfFailGo(ptinfo->GetRefTypeInfo(ptdesc->hreftype, &ptinfoRef), Error);
+ IfFailGo(ptinfoRef->GetTypeAttr(&ptattrRef), Error);
+
+ switch (ptattrRef->typekind) {
+ case TKIND_ENUM:
+#if HP_16BIT
+ *pvt = VT_I2;
+#else
+ *pvt = VT_I4;
+#endif
+ hresult = NOERROR;
+ break;
+
+ case TKIND_ALIAS:
+ hresult = VarVtOfTypeDesc(ptinfoRef,
+ &ptattrRef->tdescAlias,
+ pvt,
+ pguid);
+ break;
+
+ case TKIND_DISPATCH:
+ case TKIND_INTERFACE:
+ hresult = VarVtOfIface(ptinfoRef, ptattrRef, pvt, pguid);
+ break;
+
+ case TKIND_COCLASS:
+ { TYPEATTR FAR* ptattrPri;
+ ITypeInfo FAR* ptinfoPri;
+
+ if((hresult = GetPrimaryInterface(ptinfoRef, &ptinfoPri)) == NOERROR){
+ if((hresult = ptinfoPri->GetTypeAttr(&ptattrPri)) == NOERROR){
+ hresult = VarVtOfIface(ptinfoPri, ptattrPri, pvt, pguid);
+ ptinfoPri->ReleaseTypeAttr(ptattrPri);
+ }
+ ptinfoPri->Release();
+ }
+ }
+ break;
+
+ default:
+ IfFailGo(RESULT(DISP_E_BADVARTYPE), Error);
+ break;
+ }
+
+Error:;
+ if(ptinfoRef != NULL){
+ if(ptattrRef != NULL)
+ ptinfoRef->ReleaseTypeAttr(ptattrRef);
+ ptinfoRef->Release();
+ }
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT VarVtOfTypeDesc
+*Purpose:
+* Convert the given typeinfo TYPEDESC into a VARTYPE that can be
+* represented in a VARIANT. For some this is a 1:1 mapping, for
+* others we convert to a (possibly machine dependent, eg VT_INT->VT_I2)
+* base type, and others we cant represent in a VARIANT.
+*
+*Entry:
+* ptinfo =
+* ptdesc = * to the typedesc to convert
+* pvt =
+* pguid =
+*
+*Exit:
+* return value = HRESULT
+*
+* *pvt = a VARTYPE that may be stored in a VARIANT.
+* *pguid = a guid for a custom interface.
+*
+*
+* Following is a summary of how types are represented in typeinfo.
+* Note the difference between the apparent levels of indirection
+* between IDispatch* / DispFoo*, and DualFoo*.
+*
+* I2 => VT_I2
+* I2* => VT_PTR - VT_I2
+*
+* IDispatch * => VT_DISPATCH
+* IDispatch ** => VT_PTR - VT_DISPATCH
+* DispFoo * => VT_DISPATCH
+* DispFoo ** => VT_PTR - VT_DISPATCH
+* DualFoo * => VT_PTR - VT_INTERFACE (DispIID)
+* DualFoo ** => VT_PTR - VT_PTR - VT_INTERFACE (DispIID)
+* IFoo * => VT_PTR - VT_INTERFACE (IID)
+* IFoo ** => VT_PTR - VT_PTR - VT_INTERFACE (IID)
+*
+***********************************************************************/
+HRESULT
+VarVtOfTypeDesc(ITypeInfo FAR* ptinfo,
+ TYPEDESC FAR* ptdesc,
+ VARTYPE FAR* pvt,
+ GUID FAR* pguid)
+{
+ VARTYPE vt;
+ HRESULT hresult;
+
+ if(ptdesc->vt < VT_VMAX || ptdesc->vt == VT_UI1){
+ // all types from VT_EMPTY (0) up to & including VT_UNKNOWN
+ *pvt = ptdesc->vt; // are dispatchable
+ return NOERROR;
+ }
+
+ hresult = NOERROR;
+
+ switch (ptdesc->vt) {
+ case VT_INT:
+#if OE_WIN16
+ *pvt = VT_I2;
+#else
+ *pvt = VT_I4;
+#endif
+ break;
+
+ // REVIEW: do we need to do hresult-mapping for 16/32 interop here?
+ case VT_HRESULT:
+ *pvt = VT_ERROR;
+ break;
+
+ case VT_VOID:
+ *pvt = VT_EMPTY;
+ break;
+
+ case VT_USERDEFINED:
+ hresult = VarVtOfUDT(ptinfo, ptdesc, pvt, pguid);
+ break;
+
+ case VT_PTR:
+ // Special case: only an interface may have 2 levels of VT_PTR, or
+ // a dispinterface** (which is represented by VT_PTR-VT_PTR-VT_USERDEFINED-TKIND_DISPATCH
+ if(ptdesc->lptdesc->vt == VT_PTR && ptdesc->lptdesc->lptdesc->vt == VT_USERDEFINED){
+ hresult = VarVtOfUDT(ptinfo, ptdesc->lptdesc->lptdesc, &vt, pguid);
+ if(hresult == NOERROR){
+ if (vt == VT_INTERFACE)
+ *pvt = (VT_BYREF | VT_INTERFACE);
+ else if (vt == VT_DISPATCH)
+ *pvt = (VT_BYREF | VT_DISPATCH);
+ else
+ hresult = RESULT(DISP_E_BADVARTYPE);
+ break;
+ }
+ }
+
+ // Special case: VT_PTR-VT_USERDEFINED-TKIND_DISPATCH is VT_DISPATCH is
+ // a dispinterface* (VT_DISPATCH)
+ if (ptdesc->lptdesc->vt == VT_USERDEFINED) {
+ hresult = VarVtOfUDT(ptinfo, ptdesc->lptdesc, &vt, pguid);
+ if (hresult == NOERROR && vt == VT_DISPATCH) {
+ *pvt = VT_DISPATCH;
+ break;
+ }
+ }
+
+ hresult = VarVtOfTypeDesc(ptinfo, ptdesc->lptdesc, &vt, pguid);
+ if(hresult == NOERROR){
+ if(vt & VT_BYREF){
+ // ByRef can only be applied once
+ hresult = RESULT(DISP_E_BADVARTYPE);
+ break;
+ }
+ // Note: a VT_PTR->VT_INTERFACE gets folded into just a
+ // VT_INTERFACE in a variant
+ *pvt = (vt == VT_INTERFACE) ? VT_INTERFACE : (vt | VT_BYREF);
+ }
+ break;
+
+ case VT_SAFEARRAY:
+ hresult = VarVtOfTypeDesc(ptinfo, ptdesc->lptdesc, &vt, pguid);
+ if(hresult == NOERROR){
+ if(vt & (VT_BYREF | VT_ARRAY)){
+ // error if nested array or array of pointers
+ hresult = RESULT(DISP_E_BADVARTYPE);
+ break;
+ }
+ *pvt = (vt | VT_ARRAY);
+ }
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ hresult = RESULT(DISP_E_BADVARTYPE);
+ break;
+ }
+
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT SzLibIdOfIID
+*Purpose:
+* Return the string for of the LibId registered typelib that contains
+* the definition of the interface with the given IID.
+*
+*Entry:
+* riid = the IID to find the LibId of.
+* cbLibId = size of the passed in LibId buffer
+*
+*Exit:
+* return value = HRESULT
+*
+* rgchLibId = string form of the typelib's LibId.
+*
+***********************************************************************/
+HRESULT
+SzLibIdOfIID(REFIID riid, char FAR* rgchLibId, long cbLibId)
+{
+ char szKey[10+CCH_SZGUID0+8+1];
+
+ strcpy(szKey, "Interface\\");
+ StringFromGUID2A(riid, &szKey[10], CCH_SZGUID0);
+ strcat(szKey, "\\TypeLib");
+
+ if(RegQueryValueA(HKEY_CLASSES_ROOT,
+ szKey, rgchLibId, &cbLibId) != ERROR_SUCCESS)
+ return RESULT(TYPE_E_LIBNOTREGISTERED);
+ return NOERROR;
+}
+
+// Is the given string a valid stringized LCID?
+BOOL
+FIsLCID(char FAR* szLcid)
+{
+ int len;
+ LCID lcid;
+ char rgch[32];
+ char FAR* pchEnd;
+
+ len = strlen(szLcid);
+ lcid = (LCID)strtoul(szLcid, &pchEnd, 16);
+ // if converting to LCID consumed all characters..
+ if(pchEnd == &szLcid[len]){
+ // and its a number the system claims to know about...
+ if(GetLocaleInfoA(lcid,
+ LOCALE_NOUSEROVERRIDE | LOCALE_ILANGUAGE,
+ rgch, DIM(rgch)) > 0)
+ {
+ // then assume its a valid stringized LCID
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/***
+*PRIVATE HRESULT GetTypeInfoOfIID
+*Purpose:
+* Return the typeinfo that describes the interface named by the
+* given IID.
+*
+*Entry:
+* riid = the IID of the interface for which were loading the typeinfo
+*
+*Exit:
+* return value = HRESULT
+*
+* *ptinfo = type typeinfo of the interface named by riid, if successful.
+*
+***********************************************************************/
+HRESULT
+GetTypeInfoOfIID(REFIID riid, ITypeInfo FAR* FAR* pptinfo)
+{
+#define CCH_SZTYPELIB0 (7+1) // Typelib\0
+#define CCH_SZVERS0 (5+1+5+1) // wMaj.wMin\0
+#define CCH_SZLANG0 (4+1) // 0409\0
+#define CCH_SZPLATFORM0 (5+1) // win16\0
+#define CCH_SZKEY0 \
+ CCH_SZTYPELIB0+CCH_SZGUID0+CCH_SZVERS0+CCH_SZLANG0+CCH_SZPLATFORM0
+
+ int i;
+ long cb;
+ HRESULT hresult;
+ char FAR* pchEnd;
+ char szKey[CCH_SZKEY0+1];
+ char rgchVer[CCH_SZVERS0+1]; // wMaj.wMin\0
+ char rgchBest[CCH_SZVERS0+1];
+ ITypeLib FAR* ptlib;
+ ITypeInfo FAR* ptinfo;
+ WORD wMajBest, wMinBest, wMaj, wMin;
+ HKEY hkRoot, hkGuid, hkVers, hkLang, hkPlatform;
+ OLECHAR FAR* pszTypeLib;
+ char rgchTypeLib[256];
+#if OE_WIN32
+ WCHAR rgwchTypeLib[256];
+#endif
+
+ ptlib = NULL;
+ hkRoot = HKEY_CLASSES_ROOT;
+ hkGuid = HKEY_CLASSES_ROOT;
+ hkVers = HKEY_CLASSES_ROOT;
+ hkLang = HKEY_CLASSES_ROOT;
+ hkPlatform = HKEY_CLASSES_ROOT;
+
+ // Hold open the root key for efficiency
+ if(RegOpenKeyA(HKEY_CLASSES_ROOT, NULL, &hkRoot) != ERROR_SUCCESS)
+ return RESULT(REGDB_E_READREGDB);
+
+ // Find the LibId of TypeLib containing the definition of the given IID
+ strcpy(szKey, "TypeLib\\");
+ IfFailRet(SzLibIdOfIID(riid, &szKey[8], CCH_SZGUID0+1));
+
+ if(RegOpenKeyA(HKEY_CLASSES_ROOT, szKey, &hkGuid) != ERROR_SUCCESS)
+ return RESULT(TYPE_E_LIBNOTREGISTERED);
+
+ // Find the highest version number for the registered type lib
+ rgchBest[0] = '\0';
+ wMajBest = wMinBest = 0;
+ for(i = 0;
+ RegEnumKeyA(hkGuid, i, rgchVer, DIM(rgchVer)) == ERROR_SUCCESS;
+ ++i)
+ {
+ wMaj = (WORD)strtoul(rgchVer, &pchEnd, 16);
+ // ignore the version if its format isnt #.#
+ if(*pchEnd != '.')
+ continue;
+ wMin = (WORD)strtoul(pchEnd+1, NULL, 16);
+ if(wMaj > wMajBest || (wMaj == wMajBest && wMin > wMinBest)){
+ wMajBest = wMaj;
+ wMinBest = wMin;
+ strcpy(rgchBest, rgchVer);
+ }
+ }
+
+ // Open the key for the highest version number
+ if(RegOpenKeyA(hkGuid, rgchBest, &hkVers) != ERROR_SUCCESS)
+ goto ErrorNotReg;
+
+ // Grab the fist language subkey under the version
+ // Need to possibly skip over FLAGS and HELPDIR subkeys
+ for(i=0;; ++i){
+ if(RegEnumKeyA(hkVers, i, szKey, 16) != ERROR_SUCCESS)
+ goto ErrorNotReg;
+ if(FIsLCID(szKey))
+ break;
+ }
+ if(RegOpenKeyA(hkVers, szKey, &hkLang) != ERROR_SUCCESS)
+ goto ErrorNotReg;
+
+ // Grab the first platform subkey under the language
+ // we can do this because none of the info we use to construct the
+ // proxy is platform-specific. For example, we ignore calling
+ // convention on the proxy side of things. It's irrelevent.
+ if(RegEnumKeyA(hkLang, 0, szKey, CCH_SZPLATFORM0) != ERROR_SUCCESS)
+ goto ErrorNotReg;
+ if(RegOpenKeyA(hkLang, szKey, &hkPlatform) != ERROR_SUCCESS)
+ goto ErrorNotReg;
+
+ cb = DIM(rgchTypeLib);
+ if(RegQueryValueA(hkPlatform, NULL, rgchTypeLib, &cb) != ERROR_SUCCESS)
+ goto ErrorNotReg;
+
+#if OE_WIN32
+ cb = DIM(rgchTypeLib);
+ MultiByteToWideChar(CP_ACP,
+ MB_PRECOMPOSED,
+ rgchTypeLib,
+ cb,
+ rgwchTypeLib,
+ cb);
+ pszTypeLib = rgwchTypeLib;
+#else
+ pszTypeLib = rgchTypeLib;
+#endif
+
+ // Load the typelib we worked so hard to find
+ IfFailGo(DoLoadTypeLib(pszTypeLib, &ptlib), Error);
+
+ // Extract the typeinfo that describes the interface
+ IfFailGo(ptlib->GetTypeInfoOfGuid(riid, &ptinfo), Error);
+
+ *pptinfo = ptinfo;
+ hresult = NOERROR;
+ // FALLTHROUGH...
+
+Error:;
+ if(ptlib != NULL)
+ ptlib->Release();
+ if(hkPlatform != HKEY_CLASSES_ROOT)
+ RegCloseKey(hkPlatform);
+ if(hkLang != HKEY_CLASSES_ROOT)
+ RegCloseKey(hkLang);
+ if(hkVers != HKEY_CLASSES_ROOT)
+ RegCloseKey(hkVers);
+ if(hkGuid != HKEY_CLASSES_ROOT)
+ RegCloseKey(hkGuid);
+ RegCloseKey(hkRoot);
+ return hresult;
+
+ErrorNotReg:;
+ hresult = RESULT(TYPE_E_LIBNOTREGISTERED);
+ goto Error;
+}
+
+
+#if defined(_X86_)
+/***
+*int GetCbStackCleanupOfFuncDesc
+*Purpose:
+* For _stdcall on x86 Win32, the Universal Method must clean up its parameters.
+* This function computes the number of bytes of stack which must be
+* cleaned up.
+*
+*
+*Entry:
+* pfdesc = FUNCDESC describing the function and its parameter types
+* ptinfo = ITypeInfo describing the object interface
+*
+*Exit:
+* return value = HRESULT
+*
+* *pcbStackCleanup = number of bytes of stack to clean up, if successful
+*
+***********************************************************************/
+HRESULT
+GetCbStackCleanupOfFuncDesc(FUNCDESC FAR* pfdesc,
+ ITypeInfo FAR* ptinfo,
+ int FAR* pcbStackCleanup)
+{
+ int i;
+ TYPEDESC FAR* ptdesc;
+ VARIANT var, FAR* pvar;
+ VARTYPE vt;
+ HRESULT hresult;
+ GUID guid;
+
+ // We have to ignore the calling convention in the typelib, and assume
+ // that the proxy is being called with the STDCALL calling convention.
+ // The typelib is from the server, so the calling convention in the
+ // typelib is only useful on the stub side of things.
+
+ pvar = &var;
+
+ *pcbStackCleanup = 4; // account for the 'this' pointer
+ // since we know we are returning a hresult (or void?) then we know
+ // there's not a hidden parm for a structure return.
+
+ for(i = 0; i < pfdesc->cParams; ++i){
+
+ ptdesc = &pfdesc->lprgelemdescParam[i].tdesc;
+ IfFailGo(VarVtOfTypeDesc(ptinfo,
+ ptdesc,
+ &V_VT(pvar),
+ &guid), Error);
+
+ vt = V_VT(pvar);
+ switch(vt){
+ case VT_CY:
+ case VT_R8:
+ case VT_DATE:
+ *pcbStackCleanup+=8;
+ break;
+ case VT_VARIANT:
+ *pcbStackCleanup+=sizeof(VARIANT);
+ break;
+ case VT_NULL: // cant show up as arg type
+ case VT_EMPTY: // cant show up as arg type
+ ASSERT(UNREACHED);
+ hresult = RESULT(E_FAIL);
+ goto Error;
+ default:
+ *pcbStackCleanup+=4;
+ break;
+ } // switch(vt)
+ } // for()
+
+ hresult = NOERROR;
+
+Error:
+ return hresult;
+}
+#endif //defined(_X86_)
diff --git a/private/oleauto/src/dispatch/ups.h b/private/oleauto/src/dispatch/ups.h
new file mode 100644
index 000000000..8069d2ae7
--- /dev/null
+++ b/private/oleauto/src/dispatch/ups.h
@@ -0,0 +1,170 @@
+/***
+*ups.h - The Universal Proxy/Stub class definitions
+*
+* Copyright (C) 1992-94, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the TypeInfo-driven, Universal Proxy Stub classes
+*
+* CProxUniv -- The Universal Proxy class
+* CStubUniv -- The Universal Stub class
+*
+*Revision History:
+*
+* [00] 21-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+// forward declarations
+class FAR CProxUniv;
+class FAR CStubUniv;
+
+// METHINFO
+//
+// Data stored for each method
+//
+typedef struct {
+ FUNCDESC *pfdesc; // funcdesc corresponding to this vtable entry
+ ITypeInfo *ptinfo;
+#if defined(_X86_)
+ int cbStackCleanup; // #bytes of args to clean up for _stdcall
+#endif //defined(_X86_)
+} METHINFO;
+
+
+#if defined(_X86_)
+HRESULT GetCbStackCleanupOfFuncDesc(FUNCDESC FAR* pfdesc,
+ ITypeInfo FAR* ptinfo,
+ int FAR* pcbStackCleanup);
+#endif //defined(_X86_)
+extern "C" STDAPI_(HRESULT) ProxyMethod(CProxUniv *pprox,
+ int iMeth,
+ va_list args
+#if defined(_X86_)
+ , int *pcbStackCleanup
+#endif //defined(_X86_)
+ );
+
+// CProxUniv - 'prox'
+//
+// The Universal proxy class
+//
+class FAR CProxUniv
+{
+ void *m_pvtbl;
+
+public:
+
+static HRESULT Create(IUnknown FAR* punkOuter,
+ REFIID riid,
+ IUnknown FAR* FAR* pprox);
+
+ CProxUniv(IUnknown FAR* punkOuter);
+ ~CProxUniv();
+
+ class FAR CPriv : public IPROXY
+ {
+ public:
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(Connect)(ICHANNEL FAR* plrpc);
+ STDMETHOD_(void, Disconnect)(void);
+
+ inline CProxUniv FAR* PProx();
+ };
+ friend CPriv;
+ CPriv m_priv;
+
+ HRESULT PSInit(void);
+ HRESULT CacheFuncDescs(ITypeInfo *ptinfo);
+
+ unsigned long m_cRefs;
+ ICHANNEL FAR* m_plrpc;
+ IUnknown FAR* m_punkOuter;
+ SYSKIND m_syskindStub;
+
+ BOOL m_fIsDual; // Is this a dual interface?
+ IID m_iid; // the IID for which this instance is a proxy
+ USHORT m_cFuncs; // count of functions on the custom interface
+ METHINFO FAR* m_rgMethInfo;// array parallel to the vtable with data
+ // specific to each method
+};
+
+
+// CStubUniv - 'stub'
+//
+// The Universal stub class.
+//
+class FAR CStubUniv : public ISTUB
+{
+public:
+
+static HRESULT Create(IUnknown FAR* punkServer,
+ REFIID riid,
+ ISTUB FAR* FAR* ppstub);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IRpcStub methods
+ //
+#if (OE_WIN32 || defined(WOW))
+ STDMETHOD(Connect)(IUnknown FAR* pUnk);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg,
+ IRpcChannelBuffer FAR* pRpcChannel);
+ STDMETHOD_(IRpcStubBuffer*, IsIIDSupported)(REFIID riid);
+ STDMETHOD_(ULONG, CountRefs)(void);
+ STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv);
+ STDMETHOD_(void, DebugServerRelease)(void FAR* pv);
+#else
+ STDMETHOD(Connect)(IUnknown FAR* punkObject);
+ STDMETHOD_(void, Disconnect)(void);
+ STDMETHOD(Invoke)(REFIID riid,
+ int imeth,
+ IStream FAR* pstm,
+ unsigned long dwDestCtx,
+ void FAR* pvDestCtx);
+ STDMETHOD_(OLEBOOL, IsIIDSupported)(REFIID riid);
+ STDMETHOD_(unsigned long, CountRefs)(void);
+#endif
+
+ HRESULT PSInit(void);
+ HRESULT DispatchMethod(int iMeth);
+
+private:
+ CStubUniv();
+ ~CStubUniv();
+
+ unsigned long m_cRefs;
+ IUnknown FAR* m_punk;
+ IStream FAR* m_pstm;
+ SYSKIND m_syskindProxy;
+ BOOL m_fIsDual; // Is this a dual interface?
+ IID m_iid; // the IID of the custom interface
+ IUnknown FAR* m_punkCustom;
+};
+
+
+enum IMETH_UNIVERSAL {
+ IMETH_UNIVERSAL_QueryInterface = 0,
+ IMETH_UNIVERSAL_AddRef,
+ IMETH_UNIVERSAL_Release,
+
+ IMETH_UNIVERSAL_GetTypeInfoCount,
+ IMETH_UNIVERSAL_GetTypeInfo,
+ IMETH_UNIVERSAL_GetIDsOfNames,
+ IMETH_UNIVERSAL_Invoke,
+
+ IMETH_UNIVERSAL_PSInit = 32000 // something much larger than the
+ // max possible vtable index
+};
diff --git a/private/oleauto/src/dispatch/uvft.cpp b/private/oleauto/src/dispatch/uvft.cpp
new file mode 100644
index 000000000..8d49bb3de
--- /dev/null
+++ b/private/oleauto/src/dispatch/uvft.cpp
@@ -0,0 +1,396 @@
+/***
+*uvft.cpp
+*
+* Copyright (C) 1992-94, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the Universal Proxy class' Universal
+* Delegator. This is the mondo shared vtable, that delagates
+* all vtable calls to a central marshaling routine. Also known
+* as the Universal Vtable (uvft).
+*
+*Revision History:
+*
+* [00] 22-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#ifndef WIN32
+# include <cobjps.h>
+#endif
+#include "dispmrsh.h"
+#include "ups.h"
+#include "dispps.h"
+#include <stdarg.h>
+
+ASSERTDATA
+
+HRESULT STDMETHODCALLTYPE
+UnivQueryInterface(CProxUniv *pthis, REFIID riid, void FAR* FAR* ppv)
+{
+ return pthis->m_punkOuter->QueryInterface(riid, ppv);
+}
+
+unsigned long STDMETHODCALLTYPE
+UnivAddRef(CProxUniv *pthis)
+{
+ return pthis->m_punkOuter->AddRef();
+}
+
+unsigned long STDMETHODCALLTYPE
+UnivRelease(CProxUniv *pthis)
+{
+ return pthis->m_punkOuter->Release();
+}
+
+HRESULT STDMETHODCALLTYPE
+UnivGetTypeInfoCount(CProxUniv *pprox, unsigned int FAR* pctinfo)
+{
+ return ProxyGetTypeInfoCount(pprox->m_plrpc,
+ pprox->m_syskindStub,
+ pctinfo);
+}
+
+HRESULT STDMETHODCALLTYPE
+UnivGetTypeInfo(CProxUniv *pprox,
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ return ProxyGetTypeInfo(pprox->m_plrpc,
+ pprox->m_syskindStub,
+ itinfo,
+ lcid,
+ pptinfo);
+}
+
+HRESULT STDMETHODCALLTYPE
+UnivGetIDsOfNames(CProxUniv *pprox,
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ return ProxyGetIDsOfNames(pprox->m_plrpc,
+ pprox->m_syskindStub,
+ riid,
+ rgszNames,
+ cNames,
+ lcid,
+ rgdispid);
+}
+
+HRESULT STDMETHODCALLTYPE
+UnivInvoke(CProxUniv *pprox,
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ return ProxyInvoke(pprox->m_plrpc,
+ pprox->m_syskindStub,
+ dispidMember,
+ riid,
+ lcid,
+ wFlags,
+ pdispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+}
+
+
+#if defined(_X86_)
+
+// UM ## X() is native code in win32\i386\invoke.asm
+// WARNING: If the number of MDEFs changes, the WHILE... macro in invoke.asm
+// WARNING: must be changed to match
+#define MDEF(X) extern "C" UM ## X (void);
+
+#else //!defined(_X86_)
+
+#define MDEF(X) \
+ HRESULT CDECLMETHODCALLTYPE \
+ UM ## X (CProxUniv FAR* pprox, ...) { \
+ va_list args; \
+ va_start(args, pprox); \
+ return ProxyMethod(pprox, X, args); \
+ }
+
+#endif //!defined(_X86_)
+
+ MDEF(3) MDEF(4)
+MDEF(5) MDEF(6) MDEF(7) MDEF(8) MDEF(9)
+
+MDEF(10) MDEF(11) MDEF(12) MDEF(13) MDEF(14)
+MDEF(15) MDEF(16) MDEF(17) MDEF(18) MDEF(19)
+MDEF(20) MDEF(21) MDEF(22) MDEF(23) MDEF(24)
+MDEF(25) MDEF(26) MDEF(27) MDEF(28) MDEF(29)
+MDEF(30) MDEF(31) MDEF(32) MDEF(33) MDEF(34)
+MDEF(35) MDEF(36) MDEF(37) MDEF(38) MDEF(39)
+MDEF(40) MDEF(41) MDEF(42) MDEF(43) MDEF(44)
+MDEF(45) MDEF(46) MDEF(47) MDEF(48) MDEF(49)
+MDEF(50) MDEF(51) MDEF(52) MDEF(53) MDEF(54)
+MDEF(55) MDEF(56) MDEF(57) MDEF(58) MDEF(59)
+MDEF(60) MDEF(61) MDEF(62) MDEF(63) MDEF(64)
+MDEF(65) MDEF(66) MDEF(67) MDEF(68) MDEF(69)
+MDEF(70) MDEF(71) MDEF(72) MDEF(73) MDEF(74)
+MDEF(75) MDEF(76) MDEF(77) MDEF(78) MDEF(79)
+MDEF(80) MDEF(81) MDEF(82) MDEF(83) MDEF(84)
+MDEF(85) MDEF(86) MDEF(87) MDEF(88) MDEF(89)
+MDEF(90) MDEF(91) MDEF(92) MDEF(93) MDEF(94)
+MDEF(95) MDEF(96) MDEF(97) MDEF(98) MDEF(99)
+
+MDEF(100) MDEF(101) MDEF(102) MDEF(103) MDEF(104)
+MDEF(105) MDEF(106) MDEF(107) MDEF(108) MDEF(109)
+MDEF(110) MDEF(111) MDEF(112) MDEF(113) MDEF(114)
+MDEF(115) MDEF(116) MDEF(117) MDEF(118) MDEF(119)
+MDEF(120) MDEF(121) MDEF(122) MDEF(123) MDEF(124)
+MDEF(125) MDEF(126) MDEF(127) MDEF(128) MDEF(129)
+MDEF(130) MDEF(131) MDEF(132) MDEF(133) MDEF(134)
+MDEF(135) MDEF(136) MDEF(137) MDEF(138) MDEF(139)
+MDEF(140) MDEF(141) MDEF(142) MDEF(143) MDEF(144)
+MDEF(145) MDEF(146) MDEF(147) MDEF(148) MDEF(149)
+MDEF(150) MDEF(151) MDEF(152) MDEF(153) MDEF(154)
+MDEF(155) MDEF(156) MDEF(157) MDEF(158) MDEF(159)
+MDEF(160) MDEF(161) MDEF(162) MDEF(163) MDEF(164)
+MDEF(165) MDEF(166) MDEF(167) MDEF(168) MDEF(169)
+MDEF(170) MDEF(171) MDEF(172) MDEF(173) MDEF(174)
+MDEF(175) MDEF(176) MDEF(177) MDEF(178) MDEF(179)
+MDEF(180) MDEF(181) MDEF(182) MDEF(183) MDEF(184)
+MDEF(185) MDEF(186) MDEF(187) MDEF(188) MDEF(189)
+MDEF(190) MDEF(191) MDEF(192) MDEF(193) MDEF(194)
+MDEF(195) MDEF(196) MDEF(197) MDEF(198) MDEF(199)
+
+MDEF(200) MDEF(201) MDEF(202) MDEF(203) MDEF(204)
+MDEF(205) MDEF(206) MDEF(207) MDEF(208) MDEF(209)
+MDEF(210) MDEF(211) MDEF(212) MDEF(213) MDEF(214)
+MDEF(215) MDEF(216) MDEF(217) MDEF(218) MDEF(219)
+MDEF(220) MDEF(221) MDEF(222) MDEF(223) MDEF(224)
+MDEF(225) MDEF(226) MDEF(227) MDEF(228) MDEF(229)
+MDEF(230) MDEF(231) MDEF(232) MDEF(233) MDEF(234)
+MDEF(235) MDEF(236) MDEF(237) MDEF(238) MDEF(239)
+MDEF(240) MDEF(241) MDEF(242) MDEF(243) MDEF(244)
+MDEF(245) MDEF(246) MDEF(247) MDEF(248) MDEF(249)
+MDEF(250) MDEF(251) MDEF(252) MDEF(253) MDEF(254)
+MDEF(255) MDEF(256) MDEF(257) MDEF(258) MDEF(259)
+MDEF(260) MDEF(261) MDEF(262) MDEF(263) MDEF(264)
+MDEF(265) MDEF(266) MDEF(267) MDEF(268) MDEF(269)
+MDEF(270) MDEF(271) MDEF(272) MDEF(273) MDEF(274)
+MDEF(275) MDEF(276) MDEF(277) MDEF(278) MDEF(279)
+MDEF(280) MDEF(281) MDEF(282) MDEF(283) MDEF(284)
+MDEF(285) MDEF(286) MDEF(287) MDEF(288) MDEF(289)
+MDEF(290) MDEF(291) MDEF(292) MDEF(293) MDEF(294)
+MDEF(295) MDEF(296) MDEF(297) MDEF(298) MDEF(299)
+
+MDEF(300) MDEF(301) MDEF(302) MDEF(303) MDEF(304)
+MDEF(305) MDEF(306) MDEF(307) MDEF(308) MDEF(309)
+MDEF(310) MDEF(311) MDEF(312) MDEF(313) MDEF(314)
+MDEF(315) MDEF(316) MDEF(317) MDEF(318) MDEF(319)
+MDEF(320) MDEF(321) MDEF(322) MDEF(323) MDEF(324)
+MDEF(325) MDEF(326) MDEF(327) MDEF(328) MDEF(329)
+MDEF(330) MDEF(331) MDEF(332) MDEF(333) MDEF(334)
+MDEF(335) MDEF(336) MDEF(337) MDEF(338) MDEF(339)
+MDEF(340) MDEF(341) MDEF(342) MDEF(343) MDEF(344)
+MDEF(345) MDEF(346) MDEF(347) MDEF(348) MDEF(349)
+MDEF(350) MDEF(351) MDEF(352) MDEF(353) MDEF(354)
+MDEF(355) MDEF(356) MDEF(357) MDEF(358) MDEF(359)
+MDEF(360) MDEF(361) MDEF(362) MDEF(363) MDEF(364)
+MDEF(365) MDEF(366) MDEF(367) MDEF(368) MDEF(369)
+MDEF(370) MDEF(371) MDEF(372) MDEF(373) MDEF(374)
+MDEF(375) MDEF(376) MDEF(377) MDEF(378) MDEF(379)
+MDEF(380) MDEF(381) MDEF(382) MDEF(383) MDEF(384)
+MDEF(385) MDEF(386) MDEF(387) MDEF(388) MDEF(389)
+MDEF(390) MDEF(391) MDEF(392) MDEF(393) MDEF(394)
+MDEF(395) MDEF(396) MDEF(397) MDEF(398) MDEF(399)
+
+MDEF(400) MDEF(401) MDEF(402) MDEF(403) MDEF(404)
+MDEF(405) MDEF(406) MDEF(407) MDEF(408) MDEF(409)
+MDEF(410) MDEF(411) MDEF(412) MDEF(413) MDEF(414)
+MDEF(415) MDEF(416) MDEF(417) MDEF(418) MDEF(419)
+MDEF(420) MDEF(421) MDEF(422) MDEF(423) MDEF(424)
+MDEF(425) MDEF(426) MDEF(427) MDEF(428) MDEF(429)
+MDEF(430) MDEF(431) MDEF(432) MDEF(433) MDEF(434)
+MDEF(435) MDEF(436) MDEF(437) MDEF(438) MDEF(439)
+MDEF(440) MDEF(441) MDEF(442) MDEF(443) MDEF(444)
+MDEF(445) MDEF(446) MDEF(447) MDEF(448) MDEF(449)
+MDEF(450) MDEF(451) MDEF(452) MDEF(453) MDEF(454)
+MDEF(455) MDEF(456) MDEF(457) MDEF(458) MDEF(459)
+MDEF(460) MDEF(461) MDEF(462) MDEF(463) MDEF(464)
+MDEF(465) MDEF(466) MDEF(467) MDEF(468) MDEF(469)
+MDEF(470) MDEF(471) MDEF(472) MDEF(473) MDEF(474)
+MDEF(475) MDEF(476) MDEF(477) MDEF(478) MDEF(479)
+MDEF(480) MDEF(481) MDEF(482) MDEF(483) MDEF(484)
+MDEF(485) MDEF(486) MDEF(487) MDEF(488) MDEF(489)
+MDEF(490) MDEF(491) MDEF(492) MDEF(493) MDEF(494)
+MDEF(495) MDEF(496) MDEF(497) MDEF(498) MDEF(499)
+
+MDEF(500) MDEF(501) MDEF(502) MDEF(503) MDEF(504)
+MDEF(505) MDEF(506) MDEF(507) MDEF(508) MDEF(509)
+MDEF(510) MDEF(511) MDEF(512)
+
+
+#define MSET10(X) \
+ UM ## X ## 0, \
+ UM ## X ## 1, \
+ UM ## X ## 2, \
+ UM ## X ## 3, \
+ UM ## X ## 4, \
+ UM ## X ## 5, \
+ UM ## X ## 6, \
+ UM ## X ## 7, \
+ UM ## X ## 8, \
+ UM ## X ## 9,
+
+// A universal delegator for a custom interface that derives from
+// IUnknown (and *not* IDispatch).
+//
+void FAR* g_rgpfnUnk[] =
+{
+ UnivQueryInterface,
+ UnivAddRef,
+ UnivRelease,
+ UM3,
+ UM4,
+ UM5,
+ UM6,
+ UM7,
+ UM8,
+ UM9,
+ MSET10(1)
+ MSET10(2)
+ MSET10(3)
+ MSET10(4)
+ MSET10(5)
+ MSET10(6)
+ MSET10(7)
+ MSET10(8)
+ MSET10(9)
+ MSET10(10)
+ MSET10(11)
+ MSET10(12)
+ MSET10(13)
+ MSET10(14)
+ MSET10(15)
+ MSET10(16)
+ MSET10(17)
+ MSET10(18)
+ MSET10(19)
+ MSET10(20)
+ MSET10(21)
+ MSET10(22)
+ MSET10(23)
+ MSET10(24)
+ MSET10(25)
+ MSET10(26)
+ MSET10(27)
+ MSET10(28)
+ MSET10(29)
+ MSET10(30)
+ MSET10(31)
+ MSET10(32)
+ MSET10(33)
+ MSET10(34)
+ MSET10(35)
+ MSET10(36)
+ MSET10(37)
+ MSET10(38)
+ MSET10(39)
+ MSET10(40)
+ MSET10(41)
+ MSET10(42)
+ MSET10(43)
+ MSET10(44)
+ MSET10(45)
+ MSET10(46)
+ MSET10(47)
+ MSET10(48)
+ MSET10(49)
+ MSET10(50)
+ UM510,
+ UM511,
+ UM512
+};
+
+// A universal delegator for a custom interface that derives from
+// IDispatch.
+//
+void FAR* g_rgpfnDisp[] =
+{
+ UnivQueryInterface,
+ UnivAddRef,
+ UnivRelease,
+ UnivGetTypeInfoCount,
+ UnivGetTypeInfo,
+ UnivGetIDsOfNames,
+ UnivInvoke,
+ UM7,
+ UM8,
+ UM9,
+ MSET10(1)
+ MSET10(2)
+ MSET10(3)
+ MSET10(4)
+ MSET10(5)
+ MSET10(6)
+ MSET10(7)
+ MSET10(8)
+ MSET10(9)
+ MSET10(10)
+ MSET10(11)
+ MSET10(12)
+ MSET10(13)
+ MSET10(14)
+ MSET10(15)
+ MSET10(16)
+ MSET10(17)
+ MSET10(18)
+ MSET10(19)
+ MSET10(20)
+ MSET10(21)
+ MSET10(22)
+ MSET10(23)
+ MSET10(24)
+ MSET10(25)
+ MSET10(26)
+ MSET10(27)
+ MSET10(28)
+ MSET10(29)
+ MSET10(30)
+ MSET10(31)
+ MSET10(32)
+ MSET10(33)
+ MSET10(34)
+ MSET10(35)
+ MSET10(36)
+ MSET10(37)
+ MSET10(38)
+ MSET10(39)
+ MSET10(40)
+ MSET10(41)
+ MSET10(42)
+ MSET10(43)
+ MSET10(44)
+ MSET10(45)
+ MSET10(46)
+ MSET10(47)
+ MSET10(48)
+ MSET10(49)
+ MSET10(50)
+ UM510,
+ UM511,
+ UM512
+};
+
+
+long g_cfnUnk = DIM(g_rgpfnUnk);
+long g_cfnDisp = DIM(g_rgpfnDisp);
diff --git a/private/oleauto/src/dispatch/validate.cpp b/private/oleauto/src/dispatch/validate.cpp
new file mode 100644
index 000000000..1e7765560
--- /dev/null
+++ b/private/oleauto/src/dispatch/validate.cpp
@@ -0,0 +1,291 @@
+/***
+*validate.cpp - parameter validate support routines
+*
+* Copyright (C) 1992 - 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module contains paramater validation support utilities.
+*
+*
+*Revision History:
+*
+* [00] 19-Jan-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#ifdef _DEBUG /* { */
+
+/***
+*PUBLIC int FIsBadReadPtr
+*Purpose:
+* Answer if the given address is not readable for the given range.
+*
+*Entry:
+* pv = the address to check
+* cb = the range to check
+*
+*Exit:
+* return value = int
+*
+***********************************************************************/
+INTERNAL_(int)
+FIsBadReadPtr(const void *pv, unsigned int cb)
+{
+#if OE_WIN
+ return IsBadReadPtr(pv, cb);
+#else
+ // CONSIDER: should be a more comprehensive check for this on the mac.
+ return pv == NULL;
+#endif
+}
+
+/***
+*PUBLIC int FIsBadWritePtr
+*Purpose:
+* Answer if the given address is not writeable anywhere on the given range
+*
+*Entry:
+* pv = the address to check
+* cb = the range of bytes to check
+*
+*Exit:
+* return value = int
+*
+***********************************************************************/
+INTERNAL_(int)
+FIsBadWritePtr(void *pv, unsigned int cb)
+{
+#if OE_WIN
+ return IsBadWritePtr(pv, cb);
+#else
+ // CONSIDER: should be a more comprehensive check for this on the mac.
+ return pv == NULL;
+#endif
+}
+
+/***
+*PUBLIC int FIsBadCodePtr
+*Purpose:
+* Answer if the given address is not executable.
+*
+*Entry:
+* pv = the address to check
+*
+*Exit:
+* return value = int
+*
+***********************************************************************/
+INTERNAL_(int)
+FIsBadCodePtr(void *pv)
+{
+#if OE_WIN
+ return IsBadCodePtr((FARPROC)pv);
+#else
+ // CONSIDER: should be a more comprehensive check for this on the mac.
+ return pv == NULL;
+#endif
+}
+
+/***
+*PUBLIC int FIsBadStringPtr
+*Purpose:
+* Answer if the given address is not a valid string.
+*
+*Entry:
+* pv = the address of the string.
+* cchMax = the maximum length of the string.
+*
+*Exit:
+* return value = int
+*
+***********************************************************************/
+INTERNAL_(int)
+FIsBadStringPtr(OLECHAR FAR*pv, unsigned int cchMax)
+{
+#if OE_WIN16
+ return IsBadStringPtr(pv, cchMax);
+#elif OE_WIN32
+#if _X86_
+ if (g_fChicago) {
+ return IsBadStringPtrA((char *)pv, (cchMax == -1) ? BYTELEN(pv) : cchMax*2);
+ }
+#endif //_X86_
+ return IsBadStringPtrW(pv, cchMax);
+#else
+ // CONSIDER: should be a more comprehensive check for this on the mac.
+ return pv == NULL;
+#endif
+}
+
+/***
+*PUBLIC int FIsBadInterface
+*Purpose:
+* Answer if the given address is not a valid interface with the
+* given number of methods.
+*
+*Entry:
+* pv = the address of the interface
+* cMethods = the count of methods on the interface
+*
+*Exit:
+* return value = int
+*
+***********************************************************************/
+INTERNAL_(int)
+FIsBadInterface(void *pv, unsigned int cMethods)
+{
+struct vtable {
+ void (*rgpfn[1])();
+};
+struct iface {
+ vtable *pvft;
+};
+
+ unsigned int i;
+ vtable *pvft;
+ iface *piface = (struct iface*)pv;
+
+ // verify that the instance is readable
+ if(FIsBadReadPtr(piface, sizeof(void*)))
+ return TRUE;
+ // verify that the vtable is readable
+ pvft = piface->pvft;
+ if(FIsBadReadPtr(pvft, sizeof(void(*)()) * cMethods))
+ return TRUE;
+ // verify that the vtable is fully populated with function pointers
+ for(i = 0; i < cMethods; ++i){
+ if(FIsBadCodePtr(pvft->rgpfn[i]))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/***
+*int IsBadDispParams(DISPPARAMS*)
+*
+*Purpose:
+* Check for a bad DISPPARAMS structure.
+*
+*Entry:
+* pdispparams = pointer to a DISPPARAMS structure.
+*
+*Exit:
+* return value = int. TRUE if bad, FALSE if not.
+*
+***********************************************************************/
+INTERNAL_(int)
+IsBadDispParams(DISPPARAMS FAR* pdispparams)
+{
+ int fBad;
+
+ if(IsBadReadPtr(pdispparams, sizeof(*pdispparams)))
+ return TRUE;
+
+ // check the rgvarg array, if there is supposed to be one.
+ //
+ if(pdispparams->cArgs > 0){
+ fBad = IsBadReadPtr(
+ pdispparams->rgvarg,
+ pdispparams->cArgs * sizeof(pdispparams->rgvarg[0]));
+ if(fBad)
+ return TRUE;
+ }
+
+ // check the rgdispid array, if there is supposed to be one.
+ //
+ if(pdispparams->cNamedArgs > 0){
+ fBad = IsBadReadPtr(
+ pdispparams->rgdispidNamedArgs,
+ pdispparams->cNamedArgs * sizeof(pdispparams->rgdispidNamedArgs[0]));
+ if(fBad)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+/***
+*PRIVATE int IsBadReadSA(SAFEARRAY*)
+*Purpose:
+* Validate the given safe array descriptor.
+*
+*Entry:
+* psa = the SafeArray descriptor to validate
+*
+*Exit:
+* return value = int. FALSE if its Ok, TRUE if its Bad.
+*
+***********************************************************************/
+INTERNAL_(int)
+IsBadReadSA(SAFEARRAY FAR* psa)
+{
+ if(IsBadReadPtr(psa, sizeof(*psa)))
+ return TRUE;
+
+ if(IsBadReadPtr(psa->rgsabound, psa->cDims * sizeof(SAFEARRAYBOUND)))
+ return TRUE;
+
+ return FALSE;
+}
+
+/***
+*PRIVATE int IsBadWriteSA(SAFEARRAY*)
+*Purpose:
+* Validate the given safe array descriptor.
+*
+*Entry:
+* psa = the SafeArray descriptor to validate
+*
+*Exit:
+* return value = int. FALSE if its Ok, TRUE if its Bad.
+*
+***********************************************************************/
+INTERNAL_(int)
+IsBadWriteSA(SAFEARRAY FAR* psa)
+{
+ if(IsBadWritePtr(psa, sizeof(*psa)))
+ return TRUE;
+
+ if(IsBadWritePtr(psa->rgsabound, psa->cDims * sizeof(SAFEARRAYBOUND)))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+#ifdef _MAC /* { */
+
+// REVIEW: need to find a more complete way to do pointer validation
+// on the mac...
+
+EXTERN_C INTERNAL_(int)
+IsBadReadPtr(const void FAR* lp, unsigned int cb)
+{
+ UNUSED(cb);
+ return (lp == NULL);
+}
+
+EXTERN_C INTERNAL_(int)
+IsBadWritePtr(void FAR* lp, unsigned int cb)
+{
+ UNUSED(cb);
+ return (lp == NULL);
+}
+
+EXTERN_C INTERNAL_(int)
+IsBadStringPtr(const OLECHAR FAR* lpsz, unsigned int cchMax)
+{
+ UNUSED(cchMax);
+ return (lpsz == NULL);
+}
+
+#endif /* } */
+
+#endif /* } */
+
diff --git a/private/oleauto/src/dispatch/variant.cpp b/private/oleauto/src/dispatch/variant.cpp
new file mode 100644
index 000000000..4613a4a30
--- /dev/null
+++ b/private/oleauto/src/dispatch/variant.cpp
@@ -0,0 +1,1168 @@
+/*****************************************************************************
+*
+* Copyright (C) 1991-1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* File:
+*
+* variant.cpp
+*
+* Purpose:
+*
+* This file exports the following VARIANT API functions:
+*
+* VariantInit()
+* VariantClear()
+* VariantCopy()
+* VariantCopyInd()
+* VariantChangeType()
+* VariantChangeTypeEx()
+*
+* and defines the following private functions:
+*
+* IsLegalVartype()
+* ExtractValueProperty()
+* VariantChangeTypeInternal()
+*
+* Revision History:
+*
+* [00] 17-May-93 tomteng: merge disputil.cpp, rtglue.cpp, oleconv.c
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+ASSERTDATA
+
+/* For the Mac, code-segments must be pre-declared */
+#if OE_MAC
+#pragma code_seg("_TEXT")
+#pragma code_seg()
+#endif //OE_MAC
+
+PRIVATE_(HRESULT)
+ExtractValueProperty(IDispatch FAR* pdisp, LCID lcid, VARIANT FAR* pvarResult);
+
+
+/***
+*PUBLIC void VariantInit(VARIANT*)
+*Purpose:
+* Initialize the given VARIANT to VT_EMPTY.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = void
+*
+* pvarg = pointer to initialized VARIANT
+*
+***********************************************************************/
+#if !OE_WIN32
+#pragma code_seg("_TEXT")
+#endif
+STDAPI_(void)
+VariantInit(VARIANT FAR* pvarg)
+{
+ V_VT(pvarg) = VT_EMPTY;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC HRESULT VariantClear(VARIANTARG FAR*)
+*Purpose:
+* Set the variant to nothing, releaseing any string or object
+* reference owned by that variant.
+*
+*Entry:
+* pvarg = the VARIANTARG to set to VT_EMPTY
+*
+*Exit:
+* return value = HRESULT
+* NOERROR
+* E_INVALIDARG
+* DISP_E_BADVARTYPE
+* DISP_E_ARRAYISLOCKED
+*
+*Note:
+* We dont release or clear anything thats ByRef. These aren't
+* owned by the variant, but by what the variant points at.
+*
+***********************************************************************/
+#if !OE_WIN32
+#pragma code_seg("_TEXT")
+#endif
+STDAPI
+VariantClear(VARIANTARG FAR* pvarg)
+{
+ VARTYPE vt;
+
+#ifdef _DEBUG
+ if(IsBadWritePtr(pvarg, sizeof(*pvarg)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ vt = V_VT(pvarg);
+
+ // Handle special-case internal type
+ if((vt & ~VT_BYREF) == VT_INTERFACE){
+ VARIANTX FAR* pvarx = (VARIANTX FAR*)pvarg;
+ if(pvarx->piid != NULL)
+ delete pvarx->piid;
+ }else{
+
+ IfFailRet(IsLegalVartype(vt));
+ }
+
+ switch(vt){
+ case VT_BSTR:
+ SysFreeString(V_BSTR(pvarg));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_INTERFACE:
+ if(V_UNKNOWN(pvarg) != NULL)
+ V_UNKNOWN(pvarg)->Release();
+ break;
+
+ case VT_DISPATCH:
+ if(V_DISPATCH(pvarg) != NULL)
+ V_DISPATCH(pvarg)->Release();
+ break;
+
+ default:
+ if(V_ISARRAY(pvarg)){
+ if(!V_ISBYREF(pvarg)){
+ IfFailRet(SafeArrayDestroy(V_ARRAY(pvarg)));
+ }
+ }
+ break;
+ }
+
+#ifdef _DEBUG
+ MEMSET(pvarg, -1, sizeof(*pvarg));
+#endif
+
+ V_VT(pvarg) = VT_EMPTY;
+ return NOERROR;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC HRESULT VariantCopy(VARIANTARG FAR*, VARIANTARG FAR*)
+*Purpose:
+* Copy the source VARIANTARG to the destination VARIANTARG.
+*
+*Entry:
+* pvargSrc = the source VARIANTARG
+*
+*Exit:
+* return value = HRESULT
+* NOERROR
+* E_INVALIDARG
+* E_OUTOFMEMORY
+* DISP_E_BADVARTYPE
+* DISP_E_ARRAYISLOCKED
+*
+* pvargDest = pointer to a copy of the soruce VARIANTARG
+*
+***********************************************************************/
+#if !OE_WIN32
+#pragma code_seg("_TEXT")
+#endif
+STDAPI
+VariantCopy(VARIANTARG FAR* pvargDest, VARIANTARG FAR* pvargSrc)
+{
+ BSTR bstr;
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(pvargSrc, sizeof(*pvargSrc)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pvargDest, sizeof(*pvargDest)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+#if 0 /* yes: we allow literal copying of byrefs. */
+ // REVIEW: should we allow literal copying of ByRefs?
+ if(V_ISBYREF(pvargSrc))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ IfFailRet(IsLegalVartype(V_VT(pvargSrc)));
+
+ if(pvargDest == pvargSrc)
+ return NOERROR;
+
+ // free up strings or objects pvargDest is currently referencing.
+
+ IfFailRet(VariantClear(pvargDest));
+
+ if((V_VT(pvargSrc) & (VT_ARRAY | VT_BYREF)) == VT_ARRAY){
+
+ IfFailRet(SafeArrayCopy(V_ARRAY(pvargSrc), &V_ARRAY(pvargDest)));
+ V_VT(pvargDest) = V_VT(pvargSrc);
+
+ }else{
+
+ MEMCPY(pvargDest, pvargSrc, sizeof(VARIANTARG));
+
+ switch(V_VT(pvargSrc)){
+ case VT_BSTR:
+ bstr = V_BSTR(pvargSrc);
+ IfFailRet(ErrStringCopy(bstr, &V_BSTR(pvargDest)));
+ break;
+
+ case VT_UNKNOWN:
+ if(V_UNKNOWN(pvargDest) != NULL)
+ V_UNKNOWN(pvargDest)->AddRef();
+ break;
+
+ case VT_DISPATCH:
+ if(V_DISPATCH(pvargDest) != NULL)
+ V_DISPATCH(pvargDest)->AddRef();
+ break;
+
+ }
+ }
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC HRESULT VariantCopyInd(VARIANTARG*, VARIANTARG*)
+*Purpose:
+* Copy a VARIANTARG from the given source to dest, and indirect
+* the source if its a VT_BYREF.
+*
+*Entry:
+* pvargSrc = the VARIANTARG to copy and possibly indirect.
+*
+*Exit:
+* return value = HRESULT
+* NOERROR
+* E_INVALIDARG
+* E_OUTOFMEMORY
+* DISP_E_BADVARTYPE
+* DISP_E_ARRAYISLOCKED
+*
+* pvargDest = the indirected copy
+*
+***********************************************************************/
+#if !OE_WIN32
+#pragma code_seg("_TEXT")
+#endif
+STDAPI
+VariantCopyInd(VARIANTARG FAR* pvargDest, VARIANTARG FAR* pvargSrc)
+{
+ BSTR bstr;
+ VARTYPE vtTo;
+
+#ifdef _DEBUG
+ if(IsBadWritePtr(pvargSrc, sizeof(*pvargSrc)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pvargDest, sizeof(*pvargDest)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ // if the source is not ByRef, then this just maps to a
+ // simple VariantCopy.
+ //
+ if(!V_ISBYREF(pvargSrc)){
+ // just do the simple copy.
+ return VariantCopy(pvargDest, pvargSrc);
+ }
+
+ if(pvargDest != pvargSrc)
+ IfFailRet(VariantClear(pvargDest));
+
+ vtTo = V_VT(pvargSrc) & ~VT_BYREF;
+
+ switch(vtTo){
+ case VT_VARIANT:
+ // NOTE: we only allow one level of variants, with or without the ByRef.
+ if(V_VT(V_VARIANTREF(pvargSrc)) == (VT_BYREF | VT_VARIANT))
+ return RESULT(E_INVALIDARG);
+ IfFailRet(VariantCopyInd(pvargDest, V_VARIANTREF(pvargSrc)));
+ return NOERROR;
+
+#if VBA2
+ case VT_UI1:
+ V_UI1(pvargDest) = *V_UI1REF(pvargSrc);
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ V_I2(pvargDest) = *V_I2REF(pvargSrc);
+ break;
+
+ case VT_I4:
+ case VT_ERROR:
+ V_I4(pvargDest) = *V_I4REF(pvargSrc);
+ break;
+
+ case VT_R4:
+ V_R4(pvargDest) = *V_R4REF(pvargSrc);
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ V_R8(pvargDest) = *V_R8REF(pvargSrc);
+ break;
+
+ case VT_CY:
+ V_CY(pvargDest) = *V_CYREF(pvargSrc);
+ break;
+
+ case VT_UNKNOWN:
+ V_UNKNOWN(pvargDest) = *V_UNKNOWNREF(pvargSrc);
+ if(V_UNKNOWN(pvargDest) != NULL)
+ V_UNKNOWN(pvargDest)->AddRef();
+ break;
+
+ case VT_DISPATCH:
+ V_DISPATCH(pvargDest) = *V_DISPATCHREF(pvargSrc);
+ if(V_DISPATCH(pvargDest) != NULL)
+ V_DISPATCH(pvargDest)->AddRef();
+ break;
+
+ case VT_BSTR:
+ bstr = *V_BSTRREF(pvargSrc);
+ IfFailRet(ErrStringCopy(bstr, &V_BSTR(pvargDest)));
+ break;
+
+ default:
+ if(vtTo & VT_ARRAY){
+ IfFailRet(SafeArrayCopy(*V_ARRAYREF(pvargSrc), &V_ARRAY(pvargDest)));
+ break;
+ }
+ return RESULT(E_INVALIDARG);
+ }
+
+ V_VT(pvargDest) = vtTo;
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC HRESULT VariantChangeType
+*Purpose:
+* This function changes the data type of a VARIANTARG to the given vt.
+* If the variant in initailly BYREF, it is converted to a VARIANT that
+* is not BYREF.
+*
+*Entry:
+* pargSrc = points to VARIANTARG to be converted.
+* vt = desired type of variant.
+*
+*Exit:
+* return value = HRESULT
+* NOERROR
+* E_INVALIDARG
+* E_OUTOFMEMORY
+* RESULT(DISP_E_OVERFLOW)
+* DISP_E_BADVARTYPE
+* DISP_E_TYPEMISMATCH
+*
+* *pargDest = contains the converted value.
+*
+***********************************************************************/
+
+STDAPI
+VariantChangeType(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvargSrc,
+ unsigned short wFlags,
+ VARTYPE vt)
+{
+ return VariantChangeTypeEx(pvargDest, pvargSrc, LOCALE_USER_DEFAULT, wFlags, vt);
+}
+
+
+STDAPI
+VariantChangeTypeEx(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvargSrc,
+ LCID lcid,
+ unsigned short wFlags,
+ VARTYPE vt)
+{
+
+static char NEARDATA
+g_fCoerceObjByExtractingValue[] = {
+ FALSE // VT_EMPTY
+ , FALSE // VT_NULL
+ , TRUE // VT_I2
+ , TRUE // VT_I4
+ , TRUE // VT_R4
+ , TRUE // VT_R8
+ , TRUE // VT_CY
+ , TRUE // VT_DATE
+ , TRUE // VT_BSTR
+ , FALSE // VT_DISPATCH
+ , TRUE // VT_ERROR
+ , TRUE // VT_BOOL
+ , FALSE // VT_VARIANT -- this is n/a really
+ , FALSE // VT_UNKNOWN
+ , FALSE // unused
+ , FALSE // unused
+ , TRUE // VT_I1
+ , TRUE // VT_UI1
+};
+
+ VARIANT varTmp;
+ HRESULT hresult;
+
+
+#ifdef _DEBUG
+ if(IsBadReadPtr(pvargSrc, sizeof(*pvargSrc)))
+ return RESULT(E_INVALIDARG);
+ if(IsBadWritePtr(pvargDest, sizeof(*pvargDest)))
+ return RESULT(E_INVALIDARG);
+#endif
+
+ // make sure both the source and target VARTYPEs are legal.
+ //
+ IfFailRet(IsLegalVartype(vt));
+ IfFailRet(IsLegalVartype(V_VT(pvargSrc)));
+
+ // we cant convert to or from VT_ARRAY
+ //
+ if(V_VT(pvargSrc) & VT_ARRAY)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ // cant convert to array or byref.
+ //
+ if(vt & (VT_BYREF|VT_ARRAY|VT_RESERVED))
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ // if the source *and* target VARTYPE are the same, then there is
+ // no coersion to be done - we either copy, or do nothing at all.
+ //
+ if(vt == V_VT(pvargSrc)){
+ if(pvargDest == pvargSrc)
+ return NOERROR;
+ return VariantCopy(pvargDest, pvargSrc);
+ }
+
+ // Now we know some coersion must take place.
+
+ // Special case the handling of VT_DISPATCH - A IDispatch object is
+ // coerced to a base type by extracting its "value" property, and
+ // coercing that to the specfied target type.
+ //
+#ifdef _DEBUG
+ ASSERT(vt < DIM(g_fCoerceObjByExtractingValue));
+#endif
+
+ if ((V_VT(pvargSrc)&~VT_BYREF) == VT_DISPATCH
+ && g_fCoerceObjByExtractingValue[vt] == TRUE)
+ {
+ if(wFlags & VARIANT_NOVALUEPROP)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ IDispatch FAR* pdisp =
+ V_ISBYREF(pvargSrc) ? *V_DISPATCHREF(pvargSrc) : V_DISPATCH(pvargSrc);
+
+ if(pdisp == NULL)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ pdisp->AddRef();
+
+ V_VT(&varTmp) = VT_EMPTY;
+ hresult = ExtractValueProperty(pdisp, lcid, &varTmp);
+
+ pdisp->Release();
+
+ // if there was an error extracting the value property, then
+ // we simply report a type-mismatch.
+ //
+ if(hresult != NOERROR)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ }else{
+
+ // otherwise just copy and coerce - this is a bit tricky because
+ // we want to make sure we leave the state of the params untouched
+ // if the corsion fails.
+
+ V_VT(&varTmp) = VT_EMPTY;
+
+ IfFailRet(VariantCopyInd(&varTmp, pvargSrc));
+
+ }
+
+ IfFailGo(VariantChangeTypeInternal(&varTmp, lcid, vt), LError0);
+
+ IfFailGo(VariantClear(pvargDest), LError0);
+
+ MEMCPY(pvargDest, &varTmp, sizeof(VARIANT));
+
+ return NOERROR;
+
+LError0:;
+ VariantClear(&varTmp);
+
+ return hresult;
+}
+
+
+
+static char rgfByVal[] = {
+ TRUE // VT_EMPTY
+ , TRUE // VT_NULL
+ , TRUE // VT_I2
+ , TRUE // VT_I4
+ , TRUE // VT_R4
+ , TRUE // VT_R8
+ , TRUE // VT_CY
+ , TRUE // VT_DATE
+ , TRUE // VT_BSTR
+ , TRUE // VT_DISPATCH
+ , TRUE // VT_ERROR
+ , TRUE // VT_BOOL
+ , FALSE // VT_VARIANT
+ , TRUE // VT_UNKNOWN
+#if 0 // we never index this far
+ , FALSE // unused
+ , FALSE // unused
+ , TRUE // VT_I1
+ , TRUE // VT_UI1
+#endif //0
+};
+
+static char rgfByRef[] =
+{
+ FALSE // VT_BYREF | VT_EMPTY
+ , FALSE // VT_BYREF | VT_NULL
+ , TRUE // VT_BYREF | VT_I2
+ , TRUE // VT_BYREF | VT_I4
+ , TRUE // VT_BYREF | VT_R4
+ , TRUE // VT_BYREF | VT_R8
+ , TRUE // VT_BYREF | VT_CY
+ , TRUE // VT_BYREF | VT_DATE
+ , TRUE // VT_BYREF | VT_BSTR
+ , TRUE // VT_BYREF | VT_DISPATCH
+ , TRUE // VT_BYREF | VT_ERROR
+ , TRUE // VT_BYREF | VT_BOOL
+ , TRUE // VT_BYREF | VT_VARIANT
+ , TRUE // VT_BYREF | VT_UNKNOWN
+#if 0 // we never index this far
+ , FALSE // VT_BYREF | unused
+ , FALSE // VT_BYREF | unused
+ , TRUE // VT_BYREF | VT_I1
+ , TRUE // VT_BYREF | VT_UI1
+#endif //0
+};
+
+
+/***
+*LOCAL HRESULT IsLegalVartype(VARTYPE)
+*Purpose:
+* Determines if the given vt is a legal VARTYPE.
+*
+*Entry:
+* vt = VARTYPE to check
+*
+*Exit:
+* return value = HRESULT
+* NOERROR
+* DISP_E_BADVARTYPE
+*
+***********************************************************************/
+#if !OE_WIN32
+#pragma code_seg("_TEXT")
+#endif
+INTERNAL_(HRESULT)
+IsLegalVartype(VARTYPE vt)
+{
+
+ // NOTE: legality is now the same for Array and ByRef, so optimize
+ if(vt & (VT_BYREF | VT_ARRAY)){
+ vt &= ~(VT_BYREF | VT_ARRAY);
+
+ if(vt < VT_VMAX && rgfByRef[vt] == TRUE)
+ return NOERROR;
+
+ }else{
+
+ if(vt < VT_VMAX && rgfByVal[vt] == TRUE)
+ return NOERROR;
+
+ }
+
+#if VBA2
+ if(vt == VT_UI1)
+ return NOERROR;
+#endif //VBA2
+
+ return RESULT(DISP_E_BADVARTYPE);
+}
+#pragma code_seg()
+
+
+/***
+*LOCAL STDAPI ExtractValueProperty(IDispatch*, LCID, VARIANT*)
+*Purpose:
+* Extract the value property from the given IDispatch*, and return
+* in the given variant.
+*
+*Entry:
+* pdisp = the IDispatch* to extract the value property from
+*
+*Exit:
+* return value = HRESULT
+*
+* *pvarResult = a VARIANT containing the contents of the "value" property
+*
+* Note: this routine assumes that pvarResult is properly initialized
+* to VT_EMPTY.
+*
+***********************************************************************/
+PRIVATE_(HRESULT)
+ExtractValueProperty(IDispatch FAR* pdisp, LCID lcid, VARIANT FAR* pvarResult)
+{
+ DISPPARAMS dispparams;
+
+ ASSERT(V_VT(pvarResult) == VT_EMPTY);
+
+ dispparams.cArgs = 0;
+ dispparams.rgvarg = NULL;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ return pdisp->Invoke(
+ DISPID_VALUE,
+ IID_NULL,
+ lcid,
+ DISPATCH_PROPERTYGET,
+ &dispparams, pvarResult, NULL, NULL);
+}
+
+
+
+/***
+*PRIVATE HRESULT VariantChangeTypeInternal(VARIANT*, LCID, VARTYPE)
+*Purpose:
+* In place variant coercion
+*
+*Entry:
+* pvar = the VARIANT to coerce
+* vt = the target type of the coersion
+*
+*Exit:
+* return value = HRESULT
+*
+* *lpvar = the coerced VARIANT
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+VariantChangeTypeInternal(VARIANT FAR* pvar, LCID lcid, VARTYPE vt)
+{
+ VARTYPE vtFrom;
+ HRESULT hresult;
+ void FAR* pvFrom;
+
+ vtFrom = V_VT(pvar);
+
+ // should never be called with either Array or ByRef bits set
+ ASSERT((vtFrom & (VT_ARRAY | VT_BYREF)) == 0);
+
+#ifdef _DEBUG
+ if(vtFrom == VT_BOOL && V_BOOL(pvar) != 0 && V_BOOL(pvar) != -1)
+ return RESULT(E_INVALIDARG);
+#endif
+
+ // Nothing to do, return success
+ if(vtFrom == vt)
+ return NOERROR;
+
+ // cant coerce to or from VT_ERROR
+ if(vtFrom == VT_ERROR || vt == VT_ERROR)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ // Coercion of NULL type is invalid
+ if(vtFrom == VT_NULL)
+ return RESULT(DISP_E_TYPEMISMATCH);
+
+ // save pointer to possible resources that may need to be
+ // free'd if the coersion is successful.
+ pvFrom = V_BYREF(pvar);
+
+ hresult = NOERROR;
+
+ switch(vt){
+ case VT_NULL:
+ case VT_EMPTY:
+ break;
+
+#if VBA2
+ case VT_UI1:
+ switch(vtFrom){
+ case VT_EMPTY:
+ V_I2(pvar) = 0;
+ break;
+
+ case VT_I2:
+ hresult = VarUI1FromI2(V_I2(pvar), &V_UI1(pvar));
+ break;
+
+ case VT_I4:
+ hresult = VarUI1FromI4(V_I4(pvar), &V_UI1(pvar));
+ break;
+
+ case VT_R4:
+ hresult = VarUI1FromR4(V_R4(pvar), &V_UI1(pvar));
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ hresult = VarUI1FromR8(V_R8(pvar), &V_UI1(pvar));
+ break;
+
+ case VT_CY:
+ hresult = VarUI1FromCy(V_CY(pvar), &V_UI1(pvar));
+ break;
+
+ case VT_BOOL:
+ hresult = VarUI1FromBool(V_BOOL(pvar), &V_UI1(pvar));
+ break;
+
+ case VT_BSTR:
+ hresult = VarUI1FromStr(V_BSTR(pvar), lcid, NULL, &V_UI1(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ switch(vtFrom){
+ case VT_EMPTY:
+ V_I2(pvar) = 0;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ hresult = VarI2FromUI1(V_UI1(pvar), &V_I2(pvar));
+ break;
+#endif //VBA2
+
+ case VT_I4:
+ hresult = VarI2FromI4(V_I4(pvar), &V_I2(pvar));
+ break;
+
+ case VT_R4:
+ hresult = VarI2FromR4(V_R4(pvar), &V_I2(pvar));
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ hresult = VarI2FromR8(V_R8(pvar), &V_I2(pvar));
+ break;
+
+ case VT_CY:
+ hresult = VarI2FromCy(V_CY(pvar), &V_I2(pvar));
+ break;
+
+ case VT_BOOL:
+ break;
+
+ case VT_BSTR:
+ hresult = VarI2FromStr(V_BSTR(pvar), lcid, NULL, &V_I2(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+
+ case VT_I4:
+ switch(vtFrom){
+ case VT_EMPTY:
+ V_I4(pvar) = 0L;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ hresult = VarI4FromUI1(V_UI1(pvar), &V_I4(pvar));
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ V_I4(pvar) = (long)V_I2(pvar);
+ break;
+
+ case VT_R4:
+ hresult = VarI4FromR4(V_R4(pvar), &V_I4(pvar));
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ hresult = VarI4FromR8(V_R8(pvar), &V_I4(pvar));
+ break;
+
+ case VT_CY:
+ hresult = VarI4FromCy(V_CY(pvar), &V_I4(pvar));
+ break;
+
+ case VT_BSTR:
+ hresult = VarI4FromStr(V_BSTR(pvar), lcid, NULL, &V_I4(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+
+ case VT_R4:
+ switch(vtFrom){
+ case VT_EMPTY:
+ V_R4(pvar) = (float)0.0;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ hresult = VarR4FromUI1(V_UI1(pvar), &V_R4(pvar));
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ V_R4(pvar) = (float)V_I2(pvar);
+ break;
+
+ case VT_I4:
+ V_R4(pvar) = (float)V_I4(pvar);
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ hresult = VarR4FromR8(V_R8(pvar), &V_R4(pvar));
+ break;
+
+ case VT_CY:
+ hresult = VarR4FromCy(V_CY(pvar), &V_R4(pvar));
+ break;
+
+ case VT_BSTR:
+ hresult = VarR4FromStr(V_BSTR(pvar), lcid, NULL, &V_R4(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+
+ case VT_R8:
+ switch(vtFrom){
+ case VT_EMPTY:
+ V_R8(pvar) = 0.0;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ hresult = VarR8FromUI1(V_UI1(pvar), &V_R8(pvar));
+ break;
+#endif //VBA2
+
+ case VT_BOOL:
+ case VT_I2:
+ V_R8(pvar) = (double)V_I2(pvar);
+ break;
+
+ case VT_I4:
+ V_R8(pvar) = (double)V_I4(pvar);
+ break;
+
+ case VT_R4:
+ V_R8(pvar) = (double)V_R4(pvar);
+ break;
+
+ case VT_DATE:
+ break;
+
+ case VT_CY:
+ hresult = VarR8FromCy(V_CY(pvar), &V_R8(pvar));
+ break;
+
+ case VT_BSTR:
+ hresult = VarR8FromStr(V_BSTR(pvar), lcid, NULL, &V_R8(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+
+ case VT_CY:
+ switch(vtFrom){
+ case VT_EMPTY:
+ V_CY(pvar).Hi = V_CY(pvar).Lo = 0L;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ hresult = VarCyFromUI1(V_UI1(pvar), &V_CY(pvar));
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ hresult = VarCyFromI2(V_I2(pvar), &V_CY(pvar));
+ break;
+
+ case VT_I4:
+ hresult = VarCyFromI4(V_I4(pvar), &V_CY(pvar));
+ break;
+
+ case VT_R4:
+ hresult = VarCyFromR4(V_R4(pvar), &V_CY(pvar));
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ hresult = VarCyFromR8(V_R8(pvar), &V_CY(pvar));
+ break;
+
+ case VT_BSTR:
+ hresult = VarCyFromStr(V_BSTR(pvar), lcid, NULL, &V_CY(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+
+ case VT_DATE:
+ switch(vtFrom){
+ case VT_EMPTY:
+ V_DATE(pvar) = 0.0;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ V_DATE(pvar) = (DATE)V_UI1(pvar);
+ hresult = IsValidDate(V_DATE(pvar));
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ V_DATE(pvar) = (DATE)V_I2(pvar);
+ hresult = IsValidDate(V_DATE(pvar));
+ break;
+
+ case VT_I4:
+ V_DATE(pvar) = (DATE)V_I4(pvar);
+ hresult = IsValidDate(V_DATE(pvar));
+ break;
+
+ case VT_R4:
+ V_DATE(pvar) = (DATE)V_R4(pvar);
+ hresult = IsValidDate(V_DATE(pvar));
+ break;
+
+ case VT_R8:
+ hresult = IsValidDate(V_DATE(pvar));
+ break;
+
+ case VT_CY:
+ hresult = VarDateFromCy(V_CY(pvar), &V_DATE(pvar));
+ break;
+
+ case VT_BSTR:
+ hresult = VarDateFromStr(V_BSTR(pvar), lcid, NULL, &V_DATE(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+
+ case VT_BSTR:
+ switch(vtFrom){
+ case VT_EMPTY:
+ hresult = ErrSysAllocString(OASTR(""), &V_BSTR(pvar));
+ break;
+
+#if VBA2
+ case VT_UI1:
+ hresult = VarBstrFromUI1(V_UI1(pvar), lcid, NULL, &V_BSTR(pvar));
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ hresult = VarBstrFromI2(V_I2(pvar), lcid, NULL, &V_BSTR(pvar));
+ break;
+
+ case VT_I4:
+ hresult = VarBstrFromI4(V_I4(pvar), lcid, NULL, &V_BSTR(pvar));
+ break;
+
+ case VT_R4:
+ hresult = VarBstrFromR4(V_R4(pvar), lcid, NULL, &V_BSTR(pvar));
+ break;
+
+ case VT_DATE:
+ hresult = VarBstrFromDate(V_DATE(pvar), lcid, NULL, &V_BSTR(pvar));
+ break;
+
+ case VT_R8:
+ hresult = VarBstrFromR8(V_R8(pvar), lcid, NULL, &V_BSTR(pvar));
+ break;
+
+ case VT_CY:
+ hresult = VarBstrFromCy(V_CY(pvar), lcid, NULL, &V_BSTR(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+
+ case VT_BOOL:
+ switch(vtFrom){
+ case VT_EMPTY:
+ V_I2(pvar) = 0;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ V_BOOL(pvar) = (V_UI1(pvar) != 0) ? -1 : 0;
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ V_BOOL(pvar) = (V_I2(pvar) != 0) ? -1 : 0;
+ break;
+
+ case VT_I4:
+ V_BOOL(pvar) = (V_I4(pvar) != 0) ? -1 : 0;
+ break;
+
+ case VT_R4:
+ V_BOOL(pvar) = (V_R4(pvar) != (float)0.0) ? -1 : 0;
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ V_BOOL(pvar) = (V_R8(pvar) != 0.0) ? -1 : 0;
+ break;
+
+ case VT_CY:
+ hresult = VarBoolFromCy(V_CY(pvar), &V_BOOL(pvar));
+ break;
+
+ case VT_BSTR:
+ hresult = VarBoolFromStr(V_BSTR(pvar), lcid, NULL, &V_BOOL(pvar));
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ if (vtFrom == VT_UNKNOWN || vtFrom == VT_DISPATCH)
+ {
+ if (V_UNKNOWN(pvar) != NULL) {
+ if (vt == VT_UNKNOWN)
+ hresult = V_UNKNOWN(pvar)->QueryInterface(
+ IID_IUnknown,
+ (void FAR* FAR*) &V_UNKNOWN(pvar));
+ else if (vt == VT_DISPATCH)
+ hresult = V_UNKNOWN(pvar)->QueryInterface(
+ IID_IDispatch,
+ (void FAR* FAR*) &V_DISPATCH(pvar));
+ }
+ } else
+ hresult = RESULT(DISP_E_TYPEMISMATCH);
+ break;
+
+ default:
+ hresult = RESULT(E_INVALIDARG);
+ break;
+ }
+
+ // if the conversion succeeds, set the new variant type
+ if(hresult == NOERROR){
+
+ V_VT(pvar) = vt;
+
+ // free up resources VARIANT was holding before the coersion
+ switch(vtFrom){
+ case VT_BSTR:
+ SysFreeString((BSTR)pvFrom);
+ break;
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ if (pvFrom != NULL) {
+ ((IUnknown FAR*)pvFrom)->Release();
+ }
+ break;
+ }
+ }
+ return hresult;
+}
diff --git a/private/oleauto/src/dispatch/win16/0401.c b/private/oleauto/src/dispatch/win16/0401.c
new file mode 100644
index 000000000..d4ccb930e
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0401.c
@@ -0,0 +1,714 @@
+/****************************************************************************
+* 0401.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Saudi Arabia
+*
+* LCID = 0x0401
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:26:52 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(0401) rgwSort_0401[256] = {
+ 0x0000, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d, 0xc00e
+ , 0xc00f, 0x403b, 0x403c, 0x403d, 0x403e, 0x403f, 0xc010, 0xc011
+ , 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018, 0xc019
+ , 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020, 0xc021
+ , 0x4039, 0x4041, 0x4042, 0x4043, 0x4044, 0x4045, 0x4046, 0xc02d
+ , 0x4047, 0x4048, 0x4049, 0x406b, 0x404a, 0xc02e, 0x404b, 0x404c
+ , 0x0085, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f
+ , 0x0090, 0x0091, 0x404d, 0x404e, 0x406c, 0x406d, 0x406e, 0x404f
+ , 0x4050, 0x1892, 0x1893, 0x1894, 0x1895, 0x1896, 0x1897, 0x1898
+ , 0x1899, 0x189a, 0x189b, 0x189c, 0x189d, 0x189e, 0x189f, 0x18a0
+ , 0x18a1, 0x18a2, 0x18a3, 0x18a4, 0x18a5, 0x18a7, 0x18a8, 0x18a9
+ , 0x18aa, 0x18ab, 0x18ac, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055
+ , 0x4056, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098
+ , 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0
+ , 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a7, 0x00a8, 0x00a9
+ , 0x00aa, 0x00ab, 0x00ac, 0x4057, 0x4058, 0x4059, 0x405a, 0xc022
+ , 0xc023, 0xc024, 0x4065, 0x0197, 0x4068, 0x4083, 0x4080, 0x4081
+ , 0x4154, 0x4084, 0xc025, 0x4069, 0x0005, 0xc026, 0xc027, 0xc028
+ , 0xc029, 0x4063, 0x4064, 0x4066, 0x4067, 0x4082, 0xc030, 0xc031
+ , 0xc02a, 0x18a6, 0xc02b, 0x406a, 0x0105, 0x4040, 0x0000, 0xc02c
+ , 0x403a, 0x4060, 0x4074, 0x4075, 0x4076, 0x4077, 0x405b, 0x4078
+ , 0x405c, 0x4079, 0x08ca, 0x4070, 0x407a, 0xc02f, 0x407b, 0x405d
+ , 0x407c, 0x406f, 0x108a, 0x108b, 0x405e, 0x407d, 0x407e, 0x407f
+ , 0x405f, 0x1089, 0x4061, 0x4071, 0x0086, 0x0087, 0x0088, 0x4062
+ , 0x08cb, 0x00ad, 0x0205, 0x01ad, 0x02ad, 0x03ad, 0x04ad, 0x00ae
+ , 0x00af, 0x00b0, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5
+ , 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x4072
+ , 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x0000, 0x00c1, 0x00c2, 0x00c3
+ , 0x0192, 0x00c4, 0x0292, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x0194
+ , 0x0296, 0x0196, 0x0396, 0x0496, 0x00c9, 0x01c9, 0x019a, 0x029a
+ , 0xc032, 0xc033, 0xc034, 0xc035, 0x01a0, 0xc036, 0xc037, 0x4073
+ , 0x4007, 0x01a7, 0xc038, 0x02a7, 0x03a7, 0x0000, 0x0000, 0x08cc
+};
+
+EXPANSION NLSALLOC(0401) rgexp_0401[3] = {
+ { 0x18a0, 0x1896 }
+ , { 0x00a0, 0x0096 }
+ , { 0x00ad, 0x00ae }
+};
+
+WORD NLSALLOC(0401) rgwCType12_0401[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x0020, 0xb010, 0x1101, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0xb010, 0x0020, 0xb010, 0x1102, 0xb010, 0xb010, 0x0020
+ , 0xa048, 0x2010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0x0000, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0x2010, 0xb010, 0xb010, 0xb010, 0xb010, 0x2010
+ , 0x0000, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100
+ , 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100
+ , 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0xb010
+ , 0x2100, 0x2100, 0x2100, 0x2100, 0x2010, 0x2100, 0x2100, 0x2100
+ , 0x1102, 0x2100, 0x1102, 0x2100, 0x2100, 0x2100, 0x2100, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x2100, 0x2100, 0x1102, 0x1102
+ , 0x2010, 0x2010, 0x2010, 0x2010, 0x1102, 0x2010, 0x2010, 0xb010
+ , 0x2010, 0x1102, 0x2010, 0x1102, 0x1102, 0x1010, 0x2010, 0x0000
+};
+
+WORD NLSALLOC(0401) rgwCType3_0401[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x0000, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0000, 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0000, 0x0000
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0000, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0008
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x0601, 0x8000, 0x8000, 0x8000
+ , 0x8003, 0x8000, 0x8003, 0x8000, 0x8000, 0x8000, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8000, 0x8003, 0x8003
+ , 0x0001, 0x0001, 0x0001, 0x0001, 0x8003, 0x0001, 0x0001, 0x0008
+ , 0x0001, 0x8003, 0x0001, 0x8003, 0x8003, 0x0000, 0x0000, 0x0000
+};
+
+BYTE NLSALLOC(0401) rgbUCase_0401[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x8c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+BYTE NLSALLOC(0401) rgbLCase_0401[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x9c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(0401) rgbILANGUAGE[] = { /* "0401" */
+ 0x30, 0x34, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVLANGNAME[] = { /* "ARA" */
+ 0x41, 0x52, 0x41
+};
+
+static BYTE NLSALLOC(0401) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(0401) rgbICOUNTRY[] = { /* "966" */
+ 0x39, 0x36, 0x36
+};
+
+static BYTE NLSALLOC(0401) rgbSCOUNTRY[] = { /* "Saudi Arabia" */
+ 0x53, 0x61, 0x75, 0x64, 0x69, 0x20, 0x41, 0x72
+ , 0x61, 0x62, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVCTRYNAME[] = { /* "SAU" */
+ 0x53, 0x41, 0x55
+};
+
+static BYTE NLSALLOC(0401) rgbSNATIVECTRYNAME[] = { /* "\x0627\x0644\x0645\x0645\x0644\x0643\x0629 \x0627\x0644\x0639\x0631\x0628\x064a\x0629 \x0627\x0644\x0633\x0639\x0648\x062f\x064a\x0629" */
+ 0xc7, 0xe1, 0xe3, 0xe3, 0xe1, 0xdf, 0xc9, 0x20
+ , 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9, 0x20
+ , 0xc7, 0xe1, 0xd3, 0xda, 0xe6, 0xcf, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(0401) rgbIDEFAULTLANGUAGE[] = { /* "0401" */
+ 0x30, 0x34, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbIDEFAULTCOUNTRY[] = { /* "966" */
+ 0x39, 0x36, 0x36
+};
+
+static BYTE NLSALLOC(0401) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(0401) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0401) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0401) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0401) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0401) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0401) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0401) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0401) rgbSCURRENCY[] = { /* "\x0631.\x0633.\x200f" */
+ 0xd1, 0x2e, 0xd3, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(0401) rgbSINTLSYMBOL[] = { /* "SAR" */
+ 0x53, 0x41, 0x52
+};
+
+static BYTE NLSALLOC(0401) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0401) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0401) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0401) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0401) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0401) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0401) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0401) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0401) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0401) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0401) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0401) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0401) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0401) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0401) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0401) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(0401) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(0401) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(0401) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(0401) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(0401) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0401) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0401) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(0401) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME1[] = { /* "\x0645\x062d\x0631\x0645" */
+ 0xe3, 0xcd, 0xd1, 0xe3
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME2[] = { /* "\x0633\x0641\x0631" */
+ 0xd3, 0xdd, 0xd1
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME3[] = { /* "\x0631\x0628\x064a\x0639 \x0623\x0648\x0644" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME4[] = { /* "\x0631\x0628\x064a\x0639 \x062b\x0627\x0646\x064a" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xcb, 0xc7, 0xe4
+ , 0xed
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME5[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x0623\x0648\x0644" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xc3, 0xe6
+ , 0xe1
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME6[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x062b\x0627\x0646\x064a" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xcb, 0xc7
+ , 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME7[] = { /* "\x0631\x062c\x0628" */
+ 0xd1, 0xcc, 0xc8
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME8[] = { /* "\x0634\x0639\x0628\x0627\x0646" */
+ 0xd4, 0xda, 0xc8, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME9[] = { /* "\x0631\x0645\x0636\x0627\x0646" */
+ 0xd1, 0xe3, 0xd6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME10[] = { /* "\x0634\x0648\x0627\x0644" */
+ 0xd4, 0xe6, 0xc7, 0xe1
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME11[] = { /* "\x0630\x0648 \x0627\x0644\x0642\x0639\x062f\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xde, 0xda, 0xcf
+ , 0xc9
+};
+
+static BYTE NLSALLOC(0401) rgbSMONTHNAME12[] = { /* "\x0630\x0648 \x0627\x0644\x062d\x062c\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xcd, 0xcc, 0xc9
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME1[] = { /* "\x0645\x062d\x0631\x0645" */
+ 0xe3, 0xcd, 0xd1, 0xe3
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME2[] = { /* "\x0633\x0641\x0631" */
+ 0xd3, 0xdd, 0xd1
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME3[] = { /* "\x0631\x0628\x064a\x0639 \x0623\x0648\x0644" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME4[] = { /* "\x0631\x0628\x064a\x0639 \x062b\x0627\x0646\x064a" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xcb, 0xc7, 0xe4
+ , 0xed
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME5[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x0623\x0648\x0644" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xc3, 0xe6
+ , 0xe1
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME6[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x062b\x0627\x0646\x064a" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xcb, 0xc7
+ , 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME7[] = { /* "\x0631\x062c\x0628" */
+ 0xd1, 0xcc, 0xc8
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME8[] = { /* "\x0634\x0639\x0628\x0627\x0646" */
+ 0xd4, 0xda, 0xc8, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME9[] = { /* "\x0631\x0645\x0636\x0627\x0646" */
+ 0xd1, 0xe3, 0xd6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME10[] = { /* "\x0634\x0648\x0627\x0644" */
+ 0xd4, 0xe6, 0xc7, 0xe1
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME11[] = { /* "\x0630\x0648 \x0627\x0644\x0642\x0639\x062f\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xde, 0xda, 0xcf
+ , 0xc9
+};
+
+static BYTE NLSALLOC(0401) rgbSABBREVMONTHNAME12[] = { /* "\x0630\x0648 \x0627\x0644\x062d\x062c\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xcd, 0xcc, 0xc9
+};
+
+static BYTE NLSALLOC(0401) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0401) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0401) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0401) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0401) rgbSENGCOUNTRY[] = { /* "Saudi Arabia" */
+ 0x53, 0x61, 0x75, 0x64, 0x69, 0x20, 0x41, 0x72
+ , 0x61, 0x62, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(0401) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0401) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(0401) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0401) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(0401) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0401) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0401) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0401) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0401) g_rglcinfo0401[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 12, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 24, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 4, rgbSMONTHNAME1 }
+ , { 3, rgbSMONTHNAME2 }
+ , { 8, rgbSMONTHNAME3 }
+ , { 9, rgbSMONTHNAME4 }
+ , { 9, rgbSMONTHNAME5 }
+ , { 10, rgbSMONTHNAME6 }
+ , { 3, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 5, rgbSMONTHNAME9 }
+ , { 4, rgbSMONTHNAME10 }
+ , { 9, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 4, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 8, rgbSABBREVMONTHNAME3 }
+ , { 9, rgbSABBREVMONTHNAME4 }
+ , { 9, rgbSABBREVMONTHNAME5 }
+ , { 10, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 9, rgbSABBREVMONTHNAME11 }
+ , { 8, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 12, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0401) g_strinfo0401 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0403.c b/private/oleauto/src/dispatch/win16/0403.c
new file mode 100644
index 000000000..575db1fe7
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0403.c
@@ -0,0 +1,531 @@
+/****************************************************************************
+* 0403.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Catalan - Spain
+*
+* LCID = 0x0403
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:34:41 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0403) rgbILANGUAGE[] = { /* "0403" */
+ 0x30, 0x34, 0x30, 0x33
+};
+
+static BYTE NLSALLOC(0403) rgbSLANGUAGE[] = { /* "Catalan" */
+ 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVLANGNAME[] = { /* "CAT" */
+ 0x43, 0x41, 0x54
+};
+
+static BYTE NLSALLOC(0403) rgbSNATIVELANGNAME[] = { /* "Català" */
+ 0x43, 0x61, 0x74, 0x61, 0x6c, 0xe0
+};
+
+static BYTE NLSALLOC(0403) rgbICOUNTRY[] = { /* "34" */
+ 0x33, 0x34
+};
+
+static BYTE NLSALLOC(0403) rgbSCOUNTRY[] = { /* "Spain" */
+ 0x53, 0x70, 0x61, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVCTRYNAME[] = { /* "ESP" */
+ 0x45, 0x53, 0x50
+};
+
+static BYTE NLSALLOC(0403) rgbSNATIVECTRYNAME[] = { /* "Espanya" */
+ 0x45, 0x73, 0x70, 0x61, 0x6e, 0x79, 0x61
+};
+
+static BYTE NLSALLOC(0403) rgbIDEFAULTLANGUAGE[] = { /* "040a" */
+ 0x30, 0x34, 0x30, 0x61
+};
+
+static BYTE NLSALLOC(0403) rgbIDEFAULTCOUNTRY[] = { /* "34" */
+ 0x33, 0x34
+};
+
+static BYTE NLSALLOC(0403) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0403) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0403) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0403) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0403) rgbSCURRENCY[] = { /* "PTA" */
+ 0x50, 0x54, 0x41
+};
+
+static BYTE NLSALLOC(0403) rgbSINTLSYMBOL[] = { /* "ESP" */
+ 0x45, 0x53, 0x50
+};
+
+static BYTE NLSALLOC(0403) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbICURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbIINTLCURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0403) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(0403) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0403) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0403) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0403) rgbSLONGDATE[] = { /* "dddd, d' / 'MMMM' / 'yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27
+ , 0x20, 0x2f, 0x20, 0x27, 0x4d, 0x4d, 0x4d, 0x4d
+ , 0x27, 0x20, 0x2f, 0x20, 0x27, 0x79, 0x79, 0x79
+ , 0x79
+};
+
+static BYTE NLSALLOC(0403) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbS1159[] = { /* "0x0000" */
+ 0x30, 0x78, 0x30, 0x30, 0x30, 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbS2359[] = { /* "0x0000" */
+ 0x30, 0x78, 0x30, 0x30, 0x30, 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbSDAYNAME1[] = { /* "dilluns" */
+ 0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73
+};
+
+static BYTE NLSALLOC(0403) rgbSDAYNAME2[] = { /* "dimarts" */
+ 0x64, 0x69, 0x6d, 0x61, 0x72, 0x74, 0x73
+};
+
+static BYTE NLSALLOC(0403) rgbSDAYNAME3[] = { /* "dimecres" */
+ 0x64, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0403) rgbSDAYNAME4[] = { /* "dijous" */
+ 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73
+};
+
+static BYTE NLSALLOC(0403) rgbSDAYNAME5[] = { /* "divendres" */
+ 0x64, 0x69, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65
+ , 0x73
+};
+
+static BYTE NLSALLOC(0403) rgbSDAYNAME6[] = { /* "dissabte" */
+ 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65
+};
+
+static BYTE NLSALLOC(0403) rgbSDAYNAME7[] = { /* "diumenge" */
+ 0x64, 0x69, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVDAYNAME1[] = { /* "dl." */
+ 0x64, 0x6c, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVDAYNAME2[] = { /* "dt." */
+ 0x64, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVDAYNAME3[] = { /* "dc." */
+ 0x64, 0x63, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVDAYNAME4[] = { /* "dj." */
+ 0x64, 0x6a, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVDAYNAME5[] = { /* "dv." */
+ 0x64, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVDAYNAME6[] = { /* "ds." */
+ 0x64, 0x73, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVDAYNAME7[] = { /* "dg." */
+ 0x64, 0x67, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME1[] = { /* "gener" */
+ 0x67, 0x65, 0x6e, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME2[] = { /* "febrer" */
+ 0x66, 0x65, 0x62, 0x72, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME3[] = { /* "març" */
+ 0x6d, 0x61, 0x72, 0xe7
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME4[] = { /* "abril" */
+ 0x61, 0x62, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME5[] = { /* "maig" */
+ 0x6d, 0x61, 0x69, 0x67
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME6[] = { /* "juny" */
+ 0x6a, 0x75, 0x6e, 0x79
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME7[] = { /* "juliol" */
+ 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME8[] = { /* "agost" */
+ 0x61, 0x67, 0x6f, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME9[] = { /* "setembre" */
+ 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME10[] = { /* "octubre" */
+ 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME11[] = { /* "novembre" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0403) rgbSMONTHNAME12[] = { /* "desembre" */
+ 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME1[] = { /* "gen." */
+ 0x67, 0x65, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME2[] = { /* "feb." */
+ 0x66, 0x65, 0x62, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME3[] = { /* "març" */
+ 0x6d, 0x61, 0x72, 0xe7
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME4[] = { /* "abr." */
+ 0x61, 0x62, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME5[] = { /* "maig" */
+ 0x6d, 0x61, 0x69, 0x67
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME6[] = { /* "juny" */
+ 0x6a, 0x75, 0x6e, 0x79
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME7[] = { /* "jul." */
+ 0x6a, 0x75, 0x6c, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME8[] = { /* "ag." */
+ 0x61, 0x67, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME9[] = { /* "set." */
+ 0x73, 0x65, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME10[] = { /* "oct." */
+ 0x6f, 0x63, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME11[] = { /* "nov." */
+ 0x6e, 0x6f, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSABBREVMONTHNAME12[] = { /* "des." */
+ 0x64, 0x65, 0x73, 0x2e
+};
+
+static BYTE NLSALLOC(0403) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0403) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbSENGCOUNTRY[] = { /* "Spain" */
+ 0x53, 0x70, 0x61, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(0403) rgbSENGLANGUAGE[] = { /* "Catalan" */
+ 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0403) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0403) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0403) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0403) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0403) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0403) g_rglcinfo0403[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 7, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 6, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 7, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 25, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 6, rgbS1159 }
+ , { 6, rgbS2359 }
+ , { 7, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 6, rgbSDAYNAME4 }
+ , { 9, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 8, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 6, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 8, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 4, rgbSABBREVMONTHNAME1 }
+ , { 4, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 4, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 4, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 4, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 4, rgbSABBREVMONTHNAME11 }
+ , { 4, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0403) g_strinfo0403 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0404.c b/private/oleauto/src/dispatch/win16/0404.c
new file mode 100644
index 000000000..a722b893a
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0404.c
@@ -0,0 +1,1036 @@
+/***
+*0404.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+* China, Chinese Traditional
+*
+* LCID = 0x0404
+*
+*
+*Generated: 9/22/93 - by hand from lcid_cht.txt
+*
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+#include "nlsdbcs.h"
+
+
+#if 1
+static SORTWEIGHT NLSALLOC(0404) rgsortweight[] = {
+ { 0x0000, 0x0200, 0x00, 0x00 }
+ , { 0x0020, 0x0220, 0x00, 0x02 }
+ , { 0x0030, 0x0930, 0x00, 0x02 }
+ , { 0x003A, 0x023A, 0x00, 0x02 }
+ , { 0x0041, 0x0A41, 0x02, 0x02 }
+ , { 0x005B, 0x025B, 0x00, 0x02 }
+ , { 0x0061, 0x0A41, 0x00, 0x02 }
+ , { 0x007B, 0x027B, 0x00, 0x02 }
+ , { 0x007F, 0x021F, 0x00, 0xFF }
+ , { 0x8140, 0x0C40, 0x00, 0x00 }
+ , { 0xA140, 0x0220, 0x01, 0x02 }
+ , { 0xA141, 0x022C, 0x01, 0x02 }
+ , { 0xA142, 0x0303, 0x00, 0x00 }
+ , { 0xA144, 0x022E, 0x01, 0x02 }
+ , { 0xA145, 0x0306, 0x00, 0x00 }
+ , { 0xA146, 0x023B, 0x01, 0x02 }
+ , { 0xA147, 0x023A, 0x01, 0x02 }
+ , { 0xA148, 0x023F, 0x01, 0x02 }
+ , { 0xA149, 0x0221, 0x01, 0x02 }
+ , { 0xA14A, 0x030B, 0x00, 0x00 }
+ , { 0xA155, 0x027C, 0x01, 0x02 }
+ , { 0xA156, 0x0317, 0x00, 0x00 }
+ , { 0xA15D, 0x0228, 0x01, 0x02 }
+ , { 0xA15E, 0x0229, 0x01, 0x02 }
+ , { 0xA15F, 0x0320, 0x00, 0x00 }
+ , { 0xA161, 0x027B, 0x01, 0x02 }
+ , { 0xA162, 0x027D, 0x01, 0x02 }
+ , { 0xA163, 0x0324, 0x00, 0x00 }
+ , { 0xA165, 0x025B, 0x01, 0x02 }
+ , { 0xA166, 0x025D, 0x01, 0x02 }
+ , { 0xA167, 0x0328, 0x00, 0x00 }
+ , { 0xA173, 0x025E, 0x01, 0x02 }
+ , { 0xA174, 0x0335, 0x00, 0x00 }
+ , { 0xA1A5, 0x0260, 0x01, 0x02 }
+ , { 0xA1A6, 0x0227, 0x01, 0x02 }
+ , { 0xA1A7, 0x0368, 0x00, 0x00 }
+ , { 0xA1A8, 0x0222, 0x01, 0x02 }
+ , { 0xA1A9, 0x036A, 0x00, 0x00 }
+ , { 0xA1AD, 0x0223, 0x01, 0x02 }
+ , { 0xA1AE, 0x0226, 0x01, 0x02 }
+ , { 0xA1AF, 0x022A, 0x01, 0x02 }
+ , { 0xA1B0, 0x0371, 0x00, 0x00 }
+ , { 0xA1C5, 0x025F, 0x01, 0x02 }
+ , { 0xA1C6, 0x0387, 0x00, 0x00 }
+ , { 0xA1CF, 0x022B, 0x01, 0x02 }
+ , { 0xA1D0, 0x022D, 0x01, 0x02 }
+ , { 0xA1D1, 0x0392, 0x00, 0x00 }
+ , { 0xA1D5, 0x023C, 0x01, 0x02 }
+ , { 0xA1D6, 0x023E, 0x01, 0x02 }
+ , { 0xA1D7, 0x023D, 0x01, 0x02 }
+ , { 0xA1D8, 0x0399, 0x00, 0x00 }
+ , { 0xA1E3, 0x027E, 0x01, 0x02 }
+ , { 0xA1E4, 0x03A5, 0x00, 0x00 }
+ , { 0xA1FE, 0x022F, 0x01, 0x02 }
+ , { 0xA240, 0x025C, 0x01, 0x02 }
+ , { 0xA241, 0x0402, 0x00, 0x00 }
+ , { 0xA243, 0x0224, 0x01, 0x02 }
+ , { 0xA244, 0x0405, 0x00, 0x00 }
+ , { 0xA248, 0x0225, 0x01, 0x02 }
+ , { 0xA249, 0x0240, 0x01, 0x02 }
+ , { 0xA24A, 0x040B, 0x00, 0x00 }
+ , { 0xA259, 0x4B02, 0x00, 0x00 }
+ , { 0xA25A, 0x5202, 0x00, 0x00 }
+ , { 0xA25B, 0x5D02, 0x00, 0x00 }
+ , { 0xA25D, 0x6F02, 0x00, 0x00 }
+ , { 0xA25E, 0x8902, 0x00, 0x00 }
+ , { 0xA25F, 0x6F03, 0x00, 0x00 }
+ , { 0xA260, 0x4402, 0x00, 0x00 }
+ , { 0xA261, 0x8002, 0x00, 0x00 }
+ , { 0xA262, 0x0422, 0x00, 0x00 }
+ , { 0xA2AF, 0x0930, 0x01, 0x02 }
+ , { 0xA2B9, 0x0471, 0x00, 0x00 }
+ , { 0xA2CF, 0x0A41, 0x03, 0x02 }
+ , { 0xA2E9, 0x0A41, 0x01, 0x02 }
+ , { 0xA340, 0x0A57, 0x03, 0x02 }
+ , { 0xA344, 0x0544, 0x00, 0x00 }
+ , { 0xA440, 0x3140, 0x00, 0x00 }
+ , { 0xA442, 0x3242, 0x00, 0x00 }
+ , { 0xA454, 0x3454, 0x00, 0x00 }
+ , { 0xA4A1, 0x36A1, 0x00, 0x00 }
+ , { 0xA4FE, 0x38FE, 0x00, 0x00 }
+ , { 0xA5E0, 0x3BE0, 0x00, 0x00 }
+ , { 0xA6EA, 0x3FEA, 0x00, 0x00 }
+ , { 0xA8C3, 0x44C3, 0x00, 0x00 }
+ , { 0xAB45, 0x4B45, 0x00, 0x00 }
+ , { 0xADBC, 0x52BC, 0x00, 0x00 }
+ , { 0xB0AE, 0x5DAE, 0x00, 0x00 }
+ , { 0xB3C3, 0x66C3, 0x00, 0x00 }
+ , { 0xB6C3, 0x6FC3, 0x00, 0x00 }
+ , { 0xB9AC, 0x78AC, 0x00, 0x00 }
+ , { 0xBBF5, 0x80F5, 0x00, 0x00 }
+ , { 0xBEA7, 0x89A7, 0x00, 0x00 }
+ , { 0xC075, 0x9175, 0x00, 0x00 }
+ , { 0xC24F, 0x984F, 0x00, 0x00 }
+ , { 0xC35F, 0x9D5F, 0x00, 0x00 }
+ , { 0xC455, 0xA255, 0x00, 0x00 }
+ , { 0xC4D7, 0xA6D7, 0x00, 0x00 }
+ , { 0xC56B, 0xAA6B, 0x00, 0x00 }
+ , { 0xC5C8, 0xADC8, 0x00, 0x00 }
+ , { 0xC5F1, 0xB0F1, 0x00, 0x00 }
+ , { 0xC655, 0xB355, 0x00, 0x00 }
+ , { 0xC665, 0xB665, 0x00, 0x00 }
+ , { 0xC66C, 0xB86C, 0x00, 0x00 }
+ , { 0xC676, 0xBA76, 0x00, 0x00 }
+ , { 0xC679, 0xBC79, 0x00, 0x00 }
+ , { 0xC67D, 0xBE7D, 0x00, 0x00 }
+ , { 0xC67E, 0xC17E, 0x00, 0x00 }
+ , { 0xC6A1, 0x06A1, 0x00, 0x00 }
+ , { 0xC940, 0x3340, 0x00, 0x00 }
+ , { 0xC945, 0x3545, 0x00, 0x00 }
+ , { 0xC94D, 0x374D, 0x00, 0x00 }
+ , { 0xC963, 0x3A63, 0x00, 0x00 }
+ , { 0xC9AB, 0x3DAB, 0x00, 0x00 }
+ , { 0xCA5A, 0x425A, 0x00, 0x00 }
+ , { 0xCBB1, 0x48B1, 0x00, 0x00 }
+ , { 0xCDDD, 0x4EDD, 0x00, 0x00 }
+ , { 0xD0C8, 0x58C8, 0x00, 0x00 }
+ , { 0xD44B, 0x614B, 0x00, 0x00 }
+ , { 0xD851, 0x6A51, 0x00, 0x00 }
+ , { 0xDCB1, 0x73B1, 0x00, 0x00 }
+ , { 0xE0F0, 0x7BF0, 0x00, 0x00 }
+ , { 0xE4E6, 0x84E6, 0x00, 0x00 }
+ , { 0xE8F4, 0x8CF4, 0x00, 0x00 }
+ , { 0xECB9, 0x94B9, 0x00, 0x00 }
+ , { 0xEFB7, 0x9AB7, 0x00, 0x00 }
+ , { 0xF1EB, 0x9FEB, 0x00, 0x00 }
+ , { 0xF3FD, 0xA3FD, 0x00, 0x00 }
+ , { 0xF5C0, 0xA8C0, 0x00, 0x00 }
+ , { 0xF6D6, 0xABD6, 0x00, 0x00 }
+ , { 0xF7D0, 0xAED0, 0x00, 0x00 }
+ , { 0xF8A5, 0xB2A5, 0x00, 0x00 }
+ , { 0xF8EE, 0xB4EE, 0x00, 0x00 }
+ , { 0xF96B, 0xB76B, 0x00, 0x00 }
+ , { 0xF9A2, 0xB9A2, 0x00, 0x00 }
+ , { 0xF9BA, 0xBBBA, 0x00, 0x00 }
+ , { 0xF9C6, 0xC3C6, 0x00, 0x00 }
+ , { 0xF9C7, 0xBDC7, 0x00, 0x00 }
+ , { 0xF9CC, 0xBFCC, 0x00, 0x00 }
+ , { 0xF9D0, 0xC0D0, 0x00, 0x00 }
+ , { 0xF9D1, 0xC2D1, 0x00, 0x00 }
+ , { 0xF9D2, 0xC4D2, 0x00, 0x00 }
+ , { 0xF9D3, 0xC5D3, 0x00, 0x00 }
+ , { 0xF9D4, 0xC6D4, 0x00, 0x00 }
+ , { 0xF9D5, 0xC7D5, 0x00, 0x00 }
+ , { 0xFA40, 0x2C40, 0x00, 0x00 }
+};
+static MAPTABLE NLSALLOC(0404) rgmaptable[] = {
+ { 0x0220, 0x0001, 0x0020, 0xA140, 0x0020, 0xA140 }
+ , { 0x0221, 0x0001, 0x0021, 0xA149, 0x0021, 0xA149 }
+ , { 0x0222, 0x0001, 0x0022, 0xA1A8, 0x0022, 0xA1A8 }
+ , { 0x0223, 0x0001, 0x0023, 0xA1AD, 0x0023, 0xA1AD }
+ , { 0x0224, 0x0001, 0x0024, 0xA243, 0x0024, 0xA243 }
+ , { 0x0225, 0x0001, 0x0025, 0xA248, 0x0025, 0xA248 }
+ , { 0x0226, 0x0001, 0x0026, 0xA1AE, 0x0026, 0xA1AE }
+ , { 0x0227, 0x0001, 0x0027, 0xA1A6, 0x0027, 0xA1A6 }
+ , { 0x0228, 0x0002, 0x0028, 0xA15D, 0x0028, 0xA15D }
+ , { 0x022A, 0x0001, 0x002A, 0xA1AF, 0x002A, 0xA1AF }
+ , { 0x022B, 0x0001, 0x002B, 0xA1CF, 0x002B, 0xA1CF }
+ , { 0x022C, 0x0001, 0x002C, 0xA141, 0x002C, 0xA141 }
+ , { 0x022D, 0x0001, 0x002D, 0xA1D0, 0x002D, 0xA1D0 }
+ , { 0x022E, 0x0001, 0x002E, 0xA144, 0x002E, 0xA144 }
+ , { 0x022F, 0x0001, 0x002F, 0xA1FE, 0x002F, 0xA1FE }
+ , { 0x023A, 0x0001, 0x003A, 0xA147, 0x003A, 0xA147 }
+ , { 0x023B, 0x0001, 0x003B, 0xA146, 0x003B, 0xA146 }
+ , { 0x023C, 0x0001, 0x003C, 0xA1D5, 0x003C, 0xA1D5 }
+ , { 0x023D, 0x0001, 0x003D, 0xA1D7, 0x003D, 0xA1D7 }
+ , { 0x023E, 0x0001, 0x003E, 0xA1D6, 0x003E, 0xA1D6 }
+ , { 0x023F, 0x0001, 0x003F, 0xA148, 0x003F, 0xA148 }
+ , { 0x0240, 0x0001, 0x0040, 0xA249, 0x0040, 0xA249 }
+ , { 0x025B, 0x0001, 0x005B, 0xA165, 0x005B, 0xA165 }
+ , { 0x025C, 0x0001, 0x005C, 0xA240, 0x005C, 0xA240 }
+ , { 0x025D, 0x0001, 0x005D, 0xA166, 0x005D, 0xA166 }
+ , { 0x025E, 0x0001, 0x005E, 0xA173, 0x005E, 0xA173 }
+ , { 0x025F, 0x0001, 0x005F, 0xA1C5, 0x005F, 0xA1C5 }
+ , { 0x0260, 0x0001, 0x0060, 0xA1A5, 0x0060, 0xA1A5 }
+ , { 0x027B, 0x0001, 0x007B, 0xA161, 0x007B, 0xA161 }
+ , { 0x027C, 0x0001, 0x007C, 0xA155, 0x007C, 0xA155 }
+ , { 0x027D, 0x0001, 0x007D, 0xA162, 0x007D, 0xA162 }
+ , { 0x027E, 0x0001, 0x007E, 0xA1E3, 0x007E, 0xA1E3 }
+ , { 0x0930, 0x000A, 0x0030, 0xA2AF, 0x0030, 0xA2AF }
+ , { 0x0A41, 0x0016, 0x0041, 0xA2CF, 0x0061, 0xA2E9 }
+ , { 0x0A57, 0x0004, 0x0057, 0xA2E5, 0x0077, 0xA340 }
+};
+static TYPETABLE NLSALLOC(0404) rgtypetable[] = {
+ { 0x0000, 0x0020, 0x00, 0x00 }
+ , { 0x0009, 0x0068, 0x09, 0x00 }
+ , { 0x000A, 0x0028, 0x00, 0x00 }
+ , { 0x000E, 0x0020, 0x00, 0x00 }
+ , { 0x0020, 0x0048, 0x0A, 0x00 }
+ , { 0x0021, 0x0010, 0x0B, 0x08 }
+ , { 0x0024, 0x0010, 0x05, 0x08 }
+ , { 0x0026, 0x0010, 0x01, 0x08 }
+ , { 0x002B, 0x0010, 0x05, 0x08 }
+ , { 0x002C, 0x0010, 0x07, 0x08 }
+ , { 0x002D, 0x0010, 0x05, 0x08 }
+ , { 0x002E, 0x0010, 0x03, 0x08 }
+ , { 0x0030, 0x0084, 0x03, 0x00 }
+ , { 0x003A, 0x0010, 0x07, 0x08 }
+ , { 0x003B, 0x0010, 0x0B, 0x08 }
+ , { 0x0040, 0x0010, 0x01, 0x08 }
+ , { 0x0041, 0x0181, 0x01, 0x00 }
+ , { 0x0047, 0x0101, 0x01, 0x00 }
+ , { 0x005B, 0x0010, 0x0B, 0x08 }
+ , { 0x0061, 0x0182, 0x01, 0x00 }
+ , { 0x0067, 0x0102, 0x01, 0x00 }
+ , { 0x007B, 0x0010, 0x0B, 0x08 }
+ , { 0x007F, 0x0020, 0x00, 0x00 }
+ , { 0x0080, 0x0000, 0x00, 0x00 }
+ , { 0x8140, 0x0100, 0x01, 0x00 }
+ , { 0xA140, 0x0048, 0x0A, 0x00 }
+ , { 0xA141, 0x0010, 0x07, 0x08 }
+ , { 0xA142, 0x0010, 0x0B, 0x08 }
+ , { 0xA155, 0x0000, 0x0B, 0x08 }
+ , { 0xA2AF, 0x0084, 0x03, 0x00 }
+ , { 0xA2B9, 0x0000, 0x0B, 0x08 }
+ , { 0xA2CF, 0x0181, 0x01, 0x00 }
+ , { 0xA2D5, 0x0101, 0x01, 0x00 }
+ , { 0xA2E9, 0x0182, 0x01, 0x00 }
+ , { 0xA2EF, 0x0102, 0x01, 0x00 }
+ , { 0xA344, 0x0181, 0x01, 0x00 }
+ , { 0xA346, 0x0000, 0x0B, 0x08 }
+ , { 0xA440, 0x0100, 0x01, 0x00 }
+ , { 0xC6A1, 0x0000, 0x0B, 0x08 }
+ , { 0xC940, 0x0100, 0x01, 0x00 }
+};
+#else
+static unsigned char NLSALLOC(0404) rgsortweight[] = {
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00
+ , 0x20, 0x00, 0x20, 0x02, 0x00, 0x02
+ , 0x30, 0x00, 0x30, 0x09, 0x00, 0x02
+ , 0x3A, 0x00, 0x3A, 0x02, 0x00, 0x02
+ , 0x41, 0x00, 0x41, 0x0a, 0x00, 0x02
+ , 0x5B, 0x00, 0x5B, 0x02, 0x00, 0x02
+ , 0x61, 0x00, 0x41, 0x0a, 0x02, 0x02
+ , 0x7B, 0x00, 0x7B, 0x02, 0x00, 0x02
+ , 0x7F, 0x00, 0x1F, 0x02, 0x00, 0xFF
+ , 0x40, 0x81, 0x40, 0x0C, 0x00, 0x00
+ , 0x40, 0xA1, 0x20, 0x02, 0x01, 0x02
+ , 0x41, 0xA1, 0x2C, 0x02, 0x01, 0x02
+ , 0x42, 0xA1, 0x03, 0x03, 0x00, 0x00
+ , 0x44, 0xA1, 0x2E, 0x02, 0x01, 0x02
+ , 0X45, 0xA1, 0x06, 0x03, 0x00, 0x00
+ , 0x46, 0xA1, 0x3B, 0x02, 0x01, 0x02
+ , 0x47, 0xA1, 0x3A, 0x02, 0x01, 0x02
+ , 0x48, 0xA1, 0x3F, 0x02, 0x01, 0x02
+ , 0x49, 0xA1, 0x21, 0x02, 0x01, 0x02
+ , 0X4A, 0xA1, 0x0B, 0x03, 0x00, 0x00
+ , 0x55, 0xA1, 0x7C, 0x02, 0x01, 0x02
+ , 0X56, 0xA1, 0x17, 0x03, 0x00, 0x00
+ , 0x5D, 0xA1, 0x28, 0x02, 0x01, 0x02
+ , 0x5E, 0xA1, 0x29, 0x02, 0x01, 0x02
+ , 0X5F, 0xA1, 0x20, 0x03, 0x00, 0x00
+ , 0x61, 0xA1, 0x7B, 0x02, 0x01, 0x02
+ , 0x62, 0xA1, 0x7D, 0x02, 0x01, 0x02
+ , 0X63, 0xA1, 0x24, 0x03, 0x00, 0x00
+ , 0x65, 0xA1, 0x5B, 0x02, 0x01, 0x02
+ , 0x66, 0xA1, 0x5D, 0x02, 0x01, 0x02
+ , 0X67, 0xA1, 0x28, 0x03, 0x00, 0x00
+ , 0x73, 0xA1, 0x5E, 0x02, 0x01, 0x02
+ , 0X74, 0xA1, 0x35, 0x03, 0x00, 0x00
+ , 0xA5, 0xA1, 0x60, 0x02, 0x01, 0x02
+ , 0xA6, 0xA1, 0x27, 0x02, 0x01, 0x02
+ , 0XA7, 0xA1, 0x68, 0x03, 0x00, 0x00
+ , 0xA8, 0xA1, 0x22, 0x02, 0x01, 0x02
+ , 0XA9, 0xA1, 0x6A, 0x03, 0x00, 0x00
+ , 0xAD, 0xA1, 0x23, 0x02, 0x01, 0x02
+ , 0xAE, 0xA1, 0x26, 0x02, 0x01, 0x02
+ , 0xAF, 0xA1, 0x2A, 0x02, 0x01, 0x02
+ , 0XB0, 0xA1, 0x71, 0x03, 0x00, 0x00
+ , 0xC5, 0xA1, 0x5F, 0x02, 0x01, 0x02
+ , 0XC6, 0xA1, 0x87, 0x03, 0x00, 0x00
+ , 0xCF, 0xA1, 0x2B, 0x02, 0x01, 0x02
+ , 0xD0, 0xA1, 0x2D, 0x02, 0x01, 0x02
+ , 0XD1, 0xA1, 0x92, 0x03, 0x00, 0x00
+ , 0xD5, 0xA1, 0x3C, 0x02, 0x01, 0x02
+ , 0xD6, 0xA1, 0x3E, 0x02, 0x01, 0x02
+ , 0xD7, 0xA1, 0x3D, 0x02, 0x01, 0x02
+ , 0XD8, 0xA1, 0x99, 0x03, 0x00, 0x00
+ , 0xE3, 0xA1, 0x7E, 0x02, 0x01, 0x02
+ , 0XE4, 0xA1, 0xA5, 0x03, 0x00, 0x00
+ , 0xFE, 0xA1, 0x2F, 0x02, 0x01, 0x02
+ , 0x40, 0xA2, 0x5C, 0x02, 0x01, 0x02
+ , 0X41, 0xA2, 0x02, 0x04, 0x00, 0x00
+ , 0x43, 0xA2, 0x24, 0x02, 0x01, 0x02
+ , 0X44, 0xA2, 0x05, 0x04, 0x00, 0x00
+ , 0x48, 0xA2, 0x25, 0x02, 0x01, 0x02
+ , 0x49, 0xA2, 0x40, 0x02, 0x01, 0x02
+ , 0x4A, 0xA2, 0x0B, 0x04, 0x00, 0x00
+ , 0x59, 0xA2, 0x02, 0x4B, 0x00, 0x00
+ , 0x5A, 0xA2, 0x02, 0x52, 0x00, 0x00
+ , 0x5B, 0xA2, 0x02, 0x5D, 0x00, 0x00
+ , 0x5D, 0xA2, 0x02, 0x6F, 0x00, 0x00
+ , 0x5E, 0xA2, 0x02, 0x89, 0x00, 0x00
+ , 0x5F, 0xA2, 0x03, 0x6F, 0x00, 0x00
+ , 0x60, 0xA2, 0x02, 0x44, 0x00, 0x00
+ , 0x61, 0xA2, 0x02, 0x80, 0x00, 0x00
+ , 0x62, 0xA2, 0x22, 0x04, 0x00, 0x00
+ , 0xAF, 0xA2, 0x30, 0x09, 0x01, 0x02
+ , 0xB9, 0xA2, 0x71, 0x04, 0x00, 0x00
+ , 0xCF, 0xA2, 0x41, 0x0A, 0x01, 0x02
+ , 0xE9, 0xA2, 0x41, 0x0A, 0x03, 0x02
+ , 0x40, 0xA3, 0x57, 0x0A, 0x03, 0x02
+ , 0x44, 0xA3, 0x44, 0x05, 0x00, 0x00
+ , 0x40, 0xA4, 0x40, 0x31, 0x00, 0x00
+ , 0x42, 0xA4, 0x42, 0x32, 0x00, 0x00
+ , 0x54, 0xA4, 0x54, 0x34, 0x00, 0x00
+ , 0xA1, 0xA4, 0xA1, 0x36, 0x00, 0x00
+ , 0xFE, 0xA4, 0xFE, 0x38, 0x00, 0x00
+ , 0xE0, 0xA5, 0xE0, 0x3B, 0x00, 0x00
+ , 0xEA, 0xA6, 0xEA, 0x3F, 0x00, 0x00
+ , 0xC3, 0xA8, 0xC3, 0x44, 0x00, 0x00
+ , 0x45, 0xAB, 0x45, 0x4B, 0x00, 0x00
+ , 0xBC, 0xAD, 0xBC, 0x52, 0x00, 0x00
+ , 0xAE, 0xB0, 0xAE, 0x5D, 0x00, 0x00
+ , 0xC3, 0xB3, 0xC3, 0x66, 0x00, 0x00
+ , 0xC3, 0xB6, 0xC3, 0x6F, 0x00, 0x00
+ , 0xAC, 0xB9, 0xAC, 0x78, 0x00, 0x00
+ , 0xF5, 0xBB, 0xF5, 0x80, 0x00, 0x00
+ , 0xA7, 0xBE, 0xA7, 0x89, 0x00, 0x00
+ , 0x75, 0xC0, 0x75, 0x91, 0x00, 0x00
+ , 0x4F, 0xC2, 0x4F, 0x98, 0x00, 0x00
+ , 0x5F, 0xC3, 0x5F, 0x9D, 0x00, 0x00
+ , 0x55, 0xC4, 0x55, 0xA2, 0x00, 0x00
+ , 0xD7, 0xC4, 0xD7, 0xA6, 0x00, 0x00
+ , 0x6B, 0xC5, 0x6B, 0xAA, 0x00, 0x00
+ , 0xC8, 0xC5, 0xC8, 0xAD, 0x00, 0x00
+ , 0xF1, 0xC5, 0xF1, 0xB0, 0x00, 0x00
+ , 0x55, 0xC6, 0x55, 0xB3, 0x00, 0x00
+ , 0x65, 0xC6, 0x65, 0xB6, 0x00, 0x00
+ , 0x6C, 0xC6, 0x6C, 0xB8, 0x00, 0x00
+ , 0x76, 0xC6, 0x76, 0xBA, 0x00, 0x00
+ , 0x79, 0xC6, 0x79, 0xBC, 0x00, 0x00
+ , 0x7D, 0xC6, 0x7D, 0xBE, 0x00, 0x00
+ , 0x7E, 0xC6, 0x7E, 0xC1, 0x00, 0x00
+ , 0xA1, 0xC6, 0xA1, 0x06, 0x00, 0x00
+ , 0x40, 0xC9, 0x40, 0x33, 0x00, 0x00
+ , 0x45, 0xC9, 0x45, 0x35, 0x00, 0x00
+ , 0x4D, 0xC9, 0x4D, 0x37, 0x00, 0x00
+ , 0x63, 0xC9, 0x63, 0x3A, 0x00, 0x00
+ , 0xAB, 0xC9, 0xAB, 0x3D, 0x00, 0x00
+ , 0x5A, 0xCA, 0x5A, 0x42, 0x00, 0x00
+ , 0xB1, 0xCB, 0xB1, 0x48, 0x00, 0x00
+ , 0xDD, 0xCD, 0xDD, 0x4E, 0x00, 0x00
+ , 0xC8, 0xD0, 0xC8, 0x58, 0x00, 0x00
+ , 0x4B, 0xD4, 0x4B, 0x61, 0x00, 0x00
+ , 0x51, 0xD8, 0x51, 0x6A, 0x00, 0x00
+ , 0xB1, 0xDC, 0xB1, 0x73, 0x00, 0x00
+ , 0xF0, 0xE0, 0xF0, 0x7B, 0x00, 0x00
+ , 0xE6, 0xE4, 0xE6, 0x84, 0x00, 0x00
+ , 0xF4, 0xE8, 0xF4, 0x8C, 0x00, 0x00
+ , 0xB9, 0xEC, 0xB9, 0x94, 0x00, 0x00
+ , 0xB7, 0xEF, 0xB7, 0x9A, 0x00, 0x00
+ , 0xEB, 0xF1, 0xEB, 0x9F, 0x00, 0x00
+ , 0xFD, 0xF3, 0xFD, 0xA3, 0x00, 0x00
+ , 0xC0, 0xF5, 0xC0, 0xA8, 0x00, 0x00
+ , 0xD6, 0xF6, 0xD6, 0xAB, 0x00, 0x00
+ , 0xD0, 0xF7, 0xD0, 0xAE, 0x00, 0x00
+ , 0xA5, 0xF8, 0xA5, 0xB2, 0x00, 0x00
+ , 0xEE, 0xF8, 0xEE, 0xB4, 0x00, 0x00
+ , 0x6B, 0xF9, 0x6B, 0xB7, 0x00, 0x00
+ , 0xA2, 0xF9, 0xA2, 0xB9, 0x00, 0x00
+ , 0xBA, 0xF9, 0xBA, 0xBB, 0x00, 0x00
+ , 0xC6, 0xF9, 0xC6, 0xC3, 0x00, 0x00
+ , 0xC7, 0xF9, 0xC7, 0xBD, 0x00, 0x00
+ , 0xCC, 0xF9, 0xCC, 0xBF, 0x00, 0x00
+ , 0xD0, 0xF9, 0xD0, 0xC0, 0x00, 0x00
+ , 0xD1, 0xF9, 0xD1, 0xC2, 0x00, 0x00
+ , 0xD2, 0xF9, 0xD2, 0xC4, 0x00, 0x00
+ , 0xD3, 0xF9, 0xD3, 0xC5, 0x00, 0x00
+ , 0xD4, 0xF9, 0xD4, 0xC6, 0x00, 0x00
+ , 0xD5, 0xF9, 0xD5, 0xC7, 0x00, 0x00
+ , 0x40, 0xFA, 0x40, 0x2C, 0x00, 0x00
+};
+
+static unsigned char NLSALLOC(0404) rgmaptable[] = {
+ 0x20, 0x02, 0x01, 0x00, 0x20, 0x00
+ , 0x40, 0xA1, 0x20, 0x00, 0x40, 0xA1
+ , 0x21, 0x02, 0x01, 0x00, 0x21, 0x00
+ , 0x49, 0xA1, 0x21, 0x00, 0x49, 0xA1
+ , 0x22, 0x02, 0x01, 0x00, 0x22, 0x00
+ , 0xA8, 0xA1, 0x22, 0x00, 0xA8, 0xA1
+ , 0x23, 0x02, 0x01, 0x00, 0x23, 0x00
+ , 0xAD, 0xA1, 0x23, 0x00, 0xAD, 0xA1
+ , 0x24, 0x02, 0x01, 0x00, 0x24, 0x00
+ , 0x43, 0xA2, 0x24, 0x00, 0x43, 0xA2
+ , 0x25, 0x02, 0x01, 0x00, 0x25, 0x00
+ , 0x48, 0xA2, 0x25, 0x00, 0x48, 0xA2
+ , 0x26, 0x02, 0x01, 0x00, 0x26, 0x00
+ , 0xAE, 0xA1, 0x26, 0x00, 0xAE, 0xA1
+ , 0x27, 0x02, 0x01, 0x00, 0x27, 0x00
+ , 0xA6, 0xA1, 0x27, 0x00, 0xA6, 0xA1
+ , 0x28, 0x02, 0x02, 0x00, 0x28, 0x00
+ , 0x5D, 0xA1, 0x28, 0x00, 0x5D, 0xA1
+ , 0x2A, 0x02, 0x01, 0x00, 0x2A, 0x00
+ , 0xAF, 0xA1, 0x2A, 0x00, 0xAF, 0xA1
+ , 0x2B, 0x02, 0x01, 0x00, 0x2B, 0x00
+ , 0xCF, 0xA1, 0x2B, 0x00, 0xCF, 0xA1
+ , 0x2C, 0x02, 0x01, 0x00, 0x2C, 0x00
+ , 0x41, 0xA1, 0x2C, 0x00, 0x41, 0xA1
+ , 0x2D, 0x02, 0x01, 0x00, 0x2D, 0x00
+ , 0xD0, 0xA1, 0x2D, 0x00, 0xD0, 0xA1
+ , 0x2E, 0x02, 0x01, 0x00, 0x2E, 0x00
+ , 0x44, 0xA1, 0x2E, 0x00, 0x44, 0xA1
+ , 0x2F, 0x02, 0x01, 0x00, 0x2F, 0x00
+ , 0xFE, 0xA1, 0x2F, 0x00, 0xFE, 0xA1
+ , 0x3A, 0x02, 0x01, 0x00, 0x3A, 0x00
+ , 0x47, 0xA1, 0x3A, 0x00, 0x47, 0xA1
+ , 0x3B, 0x02, 0x01, 0x00, 0x3B, 0x00
+ , 0x46, 0xA1, 0x3B, 0x00, 0x46, 0xA1
+ , 0x3C, 0x02, 0x01, 0x00, 0x3C, 0x00
+ , 0xD5, 0xA1, 0x3C, 0x00, 0xD5, 0xA1
+ , 0x3D, 0x02, 0x01, 0x00, 0x3D, 0x00
+ , 0xD7, 0xA1, 0x3D, 0x00, 0xD7, 0xA1
+ , 0x3E, 0x02, 0x01, 0x00, 0x3E, 0x00
+ , 0xD6, 0xA1, 0x3E, 0x00, 0xD6, 0xA1
+ , 0x3F, 0x02, 0x01, 0x00, 0x3F, 0x00
+ , 0x48, 0xA1, 0x3F, 0x00, 0x48, 0xA1
+ , 0x40, 0x02, 0x01, 0x00, 0x40, 0x00
+ , 0x49, 0xA2, 0x40, 0x00, 0x49, 0xA2
+ , 0x5B, 0x02, 0x01, 0x00, 0x5B, 0x00
+ , 0x65, 0xA1, 0x5B, 0x00, 0x65, 0xA1
+ , 0x5C, 0x02, 0x01, 0x00, 0x5C, 0x00
+ , 0x40, 0xA2, 0x5C, 0x00, 0x40, 0xA2
+ , 0x5D, 0x02, 0x01, 0x00, 0x5D, 0x00
+ , 0x66, 0xA1, 0x5D, 0x00, 0x66, 0xA1
+ , 0x5E, 0x02, 0x01, 0x00, 0x5E, 0x00
+ , 0x73, 0xA1, 0x5E, 0x00, 0x73, 0xA1
+ , 0x5F, 0x02, 0x01, 0x00, 0x5F, 0x00
+ , 0xC5, 0xA1, 0x5F, 0x00, 0xC5, 0xA1
+ , 0x60, 0x02, 0x01, 0x00, 0x60, 0x00
+ , 0xA5, 0xA1, 0x60, 0x00, 0xA5, 0xA1
+ , 0x7B, 0x02, 0x01, 0x00, 0x7B, 0x00
+ , 0x61, 0xA1, 0x7B, 0x00, 0x61, 0xA1
+ , 0x7C, 0x02, 0x01, 0x00, 0x7C, 0x00
+ , 0x55, 0xA1, 0x7C, 0x00, 0x55, 0xA1
+ , 0x7D, 0x02, 0x01, 0x00, 0x7D, 0x00
+ , 0x62, 0xA1, 0x7D, 0x00, 0x62, 0xA1
+ , 0x7E, 0x02, 0x01, 0x00, 0x7E, 0x00
+ , 0xE3, 0xA1, 0x7E, 0x00, 0xE3, 0xA1
+ , 0x30, 0x09, 0x0A, 0x00, 0x30, 0x00
+ , 0xAF, 0xA2, 0x30, 0x00, 0xAF, 0xA2
+ , 0x41, 0x0A, 0x16, 0x00, 0x41, 0x00
+ , 0xCF, 0xA2, 0x61, 0x00, 0xE9, 0xA2
+ , 0x57, 0x0A, 0x04, 0x00, 0x57, 0x00
+ , 0xE5, 0xA2, 0x77, 0x00, 0x40, 0xA3
+};
+
+static unsigned char NLSALLOC(0404) rgtypetable[] = {
+ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00
+ , 0x09, 0x00, 0x68, 0x00, 0x09, 0x00
+ , 0x0A, 0x00, 0x28, 0x00, 0x00, 0x00
+ , 0x0E, 0x00, 0x20, 0x00, 0x00, 0x00
+ , 0x20, 0x00, 0x48, 0x00, 0x0A, 0x00
+ , 0x21, 0x00, 0x10, 0x00, 0x0B, 0x08
+ , 0x24, 0x00, 0x10, 0x00, 0x05, 0x08
+ , 0x26, 0x00, 0x10, 0x00, 0x01, 0x08
+ , 0x2B, 0x00, 0x10, 0x00, 0x05, 0x08
+ , 0x2C, 0x00, 0x10, 0x00, 0x07, 0x08
+ , 0x2D, 0x00, 0x10, 0x00, 0x05, 0x08
+ , 0x2E, 0x00, 0x10, 0x00, 0x03, 0x08
+ , 0x30, 0x00, 0x84, 0x00, 0x03, 0x00
+ , 0x3A, 0x00, 0x10, 0x00, 0x07, 0x08
+ , 0x3B, 0x00, 0x10, 0x00, 0x0B, 0x08
+ , 0x40, 0x00, 0x10, 0x00, 0x01, 0x08
+ , 0x41, 0x00, 0x81, 0x01, 0x01, 0x00
+ , 0x47, 0x00, 0x01, 0x01, 0x01, 0x00
+ , 0x5B, 0x00, 0x10, 0x00, 0x0B, 0x08
+ , 0x61, 0x00, 0x82, 0x01, 0x01, 0x00
+ , 0x67, 0x00, 0x02, 0x01, 0x01, 0x00
+ , 0x7B, 0x00, 0x10, 0x00, 0x0B, 0x08
+ , 0x7F, 0x00, 0x20, 0x00, 0x00, 0x00
+ , 0x80, 0x00, 0x00, 0x00, 0x00, 0x00
+ , 0x40, 0x81, 0x00, 0x01, 0x01, 0x00
+ , 0x40, 0xA1, 0x48, 0x00, 0x0A, 0x00
+ , 0x41, 0xA1, 0x10, 0x00, 0x07, 0x08
+ , 0x42, 0xA1, 0x10, 0x00, 0x0B, 0x08
+ , 0x55, 0xA1, 0x00, 0x00, 0x0B, 0x08
+ , 0xAF, 0xA2, 0x84, 0x00, 0x03, 0x00
+ , 0xB9, 0xA2, 0x00, 0x00, 0x0B, 0x08
+ , 0xCF, 0xA2, 0x81, 0x01, 0x01, 0x00
+ , 0xD5, 0xA2, 0x01, 0x01, 0x01, 0x00
+ , 0xE9, 0xA2, 0x82, 0x01, 0x01, 0x00
+ , 0xEF, 0xA2, 0x02, 0x01, 0x01, 0x00
+ , 0x44, 0xA3, 0x81, 0x01, 0x01, 0x00
+ , 0x46, 0xA3, 0x00, 0x00, 0x0B, 0x08
+ , 0x40, 0xA4, 0x00, 0x01, 0x01, 0x00
+ , 0xA1, 0xC6, 0x00, 0x00, 0x0B, 0x08
+ , 0x40, 0xC9, 0x00, 0x01, 0x01, 0x00
+};
+#endif
+
+static unsigned char NLSALLOC(0404) rgbSENGCOUNTRY[] = {
+ 'T', 'a', 'i', 'w', 'a', 'n'
+};
+
+static unsigned char NLSALLOC(0404) rgbSENGLANGUAGE[] = {
+ 'C', 'h', 'i', 'n', 'e', 's', 'e'
+};
+
+#if defined(VBA2) //hand-edited this locale info based on daytona [bassam]
+static BYTE NLSALLOC(0404) rgbIFIRSTDAYOFWEEK[] = { /* "6" */
+ 0x36
+};
+
+static BYTE NLSALLOC(0404) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0404) rgbIDEFAULTANSICODEPAGE[] = { /* "950" */
+ 0x39, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0404) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0404) rgbSTIMEFORMAT[] = { /* "tt h:mm:ss" */
+ 0x74, 0x74, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0404) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0404) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0404) rgbIOPTIONALCALENDAR[] = { /* "2" */
+ 0x32
+};
+#endif
+
+
+
+static unsigned char NLSALLOC(0404) rgbILANGUAGE[] = {
+ '0', '4', '0', '4'
+};
+
+static unsigned char NLSALLOC(0404) rgbSLANGUAGE[] = {
+ 0xa4, 0xa4, 0xa4, 0xe5, '(', 'C', 'h', 'i', 'n', 'e', 's', 'e', ' ', 'T', 'r', 'a', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', ')'
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVLANGNAME[] = {
+ 'C', 'H', 'T'
+};
+
+static unsigned char NLSALLOC(0404) rgbSNATIVELANGNAME[] = {
+ 0xa4, 0xa4, 0xa4, 0xe5
+};
+
+static unsigned char NLSALLOC(0404) rgbICOUNTRY[] = {
+ '8', '8', '6'
+};
+
+static unsigned char NLSALLOC(0404) rgbSCOUNTRY[] = {
+ 0xa4, 0xa4, 0xb5, 0xd8, 0xa5, 0xc1, 0xb0, 0xea,
+ '(', 'T', 'a', 'i', 'w', 'a', 'n', ')'
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVCTRYNAME[] = {
+ 'T', 'W', 'N'
+};
+
+static unsigned char NLSALLOC(0404) rgbSNATIVECTRYNAME[] = {
+ 0xa4, 0xa4, 0xb5, 0xd8, 0xa5, 0xc1, 0xb0, 0xea
+};
+
+static unsigned char NLSALLOC(0404) rgbIDEFAULTLANGUAGE[] = {
+ '0', '4', '0', '4'
+};
+
+static unsigned char NLSALLOC(0404) rgbIDEFAULTCOUNTRY[] = {
+ '8', '8', '6'
+};
+
+static unsigned char NLSALLOC(0404) rgbIDEFAULTCODEPAGE[] = {
+ '9', '5', '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbSLIST[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0404) rgbIMEASURE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbSDECIMAL[] = {
+ '.'
+};
+
+static unsigned char NLSALLOC(0404) rgbSTHOUSAND[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0404) rgbSGROUPING[] = {
+ '3', ';', '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbIDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0404) rgbILZERO[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0404) rgbSNATIVEDIGITS[] = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
+};
+
+static unsigned char NLSALLOC(0404) rgbSCURRENCY[] = {
+ 'N', 'T', '$'
+};
+
+static unsigned char NLSALLOC(0404) rgbSINTLSYMBOL[] = {
+ 'T', 'W', 'D'
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONDECIMALSEP[] = {
+ '.'
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHOUSANDSEP[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONGROUPING[] = {
+ '3', ';', '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbICURRDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0404) rgbIINTLCURRDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0404) rgbICURRENCY[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbINEGCURR[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbSDATE[] = {
+ '/'
+};
+
+static unsigned char NLSALLOC(0404) rgbSTIME[] = {
+ ':'
+};
+
+static unsigned char NLSALLOC(0404) rgbSSHORTDATE[] = {
+ 'y', 'y', 'y', 'y', '/', 'M', '/', 'd'
+};
+
+static unsigned char NLSALLOC(0404) rgbSLONGDATE[] = {
+ 'd', 'd', 'd', 'd', ' ',
+ 'y', 'y', 'y', 'y', ' ',
+ 'M', 'M', ' ',
+ 'd', 'd'
+};
+
+static unsigned char NLSALLOC(0404) rgbIDATE[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0404) rgbILDATE[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0404) rgbITIME[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbICENTURY[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbITLZERO[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbIDAYLZERO[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbIMONLZERO[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbS1159[] = {
+ 0xa4, 0x57, 0xa4, 0xc8
+};
+
+static unsigned char NLSALLOC(0404) rgbS2359[] = {
+ 0xa4, 0x55, 0xa4, 0xc8
+};
+
+static unsigned char NLSALLOC(0404) rgbSDAYNAME1[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0x40
+};
+
+static unsigned char NLSALLOC(0404) rgbSDAYNAME2[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0x47
+};
+
+static unsigned char NLSALLOC(0404) rgbSDAYNAME3[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0x54
+};
+
+static unsigned char NLSALLOC(0404) rgbSDAYNAME4[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa5, 0x7c
+};
+
+static unsigned char NLSALLOC(0404) rgbSDAYNAME5[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0xad
+};
+
+static unsigned char NLSALLOC(0404) rgbSDAYNAME6[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0xbb
+};
+
+static unsigned char NLSALLOC(0404) rgbSDAYNAME7[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0xe9
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVDAYNAME1[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0x40
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVDAYNAME2[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0x47
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVDAYNAME3[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0x54
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVDAYNAME4[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa5, 0x7c
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVDAYNAME5[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0xad
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVDAYNAME6[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0xbb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVDAYNAME7[] = {
+ 0xac, 0x50, 0xb4, 0xc1, 0xa4, 0xe9
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME1[] = {
+ 0xa4, 0x40, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME2[] = {
+ 0xa4, 0x47, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME3[] = {
+ 0xa4, 0x54, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME4[] = {
+ 0xa5, 0x7c, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME5[] = {
+ 0xa4, 0xad, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME6[] = {
+ 0xa4, 0xbb, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME7[] = {
+ 0xa4, 0x43, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME8[] = {
+ 0xa4, 0x4b, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME9[] = {
+ 0xa4, 0x45, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME10[] = {
+ 0xa4, 0x51, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME11[] = {
+ 0xa4, 0x51, 0xa4, 0x40, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSMONTHNAME12[] = {
+ 0xa4, 0x51, 0xa4, 0x47, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME1[] = {
+ 0xa4, 0x40, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME2[] = {
+ 0xa4, 0x47, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME3[] = {
+ 0xa4, 0x54, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME4[] = {
+ 0xa5, 0x7c, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME5[] = {
+ 0xa4, 0xad, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME6[] = {
+ 0xa4, 0xbb, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME7[] = {
+ 0xa4, 0x43, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME8[] = {
+ 0xa4, 0x4b, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME9[] = {
+ 0xa4, 0x45, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME10[] = {
+ 0xa4, 0x51, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME11[] = {
+ 0xa4, 0x51, 0xa4, 0x40, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSABBREVMONTHNAME12[] = {
+ 0xa4, 0x51, 0xa4, 0x47, 0xa4, 0xeb
+};
+
+static unsigned char NLSALLOC(0404) rgbSNEGATIVESIGN[] = {
+ '-'
+};
+
+static unsigned char NLSALLOC(0404) rgbIPOSSIGNPOSN[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0404) rgbINEGSIGNPOSN[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0404) rgbIPOSSYMPRECEDES[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0404) rgbIPOSSEPBYSPACE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0404) rgbINEGSYMPRECEDES[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0404) rgbINEGSEPBYSPACE[] = {
+ '0'
+};
+
+#define LCINFODAT(X) { DIM(X), (X) }
+LCINFO NLSALLOC(0404) g_rglcinfo0404[] = {
+ { 0, NULL}
+ , LCINFODAT(rgbILANGUAGE)
+ , LCINFODAT(rgbSLANGUAGE)
+ , LCINFODAT(rgbSABBREVLANGNAME)
+ , LCINFODAT(rgbSNATIVELANGNAME)
+ , LCINFODAT(rgbICOUNTRY)
+ , LCINFODAT(rgbSCOUNTRY)
+ , LCINFODAT(rgbSABBREVCTRYNAME)
+ , LCINFODAT(rgbSNATIVECTRYNAME)
+ , LCINFODAT(rgbIDEFAULTLANGUAGE)
+ , LCINFODAT(rgbIDEFAULTCOUNTRY)
+ , LCINFODAT(rgbIDEFAULTCODEPAGE)
+ , LCINFODAT(rgbSLIST)
+ , LCINFODAT(rgbIMEASURE)
+ , LCINFODAT(rgbSDECIMAL)
+ , LCINFODAT(rgbSTHOUSAND)
+ , LCINFODAT(rgbSGROUPING)
+ , LCINFODAT(rgbIDIGITS)
+ , LCINFODAT(rgbILZERO)
+ , LCINFODAT(rgbSNATIVEDIGITS)
+ , LCINFODAT(rgbSCURRENCY)
+ , LCINFODAT(rgbSINTLSYMBOL)
+ , LCINFODAT(rgbSMONDECIMALSEP)
+ , LCINFODAT(rgbSMONTHOUSANDSEP)
+ , LCINFODAT(rgbSMONGROUPING)
+ , LCINFODAT(rgbICURRDIGITS)
+ , LCINFODAT(rgbIINTLCURRDIGITS)
+ , LCINFODAT(rgbICURRENCY)
+ , LCINFODAT(rgbINEGCURR)
+ , LCINFODAT(rgbSDATE)
+ , LCINFODAT(rgbSTIME)
+ , LCINFODAT(rgbSSHORTDATE)
+ , LCINFODAT(rgbSLONGDATE)
+ , LCINFODAT(rgbIDATE)
+ , LCINFODAT(rgbILDATE)
+ , LCINFODAT(rgbITIME)
+ , LCINFODAT(rgbICENTURY)
+ , LCINFODAT(rgbITLZERO)
+ , LCINFODAT(rgbIDAYLZERO)
+ , LCINFODAT(rgbIMONLZERO)
+ , LCINFODAT(rgbS1159)
+ , LCINFODAT(rgbS2359)
+ , LCINFODAT(rgbSDAYNAME1)
+ , LCINFODAT(rgbSDAYNAME2)
+ , LCINFODAT(rgbSDAYNAME3)
+ , LCINFODAT(rgbSDAYNAME4)
+ , LCINFODAT(rgbSDAYNAME5)
+ , LCINFODAT(rgbSDAYNAME6)
+ , LCINFODAT(rgbSDAYNAME7)
+ , LCINFODAT(rgbSABBREVDAYNAME1)
+ , LCINFODAT(rgbSABBREVDAYNAME2)
+ , LCINFODAT(rgbSABBREVDAYNAME3)
+ , LCINFODAT(rgbSABBREVDAYNAME4)
+ , LCINFODAT(rgbSABBREVDAYNAME5)
+ , LCINFODAT(rgbSABBREVDAYNAME6)
+ , LCINFODAT(rgbSABBREVDAYNAME7)
+ , LCINFODAT(rgbSMONTHNAME1)
+ , LCINFODAT(rgbSMONTHNAME2)
+ , LCINFODAT(rgbSMONTHNAME3)
+ , LCINFODAT(rgbSMONTHNAME4)
+ , LCINFODAT(rgbSMONTHNAME5)
+ , LCINFODAT(rgbSMONTHNAME6)
+ , LCINFODAT(rgbSMONTHNAME7)
+ , LCINFODAT(rgbSMONTHNAME8)
+ , LCINFODAT(rgbSMONTHNAME9)
+ , LCINFODAT(rgbSMONTHNAME10)
+ , LCINFODAT(rgbSMONTHNAME11)
+ , LCINFODAT(rgbSMONTHNAME12)
+ , LCINFODAT(rgbSABBREVMONTHNAME1)
+ , LCINFODAT(rgbSABBREVMONTHNAME2)
+ , LCINFODAT(rgbSABBREVMONTHNAME3)
+ , LCINFODAT(rgbSABBREVMONTHNAME4)
+ , LCINFODAT(rgbSABBREVMONTHNAME5)
+ , LCINFODAT(rgbSABBREVMONTHNAME6)
+ , LCINFODAT(rgbSABBREVMONTHNAME7)
+ , LCINFODAT(rgbSABBREVMONTHNAME8)
+ , LCINFODAT(rgbSABBREVMONTHNAME9)
+ , LCINFODAT(rgbSABBREVMONTHNAME10)
+ , LCINFODAT(rgbSABBREVMONTHNAME11)
+ , LCINFODAT(rgbSABBREVMONTHNAME12)
+ , { 0, NULL }
+ , LCINFODAT(rgbSNEGATIVESIGN)
+ , LCINFODAT(rgbIPOSSIGNPOSN)
+ , LCINFODAT(rgbINEGSIGNPOSN)
+ , LCINFODAT(rgbIPOSSYMPRECEDES)
+ , LCINFODAT(rgbIPOSSEPBYSPACE)
+ , LCINFODAT(rgbINEGSYMPRECEDES)
+ , LCINFODAT(rgbINEGSEPBYSPACE)
+ , LCINFODAT(rgbSENGCOUNTRY)
+ , LCINFODAT(rgbSENGLANGUAGE)
+#if defined(VBA2)
+ , LCINFODAT(rgbIFIRSTDAYOFWEEK)
+ , LCINFODAT(rgbIFIRSTWEEKOFYEAR)
+ , LCINFODAT(rgbIDEFAULTANSICODEPAGE)
+ , LCINFODAT(rgbINEGNUMBER)
+ , LCINFODAT(rgbSTIMEFORMAT)
+ , LCINFODAT(rgbITIMEMARKPOSN)
+ , LCINFODAT(rgbICALENDARTYPE)
+ , LCINFODAT(rgbIOPTIONALCALENDAR)
+ , { 0, NULL }
+ , { 0, NULL }
+#endif
+
+};
+#undef LCINFODAT
+
+
+#if 1
+STRINFO_KTP NLSALLOC(0404) g_strinfo0404 = {
+ rgsortweight
+ , rgmaptable
+ , rgtypetable
+ , DIM(rgsortweight)
+ , DIM(rgmaptable)
+ , DIM(rgtypetable)
+};
+#else
+STRINFO_KTP NLSALLOC(0404) g_strinfo0404 = {
+ (SORTWEIGHT FAR*) rgsortweight
+ , (MAPTABLE FAR*) rgmaptable
+ , (TYPETABLE FAR*) rgtypetable
+ , DIM(rgsortweight)
+ , DIM(rgmaptable)
+ , DIM(rgtypetable)
+};
+#endif
diff --git a/private/oleauto/src/dispatch/win16/0405.c b/private/oleauto/src/dispatch/win16/0405.c
new file mode 100644
index 000000000..4cdb8f69d
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0405.c
@@ -0,0 +1,711 @@
+/****************************************************************************
+* 0405.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Czech - Czech Republic
+*
+* LCID = 0x0405
+*
+* CodePage = 1250
+*
+* Generated: Thu Dec 01 18:04:22 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(0405) rgwSort_0405[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402d, 0x4034, 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0xc028
+ , 0x403a, 0x403b, 0x403c, 0x405e, 0x403d, 0xc029, 0x403e, 0x403f
+ , 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c
+ , 0x007d, 0x007e, 0x4040, 0x4041, 0x405f, 0x4060, 0x4061, 0x4042
+ , 0x4043, 0x087f, 0x0880, 0x0006, 0x0883, 0x0884, 0x0885, 0x0886
+ , 0x0887, 0x0889, 0x088a, 0x088b, 0x088c, 0x088d, 0x088e, 0x088f
+ , 0x0890, 0x0891, 0x0892, 0x0894, 0x0896, 0x0898, 0x0899, 0x089a
+ , 0x089b, 0x089c, 0x089d, 0x4044, 0x4045, 0x4046, 0x4047, 0x4048
+ , 0x4049, 0x007f, 0x0080, 0x0306, 0x0083, 0x0084, 0x0085, 0x0086
+ , 0x0087, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f
+ , 0x0090, 0x0091, 0x0092, 0x0094, 0x0096, 0x0098, 0x0099, 0x009a
+ , 0x009b, 0x009c, 0x009d, 0x404a, 0x404b, 0x404c, 0x404d, 0xc021
+ , 0xc022, 0xc023, 0x4058, 0xc024, 0x405b, 0x4073, 0x4070, 0x4071
+ , 0xc025, 0x4074, 0x0895, 0x405c, 0x0894, 0x0996, 0x089e, 0x0a9d
+ , 0xc026, 0x4056, 0x4057, 0x4059, 0x405a, 0x4072, 0xc02b, 0xc02c
+ , 0xc027, 0x0897, 0x0095, 0x405d, 0x0094, 0x0196, 0x009e, 0x029d
+ , 0x402e, 0x4052, 0x4152, 0x0b8c, 0x4067, 0x0d7f, 0x404e, 0x4068
+ , 0x404f, 0x4069, 0x0994, 0x4063, 0x406a, 0xc02a, 0x406b, 0x099d
+ , 0x406c, 0x4062, 0x4054, 0x038c, 0x4050, 0x406d, 0x406e, 0x406f
+ , 0x4051, 0x057f, 0x0194, 0x4064, 0x0a8c, 0x4055, 0x028c, 0x019d
+ , 0x0992, 0x0a7f, 0x0b7f, 0x0c7f, 0x097f, 0x098c, 0x0981, 0x0a81
+ , 0x0882, 0x0a84, 0x0c84, 0x0984, 0x0b84, 0x0989, 0x0a89, 0x0983
+ , 0x0a83, 0x098e, 0x0a8e, 0x0a8f, 0x0b8f, 0x0c8f, 0x098f, 0x4065
+ , 0x0893, 0x0b98, 0x0a98, 0x0c98, 0x0998, 0x099c, 0x0a96, 0x0005
+ , 0x0192, 0x027f, 0x037f, 0x047f, 0x017f, 0x018c, 0x0181, 0x0281
+ , 0x0082, 0x0284, 0x0484, 0x0184, 0x0384, 0x0189, 0x0289, 0x0183
+ , 0x0283, 0x018e, 0x028e, 0x028f, 0x038f, 0x048f, 0x018f, 0x4066
+ , 0x0093, 0x0398, 0x0298, 0x0498, 0x0198, 0x019c, 0x0296, 0x4053
+};
+
+DIGRAPH NLSALLOC(0405) rgdig_0405[5] = {
+ { 0x0881, 0x02 }
+ , { 0x1088, 0x48 }
+ , { 0x0888, 0x68 }
+ , { 0x0081, 0x02 }
+ , { 0x0088, 0x68 }
+};
+
+EXPANSION NLSALLOC(0405) rgexp_0405[1] = {
+ { 0x0094, 0x0094 }
+};
+
+WORD NLSALLOC(0405) rgwCType12_0405[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x0020, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0x5010, 0x1101, 0xb010, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0xb010, 0x1102, 0xb010, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0xa048, 0x1010, 0x1010, 0x1101, 0x5010, 0x1101, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0x1101
+ , 0x5010, 0x5010, 0x1010, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1102, 0x1102, 0xb010, 0x1101, 0x1010, 0x1102, 0x1102
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1010
+};
+
+WORD NLSALLOC(0405) rgwCType3_0405[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x0000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0000, 0x0008, 0x8003, 0x0008, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0000, 0x0000, 0x8003, 0x0008, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x0008, 0x0401, 0x0408, 0x8003, 0x0008, 0x8003, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x8003, 0x0008, 0x0048, 0x0408, 0x0008, 0x8003
+ , 0x0008, 0x0008, 0x0408, 0x8003, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x8003, 0x8003, 0x0008, 0x8003, 0x0408, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0408
+};
+
+BYTE NLSALLOC(0405) rgbUCase_0405[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xa3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xa5, 0xaa, 0xbb, 0xbc, 0xbd, 0xbc, 0xaf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff
+};
+
+BYTE NLSALLOC(0405) rgbLCase_0405[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xb3, 0xa4, 0xb9, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbe, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(0405) rgbILANGUAGE[] = { /* "0405" */
+ 0x30, 0x34, 0x30, 0x35
+};
+
+static BYTE NLSALLOC(0405) rgbSLANGUAGE[] = { /* "Czech" */
+ 0x43, 0x7a, 0x65, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVLANGNAME[] = { /* "CSY" */
+ 0x43, 0x53, 0x59
+};
+
+static BYTE NLSALLOC(0405) rgbSNATIVELANGNAME[] = { /* "\x010de\x0161tina" */
+ 0xe8, 0x65, 0x9a, 0x74, 0x69, 0x6e, 0x61
+};
+
+static BYTE NLSALLOC(0405) rgbICOUNTRY[] = { /* "42" */
+ 0x34, 0x32
+};
+
+static BYTE NLSALLOC(0405) rgbSCOUNTRY[] = { /* "Czech Republic" */
+ 0x43, 0x7a, 0x65, 0x63, 0x68, 0x20, 0x52, 0x65
+ , 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVCTRYNAME[] = { /* "CZE" */
+ 0x43, 0x5a, 0x45
+};
+
+static BYTE NLSALLOC(0405) rgbSNATIVECTRYNAME[] = { /* "\x010cesk\x00e1\x0020republika" */
+ 0xc8, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x72, 0x65
+ , 0x70, 0x75, 0x62, 0x6c, 0x69, 0x6b, 0x61
+};
+
+static BYTE NLSALLOC(0405) rgbIDEFAULTLANGUAGE[] = { /* "0405" */
+ 0x30, 0x34, 0x30, 0x35
+};
+
+static BYTE NLSALLOC(0405) rgbIDEFAULTCOUNTRY[] = { /* "42" */
+ 0x34, 0x32
+};
+
+static BYTE NLSALLOC(0405) rgbIDEFAULTCODEPAGE[] = { /* "852" */
+ 0x38, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0405) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0405) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0405) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0405) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0405) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0405) rgbSCURRENCY[] = { /* "K\x010d" */
+ 0x4b, 0xe8
+};
+
+static BYTE NLSALLOC(0405) rgbSINTLSYMBOL[] = { /* "CZK" */
+ 0x43, 0x5a, 0x4b
+};
+
+static BYTE NLSALLOC(0405) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0405) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0405) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0405) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0405) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(0405) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0405) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0405) rgbSSHORTDATE[] = { /* "d.M.yyyy" */
+ 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0405) rgbSLONGDATE[] = { /* "d. MMMM yyyy" */
+ 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0405) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbIMONLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbS1159[] = { /* "dop." */
+ 0x64, 0x6f, 0x70, 0x2e
+};
+
+static BYTE NLSALLOC(0405) rgbS2359[] = { /* "odp." */
+ 0x6f, 0x64, 0x70, 0x2e
+};
+
+static BYTE NLSALLOC(0405) rgbSDAYNAME1[] = { /* "pond\x011blí" */
+ 0x70, 0x6f, 0x6e, 0x64, 0xec, 0x6c, 0xed
+};
+
+static BYTE NLSALLOC(0405) rgbSDAYNAME2[] = { /* "\x00fater\x00fd" */
+ 0xfa, 0x74, 0x65, 0x72, 0xfd
+};
+
+static BYTE NLSALLOC(0405) rgbSDAYNAME3[] = { /* "st\x0159eda" */
+ 0x73, 0x74, 0xf8, 0x65, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(0405) rgbSDAYNAME4[] = { /* "\x010dtvrtek" */
+ 0xe8, 0x74, 0x76, 0x72, 0x74, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(0405) rgbSDAYNAME5[] = { /* "pátek" */
+ 0x70, 0xe1, 0x74, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(0405) rgbSDAYNAME6[] = { /* "sobota" */
+ 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61
+};
+
+static BYTE NLSALLOC(0405) rgbSDAYNAME7[] = { /* "ned\x011ble" */
+ 0x6e, 0x65, 0x64, 0xec, 0x6c, 0x65
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVDAYNAME1[] = { /* "po" */
+ 0x70, 0x6f
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVDAYNAME2[] = { /* "út" */
+ 0xfa, 0x74
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVDAYNAME3[] = { /* "st" */
+ 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVDAYNAME4[] = { /* "\x010dt" */
+ 0xe8, 0x74
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVDAYNAME5[] = { /* "pá" */
+ 0x70, 0xe1
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVDAYNAME6[] = { /* "so" */
+ 0x73, 0x6f
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVDAYNAME7[] = { /* "ne" */
+ 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME1[] = { /* "leden" */
+ 0x6c, 0x65, 0x64, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME2[] = { /* "únor" */
+ 0xfa, 0x6e, 0x6f, 0x72
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME3[] = { /* "b\x0159ezen" */
+ 0x62, 0xf8, 0x65, 0x7a, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME4[] = { /* "duben" */
+ 0x64, 0x75, 0x62, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME5[] = { /* "kv\x011bten" */
+ 0x6b, 0x76, 0xec, 0x74, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME6[] = { /* "\x010derven" */
+ 0xe8, 0x65, 0x72, 0x76, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME7[] = { /* "\x010dervenec" */
+ 0xe8, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME8[] = { /* "srpen" */
+ 0x73, 0x72, 0x70, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME9[] = { /* "z\x00e1\x0159\x00ed" */
+ 0x7a, 0xe1, 0xf8, 0xed
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME10[] = { /* "\x0159\x00edjen" */
+ 0xf8, 0xed, 0x6a, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME11[] = { /* "listopad" */
+ 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64
+};
+
+static BYTE NLSALLOC(0405) rgbSMONTHNAME12[] = { /* "prosinec" */
+ 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME1[] = { /* "I" */
+ 0x49
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME2[] = { /* "II" */
+ 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME3[] = { /* "III" */
+ 0x49, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME4[] = { /* "IV" */
+ 0x49, 0x56
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME5[] = { /* "V" */
+ 0x56
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME6[] = { /* "VI" */
+ 0x56, 0x49
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME7[] = { /* "VII" */
+ 0x56, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME8[] = { /* "VIII" */
+ 0x56, 0x49, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME9[] = { /* "IX" */
+ 0x49, 0x58
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME10[] = { /* "X" */
+ 0x58
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME11[] = { /* "XI" */
+ 0x58, 0x49
+};
+
+static BYTE NLSALLOC(0405) rgbSABBREVMONTHNAME12[] = { /* "XII" */
+ 0x58, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0405) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0405) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbSENGCOUNTRY[] = { /* "Czech Republic" */
+ 0x43, 0x7a, 0x65, 0x63, 0x68, 0x20, 0x52, 0x65
+ , 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0405) rgbSENGLANGUAGE[] = { /* "Czech" */
+ 0x43, 0x7a, 0x65, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0405) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbIDEFAULTANSICODEPAGE[] = { /* "1250" */
+ 0x31, 0x32, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0405) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0405) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0405) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0405) g_rglcinfo0405[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 5, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 14, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 15, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 4, rgbS1159 }
+ , { 4, rgbS2359 }
+ , { 7, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 6, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 5, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 4, rgbSMONTHNAME2 }
+ , { 6, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 6, rgbSMONTHNAME5 }
+ , { 6, rgbSMONTHNAME6 }
+ , { 8, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 4, rgbSMONTHNAME9 }
+ , { 5, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 1, rgbSABBREVMONTHNAME1 }
+ , { 2, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 2, rgbSABBREVMONTHNAME4 }
+ , { 1, rgbSABBREVMONTHNAME5 }
+ , { 2, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 2, rgbSABBREVMONTHNAME9 }
+ , { 1, rgbSABBREVMONTHNAME10 }
+ , { 2, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 14, rgbSENGCOUNTRY }
+ , { 5, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0405) g_strinfo0405 = {
+ rgbUCase_0405
+ , rgbLCase_0405
+ , rgwCType12_0405
+ , rgwCType3_0405
+ , rgwSort_0405
+ , rgexp_0405
+ , rgdig_0405
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0406.c b/private/oleauto/src/dispatch/win16/0406.c
new file mode 100644
index 000000000..e6dd8a0f9
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0406.c
@@ -0,0 +1,705 @@
+/****************************************************************************
+* 0406.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Danish - Denmark
+*
+* LCID = 0x0406
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:56:23 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(0406) rgwSort_0406[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402f, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0xc02a
+ , 0x403c, 0x403d, 0x403e, 0x4060, 0x403f, 0xc02b, 0x4040, 0x4041
+ , 0x007a, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084
+ , 0x0085, 0x0086, 0x4042, 0x4043, 0x4061, 0x4062, 0x4063, 0x4044
+ , 0x4045, 0x0006, 0x1088, 0x1089, 0x108a, 0x108b, 0x108c, 0x108d
+ , 0x108e, 0x108f, 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095
+ , 0x1096, 0x1097, 0x1098, 0x1099, 0x109a, 0x109c, 0x109d, 0x109e
+ , 0x109f, 0x10a0, 0x10a1, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a
+ , 0x404b, 0x0306, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d
+ , 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095
+ , 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009c, 0x009d, 0x009e
+ , 0x009f, 0x00a0, 0x00a1, 0x404c, 0x404d, 0x404e, 0x404f, 0xc021
+ , 0xc022, 0xc023, 0x405a, 0x018c, 0x405d, 0x4078, 0x4075, 0x4076
+ , 0x4149, 0x4079, 0x1199, 0x405e, 0x0305, 0xc024, 0xc025, 0xc026
+ , 0xc027, 0x4058, 0x4059, 0x405b, 0x405c, 0x4077, 0xc02d, 0xc02e
+ , 0x4057, 0x109b, 0x0199, 0x405f, 0x0405, 0xc028, 0xc029, 0x12a0
+ , 0x4030, 0x4050, 0x4069, 0x406a, 0x406b, 0x406c, 0x4051, 0x406d
+ , 0x4052, 0x406e, 0x0887, 0x4065, 0x406f, 0xc02c, 0x4070, 0x4053
+ , 0x4071, 0x4064, 0x087f, 0x0880, 0x4054, 0x4072, 0x4073, 0x4074
+ , 0x4055, 0x087e, 0x0995, 0x4066, 0x007b, 0x007c, 0x007d, 0x4056
+ , 0x1287, 0x1187, 0x1387, 0x1487, 0x11a2, 0x10a4, 0x10a2, 0x1189
+ , 0x128b, 0x118b, 0x138b, 0x148b, 0x128f, 0x118f, 0x138f, 0x148f
+ , 0x118a, 0x1194, 0x1395, 0x1295, 0x1495, 0x1595, 0x10a3, 0x4067
+ , 0x10a3, 0x129c, 0x119c, 0x139c, 0x13a0, 0x11a0, 0x0005, 0x0105
+ , 0x0287, 0x0187, 0x0387, 0x0487, 0x01a2, 0x00a4, 0x00a2, 0x0189
+ , 0x028b, 0x018b, 0x038b, 0x048b, 0x028f, 0x018f, 0x038f, 0x048f
+ , 0x018a, 0x0194, 0x0395, 0x0295, 0x0495, 0x0595, 0x00a3, 0x4068
+ , 0x00a3, 0x029c, 0x019c, 0x039c, 0x03a0, 0x01a0, 0x0205, 0x02a0
+};
+
+DIGRAPH NLSALLOC(0406) rgdig_0406[5] = {
+ { 0x1087, 0x02 }
+ , { 0x19a4, 0x41 }
+ , { 0x11a4, 0x61 }
+ , { 0x0087, 0x02 }
+ , { 0x01a4, 0x61 }
+};
+
+EXPANSION NLSALLOC(0406) rgexp_0406[5] = {
+ { 0x109a, 0x108e }
+ , { 0x0099, 0x0099 }
+ , { 0x009a, 0x008e }
+ , { 0x1095, 0x108b }
+ , { 0x0095, 0x008b }
+};
+
+WORD NLSALLOC(0406) rgwCType12_0406[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x1101, 0xb010, 0x1101, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0xb010, 0x1102, 0xb010, 0x1102, 0x0020, 0x0020, 0x1101
+ , 0xa048, 0xb010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+};
+
+WORD NLSALLOC(0406) rgwCType3_0406[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0408, 0x0000, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x8003
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0400, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+};
+
+BYTE NLSALLOC(0406) rgbUCase_0406[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x9f
+};
+
+BYTE NLSALLOC(0406) rgbLCase_0406[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xff
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(0406) rgbILANGUAGE[] = { /* "0406" */
+ 0x30, 0x34, 0x30, 0x36
+};
+
+static BYTE NLSALLOC(0406) rgbSLANGUAGE[] = { /* "Danish" */
+ 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVLANGNAME[] = { /* "DAN" */
+ 0x44, 0x41, 0x4e
+};
+
+static BYTE NLSALLOC(0406) rgbSNATIVELANGNAME[] = { /* "dansk" */
+ 0x64, 0x61, 0x6e, 0x73, 0x6b
+};
+
+static BYTE NLSALLOC(0406) rgbICOUNTRY[] = { /* "45" */
+ 0x34, 0x35
+};
+
+static BYTE NLSALLOC(0406) rgbSCOUNTRY[] = { /* "Denmark" */
+ 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVCTRYNAME[] = { /* "DNK" */
+ 0x44, 0x4e, 0x4b
+};
+
+static BYTE NLSALLOC(0406) rgbSNATIVECTRYNAME[] = { /* "Danmark" */
+ 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b
+};
+
+static BYTE NLSALLOC(0406) rgbIDEFAULTLANGUAGE[] = { /* "0406" */
+ 0x30, 0x34, 0x30, 0x36
+};
+
+static BYTE NLSALLOC(0406) rgbIDEFAULTCOUNTRY[] = { /* "45" */
+ 0x34, 0x35
+};
+
+static BYTE NLSALLOC(0406) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0406) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0406) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0406) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0406) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0406) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0406) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0406) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0406) rgbSCURRENCY[] = { /* "kr" */
+ 0x6b, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSINTLSYMBOL[] = { /* "DKK" */
+ 0x44, 0x4b, 0x4b
+};
+
+static BYTE NLSALLOC(0406) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0406) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0406) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0406) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0406) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0406) rgbINEGCURR[] = { /* "12" */
+ 0x31, 0x32
+};
+
+static BYTE NLSALLOC(0406) rgbSDATE[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0406) rgbSTIME[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0406) rgbSSHORTDATE[] = { /* "dd-MM-yy" */
+ 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0406) rgbSLONGDATE[] = { /* "d. MMMM yyyy" */
+ 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0406) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0406) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbSDAYNAME1[] = { /* "mandag" */
+ 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0406) rgbSDAYNAME2[] = { /* "tirsdag" */
+ 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0406) rgbSDAYNAME3[] = { /* "onsdag" */
+ 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0406) rgbSDAYNAME4[] = { /* "torsdag" */
+ 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0406) rgbSDAYNAME5[] = { /* "fredag" */
+ 0x66, 0x72, 0x65, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0406) rgbSDAYNAME6[] = { /* "lørdag" */
+ 0x6c, 0xf8, 0x72, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0406) rgbSDAYNAME7[] = { /* "søndag" */
+ 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVDAYNAME1[] = { /* "ma" */
+ 0x6d, 0x61
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVDAYNAME2[] = { /* "ti" */
+ 0x74, 0x69
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVDAYNAME3[] = { /* "on" */
+ 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVDAYNAME4[] = { /* "to" */
+ 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVDAYNAME5[] = { /* "fr" */
+ 0x66, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVDAYNAME6[] = { /* "lø" */
+ 0x6c, 0xf8
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVDAYNAME7[] = { /* "sø" */
+ 0x73, 0xf8
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME1[] = { /* "januar" */
+ 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME2[] = { /* "februar" */
+ 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME3[] = { /* "marts" */
+ 0x6d, 0x61, 0x72, 0x74, 0x73
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME4[] = { /* "april" */
+ 0x61, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME5[] = { /* "maj" */
+ 0x6d, 0x61, 0x6a
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME6[] = { /* "juni" */
+ 0x6a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME7[] = { /* "juli" */
+ 0x6a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME8[] = { /* "august" */
+ 0x61, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME9[] = { /* "september" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME10[] = { /* "oktober" */
+ 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME11[] = { /* "november" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSMONTHNAME12[] = { /* "december" */
+ 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME1[] = { /* "jan" */
+ 0x6a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME4[] = { /* "apr" */
+ 0x61, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME5[] = { /* "maj" */
+ 0x6d, 0x61, 0x6a
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME8[] = { /* "aug" */
+ 0x61, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME10[] = { /* "okt" */
+ 0x6f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0406) rgbSABBREVMONTHNAME12[] = { /* "dec" */
+ 0x64, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0406) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0406) rgbIPOSSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0406) rgbINEGSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0406) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbSENGCOUNTRY[] = { /* "Denmark" */
+ 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b
+};
+
+static BYTE NLSALLOC(0406) rgbSENGLANGUAGE[] = { /* "Danish" */
+ 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0406) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0406) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0406) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0406) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbSTIMEFORMAT[] = { /* "HH.mm.ss" */
+ 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0406) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0406) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0406) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0406) g_rglcinfo0406[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 5, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 7, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 2, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 6, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0406) g_strinfo0406 = {
+ rgbUCase_0406
+ , rgbLCase_0406
+ , rgwCType12_0406
+ , rgwCType3_0406
+ , rgwSort_0406
+ , rgexp_0406
+ , rgdig_0406
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0407.c b/private/oleauto/src/dispatch/win16/0407.c
new file mode 100644
index 000000000..d010e8bff
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0407.c
@@ -0,0 +1,524 @@
+/****************************************************************************
+* 0407.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* German - Germany
+*
+* LCID = 0x0407
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:35:18 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0407) rgbILANGUAGE[] = { /* "0407" */
+ 0x30, 0x34, 0x30, 0x37
+};
+
+static BYTE NLSALLOC(0407) rgbSLANGUAGE[] = { /* "German" */
+ 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVLANGNAME[] = { /* "DEU" */
+ 0x44, 0x45, 0x55
+};
+
+static BYTE NLSALLOC(0407) rgbSNATIVELANGNAME[] = { /* "Deutsch" */
+ 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0407) rgbICOUNTRY[] = { /* "49" */
+ 0x34, 0x39
+};
+
+static BYTE NLSALLOC(0407) rgbSCOUNTRY[] = { /* "Germany" */
+ 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVCTRYNAME[] = { /* "DEU" */
+ 0x44, 0x45, 0x55
+};
+
+static BYTE NLSALLOC(0407) rgbSNATIVECTRYNAME[] = { /* "Deutschland" */
+ 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(0407) rgbIDEFAULTLANGUAGE[] = { /* "0407" */
+ 0x30, 0x34, 0x30, 0x37
+};
+
+static BYTE NLSALLOC(0407) rgbIDEFAULTCOUNTRY[] = { /* "49" */
+ 0x34, 0x39
+};
+
+static BYTE NLSALLOC(0407) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0407) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0407) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0407) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0407) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0407) rgbSCURRENCY[] = { /* "DM" */
+ 0x44, 0x4d
+};
+
+static BYTE NLSALLOC(0407) rgbSINTLSYMBOL[] = { /* "DEM" */
+ 0x44, 0x45, 0x4d
+};
+
+static BYTE NLSALLOC(0407) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0407) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0407) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0407) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0407) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(0407) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0407) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0407) rgbSSHORTDATE[] = { /* "dd.MM.yy" */
+ 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0407) rgbSLONGDATE[] = { /* "dddd, d. MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e
+ , 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0407) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbSDAYNAME1[] = { /* "Montag" */
+ 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0407) rgbSDAYNAME2[] = { /* "Dienstag" */
+ 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0407) rgbSDAYNAME3[] = { /* "Mittwoch" */
+ 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0407) rgbSDAYNAME4[] = { /* "Donnerstag" */
+ 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74
+ , 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0407) rgbSDAYNAME5[] = { /* "Freitag" */
+ 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0407) rgbSDAYNAME6[] = { /* "Samstag" */
+ 0x53, 0x61, 0x6d, 0x73, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0407) rgbSDAYNAME7[] = { /* "Sonntag" */
+ 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVDAYNAME1[] = { /* "Mo" */
+ 0x4d, 0x6f
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVDAYNAME2[] = { /* "Di" */
+ 0x44, 0x69
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVDAYNAME3[] = { /* "Mi" */
+ 0x4d, 0x69
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVDAYNAME4[] = { /* "Do" */
+ 0x44, 0x6f
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVDAYNAME5[] = { /* "Fr" */
+ 0x46, 0x72
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVDAYNAME6[] = { /* "Sa" */
+ 0x53, 0x61
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVDAYNAME7[] = { /* "So" */
+ 0x53, 0x6f
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME1[] = { /* "Januar" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME2[] = { /* "Februar" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME3[] = { /* "März" */
+ 0x4d, 0xe4, 0x72, 0x7a
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME5[] = { /* "Mai" */
+ 0x4d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME6[] = { /* "Juni" */
+ 0x4a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME7[] = { /* "Juli" */
+ 0x4a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME10[] = { /* "Oktober" */
+ 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0407) rgbSMONTHNAME12[] = { /* "Dezember" */
+ 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME3[] = { /* "Mrz" */
+ 0x4d, 0x72, 0x7a
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME5[] = { /* "Mai" */
+ 0x4d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME10[] = { /* "Okt" */
+ 0x4f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0407) rgbSABBREVMONTHNAME12[] = { /* "Dez" */
+ 0x44, 0x65, 0x7a
+};
+
+static BYTE NLSALLOC(0407) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0407) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbSENGCOUNTRY[] = { /* "Germany" */
+ 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79
+};
+
+static BYTE NLSALLOC(0407) rgbSENGLANGUAGE[] = { /* "German" */
+ 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0407) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0407) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0407) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0407) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0407) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0407) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0407) g_rglcinfo0407[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 11, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 18, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 8, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 10, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 7, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0407) g_strinfo0407 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0408.c b/private/oleauto/src/dispatch/win16/0408.c
new file mode 100644
index 000000000..26caf4caf
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0408.c
@@ -0,0 +1,706 @@
+/****************************************************************************
+* 0408.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Greek - Greece
+*
+* LCID = 0x0408
+*
+* CodePage = 1253
+*
+* Generated: Thu Dec 01 18:22:18 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(0408) rgwSort_0408[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x4039, 0x403a, 0x403b, 0x403c, 0x403d, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x4037, 0x403e, 0x403f, 0x4040, 0x4041, 0x4042, 0x4043, 0xc031
+ , 0x4044, 0x4045, 0x4046, 0x4064, 0x4047, 0xc032, 0x4048, 0x4049
+ , 0x007b, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083
+ , 0x0084, 0x0085, 0x404a, 0x404b, 0x4065, 0x4066, 0x4067, 0x404c
+ , 0x404d, 0x1886, 0x1887, 0x1888, 0x1889, 0x188a, 0x188b, 0x188c
+ , 0x188d, 0x188e, 0x188f, 0x1890, 0x1891, 0x1892, 0x1893, 0x1894
+ , 0x1895, 0x1896, 0x1897, 0x1898, 0x1899, 0x189b, 0x189c, 0x189d
+ , 0x189e, 0x189f, 0x18a0, 0x404e, 0x404f, 0x4050, 0x4051, 0x4052
+ , 0x4053, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c
+ , 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094
+ , 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009b, 0x009c, 0x009d
+ , 0x009e, 0x009f, 0x00a0, 0x4054, 0x4055, 0x4056, 0x4057, 0xc021
+ , 0xc022, 0xc023, 0x405e, 0x018b, 0x4061, 0x4079, 0x4076, 0x4077
+ , 0xc024, 0x407a, 0xc025, 0x4062, 0xc026, 0xc027, 0xc028, 0xc029
+ , 0xc02a, 0x405c, 0x405d, 0x405f, 0x4060, 0x4078, 0xc034, 0xc035
+ , 0xc02b, 0x189a, 0xc02c, 0x4063, 0xc02d, 0xc02e, 0xc02f, 0xc030
+ , 0x4038, 0x405b, 0x19a1, 0x406b, 0x406c, 0x406d, 0x4058, 0x406e
+ , 0x4059, 0x406f, 0x08b9, 0x4069, 0x4070, 0xc033, 0x4071, 0xc036
+ , 0x4072, 0x4068, 0x107e, 0x107f, 0x405a, 0x4073, 0x4074, 0x4075
+ , 0x18a5, 0x18a7, 0x1aa9, 0x406a, 0x19af, 0x007c, 0x1ab4, 0x19b8
+ , 0x03a9, 0x18a1, 0x18a2, 0x18a3, 0x18a4, 0x18a5, 0x18a6, 0x18a7
+ , 0x18a8, 0x18a9, 0x18aa, 0x18ab, 0x18ac, 0x18ad, 0x18ae, 0x18af
+ , 0x18b0, 0x18b1, 0x08ba, 0x18b2, 0x18b3, 0x18b4, 0x18b5, 0x18b6
+ , 0x18b7, 0x18b8, 0x19a9, 0x19b4, 0x01a1, 0x00a5, 0x00a7, 0x02a9
+ , 0x03b4, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7
+ , 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af
+ , 0x00b0, 0x00b1, 0x01b2, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6
+ , 0x00b7, 0x00b8, 0x01a9, 0x01b4, 0x01af, 0x02b4, 0x01b8, 0x08bb
+};
+
+WORD NLSALLOC(0408) rgwCType12_0408[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0x5010, 0x0020, 0xb010, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0xb010, 0x0020, 0xb010, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0x1010, 0x1101, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0x0000, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0x1010, 0xb010, 0xb010, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0x1101, 0xb010, 0x1101, 0x1101
+ , 0x1102, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x0000, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x0000
+};
+
+WORD NLSALLOC(0408) rgwCType3_0408[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0000, 0x0008, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0008, 0x0408, 0x8003, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0000, 0x0008, 0x0048, 0x0408, 0x0008, 0x0400
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x0008, 0x8003, 0x0000, 0x8003, 0x8003
+ , 0x8003, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0000
+};
+
+BYTE NLSALLOC(0408) rgbUCase_0408[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xa2, 0xb8, 0xb9, 0xba
+ , 0xe0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xbc, 0xbe, 0xbf, 0xff
+};
+
+BYTE NLSALLOC(0408) rgbLCase_0408[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xdc, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xdd, 0xde, 0xdf, 0xbb, 0xfc, 0xbd, 0xfd, 0xfe
+ , 0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xd2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(0408) rgbILANGUAGE[] = { /* "0408" */
+ 0x30, 0x34, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(0408) rgbSLANGUAGE[] = { /* "Greek" */
+ 0x47, 0x72, 0x65, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVLANGNAME[] = { /* "ELL" */
+ 0x45, 0x4c, 0x4c
+};
+
+static BYTE NLSALLOC(0408) rgbSNATIVELANGNAME[] = { /* "\x03b5\x03bb\x03bb\x03b7\x03bd\x03b9\x03ba\x03ac" */
+ 0xe5, 0xeb, 0xeb, 0xe7, 0xed, 0xe9, 0xea, 0xdc
+};
+
+static BYTE NLSALLOC(0408) rgbICOUNTRY[] = { /* "30" */
+ 0x33, 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbSCOUNTRY[] = { /* "Greece" */
+ 0x47, 0x72, 0x65, 0x65, 0x63, 0x65
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVCTRYNAME[] = { /* "GRC" */
+ 0x47, 0x52, 0x43
+};
+
+static BYTE NLSALLOC(0408) rgbSNATIVECTRYNAME[] = { /* "\x0395\x03bb\x03bb\x03ac\x03b4\x03b1" */
+ 0xc5, 0xeb, 0xeb, 0xdc, 0xe4, 0xe1
+};
+
+static BYTE NLSALLOC(0408) rgbIDEFAULTLANGUAGE[] = { /* "0408" */
+ 0x30, 0x34, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(0408) rgbIDEFAULTCOUNTRY[] = { /* "30" */
+ 0x33, 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbIDEFAULTCODEPAGE[] = { /* "737" */
+ 0x37, 0x33, 0x37
+};
+
+static BYTE NLSALLOC(0408) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0408) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0408) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0408) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0408) rgbILZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0408) rgbSCURRENCY[] = { /* "\x0394\x03c1\x03c7" */
+ 0xc4, 0xf1, 0xf7
+};
+
+static BYTE NLSALLOC(0408) rgbSINTLSYMBOL[] = { /* "GRD" */
+ 0x47, 0x52, 0x44
+};
+
+static BYTE NLSALLOC(0408) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0408) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0408) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0408) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0408) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(0408) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0408) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0408) rgbSSHORTDATE[] = { /* "d/M/yyyy" */
+ 0x64, 0x2f, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0408) rgbSLONGDATE[] = { /* "dddd, d MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20
+ , 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79
+ , 0x79
+};
+
+static BYTE NLSALLOC(0408) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbIMONLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbS1159[] = { /* "\x03c0\x03bc" */
+ 0xf0, 0xec
+};
+
+static BYTE NLSALLOC(0408) rgbS2359[] = { /* "\x03bc\x03bc" */
+ 0xec, 0xec
+};
+
+static BYTE NLSALLOC(0408) rgbSDAYNAME1[] = { /* "\x0394\x03b5\x03c5\x03c4\x03ad\x03c1\x03b1" */
+ 0xc4, 0xe5, 0xf5, 0xf4, 0xdd, 0xf1, 0xe1
+};
+
+static BYTE NLSALLOC(0408) rgbSDAYNAME2[] = { /* "\x03a4\x03c1\x03af\x03c4\x03b7" */
+ 0xd4, 0xf1, 0xdf, 0xf4, 0xe7
+};
+
+static BYTE NLSALLOC(0408) rgbSDAYNAME3[] = { /* "\x03a4\x03b5\x03c4\x03ac\x03c1\x03c4\x03b7" */
+ 0xd4, 0xe5, 0xf4, 0xdc, 0xf1, 0xf4, 0xe7
+};
+
+static BYTE NLSALLOC(0408) rgbSDAYNAME4[] = { /* "\x03a0\x03ad\x03bc\x03c0\x03c4\x03b7" */
+ 0xd0, 0xdd, 0xec, 0xf0, 0xf4, 0xe7
+};
+
+static BYTE NLSALLOC(0408) rgbSDAYNAME5[] = { /* "\x03a0\x03b1\x03c1\x03b1\x03c3\x03ba\x03b5\x03c5\x03ae" */
+ 0xd0, 0xe1, 0xf1, 0xe1, 0xf3, 0xea, 0xe5, 0xf5
+ , 0xde
+};
+
+static BYTE NLSALLOC(0408) rgbSDAYNAME6[] = { /* "\x03a3\x03ac\x03b2\x03b2\x03b1\x03c4\x03bf" */
+ 0xd3, 0xdc, 0xe2, 0xe2, 0xe1, 0xf4, 0xef
+};
+
+static BYTE NLSALLOC(0408) rgbSDAYNAME7[] = { /* "\x039a\x03c5\x03c1\x03b9\x03b1\x03ba\x03ae" */
+ 0xca, 0xf5, 0xf1, 0xe9, 0xe1, 0xea, 0xde
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVDAYNAME1[] = { /* "\x0394\x03b5\x03c5" */
+ 0xc4, 0xe5, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVDAYNAME2[] = { /* "\x03a4\x03c1\x03b9" */
+ 0xd4, 0xf1, 0xe9
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVDAYNAME3[] = { /* "\x03a4\x03b5\x03c4" */
+ 0xd4, 0xe5, 0xf4
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVDAYNAME4[] = { /* "\x03a0\x03b5\x03bc" */
+ 0xd0, 0xe5, 0xec
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVDAYNAME5[] = { /* "\x03a0\x03b1\x03c1" */
+ 0xd0, 0xe1, 0xf1
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVDAYNAME6[] = { /* "\x03a3\x03b1\x03b2" */
+ 0xd3, 0xe1, 0xe2
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVDAYNAME7[] = { /* "\x039a\x03c5\x03c1" */
+ 0xca, 0xf5, 0xf1
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME1[] = { /* "\x0399\x03b1\x03bd\x03bf\x03c5\x03b1\x03c1\x03af\x03bf\x03c5" */
+ 0xc9, 0xe1, 0xed, 0xef, 0xf5, 0xe1, 0xf1, 0xdf
+ , 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME2[] = { /* "\x03a6\x03b5\x03b2\x03c1\x03bf\x03c5\x03b1\x03c1\x03af\x03bf\x03c5" */
+ 0xd6, 0xe5, 0xe2, 0xf1, 0xef, 0xf5, 0xe1, 0xf1
+ , 0xdf, 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME3[] = { /* "\x039c\x03b1\x03c1\x03c4\x03af\x03bf\x03c5" */
+ 0xcc, 0xe1, 0xf1, 0xf4, 0xdf, 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME4[] = { /* "\x0391\x03c0\x03c1\x03b9\x03bb\x03af\x03bf\x03c5" */
+ 0xc1, 0xf0, 0xf1, 0xe9, 0xeb, 0xdf, 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME5[] = { /* "\x039c\x03b1\x0390\x03bf\x03c5" */
+ 0xcc, 0xe1, 0xc0, 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME6[] = { /* "\x0399\x03bf\x03c5\x03bd\x03af\x03bf\x03c5" */
+ 0xc9, 0xef, 0xf5, 0xed, 0xdf, 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME7[] = { /* "\x0399\x03bf\x03c5\x03bb\x03af\x03bf\x03c5" */
+ 0xc9, 0xef, 0xf5, 0xeb, 0xdf, 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME8[] = { /* "\x0391\x03c5\x03b3\x03bf\x03cd\x03c3\x03c4\x03bf\x03c5" */
+ 0xc1, 0xf5, 0xe3, 0xef, 0xfd, 0xf3, 0xf4, 0xef
+ , 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME9[] = { /* "\x03a3\x03b5\x03c0\x03c4\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5" */
+ 0xd3, 0xe5, 0xf0, 0xf4, 0xe5, 0xec, 0xe2, 0xf1
+ , 0xdf, 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME10[] = { /* "\x039f\x03ba\x03c4\x03c9\x03b2\x03c1\x03af\x03bf\x03c5" */
+ 0xcf, 0xea, 0xf4, 0xf9, 0xe2, 0xf1, 0xdf, 0xef
+ , 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME11[] = { /* "\x039d\x03bf\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5" */
+ 0xcd, 0xef, 0xe5, 0xec, 0xe2, 0xf1, 0xdf, 0xef
+ , 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSMONTHNAME12[] = { /* "\x0394\x03b5\x03ba\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5" */
+ 0xc4, 0xe5, 0xea, 0xe5, 0xec, 0xe2, 0xf1, 0xdf
+ , 0xef, 0xf5
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME1[] = { /* "\x0399\x03b1\x03bd" */
+ 0xc9, 0xe1, 0xed
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME2[] = { /* "\x03a6\x03b5\x03b2" */
+ 0xd6, 0xe5, 0xe2
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME3[] = { /* "\x039c\x03b1\x03c1" */
+ 0xcc, 0xe1, 0xf1
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME4[] = { /* "\x0391\x03c0\x03c1" */
+ 0xc1, 0xf0, 0xf1
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME5[] = { /* "\x039c\x03b1\x03ca" */
+ 0xcc, 0xe1, 0xfa
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME6[] = { /* "\x0399\x03bf\x03c5\x03bd" */
+ 0xc9, 0xef, 0xf5, 0xed
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME7[] = { /* "\x0399\x03bf\x03c5\x03bb" */
+ 0xc9, 0xef, 0xf5, 0xeb
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME8[] = { /* "\x0391\x03c5\x03b3" */
+ 0xc1, 0xf5, 0xe3
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME9[] = { /* "\x03a3\x03b5\x03c0" */
+ 0xd3, 0xe5, 0xf0
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME10[] = { /* "\x039f\x03ba\x03c4" */
+ 0xcf, 0xea, 0xf4
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME11[] = { /* "\x039d\x03bf\x03b5" */
+ 0xcd, 0xef, 0xe5
+};
+
+static BYTE NLSALLOC(0408) rgbSABBREVMONTHNAME12[] = { /* "\x0394\x03b5\x03ba" */
+ 0xc4, 0xe5, 0xea
+};
+
+static BYTE NLSALLOC(0408) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0408) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbSENGCOUNTRY[] = { /* "Greece" */
+ 0x47, 0x72, 0x65, 0x65, 0x63, 0x65
+};
+
+static BYTE NLSALLOC(0408) rgbSENGLANGUAGE[] = { /* "Greek" */
+ 0x47, 0x72, 0x65, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(0408) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbIDEFAULTANSICODEPAGE[] = { /* "1253" */
+ 0x31, 0x32, 0x35, 0x33
+};
+
+static BYTE NLSALLOC(0408) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbSTIMEFORMAT[] = { /* "h:mm:ss tt" */
+ 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20
+ , 0x74, 0x74
+};
+
+static BYTE NLSALLOC(0408) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0408) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0408) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0408) g_rglcinfo0408[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 5, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 8, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 17, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 2, rgbS1159 }
+ , { 2, rgbS2359 }
+ , { 7, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 6, rgbSDAYNAME4 }
+ , { 9, rgbSDAYNAME5 }
+ , { 7, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 10, rgbSMONTHNAME1 }
+ , { 11, rgbSMONTHNAME2 }
+ , { 7, rgbSMONTHNAME3 }
+ , { 8, rgbSMONTHNAME4 }
+ , { 5, rgbSMONTHNAME5 }
+ , { 7, rgbSMONTHNAME6 }
+ , { 7, rgbSMONTHNAME7 }
+ , { 9, rgbSMONTHNAME8 }
+ , { 11, rgbSMONTHNAME9 }
+ , { 9, rgbSMONTHNAME10 }
+ , { 9, rgbSMONTHNAME11 }
+ , { 10, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 4, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 5, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 10, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0408) g_strinfo0408 = {
+ rgbUCase_0408
+ , rgbLCase_0408
+ , rgwCType12_0408
+ , rgwCType3_0408
+ , rgwSort_0408
+ , NULL
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0409.c b/private/oleauto/src/dispatch/win16/0409.c
new file mode 100644
index 000000000..f22eeb2d0
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0409.c
@@ -0,0 +1,714 @@
+/****************************************************************************
+* 0409.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* English - United States
+*
+* LCID = 0x0409
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:33:44 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(0409) rgwSort_0409[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402f, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0xc02a
+ , 0x403c, 0x403d, 0x403e, 0x4060, 0x403f, 0xc02b, 0x4040, 0x4041
+ , 0x007a, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084
+ , 0x0085, 0x0086, 0x4042, 0x4043, 0x4061, 0x4062, 0x4063, 0x4044
+ , 0x4045, 0x1087, 0x1088, 0x1089, 0x108a, 0x108b, 0x108c, 0x108d
+ , 0x108e, 0x108f, 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095
+ , 0x1096, 0x1097, 0x1098, 0x1099, 0x109a, 0x109c, 0x109d, 0x109e
+ , 0x109f, 0x10a0, 0x10a1, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a
+ , 0x404b, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d
+ , 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095
+ , 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009c, 0x009d, 0x009e
+ , 0x009f, 0x00a0, 0x00a1, 0x404c, 0x404d, 0x404e, 0x404f, 0xc021
+ , 0xc022, 0xc023, 0x405a, 0x018c, 0x405d, 0x4078, 0x4075, 0x4076
+ , 0x4149, 0x4079, 0x1199, 0x405e, 0x0505, 0xc024, 0xc025, 0xc026
+ , 0xc027, 0x4058, 0x4059, 0x405b, 0x405c, 0x4077, 0xc02d, 0xc02e
+ , 0x4057, 0x109b, 0x0199, 0x405f, 0x0605, 0xc028, 0xc029, 0x12a0
+ , 0x4030, 0x4050, 0x4069, 0x406a, 0x406b, 0x406c, 0x4051, 0x406d
+ , 0x4052, 0x406e, 0x0887, 0x4065, 0x406f, 0xc02c, 0x4070, 0x4053
+ , 0x4071, 0x4064, 0x087f, 0x0880, 0x4054, 0x4072, 0x4073, 0x4074
+ , 0x4055, 0x087e, 0x0995, 0x4066, 0x007b, 0x007c, 0x007d, 0x4056
+ , 0x1287, 0x1187, 0x1387, 0x1587, 0x1487, 0x1687, 0x0005, 0x1189
+ , 0x128b, 0x118b, 0x138b, 0x148b, 0x128f, 0x118f, 0x138f, 0x148f
+ , 0x118a, 0x1194, 0x1395, 0x1295, 0x1495, 0x1695, 0x1595, 0x4067
+ , 0x1795, 0x129c, 0x119c, 0x139c, 0x149c, 0x11a0, 0x0105, 0x0205
+ , 0x0287, 0x0187, 0x0387, 0x0587, 0x0487, 0x0687, 0x0305, 0x0189
+ , 0x028b, 0x018b, 0x038b, 0x048b, 0x028f, 0x018f, 0x038f, 0x048f
+ , 0x018a, 0x0194, 0x0395, 0x0295, 0x0495, 0x0695, 0x0595, 0x4068
+ , 0x0795, 0x029c, 0x019c, 0x039c, 0x049c, 0x01a0, 0x0405, 0x02a0
+};
+
+EXPANSION NLSALLOC(0409) rgexp_0409[7] = {
+ { 0x1087, 0x108b }
+ , { 0x109a, 0x108e }
+ , { 0x0099, 0x0099 }
+ , { 0x0087, 0x008b }
+ , { 0x009a, 0x008e }
+ , { 0x1095, 0x108b }
+ , { 0x0095, 0x008b }
+};
+
+WORD NLSALLOC(0409) rgwCType12_0409[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x1101, 0xb010, 0x1101, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0xb010, 0x1102, 0xb010, 0x1102, 0x0020, 0x0020, 0x1101
+ , 0xa048, 0xb010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+};
+
+WORD NLSALLOC(0409) rgwCType3_0409[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0408, 0x0000, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x8003
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0400, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+};
+
+BYTE NLSALLOC(0409) rgbUCase_0409[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x9f
+};
+
+BYTE NLSALLOC(0409) rgbLCase_0409[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xff
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(0409) rgbILANGUAGE[] = { /* "0409" */
+ 0x30, 0x34, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(0409) rgbSLANGUAGE[] = { /* "U.S. English" */
+ 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x45, 0x6e, 0x67
+ , 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVLANGNAME[] = { /* "ENU" */
+ 0x45, 0x4e, 0x55
+};
+
+static BYTE NLSALLOC(0409) rgbSNATIVELANGNAME[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0409) rgbICOUNTRY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0409) rgbSCOUNTRY[] = { /* "United States" */
+ 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53
+ , 0x74, 0x61, 0x74, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVCTRYNAME[] = { /* "USA" */
+ 0x55, 0x53, 0x41
+};
+
+static BYTE NLSALLOC(0409) rgbSNATIVECTRYNAME[] = { /* "United States" */
+ 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53
+ , 0x74, 0x61, 0x74, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0409) rgbIDEFAULTLANGUAGE[] = { /* "0409" */
+ 0x30, 0x34, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(0409) rgbIDEFAULTCOUNTRY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0409) rgbIDEFAULTCODEPAGE[] = { /* "437" */
+ 0x34, 0x33, 0x37
+};
+
+static BYTE NLSALLOC(0409) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0409) rgbIMEASURE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0409) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0409) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0409) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0409) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0409) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0409) rgbSCURRENCY[] = { /* "$" */
+ 0x24
+};
+
+static BYTE NLSALLOC(0409) rgbSINTLSYMBOL[] = { /* "USD" */
+ 0x55, 0x53, 0x44
+};
+
+static BYTE NLSALLOC(0409) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0409) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0409) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0409) rgbICURRENCY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbINEGCURR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0409) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0409) rgbSSHORTDATE[] = { /* "M/d/yy" */
+ 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSLONGDATE[] = { /* "dddd, MMMM dd, yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d
+ , 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x2c, 0x20, 0x79
+ , 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbIDATE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbILDATE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbIMONLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbS1159[] = { /* "AM" */
+ 0x41, 0x4d
+};
+
+static BYTE NLSALLOC(0409) rgbS2359[] = { /* "PM" */
+ 0x50, 0x4d
+};
+
+static BYTE NLSALLOC(0409) rgbSDAYNAME1[] = { /* "Monday" */
+ 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSDAYNAME2[] = { /* "Tuesday" */
+ 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSDAYNAME3[] = { /* "Wednesday" */
+ 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61
+ , 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSDAYNAME4[] = { /* "Thursday" */
+ 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSDAYNAME5[] = { /* "Friday" */
+ 0x46, 0x72, 0x69, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSDAYNAME6[] = { /* "Saturday" */
+ 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSDAYNAME7[] = { /* "Sunday" */
+ 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVDAYNAME1[] = { /* "Mon" */
+ 0x4d, 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVDAYNAME2[] = { /* "Tue" */
+ 0x54, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVDAYNAME3[] = { /* "Wed" */
+ 0x57, 0x65, 0x64
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVDAYNAME4[] = { /* "Thu" */
+ 0x54, 0x68, 0x75
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVDAYNAME5[] = { /* "Fri" */
+ 0x46, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVDAYNAME6[] = { /* "Sat" */
+ 0x53, 0x61, 0x74
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVDAYNAME7[] = { /* "Sun" */
+ 0x53, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME1[] = { /* "January" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME2[] = { /* "February" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME3[] = { /* "March" */
+ 0x4d, 0x61, 0x72, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME6[] = { /* "June" */
+ 0x4a, 0x75, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME7[] = { /* "July" */
+ 0x4a, 0x75, 0x6c, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME10[] = { /* "October" */
+ 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0409) rgbSMONTHNAME12[] = { /* "December" */
+ 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME3[] = { /* "Mar" */
+ 0x4d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME10[] = { /* "Oct" */
+ 0x4f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0409) rgbSABBREVMONTHNAME12[] = { /* "Dec" */
+ 0x44, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0409) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0409) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0409) rgbINEGSIGNPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0409) rgbIPOSSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0409) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbSENGCOUNTRY[] = { /* "United States" */
+ 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53
+ , 0x74, 0x61, 0x74, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0409) rgbSENGLANGUAGE[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0409) rgbIFIRSTDAYOFWEEK[] = { /* "6" */
+ 0x36
+};
+
+static BYTE NLSALLOC(0409) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0409) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0409) rgbSTIMEFORMAT[] = { /* "h:mm:ss tt" */
+ 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20
+ , 0x74, 0x74
+};
+
+static BYTE NLSALLOC(0409) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0409) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0409) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0409) g_rglcinfo0409[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 12, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 1, rgbICOUNTRY }
+ , { 13, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 13, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 1, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 6, rgbSSHORTDATE }
+ , { 19, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 2, rgbS1159 }
+ , { 2, rgbS2359 }
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 13, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 10, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0409) g_strinfo0409 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/040a.c b/private/oleauto/src/dispatch/win16/040a.c
new file mode 100644
index 000000000..ed65a336c
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/040a.c
@@ -0,0 +1,723 @@
+/****************************************************************************
+* 040a.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Spanish - Spain (Traditional Sort)
+*
+* LCID = 0x040a
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:51:34 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(040a) rgwSort_040a[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402f, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0xc02a
+ , 0x403c, 0x403d, 0x403e, 0x4060, 0x403f, 0xc02b, 0x4040, 0x4041
+ , 0x007a, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084
+ , 0x0085, 0x0086, 0x4042, 0x4043, 0x4061, 0x4062, 0x4063, 0x4044
+ , 0x4045, 0x1087, 0x1088, 0x0006, 0x108b, 0x108c, 0x108d, 0x108e
+ , 0x108f, 0x1090, 0x1091, 0x1092, 0x0306, 0x1095, 0x1096, 0x1098
+ , 0x1099, 0x109a, 0x109b, 0x109c, 0x109d, 0x109f, 0x10a0, 0x10a1
+ , 0x10a2, 0x10a3, 0x10a4, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a
+ , 0x404b, 0x0087, 0x0088, 0x0606, 0x008b, 0x008c, 0x008d, 0x008e
+ , 0x008f, 0x0090, 0x0091, 0x0092, 0x0806, 0x0095, 0x0096, 0x0098
+ , 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009f, 0x00a0, 0x00a1
+ , 0x00a2, 0x00a3, 0x00a4, 0x404c, 0x404d, 0x404e, 0x404f, 0xc021
+ , 0xc022, 0xc023, 0x405a, 0x018d, 0x405d, 0x4078, 0x4075, 0x4076
+ , 0x4149, 0x4079, 0x119c, 0x405e, 0x0505, 0xc024, 0xc025, 0xc026
+ , 0xc027, 0x4058, 0x4059, 0x405b, 0x405c, 0x4077, 0xc02d, 0xc02e
+ , 0x4057, 0x109e, 0x019c, 0x405f, 0x0605, 0xc028, 0xc029, 0x12a3
+ , 0x4030, 0x4050, 0x4069, 0x406a, 0x406b, 0x406c, 0x4051, 0x406d
+ , 0x4052, 0x406e, 0x0887, 0x4065, 0x406f, 0xc02c, 0x4070, 0x4053
+ , 0x4071, 0x4064, 0x087f, 0x0880, 0x4054, 0x4072, 0x4073, 0x4074
+ , 0x4055, 0x087e, 0x0998, 0x4066, 0x007b, 0x007c, 0x007d, 0x4056
+ , 0x1287, 0x1187, 0x1387, 0x1587, 0x1487, 0x1687, 0x0005, 0x1189
+ , 0x128c, 0x118c, 0x138c, 0x148c, 0x1290, 0x1190, 0x1390, 0x1490
+ , 0x118b, 0x1097, 0x1398, 0x1298, 0x1498, 0x1698, 0x1598, 0x4067
+ , 0x1798, 0x129f, 0x119f, 0x139f, 0x149f, 0x11a3, 0x0105, 0x0205
+ , 0x0287, 0x0187, 0x0387, 0x0587, 0x0487, 0x0687, 0x0305, 0x0189
+ , 0x028c, 0x018c, 0x038c, 0x048c, 0x0290, 0x0190, 0x0390, 0x0490
+ , 0x018b, 0x0097, 0x0398, 0x0298, 0x0498, 0x0698, 0x0598, 0x4068
+ , 0x0798, 0x029f, 0x019f, 0x039f, 0x049f, 0x01a3, 0x0405, 0x02a3
+};
+
+DIGRAPH NLSALLOC(040a) rgdig_040a[10] = {
+ { 0x1089, 0x02 }
+ , { 0x188a, 0x48 }
+ , { 0x108a, 0x68 }
+ , { 0x1093, 0x02 }
+ , { 0x1894, 0x4c }
+ , { 0x1094, 0x6c }
+ , { 0x0089, 0x02 }
+ , { 0x008a, 0x68 }
+ , { 0x0093, 0x02 }
+ , { 0x0094, 0x6c }
+};
+
+EXPANSION NLSALLOC(040a) rgexp_040a[7] = {
+ { 0x1087, 0x108c }
+ , { 0x109d, 0x108f }
+ , { 0x009c, 0x009c }
+ , { 0x0087, 0x008c }
+ , { 0x009d, 0x008f }
+ , { 0x1098, 0x108c }
+ , { 0x0098, 0x008c }
+};
+
+WORD NLSALLOC(040a) rgwCType12_040a[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x1101, 0xb010, 0x1101, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0xb010, 0x1102, 0xb010, 0x1102, 0x0020, 0x0020, 0x1101
+ , 0xa048, 0xb010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+};
+
+WORD NLSALLOC(040a) rgwCType3_040a[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0408, 0x0000, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x8003
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0400, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+};
+
+BYTE NLSALLOC(040a) rgbUCase_040a[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x9f
+};
+
+BYTE NLSALLOC(040a) rgbLCase_040a[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xff
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(040a) rgbILANGUAGE[] = { /* "040a" */
+ 0x30, 0x34, 0x30, 0x61
+};
+
+static BYTE NLSALLOC(040a) rgbSLANGUAGE[] = { /* "Spanish - Traditional Sort" */
+ 0x53, 0x70, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20
+ , 0x2d, 0x20, 0x54, 0x72, 0x61, 0x64, 0x69, 0x74
+ , 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x6f
+ , 0x72, 0x74
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVLANGNAME[] = { /* "ESP" */
+ 0x45, 0x53, 0x50
+};
+
+static BYTE NLSALLOC(040a) rgbSNATIVELANGNAME[] = { /* "Español" */
+ 0x45, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c
+};
+
+static BYTE NLSALLOC(040a) rgbICOUNTRY[] = { /* "34" */
+ 0x33, 0x34
+};
+
+static BYTE NLSALLOC(040a) rgbSCOUNTRY[] = { /* "Spain" */
+ 0x53, 0x70, 0x61, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVCTRYNAME[] = { /* "ESP" */
+ 0x45, 0x53, 0x50
+};
+
+static BYTE NLSALLOC(040a) rgbSNATIVECTRYNAME[] = { /* "España" */
+ 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61
+};
+
+static BYTE NLSALLOC(040a) rgbIDEFAULTLANGUAGE[] = { /* "040a" */
+ 0x30, 0x34, 0x30, 0x61
+};
+
+static BYTE NLSALLOC(040a) rgbIDEFAULTCOUNTRY[] = { /* "34" */
+ 0x33, 0x34
+};
+
+static BYTE NLSALLOC(040a) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(040a) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040a) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040a) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040a) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(040a) rgbSCURRENCY[] = { /* "Pts" */
+ 0x50, 0x74, 0x73
+};
+
+static BYTE NLSALLOC(040a) rgbSINTLSYMBOL[] = { /* "ESP" */
+ 0x45, 0x53, 0x50
+};
+
+static BYTE NLSALLOC(040a) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040a) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbICURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbIINTLCURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(040a) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(040a) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(040a) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(040a) rgbSSHORTDATE[] = { /* "d/MM/yy" */
+ 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040a) rgbSLONGDATE[] = { /* "dddd d' de 'MMMM' de 'yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x27, 0x20
+ , 0x64, 0x65, 0x20, 0x27, 0x4d, 0x4d, 0x4d, 0x4d
+ , 0x27, 0x20, 0x64, 0x65, 0x20, 0x27, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040a) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbSDAYNAME1[] = { /* "lunes" */
+ 0x6c, 0x75, 0x6e, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(040a) rgbSDAYNAME2[] = { /* "martes" */
+ 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(040a) rgbSDAYNAME3[] = { /* "miércoles" */
+ 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65
+ , 0x73
+};
+
+static BYTE NLSALLOC(040a) rgbSDAYNAME4[] = { /* "jueves" */
+ 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(040a) rgbSDAYNAME5[] = { /* "viernes" */
+ 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(040a) rgbSDAYNAME6[] = { /* "sábado" */
+ 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSDAYNAME7[] = { /* "domingo" */
+ 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVDAYNAME1[] = { /* "lun" */
+ 0x6c, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVDAYNAME2[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVDAYNAME3[] = { /* "mié" */
+ 0x6d, 0x69, 0xe9
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVDAYNAME4[] = { /* "jue" */
+ 0x6a, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVDAYNAME5[] = { /* "vie" */
+ 0x76, 0x69, 0x65
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVDAYNAME6[] = { /* "sáb" */
+ 0x73, 0xe1, 0x62
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVDAYNAME7[] = { /* "dom" */
+ 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME1[] = { /* "enero" */
+ 0x65, 0x6e, 0x65, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME2[] = { /* "febrero" */
+ 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME3[] = { /* "marzo" */
+ 0x6d, 0x61, 0x72, 0x7a, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME4[] = { /* "abril" */
+ 0x61, 0x62, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME5[] = { /* "mayo" */
+ 0x6d, 0x61, 0x79, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME6[] = { /* "junio" */
+ 0x6a, 0x75, 0x6e, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME7[] = { /* "julio" */
+ 0x6a, 0x75, 0x6c, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME8[] = { /* "agosto" */
+ 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME9[] = { /* "septiembre" */
+ 0x73, 0x65, 0x70, 0x74, 0x69, 0x65, 0x6d, 0x62
+ , 0x72, 0x65
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME10[] = { /* "octubre" */
+ 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME11[] = { /* "noviembre" */
+ 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(040a) rgbSMONTHNAME12[] = { /* "diciembre" */
+ 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME1[] = { /* "ene" */
+ 0x65, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME4[] = { /* "abr" */
+ 0x61, 0x62, 0x72
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME5[] = { /* "may" */
+ 0x6d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME8[] = { /* "ago" */
+ 0x61, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME10[] = { /* "oct" */
+ 0x6f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(040a) rgbSABBREVMONTHNAME12[] = { /* "dic" */
+ 0x64, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(040a) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(040a) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbSENGCOUNTRY[] = { /* "Spain" */
+ 0x53, 0x70, 0x61, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(040a) rgbSENGLANGUAGE[] = { /* "Spanish - Traditional Sort" */
+ 0x53, 0x70, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20
+ , 0x2d, 0x20, 0x54, 0x72, 0x61, 0x64, 0x69, 0x74
+ , 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x6f
+ , 0x72, 0x74
+};
+
+static BYTE NLSALLOC(040a) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(040a) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(040a) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040a) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040a) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(040a) g_rglcinfo040a[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 26, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 26, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 5, rgbSDAYNAME1 }
+ , { 6, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 6, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 10, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 9, rgbSMONTHNAME11 }
+ , { 9, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 26, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(040a) g_strinfo040a = {
+ rgbUCase_040a
+ , rgbLCase_040a
+ , rgwCType12_040a
+ , rgwCType3_040a
+ , rgwSort_040a
+ , rgexp_040a
+ , rgdig_040a
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/040b.c b/private/oleauto/src/dispatch/win16/040b.c
new file mode 100644
index 000000000..372b500a5
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/040b.c
@@ -0,0 +1,526 @@
+/****************************************************************************
+* 040b.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Finnish - Finland
+*
+* LCID = 0x040b
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 18:00:59 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_041d[256]; // from 041d:Swedish - Sweden
+extern EXPANSION rgexp_041d[7];
+extern WORD rgwCType12_041d[256];
+extern WORD rgwCType3_041d[256];
+extern BYTE rgbUCase_041d[256];
+extern BYTE rgbLCase_041d[256];
+
+static BYTE NLSALLOC(040b) rgbILANGUAGE[] = { /* "040b" */
+ 0x30, 0x34, 0x30, 0x62
+};
+
+static BYTE NLSALLOC(040b) rgbSLANGUAGE[] = { /* "Finnish" */
+ 0x46, 0x69, 0x6e, 0x6e, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVLANGNAME[] = { /* "FIN" */
+ 0x46, 0x49, 0x4e
+};
+
+static BYTE NLSALLOC(040b) rgbSNATIVELANGNAME[] = { /* "suomi" */
+ 0x73, 0x75, 0x6f, 0x6d, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbICOUNTRY[] = { /* "358" */
+ 0x33, 0x35, 0x38
+};
+
+static BYTE NLSALLOC(040b) rgbSCOUNTRY[] = { /* "Finland" */
+ 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVCTRYNAME[] = { /* "FIN" */
+ 0x46, 0x49, 0x4e
+};
+
+static BYTE NLSALLOC(040b) rgbSNATIVECTRYNAME[] = { /* "Suomi" */
+ 0x53, 0x75, 0x6f, 0x6d, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbIDEFAULTLANGUAGE[] = { /* "040b" */
+ 0x30, 0x34, 0x30, 0x62
+};
+
+static BYTE NLSALLOC(040b) rgbIDEFAULTCOUNTRY[] = { /* "358" */
+ 0x33, 0x35, 0x38
+};
+
+static BYTE NLSALLOC(040b) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(040b) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040b) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(040b) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040b) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(040b) rgbSCURRENCY[] = { /* "mk" */
+ 0x6d, 0x6b
+};
+
+static BYTE NLSALLOC(040b) rgbSINTLSYMBOL[] = { /* "FIM" */
+ 0x46, 0x49, 0x4d
+};
+
+static BYTE NLSALLOC(040b) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(040b) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040b) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040b) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(040b) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(040b) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040b) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(040b) rgbSSHORTDATE[] = { /* "d.M.yyyy" */
+ 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040b) rgbSLONGDATE[] = { /* "d. MMMM'ta 'yyyy" */
+ 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27
+ , 0x74, 0x61, 0x20, 0x27, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040b) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbIMONLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbSDAYNAME1[] = { /* "maanantai" */
+ 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61
+ , 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSDAYNAME2[] = { /* "tiistai" */
+ 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSDAYNAME3[] = { /* "keskiviikko" */
+ 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69
+ , 0x6b, 0x6b, 0x6f
+};
+
+static BYTE NLSALLOC(040b) rgbSDAYNAME4[] = { /* "torstai" */
+ 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSDAYNAME5[] = { /* "perjantai" */
+ 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61
+ , 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSDAYNAME6[] = { /* "lauantai" */
+ 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSDAYNAME7[] = { /* "sunnuntai" */
+ 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61
+ , 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVDAYNAME1[] = { /* "ma" */
+ 0x6d, 0x61
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVDAYNAME2[] = { /* "ti" */
+ 0x74, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVDAYNAME3[] = { /* "ke" */
+ 0x6b, 0x65
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVDAYNAME4[] = { /* "to" */
+ 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVDAYNAME5[] = { /* "pe" */
+ 0x70, 0x65
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVDAYNAME6[] = { /* "la" */
+ 0x6c, 0x61
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVDAYNAME7[] = { /* "su" */
+ 0x73, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME1[] = { /* "tammikuu" */
+ 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME2[] = { /* "helmikuu" */
+ 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME3[] = { /* "maaliskuu" */
+ 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75
+ , 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME4[] = { /* "huhtikuu" */
+ 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME5[] = { /* "toukokuu" */
+ 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME6[] = { /* "kesäkuu" */
+ 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME7[] = { /* "heinäkuu" */
+ 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME8[] = { /* "elokuu" */
+ 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME9[] = { /* "syyskuu" */
+ 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME10[] = { /* "lokakuu" */
+ 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME11[] = { /* "marraskuu" */
+ 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75
+ , 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSMONTHNAME12[] = { /* "joulukuu" */
+ 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME1[] = { /* "tammi" */
+ 0x74, 0x61, 0x6d, 0x6d, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME2[] = { /* "helmi" */
+ 0x68, 0x65, 0x6c, 0x6d, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME3[] = { /* "maalis" */
+ 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME4[] = { /* "huhti" */
+ 0x68, 0x75, 0x68, 0x74, 0x69
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME5[] = { /* "touko" */
+ 0x74, 0x6f, 0x75, 0x6b, 0x6f
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME6[] = { /* "kesä" */
+ 0x6b, 0x65, 0x73, 0xe4
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME7[] = { /* "heinä" */
+ 0x68, 0x65, 0x69, 0x6e, 0xe4
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME8[] = { /* "elo" */
+ 0x65, 0x6c, 0x6f
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME9[] = { /* "syys" */
+ 0x73, 0x79, 0x79, 0x73
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME10[] = { /* "loka" */
+ 0x6c, 0x6f, 0x6b, 0x61
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME11[] = { /* "marras" */
+ 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73
+};
+
+static BYTE NLSALLOC(040b) rgbSABBREVMONTHNAME12[] = { /* "joulu" */
+ 0x6a, 0x6f, 0x75, 0x6c, 0x75
+};
+
+static BYTE NLSALLOC(040b) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(040b) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbSENGCOUNTRY[] = { /* "Finland" */
+ 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(040b) rgbSENGLANGUAGE[] = { /* "Finnish" */
+ 0x46, 0x69, 0x6e, 0x6e, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(040b) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040b) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(040b) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(040b) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040b) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040b) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(040b) g_rglcinfo040b[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 7, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 5, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 5, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 16, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 9, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 11, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 9, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 9, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 8, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 9, rgbSMONTHNAME3 }
+ , { 8, rgbSMONTHNAME4 }
+ , { 8, rgbSMONTHNAME5 }
+ , { 7, rgbSMONTHNAME6 }
+ , { 8, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 7, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 9, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 5, rgbSABBREVMONTHNAME2 }
+ , { 6, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 5, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 4, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 5, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(040b) g_strinfo040b = {
+ rgbUCase_041d
+ , rgbLCase_041d
+ , rgwCType12_041d
+ , rgwCType3_041d
+ , rgwSort_041d
+ , rgexp_041d
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/040c.c b/private/oleauto/src/dispatch/win16/040c.c
new file mode 100644
index 000000000..d9d667bed
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/040c.c
@@ -0,0 +1,521 @@
+/****************************************************************************
+* 040c.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* French - France
+*
+* LCID = 0x040c
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:35:52 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(040c) rgbILANGUAGE[] = { /* "040c" */
+ 0x30, 0x34, 0x30, 0x63
+};
+
+static BYTE NLSALLOC(040c) rgbSLANGUAGE[] = { /* "French" */
+ 0x46, 0x72, 0x65, 0x6e, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVLANGNAME[] = { /* "FRA" */
+ 0x46, 0x52, 0x41
+};
+
+static BYTE NLSALLOC(040c) rgbSNATIVELANGNAME[] = { /* "français" */
+ 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73
+};
+
+static BYTE NLSALLOC(040c) rgbICOUNTRY[] = { /* "33" */
+ 0x33, 0x33
+};
+
+static BYTE NLSALLOC(040c) rgbSCOUNTRY[] = { /* "France" */
+ 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVCTRYNAME[] = { /* "FRA" */
+ 0x46, 0x52, 0x41
+};
+
+static BYTE NLSALLOC(040c) rgbSNATIVECTRYNAME[] = { /* "France" */
+ 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65
+};
+
+static BYTE NLSALLOC(040c) rgbIDEFAULTLANGUAGE[] = { /* "040c" */
+ 0x30, 0x34, 0x30, 0x63
+};
+
+static BYTE NLSALLOC(040c) rgbIDEFAULTCOUNTRY[] = { /* "33" */
+ 0x33, 0x33
+};
+
+static BYTE NLSALLOC(040c) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(040c) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040c) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(040c) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040c) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(040c) rgbSCURRENCY[] = { /* "F" */
+ 0x46
+};
+
+static BYTE NLSALLOC(040c) rgbSINTLSYMBOL[] = { /* "FRF" */
+ 0x46, 0x52, 0x46
+};
+
+static BYTE NLSALLOC(040c) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(040c) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040c) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040c) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(040c) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(040c) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(040c) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(040c) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040c) rgbSLONGDATE[] = { /* "dddd d MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d
+ , 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040c) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbSDAYNAME1[] = { /* "lundi" */
+ 0x6c, 0x75, 0x6e, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(040c) rgbSDAYNAME2[] = { /* "mardi" */
+ 0x6d, 0x61, 0x72, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(040c) rgbSDAYNAME3[] = { /* "mercredi" */
+ 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(040c) rgbSDAYNAME4[] = { /* "jeudi" */
+ 0x6a, 0x65, 0x75, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(040c) rgbSDAYNAME5[] = { /* "vendredi" */
+ 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(040c) rgbSDAYNAME6[] = { /* "samedi" */
+ 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(040c) rgbSDAYNAME7[] = { /* "dimanche" */
+ 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVDAYNAME1[] = { /* "lun." */
+ 0x6c, 0x75, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVDAYNAME2[] = { /* "mar." */
+ 0x6d, 0x61, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVDAYNAME3[] = { /* "mer." */
+ 0x6d, 0x65, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVDAYNAME4[] = { /* "jeu." */
+ 0x6a, 0x65, 0x75, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVDAYNAME5[] = { /* "ven." */
+ 0x76, 0x65, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVDAYNAME6[] = { /* "sam." */
+ 0x73, 0x61, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVDAYNAME7[] = { /* "dim." */
+ 0x64, 0x69, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME1[] = { /* "janvier" */
+ 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME2[] = { /* "février" */
+ 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME4[] = { /* "avril" */
+ 0x61, 0x76, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME6[] = { /* "juin" */
+ 0x6a, 0x75, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME7[] = { /* "juillet" */
+ 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME8[] = { /* "août" */
+ 0x61, 0x6f, 0xfb, 0x74
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME9[] = { /* "septembre" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME10[] = { /* "octobre" */
+ 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME11[] = { /* "novembre" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(040c) rgbSMONTHNAME12[] = { /* "décembre" */
+ 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME1[] = { /* "janv." */
+ 0x6a, 0x61, 0x6e, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME2[] = { /* "févr." */
+ 0x66, 0xe9, 0x76, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME4[] = { /* "avr." */
+ 0x61, 0x76, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME6[] = { /* "juin" */
+ 0x6a, 0x75, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME7[] = { /* "juil." */
+ 0x6a, 0x75, 0x69, 0x6c, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME8[] = { /* "août" */
+ 0x61, 0x6f, 0xfb, 0x74
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME9[] = { /* "sept." */
+ 0x73, 0x65, 0x70, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME10[] = { /* "oct." */
+ 0x6f, 0x63, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME11[] = { /* "nov." */
+ 0x6e, 0x6f, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSABBREVMONTHNAME12[] = { /* "déc." */
+ 0x64, 0xe9, 0x63, 0x2e
+};
+
+static BYTE NLSALLOC(040c) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(040c) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbSENGCOUNTRY[] = { /* "France" */
+ 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65
+};
+
+static BYTE NLSALLOC(040c) rgbSENGLANGUAGE[] = { /* "French" */
+ 0x46, 0x72, 0x65, 0x6e, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(040c) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(040c) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(040c) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040c) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040c) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(040c) g_rglcinfo040c[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 8, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 16, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 5, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 8, rgbSDAYNAME7 }
+ , { 4, rgbSABBREVDAYNAME1 }
+ , { 4, rgbSABBREVDAYNAME2 }
+ , { 4, rgbSABBREVDAYNAME3 }
+ , { 4, rgbSABBREVDAYNAME4 }
+ , { 4, rgbSABBREVDAYNAME5 }
+ , { 4, rgbSABBREVDAYNAME6 }
+ , { 4, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 7, rgbSMONTHNAME7 }
+ , { 4, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 5, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 4, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 4, rgbSABBREVMONTHNAME11 }
+ , { 4, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(040c) g_strinfo040c = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/040d.c b/private/oleauto/src/dispatch/win16/040d.c
new file mode 100644
index 000000000..a8359f0e7
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/040d.c
@@ -0,0 +1,696 @@
+/****************************************************************************
+* 040d.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Hebrew - Israel
+*
+* LCID = 0x040d
+*
+* CodePage = 1255
+*
+* Generated: Thu Dec 01 18:25:21 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(040d) rgwSort_040d[256] = {
+ 0x0000, 0xc018, 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e
+ , 0xc01f, 0x4047, 0x4048, 0x4049, 0x404a, 0x404b, 0xc020, 0xc021
+ , 0xc022, 0xc023, 0xc024, 0xc025, 0xc026, 0xc027, 0xc028, 0xc029
+ , 0xc02a, 0xc02b, 0xc02c, 0xc02d, 0xc02e, 0xc02f, 0xc030, 0xc031
+ , 0x4045, 0x404c, 0x404d, 0x404e, 0x404f, 0x4050, 0x4051, 0xc040
+ , 0x4052, 0x4053, 0x4054, 0x4078, 0x4055, 0xc041, 0x4056, 0x4057
+ , 0x0092, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c
+ , 0x009d, 0x009e, 0x4058, 0x4059, 0x4079, 0x407a, 0x407b, 0x405a
+ , 0x405b, 0x189f, 0x18a0, 0x18a1, 0x18a2, 0x18a3, 0x18a4, 0x18a5
+ , 0x18a6, 0x18a7, 0x18a8, 0x18a9, 0x18aa, 0x18ab, 0x18ac, 0x18ad
+ , 0x18ae, 0x18af, 0x18b0, 0x18b1, 0x18b2, 0x18b4, 0x18b5, 0x18b6
+ , 0x18b7, 0x18b8, 0x18b9, 0x405c, 0x405d, 0x405e, 0x405f, 0x4060
+ , 0x4061, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5
+ , 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad
+ , 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b4, 0x00b5, 0x00b6
+ , 0x00b7, 0x00b8, 0x00b9, 0x4062, 0x4063, 0x4064, 0x4065, 0xc032
+ , 0xc033, 0xc034, 0x4072, 0x01a4, 0x4075, 0x4090, 0x408d, 0x408e
+ , 0x415f, 0x4091, 0xc035, 0x4076, 0xc036, 0xc037, 0xc038, 0xc039
+ , 0xc03a, 0x4070, 0x4071, 0x4073, 0x4074, 0x408f, 0xc043, 0xc044
+ , 0x406d, 0x18b3, 0xc03b, 0x4077, 0xc03c, 0xc03d, 0xc03e, 0xc03f
+ , 0x4046, 0x4066, 0x4081, 0x4082, 0x4083, 0x4084, 0x4067, 0x4085
+ , 0x4068, 0x4086, 0x407f, 0x407d, 0x4087, 0xc042, 0x4088, 0x4069
+ , 0x4089, 0x407c, 0x1097, 0x1098, 0x406a, 0x408a, 0x408b, 0x408c
+ , 0x406b, 0x1096, 0x4080, 0x407e, 0x0093, 0x0094, 0x0095, 0x406c
+ , 0x4007, 0x4008, 0x4009, 0x400a, 0x400b, 0x400c, 0x400d, 0x400e
+ , 0x400f, 0x4010, 0x08d0, 0x4011, 0x4012, 0x4013, 0x406e, 0x4014
+ , 0x4015, 0x4016, 0x4017, 0x406f, 0x08d1, 0x08d2, 0x08d3, 0x08d4
+ , 0x08d5, 0x08d6, 0x08d7, 0x08d8, 0x08d9, 0x08da, 0x08db, 0x08dc
+ , 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1
+ , 0x00c2, 0x00c3, 0x18c4, 0x00c4, 0x00c5, 0x18c6, 0x00c6, 0x18c7
+ , 0x00c7, 0x00c8, 0x00c9, 0x18ca, 0x00ca, 0x18cb, 0x00cb, 0x00cc
+ , 0x00cd, 0x00ce, 0x00cf, 0x08dd, 0x08de, 0x0000, 0x0000, 0x08df
+};
+
+WORD NLSALLOC(040d) rgwCType12_040d[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x0020, 0xb010, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0xb010, 0x0020, 0xb010, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x2010, 0x2010, 0x2010, 0x2010, 0x2010, 0x2010, 0x2010, 0x2010
+ , 0x2010, 0x2010, 0x0000, 0x2010, 0x2010, 0x2010, 0x2010, 0x2010
+ , 0x2010, 0x2010, 0x2010, 0x2010, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100
+ , 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100
+ , 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100
+ , 0x2100, 0x2100, 0x2100, 0x0000, 0x0000, 0x1010, 0x2010, 0x0000
+};
+
+WORD NLSALLOC(040d) rgwCType3_040d[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0408, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0008, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001
+ , 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0008, 0x0001
+ , 0x0008, 0x0001, 0x0001, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+BYTE NLSALLOC(040d) rgbUCase_040d[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+BYTE NLSALLOC(040d) rgbLCase_040d[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(040d) rgbILANGUAGE[] = { /* "040d" */
+ 0x30, 0x34, 0x30, 0x64
+};
+
+static BYTE NLSALLOC(040d) rgbSLANGUAGE[] = { /* "Hebrew" */
+ 0x48, 0x65, 0x62, 0x72, 0x65, 0x77
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVLANGNAME[] = { /* "HEB" */
+ 0x48, 0x45, 0x42
+};
+
+static BYTE NLSALLOC(040d) rgbSNATIVELANGNAME[] = { /* "\x05e2\x05d1\x05e8\x05d9\x05ea" */
+ 0xf2, 0xe1, 0xf8, 0xe9, 0xfa
+};
+
+static BYTE NLSALLOC(040d) rgbICOUNTRY[] = { /* "972" */
+ 0x39, 0x37, 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbSCOUNTRY[] = { /* "Israel" */
+ 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVCTRYNAME[] = { /* "ISR" */
+ 0x49, 0x53, 0x52
+};
+
+static BYTE NLSALLOC(040d) rgbSNATIVECTRYNAME[] = { /* "\x05d9\x05e9\x05e8\x05d0\x05dc" */
+ 0xe9, 0xf9, 0xf8, 0xe0, 0xec
+};
+
+static BYTE NLSALLOC(040d) rgbIDEFAULTLANGUAGE[] = { /* "040d" */
+ 0x30, 0x34, 0x30, 0x64
+};
+
+static BYTE NLSALLOC(040d) rgbIDEFAULTCOUNTRY[] = { /* "972" */
+ 0x39, 0x37, 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbIDEFAULTCODEPAGE[] = { /* "862" */
+ 0x38, 0x36, 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(040d) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040d) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040d) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbILZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(040d) rgbSCURRENCY[] = { /* "\x00a4" */
+ 0xa4
+};
+
+static BYTE NLSALLOC(040d) rgbSINTLSYMBOL[] = { /* "ILS" */
+ 0x49, 0x4c, 0x53
+};
+
+static BYTE NLSALLOC(040d) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040d) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbINEGCURR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(040d) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(040d) rgbSSHORTDATE[] = { /* "MM/dd/yy" */
+ 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040d) rgbSLONGDATE[] = { /* "MMMM dd, yyyy" */
+ 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x2c
+ , 0x20, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040d) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040d) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040d) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040d) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbIMONLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbS1159[] = { /* "AM" */
+ 0x41, 0x4d
+};
+
+static BYTE NLSALLOC(040d) rgbS2359[] = { /* "PM" */
+ 0x50, 0x4d
+};
+
+static BYTE NLSALLOC(040d) rgbSDAYNAME1[] = { /* "\x05e8\x05d0\x05e9\x05d5\x05df" */
+ 0xf8, 0xe0, 0xf9, 0xe5, 0xef
+};
+
+static BYTE NLSALLOC(040d) rgbSDAYNAME2[] = { /* "\x05e9\x05e0\x05d9" */
+ 0xf9, 0xf0, 0xe9
+};
+
+static BYTE NLSALLOC(040d) rgbSDAYNAME3[] = { /* "\x05e9\x05dc\x05d9\x05e9\x05d9" */
+ 0xf9, 0xec, 0xe9, 0xf9, 0xe9
+};
+
+static BYTE NLSALLOC(040d) rgbSDAYNAME4[] = { /* "\x05e8\x05d1\x05d9\x05e2\x05d9" */
+ 0xf8, 0xe1, 0xe9, 0xf2, 0xe9
+};
+
+static BYTE NLSALLOC(040d) rgbSDAYNAME5[] = { /* "\x05d7\x05de\x05d9\x05e9\x05d9" */
+ 0xe7, 0xee, 0xe9, 0xf9, 0xe9
+};
+
+static BYTE NLSALLOC(040d) rgbSDAYNAME6[] = { /* "\x05e9\x05e9\x05d9" */
+ 0xf9, 0xf9, 0xe9
+};
+
+static BYTE NLSALLOC(040d) rgbSDAYNAME7[] = { /* "\x05e9\x05d1\x05ea" */
+ 0xf9, 0xe1, 0xfa
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVDAYNAME1[] = { /* "\x05d0" */
+ 0xe0
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVDAYNAME2[] = { /* "\x05d1" */
+ 0xe1
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVDAYNAME3[] = { /* "\x05d2" */
+ 0xe2
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVDAYNAME4[] = { /* "\x05d3" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVDAYNAME5[] = { /* "\x05d4" */
+ 0xe4
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVDAYNAME6[] = { /* "\x05d5" */
+ 0xe5
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVDAYNAME7[] = { /* "\x05e9" */
+ 0xf9
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME1[] = { /* "\x05ea\x05e9\x05e8\x05d9" */
+ 0xfa, 0xf9, 0xf8, 0xe9
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME2[] = { /* "\x05d7\x05e9\x05d5\x05df" */
+ 0xe7, 0xf9, 0xe5, 0xef
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME3[] = { /* "\x05db\x05e1\x05dc\x05d5" */
+ 0xeb, 0xf1, 0xec, 0xe5
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME4[] = { /* "\x05d8\x05d1\x05ea" */
+ 0xe8, 0xe1, 0xfa
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME5[] = { /* "\x05e9\x05d1\x05d8" */
+ 0xf9, 0xe1, 0xe8
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME6[] = { /* "\x05d0\x05d3\x05e8" */
+ 0xe0, 0xe3, 0xf8
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME7[] = { /* "\x05e0\x05d9\x05e1\x05df" */
+ 0xf0, 0xe9, 0xf1, 0xef
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME8[] = { /* "\x05d0\x05d9\x05d9\x05e8" */
+ 0xe0, 0xe9, 0xe9, 0xf8
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME9[] = { /* "\x05e1\x05d9\x05d5\x05df" */
+ 0xf1, 0xe9, 0xe5, 0xef
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME10[] = { /* "\x05ea\x05de\x05d5\x05d6" */
+ 0xfa, 0xee, 0xe5, 0xe6
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME11[] = { /* "\x05d0\x05d1" */
+ 0xe0, 0xe1
+};
+
+static BYTE NLSALLOC(040d) rgbSMONTHNAME12[] = { /* "\x05d0\x05dc\x05d5\x05dc" */
+ 0xe0, 0xec, 0xe5, 0xec
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME1[] = { /* "\x05ea\x05e9\x05e8" */
+ 0xfa, 0xf9, 0xf8
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME2[] = { /* "\x05d7\x05e9\x05d5" */
+ 0xe7, 0xf9, 0xe5
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME3[] = { /* "\x05db\x05e1\x05dc" */
+ 0xeb, 0xf1, 0xec
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME4[] = { /* "\x05d8\x05d1\x05ea" */
+ 0xe8, 0xe1, 0xfa
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME5[] = { /* "\x05e9\x05d1\x05d8" */
+ 0xf9, 0xe1, 0xe8
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME6[] = { /* "\x05d0\x05d3\x05e8" */
+ 0xe0, 0xe3, 0xf8
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME7[] = { /* "\x05e0\x05d9\x05e1" */
+ 0xf0, 0xe9, 0xf1
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME8[] = { /* "\x05d0\x05d9\x05d9" */
+ 0xe0, 0xe9, 0xe9
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME9[] = { /* "\x05e1\x05d9\x05d5" */
+ 0xf1, 0xe9, 0xe5
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME10[] = { /* "\x05ea\x05de\x05d5" */
+ 0xfa, 0xee, 0xe5
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME11[] = { /* "\x05d0\x05d1" */
+ 0xe0, 0xe1
+};
+
+static BYTE NLSALLOC(040d) rgbSABBREVMONTHNAME12[] = { /* "\x05d0\x05dc\x05d5" */
+ 0xe0, 0xec, 0xe5
+};
+
+static BYTE NLSALLOC(040d) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(040d) rgbIPOSSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(040d) rgbINEGSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(040d) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040d) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040d) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040d) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbSENGCOUNTRY[] = { /* "Israel" */
+ 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c
+};
+
+static BYTE NLSALLOC(040d) rgbSENGLANGUAGE[] = { /* "Hebrew" */
+ 0x48, 0x65, 0x62, 0x72, 0x65, 0x77
+};
+
+static BYTE NLSALLOC(040d) rgbIFIRSTDAYOFWEEK[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040d) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbIDEFAULTANSICODEPAGE[] = { /* "1255" */
+ 0x31, 0x32, 0x35, 0x35
+};
+
+static BYTE NLSALLOC(040d) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040d) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(040d) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040d) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040d) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(040d) g_rglcinfo040d[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 5, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 5, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 13, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 2, rgbS1159 }
+ , { 2, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 3, rgbSDAYNAME2 }
+ , { 5, rgbSDAYNAME3 }
+ , { 5, rgbSDAYNAME4 }
+ , { 5, rgbSDAYNAME5 }
+ , { 3, rgbSDAYNAME6 }
+ , { 3, rgbSDAYNAME7 }
+ , { 1, rgbSABBREVDAYNAME1 }
+ , { 1, rgbSABBREVDAYNAME2 }
+ , { 1, rgbSABBREVDAYNAME3 }
+ , { 1, rgbSABBREVDAYNAME4 }
+ , { 1, rgbSABBREVDAYNAME5 }
+ , { 1, rgbSABBREVDAYNAME6 }
+ , { 1, rgbSABBREVDAYNAME7 }
+ , { 4, rgbSMONTHNAME1 }
+ , { 4, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 3, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 3, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 4, rgbSMONTHNAME8 }
+ , { 4, rgbSMONTHNAME9 }
+ , { 4, rgbSMONTHNAME10 }
+ , { 2, rgbSMONTHNAME11 }
+ , { 4, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 2, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(040d) g_strinfo040d = {
+ rgbUCase_040d
+ , rgbLCase_040d
+ , rgwCType12_040d
+ , rgwCType3_040d
+ , rgwSort_040d
+ , NULL
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/040e.c b/private/oleauto/src/dispatch/win16/040e.c
new file mode 100644
index 000000000..96b5b89f7
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/040e.c
@@ -0,0 +1,750 @@
+/****************************************************************************
+* 040e.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Hungarian - Hungary
+*
+* LCID = 0x040e
+*
+* CodePage = 1250
+*
+* Generated: Thu Dec 01 18:07:58 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(040e) rgwSort_040e[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402d, 0x4034, 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0xc028
+ , 0x403a, 0x403b, 0x403c, 0x405e, 0x403d, 0xc029, 0x403e, 0x403f
+ , 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c
+ , 0x007d, 0x007e, 0x4040, 0x4041, 0x405f, 0x4060, 0x4061, 0x4042
+ , 0x4043, 0x087f, 0x0880, 0x0006, 0x0306, 0x0885, 0x0886, 0x0606
+ , 0x0889, 0x088a, 0x088b, 0x088c, 0x0906, 0x088f, 0x0c06, 0x0892
+ , 0x0894, 0x0895, 0x0896, 0x0f06, 0x1206, 0x089c, 0x089e, 0x089f
+ , 0x08a0, 0x08a1, 0x1506, 0x4044, 0x4045, 0x4046, 0x4047, 0x4048
+ , 0x4049, 0x007f, 0x0080, 0x1806, 0x1a06, 0x0085, 0x0086, 0x1c06
+ , 0x0089, 0x008a, 0x008b, 0x008c, 0x1e06, 0x008f, 0x2006, 0x0092
+ , 0x0094, 0x0095, 0x0096, 0x2206, 0x2406, 0x009c, 0x009e, 0x009f
+ , 0x00a0, 0x00a1, 0x2606, 0x404a, 0x404b, 0x404c, 0x404d, 0xc021
+ , 0xc022, 0xc023, 0x4058, 0xc024, 0x405b, 0x4073, 0x4070, 0x4071
+ , 0xc025, 0x4074, 0x0a97, 0x405c, 0x0997, 0x0999, 0x0aa2, 0x08a2
+ , 0xc026, 0x4056, 0x4057, 0x4059, 0x405a, 0x4072, 0xc02b, 0xc02c
+ , 0xc027, 0x089a, 0x0297, 0x405d, 0x0197, 0x0199, 0x02a2, 0x00a2
+ , 0x402e, 0x4052, 0x4152, 0x0b8d, 0x4067, 0x0d7f, 0x404e, 0x4068
+ , 0x404f, 0x4069, 0x0b97, 0x4063, 0x406a, 0xc02a, 0x406b, 0x09a2
+ , 0x406c, 0x4062, 0x4054, 0x038d, 0x4050, 0x406d, 0x406e, 0x406f
+ , 0x4051, 0x057f, 0x0397, 0x4064, 0x0a8d, 0x4055, 0x028d, 0x01a2
+ , 0x0996, 0x097f, 0x0a7f, 0x0c7f, 0x0b7f, 0x098d, 0x0981, 0x0b81
+ , 0x0a81, 0x0985, 0x0c85, 0x0a85, 0x0b85, 0x098a, 0x0a8a, 0x0983
+ , 0x0a83, 0x0990, 0x0a90, 0x0992, 0x0a92, 0x0993, 0x0893, 0x4065
+ , 0x0a96, 0x0a9c, 0x099c, 0x099d, 0x089d, 0x09a1, 0x0a99, 0x0005
+ , 0x0196, 0x017f, 0x027f, 0x047f, 0x037f, 0x018d, 0x0181, 0x0381
+ , 0x0281, 0x0185, 0x0485, 0x0285, 0x0385, 0x018a, 0x028a, 0x0183
+ , 0x0283, 0x0190, 0x0290, 0x0192, 0x0292, 0x0193, 0x0093, 0x4066
+ , 0x0296, 0x029c, 0x019c, 0x019d, 0x009d, 0x01a1, 0x0299, 0x4053
+};
+
+DIGRAPH NLSALLOC(040e) rgdig_040e[40] = {
+ { 0x0881, 0x02 }
+ , { 0x1082, 0x53 }
+ , { 0x0882, 0x73 }
+ , { 0x0883, 0x02 }
+ , { 0x1084, 0x5a }
+ , { 0x0884, 0x7a }
+ , { 0x0887, 0x02 }
+ , { 0x1088, 0x59 }
+ , { 0x0888, 0x79 }
+ , { 0x088d, 0x02 }
+ , { 0x108e, 0x59 }
+ , { 0x088e, 0x79 }
+ , { 0x0890, 0x02 }
+ , { 0x1091, 0x59 }
+ , { 0x0891, 0x79 }
+ , { 0x0897, 0x02 }
+ , { 0x1098, 0x5a }
+ , { 0x0898, 0x7a }
+ , { 0x0899, 0x02 }
+ , { 0x109b, 0x59 }
+ , { 0x089b, 0x79 }
+ , { 0x08a2, 0x02 }
+ , { 0x10a3, 0x53 }
+ , { 0x08a3, 0x73 }
+ , { 0x0081, 0x02 }
+ , { 0x0082, 0x73 }
+ , { 0x0083, 0x02 }
+ , { 0x0084, 0x7a }
+ , { 0x0087, 0x02 }
+ , { 0x0088, 0x79 }
+ , { 0x008d, 0x02 }
+ , { 0x008e, 0x79 }
+ , { 0x0090, 0x02 }
+ , { 0x0091, 0x79 }
+ , { 0x0097, 0x02 }
+ , { 0x0098, 0x7a }
+ , { 0x0099, 0x02 }
+ , { 0x009b, 0x79 }
+ , { 0x00a2, 0x02 }
+ , { 0x00a3, 0x73 }
+};
+
+EXPANSION NLSALLOC(040e) rgexp_040e[1] = {
+ { 0x0097, 0x0097 }
+};
+
+WORD NLSALLOC(040e) rgwCType12_040e[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x0020, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0x5010, 0x1101, 0xb010, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0xb010, 0x1102, 0xb010, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0xa048, 0x1010, 0x1010, 0x1101, 0x5010, 0x1101, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0x1101
+ , 0x5010, 0x5010, 0x1010, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1102, 0x1102, 0xb010, 0x1101, 0x1010, 0x1102, 0x1102
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1010
+};
+
+WORD NLSALLOC(040e) rgwCType3_040e[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x0000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0000, 0x0008, 0x8003, 0x0008, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0000, 0x0000, 0x8003, 0x0008, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x0008, 0x0401, 0x0408, 0x8003, 0x0008, 0x8003, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x8003, 0x0008, 0x0048, 0x0408, 0x0008, 0x8003
+ , 0x0008, 0x0008, 0x0408, 0x8003, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x8003, 0x8003, 0x0008, 0x8003, 0x0408, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0408
+};
+
+BYTE NLSALLOC(040e) rgbUCase_040e[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xa3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xa5, 0xaa, 0xbb, 0xbc, 0xbd, 0xbc, 0xaf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff
+};
+
+BYTE NLSALLOC(040e) rgbLCase_040e[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xb3, 0xa4, 0xb9, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbe, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(040e) rgbILANGUAGE[] = { /* "040e" */
+ 0x30, 0x34, 0x30, 0x65
+};
+
+static BYTE NLSALLOC(040e) rgbSLANGUAGE[] = { /* "Hungarian" */
+ 0x48, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x69, 0x61
+ , 0x6e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVLANGNAME[] = { /* "HUN" */
+ 0x48, 0x55, 0x4e
+};
+
+static BYTE NLSALLOC(040e) rgbSNATIVELANGNAME[] = { /* "magyar" */
+ 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(040e) rgbICOUNTRY[] = { /* "36" */
+ 0x33, 0x36
+};
+
+static BYTE NLSALLOC(040e) rgbSCOUNTRY[] = { /* "Hungary" */
+ 0x48, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVCTRYNAME[] = { /* "HUN" */
+ 0x48, 0x55, 0x4e
+};
+
+static BYTE NLSALLOC(040e) rgbSNATIVECTRYNAME[] = { /* "Magyarország" */
+ 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x6f, 0x72
+ , 0x73, 0x7a, 0xe1, 0x67
+};
+
+static BYTE NLSALLOC(040e) rgbIDEFAULTLANGUAGE[] = { /* "040e" */
+ 0x30, 0x34, 0x30, 0x65
+};
+
+static BYTE NLSALLOC(040e) rgbIDEFAULTCOUNTRY[] = { /* "36" */
+ 0x33, 0x36
+};
+
+static BYTE NLSALLOC(040e) rgbIDEFAULTCODEPAGE[] = { /* "852" */
+ 0x38, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(040e) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(040e) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040e) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(040e) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040e) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(040e) rgbSCURRENCY[] = { /* "Ft" */
+ 0x46, 0x74
+};
+
+static BYTE NLSALLOC(040e) rgbSINTLSYMBOL[] = { /* "HUF" */
+ 0x48, 0x55, 0x46
+};
+
+static BYTE NLSALLOC(040e) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(040e) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040e) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040e) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(040e) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(040e) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(040e) rgbSSHORTDATE[] = { /* "yyyy. MM. dd." */
+ 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d
+ , 0x2e, 0x20, 0x64, 0x64, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSLONGDATE[] = { /* "yyyy. MMMM d." */
+ 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d
+ , 0x4d, 0x4d, 0x20, 0x64, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040e) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040e) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbS1159[] = { /* "DE" */
+ 0x44, 0x45
+};
+
+static BYTE NLSALLOC(040e) rgbS2359[] = { /* "DU" */
+ 0x44, 0x55
+};
+
+static BYTE NLSALLOC(040e) rgbSDAYNAME1[] = { /* "h\x00e9tf\x0151" */
+ 0x68, 0xe9, 0x74, 0x66, 0xf5
+};
+
+static BYTE NLSALLOC(040e) rgbSDAYNAME2[] = { /* "kedd" */
+ 0x6b, 0x65, 0x64, 0x64
+};
+
+static BYTE NLSALLOC(040e) rgbSDAYNAME3[] = { /* "szerda" */
+ 0x73, 0x7a, 0x65, 0x72, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(040e) rgbSDAYNAME4[] = { /* "csütörtök" */
+ 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6
+ , 0x6b
+};
+
+static BYTE NLSALLOC(040e) rgbSDAYNAME5[] = { /* "péntek" */
+ 0x70, 0xe9, 0x6e, 0x74, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(040e) rgbSDAYNAME6[] = { /* "szombat" */
+ 0x73, 0x7a, 0x6f, 0x6d, 0x62, 0x61, 0x74
+};
+
+static BYTE NLSALLOC(040e) rgbSDAYNAME7[] = { /* "vasárnap" */
+ 0x76, 0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61, 0x70
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVDAYNAME1[] = { /* "H" */
+ 0x48
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVDAYNAME2[] = { /* "K" */
+ 0x4b
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVDAYNAME3[] = { /* "Sze" */
+ 0x53, 0x7a, 0x65
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVDAYNAME4[] = { /* "Cs" */
+ 0x43, 0x73
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVDAYNAME5[] = { /* "P" */
+ 0x50
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVDAYNAME6[] = { /* "Szo" */
+ 0x53, 0x7a, 0x6f
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVDAYNAME7[] = { /* "V" */
+ 0x56
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME1[] = { /* "január" */
+ 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME2[] = { /* "február" */
+ 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME3[] = { /* "március" */
+ 0x6d, 0xe1, 0x72, 0x63, 0x69, 0x75, 0x73
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME4[] = { /* "április" */
+ 0xe1, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME5[] = { /* "május" */
+ 0x6d, 0xe1, 0x6a, 0x75, 0x73
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME6[] = { /* "június" */
+ 0x6a, 0xfa, 0x6e, 0x69, 0x75, 0x73
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME7[] = { /* "július" */
+ 0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME8[] = { /* "augusztus" */
+ 0x61, 0x75, 0x67, 0x75, 0x73, 0x7a, 0x74, 0x75
+ , 0x73
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME9[] = { /* "szeptember" */
+ 0x73, 0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62
+ , 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME10[] = { /* "október" */
+ 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME11[] = { /* "november" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040e) rgbSMONTHNAME12[] = { /* "december" */
+ 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME1[] = { /* "jan." */
+ 0x6a, 0x61, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME2[] = { /* "febr." */
+ 0x66, 0x65, 0x62, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME3[] = { /* "márc." */
+ 0x6d, 0xe1, 0x72, 0x63, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME4[] = { /* "ápr." */
+ 0xe1, 0x70, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME5[] = { /* "máj." */
+ 0x6d, 0xe1, 0x6a, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME6[] = { /* "jún." */
+ 0x6a, 0xfa, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME7[] = { /* "júl." */
+ 0x6a, 0xfa, 0x6c, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME8[] = { /* "aug." */
+ 0x61, 0x75, 0x67, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME9[] = { /* "szept." */
+ 0x73, 0x7a, 0x65, 0x70, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME10[] = { /* "okt." */
+ 0x6f, 0x6b, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME11[] = { /* "nov." */
+ 0x6e, 0x6f, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSABBREVMONTHNAME12[] = { /* "dec." */
+ 0x64, 0x65, 0x63, 0x2e
+};
+
+static BYTE NLSALLOC(040e) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(040e) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbSENGCOUNTRY[] = { /* "Hungary" */
+ 0x48, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(040e) rgbSENGLANGUAGE[] = { /* "Hungarian" */
+ 0x48, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x69, 0x61
+ , 0x6e
+};
+
+static BYTE NLSALLOC(040e) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbIDEFAULTANSICODEPAGE[] = { /* "1250" */
+ 0x31, 0x32, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(040e) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040e) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040e) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(040e) g_rglcinfo040e[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 9, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 6, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 12, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 13, rgbSSHORTDATE }
+ , { 13, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 2, rgbS1159 }
+ , { 2, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 4, rgbSDAYNAME2 }
+ , { 6, rgbSDAYNAME3 }
+ , { 9, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 7, rgbSDAYNAME6 }
+ , { 8, rgbSDAYNAME7 }
+ , { 1, rgbSABBREVDAYNAME1 }
+ , { 1, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 1, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 1, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 7, rgbSMONTHNAME3 }
+ , { 7, rgbSMONTHNAME4 }
+ , { 5, rgbSMONTHNAME5 }
+ , { 6, rgbSMONTHNAME6 }
+ , { 6, rgbSMONTHNAME7 }
+ , { 9, rgbSMONTHNAME8 }
+ , { 10, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 4, rgbSABBREVMONTHNAME1 }
+ , { 5, rgbSABBREVMONTHNAME2 }
+ , { 5, rgbSABBREVMONTHNAME3 }
+ , { 4, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 4, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 4, rgbSABBREVMONTHNAME11 }
+ , { 4, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 9, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(040e) g_strinfo040e = {
+ rgbUCase_040e
+ , rgbLCase_040e
+ , rgwCType12_040e
+ , rgwCType3_040e
+ , rgwSort_040e
+ , rgexp_040e
+ , rgdig_040e
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/040f.c b/private/oleauto/src/dispatch/win16/040f.c
new file mode 100644
index 000000000..93d059aac
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/040f.c
@@ -0,0 +1,704 @@
+/****************************************************************************
+* 040f.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Icelandic - Iceland
+*
+* LCID = 0x040f
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 18:02:06 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(040f) rgwSort_040f[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402f, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0xc02a
+ , 0x403c, 0x403d, 0x403e, 0x4060, 0x403f, 0xc02b, 0x4040, 0x4041
+ , 0x007a, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084
+ , 0x0085, 0x0086, 0x4042, 0x4043, 0x4061, 0x4062, 0x4063, 0x4044
+ , 0x4045, 0x1087, 0x1089, 0x108a, 0x108b, 0x108c, 0x108e, 0x108f
+ , 0x1090, 0x1091, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, 0x1098
+ , 0x109a, 0x109b, 0x109c, 0x109d, 0x109e, 0x10a0, 0x10a2, 0x10a3
+ , 0x10a4, 0x10a5, 0x10a7, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a
+ , 0x404b, 0x0087, 0x0089, 0x008a, 0x008b, 0x008c, 0x008e, 0x008f
+ , 0x0090, 0x0091, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098
+ , 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x00a0, 0x00a2, 0x00a3
+ , 0x00a4, 0x00a5, 0x00a7, 0x404c, 0x404d, 0x404e, 0x404f, 0xc021
+ , 0xc022, 0xc023, 0x405a, 0x018e, 0x405d, 0x4078, 0x4075, 0x4076
+ , 0x4149, 0x4079, 0x119d, 0x405e, 0x0105, 0xc024, 0xc025, 0xc026
+ , 0xc027, 0x4058, 0x4059, 0x405b, 0x405c, 0x4077, 0xc02d, 0xc02e
+ , 0x4057, 0x109f, 0x019d, 0x405f, 0x0205, 0xc028, 0xc029, 0x10a5
+ , 0x4030, 0x4050, 0x4069, 0x406a, 0x406b, 0x406c, 0x4051, 0x406d
+ , 0x4052, 0x406e, 0x0887, 0x4065, 0x406f, 0xc02c, 0x4070, 0x4053
+ , 0x4071, 0x4064, 0x087f, 0x0880, 0x4054, 0x4072, 0x4073, 0x4074
+ , 0x4055, 0x087e, 0x0998, 0x4066, 0x007b, 0x007c, 0x007d, 0x4056
+ , 0x1187, 0x1088, 0x1287, 0x1487, 0x1387, 0x1587, 0x10a9, 0x118a
+ , 0x118c, 0x108d, 0x128c, 0x138c, 0x1191, 0x1092, 0x1291, 0x1391
+ , 0x118b, 0x1197, 0x1298, 0x1099, 0x1398, 0x1498, 0x10aa, 0x4067
+ , 0x11aa, 0x11a0, 0x10a1, 0x12a0, 0x13a0, 0x10a6, 0x10a8, 0x0005
+ , 0x0187, 0x0088, 0x0287, 0x0487, 0x0387, 0x0587, 0x00a9, 0x018a
+ , 0x018c, 0x008d, 0x028c, 0x038c, 0x0191, 0x0092, 0x0291, 0x0391
+ , 0x018b, 0x0197, 0x0298, 0x0099, 0x0398, 0x0498, 0x00aa, 0x4068
+ , 0x01aa, 0x01a0, 0x00a1, 0x02a0, 0x03a0, 0x00a6, 0x00a8, 0x00a5
+};
+
+EXPANSION NLSALLOC(040f) rgexp_040f[3] = {
+ { 0x009d, 0x009d }
+ , { 0x1098, 0x108c }
+ , { 0x0098, 0x008c }
+};
+
+WORD NLSALLOC(040f) rgwCType12_040f[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x1101, 0xb010, 0x1101, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0xb010, 0x1102, 0xb010, 0x1102, 0x0020, 0x0020, 0x1101
+ , 0xa048, 0xb010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+};
+
+WORD NLSALLOC(040f) rgwCType3_040f[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0408, 0x0000, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x8003
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0400, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+};
+
+BYTE NLSALLOC(040f) rgbUCase_040f[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x9f
+};
+
+BYTE NLSALLOC(040f) rgbLCase_040f[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xff
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(040f) rgbILANGUAGE[] = { /* "040f" */
+ 0x30, 0x34, 0x30, 0x66
+};
+
+static BYTE NLSALLOC(040f) rgbSLANGUAGE[] = { /* "Icelandic" */
+ 0x49, 0x63, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x69
+ , 0x63
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVLANGNAME[] = { /* "ISL" */
+ 0x49, 0x53, 0x4c
+};
+
+static BYTE NLSALLOC(040f) rgbSNATIVELANGNAME[] = { /* "íslenska" */
+ 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61
+};
+
+static BYTE NLSALLOC(040f) rgbICOUNTRY[] = { /* "354" */
+ 0x33, 0x35, 0x34
+};
+
+static BYTE NLSALLOC(040f) rgbSCOUNTRY[] = { /* "Iceland" */
+ 0x49, 0x63, 0x65, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVCTRYNAME[] = { /* "ISL" */
+ 0x49, 0x53, 0x4c
+};
+
+static BYTE NLSALLOC(040f) rgbSNATIVECTRYNAME[] = { /* "Ísland" */
+ 0xcd, 0x73, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(040f) rgbIDEFAULTLANGUAGE[] = { /* "040f" */
+ 0x30, 0x34, 0x30, 0x66
+};
+
+static BYTE NLSALLOC(040f) rgbIDEFAULTCOUNTRY[] = { /* "354" */
+ 0x33, 0x35, 0x34
+};
+
+static BYTE NLSALLOC(040f) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(040f) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040f) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040f) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(040f) rgbSCURRENCY[] = { /* "kr." */
+ 0x6b, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSINTLSYMBOL[] = { /* "ISK" */
+ 0x49, 0x53, 0x4b
+};
+
+static BYTE NLSALLOC(040f) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040f) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040f) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(040f) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(040f) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(040f) rgbSSHORTDATE[] = { /* "d.M.yyyy" */
+ 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040f) rgbSLONGDATE[] = { /* "d. MMMM yyyy" */
+ 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(040f) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbIMONLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbSDAYNAME1[] = { /* "mánudagur" */
+ 0x6d, 0xe1, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75
+ , 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSDAYNAME2[] = { /* "þriðjudagur" */
+ 0xfe, 0x72, 0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61
+ , 0x67, 0x75, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSDAYNAME3[] = { /* "miðvikudagur" */
+ 0x6d, 0x69, 0xf0, 0x76, 0x69, 0x6b, 0x75, 0x64
+ , 0x61, 0x67, 0x75, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSDAYNAME4[] = { /* "fimmtudagur" */
+ 0x66, 0x69, 0x6d, 0x6d, 0x74, 0x75, 0x64, 0x61
+ , 0x67, 0x75, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSDAYNAME5[] = { /* "föstudagur" */
+ 0x66, 0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67
+ , 0x75, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSDAYNAME6[] = { /* "laugardagur" */
+ 0x6c, 0x61, 0x75, 0x67, 0x61, 0x72, 0x64, 0x61
+ , 0x67, 0x75, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSDAYNAME7[] = { /* "sunnudagur" */
+ 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67
+ , 0x75, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVDAYNAME1[] = { /* "mán." */
+ 0x6d, 0xe1, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVDAYNAME2[] = { /* "þri." */
+ 0xfe, 0x72, 0x69, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVDAYNAME3[] = { /* "mið." */
+ 0x6d, 0x69, 0xf0, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVDAYNAME4[] = { /* "fim." */
+ 0x66, 0x69, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVDAYNAME5[] = { /* "fös." */
+ 0x66, 0xf6, 0x73, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVDAYNAME6[] = { /* "lau." */
+ 0x6c, 0x61, 0x75, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVDAYNAME7[] = { /* "sun." */
+ 0x73, 0x75, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME1[] = { /* "janúar" */
+ 0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME2[] = { /* "febrúar" */
+ 0x66, 0x65, 0x62, 0x72, 0xfa, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME4[] = { /* "apríl" */
+ 0x61, 0x70, 0x72, 0xed, 0x6c
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME5[] = { /* "maí" */
+ 0x6d, 0x61, 0xed
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME6[] = { /* "júní" */
+ 0x6a, 0xfa, 0x6e, 0xed
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME7[] = { /* "júlí" */
+ 0x6a, 0xfa, 0x6c, 0xed
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME8[] = { /* "ágúst" */
+ 0xe1, 0x67, 0xfa, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME9[] = { /* "september" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME10[] = { /* "október" */
+ 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME11[] = { /* "nóvember" */
+ 0x6e, 0xf3, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSMONTHNAME12[] = { /* "desember" */
+ 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME1[] = { /* "jan." */
+ 0x6a, 0x61, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME2[] = { /* "feb." */
+ 0x66, 0x65, 0x62, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME3[] = { /* "mar." */
+ 0x6d, 0x61, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME4[] = { /* "apr." */
+ 0x61, 0x70, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME5[] = { /* "maí" */
+ 0x6d, 0x61, 0xed
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME6[] = { /* "jún." */
+ 0x6a, 0xfa, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME7[] = { /* "júl." */
+ 0x6a, 0xfa, 0x6c, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME8[] = { /* "ágú." */
+ 0xe1, 0x67, 0xfa, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME9[] = { /* "sep." */
+ 0x73, 0x65, 0x70, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME10[] = { /* "okt." */
+ 0x6f, 0x6b, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME11[] = { /* "nóv." */
+ 0x6e, 0xf3, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSABBREVMONTHNAME12[] = { /* "des." */
+ 0x64, 0x65, 0x73, 0x2e
+};
+
+static BYTE NLSALLOC(040f) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(040f) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbSENGCOUNTRY[] = { /* "Iceland" */
+ 0x49, 0x63, 0x65, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(040f) rgbSENGLANGUAGE[] = { /* "Icelandic" */
+ 0x49, 0x63, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x69
+ , 0x63
+};
+
+static BYTE NLSALLOC(040f) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(040f) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(040f) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(040f) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(040f) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(040f) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(040f) g_rglcinfo040f[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 9, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 8, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 9, rgbSDAYNAME1 }
+ , { 11, rgbSDAYNAME2 }
+ , { 12, rgbSDAYNAME3 }
+ , { 11, rgbSDAYNAME4 }
+ , { 10, rgbSDAYNAME5 }
+ , { 11, rgbSDAYNAME6 }
+ , { 10, rgbSDAYNAME7 }
+ , { 4, rgbSABBREVDAYNAME1 }
+ , { 4, rgbSABBREVDAYNAME2 }
+ , { 4, rgbSABBREVDAYNAME3 }
+ , { 4, rgbSABBREVDAYNAME4 }
+ , { 4, rgbSABBREVDAYNAME5 }
+ , { 4, rgbSABBREVDAYNAME6 }
+ , { 4, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 4, rgbSABBREVMONTHNAME1 }
+ , { 4, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 4, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 4, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 4, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 4, rgbSABBREVMONTHNAME11 }
+ , { 4, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 9, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(040f) g_strinfo040f = {
+ rgbUCase_040f
+ , rgbLCase_040f
+ , rgwCType12_040f
+ , rgwCType3_040f
+ , rgwSort_040f
+ , rgexp_040f
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0410.c b/private/oleauto/src/dispatch/win16/0410.c
new file mode 100644
index 000000000..0a40e9c71
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0410.c
@@ -0,0 +1,518 @@
+/****************************************************************************
+* 0410.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Italian - Italy
+*
+* LCID = 0x0410
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:36:27 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0410) rgbILANGUAGE[] = { /* "0410" */
+ 0x30, 0x34, 0x31, 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbSLANGUAGE[] = { /* "Italian" */
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVLANGNAME[] = { /* "ITA" */
+ 0x49, 0x54, 0x41
+};
+
+static BYTE NLSALLOC(0410) rgbSNATIVELANGNAME[] = { /* "Italiano" */
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbICOUNTRY[] = { /* "39" */
+ 0x33, 0x39
+};
+
+static BYTE NLSALLOC(0410) rgbSCOUNTRY[] = { /* "Italy" */
+ 0x49, 0x74, 0x61, 0x6c, 0x79
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVCTRYNAME[] = { /* "ITA" */
+ 0x49, 0x54, 0x41
+};
+
+static BYTE NLSALLOC(0410) rgbSNATIVECTRYNAME[] = { /* "Italia" */
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(0410) rgbIDEFAULTLANGUAGE[] = { /* "0410" */
+ 0x30, 0x34, 0x31, 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbIDEFAULTCOUNTRY[] = { /* "39" */
+ 0x33, 0x39
+};
+
+static BYTE NLSALLOC(0410) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0410) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0410) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0410) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0410) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0410) rgbSCURRENCY[] = { /* "L." */
+ 0x4c, 0x2e
+};
+
+static BYTE NLSALLOC(0410) rgbSINTLSYMBOL[] = { /* "ITL" */
+ 0x49, 0x54, 0x4c
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0410) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbICURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbIINTLCURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0410) rgbINEGCURR[] = { /* "9" */
+ 0x39
+};
+
+static BYTE NLSALLOC(0410) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0410) rgbSTIME[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0410) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0410) rgbSLONGDATE[] = { /* "dddd d MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d
+ , 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0410) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbSDAYNAME1[] = { /* "lunedì" */
+ 0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec
+};
+
+static BYTE NLSALLOC(0410) rgbSDAYNAME2[] = { /* "martedì" */
+ 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec
+};
+
+static BYTE NLSALLOC(0410) rgbSDAYNAME3[] = { /* "mercoledì" */
+ 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64
+ , 0xec
+};
+
+static BYTE NLSALLOC(0410) rgbSDAYNAME4[] = { /* "giovedì" */
+ 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec
+};
+
+static BYTE NLSALLOC(0410) rgbSDAYNAME5[] = { /* "venerdì" */
+ 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xec
+};
+
+static BYTE NLSALLOC(0410) rgbSDAYNAME6[] = { /* "sabato" */
+ 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSDAYNAME7[] = { /* "domenica" */
+ 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVDAYNAME1[] = { /* "lun" */
+ 0x6c, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVDAYNAME2[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVDAYNAME3[] = { /* "mer" */
+ 0x6d, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVDAYNAME4[] = { /* "gio" */
+ 0x67, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVDAYNAME5[] = { /* "ven" */
+ 0x76, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVDAYNAME6[] = { /* "sab" */
+ 0x73, 0x61, 0x62
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVDAYNAME7[] = { /* "dom" */
+ 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME1[] = { /* "gennaio" */
+ 0x67, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME2[] = { /* "febbraio" */
+ 0x66, 0x65, 0x62, 0x62, 0x72, 0x61, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME3[] = { /* "marzo" */
+ 0x6d, 0x61, 0x72, 0x7a, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME4[] = { /* "aprile" */
+ 0x61, 0x70, 0x72, 0x69, 0x6c, 0x65
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME5[] = { /* "maggio" */
+ 0x6d, 0x61, 0x67, 0x67, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME6[] = { /* "giugno" */
+ 0x67, 0x69, 0x75, 0x67, 0x6e, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME7[] = { /* "luglio" */
+ 0x6c, 0x75, 0x67, 0x6c, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME8[] = { /* "agosto" */
+ 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME9[] = { /* "settembre" */
+ 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME10[] = { /* "ottobre" */
+ 0x6f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME11[] = { /* "novembre" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0410) rgbSMONTHNAME12[] = { /* "dicembre" */
+ 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME1[] = { /* "gen" */
+ 0x67, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME4[] = { /* "apr" */
+ 0x61, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME5[] = { /* "mag" */
+ 0x6d, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME6[] = { /* "giu" */
+ 0x67, 0x69, 0x75
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME7[] = { /* "lug" */
+ 0x6c, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME8[] = { /* "ago" */
+ 0x61, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME9[] = { /* "set" */
+ 0x73, 0x65, 0x74
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME10[] = { /* "ott" */
+ 0x6f, 0x74, 0x74
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0410) rgbSABBREVMONTHNAME12[] = { /* "dic" */
+ 0x64, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0410) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0410) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0410) rgbINEGSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0410) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbSENGCOUNTRY[] = { /* "Italy" */
+ 0x49, 0x74, 0x61, 0x6c, 0x79
+};
+
+static BYTE NLSALLOC(0410) rgbSENGLANGUAGE[] = { /* "Italian" */
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0410) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0410) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0410) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbSTIMEFORMAT[] = { /* "H.mm.ss" */
+ 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0410) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0410) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0410) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0410) g_rglcinfo0410[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 7, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 8, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 0, NULL } /* SMONDECIMALSEP */
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 16, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 8, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 6, rgbSMONTHNAME4 }
+ , { 6, rgbSMONTHNAME5 }
+ , { 6, rgbSMONTHNAME6 }
+ , { 6, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0410) g_strinfo0410 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0411.c b/private/oleauto/src/dispatch/win16/0411.c
new file mode 100644
index 000000000..fe210daf9
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0411.c
@@ -0,0 +1,1679 @@
+/***
+*0411.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+* Japan, Japanese
+*
+* LCID = 0x0411
+* CodePage = 1252
+*
+*
+*Generated: 9/12/93 - by hand from lcid_jpn.txt
+*
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+#include "nlsdbcs.h"
+
+static unsigned char NLSALLOC(0411) rgbPriHi[] = {
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,
+0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x23,0x24,0x25,0x26,0x27,0x28,
+0x29,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,
+0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x2A,0x2B,0x2C,0x2D,0x2E,
+0x2F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,
+0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x30,0x31,0x32,0x33,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x13,0x38,0x3C,0x3D,0x37,0x43,0xB8,0x87,0x88,0x89,0x8A,0x8B,0xAA,0xAC,0xAE,0x98,
+0x44,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,
+0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,
+0xA6,0xA7,0xA8,0xA9,0xAA,0xAC,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB9,0x3F,0x40,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
+0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
+0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
+0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
+0x13,0x37,0x38,0x1F,0x21,0x43,0x23,0x24,0x28,0x14,0x3F,0x40,0x34,0x2F,0x34,0x2D,
+0x33,0x2e,0x45,0x46,0x41,0x42,0x39,0x47,0x3A,0x3B,0x3B,0x44,0x35,0x34,0x22,0x47,
+0x47,0x36,0x31,0x36,0x36,0x1A,0x1A,0x15,0x15,0x1B,0x1C,0x3E,0x3E,0x2A,0x2C,0x30,
+0x32,0x3B,0x3B,0x3B,0x3B,0x3C,0x3D,0x3E,0x3E,0x3E,0x3E,0x1E,0x20,0x34,0x34,0xC1,
+0x34,0x26,0x36,0x25,0x27,0x36,0x36,0x36,0x36,0x36,0x36,0x34,0x36,0x36,0x36,0x2B,
+0x17,0x47,0x47,0x18,0x16,0x19,0x1D,0x29,0x34,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3E,0x36,0x36,0x36,0x36,0x3E,0xC1,0xC1,0xC1,
+0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0x36,0x36,0x47,0x36,0x36,0x36,0x36,0xC1,
+0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x34,0xC1,0xC1,0xC1,0xC1,0x36,0xC1,0xC1,0xC1,
+0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,
+0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,
+0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,
+0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,
+0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0x56,
+0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,
+0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
+0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,
+0xC2,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,
+0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0xC2,0xC2,0xC2,0xC2,0x87,
+0x87,0x88,0x88,0x89,0x89,0x8A,0x8A,0x8B,0x8B,0x8C,0x8C,0x8D,0x8D,0x8E,0x8E,0x8F,
+0x8F,0x90,0x90,0x91,0x91,0x92,0x92,0x93,0x93,0x94,0x94,0x95,0x95,0x96,0x96,0x97,
+0x97,0x98,0x98,0x98,0x99,0x99,0x9A,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA0,0xA0,
+0xA1,0xA1,0xA1,0xA2,0xA2,0xA2,0xA3,0xA3,0xA3,0xA4,0xA4,0xA4,0xA5,0xA6,0xA7,0xA8,
+0xA9,0xAA,0xAA,0xAC,0xAC,0xAE,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB4,0xB5,0xB7,
+0xB8,0xB9,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,0xC2,
+0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
+0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
+0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
+0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
+0x87,0x87,0x88,0x88,0x89,0x89,0x8A,0x8A,0x8B,0x8B,0x8C,0x8C,0x8D,0x8D,0x8E,0x8E,
+0x8F,0x8F,0x90,0x90,0x91,0x91,0x92,0x92,0x93,0x93,0x94,0x94,0x95,0x95,0x96,0x96,
+0x97,0x97,0x98,0x98,0x98,0x99,0x99,0x9A,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA0,
+0xA0,0xA1,0xA1,0xA1,0xA2,0xA2,0xA2,0xA3,0xA3,0xA3,0xA4,0xA4,0xA4,0xA5,0xA6,0xC3,
+0xA7,0xA8,0xA9,0xAA,0xAA,0xAC,0xAC,0xAE,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB4,
+0xB5,0xB7,0xB8,0xB9,0x89,0x8C,0x8F,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x7C,
+0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,
+0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x7C,
+0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,
+0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
+0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
+0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
+0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,
+0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,
+0x7D,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0xC4,
+0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,
+0x7D,0x7D,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0x36,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xC4,
+0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,0xC5,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,
+0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,
+0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,
+0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,
+0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xC7,0x47,
+0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+0x47,0x47,0x47,0x47,0x47,0x47,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0x47,0xC7,
+0x3E,0x3E,0x36,0x47,0x36,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xC7,0xC7,0xC7
+};
+
+static unsigned char NLSALLOC(0411) rgbPriLo[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
+0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,
+0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x28,0xFF,0x03,0x04,0xFF,0xFF,0x09,0x00,0x29,
+0x2A,0x2B,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x00,
+0x00,0x05,0x06,0x07,0x08,0x00,0x00,0x01,0x02,0x03,0x04,0x00,0x00,0x04,0x07,0x7F,
+0x08,0x00,0x3C,0x00,0x00,0x3F,0x40,0x27,0x36,0x8E,0x8D,0x03,0x06,0x07,0x09,0x00,
+0x00,0x2B,0x2C,0x00,0x00,0x00,0x00,0x00,0x01,0x8C,0x8B,0x87,0x89,0x88,0x86,0x85,
+0x80,0x7F,0x82,0x81,0x84,0x83,0x08,0x05,0x19,0x17,0x18,0x1A,0x06,0xAD,0xAE,0xAF,
+0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0x21,0x22,0x45,0x46,0x43,0x44,0x30,0x2E,
+0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0x2C,0x2D,0x2D,0x1B,0x1C,0x1D,0x1F,0xCF,
+0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0x29,0x47,0x4A,0x1E,0x20,0x3D,
+0x3A,0x41,0x42,0x24,0x39,0x26,0x37,0x32,0x34,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
+0x0C,0x05,0x91,0x90,0x8F,0x01,0x02,0x06,0xF8,0xF9,0xFA,0xFB,0x8A,0xFD,0xFE,0xFF,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
+0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
+0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
+0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9B,0x9C,0x9D,0x9E,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,
+0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,
+0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
+0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
+0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x00,
+0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,
+0xFF,0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,
+0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x7F,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x11,
+0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,
+0x22,0x23,0x24,0x25,0x26,0x27,0x28,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0x11,
+0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,
+0x22,0x23,0x24,0x25,0x26,0x27,0x28,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
+0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
+0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
+0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
+0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,
+0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,
+0x31,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
+0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x7F,
+0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
+0x30,0x31,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x5F,
+0x61,0x63,0x65,0x69,0x67,0x6B,0x73,0x6F,0x77,0x7B,0x60,0x62,0x64,0x66,0x6A,0x68,
+0x6E,0x76,0x72,0x7A,0x7E,0x6D,0x74,0x71,0x78,0x7C,0x6C,0x75,0x70,0x79,0x7D,0xBF,
+0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
+0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
+0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
+0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
+0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
+0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
+0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
+0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
+0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
+0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
+0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
+0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
+0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
+0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
+0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
+0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
+0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
+0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
+0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
+0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
+0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
+0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
+0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
+0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
+0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
+0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
+0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
+0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
+0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
+0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
+0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
+0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
+0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
+0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
+0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
+0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
+0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
+0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,
+0x5B,0x5C,0x5D,0x5E,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x5E,0x17,
+0x0E,0x10,0x19,0x0F,0x13,0x0C,0x15,0x1A,0x1B,0x0D,0x12,0x11,0x14,0x18,0x16,0x22,
+0x23,0x24,0x20,0x21,0x26,0x25,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x1C,0x7F,
+0x09,0x0A,0x0A,0x27,0x0B,0x07,0x08,0x09,0x0A,0x0B,0x04,0x05,0x06,0x1F,0x1E,0x1D,
+0x3B,0x3E,0x33,0x35,0x23,0x25,0x48,0x2A,0x28,0x49,0x38,0x2F,0x31,0x9D,0x9E,0x9F
+};
+
+static unsigned char NLSALLOC(0411) rgbSecwgt[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x40,0x00,0x40,
+0x40,0x40,0x08,0x09,0x08,0x09,0x00,0x00,0x08,0x00,0x00,0x54,0x54,0x00,0x40,0x00,
+0x00,0x00,0x40,0x00,0x00,0x40,0x44,0x40,0x44,0x40,0x40,0x00,0x00,0x40,0x40,0x40,
+0x40,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00,0x00,
+0x00,0x40,0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x60,
+0x64,0x60,0x64,0x60,0x64,0x60,0x64,0x60,0x64,0x64,0x65,0x60,0x61,0x60,0x61,0x64,
+0x65,0x60,0x61,0x60,0x61,0x60,0x61,0x60,0x61,0x60,0x61,0x60,0x61,0x60,0x61,0x60,
+0x61,0x60,0x64,0x65,0x60,0x61,0x60,0x61,0x60,0x60,0x60,0x60,0x60,0x60,0x61,0x62,
+0x60,0x61,0x62,0x60,0x61,0x62,0x60,0x61,0x62,0x60,0x61,0x62,0x60,0x60,0x60,0x60,
+0x60,0x60,0x64,0x60,0x64,0x60,0x64,0x60,0x60,0x60,0x60,0x60,0x60,0x64,0x20,0x20,
+0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x44,0x45,0x40,0x41,0x40,0x41,
+0x44,0x45,0x40,0x41,0x40,0x41,0x40,0x41,0x40,0x41,0x40,0x41,0x40,0x41,0x40,0x41,
+0x40,0x41,0x40,0x44,0x45,0x40,0x41,0x40,0x41,0x40,0x40,0x40,0x40,0x40,0x40,0x41,
+0x42,0x40,0x41,0x42,0x40,0x41,0x42,0x40,0x41,0x42,0x40,0x41,0x42,0x40,0x40,0x00,
+0x40,0x40,0x40,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x40,0x40,0x40,0x44,
+0x00,0x00,0x40,0x40,0x45,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+static unsigned char NLSALLOC(0411) rgbSecflg[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x20,0x20,0x22,0x20,0x20,0x20,0x20,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x20,0x20,0x20,0x20,0x20,
+0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x20,0x20,0x20,0x20,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x20,0x20,0x20,0x20,0x20,0x20,0x35,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,
+0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x35,0x35,0x37,0x35,0x35,0x35,0x35,0x35,0x35,
+0x35,0x35,0x37,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+0x35,0x35,0x35,0x35,0x37,0x37,0x37,0x35,0x35,0x35,0x35,0x35,0x37,0x35,0x20,0x20,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x20,
+0x20,0x20,0x05,0x05,0x05,0x05,0x00,0x00,0x04,0x00,0x00,0x37,0x37,0x00,0x20,0x00,
+0x00,0x00,0x20,0x00,0x00,0x22,0x22,0x22,0x22,0x20,0x20,0x00,0x00,0x20,0x20,0x20,
+0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,
+0x00,0x20,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+0x20,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x37,
+0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x35,0x35,0x35,0x35,0x37,
+0x37,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+0x35,0x37,0x37,0x37,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+0x35,0x37,0x37,0x37,0x37,0x37,0x37,0x35,0x35,0x35,0x35,0x35,0x37,0x37,0x15,0x15,
+0x35,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x35,0x35,0x35,0x35,
+0x37,0x37,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+0x35,0x35,0x37,0x37,0x37,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x00,
+0x35,0x35,0x35,0x37,0x37,0x37,0x37,0x37,0x37,0x35,0x35,0x35,0x35,0x35,0x37,0x37,
+0x15,0x15,0x35,0x35,0x37,0x37,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+static unsigned char NLSALLOC(0411) rgbMasks[] = {
+ 0x03, 0x01, 0x00, 0x02
+ , 0x04, 0x02, 0x02, 0x01
+ , 0x18, 0x04, 0x03, 0x02
+ , 0x20, 0x18, 0x05, 0x01
+ , 0x40, 0x20, 0x06, 0x01
+ , 0x00, 0x00, 0x00, 0x00
+};
+
+static unsigned char NLSALLOC(0411) rgbMaps[] = {
+ 0x20, 0x08, 0x02, 0x00, 0x01, 0x00
+ , 0x20, 0x10, 0x20, 0x00, 0x40, 0x00
+ , 0x40, 0x20, 0x10, 0x00, 0x08, 0x00
+ , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static unsigned char NLSALLOC(0411) rgbIgnore[] = {
+ 0x1F, 0x07, 0x00, 0x02
+ , 0x20, 0x08, 0x00, 0x01
+ , 0x20, 0x10, 0x00, 0x40
+ , 0x40, 0x20, 0x00, 0x08
+ , 0x00, 0x00, 0x00, 0x00
+};
+
+static unsigned char NLSALLOC(0411) rgbC1JPN[] = {
+0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
+0x00,0x20,0x00,0x68,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x20,0x00,0x20,
+0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
+0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
+0x00,0x48,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,
+0x00,0x84,0x00,0x84,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x01,0x82,0x01,0x82,0x01,0x82,0x01,0x82,0x01,0x82,0x01,0x82,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x48,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x48,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x01,0x00,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x10,0x00,0x10,
+0x01,0x00,0x00,0x10,0x00,0x10,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,
+0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x84,
+0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x01,0x82,0x01,0x82,0x01,0x82,0x01,0x82,0x01,0x82,0x01,0x82,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x00,0x00,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,
+0x01,0x02,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
+0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+static unsigned char NLSALLOC(0411) rgbC2JPN[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0A,0x0B,0x0B,0x05,0x05,0x05,0x01,0x0B,0x0B,0x0B,0x0B,0x05,0x07,0x05,0x04,0x04,
+0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x0B,0x0B,0x0B,0x0B,0x0B,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0B,0x0B,0x0B,0x0B,0x0B,
+0x0B,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0B,0x0B,0x0B,0x0B,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0A,0x0B,0x0B,0x0B,0x0B,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0A,0x0B,0x0B,0x07,0x04,0x01,0x07,0x0B,0x0B,0x0B,0x01,0x01,0x0B,0x0B,0x0B,0x0B,
+0x0B,0x0B,0x01,0x01,0x01,0x01,0x0B,0x0B,0x0B,0x0B,0x0B,0x01,0x0B,0x0B,0x04,0x0B,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x05,0x05,0x05,0x0B,0x00,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x05,0x05,0x05,0x0B,0x05,
+0x05,0x05,0x05,0x05,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0B,0x05,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,
+0x0B,0x0B,0x0B,0x0B,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+0x0B,0x0B,0x0B,0x01,0x0B,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x00,0x00,0x00
+};
+
+static unsigned char NLSALLOC(0411) rgbC3JPN[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x08,0x00,0x48,0x00,0x48,0x00,0x48,0x00,0x48,0x00,0x48,0x80,0x50,0x80,0x53,
+0x80,0x53,0x80,0x53,0x80,0x53,0x80,0x53,0x80,0x53,0x80,0x53,0x80,0x53,0x80,0x53,
+0x80,0x73,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,
+0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,
+0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,
+0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,
+0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,
+0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0x73,0x80,0x73,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x88,0x00,0x88,0x00,0x08,0x00,0x88,0x00,0x88,
+0x00,0x88,0x00,0x88,0x80,0xB3,0x80,0xB3,0x00,0x08,0x00,0x88,0x00,0x08,0x00,0x88,
+0x00,0x88,0x00,0x88,0x80,0x10,0x80,0x13,0x80,0x20,0x80,0x23,0x00,0x08,0x00,0x08,
+0x80,0x00,0x00,0x08,0x00,0x08,0x80,0x33,0x00,0x08,0x00,0x08,0x00,0x88,0x00,0x88,
+0x00,0x88,0x00,0x08,0x00,0x88,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x88,0x00,0x88,0x00,0x08,0x00,0x08,0x00,0x88,0x00,0x88,0x00,0x88,
+0x00,0x88,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x88,0x00,0x80,0x00,0x08,0x00,0x08,0x00,0x00,
+0x00,0x08,0x00,0x88,0x00,0x08,0x00,0x88,0x00,0x88,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x88,
+0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x08,0x00,0x08,0x00,0x88,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,
+0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xA3,
+0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,
+0x80,0xA0,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,
+0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,
+0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,
+0x80,0xA3,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,
+0x80,0xA0,0x80,0xA0,0x80,0xA0,0x80,0xA0,0x80,0xA0,0x80,0xA0,0x80,0xA3,0x80,0xA3,
+0x80,0xA0,0x80,0xA3,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA3,0x80,0xA0,0x80,0xA3,
+0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA3,0x80,0xA0,0x80,0xA0,0x80,0xA0,0x80,0xA0,
+0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA0,
+0x80,0xA0,0x80,0xA0,0x80,0xA0,0x80,0xA0,0x80,0xA3,0x80,0xA0,0x80,0xA0,0x80,0xA0,
+0x80,0xA0,0x80,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,
+0x80,0x93,0x80,0x90,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,
+0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,
+0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,
+0x80,0x90,0x80,0x93,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,
+0x80,0x93,0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x93,
+0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x93,0x80,0x90,
+0x80,0x93,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x93,0x80,0x90,0x80,0x90,0x00,0x00,
+0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,0x80,0x90,0x80,0x93,
+0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x93,0x80,0x90,
+0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x90,0x80,0x93,0x80,0x93,0x80,0x93,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x03,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x03,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x03,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x03,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,
+0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+
+static unsigned char NLSALLOC(0411) rgbILANGUAGE[] = {
+ '0', '4', '1', '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbSLANGUAGE[] = {
+ 0x93, 0xfa, 0x96, 0x7b, 0x8c, 0xea
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVLANGNAME[] = {
+ 'J', 'P', 'N'
+};
+
+static unsigned char NLSALLOC(0411) rgbSNATIVELANGNAME[] = {
+ 0x93, 0xfa, 0x96, 0x7b, 0x8c, 0xea
+};
+
+static unsigned char NLSALLOC(0411) rgbICOUNTRY[] = {
+ '8', '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbSCOUNTRY[] = {
+ 0x93, 0xfa, 0x96, 0x7b
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVCTRYNAME[] = {
+ 'J', 'P', 'N'
+};
+
+static unsigned char NLSALLOC(0411) rgbSNATIVECTRYNAME[] = {
+ 0x93, 0xfa, 0x96, 0x7b
+};
+
+static unsigned char NLSALLOC(0411) rgbIDEFAULTLANGUAGE[] = {
+ '0', '4', '1', '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbIDEFAULTCOUNTRY[] = {
+ '8', '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbIDEFAULTCODEPAGE[] = {
+ '9', '3', '2'
+};
+
+static unsigned char NLSALLOC(0411) rgbSLIST[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0411) rgbIMEASURE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbSDECIMAL[] = {
+ '.'
+};
+
+static unsigned char NLSALLOC(0411) rgbSTHOUSAND[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0411) rgbSGROUPING[] = {
+ '3', ';', '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbIDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0411) rgbILZERO[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbSNATIVEDIGITS[] = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
+};
+
+static unsigned char NLSALLOC(0411) rgbSCURRENCY[] = {
+ 0x5c
+};
+
+static unsigned char NLSALLOC(0411) rgbSINTLSYMBOL[] = {
+ 'J', 'P', 'Y'
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONDECIMALSEP[] = {
+ '.'
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHOUSANDSEP[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONGROUPING[] = {
+ '3', ';', '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbICURRDIGITS[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbIINTLCURRDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0411) rgbICURRENCY[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbINEGCURR[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbSDATE[] = {
+ '/'
+};
+
+static unsigned char NLSALLOC(0411) rgbSTIME[] = {
+ ':'
+};
+
+static unsigned char NLSALLOC(0411) rgbSSHORTDATE[] = {
+ 'y', 'y', '/', 'M', 'M', '/', 'd', 'd'
+};
+
+static unsigned char NLSALLOC(0411) rgbSLONGDATE[] = {
+ 'y', 'y', 'y', 'y',
+ 0x27, 0x94, 0x4e, 0x27,
+ 'M',
+ 0x27, 0x8c, 0x8e, 0x27,
+ 'd',
+ 0x27, 0x93, 0xfa, 0x27
+};
+
+static unsigned char NLSALLOC(0411) rgbIDATE[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0411) rgbILDATE[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0411) rgbITIME[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbICENTURY[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbITLZERO[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbIDAYLZERO[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbIMONLZERO[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbS1159[] = {
+ 0x8c, 0xdf, 0x91, 0x4f
+};
+
+static unsigned char NLSALLOC(0411) rgbS2359[] = {
+ 0x8c, 0xdf, 0x8c, 0xe3
+};
+
+static unsigned char NLSALLOC(0411) rgbSDAYNAME1[] = {
+ 0x8c, 0x8e, 0x97, 0x6a, 0x93, 0xfa
+};
+
+static unsigned char NLSALLOC(0411) rgbSDAYNAME2[] = {
+ 0x89, 0xce ,0x97, 0x6a, 0x93, 0xfa
+};
+
+static unsigned char NLSALLOC(0411) rgbSDAYNAME3[] = {
+ 0x90, 0x85 ,0x97, 0x6a, 0x93, 0xfa
+};
+
+static unsigned char NLSALLOC(0411) rgbSDAYNAME4[] = {
+ 0x96, 0xd8 ,0x97, 0x6a, 0x93, 0xfa
+};
+
+static unsigned char NLSALLOC(0411) rgbSDAYNAME5[] = {
+ 0x8b, 0xe0 ,0x97, 0x6a, 0x93, 0xfa
+};
+
+static unsigned char NLSALLOC(0411) rgbSDAYNAME6[] = {
+ 0x93, 0x79 ,0x97, 0x6a, 0x93, 0xfa
+};
+
+static unsigned char NLSALLOC(0411) rgbSDAYNAME7[] = {
+ 0x93, 0xfa ,0x97, 0x6a, 0x93, 0xfa
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVDAYNAME1[] = {
+ 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVDAYNAME2[] = {
+ 0x89, 0xce
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVDAYNAME3[] = {
+ 0x90, 0x85
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVDAYNAME4[] = {
+ 0x96, 0xd8
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVDAYNAME5[] = {
+ 0x8b, 0xe0
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVDAYNAME6[] = {
+ 0x93, 0x79
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVDAYNAME7[] = {
+ 0x93, 0xfa
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME1[] = {
+ '1', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME2[] = {
+ '2', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME3[] = {
+ '3', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME4[] = {
+ '4', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME5[] = {
+ '5', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME6[] = {
+ '6', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME7[] = {
+ '7', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME8[] = {
+ '8', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME9[] = {
+ '9', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME10[] = {
+ '1' ,'0', 0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME11[] = {
+ '1' ,'1' ,0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSMONTHNAME12[] = {
+ '1' ,'2' ,0x8c, 0x8e
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME1[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME2[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME3[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME4[] = {
+ '4'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME5[] = {
+ '5'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME6[] = {
+ '6'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME7[] = {
+ '7'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME8[] = {
+ '8'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME9[] = {
+ '9'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME10[] = {
+ '1','0'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME11[] = {
+ '1','1'
+};
+
+static unsigned char NLSALLOC(0411) rgbSABBREVMONTHNAME12[] = {
+ '1','2'
+};
+
+static unsigned char NLSALLOC(0411) rgbSNEGATIVESIGN[] = {
+ '-'
+};
+
+static unsigned char NLSALLOC(0411) rgbIPOSSIGNPOSN[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0411) rgbINEGSIGNPOSN[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0411) rgbIPOSSYMPRECEDES[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbIPOSSEPBYSPACE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbINEGSYMPRECEDES[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0411) rgbINEGSEPBYSPACE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0411) rgbSENGCOUNTRY[] = {
+ 'J', 'a', 'p', 'a', 'n'
+};
+
+static unsigned char NLSALLOC(0411) rgbSENGLANGUAGE[] = {
+ 'J', 'a', 'p', 'a', 'n', 'e', 's', 'e'
+};
+
+#if defined(VBA2) //hand-edited this locale info based on daytona [bassam]
+static BYTE NLSALLOC(0411) rgbIFIRSTDAYOFWEEK[] = { /* "6" */
+ 0x36
+};
+
+static BYTE NLSALLOC(0411) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0411) rgbIDEFAULTANSICODEPAGE[] = { /* "932" */
+ 0x39, 0x33, 0x32
+};
+
+static BYTE NLSALLOC(0411) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0411) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0411) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0411) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0411) rgbIOPTIONALCALENDAR[] = { /* "3" */
+ 0x33
+};
+#endif
+
+
+#define LCINFODAT(X) { DIM(X), (X) }
+LCINFO NLSALLOC(0411) g_rglcinfo0411[] = {
+ { 0, NULL}
+ , LCINFODAT(rgbILANGUAGE)
+ , LCINFODAT(rgbSLANGUAGE)
+ , LCINFODAT(rgbSABBREVLANGNAME)
+ , LCINFODAT(rgbSNATIVELANGNAME)
+ , LCINFODAT(rgbICOUNTRY)
+ , LCINFODAT(rgbSCOUNTRY)
+ , LCINFODAT(rgbSABBREVCTRYNAME)
+ , LCINFODAT(rgbSNATIVECTRYNAME)
+ , LCINFODAT(rgbIDEFAULTLANGUAGE)
+ , LCINFODAT(rgbIDEFAULTCOUNTRY)
+ , LCINFODAT(rgbIDEFAULTCODEPAGE)
+ , LCINFODAT(rgbSLIST)
+ , LCINFODAT(rgbIMEASURE)
+ , LCINFODAT(rgbSDECIMAL)
+ , LCINFODAT(rgbSTHOUSAND)
+ , LCINFODAT(rgbSGROUPING)
+ , LCINFODAT(rgbIDIGITS)
+ , LCINFODAT(rgbILZERO)
+ , LCINFODAT(rgbSNATIVEDIGITS)
+ , LCINFODAT(rgbSCURRENCY)
+ , LCINFODAT(rgbSINTLSYMBOL)
+ , LCINFODAT(rgbSMONDECIMALSEP)
+ , LCINFODAT(rgbSMONTHOUSANDSEP)
+ , LCINFODAT(rgbSMONGROUPING)
+ , LCINFODAT(rgbICURRDIGITS)
+ , LCINFODAT(rgbIINTLCURRDIGITS)
+ , LCINFODAT(rgbICURRENCY)
+ , LCINFODAT(rgbINEGCURR)
+ , LCINFODAT(rgbSDATE)
+ , LCINFODAT(rgbSTIME)
+ , LCINFODAT(rgbSSHORTDATE)
+ , LCINFODAT(rgbSLONGDATE)
+ , LCINFODAT(rgbIDATE)
+ , LCINFODAT(rgbILDATE)
+ , LCINFODAT(rgbITIME)
+ , LCINFODAT(rgbICENTURY)
+ , LCINFODAT(rgbITLZERO)
+ , LCINFODAT(rgbIDAYLZERO)
+ , LCINFODAT(rgbIMONLZERO)
+ , LCINFODAT(rgbS1159)
+ , LCINFODAT(rgbS2359)
+ , LCINFODAT(rgbSDAYNAME1)
+ , LCINFODAT(rgbSDAYNAME2)
+ , LCINFODAT(rgbSDAYNAME3)
+ , LCINFODAT(rgbSDAYNAME4)
+ , LCINFODAT(rgbSDAYNAME5)
+ , LCINFODAT(rgbSDAYNAME6)
+ , LCINFODAT(rgbSDAYNAME7)
+ , LCINFODAT(rgbSABBREVDAYNAME1)
+ , LCINFODAT(rgbSABBREVDAYNAME2)
+ , LCINFODAT(rgbSABBREVDAYNAME3)
+ , LCINFODAT(rgbSABBREVDAYNAME4)
+ , LCINFODAT(rgbSABBREVDAYNAME5)
+ , LCINFODAT(rgbSABBREVDAYNAME6)
+ , LCINFODAT(rgbSABBREVDAYNAME7)
+ , LCINFODAT(rgbSMONTHNAME1)
+ , LCINFODAT(rgbSMONTHNAME2)
+ , LCINFODAT(rgbSMONTHNAME3)
+ , LCINFODAT(rgbSMONTHNAME4)
+ , LCINFODAT(rgbSMONTHNAME5)
+ , LCINFODAT(rgbSMONTHNAME6)
+ , LCINFODAT(rgbSMONTHNAME7)
+ , LCINFODAT(rgbSMONTHNAME8)
+ , LCINFODAT(rgbSMONTHNAME9)
+ , LCINFODAT(rgbSMONTHNAME10)
+ , LCINFODAT(rgbSMONTHNAME11)
+ , LCINFODAT(rgbSMONTHNAME12)
+ , LCINFODAT(rgbSABBREVMONTHNAME1)
+ , LCINFODAT(rgbSABBREVMONTHNAME2)
+ , LCINFODAT(rgbSABBREVMONTHNAME3)
+ , LCINFODAT(rgbSABBREVMONTHNAME4)
+ , LCINFODAT(rgbSABBREVMONTHNAME5)
+ , LCINFODAT(rgbSABBREVMONTHNAME6)
+ , LCINFODAT(rgbSABBREVMONTHNAME7)
+ , LCINFODAT(rgbSABBREVMONTHNAME8)
+ , LCINFODAT(rgbSABBREVMONTHNAME9)
+ , LCINFODAT(rgbSABBREVMONTHNAME10)
+ , LCINFODAT(rgbSABBREVMONTHNAME11)
+ , LCINFODAT(rgbSABBREVMONTHNAME12)
+ , { 0, NULL }
+ , LCINFODAT(rgbSNEGATIVESIGN)
+ , LCINFODAT(rgbIPOSSIGNPOSN)
+ , LCINFODAT(rgbINEGSIGNPOSN)
+ , LCINFODAT(rgbIPOSSYMPRECEDES)
+ , LCINFODAT(rgbIPOSSEPBYSPACE)
+ , LCINFODAT(rgbINEGSYMPRECEDES)
+ , LCINFODAT(rgbINEGSEPBYSPACE)
+ , LCINFODAT(rgbSENGCOUNTRY)
+ , LCINFODAT(rgbSENGLANGUAGE)
+#if defined(VBA2)
+ , LCINFODAT(rgbIFIRSTDAYOFWEEK)
+ , LCINFODAT(rgbIFIRSTWEEKOFYEAR)
+ , LCINFODAT(rgbIDEFAULTANSICODEPAGE)
+ , LCINFODAT(rgbINEGNUMBER)
+ , LCINFODAT(rgbSTIMEFORMAT)
+ , LCINFODAT(rgbITIMEMARKPOSN)
+ , LCINFODAT(rgbICALENDARTYPE)
+ , LCINFODAT(rgbIOPTIONALCALENDAR)
+ , { 0, NULL }
+ , { 0, NULL }
+#endif
+
+};
+#undef LCINFODAT
+
+STRINFO_J NLSALLOC(0411) g_strinfo0411 = {
+ rgbPriHi
+ , rgbPriLo
+ , rgbSecwgt
+ , rgbSecflg
+ , rgbMasks
+ , rgbMaps
+ , rgbIgnore
+ , rgbC1JPN
+ , rgbC2JPN
+ , rgbC3JPN
+};
diff --git a/private/oleauto/src/dispatch/win16/0412.c b/private/oleauto/src/dispatch/win16/0412.c
new file mode 100644
index 000000000..c9bccdb4a
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0412.c
@@ -0,0 +1,1729 @@
+/***
+*0412.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+* Korea, Korean
+*
+* LCID = 0x0412
+*
+*
+*Generated: 9/22/93 - by hand from lcid_kor.txt
+*
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+#include "nlsdbcs.h"
+
+
+#if 1
+static SORTWEIGHT NLSALLOC(0412) rgsortweight[] = {
+ { 0x0000, 0x7800, 0x00, 0x00 }
+ , { 0x0020, 0x1020, 0x00, 0x02 }
+ , { 0x0030, 0x2030, 0x00, 0x02 }
+ , { 0x003A, 0x103A, 0x00, 0x02 }
+ , { 0x0041, 0x6041, 0x00, 0x02 }
+ , { 0x005B, 0x105B, 0x00, 0x02 }
+ , { 0x0061, 0x6041, 0x02, 0x02 }
+ , { 0x007B, 0x107B, 0x00, 0x02 }
+ , { 0x007F, 0x7002, 0x00, 0x00 }
+ , { 0xA1A1, 0x1020, 0x01, 0x02 }
+ , { 0xA1A2, 0x71A2, 0x01, 0x00 }
+ , { 0xA3A1, 0x1021, 0x01, 0x02 }
+ , { 0xA3B0, 0x2030, 0x01, 0x02 }
+ , { 0xA3BA, 0x103A, 0x01, 0x02 }
+ , { 0xA3C1, 0x6041, 0x01, 0x02 }
+ , { 0xA3DB, 0x105B, 0x01, 0x02 }
+ , { 0xA3E1, 0x6041, 0x03, 0x02 }
+ , { 0xA3FB, 0x107B, 0x01, 0x02 }
+ , { 0xA4A1, 0x3002, 0x00, 0x00 }
+ , { 0xA4A2, 0x3202, 0x00, 0x00 }
+ , { 0xA4A3, 0x3502, 0x00, 0x00 }
+ , { 0xA4A5, 0x3702, 0x00, 0x00 }
+ , { 0xA4A8, 0x3902, 0x00, 0x00 }
+ , { 0xA4A9, 0x3B02, 0x00, 0x00 }
+ , { 0xA4AA, 0x3E02, 0x00, 0x00 }
+ , { 0xA4B2, 0x4002, 0x00, 0x00 }
+ , { 0xA4B3, 0x4202, 0x00, 0x00 }
+ , { 0xA4B4, 0x4402, 0x00, 0x00 }
+ , { 0xA4B6, 0x4702, 0x00, 0x00 }
+ , { 0xA4B7, 0x4902, 0x00, 0x00 }
+ , { 0xA4B8, 0x4C02, 0x00, 0x00 }
+ , { 0xA4B9, 0x4F02, 0x00, 0x00 }
+ , { 0xA4BA, 0x5002, 0x00, 0x00 }
+ , { 0xA4BB, 0x5302, 0x00, 0x00 }
+ , { 0xA4BC, 0x5502, 0x00, 0x00 }
+ , { 0xA4BD, 0x5702, 0x00, 0x00 }
+ , { 0xA4BE, 0x5902, 0x00, 0x00 }
+ , { 0xA4BF, 0x5C02, 0x00, 0x00 }
+ , { 0xA5A1, 0x73A1, 0x00, 0x00 }
+ , { 0xB0A1, 0x30A1, 0x00, 0x00 }
+ , { 0xB1EE, 0x32EE, 0x00, 0x00 }
+ , { 0xB3AA, 0x35AA, 0x00, 0x00 }
+ , { 0xB4D9, 0x37D9, 0x00, 0x00 }
+ , { 0xB5FB, 0x39FB, 0x00, 0x00 }
+ , { 0xB6F3, 0x3BF3, 0x00, 0x00 }
+ , { 0xB8B6, 0x3EB6, 0x00, 0x00 }
+ , { 0xB9D9, 0x40D9, 0x00, 0x00 }
+ , { 0xBAFC, 0x42FC, 0x00, 0x00 }
+ , { 0xBBE7, 0x44E7, 0x00, 0x00 }
+ , { 0xBDCE, 0x47CE, 0x00, 0x00 }
+ , { 0xBEC6, 0x49C6, 0x00, 0x00 }
+ , { 0xC0DA, 0x4CDA, 0x00, 0x00 }
+ , { 0xC2A5, 0x4FA5, 0x00, 0x00 }
+ , { 0xC2F7, 0x50F7, 0x00, 0x00 }
+ , { 0xC4AB, 0x53AB, 0x00, 0x00 }
+ , { 0xC5B8, 0x55B8, 0x00, 0x00 }
+ , { 0xC6C4, 0x57C4, 0x00, 0x00 }
+ , { 0xC7CF, 0x59CF, 0x00, 0x00 }
+ , { 0xCAA1, 0x30A1, 0x01, 0x01 }
+ , { 0xCABE, 0x30A2, 0x01, 0x01 }
+ , { 0xCAC9, 0x30A3, 0x01, 0x01 }
+ , { 0xCAE1, 0x30A5, 0x01, 0x01 }
+ , { 0xCAEB, 0x30A8, 0x01, 0x01 }
+ , { 0xCBA1, 0x30A9, 0x01, 0x01 }
+ , { 0xCBA7, 0x30AD, 0x01, 0x01 }
+ , { 0xCBBF, 0x30B3, 0x01, 0x01 }
+ , { 0xCBD3, 0x30B4, 0x01, 0x01 }
+ , { 0xCBD5, 0x30BB, 0x01, 0x01 }
+ , { 0xCBD9, 0x30BD, 0x01, 0x01 }
+ , { 0xCBDA, 0x30C5, 0x01, 0x01 }
+ , { 0xCBEB, 0x30C7, 0x01, 0x01 }
+ , { 0xCBF7, 0x30C9, 0x01, 0x01 }
+ , { 0xCBFB, 0x30CB, 0x01, 0x01 }
+ , { 0xCCA4, 0x30CC, 0x01, 0x01 }
+ , { 0xCCA7, 0x30D4, 0x01, 0x01 }
+ , { 0xCCAA, 0x30DD, 0x01, 0x01 }
+ , { 0xCCB1, 0x30DF, 0x01, 0x01 }
+ , { 0xCCBC, 0x30E1, 0x01, 0x01 }
+ , { 0xCCC2, 0x30E2, 0x01, 0x01 }
+ , { 0xCCC8, 0x30E6, 0x01, 0x01 }
+ , { 0xCCF5, 0x30E8, 0x01, 0x01 }
+ , { 0xCDAF, 0x30ED, 0x01, 0x01 }
+ , { 0xCDD6, 0x30EE, 0x01, 0x01 }
+ , { 0xCDDD, 0x30EF, 0x01, 0x01 }
+ , { 0xCDE7, 0x30F1, 0x01, 0x01 }
+ , { 0xCDEA, 0x30F8, 0x01, 0x01 }
+ , { 0xCDFA, 0x30F9, 0x01, 0x01 }
+ , { 0xCDFB, 0x30FA, 0x01, 0x01 }
+ , { 0xCEA9, 0x30FB, 0x01, 0x01 }
+ , { 0xCEAD, 0x30FC, 0x01, 0x01 }
+ , { 0xCEBE, 0x30FD, 0x01, 0x01 }
+ , { 0xCEC2, 0x31A4, 0x01, 0x01 }
+ , { 0xCECF, 0x31A5, 0x01, 0x01 }
+ , { 0xCED2, 0x31AB, 0x01, 0x01 }
+ , { 0xCEDB, 0x31B2, 0x01, 0x01 }
+ , { 0xCEDF, 0x31B3, 0x01, 0x01 }
+ , { 0xCEF8, 0x31B8, 0x01, 0x01 }
+ , { 0xCFD0, 0x31B9, 0x01, 0x01 }
+ , { 0xCFD6, 0x31BA, 0x01, 0x01 }
+ , { 0xCFDC, 0x31BC, 0x01, 0x01 }
+ , { 0xCFE0, 0x31C3, 0x01, 0x01 }
+ , { 0xCFE6, 0x31C7, 0x01, 0x01 }
+ , { 0xCFF0, 0x31C8, 0x01, 0x01 }
+ , { 0xCFF5, 0x31CB, 0x01, 0x01 }
+ , { 0xCFFB, 0x31CD, 0x01, 0x01 }
+ , { 0xD0A3, 0x31D4, 0x01, 0x01 }
+ , { 0xD0B2, 0x31D5, 0x01, 0x01 }
+ , { 0xD0B9, 0x31D6, 0x01, 0x01 }
+ , { 0xD0BA, 0x31D8, 0x01, 0x01 }
+ , { 0xD0C1, 0x31D9, 0x01, 0x01 }
+ , { 0xD0D0, 0x31DB, 0x01, 0x01 }
+ , { 0xD0D1, 0x31DD, 0x01, 0x01 }
+ , { 0xD0DF, 0x31DE, 0x01, 0x01 }
+ , { 0xD0E6, 0x31E0, 0x01, 0x01 }
+ , { 0xD0EA, 0x31E2, 0x01, 0x01 }
+ , { 0xD1CC, 0x31E4, 0x01, 0x01 }
+ , { 0xD1CD, 0x31E6, 0x01, 0x01 }
+ , { 0xD1D1, 0x31E8, 0x01, 0x01 }
+ , { 0xD1D2, 0x34A3, 0x01, 0x01 }
+ , { 0xD1D3, 0x35AA, 0x01, 0x01 }
+ , { 0xD1E2, 0x35AB, 0x01, 0x01 }
+ , { 0xD1EA, 0x35AD, 0x01, 0x01 }
+ , { 0xD1F3, 0x35AF, 0x01, 0x01 }
+ , { 0xD1F5, 0x35B2, 0x01, 0x01 }
+ , { 0xD1FE, 0x35B3, 0x01, 0x01 }
+ , { 0xD2A5, 0x35B6, 0x01, 0x01 }
+ , { 0xD2AC, 0x35BB, 0x01, 0x01 }
+ , { 0xD2B2, 0x35C3, 0x01, 0x01 }
+ , { 0xD2B3, 0x35E0, 0x01, 0x01 }
+ , { 0xD2B4, 0x35E2, 0x01, 0x01 }
+ , { 0xD2B7, 0x35E4, 0x01, 0x01 }
+ , { 0xD2BB, 0x35E7, 0x01, 0x01 }
+ , { 0xD2BD, 0x35EB, 0x01, 0x01 }
+ , { 0xD2CF, 0x35EC, 0x01, 0x01 }
+ , { 0xD2D5, 0x35ED, 0x01, 0x01 }
+ , { 0xD2D6, 0x35F3, 0x01, 0x01 }
+ , { 0xD2DD, 0x35FA, 0x01, 0x01 }
+ , { 0xD2E3, 0x36A2, 0x01, 0x01 }
+ , { 0xD2E4, 0x36A9, 0x01, 0x01 }
+ , { 0xD2EC, 0x36AB, 0x01, 0x01 }
+ , { 0xD2ED, 0x36AD, 0x01, 0x01 }
+ , { 0xD2EE, 0x36BA, 0x01, 0x01 }
+ , { 0xD2F0, 0x36C1, 0x01, 0x01 }
+ , { 0xD2F2, 0x36C6, 0x01, 0x01 }
+ , { 0xD2F3, 0x36C9, 0x01, 0x01 }
+ , { 0xD2F9, 0x36CF, 0x01, 0x01 }
+ , { 0xD2FB, 0x36D0, 0x01, 0x01 }
+ , { 0xD2FD, 0x37D9, 0x01, 0x01 }
+ , { 0xD3A1, 0x37DC, 0x01, 0x01 }
+ , { 0xD3B5, 0x37DE, 0x01, 0x01 }
+ , { 0xD3BA, 0x37E3, 0x01, 0x01 }
+ , { 0xD3CB, 0x37E4, 0x01, 0x01 }
+ , { 0xD3D0, 0x37E7, 0x01, 0x01 }
+ , { 0xD3DB, 0x37EB, 0x01, 0x01 }
+ , { 0xD3EB, 0x37EC, 0x01, 0x01 }
+ , { 0xD3EC, 0x37F6, 0x01, 0x01 }
+ , { 0xD3EE, 0x38B5, 0x01, 0x01 }
+ , { 0xD4B8, 0x38B6, 0x01, 0x01 }
+ , { 0xD4C2, 0x38B7, 0x01, 0x01 }
+ , { 0xD4CC, 0x38B9, 0x01, 0x01 }
+ , { 0xD4CE, 0x38BF, 0x01, 0x01 }
+ , { 0xD4DF, 0x38CE, 0x01, 0x01 }
+ , { 0xD4EA, 0x38D0, 0x01, 0x01 }
+ , { 0xD4F0, 0x38E6, 0x01, 0x01 }
+ , { 0xD4F1, 0x38EE, 0x01, 0x01 }
+ , { 0xD4FA, 0x3BF3, 0x01, 0x01 }
+ , { 0xD5A5, 0x3BF4, 0x01, 0x01 }
+ , { 0xD5AE, 0x3BF5, 0x01, 0x01 }
+ , { 0xD5B7, 0x3BF6, 0x01, 0x01 }
+ , { 0xD5B9, 0x3BF7, 0x01, 0x01 }
+ , { 0xD5C3, 0x3BF8, 0x01, 0x01 }
+ , { 0xD5C6, 0x3BFB, 0x01, 0x01 }
+ , { 0xD5CE, 0x3CA1, 0x01, 0x01 }
+ , { 0xD5D2, 0x3CA9, 0x01, 0x01 }
+ , { 0xD5D3, 0x3CAB, 0x01, 0x01 }
+ , { 0xD5D5, 0x3CAE, 0x01, 0x01 }
+ , { 0xD5E2, 0x3CC1, 0x01, 0x01 }
+ , { 0xD5F4, 0x3CC2, 0x01, 0x01 }
+ , { 0xD5FB, 0x3CC3, 0x01, 0x01 }
+ , { 0xD6A9, 0x3CC4, 0x01, 0x01 }
+ , { 0xD6AF, 0x3CC5, 0x01, 0x01 }
+ , { 0xD6B4, 0x3CC6, 0x01, 0x01 }
+ , { 0xD6B5, 0x3CC9, 0x01, 0x01 }
+ , { 0xD6C7, 0x3CCA, 0x01, 0x01 }
+ , { 0xD6CC, 0x3CCE, 0x01, 0x01 }
+ , { 0xD6DE, 0x3CCF, 0x01, 0x01 }
+ , { 0xD6E5, 0x3CD0, 0x01, 0x01 }
+ , { 0xD6E6, 0x3CD5, 0x01, 0x01 }
+ , { 0xD6ED, 0x3CDA, 0x01, 0x01 }
+ , { 0xD6F5, 0x3CE1, 0x01, 0x01 }
+ , { 0xD7A3, 0x3CE6, 0x01, 0x01 }
+ , { 0xD7A4, 0x3CE7, 0x01, 0x01 }
+ , { 0xD7B1, 0x3CF9, 0x01, 0x01 }
+ , { 0xD7BF, 0x3CFA, 0x01, 0x01 }
+ , { 0xD7C2, 0x3CFB, 0x01, 0x01 }
+ , { 0xD7C8, 0x3CFC, 0x01, 0x01 }
+ , { 0xD7CC, 0x3DA2, 0x01, 0x01 }
+ , { 0xD7CD, 0x3DA4, 0x01, 0x01 }
+ , { 0xD7CF, 0x3DA7, 0x01, 0x01 }
+ , { 0xD7D0, 0x3DAA, 0x01, 0x01 }
+ , { 0xD7D6, 0x3DAE, 0x01, 0x01 }
+ , { 0xD7F0, 0x3DB0, 0x01, 0x01 }
+ , { 0xD7F9, 0x3DB2, 0x01, 0x01 }
+ , { 0xD7FE, 0x3DB3, 0x01, 0x01 }
+ , { 0xD8A4, 0x3EB6, 0x01, 0x01 }
+ , { 0xD8AC, 0x3EB7, 0x01, 0x01 }
+ , { 0xD8B2, 0x3EB8, 0x01, 0x01 }
+ , { 0xD8C5, 0x3EBB, 0x01, 0x01 }
+ , { 0xD8CC, 0x3EC1, 0x01, 0x01 }
+ , { 0xD8D8, 0x3EC5, 0x01, 0x01 }
+ , { 0xD8E6, 0x3EC6, 0x01, 0x01 }
+ , { 0xD8EB, 0x3ECD, 0x01, 0x01 }
+ , { 0xD8F1, 0x3EE8, 0x01, 0x01 }
+ , { 0xD8F3, 0x3EE9, 0x01, 0x01 }
+ , { 0xD8FE, 0x3EEA, 0x01, 0x01 }
+ , { 0xD9A2, 0x3EED, 0x01, 0x01 }
+ , { 0xD9B1, 0x3EEF, 0x01, 0x01 }
+ , { 0xD9B2, 0x3EF0, 0x01, 0x01 }
+ , { 0xD9CA, 0x3EF1, 0x01, 0x01 }
+ , { 0xD9D1, 0x3EF4, 0x01, 0x01 }
+ , { 0xD9D3, 0x3EF9, 0x01, 0x01 }
+ , { 0xD9D6, 0x3FA6, 0x01, 0x01 }
+ , { 0xD9E2, 0x3FAB, 0x01, 0x01 }
+ , { 0xD9F8, 0x3FAC, 0x01, 0x01 }
+ , { 0xD9FA, 0x3FAE, 0x01, 0x01 }
+ , { 0xDAA8, 0x3FB0, 0x01, 0x01 }
+ , { 0xDAAB, 0x3FCC, 0x01, 0x01 }
+ , { 0xDABE, 0x3FCE, 0x01, 0x01 }
+ , { 0xDACB, 0x3FD0, 0x01, 0x01 }
+ , { 0xDACE, 0x40DA, 0x01, 0x01 }
+ , { 0xDAE1, 0x40DD, 0x01, 0x01 }
+ , { 0xDAFA, 0x40DF, 0x01, 0x01 }
+ , { 0xDBA7, 0x40E6, 0x01, 0x01 }
+ , { 0xDBC3, 0x40E8, 0x01, 0x01 }
+ , { 0xDBD7, 0x40E9, 0x01, 0x01 }
+ , { 0xDBDF, 0x40F8, 0x01, 0x01 }
+ , { 0xDBE9, 0x40FA, 0x01, 0x01 }
+ , { 0xDBED, 0x40FC, 0x01, 0x01 }
+ , { 0xDBF6, 0x40FD, 0x01, 0x01 }
+ , { 0xDBF8, 0x41AE, 0x01, 0x01 }
+ , { 0xDCA5, 0x41AF, 0x01, 0x01 }
+ , { 0xDCAC, 0x41B0, 0x01, 0x01 }
+ , { 0xDCB0, 0x41B4, 0x01, 0x01 }
+ , { 0xDCC1, 0x41B8, 0x01, 0x01 }
+ , { 0xDCD1, 0x41B9, 0x01, 0x01 }
+ , { 0xDCE2, 0x41BB, 0x01, 0x01 }
+ , { 0xDCE3, 0x41BC, 0x01, 0x01 }
+ , { 0xDCE4, 0x41C0, 0x01, 0x01 }
+ , { 0xDCF4, 0x41CE, 0x01, 0x01 }
+ , { 0xDDC1, 0x41CF, 0x01, 0x01 }
+ , { 0xDDC2, 0x41D0, 0x01, 0x01 }
+ , { 0xDDD5, 0x41D2, 0x01, 0x01 }
+ , { 0xDDDA, 0x41D8, 0x01, 0x01 }
+ , { 0xDDE0, 0x41F1, 0x01, 0x01 }
+ , { 0xDEAD, 0x41F3, 0x01, 0x01 }
+ , { 0xDEBB, 0x41F9, 0x01, 0x01 }
+ , { 0xDEBF, 0x44E7, 0x01, 0x01 }
+ , { 0xDEFB, 0x44E8, 0x01, 0x01 }
+ , { 0xDFA1, 0x44EA, 0x01, 0x01 }
+ , { 0xDFAD, 0x44EC, 0x01, 0x01 }
+ , { 0xDFB2, 0x44EF, 0x01, 0x01 }
+ , { 0xDFBA, 0x44F0, 0x01, 0x01 }
+ , { 0xDFBE, 0x44F3, 0x01, 0x01 }
+ , { 0xDFDD, 0x44F5, 0x01, 0x01 }
+ , { 0xDFE0, 0x44F6, 0x01, 0x01 }
+ , { 0xDFE5, 0x44FD, 0x01, 0x01 }
+ , { 0xDFEA, 0x45AD, 0x01, 0x01 }
+ , { 0xE0AA, 0x45AE, 0x01, 0x01 }
+ , { 0xE0B9, 0x45B1, 0x01, 0x01 }
+ , { 0xE0D9, 0x45B3, 0x01, 0x01 }
+ , { 0xE0E6, 0x45B6, 0x01, 0x01 }
+ , { 0xE0EE, 0x45B7, 0x01, 0x01 }
+ , { 0xE0F2, 0x45BA, 0x01, 0x01 }
+ , { 0xE1A6, 0x45BC, 0x01, 0x01 }
+ , { 0xE1AF, 0x45D2, 0x01, 0x01 }
+ , { 0xE1D4, 0x45D3, 0x01, 0x01 }
+ , { 0xE1DD, 0x45D5, 0x01, 0x01 }
+ , { 0xE1E3, 0x45D6, 0x01, 0x01 }
+ , { 0xE1E4, 0x45DB, 0x01, 0x01 }
+ , { 0xE1EC, 0x45E2, 0x01, 0x01 }
+ , { 0xE1F1, 0x45E8, 0x01, 0x01 }
+ , { 0xE1F3, 0x45F6, 0x01, 0x01 }
+ , { 0xE2D2, 0x45F7, 0x01, 0x01 }
+ , { 0xE2DE, 0x45F8, 0x01, 0x01 }
+ , { 0xE2F9, 0x45FA, 0x01, 0x01 }
+ , { 0xE2FD, 0x45FE, 0x01, 0x01 }
+ , { 0xE3A2, 0x46BD, 0x01, 0x01 }
+ , { 0xE3A5, 0x46C0, 0x01, 0x01 }
+ , { 0xE3AA, 0x46C2, 0x01, 0x01 }
+ , { 0xE3B4, 0x46C3, 0x01, 0x01 }
+ , { 0xE3D0, 0x46C4, 0x01, 0x01 }
+ , { 0xE3DF, 0x46C5, 0x01, 0x01 }
+ , { 0xE3F7, 0x46C7, 0x01, 0x01 }
+ , { 0xE3FB, 0x46C9, 0x01, 0x01 }
+ , { 0xE4A7, 0x46CA, 0x01, 0x01 }
+ , { 0xE4AA, 0x47D6, 0x01, 0x01 }
+ , { 0xE4AB, 0x48BE, 0x01, 0x01 }
+ , { 0xE4AC, 0x49C6, 0x01, 0x01 }
+ , { 0xE4BE, 0x49C7, 0x01, 0x01 }
+ , { 0xE4CC, 0x49C8, 0x01, 0x01 }
+ , { 0xE4D6, 0x49CB, 0x01, 0x01 }
+ , { 0xE4DA, 0x49CF, 0x01, 0x01 }
+ , { 0xE4E2, 0x49D0, 0x01, 0x01 }
+ , { 0xE4E6, 0x49D3, 0x01, 0x01 }
+ , { 0xE4ED, 0x49D6, 0x01, 0x01 }
+ , { 0xE4F8, 0x49D7, 0x01, 0x01 }
+ , { 0xE5A1, 0x49DE, 0x01, 0x01 }
+ , { 0xE5A5, 0x49DF, 0x01, 0x01 }
+ , { 0xE5B0, 0x49E0, 0x01, 0x01 }
+ , { 0xE5B9, 0x49E7, 0x01, 0x01 }
+ , { 0xE5D8, 0x49EE, 0x01, 0x01 }
+ , { 0xE5E2, 0x49EF, 0x01, 0x01 }
+ , { 0xE5E7, 0x49F0, 0x01, 0x01 }
+ , { 0xE5ED, 0x49F3, 0x01, 0x01 }
+ , { 0xE5EF, 0x49F6, 0x01, 0x01 }
+ , { 0xE5F5, 0x49F7, 0x01, 0x01 }
+ , { 0xE5F7, 0x4AA3, 0x01, 0x01 }
+ , { 0xE5F8, 0x4AA9, 0x01, 0x01 }
+ , { 0xE6B2, 0x4AAA, 0x01, 0x01 }
+ , { 0xE6BF, 0x4AAC, 0x01, 0x01 }
+ , { 0xE6EA, 0x4AAD, 0x01, 0x01 }
+ , { 0xE6F4, 0x4AB0, 0x01, 0x01 }
+ , { 0xE7A5, 0x4AB1, 0x01, 0x01 }
+ , { 0xE7A9, 0x4AB5, 0x01, 0x01 }
+ , { 0xE7D1, 0x4AB9, 0x01, 0x01 }
+ , { 0xE7E9, 0x4AC0, 0x01, 0x01 }
+ , { 0xE8A9, 0x4AC1, 0x01, 0x01 }
+ , { 0xE8AE, 0x4AC2, 0x01, 0x01 }
+ , { 0xE8B4, 0x4AC3, 0x01, 0x01 }
+ , { 0xE8B5, 0x4ACB, 0x01, 0x01 }
+ , { 0xE8BE, 0x4ACD, 0x01, 0x01 }
+ , { 0xE8C6, 0x4ACF, 0x01, 0x01 }
+ , { 0xE8D8, 0x4AD0, 0x01, 0x01 }
+ , { 0xE8D9, 0x4AD5, 0x01, 0x01 }
+ , { 0xE8DE, 0x4AD6, 0x01, 0x01 }
+ , { 0xE8E2, 0x4ADC, 0x01, 0x01 }
+ , { 0xE8E7, 0x4AE4, 0x01, 0x01 }
+ , { 0xE9AF, 0x4AE5, 0x01, 0x01 }
+ , { 0xE9B5, 0x4AEB, 0x01, 0x01 }
+ , { 0xE9CD, 0x4AEC, 0x01, 0x01 }
+ , { 0xE9ED, 0x4AED, 0x01, 0x01 }
+ , { 0xE9F6, 0x4AEE, 0x01, 0x01 }
+ , { 0xEAA5, 0x4AEF, 0x01, 0x01 }
+ , { 0xEAA8, 0x4AF5, 0x01, 0x01 }
+ , { 0xEAAA, 0x4AF8, 0x01, 0x01 }
+ , { 0xEAC5, 0x4AF9, 0x01, 0x01 }
+ , { 0xEAC8, 0x4BA7, 0x01, 0x01 }
+ , { 0xEAE1, 0x4BAF, 0x01, 0x01 }
+ , { 0xEBBB, 0x4BB0, 0x01, 0x01 }
+ , { 0xEBC2, 0x4BB1, 0x01, 0x01 }
+ , { 0xEBCF, 0x4BB2, 0x01, 0x01 }
+ , { 0xEBD4, 0x4BB6, 0x01, 0x01 }
+ , { 0xEBD9, 0x4BBA, 0x01, 0x01 }
+ , { 0xEBE0, 0x4BBB, 0x01, 0x01 }
+ , { 0xEBE1, 0x4BBD, 0x01, 0x01 }
+ , { 0xEBE7, 0x4BBE, 0x01, 0x01 }
+ , { 0xEBEA, 0x4BC0, 0x01, 0x01 }
+ , { 0xEBEE, 0x4BC7, 0x01, 0x01 }
+ , { 0xECA3, 0x4BCC, 0x01, 0x01 }
+ , { 0xECC9, 0x4BCD, 0x01, 0x01 }
+ , { 0xECD1, 0x4BCE, 0x01, 0x01 }
+ , { 0xECE9, 0x4BCF, 0x01, 0x01 }
+ , { 0xECF2, 0x4BD3, 0x01, 0x01 }
+ , { 0xECFD, 0x4BD4, 0x01, 0x01 }
+ , { 0xEDA4, 0x4BD7, 0x01, 0x01 }
+ , { 0xEDA8, 0x4CDA, 0x01, 0x01 }
+ , { 0xEDC2, 0x4CDB, 0x01, 0x01 }
+ , { 0xEDCF, 0x4CDC, 0x01, 0x01 }
+ , { 0xEDD4, 0x4CE1, 0x01, 0x01 }
+ , { 0xEDDA, 0x4CE2, 0x01, 0x01 }
+ , { 0xEDDB, 0x4CE5, 0x01, 0x01 }
+ , { 0xEEA2, 0x4CE7, 0x01, 0x01 }
+ , { 0xEEB3, 0x4CEF, 0x01, 0x01 }
+ , { 0xEEB7, 0x4CFA, 0x01, 0x01 }
+ , { 0xEED3, 0x4CFB, 0x01, 0x01 }
+ , { 0xEEEC, 0x4CFC, 0x01, 0x01 }
+ , { 0xEFB7, 0x4CFD, 0x01, 0x01 }
+ , { 0xEFBF, 0x4DA1, 0x01, 0x01 }
+ , { 0xEFC8, 0x4DA2, 0x01, 0x01 }
+ , { 0xEFCB, 0x4DA4, 0x01, 0x01 }
+ , { 0xF0A4, 0x4DA6, 0x01, 0x01 }
+ , { 0xF0BB, 0x4DB6, 0x01, 0x01 }
+ , { 0xF0E9, 0x4DB7, 0x01, 0x01 }
+ , { 0xF0ED, 0x4DB8, 0x01, 0x01 }
+ , { 0xF0EF, 0x4DB9, 0x01, 0x01 }
+ , { 0xF0F2, 0x4DBE, 0x01, 0x01 }
+ , { 0xF1A5, 0x4DC2, 0x01, 0x01 }
+ , { 0xF1AA, 0x4DCB, 0x01, 0x01 }
+ , { 0xF1AB, 0x4DD6, 0x01, 0x01 }
+ , { 0xF1D3, 0x4DD7, 0x01, 0x01 }
+ , { 0xF1D5, 0x4DD8, 0x01, 0x01 }
+ , { 0xF1E8, 0x4DD9, 0x01, 0x01 }
+ , { 0xF1E9, 0x4DDF, 0x01, 0x01 }
+ , { 0xF1ED, 0x4DEF, 0x01, 0x01 }
+ , { 0xF1EE, 0x4DF1, 0x01, 0x01 }
+ , { 0xF1EF, 0x4DF3, 0x01, 0x01 }
+ , { 0xF1F2, 0x4DF5, 0x01, 0x01 }
+ , { 0xF1FD, 0x4DF6, 0x01, 0x01 }
+ , { 0xF2C1, 0x4DF7, 0x01, 0x01 }
+ , { 0xF2C6, 0x4DF8, 0x01, 0x01 }
+ , { 0xF2E9, 0x4DFA, 0x01, 0x01 }
+ , { 0xF2F8, 0x4DFC, 0x01, 0x01 }
+ , { 0xF2FA, 0x4DFD, 0x01, 0x01 }
+ , { 0xF3A3, 0x4EA1, 0x01, 0x01 }
+ , { 0xF3A6, 0x50F7, 0x01, 0x01 }
+ , { 0xF3B5, 0x50F8, 0x01, 0x01 }
+ , { 0xF3BC, 0x50F9, 0x01, 0x01 }
+ , { 0xF3CB, 0x50FB, 0x01, 0x01 }
+ , { 0xF3D0, 0x50FC, 0x01, 0x01 }
+ , { 0xF3DA, 0x51A2, 0x01, 0x01 }
+ , { 0xF3F0, 0x51A4, 0x01, 0x01 }
+ , { 0xF3FC, 0x51A5, 0x01, 0x01 }
+ , { 0xF4A2, 0x51B3, 0x01, 0x01 }
+ , { 0xF4A6, 0x51B4, 0x01, 0x01 }
+ , { 0xF4B5, 0x51B5, 0x01, 0x01 }
+ , { 0xF4C8, 0x51B6, 0x01, 0x01 }
+ , { 0xF4D2, 0x51B7, 0x01, 0x01 }
+ , { 0xF4DC, 0x51B8, 0x01, 0x01 }
+ , { 0xF4E6, 0x51BB, 0x01, 0x01 }
+ , { 0xF4EE, 0x51BC, 0x01, 0x01 }
+ , { 0xF4F8, 0x51CA, 0x01, 0x01 }
+ , { 0xF5B5, 0x51CB, 0x01, 0x01 }
+ , { 0xF5BB, 0x51CC, 0x01, 0x01 }
+ , { 0xF5BF, 0x51D1, 0x01, 0x01 }
+ , { 0xF5C9, 0x51D4, 0x01, 0x01 }
+ , { 0xF5CA, 0x51D6, 0x01, 0x01 }
+ , { 0xF5CD, 0x51DF, 0x01, 0x01 }
+ , { 0xF5E4, 0x51E0, 0x01, 0x01 }
+ , { 0xF5F0, 0x51E1, 0x01, 0x01 }
+ , { 0xF5F3, 0x51E2, 0x01, 0x01 }
+ , { 0xF5F6, 0x51E6, 0x01, 0x01 }
+ , { 0xF5FC, 0x51E9, 0x01, 0x01 }
+ , { 0xF6A2, 0x51EB, 0x01, 0x01 }
+ , { 0xF6B0, 0x51F8, 0x01, 0x01 }
+ , { 0xF6B5, 0x51FE, 0x01, 0x01 }
+ , { 0xF6B6, 0x52A1, 0x01, 0x01 }
+ , { 0xF6CE, 0x52A2, 0x01, 0x01 }
+ , { 0xF6D1, 0x52A3, 0x01, 0x01 }
+ , { 0xF6D2, 0x52A5, 0x01, 0x01 }
+ , { 0xF6D5, 0x52A7, 0x01, 0x01 }
+ , { 0xF6DE, 0x52A8, 0x01, 0x01 }
+ , { 0xF6DF, 0x52AA, 0x01, 0x01 }
+ , { 0xF6E1, 0x53E8, 0x01, 0x01 }
+ , { 0xF6E2, 0x55B8, 0x01, 0x01 }
+ , { 0xF6F0, 0x55B9, 0x01, 0x01 }
+ , { 0xF7A2, 0x55BA, 0x01, 0x01 }
+ , { 0xF7AC, 0x55BB, 0x01, 0x01 }
+ , { 0xF7AE, 0x55BD, 0x01, 0x01 }
+ , { 0xF7B2, 0x55BE, 0x01, 0x01 }
+ , { 0xF7B5, 0x55C1, 0x01, 0x01 }
+ , { 0xF7BA, 0x55C2, 0x01, 0x01 }
+ , { 0xF7C8, 0x55C3, 0x01, 0x01 }
+ , { 0xF7CB, 0x55CA, 0x01, 0x01 }
+ , { 0xF7CC, 0x55CD, 0x01, 0x01 }
+ , { 0xF7CD, 0x55E4, 0x01, 0x01 }
+ , { 0xF7D1, 0x55EB, 0x01, 0x01 }
+ , { 0xF7D8, 0x55F0, 0x01, 0x01 }
+ , { 0xF7DE, 0x55F5, 0x01, 0x01 }
+ , { 0xF7E4, 0x56AF, 0x01, 0x01 }
+ , { 0xF7E6, 0x56B4, 0x01, 0x01 }
+ , { 0xF7E7, 0x57C4, 0x01, 0x01 }
+ , { 0xF7F7, 0x57C7, 0x01, 0x01 }
+ , { 0xF8A2, 0x57C8, 0x01, 0x01 }
+ , { 0xF8A5, 0x57D0, 0x01, 0x01 }
+ , { 0xF8B0, 0x57D8, 0x01, 0x01 }
+ , { 0xF8B4, 0x57DA, 0x01, 0x01 }
+ , { 0xF8B5, 0x57ED, 0x01, 0x01 }
+ , { 0xF8BF, 0x57EF, 0x01, 0x01 }
+ , { 0xF8C0, 0x57F2, 0x01, 0x01 }
+ , { 0xF8C5, 0x57F3, 0x01, 0x01 }
+ , { 0xF8CF, 0x57F7, 0x01, 0x01 }
+ , { 0xF8EB, 0x57F8, 0x01, 0x01 }
+ , { 0xF8F1, 0x58A5, 0x01, 0x01 }
+ , { 0xF9A1, 0x58B0, 0x01, 0x01 }
+ , { 0xF9A3, 0x58B3, 0x01, 0x01 }
+ , { 0xF9A8, 0x58C7, 0x01, 0x01 }
+ , { 0xF9AF, 0x58CA, 0x01, 0x01 }
+ , { 0xF9B9, 0x58CC, 0x01, 0x01 }
+ , { 0xF9BB, 0x59CF, 0x01, 0x01 }
+ , { 0xF9C9, 0x59D0, 0x01, 0x01 }
+ , { 0xF9CE, 0x59D1, 0x01, 0x01 }
+ , { 0xF9DC, 0x59D2, 0x01, 0x01 }
+ , { 0xF9DE, 0x59D4, 0x01, 0x01 }
+ , { 0xF9EA, 0x59D5, 0x01, 0x01 }
+ , { 0xF9F1, 0x59D7, 0x01, 0x01 }
+ , { 0xFAA4, 0x59D8, 0x01, 0x01 }
+ , { 0xFAB6, 0x59D9, 0x01, 0x01 }
+ , { 0xFAB8, 0x59E0, 0x01, 0x01 }
+ , { 0xFABD, 0x59E2, 0x01, 0x01 }
+ , { 0xFAC6, 0x59E3, 0x01, 0x01 }
+ , { 0xFACA, 0x59E5, 0x01, 0x01 }
+ , { 0xFACE, 0x59E6, 0x01, 0x01 }
+ , { 0xFACF, 0x59E8, 0x01, 0x01 }
+ , { 0xFAD1, 0x59F5, 0x01, 0x01 }
+ , { 0xFAD5, 0x59F6, 0x01, 0x01 }
+ , { 0xFAEA, 0x59F7, 0x01, 0x01 }
+ , { 0xFAEE, 0x59F8, 0x01, 0x01 }
+ , { 0xFAEF, 0x59F9, 0x01, 0x01 }
+ , { 0xFAFB, 0x59FC, 0x01, 0x01 }
+ , { 0xFBB1, 0x59FD, 0x01, 0x01 }
+ , { 0xFBBA, 0x5AA3, 0x01, 0x01 }
+ , { 0xFBE3, 0x5AA4, 0x01, 0x01 }
+ , { 0xFBE6, 0x5AA5, 0x01, 0x01 }
+ , { 0xFBEC, 0x5AA6, 0x01, 0x01 }
+ , { 0xFBEF, 0x5AAB, 0x01, 0x01 }
+ , { 0xFBF9, 0x5AAD, 0x01, 0x01 }
+ , { 0xFCA9, 0x5AAE, 0x01, 0x01 }
+ , { 0xFCAF, 0x5AAF, 0x01, 0x01 }
+ , { 0xFCC0, 0x5AB0, 0x01, 0x01 }
+ , { 0xFCC5, 0x5AB2, 0x01, 0x01 }
+ , { 0xFCDD, 0x5AB8, 0x01, 0x01 }
+ , { 0xFCF1, 0x5AB9, 0x01, 0x01 }
+ , { 0xFCF3, 0x5ABE, 0x01, 0x01 }
+ , { 0xFCF6, 0x5ABF, 0x01, 0x01 }
+ , { 0xFDA5, 0x5AC4, 0x01, 0x01 }
+ , { 0xFDB2, 0x5AC6, 0x01, 0x01 }
+ , { 0xFDBC, 0x5ACB, 0x01, 0x01 }
+ , { 0xFDBD, 0x5ACD, 0x01, 0x01 }
+ , { 0xFDC1, 0x5AD1, 0x01, 0x01 }
+ , { 0xFDC4, 0x5AD6, 0x01, 0x01 }
+ , { 0xFDCC, 0x5ADE, 0x01, 0x01 }
+ , { 0xFDD1, 0x5AE1, 0x01, 0x01 }
+ , { 0xFDD4, 0x5AE4, 0x01, 0x01 }
+ , { 0xFDD9, 0x5AE6, 0x01, 0x01 }
+ , { 0xFDDA, 0x5AE7, 0x01, 0x01 }
+ , { 0xFDDE, 0x5AEA, 0x01, 0x01 }
+ , { 0xFDE2, 0x5AEC, 0x01, 0x01 }
+ , { 0xFDE5, 0x5AED, 0x01, 0x01 }
+ , { 0xFDE9, 0x5AEF, 0x01, 0x01 }
+ , { 0xFDEA, 0x5AF1, 0x01, 0x01 }
+ , { 0xFDFE, 0x5AFA, 0x01, 0x01 }
+ , { 0xFDFF, 0xFDFF, 0x00, 0x00 }
+};
+static MAPTABLE NLSALLOC(0412) rgmaptable[] = {
+ { 0x1020, 0x0001, 0x0020, 0xA1A1, 0x0020, 0xA1A1 }
+ , { 0x1021, 0x005F, 0x0021, 0xA3A1, 0x0021, 0xA3A1 }
+ , { 0x2030, 0x000A, 0x0030, 0xA3B0, 0x0030, 0xA3B0 }
+ , { 0x6041, 0x001A, 0x0041, 0xA3C1, 0x0061, 0xA3E1 }
+};
+static TYPETABLE NLSALLOC(0412) rgtypetable[] = {
+ { 0x0000, 0x0020, 0x00, 0x00 }
+ , { 0x0009, 0x0068, 0x09, 0x00 }
+ , { 0x000A, 0x0028, 0x00, 0x00 }
+ , { 0x000E, 0x0020, 0x00, 0x00 }
+ , { 0x0020, 0x0048, 0x0A, 0x00 }
+ , { 0x0021, 0x0010, 0x0B, 0x08 }
+ , { 0x0024, 0x0010, 0x05, 0x08 }
+ , { 0x0026, 0x0010, 0x01, 0x08 }
+ , { 0x002B, 0x0010, 0x05, 0x08 }
+ , { 0x002C, 0x0010, 0x07, 0x08 }
+ , { 0x002D, 0x0010, 0x05, 0x08 }
+ , { 0x002E, 0x0010, 0x03, 0x08 }
+ , { 0x0030, 0x0084, 0x03, 0x00 }
+ , { 0x003A, 0x0010, 0x07, 0x08 }
+ , { 0x003B, 0x0010, 0x0B, 0x08 }
+ , { 0x0040, 0x0010, 0x01, 0x08 }
+ , { 0x0041, 0x0181, 0x01, 0x00 }
+ , { 0x0047, 0x0101, 0x01, 0x00 }
+ , { 0x005B, 0x0010, 0x0B, 0x08 }
+ , { 0x0061, 0x0182, 0x01, 0x00 }
+ , { 0x0067, 0x0102, 0x01, 0x00 }
+ , { 0x007B, 0x0010, 0x0B, 0x08 }
+ , { 0x007F, 0x0020, 0x00, 0x00 }
+ , { 0x0080, 0x0000, 0x0B, 0x08 }
+ , { 0xA1A1, 0x0048, 0x0A, 0x00 }
+ , { 0xA1A2, 0x0000, 0x0B, 0x08 }
+ , { 0xA3A1, 0x0010, 0x0B, 0x08 }
+ , { 0xA3A4, 0x0010, 0x05, 0x08 }
+ , { 0xA3A6, 0x0010, 0x01, 0x08 }
+ , { 0xA3AB, 0x0010, 0x05, 0x08 }
+ , { 0xA3AC, 0x0010, 0x07, 0x08 }
+ , { 0xA3AD, 0x0010, 0x05, 0x08 }
+ , { 0xA3AE, 0x0010, 0x03, 0x08 }
+ , { 0xA3B0, 0x0084, 0x03, 0x00 }
+ , { 0xA3BA, 0x0010, 0x07, 0x08 }
+ , { 0xA3BB, 0x0010, 0x0B, 0x08 }
+ , { 0xA3C0, 0x0010, 0x01, 0x08 }
+ , { 0xA3C1, 0x0181, 0x01, 0x00 }
+ , { 0xA3C7, 0x0101, 0x01, 0x00 }
+ , { 0xA3DB, 0x0010, 0x0B, 0x08 }
+ , { 0xA3E1, 0x0182, 0x01, 0x00 }
+ , { 0xA3E7, 0x0102, 0x01, 0x00 }
+ , { 0xA3FB, 0x0010, 0x0B, 0x08 }
+ , { 0xA4A1, 0x0100, 0x01, 0x00 }
+ , { 0xA5A1, 0x0000, 0x0B, 0x08 }
+ , { 0xB0A1, 0x0100, 0x01, 0x00 }
+};
+
+#else
+static unsigned char NLSALLOC(0412) rgsortweight[] = {
+ 0x00, 0x00, 0x00, 0x78, 0x00, 0x00
+ , 0x20, 0x00, 0x20, 0x10, 0x00, 0x02
+ , 0x30, 0x00, 0x30, 0x20, 0x00, 0x02
+ , 0x3A, 0x00, 0x3A, 0x10, 0x00, 0x02
+ , 0x41, 0x00, 0x41, 0x60, 0x00, 0x02
+ , 0x5B, 0x00, 0x5B, 0x10, 0x00, 0x02
+ , 0x61, 0x00, 0x41, 0x60, 0x02, 0x02
+ , 0x7B, 0x00, 0x7B, 0x10, 0x00, 0x02
+ , 0x7F, 0x00, 0x02, 0x70, 0x00, 0x00
+ , 0xA1, 0xA1, 0x20, 0x10, 0x01, 0x02
+ , 0xA2, 0xA1, 0xA2, 0x72, 0x01, 0x00
+ , 0xA1, 0xA3, 0x21, 0x10, 0x01, 0x02
+ , 0xB0, 0xA3, 0x30, 0x20, 0x01, 0x02
+ , 0xBA, 0xA3, 0x3A, 0x10, 0x01, 0x02
+ , 0xC1, 0xA3, 0x41, 0x60, 0x01, 0x02
+ , 0xDB, 0xA3, 0x5B, 0x10, 0x01, 0x02
+ , 0xE1, 0xA3, 0x41, 0x60, 0x03, 0x02
+ , 0xFB, 0xA3, 0x7B, 0x10, 0x01, 0x02
+ , 0xA1, 0xA4, 0x02, 0x30, 0x00, 0x00
+ , 0xA2, 0xA4, 0x02, 0x32, 0x00, 0x00
+ , 0xA3, 0xA4, 0x02, 0x35, 0x00, 0x00
+ , 0xA5, 0xA4, 0x02, 0x37, 0x00, 0x00
+ , 0xA8, 0xA4, 0x02, 0x39, 0x00, 0x00
+ , 0xA9, 0xA4, 0x02, 0x3B, 0x00, 0x00
+ , 0xAA, 0xA4, 0x02, 0x3E, 0x00, 0x00
+ , 0xB2, 0xA4, 0x02, 0x40, 0x00, 0x00
+ , 0xB3, 0xA4, 0x02, 0x42, 0x00, 0x00
+ , 0xB4, 0xA4, 0x02, 0x44, 0x00, 0x00
+ , 0xB6, 0xA4, 0x02, 0x47, 0x00, 0x00
+ , 0xB7, 0xA4, 0x02, 0x49, 0x00, 0x00
+ , 0xB8, 0xA4, 0x02, 0x4C, 0x00, 0x00
+ , 0xB9, 0xA4, 0x02, 0x4F, 0x00, 0x00
+ , 0xBA, 0xA4, 0x02, 0x50, 0x00, 0x00
+ , 0xBB, 0xA4, 0x02, 0x53, 0x00, 0x00
+ , 0xBC, 0xA4, 0x02, 0x55, 0x00, 0x00
+ , 0xBD, 0xA4, 0x02, 0x57, 0x00, 0x00
+ , 0xBE, 0xA4, 0x02, 0x59, 0x00, 0x00
+ , 0xBF, 0xA4, 0x02, 0x5C, 0x00, 0x00
+ , 0xA1, 0xA5, 0xA1, 0x73, 0x00, 0x00
+ , 0xA1, 0xB0, 0xA1, 0x30, 0x00, 0x00
+ , 0xEE, 0xB1, 0xEE, 0x32, 0x00, 0x00
+ , 0xAA, 0xB3, 0xAA, 0x35, 0x00, 0x00
+ , 0xD9, 0xB4, 0xD9, 0x37, 0x00, 0x00
+ , 0xFB, 0xB5, 0xFB, 0x39, 0x00, 0x00
+ , 0xF3, 0xB6, 0xF3, 0x3B, 0x00, 0x00
+ , 0xB6, 0xB8, 0xB6, 0x3E, 0x00, 0x00
+ , 0xD9, 0xB9, 0xD9, 0x40, 0x00, 0x00
+ , 0xFC, 0xBA, 0xFC, 0x42, 0x00, 0x00
+ , 0xE7, 0xBB, 0xE7, 0x44, 0x00, 0x00
+ , 0xCE, 0xBD, 0xCE, 0x47, 0x00, 0x00
+ , 0xC6, 0xBE, 0xC6, 0x49, 0x00, 0x00
+ , 0xDA, 0xC0, 0xDA, 0x4C, 0x00, 0x00
+ , 0xA5, 0xC2, 0xA5, 0x4F, 0x00, 0x00
+ , 0xF7, 0xC2, 0xF7, 0x50, 0x00, 0x00
+ , 0xAB, 0xC4, 0xAB, 0x53, 0x00, 0x00
+ , 0xB8, 0xC5, 0xB8, 0x55, 0x00, 0x00
+ , 0xC4, 0xC6, 0xC4, 0x57, 0x00, 0x00
+ , 0xCF, 0xC7, 0xCF, 0x59, 0x00, 0x00
+ , 0xA1, 0xCA, 0xA1, 0x30, 0x01, 0x01
+ , 0xBE, 0xCA, 0xA2, 0x30, 0x01, 0x01
+ , 0xC9, 0xCA, 0xA3, 0x30, 0x01, 0x01
+ , 0xE1, 0xCA, 0xA5, 0x30, 0x01, 0x01
+ , 0xEB, 0xCA, 0xA8, 0x30, 0x01, 0x01
+ , 0xA1, 0xCB, 0xA9, 0x30, 0x01, 0x01
+ , 0xA7, 0xCB, 0xAD, 0x30, 0x01, 0x01
+ , 0xBF, 0xCB, 0xB3, 0x30, 0x01, 0x01
+ , 0xD3, 0xCB, 0xB4, 0x30, 0x01, 0x01
+ , 0xD5, 0xCB, 0xBB, 0x30, 0x01, 0x01
+ , 0xD9, 0xCB, 0xBD, 0x30, 0x01, 0x01
+ , 0xDA, 0xCB, 0xC5, 0x30, 0x01, 0x01
+ , 0xEB, 0xCB, 0xC7, 0x30, 0x01, 0x01
+ , 0xF7, 0xCB, 0xC9, 0x30, 0x01, 0x01
+ , 0xFB, 0xCB, 0xCB, 0x30, 0x01, 0x01
+ , 0xA4, 0xCC, 0xCC, 0x30, 0x01, 0x01
+ , 0xA7, 0xCC, 0xD4, 0x30, 0x01, 0x01
+ , 0xAA, 0xCC, 0xDD, 0x30, 0x01, 0x01
+ , 0xB1, 0xCC, 0xDF, 0x30, 0x01, 0x01
+ , 0xBC, 0xCC, 0xE1, 0x30, 0x01, 0x01
+ , 0xC2, 0xCC, 0xE2, 0x30, 0x01, 0x01
+ , 0xC8, 0xCC, 0xE6, 0x30, 0x01, 0x01
+ , 0xF5, 0xCC, 0xE8, 0x30, 0x01, 0x01
+ , 0xAF, 0xCD, 0xED, 0x30, 0x01, 0x01
+ , 0xD6, 0xCD, 0xEE, 0x30, 0x01, 0x01
+ , 0xDD, 0xCD, 0xEF, 0x30, 0x01, 0x01
+ , 0xE7, 0xCD, 0xF1, 0x30, 0x01, 0x01
+ , 0xEA, 0xCD, 0xF8, 0x30, 0x01, 0x01
+ , 0xFA, 0xCD, 0xF9, 0x30, 0x01, 0x01
+ , 0xFB, 0xCD, 0xFA, 0x30, 0x01, 0x01
+ , 0xA9, 0xCE, 0xFB, 0x30, 0x01, 0x01
+ , 0xAD, 0xCE, 0xFC, 0x30, 0x01, 0x01
+ , 0xBE, 0xCE, 0xFD, 0x30, 0x01, 0x01
+ , 0xC2, 0xCE, 0xA4, 0x31, 0x01, 0x01
+ , 0xCF, 0xCE, 0xA5, 0x31, 0x01, 0x01
+ , 0xD2, 0xCE, 0xAB, 0x31, 0x01, 0x01
+ , 0xDB, 0xCE, 0xB2, 0x31, 0x01, 0x01
+ , 0xDF, 0xCE, 0xB3, 0x31, 0x01, 0x01
+ , 0xF8, 0xCE, 0xB8, 0x31, 0x01, 0x01
+ , 0xD0, 0xCF, 0xB9, 0x31, 0x01, 0x01
+ , 0xD6, 0xCF, 0xBA, 0x31, 0x01, 0x01
+ , 0xDC, 0xCF, 0xBC, 0x31, 0x01, 0x01
+ , 0xE0, 0xCF, 0xC3, 0x31, 0x01, 0x01
+ , 0xE6, 0xCF, 0xC7, 0x31, 0x01, 0x01
+ , 0xF0, 0xCF, 0xC8, 0x31, 0x01, 0x01
+ , 0xF5, 0xCF, 0xCB, 0x31, 0x01, 0x01
+ , 0xFB, 0xCF, 0xCD, 0x31, 0x01, 0x01
+ , 0xA3, 0xD0, 0xD4, 0x31, 0x01, 0x01
+ , 0xB2, 0xD0, 0xD5, 0x31, 0x01, 0x01
+ , 0xB9, 0xD0, 0xD6, 0x31, 0x01, 0x01
+ , 0xBA, 0xD0, 0xD8, 0x31, 0x01, 0x01
+ , 0xC1, 0xD0, 0xD9, 0x31, 0x01, 0x01
+ , 0xD0, 0xD0, 0xDB, 0x31, 0x01, 0x01
+ , 0xD1, 0xD0, 0xDD, 0x31, 0x01, 0x01
+ , 0xDF, 0xD0, 0xDE, 0x31, 0x01, 0x01
+ , 0xE6, 0xD0, 0xE0, 0x31, 0x01, 0x01
+ , 0xEA, 0xD0, 0xE2, 0x31, 0x01, 0x01
+ , 0xCC, 0xD1, 0xE4, 0x31, 0x01, 0x01
+ , 0xCD, 0xD1, 0xE6, 0x31, 0x01, 0x01
+ , 0xD1, 0xD1, 0xE8, 0x31, 0x01, 0x01
+ , 0xD2, 0xD1, 0xA3, 0x34, 0x01, 0x01
+ , 0xD3, 0xD1, 0xAA, 0x35, 0x01, 0x01
+ , 0xE2, 0xD1, 0xAB, 0x35, 0x01, 0x01
+ , 0xEA, 0xD1, 0xAD, 0x35, 0x01, 0x01
+ , 0xF3, 0xD1, 0xAF, 0x35, 0x01, 0x01
+ , 0xF5, 0xD1, 0xB2, 0x35, 0x01, 0x01
+ , 0xFE, 0xD1, 0xB3, 0x35, 0x01, 0x01
+ , 0xA5, 0xD2, 0xB6, 0x35, 0x01, 0x01
+ , 0xAC, 0xD2, 0xBB, 0x35, 0x01, 0x01
+ , 0xB2, 0xD2, 0xC3, 0x35, 0x01, 0x01
+ , 0xB3, 0xD2, 0xE0, 0x35, 0x01, 0x01
+ , 0xB4, 0xD2, 0xE2, 0x35, 0x01, 0x01
+ , 0xB7, 0xD2, 0xE4, 0x35, 0x01, 0x01
+ , 0xBB, 0xD2, 0xE7, 0x35, 0x01, 0x01
+ , 0xBD, 0xD2, 0xEB, 0x35, 0x01, 0x01
+ , 0xCF, 0xD2, 0xEC, 0x35, 0x01, 0x01
+ , 0xD5, 0xD2, 0xED, 0x35, 0x01, 0x01
+ , 0xD6, 0xD2, 0xF3, 0x35, 0x01, 0x01
+ , 0xDD, 0xD2, 0xFA, 0x35, 0x01, 0x01
+ , 0xE3, 0xD2, 0xA2, 0x36, 0x01, 0x01
+ , 0xE4, 0xD2, 0xA9, 0x36, 0x01, 0x01
+ , 0xEC, 0xD2, 0xAB, 0x36, 0x01, 0x01
+ , 0xED, 0xD2, 0xAD, 0x36, 0x01, 0x01
+ , 0xEE, 0xD2, 0xBA, 0x36, 0x01, 0x01
+ , 0xF0, 0xD2, 0xC1, 0x36, 0x01, 0x01
+ , 0xF2, 0xD2, 0xC6, 0x36, 0x01, 0x01
+ , 0xF3, 0xD2, 0xC9, 0x36, 0x01, 0x01
+ , 0xF9, 0xD2, 0xCF, 0x36, 0x01, 0x01
+ , 0xFB, 0xD2, 0xD0, 0x36, 0x01, 0x01
+ , 0xFD, 0xD2, 0xD9, 0x37, 0x01, 0x01
+ , 0xA1, 0xD3, 0xDC, 0x37, 0x01, 0x01
+ , 0xB5, 0xD3, 0xDE, 0x37, 0x01, 0x01
+ , 0xBA, 0xD3, 0xE3, 0x37, 0x01, 0x01
+ , 0xCB, 0xD3, 0xE4, 0x37, 0x01, 0x01
+ , 0xD0, 0xD3, 0xE7, 0x37, 0x01, 0x01
+ , 0xDB, 0xD3, 0xEB, 0x37, 0x01, 0x01
+ , 0xEB, 0xD3, 0xEC, 0x37, 0x01, 0x01
+ , 0xEC, 0xD3, 0xF6, 0x37, 0x01, 0x01
+ , 0xEE, 0xD3, 0xB5, 0x38, 0x01, 0x01
+ , 0xB8, 0xD4, 0xB6, 0x38, 0x01, 0x01
+ , 0xC2, 0xD4, 0xB7, 0x38, 0x01, 0x01
+ , 0xCC, 0xD4, 0xB9, 0x38, 0x01, 0x01
+ , 0xCE, 0xD4, 0xBF, 0x38, 0x01, 0x01
+ , 0xDF, 0xD4, 0xCE, 0x38, 0x01, 0x01
+ , 0xEA, 0xD4, 0xD0, 0x38, 0x01, 0x01
+ , 0xF0, 0xD4, 0xE6, 0x38, 0x01, 0x01
+ , 0xF1, 0xD4, 0xEE, 0x38, 0x01, 0x01
+ , 0xFA, 0xD4, 0xF3, 0x3B, 0x01, 0x01
+ , 0xA5, 0xD5, 0xF4, 0x3B, 0x01, 0x01
+ , 0xAE, 0xD5, 0xF5, 0x3B, 0x01, 0x01
+ , 0xB7, 0xD5, 0xF6, 0x3B, 0x01, 0x01
+ , 0xB9, 0xD5, 0xF7, 0x3B, 0x01, 0x01
+ , 0xC3, 0xD5, 0xF8, 0x3B, 0x01, 0x01
+ , 0xC6, 0xD5, 0xFB, 0x3B, 0x01, 0x01
+ , 0xCE, 0xD5, 0xA1, 0x3C, 0x01, 0x01
+ , 0xD2, 0xD5, 0xA9, 0x3C, 0x01, 0x01
+ , 0xD3, 0xD5, 0xAB, 0x3C, 0x01, 0x01
+ , 0xD5, 0xD5, 0xAE, 0x3C, 0x01, 0x01
+ , 0xE2, 0xD5, 0xC1, 0x3C, 0x01, 0x01
+ , 0xF4, 0xD5, 0xC2, 0x3C, 0x01, 0x01
+ , 0xFB, 0xD5, 0xC3, 0x3C, 0x01, 0x01
+ , 0xA9, 0xD6, 0xC4, 0x3C, 0x01, 0x01
+ , 0xAF, 0xD6, 0xC5, 0x3C, 0x01, 0x01
+ , 0xB4, 0xD6, 0xC6, 0x3C, 0x01, 0x01
+ , 0xB5, 0xD6, 0xC9, 0x3C, 0x01, 0x01
+ , 0xC7, 0xD6, 0xCA, 0x3C, 0x01, 0x01
+ , 0xCC, 0xD6, 0xCE, 0x3C, 0x01, 0x01
+ , 0xDE, 0xD6, 0xCF, 0x3C, 0x01, 0x01
+ , 0xE5, 0xD6, 0xD0, 0x3C, 0x01, 0x01
+ , 0xE6, 0xD6, 0xD5, 0x3C, 0x01, 0x01
+ , 0xED, 0xD6, 0xDA, 0x3C, 0x01, 0x01
+ , 0xF5, 0xD6, 0xE1, 0x3C, 0x01, 0x01
+ , 0xA3, 0xD7, 0xE6, 0x3C, 0x01, 0x01
+ , 0xA4, 0xD7, 0xE7, 0x3C, 0x01, 0x01
+ , 0xB1, 0xD7, 0xF9, 0x3C, 0x01, 0x01
+ , 0xBF, 0xD7, 0xFA, 0x3C, 0x01, 0x01
+ , 0xC2, 0xD7, 0xFB, 0x3C, 0x01, 0x01
+ , 0xC8, 0xD7, 0xFC, 0x3C, 0x01, 0x01
+ , 0xCC, 0xD7, 0xA2, 0x3D, 0x01, 0x01
+ , 0xCD, 0xD7, 0xA4, 0x3D, 0x01, 0x01
+ , 0xCF, 0xD7, 0xA7, 0x3D, 0x01, 0x01
+ , 0xD0, 0xD7, 0xAA, 0x3D, 0x01, 0x01
+ , 0xD6, 0xD7, 0xAE, 0x3D, 0x01, 0x01
+ , 0xF0, 0xD7, 0xB0, 0x3D, 0x01, 0x01
+ , 0xF9, 0xD7, 0xB2, 0x3D, 0x01, 0x01
+ , 0xFE, 0xD7, 0xB3, 0x3D, 0x01, 0x01
+ , 0xA4, 0xD8, 0xB6, 0x3E, 0x01, 0x01
+ , 0xAC, 0xD8, 0xB7, 0x3E, 0x01, 0x01
+ , 0xB2, 0xD8, 0xB8, 0x3E, 0x01, 0x01
+ , 0xC5, 0xD8, 0xBB, 0x3E, 0x01, 0x01
+ , 0xCC, 0xD8, 0xC1, 0x3E, 0x01, 0x01
+ , 0xD8, 0xD8, 0xC5, 0x3E, 0x01, 0x01
+ , 0xE6, 0xD8, 0xC6, 0x3E, 0x01, 0x01
+ , 0xEB, 0xD8, 0xCD, 0x3E, 0x01, 0x01
+ , 0xF1, 0xD8, 0xE8, 0x3E, 0x01, 0x01
+ , 0xF3, 0xD8, 0xE9, 0x3E, 0x01, 0x01
+ , 0xFE, 0xD8, 0xEA, 0x3E, 0x01, 0x01
+ , 0xA2, 0xD9, 0xED, 0x3E, 0x01, 0x01
+ , 0xB1, 0xD9, 0xEF, 0x3E, 0x01, 0x01
+ , 0xB2, 0xD9, 0xF0, 0x3E, 0x01, 0x01
+ , 0xCA, 0xD9, 0xF1, 0x3E, 0x01, 0x01
+ , 0xD1, 0xD9, 0xF4, 0x3E, 0x01, 0x01
+ , 0xD3, 0xD9, 0xF9, 0x3E, 0x01, 0x01
+ , 0xD6, 0xD9, 0xA6, 0x3F, 0x01, 0x01
+ , 0xE2, 0xD9, 0xAB, 0x3F, 0x01, 0x01
+ , 0xF8, 0xD9, 0xAC, 0x3F, 0x01, 0x01
+ , 0xFA, 0xD9, 0xAE, 0x3F, 0x01, 0x01
+ , 0xA8, 0xDA, 0xB0, 0x3F, 0x01, 0x01
+ , 0xAB, 0xDA, 0xCC, 0x3F, 0x01, 0x01
+ , 0xBE, 0xDA, 0xCE, 0x3F, 0x01, 0x01
+ , 0xCB, 0xDA, 0xD0, 0x3F, 0x01, 0x01
+ , 0xCE, 0xDA, 0xDA, 0x40, 0x01, 0x01
+ , 0xE1, 0xDA, 0xDD, 0x40, 0x01, 0x01
+ , 0xFA, 0xDA, 0xDF, 0x40, 0x01, 0x01
+ , 0xA7, 0xDB, 0xE6, 0x40, 0x01, 0x01
+ , 0xC3, 0xDB, 0xE8, 0x40, 0x01, 0x01
+ , 0xD7, 0xDB, 0xE9, 0x40, 0x01, 0x01
+ , 0xDF, 0xDB, 0xF8, 0x40, 0x01, 0x01
+ , 0xE9, 0xDB, 0xFA, 0x40, 0x01, 0x01
+ , 0xED, 0xDB, 0xFC, 0x40, 0x01, 0x01
+ , 0xF6, 0xDB, 0xFD, 0x40, 0x01, 0x01
+ , 0xF8, 0xDB, 0xAE, 0x41, 0x01, 0x01
+ , 0xA5, 0xDC, 0xAF, 0x41, 0x01, 0x01
+ , 0xAC, 0xDC, 0xB0, 0x41, 0x01, 0x01
+ , 0xB0, 0xDC, 0xB4, 0x41, 0x01, 0x01
+ , 0xC1, 0xDC, 0xB8, 0x41, 0x01, 0x01
+ , 0xD1, 0xDC, 0xB9, 0x41, 0x01, 0x01
+ , 0xE2, 0xDC, 0xBB, 0x41, 0x01, 0x01
+ , 0xE3, 0xDC, 0xBC, 0x41, 0x01, 0x01
+ , 0xE4, 0xDC, 0xC0, 0x41, 0x01, 0x01
+ , 0xF4, 0xDC, 0xCE, 0x41, 0x01, 0x01
+ , 0xC1, 0xDD, 0xCF, 0x41, 0x01, 0x01
+ , 0xC2, 0xDD, 0xD0, 0x41, 0x01, 0x01
+ , 0xD5, 0xDD, 0xD2, 0x41, 0x01, 0x01
+ , 0xDA, 0xDD, 0xD8, 0x41, 0x01, 0x01
+ , 0xE0, 0xDD, 0xF1, 0x41, 0x01, 0x01
+ , 0xAD, 0xDE, 0xF3, 0x41, 0x01, 0x01
+ , 0xBB, 0xDE, 0xF9, 0x41, 0x01, 0x01
+ , 0xBF, 0xDE, 0xE7, 0x44, 0x01, 0x01
+ , 0xFB, 0xDE, 0xE8, 0x44, 0x01, 0x01
+ , 0xA1, 0xDF, 0xEA, 0x44, 0x01, 0x01
+ , 0xAD, 0xDF, 0xEC, 0x44, 0x01, 0x01
+ , 0xB2, 0xDF, 0xEF, 0x44, 0x01, 0x01
+ , 0xBA, 0xDF, 0xF0, 0x44, 0x01, 0x01
+ , 0xBE, 0xDF, 0xF3, 0x44, 0x01, 0x01
+ , 0xDD, 0xDF, 0xF5, 0x44, 0x01, 0x01
+ , 0xE0, 0xDF, 0xF6, 0x44, 0x01, 0x01
+ , 0xE5, 0xDF, 0xFD, 0x44, 0x01, 0x01
+ , 0xEA, 0xDF, 0xAD, 0x45, 0x01, 0x01
+ , 0xAA, 0xE0, 0xAE, 0x45, 0x01, 0x01
+ , 0xB9, 0xE0, 0xB1, 0x45, 0x01, 0x01
+ , 0xD9, 0xE0, 0xB3, 0x45, 0x01, 0x01
+ , 0xE6, 0xE0, 0xB6, 0x45, 0x01, 0x01
+ , 0xEE, 0xE0, 0xB7, 0x45, 0x01, 0x01
+ , 0xF2, 0xE0, 0xBA, 0x45, 0x01, 0x01
+ , 0xA6, 0xE1, 0xBC, 0x45, 0x01, 0x01
+ , 0xAF, 0xE1, 0xD2, 0x45, 0x01, 0x01
+ , 0xD4, 0xE1, 0xD3, 0x45, 0x01, 0x01
+ , 0xDD, 0xE1, 0xD5, 0x45, 0x01, 0x01
+ , 0xE3, 0xE1, 0xD6, 0x45, 0x01, 0x01
+ , 0xE4, 0xE1, 0xDB, 0x45, 0x01, 0x01
+ , 0xEC, 0xE1, 0xE2, 0x45, 0x01, 0x01
+ , 0xF1, 0xE1, 0xE8, 0x45, 0x01, 0x01
+ , 0xF3, 0xE1, 0xF6, 0x45, 0x01, 0x01
+ , 0xD2, 0xE2, 0xF7, 0x45, 0x01, 0x01
+ , 0xDE, 0xE2, 0xF8, 0x45, 0x01, 0x01
+ , 0xF9, 0xE2, 0xFA, 0x45, 0x01, 0x01
+ , 0xFD, 0xE2, 0xFE, 0x45, 0x01, 0x01
+ , 0xA2, 0xE3, 0xBD, 0x46, 0x01, 0x01
+ , 0xA5, 0xE3, 0xC0, 0x46, 0x01, 0x01
+ , 0xAA, 0xE3, 0xC2, 0x46, 0x01, 0x01
+ , 0xB4, 0xE3, 0xC3, 0x46, 0x01, 0x01
+ , 0xD0, 0xE3, 0xC4, 0x46, 0x01, 0x01
+ , 0xDF, 0xE3, 0xC5, 0x46, 0x01, 0x01
+ , 0xF7, 0xE3, 0xC7, 0x46, 0x01, 0x01
+ , 0xFB, 0xE3, 0xC9, 0x46, 0x01, 0x01
+ , 0xA7, 0xE4, 0xCA, 0x46, 0x01, 0x01
+ , 0xAA, 0xE4, 0xD6, 0x47, 0x01, 0x01
+ , 0xAB, 0xE4, 0xBE, 0x48, 0x01, 0x01
+ , 0xAC, 0xE4, 0xC6, 0x49, 0x01, 0x01
+ , 0xBE, 0xE4, 0xC7, 0x49, 0x01, 0x01
+ , 0xCC, 0xE4, 0xC8, 0x49, 0x01, 0x01
+ , 0xD6, 0xE4, 0xCB, 0x49, 0x01, 0x01
+ , 0xDA, 0xE4, 0xCF, 0x49, 0x01, 0x01
+ , 0xE2, 0xE4, 0xD0, 0x49, 0x01, 0x01
+ , 0xE6, 0xE4, 0xD3, 0x49, 0x01, 0x01
+ , 0xED, 0xE4, 0xD6, 0x49, 0x01, 0x01
+ , 0xF8, 0xE4, 0xD7, 0x49, 0x01, 0x01
+ , 0xA1, 0xE5, 0xDE, 0x49, 0x01, 0x01
+ , 0xA5, 0xE5, 0xDF, 0x49, 0x01, 0x01
+ , 0xB0, 0xE5, 0xE0, 0x49, 0x01, 0x01
+ , 0xB9, 0xE5, 0xE7, 0x49, 0x01, 0x01
+ , 0xD8, 0xE5, 0xEE, 0x49, 0x01, 0x01
+ , 0xE2, 0xE5, 0xEF, 0x49, 0x01, 0x01
+ , 0xE7, 0xE5, 0xF0, 0x49, 0x01, 0x01
+ , 0xED, 0xE5, 0xF3, 0x49, 0x01, 0x01
+ , 0xEF, 0xE5, 0xF6, 0x49, 0x01, 0x01
+ , 0xF5, 0xE5, 0xF7, 0x49, 0x01, 0x01
+ , 0xF7, 0xE5, 0xA3, 0x4A, 0x01, 0x01
+ , 0xF8, 0xE5, 0xA9, 0x4A, 0x01, 0x01
+ , 0xB2, 0xE6, 0xAA, 0x4A, 0x01, 0x01
+ , 0xBF, 0xE6, 0xAC, 0x4A, 0x01, 0x01
+ , 0xEA, 0xE6, 0xAD, 0x4A, 0x01, 0x01
+ , 0xF4, 0xE6, 0xB0, 0x4A, 0x01, 0x01
+ , 0xA5, 0xE7, 0xB1, 0x4A, 0x01, 0x01
+ , 0xA9, 0xE7, 0xB5, 0x4A, 0x01, 0x01
+ , 0xD1, 0xE7, 0xB9, 0x4A, 0x01, 0x01
+ , 0xE9, 0xE7, 0xC0, 0x4A, 0x01, 0x01
+ , 0xA9, 0xE8, 0xC1, 0x4A, 0x01, 0x01
+ , 0xAE, 0xE8, 0xC2, 0x4A, 0x01, 0x01
+ , 0xB4, 0xE8, 0xC3, 0x4A, 0x01, 0x01
+ , 0xB5, 0xE8, 0xCB, 0x4A, 0x01, 0x01
+ , 0xBE, 0xE8, 0xCD, 0x4A, 0x01, 0x01
+ , 0xC6, 0xE8, 0xCF, 0x4A, 0x01, 0x01
+ , 0xD8, 0xE8, 0xD0, 0x4A, 0x01, 0x01
+ , 0xD9, 0xE8, 0xD5, 0x4A, 0x01, 0x01
+ , 0xDE, 0xE8, 0xD6, 0x4A, 0x01, 0x01
+ , 0xE2, 0xE8, 0xDC, 0x4A, 0x01, 0x01
+ , 0xE7, 0xE8, 0xE4, 0x4A, 0x01, 0x01
+ , 0xAF, 0xE9, 0xE5, 0x4A, 0x01, 0x01
+ , 0xB5, 0xE9, 0xEB, 0x4A, 0x01, 0x01
+ , 0xCD, 0xE9, 0xEC, 0x4A, 0x01, 0x01
+ , 0xED, 0xE9, 0xED, 0x4A, 0x01, 0x01
+ , 0xF6, 0xE9, 0xEE, 0x4A, 0x01, 0x01
+ , 0xA5, 0xEA, 0xEF, 0x4A, 0x01, 0x01
+ , 0xA8, 0xEA, 0xF5, 0x4A, 0x01, 0x01
+ , 0xAA, 0xEA, 0xF8, 0x4A, 0x01, 0x01
+ , 0xC5, 0xEA, 0xF9, 0x4A, 0x01, 0x01
+ , 0xC8, 0xEA, 0xA7, 0x4B, 0x01, 0x01
+ , 0xE1, 0xEA, 0xAF, 0x4B, 0x01, 0x01
+ , 0xBB, 0xEB, 0xB0, 0x4B, 0x01, 0x01
+ , 0xC2, 0xEB, 0xB1, 0x4B, 0x01, 0x01
+ , 0xCF, 0xEB, 0xB2, 0x4B, 0x01, 0x01
+ , 0xD4, 0xEB, 0xB6, 0x4B, 0x01, 0x01
+ , 0xD9, 0xEB, 0xBA, 0x4B, 0x01, 0x01
+ , 0xE0, 0xEB, 0xBB, 0x4B, 0x01, 0x01
+ , 0xE1, 0xEB, 0xBD, 0x4B, 0x01, 0x01
+ , 0xE7, 0xEB, 0xBE, 0x4B, 0x01, 0x01
+ , 0xEA, 0xEB, 0xC0, 0x4B, 0x01, 0x01
+ , 0xEE, 0xEB, 0xC7, 0x4B, 0x01, 0x01
+ , 0xA3, 0xEC, 0xCC, 0x4B, 0x01, 0x01
+ , 0xC9, 0xEC, 0xCD, 0x4B, 0x01, 0x01
+ , 0xD1, 0xEC, 0xCE, 0x4B, 0x01, 0x01
+ , 0xE9, 0xEC, 0xCF, 0x4B, 0x01, 0x01
+ , 0xF2, 0xEC, 0xD3, 0x4B, 0x01, 0x01
+ , 0xFD, 0xEC, 0xD4, 0x4B, 0x01, 0x01
+ , 0xA4, 0xED, 0xD7, 0x4B, 0x01, 0x01
+ , 0xA8, 0xED, 0xDA, 0x4C, 0x01, 0x01
+ , 0xC2, 0xED, 0xDB, 0x4C, 0x01, 0x01
+ , 0xCF, 0xED, 0xDC, 0x4C, 0x01, 0x01
+ , 0xD4, 0xED, 0xE1, 0x4C, 0x01, 0x01
+ , 0xDA, 0xED, 0xE2, 0x4C, 0x01, 0x01
+ , 0xDB, 0xED, 0xE5, 0x4C, 0x01, 0x01
+ , 0xA2, 0xEE, 0xE7, 0x4C, 0x01, 0x01
+ , 0xB3, 0xEE, 0xEF, 0x4C, 0x01, 0x01
+ , 0xB7, 0xEE, 0xFA, 0x4C, 0x01, 0x01
+ , 0xD3, 0xEE, 0xFB, 0x4C, 0x01, 0x01
+ , 0xEC, 0xEE, 0xFC, 0x4C, 0x01, 0x01
+ , 0xB7, 0xEF, 0xFD, 0x4C, 0x01, 0x01
+ , 0xBF, 0xEF, 0xA1, 0x4D, 0x01, 0x01
+ , 0xC8, 0xEF, 0xA2, 0x4D, 0x01, 0x01
+ , 0xCB, 0xEF, 0xA4, 0x4D, 0x01, 0x01
+ , 0xA4, 0xF0, 0xA6, 0x4D, 0x01, 0x01
+ , 0xBB, 0xF0, 0xB6, 0x4D, 0x01, 0x01
+ , 0xE9, 0xF0, 0xB7, 0x4D, 0x01, 0x01
+ , 0xED, 0xF0, 0xB8, 0x4D, 0x01, 0x01
+ , 0xEF, 0xF0, 0xB9, 0x4D, 0x01, 0x01
+ , 0xF2, 0xF0, 0xBE, 0x4D, 0x01, 0x01
+ , 0xA5, 0xF1, 0xC2, 0x4D, 0x01, 0x01
+ , 0xAA, 0xF1, 0xCB, 0x4D, 0x01, 0x01
+ , 0xAB, 0xF1, 0xD6, 0x4D, 0x01, 0x01
+ , 0xD3, 0xF1, 0xD7, 0x4D, 0x01, 0x01
+ , 0xD5, 0xF1, 0xD8, 0x4D, 0x01, 0x01
+ , 0xE8, 0xF1, 0xD9, 0x4D, 0x01, 0x01
+ , 0xE9, 0xF1, 0xDF, 0x4D, 0x01, 0x01
+ , 0xED, 0xF1, 0xEF, 0x4D, 0x01, 0x01
+ , 0xEE, 0xF1, 0xF1, 0x4D, 0x01, 0x01
+ , 0xEF, 0xF1, 0xF3, 0x4D, 0x01, 0x01
+ , 0xF2, 0xF1, 0xF5, 0x4D, 0x01, 0x01
+ , 0xFD, 0xF1, 0xF6, 0x4D, 0x01, 0x01
+ , 0xC1, 0xF2, 0xF7, 0x4D, 0x01, 0x01
+ , 0xC6, 0xF2, 0xF8, 0x4D, 0x01, 0x01
+ , 0xE9, 0xF2, 0xFA, 0x4D, 0x01, 0x01
+ , 0xF8, 0xF2, 0xFC, 0x4D, 0x01, 0x01
+ , 0xFA, 0xF2, 0xFD, 0x4D, 0x01, 0x01
+ , 0xA3, 0xF3, 0xA1, 0x4E, 0x01, 0x01
+ , 0xA6, 0xF3, 0xF7, 0x50, 0x01, 0x01
+ , 0xB5, 0xF3, 0xF8, 0x50, 0x01, 0x01
+ , 0xBC, 0xF3, 0xF9, 0x50, 0x01, 0x01
+ , 0xCB, 0xF3, 0xFB, 0x50, 0x01, 0x01
+ , 0xD0, 0xF3, 0xFC, 0x50, 0x01, 0x01
+ , 0xDA, 0xF3, 0xA2, 0x51, 0x01, 0x01
+ , 0xF0, 0xF3, 0xA4, 0x51, 0x01, 0x01
+ , 0xFC, 0xF3, 0xA5, 0x51, 0x01, 0x01
+ , 0xA2, 0xF4, 0xB3, 0x51, 0x01, 0x01
+ , 0xA6, 0xF4, 0xB4, 0x51, 0x01, 0x01
+ , 0xB5, 0xF4, 0xB5, 0x51, 0x01, 0x01
+ , 0xC8, 0xF4, 0xB6, 0x51, 0x01, 0x01
+ , 0xD2, 0xF4, 0xB7, 0x51, 0x01, 0x01
+ , 0xDC, 0xF4, 0xB8, 0x51, 0x01, 0x01
+ , 0xE6, 0xF4, 0xBB, 0x51, 0x01, 0x01
+ , 0xEE, 0xF4, 0xBC, 0x51, 0x01, 0x01
+ , 0xF8, 0xF4, 0xCA, 0x51, 0x01, 0x01
+ , 0xB5, 0xF5, 0xCB, 0x51, 0x01, 0x01
+ , 0xBB, 0xF5, 0xCC, 0x51, 0x01, 0x01
+ , 0xBF, 0xF5, 0xD1, 0x51, 0x01, 0x01
+ , 0xC9, 0xF5, 0xD4, 0x51, 0x01, 0x01
+ , 0xCA, 0xF5, 0xD6, 0x51, 0x01, 0x01
+ , 0xCD, 0xF5, 0xDF, 0x51, 0x01, 0x01
+ , 0xE4, 0xF5, 0xE0, 0x51, 0x01, 0x01
+ , 0xF0, 0xF5, 0xE1, 0x51, 0x01, 0x01
+ , 0xF3, 0xF5, 0xE2, 0x51, 0x01, 0x01
+ , 0xF6, 0xF5, 0xE6, 0x51, 0x01, 0x01
+ , 0xFC, 0xF5, 0xE9, 0x51, 0x01, 0x01
+ , 0xA2, 0xF6, 0xEB, 0x51, 0x01, 0x01
+ , 0xB0, 0xF6, 0xF8, 0x51, 0x01, 0x01
+ , 0xB5, 0xF6, 0xFE, 0x51, 0x01, 0x01
+ , 0xB6, 0xF6, 0xA1, 0x52, 0x01, 0x01
+ , 0xCE, 0xF6, 0xA2, 0x52, 0x01, 0x01
+ , 0xD1, 0xF6, 0xA3, 0x52, 0x01, 0x01
+ , 0xD2, 0xF6, 0xA5, 0x52, 0x01, 0x01
+ , 0xD5, 0xF6, 0xA7, 0x52, 0x01, 0x01
+ , 0xDE, 0xF6, 0xA8, 0x52, 0x01, 0x01
+ , 0xDF, 0xF6, 0xAA, 0x52, 0x01, 0x01
+ , 0xE1, 0xF6, 0xE8, 0x53, 0x01, 0x01
+ , 0xE2, 0xF6, 0xB8, 0x55, 0x01, 0x01
+ , 0xF0, 0xF6, 0xB9, 0x55, 0x01, 0x01
+ , 0xA2, 0xF7, 0xBA, 0x55, 0x01, 0x01
+ , 0xAC, 0xF7, 0xBB, 0x55, 0x01, 0x01
+ , 0xAE, 0xF7, 0xBD, 0x55, 0x01, 0x01
+ , 0xB2, 0xF7, 0xBE, 0x55, 0x01, 0x01
+ , 0xB5, 0xF7, 0xC1, 0x55, 0x01, 0x01
+ , 0xBA, 0xF7, 0xC2, 0x55, 0x01, 0x01
+ , 0xC8, 0xF7, 0xC3, 0x55, 0x01, 0x01
+ , 0xCB, 0xF7, 0xCA, 0x55, 0x01, 0x01
+ , 0xCC, 0xF7, 0xCD, 0x55, 0x01, 0x01
+ , 0xCD, 0xF7, 0xE4, 0x55, 0x01, 0x01
+ , 0xD1, 0xF7, 0xEB, 0x55, 0x01, 0x01
+ , 0xD8, 0xF7, 0xF0, 0x55, 0x01, 0x01
+ , 0xDE, 0xF7, 0xF5, 0x55, 0x01, 0x01
+ , 0xE4, 0xF7, 0xAF, 0x56, 0x01, 0x01
+ , 0xE6, 0xF7, 0xB4, 0x56, 0x01, 0x01
+ , 0xE7, 0xF7, 0xC4, 0x57, 0x01, 0x01
+ , 0xF7, 0xF7, 0xC7, 0x57, 0x01, 0x01
+ , 0xA2, 0xF8, 0xC8, 0x57, 0x01, 0x01
+ , 0xA5, 0xF8, 0xD0, 0x57, 0x01, 0x01
+ , 0xB0, 0xF8, 0xD8, 0x57, 0x01, 0x01
+ , 0xB4, 0xF8, 0xDA, 0x57, 0x01, 0x01
+ , 0xB5, 0xF8, 0xED, 0x57, 0x01, 0x01
+ , 0xBF, 0xF8, 0xEF, 0x57, 0x01, 0x01
+ , 0xC0, 0xF8, 0xF2, 0x57, 0x01, 0x01
+ , 0xC5, 0xF8, 0xF3, 0x57, 0x01, 0x01
+ , 0xCF, 0xF8, 0xF7, 0x57, 0x01, 0x01
+ , 0xEB, 0xF8, 0xF8, 0x57, 0x01, 0x01
+ , 0xF1, 0xF8, 0xA5, 0x58, 0x01, 0x01
+ , 0xA1, 0xF9, 0xB0, 0x58, 0x01, 0x01
+ , 0xA3, 0xF9, 0xB3, 0x58, 0x01, 0x01
+ , 0xA8, 0xF9, 0xC7, 0x58, 0x01, 0x01
+ , 0xAF, 0xF9, 0xCA, 0x58, 0x01, 0x01
+ , 0xB9, 0xF9, 0xCC, 0x58, 0x01, 0x01
+ , 0xBB, 0xF9, 0xCF, 0x59, 0x01, 0x01
+ , 0xC9, 0xF9, 0xD0, 0x59, 0x01, 0x01
+ , 0xCE, 0xF9, 0xD1, 0x59, 0x01, 0x01
+ , 0xDC, 0xF9, 0xD2, 0x59, 0x01, 0x01
+ , 0xDE, 0xF9, 0xD4, 0x59, 0x01, 0x01
+ , 0xEA, 0xF9, 0xD5, 0x59, 0x01, 0x01
+ , 0xF1, 0xF9, 0xD7, 0x59, 0x01, 0x01
+ , 0xA4, 0xFA, 0xD8, 0x59, 0x01, 0x01
+ , 0xB6, 0xFA, 0xD9, 0x59, 0x01, 0x01
+ , 0xB8, 0xFA, 0xE0, 0x59, 0x01, 0x01
+ , 0xBD, 0xFA, 0xE2, 0x59, 0x01, 0x01
+ , 0xC6, 0xFA, 0xE3, 0x59, 0x01, 0x01
+ , 0xCA, 0xFA, 0xE5, 0x59, 0x01, 0x01
+ , 0xCE, 0xFA, 0xE6, 0x59, 0x01, 0x01
+ , 0xCF, 0xFA, 0xE8, 0x59, 0x01, 0x01
+ , 0xD1, 0xFA, 0xF5, 0x59, 0x01, 0x01
+ , 0xD5, 0xFA, 0xF6, 0x59, 0x01, 0x01
+ , 0xEA, 0xFA, 0xF7, 0x59, 0x01, 0x01
+ , 0xEE, 0xFA, 0xF8, 0x59, 0x01, 0x01
+ , 0xEF, 0xFA, 0xF9, 0x59, 0x01, 0x01
+ , 0xFB, 0xFA, 0xFC, 0x59, 0x01, 0x01
+ , 0xB1, 0xFB, 0xFD, 0x59, 0x01, 0x01
+ , 0xBA, 0xFB, 0xA3, 0x5A, 0x01, 0x01
+ , 0xE3, 0xFB, 0xA4, 0x5A, 0x01, 0x01
+ , 0xE6, 0xFB, 0xA5, 0x5A, 0x01, 0x01
+ , 0xEC, 0xFB, 0xA6, 0x5A, 0x01, 0x01
+ , 0xEF, 0xFB, 0xAB, 0x5A, 0x01, 0x01
+ , 0xF9, 0xFB, 0xAD, 0x5A, 0x01, 0x01
+ , 0xA9, 0xFC, 0xAE, 0x5A, 0x01, 0x01
+ , 0xAF, 0xFC, 0xAF, 0x5A, 0x01, 0x01
+ , 0xC0, 0xFC, 0xB0, 0x5A, 0x01, 0x01
+ , 0xC5, 0xFC, 0xB2, 0x5A, 0x01, 0x01
+ , 0xDD, 0xFC, 0xB8, 0x5A, 0x01, 0x01
+ , 0xF1, 0xFC, 0xB9, 0x5A, 0x01, 0x01
+ , 0xF3, 0xFC, 0xBE, 0x5A, 0x01, 0x01
+ , 0xF6, 0xFC, 0xBF, 0x5A, 0x01, 0x01
+ , 0xA5, 0xFD, 0xC4, 0x5A, 0x01, 0x01
+ , 0xB2, 0xFD, 0xC6, 0x5A, 0x01, 0x01
+ , 0xBC, 0xFD, 0xCB, 0x5A, 0x01, 0x01
+ , 0xBD, 0xFD, 0xCD, 0x5A, 0x01, 0x01
+ , 0xC1, 0xFD, 0xD1, 0x5A, 0x01, 0x01
+ , 0xC4, 0xFD, 0xD6, 0x5A, 0x01, 0x01
+ , 0xCC, 0xFD, 0xDE, 0x5A, 0x01, 0x01
+ , 0xD1, 0xFD, 0xE1, 0x5A, 0x01, 0x01
+ , 0xD4, 0xFD, 0xE4, 0x5A, 0x01, 0x01
+ , 0xD9, 0xFD, 0xE6, 0x5A, 0x01, 0x01
+ , 0xDA, 0xFD, 0xE7, 0x5A, 0x01, 0x01
+ , 0xDE, 0xFD, 0xEA, 0x5A, 0x01, 0x01
+ , 0xE2, 0xFD, 0xEC, 0x5A, 0x01, 0x01
+ , 0xE5, 0xFD, 0xED, 0x5A, 0x01, 0x01
+ , 0xE9, 0xFD, 0xEF, 0x5A, 0x01, 0x01
+ , 0xEA, 0xFD, 0xF1, 0x5A, 0x01, 0x01
+ , 0xFE, 0xFD, 0xFA, 0x5A, 0x01, 0x01
+ , 0xFF, 0xFD, 0xFF, 0xFD, 0x00, 0x00
+};
+
+static unsigned char NLSALLOC(0412) rgmaptable[] = {
+ 0x20, 0x10, 0x01, 0x00, 0x20, 0x00
+ , 0xA1, 0xA1, 0x20, 0x00, 0xA1, 0xA1
+ , 0x21, 0x10, 0x5F, 0x00, 0x21, 0x00
+ , 0xA1, 0xA3, 0x21, 0x00, 0xA1, 0xA3
+ , 0x30, 0x20, 0x0A, 0x00, 0x30, 0x00
+ , 0xB0, 0xA3, 0x30, 0x00, 0xB0, 0xA3
+ , 0x41, 0x60, 0x1A, 0x00, 0x41, 0x00
+ , 0xC1, 0xA3, 0x61, 0x00, 0xE1, 0xA3
+};
+
+static unsigned char NLSALLOC(0412) rgtypetable[] = {
+ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00
+ , 0x09, 0x00, 0x68, 0x00, 0x09, 0x00
+ , 0x0A, 0x00, 0x28, 0x00, 0x00, 0x00
+ , 0x0E, 0x00, 0x20, 0x00, 0x00, 0x00
+ , 0x20, 0x00, 0x48, 0x00, 0x0A, 0x00
+ , 0x21, 0x00, 0x10, 0x00, 0x0B, 0x08
+ , 0x24, 0x00, 0x10, 0x00, 0x05, 0x08
+ , 0x26, 0x00, 0x10, 0x00, 0x01, 0x08
+ , 0x2B, 0x00, 0x10, 0x00, 0x05, 0x08
+ , 0x2C, 0x00, 0x10, 0x00, 0x07, 0x08
+ , 0x2D, 0x00, 0x10, 0x00, 0x05, 0x08
+ , 0x2E, 0x00, 0x10, 0x00, 0x03, 0x08
+ , 0x30, 0x00, 0x84, 0x00, 0x03, 0x00
+ , 0x3A, 0x00, 0x10, 0x00, 0x07, 0x08
+ , 0x3B, 0x00, 0x10, 0x00, 0x0B, 0x08
+ , 0x40, 0x00, 0x10, 0x00, 0x01, 0x08
+ , 0x41, 0x00, 0x81, 0x01, 0x01, 0x00
+ , 0x47, 0x00, 0x01, 0x01, 0x01, 0x00
+ , 0x5B, 0x00, 0x10, 0x00, 0x0B, 0x08
+ , 0x61, 0x00, 0x82, 0x01, 0x01, 0x00
+ , 0x67, 0x00, 0x02, 0x01, 0x01, 0x00
+ , 0x7B, 0x00, 0x10, 0x00, 0x0B, 0x08
+ , 0x7F, 0x00, 0x20, 0x00, 0x00, 0x00
+ , 0x80, 0x00, 0x00, 0x00, 0x0B, 0x08
+ , 0xA1, 0xA1, 0x48, 0x00, 0x0A, 0x00
+ , 0xA2, 0xA1, 0x00, 0x00, 0x0B, 0x08
+ , 0xA1, 0xA3, 0x10, 0x00, 0x0B, 0x08
+ , 0xA4, 0xA3, 0x10, 0x00, 0x05, 0x08
+ , 0xA6, 0xA3, 0x10, 0x00, 0x01, 0x08
+ , 0xAB, 0xA3, 0x10, 0x00, 0x05, 0x08
+ , 0xAC, 0xA3, 0x10, 0x00, 0x07, 0x08
+ , 0xAD, 0xA3, 0x10, 0x00, 0x05, 0x08
+ , 0xAE, 0xA3, 0x10, 0x00, 0x03, 0x08
+ , 0xB0, 0xA3, 0x84, 0x00, 0x03, 0x00
+ , 0xBA, 0xA3, 0x10, 0x00, 0x07, 0x08
+ , 0xBB, 0xA3, 0x10, 0x00, 0x0B, 0x08
+ , 0xC0, 0xA3, 0x10, 0x00, 0x01, 0x08
+ , 0xC1, 0xA3, 0x81, 0x01, 0x01, 0x00
+ , 0xC7, 0xA3, 0x01, 0x01, 0x01, 0x00
+ , 0xDB, 0xA3, 0x10, 0x00, 0x0B, 0x08
+ , 0xE1, 0xA3, 0x82, 0x01, 0x01, 0x00
+ , 0xE7, 0xA3, 0x02, 0x01, 0x01, 0x00
+ , 0xFB, 0xA3, 0x10, 0x00, 0x0B, 0x08
+ , 0xA1, 0xA4, 0x00, 0x01, 0x01, 0x00
+ , 0xA1, 0xA5, 0x00, 0x00, 0x0B, 0x08
+ , 0xA1, 0xB0, 0x00, 0x01, 0x01, 0x00
+};
+#endif
+
+static unsigned char NLSALLOC(0412) rgbSENGCOUNTRY[] = {
+ 'K', 'o', 'r', 'e', 'a'
+};
+
+static unsigned char NLSALLOC(0412) rgbSENGLANGUAGE[] = {
+ 'K', 'o', 'r', 'e', 'a', 'n'
+};
+
+#if defined(VBA2) //hand-edited this locale info based on daytona [bassam]
+static BYTE NLSALLOC(0412) rgbIFIRSTDAYOFWEEK[] = { /* "6" */
+ 0x36
+};
+
+static BYTE NLSALLOC(0412) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0412) rgbIDEFAULTANSICODEPAGE[] = { /* "949" */
+ 0x39, 0x34, 0x39
+};
+
+static BYTE NLSALLOC(0412) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0412) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0412) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0412) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0412) rgbIOPTIONALCALENDAR[] = { /* "2" */
+ 0x32
+};
+#endif
+
+
+static unsigned char NLSALLOC(0412) rgbILANGUAGE[] = {
+ '0', '4', '1', '2'
+};
+
+static unsigned char NLSALLOC(0412) rgbSLANGUAGE[] = {
+ 0xc7, 0xd1, 0xb1, 0xb9, 0xbe, 0xee, '(', 'K', 'o', 'r', 'e', 'a', 'n', ')'
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVLANGNAME[] = {
+ 'K', 'O', 'R'
+};
+
+static unsigned char NLSALLOC(0412) rgbSNATIVELANGNAME[] = {
+ 0xc7, 0xd1, 0xb1, 0xb9, 0xbe, 0xee
+};
+
+static unsigned char NLSALLOC(0412) rgbICOUNTRY[] = {
+ '8', '2'
+};
+
+static unsigned char NLSALLOC(0412) rgbSCOUNTRY[] = {
+ 0xb4, 0xeb, 0xc7, 0xd1, 0xb9, 0xce, 0xb1, 0xb9, '(', 'K', 'o', 'r', 'e', 'a', ')'
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVCTRYNAME[] = {
+ 'K', 'O', 'R'
+};
+
+static unsigned char NLSALLOC(0412) rgbSNATIVECTRYNAME[] = {
+ 0xb4, 0xeb, 0xc7, 0xd1, 0xb9, 0xce, 0xb1, 0xb9
+};
+
+static unsigned char NLSALLOC(0412) rgbIDEFAULTLANGUAGE[] = {
+ '0', '4', '1', '2'
+};
+
+static unsigned char NLSALLOC(0412) rgbIDEFAULTCOUNTRY[] = {
+ '8', '2'
+};
+
+static unsigned char NLSALLOC(0412) rgbIDEFAULTCODEPAGE[] = {
+ '9', '4', '9'
+};
+
+static unsigned char NLSALLOC(0412) rgbSLIST[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0412) rgbIMEASURE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0412) rgbSDECIMAL[] = {
+ '.'
+};
+
+static unsigned char NLSALLOC(0412) rgbSTHOUSAND[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0412) rgbSGROUPING[] = {
+ '3', ';', '0'
+};
+
+static unsigned char NLSALLOC(0412) rgbIDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0412) rgbILZERO[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0412) rgbSNATIVEDIGITS[] = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
+};
+
+static unsigned char NLSALLOC(0412) rgbSCURRENCY[] = {
+ 0x5c
+};
+
+static unsigned char NLSALLOC(0412) rgbSINTLSYMBOL[] = {
+ 'K', 'R', 'W'
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONDECIMALSEP[] = {
+ '.'
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHOUSANDSEP[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONGROUPING[] = {
+ '3', ';', '0'
+};
+
+static unsigned char NLSALLOC(0412) rgbICURRDIGITS[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0412) rgbIINTLCURRDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0412) rgbICURRENCY[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0412) rgbINEGCURR[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0412) rgbSDATE[] = {
+ '-'
+};
+
+static unsigned char NLSALLOC(0412) rgbSTIME[] = {
+ ':'
+};
+
+static unsigned char NLSALLOC(0412) rgbSSHORTDATE[] = {
+ 'y', 'y', '-', 'M', 'M', '-', 'd', 'd'
+};
+
+static unsigned char NLSALLOC(0412) rgbSLONGDATE[] = {
+ 'y', 'y', 'y', 'y',
+ 0xb3, 0xe2,
+ ' ', 'M',
+ 0xbf, 0xf9,
+ ' ', 'd',
+ 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbIDATE[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0412) rgbILDATE[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0412) rgbITIME[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0412) rgbICENTURY[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0412) rgbITLZERO[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0412) rgbIDAYLZERO[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0412) rgbIMONLZERO[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0412) rgbS1159[] = {
+ 0xbf, 0xc0, 0xc0, 0xfc
+};
+
+static unsigned char NLSALLOC(0412) rgbS2359[] = {
+ 0xbf, 0xc0, 0xc8, 0xc4
+};
+
+static unsigned char NLSALLOC(0412) rgbSDAYNAME1[] = {
+ 0xbf, 0xf9, 0xbf, 0xe4, 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbSDAYNAME2[] = {
+ 0xc8, 0xad, 0xbf, 0xe4, 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbSDAYNAME3[] = {
+ 0xbc, 0xf6, 0xbf, 0xe4, 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbSDAYNAME4[] = {
+ 0xb8, 0xf1, 0xbf, 0xe4, 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbSDAYNAME5[] = {
+ 0xb1, 0xdd, 0xbf, 0xe4, 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbSDAYNAME6[] = {
+ 0xc5, 0xe4, 0xbf, 0xe4, 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbSDAYNAME7[] = {
+ 0xc0, 0xcf, 0xbf, 0xe4, 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVDAYNAME1[] = {
+ 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVDAYNAME2[] = {
+ 0xc8, 0xad
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVDAYNAME3[] = {
+ 0xbc, 0xf6
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVDAYNAME4[] = {
+ 0xb8, 0xf1
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVDAYNAME5[] = {
+ 0xb1, 0xdd
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVDAYNAME6[] = {
+ 0xc5, 0xe4
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVDAYNAME7[] = {
+ 0xc0, 0xcf
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME1[] = {
+ 0x31, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME2[] = {
+ 0x32, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME3[] = {
+ 0x33, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME4[] = {
+ 0x34, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME5[] = {
+ 0x35, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME6[] = {
+ 0x36, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME7[] = {
+ 0x37, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME8[] = {
+ 0x38, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME9[] = {
+ 0x39, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME10[] = {
+ 0x31, 0x30, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME11[] = {
+ 0x31, 0x31, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSMONTHNAME12[] = {
+ 0x31, 0x32, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME1[] = {
+ 0x31, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME2[] = {
+ 0x32, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME3[] = {
+ 0x33, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME4[] = {
+ 0x34, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME5[] = {
+ 0x35, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME6[] = {
+ 0x36, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME7[] = {
+ 0x37, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME8[] = {
+ 0x38, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME9[] = {
+ 0x39, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME10[] = {
+ 0x31, 0x30, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME11[] = {
+ 0x31, 0x31, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSABBREVMONTHNAME12[] = {
+ 0x31, 0x32, 0xbf, 0xf9
+};
+
+static unsigned char NLSALLOC(0412) rgbSNEGATIVESIGN[] = {
+ '-'
+};
+
+static unsigned char NLSALLOC(0412) rgbIPOSSIGNPOSN[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0412) rgbINEGSIGNPOSN[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0412) rgbIPOSSYMPRECEDES[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0412) rgbIPOSSEPBYSPACE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0412) rgbINEGSYMPRECEDES[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0412) rgbINEGSEPBYSPACE[] = {
+ '0'
+};
+
+#define LCINFODAT(X) { DIM(X), (X) }
+LCINFO NLSALLOC(0412) g_rglcinfo0412[] = {
+ { 0, NULL}
+ , LCINFODAT(rgbILANGUAGE)
+ , LCINFODAT(rgbSLANGUAGE)
+ , LCINFODAT(rgbSABBREVLANGNAME)
+ , LCINFODAT(rgbSNATIVELANGNAME)
+ , LCINFODAT(rgbICOUNTRY)
+ , LCINFODAT(rgbSCOUNTRY)
+ , LCINFODAT(rgbSABBREVCTRYNAME)
+ , LCINFODAT(rgbSNATIVECTRYNAME)
+ , LCINFODAT(rgbIDEFAULTLANGUAGE)
+ , LCINFODAT(rgbIDEFAULTCOUNTRY)
+ , LCINFODAT(rgbIDEFAULTCODEPAGE)
+ , LCINFODAT(rgbSLIST)
+ , LCINFODAT(rgbIMEASURE)
+ , LCINFODAT(rgbSDECIMAL)
+ , LCINFODAT(rgbSTHOUSAND)
+ , LCINFODAT(rgbSGROUPING)
+ , LCINFODAT(rgbIDIGITS)
+ , LCINFODAT(rgbILZERO)
+ , LCINFODAT(rgbSNATIVEDIGITS)
+ , LCINFODAT(rgbSCURRENCY)
+ , LCINFODAT(rgbSINTLSYMBOL)
+ , LCINFODAT(rgbSMONDECIMALSEP)
+ , LCINFODAT(rgbSMONTHOUSANDSEP)
+ , LCINFODAT(rgbSMONGROUPING)
+ , LCINFODAT(rgbICURRDIGITS)
+ , LCINFODAT(rgbIINTLCURRDIGITS)
+ , LCINFODAT(rgbICURRENCY)
+ , LCINFODAT(rgbINEGCURR)
+ , LCINFODAT(rgbSDATE)
+ , LCINFODAT(rgbSTIME)
+ , LCINFODAT(rgbSSHORTDATE)
+ , LCINFODAT(rgbSLONGDATE)
+ , LCINFODAT(rgbIDATE)
+ , LCINFODAT(rgbILDATE)
+ , LCINFODAT(rgbITIME)
+ , LCINFODAT(rgbICENTURY)
+ , LCINFODAT(rgbITLZERO)
+ , LCINFODAT(rgbIDAYLZERO)
+ , LCINFODAT(rgbIMONLZERO)
+ , LCINFODAT(rgbS1159)
+ , LCINFODAT(rgbS2359)
+ , LCINFODAT(rgbSDAYNAME1)
+ , LCINFODAT(rgbSDAYNAME2)
+ , LCINFODAT(rgbSDAYNAME3)
+ , LCINFODAT(rgbSDAYNAME4)
+ , LCINFODAT(rgbSDAYNAME5)
+ , LCINFODAT(rgbSDAYNAME6)
+ , LCINFODAT(rgbSDAYNAME7)
+ , LCINFODAT(rgbSABBREVDAYNAME1)
+ , LCINFODAT(rgbSABBREVDAYNAME2)
+ , LCINFODAT(rgbSABBREVDAYNAME3)
+ , LCINFODAT(rgbSABBREVDAYNAME4)
+ , LCINFODAT(rgbSABBREVDAYNAME5)
+ , LCINFODAT(rgbSABBREVDAYNAME6)
+ , LCINFODAT(rgbSABBREVDAYNAME7)
+ , LCINFODAT(rgbSMONTHNAME1)
+ , LCINFODAT(rgbSMONTHNAME2)
+ , LCINFODAT(rgbSMONTHNAME3)
+ , LCINFODAT(rgbSMONTHNAME4)
+ , LCINFODAT(rgbSMONTHNAME5)
+ , LCINFODAT(rgbSMONTHNAME6)
+ , LCINFODAT(rgbSMONTHNAME7)
+ , LCINFODAT(rgbSMONTHNAME8)
+ , LCINFODAT(rgbSMONTHNAME9)
+ , LCINFODAT(rgbSMONTHNAME10)
+ , LCINFODAT(rgbSMONTHNAME11)
+ , LCINFODAT(rgbSMONTHNAME12)
+ , LCINFODAT(rgbSABBREVMONTHNAME1)
+ , LCINFODAT(rgbSABBREVMONTHNAME2)
+ , LCINFODAT(rgbSABBREVMONTHNAME3)
+ , LCINFODAT(rgbSABBREVMONTHNAME4)
+ , LCINFODAT(rgbSABBREVMONTHNAME5)
+ , LCINFODAT(rgbSABBREVMONTHNAME6)
+ , LCINFODAT(rgbSABBREVMONTHNAME7)
+ , LCINFODAT(rgbSABBREVMONTHNAME8)
+ , LCINFODAT(rgbSABBREVMONTHNAME9)
+ , LCINFODAT(rgbSABBREVMONTHNAME10)
+ , LCINFODAT(rgbSABBREVMONTHNAME11)
+ , LCINFODAT(rgbSABBREVMONTHNAME12)
+ , { 0, NULL }
+ , LCINFODAT(rgbSNEGATIVESIGN)
+ , LCINFODAT(rgbIPOSSIGNPOSN)
+ , LCINFODAT(rgbINEGSIGNPOSN)
+ , LCINFODAT(rgbIPOSSYMPRECEDES)
+ , LCINFODAT(rgbIPOSSEPBYSPACE)
+ , LCINFODAT(rgbINEGSYMPRECEDES)
+ , LCINFODAT(rgbINEGSEPBYSPACE)
+ , LCINFODAT(rgbSENGCOUNTRY)
+ , LCINFODAT(rgbSENGLANGUAGE)
+#if defined(VBA2)
+ , LCINFODAT(rgbIFIRSTDAYOFWEEK)
+ , LCINFODAT(rgbIFIRSTWEEKOFYEAR)
+ , LCINFODAT(rgbIDEFAULTANSICODEPAGE)
+ , LCINFODAT(rgbINEGNUMBER)
+ , LCINFODAT(rgbSTIMEFORMAT)
+ , LCINFODAT(rgbITIMEMARKPOSN)
+ , LCINFODAT(rgbICALENDARTYPE)
+ , LCINFODAT(rgbIOPTIONALCALENDAR)
+ , { 0, NULL }
+ , { 0, NULL }
+#endif
+};
+#undef LCINFODAT
+
+
+#if 1
+STRINFO_KTP NLSALLOC(0412) g_strinfo0412 = {
+ rgsortweight
+ , rgmaptable
+ , rgtypetable
+ , DIM(rgsortweight)
+ , DIM(rgmaptable)
+ , DIM(rgtypetable)
+};
+#else
+STRINFO_KTP NLSALLOC(0412) g_strinfo0412 = {
+ (SORTWEIGHT FAR*) rgsortweight
+ , (MAPTABLE FAR*) rgmaptable
+ , (TYPETABLE FAR*) rgtypetable
+ , DIM(rgsortweight)
+ , DIM(rgmaptable)
+ , DIM(rgtypetable)
+};
+#endif
diff --git a/private/oleauto/src/dispatch/win16/0413.c b/private/oleauto/src/dispatch/win16/0413.c
new file mode 100644
index 000000000..6ea67bf2d
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0413.c
@@ -0,0 +1,526 @@
+/****************************************************************************
+* 0413.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Dutch - Netherlands
+*
+* LCID = 0x0413
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:37:03 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0413) rgbILANGUAGE[] = { /* "0413" */
+ 0x30, 0x34, 0x31, 0x33
+};
+
+static BYTE NLSALLOC(0413) rgbSLANGUAGE[] = { /* "Dutch" */
+ 0x44, 0x75, 0x74, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVLANGNAME[] = { /* "NLD" */
+ 0x4e, 0x4c, 0x44
+};
+
+static BYTE NLSALLOC(0413) rgbSNATIVELANGNAME[] = { /* "Nederlands" */
+ 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e
+ , 0x64, 0x73
+};
+
+static BYTE NLSALLOC(0413) rgbICOUNTRY[] = { /* "31" */
+ 0x33, 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbSCOUNTRY[] = { /* "Netherlands" */
+ 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61
+ , 0x6e, 0x64, 0x73
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVCTRYNAME[] = { /* "NLD" */
+ 0x4e, 0x4c, 0x44
+};
+
+static BYTE NLSALLOC(0413) rgbSNATIVECTRYNAME[] = { /* "Nederland" */
+ 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e
+ , 0x64
+};
+
+static BYTE NLSALLOC(0413) rgbIDEFAULTLANGUAGE[] = { /* "0413" */
+ 0x30, 0x34, 0x31, 0x33
+};
+
+static BYTE NLSALLOC(0413) rgbIDEFAULTCOUNTRY[] = { /* "31" */
+ 0x33, 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0413) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0413) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0413) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0413) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0413) rgbSCURRENCY[] = { /* "F" */
+ 0x46
+};
+
+static BYTE NLSALLOC(0413) rgbSINTLSYMBOL[] = { /* "NLG" */
+ 0x4e, 0x4c, 0x47
+};
+
+static BYTE NLSALLOC(0413) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0413) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0413) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0413) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0413) rgbINEGCURR[] = { /* "11" */
+ 0x31, 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbSDATE[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0413) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0413) rgbSSHORTDATE[] = { /* "d-MM-yy" */
+ 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0413) rgbSLONGDATE[] = { /* "dddd d MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d
+ , 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0413) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbSDAYNAME1[] = { /* "maandag" */
+ 0x6d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0413) rgbSDAYNAME2[] = { /* "dinsdag" */
+ 0x64, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0413) rgbSDAYNAME3[] = { /* "woensdag" */
+ 0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0413) rgbSDAYNAME4[] = { /* "donderdag" */
+ 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61
+ , 0x67
+};
+
+static BYTE NLSALLOC(0413) rgbSDAYNAME5[] = { /* "vrijdag" */
+ 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0413) rgbSDAYNAME6[] = { /* "zaterdag" */
+ 0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0413) rgbSDAYNAME7[] = { /* "zondag" */
+ 0x7a, 0x6f, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVDAYNAME1[] = { /* "ma" */
+ 0x6d, 0x61
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVDAYNAME2[] = { /* "di" */
+ 0x64, 0x69
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVDAYNAME3[] = { /* "wo" */
+ 0x77, 0x6f
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVDAYNAME4[] = { /* "do" */
+ 0x64, 0x6f
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVDAYNAME5[] = { /* "vr" */
+ 0x76, 0x72
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVDAYNAME6[] = { /* "za" */
+ 0x7a, 0x61
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVDAYNAME7[] = { /* "zo" */
+ 0x7a, 0x6f
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME1[] = { /* "januari" */
+ 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME2[] = { /* "februari" */
+ 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME3[] = { /* "maart" */
+ 0x6d, 0x61, 0x61, 0x72, 0x74
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME4[] = { /* "april" */
+ 0x61, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME5[] = { /* "mei" */
+ 0x6d, 0x65, 0x69
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME6[] = { /* "juni" */
+ 0x6a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME7[] = { /* "juli" */
+ 0x6a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME8[] = { /* "augustus" */
+ 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME9[] = { /* "september" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME10[] = { /* "oktober" */
+ 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME11[] = { /* "november" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0413) rgbSMONTHNAME12[] = { /* "december" */
+ 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME1[] = { /* "jan" */
+ 0x6a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME3[] = { /* "mrt" */
+ 0x6d, 0x72, 0x74
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME4[] = { /* "apr" */
+ 0x61, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME5[] = { /* "mei" */
+ 0x6d, 0x65, 0x69
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME8[] = { /* "aug" */
+ 0x61, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME10[] = { /* "okt" */
+ 0x6f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0413) rgbSABBREVMONTHNAME12[] = { /* "dec" */
+ 0x64, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0413) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0413) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0413) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0413) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbSENGCOUNTRY[] = { /* "Netherlands" */
+ 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61
+ , 0x6e, 0x64, 0x73
+};
+
+static BYTE NLSALLOC(0413) rgbSENGLANGUAGE[] = { /* "Dutch" */
+ 0x44, 0x75, 0x74, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0413) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0413) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0413) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0413) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0413) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0413) g_rglcinfo0413[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 5, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 10, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 11, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 9, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 2, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 16, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 7, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 9, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 8, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 11, rgbSENGCOUNTRY }
+ , { 5, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0413) g_strinfo0413 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0414.c b/private/oleauto/src/dispatch/win16/0414.c
new file mode 100644
index 000000000..b6ce456b0
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0414.c
@@ -0,0 +1,526 @@
+/****************************************************************************
+* 0414.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Norwegian - Norway (Bokmål)
+*
+* LCID = 0x0414
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:57:45 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0406[256]; // from 0406:Danish - Denmark
+extern EXPANSION rgexp_0406[5];
+extern DIGRAPH rgdig_0406[5];
+extern WORD rgwCType12_0406[256];
+extern WORD rgwCType3_0406[256];
+extern BYTE rgbUCase_0406[256];
+extern BYTE rgbLCase_0406[256];
+
+static BYTE NLSALLOC(0414) rgbILANGUAGE[] = { /* "0414" */
+ 0x30, 0x34, 0x31, 0x34
+};
+
+static BYTE NLSALLOC(0414) rgbSLANGUAGE[] = { /* "Norwegian - Bokmal" */
+ 0x4e, 0x6f, 0x72, 0x77, 0x65, 0x67, 0x69, 0x61
+ , 0x6e, 0x20, 0x2d, 0x20, 0x42, 0x6f, 0x6b, 0x6d
+ , 0x61, 0x6c
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVLANGNAME[] = { /* "NOR" */
+ 0x4e, 0x4f, 0x52
+};
+
+static BYTE NLSALLOC(0414) rgbSNATIVELANGNAME[] = { /* "bokmål" */
+ 0x62, 0x6f, 0x6b, 0x6d, 0xe5, 0x6c
+};
+
+static BYTE NLSALLOC(0414) rgbICOUNTRY[] = { /* "47" */
+ 0x34, 0x37
+};
+
+static BYTE NLSALLOC(0414) rgbSCOUNTRY[] = { /* "Norway" */
+ 0x4e, 0x6f, 0x72, 0x77, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVCTRYNAME[] = { /* "NOR" */
+ 0x4e, 0x4f, 0x52
+};
+
+static BYTE NLSALLOC(0414) rgbSNATIVECTRYNAME[] = { /* "Norge" */
+ 0x4e, 0x6f, 0x72, 0x67, 0x65
+};
+
+static BYTE NLSALLOC(0414) rgbIDEFAULTLANGUAGE[] = { /* "0414" */
+ 0x30, 0x34, 0x31, 0x34
+};
+
+static BYTE NLSALLOC(0414) rgbIDEFAULTCOUNTRY[] = { /* "47" */
+ 0x34, 0x37
+};
+
+static BYTE NLSALLOC(0414) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0414) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0414) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0414) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0414) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0414) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0414) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0414) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0414) rgbSCURRENCY[] = { /* "kr" */
+ 0x6b, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSINTLSYMBOL[] = { /* "NOK" */
+ 0x4e, 0x4f, 0x4b
+};
+
+static BYTE NLSALLOC(0414) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0414) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0414) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0414) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0414) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0414) rgbINEGCURR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0414) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0414) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0414) rgbSSHORTDATE[] = { /* "dd.MM.yy" */
+ 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0414) rgbSLONGDATE[] = { /* "d. MMMM yyyy" */
+ 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0414) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0414) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbSDAYNAME1[] = { /* "mandag" */
+ 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0414) rgbSDAYNAME2[] = { /* "tirsdag" */
+ 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0414) rgbSDAYNAME3[] = { /* "onsdag" */
+ 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0414) rgbSDAYNAME4[] = { /* "torsdag" */
+ 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0414) rgbSDAYNAME5[] = { /* "fredag" */
+ 0x66, 0x72, 0x65, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0414) rgbSDAYNAME6[] = { /* "lørdag" */
+ 0x6c, 0xf8, 0x72, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0414) rgbSDAYNAME7[] = { /* "søndag" */
+ 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVDAYNAME1[] = { /* "ma" */
+ 0x6d, 0x61
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVDAYNAME2[] = { /* "ti" */
+ 0x74, 0x69
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVDAYNAME3[] = { /* "on" */
+ 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVDAYNAME4[] = { /* "to" */
+ 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVDAYNAME5[] = { /* "fr" */
+ 0x66, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVDAYNAME6[] = { /* "lø" */
+ 0x6c, 0xf8
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVDAYNAME7[] = { /* "sø" */
+ 0x73, 0xf8
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME1[] = { /* "januar" */
+ 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME2[] = { /* "februar" */
+ 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME4[] = { /* "april" */
+ 0x61, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME6[] = { /* "juni" */
+ 0x6a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME7[] = { /* "juli" */
+ 0x6a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME8[] = { /* "august" */
+ 0x61, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME9[] = { /* "september" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME10[] = { /* "oktober" */
+ 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME11[] = { /* "november" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSMONTHNAME12[] = { /* "desember" */
+ 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME1[] = { /* "jan" */
+ 0x6a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME4[] = { /* "apr" */
+ 0x61, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME8[] = { /* "aug" */
+ 0x61, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME10[] = { /* "okt" */
+ 0x6f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0414) rgbSABBREVMONTHNAME12[] = { /* "des" */
+ 0x64, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0414) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0414) rgbIPOSSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0414) rgbINEGSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0414) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0414) rgbSENGCOUNTRY[] = { /* "Norway" */
+ 0x4e, 0x6f, 0x72, 0x77, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0414) rgbSENGLANGUAGE[] = { /* "Norwegian (Bokmål)" */
+ 0x4e, 0x6f, 0x72, 0x77, 0x65, 0x67, 0x69, 0x61
+ , 0x6e, 0x20, 0x28, 0x42, 0x6f, 0x6b, 0x6d, 0xe5
+ , 0x6c, 0x29
+};
+
+static BYTE NLSALLOC(0414) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0414) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0414) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0414) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0414) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0414) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0414) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0414) g_rglcinfo0414[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 18, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 6, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 5, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 6, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 18, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0414) g_strinfo0414 = {
+ rgbUCase_0406
+ , rgbLCase_0406
+ , rgwCType12_0406
+ , rgwCType3_0406
+ , rgwSort_0406
+ , rgexp_0406
+ , rgdig_0406
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0415.c b/private/oleauto/src/dispatch/win16/0415.c
new file mode 100644
index 000000000..7aca6b5cd
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0415.c
@@ -0,0 +1,695 @@
+/****************************************************************************
+* 0415.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Polish - Poland
+*
+* LCID = 0x0415
+*
+* CodePage = 1250
+*
+* Generated: Thu Dec 01 18:09:30 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(0415) rgwSort_0415[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402d, 0x4034, 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0xc028
+ , 0x403a, 0x403b, 0x403c, 0x405e, 0x403d, 0xc029, 0x403e, 0x403f
+ , 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c
+ , 0x007d, 0x007e, 0x4040, 0x4041, 0x405f, 0x4060, 0x4061, 0x4042
+ , 0x4043, 0x087f, 0x0881, 0x0882, 0x0884, 0x0885, 0x0887, 0x0888
+ , 0x0889, 0x088a, 0x088b, 0x088c, 0x088d, 0x088f, 0x0890, 0x0892
+ , 0x0894, 0x0895, 0x0896, 0x0897, 0x0899, 0x089b, 0x089c, 0x089d
+ , 0x089e, 0x089f, 0x08a0, 0x4044, 0x4045, 0x4046, 0x4047, 0x4048
+ , 0x4049, 0x007f, 0x0081, 0x0082, 0x0084, 0x0085, 0x0087, 0x0088
+ , 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008f, 0x0090, 0x0092
+ , 0x0094, 0x0095, 0x0096, 0x0097, 0x0099, 0x009b, 0x009c, 0x009d
+ , 0x009e, 0x009f, 0x00a0, 0x404a, 0x404b, 0x404c, 0x404d, 0xc021
+ , 0xc022, 0xc023, 0x4058, 0xc024, 0x405b, 0x4073, 0x4070, 0x4071
+ , 0xc025, 0x4074, 0x0897, 0x405c, 0x0898, 0x0999, 0x09a0, 0x08a1
+ , 0xc026, 0x4056, 0x4057, 0x4059, 0x405a, 0x4072, 0xc02b, 0xc02c
+ , 0xc027, 0x089a, 0x0097, 0x405d, 0x0098, 0x0199, 0x01a0, 0x00a1
+ , 0x402e, 0x4052, 0x4152, 0x088e, 0x4067, 0x0880, 0x404e, 0x4068
+ , 0x404f, 0x4069, 0x0997, 0x4063, 0x406a, 0xc02a, 0x406b, 0x08a2
+ , 0x406c, 0x4062, 0x4054, 0x008e, 0x4050, 0x406d, 0x406e, 0x406f
+ , 0x4051, 0x0080, 0x0197, 0x4064, 0x0a8d, 0x4055, 0x028d, 0x00a2
+ , 0x0996, 0x097f, 0x0a7f, 0x0c7f, 0x0b7f, 0x098d, 0x0883, 0x0a82
+ , 0x0982, 0x0985, 0x0886, 0x0a85, 0x0b85, 0x098a, 0x0a8a, 0x0984
+ , 0x0a84, 0x0891, 0x0890, 0x0893, 0x0992, 0x0b92, 0x0a92, 0x4065
+ , 0x0a96, 0x0b9b, 0x099b, 0x0c9b, 0x0a9b, 0x099f, 0x0a99, 0x0005
+ , 0x0196, 0x017f, 0x027f, 0x047f, 0x037f, 0x018d, 0x0083, 0x0282
+ , 0x0182, 0x0185, 0x0086, 0x0285, 0x0385, 0x018a, 0x028a, 0x0184
+ , 0x0284, 0x0091, 0x0090, 0x0093, 0x0192, 0x0392, 0x0292, 0x4066
+ , 0x0296, 0x039b, 0x019b, 0x049b, 0x029b, 0x019f, 0x0299, 0x4053
+};
+
+EXPANSION NLSALLOC(0415) rgexp_0415[1] = {
+ { 0x0097, 0x0097 }
+};
+
+WORD NLSALLOC(0415) rgwCType12_0415[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x0020, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0x5010, 0x1101, 0xb010, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0xb010, 0x1102, 0xb010, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0xa048, 0x1010, 0x1010, 0x1101, 0x5010, 0x1101, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0x1101
+ , 0x5010, 0x5010, 0x1010, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1102, 0x1102, 0xb010, 0x1101, 0x1010, 0x1102, 0x1102
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1010
+};
+
+WORD NLSALLOC(0415) rgwCType3_0415[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x0000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0000, 0x0008, 0x8003, 0x0008, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0000, 0x0000, 0x8003, 0x0008, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x0008, 0x0401, 0x0408, 0x8003, 0x0008, 0x8003, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x8003, 0x0008, 0x0048, 0x0408, 0x0008, 0x8003
+ , 0x0008, 0x0008, 0x0408, 0x8003, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x8003, 0x8003, 0x0008, 0x8003, 0x0408, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0408
+};
+
+BYTE NLSALLOC(0415) rgbUCase_0415[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xa3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xa5, 0xaa, 0xbb, 0xbc, 0xbd, 0xbc, 0xaf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff
+};
+
+BYTE NLSALLOC(0415) rgbLCase_0415[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xb3, 0xa4, 0xb9, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbe, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(0415) rgbILANGUAGE[] = { /* "0415" */
+ 0x30, 0x34, 0x31, 0x35
+};
+
+static BYTE NLSALLOC(0415) rgbSLANGUAGE[] = { /* "Polish" */
+ 0x50, 0x6f, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVLANGNAME[] = { /* "PLK" */
+ 0x50, 0x4c, 0x4b
+};
+
+static BYTE NLSALLOC(0415) rgbSNATIVELANGNAME[] = { /* "polski" */
+ 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69
+};
+
+static BYTE NLSALLOC(0415) rgbICOUNTRY[] = { /* "48" */
+ 0x34, 0x38
+};
+
+static BYTE NLSALLOC(0415) rgbSCOUNTRY[] = { /* "Poland" */
+ 0x50, 0x6f, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVCTRYNAME[] = { /* "POL" */
+ 0x50, 0x4f, 0x4c
+};
+
+static BYTE NLSALLOC(0415) rgbSNATIVECTRYNAME[] = { /* "Polska" */
+ 0x50, 0x6f, 0x6c, 0x73, 0x6b, 0x61
+};
+
+static BYTE NLSALLOC(0415) rgbIDEFAULTLANGUAGE[] = { /* "0415" */
+ 0x30, 0x34, 0x31, 0x35
+};
+
+static BYTE NLSALLOC(0415) rgbIDEFAULTCOUNTRY[] = { /* "48" */
+ 0x34, 0x38
+};
+
+static BYTE NLSALLOC(0415) rgbIDEFAULTCODEPAGE[] = { /* "852" */
+ 0x38, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0415) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0415) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0415) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0415) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0415) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0415) rgbSCURRENCY[] = { /* "z\x0142" */
+ 0x7a, 0xb3
+};
+
+static BYTE NLSALLOC(0415) rgbSINTLSYMBOL[] = { /* "PLZ" */
+ 0x50, 0x4c, 0x5a
+};
+
+static BYTE NLSALLOC(0415) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0415) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0415) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0415) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0415) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(0415) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0415) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0415) rgbSSHORTDATE[] = { /* "d.MM.yy" */
+ 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0415) rgbSLONGDATE[] = { /* "d MMMM yyyy" */
+ 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79
+ , 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0415) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbSDAYNAME1[] = { /* "poniedzia\x0142ek" */
+ 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69
+ , 0x61, 0xb3, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(0415) rgbSDAYNAME2[] = { /* "wtorek" */
+ 0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(0415) rgbSDAYNAME3[] = { /* "\x015broda" */
+ 0x9c, 0x72, 0x6f, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(0415) rgbSDAYNAME4[] = { /* "czwartek" */
+ 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(0415) rgbSDAYNAME5[] = { /* "pi\x0105tek" */
+ 0x70, 0x69, 0xb9, 0x74, 0x65, 0x6b
+};
+
+static BYTE NLSALLOC(0415) rgbSDAYNAME6[] = { /* "sobota" */
+ 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61
+};
+
+static BYTE NLSALLOC(0415) rgbSDAYNAME7[] = { /* "niedziela" */
+ 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x65, 0x6c
+ , 0x61
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVDAYNAME1[] = { /* "Pn." */
+ 0x50, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVDAYNAME2[] = { /* "Wt." */
+ 0x57, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVDAYNAME3[] = { /* "\x015ar." */
+ 0x8c, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVDAYNAME4[] = { /* "Cz." */
+ 0x43, 0x7a, 0x2e
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVDAYNAME5[] = { /* "Pt." */
+ 0x50, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVDAYNAME6[] = { /* "So." */
+ 0x53, 0x6f, 0x2e
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVDAYNAME7[] = { /* "N." */
+ 0x4e, 0x2e
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME1[] = { /* "stycze\x0144" */
+ 0x73, 0x74, 0x79, 0x63, 0x7a, 0x65, 0xf1
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME2[] = { /* "luty" */
+ 0x6c, 0x75, 0x74, 0x79
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME3[] = { /* "marzec" */
+ 0x6d, 0x61, 0x72, 0x7a, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME4[] = { /* "kwiecie\x0144" */
+ 0x6b, 0x77, 0x69, 0x65, 0x63, 0x69, 0x65, 0xf1
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME5[] = { /* "maj" */
+ 0x6d, 0x61, 0x6a
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME6[] = { /* "czerwiec" */
+ 0x63, 0x7a, 0x65, 0x72, 0x77, 0x69, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME7[] = { /* "lipiec" */
+ 0x6c, 0x69, 0x70, 0x69, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME8[] = { /* "sierpie\x0144" */
+ 0x73, 0x69, 0x65, 0x72, 0x70, 0x69, 0x65, 0xf1
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME9[] = { /* "wrzesie\x0144" */
+ 0x77, 0x72, 0x7a, 0x65, 0x73, 0x69, 0x65, 0xf1
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME10[] = { /* "pa\x017adziernik" */
+ 0x70, 0x61, 0x9f, 0x64, 0x7a, 0x69, 0x65, 0x72
+ , 0x6e, 0x69, 0x6b
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME11[] = { /* "listopad" */
+ 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64
+};
+
+static BYTE NLSALLOC(0415) rgbSMONTHNAME12[] = { /* "grudzie\x0144" */
+ 0x67, 0x72, 0x75, 0x64, 0x7a, 0x69, 0x65, 0xf1
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME1[] = { /* "I" */
+ 0x49
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME2[] = { /* "II" */
+ 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME3[] = { /* "III" */
+ 0x49, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME4[] = { /* "IV" */
+ 0x49, 0x56
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME5[] = { /* "V" */
+ 0x56
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME6[] = { /* "VI" */
+ 0x56, 0x49
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME7[] = { /* "VII" */
+ 0x56, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME8[] = { /* "VIII" */
+ 0x56, 0x49, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME9[] = { /* "IX" */
+ 0x49, 0x58
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME10[] = { /* "X" */
+ 0x58
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME11[] = { /* "XI" */
+ 0x58, 0x49
+};
+
+static BYTE NLSALLOC(0415) rgbSABBREVMONTHNAME12[] = { /* "XII" */
+ 0x58, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(0415) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0415) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbSENGCOUNTRY[] = { /* "Poland" */
+ 0x50, 0x6f, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(0415) rgbSENGLANGUAGE[] = { /* "Polish" */
+ 0x50, 0x6f, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0415) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0415) rgbIDEFAULTANSICODEPAGE[] = { /* "1250" */
+ 0x31, 0x32, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0415) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0415) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0415) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0415) g_rglcinfo0415[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 6, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 11, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 12, rgbSDAYNAME1 }
+ , { 6, rgbSDAYNAME2 }
+ , { 5, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 9, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 4, rgbSMONTHNAME2 }
+ , { 6, rgbSMONTHNAME3 }
+ , { 8, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 8, rgbSMONTHNAME6 }
+ , { 6, rgbSMONTHNAME7 }
+ , { 8, rgbSMONTHNAME8 }
+ , { 8, rgbSMONTHNAME9 }
+ , { 11, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 1, rgbSABBREVMONTHNAME1 }
+ , { 2, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 2, rgbSABBREVMONTHNAME4 }
+ , { 1, rgbSABBREVMONTHNAME5 }
+ , { 2, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 2, rgbSABBREVMONTHNAME9 }
+ , { 1, rgbSABBREVMONTHNAME10 }
+ , { 2, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0415) g_strinfo0415 = {
+ rgbUCase_0415
+ , rgbLCase_0415
+ , rgwCType12_0415
+ , rgwCType3_0415
+ , rgwSort_0415
+ , rgexp_0415
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0416.c b/private/oleauto/src/dispatch/win16/0416.c
new file mode 100644
index 000000000..a3e74adfb
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0416.c
@@ -0,0 +1,532 @@
+/****************************************************************************
+* 0416.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Portuguese - Brazil
+*
+* LCID = 0x0416
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:37:39 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0416) rgbILANGUAGE[] = { /* "0416" */
+ 0x30, 0x34, 0x31, 0x36
+};
+
+static BYTE NLSALLOC(0416) rgbSLANGUAGE[] = { /* "Brazilian Portuguese" */
+ 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c, 0x69, 0x61
+ , 0x6e, 0x20, 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67
+ , 0x75, 0x65, 0x73, 0x65
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVLANGNAME[] = { /* "PTB" */
+ 0x50, 0x54, 0x42
+};
+
+static BYTE NLSALLOC(0416) rgbSNATIVELANGNAME[] = { /* "Português" */
+ 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea
+ , 0x73
+};
+
+static BYTE NLSALLOC(0416) rgbICOUNTRY[] = { /* "55" */
+ 0x35, 0x35
+};
+
+static BYTE NLSALLOC(0416) rgbSCOUNTRY[] = { /* "Brazil" */
+ 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVCTRYNAME[] = { /* "BRA" */
+ 0x42, 0x52, 0x41
+};
+
+static BYTE NLSALLOC(0416) rgbSNATIVECTRYNAME[] = { /* "Brasil" */
+ 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0416) rgbIDEFAULTLANGUAGE[] = { /* "0416" */
+ 0x30, 0x34, 0x31, 0x36
+};
+
+static BYTE NLSALLOC(0416) rgbIDEFAULTCOUNTRY[] = { /* "55" */
+ 0x35, 0x35
+};
+
+static BYTE NLSALLOC(0416) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0416) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0416) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0416) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0416) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0416) rgbSCURRENCY[] = { /* "Cr$" */
+ 0x43, 0x72, 0x24
+};
+
+static BYTE NLSALLOC(0416) rgbSINTLSYMBOL[] = { /* "BRR" */
+ 0x42, 0x52, 0x52
+};
+
+static BYTE NLSALLOC(0416) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0416) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0416) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0416) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0416) rgbINEGCURR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0416) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0416) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0416) rgbSLONGDATE[] = { /* "dddd, d' de 'MMMM' de 'yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27
+ , 0x20, 0x64, 0x65, 0x20, 0x27, 0x4d, 0x4d, 0x4d
+ , 0x4d, 0x27, 0x20, 0x64, 0x65, 0x20, 0x27, 0x79
+ , 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0416) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbSDAYNAME1[] = { /* "segunda-feira" */
+ 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d
+ , 0x66, 0x65, 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0416) rgbSDAYNAME2[] = { /* "terça-feira" */
+ 0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d, 0x66, 0x65
+ , 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0416) rgbSDAYNAME3[] = { /* "quarta-feira" */
+ 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66
+ , 0x65, 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0416) rgbSDAYNAME4[] = { /* "quinta-feira" */
+ 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66
+ , 0x65, 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0416) rgbSDAYNAME5[] = { /* "sexta-feira" */
+ 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66, 0x65
+ , 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0416) rgbSDAYNAME6[] = { /* "sábado" */
+ 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSDAYNAME7[] = { /* "domingo" */
+ 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVDAYNAME1[] = { /* "seg" */
+ 0x73, 0x65, 0x67
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVDAYNAME2[] = { /* "ter" */
+ 0x74, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVDAYNAME3[] = { /* "qua" */
+ 0x71, 0x75, 0x61
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVDAYNAME4[] = { /* "qui" */
+ 0x71, 0x75, 0x69
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVDAYNAME5[] = { /* "sex" */
+ 0x73, 0x65, 0x78
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVDAYNAME6[] = { /* "sáb" */
+ 0x73, 0xe1, 0x62
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVDAYNAME7[] = { /* "dom" */
+ 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME1[] = { /* "janeiro" */
+ 0x6a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME2[] = { /* "fevereiro" */
+ 0x66, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72
+ , 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME3[] = { /* "março" */
+ 0x6d, 0x61, 0x72, 0xe7, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME4[] = { /* "abril" */
+ 0x61, 0x62, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME5[] = { /* "maio" */
+ 0x6d, 0x61, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME6[] = { /* "junho" */
+ 0x6a, 0x75, 0x6e, 0x68, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME7[] = { /* "julho" */
+ 0x6a, 0x75, 0x6c, 0x68, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME8[] = { /* "agosto" */
+ 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME9[] = { /* "setembro" */
+ 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME10[] = { /* "outubro" */
+ 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME11[] = { /* "novembro" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSMONTHNAME12[] = { /* "dezembro" */
+ 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME1[] = { /* "jan" */
+ 0x6a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME2[] = { /* "fev" */
+ 0x66, 0x65, 0x76
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME4[] = { /* "abr" */
+ 0x61, 0x62, 0x72
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME8[] = { /* "ago" */
+ 0x61, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME9[] = { /* "set" */
+ 0x73, 0x65, 0x74
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME10[] = { /* "out" */
+ 0x6f, 0x75, 0x74
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0416) rgbSABBREVMONTHNAME12[] = { /* "dez" */
+ 0x64, 0x65, 0x7a
+};
+
+static BYTE NLSALLOC(0416) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0416) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0416) rgbINEGSIGNPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbSENGCOUNTRY[] = { /* "Brazil" */
+ 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0416) rgbSENGLANGUAGE[] = { /* "Portuguese" */
+ 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0x65
+ , 0x73, 0x65
+};
+
+static BYTE NLSALLOC(0416) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0416) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0416) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0416) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0416) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0416) g_rglcinfo0416[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 20, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 9, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 27, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 13, rgbSDAYNAME1 }
+ , { 11, rgbSDAYNAME2 }
+ , { 12, rgbSDAYNAME3 }
+ , { 12, rgbSDAYNAME4 }
+ , { 11, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 9, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 8, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 10, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0416) g_strinfo0416 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0419.c b/private/oleauto/src/dispatch/win16/0419.c
new file mode 100644
index 000000000..2b58f931b
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0419.c
@@ -0,0 +1,690 @@
+/****************************************************************************
+* 0419.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Russian - Russia
+*
+* LCID = 0x0419
+*
+* CodePage = 1251
+*
+* Generated: Thu Dec 01 18:17:20 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(0419) rgwSort_0419[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x402b, 0x402c, 0x402d, 0x402e, 0x402f, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x4029, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0xc024
+ , 0x4036, 0x4037, 0x4038, 0x4053, 0x4039, 0xc025, 0x403a, 0x403b
+ , 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f
+ , 0x0070, 0x0071, 0x403c, 0x403d, 0x4054, 0x4055, 0x4056, 0x403e
+ , 0x403f, 0x0872, 0x0873, 0x0874, 0x0875, 0x0876, 0x0877, 0x0878
+ , 0x0879, 0x087a, 0x087b, 0x087c, 0x087d, 0x087e, 0x087f, 0x0881
+ , 0x0882, 0x0883, 0x0884, 0x0885, 0x0886, 0x0888, 0x0889, 0x088a
+ , 0x088b, 0x088c, 0x088d, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044
+ , 0x4045, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078
+ , 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0081
+ , 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0088, 0x0089, 0x008a
+ , 0x008b, 0x008c, 0x008d, 0x4046, 0x4047, 0x4048, 0x4049, 0xc021
+ , 0x0893, 0x0a91, 0x404d, 0x0291, 0x4050, 0x4066, 0x4063, 0x4064
+ , 0xc022, 0x4067, 0x08a0, 0x4051, 0x08a3, 0x099e, 0x08a9, 0x08b0
+ , 0x0093, 0x404b, 0x404c, 0x404e, 0x404f, 0x4065, 0xc027, 0xc028
+ , 0xc023, 0x0887, 0x00a0, 0x4052, 0x00a3, 0x019e, 0x00a9, 0x00b0
+ , 0x402a, 0x08ab, 0x00ab, 0x089d, 0x405a, 0x0991, 0x404a, 0x405b
+ , 0x0994, 0x405c, 0x0895, 0x4058, 0x405d, 0xc026, 0x405e, 0x089b
+ , 0x405f, 0x4057, 0x089a, 0x009a, 0x0191, 0x4060, 0x4061, 0x4062
+ , 0x0194, 0x0880, 0x0095, 0x4059, 0x009d, 0x0898, 0x0098, 0x009b
+ , 0x088e, 0x088f, 0x0890, 0x0891, 0x0892, 0x0894, 0x0896, 0x0897
+ , 0x0899, 0x089c, 0x089e, 0x089f, 0x08a1, 0x08a2, 0x08a4, 0x08a5
+ , 0x08a6, 0x08a7, 0x08a8, 0x08aa, 0x08ac, 0x08ad, 0x08ae, 0x08af
+ , 0x08b1, 0x08b2, 0x08b3, 0x08b4, 0x08b5, 0x08b6, 0x08b7, 0x08b8
+ , 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0094, 0x0096, 0x0097
+ , 0x0099, 0x009c, 0x009e, 0x009f, 0x00a1, 0x00a2, 0x00a4, 0x00a5
+ , 0x00a6, 0x00a7, 0x00a8, 0x00aa, 0x00ac, 0x00ad, 0x00ae, 0x00af
+ , 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8
+};
+
+WORD NLSALLOC(0419) rgwCType12_0419[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x1101, 0x1101, 0xb010, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0x5010, 0x1101, 0xb010, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0xb010, 0x1102, 0xb010, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0xa048, 0x1101, 0x1102, 0x1101, 0x5010, 0x1101, 0xb010, 0xb010
+ , 0x1101, 0xb010, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0x1101
+ , 0x5010, 0x5010, 0x1101, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010
+ , 0x1102, 0xb010, 0x1102, 0xb010, 0x1102, 0x1101, 0x1102, 0x1102
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+};
+
+WORD NLSALLOC(0419) rgwCType3_0419[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x8000, 0x8003, 0x0008, 0x8003, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0000, 0x0008, 0x8000, 0x0008, 0x8000, 0x8003, 0x8000, 0x8000
+ , 0x8000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0000, 0x0000, 0x8000, 0x0008, 0x8000, 0x8003, 0x8000, 0x8000
+ , 0x0008, 0x8003, 0x8003, 0x8000, 0x0008, 0x8000, 0x0048, 0x0008
+ , 0x8003, 0x0008, 0x8000, 0x0008, 0x0048, 0x0408, 0x0008, 0x8003
+ , 0x0008, 0x0008, 0x8000, 0x8000, 0x8000, 0x0008, 0x0008, 0x0008
+ , 0x8003, 0x0000, 0x8000, 0x0008, 0x8000, 0x8000, 0x8000, 0x8003
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8003, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8003, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+ , 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000
+};
+
+BYTE NLSALLOC(0419) rgbUCase_0419[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x81, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x80, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0xa0, 0xa1, 0xa1, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb2, 0xa5, 0xb5, 0xb6, 0xb7
+ , 0xa8, 0xb9, 0xaa, 0xbb, 0xa3, 0xbd, 0xbd, 0xaf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+};
+
+BYTE NLSALLOC(0419) rgbLCase_0419[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x90, 0x83, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa2, 0xa2, 0xbc, 0xa4, 0xb4, 0xa6, 0xa7
+ , 0xb8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf
+ , 0xb0, 0xb1, 0xb3, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbe, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(0419) rgbILANGUAGE[] = { /* "0419" */
+ 0x30, 0x34, 0x31, 0x39
+};
+
+static BYTE NLSALLOC(0419) rgbSLANGUAGE[] = { /* "Russian" */
+ 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVLANGNAME[] = { /* "RUS" */
+ 0x52, 0x55, 0x53
+};
+
+static BYTE NLSALLOC(0419) rgbSNATIVELANGNAME[] = { /* "\x0440\x0443\x0441\x0441\x043a\x0438\x0439" */
+ 0xf0, 0xf3, 0xf1, 0xf1, 0xea, 0xe8, 0xe9
+};
+
+static BYTE NLSALLOC(0419) rgbICOUNTRY[] = { /* "7" */
+ 0x37
+};
+
+static BYTE NLSALLOC(0419) rgbSCOUNTRY[] = { /* "Russia" */
+ 0x52, 0x75, 0x73, 0x73, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVCTRYNAME[] = { /* "RUS" */
+ 0x52, 0x55, 0x53
+};
+
+static BYTE NLSALLOC(0419) rgbSNATIVECTRYNAME[] = { /* "\x0420\x043e\x0441\x0441\x0438\x044f" */
+ 0xd0, 0xee, 0xf1, 0xf1, 0xe8, 0xff
+};
+
+static BYTE NLSALLOC(0419) rgbIDEFAULTLANGUAGE[] = { /* "0419" */
+ 0x30, 0x34, 0x31, 0x39
+};
+
+static BYTE NLSALLOC(0419) rgbIDEFAULTCOUNTRY[] = { /* "7" */
+ 0x37
+};
+
+static BYTE NLSALLOC(0419) rgbIDEFAULTCODEPAGE[] = { /* "866" */
+ 0x38, 0x36, 0x36
+};
+
+static BYTE NLSALLOC(0419) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0419) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0419) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0419) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0419) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0419) rgbSCURRENCY[] = { /* "\x0440." */
+ 0xf0, 0x2e
+};
+
+static BYTE NLSALLOC(0419) rgbSINTLSYMBOL[] = { /* "RUR" */
+ 0x52, 0x55, 0x52
+};
+
+static BYTE NLSALLOC(0419) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0419) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbICURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbIINTLCURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbICURRENCY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbINEGCURR[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(0419) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0419) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0419) rgbSSHORTDATE[] = { /* "dd.MM.yy" */
+ 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0419) rgbSLONGDATE[] = { /* "d MMMM yyyy \x0433." */
+ 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79
+ , 0x79, 0x79, 0x79, 0x20, 0xe3, 0x2e
+};
+
+static BYTE NLSALLOC(0419) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbSDAYNAME1[] = { /* "\x043f\x043e\x043d\x0435\x0434\x0435\x043b\x044c\x043d\x0438\x043a" */
+ 0xef, 0xee, 0xed, 0xe5, 0xe4, 0xe5, 0xeb, 0xfc
+ , 0xed, 0xe8, 0xea
+};
+
+static BYTE NLSALLOC(0419) rgbSDAYNAME2[] = { /* "\x0432\x0442\x043e\x0440\x043d\x0438\x043a" */
+ 0xe2, 0xf2, 0xee, 0xf0, 0xed, 0xe8, 0xea
+};
+
+static BYTE NLSALLOC(0419) rgbSDAYNAME3[] = { /* "\x0441\x0440\x0435\x0434\x0430" */
+ 0xf1, 0xf0, 0xe5, 0xe4, 0xe0
+};
+
+static BYTE NLSALLOC(0419) rgbSDAYNAME4[] = { /* "\x0447\x0435\x0442\x0432\x0435\x0440\x0433" */
+ 0xf7, 0xe5, 0xf2, 0xe2, 0xe5, 0xf0, 0xe3
+};
+
+static BYTE NLSALLOC(0419) rgbSDAYNAME5[] = { /* "\x043f\x044f\x0442\x043d\x0438\x0446\x0430" */
+ 0xef, 0xff, 0xf2, 0xed, 0xe8, 0xf6, 0xe0
+};
+
+static BYTE NLSALLOC(0419) rgbSDAYNAME6[] = { /* "\x0441\x0443\x0431\x0431\x043e\x0442\x0430" */
+ 0xf1, 0xf3, 0xe1, 0xe1, 0xee, 0xf2, 0xe0
+};
+
+static BYTE NLSALLOC(0419) rgbSDAYNAME7[] = { /* "\x0432\x043e\x0441\x043a\x0440\x0435\x0441\x0435\x043d\x044c\x0435" */
+ 0xe2, 0xee, 0xf1, 0xea, 0xf0, 0xe5, 0xf1, 0xe5
+ , 0xed, 0xfc, 0xe5
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVDAYNAME1[] = { /* "\x041f\x043d" */
+ 0xcf, 0xed
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVDAYNAME2[] = { /* "\x0412\x0442" */
+ 0xc2, 0xf2
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVDAYNAME3[] = { /* "\x0421\x0440" */
+ 0xd1, 0xf0
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVDAYNAME4[] = { /* "\x0427\x0442" */
+ 0xd7, 0xf2
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVDAYNAME5[] = { /* "\x041f\x0442" */
+ 0xcf, 0xf2
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVDAYNAME6[] = { /* "\x0421\x0431" */
+ 0xd1, 0xe1
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVDAYNAME7[] = { /* "\x0412\x0441" */
+ 0xc2, 0xf1
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME1[] = { /* "\x042f\x043d\x0432\x0430\x0440\x044c" */
+ 0xdf, 0xed, 0xe2, 0xe0, 0xf0, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME2[] = { /* "\x0424\x0435\x0432\x0440\x0430\x043b\x044c" */
+ 0xd4, 0xe5, 0xe2, 0xf0, 0xe0, 0xeb, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME3[] = { /* "\x041c\x0430\x0440\x0442" */
+ 0xcc, 0xe0, 0xf0, 0xf2
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME4[] = { /* "\x0410\x043f\x0440\x0435\x043b\x044c" */
+ 0xc0, 0xef, 0xf0, 0xe5, 0xeb, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME5[] = { /* "\x041c\x0430\x0439" */
+ 0xcc, 0xe0, 0xe9
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME6[] = { /* "\x0418\x044e\x043d\x044c" */
+ 0xc8, 0xfe, 0xed, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME7[] = { /* "\x0418\x044e\x043b\x044c" */
+ 0xc8, 0xfe, 0xeb, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME8[] = { /* "\x0410\x0432\x0433\x0443\x0441\x0442" */
+ 0xc0, 0xe2, 0xe3, 0xf3, 0xf1, 0xf2
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME9[] = { /* "\x0421\x0435\x043d\x0442\x044f\x0431\x0440\x044c" */
+ 0xd1, 0xe5, 0xed, 0xf2, 0xff, 0xe1, 0xf0, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME10[] = { /* "\x041e\x043a\x0442\x044f\x0431\x0440\x044c" */
+ 0xce, 0xea, 0xf2, 0xff, 0xe1, 0xf0, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME11[] = { /* "\x041d\x043e\x044f\x0431\x0440\x044c" */
+ 0xcd, 0xee, 0xff, 0xe1, 0xf0, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSMONTHNAME12[] = { /* "\x0414\x0435\x043a\x0430\x0431\x0440\x044c" */
+ 0xc4, 0xe5, 0xea, 0xe0, 0xe1, 0xf0, 0xfc
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME1[] = { /* "\x042f\x043d\x0432" */
+ 0xdf, 0xed, 0xe2
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME2[] = { /* "\x0424\x0435\x0432" */
+ 0xd4, 0xe5, 0xe2
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME3[] = { /* "\x041c\x0430\x0440" */
+ 0xcc, 0xe0, 0xf0
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME4[] = { /* "\x0410\x043f\x0440" */
+ 0xc0, 0xef, 0xf0
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME5[] = { /* "\x041c\x0430\x044f" */
+ 0xcc, 0xe0, 0xff
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME6[] = { /* "\x0418\x044e\x043d" */
+ 0xc8, 0xfe, 0xed
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME7[] = { /* "\x0418\x044e\x043b" */
+ 0xc8, 0xfe, 0xeb
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME8[] = { /* "\x0410\x0432\x0433" */
+ 0xc0, 0xe2, 0xe3
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME9[] = { /* "\x0421\x0435\x043d" */
+ 0xd1, 0xe5, 0xed
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME10[] = { /* "\x041e\x043a\x0442" */
+ 0xce, 0xea, 0xf2
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME11[] = { /* "\x041d\x043e\x044f" */
+ 0xcd, 0xee, 0xff
+};
+
+static BYTE NLSALLOC(0419) rgbSABBREVMONTHNAME12[] = { /* "\x0414\x0435\x043a" */
+ 0xc4, 0xe5, 0xea
+};
+
+static BYTE NLSALLOC(0419) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0419) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbIPOSSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbSENGCOUNTRY[] = { /* "Russia" */
+ 0x52, 0x75, 0x73, 0x73, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(0419) rgbSENGLANGUAGE[] = { /* "Russian" */
+ 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0419) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbIDEFAULTANSICODEPAGE[] = { /* "1251" */
+ 0x31, 0x32, 0x35, 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0419) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0419) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0419) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0419) g_rglcinfo0419[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 7, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 1, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 1, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 14, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 11, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 5, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 7, rgbSDAYNAME6 }
+ , { 11, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 6, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 8, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 7, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0419) g_strinfo0419 = {
+ rgbUCase_0419
+ , rgbLCase_0419
+ , rgwCType12_0419
+ , rgwCType3_0419
+ , rgwSort_0419
+ , NULL
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/041b.c b/private/oleauto/src/dispatch/win16/041b.c
new file mode 100644
index 000000000..3c5633ac6
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/041b.c
@@ -0,0 +1,706 @@
+/****************************************************************************
+* 041b.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Slovak - Slovak Republic
+*
+* LCID = 0x041b
+*
+* CodePage = 1250
+*
+* Generated: Thu Dec 01 18:14:21 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(041b) rgwSort_041b[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402d, 0x4034, 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0xc028
+ , 0x403a, 0x403b, 0x403c, 0x405e, 0x403d, 0xc029, 0x403e, 0x403f
+ , 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c
+ , 0x007d, 0x007e, 0x4040, 0x4041, 0x405f, 0x4060, 0x4061, 0x4042
+ , 0x4043, 0x087f, 0x0881, 0x0006, 0x0884, 0x0885, 0x0886, 0x0887
+ , 0x0888, 0x088a, 0x088b, 0x088c, 0x088d, 0x088e, 0x088f, 0x0890
+ , 0x0892, 0x0893, 0x0894, 0x0896, 0x0898, 0x089a, 0x089b, 0x089c
+ , 0x089d, 0x089e, 0x089f, 0x4044, 0x4045, 0x4046, 0x4047, 0x4048
+ , 0x4049, 0x007f, 0x0081, 0x0306, 0x0084, 0x0085, 0x0086, 0x0087
+ , 0x0088, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090
+ , 0x0092, 0x0093, 0x0094, 0x0096, 0x0098, 0x009a, 0x009b, 0x009c
+ , 0x009d, 0x009e, 0x009f, 0x404a, 0x404b, 0x404c, 0x404d, 0xc021
+ , 0xc022, 0xc023, 0x4058, 0xc024, 0x405b, 0x4073, 0x4070, 0x4071
+ , 0xc025, 0x4074, 0x0897, 0x405c, 0x0896, 0x0998, 0x08a0, 0x0a9f
+ , 0xc026, 0x4056, 0x4057, 0x4059, 0x405a, 0x4072, 0xc02b, 0xc02c
+ , 0xc027, 0x0899, 0x0097, 0x405d, 0x0096, 0x0198, 0x00a0, 0x029f
+ , 0x402e, 0x4052, 0x4152, 0x0b8d, 0x4067, 0x0c7f, 0x404e, 0x4068
+ , 0x404f, 0x4069, 0x0996, 0x4063, 0x406a, 0xc02a, 0x406b, 0x099f
+ , 0x406c, 0x4062, 0x4054, 0x038d, 0x4050, 0x406d, 0x406e, 0x406f
+ , 0x4051, 0x047f, 0x0196, 0x4064, 0x0a8d, 0x4055, 0x028d, 0x019f
+ , 0x0994, 0x097f, 0x0a7f, 0x0b7f, 0x0880, 0x098d, 0x0982, 0x0a82
+ , 0x0883, 0x0a85, 0x0c85, 0x0985, 0x0b85, 0x098a, 0x0a8a, 0x0984
+ , 0x0a84, 0x098f, 0x0a8f, 0x0a90, 0x0891, 0x0b90, 0x0990, 0x4065
+ , 0x0895, 0x0b9a, 0x0a9a, 0x0c9a, 0x099a, 0x099e, 0x0a98, 0x0005
+ , 0x0194, 0x017f, 0x027f, 0x037f, 0x0080, 0x018d, 0x0182, 0x0282
+ , 0x0083, 0x0285, 0x0485, 0x0185, 0x0385, 0x018a, 0x028a, 0x0184
+ , 0x0284, 0x018f, 0x028f, 0x0290, 0x0091, 0x0390, 0x0190, 0x4066
+ , 0x0095, 0x039a, 0x029a, 0x049a, 0x019a, 0x019e, 0x0298, 0x4053
+};
+
+DIGRAPH NLSALLOC(041b) rgdig_041b[5] = {
+ { 0x0882, 0x02 }
+ , { 0x1089, 0x48 }
+ , { 0x0889, 0x68 }
+ , { 0x0082, 0x02 }
+ , { 0x0089, 0x68 }
+};
+
+EXPANSION NLSALLOC(041b) rgexp_041b[1] = {
+ { 0x0096, 0x0096 }
+};
+
+WORD NLSALLOC(041b) rgwCType12_041b[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x0020, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0x5010, 0x1101, 0xb010, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x0020, 0xb010, 0x1102, 0xb010, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0xa048, 0x1010, 0x1010, 0x1101, 0x5010, 0x1101, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0x1101
+ , 0x5010, 0x5010, 0x1010, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1102, 0x1102, 0xb010, 0x1101, 0x1010, 0x1102, 0x1102
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1010
+};
+
+WORD NLSALLOC(041b) rgwCType3_041b[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x0000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0000, 0x0008, 0x8003, 0x0008, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0000, 0x0000, 0x8003, 0x0008, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x0008, 0x0401, 0x0408, 0x8003, 0x0008, 0x8003, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x8003, 0x0008, 0x0048, 0x0408, 0x0008, 0x8003
+ , 0x0008, 0x0008, 0x0408, 0x8003, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x8003, 0x8003, 0x0008, 0x8003, 0x0408, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0408
+};
+
+BYTE NLSALLOC(041b) rgbUCase_041b[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xa3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xa5, 0xaa, 0xbb, 0xbc, 0xbd, 0xbc, 0xaf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff
+};
+
+BYTE NLSALLOC(041b) rgbLCase_041b[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xb3, 0xa4, 0xb9, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbe, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(041b) rgbILANGUAGE[] = { /* "041b" */
+ 0x30, 0x34, 0x31, 0x62
+};
+
+static BYTE NLSALLOC(041b) rgbSLANGUAGE[] = { /* "Slovak" */
+ 0x53, 0x6c, 0x6f, 0x76, 0x61, 0x6b
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVLANGNAME[] = { /* "SKY" */
+ 0x53, 0x4b, 0x59
+};
+
+static BYTE NLSALLOC(041b) rgbSNATIVELANGNAME[] = { /* "sloven\x010dtina" */
+ 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0xe8, 0x74
+ , 0x69, 0x6e, 0x61
+};
+
+static BYTE NLSALLOC(041b) rgbICOUNTRY[] = { /* "42" */
+ 0x34, 0x32
+};
+
+static BYTE NLSALLOC(041b) rgbSCOUNTRY[] = { /* "Slovak Republic" */
+ 0x53, 0x6c, 0x6f, 0x76, 0x61, 0x6b, 0x20, 0x52
+ , 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVCTRYNAME[] = { /* "SVK" */
+ 0x53, 0x56, 0x4b
+};
+
+static BYTE NLSALLOC(041b) rgbSNATIVECTRYNAME[] = { /* "Slovenská republika" */
+ 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x73, 0x6b
+ , 0xe1, 0x20, 0x72, 0x65, 0x70, 0x75, 0x62, 0x6c
+ , 0x69, 0x6b, 0x61
+};
+
+static BYTE NLSALLOC(041b) rgbIDEFAULTLANGUAGE[] = { /* "041b" */
+ 0x30, 0x34, 0x31, 0x62
+};
+
+static BYTE NLSALLOC(041b) rgbIDEFAULTCOUNTRY[] = { /* "42" */
+ 0x34, 0x32
+};
+
+static BYTE NLSALLOC(041b) rgbIDEFAULTCODEPAGE[] = { /* "852" */
+ 0x38, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(041b) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(041b) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(041b) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(041b) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041b) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(041b) rgbSCURRENCY[] = { /* "Sk" */
+ 0x53, 0x6b
+};
+
+static BYTE NLSALLOC(041b) rgbSINTLSYMBOL[] = { /* "SKK" */
+ 0x53, 0x4b, 0x4b
+};
+
+static BYTE NLSALLOC(041b) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(041b) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041b) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041b) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(041b) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(041b) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(041b) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(041b) rgbSSHORTDATE[] = { /* "d.M.yyyy" */
+ 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(041b) rgbSLONGDATE[] = { /* "d. MMMM yyyy" */
+ 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(041b) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbIMONLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbSDAYNAME1[] = { /* "pondelok" */
+ 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x6c, 0x6f, 0x6b
+};
+
+static BYTE NLSALLOC(041b) rgbSDAYNAME2[] = { /* "utorok" */
+ 0x75, 0x74, 0x6f, 0x72, 0x6f, 0x6b
+};
+
+static BYTE NLSALLOC(041b) rgbSDAYNAME3[] = { /* "streda" */
+ 0x73, 0x74, 0x72, 0x65, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(041b) rgbSDAYNAME4[] = { /* "\x0161tvrtok" */
+ 0x9a, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b
+};
+
+static BYTE NLSALLOC(041b) rgbSDAYNAME5[] = { /* "piatok" */
+ 0x70, 0x69, 0x61, 0x74, 0x6f, 0x6b
+};
+
+static BYTE NLSALLOC(041b) rgbSDAYNAME6[] = { /* "sobota" */
+ 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61
+};
+
+static BYTE NLSALLOC(041b) rgbSDAYNAME7[] = { /* "nede\x013ea" */
+ 0x6e, 0x65, 0x64, 0x65, 0xbe, 0x61
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVDAYNAME1[] = { /* "po" */
+ 0x70, 0x6f
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVDAYNAME2[] = { /* "ut" */
+ 0x75, 0x74
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVDAYNAME3[] = { /* "st" */
+ 0x73, 0x74
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVDAYNAME4[] = { /* "\x0161t" */
+ 0x9a, 0x74
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVDAYNAME5[] = { /* "pi" */
+ 0x70, 0x69
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVDAYNAME6[] = { /* "so" */
+ 0x73, 0x6f
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVDAYNAME7[] = { /* "ne" */
+ 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME1[] = { /* "január" */
+ 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME2[] = { /* "február" */
+ 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME3[] = { /* "marec" */
+ 0x6d, 0x61, 0x72, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME4[] = { /* "apríl" */
+ 0x61, 0x70, 0x72, 0xed, 0x6c
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME5[] = { /* "máj" */
+ 0x6d, 0xe1, 0x6a
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME6[] = { /* "jún" */
+ 0x6a, 0xfa, 0x6e
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME7[] = { /* "júl" */
+ 0x6a, 0xfa, 0x6c
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME8[] = { /* "august" */
+ 0x61, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME9[] = { /* "september" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME10[] = { /* "október" */
+ 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME11[] = { /* "november" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(041b) rgbSMONTHNAME12[] = { /* "december" */
+ 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME1[] = { /* "I" */
+ 0x49
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME2[] = { /* "II" */
+ 0x49, 0x49
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME3[] = { /* "III" */
+ 0x49, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME4[] = { /* "IV" */
+ 0x49, 0x56
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME5[] = { /* "V" */
+ 0x56
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME6[] = { /* "VI" */
+ 0x56, 0x49
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME7[] = { /* "VII" */
+ 0x56, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME8[] = { /* "VIII" */
+ 0x56, 0x49, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME9[] = { /* "IX" */
+ 0x49, 0x58
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME10[] = { /* "X" */
+ 0x58
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME11[] = { /* "XI" */
+ 0x58, 0x49
+};
+
+static BYTE NLSALLOC(041b) rgbSABBREVMONTHNAME12[] = { /* "XII" */
+ 0x58, 0x49, 0x49
+};
+
+static BYTE NLSALLOC(041b) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(041b) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbSENGCOUNTRY[] = { /* "Slovak Republic" */
+ 0x53, 0x6c, 0x6f, 0x76, 0x61, 0x6b, 0x20, 0x52
+ , 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(041b) rgbSENGLANGUAGE[] = { /* "Slovak" */
+ 0x53, 0x6c, 0x6f, 0x76, 0x61, 0x6b
+};
+
+static BYTE NLSALLOC(041b) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbIDEFAULTANSICODEPAGE[] = { /* "1250" */
+ 0x31, 0x32, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(041b) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041b) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041b) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(041b) g_rglcinfo041b[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 11, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 15, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 19, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 8, rgbSDAYNAME1 }
+ , { 6, rgbSDAYNAME2 }
+ , { 6, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 3, rgbSMONTHNAME6 }
+ , { 3, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 1, rgbSABBREVMONTHNAME1 }
+ , { 2, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 2, rgbSABBREVMONTHNAME4 }
+ , { 1, rgbSABBREVMONTHNAME5 }
+ , { 2, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 2, rgbSABBREVMONTHNAME9 }
+ , { 1, rgbSABBREVMONTHNAME10 }
+ , { 2, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 15, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(041b) g_strinfo041b = {
+ rgbUCase_041b
+ , rgbLCase_041b
+ , rgwCType12_041b
+ , rgwCType3_041b
+ , rgwSort_041b
+ , rgexp_041b
+ , rgdig_041b
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/041d.c b/private/oleauto/src/dispatch/win16/041d.c
new file mode 100644
index 000000000..5626120b6
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/041d.c
@@ -0,0 +1,701 @@
+/****************************************************************************
+* 041d.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Swedish - Sweden
+*
+* LCID = 0x041d
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:59:57 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(041d) rgwSort_041d[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402f, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0xc02a
+ , 0x403c, 0x403d, 0x403e, 0x4060, 0x403f, 0xc02b, 0x4040, 0x4041
+ , 0x007a, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084
+ , 0x0085, 0x0086, 0x4042, 0x4043, 0x4061, 0x4062, 0x4063, 0x4044
+ , 0x4045, 0x1087, 0x1088, 0x1089, 0x108a, 0x108b, 0x108c, 0x108d
+ , 0x108e, 0x108f, 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095
+ , 0x1096, 0x1097, 0x1098, 0x1099, 0x109a, 0x109c, 0x109d, 0x119d
+ , 0x109e, 0x109f, 0x10a0, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a
+ , 0x404b, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d
+ , 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095
+ , 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009c, 0x009d, 0x019d
+ , 0x009e, 0x009f, 0x00a0, 0x404c, 0x404d, 0x404e, 0x404f, 0xc021
+ , 0xc022, 0xc023, 0x405a, 0x018c, 0x405d, 0x4078, 0x4075, 0x4076
+ , 0x4149, 0x4079, 0x1199, 0x405e, 0x0505, 0xc024, 0xc025, 0xc026
+ , 0xc027, 0x4058, 0x4059, 0x405b, 0x405c, 0x4077, 0xc02d, 0xc02e
+ , 0x4057, 0x109b, 0x0199, 0x405f, 0x0605, 0xc028, 0xc029, 0x129f
+ , 0x4030, 0x4050, 0x4069, 0x406a, 0x406b, 0x406c, 0x4051, 0x406d
+ , 0x4052, 0x406e, 0x0887, 0x4065, 0x406f, 0xc02c, 0x4070, 0x4053
+ , 0x4071, 0x4064, 0x087f, 0x0880, 0x4054, 0x4072, 0x4073, 0x4074
+ , 0x4055, 0x087e, 0x0995, 0x4066, 0x007b, 0x007c, 0x007d, 0x4056
+ , 0x1287, 0x1187, 0x1387, 0x1487, 0x10a2, 0x10a1, 0x0005, 0x1189
+ , 0x128b, 0x118b, 0x138b, 0x148b, 0x128f, 0x118f, 0x138f, 0x148f
+ , 0x118a, 0x1194, 0x1395, 0x1295, 0x1495, 0x1595, 0x10a3, 0x4067
+ , 0x11a3, 0x129c, 0x119c, 0x139c, 0x139f, 0x119f, 0x0105, 0x0205
+ , 0x0287, 0x0187, 0x0387, 0x0487, 0x00a2, 0x00a1, 0x0305, 0x0189
+ , 0x028b, 0x018b, 0x038b, 0x048b, 0x028f, 0x018f, 0x038f, 0x048f
+ , 0x018a, 0x0194, 0x0395, 0x0295, 0x0495, 0x0595, 0x00a3, 0x4068
+ , 0x01a3, 0x029c, 0x019c, 0x039c, 0x039f, 0x019f, 0x0405, 0x029f
+};
+
+EXPANSION NLSALLOC(041d) rgexp_041d[7] = {
+ { 0x1087, 0x108b }
+ , { 0x109a, 0x108e }
+ , { 0x0099, 0x0099 }
+ , { 0x0087, 0x008b }
+ , { 0x009a, 0x008e }
+ , { 0x1095, 0x108b }
+ , { 0x0095, 0x008b }
+};
+
+WORD NLSALLOC(041d) rgwCType12_041d[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x1101, 0xb010, 0x1101, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0xb010, 0x1102, 0xb010, 0x1102, 0x0020, 0x0020, 0x1101
+ , 0xa048, 0xb010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+};
+
+WORD NLSALLOC(041d) rgwCType3_041d[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0408, 0x0000, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x8003
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0400, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+};
+
+BYTE NLSALLOC(041d) rgbUCase_041d[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x9f
+};
+
+BYTE NLSALLOC(041d) rgbLCase_041d[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xff
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(041d) rgbILANGUAGE[] = { /* "041d" */
+ 0x30, 0x34, 0x31, 0x64
+};
+
+static BYTE NLSALLOC(041d) rgbSLANGUAGE[] = { /* "Swedish" */
+ 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVLANGNAME[] = { /* "SVE" */
+ 0x53, 0x56, 0x45
+};
+
+static BYTE NLSALLOC(041d) rgbSNATIVELANGNAME[] = { /* "svenska" */
+ 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61
+};
+
+static BYTE NLSALLOC(041d) rgbICOUNTRY[] = { /* "46" */
+ 0x34, 0x36
+};
+
+static BYTE NLSALLOC(041d) rgbSCOUNTRY[] = { /* "Sweden" */
+ 0x53, 0x77, 0x65, 0x64, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVCTRYNAME[] = { /* "SWE" */
+ 0x53, 0x57, 0x45
+};
+
+static BYTE NLSALLOC(041d) rgbSNATIVECTRYNAME[] = { /* "Sverige" */
+ 0x53, 0x76, 0x65, 0x72, 0x69, 0x67, 0x65
+};
+
+static BYTE NLSALLOC(041d) rgbIDEFAULTLANGUAGE[] = { /* "041d" */
+ 0x30, 0x34, 0x31, 0x64
+};
+
+static BYTE NLSALLOC(041d) rgbIDEFAULTCOUNTRY[] = { /* "46" */
+ 0x34, 0x36
+};
+
+static BYTE NLSALLOC(041d) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(041d) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(041d) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041d) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(041d) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(041d) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(041d) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041d) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(041d) rgbSCURRENCY[] = { /* "kr" */
+ 0x6b, 0x72
+};
+
+static BYTE NLSALLOC(041d) rgbSINTLSYMBOL[] = { /* "SEK" */
+ 0x53, 0x45, 0x4b
+};
+
+static BYTE NLSALLOC(041d) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(041d) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(041d) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041d) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041d) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(041d) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(041d) rgbSDATE[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(041d) rgbSTIME[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(041d) rgbSSHORTDATE[] = { /* "yyyy-MM-dd" */
+ 0x79, 0x79, 0x79, 0x79, 0x2d, 0x4d, 0x4d, 0x2d
+ , 0x64, 0x64
+};
+
+static BYTE NLSALLOC(041d) rgbSLONGDATE[] = { /* " den 'd MMMM yyyy" */
+ 0x20, 0x64, 0x65, 0x6e, 0x20, 0x27, 0x64, 0x20
+ , 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79
+ , 0x79
+};
+
+static BYTE NLSALLOC(041d) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041d) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbSDAYNAME1[] = { /* "måndag" */
+ 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(041d) rgbSDAYNAME2[] = { /* "tisdag" */
+ 0x74, 0x69, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(041d) rgbSDAYNAME3[] = { /* "onsdag" */
+ 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(041d) rgbSDAYNAME4[] = { /* "torsdag" */
+ 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(041d) rgbSDAYNAME5[] = { /* "fredag" */
+ 0x66, 0x72, 0x65, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(041d) rgbSDAYNAME6[] = { /* "lördag" */
+ 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(041d) rgbSDAYNAME7[] = { /* "söndag" */
+ 0x73, 0xf6, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVDAYNAME1[] = { /* "må" */
+ 0x6d, 0xe5
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVDAYNAME2[] = { /* "ti" */
+ 0x74, 0x69
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVDAYNAME3[] = { /* "on" */
+ 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVDAYNAME4[] = { /* "to" */
+ 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVDAYNAME5[] = { /* "fr" */
+ 0x66, 0x72
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVDAYNAME6[] = { /* "lö" */
+ 0x6c, 0xf6
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVDAYNAME7[] = { /* "sö" */
+ 0x73, 0xf6
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME1[] = { /* "januari" */
+ 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME2[] = { /* "februari" */
+ 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME4[] = { /* "april" */
+ 0x61, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME5[] = { /* "maj" */
+ 0x6d, 0x61, 0x6a
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME6[] = { /* "juni" */
+ 0x6a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME7[] = { /* "juli" */
+ 0x6a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME8[] = { /* "augusti" */
+ 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x69
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME9[] = { /* "september" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME10[] = { /* "oktober" */
+ 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME11[] = { /* "november" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(041d) rgbSMONTHNAME12[] = { /* "december" */
+ 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME1[] = { /* "jan" */
+ 0x6a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME4[] = { /* "apr" */
+ 0x61, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME5[] = { /* "maj" */
+ 0x6d, 0x61, 0x6a
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME8[] = { /* "aug" */
+ 0x61, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME10[] = { /* "okt" */
+ 0x6f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(041d) rgbSABBREVMONTHNAME12[] = { /* "dec" */
+ 0x64, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(041d) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(041d) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041d) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041d) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbSENGCOUNTRY[] = { /* "Sweden" */
+ 0x53, 0x77, 0x65, 0x64, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(041d) rgbSENGLANGUAGE[] = { /* "Swedish" */
+ 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(041d) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041d) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041d) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(041d) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbSTIMEFORMAT[] = { /* "HH.mm.ss" */
+ 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(041d) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041d) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041d) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(041d) g_rglcinfo041d[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 7, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 7, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 10, rgbSSHORTDATE }
+ , { 17, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 6, rgbSDAYNAME2 }
+ , { 6, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 7, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(041d) g_strinfo041d = {
+ rgbUCase_041d
+ , rgbLCase_041d
+ , rgwCType12_041d
+ , rgwCType3_041d
+ , rgwSort_041d
+ , rgexp_041d
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/041f.c b/private/oleauto/src/dispatch/win16/041f.c
new file mode 100644
index 000000000..53f39ed84
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/041f.c
@@ -0,0 +1,699 @@
+/****************************************************************************
+* 041f.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Turkish - Turkey
+*
+* LCID = 0x041f
+*
+* CodePage = 1254
+*
+* Generated: Thu Dec 01 18:23:53 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(041f) rgwSort_041f[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402f, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0xc02a
+ , 0x403c, 0x403d, 0x403e, 0x4060, 0x403f, 0xc02b, 0x4040, 0x4041
+ , 0x007a, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084
+ , 0x0085, 0x0086, 0x4042, 0x4043, 0x4061, 0x4062, 0x4063, 0x4044
+ , 0x4045, 0x1887, 0x1888, 0x1889, 0x188b, 0x188c, 0x188d, 0x188e
+ , 0x1890, 0x0891, 0x1892, 0x1893, 0x1894, 0x1895, 0x1896, 0x1897
+ , 0x1899, 0x189a, 0x189b, 0x189c, 0x189e, 0x18a0, 0x18a2, 0x18a3
+ , 0x18a4, 0x18a5, 0x18a6, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a
+ , 0x404b, 0x0087, 0x0088, 0x0089, 0x008b, 0x008c, 0x008d, 0x008e
+ , 0x0090, 0x1891, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097
+ , 0x0099, 0x009a, 0x009b, 0x009c, 0x009e, 0x00a0, 0x00a2, 0x00a3
+ , 0x00a4, 0x00a5, 0x00a6, 0x404c, 0x404d, 0x404e, 0x404f, 0xc021
+ , 0xc022, 0xc023, 0x405a, 0x018d, 0x405d, 0x4078, 0x4075, 0x4076
+ , 0x4149, 0x4079, 0x199c, 0x405e, 0x0305, 0xc024, 0xc025, 0xc026
+ , 0xc027, 0x4058, 0x4059, 0x405b, 0x405c, 0x4077, 0xc02d, 0xc02e
+ , 0x4057, 0x189f, 0x019c, 0x405f, 0x0405, 0xc028, 0xc029, 0x19a5
+ , 0x4030, 0x4050, 0x4069, 0x406a, 0x406b, 0x406c, 0x4051, 0x406d
+ , 0x4052, 0x406e, 0x1087, 0x4065, 0x406f, 0xc02c, 0x4070, 0x4053
+ , 0x4071, 0x4064, 0x107f, 0x1080, 0x4054, 0x4072, 0x4073, 0x4074
+ , 0x4055, 0x107e, 0x1197, 0x4066, 0x007b, 0x007c, 0x007d, 0x4056
+ , 0x1a87, 0x1987, 0x1b87, 0x1d87, 0x1c87, 0x1e87, 0x0005, 0x188a
+ , 0x1a8c, 0x198c, 0x1b8c, 0x1c8c, 0x1a91, 0x1991, 0x1b91, 0x1c91
+ , 0x188f, 0x1996, 0x1b97, 0x1a97, 0x1c97, 0x1d97, 0x1898, 0x4067
+ , 0x1e97, 0x1aa0, 0x19a0, 0x1ba0, 0x18a1, 0x2091, 0x189d, 0x0105
+ , 0x0287, 0x0187, 0x0387, 0x0587, 0x0487, 0x0687, 0x0205, 0x008a
+ , 0x028c, 0x018c, 0x038c, 0x048c, 0x0291, 0x0191, 0x0391, 0x0491
+ , 0x008f, 0x0196, 0x0397, 0x0297, 0x0497, 0x0597, 0x0098, 0x4068
+ , 0x0697, 0x02a0, 0x01a0, 0x03a0, 0x00a1, 0x0091, 0x009d, 0x01a5
+};
+
+EXPANSION NLSALLOC(041f) rgexp_041f[5] = {
+ { 0x1887, 0x188c }
+ , { 0x009c, 0x009c }
+ , { 0x0087, 0x008c }
+ , { 0x1897, 0x188c }
+ , { 0x0097, 0x008c }
+};
+
+WORD NLSALLOC(041f) rgwCType12_041f[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x1101, 0xb010, 0x1101, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0xb010, 0x1102, 0xb010, 0x1102, 0x0020, 0x0020, 0x1101
+ , 0xa048, 0xb010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+};
+
+WORD NLSALLOC(041f) rgwCType3_041f[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0408, 0x0000, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x8003
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0400, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+};
+
+BYTE NLSALLOC(041f) rgbUCase_041f[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xfd, 0xde, 0x9f
+};
+
+BYTE NLSALLOC(041f) rgbLCase_041f[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xff
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xdd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(041f) rgbILANGUAGE[] = { /* "041f" */
+ 0x30, 0x34, 0x31, 0x66
+};
+
+static BYTE NLSALLOC(041f) rgbSLANGUAGE[] = { /* "Turkish" */
+ 0x54, 0x75, 0x72, 0x6b, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVLANGNAME[] = { /* "TRK" */
+ 0x54, 0x52, 0x4b
+};
+
+static BYTE NLSALLOC(041f) rgbSNATIVELANGNAME[] = { /* "Türkçe" */
+ 0x54, 0xfc, 0x72, 0x6b, 0xe7, 0x65
+};
+
+static BYTE NLSALLOC(041f) rgbICOUNTRY[] = { /* "90" */
+ 0x39, 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbSCOUNTRY[] = { /* "Turkey" */
+ 0x54, 0x75, 0x72, 0x6b, 0x65, 0x79
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVCTRYNAME[] = { /* "TUR" */
+ 0x54, 0x55, 0x52
+};
+
+static BYTE NLSALLOC(041f) rgbSNATIVECTRYNAME[] = { /* "Türkiye" */
+ 0x54, 0xfc, 0x72, 0x6b, 0x69, 0x79, 0x65
+};
+
+static BYTE NLSALLOC(041f) rgbIDEFAULTLANGUAGE[] = { /* "041f" */
+ 0x30, 0x34, 0x31, 0x66
+};
+
+static BYTE NLSALLOC(041f) rgbIDEFAULTCOUNTRY[] = { /* "90" */
+ 0x39, 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbIDEFAULTCODEPAGE[] = { /* "857" */
+ 0x38, 0x35, 0x37
+};
+
+static BYTE NLSALLOC(041f) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(041f) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(041f) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(041f) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041f) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(041f) rgbSCURRENCY[] = { /* "TL" */
+ 0x54, 0x4c
+};
+
+static BYTE NLSALLOC(041f) rgbSINTLSYMBOL[] = { /* "TRL" */
+ 0x54, 0x52, 0x4c
+};
+
+static BYTE NLSALLOC(041f) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(041f) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041f) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(041f) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(041f) rgbINEGCURR[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(041f) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(041f) rgbSSHORTDATE[] = { /* "d/M/yyyy" */
+ 0x64, 0x2f, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(041f) rgbSLONGDATE[] = { /* "d MMMM yyyy, dddd" */
+ 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79
+ , 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64
+ , 0x64
+};
+
+static BYTE NLSALLOC(041f) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbIMONLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbSDAYNAME1[] = { /* "Pazartesi" */
+ 0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73
+ , 0x69
+};
+
+static BYTE NLSALLOC(041f) rgbSDAYNAME2[] = { /* "Sal\x0131" */
+ 0x53, 0x61, 0x6c, 0xfd
+};
+
+static BYTE NLSALLOC(041f) rgbSDAYNAME3[] = { /* "\x00c7ar\x015famba" */
+ 0xc7, 0x61, 0x72, 0xfe, 0x61, 0x6d, 0x62, 0x61
+};
+
+static BYTE NLSALLOC(041f) rgbSDAYNAME4[] = { /* "Per\x015fembe" */
+ 0x50, 0x65, 0x72, 0xfe, 0x65, 0x6d, 0x62, 0x65
+};
+
+static BYTE NLSALLOC(041f) rgbSDAYNAME5[] = { /* "Cuma" */
+ 0x43, 0x75, 0x6d, 0x61
+};
+
+static BYTE NLSALLOC(041f) rgbSDAYNAME6[] = { /* "Cumartesi" */
+ 0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73
+ , 0x69
+};
+
+static BYTE NLSALLOC(041f) rgbSDAYNAME7[] = { /* "Pazar" */
+ 0x50, 0x61, 0x7a, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVDAYNAME1[] = { /* "Pzt" */
+ 0x50, 0x7a, 0x74
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVDAYNAME2[] = { /* "Sal" */
+ 0x53, 0x61, 0x6c
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVDAYNAME3[] = { /* "\x00c7ar" */
+ 0xc7, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVDAYNAME4[] = { /* "Per" */
+ 0x50, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVDAYNAME5[] = { /* "Cum" */
+ 0x43, 0x75, 0x6d
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVDAYNAME6[] = { /* "Cmt" */
+ 0x43, 0x6d, 0x74
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVDAYNAME7[] = { /* "Paz" */
+ 0x50, 0x61, 0x7a
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME1[] = { /* "Ocak" */
+ 0x4f, 0x63, 0x61, 0x6b
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME2[] = { /* "\x015eubat" */
+ 0xde, 0x75, 0x62, 0x61, 0x74
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME3[] = { /* "Mart" */
+ 0x4d, 0x61, 0x72, 0x74
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME4[] = { /* "Nisan" */
+ 0x4e, 0x69, 0x73, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME5[] = { /* "May\x0131s" */
+ 0x4d, 0x61, 0x79, 0xfd, 0x73
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME6[] = { /* "Haziran" */
+ 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME7[] = { /* "Temmuz" */
+ 0x54, 0x65, 0x6d, 0x6d, 0x75, 0x7a
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME8[] = { /* "A\x011fustos" */
+ 0x41, 0xf0, 0x75, 0x73, 0x74, 0x6f, 0x73
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME9[] = { /* "Eylül" */
+ 0x45, 0x79, 0x6c, 0xfc, 0x6c
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME10[] = { /* "Ekim" */
+ 0x45, 0x6b, 0x69, 0x6d
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME11[] = { /* "Kas\x0131m" */
+ 0x4b, 0x61, 0x73, 0xfd, 0x6d
+};
+
+static BYTE NLSALLOC(041f) rgbSMONTHNAME12[] = { /* "Aral\x0131k" */
+ 0x41, 0x72, 0x61, 0x6c, 0xfd, 0x6b
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME1[] = { /* "Oca" */
+ 0x4f, 0x63, 0x61
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME2[] = { /* "\x015eub" */
+ 0xde, 0x75, 0x62
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME3[] = { /* "Mar" */
+ 0x4d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME4[] = { /* "Nis" */
+ 0x4e, 0x69, 0x73
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME6[] = { /* "Haz" */
+ 0x48, 0x61, 0x7a
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME7[] = { /* "Tem" */
+ 0x54, 0x65, 0x6d
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME8[] = { /* "A\x011fu" */
+ 0x41, 0xf0, 0x75
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME9[] = { /* "Eyl" */
+ 0x45, 0x79, 0x6c
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME10[] = { /* "Eki" */
+ 0x45, 0x6b, 0x69
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME11[] = { /* "Kas" */
+ 0x4b, 0x61, 0x73
+};
+
+static BYTE NLSALLOC(041f) rgbSABBREVMONTHNAME12[] = { /* "Ara" */
+ 0x41, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(041f) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(041f) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(041f) rgbINEGSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(041f) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbSENGCOUNTRY[] = { /* "Turkey" */
+ 0x54, 0x75, 0x72, 0x6b, 0x65, 0x79
+};
+
+static BYTE NLSALLOC(041f) rgbSENGLANGUAGE[] = { /* "Turkish" */
+ 0x54, 0x75, 0x72, 0x6b, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(041f) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbIDEFAULTANSICODEPAGE[] = { /* "1254" */
+ 0x31, 0x32, 0x35, 0x34
+};
+
+static BYTE NLSALLOC(041f) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(041f) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(041f) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(041f) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(041f) g_rglcinfo041f[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 7, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 6, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 7, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 17, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 9, rgbSDAYNAME1 }
+ , { 4, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 4, rgbSDAYNAME5 }
+ , { 9, rgbSDAYNAME6 }
+ , { 5, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 4, rgbSMONTHNAME1 }
+ , { 5, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 5, rgbSMONTHNAME5 }
+ , { 7, rgbSMONTHNAME6 }
+ , { 6, rgbSMONTHNAME7 }
+ , { 7, rgbSMONTHNAME8 }
+ , { 5, rgbSMONTHNAME9 }
+ , { 4, rgbSMONTHNAME10 }
+ , { 5, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(041f) g_strinfo041f = {
+ rgbUCase_041f
+ , rgbLCase_041f
+ , rgwCType12_041f
+ , rgwCType3_041f
+ , rgwSort_041f
+ , rgexp_041f
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0429.c b/private/oleauto/src/dispatch/win16/0429.c
new file mode 100644
index 000000000..0ecfdbd67
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0429.c
@@ -0,0 +1,536 @@
+/****************************************************************************
+* 0429.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Iran
+*
+* LCID = 0x0429
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:42:04 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(0429) rgbILANGUAGE[] = { /* "0429" */
+ 0x30, 0x34, 0x32, 0x39
+};
+
+static BYTE NLSALLOC(0429) rgbSLANGUAGE[] = { /* "Farsi" */
+ 0x46, 0x61, 0x72, 0x73, 0x69
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVLANGNAME[] = { /* "FAR" */
+ 0x46, 0x41, 0x52
+};
+
+static BYTE NLSALLOC(0429) rgbSNATIVELANGNAME[] = { /* "\x0641\x0627\x0631\x0633\x0649" */
+ 0xdd, 0xc7, 0xd1, 0xd3, 0xec
+};
+
+static BYTE NLSALLOC(0429) rgbICOUNTRY[] = { /* "981" */
+ 0x39, 0x38, 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbSCOUNTRY[] = { /* "Iran" */
+ 0x49, 0x72, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVCTRYNAME[] = { /* "IRN" */
+ 0x49, 0x52, 0x4e
+};
+
+static BYTE NLSALLOC(0429) rgbSNATIVECTRYNAME[] = { /* "Iran" */
+ 0x49, 0x72, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0429) rgbIDEFAULTLANGUAGE[] = { /* "0429" */
+ 0x30, 0x34, 0x32, 0x39
+};
+
+static BYTE NLSALLOC(0429) rgbIDEFAULTCOUNTRY[] = { /* "981" */
+ 0x39, 0x38, 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(0429) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0429) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0429) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0429) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0429) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0429) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0429) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0429) rgbSCURRENCY[] = { /* "\x0631\x0649\x0627\x0644" */
+ 0xd1, 0xec, 0xc7, 0xe1
+};
+
+static BYTE NLSALLOC(0429) rgbSINTLSYMBOL[] = { /* "IRR" */
+ 0x49, 0x52, 0x52
+};
+
+static BYTE NLSALLOC(0429) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0429) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0429) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0429) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0429) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0429) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0429) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0429) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0429) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0429) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0429) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0429) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0429) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0429) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0429) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0429) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbS1159[] = { /* "\x0642.\x0638" */
+ 0xde, 0x2e, 0xd9
+};
+
+static BYTE NLSALLOC(0429) rgbS2359[] = { /* "\x0628.\x0638" */
+ 0xc8, 0x2e, 0xd9
+};
+
+static BYTE NLSALLOC(0429) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(0429) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(0429) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(0429) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0429) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0429) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(0429) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME1[] = { /* "\x0645\x062d\x0631\x0645" */
+ 0xe3, 0xcd, 0xd1, 0xe3
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME2[] = { /* "\x0633\x0641\x0631" */
+ 0xd3, 0xdd, 0xd1
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME3[] = { /* "\x0631\x0628\x064a\x0639 \x0623\x0648\x0644" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME4[] = { /* "\x0631\x0628\x064a\x0639 \x062b\x0627\x0646\x064a" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xcb, 0xc7, 0xe4
+ , 0xed
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME5[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x0623\x0648\x0644" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xc3, 0xe6
+ , 0xe1
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME6[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x062b\x0627\x0646\x064a" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xcb, 0xc7
+ , 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME7[] = { /* "\x0631\x062c\x0628" */
+ 0xd1, 0xcc, 0xc8
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME8[] = { /* "\x0634\x0639\x0628\x0627\x0646" */
+ 0xd4, 0xda, 0xc8, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME9[] = { /* "\x0631\x0645\x0636\x0627\x0646" */
+ 0xd1, 0xe3, 0xd6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME10[] = { /* "\x0634\x0648\x0627\x0644" */
+ 0xd4, 0xe6, 0xc7, 0xe1
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME11[] = { /* "\x0630\x0648 \x0627\x0644\x0642\x0639\x062f\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xde, 0xda, 0xcf
+ , 0xc9
+};
+
+static BYTE NLSALLOC(0429) rgbSMONTHNAME12[] = { /* "\x0630\x0648 \x0627\x0644\x062d\x062c\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xcd, 0xcc, 0xc9
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME1[] = { /* "\x0645\x062d\x0631\x0645" */
+ 0xe3, 0xcd, 0xd1, 0xe3
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME2[] = { /* "\x0633\x0641\x0631" */
+ 0xd3, 0xdd, 0xd1
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME3[] = { /* "\x0631\x0628\x064a\x0639 \x0623\x0648\x0644" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME4[] = { /* "\x0631\x0628\x064a\x0639 \x062b\x0627\x0646\x064a" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xcb, 0xc7, 0xe4
+ , 0xed
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME5[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x0623\x0648\x0644" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xc3, 0xe6
+ , 0xe1
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME6[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x062b\x0627\x0646\x064a" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xcb, 0xc7
+ , 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME7[] = { /* "\x0631\x062c\x0628" */
+ 0xd1, 0xcc, 0xc8
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME8[] = { /* "\x0634\x0639\x0628\x0627\x0646" */
+ 0xd4, 0xda, 0xc8, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME9[] = { /* "\x0631\x0645\x0636\x0627\x0646" */
+ 0xd1, 0xe3, 0xd6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME10[] = { /* "\x0634\x0648\x0627\x0644" */
+ 0xd4, 0xe6, 0xc7, 0xe1
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME11[] = { /* "\x0630\x0648 \x0627\x0644\x0642\x0639\x062f\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xde, 0xda, 0xcf
+ , 0xc9
+};
+
+static BYTE NLSALLOC(0429) rgbSABBREVMONTHNAME12[] = { /* "\x0630\x0648 \x0627\x0644\x062d\x062c\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xcd, 0xcc, 0xc9
+};
+
+static BYTE NLSALLOC(0429) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0429) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0429) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0429) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0429) rgbSENGCOUNTRY[] = { /* "Iran" */
+ 0x49, 0x72, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0429) rgbSENGLANGUAGE[] = { /* "Farsi" */
+ 0x46, 0x61, 0x72, 0x73, 0x69
+};
+
+static BYTE NLSALLOC(0429) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(0429) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0429) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(0429) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0429) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0429) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0429) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0429) g_rglcinfo0429[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 5, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 5, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 4, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 4, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 4, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 3, rgbS1159 }
+ , { 3, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 4, rgbSMONTHNAME1 }
+ , { 3, rgbSMONTHNAME2 }
+ , { 8, rgbSMONTHNAME3 }
+ , { 9, rgbSMONTHNAME4 }
+ , { 9, rgbSMONTHNAME5 }
+ , { 10, rgbSMONTHNAME6 }
+ , { 3, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 5, rgbSMONTHNAME9 }
+ , { 4, rgbSMONTHNAME10 }
+ , { 9, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 4, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 8, rgbSABBREVMONTHNAME3 }
+ , { 9, rgbSABBREVMONTHNAME4 }
+ , { 9, rgbSABBREVMONTHNAME5 }
+ , { 10, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 9, rgbSABBREVMONTHNAME11 }
+ , { 8, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 4, rgbSENGCOUNTRY }
+ , { 5, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0429) g_strinfo0429 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0801.c b/private/oleauto/src/dispatch/win16/0801.c
new file mode 100644
index 000000000..e427330ac
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0801.c
@@ -0,0 +1,536 @@
+/****************************************************************************
+* 0801.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Iraq
+*
+* LCID = 0x0801
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:41:08 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(0801) rgbILANGUAGE[] = { /* "0801" */
+ 0x30, 0x38, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVLANGNAME[] = { /* "ARI" */
+ 0x41, 0x52, 0x49
+};
+
+static BYTE NLSALLOC(0801) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(0801) rgbICOUNTRY[] = { /* "964" */
+ 0x39, 0x36, 0x34
+};
+
+static BYTE NLSALLOC(0801) rgbSCOUNTRY[] = { /* "Iraq" */
+ 0x49, 0x72, 0x61, 0x71
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVCTRYNAME[] = { /* "IRQ" */
+ 0x49, 0x52, 0x51
+};
+
+static BYTE NLSALLOC(0801) rgbSNATIVECTRYNAME[] = { /* "Iraq" */
+ 0x49, 0x72, 0x61, 0x71
+};
+
+static BYTE NLSALLOC(0801) rgbIDEFAULTLANGUAGE[] = { /* "0801" */
+ 0x30, 0x38, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbIDEFAULTCOUNTRY[] = { /* "964" */
+ 0x39, 0x36, 0x34
+};
+
+static BYTE NLSALLOC(0801) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(0801) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0801) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0801) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0801) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0801) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0801) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0801) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0801) rgbSCURRENCY[] = { /* "dinar" */
+ 0x64, 0x69, 0x6e, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0801) rgbSINTLSYMBOL[] = { /* "IQD" */
+ 0x49, 0x51, 0x44
+};
+
+static BYTE NLSALLOC(0801) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0801) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0801) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0801) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0801) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0801) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0801) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0801) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0801) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0801) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0801) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0801) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0801) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0801) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0801) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0801) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(0801) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(0801) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(0801) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(0801) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(0801) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0801) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0801) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(0801) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME1[] = { /* "\x0645\x062d\x0631\x0645" */
+ 0xe3, 0xcd, 0xd1, 0xe3
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME2[] = { /* "\x0633\x0641\x0631" */
+ 0xd3, 0xdd, 0xd1
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME3[] = { /* "\x0631\x0628\x064a\x0639 \x0623\x0648\x0644" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME4[] = { /* "\x0631\x0628\x064a\x0639 \x062b\x0627\x0646\x064a" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xcb, 0xc7, 0xe4
+ , 0xed
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME5[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x0623\x0648\x0644" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xc3, 0xe6
+ , 0xe1
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME6[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x062b\x0627\x0646\x064a" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xcb, 0xc7
+ , 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME7[] = { /* "\x0631\x062c\x0628" */
+ 0xd1, 0xcc, 0xc8
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME8[] = { /* "\x0634\x0639\x0628\x0627\x0646" */
+ 0xd4, 0xda, 0xc8, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME9[] = { /* "\x0631\x0645\x0636\x0627\x0646" */
+ 0xd1, 0xe3, 0xd6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME10[] = { /* "\x0634\x0648\x0627\x0644" */
+ 0xd4, 0xe6, 0xc7, 0xe1
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME11[] = { /* "\x0630\x0648 \x0627\x0644\x0642\x0639\x062f\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xde, 0xda, 0xcf
+ , 0xc9
+};
+
+static BYTE NLSALLOC(0801) rgbSMONTHNAME12[] = { /* "\x0630\x0648 \x0627\x0644\x062d\x062c\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xcd, 0xcc, 0xc9
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME1[] = { /* "\x0645\x062d\x0631\x0645" */
+ 0xe3, 0xcd, 0xd1, 0xe3
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME2[] = { /* "\x0633\x0641\x0631" */
+ 0xd3, 0xdd, 0xd1
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME3[] = { /* "\x0631\x0628\x064a\x0639 \x0623\x0648\x0644" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME4[] = { /* "\x0631\x0628\x064a\x0639 \x062b\x0627\x0646\x064a" */
+ 0xd1, 0xc8, 0xed, 0xda, 0x20, 0xcb, 0xc7, 0xe4
+ , 0xed
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME5[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x0623\x0648\x0644" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xc3, 0xe6
+ , 0xe1
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME6[] = { /* "\x062c\x0645\x0627\x062f\x0649 \x062b\x0627\x0646\x064a" */
+ 0xcc, 0xe3, 0xc7, 0xcf, 0xec, 0x20, 0xcb, 0xc7
+ , 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME7[] = { /* "\x0631\x062c\x0628" */
+ 0xd1, 0xcc, 0xc8
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME8[] = { /* "\x0634\x0639\x0628\x0627\x0646" */
+ 0xd4, 0xda, 0xc8, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME9[] = { /* "\x0631\x0645\x0636\x0627\x0646" */
+ 0xd1, 0xe3, 0xd6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME10[] = { /* "\x0634\x0648\x0627\x0644" */
+ 0xd4, 0xe6, 0xc7, 0xe1
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME11[] = { /* "\x0630\x0648 \x0627\x0644\x0642\x0639\x062f\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xde, 0xda, 0xcf
+ , 0xc9
+};
+
+static BYTE NLSALLOC(0801) rgbSABBREVMONTHNAME12[] = { /* "\x0630\x0648 \x0627\x0644\x062d\x062c\x0629" */
+ 0xd0, 0xe6, 0x20, 0xc7, 0xe1, 0xcd, 0xcc, 0xc9
+};
+
+static BYTE NLSALLOC(0801) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0801) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0801) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0801) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0801) rgbSENGCOUNTRY[] = { /* "Iraq" */
+ 0x49, 0x72, 0x61, 0x71
+};
+
+static BYTE NLSALLOC(0801) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0801) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(0801) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0801) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(0801) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0801) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0801) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0801) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0801) g_rglcinfo0801[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 4, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 4, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 4, rgbSMONTHNAME1 }
+ , { 3, rgbSMONTHNAME2 }
+ , { 8, rgbSMONTHNAME3 }
+ , { 9, rgbSMONTHNAME4 }
+ , { 9, rgbSMONTHNAME5 }
+ , { 10, rgbSMONTHNAME6 }
+ , { 3, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 5, rgbSMONTHNAME9 }
+ , { 4, rgbSMONTHNAME10 }
+ , { 9, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 4, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 8, rgbSABBREVMONTHNAME3 }
+ , { 9, rgbSABBREVMONTHNAME4 }
+ , { 9, rgbSABBREVMONTHNAME5 }
+ , { 10, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 9, rgbSABBREVMONTHNAME11 }
+ , { 8, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 4, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0801) g_strinfo0801 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0804.c b/private/oleauto/src/dispatch/win16/0804.c
new file mode 100644
index 000000000..8e5066f09
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0804.c
@@ -0,0 +1,724 @@
+/***
+*0804.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+* China, Chinese Simplified (People's Republic of China [PRC])
+*
+* LCID = 0x0804
+*
+*
+*Generated: 9/22/93 - by hand from lcid_chs.txt
+*
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+#include "nlsdbcs.h"
+
+
+#if 1
+static SORTWEIGHT NLSALLOC(0804) rgsortweight[] = {
+ { 0x0000, 0x0200, 0x00, 0x00 }
+ , { 0x0020, 0x1020, 0x00, 0x02 }
+ , { 0x0030, 0x5030, 0x00, 0x02 }
+ , { 0x003A, 0x103A, 0x00, 0x02 }
+ , { 0x0041, 0x6041, 0x00, 0x02 }
+ , { 0x005B, 0x105B, 0x00, 0x02 }
+ , { 0x0061, 0x6041, 0x02, 0x02 }
+ , { 0x007B, 0x107B, 0x00, 0x02 }
+ , { 0x007F, 0xFFFF, 0x00, 0xFF }
+ , { 0xA1A1, 0x1020, 0x01, 0x02 }
+ , { 0xA1A2, 0x20A2, 0x00, 0x00 }
+ , { 0xA3A1, 0x1021, 0x01, 0x02 }
+ , { 0xA3B0, 0x5030, 0x01, 0x02 }
+ , { 0xA3BA, 0x103A, 0x01, 0x02 }
+ , { 0xA3C1, 0x6041, 0x01, 0x02 }
+ , { 0xA3DB, 0x105B, 0x01, 0x02 }
+ , { 0xA3E1, 0x6041, 0x03, 0x02 }
+ , { 0xA3FB, 0x107B, 0x01, 0x02 }
+ , { 0xA4A1, 0x30A1, 0x00, 0x00 }
+ , { 0xA6A1, 0x32A1, 0x01, 0x02 }
+ , { 0xA6C1, 0x32A1, 0x03, 0x02 }
+ , { 0xA7A1, 0x33A1, 0x01, 0x02 }
+ , { 0xA7D1, 0x33A1, 0x03, 0x02 }
+ , { 0xA8A1, 0x34A1, 0x00, 0x00 }
+ , { 0xB0A1, 0xB0A1, 0x00, 0x00 }
+};
+static MAPTABLE NLSALLOC(0804) rgmaptable[] = {
+ { 0x1020, 0x0001, 0x0020, 0xA1A1, 0x0020, 0xA1A1 }
+ , { 0x1021, 0x005F, 0x0021, 0xA3A1, 0x0021, 0xA3A1 }
+ , { 0x32A1, 0x0018, 0xA6A1, 0xA6A1, 0xA6C1, 0xA6C1 }
+ , { 0x33A1, 0x0021, 0xA7A1, 0xA7A1, 0xA7D1, 0xA7D1 }
+ , { 0x5030, 0x000A, 0x0030, 0xA3B0, 0x0030, 0xA3B0 }
+ , { 0x6041, 0x001A, 0x0041, 0xA3C1, 0x0061, 0xA3E1 }
+};
+static TYPETABLE NLSALLOC(0804) rgtypetable[] = {
+ { 0x0000, 0x0020, 0x00, 0x00 }
+ , { 0x0009, 0x0068, 0x09, 0x00 }
+ , { 0x000A, 0x0028, 0x00, 0x00 }
+ , { 0x000E, 0x0020, 0x00, 0x00 }
+ , { 0x0020, 0x0048, 0x0A, 0x00 }
+ , { 0x0021, 0x0010, 0x0B, 0x08 }
+ , { 0x0024, 0x0010, 0x05, 0x08 }
+ , { 0x0026, 0x0010, 0x01, 0x08 }
+ , { 0x002B, 0x0010, 0x05, 0x08 }
+ , { 0x002C, 0x0010, 0x07, 0x08 }
+ , { 0x002D, 0x0010, 0x05, 0x08 }
+ , { 0x002E, 0x0010, 0x03, 0x08 }
+ , { 0x0030, 0x0084, 0x03, 0x00 }
+ , { 0x003A, 0x0010, 0x07, 0x08 }
+ , { 0x003B, 0x0010, 0x0B, 0x08 }
+ , { 0x0040, 0x0010, 0x01, 0x08 }
+ , { 0x0041, 0x0181, 0x01, 0x00 }
+ , { 0x0047, 0x0101, 0x01, 0x00 }
+ , { 0x005B, 0x0010, 0x0B, 0x08 }
+ , { 0x0061, 0x0182, 0x01, 0x00 }
+ , { 0x0067, 0x0102, 0x01, 0x00 }
+ , { 0x007B, 0x0010, 0x0B, 0x08 }
+ , { 0x007F, 0x0020, 0x00, 0x00 }
+ , { 0x0080, 0x0000, 0x0B, 0x08 }
+ , { 0xA1A1, 0x0048, 0x0A, 0x00 }
+ , { 0xA1A2, 0x0000, 0x0B, 0x08 }
+ , { 0xA3A1, 0x0010, 0x0B, 0x08 }
+ , { 0xA3A4, 0x0010, 0x05, 0x08 }
+ , { 0xA3A6, 0x0010, 0x01, 0x08 }
+ , { 0xA3AB, 0x0010, 0x05, 0x08 }
+ , { 0xA3AC, 0x0010, 0x07, 0x08 }
+ , { 0xA3AD, 0x0010, 0x05, 0x08 }
+ , { 0xA3AE, 0x0010, 0x03, 0x08 }
+ , { 0xA3B0, 0x0084, 0x03, 0x00 }
+ , { 0xA3BA, 0x0010, 0x07, 0x08 }
+ , { 0xA3BB, 0x0010, 0x0B, 0x08 }
+ , { 0xA3C0, 0x0010, 0x01, 0x08 }
+ , { 0xA3C1, 0x0181, 0x01, 0x00 }
+ , { 0xA3C7, 0x0101, 0x01, 0x00 }
+ , { 0xA3DB, 0x0010, 0x0B, 0x08 }
+ , { 0xA3E1, 0x0182, 0x01, 0x00 }
+ , { 0xA3E7, 0x0102, 0x01, 0x00 }
+ , { 0xA3FB, 0x0010, 0x0B, 0x08 }
+ , { 0xA4A1, 0x0010, 0x0B, 0x08 }
+ , { 0xB0A1, 0x0100, 0x01, 0x00 }
+};
+#else
+static unsigned char NLSALLOC(0804) rgsortweight[] = {
+ 0x00 ,0x00 ,0x00 ,0x02 ,0x00 ,0x00
+ , 0x20 ,0x00 ,0x20 ,0x10 ,0x00 ,0x02
+ , 0x30 ,0x00 ,0x30 ,0x50 ,0x00 ,0x02
+ , 0x3A ,0x00 ,0x3A ,0x10 ,0x00 ,0x02
+ , 0x41 ,0x00 ,0x41 ,0x60 ,0x00 ,0x02
+ , 0x5B ,0x00 ,0x5B ,0x10 ,0x00 ,0x02
+ , 0x61 ,0x00 ,0x41 ,0x60 ,0x02 ,0x02
+ , 0x7B ,0x00 ,0x7B ,0x10 ,0x00 ,0x02
+ , 0x7F ,0x00 ,0xFF ,0xFF ,0x00 ,0xFF
+ , 0xA1 ,0xA1 ,0x20 ,0x10 ,0x01 ,0x02
+ , 0xA2 ,0xA1 ,0xA2 ,0x20 ,0x00 ,0x00
+ , 0xA1 ,0xA3 ,0x21 ,0x10 ,0x01 ,0x02
+ , 0xB0 ,0xA3 ,0x30 ,0x50 ,0x01 ,0x02
+ , 0xBA ,0xA3 ,0x3A ,0x10 ,0x01 ,0x02
+ , 0xC1 ,0xA3 ,0x41 ,0x60 ,0x01 ,0x02
+ , 0xDB ,0xA3 ,0x5B ,0x10 ,0x01 ,0x02
+ , 0xE1 ,0xA3 ,0x41 ,0x60 ,0x03 ,0x02
+ , 0xFB ,0xA3 ,0x7B ,0x10 ,0x01 ,0x02
+ , 0xA1 ,0xA4 ,0xA1 ,0x30 ,0x00 ,0x00
+ , 0xA1 ,0xA6 ,0xA1 ,0x32 ,0x01 ,0x02
+ , 0xC1 ,0xA6 ,0xA1 ,0x32 ,0x03 ,0x02
+ , 0xA1 ,0xA7 ,0xA1 ,0x33 ,0x01 ,0x02
+ , 0xD1 ,0xA7 ,0xA1 ,0x33 ,0x03 ,0x02
+ , 0xA1 ,0xA8 ,0xA1 ,0x34 ,0x00 ,0x00
+ , 0xA1 ,0xB0 ,0xA1 ,0xB0 ,0x00 ,0x00
+};
+
+static unsigned char NLSALLOC(0804) rgmaptable[] = {
+ 0x20 ,0x10 ,0x01 ,0x00 ,0x20 ,0x00
+ , 0xA1 ,0xA1 ,0x20 ,0x00 ,0xA1 ,0xA1
+ , 0x21 ,0x10 ,0x5F ,0x00 ,0x21 ,0x00
+ , 0xA1 ,0xA3 ,0x21 ,0x00 ,0xA1 ,0xA3
+ , 0xA1 ,0x32 ,0x18 ,0x00 ,0xA1 ,0xA6
+ , 0xA1 ,0xA6 ,0xC1 ,0xA6 ,0xC1 ,0xA6
+ , 0xA1 ,0x33 ,0x21 ,0x00 ,0xA1 ,0xA7
+ , 0xA1 ,0xA7 ,0xD1 ,0xA7 ,0xD1 ,0xA7
+ , 0x30 ,0x50 ,0x0A ,0x00 ,0x30 ,0x00
+ , 0xB0 ,0xA3 ,0x30 ,0x00 ,0xB0 ,0xA3
+ , 0x41 ,0x60 ,0x1A ,0x00 ,0x41 ,0x00
+ , 0xC1 ,0xA3 ,0x61 ,0x00 ,0xE1 ,0xA3
+};
+
+static unsigned char NLSALLOC(0804) rgtypetable[] = {
+ 0x00 ,0x00 ,0x20 ,0x00 ,0x00 ,0x00
+ , 0x09 ,0x00 ,0x68 ,0x00 ,0x09 ,0x00
+ , 0x0A ,0x00 ,0x28 ,0x00 ,0x00 ,0x00
+ , 0x0E ,0x00 ,0x20 ,0x00 ,0x00 ,0x00
+ , 0x20 ,0x00 ,0x48 ,0x00 ,0x0A ,0x00
+ , 0x21 ,0x00 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0x24 ,0x00 ,0x10 ,0x00 ,0x05 ,0x08
+ , 0x26 ,0x00 ,0x10 ,0x00 ,0x01 ,0x08
+ , 0x2B ,0x00 ,0x10 ,0x00 ,0x05 ,0x08
+ , 0x2C ,0x00 ,0x10 ,0x00 ,0x07 ,0x08
+ , 0x2D ,0x00 ,0x10 ,0x00 ,0x05 ,0x08
+ , 0x2E ,0x00 ,0x10 ,0x00 ,0x03 ,0x08
+ , 0x30 ,0x00 ,0x84 ,0x00 ,0x03 ,0x00
+ , 0x3A ,0x00 ,0x10 ,0x00 ,0x07 ,0x08
+ , 0x3B ,0x00 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0x40 ,0x00 ,0x10 ,0x00 ,0x01 ,0x08
+ , 0x41 ,0x00 ,0x81 ,0x01 ,0x01 ,0x00
+ , 0x47 ,0x00 ,0x01 ,0x01 ,0x01 ,0x00
+ , 0x5B ,0x00 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0x61 ,0x00 ,0x82 ,0x01 ,0x01 ,0x00
+ , 0x67 ,0x00 ,0x02 ,0x01 ,0x01 ,0x00
+ , 0x7B ,0x00 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0x7F ,0x00 ,0x20 ,0x00 ,0x00 ,0x00
+ , 0x80 ,0x00 ,0x00 ,0x00 ,0x0B ,0x08
+ , 0xA1 ,0xA1 ,0x48 ,0x00 ,0x0A ,0x00
+ , 0xA2 ,0xA1 ,0x00 ,0x00 ,0x0B ,0x08
+ , 0xA1 ,0xA3 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0xA4 ,0xA3 ,0x10 ,0x00 ,0x05 ,0x08
+ , 0xA6 ,0xA3 ,0x10 ,0x00 ,0x01 ,0x08
+ , 0xAB ,0xA3 ,0x10 ,0x00 ,0x05 ,0x08
+ , 0xAC ,0xA3 ,0x10 ,0x00 ,0x07 ,0x08
+ , 0xAD ,0xA3 ,0x10 ,0x00 ,0x05 ,0x08
+ , 0xAE ,0xA3 ,0x10 ,0x00 ,0x03 ,0x08
+ , 0xB0 ,0xA3 ,0x84 ,0x00 ,0x03 ,0x00
+ , 0xBA ,0xA3 ,0x10 ,0x00 ,0x07 ,0x08
+ , 0xBB ,0xA3 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0xC0 ,0xA3 ,0x10 ,0x00 ,0x01 ,0x08
+ , 0xC1 ,0xA3 ,0x81 ,0x01 ,0x01 ,0x00
+ , 0xC7 ,0xA3 ,0x01 ,0x01 ,0x01 ,0x00
+ , 0xDB ,0xA3 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0xE1 ,0xA3 ,0x82 ,0x01 ,0x01 ,0x00
+ , 0xE7 ,0xA3 ,0x02 ,0x01 ,0x01 ,0x00
+ , 0xFB ,0xA3 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0xA1 ,0xA4 ,0x10 ,0x00 ,0x0B ,0x08
+ , 0xA1 ,0xB0 ,0x00 ,0x01 ,0x01 ,0x00
+};
+#endif
+
+
+static unsigned char NLSALLOC(0804) rgbSENGCOUNTRY[] = {
+ 'P', 'e', 'o', 'p', 'l', 'e', 's', '\'', ' ',
+ 'R', 'e', 'p', 'u', 'b', 'l', 'i', 'c', ' ',
+ 'o', 'f', ' ',
+ 'C', 'h', 'i', 'n', 'a'
+};
+
+static unsigned char NLSALLOC(0804) rgbSENGLANGUAGE[] = {
+ 'C', 'h', 'i', 'n', 'e', 's', 'e'
+};
+
+#if defined(VBA2) //hand-edited this locale info based on daytona [bassam]
+static BYTE NLSALLOC(0804) rgbIFIRSTDAYOFWEEK[] = { /* "6" */
+ 0x36
+};
+
+static BYTE NLSALLOC(0804) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0804) rgbIDEFAULTANSICODEPAGE[] = { /* "936" */
+ 0x39, 0x33, 0x36
+};
+
+static BYTE NLSALLOC(0804) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0804) rgbSTIMEFORMAT[] = { /* "tt h:mm:ss" */
+ 0x74, 0x74, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0804) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0804) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0804) rgbIOPTIONALCALENDAR[] = { /* "2" */
+ 0x32
+};
+#endif
+
+
+static unsigned char NLSALLOC(0804) rgbILANGUAGE[] = {
+ '0', '8', '0', '4'
+};
+
+static unsigned char NLSALLOC(0804) rgbSLANGUAGE[] = {
+ 0xd6, 0xd0, 0xce, 0xc4, '(', 'C', 'h', 'i', 'n', 'e', 's', 'e', ' ', 'S', 'i', 'm', 'p', 'l', 'i', 'f', 'i', 'e', 'd', ')'
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVLANGNAME[] = {
+ 'C', 'H', 'S'
+};
+
+static unsigned char NLSALLOC(0804) rgbSNATIVELANGNAME[] = {
+ 0xd6, 0xd0, 0xce, 0xc4
+};
+
+static unsigned char NLSALLOC(0804) rgbICOUNTRY[] = { /* "86" */
+ '8', '6'
+};
+
+static unsigned char NLSALLOC(0804) rgbSCOUNTRY[] = {
+ 0xd6, 0xd0, 0xbb, 0xaa, 0xc8, 0xcb, 0xc3, 0xf1,
+ 0xb9, 0xb2, 0xba, 0xcd, 0xb9, 0xfa,
+ '(', 'C', 'h', 'i', 'n', 'a', ')'
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVCTRYNAME[] = {
+ 'C', 'H', 'N'
+};
+
+static unsigned char NLSALLOC(0804) rgbSNATIVECTRYNAME[] = {
+ 0xd6, 0xd0, 0xbb, 0xaa, 0xc8, 0xcb, 0xc3, 0xf1,
+ 0xb9, 0xb2, 0xba, 0xcd, 0xb9, 0xfa
+};
+
+static unsigned char NLSALLOC(0804) rgbIDEFAULTLANGUAGE[] = {
+ '0', '8', '0', '4'
+};
+
+static unsigned char NLSALLOC(0804) rgbIDEFAULTCOUNTRY[] = {
+ '0', '8', '6'
+};
+
+static unsigned char NLSALLOC(0804) rgbIDEFAULTCODEPAGE[] = {
+ '9', '3', '6'
+};
+
+static unsigned char NLSALLOC(0804) rgbSLIST[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0804) rgbIMEASURE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbSDECIMAL[] = {
+ '.'
+};
+
+static unsigned char NLSALLOC(0804) rgbSTHOUSAND[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0804) rgbSGROUPING[] = {
+ '3', ';', '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbIDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0804) rgbILZERO[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0804) rgbSNATIVEDIGITS[] = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
+};
+
+static unsigned char NLSALLOC(0804) rgbSCURRENCY[] = {
+ 0xa3, 0xa4
+};
+
+static unsigned char NLSALLOC(0804) rgbSINTLSYMBOL[] = {
+ 'C', 'N', 'Y'
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONDECIMALSEP[] = {
+ '.'
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHOUSANDSEP[] = {
+ ','
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONGROUPING[] = {
+ '3', ';', '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbICURRDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0804) rgbIINTLCURRDIGITS[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0804) rgbICURRENCY[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbINEGCURR[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbSDATE[] = {
+ '/'
+};
+
+static unsigned char NLSALLOC(0804) rgbSTIME[] = {
+ ':'
+};
+
+static unsigned char NLSALLOC(0804) rgbSSHORTDATE[] = {
+ 'y', 'y', 'y', 'y', '/', 'M', '/', 'd'
+};
+
+static unsigned char NLSALLOC(0804) rgbSLONGDATE[] = {
+ 'd', 'd', 'd', 'd', ',', ' ',
+ 'M', 'M', 'M', 'M', ' ',
+ 'd', ',', ' ',
+ 'y', 'y', 'y', 'y'
+};
+
+static unsigned char NLSALLOC(0804) rgbIDATE[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0804) rgbILDATE[] = {
+ '2'
+};
+
+static unsigned char NLSALLOC(0804) rgbITIME[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbICENTURY[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbITLZERO[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbIDAYLZERO[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbIMONLZERO[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbS1159[] = {
+ 0xc9, 0xcf, 0xce, 0xe7
+};
+
+static unsigned char NLSALLOC(0804) rgbS2359[] = {
+ 0xcf, 0xc2, 0xce, 0xe7
+};
+
+static unsigned char NLSALLOC(0804) rgbSDAYNAME1[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xd2, 0xbb
+};
+
+static unsigned char NLSALLOC(0804) rgbSDAYNAME2[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xb6, 0xfe
+};
+
+static unsigned char NLSALLOC(0804) rgbSDAYNAME3[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xc8, 0xfd
+};
+
+static unsigned char NLSALLOC(0804) rgbSDAYNAME4[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xcb, 0xc4
+};
+
+static unsigned char NLSALLOC(0804) rgbSDAYNAME5[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xce, 0xe5
+};
+
+static unsigned char NLSALLOC(0804) rgbSDAYNAME6[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xc1, 0xf9
+};
+
+static unsigned char NLSALLOC(0804) rgbSDAYNAME7[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xc8, 0xd5
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVDAYNAME1[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xd2, 0xbb
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVDAYNAME2[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xb6, 0xfe
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVDAYNAME3[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xc8, 0xfd
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVDAYNAME4[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xcb, 0xc4
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVDAYNAME5[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xce, 0xe5
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVDAYNAME6[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xc1, 0xf9
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVDAYNAME7[] = {
+ 0xd0, 0xc7, 0xc6, 0xda, 0xc8, 0xd5
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME1[] = {
+ 0xd2, 0xbb, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME2[] = {
+ 0xb6, 0xfe, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME3[] = {
+ 0xc8, 0xfd, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME4[] = {
+ 0xcb, 0xc4, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME5[] = {
+ 0xce, 0xe5, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME6[] = {
+ 0xc1, 0xf9, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME7[] = {
+ 0xc6, 0xdf, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME8[] = {
+ 0xb0, 0xcb, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME9[] = {
+ 0xbe, 0xc5, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME10[] = {
+ 0xca, 0xae, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME11[] = {
+ 0xca, 0xae, 0xd2, 0xbb, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSMONTHNAME12[] = {
+ 0xca, 0xae, 0xb6, 0xfe, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME1[] = {
+ 0xd2, 0xbb, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME2[] = {
+ 0xb6, 0xfe, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME3[] = {
+ 0xc8, 0xfd, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME4[] = {
+ 0xcb, 0xc4, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME5[] = {
+ 0xce, 0xe5, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME6[] = {
+ 0xc1, 0xf9, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME7[] = {
+ 0xc6, 0xdf, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME8[] = {
+ 0xb0, 0xcb, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME9[] = {
+ 0xbe, 0xc5, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME10[] = {
+ 0xca, 0xae, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME11[] = {
+ 0xca, 0xae, 0xd2, 0xbb, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSABBREVMONTHNAME12[] = {
+ 0xca, 0xae, 0xb6, 0xfe, 0xd4, 0xc2
+};
+
+static unsigned char NLSALLOC(0804) rgbSNEGATIVESIGN[] = {
+ '-'
+};
+
+static unsigned char NLSALLOC(0804) rgbIPOSSIGNPOSN[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0804) rgbINEGSIGNPOSN[] = {
+ '3'
+};
+
+static unsigned char NLSALLOC(0804) rgbIPOSSYMPRECEDES[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0804) rgbIPOSSEPBYSPACE[] = {
+ '0'
+};
+
+static unsigned char NLSALLOC(0804) rgbINEGSYMPRECEDES[] = {
+ '1'
+};
+
+static unsigned char NLSALLOC(0804) rgbINEGSEPBYSPACE[] = {
+ '0'
+};
+
+
+#define LCINFODAT(X) { DIM(X), (X) }
+LCINFO NLSALLOC(0804) g_rglcinfo0804[] = {
+ { 0, NULL}
+ , LCINFODAT(rgbILANGUAGE)
+ , LCINFODAT(rgbSLANGUAGE)
+ , LCINFODAT(rgbSABBREVLANGNAME)
+ , LCINFODAT(rgbSNATIVELANGNAME)
+ , LCINFODAT(rgbICOUNTRY)
+ , LCINFODAT(rgbSCOUNTRY)
+ , LCINFODAT(rgbSABBREVCTRYNAME)
+ , LCINFODAT(rgbSNATIVECTRYNAME)
+ , LCINFODAT(rgbIDEFAULTLANGUAGE)
+ , LCINFODAT(rgbIDEFAULTCOUNTRY)
+ , LCINFODAT(rgbIDEFAULTCODEPAGE)
+ , LCINFODAT(rgbSLIST)
+ , LCINFODAT(rgbIMEASURE)
+ , LCINFODAT(rgbSDECIMAL)
+ , LCINFODAT(rgbSTHOUSAND)
+ , LCINFODAT(rgbSGROUPING)
+ , LCINFODAT(rgbIDIGITS)
+ , LCINFODAT(rgbILZERO)
+ , LCINFODAT(rgbSNATIVEDIGITS)
+ , LCINFODAT(rgbSCURRENCY)
+ , LCINFODAT(rgbSINTLSYMBOL)
+ , LCINFODAT(rgbSMONDECIMALSEP)
+ , LCINFODAT(rgbSMONTHOUSANDSEP)
+ , LCINFODAT(rgbSMONGROUPING)
+ , LCINFODAT(rgbICURRDIGITS)
+ , LCINFODAT(rgbIINTLCURRDIGITS)
+ , LCINFODAT(rgbICURRENCY)
+ , LCINFODAT(rgbINEGCURR)
+ , LCINFODAT(rgbSDATE)
+ , LCINFODAT(rgbSTIME)
+ , LCINFODAT(rgbSSHORTDATE)
+ , LCINFODAT(rgbSLONGDATE)
+ , LCINFODAT(rgbIDATE)
+ , LCINFODAT(rgbILDATE)
+ , LCINFODAT(rgbITIME)
+ , LCINFODAT(rgbICENTURY)
+ , LCINFODAT(rgbITLZERO)
+ , LCINFODAT(rgbIDAYLZERO)
+ , LCINFODAT(rgbIMONLZERO)
+ , LCINFODAT(rgbS1159)
+ , LCINFODAT(rgbS2359)
+ , LCINFODAT(rgbSDAYNAME1)
+ , LCINFODAT(rgbSDAYNAME2)
+ , LCINFODAT(rgbSDAYNAME3)
+ , LCINFODAT(rgbSDAYNAME4)
+ , LCINFODAT(rgbSDAYNAME5)
+ , LCINFODAT(rgbSDAYNAME6)
+ , LCINFODAT(rgbSDAYNAME7)
+ , LCINFODAT(rgbSABBREVDAYNAME1)
+ , LCINFODAT(rgbSABBREVDAYNAME2)
+ , LCINFODAT(rgbSABBREVDAYNAME3)
+ , LCINFODAT(rgbSABBREVDAYNAME4)
+ , LCINFODAT(rgbSABBREVDAYNAME5)
+ , LCINFODAT(rgbSABBREVDAYNAME6)
+ , LCINFODAT(rgbSABBREVDAYNAME7)
+ , LCINFODAT(rgbSMONTHNAME1)
+ , LCINFODAT(rgbSMONTHNAME2)
+ , LCINFODAT(rgbSMONTHNAME3)
+ , LCINFODAT(rgbSMONTHNAME4)
+ , LCINFODAT(rgbSMONTHNAME5)
+ , LCINFODAT(rgbSMONTHNAME6)
+ , LCINFODAT(rgbSMONTHNAME7)
+ , LCINFODAT(rgbSMONTHNAME8)
+ , LCINFODAT(rgbSMONTHNAME9)
+ , LCINFODAT(rgbSMONTHNAME10)
+ , LCINFODAT(rgbSMONTHNAME11)
+ , LCINFODAT(rgbSMONTHNAME12)
+ , LCINFODAT(rgbSABBREVMONTHNAME1)
+ , LCINFODAT(rgbSABBREVMONTHNAME2)
+ , LCINFODAT(rgbSABBREVMONTHNAME3)
+ , LCINFODAT(rgbSABBREVMONTHNAME4)
+ , LCINFODAT(rgbSABBREVMONTHNAME5)
+ , LCINFODAT(rgbSABBREVMONTHNAME6)
+ , LCINFODAT(rgbSABBREVMONTHNAME7)
+ , LCINFODAT(rgbSABBREVMONTHNAME8)
+ , LCINFODAT(rgbSABBREVMONTHNAME9)
+ , LCINFODAT(rgbSABBREVMONTHNAME10)
+ , LCINFODAT(rgbSABBREVMONTHNAME11)
+ , LCINFODAT(rgbSABBREVMONTHNAME12)
+ , { 0, NULL }
+ , LCINFODAT(rgbSNEGATIVESIGN)
+ , LCINFODAT(rgbIPOSSIGNPOSN)
+ , LCINFODAT(rgbINEGSIGNPOSN)
+ , LCINFODAT(rgbIPOSSYMPRECEDES)
+ , LCINFODAT(rgbIPOSSEPBYSPACE)
+ , LCINFODAT(rgbINEGSYMPRECEDES)
+ , LCINFODAT(rgbINEGSEPBYSPACE)
+ , LCINFODAT(rgbSENGCOUNTRY)
+ , LCINFODAT(rgbSENGLANGUAGE)
+#if defined(VBA2)
+ , LCINFODAT(rgbIFIRSTDAYOFWEEK)
+ , LCINFODAT(rgbIFIRSTWEEKOFYEAR)
+ , LCINFODAT(rgbIDEFAULTANSICODEPAGE)
+ , LCINFODAT(rgbINEGNUMBER)
+ , LCINFODAT(rgbSTIMEFORMAT)
+ , LCINFODAT(rgbITIMEMARKPOSN)
+ , LCINFODAT(rgbICALENDARTYPE)
+ , LCINFODAT(rgbIOPTIONALCALENDAR)
+ , { 0, NULL }
+ , { 0, NULL }
+#endif
+};
+#undef LCINFODAT
+
+
+#if 1
+STRINFO_KTP NLSALLOC(0804) g_strinfo0804 = {
+ rgsortweight
+ , rgmaptable
+ , rgtypetable
+ , DIM(rgsortweight)
+ , DIM(rgmaptable)
+ , DIM(rgtypetable)
+};
+#else
+STRINFO_KTP NLSALLOC(0804) g_strinfo0804 = {
+ (SORTWEIGHT FAR*) rgsortweight
+ , (MAPTABLE FAR*) rgmaptable
+ , (TYPETABLE FAR*) rgtypetable
+ , DIM(rgsortweight)
+ , DIM(rgmaptable)
+ , DIM(rgtypetable)
+};
+#endif
diff --git a/private/oleauto/src/dispatch/win16/0807.c b/private/oleauto/src/dispatch/win16/0807.c
new file mode 100644
index 000000000..49e483d8d
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0807.c
@@ -0,0 +1,518 @@
+/****************************************************************************
+* 0807.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* German - Switzerland
+*
+* LCID = 0x0807
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:40:13 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0807) rgbILANGUAGE[] = { /* "0807" */
+ 0x30, 0x38, 0x30, 0x37
+};
+
+static BYTE NLSALLOC(0807) rgbSLANGUAGE[] = { /* "Swiss German" */
+ 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x47, 0x65
+ , 0x72, 0x6d, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVLANGNAME[] = { /* "DES" */
+ 0x44, 0x45, 0x53
+};
+
+static BYTE NLSALLOC(0807) rgbSNATIVELANGNAME[] = { /* "Deutsch" */
+ 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0807) rgbICOUNTRY[] = { /* "41" */
+ 0x34, 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbSCOUNTRY[] = { /* "Switzerland" */
+ 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVCTRYNAME[] = { /* "CHE" */
+ 0x43, 0x48, 0x45
+};
+
+static BYTE NLSALLOC(0807) rgbSNATIVECTRYNAME[] = { /* "Schweiz" */
+ 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a
+};
+
+static BYTE NLSALLOC(0807) rgbIDEFAULTLANGUAGE[] = { /* "0807" */
+ 0x30, 0x38, 0x30, 0x37
+};
+
+static BYTE NLSALLOC(0807) rgbIDEFAULTCOUNTRY[] = { /* "41" */
+ 0x34, 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0807) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0807) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0807) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0807) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0807) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0807) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0807) rgbSCURRENCY[] = { /* "CHF" */
+ 0x43, 0x48, 0x46
+};
+
+static BYTE NLSALLOC(0807) rgbSINTLSYMBOL[] = { /* "CHF" */
+ 0x43, 0x48, 0x46
+};
+
+static BYTE NLSALLOC(0807) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0807) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0807) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0807) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0807) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0807) rgbINEGCURR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0807) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0807) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0807) rgbSSHORTDATE[] = { /* "dd.MM.yy" */
+ 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0807) rgbSLONGDATE[] = { /* "dddd, d. MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e
+ , 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0807) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0807) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbSDAYNAME1[] = { /* "Montag" */
+ 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0807) rgbSDAYNAME2[] = { /* "Dienstag" */
+ 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0807) rgbSDAYNAME3[] = { /* "Mittwoch" */
+ 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0807) rgbSDAYNAME4[] = { /* "Donnerstag" */
+ 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74
+ , 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0807) rgbSDAYNAME5[] = { /* "Freitag" */
+ 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0807) rgbSDAYNAME6[] = { /* "Samstag" */
+ 0x53, 0x61, 0x6d, 0x73, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0807) rgbSDAYNAME7[] = { /* "Sonntag" */
+ 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVDAYNAME1[] = { /* "Mo" */
+ 0x4d, 0x6f
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVDAYNAME2[] = { /* "Di" */
+ 0x44, 0x69
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVDAYNAME3[] = { /* "Mi" */
+ 0x4d, 0x69
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVDAYNAME4[] = { /* "Do" */
+ 0x44, 0x6f
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVDAYNAME5[] = { /* "Fr" */
+ 0x46, 0x72
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVDAYNAME6[] = { /* "Sa" */
+ 0x53, 0x61
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVDAYNAME7[] = { /* "So" */
+ 0x53, 0x6f
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME1[] = { /* "Januar" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME2[] = { /* "Februar" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME3[] = { /* "März" */
+ 0x4d, 0xe4, 0x72, 0x7a
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME5[] = { /* "Mai" */
+ 0x4d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME6[] = { /* "Juni" */
+ 0x4a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME7[] = { /* "Juli" */
+ 0x4a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME10[] = { /* "Oktober" */
+ 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0807) rgbSMONTHNAME12[] = { /* "Dezember" */
+ 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME3[] = { /* "Mrz" */
+ 0x4d, 0x72, 0x7a
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME5[] = { /* "Mai" */
+ 0x4d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME10[] = { /* "Okt" */
+ 0x4f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0807) rgbSABBREVMONTHNAME12[] = { /* "Dez" */
+ 0x44, 0x65, 0x7a
+};
+
+static BYTE NLSALLOC(0807) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0807) rgbIPOSSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0807) rgbINEGSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0807) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0807) rgbSENGCOUNTRY[] = { /* "Switzerland" */
+ 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(0807) rgbSENGLANGUAGE[] = { /* "German" */
+ 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0807) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0807) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0807) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0807) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0807) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0807) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0807) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0807) g_rglcinfo0807[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 12, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 11, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 7, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 0, NULL } /* STHOUSAND */
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 0, NULL } /* SMONTHOUSANDSEP */
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 18, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 8, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 10, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 7, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 11, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0807) g_strinfo0807 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0809.c b/private/oleauto/src/dispatch/win16/0809.c
new file mode 100644
index 000000000..717035ac0
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0809.c
@@ -0,0 +1,525 @@
+/****************************************************************************
+* 0809.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* English - United Kingdom
+*
+* LCID = 0x0809
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:40:48 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0809) rgbILANGUAGE[] = { /* "0809" */
+ 0x30, 0x38, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(0809) rgbSLANGUAGE[] = { /* "U.K. English" */
+ 0x55, 0x2e, 0x4b, 0x2e, 0x20, 0x45, 0x6e, 0x67
+ , 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVLANGNAME[] = { /* "ENG" */
+ 0x45, 0x4e, 0x47
+};
+
+static BYTE NLSALLOC(0809) rgbSNATIVELANGNAME[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0809) rgbICOUNTRY[] = { /* "44" */
+ 0x34, 0x34
+};
+
+static BYTE NLSALLOC(0809) rgbSCOUNTRY[] = { /* "United Kingdom" */
+ 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b
+ , 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVCTRYNAME[] = { /* "GBR" */
+ 0x47, 0x42, 0x52
+};
+
+static BYTE NLSALLOC(0809) rgbSNATIVECTRYNAME[] = { /* "England" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(0809) rgbIDEFAULTLANGUAGE[] = { /* "0809" */
+ 0x30, 0x38, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(0809) rgbIDEFAULTCOUNTRY[] = { /* "44" */
+ 0x34, 0x34
+};
+
+static BYTE NLSALLOC(0809) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0809) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0809) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0809) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0809) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0809) rgbSCURRENCY[] = { /* "£" */
+ 0xa3
+};
+
+static BYTE NLSALLOC(0809) rgbSINTLSYMBOL[] = { /* "GBP" */
+ 0x47, 0x42, 0x50
+};
+
+static BYTE NLSALLOC(0809) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0809) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0809) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0809) rgbICURRENCY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbINEGCURR[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0809) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0809) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSLONGDATE[] = { /* "dd MMMM yyyy" */
+ 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbSDAYNAME1[] = { /* "Monday" */
+ 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSDAYNAME2[] = { /* "Tuesday" */
+ 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSDAYNAME3[] = { /* "Wednesday" */
+ 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61
+ , 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSDAYNAME4[] = { /* "Thursday" */
+ 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSDAYNAME5[] = { /* "Friday" */
+ 0x46, 0x72, 0x69, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSDAYNAME6[] = { /* "Saturday" */
+ 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSDAYNAME7[] = { /* "Sunday" */
+ 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVDAYNAME1[] = { /* "Mon" */
+ 0x4d, 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVDAYNAME2[] = { /* "Tue" */
+ 0x54, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVDAYNAME3[] = { /* "Wed" */
+ 0x57, 0x65, 0x64
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVDAYNAME4[] = { /* "Thu" */
+ 0x54, 0x68, 0x75
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVDAYNAME5[] = { /* "Fri" */
+ 0x46, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVDAYNAME6[] = { /* "Sat" */
+ 0x53, 0x61, 0x74
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVDAYNAME7[] = { /* "Sun" */
+ 0x53, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME1[] = { /* "January" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME2[] = { /* "February" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME3[] = { /* "March" */
+ 0x4d, 0x61, 0x72, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME6[] = { /* "June" */
+ 0x4a, 0x75, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME7[] = { /* "July" */
+ 0x4a, 0x75, 0x6c, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME10[] = { /* "October" */
+ 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0809) rgbSMONTHNAME12[] = { /* "December" */
+ 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME3[] = { /* "Mar" */
+ 0x4d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME10[] = { /* "Oct" */
+ 0x4f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0809) rgbSABBREVMONTHNAME12[] = { /* "Dec" */
+ 0x44, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0809) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0809) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0809) rgbINEGSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0809) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbIPOSSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbSENGCOUNTRY[] = { /* "United Kingdom" */
+ 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b
+ , 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(0809) rgbSENGLANGUAGE[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0809) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0809) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0809) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0809) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0809) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0809) g_rglcinfo0809[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 12, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 14, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 7, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 14, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0809) g_strinfo0809 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/080a.c b/private/oleauto/src/dispatch/win16/080a.c
new file mode 100644
index 000000000..e237d4a6f
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/080a.c
@@ -0,0 +1,537 @@
+/****************************************************************************
+* 080a.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Spanish - Mexico
+*
+* LCID = 0x080a
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:53:00 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_040a[256]; // from 040a:Spanish - Spain (Traditional Sort)
+extern EXPANSION rgexp_040a[7];
+extern DIGRAPH rgdig_040a[10];
+extern WORD rgwCType12_040a[256];
+extern WORD rgwCType3_040a[256];
+extern BYTE rgbUCase_040a[256];
+extern BYTE rgbLCase_040a[256];
+
+static BYTE NLSALLOC(080a) rgbILANGUAGE[] = { /* "080a" */
+ 0x30, 0x38, 0x30, 0x61
+};
+
+static BYTE NLSALLOC(080a) rgbSLANGUAGE[] = { /* "Mexican Spanish" */
+ 0x4d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x20
+ , 0x53, 0x70, 0x61, 0x6e, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVLANGNAME[] = { /* "ESM" */
+ 0x45, 0x53, 0x4d
+};
+
+static BYTE NLSALLOC(080a) rgbSNATIVELANGNAME[] = { /* "Español" */
+ 0x45, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c
+};
+
+static BYTE NLSALLOC(080a) rgbICOUNTRY[] = { /* "52" */
+ 0x35, 0x32
+};
+
+static BYTE NLSALLOC(080a) rgbSCOUNTRY[] = { /* "Mexico" */
+ 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVCTRYNAME[] = { /* "MEX" */
+ 0x4d, 0x45, 0x58
+};
+
+static BYTE NLSALLOC(080a) rgbSNATIVECTRYNAME[] = { /* "México" */
+ 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbIDEFAULTLANGUAGE[] = { /* "080a" */
+ 0x30, 0x38, 0x30, 0x61
+};
+
+static BYTE NLSALLOC(080a) rgbIDEFAULTCOUNTRY[] = { /* "52" */
+ 0x35, 0x32
+};
+
+static BYTE NLSALLOC(080a) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(080a) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(080a) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(080a) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(080a) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080a) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(080a) rgbSCURRENCY[] = { /* "N$" */
+ 0x4e, 0x24
+};
+
+static BYTE NLSALLOC(080a) rgbSINTLSYMBOL[] = { /* "MXN" */
+ 0x4d, 0x58, 0x4e
+};
+
+static BYTE NLSALLOC(080a) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(080a) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(080a) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(080a) rgbICURRENCY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbINEGCURR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(080a) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(080a) rgbSSHORTDATE[] = { /* "d/MM/yy" */
+ 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(080a) rgbSLONGDATE[] = { /* "dddd d' de 'MMMM' de 'yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x27, 0x20
+ , 0x64, 0x65, 0x20, 0x27, 0x4d, 0x4d, 0x4d, 0x4d
+ , 0x27, 0x20, 0x64, 0x65, 0x20, 0x27, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(080a) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080a) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080a) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080a) rgbS1159[] = { /* "AM" */
+ 0x41, 0x4d
+};
+
+static BYTE NLSALLOC(080a) rgbS2359[] = { /* "PM" */
+ 0x50, 0x4d
+};
+
+static BYTE NLSALLOC(080a) rgbSDAYNAME1[] = { /* "lunes" */
+ 0x6c, 0x75, 0x6e, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(080a) rgbSDAYNAME2[] = { /* "martes" */
+ 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(080a) rgbSDAYNAME3[] = { /* "miércoles" */
+ 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65
+ , 0x73
+};
+
+static BYTE NLSALLOC(080a) rgbSDAYNAME4[] = { /* "jueves" */
+ 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(080a) rgbSDAYNAME5[] = { /* "viernes" */
+ 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(080a) rgbSDAYNAME6[] = { /* "sábado" */
+ 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSDAYNAME7[] = { /* "domingo" */
+ 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVDAYNAME1[] = { /* "lun" */
+ 0x6c, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVDAYNAME2[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVDAYNAME3[] = { /* "mié" */
+ 0x6d, 0x69, 0xe9
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVDAYNAME4[] = { /* "jue" */
+ 0x6a, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVDAYNAME5[] = { /* "vie" */
+ 0x76, 0x69, 0x65
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVDAYNAME6[] = { /* "sáb" */
+ 0x73, 0xe1, 0x62
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVDAYNAME7[] = { /* "dom" */
+ 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME1[] = { /* "enero" */
+ 0x65, 0x6e, 0x65, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME2[] = { /* "febrero" */
+ 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME3[] = { /* "marzo" */
+ 0x6d, 0x61, 0x72, 0x7a, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME4[] = { /* "abril" */
+ 0x61, 0x62, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME5[] = { /* "mayo" */
+ 0x6d, 0x61, 0x79, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME6[] = { /* "junio" */
+ 0x6a, 0x75, 0x6e, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME7[] = { /* "julio" */
+ 0x6a, 0x75, 0x6c, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME8[] = { /* "agosto" */
+ 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME9[] = { /* "septiembre" */
+ 0x73, 0x65, 0x70, 0x74, 0x69, 0x65, 0x6d, 0x62
+ , 0x72, 0x65
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME10[] = { /* "octubre" */
+ 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME11[] = { /* "noviembre" */
+ 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(080a) rgbSMONTHNAME12[] = { /* "diciembre" */
+ 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME1[] = { /* "ene" */
+ 0x65, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME4[] = { /* "abr" */
+ 0x61, 0x62, 0x72
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME5[] = { /* "may" */
+ 0x6d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME8[] = { /* "ago" */
+ 0x61, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME10[] = { /* "oct" */
+ 0x6f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(080a) rgbSABBREVMONTHNAME12[] = { /* "dic" */
+ 0x64, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(080a) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(080a) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(080a) rgbINEGSIGNPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080a) rgbIPOSSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080a) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbSENGCOUNTRY[] = { /* "Mexico" */
+ 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f
+};
+
+static BYTE NLSALLOC(080a) rgbSENGLANGUAGE[] = { /* "Spanish" */
+ 0x53, 0x70, 0x61, 0x6e, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(080a) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(080a) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080a) rgbSTIMEFORMAT[] = { /* "h:mm:ss tt" */
+ 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20
+ , 0x74, 0x74
+};
+
+static BYTE NLSALLOC(080a) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080a) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080a) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(080a) g_rglcinfo080a[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 15, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 26, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 2, rgbS1159 }
+ , { 2, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 6, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 6, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 10, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 9, rgbSMONTHNAME11 }
+ , { 9, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 10, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(080a) g_strinfo080a = {
+ rgbUCase_040a
+ , rgbLCase_040a
+ , rgwCType12_040a
+ , rgwCType3_040a
+ , rgwSort_040a
+ , rgexp_040a
+ , rgdig_040a
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/080c.c b/private/oleauto/src/dispatch/win16/080c.c
new file mode 100644
index 000000000..22610e3a3
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/080c.c
@@ -0,0 +1,522 @@
+/****************************************************************************
+* 080c.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* French - Belgium
+*
+* LCID = 0x080c
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:41:24 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(080c) rgbILANGUAGE[] = { /* "080c" */
+ 0x30, 0x38, 0x30, 0x63
+};
+
+static BYTE NLSALLOC(080c) rgbSLANGUAGE[] = { /* "Belgian French" */
+ 0x42, 0x65, 0x6c, 0x67, 0x69, 0x61, 0x6e, 0x20
+ , 0x46, 0x72, 0x65, 0x6e, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVLANGNAME[] = { /* "FRB" */
+ 0x46, 0x52, 0x42
+};
+
+static BYTE NLSALLOC(080c) rgbSNATIVELANGNAME[] = { /* "français" */
+ 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73
+};
+
+static BYTE NLSALLOC(080c) rgbICOUNTRY[] = { /* "32" */
+ 0x33, 0x32
+};
+
+static BYTE NLSALLOC(080c) rgbSCOUNTRY[] = { /* "Belgium" */
+ 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVCTRYNAME[] = { /* "BEL" */
+ 0x42, 0x45, 0x4c
+};
+
+static BYTE NLSALLOC(080c) rgbSNATIVECTRYNAME[] = { /* "Belgique" */
+ 0x42, 0x65, 0x6c, 0x67, 0x69, 0x71, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(080c) rgbIDEFAULTLANGUAGE[] = { /* "080c" */
+ 0x30, 0x38, 0x30, 0x63
+};
+
+static BYTE NLSALLOC(080c) rgbIDEFAULTCOUNTRY[] = { /* "32" */
+ 0x33, 0x32
+};
+
+static BYTE NLSALLOC(080c) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(080c) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(080c) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(080c) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(080c) rgbSCURRENCY[] = { /* "FB" */
+ 0x46, 0x42
+};
+
+static BYTE NLSALLOC(080c) rgbSINTLSYMBOL[] = { /* "BEF" */
+ 0x42, 0x45, 0x46
+};
+
+static BYTE NLSALLOC(080c) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(080c) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(080c) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(080c) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(080c) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(080c) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(080c) rgbSSHORTDATE[] = { /* "d/MM/yy" */
+ 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(080c) rgbSLONGDATE[] = { /* "dddd d MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d
+ , 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(080c) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbSDAYNAME1[] = { /* "lundi" */
+ 0x6c, 0x75, 0x6e, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(080c) rgbSDAYNAME2[] = { /* "mardi" */
+ 0x6d, 0x61, 0x72, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(080c) rgbSDAYNAME3[] = { /* "mercredi" */
+ 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(080c) rgbSDAYNAME4[] = { /* "jeudi" */
+ 0x6a, 0x65, 0x75, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(080c) rgbSDAYNAME5[] = { /* "vendredi" */
+ 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(080c) rgbSDAYNAME6[] = { /* "samedi" */
+ 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(080c) rgbSDAYNAME7[] = { /* "dimanche" */
+ 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVDAYNAME1[] = { /* "lun." */
+ 0x6c, 0x75, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVDAYNAME2[] = { /* "mar." */
+ 0x6d, 0x61, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVDAYNAME3[] = { /* "mer." */
+ 0x6d, 0x65, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVDAYNAME4[] = { /* "jeu." */
+ 0x6a, 0x65, 0x75, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVDAYNAME5[] = { /* "ven." */
+ 0x76, 0x65, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVDAYNAME6[] = { /* "sam." */
+ 0x73, 0x61, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVDAYNAME7[] = { /* "dim." */
+ 0x64, 0x69, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME1[] = { /* "janvier" */
+ 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME2[] = { /* "février" */
+ 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME4[] = { /* "avril" */
+ 0x61, 0x76, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME6[] = { /* "juin" */
+ 0x6a, 0x75, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME7[] = { /* "juillet" */
+ 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME8[] = { /* "août" */
+ 0x61, 0x6f, 0xfb, 0x74
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME9[] = { /* "septembre" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME10[] = { /* "octobre" */
+ 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME11[] = { /* "novembre" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(080c) rgbSMONTHNAME12[] = { /* "décembre" */
+ 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME1[] = { /* "janv." */
+ 0x6a, 0x61, 0x6e, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME2[] = { /* "févr." */
+ 0x66, 0xe9, 0x76, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME4[] = { /* "avr." */
+ 0x61, 0x76, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME6[] = { /* "juin" */
+ 0x6a, 0x75, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME7[] = { /* "juil." */
+ 0x6a, 0x75, 0x69, 0x6c, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME8[] = { /* "août" */
+ 0x61, 0x6f, 0xfb, 0x74
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME9[] = { /* "sept." */
+ 0x73, 0x65, 0x70, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME10[] = { /* "oct." */
+ 0x6f, 0x63, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME11[] = { /* "nov." */
+ 0x6e, 0x6f, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSABBREVMONTHNAME12[] = { /* "déc." */
+ 0x64, 0xe9, 0x63, 0x2e
+};
+
+static BYTE NLSALLOC(080c) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(080c) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbSENGCOUNTRY[] = { /* "Belgium" */
+ 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d
+};
+
+static BYTE NLSALLOC(080c) rgbSENGLANGUAGE[] = { /* "French" */
+ 0x46, 0x72, 0x65, 0x6e, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(080c) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(080c) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(080c) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(080c) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(080c) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(080c) g_rglcinfo080c[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 14, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 8, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 8, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 16, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 5, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 8, rgbSDAYNAME7 }
+ , { 4, rgbSABBREVDAYNAME1 }
+ , { 4, rgbSABBREVDAYNAME2 }
+ , { 4, rgbSABBREVDAYNAME3 }
+ , { 4, rgbSABBREVDAYNAME4 }
+ , { 4, rgbSABBREVDAYNAME5 }
+ , { 4, rgbSABBREVDAYNAME6 }
+ , { 4, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 7, rgbSMONTHNAME7 }
+ , { 4, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 5, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 4, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 4, rgbSABBREVMONTHNAME11 }
+ , { 4, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(080c) g_strinfo080c = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0810.c b/private/oleauto/src/dispatch/win16/0810.c
new file mode 100644
index 000000000..ec820a87e
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0810.c
@@ -0,0 +1,518 @@
+/****************************************************************************
+* 0810.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Italian - Switzerland
+*
+* LCID = 0x0810
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:42:00 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0810) rgbILANGUAGE[] = { /* "0810" */
+ 0x30, 0x38, 0x31, 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbSLANGUAGE[] = { /* "Swiss Italian" */
+ 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x49, 0x74
+ , 0x61, 0x6c, 0x69, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVLANGNAME[] = { /* "ITS" */
+ 0x49, 0x54, 0x53
+};
+
+static BYTE NLSALLOC(0810) rgbSNATIVELANGNAME[] = { /* "Italiano" */
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbICOUNTRY[] = { /* "41" */
+ 0x34, 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbSCOUNTRY[] = { /* "Switzerland" */
+ 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVCTRYNAME[] = { /* "CHE" */
+ 0x43, 0x48, 0x45
+};
+
+static BYTE NLSALLOC(0810) rgbSNATIVECTRYNAME[] = { /* "Svizzera" */
+ 0x53, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0810) rgbIDEFAULTLANGUAGE[] = { /* "0810" */
+ 0x30, 0x38, 0x31, 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbIDEFAULTCOUNTRY[] = { /* "41" */
+ 0x34, 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0810) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0810) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0810) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0810) rgbSCURRENCY[] = { /* "CHF" */
+ 0x43, 0x48, 0x46
+};
+
+static BYTE NLSALLOC(0810) rgbSINTLSYMBOL[] = { /* "CHF" */
+ 0x43, 0x48, 0x46
+};
+
+static BYTE NLSALLOC(0810) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0810) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0810) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0810) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0810) rgbINEGCURR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0810) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0810) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0810) rgbSSHORTDATE[] = { /* "dd.MM.yy" */
+ 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0810) rgbSLONGDATE[] = { /* "dddd, d. MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e
+ , 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0810) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbSDAYNAME1[] = { /* "lunedì" */
+ 0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec
+};
+
+static BYTE NLSALLOC(0810) rgbSDAYNAME2[] = { /* "martedì" */
+ 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec
+};
+
+static BYTE NLSALLOC(0810) rgbSDAYNAME3[] = { /* "mercoledì" */
+ 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64
+ , 0xec
+};
+
+static BYTE NLSALLOC(0810) rgbSDAYNAME4[] = { /* "giovedì" */
+ 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec
+};
+
+static BYTE NLSALLOC(0810) rgbSDAYNAME5[] = { /* "venerdì" */
+ 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xec
+};
+
+static BYTE NLSALLOC(0810) rgbSDAYNAME6[] = { /* "sabato" */
+ 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSDAYNAME7[] = { /* "domenica" */
+ 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVDAYNAME1[] = { /* "lun" */
+ 0x6c, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVDAYNAME2[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVDAYNAME3[] = { /* "mer" */
+ 0x6d, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVDAYNAME4[] = { /* "gio" */
+ 0x67, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVDAYNAME5[] = { /* "ven" */
+ 0x76, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVDAYNAME6[] = { /* "sab" */
+ 0x73, 0x61, 0x62
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVDAYNAME7[] = { /* "dom" */
+ 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME1[] = { /* "gennaio" */
+ 0x67, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME2[] = { /* "febbraio" */
+ 0x66, 0x65, 0x62, 0x62, 0x72, 0x61, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME3[] = { /* "marzo" */
+ 0x6d, 0x61, 0x72, 0x7a, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME4[] = { /* "aprile" */
+ 0x61, 0x70, 0x72, 0x69, 0x6c, 0x65
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME5[] = { /* "maggio" */
+ 0x6d, 0x61, 0x67, 0x67, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME6[] = { /* "giugno" */
+ 0x67, 0x69, 0x75, 0x67, 0x6e, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME7[] = { /* "luglio" */
+ 0x6c, 0x75, 0x67, 0x6c, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME8[] = { /* "agosto" */
+ 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME9[] = { /* "settembre" */
+ 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME10[] = { /* "ottobre" */
+ 0x6f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME11[] = { /* "novembre" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0810) rgbSMONTHNAME12[] = { /* "dicembre" */
+ 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME1[] = { /* "gen" */
+ 0x67, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME4[] = { /* "apr" */
+ 0x61, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME5[] = { /* "mag" */
+ 0x6d, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME6[] = { /* "gio" */
+ 0x67, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME7[] = { /* "lug" */
+ 0x6c, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME8[] = { /* "ago" */
+ 0x61, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME9[] = { /* "set" */
+ 0x73, 0x65, 0x74
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME10[] = { /* "ott" */
+ 0x6f, 0x74, 0x74
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0810) rgbSABBREVMONTHNAME12[] = { /* "dic" */
+ 0x64, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0810) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0810) rgbIPOSSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0810) rgbINEGSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0810) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbSENGCOUNTRY[] = { /* "Switzerland" */
+ 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(0810) rgbSENGLANGUAGE[] = { /* "Italian" */
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0810) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0810) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0810) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0810) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0810) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0810) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0810) g_rglcinfo0810[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 13, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 8, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 11, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 8, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 0, NULL } /* STHOUSAND */
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 0, NULL } /* SMONTHOUSANDSEP */
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 18, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 8, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 6, rgbSMONTHNAME4 }
+ , { 6, rgbSMONTHNAME5 }
+ , { 6, rgbSMONTHNAME6 }
+ , { 6, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 11, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0810) g_strinfo0810 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0813.c b/private/oleauto/src/dispatch/win16/0813.c
new file mode 100644
index 000000000..17439365b
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0813.c
@@ -0,0 +1,524 @@
+/****************************************************************************
+* 0813.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Dutch - Belgium
+*
+* LCID = 0x0813
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:42:39 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0813) rgbILANGUAGE[] = { /* "0813" */
+ 0x30, 0x38, 0x31, 0x33
+};
+
+static BYTE NLSALLOC(0813) rgbSLANGUAGE[] = { /* "Belgian Dutch" */
+ 0x42, 0x65, 0x6c, 0x67, 0x69, 0x61, 0x6e, 0x20
+ , 0x44, 0x75, 0x74, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVLANGNAME[] = { /* "NLB" */
+ 0x4e, 0x4c, 0x42
+};
+
+static BYTE NLSALLOC(0813) rgbSNATIVELANGNAME[] = { /* "Nederlands" */
+ 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e
+ , 0x64, 0x73
+};
+
+static BYTE NLSALLOC(0813) rgbICOUNTRY[] = { /* "32" */
+ 0x33, 0x32
+};
+
+static BYTE NLSALLOC(0813) rgbSCOUNTRY[] = { /* "Belgium" */
+ 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVCTRYNAME[] = { /* "BEL" */
+ 0x42, 0x45, 0x4c
+};
+
+static BYTE NLSALLOC(0813) rgbSNATIVECTRYNAME[] = { /* "België" */
+ 0x42, 0x65, 0x6c, 0x67, 0x69, 0xeb
+};
+
+static BYTE NLSALLOC(0813) rgbIDEFAULTLANGUAGE[] = { /* "0813" */
+ 0x30, 0x38, 0x31, 0x33
+};
+
+static BYTE NLSALLOC(0813) rgbIDEFAULTCOUNTRY[] = { /* "32" */
+ 0x33, 0x32
+};
+
+static BYTE NLSALLOC(0813) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0813) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0813) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0813) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0813) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0813) rgbSCURRENCY[] = { /* "BF" */
+ 0x42, 0x46
+};
+
+static BYTE NLSALLOC(0813) rgbSINTLSYMBOL[] = { /* "BEF" */
+ 0x42, 0x45, 0x46
+};
+
+static BYTE NLSALLOC(0813) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0813) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0813) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0813) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0813) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(0813) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0813) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0813) rgbSSHORTDATE[] = { /* "d/MM/yy" */
+ 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0813) rgbSLONGDATE[] = { /* "dddd d MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x4d
+ , 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0813) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbSDAYNAME1[] = { /* "maandag" */
+ 0x6d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0813) rgbSDAYNAME2[] = { /* "dinsdag" */
+ 0x64, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0813) rgbSDAYNAME3[] = { /* "woensdag" */
+ 0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0813) rgbSDAYNAME4[] = { /* "donderdag" */
+ 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61
+ , 0x67
+};
+
+static BYTE NLSALLOC(0813) rgbSDAYNAME5[] = { /* "vrijdag" */
+ 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0813) rgbSDAYNAME6[] = { /* "zaterdag" */
+ 0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0813) rgbSDAYNAME7[] = { /* "zondag" */
+ 0x7a, 0x6f, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVDAYNAME1[] = { /* "ma" */
+ 0x6d, 0x61
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVDAYNAME2[] = { /* "di" */
+ 0x64, 0x69
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVDAYNAME3[] = { /* "wo" */
+ 0x77, 0x6f
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVDAYNAME4[] = { /* "do" */
+ 0x64, 0x6f
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVDAYNAME5[] = { /* "vr" */
+ 0x76, 0x72
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVDAYNAME6[] = { /* "za" */
+ 0x7a, 0x61
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVDAYNAME7[] = { /* "zo" */
+ 0x7a, 0x6f
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME1[] = { /* "januari" */
+ 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME2[] = { /* "februari" */
+ 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME3[] = { /* "maart" */
+ 0x6d, 0x61, 0x61, 0x72, 0x74
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME4[] = { /* "april" */
+ 0x61, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME5[] = { /* "mei" */
+ 0x6d, 0x65, 0x69
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME6[] = { /* "juni" */
+ 0x6a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME7[] = { /* "juli" */
+ 0x6a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME8[] = { /* "augustus" */
+ 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME9[] = { /* "september" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME10[] = { /* "oktober" */
+ 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME11[] = { /* "november" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0813) rgbSMONTHNAME12[] = { /* "december" */
+ 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME1[] = { /* "jan" */
+ 0x6a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME3[] = { /* "mrt" */
+ 0x6d, 0x72, 0x74
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME4[] = { /* "apr" */
+ 0x61, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME5[] = { /* "mei" */
+ 0x6d, 0x65, 0x69
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME8[] = { /* "aug" */
+ 0x61, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME10[] = { /* "okt" */
+ 0x6f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0813) rgbSABBREVMONTHNAME12[] = { /* "dec" */
+ 0x64, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0813) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0813) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbSENGCOUNTRY[] = { /* "Belgium" */
+ 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d
+};
+
+static BYTE NLSALLOC(0813) rgbSENGLANGUAGE[] = { /* "Dutch" */
+ 0x44, 0x75, 0x74, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0813) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0813) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0813) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0813) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0813) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0813) g_rglcinfo0813[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 13, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 10, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 16, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 7, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 9, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 8, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 5, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0813) g_strinfo0813 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0814.c b/private/oleauto/src/dispatch/win16/0814.c
new file mode 100644
index 000000000..891bce127
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0814.c
@@ -0,0 +1,526 @@
+/****************************************************************************
+* 0814.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Norwegian - Norway (Nynorsk)
+*
+* LCID = 0x0814
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:58:50 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0406[256]; // from 0406:Danish - Denmark
+extern EXPANSION rgexp_0406[5];
+extern DIGRAPH rgdig_0406[5];
+extern WORD rgwCType12_0406[256];
+extern WORD rgwCType3_0406[256];
+extern BYTE rgbUCase_0406[256];
+extern BYTE rgbLCase_0406[256];
+
+static BYTE NLSALLOC(0814) rgbILANGUAGE[] = { /* "0814" */
+ 0x30, 0x38, 0x31, 0x34
+};
+
+static BYTE NLSALLOC(0814) rgbSLANGUAGE[] = { /* "Norwegian - Nynorsk" */
+ 0x4e, 0x6f, 0x72, 0x77, 0x65, 0x67, 0x69, 0x61
+ , 0x6e, 0x20, 0x2d, 0x20, 0x4e, 0x79, 0x6e, 0x6f
+ , 0x72, 0x73, 0x6b
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVLANGNAME[] = { /* "NON" */
+ 0x4e, 0x4f, 0x4e
+};
+
+static BYTE NLSALLOC(0814) rgbSNATIVELANGNAME[] = { /* "nynorsk" */
+ 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b
+};
+
+static BYTE NLSALLOC(0814) rgbICOUNTRY[] = { /* "47" */
+ 0x34, 0x37
+};
+
+static BYTE NLSALLOC(0814) rgbSCOUNTRY[] = { /* "Norway" */
+ 0x4e, 0x6f, 0x72, 0x77, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVCTRYNAME[] = { /* "NOR" */
+ 0x4e, 0x4f, 0x52
+};
+
+static BYTE NLSALLOC(0814) rgbSNATIVECTRYNAME[] = { /* "Noreg" */
+ 0x4e, 0x6f, 0x72, 0x65, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbIDEFAULTLANGUAGE[] = { /* "0814" */
+ 0x30, 0x38, 0x31, 0x34
+};
+
+static BYTE NLSALLOC(0814) rgbIDEFAULTCOUNTRY[] = { /* "47" */
+ 0x34, 0x37
+};
+
+static BYTE NLSALLOC(0814) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0814) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0814) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0814) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0814) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0814) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0814) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0814) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0814) rgbSCURRENCY[] = { /* "kr" */
+ 0x6b, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSINTLSYMBOL[] = { /* "NOK" */
+ 0x4e, 0x4f, 0x4b
+};
+
+static BYTE NLSALLOC(0814) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0814) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0814) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0814) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0814) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0814) rgbINEGCURR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0814) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0814) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0814) rgbSSHORTDATE[] = { /* "dd.MM.yy" */
+ 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0814) rgbSLONGDATE[] = { /* "d. MMMM yyyy" */
+ 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0814) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0814) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbSDAYNAME1[] = { /* "måndag" */
+ 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbSDAYNAME2[] = { /* "tysdag" */
+ 0x74, 0x79, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbSDAYNAME3[] = { /* "onsdag" */
+ 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbSDAYNAME4[] = { /* "torsdag" */
+ 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbSDAYNAME5[] = { /* "fredag" */
+ 0x66, 0x72, 0x65, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbSDAYNAME6[] = { /* "laurdag" */
+ 0x6c, 0x61, 0x75, 0x72, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbSDAYNAME7[] = { /* "sundag" */
+ 0x73, 0x75, 0x6e, 0x64, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVDAYNAME1[] = { /* "må" */
+ 0x6d, 0xe5
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVDAYNAME2[] = { /* "ty" */
+ 0x74, 0x79
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVDAYNAME3[] = { /* "on" */
+ 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVDAYNAME4[] = { /* "to" */
+ 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVDAYNAME5[] = { /* "fr" */
+ 0x66, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVDAYNAME6[] = { /* "lau" */
+ 0x6c, 0x61, 0x75
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVDAYNAME7[] = { /* "su" */
+ 0x73, 0x75
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME1[] = { /* "januar" */
+ 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME2[] = { /* "februar" */
+ 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME4[] = { /* "april" */
+ 0x61, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME6[] = { /* "juni" */
+ 0x6a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME7[] = { /* "juli" */
+ 0x6a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME8[] = { /* "august" */
+ 0x61, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME9[] = { /* "september" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME10[] = { /* "oktober" */
+ 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME11[] = { /* "november" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSMONTHNAME12[] = { /* "desember" */
+ 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME1[] = { /* "jan" */
+ 0x6a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME4[] = { /* "apr" */
+ 0x61, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME8[] = { /* "aug" */
+ 0x61, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME10[] = { /* "okt" */
+ 0x6f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0814) rgbSABBREVMONTHNAME12[] = { /* "des" */
+ 0x64, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0814) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0814) rgbIPOSSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0814) rgbINEGSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0814) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0814) rgbSENGCOUNTRY[] = { /* "Norway" */
+ 0x4e, 0x6f, 0x72, 0x77, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0814) rgbSENGLANGUAGE[] = { /* "Norwegian (Nynorsk)" */
+ 0x4e, 0x6f, 0x72, 0x77, 0x65, 0x67, 0x69, 0x61
+ , 0x6e, 0x20, 0x28, 0x4e, 0x79, 0x6e, 0x6f, 0x72
+ , 0x73, 0x6b, 0x29
+};
+
+static BYTE NLSALLOC(0814) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0814) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0814) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0814) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0814) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0814) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0814) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0814) g_rglcinfo0814[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 19, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 5, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 2, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 6, rgbSDAYNAME2 }
+ , { 6, rgbSDAYNAME3 }
+ , { 7, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 7, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 19, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0814) g_strinfo0814 = {
+ rgbUCase_0406
+ , rgbLCase_0406
+ , rgwCType12_0406
+ , rgwCType3_0406
+ , rgwSort_0406
+ , rgexp_0406
+ , rgdig_0406
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0816.c b/private/oleauto/src/dispatch/win16/0816.c
new file mode 100644
index 000000000..a408aee7e
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0816.c
@@ -0,0 +1,532 @@
+/****************************************************************************
+* 0816.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Portuguese - Portugal
+*
+* LCID = 0x0816
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:43:20 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0816) rgbILANGUAGE[] = { /* "0816" */
+ 0x30, 0x38, 0x31, 0x36
+};
+
+static BYTE NLSALLOC(0816) rgbSLANGUAGE[] = { /* "Portuguese" */
+ 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0x65
+ , 0x73, 0x65
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVLANGNAME[] = { /* "PTG" */
+ 0x50, 0x54, 0x47
+};
+
+static BYTE NLSALLOC(0816) rgbSNATIVELANGNAME[] = { /* "Português" */
+ 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea
+ , 0x73
+};
+
+static BYTE NLSALLOC(0816) rgbICOUNTRY[] = { /* "351" */
+ 0x33, 0x35, 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbSCOUNTRY[] = { /* "Portugal" */
+ 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVCTRYNAME[] = { /* "PRT" */
+ 0x50, 0x52, 0x54
+};
+
+static BYTE NLSALLOC(0816) rgbSNATIVECTRYNAME[] = { /* "Portugal" */
+ 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c
+};
+
+static BYTE NLSALLOC(0816) rgbIDEFAULTLANGUAGE[] = { /* "0816" */
+ 0x30, 0x38, 0x31, 0x36
+};
+
+static BYTE NLSALLOC(0816) rgbIDEFAULTCOUNTRY[] = { /* "351" */
+ 0x33, 0x35, 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0816) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0816) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0816) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0816) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0816) rgbSCURRENCY[] = { /* "Esc." */
+ 0x45, 0x73, 0x63, 0x2e
+};
+
+static BYTE NLSALLOC(0816) rgbSINTLSYMBOL[] = { /* "PTE" */
+ 0x50, 0x54, 0x45
+};
+
+static BYTE NLSALLOC(0816) rgbSMONDECIMALSEP[] = { /* "$" */
+ 0x24
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0816) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0816) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0816) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0816) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(0816) rgbSDATE[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0816) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0816) rgbSSHORTDATE[] = { /* "dd-MM-yyyy" */
+ 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0816) rgbSLONGDATE[] = { /* "dddd, d' de 'MMMM' de 'yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27
+ , 0x20, 0x64, 0x65, 0x20, 0x27, 0x4d, 0x4d, 0x4d
+ , 0x4d, 0x27, 0x20, 0x64, 0x65, 0x20, 0x27, 0x79
+ , 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0816) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbICENTURY[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbSDAYNAME1[] = { /* "segunda-feira" */
+ 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d
+ , 0x66, 0x65, 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0816) rgbSDAYNAME2[] = { /* "terça-feira" */
+ 0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d, 0x66, 0x65
+ , 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0816) rgbSDAYNAME3[] = { /* "quarta-feira" */
+ 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66
+ , 0x65, 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0816) rgbSDAYNAME4[] = { /* "quinta-feira" */
+ 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66
+ , 0x65, 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0816) rgbSDAYNAME5[] = { /* "sexta-feira" */
+ 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66, 0x65
+ , 0x69, 0x72, 0x61
+};
+
+static BYTE NLSALLOC(0816) rgbSDAYNAME6[] = { /* "sábado" */
+ 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSDAYNAME7[] = { /* "domingo" */
+ 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVDAYNAME1[] = { /* "seg" */
+ 0x73, 0x65, 0x67
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVDAYNAME2[] = { /* "ter" */
+ 0x74, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVDAYNAME3[] = { /* "qua" */
+ 0x71, 0x75, 0x61
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVDAYNAME4[] = { /* "qui" */
+ 0x71, 0x75, 0x69
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVDAYNAME5[] = { /* "sex" */
+ 0x73, 0x65, 0x78
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVDAYNAME6[] = { /* "sáb" */
+ 0x73, 0xe1, 0x62
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVDAYNAME7[] = { /* "dom" */
+ 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME1[] = { /* "janeiro" */
+ 0x6a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME2[] = { /* "fevereiro" */
+ 0x66, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72
+ , 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME3[] = { /* "março" */
+ 0x6d, 0x61, 0x72, 0xe7, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME4[] = { /* "abril" */
+ 0x61, 0x62, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME5[] = { /* "maio" */
+ 0x6d, 0x61, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME6[] = { /* "junho" */
+ 0x6a, 0x75, 0x6e, 0x68, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME7[] = { /* "julho" */
+ 0x6a, 0x75, 0x6c, 0x68, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME8[] = { /* "agosto" */
+ 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME9[] = { /* "setembro" */
+ 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME10[] = { /* "outubro" */
+ 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME11[] = { /* "novembro" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSMONTHNAME12[] = { /* "dezembro" */
+ 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME1[] = { /* "jan" */
+ 0x6a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME2[] = { /* "fev" */
+ 0x66, 0x65, 0x76
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME4[] = { /* "abr" */
+ 0x61, 0x62, 0x72
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME8[] = { /* "ago" */
+ 0x61, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME9[] = { /* "set" */
+ 0x73, 0x65, 0x74
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME10[] = { /* "out" */
+ 0x6f, 0x75, 0x74
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0816) rgbSABBREVMONTHNAME12[] = { /* "dez" */
+ 0x64, 0x65, 0x7a
+};
+
+static BYTE NLSALLOC(0816) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0816) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbSENGCOUNTRY[] = { /* "Portugal" */
+ 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c
+};
+
+static BYTE NLSALLOC(0816) rgbSENGLANGUAGE[] = { /* "Portuguese" */
+ 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0x65
+ , 0x73, 0x65
+};
+
+static BYTE NLSALLOC(0816) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0816) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0816) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0816) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0816) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0816) g_rglcinfo0816[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 10, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 9, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 8, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 8, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 4, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 10, rgbSSHORTDATE }
+ , { 27, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 13, rgbSDAYNAME1 }
+ , { 11, rgbSDAYNAME2 }
+ , { 12, rgbSDAYNAME3 }
+ , { 12, rgbSDAYNAME4 }
+ , { 11, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 9, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 8, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 8, rgbSENGCOUNTRY }
+ , { 10, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0816) g_strinfo0816 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0c01.c b/private/oleauto/src/dispatch/win16/0c01.c
new file mode 100644
index 000000000..44e738fa5
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0c01.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 0c01.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Egypt
+*
+* LCID = 0x0c01
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:28:06 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(0c01) rgbILANGUAGE[] = { /* "0c01" */
+ 0x30, 0x63, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVLANGNAME[] = { /* "ARE" */
+ 0x41, 0x52, 0x45
+};
+
+static BYTE NLSALLOC(0c01) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(0c01) rgbICOUNTRY[] = { /* "20" */
+ 0x32, 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbSCOUNTRY[] = { /* "Egypt" */
+ 0x45, 0x67, 0x79, 0x70, 0x74
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVCTRYNAME[] = { /* "EGY" */
+ 0x45, 0x47, 0x59
+};
+
+static BYTE NLSALLOC(0c01) rgbSNATIVECTRYNAME[] = { /* "\x0645\x0635\x0631" */
+ 0xe3, 0xd5, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbIDEFAULTLANGUAGE[] = { /* "0c01" */
+ 0x30, 0x63, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbIDEFAULTCOUNTRY[] = { /* "20" */
+ 0x32, 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(0c01) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0c01) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c01) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c01) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbIDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c01) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0c01) rgbSCURRENCY[] = { /* "\x062c.\x0645.\x200f" */
+ 0xcc, 0x2e, 0xe3, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(0c01) rgbSINTLSYMBOL[] = { /* "EGP" */
+ 0x45, 0x47, 0x50
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbICURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c01) rgbIINTLCURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c01) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c01) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c01) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0c01) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0c01) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0c01) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0c01) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c01) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c01) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(0c01) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(0c01) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(0c01) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(0c01) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(0c01) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0c01) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0c01) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(0c01) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(0c01) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0c01) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c01) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c01) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbSENGCOUNTRY[] = { /* "Egypt" */
+ 0x45, 0x67, 0x79, 0x70, 0x74
+};
+
+static BYTE NLSALLOC(0c01) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0c01) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(0c01) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c01) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(0c01) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c01) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0c01) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c01) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0c01) g_rglcinfo0c01[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 3, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0c01) g_strinfo0c01 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0c07.c b/private/oleauto/src/dispatch/win16/0c07.c
new file mode 100644
index 000000000..daab4a455
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0c07.c
@@ -0,0 +1,525 @@
+/****************************************************************************
+* 0c07.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* German - Austria
+*
+* LCID = 0x0c07
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:44:00 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0c07) rgbILANGUAGE[] = { /* "0c07" */
+ 0x30, 0x63, 0x30, 0x37
+};
+
+static BYTE NLSALLOC(0c07) rgbSLANGUAGE[] = { /* "Austrian German" */
+ 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6e
+ , 0x20, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVLANGNAME[] = { /* "DEA" */
+ 0x44, 0x45, 0x41
+};
+
+static BYTE NLSALLOC(0c07) rgbSNATIVELANGNAME[] = { /* "Deutsch" */
+ 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0c07) rgbICOUNTRY[] = { /* "43" */
+ 0x34, 0x33
+};
+
+static BYTE NLSALLOC(0c07) rgbSCOUNTRY[] = { /* "Austria" */
+ 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVCTRYNAME[] = { /* "AUT" */
+ 0x41, 0x55, 0x54
+};
+
+static BYTE NLSALLOC(0c07) rgbSNATIVECTRYNAME[] = { /* "Österreich" */
+ 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69
+ , 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0c07) rgbIDEFAULTLANGUAGE[] = { /* "0c07" */
+ 0x30, 0x63, 0x30, 0x37
+};
+
+static BYTE NLSALLOC(0c07) rgbIDEFAULTCOUNTRY[] = { /* "43" */
+ 0x34, 0x33
+};
+
+static BYTE NLSALLOC(0c07) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0c07) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0c07) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c07) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c07) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c07) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c07) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c07) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0c07) rgbSCURRENCY[] = { /* "S" */
+ 0x53
+};
+
+static BYTE NLSALLOC(0c07) rgbSINTLSYMBOL[] = { /* "ATS" */
+ 0x41, 0x54, 0x53
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c07) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c07) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c07) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c07) rgbINEGCURR[] = { /* "9" */
+ 0x39
+};
+
+static BYTE NLSALLOC(0c07) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c07) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0c07) rgbSSHORTDATE[] = { /* "dd.MM.yy" */
+ 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0c07) rgbSLONGDATE[] = { /* "dddd, dd. MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64
+ , 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79
+ , 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0c07) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c07) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbSDAYNAME1[] = { /* "Montag" */
+ 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0c07) rgbSDAYNAME2[] = { /* "Dienstag" */
+ 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0c07) rgbSDAYNAME3[] = { /* "Mittwoch" */
+ 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0c07) rgbSDAYNAME4[] = { /* "Donnerstag" */
+ 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74
+ , 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0c07) rgbSDAYNAME5[] = { /* "Freitag" */
+ 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0c07) rgbSDAYNAME6[] = { /* "Samstag" */
+ 0x53, 0x61, 0x6d, 0x73, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0c07) rgbSDAYNAME7[] = { /* "Sonntag" */
+ 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVDAYNAME1[] = { /* "Mo" */
+ 0x4d, 0x6f
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVDAYNAME2[] = { /* "Di" */
+ 0x44, 0x69
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVDAYNAME3[] = { /* "Mi" */
+ 0x4d, 0x69
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVDAYNAME4[] = { /* "Do" */
+ 0x44, 0x6f
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVDAYNAME5[] = { /* "Fr" */
+ 0x46, 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVDAYNAME6[] = { /* "Sa" */
+ 0x53, 0x61
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVDAYNAME7[] = { /* "So" */
+ 0x53, 0x6f
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME1[] = { /* "Januar" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME2[] = { /* "Februar" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME3[] = { /* "März" */
+ 0x4d, 0xe4, 0x72, 0x7a
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME5[] = { /* "Mai" */
+ 0x4d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME6[] = { /* "Juni" */
+ 0x4a, 0x75, 0x6e, 0x69
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME7[] = { /* "Juli" */
+ 0x4a, 0x75, 0x6c, 0x69
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME10[] = { /* "Oktober" */
+ 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSMONTHNAME12[] = { /* "Dezember" */
+ 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME3[] = { /* "Mär" */
+ 0x4d, 0xe4, 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME5[] = { /* "Mai" */
+ 0x4d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME10[] = { /* "Okt" */
+ 0x4f, 0x6b, 0x74
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0c07) rgbSABBREVMONTHNAME12[] = { /* "Dez" */
+ 0x44, 0x65, 0x7a
+};
+
+static BYTE NLSALLOC(0c07) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0c07) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c07) rgbINEGSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c07) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbSENGCOUNTRY[] = { /* "Austria" */
+ 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(0c07) rgbSENGLANGUAGE[] = { /* "German" */
+ 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0c07) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c07) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c07) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0c07) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0c07) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c07) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c07) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0c07) g_rglcinfo0c07[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 15, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 10, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 19, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 8, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 10, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 7, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 2, rgbSABBREVDAYNAME1 }
+ , { 2, rgbSABBREVDAYNAME2 }
+ , { 2, rgbSABBREVDAYNAME3 }
+ , { 2, rgbSABBREVDAYNAME4 }
+ , { 2, rgbSABBREVDAYNAME5 }
+ , { 2, rgbSABBREVDAYNAME6 }
+ , { 2, rgbSABBREVDAYNAME7 }
+ , { 6, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0c07) g_strinfo0c07 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0c09.c b/private/oleauto/src/dispatch/win16/0c09.c
new file mode 100644
index 000000000..67faddba4
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0c09.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 0c09.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* English - Australia
+*
+* LCID = 0x0c09
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:44:37 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0c09) rgbILANGUAGE[] = { /* "0c09" */
+ 0x30, 0x63, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(0c09) rgbSLANGUAGE[] = { /* "Australian English" */
+ 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69
+ , 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69
+ , 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVLANGNAME[] = { /* "ENA" */
+ 0x45, 0x4e, 0x41
+};
+
+static BYTE NLSALLOC(0c09) rgbSNATIVELANGNAME[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0c09) rgbICOUNTRY[] = { /* "61" */
+ 0x36, 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbSCOUNTRY[] = { /* "Australia" */
+ 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69
+ , 0x61
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVCTRYNAME[] = { /* "AUS" */
+ 0x41, 0x55, 0x53
+};
+
+static BYTE NLSALLOC(0c09) rgbSNATIVECTRYNAME[] = { /* "Australia" */
+ 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69
+ , 0x61
+};
+
+static BYTE NLSALLOC(0c09) rgbIDEFAULTLANGUAGE[] = { /* "0c09" */
+ 0x30, 0x63, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(0c09) rgbIDEFAULTCOUNTRY[] = { /* "61" */
+ 0x36, 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c09) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c09) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c09) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c09) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0c09) rgbSCURRENCY[] = { /* "$" */
+ 0x24
+};
+
+static BYTE NLSALLOC(0c09) rgbSINTLSYMBOL[] = { /* "AUD" */
+ 0x41, 0x55, 0x44
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c09) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c09) rgbICURRENCY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbINEGCURR[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0c09) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0c09) rgbSSHORTDATE[] = { /* "d/MM/yy" */
+ 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSLONGDATE[] = { /* "dddd, d MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20
+ , 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79
+ , 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbSDAYNAME1[] = { /* "Monday" */
+ 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSDAYNAME2[] = { /* "Tuesday" */
+ 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSDAYNAME3[] = { /* "Wednesday" */
+ 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61
+ , 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSDAYNAME4[] = { /* "Thursday" */
+ 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSDAYNAME5[] = { /* "Friday" */
+ 0x46, 0x72, 0x69, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSDAYNAME6[] = { /* "Saturday" */
+ 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSDAYNAME7[] = { /* "Sunday" */
+ 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVDAYNAME1[] = { /* "Mon" */
+ 0x4d, 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVDAYNAME2[] = { /* "Tue" */
+ 0x54, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVDAYNAME3[] = { /* "Wed" */
+ 0x57, 0x65, 0x64
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVDAYNAME4[] = { /* "Thu" */
+ 0x54, 0x68, 0x75
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVDAYNAME5[] = { /* "Fri" */
+ 0x46, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVDAYNAME6[] = { /* "Sat" */
+ 0x53, 0x61, 0x74
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVDAYNAME7[] = { /* "Sun" */
+ 0x53, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME1[] = { /* "January" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME2[] = { /* "February" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME3[] = { /* "March" */
+ 0x4d, 0x61, 0x72, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME6[] = { /* "June" */
+ 0x4a, 0x75, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME7[] = { /* "July" */
+ 0x4a, 0x75, 0x6c, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME10[] = { /* "October" */
+ 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0c09) rgbSMONTHNAME12[] = { /* "December" */
+ 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME3[] = { /* "Mar" */
+ 0x4d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME10[] = { /* "Oct" */
+ 0x4f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0c09) rgbSABBREVMONTHNAME12[] = { /* "Dec" */
+ 0x44, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(0c09) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0c09) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c09) rgbINEGSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c09) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbIPOSSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbSENGCOUNTRY[] = { /* "Australia" */
+ 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69
+ , 0x61
+};
+
+static BYTE NLSALLOC(0c09) rgbSENGLANGUAGE[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(0c09) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0c09) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0c09) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c09) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c09) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0c09) g_rglcinfo0c09[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 18, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 9, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 9, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 17, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 9, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0c09) g_strinfo0c09 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0c0a.c b/private/oleauto/src/dispatch/win16/0c0a.c
new file mode 100644
index 000000000..18f06eb41
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0c0a.c
@@ -0,0 +1,708 @@
+/****************************************************************************
+* 0c0a.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Spanish - Spain (Modern Sort)
+*
+* LCID = 0x0c0a
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:54:28 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+WORD NLSALLOC(0c0a) rgwSort_0c0a[256] = {
+ 0x0000, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d
+ , 0xc00e, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0xc00f, 0xc010
+ , 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018
+ , 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020
+ , 0x402f, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0xc02a
+ , 0x403c, 0x403d, 0x403e, 0x4060, 0x403f, 0xc02b, 0x4040, 0x4041
+ , 0x007a, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084
+ , 0x0085, 0x0086, 0x4042, 0x4043, 0x4061, 0x4062, 0x4063, 0x4044
+ , 0x4045, 0x1087, 0x1088, 0x1089, 0x108a, 0x108b, 0x108c, 0x108d
+ , 0x108e, 0x108f, 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1096
+ , 0x1097, 0x1098, 0x1099, 0x109a, 0x109b, 0x109d, 0x109e, 0x109f
+ , 0x10a0, 0x10a1, 0x10a2, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a
+ , 0x404b, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d
+ , 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0096
+ , 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009d, 0x009e, 0x009f
+ , 0x00a0, 0x00a1, 0x00a2, 0x404c, 0x404d, 0x404e, 0x404f, 0xc021
+ , 0xc022, 0xc023, 0x405a, 0x018c, 0x405d, 0x4078, 0x4075, 0x4076
+ , 0x4149, 0x4079, 0x119a, 0x405e, 0x0505, 0xc024, 0xc025, 0xc026
+ , 0xc027, 0x4058, 0x4059, 0x405b, 0x405c, 0x4077, 0xc02d, 0xc02e
+ , 0x4057, 0x109c, 0x019a, 0x405f, 0x0605, 0xc028, 0xc029, 0x12a1
+ , 0x4030, 0x4050, 0x4069, 0x406a, 0x406b, 0x406c, 0x4051, 0x406d
+ , 0x4052, 0x406e, 0x0887, 0x4065, 0x406f, 0xc02c, 0x4070, 0x4053
+ , 0x4071, 0x4064, 0x087f, 0x0880, 0x4054, 0x4072, 0x4073, 0x4074
+ , 0x4055, 0x087e, 0x0996, 0x4066, 0x007b, 0x007c, 0x007d, 0x4056
+ , 0x1287, 0x1187, 0x1387, 0x1587, 0x1487, 0x1687, 0x0005, 0x1189
+ , 0x128b, 0x118b, 0x138b, 0x148b, 0x128f, 0x118f, 0x138f, 0x148f
+ , 0x118a, 0x1095, 0x1396, 0x1296, 0x1496, 0x1696, 0x1596, 0x4067
+ , 0x1796, 0x129d, 0x119d, 0x139d, 0x149d, 0x11a1, 0x0105, 0x0205
+ , 0x0287, 0x0187, 0x0387, 0x0587, 0x0487, 0x0687, 0x0305, 0x0189
+ , 0x028b, 0x018b, 0x038b, 0x048b, 0x028f, 0x018f, 0x038f, 0x048f
+ , 0x018a, 0x0095, 0x0396, 0x0296, 0x0496, 0x0696, 0x0596, 0x4068
+ , 0x0796, 0x029d, 0x019d, 0x039d, 0x049d, 0x01a1, 0x0405, 0x02a1
+};
+
+EXPANSION NLSALLOC(0c0a) rgexp_0c0a[7] = {
+ { 0x1087, 0x108b }
+ , { 0x109b, 0x108e }
+ , { 0x009a, 0x009a }
+ , { 0x0087, 0x008b }
+ , { 0x009b, 0x008e }
+ , { 0x1096, 0x108b }
+ , { 0x0096, 0x008b }
+};
+
+WORD NLSALLOC(0c0a) rgwCType12_0c0a[256] = {
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x9068, 0x0028, 0x0028, 0x0028, 0x0028, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020
+ , 0xa048, 0xb010, 0xb010, 0x5010, 0x5010, 0x5010, 0x1010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0x5010, 0x7010, 0x5010, 0x4010, 0x4010
+ , 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084, 0x3084
+ , 0x3084, 0x3084, 0x7010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1181, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1182, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0xb010, 0xb010, 0xb010, 0xb010, 0x0020
+ , 0x0020, 0x0020, 0xb010, 0x1112, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0x5010, 0x1101, 0xb010, 0x1101, 0x0020, 0x0020, 0x0020
+ , 0x0020, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1010, 0xb010, 0x1102, 0xb010, 0x1102, 0x0020, 0x0020, 0x1101
+ , 0xa048, 0xb010, 0x5010, 0x5010, 0x5010, 0x5010, 0xb010, 0xb010
+ , 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x5010, 0x5010, 0x3014, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0xb010, 0x3014, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0xb010
+ , 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1101, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0xb010
+ , 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102, 0x1102
+};
+
+WORD NLSALLOC(0c0a) rgwCType3_0c0a[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ , 0x0048, 0x0048, 0x0448, 0x0048, 0x0448, 0x0048, 0x0048, 0x0440
+ , 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0440, 0x0048, 0x0448
+ , 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040
+ , 0x0040, 0x0040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0048, 0x0048
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0448, 0x0048, 0x0448, 0x0448
+ , 0x0448, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040
+ , 0x8040, 0x8040, 0x8040, 0x0048, 0x0048, 0x0048, 0x0448, 0x0000
+ , 0x0000, 0x0000, 0x0008, 0x8000, 0x0008, 0x0008, 0x0008, 0x0008
+ , 0x0001, 0x0008, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000
+ , 0x0000, 0x0088, 0x0088, 0x0088, 0x0088, 0x0008, 0x0400, 0x0400
+ , 0x0408, 0x0000, 0x8003, 0x0008, 0x8000, 0x0000, 0x0000, 0x8003
+ , 0x0008, 0x0008, 0x0048, 0x0048, 0x0008, 0x0048, 0x0048, 0x0008
+ , 0x0408, 0x0008, 0x0400, 0x0008, 0x0048, 0x0408, 0x0008, 0x0448
+ , 0x0008, 0x0008, 0x0000, 0x0000, 0x0408, 0x0008, 0x0008, 0x0008
+ , 0x0408, 0x0000, 0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8000
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003
+ , 0x8000, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x0008
+ , 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8000, 0x8003
+};
+
+BYTE NLSALLOC(0c0a) rgbUCase_0c0a[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
+ , 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
+ , 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57
+ , 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x9d, 0x9e, 0x9f
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+ , 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
+ , 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
+ , 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7
+ , 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x9f
+};
+
+BYTE NLSALLOC(0c0a) rgbLCase_0c0a[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
+ , 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+ , 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
+ , 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+ , 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+ , 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f
+ , 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
+ , 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f
+ , 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
+ , 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f
+ , 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+ , 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
+ , 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
+ , 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x8d, 0x8e, 0x8f
+ , 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97
+ , 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xff
+ , 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7
+ , 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
+ , 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+ , 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf
+ , 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7
+ , 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
+ , 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7
+ , 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+static BYTE NLSALLOC(0c0a) rgbILANGUAGE[] = { /* "0c0a" */
+ 0x30, 0x63, 0x30, 0x61
+};
+
+static BYTE NLSALLOC(0c0a) rgbSLANGUAGE[] = { /* "Spanish - Modern Sort" */
+ 0x53, 0x70, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20
+ , 0x2d, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x72, 0x6e
+ , 0x20, 0x53, 0x6f, 0x72, 0x74
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVLANGNAME[] = { /* "ESN" */
+ 0x45, 0x53, 0x4e
+};
+
+static BYTE NLSALLOC(0c0a) rgbSNATIVELANGNAME[] = { /* "Español" */
+ 0x45, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c
+};
+
+static BYTE NLSALLOC(0c0a) rgbICOUNTRY[] = { /* "34" */
+ 0x33, 0x34
+};
+
+static BYTE NLSALLOC(0c0a) rgbSCOUNTRY[] = { /* "Spain" */
+ 0x53, 0x70, 0x61, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVCTRYNAME[] = { /* "ESP" */
+ 0x45, 0x53, 0x50
+};
+
+static BYTE NLSALLOC(0c0a) rgbSNATIVECTRYNAME[] = { /* "España" */
+ 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61
+};
+
+static BYTE NLSALLOC(0c0a) rgbIDEFAULTLANGUAGE[] = { /* "0c0a" */
+ 0x30, 0x63, 0x30, 0x61
+};
+
+static BYTE NLSALLOC(0c0a) rgbIDEFAULTCOUNTRY[] = { /* "34" */
+ 0x33, 0x34
+};
+
+static BYTE NLSALLOC(0c0a) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0c0a) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c0a) rgbSTHOUSAND[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c0a) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c0a) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0c0a) rgbSCURRENCY[] = { /* "Pts" */
+ 0x50, 0x74, 0x73
+};
+
+static BYTE NLSALLOC(0c0a) rgbSINTLSYMBOL[] = { /* "ESP" */
+ 0x45, 0x53, 0x50
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHOUSANDSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbICURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbIINTLCURRDIGITS[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c0a) rgbINEGCURR[] = { /* "8" */
+ 0x38
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0c0a) rgbSSHORTDATE[] = { /* "d/MM/yy" */
+ 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0c0a) rgbSLONGDATE[] = { /* "dddd d' de 'MMMM' de 'yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x27, 0x20
+ , 0x64, 0x65, 0x20, 0x27, 0x4d, 0x4d, 0x4d, 0x4d
+ , 0x27, 0x20, 0x64, 0x65, 0x20, 0x27, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0c0a) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDAYNAME1[] = { /* "lunes" */
+ 0x6c, 0x75, 0x6e, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDAYNAME2[] = { /* "martes" */
+ 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDAYNAME3[] = { /* "miércoles" */
+ 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65
+ , 0x73
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDAYNAME4[] = { /* "jueves" */
+ 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDAYNAME5[] = { /* "viernes" */
+ 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDAYNAME6[] = { /* "sábado" */
+ 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSDAYNAME7[] = { /* "domingo" */
+ 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVDAYNAME1[] = { /* "lun" */
+ 0x6c, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVDAYNAME2[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVDAYNAME3[] = { /* "mié" */
+ 0x6d, 0x69, 0xe9
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVDAYNAME4[] = { /* "jue" */
+ 0x6a, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVDAYNAME5[] = { /* "vie" */
+ 0x76, 0x69, 0x65
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVDAYNAME6[] = { /* "sáb" */
+ 0x73, 0xe1, 0x62
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVDAYNAME7[] = { /* "dom" */
+ 0x64, 0x6f, 0x6d
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME1[] = { /* "enero" */
+ 0x65, 0x6e, 0x65, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME2[] = { /* "febrero" */
+ 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME3[] = { /* "marzo" */
+ 0x6d, 0x61, 0x72, 0x7a, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME4[] = { /* "abril" */
+ 0x61, 0x62, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME5[] = { /* "mayo" */
+ 0x6d, 0x61, 0x79, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME6[] = { /* "junio" */
+ 0x6a, 0x75, 0x6e, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME7[] = { /* "julio" */
+ 0x6a, 0x75, 0x6c, 0x69, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME8[] = { /* "agosto" */
+ 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME9[] = { /* "septiembre" */
+ 0x73, 0x65, 0x70, 0x74, 0x69, 0x65, 0x6d, 0x62
+ , 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME10[] = { /* "octubre" */
+ 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME11[] = { /* "noviembre" */
+ 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(0c0a) rgbSMONTHNAME12[] = { /* "diciembre" */
+ 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME1[] = { /* "ene" */
+ 0x65, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME2[] = { /* "feb" */
+ 0x66, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME3[] = { /* "mar" */
+ 0x6d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME4[] = { /* "abr" */
+ 0x61, 0x62, 0x72
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME5[] = { /* "may" */
+ 0x6d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME6[] = { /* "jun" */
+ 0x6a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME7[] = { /* "jul" */
+ 0x6a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME8[] = { /* "ago" */
+ 0x61, 0x67, 0x6f
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME9[] = { /* "sep" */
+ 0x73, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME10[] = { /* "oct" */
+ 0x6f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME11[] = { /* "nov" */
+ 0x6e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(0c0a) rgbSABBREVMONTHNAME12[] = { /* "dic" */
+ 0x64, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(0c0a) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0c0a) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbINEGSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbINEGSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbSENGCOUNTRY[] = { /* "Spain" */
+ 0x53, 0x70, 0x61, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(0c0a) rgbSENGLANGUAGE[] = { /* "Spanish - Modern Sort" */
+ 0x53, 0x70, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20
+ , 0x2d, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x72, 0x6e
+ , 0x20, 0x53, 0x6f, 0x72, 0x74
+};
+
+static BYTE NLSALLOC(0c0a) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0c0a) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0c0a) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0a) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0a) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0c0a) g_rglcinfo0c0a[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 21, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 26, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 5, rgbSDAYNAME1 }
+ , { 6, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 6, rgbSDAYNAME4 }
+ , { 7, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 7, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 10, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 9, rgbSMONTHNAME11 }
+ , { 9, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 21, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0c0a) g_strinfo0c0a = {
+ rgbUCase_0c0a
+ , rgbLCase_0c0a
+ , rgwCType12_0c0a
+ , rgwCType3_0c0a
+ , rgwSort_0c0a
+ , rgexp_0c0a
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/0c0c.c b/private/oleauto/src/dispatch/win16/0c0c.c
new file mode 100644
index 000000000..8f1955398
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/0c0c.c
@@ -0,0 +1,522 @@
+/****************************************************************************
+* 0c0c.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* French - Canada
+*
+* LCID = 0x0c0c
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:45:11 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(0c0c) rgbILANGUAGE[] = { /* "0c0c" */
+ 0x30, 0x63, 0x30, 0x63
+};
+
+static BYTE NLSALLOC(0c0c) rgbSLANGUAGE[] = { /* "Canadian French" */
+ 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e
+ , 0x20, 0x46, 0x72, 0x65, 0x6e, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVLANGNAME[] = { /* "FRC" */
+ 0x46, 0x52, 0x43
+};
+
+static BYTE NLSALLOC(0c0c) rgbSNATIVELANGNAME[] = { /* "français" */
+ 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73
+};
+
+static BYTE NLSALLOC(0c0c) rgbICOUNTRY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c0c) rgbSCOUNTRY[] = { /* "Canada" */
+ 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVCTRYNAME[] = { /* "CAN" */
+ 0x43, 0x41, 0x4e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSNATIVECTRYNAME[] = { /* "Canada" */
+ 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(0c0c) rgbIDEFAULTLANGUAGE[] = { /* "0c0c" */
+ 0x30, 0x63, 0x30, 0x63
+};
+
+static BYTE NLSALLOC(0c0c) rgbIDEFAULTCOUNTRY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c0c) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(0c0c) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDECIMAL[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c0c) rgbSTHOUSAND[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0c0c) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c0c) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(0c0c) rgbSCURRENCY[] = { /* "$" */
+ 0x24
+};
+
+static BYTE NLSALLOC(0c0c) rgbSINTLSYMBOL[] = { /* "CAD" */
+ 0x43, 0x41, 0x44
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONDECIMALSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHOUSANDSEP[] = { /* "\x00a0" */
+ 0xa0
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c0c) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c0c) rgbICURRENCY[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(0c0c) rgbINEGCURR[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDATE[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0c0c) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(0c0c) rgbSSHORTDATE[] = { /* "yy-MM-dd" */
+ 0x79, 0x79, 0x2d, 0x4d, 0x4d, 0x2d, 0x64, 0x64
+};
+
+static BYTE NLSALLOC(0c0c) rgbSLONGDATE[] = { /* "d MMMM, yyyy" */
+ 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(0c0c) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(0c0c) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDAYNAME1[] = { /* "lundi" */
+ 0x6c, 0x75, 0x6e, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDAYNAME2[] = { /* "mardi" */
+ 0x6d, 0x61, 0x72, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDAYNAME3[] = { /* "mercredi" */
+ 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDAYNAME4[] = { /* "jeudi" */
+ 0x6a, 0x65, 0x75, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDAYNAME5[] = { /* "vendredi" */
+ 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDAYNAME6[] = { /* "samedi" */
+ 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(0c0c) rgbSDAYNAME7[] = { /* "dimanche" */
+ 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVDAYNAME1[] = { /* "lun." */
+ 0x6c, 0x75, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVDAYNAME2[] = { /* "mar." */
+ 0x6d, 0x61, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVDAYNAME3[] = { /* "mer." */
+ 0x6d, 0x65, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVDAYNAME4[] = { /* "jeu." */
+ 0x6a, 0x65, 0x75, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVDAYNAME5[] = { /* "ven." */
+ 0x76, 0x65, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVDAYNAME6[] = { /* "sam." */
+ 0x73, 0x61, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVDAYNAME7[] = { /* "dim." */
+ 0x64, 0x69, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME1[] = { /* "janvier" */
+ 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME2[] = { /* "février" */
+ 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME4[] = { /* "avril" */
+ 0x61, 0x76, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME6[] = { /* "juin" */
+ 0x6a, 0x75, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME7[] = { /* "juillet" */
+ 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME8[] = { /* "août" */
+ 0x61, 0x6f, 0xfb, 0x74
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME9[] = { /* "septembre" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME10[] = { /* "octobre" */
+ 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME11[] = { /* "novembre" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0c0c) rgbSMONTHNAME12[] = { /* "décembre" */
+ 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME1[] = { /* "janv." */
+ 0x6a, 0x61, 0x6e, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME2[] = { /* "févr." */
+ 0x66, 0xe9, 0x76, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME4[] = { /* "avr." */
+ 0x61, 0x76, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME6[] = { /* "juin" */
+ 0x6a, 0x75, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME7[] = { /* "juil." */
+ 0x6a, 0x75, 0x69, 0x6c, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME8[] = { /* "août" */
+ 0x61, 0x6f, 0xfb, 0x74
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME9[] = { /* "sept." */
+ 0x73, 0x65, 0x70, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME10[] = { /* "oct." */
+ 0x6f, 0x63, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME11[] = { /* "nov." */
+ 0x6e, 0x6f, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSABBREVMONTHNAME12[] = { /* "déc." */
+ 0x64, 0xe9, 0x63, 0x2e
+};
+
+static BYTE NLSALLOC(0c0c) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(0c0c) rgbIPOSSIGNPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbINEGSIGNPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbIPOSSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbINEGSYMPRECEDES[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbSENGCOUNTRY[] = { /* "Canada" */
+ 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(0c0c) rgbSENGLANGUAGE[] = { /* "French" */
+ 0x46, 0x72, 0x65, 0x6e, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(0c0c) rgbIFIRSTDAYOFWEEK[] = { /* "6" */
+ 0x36
+};
+
+static BYTE NLSALLOC(0c0c) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(0c0c) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(0c0c) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(0c0c) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(0c0c) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(0c0c) g_rglcinfo0c0c[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 15, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 8, rgbSNATIVELANGNAME }
+ , { 1, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 1, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 5, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 8, rgbSDAYNAME7 }
+ , { 4, rgbSABBREVDAYNAME1 }
+ , { 4, rgbSABBREVDAYNAME2 }
+ , { 4, rgbSABBREVDAYNAME3 }
+ , { 4, rgbSABBREVDAYNAME4 }
+ , { 4, rgbSABBREVDAYNAME5 }
+ , { 4, rgbSABBREVDAYNAME6 }
+ , { 4, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 7, rgbSMONTHNAME7 }
+ , { 4, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 5, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 4, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 4, rgbSABBREVMONTHNAME11 }
+ , { 4, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(0c0c) g_strinfo0c0c = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/1001.c b/private/oleauto/src/dispatch/win16/1001.c
new file mode 100644
index 000000000..6f52ded33
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/1001.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 1001.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Libya
+*
+* LCID = 0x1001
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:28:59 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(1001) rgbILANGUAGE[] = { /* "1001" */
+ 0x31, 0x30, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVLANGNAME[] = { /* "ARL" */
+ 0x41, 0x52, 0x4c
+};
+
+static BYTE NLSALLOC(1001) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(1001) rgbICOUNTRY[] = { /* "218" */
+ 0x32, 0x31, 0x38
+};
+
+static BYTE NLSALLOC(1001) rgbSCOUNTRY[] = { /* "Libya" */
+ 0x4c, 0x69, 0x62, 0x79, 0x61
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVCTRYNAME[] = { /* "LBY" */
+ 0x4c, 0x42, 0x59
+};
+
+static BYTE NLSALLOC(1001) rgbSNATIVECTRYNAME[] = { /* "\x0644\x064a\x0628\x064a\x0627" */
+ 0xe1, 0xed, 0xc8, 0xed, 0xc7
+};
+
+static BYTE NLSALLOC(1001) rgbIDEFAULTLANGUAGE[] = { /* "1001" */
+ 0x31, 0x30, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbIDEFAULTCOUNTRY[] = { /* "218" */
+ 0x32, 0x31, 0x38
+};
+
+static BYTE NLSALLOC(1001) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(1001) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(1001) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1001) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1001) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1001) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1001) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1001) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(1001) rgbSCURRENCY[] = { /* "\x062f.\x0644.\x200f" */
+ 0xcf, 0x2e, 0xe1, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(1001) rgbSINTLSYMBOL[] = { /* "LYD" */
+ 0x4c, 0x59, 0x44
+};
+
+static BYTE NLSALLOC(1001) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1001) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1001) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1001) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1001) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1001) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1001) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(1001) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(1001) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1001) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1001) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1001) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1001) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1001) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1001) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1001) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(1001) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(1001) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(1001) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(1001) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(1001) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1001) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1001) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(1001) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1001) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1001) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1001) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1001) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1001) rgbSENGCOUNTRY[] = { /* "Libya" */
+ 0x4c, 0x69, 0x62, 0x79, 0x61
+};
+
+static BYTE NLSALLOC(1001) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(1001) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(1001) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1001) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(1001) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1001) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(1001) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1001) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(1001) g_rglcinfo1001[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 5, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(1001) g_strinfo1001 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/1009.c b/private/oleauto/src/dispatch/win16/1009.c
new file mode 100644
index 000000000..94c88122a
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/1009.c
@@ -0,0 +1,523 @@
+/****************************************************************************
+* 1009.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* English - Canada
+*
+* LCID = 0x1009
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:46:28 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(1009) rgbILANGUAGE[] = { /* "1009" */
+ 0x31, 0x30, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(1009) rgbSLANGUAGE[] = { /* "Canadian English" */
+ 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e
+ , 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVLANGNAME[] = { /* "ENC" */
+ 0x45, 0x4e, 0x43
+};
+
+static BYTE NLSALLOC(1009) rgbSNATIVELANGNAME[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1009) rgbICOUNTRY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1009) rgbSCOUNTRY[] = { /* "Canada" */
+ 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVCTRYNAME[] = { /* "CAN" */
+ 0x43, 0x41, 0x4e
+};
+
+static BYTE NLSALLOC(1009) rgbSNATIVECTRYNAME[] = { /* "Canada" */
+ 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(1009) rgbIDEFAULTLANGUAGE[] = { /* "1009" */
+ 0x31, 0x30, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(1009) rgbIDEFAULTCOUNTRY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1009) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1009) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1009) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1009) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1009) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(1009) rgbSCURRENCY[] = { /* "$" */
+ 0x24
+};
+
+static BYTE NLSALLOC(1009) rgbSINTLSYMBOL[] = { /* "CAD" */
+ 0x43, 0x41, 0x44
+};
+
+static BYTE NLSALLOC(1009) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1009) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1009) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1009) rgbICURRENCY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbINEGCURR[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(1009) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(1009) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSLONGDATE[] = { /* "MMMM d, yyyy" */
+ 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbILDATE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbSDAYNAME1[] = { /* "Monday" */
+ 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSDAYNAME2[] = { /* "Tuesday" */
+ 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSDAYNAME3[] = { /* "Wednesday" */
+ 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61
+ , 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSDAYNAME4[] = { /* "Thursday" */
+ 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSDAYNAME5[] = { /* "Friday" */
+ 0x46, 0x72, 0x69, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSDAYNAME6[] = { /* "Saturday" */
+ 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSDAYNAME7[] = { /* "Sunday" */
+ 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVDAYNAME1[] = { /* "Mon" */
+ 0x4d, 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVDAYNAME2[] = { /* "Tue" */
+ 0x54, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVDAYNAME3[] = { /* "Wed" */
+ 0x57, 0x65, 0x64
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVDAYNAME4[] = { /* "Thu" */
+ 0x54, 0x68, 0x75
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVDAYNAME5[] = { /* "Fri" */
+ 0x46, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVDAYNAME6[] = { /* "Sat" */
+ 0x53, 0x61, 0x74
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVDAYNAME7[] = { /* "Sun" */
+ 0x53, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME1[] = { /* "January" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME2[] = { /* "February" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME3[] = { /* "March" */
+ 0x4d, 0x61, 0x72, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME6[] = { /* "June" */
+ 0x4a, 0x75, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME7[] = { /* "July" */
+ 0x4a, 0x75, 0x6c, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME10[] = { /* "October" */
+ 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1009) rgbSMONTHNAME12[] = { /* "December" */
+ 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME3[] = { /* "Mar" */
+ 0x4d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME10[] = { /* "Oct" */
+ 0x4f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(1009) rgbSABBREVMONTHNAME12[] = { /* "Dec" */
+ 0x44, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(1009) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1009) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1009) rgbINEGSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1009) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbIPOSSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbSENGCOUNTRY[] = { /* "Canada" */
+ 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61
+};
+
+static BYTE NLSALLOC(1009) rgbSENGLANGUAGE[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1009) rgbIFIRSTDAYOFWEEK[] = { /* "6" */
+ 0x36
+};
+
+static BYTE NLSALLOC(1009) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(1009) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(1009) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1009) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1009) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(1009) g_rglcinfo1009[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 16, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 1, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 1, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(1009) g_strinfo1009 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/100c.c b/private/oleauto/src/dispatch/win16/100c.c
new file mode 100644
index 000000000..5644accc0
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/100c.c
@@ -0,0 +1,517 @@
+/****************************************************************************
+* 100c.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* French - Switzerland
+*
+* LCID = 0x100c
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:47:06 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(100c) rgbILANGUAGE[] = { /* "100c" */
+ 0x31, 0x30, 0x30, 0x63
+};
+
+static BYTE NLSALLOC(100c) rgbSLANGUAGE[] = { /* "Swiss French" */
+ 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x46, 0x72
+ , 0x65, 0x6e, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVLANGNAME[] = { /* "FRS" */
+ 0x46, 0x52, 0x53
+};
+
+static BYTE NLSALLOC(100c) rgbSNATIVELANGNAME[] = { /* "français" */
+ 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73
+};
+
+static BYTE NLSALLOC(100c) rgbICOUNTRY[] = { /* "41" */
+ 0x34, 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbSCOUNTRY[] = { /* "Switzerland" */
+ 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVCTRYNAME[] = { /* "CHE" */
+ 0x43, 0x48, 0x45
+};
+
+static BYTE NLSALLOC(100c) rgbSNATIVECTRYNAME[] = { /* "Suisse" */
+ 0x53, 0x75, 0x69, 0x73, 0x73, 0x65
+};
+
+static BYTE NLSALLOC(100c) rgbIDEFAULTLANGUAGE[] = { /* "100c" */
+ 0x31, 0x30, 0x30, 0x63
+};
+
+static BYTE NLSALLOC(100c) rgbIDEFAULTCOUNTRY[] = { /* "41" */
+ 0x34, 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(100c) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(100c) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(100c) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(100c) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(100c) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(100c) rgbSCURRENCY[] = { /* "CHF" */
+ 0x43, 0x48, 0x46
+};
+
+static BYTE NLSALLOC(100c) rgbSINTLSYMBOL[] = { /* "CHF" */
+ 0x43, 0x48, 0x46
+};
+
+static BYTE NLSALLOC(100c) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(100c) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(100c) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(100c) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(100c) rgbINEGCURR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(100c) rgbSDATE[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(100c) rgbSSHORTDATE[] = { /* "dd.MM.yy" */
+ 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(100c) rgbSLONGDATE[] = { /* "dddd, d. MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e
+ , 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(100c) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(100c) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbSDAYNAME1[] = { /* "lundi" */
+ 0x6c, 0x75, 0x6e, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(100c) rgbSDAYNAME2[] = { /* "mardi" */
+ 0x6d, 0x61, 0x72, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(100c) rgbSDAYNAME3[] = { /* "mercredi" */
+ 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(100c) rgbSDAYNAME4[] = { /* "jeudi" */
+ 0x6a, 0x65, 0x75, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(100c) rgbSDAYNAME5[] = { /* "vendredi" */
+ 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(100c) rgbSDAYNAME6[] = { /* "samedi" */
+ 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69
+};
+
+static BYTE NLSALLOC(100c) rgbSDAYNAME7[] = { /* "dimanche" */
+ 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVDAYNAME1[] = { /* "lun." */
+ 0x6c, 0x75, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVDAYNAME2[] = { /* "mar." */
+ 0x6d, 0x61, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVDAYNAME3[] = { /* "mer." */
+ 0x6d, 0x65, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVDAYNAME4[] = { /* "jeu." */
+ 0x6a, 0x65, 0x75, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVDAYNAME5[] = { /* "ven." */
+ 0x76, 0x65, 0x6e, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVDAYNAME6[] = { /* "sam." */
+ 0x73, 0x61, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVDAYNAME7[] = { /* "dim." */
+ 0x64, 0x69, 0x6d, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME1[] = { /* "janvier" */
+ 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME2[] = { /* "février" */
+ 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME4[] = { /* "avril" */
+ 0x61, 0x76, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME6[] = { /* "juin" */
+ 0x6a, 0x75, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME7[] = { /* "juillet" */
+ 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME8[] = { /* "août" */
+ 0x61, 0x6f, 0xfb, 0x74
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME9[] = { /* "septembre" */
+ 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72
+ , 0x65
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME10[] = { /* "octobre" */
+ 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME11[] = { /* "novembre" */
+ 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(100c) rgbSMONTHNAME12[] = { /* "décembre" */
+ 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME1[] = { /* "janv." */
+ 0x6a, 0x61, 0x6e, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME2[] = { /* "févr." */
+ 0x66, 0xe9, 0x76, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME3[] = { /* "mars" */
+ 0x6d, 0x61, 0x72, 0x73
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME4[] = { /* "avr." */
+ 0x61, 0x76, 0x72, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME5[] = { /* "mai" */
+ 0x6d, 0x61, 0x69
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME6[] = { /* "juin" */
+ 0x6a, 0x75, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME7[] = { /* "juil." */
+ 0x6a, 0x75, 0x69, 0x6c, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME8[] = { /* "août" */
+ 0x61, 0x6f, 0xfb, 0x74
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME9[] = { /* "sept." */
+ 0x73, 0x65, 0x70, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME10[] = { /* "oct." */
+ 0x6f, 0x63, 0x74, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME11[] = { /* "nov." */
+ 0x6e, 0x6f, 0x76, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSABBREVMONTHNAME12[] = { /* "déc." */
+ 0x64, 0xe9, 0x63, 0x2e
+};
+
+static BYTE NLSALLOC(100c) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(100c) rgbIPOSSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(100c) rgbINEGSIGNPOSN[] = { /* "4" */
+ 0x34
+};
+
+static BYTE NLSALLOC(100c) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(100c) rgbSENGCOUNTRY[] = { /* "Switzerland" */
+ 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(100c) rgbSENGLANGUAGE[] = { /* "French" */
+ 0x46, 0x72, 0x65, 0x6e, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(100c) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(100c) rgbIFIRSTWEEKOFYEAR[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(100c) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(100c) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(100c) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(100c) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(100c) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(100c) g_rglcinfo100c[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 12, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 8, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 11, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 0, NULL } /* STHOUSAND */
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 0, NULL } /* SMONTHOUSANDSEP */
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 18, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 5, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 8, rgbSDAYNAME7 }
+ , { 4, rgbSABBREVDAYNAME1 }
+ , { 4, rgbSABBREVDAYNAME2 }
+ , { 4, rgbSABBREVDAYNAME3 }
+ , { 4, rgbSABBREVDAYNAME4 }
+ , { 4, rgbSABBREVDAYNAME5 }
+ , { 4, rgbSABBREVDAYNAME6 }
+ , { 4, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 7, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 7, rgbSMONTHNAME7 }
+ , { 4, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 5, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 4, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 4, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 4, rgbSABBREVMONTHNAME10 }
+ , { 4, rgbSABBREVMONTHNAME11 }
+ , { 4, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 11, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(100c) g_strinfo100c = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/1401.c b/private/oleauto/src/dispatch/win16/1401.c
new file mode 100644
index 000000000..6607c108b
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/1401.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 1401.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Algeria
+*
+* LCID = 0x1401
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:30:05 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(1401) rgbILANGUAGE[] = { /* "1401" */
+ 0x31, 0x34, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVLANGNAME[] = { /* "ARG" */
+ 0x41, 0x52, 0x47
+};
+
+static BYTE NLSALLOC(1401) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(1401) rgbICOUNTRY[] = { /* "213" */
+ 0x32, 0x31, 0x33
+};
+
+static BYTE NLSALLOC(1401) rgbSCOUNTRY[] = { /* "Algeria" */
+ 0x41, 0x6c, 0x67, 0x65, 0x72, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVCTRYNAME[] = { /* "DZA" */
+ 0x44, 0x5a, 0x41
+};
+
+static BYTE NLSALLOC(1401) rgbSNATIVECTRYNAME[] = { /* "\x0627\x0644\x062c\x0632\x0627\x0626\x0631" */
+ 0xc7, 0xe1, 0xcc, 0xd2, 0xc7, 0xc6, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbIDEFAULTLANGUAGE[] = { /* "1401" */
+ 0x31, 0x34, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbIDEFAULTCOUNTRY[] = { /* "213" */
+ 0x32, 0x31, 0x33
+};
+
+static BYTE NLSALLOC(1401) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(1401) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(1401) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1401) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1401) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1401) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1401) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1401) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(1401) rgbSCURRENCY[] = { /* "\x062f.\x062c.\x200f" */
+ 0xcf, 0x2e, 0xcc, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(1401) rgbSINTLSYMBOL[] = { /* "DZD" */
+ 0x44, 0x5a, 0x44
+};
+
+static BYTE NLSALLOC(1401) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1401) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1401) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1401) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1401) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1401) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1401) rgbSDATE[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1401) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(1401) rgbSSHORTDATE[] = { /* "dd-MM-yy" */
+ 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1401) rgbSLONGDATE[] = { /* "dd-MM-yyyy" */
+ 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1401) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1401) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1401) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1401) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1401) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1401) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(1401) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(1401) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(1401) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(1401) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(1401) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1401) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1401) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(1401) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME1[] = { /* "\x062c\x0627\x0646\x0641\x064a" */
+ 0xcc, 0xc7, 0xe4, 0xdd, 0xed
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME2[] = { /* "\x0641\x064a\x0641\x0631\x064a" */
+ 0xdd, 0xed, 0xdd, 0xd1, 0xed
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME4[] = { /* "\x0627\x0641\x0631\x064a\x0644" */
+ 0xc7, 0xdd, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a" */
+ 0xe3, 0xc7, 0xed
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME6[] = { /* "\x062c\x0648\x0627\x0646" */
+ 0xcc, 0xe6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME7[] = { /* "\x062c\x0648\x064a\x0644\x064a\x0647" */
+ 0xcc, 0xe6, 0xed, 0xe1, 0xed, 0xe5
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME8[] = { /* "\x0623\x0648\x062a" */
+ 0xc3, 0xe6, 0xca
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME1[] = { /* "\x062c\x0627\x0646\x0641\x064a" */
+ 0xcc, 0xc7, 0xe4, 0xdd, 0xed
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x064a\x0641\x0631\x064a" */
+ 0xdd, 0xed, 0xdd, 0xd1, 0xed
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0641\x0631\x064a\x0644" */
+ 0xc7, 0xdd, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a" */
+ 0xe3, 0xc7, 0xed
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME6[] = { /* "\x062c\x0648\x0627\x0646" */
+ 0xcc, 0xe6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME7[] = { /* "\x062c\x0648\x064a\x0644\x064a\x0647" */
+ 0xcc, 0xe6, 0xed, 0xe1, 0xed, 0xe5
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x0648\x062a" */
+ 0xc3, 0xe6, 0xca
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1401) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1401) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1401) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1401) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1401) rgbSENGCOUNTRY[] = { /* "Algeria" */
+ 0x41, 0x6c, 0x67, 0x65, 0x72, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(1401) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(1401) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(1401) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1401) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(1401) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1401) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(1401) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1401) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(1401) g_rglcinfo1401[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 7, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 5, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 6, rgbSMONTHNAME7 }
+ , { 3, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 5, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 6, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(1401) g_strinfo1401 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/1409.c b/private/oleauto/src/dispatch/win16/1409.c
new file mode 100644
index 000000000..642564187
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/1409.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 1409.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* English - New Zealand
+*
+* LCID = 0x1409
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:48:25 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(1409) rgbILANGUAGE[] = { /* "1409" */
+ 0x31, 0x34, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(1409) rgbSLANGUAGE[] = { /* "New Zealand English" */
+ 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c
+ , 0x61, 0x6e, 0x64, 0x20, 0x45, 0x6e, 0x67, 0x6c
+ , 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVLANGNAME[] = { /* "ENZ" */
+ 0x45, 0x4e, 0x5a
+};
+
+static BYTE NLSALLOC(1409) rgbSNATIVELANGNAME[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1409) rgbICOUNTRY[] = { /* "64" */
+ 0x36, 0x34
+};
+
+static BYTE NLSALLOC(1409) rgbSCOUNTRY[] = { /* "New Zealand" */
+ 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVCTRYNAME[] = { /* "NZL" */
+ 0x4e, 0x5a, 0x4c
+};
+
+static BYTE NLSALLOC(1409) rgbSNATIVECTRYNAME[] = { /* "New Zealand" */
+ 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(1409) rgbIDEFAULTLANGUAGE[] = { /* "1409" */
+ 0x31, 0x34, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(1409) rgbIDEFAULTCOUNTRY[] = { /* "64" */
+ 0x36, 0x34
+};
+
+static BYTE NLSALLOC(1409) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1409) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1409) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1409) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1409) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(1409) rgbSCURRENCY[] = { /* "$" */
+ 0x24
+};
+
+static BYTE NLSALLOC(1409) rgbSINTLSYMBOL[] = { /* "NZD" */
+ 0x4e, 0x5a, 0x44
+};
+
+static BYTE NLSALLOC(1409) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1409) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1409) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1409) rgbICURRENCY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbINEGCURR[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(1409) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(1409) rgbSSHORTDATE[] = { /* "d/MM/yy" */
+ 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSLONGDATE[] = { /* "dddd, d MMMM yyyy" */
+ 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20
+ , 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79
+ , 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbIDAYLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbSDAYNAME1[] = { /* "Monday" */
+ 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSDAYNAME2[] = { /* "Tuesday" */
+ 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSDAYNAME3[] = { /* "Wednesday" */
+ 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61
+ , 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSDAYNAME4[] = { /* "Thursday" */
+ 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSDAYNAME5[] = { /* "Friday" */
+ 0x46, 0x72, 0x69, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSDAYNAME6[] = { /* "Saturday" */
+ 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSDAYNAME7[] = { /* "Sunday" */
+ 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVDAYNAME1[] = { /* "Mon" */
+ 0x4d, 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVDAYNAME2[] = { /* "Tue" */
+ 0x54, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVDAYNAME3[] = { /* "Wed" */
+ 0x57, 0x65, 0x64
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVDAYNAME4[] = { /* "Thu" */
+ 0x54, 0x68, 0x75
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVDAYNAME5[] = { /* "Fri" */
+ 0x46, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVDAYNAME6[] = { /* "Sat" */
+ 0x53, 0x61, 0x74
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVDAYNAME7[] = { /* "Sun" */
+ 0x53, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME1[] = { /* "January" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME2[] = { /* "February" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME3[] = { /* "March" */
+ 0x4d, 0x61, 0x72, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME6[] = { /* "June" */
+ 0x4a, 0x75, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME7[] = { /* "July" */
+ 0x4a, 0x75, 0x6c, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME10[] = { /* "October" */
+ 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1409) rgbSMONTHNAME12[] = { /* "December" */
+ 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME3[] = { /* "Mar" */
+ 0x4d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME10[] = { /* "Oct" */
+ 0x4f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(1409) rgbSABBREVMONTHNAME12[] = { /* "Dec" */
+ 0x44, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(1409) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1409) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1409) rgbINEGSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1409) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbIPOSSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbSENGCOUNTRY[] = { /* "New Zealand" */
+ 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c
+ , 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(1409) rgbSENGLANGUAGE[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1409) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(1409) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(1409) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1409) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1409) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(1409) g_rglcinfo1409[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 19, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 2, rgbICOUNTRY }
+ , { 11, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 11, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 2, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 1, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 7, rgbSSHORTDATE }
+ , { 17, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 11, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(1409) g_strinfo1409 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/1801.c b/private/oleauto/src/dispatch/win16/1801.c
new file mode 100644
index 000000000..9d0009641
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/1801.c
@@ -0,0 +1,521 @@
+/****************************************************************************
+* 1801.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Morocco
+*
+* LCID = 0x1801
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:31:09 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(1801) rgbILANGUAGE[] = { /* "1801" */
+ 0x31, 0x38, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVLANGNAME[] = { /* "ARM" */
+ 0x41, 0x52, 0x4d
+};
+
+static BYTE NLSALLOC(1801) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(1801) rgbICOUNTRY[] = { /* "212" */
+ 0x32, 0x31, 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbSCOUNTRY[] = { /* "Morocco" */
+ 0x4d, 0x6f, 0x72, 0x6f, 0x63, 0x63, 0x6f
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVCTRYNAME[] = { /* "MAR" */
+ 0x4d, 0x41, 0x52
+};
+
+static BYTE NLSALLOC(1801) rgbSNATIVECTRYNAME[] = { /* "\x0627\x0644\x0645\x0645\x0644\x0643\x0629 \x0627\x0644\x0645\x063a\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xe3, 0xe3, 0xe1, 0xdf, 0xc9, 0x20
+ , 0xc7, 0xe1, 0xe3, 0xdb, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(1801) rgbIDEFAULTLANGUAGE[] = { /* "1801" */
+ 0x31, 0x38, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbIDEFAULTCOUNTRY[] = { /* "212" */
+ 0x32, 0x31, 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(1801) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(1801) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1801) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1801) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(1801) rgbSCURRENCY[] = { /* "\x062f.\x0645." */
+ 0xcf, 0x2e, 0xe3, 0x2e
+};
+
+static BYTE NLSALLOC(1801) rgbSINTLSYMBOL[] = { /* "MAD" */
+ 0x4d, 0x41, 0x44
+};
+
+static BYTE NLSALLOC(1801) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1801) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1801) rgbSDATE[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1801) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(1801) rgbSSHORTDATE[] = { /* "dd-MM-yy" */
+ 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1801) rgbSLONGDATE[] = { /* "dd-MM-yyyy" */
+ 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1801) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(1801) rgbSDAYNAME2[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1801) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1801) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(1801) rgbSDAYNAME5[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(1801) rgbSDAYNAME6[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(1801) rgbSDAYNAME7[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME8[] = { /* "\x063a\x0634\x062a" */
+ 0xdb, 0xd4, 0xca
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME8[] = { /* "\x063a\x0634\x062a" */
+ 0xdb, 0xd4, 0xca
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1801) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1801) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1801) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbSENGCOUNTRY[] = { /* "Morocco" */
+ 0x4d, 0x6f, 0x72, 0x6f, 0x63, 0x63, 0x6f
+};
+
+static BYTE NLSALLOC(1801) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(1801) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1801) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(1801) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1801) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(1801) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1801) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(1801) g_rglcinfo1801[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 16, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 4, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 7, rgbSDAYNAME1 }
+ , { 8, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 6, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 5, rgbSDAYNAME6 }
+ , { 5, rgbSDAYNAME7 }
+ , { 7, rgbSABBREVDAYNAME1 }
+ , { 8, rgbSABBREVDAYNAME2 }
+ , { 8, rgbSABBREVDAYNAME3 }
+ , { 6, rgbSABBREVDAYNAME4 }
+ , { 6, rgbSABBREVDAYNAME5 }
+ , { 5, rgbSABBREVDAYNAME6 }
+ , { 5, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 3, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 5, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 5, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(1801) g_strinfo1801 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/1809.c b/private/oleauto/src/dispatch/win16/1809.c
new file mode 100644
index 000000000..14913074e
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/1809.c
@@ -0,0 +1,523 @@
+/****************************************************************************
+* 1809.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* English - Ireland
+*
+* LCID = 0x1809
+*
+* CodePage = 1252
+*
+* Generated: Thu Dec 01 17:49:44 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0409[256]; // from 0409:English - United States
+extern EXPANSION rgexp_0409[7];
+extern WORD rgwCType12_0409[256];
+extern WORD rgwCType3_0409[256];
+extern BYTE rgbUCase_0409[256];
+extern BYTE rgbLCase_0409[256];
+
+static BYTE NLSALLOC(1809) rgbILANGUAGE[] = { /* "1809" */
+ 0x31, 0x38, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(1809) rgbSLANGUAGE[] = { /* "Irish English" */
+ 0x49, 0x72, 0x69, 0x73, 0x68, 0x20, 0x45, 0x6e
+ , 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVLANGNAME[] = { /* "ENI" */
+ 0x45, 0x4e, 0x49
+};
+
+static BYTE NLSALLOC(1809) rgbSNATIVELANGNAME[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1809) rgbICOUNTRY[] = { /* "353" */
+ 0x33, 0x35, 0x33
+};
+
+static BYTE NLSALLOC(1809) rgbSCOUNTRY[] = { /* "Ireland" */
+ 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVCTRYNAME[] = { /* "IRL" */
+ 0x49, 0x52, 0x4c
+};
+
+static BYTE NLSALLOC(1809) rgbSNATIVECTRYNAME[] = { /* "Eire" */
+ 0x45, 0x69, 0x72, 0x65
+};
+
+static BYTE NLSALLOC(1809) rgbIDEFAULTLANGUAGE[] = { /* "1809" */
+ 0x31, 0x38, 0x30, 0x39
+};
+
+static BYTE NLSALLOC(1809) rgbIDEFAULTCOUNTRY[] = { /* "353" */
+ 0x33, 0x35, 0x33
+};
+
+static BYTE NLSALLOC(1809) rgbIDEFAULTCODEPAGE[] = { /* "850" */
+ 0x38, 0x35, 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbSLIST[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1809) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1809) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1809) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1809) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(1809) rgbSCURRENCY[] = { /* "IR£" */
+ 0x49, 0x52, 0xa3
+};
+
+static BYTE NLSALLOC(1809) rgbSINTLSYMBOL[] = { /* "IEP" */
+ 0x49, 0x45, 0x50
+};
+
+static BYTE NLSALLOC(1809) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1809) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1809) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1809) rgbICURRENCY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbINEGCURR[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(1809) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(1809) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSLONGDATE[] = { /* "dd MMMM yyyy" */
+ 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20
+ , 0x79, 0x79, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbIDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbILDATE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbITIME[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbITLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbSDAYNAME1[] = { /* "Monday" */
+ 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSDAYNAME2[] = { /* "Tuesday" */
+ 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSDAYNAME3[] = { /* "Wednesday" */
+ 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61
+ , 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSDAYNAME4[] = { /* "Thursday" */
+ 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSDAYNAME5[] = { /* "Friday" */
+ 0x46, 0x72, 0x69, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSDAYNAME6[] = { /* "Saturday" */
+ 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSDAYNAME7[] = { /* "Sunday" */
+ 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVDAYNAME1[] = { /* "Mon" */
+ 0x4d, 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVDAYNAME2[] = { /* "Tue" */
+ 0x54, 0x75, 0x65
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVDAYNAME3[] = { /* "Wed" */
+ 0x57, 0x65, 0x64
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVDAYNAME4[] = { /* "Thu" */
+ 0x54, 0x68, 0x75
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVDAYNAME5[] = { /* "Fri" */
+ 0x46, 0x72, 0x69
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVDAYNAME6[] = { /* "Sat" */
+ 0x53, 0x61, 0x74
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVDAYNAME7[] = { /* "Sun" */
+ 0x53, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME1[] = { /* "January" */
+ 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME2[] = { /* "February" */
+ 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME3[] = { /* "March" */
+ 0x4d, 0x61, 0x72, 0x63, 0x68
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME4[] = { /* "April" */
+ 0x41, 0x70, 0x72, 0x69, 0x6c
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME6[] = { /* "June" */
+ 0x4a, 0x75, 0x6e, 0x65
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME7[] = { /* "July" */
+ 0x4a, 0x75, 0x6c, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME8[] = { /* "August" */
+ 0x41, 0x75, 0x67, 0x75, 0x73, 0x74
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME9[] = { /* "September" */
+ 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65
+ , 0x72
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME10[] = { /* "October" */
+ 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME11[] = { /* "November" */
+ 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1809) rgbSMONTHNAME12[] = { /* "December" */
+ 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME1[] = { /* "Jan" */
+ 0x4a, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME2[] = { /* "Feb" */
+ 0x46, 0x65, 0x62
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME3[] = { /* "Mar" */
+ 0x4d, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME4[] = { /* "Apr" */
+ 0x41, 0x70, 0x72
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME5[] = { /* "May" */
+ 0x4d, 0x61, 0x79
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME6[] = { /* "Jun" */
+ 0x4a, 0x75, 0x6e
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME7[] = { /* "Jul" */
+ 0x4a, 0x75, 0x6c
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME8[] = { /* "Aug" */
+ 0x41, 0x75, 0x67
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME9[] = { /* "Sep" */
+ 0x53, 0x65, 0x70
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME10[] = { /* "Oct" */
+ 0x4f, 0x63, 0x74
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME11[] = { /* "Nov" */
+ 0x4e, 0x6f, 0x76
+};
+
+static BYTE NLSALLOC(1809) rgbSABBREVMONTHNAME12[] = { /* "Dec" */
+ 0x44, 0x65, 0x63
+};
+
+static BYTE NLSALLOC(1809) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1809) rgbIPOSSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1809) rgbINEGSIGNPOSN[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1809) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbIPOSSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbSENGCOUNTRY[] = { /* "Ireland" */
+ 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64
+};
+
+static BYTE NLSALLOC(1809) rgbSENGLANGUAGE[] = { /* "English" */
+ 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68
+};
+
+static BYTE NLSALLOC(1809) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbIDEFAULTANSICODEPAGE[] = { /* "1252" */
+ 0x31, 0x32, 0x35, 0x32
+};
+
+static BYTE NLSALLOC(1809) rgbINEGNUMBER[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbSTIMEFORMAT[] = { /* "HH:mm:ss" */
+ 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(1809) rgbITIMEMARKPOSN[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1809) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1809) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(1809) g_rglcinfo1809[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 13, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 4, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 3, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 12, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 6, rgbSDAYNAME1 }
+ , { 7, rgbSDAYNAME2 }
+ , { 9, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 8, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 3, rgbSABBREVDAYNAME1 }
+ , { 3, rgbSABBREVDAYNAME2 }
+ , { 3, rgbSABBREVDAYNAME3 }
+ , { 3, rgbSABBREVDAYNAME4 }
+ , { 3, rgbSABBREVDAYNAME5 }
+ , { 3, rgbSABBREVDAYNAME6 }
+ , { 3, rgbSABBREVDAYNAME7 }
+ , { 7, rgbSMONTHNAME1 }
+ , { 8, rgbSMONTHNAME2 }
+ , { 5, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 6, rgbSMONTHNAME8 }
+ , { 9, rgbSMONTHNAME9 }
+ , { 7, rgbSMONTHNAME10 }
+ , { 8, rgbSMONTHNAME11 }
+ , { 8, rgbSMONTHNAME12 }
+ , { 3, rgbSABBREVMONTHNAME1 }
+ , { 3, rgbSABBREVMONTHNAME2 }
+ , { 3, rgbSABBREVMONTHNAME3 }
+ , { 3, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 3, rgbSABBREVMONTHNAME6 }
+ , { 3, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 3, rgbSABBREVMONTHNAME9 }
+ , { 3, rgbSABBREVMONTHNAME10 }
+ , { 3, rgbSABBREVMONTHNAME11 }
+ , { 3, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 7, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 8, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(1809) g_strinfo1809 = {
+ rgbUCase_0409
+ , rgbLCase_0409
+ , rgwCType12_0409
+ , rgwCType3_0409
+ , rgwSort_0409
+ , rgexp_0409
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/1c01.c b/private/oleauto/src/dispatch/win16/1c01.c
new file mode 100644
index 000000000..a0bb5d519
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/1c01.c
@@ -0,0 +1,520 @@
+/****************************************************************************
+* 1c01.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Tunisia
+*
+* LCID = 0x1c01
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:32:04 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(1c01) rgbILANGUAGE[] = { /* "1c01" */
+ 0x31, 0x63, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVLANGNAME[] = { /* "ART" */
+ 0x41, 0x52, 0x54
+};
+
+static BYTE NLSALLOC(1c01) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(1c01) rgbICOUNTRY[] = { /* "216" */
+ 0x32, 0x31, 0x36
+};
+
+static BYTE NLSALLOC(1c01) rgbSCOUNTRY[] = { /* "Tunisia" */
+ 0x54, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVCTRYNAME[] = { /* "TUN" */
+ 0x54, 0x55, 0x4e
+};
+
+static BYTE NLSALLOC(1c01) rgbSNATIVECTRYNAME[] = { /* "\x062a\x0648\x0646\x0633" */
+ 0xca, 0xe6, 0xe4, 0xd3
+};
+
+static BYTE NLSALLOC(1c01) rgbIDEFAULTLANGUAGE[] = { /* "1c01" */
+ 0x31, 0x63, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbIDEFAULTCOUNTRY[] = { /* "216" */
+ 0x32, 0x31, 0x36
+};
+
+static BYTE NLSALLOC(1c01) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(1c01) rgbSLIST[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(1c01) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1c01) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1c01) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbIDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1c01) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(1c01) rgbSCURRENCY[] = { /* "\x062f.\x062a.\x200f" */
+ 0xcf, 0x2e, 0xca, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(1c01) rgbSINTLSYMBOL[] = { /* "TND" */
+ 0x54, 0x4e, 0x44
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbICURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1c01) rgbIINTLCURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1c01) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1c01) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1c01) rgbSDATE[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1c01) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(1c01) rgbSSHORTDATE[] = { /* "dd-MM-yy" */
+ 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1c01) rgbSLONGDATE[] = { /* "dd-MM-yyyy" */
+ 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(1c01) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1c01) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1c01) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(1c01) rgbSDAYNAME2[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1c01) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1c01) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(1c01) rgbSDAYNAME5[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(1c01) rgbSDAYNAME6[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(1c01) rgbSDAYNAME7[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME1[] = { /* "\x062c\x0627\x0646\x0641\x064a" */
+ 0xcc, 0xc7, 0xe4, 0xdd, 0xed
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME2[] = { /* "\x0641\x064a\x0641\x0631\x064a" */
+ 0xdd, 0xed, 0xdd, 0xd1, 0xed
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME4[] = { /* "\x0627\x0641\x0631\x064a\x0644" */
+ 0xc7, 0xdd, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a" */
+ 0xe3, 0xc7, 0xed
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME6[] = { /* "\x062c\x0648\x0627\x0646" */
+ 0xcc, 0xe6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME7[] = { /* "\x062c\x0648\x064a\x0644\x064a\x0647" */
+ 0xcc, 0xe6, 0xed, 0xe1, 0xed, 0xe5
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME8[] = { /* "\x0623\x0648\x062a" */
+ 0xc3, 0xe6, 0xca
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1c01) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME1[] = { /* "\x062c\x0627\x0646\x0641\x064a" */
+ 0xcc, 0xc7, 0xe4, 0xdd, 0xed
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x064a\x0641\x0631\x064a" */
+ 0xdd, 0xed, 0xdd, 0xd1, 0xed
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0641\x0631\x064a\x0644" */
+ 0xc7, 0xdd, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a" */
+ 0xe3, 0xc7, 0xed
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME6[] = { /* "\x062c\x0648\x0627\x0646" */
+ 0xcc, 0xe6, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME7[] = { /* "\x062c\x0648\x064a\x0644\x064a\x0647" */
+ 0xcc, 0xe6, 0xed, 0xe1, 0xed, 0xe5
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x0648\x062a" */
+ 0xc3, 0xe6, 0xca
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1c01) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(1c01) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(1c01) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1c01) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(1c01) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbSENGCOUNTRY[] = { /* "Tunisia" */
+ 0x54, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(1c01) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(1c01) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(1c01) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(1c01) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(1c01) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(1c01) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(1c01) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(1c01) g_rglcinfo1c01[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 4, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 0, NULL } /* S1159 */
+ , { 0, NULL } /* S2359 */
+ , { 7, rgbSDAYNAME1 }
+ , { 8, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 6, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 5, rgbSDAYNAME6 }
+ , { 5, rgbSDAYNAME7 }
+ , { 7, rgbSABBREVDAYNAME1 }
+ , { 8, rgbSABBREVDAYNAME2 }
+ , { 8, rgbSABBREVDAYNAME3 }
+ , { 6, rgbSABBREVDAYNAME4 }
+ , { 6, rgbSABBREVDAYNAME5 }
+ , { 5, rgbSABBREVDAYNAME6 }
+ , { 5, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 5, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 3, rgbSMONTHNAME5 }
+ , { 4, rgbSMONTHNAME6 }
+ , { 6, rgbSMONTHNAME7 }
+ , { 3, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 5, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 3, rgbSABBREVMONTHNAME5 }
+ , { 4, rgbSABBREVMONTHNAME6 }
+ , { 6, rgbSABBREVMONTHNAME7 }
+ , { 3, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(1c01) g_strinfo1c01 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/2001.c b/private/oleauto/src/dispatch/win16/2001.c
new file mode 100644
index 000000000..c88b1d265
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/2001.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 2001.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Oman
+*
+* LCID = 0x2001
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:32:57 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(2001) rgbILANGUAGE[] = { /* "2001" */
+ 0x32, 0x30, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVLANGNAME[] = { /* "ARO" */
+ 0x41, 0x52, 0x4f
+};
+
+static BYTE NLSALLOC(2001) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(2001) rgbICOUNTRY[] = { /* "968" */
+ 0x39, 0x36, 0x38
+};
+
+static BYTE NLSALLOC(2001) rgbSCOUNTRY[] = { /* "Oman" */
+ 0x4f, 0x6d, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVCTRYNAME[] = { /* "OMN" */
+ 0x4f, 0x4d, 0x4e
+};
+
+static BYTE NLSALLOC(2001) rgbSNATIVECTRYNAME[] = { /* "\x0639\x0645\x0627\x0646" */
+ 0xda, 0xe3, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2001) rgbIDEFAULTLANGUAGE[] = { /* "2001" */
+ 0x32, 0x30, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbIDEFAULTCOUNTRY[] = { /* "968" */
+ 0x39, 0x36, 0x38
+};
+
+static BYTE NLSALLOC(2001) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(2001) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(2001) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2001) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(2001) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(2001) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(2001) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2001) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(2001) rgbSCURRENCY[] = { /* "\x0631.\x0639.\x200f" */
+ 0xd1, 0x2e, 0xda, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(2001) rgbSINTLSYMBOL[] = { /* "OMR" */
+ 0x4f, 0x4d, 0x52
+};
+
+static BYTE NLSALLOC(2001) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(2001) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(2001) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2001) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2001) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2001) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2001) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(2001) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(2001) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(2001) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(2001) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2001) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2001) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2001) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2001) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2001) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(2001) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(2001) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(2001) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(2001) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(2001) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2001) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2001) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(2001) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2001) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(2001) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2001) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2001) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2001) rgbSENGCOUNTRY[] = { /* "Oman" */
+ 0x4f, 0x6d, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(2001) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(2001) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(2001) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2001) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(2001) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2001) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(2001) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2001) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(2001) g_rglcinfo2001[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 4, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 4, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 4, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(2001) g_strinfo2001 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/2401.c b/private/oleauto/src/dispatch/win16/2401.c
new file mode 100644
index 000000000..cb1dfae48
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/2401.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 2401.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Yemen
+*
+* LCID = 0x2401
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:33:50 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(2401) rgbILANGUAGE[] = { /* "2401" */
+ 0x32, 0x34, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVLANGNAME[] = { /* "ARY" */
+ 0x41, 0x52, 0x59
+};
+
+static BYTE NLSALLOC(2401) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(2401) rgbICOUNTRY[] = { /* "967" */
+ 0x39, 0x36, 0x37
+};
+
+static BYTE NLSALLOC(2401) rgbSCOUNTRY[] = { /* "Yemen" */
+ 0x59, 0x65, 0x6d, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVCTRYNAME[] = { /* "YEM" */
+ 0x59, 0x45, 0x4d
+};
+
+static BYTE NLSALLOC(2401) rgbSNATIVECTRYNAME[] = { /* "\x0627\x0644\x064a\x0645\x0646" */
+ 0xc7, 0xe1, 0xed, 0xe3, 0xe4
+};
+
+static BYTE NLSALLOC(2401) rgbIDEFAULTLANGUAGE[] = { /* "2401" */
+ 0x32, 0x34, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbIDEFAULTCOUNTRY[] = { /* "967" */
+ 0x39, 0x36, 0x37
+};
+
+static BYTE NLSALLOC(2401) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(2401) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(2401) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2401) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(2401) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(2401) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(2401) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2401) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(2401) rgbSCURRENCY[] = { /* "\x0631.\x064a.\x200f" */
+ 0xd1, 0x2e, 0xed, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(2401) rgbSINTLSYMBOL[] = { /* "YER" */
+ 0x59, 0x45, 0x52
+};
+
+static BYTE NLSALLOC(2401) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(2401) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(2401) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2401) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2401) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2401) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2401) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(2401) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(2401) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(2401) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(2401) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2401) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2401) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2401) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2401) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2401) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(2401) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(2401) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(2401) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(2401) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(2401) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2401) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2401) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(2401) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(2401) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(2401) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2401) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2401) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2401) rgbSENGCOUNTRY[] = { /* "Yemen" */
+ 0x59, 0x65, 0x6d, 0x65, 0x6e
+};
+
+static BYTE NLSALLOC(2401) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(2401) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(2401) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2401) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(2401) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2401) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(2401) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2401) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(2401) g_rglcinfo2401[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 5, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(2401) g_strinfo2401 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/2801.c b/private/oleauto/src/dispatch/win16/2801.c
new file mode 100644
index 000000000..caa3f8c21
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/2801.c
@@ -0,0 +1,536 @@
+/****************************************************************************
+* 2801.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Syria
+*
+* LCID = 0x2801
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:34:45 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(2801) rgbILANGUAGE[] = { /* "2801" */
+ 0x32, 0x38, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVLANGNAME[] = { /* "ARS" */
+ 0x41, 0x52, 0x53
+};
+
+static BYTE NLSALLOC(2801) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(2801) rgbICOUNTRY[] = { /* "963" */
+ 0x39, 0x36, 0x33
+};
+
+static BYTE NLSALLOC(2801) rgbSCOUNTRY[] = { /* "Syria" */
+ 0x53, 0x79, 0x72, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVCTRYNAME[] = { /* "SYR" */
+ 0x53, 0x59, 0x52
+};
+
+static BYTE NLSALLOC(2801) rgbSNATIVECTRYNAME[] = { /* "\x0633\x0648\x0631\x064a\x0627" */
+ 0xd3, 0xe6, 0xd1, 0xed, 0xc7
+};
+
+static BYTE NLSALLOC(2801) rgbIDEFAULTLANGUAGE[] = { /* "2801" */
+ 0x32, 0x38, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbIDEFAULTCOUNTRY[] = { /* "963" */
+ 0x39, 0x36, 0x33
+};
+
+static BYTE NLSALLOC(2801) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(2801) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(2801) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2801) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(2801) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(2801) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(2801) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2801) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(2801) rgbSCURRENCY[] = { /* "\x0644.\x0633.\x200f" */
+ 0xe1, 0x2e, 0xd3, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(2801) rgbSINTLSYMBOL[] = { /* "SYP" */
+ 0x53, 0x59, 0x50
+};
+
+static BYTE NLSALLOC(2801) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(2801) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(2801) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2801) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2801) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2801) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2801) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(2801) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(2801) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(2801) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(2801) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2801) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2801) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2801) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2801) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2801) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(2801) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(2801) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(2801) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(2801) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(2801) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2801) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2801) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(2801) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME1[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME2[] = { /* "\x0634\x0628\x0627\x0637" */
+ 0xd4, 0xc8, 0xc7, 0xd8
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME3[] = { /* "\x0622\x0630\x0627\x0631" */
+ 0xc2, 0xd0, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME4[] = { /* "\x0646\x064a\x0633\x0627\x0646" */
+ 0xe4, 0xed, 0xd3, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME5[] = { /* "\x0623\x064a\x0627\x0631" */
+ 0xc3, 0xed, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME6[] = { /* "\x062d\x0632\x064a\x0631\x0627\x0646" */
+ 0xcd, 0xd2, 0xed, 0xd1, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME7[] = { /* "\x062a\x0645\x0648\x0632" */
+ 0xca, 0xe3, 0xe6, 0xd2
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME8[] = { /* "\x0622\x0628" */
+ 0xc2, 0xc8
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME9[] = { /* "\x0623\x064a\x0644\x0648\x0644" */
+ 0xc3, 0xed, 0xe1, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME10[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME11[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(2801) rgbSMONTHNAME12[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME1[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME2[] = { /* "\x0634\x0628\x0627\x0637" */
+ 0xd4, 0xc8, 0xc7, 0xd8
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME3[] = { /* "\x0622\x0630\x0627\x0631" */
+ 0xc2, 0xd0, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME4[] = { /* "\x0646\x064a\x0633\x0627\x0646" */
+ 0xe4, 0xed, 0xd3, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME5[] = { /* "\x0623\x064a\x0627\x0631" */
+ 0xc3, 0xed, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME6[] = { /* "\x062d\x0632\x064a\x0631\x0627\x0646" */
+ 0xcd, 0xd2, 0xed, 0xd1, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME7[] = { /* "\x062a\x0645\x0648\x0632" */
+ 0xca, 0xe3, 0xe6, 0xd2
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME8[] = { /* "\x0622\x0628" */
+ 0xc2, 0xc8
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME9[] = { /* "\x0623\x064a\x0644\x0648\x0644" */
+ 0xc3, 0xed, 0xe1, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME10[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME11[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(2801) rgbSABBREVMONTHNAME12[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2801) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(2801) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2801) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2801) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2801) rgbSENGCOUNTRY[] = { /* "Syria" */
+ 0x53, 0x79, 0x72, 0x69, 0x61
+};
+
+static BYTE NLSALLOC(2801) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(2801) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(2801) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2801) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(2801) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2801) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(2801) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2801) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(2801) g_rglcinfo2801[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 5, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 12, rgbSMONTHNAME1 }
+ , { 4, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 6, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 2, rgbSMONTHNAME8 }
+ , { 5, rgbSMONTHNAME9 }
+ , { 11, rgbSMONTHNAME10 }
+ , { 12, rgbSMONTHNAME11 }
+ , { 11, rgbSMONTHNAME12 }
+ , { 12, rgbSABBREVMONTHNAME1 }
+ , { 4, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 6, rgbSABBREVMONTHNAME6 }
+ , { 4, rgbSABBREVMONTHNAME7 }
+ , { 2, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 11, rgbSABBREVMONTHNAME10 }
+ , { 12, rgbSABBREVMONTHNAME11 }
+ , { 11, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(2801) g_strinfo2801 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/2c01.c b/private/oleauto/src/dispatch/win16/2c01.c
new file mode 100644
index 000000000..973645885
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/2c01.c
@@ -0,0 +1,536 @@
+/****************************************************************************
+* 2c01.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Jordan
+*
+* LCID = 0x2c01
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:35:38 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(2c01) rgbILANGUAGE[] = { /* "2c01" */
+ 0x32, 0x63, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVLANGNAME[] = { /* "ARJ" */
+ 0x41, 0x52, 0x4a
+};
+
+static BYTE NLSALLOC(2c01) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(2c01) rgbICOUNTRY[] = { /* "962" */
+ 0x39, 0x36, 0x32
+};
+
+static BYTE NLSALLOC(2c01) rgbSCOUNTRY[] = { /* "Jordan" */
+ 0x4a, 0x6f, 0x72, 0x64, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVCTRYNAME[] = { /* "JOR" */
+ 0x4a, 0x4f, 0x52
+};
+
+static BYTE NLSALLOC(2c01) rgbSNATIVECTRYNAME[] = { /* "\x0627\x0644\x0623\x0631\x062f\x0646" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xcf, 0xe4
+};
+
+static BYTE NLSALLOC(2c01) rgbIDEFAULTLANGUAGE[] = { /* "2c01" */
+ 0x32, 0x63, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbIDEFAULTCOUNTRY[] = { /* "962" */
+ 0x39, 0x36, 0x32
+};
+
+static BYTE NLSALLOC(2c01) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(2c01) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(2c01) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2c01) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(2c01) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(2c01) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(2c01) rgbIDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2c01) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(2c01) rgbSCURRENCY[] = { /* "\x062f.\x0627.\x200f" */
+ 0xcf, 0x2e, 0xc7, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(2c01) rgbSINTLSYMBOL[] = { /* "JOD" */
+ 0x4a, 0x4f, 0x44
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(2c01) rgbICURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2c01) rgbIINTLCURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2c01) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2c01) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2c01) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(2c01) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(2c01) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(2c01) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(2c01) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2c01) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2c01) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2c01) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2c01) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2c01) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(2c01) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(2c01) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(2c01) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(2c01) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(2c01) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2c01) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2c01) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(2c01) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME1[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME2[] = { /* "\x0634\x0628\x0627\x0637" */
+ 0xd4, 0xc8, 0xc7, 0xd8
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME3[] = { /* "\x0622\x0630\x0627\x0631" */
+ 0xc2, 0xd0, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME4[] = { /* "\x0646\x064a\x0633\x0627\x0646" */
+ 0xe4, 0xed, 0xd3, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME5[] = { /* "\x0623\x064a\x0627\x0631" */
+ 0xc3, 0xed, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME6[] = { /* "\x062d\x0632\x064a\x0631\x0627\x0646" */
+ 0xcd, 0xd2, 0xed, 0xd1, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME7[] = { /* "\x062a\x0645\x0648\x0632" */
+ 0xca, 0xe3, 0xe6, 0xd2
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME8[] = { /* "\x0622\x0628" */
+ 0xc2, 0xc8
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME9[] = { /* "\x0623\x064a\x0644\x0648\x0644" */
+ 0xc3, 0xed, 0xe1, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME10[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME11[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(2c01) rgbSMONTHNAME12[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME1[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME2[] = { /* "\x0634\x0628\x0627\x0637" */
+ 0xd4, 0xc8, 0xc7, 0xd8
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME3[] = { /* "\x0622\x0630\x0627\x0631" */
+ 0xc2, 0xd0, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME4[] = { /* "\x0646\x064a\x0633\x0627\x0646" */
+ 0xe4, 0xed, 0xd3, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME5[] = { /* "\x0623\x064a\x0627\x0631" */
+ 0xc3, 0xed, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME6[] = { /* "\x062d\x0632\x064a\x0631\x0627\x0646" */
+ 0xcd, 0xd2, 0xed, 0xd1, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME7[] = { /* "\x062a\x0645\x0648\x0632" */
+ 0xca, 0xe3, 0xe6, 0xd2
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME8[] = { /* "\x0622\x0628" */
+ 0xc2, 0xc8
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME9[] = { /* "\x0623\x064a\x0644\x0648\x0644" */
+ 0xc3, 0xed, 0xe1, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME10[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME11[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(2c01) rgbSABBREVMONTHNAME12[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(2c01) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(2c01) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2c01) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(2c01) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2c01) rgbSENGCOUNTRY[] = { /* "Jordan" */
+ 0x4a, 0x6f, 0x72, 0x64, 0x61, 0x6e
+};
+
+static BYTE NLSALLOC(2c01) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(2c01) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(2c01) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(2c01) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(2c01) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(2c01) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(2c01) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(2c01) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(2c01) g_rglcinfo2c01[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 12, rgbSMONTHNAME1 }
+ , { 4, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 6, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 2, rgbSMONTHNAME8 }
+ , { 5, rgbSMONTHNAME9 }
+ , { 11, rgbSMONTHNAME10 }
+ , { 12, rgbSMONTHNAME11 }
+ , { 11, rgbSMONTHNAME12 }
+ , { 12, rgbSABBREVMONTHNAME1 }
+ , { 4, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 6, rgbSABBREVMONTHNAME6 }
+ , { 4, rgbSABBREVMONTHNAME7 }
+ , { 2, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 11, rgbSABBREVMONTHNAME10 }
+ , { 12, rgbSABBREVMONTHNAME11 }
+ , { 11, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(2c01) g_strinfo2c01 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/3001.c b/private/oleauto/src/dispatch/win16/3001.c
new file mode 100644
index 000000000..b60a58495
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/3001.c
@@ -0,0 +1,536 @@
+/****************************************************************************
+* 3001.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Lebanon
+*
+* LCID = 0x3001
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:36:34 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(3001) rgbILANGUAGE[] = { /* "3001" */
+ 0x33, 0x30, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVLANGNAME[] = { /* "ARB" */
+ 0x41, 0x52, 0x42
+};
+
+static BYTE NLSALLOC(3001) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(3001) rgbICOUNTRY[] = { /* "961" */
+ 0x39, 0x36, 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbSCOUNTRY[] = { /* "Lebanon" */
+ 0x4c, 0x65, 0x62, 0x61, 0x6e, 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVCTRYNAME[] = { /* "LBN" */
+ 0x4c, 0x42, 0x4e
+};
+
+static BYTE NLSALLOC(3001) rgbSNATIVECTRYNAME[] = { /* "\x0644\x0628\x0646\x0627\x0646" */
+ 0xe1, 0xc8, 0xe4, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(3001) rgbIDEFAULTLANGUAGE[] = { /* "3001" */
+ 0x33, 0x30, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbIDEFAULTCOUNTRY[] = { /* "961" */
+ 0x39, 0x36, 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(3001) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(3001) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(3001) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(3001) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3001) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(3001) rgbSCURRENCY[] = { /* "\x0644.\x0644.\x200f" */
+ 0xe1, 0x2e, 0xe1, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(3001) rgbSINTLSYMBOL[] = { /* "LBP" */
+ 0x4c, 0x42, 0x50
+};
+
+static BYTE NLSALLOC(3001) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(3001) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3001) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3001) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3001) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3001) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(3001) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(3001) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(3001) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(3001) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3001) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3001) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(3001) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(3001) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3001) rgbSDAYNAME2[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3001) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3001) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(3001) rgbSDAYNAME5[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(3001) rgbSDAYNAME6[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(3001) rgbSDAYNAME7[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME1[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME2[] = { /* "\x0634\x0628\x0627\x0637" */
+ 0xd4, 0xc8, 0xc7, 0xd8
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME3[] = { /* "\x0622\x0630\x0627\x0631" */
+ 0xc2, 0xd0, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME4[] = { /* "\x0646\x064a\x0633\x0627\x0646" */
+ 0xe4, 0xed, 0xd3, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME5[] = { /* "\x0623\x064a\x0627\x0631" */
+ 0xc3, 0xed, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME6[] = { /* "\x062d\x0632\x064a\x0631\x0627\x0646" */
+ 0xcd, 0xd2, 0xed, 0xd1, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME7[] = { /* "\x062a\x0645\x0648\x0632" */
+ 0xca, 0xe3, 0xe6, 0xd2
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME8[] = { /* "\x0622\x0628" */
+ 0xc2, 0xc8
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME9[] = { /* "\x0623\x064a\x0644\x0648\x0644" */
+ 0xc3, 0xed, 0xe1, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME10[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME11[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(3001) rgbSMONTHNAME12[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME1[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME2[] = { /* "\x0634\x0628\x0627\x0637" */
+ 0xd4, 0xc8, 0xc7, 0xd8
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME3[] = { /* "\x0622\x0630\x0627\x0631" */
+ 0xc2, 0xd0, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME4[] = { /* "\x0646\x064a\x0633\x0627\x0646" */
+ 0xe4, 0xed, 0xd3, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME5[] = { /* "\x0623\x064a\x0627\x0631" */
+ 0xc3, 0xed, 0xc7, 0xd1
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME6[] = { /* "\x062d\x0632\x064a\x0631\x0627\x0646" */
+ 0xcd, 0xd2, 0xed, 0xd1, 0xc7, 0xe4
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME7[] = { /* "\x062a\x0645\x0648\x0632" */
+ 0xca, 0xe3, 0xe6, 0xd2
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME8[] = { /* "\x0622\x0628" */
+ 0xc2, 0xc8
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME9[] = { /* "\x0623\x064a\x0644\x0648\x0644" */
+ 0xc3, 0xed, 0xe1, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME10[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME11[] = { /* "\x062a\x0634\x0631\x064a\x0646 \x0627\x0644\x062b\x0627\x0646\x064a" */
+ 0xca, 0xd4, 0xd1, 0xed, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xcb, 0xc7, 0xe4, 0xed
+};
+
+static BYTE NLSALLOC(3001) rgbSABBREVMONTHNAME12[] = { /* "\x0643\x0627\x0646\x0648\x0646 \x0627\x0644\x0623\x0648\x0644" */
+ 0xdf, 0xc7, 0xe4, 0xe6, 0xe4, 0x20, 0xc7, 0xe1
+ , 0xc3, 0xe6, 0xe1
+};
+
+static BYTE NLSALLOC(3001) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(3001) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3001) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3001) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbSENGCOUNTRY[] = { /* "Lebanon" */
+ 0x4c, 0x65, 0x62, 0x61, 0x6e, 0x6f, 0x6e
+};
+
+static BYTE NLSALLOC(3001) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(3001) rgbIFIRSTDAYOFWEEK[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3001) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(3001) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3001) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(3001) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3001) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(3001) g_rglcinfo3001[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 5, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 7, rgbSDAYNAME1 }
+ , { 8, rgbSDAYNAME2 }
+ , { 8, rgbSDAYNAME3 }
+ , { 6, rgbSDAYNAME4 }
+ , { 6, rgbSDAYNAME5 }
+ , { 5, rgbSDAYNAME6 }
+ , { 5, rgbSDAYNAME7 }
+ , { 7, rgbSABBREVDAYNAME1 }
+ , { 8, rgbSABBREVDAYNAME2 }
+ , { 8, rgbSABBREVDAYNAME3 }
+ , { 6, rgbSABBREVDAYNAME4 }
+ , { 6, rgbSABBREVDAYNAME5 }
+ , { 5, rgbSABBREVDAYNAME6 }
+ , { 5, rgbSABBREVDAYNAME7 }
+ , { 12, rgbSMONTHNAME1 }
+ , { 4, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 6, rgbSMONTHNAME6 }
+ , { 4, rgbSMONTHNAME7 }
+ , { 2, rgbSMONTHNAME8 }
+ , { 5, rgbSMONTHNAME9 }
+ , { 11, rgbSMONTHNAME10 }
+ , { 12, rgbSMONTHNAME11 }
+ , { 11, rgbSMONTHNAME12 }
+ , { 12, rgbSABBREVMONTHNAME1 }
+ , { 4, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 6, rgbSABBREVMONTHNAME6 }
+ , { 4, rgbSABBREVMONTHNAME7 }
+ , { 2, rgbSABBREVMONTHNAME8 }
+ , { 5, rgbSABBREVMONTHNAME9 }
+ , { 11, rgbSABBREVMONTHNAME10 }
+ , { 12, rgbSABBREVMONTHNAME11 }
+ , { 11, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(3001) g_strinfo3001 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/3401.c b/private/oleauto/src/dispatch/win16/3401.c
new file mode 100644
index 000000000..8576a8467
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/3401.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 3401.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Kuwait
+*
+* LCID = 0x3401
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:37:28 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(3401) rgbILANGUAGE[] = { /* "3401" */
+ 0x33, 0x34, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVLANGNAME[] = { /* "ARK" */
+ 0x41, 0x52, 0x4b
+};
+
+static BYTE NLSALLOC(3401) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(3401) rgbICOUNTRY[] = { /* "965" */
+ 0x39, 0x36, 0x35
+};
+
+static BYTE NLSALLOC(3401) rgbSCOUNTRY[] = { /* "Kuwait" */
+ 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVCTRYNAME[] = { /* "KWT" */
+ 0x4b, 0x57, 0x54
+};
+
+static BYTE NLSALLOC(3401) rgbSNATIVECTRYNAME[] = { /* "\x0627\x0644\x0643\x0648\x064a\x062a" */
+ 0xc7, 0xe1, 0xdf, 0xe6, 0xed, 0xca
+};
+
+static BYTE NLSALLOC(3401) rgbIDEFAULTLANGUAGE[] = { /* "3401" */
+ 0x33, 0x34, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbIDEFAULTCOUNTRY[] = { /* "965" */
+ 0x39, 0x36, 0x35
+};
+
+static BYTE NLSALLOC(3401) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(3401) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(3401) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3401) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(3401) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(3401) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(3401) rgbIDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3401) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(3401) rgbSCURRENCY[] = { /* "\x062f.\x0643.\x200f" */
+ 0xcf, 0x2e, 0xdf, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(3401) rgbSINTLSYMBOL[] = { /* "KWD" */
+ 0x4b, 0x57, 0x44
+};
+
+static BYTE NLSALLOC(3401) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(3401) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(3401) rgbICURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3401) rgbIINTLCURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3401) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3401) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3401) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(3401) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(3401) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(3401) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(3401) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3401) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3401) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3401) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3401) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3401) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(3401) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(3401) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(3401) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(3401) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3401) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3401) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3401) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(3401) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3401) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(3401) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3401) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3401) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3401) rgbSENGCOUNTRY[] = { /* "Kuwait" */
+ 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74
+};
+
+static BYTE NLSALLOC(3401) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(3401) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(3401) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3401) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(3401) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3401) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(3401) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3401) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(3401) g_rglcinfo3401[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 6, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(3401) g_strinfo3401 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/3801.c b/private/oleauto/src/dispatch/win16/3801.c
new file mode 100644
index 000000000..25f0b6781
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/3801.c
@@ -0,0 +1,530 @@
+/****************************************************************************
+* 3801.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - U.A.E.
+*
+* LCID = 0x3801
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:38:26 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(3801) rgbILANGUAGE[] = { /* "3801" */
+ 0x33, 0x38, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVLANGNAME[] = { /* "ARU" */
+ 0x41, 0x52, 0x55
+};
+
+static BYTE NLSALLOC(3801) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(3801) rgbICOUNTRY[] = { /* "971" */
+ 0x39, 0x37, 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbSCOUNTRY[] = { /* "U.A.E." */
+ 0x55, 0x2e, 0x41, 0x2e, 0x45, 0x2e
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVCTRYNAME[] = { /* "ARE" */
+ 0x41, 0x52, 0x45
+};
+
+static BYTE NLSALLOC(3801) rgbSNATIVECTRYNAME[] = { /* "\x0627\x0644\x0625\x0645\x0627\x0631\x0627\x062a \x0627\x0644\x0639\x0631\x0628\x064a\x0629 \x0627\x0644\x0645\x062a\x062d\x062f\x0629" */
+ 0xc7, 0xe1, 0xc5, 0xe3, 0xc7, 0xd1, 0xc7, 0xca
+ , 0x20, 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+ , 0x20, 0xc7, 0xe1, 0xe3, 0xca, 0xcd, 0xcf, 0xc9
+};
+
+static BYTE NLSALLOC(3801) rgbIDEFAULTLANGUAGE[] = { /* "3801" */
+ 0x33, 0x38, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbIDEFAULTCOUNTRY[] = { /* "971" */
+ 0x39, 0x37, 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(3801) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(3801) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3801) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(3801) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(3801) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(3801) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3801) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(3801) rgbSCURRENCY[] = { /* "\x062f.\x0625.\x200f" */
+ 0xcf, 0x2e, 0xc5, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(3801) rgbSINTLSYMBOL[] = { /* "AED" */
+ 0x41, 0x45, 0x44
+};
+
+static BYTE NLSALLOC(3801) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(3801) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(3801) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3801) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3801) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3801) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3801) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(3801) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(3801) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(3801) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(3801) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3801) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3801) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3801) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3801) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3801) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(3801) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(3801) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(3801) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(3801) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3801) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3801) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3801) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(3801) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3801) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(3801) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3801) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3801) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3801) rgbSENGCOUNTRY[] = { /* "U.A.E." */
+ 0x55, 0x2e, 0x41, 0x2e, 0x45, 0x2e
+};
+
+static BYTE NLSALLOC(3801) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(3801) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(3801) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3801) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(3801) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3801) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(3801) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3801) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(3801) g_rglcinfo3801[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 6, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 24, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 6, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(3801) g_strinfo3801 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/3c01.c b/private/oleauto/src/dispatch/win16/3c01.c
new file mode 100644
index 000000000..3d7c3956c
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/3c01.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 3c01.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Bahrain
+*
+* LCID = 0x3c01
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:39:20 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(3c01) rgbILANGUAGE[] = { /* "3c01" */
+ 0x33, 0x63, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVLANGNAME[] = { /* "ARH" */
+ 0x41, 0x52, 0x48
+};
+
+static BYTE NLSALLOC(3c01) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(3c01) rgbICOUNTRY[] = { /* "973" */
+ 0x39, 0x37, 0x33
+};
+
+static BYTE NLSALLOC(3c01) rgbSCOUNTRY[] = { /* "Bahrain" */
+ 0x42, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVCTRYNAME[] = { /* "BHR" */
+ 0x42, 0x48, 0x52
+};
+
+static BYTE NLSALLOC(3c01) rgbSNATIVECTRYNAME[] = { /* "\x0627\x0644\x0628\x062d\x0631\x064a\x0646" */
+ 0xc7, 0xe1, 0xc8, 0xcd, 0xd1, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3c01) rgbIDEFAULTLANGUAGE[] = { /* "3c01" */
+ 0x33, 0x63, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbIDEFAULTCOUNTRY[] = { /* "973" */
+ 0x39, 0x37, 0x33
+};
+
+static BYTE NLSALLOC(3c01) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(3c01) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(3c01) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3c01) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(3c01) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(3c01) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(3c01) rgbIDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3c01) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(3c01) rgbSCURRENCY[] = { /* "\x062f.\x0628.\x200f" */
+ 0xcf, 0x2e, 0xc8, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(3c01) rgbSINTLSYMBOL[] = { /* "BHD" */
+ 0x42, 0x48, 0x44
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(3c01) rgbICURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3c01) rgbIINTLCURRDIGITS[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3c01) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3c01) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3c01) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(3c01) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(3c01) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(3c01) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(3c01) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3c01) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3c01) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3c01) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3c01) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3c01) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(3c01) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(3c01) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(3c01) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(3c01) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3c01) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3c01) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3c01) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(3c01) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(3c01) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(3c01) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3c01) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(3c01) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3c01) rgbSENGCOUNTRY[] = { /* "Bahrain" */
+ 0x42, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e
+};
+
+static BYTE NLSALLOC(3c01) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(3c01) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(3c01) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(3c01) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(3c01) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(3c01) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(3c01) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(3c01) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(3c01) g_rglcinfo3c01[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 7, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 7, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 7, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(3c01) g_strinfo3c01 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/4001.c b/private/oleauto/src/dispatch/win16/4001.c
new file mode 100644
index 000000000..8dab5724c
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/4001.c
@@ -0,0 +1,528 @@
+/****************************************************************************
+* 4001.c
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Arabic - Qatar
+*
+* LCID = 0x4001
+*
+* CodePage = 1256
+*
+* Generated: Thu Dec 01 18:40:16 1994
+*
+* by a-KChang
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "nlsintrn.h"
+
+extern WORD rgwSort_0401[256]; // from 0401:Arabic - Saudi Arabia
+extern EXPANSION rgexp_0401[3];
+extern WORD rgwCType12_0401[256];
+extern WORD rgwCType3_0401[256];
+extern BYTE rgbUCase_0401[256];
+extern BYTE rgbLCase_0401[256];
+
+static BYTE NLSALLOC(4001) rgbILANGUAGE[] = { /* "4001" */
+ 0x34, 0x30, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbSLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVLANGNAME[] = { /* "ARQ" */
+ 0x41, 0x52, 0x51
+};
+
+static BYTE NLSALLOC(4001) rgbSNATIVELANGNAME[] = { /* "\x0627\x0644\x0639\x0631\x0628\x064a\x0629" */
+ 0xc7, 0xe1, 0xda, 0xd1, 0xc8, 0xed, 0xc9
+};
+
+static BYTE NLSALLOC(4001) rgbICOUNTRY[] = { /* "974" */
+ 0x39, 0x37, 0x34
+};
+
+static BYTE NLSALLOC(4001) rgbSCOUNTRY[] = { /* "Qatar" */
+ 0x51, 0x61, 0x74, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVCTRYNAME[] = { /* "QAT" */
+ 0x51, 0x41, 0x54
+};
+
+static BYTE NLSALLOC(4001) rgbSNATIVECTRYNAME[] = { /* "\x0642\x0637\x0631" */
+ 0xde, 0xd8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbIDEFAULTLANGUAGE[] = { /* "4001" */
+ 0x34, 0x30, 0x30, 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbIDEFAULTCOUNTRY[] = { /* "974" */
+ 0x39, 0x37, 0x34
+};
+
+static BYTE NLSALLOC(4001) rgbIDEFAULTCODEPAGE[] = { /* "708" */
+ 0x37, 0x30, 0x38
+};
+
+static BYTE NLSALLOC(4001) rgbSLIST[] = { /* ";" */
+ 0x3b
+};
+
+static BYTE NLSALLOC(4001) rgbIMEASURE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(4001) rgbSDECIMAL[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(4001) rgbSTHOUSAND[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(4001) rgbSGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(4001) rgbIDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(4001) rgbILZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbSNATIVEDIGITS[] = { /* "0123456789" */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
+ , 0x38, 0x39
+};
+
+static BYTE NLSALLOC(4001) rgbSCURRENCY[] = { /* "\x0631.\x0642.\x200f" */
+ 0xd1, 0x2e, 0xde, 0x2e, 0xfe
+};
+
+static BYTE NLSALLOC(4001) rgbSINTLSYMBOL[] = { /* "QAR" */
+ 0x51, 0x41, 0x52
+};
+
+static BYTE NLSALLOC(4001) rgbSMONDECIMALSEP[] = { /* "." */
+ 0x2e
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHOUSANDSEP[] = { /* "," */
+ 0x2c
+};
+
+static BYTE NLSALLOC(4001) rgbSMONGROUPING[] = { /* "3;0" */
+ 0x33, 0x3b, 0x30
+};
+
+static BYTE NLSALLOC(4001) rgbICURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(4001) rgbIINTLCURRDIGITS[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(4001) rgbICURRENCY[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(4001) rgbINEGCURR[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(4001) rgbSDATE[] = { /* "/" */
+ 0x2f
+};
+
+static BYTE NLSALLOC(4001) rgbSTIME[] = { /* ":" */
+ 0x3a
+};
+
+static BYTE NLSALLOC(4001) rgbSSHORTDATE[] = { /* "dd/MM/yy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+};
+
+static BYTE NLSALLOC(4001) rgbSLONGDATE[] = { /* "dd/MM/yyyy" */
+ 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79
+ , 0x79, 0x79
+};
+
+static BYTE NLSALLOC(4001) rgbIDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(4001) rgbILDATE[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(4001) rgbITIME[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(4001) rgbICENTURY[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(4001) rgbITLZERO[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(4001) rgbIDAYLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbIMONLZERO[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbS1159[] = { /* "\x0635" */
+ 0xd5
+};
+
+static BYTE NLSALLOC(4001) rgbS2359[] = { /* "\x0645" */
+ 0xe3
+};
+
+static BYTE NLSALLOC(4001) rgbSDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(4001) rgbSDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(4001) rgbSDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(4001) rgbSDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(4001) rgbSDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(4001) rgbSDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(4001) rgbSDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVDAYNAME1[] = { /* "\x0627\x0644\x0633\x0628\x062a" */
+ 0xc7, 0xe1, 0xd3, 0xc8, 0xca
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVDAYNAME2[] = { /* "\x0627\x0644\x0623\x062d\x062f" */
+ 0xc7, 0xe1, 0xc3, 0xcd, 0xcf
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVDAYNAME3[] = { /* "\x0627\x0644\x0627\x062b\x0646\x064a\x0646" */
+ 0xc7, 0xe1, 0xc7, 0xcb, 0xe4, 0xed, 0xe4
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVDAYNAME4[] = { /* "\x0627\x0644\x062b\x0644\x0627\x062b\x0627\x0621" */
+ 0xc7, 0xe1, 0xcb, 0xe1, 0xc7, 0xcb, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVDAYNAME5[] = { /* "\x0627\x0644\x0623\x0631\x0628\x0639\x0627\x0621" */
+ 0xc7, 0xe1, 0xc3, 0xd1, 0xc8, 0xda, 0xc7, 0xc1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVDAYNAME6[] = { /* "\x0627\x0644\x062e\x0645\x064a\x0633" */
+ 0xc7, 0xe1, 0xce, 0xe3, 0xed, 0xd3
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVDAYNAME7[] = { /* "\x0627\x0644\x062c\x0645\x0639\x0629" */
+ 0xc7, 0xe1, 0xcc, 0xe3, 0xda, 0xc9
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME1[] = { /* "\x064a\x0646\x0627\x064a\x0631" */
+ 0xed, 0xe4, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME2[] = { /* "\x0641\x0628\x0631\x0627\x064a\x0631" */
+ 0xdd, 0xc8, 0xd1, 0xc7, 0xed, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME3[] = { /* "\x0645\x0627\x0631\x0633" */
+ 0xe3, 0xc7, 0xd1, 0xd3
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME4[] = { /* "\x0627\x0628\x0631\x064a\x0644" */
+ 0xc7, 0xc8, 0xd1, 0xed, 0xe1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME5[] = { /* "\x0645\x0627\x064a\x0648" */
+ 0xe3, 0xc7, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME6[] = { /* "\x064a\x0648\x0646\x064a\x0648" */
+ 0xed, 0xe6, 0xe4, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME7[] = { /* "\x064a\x0648\x0644\x064a\x0648" */
+ 0xed, 0xe6, 0xe1, 0xed, 0xe6
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME8[] = { /* "\x0623\x063a\x0633\x0637\x0633" */
+ 0xc3, 0xdb, 0xd3, 0xd8, 0xd3
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME9[] = { /* "\x0633\x0628\x062a\x0645\x0628\x0631" */
+ 0xd3, 0xc8, 0xca, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME10[] = { /* "\x0627\x0643\x062a\x0648\x0628\x0631" */
+ 0xc7, 0xdf, 0xca, 0xe6, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME11[] = { /* "\x0646\x0648\x0641\x0645\x0628\x0631" */
+ 0xe4, 0xe6, 0xdd, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSABBREVMONTHNAME12[] = { /* "\x062f\x064a\x0633\x0645\x0628\x0631" */
+ 0xcf, 0xed, 0xd3, 0xe3, 0xc8, 0xd1
+};
+
+static BYTE NLSALLOC(4001) rgbSNEGATIVESIGN[] = { /* "-" */
+ 0x2d
+};
+
+static BYTE NLSALLOC(4001) rgbIPOSSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(4001) rgbINEGSIGNPOSN[] = { /* "2" */
+ 0x32
+};
+
+static BYTE NLSALLOC(4001) rgbIPOSSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbIPOSSEPBYSPACE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbINEGSYMPRECEDES[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbINEGSEPBYSPACE[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(4001) rgbSENGCOUNTRY[] = { /* "Qatar" */
+ 0x51, 0x61, 0x74, 0x61, 0x72
+};
+
+static BYTE NLSALLOC(4001) rgbSENGLANGUAGE[] = { /* "Arabic" */
+ 0x41, 0x72, 0x61, 0x62, 0x69, 0x63
+};
+
+static BYTE NLSALLOC(4001) rgbIFIRSTDAYOFWEEK[] = { /* "5" */
+ 0x35
+};
+
+static BYTE NLSALLOC(4001) rgbIFIRSTWEEKOFYEAR[] = { /* "0" */
+ 0x30
+};
+
+static BYTE NLSALLOC(4001) rgbIDEFAULTANSICODEPAGE[] = { /* "1256" */
+ 0x31, 0x32, 0x35, 0x36
+};
+
+static BYTE NLSALLOC(4001) rgbINEGNUMBER[] = { /* "3" */
+ 0x33
+};
+
+static BYTE NLSALLOC(4001) rgbSTIMEFORMAT[] = { /* "H:mm:ss" */
+ 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73
+};
+
+static BYTE NLSALLOC(4001) rgbITIMEMARKPOSN[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbICALENDARTYPE[] = { /* "1" */
+ 0x31
+};
+
+static BYTE NLSALLOC(4001) rgbIOPTIONALCALENDAR[] = { /* "0" */
+ 0x30
+};
+
+
+LCINFO NLSALLOC(4001) g_rglcinfo4001[] = {
+ { 0, NULL }
+ , { 4, rgbILANGUAGE }
+ , { 6, rgbSLANGUAGE }
+ , { 3, rgbSABBREVLANGNAME }
+ , { 7, rgbSNATIVELANGNAME }
+ , { 3, rgbICOUNTRY }
+ , { 5, rgbSCOUNTRY }
+ , { 3, rgbSABBREVCTRYNAME }
+ , { 3, rgbSNATIVECTRYNAME }
+ , { 4, rgbIDEFAULTLANGUAGE }
+ , { 3, rgbIDEFAULTCOUNTRY }
+ , { 3, rgbIDEFAULTCODEPAGE }
+ , { 1, rgbSLIST }
+ , { 1, rgbIMEASURE }
+ , { 1, rgbSDECIMAL }
+ , { 1, rgbSTHOUSAND }
+ , { 3, rgbSGROUPING }
+ , { 1, rgbIDIGITS }
+ , { 1, rgbILZERO }
+ , { 10, rgbSNATIVEDIGITS }
+ , { 5, rgbSCURRENCY }
+ , { 3, rgbSINTLSYMBOL }
+ , { 1, rgbSMONDECIMALSEP }
+ , { 1, rgbSMONTHOUSANDSEP }
+ , { 3, rgbSMONGROUPING }
+ , { 1, rgbICURRDIGITS }
+ , { 1, rgbIINTLCURRDIGITS }
+ , { 1, rgbICURRENCY }
+ , { 1, rgbINEGCURR }
+ , { 1, rgbSDATE }
+ , { 1, rgbSTIME }
+ , { 8, rgbSSHORTDATE }
+ , { 10, rgbSLONGDATE }
+ , { 1, rgbIDATE }
+ , { 1, rgbILDATE }
+ , { 1, rgbITIME }
+ , { 1, rgbICENTURY }
+ , { 1, rgbITLZERO }
+ , { 1, rgbIDAYLZERO }
+ , { 1, rgbIMONLZERO }
+ , { 1, rgbS1159 }
+ , { 1, rgbS2359 }
+ , { 5, rgbSDAYNAME1 }
+ , { 5, rgbSDAYNAME2 }
+ , { 7, rgbSDAYNAME3 }
+ , { 8, rgbSDAYNAME4 }
+ , { 8, rgbSDAYNAME5 }
+ , { 6, rgbSDAYNAME6 }
+ , { 6, rgbSDAYNAME7 }
+ , { 5, rgbSABBREVDAYNAME1 }
+ , { 5, rgbSABBREVDAYNAME2 }
+ , { 7, rgbSABBREVDAYNAME3 }
+ , { 8, rgbSABBREVDAYNAME4 }
+ , { 8, rgbSABBREVDAYNAME5 }
+ , { 6, rgbSABBREVDAYNAME6 }
+ , { 6, rgbSABBREVDAYNAME7 }
+ , { 5, rgbSMONTHNAME1 }
+ , { 6, rgbSMONTHNAME2 }
+ , { 4, rgbSMONTHNAME3 }
+ , { 5, rgbSMONTHNAME4 }
+ , { 4, rgbSMONTHNAME5 }
+ , { 5, rgbSMONTHNAME6 }
+ , { 5, rgbSMONTHNAME7 }
+ , { 5, rgbSMONTHNAME8 }
+ , { 6, rgbSMONTHNAME9 }
+ , { 6, rgbSMONTHNAME10 }
+ , { 6, rgbSMONTHNAME11 }
+ , { 6, rgbSMONTHNAME12 }
+ , { 5, rgbSABBREVMONTHNAME1 }
+ , { 6, rgbSABBREVMONTHNAME2 }
+ , { 4, rgbSABBREVMONTHNAME3 }
+ , { 5, rgbSABBREVMONTHNAME4 }
+ , { 4, rgbSABBREVMONTHNAME5 }
+ , { 5, rgbSABBREVMONTHNAME6 }
+ , { 5, rgbSABBREVMONTHNAME7 }
+ , { 5, rgbSABBREVMONTHNAME8 }
+ , { 6, rgbSABBREVMONTHNAME9 }
+ , { 6, rgbSABBREVMONTHNAME10 }
+ , { 6, rgbSABBREVMONTHNAME11 }
+ , { 6, rgbSABBREVMONTHNAME12 }
+ , { 0, NULL }
+ , { 1, rgbSNEGATIVESIGN }
+ , { 1, rgbIPOSSIGNPOSN }
+ , { 1, rgbINEGSIGNPOSN }
+ , { 1, rgbIPOSSYMPRECEDES }
+ , { 1, rgbIPOSSEPBYSPACE }
+ , { 1, rgbINEGSYMPRECEDES }
+ , { 1, rgbINEGSEPBYSPACE }
+ , { 5, rgbSENGCOUNTRY }
+ , { 6, rgbSENGLANGUAGE }
+ , { 1, rgbIFIRSTDAYOFWEEK }
+ , { 1, rgbIFIRSTWEEKOFYEAR }
+ , { 4, rgbIDEFAULTANSICODEPAGE }
+ , { 1, rgbINEGNUMBER }
+ , { 7, rgbSTIMEFORMAT }
+ , { 1, rgbITIMEMARKPOSN }
+ , { 1, rgbICALENDARTYPE }
+ , { 1, rgbIOPTIONALCALENDAR }
+ , { 0, NULL }
+ , { 0, NULL }
+};
+
+STRINFO NLSALLOC(4001) g_strinfo4001 = {
+ rgbUCase_0401
+ , rgbLCase_0401
+ , rgwCType12_0401
+ , rgwCType3_0401
+ , rgwSort_0401
+ , rgexp_0401
+ , NULL
+ , 0
+};
diff --git a/private/oleauto/src/dispatch/win16/invoke.asm b/private/oleauto/src/dispatch/win16/invoke.asm
new file mode 100644
index 000000000..e2fc79106
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/invoke.asm
@@ -0,0 +1,783 @@
+
+; TITLE invoke.asm
+;***
+;invoke.asm - automatic table driven method dispatch
+;
+; Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+; Information Contained Herein Is Proprietary and Confidential.
+;
+;Purpose:
+; This file contains the low level support for the default
+; implementaion of ITypeInfo::Invoke().
+;
+;Revision History:
+;
+; [00] 19-Oct-92 bradlo: Created from invoke.c
+;
+;Implementation Notes:
+;
+;******************************************************************************
+
+
+ .286
+ .MODEL large, C
+
+ OPTION CASEMAP:NONE
+
+
+extern g_S_OK:DWORD
+extern g_E_INVALIDARG:DWORD
+
+
+;; Note: the following must match the definitions from dispatch.h
+;;
+VT_EMPTY equ 0
+VT_NULL equ 1
+VT_I2 equ 2
+VT_I4 equ 3
+VT_R4 equ 4
+VT_R8 equ 5
+VT_CY equ 6
+VT_DATE equ 7
+VT_BSTR equ 8
+VT_DISPATCH equ 9
+VT_ERROR equ 10
+VT_BOOL equ 11
+VT_VARIANT equ 12
+VT_UNKNOWN equ 13
+
+VT_MAX equ 14
+
+IF VBA2
+;; 14 is unused
+;; 15 is unused
+;VT_I1 equ 16
+VT_UI1 equ 17
+ENDIF ;VBA2
+
+
+;; Note: the following must match the definition of VARIANT in dispatch.h
+;;
+VARIANTARG STRUCT
+ vt DW ?
+ wReserved1 DW ?
+ wReserved2 DW ?
+ wReserved3 DW ?
+ dw0 DW ?
+ dw1 DW ?
+ dw2 DW ?
+ dw3 DW ?
+VARIANTARG ENDS
+
+;; offset of the data from the beginning of the struct
+VARIANT_DATA_OFFSET equ 8
+
+
+ .CONST
+
+;; ammout of data to be pushed for the corresponding VARTYPE
+;;
+rgcbVtSize DB 0 ; VT_EMPTY
+ DB 4 ; VT_NULL
+ DB 2 ; VT_I2
+ DB 4 ; VT_I4
+ DB 4 ; VT_R4
+ DB 8 ; VT_R8
+ DB 8 ; VT_CY
+ DB 8 ; VT_DATE
+ DB 4 ; VT_BSTR
+ DB 4 ; VT_DISPATCH
+ DB 4 ; VT_ERROR
+ DB 2 ; VT_BOOL
+ DB 16 ; VT_VARIANT
+ DB 4 ; VT_UNKNOWN
+IF VBA2
+ DB 0 ; 14 is unused
+ DB 0 ; 15 is unused
+ DB 2 ; VT_I1
+ DB 2 ; VT_UI1
+ENDIF ;VBA2
+
+rgfStructReturn DB 0 ; VT_EMPTY
+ DB 0 ; VT_NULL
+ DB 0 ; VT_I2
+ DB 0 ; VT_I4
+ DB 0 ; VT_R4
+ DB 0 ; VT_R8
+ DB 1 ; VT_CY
+ DB 0 ; VT_DATE
+ DB 0 ; VT_BSTR
+ DB 0 ; VT_DISPATCH
+ DB 0 ; VT_ERROR
+ DB 0 ; VT_BOOL
+ DB 1 ; VT_VARIANT
+ DB 0 ; VT_UNKNOWN
+IF VBA2
+ DB 0 ; 14 is unused
+ DB 0 ; 15 is unused
+ DB 0 ; VT_I1
+ DB 0 ; VT_UI1
+ENDIF ;VBA2
+
+rgfFloatReturn DB 0 ; VT_EMPTY
+ DB 0 ; VT_NULL
+ DB 0 ; VT_I2
+ DB 0 ; VT_I4
+ DB 1 ; VT_R4
+ DB 1 ; VT_R8
+ DB 0 ; VT_CY
+ DB 1 ; VT_DATE
+ DB 0 ; VT_BSTR
+ DB 0 ; VT_DISPATCH
+ DB 0 ; VT_ERROR
+ DB 0 ; VT_BOOL
+ DB 0 ; VT_VARIANT
+ DB 0 ; VT_UNKNOWN
+IF VBA2
+ DB 0 ; 14 is unused
+ DB 0 ; 15 is unused
+ DB 0 ; VT_I1
+ DB 0 ; VT_UI1
+ENDIF ;VBA2
+
+ .CODE STDIMPL
+
+;***
+;InvokePascal
+;
+;extern "C" SCODE
+;InvokePascal(
+; void FAR* pvMethod,
+; SHORT oVft,
+; VARTYPE vtReturn,
+; UINT cActuals,
+; VARTYPE FAR* rgvt,
+; VARIANTARG FAR* rgpvarg,
+; VARIANTARG FAR* pvargResult)
+;
+;Purpose:
+; Invoke a virtual Pascal method using the given this pointer,
+; method index and array of parameters.
+;
+; The Pascal member function calling convention (MSC v7.0)
+; --------------------------------------------------------
+; - arguments pushed left to right
+; - callee clean (ie, the callee adjusts the sp on return)
+; - model specific this* always pushed last
+;
+; return values are handled as follows,
+;
+; vartype fundamental return location
+; ------------------------------------------------
+; VT_UI1 unsigned char al
+; VT_I2 short ax
+; VT_I4 long ax:dx
+; VT_R4 float float-return(1)
+; VT_R8 double float-return
+; VT_DATE double float-return
+; VT_CY struct struct-return(2)
+; VT_BSTR char FAR* ax:dx
+; VT_UNKNOWN void FAR* ax:dx
+; VT_DISPATCH void FAR* ax:dx
+; VT_ERROR long ax:dx
+; VT_BOOL short ax
+; VT_VARIANT VARIANTARG struct-return
+;
+; 1. floating point returns
+;
+; Floating point values are returned in a caller allocated buffer.
+; a *near* pointer to this buffer is passed as a hidden parameter,
+; and is pushed as the last (ie, rightmost) parameter. This means
+; that it is always located immediately before the 'this' pointer.
+;
+; A model specific pointer to this caller allocated buffer is
+; passed back in ax[:dx]. All this means is that the callee returns
+; the address we passed in as the hidden param, and sticks SS into
+; DX if the callee is large model (see following note).
+;
+; Note: the compiler *assumes* that this caller allocated buffer
+; is SS relative (hence the reason it only passes a near pointer),
+; so the following code is careful to ensure this.
+;
+; 2. structure returns
+;
+; Structures are returned in a caller allocated buffer, and are
+; handled exactly the same as float returns except that the pointer
+; to the buffer is always pushed as the first (leftmost) param. This
+; is opposite of the location it is passed for float returns (I
+; have no idea why there different).
+;
+;
+; Limitations & assumptions
+; -------------------------
+; Only supports far calls.
+;
+; UNDONE: no support for VT_ARRAY
+;
+;Entry:
+; pvMethod = ptr to the method to invoke
+; cArgs = count of the number of actuals
+; rgvt = array of VARTYPES describing the methods formals
+; rgpvarg = array of VARIANTARG*s, which map the actuals by position
+; vtReturn = the VARTYPE of the return value
+;
+;Exit:
+; pvargResult = VARIANTARG containing the method return value
+;
+;Uses:
+; bx, si, di
+;
+;Preserves:
+;
+;
+;***********************************************************************
+InvokePascal PROC FAR C PUBLIC USES si di,
+ _this : FAR PTR,
+ oVft : WORD,
+ vtReturn : WORD,
+ cActuals : WORD,
+ rgvt : FAR PTR,
+ rgpvarg : FAR PTR,
+ pvargResult : FAR PTR
+
+LOCAL pEnd : WORD,
+ savedSP : WORD,
+ vargHiddenParam : VARIANTARG
+
+
+ mov savedSP, sp
+
+ ;; if its a structure return, we must push the 'hidden'
+ ;; parameter first.
+ ;;
+ mov bx, ss:vtReturn
+ test bh, 040h ; VT_BYREF
+ jnz LRetInvalidArg
+ test bh, 020h ; VT_ARRAY
+ jnz LNoStructReturn
+ mov al, BYTE PTR rgfStructReturn[bx]
+ cmp al, 0
+ jz LNoStructReturn
+
+ ;; push the address of the struct return hidden param
+ ;;
+ ;; Note: the hidparam is passed as a FAR* because we
+ ;; explicitly declare all of our structs FAR.
+ ;;
+ lea ax, vargHiddenParam;
+ push ss
+ push ax
+
+LNoStructReturn:
+
+ mov cx, ss:cActuals
+ cmp cx, 0
+ jz LDoCall
+
+ ;; di = rgpvarg
+ ;;
+ mov di, WORD PTR ss:rgpvarg
+
+ ;; cx = &rgpvarg[cActuals-1] ; last arg
+ ;;
+ dec cx
+ shl cx, 2 ; log2(sizeof(FAR*))
+ add cx, di
+ mov ss:pEnd, cx
+
+
+LArgLoop:
+
+ ;; dx:cx = &rgvt[i]
+ ;;
+ mov cx, WORD PTR ss:rgvt
+ mov dx, WORD PTR ss:rgvt+2
+
+LArgsTop:
+
+ ;; bx = rgvt[i]
+ ;;
+ mov es, dx
+ mov bx, cx
+ mov bx, es:[bx]
+
+ ;; load the VARIANTARG* in preparation for pushing
+ ;;
+ mov ax, WORD PTR ss:rgpvarg+2
+ mov es, ax
+ les si, es:[di]
+
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LPush4 ; all ByRefs are sizeof(FAR*)
+
+ ;; lookup size of the param in rgcbVtSize table
+ ;;
+ and bh, 01fh ; ~(mode bits)
+ ;REVIEW: should verify index in range
+ mov al, BYTE PTR rgcbVtSize[bx]
+
+ cmp al, 0
+ jl LRetInvalidArg
+ jz LNextArg
+ sub al, 2
+ jz LPush2
+ sub al, 2
+ jz LPush4
+ sub al, 4
+ jz LPush8
+ sub al, 8
+ jz LPush16
+ jmp LRetInvalidArg
+
+ Align 2
+LPush16: ; push the entire variant
+ push es:[si+14]
+ push es:[si+12]
+ push es:[si+10]
+ push es:[si+8]
+ push es:[si+6]
+ push es:[si+4]
+ push es:[si+2]
+ push es:[si]
+ jmp LNextArg
+
+ Align 2
+LPush8: ; 8 bytes of data
+ push (VARIANTARG PTR es:[si]).dw3
+ push (VARIANTARG PTR es:[si]).dw2
+LPush4: ; 4 bytes of data
+ push (VARIANTARG PTR es:[si]).dw1
+LPush2: ; 2 bytes of data
+ push (VARIANTARG PTR es:[si]).dw0
+
+LNextArg:
+ add cx, sizeof WORD ; cx += sizeof(VARTYPE)
+ cmp di, WORD PTR ss:pEnd
+ jae LDoCall
+ add di, 4 ; di += sizeof(VARIANTARG FAR*)
+ jmp LArgsTop
+
+LDoCall:
+ ;; if its a floating point return, we must push the
+ ;; 'hidden' parameter last.
+ ;;
+ mov bx, ss:vtReturn
+ test bh, 020h ; VT_ARRAY
+ jnz LNoFloatReturn
+ mov al, rgfFloatReturn[bx]
+ cmp al, 0
+ jz LNoFloatReturn
+
+ ;; Routines that return via a hidparam, take a near ptr to the
+ ;; area in which to store the result. We dont know if the given
+ ;; pvargResult is near, so we can't push it directly. Instead we
+ ;; push something local (that we know is near because its on the
+ ;; stack), and we will copy it to pvargResult after the call.
+ ;;
+ lea ax, vargHiddenParam;
+ push ax
+
+LNoFloatReturn:
+
+ ;; push the 'this' pointer.
+ ;;
+ les bx, _this
+ push es
+ push bx
+
+ ;; load the vtable offset
+ ;;
+ mov si, ss:oVft
+
+ les bx, es:[bx] ; @ vtable*
+ call DWORD PTR es:[bx][si]
+
+ ;; CONSIDER: verify that the callee adjusted the stack the way
+ ;; we expected. something like,
+ ;;
+ ;; if(sp != savedSP){
+ ;; sp = savedSP;
+ ;; return DISP_E_BADCALLEE
+ ;; }
+ ;;
+
+ ;; Grab the return value.
+ ;; We are going to grab the value based on the VARTYPE in
+ ;; the given vtReturn. This VARTYPE is used as a description
+ ;; of the return value, not a desired target type. ie, no
+ ;; coercions are performed. See the function header for a
+ ;; description of the Pascal member function return value
+ ;; convention.
+ ;;
+
+ mov si, ax
+
+ les di, ss:pvargResult
+
+ mov bx, ss:vtReturn
+ mov (VARIANTARG PTR es:[di]).vt, bx
+
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LRetPtr
+
+ ; Assert((bh & VT_ARRAY) == 0);
+
+IF VBA2
+ cmp bx, VT_UI1
+ je ValidVartype
+ENDIF ;;VBA2
+ cmp bx, VT_MAX
+ jae LRetInvalidArg
+
+ValidVartype:
+ shl bx, 1
+ jmp WORD PTR cs:LRetValJmpTab[bx]
+
+ Align 2
+LRetValJmpTab:
+ DW LDone ; VT_EMPTY
+ DW LRetI4 ; VT_NULL
+ DW LRetI2 ; VT_I2
+ DW LRetI4 ; VT_I4
+ DW LCpy4 ; VT_R4
+ DW LCpy8 ; VT_R8
+ DW LCpy8 ; VT_CY
+ DW LCpy8 ; VT_DATE
+ DW LRetPtr ; VT_BSTR
+ DW LRetPtr ; VT_DISPATCH
+ DW LRetI4 ; VT_ERROR
+ DW LRetI2 ; VT_BOOL
+ DW LCpy16 ; VT_VARIANT
+ DW LRetPtr ; VT_UNKNOWN
+IF VBA2
+ DW LRetInvalidArg ; unused
+ DW LRetInvalidArg ; unused
+ DW LRetInvalidArg ; VT_I1
+ DW LRetUI1 ; VT_UI1
+ENDIF ;VBA2
+
+
+ Align 2
+LCpy8:
+ add di, VARIANT_DATA_OFFSET
+ mov cx, 4
+ jmp LCpy
+
+ Align 2
+LCpy4:
+ add di, VARIANT_DATA_OFFSET
+ mov cx, 2
+ jmp LCpy
+
+ Align 2
+LCpy16:
+ mov cx, 8
+ ; FALLTHROUGH
+
+LCpy:
+ rep movsw es:[di], ss:[si]
+ jmp LDone
+
+ Align 2
+LRetI4:
+LRetPtr:
+ mov (VARIANTARG PTR es:[di]).dw1, dx
+LRetI2:
+LRetUI1:
+ mov (VARIANTARG PTR es:[di]).dw0, ax
+
+LDone:
+ mov ax, WORD PTR g_S_OK
+ mov dx, WORD PTR g_S_OK+2
+ ret
+
+LRetInvalidArg:
+ mov sp, savedSP
+ mov ax, WORD PTR g_E_INVALIDARG
+ mov dx, WORD PTR g_E_INVALIDARG+2
+ ret
+InvokePascal ENDP
+
+
+;***
+;InvokeCdecl
+;
+;extern "C" SCODE CDECL
+;InvokeCdecl
+; void FAR* _this,
+; SHORT oVft,
+; VARTYPE vtReturn,
+; UINT cActuals,
+; VARTYPE FAR* rgvt,
+; VARIANTARG FAR* rgpvarg,
+; VARIANTARG FAR* pvargResult)
+;
+;Purpose:
+; see InvokePascal
+;
+;Entry:
+; see InvokePascal
+;
+;Exit:
+; see InvokePascal
+;
+;Uses:
+; bx, si, di
+;
+;Preserves:
+; UNDONE
+;
+;***********************************************************************
+InvokeCdecl PROC FAR C PUBLIC USES si di,
+ _this : FAR PTR,
+ oVft : WORD,
+ vtReturn : WORD,
+ cActuals : WORD,
+ rgvt : FAR PTR,
+ rgpvarg : FAR PTR,
+ pvargResult : FAR PTR
+
+LOCAL savedSP : WORD,
+ vargHiddenParam : VARIANTARG
+
+
+ mov savedSP, sp
+
+ ; InvokeCdecl doesn't support methods that return VT_R4 or VT_R8
+ ;
+ ; Cdecl methods return floating point values in a static
+ ; data area called __fac, and return the address of that data
+ ; area in ax. Unfortunately the data area is in the callers
+ ; default data segment, and the calling convention only returns
+ ; a near* (offset) - so we dont have any reasonable way of
+ ; locating the value.
+ ;
+ mov bx, ss:vtReturn
+ test bh, 040h ; VT_BYREF
+ jnz LRetInvalidArg
+ test bh, 020h ; VT_ARRAY
+ jnz LRetOk
+ mov al, rgfFloatReturn[bx]
+ cmp al, 0
+ jnz LRetInvalidArg
+
+LRetOk:
+
+ mov ax, ss:cActuals
+ cmp ax, 0
+ jz LDoCall
+
+ ;; di = &rgpvarg[cActuals-1]
+ ;;
+ dec ax
+ mov di, ax
+ shl di, 2 ; (cArgs-1)*sizeof(FAR*)
+ add di, WORD PTR ss:rgpvarg
+
+
+ ;; dx:cx = &rgvt[cActuals-1]
+ ;;
+ mov cx, WORD PTR ss:rgvt
+ add cx, ax
+ add cx, ax ; rgvt+((cArgs-1)*sizeof(WORD))
+ mov dx, WORD PTR ss:rgvt+2
+
+LArgsTop:
+
+ ;; bx = rgvt[i]
+ ;;
+ mov es, dx
+ mov bx, cx
+ mov bx, es:[bx]
+
+ ;; load the VARIANTARG* in preparation for pushing
+ ;;
+ mov ax, WORD PTR ss:rgpvarg+2
+ mov es, ax
+ les si, es:[di]
+
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LPush4 ; all ByRefs are sizeof(FAR*)
+
+ ;; lookup size of the param in rgcbVtSize table
+ ;;
+ and bh, 01fh ; ~(mode bits)
+ mov al, BYTE PTR rgcbVtSize[bx]
+
+ cmp al, 0
+ jl LRetInvalidArg
+ jz LNextArg
+ sub al, 2
+ jz LPush2
+ sub al, 2
+ jz LPush4
+ sub al, 4
+ jz LPush8
+ sub al, 8
+ jz LPush16
+ jmp LRetInvalidArg
+
+ Align 2
+LPush16: ; push the entire variant
+ push es:[si+14]
+ push es:[si+12]
+ push es:[si+10]
+ push es:[si+8]
+ push es:[si+6]
+ push es:[si+4]
+ push es:[si+2]
+ push es:[si]
+ jmp LNextArg
+
+ Align 2
+LPush8: ; 8 bytes of data
+ push (VARIANTARG PTR es:[si]).dw3
+ push (VARIANTARG PTR es:[si]).dw2
+LPush4: ; 4 bytes of data
+ push (VARIANTARG PTR es:[si]).dw1
+LPush2: ; 2 bytes of data
+ push (VARIANTARG PTR es:[si]).dw0
+
+LNextArg:
+ sub cx, sizeof WORD ; sizeof(VARTYPE)
+
+ cmp di, WORD PTR ss:rgpvarg
+ jbe LDoCall
+ sub di, 4 ; sizeof(VARIANTARG FAR*)
+ jmp LArgsTop
+
+LDoCall:
+ ;; if its a structure return, we must push a 'hidden' argument
+ ;;
+ mov bx, ss:vtReturn
+ test bh, 020h ; VT_ARRAY
+ jnz LPushThis
+ mov al, BYTE PTR rgfStructReturn[bx]
+ cmp al, 0
+ jz LPushThis
+
+ ;; push the address of the struct return hidden param
+ ;;
+ ;; Note: the hidparam is passed as a FAR* because we
+ ;; explicitly declare all of our structs FAR.
+ ;;
+ lea ax, vargHiddenParam;
+ push ss
+ push ax
+
+LPushThis:
+
+ ;; push the this pointer.
+ ;;
+ les bx, _this
+ push es
+ push bx
+
+ ;; load the vtable offset
+ ;;
+ mov si, ss:oVft
+
+ les bx, es:[bx] ; @ vtable*
+ call DWORD PTR es:[bx][si]
+ mov sp, savedSP
+
+ ;; CONSIDER: verify that the callee adjusted the stack the way
+ ;; we expected. something like,
+ ;;
+ ;; if(sp != savedSP){
+ ;; sp = savedSP;
+ ;; return DISP_E_SomeError
+ ;; }
+ ;;
+
+ ;; Grab the return value.
+ ;; We are going to grab the value based on the VARTYPE in
+ ;; the given vtReturn. This VARTYPE is used as a description
+ ;; of the return value, not a desired target type. ie, no
+ ;; coercions are performed. See the function header for a
+ ;; description of the Pascal member function return value
+ ;; convention.
+ ;;
+
+ mov si, ax
+
+ les di, ss:pvargResult
+
+ mov bx, ss:vtReturn
+ mov (VARIANTARG PTR es:[di]).vt, bx
+
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LRetPtr
+
+ ; Assert((bh & VT_ARRAY) == 0);
+
+IF VBA2
+ cmp bx, VT_UI1
+ je ValidVartype
+ENDIF ;;VBA2
+ cmp bx, VT_MAX
+ jae LRetInvalidArg
+
+ValidVartype:
+ shl bx, 1
+ jmp WORD PTR cs:LRetValJmpTab[bx]
+
+ Align 2
+LRetValJmpTab:
+ DW LDone ; VT_EMPTY
+ DW LRetI4 ; VT_NULL
+ DW LRetI2 ; VT_I2
+ DW LRetI4 ; VT_I4
+ DW LRetInvalidArg ; VT_R4
+ DW LRetInvalidArg ; VT_R8
+ DW LCpy8 ; VT_CY
+ DW LRetInvalidArg ; VT_DATE
+ DW LRetPtr ; VT_BSTR
+ DW LRetPtr ; VT_DISPATCH
+ DW LRetI4 ; VT_ERROR
+ DW LRetI2 ; VT_BOOL
+ DW LCpy16 ; VT_VARIANT
+ DW LRetPtr ; VT_UNKNOWN
+IF VBA2
+ DW LRetInvalidArg ; unused
+ DW LRetInvalidArg ; unused
+ DW LRetInvalidArg ; VT_I1
+ DW LRetUI1 ; VT_UI1
+ENDIF ;VBA2
+
+
+ Align 2
+LCpy8:
+ add di, VARIANT_DATA_OFFSET
+ mov cx, 4
+ jmp LCpy
+
+ Align 2
+LCpy16:
+ mov cx, 8
+ ; FALLTHROUGH
+
+LCpy:
+ rep movsw es:[di], ss:[si]
+ jmp LDone
+
+ Align 2
+LRetI4:
+LRetPtr:
+ mov (VARIANTARG PTR es:[di]).dw1, dx
+LRetI2:
+LRetUI1:
+ mov (VARIANTARG PTR es:[di]).dw0, ax
+
+LDone:
+ mov ax, WORD PTR g_S_OK
+ mov dx, WORD PTR g_S_OK+2
+ ret
+
+LRetInvalidArg:
+ mov sp, savedSP
+ mov ax, WORD PTR g_E_INVALIDARG
+ mov dx, WORD PTR g_E_INVALIDARG+2
+ ret
+InvokeCdecl ENDP
+END
diff --git a/private/oleauto/src/dispatch/win16/loc11-3.txt b/private/oleauto/src/dispatch/win16/loc11-3.txt
new file mode 100644
index 000000000..f26536ddb
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/loc11-3.txt
@@ -0,0 +1,4900 @@
+LOCALE 41
+
+BEGINLOCALE 0404 ; Chinese - Taiwan
+
+ ILANGUAGE 0404
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHT
+ SNATIVELANGNAME \x4e2d\x6587
+
+ ICOUNTRY 886
+ SENGCOUNTRY Taiwan
+ SABBREVCTRYNAME TWN
+ SNATIVECTRYNAME \x4e2d\x83ef\x6c11\x570b
+
+ IDEFAULTLANGUAGE 0404
+ IDEFAULTCOUNTRY 886
+ IDEFAULTANSICODEPAGE 950
+ IDEFAULTOEMCODEPAGE 950
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY NT$
+ SINTLSYMBOL TWD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 \x4e0a\x5348
+ S2359 \x4e0b\x5348
+
+ SSHORTDATE 4 yy/M/d
+ yy/MM/dd
+ yyyy/M/d
+ yyyy/MM/dd
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 3 dddd yyyy MMMM dd
+ dddd' 'yyyy' 'MM' 'dd
+ yyyy' 'MM' 'dd
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 4\xffffEra: Year of the Republic of China
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00
+ SDAYNAME2 \x661f\x671f\x4e8c
+ SDAYNAME3 \x661f\x671f\x4e09
+ SDAYNAME4 \x661f\x671f\x56db
+ SDAYNAME5 \x661f\x671f\x4e94
+ SDAYNAME6 \x661f\x671f\x516d
+ SDAYNAME7 \x661f\x671f\x65e5
+
+ SABBREVDAYNAME1 \x661f\x671f\x4e00
+ SABBREVDAYNAME2 \x661f\x671f\x4e8c
+ SABBREVDAYNAME3 \x661f\x671f\x4e09
+ SABBREVDAYNAME4 \x661f\x671f\x56db
+ SABBREVDAYNAME5 \x661f\x671f\x4e94
+ SABBREVDAYNAME6 \x661f\x671f\x516d
+ SABBREVDAYNAME7 \x661f\x671f\x65e5
+
+ SMONTHNAME1 \x4e00\x6708
+ SMONTHNAME2 \x4e8c\x6708
+ SMONTHNAME3 \x4e09\x6708
+ SMONTHNAME4 \x56db\x6708
+ SMONTHNAME5 \x4e94\x6708
+ SMONTHNAME6 \x516d\x6708
+ SMONTHNAME7 \x4e03\x6708
+ SMONTHNAME8 \x516b\x6708
+ SMONTHNAME9 \x4e5d\x6708
+ SMONTHNAME10 \x5341\x6708
+ SMONTHNAME11 \x5341\x4e00\x6708
+ SMONTHNAME12 \x5341\x4e8c\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x4e00\x6708
+ SABBREVMONTHNAME2 \x4e8c\x6708
+ SABBREVMONTHNAME3 \x4e09\x6708
+ SABBREVMONTHNAME4 \x56db\x6708
+ SABBREVMONTHNAME5 \x4e94\x6708
+ SABBREVMONTHNAME6 \x516d\x6708
+ SABBREVMONTHNAME7 \x4e03\x6708
+ SABBREVMONTHNAME8 \x516b\x6708
+ SABBREVMONTHNAME9 \x4e5d\x6708
+ SABBREVMONTHNAME10 \x5341\x6708
+ SABBREVMONTHNAME11 \x5341\x4e00\x6708
+ SABBREVMONTHNAME12 \x5341\x4e8c\x6708
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0804 ; Chinese - PRC
+
+ ILANGUAGE 0804
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHS
+ SNATIVELANGNAME \x4e2d\x6587
+
+ ICOUNTRY 86
+ SENGCOUNTRY Peoples' Republic of China
+ SABBREVCTRYNAME CHN
+ SNATIVECTRYNAME \x4e2d\x534e\x4eba\x6c11\x5171\x548c\x56fd
+
+ IDEFAULTLANGUAGE 0804
+ IDEFAULTCOUNTRY 86
+ IDEFAULTANSICODEPAGE 936
+ IDEFAULTOEMCODEPAGE 936
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x00a5
+ SINTLSYMBOL CNY
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 \x4e0a\x5348
+ S2359 \x4e0b\x5348
+
+ SSHORTDATE 4 yy/M/d
+ yy/MM/dd
+ yyyy/M/d
+ yyyy/MM/dd
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 3 dddd, MMMM d, yyyy
+ yyyy' 'MM' 'dd
+ dddd' 'yyyy' 'MM' 'dd
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00
+ SDAYNAME2 \x661f\x671f\x4e8c
+ SDAYNAME3 \x661f\x671f\x4e09
+ SDAYNAME4 \x661f\x671f\x56db
+ SDAYNAME5 \x661f\x671f\x4e94
+ SDAYNAME6 \x661f\x671f\x516d
+ SDAYNAME7 \x661f\x671f\x65e5
+
+ SABBREVDAYNAME1 \x661f\x671f\x4e00
+ SABBREVDAYNAME2 \x661f\x671f\x4e8c
+ SABBREVDAYNAME3 \x661f\x671f\x4e09
+ SABBREVDAYNAME4 \x661f\x671f\x56db
+ SABBREVDAYNAME5 \x661f\x671f\x4e94
+ SABBREVDAYNAME6 \x661f\x671f\x516d
+ SABBREVDAYNAME7 \x661f\x671f\x65e5
+
+ SMONTHNAME1 \x4e00\x6708
+ SMONTHNAME2 \x4e8c\x6708
+ SMONTHNAME3 \x4e09\x6708
+ SMONTHNAME4 \x56db\x6708
+ SMONTHNAME5 \x4e94\x6708
+ SMONTHNAME6 \x516d\x6708
+ SMONTHNAME7 \x4e03\x6708
+ SMONTHNAME8 \x516b\x6708
+ SMONTHNAME9 \x4e5d\x6708
+ SMONTHNAME10 \x5341\x6708
+ SMONTHNAME11 \x5341\x4e00\x6708
+ SMONTHNAME12 \x5341\x4e8c\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x4e00\x6708
+ SABBREVMONTHNAME2 \x4e8c\x6708
+ SABBREVMONTHNAME3 \x4e09\x6708
+ SABBREVMONTHNAME4 \x56db\x6708
+ SABBREVMONTHNAME5 \x4e94\x6708
+ SABBREVMONTHNAME6 \x516d\x6708
+ SABBREVMONTHNAME7 \x4e03\x6708
+ SABBREVMONTHNAME8 \x516b\x6708
+ SABBREVMONTHNAME9 \x4e5d\x6708
+ SABBREVMONTHNAME10 \x5341\x6708
+ SABBREVMONTHNAME11 \x5341\x4e00\x6708
+ SABBREVMONTHNAME12 \x5341\x4e8c\x6708
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0C04 ; Chinese - Hong Kong
+
+ ILANGUAGE 0C04
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHH
+ SNATIVELANGNAME \x4e2d\x6587
+
+ ICOUNTRY 852
+ SENGCOUNTRY Hong Kong
+ SABBREVCTRYNAME HKG
+ SNATIVECTRYNAME \x9999\x6e2f
+
+ IDEFAULTLANGUAGE 0C04
+ IDEFAULTCOUNTRY 852
+ IDEFAULTANSICODEPAGE 950
+ IDEFAULTOEMCODEPAGE 950
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY HK$
+ SINTLSYMBOL HKD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 0
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 AM
+ S2359 PM
+
+ SSHORTDATE 6 d/M/yy
+ dd/MM/yy
+ yy/M/d
+ yy/MM/dd
+ yyyy/M/d
+ yyyy/MM/dd
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 3 dddd, d MMMM, yyyy
+ dddd' 'yyyy' 'MM' 'dd
+ yyyy' 'MM' 'dd
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00
+ SDAYNAME2 \x661f\x671f\x4e8c
+ SDAYNAME3 \x661f\x671f\x4e09
+ SDAYNAME4 \x661f\x671f\x56db
+ SDAYNAME5 \x661f\x671f\x4e94
+ SDAYNAME6 \x661f\x671f\x516d
+ SDAYNAME7 \x661f\x671f\x65e5
+
+ SABBREVDAYNAME1 \x661f\x671f\x4e00
+ SABBREVDAYNAME2 \x661f\x671f\x4e8c
+ SABBREVDAYNAME3 \x661f\x671f\x4e09
+ SABBREVDAYNAME4 \x661f\x671f\x56db
+ SABBREVDAYNAME5 \x661f\x671f\x4e94
+ SABBREVDAYNAME6 \x661f\x671f\x516d
+ SABBREVDAYNAME7 \x661f\x671f\x65e5
+
+ SMONTHNAME1 \x4e00\x6708
+ SMONTHNAME2 \x4e8c\x6708
+ SMONTHNAME3 \x4e09\x6708
+ SMONTHNAME4 \x56db\x6708
+ SMONTHNAME5 \x4e94\x6708
+ SMONTHNAME6 \x516d\x6708
+ SMONTHNAME7 \x4e03\x6708
+ SMONTHNAME8 \x516b\x6708
+ SMONTHNAME9 \x4e5d\x6708
+ SMONTHNAME10 \x5341\x6708
+ SMONTHNAME11 \x5341\x4e00\x6708
+ SMONTHNAME12 \x5341\x4e8c\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x4e00\x6708
+ SABBREVMONTHNAME2 \x4e8c\x6708
+ SABBREVMONTHNAME3 \x4e09\x6708
+ SABBREVMONTHNAME4 \x56db\x6708
+ SABBREVMONTHNAME5 \x4e94\x6708
+ SABBREVMONTHNAME6 \x516d\x6708
+ SABBREVMONTHNAME7 \x4e03\x6708
+ SABBREVMONTHNAME8 \x516b\x6708
+ SABBREVMONTHNAME9 \x4e5d\x6708
+ SABBREVMONTHNAME10 \x5341\x6708
+ SABBREVMONTHNAME11 \x5341\x4e00\x6708
+ SABBREVMONTHNAME12 \x5341\x4e8c\x6708
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 1004 ; Chinese - Singapore
+
+ ILANGUAGE 1004
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHI
+ SNATIVELANGNAME \x4e2d\x6587
+
+ ICOUNTRY 65
+ SENGCOUNTRY Singapore
+ SABBREVCTRYNAME SGP
+ SNATIVECTRYNAME \x65b0\x52a0\x5761
+
+ IDEFAULTLANGUAGE 1004
+ IDEFAULTCOUNTRY 65
+ IDEFAULTANSICODEPAGE 936
+ IDEFAULTOEMCODEPAGE 936
+
+ SLIST ,
+ IMEASURE 1
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL SGD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 0
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 AM
+ S2359 PM
+
+ SSHORTDATE 6 d/M/yy
+ dd/MM/yy
+ yy/M/d
+ yy/MM/dd
+ yyyy/M/d
+ yyyy/MM/dd
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 3 dddd, d MMMM, yyyy
+ dddd' 'yyyy' 'MM' 'dd
+ yyyy' 'MM' 'dd
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00
+ SDAYNAME2 \x661f\x671f\x4e8c
+ SDAYNAME3 \x661f\x671f\x4e09
+ SDAYNAME4 \x661f\x671f\x56db
+ SDAYNAME5 \x661f\x671f\x4e94
+ SDAYNAME6 \x661f\x671f\x516d
+ SDAYNAME7 \x661f\x671f\x65e5
+
+ SABBREVDAYNAME1 \x661f\x671f\x4e00
+ SABBREVDAYNAME2 \x661f\x671f\x4e8c
+ SABBREVDAYNAME3 \x661f\x671f\x4e09
+ SABBREVDAYNAME4 \x661f\x671f\x56db
+ SABBREVDAYNAME5 \x661f\x671f\x4e94
+ SABBREVDAYNAME6 \x661f\x671f\x516d
+ SABBREVDAYNAME7 \x661f\x671f\x65e5
+
+ SMONTHNAME1 \x4e00\x6708
+ SMONTHNAME2 \x4e8c\x6708
+ SMONTHNAME3 \x4e09\x6708
+ SMONTHNAME4 \x56db\x6708
+ SMONTHNAME5 \x4e94\x6708
+ SMONTHNAME6 \x516d\x6708
+ SMONTHNAME7 \x4e03\x6708
+ SMONTHNAME8 \x516b\x6708
+ SMONTHNAME9 \x4e5d\x6708
+ SMONTHNAME10 \x5341\x6708
+ SMONTHNAME11 \x5341\x4e00\x6708
+ SMONTHNAME12 \x5341\x4e8c\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x4e00\x6708
+ SABBREVMONTHNAME2 \x4e8c\x6708
+ SABBREVMONTHNAME3 \x4e09\x6708
+ SABBREVMONTHNAME4 \x56db\x6708
+ SABBREVMONTHNAME5 \x4e94\x6708
+ SABBREVMONTHNAME6 \x516d\x6708
+ SABBREVMONTHNAME7 \x4e03\x6708
+ SABBREVMONTHNAME8 \x516b\x6708
+ SABBREVMONTHNAME9 \x4e5d\x6708
+ SABBREVMONTHNAME10 \x5341\x6708
+ SABBREVMONTHNAME11 \x5341\x4e00\x6708
+ SABBREVMONTHNAME12 \x5341\x4e8c\x6708
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0405 ; Czech - Czech Republic
+
+ ILANGUAGE 0405
+ SENGLANGUAGE Czech
+ SABBREVLANGNAME CSY
+ SNATIVELANGNAME \x010cesk\x00fd
+
+ ICOUNTRY 42
+ SENGCOUNTRY Czech Republic
+ SABBREVCTRYNAME CZK
+ SNATIVECTRYNAME \x010cesk\x00e1\x00a0republika
+
+ IDEFAULTLANGUAGE 0405
+ IDEFAULTCOUNTRY 42
+ IDEFAULTANSICODEPAGE 1250
+ IDEFAULTOEMCODEPAGE 852
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY K\x010d
+ SINTLSYMBOL CZK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH.mm.ss
+ H.mm.ss
+ HH:mm:ss
+ H:mm:ss
+ STIME .
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd.MM.yyyy
+ dd-MM-yy
+ yyyy-MM-dd
+ yy-MM-dd
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 pon\x00d4\x011bl\x00ed
+ SDAYNAME2 \x00fater\x00fd
+ SDAYNAME3 st\x0159eda
+ SDAYNAME4 \x010dtvrtek
+ SDAYNAME5 pátek
+ SDAYNAME6 sobota
+ SDAYNAME7 ned\x0159le
+
+ SABBREVDAYNAME1 po
+ SABBREVDAYNAME2 út
+ SABBREVDAYNAME3 st
+ SABBREVDAYNAME4 \x010dt
+ SABBREVDAYNAME5 pá
+ SABBREVDAYNAME6 so
+ SABBREVDAYNAME7 ne
+
+ SMONTHNAME1 leden
+ SMONTHNAME2 únor
+ SMONTHNAME3 b\x0159ezen
+ SMONTHNAME4 duben
+ SMONTHNAME5 kv\x011bten
+ SMONTHNAME6 \x010derven
+ SMONTHNAME7 \x010dervenec
+ SMONTHNAME8 srpen
+ SMONTHNAME9 z\x00e1\x0159\x00ed
+ SMONTHNAME10 \x0159\x00edjen
+ SMONTHNAME11 listopad
+ SMONTHNAME12 prosinec
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 led
+ SABBREVMONTHNAME2 únor
+ SABBREVMONTHNAME3 b\x0159ez
+ SABBREVMONTHNAME4 dub
+ SABBREVMONTHNAME5 kv\x011bt
+ SABBREVMONTHNAME6 \x010derv
+ SABBREVMONTHNAME7 \x010derc
+ SABBREVMONTHNAME8 srp
+ SABBREVMONTHNAME9 z\x00e1\x0159
+ SABBREVMONTHNAME10 \x0159\x00edj
+ SABBREVMONTHNAME11 list
+ SABBREVMONTHNAME12 pros
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0406 ; Danish - Denmark
+
+ ILANGUAGE 0406
+ SENGLANGUAGE Danish
+ SABBREVLANGNAME DAN
+ SNATIVELANGNAME Dansk
+
+ ICOUNTRY 45
+ SENGCOUNTRY Denmark
+ SABBREVCTRYNAME DNK
+ SNATIVECTRYNAME Danmark
+
+ IDEFAULTLANGUAGE 0406
+ IDEFAULTCOUNTRY 45
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL DKK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 12
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH.mm.ss
+ H.mm.ss
+ HH:mm
+ STIME .
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd-MM-yy
+ yyyy-MM-dd
+ yyyy MM dd
+ dd/M-yy
+ SDATE -
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 mandag
+ SDAYNAME2 tirsdag
+ SDAYNAME3 onsdag
+ SDAYNAME4 torsdag
+ SDAYNAME5 fredag
+ SDAYNAME6 lørdag
+ SDAYNAME7 søndag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 on
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 fr
+ SABBREVDAYNAME6 lø
+ SABBREVDAYNAME7 sø
+
+ SMONTHNAME1 januar
+ SMONTHNAME2 februar
+ SMONTHNAME3 marts
+ SMONTHNAME4 april
+ SMONTHNAME5 maj
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 august
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 maj
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0407 ; German - Germany
+
+ ILANGUAGE 0407
+ SENGLANGUAGE German
+ SABBREVLANGNAME DEU
+ SNATIVELANGNAME Deutsch
+
+ ICOUNTRY 49
+ SENGCOUNTRY Germany
+ SABBREVCTRYNAME DEU
+ SNATIVECTRYNAME Deutschland
+
+ IDEFAULTLANGUAGE 0407
+ IDEFAULTCOUNTRY 49
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY DM
+ SINTLSYMBOL DEM
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ H.mm
+ H.mm' Uhr '
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd.MM.yy
+ d.MM.yy
+ d.M.yy
+ d.M.yyyy
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd, d. MMMM yyyy
+ d. MMMM yyyy
+ d. MMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorianischer Kalender
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Montag
+ SDAYNAME2 Dienstag
+ SDAYNAME3 Mittwoch
+ SDAYNAME4 Donnerstag
+ SDAYNAME5 Freitag
+ SDAYNAME6 Samstag
+ SDAYNAME7 Sonntag
+
+ SABBREVDAYNAME1 Mo
+ SABBREVDAYNAME2 Di
+ SABBREVDAYNAME3 Mi
+ SABBREVDAYNAME4 Do
+ SABBREVDAYNAME5 Fr
+ SABBREVDAYNAME6 Sa
+ SABBREVDAYNAME7 So
+
+ SMONTHNAME1 Januar
+ SMONTHNAME2 Februar
+ SMONTHNAME3 März
+ SMONTHNAME4 April
+ SMONTHNAME5 Mai
+ SMONTHNAME6 Juni
+ SMONTHNAME7 Juli
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 Oktober
+ SMONTHNAME11 November
+ SMONTHNAME12 Dezember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mär
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 Mai
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Okt
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0807 ; German - Switzerland
+
+ ILANGUAGE 0807
+ SENGLANGUAGE German
+ SABBREVLANGNAME DES
+ SNATIVELANGNAME Deutsch
+
+ ICOUNTRY 41
+ SENGCOUNTRY Switzerland
+ SABBREVCTRYNAME CHE
+ SNATIVECTRYNAME Schweiz
+
+ IDEFAULTLANGUAGE 0807
+ IDEFAULTCOUNTRY 41
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND '
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY SFr.
+ SINTLSYMBOL CHF
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP '
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 5 HH:mm:ss
+ H:mm:ss
+ H.mm' h'
+ HH.mm' h'
+ H.mm' Uhr'
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 dd.MM.yyyy
+ dd.MM.yy
+ d.MM.yy
+ dd. M. yy
+ d.M.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd, d. MMMM yyyy
+ d. MMMM yyyy
+ d. MMM yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorianischer Kalender
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Montag
+ SDAYNAME2 Dienstag
+ SDAYNAME3 Mittwoch
+ SDAYNAME4 Donnerstag
+ SDAYNAME5 Freitag
+ SDAYNAME6 Samstag
+ SDAYNAME7 Sonntag
+
+ SABBREVDAYNAME1 Mo
+ SABBREVDAYNAME2 Di
+ SABBREVDAYNAME3 Mi
+ SABBREVDAYNAME4 Do
+ SABBREVDAYNAME5 Fr
+ SABBREVDAYNAME6 Sa
+ SABBREVDAYNAME7 So
+
+ SMONTHNAME1 Januar
+ SMONTHNAME2 Februar
+ SMONTHNAME3 März
+ SMONTHNAME4 April
+ SMONTHNAME5 Mai
+ SMONTHNAME6 Juni
+ SMONTHNAME7 Juli
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 Oktober
+ SMONTHNAME11 November
+ SMONTHNAME12 Dezember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mär
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 Mai
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Okt
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0C07 ; German - Austria
+
+ ILANGUAGE 0C07
+ SENGLANGUAGE German
+ SABBREVLANGNAME DEA
+ SNATIVELANGNAME Deutsch
+
+ ICOUNTRY 43
+ SENGCOUNTRY Austria
+ SABBREVCTRYNAME AUT
+ SNATIVECTRYNAME Österreich
+
+ IDEFAULTLANGUAGE 0C07
+ IDEFAULTCOUNTRY 43
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY S
+ SINTLSYMBOL ATS
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 9
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ HH:mm
+ HH:mm' Uhr'
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 dd.MM.yy
+ dd.M.yyyy
+ yyMMdd
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd, dd. MMMM yyyy
+ d.MMMM yyyy
+ d.MMMyyyy
+ d MMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorianischer Kalender
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Montag
+ SDAYNAME2 Dienstag
+ SDAYNAME3 Mittwoch
+ SDAYNAME4 Donnerstag
+ SDAYNAME5 Freitag
+ SDAYNAME6 Samstag
+ SDAYNAME7 Sonntag
+
+ SABBREVDAYNAME1 Mo
+ SABBREVDAYNAME2 Di
+ SABBREVDAYNAME3 Mi
+ SABBREVDAYNAME4 Do
+ SABBREVDAYNAME5 Fr
+ SABBREVDAYNAME6 Sa
+ SABBREVDAYNAME7 So
+
+ SMONTHNAME1 Januar
+ SMONTHNAME2 Februar
+ SMONTHNAME3 März
+ SMONTHNAME4 April
+ SMONTHNAME5 Mai
+ SMONTHNAME6 Juni
+ SMONTHNAME7 Juli
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 Oktober
+ SMONTHNAME11 November
+ SMONTHNAME12 Dezember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mär
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 Mai
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Okt
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0408 ; Greek - Greece
+
+ ILANGUAGE 0408
+ SENGLANGUAGE Greek
+ SABBREVLANGNAME ELL
+ SNATIVELANGNAME \x0395\x03bb\x03bb\x03b7\x03bd\x03b9\x03ba\x03ac
+
+ ICOUNTRY 30
+ SENGCOUNTRY Greece
+ SABBREVCTRYNAME GRC
+ SNATIVECTRYNAME \x0395\x03bb\x03bb\x03ac\x03b4\x03b1
+
+ IDEFAULTLANGUAGE 0408
+ IDEFAULTCOUNTRY 30
+ IDEFAULTANSICODEPAGE 1253
+ IDEFAULTOEMCODEPAGE 869
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 0
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x03b4\x03c1\x03c7
+ SINTLSYMBOL GRD
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 3
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 h:mm:ss tt
+ hh:mm:ss tt
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 \x03c0\x03bc
+ S2359 \x03bc\x03bc
+
+ SSHORTDATE 4 d/M/yyyy
+ dd/MM/yyyy
+ d/M/yy
+ dd/MM/yy
+ SDATE /
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 2 dddd, d MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x0394\x03b5\x03c5\x03c4\x03ad\x03c1\x03b1
+ SDAYNAME2 \x03a4\x03c1\x03af\x03c4\x03b7
+ SDAYNAME3 \x03a4\x03b5\x03c4\x03ac\x03c1\x03c4\x03b7
+ SDAYNAME4 \x03a0\x03ad\x03bc\x03c0\x03c4\x03b7
+ SDAYNAME5 \x03a0\x03b1\x03c1\x03b1\x03c3\x03ba\x03b5\x03c5\x03ae
+ SDAYNAME6 \x03a3\x03ac\x03b2\x03b2\x03b1\x03c4\x03bf
+ SDAYNAME7 \x039a\x03c5\x03c1\x03b9\x03b1\x03ba\x03ae
+
+ SABBREVDAYNAME1 \x0394\x03b5\x03c5
+ SABBREVDAYNAME2 \x03a4\x03c1\x03b9
+ SABBREVDAYNAME3 \x03a4\x03b5\x03c4
+ SABBREVDAYNAME4 \x03a0\x03b5\x03bc
+ SABBREVDAYNAME5 \x03a0\x03b1\x03c1
+ SABBREVDAYNAME6 \x03a3\x03b1\x03b2
+ SABBREVDAYNAME7 \x039a\x03c5\x03c1
+
+ SMONTHNAME1 \x0399\x03b1\x03bd\x03bf\x03c5\x03b1\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME2 \x03a6\x03b5\x03b2\x03c1\x03bf\x03c5\x03b1\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME3 \x039c\x03b1\x03c1\x03c4\x03af\x03bf\x03c5
+ SMONTHNAME4 \x0391\x03c0\x03c1\x03b9\x03bb\x03af\x03bf\x03c5
+ SMONTHNAME5 \x039c\x03b1\x0390\x03bf\x03c5
+ SMONTHNAME6 \x0399\x03bf\x03c5\x03bd\x03af\x03bf\x03c5
+ SMONTHNAME7 \x0399\x03bf\x03c5\x03bb\x03af\x03bf\x03c5
+ SMONTHNAME8 \x0391\x03c5\x03b3\x03bf\x03cd\x03c3\x03c4\x03bf\x03c5
+ SMONTHNAME9 \x03a3\x03b5\x03c0\x03c4\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME10 \x039f\x03ba\x03c4\x03c9\x03b2\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME11 \x039d\x03bf\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME12 \x0394\x03b5\x03ba\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x0399\x03b1\x03bd
+ SABBREVMONTHNAME2 \x03a6\x03b5\x03b2
+ SABBREVMONTHNAME3 \x039c\x03b1\x03c1
+ SABBREVMONTHNAME4 \x0391\x03c0\x03c1
+ SABBREVMONTHNAME5 \x039c\x03b1\x03ca
+ SABBREVMONTHNAME6 \x0399\x03bf\x03c5\x03bd
+ SABBREVMONTHNAME7 \x0399\x03bf\x03c5\x03bb
+ SABBREVMONTHNAME8 \x0391\x03c5\x03b3
+ SABBREVMONTHNAME9 \x03a3\x03b5\x03c0
+ SABBREVMONTHNAME10 \x039f\x03ba\x03c4
+ SABBREVMONTHNAME11 \x039d\x03bf\x03b5
+ SABBREVMONTHNAME12 \x0394\x03b5\x03ba
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0409 ; English - United States
+
+ ILANGUAGE 0409
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENU
+ SNATIVELANGNAME English
+
+ ICOUNTRY 1
+ SENGCOUNTRY United States
+ SABBREVCTRYNAME USA
+ SNATIVECTRYNAME United States
+
+ IDEFAULTLANGUAGE 0409
+ IDEFAULTCOUNTRY 1
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 437
+
+ SLIST ,
+ IMEASURE 1
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL USD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 h:mm:ss tt
+ hh:mm:ss tt
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 AM
+ S2359 PM
+
+ SSHORTDATE 6 M/d/yy
+ M/d/yyyy
+ MM/dd/yy
+ MM/dd/yyyy
+ yy/MM/dd
+ dd-MMM-yy
+ SDATE /
+ IDATE 0
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 4 dddd, MMMM dd, yyyy
+ MMMM dd, yyyy
+ dddd, dd MMMM, yyyy
+ dd MMMM, yyyy
+ ILDATE 0
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0809 ; English - United Kingdom
+
+ ILANGUAGE 0809
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENG
+ SNATIVELANGNAME English
+
+ ICOUNTRY 44
+ SENGCOUNTRY United Kingdom
+ SABBREVCTRYNAME GBR
+ SNATIVECTRYNAME England
+
+ IDEFAULTLANGUAGE 0809
+ IDEFAULTCOUNTRY 44
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY £
+ SINTLSYMBOL GBP
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ d/M/yy
+ d.M.yy
+ ddMMyy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 dd MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0C09 ; English - Australia
+
+ ILANGUAGE 0C09
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENA
+ SNATIVELANGNAME English
+
+ ICOUNTRY 61
+ SENGCOUNTRY Australia
+ SABBREVCTRYNAME AUS
+ SNATIVECTRYNAME Australia
+
+ IDEFAULTLANGUAGE 0C09
+ IDEFAULTCOUNTRY 61
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL AUD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 d/MM/yy
+ d/M/yy
+ dd/MM/yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd, d MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 1009 ; English - Canada
+
+ ILANGUAGE 1009
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENC
+ SNATIVELANGNAME English
+
+ ICOUNTRY 2
+ SENGCOUNTRY Canada
+ SABBREVCTRYNAME CAN
+ SNATIVECTRYNAME Canada
+
+ IDEFAULTLANGUAGE 1009
+ IDEFAULTCOUNTRY 2
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL CAD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ d/M/yy
+ yy-MM-dd
+ m/dd/yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 MMMM d, yyyy
+ d-MMM-yy
+ ILDATE 0
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 1409 ; English - New Zealand
+
+ ILANGUAGE 1409
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENZ
+ SNATIVELANGNAME English
+
+ ICOUNTRY 64
+ SENGCOUNTRY New Zealand
+ SABBREVCTRYNAME NZL
+ SNATIVECTRYNAME New Zealand
+
+ IDEFAULTLANGUAGE 1409
+ IDEFAULTCOUNTRY 64
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL NZD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 d/MM/yy
+ dd/MM/yy
+ d.MM.yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd, d MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 1809 ; English - Ireland
+
+ ILANGUAGE 1809
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENI
+ SNATIVELANGNAME English
+
+ ICOUNTRY 353
+ SENGCOUNTRY Ireland
+ SABBREVCTRYNAME IRL
+ SNATIVECTRYNAME Eire
+
+ IDEFAULTLANGUAGE 1809
+ IDEFAULTCOUNTRY 353
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY IR£
+ SINTLSYMBOL IRP
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ d/M/yy
+ d.M.yy
+ ddMMyy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 dd MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040A ; Spanish - Spain (Traditional Sort)
+
+ ILANGUAGE 040A
+ SENGLANGUAGE Spanish - Traditional Sort
+ SABBREVLANGNAME ESP
+ SNATIVELANGNAME Español
+
+ ICOUNTRY 34
+ SENGCOUNTRY Spain
+ SABBREVCTRYNAME ESP
+ SNATIVECTRYNAME España
+
+ IDEFAULTLANGUAGE 040A
+ IDEFAULTCOUNTRY 34
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Pts
+ SINTLSYMBOL ESP
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 0
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 H:mm:ss
+ HH:mm:ss
+ HH:mm
+ HH'H'mm'''
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d/MM/yy
+ d/M/yy
+ dd-MM-yy
+ dd.MM.yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunes
+ SDAYNAME2 martes
+ SDAYNAME3 miércoles
+ SDAYNAME4 jueves
+ SDAYNAME5 viernes
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mié
+ SABBREVDAYNAME4 jue
+ SABBREVDAYNAME5 vie
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 enero
+ SMONTHNAME2 febrero
+ SMONTHNAME3 marzo
+ SMONTHNAME4 abril
+ SMONTHNAME5 mayo
+ SMONTHNAME6 junio
+ SMONTHNAME7 julio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 septiembre
+ SMONTHNAME10 octubre
+ SMONTHNAME11 noviembre
+ SMONTHNAME12 diciembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 ene
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 may
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 oct
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 080A ; Spanish - Mexico
+
+ ILANGUAGE 080A
+ SENGLANGUAGE Spanish
+ SABBREVLANGNAME ESM
+ SNATIVELANGNAME Español
+
+ ICOUNTRY 52
+ SENGCOUNTRY Mexico
+ SABBREVCTRYNAME MEX
+ SNATIVECTRYNAME México
+
+ IDEFAULTLANGUAGE 080A
+ IDEFAULTCOUNTRY 52
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY N$
+ SINTLSYMBOL MXP
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 0
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 h:mm:ss tt
+ hh:mm:ss tt
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 AM
+ S2359 PM
+
+ SSHORTDATE 4 d/MM/yy
+ d/M/yy
+ dd/MM/yy
+ dd-MM-yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunes
+ SDAYNAME2 martes
+ SDAYNAME3 miércoles
+ SDAYNAME4 jueves
+ SDAYNAME5 viernes
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mié
+ SABBREVDAYNAME4 jue
+ SABBREVDAYNAME5 vie
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 enero
+ SMONTHNAME2 febrero
+ SMONTHNAME3 marzo
+ SMONTHNAME4 abril
+ SMONTHNAME5 mayo
+ SMONTHNAME6 junio
+ SMONTHNAME7 julio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 septiembre
+ SMONTHNAME10 octubre
+ SMONTHNAME11 noviembre
+ SMONTHNAME12 diciembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 ene
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 may
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 oct
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0C0A ; Spanish - Spain (Modern Sort)
+
+ ILANGUAGE 0C0A
+ SENGLANGUAGE Spanish - Modern Sort
+ SABBREVLANGNAME ESN
+ SNATIVELANGNAME Español
+
+ ICOUNTRY 34
+ SENGCOUNTRY Spain
+ SABBREVCTRYNAME ESP
+ SNATIVECTRYNAME España
+
+ IDEFAULTLANGUAGE 0C0A
+ IDEFAULTCOUNTRY 34
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Pts
+ SINTLSYMBOL ESP
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 0
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 H:mm:ss
+ HH:mm:ss
+ HH:mm
+ HH'H'mm'''
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d/MM/yy
+ dd/MM/yy
+ dd-MM-yy
+ dd.MM.yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunes
+ SDAYNAME2 martes
+ SDAYNAME3 miércoles
+ SDAYNAME4 jueves
+ SDAYNAME5 viernes
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mié
+ SABBREVDAYNAME4 jue
+ SABBREVDAYNAME5 vie
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 enero
+ SMONTHNAME2 febrero
+ SMONTHNAME3 marzo
+ SMONTHNAME4 abril
+ SMONTHNAME5 mayo
+ SMONTHNAME6 junio
+ SMONTHNAME7 julio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 septiembre
+ SMONTHNAME10 octubre
+ SMONTHNAME11 noviembre
+ SMONTHNAME12 diciembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 ene
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 may
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 oct
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040B ; Finnish - Finland
+
+ ILANGUAGE 040B
+ SENGLANGUAGE Finnish
+ SABBREVLANGNAME FIN
+ SNATIVELANGNAME suomi
+
+ ICOUNTRY 358
+ SENGCOUNTRY Finland
+ SABBREVCTRYNAME FIN
+ SNATIVECTRYNAME Suomi
+
+ IDEFAULTLANGUAGE 040B
+ IDEFAULTCOUNTRY 358
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY mk
+ SINTLSYMBOL FIM
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 H.mm.ss
+ HH.mm.ss
+ H.mm
+ STIME .
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d.M.yyyy
+ dd.MM.yyyy
+ d.M.yy
+ yyyy-MM-dd
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 2 d. MMMM'ta 'yyyy
+ dd. MMMM'ta 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 maanantai
+ SDAYNAME2 tiistai
+ SDAYNAME3 keskiviikko
+ SDAYNAME4 torstai
+ SDAYNAME5 perjantai
+ SDAYNAME6 lauantai
+ SDAYNAME7 sunnuntai
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 ke
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 pe
+ SABBREVDAYNAME6 la
+ SABBREVDAYNAME7 su
+
+ SMONTHNAME1 tammikuu
+ SMONTHNAME2 helmikuu
+ SMONTHNAME3 maaliskuu
+ SMONTHNAME4 huhtikuu
+ SMONTHNAME5 toukokuu
+ SMONTHNAME6 kesäkuu
+ SMONTHNAME7 heinäkuu
+ SMONTHNAME8 elokuu
+ SMONTHNAME9 syyskuu
+ SMONTHNAME10 lokakuu
+ SMONTHNAME11 marraskuu
+ SMONTHNAME12 joulukuu
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 tammi
+ SABBREVMONTHNAME2 helmi
+ SABBREVMONTHNAME3 maalis
+ SABBREVMONTHNAME4 huhti
+ SABBREVMONTHNAME5 touko
+ SABBREVMONTHNAME6 kesä
+ SABBREVMONTHNAME7 heinä
+ SABBREVMONTHNAME8 elo
+ SABBREVMONTHNAME9 syys
+ SABBREVMONTHNAME10 loka
+ SABBREVMONTHNAME11 marras
+ SABBREVMONTHNAME12 joulu
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040C ; French - France
+
+ ILANGUAGE 040C
+ SENGLANGUAGE French
+ SABBREVLANGNAME FRA
+ SNATIVELANGNAME français
+
+ ICOUNTRY 33
+ SENGCOUNTRY France
+ SABBREVCTRYNAME FRA
+ SNATIVECTRYNAME France
+
+ IDEFAULTLANGUAGE 040C
+ IDEFAULTCOUNTRY 33
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY F
+ SINTLSYMBOL FRF
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ HH.mm
+ HH' h 'mm
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ dd.MM.yy
+ dd-MM-yy
+ dd/MM/yyyy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd d MMMM yyyy
+ d MMM yy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lundi
+ SDAYNAME2 mardi
+ SDAYNAME3 mercredi
+ SDAYNAME4 jeudi
+ SDAYNAME5 vendredi
+ SDAYNAME6 samedi
+ SDAYNAME7 dimanche
+
+ SABBREVDAYNAME1 lun.
+ SABBREVDAYNAME2 mar.
+ SABBREVDAYNAME3 mer.
+ SABBREVDAYNAME4 jeu.
+ SABBREVDAYNAME5 ven.
+ SABBREVDAYNAME6 sam.
+ SABBREVDAYNAME7 dim.
+
+ SMONTHNAME1 janvier
+ SMONTHNAME2 février
+ SMONTHNAME3 mars
+ SMONTHNAME4 avril
+ SMONTHNAME5 mai
+ SMONTHNAME6 juin
+ SMONTHNAME7 juillet
+ SMONTHNAME8 août
+ SMONTHNAME9 septembre
+ SMONTHNAME10 octobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 décembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 janv.
+ SABBREVMONTHNAME2 févr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 avr.
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 juin
+ SABBREVMONTHNAME7 juil.
+ SABBREVMONTHNAME8 août
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 oct.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 déc.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 080C ; French - Belgium
+
+ ILANGUAGE 080C
+ SENGLANGUAGE French
+ SABBREVLANGNAME FRB
+ SNATIVELANGNAME français
+
+ ICOUNTRY 32
+ SENGCOUNTRY Belgium
+ SABBREVCTRYNAME BEL
+ SNATIVECTRYNAME Belgique
+
+ IDEFAULTLANGUAGE 080C
+ IDEFAULTCOUNTRY 32
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY FB
+ SINTLSYMBOL BEF
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 5 H:mm:ss
+ HH:mm:ss
+ H.mm
+ H' h 'mm
+ H' h 'm' min 's' s '
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d/MM/yy
+ dd.MM.yy
+ yy/mm/dd
+ dd-MM-yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd d MMMM yyyy
+ d MMMM yyyy
+ dd-MMM-yy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lundi
+ SDAYNAME2 mardi
+ SDAYNAME3 mercredi
+ SDAYNAME4 jeudi
+ SDAYNAME5 vendredi
+ SDAYNAME6 samedi
+ SDAYNAME7 dimanche
+
+ SABBREVDAYNAME1 lun.
+ SABBREVDAYNAME2 mar.
+ SABBREVDAYNAME3 mer.
+ SABBREVDAYNAME4 jeu.
+ SABBREVDAYNAME5 ven.
+ SABBREVDAYNAME6 sam.
+ SABBREVDAYNAME7 dim.
+
+ SMONTHNAME1 janvier
+ SMONTHNAME2 février
+ SMONTHNAME3 mars
+ SMONTHNAME4 avril
+ SMONTHNAME5 mai
+ SMONTHNAME6 juin
+ SMONTHNAME7 juillet
+ SMONTHNAME8 août
+ SMONTHNAME9 septembre
+ SMONTHNAME10 octobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 décembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 janv.
+ SABBREVMONTHNAME2 févr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 avr.
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 juin
+ SABBREVMONTHNAME7 juil.
+ SABBREVMONTHNAME8 août
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 oct.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 déc.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0C0C ; French - Canada
+
+ ILANGUAGE 0C0C
+ SENGLANGUAGE French
+ SABBREVLANGNAME FRC
+ SNATIVELANGNAME français
+
+ ICOUNTRY 2
+ SENGCOUNTRY Canada
+ SABBREVCTRYNAME CAN
+ SNATIVECTRYNAME Canada
+
+ IDEFAULTLANGUAGE 0C0C
+ IDEFAULTCOUNTRY 2
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL CAD
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 4
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ H' h 'mm
+ H:mm
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 yy-MM-dd
+ dd-MM-yy
+ yy MM dd
+ dd/MM/yy
+ SDATE -
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d MMMM, yyyy
+ d MMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lundi
+ SDAYNAME2 mardi
+ SDAYNAME3 mercredi
+ SDAYNAME4 jeudi
+ SDAYNAME5 vendredi
+ SDAYNAME6 samedi
+ SDAYNAME7 dimanche
+
+ SABBREVDAYNAME1 lun.
+ SABBREVDAYNAME2 mar.
+ SABBREVDAYNAME3 mer.
+ SABBREVDAYNAME4 jeu.
+ SABBREVDAYNAME5 ven.
+ SABBREVDAYNAME6 sam.
+ SABBREVDAYNAME7 dim.
+
+ SMONTHNAME1 janvier
+ SMONTHNAME2 février
+ SMONTHNAME3 mars
+ SMONTHNAME4 avril
+ SMONTHNAME5 mai
+ SMONTHNAME6 juin
+ SMONTHNAME7 juillet
+ SMONTHNAME8 août
+ SMONTHNAME9 septembre
+ SMONTHNAME10 octobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 décembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 janv.
+ SABBREVMONTHNAME2 févr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 avr.
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 juin
+ SABBREVMONTHNAME7 juil.
+ SABBREVMONTHNAME8 août
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 oct.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 déc.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 100C ; French - Switzerland
+
+ ILANGUAGE 100C
+ SENGLANGUAGE French
+ SABBREVLANGNAME FRS
+ SNATIVELANGNAME français
+
+ ICOUNTRY 41
+ SENGCOUNTRY Switzerland
+ SABBREVCTRYNAME CHE
+ SNATIVECTRYNAME Suisse
+
+ IDEFAULTLANGUAGE 100C
+ IDEFAULTCOUNTRY 41
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND '
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY SFr.
+ SINTLSYMBOL CHF
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP '
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH:mm:ss
+ H:mm:ss
+ HH.mm' h'
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 dd.MM.yyyy
+ dd. M. yy
+ d.M.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd, d. MMMM yyyy
+ d. MMMM yyyy
+ d MMM yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lundi
+ SDAYNAME2 mardi
+ SDAYNAME3 mercredi
+ SDAYNAME4 jeudi
+ SDAYNAME5 vendredi
+ SDAYNAME6 samedi
+ SDAYNAME7 dimanche
+
+ SABBREVDAYNAME1 lun.
+ SABBREVDAYNAME2 mar.
+ SABBREVDAYNAME3 mer.
+ SABBREVDAYNAME4 jeu.
+ SABBREVDAYNAME5 ven.
+ SABBREVDAYNAME6 sam.
+ SABBREVDAYNAME7 dim.
+
+ SMONTHNAME1 janvier
+ SMONTHNAME2 fevrier
+ SMONTHNAME3 mars
+ SMONTHNAME4 avril
+ SMONTHNAME5 mai
+ SMONTHNAME6 juin
+ SMONTHNAME7 juillet
+ SMONTHNAME8 août
+ SMONTHNAME9 septembre
+ SMONTHNAME10 octobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 décembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 janv.
+ SABBREVMONTHNAME2 févr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 avr.
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 juin
+ SABBREVMONTHNAME7 juil.
+ SABBREVMONTHNAME8 août
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 oct.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 déc.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040e ; Hungarian - Hungary
+
+ ILANGUAGE 040e
+ SENGLANGUAGE Hungarian
+ SABBREVLANGNAME HUN
+ SNATIVELANGNAME magyar
+
+ ICOUNTRY 36
+ SENGCOUNTRY Hungary
+ SABBREVCTRYNAME HUN
+ SNATIVECTRYNAME Magyarország
+
+ IDEFAULTLANGUAGE 040e
+ IDEFAULTCOUNTRY 36
+ IDEFAULTANSICODEPAGE 1250
+ IDEFAULTOEMCODEPAGE 852
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Ft
+ SINTLSYMBOL HUF
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 H.mm.ss
+ HH.mm.ss
+ H:mm:ss
+ STIME .
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 yyyy.MM.dd.
+ yyyy-MM-dd
+ yy-MM-dd
+ SDATE .
+ IDATE 2
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 yyyy. MMMM d.
+ yyyy. MMMM dd.
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 h\x00e9tf\x0151
+ SDAYNAME2 kedd
+ SDAYNAME3 szerda
+ SDAYNAME4 csütörtök
+ SDAYNAME5 péntek
+ SDAYNAME6 szombat
+ SDAYNAME7 vasárnap
+
+ SABBREVDAYNAME1 H
+ SABBREVDAYNAME2 K
+ SABBREVDAYNAME3 Sze
+ SABBREVDAYNAME4 Cs
+ SABBREVDAYNAME5 P
+ SABBREVDAYNAME6 Szo
+ SABBREVDAYNAME7 V
+
+ SMONTHNAME1 január
+ SMONTHNAME2 február
+ SMONTHNAME3 márclus
+ SMONTHNAME4 április
+ SMONTHNAME5 május
+ SMONTHNAME6 június
+ SMONTHNAME7 július
+ SMONTHNAME8 augusztus
+ SMONTHNAME9 szeptember
+ SMONTHNAME10 október
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 már
+ SABBREVMONTHNAME4 ápr
+ SABBREVMONTHNAME5 máj
+ SABBREVMONTHNAME6 jún
+ SABBREVMONTHNAME7 júl
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sze
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040F ; Icelandic - Iceland
+
+ ILANGUAGE 040F
+ SENGLANGUAGE Icelandic
+ SABBREVLANGNAME ISL
+ SNATIVELANGNAME Íslenska
+
+ ICOUNTRY 354
+ SENGCOUNTRY Iceland
+ SABBREVCTRYNAME ISL
+ SNATIVECTRYNAME Ísland
+
+ IDEFAULTLANGUAGE 040F
+ IDEFAULTCOUNTRY 354
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL ISK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH:mm:ss
+ H:mm:ss
+ HH:mm
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 yyyy-MM-dd
+ dd.MM.yy
+ d. M. yyyy.
+ d. M. 'yy.
+ yy MM dd
+ SDATE -
+ IDATE 2
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 mánudagur
+ SDAYNAME2 þriðjudagur
+ SDAYNAME3 miðvikudagur
+ SDAYNAME4 fimmtudagur
+ SDAYNAME5 föstudagur
+ SDAYNAME6 laugardagur
+ SDAYNAME7 sunnudagur
+
+ SABBREVDAYNAME1 mán.
+ SABBREVDAYNAME2 þri.
+ SABBREVDAYNAME3 mið.
+ SABBREVDAYNAME4 fim.
+ SABBREVDAYNAME5 fös.
+ SABBREVDAYNAME6 lau.
+ SABBREVDAYNAME7 sun.
+
+ SMONTHNAME1 janúar
+ SMONTHNAME2 febrúar
+ SMONTHNAME3 mars
+ SMONTHNAME4 apríl
+ SMONTHNAME5 maí
+ SMONTHNAME6 júní
+ SMONTHNAME7 júlí
+ SMONTHNAME8 ágúst
+ SMONTHNAME9 september
+ SMONTHNAME10 október
+ SMONTHNAME11 nóvember
+ SMONTHNAME12 desember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan.
+ SABBREVMONTHNAME2 febr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 apr.
+ SABBREVMONTHNAME5 maí
+ SABBREVMONTHNAME6 júní
+ SABBREVMONTHNAME7 júlí
+ SABBREVMONTHNAME8 ág.
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 okt.
+ SABBREVMONTHNAME11 nóv.
+ SABBREVMONTHNAME12 des.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0410 ; Italian - Italy
+
+ ILANGUAGE 0410
+ SENGLANGUAGE Italian
+ SABBREVLANGNAME ITA
+ SNATIVELANGNAME Italiano
+
+ ICOUNTRY 39
+ SENGCOUNTRY Italy
+ SABBREVCTRYNAME ITA
+ SNATIVECTRYNAME Italia
+
+ IDEFAULTLANGUAGE 0410
+ IDEFAULTCOUNTRY 39
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY L.
+ SINTLSYMBOL ITL
+ SMONDECIMALSEP \x0000
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 0
+ ICURRENCY 2
+ INEGCURR 9
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 H.mm.ss
+ HH.mm.ss
+ H.mm
+ H:mm
+ STIME .
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ dd/MM/yyyy
+ dd.M.yy
+ d/M/yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd d MMMM yyyy
+ d-MMM-yy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunedì
+ SDAYNAME2 martedì
+ SDAYNAME3 mercoledì
+ SDAYNAME4 giovedì
+ SDAYNAME5 venerdì
+ SDAYNAME6 sabato
+ SDAYNAME7 domenica
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mer
+ SABBREVDAYNAME4 gio
+ SABBREVDAYNAME5 ven
+ SABBREVDAYNAME6 sab
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 gennaio
+ SMONTHNAME2 febbraio
+ SMONTHNAME3 marzo
+ SMONTHNAME4 aprile
+ SMONTHNAME5 maggio
+ SMONTHNAME6 giugno
+ SMONTHNAME7 luglio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 settembre
+ SMONTHNAME10 ottobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 dicembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 gen
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mag
+ SABBREVMONTHNAME6 giu
+ SABBREVMONTHNAME7 lug
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 set
+ SABBREVMONTHNAME10 ott
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0810 ; Italian - Switzerland
+
+ ILANGUAGE 0810
+ SENGLANGUAGE Italian
+ SABBREVLANGNAME ITS
+ SNATIVELANGNAME Italiano
+
+ ICOUNTRY 41
+ SENGCOUNTRY Switzerland
+ SABBREVCTRYNAME CHE
+ SNATIVECTRYNAME Svizzera
+
+ IDEFAULTLANGUAGE 0810
+ IDEFAULTCOUNTRY 41
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND '
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY SFr.
+ SINTLSYMBOL CHF
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP '
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH:mm:ss
+ H:mm:ss
+ H.mm' h'
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd.MM.yyyy
+ dd. MM. yy
+ d/M/yy
+ dd.M.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd, d. MMMM yyyy
+ d-MMM-yy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunedì
+ SDAYNAME2 martedì
+ SDAYNAME3 mercoledì
+ SDAYNAME4 giovedì
+ SDAYNAME5 venerdì
+ SDAYNAME6 sabato
+ SDAYNAME7 domenica
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mer
+ SABBREVDAYNAME4 gio
+ SABBREVDAYNAME5 ven
+ SABBREVDAYNAME6 sab
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 gennaio
+ SMONTHNAME2 febbraio
+ SMONTHNAME3 marzo
+ SMONTHNAME4 aprile
+ SMONTHNAME5 maggio
+ SMONTHNAME6 giugno
+ SMONTHNAME7 luglio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 settembre
+ SMONTHNAME10 ottobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 dicembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 gen
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mag
+ SABBREVMONTHNAME6 gio
+ SABBREVMONTHNAME7 lug
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 set
+ SABBREVMONTHNAME10 ott
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0411 ; Japanese - Japan
+
+ ILANGUAGE 0411
+ SENGLANGUAGE Japanese
+ SABBREVLANGNAME JPN
+ SNATIVELANGNAME \x65e5\x672c\x8a9e
+
+ ICOUNTRY 81
+ SENGCOUNTRY Japan
+ SABBREVCTRYNAME JPN
+ SNATIVECTRYNAME \x65e5\x672c
+
+ IDEFAULTLANGUAGE 0411
+ IDEFAULTCOUNTRY 81
+ IDEFAULTANSICODEPAGE 932
+ IDEFAULTOEMCODEPAGE 932
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \xffe5
+ SINTLSYMBOL YEN
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 \x5348\x524d
+ S2359 \x5348\x5f8c
+
+ SSHORTDATE 4 yy/MM/dd
+ yy/M/d
+ yyyy/MM/dd
+ yyyy/M/d
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 yyyy'\x5e74'M'\x6708'd'\x65e5'
+ yyyy'\x5e74'MM'\x6708'dd'\x65e5'
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 3 3\xffffEra: Year of the Emperor
+ 2\xffffGregorian (U.S. English)
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x6708\x66dc\x65e5
+ SDAYNAME2 \x706b\x66dc\x65e5
+ SDAYNAME3 \x6c34\x66dc\x65e5
+ SDAYNAME4 \x6728\x66dc\x65e5
+ SDAYNAME5 \x91d1\x66dc\x65e5
+ SDAYNAME6 \x571f\x66dc\x65e5
+ SDAYNAME7 \x65e5\x66dc\x65e5
+
+ SABBREVDAYNAME1 \x6708
+ SABBREVDAYNAME2 \x706b
+ SABBREVDAYNAME3 \x6c34
+ SABBREVDAYNAME4 \x6728
+ SABBREVDAYNAME5 \x91d1
+ SABBREVDAYNAME6 \x571f
+ SABBREVDAYNAME7 \x65e5
+
+ SMONTHNAME1 \xff11\x6708
+ SMONTHNAME2 \xff12\x6708
+ SMONTHNAME3 \xff13\x6708
+ SMONTHNAME4 \xff14\x6708
+ SMONTHNAME5 \xff15\x6708
+ SMONTHNAME6 \xff16\x6708
+ SMONTHNAME7 \xff17\x6708
+ SMONTHNAME8 \xff18\x6708
+ SMONTHNAME9 \xff19\x6708
+ SMONTHNAME10 \xff11\xff10\x6708
+ SMONTHNAME11 \xff11\xff11\x6708
+ SMONTHNAME12 \xff11\xff12\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 1
+ SABBREVMONTHNAME2 2
+ SABBREVMONTHNAME3 3
+ SABBREVMONTHNAME4 4
+ SABBREVMONTHNAME5 5
+ SABBREVMONTHNAME6 6
+ SABBREVMONTHNAME7 7
+ SABBREVMONTHNAME8 8
+ SABBREVMONTHNAME9 9
+ SABBREVMONTHNAME10 10
+ SABBREVMONTHNAME11 11
+ SABBREVMONTHNAME12 12
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0412 ; Korean - Korea
+
+ ILANGUAGE 0412
+ SENGLANGUAGE Korean
+ SABBREVLANGNAME KOR
+ SNATIVELANGNAME \x3ca2\x3476\x3971
+ ICOUNTRY 82
+ SENGCOUNTRY Korea
+ SABBREVCTRYNAME KOR
+ SNATIVECTRYNAME \x35c2\x3ca2\x377b\x3476
+
+ IDEFAULTLANGUAGE 0412
+ IDEFAULTCOUNTRY 82
+ IDEFAULTANSICODEPAGE 949
+ IDEFAULTOEMCODEPAGE 949
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 0
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x20a9
+ SINTLSYMBOL KRW
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x39a1\x3a3b
+ S2359 \x39a1\x3cf3
+
+ SSHORTDATE 4 yy-MM-dd
+ yy-M-d
+ yyyy-M-d
+ yyyy-MM-dd
+ SDATE -
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 yyyy'\x355b' M'\x39da' d'\x3a0e'
+ yyyy'\x355b' MM'\x39da' dd'\x3a0e'
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 5\xffffTangun Era
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x39da\x39c5\x3a0e
+ SDAYNAME2 \x3cdc\x39c5\x3a0e
+ SDAYNAME3 \x38bd\x39c5\x3a0e
+ SDAYNAME4 \x3740\x39c5\x3a0e
+ SDAYNAME5 \x349a\x39c5\x3a0e
+ SDAYNAME6 \x3bf9\x39c5\x3a0e
+ SDAYNAME7 \x39da\x39c5\x3a0e
+
+ SABBREVDAYNAME1 \x39da
+ SABBREVDAYNAME2 \x3cdc
+ SABBREVDAYNAME3 \x38bd
+ SABBREVDAYNAME4 \x3740
+ SABBREVDAYNAME5 \x349a
+ SABBREVDAYNAME6 \x3bf9
+ SABBREVDAYNAME7 \x39da
+
+ SMONTHNAME1 \x0031\x39da
+ SMONTHNAME2 \x0032\x39da
+ SMONTHNAME3 \x0033\x39da
+ SMONTHNAME4 \x0034\x39da
+ SMONTHNAME5 \x0035\x39da
+ SMONTHNAME6 \x0036\x39da
+ SMONTHNAME7 \x0037\x39da
+ SMONTHNAME8 \x0038\x39da
+ SMONTHNAME9 \x0039\x39da
+ SMONTHNAME10 \x0031\x0030\x39da
+ SMONTHNAME11 \x0031\x0031\x39da
+ SMONTHNAME12 \x0031\x0032\x39da
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x0031\x39da
+ SABBREVMONTHNAME2 \x0032\x39da
+ SABBREVMONTHNAME3 \x0033\x39da
+ SABBREVMONTHNAME4 \x0034\x39da
+ SABBREVMONTHNAME5 \x0035\x39da
+ SABBREVMONTHNAME6 \x0036\x39da
+ SABBREVMONTHNAME7 \x0037\x39da
+ SABBREVMONTHNAME8 \x0038\x39da
+ SABBREVMONTHNAME9 \x0039\x39da
+ SABBREVMONTHNAME10 \x0031\x0030\x39da
+ SABBREVMONTHNAME11 \x0031\x0031\x39da
+ SABBREVMONTHNAME12 \x0031\x0032\x39da
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0413 ; Dutch - Netherlands
+
+ ILANGUAGE 0413
+ SENGLANGUAGE Dutch
+ SABBREVLANGNAME NLD
+ SNATIVELANGNAME Nederlands
+
+ ICOUNTRY 31
+ SENGCOUNTRY Netherlands
+ SABBREVCTRYNAME NLD
+ SNATIVECTRYNAME Nederland
+
+ IDEFAULTLANGUAGE 0413
+ IDEFAULTCOUNTRY 31
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY F
+ SINTLSYMBOL NLG
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 11
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 6 H:mm:ss
+ HH:mm:ss
+ H:mm
+ H.mm
+ HH.mm.ss' uur'
+ HH:mm:ss' uur'
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d-MM-yy
+ dd-MM-yy
+ dd/MM/yy
+ dd.MM.yy
+ SDATE -
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd d MMMM yyyy
+ d-MMM-yy
+ d MMMM yyyy
+ d MMM yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 maandag
+ SDAYNAME2 dinsdag
+ SDAYNAME3 woensdag
+ SDAYNAME4 donderdag
+ SDAYNAME5 vrijdag
+ SDAYNAME6 zaterdag
+ SDAYNAME7 zondag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 di
+ SABBREVDAYNAME3 wo
+ SABBREVDAYNAME4 do
+ SABBREVDAYNAME5 vr
+ SABBREVDAYNAME6 za
+ SABBREVDAYNAME7 zo
+
+ SMONTHNAME1 januari
+ SMONTHNAME2 februari
+ SMONTHNAME3 maart
+ SMONTHNAME4 april
+ SMONTHNAME5 mei
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 augustus
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mrt
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mei
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0813 ; Dutch - Belgium
+
+ ILANGUAGE 0813
+ SENGLANGUAGE Dutch
+ SABBREVLANGNAME NLB
+ SNATIVELANGNAME Nederlands
+
+ ICOUNTRY 32
+ SENGCOUNTRY Belgium
+ SABBREVCTRYNAME BEL
+ SNATIVECTRYNAME België
+
+ IDEFAULTLANGUAGE 0813
+ IDEFAULTCOUNTRY 32
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY BF
+ SINTLSYMBOL BEF
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 H:mm:ss
+ HH:mm:ss
+ H.mm' u.'
+ H:mm
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 d/MM/yy
+ dd-mm-yy
+ dd.MM.yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd d MMMM yyyy
+ dd-MMM-yy
+ d MMMM yyyy
+ dd MMM yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 maandag
+ SDAYNAME2 dinsdag
+ SDAYNAME3 woensdag
+ SDAYNAME4 donderdag
+ SDAYNAME5 vrijdag
+ SDAYNAME6 zaterdag
+ SDAYNAME7 zondag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 di
+ SABBREVDAYNAME3 wo
+ SABBREVDAYNAME4 do
+ SABBREVDAYNAME5 vr
+ SABBREVDAYNAME6 za
+ SABBREVDAYNAME7 zo
+
+ SMONTHNAME1 januari
+ SMONTHNAME2 februari
+ SMONTHNAME3 maart
+ SMONTHNAME4 april
+ SMONTHNAME5 mei
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 augustus
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mrt
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mei
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0414 ; Norwegian - Norway (Bokmal)
+
+ ILANGUAGE 0414
+ SENGLANGUAGE Norwegian (Bokmal)
+ SABBREVLANGNAME NOR
+ SNATIVELANGNAME Norsk
+
+ ICOUNTRY 47
+ SENGCOUNTRY Norway
+ SABBREVCTRYNAME NOR
+ SNATIVECTRYNAME Norge
+
+ IDEFAULTLANGUAGE 0414
+ IDEFAULTCOUNTRY 47
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL NOK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ 'kl 'HH.mm
+ HH.mm.ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 dd.MM.yy
+ yyyy-MM-dd
+ d.M.yy
+ ddMMyy
+ dd.MM.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 mandag
+ SDAYNAME2 tirsdag
+ SDAYNAME3 onsdag
+ SDAYNAME4 torsdag
+ SDAYNAME5 fredag
+ SDAYNAME6 lørdag
+ SDAYNAME7 søndag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 on
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 fr
+ SABBREVDAYNAME6 lø
+ SABBREVDAYNAME7 sø
+
+ SMONTHNAME1 januar
+ SMONTHNAME2 februar
+ SMONTHNAME3 mars
+ SMONTHNAME4 april
+ SMONTHNAME5 mai
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 august
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 desember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 des
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0814 ; Norwegian - Norway (Nynorsk)
+
+ ILANGUAGE 0814
+ SENGLANGUAGE Norwegian (Nynorsk)
+ SABBREVLANGNAME NON
+ SNATIVELANGNAME Norsk
+
+ ICOUNTRY 47
+ SENGCOUNTRY Norway
+ SABBREVCTRYNAME NOR
+ SNATIVECTRYNAME Norge
+
+ IDEFAULTLANGUAGE 0814
+ IDEFAULTCOUNTRY 47
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL NOK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ 'kl 'HH.mm
+ HH.mm.ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 dd.MM.yy
+ yyyy-MM-dd
+ d.M.yy
+ ddMMyy
+ dd.MM.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 mandag
+ SDAYNAME2 tirsdag
+ SDAYNAME3 onsdag
+ SDAYNAME4 torsdag
+ SDAYNAME5 fredag
+ SDAYNAME6 lørdag
+ SDAYNAME7 søndag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 on
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 fr
+ SABBREVDAYNAME6 lø
+ SABBREVDAYNAME7 sø
+
+ SMONTHNAME1 januar
+ SMONTHNAME2 februar
+ SMONTHNAME3 mars
+ SMONTHNAME4 april
+ SMONTHNAME5 mai
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 august
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 desember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 des
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0415 ; Polish - Poland
+
+ ILANGUAGE 0415
+ SENGLANGUAGE Polish
+ SABBREVLANGNAME PLK
+ SNATIVELANGNAME Polski
+
+ ICOUNTRY 48
+ SENGCOUNTRY Poland
+ SABBREVCTRYNAME POL
+ SNATIVECTRYNAME Polska
+
+ IDEFAULTLANGUAGE 0415
+ IDEFAULTCOUNTRY 48
+ IDEFAULTANSICODEPAGE 1250
+ IDEFAULTOEMCODEPAGE 852
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY z\x0142
+ SINTLSYMBOL PLZ
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 yy.MM.dd
+ yyyy-MM-dd
+ yy-MM-dd
+ SDATE .
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d MMMM yyyy
+ dd MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Poniedzia\x0142ek
+ SDAYNAME2 Wtorek
+ SDAYNAME3 \x015aroda
+ SDAYNAME4 Czwartek
+ SDAYNAME5 Pi\x0105tek
+ SDAYNAME6 Sobota
+ SDAYNAME7 Niedziela
+
+ SABBREVDAYNAME1 pn.
+ SABBREVDAYNAME2 wt.
+ SABBREVDAYNAME3 \x015br.
+ SABBREVDAYNAME4 czw.
+ SABBREVDAYNAME5 pt.
+ SABBREVDAYNAME6 sob.
+ SABBREVDAYNAME7 ndz.
+
+ SMONTHNAME1 Styze\x0144
+ SMONTHNAME2 Luty
+ SMONTHNAME3 Marzec
+ SMONTHNAME4 Kwiecie\x0144
+ SMONTHNAME5 Maj
+ SMONTHNAME6 Czerwiec
+ SMONTHNAME7 Lipiec
+ SMONTHNAME8 Sierpie\x0144
+ SMONTHNAME9 Wrzesie\x0144
+ SMONTHNAME10 Pa\x017adziernik
+ SMONTHNAME11 Listopad
+ SMONTHNAME12 Grudzie\x0144
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Sty
+ SABBREVMONTHNAME2 Lut
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Kwi
+ SABBREVMONTHNAME5 Maj
+ SABBREVMONTHNAME6 Cze
+ SABBREVMONTHNAME7 Lip
+ SABBREVMONTHNAME8 Sie
+ SABBREVMONTHNAME9 Wrz
+ SABBREVMONTHNAME10 Pa\x017a
+ SABBREVMONTHNAME11 Lis
+ SABBREVMONTHNAME12 Gru
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0416 ; Portuguese - Brazil
+
+ ILANGUAGE 0416
+ SENGLANGUAGE Portuguese
+ SABBREVLANGNAME PTB
+ SNATIVELANGNAME Português
+
+ ICOUNTRY 55
+ SENGCOUNTRY Brazil
+ SABBREVCTRYNAME BRA
+ SNATIVECTRYNAME Brasil
+
+ IDEFAULTLANGUAGE 0416
+ IDEFAULTCOUNTRY 55
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Cr$
+ SINTLSYMBOL BRC
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 0
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 dd/MM/yy
+ dd/MM/yyyy
+ yyyy.MM.dd
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd, d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 segunda-feira
+ SDAYNAME2 terça-feira
+ SDAYNAME3 quarta-feira
+ SDAYNAME4 quinta-feira
+ SDAYNAME5 sexta-feira
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 seg
+ SABBREVDAYNAME2 ter
+ SABBREVDAYNAME3 qua
+ SABBREVDAYNAME4 qui
+ SABBREVDAYNAME5 sex
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 janeiro
+ SMONTHNAME2 fevereiro
+ SMONTHNAME3 março
+ SMONTHNAME4 abril
+ SMONTHNAME5 maio
+ SMONTHNAME6 junho
+ SMONTHNAME7 julho
+ SMONTHNAME8 agosto
+ SMONTHNAME9 setembro
+ SMONTHNAME10 outubro
+ SMONTHNAME11 novembro
+ SMONTHNAME12 dezembro
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 fev
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 set
+ SABBREVMONTHNAME10 out
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0816 ; Portuguese - Portugal
+
+ ILANGUAGE 0816
+ SENGLANGUAGE Portuguese
+ SABBREVLANGNAME PTG
+ SNATIVELANGNAME Português
+
+ ICOUNTRY 351
+ SENGCOUNTRY Portugal
+ SABBREVCTRYNAME PRT
+ SNATIVECTRYNAME Portugal
+
+ IDEFAULTLANGUAGE 0816
+ IDEFAULTCOUNTRY 351
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Esc.
+ SINTLSYMBOL PTE
+ SMONDECIMALSEP $
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 H:mm:ss
+ HH:mm:ss
+ HH'H'mm'm'
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 dd-MM-yyyy
+ yy.MM.dd
+ d.M.yy
+ dd/MM/yy
+ yyyy-MM-dd
+ SDATE -
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd, d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ d/MMM/yy
+ d.MMM.yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 segunda-feira
+ SDAYNAME2 terça-feira
+ SDAYNAME3 quarta-feira
+ SDAYNAME4 quinta-feira
+ SDAYNAME5 sexta-feira
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 seg
+ SABBREVDAYNAME2 ter
+ SABBREVDAYNAME3 qua
+ SABBREVDAYNAME4 qui
+ SABBREVDAYNAME5 sex
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 janeiro
+ SMONTHNAME2 fevereiro
+ SMONTHNAME3 março
+ SMONTHNAME4 abril
+ SMONTHNAME5 maio
+ SMONTHNAME6 junho
+ SMONTHNAME7 julho
+ SMONTHNAME8 agosto
+ SMONTHNAME9 setembro
+ SMONTHNAME10 outubro
+ SMONTHNAME11 novembro
+ SMONTHNAME12 dezembro
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 fev
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 set
+ SABBREVMONTHNAME10 out
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0419 ; Russian - Russia
+
+ ILANGUAGE 0419
+ SENGLANGUAGE Russian
+ SABBREVLANGNAME RUS
+ SNATIVELANGNAME \x0420\x0443\x0441\x0441\x043a\x0438\x0439
+
+ ICOUNTRY 7
+ SENGCOUNTRY Russia
+ SABBREVCTRYNAME RUS
+ SNATIVECTRYNAME \x0420\x043e\x0441\x0441\x0438\x044f
+
+ IDEFAULTLANGUAGE 0419
+ IDEFAULTCOUNTRY 7
+ IDEFAULTANSICODEPAGE 1251
+ IDEFAULTOEMCODEPAGE 866
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x0440.
+ SINTLSYMBOL SUR
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 5
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 dd.MM.yy
+ d.M.yy
+ dd/MM/yy
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d MMMM yyyy
+ dd MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x041f\x043e\x043d\x0435\x0434\x0435\x043b\x044c\x043d\x0438\x043a
+ SDAYNAME2 \x0412\x0442\x043e\x0440\x043d\x0438\x043a
+ SDAYNAME3 \x0421\x0440\x0435\x0434\x0430
+ SDAYNAME4 \x0427\x0435\x0442\x0432\x0435\x0440\x0433
+ SDAYNAME5 \x041f\x044f\x0442\x043d\x0438\x0446\x0430
+ SDAYNAME6 \x0421\x0443\x0431\x0431\x043e\x0442\x0430
+ SDAYNAME7 \x0412\x043e\x0441\x043a\x0440\x0435\x0441\x0435\x043d\x044c\x0435
+
+ SABBREVDAYNAME1 \x041f\x043e\x043d
+ SABBREVDAYNAME2 \x0412\x0442\x043e
+ SABBREVDAYNAME3 \x0421\x0440\x0435
+ SABBREVDAYNAME4 \x0427\x0435\x0442
+ SABBREVDAYNAME5 \x041f\x044f\x0442
+ SABBREVDAYNAME6 \x0421\x0443\x0431
+ SABBREVDAYNAME7 \x0412\x043e\x0441
+
+ SMONTHNAME1 \x042f\x043d\x0432\x0430\x0440\x044c\xffff\x044f\x043d\x0432\x0430\x0440\x044f
+ SMONTHNAME2 \x0424\x0435\x0432\x0440\x0430\x043b\x044c\xffff\x0444\x0435\x0432\x0440\x0430\x043b\x044f
+ SMONTHNAME3 \x041c\x0430\x0440\x0442\xffff\x043c\x0430\x0440\x0442\x0430
+ SMONTHNAME4 \x0410\x043f\x0440\x0435\x043b\x044c\xffff\x0430\x043f\x0440\x0435\x043b\x044f
+ SMONTHNAME5 \x041c\x0430\x0439\xffff\x043c\x0430\x044f
+ SMONTHNAME6 \x0418\x044e\x043d\x044c\xffff\x0438\x044e\x043d\x044f
+ SMONTHNAME7 \x0418\x044e\x043b\x044c\xffff\x0438\x044e\x043b\x044f
+ SMONTHNAME8 \x0410\x0432\x0433\x0443\x0441\x0442\xffff\x0430\x0432\x0433\x0443\x0441\x0442\x0430
+ SMONTHNAME9 \x0421\x0435\x043d\x0442\x044f\x0431\x0440\x044c\xffff\x0441\x0435\x043d\x0442\x044f\x0431\x0440\x044f
+ SMONTHNAME10 \x041e\x043a\x0442\x044f\x0431\x0440\x044c\xffff\x043e\x043a\x0442\x044f\x0431\x0440\x044f
+ SMONTHNAME11 \x041d\x043e\x044f\x0431\x0440\x044c\xffff\x043d\x043e\x044f\x0431\x0440\x044f
+ SMONTHNAME12 \x0414\x0435\x043a\x0430\x0431\x0440\x044c\xffff\x0434\x0435\x043a\x0430\x0431\x0440\x044f
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x042f\x043d\x0432
+ SABBREVMONTHNAME2 \x0424\x0435\x0432
+ SABBREVMONTHNAME3 \x041c\x0430\x0440
+ SABBREVMONTHNAME4 \x0410\x043f\x0440
+ SABBREVMONTHNAME5 \x041c\x0430\x0439\xffff\x043c\x0430\x044f
+ SABBREVMONTHNAME6 \x0418\x044e\x043d
+ SABBREVMONTHNAME7 \x0418\x044e\x043b
+ SABBREVMONTHNAME8 \x0410\x0432\x0433
+ SABBREVMONTHNAME9 \x0421\x0435\x043d
+ SABBREVMONTHNAME10 \x041e\x043a\x0442
+ SABBREVMONTHNAME11 \x041d\x043e\x044f
+ SABBREVMONTHNAME12 \x0414\x0435\x043a
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 041B ; Slovak - Slovak Republic
+
+ ILANGUAGE 041B
+ SENGLANGUAGE Slovak
+ SABBREVLANGNAME SKY
+ SNATIVELANGNAME Slovenský
+
+ ICOUNTRY 42
+ SENGCOUNTRY Slovak Republic
+ SABBREVCTRYNAME SVK
+ SNATIVECTRYNAME Slovenská republika
+
+ IDEFAULTLANGUAGE 041B
+ IDEFAULTCOUNTRY 42
+ IDEFAULTANSICODEPAGE 1250
+ IDEFAULTOEMCODEPAGE 852
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Sk
+ SINTLSYMBOL SKK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH.mm.ss
+ H.mm.ss
+ STIME .
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd.MM.yyyy
+ dd-MM-yy
+ yyyy-MM-dd
+ yy-MM-dd
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 pondelok
+ SDAYNAME2 utorok
+ SDAYNAME3 streda
+ SDAYNAME4 \x0161tvrtok
+ SDAYNAME5 piatok
+ SDAYNAME6 sobota
+ SDAYNAME7 nede\x013ea
+
+ SABBREVDAYNAME1 po
+ SABBREVDAYNAME2 ut
+ SABBREVDAYNAME3 st
+ SABBREVDAYNAME4 \x0161t
+ SABBREVDAYNAME5 pi
+ SABBREVDAYNAME6 so
+ SABBREVDAYNAME7 ne
+
+ SMONTHNAME1 január
+ SMONTHNAME2 február
+ SMONTHNAME3 marec
+ SMONTHNAME4 apríl
+ SMONTHNAME5 máj
+ SMONTHNAME6 jún
+ SMONTHNAME7 júl
+ SMONTHNAME8 august
+ SMONTHNAME9 september
+ SMONTHNAME10 október
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 máj
+ SABBREVMONTHNAME6 jún
+ SABBREVMONTHNAME7 júl
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 041D ; Swedish - Sweden
+
+ ILANGUAGE 041D
+ SENGLANGUAGE Swedish
+ SABBREVLANGNAME SVE
+ SNATIVELANGNAME Svenska
+
+ ICOUNTRY 46
+ SENGCOUNTRY Sweden
+ SABBREVCTRYNAME SWE
+ SNATIVECTRYNAME Sverige
+
+ IDEFAULTLANGUAGE 041D
+ IDEFAULTCOUNTRY 46
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL SEK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH.mm.ss
+ H.mm.ss
+ 'kl 'H.mm
+ STIME .
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 yyyy-MM-dd
+ yy-MM-dd
+ yyMMdd
+ d/M-yy
+ SDATE -
+ IDATE 2
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 ' den 'd MMMM yyyy
+ ' den 'dd MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 måndag
+ SDAYNAME2 tisdag
+ SDAYNAME3 onsdag
+ SDAYNAME4 torsdag
+ SDAYNAME5 fredag
+ SDAYNAME6 lördag
+ SDAYNAME7 söndag
+
+ SABBREVDAYNAME1 må
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 on
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 fr
+ SABBREVDAYNAME6 lö
+ SABBREVDAYNAME7 sö
+
+ SMONTHNAME1 januari
+ SMONTHNAME2 februari
+ SMONTHNAME3 mars
+ SMONTHNAME4 april
+ SMONTHNAME5 maj
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 augusti
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 maj
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 041F ; Turkish - Turkey
+
+ ILANGUAGE 041F
+ SENGLANGUAGE Turkish
+ SABBREVLANGNAME TRK
+ SNATIVELANGNAME Türkçe
+
+ ICOUNTRY 90
+ SENGCOUNTRY Turkey
+ SABBREVCTRYNAME TUR
+ SNATIVECTRYNAME Türkiye
+
+ IDEFAULTLANGUAGE 041F
+ IDEFAULTCOUNTRY 90
+ IDEFAULTANSICODEPAGE 1254
+ IDEFAULTOEMCODEPAGE 857
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY TL
+ SINTLSYMBOL TRL
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 d/M/yyyy
+ dd/MM/yy
+ yy/MM/dd
+ SDATE /
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 3 d MMMM yyyy, dddd
+ dd MMMM yyyy, dddd
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Pazartesi
+ SDAYNAME2 Sae\x0131
+ SDAYNAME3 \x00c7ar\x015famba
+ SDAYNAME4 per\x015fembe
+ SDAYNAME5 Cuma
+ SDAYNAME6 Cumartesi
+ SDAYNAME7 Pazar
+
+ SABBREVDAYNAME1 Pazartesi
+ SABBREVDAYNAME2 Sae\x0131
+ SABBREVDAYNAME3 \x00c7ar\x015famba
+ SABBREVDAYNAME4 per\x015fembe
+ SABBREVDAYNAME5 Cuma
+ SABBREVDAYNAME6 Cumartesi
+ SABBREVDAYNAME7 Pazar
+
+ SMONTHNAME1 Ocak
+ SMONTHNAME2 \x015eubat
+ SMONTHNAME3 Mart
+ SMONTHNAME4 Nisan
+ SMONTHNAME5 May\x0131s
+ SMONTHNAME6 Haziran
+ SMONTHNAME7 Temmuz
+ SMONTHNAME8 A\x011fustos
+ SMONTHNAME9 Eylül
+ SMONTHNAME10 Ekim
+ SMONTHNAME11 Kas\x0131m
+ SMONTHNAME12 Aral\x0131k
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Ocak
+ SABBREVMONTHNAME2 \x015eubat
+ SABBREVMONTHNAME3 Mart
+ SABBREVMONTHNAME4 Nisan
+ SABBREVMONTHNAME5 May\x0131s
+ SABBREVMONTHNAME6 Haziran
+ SABBREVMONTHNAME7 Temmuz
+ SABBREVMONTHNAME8 A\x011fustos
+ SABBREVMONTHNAME9 Eylül
+ SABBREVMONTHNAME10 Ekim
+ SABBREVMONTHNAME11 Kas\x0131m
+ SABBREVMONTHNAME12 Aral\x0131k
+ SABBREVMONTHNAME13 \x0000
+
+
+ENDLOCALE
+
+
+
+CALENDAR 7
+
+
+ BEGINCALENDAR 1 ; Gregorian (localized)
+
+ SCALENDAR 1
+
+ SERARANGES 0
+
+ SSHORTDATE 1 \x0000
+ SLONGDATE 1 \x0000
+
+ IF_NAMES 0
+
+
+ BEGINCALENDAR 2 ; Gregorian (U.S. English only)
+
+ SCALENDAR 2
+
+ SERARANGES 0
+
+ SSHORTDATE 4 M/d/yy
+ M/d/yyyy
+ MM/dd/yy
+ MM/dd/yyyy
+ SLONGDATE 2 dddd, MMMM dd, yyyy
+ MMMM dd, yyyy
+
+ IF_NAMES 1
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+ BEGINCALENDAR 3 ; Japanese Era - Year of the Emperor
+
+ SCALENDAR 3
+
+ SERARANGES 4 1989\xffff\x337b
+ 1926\xffff\x337c
+ 1912\xffff\x337d
+ 1868\xffff\x337e
+
+ SSHORTDATE 1 ggyyyy/MM/dd
+ SLONGDATE 1 ggyyyy'\x5e74'M'\x6708'd'\x65e5'
+
+ IF_NAMES 0
+
+
+ BEGINCALENDAR 4 ; Taiwan Era - Year of the Republic of China
+
+ SCALENDAR 4
+
+ SERARANGES 1 1912\xffff\x4e2d\x83ef\x6c11\x570b
+
+ SSHORTDATE 1 ggyyyy/MM/dd
+ SLONGDATE 1 ggyyyy MMMM dd
+
+ IF_NAMES 0
+
+
+ BEGINCALENDAR 5 ; Korean - Tangun Era
+
+ SCALENDAR 5
+
+ SERARANGES 1 2333\xffff
+
+ SSHORTDATE 1 yy-MM-dd
+ SLONGDATE 1 yyyy'\x355b' M'\x39da' d'\x3a0e'
+
+ IF_NAMES 0
+
+
+ BEGINCALENDAR 6 ; Hijri - not yet implemented (JDB)
+
+ SCALENDAR 6
+
+ SERARANGES 0
+
+ SSHORTDATE 1 \x0000
+ SLONGDATE 1 \x0000
+
+ IF_NAMES 0
+
+
+ BEGINCALENDAR 7 ; Thai - not yet implemented (JDB)
+
+ SCALENDAR 7
+
+ SERARANGES 1 543\xffff
+
+ SSHORTDATE 1 yyyy/MM/dd
+ SLONGDATE 1 yyyy MMMM dd
+
+ IF_NAMES 0
+
+
+ENDCALENDAR
+ \ No newline at end of file
diff --git a/private/oleauto/src/dispatch/win16/locale.jap b/private/oleauto/src/dispatch/win16/locale.jap
new file mode 100644
index 000000000..105ecc139
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/locale.jap
@@ -0,0 +1,111 @@
+BEGINLOCALE 0411
+
+ ILANGUAGE 0411
+ SENGLANGUAGE Japanese
+ SABBREVLANGNAME JPN
+ SNATIVELANGNAME \x65e5\x672c\x8a9e ;“ú–{Œê/93fa/967b/8cea
+
+ ICOUNTRY 81
+ SENGCOUNTRY Japan
+ SABBREVCTRYNAME JPN
+ SNATIVECTRYNAME \x65e5\x672c ;“ú–{/93fa/967b
+
+ IDEFAULTLANGUAGE 0411
+ IDEFAULTCOUNTRY 81
+ IDEFAULTANSICODEPAGE 932
+ IDEFAULTOEMCODEPAGE 932
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \xffe5 ;/818f
+ SINTLSYMBOL YEN
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT tt h:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ ITIMEMARKPOSN 0
+ S1159 \x5348\x524d ;Œß‘O/8cdf/914f
+ S2359 \x5348\x5f8c ;Χ΋/8cdf/8ce3
+
+ SSHORTDATE yy/MM/dd
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE ' 'yyyy'\x5e74'M'\x6708'd'\x65e5'WW ;”NŒŽ“ú/944e/8c8e/93fa
+ ILDATE 2
+ ICENTURYLONGDATE 1
+ IDAYLZEROLONGDATE 0
+ IMONLZEROLONGDATE 0
+
+ ICALENDARTYPE 0
+ IADDDATEFORMAT 1
+ IOPTIONALCALENDAR 1
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x6708\x66dc\x65e5 ;ŒŽ—j“ú/8c8e/976a/93fa
+ SDAYNAME2 \x706b\x66dc\x65e5 ;‰Î—j“ú/89ce/976a/93fa
+ SDAYNAME3 \x6c34\x66dc\x65e5 ;…—j“ú/9085/976a/93fa
+ SDAYNAME4 \x6728\x66dc\x65e5 ;–Ø—j“ú/96d8/976a/93fa
+ SDAYNAME5 \x91d1\x66dc\x65e5 ;‹à—j“ú/8be0/976a/93fa
+ SDAYNAME6 \x571f\x66dc\x65e5 ;“y—j“ú/9379/976a/93fa
+ SDAYNAME7 \x65e5\x66dc\x65e5 ;“ú—j“ú/93fa/976a/93fa
+
+ SABBREVDAYNAME1 \x6708 ;ŒŽ/8c8e
+ SABBREVDAYNAME2 \x706b ;‰Î/89ce
+ SABBREVDAYNAME3 \x6c34 ;…/9085
+ SABBREVDAYNAME4 \x6728 ;–Ø/96d8
+ SABBREVDAYNAME5 \x91d1 ;‹à/8be0
+ SABBREVDAYNAME6 \x571f ;“y/9379
+ SABBREVDAYNAME7 \x65e5 ;“ú/93fa
+
+ SMONTHNAME1 \xff11\x6708 ;‚PŒŽ/8250/8c8e
+ SMONTHNAME2 \xff12\x6708 ;‚QŒŽ/8251/8c8e
+ SMONTHNAME3 \xff13\x6708 ;‚RŒŽ/8252/8c8e
+ SMONTHNAME4 \xff14\x6708 ;‚SŒŽ/8253/8c8e
+ SMONTHNAME5 \xff15\x6708 ;‚TŒŽ/8254/8c8e
+ SMONTHNAME6 \xff16\x6708 ;‚UŒŽ/8255/8c8e
+ SMONTHNAME7 \xff17\x6708 ;‚VŒŽ/8256/8c8e
+ SMONTHNAME8 \xff18\x6708 ;‚WŒŽ/8257/8c8e
+ SMONTHNAME9 \xff19\x6708 ;‚XŒŽ/8258/8c8e
+ SMONTHNAME10 \xff11\xff10\x6708 ;‚P‚OŒŽ/8250/824f/8c8e
+ SMONTHNAME11 \xff11\xff11\x6708 ;‚P‚PŒŽ/8250/8250/8c8e
+ SMONTHNAME12 \xff11\xff12\x6708 ;‚P‚QŒŽ/8250/8251/8c8e
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 1
+ SABBREVMONTHNAME2 2
+ SABBREVMONTHNAME3 3
+ SABBREVMONTHNAME4 4
+ SABBREVMONTHNAME5 5
+ SABBREVMONTHNAME6 6
+ SABBREVMONTHNAME7 7
+ SABBREVMONTHNAME8 8
+ SABBREVMONTHNAME9 9
+ SABBREVMONTHNAME10 10
+ SABBREVMONTHNAME11 11
+ SABBREVMONTHNAME12 12
+ SABBREVMONTHNAME13 \x0000
diff --git a/private/oleauto/src/dispatch/win16/locale.kor b/private/oleauto/src/dispatch/win16/locale.kor
new file mode 100644
index 000000000..8001134e4
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/locale.kor
@@ -0,0 +1,110 @@
+BEGINLOCALE 0412
+
+ ILANGUAGE 0412
+ SENGLANGUAGE Korean
+ SABBREVLANGNAME KOR
+ SNATIVELANGNAME \x3ca2\x3476\x3971 ;Çѱ¹¾î/C7D1/B1B9/BEEE
+ ICOUNTRY 82
+ SENGCOUNTRY Korea
+ SABBREVCTRYNAME KOR
+ SNATIVECTRYNAME \x35c2\x3ca2\x377b\x3476 ;´ëÇѹα¹/B4EB/C7D1/B9CE/B1B9
+
+ IDEFAULTLANGUAGE 0412
+ IDEFAULTCOUNTRY 82
+ IDEFAULTANSICODEPAGE 949
+ IDEFAULTOEMCODEPAGE 949
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 0
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x20A9 ;\/5C
+ SINTLSYMBOL KRW
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ ITIMEMARKPOSN 0
+ S1159 \x39a1\x3a3b ;¿ÀÀü/BFC0/C0FC
+ S2359 \x39a1\x3cf3 ;¿ÀÈÄ/BFC0/C8C4
+
+ SSHORTDATE yy-MM-dd
+ SDATE -
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE yyyy\x355b M\x39da d\x3a0e ;³â¿ùÀÏ/B3E2/BFF9/C0CF
+ ILDATE 2
+ ICENTURYLONGDATE 1
+ IDAYLZEROLONGDATE 0
+ IMONLZEROLONGDATE 0
+
+ ICALENDARTYPE 0
+ IADDDATEFORMAT 0
+ IOPTIONALCALENDAR 1
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x39da\x39c5\x3a0e ;¿ù¿äÀÏ/BFF9/BFE4/C0CF
+ SDAYNAME2 \x3cdc\x39c5\x3a0e ;È­¿äÀÏ/C8AD/BFE4/C0CF
+ SDAYNAME3 \x38bd\x39c5\x3a0e ;¼ö¿äÀÏ/BCF6/BFE4/C0CF
+ SDAYNAME4 \x3740\x39c5\x3a0e ;¸ñ¿äÀÏ/B8F1/BFE4/C0CF
+ SDAYNAME5 \x349a\x39c5\x3a0e ;±Ý¿äÀÏ/B1DD/BFE4/C0CF
+ SDAYNAME6 \x3bf9\x39c5\x3a0e ;Åä¿äÀÏ/C5E4/BFE4/C0CF
+ SDAYNAME7 \x39da\x39c5\x3a0e ;¿ù¿äÀÏ/BFF9/BFE4/C0CF
+
+ SABBREVDAYNAME1 \x39da ;¿ù/BFF9
+ SABBREVDAYNAME2 \x3cdc ;È­/C8AD
+ SABBREVDAYNAME3 \x38bd ;¼ö/BCF6
+ SABBREVDAYNAME4 \x3740 ;¸ñ/B8F1
+ SABBREVDAYNAME5 \x349a ;±Ý/B1DD
+ SABBREVDAYNAME6 \x3bf9 ;Åä/C5E4
+ SABBREVDAYNAME7 \x39da ;¿ù/BFF9
+
+ SMONTHNAME1 \x0031\x39da ;1¿ù/31/BFF9
+ SMONTHNAME2 \x0032\x39da ;2¿ù/32/BFF9
+ SMONTHNAME3 \x0033\x39da ;3¿ù/33/BFF9
+ SMONTHNAME4 \x0034\x39da ;4¿ù/34/BFF9
+ SMONTHNAME5 \x0035\x39da ;5¿ù/35/BFF9
+ SMONTHNAME6 \x0036\x39da ;6¿ù/36/BFF9
+ SMONTHNAME7 \x0037\x39da ;7¿ù/37/BFF9
+ SMONTHNAME8 \x0038\x39da ;8¿ù/38/BFF9
+ SMONTHNAME9 \x0039\x39da ;9¿ù/39/BFF9
+ SMONTHNAME10 \x0031\x0030\x39da ;10¿ù/31/30/BFF9
+ SMONTHNAME11 \x0031\x0031\x39da ;11¿ù/31/31/BFF9
+ SMONTHNAME12 \x0031\x0032\x39da ;12¿ù/31/32/BFF9
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x0031\x39da ;1¿ù/31/BFF9
+ SABBREVMONTHNAME2 \x0032\x39da ;2¿ù/32/BFF9
+ SABBREVMONTHNAME3 \x0033\x39da ;3¿ù/33/BFF9
+ SABBREVMONTHNAME4 \x0034\x39da ;4¿ù/34/BFF9
+ SABBREVMONTHNAME5 \x0035\x39da ;5¿ù/35/BFF9
+ SABBREVMONTHNAME6 \x0036\x39da ;6¿ù/36/BFF9
+ SABBREVMONTHNAME7 \x0037\x39da ;7¿ù/37/BFF9
+ SABBREVMONTHNAME8 \x0038\x39da ;8¿ù/38/BFF9
+ SABBREVMONTHNAME9 \x0039\x39da ;9¿ù/39/BFF9
+ SABBREVMONTHNAME10 \x0031\x0030\x39da ;10¿ù/31/30/BFF9
+ SABBREVMONTHNAME11 \x0031\x0031\x39da ;11¿ù/31/31/BFF9
+ SABBREVMONTHNAME12 \x0031\x0032\x39da ;12¿ù/31/32/BFF9
+ SABBREVMONTHNAME13 \x0000
diff --git a/private/oleauto/src/dispatch/win16/locale.prc b/private/oleauto/src/dispatch/win16/locale.prc
new file mode 100644
index 000000000..5ddf95f67
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/locale.prc
@@ -0,0 +1,113 @@
+BEGINLOCALE 0804
+
+ ILANGUAGE 0804
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHS
+ SNATIVELANGNAME \x4e2d\x6587 ;ÖÐÎÄ/d6d0/cec4
+
+ ICOUNTRY 086
+ SENGCOUNTRY Peoples' Republic of China
+ SABBREVCTRYNAME CHN
+ SNATIVECTRYNAME \x4e2d\x534e\x4eba\x6c11\x5171\x548c\x56fd
+
+ ;ÖлªÈËÃñ¹²ºÍ¹ú/d6d0/bbaa/c8cb/c3f1/b9b2/bacd/b9fa
+
+ IDEFAULTLANGUAGE 0804
+ IDEFAULTCOUNTRY 086
+ IDEFAULTANSICODEPAGE 936
+ IDEFAULTOEMCODEPAGE 936
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x00a5 ;£¤/a3a4
+ SINTLSYMBOL CNY
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT h:m:s
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ ITIMEMARKPOSN 1
+ S1159 \x4e0a\x5348 ;ÉÏÎç/c9cf/cee7
+ S2359 \x4e0b\x5348 ;ÏÂÎç/cfc2/cee7
+
+ SSHORTDATE yy/M/d
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE dddd, MMMM dd, yyyy
+ ILDATE 2
+ ICENTURYLONGDATE 1
+ IDAYLZEROLONGDATE 0
+ IMONLZEROLONGDATE 0
+
+ ICALENDARTYPE 0
+ IADDDATEFORMAT 0
+ IOPTIONALCALENDAR 1
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00 ;ÐÇÆÚÒ»/d0c7/c6da/d2bb
+ SDAYNAME2 \x661f\x671f\x4e8c ;ÐÇÆÚ¶þ/d0c7/c6da/b6fe
+ SDAYNAME3 \x661f\x671f\x4e09 ;ÐÇÆÚÈý/d0c7/c6da/c8fd
+ SDAYNAME4 \x661f\x671f\x56db ;ÐÇÆÚËÄ/d0c7/c6da/cbc4
+ SDAYNAME5 \x661f\x671f\x4e94 ;ÐÇÆÚÎå/d0c7/c6da/cee5
+ SDAYNAME6 \x661f\x671f\x516d ;ÐÇÆÚÁù/d0c7/c6da/c1f9
+ SDAYNAME7 \x661f\x671f\x65e5 ;ÐÇÆÚÈÕ/d0c7/c6da/c8d5
+
+ SABBREVDAYNAME1 \x0000
+ SABBREVDAYNAME2 \x0000
+ SABBREVDAYNAME3 \x0000
+ SABBREVDAYNAME4 \x0000
+ SABBREVDAYNAME5 \x0000
+ SABBREVDAYNAME6 \x0000
+ SABBREVDAYNAME7 \x0000
+
+ SMONTHNAME1 \x4e00\x6708 ;Ò»ÔÂ /d2bb/d4c2
+ SMONTHNAME2 \x4e8c\x6708 ;¶þÔÂ /b6fe/d4c2
+ SMONTHNAME3 \x4e09\x6708 ;ÈýÔÂ /c8fd/d4c2
+ SMONTHNAME4 \x56db\x6708 ;ËÄÔÂ /cbc4/d4c2
+ SMONTHNAME5 \x4e94\x6708 ;ÎåÔÂ /cee5/d4c2
+ SMONTHNAME6 \x516d\x6708 ;ÁùÔÂ /c1f9/d4c2
+ SMONTHNAME7 \x4e03\x6708 ;ÆßÔÂ /c6df/d4c2
+ SMONTHNAME8 \x516b\x6708 ;°ËÔÂ /b0cb/d4c2
+ SMONTHNAME9 \x4e5d\x6708 ;¾ÅÔ /bec5/d4c2
+ SMONTHNAME10 \x5341\x6708 ;ʮԠ/caae/d4c2
+ SMONTHNAME11 \x5341\x4e00\x6708 ;ʮһÔÂ/caae/d2bb/d4c2
+ SMONTHNAME12 \x5341\x4e8c\x6708 ;Ê®¶þÔÂ/caae/b6fe/d4c2
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x0000
+ SABBREVMONTHNAME2 \x0000
+ SABBREVMONTHNAME3 \x0000
+ SABBREVMONTHNAME4 \x0000
+ SABBREVMONTHNAME5 \x0000
+ SABBREVMONTHNAME6 \x0000
+ SABBREVMONTHNAME7 \x0000
+ SABBREVMONTHNAME8 \x0000
+ SABBREVMONTHNAME9 \x0000
+ SABBREVMONTHNAME10 \x0000
+ SABBREVMONTHNAME11 \x0000
+ SABBREVMONTHNAME12 \x0000
+ SABBREVMONTHNAME13 \x0000
diff --git a/private/oleauto/src/dispatch/win16/locale.twn b/private/oleauto/src/dispatch/win16/locale.twn
new file mode 100644
index 000000000..cba82c1e3
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/locale.twn
@@ -0,0 +1,111 @@
+BEGINLOCALE 0404
+
+ ILANGUAGE 0404
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHT
+ SNATIVELANGNAME \x4e2d\x6587 ;¤¤¤å/a4a4/a4e5
+
+ ICOUNTRY 886
+ SENGCOUNTRY Taiwan
+ SABBREVCTRYNAME TWN
+ SNATIVECTRYNAME \x4e2d\x83ef\x6c11\x570b ;¤¤µØ¥Á°ê/a4a4/b5d8/a5c1/b0ea
+
+ IDEFAULTLANGUAGE 0404
+ IDEFAULTCOUNTRY 886
+ IDEFAULTANSICODEPAGE 950
+ IDEFAULTOEMCODEPAGE 950
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY NT$
+ SINTLSYMBOL TWD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT h:m:s
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ ITIMEMARKPOSN 1
+ S1159 \x4e0a\x5348 ;¤W¤È/a457/a4c8
+ S2359 \x4e0b\x5348 ;¤U¤È/a455/a4c8
+
+ SSHORTDATE yy/M/d
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE dddd' 'yyyy' 'MM' 'dd
+ ILDATE 2
+ ICENTURYLONGDATE 1
+ IDAYLZEROLONGDATE 0
+ IMONLZEROLONGDATE 0
+
+ ICALENDARTYPE 2
+ IADDDATEFORMAT 0
+ IOPTIONALCALENDAR 1
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00 ;¬P´Á¤@/ac50/b4c1/a440
+ SDAYNAME2 \x661f\x671f\x4e8c ;¬P´Á¤G/ac50/b4c1/a447
+ SDAYNAME3 \x661f\x671f\x4e09 ;¬P´Á¤T/ac50/b4c1/a454
+ SDAYNAME4 \x661f\x671f\x56db ;¬P´Á¥|/ac50/b4c1/a57c
+ SDAYNAME5 \x661f\x671f\x4e94 ;¬P´Á¤­/ac50/b4c1/a4ad
+ SDAYNAME6 \x661f\x671f\x516d ;¬P´Á¤»/ac50/b4c1/a4bb
+ SDAYNAME7 \x661f\x671f\x65e5 ;¬P´Á¤é/ac50/b4c1/a4e9
+
+ SABBREVDAYNAME1 \x0000
+ SABBREVDAYNAME2 \x0000
+ SABBREVDAYNAME3 \x0000
+ SABBREVDAYNAME4 \x0000
+ SABBREVDAYNAME5 \x0000
+ SABBREVDAYNAME6 \x0000
+ SABBREVDAYNAME7 \x0000
+
+ SMONTHNAME1 \x4e00\x6708 ;¤@¤ë /a440/a4eb
+ SMONTHNAME2 \x4e8c\x6708 ;¤G¤ë /a447/a4eb
+ SMONTHNAME3 \x4e09\x6708 ;¤T¤ë /a454/a4eb
+ SMONTHNAME4 \x56db\x6708 ;¥|¤ë /a57c/a4eb
+ SMONTHNAME5 \x4e94\x6708 ;¤­¤ë /a4ad/a4eb
+ SMONTHNAME6 \x516d\x6708 ;¤»¤ë /a4bb/a4eb
+ SMONTHNAME7 \x4e03\x6708 ;¤C¤ë /a443/a4eb
+ SMONTHNAME8 \x516b\x6708 ;¤K¤ë /a44b/a4eb
+ SMONTHNAME9 \x4e5d\x6708 ;¤E¤ë /a445/a4eb
+ SMONTHNAME10 \x5341\x6708 ;¤Q¤ë /a451/a4eb
+ SMONTHNAME11 \x5341\x4e00\x6708 ;¤Q¤@¤ë/a451/a440/a4eb
+ SMONTHNAME12 \x5341\x4e8c\x6708 ;¤Q¤G¤ë/a451/a447/a4eb
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x0000
+ SABBREVMONTHNAME2 \x0000
+ SABBREVMONTHNAME3 \x0000
+ SABBREVMONTHNAME4 \x0000
+ SABBREVMONTHNAME5 \x0000
+ SABBREVMONTHNAME6 \x0000
+ SABBREVMONTHNAME7 \x0000
+ SABBREVMONTHNAME8 \x0000
+ SABBREVMONTHNAME9 \x0000
+ SABBREVMONTHNAME10 \x0000
+ SABBREVMONTHNAME11 \x0000
+ SABBREVMONTHNAME12 \x0000
+ SABBREVMONTHNAME13 \x0000
diff --git a/private/oleauto/src/dispatch/win16/locale.txt b/private/oleauto/src/dispatch/win16/locale.txt
new file mode 100644
index 000000000..a54dc1ab5
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/locale.txt
@@ -0,0 +1,4877 @@
+LOCALE 41
+
+BEGINLOCALE 0404 ; Chinese - Taiwan
+
+ ILANGUAGE 0404
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHT
+ SNATIVELANGNAME \x4e2d\x6587
+
+ ICOUNTRY 886
+ SENGCOUNTRY Taiwan
+ SABBREVCTRYNAME TWN
+ SNATIVECTRYNAME \x4e2d\x83ef\x6c11\x570b
+
+ IDEFAULTLANGUAGE 0404
+ IDEFAULTCOUNTRY 886
+ IDEFAULTANSICODEPAGE 950
+ IDEFAULTOEMCODEPAGE 950
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY NT$
+ SINTLSYMBOL TWD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 \x4e0a\x5348
+ S2359 \x4e0b\x5348
+
+ SSHORTDATE 4 yy/M/d
+ yy/MM/dd
+ yyyy/M/d
+ yyyy/MM/dd
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 3 dddd yyyy MMMM dd
+ dddd yyyy MM dd
+ yyyy MM dd
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 4\xffffEra: Year of the Republic of China
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00
+ SDAYNAME2 \x661f\x671f\x4e8c
+ SDAYNAME3 \x661f\x671f\x4e09
+ SDAYNAME4 \x661f\x671f\x56db
+ SDAYNAME5 \x661f\x671f\x4e94
+ SDAYNAME6 \x661f\x671f\x516d
+ SDAYNAME7 \x661f\x671f\x65e5
+
+ SABBREVDAYNAME1 \x661f\x671f\x4e00
+ SABBREVDAYNAME2 \x661f\x671f\x4e8c
+ SABBREVDAYNAME3 \x661f\x671f\x4e09
+ SABBREVDAYNAME4 \x661f\x671f\x56db
+ SABBREVDAYNAME5 \x661f\x671f\x4e94
+ SABBREVDAYNAME6 \x661f\x671f\x516d
+ SABBREVDAYNAME7 \x661f\x671f\x65e5
+
+ SMONTHNAME1 \x4e00\x6708
+ SMONTHNAME2 \x4e8c\x6708
+ SMONTHNAME3 \x4e09\x6708
+ SMONTHNAME4 \x56db\x6708
+ SMONTHNAME5 \x4e94\x6708
+ SMONTHNAME6 \x516d\x6708
+ SMONTHNAME7 \x4e03\x6708
+ SMONTHNAME8 \x516b\x6708
+ SMONTHNAME9 \x4e5d\x6708
+ SMONTHNAME10 \x5341\x6708
+ SMONTHNAME11 \x5341\x4e00\x6708
+ SMONTHNAME12 \x5341\x4e8c\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x4e00\x6708
+ SABBREVMONTHNAME2 \x4e8c\x6708
+ SABBREVMONTHNAME3 \x4e09\x6708
+ SABBREVMONTHNAME4 \x56db\x6708
+ SABBREVMONTHNAME5 \x4e94\x6708
+ SABBREVMONTHNAME6 \x516d\x6708
+ SABBREVMONTHNAME7 \x4e03\x6708
+ SABBREVMONTHNAME8 \x516b\x6708
+ SABBREVMONTHNAME9 \x4e5d\x6708
+ SABBREVMONTHNAME10 \x5341\x6708
+ SABBREVMONTHNAME11 \x5341\x4e00\x6708
+ SABBREVMONTHNAME12 \x5341\x4e8c\x6708
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0804 ; Chinese - PRC
+
+ ILANGUAGE 0804
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHS
+ SNATIVELANGNAME \x4e2d\x6587
+
+ ICOUNTRY 86
+ SENGCOUNTRY Peoples' Republic of China
+ SABBREVCTRYNAME CHN
+ SNATIVECTRYNAME \x4e2d\x534e\x4eba\x6c11\x5171\x548c\x56fd
+
+ IDEFAULTLANGUAGE 0804
+ IDEFAULTCOUNTRY 86
+ IDEFAULTANSICODEPAGE 936
+ IDEFAULTOEMCODEPAGE 936
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x00a5
+ SINTLSYMBOL CNY
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 \x4e0a\x5348
+ S2359 \x4e0b\x5348
+
+ SSHORTDATE 4 yy/M/d
+ yy/MM/dd
+ yyyy/M/d
+ yyyy/MM/dd
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 4 dddd, MMMM d, yyyy
+ MMMM d, yyyy
+ yyyy MM dd
+ dddd yyyy MM dd
+ ILDATE 0
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00
+ SDAYNAME2 \x661f\x671f\x4e8c
+ SDAYNAME3 \x661f\x671f\x4e09
+ SDAYNAME4 \x661f\x671f\x56db
+ SDAYNAME5 \x661f\x671f\x4e94
+ SDAYNAME6 \x661f\x671f\x516d
+ SDAYNAME7 \x661f\x671f\x65e5
+
+ SABBREVDAYNAME1 \x661f\x671f\x4e00
+ SABBREVDAYNAME2 \x661f\x671f\x4e8c
+ SABBREVDAYNAME3 \x661f\x671f\x4e09
+ SABBREVDAYNAME4 \x661f\x671f\x56db
+ SABBREVDAYNAME5 \x661f\x671f\x4e94
+ SABBREVDAYNAME6 \x661f\x671f\x516d
+ SABBREVDAYNAME7 \x661f\x671f\x65e5
+
+ SMONTHNAME1 \x4e00\x6708
+ SMONTHNAME2 \x4e8c\x6708
+ SMONTHNAME3 \x4e09\x6708
+ SMONTHNAME4 \x56db\x6708
+ SMONTHNAME5 \x4e94\x6708
+ SMONTHNAME6 \x516d\x6708
+ SMONTHNAME7 \x4e03\x6708
+ SMONTHNAME8 \x516b\x6708
+ SMONTHNAME9 \x4e5d\x6708
+ SMONTHNAME10 \x5341\x6708
+ SMONTHNAME11 \x5341\x4e00\x6708
+ SMONTHNAME12 \x5341\x4e8c\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x4e00\x6708
+ SABBREVMONTHNAME2 \x4e8c\x6708
+ SABBREVMONTHNAME3 \x4e09\x6708
+ SABBREVMONTHNAME4 \x56db\x6708
+ SABBREVMONTHNAME5 \x4e94\x6708
+ SABBREVMONTHNAME6 \x516d\x6708
+ SABBREVMONTHNAME7 \x4e03\x6708
+ SABBREVMONTHNAME8 \x516b\x6708
+ SABBREVMONTHNAME9 \x4e5d\x6708
+ SABBREVMONTHNAME10 \x5341\x6708
+ SABBREVMONTHNAME11 \x5341\x4e00\x6708
+ SABBREVMONTHNAME12 \x5341\x4e8c\x6708
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0c04 ; Chinese - Hong Kong
+
+ ILANGUAGE 0c04
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHH
+ SNATIVELANGNAME \x4e2d\x6587
+
+ ICOUNTRY 852
+ SENGCOUNTRY Hong Kong
+ SABBREVCTRYNAME HKG
+ SNATIVECTRYNAME \x9999\x6e2f
+
+ IDEFAULTLANGUAGE 0c04
+ IDEFAULTCOUNTRY 852
+ IDEFAULTANSICODEPAGE 950
+ IDEFAULTOEMCODEPAGE 950
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY HK$
+ SINTLSYMBOL HKD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 0
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 6 d/M/yy
+ dd/MM/yy
+ yy/M/d
+ yy/MM/dd
+ yyyy/M/d
+ yyyy/MM/dd
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 4 dddd, d MMMM, yyyy
+ d MMMM, yyyy
+ dddd yyyy MM dd
+ yyyy MM dd
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00
+ SDAYNAME2 \x661f\x671f\x4e8c
+ SDAYNAME3 \x661f\x671f\x4e09
+ SDAYNAME4 \x661f\x671f\x56db
+ SDAYNAME5 \x661f\x671f\x4e94
+ SDAYNAME6 \x661f\x671f\x516d
+ SDAYNAME7 \x661f\x671f\x65e5
+
+ SABBREVDAYNAME1 \x661f\x671f\x4e00
+ SABBREVDAYNAME2 \x661f\x671f\x4e8c
+ SABBREVDAYNAME3 \x661f\x671f\x4e09
+ SABBREVDAYNAME4 \x661f\x671f\x56db
+ SABBREVDAYNAME5 \x661f\x671f\x4e94
+ SABBREVDAYNAME6 \x661f\x671f\x516d
+ SABBREVDAYNAME7 \x661f\x671f\x65e5
+
+ SMONTHNAME1 \x4e00\x6708
+ SMONTHNAME2 \x4e8c\x6708
+ SMONTHNAME3 \x4e09\x6708
+ SMONTHNAME4 \x56db\x6708
+ SMONTHNAME5 \x4e94\x6708
+ SMONTHNAME6 \x516d\x6708
+ SMONTHNAME7 \x4e03\x6708
+ SMONTHNAME8 \x516b\x6708
+ SMONTHNAME9 \x4e5d\x6708
+ SMONTHNAME10 \x5341\x6708
+ SMONTHNAME11 \x5341\x4e00\x6708
+ SMONTHNAME12 \x5341\x4e8c\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x4e00\x6708
+ SABBREVMONTHNAME2 \x4e8c\x6708
+ SABBREVMONTHNAME3 \x4e09\x6708
+ SABBREVMONTHNAME4 \x56db\x6708
+ SABBREVMONTHNAME5 \x4e94\x6708
+ SABBREVMONTHNAME6 \x516d\x6708
+ SABBREVMONTHNAME7 \x4e03\x6708
+ SABBREVMONTHNAME8 \x516b\x6708
+ SABBREVMONTHNAME9 \x4e5d\x6708
+ SABBREVMONTHNAME10 \x5341\x6708
+ SABBREVMONTHNAME11 \x5341\x4e00\x6708
+ SABBREVMONTHNAME12 \x5341\x4e8c\x6708
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 1004 ; Chinese - Singapore
+
+ ILANGUAGE 1004
+ SENGLANGUAGE Chinese
+ SABBREVLANGNAME CHI
+ SNATIVELANGNAME \x4e2d\x6587
+
+ ICOUNTRY 65
+ SENGCOUNTRY Singapore
+ SABBREVCTRYNAME SGP
+ SNATIVECTRYNAME \x65b0\x52a0\x5761
+
+ IDEFAULTLANGUAGE 1004
+ IDEFAULTCOUNTRY 65
+ IDEFAULTANSICODEPAGE 936
+ IDEFAULTOEMCODEPAGE 936
+
+ SLIST ,
+ IMEASURE 1
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL SGD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 0
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 AM
+ S2359 PM
+
+ SSHORTDATE 6 d/M/yy
+ dd/MM/yy
+ yy/M/d
+ yy/MM/dd
+ yyyy/M/d
+ yyyy/MM/dd
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 4 dddd, d MMMM, yyyy
+ d MMMM, yyyy
+ dddd yyyy MM dd
+ yyyy MM dd
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x661f\x671f\x4e00
+ SDAYNAME2 \x661f\x671f\x4e8c
+ SDAYNAME3 \x661f\x671f\x4e09
+ SDAYNAME4 \x661f\x671f\x56db
+ SDAYNAME5 \x661f\x671f\x4e94
+ SDAYNAME6 \x661f\x671f\x516d
+ SDAYNAME7 \x661f\x671f\x65e5
+
+ SABBREVDAYNAME1 \x661f\x671f\x4e00
+ SABBREVDAYNAME2 \x661f\x671f\x4e8c
+ SABBREVDAYNAME3 \x661f\x671f\x4e09
+ SABBREVDAYNAME4 \x661f\x671f\x56db
+ SABBREVDAYNAME5 \x661f\x671f\x4e94
+ SABBREVDAYNAME6 \x661f\x671f\x516d
+ SABBREVDAYNAME7 \x661f\x671f\x65e5
+
+ SMONTHNAME1 \x4e00\x6708
+ SMONTHNAME2 \x4e8c\x6708
+ SMONTHNAME3 \x4e09\x6708
+ SMONTHNAME4 \x56db\x6708
+ SMONTHNAME5 \x4e94\x6708
+ SMONTHNAME6 \x516d\x6708
+ SMONTHNAME7 \x4e03\x6708
+ SMONTHNAME8 \x516b\x6708
+ SMONTHNAME9 \x4e5d\x6708
+ SMONTHNAME10 \x5341\x6708
+ SMONTHNAME11 \x5341\x4e00\x6708
+ SMONTHNAME12 \x5341\x4e8c\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x4e00\x6708
+ SABBREVMONTHNAME2 \x4e8c\x6708
+ SABBREVMONTHNAME3 \x4e09\x6708
+ SABBREVMONTHNAME4 \x56db\x6708
+ SABBREVMONTHNAME5 \x4e94\x6708
+ SABBREVMONTHNAME6 \x516d\x6708
+ SABBREVMONTHNAME7 \x4e03\x6708
+ SABBREVMONTHNAME8 \x516b\x6708
+ SABBREVMONTHNAME9 \x4e5d\x6708
+ SABBREVMONTHNAME10 \x5341\x6708
+ SABBREVMONTHNAME11 \x5341\x4e00\x6708
+ SABBREVMONTHNAME12 \x5341\x4e8c\x6708
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0405 ; Czech - Czech Republic
+
+ ILANGUAGE 0405
+ SENGLANGUAGE Czech
+ SABBREVLANGNAME CSY
+ SNATIVELANGNAME \x010cesk\x00fd
+
+ ICOUNTRY 42
+ SENGCOUNTRY Czech Republic
+ SABBREVCTRYNAME CZK
+ SNATIVECTRYNAME \x010cesk\x00e1\x00a0republika
+
+ IDEFAULTLANGUAGE 0405
+ IDEFAULTCOUNTRY 42
+ IDEFAULTANSICODEPAGE 1250
+ IDEFAULTOEMCODEPAGE 852
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY K\x010d
+ SINTLSYMBOL CZK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH.mm.ss
+ H.mm.ss
+ HH:mm:ss
+ H:mm:ss
+ STIME .
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd.MM.yyyy
+ dd-MM-yy
+ yyyy-MM-dd
+ yy-MM-dd
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 pon\x00d4\x011bl\x00ed
+ SDAYNAME2 \x00fater\x00fd
+ SDAYNAME3 st\x0159eda
+ SDAYNAME4 \x010dtvrtek
+ SDAYNAME5 pátek
+ SDAYNAME6 sobota
+ SDAYNAME7 ned\x0159le
+
+ SABBREVDAYNAME1 po
+ SABBREVDAYNAME2 út
+ SABBREVDAYNAME3 st
+ SABBREVDAYNAME4 \x010dt
+ SABBREVDAYNAME5 pá
+ SABBREVDAYNAME6 so
+ SABBREVDAYNAME7 ne
+
+ SMONTHNAME1 leden
+ SMONTHNAME2 únor
+ SMONTHNAME3 b\x0159ezen
+ SMONTHNAME4 duben
+ SMONTHNAME5 kv\x011bten
+ SMONTHNAME6 \x010derven
+ SMONTHNAME7 \x010dervenec
+ SMONTHNAME8 srpen
+ SMONTHNAME9 z\x00e1\x0159\x00ed
+ SMONTHNAME10 \x0159\x00edjen
+ SMONTHNAME11 listopad
+ SMONTHNAME12 prosinec
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 led
+ SABBREVMONTHNAME2 únor
+ SABBREVMONTHNAME3 b\x0159ez
+ SABBREVMONTHNAME4 dub
+ SABBREVMONTHNAME5 kv\x011bt
+ SABBREVMONTHNAME6 \x010derv
+ SABBREVMONTHNAME7 \x010derc
+ SABBREVMONTHNAME8 srp
+ SABBREVMONTHNAME9 z\x00e1\x0159
+ SABBREVMONTHNAME10 \x0159\x00edj
+ SABBREVMONTHNAME11 list
+ SABBREVMONTHNAME12 pros
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0406 ; Danish - Denmark
+
+ ILANGUAGE 0406
+ SENGLANGUAGE Danish
+ SABBREVLANGNAME DAN
+ SNATIVELANGNAME Dansk
+
+ ICOUNTRY 45
+ SENGCOUNTRY Denmark
+ SABBREVCTRYNAME DNK
+ SNATIVECTRYNAME Danmark
+
+ IDEFAULTLANGUAGE 0406
+ IDEFAULTCOUNTRY 45
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL DKK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 12
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH.mm.ss
+ H.mm.ss
+ HH:mm
+ STIME .
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd-MM-yy
+ yyyy-MM-dd
+ yyyy MM dd
+ dd/M-yy
+ SDATE -
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 mandag
+ SDAYNAME2 tirsdag
+ SDAYNAME3 onsdag
+ SDAYNAME4 torsdag
+ SDAYNAME5 fredag
+ SDAYNAME6 lørdag
+ SDAYNAME7 søndag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 on
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 fr
+ SABBREVDAYNAME6 lø
+ SABBREVDAYNAME7 sø
+
+ SMONTHNAME1 januar
+ SMONTHNAME2 februar
+ SMONTHNAME3 marts
+ SMONTHNAME4 april
+ SMONTHNAME5 maj
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 august
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 maj
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0407 ; German - Germany
+
+ ILANGUAGE 0407
+ SENGLANGUAGE German
+ SABBREVLANGNAME DEU
+ SNATIVELANGNAME Deutsch
+
+ ICOUNTRY 49
+ SENGCOUNTRY Germany
+ SABBREVCTRYNAME DEU
+ SNATIVECTRYNAME Deutschland
+
+ IDEFAULTLANGUAGE 0407
+ IDEFAULTCOUNTRY 49
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY DM
+ SINTLSYMBOL DEM
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ H.mm
+ H.mm' Uhr '
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd.MM.yy
+ d.MM.yy
+ d.M.yy
+ d.M.yyyy
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd, d. MMMM yyyy
+ d. MMMM yyyy
+ d. MMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorianischer Kalender
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Montag
+ SDAYNAME2 Dienstag
+ SDAYNAME3 Mittwoch
+ SDAYNAME4 Donnerstag
+ SDAYNAME5 Freitag
+ SDAYNAME6 Samstag
+ SDAYNAME7 Sonntag
+
+ SABBREVDAYNAME1 Mo
+ SABBREVDAYNAME2 Di
+ SABBREVDAYNAME3 Mi
+ SABBREVDAYNAME4 Do
+ SABBREVDAYNAME5 Fr
+ SABBREVDAYNAME6 Sa
+ SABBREVDAYNAME7 So
+
+ SMONTHNAME1 Januar
+ SMONTHNAME2 Februar
+ SMONTHNAME3 März
+ SMONTHNAME4 April
+ SMONTHNAME5 Mai
+ SMONTHNAME6 Juni
+ SMONTHNAME7 Juli
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 Oktober
+ SMONTHNAME11 November
+ SMONTHNAME12 Dezember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mär
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 Mai
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Okt
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0807 ; German - Switzerland
+
+ ILANGUAGE 0807
+ SENGLANGUAGE German
+ SABBREVLANGNAME DES
+ SNATIVELANGNAME Deutsch
+
+ ICOUNTRY 41
+ SENGCOUNTRY Switzerland
+ SABBREVCTRYNAME CHE
+ SNATIVECTRYNAME Schweiz
+
+ IDEFAULTLANGUAGE 0807
+ IDEFAULTCOUNTRY 41
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND '
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY SFr.
+ SINTLSYMBOL CHF
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP '
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 5 HH:mm:ss
+ H:mm:ss
+ H.mm' h'
+ HH.mm' h'
+ H.mm' Uhr'
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 dd.MM.yyyy
+ dd.MM.yy
+ d.MM.yy
+ dd. M. yy
+ d.M.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd, d. MMMM yyyy
+ d. MMMM yyyy
+ d. MMM yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorianischer Kalender
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Montag
+ SDAYNAME2 Dienstag
+ SDAYNAME3 Mittwoch
+ SDAYNAME4 Donnerstag
+ SDAYNAME5 Freitag
+ SDAYNAME6 Samstag
+ SDAYNAME7 Sonntag
+
+ SABBREVDAYNAME1 Mo
+ SABBREVDAYNAME2 Di
+ SABBREVDAYNAME3 Mi
+ SABBREVDAYNAME4 Do
+ SABBREVDAYNAME5 Fr
+ SABBREVDAYNAME6 Sa
+ SABBREVDAYNAME7 So
+
+ SMONTHNAME1 Januar
+ SMONTHNAME2 Februar
+ SMONTHNAME3 März
+ SMONTHNAME4 April
+ SMONTHNAME5 Mai
+ SMONTHNAME6 Juni
+ SMONTHNAME7 Juli
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 Oktober
+ SMONTHNAME11 November
+ SMONTHNAME12 Dezember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mär
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 Mai
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Okt
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0c07 ; German - Austria
+
+ ILANGUAGE 0c07
+ SENGLANGUAGE German
+ SABBREVLANGNAME DEA
+ SNATIVELANGNAME Deutsch
+
+ ICOUNTRY 43
+ SENGCOUNTRY Austria
+ SABBREVCTRYNAME AUT
+ SNATIVECTRYNAME Österreich
+
+ IDEFAULTLANGUAGE 0c07
+ IDEFAULTCOUNTRY 43
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY S
+ SINTLSYMBOL ATS
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 9
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ HH:mm
+ HH:mm' Uhr'
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 dd.MM.yy
+ dd.M.yyyy
+ yyMMdd
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd, dd. MMMM yyyy
+ d.MMMM yyyy
+ d.MMMyyyy
+ d MMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorianischer Kalender
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Montag
+ SDAYNAME2 Dienstag
+ SDAYNAME3 Mittwoch
+ SDAYNAME4 Donnerstag
+ SDAYNAME5 Freitag
+ SDAYNAME6 Samstag
+ SDAYNAME7 Sonntag
+
+ SABBREVDAYNAME1 Mo
+ SABBREVDAYNAME2 Di
+ SABBREVDAYNAME3 Mi
+ SABBREVDAYNAME4 Do
+ SABBREVDAYNAME5 Fr
+ SABBREVDAYNAME6 Sa
+ SABBREVDAYNAME7 So
+
+ SMONTHNAME1 Januar
+ SMONTHNAME2 Februar
+ SMONTHNAME3 März
+ SMONTHNAME4 April
+ SMONTHNAME5 Mai
+ SMONTHNAME6 Juni
+ SMONTHNAME7 Juli
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 Oktober
+ SMONTHNAME11 November
+ SMONTHNAME12 Dezember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mär
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 Mai
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Okt
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0408 ; Greek - Greece
+
+ ILANGUAGE 0408
+ SENGLANGUAGE Greek
+ SABBREVLANGNAME ELL
+ SNATIVELANGNAME \x0395\x03bb\x03bb\x03b7\x03bd\x03b9\x03ba\x03ac
+
+ ICOUNTRY 30
+ SENGCOUNTRY Greece
+ SABBREVCTRYNAME GRC
+ SNATIVECTRYNAME \x0395\x03bb\x03bb\x03ac\x03b4\x03b1
+
+ IDEFAULTLANGUAGE 0408
+ IDEFAULTCOUNTRY 30
+ IDEFAULTANSICODEPAGE 1253
+ IDEFAULTOEMCODEPAGE 737
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 0
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x03b4\x03c1\x03c7
+ SINTLSYMBOL GRD
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 3
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 h:mm:ss tt
+ hh:mm:ss tt
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 \x03c0\x03bc
+ S2359 \x03bc\x03bc
+
+ SSHORTDATE 4 d/M/yyyy
+ dd/MM/yyyy
+ d/M/yy
+ dd/MM/yy
+ SDATE /
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 2 dddd, d MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x0394\x03b5\x03c5\x03c4\x03ad\x03c1\x03b1
+ SDAYNAME2 \x03a4\x03c1\x03af\x03c4\x03b7
+ SDAYNAME3 \x03a4\x03b5\x03c4\x03ac\x03c1\x03c4\x03b7
+ SDAYNAME4 \x03a0\x03ad\x03bc\x03c0\x03c4\x03b7
+ SDAYNAME5 \x03a0\x03b1\x03c1\x03b1\x03c3\x03ba\x03b5\x03c5\x03ae
+ SDAYNAME6 \x03a3\x03ac\x03b2\x03b2\x03b1\x03c4\x03bf
+ SDAYNAME7 \x039a\x03c5\x03c1\x03b9\x03b1\x03ba\x03ae
+
+ SABBREVDAYNAME1 \x0394\x03b5\x03c5
+ SABBREVDAYNAME2 \x03a4\x03c1\x03b9
+ SABBREVDAYNAME3 \x03a4\x03b5\x03c4
+ SABBREVDAYNAME4 \x03a0\x03b5\x03bc
+ SABBREVDAYNAME5 \x03a0\x03b1\x03c1
+ SABBREVDAYNAME6 \x03a3\x03b1\x03b2
+ SABBREVDAYNAME7 \x039a\x03c5\x03c1
+
+ SMONTHNAME1 \x0399\x03b1\x03bd\x03bf\x03c5\x03b1\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME2 \x03a6\x03b5\x03b2\x03c1\x03bf\x03c5\x03b1\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME3 \x039c\x03b1\x03c1\x03c4\x03af\x03bf\x03c5
+ SMONTHNAME4 \x0391\x03c0\x03c1\x03b9\x03bb\x03af\x03bf\x03c5
+ SMONTHNAME5 \x039c\x03b1\x0390\x03bf\x03c5
+ SMONTHNAME6 \x0399\x03bf\x03c5\x03bd\x03af\x03bf\x03c5
+ SMONTHNAME7 \x0399\x03bf\x03c5\x03bb\x03af\x03bf\x03c5
+ SMONTHNAME8 \x0391\x03c5\x03b3\x03bf\x03cd\x03c3\x03c4\x03bf\x03c5
+ SMONTHNAME9 \x03a3\x03b5\x03c0\x03c4\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME10 \x039f\x03ba\x03c4\x03c9\x03b2\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME11 \x039d\x03bf\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME12 \x0394\x03b5\x03ba\x03b5\x03bc\x03b2\x03c1\x03af\x03bf\x03c5
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x0399\x03b1\x03bd
+ SABBREVMONTHNAME2 \x03a6\x03b5\x03b2
+ SABBREVMONTHNAME3 \x039c\x03b1\x03c1
+ SABBREVMONTHNAME4 \x0391\x03c0\x03c1
+ SABBREVMONTHNAME5 \x039c\x03b1\x03ca
+ SABBREVMONTHNAME6 \x0399\x03bf\x03c5\x03bd
+ SABBREVMONTHNAME7 \x0399\x03bf\x03c5\x03bb
+ SABBREVMONTHNAME8 \x0391\x03c5\x03b3
+ SABBREVMONTHNAME9 \x03a3\x03b5\x03c0
+ SABBREVMONTHNAME10 \x039f\x03ba\x03c4
+ SABBREVMONTHNAME11 \x039d\x03bf\x03b5
+ SABBREVMONTHNAME12 \x0394\x03b5\x03ba
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0409 ; English - United States
+
+ ILANGUAGE 0409
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENU
+ SNATIVELANGNAME English
+
+ ICOUNTRY 1
+ SENGCOUNTRY United States
+ SABBREVCTRYNAME USA
+ SNATIVECTRYNAME United States
+
+ IDEFAULTLANGUAGE 0409
+ IDEFAULTCOUNTRY 1
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 437
+
+ SLIST ,
+ IMEASURE 1
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL USD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 h:mm:ss tt
+ hh:mm:ss tt
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 AM
+ S2359 PM
+
+ SSHORTDATE 6 M/d/yy
+ M/d/yyyy
+ MM/dd/yy
+ MM/dd/yyyy
+ yy/MM/dd
+ dd-MMM-yy
+ SDATE /
+ IDATE 0
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 4 dddd, MMMM dd, yyyy
+ MMMM dd, yyyy
+ dddd, dd MMMM, yyyy
+ dd MMMM, yyyy
+ ILDATE 0
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0809 ; English - United Kingdom
+
+ ILANGUAGE 0809
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENG
+ SNATIVELANGNAME English
+
+ ICOUNTRY 44
+ SENGCOUNTRY United Kingdom
+ SABBREVCTRYNAME GBR
+ SNATIVECTRYNAME England
+
+ IDEFAULTLANGUAGE 0809
+ IDEFAULTCOUNTRY 44
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY £
+ SINTLSYMBOL GBP
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ d/M/yy
+ d.M.yy
+ ddMMyy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 dd MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0c09 ; English - Australia
+
+ ILANGUAGE 0c09
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENA
+ SNATIVELANGNAME English
+
+ ICOUNTRY 61
+ SENGCOUNTRY Australia
+ SABBREVCTRYNAME AUS
+ SNATIVECTRYNAME Australia
+
+ IDEFAULTLANGUAGE 0c09
+ IDEFAULTCOUNTRY 61
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL AUD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 d/MM/yy
+ d/M/yy
+ dd/MM/yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd, d MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 1009 ; English - Canada
+
+ ILANGUAGE 1009
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENC
+ SNATIVELANGNAME English
+
+ ICOUNTRY 2
+ SENGCOUNTRY Canada
+ SABBREVCTRYNAME CAN
+ SNATIVECTRYNAME Canada
+
+ IDEFAULTLANGUAGE 1009
+ IDEFAULTCOUNTRY 2
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL CAD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ d/M/yy
+ yy-MM-dd
+ m/dd/yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 MMMM d, yyyy
+ d-MMM-yy
+ ILDATE 0
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 1409 ; English - New Zealand
+
+ ILANGUAGE 1409
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENZ
+ SNATIVELANGNAME English
+
+ ICOUNTRY 64
+ SENGCOUNTRY New Zealand
+ SABBREVCTRYNAME NZL
+ SNATIVECTRYNAME New Zealand
+
+ IDEFAULTLANGUAGE 1409
+ IDEFAULTCOUNTRY 64
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL NZD
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 d/MM/yy
+ dd/MM/yy
+ d.MM.yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd, d MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 1809 ; English - Ireland
+
+ ILANGUAGE 1809
+ SENGLANGUAGE English
+ SABBREVLANGNAME ENI
+ SNATIVELANGNAME English
+
+ ICOUNTRY 353
+ SENGCOUNTRY Ireland
+ SABBREVCTRYNAME IRL
+ SNATIVECTRYNAME Eire
+
+ IDEFAULTLANGUAGE 1809
+ IDEFAULTCOUNTRY 353
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY IR£
+ SINTLSYMBOL IRP
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ d/M/yy
+ d.M.yy
+ ddMMyy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 dd MMMM yyyy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040a ; Spanish - Spain (Traditional Sort)
+
+ ILANGUAGE 040a
+ SENGLANGUAGE Spanish - Traditional Sort
+ SABBREVLANGNAME ESP
+ SNATIVELANGNAME Español
+
+ ICOUNTRY 34
+ SENGCOUNTRY Spain
+ SABBREVCTRYNAME ESP
+ SNATIVECTRYNAME España
+
+ IDEFAULTLANGUAGE 040a
+ IDEFAULTCOUNTRY 34
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Pts
+ SINTLSYMBOL ESP
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 0
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 H:mm:ss
+ HH:mm:ss
+ HH:mm
+ HH'H'mm'''
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d/MM/yy
+ d/M/yy
+ dd-MM-yy
+ dd.MM.yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunes
+ SDAYNAME2 martes
+ SDAYNAME3 miércoles
+ SDAYNAME4 jueves
+ SDAYNAME5 viernes
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mié
+ SABBREVDAYNAME4 jue
+ SABBREVDAYNAME5 vie
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 enero
+ SMONTHNAME2 febrero
+ SMONTHNAME3 marzo
+ SMONTHNAME4 abril
+ SMONTHNAME5 mayo
+ SMONTHNAME6 junio
+ SMONTHNAME7 julio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 septiembre
+ SMONTHNAME10 octubre
+ SMONTHNAME11 noviembre
+ SMONTHNAME12 diciembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 ene
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 may
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 oct
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 080a ; Spanish - Mexico
+
+ ILANGUAGE 080a
+ SENGLANGUAGE Spanish
+ SABBREVLANGNAME ESM
+ SNATIVELANGNAME Español
+
+ ICOUNTRY 52
+ SENGCOUNTRY Mexico
+ SABBREVCTRYNAME MEX
+ SNATIVECTRYNAME México
+
+ IDEFAULTLANGUAGE 080a
+ IDEFAULTCOUNTRY 52
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY N$
+ SINTLSYMBOL MXP
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 0
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 h:mm:ss tt
+ hh:mm:ss tt
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 AM
+ S2359 PM
+
+ SSHORTDATE 4 d/MM/yy
+ d/M/yy
+ dd/MM/yy
+ dd-MM-yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunes
+ SDAYNAME2 martes
+ SDAYNAME3 miércoles
+ SDAYNAME4 jueves
+ SDAYNAME5 viernes
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mié
+ SABBREVDAYNAME4 jue
+ SABBREVDAYNAME5 vie
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 enero
+ SMONTHNAME2 febrero
+ SMONTHNAME3 marzo
+ SMONTHNAME4 abril
+ SMONTHNAME5 mayo
+ SMONTHNAME6 junio
+ SMONTHNAME7 julio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 septiembre
+ SMONTHNAME10 octubre
+ SMONTHNAME11 noviembre
+ SMONTHNAME12 diciembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 ene
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 may
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 oct
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0c0a ; Spanish - Spain (Modern Sort)
+
+ ILANGUAGE 0c0a
+ SENGLANGUAGE Spanish - Modern Sort
+ SABBREVLANGNAME ESN
+ SNATIVELANGNAME Español
+
+ ICOUNTRY 34
+ SENGCOUNTRY Spain
+ SABBREVCTRYNAME ESP
+ SNATIVECTRYNAME España
+
+ IDEFAULTLANGUAGE 0c0a
+ IDEFAULTCOUNTRY 34
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Pts
+ SINTLSYMBOL ESP
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 0
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 H:mm:ss
+ HH:mm:ss
+ HH:mm
+ HH'H'mm'''
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d/MM/yy
+ dd/MM/yy
+ dd-MM-yy
+ dd.MM.yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunes
+ SDAYNAME2 martes
+ SDAYNAME3 miércoles
+ SDAYNAME4 jueves
+ SDAYNAME5 viernes
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mié
+ SABBREVDAYNAME4 jue
+ SABBREVDAYNAME5 vie
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 enero
+ SMONTHNAME2 febrero
+ SMONTHNAME3 marzo
+ SMONTHNAME4 abril
+ SMONTHNAME5 mayo
+ SMONTHNAME6 junio
+ SMONTHNAME7 julio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 septiembre
+ SMONTHNAME10 octubre
+ SMONTHNAME11 noviembre
+ SMONTHNAME12 diciembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 ene
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 may
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 oct
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040b ; Finnish - Finland
+
+ ILANGUAGE 040b
+ SENGLANGUAGE Finnish
+ SABBREVLANGNAME FIN
+ SNATIVELANGNAME suomi
+
+ ICOUNTRY 358
+ SENGCOUNTRY Finland
+ SABBREVCTRYNAME FIN
+ SNATIVECTRYNAME Suomi
+
+ IDEFAULTLANGUAGE 040b
+ IDEFAULTCOUNTRY 358
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY mk
+ SINTLSYMBOL FIM
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 H.mm.ss
+ HH.mm.ss
+ H.mm
+ STIME .
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d.M.yyyy
+ dd.MM.yyyy
+ d.M.yy
+ yyyy-MM-dd
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 2 d. MMMM'ta 'yyyy
+ dd. MMMM'ta 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 maanantai
+ SDAYNAME2 tiistai
+ SDAYNAME3 keskiviikko
+ SDAYNAME4 torstai
+ SDAYNAME5 perjantai
+ SDAYNAME6 lauantai
+ SDAYNAME7 sunnuntai
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 ke
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 pe
+ SABBREVDAYNAME6 la
+ SABBREVDAYNAME7 su
+
+ SMONTHNAME1 tammikuu
+ SMONTHNAME2 helmikuu
+ SMONTHNAME3 maaliskuu
+ SMONTHNAME4 huhtikuu
+ SMONTHNAME5 toukokuu
+ SMONTHNAME6 kesäkuu
+ SMONTHNAME7 heinäkuu
+ SMONTHNAME8 elokuu
+ SMONTHNAME9 syyskuu
+ SMONTHNAME10 lokakuu
+ SMONTHNAME11 marraskuu
+ SMONTHNAME12 joulukuu
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 tammi
+ SABBREVMONTHNAME2 helmi
+ SABBREVMONTHNAME3 maalis
+ SABBREVMONTHNAME4 huhti
+ SABBREVMONTHNAME5 touko
+ SABBREVMONTHNAME6 kesä
+ SABBREVMONTHNAME7 heinä
+ SABBREVMONTHNAME8 elo
+ SABBREVMONTHNAME9 syys
+ SABBREVMONTHNAME10 loka
+ SABBREVMONTHNAME11 marras
+ SABBREVMONTHNAME12 joulu
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040c ; French - France
+
+ ILANGUAGE 040c
+ SENGLANGUAGE French
+ SABBREVLANGNAME FRA
+ SNATIVELANGNAME français
+
+ ICOUNTRY 33
+ SENGCOUNTRY France
+ SABBREVCTRYNAME FRA
+ SNATIVECTRYNAME France
+
+ IDEFAULTLANGUAGE 040c
+ IDEFAULTCOUNTRY 33
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY F
+ SINTLSYMBOL FRF
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ HH.mm
+ HH' h 'mm
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ dd.MM.yy
+ dd-MM-yy
+ dd/MM/yyyy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd d MMMM yyyy
+ d MMM yy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lundi
+ SDAYNAME2 mardi
+ SDAYNAME3 mercredi
+ SDAYNAME4 jeudi
+ SDAYNAME5 vendredi
+ SDAYNAME6 samedi
+ SDAYNAME7 dimanche
+
+ SABBREVDAYNAME1 lun.
+ SABBREVDAYNAME2 mar.
+ SABBREVDAYNAME3 mer.
+ SABBREVDAYNAME4 jeu.
+ SABBREVDAYNAME5 ven.
+ SABBREVDAYNAME6 sam.
+ SABBREVDAYNAME7 dim.
+
+ SMONTHNAME1 janvier
+ SMONTHNAME2 février
+ SMONTHNAME3 mars
+ SMONTHNAME4 avril
+ SMONTHNAME5 mai
+ SMONTHNAME6 juin
+ SMONTHNAME7 juillet
+ SMONTHNAME8 août
+ SMONTHNAME9 septembre
+ SMONTHNAME10 octobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 décembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 janv.
+ SABBREVMONTHNAME2 févr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 avr.
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 juin
+ SABBREVMONTHNAME7 juil.
+ SABBREVMONTHNAME8 août
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 oct.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 déc.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 080c ; French - Belgium
+
+ ILANGUAGE 080c
+ SENGLANGUAGE French
+ SABBREVLANGNAME FRB
+ SNATIVELANGNAME français
+
+ ICOUNTRY 32
+ SENGCOUNTRY Belgium
+ SABBREVCTRYNAME BEL
+ SNATIVECTRYNAME Belgique
+
+ IDEFAULTLANGUAGE 080c
+ IDEFAULTCOUNTRY 32
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY FB
+ SINTLSYMBOL BEF
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 5 H:mm:ss
+ HH:mm:ss
+ H.mm
+ H' h 'mm
+ H' h 'm' min 's' s '
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d/MM/yy
+ dd.MM.yy
+ yy/mm/dd
+ dd-MM-yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd d MMMM yyyy
+ d MMMM yyyy
+ dd-MMM-yy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lundi
+ SDAYNAME2 mardi
+ SDAYNAME3 mercredi
+ SDAYNAME4 jeudi
+ SDAYNAME5 vendredi
+ SDAYNAME6 samedi
+ SDAYNAME7 dimanche
+
+ SABBREVDAYNAME1 lun.
+ SABBREVDAYNAME2 mar.
+ SABBREVDAYNAME3 mer.
+ SABBREVDAYNAME4 jeu.
+ SABBREVDAYNAME5 ven.
+ SABBREVDAYNAME6 sam.
+ SABBREVDAYNAME7 dim.
+
+ SMONTHNAME1 janvier
+ SMONTHNAME2 février
+ SMONTHNAME3 mars
+ SMONTHNAME4 avril
+ SMONTHNAME5 mai
+ SMONTHNAME6 juin
+ SMONTHNAME7 juillet
+ SMONTHNAME8 août
+ SMONTHNAME9 septembre
+ SMONTHNAME10 octobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 décembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 janv.
+ SABBREVMONTHNAME2 févr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 avr.
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 juin
+ SABBREVMONTHNAME7 juil.
+ SABBREVMONTHNAME8 août
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 oct.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 déc.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0c0c ; French - Canada
+
+ ILANGUAGE 0c0c
+ SENGLANGUAGE French
+ SABBREVLANGNAME FRC
+ SNATIVELANGNAME français
+
+ ICOUNTRY 2
+ SENGCOUNTRY Canada
+ SABBREVCTRYNAME CAN
+ SNATIVECTRYNAME Canada
+
+ IDEFAULTLANGUAGE 0c0c
+ IDEFAULTCOUNTRY 2
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY $
+ SINTLSYMBOL CAD
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 4
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ H' h 'mm
+ H:mm
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 yy-MM-dd
+ dd-MM-yy
+ yy MM dd
+ dd/MM/yy
+ SDATE -
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d MMMM, yyyy
+ d MMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lundi
+ SDAYNAME2 mardi
+ SDAYNAME3 mercredi
+ SDAYNAME4 jeudi
+ SDAYNAME5 vendredi
+ SDAYNAME6 samedi
+ SDAYNAME7 dimanche
+
+ SABBREVDAYNAME1 lun.
+ SABBREVDAYNAME2 mar.
+ SABBREVDAYNAME3 mer.
+ SABBREVDAYNAME4 jeu.
+ SABBREVDAYNAME5 ven.
+ SABBREVDAYNAME6 sam.
+ SABBREVDAYNAME7 dim.
+
+ SMONTHNAME1 janvier
+ SMONTHNAME2 février
+ SMONTHNAME3 mars
+ SMONTHNAME4 avril
+ SMONTHNAME5 mai
+ SMONTHNAME6 juin
+ SMONTHNAME7 juillet
+ SMONTHNAME8 août
+ SMONTHNAME9 septembre
+ SMONTHNAME10 octobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 décembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 janv.
+ SABBREVMONTHNAME2 févr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 avr.
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 juin
+ SABBREVMONTHNAME7 juil.
+ SABBREVMONTHNAME8 août
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 oct.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 déc.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 100c ; French - Switzerland
+
+ ILANGUAGE 100c
+ SENGLANGUAGE French
+ SABBREVLANGNAME FRS
+ SNATIVELANGNAME français
+
+ ICOUNTRY 41
+ SENGCOUNTRY Switzerland
+ SABBREVCTRYNAME CHE
+ SNATIVECTRYNAME Suisse
+
+ IDEFAULTLANGUAGE 100c
+ IDEFAULTCOUNTRY 41
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND '
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY SFr.
+ SINTLSYMBOL CHF
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP '
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH:mm:ss
+ H:mm:ss
+ HH.mm' h'
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 dd.MM.yyyy
+ dd. M. yy
+ d.M.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd, d. MMMM yyyy
+ d. MMMM yyyy
+ d MMM yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lundi
+ SDAYNAME2 mardi
+ SDAYNAME3 mercredi
+ SDAYNAME4 jeudi
+ SDAYNAME5 vendredi
+ SDAYNAME6 samedi
+ SDAYNAME7 dimanche
+
+ SABBREVDAYNAME1 lun.
+ SABBREVDAYNAME2 mar.
+ SABBREVDAYNAME3 mer.
+ SABBREVDAYNAME4 jeu.
+ SABBREVDAYNAME5 ven.
+ SABBREVDAYNAME6 sam.
+ SABBREVDAYNAME7 dim.
+
+ SMONTHNAME1 janvier
+ SMONTHNAME2 fevrier
+ SMONTHNAME3 mars
+ SMONTHNAME4 avril
+ SMONTHNAME5 mai
+ SMONTHNAME6 juin
+ SMONTHNAME7 juillet
+ SMONTHNAME8 août
+ SMONTHNAME9 septembre
+ SMONTHNAME10 octobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 décembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 janv.
+ SABBREVMONTHNAME2 févr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 avr.
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 juin
+ SABBREVMONTHNAME7 juil.
+ SABBREVMONTHNAME8 août
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 oct.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 déc.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040e ; Hungarian - Hungary
+
+ ILANGUAGE 040e
+ SENGLANGUAGE Hungarian
+ SABBREVLANGNAME HUN
+ SNATIVELANGNAME magyar
+
+ ICOUNTRY 36
+ SENGCOUNTRY Hungary
+ SABBREVCTRYNAME HUN
+ SNATIVECTRYNAME Magyarország
+
+ IDEFAULTLANGUAGE 040e
+ IDEFAULTCOUNTRY 36
+ IDEFAULTANSICODEPAGE 1250
+ IDEFAULTOEMCODEPAGE 852
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Ft
+ SINTLSYMBOL HUF
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 H.mm.ss
+ HH.mm.ss
+ H:mm:ss
+ STIME .
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 yyyy.MM.dd.
+ yyyy-MM-dd
+ yy-MM-dd
+ SDATE .
+ IDATE 2
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 yyyy. MMMM d.
+ yyyy. MMMM dd.
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 h\x00e9tf\x00f5
+ SDAYNAME2 kedd
+ SDAYNAME3 szerda
+ SDAYNAME4 csütörtök
+ SDAYNAME5 péntek
+ SDAYNAME6 szombat
+ SDAYNAME7 vasárnap
+
+ SABBREVDAYNAME1 H
+ SABBREVDAYNAME2 K
+ SABBREVDAYNAME3 Sze
+ SABBREVDAYNAME4 Cs
+ SABBREVDAYNAME5 P
+ SABBREVDAYNAME6 Szo
+ SABBREVDAYNAME7 V
+
+ SMONTHNAME1 január
+ SMONTHNAME2 február
+ SMONTHNAME3 március
+ SMONTHNAME4 április
+ SMONTHNAME5 május
+ SMONTHNAME6 június
+ SMONTHNAME7 július
+ SMONTHNAME8 augusztus
+ SMONTHNAME9 szeptember
+ SMONTHNAME10 október
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan.
+ SABBREVMONTHNAME2 febr.
+ SABBREVMONTHNAME3 márc.
+ SABBREVMONTHNAME4 ápr.
+ SABBREVMONTHNAME5 máj.
+ SABBREVMONTHNAME6 jún.
+ SABBREVMONTHNAME7 júl.
+ SABBREVMONTHNAME8 aug.
+ SABBREVMONTHNAME9 szept.
+ SABBREVMONTHNAME10 okt.
+ SABBREVMONTHNAME11 nov.
+ SABBREVMONTHNAME12 dec.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 040f ; Icelandic - Iceland
+
+ ILANGUAGE 040f
+ SENGLANGUAGE Icelandic
+ SABBREVLANGNAME ISL
+ SNATIVELANGNAME Íslenska
+
+ ICOUNTRY 354
+ SENGCOUNTRY Iceland
+ SABBREVCTRYNAME ISL
+ SNATIVECTRYNAME Ísland
+
+ IDEFAULTLANGUAGE 040f
+ IDEFAULTCOUNTRY 354
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL ISK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH:mm:ss
+ H:mm:ss
+ HH:mm
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 yyyy-MM-dd
+ dd.MM.yy
+ d. M. yyyy.
+ d. M. 'yy.
+ yy MM dd
+ SDATE -
+ IDATE 2
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 mánudagur
+ SDAYNAME2 þriðjudagur
+ SDAYNAME3 miðvikudagur
+ SDAYNAME4 fimmtudagur
+ SDAYNAME5 föstudagur
+ SDAYNAME6 laugardagur
+ SDAYNAME7 sunnudagur
+
+ SABBREVDAYNAME1 mán.
+ SABBREVDAYNAME2 þri.
+ SABBREVDAYNAME3 mið.
+ SABBREVDAYNAME4 fim.
+ SABBREVDAYNAME5 fös.
+ SABBREVDAYNAME6 lau.
+ SABBREVDAYNAME7 sun.
+
+ SMONTHNAME1 janúar
+ SMONTHNAME2 febrúar
+ SMONTHNAME3 mars
+ SMONTHNAME4 apríl
+ SMONTHNAME5 maí
+ SMONTHNAME6 júní
+ SMONTHNAME7 júlí
+ SMONTHNAME8 ágúst
+ SMONTHNAME9 september
+ SMONTHNAME10 október
+ SMONTHNAME11 nóvember
+ SMONTHNAME12 desember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan.
+ SABBREVMONTHNAME2 febr.
+ SABBREVMONTHNAME3 mars
+ SABBREVMONTHNAME4 apr.
+ SABBREVMONTHNAME5 maí
+ SABBREVMONTHNAME6 júní
+ SABBREVMONTHNAME7 júlí
+ SABBREVMONTHNAME8 ág.
+ SABBREVMONTHNAME9 sept.
+ SABBREVMONTHNAME10 okt.
+ SABBREVMONTHNAME11 nóv.
+ SABBREVMONTHNAME12 des.
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0410 ; Italian - Italy
+
+ ILANGUAGE 0410
+ SENGLANGUAGE Italian
+ SABBREVLANGNAME ITA
+ SNATIVELANGNAME Italiano
+
+ ICOUNTRY 39
+ SENGCOUNTRY Italy
+ SABBREVCTRYNAME ITA
+ SNATIVECTRYNAME Italia
+
+ IDEFAULTLANGUAGE 0410
+ IDEFAULTCOUNTRY 39
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY L.
+ SINTLSYMBOL ITL
+ SMONDECIMALSEP \x0000
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 0
+ ICURRENCY 2
+ INEGCURR 9
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 H.mm.ss
+ HH.mm.ss
+ H.mm
+ H:mm
+ STIME .
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd/MM/yy
+ dd/MM/yyyy
+ dd.M.yy
+ d/M/yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd d MMMM yyyy
+ d-MMM-yy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunedì
+ SDAYNAME2 martedì
+ SDAYNAME3 mercoledì
+ SDAYNAME4 giovedì
+ SDAYNAME5 venerdì
+ SDAYNAME6 sabato
+ SDAYNAME7 domenica
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mer
+ SABBREVDAYNAME4 gio
+ SABBREVDAYNAME5 ven
+ SABBREVDAYNAME6 sab
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 gennaio
+ SMONTHNAME2 febbraio
+ SMONTHNAME3 marzo
+ SMONTHNAME4 aprile
+ SMONTHNAME5 maggio
+ SMONTHNAME6 giugno
+ SMONTHNAME7 luglio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 settembre
+ SMONTHNAME10 ottobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 dicembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 gen
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mag
+ SABBREVMONTHNAME6 giu
+ SABBREVMONTHNAME7 lug
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 set
+ SABBREVMONTHNAME10 ott
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0810 ; Italian - Switzerland
+
+ ILANGUAGE 0810
+ SENGLANGUAGE Italian
+ SABBREVLANGNAME ITS
+ SNATIVELANGNAME Italiano
+
+ ICOUNTRY 41
+ SENGCOUNTRY Switzerland
+ SABBREVCTRYNAME CHE
+ SNATIVECTRYNAME Svizzera
+
+ IDEFAULTLANGUAGE 0810
+ IDEFAULTCOUNTRY 41
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND '
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY SFr.
+ SINTLSYMBOL CHF
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP '
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH:mm:ss
+ H:mm:ss
+ H.mm' h'
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd.MM.yyyy
+ dd. MM. yy
+ d/M/yy
+ dd.M.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 3 dddd, d. MMMM yyyy
+ d-MMM-yy
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 lunedì
+ SDAYNAME2 martedì
+ SDAYNAME3 mercoledì
+ SDAYNAME4 giovedì
+ SDAYNAME5 venerdì
+ SDAYNAME6 sabato
+ SDAYNAME7 domenica
+
+ SABBREVDAYNAME1 lun
+ SABBREVDAYNAME2 mar
+ SABBREVDAYNAME3 mer
+ SABBREVDAYNAME4 gio
+ SABBREVDAYNAME5 ven
+ SABBREVDAYNAME6 sab
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 gennaio
+ SMONTHNAME2 febbraio
+ SMONTHNAME3 marzo
+ SMONTHNAME4 aprile
+ SMONTHNAME5 maggio
+ SMONTHNAME6 giugno
+ SMONTHNAME7 luglio
+ SMONTHNAME8 agosto
+ SMONTHNAME9 settembre
+ SMONTHNAME10 ottobre
+ SMONTHNAME11 novembre
+ SMONTHNAME12 dicembre
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 gen
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mag
+ SABBREVMONTHNAME6 gio
+ SABBREVMONTHNAME7 lug
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 set
+ SABBREVMONTHNAME10 ott
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dic
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0411 ; Japanese - Japan
+
+ ILANGUAGE 0411
+ SENGLANGUAGE Japanese
+ SABBREVLANGNAME JPN
+ SNATIVELANGNAME \x65e5\x672c\x8a9e
+
+ ICOUNTRY 81
+ SENGCOUNTRY Japan
+ SABBREVCTRYNAME JPN
+ SNATIVECTRYNAME \x65e5\x672c
+
+ IDEFAULTLANGUAGE 0411
+ IDEFAULTCOUNTRY 81
+ IDEFAULTANSICODEPAGE 932
+ IDEFAULTOEMCODEPAGE 932
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \xffe5
+ SINTLSYMBOL YEN
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 tt h:mm:ss
+ tt hh:mm:ss
+ H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 0
+ ITLZERO 0
+ S1159 \x5348\x524d
+ S2359 \x5348\x5f8c
+
+ SSHORTDATE 4 yy/MM/dd
+ yy/M/d
+ yyyy/MM/dd
+ yyyy/M/d
+ SDATE /
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 yyyy'\x5e74'M'\x6708'd'\x65e5'
+ yyyy'\x5e74'MM'\x6708'dd'\x65e5'
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 3 3\xffffEra: Year of the Emperor
+ 2\xffffGregorian (U.S. English)
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x6708\x66dc\x65e5
+ SDAYNAME2 \x706b\x66dc\x65e5
+ SDAYNAME3 \x6c34\x66dc\x65e5
+ SDAYNAME4 \x6728\x66dc\x65e5
+ SDAYNAME5 \x91d1\x66dc\x65e5
+ SDAYNAME6 \x571f\x66dc\x65e5
+ SDAYNAME7 \x65e5\x66dc\x65e5
+
+ SABBREVDAYNAME1 \x6708
+ SABBREVDAYNAME2 \x706b
+ SABBREVDAYNAME3 \x6c34
+ SABBREVDAYNAME4 \x6728
+ SABBREVDAYNAME5 \x91d1
+ SABBREVDAYNAME6 \x571f
+ SABBREVDAYNAME7 \x65e5
+
+ SMONTHNAME1 \xff11\x6708
+ SMONTHNAME2 \xff12\x6708
+ SMONTHNAME3 \xff13\x6708
+ SMONTHNAME4 \xff14\x6708
+ SMONTHNAME5 \xff15\x6708
+ SMONTHNAME6 \xff16\x6708
+ SMONTHNAME7 \xff17\x6708
+ SMONTHNAME8 \xff18\x6708
+ SMONTHNAME9 \xff19\x6708
+ SMONTHNAME10 \xff11\xff10\x6708
+ SMONTHNAME11 \xff11\xff11\x6708
+ SMONTHNAME12 \xff11\xff12\x6708
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 1
+ SABBREVMONTHNAME2 2
+ SABBREVMONTHNAME3 3
+ SABBREVMONTHNAME4 4
+ SABBREVMONTHNAME5 5
+ SABBREVMONTHNAME6 6
+ SABBREVMONTHNAME7 7
+ SABBREVMONTHNAME8 8
+ SABBREVMONTHNAME9 9
+ SABBREVMONTHNAME10 10
+ SABBREVMONTHNAME11 11
+ SABBREVMONTHNAME12 12
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0412 ; Korean - Korea
+
+ ILANGUAGE 0412
+ SENGLANGUAGE Korean
+ SABBREVLANGNAME KOR
+ SNATIVELANGNAME \x3ca2\x3476\x3971
+ ICOUNTRY 82
+ SENGCOUNTRY Korea
+ SABBREVCTRYNAME KOR
+ SNATIVECTRYNAME \x35c2\x3ca2\x377b\x3476
+
+ IDEFAULTLANGUAGE 0412
+ IDEFAULTCOUNTRY 82
+ IDEFAULTANSICODEPAGE 949
+ IDEFAULTOEMCODEPAGE 949
+
+ SLIST ,
+ IMEASURE 0
+
+ SDECIMAL .
+ STHOUSAND ,
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 0
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x20a9
+ SINTLSYMBOL KRW
+ SMONDECIMALSEP .
+ SMONTHOUSANDSEP ,
+ SMONGROUPING 3;0
+ ICURRDIGITS 0
+ IINTLCURRDIGITS 2
+ ICURRENCY 0
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x39a1\x3a3b
+ S2359 \x39a1\x3cf3
+
+ SSHORTDATE 4 yy-MM-dd
+ yy-M-d
+ yyyy-M-d
+ yyyy-MM-dd
+ SDATE -
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 yyyy'\x355b' M'\x39da' d'\x3a0e'
+ yyyy'\x355b' MM'\x39da' dd'\x3a0e'
+ ILDATE 2
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 5\xffffTangun Era
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 6
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x39da\x39c5\x3a0e
+ SDAYNAME2 \x3cdc\x39c5\x3a0e
+ SDAYNAME3 \x38bd\x39c5\x3a0e
+ SDAYNAME4 \x3740\x39c5\x3a0e
+ SDAYNAME5 \x349a\x39c5\x3a0e
+ SDAYNAME6 \x3bf9\x39c5\x3a0e
+ SDAYNAME7 \x3a0e\x39c5\x3a0e
+
+ SABBREVDAYNAME1 \x39da
+ SABBREVDAYNAME2 \x3cdc
+ SABBREVDAYNAME3 \x38bd
+ SABBREVDAYNAME4 \x3740
+ SABBREVDAYNAME5 \x349a
+ SABBREVDAYNAME6 \x3bf9
+ SABBREVDAYNAME7 \x3a0e
+
+ SMONTHNAME1 \x0031\x39da
+ SMONTHNAME2 \x0032\x39da
+ SMONTHNAME3 \x0033\x39da
+ SMONTHNAME4 \x0034\x39da
+ SMONTHNAME5 \x0035\x39da
+ SMONTHNAME6 \x0036\x39da
+ SMONTHNAME7 \x0037\x39da
+ SMONTHNAME8 \x0038\x39da
+ SMONTHNAME9 \x0039\x39da
+ SMONTHNAME10 \x0031\x0030\x39da
+ SMONTHNAME11 \x0031\x0031\x39da
+ SMONTHNAME12 \x0031\x0032\x39da
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x0031\x39da
+ SABBREVMONTHNAME2 \x0032\x39da
+ SABBREVMONTHNAME3 \x0033\x39da
+ SABBREVMONTHNAME4 \x0034\x39da
+ SABBREVMONTHNAME5 \x0035\x39da
+ SABBREVMONTHNAME6 \x0036\x39da
+ SABBREVMONTHNAME7 \x0037\x39da
+ SABBREVMONTHNAME8 \x0038\x39da
+ SABBREVMONTHNAME9 \x0039\x39da
+ SABBREVMONTHNAME10 \x0031\x0030\x39da
+ SABBREVMONTHNAME11 \x0031\x0031\x39da
+ SABBREVMONTHNAME12 \x0031\x0032\x39da
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0413 ; Dutch - Netherlands
+
+ ILANGUAGE 0413
+ SENGLANGUAGE Dutch
+ SABBREVLANGNAME NLD
+ SNATIVELANGNAME Nederlands
+
+ ICOUNTRY 31
+ SENGCOUNTRY Netherlands
+ SABBREVCTRYNAME NLD
+ SNATIVECTRYNAME Nederland
+
+ IDEFAULTLANGUAGE 0413
+ IDEFAULTCOUNTRY 31
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY F
+ SINTLSYMBOL NLG
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 11
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 6 H:mm:ss
+ HH:mm:ss
+ H:mm
+ H.mm
+ HH.mm.ss' uur'
+ HH:mm:ss' uur'
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 d-MM-yy
+ dd-MM-yy
+ dd/MM/yy
+ dd.MM.yy
+ SDATE -
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd d MMMM yyyy
+ d-MMM-yy
+ d MMMM yyyy
+ d MMM yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 maandag
+ SDAYNAME2 dinsdag
+ SDAYNAME3 woensdag
+ SDAYNAME4 donderdag
+ SDAYNAME5 vrijdag
+ SDAYNAME6 zaterdag
+ SDAYNAME7 zondag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 di
+ SABBREVDAYNAME3 wo
+ SABBREVDAYNAME4 do
+ SABBREVDAYNAME5 vr
+ SABBREVDAYNAME6 za
+ SABBREVDAYNAME7 zo
+
+ SMONTHNAME1 januari
+ SMONTHNAME2 februari
+ SMONTHNAME3 maart
+ SMONTHNAME4 april
+ SMONTHNAME5 mei
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 augustus
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mrt
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mei
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0813 ; Dutch - Belgium
+
+ ILANGUAGE 0813
+ SENGLANGUAGE Dutch
+ SABBREVLANGNAME NLB
+ SNATIVELANGNAME Nederlands
+
+ ICOUNTRY 32
+ SENGCOUNTRY Belgium
+ SABBREVCTRYNAME BEL
+ SNATIVECTRYNAME België
+
+ IDEFAULTLANGUAGE 0813
+ IDEFAULTCOUNTRY 32
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY BF
+ SINTLSYMBOL BEF
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 H:mm:ss
+ HH:mm:ss
+ H.mm' u.'
+ H:mm
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 d/MM/yy
+ dd-mm-yy
+ dd.MM.yy
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 0
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd d MMMM yyyy
+ dd-MMM-yy
+ d MMMM yyyy
+ dd MMM yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 maandag
+ SDAYNAME2 dinsdag
+ SDAYNAME3 woensdag
+ SDAYNAME4 donderdag
+ SDAYNAME5 vrijdag
+ SDAYNAME6 zaterdag
+ SDAYNAME7 zondag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 di
+ SABBREVDAYNAME3 wo
+ SABBREVDAYNAME4 do
+ SABBREVDAYNAME5 vr
+ SABBREVDAYNAME6 za
+ SABBREVDAYNAME7 zo
+
+ SMONTHNAME1 januari
+ SMONTHNAME2 februari
+ SMONTHNAME3 maart
+ SMONTHNAME4 april
+ SMONTHNAME5 mei
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 augustus
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mrt
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mei
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0414 ; Norwegian - Norway (Bokmal)
+
+ ILANGUAGE 0414
+ SENGLANGUAGE Norwegian (Bokmal)
+ SABBREVLANGNAME NOR
+ SNATIVELANGNAME Norsk
+
+ ICOUNTRY 47
+ SENGCOUNTRY Norway
+ SABBREVCTRYNAME NOR
+ SNATIVECTRYNAME Norge
+
+ IDEFAULTLANGUAGE 0414
+ IDEFAULTCOUNTRY 47
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL NOK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ 'kl 'HH.mm
+ HH.mm.ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 dd.MM.yy
+ yyyy-MM-dd
+ d.M.yy
+ ddMMyy
+ dd.MM.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 mandag
+ SDAYNAME2 tirsdag
+ SDAYNAME3 onsdag
+ SDAYNAME4 torsdag
+ SDAYNAME5 fredag
+ SDAYNAME6 lørdag
+ SDAYNAME7 søndag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 on
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 fr
+ SABBREVDAYNAME6 lø
+ SABBREVDAYNAME7 sø
+
+ SMONTHNAME1 januar
+ SMONTHNAME2 februar
+ SMONTHNAME3 mars
+ SMONTHNAME4 april
+ SMONTHNAME5 mai
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 august
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 desember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 des
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0814 ; Norwegian - Norway (Nynorsk)
+
+ ILANGUAGE 0814
+ SENGLANGUAGE Norwegian (Nynorsk)
+ SABBREVLANGNAME NON
+ SNATIVELANGNAME Norsk
+
+ ICOUNTRY 47
+ SENGCOUNTRY Norway
+ SABBREVCTRYNAME NOR
+ SNATIVECTRYNAME Norge
+
+ IDEFAULTLANGUAGE 0814
+ IDEFAULTCOUNTRY 47
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL NOK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 2
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 4 HH:mm:ss
+ H:mm:ss
+ 'kl 'HH.mm
+ HH.mm.ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 dd.MM.yy
+ yyyy-MM-dd
+ d.M.yy
+ ddMMyy
+ dd.MM.yy
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 mandag
+ SDAYNAME2 tirsdag
+ SDAYNAME3 onsdag
+ SDAYNAME4 torsdag
+ SDAYNAME5 fredag
+ SDAYNAME6 lørdag
+ SDAYNAME7 søndag
+
+ SABBREVDAYNAME1 ma
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 on
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 fr
+ SABBREVDAYNAME6 lø
+ SABBREVDAYNAME7 sø
+
+ SMONTHNAME1 januar
+ SMONTHNAME2 februar
+ SMONTHNAME3 mars
+ SMONTHNAME4 april
+ SMONTHNAME5 mai
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 august
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 desember
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 des
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0415 ; Polish - Poland
+
+ ILANGUAGE 0415
+ SENGLANGUAGE Polish
+ SABBREVLANGNAME PLK
+ SNATIVELANGNAME Polski
+
+ ICOUNTRY 48
+ SENGCOUNTRY Poland
+ SABBREVCTRYNAME POL
+ SNATIVECTRYNAME Polska
+
+ IDEFAULTLANGUAGE 0415
+ IDEFAULTCOUNTRY 48
+ IDEFAULTANSICODEPAGE 1250
+ IDEFAULTOEMCODEPAGE 852
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY z\x0142
+ SINTLSYMBOL PLZ
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH:mm:ss
+ H:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 yy.MM.dd
+ yyyy-MM-dd
+ yy-MM-dd
+ SDATE .
+ IDATE 2
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d MMMM yyyy
+ dd MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Poniedzia\x0142ek
+ SDAYNAME2 Wtorek
+ SDAYNAME3 \x015aroda
+ SDAYNAME4 Czwartek
+ SDAYNAME5 Pi\x0105tek
+ SDAYNAME6 Sobota
+ SDAYNAME7 Niedziela
+
+ SABBREVDAYNAME1 pn.
+ SABBREVDAYNAME2 wt.
+ SABBREVDAYNAME3 \x015br.
+ SABBREVDAYNAME4 czw.
+ SABBREVDAYNAME5 pt.
+ SABBREVDAYNAME6 sob.
+ SABBREVDAYNAME7 ndz.
+
+ SMONTHNAME1 Styze\x0144
+ SMONTHNAME2 Luty
+ SMONTHNAME3 Marzec
+ SMONTHNAME4 Kwiecie\x0144
+ SMONTHNAME5 Maj
+ SMONTHNAME6 Czerwiec
+ SMONTHNAME7 Lipiec
+ SMONTHNAME8 Sierpie\x0144
+ SMONTHNAME9 Wrzesie\x0144
+ SMONTHNAME10 Pa\x017adziernik
+ SMONTHNAME11 Listopad
+ SMONTHNAME12 Grudzie\x0144
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Sty
+ SABBREVMONTHNAME2 Lut
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Kwi
+ SABBREVMONTHNAME5 Maj
+ SABBREVMONTHNAME6 Cze
+ SABBREVMONTHNAME7 Lip
+ SABBREVMONTHNAME8 Sie
+ SABBREVMONTHNAME9 Wrz
+ SABBREVMONTHNAME10 Pa\x017a
+ SABBREVMONTHNAME11 Lis
+ SABBREVMONTHNAME12 Gru
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0416 ; Portuguese - Brazil
+
+ ILANGUAGE 0416
+ SENGLANGUAGE Portuguese
+ SABBREVLANGNAME PTB
+ SNATIVELANGNAME Português
+
+ ICOUNTRY 55
+ SENGCOUNTRY Brazil
+ SABBREVCTRYNAME BRA
+ SNATIVECTRYNAME Brasil
+
+ IDEFAULTLANGUAGE 0416
+ IDEFAULTCOUNTRY 55
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Cr$
+ SINTLSYMBOL BRC
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 2
+ INEGCURR 0
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 dd/MM/yy
+ dd/MM/yyyy
+ yyyy.MM.dd
+ SDATE /
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 dddd, d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 segunda-feira
+ SDAYNAME2 terça-feira
+ SDAYNAME3 quarta-feira
+ SDAYNAME4 quinta-feira
+ SDAYNAME5 sexta-feira
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 seg
+ SABBREVDAYNAME2 ter
+ SABBREVDAYNAME3 qua
+ SABBREVDAYNAME4 qui
+ SABBREVDAYNAME5 sex
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 janeiro
+ SMONTHNAME2 fevereiro
+ SMONTHNAME3 março
+ SMONTHNAME4 abril
+ SMONTHNAME5 maio
+ SMONTHNAME6 junho
+ SMONTHNAME7 julho
+ SMONTHNAME8 agosto
+ SMONTHNAME9 setembro
+ SMONTHNAME10 outubro
+ SMONTHNAME11 novembro
+ SMONTHNAME12 dezembro
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 fev
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 set
+ SABBREVMONTHNAME10 out
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0816 ; Portuguese - Portugal
+
+ ILANGUAGE 0816
+ SENGLANGUAGE Portuguese
+ SABBREVLANGNAME PTG
+ SNATIVELANGNAME Português
+
+ ICOUNTRY 351
+ SENGCOUNTRY Portugal
+ SABBREVCTRYNAME PRT
+ SNATIVECTRYNAME Portugal
+
+ IDEFAULTLANGUAGE 0816
+ IDEFAULTCOUNTRY 351
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Esc.
+ SINTLSYMBOL PTE
+ SMONDECIMALSEP $
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 H:mm:ss
+ HH:mm:ss
+ HH'H'mm'm'
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 5 dd-MM-yyyy
+ yy.MM.dd
+ d.M.yy
+ dd/MM/yy
+ yyyy-MM-dd
+ SDATE -
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 4 dddd, d' de 'MMMM' de 'yyyy
+ d' de 'MMMM' de 'yyyy
+ d/MMM/yy
+ d.MMM.yy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 segunda-feira
+ SDAYNAME2 terça-feira
+ SDAYNAME3 quarta-feira
+ SDAYNAME4 quinta-feira
+ SDAYNAME5 sexta-feira
+ SDAYNAME6 sábado
+ SDAYNAME7 domingo
+
+ SABBREVDAYNAME1 seg
+ SABBREVDAYNAME2 ter
+ SABBREVDAYNAME3 qua
+ SABBREVDAYNAME4 qui
+ SABBREVDAYNAME5 sex
+ SABBREVDAYNAME6 sáb
+ SABBREVDAYNAME7 dom
+
+ SMONTHNAME1 janeiro
+ SMONTHNAME2 fevereiro
+ SMONTHNAME3 março
+ SMONTHNAME4 abril
+ SMONTHNAME5 maio
+ SMONTHNAME6 junho
+ SMONTHNAME7 julho
+ SMONTHNAME8 agosto
+ SMONTHNAME9 setembro
+ SMONTHNAME10 outubro
+ SMONTHNAME11 novembro
+ SMONTHNAME12 dezembro
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 fev
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 abr
+ SABBREVMONTHNAME5 mai
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 ago
+ SABBREVMONTHNAME9 set
+ SABBREVMONTHNAME10 out
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dez
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 0419 ; Russian - Russia
+
+ ILANGUAGE 0419
+ SENGLANGUAGE Russian
+ SABBREVLANGNAME RUS
+ SNATIVELANGNAME \x0420\x0443\x0441\x0441\x043a\x0438\x0439
+
+ ICOUNTRY 7
+ SENGCOUNTRY Russia
+ SABBREVCTRYNAME RUS
+ SNATIVECTRYNAME \x0420\x043e\x0441\x0441\x0438\x044f
+
+ IDEFAULTLANGUAGE 0419
+ IDEFAULTCOUNTRY 7
+ IDEFAULTANSICODEPAGE 1251
+ IDEFAULTOEMCODEPAGE 866
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY \x0440.
+ SINTLSYMBOL SUR
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 5
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 dd.MM.yy
+ d.M.yy
+ dd/MM/yy
+ SDATE .
+ IDATE 1
+ ICENTURY 0
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d MMMM yyyy
+ dd MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 \x041f\x043e\x043d\x0435\x0434\x0435\x043b\x044c\x043d\x0438\x043a
+ SDAYNAME2 \x0412\x0442\x043e\x0440\x043d\x0438\x043a
+ SDAYNAME3 \x0421\x0440\x0435\x0434\x0430
+ SDAYNAME4 \x0427\x0435\x0442\x0432\x0435\x0440\x0433
+ SDAYNAME5 \x041f\x044f\x0442\x043d\x0438\x0446\x0430
+ SDAYNAME6 \x0421\x0443\x0431\x0431\x043e\x0442\x0430
+ SDAYNAME7 \x0412\x043e\x0441\x043a\x0440\x0435\x0441\x0435\x043d\x044c\x0435
+
+ SABBREVDAYNAME1 \x041f\x043e\x043d
+ SABBREVDAYNAME2 \x0412\x0442\x043e
+ SABBREVDAYNAME3 \x0421\x0440\x0435
+ SABBREVDAYNAME4 \x0427\x0435\x0442
+ SABBREVDAYNAME5 \x041f\x044f\x0442
+ SABBREVDAYNAME6 \x0421\x0443\x0431
+ SABBREVDAYNAME7 \x0412\x043e\x0441
+
+ SMONTHNAME1 \x042f\x043d\x0432\x0430\x0440\x044c\xffff\x044f\x043d\x0432\x0430\x0440\x044f
+ SMONTHNAME2 \x0424\x0435\x0432\x0440\x0430\x043b\x044c\xffff\x0444\x0435\x0432\x0440\x0430\x043b\x044f
+ SMONTHNAME3 \x041c\x0430\x0440\x0442\xffff\x043c\x0430\x0440\x0442\x0430
+ SMONTHNAME4 \x0410\x043f\x0440\x0435\x043b\x044c\xffff\x0430\x043f\x0440\x0435\x043b\x044f
+ SMONTHNAME5 \x041c\x0430\x0439\xffff\x043c\x0430\x044f
+ SMONTHNAME6 \x0418\x044e\x043d\x044c\xffff\x0438\x044e\x043d\x044f
+ SMONTHNAME7 \x0418\x044e\x043b\x044c\xffff\x0438\x044e\x043b\x044f
+ SMONTHNAME8 \x0410\x0432\x0433\x0443\x0441\x0442\xffff\x0430\x0432\x0433\x0443\x0441\x0442\x0430
+ SMONTHNAME9 \x0421\x0435\x043d\x0442\x044f\x0431\x0440\x044c\xffff\x0441\x0435\x043d\x0442\x044f\x0431\x0440\x044f
+ SMONTHNAME10 \x041e\x043a\x0442\x044f\x0431\x0440\x044c\xffff\x043e\x043a\x0442\x044f\x0431\x0440\x044f
+ SMONTHNAME11 \x041d\x043e\x044f\x0431\x0440\x044c\xffff\x043d\x043e\x044f\x0431\x0440\x044f
+ SMONTHNAME12 \x0414\x0435\x043a\x0430\x0431\x0440\x044c\xffff\x0434\x0435\x043a\x0430\x0431\x0440\x044f
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 \x042f\x043d\x0432
+ SABBREVMONTHNAME2 \x0424\x0435\x0432
+ SABBREVMONTHNAME3 \x041c\x0430\x0440
+ SABBREVMONTHNAME4 \x0410\x043f\x0440
+ SABBREVMONTHNAME5 \x041c\x0430\x0439\xffff\x043c\x0430\x044f
+ SABBREVMONTHNAME6 \x0418\x044e\x043d
+ SABBREVMONTHNAME7 \x0418\x044e\x043b
+ SABBREVMONTHNAME8 \x0410\x0432\x0433
+ SABBREVMONTHNAME9 \x0421\x0435\x043d
+ SABBREVMONTHNAME10 \x041e\x043a\x0442
+ SABBREVMONTHNAME11 \x041d\x043e\x044f
+ SABBREVMONTHNAME12 \x0414\x0435\x043a
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 041b ; Slovak - Slovak Republic
+
+ ILANGUAGE 041b
+ SENGLANGUAGE Slovak
+ SABBREVLANGNAME SKY
+ SNATIVELANGNAME Slovenský
+
+ ICOUNTRY 42
+ SENGCOUNTRY Slovak Republic
+ SABBREVCTRYNAME SVK
+ SNATIVECTRYNAME Slovenská republika
+
+ IDEFAULTLANGUAGE 041b
+ IDEFAULTCOUNTRY 42
+ IDEFAULTANSICODEPAGE 1250
+ IDEFAULTOEMCODEPAGE 852
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY Sk
+ SINTLSYMBOL SKK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 HH.mm.ss
+ H.mm.ss
+ STIME .
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 dd.MM.yyyy
+ dd-MM-yy
+ yyyy-MM-dd
+ yy-MM-dd
+ SDATE .
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 d. MMMM yyyy
+ dd. MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 pondelok
+ SDAYNAME2 utorok
+ SDAYNAME3 streda
+ SDAYNAME4 \x0161tvrtok
+ SDAYNAME5 piatok
+ SDAYNAME6 sobota
+ SDAYNAME7 nede\x013ea
+
+ SABBREVDAYNAME1 po
+ SABBREVDAYNAME2 ut
+ SABBREVDAYNAME3 st
+ SABBREVDAYNAME4 \x0161t
+ SABBREVDAYNAME5 pi
+ SABBREVDAYNAME6 so
+ SABBREVDAYNAME7 ne
+
+ SMONTHNAME1 január
+ SMONTHNAME2 február
+ SMONTHNAME3 marec
+ SMONTHNAME4 apríl
+ SMONTHNAME5 máj
+ SMONTHNAME6 jún
+ SMONTHNAME7 júl
+ SMONTHNAME8 august
+ SMONTHNAME9 september
+ SMONTHNAME10 október
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 máj
+ SABBREVMONTHNAME6 jún
+ SABBREVMONTHNAME7 júl
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 041d ; Swedish - Sweden
+
+ ILANGUAGE 041d
+ SENGLANGUAGE Swedish
+ SABBREVLANGNAME SVE
+ SNATIVELANGNAME Svenska
+
+ ICOUNTRY 46
+ SENGCOUNTRY Sweden
+ SABBREVCTRYNAME SWE
+ SNATIVECTRYNAME Sverige
+
+ IDEFAULTLANGUAGE 041d
+ IDEFAULTCOUNTRY 46
+ IDEFAULTANSICODEPAGE 1252
+ IDEFAULTOEMCODEPAGE 850
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND \x00a0
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY kr
+ SINTLSYMBOL SEK
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP \x00a0
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 8
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 3 HH.mm.ss
+ H.mm.ss
+ 'kl 'H.mm
+ STIME .
+ ITIME 1
+ ITLZERO 1
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 4 yyyy-MM-dd
+ yy-MM-dd
+ yyMMdd
+ d/M-yy
+ SDATE -
+ IDATE 2
+ ICENTURY 1
+ IDAYLZERO 1
+ IMONLZERO 1
+
+ SLONGDATE 2 ' den 'd MMMM yyyy
+ ' den 'dd MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 måndag
+ SDAYNAME2 tisdag
+ SDAYNAME3 onsdag
+ SDAYNAME4 torsdag
+ SDAYNAME5 fredag
+ SDAYNAME6 lördag
+ SDAYNAME7 söndag
+
+ SABBREVDAYNAME1 må
+ SABBREVDAYNAME2 ti
+ SABBREVDAYNAME3 on
+ SABBREVDAYNAME4 to
+ SABBREVDAYNAME5 fr
+ SABBREVDAYNAME6 lö
+ SABBREVDAYNAME7 sö
+
+ SMONTHNAME1 januari
+ SMONTHNAME2 februari
+ SMONTHNAME3 mars
+ SMONTHNAME4 april
+ SMONTHNAME5 maj
+ SMONTHNAME6 juni
+ SMONTHNAME7 juli
+ SMONTHNAME8 augusti
+ SMONTHNAME9 september
+ SMONTHNAME10 oktober
+ SMONTHNAME11 november
+ SMONTHNAME12 december
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 jan
+ SABBREVMONTHNAME2 feb
+ SABBREVMONTHNAME3 mar
+ SABBREVMONTHNAME4 apr
+ SABBREVMONTHNAME5 maj
+ SABBREVMONTHNAME6 jun
+ SABBREVMONTHNAME7 jul
+ SABBREVMONTHNAME8 aug
+ SABBREVMONTHNAME9 sep
+ SABBREVMONTHNAME10 okt
+ SABBREVMONTHNAME11 nov
+ SABBREVMONTHNAME12 dec
+ SABBREVMONTHNAME13 \x0000
+
+
+BEGINLOCALE 041f ; Turkish - Turkey
+
+ ILANGUAGE 041f
+ SENGLANGUAGE Turkish
+ SABBREVLANGNAME TRK
+ SNATIVELANGNAME Türkçe
+
+ ICOUNTRY 90
+ SENGCOUNTRY Turkey
+ SABBREVCTRYNAME TUR
+ SNATIVECTRYNAME Türkiye
+
+ IDEFAULTLANGUAGE 041f
+ IDEFAULTCOUNTRY 90
+ IDEFAULTANSICODEPAGE 1254
+ IDEFAULTOEMCODEPAGE 857
+
+ SLIST ;
+ IMEASURE 0
+
+ SDECIMAL ,
+ STHOUSAND .
+ SGROUPING 3;0
+ IDIGITS 2
+ ILZERO 1
+ INEGNUMBER 1
+ SNATIVEDIGITS 0123456789
+
+ SCURRENCY TL
+ SINTLSYMBOL TRL
+ SMONDECIMALSEP ,
+ SMONTHOUSANDSEP .
+ SMONGROUPING 3;0
+ ICURRDIGITS 2
+ IINTLCURRDIGITS 2
+ ICURRENCY 3
+ INEGCURR 1
+ SPOSITIVESIGN \x0000
+ SNEGATIVESIGN -
+
+ STIMEFORMAT 2 H:mm:ss
+ HH:mm:ss
+ STIME :
+ ITIME 1
+ ITLZERO 0
+ S1159 \x0000
+ S2359 \x0000
+
+ SSHORTDATE 3 d/M/yyyy
+ dd/MM/yy
+ yy/MM/dd
+ SDATE /
+ IDATE 1
+ ICENTURY 1
+ IDAYLZERO 0
+ IMONLZERO 0
+
+ SLONGDATE 3 d MMMM yyyy, dddd
+ dd MMMM yyyy, dddd
+ d MMMM yyyy
+ ILDATE 1
+
+ ICALENDARTYPE 1
+ IOPTIONALCALENDAR 2 0\xffff
+ 1\xffffGregorian
+
+ IFIRSTDAYOFWEEK 0
+ IFIRSTWEEKOFYEAR 0
+
+ SDAYNAME1 Pazartesi
+ SDAYNAME2 Sae\x0131
+ SDAYNAME3 \x00c7ar\x015famba
+ SDAYNAME4 per\x015fembe
+ SDAYNAME5 Cuma
+ SDAYNAME6 Cumartesi
+ SDAYNAME7 Pazar
+
+ SABBREVDAYNAME1 Pazartesi
+ SABBREVDAYNAME2 Sae\x0131
+ SABBREVDAYNAME3 \x00c7ar\x015famba
+ SABBREVDAYNAME4 per\x015fembe
+ SABBREVDAYNAME5 Cuma
+ SABBREVDAYNAME6 Cumartesi
+ SABBREVDAYNAME7 Pazar
+
+ SMONTHNAME1 Ocak
+ SMONTHNAME2 \x015eubat
+ SMONTHNAME3 Mart
+ SMONTHNAME4 Nisan
+ SMONTHNAME5 May\x0131s
+ SMONTHNAME6 Haziran
+ SMONTHNAME7 Temmuz
+ SMONTHNAME8 A\x011fustos
+ SMONTHNAME9 Eylül
+ SMONTHNAME10 Ekim
+ SMONTHNAME11 Kas\x0131m
+ SMONTHNAME12 Aral\x0131k
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Ocak
+ SABBREVMONTHNAME2 \x015eubat
+ SABBREVMONTHNAME3 Mart
+ SABBREVMONTHNAME4 Nisan
+ SABBREVMONTHNAME5 May\x0131s
+ SABBREVMONTHNAME6 Haziran
+ SABBREVMONTHNAME7 Temmuz
+ SABBREVMONTHNAME8 A\x011fustos
+ SABBREVMONTHNAME9 Eylül
+ SABBREVMONTHNAME10 Ekim
+ SABBREVMONTHNAME11 Kas\x0131m
+ SABBREVMONTHNAME12 Aral\x0131k
+ SABBREVMONTHNAME13 \x0000
+
+
+ENDLOCALE
+
+
+
+CALENDAR 5
+
+
+ BEGINCALENDAR 1 ; Gregorian (localized)
+
+ SCALENDAR 1
+
+ SERARANGES 0
+
+ SSHORTDATE 1 \x0000
+ SLONGDATE 1 \x0000
+
+ IF_NAMES 0
+
+
+ BEGINCALENDAR 2 ; Gregorian (U.S. English only)
+
+ SCALENDAR 2
+
+ SERARANGES 0
+
+ SSHORTDATE 4 M/d/yy
+ M/d/yyyy
+ MM/dd/yy
+ MM/dd/yyyy
+ SLONGDATE 2 dddd, MMMM dd, yyyy
+ MMMM dd, yyyy
+
+ IF_NAMES 1
+
+ SDAYNAME1 Monday
+ SDAYNAME2 Tuesday
+ SDAYNAME3 Wednesday
+ SDAYNAME4 Thursday
+ SDAYNAME5 Friday
+ SDAYNAME6 Saturday
+ SDAYNAME7 Sunday
+
+ SABBREVDAYNAME1 Mon
+ SABBREVDAYNAME2 Tue
+ SABBREVDAYNAME3 Wed
+ SABBREVDAYNAME4 Thu
+ SABBREVDAYNAME5 Fri
+ SABBREVDAYNAME6 Sat
+ SABBREVDAYNAME7 Sun
+
+ SMONTHNAME1 January
+ SMONTHNAME2 February
+ SMONTHNAME3 March
+ SMONTHNAME4 April
+ SMONTHNAME5 May
+ SMONTHNAME6 June
+ SMONTHNAME7 July
+ SMONTHNAME8 August
+ SMONTHNAME9 September
+ SMONTHNAME10 October
+ SMONTHNAME11 November
+ SMONTHNAME12 December
+ SMONTHNAME13 \x0000
+
+ SABBREVMONTHNAME1 Jan
+ SABBREVMONTHNAME2 Feb
+ SABBREVMONTHNAME3 Mar
+ SABBREVMONTHNAME4 Apr
+ SABBREVMONTHNAME5 May
+ SABBREVMONTHNAME6 Jun
+ SABBREVMONTHNAME7 Jul
+ SABBREVMONTHNAME8 Aug
+ SABBREVMONTHNAME9 Sep
+ SABBREVMONTHNAME10 Oct
+ SABBREVMONTHNAME11 Nov
+ SABBREVMONTHNAME12 Dec
+ SABBREVMONTHNAME13 \x0000
+
+
+ BEGINCALENDAR 3 ; Japanese Era - Year of the Emperor
+
+ SCALENDAR 3
+
+ SERARANGES 4 1989\xffff\x337b
+ 1926\xffff\x337c
+ 1912\xffff\x337d
+ 1868\xffff\x337e
+
+ SSHORTDATE 1 ggyyyy/MM/dd
+ SLONGDATE 1 ggyyyy'\x5e74'M'\x6708'd'\x65e5'
+
+ IF_NAMES 0
+
+
+ BEGINCALENDAR 4 ; Taiwan Era - Year of the Republic of China
+
+ SCALENDAR 4
+
+ SERARANGES 1 1912\xffff\x4e2d\x83ef\x6c11\x570b
+
+ SSHORTDATE 1 ggyyyy/MM/dd
+ SLONGDATE 1 ggyyyy MMMM dd
+
+ IF_NAMES 0
+
+
+ BEGINCALENDAR 5 ; Korean - Tangun Era
+
+ SCALENDAR 5
+
+ SERARANGES 1 2333\xffff
+
+ SSHORTDATE 1 yy-MM-dd
+ SLONGDATE 1 yyyy'\x355b' M'\x39da' d'\x3a0e'
+
+ IF_NAMES 0
+
+
+ENDCALENDAR
+ \ No newline at end of file
diff --git a/private/oleauto/src/dispatch/win16/ole2disp.def b/private/oleauto/src/dispatch/win16/ole2disp.def
new file mode 100644
index 000000000..c1e908230
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/ole2disp.def
@@ -0,0 +1,207 @@
+LIBRARY OLE2DISP
+DESCRIPTION 'OLE Automation Library'
+EXETYPE WINDOWS 3.0
+HEAPSIZE 0
+
+DATA PRELOAD MOVEABLE SINGLE
+CODE LOADONCALL MOVEABLE DISCARDABLE
+SEGMENTS
+ _TEXT PRELOAD MOVEABLE DISCARDABLE
+ _COMDATS PRELOAD MOVEABLE DISCARDABLE
+ RT LOADONCALL MOVEABLE DISCARDABLE
+ RPC LOADONCALL MOVEABLE DISCARDABLE
+ RPC2 LOADONCALL MOVEABLE DISCARDABLE
+ BSTR LOADONCALL MOVEABLE DISCARDABLE
+ RUNTIME LOADONCALL MOVEABLE DISCARDABLE
+ STDIMPL LOADONCALL MOVEABLE DISCARDABLE
+ UPS LOADONCALL MOVEABLE DISCARDABLE
+
+
+EXPORTS
+ WEP @0 RESIDENTNAME
+
+ DLLGETCLASSOBJECT @1
+
+ ; BSTR API
+ ;
+ SYSALLOCSTRING @2
+ SYSREALLOCSTRING @3
+ SYSALLOCSTRINGLEN @4
+ SYSREALLOCSTRINGLEN @5
+ SYSFREESTRING @6
+ SYSSTRINGLEN @7
+
+ ; VARIANT API
+ ;
+ VARIANTINIT @8
+ VARIANTCLEAR @9
+ VARIANTCOPY @10
+ VARIANTCOPYIND @11
+ VARIANTCHANGETYPE @12
+
+ ; VARIANT TIME API
+ ;
+ VARIANTTIMETODOSDATETIME @13
+ DOSDATETIMETOVARIANTTIME @14
+
+ ; SAFEARRAY API
+ ;
+ SAFEARRAYCREATE @15
+ SAFEARRAYDESTROY @16
+ SAFEARRAYGETDIM @17
+ SAFEARRAYGETELEMSIZE @18
+ SAFEARRAYGETUBOUND @19
+ SAFEARRAYGETLBOUND @20
+ SAFEARRAYLOCK @21
+ SAFEARRAYUNLOCK @22
+ SAFEARRAYACCESSDATA @23
+ SAFEARRAYUNACCESSDATA @24
+ SAFEARRAYGETELEMENT @25
+ SAFEARRAYPUTELEMENT @26
+ SAFEARRAYCOPY @27
+
+ ; IDispatch helpers/implementation
+ ;
+ DISPGETPARAM @28
+ DISPGETIDSOFNAMES @29
+ DISPINVOKE @30
+ CREATEDISPTYPEINFO @31
+ CREATESTDDISPATCH @32
+
+ ; IIDs
+ ;
+ _IID_IDispatch @33
+ _IID_IEnumVARIANT @34
+
+ ; Active Object API
+ ;
+ REGISTERACTIVEOBJECT @35
+ REVOKEACTIVEOBJECT @36
+ GETACTIVEOBJECT @37
+
+ ; additional SafeArray APIs
+ ;
+ SAFEARRAYALLOCDESCRIPTOR @38
+ SAFEARRAYALLOCDATA @39
+ SAFEARRAYDESTROYDESCRIPTOR @40
+ SAFEARRAYDESTROYDATA @41
+ SAFEARRAYREDIM @42
+
+ ; low-level VARTYPE coersion API
+ ;
+ VARI2FROMI4 @43
+ VARI2FROMR4 @44
+ VARI2FROMR8 @45
+ VARI2FROMCY @46
+ VARI2FROMDATE @47
+ VARI2FROMSTR @48
+ VARI2FROMDISP @49
+ VARI2FROMBOOL @50
+
+ VARI4FROMI2 @51
+ VARI4FROMR4 @52
+ VARI4FROMR8 @53
+ VARI4FROMCY @54
+ VARI4FROMDATE @55
+ VARI4FROMSTR @56
+ VARI4FROMDISP @57
+ VARI4FROMBOOL @58
+
+ VARR4FROMI2 @59
+ VARR4FROMI4 @60
+ VARR4FROMR8 @61
+ VARR4FROMCY @62
+ VARR4FROMDATE @63
+ VARR4FROMSTR @64
+ VARR4FROMDISP @65
+ VARR4FROMBOOL @66
+
+ VARR8FROMI2 @67
+ VARR8FROMI4 @68
+ VARR8FROMR4 @69
+ VARR8FROMCY @70
+ VARR8FROMDATE @71
+ VARR8FROMSTR @72
+ VARR8FROMDISP @73
+ VARR8FROMBOOL @74
+
+ VARDATEFROMI2 @75
+ VARDATEFROMI4 @76
+ VARDATEFROMR4 @77
+ VARDATEFROMR8 @78
+ VARDATEFROMCY @79
+ VARDATEFROMSTR @80
+ VARDATEFROMDISP @81
+ VARDATEFROMBOOL @82
+
+ VARCYFROMI2 @83
+ VARCYFROMI4 @84
+ VARCYFROMR4 @85
+ VARCYFROMR8 @86
+ VARCYFROMDATE @87
+ VARCYFROMSTR @88
+ VARCYFROMDISP @89
+ VARCYFROMBOOL @90
+
+ VARBSTRFROMI2 @91
+ VARBSTRFROMI4 @92
+ VARBSTRFROMR4 @93
+ VARBSTRFROMR8 @94
+ VARBSTRFROMCY @95
+ VARBSTRFROMDATE @96
+ VARBSTRFROMDISP @97
+ VARBSTRFROMBOOL @98
+
+ VARBOOLFROMI2 @99
+ VARBOOLFROMI4 @100
+ VARBOOLFROMR4 @101
+ VARBOOLFROMR8 @102
+ VARBOOLFROMDATE @103
+ VARBOOLFROMCY @104
+ VARBOOLFROMSTR @105
+ VARBOOLFROMDISP @106
+
+
+ ; Private API for use by TYPELIB.DLL
+ ;
+ DOINVOKEMETHOD @107
+
+
+ ; Varaint Coersion API Extension
+ VARIANTCHANGETYPEEX @108
+
+
+ ; SAFEARRAY API
+ ;
+ SAFEARRAYPTROFINDEX @109
+
+
+ ; Rich Error APIs
+ SETERRORINFO @110
+ GETERRORINFO @111
+ CREATEERRORINFO @112
+ _IID_IErrorInfo @113
+ _IID_ICreateErrorInfo @114
+ _IID_ISupportErrorInfo @115
+
+
+ ; More variant conversion routines
+ ;
+ VARUI1FROMI2 @116
+ VARUI1FROMI4 @117
+ VARUI1FROMR4 @118
+ VARUI1FROMR8 @119
+ VARUI1FROMCY @120
+ VARUI1FROMDATE @121
+ VARUI1FROMSTR @122
+ VARUI1FROMDISP @123
+ VARUI1FROMBOOL @124
+
+ VARI2FROMUI1 @125
+ VARI4FROMUI1 @126
+ VARR4FROMUI1 @127
+ VARR8FROMUI1 @128
+ VARDATEFROMUI1 @129
+ VARCYFROMUI1 @130
+ VARBSTRFROMUI1 @131
+ VARBOOLFROMUI1 @132
diff --git a/private/oleauto/src/dispatch/win16/ole2disp.rc b/private/oleauto/src/dispatch/win16/ole2disp.rc
new file mode 100644
index 000000000..4382cb340
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/ole2disp.rc
@@ -0,0 +1,92 @@
+/***
+*ole2disp.rc - Resource file for OLE2DISP.DLL
+*
+* Copyright (C) 1992 - 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is the resource file for OLE2DISP.DLL.
+*
+*
+*Revision History:
+* [00] 12-Jan-93 bradlo: added version resource.
+*
+*****************************************************************************/
+
+#include <windows.h>
+#include <ver.h>
+
+#include "verstamp.h"
+
+#ifdef _DEBUG
+# include "assert.dlg"
+#endif
+
+
+#ifndef OLEMINORVERS
+#define OLEMINORVERS 02 // assume OLE 2.02
+#endif //!OLEMINORVERS
+
+
+#if 0
+/* Define the version string with more preprocessor magic */
+#define STRING(x) #x
+#define VERSTRINGX(maj,min,rev) STRING(maj ## . ## min ## . ## rev ## \0)
+#define VERSTRING VERSTRINGX(rmj,rmm,rup)
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 2,OLEMINORVERS,rup,01
+PRODUCTVERSION 2,OLEMINORVERS,rup,01
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+FILEFLAGS VS_FF_DEBUG
+#else
+FILEFLAGS 0L
+#endif
+#if (OLEMINORVERS == 02)
+// re-distributable 16-bit DLL
+FILEOS VOS_DOS_WINDOWS16
+#else
+FILEOS VOS_DOS_WINDOWS32
+// non-re-distributable 16-bit DLL (shipped with the OS)
+#endif
+FILETYPE VFT_DLL
+FILESUBTYPE 0
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+#if (OLEMINORVERS == 02)
+// re-distributable 16-bit DLL
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE Automation Library\0"
+ VALUE "FileVersion", "2.02\0"
+ VALUE "InternalName", "OLE2DISP.DLL\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1992-1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.02 for Windows\0"
+ VALUE "ProductVersion", "2.02\0"
+ VALUE "Comments", "Windows OLE DLLs\0"
+#else
+// non-re-distributable 16-bit DLL (shipped with the OS)
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE 2.1 16/32 Interoperability Library\0"
+ VALUE "FileVersion", "2.1\0"
+ VALUE "InternalName", "OLE2DISP.DLL\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1992-1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.1 16/32 Interoperability for Windows NT\0"
+ VALUE "ProductVersion", "2.1\0"
+ VALUE "Comments", "Windows NT OLE 16/32 Interoperability DLLs\0"
+#endif
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
diff --git a/private/oleauto/src/dispatch/win16/ole2nls.def b/private/oleauto/src/dispatch/win16/ole2nls.def
new file mode 100644
index 000000000..15891ee79
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/ole2nls.def
@@ -0,0 +1,80 @@
+LIBRARY OLE2NLS
+DESCRIPTION 'National Language Support Library'
+EXETYPE WINDOWS 3.1
+HEAPSIZE 2048
+
+CODE MOVEABLE DISCARDABLE
+DATA MOVEABLE SINGLE
+SEGMENTS
+ _TEXT PRELOAD MOVEABLE DISCARDABLE
+ NLS0405_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0406_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0407_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0409_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS040a_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS040b_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS040c_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS040e_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0410_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0413_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0414_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0415_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0416_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0419_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS041b_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS041d_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0807_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0809_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS080a_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS080c_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0810_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0813_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0816_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0c07_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0c09_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0c0a_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0c0c_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS1009_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS100c_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS1409_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0404_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0411_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0412_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0804_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS1809_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0814_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS041f_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS040f_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0408_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0403_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0429_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS040d_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0401_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0801_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS0c01_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS1001_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS1401_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS1801_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS1c01_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS2001_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS2401_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS2801_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS2c01_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS3001_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS3401_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS3801_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS3c01_TEXT LOADONCALL MOVEABLE DISCARDABLE
+ NLS4001_TEXT LOADONCALL MOVEABLE DISCARDABLE
+
+EXPORTS
+ WEP @0 RESIDENTNAME
+
+ GETUSERDEFAULTLCID @1
+ GETSYSTEMDEFAULTLCID @2
+ GETUSERDEFAULTLANGID @3
+ GETSYSTEMDEFAULTLANGID @4
+ GETLOCALEINFOA @5
+ LCMAPSTRINGA @6
+ GETSTRINGTYPEA @7
+ COMPARESTRINGA @8
+ REGISTERNLSINFOCHANGED @9
diff --git a/private/oleauto/src/dispatch/win16/ole2nls.rc b/private/oleauto/src/dispatch/win16/ole2nls.rc
new file mode 100644
index 000000000..e65da66e9
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/ole2nls.rc
@@ -0,0 +1,93 @@
+/***
+*ole2nls.rc - Resource file for OLE2NLS.DLL
+*
+* Copyright (C) 1992 - 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is the resource file for OLE2NLS.DLL
+*
+*
+*Revision History:
+* [00] 13-Nov-92 petergo: Created.
+*
+*****************************************************************************/
+
+#include <windows.h>
+#include <ver.h>
+
+#include "verstamp.h"
+
+#ifdef _DEBUG
+# include "assert.dlg"
+#endif
+
+#include "nlsintrn.h"
+
+
+#ifndef OLEMINORVERS
+#define OLEMINORVERS 02 // assume OLE 2.02
+#endif //!OLEMINORVERS
+
+#if 0
+/* Define the version string with more preprocessor magic */
+#define STRING(x) #x
+#define VERSTRINGX(maj,min,rev) STRING(maj ## . ## min ## . ## rev ## \0)
+#define VERSTRING VERSTRINGX(rmj,rmm,rup)
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 2,OLEMINORVERS,rup,01
+PRODUCTVERSION 2,OLEMINORVERS,rup,01
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+FILEFLAGS VS_FF_DEBUG
+#else
+FILEFLAGS 0L
+#endif
+#if (OLEMINORVERS == 02)
+// re-distributable 16-bit DLL
+FILEOS VOS_DOS_WINDOWS16
+#else
+FILEOS VOS_DOS_WINDOWS32
+// non-re-distributable 16-bit DLL (shipped with the OS)
+#endif
+FILETYPE VFT_DLL
+FILESUBTYPE 0
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+#if (OLEMINORVERS == 02)
+// re-distributable 16-bit DLL
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE NLS Library\0"
+ VALUE "FileVersion", "2.02\0"
+ VALUE "InternalName", "OLE2NLS.DLL\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1992-1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.02 for Windows\0"
+ VALUE "ProductVersion", "2.02\0"
+ VALUE "Comments", "Windows OLE DLLs\0"
+#else
+// non-re-distributable 16-bit DLL (shipped with the OS)
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE 2.1 16/32 Interoperability Library\0"
+ VALUE "FileVersion", "2.1\0"
+ VALUE "InternalName", "OLE2NLS.DLL\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1992-1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.1 16/32 Interoperability for Windows NT\0"
+ VALUE "ProductVersion", "2.1\0"
+ VALUE "Comments", "Windows NT OLE 16/32 Interoperability DLLs\0"
+#endif
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
diff --git a/private/oleauto/src/dispatch/win16/oleconva.asm b/private/oleauto/src/dispatch/win16/oleconva.asm
new file mode 100644
index 000000000..5a3884cbf
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/oleconva.asm
@@ -0,0 +1,653 @@
+;***
+;oleconva.a - Machine-specific conversion helpers
+;
+; Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+; Information Contained Herein Is Proprietary and Confidential.
+;
+;Purpose:
+; Type conversion helper functions.
+;
+;Revision History:
+;[nnn] dd-mmm-yy alias___ Comment
+;
+; [] 18-Mar-93 timp Module created.
+;[001] 31-May-93 bradlo Added overflow checking.
+;[002] 12-Jul-93 timp Save/restore x87 control word.
+;
+;******************************************************************************
+
+
+ .286
+ .MODEL large
+
+EXTERNDEF PASCAL ReportOverflow:FAR
+
+ .DATA
+BigCyVal dw 0000,0000,0000,0ddfH
+
+ .CODE RT
+
+; floating point <-> currency scaling factor
+CYFACTOR equ 10000
+g_wCyFactor dw CYFACTOR
+g_fltCyFactor REAL4 10000.0
+
+TenTo18 dt 1.0E18
+
+g_CwStd dw 137fH ;Mask all errors, 64-bit, round near
+CwTrunc dw 1F7fH ;Mask all errors, 64-bit, chop
+
+FPERR equ 0DH ;Overflow, zero divide, invalid errs
+
+
+SETUP87 MACRO CwSave, cw:=<g_CwStd>
+ fstcw CwSave ;;Save existing environment
+ fldcw cw ;;Use our own CW
+ ENDM
+
+
+RESTORE87 MACRO CwSave
+ fclex ;;Prevent 486 bug on FLDCW
+ fldcw CwSave ;;Restore original CW
+ ENDM
+
+
+CHKERR87 MACRO CwSave, ErrLoc
+ fstsw ax ;;Get error flags
+ fclex ;;Don't let caller see errors
+ test al,FPERR ;;See if any errors
+ fldcw CwSave ;;Restore original CW
+ jnz ErrLoc ;;Go handle error if bit set
+ ENDM
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrCyFromI2(short sIn, CY *pcyOut)
+;
+;Purpose:
+; Convert Integer to Currency
+;
+;Entry:
+; sIn = Integer to convert
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrCyFromI2 PROC FAR PASCAL PUBLIC, sIn:SWORD, pcyOut:FAR PTR
+
+ mov ax,sIn
+ imul g_wCyFactor ;Scale the I2
+ les bx,pcyOut
+ mov es:[bx],ax ;Store result
+ mov es:[bx+2],dx
+ xchg ax,dx ;Move high word to ax
+ cwd ;Get sign extension
+ mov es:[bx+4],dx
+ mov es:[bx+6],dx
+
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+ErrCyFromI2 ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrCyFromI4(long lIn, CY *pcyOut)
+;
+;Purpose:
+; Convert Long to Currency
+;
+;Entry:
+; lIn = Long to convert
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrCyFromI4 PROC FAR PASCAL PUBLIC, lIn: SDWORD, pcyOut:FAR PTR
+
+;Mulitply I4 by CYFACTOR (=10000), result is currency
+;
+;This routine uses Booth's algorithm for a twos-complement signed
+;multiply. This algorithm says to compute the product with unsigned
+;arithmetic. Then correct the result by looking at the signs of the
+;original operands: for each operand that is negative, subtract the
+;other operand from the high half of the product. (The mathematical
+;proof is a fun 15-minute exercise. Go for it.) In our case, one of
+;the operands is a positive constant, so the correction is especially
+;easy.
+
+ mov ax,word ptr lIn ;Get low half of Long
+ mul g_wCyFactor ;Scale low half
+ les bx,pcyOut
+ mov es:[bx],ax ;Save low word of result
+ mov cx,dx
+ mov ax,word ptr lIn+2 ;Get high half of Long
+ mul g_wCyFactor ;Scale high half
+ add ax,cx
+ adc dx,0
+ mov es:[bx+2],ax ;Save mid-low word of result
+ xor ax,ax ;ax:dx has high half of CY result
+ cmp byte ptr lIn+3,0 ;Is input negative?
+ jns PosCy
+ sub dx,CYFACTOR
+ dec ax ;Previous sub will alway borrow
+PosCy:
+ mov es:[bx+4],dx ;Save mid-high word of result
+ mov es:[bx+6],ax ;Save high word of result
+
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+ErrCyFromI4 ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrCyFromR4(float FAR* pfltIn, CY *pcyOut)
+;
+;Purpose:
+; Convert Single to Currency
+;
+;Entry:
+; pfltIn = Single to convert
+; pcyOut = pointer to Currency to hold result
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrCyFromR4 PROC FAR PASCAL PUBLIC, pfltIn:FAR PTR, pcyOut:FAR PTR
+
+LOCAL cw:WORD
+
+ SETUP87 cw
+ les bx,pfltIn
+ fld dword ptr es:[bx] ;Load R4
+ fmul g_fltCyFactor ;Scale it
+
+ les bx,pcyOut
+ fistp qword ptr es:[bx] ;Store CY result
+
+ CHKERR87 cw, LOvfl
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+LOvfl:
+ call ReportOverflow ;DISP_E_OVERFLOW
+ ret
+
+ErrCyFromR4 ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrCyFromR8(double FAR* pdlbIn, CY FAR* pcyOut)
+;
+;Purpose:
+; Convert Double to Currency
+;
+;Entry:
+; pdblIn = Double to convert
+; pcyOut = pointer to Currency to hold result
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrCyFromR8 PROC FAR PASCAL PUBLIC, pdblIn:FAR PTR, pcyOut:FAR PTR
+
+LOCAL cw:WORD
+
+ SETUP87 cw
+ les bx,pdblIn
+ fld qword ptr es:[bx]
+ fmul g_fltCyFactor ;Scale it
+
+ les bx,pcyOut
+ fistp qword ptr es:[bx]
+
+ CHKERR87 cw, LOvfl
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+LOvfl:
+ call ReportOverflow ;DISP_E_OVERFLOW
+ ret
+
+ErrCyFromR8 ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrI2FromCy(CY cyIn, short *psOut)
+;
+;Purpose:
+; Convert Currency to Integer
+;
+;Entry:
+; cyIn = Currency to convert
+; psOut = pointer to Integer to hold result
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrI2FromCy PROC FAR PASCAL PUBLIC, cyIn:QWORD, psOut:FAR PTR
+
+LOCAL cw:WORD
+
+ SETUP87 cw
+ fild cyIn
+ fdiv g_fltCyFactor ;Remove scaling
+
+ les bx,psOut
+ fistp word ptr es:[bx]
+
+ CHKERR87 cw, LOvfl
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+LOvfl:
+ call ReportOverflow ;DISP_E_OVERFLOW
+ ret
+
+ErrI2FromCy ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrI4FromCy(CY cyIn, long *plOut)
+;
+;Purpose:
+; Convert Currency to Long
+;
+;Entry:
+; cyIn = Currency to convert
+; plOut = pointer to Long to hold result
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrI4FromCy PROC FAR PASCAL PUBLIC, cyIn:QWORD, plOut:FAR PTR
+
+LOCAL cw:WORD
+
+ SETUP87 cw
+ fild cyIn ;Load CY
+ fdiv g_fltCyFactor ;Remove scaling
+
+ les bx,plOut
+ fistp dword ptr es:[bx]
+
+ CHKERR87 cw, LOvfl
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+LOvfl:
+ call ReportOverflow ;DISP_E_OVERFLOW
+ ret
+
+ErrI4FromCy ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrR4FromCy(CY cyIn, float *pfltOut)
+;
+;Purpose:
+; Convert Currency to Single
+;
+;Entry:
+; cyIn = Currency to convert
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrR4FromCy PROC FAR PASCAL PUBLIC, cyIn:QWORD, pfltOut:FAR PTR
+
+LOCAL cw:WORD
+
+ SETUP87 cw
+ fild cyIn ;Load CY
+ fdiv g_fltCyFactor ;Remove scaling
+ les bx,pfltOut
+ fstp dword ptr es:[bx]
+
+ RESTORE87 cw
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+ErrR4FromCy ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT PASCAL ErrR8FromCy(CY cyIn, double FAR* pdblOut)
+;
+;Purpose:
+; Convert Currency to Double
+;
+;Entry:
+; cyIn = Currency to convert
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrR8FromCy PROC FAR PASCAL PUBLIC, cyIn:QWORD, pdblOut:FAR PTR
+
+LOCAL cw:WORD
+
+ SETUP87 cw
+ fild cyIn ;Load CY
+ fdiv g_fltCyFactor ;Remove scaling
+ les bx,pdblOut
+ fstp qword ptr es:[bx]
+
+ RESTORE87 cw
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+ErrR8FromCy ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrMultCyI4(CY cyIn, long lIn, CY *pcyOut);
+;
+;Purpose:
+; Multiply Currency by Long with Currency result
+;
+;Entry:
+; cyIn = Currency multiplicand
+; lIn = Long multiplier
+; pcyOut = Pointer to result Currency location
+;
+;Outputs:
+; return value = HRESULT
+;
+;*****
+
+ErrMultCyI4 PROC FAR PASCAL PUBLIC, cyIn:QWORD, lIn:DWORD, pcyOut:FAR PTR
+
+LOCAL cw:WORD
+
+ SETUP87 cw
+ fild cyIn
+ fild lIn
+ fmul ;Product
+
+ les bx,pcyOut ;Get pointer to result location
+ fistp qword ptr es:[bx] ;Save result
+
+ CHKERR87 cw, LOvfl
+ xor ax,ax ;NOERROR
+ xor dx,dx
+ ret
+
+LOvfl:
+ call ReportOverflow ;DISP_E_OVERFLOW
+ ret
+
+ErrMultCyI4 ENDP
+
+
+
+;******************************************************************************
+;
+;void FAR PASCAL DetectFbstpImplemented(void);
+;
+;Purpose:
+; Decide if FBSTP instruction is implemented or not - see oledisp.cpp for
+; details.
+;
+;Entry:
+; None.
+;
+;Outputs:
+; AX = 0 if FBSTP is broken, nonzero if FBSTP is OK.
+;
+;*****
+
+
+;This constant is the upper bits of the 64-bit integer representation
+;of 10^18. CY values at or above this will overflow FBSTP.
+
+;MAX18CY equ 0DE0B6B3H
+MAX18CY equ 0DE0H
+
+
+ .CODE _TEXT ; place in the same segment as the caller (LibMain)
+
+DetectFbstpImplemented proc far pascal public
+
+ mov bx, OFFSET BigCyVal ; ds:bx = ptr to BigCyVal
+
+ fild qword ptr [bx] ; load the CY value
+ fbstp tbyte ptr [bx] ; try to convert to BCD
+ fwait ; wait for it to finish
+
+ mov ax, WORD PTR [bx] ; get the low-word of the result
+ cmp ax, 9456h ; does it match expected val?
+ jz @F ; brif so - return the non-zero ax reg
+
+ fstp st ; fbstp failed - clean up the 0 in ST
+ xor ax, ax ; return 0
+
+@@:
+ ret
+
+DetectFbstpImplemented endp
+
+ .CODE RT
+
+
+
+
+
+;******************************************************************************
+;
+;void NEAR PASCAL DoFbstp(CY NEAR *pcyIn, DIGARY NEAR *pdigOut);
+;
+;Purpose:
+; Do x87 FBSTP instruction on currency type. Check to see if CY is too
+; big first and compute 19th digit separately.
+;
+;Entry:
+; pcyIn = Type currency to convert
+; pdigOut = pointer to result packed BCD digits
+;
+;Outputs:
+; None.
+;
+;*****
+
+DoFbstp proc near pascal public, pcyIn:near ptr qword, pdigOut:near ptr tbyte
+
+LOCAL cw:WORD, iTemp:WORD
+
+ mov bx,pcyIn
+ fild qword ptr ss:[bx]
+ mov ax,ss:[bx+6]
+ mov bx,pdigOut
+ cmp ax,MAX18CY
+ jge Get19
+ cmp ax,-MAX18CY
+ jle Get19
+ fbstp tbyte ptr ss:[bx]
+ fwait
+ ret
+
+Get19:
+ SETUP87 cw,CwTrunc
+ fld TenTo18
+ fld st(1) ;Copy input
+ fdiv st,st(1) ;Compute last digit
+ frndint ;Chop to integer
+ fist iTemp ;Get value of MSD
+ fmul
+ fsub ;Remove MSD
+ fbstp tbyte ptr ss:[bx]
+ mov ax,[iTemp]
+;Take absolute value
+ cwd ;Extend sign through dx
+ xor ax,dx ;NOT if negative
+ sub ax,dx ;INC if negative
+ RESTORE87 cw
+ and dl,80h ;set sign bit in AL
+ or al, dl
+ mov ss:[bx+9],al ;Set 19th digit & sign bit
+ ret
+
+DoFbstp endp
+
+
+;******************************************************************************
+;
+;int ConvFloatToAscii(double dblIn, DIGARY NEAR *pdigOut)
+;
+;Purpose:
+; Convert double to packed BCD digit string plus base-10 exponent.
+;
+;Entry:
+; dblIn = Type double to convert
+; pdigOut = pointer to result packed BCD digits
+;
+;Outputs:
+; return value = power of 10 of the 18-digit integer.
+;
+;*****
+
+ConvFloatToAscii PROC FAR PASCAL PUBLIC, dblIn:REAL8, pdigOut:NEAR PTR TBYTE
+
+LOCAL cw:WORD, temp:TBYTE
+
+ SETUP87 cw
+ fld dblIn ;Put double on x87
+
+;What we want now is equivalent to FXTRACT, but it's faster just
+;to store the tbyte and look at it directly. The reasone we don't
+;use the double's exponent is in case it's denormal.
+;
+ fld st ;Make a copy
+ fstp temp
+ mov ax,word ptr [temp+8] ;Get word with exponent
+ and ah,not 80H ;Zero out sign
+
+;2^59 = 5.7E17 (18 digits). A 59-bit integer could be 2^59 - 1.
+;Our goal now is to find a power of ten to multiply by that will give us
+;a 55- to 59-bit integer. We'll target 58 bits so the multiply can carry
+;to 59, and truncate while figuring the power so we never exceed it.
+
+ sub ax,16382 + 58 ;Remove bias and 58 bits
+
+;Find power of 10 by multiplying base 2 exponent by log10(2)
+
+ mov dx,19728 ;log10(2) * 2^16 = .30103 * 65536
+ imul dx
+ add ax,0FFFFH ;Round up
+ adc dx,0
+ mov ax,dx
+ call MulPower10 ;ax preserved
+ mov bx,pdigOut
+ fbstp tbyte ptr ss:[bx]
+ RESTORE87 cw
+ ret
+
+ConvFloatToAscii endp
+
+
+MulPower10:
+;dx = negative of power of 10 required
+;ax preserved
+ or dx,dx
+ jz NoPower
+ push si
+ mov si,offset cs:tNegPower
+ jns GetPower
+ mov si,offset cs:tPosPower
+ neg dx
+GetPower:
+ mov bx,dx
+ and bx,0FH ;Use low 4 exponent bits
+ jz NoMul
+ dec bx
+ imul bx,size tbyte ;Index into table of powers
+ fld tbyte ptr cs:[bx+si]
+ fmul
+NoMul:
+ add si,15 * size tbyte ;Advance to next table
+ shr dx,4 ;Get next exponent bits
+ jnz GetPower
+ pop si
+NoPower:
+ ret
+
+
+;******************************************************************************
+;
+;Power of 10 tables
+;
+;Two tables: one positive powers, the other negative. Each table is broken
+;into three groups: 10^1 to 10^15 by 1, 10^16 to 10^240 by 16, and
+;(theoretically) 10^256 to ... by 256. However, because the maximum value
+;is about 10^309, only one entry in the last group is needed (10^256), so
+;it is slipped on to the end of the previous group.
+
+
+SetPower10 macro Power
+ dt 1.0E&Power
+ ENDM
+
+
+tPosPower label Tbyte
+
+Power = 1
+ REPT 15
+ SetPower10 %Power
+Power = Power + 1
+ ENDM
+
+ REPT 16
+ SetPower10 %Power
+Power = Power + 16
+ ENDM
+
+
+tNegPower label Tbyte
+
+Power = 1
+ REPT 15
+ SetPower10 -%Power
+Power = Power + 1
+ ENDM
+
+ REPT 16
+ SetPower10 -%Power
+Power = Power + 16
+ ENDM
+
+
+
+ END
diff --git a/private/oleauto/src/dispatch/win16/oledisp.cpp b/private/oleauto/src/dispatch/win16/oledisp.cpp
new file mode 100644
index 000000000..15da4d3af
--- /dev/null
+++ b/private/oleauto/src/dispatch/win16/oledisp.cpp
@@ -0,0 +1,89 @@
+/***
+*oledisp.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the oledisp.dll initialization and termination code.
+*
+*Revision History:
+*
+* [00] 15-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+ASSERTDATA
+
+extern "C" {
+HINSTANCE g_hinstDLL = NULL;
+
+// non-zero if fbstp instruction works. Zero on WFW 3.11, Daytona WOW on
+// Intel, Mips, and Alpha. When zero, the instruction is a no-op and doesn't
+// pop a value from the FP stack or write to the destination address. :-(
+BOOL g_fbstpImplemented;
+extern BOOL FAR PASCAL DetectFbstpImplemented(void);
+}
+
+//---------------------------------------------------------------------------
+// Initialize library.
+// This routine is called from the DLL entry point in LIBINIT.ASM
+// which is called when the first client loads the DLL.
+//
+// NOTE: other one time initialization occurs in ctors for global objects
+//---------------------------------------------------------------------------
+extern "C" BOOL FAR PASCAL
+LibMain(HINSTANCE hinst, HANDLE segDS, UINT cbHeapSize, LPSTR lpCmdLine)
+{
+ (segDS, cbHeapSize, lpCmdLine); // UNUSED
+
+ g_hinstDLL = hinst;
+
+ // detect if fpstb instruction is implemented or not (VBA2 #3514)
+ // The rules are:
+ // Win16 w/ 80x87 - use fbstp
+ // Win16 no 80x87 - don't use fbstp - it GPFs
+ // WOW - don't use - unreliable
+ //
+ if (GetWinFlags() & WF_80x87) {
+ // we're running either on Win16 with a math coprocessor or on Mips/Alpha
+ // WOW - if on WOW, don't use fbstp
+ g_fbstpImplemented = DetectFbstpImplemented();
+ }
+
+ // register a callback function with ole2nls.dll which gets called
+ // whenever WIN.INI changes (and once at startup).
+ RegisterNLSInfoChanged((FARPROC)NLSInfoChangedHandler);
+
+ return TRUE;
+}
+
+
+//---------------------------------------------------------------------------
+// Handle exit notification from Windows.
+// This routine is called by Windows when the library is freed
+// by its last client.
+//---------------------------------------------------------------------------
+extern "C" void _fpmath(void);
+
+extern "C" int FAR PASCAL __export _WEP(BOOL fSystemExit)
+{
+ UNUSED(fSystemExit);
+
+ // unregister the callback with ole2nls.dll
+ RegisterNLSInfoChanged((FARPROC)NULL);
+
+ // NOTE: The C8 runtime does not correctly terminate the
+ // floating point emulator, so we call the termination routine
+ // ourselves below
+ //
+ _asm{
+ mov bx,2
+ call _fpmath
+ }
+
+ return 1;
+}
diff --git a/private/oleauto/src/dispatch/win32/alpha/invoke.s b/private/oleauto/src/dispatch/win32/alpha/invoke.s
new file mode 100644
index 000000000..02cc51580
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/alpha/invoke.s
@@ -0,0 +1,728 @@
+// TITLE("invoke.s for OLE Automation")
+//++
+//
+// Copyright (c) 1993 Microsoft Corporation
+//
+// Module Name:
+//
+// invoke.s
+//
+// Abstract:
+//
+// This module implements the low-level v-table based dispatching
+// support for the default implementation of IDispatch::Invoke()
+// on DEC Alpha hardware.
+//
+// Author:
+//
+// tomteng 11-2-93: Created
+//
+// Environment:
+//
+// User mode.
+//
+// Revision History:
+//
+//--
+
+#include "ksalpha.h"
+
+ .extern g_S_OK 8
+ .extern g_E_INVALIDARG 8
+
+
+// Note: the following must match the definition of VARIANT in variant.h
+
+#define VT_EMPTY 0
+#define VT_NULL 1
+#define VT_I2 2
+#define VT_I4 3
+#define VT_R4 4
+#define VT_R8 5
+#define VT_CY 6
+#define VT_DATE 7
+#define VT_BSTR 8
+#define VT_DISPATCH 9
+#define VT_ERROR 10
+#define VT_BOOL 11
+#define VT_VARIANT 12
+#define VT_UNKNOWN 13
+#define VT_MAX 14
+// 14 is unused
+// 15 is unused
+//#define VT_I1 16
+#define VT_UI1 17
+
+#define VT_BYREF 0x4000
+#define VT_ARRAY 0x2000
+#define VT_NOMODE 0x00ff
+
+
+ .struct 0
+vt: .space 2
+wReserved1: .space 2
+wReserved2: .space 2
+wReserved3: .space 2
+dw0: .space 2
+dw1: .space 2
+dw2: .space 2
+dw3: .space 2
+VariantArg:
+
+#define VARIANT_DATA_OFFSET 8 // offset to union of data
+
+
+
+ SBTTL("InvokeStdCall")
+//++
+//
+// ULONG // HRESULT
+// InvokeStdCall (
+// IN PVOID _this, // void FAR*
+// IN DWORD oVft, // unsigned int
+// IN DWORD vtReturn, // unsigned int
+// IN DWORD cActuals, // unsigned int
+// IN PVOID rgvt, // VARTYPE FAR*
+// IN PVOID rgpvarg, // VARIANTARG FAR* FAR*
+// OUT PVOID pvargResult // VARIANT FAR*
+// )
+//
+// Routine Description:
+//
+// Invoke a virtual StdCall method using the given _this pointer,
+// method index and array of parameters.
+//
+// Arguments:
+//
+// _this (a0) - Supplies a pointer to the method to invoke.
+//
+// oVft (a1) - vTable offset into _this ptr
+//
+// vtReturn (a2) - the VARTYPE of the return value.
+//
+// cActuals (a3) - count of the number of actuals.
+//
+// rgvt 4*4(sp) (a4) - array of VARTYPES describing the methods formals.
+//
+// rgpvarg 5*4(sp) (a5) - array of VARIANTARG*s, which map the actuals by
+// position.
+//
+// pvargResult 6*4(sp) - VARIANTARG containing the method return value.
+//
+// Return Value:
+//
+// v0 - g_S_OK (extern value)
+// g_E_INVALIDARG (extern value)
+//
+// Implementation Note:
+//
+// ALPHA StdCall method arguments are push on the stack left to right.
+// The stack grows downward (pushing decrements stack address). Data
+// alignment on the stack starts from arg1 upward. Callee cleans.
+//
+// Per ALPHA calling conventions, the following rules are followed:
+//
+// 1. Stack frame must be OCTAWORD (128-bits) aligned.
+//
+// 2. All arguments are push on the stack as a QWORD (64-bits).
+//
+// 3. Structures are pushed on the stack by value. They are returned in
+// the v0 register which contains the address of a hidden argument
+// (vargHiddenParm) allocated by the caller and pushed as the second
+// argument [a1] on the stack (1st argument [a0] for non-vtable
+// calls).
+//
+// 4. On vtable-based calls, _this is passed as the first argument [a0].
+//
+// 5. Six integer/floating registers [a0 - a5] & [f16 - f21] must be set
+// before calling, if used. Type and order of arguments determine the
+// registers used. (e.g., (int, float) means that a0 <- int;
+// f17 <- float)
+//
+// 6. Return values are handled as follows:
+//
+// vartype fundamental return register
+// ---------------------------------------------------
+// VT_UI1 unsigned char v0
+// VT_I2 short v0
+// VT_I4 long v0
+// VT_R4 float f0
+// VT_R8 double f0
+// VT_DATE double f0
+// VT_CY struct v0 (address of struct return)
+// VT_BSTR char FAR* v0
+// VT_UNKNOWN void FAR* v0
+// VT_DISPATCH void FAR* v0
+// VT_ERROR long v0
+// VT_BOOL short v0
+// VT_VARIANT VARIANTARG v0 (address of struct return)
+//
+//
+// NOTES: NO support for VT_ARRAY
+//
+//--
+
+
+// Stack Frame
+ .struct 0
+
+SavedS0: .space 8
+SavedS1: .space 8
+SavedSP: .space 8
+SavedRA: .space 8
+
+ .align 8
+vargHiddenParm: .space 8*4 // temporary for struct return
+
+_this: .space 8 // a0 0*8(sp)
+oVft: .space 8 // a1 1*8(sp) arg only takes 2 bytes
+vtReturn: .space 8 // a2 2*8(sp) arg only takes 2 bytes
+cActuals: .space 8 // a3 3*8(sp)
+rgvt: .space 8 // 4*8(sp)
+rgpvarg: .space 8 // 5*8(sp)
+
+StackFrameSize:
+pvargResult: .space 8 // 6*8(sp)
+
+
+ .text
+ .align 4
+ .globl InvokeStdCall
+ .ent InvokeStdCall, 0
+
+InvokeStdCall:
+ .frame sp, StackFrameSize, ra
+
+ lda sp, -StackFrameSize(sp) // Setup our stack frame
+
+ stq s0, SavedS0(sp) // Save our current s0
+ stq s1, SavedS1(sp) // Save our current s1
+ stq ra, SavedRA(sp) // Save $ra
+ stq sp, SavedSP(sp) // Save our current sp
+
+ stq a0, _this(sp) // Save
+ stq a1, oVft(sp) // all
+ stq a2, vtReturn(sp) // arg
+ stq a3, cActuals(sp) // regs
+ stq a4, rgvt(sp)
+ stq a5, rgpvarg(sp)
+
+
+ // cannot return byRef
+ //
+ mov a2, t0
+ and t0, VT_BYREF // Isolate VT_Mode bits
+ bne t0, LRetInvalidArg // Check VT_Type
+
+ // Setup arguments if any
+ //
+ mov sp, s1 // s1 = new stack pointer
+ beq a3, LSetupParms
+
+
+LCalcStackSize:
+
+ // calculate space need for pushing arguments on stack
+
+ ldq t3, rgvt(sp) // t3 = &rgvt[0]
+ mov 1, t9 // t9 = running arg count
+
+ ldq t1, vtReturn(sp) // check if struct return
+#if 0
+ and t1, VT_NOMODE
+#else
+ and t1, VT_BYREF | VT_ARRAY, t0 // Byref's aren't struct's
+ bne t0, LCalcStackLoop
+#endif
+
+ lda t0, rgfStructReturn
+ addq t0, t1, t0
+ ldl t0, 0(t0)
+ and t0, 0xff
+ beq t0, LCalcStackLoop
+
+ addq t9, 1, t9
+
+
+LCalcStackLoop:
+
+ ldl t6, (t3) // t6 = rgvt[i]
+ mov 8, t4 // t4 = default size
+
+ mov t6, t1
+ and t1, VT_NOMODE // Turn off mode bits
+ cmpeq t1, VT_UI1, t0
+ bne t0, LValidVartype1
+ cmplt t1, VT_MAX, t0
+ beq t0, LRetInvalidArg // Error if Max or above
+
+LValidVartype1:
+ addq t9, 1, t9 // bump arg count
+ cmpeq t6, VT_VARIANT, t0
+ addq t9, t0, t9 // BYVAL VARIANT bump twice
+
+ cmplt t9, 7, t0
+ bne t0, LCalcNext // Skip arguments in registers
+
+ cmpeq t6, VT_VARIANT, t0 // BYVAL VARIANT?
+ beq t0, LCalcAdd
+
+ mov 16, t4 // BYVAL VARIANT takes 16 bytes
+
+LCalcAdd:
+
+ subq s1, t4, s1 // decrement stack
+
+
+LCalcNext:
+
+ addq t3, 2, t3 // &rgvt[i++]
+ addq a3, -1, a3 // cActual--
+ bne a3, LCalcStackLoop // If more args, go again
+
+ mov s1, t0 // make sure new 0(sp)
+ and t0, 0xf // at QWORD (128-bit) boundary
+ beq t0, LSetupParms
+
+ addq s1, -8, s1 // aligned stack
+
+
+
+LSetupParms:
+
+ mov s1, s0 // s0 = temporary stack loc
+
+ ldq t2, rgpvarg(sp) // t2 = &rgpvarg[0]
+ ldq t3, rgvt(sp) // t3 = &rgvt[0]
+ ldq t4, cActuals(sp) // t4 = cActuals
+
+ addq t4, -1, t0
+ sll t0, 2
+ addq t2, t0, t8 // t8 = &rgpvarg[cArgs - 1]
+ mov zero, t9 // t9 = running argument count
+
+
+LPushThis: // this already in a0
+
+ ldq a0, _this(sp)
+ addq t9, 1, t9 // Bump up argument count
+
+
+LPushHiddenArg:
+
+ // Check if we need to return a structure, if so
+ // move the address of the vargHiddenParm as
+ // the second (hidden) argument
+ //
+
+ ldq t1, vtReturn(sp)
+#if 0
+ and t1, VT_NOMODE // Turn off mode bits
+#else
+ and t1, VT_BYREF | VT_ARRAY, t0 // Byref's aren't struct's
+ bne t0, LCheckArgs
+#endif
+
+ lda t0, rgfStructReturn // t0 = &rgfStructReturn
+ addq t0, t1, t0 // t0 = &rgfStructReturn[i]
+ ldl t0, 0(t0) // t0 = rgfStructReturn[i]
+ and t0, 0xff
+
+ beq t0, LCheckArgs // Jmp if no struc to be ret
+
+ lda a1, vargHiddenParm(sp) // Have to push an extra parm
+
+ addq t9, 1, t9 // Bump up argument count
+
+
+LCheckArgs:
+
+ beq t4, LDoCall
+
+
+LPushArgs:
+
+ ldl t5, (t2) // t5 = rgpvarg[i]
+ ldl t6, (t3) // t6 = rgvt[i]
+
+ and t6, VT_BYREF | VT_ARRAY // Isolate mode bits
+ bne t6, LPush4 // all ByRefs are sizeof(FAR*)
+
+ ldl t6, (t3) // t6 = rgvt[i]
+ and t6, VT_NOMODE // Turn off mode bits
+ cmpeq t6, VT_UI1, t0
+ bne t0, LValidVartype2
+ cmplt t6, VT_MAX, t0
+ beq t0, LRetInvalidArg // Error if Max or above
+
+LValidVartype2:
+ mov t6, t1
+ sll t1, 3 // ADDRESS offset
+ lda t0, LPushValJmpTab // Get Address of ret table
+ addq t0, t1, t0 // Get Address of ret routine
+ ldq t0, 0(t0)
+ jmp (t0) // Go execute the push code
+
+
+LPush2: // 4 bytes of data
+
+ ldl t7, dw0(t5) // Push HWORD (as 32-bit)
+ sll t7, 48, t7
+ sra t7, 48, t7
+
+ cmplt t9, 6, t0
+ bne t0, LIntReg // Pass argument in register
+
+ stq t7, 0(s0) // Save on stack
+ addq s0, 8, s0 // adjust arg loc
+ br LNextArg
+
+
+LPush4: // 4 bytes of data
+
+ ldl t7, dw0(t5) // Push 1st WORD
+
+ cmplt t9, 6, t0
+ bne t0, LIntReg // Pass argument in register
+
+ stq t7, 0(s0)
+ addq s0, 8, s0 // adjust arg loc
+ br LNextArg
+
+
+LPushR4:
+
+ lds f10, dw0(t5)
+
+ cmplt t9, 6, t0
+ bne t0, LFloatReg // Pass argument in register
+
+ sts f10, 0(s0)
+ addq s0, 8, s0 // adjust arg loc
+ br LNextArg
+
+
+LPushR8: // 8 bytes of R8 data
+
+ ldt f10, dw0(t5)
+
+ cmplt t9, 6, t0
+ bne t0, LFloatReg // Pass argument in register
+
+ stt f10, 0(s0)
+ addq s0, 8, s0 // adjust arg loc
+ br LNextArg
+
+
+LPush8: // 8 bytes of data
+
+ ldq t7, dw0(t5)
+
+ cmplt t9, 6, t0
+ bne t0, LIntReg // Pass argument in register
+
+ stq t7, 0(s0)
+ addq s0, 8, s0 // adjust arg loc
+ br LNextArg
+
+
+LPushVar: // 16 bytes of data
+
+ ldq t7, 0(t5)
+ ldq t10, 8(t5)
+
+ cmplt t9, 6, t0
+ bne t0, LPushVarReg // Pass argument in register
+
+ stq t7, 0(s0)
+ stq t10, 8(s0)
+
+ addq s0, 16, s0 // adjust arg loc
+ br LNextArg
+
+
+LPushVarReg:
+
+ mov t9, t0
+ addq t0, -1
+ mulq t0, 12
+
+ lda t1, LVPushReg
+ addq t1, t0, t0
+
+ addq t9, 2, t9 // Bump up argument count
+ jmp (t0)
+
+
+LVPushReg:
+
+ mov t7, a1
+ mov t10, a2
+ br LNextArg
+ mov t7, a2
+ mov t10, a3
+ br LNextArg
+ mov t7, a3
+ mov t10, a4
+ br LNextArg
+ mov t7, a4
+ mov t10, a5
+ br LNextArg
+ mov t7, a5
+ stq t10, 0(s0)
+ addq s0, 8, s0 // adjust arg loc
+ br LNextArg
+
+
+LIntReg: // load integer registers
+
+ mov t9, t0
+ sll t0, 3
+
+ lda t1, LIPushReg
+ addq t1, t0, t0
+
+ addq t9, 1, t9 // Bump up argument count
+ jmp (t0)
+
+
+LIPushReg:
+
+ mov t7, a0
+ br LNextArg
+ mov t7, a1
+ br LNextArg
+ mov t7, a2
+ br LNextArg
+ mov t7, a3
+ br LNextArg
+ mov t7, a4
+ br LNextArg
+ mov t7, a5
+ br LNextArg
+
+
+LFloatReg: // load floating registers
+
+ mov t9, t0
+ sll t0, 3
+
+ lda t1, LFPushReg
+ addq t1, t0, t0
+
+ addq t9, 1, t9 // Bump up argument count
+ jmp (t0)
+
+
+LFPushReg:
+
+ fmov f10, f16
+ br LNextArg
+ fmov f10, f17
+ br LNextArg
+ fmov f10, f18
+ br LNextArg
+ fmov f10, f19
+ br LNextArg
+ fmov f10, f20
+ br LNextArg
+ fmov f10, f21
+ br LNextArg
+
+
+LNextArg:
+
+ addq t2, 4, t2 // &rgpvarg[i++]
+ addq t3, 2, t3 // &rgvt[i++]
+
+ cmple t2, t8, t0
+ bne t0, LPushArgs // If more args, go again
+
+
+LDoCall:
+
+ // load the vtable offset
+ //
+ ldl t0, 0(a0) // address of vtable
+
+ ldq t1, oVft(sp) // Get the vtable offset
+ addl t0, t1, t0 // Get addr of ptr to func
+ ldl t0, (t0) // Get ptr to func in vtable
+
+
+ // call virtual member function
+ //
+ mov sp, s0 // Save SP
+ mov s1, sp
+ jsr ra, (t0) // Invoke the Idispatch func
+ mov s0, sp // Restore SP
+
+
+ // Get return argument
+ //
+
+ ldq t1, vtReturn(sp) // t1 = vtType to return
+ ldq t3, pvargResult(sp) // Get RetData Area
+ stl t1, vt(t3) // varResult->vt
+
+ mov t1, t2
+ and t2, VT_BYREF | VT_ARRAY // Check ret mode
+ bne t2, LRetPtr // If !0 -> go ret a ptr
+
+ and t1, VT_NOMODE // Turn off mode bits
+ cmpeq t1, VT_UI1, t0
+ bne t0, LValidVartype3
+ cmplt t1, VT_MAX, t0
+ beq t0, LRetInvalidArg // Error if Max or above
+
+LValidVartype3:
+ sll t1, 3 // ADDRESS offset
+ lda t2, LRetValJmpTab // Get Address of ret table
+ addq t2, t1, t2 // Get Address of ret routine
+ ldq t2, 0(t2)
+ jmp (t2) // Go execute the ret code
+
+
+LRetI4:
+LRetPtr:
+
+ stl v0, VARIANT_DATA_OFFSET(t3)
+ br LDone // Done
+
+
+
+LRetI2:
+LRetUI1:
+
+ stl v0, VARIANT_DATA_OFFSET(t3)
+ br LDone // Done
+
+
+LRetR4:
+
+ sts f0, VARIANT_DATA_OFFSET(t3) //*
+ br LDone // Done
+
+
+
+LRetR8:
+
+ stt f0, VARIANT_DATA_OFFSET(t3) //*
+ br LDone // Done
+
+
+
+LRetCy:
+
+ ldl t1, 0(v0) // cy.Lo
+ stl t1, dw0(t3)
+
+ ldl t1, 4(v0) // cy.Hi
+ stl t1, dw2(t3) //*
+
+ br LDone // Done
+
+
+LRetVar:
+ ldq t1, 0(v0) // Get 1st QWORD
+ stq t1, 0(t3) // Save it in pvArgResult
+
+ ldq t1, 8(v0) // Get 2nd QWORD
+ stq t1, 8(t3) // Store 2nd QWORD
+
+
+LDone:
+
+ lda t0, g_S_OK //*v0 = g_S_OK
+ ldl v0, (t0)
+ br ExitInvoke
+
+
+LRetInvalidArg:
+
+ lda t0, g_E_INVALIDARG // v0 = g_E_INVALIDARG
+ ldl v0, (t0)
+
+
+ExitInvoke:
+
+ ldq s0, SavedS0(sp) // Restore s0
+ ldq s1, SavedS1(sp) // Restore s1
+ ldq ra, SavedRA(sp) // Restore ra
+ ldq sp, SavedSP(sp) // Restore sp
+
+ lda sp, StackFrameSize(sp)
+ ret ra
+
+
+ .align 2
+rgfStructReturn:
+ .byte 0 // VT_EMPTY
+ .byte 0 // VT_NULL
+ .byte 0 // VT_I2
+ .byte 0 // VT_I4
+ .byte 0 // VT_R4
+ .byte 0 // VT_R8
+ .byte 1 // VT_CY
+ .byte 0 // VT_DATE
+ .byte 0 // VT_BSTR
+ .byte 0 // VT_DISPATCH
+ .byte 0 // VT_ERROR
+ .byte 0 // VT_BOOL
+ .byte 1 // VT_VARIANT
+ .byte 0 // VT_UNKNOWN
+ .byte 0 // unused
+ .byte 0 // unused
+ .byte 0 // VT_I1
+ .byte 0 // VT_UI1
+
+
+
+
+ .align 8
+LPushValJmpTab:
+ .quad LNextArg // VT_EMPTY [0]
+ .quad LPush4 // VT_NULL [4]
+ .quad LPush2 // VT_I2 [2]
+ .quad LPush4 // VT_I4 [4]
+ .quad LPushR4 // VT_R4 [4]
+ .quad LPushR8 // VT_R8 [8]
+ .quad LPush8 // VT_CY [8]
+ .quad LPushR8 // VT_DATE [8]
+ .quad LPush4 // VT_BSTR [4]
+ .quad LPush4 // VT_DISPATCH [4]
+ .quad LPush4 // VT_ERROR [4]
+ .quad LPush2 // VT_BOOL [2]
+ .quad LPushVar // VT_VARIANT [16]
+ .quad LPush4 // VT_UNKNOWN [4]
+ .quad 0 // unused
+ .quad 0 // unused
+ .quad 0 // unused (VT_I1)
+ .quad LPush2 // VT_UI1
+
+
+ .align 8
+LRetValJmpTab:
+ .quad LDone // VT_EMPTY
+ .quad LRetI4 // VT_NULL
+ .quad LRetI2 // VT_I2
+ .quad LRetI4 // VT_I4
+ .quad LRetR4 // VT_R4
+ .quad LRetR8 // VT_R8
+ .quad LRetCy // VT_CY
+ .quad LRetR8 // VT_DATE
+ .quad LRetPtr // VT_BSTR
+ .quad LRetPtr // VT_DISPATCH
+ .quad LRetI4 // VT_ERROR
+ .quad LRetI2 // VT_BOOL
+ .quad LRetVar // VT_VARIANT
+ .quad LRetPtr // VT_UNKNOWN
+ .quad 0 // unused
+ .quad 0 // unused
+ .quad 0 // unused (VT_I1)
+ .quad LRetI2 // VT_UI1
+
+
+ .end InvokeStdCall
+
+
diff --git a/private/oleauto/src/dispatch/win32/i386/invoke.asm b/private/oleauto/src/dispatch/win32/i386/invoke.asm
new file mode 100644
index 000000000..3e5dfe703
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/i386/invoke.asm
@@ -0,0 +1,832 @@
+; TITLE invoke.asm
+;***
+;invoke.asm - automatic table driven method dispatch
+;
+; Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+; Information Contained Herein Is Proprietary and Confidential.
+;
+;Purpose:
+; This file contains the low level support for the default
+; implementaion of ITypeInfo::Invoke().
+;
+;Revision History:
+;
+; [00] 1-Apr-93 tomteng: Created from win16 invoke.asm
+; [01] 2-Aug-94 barrybo: Added native Universal Method
+;
+;Implementation Notes:
+;
+;******************************************************************************
+
+ .386
+ .MODEL flat, C
+
+ OPTION CASEMAP:NONE
+
+
+extern g_S_OK:DWORD
+extern g_E_INVALIDARG:DWORD
+ProxyMethod PROTO STDCALL pProx:DWORD, n:DWORD, args:DWORD, pbStackCleanup:DWORD
+
+
+;; Note: the following must match the definitions from dispatch.h
+;;
+VT_EMPTY equ 0
+VT_NULL equ 1
+VT_I2 equ 2
+VT_I4 equ 3
+VT_R4 equ 4
+VT_R8 equ 5
+VT_CY equ 6
+VT_DATE equ 7
+VT_BSTR equ 8
+VT_DISPATCH equ 9
+VT_ERROR equ 10
+VT_BOOL equ 11
+VT_VARIANT equ 12
+VT_UNKNOWN equ 13
+
+VT_MAX equ 14
+;; 14 is unused
+;; 15 is unused
+;VT_I1 equ 16
+VT_UI1 equ 17
+
+
+;; Note: the following must match the definition of VARIANT in dispatch.h
+;;
+VARIANTARG STRUCT
+ vt DW ?
+ wReserved1 DW ?
+ wReserved2 DW ?
+ wReserved3 DW ?
+ dw0 DW ?
+ dw1 DW ?
+ dw2 DW ?
+ dw3 DW ?
+VARIANTARG ENDS
+
+;; offset of the data from the beginning of the struct
+VARIANT_DATA_OFFSET equ 8
+
+
+ .CONST
+
+;; ammout of data to be pushed for the corresponding VARTYPE
+;;
+
+rgcbVtSize BYTE 0 ; VT_EMPTY
+ BYTE 4 ; VT_NULL
+ BYTE 2 ; VT_I2
+ BYTE 4 ; VT_I4
+ BYTE 4 ; VT_R4
+ BYTE 8 ; VT_R8
+ BYTE 8 ; VT_CY
+ BYTE 8 ; VT_DATE
+ BYTE 4 ; VT_BSTR
+ BYTE 4 ; VT_DISPATCH
+ BYTE 4 ; VT_ERROR
+ BYTE 2 ; VT_BOOL
+ BYTE 16 ; VT_VARIANT
+ BYTE 4 ; VT_UNKNOWN
+ BYTE 0 ; 14 is unused
+ BYTE 0 ; 15 is unused
+ BYTE 2 ; VT_I1
+ BYTE 2 ; VT_UI1
+
+
+rgfStructReturn BYTE 0 ; VT_EMPTY
+ BYTE 0 ; VT_NULL
+ BYTE 0 ; VT_I2
+ BYTE 0 ; VT_I4
+ BYTE 0 ; VT_R4
+ BYTE 0 ; VT_R8
+ BYTE 1 ; VT_CY ; For C++ only!
+ BYTE 0 ; VT_DATE
+ BYTE 0 ; VT_BSTR
+ BYTE 0 ; VT_DISPATCH
+ BYTE 0 ; VT_ERROR
+ BYTE 0 ; VT_BOOL
+ BYTE 1 ; VT_VARIANT
+ BYTE 0 ; VT_UNKNOWN
+ BYTE 0 ; 14 is unused
+ BYTE 0 ; 15 is unused
+ BYTE 0 ; VT_I1
+ BYTE 0 ; VT_UI1
+
+ .CODE
+
+;***
+;InvokeCdecl
+;
+;extern "C" SCODE CDECL
+;InvokeCdecl
+; void FAR* _this,
+; unsigned int oVft,
+; unsigned int vtReturn,
+; unsigned int cActuals,
+; VARTYPE FAR* rgvt,
+; VARIANTARG FAR* rgpvarg,
+; VARIANTARG FAR* pvargResult)
+;
+;Purpose:
+; see InvokeStdCall
+;
+;Entry:
+; see InvokeStdCall
+;
+;Exit:
+; see InvokeStdCall
+;
+;Uses:
+; esi, edi
+;
+;Preserves:
+; UNDONE
+;
+;***********************************************************************
+
+InvokeCdecl PROC C PUBLIC USES esi edi ebx,
+ _this : PTR,
+ oVft : DWORD,
+ vtReturn : DWORD,
+ cActuals : DWORD,
+ rgvt : PTR,
+ rgpvarg : PTR,
+ pvargResult : PTR
+
+LOCAL savedSP : DWORD,
+ vargHiddenParam : VARIANTARG
+
+ mov savedSP, esp
+
+ ;; cannot return byRef
+ ;;
+ mov ebx, vtReturn
+ test bh, 040h
+ jnz LRetInvalidArg
+
+ ;; load number of arguments passed
+ ;;
+ mov eax, cActuals
+ cmp eax, 0
+ jz LDoCall
+
+ ;; edi = &rgpvarg[cActuals-1]
+ ;;
+ dec eax
+ mov edi, eax
+ shl edi, 2 ; (cArgs-1)*sizeof(FAR*)
+ add edi, DWORD PTR rgpvarg
+
+ ;; edx = &rgvt[cActuals-1]
+ ;;
+ mov edx, eax
+ shl edx, 1 ; ((cArgs-1)*sizeof(WORD))
+ add edx, DWORD PTR rgvt
+
+LArgsTop:
+
+ ;; bx = rgvt[i]
+ ;;
+ movzx ebx, WORD PTR [edx]
+
+ ;; load the VARIANTARG* in preparation for pushing
+ ;;
+ mov esi, [edi]
+
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LPush4 ; all ByRefs are sizeof(FAR*)
+
+ ;; lookup size of the param in rgcbVtSize table
+ ;;
+ and bh, 00h ; ~(mode bits)
+ mov al, BYTE PTR rgcbVtSize[bx]
+
+ cmp al, 0
+ jl LRetInvalidArg
+ jz LNextArg
+ sub al, 2
+ jz LPush2
+ sub al, 2
+ jz LPush4
+ sub al, 4
+ jz LPush8
+ sub al, 8
+ jz LPush16
+ jmp LRetInvalidArg
+
+ Align 2
+LPush16: ; push the entire variant
+ push DWORD PTR [esi+12]
+ push DWORD PTR [esi+8]
+ push DWORD PTR [esi+4]
+ push DWORD PTR [esi]
+ jmp LNextArg
+
+ Align 2
+LPush8: ; 8 bytes of data
+ push (VARIANTARG PTR [esi]).dw3
+ push (VARIANTARG PTR [esi]).dw2
+
+LPush4: ; 4 bytes of data
+ push (VARIANTARG PTR [esi]).dw1
+ push (VARIANTARG PTR [esi]).dw0
+ jmp LNextArg
+
+LPush2: ; 2 bytes of data
+ mov ax, (VARIANTARG PTR [esi]).dw0
+ push eax
+
+LNextArg:
+ sub edx, 2 ; sizeof(VARTYPE)
+ sub edi, 4 ; sizeof(VARIANTARG FAR*)
+ cmp edi, DWORD PTR rgpvarg
+ jae LArgsTop
+
+LDoCall:
+ ;; if its a structure return, we must push a 'hidden' argument
+ ;;
+ mov ebx, vtReturn
+IF 0
+ and bh, 00h ; ~(mode bits)
+ELSE
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LPushThis ; no hidden parm if byref or
+ ; array return
+ENDIF
+ mov al, BYTE PTR rgfStructReturn[bx]
+ cmp al, 0
+ jz LPushThis
+
+ ;; push the address of the struct return hidden param
+ ;;
+ ;; Note: the hidparam is passed as a FAR* because we
+ ;; explicitly declare all of our structs FAR.
+ ;;
+ lea eax, vargHiddenParam;
+ push eax
+
+LPushThis:
+
+ ;; push the this pointer.
+ ;;
+ mov ebx, _this
+ push ebx
+
+ ;; load the vtable offset
+ ;;
+ mov esi, oVft
+
+ mov ebx, [ebx] ; @ vtable*
+ call dWORD PTR [ebx][esi]
+ mov esp, savedSP
+
+ ;; CONSIDER: verify that the callee adjusted the stack the way
+ ;; we expected. something like,
+ ;;
+ ;; if(sp != savedSP){
+ ;; sp = savedSP;
+ ;; return DISP_E_SomeError
+ ;; }
+ ;;
+
+ ;; Grab the return value.
+ ;; We are going to grab the value based on the VARTYPE in
+ ;; the given vtReturn. This VARTYPE is used as a description
+ ;; of the return value, not a desired target type. ie, no
+ ;; coercions are performed. See the function header for a
+ ;; description of the Pascal member function return value
+ ;; convention.
+ ;;
+
+
+ mov edi, pvargResult
+
+ mov ebx, vtReturn
+ mov (VARIANTARG PTR [edi]).vt, bx
+
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LRetPtr
+
+ ; Assert((bh & VT_ARRAY) == 0);
+
+ cmp bx, VT_UI1
+ je ValidVartype
+ cmp bx, VT_MAX
+ jae LRetInvalidArg
+
+ValidVartype:
+ shl bx, 2
+ jmp LRetValJmpTabCdecl[bx]
+
+ Align 2
+LRetValJmpTabCdecl LABEL dword
+ DWORD LDone ; VT_EMPTY
+ DWORD LRetI4 ; VT_NULL
+ DWORD LRetI2 ; VT_I2
+ DWORD LRetI4 ; VT_I4
+ DWORD LRetR4 ; VT_R4
+ DWORD LRetR8 ; VT_R8
+ DWORD LRetCy ; VT_CY
+ DWORD LRetR8 ; VT_DATE
+ DWORD LRetPtr ; VT_BSTR
+ DWORD LRetPtr ; VT_DISPATCH
+ DWORD LRetI4 ; VT_ERROR
+ DWORD LRetI2 ; VT_BOOL
+ DWORD LRetVar ; VT_VARIANT
+ DWORD LRetPtr ; VT_UNKNOWN
+ DWORD LRetInvalidArg ; unused
+ DWORD LRetInvalidArg ; unused
+ DWORD LRetInvalidArg ; VT_I1
+ DWORD LRetUI1 ; VT_UI1
+
+ Align 2
+LRetVar:
+ mov esi, eax
+ movsd
+ movsd
+ movsd
+ movsd
+ jmp LDone
+
+
+ Align 2
+LRetR4:
+ add edi, VARIANT_DATA_OFFSET
+ fstp DWORD PTR [edi]
+ jmp LDone
+
+ Align 2
+LRetR8:
+ add edi, VARIANT_DATA_OFFSET
+ fstp QWORD PTR [edi]
+ jmp LDone
+
+ Align 2
+LRetCy:
+ add edi, VARIANT_DATA_OFFSET
+IF 1 ; CY return in C++ is via hidden parm
+ mov edx, eax
+ mov ebx, DWORD PTR [edx]
+ mov DWORD PTR [edi], ebx
+ mov ebx, DWORD PTR 4[edx]
+ mov DWORD PTR [edi+4], ebx
+ELSE ; CY return in C is via registers
+ mov DWORD PTR [edi], eax
+ mov DWORD PTR [edi+4], edx
+ENDIF
+ jmp LDone
+
+ Align 2
+LRetI4:
+LRetPtr:
+ add edi, VARIANT_DATA_OFFSET
+ mov DWORD PTR [edi], eax
+ jmp LDone
+
+ Align 2
+LRetI2:
+LRetUI1:
+ mov (VARIANTARG PTR [edi]).dw0, ax
+
+LDone:
+ mov eax, DWORD PTR g_S_OK
+ ret
+
+
+LRetInvalidArg:
+ mov eax, DWORD PTR g_E_INVALIDARG
+ mov esp, savedSP
+ ret
+
+InvokeCdecl ENDP
+
+
+
+;***
+;InvokeStdCall
+;
+;extern "C" SCODE
+;InvokeStdCall(
+; void FAR* pvMethod,
+; unsigned int oVft,
+; unsigned int vtReturn,
+; unsigned int cActuals,
+; VARTYPE FAR* rgvt,
+; VARIANTARG FAR* rgpvarg,
+; VARIANTARG FAR* pvargResult)
+;
+;Purpose:
+;
+; Invoke a virtual StdCall method using the given this pointer,
+; method index and array of parameters.
+;
+; The StdCall member function calling convention (MSC v8.0)
+; --------------------------------------------------------
+; - arguments pushed right to left
+; - callee clean (ie, the callee adjusts the sp on return)
+; - model specific this* always pushed last
+;
+; return values are handled as follows,
+;
+; vartype fundamental return location
+; ------------------------------------------------
+; VT_UI1 unsigned char al
+; VT_I2 short ax
+; VT_I4 long eax
+; VT_R4 float float-return(1)
+; VT_R8 double float-return
+; VT_DATE double float-return
+; VT_CY struct struct-return(2)
+; VT_BSTR char FAR* eax
+; VT_UNKNOWN void FAR* eax
+; VT_DISPATCH void FAR* eax
+; VT_ERROR long eax
+; VT_BOOL short ax
+; VT_VARIANT VARIANTARG struct-return
+; VT_WBSTR WCHAR FAR* eax
+; VT_DISPATCHW void FAR* eax
+;
+; 1. floating point returns
+;
+; Floating point values are returned in a caller allocated buffer.
+; a *near* pointer to this buffer is passed as a hidden parameter,
+; and is pushed as the last (ie, rightmost) parameter. This means
+; that it is always located immediately before the 'this' pointer.
+;
+; A model specific pointer to this caller allocated buffer is
+; passed back in ax[:dx]. All this means is that the callee returns
+; the address we passed in as the hidden param, and sticks SS into
+; DX if the callee is large model (see following note).
+;
+; Note: the compiler *assumes* that this caller allocated buffer
+; is SS relative (hence the reason it only passes a near pointer),
+; so the following code is careful to ensure this.
+;
+; 2. structure returns
+;
+; Structures are returned in a caller allocated buffer, and are
+; handled exactly the same as float returns except that the pointer
+; to the buffer is always pushed as the first (leftmost) param. This
+; is opposite of the location it is passed for float returns (I
+; have no idea why there different).
+;
+;
+; Limitations & assumptions
+; -------------------------
+; Only supports far calls.
+;
+;Entry:
+; pvMethod = ptr to the method to invoke
+; cArgs = count of the number of actuals
+; rgvt = array of VARTYPES describing the methods formals
+; rgpvarg = array of VARIANTARG*s, which map the actuals by position
+; vtReturn = the VARTYPE of the return value
+;
+;Exit:
+; pvargResult = VARIANTARG containing the method return value
+;
+;Uses:
+; bx, si, di
+;
+;Preserves:
+;
+;
+;***********************************************************************
+InvokeStdCall PROC C PUBLIC USES esi edi ebx,
+ _this : PTR,
+ oVft : DWORD,
+ vtReturn : DWORD,
+ cActuals : DWORD,
+ rgvt : PTR,
+ rgpvarg : PTR,
+ pvargResult : PTR
+
+LOCAL savedSP : DWORD,
+ vargHiddenParam : VARIANTARG
+
+
+ mov savedSP, esp
+
+ ;; cannot return byRef
+ ;;
+ mov ebx, vtReturn
+ test bh, 040h
+ jnz LRetInvalidArg
+
+ ;; load number of arguments passed
+ ;;
+ mov eax, cActuals
+ cmp eax, 0
+ jz LDoCall
+
+ ;; edi = &rgpvarg[cActuals-1]
+ ;;
+ dec eax
+ mov edi, eax
+ shl edi, 2 ; (cArgs-1)*sizeof(FAR*)
+ add edi, DWORD PTR rgpvarg
+
+ ;; edx = &rgvt[cActuals-1]
+ ;;
+ mov edx, eax
+ shl edx, 1 ; ((cArgs-1)*sizeof(WORD))
+ add edx, DWORD PTR rgvt
+
+LArgsTop:
+
+ ;; bx = rgvt[i]
+ ;;
+ movzx ebx, WORD PTR [edx]
+
+ ;; load the VARIANTARG* in preparation for pushing
+ ;;
+ mov esi, [edi]
+
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LPush4 ; all ByRefs are sizeof(FAR*)
+
+ ;; lookup size of the param in rgcbVtSize table
+ ;;
+ and bh, 00h ; ~(mode bits)
+ mov al, BYTE PTR rgcbVtSize[bx]
+
+ cmp al, 0
+ jl LRetInvalidArg
+ jz LNextArg
+ sub al, 2
+ jz LPush2
+ sub al, 2
+ jz LPush4
+ sub al, 4
+ jz LPush8
+ sub al, 8
+ jz LPush16
+ jmp LRetInvalidArg
+
+ Align 2
+LPush16: ; push the entire variant
+ push DWORD PTR [esi+12]
+ push DWORD PTR [esi+8]
+ push DWORD PTR [esi+4]
+ push DWORD PTR [esi]
+ jmp LNextArg
+
+ Align 2
+LPush8: ; 8 bytes of data
+ push (VARIANTARG PTR [esi]).dw3
+ push (VARIANTARG PTR [esi]).dw2
+
+LPush4: ; 4 bytes of data
+ push (VARIANTARG PTR [esi]).dw1
+ push (VARIANTARG PTR [esi]).dw0
+ jmp LNextArg
+
+LPush2: ; 2 bytes of data
+ mov ax, (VARIANTARG PTR [esi]).dw0
+ push eax
+
+LNextArg:
+ sub edx, 2 ; sizeof(VARTYPE)
+ sub edi, 4 ; sizeof(VARIANTARG FAR*)
+ cmp edi, DWORD PTR rgpvarg
+ jae LArgsTop
+
+LDoCall:
+ ;; if its a structure return, we must push a 'hidden' argument
+ ;;
+ mov ebx, vtReturn
+
+IF 0
+ and bh, 00h ; ~(mode bits)
+ELSE
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LPushThis ; no hidden parm if byref or
+ ; array return
+ENDIF
+
+ mov al, BYTE PTR rgfStructReturn[bx]
+ cmp al, 0
+ jz LPushThis
+
+ ;; push the address of the struct return hidden param
+ ;;
+ ;; Note: the hidparam is passed as a FAR* because we
+ ;; explicitly declare all of our structs FAR.
+ ;;
+ lea eax, vargHiddenParam;
+ push eax
+
+LPushThis:
+
+ ;; push the this pointer.
+ ;;
+ mov ebx, _this
+ push ebx
+
+ ;; load the vtable offset
+ ;;
+ mov esi, oVft
+
+ mov ebx, [ebx] ; @ vtable*
+ call dWORD PTR [ebx][esi]
+
+ ;; CONSIDER: verify that the callee adjusted the stack the way
+ ;; we expected. something like,
+ ;;
+ ;; if(sp != savedSP){
+ ;; sp = savedSP;
+ ;; return DISP_E_SomeError
+ ;; }
+ ;;
+
+ ;; Grab the return value.
+ ;; We are going to grab the value based on the VARTYPE in
+ ;; the given vtReturn. This VARTYPE is used as a description
+ ;; of the return value, not a desired target type. ie, no
+ ;; coercions are performed. See the function header for a
+ ;; description of the Pascal member function return value
+ ;; convention.
+ ;;
+
+
+ mov edi, pvargResult
+
+ mov ebx, vtReturn
+ mov (VARIANTARG PTR [edi]).vt, bx
+
+ test bh, 060h ; VT_BYREF | VT_ARRAY
+ jnz LRetPtr
+
+ ; Assert((bh & VT_ARRAY) == 0);
+
+ cmp bx, VT_UI1
+ je ValidVartype
+ cmp bx, VT_MAX
+ jae LRetInvalidArg
+
+ValidVartype:
+ shl bx, 2
+ jmp LRetValJmpTabStdCall[bx]
+
+ Align 2
+LRetValJmpTabStdCall LABEL dword
+ DWORD LDone ; VT_EMPTY
+ DWORD LRetI4 ; VT_NULL
+ DWORD LRetI2 ; VT_I2
+ DWORD LRetI4 ; VT_I4
+ DWORD LRetR4 ; VT_R4
+ DWORD LRetR8 ; VT_R8
+ DWORD LRetCy ; VT_CY
+ DWORD LRetR8 ; VT_DATE
+ DWORD LRetPtr ; VT_BSTR
+ DWORD LRetPtr ; VT_DISPATCH
+ DWORD LRetI4 ; VT_ERROR
+ DWORD LRetI2 ; VT_BOOL
+ DWORD LRetVar ; VT_VARIANT
+ DWORD LRetPtr ; VT_UNKNOWN
+ DWORD LRetInvalidArg ; unused
+ DWORD LRetInvalidArg ; unused
+ DWORD LRetInvalidArg ; VT_I1
+ DWORD LRetUI1 ; VT_UI1
+
+ Align 2
+LRetVar:
+ mov esi, eax
+ movsd
+ movsd
+ movsd
+ movsd
+ jmp LDone
+
+
+ Align 2
+LRetR4:
+ add edi, VARIANT_DATA_OFFSET
+ fstp DWORD PTR [edi]
+ jmp LDone
+
+ Align 2
+LRetR8:
+ add edi, VARIANT_DATA_OFFSET
+ fstp QWORD PTR [edi]
+ jmp LDone
+
+ Align 2
+LRetCy:
+ add edi, VARIANT_DATA_OFFSET
+IF 1 ; CY return in C++ is via hidden parm
+ mov edx, eax
+ mov ebx, DWORD PTR [edx]
+ mov DWORD PTR [edi], ebx
+ mov ebx, DWORD PTR 4[edx]
+ mov DWORD PTR [edi+4], ebx
+ELSE ; CY return in C is via registers
+ mov DWORD PTR [edi], eax
+ mov DWORD PTR [edi+4], edx
+ENDIF
+ jmp LDone
+
+ Align 2
+LRetI4:
+LRetPtr:
+ add edi, VARIANT_DATA_OFFSET
+ mov DWORD PTR [edi], eax
+ jmp LDone
+
+ Align 2
+LRetI2:
+LRetUI1:
+ mov (VARIANTARG PTR [edi]).dw0, ax
+
+LDone:
+ mov eax, DWORD PTR g_S_OK
+ ret
+
+
+LRetInvalidArg:
+ mov eax, DWORD PTR g_E_INVALIDARG
+ mov esp, savedSP
+ ret
+
+InvokeStdCall ENDP
+
+
+
+
+;***
+;Universal Method
+;
+;extern "C" _stdcall HRESULT
+;UMx( // UM3 upto UM512
+; CProxUniv FAR* pProx,
+; ...)
+;
+;Purpose:
+;
+; The Win32 Universal Method is called with _stdcall calling convention
+; (callee cleans up), but the UM takes a variable number of arguments,
+; so it must decide at runtime how much stack to clean up and hence cannot
+; be written in C.
+;
+;
+;Entry:
+; pProx = ptr to CProxUniv instance
+; ... = argumnents to the method (decoded in CProxUniv)
+;
+;Exit:
+; returns HRESULT = result of the method call
+;
+;Uses:
+;
+;Preserves:
+;
+;
+;***********************************************************************
+UMTemplate MACRO X:REQ
+PUBLIC @CatStr(UM,X)
+@CatStr(UM,X):
+ mov edx, X
+ jmp lblUmCommon
+ENDM ; UMTemplate
+
+; Generate 510 UMxxx functions, starting with UM2
+Count = 3
+WHILE Count LE 512
+ UMTemplate %Count
+ Count=Count+1
+ENDM
+
+PUBLIC lblUmCommon
+lblUmCommon:
+ ; at entry, EDX = Method index, stack contains params for the
+ ; method
+
+ push ebp
+ mov ebp, esp
+ push eax ; LOCAL: int cbStackCleanup
+
+ pProx EQU DWORD PTR [ebp+08h]
+ pEllipses EQU DWORD PTR [ebp+0ch]
+ cbStackCleanup EQU DWORD PTR [ebp-04h]
+
+ ; va_start(args, pProx)
+ lea eax, pEllipses ; eax = args
+
+ mov ecx, esp ; push &cbStackCleanup
+ push ecx
+ push eax ; push args
+ push edx ; push method index
+ push pProx ; push pProx
+ call ProxyMethod ; ProxyMethod(pProx,X,args,&cbStackCleanup)
+ ; eax = HRESULT
+
+ mov edx, cbStackCleanup
+ leave ; clean up the local var, esp and ebp
+ pop ecx ; pop the return address
+ add esp, edx ; do the _stdcall argument cleanup
+ jmp ecx ; then return
+; end lblUmCommon
+
+END
diff --git a/private/oleauto/src/dispatch/win32/i386/oleconva.asm b/private/oleauto/src/dispatch/win32/i386/oleconva.asm
new file mode 100644
index 000000000..77468b69d
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/i386/oleconva.asm
@@ -0,0 +1,675 @@
+;***
+;oleconva.a - Machine-specific conversion helpers
+;
+; Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+; Information Contained Herein Is Proprietary and Confidential.
+;
+;Purpose:
+; Type conversion helper functions.
+;
+;Revision History:
+;[nnn] dd-mmm-yy alias___ Comment
+;
+; [] 18-Mar-93 timp Module created.
+;[001] 31-May-93 bradlo Added overflow checking.
+;
+;******************************************************************************
+
+
+ .386
+ .MODEL FLAT, STDCALL
+
+ ; Since this code will be linked with C code, the symbols
+ ; should be case sensitive.
+
+ OPTION CASEMAP:NONE
+
+ extern ReportOverflow@0:far
+
+; HRESULT error return code
+DISP_E_OVERFLOW equ 8002000aH
+
+ .CODE
+
+
+; max and min floating point values that can fit in a currency
+; scale by 10,000
+g_dblMaxPosCy dq 9.223372036854775807e+18
+g_dblMaxNegCy dq -9.223372036854775808e+18
+
+
+; floating point <-> currency scaling factor
+CYFACTOR equ 10000
+g_wCyFactor dw CYFACTOR
+g_fltCyFactor dd 10000.0
+
+TenTo18 dt 1.0E18
+
+g_CwStd dw 137fH ;Mask all errors, 64-bit, round near
+CwTrunc dw 1F7fH ;Mask all errors, 64-bit, chop
+
+FPERR equ 0DH ;Overflow, zero divide, invalid errs
+
+
+SETUP87 MACRO CwSave, cw:=<g_CwStd>
+ fstcw CwSave ;;Save existing environment
+ fldcw cw ;;Use our own CW
+ ENDM
+
+
+RESTORE87 MACRO CwSave
+ fclex ;;Prevent 486 bug on FLDCW
+ fldcw CwSave ;;Restore original CW
+ ENDM
+
+
+CHKERR87 MACRO CwSave, ErrLoc
+ fstsw ax ;;Get error flags
+ fclex ;;Don't let caller see errors
+ test al,FPERR ;;See if any errors
+ fldcw CwSave ;;Restore original CW
+ jnz ErrLoc ;;Go handle error if bit set
+ ENDM
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrCyFromI2(short sIn, CY *pcyOut)
+;
+;Purpose:
+; Convert Integer to Currency
+;
+;Entry:
+; sIn = Integer to convert
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrCyFromI2 PROC STDCALL PUBLIC, sIn:SWORD, pcyOut:PTR QWORD
+
+ movsx eax,sIn
+ imul eax,CYFACTOR ;Scale the I2
+ cdq ;Extend through edx
+ mov ecx,pcyOut
+ mov [ecx],eax
+ mov [ecx+4],edx
+
+ sub eax,eax ;NOERROR
+ ret
+
+ErrCyFromI2 ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrCyFromI4(long lIn, CY *pcyOut)
+;
+;Purpose:
+; Convert Long to Currency
+;
+;Entry:
+; lIn = Long to convert
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrCyFromI4 PROC STDCALL PUBLIC, lIn:SDWORD, pcyOut:PTR QWORD
+
+ mov eax,lIn
+ mov edx,CYFACTOR
+;Multiply by immediate leaves only a 32-bit result in eax.
+;The following instruction leaves a 64-bit result in edx:eax.
+ imul edx ;Scale the I4
+
+ mov ecx,pcyOut
+ mov [ecx],eax
+ mov [ecx+4],edx
+
+ sub eax,eax ;NOERROR
+ ret
+
+ErrCyFromI4 ENDP
+
+
+;******************************************************************************
+;
+;PRIVATE BOOL CkOvflCy
+;
+;Purpose:
+; Check to see if the given floating point value will fit in a currency.
+;
+;Entry:
+; st(0) = the floating point value to check
+;
+;Exit:
+; return value = BOOL, TRUE if the value will overflow
+;
+;*****
+
+CkOvflCy PROC
+
+ fld st(0)
+ fcom g_dblMaxPosCy
+ fnstsw ax
+ sahf
+ jae LOvfl
+
+ fcom g_dblMaxNegCy
+ fnstsw ax
+ sahf
+ jbe LOvfl
+
+ fstp st(0)
+ sub eax,eax
+ ret
+
+LOvfl:
+ fstp st(0)
+ mov eax,1
+ ret
+
+CkOvflCy ENDP
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrCyFromR4(float FAR* pfltIn, CY *pcyOut)
+;
+;Purpose:
+; Convert Single to Currency
+;
+;Entry:
+; pfltIn = Single to convert
+; pcyOut = pointer to Currency to hold result
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrCyFromR4 PROC STDCALL PUBLIC, pfltIn:PTR REAL4, pcyOut:PTR QWORD
+
+ mov eax,pfltIn
+ fld dword ptr [eax] ;Load R4
+ fimul g_wCyFactor ;Scale it
+
+ call CkOvflCy
+ or eax,eax
+ jnz LOvfl
+
+
+ mov eax,pcyOut
+ fistp qword ptr [eax] ;Store CY result
+
+ sub eax,eax ;NOERROR
+ ret
+
+LOvfl:
+ fstp st(0)
+ ;call ReportOverflow@0 ;DISP_E_OVERFLOW
+ mov eax,DISP_E_OVERFLOW
+ ret
+
+ErrCyFromR4 ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrCyFromR8(double FAR* pdblIn, CY *pcyOut)
+;
+;Purpose:
+; Convert Double to Currency
+;
+;Entry:
+; pdblIn = Double to convert
+; pcyOut = pointer to Currency to hold result
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrCyFromR8 PROC STDCALL PUBLIC, pdblIn:PTR REAL8, pcyOut:PTR QWORD
+
+ mov eax,pdblIn
+ fld qword ptr [eax]
+ fimul g_wCyFactor ;Scale it
+
+ call CkOvflCy
+ or eax,eax
+ jnz LOvfl
+
+
+ mov eax,pcyOut
+ fistp qword ptr [eax] ;Store CY result
+
+ sub eax,eax ;NOERROR
+ ret
+
+LOvfl:
+ fstp st(0)
+ ;call ReportOverflow@0 ;DISP_E_OVERFLOW
+ mov eax,DISP_E_OVERFLOW
+ ret
+
+ErrCyFromR8 ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrI2FromCy(CY cyIn, short *psOut)
+;
+;Purpose:
+; Convert Currency to Integer
+;
+;Entry:
+; cyIn = Currency to convert
+; psOut = pointer to Integer to hold result
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrI2FromCy PROC STDCALL PUBLIC, cyIn:QWORD, psOut:PTR SWORD
+
+LOCAL cyTmp:QWORD
+
+ fild cyIn ;Load CY
+ fidiv g_wCyFactor ;Remov scaling
+ fistp cyTmp
+
+ mov eax,dword ptr cyTmp
+ cwde ;sign extend ax->eax
+ cdq ;sign extend eax->edx
+ cmp eax,dword ptr cyTmp
+ jne LOvfl
+ cmp edx,dword ptr cyTmp+4
+ jne LOvfl
+
+ mov ecx,psOut
+ mov word ptr [ecx],ax
+
+ sub eax,eax ;NOERROR
+ ret
+
+LOvfl:
+ ;call ReportOverflow@0 ;DISP_E_OVERFLOW
+ mov eax,DISP_E_OVERFLOW
+ ret
+
+ErrI2FromCy ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrI4FromCy(CY cyIn, long *plOut)
+;
+;Purpose:
+; Convert Currency to Long
+;
+;Entry:
+; cyIn = Currency to convert
+; plOut = pointer to Long to hold result
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+
+ErrI4FromCy PROC STDCALL PUBLIC, cyIn:QWORD, plOut:PTR SDWORD
+
+LOCAL cyTmp:QWORD
+
+ fild cyIn ;Load CY
+ fidiv g_wCyFactor ;Remov scaling
+ fistp cyTmp
+
+ mov eax,dword ptr cyTmp
+ cdq
+ cmp edx,dword ptr cyTmp+4
+ jne LOvfl
+
+ mov edx,plOut
+ mov [edx],eax
+
+ sub eax,eax ;NOERROR
+ ret
+
+LOvfl:
+ ;call ReportOverflow@0 ;DISP_E_OVERFLOW
+ mov eax,DISP_E_OVERFLOW
+ ret
+
+ErrI4FromCy ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrR4FromCy(CY cyIn, float *pfltOut)
+;
+;Purpose:
+; Convert Currency to Single
+;
+;Entry:
+; cyIn = Currency to convert
+;
+;Exit:
+; return value = HRESULT
+;
+;*****
+ErrR4FromCy PROC STDCALL PUBLIC, cyIn:QWORD, pfltOut:PTR REAL4
+
+ fild cyIn ;Load CY
+ fidiv g_wCyFactor ;Remov scaling
+ mov eax,pfltOut
+ fstp dword ptr [eax]
+ ;fwait
+
+ sub eax,eax ;NOERROR
+ ret
+
+ErrR4FromCy ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrR8FromCy(CY cyIn, double *pdblOut)
+;
+;Purpose:
+; Convert Currency to Double
+;
+;Entry:
+; cyIn = Currency to convert
+;
+;Exit:
+; return value = HRESULT.
+;
+;*****
+
+ErrR8FromCy PROC STDCALL PUBLIC, cyIn:QWORD, pdblOut:PTR REAL8
+
+ fild cyIn ;Load CY
+ fidiv g_wCyFactor ;Remov scaling
+ mov eax,pdblOut
+ fstp qword ptr [eax]
+ ;fwait
+
+ sub eax,eax ;NOERROR
+ ret
+
+ErrR8FromCy ENDP
+
+
+;******************************************************************************
+;
+;PUBLIC HRESULT ErrMultCyI4(CY cyIn, long lIn, CY *pcyOut);
+;
+;Purpose:
+; Multiply Currency by Long with Currency result
+;
+;Entry:
+; cyIn = Currency multiplicand
+; lIn = Long multiplier
+; pcyOut = Pointer to result Currency location
+;
+;Outputs:
+; return value = HRESULT
+;
+;*****
+
+ErrMultCyI4 PROC STDCALL PUBLIC, cyIn:QWORD, lIn:DWORD, pcyOut:PTR QWORD
+
+if 0 ; - don't use FP unit
+
+ fild cyIn
+ fild lIn
+ fmul ;Product
+ mov eax,pcyOut ;Get pointer to result location
+ fistp qword ptr es:[eax] ;Save result
+
+ sub eax,eax ;UNDONE: no error
+
+else ;0 - don't use FP unit
+
+;This routine uses Booth's algorithm for a twos-complement signed
+;multiply. This algorithm says to compute the product with unsigned
+;arithmetic. Then correct the result by looking at the signs of the
+;original operands: for each operand that is negative, subtract the
+;other operand from the high half of the product. (The mathematical
+;proof is a fun 15-minute exercise. Go for it.)
+
+;Note: multiplications are optimized by having operand with the most
+;leading zeros in eax.
+ mov eax,lIn ;Get I4
+ mul dword ptr cyIn ;Multiply by low half of CY
+ push eax
+ xchg ecx,edx ;Save high result in ecx
+ mov eax,dword ptr cyIn+4 ;Get high half of CY
+ mul lIn
+ add eax,ecx ;Combine partial products
+ adc edx,0
+;Result in edx:eax:[sp] needs Booth's sign correction
+ cmp byte ptr cyIn+7,0 ;Is cyIn positive?
+ jns PosCy
+ sub edx,lIn
+PosCy:
+ cmp byte ptr lIn+3,0 ;Is lIn positive?
+ jns PosI4
+ sub eax,dword ptr cyIn
+ sbb edx,dword ptr cyIn+4
+PosI4:
+;Signed result in edx:eax:[sp]. Check for overflow.
+ mov ecx,edx ;Save highest dword of product
+ cdq ;Sign-extend eax
+ cmp ecx,edx ;Is it just the sign extension of eax?
+ pop ecx ;Get low dword of product
+ jnz LOvfl
+;64-bit product in eax:ecx
+ mov edx,pcyOut ;Get result ptr
+ mov [edx],ecx ;Save result
+ mov [edx+4],eax
+
+endif ;don't use FP unit
+
+ sub eax,eax ;NOERROR
+ ret
+
+LOvfl:
+ ;call ReportOverflow@0
+ mov eax,DISP_E_OVERFLOW
+ ret
+
+ErrMultCyI4 ENDP
+
+
+;******************************************************************************
+;
+;void PASCAL DoFbstp(CY *pcyIn, DIGARY *pdigOut);
+;
+;Purpose:
+; Do x87 FBSTP instruction on currency type. Check to see if CY is too
+; big first and compute 19th digit separately.
+;
+;Entry:
+; pcyIn = Type currency to convert
+; pdigOut = pointer to result packed BCD digits
+;
+;Outputs:
+; None.
+;
+;*****
+
+;This constant is the upper bits of the 64-bit integer representation
+;of 10^18. CY values at or above this will overflow FBSTP.
+
+MAX18CY equ 0DE0B6B3H
+
+DoFbstp proc stdcall public, pcyIn:ptr qword, pdigOut:ptr tbyte
+
+LOCAL cw:WORD, iTemp:DWORD
+
+ mov ecx,pcyIn
+ fild qword ptr [ecx]
+ mov eax,[ecx+4]
+ mov ecx,pdigOut
+ cmp eax,MAX18CY
+ jge Get19
+ cmp eax,-MAX18CY
+ jle Get19
+ fbstp tbyte ptr [ecx]
+ fwait
+ ret
+
+Get19:
+ SETUP87 cw,CwTrunc
+ fld TenTo18
+ fld st(1) ;Copy input
+ fdiv st,st(1) ;Compute last digit
+ frndint ;Chop to integer
+ fist iTemp ;Get value of MSD
+ fmul
+ fsub ;Remove MSD
+ fbstp tbyte ptr [ecx]
+ mov eax,[iTemp]
+;Take absolute value
+ cdq ;Extend sign through edx
+ xor eax,edx ;NOT if negative
+ sub eax,edx ;INC if negative
+ RESTORE87 cw
+ and dl,80h ;set sign bit in AL
+ or al, dl
+ mov [ecx+9],al ;Set 19th digit
+ ret
+
+DoFbstp endp
+
+
+;******************************************************************************
+;
+;int ConvFloatToAscii(double dblIn, DIGARY *pdigOut)
+;
+;Purpose:
+; Convert double to packed BCD digit string plus base-10 exponent.
+;
+;Entry:
+; dblIn = Type double to convert
+; pdigOut = pointer to result packed BCD digits
+;
+;Outputs:
+; return value = power of 10 of the 18-digit integer.
+;
+;*****
+
+ConvFloatToAscii PROC STDCALL PUBLIC, dblIn:QWORD, pdigOut:PTR
+
+LOCAL cw:WORD, temp:TBYTE
+
+ SETUP87 cw
+ fld dblIn ;Put double on x87
+
+;What we want now is equivalent to FXTRACT, but it's faster just
+;to store the tbyte and look at it directly. The reasone we don't
+;use the double's exponent is in case it's denormal.
+;
+ fld st ;Make a copy
+ fstp temp
+ movzx eax,word ptr [temp+8] ;Get word with exponent
+ and ah,not 80H ;Zero out sign
+
+;2^59 = 5.7E17 (18 digits). A 59-bit integer could be 2^59 - 1.
+;Our goal now is to find a power of ten to multiply by that will give us
+;a 55- to 59-bit integer. We'll target 58 bits so the multiply can carry
+;to 59, and truncate while figuring the power so we never exceed it.
+
+ sub eax,16382 + 58 ;Remove bias and 58 bits
+
+;Find power of 10 by multiplying base 2 exponent by log10(2)
+
+ imul eax,19728 ;log10(2) * 2^16 = .30103 * 65536
+ add eax,0FFFFH ;Round up
+ sar eax,16 ;Only use high half
+ call MulPower10 ;ax preserved
+ mov ebx,pdigOut
+ fbstp tbyte ptr [ebx]
+ RESTORE87 cw
+ ret
+
+ConvFloatToAscii endp
+
+
+MulPower10:
+;eax = negative of power of 10 required
+ or eax,eax
+ jz NoPower
+ push ebx
+ mov edx,eax
+ mov ecx,offset tNegPower
+ jns GetPower
+ mov ecx,offset tPosPower
+ neg edx
+GetPower:
+ mov ebx,edx
+ and ebx,0FH ;Use low 4 exponent bits
+ jz NoMul
+ dec ebx
+ imul ebx,size tbyte ;Index into table of powers
+ fld tbyte ptr [ebx+ecx]
+ fmul
+NoMul:
+ add ecx,15 * size tbyte ;Advance to next table
+ shr edx,4 ;Get next exponent bits
+ jnz GetPower
+ pop ebx
+NoPower:
+ ret
+
+
+;******************************************************************************
+;
+;Power of 10 tables
+;
+;Two tables: one positive powers, the other negative. Each table is broken
+;into three groups: 10^1 to 10^15 by 1, 10^16 to 10^240 by 16, and
+;(theoretically) 10^256 to ... by 256. However, because the maximum value
+;is about 10^309, only one entry in the last group is needed (10^256), so
+;it is slipped on to the end of the previous group.
+
+
+SetPower10 macro Power
+ dt 1.0E&Power
+ ENDM
+
+
+tPosPower label Tbyte
+
+Power = 1
+ REPT 15
+ SetPower10 %Power
+Power = Power + 1
+ ENDM
+
+ REPT 16
+ SetPower10 %Power
+Power = Power + 16
+ ENDM
+
+
+tNegPower label Tbyte
+
+Power = 1
+ REPT 15
+ SetPower10 -%Power
+Power = Power + 1
+ ENDM
+
+ REPT 16
+ SetPower10 -%Power
+Power = Power + 16
+ ENDM
+
+
+ END
diff --git a/private/oleauto/src/dispatch/win32/mips/invoke.s b/private/oleauto/src/dispatch/win32/mips/invoke.s
new file mode 100644
index 000000000..c68cb9220
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/mips/invoke.s
@@ -0,0 +1,725 @@
+// TITLE("invoke.s for OLE Automation")
+//++
+//
+// Copyright (c) 1993 Microsoft Corporation
+//
+// Module Name:
+//
+// invoke.s
+//
+// Abstract:
+//
+// This module implements the low-level dispatching support for
+// the default implementation of IDispatch::Invoke().
+//
+// Author:
+//
+// tomteng 12-Sep-93 Derived from initial cut by HoiV (Cario)
+//
+// Environment:
+//
+// User mode.
+//
+// Revision History:
+//
+//--
+
+#include "ksmips.h"
+
+ .extern g_S_OK 4
+ .extern g_E_INVALIDARG 4
+
+
+// Note: the following must match the definition of VARIANT in variant.h
+
+#define VT_EMPTY 0
+#define VT_NULL 1
+#define VT_I2 2
+#define VT_I4 3
+#define VT_R4 4
+#define VT_R8 5
+#define VT_CY 6
+#define VT_DATE 7
+#define VT_BSTR 8
+#define VT_DISPATCH 9
+#define VT_ERROR 10
+#define VT_BOOL 11
+#define VT_VARIANT 12
+#define VT_UNKNOWN 13
+#define VT_MAX 14
+// 14 is unused
+// 15 is unused
+//#define VT_I1 16
+#define VT_UI1 17
+
+#define VT_BYREF 0x4000
+#define VT_ARRAY 0x2000
+#define VT_NOMODE 0x00ff
+
+
+ .struct 0
+vt: .space 2
+wReserved1: .space 2
+wReserved2: .space 2
+wReserved3: .space 2
+dw0: .space 2
+dw1: .space 2
+dw2: .space 2
+dw3: .space 2
+VariantArg:
+
+#define VARIANT_DATA_OFFSET 8 // offset to union of data
+
+
+ .text
+ .align 2
+rgcbVtStackSize:
+ .byte 0 // VT_EMPTY
+ .byte 4 // VT_NULL
+ .byte 4 // VT_I2
+ .byte 4 // VT_I4
+ .byte 4 // VT_R4
+ .byte 8 // VT_R8
+ .byte 8 // VT_CY
+ .byte 8 // VT_DATE
+ .byte 4 // VT_BSTR
+ .byte 4 // VT_DISPATCH
+ .byte 4 // VT_ERROR
+ .byte 4 // VT_BOOL
+ .byte 16 // VT_VARIANT
+ .byte 4 // VT_UNKNOWN
+ .byte 0 // unused
+ .byte 0 // unused
+ .byte 4 // VT_I1
+ .byte 4 // VT_UI1
+
+
+ .align 2
+rgfStructReturn:
+ .byte 0 // VT_EMPTY
+ .byte 0 // VT_NULL
+ .byte 0 // VT_I2
+ .byte 0 // VT_I4
+ .byte 0 // VT_R4
+ .byte 0 // VT_R8
+ .byte 1 // VT_CY
+ .byte 0 // VT_DATE
+ .byte 0 // VT_BSTR
+ .byte 0 // VT_DISPATCH
+ .byte 0 // VT_ERROR
+ .byte 0 // VT_BOOL
+ .byte 1 // VT_VARIANT
+ .byte 0 // VT_UNKNOWN
+ .byte 0 // unused
+ .byte 0 // unused
+ .byte 0 // VT_I1
+ .byte 0 // VT_UI1
+
+
+ .align 4
+LPushValJmpTab:
+ .word LNextArg // VT_EMPTY [0]
+ .word LPush4 // VT_NULL [4]
+ .word LPush2 // VT_I2 [2]
+ .word LPush4 // VT_I4 [4]
+ .word LPush4 // VT_R4 [4]
+ .word LPushR8 // VT_R8 [8]
+ .word LPush8 // VT_CY [8]
+ .word LPushR8 // VT_DATE [8]
+ .word LPush4 // VT_BSTR [4]
+ .word LPush4 // VT_DISPATCH [4]
+ .word LPush4 // VT_ERROR [4]
+ .word LPush2 // VT_BOOL [2]
+ .word LPushVar // VT_VARIANT [16]
+ .word LPush4 // VT_UNKNOWN [4]
+ .word 0 // unused
+ .word 0 // unused
+ .word LPush2 // VT_I1 [2]
+ .word LPush2 // VT_UI1 [2]
+
+ .align 4
+LRetValJmpTab:
+ .word LDone // VT_EMPTY
+ .word LRetI4 // VT_NULL
+ .word LRetI2 // VT_I2
+ .word LRetI4 // VT_I4
+ .word LRetR4 // VT_R4
+ .word LRetR8 // VT_R8
+ .word LRetCy // VT_CY
+ .word LRetR8 // VT_DATE
+ .word LRetPtr // VT_BSTR
+ .word LRetPtr // VT_DISPATCH
+ .word LRetI4 // VT_ERROR
+ .word LRetI2 // VT_BOOL
+ .word LRetVar // VT_VARIANT
+ .word LRetPtr // VT_UNKNOWN
+ .word 0 // unused
+ .word 0 // unused
+ .word 0 // unused (VT_I1)
+ .word LRetUI1 // VT_UI1
+
+
+
+
+ SBTTL("InvokeStdCall")
+//++
+//
+// ULONG // HRESULT
+// InvokeStdCall (
+// IN PVOID _this, // void FAR*
+// IN DWORD oVft, // unsigned int
+// IN DWORD vtReturn, // unsigned int
+// IN DWORD cActuals, // unsigned int
+// IN PVOID rgvt, // VARTYPE FAR*
+// IN PVOID rgpvarg, // VARIANTARG FAR* FAR*
+// OUT PVOID pvargResult // VARIANT FAR*
+// )
+//
+// Routine Description:
+//
+// Invoke a virtual StdCall method using the given _this pointer,
+// method index and array of parameters.
+//
+// Arguments:
+//
+// _this (a0) - Supplies a pointer to the method to invoke.
+//
+// oVft (a1) - vTable offset into _this ptr
+//
+// vtReturn (a2) - the VARTYPE of the return value.
+//
+// cActuals (a3) - count of the number of actuals.
+//
+// rgvt 4*4(sp) - array of VARTYPES describing the methods formals.
+//
+// rgpvarg 5*4(sp) - array of VARIANTARG*s, which map the actuals by
+// position.
+//
+// pvargResult 6*4(sp) - VARIANTARG containing the method return value.
+//
+// Return Value:
+//
+// v0 - g_S_OK (extern value)
+// g_E_INVALIDARG (extern value)
+//
+// Implementation Note:
+//
+// MIPS StdCall method arguments are push on the stack left to right.
+// The stack grows downward (pushing decrements stack address). Data
+// alignment on the stack starts from arg1 upward. Callee cleans.
+//
+// Per MIPS calling conventions used by the Centuar compiler (mcl),
+// the following rules are followed:
+//
+// 1. Stack frame must be DWORD (8-bytes) aligned. The argument
+// build part of the stack frame must be a minimum of 16 bytes,
+// even if no arguments are passed.
+//
+// 2. VT_I2 (16-bits) are push on the stack as a WORD (32-bits).
+//
+// 3. Double precision floating point numbers (VT_R8, VT_DATE)
+// must be push on the stack on a DWORD boundary.
+//
+// 4. Structures are pushed on the stack by value. They need to be
+// DWORD aligned on the stack if the struct contains a R8 type
+// (e.g., VARIANT is DWORD aligned, where as, CY isn't).
+// They are returned in the v0 register which contains the address
+// of a hidden argument (vargHiddenParm) allocated by the caller and
+// pushed as the second argument [a1] on the stack (1st argument [a0]
+// for non-vtable calls).
+//
+// 5. On vtable-based calls, _this is passed as the first argument [a0].
+//
+// 6. Registers [a0 - a3] must be set before calling, if used.
+// Some registers aren't used either when there are less than
+// 4 arguments or the space between 0(sp) to 16(sp) is used
+// for filler because of a double precision argument alignment.
+//
+// 7. Registers [f12, f14] are set before calling, if used.
+// It isn't used for vtable-based dispatching.
+//
+// 8. Return values are handled as follows:
+//
+// vartype fundamental return register
+// ---------------------------------------------------
+// VT_UI1 unsigned char a0
+// VT_I2 short a0
+// VT_I4 long a0
+// VT_R4 float f0
+// VT_R8 double f0
+// VT_DATE double f0
+// VT_CY struct a0 (address of struct return)
+// VT_BSTR char FAR* a0
+// VT_UNKNOWN void FAR* a0
+// VT_DISPATCH void FAR* a0
+// VT_ERROR long a0
+// VT_BOOL short a0
+// VT_VARIANT VARIANTARG a0 (address of struct return)
+//
+//
+// NOTES: NO support for VT_ARRAY
+//
+//--
+
+
+// Stack Frame
+ .struct 0
+
+SavedS0: .space 4
+SavedS1: .space 4
+SavedSP: .space 4
+SavedRA: .space 4
+
+vargHiddenParm: .space 8*4 // temporary for struct return
+
+StackFrameLength:
+
+_this: .space 4 // a0 0*4(sp)
+oVft: .space 4 // a1 1*4(sp) arg only takes 2 bytes
+vtReturn: .space 4 // a2 2*4(sp) arg only takes 2 bytes
+cActuals: .space 4 // a3 3*4(sp)
+rgvt: .space 4 // 4*4(sp)
+rgpvarg: .space 4 // 5*4(sp)
+pvargResult: .space 4 // 6*4(sp)
+
+
+ .text
+ .align 4
+ .globl InvokeStdCall
+ .ent InvokeStdCall, 0
+
+InvokeStdCall:
+
+ .set noreorder
+ .set at
+
+ subu sp, StackFrameLength // Setup our stack frame
+
+ .frame sp, StackFrameLength, ra
+
+ sw ra, SavedRA(sp) // Save $ra
+ sw s0, SavedS0(sp) // Save our current s1
+ sw s1, SavedS1(sp) // Save our current s1
+ sw sp, SavedSP(sp) // Save our current sp
+
+ sw a0, _this(sp) // Save
+ sw a1, oVft(sp) // all
+ sw a2, vtReturn(sp) // arg
+ sw a3, cActuals(sp) // regs
+
+
+ // cannot return byRef
+ //
+ andi a2, VT_BYREF // Isolate VT_Mode bits
+ bne a2, zero, LRetInvalidArg // Check VT_Type
+ nop //*
+
+
+ // Setup arguments if any
+ //
+ bne a3, zero, LCalcStackSize
+ nop
+
+
+ // if no arguments, still adjust stack per MIPS convention
+ // and call directly
+ addiu s1, sp, -16 // s1 = adjusted stack pointer
+ b LPushThis
+ move s0, s1 // s0 = arg loc
+
+
+LCalcStackSize:
+
+ // calculate space need for pushing arguments on stack
+
+ lw t3, rgvt(sp) // t3 = &rgvt[0]
+
+ li s1, 4 // add 4 for _this
+
+ lhu t1, vtReturn(sp) // add 4 if struct return
+ nop
+
+#if 0
+ andi t1, VT_NOMODE
+#else
+ andi t0, t1, VT_BYREF | VT_ARRAY // Isolate mode bits
+ bne t0, zero, LCalcStackLoop // ByRefs don't return structs
+ nop
+#endif
+ la t0, rgfStructReturn
+ add t0, t0, t1
+ lbu t0, 0(t0)
+ nop
+ beq t0, zero, LCalcStackLoop
+ nop
+ addiu s1, s1, 4
+
+
+LCalcStackLoop:
+
+ lhu t6, (t3) // t6 = rgvt[i]
+ nop
+
+ andi t0, t6, VT_BYREF | VT_ARRAY // Isolate mode bits
+ bne t0, zero, LCalcAdd // all ByRefs are sizeof(FAR*)
+ li t1, 4
+
+ andi t6, VT_NOMODE // Turn off mode bits
+ beq t6, VT_UI1, LValidVartype1
+ bge t6, VT_MAX, LRetInvalidArg // Error if Max or above
+ nop
+
+LValidVartype1:
+ la t0, rgcbVtStackSize
+ add t0, t0, t6
+ lbu t1, (t0) // t1 = rgcbVtSize[i]
+
+ beq t6, VT_R8, LAddFiller // Special Alignment for R8
+ nop
+ beq t6, VT_DATE, LAddFiller
+ nop
+ b LCalcAdd
+ nop
+
+
+LAddFiller:
+
+ move t0, s1 // check DWORD boundary
+ andi t0, 0x7
+ beq t0, zero, LCalcAdd
+ nop
+
+ addiu s1, s1, 4 // aligned stack
+
+
+LCalcAdd:
+
+ add s1, s1, t1 // increment stack size
+
+ addiu t3, t3, 2 // &rgvt[i++]
+ addiu a3, a3, -1 // cActual--
+ bne a3, zero, LCalcStackLoop // If more args, go again
+ nop
+
+ move t0, s1 // make sure new 0(sp)
+ andi t0, 0x7 // at DWORD boundary
+ beq t0, zero, LSetupParms
+ nop
+
+ addiu s1, s1, 4 // aligned stack
+
+
+LSetupParms:
+
+ neg s1
+ add s1, sp, s1 // s1 = adjusted stack pointer
+ move s0, s1 // s0 = arg stack loc
+
+ lw a3, cActuals(sp) // a3 = cActuals
+ lw t2, rgpvarg(sp) // t2 = &rgpvarg[0]
+ lw t3, rgvt(sp) // t3 = &rgvt[0]
+ addiu t0, a3, -1
+ sll t0, 2
+ nop
+ addu t9, t2, t0 // t9 = &rgpvarg[cArgs - 1]
+
+
+
+LPushThis:
+
+ lw t1, _this(sp)
+ nop
+ sw t1, 0(s1)
+ addiu s0, s0, 4 // adjust arg loc
+
+
+LPushHiddenArg:
+
+ // Check if we need to return a structure, if so
+ // move the address of the vargHiddenParm as
+ // the second (hidden) argument
+ //
+
+ lhu t1, vtReturn(sp)
+ nop // ********** FILL ***********
+#if 0
+ andi t1, VT_NOMODE // Turn off mode bits
+#else
+ andi t0, t1, VT_BYREF | VT_ARRAY // Isolate mode bits
+ bne t0, zero, LCheckArgs // ByRefs don't return structs
+ nop
+#endif
+
+ la t0, rgfStructReturn // t0 = &rgfStructReturn
+ add t0, t0, t1 // t0 = &rgfStructReturn[i]
+ lbu t0, 0(t0) // t0 = rgfStructReturn[i]
+ nop // ********** FILL ***********
+
+ beq t0, zero, LCheckArgs // Jmp if no struc to be ret
+ nop //*
+
+ la t1, vargHiddenParm(sp) // Have to push an extra parm
+ sw t1, 4(s1)
+ addiu s0, s0, 4 // adjust arg loc
+
+LCheckArgs:
+
+ beq a3, zero, LDoCall
+ nop
+
+LPushArgs:
+
+ lw t5, (t2) // t5 = rgpvarg[i]
+ lhu t6, (t3) // t6 = rgvt[i]
+ nop // ********** FILL ***********
+
+ andi t6, t6, VT_BYREF | VT_ARRAY // Isolate mode bits
+ bne t6, zero, LPush4 // all ByRefs are sizeof(FAR*)
+ nop // ********** FILL ***********
+
+ lhu t6, (t3) // t6 = rgvt[i]
+ nop // ********** FILL ***********
+ andi t6, VT_NOMODE // Turn off mode bits
+ beq t6, VT_UI1, LValidVartype2
+ bge t6, VT_MAX, LRetInvalidArg // Error if Max or above
+ nop
+
+LValidVartype2:
+ move t1, t6
+ sll t1, 2 // WORD offset
+ la t0, LPushValJmpTab // Get Address of ret table
+ addu t0, t1, t0 // Get Address of ret routine
+ lw t0, 0(t0)
+ nop // ********** FILL ***********
+ j t0 // Go execute the push code
+ nop
+
+ b LRetInvalidArg // Invalid arg if still here
+ nop //*
+
+
+LPushVar: // 16 bytes of data
+
+ move t1, s0
+ andi t1, 0x7
+ beq t1, zero, LAlignedVar
+ nop
+
+ addiu s0, s0, 4 // aligned stack
+
+LAlignedVar:
+
+ lw t1, 0(t5) // Push 1st WORD
+ nop // ********** FILL ***********
+ sw t1, 0(s0)
+
+ lw t1, 4(t5) // Push 2nd WORD
+ nop // ********** FILL ***********
+ sw t1, 4(s0)
+
+ lw t1, 8(t5) // Push 3rd WORD
+ nop // ********** FILL ***********
+ sw t1, 8(s0)
+
+ lw t1, 12(t5) // Push 4rd WORD
+ nop // ********** FILL ***********
+ sw t1, 12(s0) //*
+
+ b LNextArg
+ addiu s0, s0, 16 // adjust arg loc
+
+
+LPushR8: // 8 bytes of R8 data
+
+ move t1, s0
+ andi t1, 0x7
+ beq t1, zero, LAlignedR8
+ nop
+
+ addiu s0, s0, 4 // aligned stack
+
+LAlignedR8:
+
+ l.d f16, dw0(t5)
+ nop
+ s.d f16, 0(s0)
+
+ b LNextArg
+ addiu s0, s0, 8 // adjust arg loc
+
+
+LPush8: // 8 bytes of R8 data
+
+ lw t1, dw0(t5) // Push 1st WORD
+ nop // ********** FILL ***********
+ sw t1, 0(s0)
+
+ lw t1, dw2(t5) // Push 2nd WORD
+ nop
+ sw t1, 4(s0) //*
+
+ b LNextArg
+ addiu s0, s0, 8 // adjust arg loc
+
+
+LPush4: // 4 bytes of data
+
+ lw t1, dw0(t5) // Push 1st WORD
+ nop
+ sw t1, 0(s0)
+
+ addiu s0, s0, 4 // adjust arg loc
+ b LNextArg
+ nop
+
+
+LPush2: // 4 bytes of data
+
+ lh t1, dw0(t5) // Push HWORD (as 32-bit)
+ nop
+ sw t1, 0(s0)
+
+ b LNextArg
+ addiu s0, s0, 4 // adjust arg loc
+
+
+LNextArg:
+ addiu t2, t2, 4 // &rgpvarg[i++]
+ addiu t3, t3, 2 // &rgvt[i++]
+ ble t2, t9, LPushArgs // If more args, go again
+ nop
+
+
+LDoCall:
+
+ // load registers
+ //
+ lw a0 , 0(s1) // Set a0-a3
+ lw a1, 4(s1)
+ lw a2, 8(s1)
+ lw a3, 12(s1)
+
+
+ // load the vtable offset
+ //
+ lw t0, _this(sp) // this
+ nop // ********** FILL ***********
+ lw t0, 0(t0) // address of vtable
+
+ lw t1, oVft(sp) // Get the vtable offset
+ nop // ********** FILL ***********
+ addu t0, t0, t1 // Get addr of ptr to func
+ lw t0, (t0) // Get ptr to func in vtable
+
+
+ // call virtual member function
+ //
+ addiu s0, sp, 0 // s0 = sp
+ jal t0 // Invoke the Idispatch func
+ addiu sp, s1, 0 // sp = new sp
+ addiu sp, s0, 0 // Restore our SP
+
+
+ // Get return argument
+ //
+
+ lhu t1, vtReturn(sp) // t1 = vtType to return
+ lw t3, pvargResult(sp) // Get RetData Area
+ nop // ********** FILL ***********
+ sh t1, vt(t3) // varResult->vt
+
+ andi t2, t1, VT_BYREF | VT_ARRAY // Check ret mode
+ bne t2, zero, LRetPtr // If !0 -> go ret a ptr
+ nop //*
+
+ andi t1, VT_NOMODE // Turn off mode bits
+ beq t1, VT_UI1, LValidVartype3
+ bge t1, VT_MAX, LRetInvalidArg // Error if Max or above
+ nop //*
+
+LValidVartype3:
+ sll t1, 2 // WORD offset
+ la t2, LRetValJmpTab // Get Address of ret table
+ addu t2, t1, t2 // Get Address of ret routine
+ lw t2, 0(t2)
+ nop // ********** FILL ***********
+ j t2 // Go execute the ret code
+ nop
+
+LRetVar:
+ lw t1, 0(v0) // Get 1st DWORD
+ nop // ********** FILL ***********
+ sw t1, 0(t3) // Save it in pvArgResult
+
+ lw t1, 4(v0) // Get 2nd DWORD
+ nop // ********** FILL ***********
+ sw t1, 4(t3) // Store 2nd DWORD
+
+ lw t1, 8(v0) // Get 3rd DWORD
+ nop // ********** FILL ***********
+ sw t1, 8(t3) // Store 3rd DWORD
+
+ lw t1, 12(v0) // Get 4th DWORD
+
+
+ b LDone // Done
+ sw t1, 12(t3) //*Store 4th DWORD
+
+
+LRetR4:
+ addiu t3, t3, VARIANT_DATA_OFFSET // Bump saved area
+ b LDone // Done
+ swc1 f0, 0(t3) //*
+
+
+LRetR8:
+ addiu t3, t3, VARIANT_DATA_OFFSET // Bump saved area
+ b LDone // Done
+ sdc1 f0, 0(t3) //*
+
+
+LRetCy:
+ addiu t3, t3, VARIANT_DATA_OFFSET // Bump saved area
+
+ lw t1, 0(v0) // cy.Lo
+ nop // ********** FILL ***********
+ sw t1, 0(t3)
+
+ lw t1, 4(v0) // cy.Hi
+
+ b LDone // Done
+ sw t1, 4(t3) //*
+
+
+LRetI4:
+LRetPtr:
+ addiu t3, t3, VARIANT_DATA_OFFSET // Bump saved area
+ b LDone // Done
+ sw v0, 0(t3) //*
+
+
+LRetUI1:
+LRetI2:
+ sh v0, dw0(t3)
+
+LDone:
+ la t0, g_S_OK //*v0 = g_S_OK
+ b ExitInvoke
+ lw v0, 0(t0)
+
+
+LRetInvalidArg:
+ la t0, g_E_INVALIDARG // v0 = g_E_INVALIDARG
+ lw v0, 0(t0)
+
+ExitInvoke:
+ lw s0, SavedS0(sp) // Restore s0
+ lw s1, SavedS1(sp) // Restore s1
+ lw ra, SavedRA(sp) // reload ra
+ lw sp, SavedSP(sp) // Restore sp to be sure
+ nop // ********** FILL ***********
+ addu sp, StackFrameLength
+ j ra // jump back to parent routine
+ nop
+
+ .end InvokeStdCall
diff --git a/private/oleauto/src/dispatch/win32/mips/invtest.cpp b/private/oleauto/src/dispatch/win32/mips/invtest.cpp
new file mode 100644
index 000000000..7add928e4
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/mips/invtest.cpp
@@ -0,0 +1,413 @@
+#define CALLCONV __stdcall
+
+#include "invtest.h"
+
+class Foo
+{
+ public:
+ virtual void empty();
+ virtual short i2(short, short*);
+ virtual long i4(short, long, long*);
+ virtual float r4(short, long, float, float, float*);
+ virtual float r4x(float, float, float*);
+ virtual double r8(short, long, float, double, double, double*);
+ virtual double r8x(double, double, double*);
+ virtual double r8x2(short, float, double);
+ virtual VARIANT_BOOL bool(short, long, float, double, VARIANT_BOOL);
+ virtual SCODE scode(short, long, float, double, VARIANT_BOOL, SCODE);
+ virtual CY cy(short, long, float, double, VARIANT_BOOL, SCODE, CY, CY*);
+ virtual CY cyx(CY, CY*);
+ virtual CY cyx2(short, CY);
+ virtual void cyx3(CY);
+ virtual DATE date(short, long, float, double, VARIANT_BOOL,
+ SCODE, CY, DATE, DATE*);
+ virtual BSTR bstr(short, long, float, double, VARIANT_BOOL,
+ SCODE, CY, DATE, BSTR, BSTR*);
+ virtual IUnknown* interface(short, long, float, double, VARIANT_BOOL,
+ SCODE, CY, DATE, BSTR, IUnknown*, IUnknown**);
+ virtual VARIANT variant(short, long, float, double, VARIANT_BOOL,
+ SCODE, CY, DATE, BSTR, IUnknown*, VARIANT, VARIANT*);
+ virtual VARIANT variantx(VARIANT, VARIANT*);
+ virtual VARIANT variantx2(short, VARIANT);
+};
+
+void Foo::empty()
+{
+ int i, i2;
+ i += 100;
+ i2 = 200;
+}
+
+short Foo::i2(short i, short* i2)
+{
+ i += 100;
+ *i2 = 200;
+ return i;
+}
+
+
+long Foo::i4(short i, long l, long* l2)
+{
+ i += 100;
+ l += 2000;
+ *l2 = 5000;
+ return l;
+}
+
+
+float Foo::r4(short i, long l, float f, float f2, float* f3)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ f2 += 34232.43242;
+ *f3 = 5432.232;
+ return f;
+}
+
+float Foo::r4x(float f, float f2, float* f3)
+{
+ f += 3000.345;
+ f2 += 34232.43242;
+ *f3 = 5432.232;
+ return f;
+}
+
+
+double Foo::r8(short i, long l, float f, double d, double d2, double* d3)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ d += 4000.888;
+ d2 += 8000.333;
+ *d3 = 5000.0;
+ return d;
+}
+
+double Foo::r8x(double d, double d2, double* d3)
+{
+ d += 4000.888;
+ d2 += 8000.333;
+ *d3 = 5000.0;
+ return d;
+}
+
+double Foo::r8x2(short i, float f, double d)
+{
+ i += 100;
+ f += 3000.345;
+ d += 4000.888;
+ return d;
+}
+
+
+VARIANT_BOOL Foo::bool(short i, long l, float f, double d, VARIANT_BOOL b)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ d += 4000.888;
+ b = b ? 0 : 1;
+ return b;
+}
+
+SCODE Foo::scode(short i, long l, float f, double d, VARIANT_BOOL b, SCODE s)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ d += 4000.888;
+ b = 1;
+ s = 0x80001;
+ return s;
+}
+
+CY Foo::cy(short i, long l, float f, double d, VARIANT_BOOL b, SCODE s,
+ CY c, CY* c2)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ d += 4000.888;
+ b = 1;
+ s = 0x80001;
+ c.Lo = 10;
+ c.Hi = 20;
+ c2->Lo = 30;
+ c2->Hi = 40;
+ return c;
+}
+
+CY Foo::cyx(CY c, CY* c2)
+{
+ c.Lo = 10;
+ c.Hi = 20;
+ c2->Lo = 30;
+ c2->Hi = 40;
+ return c;
+}
+
+CY Foo::cyx2(short i, CY c)
+{
+ i += 100;
+ c.Lo = 10;
+ c.Hi = 20;
+ return c;
+}
+
+
+void Foo::cyx3(CY c)
+{
+ c.Lo = 10;
+ c.Hi = 20;
+}
+
+
+DATE Foo::date(short i, long l, float f, double d, VARIANT_BOOL b, SCODE s,
+ CY c, DATE date, DATE* date2)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ d += 4000.888;
+ b = 1;
+ s = 0x80001;
+ c.Lo = 10;
+ c.Hi = 20;
+ date += 10.34340;
+ *date2 = 23232.01;
+ return date;
+}
+
+BSTR Foo::bstr(short i, long l, float f, double d, VARIANT_BOOL b, SCODE s,
+ CY c, DATE date, BSTR bstr, BSTR* bstr2)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ d += 4000.888;
+ b = 1;
+ s = 0x80001;
+ c.Lo = 10;
+ c.Hi = 20;
+ date += 10.34340;
+ bstr = "bar";
+ *bstr2 = "foo";
+ return bstr;
+}
+
+IUnknown* Foo::interface(short i, long l, float f, double d,
+ VARIANT_BOOL b, SCODE s, CY c,
+ DATE date, BSTR bstr,
+ IUnknown* punk, IUnknown** punk2)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ d += 4000.888;
+ b = 1;
+ s = 0x80001;
+ c.Lo = 10;
+ c.Hi = 20;
+ date += 10.34340;
+ bstr = "bar";
+ punk = (IUnknown*) this;
+ *punk2 = (IUnknown*) 0;
+ return punk;
+}
+
+
+VARIANT Foo::variant(short i, long l, float f, double d,
+ VARIANT_BOOL b, SCODE s, CY c,
+ DATE date, BSTR bstr, IUnknown* punk,
+ VARIANT v, VARIANT* v2)
+{
+ i += 100;
+ l += 2000;
+ f += 3000.345;
+ d += 4000.888;
+ b = 1;
+ s = 0x80001;
+ c.Lo = 10;
+ c.Hi = 20;
+ date += 10.34340;
+ bstr = "bar";
+ punk = (IUnknown*) this;
+ v.vt = 4;
+ v.iVal = 30;
+ v2->vt = 5;
+ v2->fltVal = 232.03;
+ return v;
+}
+
+VARIANT Foo::variantx(VARIANT v, VARIANT* v2)
+{
+ v.vt = 4;
+ v.iVal = 30;
+ v2->vt = 5;
+ v2->fltVal = 232.03;
+ return v;
+}
+
+
+VARIANT Foo::variantx2(short i, VARIANT v)
+{
+ i += 100;
+ v.vt = 4;
+ v.iVal = 30;
+ return v;
+}
+
+
+extern "C"
+short CALLCONV I2(short _i2, long _l, float _f, double _d)
+{
+ short i2;
+ long l, l2;
+
+ i2 = _i2 + _l + _f + _d;
+ return i2;
+}
+
+extern "C"
+long CALLCONV I4(long _i4, long _t1)
+{
+ short i4;
+
+ i4 = _i4 + 2;
+ return i4;
+}
+
+extern "C"
+float CALLCONV R4(float _r4, float _t1, float _t2)
+{
+ float r4;
+
+ r4 = _r4 + 3.0;
+ return r4;
+}
+
+extern "C"
+double CALLCONV R8(double _r8, double _t1, double _t2, double _t3)
+{
+ double r8;
+
+ r8 = _r8 + 4.0;
+ return r8;
+}
+
+extern "C"
+CY CALLCONV Cy(CY _cy)
+{
+ CY cy;
+
+ cy.Lo = _cy.Lo + 0;
+ cy.Hi = _cy.Hi + 1;
+
+ return cy;
+}
+
+extern "C"
+BSTR CALLCONV Bstr(BSTR _bstr)
+{
+ BSTR bstr;
+
+ bstr = _bstr;
+ return bstr;
+}
+
+extern "C"
+VARIANT CALLCONV Multi(VARIANT v, short i, long l, float f, double d, VARIANT_BOOL bool, SCODE scode, CY cy, DATE date, BSTR bstr, IUnknown* punk)
+{
+ v.iVal = i;
+ v.lVal = l;
+ v.fltVal = f;
+ v.dblVal = d;
+ v.bool = bool;
+ v.scode = scode;
+ v.cyVal = cy;
+ v.date = date;
+ v.bstrVal = bstr;
+ v.punkVal = punk;
+ return v;
+}
+
+
+extern "C"
+void main()
+{
+ short i, i2;
+ long l, l2;
+ float f, f2, f3;
+ double d, d2, d3;
+ VARIANT_BOOL bool;
+ SCODE scode;
+ CY cy, cy2;
+ DATE date, date2;
+ BSTR bstr, bstr2;
+ IUnknown* punk, *punk2;
+ VARIANT v, v2;
+
+ Foo* foo;
+
+ i = 1;
+ i2 = 100;
+ l = 2;
+ l2 = 232;
+ f = 3.0;
+ f2 = 3.1;
+ f3 = 3.2;
+ d = 4.0;
+ d2 = 4.2;
+ d3 = 4.3;
+ bool = 0;
+ scode = 0;
+ cy.Lo = 50;
+ cy.Hi = 100;
+ cy2.Lo = 200;
+ cy2.Hi = 300;
+ date = 1000.000;
+ date2 = 3000.000;
+ bstr = "bstr";
+ bstr2 = "bstr2";
+ punk = (IUnknown*) 0;
+ punk2 = (IUnknown*) 0;
+ v.vt = 2;
+ v.iVal = 5000;
+ v2.vt = 4;
+ v2.fltVal = 232.9032;
+
+ foo = new Foo();
+
+ foo->empty();
+ i = foo->i2(i, &i2);
+ l = foo->i4(i, l, &l2);
+ f = foo->r4(i, l, f, f2, &f3);
+ f2 = foo->r4x(f, f2, &f3);
+ d = foo->r8(i, l, f, d, d2, &d3);
+ d2 = foo->r8x(d, d2, &d3);
+ d2 = foo->r8x2(i, f, d);
+ bool = foo->bool(i, l, f, d, bool);
+ scode = foo->scode(i, l, f, d, bool, scode);
+ cy = foo->cy(i, l, f, d, bool, scode, cy, &cy2);
+ cy2 = foo->cyx(cy, &cy2);
+ cy2 = foo->cyx2(i, cy);
+ foo->cyx3(cy);
+ date = foo->date(i, l, f, d, bool, scode, cy, date, &date2);
+ bstr = foo->bstr(i, l, f, d, bool, scode, cy, date, bstr, &bstr2);
+ punk = foo->interface(i, l, f, d, bool, scode, cy,
+ date, bstr, punk, &punk2);
+ v = foo->variant(i, l, f, d, bool, scode, cy,
+ date, bstr, punk, v, &v2);
+ v2 = foo->variantx(v, &v2);
+ v2 = foo->variantx2(i, v);
+
+ i = I2(i, l, f, d);
+ l = I4(l, l2);
+ f = R4(f, f2, f3);
+ d = R8(d, d2, d3, d3);
+ cy = Cy(cy2);
+ bstr = Bstr(bstr2);
+ v2 = Multi(v, i, l, f, d, bool, scode, cy, date, bstr, punk);
+}
diff --git a/private/oleauto/src/dispatch/win32/mips/invtest.h b/private/oleauto/src/dispatch/win32/mips/invtest.h
new file mode 100644
index 000000000..5298c3fce
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/mips/invtest.h
@@ -0,0 +1,72 @@
+typedef short VARIANT_BOOL;
+
+typedef long SCODE;
+
+typedef struct tagCY {
+ unsigned long Lo;
+ long Hi;
+} CY;
+
+typedef double DATE;
+
+typedef char* BSTR;
+
+class IUnknown;
+class IDispatch;
+
+typedef struct tagSAFEARRAYBOUND {
+ unsigned long cElements;
+ long lLbound;
+} SAFEARRAYBOUND;
+
+typedef struct tagSAFEARRAY {
+ unsigned short cDims;
+ unsigned short fFeatures;
+ unsigned short cbElements;
+ unsigned short cLocks;
+ unsigned long handle;
+ void* pvData;
+ SAFEARRAYBOUND rgsabound[1];
+} SAFEARRAY;
+
+
+typedef unsigned short VARTYPE;
+typedef struct tagVARIANT VARIANT;
+
+struct tagVARIANT {
+ VARTYPE vt;
+ unsigned short wReserved1;
+ unsigned short wReserved2;
+ unsigned short wReserved3;
+ union {
+ short iVal; /* VT_I2 */
+ long lVal; /* VT_I4 */
+ float fltVal; /* VT_R4 */
+ double dblVal; /* VT_R8 */
+ VARIANT_BOOL bool; /* VT_BOOL */
+ SCODE scode; /* VT_ERROR */
+ CY cyVal; /* VT_CY */
+ DATE date; /* VT_DATE */
+ BSTR bstrVal; /* VT_BSTR */
+ IUnknown * punkVal; /* VT_UNKNOWN */
+ IDispatch * pdispVal; /* VT_DISPATCH */
+ SAFEARRAY * parray; /* VT_ARRAY|* */
+
+ short * piVal; /* VT_BYREF|VT_I2 */
+ long * plVal; /* VT_BYREF|VT_I4 */
+ float * pfltVal; /* VT_BYREF|VT_R4 */
+ double * pdblVal; /* VT_BYREF|VT_R8 */
+ VARIANT_BOOL * pbool; /* VT_BYREF|VT_BOOL */
+ SCODE * pscode; /* VT_BYREF|VT_ERROR */
+ CY * pcyVal; /* VT_BYREF|VT_CY */
+ DATE * pdate; /* VT_BYREF|VT_DATE */
+ BSTR * pbstrVal; /* VT_BYREF|VT_BSTR */
+ IUnknown * * ppunkVal; /* VT_BYREF|VT_UNKNOWN */
+ IDispatch * * ppdispVal; /* VT_BYREF|VT_DISPATCH */
+ SAFEARRAY * * pparray; /* VT_BYREF|VT_ARRAY|* */
+ VARIANT * pvarVal; /* VT_BYREF|VT_VARIANT */
+
+ void * byref; /* Generic ByRef */
+ };
+};
+
diff --git a/private/oleauto/src/dispatch/win32/oleconva.cpp b/private/oleauto/src/dispatch/win32/oleconva.cpp
new file mode 100644
index 000000000..2fbc01c60
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/oleconva.cpp
@@ -0,0 +1,549 @@
+/***
+*oleconva.cpp
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module contains the low level VARTYPE coersion API.
+* On RISC platforms go for portability, hence C/C++.
+*
+*Revision History:
+*
+* [00] 7-Sept-93 tomteng: Created from silver\rt\oleconv.c
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+ASSERTDATA
+
+extern "C" {
+
+// Note: the floating point IN params on the following utilities are
+// passed byref, because mpw and wings pass floating point values
+// differently byval, and we need to interface these asm routines
+// with both compilers.
+
+INTERNAL_(HRESULT) ErrCyFromI2(short sIn, CY FAR* pcyOut);
+INTERNAL_(HRESULT) ErrCyFromI4(long lIn, CY FAR* pcyOut);
+INTERNAL_(HRESULT) ErrCyFromR4(float FAR* pfltIn, CY FAR* pcyOut);
+INTERNAL_(HRESULT) ErrCyFromR8(double FAR* pdlbIn, CY FAR* pcyOut);
+INTERNAL_(HRESULT) ErrI2FromCy(CY cyIn, short FAR* psOut);
+INTERNAL_(HRESULT) ErrI4FromCy(CY cyIn, long FAR* plOut);
+INTERNAL_(HRESULT) ErrR4FromCy(CY cyIn, float FAR* pfltOut);
+INTERNAL_(HRESULT) ErrR8FromCy(CY cyIn, double FAR* pdblOut);
+INTERNAL_(HRESULT) ErrMultCyI4(CY cyIn, long lIn, CY FAR* pcyOut);
+
+
+PRIVATE_(int) FMakePosCy (CY *pcyValue);
+PRIVATE_(void) PackCy (CY *pcy, unsigned long *plValues);
+PRIVATE_(void) UnpackCy (CY *pcy, unsigned long *plValues);
+
+#define C2TO32TH 4294967296.0
+
+/***
+* ErrCyFromI2 - convert I2 to currency
+* Purpose:
+* The specified two-byte integer value is multiplied by 10000
+* and returned in a currency value.
+*
+* Entry:
+* sIn - two-byte integer input value
+*
+* Exit:
+* pcyOut - pointer to currency result
+* returns error:
+* DISP_E_OVERFLOW - result is outside currency range.
+* NOERROR - no error
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+ErrCyFromI2(short sIn, CY FAR* pcyOut)
+{
+ return ErrCyFromI4((long)sIn, pcyOut);
+}
+
+/***
+* ErrCyFromI4 - convert I4 to currency
+* Purpose:
+* The specified four-byte integer value is multiplied by 10000
+* and returned in a currency value.
+*
+* Entry:
+* lIn - four-byte integer input value
+*
+* Exit:
+* pcyOut - pointer to currency result
+* returns error:
+* DISP_E_OVERFLOW - result is outside currency range.
+* NOERROR - no error
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+ErrCyFromI4(long lInput, CY FAR* pcyOut)
+{
+ BOOL fNegative = lInput < 0;
+
+ unsigned long templow;
+ unsigned long tempmid;
+
+ if (fNegative)
+ lInput = -lInput;
+
+ templow = ((unsigned long)lInput & 0xffff) * 10000;
+ tempmid = ((unsigned long)lInput >> 16) * 10000;
+
+ pcyOut->Hi = tempmid >> 16;
+ pcyOut->Lo = templow + (tempmid << 16);
+ if (pcyOut->Lo < templow)
+ pcyOut->Hi++;
+
+ if (fNegative) {
+ pcyOut->Hi = ~pcyOut->Hi;
+ if ((pcyOut->Lo = (unsigned long)(-(long)pcyOut->Lo)) == 0)
+ pcyOut->Hi++;
+ }
+
+ return NOERROR;
+}
+
+INTERNAL_(HRESULT)
+ErrCyFromR4(float FAR* pfltIn, CY FAR* pcyOut)
+{
+ double dbl = (double) *pfltIn;
+ return ErrCyFromR8(&dbl, pcyOut);
+}
+
+/***
+* ErrCyFromR8 - return error for double-real to currency conversion
+* Purpose:
+* Convert an eight-byte real value to a currency and return
+* any error status.
+*
+* Entry:
+* pdblIn - pointer to an eight-byte input value
+*
+* Exit:
+* pcyOut - pointer to currency result
+* returns error:
+* DISP_E_OVERFLOW - result is outside currency range.
+* NOERROR - no error
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+ErrCyFromR8(double FAR* pdlbIn, CY FAR* pcyOut)
+{
+ BOOL fNegative = FALSE;
+ double dblInput = *pdlbIn;
+ double dblHi, dblLo;
+ float flt;
+ double dblDif;
+
+ // test for overflow first
+ // [Note: We are counting on the compiler rounding the following numbers
+ // correctly (by IEEE rules to the nearest R8). The magnitude of these
+ // numbers are rounded up and, thus, are always outside the legal range
+ // for currency.
+ if (dblInput >= 922337203685477.58 ||
+ dblInput <= -922337203685477.58)
+ return RESULT(DISP_E_OVERFLOW);
+
+ // if negative, set flag and make positive
+ if (dblInput < 0.0) {
+ fNegative = TRUE;
+ dblInput = -dblInput;
+ }
+
+ // In order to maintain the necessary precision when multiplying
+ // by 10000 (i.e., going from 53-bit to 64-bit), split the
+ // input value into two different doubles and perform calcs using
+ // them:
+ //
+ // dblHi = has low bits 0
+ // dblLo = has high bits 0
+ //
+
+ // split input into two parts
+ // Note: compiler doesn't do the right thing with this:
+ // "dblHi = (double) (float) dblInput"
+ flt = (float) dblInput;
+ dblHi = (double) flt; // input rounded to 24-bit precision
+ dblLo = dblInput - dblHi; // diff between 24- and 53-bit input value
+
+ // bias for currency
+
+ dblHi = dblHi * 10000;
+ dblLo = dblLo * 10000;
+
+ // calculate cy.Hi
+ pcyOut->Hi = (long) ((dblLo + dblHi) / C2TO32TH);
+
+ // calculate cy.Lo
+ dblHi -= (((double) pcyOut->Hi) * C2TO32TH);
+ pcyOut->Lo = (unsigned long) (dblLo + dblHi);
+
+ // round as necessary
+ dblDif = (dblLo + dblHi) - (double)(pcyOut->Lo);
+ if ( (dblDif > 0.5) || ((dblDif == 0.5) && (pcyOut->Lo & 1)) ) {
+ pcyOut->Lo++;
+ if (pcyOut->Lo == 0)
+ pcyOut->Hi++;
+ }
+
+ // negate the result if input was negative
+ if (fNegative) {
+ pcyOut->Hi = ~pcyOut->Hi;
+ if ((pcyOut->Lo = (unsigned long)(-(long)pcyOut->Lo)) == 0)
+ pcyOut->Hi++;
+ }
+
+ return NOERROR;
+}
+
+
+/***
+* ErrI2FromCy - return error for currency to two-byte integer conversion
+***********************************************************************/
+INTERNAL_(HRESULT)
+ErrI2FromCy(CY cyIn, short FAR* psOut)
+{
+ long lValue;
+ HRESULT hresult;
+
+ hresult = ErrI4FromCy(cyIn, &lValue);
+ if (hresult == NOERROR) {
+ if (lValue < -32768L || lValue > 32767L)
+ hresult = RESULT(DISP_E_OVERFLOW);
+ else
+ *psOut = (short)lValue;
+ }
+
+ return hresult;
+}
+
+/***
+* ErrI4FromCy - return error for currency to four-byte integer conversion
+* Purpose:
+* Convert a currency value to a four-byte integer and return
+* any error status.
+*
+* Entry:
+* cyInput - currency input value
+*
+* Exit:
+* plOut - pointer to four-byte integer result
+* returns error:
+* DISP_E_OVERFLOW - result is outside currency range.
+* NOERROR - no error
+*
+***********************************************************************/
+INTERNAL_(HRESULT)
+ErrI4FromCy(CY cyIn, long FAR* plOut)
+{
+ BOOL fNegative;
+ int index;
+
+ unsigned long lValue[4];
+ short sRemainder;
+
+ // convert value to a positive sign
+ fNegative = FMakePosCy(&cyIn);
+
+ // unpack the input currency into four long words
+ // least significant in [0] to most in [3].
+ UnpackCy(&cyIn, lValue);
+
+ // divide the unpacked value by 10000 and get remainder.
+ // process from most to least significant part and leave
+ // the remainder in the extra fifth part.
+ for (index = 3; index > 0; index--) {
+ lValue[index - 1] |= (lValue[index] % 10000) << 16;
+ lValue[index] /= 10000;
+ }
+
+ sRemainder = (short)(lValue[0] % 10000);
+ lValue[0] /= 10000;
+
+ // pack the values back into a CY
+ PackCy(&cyIn, lValue);
+
+ // round value up if:
+ // remainder is greater than 5000, or
+ // remainder is equal to 5000 and unrounded result is odd.
+ if (sRemainder > 5000 || (sRemainder == 5000 && (cyIn.Lo & 1))) {
+ cyIn.Lo++;
+ if (cyIn.Lo == 0)
+ cyIn.Hi++;
+ }
+
+ // test for overflow - high part must be zero and
+ // lower part must not be greater than 0x7fffffff
+ // for a positive value and 0x80000000 for negative.
+ if (cyIn.Hi != 0 ||
+ cyIn.Lo > (0x7fffffff + (unsigned long)fNegative))
+ return RESULT(DISP_E_OVERFLOW);
+
+ // if negative, convert only the low part
+ if (fNegative)
+ cyIn.Lo = (unsigned long)(-(long)cyIn.Lo);
+
+ *plOut = (long)cyIn.Lo;
+
+ return NOERROR;
+}
+
+
+/***
+* rtR4FromCy - convert currency to R4
+* Purpose:
+* The specified currency value is scaled to a
+* single-precision real value.
+*
+* Entry:
+* cyInput - currency input value
+*
+* Exit:
+* Returns a four-byte real number.
+*
+* Exceptions:
+*
+***********************************************************************/
+
+INTERNAL_(HRESULT)
+ErrR4FromCy(CY cyInput, float FAR* pfltOut)
+{
+ *pfltOut = (float) (((double)cyInput.Hi * C2TO32TH + (double)cyInput.Lo)
+ / 10000.0);
+ return NOERROR;
+}
+
+
+/***
+* rtR8FromCy - convert currency to R8
+* Purpose:
+* The specified currency value is scaled to a
+* double-precision real value.
+*
+* Entry:
+* cyInput - currency input value
+*
+* Exit:
+* Returns a eight-byte real number.
+*
+* Exceptions:
+*
+***********************************************************************/
+
+INTERNAL_(HRESULT)
+ErrR8FromCy(CY cyInput, double FAR* pdblOut)
+{
+ *pdblOut = ((double)cyInput.Hi * C2TO32TH + (double)cyInput.Lo) / 10000.0;
+ return NOERROR;
+}
+
+
+INTERNAL_(HRESULT)
+ErrMultCyI4(CY cyIn, long lInput, CY FAR* pcyOut)
+{
+ CY cyI4;
+
+ BOOL fNegative = FALSE;
+ BOOL fRound = FALSE;
+ BOOL fScale = FALSE;
+ int outIndex;
+ int inIndex;
+ CY cyProduct;
+
+ unsigned long lValue1[4];
+ unsigned long lValue2[4];
+ unsigned long lProduct[8];
+
+
+ // create an unscaled currency value by setting
+ // the low part to the input value and sign-extending
+ // to the high part
+ cyI4.Lo = lInput;
+ cyI4.Hi = -(lInput < 0);
+
+ // convert both input values to positive and set
+ // the negative flag if either, but not both, were
+ // negative.
+ fNegative = FMakePosCy(&cyIn) ^ FMakePosCy(&cyI4);
+
+ // build the unpacked arrays from the positive values
+ UnpackCy(&cyIn, lValue1);
+ UnpackCy(&cyI4, lValue2);
+
+ // initialize the product array to zero
+ MEMSET(lProduct, 0, sizeof(lProduct));
+
+ // outer loop - for each value in lValue1, add the
+ // partial product with the array lValue2 into the
+ // lProduct array.
+ for (outIndex = 0; outIndex < 4; outIndex++) {
+
+ // only bother to form partial product if the
+ // value is nonzero
+ if (lValue1[outIndex] != 0) {
+
+ // add the product to the product array value
+ for (inIndex = 0; inIndex < 4; inIndex++)
+ lProduct[inIndex + outIndex] +=
+ lValue1[outIndex] * lValue2[inIndex];
+
+ // propagate any high-word value to the next product
+ // array element and clear the high-word value
+ for (inIndex = outIndex; inIndex < outIndex + 4; inIndex++) {
+ lProduct[inIndex + 1] += lProduct[inIndex] >> 16;
+ lProduct[inIndex] &= 0x0000ffffL;
+ }
+ }
+ }
+
+ // product is now in the lProduct array. If fScale is set
+ // for the CY * CY case, divide the array values by 10000
+ // and set the fRound flag if greater or equal to 5000.
+ if (fScale) {
+ for (outIndex = 7; outIndex > 0; outIndex--)
+ if (lProduct[outIndex] != 0) {
+ lProduct[outIndex - 1] |= (lProduct[outIndex] % 10000) << 16;
+ lProduct[outIndex] /= 10000;
+ }
+
+ fRound = (lProduct[0] % 10000) >= 5000;
+ lProduct[0] /= 10000;
+ }
+
+ // overflow has occurred if any of the high four product array
+ // values are nonzero.
+ if ((lProduct[7] | lProduct[6] | lProduct[5] | lProduct[4]) != 0)
+ return RESULT(DISP_E_OVERFLOW);
+
+ // pack the last four array values into the returned CY structure;
+ PackCy(&cyProduct, lProduct);
+
+ // process rounding if needed
+ if (fRound) {
+
+ // do special overflow check that would be lost
+ // when incrementing (0xffffffff|ffffffff -> 0x0)
+ if ((cyProduct.Hi & cyProduct.Lo) == 0xffffffffL)
+ return RESULT(DISP_E_OVERFLOW);
+
+ // increment the value
+ if (++cyProduct.Lo == 0)
+ cyProduct.Hi++;
+ }
+
+ // negate the value if needed
+ if (fNegative) {
+ cyProduct.Hi = ~cyProduct.Hi;
+
+ // if the negation produces a zero value, clear the negative
+ // flag so the overflow test will work correctly
+ if ((cyProduct.Lo = (unsigned long)(-(long)cyProduct.Lo)) == 0 &&
+ ++cyProduct.Hi == 0)
+ fNegative = FALSE;
+ }
+
+ // do final overflow check - test sign expected against
+ // actual sign of result
+ if (fNegative == (cyProduct.Hi >= 0))
+ return RESULT(DISP_E_OVERFLOW);
+
+ // done - return product
+ *pcyOut = cyProduct;
+
+ return NOERROR;
+}
+
+
+/***
+* FMakePosCy - make a positive currency value and return sign
+* Purpose:
+* Return the positive value of the input currency value and a
+* flag with the sign of the original value.
+*
+* Entry:
+* pcyValue - pointer to currency input value
+*
+* Exit:
+* pcyValue - pointer to positive currency value
+* returns: 0 if positive, 1 if negative
+*
+* Note:
+* A maximum negative value input is returned unchanged, but
+* treated as an unsigned value by the calling routines.
+*
+***********************************************************************/
+PRIVATE_(int)
+FMakePosCy (CY *pcyValue)
+{
+ int fNegative = 0;
+
+ if (pcyValue->Hi < 0) {
+ pcyValue->Hi = ~pcyValue->Hi;
+ if ((pcyValue->Lo = (unsigned long)(-(long)pcyValue->Lo)) == 0)
+ pcyValue->Hi++;
+ fNegative = 1;
+ }
+
+ return fNegative;
+}
+
+
+/***
+* UnpackCy - separate currency value into four two-byte integers
+* Purpose:
+* Unpack the currency value input into the lower half of the
+* specified pointer to an array of unsigned longs. The array
+* goes from least- to most-significant values.
+*
+* Entry:
+* pcy - pointer to currency input value
+*
+* Exit:
+* plValues - pointer to start of unsigned long array
+*
+***********************************************************************/
+PRIVATE_(void)
+UnpackCy (CY *pcy, unsigned long *plValues)
+{
+ *plValues++ = pcy->Lo & 0xffff;
+ *plValues++ = pcy->Lo >> 16;
+ *plValues++ = (unsigned long)pcy->Hi & 0xffff;
+ *plValues = (unsigned long)pcy->Hi >> 16;
+}
+
+/***
+* PackCy - build currency value from four two-byte integers
+* Purpose:
+* Pack the lower half of the array of unsigned long into a
+* currency value. This routine complements UnpackCy.
+*
+* Entry:
+* plValues - pointer to start of unsigned long array input
+*
+* Exit:
+* pcy - pointer to currency result
+*
+***********************************************************************/
+PRIVATE_(void)
+PackCy (CY *pcy, unsigned long *plValues)
+{
+ pcy->Lo = *plValues++;
+ pcy->Lo |= *plValues++ << 16;
+ pcy->Hi = *plValues++;
+ pcy->Hi |= *plValues++ << 16;
+}
+
+}
diff --git a/private/oleauto/src/dispatch/win32/oledisp.cpp b/private/oleauto/src/dispatch/win32/oledisp.cpp
new file mode 100644
index 000000000..b4dbbda1c
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/oledisp.cpp
@@ -0,0 +1,119 @@
+/***
+*oledisp.cpp
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+
+* Win32 DLL initailization/termination routine for oledisp.dll.
+*
+*Revision History:
+*
+* [00] 20-Feb-93 tomteng: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "oledisp.h"
+#include "oautil.h"
+
+ASSERTDATA
+
+
+extern "C"
+{
+
+#ifdef _X86_
+// TRUE if were running on Chicago
+BOOL g_fChicago = FALSE;
+
+// TRUE if were running on win32s
+BOOL g_fWin32s = FALSE;
+#endif
+
+// oleaut32.dll instance handle
+HINSTANCE g_hinstDLL = NULL;
+
+// in TYPELIB
+extern "C" void InitMbString(void);
+
+}
+
+STDAPI CoSetState(IUnknown FAR *punk);
+
+/***
+*BOOL DllMain
+*Purpose:
+* Win32 DLL Entry/Exit routine.
+*
+*Entry:
+* hinst = The DLL's instance handle.
+* dwReason = the reason the entry point was called.
+*
+*Exit:
+* return value = BOOL.
+*
+***********************************************************************/
+BOOL APIENTRY
+DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID pvReserved)
+{
+ BOOL fRet = TRUE;
+
+ g_hinstDLL = hinstDLL;
+
+ switch(dwReason){
+ case DLL_THREAD_ATTACH:
+ break;
+
+ case DLL_THREAD_DETACH:
+ if (Pappdata() != NULL) {
+ // Safety net. If we've been initialized and are going away, but
+ // nobody has called OleUninitialize yet, then call back into OLE now
+ // to have it free it's pointer to us (we are going away), and call
+ // ReleaseAppData().
+ CoSetState(NULL);
+ }
+ break;
+
+ case DLL_PROCESS_DETACH:
+ if (Pappdata() != NULL) {
+ // Safety net. If we've been initialized and are going away, but
+ // nobody has called OleUninitialize yet, then call back into OLE now
+ // to have it free it's pointer to us (we are going away), and call
+ // ReleaseAppData().
+ CoSetState(NULL);
+ }
+ ReleaseProcessData(); // Delete cached per-process data.
+ break;
+
+ case DLL_PROCESS_ATTACH:
+#ifdef _X86_
+ // code for Chicago detection (taken from MSDN News March 94)
+ DWORD dwVersion = GetVersion();
+ if (dwVersion < 0x80000000) {
+ // NT
+ }
+ else if (LOBYTE(LOWORD(dwVersion)) < 4) {
+ // WIN32s -- no Wide API's, just like Chicago, also
+ // need HOLDER marshalling hack.
+ //
+ g_fWin32s = g_fChicago = TRUE;
+ }
+ else {
+ g_fChicago = TRUE;
+ }
+#endif
+
+ InitMbString(); // init multibyte helpers for TYPELIB
+ fRet = SUCCEEDED(InitProcessData()); // initilize per-process data.
+#if 0
+ if (fRet) {
+ fRet = SUCCEEDED(InitAppData());
+ }
+#endif // 0
+ break;
+ }
+ return fRet;
+}
diff --git a/private/oleauto/src/dispatch/win32/ppc/invoke.s b/private/oleauto/src/dispatch/win32/ppc/invoke.s
new file mode 100644
index 000000000..ed46f8312
--- /dev/null
+++ b/private/oleauto/src/dispatch/win32/ppc/invoke.s
@@ -0,0 +1,853 @@
+//****************************************************************************/
+// invoke.s - OLE Automation v-table based Invoke (POWERPC)
+//
+// Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+// Information Contained Herein Is Proprietary and Confidential.
+//
+// Purpose:
+//
+// This module implements the low-level v-table based dispatching
+// support for the default implementation of IDispatch::Invoke()
+// on PowerPC hardware.
+//
+// Revision History:
+//
+// 28-Mar-94 tomteng: Created POWERPC version
+//
+// Implementation Notes:
+//
+// (1) The POWERPC documentation indicates that you can load values
+// into FP registers without causing exceptions if they are illegal
+// FP values. Thus, we can use the 8-byte FP load/store instructions
+// for moving non-FP values efficiently. NOTE: this will fail if
+// the data is not mod-8 (i.e. 3 least-significant-bits of address
+// are 0). A data alignment fault will occur.
+//
+// (2) On POWERPC stdcall, the caller allocates space for the arguments
+// (which is normal) but also REMOVES that space. That is, stdcall on
+// POWERPC is "caller clear" (not callee).
+//
+// (3) POWERPC stack layout is as follows:
+//
+// +-----------------------+
+// | Link Area |
+// | (6*4 = 24 bytes) |
+// +-----------------------+ <= SP on entry
+// | Caller-saved Regs | |
+// | (as needed) | |
+// +-----------------------+ V
+// | Locals | Stack
+// | (as needed) | Grows
+// +-----------------------+ Down
+// | Parameters | |
+// | (8 * 4 = 32 bytes for | |
+// | reg arg homing area, | V
+// | + additional params |
+// | as needed) |
+// +-----------------------+
+// | Link Area |
+// | (6*4 = 24 bytes) |
+// +-----------------------+ <= SP on call out
+//
+//
+// (4) Register conventions:
+//
+// R0 = Scratch, used in glue & prologs
+// R1 = Stack Pointer
+// R2 = TOC pointer (RTOC)
+// R3-R10 = arg passing and retval registers, R3 used fo non-float return
+// R11/R12 = scratch regs (trashed across calls) used in glue & prologs
+// R13-R31 = must be preserved by callee, non-volatile local
+//
+// FR0 = scratch FP reg
+// f1-f13 = FP arg passing and retval registers, first 13 FP registers
+// f14-FR31 = must be preserved by callee, non-volatile local storage
+//
+// Our conventions are as follows:
+//
+// R29 = address of DLL target function location (Declare templates only)
+// R30 = virtual stack (vs) memory pointer
+// R31 = address of the virtual stack (vs) pointer in ebthread
+// R11/R12 = temps for intermediate values
+// FR0 = temp for intermediate FP value
+//
+// (5) Keep SP 8-byte aligned (even if values within stack are only 4-byte
+// aligned)!
+//
+// (6) TOC: The TOC (Table Of Contents) scheme for cross-fragment data/code
+// access is somewhat complicated and cumbersome to adhere to in asm code
+// that is generated dynamically on the fly. [See appropriate documentation
+// and compiler-generated code. In particular, the Apple "PowerPC Native
+// Runtime Architecture" (draft 6, 7/27/92) and the readme.txt that comes
+// with asmppc.exe are both helpful.]
+//
+//****************************************************************************/
+
+#include "ksppc.h"
+
+//
+// imported symbols
+//
+ .extern g_S_OK
+ .extern g_E_INVALIDARG
+
+//
+// TOC block offsets
+.set TOC_ADDR, 0 // address of target function
+.set TOC_RTOC, 4 // target TOC register value
+.set TOC_ENV, 8 // environment value
+
+//
+// register alias
+//
+
+.set t0, r19 // temporary registers
+.set t1, r20
+.set t2, r21
+.set t3, r22
+.set t4, r23
+.set t5, r24
+.set t6, r25
+.set t7, r26
+.set t8, r27
+.set t9, r28
+.set s0, r30
+.set s1, r31 // new stack pointer
+
+
+// Variant Layout
+.set vt, 0
+.set wReserved1, 2
+.set wReserved2, 4
+.set wReserved3, 6
+.set dw0, 8
+.set dw1, 10
+.set dw2, 12
+.set dw3, 14
+
+//
+// constants
+//
+
+.set VT_EMPTY, 0
+.set VT_NULL, 1
+.set VT_I2, 2
+.set VT_I4, 3
+.set VT_R4, 4
+.set VT_R8, 5
+.set VT_CY, 6
+.set VT_DATE, 7
+.set VT_BSTR, 8
+.set VT_DISPATCH, 9
+.set VT_ERROR, 10
+.set VT_BOOL, 11
+.set VT_VARIANT, 12
+.set VT_UNKNOWN, 13
+.set VT_MAX, 14
+// 14 is unused
+// 15 is unused
+//.set VT_I1, 16
+.set VT_UI1, 17
+
+
+.set VT_BYREF, 0x4000
+.set VT_ARRAY, 0x2000
+.set VT_NOMODE, 0x00ff
+
+// stupid asmppc GPF's on OR'ed constants in the source code enclosed
+// in parens, and ignored the 2nd half when not in parens
+.set VT_BYREF_OR_VT_ARRAY, 0x6000
+
+//***
+//
+//HRESULT
+//InvokeStdCall (
+// IN PVOID _this, //void FAR*
+// IN DWORD oVft, //unsigned int
+// IN DWORD vtReturn, //unsigned int
+// IN DWORD cActuals, //unsigned int
+// IN PVOID rgvt, //VARTYPE FAR*
+// IN PVOID rgpvarg, //VARIANTARG FAR* FAR*
+// OUT PVOID pvargResult //VARIANT FAR*
+// )
+//
+//Routine Description:
+//
+// Invoke a virtual StdCall method using the given _this pointer,
+// method index and array of parameters.
+//
+//Arguments:
+//
+// _this - Supplies a pointer to the method to invoke.
+//
+// oVft - vTable offset into _this ptr
+//
+// vtReturn - the VARTYPE of the return value.
+//
+// cActuals - count of the number of actuals.
+//
+// rgvt - array of VARTYPES describing the methods formals.
+//
+// rgpvarg - array of VARIANTARG*s, which map the actuals by position.
+//
+// pvargResult - VARIANTARG containing the method return value.
+//
+//Return Value:
+//
+// g_S_OK (extern value)
+// g_E_INVALIDARG (extern value)
+//
+//Implementation Note:
+//
+// PowerPC StdCall method arguments are push on the stack left to right.
+// The stack grows downward (pushing decrements stack address). Data
+// alignment on the stack starts from arg1 upward. Caller cleans.
+//
+// Per PowerPC calling conventions, the following rules are followed:
+//
+// 1. Stack frame must be QUADWORD (64-bits) aligned.
+//
+//
+// 2. Structures are pushed on the stack by value. They are returned in
+// the r3 register which contains the address of a hidden argument
+// (vargHiddenParm) allocated by the caller and pushed as the first
+// argument [r3] on the stack (*before* the this pointer)
+//
+// 3. On vtable-based calls, _this is passed as the first argument [r3],
+// *unless* there is a structure return, in which case it is pased in
+// r4.
+//
+// 4. Eight integer/floating registers [r3 - r10] & [f1 - f13] must be
+// set before calling, if used. Type and order of arguments determine
+// the registers used. (int1, float1, int2, int3, float2) means that:
+// r3 <- int1// f1 <- float1)// r5 <- int2// r6 <- int3// fr2 <- float2)//
+//
+//
+// 5. Return values are handled as follows:
+//
+// vartype fundamental return register
+// ---------------------------------------------------
+// VT_UI1 unsigned char r3
+// VT_I2 short r3
+// VT_I4 long r3
+// VT_R4 float f1
+// VT_R8 double f1
+// VT_DATE double f1
+// VT_CY struct r3 (address of struct return)
+// VT_BSTR char FAR* r3
+// VT_UNKNOWN void FAR* r3
+// VT_DISPATCH void FAR* r3
+// VT_ERROR long r3
+// VT_BOOL short r3
+// VT_VARIANT VARIANTARG r3 (address of struct return)
+//
+//
+//
+//--
+
+
+//Stack Frame
+//
+
+//
+
+
+// StackFrameHeaderLength is 56
+// SSIZE is 184
+
+.set SSIZE, StackFrameHeaderLength+128
+.set STKROOM, StackFrameHeaderLength
+
+// Arguments
+.set _this, STKROOM+76 // stack offset to parameter 0
+.set oVft, STKROOM+80 // stack offset to parameter 1
+.set vtReturn, STKROOM+84 // stack offset to parameter 2
+.set cActuals, STKROOM+88 // stack offset to parameter 3
+.set rgvt, STKROOM+92 // stack offset to parameter 4
+.set rgpvarg, STKROOM+96 // stack offset to parameter 5
+.set pvargResult, STKROOM+100 // stack offset to parameter 6
+.set vargHiddenParm, STKROOM+104 // 16-byte temporary for struct return
+
+ // We want to save off 19
+ // non-volatile registers.
+NESTED_ENTRY( InvokeStdCall, SSIZE, 0, 0 )
+PROLOGUE_END( InvokeStdCall )
+
+// This does an swtu sp, -184(sp)
+// stw r0, 180(sp)
+ // entry code
+
+ // Save non-volatile registers...
+ stw r13,STKROOM+0(sp)
+ stw r14,STKROOM+4(sp)
+ stw r15,STKROOM+8(sp)
+ stw r16,STKROOM+12(sp)
+ stw r17,STKROOM+16(sp)
+ stw r18,STKROOM+20(sp)
+ stw r19,STKROOM+24(sp)
+ stw r20,STKROOM+28(sp)
+ stw r21,STKROOM+32(sp)
+ stw r22,STKROOM+36(sp)
+ stw r23,STKROOM+40(sp)
+ stw r24,STKROOM+44(sp)
+ stw r25,STKROOM+48(sp)
+ stw r26,STKROOM+52(sp)
+ stw r27,STKROOM+56(sp)
+ stw r28,STKROOM+60(sp)
+ stw r29,STKROOM+64(sp)
+ stw r30,STKROOM+68(sp)
+ stw r31,STKROOM+72(sp)
+
+ // Save parameter passing register
+
+ stw r3, _this(sp)
+ stw r4, oVft(sp)
+ stw r5, vtReturn(sp)
+ stw r6, cActuals(sp)
+ stw r7, rgvt(sp)
+ stw r8, rgpvarg(sp)
+ stw r9, pvargResult(sp)
+
+ // cannot return byRef
+ //
+ mr t0, r5
+ andi. t0, t0, VT_BYREF // Isolate VT_Mode bits
+ bne LRetInvalidArg // Check VT_Type
+
+ // Setup arguments if any
+ //
+
+LCalcStackSize:
+
+ // calculate space need for pushing arguments on stack
+
+ lwz t3, rgvt(sp) // t3 = &rgvt[0]
+ li t9, 4 // t9 = running arg count of
+ // # of bytes needed.
+ // starts at 4 due to the
+ // implicit _this pointer
+ li t7, 0 // fStructReturn = FALSE
+
+ lwz t1, vtReturn(sp) // check if struct return
+ andi. t0, t1, VT_BYREF_OR_VT_ARRAY // Byref's aren't struct's
+ bne LCalcStackLoop
+
+ lwz t0, [toc]rgfStructReturn(rtoc) // t0 = &rgfStructReturn
+ add t0, t1, t0 // t0 = &rgfStructReturn[i]
+ add t0, t1, t0
+ lhz t0, 0(t0) // t0 = rgfStructReturn[i]
+ andi. t0, t0, 0xff
+ beq LCalcStackLoop
+
+ addi t9, t9, 4 // one more for struct return
+ addi t7, t7, 1 // fStructReturn = TRUE
+
+
+// CONSIDER: re-work to eliminate this first loop, looping backwards over the
+// CONSIDER: args, and just decrementing SP as we go.
+
+LCalcStackLoop:
+ cmpi 0, 0, r6, 0 // go if zero parms
+ beq LCalcStackLoopDone
+
+ lhz t1, 0(t3) // t6 = rgvt[i]
+ andi. t1, t1, VT_NOMODE // Turn off mode bits
+ cmpi 0, 0, t1, VT_UI1 // VT_UI1
+ beq LValidVarType1 // branch if so
+ cmpi 0, 0, t1, VT_MAX
+ bge LRetInvalidArg // Error if Max or above
+
+LValidVarType1:
+ lwz t0, [toc]rgcbVtSize(rtoc) // t0 = &rgcbVtSize
+ add t0, t1, t0 // t0 = &rgcbVtSize[i]
+ add t0, t1, t0
+ lhz t0, 0(t0) // t0 = rgcbVtSize[i]
+ add t9, t9, t0 // bump byte count
+
+ cmpi 0, 0, t1, VT_VARIANT // requires 8 byte alignment?
+ beq AlignIt //
+ cmpi 0, 0, t1, VT_R8 //
+ bne NoAlignment //
+AlignIt:
+ li t0, 7 // align it
+ add t9, t9, t0
+ andc t9, t9, t0
+NoAlignment:
+
+ addi t3, t3, 2 // &rgvt[i++]
+ addi r6, r6, -1 // cActual--
+ b LCalcStackLoop // If more args, go again
+
+LCalcStackLoopDone:
+
+// UNDONE: is there a minimum parameter block size??? If so then need to
+// UNDONE: check t9 against that and possibly bump it.
+
+ mr s1, sp // s1 = old stack pointer
+ subf sp, t9, sp // sp = new stack pointer
+ li t9, 0xfffffff8 // make sure stack is still
+ and sp, sp, t9 // 8-byte aligned.
+ // All errors after this point
+ // must clean up the stack right
+ mr s0, sp // s0 = temporary stack loc
+
+ lwz t2, rgpvarg(s1) // t2 = &rgpvarg[0]
+ lwz t3, rgvt(s1) // t3 = &rgvt[0]
+ lwz t4, cActuals(s1) // t4 = cActuals
+
+ li t1, 2 // t0 = cArgs * 4
+ slw t0, t4, t1
+ add t8, t0, t2 // t8 = &rgpvarg[cArgs]
+
+ li t9, 0 // t9 = running FP argument count
+
+
+#if 0 // UNDONE: turn on once the PPC compiler is fixed to
+ // UNDONE: have the right calling convention here.
+LPushHiddenArg:
+
+ // Check if we need to return a structure, if so
+ // move the address of the vargHiddenParm as
+ // the first (hidden) argument
+ //
+
+ lwz t1, vtReturn(s1)
+ andi. t0, t1, VT_BYREF_OR_VT_ARRAY // Byref's aren't struct's
+ bne LPushThis
+
+ cmpi 0, 0, t7, 0 // fStructReturn == TRUE?
+ beq LPushThis // brif not
+
+ addi r0, s1, vargHiddenParm // r0 = &vargHiddenParm
+ stw r0, 0(s0) // Save on stack
+ addi s0, s0, 4 // adjust arg loc
+
+ // This pointer pushed after hidden struct return parm, if any
+LPushThis:
+
+ stw r3, 0(s0) // Save 'this' on stack
+ addi s0, s0, 4 // adjust arg loc
+#else //0
+
+ // In the broken compiler, the 'this' pointer is the first hidden parm
+ stw r3, 0(s0) // Save 'this' on stack
+ addi s0, s0, 4 // adjust arg loc
+
+
+ // Check if we need to return a structure, if so
+ // move the address of the vargHiddenParm as
+ // the second hidden argument
+ //
+
+ lwz t1, vtReturn(s1)
+ andi. t0, t1, VT_BYREF_OR_VT_ARRAY // Byref's aren't struct's
+ bne NoHiddenArg
+
+ cmpi 0, 0, t7, 0 // fStructReturn == TRUE?
+ beq NoHiddenArg // brif not
+
+ addi r0, s1, vargHiddenParm // r0 = &vargHiddenParm
+ stw r0, 0(s0) // Save on stack
+ addi s0, s0, 4 // adjust arg loc
+NoHiddenArg:
+
+
+#endif //0
+
+
+ cmpi 0, 0, t4, 0 // any args?
+ beq LDoCall // brif not
+
+
+LPushArgs:
+
+ lwz t5, 0(t2) // t5 = rgpvarg[i]
+ lhz t6, 0(t3) // t6 = rgvt[i]
+
+ andi. t0, t6, VT_BYREF_OR_VT_ARRAY // Isolate mode bits
+ bne LPush4 // all ByRefs are sizeof(FAR*)
+
+
+ andi. t1, t6, VT_NOMODE // Turn off mode bits
+ li t0, 2
+ slw t1, t1, t0 // ADDRESS offset
+ lwz t0, [toc]LPushValJmpTab(rtoc) // Get Address of push table
+ add t0, t1, t0 // Get Address of push routine
+ lwz t0, 0(t0)
+#if 0 // only for 68k mac
+ add t0, t0, rtoc // don't ask why
+ lwz t0, 0(t0)
+#endif //0
+ mtctr t0
+ bcctr 20, 0 // Go execute the push code
+
+
+LPush1: // 1 byte of data
+ lbz t0, dw0(t5) // Push HWORD (as 32-bit)
+ stw t0, 0(s0) // Save on stack
+ addi s0, s0, 4 // adjust arg loc
+ b LNextArg
+
+LPush2: // 2 bytes of data
+
+ lhz t0, dw0(t5) // Push HWORD (as 32-bit)
+ stw t0, 0(s0) // Save on stack
+ addi s0, s0, 4 // adjust arg loc
+ b LNextArg
+
+
+LPush4: // 4 bytes of data
+
+ lwz t0, dw0(t5) // Push 1st WORD
+ stw t0, 0(s0)
+ addi s0, s0, 4 // adjust arg loc
+ b LNextArg
+
+
+LPushR4:
+
+ lfs f14, dw0(t5)
+ stfs f14, 0(s0)
+ addi s0, s0, 4 // adjust arg loc
+ b LPushFPValue
+
+
+LPushR8: // 8 bytes of R8 data
+ li t0, 7 // first 8-byte align it
+ add s0, s0, t0
+ andc s0, s0, t0
+
+ lfd f14, dw0(t5)
+ stfd f14, 0(s0)
+ addi s0, s0, 8 // adjust arg loc
+LPushFPValue:
+ cmpi 0, 0, t9, 13 // pass by register?
+ bne LNextArg // brif not
+
+ mr t0, t9 // t0 = current FP register count
+ addi t9, t9, 1 // one more FP register used
+ mulli t0, t0, 8
+
+ lwz t1, [toc]LVSetFpReg(rtoc)
+ add t1, t1, t0
+
+ mtctr t1
+ bcctr 20, 0 // go execute reg setting code
+
+
+LVSetFpReg:
+ fmr f1, f14
+ b LNextArg
+ fmr f2, f14
+ b LNextArg
+ fmr f3, f14
+ b LNextArg
+ fmr f4, f14
+ b LNextArg
+ fmr f5, f14
+ b LNextArg
+ fmr f6, f14
+ b LNextArg
+ fmr f7, f14
+ b LNextArg
+ fmr f8, f14
+ b LNextArg
+ fmr f9, f14
+ b LNextArg
+ fmr f10, f14
+ b LNextArg
+ fmr f11, f14
+ b LNextArg
+ fmr f12, f14
+ b LNextArg
+ fmr f13, f14
+ b LNextArg
+
+
+LPush8: // 8 bytes of data
+#if 0
+ li t0, 7 // first 8-byte align it
+ add s0, s0, t0
+ andc s0, s0, t0
+#endif //0
+
+ lwz t0, dw0(t5)
+ lwz t1, dw2(t5)
+ stw t0, 0(s0)
+ stw t1, 4(s0)
+ addi s0, s0, 8 // adjust arg loc
+ b LNextArg
+
+
+LPushVar: // 16 bytes of data
+ li t0, 7 // first 8-byte align it
+ add s0, s0, t0
+ andc s0, s0, t0
+
+ lwz t0, 0(t5)
+ lwz t1, 4(t5)
+ stw t0, 0(s0)
+ stw t1, 4(s0)
+ lwz t0, 8(t5)
+ lwz t1, 12(t5)
+ stw t0, 8(s0)
+ stw t1, 12(s0)
+
+ addi s0, s0, 16 // adjust arg loc
+
+LNextArg:
+
+ addi t2, t2, 4 // &rgpvarg[i++]
+ addi t3, t3, 2 // &rgvt[i++]
+
+ cmp 0, 0, t2, t8
+ bne LPushArgs // If more args, go again
+
+
+LDoCall:
+ // R3 is current this pointer
+ // load the vtable offset
+ //
+ lwz t0, 0(r3) // address of vtable
+
+ // now set up R3-R10, in case they are used
+ // CONSIDER: better way to do this???
+// UNDONE: must handle parms where we added alignment padding (variant & R8)
+ lwz r3, 0(sp) // this or struct return
+ lwz r4, 4(sp) // arg1 or this
+ lwz r5, 8(sp)
+ lwz r6, 12(sp)
+ lwz r7, 16(sp)
+ lwz r8, 20(sp)
+ lwz r9, 24(sp)
+ lwz r10, 28(sp)
+
+
+ lwz t1, oVft(s1) // Get the vtable offset
+ add t0, t1, t0 // Get addr of ptr to func
+ lwz t0, 0(t0) // Get ptr to func in vtable
+
+
+ // call virtual member function
+ //
+ addi sp, sp, -24 // space for link area
+ mr t1, rtoc // save rtoc
+ lwz r0,TOC_ADDR(t0) // r0 = target address
+ lwz rtoc,TOC_RTOC(t0) // new rtoc value
+ lwz r11,TOC_ENV(t0) // r11 = new environment
+
+ mtctr r0 // here we go!!!!
+ bcctrl 20,0
+
+ mr rtoc, t1 // restore rtoc
+ mr sp, s1 // Restore SP
+
+
+ // Get return argument
+ //
+
+ lwz t1, vtReturn(sp) // t1 = vtType to return
+ lwz t3, pvargResult(sp) // Get RetData Area
+ sth t1, vt(t3) // varResult->vt
+
+ mr t2, t1
+ andi. t2, t2, VT_BYREF_OR_VT_ARRAY // Check ret mode
+ bne LRetPtr // If !0 -> go ret a ptr
+
+ andi. t1, t1, VT_NOMODE // Turn off mode bits
+ cmpi 0, 0, t1, VT_UI1 // VT_UI1
+ beq LValidVarType2 // branch if so
+ cmpi 0, 0, t1, VT_MAX
+ bge LRetInvalidArg // Error if Max or above
+
+LValidVarType2:
+ li t0, 2
+ slw t1, t1, t0 // ADDRESS offset
+ lwz t0, [toc]LRetValJmpTab(rtoc) // Get Address of ret table
+ add t0, t1, t0 // Get Address of ret routine
+ lwz t0, 0(t0)
+#if 0 // only for 68k mac
+ add t0, t0, rtoc // don't ask why
+ lwz t0, 0(t0)
+#endif //0
+ mtctr t0
+ bcctr 20, 0 // Go execute the ret code
+
+LRetUI1:
+ stb r3, dw0(t3)
+ b LDone // Done
+
+LRetI2:
+
+ sth r3, dw0(t3)
+ b LDone // Done
+
+
+LRetI4:
+LRetPtr:
+
+ stw r3, dw0(t3)
+ b LDone // Done
+
+
+LRetR4:
+
+ stfs f1, dw0(t3)
+ b LDone // Done
+
+
+
+LRetR8:
+
+ stfd f1, dw0(t3)
+ b LDone // Done
+
+
+
+LRetCy:
+
+ lwz t1, 0(r3) // cy.Lo
+ stw t1, dw0(t3)
+ lwz t1, 4(r3) // cy.Hi
+ stw t1, dw2(t3)
+ b LDone // Done
+
+
+LRetVar:
+ lwz t1, 0(r3) // store 16-bytes in pvArgResult
+ stw t1, 0(t3)
+ lwz t1, 4(r3)
+ stw t1, 4(t3)
+ lwz t1, 8(r3)
+ stw t1, 8(t3)
+ lwz t1, 12(r3)
+ stw t1, 12(t3)
+ b LDone // Done
+
+LRetInvalidArg:
+
+ lwz r3, [toc]g_E_INVALIDARG(rtoc) // r3 = *g_E_INVALIDARG
+ b ExitInvoke
+
+
+LDone:
+
+ lwz r3, [toc]g_S_OK(rtoc) // r3 = *g_S_OK
+
+
+ExitInvoke:
+ lwz r3, 0(r3) // set return value
+
+ // Restore 19 registers
+ lwz r13,STKROOM+0(sp)
+ lwz r14,STKROOM+4(sp)
+ lwz r15,STKROOM+8(sp)
+ lwz r16,STKROOM+12(sp)
+ lwz r17,STKROOM+16(sp)
+ lwz r18,STKROOM+20(sp)
+ lwz r19,STKROOM+24(sp)
+ lwz r20,STKROOM+28(sp)
+ lwz r21,STKROOM+32(sp)
+ lwz r22,STKROOM+36(sp)
+ lwz r23,STKROOM+40(sp)
+ lwz r24,STKROOM+44(sp)
+ lwz r25,STKROOM+48(sp)
+ lwz r26,STKROOM+52(sp)
+ lwz r27,STKROOM+56(sp)
+ lwz r28,STKROOM+60(sp)
+ lwz r29,STKROOM+64(sp)
+ lwz r30,STKROOM+68(sp)
+ lwz r31,STKROOM+72(sp)
+
+ // and pray...
+NESTED_EXIT( InvokeStdCall, SSIZE, 0, 0 )
+
+
+
+ .align 4
+LPushValJmpTab:
+ .word LNextArg //VT_EMPTY [0]
+ .word LPush4 //VT_NULL [4]
+ .word LPush2 //VT_I2 [2]
+ .word LPush4 //VT_I4 [4]
+ .word LPushR4 //VT_R4 [4]
+ .word LPushR8 //VT_R8 [8]
+ .word LPush8 //VT_CY [8]
+ .word LPushR8 //VT_DATE [8]
+ .word LPush4 //VT_BSTR [4]
+ .word LPush4 //VT_DISPATCH [4]
+ .word LPush4 //VT_ERROR [4]
+ .word LPush2 //VT_BOOL [2]
+ .word LPushVar //VT_VARIANT [16]
+ .word LPush4 //VT_UNKNOWN [4]
+ .word 0 //unused
+ .word 0 //unused
+ .word LPush1 //VT_I1 [1]
+ .word LPush1 //VT_UI1 [1]
+
+
+ .align 4
+LRetValJmpTab:
+ .word LDone //VT_EMPTY
+ .word LRetI4 //VT_NULL
+ .word LRetI2 //VT_I2
+ .word LRetI4 //VT_I4
+ .word LRetR4 //VT_R4
+ .word LRetR8 //VT_R8
+ .word LRetCy //VT_CY
+ .word LRetR8 //VT_DATE
+ .word LRetPtr //VT_BSTR
+ .word LRetPtr //VT_DISPATCH
+ .word LRetI4 //VT_ERROR
+ .word LRetI2 //VT_BOOL
+ .word LRetVar //VT_VARIANT
+ .word LRetPtr //VT_UNKNOWN
+ .word 0 //unused
+ .word 0 //unused
+ .word 0 //unused (VT_I1)
+ .word LRetUI1 //VT_UI1
+
+ .align 2
+rgcbVtSize:
+ .half 0 //VT_EMPTY
+ .half 4 //VT_NULL
+ .half 4 //VT_I2
+ .half 4 //VT_I4
+ .half 4 //VT_R4
+ .half 8 //VT_R8
+ .half 8 //VT_CY
+ .half 8 //VT_DATE
+ .half 4 //VT_BSTR
+ .half 4 //VT_DISPATCH
+ .half 4 //VT_ERROR
+ .half 4 //VT_BOOL
+ .half 16 //VT_VARIANT
+ .half 4 //VT_UNKNOWN
+ .half 0 //unused
+ .half 0 //unused
+ .half 4 //VT_I1
+ .half 4 //VT_UI1
+
+
+ .align 2
+rgfStructReturn:
+ .half 0 //VT_EMPTY
+ .half 0 //VT_NULL
+ .half 0 //VT_I2
+ .half 0 //VT_I4
+ .half 0 //VT_R4
+ .half 0 //VT_R8
+ .half 1 //VT_CY
+ .half 0 //VT_DATE
+ .half 0 //VT_BSTR
+ .half 0 //VT_DISPATCH
+ .half 0 //VT_ERROR
+ .half 0 //VT_BOOL
+ .half 1 //VT_VARIANT
+ .half 0 //VT_UNKNOWN
+ .half 0 //unused
+ .half 0 //unused
+ .half 0 //VT_I1
+ .half 0 //VT_UI1
+
+
diff --git a/private/oleauto/src/inc/dispatch.h b/private/oleauto/src/inc/dispatch.h
new file mode 100644
index 000000000..1ba77f7b4
--- /dev/null
+++ b/private/oleauto/src/inc/dispatch.h
@@ -0,0 +1,1412 @@
+/***
+*dispatch.h - OLE Automation definitions.
+*
+* Copyright (C) 1992-1995, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This file defines the Ole Automation interfaces and APIs.
+*
+*Implementation Notes:
+* This file requires ole2.h
+*
+*****************************************************************************/
+
+#ifndef _DISPATCH_H_
+#define _DISPATCH_H_
+
+#include "variant.h"
+
+#ifndef BEGIN_INTERFACE
+# define BEGIN_INTERFACE
+#endif
+
+#if defined(NONAMELESSUNION) || (defined(_MAC) && !defined(__cplusplus) && !defined(_MSC_VER))
+# define UNION_NAME(X) X
+#else
+# define UNION_NAME(X)
+#endif
+
+
+DEFINE_OLEGUID(IID_IDispatch, 0x00020400L, 0, 0);
+DEFINE_OLEGUID(IID_IEnumVARIANT, 0x00020404L, 0, 0);
+DEFINE_OLEGUID(IID_ITypeInfo, 0x00020401L, 0, 0);
+DEFINE_OLEGUID(IID_ITypeLib, 0x00020402L, 0, 0);
+DEFINE_OLEGUID(IID_ITypeComp, 0x00020403L, 0, 0);
+DEFINE_OLEGUID(IID_ICreateTypeInfo, 0x00020405L, 0, 0);
+DEFINE_OLEGUID(IID_ICreateTypeLib, 0x00020406L, 0, 0);
+
+DEFINE_OLEGUID(IID_StdOle, 0x00020430L, 0, 0);
+#define STDOLE_MAJORVERNUM 0x1
+#define STDOLE_MINORVERNUM 0x0
+#define STDOLE_LCID 0x0000
+
+// {1CF2B120-547D-101B-8E65-08002B2BD119}
+DEFINE_GUID(IID_IErrorInfo,
+ 0x1CF2B120L, 0x547D, 0x101B, 0x8E, 0x65, 0x08, 0x00, 0x2B, 0x2B, 0xD1, 0x19);
+
+// {22F03340-547D-101B-8E65-08002B2BD119}
+DEFINE_GUID(IID_ICreateErrorInfo,
+ 0x22F03340L, 0x547D, 0x101B, 0x8E, 0x65, 0x08, 0x00, 0x2B, 0x2B, 0xD1, 0x19);
+
+// {DF0B3D60-548F-101B-8E65-08002B2BD119}
+DEFINE_GUID(IID_ISupportErrorInfo,
+ 0xDF0B3D60L, 0x548F, 0x101B, 0x8E, 0x65, 0x08, 0x00, 0x2B, 0x2B, 0xD1, 0x19);
+
+
+/* forward declarations */
+#ifdef __cplusplus
+
+ interface IDispatch;
+ interface IEnumVARIANT;
+ interface ITypeInfo;
+ interface ITypeLib;
+ interface ITypeComp;
+ interface ICreateTypeInfo;
+ interface ICreateTypeLib;
+ interface IErrorInfo;
+ interface ICreateErrorInfo;
+ interface ISupportErrorInfo;
+
+#else
+
+ typedef interface IDispatch IDispatch;
+ typedef interface IEnumVARIANT IEnumVARIANT;
+ typedef interface ITypeInfo ITypeInfo;
+ typedef interface ITypeLib ITypeLib;
+ typedef interface ITypeComp ITypeComp;
+ typedef interface ICreateTypeInfo ICreateTypeInfo;
+ typedef interface ICreateTypeLib ICreateTypeLib;
+ typedef interface IErrorInfo IErrorInfo;
+ typedef interface ICreateErrorInfo ICreateErrorInfo;
+ typedef interface ISupportErrorInfo ISupportErrorInfo;
+
+#endif
+
+
+/* OLE Automation error codes */
+
+#define DISP_ERROR(X) MAKE_SCODE(SEVERITY_ERROR, FACILITY_DISPATCH, X)
+
+#define DISP_E_UNKNOWNINTERFACE DISP_ERROR(1)
+#define DISP_E_MEMBERNOTFOUND DISP_ERROR(3)
+#define DISP_E_PARAMNOTFOUND DISP_ERROR(4)
+#define DISP_E_TYPEMISMATCH DISP_ERROR(5)
+#define DISP_E_UNKNOWNNAME DISP_ERROR(6)
+#define DISP_E_NONAMEDARGS DISP_ERROR(7)
+#define DISP_E_BADVARTYPE DISP_ERROR(8)
+#define DISP_E_EXCEPTION DISP_ERROR(9)
+#define DISP_E_OVERFLOW DISP_ERROR(10)
+#define DISP_E_BADINDEX DISP_ERROR(11)
+#define DISP_E_UNKNOWNLCID DISP_ERROR(12)
+#define DISP_E_ARRAYISLOCKED DISP_ERROR(13)
+#define DISP_E_BADPARAMCOUNT DISP_ERROR(14)
+#define DISP_E_PARAMNOTOPTIONAL DISP_ERROR(15)
+#define DISP_E_BADCALLEE DISP_ERROR(16)
+#define DISP_E_NOTACOLLECTION DISP_ERROR(17)
+
+
+#define TYPE_ERROR(X) MAKE_SCODE(SEVERITY_ERROR, FACILITY_DISPATCH, X)
+
+#define TYPE_E_BUFFERTOOSMALL TYPE_ERROR(32790)
+#define TYPE_E_INVDATAREAD TYPE_ERROR(32792)
+#define TYPE_E_UNSUPFORMAT TYPE_ERROR(32793)
+#define TYPE_E_REGISTRYACCESS TYPE_ERROR(32796)
+#define TYPE_E_LIBNOTREGISTERED TYPE_ERROR(32797)
+#define TYPE_E_UNDEFINEDTYPE TYPE_ERROR(32807)
+#define TYPE_E_QUALIFIEDNAMEDISALLOWED TYPE_ERROR(32808)
+#define TYPE_E_INVALIDSTATE TYPE_ERROR(32809)
+#define TYPE_E_WRONGTYPEKIND TYPE_ERROR(32810)
+#define TYPE_E_ELEMENTNOTFOUND TYPE_ERROR(32811)
+#define TYPE_E_AMBIGUOUSNAME TYPE_ERROR(32812)
+#define TYPE_E_NAMECONFLICT TYPE_ERROR(32813)
+#define TYPE_E_UNKNOWNLCID TYPE_ERROR(32814)
+#define TYPE_E_DLLFUNCTIONNOTFOUND TYPE_ERROR(32815)
+#define TYPE_E_BADMODULEKIND TYPE_ERROR(35005)
+#define TYPE_E_SIZETOOBIG TYPE_ERROR(35013)
+#define TYPE_E_DUPLICATEID TYPE_ERROR(35014)
+#define TYPE_E_INVALIDID TYPE_ERROR(35023)
+#define TYPE_E_TYPEMISMATCH TYPE_ERROR(36000)
+#define TYPE_E_OUTOFBOUNDS TYPE_ERROR(36001)
+#define TYPE_E_IOERROR TYPE_ERROR(36002)
+#define TYPE_E_CANTCREATETMPFILE TYPE_ERROR(36003)
+#define TYPE_E_CANTLOADLIBRARY TYPE_ERROR(40010)
+#define TYPE_E_INCONSISTENTPROPFUNCS TYPE_ERROR(40067)
+#define TYPE_E_CIRCULARTYPE TYPE_ERROR(40068)
+
+
+/* if not already picked up from olenls.h */
+#ifndef _LCID_DEFINED
+typedef unsigned long LCID;
+# define _LCID_DEFINED
+#endif
+
+
+
+/*---------------------------------------------------------------------*/
+/* BSTR API */
+/*---------------------------------------------------------------------*/
+
+STDAPI_(BSTR) SysAllocString(const OLECHAR FAR*);
+STDAPI_(int) SysReAllocString(BSTR FAR*, const OLECHAR FAR*);
+STDAPI_(BSTR) SysAllocStringLen(const OLECHAR FAR*, unsigned int);
+STDAPI_(int) SysReAllocStringLen(BSTR FAR*, const OLECHAR FAR*, unsigned int);
+STDAPI_(void) SysFreeString(BSTR);
+STDAPI_(unsigned int) SysStringLen(BSTR);
+
+#ifdef WIN32
+STDAPI_(unsigned int) SysStringByteLen(BSTR bstr);
+STDAPI_(BSTR) SysAllocStringByteLen(const char FAR* psz, unsigned int len);
+#endif
+
+
+/*---------------------------------------------------------------------*/
+/* Time API */
+/*---------------------------------------------------------------------*/
+
+STDAPI_(int)
+DosDateTimeToVariantTime(
+ unsigned short wDosDate,
+ unsigned short wDosTime,
+ double FAR* pvtime);
+
+STDAPI_(int)
+VariantTimeToDosDateTime(
+ double vtime,
+ unsigned short FAR* pwDosDate,
+ unsigned short FAR* pwDosTime);
+
+
+/*---------------------------------------------------------------------*/
+/* SafeArray API */
+/*---------------------------------------------------------------------*/
+
+STDAPI
+SafeArrayAllocDescriptor(unsigned int cDims, SAFEARRAY FAR* FAR* ppsaOut);
+
+STDAPI SafeArrayAllocData(SAFEARRAY FAR* psa);
+
+STDAPI_(SAFEARRAY FAR*)
+SafeArrayCreate(
+ VARTYPE vt,
+ unsigned int cDims,
+ SAFEARRAYBOUND FAR* rgsabound);
+
+STDAPI SafeArrayDestroyDescriptor(SAFEARRAY FAR* psa);
+
+STDAPI SafeArrayDestroyData(SAFEARRAY FAR* psa);
+
+STDAPI SafeArrayDestroy(SAFEARRAY FAR* psa);
+
+STDAPI SafeArrayRedim(SAFEARRAY FAR* psa, SAFEARRAYBOUND FAR* psaboundNew);
+
+STDAPI_(unsigned int) SafeArrayGetDim(SAFEARRAY FAR* psa);
+
+STDAPI_(unsigned int) SafeArrayGetElemsize(SAFEARRAY FAR* psa);
+
+STDAPI
+SafeArrayGetUBound(SAFEARRAY FAR* psa, unsigned int nDim, long FAR* plUbound);
+
+STDAPI
+SafeArrayGetLBound(SAFEARRAY FAR* psa, unsigned int nDim, long FAR* plLbound);
+
+STDAPI SafeArrayLock(SAFEARRAY FAR* psa);
+
+STDAPI SafeArrayUnlock(SAFEARRAY FAR* psa);
+
+STDAPI SafeArrayAccessData(SAFEARRAY FAR* psa, void HUGEP* FAR* ppvData);
+
+STDAPI SafeArrayUnaccessData(SAFEARRAY FAR* psa);
+
+STDAPI
+SafeArrayGetElement(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void FAR* pv);
+
+STDAPI
+SafeArrayPutElement(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void FAR* pv);
+
+STDAPI
+SafeArrayCopy(
+ SAFEARRAY FAR* psa,
+ SAFEARRAY FAR* FAR* ppsaOut);
+
+STDAPI
+SafeArrayPtrOfIndex(
+ SAFEARRAY FAR* psa,
+ long FAR* rgIndices,
+ void HUGEP* FAR* ppvData);
+
+
+/*---------------------------------------------------------------------*/
+/* VARIANT API */
+/*---------------------------------------------------------------------*/
+
+STDAPI_(void)
+VariantInit(VARIANTARG FAR* pvarg);
+
+STDAPI
+VariantClear(VARIANTARG FAR* pvarg);
+
+STDAPI
+VariantCopy(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvargSrc);
+
+STDAPI
+VariantCopyInd(
+ VARIANT FAR* pvarDest,
+ VARIANTARG FAR* pvargSrc);
+
+STDAPI
+VariantChangeType(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvarSrc,
+ unsigned short wFlags,
+ VARTYPE vt);
+
+STDAPI
+VariantChangeTypeEx(
+ VARIANTARG FAR* pvargDest,
+ VARIANTARG FAR* pvarSrc,
+ LCID lcid,
+ unsigned short wFlags,
+ VARTYPE vt);
+
+#define VARIANT_NOVALUEPROP 1
+
+
+/*---------------------------------------------------------------------*/
+/* VARTYPE Coercion API */
+/*---------------------------------------------------------------------*/
+
+/* Note: The routines that convert *from* a string are defined
+ * to take a OLECHAR* rather than a BSTR because no allocation is
+ * required, and this makes the routines a bit more generic.
+ * They may of course still be passed a BSTR as the strIn param.
+ */
+
+
+/* Any of the coersion functions that converts either from or to a string
+ * takes an additional lcid and dwFlags arguments. The lcid argument allows
+ * locale specific parsing to occur. The dwFlags allow additional function
+ * specific condition to occur. All function that accept the dwFlags argument
+ * can include either 0 or LOCALE_NOUSEROVERRIDE flag. In addition, the
+ * VarDateFromStr functions also accepts the VAR_TIMEVALUEONLY and
+ * VAR_DATEVALUEONLY flags
+ */
+
+#define VAR_TIMEVALUEONLY 0x0001 /* return time value */
+#define VAR_DATEVALUEONLY 0x0002 /* return date value */
+
+
+STDAPI VarUI1FromI2(short sIn, unsigned char FAR* pbOut);
+STDAPI VarUI1FromI4(long lIn, unsigned char FAR* pbOut);
+STDAPI VarUI1FromR4(float fltIn, unsigned char FAR* pbOut);
+STDAPI VarUI1FromR8(double dblIn, unsigned char FAR* pbOut);
+STDAPI VarUI1FromCy(CY cyIn, unsigned char FAR* pbOut);
+STDAPI VarUI1FromDate(DATE dateIn, unsigned char FAR* pbOut);
+STDAPI VarUI1FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, unsigned char FAR* pbOut);
+STDAPI VarUI1FromDisp(IDispatch FAR* pdispIn, LCID lcid, unsigned char FAR* pbOut);
+STDAPI VarUI1FromBool(VARIANT_BOOL boolIn, unsigned char FAR* pbOut);
+
+STDAPI VarI2FromUI1(unsigned char bIn, short FAR* psOut);
+STDAPI VarI2FromI4(long lIn, short FAR* psOut);
+STDAPI VarI2FromR4(float fltIn, short FAR* psOut);
+STDAPI VarI2FromR8(double dblIn, short FAR* psOut);
+STDAPI VarI2FromCy(CY cyIn, short FAR* psOut);
+STDAPI VarI2FromDate(DATE dateIn, short FAR* psOut);
+STDAPI VarI2FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, short FAR* psOut);
+STDAPI VarI2FromDisp(IDispatch FAR* pdispIn, LCID lcid, short FAR* psOut);
+STDAPI VarI2FromBool(VARIANT_BOOL boolIn, short FAR* psOut);
+
+STDAPI VarI4FromUI1(unsigned char bIn, long FAR* plOut);
+STDAPI VarI4FromI2(short sIn, long FAR* plOut);
+STDAPI VarI4FromR4(float fltIn, long FAR* plOut);
+STDAPI VarI4FromR8(double dblIn, long FAR* plOut);
+STDAPI VarI4FromCy(CY cyIn, long FAR* plOut);
+STDAPI VarI4FromDate(DATE dateIn, long FAR* plOut);
+STDAPI VarI4FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, long FAR* plOut);
+STDAPI VarI4FromDisp(IDispatch FAR* pdispIn, LCID lcid, long FAR* plOut);
+STDAPI VarI4FromBool(VARIANT_BOOL boolIn, long FAR* plOut);
+
+STDAPI VarR4FromUI1(unsigned char bIn, float FAR* pfltOut);
+STDAPI VarR4FromI2(short sIn, float FAR* pfltOut);
+STDAPI VarR4FromI4(long lIn, float FAR* pfltOut);
+STDAPI VarR4FromR8(double dblIn, float FAR* pfltOut);
+STDAPI VarR4FromCy(CY cyIn, float FAR* pfltOut);
+STDAPI VarR4FromDate(DATE dateIn, float FAR* pfltOut);
+STDAPI VarR4FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, float FAR* pfltOut);
+STDAPI VarR4FromDisp(IDispatch FAR* pdispIn, LCID lcid, float FAR* pfltOut);
+STDAPI VarR4FromBool(VARIANT_BOOL boolIn, float FAR* pfltOut);
+
+STDAPI VarR8FromUI1(unsigned char bIn, double FAR* pdblOut);
+STDAPI VarR8FromI2(short sIn, double FAR* pdblOut);
+STDAPI VarR8FromI4(long lIn, double FAR* pdblOut);
+STDAPI VarR8FromR4(float fltIn, double FAR* pdblOut);
+STDAPI VarR8FromCy(CY cyIn, double FAR* pdblOut);
+STDAPI VarR8FromDate(DATE dateIn, double FAR* pdblOut);
+STDAPI VarR8FromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, double FAR* pdblOut);
+STDAPI VarR8FromDisp(IDispatch FAR* pdispIn, LCID lcid, double FAR* pdblOut);
+STDAPI VarR8FromBool(VARIANT_BOOL boolIn, double FAR* pdblOut);
+
+STDAPI VarDateFromUI1(unsigned char bIn, DATE FAR* pdateOut);
+STDAPI VarDateFromI2(short sIn, DATE FAR* pdateOut);
+STDAPI VarDateFromI4(long lIn, DATE FAR* pdateOut);
+STDAPI VarDateFromR4(float fltIn, DATE FAR* pdateOut);
+STDAPI VarDateFromR8(double dblIn, DATE FAR* pdateOut);
+STDAPI VarDateFromCy(CY cyIn, DATE FAR* pdateOut);
+STDAPI VarDateFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, DATE FAR* pdateOut);
+STDAPI VarDateFromDisp(IDispatch FAR* pdispIn, LCID lcid, DATE FAR* pdateOut);
+STDAPI VarDateFromBool(VARIANT_BOOL boolIn, DATE FAR* pdateOut);
+
+STDAPI VarCyFromUI1(unsigned char bIn, CY FAR* pcyOut);
+STDAPI VarCyFromI2(short sIn, CY FAR* pcyOut);
+STDAPI VarCyFromI4(long lIn, CY FAR* pcyOut);
+STDAPI VarCyFromR4(float fltIn, CY FAR* pcyOut);
+STDAPI VarCyFromR8(double dblIn, CY FAR* pcyOut);
+STDAPI VarCyFromDate(DATE dateIn, CY FAR* pcyOut);
+STDAPI VarCyFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, CY FAR* pcyOut);
+STDAPI VarCyFromDisp(IDispatch FAR* pdispIn, LCID lcid, CY FAR* pcyOut);
+STDAPI VarCyFromBool(VARIANT_BOOL boolIn, CY FAR* pcyOut);
+
+STDAPI VarBstrFromUI1(unsigned char bVal, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+STDAPI VarBstrFromI2(short iVal, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+STDAPI VarBstrFromI4(long lIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+STDAPI VarBstrFromR4(float fltIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+STDAPI VarBstrFromR8(double dblIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+STDAPI VarBstrFromCy(CY cyIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+STDAPI VarBstrFromDate(DATE dateIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+STDAPI VarBstrFromDisp(IDispatch FAR* pdispIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+STDAPI VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, unsigned long dwFlags, BSTR FAR* pbstrOut);
+
+STDAPI VarBoolFromUI1(unsigned char bIn, VARIANT_BOOL FAR* pboolOut);
+STDAPI VarBoolFromI2(short sIn, VARIANT_BOOL FAR* pboolOut);
+STDAPI VarBoolFromI4(long lIn, VARIANT_BOOL FAR* pboolOut);
+STDAPI VarBoolFromR4(float fltIn, VARIANT_BOOL FAR* pboolOut);
+STDAPI VarBoolFromR8(double dblIn, VARIANT_BOOL FAR* pboolOut);
+STDAPI VarBoolFromDate(DATE dateIn, VARIANT_BOOL FAR* pboolOut);
+STDAPI VarBoolFromCy(CY cyIn, VARIANT_BOOL FAR* pboolOut);
+STDAPI VarBoolFromStr(OLECHAR FAR* strIn, LCID lcid, unsigned long dwFlags, VARIANT_BOOL FAR* pboolOut);
+STDAPI VarBoolFromDisp(IDispatch FAR* pdispIn, LCID lcid, VARIANT_BOOL FAR* pboolOut);
+
+
+/* Mac Note: On the Mac, the coersion functions support the
+ * Symantec C++ calling convention for float/double. To support
+ * float/double arguments compiled with the MPW C compiler,
+ * use the following APIs to move MPW float/double values into
+ * a VARIANT.
+ */
+
+#ifdef _MAC
+STDAPI MPWVarFromR4(float FAR* pfltIn, VARIANT FAR* pvarOut);
+STDAPI MPWVarFromR8(double FAR* pdblIn, VARIANT FAR* pvarOut);
+STDAPI MPWR4FromVar(VARIANT FAR* pvarIn, float FAR* pfltOut);
+STDAPI MPWR8FromVar(VARIANT FAR* pvarIn, double FAR* pdblOut);
+#endif
+
+
+
+/*---------------------------------------------------------------------*/
+/* ITypeLib */
+/*---------------------------------------------------------------------*/
+
+
+typedef long DISPID;
+typedef DISPID MEMBERID;
+
+#define MEMBERID_NIL DISPID_UNKNOWN
+#define ID_DEFAULTINST -2
+
+typedef enum tagSYSKIND {
+ SYS_WIN16
+ , SYS_WIN32
+ , SYS_MAC
+#ifdef _MAC
+ , SYS_FORCELONG = 2147483647
+#endif
+} SYSKIND;
+
+typedef enum tagLIBFLAGS {
+ LIBFLAG_FRESTRICTED = 0x01
+ , LIBFLAG_FCONTROL = 0x02
+ , LIBFLAG_FHIDDEN = 0x04
+#ifdef _MAC
+ , LIBFLAG_FORCELONG = 2147483647
+#endif
+} LIBFLAGS;
+
+typedef struct FARSTRUCT tagTLIBATTR {
+ GUID guid; /* globally unique library id */
+ LCID lcid; /* locale of the TypeLibrary */
+ SYSKIND syskind;
+ unsigned short wMajorVerNum;/* major version number */
+ unsigned short wMinorVerNum;/* minor version number */
+ unsigned short wLibFlags; /* library flags */
+} TLIBATTR, FAR* LPTLIBATTR;
+
+typedef enum tagTYPEKIND {
+ TKIND_ENUM = 0
+ , TKIND_RECORD
+ , TKIND_MODULE
+ , TKIND_INTERFACE
+ , TKIND_DISPATCH
+ , TKIND_COCLASS
+ , TKIND_ALIAS
+ , TKIND_UNION
+ , TKIND_MAX /* end of enum marker */
+#ifdef _MAC
+ , TKIND_FORCELONG = 2147483647
+#endif
+} TYPEKIND;
+
+#undef INTERFACE
+#define INTERFACE ITypeLib
+
+DECLARE_INTERFACE_(ITypeLib, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* ITypeLib methods */
+ STDMETHOD_(unsigned int,GetTypeInfoCount)(THIS) PURE;
+
+ STDMETHOD(GetTypeInfo)(THIS_
+ unsigned int index, ITypeInfo FAR* FAR* pptinfo) PURE;
+
+ STDMETHOD(GetTypeInfoType)(THIS_
+ unsigned int index, TYPEKIND FAR* ptypekind) PURE;
+
+ STDMETHOD(GetTypeInfoOfGuid)(THIS_
+ REFGUID guid, ITypeInfo FAR* FAR* pptinfo) PURE;
+
+ STDMETHOD(GetLibAttr)(THIS_
+ TLIBATTR FAR* FAR* pptlibattr) PURE;
+
+ STDMETHOD(GetTypeComp)(THIS_
+ ITypeComp FAR* FAR* pptcomp) PURE;
+
+ STDMETHOD(GetDocumentation)(THIS_
+ int index,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile) PURE;
+
+ STDMETHOD(IsName)(THIS_
+ OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ int FAR* lpfName) PURE;
+
+ STDMETHOD(FindName)(THIS_
+ OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ ITypeInfo FAR* FAR* rgptinfo,
+ MEMBERID FAR* rgmemid,
+ unsigned short FAR* pcFound) PURE;
+
+ STDMETHOD_(void, ReleaseTLibAttr)(THIS_ TLIBATTR FAR* ptlibattr) PURE;
+};
+
+typedef ITypeLib FAR* LPTYPELIB;
+
+
+
+/*---------------------------------------------------------------------*/
+/* ITypeInfo */
+/*---------------------------------------------------------------------*/
+
+typedef unsigned long HREFTYPE;
+
+
+typedef struct FARSTRUCT tagTYPEDESC {
+ union {
+ /* VT_PTR - the pointed-at type */
+ struct FARSTRUCT tagTYPEDESC FAR* lptdesc;
+
+ /* VT_CARRAY */
+ struct FARSTRUCT tagARRAYDESC FAR* lpadesc;
+
+ /* VT_USERDEFINED - this is used to get a TypeInfo for the UDT */
+ HREFTYPE hreftype;
+
+ }UNION_NAME(u);
+ VARTYPE vt;
+} TYPEDESC;
+
+typedef struct FARSTRUCT tagARRAYDESC {
+ TYPEDESC tdescElem; /* element type */
+ unsigned short cDims; /* dimension count */
+ SAFEARRAYBOUND rgbounds[1]; /* variable length array of bounds */
+} ARRAYDESC;
+
+typedef struct FARSTRUCT tagIDLDESC {
+#if defined(WIN32) || defined(_MAC)
+ unsigned long dwReserved;
+#else
+ BSTR bstrIDLInfo; /* reserved, but original name retained for
+ compatibilty */
+#endif
+ unsigned short wIDLFlags; /* IN, OUT, etc */
+} IDLDESC, FAR* LPIDLDESC;
+
+
+#define IDLFLAG_NONE 0
+#define IDLFLAG_FIN 0x1
+#define IDLFLAG_FOUT 0x2
+#define IDLFLAG_FLCID 0x4
+#define IDLFLAG_FRETVAL 0x8
+
+typedef struct FARSTRUCT tagELEMDESC {
+ TYPEDESC tdesc; /* the type of the element */
+ IDLDESC idldesc; /* info for remoting the element */
+} ELEMDESC, FAR* LPELEMDESC;
+
+
+typedef struct FARSTRUCT tagTYPEATTR {
+ GUID guid; /* the GUID of the TypeInfo */
+ LCID lcid; /* locale of member names and doc strings */
+ unsigned long dwReserved;
+ MEMBERID memidConstructor; /* ID of constructor, MEMBERID_NIL if none */
+ MEMBERID memidDestructor; /* ID of destructor, MEMBERID_NIL if none */
+ OLECHAR FAR* lpstrSchema; /* reserved for future use */
+ unsigned long cbSizeInstance;/* the size of an instance of this type */
+ TYPEKIND typekind; /* the kind of type this typeinfo describes */
+ unsigned short cFuncs; /* number of functions */
+ unsigned short cVars; /* number of variables / data members */
+ unsigned short cImplTypes; /* number of implemented interfaces */
+ unsigned short cbSizeVft; /* the size of this types virtual func table */
+ unsigned short cbAlignment; /* the alignment for an instance of this type */
+ unsigned short wTypeFlags;
+ unsigned short wMajorVerNum;/* major version number */
+ unsigned short wMinorVerNum;/* minor version number */
+ TYPEDESC tdescAlias; /* if typekind == TKIND_ALIAS this specifies
+ the type for which this type is an alias */
+ IDLDESC idldescType; /* IDL attributes of the described type */
+} TYPEATTR, FAR* LPTYPEATTR;
+
+typedef struct FARSTRUCT tagDISPPARAMS{
+ VARIANTARG FAR* rgvarg;
+ DISPID FAR* rgdispidNamedArgs;
+ unsigned int cArgs;
+ unsigned int cNamedArgs;
+} DISPPARAMS;
+
+typedef struct FARSTRUCT tagEXCEPINFO {
+ unsigned short wCode; /* An error code describing the error. */
+ /* Either (but not both) the wCode or */
+ /* scode fields must be set */
+ unsigned short wReserved;
+
+ BSTR bstrSource; /* A textual, human readable name of the
+ source of the exception. It is up to the
+ IDispatch implementor to fill this in.
+ Typically this will be an application name. */
+
+ BSTR bstrDescription; /* A textual, human readable description of the
+ error. If no description is available, NULL
+ should be used. */
+
+ BSTR bstrHelpFile; /* Fully qualified drive, path, and file name
+ of a help file with more information about
+ the error. If no help is available, NULL
+ should be used. */
+
+ unsigned long dwHelpContext;
+ /* help context of topic within the help file. */
+
+ void FAR* pvReserved;
+
+ /* Use of this field allows an application to defer filling in
+ the bstrDescription, bstrHelpFile, and dwHelpContext fields
+ until they are needed. This field might be used, for example,
+ if loading the string for the error is a time-consuming
+ operation. If deferred fill-in is not desired, this field should
+ be set to NULL. */
+#ifdef _MAC
+# ifdef _MSC_VER
+ HRESULT (STDAPICALLTYPE FAR* pfnDeferredFillIn)(struct tagEXCEPINFO FAR*);
+# else
+ STDAPICALLTYPE HRESULT (FAR* pfnDeferredFillIn)(struct tagEXCEPINFO FAR*);
+# endif
+#else
+ HRESULT (STDAPICALLTYPE FAR* pfnDeferredFillIn)(struct tagEXCEPINFO FAR*);
+#endif
+
+ SCODE scode; /* An SCODE describing the error. */
+
+} EXCEPINFO, FAR* LPEXCEPINFO;
+
+typedef enum tagCALLCONV {
+ CC_CDECL = 1
+ , CC_MSCPASCAL
+ , CC_PASCAL = CC_MSCPASCAL
+ , CC_MACPASCAL
+ , CC_STDCALL
+ , CC_RESERVED
+ , CC_SYSCALL
+ , CC_MPWCDECL
+ , CC_MPWPASCAL
+ , CC_MAX /* end of enum marker */
+#ifdef _MAC
+ , CC_FORCELONG = 2147483647
+#endif
+} CALLCONV;
+
+typedef enum tagFUNCKIND {
+ FUNC_VIRTUAL
+ , FUNC_PUREVIRTUAL
+ , FUNC_NONVIRTUAL
+ , FUNC_STATIC
+ , FUNC_DISPATCH
+#ifdef _MAC
+ , FUNC_FORCELONG = 2147483647
+#endif
+} FUNCKIND;
+
+/* Flags for IDispatch::Invoke */
+#define DISPATCH_METHOD 0x1
+#define DISPATCH_PROPERTYGET 0x2
+#define DISPATCH_PROPERTYPUT 0x4
+#define DISPATCH_PROPERTYPUTREF 0x8
+
+typedef enum tagINVOKEKIND {
+ INVOKE_FUNC = DISPATCH_METHOD
+ , INVOKE_PROPERTYGET = DISPATCH_PROPERTYGET
+ , INVOKE_PROPERTYPUT = DISPATCH_PROPERTYPUT
+ , INVOKE_PROPERTYPUTREF = DISPATCH_PROPERTYPUTREF
+#ifdef _MAC
+ , INVOKE_FORCELONG = 2147483647
+#endif
+} INVOKEKIND;
+
+typedef struct FARSTRUCT tagFUNCDESC {
+ MEMBERID memid;
+ SCODE FAR* lprgscode;
+ ELEMDESC FAR* lprgelemdescParam; /* array of parameter types */
+ FUNCKIND funckind;
+ INVOKEKIND invkind;
+ CALLCONV callconv;
+ short cParams;
+ short cParamsOpt;
+ short oVft;
+ short cScodes;
+ ELEMDESC elemdescFunc;
+ unsigned short wFuncFlags;
+} FUNCDESC, FAR* LPFUNCDESC;
+
+typedef enum tagVARKIND {
+ VAR_PERINSTANCE
+ , VAR_STATIC
+ , VAR_CONST
+ , VAR_DISPATCH
+#ifdef _MAC
+ , VAR_FORCELONG = 2147483647
+#endif
+} VARKIND;
+
+typedef struct FARSTRUCT tagVARDESC {
+ MEMBERID memid;
+ OLECHAR FAR* lpstrSchema; /* reserved for future use */
+ union {
+ /* VAR_PERINSTANCE - the offset of this variable within the instance */
+ unsigned long oInst;
+
+ /* VAR_CONST - the value of the constant */
+ VARIANT FAR* lpvarValue;
+
+ }UNION_NAME(u);
+ ELEMDESC elemdescVar;
+ unsigned short wVarFlags;
+ VARKIND varkind;
+} VARDESC, FAR* LPVARDESC;
+
+typedef enum tagTYPEFLAGS {
+ TYPEFLAG_FAPPOBJECT = 0x01
+ , TYPEFLAG_FCANCREATE = 0x02
+ , TYPEFLAG_FLICENSED = 0x04
+ , TYPEFLAG_FPREDECLID = 0x08
+ , TYPEFLAG_FHIDDEN = 0x10
+ , TYPEFLAG_FCONTROL = 0x20
+ , TYPEFLAG_FDUAL = 0x40
+ , TYPEFLAG_FNONEXTENSIBLE = 0x80
+ , TYPEFLAG_FOLEAUTOMATION = 0x100
+#ifdef _MAC
+ , TYPEFLAG_FORCELONG = 2147483647
+#endif
+} TYPEFLAGS;
+
+typedef enum tagFUNCFLAGS {
+ FUNCFLAG_FRESTRICTED= 1
+ , FUNCFLAG_FSOURCE= 0x2
+ , FUNCFLAG_FBINDABLE= 0x4
+ , FUNCFLAG_FREQUESTEDIT= 0x8
+ , FUNCFLAG_FDISPLAYBIND= 0x10
+ , FUNCFLAG_FDEFAULTBIND= 0x20
+ , FUNCFLAG_FHIDDEN= 0x40
+#ifdef _MAC
+ , FUNCFLAG_FORCELONG = 2147483647
+#endif
+} FUNCFLAGS;
+
+typedef enum tagVARFLAGS {
+ VARFLAG_FREADONLY = 1
+ , VARFLAG_FSOURCE= 0x2
+ , VARFLAG_FBINDABLE= 0x4
+ , VARFLAG_FREQUESTEDIT= 0x8
+ , VARFLAG_FDISPLAYBIND= 0x10
+ , VARFLAG_FDEFAULTBIND= 0x20
+ , VARFLAG_FHIDDEN = 0x40
+#ifdef _MAC
+ , VARFLAG_FORCELONG = 2147483647
+#endif
+} VARFLAGS;
+
+/* IMPLTYPE Flags */
+#define IMPLTYPEFLAG_FDEFAULT 0x1
+#define IMPLTYPEFLAG_FSOURCE 0x2
+#define IMPLTYPEFLAG_FRESTRICTED 0x4
+
+#undef INTERFACE
+#define INTERFACE ITypeInfo
+
+DECLARE_INTERFACE_(ITypeInfo, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* ITypeInfo methods */
+ STDMETHOD(GetTypeAttr)(THIS_ TYPEATTR FAR* FAR* pptypeattr) PURE;
+
+ STDMETHOD(GetTypeComp)(THIS_ ITypeComp FAR* FAR* pptcomp) PURE;
+
+ STDMETHOD(GetFuncDesc)(THIS_
+ unsigned int index, FUNCDESC FAR* FAR* ppfuncdesc) PURE;
+
+ STDMETHOD(GetVarDesc)(THIS_
+ unsigned int index, VARDESC FAR* FAR* ppvardesc) PURE;
+
+ STDMETHOD(GetNames)(THIS_
+ MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ unsigned int cMaxNames,
+ unsigned int FAR* pcNames) PURE;
+
+ STDMETHOD(GetRefTypeOfImplType)(THIS_
+ unsigned int index, HREFTYPE FAR* phreftype) PURE;
+
+ STDMETHOD(GetImplTypeFlags)(THIS_
+ unsigned int index, int FAR* pimpltypeflags) PURE;
+
+ STDMETHOD(GetIDsOfNames)(THIS_
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ MEMBERID FAR* rgmemid) PURE;
+
+ STDMETHOD(Invoke)(THIS_
+ void FAR* pvInstance,
+ MEMBERID memid,
+ unsigned short wFlags,
+ DISPPARAMS FAR *pdispparams,
+ VARIANT FAR *pvarResult,
+ EXCEPINFO FAR *pexcepinfo,
+ unsigned int FAR *puArgErr) PURE;
+
+ STDMETHOD(GetDocumentation)(THIS_
+ MEMBERID memid,
+ BSTR FAR* pbstrName,
+ BSTR FAR* pbstrDocString,
+ unsigned long FAR* pdwHelpContext,
+ BSTR FAR* pbstrHelpFile) PURE;
+
+ STDMETHOD(GetDllEntry)(THIS_
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ BSTR FAR* pbstrDllName,
+ BSTR FAR* pbstrName,
+ unsigned short FAR* pwOrdinal) PURE;
+
+ STDMETHOD(GetRefTypeInfo)(THIS_
+ HREFTYPE hreftype, ITypeInfo FAR* FAR* pptinfo) PURE;
+
+ STDMETHOD(AddressOfMember)(THIS_
+ MEMBERID memid, INVOKEKIND invkind, void FAR* FAR* ppv) PURE;
+
+ STDMETHOD(CreateInstance)(THIS_
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppvObj) PURE;
+
+ STDMETHOD(GetMops)(THIS_ MEMBERID memid, BSTR FAR* pbstrMops) PURE;
+
+ STDMETHOD(GetContainingTypeLib)(THIS_
+ ITypeLib FAR* FAR* pptlib, unsigned int FAR* pindex) PURE;
+
+ STDMETHOD_(void, ReleaseTypeAttr)(THIS_ TYPEATTR FAR* ptypeattr) PURE;
+ STDMETHOD_(void, ReleaseFuncDesc)(THIS_ FUNCDESC FAR* pfuncdesc) PURE;
+ STDMETHOD_(void, ReleaseVarDesc)(THIS_ VARDESC FAR* pvardesc) PURE;
+};
+
+typedef ITypeInfo FAR* LPTYPEINFO;
+
+
+/*---------------------------------------------------------------------*/
+/* ITypeComp */
+/*---------------------------------------------------------------------*/
+
+typedef enum tagDESCKIND {
+ DESCKIND_NONE = 0
+ , DESCKIND_FUNCDESC
+ , DESCKIND_VARDESC
+ , DESCKIND_TYPECOMP
+ , DESCKIND_IMPLICITAPPOBJ
+ , DESCKIND_MAX /* end of enum marker */
+#ifdef _MAC
+ , DESCKIND_FORCELONG = 2147483647
+#endif
+} DESCKIND;
+
+typedef union tagBINDPTR {
+ FUNCDESC FAR* lpfuncdesc;
+ VARDESC FAR* lpvardesc;
+ ITypeComp FAR* lptcomp;
+} BINDPTR, FAR* LPBINDPTR;
+
+
+#undef INTERFACE
+#define INTERFACE ITypeComp
+
+DECLARE_INTERFACE_(ITypeComp, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* ITypeComp methods */
+ STDMETHOD(Bind)(THIS_
+ OLECHAR FAR* szName,
+ unsigned long lHashVal,
+ unsigned short wflags,
+ ITypeInfo FAR* FAR* pptinfo,
+ DESCKIND FAR* pdesckind,
+ BINDPTR FAR* pbindptr) PURE;
+
+ STDMETHOD(BindType)(THIS_
+ OLECHAR FAR* szName,
+ unsigned long lHashVal,
+ ITypeInfo FAR* FAR* pptinfo,
+ ITypeComp FAR* FAR* pptcomp) PURE;
+};
+
+typedef ITypeComp FAR* LPTYPECOMP;
+
+
+
+/*---------------------------------------------------------------------*/
+/* ICreateTypeLib */
+/*---------------------------------------------------------------------*/
+
+
+#undef INTERFACE
+#define INTERFACE ICreateTypeLib
+
+DECLARE_INTERFACE_(ICreateTypeLib, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* ICreateTypeLib methods */
+ STDMETHOD(CreateTypeInfo)(THIS_
+ OLECHAR FAR* szName,
+ TYPEKIND tkind,
+ ICreateTypeInfo FAR* FAR* lplpictinfo) PURE;
+
+ STDMETHOD(SetName)(THIS_ OLECHAR FAR* szName) PURE;
+
+ STDMETHOD(SetVersion)(THIS_
+ unsigned short wMajorVerNum, unsigned short wMinorVerNum) PURE;
+
+ STDMETHOD(SetGuid) (THIS_ REFGUID guid) PURE;
+
+ STDMETHOD(SetDocString)(THIS_ OLECHAR FAR* szDoc) PURE;
+
+ STDMETHOD(SetHelpFileName)(THIS_ OLECHAR FAR* szHelpFileName) PURE;
+
+ STDMETHOD(SetHelpContext)(THIS_ unsigned long dwHelpContext) PURE;
+
+ STDMETHOD(SetLcid)(THIS_ LCID lcid) PURE;
+
+ STDMETHOD(SetLibFlags)(THIS_ unsigned int uLibFlags) PURE;
+
+ STDMETHOD(SaveAllChanges)(THIS) PURE;
+};
+
+typedef ICreateTypeLib FAR* LPCREATETYPELIB;
+
+
+
+/*---------------------------------------------------------------------*/
+/* ICreateTypeInfo */
+/*---------------------------------------------------------------------*/
+
+#undef INTERFACE
+#define INTERFACE ICreateTypeInfo
+
+DECLARE_INTERFACE_(ICreateTypeInfo, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* ICreateTypeInfo methods */
+ STDMETHOD(SetGuid)(THIS_ REFGUID guid) PURE;
+
+ STDMETHOD(SetTypeFlags)(THIS_ unsigned int uTypeFlags) PURE;
+
+ STDMETHOD(SetDocString)(THIS_ OLECHAR FAR* pstrDoc) PURE;
+
+ STDMETHOD(SetHelpContext)(THIS_ unsigned long dwHelpContext) PURE;
+
+ STDMETHOD(SetVersion)(THIS_
+ unsigned short wMajorVerNum, unsigned short wMinorVerNum) PURE;
+
+ STDMETHOD(AddRefTypeInfo)(THIS_
+ ITypeInfo FAR* ptinfo, HREFTYPE FAR* phreftype) PURE;
+
+ STDMETHOD(AddFuncDesc)(THIS_
+ unsigned int index, FUNCDESC FAR* pfuncdesc) PURE;
+
+ STDMETHOD(AddImplType)(THIS_
+ unsigned int index, HREFTYPE hreftype) PURE;
+
+ STDMETHOD(SetImplTypeFlags)(THIS_
+ unsigned int index, int impltypeflags) PURE;
+
+ STDMETHOD(SetAlignment)(THIS_ unsigned short cbAlignment) PURE;
+
+ STDMETHOD(SetSchema)(THIS_ OLECHAR FAR* lpstrSchema) PURE;
+
+ STDMETHOD(AddVarDesc)(THIS_
+ unsigned int index, VARDESC FAR* pvardesc) PURE;
+
+ STDMETHOD(SetFuncAndParamNames)(THIS_
+ unsigned int index, OLECHAR FAR* FAR* rgszNames, unsigned int cNames) PURE;
+
+ STDMETHOD(SetVarName)(THIS_
+ unsigned int index, OLECHAR FAR* szName) PURE;
+
+ STDMETHOD(SetTypeDescAlias)(THIS_
+ TYPEDESC FAR* ptdescAlias) PURE;
+
+ STDMETHOD(DefineFuncAsDllEntry)(THIS_
+ unsigned int index, OLECHAR FAR* szDllName, OLECHAR FAR* szProcName) PURE;
+
+ STDMETHOD(SetFuncDocString)(THIS_
+ unsigned int index, OLECHAR FAR* szDocString) PURE;
+
+ STDMETHOD(SetVarDocString)(THIS_
+ unsigned int index, OLECHAR FAR* szDocString) PURE;
+
+ STDMETHOD(SetFuncHelpContext)(THIS_
+ unsigned int index, unsigned long dwHelpContext) PURE;
+
+ STDMETHOD(SetVarHelpContext)(THIS_
+ unsigned int index, unsigned long dwHelpContext) PURE;
+
+ STDMETHOD(SetMops)(THIS_
+ unsigned int index, BSTR bstrMops) PURE;
+
+ STDMETHOD(SetTypeIdldesc)(THIS_
+ IDLDESC FAR* pidldesc) PURE;
+
+ STDMETHOD(LayOut)(THIS) PURE;
+};
+
+typedef ICreateTypeInfo FAR* LPCREATETYPEINFO;
+
+
+
+/*---------------------------------------------------------------------*/
+/* TypeInfo APIs */
+/*---------------------------------------------------------------------*/
+/* compute a 32bit hash value for the given name based on the lcid and system kind
+ */
+#ifdef WIN32
+STDAPI_(unsigned long)
+LHashValOfNameSysA(SYSKIND syskind, LCID lcid, const char FAR* szName);
+#endif //WIN32
+
+STDAPI_(unsigned long)
+LHashValOfNameSys(SYSKIND syskind, LCID lcid, const OLECHAR FAR* szName);
+
+/* Macro to compute a 32bit hash value for the given name based on the LCID
+ */
+#ifdef _MAC
+#define LHashValOfName(lcid, szName) \
+ LHashValOfNameSys(SYS_MAC, lcid, szName)
+#else
+#define LHashValOfName(lcid, szName) \
+ LHashValOfNameSys(SYS_WIN32, lcid, szName)
+#endif
+
+/* compute a 16bit hash value from 32 bit hash value
+ */
+#define WHashValOfLHashVal(lhashval) \
+ ((unsigned short) (0x0000ffff & (lhashval)))
+
+/* Check if the hash values are compatible.
+*/
+#define IsHashValCompatible(lhashval1, lhashval2) \
+ ((BOOL) ((0x00ff0000 & (lhashval1)) == (0x00ff0000 & (lhashval2))))
+
+/* load the typelib from the file with the given filename
+ */
+STDAPI
+LoadTypeLib(const OLECHAR FAR* szFile, ITypeLib FAR* FAR* pptlib);
+
+/* load registered typelib
+ */
+STDAPI
+LoadRegTypeLib(
+ REFGUID rguid,
+ unsigned short wVerMajor,
+ unsigned short wVerMinor,
+ LCID lcid,
+ ITypeLib FAR* FAR* pptlib);
+
+/* get path to registered typelib
+ */
+STDAPI
+QueryPathOfRegTypeLib(
+ REFGUID guid,
+ unsigned short wMaj,
+ unsigned short wMin,
+ LCID lcid,
+ LPBSTR lpbstrPathName);
+
+/* add typelib to registry
+ */
+STDAPI
+RegisterTypeLib(
+ ITypeLib FAR* ptlib,
+ OLECHAR FAR* szFullPath,
+ OLECHAR FAR* szHelpDir);
+
+STDAPI
+CreateTypeLib(SYSKIND syskind, const OLECHAR FAR* szFile, ICreateTypeLib FAR* FAR* ppctlib);
+
+#ifdef _MAC
+/* load the typelib from the file with the given FSSPEC
+ */
+STDAPI
+LoadTypeLibFSp(const FSSpec *pfsspec, ITypeLib FAR* FAR* pptlib);
+
+/* register the location of the standard typelib folder
+ */
+STDAPI
+RegisterTypeLibFolder(OLECHAR FAR* szFullPath);
+
+/* obtain the path to the registered typelib folder
+ */
+STDAPI
+QueryTypeLibFolder(LPBSTR pbstr);
+#endif // _MAC
+
+
+/*---------------------------------------------------------------------*/
+/* IEnumVARIANT */
+/*---------------------------------------------------------------------*/
+
+#undef INTERFACE
+#define INTERFACE IEnumVARIANT
+
+DECLARE_INTERFACE_(IEnumVARIANT, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* IEnumVARIANT methods */
+ STDMETHOD(Next)(
+ THIS_ unsigned long celt, VARIANT FAR* rgvar, unsigned long FAR* pceltFetched) PURE;
+ STDMETHOD(Skip)(THIS_ unsigned long celt) PURE;
+ STDMETHOD(Reset)(THIS) PURE;
+ STDMETHOD(Clone)(THIS_ IEnumVARIANT FAR* FAR* ppenum) PURE;
+};
+
+typedef IEnumVARIANT FAR* LPENUMVARIANT;
+
+
+/*---------------------------------------------------------------------*/
+/* IDispatch */
+/*---------------------------------------------------------------------*/
+
+
+#undef INTERFACE
+#define INTERFACE IDispatch
+
+DECLARE_INTERFACE_(IDispatch, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* IDispatch methods */
+ STDMETHOD(GetTypeInfoCount)(THIS_ unsigned int FAR* pctinfo) PURE;
+
+ STDMETHOD(GetTypeInfo)(
+ THIS_
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo) PURE;
+
+ STDMETHOD(GetIDsOfNames)(
+ THIS_
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid) PURE;
+
+ STDMETHOD(Invoke)(
+ THIS_
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr) PURE;
+};
+
+typedef IDispatch FAR* LPDISPATCH;
+
+
+/* DISPID reserved for the standard "value" property */
+#define DISPID_VALUE 0
+
+/* DISPID reserved to indicate an "unknown" name */
+#define DISPID_UNKNOWN -1
+
+/* The following DISPID is reserved to indicate the param
+ * that is the right-hand-side (or "put" value) of a PropertyPut
+ */
+#define DISPID_PROPERTYPUT -3
+
+/* DISPID reserved for the standard "NewEnum" method */
+#define DISPID_NEWENUM -4
+
+/* DISPID reserved for the standard "Evaluate" method */
+#define DISPID_EVALUATE -5
+
+#define DISPID_CONSTRUCTOR -6
+#define DISPID_DESTRUCTOR -7
+#define DISPID_COLLECT -8
+
+
+//---------------------------------------------------------------------
+// IErrorInfo, et al
+//---------------------------------------------------------------------
+
+#undef INTERFACE
+#define INTERFACE IErrorInfo
+DECLARE_INTERFACE_(IErrorInfo, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* IErrorInfo methods */
+ STDMETHOD(GetGUID)(THIS_ GUID FAR* pguid) PURE;
+ STDMETHOD(GetSource)(THIS_ BSTR FAR* pbstrSource) PURE;
+ STDMETHOD(GetDescription)(THIS_ BSTR FAR* pbstrDescription) PURE;
+ STDMETHOD(GetHelpFile)(THIS_ BSTR FAR* pbstrHelpFile) PURE;
+ STDMETHOD(GetHelpContext)(THIS_ unsigned long FAR* pdwHelpContext) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE ICreateErrorInfo
+DECLARE_INTERFACE_(ICreateErrorInfo, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* ICreateErrorInfo methods */
+ STDMETHOD(SetGUID)(THIS_ REFGUID rguid) PURE;
+ STDMETHOD(SetSource)(THIS_ LPOLESTR szSource) PURE;
+ STDMETHOD(SetDescription)(THIS_ LPOLESTR szDescription) PURE;
+ STDMETHOD(SetHelpFile)(THIS_ LPOLESTR szHelpFile) PURE;
+ STDMETHOD(SetHelpContext)(THIS_ unsigned long dwHelpContext) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE ISupportErrorInfo
+DECLARE_INTERFACE_(ISupportErrorInfo, IUnknown)
+{
+ BEGIN_INTERFACE
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppvObj) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ /* ISupportErrorInfo methods */
+ STDMETHOD(InterfaceSupportsErrorInfo)(THIS_ REFIID riid) PURE;
+};
+
+STDAPI SetErrorInfo(unsigned long dwReserved, IErrorInfo FAR* perrinfo);
+STDAPI GetErrorInfo(unsigned long dwReserved, IErrorInfo FAR* FAR* pperrinfo);
+STDAPI CreateErrorInfo(ICreateErrorInfo FAR* FAR* pperrinfo);
+
+
+/*---------------------------------------------------------------------*/
+/* IDispatch implementation support */
+/*---------------------------------------------------------------------*/
+
+typedef struct FARSTRUCT tagPARAMDATA {
+ OLECHAR FAR* szName; /* parameter name */
+ VARTYPE vt; /* parameter type */
+} PARAMDATA, FAR* LPPARAMDATA;
+
+typedef struct FARSTRUCT tagMETHODDATA {
+ OLECHAR FAR* szName; /* method name */
+ PARAMDATA FAR* ppdata; /* pointer to an array of PARAMDATAs */
+ DISPID dispid; /* method ID */
+ unsigned int iMeth; /* method index */
+ CALLCONV cc; /* calling convention */
+ unsigned int cArgs; /* count of arguments */
+ unsigned short wFlags; /* same wFlags as on IDispatch::Invoke() */
+ VARTYPE vtReturn;
+} METHODDATA, FAR* LPMETHODDATA;
+
+typedef struct FARSTRUCT tagINTERFACEDATA {
+ METHODDATA FAR* pmethdata; /* pointer to an array of METHODDATAs */
+ unsigned int cMembers; /* count of members */
+} INTERFACEDATA, FAR* LPINTERFACEDATA;
+
+
+
+/* Locate the parameter indicated by the given position, and
+ * return it coerced to the given target VARTYPE (vtTarg).
+ */
+STDAPI
+DispGetParam(
+ DISPPARAMS FAR* pdispparams,
+ unsigned int position,
+ VARTYPE vtTarg,
+ VARIANT FAR* pvarResult,
+ unsigned int FAR* puArgErr);
+
+/* Automatic TypeInfo driven implementation of IDispatch::GetIDsOfNames()
+ */
+STDAPI
+DispGetIDsOfNames(
+ ITypeInfo FAR* ptinfo,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ DISPID FAR* rgdispid);
+
+/* Automatic TypeInfo driven implementation of IDispatch::Invoke()
+ */
+STDAPI
+DispInvoke(
+ void FAR* _this,
+ ITypeInfo FAR* ptinfo,
+ DISPID dispidMember,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+/* Construct a TypeInfo from an interface data description
+ */
+STDAPI
+CreateDispTypeInfo(
+ INTERFACEDATA FAR* pidata,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+/* Create an instance of the standard TypeInfo driven IDispatch
+ * implementation.
+ */
+STDAPI
+CreateStdDispatch(
+ IUnknown FAR* punkOuter,
+ void FAR* pvThis,
+ ITypeInfo FAR* ptinfo,
+ IUnknown FAR* FAR* ppunkStdDisp);
+
+
+/*---------------------------------------------------------------------*/
+/* Active Object Registration API */
+/*---------------------------------------------------------------------*/
+
+/* flags for RegisterActiveObject */
+#define ACTIVEOBJECT_STRONG 0x0
+#define ACTIVEOBJECT_WEAK 0x1
+
+STDAPI
+RegisterActiveObject(
+ IUnknown FAR* punk,
+ REFCLSID rclsid,
+ unsigned long dwFlags,
+ unsigned long FAR* pdwRegister);
+
+STDAPI
+RevokeActiveObject(
+ unsigned long dwRegister,
+ void FAR* pvReserved);
+
+STDAPI
+GetActiveObject(
+ REFCLSID rclsid,
+ void FAR* pvReserved,
+ IUnknown FAR* FAR* ppunk);
+
+
+#undef UNION_NAME
+
+/*---------------------------------------------------------------------*/
+/* MISC API */
+/*---------------------------------------------------------------------*/
+
+STDAPI_(unsigned long) OaBuildVersion(void);
+
+#endif /* _DISPATCH_H_ */
+
diff --git a/private/oleauto/src/inc/oautil.h b/private/oleauto/src/inc/oautil.h
new file mode 100644
index 000000000..9e85b21b2
--- /dev/null
+++ b/private/oleauto/src/inc/oautil.h
@@ -0,0 +1,283 @@
+/***
+*oautil.h - OLE Automation component-wide utility functions.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* OA-wide utility function headers.
+*
+*Revision History:
+* 08-Nov-94 andrewso: Create
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef OAUTIL_H_INCLUDED
+#define OAUTIL_H_INCLUDED
+
+#if !OE_WIN32
+#error "Only valid in WIN32."
+#endif // !OE_WIN32
+
+#if ID_DEBUG
+
+// Declare a common assertion macro.
+#if defined(ASSERTSZ)
+
+#define OAASSERT(x,y) { if (x) ; else DispAssert(y, __FILE__, __LINE__); }
+#define OAHALT(x) DispAssert(x, __FILE__, __LINE__)
+
+#elif defined(DebAssert)
+
+#define OAASSERT(x,y) DebAssert(x, y)
+#define OAHALT(x) DebHalt(x)
+
+#else
+#error "No assertion code".
+#endif // ASSERT
+
+#else // !ID_DEBUG
+#define OAASSERT(x,y)
+#define OAHALT(x)
+#endif // !ID_DEBUG
+
+typedef DWORD TID;
+typedef DWORD ITLS;
+#define TID_EMPTY 0xFFFFFFFF
+#define ITLS_EMPTY 0xFFFFFFFF
+
+class OLE_TYPEMGR;
+
+// Per-app data structure
+struct APP_DATA
+{
+ OLE_TYPEMGR *m_poletmgr;
+ IMalloc *m_pimalloc; // cache a pointer to the IMalloc
+ USHORT m_cTypeLib;
+
+ IErrorInfo * m_perrinfo;
+
+ DWORD m_cbFreeBlock;
+ BSTR m_pbFreeBlock;
+ ITypeLib *m_ptlibStdole; // cache a pointer to the stdole32 typelib
+
+#if ID_DEBUG
+ // Used in the assertion code.
+ LPSTR m_szLoc;
+ LPSTR m_szMsg;
+#endif // ID_DEBUG
+
+ APP_DATA()
+ {
+ m_poletmgr = NULL;
+ m_pimalloc = NULL;
+ m_cTypeLib = 0;
+ m_perrinfo = NULL;
+ m_cbFreeBlock = 0;
+ m_pbFreeBlock = NULL;
+ m_ptlibStdole = NULL;
+
+#if ID_DEBUG
+ m_szLoc = NULL;
+ m_szMsg = NULL;
+#endif // ID_DEBUG
+ }
+};
+
+typedef ULONG HTINFO;
+#define HTINFO_Nil 0xFFFFFFFF
+
+// AppObjectTable node
+struct AOTABLE_NODE {
+ CLSID m_clsid;
+ VOID **m_ppv;
+ USHORT m_cRefs;
+};
+
+/***
+*class AppObjectTable - 'aotable'
+*Purpose:
+* Map between all instance of a typeinfo in a process and their shared
+* appobject.
+*
+***********************************************************************/
+
+class AppObjectTable
+{
+public:
+ VOID Release();
+
+ HRESULT AddTypeInfo(CLSID *pclsid,
+ HTINFO *phtinfo);
+
+ VOID RemoveTypeInfo(HTINFO htinfo);
+
+ VOID AddressOfAppObject(HTINFO htinfo, VOID **ppv);
+
+#if ID_DEBUG
+ VOID DebIsTableEmpty();
+#endif // ID_DEBUG
+
+ AppObjectTable()
+ {
+ m_cNodes = 0;
+ m_rgaotbl = NULL;
+ InitializeCriticalSection(&m_criticalsection);
+ }
+
+private:
+ ULONG m_cNodes;
+ AOTABLE_NODE *m_rgaotbl;
+ CRITICAL_SECTION m_criticalsection;
+};
+
+
+HRESULT InitProcessData();
+VOID ReleaseProcessData();
+
+HRESULT InitAppData();
+VOID ReleaseAppData();
+
+
+// Globals declaration.
+extern "C" {
+extern BOOL g_fWin32s;
+};
+
+extern AppObjectTable g_AppObjectTable;
+extern ITLS g_itlsAppData;
+
+// Inlined accessor functions.
+/***
+*APP_DATA *Pappdata()
+*
+*Purpose:
+* Returns per-app struct shared by typelib and obrun.
+*
+*Inputs:
+*
+*Outputs:
+* APP_DATA *
+*
+******************************************************************************/
+
+inline APP_DATA *Pappdata()
+{
+ OAASSERT(g_itlsAppData != ITLS_EMPTY, "Not initialized");
+
+ return((APP_DATA *)TlsGetValue(g_itlsAppData));
+}
+
+/***
+* Pmalloc()
+*
+*Purpose:
+* Returns cached IMalloc.
+*
+*Inputs:
+*
+*Outputs:
+* IMalloc *
+*
+******************************************************************************/
+
+inline IMalloc *Pmalloc()
+{
+ return Pappdata()->m_pimalloc;
+}
+
+/***
+* Poletmgr()
+*
+*Purpose:
+* Returns cached IMalloc.
+*
+*Inputs:
+*
+*Outputs:
+* OLE_TYPEMGR *
+*
+******************************************************************************/
+
+inline OLE_TYPEMGR *Poletmgr()
+{
+ return Pappdata()->m_poletmgr;
+}
+
+/***
+* Perrinfo()
+*
+*Purpose:
+* Returns cached errinfo.
+*
+*Inputs:
+*
+*Outputs:
+* IErrorInfo *
+*
+******************************************************************************/
+
+inline IErrorInfo *Perrinfo()
+{
+ return Pappdata()->m_perrinfo;
+}
+
+
+/***
+* HRESULT GetAppData()
+*
+*Purpose:
+* Returns the appdata, creatiing it if it doesn't exist.
+*
+*Inputs:
+*
+*Outputs:
+* AppData.
+* returns HRESULT.
+*
+******************************************************************************/
+
+inline HRESULT GetAppData(APP_DATA **ppappdata)
+{
+ if ((*ppappdata = Pappdata()) == NULL) {
+ HRESULT hresult;
+
+ if (FAILED(hresult = InitAppData())) {
+ return hresult;
+ }
+
+ *ppappdata = Pappdata();
+ }
+
+ return NOERROR;
+}
+
+
+/***
+* HRESULT GetMalloc()
+*
+*Purpose:
+* Returns cached IMalloc.
+*
+*Inputs:
+*
+*Outputs:
+* IMalloc and NOERROR.
+*
+******************************************************************************/
+
+inline HRESULT GetMalloc(IMalloc **ppmalloc)
+{
+ APP_DATA *pappdata;
+ HRESULT hresult;
+
+ if (FAILED(hresult = GetAppData(&pappdata))) {
+ return hresult;
+ }
+
+ *ppmalloc = Pmalloc();
+ return NOERROR;
+}
+#endif // ! OAUTIL_H_INCLUDED
diff --git a/private/oleauto/src/inc/olenls.h b/private/oleauto/src/inc/olenls.h
new file mode 100644
index 000000000..870f1f594
--- /dev/null
+++ b/private/oleauto/src/inc/olenls.h
@@ -0,0 +1,502 @@
+/***
+*olenls.h - National language support functions.
+*
+* Copyright (C) 1992-1995, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This describes the NLSAPI functions for Win16 and Mac. This is a subset
+* of Win32 NLSAPI, and is a non-Unicode version.
+*
+*Implementation Notes:
+* This files is largely ported from the Win32 header winnls.h.
+*
+*****************************************************************************/
+
+#ifndef _OLENLS_
+#define _OLENLS_
+
+#ifndef NONLS
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifndef EXTERN_C
+# ifdef __cplusplus
+# define EXTERN_C extern "C"
+# else
+# define EXTERN_C extern
+# endif
+#endif
+
+#ifdef _MAC
+# ifndef FAR
+# define FAR
+# endif
+# ifdef _MSC_VER
+# define NLSAPI_(TYPE) EXTERN_C TYPE __pascal
+# else
+# define NLSAPI_(TYPE) EXTERN_C pascal TYPE
+# endif
+#else
+# define NLSAPI_(TYPE) EXTERN_C TYPE WINAPI
+#endif
+
+
+/***************************************************************************\
+* Constants
+*
+* Define all constants for the NLS component here.
+\***************************************************************************/
+
+/*
+ * Character Type Flags.
+ */
+#define CT_CTYPE1 0x00000001 /* ctype 1 information */
+#define CT_CTYPE2 0x00000002 /* ctype 2 information */
+#define CT_CTYPE3 0x00000004 /* ctype 3 information */
+
+/*
+ * CType 1 Flag Bits.
+ */
+#define C1_UPPER 0x0001 /* upper case */
+#define C1_LOWER 0x0002 /* lower case */
+#define C1_DIGIT 0x0004 /* decimal digits */
+#define C1_SPACE 0x0008 /* spacing characters */
+#define C1_PUNCT 0x0010 /* punctuation characters */
+#define C1_CNTRL 0x0020 /* control characters */
+#define C1_BLANK 0x0040 /* blank characters */
+#define C1_XDIGIT 0x0080 /* other digits */
+#define C1_ALPHA 0x0100 /* any letter */
+
+/*
+ * CType 2 Flag Bits.
+ */
+#define C2_LEFTTORIGHT 0x1 /* left to right */
+#define C2_RIGHTTOLEFT 0x2 /* right to left */
+
+#define C2_EUROPENUMBER 0x3 /* European number, digit */
+#define C2_EUROPESEPARATOR 0x4 /* European numeric separator */
+#define C2_EUROPETERMINATOR 0x5 /* European numeric terminator */
+#define C2_ARABICNUMBER 0x6 /* Arabic number */
+#define C2_COMMONSEPARATOR 0x7 /* common numeric separator */
+
+#define C2_BLOCKSEPARATOR 0x8 /* block separator */
+#define C2_SEGMENTSEPARATOR 0x9 /* segment separator */
+#define C2_WHITESPACE 0xA /* white space */
+#define C2_OTHERNEUTRAL 0xB /* other neutrals */
+
+#define C2_NOTAPPLICABLE 0x0 /* no implicit directionality */
+
+/*
+ * CType 3 Flag Bits.
+ */
+#define C3_NONSPACING 0x0001 /* nonspacing character */
+#define C3_DIACRITIC 0x0002 /* diacritic mark */
+#define C3_VOWELMARK 0x0004 /* vowel mark */
+#define C3_SYMBOL 0x0008 /* symbols */
+
+#define C3_KATAKANA 0x0010
+#define C3_HIRAGANA 0x0020
+#define C3_HALFWIDTH 0x0040
+#define C3_FULLWIDTH 0x0080
+#define C3_IDEOGRAPH 0x0100
+#define C3_KASHIDA 0x0200
+#define C3_ALPHA 0x8000
+
+#define C3_NOTAPPLICABLE 0x0 /* ctype 3 is not applicable */
+
+
+/*
+ * String Flags.
+ */
+#define NORM_IGNORECASE 0x00000001 /* ignore case */
+#define NORM_IGNORENONSPACE 0x00000002 /* ignore nonspacing chars */
+#define NORM_IGNORESYMBOLS 0x00000004 /* ignore symbols */
+
+#define NORM_IGNOREWIDTH 0x00000008 /* ignore width */
+#define NORM_IGNOREKANATYPE 0x00000040 /* ignore kanatype */
+
+#define NORM_IGNOREKASHIDA 0x00040000 /* ignore Arabic kashida chars */
+
+
+/*
+ * Locale Dependent Mapping Flags.
+ */
+#define LCMAP_LOWERCASE 0x00000100 /* lower case letters */
+#define LCMAP_UPPERCASE 0x00000200 /* upper case letters */
+#define LCMAP_SORTKEY 0x00000400 /* WC sort key (normalize) */
+
+#define LCMAP_HALFWIDTH 0x00000800 /* narrow pitch case letters */
+#define LCMAP_FULLWIDTH 0x00001000 /* wide picth case letters */
+#define LCMAP_HIRAGANA 0x00002000 /* map katakana to hiragana */
+#define LCMAP_KATAKANA 0x00004000 /* map hiragana to katakana */
+
+
+/*
+ * Language IDs.
+ *
+ * The following two combinations of primary language ID and
+ * sublanguage ID have special semantics:
+ *
+ * Primary Language ID Sublanguage ID Result
+ * ------------------- --------------- ------------------------
+ * LANG_NEUTRAL SUBLANG_NEUTRAL Language neutral
+ * LANG_NEUTRAL SUBLANG_DEFAULT Process default language
+ * LANG_NEUTRAL SUBLANG_SYS_DEFAULT System default language
+ */
+
+/*
+ * Primary language IDs.
+ */
+#define LANG_NEUTRAL 0x00
+
+#define LANG_ALBANIAN 0x1c
+#define LANG_ARABIC 0x01
+#define LANG_BAHASA 0x21
+#define LANG_BULGARIAN 0x02
+#define LANG_CATALAN 0x03
+#define LANG_CHINESE 0x04
+#define LANG_CZECH 0x05
+#define LANG_DANISH 0x06
+#define LANG_DUTCH 0x13
+#define LANG_ENGLISH 0x09
+#define LANG_FINNISH 0x0b
+#define LANG_FRENCH 0x0c
+#define LANG_GERMAN 0x07
+#define LANG_GREEK 0x08
+#define LANG_HEBREW 0x0d
+#define LANG_HUNGARIAN 0x0e
+#define LANG_ICELANDIC 0x0f
+#define LANG_ITALIAN 0x10
+#define LANG_JAPANESE 0x11
+#define LANG_KOREAN 0x12
+#define LANG_NORWEGIAN 0x14
+#define LANG_POLISH 0x15
+#define LANG_PORTUGUESE 0x16
+#define LANG_RHAETO_ROMAN 0x17
+#define LANG_ROMANIAN 0x18
+#define LANG_RUSSIAN 0x19
+#define LANG_SERBO_CROATIAN 0x1a
+#define LANG_SLOVAK 0x1b
+#define LANG_SPANISH 0x0a
+#define LANG_SWEDISH 0x1d
+#define LANG_THAI 0x1e
+#define LANG_TURKISH 0x1f
+#define LANG_URDU 0x20
+
+/*
+ * Sublanguage IDs.
+ *
+ * The name immediately following SUBLANG_ dictates which primary
+ * language ID that sublanguage ID can be combined with to form a
+ * valid language ID.
+ */
+#define SUBLANG_NEUTRAL 0x00 /* language neutral */
+#define SUBLANG_DEFAULT 0x01 /* user default */
+#define SUBLANG_SYS_DEFAULT 0x02 /* system default */
+
+#define SUBLANG_CHINESE_SIMPLIFIED 0x02 /* Chinese (Simplified) */
+#define SUBLANG_CHINESE_TRADITIONAL 0x01 /* Chinese (Traditional) */
+#define SUBLANG_DUTCH 0x01 /* Dutch */
+#define SUBLANG_DUTCH_BELGIAN 0x02 /* Dutch (Belgian) */
+#define SUBLANG_ENGLISH_US 0x01 /* English (USA) */
+#define SUBLANG_ENGLISH_UK 0x02 /* English (UK) */
+#define SUBLANG_ENGLISH_AUS 0x03 /* English (Australian) */
+#define SUBLANG_ENGLISH_CAN 0x04 /* English (Canadian) */
+#define SUBLANG_ENGLISH_NZ 0x05 /* English (New Zealand) */
+#define SUBLANG_ENGLISH_EIRE 0x06 /* English (Irish) */
+#define SUBLANG_FRENCH 0x01 /* French */
+#define SUBLANG_FRENCH_BELGIAN 0x02 /* French (Belgian) */
+#define SUBLANG_FRENCH_CANADIAN 0x03 /* French (Canadian) */
+#define SUBLANG_FRENCH_SWISS 0x04 /* French (Swiss) */
+#define SUBLANG_GERMAN 0x01 /* German */
+#define SUBLANG_GERMAN_SWISS 0x02 /* German (Swiss) */
+#define SUBLANG_GERMAN_AUSTRIAN 0x03 /* German (Austrian) */
+#define SUBLANG_ITALIAN 0x01 /* Italian */
+#define SUBLANG_ITALIAN_SWISS 0x02 /* Italian (Swiss) */
+#define SUBLANG_NORWEGIAN_BOKMAL 0x01 /* Norwegian (Bokmal) */
+#define SUBLANG_NORWEGIAN_NYNORSK 0x02 /* Norwegian (Nynorsk) */
+#define SUBLANG_PORTUGUESE 0x02 /* Portuguese */
+#define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 /* Portuguese (Brazilian) */
+#define SUBLANG_SERBO_CROATIAN_CYRILLIC 0x02 /* Serbo-Croatian (Cyrillic) */
+#define SUBLANG_SERBO_CROATIAN_LATIN 0x01 /* Croato-Serbian (Latin) */
+#define SUBLANG_SPANISH 0x01 /* Spanish */
+#define SUBLANG_SPANISH_MEXICAN 0x02 /* Spanish (Mexican) */
+#define SUBLANG_SPANISH_MODERN 0x03 /* Spanish (Modern) */
+
+
+/*
+ * Country Codes.
+ */
+#define CTRY_DEFAULT 0
+
+#define CTRY_AUSTRALIA 61 /* Australia */
+#define CTRY_AUSTRIA 43 /* Austria */
+#define CTRY_BELGIUM 32 /* Belgium */
+#define CTRY_BRAZIL 55 /* Brazil */
+#define CTRY_CANADA 2 /* Canada */
+#define CTRY_DENMARK 45 /* Denmark */
+#define CTRY_FINLAND 358 /* Finland */
+#define CTRY_FRANCE 33 /* France */
+#define CTRY_GERMANY 49 /* Germany */
+#define CTRY_ICELAND 354 /* Iceland */
+#define CTRY_IRELAND 353 /* Ireland */
+#define CTRY_ITALY 39 /* Italy */
+#define CTRY_JAPAN 81 /* Japan */
+#define CTRY_MEXICO 52 /* Mexico */
+#define CTRY_NETHERLANDS 31 /* Netherlands */
+#define CTRY_NEW_ZEALAND 64 /* New Zealand */
+#define CTRY_NORWAY 47 /* Norway */
+#define CTRY_PORTUGAL 351 /* Portugal */
+#define CTRY_PRCHINA 86 /* PR China */
+#define CTRY_SOUTH_KOREA 82 /* South Korea */
+#define CTRY_SPAIN 34 /* Spain */
+#define CTRY_SWEDEN 46 /* Sweden */
+#define CTRY_SWITZERLAND 41 /* Switzerland */
+#define CTRY_TAIWAN 886 /* Taiwan */
+#define CTRY_UNITED_KINGDOM 44 /* United Kingdom */
+#define CTRY_UNITED_STATES 1 /* United States */
+
+
+/*
+ * Locale Types.
+ *
+ * These types are used for the GetLocaleInfoA NLS API routine.
+ */
+
+#define LOCALE_NOUSEROVERRIDE 0x80000000 /* OR in to avoid user override */
+
+#define LOCALE_ILANGUAGE 0x0001 /* language id */
+#define LOCALE_SLANGUAGE 0x0002 /* localized name of language */
+#define LOCALE_SENGLANGUAGE 0x1001 /* English name of language */
+#define LOCALE_SABBREVLANGNAME 0x0003 /* abbreviated language name */
+#define LOCALE_SNATIVELANGNAME 0x0004 /* native name of language */
+#define LOCALE_ICOUNTRY 0x0005 /* country code */
+#define LOCALE_SCOUNTRY 0x0006 /* localized name of country */
+#define LOCALE_SENGCOUNTRY 0x1002 /* English name of country */
+#define LOCALE_SABBREVCTRYNAME 0x0007 /* abbreviated country name */
+#define LOCALE_SNATIVECTRYNAME 0x0008 /* native name of country */
+#define LOCALE_IDEFAULTLANGUAGE 0x0009 /* default language id */
+#define LOCALE_IDEFAULTCOUNTRY 0x000A /* default country code */
+#define LOCALE_IDEFAULTCODEPAGE 0x000B /* default oem code page */
+#define LOCALE_IDEFAULTANSICODEPAGE 0x1004 /* default ansi code page */
+
+#define LOCALE_SLIST 0x000C /* list item separator */
+#define LOCALE_IMEASURE 0x000D /* 0 = metric, 1 = US */
+
+#define LOCALE_SDECIMAL 0x000E /* decimal separator */
+#define LOCALE_STHOUSAND 0x000F /* thousand separator */
+#define LOCALE_SGROUPING 0x0010 /* digit grouping */
+#define LOCALE_IDIGITS 0x0011 /* number of fractional digits */
+#define LOCALE_ILZERO 0x0012 /* leading zeros for decimal */
+#define LOCALE_INEGNUMBER 0x1010 /* negative number mode */
+#define LOCALE_SNATIVEDIGITS 0x0013 /* native ascii 0-9 */
+
+#define LOCALE_SCURRENCY 0x0014 /* local monetary symbol */
+#define LOCALE_SINTLSYMBOL 0x0015 /* intl monetary symbol */
+#define LOCALE_SMONDECIMALSEP 0x0016 /* monetary decimal separator */
+#define LOCALE_SMONTHOUSANDSEP 0x0017 /* monetary thousand separator */
+#define LOCALE_SMONGROUPING 0x0018 /* monetary grouping */
+#define LOCALE_ICURRDIGITS 0x0019 /* # local monetary digits */
+#define LOCALE_IINTLCURRDIGITS 0x001A /* # intl monetary digits */
+#define LOCALE_ICURRENCY 0x001B /* positive currency mode */
+#define LOCALE_INEGCURR 0x001C /* negative currency mode */
+
+#define LOCALE_SDATE 0x001D /* date separator */
+#define LOCALE_STIME 0x001E /* time separator */
+#define LOCALE_SSHORTDATE 0x001F /* short date-time separator */
+#define LOCALE_SLONGDATE 0x0020 /* long date-time separator */
+#define LOCALE_STIMEFORMAT 0x1003 /* time format string */
+#define LOCALE_IDATE 0x0021 /* short date format ordering */
+#define LOCALE_ILDATE 0x0022 /* long date format ordering */
+#define LOCALE_ITIME 0x0023 /* time format specifier */
+#define LOCALE_ITIMEMARKPOSN 0x1005 /* time marker position */
+#define LOCALE_ICENTURY 0x0024 /* century format specifier */
+#define LOCALE_ITLZERO 0x0025 /* leading zeros in time field */
+#define LOCALE_IDAYLZERO 0x0026 /* leading zeros in day field */
+#define LOCALE_IMONLZERO 0x0027 /* leading zeros in month field */
+#define LOCALE_S1159 0x0028 /* AM designator */
+#define LOCALE_S2359 0x0029 /* PM designator */
+
+#define LOCALE_ICALENDARTYPE 0x1009 /* type of calendar specifier */
+#define LOCALE_IOPTIONALCALENDAR 0x100B /* additional calendar types specifier */
+
+#define LOCALE_IFIRSTDAYOFWEEK 0x100C /* first day of week specifier */
+#define LOCALE_IFIRSTWEEKOFYEAR 0x100D /* first week of year specifier */
+
+
+#define LOCALE_SDAYNAME1 0x002A /* long name for Monday */
+#define LOCALE_SDAYNAME2 0x002B /* long name for Tuesday */
+#define LOCALE_SDAYNAME3 0x002C /* long name for Wednesday */
+#define LOCALE_SDAYNAME4 0x002D /* long name for Thursday */
+#define LOCALE_SDAYNAME5 0x002E /* long name for Friday */
+#define LOCALE_SDAYNAME6 0x002F /* long name for Saturday */
+#define LOCALE_SDAYNAME7 0x0030 /* long name for Sunday */
+#define LOCALE_SABBREVDAYNAME1 0x0031 /* abbreviated name for Monday */
+#define LOCALE_SABBREVDAYNAME2 0x0032 /* abbreviated name for Tuesday */
+#define LOCALE_SABBREVDAYNAME3 0x0033 /* abbreviated name for Wednesday */
+#define LOCALE_SABBREVDAYNAME4 0x0034 /* abbreviated name for Thursday */
+#define LOCALE_SABBREVDAYNAME5 0x0035 /* abbreviated name for Friday */
+#define LOCALE_SABBREVDAYNAME6 0x0036 /* abbreviated name for Saturday */
+#define LOCALE_SABBREVDAYNAME7 0x0037 /* abbreviated name for Sunday */
+#define LOCALE_SMONTHNAME1 0x0038 /* long name for January */
+#define LOCALE_SMONTHNAME2 0x0039 /* long name for February */
+#define LOCALE_SMONTHNAME3 0x003A /* long name for March */
+#define LOCALE_SMONTHNAME4 0x003B /* long name for April */
+#define LOCALE_SMONTHNAME5 0x003C /* long name for May */
+#define LOCALE_SMONTHNAME6 0x003D /* long name for June */
+#define LOCALE_SMONTHNAME7 0x003E /* long name for July */
+#define LOCALE_SMONTHNAME8 0x003F /* long name for August */
+#define LOCALE_SMONTHNAME9 0x0040 /* long name for September */
+#define LOCALE_SMONTHNAME10 0x0041 /* long name for October */
+#define LOCALE_SMONTHNAME11 0x0042 /* long name for November */
+#define LOCALE_SMONTHNAME12 0x0043 /* long name for December */
+#define LOCALE_SMONTHNAME13 0x100E /* long name for 13th month (if exists) */
+#define LOCALE_SABBREVMONTHNAME1 0x0044 /* abbreviated name for January */
+#define LOCALE_SABBREVMONTHNAME2 0x0045 /* abbreviated name for February */
+#define LOCALE_SABBREVMONTHNAME3 0x0046 /* abbreviated name for March */
+#define LOCALE_SABBREVMONTHNAME4 0x0047 /* abbreviated name for April */
+#define LOCALE_SABBREVMONTHNAME5 0x0048 /* abbreviated name for May */
+#define LOCALE_SABBREVMONTHNAME6 0x0049 /* abbreviated name for June */
+#define LOCALE_SABBREVMONTHNAME7 0x004A /* abbreviated name for July */
+#define LOCALE_SABBREVMONTHNAME8 0x004B /* abbreviated name for August */
+#define LOCALE_SABBREVMONTHNAME9 0x004C /* abbreviated name for September */
+#define LOCALE_SABBREVMONTHNAME10 0x004D /* abbreviated name for October */
+#define LOCALE_SABBREVMONTHNAME11 0x004E /* abbreviated name for November */
+#define LOCALE_SABBREVMONTHNAME12 0x004F /* abbreviated name for December */
+#define LOCALE_SABBREVMONTHNAME13 0x100F /* abbreviated name for 13th month (if exists) */
+
+#define LOCALE_SPOSITIVESIGN 0x0050 /* positive sign */
+#define LOCALE_SNEGATIVESIGN 0x0051 /* negative sign */
+#define LOCALE_IPOSSIGNPOSN 0x0052 /* positive sign position */
+#define LOCALE_INEGSIGNPOSN 0x0053 /* negative sign position */
+#define LOCALE_IPOSSYMPRECEDES 0x0054 /* mon sym precedes pos amt */
+#define LOCALE_IPOSSEPBYSPACE 0x0055 /* mon sym sep by space from pos */
+#define LOCALE_INEGSYMPRECEDES 0x0056 /* mon sym precedes neg amt */
+#define LOCALE_INEGSEPBYSPACE 0x0057 /* mon sym sep by space from neg */
+
+
+/***************************************************************************\
+* Typedefs
+*
+* Define all types for the NLS component here.
+\***************************************************************************/
+
+/*
+ * IDs.
+ */
+typedef unsigned long LCID; /* locale ID */
+typedef unsigned short LANGID; /* language ID */
+typedef unsigned long LCTYPE; /* locale type constant */
+
+#define _LCID_DEFINED
+
+
+
+/***************************************************************************\
+* Macros
+*
+* Define all macros for the NLS component here.
+\***************************************************************************/
+
+/*
+ * A language ID is a 16 bit value which is the combination of a
+ * primary language ID and a secondary language ID. The bits are
+ * allocated as follows:
+ *
+ * +-----------------------+-------------------------+
+ * | Sublanguage ID | Primary Language ID |
+ * +-----------------------+-------------------------+
+ * 15 10 9 0 bit
+ *
+ *
+ * Language ID creation/extraction macros:
+ *
+ * MAKELANGID - construct language id from primary language id and
+ * sublanguage id.
+ * PRIMARYLANGID - extract primary language id from a language id.
+ * SUBLANGID - extract sublanguage id from a language id.
+ */
+#define MAKELANGID(p, s) ((((unsigned short)(s)) << 10) | (unsigned short)(p))
+
+#define PRIMARYLANGID(lgid) ((unsigned short)(lgid) & 0x3ff)
+
+#define SUBLANGID(lgid) ((unsigned short)(lgid) >> 10)
+
+
+/*
+ * A locale ID is a 32 bit value which is the combination of a
+ * language ID and a reserved area. The bits are allocated as follows:
+ *
+ * +-----------------------+-------------------------+
+ * | Reserved | Language ID |
+ * +-----------------------+-------------------------+
+ * 31 16 15 0 bit
+ *
+ *
+ * Locale ID creation macro:
+ *
+ * MAKELCID - construct locale id from a language id.
+ */
+#define MAKELCID(lgid) ((unsigned long)(((unsigned short)(lgid)) | (((unsigned long)((unsigned short)(0))) << 16)))
+
+
+/*
+ * Get the language id from a locale id.
+ */
+#define LANGIDFROMLCID(lcid) ((unsigned short)(lcid))
+
+
+/*
+ * Default System and User IDs for language and locale.
+ */
+#define LANG_SYSTEM_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
+#define LANG_USER_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
+
+#define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT))
+#define LOCALE_USER_DEFAULT (MAKELCID(LANG_USER_DEFAULT))
+
+
+
+/***************************************************************************\
+* Function Prototypes
+*
+* Only prototypes for the NLS APIs should go here.
+\***************************************************************************/
+
+
+NLSAPI_(int)
+CompareStringA(LCID, unsigned long, const char FAR*, int, const char FAR*, int);
+
+NLSAPI_(int)
+LCMapStringA(LCID, unsigned long, const char FAR*, int, char FAR*, int);
+
+NLSAPI_(int)
+GetLocaleInfoA(LCID, LCTYPE, char FAR*, int);
+
+NLSAPI_(int)
+GetStringTypeA(LCID, unsigned long, const char FAR*, int, unsigned short FAR*);
+
+NLSAPI_(LANGID)
+GetSystemDefaultLangID(void);
+
+NLSAPI_(LANGID)
+GetUserDefaultLangID(void);
+
+NLSAPI_(LCID)
+GetSystemDefaultLCID(void);
+
+NLSAPI_(LCID)
+GetUserDefaultLCID(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* NONLS */
+
+#endif /* _OLENLS_ */
diff --git a/private/oleauto/src/inc/variant.h b/private/oleauto/src/inc/variant.h
new file mode 100644
index 000000000..3d88aded5
--- /dev/null
+++ b/private/oleauto/src/inc/variant.h
@@ -0,0 +1,277 @@
+/***
+*variant.h
+*
+* Copyright (C) 1992-1995, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This file declares VARIANT, and related data types.
+*
+*Implementation Notes:
+* This file requires ole2.h
+*
+*****************************************************************************/
+
+#ifndef _VARIANT_H_
+#define _VARIANT_H_
+
+
+#ifndef HUGEP
+# ifdef _MAC
+# define HUGEP FAR
+# else
+# if WIN32
+# define HUGEP
+# else
+# define HUGEP _huge
+# endif
+# endif
+#endif
+
+#ifndef FAR
+# ifdef _MAC
+# define FAR
+# else
+# ifdef WIN32
+# define FAR
+# else
+# define FAR _far
+# endif
+# endif
+#endif
+
+
+/* Forward Declarations */
+
+#ifdef __cplusplus
+interface IDispatch;
+#else
+typedef interface IDispatch IDispatch;
+#endif
+
+
+#ifndef OLESTR
+#if defined(WIN32)
+typedef WCHAR OLECHAR;
+typedef LPWSTR LPOLESTR;
+typedef LPCWSTR LPCOLESTR;
+#define OLESTR(str) L##str
+#else
+typedef char OLECHAR;
+typedef OLECHAR FAR* LPOLESTR;
+typedef const OLECHAR FAR* LPCOLESTR;
+#define OLESTR(str) str
+#endif
+#endif
+
+typedef OLECHAR FAR* BSTR;
+typedef BSTR FAR* LPBSTR;
+
+
+typedef struct FARSTRUCT tagSAFEARRAYBOUND {
+ unsigned long cElements;
+ long lLbound;
+} SAFEARRAYBOUND, FAR* LPSAFEARRAYBOUND;
+
+typedef struct FARSTRUCT tagSAFEARRAY {
+ unsigned short cDims;
+ unsigned short fFeatures;
+#if defined(WIN32)
+ unsigned long cbElements;
+ unsigned long cLocks;
+#else
+ unsigned short cbElements;
+ unsigned short cLocks;
+#ifdef _MAC
+ Handle handle;
+#else
+ unsigned long handle;
+#endif
+#endif
+ void HUGEP* pvData;
+ SAFEARRAYBOUND rgsabound[1];
+} SAFEARRAY, FAR* LPSAFEARRAY;
+
+#define FADF_AUTO 0x0001 /* array is allocated on the stack */
+#define FADF_STATIC 0x0002 /* array is staticly allocated */
+#define FADF_EMBEDDED 0x0004 /* array is embedded in a structure */
+#define FADF_FIXEDSIZE 0x0010 /* array may not be resized or reallocated */
+#define FADF_BSTR 0x0100 /* an array of BSTRs */
+#define FADF_UNKNOWN 0x0200 /* an array of IUnknown* */
+#define FADF_DISPATCH 0x0400 /* an array of IDispatch* */
+#define FADF_VARIANT 0x0800 /* an array of VARIANTs */
+#define FADF_RESERVED 0xF0E8 /* bits reserved for future use */
+
+
+/* 0 == FALSE, -1 == TRUE */
+typedef short VARIANT_BOOL;
+
+
+typedef double DATE;
+
+
+/* This is a helper struct for use in handling currency. */
+typedef struct FARSTRUCT tagCY {
+#ifdef _MAC
+ long Hi;
+ unsigned long Lo;
+#else
+ unsigned long Lo;
+ long Hi;
+#endif
+} CY;
+
+
+/*
+ * VARENUM usage key,
+ *
+ * [V] - may appear in a VARIANT
+ * [T] - may appear in a TYPEDESC
+ * [P] - may appear in an OLE property set
+ * [S] - may appear in a Safe Array
+ *
+ */
+enum VARENUM
+{
+ VT_EMPTY = 0, /* [V] [P] nothing */
+ VT_NULL = 1, /* [V] SQL style Null */
+ VT_I2 = 2, /* [V][T][P][S] 2 byte signed int */
+ VT_I4 = 3, /* [V][T][P][S] 4 byte signed int */
+ VT_R4 = 4, /* [V][T][P][S] 4 byte real */
+ VT_R8 = 5, /* [V][T][P][S] 8 byte real */
+ VT_CY = 6, /* [V][T][P][S] currency */
+ VT_DATE = 7, /* [V][T][P][S] date */
+ VT_BSTR = 8, /* [V][T][P][S] binary string */
+ VT_DISPATCH = 9, /* [V][T] [S] IDispatch FAR* */
+ VT_ERROR = 10, /* [V][T] [S] SCODE */
+ VT_BOOL = 11, /* [V][T][P][S] True=-1, False=0 */
+ VT_VARIANT = 12, /* [V][T][P][S] VARIANT FAR* */
+ VT_UNKNOWN = 13, /* [V][T] [S] IUnknown FAR* */
+
+ VT_I1 = 16, /* [T] signed char */
+ VT_UI1 = 17, /* [V][T] [S] unsigned char */
+ VT_UI2 = 18, /* [T] unsigned short */
+ VT_UI4 = 19, /* [T] unsigned short */
+ VT_I8 = 20, /* [T][P] signed 64-bit int */
+ VT_UI8 = 21, /* [T] unsigned 64-bit int */
+ VT_INT = 22, /* [T] signed machine int */
+ VT_UINT = 23, /* [T] unsigned machine int */
+ VT_VOID = 24, /* [T] C style void */
+ VT_HRESULT = 25, /* [T] */
+ VT_PTR = 26, /* [T] pointer type */
+ VT_SAFEARRAY = 27, /* [T] (use VT_ARRAY in VARIANT) */
+ VT_CARRAY = 28, /* [T] C style array */
+ VT_USERDEFINED = 29, /* [T] user defined type */
+ VT_LPSTR = 30, /* [T][P] null terminated string */
+ VT_LPWSTR = 31, /* [T][P] wide null terminated string */
+
+ VT_FILETIME = 64, /* [P] FILETIME */
+ VT_BLOB = 65, /* [P] Length prefixed bytes */
+ VT_STREAM = 66, /* [P] Name of the stream follows */
+ VT_STORAGE = 67, /* [P] Name of the storage follows */
+ VT_STREAMED_OBJECT = 68, /* [P] Stream contains an object */
+ VT_STORED_OBJECT = 69, /* [P] Storage contains an object */
+ VT_BLOB_OBJECT = 70, /* [P] Blob contains an object */
+ VT_CF = 71, /* [P] Clipboard format */
+ VT_CLSID = 72 /* [P] A Class ID */
+};
+
+#define VT_VECTOR 0x1000 /* [P] simple counted array */
+#define VT_ARRAY 0x2000 /* [V] SAFEARRAY* */
+#define VT_BYREF 0x4000 /* [V] */
+#define VT_RESERVED 0x8000
+
+
+typedef unsigned short VARTYPE;
+
+typedef struct FARSTRUCT tagVARIANT VARIANT;
+typedef struct FARSTRUCT tagVARIANT FAR* LPVARIANT;
+typedef struct FARSTRUCT tagVARIANT VARIANTARG;
+typedef struct FARSTRUCT tagVARIANT FAR* LPVARIANTARG;
+
+struct FARSTRUCT tagVARIANT{
+ VARTYPE vt;
+ unsigned short wReserved1;
+ unsigned short wReserved2;
+ unsigned short wReserved3;
+ union {
+ unsigned char bVal; /* VT_UI1 */
+ short iVal; /* VT_I2 */
+ long lVal; /* VT_I4 */
+ float fltVal; /* VT_R4 */
+ double dblVal; /* VT_R8 */
+ VARIANT_BOOL bool; /* VT_BOOL */
+ SCODE scode; /* VT_ERROR */
+ CY cyVal; /* VT_CY */
+ DATE date; /* VT_DATE */
+ BSTR bstrVal; /* VT_BSTR */
+ IUnknown FAR* punkVal; /* VT_UNKNOWN */
+ IDispatch FAR* pdispVal; /* VT_DISPATCH */
+ SAFEARRAY FAR* parray; /* VT_ARRAY|* */
+
+ unsigned char FAR *pbVal; /* VT_BYREF|VT_UI1 */
+ short FAR* piVal; /* VT_BYREF|VT_I2 */
+ long FAR* plVal; /* VT_BYREF|VT_I4 */
+ float FAR* pfltVal; /* VT_BYREF|VT_R4 */
+ double FAR* pdblVal; /* VT_BYREF|VT_R8 */
+ VARIANT_BOOL FAR* pbool; /* VT_BYREF|VT_BOOL */
+ SCODE FAR* pscode; /* VT_BYREF|VT_ERROR */
+ CY FAR* pcyVal; /* VT_BYREF|VT_CY */
+ DATE FAR* pdate; /* VT_BYREF|VT_DATE */
+ BSTR FAR* pbstrVal; /* VT_BYREF|VT_BSTR */
+ IUnknown FAR* FAR* ppunkVal; /* VT_BYREF|VT_UNKNOWN */
+ IDispatch FAR* FAR* ppdispVal; /* VT_BYREF|VT_DISPATCH */
+ SAFEARRAY FAR* FAR* pparray; /* VT_BYREF|VT_ARRAY|* */
+ VARIANT FAR* pvarVal; /* VT_BYREF|VT_VARIANT */
+
+ void FAR* byref; /* Generic ByRef */
+ }
+#if defined(NONAMELESSUNION) || (defined(_MAC) && !defined(__cplusplus) && !defined(_MSC_VER))
+ u
+#endif
+ ;
+};
+
+#if defined(NONAMELESSUNION) || (defined(_MAC) && !defined(__cplusplus) && !defined(_MSC_VER))
+# define V_UNION(X, Y) ((X)->u.Y)
+#else
+# define V_UNION(X, Y) ((X)->Y)
+#endif
+
+/* Variant access macros */
+#define V_VT(X) ((X)->vt)
+#define V_ISBYREF(X) (V_VT(X)&VT_BYREF)
+#define V_ISARRAY(X) (V_VT(X)&VT_ARRAY)
+#define V_ISVECTOR(X) (V_VT(X)&VT_VECTOR)
+
+#define V_NONE(X) V_I2(X)
+#define V_UI1(X) V_UNION(X, bVal)
+#define V_UI1REF(X) V_UNION(X, pbVal)
+#define V_I2(X) V_UNION(X, iVal)
+#define V_I2REF(X) V_UNION(X, piVal)
+#define V_I4(X) V_UNION(X, lVal)
+#define V_I4REF(X) V_UNION(X, plVal)
+#define V_R4(X) V_UNION(X, fltVal)
+#define V_R4REF(X) V_UNION(X, pfltVal)
+#define V_R8(X) V_UNION(X, dblVal)
+#define V_R8REF(X) V_UNION(X, pdblVal)
+#define V_BOOL(X) V_UNION(X, bool)
+#define V_BOOLREF(X) V_UNION(X, pbool)
+#define V_ERROR(X) V_UNION(X, scode)
+#define V_ERRORREF(X) V_UNION(X, pscode)
+#define V_CY(X) V_UNION(X, cyVal)
+#define V_CYREF(X) V_UNION(X, pcyVal)
+#define V_DATE(X) V_UNION(X, date)
+#define V_DATEREF(X) V_UNION(X, pdate)
+#define V_BSTR(X) V_UNION(X, bstrVal)
+#define V_BSTRREF(X) V_UNION(X, pbstrVal)
+#define V_UNKNOWN(X) V_UNION(X, punkVal)
+#define V_UNKNOWNREF(X) V_UNION(X, ppunkVal)
+#define V_DISPATCH(X) V_UNION(X, pdispVal)
+#define V_DISPATCHREF(X) V_UNION(X, ppdispVal)
+#define V_VARIANTREF(X) V_UNION(X, pvarVal)
+#define V_ARRAY(X) V_UNION(X, parray)
+#define V_ARRAYREF(X) V_UNION(X, pparray)
+#define V_BYREF(X) V_UNION(X, byref)
+
+#endif /* _VARIANT_H_ */
+
diff --git a/private/oleauto/src/inc/verstamp.h b/private/oleauto/src/inc/verstamp.h
new file mode 100644
index 000000000..8b5620552
--- /dev/null
+++ b/private/oleauto/src/inc/verstamp.h
@@ -0,0 +1,5 @@
+#define rmj 2
+#define rmm 2
+#define rup 3011
+#define szVerName ""
+#define szVerUser "DOUGF5"
diff --git a/private/oleauto/src/mktyplib/dimalloc.cxx b/private/oleauto/src/mktyplib/dimalloc.cxx
new file mode 100644
index 000000000..6d15e3de9
--- /dev/null
+++ b/private/oleauto/src/mktyplib/dimalloc.cxx
@@ -0,0 +1,1787 @@
+/***
+*dimalloc.cxx
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains a debug implementation of the IMalloc interface.
+*
+* This implementation is basically a simple wrapping of the C runtime,
+* with additional work to detect memory leakage, and memory overwrite.
+*
+* Leakage is detected by tracking each allocation in an address
+* instance table, and then checking to see if the table is empty
+* when the last reference to the allocator is released.
+*
+* Memory overwrite is detected by placing a signature at the end
+* of every allocated block, and checking to make sure the signature
+* is unchanged when the block is freed.
+*
+* This implementation also has additional param validation code, as
+* well as additional check make sure that instances that are passed
+* to Free() were actually allocated by the corresponding instance
+* of the allocator.
+*
+*
+* Creating an instance of this debug allocator that uses the default
+* output interface would look like the following,
+*
+*
+* BOOL init_application_instance()
+* {
+* HRESULT hresult;
+* IMalloc FAR* pmalloc;
+*
+* pmalloc = NULL;
+*
+* if((hresult = CreateDbAlloc(DBALLOC_NONE, NULL, &pmalloc)) != NOERROR)
+* goto LReturn;
+*
+* hresult = OleInitialize(pmalloc);
+*
+* LReturn:;
+* if(pmalloc != NULL)
+* pmalloc->Release();
+*
+* return (hresult == NOERROR) ? TRUE : FALSE;
+* }
+*
+*
+* CONSIDER: could add an option to force error generation, something
+* like DBALLOC_ERRORGEN, that works along the lines of OB's
+* DebErrorNow.
+*
+* CONSIDER: add support for heap-checking. say for example,
+* DBALLOC_HEAPCHECK would do a heapcheck every free? every 'n'
+* calls to free? ...
+*
+*
+*Revision History:
+*
+* [00] 25-Feb-92 bradlo: Created.
+* [01] 03-Mar-93 rajivk: Added to ebapp.
+*
+*Implementation Notes:
+*
+* The method IMalloc::DidAlloc() is allowed to always return
+* "Dont Know" (-1). This method is called by Ole, and they take
+* some appropriate action when they get this answer. UNDONE -- elaborate.
+*
+*****************************************************************************/
+
+#ifdef DEBUG // entire file
+#if 0
+#include "pch.c"
+#pragma hdrstop(PCHNAME)
+#else //0
+#include "mktyplib.h"
+#ifdef MAC
+#define OE_MAC TRUE
+#endif
+#ifdef WIN32
+#define OE_WIN32 TRUE
+#if defined(_MIPS_) || defined(_ALPHA_) || defined(_PPC_)
+#define OE_RISC TRUE
+#endif
+#endif
+#ifdef WIN16
+#define OE_WIN16 TRUE
+#endif
+#endif //0
+
+#if OE_MAC
+#include <macos\osutils.h>
+#include <macos\sysequ.h>
+#endif // OE_MAC
+
+// Note: this file is designed to be stand-alone; it includes a
+// carefully chosen, minimal set of headers.
+//
+// For conditional compilation we use the ole2 conventions,
+// _MAC = mac
+// WIN32 = Win32 (NT really)
+// <nothing> = defaults to Win16
+#ifdef _DEBUG
+#undef _DEBUG
+#endif
+#define _DEBUG 1
+
+
+#if !OE_WIN32
+#include "ole2.h"
+#if !OE_MAC
+#include "compobj.h"
+#endif
+#endif //!OE_WIN32
+
+#if OE_MAC
+// include Mac stuff
+#include "macos\memory.h"
+#include "macos\errors.h"
+
+typedef VOID* HSYS;
+#define HSYS_Nil ((HSYS)NULL)
+
+
+#endif
+
+#include <stdio.h>
+#include <malloc.h>
+#include <string.h>
+#include <stdarg.h>
+#include <limits.h>
+
+#if 0
+#include "ebapp.h"
+#include "dimalloc.hxx"
+
+// This global is defined in bind.c and contains the name of the
+// log file specified by -o, if there is one.
+//
+extern "C" {
+ CHAR g_szLogFile[];
+}
+#else //0
+
+#if OE_RISC
+ // UNDONE: RISC [jeffrob] Currently use same alignment for ALL risc
+ // UNDONE: platforms.
+ #define cbAlign 8
+#endif // OE_RISC
+
+#if OE_MAC
+ #include "macos\menus.h"
+ #include "macos\dialogs.h"
+ #include "stdio.h"
+ #include "macos\files.h"
+ #include "macos\lists.h"
+#endif // OE_MAC
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Assertion macro.
+#define DebAssert(fExpr, szComment) \
+ if (!(fExpr)) \
+ DebAssertShow(__FILE__, __LINE__, szComment); \
+ else 0 /* useless statement */
+
+void DebAssertShow(LPSTR szFileName, UINT uLine, LPSTR szComment);
+
+
+#define DebAssertNum(fExpr, szComment, nErr) \
+ if (!(fExpr)) \
+ DebAssertShow(__FILE__, __LINE__, szComment); \
+ else 0 /* useless statement */
+
+#if 0
+// Macros for error checking:
+#define IfErrExit(s) { if (eberr = (s)) goto Exit; }
+#define IfNullExit(s) { if ( !(s) ) { eberr = EBERR_OutOfMemory; goto Exit;} }
+#define IfErrGo(s) { if (eberr = (s)) goto Error; }
+#define IfErrGoTo(s, label) { if (eberr = (s)) goto label; }
+#endif //0
+
+#ifndef WIN32
+#ifndef _INC_WINDOWS
+ #define LOWORD(l) ((WORD)(DWORD)(l))
+ #define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xFFFF))
+#endif //_INC_WINDOWS
+#endif //!WIN32
+
+#if 0
+// Maintains the hproj/docfile/project substorage relationship.
+typedef struct STGREC {
+ IStorage FAR *pstgFile;
+ IStorage FAR *pstgProj;
+ HPROJECT hproj; // The hproject associated with this storage if known.
+ LPSTR bstrName; // The name of the file.
+ BOOL isTemp; // TRUE if this is a temp file that should be deleted
+ // when closed.
+} STGREC;
+
+STGREC FAR *CreateTmpStorage(void);
+EBERR CopyTmpFileToDest(HPROJECT hproj, LPSTR lpstrFileName);
+void PASCAL FreeStorage(void);
+STGREC FAR *FindStgRecByName(LPSTR szName);
+void CloseProjectStorage(HPROJECT hproj);
+
+#if OE_WIN
+extern HINSTANCE g_hInst; // host-app instance handle
+extern HWND g_hwndSrchDlg; // modeless search dialog
+extern HWND g_hwndMDISpace; // window handle of host app's MDI space
+extern HWND g_hwndParent; // this instance's top-level window.
+extern char g_szProject[]; // project window class name
+extern char g_szDebugWnd[]; // debug window class name
+extern char g_szPolyWnd[]; // polygon window class name
+#endif //OE_WIN
+
+#if OE_MAC
+extern BOOL fMacHelpLoaded; //TRUE if the mac help file is laoded
+extern FSSpec fsHelpFile; //FSSpec for the help file
+#endif
+
+extern char *g_szTitleText; // default title bar text
+extern HWND g_hwndEbActive; // Active O.B. window.
+extern BOOL g_fAppActive; // is this application active?
+extern BOOL g_fParentActive; // is the parent (frame) window active?
+extern LPSTR g_lpszHelpFile; // help file if F1 pressed
+extern DWORD g_dwHelpContext; // help context if F1 pressed
+extern UINT g_cMsgLoop; // How many nested message loops?
+extern INT g_fNoAllocs; // Are allocations allowed?
+
+extern int g_cxScroll; // width of scrollbar
+extern int g_cyScroll; // heigth of scrollbar
+// Errros Used by Ebapp only.
+#define EBERR_IdNotFound 0xffff
+extern int g_fDbcs; // is DBCS support enabled?
+
+
+LPDISPATCH EBCALL Bind(LPVARIANT lpvarRngName);
+LPDISPATCH EBCALL NewPoint(void);
+LPDISPATCH EBCALL NewPoly(void);
+LPDISPATCH EBCALL GetProjCollection(void);
+LPDISPATCH EBCALL NewList(void);
+LPDISPATCH EBCALL GetAppObj(void);
+void AppObjTerm();
+
+void CallEbNotifyWindow(HWND hwnd, EBMSG ebmsg, LONG lparam);
+void QuitEbApp();
+void DebAssertWrite(char *szFileName, char *szMsg);
+
+LPVOID EBCALL CreateNewObject(LPSTR szProjName, LPSTR szClassName);
+BOOL GetDebIMalloc(IMalloc FAR* FAR* ppmalloc);
+
+VOID FAR* EBCALL CreateInstance(BSTR szTlibName, UINT uIndex);
+VOID FAR* CreateInst(BSTR szTlibName, UINT uIndex);
+
+BOOL GetStringDlg(char **pszString);
+BOOL RenameDlg(char **pszNewName);
+
+#if OE_MAC
+Boolean CheckMacHelpEvent(EventRecord *evtPtr);
+OSErr GetWDInfoTemp(short wdRefNum, short *pvRefNum, long *pdirid);
+BOOL MacGetFullPath(long dirid, short vRefNum, LPSTR szPath);
+void InitializeGrafport();
+BOOL FCalcTextHeight(CHAR *szText, SHORT cx, SHORT *cy);
+void RectToRECT (const Rect *prcm, RECT *prc);
+void RECTToRect (const RECT *prc, Rect *prcm);
+BOOL PaintWindow(EventRecord *pevt);
+#endif // OE_MAC
+
+DEFINE_GUID (IID_CVARCOLLECT, 0x2d736941, 0xc370, 0x1068, 0xb3, 0x69, 0x08, 0x00, 0x2b, 0x2b, 0x37, 0x87);
+#endif //0
+
+#ifdef __cplusplus
+}
+#endif
+
+#if OE_MAC
+#ifdef _fstrcpy
+#undef _fstrcpy
+#endif
+#ifdef _fstrncpy
+#undef _fstrncpy
+#endif
+#ifdef _fstrncat
+#undef _fstrncat
+#endif
+#ifdef _fstrcat
+#undef _fstrcat
+#endif
+#ifdef _fstrchr
+#undef _fstrchr
+#endif
+
+#define _fstrcpy strcpy
+#define _fstrncpy strncpy
+#define _fstrncat strncat
+#define _fstrcat strcat
+#define _fstrchr strchr
+#endif //OE_MAC
+
+#if OE_MAC
+#define STDOLE_FILE "mstdole.tlb"
+#define APPOBJ_FILE "mappobj"
+#else //!OE_MAC
+
+#if OE_WIN32
+#define STDOLE_FILE "stdole32.tlb"
+#define APPOBJ_FILE "apo"
+#else //OE_WIN16
+#define STDOLE_FILE "stdole.tlb"
+#define APPOBJ_FILE "apobj"
+#endif //OE_WIN16
+
+#endif //!OE_MAC
+
+#define VBAOLB_FILE "vba"
+
+#endif
+
+#ifndef DBALLOC_H_INCLUDED /* { */
+#define DBALLOC_H_INCLUDED
+
+
+interface IDbOutput : public IUnknown
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppv) PURE;
+ STDMETHOD_(ULONG, AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG, Release)(THIS) PURE;
+
+ STDMETHOD_(void, Printf)(THIS_
+ char FAR* szFmt, ...) PURE;
+
+ STDMETHOD_(void, Assertion)(THIS_
+ BOOL cond,
+ char FAR* szExpr,
+ char FAR* szFile,
+ UINT uLine,
+ char FAR* szMsg) PURE;
+};
+
+
+STDAPI CreateDbAlloc(
+ ULONG options,
+ IDbOutput FAR* pdbout,
+ IMalloc FAR* FAR* ppmalloc);
+
+// dballoc option flags - these are set at create time.
+
+#define DBALLOC_NONE 0
+
+
+#endif /* } DBALLOC_H_INCLUDED */
+
+#define OOB_SELECTOROF(p) ((USHORT) ((ULONG) (p) >> 16))
+#define DIM(X) (sizeof(X)/sizeof((X)[0]))
+#define UNREACHED 0
+static char szSigMsg[] = "Signature Check Failed";
+
+
+ // This defn switches in array handling code that knows how to
+ // handle non-aligned & non-power-of-2 arrays.
+ // Defined & used in hugearry.asm, dimalloc.cxx & exvarg.cxx
+ // In dimalloc.cxx it enables signature prefixing for huge
+ // arrays thus allowing testing of the array-adjust code in VBA.
+#define ADJUST_ARRAYS 1
+
+
+#if OE_WIN16
+#define MAX_SIZE 64000
+#else
+#define MAX_SIZE UINT_MAX
+#endif
+
+#define Max
+VOID FAR * HugeAlloc(DWORD bch);
+VOID FAR *HugeRealloc(VOID FAR *pv, DWORD bchNew);
+VOID FAR *HugeFree(VOID FAR * pv);
+
+
+
+
+#if defined(WIN32)
+
+# define MEMCMP(PV1, PV2, CB) memcmp((PV1), (PV2), (CB))
+# define MEMCPY(PV1, PV2, CB) memcpy((PV1), (PV2), (CB))
+# define MEMSET(PV, VAL, CB) memset((PV), (VAL), (CB))
+# define MALLOC(CB) malloc(CB)
+# define REALLOC(PV, CB) realloc((PV), (CB))
+# define FREE(PV) free(PV)
+# define MSIZE(PV) _msize(PV)
+//UNDONE: NT has no heapmin() function?
+//# define HEAPMIN() _heapmin()
+
+#elif OE_MAC
+
+#define MEMCPY memcpy
+// #define REALLOC(PV, CB) SetPtrSize((char _near *)(PV), (CB))
+// #define MALLOC(CB) NewPtr(CB)
+// #define FREE(PV) DisposPtr((char _near *)(PV))
+#define REALLOC(PV, CB) realloc((PV), (CB))
+#define MALLOC(CB) malloc(CB)
+#define FREE(PV) free(PV)
+#define MEMCMP(PV1, PV2, CB) memcmp((PV1), (PV2), (CB))
+#define MEMSET(PV, VAL, CB) memset((PV), (VAL), (CB))
+// #define MSIZE(PV) GetPtrSize((char _near *)(PV))
+#define MSIZE(PV) _msize(PV)
+#define HEAPMIN() _heapmin()
+
+#else
+
+# define MEMCMP(PV1, PV2, CB) _fmemcmp((PV1), (PV2), (CB))
+# define MEMCPY(PV1, PV2, CB) _fmemcpy((PV1), (PV2), (CB))
+# define MEMSET(PV, VAL, CB) _fmemset((PV), (VAL), (CB))
+# define MALLOC(CB) _fmalloc(CB)
+# define REALLOC(PV, CB) _frealloc(PV, CB)
+# define FREE(PV) _ffree(PV)
+# define MSIZE(PV) _fmsize(PV)
+# define HEAPMIN() _fheapmin()
+
+#endif
+
+class FAR CStdDbOutput : public IDbOutput {
+public:
+ static IDbOutput FAR* Create();
+
+ // IUnknown methods
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+
+ // IDbOutput methods
+
+ STDMETHOD_(void, Printf)(char FAR* szFmt, ...);
+
+ STDMETHOD_(void, Assertion)(
+ BOOL cond,
+ char FAR* szExpr,
+ char FAR* szFile,
+ UINT uLine,
+ char FAR* szMsg);
+
+
+ void FAR* operator new(size_t cb){
+ return MALLOC(cb);
+ }
+ void operator delete(void FAR* pv){
+ FREE(pv);
+ }
+
+ CStdDbOutput(){
+ m_refs = 0;
+ }
+
+private:
+ ULONG m_refs;
+
+ char m_rgch[128]; // buffer for output formatting
+};
+
+
+
+//---------------------------------------------------------------------
+// implementation of the debug allocator
+//---------------------------------------------------------------------
+
+class FAR CAddrNode
+{
+public:
+ void FAR* m_pv; // instance
+ ULONG m_cb; // size of allocation in BYTES
+ ULONG m_nAlloc; // the allocation pass count
+ CAddrNode FAR* m_next;
+
+ void FAR* operator new(size_t cb){
+ return MALLOC(cb);
+ }
+ void operator delete(void FAR* pv){
+ FREE(pv);
+ }
+};
+
+
+class FAR CDbAlloc : public IMalloc
+{
+public:
+ static HRESULT Create(
+ ULONG options, IDbOutput FAR* pdbout, IMalloc FAR* FAR* ppmalloc);
+
+ // IUnknown methods
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ // IMalloc methods
+
+ STDMETHOD_(void FAR*, Alloc)(ULONG cb);
+ STDMETHOD_(void FAR*, Realloc)(void FAR* pv, ULONG cb);
+ STDMETHOD_(void, Free)(void FAR* pv);
+ STDMETHOD_(ULONG, GetSize)(void FAR* pv);
+ STDMETHOD_(int, DidAlloc)(void FAR* pv);
+ STDMETHOD_(void, HeapMinimize)(void);
+
+ VOID IMallocHeapChecker();
+ VOID MemInstance();
+
+ void FAR* operator new(size_t cb){
+ return MALLOC(cb);
+ }
+ void operator delete(void FAR* pv){
+ FREE(pv);
+ }
+
+private:
+
+ ULONG m_refs;
+ ULONG m_cAllocCalls; // total count of allocation calls
+ IDbOutput FAR* m_pdbout; // output interface
+ CAddrNode FAR* m_rganode[64]; // address instance table
+
+
+ // instance table methods
+
+ void AddInst(void FAR* pv, ULONG nAlloc, ULONG cb);
+ void DelInst(void FAR* pv);
+ CAddrNode FAR* GetInst(void FAR* pv);
+
+ BOOL IsEmpty(void);
+ void DumpInstTable(void);
+
+ void DumpInst(CAddrNode FAR* pn);
+
+ inline UINT HashInst(void FAR* pv) const {
+ return ((UINT)((ULONG)pv >> 4)) % DIM(m_rganode);
+ }
+
+
+ // output method(s)
+
+ inline void Assertion(
+ BOOL cond,
+ char FAR* szExpr,
+ char FAR* szFile,
+ UINT uLine,
+ char FAR* szMsg)
+ {
+ m_pdbout->Assertion(cond, szExpr, szFile, uLine, szMsg);
+ }
+
+ #define ASSERT(X) Assertion(X, #X, __FILE__, __LINE__, NULL)
+
+ #define ASSERTSZ(X, SZ) Assertion(X, #X, __FILE__, __LINE__, SZ)
+
+#if OE_RISC
+ char m_rgchSig[cbAlign];
+#else
+ char m_rgchSig[4];
+#endif // !(OE_RISC)
+
+public:
+ CDbAlloc(){
+ m_refs = 1;
+ m_pdbout = NULL;
+ m_cAllocCalls = 0;
+ MEMSET(m_rganode, 0, sizeof(m_rganode));
+ m_rgchSig[0] = m_rgchSig[2] = (char)0xBA;
+ m_rgchSig[1] = m_rgchSig[3] = (char)0xBE;
+#if OE_RISC
+#if (cbAlign == 8)
+ m_rgchSig[4] = m_rgchSig[6] = (char)0xBA;
+ m_rgchSig[5] = m_rgchSig[7] = (char)0xBE;
+#else
+ #error Invalid cbAlign value.
+#endif // cbAlign
+#endif // OE_RISC
+ }
+};
+
+
+/***
+*HRESULT CreateDbAlloc(ULONG, IDbOutput*, IMalloc**)
+*Purpose:
+* Create an instance of CDbAlloc -- a debug implementation
+* of IMalloc.
+*
+*Entry:
+* pdbout = optional IDbOutput interface to use for ouput
+* (if NULL, then the default debug output interface will be used)
+* options =
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppmalloc = pointer to an IMalloc interface
+*
+***********************************************************************/
+STDAPI
+CreateDbAlloc(
+ ULONG options,
+ IDbOutput FAR* pdbout,
+ IMalloc FAR* FAR* ppmalloc)
+{
+ return CDbAlloc::Create(options, pdbout, ppmalloc);
+}
+
+HRESULT
+CDbAlloc::Create(
+ ULONG options,
+ IDbOutput FAR* pdbout,
+ IMalloc FAR* FAR* ppmalloc)
+{
+ HRESULT hresult;
+ CDbAlloc FAR* pmalloc;
+
+
+ // default the instance of IDbOutput if the user didn't supply one
+ if(pdbout == NULL && ((pdbout = CStdDbOutput::Create()) == NULL)){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ pdbout->AddRef();
+
+ if((pmalloc = new FAR CDbAlloc()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ pmalloc->m_pdbout = pdbout;
+
+ *ppmalloc = pmalloc;
+
+ return NOERROR;
+
+LError1:;
+ pdbout->Release();
+ pmalloc->Release();
+
+LError0:;
+ return hresult;
+}
+
+STDMETHODIMP
+CDbAlloc::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+#if OE_MAC
+ long a5Save = SetA5(*((long *)(long)CurrentA5));
+#endif // OE_MAC
+
+ if(riid == IID_IUnknown ){
+ *ppv = this;
+ AddRef();
+ hresult = NOERROR;
+ }
+ else
+ hresult = ResultFromScode(E_NOINTERFACE);
+
+#if OE_MAC
+ SetA5(a5Save);
+#endif // OE_MAC
+
+ return hresult;
+}
+
+STDMETHODIMP_(ULONG)
+CDbAlloc::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(ULONG)
+CDbAlloc::Release()
+{
+// FILE *pfileLog; // UNDONE stevenl -- not used right now
+
+ if(--m_refs == 0){
+
+#if OE_MAC
+ long a5Save = SetA5(*((long *)(long)CurrentA5));
+#endif // OE_MAC
+
+ // check for memory leakage
+ if(!IsEmpty()){
+ m_pdbout->Printf("Memory Leak Detected,\n");
+ DumpInstTable();
+ ASSERTSZ(FALSE, "Memory leaked");
+ }
+ else {
+ // No memory has leaked. If we're running a test script,
+ // we want the line "No Memory Leaks." at the end of the
+ // script, so that there will be a baseline failure if
+ // memory has leaked. The global g_szLogFile has the name
+ // of the file, if there is one.
+ //
+#if 0
+ if (strlen(g_szLogFile)) {
+#if 0
+// UNDONE 20-May-93 stevenl:
+// This is #ifdef'ed out until we feel like
+// messing with all the baselines again.
+//
+ pfileLog = fopen(g_szLogFile,"at");
+ if (pfileLog) {
+ fprintf(pfileLog, "No Memory Leaks.");
+ fclose(pfileLog);
+ }
+#endif
+ } // if
+#endif //0
+ } // else
+
+ m_pdbout->Release();
+ delete this;
+
+#if OE_MAC
+ SetA5(a5Save);
+#endif // OE_MAC
+
+ return 0;
+ }
+
+ return m_refs;
+}
+
+STDMETHODIMP_(void FAR*)
+CDbAlloc::Alloc(ULONG cb)
+{
+ ULONG size;
+ VOID FAR* pv;
+
+#if OE_MAC
+ long a5Save = SetA5(*((long *)(long)CurrentA5));
+#endif // OE_MAC
+
+#if 0
+ // If allocations have been disabled (probably because we're in
+ // the middle of a save), just return NULL.
+ if (g_fNoAllocs)
+ return NULL;
+#endif //0
+
+ IMallocHeapChecker();
+
+ // ++m_cAllocCalls;
+ MemInstance();
+
+ size = (ULONG)cb;
+
+ // Support for Huge Arrays
+ if ((cb + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+
+ if((pv = MALLOC((size_t)(size + 2*sizeof(m_rgchSig)))) == NULL)
+ goto Error;
+ }
+ else {
+ if ((pv = (VOID FAR *)HugeAlloc(size + 2*sizeof(m_rgchSig))) == NULL)
+ goto Error;
+
+ }
+
+ // set allocated block to some non-zero value
+ MEMSET(pv, -1, (size_t)(size + 2*sizeof(m_rgchSig)));
+
+#if ADJUST_ARRAYS
+ if ((cb + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // put signature at end of allocated block
+ MEMCPY((char FAR*)pv + size + sizeof(m_rgchSig), m_rgchSig, (size_t)sizeof(m_rgchSig));
+ }
+
+ // put signature at the head of the allocated block
+ MEMCPY((char FAR*)pv , m_rgchSig, sizeof(m_rgchSig));
+ pv = (char FAR*)pv + sizeof(m_rgchSig);
+
+#else
+ // We do not put the signature for huge memory allocation
+ if ((cb + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // put signature at end of allocated block
+ MEMCPY((char FAR*)pv + size + sizeof(m_rgchSig), m_rgchSig, (size_t)sizeof(m_rgchSig));
+
+ // put signature at the head of the allocated block
+ MEMCPY((char FAR*)pv , m_rgchSig, sizeof(m_rgchSig));
+
+ }
+
+ // For Huge allocation return the pointer to the beginnig of the seg.
+ if ((cb + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // return the pointer to the beginning of the block to be returned
+ pv = (char FAR*)pv + sizeof(m_rgchSig);
+ }
+#endif
+
+ // save the address returned and it's size also.
+ AddInst(pv, m_cAllocCalls, size);
+
+ // FALL THROUGH!!!
+
+Error:
+
+#if OE_MAC
+ SetA5(a5Save);
+#endif // OE_MAC
+
+ return pv;
+}
+
+
+
+STDMETHODIMP_(void FAR*)
+CDbAlloc::Realloc(void FAR* pv, ULONG cb)
+{
+ ULONG size;
+ ULONG sizeToFree;
+ CAddrNode FAR* pn;
+
+ if(pv == NULL){
+ return Alloc(cb);
+ }
+
+#if OE_MAC
+ long a5Save = SetA5(*((long *)(long)CurrentA5));
+#endif // OE_MAC
+
+ // ++m_cAllocCalls;
+ MemInstance();
+
+ pn = GetInst(pv);
+
+ sizeToFree = pn->m_cb;
+ ASSERT(pn != NULL);
+
+ if(cb == 0){
+ Free(pv);
+ pv = NULL;
+ goto Done;
+ }
+
+#if 0
+ // If allocations have been disabled (probably because we're in
+ // the middle of a save) and we're trying to increase the size of
+ // the allocated block, just return NULL. We allow decreases, since
+ // that can't cause an out of memory error in a real allocator.
+ if (cb > sizeToFree && g_fNoAllocs)
+ return NULL;
+#endif //0
+
+ size = cb;
+
+ // UNDONE : This does not handle the case when we mix the huge alloc and
+ // and realloc.
+ if (((sizeToFree + 2*sizeof(m_rgchSig)) < MAX_SIZE) &&
+ ((size + 2*sizeof(m_rgchSig)) < MAX_SIZE)) {
+
+ // we delete the instance from the table using the address passed in.
+ DelInst(pv);
+
+ // get the address of the original memory allocated
+ pv = (char FAR*)pv - sizeof(m_rgchSig);
+
+ // allocte enough memory to put the signature also.
+ if ((pv = REALLOC(pv, (size_t)(size + 2*sizeof(m_rgchSig)))) == NULL)
+ goto Done;
+ }
+ else {
+ if (((sizeToFree + 2*sizeof(m_rgchSig)) >= MAX_SIZE) &&
+ ((size + 2*sizeof(m_rgchSig)) >= MAX_SIZE)) {
+
+ // we delete the instance from the table using the address passed in.
+ DelInst(pv);
+
+#if ADJUST_ARRAYS
+ // get the address of the original memory allocated
+ pv = (char FAR*)pv - sizeof(m_rgchSig);
+#endif
+ // allocte enough memory to put the signature also.
+ if ((pv = HugeRealloc(pv, size + 2*sizeof(m_rgchSig))) == NULL)
+ goto Done;
+ }
+ else {
+ VOID FAR *pvNew;
+ ULONG cbCopy;
+
+
+ if ((pvNew = Alloc(size)) == NULL) {
+ // if the memory to be free is < MAX_SIZE then adjust the pointer
+ if ((sizeToFree + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // get the address of the original memory allocated
+ pv = (char FAR*)pv - sizeof(m_rgchSig);
+ }
+
+ Free(pv);
+ pv = NULL;
+ goto Done;
+ }
+
+ cbCopy = (sizeToFree < size) ? sizeToFree : size;
+
+ // copy the original contents
+ MEMCPY((char FAR*)pvNew , (char FAR*)pv, (size_t)cbCopy);
+
+#if ADJUST_ARRAYS
+ pv = (char FAR*)pv - sizeof(m_rgchSig);
+#else
+ // if the memory to be free is < MAX_SIZE then adjust the pointer
+ if ((sizeToFree + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // get the address of the original memory allocated
+ pv = (char FAR*)pv - sizeof(m_rgchSig);
+ }
+
+#endif
+
+ Free((char FAR*)pv + sizeof(m_rgchSig));
+ pv = pvNew;
+ goto Done;
+
+ }
+
+ }
+
+ // We do not put the signature at the tail for huge memory allocation
+ if ((size + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // put signature at end of allocated block
+ // NOTE:- the signature for the header is already there.
+ MEMCPY((char FAR*)pv + size + sizeof(m_rgchSig), m_rgchSig, sizeof(m_rgchSig));
+ }
+
+#if ADJUST_ARRAYS
+ pv = (char FAR*)pv + sizeof(m_rgchSig);
+#else
+ // For Huge allocation return the pointer to the beginnig of the seg.
+ if ((cb + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // return the pointer to the beginning of the block (to be used
+ // by the caller).
+ pv = (char FAR*)pv + sizeof(m_rgchSig);
+ }
+#endif
+
+ // save the address returned and it's size also.
+ AddInst(pv, m_cAllocCalls, size);
+
+Done:
+#if OE_MAC
+ SetA5(a5Save);
+#endif // OE_MAC
+ return pv;
+}
+
+STDMETHODIMP_(void)
+CDbAlloc::Free(void FAR* pv)
+{
+ CAddrNode FAR* pn;
+ ULONG sizeToFree;
+
+#if OE_MAC
+ long a5Save = SetA5(*((long *)(long)CurrentA5));
+#endif // OE_MAC
+
+ // STORAGE.DLL Calls Free(NULL) alot
+ if (pv == NULL)
+ goto Done;
+
+ pn = GetInst(pv);
+
+ // check for attempt to free an instance we didnt allocate
+ if(pn == NULL){
+ ASSERTSZ(FALSE, "pointer freed by wrong allocator");
+ goto Done;
+ }
+
+ // We do not put the signature at the tail for huge memory allocation
+ if ((pn->m_cb + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // verify the signature at the tail
+ if(MEMCMP((char FAR*)pv + pn->m_cb, m_rgchSig, sizeof(m_rgchSig)) != 0){
+ m_pdbout->Printf(szSigMsg); m_pdbout->Printf("\n");
+ DumpInst(GetInst(pv));
+ ASSERTSZ(FALSE, szSigMsg);
+ }
+
+#if ADJUST_ARRAYS
+ }
+
+ {
+#endif
+ // verify the signature at the head
+ if(MEMCMP((char FAR*)pv - sizeof(m_rgchSig), m_rgchSig, sizeof(m_rgchSig)) != 0){
+ m_pdbout->Printf(szSigMsg); m_pdbout->Printf("\n");
+ DumpInst(GetInst(pv));
+ ASSERTSZ(FALSE, szSigMsg);
+ }
+
+ }
+
+
+ sizeToFree = pn->m_cb;
+
+ DelInst(pv);
+
+#if ADJUST_ARRAYS
+ pv = (char FAR*)pv - sizeof(m_rgchSig);
+#else
+ if ((sizeToFree + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // get the address of the original memory allocated
+ pv = (char FAR*)pv - sizeof(m_rgchSig);
+ }
+#endif
+
+ // stomp on the contents of the block
+ MEMSET(pv, 0xCC, (size_t)(sizeToFree + 2*sizeof(m_rgchSig)));
+
+ if ((sizeToFree + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+
+ FREE(pv);
+ }
+ else {
+ HugeFree(pv);
+ }
+
+Done: ;
+#if OE_MAC
+ SetA5(a5Save);
+#endif // OE_MAC
+}
+
+STDMETHODIMP_(ULONG)
+CDbAlloc::GetSize(void FAR* pv)
+{
+ CAddrNode FAR* pn;
+ ASSERT((pn = GetInst(pv)) != NULL);
+
+ // dont count extra signature bytes in size
+ return pn->m_cb;
+}
+
+VOID CDbAlloc::MemInstance()
+{
+ ++m_cAllocCalls;
+
+}
+
+
+/***
+*PUBLIC HRESULT CDbAlloc::DidAlloc
+*Purpose:
+* Answer if the given address belongs to a block allocated by
+* this allocator.
+*
+*Entry:
+* pv = the instance to lookup
+*
+*Exit:
+* return value = int
+* 1 - did alloc
+* 0 - did *not* alloc
+* -1 - dont know (according to the ole2 spec it is always legal
+* for the allocator to answer "dont know")
+*
+***********************************************************************/
+STDMETHODIMP_(int)
+CDbAlloc::DidAlloc(void FAR* pv)
+{
+ return -1; // answer "I dont know"
+}
+
+
+STDMETHODIMP_(void)
+CDbAlloc::HeapMinimize()
+{
+#if !OE_WIN32 //UNDONE: what does HeapMinimize mean for WIN32?
+#if OE_MAC
+ long a5Save = SetA5(*((long *)(long)CurrentA5));
+#endif // OE_MAC
+ HEAPMIN();
+#if OE_MAC
+ SetA5(a5Save);
+#endif // OE_MAC
+#endif
+}
+
+
+//---------------------------------------------------------------------
+// instance table methods
+//---------------------------------------------------------------------
+
+/***
+*PRIVATE CDbAlloc::AddInst
+*Purpose:
+* Add the given instance to the address instance table.
+*
+*Entry:
+* pv = the instance to add
+* nAlloc = the allocation passcount of this instance
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CDbAlloc::AddInst(void FAR* pv, ULONG nAlloc, ULONG cb)
+{
+ UINT hash;
+ CAddrNode FAR* pn;
+
+
+ ASSERT(pv != NULL);
+
+ pn = (CAddrNode FAR*)new FAR CAddrNode();
+
+ ASSERT(pn != NULL);
+
+ pn->m_pv = pv;
+ pn->m_cb = cb;
+ pn->m_nAlloc = nAlloc;
+
+ hash = HashInst(pv);
+ pn->m_next = m_rganode[hash];
+ m_rganode[hash] = pn;
+}
+
+
+/***
+*UNDONE
+*Purpose:
+* Remove the given instance from the address instance table.
+*
+*Entry:
+* pv = the instance to remove
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CDbAlloc::DelInst(void FAR* pv)
+{
+ CAddrNode FAR* FAR* ppn, FAR* pnDead;
+
+ for(ppn = &m_rganode[HashInst(pv)]; *ppn != NULL; ppn = &(*ppn)->m_next){
+ if((*ppn)->m_pv == pv){
+ pnDead = *ppn;
+ *ppn = (*ppn)->m_next;
+ delete pnDead;
+ // make sure it doesnt somehow appear twice
+ ASSERT(GetInst(pv) == NULL);
+ return;
+ }
+ }
+
+ // didnt find the instance
+ ASSERT(UNREACHED);
+}
+
+
+CAddrNode FAR*
+CDbAlloc::GetInst(void FAR* pv)
+{
+ CAddrNode FAR* pn;
+
+ for(pn = m_rganode[HashInst(pv)]; pn != NULL; pn = pn->m_next){
+ if(pn->m_pv == pv)
+ return pn;
+ }
+ return NULL;
+}
+
+
+void
+CDbAlloc::DumpInst(CAddrNode FAR* pn)
+{
+ m_pdbout->Printf("[%lp] nAlloc=%ld size=%ld\n",
+ pn->m_pv, pn->m_nAlloc, GetSize(pn->m_pv));
+}
+
+
+/***
+*PRIVATE BOOL IsEmpty
+*Purpose:
+* Answer if the address instance table is empty.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = BOOL, TRUE if empty, FALSE otherwise
+*
+***********************************************************************/
+BOOL
+CDbAlloc::IsEmpty()
+{
+ UINT u;
+
+ for(u = 0; u < DIM(m_rganode); ++u){
+ if(m_rganode[u] != NULL) {
+#if OE_MAC
+ // UNDONE: (dougf) temporary code to work around bug in OleInitialize.
+ // UNDONE: OleInitialize in the OLE2 Beta 1 build allocs 42 bytes of
+ // UNDONE: memory in it's first alloc, and never frees it. It
+ // UNDONE: also randomly fails to dealloc 39 bytes in WriteClassStg.
+ // UNDONE: Rip this code when we upgrade to a newer Mac OLE that has
+ // UNDONE: these bugs fixed.
+ CAddrNode FAR* pn;
+ ULONG cb;
+
+ pn = m_rganode[u];
+ cb = GetSize(pn->m_pv);
+
+ if (pn->m_nAlloc == 1 && cb == 42)
+ continue; // ignore OleInitialize's memory leak
+ if (cb == 39)
+ continue; // ignore the random OLE memory leak in WriteClassStg
+ // (happens when running cl\tbmacole.scr)
+#endif //OE_MAC
+
+#if OE_WIN32 && 0
+ // UNDONE: (dougf) temporary code to work around bug in OleInitialize.
+ // UNDONE: OleInitialize allocs 320 bytes of memory in it's first
+ // UNDONE: alloc, and 60 bytes in it's 3rd alloc, and never frees them.
+ // UNDONE: OleUnitialize allocs 68 & 172 bytes and never frees them.
+ // UNDONE: Rip this code when we upgrade
+ // UNDONE: to a newer NT OLE that has these bugs fixed.
+ CAddrNode FAR* pn;
+ ULONG cb;
+
+ pn = m_rganode[u];
+ cb = GetSize(pn->m_pv);
+
+ if (pn->m_nAlloc == 1 && cb == 320)
+ continue; // ignore OleInitialize's first memory leak
+ if (pn->m_nAlloc == 3 && cb == 60)
+ continue; // ignore OleInitialize's second memory leak
+ if (cb == 68)
+ continue; // ignore OleUninitialize's first memory leak
+ if (cb == 172)
+ continue; // ignore OleUninitialize's second memory leak
+#endif //OE_WIN32
+
+#if !FV_UNICODE_OLE // UNDONE: temporary (ignore the dstrmgr leaks)
+ return FALSE; // some other leak
+#endif //!FV_UNICODE_OLE
+ }
+ }
+
+ return TRUE;
+}
+
+
+/***
+*PRIVATE CDbAlloc::Dump
+*Purpose:
+* Print the current contents of the address instance table,
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CDbAlloc::DumpInstTable()
+{
+ UINT u;
+ CAddrNode FAR* pn;
+
+ for(u = 0; u < DIM(m_rganode); ++u){
+ for(pn = m_rganode[u]; pn != NULL; pn = pn->m_next){
+ DumpInst(pn);
+ }
+ }
+}
+
+
+/***********
+* GetDebIMalloc()
+*
+* Purpose : Walks the Heap and verifies that the heap is not corrupted
+*
+**************************************************************************/
+VOID CDbAlloc::IMallocHeapChecker()
+{
+
+ UINT u;
+ CAddrNode FAR* pn;
+
+ return;
+
+ for(u = 0; u < DIM(m_rganode); ++u){
+
+ for(pn = m_rganode[u]; pn != NULL; pn = pn->m_next){
+ // Verify that the signature are the foot and the head of this
+ // instance is correct.
+
+ // We do not put the signature at the tail for huge memory allocation
+ if ((pn->m_cb + 2*sizeof(m_rgchSig)) < MAX_SIZE) {
+ // verify the signature at the tail
+ if (MEMCMP((char FAR*)pn->m_pv + pn->m_cb, m_rgchSig, sizeof(m_rgchSig)) != 0){
+ m_pdbout->Printf(szSigMsg); m_pdbout->Printf("\n");
+ DumpInst(GetInst(pn->m_pv));
+ ASSERTSZ(FALSE, szSigMsg);
+ }
+
+ // verify the signature at the head
+ if (MEMCMP((char FAR*)pn->m_pv - sizeof(m_rgchSig), m_rgchSig, sizeof(m_rgchSig)) != 0){
+ m_pdbout->Printf(szSigMsg); m_pdbout->Printf("\n");
+ DumpInst(GetInst(pn->m_pv));
+ ASSERTSZ(FALSE, szSigMsg);
+ }
+ }
+
+ } // for loop
+ } // for loop
+}
+
+//---------------------------------------------------------------------
+// implementation of CStdDbOutput
+//---------------------------------------------------------------------
+
+IDbOutput FAR*
+CStdDbOutput::Create()
+{
+ return (IDbOutput FAR*)new FAR CStdDbOutput();
+}
+
+STDMETHODIMP
+CStdDbOutput::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(riid == IID_IUnknown){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(ULONG)
+CStdDbOutput::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(ULONG)
+CStdDbOutput::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP_(void)
+CStdDbOutput::Printf(char FAR* szFmt, ...)
+{
+ va_list args;
+ char *pn, FAR* pf;
+ char rgchFmtBuf[128];
+ char rgchOutputBuf[128];
+
+ // copy the 'far' format string to a near buffer so we can use
+ // a medium model vsprintf, which only supports near data pointers.
+ //
+ pn = rgchFmtBuf, pf=szFmt;
+ while(*pf != '\0')
+ *pn++ = *pf++;
+ *pn = '\0';
+
+ va_start(args, szFmt);
+
+ vsprintf(rgchOutputBuf, rgchFmtBuf, args);
+
+
+#if !OE_MAC
+ OutputDebugString(rgchOutputBuf);
+#else
+ strcat(rgchOutputBuf, ";g");
+ DebugStr((const unsigned char *) c2pstr(rgchOutputBuf));
+#endif
+
+}
+
+STDMETHODIMP_(void)
+CStdDbOutput::Assertion(
+ BOOL cond,
+ char FAR* szExpr,
+ char FAR* szFile,
+ UINT uLine,
+ char FAR* szMsg)
+{
+ if(cond)
+ return;
+
+ // following is from compobj.dll (ole2)
+ // FnAssert(szExpr, szMsg, szFile, uLine);
+ DebAssert(0, szMsg);
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***********
+* GetDebIMalloc()
+*
+* Purpose : Creates a debug version of IMalloc
+*
+**************************************************************************/
+BOOL GetDebIMalloc(IMalloc FAR* FAR* ppmalloc)
+{
+ // For Debug version we want to provide our own implementation of
+ // IMalloc. But for release version we use the default.
+ HRESULT hresult;
+ IMalloc FAR* pmalloc;
+
+ pmalloc = NULL;
+ hresult = CreateDbAlloc(DBALLOC_NONE, NULL, &pmalloc);
+
+ if (hresult != NOERROR)
+ return FALSE;
+
+ *ppmalloc = pmalloc;
+
+ return TRUE;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/***
+* HugeAlloc
+*
+* Purpose:
+* Allocate a system memblock of given size and return its handle.
+* Note: on Win16 dereferences handle and produce 32-bit
+* address = selector:offset=0.
+*
+* Inputs:
+* bch Allocation request. Can be >64K.
+*
+* Outputs:
+* Returns an HSYS. NULL if unsuccessful.
+*
+*****************************************************************************/
+
+VOID FAR * HugeAlloc(DWORD bch)
+{
+#if OE_WIN16
+
+ VOID FAR *pv;
+ HANDLE hMem;
+
+ if (((hMem = GlobalAlloc(GMEM_MOVEABLE, bch)) == NULL)) {
+ return NULL;
+ }
+ else if ((pv = (VOID FAR *) GlobalLock(hMem)) == NULL) {
+ return NULL;
+ }
+ else {
+ return (VOID FAR *)pv;
+ }
+
+#elif OE_MACNATIVE
+
+ Handle hMemBlock;
+ THz pCurrZone;
+ OSErr oserr;
+
+ //--------------------------------------------------------
+ // The following is a work-around to our bogus code that
+ // caches pointers to moveable memory. The basic idea
+ // is that we allocate all such memory out of a sub-heap
+ // inside the host application (or inside our own heap when
+ // a .DLL). The zone is switched in briefly to allocate,
+ // then switched back to avoid the OS or CODE seg loads
+ // from allocating there-in.
+ //
+ // The practice of caching pointers to moveable memory on
+ // the mac should be fixed to gain optimal use of available
+ // memory. The sub-heap scheme pools available memory
+ // and keeps it from being used for loading code when data
+ // is small. Visa-versa, we cannot flush more code out
+ // when the data expands to the heap limit. (jwc)
+ //--------------------------------------------------------
+
+ DebAssert(g_pOBZone != NULL, "OB Zone used before being allocated.");
+ pCurrZone = GetZone(); // save current heap zone.
+ SetZone(g_pOBZone); // set to OB's zone.
+
+ // Allocate moveable mac memblock.
+ hMemBlock = NewHandle(bch);
+ // get the error before calling SetZone. 'Cos SetZone can
+ // change the memory error.
+ oserr = MemError();
+
+ SetZone(pCurrZone); // always restore zone.
+
+ if (oserr) {
+ return NULL;
+ }
+ else {
+ return (HSYS)hMemBlock;
+ }
+
+#elif OE_MAC
+
+ Handle hMemBlock;
+ OSErr oserr;
+
+ // Allocate moveable mac memblock.
+ hMemBlock = NewHandle(bch);
+ oserr = MemError();
+ if (oserr) {
+ return NULL;
+ }
+ else {
+ return (VOID FAR*)hMemBlock;
+ }
+
+#elif OE_WIN32
+
+ VOID FAR *pv = NULL;
+
+ return (VOID FAR *)VirtualAlloc(pv, bch, MEM_COMMIT, PAGE_READWRITE);
+
+#else
+#error Bad OE
+#endif
+}
+
+
+/***
+* HsysReallocHsys
+*
+* Purpose:
+* Reallocate a system memblock given handle to new size.
+* Shrinking won't move block.
+*
+* Inputs:
+* hsys Handle to sys memblock they want to realloc.
+* bchNew New size they want. Can be >64K.
+*
+* Outputs:
+* Returns an HSYS. NULL if unsuccessful.
+*
+*****************************************************************************/
+
+VOID FAR *HugeRealloc(VOID FAR *pv, DWORD bchNew)
+{
+#if OE_WIN16 // TEMPORARY
+#if OE_WIN16
+
+ HANDLE hMem, hMemNew;
+ VOID FAR *pvNew;
+ USHORT usSel;
+ DWORD dwMem;
+ DWORD dwNewSize = bchNew;
+#if ID_DEBUG
+ ULONG cbOld;
+#endif // ID_DEBUG
+
+
+ // Get selector
+ usSel = OOB_SELECTOROF((void FAR*)pv);
+
+ if ((dwMem = GlobalHandle((WORD)usSel)) == NULL) {
+ return NULL;
+ }
+ else {
+ // Extract the handle.
+ hMem = (HANDLE) LOWORD(dwMem);
+
+#if ID_DEBUG
+ // get the size of the old block
+ cbOld = GlobalSize(hMem);
+#endif // ID_DEBUG
+
+ if (((hMemNew =
+ GlobalReAlloc(hMem, bchNew, GMEM_MOVEABLE)) == NULL)) {
+ return NULL;
+ }
+ else if ((pvNew = GlobalLock(hMemNew)) == NULL) {
+ return NULL;
+ }
+ else {
+ return (VOID FAR *)pvNew;
+ }
+ }
+
+#elif OE_MACNATIVE
+
+ Handle hMemBlock;
+ THz pCurrZone;
+ OSErr oserr;
+#if ID_DEBUG
+ ULONG cbOld;
+#endif // ID_DEBUG
+
+ hMemBlock = (Handle)hsys;
+
+#if ID_DEBUG
+ // get the size of the old block
+ cbOld = GetHandleSize(hMemBlock);
+#endif // ID_DEBUG
+
+ pCurrZone = GetZone(); // save current zone
+ SetZone(HandleZone((Handle)hsys)); // must set proper zone or
+ SetHandleSize(hMemBlock, bchNew); // handle will likely
+ // jump to curr zone if it moves.
+ oserr = MemError();
+ SetZone(pCurrZone); // restore current zone.
+
+
+ if (oserr == memFullErr) {
+ // Out of memory
+ return NULL;
+ }
+
+ DebAssert ((MemError() != nilHandleErr),
+ "HsysReallocHsys: NIL master pointer ");
+
+ DebAssert ((MemError() != memWZErr),
+ "HsysReallocHsys: Attempt to operate on free Block");
+
+ // anything else would be an undocumented error
+ DebAssert (MemError() == noErr,
+ "HsysReallocHsys: undocumented Mac error");
+
+ return (VOID FAR *)hMemBlock;
+
+#elif OE_MAC
+
+ Handle hMemBlock;
+ OSErr oserr;
+#if ID_DEBUG
+ ULONG cbOld;
+#endif // ID_DEBUG
+
+ hMemBlock = (Handle)hsys;
+
+#if ID_DEBUG
+ // get the size of the old block
+ cbOld = GetHandleSize(hMemBlock);
+#endif // ID_DEBUG
+
+ SetHandleSize(hMemBlock, bchNew); // realloc
+ oserr = MemError();
+
+ if (oserr == memFullErr) {
+ // Out of memory
+ return NULL;
+ }
+
+ DebAssert ((MemError() != nilHandleErr),
+ "HsysReallocHsys: NIL master pointer ");
+
+ DebAssert ((MemError() != memWZErr),
+ "HsysReallocHsys: Attempt to operate on free Block");
+
+ // anything else would be an undocumented error
+ DebAssert (MemError() == noErr,
+ "HsysReallocHsys: undocumented Mac error");
+
+ return (HSYS)hMemBlock;
+
+#elif OE_WIN32
+ // UNDONE...
+ DebHalt("HsysReallocHsys: UNDONE for OE_WIN32");
+ return NULL;
+#else
+#error Bad OE
+#endif
+#endif // TEMPORARY
+ return NULL;
+}
+
+
+
+
+/***
+* FreeHsys
+*
+* Purpose:
+* Free the sys memblock given a handle.
+* Implementation:
+* On Win16, get selector part of hsys,
+* get its handle, unlock and finally free.
+* On Mac: Just use DisposHandle
+*
+* Inputs:
+* hsys Handle to memblock they want to free.
+*
+* Outputs:
+* Returns NULL if successful, otherwise on failure
+* returns the input param.
+*
+*****************************************************************************/
+
+VOID FAR *HugeFree(VOID FAR * pv)
+{
+#if OE_WIN16
+
+ HANDLE hMem;
+ DWORD dwMem;
+ USHORT usSel = OOB_SELECTOROF((VOID FAR *)pv);
+
+ dwMem = GlobalHandle((WORD)usSel);
+ if (dwMem == NULL) {
+ // error
+ return pv;
+ }
+ else {
+ hMem = (HANDLE) LOWORD(dwMem);
+ GlobalUnlock(hMem); // Can't fail cos nondiscardable.
+ if (GlobalFree(hMem) != NULL) {
+ // error
+ return pv;
+ }
+ else {
+ // ok
+ return NULL;
+ }
+ }
+
+#elif OE_MACNATIVE
+ THz pCurrZone;
+#if ID_DEBUG
+ OSErr oserr;
+#endif
+
+ pCurrZone = GetZone(); // save current zone
+ SetZone(HandleZone((Handle)hsys)); // must set to proper zone to correctly update free list.
+
+ DisposHandle((Handle)hsys);
+
+#if ID_DEBUG
+ oserr = MemError(); // SetZone() will destroy MemError() result.
+#endif
+
+ SetZone(pCurrZone); // restore zone.
+
+ DebAssert (oserr != memWZErr,
+ "FreeHsys: attempt to operate on already free block.");
+
+ DebAssert(oserr == noErr,
+ "FreeHsys: unexpected error.");
+
+ return NULL;
+
+#elif OE_MAC
+ HSYS hsys = (HSYS) pv;
+#if ID_DEBUG
+ OSErr oserr;
+#endif
+
+ DisposHandle((Handle)hsys);
+
+#if ID_DEBUG
+ oserr = MemError(); // SetZone() will destroy MemError() result.
+
+ DebAssert (oserr != memWZErr,
+ "FreeHsys: attempt to operate on already free block.");
+
+ DebAssert(oserr == noErr,
+ "FreeHsys: unexpected error.");
+#endif
+
+ return NULL;
+
+#elif OE_WIN32
+ // UNDONE...
+ DebAssert(FALSE, "FreeHsys: UNDONE for OE_WIN32");
+ return NULL;
+#else
+#error Bad OE
+#endif // OE_WIN16
+ return NULL;
+
+}
+
+#endif //DEBUG
diff --git a/private/oleauto/src/mktyplib/errors.h b/private/oleauto/src/mktyplib/errors.h
new file mode 100644
index 000000000..90deb6036
--- /dev/null
+++ b/private/oleauto/src/mktyplib/errors.h
@@ -0,0 +1,104 @@
+// error constants -- WARNING -- must be kept in order!
+// table in INTLSTR.H depends on this order!
+
+typedef enum {
+ ERR_NONE = 0,
+
+// lexer/parser errors with file/line #/column info
+ PERR_UNTERMINATED_COMMENT,
+ PERR_UNEXP_EOF,
+ PERR_READ_ERROR,
+ PERR_UNDEF_INTER,
+ PERR_UNKNOWN_TYPE,
+ PERR_DUP_DEF,
+ PERR_DUP_UUID,
+ PERR_DUP_ID,
+ PERR_INV_COMBO,
+ PERR_ID_REQ,
+ PERR_UUID_REQ,
+ PERR_IN_OUT_REQ,
+ PERR_DLLNAME_REQ,
+ PERR_ENTRY_REQ,
+ PERR_ODL_REQ,
+ PERR_IMPLIB_NOTFIRST,
+ PERR_VOID_INV,
+ PERR_NUMBER_OV,
+ PERR_INV_ATTR_COMBO,
+ PERR_INV_ATTR,
+ PERR_INV_NUMBER,
+ PERR_INV_STRING,
+ PERR_INV_UUID,
+ PERR_INV_IDENTIFIER,
+ PERR_INV_CONSTANT,
+ PERR_INV_ID,
+ PERR_INV_LCID_USE,
+ PERR_INV_RETVAL_USE,
+ PERR_INV_VARARG_USE,
+ PERR_UNSUPP_KEYWORD,
+ PERR_EXPECTED,
+ PERR_EXP_EOF,
+ PERR_EXP_IDENTIFIER,
+ PERR_EXP_KEYWORD,
+ PERR_EXP_ATTRIBUTE,
+ PERR_EXP_OPERATOR,
+ PERR_UNSUPPORTED_OP,
+ PERR_INV_EXPRESSION,
+ PERR_EXP_NUMBER,
+ PERR_EXP_STRING,
+ PERR_EXP_INTER,
+ PERR_TWO_DISPINTER,
+ PERR_INV_CALLCONV,
+ PERR_INV_ARRAY_DECL,
+ PERR_NO_IDISPATCH,
+ PERR_NO_IUNKNOWN,
+ PERR_TYPEDEF_ATTR,
+ PERR_INV_PROPPUT,
+ PERR_INV_PROPFUNC,
+ PERR_INV_LCID,
+ PERR_INV_SOURCE_ATTR,
+ PERR_INV_OUT_PARAM,
+ PERR_INV_DUAL_BASE,
+ PERR_INV_OA_BASE,
+ PERR_INV_OA_TYPE,
+ PERR_INV_OA_FUNC_TYPE,
+
+ PERR_INV_REFERENCE,
+ PWARN_INV_IDISPATCHTYPE,
+
+ OERR_NO_DEF,
+ #define TYPELIBERR(name,string) OERR_ ## name
+ #include "typelib.err" // TYPELIB.DLL error constants
+ #undef TYPELIBERR
+ OERR_TYPEINFO,
+
+// general type library generation errors (no file/line#/column# info)
+ ERR_OM,
+ ERR_CANT_OPEN_INPUTFILE,
+#if FV_CPP
+ ERR_CPP,
+#endif //FV_CPP
+ ERR_CANT_OPEN_HFILE,
+ ERR_WRITING_HFILE,
+
+ WARN_STRANGE_ALIGNMENT,
+
+ GENERAL_ERR_LAST, // the last general error/warning
+
+ PERR_FIRST = PERR_UNTERMINATED_COMMENT,
+ PWARN_FIRST = PWARN_INV_IDISPATCHTYPE,
+ OERR_FIRST = OERR_NO_DEF,
+ ERR_FIRST = ERR_OM,
+ WARN_FIRST = WARN_STRANGE_ALIGNMENT,
+} ERR;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern VOID FAR ParseError(ERR err);
+extern VOID FAR ParseErrorTokLast(ERR err);
+extern VOID FAR ItemError(CHAR * szFormat, LPSTR lpszItem, ERR err);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/src/mktyplib/fileinfo.h b/private/oleauto/src/mktyplib/fileinfo.h
new file mode 100644
index 000000000..b7e374269
--- /dev/null
+++ b/private/oleauto/src/mktyplib/fileinfo.h
@@ -0,0 +1,329 @@
+// *******************************************************
+// contexts
+// *******************************************************
+#define cLIB 0x0001
+#define cTYPE 0x0002
+#define cIMPLTYPE 0x0004
+#define cFUNC 0x0008
+#define cVAR 0x0010
+#define cPARAM 0x0020
+
+// *******************************************************
+// Attributes
+// *******************************************************
+
+// bit flags indicating presence of each attribute
+#define fUUID 0x00000001L
+#define fVERSION 0x00000002L
+#define fDLLNAME 0x00000004L
+#define fENTRY 0x00000008L
+#define fRESTRICTED 0x00000010L
+#define fHELPSTRING 0x00000020L
+#define fHELPCONTEXT 0x00000040L
+#define fHELPFILE 0x00000080L
+#define fLCID 0x00000100L
+#define fPROPGET 0x00000200L
+#define fPROPPUT 0x00000400L
+#define fPROPPUTREF 0x00000800L
+#define fOPTIONAL 0x00001000L
+#define fIN 0x00002000L
+#define fOUT 0x00004000L
+#define fPUBLIC 0x00008000L
+#define fSTRING 0x00010000L
+#define fID 0x00020000L
+#define fVARARG 0x00040000L
+#define fAPPOBJECT 0x00080000L
+#define fREADONLY 0x00100000L
+#define fODL 0x00200000L
+#define fDEFAULT 0x00400000L
+#define fSOURCE 0x00800000L
+#define fBINDABLE 0x01000000L
+#define fREQUESTEDIT 0x02000000L
+#define fDISPLAYBIND 0x04000000L
+#define fDEFAULTBIND 0x08000000L
+#define fLICENSED 0x10000000L
+#define fPREDECLID 0x20000000L
+#define fHIDDEN 0x40000000L
+#define fRETVAL 0x80000000L
+
+#define fPropBits (fPROPGET | fPROPPUT | fPROPPUTREF)
+
+// *******************************************************
+// More Attributes (to be used only with fAttr2)
+// *******************************************************
+
+#define f2PASCAL 0x00000001
+#define f2CDECL 0x00000002
+#define f2STDCALL 0x00000004
+#define f2CCDEFAULTED 0x00000008
+#define f2CONTROL 0x00000010
+#define f2DUAL 0x00000020
+#define f2NONEXTENSIBLE 0x00000040
+#define f2OLEAUTOMATION 0x00000080
+ #define f2OACompatBits (f2DUAL | f2OLEAUTOMATION) // shorthand
+#define f2GotConstVal 0x00000100 // const elem's value explictly given
+#define f2VALIDDUALBASE 0x00000200 // valid for use as base interface
+ // of a dual interface
+
+// the following bits are unused at present
+#define f2Unused07 0x00000400
+#define f2Unused08 0x00000800
+#define f2Unused09 0x00001000
+#define f2Unused10 0x00002000
+#define f2Unused11 0x00004000
+#define f2Unused12 0x00008000
+#define f2Unused13 0x00010000
+#define f2Unused14 0x00020000
+#define f2Unused15 0x00040000
+#define f2Unused16 0x00080000
+#define f2Unused17 0x00100000
+#define f2Unused18 0x00200000
+#define f2Unused19 0x00400000
+#define f2Unused20 0x00800000
+#define f2Unused21 0x01000000
+#define f2Unused22 0x02000000
+#define f2Unused23 0x04000000
+#define f2Unused24 0x08000000
+#define f2Unused25 0x10000000
+#define f2Unused26 0x20000000
+#define f2Unused27 0x40000000
+#define f2Unused28 0x80000000
+
+typedef struct {
+ DWORD fAttr; // bit flags
+ DWORD fAttr2; // more bit flags
+ WORD fContext; // the context of these attributes
+ WORD wFlags; // flags associated with this item
+ // the following attributes are allowed on most items
+ GUID FAR * lpUuid;
+ WORD wVerMajor;
+ WORD wVerMinor;
+ DWORD lHelpContext;
+ LPSTR lpszHelpString;
+ // the following attributes are mutually-exclusive
+ union {
+ DWORD lLcid; // only on Library
+ LPSTR lpszDllName; // only on Module
+ LPSTR lpszProcName; // only on Module function
+ };
+ // the following attributes are mutually-exclusive
+ union {
+ LPSTR lpszHelpFile; // only on Library
+ DWORD lId; // on lots of ids (but not Library)
+ };
+} ATTR;
+
+typedef ATTR FAR * LPATTR;
+
+
+// *******************************************************
+// TYPE structures
+// *******************************************************
+
+// kind of entries in the type table
+// WARNING: rgtkind in TYPOUT.CPP depends on this order
+typedef enum {
+ tTYPEDEF = 0,
+ tSTRUCT,
+ tENUM,
+ tUNION,
+ tMODULE,
+ tINTERFACE,
+ tDISPINTER,
+ tCOCLASS,
+ // the following don't have full-size entries for them
+ tINTRINSIC,
+ tREF,
+ // tIMPORTED also doesn't have full-size entries
+
+ // the following don't have ANY entries for them
+ tANY, // no specific type
+
+ tIMPORTED=0x1000, // imported type with qualification
+ tQUAL=0x2000, // imported type with qualification
+ tFORWARD = 0x4000 // bit set if this is a forward definition
+} TENTRYKIND;
+
+// Used to describe intrinsic types, type references, and typedef [struct/enum]
+typedef struct tagTYPE {
+ struct tagTYPE FAR * pNext; // pointer to next type item
+ // MUST BE FIRST
+ TENTRYKIND tentrykind; // kind of this type item
+ LPSTR szName; // name of this type item
+ TYPEDESC tdesc; // contains:
+ // vt = one of
+ // intrinsic type ID
+ // VT_PTR ==> * to another type
+ // VT_USERDEFINED ==> typedef struct
+ // typedef enum
+ // typedef union
+ // interface,
+ // dispinterface,
+ // coclass,
+ // modules
+ // VT_SAFEARRAY ==> array of another type
+ // indexreftypeinfo (only for VT_USERDEFINED)
+ // lptdesc (only for VT_PTR, VT_SAFEARRAY)
+ ITypeInfo FAR* lptinfo; // ITypeInfo for this guy
+ // (filled in during output pass)
+ union {
+ struct { // for tINTRINSIC, (VT_xxx)
+ BOOL fUnsigned; // non-zero if this type is an UNSIGNED type
+ } intr;
+ struct { // for tREF (VT_PTR, VT_SAFEARRAY, or VT_CARRAY)
+ // not a true type, just a reference to one
+ struct tagTYPE FAR * ptypeBase; // base type
+ SHORT cIndirect; // # of levels of indirection off base type
+ // (VT_PTR only)
+ } ref;
+ struct { // for tTYPEDEF (VT_USERDEFINED)
+ struct tagTYPE FAR * ptypeAlias; // type this is an alias for
+ } td;
+ struct { // for tINTERFACE/tDISPINTER/tCOCLASS
+ // (VT_USERDEFINED)
+ struct tagINTER FAR * interList; // list of base interface(s)
+ // NULL if none
+ } inter;
+ struct { // for tSTRUCT/tENUM/tUNION (VT_USERDEFINED)
+ LPSTR szTag; // optional tag name (NULL if not present)
+ struct tagELEM FAR * elemList; // list of struct/enum/union
+ // members
+ } structenum;
+ struct { // for tIMPORTED | tXXXX, (VT_USERDEFINED)
+ WORD wTypeFlags; // flags for this type
+ } import;
+ };
+} TYPE;
+typedef TYPE FAR * LPTYPE;
+
+
+// for element of struct, enum, union, function arg, property, etc.
+typedef struct tagELEM {
+ struct tagELEM FAR * pNext;
+ ATTR attr; // element attributes
+ LPSTR szElemName; // element name
+ LPTYPE elemType; // element type
+ VARIANT FAR * lpElemVal; // element value (for constants)
+} ELEM;
+typedef ELEM FAR * LPELEM;
+
+
+// For base interface of a interface/dispinterface, or implemented interface
+// of a coclass.
+typedef struct tagINTER {
+ struct tagELEM FAR * pNext;
+ LPTYPE ptypeInter; // interface type
+ DWORD fAttr; // interface attributes (only used for COCLASS)
+ DWORD fAttr2; // don't need the entire ATTR structure here,
+ // since only valid attrs are RESTRICTED,
+ // DEFAULT, and SOURCE, and they don't have
+ // any other info in them.
+} INTER;
+typedef INTER FAR * LPINTER;
+
+
+// *******************************************************
+// Function definition structures
+// *******************************************************
+
+typedef struct tagFUNC {
+ ELEM func; // function descr. (pNext, attr, name, type)
+ // MUST BE FIRST -- folks assume that can use
+ // a FUNC as an ELEM
+ SHORT cArgs; // # of args
+ SHORT cOptArgs; // # of optional args
+ LPELEM argList; // arg info
+} FUNC;
+typedef FUNC FAR * LPFUNC;
+
+
+// *******************************************************
+// Component structures
+// *******************************************************
+
+// module <modulename> { ... }
+typedef struct {
+ LPFUNC funcList; // list of functions
+ LPELEM constList; // list of constants
+} MODULE;
+
+// interface <interfacename> : <baseinterface> { ... }
+typedef struct {
+ LPFUNC funcList; // list of interface functions
+} INTERF;
+
+// dispinterface <interfacename> { ... }
+typedef struct {
+ LPELEM propList; // list of properties
+ LPFUNC methList; // list of methods
+} DISPINTER;
+
+#if FV_PROPSET
+// property_set <propsetname> : <base propsetname> { ... }
+typedef struct {
+ LPSTR szBaseName; // base property set name, NULL if none
+ LPELEM propList; // list of properties
+} PROPSET;
+#endif //FV_PROPSET
+
+typedef struct tagENTRY {
+ TYPE type; // type of this item
+ // (contains pNext, name, etc)
+ // MUST BE FIRST
+ ATTR attr; // attributes for this item
+ struct tagENTRY FAR * lpEntryForward; // pointer to forward declaration
+ // for this item, NULL if none.
+ ICreateTypeInfo FAR* lpdtinfo; // ICreateTypeInfo for this guy
+ // (filled in during output pass)
+ union { // extra info about the item
+ MODULE module;
+ INTERF inter;
+ DISPINTER dispinter;
+#if FV_PROPSET
+ PROPSET propset;
+#endif //FV_PROPSET
+ };
+} ENTRY;
+
+typedef ENTRY FAR * LPENTRY;
+
+
+// importlib (<filename>)
+typedef struct tagIMPORTLIB {
+ struct tagIMPORTLIB FAR * pNext; // link field
+ LPSTR lpszFileName; // filename specified by user
+ LPSTR lpszLibName; // library name of this type library
+ ITypeLib FAR* lptlib; // ITypeLib for this type library
+ ITypeComp FAR* lptcomp; // ITypeComp for this type library
+ LPTLIBATTR lptlibattr; // type library attributes
+} IMPORTLIB;
+typedef IMPORTLIB FAR * LPIMPORTLIB;
+
+
+typedef struct {
+ ATTR attr; // library attributes
+ LPSTR szLibName; // library name
+ LPENTRY pEntry; // circularly-linked list of library items
+ LPIMPORTLIB pImpLib; // circularly-linked list of imported libraries
+} TYPLIB;
+
+
+// #defines that simplify linked-list management. Assumes circularly-linked lists, and
+// that all lists have the pNext field at the same position (usually first).
+
+// Given pList, returns a pointer to the last element in the list.
+#define ListLast(pList) (pList)
+
+// Given pList, returns a pointer to the first element in the list.
+// Since circularly-linked, Next(Last) points to first element.
+#define ListFirst(pList) (((LPTYPE)pList)->pNext)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern VOID FAR ListInsert(LPVOID ppList, WORD cbElem);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/src/mktyplib/hout.c b/private/oleauto/src/mktyplib/hout.c
new file mode 100644
index 000000000..32b7594ab
--- /dev/null
+++ b/private/oleauto/src/mktyplib/hout.c
@@ -0,0 +1,1111 @@
+#include "mktyplib.h"
+
+// .H file output for MKTYPLIB
+
+#include <stdio.h>
+
+#ifndef WIN32
+#include <ole2.h> // required for dispatch.h
+#include "dispatch.h"
+#endif //WIN32
+
+#include "errors.h"
+#include "fileinfo.h"
+#include "intlstr.h" // for szHead* definitions
+
+// external data
+extern TYPLIB typlib;
+extern FILE *hHFile;
+extern SYSKIND SysKind;
+extern int iAlignMax;
+extern int iAlignDef;
+extern BOOL fSpecifiedInterCC;
+
+
+// external functions
+extern INT FAR FCmpCaseIns(LPSTR str1, LPSTR str2);
+
+
+// private data
+static CHAR *szHeadOlePrefix0 = "#undef INTERFACE\n"
+ "#define INTERFACE ";
+static CHAR *szHeadOlePrefix1 = "DECLARE_INTERFACE";
+static CHAR *szHeadOlePrefix2 = ")\n{\n";
+static CHAR *szHeadOlePrefix3 = "\n /* ";
+static CHAR *szHeadOlePrefix4 = " methods */\n";
+static CHAR *szHeadOlePrefix5 = " properties:\n";
+static CHAR *szHeadOlePrefix6 = " methods:\n";
+static CHAR *szHeadOlePrefix7 = "#ifndef NO_BASEINTERFACE_FUNCS\n";
+static CHAR *szHeadOleFuncPrefix1 = " "; // leading spaces
+static CHAR *szHeadOleFuncPrefix2 = "STDMETHOD";
+static CHAR *szHeadOleFuncPrefix3 = ", "; // after return type
+static CHAR *szHeadOleArgPrefix1 = ")(THIS";
+static CHAR *szHeadOleArgPrefix2 = "_ "; // only if args
+static CHAR *szHeadOleArgSuffix = ") PURE;\n";
+static CHAR *szHeadOleSuffix1 = " */\n";
+static CHAR *szHeadOleSuffix2 = "};\n";
+static CHAR *szHeadOleSuffix3 = " */\n";
+static CHAR *szHeadOleSuffix7 = "#endif\n";
+
+//Hack for profiling
+//#define PROFILE
+
+#ifdef PROFILE
+static unsigned long cFuncsTotal = 0;
+static unsigned long cArgsTotal = 0;
+static unsigned long cVarsTotal = 0;
+#endif //PROFILE
+
+// stuff dealing with non-default interface calling conventions
+static CHAR *szUndefCallType = "#undef STDMETHODCALLTYPE\n";
+static CHAR *szResetCallType =
+"#if defined(WIN32)\n"
+"#define STDMETHODCALLTYPE STDMETHODSTDCALL\n"
+"#else\n"
+"#define STDMETHODCALLTYPE STDMETHODCDECL\n"
+"#endif\n";
+
+static CHAR *szDefCallTypePrefix = "#define STDMETHODCALLTYPE STDMETHOD";
+
+static CHAR *rgszCallType[] = {
+ "CDECL",
+ "PASCAL",
+ "STDCALL"
+};
+
+typedef enum {
+ CALL_CDECL,
+ CALL_PASCAL,
+ CALL_STDCALL,
+ CALL_DEFAULT
+} CALLINGCONV;
+
+static CALLINGCONV ccInterCurrent = CALL_DEFAULT;
+
+// user-specified calling conventions for all platforms
+static CHAR * szCCHeader =
+"\n"
+"/* Macros for redefining the STDMETHOD calling convention\n"
+" * (STDMETHODCALLTYPE).\n"
+" */\n"
+"\n"
+"#if defined(_MAC)\n"
+"\n"
+"#if !defined(_MSC_VER)\n"
+"#define STDMETHODCDECL\n"
+"#define STDMETHODPASCAL\n"
+"#define STDMETHODSTDCALL\n"
+"#else\n"
+"#define STDMETHODCDECL FAR CDECL\n"
+"#define STDMETHODPASCAL FAR PASCAL\n"
+"#define STDMETHODSTDCALL FAR STDCALL\n"
+"#endif\n"
+"\n"
+"#elif defined(WIN32)\n"
+"\n"
+"#define STDMETHODCDECL EXPORT __cdecl\n"
+"#define STDMETHODPASCAL EXPORT __pascal\n"
+"#define STDMETHODSTDCALL EXPORT __stdcall\n"
+"\n"
+"#else /* WIN16 */\n"
+"\n"
+"#define STDMETHODCDECL __export FAR CDECL\n"
+"#define STDMETHODPASCAL __export FAR PASCAL\n"
+"#define STDMETHODSTDCALL __export FAR STDCALL\n"
+"\n"
+"#endif\n"
+"\n";
+
+
+// canned definition of IUnknown
+static CHAR * szHeadIUnknown =
+"\n"
+" /* IUnknown methods */\n"
+" STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;\n"
+" STDMETHOD_(ULONG, AddRef)(THIS) PURE;\n"
+" STDMETHOD_(ULONG, Release)(THIS) PURE;\n";
+
+// canned definition of IDispatch
+static CHAR * szHeadIDispatch =
+"\n"
+" /* IDispatch methods */\n"
+" STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE;\n"
+"\n"
+" STDMETHOD(GetTypeInfo)(\n"
+" THIS_\n"
+" UINT itinfo,\n"
+" LCID lcid,\n"
+" ITypeInfo FAR* FAR* pptinfo) PURE;\n"
+"\n"
+" STDMETHOD(GetIDsOfNames)(\n"
+" THIS_\n"
+" REFIID riid,\n"
+" OLECHAR FAR* FAR* rgszNames,\n"
+" UINT cNames,\n"
+" LCID lcid,\n"
+" DISPID FAR* rgdispid) PURE;\n"
+"\n"
+" STDMETHOD(Invoke)(\n"
+" THIS_\n"
+" DISPID dispidMember,\n"
+" REFIID riid,\n"
+" LCID lcid,\n"
+" WORD wFlags,\n"
+" DISPPARAMS FAR* pdispparams,\n"
+" VARIANT FAR* pvarResult,\n"
+" EXCEPINFO FAR* pexcepinfo,\n"
+" UINT FAR* puArgErr) PURE;\n";
+
+static CHAR *szHeadGuidPrefix = "\nDEFINE_GUID(";
+static CHAR *szHeadGuidLIBID = "LIBID_";
+static CHAR *szHeadGuidCLSID = "CLSID_";
+static CHAR *szHeadGuidIID = "IID_";
+static CHAR *szHeadGuidDIID = "DIID_";
+
+// prototypes
+VOID FAR OutputHFile (CHAR * szHFile);
+VOID NEAR HOutTypedef(LPTYPE pType);
+VOID NEAR HOutEnum(LPTYPE pType);
+VOID NEAR HOutStructUnion(LPTYPE pType);
+VOID NEAR HOutModule(LPENTRY pEntry);
+VOID NEAR HOutInterface(LPENTRY pEntry);
+VOID NEAR HOutCoclass(LPENTRY pEntry);
+VOID NEAR HOutBaseInter(LPENTRY pEntry, BOOL fRecurse);
+
+VOID NEAR HOutFuncs(LPFUNC pFuncList, TENTRYKIND tentryKind);
+VOID NEAR HOutElems(LPELEM pElemList, CHAR * szPrefix, CHAR * szSep, CHAR * szSepLast, BOOL fEnum);
+VOID NEAR HOutType(LPTYPE pType);
+VOID NEAR HOutShortNum(SHORT num, BOOL fHex);
+VOID NEAR HOutLongNum(LONG num, BOOL fHex);
+VOID NEAR HOutPropPrefix(LPFUNC pFunc);
+VOID NEAR HOutGuid(LPATTR pAttr, CHAR * szGuidPrefix, LPSTR lpszName);
+
+#ifdef PROFILE
+VOID NEAR XOutF(LPSTR lpszData);
+VOID NEAR XOut(CHAR * szData);
+#else //PROFILE
+#define XOutF HOutF
+#define XOut HOut
+#endif //PROFILE
+VOID NEAR HOutF(LPSTR lpszData);
+VOID NEAR HOut(CHAR * szData);
+VOID NEAR SetCallType(CALLINGCONV cc);
+
+
+VOID FAR OutputHFile
+(
+ CHAR * szHFile
+)
+{
+ LPENTRY pEntry;
+
+#ifdef WIN16
+ // convert szHFile in-place to OEM char set
+ AnsiToOem(szHFile, szHFile);
+
+ // don't bother converting back since this string is not used again
+#endif // WIN16
+
+ // open the file
+ hHFile = fopen(szHFile, "w"); // open output file
+ if (hHFile == NULL)
+ ParseError(ERR_CANT_OPEN_HFILE);
+
+ Assert (SYS_WIN16 == 0 && SYS_WIN32 == 1 && SYS_MAC == 2 && SysKind <= SYS_MAX);
+
+ HOut(szHeadFile); // output file header
+ HOutF(typlib.szLibName); // output type library name
+ HOut(" */\n\n#ifndef _"); // output: #ifndef _<libname>_H_
+ HOutF(typlib.szLibName); // #define _<libname>_H_
+ HOut("_H_\n#define _");
+ HOutF(typlib.szLibName);
+ HOut("_H_\n");
+
+ HOutGuid(&typlib.attr, szHeadGuidLIBID, typlib.szLibName);
+
+ if (fSpecifiedInterCC) {
+ HOut(szCCHeader);
+ }
+
+ if (typlib.pEntry)
+ {
+ pEntry = (LPENTRY)ListFirst(typlib.pEntry); // point to first entry
+
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ {
+
+ switch (pEntry->type.tentrykind & ~tFORWARD)
+ {
+ case tTYPEDEF:
+ HOutTypedef(&pEntry->type);
+ break;
+
+ case tENUM:
+ HOutEnum(&pEntry->type);
+ break;
+
+ case tSTRUCT:
+ case tUNION:
+ HOutStructUnion(&pEntry->type);
+ break;
+
+ case tMODULE:
+ HOutModule(pEntry);
+ break;
+
+ case tCOCLASS:
+ HOutCoclass(pEntry);
+ break;
+
+ case tINTERFACE:
+ case tDISPINTER:
+ HOutInterface(pEntry);
+ // fall through
+
+ case tINTRINSIC:
+ case tREF:
+ break; // nothing to output
+
+#ifdef DEBUG
+ default:
+ if (pEntry->type.tentrykind & tIMPORTED)
+ break; // noting to output for imported types
+ Assert(FALSE);
+#endif //DEBUG
+ }
+
+ // advance to next entry if not all done
+ if (pEntry == (LPENTRY)ListLast(typlib.pEntry))
+ break; // exit if all done
+ pEntry = (LPENTRY)pEntry->type.pNext;
+
+ } // WHILE
+ }
+
+ HOut("\n#endif\n");
+
+ fclose(hHFile); // done writing .H file
+ hHFile = NULL; // close done
+
+ // check for possible alignment problems
+ if (iAlignMax != iAlignDef)
+ ParseError(WARN_STRANGE_ALIGNMENT);
+
+#ifdef PROFILE
+ printf("\n\ntotal functions: %d\n", cFuncsTotal);
+ printf("total function args: %d\n", cArgsTotal);
+ printf("total variables: %d\n", cVarsTotal);
+ ParseError(ERR_OM); // bogus early quit
+#endif //PROFILE
+
+}
+
+
+VOID NEAR HOutTypedef
+(
+LPTYPE pType
+)
+{
+ XOut("\ntypedef ");
+
+ // output base type
+ HOutType(pType->td.ptypeAlias);
+ HOut(" ");
+
+ XOutF(pType->szName);
+
+ Assert(pType->td.ptypeAlias->tdesc.vt != VT_CARRAY);
+
+ XOut(";\n");
+
+}
+
+
+VOID NEAR HOutEnum
+(
+LPTYPE pType
+)
+{
+
+ XOut("\ntypedef enum ");
+
+ if (pType->structenum.szTag)
+ {
+ XOutF(pType->structenum.szTag);
+ if (pType->tentrykind & tFORWARD)
+ {
+ XOut(";\n");
+ return;
+ }
+ XOut(" ");
+ }
+
+ XOut("{\n");
+
+ HOutElems(pType->structenum.elemList, " ", ",\n", "\n", TRUE);
+
+ XOut("} ");
+ XOutF(pType->szName);
+ XOut(";\n");
+
+}
+
+VOID NEAR HOutStructUnion
+(
+LPTYPE pType
+)
+{
+
+ if ((pType->tentrykind & ~tFORWARD) == tSTRUCT)
+ XOut("\ntypedef struct ");
+ else
+ XOut("\ntypedef union ");
+
+ if (pType->structenum.szTag)
+ {
+ XOutF(pType->structenum.szTag);
+ if (pType->tentrykind & tFORWARD)
+ goto done;
+
+ XOut(" ");
+ }
+
+ XOut("{\n");
+
+ HOutElems(pType->structenum.elemList, " ", ";\n", ";\n", FALSE);
+
+ XOut("} ");
+ XOutF(pType->szName);
+
+done:
+ XOut(";\n");
+
+}
+
+VOID NEAR HOutModule
+(
+LPENTRY pEntry
+)
+{
+ XOut(szHeadModule);
+ XOutF(pEntry->type.szName);
+ XOut(szHeadOleSuffix3);
+ HOutFuncs(pEntry->module.funcList, pEntry->type.tentrykind);
+ if (pEntry->module.constList)
+ HOutElems(pEntry->module.constList, " const ", ";\n", ";\n", FALSE);
+
+}
+
+VOID NEAR HOutCoclass
+(
+LPENTRY pEntry
+)
+{
+ if ((pEntry->type.tentrykind & tFORWARD) == 0) {
+ HOutGuid(&pEntry->attr, szHeadGuidCLSID, pEntry->type.szName);
+ }
+
+ // UNDONE: I don't think this will work in C.
+
+ HOut("\n#ifdef __cplusplus\nclass ");
+ HOutF(pEntry->type.szName);
+ HOut(";\n#endif\n");
+
+}
+
+
+VOID NEAR HOutInterface
+(
+LPENTRY pEntry
+)
+{
+
+LPSTR lpszBaseName;
+TENTRYKIND tentrykind;
+LPINTER lpInterFirst; // first base interface, if any
+LPINTER lpInterLast; // second/last base interface, if any
+
+ tentrykind = pEntry->type.tentrykind;
+
+ if (tentrykind & tFORWARD)
+ {
+ // UNDONE: proper OLE format for forward declaration of interface?
+ // UNDONE: I don't think this will work in C. I think it wants:
+ // UNDONE: typedef interface <interfacename> <interfacename>;
+ HOut("\ninterface ");
+ HOutF(pEntry->type.szName);
+ HOut(";\n");
+ return;
+ }
+
+ HOutGuid(&pEntry->attr,
+ ((tentrykind == tDISPINTER) ? szHeadGuidDIID: szHeadGuidIID),
+ pEntry->type.szName);
+
+ lpszBaseName = NULL;
+ lpInterFirst = NULL;
+ if (pEntry->type.inter.interList)
+ {
+ lpInterFirst = (LPINTER)ListFirst(pEntry->type.inter.interList);
+ lpInterLast = (LPINTER)ListLast(pEntry->type.inter.interList);
+
+ // We assume there's only single inheritance at this point
+ // But in the case of a dispinterface, we could have the first
+ // base interface be IDispatch, and the 2nd base interface be
+ // the interface that we're capable of dispatching on. In any
+ // case, there can't be more than 2 interfaces in the list.
+ Assert((LPINTER)lpInterFirst->pNext == lpInterLast);
+
+ lpszBaseName = lpInterFirst->ptypeInter->szName;
+ Assert(lpszBaseName);
+ }
+
+ // first output the header comment
+ HOut((tentrykind == tDISPINTER) ? szHeadDispinter: szHeadInter);
+ HOutF(pEntry->type.szName);
+ HOut(szHeadOleSuffix3);
+
+ // then output the OLE header
+ HOut(szHeadOlePrefix0);
+ HOutF(pEntry->type.szName);
+ HOut("\n\n");
+
+ HOut(szHeadOlePrefix1);
+ if (lpszBaseName)
+ HOut("_");
+ HOut("(");
+ HOutF(pEntry->type.szName);
+ if (lpszBaseName) // if this inherits from somebody
+ { // then add ", <baseinterface>"
+ HOut(", ");
+ HOutF(lpszBaseName);
+ }
+ HOut(szHeadOlePrefix2);
+
+ if (tentrykind == tDISPINTER)
+ {
+ Assert (lpszBaseName);
+
+ HOut(szHeadOlePrefix7);
+ HOut(szHeadIUnknown);
+ HOut(szHeadIDispatch);
+ HOut(szHeadOleSuffix7);
+
+ if (lpInterFirst != lpInterLast)
+ { // specifies an interface that is dispatchable
+ HOut(szHeadDispatchable);
+ HOutF(lpInterLast->ptypeInter->szName);
+ HOut(szHeadOleSuffix3);
+ }
+
+ // first output the properties (commented out) in "struct" format
+ if (pEntry->dispinter.propList)
+ {
+ XOut(szHeadOlePrefix3);
+ XOutF(pEntry->type.szName);
+ XOut(szHeadOlePrefix5);
+ HOutElems(pEntry->dispinter.propList, " ", ";\n", ";\n", FALSE);
+ HOut(szHeadOleSuffix1);
+ }
+
+ // then output the methods (commented out) in "normal" format
+ if (pEntry->dispinter.methList)
+ {
+ XOut(szHeadOlePrefix3);
+ XOutF(pEntry->type.szName);
+ XOut(szHeadOlePrefix6);
+ HOutFuncs(pEntry->dispinter.methList, tDISPINTER);
+ HOut(szHeadOleSuffix1);
+ }
+ }
+ else
+ { // an interface
+
+ // output interface functions, and base interface functions (if any)
+ HOutBaseInter(pEntry, FALSE);
+
+ }
+
+ // lastly, output the close curly
+ HOut(szHeadOleSuffix2);
+
+}
+
+
+VOID NEAR HOutBaseInter(LPENTRY pEntry, BOOL fRecurse)
+{
+ LPINTER lpInterBase;
+
+ // hard-coded descriptions for the 2 most common
+ if (!FCmpCaseIns(pEntry->type.szName, "IUnknown"))
+ {
+ HOut(szHeadIUnknown);
+ }
+ else if (!FCmpCaseIns(pEntry->type.szName, "IDispatch"))
+ {
+ if (!fRecurse)
+ HOut(szHeadOlePrefix7);
+ HOut(szHeadIUnknown);
+ if (!fRecurse)
+ HOut(szHeadOleSuffix7);
+
+ HOut(szHeadIDispatch);
+ }
+ else if ((pEntry->type.tentrykind & ~tFORWARD) != tINTERFACE)
+ {
+ // can't deal with imported base interfaces
+ HOut(szHeadOlePrefix3);
+ HOutF(pEntry->type.szName);
+ HOut(szHeadOlePrefix4);
+ HOut(szHeadMethods);
+ }
+ else
+ {
+ if (pEntry->type.tentrykind & tFORWARD) {
+ // if this is a forward decl, follow pointer back to real
+ // interface (since base interfaces and functions aren't
+ // stored in the forward declare)
+ pEntry = pEntry->lpEntryForward;
+ }
+
+ lpInterBase = pEntry->type.inter.interList;
+ if (lpInterBase) // if this inherits from somebody,
+ { // then first describe the base interface
+ if (!fRecurse)
+ HOut(szHeadOlePrefix7);
+
+ // HACK -- assumes we can cast LPTYPE to LPENTRY, but
+ // this is always true given our above validation
+ HOutBaseInter((LPENTRY)(lpInterBase->ptypeInter), TRUE);
+
+ if (!fRecurse)
+ HOut(szHeadOleSuffix7);
+ }
+
+ // output the interface functions in OLE format
+ XOut(szHeadOlePrefix3);
+ XOutF(pEntry->type.szName);
+ XOut(szHeadOlePrefix4);
+ HOutFuncs(pEntry->inter.funcList, tINTERFACE);
+ }
+}
+
+//***********************************************************************
+
+VOID NEAR HOutFuncs
+(
+ LPFUNC pFuncList,
+ TENTRYKIND tentryKind
+)
+{
+
+ LPFUNC pFunc;
+
+ if (pFuncList == NULL) // nothing to output if no functions
+ return;
+
+ pFunc = (LPFUNC)ListFirst(pFuncList); // point to first entry
+
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ {
+
+#ifndef PROFILE
+ if (tentryKind == tINTERFACE)
+ {
+ if (fSpecifiedInterCC) {
+ // set up STDMETHODCALLTYPE based on the calling
+ // convention and SYSKIND
+
+ if (pFunc->func.attr.fAttr2 & f2CCDEFAULTED)
+ SetCallType(CALL_DEFAULT);
+ else if (pFunc->func.attr.fAttr2 & f2PASCAL)
+ SetCallType(CALL_PASCAL);
+ else if (pFunc->func.attr.fAttr2 & f2STDCALL)
+ SetCallType(CALL_STDCALL);
+ else
+ {
+ Assert(pFunc->func.attr.fAttr2 & f2CDECL)
+ SetCallType(CALL_CDECL);
+ }
+ }
+
+
+ HOut(szHeadOleFuncPrefix1); // leading spaces
+ HOut(szHeadOleFuncPrefix2);
+
+ if (pFunc->func.elemType->tdesc.vt == VT_HRESULT)
+ HOut("(");
+ else
+ {
+ HOut("_(");
+ // output function return type
+ HOutType(pFunc->func.elemType);
+ HOut(szHeadOleFuncPrefix3);
+ }
+
+ HOutPropPrefix(pFunc);
+ XOutF(pFunc->func.szElemName);
+
+ HOut(szHeadOleArgPrefix1);
+
+ if (pFunc->cArgs)
+ {
+ HOut(szHeadOleArgPrefix2);
+ // output list of variables, separating them by
+ // commas, with nothing after last item
+ HOutElems(pFunc->argList, "", ", ", "", FALSE);
+ }
+ XOut(szHeadOleArgSuffix);
+ }
+ else
+#endif //!PROFILE
+ {
+ HOut(szHeadOleFuncPrefix1); // leading spaces
+ if (tentryKind == tMODULE)
+ HOut ("extern ");
+
+ // output function return type
+ HOutType(pFunc->func.elemType);
+ HOut(" ");
+
+ // output calling convention
+ if (!(pFunc->func.attr.fAttr2 & f2CCDEFAULTED)) {
+ if (pFunc->func.attr.fAttr2 & f2PASCAL)
+ HOut("__pascal ");
+ else if (pFunc->func.attr.fAttr2 & f2CDECL)
+ HOut("__cdecl ");
+ else if (pFunc->func.attr.fAttr2 & f2STDCALL)
+ HOut("__stdcall ");
+#ifdef DEBUG
+ else Assert(FALSE);
+#endif //DEBUG
+ }
+
+ HOutPropPrefix(pFunc);
+ XOutF(pFunc->func.szElemName);
+
+ Assert(pFunc->func.elemType->tdesc.vt != VT_CARRAY);
+
+ XOut("(");
+
+#ifdef PROFILE
+ cArgsTotal += pFunc->cArgs;
+ cFuncsTotal++;
+#endif //PROFILE
+ if (pFunc->cArgs == 0)
+ {
+ HOut("void");
+ }
+ else
+ {
+ // output list of variables, separating them by
+ // commas, with nothing after last item
+ HOutElems(pFunc->argList, "", ", ", "", FALSE);
+#ifdef PROFILE
+ cVarsTotal-= pFunc->cArgs; // would be counted twice
+#endif //PROFILE
+ }
+ XOut(");\n");
+ }
+
+ // advance to next entry if not all done
+ if (pFunc == (LPFUNC)ListLast(pFuncList))
+ break; // exit if all done
+ pFunc = (LPFUNC)pFunc->func.pNext;
+ }
+
+ if (fSpecifiedInterCC) {
+ SetCallType(CALL_DEFAULT); // reset to default STDMETHODCALLTYPE
+ }
+}
+
+
+VOID NEAR SetCallType
+(
+ CALLINGCONV cc
+)
+{
+ Assert (fSpecifiedInterCC); // caller should have checked
+ if (cc != ccInterCurrent)
+ { // if current different than last
+ HOut(szUndefCallType); // undefine current STDMETHODCALLTYPE
+ if (cc == CALL_DEFAULT) {
+ HOut(szResetCallType); // reset to default
+ } else {
+ HOut(szDefCallTypePrefix); // re-define to new value
+ HOut(rgszCallType[cc]);
+ HOut("\n");
+ }
+
+ ccInterCurrent = cc; // update current value
+ }
+}
+
+
+VOID NEAR HOutPropPrefix
+(
+ LPFUNC pFunc
+)
+{
+ // add a prefix to the function name if this is a property function
+ if (pFunc->func.attr.fAttr & fPROPGET)
+ HOut("get_");
+ else if (pFunc->func.attr.fAttr & fPROPPUT)
+ HOut("put_");
+ else if (pFunc->func.attr.fAttr & fPROPPUTREF)
+ HOut("putref_");
+}
+
+
+VOID NEAR HOutShortNum
+(
+ SHORT num,
+ BOOL fHex
+)
+{
+ CHAR szBuffer[30]; // space to list a number
+
+ sprintf(szBuffer,
+ fHex ? "0x%hX" : "%hd",
+ num);
+ HOut(szBuffer);
+}
+
+
+VOID NEAR HOutLongNum
+(
+ LONG num,
+ BOOL fHex
+)
+{
+ CHAR szBuffer[30]; // space to list a number
+
+ // Stupid C will choke if this number is printed in decimal
+ if (num == 0x80000000)
+ fHex = TRUE;
+
+ sprintf(szBuffer,
+ fHex ? "0x%lX" : "%ld",
+ num);
+ HOut(szBuffer);
+}
+
+VOID NEAR HOutElems
+(
+ LPELEM pElemList,
+ CHAR * szPrefix,
+ CHAR * szSep,
+ CHAR * szSepLast,
+ BOOL fEnum
+)
+{
+
+ LPELEM pElem;
+ WORD cDims;
+ ARRAYDESC FAR* lpAD;
+ BOOL fHex;
+ LPOLESTR lpch;
+ CHAR * pch;
+ CHAR buf[2];
+ UINT cch;
+
+ pElem = (LPELEM)ListFirst(pElemList); // point to first entry
+
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ {
+ HOut(szPrefix);
+ if (!fEnum)
+ {
+ // output elem type, with the right number of "*'s"
+ HOutType(pElem->elemType);
+ HOut(" ");
+ }
+
+ XOutF(pElem->szElemName);
+#ifdef PROFILE
+ cVarsTotal++;
+#endif //PROFILE
+
+ if (!fEnum && pElem->elemType->tdesc.vt == VT_CARRAY)
+ { // base type already outputted before name above
+ lpAD = pElem->elemType->tdesc.lpadesc;
+ for (cDims = 0; cDims < lpAD->cDims; cDims++)
+ {
+ HOut("[");
+#if 0 // arrays of the form "a[]" aren't supported
+ if (lpAD->rgbounds[cDims].cElements)
+#endif //0
+ HOutLongNum((long)lpAD->rgbounds[cDims].cElements, FALSE);
+ HOut("]");
+ }
+
+ }
+
+ if (pElem->attr.fAttr2 & f2GotConstVal)
+ {
+ HOut(" = ");
+
+ fHex = FALSE;
+ if (!fEnum) {
+ // display all the unsigned constants in Hex form
+ switch (pElem->elemType->tdesc.vt) {
+ case VT_UI1:
+ case VT_UI2:
+ case VT_UI4:
+ case VT_UINT:
+ case VT_ERROR:
+ fHex = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ // output the constant element's value
+ switch (pElem->lpElemVal->vt)
+ {
+ case VT_I2:
+ case VT_BOOL:
+ HOutShortNum(pElem->lpElemVal->iVal, fHex);
+ break;
+ case VT_I4:
+ case VT_ERROR:
+ HOutLongNum(pElem->lpElemVal->lVal, fHex);
+ break;
+ case VT_BSTR:
+ HOut("\"");
+ // output 1 char at a time, in order to handle
+ // escape sequences in strings
+ lpch = pElem->lpElemVal->bstrVal;
+ cch = SysStringLen(lpch);
+ while (cch) {
+ switch(*lpch) {
+ case 0x0:
+ pch = "\\0";
+ break;
+ case 0x7:
+ pch = "\\a";
+ break;
+ case 0x8:
+ pch = "\\b";
+ break;
+ case 0x9:
+ pch = "\\t";
+ break;
+ case 0xA:
+ if (SysKind == SYS_MAC)
+ pch = "\\r";
+ else
+ pch = "\\n";
+ break;
+ case 0xB:
+ pch = "\\v";
+ break;
+ case 0xC:
+ pch = "\\f";
+ break;
+ case 0xD:
+ if (SysKind == SYS_MAC)
+ pch = "\\n";
+ else
+ pch = "\\r";
+ break;
+ default:
+#ifdef WIN32
+ SideAssert (WideCharToMultiByte(CP_ACP,
+ 0,
+ lpch,
+ 1,
+ buf,
+ 1,
+ NULL,
+ NULL) != 0);
+#else //WIN32
+ buf[0] = *lpch;
+#endif //WIN32
+ buf[1] = '\0';
+ pch = buf;
+ break;
+ }
+ HOut(pch); // output the char
+ lpch++;
+ cch--;
+ }
+ HOut("\"");
+ break;
+ // CONSIDER: support more constant types.
+ default:
+ Assert(FALSE);
+ }
+
+ }
+
+ // advance to next entry if not all done
+ if (pElem == (LPELEM)ListLast(pElemList))
+ {
+ XOut(szSepLast);
+ break; // exit if all done
+ }
+ XOut(szSep);
+ pElem = pElem->pNext;
+ }
+
+}
+
+
+VOID NEAR HOutType
+(
+ LPTYPE pType
+)
+{
+ SHORT i;
+ CHAR * szPrefix;
+
+ switch (pType->tdesc.vt)
+ {
+ case VT_PTR:
+ // first output the base type
+ HOutType(pType->ref.ptypeBase);
+
+ // now output the proper number of "*"'s
+ Assert (pType->ref.cIndirect != 0);
+ for (i = pType->ref.cIndirect; i > 0; i--)
+ {
+ // always output "FAR" for constency (same as dispatch.h)
+ HOut(" FAR*");
+ }
+ break;
+
+ case VT_CARRAY:
+ // just output the base type -- we'll handle this stuff
+ // after we output the name
+ HOutType(pType->ref.ptypeBase);
+ break;
+
+ case VT_SAFEARRAY:
+ HOut("SAFEARRAY FAR*");
+ break;
+
+ case VT_BOOL: // special case -- "boolean" no good
+ HOut("VARIANT_BOOL");
+ break;
+
+ case VT_CY: // special case -- "CURRENCY" no good
+ HOut("CY");
+ break;
+
+ default:
+ // output "unsigned" if necessary
+ if (pType->tentrykind == tINTRINSIC && pType->intr.fUnsigned)
+ HOut("unsigned ");
+
+ switch (pType->tentrykind & ~tFORWARD)
+ {
+ case tUNION:
+ szPrefix = "union ";
+ goto outputPrefix;
+
+ case tSTRUCT:
+ szPrefix = "struct ";
+outputPrefix:
+ if (pType->structenum.szTag)
+ {
+ HOut(szPrefix);
+ HOutF(pType->structenum.szTag);
+ break;
+ }
+ // otherwise, fall into default processing
+
+ default:
+ HOutF(pType->szName);
+
+ }
+ break;
+ }
+
+}
+
+VOID NEAR HOutGuid
+(
+ LPATTR pAttr,
+ CHAR * szGuidPrefix,
+ LPSTR lpszName
+)
+{
+ CHAR szBuffer[100]; // space to list a number UNDONE: Tune
+ GUID FAR * lpGuid;
+
+ if ((pAttr->fAttr & fUUID) == 0)
+ return; // no guid to output
+
+ lpGuid = pAttr->lpUuid;
+ HOut(szHeadGuidPrefix);
+ HOut(szGuidPrefix); // prefix the user's name
+ HOutF(lpszName); // add the user's name
+ sprintf(szBuffer, ",0x%.8lX,0x%.4X,0x%.4X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X);\n",
+ lpGuid->Data1,
+ lpGuid->Data2,
+ lpGuid->Data3,
+ lpGuid->Data4[0],
+ lpGuid->Data4[1],
+ lpGuid->Data4[2],
+ lpGuid->Data4[3],
+ lpGuid->Data4[4],
+ lpGuid->Data4[5],
+ lpGuid->Data4[6],
+ lpGuid->Data4[7]
+ );
+ HOut(szBuffer);
+}
+
+VOID NEAR HOutF
+(
+ LPSTR lpszData
+)
+{
+ CHAR szBuffer[256];
+
+ _fstrcpy(szBuffer, lpszData); // copy data near
+
+ HOut(szBuffer); // output it
+}
+
+
+VOID NEAR HOut
+(
+ CHAR * szData
+)
+{
+ if (fputs(szData, hHFile) < 0) // write the data
+ ParseError(ERR_WRITING_HFILE);
+}
+
+#ifdef PROFILE
+VOID NEAR XOutF
+(
+ LPSTR lpszData
+)
+{
+ CHAR szBuffer[256];
+
+ _fstrcpy(szBuffer, lpszData); // copy data near
+
+ XOut(szBuffer); // output it
+}
+
+
+VOID NEAR XOut
+(
+ CHAR * szData
+)
+{
+ printf(szData); // output to console
+}
+
+#endif //PROFILE
diff --git a/private/oleauto/src/mktyplib/intlstr.c b/private/oleauto/src/mktyplib/intlstr.c
new file mode 100644
index 000000000..957cdc8b2
--- /dev/null
+++ b/private/oleauto/src/mktyplib/intlstr.c
@@ -0,0 +1,212 @@
+#include "mktyplib.h"
+
+// INTLSTR.C
+// data that should be internationalized
+// this is the only file that should be altered by localization
+//
+
+#define BETA
+
+CHAR * szBanner =
+"Microsoft (R) Type Library Generator Version 2.02"
+#if defined(BETA) || defined(DEBUG)
+#include "verstamp.h"
+#define STRING(x) #x
+#define VERSTRINGX(rev) STRING(. ## rev)
+#define VERSTRING VERSTRINGX(rup)
+ VERSTRING
+#endif //BETA || DEBUG
+#ifdef DEBUG
+ " (Debug)"
+#endif //DEBUG
+"\nCopyright (c) Microsoft Corp. 1993-1995. All rights reserved."
+;
+
+#ifdef MAC
+#define cPREFIX "-"
+#define cALIGN "\t\t "
+#define cALIGN1 "\t\t "
+#define cINDENT "\t\t "
+#define cWRAP " "
+#else //!MAC
+#ifdef WIN16
+#define cPREFIX "/"
+#define cALIGN "\t "
+#define cALIGN1 "\t "
+#define cINDENT "\t\t "
+#define cWRAP "\n" cINDENT
+#else //WIN16
+#define cPREFIX "/"
+#define cALIGN "\t "
+#define cALIGN1 " "
+#define cINDENT "\t\t "
+#define cWRAP " "
+#endif //WIN16
+#endif //!MAC
+
+CHAR * szUsage =
+"Usage: MKTYPLIB <options> [inputfile]\n"
+"Valid options are:\n"
+cPREFIX "help or " cPREFIX "?" cALIGN "Displays usage.\n"
+cPREFIX "tlb <filename>" cALIGN "Specifies type library output"
+cWRAP "filename. Defaults to input name\n"
+cINDENT "with extension replaced by \".tlb\".\n"
+cPREFIX "h [filename]" cALIGN "Specifies .H file output filename.\n"
+cPREFIX "<system>" cALIGN "Specifies kind of type library to"
+cWRAP "make (win16, win32, mac, mips, alpha, ppc or ppc32).\n"
+#ifdef WIN16
+cINDENT "Defaults to win16.\n"
+#else
+#ifdef WIN32
+#ifdef _MIPS_
+cINDENT "Defaults to mips.\n"
+//UNDONE: SYS_MAC_PPC?
+#else //_MIPS_
+#ifdef _ALPHA_
+cINDENT "Defaults to alpha.\n"
+#else //_ALPHA_
+cINDENT "Defaults to win32.\n"
+#endif //_ALPHA_
+#endif //_MIPS_
+#else
+cINDENT "Defaults to mac.\n"
+#endif
+#endif
+cPREFIX "align <#>" cALIGN "Override default alignment setting.\n"
+cPREFIX "o filename" cALIGN "Redirects output from screen to"
+cWRAP "specified file.\n"
+cPREFIX "nologo\t" cALIGN "Don't display the copyright banner.\n"
+cPREFIX "w0\t" cALIGN "Disable warnings.\n"
+#if FV_CPP
+cPREFIX "nocpp\t" cALIGN "Don't spawn the C pre-processor.\n"
+cPREFIX "cpp_cmd <path>" cALIGN "Specifies path for C pre-processor.\n"
+cINDENT "Defaults to CL.EXE.\n"
+cPREFIX "cpp_opt \"<opt>\"" cALIGN1 "Specifies options for C"
+cWRAP "pre-processor. Defaults to:\n"
+cINDENT "\"/C /E /D__MKTYPLIB__\".\n"
+cPREFIX "Ddefine[=value]" cALIGN1 "Defines value for C pre-processor.\n"
+cPREFIX "I includepath" cALIGN "Specifies path for include files.\n"
+#endif //FV_CPP
+;
+
+// for titles of message boxes
+CHAR * szAppTitle = "MkTypLib";
+
+
+// Error message strings.
+// WARNING -- must be the same order as items in ERRORS.H !!!
+CHAR * rgszErr[] = {
+ // Parser/lexer errors. These have line # and column # information.
+ "unterminated comment block", // PERR_UNTERMINATED_COMMENT
+ "unexpected end-of-file", // PERR_UNEXP_EOF
+ "error reading input file", // PERR_READ_ERROR
+ "undefined interface/dispinterface", // PERR_UNDEF_INTER
+ "unknown type", // PERR_UNKNOWN_TYPE
+ "duplicate definition", // PERR_DUP_DEF
+ "duplicate 'uuid' attribute", // PERR_DUP_UUID
+ "duplicate 'id' attribute in type", // PERR_DUP_ID
+ "attributes inconsistent with this type", // PERR_INV_COMBO
+ "missing 'id' attribute", // PERR_ID_REQ
+ "missing 'uuid' attribute", // PERR_UUID_REQ
+ "missing 'in' and/or 'out' attribute", // PERR_IN_OUT_REQ
+ "missing 'dllname' attribute", // PERR_DLLNAME_REQ
+ "missing 'entry' attribute", // PERR_ENTRY_REQ
+ "missing 'odl' attribute", // PERR_ODL_REQ
+ "'importlib' sections must be first", // PERR_IMPLIB_NOTFIRST
+ "invalid use of 'void'", // PERR_VOID_INV
+ "numeric value out of range", // PERR_NUMBER_OV
+ "invalid attribute combination", // PERR_INV_ATTR_COMBO
+ "invalid attribute for this item", // PERR_INV_ATTR
+ "invalid numeric literal", // PERR_INV_NUMBER
+ "invalid string literal", // PERR_INV_STRING
+ "invalid UUID literal", // PERR_INV_UUID
+ "invalid identifier", // PERR_INV_IDENTIFIER
+ "invalid constant definition", // PERR_INV_CONSTANT
+ "specified id is out of range", // PERR_INV_ID
+ "invalid use of 'lcid' attribute", // PERR_INV_LCID_USE
+ "invalid use of 'retval' attribute", // PERR_INV_RETVAL_USE
+ "invalid use of 'vararg' attribute", // PERR_INV_VARARG_USE
+ "unsupported keyword", // PERR_UNSUPP_KEYWORD
+ "expected: ", // PERR_EXPECTED
+ "expected: end-of-file", // PERR_EXP_EOF
+ "expected: identifier", // PERR_EXP_IDENTIFIER
+ "expected: keyword", // PERR_EXP_KEYWORD
+ "expected: attribute", // PERR_EXP_ATTRIBUTE
+ "expected: operator", // PERR_EXP_OPERATOR
+ "unsupported operator", // PERR_UNSUPPORTED_OP
+ "invalid numeric expression", // PERR_INV_EXPRESION
+ "expected: numeric expression", // PERR_EXP_NUMBER
+ "expected: string", // PERR_EXP_STRING
+ "expected: interface or dispinterface", // PERR_EXP_INTER
+ "no more than one dispinterface allowed in a coclass", // PERR_TWO_DISPINTER
+ "specified calling convention invalid here", // PERR_INV_CALLCONV
+ "invalid array declaration", // PERR_INV_ARRAY_DECL
+#ifdef WIN32
+ "missing definition of IDispatch. STDOLE32.TLB must be imported.", // PERR_NO_IDISPATCH
+ "missing definition of IUnknown. STDOLE32.TLB must be imported.", // PERR_NO_IDISPATCH
+#else //WIN32
+ "missing definition of IDispatch. STDOLE.TLB must be imported.", // PERR_NO_IDISPATCH
+ "missing definition of IUnknown. STDOLE.TLB must be imported.", // PERR_NO_IDISPATCH
+#endif //WIN32
+ "attributes must follow 'typedef' keyword", // PERR_TYPEDEF_ATTR
+ "property put function must have at least 1 argument and must have exactly one argument after any LCID argument", // PERR_INV_PROPPUT
+ "return type inconsistent with property type", // PERR_INV_PROPFUNC
+ "unknown LCID", // PERR_INV_LCID
+ "source attribute only valid on objects and VARIANTs", // PERR_INV_SOURCE_ATTR
+ "'out' parameter must be a pointer", // PERR_INV_OUT_PARAM
+ "Base interface of Dual interface must be IDispatch, or an interface that derives from IDispatch", // PERR_INV_DUAL_BASE
+ "Base interface of OleAutomation interface must be IUnknown, or an interface that derives from IUnknown", // PERR_INV_OA_BASE
+ "Type is not OleAutomation-compatible", // PERR_INV_OA_TYPE
+ "Invalid return type for OleAutomation-compatible interface", // PERR_INV_OA_FUNC_TYPE
+
+ "references to this type not allowed", // PERR_INV_REFERENCE
+ "specified type is not supported by IDispatch::Invoke", // PWARN_INV_IDISPATCHTYPE
+
+ // output errors (these also have the name of the current item)
+ "forward declaration but no definition", // OERR_NO_DEF
+
+ #define TYPELIBERR(name,string) string
+ #include "typelib.err" // TYPELIB.DLL error strings
+ #undef TYPELIBERR
+
+ // This shouldn't ever be seen if the list in TYPELIB.ERR is complete.
+ "TYPELIB.DLL returned an error",// OERR_TYPEINFO
+
+ // general errors (no line/column # information)
+ "out of memory", // ERR_OM
+ "unable to open input file", // ERR_CANT_OPEN_INPUTFILE
+#if FV_CPP
+ "unable to pre-process input file", // ERR_CPP
+#endif //FV_CPP
+ "unable to open .H output file",// ERR_CANT_OPEN_HFILE
+ "error writing .H output file", // ERR_WRITING_HFILE
+
+ // general warnings (no line/column info)
+ "using non-standard alignment - some structs in the .h file may need to be padded", // WARN_STRANGE_ALIGNMENT
+ ""
+};
+
+// strings for error display/formattting
+CHAR * szFmtSuccess = "Successfully generated type library '%s'.";
+CHAR * szFmtErrFileLineCol = "%s (%ld) : fatal error M0001: Syntax error near line %ld column %d: %s %s";
+CHAR * szFmtWarnFileLineCol = "%s (%ld) : warning M0002: Warning near line %ld column %d: %s %s";
+CHAR * szFmtErrOutput = "%s : fatal error M0003: Error creating type library while processing item '%s': %s.";
+CHAR * szFmtErrImportlib = "%s : fatal error M0004: Error processing type library '%s': %s.";
+
+// This shouldn't ever be seen if the list in TYPELIB.ERR is complete.
+CHAR * szFmtErrUnknown = "%s : fatal error M0005: Error creating type library while processing item '%s': %s (SCODE = 0x%lX).";
+
+CHAR * szFmtErrGeneral = "fatal error M0006: %s";
+CHAR * szFmtWarnGeneral = "warning M0007: %s";
+
+
+// strings for header file output
+CHAR * szHeadFile = "/* This header file machine-generated by mktyplib.exe */\n"
+ "/* Interface to type library: ";
+
+CHAR * szHeadModule = "\n/* Functions defined in module: ";
+
+CHAR * szHeadInter = "\n/* Definition of interface: ";
+CHAR * szHeadDispinter = "\n/* Definition of dispatch interface: ";
+CHAR * szHeadMethods = "/* You must describe methods for this interface here */\n";
+CHAR * szHeadDispatchable = "\n/* Capable of dispatching all the methods of interface ";
diff --git a/private/oleauto/src/mktyplib/intlstr.h b/private/oleauto/src/mktyplib/intlstr.h
new file mode 100644
index 000000000..8750790fe
--- /dev/null
+++ b/private/oleauto/src/mktyplib/intlstr.h
@@ -0,0 +1,35 @@
+// INTLSTR.H
+// interface to internationalized data
+//
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern CHAR * szBanner; // mktyplib banner
+extern CHAR * szUsage; // usage string
+extern CHAR * szAppTitle; // application title
+
+
+// strings for error message formatting/display
+extern CHAR * rgszErr[]; // array of error strings
+extern CHAR * szFmtSuccess; // success format string
+extern CHAR * szFmtErrFileLineCol; // error format strings
+extern CHAR * szFmtWarnFileLineCol;
+extern CHAR * szFmtErrOutput;
+extern CHAR * szFmtErrImportlib;
+extern CHAR * szFmtErrUnknown;
+extern CHAR * szFmtErrGeneral;
+extern CHAR * szFmtWarnGeneral;
+
+// strings for header file output
+extern CHAR * szHeadFile;
+extern CHAR * szHeadModule;
+extern CHAR * szHeadInter;
+extern CHAR * szHeadDispinter;
+extern CHAR * szHeadMethods;
+extern CHAR * szHeadDispatchable;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/src/mktyplib/lexer.c b/private/oleauto/src/mktyplib/lexer.c
new file mode 100644
index 000000000..a81e52321
--- /dev/null
+++ b/private/oleauto/src/mktyplib/lexer.c
@@ -0,0 +1,890 @@
+#include "mktyplib.h"
+
+// LEXER for MKTYPLIB
+
+#include <malloc.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#ifndef WIN32
+#include <ole2.h> // required for dispatch.h
+#include "dispatch.h"
+#endif //WIN32
+
+#include "errors.h"
+#include "tokens.h"
+
+// external data
+extern TOKEN tok;
+extern SYSKIND SysKind;
+
+
+// stuff for error reporting
+extern CHAR szFileCur[]; // file name of current token
+extern DWORD lnCur; // line # of current token
+extern WORD colCur; // column # of current token
+extern DWORD lnLast; // line # of last token
+extern WORD colLast; // column # of last token
+extern CHAR * szExpected; // item for "expected: <item>"
+extern FILE *hFileInput;
+#if FV_CPP
+extern BOOL fCPP; // true if we pre-processed input file
+#endif //FV_CPP
+
+// private types
+typedef struct {
+ TOKID id;
+ CHAR * sz;
+} RWTABLE;
+
+
+#define CB_LINEBUF 1024
+#define CB_MAX_ID 255
+#define CB_MAX_STRING 255
+
+// private data
+CHAR * pLineBuf; // line buffer
+CHAR * pLine; // pointer to current char in line
+BOOL fDirectiveOK;
+
+
+// prototypes
+VOID FAR ParseInit (CHAR * szFile);
+VOID FAR ConsumeTok (TOKID id, WORD fAccept);
+VOID FAR ScanTok ( WORD fAccept);
+LPVOID FAR ParseMalloc ( WORD cbAlloc);
+
+VOID NEAR FillLine(VOID);
+VOID NEAR HandleString (VOID);
+VOID NEAR HandleId (CHAR ch, WORD fAccept);
+CHAR NEAR HandleEscape(VOID);
+TOKID NEAR RwLookup (CHAR *sz, RWTABLE *prgIds);
+VOID NEAR HandleNumericLit (CHAR ch);
+DWORD NEAR HandleHexNum (WORD cDigitsMax);
+VOID NEAR HandleDirective (VOID);
+BOOL NEAR FValidIdCh (CHAR ch, BOOL fFirst);
+
+// reserved word tables
+RWTABLE rgRws[] = {
+ RW_LIBRARY, "library",
+ RW_TYPEDEF, "typedef",
+ RW_ENUM, "enum",
+ RW_STRUCT, "struct",
+ RW_MODULE, "module",
+ RW_INTERFACE, "interface",
+ RW_DISPINTERFACE, "dispinterface",
+ RW_COCLASS, "coclass",
+ RW_PROPERTIES, "properties",
+ RW_METHODS, "methods",
+ RW_IMPORTLIB, "importlib",
+ RW_PASCAL, "pascal",
+ RW_PASCAL, "_pascal",
+ RW_PASCAL, "__pascal",
+ RW_CDECL, "cdecl",
+ RW_CDECL, "_cdecl",
+ RW_CDECL, "__cdecl",
+ RW_STDCALL, "stdcall",
+ RW_STDCALL, "_stdcall",
+ RW_STDCALL, "__stdcall",
+ RW_UNSIGNED, "unsigned",
+ RW_UNION, "union",
+ RW_EXTERN, "extern",
+ RW_FAR, "far",
+ RW_FAR, "_far",
+ RW_SAFEARRAY, "SAFEARRAY",
+ RW_SAFEARRAY, "safearray",
+ RW_CONST, "const",
+#if FV_PROPSET
+ RW_PROPERTY_SET, "property_set",
+#endif //FV_PROPSET
+ // the folllowing are only present for error reporting purposes
+ RW_LBRACKET, "[",
+ RW_RBRACKET, "]",
+ RW_LCURLY, "{",
+ RW_RCURLY, "}",
+ RW_LPAREN, "(",
+ RW_RPAREN, ")",
+ RW_SEMI, ";",
+ RW_COLON, ":",
+ RW_PERIOD, ".",
+ RW_COMMA, ",",
+ RW_ASSIGN, "=",
+ RW_POINTER, "*",
+#if 0 // CONSIDER: (V2, EXPR) activate if these operators are activated
+ OP_MINUS, "-",
+ OP_PLUS, "+",
+ OP_MUL, "*",
+ OP_DIV, "/",
+ OP_MOD, "%",
+ OP_EXP, "^",
+ OP_LOG_AND, "&&",
+ OP_LOG_OR, "||",
+ OP_LOG_NOT, "!",
+ OP_BIT_AND, "&",
+ OP_BIT_OR, "|",
+ OP_BIT_NOT, "~",
+ OP_LSHIFT, "<<",
+ OP_RSHIFT, ">>",
+ OP_EQ, "==",
+ OP_LE, "<=",
+ OP_LT, "<",
+ OP_GE, ">=",
+ OP_GT, ">",
+#endif //0
+ RW_NOTFOUND, NULL
+ };
+
+
+RWTABLE rgAttrs[] = {
+ ATTR_UUID, "uuid",
+ ATTR_VERSION, "version",
+ ATTR_DLLNAME, "dllname",
+ ATTR_ENTRY, "entry",
+ ATTR_ID, "id",
+ ATTR_HELPSTRING, "helpstring",
+ ATTR_HELPCONTEXT, "helpcontext",
+ ATTR_HELPFILE, "helpfile",
+ ATTR_LCID, "lcid",
+ ATTR_PROPGET, "propget",
+ ATTR_PROPPUT, "propput",
+ ATTR_PROPPUTREF, "propputref",
+ ATTR_OPTIONAL, "optional",
+ ATTR_IN, "in",
+ ATTR_OUT, "out",
+ ATTR_STRING, "string",
+ ATTR_VARARG, "vararg",
+ ATTR_APPOBJECT, "appobject",
+ ATTR_RESTRICTED, "restricted",
+ ATTR_PUBLIC, "public",
+ ATTR_READONLY, "readonly",
+ ATTR_ODL, "odl",
+ ATTR_DEFAULT, "default",
+ ATTR_SOURCE, "source",
+ ATTR_BINDABLE, "bindable",
+ ATTR_REQUESTEDIT, "requestedit",
+ ATTR_DISPLAYBIND, "displaybind",
+ ATTR_DEFAULTBIND, "defaultbind",
+ ATTR_LICENSED, "licensed",
+ ATTR_PREDECLID, "predeclid",
+ ATTR_HIDDEN, "hidden",
+ ATTR_RETVAL, "retval",
+ ATTR_CONTROL, "control",
+ ATTR_DUAL, "dual",
+ ATTR_NONEXTENSIBLE, "nonextensible",
+ ATTR_OLEAUTOMATION, "oleautomation",
+ RW_NOTFOUND, NULL
+ };
+
+// ************************************************************************
+// File init/term/read routines
+// ************************************************************************
+
+VOID FAR ParseInit
+(
+ CHAR * szFile
+)
+{
+ pLineBuf = (CHAR *)malloc(CB_LINEBUF+1); // alloc buffer to read lines into
+
+#ifdef WIN16
+ // convert szFile in-place to OEM char set
+ AnsiToOem(szFile, szFile);
+#endif // WIN16
+
+ hFileInput = fopen(szFile, "rb"); // open input file
+
+#ifdef WIN16
+ // convert back to ANSI
+ OemToAnsi(szFile, szFile);
+#endif // WIN16
+
+ if (hFileInput == NULL)
+#if FV_CPP
+ ParseError(fCPP ? ERR_CPP : ERR_CANT_OPEN_INPUTFILE);
+#else
+ ParseError(ERR_CANT_OPEN_INPUTFILE);
+#endif
+
+ FillLine(); // get first line
+
+ ScanTok(0); // get first token
+}
+
+
+// fill up a line buffer
+VOID NEAR FillLine()
+{
+ pLine = pLineBuf; // reset pointer to BOL
+
+ if (!fgets(pLineBuf, CB_LINEBUF, hFileInput)) // get a line
+ { // eof or error
+ if (feof(hFileInput))
+ *pLine = '\0'; // signal EOL
+ else // CONSIDER: store error code & report it
+ ParseError(PERR_READ_ERROR);
+ }
+ lnCur++; // increment current line
+
+#ifdef DEBUG
+#if 0
+ if (fDebug)
+ {
+ CHAR szDebugOut[1030];
+ if (!*pLine)
+ DebugOut("<EOF>\n");
+ else
+ {
+ sprintf(szDebugOut, "%ld: %s", lnCur, pLine);
+ DebugOut(szDebugOut); // dump input to screen
+ }
+ }
+#endif // 0
+#endif // DEBUG
+
+ fDirectiveOK = TRUE; // directives must start line
+}
+
+// ************************************************************************
+// Token scanning routines
+// ************************************************************************
+
+VOID FAR ConsumeTok
+(
+TOKID id,
+WORD fAccept
+)
+{
+ RWTABLE * prgIds;
+
+ if (tok.id != id)
+ {
+ // syntax error -- lookup expected constant/RW in rgRws, for better
+ // error reporting.
+
+ prgIds = rgRws; // just look in RW table
+ // CONSIDER: Do I need to look in rgAttrs too -- I don't think anybody is
+ // CONSIDER: looking for a specific attribute right now.
+ while (prgIds->id != id)
+ {
+ Assert(prgIds->id != RW_NOTFOUND); // had better be in the RW table
+ prgIds++;
+ }
+ szExpected = prgIds->sz;
+ Assert(szExpected); // should have found this name
+ ParseError(PERR_EXPECTED);
+ }
+ ScanTok(fAccept);
+}
+
+
+// fills token structure with next token, subject to context
+VOID FAR ScanTok
+(
+WORD fAccept
+)
+{
+ CHAR ch;
+
+ lnLast = lnCur; // save info about previous token
+ colLast = colCur;
+ // CONSIDER: add a szFileLast (might be slow, however);
+
+top:
+ ch = *pLine++; // ch = next char in line
+ colCur = (WORD)(pLine-pLineBuf); // save 1-based column # of current token
+ // for error reporting
+
+ switch (ch)
+ {
+
+ case '\0': // EOF -- quit
+ if (!(fAccept & fACCEPT_EOF))
+ ParseError(PERR_UNEXP_EOF);
+ tok.id = RW_EOF;
+ break;
+
+ case '#': // probably a #line n "filename"
+ // if not first non-blank char on line, then give error
+ if (!fDirectiveOK)
+ goto default_char;
+ HandleDirective();
+ // fall into code below, to get next line & continue
+
+ case '\n': // EOL -- advance to next line, if any
+ FillLine(); // get next line
+ goto top; // and continue
+ break;
+
+ case '[':
+ tok.id = RW_LBRACKET;
+ break;
+
+ case ']':
+ tok.id = RW_RBRACKET;
+ break;
+
+ case '{':
+ tok.id = RW_LCURLY;
+ break;
+
+ case '}':
+ tok.id = RW_RCURLY;
+ break;
+
+ case '(':
+ tok.id = RW_LPAREN;
+ break;
+
+ case ')':
+ tok.id = RW_RPAREN;
+ break;
+
+ case ';':
+ tok.id = RW_SEMI;
+ break;
+
+ case ':':
+ tok.id = RW_COLON;
+ break;
+
+ case '.':
+ tok.id = RW_PERIOD;
+ break;
+
+ case ',':
+ tok.id = RW_COMMA;
+ break;
+
+ case '=':
+ tok.id = RW_ASSIGN;
+ //CONSIDER: (V2, EXPR) handle "==" (OP_EQ) when fAccept & fACCEPT_OPERATOR
+ break;
+
+ case '*':
+ tok.id = RW_POINTER;
+ break;
+
+ case '-': // subtract operator or a hyphen (perhaps a unary minus)
+ tok.id = (WORD)((fAccept & fACCEPT_OPERATOR) ? OP_SUB : RW_HYPHEN);
+ break;
+
+ case '"': // start of string literal
+ if (!(fAccept & fACCEPT_STRING)) // if unexpected string, give
+ goto default_char; // proper error (expected number/id)
+ HandleString();
+ break;
+
+ case '/': // probably a start of a comment
+ if (*pLine == '/') // if "//"
+ {
+ FillLine(); // get next line
+ goto top; // and continue
+ break;
+ }
+ else if (*pLine == '*') // if "/*"
+ {
+ pLine++; // skip "*"
+ while (*pLine) // while not EOF
+ {
+
+ pLine = XStrChr(pLine, '*');
+
+ if (pLine == NULL) // if no "*" found on this line
+ {
+ FillLine(); // get next line
+ }
+ else
+ if (*(++pLine) == '/') // if found "*/"
+ {
+ pLine++; // skip the "/"
+ goto top; // and continue
+ }
+ }
+ ParseError(PERR_UNTERMINATED_COMMENT);
+ }
+
+ // otherwise, fall into default char processing
+
+
+ default:
+ if ((BYTE)ch <= ' ') // anything less than a space, just treat as white space
+ goto top;
+
+default_char:
+ if (fAccept & fACCEPT_UUID)
+ { // if only looking for a UUID
+ // parse 16-byte UUID constant
+ CHAR * start; // starting position
+ #define CCH_SZGUID0 39 // chars in ascii guid (including NULL)
+ CHAR buffer[CCH_SZGUID0];
+
+ tok.lpUuid = (GUID FAR *)ParseMalloc(sizeof(GUID));
+
+ start = --pLine;
+
+ // use our number parsers to help validate the UUID
+ HandleHexNum(8);
+ if (*pLine++ != '-')
+ ParseError(PERR_INV_UUID);
+ HandleHexNum(4);
+ if (*pLine++ != '-')
+ ParseError(PERR_INV_UUID);
+ HandleHexNum(4);
+ if (*pLine++ != '-')
+ ParseError(PERR_INV_UUID);
+ HandleHexNum(4);
+ if (*pLine++ != '-')
+ ParseError(PERR_INV_UUID);
+ HandleHexNum(8);
+ HandleHexNum(4);
+ if (pLine - start != (32+4)) // 32 digits + 4 hyphens
+ ParseError(PERR_INV_UUID);
+
+ // get uuid in a string of the form:
+ // {numbnumb-numb-numb-numb-numbnumbnumb} so OLE can use it.
+
+ #define chClsPrefix '{'
+ #define cbClsPrefix 1
+ #define chClsSuffix '}'
+
+ *buffer = chClsPrefix;
+ _fmemcpy(buffer+cbClsPrefix, start, 32+4);
+ *(buffer+cbClsPrefix+32+4) = chClsSuffix;
+ *(buffer+cbClsPrefix+32+5) = '\0';
+
+ // have OLE translate this into it's special UUID format
+#if FV_UNICODE_OLE
+ {
+ OLECHAR bufferW[CCH_SZGUID0];
+ SideAssert (MultiByteToWideChar(CP_ACP,
+ MB_PRECOMPOSED,
+ buffer,
+ -1,
+ bufferW,
+ CCH_SZGUID0) != 0);
+ SideAssert (!FAILED(CLSIDFromString(bufferW, (LPCLSID)tok.lpUuid)));
+ }
+#else //FV_UNICODE_OLE
+ SideAssert (!FAILED(CLSIDFromString(buffer, (LPCLSID)tok.lpUuid)));
+#endif //FV_UNICODE_OLE
+
+ tok.id = LIT_UUID;
+ break;
+ }
+
+ if (fAccept & fACCEPT_OPERATOR)
+ { // if looking for an operator
+ switch (ch)
+ {
+ case '+':
+ tok.id = OP_ADD;
+ break;
+
+ case '-':
+ tok.id = OP_SUB;
+ break;
+
+ case '*':
+ tok.id = OP_MUL;
+ break;
+
+ case '/':
+ tok.id = OP_DIV;
+ break;
+
+ case '%':
+ tok.id = OP_MOD;
+ break;
+
+ case '^':
+ tok.id = OP_EXP;
+ break;
+
+ case '!':
+ tok.id = OP_LOG_NOT;
+ break;
+
+ case '&':
+ tok.id = OP_BIT_AND;
+ //CONSIDER: (V2, EXPR) handle "&&" (OP_LOG_AND)
+ break;
+
+ case '|':
+ tok.id = OP_BIT_OR;
+ //CONSIDER: (V2, EXPR) handle "||" (OP_LOG_OR)
+ break;
+
+ case '~':
+ tok.id = OP_BIT_NOT;
+ break;
+
+ case '<':
+ tok.id = OP_LT;
+ //CONSIDER: (V2, EXPR) handle "<=" (OP_LE)
+ //CONSIDER: (V2, EXPR) handle "<<" (OP_LSHIFT)
+ break;
+
+ case '>':
+ tok.id = OP_GT;
+ //CONSIDER: (V2, EXPR) handle ">=" (OP_GE)
+ //CONSIDER: (V2, EXPR) handle ">>" (OP_RSHIFT)
+ break;
+
+ default:
+ // valid chars to end expressions (such as a
+ // right paren) should have been accepted above.
+ ParseError(PERR_EXP_OPERATOR);
+ }
+
+ break; // got an operator -- exit
+ }
+
+ if (fAccept & fACCEPT_NUMBER)
+ { // if looking for a numeric value
+ HandleNumericLit(ch);
+ break;
+ }
+
+ if (fAccept & fACCEPT_STRING) // error if looking for a string
+ ParseError(PERR_EXP_STRING); // and it wasn't found above
+
+ HandleId(ch, fAccept); // ID token of some sort
+ break; // (could be RW, ATTR, id, or type)
+
+ }
+
+ fDirectiveOK = FALSE; // pre-processor directives
+ // not allowed again until next line
+}
+
+
+
+VOID NEAR HandleString ()
+{
+ CHAR szBuffer[CB_MAX_STRING+1];
+ WORD cbsz;
+ CHAR * psz;
+ CHAR ch;
+
+ psz = szBuffer; // where to copy string
+ cbsz = 0; // no chars copied so far
+ ch = *pLine++; // ch = next char in line
+ while (ch != '\"')
+ { // while not end of string
+ // error if premature EOL\EOF or buffer overflow
+ if (ch == '\n' || ch == '\0' || ++cbsz >= sizeof(szBuffer))
+ ParseError(PERR_INV_STRING);
+ if (ch == '\\') // handle escape sequences
+ ch = HandleEscape();
+ *psz++ = ch;
+ //if ch is first byte of a DBCS char, then must copy another char
+ if (IsLeadByte(ch))
+ {
+ if (++cbsz >= sizeof(szBuffer)) // 1 more byte in string
+ ParseError(PERR_INV_STRING);
+ *psz++ = *pLine++; // copy 2nd byte
+ }
+ ch = *pLine++; // ch = next char in line
+ }
+ *psz = '\0'; // null-terminate the data
+ tok.cbsz = cbsz; // save char count (not including null term)
+ cbsz++;
+ tok.lpsz = (LPSTR)ParseMalloc(cbsz);
+ _fmemcpy(tok.lpsz, szBuffer, cbsz);
+ tok.id = LIT_STRING;
+}
+
+VOID NEAR HandleId
+(
+ CHAR ch,
+ WORD fAccept
+)
+{
+ CHAR szBuffer[CB_MAX_ID+1];
+ WORD cbsz;
+ CHAR * psz;
+
+ psz = szBuffer; // where to copy ID
+ cbsz = 0; // no chars copied so far
+ if (!FValidIdCh(ch, TRUE))
+ {
+ tok.id = RW_NOTFOUND; // not a valid id -- return
+ return;
+ }
+ do
+ {
+ if (++cbsz >= sizeof(szBuffer))
+ ParseError(PERR_INV_IDENTIFIER);
+ *psz++ = ch; // copy char
+ //if ch is first byte of a DBCS char, then
+ //copy another char and keep looping.
+ if (IsLeadByte(ch))
+ {
+ if (++cbsz >= sizeof(szBuffer))
+ ParseError(PERR_INV_IDENTIFIER);
+ *psz++ = *pLine++; // then copy 2nd byte
+
+ }
+
+ ch = *pLine++; // ch = next char in ID
+ } while (FValidIdCh(ch, FALSE)); // while more chars in id
+
+ *psz = '\0'; // null-terminate the data
+ cbsz++; // include NULL in count
+ pLine--; // back up to char that terminated id
+
+ tok.id = 0;
+ if (fAccept & fACCEPT_ATTR)
+ { // see if looking for attribute
+ // returns appropriate ATTR_xxx or 0 if not found
+ tok.id = RwLookup(szBuffer, rgAttrs);
+ }
+
+ if (tok.id == 0) // see if normal RW
+ tok.id = RwLookup(szBuffer, rgRws);
+
+ if (tok.id == 0) // if not any RW, must be an ID
+ {
+ tok.lpsz = (LPSTR)ParseMalloc(cbsz);
+ _fmemcpy(tok.lpsz, szBuffer, cbsz);
+ tok.id = LIT_ID;
+ }
+}
+
+
+// Translate escape char. The following are supported:
+// \0, \a, \b, \f, \n, \r, \t, \v
+//
+// (use hard-coded values so using mktyplib on different platforms will
+// produce identical typelibs)
+//
+CHAR NEAR HandleEscape ()
+{
+ CHAR ch;
+
+ ch = *pLine++; // get char after "\"
+
+ switch (ch)
+ {
+ case '0':
+ return 0x00;
+ case 'a':
+ return 0x07;
+ case 'b':
+ return 0x08;
+ case 'f':
+ return 0x0c;
+ case 'n':
+ if (SysKind == SYS_MAC)
+ return 0x0d;
+ else
+ return 0x0a;
+ case 'r':
+ if (SysKind == SYS_MAC)
+ return 0x0a;
+ else
+ return 0x0d;
+ case 't':
+ return 0x09;
+ case 'v':
+ return 0x0b;
+ default:
+ return ch; // otherwise, just treat as char we got
+ }
+}
+
+
+// returns TRUE if char is A-Z, a-z, underscore, or >= 128
+BOOL NEAR FValidIdCh
+(
+ CHAR ch,
+ BOOL fFirst
+)
+{
+ // Assumes all DBCS lead bytes are > 128. This seems to be true.
+
+ // NOTE: using ch < 0 instead of ch >= 128, because ch is SIGNED.
+ return (isalpha(ch) || ch < 0 || ch == '_' || (!fFirst && isdigit(ch)));
+}
+
+
+VOID NEAR HandleNumericLit
+(
+ CHAR ch
+)
+{
+ DWORD prevVal;
+
+ tok.number = 0;
+ tok.id = LIT_NUMBER; // assume valid number
+ if (ch == '0' && *pLine == 'x') // parse hex constant
+ {
+ pLine++; // advance to first hex digit
+ tok.number = HandleHexNum(8); // input up to a 8-digit hex number
+ if (isxdigit(*pLine)) // error if more digits left
+ ParseError(PERR_INV_NUMBER);
+ }
+ else if (isdigit(ch)) // parse decimal constant
+ {
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ {
+ prevVal = tok.number;
+ if (prevVal > 429496729L) //error if *10 will overflow
+ ParseError(PERR_NUMBER_OV);
+ tok.number *= 10;
+ tok.number += (ch - '0');
+ if (tok.number < prevVal) // error if overflow
+ ParseError(PERR_NUMBER_OV);
+ ch = *pLine; // get next char
+ if (!isdigit(ch)) // if next char not digit, we're done
+ break;
+ pLine++; // consume digit
+ };
+ }
+
+ else if (ch == '\'')
+ { // support for numeric literals of the form: 'a' or '\0'.
+ ch = *pLine++; // ch = char after quote
+ if (ch == '\\') // handle escape sequences
+ ch = HandleEscape();
+ tok.number = (BYTE)ch; // don't sign-extend
+ if (*pLine++ != '\'') // error if no close quote
+ {
+ //CONSIDER: if we're to support 4-char literals, then code
+ //CONSIDER: must be added here. Issues with 4-char literals
+ //CONSIDER: are byte order and whether we need them or not.
+ ParseError(PERR_INV_NUMBER);
+ }
+ }
+
+ else
+ ParseError(PERR_EXP_NUMBER);
+}
+
+
+DWORD NEAR HandleHexNum
+(
+ WORD cDigitsMax
+)
+{
+ DWORD result = 0;
+ CHAR ch;
+ WORD digit;
+
+ if (!isxdigit(*pLine)) // error if no hex digits
+ ParseError(PERR_INV_NUMBER);
+
+ while (isxdigit(ch = *pLine) && cDigitsMax--)
+ {
+ pLine++;
+ result = result << 4;
+
+ digit = ch;
+ if (ch < 'A')
+ digit -= '0';
+ else if (ch < 'a')
+ digit -= ('A'-10);
+ else
+ digit -= ('a'-10);
+ result += digit;
+ }
+
+ return result;
+}
+
+
+VOID NEAR HandleDirective()
+{
+ fDirectiveOK = FALSE; // don't allow nested directives
+ if (memcmp(pLine, "line ", 5) == 0) // if got #line
+ { // handle #line <line #> "<filename>"
+ // UNDONE: (CPP) Do all pre-processors emit #line directives in
+ // UNDONE: (CPP) the above format?
+
+ pLine+= 5; // skip "line "
+ ScanTok(fACCEPT_NUMBER); // read in the new current line number
+ if (tok.id != LIT_NUMBER)
+ ParseError(PERR_EXP_NUMBER); // error
+ lnCur = tok.number - 1; // set new current line # (-1 because
+ // FillLine will increment it)
+ ScanTok(fACCEPT_STRING); // get current file name
+ if (tok.id != LIT_STRING)
+ ParseError(PERR_EXP_STRING); // error
+ _fstrcpy(szFileCur, tok.lpsz); // save current file name
+ _ffree(tok.lpsz); // free unused memory
+ }
+ // Just ignore any other directives
+ // CONSIDER: (CPP) Maybe give warning instead of ignoring other directives?
+}
+
+
+// *********************************************************************
+// utility routines
+// *********************************************************************
+
+
+// if sz in rgIds, return appropriate constant.
+TOKID NEAR RwLookup
+(
+ CHAR * psz,
+ RWTABLE * prgIds
+)
+{
+
+ TOKID id;
+
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ {
+ id = prgIds->id;
+ if (prgIds->sz == NULL)
+ break; // quit if end of table
+ if (strcmp(prgIds->sz, psz) == 0)
+ break; // quit if found match
+ prgIds++;
+ }
+
+ return id;
+}
+
+// cover for fmalloc -- calls ParseError(ERR_OM) if alloc fails
+LPVOID FAR ParseMalloc
+(
+ WORD cbAlloc
+)
+{
+ LPVOID retVal;
+
+ if ((retVal = _fmalloc(cbAlloc)) == NULL)
+ ParseError(ERR_OM);
+
+ return retVal;
+}
+
+
+// XStrChr: perform strchr on SBCS or DBCS string
+extern char * FAR XStrChr
+(
+ char * xsz,
+ int ch
+)
+{
+ char * pchFind = NULL;
+
+ while(*xsz != '\0') {
+ if (*xsz == ch)
+ pchFind = xsz;
+ if (IsLeadByte(*xsz)) {
+ pchFind = NULL;
+ xsz++;
+ if (*xsz == '\0')
+ break;
+ }
+ xsz++;
+ }
+ return pchFind;
+
+}
diff --git a/private/oleauto/src/mktyplib/mktyplib.c b/private/oleauto/src/mktyplib/mktyplib.c
new file mode 100644
index 000000000..cd6175ed8
--- /dev/null
+++ b/private/oleauto/src/mktyplib/mktyplib.c
@@ -0,0 +1,1302 @@
+#include "mktyplib.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef WIN16
+#include <toolhelp.h>
+#endif //WIN16
+#ifndef MAC
+#include <commdlg.h>
+#endif //!MAC
+#ifdef MAC
+#include <memory.h>
+#include <quickdra.h> // stuff for initialization
+#include <fonts.h>
+#include <windows.h>
+#include <menus.h>
+#include <dialogs.h>
+#include <script.h> // needed for ParseTable()
+#endif //MAC
+#ifndef WIN32
+#include <ole2.h>
+#include "dispatch.h"
+#endif //!WIN32
+#include "fileinfo.h"
+
+#include "errors.h"
+#include "intlstr.h" // szBanner, szUsage, rgszErr structure defs
+
+// external data
+extern TYPLIB typlib;
+
+// external routines
+extern VOID FAR ParseOdlFile(CHAR * szInputFile); // from PARSER.C
+extern VOID FAR OutputHFile(CHAR * szHFile); // from HOUT.C
+extern VOID FAR OutputTyplib(CHAR * szTypeLibFile); // from TYPOUT.C
+extern VOID FAR CleanupImportedTypeLibs(void); // from TYPOUT.C
+
+#ifdef DEBUG
+//UNDONE: (oleprog #557) can't use dimalloc because dstrmgr memory leaks
+//#define USE_DIMALLOC //catches memory leaks, etc
+#endif //DEBUG
+
+#ifdef WIN16
+#ifdef DEBUG // only disable alerts in the debug version
+#define NODEBUGALERTS // activate to disable debug windows alerts
+#endif //DEBUG
+#endif //WIN16
+
+#ifdef USE_DIMALLOC
+extern BOOL GetDebIMalloc(IMalloc FAR* FAR* ppMalloc); // from dimalloc.cxx
+#endif
+
+// local defines
+#ifdef WIN16
+#define CB_MAX_PATHNAME 127
+#else //WIN16
+#define CB_MAX_PATHNAME 255
+#endif //WIN16
+
+#define ARGS_OK 0 // FParseCl() return values
+#define GIVE_USAGE 1
+
+#ifdef WIN16
+CHAR * szBatchStart = "@echo off\n";
+CHAR * szBatchEnd = "if errorlevel 1 goto goterror\n"
+ "echo 0 >%s\n"
+ ":goterror\n";
+#endif //WIN16
+
+// public variables used for error reporting
+DWORD lnCur=0; // current line #
+WORD colCur=0; // current column number
+CHAR szFileCur[CB_MAX_PATHNAME+1]; // current file name
+DWORD lnLast; // current line #
+WORD colLast; // current column number
+SCODE scodeErrCur; // SCODE of current output error
+
+CHAR * szExpected = ""; // initially empty string
+
+
+FILE * hFileInput = NULL; // file handle for reading
+FILE * hHFile = NULL; // file handle for .H file output
+FILE * hFileOutput = NULL; // file handle for redirected output
+
+// forward decls and public data for DBCS support
+char g_rgchLeadBytes[256];
+static VOID InitLeadByteTable();
+
+// prototypes
+#ifndef NO_MPW
+VOID main (int argc, CHAR *argv[]);
+#else //NO_MPW
+VOID main (VOID);
+extern VOID FAR DumpTypeLib(CHAR * szTypeLibFile); // from TLVIWER.CPP
+#endif //NO_MPW
+#ifdef MAC
+VOID MacMessageBox(CHAR * szOutput);
+#endif
+SHORT NEAR FParseCl(int argc, CHAR * argv[]);
+VOID NEAR DoPreProcess(VOID);
+CHAR * NEAR CloneNameAddExt(CHAR * szInputFile, CHAR * szExt);
+VOID NEAR ErrorExit(VOID);
+VOID NEAR DisplaySuccess (CHAR * szTypeLibFile);
+VOID NEAR ParseErrorLnCol(ERR err, DWORD lnCur, WORD colCur);
+
+
+// local data
+#ifndef MAC
+HCURSOR hcrsWait;
+#endif //!MAC
+
+// data filled in from the command line
+CHAR * szInputFile = NULL; // filename we're inputting from
+CHAR * szTypeLibFile = NULL; // filename we're outputting to
+CHAR * szHFile = NULL; // filename for .H file output
+CHAR * szOutputFile = NULL; // filename for redirected output
+BOOL fHFile = FALSE; // TRUE ==> output a .H file
+BOOL fNologo = FALSE; // TRUE ==> don't print the header
+BOOL fGiveUsage = FALSE; // TRUE ==> give usage screen
+SYSKIND SysKind = SYS_DEFAULT; // kind of typlib to generate
+int iAlignMax = ALIGN_MAX_DEFAULT; // alignment max
+int iAlignDef = ALIGN_MAX_DEFAULT; // standard alignment for the platform
+BOOL fSuppressWarnings = FALSE; // TRUE ==> suppress warnings
+#if defined(WIN16) || (defined (MAC) && !defined(_PPCMAC))
+DWORD f2DefaultCC = f2CDECL; // default calling convention for
+ // win16 & 68k Mac
+#else
+DWORD f2DefaultCC = f2STDCALL; // default calling convention for
+ // win32 & ppc mac
+#endif
+
+#if FV_CPP
+BOOL fCPP = TRUE; // default to using the pre-processor
+CHAR * szCppExe = "cl.exe"; // default pre-processor EXE
+#ifndef WIN32
+HTASK hTaskCpp; // task notification data
+#endif
+CHAR * szCppOpts = "-C -E -D__MKTYPLIB__"; // default pre-processor opts
+CHAR * szTempFile = NULL;
+#ifdef WIN16
+#define CB_CPPDEFS 128 // bounded by max command line length on win16
+#else //WIN16
+#define CB_CPPDEFS 512 // *not* bounded by max command line length.
+ // 512 is big enough for all practical purposes.
+#endif //WIN16
+CHAR szCppDefs[CB_CPPDEFS]; // pre-processor defines/includes
+
+#endif //FV_CPP
+
+BOOL fOLEInitialized = FALSE; // TRUE ==> OLE has been initialized
+#ifdef MAC
+BOOL fAppletInitialized = FALSE; // TRUE ==> OLE has been initialized
+#endif //MAC
+
+#ifdef DEBUG
+BOOL fDebug = FALSE; // TRUE ==> dump debug info
+#endif //DEBUG
+
+
+#ifndef WIN16
+#define OLEINITIALIZE OleInitialize
+#define OLEUNINITIALIZE OleUninitialize
+#else //!WIN16
+#define OLEINITIALIZE CoInitialize // don't need all of OleInitialize
+#define OLEUNINITIALIZE CoUninitialize
+#endif //!WIN16
+
+#if 0 // doesn't seem to be necessary under WIN16, WIN32 or MAC
+VOID FAR pascal WinMain(HANDLE hInstanceCur, HANDLE hInstancePrev, LPSTR lpCmdLine, int nCmdShow)
+{
+ main(0, NULL); // doesn't return
+}
+#endif //0
+
+#ifdef WIN16
+int FAR pascal WEP(int x)
+{
+ x = x; // fix retail warning
+ return 1; // success
+}
+#endif //WIN16
+
+//#define KEEPTEMP // activate to retain temp files
+
+#ifdef KEEPTEMP
+ #define MyRemove(x) 0 // pretend no error
+#else //KEEPTEMP
+ #define MyRemove remove
+#endif //KEEPTEMP
+
+#ifdef NODEBUGALERTS
+ WINDEBUGINFO Olddebuginfo;
+#endif
+
+
+// MkTypLib entry point
+VOID main
+(
+#ifndef NO_MPW
+ int argc, /* Number of strings in array argv */
+ CHAR *argv[] /* Array of command-line argument strings */
+#endif // NO_MPW
+)
+{
+
+#ifdef USE_DIMALLOC
+ IMalloc FAR *pmalloc;
+#endif //USE_DIMALLOC
+#ifdef NO_MPW
+#define MAX_ARGS 21
+ int argc; /* Number of strings in array argv */
+ CHAR *argv[MAX_ARGS]; /* Array of command-line argument strings */
+ FILE * hFileArgs;
+#endif // NO_MPW
+
+ int fArgErr;
+ HRESULT res;
+#ifndef MAC
+ OPENFILENAME ofn;
+#endif
+
+#ifdef NODEBUGALERTS
+ WINDEBUGINFO debuginfo;
+
+ GetWinDebugInfo(&debuginfo, WDI_OPTIONS);
+ Olddebuginfo = debuginfo; // save for restoration
+ debuginfo.dwOptions |= DBO_SILENT;
+ SetWinDebugInfo(&debuginfo);
+#endif //NODEBUGALERTS
+
+ // init key fields in the main 'typlib' structure before we use them
+ typlib.pEntry = NULL; // no entries seen so far
+ typlib.pImpLib = NULL; // no imported libraries initially
+
+#ifdef MAC
+#ifdef NO_MPW
+ // Do mysterious MAC init stuff
+ MaxApplZone();
+#endif //NO_MPW
+
+ InitGraf((Ptr) &qd.thePort);
+#ifdef NO_MPW
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ InitDialogs(nil);
+ InitCursor();
+#endif //NO_MPW
+
+ PPCInit(); // required by OleInitialize
+
+ // init the OLE Applet
+ if ((res = InitOleManager(0)) != NOERROR)
+ ParseError(ERR_OM); // UNDONE: correct error?
+ fAppletInitialized = TRUE;
+
+#ifdef NO_MPW
+ // If a file exists called "MKTYPLIB.ARG", load up argc, argv[] to satisfy
+ // our command line parser.
+ if (hFileArgs = fopen("mktyplib.arg", "r"))
+ {
+ argc = 1;
+ while (argc < MAX_ARGS)
+ {
+ argv[argc] = malloc(50);
+ if (fscanf(hFileArgs, " %s ", argv[argc]) == EOF)
+ break;
+ argc++;
+ }
+ fclose(hFileArgs);
+
+ }
+ else
+ {
+ // activate to output to file instead of using lame MAC MessageBox's
+ // szOutputFile = "m.log"; // redirected output
+ szInputFile = "m.odl"; // input file
+ fHFile = TRUE; // want a .H file
+
+ fArgErr = FALSE; // no arg error
+ goto ArgsParsed;
+ }
+#endif //NO_MPW
+#endif //MAC
+
+ InitLeadByteTable();
+
+ fArgErr = FParseCl(argc, argv); // parse the command line
+
+#ifdef MAC
+#ifdef NO_MPW
+ArgsParsed:
+#endif //NO_MPW
+#endif //MAC
+
+ if (szOutputFile)
+ {
+#ifdef WIN16
+ // perform in-place conversion to OEM char set
+ AnsiToOem(szOutputFile, szOutputFile);
+
+ // (don't bother converting back - this string is not used again)
+#endif // WIN16
+
+ hFileOutput = fopen(szOutputFile, "w");
+ // if problem opening output file, then just revert to normal
+ // MessageBox output.
+ // CONSIDER: give an error, too?
+ }
+
+ if (!fNologo)
+ {
+ DisplayLine(szBanner); // display the copyright banner
+ // add a blank line in some cases to make it look better
+ if (hFileOutput)
+ fputs("\n", hFileOutput);
+#ifndef WIN16
+#ifndef NO_MPW
+ else
+ printf("\n");
+#endif //NO_MPW
+#endif //!WIN16
+ }
+
+ if (fArgErr || fGiveUsage)
+ {
+GiveUsage:
+ DisplayLine(szUsage);
+ ErrorExit(); // clean up and exit(1)
+ }
+
+#ifndef MAC
+ // use common dialog to get input filename if user didn't specify one
+ if (szInputFile == NULL)
+ {
+ szInputFile = malloc(CB_MAX_PATHNAME+1);
+
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+ ofn.lStructSize = sizeof(OPENFILENAME);
+// ofn.hwndOwner = g_hwndMain;
+ ofn.hwndOwner = NULL;
+ ofn.lpstrFile = szInputFile;
+ ofn.nMaxFile = CB_MAX_PATHNAME+1;
+ *szInputFile = '\0';
+ ofn.lpstrFilter = "Object Description Lang.\0*.odl\0\0";
+ ofn.nFilterIndex = 1;
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
+
+ // if anything went wrong -- just give the usage message
+ if (GetOpenFileName(&ofn) == 0)
+ goto GiveUsage;
+ }
+#endif //!MAC
+
+ Assert(szInputFile);
+
+// now compute filenames based off the input filename
+
+ if (szTypeLibFile == NULL) // if output file not specified
+ { // use input filename with ".tlb" extension
+ szTypeLibFile = CloneNameAddExt(szInputFile, ".tlb");
+ }
+
+ if (fHFile && szHFile == NULL) // if header filename not specified
+ { // use input filename with ".h" extension
+ szHFile = CloneNameAddExt(szInputFile, ".h");
+ }
+
+
+ // If output file ends up with the same name as the input file, then
+ // the user is screwed. Just give the usage message.
+ if (!strcmp(szInputFile, szTypeLibFile))
+ goto GiveUsage;
+
+ // If .h file ends up with the same name as either the input file or output
+ // file, then the user is screwed. Just give the usage message.
+ if (szHFile && (!strcmp(szInputFile, szHFile) || !strcmp(szTypeLibFile, szHFile)))
+ goto GiveUsage;
+
+#ifdef USE_DIMALLOC
+
+ // Use the dimalloc implementation, since the default implementation
+ // doesn't work yet in mac ole.
+ if (!GetDebIMalloc(&pmalloc))
+ ParseError(ERR_OM); // UNDONE: correct error?
+
+ res = OLEINITIALIZE(pmalloc);
+ pmalloc->lpVtbl->Release(pmalloc);
+#else
+ // must init OLE
+ res = OLEINITIALIZE(NULL);
+#endif
+
+ if (FAILED(res))
+ ParseError(ERR_OM); // UNDONE: correct error?
+ fOLEInitialized = TRUE;
+
+#ifndef MAC
+ hcrsWait = LoadCursor(NULL, (LPSTR)IDC_WAIT);
+ SetCursor(hcrsWait); // turn on the hourglass cursor
+ // UNDONE: this doesn't always stay on in WIN16, nor does it seem to
+ // UNDONE: have any affect in WIN32.
+#endif //!MAC
+
+#if FV_CPP
+ if (fCPP) // if we're to pre-process input file
+ DoPreProcess();
+#endif //FV_CPP
+
+ strcpy(szFileCur, szInputFile); // init current file name (for
+ // error reporting)
+
+#if FV_CPP
+ ParseOdlFile(fCPP ? szTempFile : szInputFile); // parse the input file
+#else
+ ParseOdlFile(szInputFile); // parse the input file
+#endif
+
+#if FV_CPP
+ if (szTempFile)
+ {
+ SideAssert(MyRemove(szTempFile) == 0); // delete tmp file created above
+ szTempFile = NULL;
+ }
+#endif //FV_CPP
+
+ if (fHFile) // output .H file if desired
+ OutputHFile(szHFile);
+
+ // Now emit the type library
+ OutputTyplib(szTypeLibFile);
+
+#ifdef NO_MPW
+ // Now dump the type library
+ DumpTypeLib(szTypeLibFile);
+#endif
+
+ CleanupImportedTypeLibs(); // release any imported typelibs
+
+ OLEUNINITIALIZE(); // terminate OLE
+
+#ifdef MAC
+ UninitOleManager(); // clean up applet
+#endif //MAC
+
+ DisplaySuccess(szTypeLibFile); // holy *&*%&^%, it worked!!!
+
+ if (hFileOutput) // close redirected output file
+ fclose(hFileOutput);
+
+#ifdef NODEBUGALERTS
+ SetWinDebugInfo(&Olddebuginfo);
+#endif //NODEBUGALERTS
+ exit(0);
+
+}
+
+// helper to print the "success" message -- moved out of line to reduce
+// stack usage of main routine.
+VOID NEAR DisplaySuccess
+(
+ CHAR * szTypeLibFile
+)
+{
+ CHAR szBuf[255];
+
+ sprintf (szBuf, szFmtSuccess, szTypeLibFile);
+ DisplayLine(szBuf); // then display the message
+}
+
+
+VOID FAR ParseErrorTokLast
+(
+ ERR err
+)
+{
+ ParseErrorLnCol(err, lnLast, colLast);
+}
+
+// Cleans up, and reports an error. Doesn't return unless this is a warning.
+VOID FAR ParseError
+(
+ ERR err
+)
+{
+ ParseErrorLnCol(err, lnCur, colCur);
+}
+
+// Cleans up, and reports an error. Doesn't return unless this is a warning.
+// Reports an error. If this is a warning, returns.
+// If this is an error, cleans up and exits
+VOID NEAR ParseErrorLnCol
+(
+ ERR err,
+ DWORD lnCur,
+ WORD colCur
+)
+{
+ CHAR szError[255];
+ BOOL fWarning;
+
+ fWarning = ((err >= WARN_FIRST && err < GENERAL_ERR_LAST) ||
+ (err >= PWARN_FIRST && err < OERR_FIRST));
+
+ if (fWarning && fSuppressWarnings)
+ return;
+
+ // first figure out the error text
+ if (err < OERR_FIRST)
+ { // parser/lexer error or warning
+ Assert(err);
+ sprintf (szError,
+ (fWarning ? szFmtWarnFileLineCol : szFmtErrFileLineCol),
+ szFileCur, lnCur, lnCur, colCur, rgszErr[err-1], szExpected);
+ }
+ else
+ {
+ // output errors shoudn't come through here.
+ Assert(err >= ERR_FIRST && err < GENERAL_ERR_LAST);
+ sprintf (szError,
+ (fWarning ? szFmtWarnGeneral : szFmtErrGeneral),
+ rgszErr[err-1]);
+ }
+
+ // display error/warning
+ DisplayLine(szError);
+
+ // If not a warning, then clean up and exit(1)
+ if (!fWarning)
+ ErrorExit();
+}
+
+// Cleans up, and reports an error with an insertion string. Doesn't return.
+VOID FAR ItemError
+(
+ CHAR * szErrFormat,
+ LPSTR lpszItem,
+ ERR err
+)
+{
+ CHAR szItem[255];
+ CHAR szBuf[255];
+
+ Assert(lpszItem);
+ _fstrcpy(szItem, lpszItem); // copy item name near
+
+ // format the error
+ sprintf (szBuf, szErrFormat, szFileCur, szItem, rgszErr[err-1], scodeErrCur);
+
+ // then display the error
+ DisplayLine(szBuf);
+
+ // then clean up and exit(1)
+ ErrorExit();
+}
+
+
+VOID NEAR ErrorExit()
+{
+
+ // first clean up whatever mess we've left behind
+ if (hFileInput) // in error during reading
+ fclose(hFileInput); // then close the input file
+
+#if FV_CPP
+ if (szTempFile) // if error during pre-processing
+ { // or parsing, delete tmp file
+ MyRemove(szTempFile);
+ }
+#endif //FV_CPP
+
+ if (hHFile) // if error during write of .H file
+ {
+ fclose(hHFile); // then close the .H file
+ MyRemove(szHFile); // and delete partially-generated file
+ }
+
+ if (hFileOutput) // close redirected output file
+ fclose(hFileOutput);
+
+ CleanupImportedTypeLibs(); // release any imported typelibs
+
+ if (fOLEInitialized) // terminate OLE
+ OLEUNINITIALIZE();
+
+#ifdef MAC
+ if (fAppletInitialized) // terminate OLE
+ UninitOleManager(); // clean up applet
+#endif //MAC
+
+#ifdef NODEBUGALERTS
+ SetWinDebugInfo(&Olddebuginfo);
+#endif //NODEBUGALERTS
+ exit(1); // exit with error
+}
+
+
+// creates a new pathame string that is a dup of the input pathname, with the
+// extension (if any) replaced by the given extension.
+CHAR * NEAR CloneNameAddExt
+(
+ CHAR * szInputFile,
+ CHAR * szExt
+)
+{
+ CHAR * szFile;
+ CHAR * pExt;
+ CHAR * pch;
+
+ // CONSIDER:
+ // assumes the extension is no more than 3 bytes incl '.' (ie non-DBCS)
+ // (This is true for the moment - can it ever change???)
+
+ // alloc string with enough space for ".", extension, and null
+ szFile = malloc(strlen(szInputFile)+1+3+1);
+ strcpy(szFile, szInputFile); // start with input file name
+
+ // find "." (if present) that occurs after last \ or /.
+ pExt = NULL;
+ for (pch = szFile; *pch; NextChar(pch))
+ {
+ switch (*pch)
+ {
+#ifdef MAC
+ case ':':
+ case ' ': // start search over at a space
+#else //MAC
+ case '\\':
+ case '/':
+#endif //MAC
+ pExt = NULL;
+ break;
+ case '.':
+ pExt = pch;
+ break;
+ default:
+ ;
+ }
+ }
+ if (pExt == NULL) // if no extension after last '\', then
+ pExt = pch; // append an extension to the name.
+
+ strcpy (pExt, szExt); // replace extension (if present) with
+ // desired extension
+
+ return szFile;
+}
+
+#if FV_CPP
+
+#ifdef WIN32
+// created this from the WIN32 docs, using info on WinExec and CreateProcess
+// WARNING: the example given in the WIN32 docs on CreateProcess is bogus.
+VOID NEAR DoPreProcess
+(
+)
+{
+ char szBuffer[512];
+ BOOL fSuccess;
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ SECURITY_ATTRIBUTES sa;
+ DWORD dw;
+ DWORD dwExitCode;
+ HANDLE hProcess;
+ HANDLE hOutput;
+
+ memset (&si, 0, sizeof(si));
+ memset (&pi, 0, sizeof(pi));
+ memset (&sa, 0, sizeof(sa));
+
+ szTempFile = strdup(tempnam(".", "~mki")); // for pre-processed output
+
+ sa.nLength = sizeof(sa);
+ sa.bInheritHandle = TRUE;
+
+ hOutput = CreateFile(szTempFile, GENERIC_WRITE, 0, &sa,
+ CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
+
+ if (hOutput == INVALID_HANDLE_VALUE)
+ ParseError(ERR_CPP);
+
+ sprintf(szBuffer, "%s %s%s %s",
+ szCppExe, szCppOpts, szCppDefs, szInputFile);
+
+ // init si structure
+ si.cb = sizeof(si);
+ si.lpTitle = "MkTypLib: C pre-processor";
+ //si.dwX = 100; // just guessing...
+ //si.dwY = 100;
+ //si.dwXSize = 1000;
+ //si.dwYSize = 1000;
+ si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+ si.hStdOutput = hOutput;
+ //si.hStdError = hOutputError; // CONSIDER: show this to the user?
+ //si.wShowWindow = SW_SHOWMINIMIZED;
+ si.wShowWindow = SW_HIDE;
+
+ // Setting the Inherit Handles flag to TRUE so that it works when
+ // run under nmake with our output redirected.
+ fSuccess = CreateProcess(NULL, szBuffer, NULL, NULL, TRUE,
+ // this gives us a window'ed CL
+ //DETACHED_PROCESS,
+ 0,
+
+ NULL, NULL,
+ &si, &pi);
+
+ if (!fSuccess) {
+ CloseHandle(hOutput);
+ ParseError(ERR_CPP);
+ }
+
+ // if we were successful, now wait for it to be done
+ hProcess = pi.hProcess;
+
+ // wait for the process to complete (120 second timeoout)
+ dw = WaitForSingleObject(pi.hProcess, 120000L);
+
+#ifndef STATUS_SUCCESS
+ #define STATUS_SUCCESS 0
+#endif
+
+ if (dw == STATUS_SUCCESS)
+ fSuccess = GetExitCodeProcess(pi.hProcess, &dwExitCode);
+
+ CloseHandle(pi.hThread);
+ CloseHandle(pi.hProcess);
+ CloseHandle(hOutput);
+
+ // report any error
+ if (dw != STATUS_SUCCESS || !fSuccess || dwExitCode != 0)
+ ParseError(ERR_CPP);
+}
+
+#else //WIN32
+
+// pre-process input file, creating a tmp file
+// In order to get the return code of the C pre-processor, I'm
+// spawing a batch file that invokes CL, and creates a signal file
+// if it is successful.
+VOID NEAR DoPreProcess
+(
+)
+{
+ char szBuffer[255];
+
+ HANDLE hInstCpp;
+ TASKENTRY taskentry;
+ FILE * hFile;
+ CHAR * szTempBatch;
+ CHAR * szTempSig;
+ CHAR * szTempRoot;
+ ERR err = ERR_CPP; // assume error
+ int cbTempFilenames;
+ char * szComSpec;
+
+ // figure out the names of the temp files
+ // (note: uses OEM char set)
+ szTempRoot = tempnam(".", "~mkt"); // get base name for temp files
+ hFile = fopen(szTempRoot, "w"); // create the file now, to
+ if (hFile == NULL) // reserve this set of names
+ ParseError(ERR_CPP);
+ fclose(hFile);
+
+ cbTempFilenames = strlen(szTempRoot)+1+3+1; // base name + ext + null
+ szTempBatch = malloc(cbTempFilenames); // for .BAT file
+ strcpy(szTempBatch, szTempRoot);
+ strcat(szTempBatch, ".bat");
+
+ szTempSig = malloc(cbTempFilenames); // for .SIG file
+ strcpy(szTempSig, szTempRoot);
+ strcat(szTempSig, ".sig");
+
+ szTempFile = malloc(cbTempFilenames); // for pre-processed oupput
+ strcpy(szTempFile, szTempRoot);
+ strcat(szTempFile, ".inp");
+
+ // CONSIDER: Check for existence of any of these files, if any exist, then
+ // CONSIDER: try a different base name for the files.
+
+ // open the temp .BAT file
+ hFile = fopen(szTempBatch, "w");
+ if (hFile == NULL)
+ goto cleanup2;
+
+ // all errors after this point should go to 'cleanup'
+
+ if (fputs(szBatchStart, hFile) < 0) // write the first part
+ goto cleanup;
+
+ sprintf(szBuffer, "%s %s%s %s>",
+ szCppExe, szCppOpts, szCppDefs, szInputFile);
+
+ // convert this string to the OEM char set
+ AnsiToOem(szBuffer, szBuffer);
+
+ // append szTempFile
+ strcat(szBuffer, szTempFile);
+ strcat(szBuffer, "\n");
+
+ if (fputs(szBuffer, hFile) < 0) // write the CPP command
+ goto cleanup;
+
+ sprintf(szBuffer, szBatchEnd, szTempSig);
+ if (fputs(szBuffer, hFile) < 0) // write the error check code
+ goto cleanup;
+
+ fclose(hFile);
+ hFile = NULL; // file no longer open
+
+ szComSpec = getenv("COMSPEC");
+ if (szComSpec == NULL)
+ szComSpec = "command.com";
+
+ sprintf(szBuffer, "%s /c %s", szComSpec, szTempBatch);
+ hInstCpp = WinExec(szBuffer, SW_SHOWMINIMIZED); // shell the pre-processor
+ if (hInstCpp < 32) // if error spawning pre-processor
+ goto cleanup;
+
+ Yield(); // give it a chance to start
+
+ // find task associated with this instance. In extreme cases it may have
+ // finished even before we're executing this code.
+ taskentry.dwSize = sizeof(TASKENTRY);
+ if (TaskFirst(&taskentry) == 0) {
+ goto taskdone;
+ }
+
+ while (taskentry.hInst != hInstCpp) {
+ if (TaskNext(&taskentry) == 0) {
+ goto taskdone;
+ }
+ }
+
+ hTaskCpp = taskentry.hTask;
+
+ while (IsTask(hTaskCpp))
+ {
+ SideAssert(TaskFindHandle(&taskentry, hTaskCpp) != 0);
+ if (taskentry.hInst != hInstCpp)
+ {
+ // different hInst associated with this htask,
+ // so the app must have terminated
+ break;
+ }
+
+ Yield(); // wait until it's done
+
+ }
+
+taskdone:
+
+ // If signal file doesn't exist, then there was a problem pre-processing
+ // the input file. If it exists, then it worked.
+ if (!MyRemove(szTempSig))
+ err = ERR_NONE; // it worked!
+
+cleanup:
+ if (hFile) // close tmp batch file if
+ fclose(hFile); // error during write
+ SideAssert(MyRemove(szTempBatch) == 0); // delete tmp batch file
+
+cleanup2:
+ SideAssert(MyRemove(szTempRoot) == 0); // delete placeholder file
+
+ if (err != ERR_NONE) // report any error
+ ParseError(err);
+}
+
+#endif // WIN32
+#endif // FV_CPP
+
+
+// ******************************************************
+// FParseCl() - Commandline argument parser
+//
+// Purpose:
+// Parse the command line
+//
+// Entry:
+// None
+//
+// Exit:
+// Returns ARGS_OK or GIVE_USAGE
+// ******************************************************
+SHORT NEAR FParseCl
+(
+int argc,
+CHAR *argv[]
+)
+{
+ CHAR *arg; // pointer to current argument
+ SHORT i; // argument counter
+ BOOL fAlignSpecified = FALSE; // TRUE iff the /align switch was used
+
+#if FV_CPP
+ *szCppDefs = '\0'; // no definitions initially
+#endif //FV_CPP
+
+ for (i = 1; i < argc; i++)
+ { // while more args to get
+ arg = argv[i]; // get next argument
+
+ if (*arg == '/' || *arg == '-') // a switch
+ {
+GotArg:
+ arg++; // skip switch
+
+ if (!stricmp(arg,"?") || !(stricmp(arg, "help")))
+ fGiveUsage = TRUE; // give help
+
+ else if (!stricmp(arg,"nologo"))
+ fNologo = TRUE; // no banner
+
+ else if (!stricmp(arg,"win16"))
+ {
+ SysKind = SYS_WIN16; // make Win16 type library
+ f2DefaultCC = f2CDECL;
+ if (!fAlignSpecified)
+ iAlignMax = 1;
+ iAlignDef = 1;
+ }
+
+ else if (!stricmp(arg,"win32"))
+ {
+ SysKind = SYS_WIN32; // make Win32 type library
+ f2DefaultCC = f2STDCALL;
+ if (!fAlignSpecified)
+ iAlignMax = 4;
+ iAlignDef = 4;
+ }
+
+ else if (!stricmp(arg,"mac"))
+ {
+ SysKind = SYS_MAC; // make Mac type library
+ f2DefaultCC = f2CDECL;
+ if (!fAlignSpecified)
+ iAlignMax = 2;
+ iAlignDef = 2;
+ }
+
+ else if (!stricmp(arg,"mips"))
+ {
+ SysKind = SYS_WIN32;
+ f2DefaultCC = f2STDCALL;
+ if (!fAlignSpecified)
+ iAlignMax = 8;
+ iAlignDef = 8;
+ }
+ else if (!stricmp(arg,"alpha"))
+ {
+ SysKind = SYS_WIN32;
+ f2DefaultCC = f2STDCALL;
+ if (!fAlignSpecified)
+ iAlignMax = 8;
+ iAlignDef = 8;
+ }
+
+ else if (!stricmp(arg,"ppc32"))
+ {
+ SysKind = SYS_WIN32;
+ f2DefaultCC = f2STDCALL;
+ if (!fAlignSpecified)
+ iAlignMax = 8;
+ iAlignDef = 8;
+ }
+
+ else if (!stricmp(arg,"ppc"))
+ {
+ SysKind = SYS_MAC;
+ f2DefaultCC = f2STDCALL;
+ if (!fAlignSpecified)
+ iAlignMax = 8;
+ iAlignDef = 8;
+ }
+
+ else if (!stricmp(arg,"align")) // set alignment val
+ { // next arg is integer val
+ if (++i == argc) // no more args!
+ return GIVE_USAGE;
+ iAlignMax = atoi(argv[i]);
+ if (iAlignMax < 1)
+ return GIVE_USAGE;
+ fAlignSpecified = TRUE;
+ }
+ else if (!stricmp(arg,"w0"))
+ fSuppressWarnings = TRUE; // no warnings
+#ifdef DEBUG
+ else if (!stricmp(arg,"debug"))
+ fDebug = TRUE; // dump debug info
+#endif //DEBUG
+ else if (!stricmp(arg,"tlb"))
+ { // next arg should be filename -- get it
+ if (++i == argc) // error if no more args
+ return GIVE_USAGE;
+ szTypeLibFile = strdup(argv[i]); // save filename
+ }
+ else if (!stricmp(arg,"h"))
+ { // next arg should be filename -- get it
+ fHFile = TRUE; // want a .H file
+ if (++i == argc) // we're done if no more args
+ break;
+ arg = argv[i]; // get next argument
+
+ // if this is another arg, then just process it
+ if (*arg == '/' || *arg == '-')
+ goto GotArg;
+ szHFile = strdup(arg); // save .H filename
+ }
+ else if (!stricmp(arg,"o"))
+ { // next arg should be filename -- get it
+ if (++i == argc) // error if no more args
+ return GIVE_USAGE;
+ szOutputFile = strdup(argv[i]); // save filename
+ }
+#if FV_CPP
+ else if (*arg == 'D' || *arg == 'I')
+ { // append this /D or /I switch to szCppDefs
+
+ strcat(szCppDefs, " "); // append a space
+ strcat(szCppDefs, argv[i]); // save /D, /I switch
+
+ if (*(arg+1) == '\0')
+ { // /D or /I specified by themselves, then
+ // next arg is what's important -- append
+ // that, too
+ if (++i == argc) // error if no more args
+ return GIVE_USAGE;
+ strcat(szCppDefs, " "); // add a space
+ strcat(szCppDefs, argv[i]); // add CPP defs
+ }
+ // I don't feel like adding to ton of code to keep
+ // us from overflowing the buffer. Instead, we've
+ // got a really big buffer, so if we overwrite it,
+ // give an error & hope we don't crash on exit.
+ if (strlen(szCppDefs) >= sizeof(szCppDefs)-1) {
+ return GIVE_USAGE;
+ }
+ }
+ else if (!stricmp(arg,"cpp_cmd"))
+ { // next arg should be CPP pathname -- get it
+ if (++i == argc) // error if no more args
+ return GIVE_USAGE;
+ szCppExe = strdup(argv[i]); // save pathname
+ }
+ else if (!stricmp(arg,"cpp_opt"))
+ { // next arg should be CPP options (in quotes)
+ if (++i == argc) // error if no more args
+ return GIVE_USAGE;
+ szCppOpts = strdup(argv[i]); // get CPP options
+ }
+ else if (!stricmp(arg,"nocpp"))
+ fCPP = FALSE; // don't use C pre-processor
+#endif //FV_CPP
+ else // invalid switch
+ return GIVE_USAGE;
+ }
+ else
+ { // not a switch -- should be a filename
+ if (szInputFile) // only 1 filename allowed
+ return GIVE_USAGE;
+ szInputFile = strdup(arg); // store input filename
+ }
+ } // end for
+
+#ifndef MAC
+ // doesn't matter if filename not given -- common dialog will take care
+ // of it later.
+ return ARGS_OK;
+#else //!MAC
+ if (szInputFile) // if filename specified, then success
+ return ARGS_OK;
+
+ return GIVE_USAGE; // no file name given -- error
+#endif //!MAC
+
+}
+
+
+// display a line to the user. Assumes line doesn't end with a newline.
+VOID FAR DisplayLine(CHAR * szOutput)
+{
+ if (hFileOutput)
+ {
+#ifndef MAC
+ // convert szOutput in-place to OEM char set
+ AnsiToOem(szOutput, szOutput);
+#endif // !MAC
+
+ fputs(szOutput, hFileOutput);
+ fputs("\n", hFileOutput);
+
+#ifndef MAC
+ // convert back to ANSI in case the caller reuses this string
+ OemToAnsi(szOutput, szOutput);
+#endif // !MAC
+
+ }
+ else
+ {
+#ifdef NO_MPW
+ MacMessageBox(szOutput);
+#else //NO_MPW
+#ifndef WIN16
+
+#ifndef MAC
+ // convert szOutput in-place to OEM char set
+ AnsiToOem(szOutput, szOutput);
+#endif // !MAC
+
+ printf("%s\n", szOutput);
+
+#ifndef MAC
+ // convert back to ANSI in case the caller reuses this string
+ OemToAnsi(szOutput, szOutput);
+#endif // !MAC
+
+#else //!WIN16
+ // poor man's output under Windows
+ MessageBox(NULL, szOutput, szAppTitle, MB_OK);
+#endif //!WIN16
+#endif //NO_MPW
+ }
+}
+
+
+#ifdef DEBUG
+
+// not used in non-dimalloc versions, but it simplifies the link process
+//#ifdef USE_DIMALLOC
+/***
+*DebAssertShow - called when assertion fails
+*Purpose:
+* This function is called when an assertion fails. It prints
+* out the appropriate information and exits.
+*
+*Entry:
+* szFileName - filename where assertion failed
+* uLine - line number where assertion failed
+* szComment - reason assertion failed
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+void DebAssertShow(LPSTR lpszFileName, UINT uLine, LPSTR szComment)
+{
+ CHAR szFileName[255];
+ _fstrcpy(szFileName, lpszFileName); // copy near
+
+ AssertFail(szFileName, (WORD)uLine);
+}
+
+//#endif // USE_DIMALLOC
+
+
+
+VOID AssertFail
+(
+ CHAR * szFile,
+ WORD lineNo
+)
+{
+ CHAR szAssert[256];
+#ifndef MAC
+ int id;
+#endif //!MAC
+
+#ifdef MAC
+ *szAssert = sprintf(szAssert+1, "Typelib assertion: File %s, line %d", szFile, lineNo);
+#else //MAC
+ sprintf(szAssert, "Assertion failed. File %s, line %d.", szFile, lineNo);
+
+#endif //MAC
+
+ if (hFileOutput)
+ {
+ fputs(szAssert, hFileOutput);
+ fputs("\n", hFileOutput);
+ ErrorExit(); // clean up and exit(1)
+ }
+ else
+ {
+#ifdef MAC
+ // Can't use the the Ole2 internal assertion mechanism anymore,
+ // because if we're using the retail OLE, it doesn't assert.
+ // So we just break into macsbug ourselves.
+ //FnAssert(lpstrExpr, lpstrMsg, lpstrFileName, iLine);
+ DebugStr((const unsigned char FAR*)szAssert);
+ // ErrorExit(); // don't clean up and exit(1)
+#else
+ id = MessageBox(NULL, szAssert, "MkTypLib Assertion. OK to continue, CANCEL to quit.", MB_OKCANCEL);
+ if (id == IDCANCEL)
+ ErrorExit(); // clean up and exit(1)
+#endif //MAC
+ }
+}
+
+#if 0
+// output a string, debug version only. Assumes string ends with a newline.
+VOID DebugOut
+(
+ CHAR * szOut
+)
+{
+
+#ifndef MAC
+ int id;
+#endif //!MAC
+
+ if (hFileOutput)
+ {
+ fputs(szOut, hFileOutput);
+ fputs("\n", hFileOutput);
+ }
+ else
+ {
+#ifdef MAC
+ MacMessageBox(szOut);
+#else //MAC
+ id = MessageBox(NULL, szOut, "MkTypLib debug output. OK to continue, CANCEL to quit.", MB_OKCANCEL);
+ if (id == IDCANCEL)
+ ErrorExit(); // clean up and exit(1)
+#endif //MAC
+ }
+}
+#endif //0
+
+#endif //DEBUG
+
+#ifdef MAC
+#ifdef NO_MPW
+// UNDONE: eventually rip this & and it's resource from the MPW mktyplib build
+VOID MacMessageBox
+(
+ CHAR * szOutput
+)
+{
+ BYTE szBufTmp[256];
+
+ // convert to pascal-style string
+ *szBufTmp = (BYTE)(min(strlen(szOutput), 255));
+ strncpy(szBufTmp+1, szOutput, *szBufTmp);
+
+ // put up the alert
+ ParamText((ConstStr255Param)szBufTmp, "", "", "");
+ Alert(128, NULL);
+}
+#endif //NO_MPW
+#endif //MAC
+
+
+// initialize g_rgchLeadBytes
+//
+// use the Windows API IsDBCSLeadByte() or the Mac API ParseTable()
+//
+static VOID InitLeadByteTable()
+{
+#if MAC
+
+ // as in Silver, the font must be switched first
+
+ // preserve the old font in the current grafPort
+ short fontSave = qd.thePort->txFont;
+
+ // then set the grafPort font to 1 (Application Default) because
+ // ParseTable uses qd.thePort->txFont to determine the currect script,
+ // which in turn determines the lead byte table. We want the application
+ // default table.
+ TextFont(1);
+
+ // UNDONE: is it necessary to init this to 0?
+ memset(g_rgchLeadBytes, 0, 256);
+
+ ParseTable(g_rgchLeadBytes);
+
+ // restore the old font
+ TextFont(fontSave);
+
+#else // !MAC
+
+ int c;
+
+ memset(g_rgchLeadBytes, 0, 128);
+
+ // start at 128 since there aren't any lead bytes before that
+ for(c = 128; c < 256; c++) {
+ g_rgchLeadBytes[c] = (char)IsDBCSLeadByte((char)c);
+ }
+
+#endif // !MAC
+}
+
+// perform AnsiNext on all platforms
+extern char * XStrInc(char * pch)
+{
+ return IsLeadByte(*pch) ? pch + 2 : pch + 1;
+}
+
diff --git a/private/oleauto/src/mktyplib/mktyplib.def b/private/oleauto/src/mktyplib/mktyplib.def
new file mode 100644
index 000000000..3b5af8440
--- /dev/null
+++ b/private/oleauto/src/mktyplib/mktyplib.def
@@ -0,0 +1,7 @@
+NAME MKTYPLIB WINDOWAPI
+EXETYPE WINDOWS 3.1
+CODE PRELOAD MOVABLE DISCARDABLE
+DATA PRELOAD SINGLE
+HEAPSIZE 1024
+EXPORTS
+ WEP
diff --git a/private/oleauto/src/mktyplib/mktyplib.h b/private/oleauto/src/mktyplib/mktyplib.h
new file mode 100644
index 000000000..290e8e294
--- /dev/null
+++ b/private/oleauto/src/mktyplib/mktyplib.h
@@ -0,0 +1,162 @@
+/* single line comments and other horrid extensions are ok */
+#pragma warning(disable:4001)
+#pragma warning(disable:4201)
+#pragma warning(disable:4209)
+
+#ifdef WIN32
+
+#define __export
+#define EXPORT
+/* This line specifies widechar ctype table instead of ascii (ctype.h). */
+#define _NEWCTYPETABLE
+
+// force include of OLE2 rather than OLE1
+#define INC_OLE2
+// Yea, right...
+#define WIN32_LEAN_AND_MEAN
+#endif //WIN32
+
+#ifndef MAC
+#include <windows.h>
+#endif //!MAC
+
+// general typedef's and define's for use in MKTYPLIB
+#define TRUE 1
+#define FALSE 0
+
+// extend stuff in dispatch.h for RISC builds
+#define SYS_MAX (SYS_MAC+1)
+
+// environment-specific defines
+#ifdef MAC
+#define FAR
+#define NEAR
+#define SYS_DEFAULT SYS_MAC
+#define ALIGN_MAX_DEFAULT 2
+//UNDONE: SYS_MAC_PPC?
+#else //MAC
+#ifdef WIN32
+// defined by NT's windows.h
+#ifndef FAR
+#define FAR
+#endif
+//#define NEAR
+#define SYS_DEFAULT SYS_WIN32
+#if defined(_MIPS_) || defined(_ALPHA_) || defined(_PPC_)
+#define ALIGN_MAX_DEFAULT 8
+#else //_MIPS_ || _ALPHA_ || _PPC_
+#define ALIGN_MAX_DEFAULT 4
+#endif //_MIPS_ || _ALPHA_ || _PPC_
+#else //WIN32
+#define FAR _far
+#define NEAR _near
+#define SYS_DEFAULT SYS_WIN16
+#define ALIGN_MAX_DEFAULT 1
+#endif //WIN32
+#endif //MAC
+
+// basic types
+#undef VOID // windows.h #defines these instead of using
+#undef LONG // a typedef, but ole2.h typedef's them
+typedef void VOID;
+typedef char CHAR;
+typedef short SHORT;
+typedef int INT;
+typedef long LONG;
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned long DWORD;
+typedef unsigned short USHORT;
+typedef unsigned int UINT;
+typedef unsigned long ULONG;
+typedef int BOOL;
+typedef CHAR FAR * LPSTR;
+typedef VOID FAR * LPVOID;
+
+#ifdef MAC // no windows.h -- OLE headers need the following
+//#define SIZEL LONG
+#define LPSIZE LPVOID
+#define LPRECT LPVOID
+#define Byte BYTE
+#define _MAC // for OLE include files
+#define USE_INCLUDE // for OLE include files
+#define CDECL _cdecl
+#define PASCAL _pascal
+typedef const CHAR * LPCSTR; // sz
+#include <types.h>
+#endif
+
+#ifndef WIN16
+#define _fmalloc malloc
+#define _ffree free
+#define _fmemcpy memcpy
+#define _fmemcmp memcmp
+#define _fstrcpy strcpy
+#define _fstrcmp strcmp
+#define _fstrcmpi strcmpi
+#define _fstrdup strdup
+#define _fstrcat strcat
+#endif
+
+
+// basic defines
+#ifndef WIN32 // defined by NT's windows.h
+#define LOWORD(l) ((WORD)(DWORD)(l))
+#define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xFFFF))
+#endif //WIN32
+
+// *******************************************************
+// switches
+// *******************************************************
+#define FV_PROPSET FALSE // don't allow PROPERTY_SETs
+
+#ifdef MAC
+#define FV_CPP FALSE // no C pre-processor for MAC
+#else //MAC
+#define FV_CPP TRUE // support spawning C pre-processor
+#endif //MAC
+
+// *******************************************************
+// misc types
+// *******************************************************
+
+// DBCS support
+
+extern char g_rgchLeadBytes[]; // lead byte table
+
+#define NextChar(pch) (pch = XStrInc(pch))
+#define IsLeadByte(ch) (g_rgchLeadBytes[(unsigned char)ch])
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+extern char * FAR XStrChr(char * xsz, int ch); // wrapper for strchr
+extern char * XStrInc(char * pch); // AnsiNext-like function
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern VOID FAR DisplayLine(CHAR * szLine); // cover for printf/messagebox
+
+// debug support
+#ifdef DEBUG
+extern VOID DebugOut(CHAR *); // cover for puts/messagebox
+extern BOOL fDebug; // TRUE if /debug specified on command line
+extern VOID AssertFail(CHAR *, WORD);
+#define Assert(expr) if (!(expr)) AssertFail(__FILE__, __LINE__);
+#define SideAssert(expr) Assert(expr)
+#else // DEBUG
+#define Assert(expr)
+#define SideAssert(expr) expr;
+#endif // DEBUG
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/src/mktyplib/mktyplib.ico b/private/oleauto/src/mktyplib/mktyplib.ico
new file mode 100644
index 000000000..ab9ac2165
--- /dev/null
+++ b/private/oleauto/src/mktyplib/mktyplib.ico
Binary files differ
diff --git a/private/oleauto/src/mktyplib/mktyplib.r b/private/oleauto/src/mktyplib/mktyplib.r
new file mode 100644
index 000000000..e4ab9fdf7
--- /dev/null
+++ b/private/oleauto/src/mktyplib/mktyplib.r
@@ -0,0 +1,165 @@
+#include "types.r"
+#include "systypes.r"
+//#include "ebappids.h"
+//#include "resids.h"
+#include "verstamp.h"
+
+#define STRING(x) #x
+
+
+#ifdef MKTYPLIB2 // only if special build
+
+resource 'ALRT' (128) {
+ {38, 44, 260, 438},
+ 128,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, sound1,
+ /* [2] */
+ OK, visible, sound1,
+ /* [3] */
+ OK, visible, sound1,
+ /* [4] */
+ OK, visible, sound1
+ }
+};
+
+resource 'DITL' (128) {
+ { /* array DITLarray: 2 elements */
+ /* [1] */
+ {194, 150, 214, 208},
+ Button {
+ enabled,
+ "Ok"
+ },
+ /* [2] */
+ {14, 17, 184, 380},
+ StaticText {
+ disabled,
+ "^0"
+ }
+ }
+};
+#endif //MKTYPLIB2
+
+
+resource 'SIZE' (-1) {
+ reserved,
+ acceptSuspendResumeEvents,
+ reserved,
+ canBackground, /* we can background; we don't currently, but our sleep value */
+ /* guarantees we don't hog the Mac while we are in the background */
+ multiFinderAware, /* this says we do our own activate/deactivate; don't fake us out */
+ backgroundAndForeground, /* this is definitely not a background-only application! */
+ dontGetFrontClicks, /* change this is if you want "do first click" behavior like the Finder */
+ ignoreChildDiedEvents, /* essentially, I'm not a debugger (sub-launching) */
+ is32BitCompatible, /* this app should not be run in 32-bit address space */
+ isHighLevelEventAware,
+ reserved,
+ reserved,
+ useTextEditServices,
+ reserved,
+ reserved,
+ reserved,
+ 2048 * 1024, // preferred size
+ 512 * 1024 // min size
+};
+
+
+#ifdef MKTYPLIB2 // only if special build
+resource 'BNDL' (1009) {
+ 'mktl',
+ 0,
+ { /* array TypeArray: 2 elements */
+ /* [1] */
+ 'FREF',
+ { /* array IDArray: 2 elements */
+ /* [1] */
+ 0, 128,
+ /* [2] */
+ 1, 129
+ },
+ /* [2] */
+ 'ICN#',
+ { /* array IDArray: 2 elements */
+ /* [1] */
+ 0, 128,
+ /* [2] */
+ 1, 129
+ }
+ }
+};
+
+data 'mktl' (0, "Owner resource") {
+ $"00" /* . */
+};
+
+resource 'FREF' (128) {
+ 'APPL',
+ 0,
+ ""
+};
+
+data 'FREF' (129) {
+ $"5445 5854 0001 7F" /* TEXT... */
+};
+
+resource 'ICN#' (128) {
+ { /* array: 2 elements */
+ /* [1] */
+ $"0000 0000 0000 0000 0000 0000 0000 0000"
+ $"0048 C000 0023 8000 0031 8003 0009 0803"
+ $"000C 1FFE 0006 03C6 0006 01EC 0006 0078"
+ $"0006 0070 00FD E050 077F F030 0DEF F870"
+ $"0B1B 1A70 1B80 04F0 1384 03F0 1A00 01F0"
+ $"1800 0030 0C80 80B0 0F80 2138 0700 FDF8"
+ $"0FF6 FFF0 3FFF FFF4 7FFF FDFC 3FFF DFFE",
+ /* [2] */
+ $"0000 0000 0000 0000 0000 0000 0000 0000"
+ $"006A C000 0033 8000 003F 8003 000F 1C07"
+ $"000E 1FFE 0006 07FE 0006 01FC 0006 00F8"
+ $"0006 0078 00FF E078 07FF F870 0FFF FC70"
+ $"0FFF FE70 1FFF FFF0 1FFF FFF0 1FFF FFF0"
+ $"1FFF FFF0 0FFF FFF8 0FFF FFF8 07FF FFF8"
+ $"0FFF FFF0 3FFF FFF4 7FFF FFFC 3FFF DFFE"
+ }
+};
+
+resource 'ICN#' (129) {
+ { /* array: 2 elements */
+ /* [1] */
+ $"0000 0000 0000 0000 01FF FF80 0100 00C0"
+ $"0100 00A0 0100 0090 0103 E088 0106 30FC"
+ $"010C 1004 0108 1004 0108 1004 0108 13E4"
+ $"0108 1634 0108 2414 010C 6C14 0107 C814"
+ $"0100 0814 0100 0FE4 0100 1864 0100 1024"
+ $"0100 2024 0100 2024 0100 6064 0100 40C4"
+ $"0100 7F84 0100 0004 0100 0004 0100 0004"
+ $"01FF FFFC",
+ /* [2] */
+ $"0000 0000 0000 0000 01FF FF80 01FF FFC0"
+ $"01FF FFE0 01FF FFF0 01FF FFF8 01FF FFFC"
+ $"01FF FFFC 01FF FFFC 01FF FFFC 01FF FFFC"
+ $"01FF FFFC 01FF FFFC 01FF FFFC 01FF FFFC"
+ $"01FF FFFC 01FF FFFC 01FF FFFC 01FF FFFC"
+ $"01FF FFFC 01FF FFFC 01FF FFFC 01FF FFFC"
+ $"01FF FFFC 01FF FFFC 01FF FFFC 01FF FFFC"
+ $"01FF FFFC"
+ }
+};
+#endif //MKTYPLIB2
+
+
+// version info
+// "MkTypLib App, (c) Microsoft Corp. 1993-1994"
+#define VERSTRINGX(maj,min,rev) STRING(maj ## . ## min ## . ## rev)
+#define VERSTRING VERSTRINGX(rmj,rmm,rup)
+resource 'vers' (1, purgeable) {
+ 0x00,
+ 0x00,
+ development,
+ 0x00,
+ verUS,
+ VERSTRING,
+ VERSTRING,
+};
diff --git a/private/oleauto/src/mktyplib/mktyplib.rc b/private/oleauto/src/mktyplib/mktyplib.rc
new file mode 100644
index 000000000..290af7f94
--- /dev/null
+++ b/private/oleauto/src/mktyplib/mktyplib.rc
@@ -0,0 +1,87 @@
+/***
+*mktyplib.rc - Resource file for MKTYPLIB.EXE
+*
+* Copyright (C) 1992 - 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is the resource file for MKTYPLIB.EXE.
+*
+*
+*Revision History:
+* [01] 23-Feb-93 dougf: added version resource.
+*
+*****************************************************************************/
+
+/* first include the icon */
+1 ICON "mktyplib.ico"
+
+/* then include all the stuff necessary for proper version information */
+#include <windows.h>
+#ifndef WIN32
+#include <ver.h>
+#endif
+
+#include "verstamp.h"
+
+/* override some stuff in verstamp.h */
+#undef rmj
+#define rmj 2
+#undef rmm
+// want version # to be 2.02.xxx
+#define rmm 02
+
+/* Define the version string with more preprocessor magic */
+#define STRING(x) #x
+#define VERSTRINGX(maj,min,rev) STRING(maj ## . ## min ## . ## rev ## \0)
+#define VERSTRING VERSTRINGX(rmj,rmm,rup)
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION rmj,rmm,rup,01
+PRODUCTVERSION rmj,rmm,rup,01
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+
+#if 0
+#define BETAFLAG VS_FF_PRERELEASE
+#else //1
+#define BETAFLAG 0L
+#endif //1
+
+#ifdef _DEBUG
+FILEFLAGS BETAFLAG | VS_FF_DEBUG
+#else
+FILEFLAGS BETAFLAG
+#endif
+
+#ifdef WIN32
+FILEOS VOS_NT_WINDOWS32
+#else //WIN32
+FILEOS VOS_DOS_WINDOWS16
+#endif //WIN32
+
+FILETYPE VFT_APP
+FILESUBTYPE 0
+
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE Automation Type Library Generator\0"
+ VALUE "FileVersion", "2.02\0"
+ VALUE "InternalName", "MKTYPLIB.EXE\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1992 - 1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.02 for Windows\0"
+ VALUE "ProductVersion", "2.02\0"
+ VALUE "Comments", "Windows OLE Tools\0"
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
diff --git a/private/oleauto/src/mktyplib/parser.c b/private/oleauto/src/mktyplib/parser.c
new file mode 100644
index 000000000..e1d31587f
--- /dev/null
+++ b/private/oleauto/src/mktyplib/parser.c
@@ -0,0 +1,3218 @@
+#include "mktyplib.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+
+#ifndef WIN32
+#include <ole2.h> // required for dispatch.h
+#include <olenls.h> // for CompareStringA
+#include "dispatch.h"
+#endif // WIN32
+
+#include "errors.h"
+#include "tokens.h"
+#include "parser.h"
+#include "fileinfo.h"
+
+// external data:
+extern FILE * hFileInput;
+
+// global variables:
+
+TYPLIB typlib; // main type structure
+TOKEN tok; // current token -- filled in by lexer
+SHORT cArgsMax = 0; // max # of args that any function has
+LCID g_lcidCompare = 0x0409; // lcid for compare purposes
+BOOL fSpecifiedInterCC = FALSE; // TRUE if an interface cc was specified
+
+// private types and data
+typedef enum {
+ FUNC_MODULE = 0,
+ FUNC_DISPINTERFACE,
+ FUNC_INTERFACE,
+ FUNC_OAINTERFACE,
+ C_FUNCTYPES
+} FUNCTYPE;
+
+static DWORD fValidFuncAttrs[C_FUNCTYPES] = {
+ VALID_MODULE_FUNC_ATTR,
+ VALID_DISPINTER_FUNC_ATTR,
+ VALID_INTERFACE_FUNC_ATTR,
+ VALID_INTERFACE_FUNC_ATTR
+};
+static DWORD fValidFuncAttrs2[C_FUNCTYPES] = {
+ VALID_MODULE_FUNC_ATTR2,
+ VALID_DISPINTER_FUNC_ATTR2,
+ VALID_INTERFACE_FUNC_ATTR2,
+ VALID_INTERFACE_FUNC_ATTR2
+};
+static DWORD fValidParmAttrs[C_FUNCTYPES] = {
+ VALID_MODULE_PARM_ATTR,
+ VALID_DISPINTER_PARM_ATTR,
+ VALID_INTERFACE_PARM_ATTR,
+ VALID_INTERFACE_PARM_ATTR
+};
+static DWORD fValidParmAttrs2[C_FUNCTYPES] = {
+ VALID_MODULE_PARM_ATTR2,
+ VALID_DISPINTER_PARM_ATTR2,
+ VALID_INTERFACE_PARM_ATTR2,
+ VALID_INTERFACE_PARM_ATTR2
+};
+
+typedef struct {
+ CHAR * szName;
+ VARTYPE vt;
+} INTRINSIC_DEF;
+
+static INTRINSIC_DEF rgIntrinsics[] = {
+// NOTE: table lookup assumes that unsigned versions follow signed versions
+ "char", VT_I1,
+ "char", VT_UI1,
+ "int", VT_INT,
+ "int", VT_UINT,
+ "short", VT_I2,
+ "short", VT_UI2,
+ "long", VT_I4,
+ "long", VT_UI4,
+ "boolean", VT_BOOL,
+ "double", VT_R8,
+ "float", VT_R4,
+ "CURRENCY", VT_CY,
+ "DATE", VT_DATE,
+ "VARIANT", VT_VARIANT,
+ "void", VT_VOID,
+ "BSTR", VT_BSTR,
+ "HRESULT", VT_HRESULT,
+ "SCODE", VT_ERROR,
+ // LPSTR is handled in InitIntrinsicTypes()
+ // wchar_t and LPWSTR are handled in InitIntrinsicTypes()
+ NULL, 0 // end of list
+};
+
+static LPTYPE lpType_LPSTR;
+static LPTYPE lpType_DISPATCH;
+static LPTYPE lpType_UNKNOWN;
+static LPTYPE lpType_LPWSTR;
+static LPTYPE lpType_wchar_t;
+
+static LPENTRY lpEntryPrev;
+static LPTYPE lpTypeIDispatch = NULL;
+static LPTYPE lpTypeIUnknown = NULL;
+
+// bit flags returned by GetTypeCompatibility
+#define COMPAT_NONE 0 // any old thing
+#define COMPAT_IDISPATCH 1 // IDispatch-compatible types
+#define COMPAT_OA 2 // OA compatible type
+#define COMPAT_DUALBASE 4 // suitable for use as base of a DUAL interface
+
+// bit to mark a type we're checking for OA compatibility as a parameter.
+#define VT_PARAM VT_VECTOR
+
+// external data
+extern SYSKIND SysKind;
+extern DWORD f2DefaultCC;
+
+// external routines
+extern VOID FAR ParseInit(CHAR * szFile);
+extern VOID FAR ConsumeTok(TOKID id, WORD fAccept);
+extern VOID FAR ScanTok(WORD fAccept);
+extern LPVOID FAR ParseMalloc(WORD cbAlloc);
+extern VOID FAR LoadExtTypeLib(LPIMPORTLIB pImpLib);
+extern LPTYPE FAR FindExtType(LPSTR szLibName, LPSTR szTypeName);
+
+// prototypes for exported routines
+VOID FAR ParseOdlFile(CHAR * szFile);
+INT FAR FCmpCaseIns(LPSTR str1, LPSTR str2);
+LPTYPE FAR lpTypePublic(LPTYPE lpType);
+
+// prototypes for internal routines
+VOID NEAR ParseLibrary(VOID);
+VOID NEAR ParseOptAttr(LPATTR pAttr, WORD wContext);
+VOID NEAR ParseNewElem(LPELEM FAR * lplpElem,
+ DWORD validElemAttr,
+ DWORD validElemAttr2,
+ LPTYPE lpType);
+VOID NEAR ParseElem(LPELEM lpElem, WORD fAllow, LPTYPE lpType);
+VOID NEAR ParseStructEnumUnion(LPENTRY lpEntry, TENTRYKIND tentrykind);
+VOID NEAR ParseNewEnumElem(LPELEM FAR * lplpElem, long * pEnumVal);
+VOID NEAR ParseTypedef(LPENTRY lpEntry);
+VOID NEAR ParseAlias(LPENTRY lpEntry);
+LPTYPE NEAR ParseKnownType(LPATTR pAttr, WORD fAllow);
+VOID NEAR ParseElemName(LPELEM lpElem, WORD fAllow);
+VOID NEAR ParseModule(VOID);
+VOID NEAR ParseInterface(VOID);
+VOID NEAR ParseDispinterface(VOID);
+VOID NEAR ParseCoclass(VOID);
+VOID NEAR ParseFunction(LPFUNC lpFunc, FUNCTYPE funcType);
+VOID NEAR ParseProperty_Set(VOID);
+VOID NEAR ParseImportlib(VOID);
+VOID NEAR CheckAttr(LPATTR pAttr, DWORD attrbit, DWORD attrbit2);
+VOID NEAR CheckAttrTokLast(LPATTR pAttr, DWORD attrbit, DWORD attrbit2);
+VOID NEAR GotAttr(LPATTR pAttr, DWORD attrbit);
+VOID NEAR GotAttr2(LPATTR pAttr2, DWORD attrbit2);
+VOID NEAR ConsumeRCurlyOptSemi(WORD fAccept);
+LPSTR NEAR ConsumeId(VOID);
+LPSTR NEAR lpszParseStringExpr();
+DWORD NEAR lParseNumericExpr(VOID);
+DWORD NEAR lParseNumber(VOID);
+VOID NEAR InitIntrinsicTypes(VOID);
+LPTYPE NEAR InitIntrinsic(CHAR * szName, VARTYPE vt);
+LPTYPE NEAR FindTypeArray(LPTYPE lpTypeBase);
+LPTYPE NEAR FindTypeInd(LPTYPE lpTypeBase, short cIndirect);
+LPTYPE NEAR FindType(LPSTR lpszName, BOOL fUnsigned, TENTRYKIND tentrykind);
+VARTYPE NEAR GetStringType(LPTYPE lpTypeBase);
+VOID NEAR EnsureNoDupEntries(LPENTRY lpEntryLast);
+VOID NEAR EnsureNoDupElem(LPELEM lpElemLast);
+BOOL NEAR IsType(LPTYPE lpType, VARTYPE vt);
+BOOL NEAR FHandleForwardDecl(LPENTRY lpEntry, TENTRYKIND tentrykind);
+VOID NEAR CheckForwardMatch(LPENTRY lpEntryLast, LPENTRY lpEntry);
+VOID NEAR InitNewEntry(LPENTRY FAR * lplpEntry);
+VOID NEAR EnsureIDispatchType(LPTYPE lpType);
+VOID NEAR EnsureOAType(LPTYPE lpType, BOOL fParam);
+WORD NEAR GetTypeCompatibility(LPTYPE lpType, WORD fRecurse);
+BOOL NEAR IsObjectType(LPTYPE lpType);
+BOOL NEAR VerifyLcid(LCID lcid);
+VOID NEAR FindIDispatch();
+
+// main parse routine
+VOID FAR ParseOdlFile
+(
+ CHAR * szFile
+)
+{
+
+ ParseInit(szFile);
+
+ ParseLibrary(); // parse library description
+ if (tok.id != RW_EOF)
+ ParseError(PERR_EXP_EOF);
+
+ fclose(hFileInput);
+ hFileInput = NULL; // we've done the close
+}
+
+
+// parse a library clause
+VOID NEAR ParseLibrary
+(
+)
+{
+
+ ParseOptAttr(&typlib.attr, cLIB); // parse attributes, if any
+
+ // ensure attributes valid in this context
+ CheckAttrTokLast(&typlib.attr, VALID_LIBRARY_ATTR, VALID_LIBRARY_ATTR2);
+
+ ConsumeTok(RW_LIBRARY, 0); // consume "library", advance to next token
+
+ // UUID required on type library
+ if (!(typlib.attr.fAttr & fUUID))
+ ParseErrorTokLast(PERR_UUID_REQ);
+
+ typlib.szLibName = ConsumeId(); // get library name
+
+ InitIntrinsicTypes(); // load type list with the intrinisc types
+
+ ConsumeTok(RW_LCURLY, 0);
+
+ // first allow any number of imported libraries
+ while (tok.id == RW_IMPORTLIB)
+ ParseImportlib();
+
+ // then allow the other sections
+ while (tok.id != RW_RCURLY)
+ {
+
+ lpEntryPrev = typlib.pEntry; // save previous entry
+
+ InitNewEntry(&typlib.pEntry); // create & init a new item
+ // in the entry list
+
+ ParseOptAttr(&(typlib.pEntry->attr), cTYPE); // parse attributes, if any
+
+ switch (tok.id)
+ {
+ case RW_TYPEDEF:
+ ParseTypedef(typlib.pEntry);
+ break;
+
+ case RW_MODULE:
+ ParseModule();
+ break;
+
+ case RW_INTERFACE:
+ ParseInterface();
+ break;
+
+ case RW_DISPINTERFACE:
+ ParseDispinterface();
+ break;
+
+ case RW_COCLASS:
+ ParseCoclass();
+ break;
+
+ case RW_IMPORTLIB:
+ ParseError(PERR_IMPLIB_NOTFIRST);
+
+ default:
+ ParseError(PERR_EXP_KEYWORD);
+ } // switch
+
+ } // while library entries
+
+ ConsumeRCurlyOptSemi(fACCEPT_EOF);
+}
+
+
+VOID NEAR InitNewEntry
+(
+ LPENTRY FAR * lplpEntryLast
+)
+{
+ LPENTRY lpEntry;
+
+ // create a new entry in list of entries
+ ListInsert(lplpEntryLast, sizeof(ENTRY));
+
+ lpEntry = *lplpEntryLast; // deref
+
+#ifdef DEBUG
+ // filled in later by the type output code (hopefully before it is used!)
+ lpEntry->lpdtinfo = (ICreateTypeInfo *)0xffffffff;
+#endif //DEBUG
+
+ lpEntry->type.tdesc.vt = VT_USERDEFINED;
+ lpEntry->type.szName = ""; // don't want this type entry to be
+ // found until we're done filling it in.
+ lpEntry->type.lptinfo = NULL;
+ lpEntry->lpEntryForward = NULL; // assume no previous forward decl
+ // for this entry
+
+ lpEntry->attr.fAttr = 0; // no attributes seen yet
+ lpEntry->attr.fAttr2 = 0;
+}
+
+
+// parses optional [<attributes>]
+// initializes 'Attr' structure with current attributes.
+VOID NEAR ParseOptAttr
+(
+ LPATTR pAttr,
+ WORD wContext
+)
+{
+ TOKID attrId;
+ DWORD lTemp;
+
+ pAttr->fAttr = 0; // no attributes seen yet
+ pAttr->fAttr2 = 0;
+ if (tok.id == RW_LBRACKET)
+ {
+ ScanTok(fACCEPT_ATTR); // consume '['
+
+ // keep going until we encounter a right bracket
+ while ((attrId = tok.id) != RW_RBRACKET)
+ {
+ ScanTok(fACCEPT_ATTR); // advance to next token
+ switch (attrId)
+ {
+
+ case ATTR_UUID: // uuid(uuid constant)
+ GotAttr(pAttr, fUUID);
+ ConsumeTok(RW_LPAREN, fACCEPT_UUID);
+ if (tok.id != LIT_UUID)
+ ParseError(PERR_INV_UUID);
+ pAttr->lpUuid = tok.lpUuid;
+ ScanTok(0); // consume UUID
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_LCID: // lcid(I4 lcid)
+ GotAttr(pAttr, fLCID);
+ // LCID attribute allowed on a param, too
+ if (wContext == cPARAM)
+ break;
+ ConsumeTok(RW_LPAREN, fACCEPT_NUMBER);
+ pAttr->lLcid = lParseNumericExpr();
+ // don't change the global if the given lcid==0
+ if (pAttr->lLcid) {
+ // make sure this is a supported lcid
+ if (!VerifyLcid(pAttr->lLcid))
+ ParseError(PERR_INV_LCID);
+ g_lcidCompare = pAttr->lLcid;
+ }
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_VERSION: // version(I2 major.I2 minor)
+ GotAttr(pAttr, fVERSION);
+ ConsumeTok(RW_LPAREN, fACCEPT_NUMBER);
+
+ lTemp = lParseNumericExpr();
+ if (HIWORD(lTemp))
+ ParseError(PERR_NUMBER_OV);
+ pAttr->wVerMajor = LOWORD(lTemp);
+
+ ConsumeTok(RW_PERIOD, fACCEPT_NUMBER);
+
+ lTemp = lParseNumericExpr();
+ if (HIWORD(lTemp))
+ ParseError(PERR_NUMBER_OV);
+ pAttr->wVerMinor = LOWORD(lTemp);
+
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_ENTRY: // entry(proc name/I2 ordinal)
+ ConsumeTok(RW_LPAREN, fACCEPT_NUMBER | fACCEPT_STRING);
+ GotAttr(pAttr, fENTRY);
+ if (tok.id == LIT_STRING)
+ {
+ pAttr->lpszProcName = tok.lpsz;
+ ScanTok(0); // consume entry string
+ }
+ else
+ { // set high word of lpszProcName to 0,
+ // to indicate call-by-ordinal
+ lTemp = lParseNumericExpr();
+ if (HIWORD(lTemp))
+ ParseError(PERR_NUMBER_OV);
+ pAttr->lpszProcName = (LPSTR)lTemp;
+ }
+
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_ID: // id(I4 id num)
+ GotAttr(pAttr, fID);
+ ConsumeTok(RW_LPAREN, fACCEPT_NUMBER);
+ pAttr->lId = lParseNumericExpr();
+
+ // We reserve the top bit for ourselves --
+ // don't let the user pick these id's except for
+ // a few special values like DISPID_NEWENUM (-4)
+ // and DISPID_EVALUATE (-5)
+ // Also allow the special range -999 to -500 for
+ // the controls folks. This range will be
+ // documented as reserved in the next version.
+ // Also allow the special range 0x80010000 to
+ // 0x8001FFFF for Control containers such as VB4.
+
+#ifndef DISPID_COLLECT // temporary until everybody upgrades header files
+#define DISPID_COLLECT (-8)
+#endif
+ // high bit == 1 ==> special negative value
+ // next bit == 1 ==> typelib.dll picked this id
+ // == 0 ==> user picked this id
+ if (pAttr->lId & 0x80000000) {
+ switch ((long)pAttr->lId) {
+ case DISPID_NEWENUM:
+ case DISPID_EVALUATE:
+ case DISPID_CONSTRUCTOR:
+ case DISPID_DESTRUCTOR:
+ case DISPID_COLLECT:
+ break;
+ default:
+ if ((long)pAttr->lId >= -999 &&
+ (long)pAttr->lId <= -500) {
+ break;
+ }
+ if (HIWORD(pAttr->lId) == 0x8001)
+ break;
+ ParseErrorTokLast(PERR_INV_ID);
+ }
+ }
+
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_HELPCONTEXT: // helpcontext(I4 context num)
+ GotAttr(pAttr, fHELPCONTEXT);
+ ConsumeTok(RW_LPAREN, fACCEPT_NUMBER);
+ pAttr->lHelpContext = lParseNumericExpr();
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_DLLNAME: // dllname("dllname string")
+ GotAttr(pAttr, fDLLNAME);
+ ConsumeTok(RW_LPAREN, fACCEPT_STRING);
+ pAttr->lpszDllName = lpszParseStringExpr();
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_HELPFILE: // helpstring("helpfile")
+ GotAttr(pAttr, fHELPFILE);
+ ConsumeTok(RW_LPAREN, fACCEPT_STRING);
+ pAttr->lpszHelpFile = lpszParseStringExpr();
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_HELPSTRING: // helpstring("help string")
+ GotAttr(pAttr, fHELPSTRING);
+ ConsumeTok(RW_LPAREN, fACCEPT_STRING);
+ pAttr->lpszHelpString = lpszParseStringExpr();
+ ConsumeTok(RW_RPAREN, 0);
+ break;
+
+ case ATTR_IN:
+ GotAttr(pAttr, fIN);
+ break;
+
+ case ATTR_OUT:
+ GotAttr(pAttr, fOUT);
+ break;
+
+ case ATTR_ODL:
+ GotAttr(pAttr, fODL);
+ break;
+
+ case ATTR_OPTIONAL:
+ GotAttr(pAttr, fOPTIONAL);
+ break;
+
+ case ATTR_PUBLIC:
+ GotAttr(pAttr, fPUBLIC);
+ break;
+
+ case ATTR_READONLY:
+ GotAttr(pAttr, fREADONLY);
+ break;
+
+ case ATTR_STRING:
+ GotAttr(pAttr, fSTRING);
+ break;
+
+ case ATTR_VARARG:
+ GotAttr(pAttr, fVARARG);
+ break;
+
+ case ATTR_APPOBJECT:
+ GotAttr(pAttr, fAPPOBJECT);
+ break;
+
+ case ATTR_PROPGET:
+ if (pAttr->fAttr & (fPROPPUT | fPROPPUTREF))
+ ParseErrorTokLast(PERR_INV_ATTR_COMBO);
+ GotAttr(pAttr, fPROPGET);
+ break;
+
+ case ATTR_PROPPUT:
+ if (pAttr->fAttr & (fPROPGET | fPROPPUTREF))
+ ParseErrorTokLast(PERR_INV_ATTR_COMBO);
+ GotAttr(pAttr, fPROPPUT);
+ break;
+
+ case ATTR_PROPPUTREF:
+ if (pAttr->fAttr & (fPROPGET | fPROPPUT))
+ ParseErrorTokLast(PERR_INV_ATTR_COMBO);
+ GotAttr(pAttr, fPROPPUTREF);
+ break;
+
+ case ATTR_RESTRICTED:
+ GotAttr(pAttr, fRESTRICTED);
+ break;
+
+ case ATTR_DEFAULT:
+ GotAttr(pAttr, fDEFAULT);
+ break;
+
+ case ATTR_SOURCE:
+ GotAttr(pAttr, fSOURCE);
+ break;
+
+ case ATTR_BINDABLE:
+ GotAttr(pAttr, fBINDABLE);
+ break;
+
+ case ATTR_REQUESTEDIT:
+ GotAttr(pAttr, fREQUESTEDIT);
+ break;
+
+ case ATTR_DISPLAYBIND:
+ GotAttr(pAttr, fDISPLAYBIND);
+ break;
+
+ case ATTR_DEFAULTBIND:
+ GotAttr(pAttr, fDEFAULTBIND);
+ break;
+
+ case ATTR_LICENSED:
+ GotAttr(pAttr, fLICENSED);
+ break;
+
+ case ATTR_PREDECLID:
+ GotAttr(pAttr, fPREDECLID);
+ break;
+
+ case ATTR_HIDDEN:
+ GotAttr(pAttr, fHIDDEN);
+ break;
+
+ case ATTR_RETVAL:
+ GotAttr(pAttr, fRETVAL);
+ break;
+
+ case ATTR_CONTROL:
+ GotAttr2(pAttr, f2CONTROL);
+ break;
+
+ case ATTR_DUAL:
+ GotAttr2(pAttr, f2DUAL);
+ break;
+
+ case ATTR_NONEXTENSIBLE:
+ GotAttr2(pAttr, f2NONEXTENSIBLE);
+ break;
+
+ case ATTR_OLEAUTOMATION:
+ GotAttr2(pAttr, f2OLEAUTOMATION);
+ break;
+
+ case RW_COMMA: // must accept blank attributes
+ continue;
+
+ default:
+ // expected attribute or ']'
+ ParseErrorTokLast(PERR_EXP_ATTRIBUTE);
+ }
+
+ if (tok.id == RW_RBRACKET)
+ break; // all done
+ // eat comma which must separate args
+ ConsumeTok(RW_COMMA, fACCEPT_ATTR);
+
+ } // while
+
+ ScanTok(0); // consume ']'
+
+ // context-insensitive attribute validations can be done here.
+
+ // 'bindable' must also be set if any other data binding attr given
+ if ((pAttr->fAttr &
+ (fREQUESTEDIT | fDISPLAYBIND | fDEFAULTBIND))
+ && !(pAttr->fAttr & fBINDABLE))
+ ParseErrorTokLast(PERR_INV_ATTR_COMBO);
+
+ } // if
+}
+
+// ******************************************************************
+// TYPEDEF-related routines
+// ******************************************************************
+
+VOID NEAR InitIntrinsicTypes()
+{
+ INTRINSIC_DEF * pIntrinsic;
+
+ // load all the intrinsic types into the type structure.
+ for (pIntrinsic = rgIntrinsics; pIntrinsic->szName; pIntrinsic++)
+ {
+ InitIntrinsic(pIntrinsic->szName, pIntrinsic->vt);
+ };
+
+ lpType_LPSTR = InitIntrinsic("LPSTR", VT_LPSTR);
+ lpType_DISPATCH = InitIntrinsic("IDispatch *", VT_DISPATCH);
+ lpType_UNKNOWN = InitIntrinsic("IUnknown *", VT_UNKNOWN);
+ lpType_LPWSTR = InitIntrinsic("LPWSTR", VT_LPWSTR);
+ // UNDONE: what VT_xxx constant to use for 'wchar_t'?
+ lpType_wchar_t = InitIntrinsic("wchar_t", VT_I2);
+}
+
+LPTYPE NEAR InitIntrinsic
+(
+ CHAR * szName,
+ VARTYPE vt
+)
+{
+ // NOTE: only need to allocate space for a TYPE item
+ ListInsert(&typlib.pEntry, sizeof(TYPE));
+ typlib.pEntry->type.szName = szName;
+ typlib.pEntry->type.tdesc.vt = vt;
+ typlib.pEntry->type.tentrykind = tINTRINSIC;
+ typlib.pEntry->type.lptinfo = NULL;
+ typlib.pEntry->type.intr.fUnsigned =
+ (vt == VT_UI1 || vt == VT_UINT ||
+ vt == VT_UI2 || vt == VT_UI4);
+
+ return (LPTYPE)typlib.pEntry;
+}
+
+
+// Start at front of type list, and find base type of the given name
+// (with 0 levels of indirection). Will also find forward declarations.
+LPTYPE NEAR FindType
+(
+ LPSTR lpszName, // name to look for
+ BOOL fUnsigned, // TRUE if unsigned keyword preceeded this
+ TENTRYKIND tentrykind // kind of thing to look for
+)
+{
+ LPTYPE lpTypeLast = (LPTYPE)ListLast(typlib.pEntry);
+ LPTYPE lpType = (LPTYPE)ListFirst(typlib.pEntry);
+
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ {
+ if (tentrykind == tSTRUCT || tentrykind == tUNION)
+ { // if 'struct'/'union' keyword specified, then match tags
+ if ((lpType->tentrykind & ~tFORWARD) == tentrykind
+ && lpType->structenum.szTag
+ && !FCmpCaseIns(lpType->structenum.szTag, lpszName))
+ return lpType; // got a match
+ }
+ else if (lpType->tentrykind != tREF && !(lpType->tentrykind & tQUAL))
+ { // if type definition or intrinsic, check names
+ if (!FCmpCaseIns(lpType->szName, lpszName))
+ // if names match, check that signed/unsigned matches
+ if (fUnsigned == (lpType->tentrykind == tINTRINSIC && lpType->intr.fUnsigned))
+ return lpType; // got a match
+ }
+ if (lpType == lpTypeLast) // if end of list
+ return NULL; // return not found
+ lpType = lpType->pNext; // advance to next type
+ }
+
+}
+
+
+// find existing VT_PTR type entry (with the same base type) with same # of
+// levels of indirection, or create new entry with given indirection level.
+LPTYPE NEAR FindTypeInd
+(
+ LPTYPE lpTypeBase, // * to base type
+ short cIndirect // indirection level to look for
+)
+{
+ LPTYPE lpTypeLast = (LPTYPE)ListLast(typlib.pEntry);
+ LPTYPE lpType;
+ short cIndLast;
+ TYPEDESC FAR * lptdescPrev;
+
+ lpType = lpTypeBase; // start looking at base type
+ cIndLast = 0; // highest indirection level seen so far
+ // point to real tdesc, ignoring non-public typedef's
+ lptdescPrev = &(lpTypePublic(lpType)->tdesc);
+
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ {
+ // check for a reference type with the same base type and same
+ // level of indirection
+ if (lpType->tdesc.vt == VT_PTR && lpType->ref.ptypeBase == lpTypeBase)
+ { // if base types match, check indirection levels
+ if (lpType->ref.cIndirect == cIndirect)
+ // if indirection levels match, we're done
+ return lpType;
+ Assert (lpType->ref.cIndirect > cIndLast);
+ cIndLast = lpType->ref.cIndirect; // save highest
+ // indirection level
+ // can't have a VT_PTR entry that isn't public.
+ Assert(lpTypePublic(lpType) == lpType);
+ lptdescPrev = &(lpType->tdesc);
+ }
+
+ if (lpType == lpTypeLast) // if end of list
+ break; // done -- no match found
+
+ lpType = lpType->pNext; // advance to next type
+ }
+
+ // no entry with same base type & # of levels of indirection, make new
+ // entries up to and including the current level of indirection.
+ for (cIndLast++; cIndLast <= cIndirect; cIndLast++)
+ {
+ // allocate new type list item at end of list
+ // NOTE: only need to allocate space for a TYPE item
+ ListInsert(&typlib.pEntry, sizeof(TYPE));
+
+ // set up info
+ typlib.pEntry->type.tdesc.vt = VT_PTR;
+ typlib.pEntry->type.tdesc.lptdesc = lptdescPrev;
+ lptdescPrev = &(typlib.pEntry->type.tdesc); // ready for next time
+ typlib.pEntry->type.szName = lpTypeBase->szName;
+ typlib.pEntry->type.tentrykind = tREF;
+ typlib.pEntry->type.lptinfo = NULL;
+ //CONSIDER: maybe eliminate ptypeBase now that we have the tdesc field.
+ typlib.pEntry->type.ref.ptypeBase = lpTypeBase;
+ typlib.pEntry->type.ref.cIndirect = cIndLast;
+ }
+
+ return &typlib.pEntry->type;
+}
+
+// find existing VT_SAFEARRAY type entry (with the same base type),
+// create new entry with this base type.
+LPTYPE NEAR FindTypeArray
+(
+ LPTYPE lpTypeBase // * to base type
+)
+{
+ LPTYPE lpTypeLast = (LPTYPE)ListLast(typlib.pEntry);
+ LPTYPE lpType;
+
+ lpType = lpTypeBase; // start looking at base type
+
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ {
+ // check for a reference type with the same base type
+ if (lpType->tdesc.vt == VT_SAFEARRAY && lpType->ref.ptypeBase == lpTypeBase)
+ return lpType;
+
+ if (lpType == lpTypeLast) // if end of list
+ break; // done -- no match found
+
+ lpType = lpType->pNext; // advance to next type
+ }
+
+ // no entry with same base type, make new entry.
+
+ // allocate new type list item at end of list
+ // NOTE: only need to allocate space for a TYPE item
+ ListInsert(&typlib.pEntry, sizeof(TYPE));
+
+ // now create new array reference type
+ typlib.pEntry->type.tdesc.vt = VT_SAFEARRAY;
+
+ // link to real tdesc, ignoring non-public typedef's
+ typlib.pEntry->type.tdesc.lptdesc = &(lpTypePublic(lpTypeBase)->tdesc);
+
+ typlib.pEntry->type.szName = lpTypeBase->szName;
+ typlib.pEntry->type.tentrykind = tREF;
+ typlib.pEntry->type.lptinfo = NULL;
+//CONSIDER: maybe eliminate ptypeBase now that we have the tdesc field.
+ typlib.pEntry->type.ref.ptypeBase = lpTypeBase;
+
+ return &typlib.pEntry->type;
+}
+
+
+//
+// parse a type reference of the form:
+// [unsigned/struct] <name> {[far] *}
+// OR
+// SAFEARRAY(<type reference>) {[far] *}
+//
+// Also ensures that current attributes are valid in this context
+//
+LPTYPE NEAR ParseKnownType
+(
+ LPATTR pAttr,
+ WORD fAllow
+)
+{
+ short cIndirect = 0;
+ LPSTR szTypeName;
+ LPSTR szLibName = NULL;
+ LPTYPE lpType;
+ LPTYPE lpTypeBase = NULL;
+ BOOL fUnsigned = FALSE;
+ TENTRYKIND tMatchTag = tANY;
+ BOOL fFar;
+
+ if ((fAllow & fAllowSAFEARRAY) && tok.id == RW_SAFEARRAY)
+ {
+ ScanTok(0); // consume "SAFEARRAY"
+ ConsumeTok(RW_LPAREN, 0);
+ lpTypeBase = ParseKnownType(pAttr, fAllow);
+
+ if (IsType(lpTypeBase, VT_VOID)) // 'void' is no good here
+ ParseErrorTokLast(PERR_VOID_INV);
+
+ ConsumeTok(RW_RPAREN, 0);
+
+ // Now find an existing type entry that's a safearry with this
+ // base type, or create a new one if not found.
+ lpTypeBase = FindTypeArray(lpTypeBase);
+ Assert (lpTypeBase != NULL);
+ }
+ else
+ { // not a safearray
+
+ switch (tok.id)
+ {
+ // type of the form: unsigned [int, char, long, short]
+ case RW_UNSIGNED:
+ fUnsigned = TRUE;
+ goto consumeit;
+
+ // type of the form: struct <structtag>
+ case RW_STRUCT:
+ tMatchTag = tSTRUCT;
+ goto consumeit;
+
+ // type of the form: union <uniontag>
+ case RW_UNION:
+ tMatchTag = tUNION;
+consumeit:
+ ScanTok(0); // consume "unsigned"/"struct"/"union"
+
+ default:
+ ;
+ }
+
+ // get/consume typename/libraryname/tagname
+ szTypeName = ConsumeId();
+
+ if (!fUnsigned && tMatchTag == tANY && tok.id == RW_PERIOD)
+ { // if library.typename syntax
+ ScanTok(0); // consume "."
+ szLibName = szTypeName; // first id is really a lib name
+ szTypeName = ConsumeId(); // get/consume type name
+ }
+ }
+
+ // handle indirection (as many "[far] *" as are present)
+ while ((fFar = (tok.id == RW_FAR)) || tok.id == RW_POINTER)
+ {
+ cIndirect++; // one more level of indirection
+
+ ScanTok(0); // consume "*" or "far"
+
+ if (fFar) // if "far" specified, then "*" must follow
+ ConsumeTok(RW_POINTER, 0);
+
+ // CONSIDER: impose a limit on # of levels of indirection???
+ }
+
+ if (lpTypeBase == NULL) // if not a SAFEARRAY
+ {
+ // CONSIDER: (size) tQUAL entries won't get re-used
+ if (szLibName)
+ { // reference to type in a specific external type library
+ Assert(fUnsigned == FALSE);
+ Assert(tMatchTag == tANY);
+ lpTypeBase = FindExtType(szLibName, szTypeName);
+ _ffree(szLibName); // done with library name
+ }
+ else if (tMatchTag != tANY)
+ { // we're to match tag instead of name
+ Assert(szLibName == NULL);
+ Assert(fUnsigned == FALSE);
+ lpTypeBase = FindType(szTypeName, fUnsigned, tMatchTag);
+ }
+ else
+ {
+ // First perform any some special mappings before looking
+ // through all the existing types.
+ if (cIndirect)
+ {
+ // map IDispatch * to VT_DISPATCH
+ if (!FCmpCaseIns(szTypeName, "IDispatch"))
+ {
+ lpTypeBase = lpType_DISPATCH;
+ cIndirect--; // ignore the last *
+ goto FoundBaseType;
+ }
+ // map IUnknown * to VT_UNKNOWN
+ if (!FCmpCaseIns(szTypeName, "IUnknown"))
+ {
+ lpTypeBase = lpType_UNKNOWN;
+ cIndirect--; // ignore the last *
+ goto FoundBaseType;
+ }
+ }
+ // find existing type of this name with 0 levels of
+ // indirection
+ lpTypeBase = FindType(szTypeName, fUnsigned, tANY);
+
+ // if not found here, then search all external type
+ // libraries for this type definition.
+ if (lpTypeBase == NULL && !fUnsigned)
+ lpTypeBase = FindExtType(NULL, szTypeName);
+ }
+
+ if (lpTypeBase == NULL) // error if still not found
+ ParseErrorTokLast(PERR_UNKNOWN_TYPE);
+
+FoundBaseType:
+ _ffree(szTypeName); // done with type name
+ }
+
+ lpType = lpTypeBase;
+ // find existing type entry with same # of levels of indirection
+ // or create new entry with given indirection level.
+ if (cIndirect != 0)
+ lpType = FindTypeInd(lpTypeBase, cIndirect);
+
+ Assert (lpType != NULL);
+
+ // If ensure the base type of this item makes sense in this context.
+ // Typelib.dll isn't very good about catching all the errors.
+ while (lpTypeBase->tentrykind == tTYPEDEF)
+ lpTypeBase = lpTypeBase->td.ptypeAlias;
+
+ switch(lpTypeBase->tentrykind & ~(tFORWARD | tIMPORTED | tQUAL)) {
+ case tINTERFACE:
+ case tDISPINTER:
+ case tCOCLASS:
+ if (cIndirect == 0 && (fAllow & fAllowInter) == 0) {
+ // interface with no indirection -- give error
+ ParseErrorTokLast(PERR_INV_REFERENCE);
+ }
+ break;
+
+ case tMODULE:
+ if ((fAllow & fAllowMODULE) == 0) {
+ // references to module -- no good in most places
+ ParseErrorTokLast(PERR_INV_REFERENCE);
+ }
+ break;
+
+ default:
+ break; // ok
+ }
+
+ // NOTE: for MIDL compatiblity, we accept the 'string' attribute on
+ // types that mean 'char *'. We translate those type references to
+ // the intrinisc type 'LPSTR' (even in the header file).
+ // We first must validate that if 'string' is specified, then the type of
+ // the data is really a 'char *'. For types defined in external type
+ // libraries, we just accept whatever string attribute the user specified,
+ // since we can't easily check to see if it is valid. The entry in the
+ // imported type library should already be a VT_LPSTR or a VT_LPWSTR in
+ // that case anyway.
+
+ if (pAttr->fAttr & fSTRING) {
+
+ // try to figure out if it's really a string (char * or wchar_t *)
+ lpTypeBase = lpType;
+ while (lpTypeBase->tentrykind == tTYPEDEF)
+ lpTypeBase = lpTypeBase->td.ptypeAlias;
+
+ if (!(lpTypeBase->tentrykind & tIMPORTED)
+ && lpTypeBase->tdesc.vt != VT_LPSTR
+ && lpTypeBase->tdesc.vt != VT_LPWSTR
+ )
+ { // if not already a string, or an imported type -- it had
+ // better equate to "char *"
+ switch(GetStringType(lpTypeBase)) {
+ case VT_LPSTR:
+ return lpType_LPSTR;
+ case VT_LPWSTR:
+ return lpType_LPWSTR;
+ default:
+ // 'string' attr set but not char * or wchar_t *
+ ParseErrorTokLast(PERR_INV_COMBO);
+ }
+ }
+ }
+
+ return lpType;
+}
+
+
+/* returns the appropriate string type that this is, or VT_EMPTY if not a
+ string */
+VARTYPE NEAR GetStringType(LPTYPE lpTypeBase)
+{
+ if (lpTypeBase->tdesc.vt == VT_PTR && lpTypeBase->ref.cIndirect == 1) {
+ lpTypeBase = lpTypeBase->ref.ptypeBase;
+ while (lpTypeBase->tentrykind == tTYPEDEF)
+ lpTypeBase = lpTypeBase->td.ptypeAlias;
+
+ if (lpTypeBase->tentrykind == tINTRINSIC)
+ switch (lpTypeBase->tdesc.vt)
+ {
+// UNDONE: does MIDL have wchar_t???
+ // UNDONE; what VT_xxx to use here? If
+ // separate, then we can rip the 'if' stmt.
+ // and lpType_wchar_t
+ case VT_I2: // wchar_t
+ if (lpTypeBase != lpType_wchar_t)
+ break;
+ return VT_LPWSTR;
+ case VT_I1:
+ return VT_LPSTR;
+
+ default:
+ break;
+ }
+ }
+ return VT_EMPTY; // not a string
+}
+
+// parse an element name (property, struct elem, function parm, etc, handling
+// array references)
+VOID NEAR ParseElemName
+(
+ LPELEM lpElem,
+ WORD fAllow
+)
+{
+ ARRAYDESC FAR * lpAD;
+ WORD cDims;
+ DWORD cElems;
+
+ lpElem->szElemName = ConsumeId(); // get/consume/store elem name
+
+ if ((fAllow & fAllowCARRAY) && tok.id == RW_LBRACKET)
+ {
+
+#define MAX_DIMS 64 // arbitrary max # of dimensions
+
+ // allocate & load the array descriptor
+ lpAD = (ARRAYDESC FAR *)ParseMalloc(sizeof(ARRAYDESC) + ((MAX_DIMS-1) * sizeof(SAFEARRAYBOUND)));
+ cDims = 0;
+ while (tok.id == RW_LBRACKET)
+ {
+ if (cDims >= MAX_DIMS)
+ ParseError(PERR_INV_ARRAY_DECL);
+
+ ScanTok(fACCEPT_NUMBER); // consume "["
+
+ lpAD->rgbounds[cDims].lLbound = 0; // lbound always 0
+#if 0 // arrays of the form "a[]" aren't supported
+ if (cDims == 0 && tok.id == RW_RBRACKET)
+ { // array of the form "x[] or x[][2]"
+ // UN_DONE: verify that this is right
+ lpAD->rgbounds[cDims].cElements = 0;
+ }
+ else
+#endif
+ {
+ cElems = lParseNumericExpr();
+ if (cElems == 0)
+ ParseError(PERR_INV_ARRAY_DECL);
+ lpAD->rgbounds[cDims].cElements = cElems;
+ }
+ cDims++; // one more dimension
+ ConsumeTok(RW_RBRACKET, 0); // consume "]"
+ }
+ lpAD->cDims = cDims;
+
+ // get real tdesc, ignoring non-public typedef's
+ lpAD->tdescElem = lpTypePublic(lpElem->elemType)->tdesc;
+
+ // allocate new type list item at end of list
+ // NOTE: only need to allocate space for a TYPE item
+ ListInsert(&typlib.pEntry, sizeof(TYPE));
+
+ // now create new array reference type
+ typlib.pEntry->type.tdesc.vt = VT_CARRAY;
+ typlib.pEntry->type.tdesc.lpadesc = lpAD;
+ typlib.pEntry->type.szName = lpElem->elemType->szName;
+ typlib.pEntry->type.tentrykind = tREF;
+ typlib.pEntry->type.lptinfo = NULL;
+ //CONSIDER: maybe eliminate ptypeBase now that we have tdesc.
+ typlib.pEntry->type.ref.ptypeBase = lpElem->elemType;
+
+ // change type to point to this new type
+ lpElem->elemType = (LPTYPE)typlib.pEntry;
+ }
+
+}
+
+
+// ensure last element in element list isn't duplicated
+// or is in some way inconsistent with other elements
+VOID NEAR EnsureNoDupElem
+(
+ LPELEM lpElemLast
+)
+{
+ LPELEM lpElem;
+ LPSTR szElemLast = lpElemLast->szElemName;
+ BOOL fIdLast = ((lpElemLast->attr.fAttr & fID) != 0);
+ DWORD idElemLast = lpElemLast->attr.lId;
+ DWORD propBitsLast = (lpElemLast->attr.fAttr & fPropBits);
+ DWORD propFuncBitsLast = (lpElemLast->attr.fAttr & (fPropFuncBits | fRESTRICTED));
+ DWORD propBitsCur;
+ BOOL fDefaultBindLast = ((lpElemLast->attr.fAttr & fDEFAULTBIND) != 0);
+
+ for (lpElem = (LPELEM)ListFirst(lpElemLast); lpElem != lpElemLast; lpElem = lpElem->pNext)
+ {
+ // ensure names not duplicated in this element list
+ if (!FCmpCaseIns(szElemLast, lpElem->szElemName))
+ { // names match
+ // if names match, reject this if they have the same
+ // propget/put/putref bits (or one of them doesn't have
+ // a property bit set).
+ propBitsCur = (lpElem->attr.fAttr & fPropBits);
+ if (!propBitsLast || !propBitsCur || propBitsLast == propBitsCur)
+ ParseErrorTokLast(PERR_DUP_DEF);
+
+ // better both have the same id, if specified
+ if ( (fIdLast != ((lpElem->attr.fAttr & fID) != 0)) ||
+ (fIdLast && idElemLast != lpElem->attr.lId) )
+ ParseErrorTokLast(PERR_DUP_DEF);
+
+ // better have the same attributes
+ if ((lpElem->attr.fAttr & (fPropFuncBits | fRESTRICTED)) != propFuncBitsLast) {
+ ParseErrorTokLast(PERR_DUP_DEF);
+ }
+ }
+ else
+ { // names don't match
+ // better not both have the same id
+ if (fIdLast && (lpElem->attr.fAttr & fID))
+ if (idElemLast == lpElem->attr.lId)
+ ParseErrorTokLast(PERR_DUP_ID);
+
+ // better not both be marked as 'defaultbind'
+ if (fDefaultBindLast && (lpElem->attr.fAttr & fDEFAULTBIND))
+ ParseErrorTokLast(PERR_DUP_DEF);
+ }
+ }
+}
+
+// add and parse a new element to a list of elements.
+// if lpType is non-null, disallows elements of this type.
+// Assumes that the element can handle Array types.
+VOID NEAR ParseNewElem
+(
+ LPELEM FAR * lplpElem,
+ DWORD validElemAttr,
+ DWORD validElemAttr2,
+ LPTYPE lpType
+)
+{
+ LPELEM lpElem;
+
+ ListInsert(lplpElem, sizeof(ELEM)); // allocate new list item
+ lpElem = *lplpElem;
+
+ ParseOptAttr(&lpElem->attr, cVAR); // parse attributes, if any
+
+ CheckAttr(&lpElem->attr, validElemAttr, validElemAttr2);
+
+ ParseElem(lpElem, fAllowArray, lpType);
+}
+
+
+VOID NEAR ParseElem
+(
+ LPELEM lpElem,
+ WORD fAllow,
+ LPTYPE lpType
+)
+{
+ // parse element type
+ lpElem->elemType = ParseKnownType(&lpElem->attr, fAllow);
+ Assert(lpElem->elemType);
+
+ if (IsType(lpElem->elemType, VT_VOID)) // 'void' is no good here
+ ParseErrorTokLast(PERR_VOID_INV);
+
+ // disallow self-referencing types (not including pointers to those types)
+ // CONSIDER: This check isn't sufficient now that we have forward declares:
+ // CONSIDER: typedef struct foo;
+ // CONSIDER: typedef struct foo {
+ // CONSIDER: struct foo bar; // makes it by this check
+ // CONSIDER: } str;
+ // CONSIDER: The error DOES get caught during LayOut(), but it would be
+ // CONSIDER: nicer to catch it sooner if we could. The correct check is
+ // CONSIDER: is to disallow any non-pointer to a forward declare for which
+ // CONSIDER: there is no real definition.
+ if (lpElem->elemType == lpType)
+ ParseErrorTokLast(PERR_UNKNOWN_TYPE);
+
+ // parse element name, allowing arrays where appropriate
+ ParseElemName(lpElem, fAllow);
+
+ EnsureNoDupElem(lpElem); // ensure no duplicate elements now
+
+}
+
+
+
+// given a type, returns a pointer to the underlying public type.
+// This is used to ignore non-public Typedef's where desired.
+// Any typedef with an attribute is considered to be public.
+LPTYPE FAR lpTypePublic
+(
+ LPTYPE lpType
+)
+{
+ while (lpType->tentrykind == tTYPEDEF
+ && (((LPENTRY)lpType)->attr.fAttr) == 0
+ && (((LPENTRY)lpType)->attr.fAttr2) == 0)
+ lpType = lpType->td.ptypeAlias;
+
+ return lpType;
+}
+
+
+// Handle forward declarations. Ensures that there isn't already a "real"
+// definition before this definiton. Then updates the name/tag in the type
+// structure, and sees if this is a forward definition (<name> followed by ';')
+// returns TRUE if this is a forward declaration, FALSE otherwise.
+BOOL NEAR FHandleForwardDecl
+(
+ LPENTRY lpEntry,
+ TENTRYKIND tentrykind
+)
+{
+ LPSTR lpszName;
+ LPENTRY pEntryForward = NULL;
+
+ lpEntry->type.tentrykind = tentrykind; // store information in record
+ lpszName = ConsumeId(); // get/consume interface/tag name
+
+ Assert (lpEntry->lpEntryForward == NULL); // caller should have zero'ed
+
+ // find a previous forward declaration, if any
+ if ((pEntryForward = (LPENTRY)FindType(lpszName, FALSE, tentrykind)) != NULL)
+ {
+ // no good if entry found isn't a forward declaration
+ if ((pEntryForward->type.tentrykind & tFORWARD) == 0)
+ ParseError(PERR_DUP_DEF);
+ lpEntry->lpEntryForward = pEntryForward; // save * to forward
+ // declaration
+ pEntryForward->lpEntryForward = lpEntry; // also save pointer
+ // from forward decl
+ // back to real entry
+ }
+
+ if (tentrykind == tSTRUCT || tentrykind == tENUM || tentrykind == tUNION)
+ lpEntry->type.structenum.szTag = lpszName; // store tag name
+ else
+ lpEntry->type.szName = lpszName; // store interface name
+
+ // important to actually store szTag now, so that we can match type
+ // references of the form "struct tagname" from within the struct.
+ // (and from later references if this is a forward declaration).
+
+ // see if this a forward declaration
+ // NOTE: we don't support forward declares of enums, because there is
+ // no syntax that works for referencing them.
+ if (tentrykind != tENUM && tok.id == RW_SEMI)
+ {
+ //can't have any attributes on forward declarations.
+ if (lpEntry->attr.fAttr || lpEntry->attr.fAttr2)
+ ParseError(PERR_INV_ATTR); //CONSIDER: better error?
+
+ // mark this as a forward declaration and quit. We'll fill
+ // in the rest of the info later when we get the real def.
+ lpEntry->type.tentrykind |= tFORWARD;
+ ScanTok(0); // consume the semicolon
+
+ EnsureNoDupEntries(lpEntry); // check for dup def
+
+ return TRUE;
+ }
+ return FALSE;
+}
+// end common code
+
+
+// parses a TypeDef section (3 forms)
+VOID NEAR ParseTypedef
+(
+ LPENTRY lpEntry
+)
+{
+
+ // attributes must follow 'typedef' keyword for MIDL compatibility
+ if (lpEntry->attr.fAttr || lpEntry->attr.fAttr2)
+ ParseErrorTokLast(PERR_TYPEDEF_ATTR);
+
+ Assert(tok.id == RW_TYPEDEF);
+ ScanTok(0); // consume "TypeDef", advance to next token
+
+ ParseOptAttr(&(lpEntry->attr), cTYPE); // parse attrs, if any
+
+ switch (tok.id)
+ {
+ case RW_ENUM:
+ ParseStructEnumUnion(lpEntry, tENUM);
+ break;
+
+ case RW_STRUCT:
+ ParseStructEnumUnion(lpEntry, tSTRUCT);
+ break;
+
+ case RW_UNION:
+ ParseStructEnumUnion(lpEntry, tUNION);
+ break;
+
+ default: // a regular typedef
+ ParseAlias(lpEntry);
+ break;
+ }
+}
+
+
+
+
+// parse typedef <basename> <aliasname>;
+VOID NEAR ParseAlias
+(
+ LPENTRY lpEntry
+)
+{
+ lpEntry->type.tentrykind = tTYPEDEF;
+
+ // ensure attributes valid in this context
+ CheckAttr(&lpEntry->attr, VALID_TYPEDEF_ATTR, VALID_TYPEDEF_ATTR2);
+
+ // parse base type
+ lpEntry->type.td.ptypeAlias = ParseKnownType(&lpEntry->attr,
+ fAllowInter |
+ fAllowMODULE);
+
+ lpEntry->type.szName = ConsumeId(); // get/consume type name
+
+ EnsureNoDupEntries(lpEntry); // check for dup def
+
+ ConsumeTok(RW_SEMI, 0); // ends with a semicolon
+}
+
+
+// ParseStructEnumUnion()
+// parses:
+// typedef struct/enum/union [tagname] { <items> } <name>;
+// typedef struct tagname; // forward declare of a struct
+// typedef union tagname; // forward declare of a union
+// doesn't support the following syntax:
+// typedef struct/enum/union tagname typedefname;
+VOID NEAR ParseStructEnumUnion
+(
+ LPENTRY lpEntry,
+ TENTRYKIND tentrykind
+)
+{
+ long EnumVal = -1L; // enums start at 0 by default
+
+ // ensure attributes valid in this context
+ CheckAttrTokLast(&lpEntry->attr,
+ VALID_STRUCT_ENUM_UNION_ATTR,
+ VALID_STRUCT_ENUM_UNION_ATTR2);
+
+ ScanTok(0); // consume "struct/enum/union"
+
+ lpEntry->type.tentrykind = tentrykind;
+ lpEntry->type.structenum.elemList = NULL; // no struct/enum/union elements
+ lpEntry->type.structenum.szTag = NULL; // assume no tag name
+
+ if (tok.id == LIT_ID) // if got an (optional) tag name
+ {
+ // Note -- we allow forward declares of structs, enums, & unions
+ if (FHandleForwardDecl(lpEntry, tentrykind))
+ return; // if THIS is a forward decl
+ }
+
+ ConsumeTok(RW_LCURLY, 0);
+
+ if (tentrykind == tENUM)
+ {
+ // parse first enum item
+ ParseNewEnumElem(&lpEntry->type.structenum.elemList, &EnumVal);
+ while (tok.id == RW_COMMA) // enum items are comma-separated
+ {
+ ScanTok(0); // consume the comma
+ if (tok.id == RW_RCURLY) // OK to end in a comma
+ break;
+ ParseNewEnumElem(&lpEntry->type.structenum.elemList, &EnumVal);
+ }
+ }
+ else // a struct or a union
+ {
+ do
+ {
+ ParseNewElem(&lpEntry->type.structenum.elemList,
+ VALID_STRUCT_UNION_ELEM_ATTR,
+ VALID_STRUCT_UNION_ELEM_ATTR2,
+ &(lpEntry->type));
+ ConsumeTok(RW_SEMI, 0); // ends with a semicolon
+ } while (tok.id != RW_RCURLY);
+ }
+
+ ConsumeTok(RW_RCURLY, 0); // advance to struct/enum/union name
+
+ lpEntry->type.szName = ConsumeId(); // get/consume type name
+
+ EnsureNoDupEntries(lpEntry); // check for dup def
+
+ ConsumeTok(RW_SEMI, 0); // ends with a semicolon
+}
+
+
+VOID NEAR ParseNewEnumElem
+(
+ LPELEM FAR * lplpElem,
+ long * pEnumVal
+)
+{
+ long enumVal;
+ LPELEM lpElem;
+ VARIANT FAR * lpElemVal;
+
+ ListInsert(lplpElem, sizeof(ELEM));
+ lpElem = *lplpElem;
+
+ ParseOptAttr(&lpElem->attr, cVAR); // parse attributes, if any
+ // ensure attributes valid in this context
+ CheckAttrTokLast(&lpElem->attr,
+ VALID_ENUM_ELEM_ATTR,
+ VALID_ENUM_ELEM_ATTR2);
+
+ ParseElemName(lpElem, 0); // parse enum element name
+
+ if (tok.id == RW_ASSIGN) // got a value
+ {
+ ScanTok(fACCEPT_NUMBER);
+ enumVal = (long)lParseNumericExpr(); // enum's are signed
+ // enums in win16 must be in the range of an I2.
+ if (SysKind == SYS_WIN16 && (enumVal > 32767L || enumVal < -32768L))
+ ParseErrorTokLast(PERR_NUMBER_OV);
+ *pEnumVal = enumVal; // update current value
+ lpElem->attr.fAttr2 |= f2GotConstVal; // value explictly
+ // specified
+ }
+ else
+ {
+ enumVal = ++(*pEnumVal); // one more than the last one
+ // if we just overflowed then give error
+ if (SysKind == SYS_WIN16) {
+ if (enumVal == 32768L)
+ ParseErrorTokLast(PERR_NUMBER_OV);
+ } else if (enumVal == 0x80000000L)
+ ParseErrorTokLast(PERR_NUMBER_OV);
+ }
+
+ // now create a variant that contains the value (typlib generator
+ // needs it in the form of a variant).
+ lpElemVal = (VARIANT FAR *)ParseMalloc(sizeof(VARIANT));
+ lpElem->lpElemVal = lpElemVal;
+
+#ifdef DEBUG
+ lpElem->elemType = NULL; // not referenced -- element type is INT.
+#endif
+
+ // type of an enum element's value is I2 in WIN16 typelibs, I4 otherwise
+ // can't just always set lVal field, due to MAC byte-swapping issues
+ if (SysKind == SYS_WIN16)
+ {
+ lpElemVal->vt = VT_I2;
+ lpElemVal->iVal = LOWORD(enumVal);
+ }
+ else
+ {
+ lpElemVal->vt = VT_I4;
+ lpElemVal->lVal = enumVal;
+ }
+ EnsureNoDupElem(lpElem); // ensure no duplicate elements now
+}
+
+
+VOID NEAR ParseConstant
+(
+ LPELEM lpElem
+)
+{
+
+ LPTYPE lpType;
+ long constVal;
+ WORD vt;
+ LPSTR lpszConstVal;
+ WORD cbszConstVal;
+ BSTR bstrVal;
+
+ // ensure attributes valid in this context
+ CheckAttrTokLast(&lpElem->attr,
+ VALID_MODULE_CONST_ATTR,
+ VALID_MODULE_CONST_ATTR2);
+
+ ParseElem(lpElem, 0, NULL);
+
+ // get the type the user said this is.
+ lpType = lpElem->elemType;
+ while (lpType->tentrykind == tTYPEDEF)
+ lpType = lpType->td.ptypeAlias;
+
+ // we don't support constants of external types
+ if (lpType->tentrykind & tIMPORTED)
+ ParseError(PERR_INV_CONSTANT);
+
+ // CONSIDER: (V2) enhance this to accept date constants. Others?
+ ConsumeTok(RW_ASSIGN, fACCEPT_NUMBER | fACCEPT_STRING);
+ if (tok.id == LIT_STRING) {
+ lpszConstVal = tok.lpsz; // save * to string constant
+ cbszConstVal = tok.cbsz; // save string length (not including null)
+ ScanTok(0); // consume entry string
+ constVal = 0; // in case of error
+ } else {
+ constVal = (long)lParseNumericExpr();
+ lpszConstVal = NULL; // not a string
+ }
+
+ // now create a variant that contains the value (typlib generator
+ // needs it in the form of a variant).
+ lpElem->lpElemVal = (VARIANT FAR *)ParseMalloc(sizeof(VARIANT));
+ lpElem->attr.fAttr2 |= f2GotConstVal; // value explictly specified
+
+ // valididate that the type the user says is compatible with the
+ // type of the constant's value.
+
+ vt = VT_I2; // assume variant value is tagged as an I2.
+ // the only variant value tags currently supported are
+ // VT_I2, VT_I4, VT_BOOL, and VT_ERROR.
+ switch (lpType->tdesc.vt)
+ {
+ case VT_I1:
+ if (constVal < -128 || constVal > 127)
+ ParseErrorTokLast(PERR_NUMBER_OV);
+ break;
+ case VT_UI1:
+ if ((DWORD)constVal > 255)
+ ParseErrorTokLast(PERR_NUMBER_OV);
+ break;
+
+ case VT_INT:
+ if (SysKind != SYS_WIN16)
+ goto GotI4; // it's an I4
+
+ case VT_BOOL:
+ vt = VT_BOOL;
+
+ case VT_I2:
+ if (constVal < -32768 || constVal > 32767)
+ ParseErrorTokLast(PERR_NUMBER_OV);
+ break;
+
+ case VT_UINT:
+ if (SysKind != SYS_WIN16)
+ goto GotI4; // it's an unsigned I4 -- no overflow
+
+ case VT_UI2:
+ if ((DWORD)constVal > 65535L)
+ ParseErrorTokLast(PERR_NUMBER_OV);
+ break;
+
+ case VT_I4: // no overflow possible
+ case VT_UI4:
+GotI4:
+ vt = VT_I4; // it's an I4
+ break;
+
+ case VT_ERROR:
+ vt = VT_ERROR; // VT_ERROR is a valid variant tag
+ break;
+
+ case VT_LPSTR:
+ vt = VT_BSTR;
+ break;
+
+#if 0
+ case VT_LPWSTR: // CONSIDER: allow unicode string literals?
+ vt = VT_BSTR;
+ break;
+#endif //0
+
+ case VT_PTR: // ensure "char *"
+ // CONSIDER: allow wchar_t *, too?
+ if (GetStringType(lpType) == VT_LPSTR) {
+ vt = VT_BSTR;
+ break;
+ }
+ // fall through to give error
+
+ // CONSIDER: (V2) enhance this to support constants of other
+ // CONSIDER: (V2) intrinsic types
+ default:
+ ParseError(PERR_INV_CONSTANT);
+ }
+ lpElem->lpElemVal->vt = vt; // store tag
+
+ if (vt == VT_BSTR) {
+ if (lpszConstVal == NULL)
+ ParseError(PERR_EXP_STRING);
+#ifdef WIN32
+ bstrVal = SysAllocStringLen(NULL, cbszConstVal);
+ if (cbszConstVal) {
+ SideAssert (MultiByteToWideChar(CP_ACP,
+ MB_PRECOMPOSED,
+ lpszConstVal,
+ cbszConstVal,
+ bstrVal,
+ cbszConstVal) != 0);
+ }
+#else //WIN32
+ bstrVal = SysAllocStringLen(lpszConstVal, cbszConstVal);
+#endif //WIN32
+
+ if (bstrVal == NULL && cbszConstVal != 0)
+ ParseError(ERR_OM);
+ lpElem->lpElemVal->bstrVal = bstrVal;
+ } else {
+ if (lpszConstVal != NULL)
+ ParseError(PERR_EXP_NUMBER);
+#ifdef MAC
+ // can't just always set lVal field, due to MAC byte-swapping issues
+ if (vt == VT_I2 || vt == VT_BOOL)
+ lpElem->lpElemVal->iVal = LOWORD(constVal); // store data
+ else
+#endif //MAC
+ lpElem->lpElemVal->lVal = constVal; // store data
+ }
+
+ ConsumeTok(RW_SEMI, 0); // ends with a semicolon
+
+}
+
+// ******************************************************************
+// FUNCTION-related routines
+// ******************************************************************
+
+VOID NEAR ParseFunction
+(
+ LPFUNC lpFunc, // pointer to where to put this function's info
+ FUNCTYPE funcType
+)
+{
+ ATTR attr; // local attribute buffer
+ SHORT cArgs; // # of args for this function
+ SHORT cOptArgs; // # of optional args for this function
+ LPTYPE lpArgType;
+ LPTYPE lpArgTypeLast;
+ LPTYPE lpTypeRetVal;
+ LPSTR szFuncName;
+ LPTYPE lpTypeBase;
+ DWORD IDLFlagsSeen;
+ DWORD IDLFlagsCur;
+ SHORT cNeedRHS;
+
+ // if 'bindable' attr specified, must be a property function
+ if ((lpFunc->func.attr.fAttr & fBINDABLE)
+ && !(lpFunc->func.attr.fAttr & fPropBits))
+ ParseErrorTokLast(PERR_INV_ATTR_COMBO);
+
+ // ensure attributes valid in this context
+ CheckAttr(&lpFunc->func.attr,
+ fValidFuncAttrs[funcType],
+ fValidFuncAttrs2[funcType]);
+
+ // parse function return type
+ lpFunc->func.elemType = ParseKnownType(&lpFunc->func.attr,
+ fAllowSAFEARRAY);
+
+ lpTypeRetVal = lpFunc->func.elemType; // store in case no retval parm
+
+ // if PROPGET specified, return type cannot be VOID
+ if ((lpFunc->func.attr.fAttr & fPROPGET)
+ && IsType(lpTypeRetVal, VT_VOID))
+ ParseErrorTokLast(PERR_INV_PROPFUNC);
+
+ if (!IsType(lpTypeRetVal, VT_VOID)) {
+ // special case of VOID return type -- allowed everywhere
+ if (!IsType(lpTypeRetVal, VT_HRESULT)) {
+ // if PROPPUT or PROPPUTREF specified, return type must be VOID/HRESULT
+ if (lpFunc->func.attr.fAttr & (fPROPPUT | fPROPPUTREF))
+ ParseErrorTokLast(PERR_INV_PROPFUNC);
+
+ // OA functions must return either VOID or HRESULT.
+ if (funcType == FUNC_OAINTERFACE)
+ ParseErrorTokLast(PERR_INV_OA_FUNC_TYPE);
+ }
+ // ensure return type is a valid IDispatch/OA type
+ if (funcType == FUNC_DISPINTERFACE)
+ EnsureIDispatchType(lpTypeRetVal);
+ }
+
+ // parse optional "far"
+ if (tok.id == RW_FAR)
+ ScanTok(0); // consume far or _far if present
+
+ // parse optional calling convention.
+ switch (tok.id)
+ {
+ case RW_CDECL: // cdecl, _cdecl or __cdecl
+ lpFunc->func.attr.fAttr2 |= f2CDECL;
+ goto CheckCallConv;
+
+ case RW_PASCAL: // pascal, _pascal or __pascal
+ lpFunc->func.attr.fAttr2 |= f2PASCAL;
+ goto CheckCallConv;
+
+ case RW_STDCALL: // stdcall, _stdcall or __stdcall
+ lpFunc->func.attr.fAttr2 |= f2STDCALL;
+CheckCallConv:
+ ScanTok(0); // consume it
+
+ // set this flag so the .h file outputs a bunch of macros
+ // for the STDMETHODCALLTYPE.
+ if (funcType == FUNC_INTERFACE || funcType == FUNC_OAINTERFACE)
+ fSpecifiedInterCC = TRUE;
+
+ // explicit calling convention illegal in dispinterfaces and
+ // oa-compatible interfaces.
+ if (funcType == FUNC_DISPINTERFACE || funcType == FUNC_OAINTERFACE)
+ ParseErrorTokLast(PERR_INV_CALLCONV);
+ break;
+
+ default:
+ lpFunc->func.attr.fAttr2 |= (f2DefaultCC | f2CCDEFAULTED);
+ break;
+ }
+
+ lpFunc->argList = NULL; // no args yet
+
+ szFuncName = ConsumeId(); // get/consume function name
+ lpFunc->func.szElemName = szFuncName; // store function name
+
+ EnsureNoDupElem((LPELEM)lpFunc); // ensure no duplicate functions
+
+ ConsumeTok(RW_LPAREN, 0); // start of parms
+
+ cArgs = 0;
+ cOptArgs = 0;
+ IDLFlagsSeen = 0;
+ cNeedRHS = 0;
+ lpArgTypeLast = NULL; // no last parm yet (in case vararg)
+ if (tok.id != RW_RPAREN) // if any parms are present
+ {
+#pragma warning(disable:4127)
+ while (TRUE)
+#pragma warning(default:4127)
+ { // parse a function parameter
+
+ // parse & validate parm attributes, if any
+ ParseOptAttr(&attr, cPARAM);
+
+ // ensure attributes valid in this context
+ CheckAttr(&attr,
+ fValidParmAttrs[funcType],
+ fValidParmAttrs2[funcType]);
+
+ IDLFlagsCur = attr.fAttr & (fRETVAL | fLCID);
+
+ // can't have both lcid & retval on the same arg
+ if (IDLFlagsCur == (fRETVAL | fLCID))
+ ParseError(PERR_INV_ATTR_COMBO);
+
+ // only parm that can come after 'lcid' is 'retval',
+ // unless we're looking for an RHS parameter, but then
+ // we only allow one parameter to follow.
+ if (IDLFlagsSeen & fLCID && !(IDLFlagsCur & fRETVAL) && cNeedRHS != 1)
+ ParseError(PERR_INV_LCID_USE);
+
+ // If we need an RHS parameter, we want an IN parameter
+ // that is not marked as RETVAL or LCID.
+ if (cNeedRHS && (!(attr.fAttr & fIN) || IDLFlagsCur))
+ ParseError(PERR_INV_PROPFUNC);
+
+ // If we're made it this far while looking for an RHS parameter,
+ // we've found it.
+ if (cNeedRHS)
+ cNeedRHS++;
+
+ // If we have an LCID parameter and are a property PUT/PUTREF,
+ // we MUST have an RHS parameter next.
+ if (IDLFlagsCur & fLCID
+ && lpFunc->func.attr.fAttr & (fPROPPUT | fPROPPUTREF))
+
+ cNeedRHS = 1;
+
+ // Retval param is supposed to be last.
+ if (IDLFlagsSeen & fRETVAL)
+ ParseErrorTokLast(PERR_INV_RETVAL_USE);
+
+ // No retval allowed on PUT/PUTREF.
+ if (IDLFlagsCur == fRETVAL
+ && lpFunc->func.attr.fAttr & (fPROPPUT | fPROPPUTREF))
+
+ ParseErrorTokLast(PERR_INV_PROPFUNC);
+
+ IDLFlagsSeen |= IDLFlagsCur;
+
+ // parse parm type
+ lpArgType = ParseKnownType(&attr, fAllowArray);
+ if (IDLFlagsSeen == 0) {
+ lpArgTypeLast = lpArgType; // save in case vararg
+ }
+
+ // special case of foo(void) ==> no args in this case.
+ // other uses of 'void' are invalid.
+ if (IsType(lpArgType, VT_VOID))
+ {
+ if (tok.id == RW_RPAREN && cArgs == 0 && attr.fAttr == 0)
+ break; // all done
+ else
+ ParseErrorTokLast(PERR_VOID_INV);
+ }
+
+ cArgs++; // got one more arg
+
+ // one (or both) 'in', 'out' must be specified if we're
+ // not a dispinterface.
+ if (funcType != FUNC_DISPINTERFACE && !(attr.fAttr & (fIN | fOUT)))
+ ParseErrorTokLast(PERR_IN_OUT_REQ);
+
+ if (attr.fAttr & fOPTIONAL)
+ {
+ // optional args & 'vararg' don't mix
+ if (lpFunc->func.attr.fAttr & fVARARG) {
+ ParseErrorTokLast(PERR_INV_VARARG_USE);
+ }
+ cOptArgs++; // one more optional arg
+ }
+ else
+ { // can't have optional args in the middle
+ if (cOptArgs)
+ if (!IDLFlagsSeen) // if we're not a LCID or RETVAL
+ ParseErrorTokLast(PERR_INV_ATTR);
+ }
+
+ ListInsert(&lpFunc->argList, sizeof(ELEM));
+ lpFunc->argList->attr = attr; // store parm attributes
+ lpFunc->argList->elemType = lpArgType; // store parm type
+
+ // parse parm name
+ ParseElemName(lpFunc->argList, fAllowArray);
+ EnsureNoDupElem(lpFunc->argList); // ensure no duplicate
+ // parm names
+
+ // ensure this is a valid IDispatch/OA type
+ if (funcType == FUNC_DISPINTERFACE)
+ EnsureIDispatchType(lpFunc->argList->elemType);
+ else if (funcType == FUNC_OAINTERFACE)
+ EnsureOAType(lpFunc->argList->elemType, TRUE);
+
+ // if 'out' specified, parameter must be a pointer type
+ if (attr.fAttr & fOUT) {
+ lpTypeBase = lpArgType;
+ while (lpTypeBase->tentrykind == tTYPEDEF)
+ lpTypeBase = lpTypeBase->td.ptypeAlias;
+ if (!(lpTypeBase->tentrykind & tIMPORTED)) {
+ // can't reliably check if an imported type
+ switch (lpTypeBase->tdesc.vt) {
+ case VT_PTR:
+ case VT_LPSTR:
+ case VT_LPWSTR:
+ case VT_SAFEARRAY:
+ break;
+ default:
+ ParseErrorTokLast(PERR_INV_OUT_PARAM);
+ }
+ }
+ }
+
+ // 'optional' only allowed on non-array VARIANT args
+ if ((attr.fAttr & fOPTIONAL) && !IsType(lpArgType, VT_VARIANT))
+ { // an optional VARIANT * is also OK
+ lpTypeBase = lpArgType;
+ while (lpTypeBase->tentrykind == tTYPEDEF)
+ lpTypeBase = lpTypeBase->td.ptypeAlias;
+ if (lpTypeBase->tdesc.vt != VT_PTR ||
+ lpTypeBase->ref.cIndirect != 1 ||
+ !IsType(lpTypeBase->ref.ptypeBase, VT_VARIANT))
+ ParseErrorTokLast(PERR_INV_ATTR);
+ }
+
+ // validate 'retval' and 'lcid' usage
+ if (IDLFlagsCur) {
+ if (IDLFlagsCur & fLCID) {
+ // 'lcid' only legal if it's a DWORD type
+ if (!IsType(lpArgType, VT_I4))
+ ParseErrorTokLast(PERR_INV_LCID_USE);
+ // must be 'in', optional not allowed
+ if ((attr.fAttr & (fIN | fOUT | fOPTIONAL)) != fIN)
+ ParseErrorTokLast(PERR_INV_LCID_USE);
+ }
+
+ if (IDLFlagsCur & fRETVAL) {
+
+ lpTypeRetVal = lpArgType; // update * return type
+
+ // 'retval' is only allowed on
+ // hresult-returning functions.
+ if (!IsType(lpFunc->func.elemType,VT_HRESULT))
+ ParseErrorTokLast(PERR_INV_ATTR);
+
+ // must be 'out', optional not allowed
+ if ((attr.fAttr & (fIN | fOUT | fOPTIONAL)) != fOUT)
+ ParseErrorTokLast(PERR_INV_RETVAL_USE);
+
+ // 'retval' only legal if it's a pointer type
+ // this is ensured by the check above that 'out'
+ // parms must be pointers
+
+ // But it can't be an alias type, either (due to
+ // a typelib.dll limitation (bug?) in the munging
+ // code in gdtinfo.cxx -- VBA2 bug #3716).
+ // That code must have a pure pointer type. We're
+ // too close to Daytona ship to fix it in typelib,
+ // so we impose the restriction here.
+ if (!(lpArgType->tentrykind & tIMPORTED)) {
+ // can't reliably check if an imported type
+ if (lpArgType->tdesc.vt != VT_PTR)
+ ParseErrorTokLast(PERR_INV_RETVAL_USE);
+ }
+ }
+
+ }
+
+ if (tok.id == RW_RPAREN) // if all done
+ break;
+
+ ConsumeTok(RW_COMMA, 0); // must have another parm
+ }
+
+ }
+
+ // if 'propput' or 'propputref' is specified, then must have at least
+ // one non-lcid argument the comes after any LCID parameter that
+ // may exist.
+ if ((lpFunc->func.attr.fAttr & (fPROPPUT | fPROPPUTREF))
+ && (cArgs == 0 || cArgs == 1 && IDLFlagsSeen & fLCID || cNeedRHS == 1))
+ ParseErrorTokLast(PERR_INV_PROPPUT);
+
+ // if SOURCE specfied, must be an object/variant return type (ignore prop
+ // put/putref when checking for this.
+ if ((lpFunc->func.attr.fAttr & fSOURCE)
+ && !(lpFunc->func.attr.fAttr & (fPROPPUT | fPROPPUTREF))
+ && !IsObjectType(lpTypeRetVal))
+ ParseErrorTokLast(PERR_INV_SOURCE_ATTR);
+
+ // if 'vararg' specified, ensure last arg is a SAFEARRAY(VARIANT) or
+ // SAFEARRAY (VARIANT) *. Note that the following code doesn't accept
+ // things that are typedef'ed to be a SAFEARRAY or SAFEARRAY *, but
+ // I don't think that is important.
+
+ // lpArgTypeLast points to the type of the last arg, not including the
+ // lcid or retval parms, if there is an arg that meets this criteria
+ if (lpFunc->func.attr.fAttr & fVARARG)
+ {
+ // error if no last arg
+ if (lpArgTypeLast == NULL)
+ ParseErrorTokLast(PERR_INV_VARARG_USE);
+
+ // if pointer type, get base type
+ if (lpArgTypeLast->tdesc.vt == VT_PTR && lpArgTypeLast->ref.cIndirect == 1)
+ lpArgTypeLast = lpArgTypeLast->ref.ptypeBase;
+
+ if (lpArgTypeLast->tdesc.vt != VT_SAFEARRAY
+ || !IsType(lpArgTypeLast->ref.ptypeBase, VT_VARIANT))
+ ParseErrorTokLast(PERR_INV_VARARG_USE);
+ cOptArgs = -1; // tell type lib generator that VARARG
+ // was specified
+ }
+
+ if (cArgs > cArgsMax) // update global max # of args
+ cArgsMax = cArgs;
+ lpFunc->cArgs = cArgs; // store cArgs
+ lpFunc->cOptArgs = cOptArgs; // store cOptArgs
+ ScanTok(0); // consume the right paren
+ ConsumeTok(RW_SEMI, 0); // ends with a semicolon
+
+}
+
+
+BOOL NEAR IsType
+(
+ LPTYPE lpType,
+ VARTYPE vt
+)
+{
+ while (lpType->tentrykind == tTYPEDEF)
+ lpType = lpType->td.ptypeAlias;
+ return (lpType->tdesc.vt == vt);
+}
+
+
+// Checks to see that a given type is compatible with IDispatch::Invoke,
+// or is "Ole Automation compatible". Gives a warning if it is not.
+VOID NEAR EnsureIDispatchType
+(
+ LPTYPE lpType
+)
+{
+ if ((GetTypeCompatibility(lpType, 0) & COMPAT_IDISPATCH) == 0) {
+ // Type not supported by IDispatch::Invoke -- give a WARNING
+ ParseErrorTokLast(PWARN_INV_IDISPATCHTYPE);
+ }
+}
+
+// Checks to see that a given type is "Ole Automation compatible".
+// Gives an error if it is not.
+VOID NEAR EnsureOAType
+(
+ LPTYPE lpType,
+ BOOL fParam
+)
+{
+ if ((GetTypeCompatibility(lpType, (WORD)(fParam ? VT_PARAM : 0)) & COMPAT_OA) == 0) {
+ ParseErrorTokLast(PERR_INV_OA_TYPE); // Type not a valid OA type
+ }
+}
+
+// Returns info about whether or not a given type is compatible with
+// IDispatch::Invoke, or is "Ole Automation compatible".
+//
+// In the case where VT_VOID and VT_HRESULT are allowed (on a function return
+// value), we depend on our caller to not call us.
+//
+// Types allowed for dispinterfaces:
+// - All basic types (<= VT_UI1)
+// | VT_USERDEFINED/tTYPEDEF (external)
+// - the above with one level of indirection.
+//
+// Types allowed for OA compatibility:
+//
+// - All basic types (<= VT_UI1)
+// | VT_USERDEFINED/tTYPEDEF,tENUM
+// | VT_PTR -> VT_USERDEFINED/tINTERFACE,tDISPATCH,tCOCLASS
+// | VT_INT
+// - the above with one additional level of indirection.
+//
+WORD NEAR GetTypeCompatibility
+(
+ LPTYPE lpType,
+ WORD fRecurse // 0 -- not being called recursively
+ // VT_BYREF -- being called for a pointer
+ // VT_ARRAY -- being called for an array
+ // VT_PARAM -- being called for a parameter
+)
+{
+ WORD wCompat;
+ UINT cInd;
+
+ // Treat an array as just another level of indirection.
+ BOOL fBYREF = fRecurse & VT_BYREF;
+ BOOL fARRAY = fRecurse & VT_ARRAY;
+ BOOL fPARAM = fRecurse & VT_PARAM;
+ BOOL fSIMPPARAM = fPARAM || !(fBYREF || fARRAY);
+
+ while (lpType->tentrykind == tTYPEDEF)
+ lpType = lpType->td.ptypeAlias;
+
+ cInd = lpType->ref.cIndirect;
+
+ // IDispatch and OA always allow the below types.
+ if (lpType->tdesc.vt <= VT_UNKNOWN || lpType->tdesc.vt == VT_UI1) {
+ // The contents of a safearray may not containg a reference, unless
+ // they're pointing to a UDT. This is not the case, so if we have
+ // both a reference AND a safearray, return NONE.
+ //
+ if (fBYREF && fARRAY) {
+ return COMPAT_NONE;
+ }
+ else {
+ return COMPAT_IDISPATCH | COMPAT_OA;
+ }
+ }
+
+ switch (lpType->tdesc.vt) {
+ case VT_PTR:
+ // Can't even consider more than 2 levels of indirection.
+ if (cInd > 2) {
+ return COMPAT_NONE;
+ }
+
+ // Let VT_USERDEFINED know if we're dealing with
+ // 2 levels of indirection (for ENUM).
+ //
+ if (!fPARAM || fARRAY || cInd == 2) {
+ fRecurse |= VT_BYREF;
+ }
+
+ wCompat = GetTypeCompatibility(lpType->ref.ptypeBase, fRecurse);
+
+ // If the base type is VT_PTR, this isn't valid for IDispatch.
+ if (cInd > 1) {
+ wCompat &= ~COMPAT_IDISPATCH;
+ }
+
+ // Legal values:
+ // cInd = 1, fPARAM = 0, VT == VT_UDT
+ // cInd = 2, fPARAM = 0, error
+ // cInd = 1, fPARAM = 1, fARRAY = 0, VT == ANY
+ // cInd = 1, fPARAM = 1, fARRAY = 1, VT == VT_USERDEFINED
+ // cInd = 2, fPARAM = 1, fARRAY = 0, VT == VT_USERDEFINED
+ // cInd = 2, fPARAM = 1, fARRAY = 1, error
+ //
+ if (lpType->ref.ptypeBase->tdesc.vt != VT_USERDEFINED
+ && (cInd == 1 && (!fPARAM || fARRAY) || cInd == 2 && fPARAM)
+ || (cInd == 2 && (!fPARAM || fARRAY))) {
+
+ wCompat &= ~COMPAT_OA;
+ }
+
+ return wCompat;
+
+ case VT_SAFEARRAY:
+ // Only one array.
+ if (fARRAY) {
+ return COMPAT_NONE;
+ }
+
+ // We allow SAFEARRAY(type)* but not SAFEARRAY (type *), unless
+ // type is a UDT. So if the fBYREF flag has been set, clear it
+ // so we can property check for byrefs in the array.
+ //
+ return GetTypeCompatibility(lpType->ref.ptypeBase,
+ (WORD)(fRecurse & ~VT_BYREF | VT_ARRAY));
+
+ // VT_INT is only allowed in OLE automation.
+ case VT_INT:
+ return COMPAT_OA;
+
+ case VT_USERDEFINED:
+ switch (lpType->tentrykind & ~(tFORWARD | tIMPORTED | tQUAL)) {
+ case tENUM:
+ // fBYREF is set if we're dealing with 2 levels of
+ // indirection.
+ //
+ if (fBYREF) {
+ return COMPAT_NONE;
+ }
+
+ return COMPAT_OA;
+
+ // Cases of the following being used without a level of indirection
+ // are caught elsewhere.
+ //
+ case tINTERFACE:
+ switch(lpType->tentrykind & ~tQUAL) {
+ case tINTERFACE:
+ if (((LPENTRY)lpType)->attr.fAttr2 & f2OACompatBits) {
+ if (((LPENTRY)lpType)->attr.fAttr2 & f2VALIDDUALBASE) {
+ return COMPAT_OA | COMPAT_DUALBASE;
+ } else {
+ return COMPAT_OA;
+ }
+ }
+ break;
+ case (tINTERFACE | tIMPORTED):
+ if ((lpType->import.wTypeFlags & TYPEFLAG_FOLEAUTOMATION))
+ // assume valid for use as a base of a dual interface
+ return COMPAT_OA | COMPAT_DUALBASE;
+ break;
+
+ case (tINTERFACE | tFORWARD):
+ if (((LPENTRY)lpType)->lpEntryForward != NULL) {
+ // if we can get at the real definition, we can check
+ if ((((LPENTRY)lpType)->lpEntryForward->attr.fAttr2 & f2OACompatBits) == 0) {
+ break; // not OA-compatible
+ }
+ }
+ // If all we have is a forward declare, we have no
+ // means of checking to see if this is any good or not,
+ // so assume it's OK.
+ return COMPAT_OA | COMPAT_DUALBASE;
+
+ default:
+ Assert(FALSE);
+ }
+ break; // not OA-compatible
+
+ case tDISPINTER:
+ return COMPAT_IDISPATCH | COMPAT_OA;
+
+ case tCOCLASS:
+ // UNDONE: What are the rules for ensuring COCLASSes
+ // UNDONE: are OA-compatible? Assume they all are for now.
+ return COMPAT_OA;
+
+ case tTYPEDEF:
+ if (lpType->tentrykind & tIMPORTED) {
+ // UNDONE: Assume external typedef's are OA-compatible for
+ // UNDONE: now, rather than walking the typeinfos to find
+ // UNDONE: the true base type & flags.
+ return (COMPAT_IDISPATCH | COMPAT_OA | COMPAT_DUALBASE);
+ }
+ default:
+ break;
+ }
+ // fall through to return COMPAT_NONE
+
+ default:
+ break;
+ // fall through to return COMPAT_NONE
+ }
+ return COMPAT_NONE;
+}
+
+
+// see if this type is (or could be) and object type.
+// this means VARIANT, VARIANT *, coclass *, dispinterface *, or interface *.
+BOOL NEAR IsObjectType
+(
+ LPTYPE lpType
+)
+{
+ while (lpType->tentrykind == tTYPEDEF)
+ lpType = lpType->td.ptypeAlias;
+
+ switch (lpType->tdesc.vt) {
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ case VT_VARIANT:
+ return TRUE; // variant can contain an object
+
+ case VT_PTR: // maybe a pointer to an object or variant
+ lpType = lpType->ref.ptypeBase; // get true base type
+ while (lpType->tentrykind == tTYPEDEF)
+ lpType = lpType->td.ptypeAlias;
+ switch(lpType->tentrykind & ~(tFORWARD | tIMPORTED | tQUAL)) {
+ case tINTERFACE:
+ case tDISPINTER:
+ case tCOCLASS:
+ return TRUE; // pointer to an object is ok
+
+ case tINTRINSIC:
+ switch (lpType->tdesc.vt) {
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ case VT_VARIANT:
+ return TRUE; // pointer to a variant/object is ok
+ }
+ default:
+ break;
+ }
+ // fall through
+
+ default:
+ break;
+ }
+ return FALSE; // not an object type
+}
+
+// parses a "module" section
+VOID NEAR ParseModule
+(
+)
+{
+ LPENTRY lpEntry = typlib.pEntry;
+ ATTR attr;
+
+ // ensure attributes valid in this context
+ CheckAttr(&lpEntry->attr, VALID_MODULE_ATTR, VALID_MODULE_ATTR2);
+
+ // 'dllname' attr required on a module
+ if ((lpEntry->attr.fAttr & fDLLNAME) == 0)
+ ParseError(PERR_DLLNAME_REQ);
+
+ ScanTok(0); // consume "module", advance to next token
+
+ lpEntry->type.tentrykind = tMODULE; // store information in record
+ lpEntry->type.szName = ConsumeId(); // get/consume module name
+ // no need to set rest of type structure
+
+ lpEntry->module.funcList = NULL; // no functions initially
+ lpEntry->module.constList = NULL; // no constants initially
+
+ EnsureNoDupEntries(lpEntry); // check for dup def
+
+ ConsumeTok(RW_LCURLY, 0);
+
+ while (tok.id != RW_RCURLY)
+ {
+ ParseOptAttr(&attr, cFUNC); // parse attributes, if any
+
+ if (tok.id == RW_CONST)
+ { // a constant
+ ScanTok(0); // consume "const"
+ ListInsert(&(lpEntry->module.constList), sizeof(ELEM));
+ lpEntry->module.constList->attr = attr;
+ ParseConstant(lpEntry->module.constList);
+ }
+ else
+ { // assume function
+ ListInsert(&(lpEntry->module.funcList), sizeof(FUNC));
+ lpEntry->module.funcList->func.attr = attr; // store attrs
+
+ // 'entry' attr required on a function in a module
+ if ((attr.fAttr & fENTRY) == 0)
+ ParseError(PERR_ENTRY_REQ);
+
+ ParseFunction(lpEntry->module.funcList, FUNC_MODULE);
+ }
+ }
+
+ ConsumeRCurlyOptSemi(0); // consume rcurly and optional ;
+}
+
+// parse the interface section
+VOID NEAR ParseInterface
+(
+)
+{
+ LPENTRY lpEntry = typlib.pEntry;
+ LPTYPE lpTypeBase;
+
+ // ensure attributes valid in this context
+ CheckAttr(&lpEntry->attr, VALID_INTERFACE_ATTR, VALID_INTERFACE_ATTR2);
+
+ ScanTok(0); // consume "interface", advance to next token
+
+ if (FHandleForwardDecl(lpEntry, tINTERFACE))
+ return; // if THIS is a forward decl
+
+ // UUID is now required on all interfaces
+ if (!(lpEntry->attr.fAttr & fUUID))
+ ParseErrorTokLast(PERR_UUID_REQ);
+
+ if (!(lpEntry->attr.fAttr2 & f2OACompatBits)) {
+ // 'ODL' attr required on old-style (non-OA) interfaces
+ if (!(lpEntry->attr.fAttr & fODL))
+ ParseErrorTokLast(PERR_ODL_REQ);
+ }
+
+ if ((lpEntry->attr.fAttr2 & (f2DUAL | f2NONEXTENSIBLE)) == f2NONEXTENSIBLE){
+ // 'nonextensible' attr only valid on DUAL interfaces
+ ParseErrorTokLast(PERR_INV_ATTR);
+ }
+
+ EnsureNoDupEntries(lpEntry); // check for dup def
+
+ lpEntry->inter.funcList = NULL; // no functions initially
+ lpEntry->type.inter.interList = NULL; // no base interfaces
+
+ lpTypeBase = NULL;
+ if (tok.id == RW_COLON || (lpEntry->attr.fAttr2 & f2OACompatBits))
+ {
+ ConsumeTok(RW_COLON, 0); // consume separating colon
+ if (lpEntry->attr.fAttr2 & f2OACompatBits) {
+ if (lpTypeIDispatch == NULL)
+ FindIDispatch(); // set up lpTypeIDispatch BEFORE
+ // ParseKnownType (below) so that
+ // we can find this.
+ }
+
+ lpTypeBase = ParseKnownType(&lpEntry->attr, fAllowInter);
+ if ((lpTypeBase->tentrykind & ~(tFORWARD | tIMPORTED | tQUAL)) != tINTERFACE)
+ ParseErrorTokLast(PERR_UNDEF_INTER);
+
+ // if we claim to be "Dual" or "OleAutomation"
+ if (lpEntry->attr.fAttr2 & f2OACompatBits) {
+ WORD compatFlags;
+
+ // ok to derive from IDispatch (even though it's
+ // not marked as OA-compatible).
+ if (lpTypeBase != lpTypeIDispatch) {
+ compatFlags = GetTypeCompatibility(lpTypeBase, VT_BYREF);
+ // ensure the interface we derive from is marked as
+ // Oleautomation compatible, and has the correct base
+ // interface.
+ if (lpEntry->attr.fAttr2 & f2DUAL) {
+ // must derive from IDispatch, or another OA interface
+ // that derives from IDispatch.
+ if (!(compatFlags & COMPAT_DUALBASE)) {
+ ParseErrorTokLast(PERR_INV_DUAL_BASE);
+ }
+ } else {
+ // must derive from IUnknown, or another OA interface
+ if (lpTypeBase != lpTypeIUnknown &&
+ !(compatFlags & COMPAT_OA)) {
+ ParseErrorTokLast(PERR_INV_OA_BASE);
+ }
+ }
+ } else {
+ // IDisapatch valid as a base of a dual interface
+ compatFlags = COMPAT_DUALBASE;
+ }
+
+ // mark this interface as dual-compatible if base interface
+ // is dual-compatible
+ if (compatFlags & COMPAT_DUALBASE)
+ lpEntry->attr.fAttr2 |= f2VALIDDUALBASE;
+ }
+
+ ListInsert(&(lpEntry->type.inter.interList), sizeof(INTER));
+ lpEntry->type.inter.interList->ptypeInter = lpTypeBase;
+ // store base interface type
+ lpEntry->type.inter.interList->fAttr = 0; // no flags
+ lpEntry->type.inter.interList->fAttr2 = 0;
+ }
+
+ ConsumeTok(RW_LCURLY, 0);
+
+ while (tok.id != RW_RCURLY)
+ {
+ if (tok.id == RW_TYPEDEF)
+ { // a nested TYPEDEF
+
+ Assert (lpEntryPrev != NULL);
+
+ Assert(lpEntryPrev->type.pNext == (LPTYPE)lpEntry);
+
+ // create & init new item in entry list, linked in before
+ // the entry for the interface. Sets lpEntryPrev to
+ // point to this new entry.
+ InitNewEntry(&lpEntryPrev);
+
+ // lpEntry still points to Interface entry
+ Assert(lpEntryPrev->type.pNext == (LPTYPE)lpEntry);
+
+ ParseTypedef(lpEntryPrev); // parse nested typedef
+ }
+ else
+ { // a function
+
+ ListInsert(&lpEntry->inter.funcList, sizeof(FUNC));
+
+ // parse attributes, if any
+ ParseOptAttr(&lpEntry->inter.funcList->func.attr, cFUNC);
+ ParseFunction(
+ lpEntry->inter.funcList,
+ ((lpEntry->attr.fAttr2 & f2OACompatBits)
+ ? FUNC_OAINTERFACE : FUNC_INTERFACE));
+ }
+ }
+
+ ConsumeRCurlyOptSemi(0); // consume rcurly and optional ;
+}
+
+
+// parse the dispinterface section
+//
+// Goes to extra work to parse the properties and methods into a single list,
+// and then split the list apart, so that you can't define the same name
+// and/or ID in both the properties and methods sections.
+VOID NEAR ParseDispinterface
+(
+)
+{
+ LPENTRY lpEntry = typlib.pEntry;
+ LPELEM elemList = NULL; // no entries initially
+ LPELEM propList;
+ LPELEM elemTemp;
+ LPTYPE lpTypeBase;
+
+ // ensure attributes valid in this context
+ CheckAttr(&lpEntry->attr, VALID_DISPINTER_ATTR, VALID_DISPINTER_ATTR2);
+
+ ScanTok(0); // consume "dispinterface", advance to next tok
+
+ if (FHandleForwardDecl(lpEntry, tDISPINTER))
+ return; // if THIS is a forward decl
+
+ // UUID required on dispinterface section
+ if (!(lpEntry->attr.fAttr & fUUID))
+ ParseErrorTokLast(PERR_UUID_REQ);
+
+ ConsumeTok(RW_LCURLY, 0);
+
+ EnsureNoDupEntries(lpEntry); // check for dup def
+
+ lpEntry->dispinter.propList = NULL; // assume no properties or methods
+ lpEntry->dispinter.methList = NULL;
+ lpEntry->type.inter.interList = NULL; // no base interfaces
+ ListInsert(&(lpEntry->type.inter.interList), sizeof(INTER));
+
+ if (lpTypeIDispatch == NULL)
+ FindIDispatch(); // set up lpTypeIDispatch
+
+ lpEntry->type.inter.interList->ptypeInter = lpTypeIDispatch;
+ // store base interface
+ lpEntry->type.inter.interList->fAttr = 0; // no flags
+ lpEntry->type.inter.interList->fAttr2 = 0; // no flags
+
+ if (tok.id == RW_INTERFACE)
+ { // "interface <interfacename>;
+ ScanTok(0); // consume "interface", advance to next tok
+ // CONSIDER: this code is pretty much the end of ParseClass()
+ // maybe combine this code into a single routine?
+ lpTypeBase = ParseKnownType(&lpEntry->attr, fAllowInter);
+
+ if ((lpTypeBase->tentrykind & ~(tFORWARD | tIMPORTED | tQUAL)) != tINTERFACE)
+ ParseErrorTokLast(PERR_UNDEF_INTER);
+
+ ListInsert(&(lpEntry->type.inter.interList), sizeof(INTER));
+ lpEntry->type.inter.interList->ptypeInter = lpTypeBase;
+ // save * to referenced interface
+ lpEntry->type.inter.interList->fAttr = 0; // no flags
+ lpEntry->type.inter.interList->fAttr2 = 0;
+
+ ConsumeTok(RW_SEMI, 0); // ends with a semicolon
+ goto DoneDispinter;
+ }
+
+ // Parse the properties (if any).
+ ConsumeTok(RW_PROPERTIES, 0);
+ ConsumeTok(RW_COLON, 0);
+
+ while (tok.id != RW_METHODS && tok.id != RW_RCURLY)
+ {
+ ParseNewElem(&elemList,
+ VALID_DISPINTER_PROP_ATTR,
+ VALID_DISPINTER_PROP_ATTR2,
+ NULL);
+ ConsumeTok(RW_SEMI, 0); // ends with a semicolon
+ // 'id' attribute is required on dispinterface items
+ if (!(elemList->attr.fAttr & fID))
+ ParseErrorTokLast(PERR_ID_REQ);
+
+ // if SOURCE specfied, must be an object/variant type
+ if ((elemList->attr.fAttr & fSOURCE)
+ && !IsObjectType(elemList->elemType))
+ ParseErrorTokLast(PERR_INV_SOURCE_ATTR);
+
+ // type of this var must be an IDispatch-compatible type
+ EnsureIDispatchType(elemList->elemType);
+ }
+
+ lpEntry->dispinter.propList = elemList; // set property list
+ propList = elemList; // cache
+
+ // Parse the methods (if any).
+ ConsumeTok(RW_METHODS, 0);
+ ConsumeTok(RW_COLON, 0);
+
+ // now parse the methods (if any)
+ while (tok.id != RW_RCURLY)
+ {
+ ListInsert(&elemList, sizeof(FUNC));
+ ParseOptAttr(&elemList->attr, cFUNC);
+
+ ParseFunction((LPFUNC)elemList, FUNC_DISPINTERFACE);
+ if (!(elemList->attr.fAttr & fID))
+ ParseErrorTokLast(PERR_ID_REQ);
+ }
+
+ // now split the single list into 2 separate lists
+
+ if (elemList != propList)
+ { // if got methods
+ lpEntry->dispinter.methList = (LPFUNC)elemList; // got methods
+ if (propList)
+ { // got both methods & properties -- split into 2 lists.
+ // Swap links in order to link last method to first method,
+ // last property to first property
+ elemTemp = elemList->pNext;
+ elemList->pNext = propList->pNext;
+ propList->pNext = elemTemp;
+ }
+ }
+
+DoneDispinter:
+ ConsumeRCurlyOptSemi(0); // consume rcurly and optional ;
+}
+
+// parse the coclass section
+VOID NEAR ParseCoclass
+(
+)
+{
+
+ LPENTRY lpEntry = typlib.pEntry;
+ LPTYPE lpTypeBase;
+ TENTRYKIND tag;
+ WORD fGotDispinter = 0;
+ WORD fGotDefault = 0;
+ WORD flags;
+#define BIT_NOTSOURCE 1 // flags for fGotDispinter and fGotDefault
+#define BIT_SOURCE 2
+ ATTR attr;
+ LPINTER lpinter;
+ LPINTER lpinterList;
+
+ // ensure attributes valid in this context
+ CheckAttr(&lpEntry->attr, VALID_COCLASS_ATTR, VALID_COCLASS_ATTR2);
+
+ ScanTok(0); // consume "coclass", advance to next tok
+
+ // Since a function can now return a COCLASS, we must
+ // be able to handle forward declarations to them.
+ //
+ if (FHandleForwardDecl(lpEntry, tCOCLASS))
+ return; // if THIS is a forward decl
+
+ // UUID required on coclass section
+ if (!(lpEntry->attr.fAttr & fUUID))
+ ParseError(PERR_UUID_REQ);
+
+ lpEntry->type.inter.interList = NULL; // no base interfaces
+
+ EnsureNoDupEntries(lpEntry); // check for dup def
+
+ ConsumeTok(RW_LCURLY, 0);
+
+ do {
+ // parse a COCLASS entry
+ ParseOptAttr(&attr, cIMPLTYPE); // parse attributes, if any
+
+ // ensure attributes valid in this context
+ CheckAttrTokLast(&attr, VALID_COCLASS_INTER_ATTR,
+ VALID_COCLASS_INTER_ATTR2);
+
+ flags = (WORD)((attr.fAttr & fSOURCE) ? BIT_SOURCE : BIT_NOTSOURCE);
+
+ if (attr.fAttr & fDEFAULT) {
+ if (attr.fAttr & fRESTRICTED) {
+ // default restricted makes no sense
+ ParseErrorTokLast(PERR_INV_ATTR_COMBO);
+ }
+
+ // figure out if we have too many default's or not. We're allowed
+ // at most one [default] inter, and one [source, default] inter.
+ if (fGotDefault & flags) {
+ ParseError(PERR_DUP_DEF);
+ }
+ fGotDefault |= flags;
+ }
+
+ switch (tok.id)
+ {
+ case RW_INTERFACE:
+ tag = tINTERFACE;
+ break;
+ case RW_DISPINTERFACE:
+ tag = tDISPINTER;
+
+ // figure out if we have too many dispinterface's or not.
+ // We're allowed at most one non-[source] dispinterface, but
+ // as many [source] dispinterfaces as we want.
+ if (fGotDispinter & flags == BIT_NOTSOURCE) {
+ // Error is caught at Layout(), but it's so crypitic I'm
+ // catching it at parse time instead.
+ ParseError(PERR_TWO_DISPINTER);
+ }
+ fGotDispinter |= flags;
+ break;
+ default:
+ ParseError(PERR_EXP_INTER); // expected dispinterface or interface
+ }
+ ScanTok(0); // consume "interface"/"dispinterface"
+
+ lpTypeBase = ParseKnownType(&lpEntry->attr, fAllowInter);
+
+ if ((lpTypeBase->tentrykind & ~(tFORWARD | tIMPORTED | tQUAL)) != tag)
+ ParseErrorTokLast(PERR_UNDEF_INTER);
+
+ // insert referenced interface/dispinterface into list of interfaces
+ ListInsert(&(lpEntry->type.inter.interList), sizeof(INTER));
+ lpEntry->type.inter.interList->ptypeInter = lpTypeBase;
+ lpEntry->type.inter.interList->fAttr = attr.fAttr; // save flags
+ lpEntry->type.inter.interList->fAttr2 = attr.fAttr2;
+
+ ConsumeTok(RW_SEMI, 0); // ends with a semicolon
+
+ } while (tok.id != RW_RCURLY); // while not end of list
+
+ // If we didn't get interfaces with both source and non-source default
+ // attributes, then we need to go through and set the default bit on the
+ // first source and first non-source interfaces that aren't restricted.
+ lpinterList = lpEntry->type.inter.interList;
+ lpinter = (LPINTER)ListFirst(lpinterList);
+ while (fGotDefault != (BIT_NOTSOURCE | BIT_SOURCE))
+ {
+ flags = (WORD)((lpinter->fAttr & fSOURCE) ? BIT_SOURCE : BIT_NOTSOURCE);
+ if (!(fGotDefault & flags) && !(lpinter->fAttr & fRESTRICTED)) {
+ // if we don't have a default yet for this variety
+ // (source/nonsource) of interface, and this interface isn't
+ // marked as restricted, then tag it as default.
+ lpinter->fAttr |= fDEFAULT;
+ fGotDefault |= flags;
+ }
+
+ // advance to next entry if not all done
+ if (lpinter == (LPINTER)ListLast(lpinterList))
+ break; // exit if all done
+ lpinter = (LPINTER)lpinter->pNext;
+ } // WHILE
+
+ ConsumeRCurlyOptSemi(0); // consume rcurly and optional ;
+}
+
+
+// parses: importlib (filename);
+VOID NEAR ParseImportlib
+(
+)
+{
+
+ ScanTok(0); // consume "importlib", advance to next token
+ ConsumeTok(RW_LPAREN, fACCEPT_STRING);
+
+ ListInsert(&typlib.pImpLib, sizeof(IMPORTLIB));
+
+ typlib.pImpLib->lptlib = NULL; // null out pointers in case of error
+ typlib.pImpLib->lptcomp = NULL;
+ typlib.pImpLib->lptlibattr = NULL;
+
+ typlib.pImpLib->lpszFileName = lpszParseStringExpr(); // parse filename
+
+ ConsumeTok(RW_RPAREN, 0);
+
+ //now load the type library, and fill in pImpLib->lpszLibName/lptcomp.
+ LoadExtTypeLib(typlib.pImpLib);
+
+ ConsumeTok(RW_SEMI, 0);
+}
+
+// ****************************************
+// Expression support
+// ****************************************
+
+LPSTR NEAR lpszParseStringExpr()
+{
+ LPSTR result;
+
+ // string expressions are not supported -- only accept string literals
+
+ if (tok.id != LIT_STRING) // better be a string literal
+ ParseError(PERR_EXP_STRING);
+ if (tok.cbsz == 0) // empty string not allowed here
+ ParseError(PERR_INV_STRING);
+ result = tok.lpsz;
+ ScanTok(0); // consume string token
+ return result;
+}
+
+// supports (minimal) numeric expressions
+// Current level of support is:
+// add
+// subtract
+// (numeric literals, parentheses, and unary minus are handled
+// by lParseNumber)
+DWORD NEAR lParseNumericExpr()
+{
+ DWORD result;
+ TOKID idOp;
+ DWORD nextNum;
+
+ result = lParseNumber();
+ while (tok.id >= OP_MIN && tok.id <= OP_MAX)
+ { // repeat while a binary operator follows this number
+ idOp = tok.id; // save operator ID
+ ScanTok(fACCEPT_NUMBER); // consume the operator
+
+ nextNum = lParseNumber(); // get number after this opcode
+
+ switch (idOp)
+ {
+ case OP_ADD:
+ result = result + nextNum;
+ break;
+
+ case OP_SUB:
+ result = result - nextNum;
+ break;
+
+ // CONSIDER: (V2, EXPR) Add more operators.
+ // CONSIDER: (V2, EXPR) Probably have to completely re-write this
+ // CONSIDER: (V2, EXPR) routine to deal with operator precidence.
+
+ default:
+ // CONSIDER: should probably report error on the operator,
+ // CONSIDER: not on the 2nd number
+ ParseErrorTokLast(PERR_UNSUPPORTED_OP);
+ }
+ }
+
+ return result;
+}
+
+// Parses a single number:
+// one numeric literal,
+// a unary minus followed by a single number
+// a numeric expression enclosed in parentheses
+// Rejects anything that doesn't meet the above criteria.
+DWORD NEAR lParseNumber()
+{
+ DWORD result;
+
+ switch (tok.id)
+ {
+ case RW_LPAREN:
+ ScanTok(fACCEPT_NUMBER); // consume the '('
+ result = lParseNumericExpr(); // return value of stuff
+ // inside the parens
+ ConsumeTok(RW_RPAREN, fACCEPT_OPERATOR);
+ break;
+
+ case RW_HYPHEN: // treat as unary minus
+ // just assume the expression is signed at this point
+ ScanTok(fACCEPT_NUMBER); // consume the '-'
+
+ // if negative numeric literal, ensure in range of signed I4
+ if (tok.id == LIT_NUMBER && tok.number > 0x80000000)
+ ParseError(PERR_NUMBER_OV);
+
+ result = -(long)lParseNumber();
+ break;
+
+ case LIT_NUMBER:
+ result = tok.number;
+ ScanTok(fACCEPT_OPERATOR); // consume the number
+ break;
+
+ //case LIT_STRING:
+ default:
+ ParseError(PERR_INV_EXPRESSION);
+ }
+ return result;
+}
+
+
+// ****************************************
+// Utility routines
+// ****************************************
+
+// Calls ParseError if these attributes are invalid in this context
+VOID NEAR CheckAttr
+(
+ LPATTR pAttr,
+ DWORD attrbit,
+ DWORD attrbit2
+)
+{
+ if (pAttr->fAttr & ~attrbit || pAttr->fAttr2 & ~attrbit2)
+ ParseError(PERR_INV_ATTR); // invalid in this context
+}
+
+// Calls ParseErrorTokLast if these attributes are invalid in this context
+VOID NEAR CheckAttrTokLast
+(
+ LPATTR pAttr,
+ DWORD attrbit,
+ DWORD attrbit2
+)
+{
+ if (pAttr->fAttr & ~attrbit || pAttr->fAttr2 & ~attrbit2)
+ ParseErrorTokLast(PERR_INV_ATTR); // invalid in this context
+}
+
+VOID NEAR GotAttr
+(
+ LPATTR pAttr,
+ DWORD attrbit
+)
+{
+ if (pAttr->fAttr & attrbit) // error if already specified
+ ParseErrorTokLast(PERR_INV_ATTR_COMBO);
+ pAttr->fAttr |= attrbit;
+}
+
+VOID NEAR GotAttr2
+(
+ LPATTR pAttr,
+ DWORD attrbit2
+)
+{
+ if (pAttr->fAttr2 & attrbit2) // error if already specified
+ ParseErrorTokLast(PERR_INV_ATTR_COMBO);
+ pAttr->fAttr2 |= attrbit2;
+}
+
+// consumes a close curly followed by an optional semicolon.
+VOID NEAR ConsumeRCurlyOptSemi
+(
+ WORD fAccept
+)
+{
+ ConsumeTok(RW_RCURLY, fAccept); // consume the close curly
+ if (tok.id == RW_SEMI)
+ ScanTok(fAccept); // consume the ';' if present
+}
+
+
+// consumes an identifer token.
+LPSTR NEAR ConsumeId()
+{
+ LPSTR lpszRet;
+
+ if (tok.id != LIT_ID) // ensure we've got an ID
+ ParseError(PERR_EXP_IDENTIFIER); // error if not
+ lpszRet = tok.lpsz; // save id name for return value
+ ScanTok(0); // consume ID token
+
+ return lpszRet; // return id name
+}
+
+
+// ensure last element in entry list isn't duplicated
+// Also ensures that the uuid defined by this entry (if specified) isn't
+// specified by somebody else.
+VOID NEAR EnsureNoDupEntries
+(
+ LPENTRY lpEntryLast
+)
+{
+ LPENTRY lpEntry;
+ LPSTR szNameLast;
+ LPSTR szTagLast;
+ GUID FAR * lpUuidLast;
+
+ szNameLast = lpEntryLast->type.szName; // name of last entry added
+
+ lpUuidLast = NULL; // assume no UUID
+ szTagLast = NULL; // assume no tag
+
+ // set up szTagLast and lpUuidLast, and ensure that the last entry
+ // doesn't conflict with the 'library' section.
+ switch (lpEntryLast->type.tentrykind & ~tFORWARD)
+ {
+ case tINTRINSIC:
+ case tREF:
+ break; // no attr field on these guys
+
+ case tSTRUCT:
+ case tENUM:
+ case tUNION:
+ szTagLast = lpEntryLast->type.structenum.szTag; // NULL if none
+ // fall into default processing
+
+ default:
+ if (lpEntryLast->type.tentrykind & tIMPORTED)
+ break; // no attr field on these guys
+
+ if (lpEntryLast->attr.fAttr & fUUID) // if UUID specified
+ {
+ lpUuidLast = lpEntryLast->attr.lpUuid; // get * to uuid
+ // ensure this UUID isn't duplicated with the library's uuid
+ if ((typlib.attr.fAttr & fUUID) &&
+ !_fmemcmp(lpUuidLast, typlib.attr.lpUuid, sizeof(GUID)))
+ ParseErrorTokLast(PERR_DUP_UUID);
+ }
+ };
+
+ // ensure it's not duplicated by any other entry name/uuid
+ for (lpEntry = (LPENTRY)ListFirst(typlib.pEntry); lpEntry != lpEntryLast; lpEntry = (LPENTRY)(lpEntry->type.pNext))
+ {
+ if (lpEntry->type.tentrykind & tIMPORTED) {
+ // The following check ensures that you can't have a
+ // type definition of the same name as an unqualified reference
+ // to a type in another library. While things will work, it's
+ // a bit confusing if two id's in the same file refer to
+ // to different types just because one comes before the
+ // definition of a type.
+ // Qualifed references to types in other type libraries don't
+ // present any ambiguity.
+ if (!(lpEntry->type.tentrykind & tQUAL)) {
+ // ensure name isn't duplicated (CASE-INSENSITIVE)
+ if (!FCmpCaseIns(szNameLast, lpEntry->type.szName))
+ ParseErrorTokLast(PERR_DUP_DEF); // then error
+ }
+ }
+ else {
+ switch (lpEntry->type.tentrykind & ~tFORWARD)
+ {
+ case tREF:
+ break; // no conflicts possible with these guys
+
+ case tINTRINSIC:
+ // ensure intrinsic name isn't duplicated (CASE-SENSITIVE)
+ if (!_fstrcmp(szNameLast, lpEntry->type.szName))
+ ParseErrorTokLast(PERR_DUP_DEF);
+ break;
+
+ case tSTRUCT:
+ case tENUM:
+ case tUNION:
+ // ensure tag (if given) isn't duplicated (CASE-SENSITIVE)
+ if (szTagLast && lpEntry->type.structenum.szTag &&
+ !_fstrcmp(szTagLast, lpEntry->type.structenum.szTag))
+ CheckForwardMatch(lpEntryLast, lpEntry);
+
+ if (lpEntry->type.tentrykind & tFORWARD)
+ break; // forward declares of these don't have
+ // their names filled in yet
+
+ // fall into default processing to check names
+
+ default:
+ // ensure name isn't duplicated (CASE-INSENSITIVE)
+ if (!FCmpCaseIns(szNameLast, lpEntry->type.szName))
+ CheckForwardMatch(lpEntryLast, lpEntry);
+
+ // ensure this UUID isn't duplicated
+ if (lpUuidLast && (lpEntry->attr.fAttr & fUUID) &&
+ !_fmemcmp(lpUuidLast, lpEntry->attr.lpUuid, sizeof(GUID)))
+ ParseErrorTokLast(PERR_DUP_UUID);
+ }
+ }
+ }
+}
+
+
+// called when 2 entries have the same name -- ensure these are valid
+// combinations of forward declares. If not -- then dup def error.
+VOID NEAR CheckForwardMatch
+(
+ LPENTRY lpEntryLast,
+ LPENTRY lpEntry
+)
+{
+ // if one of these isn't a forward declare
+ if ((((lpEntryLast->type.tentrykind | lpEntry->type.tentrykind) & tFORWARD) == 0) ||
+
+ // or if the type's of these forward declares don't match
+ ((lpEntryLast->type.tentrykind & ~tFORWARD) != (lpEntry->type.tentrykind & ~tFORWARD)) )
+
+ ParseErrorTokLast(PERR_DUP_DEF); // then error
+}
+
+
+INT FAR FCmpCaseIns
+(
+ LPSTR str1,
+ LPSTR str2
+)
+{
+ return !(CompareStringA(g_lcidCompare,
+ NORM_IGNOREWIDTH |
+ NORM_IGNOREKANATYPE |
+ NORM_IGNORECASE,
+ str1,
+ -1,
+ str2,
+ -1)
+ == 2);
+
+}
+
+// *************************************************************************
+// Linked list management
+// *************************************************************************
+
+// assumes all lists have a pNext field in the same position (usually first)
+// This routine will go to ParseError if it runs out of memory
+VOID FAR ListInsert
+(
+ LPVOID ppList,
+ WORD cbElem
+)
+{
+ LPTYPE pNewItem; // any type that has a pNext -- they all have
+ LPTYPE pList; // them in the same positions
+
+ pNewItem = (LPTYPE)ParseMalloc(cbElem); // new last item
+ pList = *(LPTYPE FAR *)ppList; // deref
+
+ if (pList) // if list not empty
+ {
+ pNewItem->pNext = pList->pNext; // set * to head of list
+ pList->pNext = pNewItem; // point to new last item
+ }
+ else
+ {
+ pNewItem->pNext = pNewItem; // point back to itself
+ }
+ *(LPTYPE FAR *)ppList = pNewItem; // point to last item
+}
+
+
+
+/***
+* BOOL VerifyLcid(LCID lcid) - ripped out of silver
+*
+* Purpose: Checks if the passed in lcid is valid.
+*
+* Inputs:
+* lcid : LCID that needs to be verified.
+*
+* Outputs: BOOL : return TRUE if the passed in lcid is a valid LCID
+* else return FALSE
+*
+*****************************************************************************/
+BOOL NEAR VerifyLcid(LCID lcid)
+{
+ BOOL fValidLcid;
+ INT i;
+
+ // Call the nlsapi function to compare string. If the compare
+ // succeeds then the LCID is valid or else the passed in lcid is
+ // invalid. This is because the only reason the comparision will
+ // fail is f the lcid is invalid.
+
+ char rgTest[] = "Test\0";
+
+ fValidLcid = (BOOL) (CompareStringA(lcid, NORM_IGNORECASE | NORM_IGNORENONSPACE,
+ rgTest, -1, rgTest, -1)== 2);
+
+ if (fValidLcid) {
+ // if DBCS lcid, update lead byte table appropriately
+
+#if defined(WIN32)
+ UINT CodePage;
+ CHAR szCodePage[6]; // space for an ascii integer
+
+ // Attempt to use IsDBCSLeadByteEx API to compute this. If this doesn't
+ // work, fall into the hardcoded code, to take our best shot at it.
+ if (GetLocaleInfoA(lcid,
+ LOCALE_NOUSEROVERRIDE | LOCALE_IDEFAULTANSICODEPAGE,
+ szCodePage,
+ sizeof(szCodePage)) != 0) {
+ CodePage = atoi(szCodePage);
+
+ // start at 128 since there aren't any lead bytes before that
+ for(i = 128; i < 256; i++) {
+ g_rgchLeadBytes[i] = (char)IsDBCSLeadByteEx(CodePage, (char)i);
+ }
+ goto Done;
+ }
+#endif //WIN32
+ switch (PRIMARYLANGID(lcid)) {
+ case LANG_CHINESE:
+ if (SUBLANGID(lcid) == SUBLANG_CHINESE_TRADITIONAL) {
+ g_rgchLeadBytes[0x80] = 0;
+ for (i = 0x81; i <= 0xFE; i++) {
+ g_rgchLeadBytes[i] = 1;
+ }
+ g_rgchLeadBytes[0xFF] = 0;
+ break;
+ }
+ // fall into LANG_KOREAN for SUBLANG_CHINESE_SIMPLIFIED
+ case LANG_KOREAN:
+ for (i = 0x80; i <= 0xA0; i++) {
+ g_rgchLeadBytes[i] = 0;
+ }
+ for (i = 0xA1; i <= 0xFE; i++) {
+ g_rgchLeadBytes[i] = 1;
+ }
+ g_rgchLeadBytes[0xFF] = 0;
+ break;
+ break;
+ case LANG_JAPANESE:
+ memset(g_rgchLeadBytes+128, 0, 128);
+ for (i = 0x81; i <= 0x9F; i++) {
+ g_rgchLeadBytes[i] = 1;
+ }
+ for (i = 0xE0; i <= 0xFC; i++) {
+ g_rgchLeadBytes[i] = 1;
+ }
+ break;
+ break;
+ default:
+ // not a DBCS LCID
+ memset(g_rgchLeadBytes+128, 0, 128);
+ break;
+ }
+#if defined(WIN32)
+Done: ;
+#endif //WIN32
+ }
+
+ return fValidLcid;
+}
+
+
+VOID NEAR FindIDispatch()
+{
+ char * szIDispatch = "IDispatch";
+ char * szIUnknown = "IUnknown";
+
+ // find existing type of this name with 0 levels of indirection
+ lpTypeIDispatch = FindType(szIDispatch, FALSE, tANY);
+
+ if (lpTypeIDispatch == NULL) {
+ // if not found here, then search all external type libraries for
+ // this type definition.
+ lpTypeIDispatch = FindExtType(NULL, szIDispatch);
+ }
+ if (lpTypeIDispatch == NULL) {
+ ParseError(PERR_NO_IDISPATCH);
+ }
+
+ // now do the same for IUnknown
+ // find existing type of this name with 0 levels of indirection
+ lpTypeIUnknown = FindType(szIUnknown, FALSE, tANY);
+
+ if (lpTypeIUnknown == NULL) {
+ // if not found here, then search all external type libraries for
+ // this type definition.
+ lpTypeIUnknown = FindExtType(NULL, szIUnknown);
+ }
+ if (lpTypeIUnknown == NULL) {
+ ParseError(PERR_NO_IUNKNOWN);
+ }
+}
diff --git a/private/oleauto/src/mktyplib/parser.h b/private/oleauto/src/mktyplib/parser.h
new file mode 100644
index 000000000..fd9a45bb5
--- /dev/null
+++ b/private/oleauto/src/mktyplib/parser.h
@@ -0,0 +1,93 @@
+// PARSER.H
+//
+// parser-specific data
+
+// attributes that must be the consistent among all property functions with
+// the same name
+#define fPropFuncBits (fSOURCE | fBINDABLE | fREQUESTEDIT | fDISPLAYBIND | fDEFAULTBIND | fHIDDEN)
+
+// Common bits
+#define fHelpBits (fHELPSTRING | fHELPCONTEXT)
+#define fFuncBits (fVARARG | fSTRING | fPropBits | fPropFuncBits)
+#define fParmBits (fOPTIONAL | fIN | fOUT | fSTRING)
+#define fTypeBits (fHelpBits | fHIDDEN | fUUID)
+#define fElemBits (fHelpBits | fHIDDEN)
+
+
+// *************************************
+// attributes on typelibs
+// *************************************
+#define VALID_LIBRARY_ATTR (fHelpBits | fUUID | fVERSION | fHELPFILE | fLCID | fRESTRICTED | fHIDDEN)
+#define VALID_LIBRARY_ATTR2 (f2CONTROL)
+
+// *************************************
+// attributes on typeinfos
+// *************************************
+#define VALID_TYPEDEF_ATTR (fTypeBits | fPUBLIC)
+#define VALID_TYPEDEF_ATTR2 (0)
+
+#define VALID_STRUCT_ENUM_UNION_ATTR (fTypeBits | fVERSION)
+#define VALID_STRUCT_ENUM_UNION_ATTR2 (0)
+
+#define VALID_MODULE_ATTR (fTypeBits | fVERSION | fDLLNAME)
+#define VALID_MODULE_ATTR2 (0)
+
+#define VALID_DISPINTER_ATTR (fTypeBits | fVERSION)
+#define VALID_DISPINTER_ATTR2 (f2NONEXTENSIBLE)
+
+#define VALID_INTERFACE_ATTR (fTypeBits | fVERSION | fODL)
+#define VALID_INTERFACE_ATTR2 (f2DUAL | f2NONEXTENSIBLE | f2OLEAUTOMATION)
+
+#define VALID_COCLASS_ATTR (fTypeBits | fVERSION | fAPPOBJECT | fLICENSED | fPREDECLID)
+#define VALID_COCLASS_ATTR2 (f2CONTROL)
+
+// *************************************
+// attributes on members of typeinfos
+// *************************************
+#define VALID_DISPINTER_PROP_ATTR (fElemBits | fID | fSTRING | fREADONLY | fPropFuncBits)
+#define VALID_DISPINTER_PROP_ATTR2 (0)
+
+#define VALID_MODULE_FUNC_ATTR (fElemBits | fFuncBits | fRESTRICTED | fENTRY)
+#define VALID_MODULE_FUNC_ATTR2 (0)
+
+#define VALID_MODULE_CONST_ATTR (fElemBits)
+#define VALID_MODULE_CONST_ATTR2 (0)
+
+#define VALID_INTERFACE_FUNC_ATTR (fElemBits | fFuncBits | fRESTRICTED | fID)
+#define VALID_INTERFACE_FUNC_ATTR2 (0)
+
+#define VALID_DISPINTER_FUNC_ATTR (fElemBits | fFuncBits | fID)
+#define VALID_DISPINTER_FUNC_ATTR2 (0)
+
+#define VALID_COCLASS_INTER_ATTR (fDEFAULT | fRESTRICTED | fSOURCE)
+#define VALID_COCLASS_INTER_ATTR2 (0)
+
+#define VALID_ENUM_ELEM_ATTR (fHelpBits)
+#define VALID_ENUM_ELEM_ATTR2 (0)
+
+#define VALID_STRUCT_UNION_ELEM_ATTR (fHelpBits | fSTRING)
+#define VALID_STRUCT_UNION_ELEM_ATTR2 (0)
+
+// *************************************
+// attributes on parameters
+// *************************************
+#define VALID_MODULE_PARM_ATTR (fParmBits | fLCID | fRETVAL)
+#define VALID_MODULE_PARM_ATTR2 (0)
+
+#define VALID_INTERFACE_PARM_ATTR (fParmBits | fLCID | fRETVAL)
+#define VALID_INTERFACE_PARM_ATTR2 (0)
+
+#define VALID_DISPINTER_PARM_ATTR (fParmBits)
+#define VALID_DISPINTER_PARM_ATTR2 (0)
+
+
+// Bits for ParseKnownType(), to control what special types it will accept
+#define fAllowSAFEARRAY 0x01
+#define fAllowCARRAY 0x02
+#define fAllowMODULE 0x04
+#define fAllowCOCLASS 0x08
+#define fAllowINTERFACE 0x10
+#define fAllowDISPINTER 0x20
+
+#define fAllowArray (fAllowSAFEARRAY | fAllowCARRAY)
+#define fAllowInter (fAllowINTERFACE | fAllowDISPINTER | fAllowCOCLASS)
diff --git a/private/oleauto/src/mktyplib/stdole.def b/private/oleauto/src/mktyplib/stdole.def
new file mode 100644
index 000000000..007c6d721
--- /dev/null
+++ b/private/oleauto/src/mktyplib/stdole.def
@@ -0,0 +1,15 @@
+LIBRARY STDOLE
+DESCRIPTION 'Standard OLE Type Library'
+
+EXETYPE WINDOWS
+CODE MOVEABLE DISCARDABLE
+DATA SINGLE MOVEABLE PRELOAD
+
+PROTMODE
+HEAPSIZE 512
+
+SEGMENTS _TEXT PRELOAD
+
+EXPORTS
+ WEP @0 RESIDENTNAME
+
diff --git a/private/oleauto/src/mktyplib/stdole.odl b/private/oleauto/src/mktyplib/stdole.odl
new file mode 100644
index 000000000..55b3607b4
--- /dev/null
+++ b/private/oleauto/src/mktyplib/stdole.odl
@@ -0,0 +1,117 @@
+
+#define FAR _far
+
+[
+ uuid(00020430-0000-0000-C000-000000000046),
+ lcid(0x0000), // lcid =0; locale independent.
+ helpstring("OLE Automation"),
+ version(1.0),
+ restricted
+]
+library stdole
+{
+ typedef unsigned long DWORD; // non-public typedef's
+ typedef unsigned long ULONG;
+ typedef unsigned short WORD;
+ typedef unsigned char BYTE;
+ typedef unsigned int UINT;
+ typedef DWORD LCID;
+
+ typedef struct GUID
+ {
+ DWORD Data1;
+ WORD Data2;
+ WORD Data3;
+ BYTE Data4[8];
+ } GUID;
+
+ typedef GUID IID; // non-public typedef's
+ typedef IID FAR * REFIID;
+ typedef LONG DISPID;
+
+ //UNDONE: what to do about ITypeInfo ???
+ #define ITypeInfo void
+
+ typedef VARIANT VARIANTARG;
+
+ typedef struct tagDISPPARAMS{
+ VARIANTARG FAR* rgvarg;
+ DISPID FAR* rgdispidNamedArgs;
+ UINT cArgs;
+ UINT cNamedArgs;
+ } DISPPARAMS;
+
+
+ typedef struct tagEXCEPINFO {
+ WORD wCode;
+ WORD wReserved;
+ BSTR bstrSource;
+ BSTR bstrDescription;
+ BSTR bstrHelpFile;
+ DWORD dwHelpContext;
+ void FAR* pvReserved;
+#if 0
+ // REVIEW: the current TypeInfo implementation cant represent
+ // function pointers, so we just fillin with a void* for now.
+ HRESULT (STDAPICALLTYPE FAR* pfnDeferredFillIn)(struct tagEXCEPINFO FAR*);
+#else
+ void FAR* pfnDeferredFillIn;
+#endif
+ SCODE scode;
+ } EXCEPINFO;
+
+ [uuid(00000000-0000-0000-C000-000000000046), odl]
+ interface IUnknown
+ {
+ [restricted] HRESULT QueryInterface([in] REFIID riid, [out] void FAR* FAR* ppvObj);
+ [restricted] ULONG AddRef(void);
+ [restricted] ULONG Release(void);
+ };
+
+ [uuid(00020400-0000-0000-C000-000000000046), odl]
+ interface IDispatch:IUnknown
+ {
+ [restricted] HRESULT GetTypeInfoCount([out]UINT FAR* pctinfo);
+
+ [restricted] HRESULT GetTypeInfo(
+ [in] UINT itinfo,
+ [in] LCID lcid,
+ [out] ITypeInfo FAR* FAR* pptinfo);
+
+ [restricted] HRESULT GetIDsOfNames(
+ [in] REFIID riid,
+ [in] char FAR* FAR* rgszNames,
+ [in] UINT cNames,
+ [in] LCID lcid,
+ [out] DISPID FAR* rgdispid);
+
+ [restricted] HRESULT Invoke(
+ [in] DISPID dispidMember,
+ [in] REFIID riid,
+ [in] LCID lcid,
+ [in] WORD wFlags,
+ [in] DISPPARAMS FAR* pdispparams,
+ [out] VARIANT FAR* pvarResult,
+ [out] EXCEPINFO FAR* pexcepinfo,
+ [out] UINT FAR* puArgErr);
+ };
+
+ [uuid(00020404-0000-0000-C000-000000000046), odl]
+ interface IEnumVARIANT:IUnknown
+ {
+
+ HRESULT Next(
+ [in] unsigned long celt,
+ [in] VARIANT FAR* rgvar,
+ [out] unsigned long FAR* pceltFetched);
+
+ HRESULT Skip([in] unsigned long celt);
+
+ HRESULT Reset(void);
+
+ HRESULT Clone([out] IEnumVARIANT FAR* FAR* ppenum);
+
+ };
+
+
+} // eof
diff --git a/private/oleauto/src/mktyplib/stdole.rc b/private/oleauto/src/mktyplib/stdole.rc
new file mode 100644
index 000000000..57eebf84d
--- /dev/null
+++ b/private/oleauto/src/mktyplib/stdole.rc
@@ -0,0 +1,114 @@
+/***
+*stdole.rc - Resource file for stdole.tlb
+*
+* Copyright (C) 1994-1995, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+*****************************************************************************/
+
+// first include the type library as a resource
+1 typelib stdole.tmp
+
+#include <windows.h>
+#include <ver.h>
+
+#include "verstamp.h"
+
+#ifndef OLEMINORVERS
+// win16 typelib.dll for Daytona will require a special build. Oh well.
+#define OLEMINORVERS 02 // assume OLE 2.02
+#endif //!OLEMINORVERS
+
+// for OLE, we want the major version # to be 2
+#undef rmj
+#define rmj 2
+#undef rmm
+#define rmm OLEMINORVERS // want version # to be 2.OLEMINORVERS.xxxx
+// keep 'rup' the same as OB's version number for simplicity
+
+// WARNING: Similar code exists in tlibutil.cxx in the implementation of
+// WARNING: OaBuildVersion -- keep the two versions in ssync!
+
+/* Define the version string with more preprocessor magic */
+#define STRING(x) #x
+#define VERSTRINGX(maj,min,rev) STRING(maj ## . ## min ## . ## rev ## \0)
+#define VERSTRING VERSTRINGX(rmj,rmm,rup)
+
+/* Version information */
+VS_VERSION_INFO VERSIONINFO
+//FILEVERSION rmj,rmm,rup,0
+//PRODUCTVERSION rmj,rmm,rup,0
+
+// WARNING: Similar code exists in tlibutil.cxx in the implementation of
+// WARNING: OaBuildVersion -- keep the two versions in ssync!
+
+// Use VBA's verstamp.h to get the file versions for now.
+FILEVERSION 2,rmm,rup,01
+PRODUCTVERSION 2,rmm,rup,01
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+
+#if 0
+#define BETAFLAG VS_FF_PRERELEASE
+#else //1
+#define BETAFLAG 0L
+#endif //1
+
+#ifdef _DEBUG
+FILEFLAGS VS_FF_DEBUG | BETAFLAG
+#else // !_DEBUG
+FILEFLAGS BETAFLAG
+#endif // !_DEBUG
+
+#if (OLEMINORVERS == 02)
+// re-distributable 16-bit DLL
+FILEOS VOS_DOS_WINDOWS16
+#else
+FILEOS VOS_DOS_WINDOWS32
+// non-re-distributable 16-bit DLL (shipped with the OS)
+#endif
+
+FILETYPE VFT_DLL
+FILESUBTYPE 0
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+#if (OLEMINORVERS == 02)
+// re-distributable 16-bit TLB
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE Automation Type Library\0"
+ VALUE "FileVersion", "2.02\0"
+ VALUE "InternalName", "STDOLE.TLB\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1993-1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.02 for Windows\0"
+ VALUE "ProductVersion", "2.02\0"
+ VALUE "Comments", "Windows OLE TLB\0"
+#else
+// non-re-distributable 16-bit TLB (shipped with the OS)
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE 2.1 16/32 Interoperability Type Library\0"
+ VALUE "FileVersion", "2.1\0"
+ VALUE "InternalName", "STDOLE.TLB\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1993-1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.1 16/32 Interoperability for Windows NT\0"
+ VALUE "ProductVersion", "2.1\0"
+ VALUE "Comments", "Windows NT OLE 16/32 Interoperability TLB\0"
+#endif
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
diff --git a/private/oleauto/src/mktyplib/stdole32.rc b/private/oleauto/src/mktyplib/stdole32.rc
new file mode 100644
index 000000000..1b2879fd3
--- /dev/null
+++ b/private/oleauto/src/mktyplib/stdole32.rc
@@ -0,0 +1,92 @@
+/***
+*stdole32.rc - Resource file for stdole32.DLL
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+*****************************************************************************/
+
+// first include the type library as a resource
+1 typelib stdole32.tmp
+
+#include "windows.h"
+#include "verstamp.h" // for 'rup'
+
+#ifndef OLEMINORVERS
+#define OLEMINORVERS 10 // assume OLE 2.10
+#endif //!OLEMINORVERS
+
+/* Version information -- hardcoded */
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 2,OLEMINORVERS,rup,01
+PRODUCTVERSION 2,OLEMINORVERS,rup,01
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+
+#if 0
+#define BETAFLAG VS_FF_PRERELEASE
+#else //1
+#define BETAFLAG 0L
+#endif //1
+
+#ifdef _DEBUG
+FILEFLAGS VS_FF_DEBUG | BETAFLAG
+#else // !_DEBUG
+FILEFLAGS BETAFLAG
+#endif // !_DEBUG
+
+FILEOS VOS_NT_WINDOWS32
+
+FILETYPE VFT_DLL
+FILESUBTYPE 0
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "Microsoft OLE 2.1 for Windows NT(TM) Operating System\0"
+ VALUE "FileVersion", "2.1\0"
+ VALUE "InternalName", "STDOLE32.TLB\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1993-1995.\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows NT(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.1 for Windows NT(TM) Operating System\0"
+ VALUE "ProductVersion", "2.1\0"
+ VALUE "Comments", "Microsoft OLE 2.1 for Windows NT(TM) Operating System\0"
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+
+END
+
+#if ID_DEBUG
+// Assertion stuff for ole2disp
+#define ASSERT_ID_BREAK 5103
+#define ASSERT_ID_EXIT 5104
+#define ASSERT_ID_IGNORE 5105
+#define ASSERT_ID_LOC 5106
+#define ASSERT_ID_EXPR 5107
+#define ASSERT_ID_MSG 5108
+
+
+ASSERTFAILDLG DIALOG 72, 32, 260, 67
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "Assertion failure!"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CTEXT "", ASSERT_ID_LOC, 11, 15, 240, 8
+ CTEXT "", ASSERT_ID_MSG, 11, 28, 240, 8
+ PUSHBUTTON "&Break", ASSERT_ID_BREAK, 54, 47, 40, 14
+ PUSHBUTTON "E&xit", ASSERT_ID_EXIT, 110, 47, 40, 14
+ PUSHBUTTON "&Ignore", ASSERT_ID_IGNORE, 166, 47, 40, 14
+END
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/mktyplib/tlviewer.cpp b/private/oleauto/src/mktyplib/tlviewer.cpp
new file mode 100644
index 000000000..9725a5bcc
--- /dev/null
+++ b/private/oleauto/src/mktyplib/tlviewer.cpp
@@ -0,0 +1,1473 @@
+#include "mktyplib.h"
+
+#include <malloc.h>
+#include <stdio.h>
+
+#ifndef WIN32
+#include <ole2.h>
+#include "dispatch.h"
+#endif //!WIN32
+
+extern "C" {
+#include "tlviewer.hxx"
+
+extern VOID FAR DisplayLine (CHAR * lpszMsg) ;
+
+WORD fInParams = FALSE;
+char szSilent[50];
+
+VOID FAR DumpTypeLib (LPSTR szTypeLib)
+{
+ osStrCpy ( (LPSTR)&szDumpInputFile, szTypeLib);
+ osStrCpy ( (LPSTR)&szDumpOutputFile, defaultOutput ) ;
+ osStrCpy ( (LPSTR)&szSilent, "" ) ;
+ ProcessInput () ; // read input file
+}
+
+
+VOID NEAR ProcessInput(VOID)
+ {
+ HRESULT hRes ; // return code
+
+ hRes = NOERROR; // no ole initialization
+ if ( !hRes )
+ { // load the file
+ hRes = LoadTypeLib((LPSTR) szDumpInputFile, &ptLib) ;
+ OutToFile (hRes) ; // print result to the
+ // output file
+ //OleUninitialize ();
+
+ if ( osStrCmp((LPSTR)szSilent, (LPSTR)"silent") != 0 )
+ osMessage ((LPSTR)"Output is created successfully", (LPSTR)"Tlviewer") ;
+ }
+ else
+ osMessage ((LPSTR)"OleInitialize fails", (LPSTR)"Tlviewer") ;
+ }
+
+VOID NEAR OutToFile(HRESULT hRes)
+ {
+ FILE *hFile ; // file handle
+ UINT tInfoCount ; // total number of type info
+ UINT i ;
+ char szTmp[fMaxBuffer] ;
+
+#ifdef WIN16
+ // convert szDumpOutputFile in-place to OEM char set
+ AnsiToOem(szDumpOutputFile, szDumpOutputFile);
+#endif // WIN16
+
+ hFile = fopen(szDumpOutputFile, fnWrite); // open output file
+
+#ifdef WIN16
+ // convert back to ANSI
+ OemToAnsi(szDumpOutputFile, szDumpOutputFile);
+#endif // WIN16
+
+ if (hFile == NULL)
+ {
+ osStrCpy((LPSTR)&szTmp, "Fail to open input file") ;
+ osStrCat((LPSTR)&szTmp, (LPSTR)szDumpOutputFile) ;
+ osMessage ((LPSTR)szTmp, (LPSTR)"Tlviewer") ;
+ }
+ else
+ {
+ WriteOut(hFile, (LPSTR)szFileHeader) ; // output file header
+ WriteOut(hFile, (LPSTR)szDumpInputFile) ;
+ WriteOut(hFile, (LPSTR)szEndStr) ;
+
+ if ( LOWORD(hRes) ) // if it is not a valid type ****
+ WriteOut(hFile, szInputInvalid) ;// library
+ else
+ {
+ if ( fOutLibrary(hFile) )
+ {
+ tInfoCount = ptLib->GetTypeInfoCount() ;
+ for (i = 0 ; i < tInfoCount ; i++)
+ {
+ if ( LOWORD(ptLib->GetTypeInfo(i, &ptInfo)) )
+ {
+ WriteOut(hFile, (LPSTR)szReadFail) ;
+ WriteOut(hFile, (LPSTR)"type info\n\n") ;
+ }
+ else
+ {
+ if ( LOWORD(ptInfo->GetTypeAttr(&lpTypeAttr)) )
+ {
+ WriteOut(hFile, (LPSTR)szReadFail) ;
+ WriteOut(hFile, (LPSTR)"attributes of type info\n\n") ;
+ }
+ else
+ {
+ switch (lpTypeAttr->typekind)
+ {
+ case TKIND_ENUM:
+ tOutEnum(hFile, i) ;
+ break ;
+
+ case TKIND_RECORD:
+ tOutRecord(hFile, i) ;
+ break ;
+
+ case TKIND_MODULE:
+ tOutModule(hFile, i) ;
+ break ;
+
+ case TKIND_INTERFACE:
+ tOutInterface(hFile, i) ;
+ break ;
+
+ case TKIND_DISPATCH:
+ tOutDispatch(hFile, i) ;
+ break ;
+
+ case TKIND_COCLASS:
+ tOutCoclass(hFile, i) ;
+ break ;
+
+ case TKIND_ALIAS:
+ tOutAlias(hFile, i) ;
+ break ;
+
+ case TKIND_UNION:
+ tOutUnion(hFile, i) ;
+ break ;
+
+ default:
+ WriteOut(hFile, (LPSTR) "Type of definition is unknown") ;
+ } // switch
+ ptInfo->ReleaseTypeAttr(lpTypeAttr) ;
+ } // if gettypeattr
+ ptInfo->Release() ;// release the current TypeInfo
+ } // if gettypeinfo
+ } // for i
+ WriteOut(hFile, (LPSTR)"}\n") ; // output the closing }
+ // if fOutLibrary
+ ptLib->Release(); // clean up before exit
+ }
+ }
+
+ fclose(hFile); // finish writing to the output
+ hFile = NULL; // close done
+
+ }
+ }
+
+
+BOOL NEAR fOutLibrary(FILE *hFile)
+ {
+ TLIBATTR FAR *lpLibAttr ; // attributes of the library
+ char szTmp[16] ;
+ BOOL retval = FALSE ;
+
+ if ( LOWORD( ptLib->GetLibAttr(&lpLibAttr) ) ) // *****
+
+ {
+ WriteOut(hFile, (LPSTR)szReadFail) ;
+ WriteOut(hFile, (LPSTR)"attributes of library\n\n") ;
+ }
+ else
+ { // output documentational
+ tOutAttr(hFile, -1) ; // attributes first
+ // output id-related attributes
+ _ltoa((long)lpLibAttr->lcid, szTmp, 10) ; // output lcid;
+ WriteAttr(hFile, attrLcid, (LPSTR)szTmp, numValue) ; // default is 0
+ GetVerNumber (lpLibAttr->wMajorVerNum, lpLibAttr->wMinorVerNum, szTmp) ;
+ WriteAttr(hFile, attrVer, (LPSTR)szTmp, numValue) ; // output version
+ tOutUUID(hFile, lpLibAttr->guid) ;
+ if ( endAttrFlag )
+ {
+ WriteOut(hFile, fInParams ? szEndAttr : szEndAttrNl) ;
+ endAttrFlag = FALSE ;
+ }
+
+ ptLib->ReleaseTLibAttr(lpLibAttr) ; // de-allocate attribute
+
+ WriteOut(hFile, (LPSTR)"\nlibrary ") ;
+ tOutName(hFile, -1) ; // output name of library
+ WriteOut(hFile, (LPSTR)"{\n\n") ;
+ retval = TRUE ;
+ } // if GetLibAttributes
+ return (retval) ; // before exit
+ }
+
+VOID NEAR tOutEnum (FILE *hFile, UINT iTypeId)
+ {
+ WriteOut(hFile, (LPSTR) "\ntypedef\n");// output typedef first
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute
+ tOutMoreAttr(hFile) ;
+ WriteOut(hFile, (LPSTR) "\nenum {\n") ;
+ tOutVar(hFile) ; // output enum members
+
+ WriteOut(hFile, (LPSTR) "} ") ; // close the definition and
+ tOutName(hFile, iTypeId) ; // output name of the enum type
+ WriteOut(hFile, (LPSTR) " ;\n\n") ;
+ }
+
+VOID NEAR tOutRecord (FILE *hFile, UINT iTypeId)
+ {
+ WriteOut(hFile, (LPSTR) "\ntypedef\n");// output typedef first
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute
+ tOutMoreAttr(hFile) ;
+ WriteOut(hFile, (LPSTR) "\nstruct {\n") ;
+ tOutVar (hFile) ; // output members
+
+ WriteOut(hFile, (LPSTR) "} ") ;
+ tOutName(hFile, iTypeId) ;
+ WriteOut(hFile, (LPSTR) " ;\n\n") ;
+ }
+
+VOID NEAR tOutModule (FILE *hFile, UINT iTypeId)
+ {
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute first
+ tOutMoreAttr(hFile) ;
+ WriteOut(hFile, (LPSTR) "\nmodule ") ;
+ tOutName(hFile, iTypeId) ;
+ WriteOut(hFile, " {\n") ;
+
+ tOutVar (hFile) ; // output each const
+
+ tOutFunc (hFile) ; // output each member function
+ WriteOut(hFile, (LPSTR) "}\n\n") ;
+ }
+
+VOID NEAR tOutInterface(FILE *hFile, UINT iTypeId)
+ {
+ HREFTYPE phRefType ;
+
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute first
+ tOutMoreAttr(hFile) ;
+ WriteOut(hFile, (LPSTR) "\ninterface ") ;
+ tOutName(hFile, iTypeId) ;
+ // find out if the interface
+ if ( !LOWORD(ptInfo->GetRefTypeOfImplType(0, &phRefType)) )
+ {
+ isInherit = TRUE ;
+ tOutAliasName(hFile, phRefType) ; // is inherited from some other
+ isInherit = FALSE ; // interface
+ }
+ WriteOut(hFile, " {\n") ;
+
+ tOutFunc (hFile) ; // output each member function
+ WriteOut(hFile, (LPSTR) "}\n\n") ;
+ }
+
+VOID NEAR tOutDispatch (FILE *hFile, UINT iTypeId)
+ {
+ HREFTYPE phRefType ;
+
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute first
+ tOutMoreAttr(hFile) ;
+ WriteOut(hFile, (LPSTR) "\ndispinterface ") ;
+ tOutName(hFile, iTypeId) ;
+
+ if ( !LOWORD(ptInfo->GetRefTypeOfImplType(0, &phRefType)) )
+ {
+ isInherit = TRUE ;
+ tOutAliasName(hFile, phRefType) ; // is inherited from some other
+ isInherit = FALSE ; // interface
+ }
+ WriteOut(hFile, (LPSTR) " {\n") ;
+
+ WriteOut(hFile, (LPSTR) "\nproperties:\n") ;
+ tOutVar (hFile) ; // output each date member
+
+ WriteOut(hFile, (LPSTR) "\nmethods:\n") ;
+ tOutFunc (hFile) ; // output each member function
+
+ WriteOut(hFile, (LPSTR) "}\n\n") ;
+ }
+
+VOID NEAR tOutCoclass (FILE *hFile, UINT iTypeId)
+ {
+
+ HREFTYPE phRefType ;
+ WORD i ;
+
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute first
+ // output appobject attribute if
+ if ( lpTypeAttr->wTypeFlags == TYPEFLAG_FAPPOBJECT ) // it is set
+ WriteAttr(hFile, attrAppObj, NULL, noValue) ;
+ tOutMoreAttr(hFile) ;
+
+ WriteOut(hFile, (LPSTR) "\ncoclass ") ;
+ tOutName(hFile, iTypeId) ;
+ WriteOut(hFile, (LPSTR) " {\n") ;
+
+ for ( i = 0 ; i < lpTypeAttr->cImplTypes; i++ )
+ {
+ if ( LOWORD(ptInfo->GetRefTypeOfImplType(i, &phRefType)) )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "GetRefTypeOfImpType\n") ;
+ }
+ else
+ tOutAliasName(hFile, phRefType) ;
+ }
+
+ WriteOut(hFile, (LPSTR) "}\n\n") ;
+ }
+
+VOID NEAR tOutAlias (FILE *hFile, UINT iTypeId)
+ {
+ char szTmp[16] ;
+
+ WriteOut(hFile, (LPSTR) "\ntypedef ") ;
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute first
+ WriteAttr(hFile, attrPublic, (LPSTR)szTmp, noValue) ; // public attr
+ tOutMoreAttr(hFile) ;
+
+ tOutType(hFile, lpTypeAttr->tdescAlias) ; // output name of base-type
+
+ tOutName(hFile, iTypeId) ; // output name of new type
+ WriteOut(hFile, (LPSTR) ";\n\n") ;
+ }
+
+VOID NEAR tOutUnion (FILE *hFile, UINT iTypeId)
+ {
+ WriteOut(hFile, (LPSTR) "\ntypedef\n"); // output typedef first
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute
+ tOutMoreAttr(hFile) ;
+ WriteOut(hFile, (LPSTR) "\nunion {\n") ;
+ tOutVar (hFile) ; // output members
+
+ WriteOut(hFile, (LPSTR) "} ") ;
+ tOutName(hFile, iTypeId) ;
+ WriteOut(hFile, (LPSTR) " ;\n\n") ;
+ }
+
+
+VOID NEAR tOutEncunion (FILE *hFile, UINT iTypeId)
+ {
+ WriteOut(hFile, (LPSTR) "\ntypedef\n"); // output typedef first
+ tOutAttr(hFile, (int)iTypeId) ; // output attribute
+ tOutMoreAttr(hFile) ;
+ WriteOut(hFile, (LPSTR) "\nencunion {\n") ;
+ tOutVar (hFile) ; // output members
+
+ WriteOut(hFile, (LPSTR) "} ") ;
+ tOutName(hFile, iTypeId) ;
+ WriteOut(hFile, (LPSTR) " ;\n\n") ;
+ }
+
+
+VOID NEAR tOutName (FILE *hFile, UINT iTypeId)
+ {
+ BSTR bstrName ;
+
+ if ( LOWORD(ptLib->GetDocumentation(iTypeId, &bstrName, NULL, NULL, NULL)) )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "name of type definition") ;
+ }
+ else
+ {
+ WriteOut(hFile, (LPSTR) bstrName) ;
+ WriteOut(hFile, (LPSTR) " ") ;
+
+ if ( iTypeId == -1 ) // record name of the library
+ osStrCpy((LPSTR)&szLibName, (LPSTR)bstrName) ;
+
+ SysFreeString(bstrName) ;
+ }
+ }
+
+VOID NEAR tOutType (FILE *hFile, TYPEDESC tdesc)
+ {
+ char szTmp[40] ;
+
+ switch (tdesc.vt)
+ {
+ case VT_EMPTY:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "notSpec " ) ;
+ break ;
+ case VT_NULL:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "NULL " ) ;
+ break ;
+ case VT_I2:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "short " ) ;
+ break ;
+ case VT_I4:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "long " ) ;
+ break ;
+ case VT_R4:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "float " ) ;
+ break ;
+ case VT_R8:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "double " ) ;
+ break ;
+ case VT_CY:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "CURRENCY " ) ;
+ break ;
+ case VT_DATE:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "DATE " ) ;
+ break ;
+ case VT_BSTR:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "BSTR " ) ;
+ break ;
+ case VT_DISPATCH:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "IDispatch * (VT_DISPATCH) " ) ;
+ break ;
+ case VT_ERROR:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "scode " ) ;
+ break ;
+ case VT_BOOL:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "boolean " ) ;
+ break ;
+ case VT_VARIANT:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "VARIANT " ) ;
+ break ;
+ case VT_UNKNOWN:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "IUnknown * (VT_UNKNOWN) " ) ;
+ break ;
+ case VT_I1:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "char " ) ;
+ break ;
+ case VT_UI1:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "unsigned char " ) ;
+ break ;
+ case VT_UI2:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "unsigned short " ) ;
+ break ;
+ case VT_UI4:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "unsigned long " ) ;
+ break ;
+ case VT_I8:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "long long " ) ;
+ break ;
+ case VT_UI8:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "unsigned long long " ) ;
+ break ;
+ case VT_INT:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "int " ) ;
+ break ;
+ case VT_UINT:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "unsigned int " ) ;
+ break ;
+ case VT_VOID:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "void " ) ;
+ break ;
+ case VT_HRESULT:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "HRESULT " ) ;
+ break ;
+ case VT_PTR:
+ tOutType (hFile, *(tdesc.lptdesc)) ;
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "* " ) ;
+ break ;
+ case VT_SAFEARRAY:
+ if ( endAttrFlag )
+ {
+ WriteOut(hFile, fInParams ? szEndAttr : szEndAttrNl) ;
+ endAttrFlag = FALSE ;
+ }
+ WriteOut(hFile, (LPSTR)"SAFEARRAY ( ") ;
+ tOutType (hFile, *(tdesc.lptdesc)) ;
+ break ;
+ case VT_CARRAY:
+ cArrFlag = (SHORT)tdesc.lpadesc->cDims ; // get dimemsion of array
+ tOutType (hFile, tdesc.lpadesc->tdescElem) ;
+ break ;
+ case VT_USERDEFINED:
+ if ( endAttrFlag )
+ {
+ WriteOut(hFile, fInParams ? szEndAttr : szEndAttrNl) ;
+ endAttrFlag = FALSE ;
+ }
+ tOutAliasName (hFile, tdesc.hreftype) ;
+ break ; // output name of the user-defined type
+ case VT_LPSTR:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "LPSTR " ) ;
+ break ;
+ default:
+ osStrCpy ( (LPSTR)&szTmp, (LPSTR) "unknown type " ) ;
+ }
+
+ if ( endAttrFlag )
+ {
+ WriteOut(hFile, fInParams ? szEndAttr : szEndAttrNl) ;
+ endAttrFlag = FALSE ;
+ }
+
+ if ( tdesc.vt != VT_CARRAY && tdesc.vt != VT_USERDEFINED && tdesc.vt != VT_SAFEARRAY )
+ WriteOut(hFile, (LPSTR)szTmp) ;
+
+ if ( tdesc.vt == VT_SAFEARRAY )
+ WriteOut(hFile, ") ") ;
+
+ }
+
+VOID NEAR tOutCDim (FILE *hFile, TYPEDESC tdesc)
+ {
+ USHORT i ;
+ ULONG l ;
+ char szTmp[16] ;
+
+ for ( i = 0 ; i < cArrFlag ; i++ )
+ {
+ l = tdesc.lpadesc->rgbounds[i].cElements ;
+ _ltoa(l, szTmp, 10) ;
+ WriteOut(hFile, (LPSTR)"[") ;
+ WriteOut(hFile, (LPSTR)szTmp) ;
+ WriteOut(hFile, (LPSTR)"]") ;
+ }
+
+ cArrFlag = -1 ;
+ }
+
+VOID NEAR tOutAliasName (FILE *hFile, HREFTYPE phRefType)
+ {
+ ITypeInfo FAR *lpInfo ; // pointer to the type definition
+ ITypeLib FAR *lpLib ; // pointer to a type library
+ TYPEATTR FAR *lptAttr ;
+ BSTR bstrName ;
+ UINT iTypeId ;
+
+ if ( LOWORD(ptInfo->GetRefTypeInfo(phRefType, &lpInfo)) )
+ { // get TypeInfo of the alias
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "GetRefTypeInfo\n") ;
+ }
+ else
+ {
+ if ( lpTypeAttr->typekind == TKIND_COCLASS )
+ {
+ if ( LOWORD(lpInfo->GetTypeAttr(&lptAttr)) )
+ {
+ WriteOut(hFile, (LPSTR)szReadFail) ;
+ WriteOut(hFile, (LPSTR)"attribute of reftype\n\n") ;
+ }
+ else
+ {
+ if ( lptAttr->typekind == TKIND_INTERFACE )
+ WriteOut(hFile, (LPSTR)"interface ") ;
+ else
+ if ( lptAttr->typekind == TKIND_DISPATCH )
+ WriteOut(hFile, (LPSTR)"dispinterface ") ;
+
+ lpInfo->ReleaseTypeAttr(lptAttr) ;
+ }
+ }
+ else // output name of base-interface
+ if ( isInherit &&
+ (lpTypeAttr->typekind == TKIND_INTERFACE ||
+ lpTypeAttr->typekind == TKIND_DISPATCH) )
+ WriteOut(hFile, (LPSTR)" : ") ;
+
+
+ if ( LOWORD(lpInfo->GetContainingTypeLib(&lpLib, &iTypeId)) )
+ { // get id of the alias
+ WriteOut(hFile, (LPSTR)szReadFail) ;
+ WriteOut(hFile, (LPSTR)"GetAlias: containing typelib\n\n") ;
+ }
+ else
+ { // check origin of the alias
+ if ( LOWORD(lpLib->GetDocumentation(-1, &bstrName, NULL, NULL, NULL)) )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "name of import library") ;
+ }
+ else
+ { // if it is not defined locally
+ if ( osStrCmp((LPSTR)szLibName, (LPSTR)bstrName) != 0 )
+ { // i.e. name of origin is diff
+ WriteOut(hFile, (LPSTR) bstrName) ;
+ WriteOut(hFile, (LPSTR)".") ;
+ } // from the name of library;
+ // output its origin
+ SysFreeString(bstrName) ;
+ }
+
+ if ( LOWORD(lpLib->GetDocumentation(iTypeId, &bstrName, NULL, NULL, NULL)) )
+ { // retrieve name of the alias
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "name of alias") ;
+ }
+ else
+ {
+ WriteOut(hFile, (LPSTR)bstrName) ;
+
+ if ( lpTypeAttr->typekind == TKIND_COCLASS )
+ WriteOut(hFile, (LPSTR)" ;\n") ;
+ else
+ WriteOut(hFile, (LPSTR)" ") ;
+
+ SysFreeString(bstrName) ;
+ }
+ }
+ }
+ }
+
+VOID NEAR tOutValue(FILE *hFile, BSTR bstrName, VARDESC FAR *lpVarDesc)
+ {
+ VARTYPE vvt ;
+ char szTmp[16] ;
+
+ if ( endAttrFlag )
+ {
+ WriteOut(hFile, fInParams ? szEndAttr : szEndAttrNl) ;
+ endAttrFlag = FALSE ;
+ }
+
+ if ( lpTypeAttr->typekind == TKIND_MODULE )
+ {
+ WriteOut(hFile, (LPSTR)"const ") ; // output the const keyword
+ tOutType(hFile, lpVarDesc->elemdescVar.tdesc) ; // output its type
+ }
+
+ WriteOut(hFile, (LPSTR)bstrName) ; // output name of member
+ WriteOut(hFile, (LPSTR)" = ") ;
+
+ vvt = lpVarDesc->lpvarValue->vt ;
+ switch ( vvt )
+ {
+ case VT_I2:
+ case VT_BOOL:
+ _itoa((int)lpVarDesc->lpvarValue->iVal, szTmp, 10) ;
+ break ;
+ default:
+ _ltoa((long)lpVarDesc->lpvarValue->lVal, szTmp, 10) ;
+ break ;
+ }
+ WriteOut(hFile, (LPSTR)szTmp) ; // output value of member
+
+ if ( lpTypeAttr->typekind == TKIND_MODULE )
+ WriteOut(hFile, (LPSTR)" ;\n") ;
+ else
+ WriteOut(hFile, (LPSTR)" ,\n") ;
+}
+
+
+VOID NEAR tOutMember(FILE *hFile, LONG idMember, BSTR bstrName, TYPEDESC tdesc)
+ {
+ char szTmp[16] ;
+
+#if 0 // UNDONE: TEMPORARY -- id's for everybody
+ if ( lpTypeAttr->typekind == TKIND_DISPATCH )
+#endif
+ {
+ szTmp[0] = '0';
+ szTmp[1] = 'x';
+ _ultoa(idMember, szTmp+2, 16) ; // output id in hex
+ WriteAttr(hFile, attrId, (LPSTR)szTmp, numValue) ;
+ }
+ // output name of base-type
+ tOutType(hFile, tdesc) ;
+ WriteOut(hFile, (LPSTR)bstrName) ; // output name of member
+ if ( cArrFlag != -1 ) // it is a c-array; output
+ tOutCDim (hFile, tdesc) ;
+ // dimensions of the array
+ WriteOut(hFile, (LPSTR)" ;\n") ;
+ }
+
+VOID NEAR tOutVar(FILE *hFile)
+ {
+ VARDESC FAR *ptVarDesc ;
+ BSTR bstrName ; // name of member
+ BSTR bstrDoc ; // file string
+ DWORD hContext ; // help context
+ char szTmp[16] ;
+ WORD i ;
+ LONG idMember ;
+ BSTR rgNames[MAX_NAMES];
+ UINT cNames, j ;
+
+ for (i = 0 ; i < lpTypeAttr->cVars; i++) // for every member
+ {
+ if ( LOWORD(ptInfo->GetVarDesc(i, &ptVarDesc)) )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "variables\n") ;
+ }
+ else
+ {
+ idMember = ptVarDesc->memid ;
+ // this is readonly var
+ if ( ptVarDesc->wVarFlags == VARFLAG_FREADONLY )
+ WriteAttr(hFile, attrReadonly, NULL, noValue) ;
+
+ if ( LOWORD(ptInfo->GetDocumentation(idMember, &bstrName, &bstrDoc, &hContext, NULL)) )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "attributes of variable\n") ;
+ }
+ else
+ {
+ _ltoa((long)hContext, szTmp, 10) ;// output helpcontext; default is 0
+ WriteAttr(hFile, attrHelpCont, (LPSTR)szTmp, numValue) ;
+
+ if ( bstrDoc != NULL ) // output helpstring if exists
+ WriteAttr(hFile, attrHelpStr, (LPSTR)bstrDoc, strValue) ;
+ // typedef enum or const in module
+ if ( lpTypeAttr->typekind == TKIND_ENUM || lpTypeAttr->typekind == TKIND_MODULE )
+ tOutValue (hFile, bstrName, ptVarDesc) ;
+ else // typedef struct or dispinterface
+ tOutMember (hFile, idMember, bstrName, ptVarDesc->elemdescVar.tdesc) ;
+
+ SysFreeString(bstrDoc) ; // release local bstr
+ // also checking the name
+ if ( LOWORD(ptInfo->GetNames(idMember, rgNames, MAX_NAMES, &cNames)) )
+ { // with GetNames
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "name of variable\n") ;
+ }
+ else
+ {
+ if ( cNames != 1 )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "GetNames return more than one name\n") ;
+ }
+ else
+ {
+ if ( osStrCmp((LPSTR)rgNames[0], (LPSTR)bstrName) != 0 )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "name of variable inconsistent\n") ;
+ }
+ }
+
+ for ( j = 0 ; j < cNames ; j++ )
+ SysFreeString(rgNames[j]) ;
+ }
+
+ SysFreeString(bstrName) ;
+ }
+ }
+ ptInfo->ReleaseVarDesc(ptVarDesc) ;
+ ptVarDesc = NULL ;
+ } // for i
+ }
+
+
+VOID NEAR tOutFuncAttr(FILE *hFile, FUNCDESC FAR *lpFuncDesc, DWORD hContext, BSTR bstrDoc)
+ {
+ char szTmp[16] ;
+
+ _ltoa((long)hContext, szTmp, 10) ; // output helpcontext; default is 0
+ WriteAttr(hFile, attrHelpCont, (LPSTR)szTmp, numValue) ;
+
+ if ( bstrDoc != NULL ) // output helpstring if exists
+ WriteAttr(hFile, attrHelpStr, (LPSTR)bstrDoc, strValue) ;
+ // output restricted attribute
+ if ( lpFuncDesc->wFuncFlags == FUNCFLAG_FRESTRICTED )
+ WriteAttr(hFile, attrRestrict, NULL, noValue) ;
+ // last parm is optional array
+ if ( lpFuncDesc->cParamsOpt == -1 ) // of Variants
+ WriteAttr(hFile, attrVar, NULL, noValue) ;
+
+#if 0 // UNDONE: TEMPORARY -- id's for everybody
+ if ( lpTypeAttr->typekind == TKIND_DISPATCH || lpTypeAttr->typekind == TKIND_INTERFACE)
+#endif
+ {
+ szTmp[0] = '0';
+ szTmp[1] = 'x';
+ _ultoa(lpFuncDesc->memid, szTmp+2, 16) ; // output id in hex
+ WriteAttr(hFile, attrId, (LPSTR)szTmp, numValue) ;
+ }
+#if 0
+ else // DISPID designates the
+ if ( lpFuncDesc->memid == DISPID_VALUE ) // default function
+ WriteAttr(hFile, attrDefault, NULL, noValue) ;
+#endif //0
+
+ switch ( lpFuncDesc->invkind ) // Note: if one of these
+ { // flag is set, name of
+ case INVOKE_FUNC: // parm can't be set: i.e.
+// WriteAttr(hFile, (LPSTR)"invoke_func", NULL, noValue) ;
+ break ; // GetNames only returns name
+ case INVOKE_PROPERTYGET: // of the function
+ WriteAttr(hFile, attrPropget, NULL, noValue) ;
+ break ;
+ case INVOKE_PROPERTYPUT:
+ WriteAttr(hFile, attrPropput, NULL, noValue) ;
+ break ;
+ case INVOKE_PROPERTYPUTREF:
+ WriteAttr(hFile, attrProppr, NULL, noValue) ;
+ break ;
+ default:
+ WriteAttr(hFile, (LPSTR)"unknown invkind", NULL, noValue) ;
+ }
+ }
+
+VOID NEAR tOutCallConv(FILE *hFile, FUNCDESC FAR *lpFuncDesc)
+ {
+ switch ( lpFuncDesc->callconv )
+ {
+ case CC_MSCPASCAL:
+ WriteOut(hFile, (LPSTR)"__pascal ") ;
+ break ;
+ case CC_MACPASCAL:
+ WriteOut(hFile, (LPSTR)"pascal ") ;
+ break ;
+ case CC_STDCALL:
+ WriteOut(hFile, (LPSTR)"__stdcall ") ;
+ break ;
+/* this has been cut
+ case CC_THISCALL:
+ WriteOut(hFile, (LPSTR)"__thiscall ") ;
+ break ;
+*/
+ case CC_CDECL:
+ WriteOut(hFile, (LPSTR)"__cdecl ") ;
+ break ;
+ default:
+ WriteOut(hFile, (LPSTR)"unknown calling convention ") ;
+ break ;
+ }
+ }
+
+VOID NEAR tOutParams(FILE *hFile, FUNCDESC FAR *lpFuncDesc, BSTR bstrName)
+ {
+ BSTR rgNames[MAX_NAMES];
+ UINT cNames ;
+ SHORT i ;
+
+ fInParams = TRUE;
+
+ WriteOut(hFile, (LPSTR)"(") ;
+
+ if ( lpFuncDesc->cParams == 0 )
+ WriteOut(hFile, (LPSTR)"void") ;
+ else
+ {
+ if ( LOWORD(ptInfo->GetNames(lpFuncDesc->memid, rgNames, MAX_NAMES, &cNames)) )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "parm of func in definition\n") ;
+ }
+ else
+ {
+ if ( osStrCmp((LPSTR)rgNames[0], (LPSTR)bstrName) != 0 )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "name of function inconsistent\n") ;
+ }
+ SysFreeString(rgNames[0]) ; // release name of function
+
+ for (i = 1; i <= lpFuncDesc->cParams; i++)
+ {
+ if ( i != 1 )
+ WriteOut(hFile, (LPSTR)", ") ;
+ // output in/out attribute
+ if ( lpFuncDesc->lprgelemdescParam[i-1].idldesc.wIDLFlags != 0 )
+ {
+ if ( ( lpFuncDesc->lprgelemdescParam[i-1].idldesc.wIDLFlags & IDLFLAG_FIN ) == IDLFLAG_FIN )
+ WriteAttr(hFile, attrIn, NULL, noValue) ;
+
+ if ( ( lpFuncDesc->lprgelemdescParam[i-1].idldesc.wIDLFlags & IDLFLAG_FOUT ) == IDLFLAG_FOUT )
+ WriteAttr(hFile, attrOut, NULL, noValue) ;
+ }
+ // check for optional parm
+ if ( ( lpFuncDesc->cParamsOpt + i ) > lpFuncDesc->cParams )
+ WriteAttr(hFile, attrOption, NULL, noValue) ;
+ // and output optional attr
+ // output name of base-type
+ tOutType(hFile, lpFuncDesc->lprgelemdescParam[i-1].tdesc) ;
+ if ( i < (SHORT) cNames )// output name of parm if its is
+ { // not property-accessor function
+ WriteOut(hFile, (LPSTR)rgNames[i]) ;
+ SysFreeString(rgNames[i]) ; // release name of parm's
+ }
+ else
+ WriteOut(hFile, (LPSTR)"PseudoName") ;
+
+ if ( cArrFlag != -1 ) // it is a c-array; output
+ tOutCDim (hFile, lpFuncDesc->lprgelemdescParam[i-1].tdesc) ;
+ // dimension of the array
+ } // for i = 1
+ } // GetNames
+
+ } // if (ptFunDesc->cParams)
+
+ WriteOut(hFile, (LPSTR)") ;\n") ;
+ fInParams = FALSE;
+ }
+
+
+VOID NEAR tOutFunc(FILE *hFile)
+ {
+ FUNCDESC FAR *ptFuncDesc ;
+ BSTR bstrName ; // name of member
+ BSTR bstrDoc ; // file string
+ DWORD hContext ; // help context
+ WORD i ;
+ // VOID FAR *lpvoid ;
+ char szTmp[16] ;
+
+ for (i = 0 ; i < lpTypeAttr->cFuncs; i++) // for every member function
+ {
+ if ( LOWORD(ptInfo->GetFuncDesc(i, &ptFuncDesc)) )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "function of definition\n") ;
+ }
+ else
+ {
+ if ( LOWORD(ptInfo->GetDocumentation(ptFuncDesc->memid, &bstrName, &bstrDoc, &hContext, NULL)) )
+ {
+ WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, "attributes of function\n") ;
+ }
+ else
+ {
+ BSTR bstrDllName;
+ BSTR bstrEntryName;
+ WORD wOrdinal;
+#if 0
+ VOID FAR * lpVoid;
+#endif //0
+
+ if(!LOWORD(ptInfo->GetDllEntry(ptFuncDesc->memid,
+ ptFuncDesc->invkind,
+ &bstrDllName,
+ &bstrEntryName,
+ &wOrdinal)))
+ {
+
+#if 0 //UNDONE: TEMPORARY
+ ptInfo->AddressOfMember(ptFuncDesc->memid,
+ ptFuncDesc->invkind,
+ &lpVoid);
+#endif //1
+
+ WriteOut(hFile, szRefDll);
+ WriteOut(hFile, "DLL name = ");
+ WriteOut(hFile, (LPSTR) bstrDllName);
+ SysFreeString(bstrDllName) ;
+
+ WriteOut(hFile, "\nDLL entry point = ");
+ if ((LPSTR)bstrEntryName != NULL)
+ {
+ WriteOut(hFile, (LPSTR) bstrEntryName);
+ SysFreeString(bstrEntryName) ;
+ }
+ else
+ {
+ WriteOut(hFile, "ordinal ");
+ _itoa(wOrdinal, szTmp, 10) ;
+ WriteOut(hFile, szTmp);
+
+ }
+ WriteOut(hFile, "\n");
+ }
+ // output attr for function
+ tOutFuncAttr(hFile, ptFuncDesc, hContext, bstrDoc) ;
+ // output return type
+ tOutType(hFile, ptFuncDesc->elemdescFunc.tdesc) ;
+ // output calling convention
+ tOutCallConv(hFile, ptFuncDesc) ;
+ WriteOut(hFile, (LPSTR)bstrName) ; // output name of member function
+ tOutParams(hFile, ptFuncDesc, bstrName) ;
+ // output parameters
+ SysFreeString(bstrDoc) ; // release local bstr's
+ SysFreeString(bstrName) ;
+ }
+ }
+ ptInfo->ReleaseFuncDesc(ptFuncDesc) ;
+ ptFuncDesc = NULL ;
+ } // for i
+ }
+
+VOID NEAR tOutUUID (FILE *hFile, GUID inGuid)
+ {
+ char szTmp[50] ;
+ int i ;
+ // get a string representation
+ // for the incoming Guid value
+ if ( !(i = osRetrieveGuid ((LPSTR)szTmp, inGuid)) )
+ { WriteOut(hFile, szReadFail) ;
+ WriteOut(hFile, (LPSTR)"insufficient memory") ;
+ }
+ else
+ { // string is in {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
+ szTmp[37] = '\0' ; // format, need to remove the {}
+ WriteAttr(hFile, attrUuid, (LPSTR)&szTmp[1], numValue) ;
+ }
+ }
+
+VOID NEAR tOutAttr (FILE *hFile, int iTypeId)
+ {
+ BSTR bstrDoc ; // file string
+ BSTR bstrHelp ; // name of help file
+ DWORD hContext ; // help context
+ char szTmp[16] ;
+
+
+ if ( LOWORD(ptLib->GetDocumentation(iTypeId, NULL, &bstrDoc, &hContext, &bstrHelp)) )
+ {
+ WriteOut(hFile, (LPSTR)szReadFail) ;
+ WriteOut(hFile, (LPSTR)"documentational attribute\n\n") ;
+ }
+ else
+ {
+ _ltoa((long)hContext, szTmp, 10) ;// output helpcontext; default is 0
+ WriteAttr(hFile, attrHelpCont, (LPSTR)szTmp, numValue) ;
+
+ if ( bstrDoc != NULL ) // output helpstring if exists
+ WriteAttr(hFile, attrHelpStr, (LPSTR)bstrDoc, strValue) ;
+
+ if ( bstrHelp != NULL ) // output helpfile if exists
+ WriteAttr(hFile, attrHelpFile, (LPSTR)bstrHelp, strValue) ;
+
+ SysFreeString(bstrDoc) ; // release local bstr's
+ SysFreeString(bstrHelp) ;
+ }
+ }
+
+VOID NEAR tOutMoreAttr (FILE *hFile)
+ {
+ char szTmp[16] ;
+
+ GetVerNumber (lpTypeAttr->wMajorVerNum, lpTypeAttr->wMinorVerNum, szTmp) ;
+ WriteAttr(hFile, attrVer, (LPSTR)szTmp, numValue) ; // output version
+ tOutUUID(hFile, lpTypeAttr->guid) ;
+ if ( endAttrFlag )
+ {
+ WriteOut(hFile, fInParams ? szEndAttr : szEndAttrNl) ;
+ endAttrFlag = FALSE ;
+ }
+ }
+
+
+VOID NEAR WriteAttr(FILE *hFile, LPSTR lpszAttr, LPSTR lpszStr, int ivalType)
+ {
+ BOOL firstAttr = FALSE ;
+
+ if ( !endAttrFlag )
+ {
+ if (!fInParams)
+ WriteOut(hFile, "\n") ; // output NL for readablilty
+
+ WriteOut(hFile, szBeginAttr) ; // output "[" first
+ endAttrFlag = TRUE ;
+ firstAttr = TRUE ;
+ }
+ // this is not the first
+ if ( !firstAttr ) { // attribute to be written
+ if (fInParams)
+ WriteOut(hFile, (LPSTR)", ") ; // need to put a , before
+ else
+ WriteOut(hFile, (LPSTR)",\n") ;
+ }
+
+ // output name of attribute
+ WriteOut(hFile, lpszAttr) ;
+ if ( ivalType != noValue ) // attribute has a value
+ {
+ WriteOut(hFile, (LPSTR)"(") ;
+ if ( ivalType != numValue ) // value is a string
+ WriteOut(hFile, (LPSTR)"\"") ;
+
+ WriteOut(hFile, lpszStr) ; // output value of attribute
+ if ( ivalType != numValue ) // close the string value
+ WriteOut(hFile, (LPSTR)"\"") ;
+ WriteOut(hFile, (LPSTR)")") ;
+ }
+ }
+
+
+VOID NEAR GetVerNumber (WORD wMajorNum, WORD wMinorNum, char *szVersion)
+ {
+ char szTmp[6] ;
+
+ _ltoa((long)wMajorNum, szVersion, 10) ;
+ _ltoa((long)wMinorNum, szTmp, 10) ;
+
+ osStrCat((LPSTR)szVersion, (LPSTR)".") ; // major.
+ osStrCat((LPSTR)szVersion, (LPSTR)szTmp) ; // major.minor
+ }
+
+VOID NEAR WriteOut(FILE *hFile, LPSTR lpszData)
+ {
+ char szBuffer[fMaxBuffer];
+
+ osStrCpy((LPSTR)&szBuffer, lpszData) ;
+
+ if (fputs(szBuffer, hFile) < 0) // write the data
+ {
+ osStrCpy((LPSTR)&szBuffer, "Fail to write to file ") ;
+ osStrCat((LPSTR)&szBuffer, lpszData) ;
+ osMessage ((LPSTR)szBuffer, (LPSTR)"Tlviewer") ;
+ }
+ }
+
+/* -------------------------------------------------------------------------
+ Test: OSUTIL
+
+ Copyright (C) 1991, Microsoft Corporation
+
+ Component: OLE Programmability
+
+ Major Area: Type Information Interface
+
+ Sub Area: ITypeInfo
+
+ Test Area:
+
+ Keyword: Win16
+
+ ---------------------------------------------------------------------------
+ Purpose: Library routines for programs that run under Win16
+
+ Scenarios:
+
+ Abstract:
+
+ ---------------------------------------------------------------------------
+ Category:
+
+ Product:
+
+ Related Files: osutil.hxx
+
+ Notes:
+ ---------------------------------------------------------------------------
+ Revision History:
+
+ [ 0] 09-Mar-1993 Angelach: Created Test
+ [ 1] dd-mmm-yyyy changed made, by whom, and why
+ ---------------------------------------------------------------------------
+*/
+
+
+/*---------------------------------------------------------------------------
+ NAME : osAllocSpaces
+
+ PURPOSE : obtains some spaces from the far heap
+
+ INPUTS : nSize - no of bytes to be allocated
+
+ OUTPUT : pointer to the allocated space
+
+ NOTES : caller is responsible to free up the memory after used
+
+---------------------------------------------------------------------------*/
+
+char FAR * osAllocSpaces(WORD nSize)
+ {
+ return ( (char FAR * )_fmalloc(nSize) ) ;
+ }
+
+
+/*---------------------------------------------------------------------------
+ NAME : osDeAllocSpaces
+
+ PURPOSE : returns spaces that have been obtained from the far heap
+
+ INPUTS : lpsz - pointer to the spaces to be returned
+
+ OUTPUT : none
+
+ NOTES : caller is responsible to free up the memory after used
+
+---------------------------------------------------------------------------*/
+
+VOID FAR osDeAllocSpaces(char FAR *lpsz)
+ {
+ _ffree( lpsz ) ;
+ }
+
+
+/*---------------------------------------------------------------------------
+ NAME : osStrCmp
+
+ PURPOSE : Calls lstrcmp to perform comparsion on strings
+
+ INPUTS : lpszIn, lpszExp; strings to be compared
+
+ OUTPUT : none
+
+ NOTES :
+
+---------------------------------------------------------------------------*/
+
+int FAR osStrCmp (LPSTR lpszIn, LPSTR lpszExp)
+ {
+ return ( _fstrcmp(lpszIn, lpszExp) ) ;
+ }
+
+
+/*---------------------------------------------------------------------------
+ NAME : osStrCpy
+
+ PURPOSE : Calls lstrcpy to perform string copy
+
+ INPUTS : lpszDest - destination for string copy
+ lpszSrc - source string for string copy
+
+ OUTPUT : none
+
+ NOTES :
+
+---------------------------------------------------------------------------*/
+
+VOID FAR osStrCpy (LPSTR lpszDest, LPSTR lpszSrc)
+ {
+ _fstrcpy(lpszDest, lpszSrc) ;
+ }
+
+
+/*---------------------------------------------------------------------------
+ NAME : osStrCat
+
+ PURPOSE : Calls lstrcat to perform string concatenation
+
+ INPUTS : lpszDest - destination for string concatenation
+ lpszSrc - source string for concatenation
+
+ OUTPUT : none
+
+ NOTES :
+
+---------------------------------------------------------------------------*/
+
+VOID FAR osStrCat (LPSTR lpszDest, LPSTR lpszSrc)
+ {
+ _fstrcat(lpszDest, lpszSrc) ;
+ }
+
+/*---------------------------------------------------------------------------
+ NAME : osCreateGuid
+
+ PURPOSE : Converts a GUID value from string to GUID format
+
+ INPUTS : lpszGuid - string contains the desired GUID value
+
+ OUTPUT : pointer to the GUID structure
+
+ NOTES : caller is responsible to free up the memory after used
+
+---------------------------------------------------------------------------*/
+
+GUID FAR * osCreateGuid(LPSTR lpszGuid)
+ {
+
+ GUID FAR * lpGuid ;
+ HRESULT hRes ;
+
+ lpGuid = (GUID FAR *) osAllocSpaces(sizeof(GUID)) ;// allocate space
+ // for the Guid
+ if ( lpGuid )
+ { // convert string to GUID format
+ hRes = CLSIDFromString(lpszGuid, (LPCLSID)lpGuid);
+ if ( LOWORD (hRes) )
+ {
+ osDeAllocSpaces ((char FAR *)lpGuid) ;// release space before exit
+ return NULL ;
+ }
+ else
+ return lpGuid ; // return pointer to the
+ } // GUID structure
+ else
+ return NULL ; // no space is allocated
+
+ }
+
+
+/*---------------------------------------------------------------------------
+ NAME : osRetrieveGuid
+
+ PURPOSE : Converts a GUID structure to a readable string format
+
+ INPUTS : lpszGuid - string representation of the GUID will be returned
+ GUID - the GUID structure in concern
+
+ OUTPUT : True if conversion is succeed
+
+ NOTES :
+
+---------------------------------------------------------------------------*/
+
+BOOL FAR osRetrieveGuid (LPSTR lpszGuid, GUID inGuid)
+ {
+ char FAR * lpszTmp ;
+ HRESULT hRes ;
+
+ if ( lpszGuid )
+ { // convert GUID to it string
+ hRes = StringFromCLSID((REFCLSID) inGuid, &lpszTmp) ;
+ if ( LOWORD (hRes) ) // representation
+ {
+ return FALSE ;
+ }
+ else
+ {
+ _fstrcpy (lpszGuid, (LPSTR)lpszTmp) ;
+ // UNDONE: should free the memory with OLE's iMalloc
+ //osDeAllocSpaces (lpszTmp) ;// release space before exit
+ return TRUE ;
+ }
+ }
+ else
+ return FALSE ;
+ }
+
+/*---------------------------------------------------------------------------
+ NAME : osGetSize
+
+ PURPOSE : returns size of the input data
+
+ INPUTS : inVT - data type; WORD
+
+ OUTPUT : size of inVT; WORD
+
+ NOTES :
+
+---------------------------------------------------------------------------*/
+
+WORD FAR osGetSize (WORD inVT)
+ {
+ WORD tSize ;
+
+ switch ( inVT )
+ {
+ case VT_I2:
+ tSize = sizeof(short) ;
+ break ;
+ case VT_I4:
+ tSize = sizeof(long) ;
+ break ;
+ case VT_R4:
+ tSize = sizeof(float) ;
+ break ;
+ case VT_R8:
+ tSize = sizeof(double) ;
+ break ;
+ case VT_CY:
+ tSize = sizeof(CY) ;
+ break ;
+ case VT_DATE:
+ tSize = sizeof(DATE) ;
+ break ;
+ case VT_BSTR:
+ tSize = sizeof(BSTR) ;
+ break ;
+ case VT_ERROR:
+ tSize = sizeof(SCODE) ;
+ break ;
+ case VT_BOOL:
+ tSize = sizeof(VARIANT_BOOL) ;
+ break ;
+ case VT_VARIANT:
+ tSize = sizeof(VARIANT) ;
+ break ;
+ case VT_I1:
+ tSize = sizeof(char) ;
+ break ;
+ case VT_UI1:
+ tSize = sizeof(char) ;
+ break ;
+ case VT_UI2:
+ tSize = sizeof(short) ;
+ break ;
+ case VT_UI4:
+ tSize = sizeof(long) ;
+ break ;
+ case VT_I8:
+ tSize = sizeof(long)*2 ;
+ break ;
+ case VT_UI8:
+ tSize = sizeof(long)*2 ;
+ break ;
+ case VT_INT:
+ tSize = sizeof(int) ;
+ break ;
+ case VT_UINT:
+ tSize = sizeof(int) ;
+ break ;
+ case VT_VOID:
+ tSize = 0 ;
+ break ;
+ case VT_HRESULT:
+ tSize = sizeof(HRESULT) ;
+ break ;
+ case VT_LPSTR:
+ tSize = sizeof(LPSTR) ;
+ break ;
+ case VT_PTR:
+ tSize = 4 ;
+ break ;
+ case VT_SAFEARRAY:
+ tSize = sizeof(ARRAYDESC FAR *) ;
+ break ;
+ default:
+ tSize = 1 ;
+ break ;
+ }
+
+ return tSize ;
+}
+
+/*---------------------------------------------------------------------------
+ NAME : osGetMemberSize
+
+ PURPOSE : returns size of the member, type of which is inVT, of a struct
+
+ INPUTS : pSize - max size of the previous members; WORD
+ inVT - type of the current member; WORD
+
+ OUTPUT : size of the current member; WORD
+
+ NOTES : value is machine dependent:
+ Win16 = 1 (everything is packed -> always = 1)
+ Win32 = natural alignment (everything is on the even-byte
+ boundary; size of every member is based on the biggest
+ size of the members
+ mac = everything is on the even-byte boundary
+ see silver\cl\clutil.cxx for a table of the alignement information
+---------------------------------------------------------------------------*/
+
+WORD FAR osGetMemberSize (WORD *pSize, WORD inVT)
+ {
+ WORD aSize ;
+
+ aSize = osGetSize(inVT) ;
+
+ return aSize ;
+ }
+
+/*---------------------------------------------------------------------------
+ NAME : osGetAlignment
+
+ PURPOSE : returns value of the alignment
+
+ INPUTS : none
+
+ OUTPUT : value of the aliangment; WORD
+
+ NOTES : value is machine dependent:
+ Win16 = 1 (everything is packed -> always = 1)
+ Win32 = natural alignment (everything is on the even-byte
+ boundary)
+ mac = everything is on the even-byte boundary
+ see silver\cl\clutil.cxx for a table of the alignement information
+---------------------------------------------------------------------------*/
+
+WORD FAR osGetAlignment ()
+ {
+ return 1 ;
+ }
+
+
+
+/*---------------------------------------------------------------------------
+ NAME : osMessage
+
+ PURPOSE : Displays a MessageBox
+
+ INPUTS : Message to be displayed; a string of characters
+
+ OUTPUT : none
+
+ NOTES :
+
+---------------------------------------------------------------------------*/
+
+VOID FAR osMessage (LPSTR lpszMsg, LPSTR lpszTitle)
+ {
+#ifdef MAC
+ DisplayLine (lpszMsg) ;
+#else
+ MessageBox (NULL, lpszMsg, lpszTitle, MB_OK) ;
+#endif
+ }
+ }
diff --git a/private/oleauto/src/mktyplib/tlviewer.hxx b/private/oleauto/src/mktyplib/tlviewer.hxx
new file mode 100644
index 000000000..3bd3c6d0c
--- /dev/null
+++ b/private/oleauto/src/mktyplib/tlviewer.hxx
@@ -0,0 +1,157 @@
+/* -------------------------------------------------------------------------
+ Test: OSUTIL
+
+ Copyright (C) 1991, Microsoft Corporation
+
+ Component: OLE Programmability
+
+ Major Area: Type Information Interface
+
+ Sub Area: ITypeInfo
+
+ Test Area:
+
+ Keyword: Win16
+
+ ---------------------------------------------------------------------------
+ Purpose: constants for programs that run under Win16
+
+ Scenarios:
+
+ Abstract:
+
+ ---------------------------------------------------------------------------
+ Category:
+
+ Product:
+
+ Related Files:
+
+ Notes:
+ ---------------------------------------------------------------------------
+ Revision History:
+
+ [ 0] 09-Mar-1993 Angelach: Created Test
+ [ 1] dd-mmm-yyyy changed made, by whom, and why
+ ---------------------------------------------------------------------------
+*/
+
+
+// routines defined in osutil.cpp
+
+char FAR * osAllocSpaces (WORD) ;
+VOID FAR osDeAllocSpaces (char FAR *) ;
+GUID FAR * osCreateGuid (LPSTR) ;
+BOOL FAR osRetrieveGuid (LPSTR, GUID) ;
+WORD FAR osGetSize (WORD) ;
+WORD FAR osGetMemberSize (WORD *, WORD) ;
+WORD FAR osGetAlignment (VOID) ;
+int FAR osStrCmp (LPSTR, LPSTR) ;
+VOID FAR osStrCpy (LPSTR, LPSTR) ;
+VOID FAR osStrCat (LPSTR, LPSTR) ;
+
+HRESULT FAR osOleInit (VOID) ;
+VOID FAR osMessage (LPSTR, LPSTR) ;
+
+// external routine
+
+VOID FAR mainEntry (LPSTR lpCmd) ;
+
+#define defaultOutput (LPSTR) "tlviewer.out"
+#define cchFilenameMax 256 // max chars in a filename
+#define fMaxBuffer 256
+#define aMaxName 15
+#define MAX_NAMES 65
+
+// name of valid attributes
+#define attrAppObj (LPSTR) "appobject"
+#define attrDefault (LPSTR) "default"
+#define attrDllName (LPSTR) "dllname"
+#define attrEntry (LPSTR) "entry"
+#define attrHelpCont (LPSTR) "helpcontext"
+#define attrHelpFile (LPSTR) "helpfile"
+#define attrHelpStr (LPSTR) "helpstring"
+#define attrId (LPSTR) "id"
+#define attrIn (LPSTR) "in"
+#define attrLcid (LPSTR) "lcid"
+#define attrOption (LPSTR) "optional"
+#define attrOut (LPSTR) "out"
+#define attrPropget (LPSTR) "propget"
+#define attrPropput (LPSTR) "propput"
+#define attrProppr (LPSTR) "propputref"
+#define attrPublic (LPSTR) "public"
+#define attrRestrict (LPSTR) "restricted"
+#define attrReadonly (LPSTR) "readonly"
+#define attrString (LPSTR) "string"
+#define attrUuid (LPSTR) "uuid"
+#define attrVar (LPSTR) "vararg"
+#define attrVer (LPSTR) "version"
+
+#define noValue 0 // attribute has no value
+#define numValue 1 // attribute has numeric value
+#define strValue 2 // attribute has string value
+
+
+#define fnWrite "w" // file attribute - write only
+
+#define szFileHeader (LPSTR) "/* Textual file generated for type library: "
+#define szEndStr (LPSTR) " */\n\n\n"
+#define szInputInvalid (LPSTR) " Input file is not a valid type library\n\n"
+#define szReadFail (LPSTR) " // *** Error in reading the type library: "
+#define szBeginAttr (LPSTR) "["
+#define szEndAttr (LPSTR) "] "
+#define szEndAttrNl (LPSTR) "]\n"
+#define szRefDll (LPSTR) " // this function referring routine in a dll\n"
+#define szImpLib (LPSTR) " // defined in library: "
+
+// global variables
+char szDumpInputFile[cchFilenameMax] ; // name of input library file
+char szDumpOutputFile[cchFilenameMax] ; // name of output text file
+char szLibName[cchFilenameMax] ; // name of the type library
+
+ITypeLib FAR *ptLib ; // pointer to the type library
+ITypeInfo FAR *ptInfo ; // pointer to the type definition
+TYPEATTR FAR *lpTypeAttr ; // pointer to attribute of type def
+int strFlag = 0 ; // for string attribute
+BOOL endAttrFlag = FALSE ; // if need to end the attribute-list
+short cArrFlag = -1 ; // if it is a c array
+BOOL isInherit = FALSE ; // if the interface has a base interface
+
+// prototypes for local functions
+
+VOID NEAR ProcessInput (VOID) ;
+VOID NEAR OutToFile (HRESULT) ;
+BOOL NEAR fOutLibrary (FILE *) ;
+VOID NEAR tOutEnum (FILE *, UINT) ;
+VOID NEAR tOutRecord (FILE *, UINT) ;
+VOID NEAR tOutModule (FILE *, UINT) ;
+VOID NEAR tOutInterface(FILE *, UINT) ;
+VOID NEAR tOutDispatch (FILE *, UINT) ;
+VOID NEAR tOutCoclass (FILE *, UINT) ;
+VOID NEAR tOutAlias (FILE *, UINT) ;
+VOID NEAR tOutUnion (FILE *, UINT) ;
+VOID NEAR tOutEncunion (FILE *, UINT) ;
+VOID NEAR tOutName (FILE *, UINT) ;
+VOID NEAR tOutType (FILE *, TYPEDESC) ;
+VOID NEAR tOutCDim (FILE *, TYPEDESC) ;
+VOID NEAR tOutAliasName(FILE *, HREFTYPE) ;
+VOID NEAR tOutValue (FILE *, BSTR, VARDESC FAR *) ;
+VOID NEAR tOutMember (FILE *, LONG, BSTR, TYPEDESC) ;
+VOID NEAR tOutVar (FILE *) ;
+VOID NEAR tOutFuncAttr (FILE *, FUNCDESC FAR *, DWORD, BSTR) ;
+VOID NEAR tOutCallConv (FILE *, FUNCDESC FAR *) ;
+VOID NEAR tOutParams (FILE *, FUNCDESC FAR *, BSTR) ;
+VOID NEAR tOutFunc (FILE *) ;
+VOID NEAR tOutUUID (FILE *, GUID) ;
+VOID NEAR tOutAttr (FILE *, int) ;
+VOID NEAR tOutMoreAttr (FILE *) ;
+VOID NEAR WriteAttr (FILE *, LPSTR, LPSTR, int) ;
+VOID NEAR GetVerNumber (WORD w, WORD, char *) ;
+VOID NEAR WriteOut (FILE *, LPSTR) ;
+
+
+// prototypes for routines defined in osutil.cpp
+
+char FAR * osAllocSpaces (WORD nSize) ;
+VOID FAR osDeAllocSpaces (char FAR *lpsz) ;
+BOOL FAR osRetrieveGuid (LPSTR, GUID) ;
diff --git a/private/oleauto/src/mktyplib/tmpguid.c b/private/oleauto/src/mktyplib/tmpguid.c
new file mode 100644
index 000000000..b2477cb98
--- /dev/null
+++ b/private/oleauto/src/mktyplib/tmpguid.c
@@ -0,0 +1,23 @@
+/***
+*tmpguid.c
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Temporary definitions of GUIDs that will eventually be picked
+* up from typeinfo libs.
+*
+*****************************************************************************/
+
+#include "mktyplib.h"
+#include <ole2.h>
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+DEFINE_OLEGUID(IID_ITypeInfo, 0x00020401, 0, 0);
+#ifdef MAC // UNDONE: temporary for DIMALLOC hack
+DEFINE_OLEGUID(IID_IUnknown, 0x00000000, 0, 0);
+#endif //MAC
diff --git a/private/oleauto/src/mktyplib/tokens.h b/private/oleauto/src/mktyplib/tokens.h
new file mode 100644
index 000000000..2d21f65ba
--- /dev/null
+++ b/private/oleauto/src/mktyplib/tokens.h
@@ -0,0 +1,132 @@
+// lexer-specific defines and types
+
+// reserved word and special token ID's
+typedef enum {
+ RW_NOTFOUND = 0,
+// special character RWs
+ RW_EOF,
+ RW_LBRACKET,
+ RW_RBRACKET,
+ RW_LCURLY,
+ RW_RCURLY,
+ RW_LPAREN,
+ RW_RPAREN,
+ RW_SEMI,
+ RW_COLON,
+ RW_PERIOD,
+ RW_COMMA,
+ RW_ASSIGN,
+ RW_POINTER,
+ RW_HYPHEN,
+
+// keyword RWs
+ RW_LIBRARY,
+ RW_TYPEDEF,
+ RW_ENUM,
+ RW_STRUCT,
+ RW_MODULE,
+ RW_INTERFACE,
+ RW_DISPINTERFACE,
+ RW_COCLASS,
+ RW_PROPERTIES,
+ RW_METHODS,
+ RW_IMPORTLIB,
+ RW_PASCAL,
+ RW_CDECL,
+ RW_STDCALL,
+ RW_UNSIGNED,
+ RW_UNION,
+ RW_EXTERN,
+ RW_FAR,
+ RW_SAFEARRAY,
+ RW_CONST,
+#if FV_PROPSET
+ RW_PROPERTY_SET,
+#endif //FV_PROPSET
+
+// literals
+ LIT_STRING,
+ LIT_NUMBER,
+ LIT_UUID,
+ LIT_ID,
+
+// operators
+ OP_ADD,
+ OP_SUB,
+ OP_MUL,
+ OP_DIV,
+ OP_MOD,
+ OP_EXP,
+ OP_LOG_AND,
+ OP_LOG_OR,
+ OP_LOG_NOT,
+ OP_BIT_AND,
+ OP_BIT_OR,
+ OP_BIT_NOT,
+ OP_LSHIFT,
+ OP_RSHIFT,
+ OP_EQ,
+ OP_LE,
+ OP_LT,
+ OP_GE,
+ OP_GT,
+
+ OP_MIN = OP_ADD,
+ OP_MAX = OP_GT,
+
+// attribute reserved words
+ ATTR_UUID,
+ ATTR_VERSION,
+ ATTR_DLLNAME,
+ ATTR_ENTRY,
+ ATTR_ID,
+ ATTR_HELPSTRING,
+ ATTR_HELPCONTEXT,
+ ATTR_HELPFILE,
+ ATTR_LCID,
+ ATTR_PROPGET,
+ ATTR_PROPPUT,
+ ATTR_PROPPUTREF,
+ ATTR_OPTIONAL,
+ ATTR_IN,
+ ATTR_OUT,
+ ATTR_STRING,
+ ATTR_VARARG,
+ ATTR_APPOBJECT,
+ ATTR_RESTRICTED,
+ ATTR_PUBLIC,
+ ATTR_READONLY,
+ ATTR_ODL,
+ ATTR_DEFAULT,
+ ATTR_SOURCE,
+ ATTR_BINDABLE,
+ ATTR_REQUESTEDIT,
+ ATTR_DISPLAYBIND,
+ ATTR_DEFAULTBIND,
+ ATTR_LICENSED,
+ ATTR_PREDECLID,
+ ATTR_HIDDEN,
+ ATTR_RETVAL,
+ ATTR_CONTROL,
+ ATTR_DUAL,
+ ATTR_NONEXTENSIBLE,
+ ATTR_OLEAUTOMATION,
+} TOKID;
+
+#define fACCEPT_ATTR 0x0001
+#define fACCEPT_UUID 0x0002
+#define fACCEPT_NUMBER 0x0004
+#define fACCEPT_EOF 0x0008
+#define fACCEPT_OPERATOR 0x0010
+#define fACCEPT_STRING 0x0020
+
+
+typedef struct {
+ TOKID id;
+ union {
+ LPSTR lpsz;
+ GUID FAR * lpUuid;
+ DWORD number;
+ };
+ WORD cbsz; // only if string
+} TOKEN;
diff --git a/private/oleauto/src/mktyplib/typelib.err b/private/oleauto/src/mktyplib/typelib.err
new file mode 100644
index 000000000..eac517ef0
--- /dev/null
+++ b/private/oleauto/src/mktyplib/typelib.err
@@ -0,0 +1,85 @@
+//
+// UNDONE: need to make a pass through these errors, making them more
+// UNDONE: useful/readable.
+//
+// NOTE: code in TYPEOUT.CPP assumes that TYPE_E_IOERROR is first.
+TYPELIBERR(TYPE_E_IOERROR, "I/O error"),
+TYPELIBERR(TYPE_E_OUTOFBOUNDS, "Invalid number of arguments"),
+TYPELIBERR(TYPE_E_TYPEMISMATCH, "Type mismatch"),
+TYPELIBERR(TYPE_E_CANTCREATETMPFILE, "Error creating unique tmp file"),
+TYPELIBERR(TYPE_E_BUFFERTOOSMALL, "Buffer too small"),
+TYPELIBERR(TYPE_E_INVDATAREAD, "Old format or invalid type library"),
+TYPELIBERR(TYPE_E_UNSUPFORMAT, "Old format or invalid type library"),
+TYPELIBERR(TYPE_E_REGISTRYACCESS, "Error accessing the OLE registry"),
+TYPELIBERR(TYPE_E_LIBNOTREGISTERED, "Library not registered"),
+TYPELIBERR(TYPE_E_UNDEFINEDTYPE, "Bound to unknown type"),
+TYPELIBERR(TYPE_E_QUALIFIEDNAMEDISALLOWED, "Qualified name disallowed"),
+TYPELIBERR(TYPE_E_INVALIDSTATE, "Invalid forward reference, or reference to uncompiled type"),
+TYPELIBERR(TYPE_E_WRONGTYPEKIND, "Type mismatch"),
+TYPELIBERR(TYPE_E_ELEMENTNOTFOUND, "Element not found"),
+TYPELIBERR(TYPE_E_AMBIGUOUSNAME, "Ambiguous name"),
+TYPELIBERR(TYPE_E_NAMECONFLICT, "Name already exists in the library"),
+TYPELIBERR(TYPE_E_UNKNOWNLCID, "Unknown LCID"),
+TYPELIBERR(TYPE_E_DLLFUNCTIONNOTFOUND, "Function not defined in specified DLL"),
+
+TYPELIBERR(TYPE_E_BADMODULEKIND, "Wrong module kind for the operation"),
+TYPELIBERR(TYPE_E_CIRCULARTYPE, "Circular dependency between types/modules"),
+TYPELIBERR(TYPE_E_INCONSISTENTPROPFUNCS, "Inconsistent property functions"),
+TYPELIBERR(TYPE_E_SIZETOOBIG, "Size may not exceed 64K"),
+TYPELIBERR(TYPE_E_DUPLICATEID, "Duplicate ID in inheritance heirarchy"),
+
+#if VBA2
+TYPELIBERR(TYPE_E_INVALIDID, "Incorrect inheritence depth in standard OLE hmember."),
+#endif // VBA2
+
+TYPELIBERR(TYPE_E_CANTLOADLIBRARY, "Error loading type library/DLL"),
+
+TYPELIBERR(E_NOTIMPL, "OLE error E_NOTIMPL"),
+TYPELIBERR(E_OUTOFMEMORY, "Out of memory"),
+TYPELIBERR(E_INVALIDARG, "OLE error E_INVALIDARG"),
+TYPELIBERR(E_NOINTERFACE, "OLE error E_NOINTERFACE"),
+TYPELIBERR(E_ABORT, "OLE error E_ABORT"),
+TYPELIBERR(E_UNEXPECTED, "OLE error E_UNEXPECTED"),
+TYPELIBERR(E_POINTER, "OLE error E_POINTER"),
+TYPELIBERR(E_HANDLE, "OLE error E_HANDLE"),
+TYPELIBERR(E_FAIL, "OLE error E_FAIL"),
+TYPELIBERR(E_ACCESSDENIED, "Access denied"),
+
+TYPELIBERR(STG_E_INVALIDFUNCTION, "Invalid Function"),
+TYPELIBERR(STG_E_FILENOTFOUND, "File not found"),
+TYPELIBERR(STG_E_PATHNOTFOUND, "Path not found"),
+TYPELIBERR(STG_E_TOOMANYOPENFILES, "Too many open files"),
+TYPELIBERR(STG_E_ACCESSDENIED, "Access denied"),
+TYPELIBERR(STG_E_INVALIDHANDLE, "Invalid handle"),
+TYPELIBERR(STG_E_INSUFFICIENTMEMORY, "Out of memory"),
+TYPELIBERR(STG_E_INVALIDPOINTER, "Invalid pointer"),
+TYPELIBERR(STG_E_NOMOREFILES, "No more files"),
+TYPELIBERR(STG_E_DISKISWRITEPROTECTED, "Disk is write-protected"),
+TYPELIBERR(STG_E_SEEKERROR, "Seek error"),
+TYPELIBERR(STG_E_WRITEFAULT, "Write fault"),
+TYPELIBERR(STG_E_READFAULT, "Read fault"),
+TYPELIBERR(STG_E_SHAREVIOLATION, "Share violation"),
+TYPELIBERR(STG_E_LOCKVIOLATION, "Lock violation"),
+//This error is returned by OpenTypeLib when it is given a file which is not
+//an OLE docfile.
+TYPELIBERR(STG_E_FILEALREADYEXISTS, "File is not a valid type library"),
+TYPELIBERR(STG_E_INVALIDPARAMETER, "Invalid parameter"),
+TYPELIBERR(STG_E_MEDIUMFULL, "Disk full"),
+TYPELIBERR(STG_E_ABNORMALAPIEXIT, "Abnormal API exit"),
+TYPELIBERR(STG_E_INVALIDHEADER, "Invalid header"),
+TYPELIBERR(STG_E_INVALIDNAME, "Invalid name"),
+TYPELIBERR(STG_E_UNKNOWN, "OLE error STG_E_UNKNOWN"),
+TYPELIBERR(STG_E_UNIMPLEMENTEDFUNCTION, "Unimplemented OLE function"),
+TYPELIBERR(STG_E_INVALIDFLAG, "Invalid flag"),
+TYPELIBERR(STG_E_INUSE, "OLE error STG_E_INUSE"),
+TYPELIBERR(STG_E_NOTCURRENT, "OLE error STG_E_NOTCURRENT"),
+TYPELIBERR(STG_E_REVERTED, "OLE error STG_E_REVERTED"),
+TYPELIBERR(STG_E_CANTSAVE, "Can't save"),
+TYPELIBERR(STG_E_OLDFORMAT, "Old format or invalid type library"),
+TYPELIBERR(STG_E_OLDDLL, "Old DLL"),
+TYPELIBERR(STG_E_SHAREREQUIRED, "SHARE.EXE required"),
+TYPELIBERR(STG_E_NOTFILEBASEDSTORAGE, "OLE error STG_E_NOTFILEBASEDSTORAGE"),
+TYPELIBERR(STG_E_EXTANTMARSHALLINGS, "OLE error STG_E_EXTANTMARSHALLINGS"),
+
+// CONSIDER: these are just warnings -- correct to treat them as errors?
+TYPELIBERR(STG_S_CONVERTED, "OLE warning STG_S_CONVERTED"),
diff --git a/private/oleauto/src/mktyplib/typout.cpp b/private/oleauto/src/mktyplib/typout.cpp
new file mode 100644
index 000000000..5eb13c4a7
--- /dev/null
+++ b/private/oleauto/src/mktyplib/typout.cpp
@@ -0,0 +1,1186 @@
+#include "mktyplib.h"
+
+#include <malloc.h>
+#include <stdio.h>
+
+#ifndef WIN32
+#include <ole2.h>
+#include "dispatch.h"
+#endif //!WIN32
+
+#include "errors.h"
+#include "parser.h"
+
+#include "fileinfo.h"
+#include "intlstr.h"
+
+#if !FV_UNICODE_OLE
+#define LHashValOfNameSysA LHashValOfNameSys
+#endif //FV_UNICODE_OLE
+
+
+extern "C" {
+
+// external C data
+extern TYPLIB typlib; // structure that holds all file data
+extern SYSKIND SysKind;
+extern int iAlignMax;
+extern WORD cArgsMax; // max # of args in any function
+extern SCODE scodeErrCur; // SCODE of current error
+
+
+// external C routines
+extern INT FAR FCmpCaseIns(LPSTR str1, LPSTR str2);
+extern LPTYPE FAR lpTypePublic(LPTYPE lpType);
+
+// local data
+ELEMDESC FAR* rgFuncArgs; // array of function args
+LPOLESTR FAR* rgszFuncArgNames; // array of function arg names
+
+LPSTR lpszItemCur; // current item we're working on
+
+// C prototypes
+VOID FAR OutputTyplib(CHAR * szTypeLibFile);
+VOID FAR LoadExtTypeLib(LPIMPORTLIB lpImpLib);
+LPTYPE FAR FindExeType(LPSTR lpszTypeName);
+LPTYPE FAR FindExeTypeInLib(LPSTR lpszLibName, LPSTR lpszTypeName);
+
+VOID NEAR OutputTypeInfos(ICreateTypeLib FAR * lpdtlib);
+VOID NEAR OutputFuncs(ICreateTypeInfo FAR* lpdtinfo, LPENTRY pEntry, LPFUNC pFuncList, TYPEKIND tkind);
+VOID NEAR OutputElems(ICreateTypeInfo FAR* lpdtinfo, LPELEM pPropList, TYPEKIND tkind);
+VOID NEAR OutputAlias(ICreateTypeInfo FAR* lpdtinfo, LPTYPE lpTypeAlias);
+VOID NEAR LoadElemDesc(ICreateTypeInfo FAR* lpdtinfo, ELEMDESC FAR* lpElemDesc, LPELEM pElem);
+VOID NEAR UpdateHRefType(ICreateTypeInfo FAR* lpdtinfo, LPTYPE lpTypeBase);
+VOID NEAR OutputInterface(ICreateTypeInfo FAR* lpdtinfo, LPENTRY pEntry);
+VOID NEAR OutputDispinter(ICreateTypeInfo FAR* lpdtinfo, LPENTRY pEntry);
+VOID NEAR OutputClass(ICreateTypeInfo FAR* lpdtinfo, LPENTRY pEntry);
+VOID NEAR OutputBaseInterfaces(ICreateTypeInfo FAR* lpdtinfo, LPENTRY pEntry, TYPEKIND tkind);
+VOID NEAR MethodError(HRESULT res);
+
+
+// error reporting macros
+#define CHECKRESULT(x) if (FAILED((res = (x))) != 0) MethodError(res);
+#define SETITEMCUR(x) lpszItemCur = x;
+BOOL fDoingOutput = FALSE; // set to TRUE once we start
+ // writing the type library
+
+#if FV_UNICODE_OLE
+// Unicode conversion routines
+
+#define CW_BUFFER 1024 // 1K ought to do it
+OLECHAR szBufW[CW_BUFFER]; // handy static buffer
+
+OLECHAR FAR * ToW(char FAR* lpszA)
+{
+ UINT cb;
+
+ cb = strlen(lpszA)+1;
+ Assert(cb <= CW_BUFFER);
+
+ SideAssert (MultiByteToWideChar(CP_ACP,
+ MB_PRECOMPOSED,
+ lpszA,
+ cb,
+ szBufW,
+ cb) != 0);
+
+ return szBufW;
+}
+
+OLECHAR FAR * ToNewW(char FAR* lpszA)
+{
+ OLECHAR FAR * szW;
+ UINT cb;
+
+ cb = strlen(lpszA)+1;
+ szW = (LPOLESTR)_fmalloc(cb * sizeof(OLECHAR));
+
+ SideAssert (MultiByteToWideChar(CP_ACP,
+ MB_PRECOMPOSED,
+ lpszA,
+ cb,
+ szW,
+ cb) != 0);
+
+ return szW;
+}
+
+char FAR * ToA(OLECHAR FAR* lpszW)
+{
+ SideAssert (WideCharToMultiByte(CP_ACP,
+ 0,
+ lpszW,
+ -1,
+ (char FAR *)szBufW,
+ CW_BUFFER,
+ NULL,
+ NULL) != 0);
+
+ return (CHAR *)szBufW;
+}
+#else //FV_UNICODE_OLE
+
+// Non-unicode routines are a NOP
+#define ToW(lpszA) lpszA
+#define ToNewW(lpszA) lpszA
+#define ToA(lpszW) lpszW
+
+#endif //FV_UNICODE_OLE
+
+
+VOID FAR OutputTyplib
+(
+ CHAR * szTypeLibFile
+)
+{
+ HRESULT res;
+ ICreateTypeLib FAR * lpdtlib;
+#ifndef MAC
+ CHAR szTypeLibFileTmp[128];
+#endif //!MAC
+ WORD wLibFlags;
+
+ fDoingOutput = TRUE; // signal to error reporting code
+ SETITEMCUR(typlib.szLibName);
+
+#ifndef MAC
+ // pre-pend ".\" to filename if unqualified name, to work-around OLE path
+ // searching bug.
+
+ if (!XStrChr(szTypeLibFile, '\\') && !XStrChr(szTypeLibFile, '/') &&
+ *(szTypeLibFile+1) != ':')
+ { // if unqualified name
+ strcpy(szTypeLibFileTmp, ".\\");
+ strcpy(szTypeLibFileTmp+2, szTypeLibFile);
+ // this name is used later -- don't free it
+ //free(szTypeLibFile);
+ szTypeLibFile = szTypeLibFileTmp;
+ }
+
+#endif
+
+ // 1. Get * to ICreateTypeLib interface
+ CHECKRESULT(CreateTypeLib(SysKind, ToW(szTypeLibFile), &lpdtlib));
+
+ // WARNING: SetLCID must be called before the anything in the nammgr is used
+ // it needs to be called even if the user doesn't specifiy an lcid
+ // (in which case we default to an lcid of 0).
+ CHECKRESULT(lpdtlib->SetLcid(
+ (typlib.attr.fAttr & fLCID) ? typlib.attr.lLcid : 0
+ ));
+
+ // 2. Set the library name:
+ CHECKRESULT(lpdtlib->SetName(ToW(typlib.szLibName)));
+
+ // 3. Set the library attributes, if present:
+ if (typlib.attr.fAttr & fHELPSTRING)
+ CHECKRESULT(lpdtlib->SetDocString(ToW(typlib.attr.lpszHelpString)));
+
+ if (typlib.attr.fAttr & fHELPCONTEXT)
+ CHECKRESULT(lpdtlib->SetHelpContext(typlib.attr.lHelpContext));
+
+ if (typlib.attr.fAttr & fHELPFILE)
+ CHECKRESULT(lpdtlib->SetHelpFileName(ToW(typlib.attr.lpszHelpFile)));
+
+ if (typlib.attr.fAttr & fVERSION)
+ CHECKRESULT(lpdtlib->SetVersion(typlib.attr.wVerMajor, typlib.attr.wVerMinor));
+
+ if (typlib.attr.fAttr & fUUID)
+ CHECKRESULT(lpdtlib->SetGuid(*typlib.attr.lpUuid));
+
+ wLibFlags = 0;
+ if (typlib.attr.fAttr & fRESTRICTED)
+ wLibFlags |= LIBFLAG_FRESTRICTED;
+ if (typlib.attr.fAttr2 & f2CONTROL)
+ wLibFlags |= LIBFLAG_FCONTROL;
+ if (typlib.attr.fAttr & fHIDDEN)
+ wLibFlags |= LIBFLAG_FHIDDEN;
+ CHECKRESULT(lpdtlib->SetLibFlags(wLibFlags));
+
+ // 4. Output all the typinfo's into the type library
+ if (typlib.pEntry) // if any entries
+ OutputTypeInfos(lpdtlib);
+
+ // 5. Save the typlib to the give file
+ SETITEMCUR(typlib.szLibName);
+
+ CHECKRESULT(lpdtlib->SaveAllChanges());
+
+ // 6. Cleanup. All done -- release release the ICreateTypeLib.
+ lpdtlib->Release(); // release the ICreateTypeLib
+
+}
+
+
+// WARNING: must be kept in ssync with TENTRYKIND enum in FILEINFO.H
+TYPEKIND rgtkind[] = {
+ TKIND_ALIAS, // tTYPEDEF
+ TKIND_RECORD, // tSTRUCT
+ TKIND_ENUM, // tENUM
+ TKIND_UNION, // tUNION
+ TKIND_MODULE, // tMODULE
+ TKIND_INTERFACE, // tINTERFACE
+ TKIND_DISPATCH, // tDISPINTER
+ TKIND_COCLASS, // tCOCLASS
+// TKIND_xxx, // tINTRINISIC
+// TKIND_xxx, // tREF
+// TKIND_xxx, // tANY
+};
+
+// WARNING: must be kept in ssync with TYPEKIND enum in DISPATCH.H
+TENTRYKIND rgtentrykind[] = {
+ tENUM, // TKIND_ENUM
+ tSTRUCT, // TKIND_RECORD
+ tMODULE, // TKIND_MODULE
+ tINTERFACE, // TKIND_INTERFACE
+ tDISPINTER, // TKIND_DISPATCH
+ tCOCLASS, // TKIND_COCLASS
+ tTYPEDEF, // TKIND_ALIAS
+ tUNION, // TKIND_UNION
+};
+
+// For each library entry, creates a typeinfo in the typelib,
+// and fills it in.
+VOID NEAR OutputTypeInfos
+(
+ ICreateTypeLib FAR * lpdtlib
+)
+{
+ LPENTRY pEntry;
+ TYPEKIND tkind;
+ HRESULT res;
+ ICreateTypeInfo FAR* lpdtinfo;
+ WORD wTypeFlags;
+
+ // First allocate an array of ELEMDESCs to hold the max # of
+ // args of any function we need to describe.
+ rgFuncArgs = (ELEMDESC FAR*)_fmalloc(cArgsMax * sizeof(ELEMDESC));
+ rgszFuncArgNames = (LPOLESTR FAR *)_fmalloc((cArgsMax+1) * sizeof(LPOLESTR));
+ if (rgFuncArgs == NULL || rgszFuncArgNames == NULL)
+ ParseError(ERR_OM);
+
+ // pass 1 -- create the typeinfo's
+ pEntry = (LPENTRY)ListFirst(typlib.pEntry); // point to first entry
+ for (;;)
+ {
+
+ // determine if we are going to create a typeinfo for this guy
+ switch (pEntry->type.tentrykind)
+ {
+ case tTYPEDEF:
+ if (pEntry->attr.fAttr) // create lpdtinfo only if
+ break; // this is a 'PUBLIC' typedef
+
+NoTypeInfos:
+ pEntry->lpdtinfo = NULL; // no lpdtinfo for this
+
+ case tREF: // no typeinfo's made for these
+ case tINTRINSIC:
+ goto Next_Entry1;
+
+ default:
+ // no typeinfo's made for forward declarations
+ if (pEntry->type.tentrykind & tFORWARD)
+ goto NoTypeInfos;
+ if (pEntry->type.tentrykind & tIMPORTED)
+ goto Next_Entry1; // nothing for imported types
+ break;
+ }
+
+ // 1. determine kind of typeinfo to create
+ tkind = rgtkind[pEntry->type.tentrykind];
+
+ // 2. Create type library entry (TypeInfo) of a given name/and
+ // type, getting a pointer to the ICreateTypeInfo interface
+ SETITEMCUR(pEntry->type.szName);
+ CHECKRESULT(lpdtlib->CreateTypeInfo(ToW(pEntry->type.szName), tkind, &lpdtinfo));
+ pEntry->lpdtinfo = lpdtinfo;
+
+ // 3. Set the item's attributes:
+ if (pEntry->attr.fAttr & fUUID)
+ CHECKRESULT(lpdtinfo->SetGuid(*pEntry->attr.lpUuid));
+
+ if (pEntry->attr.fAttr & fHELPSTRING)
+ CHECKRESULT(lpdtinfo->SetDocString(ToW(pEntry->attr.lpszHelpString)));
+
+ if (pEntry->attr.fAttr & fHELPCONTEXT)
+ CHECKRESULT(lpdtinfo->SetHelpContext(pEntry->attr.lHelpContext));
+
+ if (pEntry->attr.fAttr & fVERSION)
+ CHECKRESULT(lpdtinfo->SetVersion(pEntry->attr.wVerMajor, pEntry->attr.wVerMinor));
+
+ // 4. save lptinfo for this guy in case somebody references it
+ CHECKRESULT(lpdtinfo->QueryInterface(IID_ITypeInfo, (VOID FAR* FAR*)&pEntry->type.lptinfo));
+
+ // if this type has a forward declaration
+ if (pEntry->lpEntryForward)
+ {
+ // copy "real" type info over top of forward declaration,
+ // because folks have pointers to the forward declaration
+ pEntry->lpEntryForward->type.tdesc = pEntry->type.tdesc;
+ pEntry->lpEntryForward->type.lptinfo = pEntry->type.lptinfo;
+ // Only need to copy these 2 fields from the type (the
+ // others aren't referenced at type creation time.
+ }
+
+Next_Entry1:
+ // advance to next entry if not all done
+ if (pEntry == (LPENTRY)ListLast(typlib.pEntry))
+ break; // exit if all done
+ pEntry = (LPENTRY)pEntry->type.pNext;
+ }
+
+
+ // pass 2 -- process each entry
+ pEntry = (LPENTRY)ListFirst(typlib.pEntry); // point to first entry
+ for (;;)
+ {
+
+ // 1. Get our lpdtinfo again if we have one
+
+ switch (pEntry->type.tentrykind)
+ {
+ case tREF:
+ case tINTRINSIC:
+ goto Next_Entry2; // these guys don't have lpdtinfo field
+ default:
+ if (pEntry->type.tentrykind & tIMPORTED)
+ goto Next_Entry2; // no lpdtinfo field
+ break;
+ }
+
+ lpdtinfo = pEntry->lpdtinfo;
+ if (lpdtinfo == NULL) // skip if no lpdtinfo created
+ goto Next_Entry2; // (forward decl or non-public typedef)
+
+ // set up for error reporting
+ SETITEMCUR(pEntry->type.szName);
+
+ // 2. determine kind of typeinfo we're dealing with
+ tkind = rgtkind[pEntry->type.tentrykind];
+
+ // 2a. Set the typeinfo flags
+ wTypeFlags = 0;
+ if (tkind == TKIND_COCLASS) {
+ // COCLASSs always have FCANCREATE bit set
+ wTypeFlags |= TYPEFLAG_FCANCREATE;
+ // these are only valid on COCLASSs
+ if (pEntry->attr.fAttr & fAPPOBJECT)
+ wTypeFlags |= (WORD)TYPEFLAG_FAPPOBJECT;
+ if (pEntry->attr.fAttr & fLICENSED)
+ wTypeFlags |= (WORD)TYPEFLAG_FLICENSED;
+ if (pEntry->attr.fAttr & fPREDECLID)
+ wTypeFlags |= (WORD)TYPEFLAG_FPREDECLID;
+ }
+ if (pEntry->attr.fAttr & fHIDDEN)
+ wTypeFlags |= (WORD)TYPEFLAG_FHIDDEN;
+ if (pEntry->attr.fAttr2 & f2CONTROL)
+ wTypeFlags |= (WORD)TYPEFLAG_FCONTROL;
+ if (pEntry->attr.fAttr2 & f2NONEXTENSIBLE)
+ wTypeFlags |= (WORD)TYPEFLAG_FNONEXTENSIBLE;
+ if (pEntry->attr.fAttr2 & f2DUAL) // DUAL implies OLEAUTOMATION
+ wTypeFlags |= (WORD)(TYPEFLAG_FDUAL | TYPEFLAG_FOLEAUTOMATION);
+ if (pEntry->attr.fAttr2 & f2OLEAUTOMATION)
+ wTypeFlags |= (WORD)TYPEFLAG_FOLEAUTOMATION;
+ CHECKRESULT(lpdtinfo->SetTypeFlags(wTypeFlags));
+
+ // 3. now process each kind of entry
+ switch (tkind)
+ {
+ case TKIND_ALIAS:
+
+ OutputAlias(lpdtinfo, pEntry->type.td.ptypeAlias);
+ break;
+
+ case TKIND_RECORD: // struct's, enum's, and union's are
+ case TKIND_ENUM: // all very similar
+ case TKIND_UNION:
+ OutputElems(lpdtinfo, pEntry->type.structenum.elemList, tkind);
+ break;
+
+ case TKIND_MODULE:
+ OutputFuncs(lpdtinfo, pEntry, pEntry->module.funcList, tkind);
+ OutputElems(lpdtinfo, pEntry->module.constList, tkind);
+ break;
+
+ case TKIND_INTERFACE:
+ OutputInterface(lpdtinfo, pEntry);
+ break;
+
+ case TKIND_DISPATCH:
+ OutputDispinter(lpdtinfo, pEntry);
+ break;
+
+ case TKIND_COCLASS:
+ OutputClass(lpdtinfo, pEntry);
+ break;
+
+#if FV_PROPSET
+ case TKIND_PROPSET:
+ // CONSIDER: (FV_PROPSET) do something with base_propset name
+ OutputElems(lpdtinfo, pEntry->propset.propList, tkind);
+ break;
+#endif //FV_PROPSET
+ default:
+ Assert(FALSE);
+ };
+
+ // 3a. Set the alignment for this TypeInfo. Must be done before
+ // Layout().
+ CHECKRESULT(lpdtinfo->SetAlignment(iAlignMax));
+
+ // 4. Compile this typeinfo we've just created.
+ SETITEMCUR(pEntry->type.szName);
+ CHECKRESULT(lpdtinfo->LayOut());
+
+ // 5. Cleanup. All done with lpdtinfo.
+ lpdtinfo->Release();
+
+Next_Entry2:
+ // advance to next entry if not all done
+ if (pEntry == (LPENTRY)ListLast(typlib.pEntry))
+ break; // exit if all done
+ pEntry = (LPENTRY)pEntry->type.pNext;
+ }
+
+
+ // now clean up everything else
+ _ffree(rgFuncArgs); // done with function args we allocated
+ _ffree(rgszFuncArgNames);
+
+}
+
+VOID NEAR OutputFuncs
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ LPENTRY pEntry,
+ LPFUNC pFuncList,
+ TYPEKIND tkind
+)
+{
+
+ LPFUNC pFunc;
+ LPELEM pArg;
+ HRESULT res;
+ UINT iFunc = 0; // function index
+ LPOLESTR lpszDllName;
+ LPSTR lpszProcName;
+ SHORT i;
+ FUNCDESC FuncDesc;
+ LPOLESTR FAR* lplpszArgName;
+
+ if (pFuncList == NULL) // just return if no functions to output
+ return;
+
+ FuncDesc.lprgelemdescParam = rgFuncArgs; // set up array of args
+
+ pFunc = (LPFUNC)ListFirst(pFuncList); // point to first entry
+#if FV_UNICODE_OLE
+ lpszDllName = (pEntry->attr.fAttr & fDLLNAME ? ToNewW(pEntry->attr.lpszDllName) : NULL);
+#else
+ lpszDllName = pEntry->attr.lpszDllName;
+#endif
+
+ for (;;)
+ {
+ // Fill in the FUNCDESC structure with the function's info
+
+ // set up funckind
+ switch (tkind) {
+ case TKIND_MODULE:
+ FuncDesc.funckind = FUNC_STATIC;
+ break;
+ case TKIND_INTERFACE:
+ FuncDesc.funckind = FUNC_PUREVIRTUAL;
+ break;
+ case TKIND_DISPATCH:
+ FuncDesc.funckind = FUNC_DISPATCH;
+ break;
+ default:
+ Assert(FALSE);
+ }
+
+ // set up invkind
+ FuncDesc.invkind = INVOKE_FUNC; // default
+ if (pFunc->func.attr.fAttr & fPROPGET)
+ FuncDesc.invkind = INVOKE_PROPERTYGET;
+ else if (pFunc->func.attr.fAttr & fPROPPUT)
+ FuncDesc.invkind = INVOKE_PROPERTYPUT;
+ else if (pFunc->func.attr.fAttr & fPROPPUTREF)
+ FuncDesc.invkind = INVOKE_PROPERTYPUTREF;
+
+ // set up callconv
+ if (pFunc->func.attr.fAttr2 & f2PASCAL)
+ // CC_MACPASCAL if /mac specified, CC_MSCPASCAL otherwise
+ FuncDesc.callconv = (CALLCONV)(SysKind == SYS_MAC ? CC_MACPASCAL: CC_MSCPASCAL);
+ else if (pFunc->func.attr.fAttr2 & f2CDECL)
+ FuncDesc.callconv = CC_CDECL;
+ else if (pFunc->func.attr.fAttr2 & f2STDCALL)
+ FuncDesc.callconv = CC_STDCALL;
+#ifdef DEBUG
+ else Assert(FALSE);
+#endif //DEBUG
+
+ FuncDesc.wFuncFlags = 0;
+ if (pFunc->func.attr.fAttr & fRESTRICTED)
+ FuncDesc.wFuncFlags |= (WORD)FUNCFLAG_FRESTRICTED;
+ if (pFunc->func.attr.fAttr & fSOURCE)
+ FuncDesc.wFuncFlags |= (WORD)FUNCFLAG_FSOURCE;
+ if (pFunc->func.attr.fAttr & fBINDABLE)
+ FuncDesc.wFuncFlags |= (WORD)FUNCFLAG_FBINDABLE;
+ if (pFunc->func.attr.fAttr & fREQUESTEDIT)
+ FuncDesc.wFuncFlags |= (WORD)FUNCFLAG_FREQUESTEDIT;
+ if (pFunc->func.attr.fAttr & fDISPLAYBIND)
+ FuncDesc.wFuncFlags |= (WORD)FUNCFLAG_FDISPLAYBIND;
+ if (pFunc->func.attr.fAttr & fDEFAULTBIND)
+ FuncDesc.wFuncFlags |= (WORD)FUNCFLAG_FDEFAULTBIND;
+ if (pFunc->func.attr.fAttr & fHIDDEN)
+ FuncDesc.wFuncFlags |= (WORD)FUNCFLAG_FHIDDEN;
+
+ // set up cParams & cParamsOpt
+ FuncDesc.cParams = pFunc->cArgs;
+ FuncDesc.cParamsOpt = pFunc->cOptArgs;
+ //NOTE: cParamsOpt can be set to -1, to note that last parm is a
+ //NOTE: [safe] array of variant args. This corresponds to the
+ //NOTE: 'vararg' attribute in the input description. If this was
+ //NOTE: specified, the parser set pFunc->cOptArgs to -1 for us.
+
+ // set up misc unused stuff
+ FuncDesc.oVft = 0; // only used for FUNC_VIRTUAL
+ FuncDesc.cScodes = -1; // list of SCODEs unknown
+ FuncDesc.lprgscode = NULL;
+
+ // set id field if 'id' attribute specified
+ if (pFunc->func.attr.fAttr & fID)
+ FuncDesc.memid = pFunc->func.attr.lId;
+ else
+ FuncDesc.memid = DISPID_UNKNOWN;
+
+ // set up elemdescFunc
+ // Contains the ID, name, and return type of the function
+ LoadElemDesc(lpdtinfo, &(FuncDesc.elemdescFunc), &pFunc->func);
+
+ // save function name
+ lplpszArgName = rgszFuncArgNames;
+ *lplpszArgName++ = ToNewW(pFunc->func.szElemName);
+ SETITEMCUR(pFunc->func.szElemName);
+
+ // set up the lprgelemdescParam array of info for each parameter
+ pArg = pFunc->argList; // point to last arg, if any
+ for (i = 0; i < pFunc->cArgs; i++)
+ {
+ pArg = pArg->pNext; // point to next arg (first arg
+ // first time through loop)
+ LoadElemDesc(lpdtinfo, &(FuncDesc.lprgelemdescParam[i]), pArg);
+ *lplpszArgName++ = ToNewW(pArg->szElemName); // save arg name
+ }
+
+ // Define the function item:
+ CHECKRESULT(lpdtinfo->AddFuncDesc(iFunc, &FuncDesc));
+
+ // set the names of the function and the parameters
+ Assert(i == pFunc->cArgs);
+
+ // don't set the name of the last param for proput/putref functions
+ if (pFunc->func.attr.fAttr & (fPROPPUT | fPROPPUTREF)) {
+ i--;
+ }
+
+ CHECKRESULT(lpdtinfo->SetFuncAndParamNames(iFunc, rgszFuncArgNames, i+1));
+#if FV_UNICODE_OLE
+ // free the unicode function & param names
+ lplpszArgName = rgszFuncArgNames;
+ for (i = 0; i <= pFunc->cArgs; i++) {
+ _ffree(*lplpszArgName); // done with unicode name
+ lplpszArgName++;
+ }
+#endif //FV_UNICODE_OLE
+
+ // Set the function item's remaining attributes:
+ if (pFunc->func.attr.fAttr & fHELPSTRING)
+ CHECKRESULT(lpdtinfo->SetFuncDocString(iFunc, ToW(pFunc->func.attr.lpszHelpString)));
+ if (pFunc->func.attr.fAttr & fHELPCONTEXT)
+ CHECKRESULT(lpdtinfo->SetFuncHelpContext(iFunc, pFunc->func.attr.lHelpContext));
+ // Handle case of a DLL entrypoint
+ if (pFunc->func.attr.fAttr & fENTRY)
+ {
+ // If high word of name is zero, then call by ordnal
+ // If high word of name is non-zero, then call by name
+ // (same as GetProcAddress)
+
+ lpszProcName = pFunc->func.attr.lpszProcName;
+#if FV_UNICODE_OLE
+ if (HIWORD(lpszProcName)) {
+ lpszProcName = (LPSTR)ToW(lpszProcName);
+ }
+#endif //FV_UNICODE_OLE
+ CHECKRESULT(lpdtinfo->DefineFuncAsDllEntry(iFunc, lpszDllName, (LPOLESTR)lpszProcName));
+ }
+
+ // advance to next entry if not all done
+ if (pFunc == (LPFUNC)ListLast(pFuncList))
+ break; // exit if all done
+ pFunc = (LPFUNC)pFunc->func.pNext;
+ iFunc++; // advance function counter
+ }
+#if FV_UNICODE_OLE
+ if (lpszDllName)
+ _ffree(lpszDllName); // done with unicode name
+#endif //FV_UNICODE_OLE
+}
+
+VOID NEAR OutputElems
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ LPELEM pElemList,
+ TYPEKIND tkind
+)
+{
+
+ LPELEM pElem;
+ HRESULT res;
+ UINT iElem = 0; // element index
+ VARDESC VarDesc;
+
+
+ if (pElemList == NULL)
+ return;
+
+ pElem = (LPELEM)ListFirst(pElemList); // point to first entry
+
+ for (;;)
+ {
+
+ // First fill in the VARDESC structure with the element's info
+ SETITEMCUR(pElem->szElemName);
+
+ VarDesc.memid = DISPID_UNKNOWN; // assume not a dispinterface
+
+ // Set up varkind
+ switch (tkind)
+ {
+ case TKIND_ENUM: // for enum elements
+ case TKIND_MODULE: // for const's
+ VarDesc.varkind = VAR_CONST;
+ VarDesc.lpvarValue = pElem->lpElemVal; // * to value
+ if (tkind == TKIND_MODULE)
+ goto DoLoadElemDesc; // set up the tdesc
+
+ // For ENUM elements, can't call LoadElemDesc, because
+ // we have no pElem->elemType. Do the required work here.
+
+ VarDesc.elemdescVar.tdesc.vt = VT_INT; // element type
+ // is an INT
+ VarDesc.elemdescVar.idldesc.wIDLFlags = 0; // no IDL info
+#ifdef WIN16
+ VarDesc.elemdescVar.idldesc.bstrIDLInfo = NULL;
+#else //WIN16
+ VarDesc.elemdescVar.idldesc.dwReserved = 0;
+#endif //WIN16
+ break;
+
+ case TKIND_RECORD:
+ case TKIND_UNION:
+ VarDesc.varkind = VAR_PERINSTANCE;
+ goto DoLoadElemDesc;
+
+ default:
+#if FV_PROPSET
+ Assert(tkind == TKIND_DISPATCH || tkind == TKIND_PROPSET);
+#else //FV_PROPSET
+ Assert(tkind == TKIND_DISPATCH);
+#endif //FV_PROPSET
+ VarDesc.varkind = VAR_DISPATCH;
+
+ // id' attribute required
+ Assert (pElem->attr.fAttr & fID);
+ VarDesc.memid = pElem->attr.lId;
+
+DoLoadElemDesc:
+ // Set up elemdescVar. Contains name, and type of item.
+ LoadElemDesc(lpdtinfo, &(VarDesc.elemdescVar), pElem);
+ }
+
+ // VarDesc.oInst is not used when doing AddVarDesc
+ VarDesc.wVarFlags = 0;
+ if (pElem->attr.fAttr & fREADONLY)
+ VarDesc.wVarFlags |= (WORD)VARFLAG_FREADONLY;
+ if (pElem->attr.fAttr & fSOURCE)
+ VarDesc.wVarFlags |= (WORD)VARFLAG_FSOURCE;
+ if (pElem->attr.fAttr & fBINDABLE)
+ VarDesc.wVarFlags |= (WORD)VARFLAG_FBINDABLE;
+ if (pElem->attr.fAttr & fREQUESTEDIT)
+ VarDesc.wVarFlags |= (WORD)VARFLAG_FREQUESTEDIT;
+ if (pElem->attr.fAttr & fDISPLAYBIND)
+ VarDesc.wVarFlags |= (WORD)VARFLAG_FDISPLAYBIND;
+ if (pElem->attr.fAttr & fDEFAULTBIND)
+ VarDesc.wVarFlags |= (WORD)VARFLAG_FDEFAULTBIND;
+ if (pElem->attr.fAttr & fHIDDEN)
+ VarDesc.wVarFlags |= (WORD)VARFLAG_FHIDDEN;
+
+ // Now define the element
+ CHECKRESULT(lpdtinfo->AddVarDesc(iElem, &VarDesc));
+
+ // Lastly, set element's remaining attributes:
+ CHECKRESULT(lpdtinfo->SetVarName(iElem, ToW(pElem->szElemName)));
+
+ if (pElem->attr.fAttr & fHELPSTRING)
+ CHECKRESULT(lpdtinfo->SetVarDocString(iElem, ToW(pElem->attr.lpszHelpString)));
+ if (pElem->attr.fAttr & fHELPCONTEXT)
+ CHECKRESULT(lpdtinfo->SetVarHelpContext(iElem, pElem->attr.lHelpContext));
+ // advance to next entry if not all done
+ if (pElem == (LPELEM)ListLast(pElemList))
+ break; // exit if all done
+ pElem = pElem->pNext;
+ iElem++; // advance element counter
+ }
+}
+
+
+// update the tdesc.HRefType field of the base type prior to
+// using a given type.
+VOID NEAR UpdateHRefType
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ LPTYPE lpTypeBase
+)
+{
+
+ HRESULT res;
+ HREFTYPE hreftype;
+ LPSTR szTypeName;
+ LPTYPE lpTypeCArray;
+
+ // get * to real base type, ignoring non-public typedef's
+ lpTypeBase = lpTypePublic(lpTypeBase);
+ lpTypeCArray = NULL; // assume not a C array
+
+ // CONSIDER: non-pointer to a forward declare with no def yet should give an
+ // CONSIDER: error. This isn't the right check, but it's close.
+ // CONSIDER: error currently gets caught by Layout() so it's no big deal.
+ //if (lpTypeBase->tdesc.vt == VT_USERDEFINED && (lpTypeBase->tentrykind & ~tFORWARD))
+ // goto NoDef;
+
+
+ while (lpTypeBase->tentrykind == tREF) // for VT_PTR, VT_SAFEARRAY or
+ // VT_CARRAY
+ {
+ if (lpTypeBase->tdesc.vt == VT_CARRAY)
+ lpTypeCArray = lpTypeBase;
+ else
+ lpTypeCArray = NULL; // not a C array
+ lpTypeBase = lpTypeBase->ref.ptypeBase;
+
+ // get * to real base type, ignoring non-public typedef's
+ lpTypeBase = lpTypePublic(lpTypeBase);
+ }
+
+
+ // update the tdesc.hreftype of the base type if necessary
+ if (lpTypeBase->tdesc.vt == VT_USERDEFINED)
+ {
+
+ if (lpTypeBase->lptinfo == NULL)
+ { // we're trying to use a forward declaration to a
+ // type with no real definition
+//NoDef:
+ switch (lpTypeBase->tentrykind & ~tFORWARD)
+ {
+ case tSTRUCT:
+ case tENUM:
+ case tUNION:
+ szTypeName = lpTypeBase->structenum.szTag;
+ break;
+ default:
+ szTypeName = lpTypeBase->szName;
+ break;
+ }
+ ItemError(szFmtErrOutput, szTypeName, OERR_NO_DEF);
+ }
+
+ // get reference to given typeinfo
+ CHECKRESULT(lpdtinfo->AddRefTypeInfo(lpTypeBase->lptinfo, &hreftype));
+
+ // store this in the appropriate tdesc
+ if (lpTypeCArray) // C arrays have a separate tdesc
+ lpTypeCArray->tdesc.lpadesc->tdescElem.hreftype = hreftype;
+ else
+ lpTypeBase->tdesc.hreftype = hreftype;
+ }
+}
+
+
+VOID NEAR OutputAlias
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ LPTYPE lpTypeAlias
+)
+{
+ HRESULT res;
+
+ // update the tdesc.hreftype field of the base type if it's
+ // a user-defined type.
+ UpdateHRefType(lpdtinfo, lpTypeAlias);
+
+ // Define the alias:
+ CHECKRESULT(lpdtinfo->SetTypeDescAlias(&(lpTypePublic(lpTypeAlias)->tdesc)));
+}
+
+
+// Fills in a ELEMDESC (for enum's, properties, property_set properties,
+// function names, function parms)
+VOID NEAR LoadElemDesc
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ ELEMDESC FAR* lpElemDesc,
+ LPELEM pElem
+)
+{
+ WORD wFlags;
+
+ // set up the type description
+
+ // update the tdesc.hreftype field of the element type if it's
+ // a user-defined type.
+ UpdateHRefType(lpdtinfo, pElem->elemType);
+
+ lpElemDesc->tdesc = lpTypePublic(pElem->elemType)->tdesc; // copy the tdesc
+
+ // set up the idldesc field
+ wFlags = 0;
+ if (pElem->attr.fAttr & fIN)
+ wFlags |= IDLFLAG_FIN;
+ if (pElem->attr.fAttr & fOUT)
+ wFlags |= IDLFLAG_FOUT;
+ if (pElem->attr.fAttr & fLCID)
+ wFlags |= IDLFLAG_FLCID;
+ if (pElem->attr.fAttr & fRETVAL)
+ wFlags |= IDLFLAG_FRETVAL;
+ lpElemDesc->idldesc.wIDLFlags = wFlags;
+#ifdef WIN16
+ lpElemDesc->idldesc.bstrIDLInfo = NULL; // no additional info
+#else //WIN16
+ lpElemDesc->idldesc.dwReserved = 0;
+#endif //WIN16
+
+}
+
+
+
+VOID NEAR OutputInterface
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ LPENTRY pEntry
+)
+{
+
+ if (pEntry->type.inter.interList)
+ { // handle inheritance if any base interface(s)
+ OutputBaseInterfaces(lpdtinfo, pEntry, TKIND_INTERFACE);
+ }
+
+ OutputFuncs(lpdtinfo, pEntry, pEntry->inter.funcList, TKIND_INTERFACE);
+}
+
+
+VOID NEAR OutputDispinter
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ LPENTRY pEntry
+)
+{
+ // handle inheritance from IDispatch or some other interface
+ OutputBaseInterfaces(lpdtinfo, pEntry, TKIND_DISPATCH);
+
+ OutputFuncs(lpdtinfo, pEntry, pEntry->dispinter.methList, TKIND_DISPATCH);
+
+ OutputElems(lpdtinfo, pEntry->dispinter.propList, TKIND_DISPATCH);
+}
+
+
+VOID NEAR OutputClass
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ LPENTRY pEntry
+)
+{
+ // tell typelib.dll about the list of implemented interface(s)
+ OutputBaseInterfaces(lpdtinfo, pEntry, TKIND_COCLASS);
+}
+
+
+VOID NEAR OutputBaseInterfaces
+(
+ ICreateTypeInfo FAR* lpdtinfo,
+ LPENTRY pEntry,
+ TYPEKIND tkind
+)
+{
+ HREFTYPE hreftype;
+ HRESULT res;
+ LPINTER lpinterList = pEntry->type.inter.interList;
+ LPINTER lpinter;
+ SHORT i;
+ INT implTypeFlags;
+
+ Assert (lpinterList); // caller should have checked this for use
+ // point to first base interface
+ lpinter = (LPINTER)ListFirst(lpinterList);
+ for (i=0;;i++)
+ {
+ // get index of typeinfo of base interface/dispinterface
+ if (lpinter->ptypeInter->lptinfo == NULL)
+ ItemError(szFmtErrOutput, lpinter->ptypeInter->szName, OERR_NO_DEF);
+
+ CHECKRESULT(lpdtinfo->AddRefTypeInfo(lpinter->ptypeInter->lptinfo, &hreftype));
+
+ CHECKRESULT(lpdtinfo->AddImplType(i, hreftype));
+
+ //
+ if (tkind == TKIND_COCLASS) {
+ // need to always set the flags for items in a coclass
+ implTypeFlags = 0;
+ if (lpinter->fAttr & fDEFAULT)
+ implTypeFlags |= IMPLTYPEFLAG_FDEFAULT;
+ if (lpinter->fAttr & fRESTRICTED)
+ implTypeFlags |= IMPLTYPEFLAG_FRESTRICTED;
+ if (lpinter->fAttr & fSOURCE)
+ implTypeFlags |= IMPLTYPEFLAG_FSOURCE;
+ CHECKRESULT(lpdtinfo->SetImplTypeFlags(i, implTypeFlags));
+ }
+
+ // advance to next entry if not all done
+ if (lpinter == (LPINTER)ListLast(lpinterList))
+ break; // exit if all done
+ lpinter = (LPINTER)lpinter->pNext;
+ } // WHILE
+}
+
+
+// ************************************************************************
+// Functions for looking up external types
+// ************************************************************************
+
+// load an external type library
+VOID FAR LoadExtTypeLib
+(
+ LPIMPORTLIB lpImpLib
+)
+{
+ ITypeLib FAR* lptlib;
+ HRESULT res;
+ BSTR bstrName;
+
+ SETITEMCUR(lpImpLib->lpszFileName);
+
+ // get * to ITypeLib interface
+ CHECKRESULT(LoadTypeLib(ToW(lpImpLib->lpszFileName), &lptlib));
+ lpImpLib->lptlib = lptlib;
+
+ // get name of this library
+ CHECKRESULT(lptlib->GetDocumentation(-1, &bstrName, NULL, NULL, NULL));
+ // copy library name from the BSTR
+ lpImpLib->lpszLibName = _fstrdup(ToA(bstrName));
+
+ SysFreeString(bstrName); // free the BSTR
+
+ // get * to ITypeComp interface
+ CHECKRESULT(lptlib->GetTypeComp(&(lpImpLib->lptcomp)));
+
+ // get library attributes
+ CHECKRESULT(lptlib->GetLibAttr(&(lpImpLib->lptlibattr)));
+
+}
+
+
+VOID FAR CleanupImportedTypeLibs()
+{
+ LPIMPORTLIB lpImpLib;
+ LPENTRY pEntry;
+
+ // free up each of the referenced lptinfo's
+ if (typlib.pEntry) {
+ pEntry = (LPENTRY)ListFirst(typlib.pEntry); // point to first entry
+ for (;;)
+ {
+ // release the ITypeInfo
+ if (pEntry->type.lptinfo != NULL &&
+ (pEntry->type.tentrykind & tFORWARD) == 0)
+ pEntry->type.lptinfo->Release();
+
+ // advance to next entry if not all done
+ if (pEntry == ListLast(typlib.pEntry))
+ break; // exit if all done
+ pEntry = (LPENTRY)pEntry->type.pNext;
+ }
+ }
+
+ if (typlib.pImpLib)
+ { // only if any imported type libraries
+
+ // point to first imported library entry
+ lpImpLib = (LPIMPORTLIB)ListFirst(typlib.pImpLib);
+ for (;;)
+ {
+ if (lpImpLib->lptcomp) {
+ lpImpLib->lptcomp->Release();
+ }
+
+ if (lpImpLib->lptlibattr) {
+ Assert (lpImpLib->lptlib);
+ lpImpLib->lptlib->ReleaseTLibAttr(lpImpLib->lptlibattr);
+ }
+
+ if (lpImpLib->lptlib) {
+ lpImpLib->lptlib->Release();
+ }
+
+ // advance to next entry if not all done
+ if (lpImpLib == (LPIMPORTLIB)ListLast(typlib.pImpLib))
+ break; // exit if all done
+ lpImpLib = lpImpLib->pNext;
+ } // WHILE
+ }
+}
+
+
+// find type defined in an external type library,
+// and add it to the type table if found.
+// lpszLibName is NULL if we're to look in ALL external type libraries.
+LPTYPE FAR FindExtType
+(
+ LPSTR lpszLibName,
+ LPSTR lpszTypeName
+)
+{
+ LPIMPORTLIB lpImpLib;
+ HRESULT res;
+ ULONG lHashVal;
+ ITypeInfo FAR* lptinfo;
+ ITypeComp FAR* lptcomp;
+
+ Assert (lpszTypeName != NULL);
+
+ if (typlib.pImpLib != NULL) // if any imported type libraries
+ {
+ // point to first imported library entry
+ lpImpLib = (LPIMPORTLIB)ListFirst(typlib.pImpLib);
+
+ for (;;)
+ {
+
+ // if we're to look in all libraries, or this specific lib
+ if (lpszLibName == NULL || !FCmpCaseIns(lpszLibName, lpImpLib->lpszLibName))
+ {
+
+ SETITEMCUR(lpImpLib->lpszFileName);
+ lHashVal = LHashValOfNameSysA(lpImpLib->lptlibattr->syskind,
+ lpImpLib->lptlibattr->lcid,
+ lpszTypeName);
+
+ CHECKRESULT(lpImpLib->lptcomp->BindType(ToW(lpszTypeName), lHashVal, &lptinfo, &lptcomp));
+ if (lptinfo) // if found
+ {
+ // create a type table entry for this guy
+ ListInsert(&typlib.pEntry, sizeof(TYPE));
+
+ // lpszTypeName will get freed by caller.
+ // We must allocate new memory for it.
+ typlib.pEntry->type.szName = _fstrdup(lpszTypeName);
+
+ // CONSIDER: do a GetTypeAttr on this guy,
+ // to ensure it's not a 'module' type
+
+ typlib.pEntry->type.tdesc.vt = VT_USERDEFINED;
+ // init this now in case of error, since
+ // error cleanup code looks at this.
+ typlib.pEntry->type.lptinfo = NULL;
+
+ LPTYPEATTR ptypeattr;
+ TENTRYKIND tentrykind;
+
+ CHECKRESULT(lptinfo->GetTypeAttr(&ptypeattr));
+ // Get the interface typeinfo instead of
+ // the Dispinteface version.
+ if (ptypeattr->wTypeFlags & TYPEFLAG_FDUAL){
+ ITypeInfo FAR* lptinfo2;
+ HREFTYPE hreftype;
+ CHECKRESULT(lptinfo->GetRefTypeOfImplType((unsigned int)-1, &hreftype));
+ CHECKRESULT(lptinfo->GetRefTypeInfo(hreftype, &lptinfo2));
+ lptinfo->Release();
+ lptinfo->ReleaseTypeAttr(ptypeattr);
+ lptinfo = lptinfo2;
+ CHECKRESULT(lptinfo->GetTypeAttr(&ptypeattr));
+ }
+ typlib.pEntry->type.lptinfo = lptinfo;
+
+ // assume generic imported type
+ tentrykind = (TENTRYKIND)(rgtentrykind[ptypeattr->typekind] | tIMPORTED);
+ if (lpszLibName) {
+ tentrykind = (TENTRYKIND)(tentrykind | tQUAL);
+ }
+ typlib.pEntry->type.tentrykind = tentrykind;
+ typlib.pEntry->type.import.wTypeFlags = ptypeattr->wTypeFlags;
+
+ lptinfo->ReleaseTypeAttr(ptypeattr);
+ return &(typlib.pEntry->type); // all done
+ }
+ }
+
+ // advance to next entry if not all done
+ if (lpImpLib == (LPIMPORTLIB)ListLast(typlib.pImpLib))
+ break; // exit if all done
+ lpImpLib = lpImpLib->pNext;
+ } // WHILE
+ }
+ return (LPTYPE)NULL; //type not found
+}
+
+#define TYPELIBERR(name,string) name
+static SCODE rgTypelibScodes[] = {
+ #include "typelib.err" // TYPELIB.DLL scodes
+ S_FALSE // end of table
+};
+#undef TYPELIBERR
+
+void NEAR MethodError
+(
+ HRESULT res
+)
+{
+ ERR err;
+ int i;
+ CHAR * szFormat;
+
+ Assert(FAILED(res)); // should only be called if error
+
+ scodeErrCur = GetScode(res); // get scode from the hresult
+
+ // pick appripriate error format string, depending on whether we are
+ // reading an imported type library, or writing one.
+ if (fDoingOutput)
+ szFormat = szFmtErrOutput;
+ else
+ szFormat = szFmtErrImportlib;
+
+ // find err constant that matches this scode, if any
+ for (i = 0; ;i++)
+ {
+ if (rgTypelibScodes[i] == scodeErrCur)
+ { // found error in mapping table. Add table index to
+ // first TYPELIB.DLL error to get error constant.
+ err = (ERR)(i + OERR_TYPE_E_IOERROR);
+ break;
+ }
+ else if (rgTypelibScodes[i] == S_FALSE)
+ { // not in our mapping table -- use general error
+ err = OERR_TYPEINFO;
+ szFormat = szFmtErrUnknown;
+ break;
+ }
+ }
+
+ ItemError(szFormat, lpszItemCur, err);
+}
+
+}; // end of C data
diff --git a/private/oleauto/src/typelib/blkdsc32.hxx b/private/oleauto/src/typelib/blkdsc32.hxx
new file mode 100644
index 000000000..5843c792c
--- /dev/null
+++ b/private/oleauto/src/typelib/blkdsc32.hxx
@@ -0,0 +1,232 @@
+/***
+*sheapmgr.hxx - Silver Heap Manager
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Manages a huge array of bytes. Supports alloc/realloc/free.
+*
+*Implementation Notes:
+* OE_WIN16: use GlobalAlloc and family
+* else: Defers to host implementation of IMalloc.
+*
+*Revision History:
+*
+* 02-Nov-93 ilanc: Created.
+*
+*****************************************************************************/
+
+#ifndef BLKDESC32_HXX_INCLUDED
+#define BLKDESC32_HXX_INCLUDED
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szBLKDSC32_HXX)
+#define SZ_FILE_NAME g_szBLKDSC32_HXX
+#endif
+
+// forward declarations
+class STREAM;
+
+
+// **********************************
+// *** class BLKDESC32 starts here ***
+// **********************************
+//
+
+
+/***
+*class BLKDESC32 - 'blkdesc': block descriptor
+*Purpose:
+* The class implements block descriptors.
+* Describes a block allocated the heap manager.
+*
+*Implementation Notes:
+*
+***********************************************************************/
+
+class BLKDESC32
+{
+ friend class BLKMGR32;
+ friend class DYNBLKMGR32;
+
+public:
+ BLKDESC32();
+ ~BLKDESC32();
+
+ nonvirt TIPERROR Init(ULONG cbSize);
+
+ nonvirt BYTE *QtrOfBlock() const;
+ nonvirt ULONG CbSize() const;
+ nonvirt VOID Free();
+ nonvirt TIPERROR Realloc(ULONG cbSizeNew);
+ nonvirt BOOL IsValid() const;
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt ULONG GetSize() const;
+
+ // Locking methods
+ nonvirt VOID Lock();
+ nonvirt VOID Unlock();
+ nonvirt BOOL IsLocked() const;
+
+ // Debug/test methods
+#if ID_DEBUG
+ nonvirt VOID DebShowState(UINT uLevel) const;
+#else
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+#endif
+
+private:
+ // 32bit pointer to managed huge memblock.
+ BYTE *m_qbMemBlock;
+ ULONG m_cbSize;
+
+ // Since blocks are managed separately in we lock them at
+ // block level (unlike the 16bit implementation).
+ //
+ UINT m_cLocks;
+
+ // Sheapshaking now means: copy memblock to new block and
+ // placing old memblock on queue waiting to be freed.
+ //
+};
+
+// *******************************
+// *** BLKDESC32 inline methods ***
+// *******************************
+//
+
+/***
+*PUBLIC BLKDESC32::Lock
+*Purpose:
+* Lock the block.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID BLKDESC32::Lock()
+{
+ DebAssert(IsValid(), "BLKDESC32::Lock: Block invalid.");
+
+ m_cLocks++;
+}
+
+
+/***
+*PUBLIC BLKDESC32::Unlock
+*Purpose:
+* Unlock the block.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID BLKDESC32::Unlock()
+{
+ DebAssert(IsValid(), "BLKDESC32::Unlock: Block invalid.");
+
+ DebAssert(m_cLocks > 0, "BLKDESC32::Unlock: underflow.");
+ m_cLocks--;
+}
+
+
+/***
+*PUBLIC BLKDESC32::IsLocked
+*Purpose:
+* Tests if block is locked.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* TRUE if block is locked -- i.e. at least one lock.
+***********************************************************************/
+
+inline BOOL BLKDESC32::IsLocked() const
+{
+ DebAssert(IsValid(), "BLKDESC32::IsLocked: Block invalid.");
+
+ return (BOOL)(m_cLocks > 0);
+}
+
+
+/***
+*PUBLIC BLKDESC32::IsValid - Tests if block is valid.
+*Purpose:
+* Tests if block is valid. Note that a 0-size block is valid,
+* however its m_qbMemBlock must be non-NULL to be valid (i.e. a
+* 0-size block does have an entry in the heap -- it just happens
+* to be of length 0).
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns TRUE if block valid (i.e. m_qbMemBlock != NULL), else FALSE.
+*
+***********************************************************************/
+
+inline BOOL BLKDESC32::IsValid() const
+{
+ return (m_qbMemBlock != NULL);
+}
+
+
+/***
+*PUBLIC BLKDESC32::CbSize - size of block accessor (get).
+*Purpose:
+* Returns size of block.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline ULONG BLKDESC32::CbSize() const
+{
+ DebAssert(IsValid(), "BLKDESC32::cbSize: Block invalid.");
+ return m_cbSize;
+}
+
+
+/***
+*PUBLIC BLKDESC32::QtrOfBlock - returns block address.
+*Purpose:
+* Returns pointer to logical memblock.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline BYTE *BLKDESC32::QtrOfBlock() const
+{
+ DebAssert(IsValid(), "BLKDESC32::QtrOfBlock: Block invalid.");
+
+ return m_qbMemBlock;
+}
+
+
+#endif // ! BLKDESC32_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/blkmgr.cxx b/private/oleauto/src/typelib/blkmgr.cxx
new file mode 100644
index 000000000..2c7927296
--- /dev/null
+++ b/private/oleauto/src/typelib/blkmgr.cxx
@@ -0,0 +1,1385 @@
+/***
+*blkmgr.cxx - Block Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The block manager provides memory management services for a
+* a contiguous block of memory allocated from the compile-time
+* heap. It manages sub-blocks ("chunks") and supports compaction.
+* See \silver\doc\ic\blkmgr.doc for more information.
+*
+*Revision History:
+*
+* 30-Jan-90 ilanc: Created.
+* 14-Feb-91 ilanc: Private member m_hblock becomes m_blkdesc.
+* hheap_mgr --> sheapmgr
+* 07-Mar-91 ilanc: Added IsValid() method.
+* 19-Mar-91 ilanc: Fixed AllocChunk() and FreeChunk().
+* Chunk size is always at least sizeof(FREE_CHUNK).
+* 21-Mar-91 ilanc: Made some stuff inline.
+* 27-Mar-91 ilanc: Read and write blocks.
+* 26-Jul-91 t-toddw: added Trim() method.
+* 07-Aug-91 t-toddw: compaction routines now use the actual chunk size
+* and m_hfreechunk handling is much cleaner.
+* 09-Aug-91 t-toddw: USHORT Trim() becomes UINT Trim().
+* Updated to use CbSizeChunkTrue() member function.
+* 16-Aug-91 t-toddw: Moved con/destructor to blkmgr.hxx.
+* Cleaned up various things as per alanc's review.
+* 21-Aug-91 ilanc: No more m_psheapmgr. On 16-bit assume SHEAP_MGR
+* at ofs 0 in segment. On 32-bit no need for
+* SHEAP_MGR. Need diff version for 32-bit. This
+* is 16-bit version.
+* 07-Oct-91 stevenl: StartCompact() now calls MEMFREE on m_pbBlkCopy
+* if it can't allocate m_pbBitmap.
+*
+* 25-Mar-92 ilanc: Rm'ed static Create (no need).
+* 30-Mar-92 ilanc: Added freelist coalescing.
+* 13-Apr-92 ilanc: Round up chunk alloc size to 4-byte multiple,
+* this makes freechunk easier (nothing
+* need leak).
+* 07-Sep-93 w-jeffc: MapChunk now correctly leaves pointer to new
+* chunk after copy
+*
+*Implementation Notes:
+* Block manager can manage no more than 64K memory blocks.
+* Handles to chunks are 16-bit values.
+* This means that blocks can't grow beyond 64K.
+*
+* Each block manager has a BLK_DESC which owns a memory block
+* which in turn is managed by the SHEAP_MGR.
+* Each block is managed inside the memory block of a BLK_DESC.
+*
+* On segmented architectures (os2 1.x, Win16):
+* The BLK_MGR object is itself also allocated
+* in the "reserved" section of a SHEAP_MGR,
+* thus the SHEAP_MGR/BLK_DESC/BLK_MGR must all fit inside a single
+* segment.
+*
+* On win32: the block manager is allocated in a single 4Mb
+* region of virtual memory. All the BLK_MGRs of a single SHEAP_MGR
+* must fit in that region. Note in addition that block realloc
+* might cause *much* movement -- since all other blocks might
+* be affected.
+*
+* On Mac: as in segmented, each bklmgr obj is alloced in the
+* "reserved" section fo a SHEAP_MGR which maintains a handle
+* to a relocatable mac memblock within which each managed
+* blkdesc/blkmgr is suballocated.
+*
+* Chunks may be allocated and deallocated by the block manager.
+* A handle is returned (HCHUNK) that is guaranteed never to
+* change as long as the block isn't compacted. Note that
+* the handle is actually just an offset into the block (this
+* allows handle dereference to be fast).
+*
+* The block manager maintains a freechunk list from which it
+* attempts to allocate chunks. When a chunk is freed it is
+* returned to the freelist -- freechunks are of a minimum
+* size of 4 bytes (they contains their size and a next link).
+* No memory leaks occur cos chunk allocs are always multiples
+* of FREE_CHUNK size.
+*
+* Free chunks are coalesced in the following manner:
+* the freelist is maintained in ascending order by position.
+* When a freechunk is added to the list it is placed in the
+* appropriate position -- however, if it transpires that the
+* previous freechunk (if there is one) ends exactly before
+* the new freechunk, the new chunk is coalesced to the previous
+* by modifying the previous's header. Likewise if there is
+* a next freechunk. So in the best case, the newfreechunk
+* can coalesce two old freechunks. In the worst case, no
+* coalescing is done at all.
+*
+*****************************************************************************/
+
+#define BLKMGR_VTABLE // export blk mgr vtable
+
+#include "silver.hxx"
+#include "typelib.hxx"
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "mem.hxx"
+#include "sheapmgr.hxx"
+#include "blkmgr.hxx"
+#include "stream.hxx"
+#include "xstring.h"
+
+#pragma hdrstop(RTPCHNAME)
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleBlkmgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleBlkmgrCxx
+#else
+static char szBlkmgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szBlkmgrCxx
+#endif
+#endif //ID_DEBUG
+
+
+
+
+// This constant is used for the initial size of an allocated block.
+//
+// const UINT BM_cbSizeInitial = 0x100;
+const UINT BM_cbSizeInitial = 0x020;
+// const UINT BM_cbSizeInitial = 0x080;
+
+/*******************
+*
+* static, public
+* TIPERROR BLK_MGR::CreateStandalone(BLK_MGR **ppbm)
+*
+* Purpose:
+* This may be called by clients who need a single block manager,
+* and don't care what segment it is allocated in.
+*
+* NOTE: Clients who use this function must be sure to release
+* the block manager by calling BLK_MGR::FreeStandalone(pbm)
+*
+* A BLK_MGR must be intialized by a SHEAPMGR, and both of these
+* objects must be located in the same segment.
+*
+* Exit:
+* *ppbm points to a newly constructed and initialized block manager.
+*
+*************************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR BLK_MGR::CreateStandalone(BLK_MGR **ppbm, BOOL fRoundUp)
+{
+ TIPERROR err = TIPERR_None;
+ SHEAP_MGR *psheapmgr = NULL;
+ BLK_MGR *pbm = NULL;
+
+ IfErrGo( SHEAP_MGR::Create(&psheapmgr,
+ sizeof(SHEAP_MGR) + sizeof(BLK_MGR) ));
+ pbm = (BLK_MGR *) (psheapmgr +1);
+
+ pbm = new(pbm) BLK_MGR;
+
+ IfErrGo( pbm->Init(psheapmgr, TRUE, fRoundUp));
+ *ppbm = pbm;
+ return TIPERR_None;
+
+Error:
+ if (psheapmgr) {
+ delete psheapmgr;
+ }
+ return err;
+}
+#pragma code_seg()
+
+/***
+* void BLK_MGR::FreeStandalone(BLK_MGR *pbm)
+*
+* Purpose:
+* This frees both the dyn block manager itself and the sheapmgr
+* associated with it.
+*
+*********************************************************************/
+#pragma code_seg(CS_INIT)
+void BLK_MGR::FreeStandalone(BLK_MGR *pbm)
+{
+ SHEAP_MGR *psheapmgr;
+
+ if (!pbm) {
+ return;
+ }
+
+ psheapmgr = ((SHEAP_MGR *) pbm) -1;
+
+ pbm->Free();
+ delete psheapmgr;
+}
+#pragma code_seg()
+
+
+
+// Class methods
+//
+
+/***
+*PUBLIC BLK_MGR::BLK_MGR - constructor
+*Purpose:
+* Note that Init() must still be called before
+* this block manager can be used.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#if OE_MAC
+#pragma code_seg(CS_INIT)
+#endif
+BLK_MGR::BLK_MGR()
+{
+ m_pbBitmap = m_pbBlkCopy = NULL;
+ m_fCoalesce = TRUE;
+ m_fRoundUp = TRUE;
+}
+#if OE_MAC
+#pragma code_seg()
+#endif
+
+/***
+*PUBLIC BLK_MGR::ConsChunkToFreeList - Cons a chunk to free list.
+*Purpose:
+* Cons a chunk to the free list. This is fast and is useful
+* for non-coalescing BLK_MGRs.
+*
+*Entry:
+* hchunk handle to chunk to cons to list.
+* cbSize its size.
+*
+*Exit:
+* No errors. Side effects freelisthead.
+*
+***********************************************************************/
+#if OE_MAC
+#pragma code_seg(CS_INIT)
+#endif
+VOID BLK_MGR::ConsChunkToFreeList(HCHUNK hchunk, UINT cbSize)
+{
+ FREE_CHUNK *qfreechunk;
+
+ DebAssert(cbSize >= sizeof(FREE_CHUNK), "bad chunk size.");
+
+ qfreechunk = (FREE_CHUNK *)QtrOfHandle(hchunk);
+ qfreechunk->m_cbSize = (USHORT)cbSize;
+ qfreechunk->m_hfreechunkNext = m_hfreechunk;
+ m_hfreechunk = (sHFREE_CHUNK)hchunk;
+}
+#if OE_MAC
+#pragma code_seg()
+#endif
+
+
+
+/***
+*PUBLIC BLK_MGR::Init - initialize the block manager
+*Purpose:
+* Initializes the block manager. Assigns a heap manager.
+* Gets a block from the heap manager and initializes it.
+*
+* CONSIDER: having a discrete bit to indicate compaction phase
+* as opposed to testing the bitmap and block copy pointers.
+*
+* NOTE: Can't be called during compaction.
+*
+*Implementation Notes:
+* Calls ReInit() to initialize private members to consistent state.
+* (Which in particular inits m_hfreechunk to HCHUNK_Nil).
+*
+*Entry:
+* psheapmgr - pointer to a heap manager object.
+*
+*Exit:
+* TIPERROR (OOM)
+*
+***********************************************************************/
+#if OE_MAC
+#pragma code_seg(CS_INIT)
+#endif
+TIPERROR BLK_MGR::Init(SHEAP_MGR *psheapmgr, BOOL fCoalesce, BOOL fRoundUp)
+{
+ TIPERROR err;
+
+ DebAssert(IsValid() == FALSE,
+ "BLK_MGR::Init: whoops! block manager should be invalid.");
+
+ // Do they want to coalesce?
+ m_fCoalesce = fCoalesce;
+ m_fRoundUp = FALSE;
+
+ // Initialize block descriptor with initial size.
+ if (!(err = m_blkdesc.Init(psheapmgr, BM_cbSizeInitial))) {
+ ReInit();
+
+ DebAssert(m_hfreechunk == HCHUNK_Nil,
+ "BLK_MGR::Init: m_hfreechunk not initialized.");
+
+ DebAssert((m_pbBlkCopy == NULL) && (m_pbBitmap == NULL),
+ "BLK_MGR::Init: m_pbBlkCopy/m_pbBitmap not initialized.");
+
+ DebAssert(IsValid(), "BLK_MGR::Init: invalid block.");
+
+ // init freechunk list.
+ ConsChunkToFreeList((HCHUNK)0, BM_cbSizeInitial);
+ return TIPERR_None;
+ }
+ else
+ return err;
+}
+#if OE_MAC
+#pragma code_seg()
+#endif
+
+/***
+*PRIVATE BLK_MGR::AddChunkToFreeList - Adds a chunk to the freelist.
+*Purpose:
+* Add a chunk to the free list.
+*
+*Implementation Notes:
+* Calculates how many bytes will be left after cbSizeChunk
+* bytes have been allocated from the freechunk. Attempts
+* to create a freechunk from those leftover bytes and add
+* then to the freelist.
+*
+* Can only creates freechunks of min size 4. Otherwise they
+* leak.
+*
+* If they want to coalesce then:
+* Coalesces freelist by maintaining list in ascending order
+* by position and then on insertion checks to see if
+* adjacent freechunks are contiguous. If so, coalesces.
+* else
+* just cons chunk to front of list.
+*
+*Entry:
+* hchunk - chunk handle to add to free list (IN).
+* cbSizeChunk - chunk size (IN).
+*
+*Exit:
+* Modifies free chunk list to reflect allocated chunk.
+*
+*Errors:
+* No errors.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID BLK_MGR::AddChunkToFreeList(HCHUNK hchunkNew, UINT cbSizeChunk)
+{
+ FREE_CHUNK *qfreechunkCur;
+ FREE_CHUNK *qfreechunkNew;
+ FREE_CHUNK *qfreechunkPrev;
+ HFREE_CHUNK hfreechunkCur, hfreechunkPrev;
+ BOOL fAdded = FALSE;
+
+ DebAssert(cbSizeChunk >= sizeof(FREE_CHUNK), "bad chunksize.");
+
+ if (!m_fCoalesce) {
+ ConsChunkToFreeList(hchunkNew, cbSizeChunk);
+ DebCheckState(0);
+ return;
+ }
+
+ qfreechunkNew = (FREE_CHUNK *)QtrOfHandle(hchunkNew);
+
+ // We can and must set the size field immediately here
+ // since we are assured that the new freechunk is at least two bytes.
+ //
+ qfreechunkNew->m_cbSize = (USHORT)cbSizeChunk;
+
+ // listhead
+ hfreechunkCur = m_hfreechunk;
+ hfreechunkPrev = (HFREE_CHUNK)HCHUNK_Nil;
+
+ // Insert chunk into ordered freelist.
+ while (hfreechunkCur != (HFREE_CHUNK)HCHUNK_Nil) {
+
+ DebAssert((UINT)hchunkNew != (UINT)hfreechunkCur, "bad free list.");
+
+ // NOTE TO SELF: cast handles and compare values.
+ // Have we found the right place?
+ //
+ if ((UINT)hchunkNew < (UINT)hfreechunkCur) {
+
+ // Now let's see if we can coalesce with previous free chunk.
+ if (hfreechunkPrev != HCHUNK_Nil) {
+ qfreechunkPrev = (FREE_CHUNK *)QtrOfHandle((HCHUNK)hfreechunkPrev);
+ if (hfreechunkPrev + (UINT)qfreechunkPrev->m_cbSize == hchunkNew) {
+ // yes we can...
+ qfreechunkPrev->m_cbSize += (USHORT)cbSizeChunk;
+ qfreechunkNew = qfreechunkPrev;
+ }
+ else {
+ // no, we can't coalesce with prev freechunk,
+ // so we attempt to create a new separate freechunk.
+ // We know chunk is of sufficient size to be a freechunk,
+ // so no need to leak.
+ // Init and link in new freechunk to free list.
+ // it might end up getting coalesced with hchunkCur
+ //
+ qfreechunkPrev->m_hfreechunkNext = (sHFREE_CHUNK)hchunkNew;
+ qfreechunkNew->m_hfreechunkNext = (sHFREE_CHUNK)hfreechunkCur;
+
+ } // of else
+ } // of if
+ else {
+ // We're before every other chunk in the free list, so add in
+ // at the head.
+ DebAssert(hchunkNew < m_hfreechunk, "free list not sorted");
+
+ m_hfreechunk = hchunkNew;
+ qfreechunkNew->m_hfreechunkNext = (sHFREE_CHUNK)hfreechunkCur;
+ }
+
+ // Now let's see if we can coalesce qfreechunkNew
+ // with next free chunk (referenced by hfreechunkCur).
+ // Note: that qfreechunkNew either references the new
+ // freechunk which wasn't coalesced or the prev freechunk
+ // which has been coalesced with the new freechunk.
+ //
+ qfreechunkCur = (FREE_CHUNK *)QtrOfHandle((HCHUNK)hfreechunkCur);
+ if (((BYTE *)qfreechunkNew + qfreechunkNew->m_cbSize) ==
+ (BYTE *)qfreechunkCur) {
+ // increment size field;
+ qfreechunkNew->m_cbSize += qfreechunkCur->m_cbSize;
+
+ DebAssert(qfreechunkNew->m_cbSize >= sizeof(FREE_CHUNK),
+ "whoops! bad freechunk.");
+
+ // and link.
+ qfreechunkNew->m_hfreechunkNext = qfreechunkCur->m_hfreechunkNext;
+ }
+ else {
+ // can't coalesce, so link to next.
+ // we know chunk is big enough to be a FREE_CHUNK.
+ //
+ qfreechunkNew->m_hfreechunkNext = (sHFREE_CHUNK)hfreechunkCur;
+ }
+
+ fAdded = TRUE;
+ break; // break out of while iteration.
+ } // of if
+
+ DebAssert(fAdded == FALSE, "should have broken out.");
+
+
+ // save previous.
+ hfreechunkPrev = hfreechunkCur;
+
+ // get next.
+ hfreechunkCur =
+ ((FREE_CHUNK *)QtrOfHandle(hfreechunkCur))->m_hfreechunkNext;
+
+ // Need to special-case coalescing this new freechunk with
+ // the *last* freechunk on the list.
+ //
+ if (hfreechunkCur == HCHUNK_Nil) {
+ qfreechunkPrev = (FREE_CHUNK *)QtrOfHandle((HCHUNK)hfreechunkPrev);
+ if (hfreechunkPrev + (UINT)qfreechunkPrev->m_cbSize == hchunkNew) {
+ // yes we can...
+ qfreechunkPrev->m_cbSize += (USHORT)cbSizeChunk;
+ fAdded = TRUE;
+ }
+ // we should break out of the loop since hfreechunkCur == Nil
+ }
+ } // of while
+
+ // We either got here cos we broke out of the while loop
+ // after having added the chunk to the free list...
+ // or we need to append to the end of the possibly empty freelist.
+ //
+ if (fAdded == FALSE) {
+
+ DebAssert(((m_hfreechunk == HCHUNK_Nil) &&
+ (hfreechunkPrev == HCHUNK_Nil)) ||
+ (hchunkNew > hfreechunkPrev), "bad freelist.");
+
+ // We know chunk is big enough to be a FREE_CHUNK,
+ // so append to freelist.
+ //
+ qfreechunkNew->m_cbSize = (USHORT)cbSizeChunk;
+ qfreechunkNew->m_hfreechunkNext = (sHFREE_CHUNK)HCHUNK_Nil;
+
+ if (hfreechunkPrev != HCHUNK_Nil) {
+ qfreechunkPrev = (FREE_CHUNK *)QtrOfHandle((HCHUNK)hfreechunkPrev);
+ qfreechunkPrev->m_hfreechunkNext = hchunkNew;
+ }
+ else {
+ m_hfreechunk = (sHFREE_CHUNK)hchunkNew;
+ }
+ } // end of if fAdded
+ DebCheckState(0);
+ return;
+}
+#pragma code_seg()
+
+/***
+*PRIVATE BLK_MGR::HfreechunkOfCbSize - Get a freechunk of sufficient size.
+*Purpose:
+* Get freechunk of sufficient size.
+*
+*Implementation Notes:
+* Searches list for freechunk of sufficient size, removes it
+* from freelist if found and returns the leftover to freelist
+* by splicing the leftover in place.
+*
+*Entry:
+* cbSizeChunk size they want (IN)
+*
+*Exit:
+* HFREE_CHUNK of sufficiently large chunk. No errors.
+* HCHUNK_Nil if no such.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+HFREE_CHUNK BLK_MGR::HfreechunkOfCbSize(UINT cbSizeChunk)
+{
+ HFREE_CHUNK hfreechunk, hfreechunkPrev, hfreechunkLeftover;
+ FREE_CHUNK *qfreechunk, *qfreechunkPrev, *qfreechunkLeftover;
+ sHFREE_CHUNK *qhfreechunk;
+ UINT cbSizeLeftover;
+
+ cbSizeChunk = CbSizeChunkTrue(cbSizeChunk);
+
+ hfreechunk = m_hfreechunk;
+ hfreechunkPrev = (HFREE_CHUNK)HCHUNK_Nil;
+
+ // Iterate over free chunk list for a sufficiently large chunk.
+ while ((hfreechunk != HCHUNK_Nil) &&
+ ((qfreechunk =
+ (FREE_CHUNK *)QtrOfHandle(hfreechunk))->m_cbSize <
+ (USHORT)cbSizeChunk)) {
+
+ // Save previous
+ hfreechunkPrev = hfreechunk;
+
+ // Get next
+ hfreechunk = qfreechunk->m_hfreechunkNext;
+ }
+
+ // If a freechunk found then remove it from list
+ // and if OB then splice in leftover
+ // else splice in leftover if large enough.
+ //
+ if (hfreechunk != HCHUNK_Nil) {
+
+ DebAssert(QtrOfHandle(hfreechunk) == (BYTE *)qfreechunk,
+ "bad list.");
+
+ // Since we are allocating the first part of a freechunk
+ // (and possibly all of it), we can't possibly be
+ // coalescing -- so we can just splice the leftover directly into
+ // the list.
+ //
+ cbSizeLeftover = qfreechunk->m_cbSize - (USHORT)cbSizeChunk;
+
+#if ID_DEBUG
+ // We assert that there is either no leftover at all or
+ // that it's enough to be a FREE_CHUNK -- since we always
+ // allocate in multiples of sizeof(FREE_CHUNK) this must be the case.
+ //
+ if (m_fRoundUp) {
+ DebAssert((cbSizeLeftover % sizeof(FREE_CHUNK)) == 0,
+ "should be no leftover or at least FREE_CHUNK big.");
+ }
+ // If not fRoundUp we can leak leftovers of size < sizeof(FREE_CHUNK)
+ // Note: nothing to test here since we test below anyway...
+
+#endif // ID_DEBUG
+
+ // *possible* new freechunk of size cbSizeLeftover.
+ hfreechunkLeftover = (HFREE_CHUNK)((UINT)hfreechunk+cbSizeChunk);
+
+ // Set up leftover if big enough.
+ if (cbSizeLeftover >= sizeof(FREE_CHUNK)) {
+ qfreechunkLeftover =
+ (FREE_CHUNK *)QtrOfHandle((HCHUNK)hfreechunkLeftover);
+ qfreechunkLeftover->m_hfreechunkNext = qfreechunk->m_hfreechunkNext;
+ qfreechunkLeftover->m_cbSize = (USHORT)cbSizeLeftover;
+ }
+
+ // Set up freechunk handle to modify... either list head
+ // or previous list elem.
+ //
+ if (hfreechunkPrev != HCHUNK_Nil) {
+ qfreechunkPrev = (FREE_CHUNK *)QtrOfHandle((HCHUNK)hfreechunkPrev);
+
+ qhfreechunk = &qfreechunkPrev->m_hfreechunkNext;
+
+ }
+ else {
+ // We're removing the first freechunk in list.
+ DebAssert(m_hfreechunk == hfreechunk, "bad list.");
+
+ qhfreechunk = &m_hfreechunk;
+ }
+
+ // Link in the leftover if large enough.
+ *qhfreechunk = (sHFREE_CHUNK)(cbSizeLeftover < sizeof(FREE_CHUNK) ?
+ qfreechunk->m_hfreechunkNext :
+ hfreechunkLeftover);
+ } // if (hfreechunk != HCHUNK_Nil)
+
+ return hfreechunk;
+}
+#pragma code_seg()
+
+/***
+*PRIVATE BLK_MGR::AllocChunk2 - allocates a chunk in block.
+*Purpose:
+* Allocates a contiguous chunk in block of cbSize bytes.
+* Chunk is allocated from free list with a first fit strategy.
+* (DAK says best fit not worth it).
+*
+* If no chunk is sufficiently large then the block is grown
+* by deferring to the heap manager.
+* Note that an even number of bytes is always returned.
+*
+* NOTE: Can't be called during compaction.
+* CONSIDER: adding non-virtual methods to FREE_CHUNK
+* to do free chunk list manipulation.
+*
+*
+*Implementation Notes:
+* Attempts to find a large-enough chunk on the free chunk list,
+* if none, asks heap mgr to realloc the block. Asserts that
+* the realloced block is large enough to accomodate this chunk
+* request. Simply calls itself recursively to complete the
+* request. Hence asserts that only *one* recursive call can
+* be made.
+* If there is a large-enough free chunk we just use it directly.
+*
+* NOTE: return OOM if no chunk large enough on free list and
+* block is locked.
+*
+* How much to grow block by? Right now: max of initial block
+* and requested chunk size
+*
+*Entry:
+* phchunk - pointer to chunk handle (OUT).
+* cbSizeChunk - count of bytes to allocate (IN).
+* cDepth - recursive call depth (IN).
+*
+*Exit:
+* Returns handle to allocated chunk in block. Reallocs block
+* if not large enough to accomodate request. Modifies free chunk
+* list to reflect allocated chunk.
+*
+*Errors:
+* TIPERROR (OOM)
+* Returns OOM if cbSizeChunk > USHRT_MAX.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR BLK_MGR::AllocChunk2(HCHUNK *phchunk, UINT cbSizeChunk, UINT cDepth)
+{
+ HFREE_CHUNK hfreechunk;
+ UINT cbSizeBlk; // Current block size.
+ ULONG cbSizeBlkNew2; // Size of new block.
+ UINT cbSizeBlkNew; // Size of new block.
+ UINT cbSizeFreeChunkNew; // Size of new free chunk.
+ TIPERROR err;
+
+ DebCheckState(0);
+
+ DebAssert(phchunk != NULL, "BLK_MGR::AllocChunk2: bad ptr.");
+
+ DebAssert((m_pbBlkCopy == NULL) && (m_pbBitmap == NULL),
+ "BLK_MGR::AllocChunk2: Compaction underway.");
+
+
+ cbSizeChunk = CbSizeChunkTrue(cbSizeChunk); // get physical chunk size
+
+ if (cbSizeChunk > USHRT_MAX) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // Iterate over free chunk list for a sufficiently large chunk.
+ hfreechunk = HfreechunkOfCbSize(cbSizeChunk);
+
+ if (hfreechunk == HCHUNK_Nil) {
+
+ DebAssert(cDepth == 0, "BLK_MGR::AllocChunk2: reentered twice.");
+
+ // Couldn't find big enough chunk.
+ // If we're locked return an OOM
+ // else ask the heap manager to realloc the block.
+ //
+ if (IsLocked()) {
+ return TIPERR_OutOfMemory;
+ }
+
+ cbSizeBlk = CbSize();
+ cbSizeBlkNew2 = (ULONG)cbSizeBlk +
+ max(max(cbSizeChunk, BM_cbSizeInitial), sizeof(FREE_CHUNK));
+
+ if (cbSizeBlkNew2 > USHRT_MAX || cbSizeBlkNew2 == 0) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // Alloc some more memory.
+ IfErrRet(m_blkdesc.Realloc((UINT)cbSizeBlkNew2));
+
+ // Now need to link in the new memory to the free list
+ // and call myself recursively. The recursive call
+ // is a tail-call and as such could be converted
+ // to iteration automatically.
+ // The new free chunk will be of size (newsize-oldsize) and
+ // its location in the new block is simply at offset oldsize
+ // in the new block.
+ // Add it onto the free list and make the recursive call.
+ // Since we've added a sufficiently large chunk, this
+ // recursive call *must* succeed.
+ //
+ cbSizeBlkNew = CbSize();
+ cbSizeFreeChunkNew = cbSizeBlkNew-cbSizeBlk;
+
+ // New chunk must be big enough to be a FREE_CHUNK.
+ DebAssert(cbSizeFreeChunkNew >= sizeof(FREE_CHUNK),
+ "BLK_MGR::AllocChunk2: new block not large enough after Realloc.");
+
+ // New chunk must be big enough to fulfill this request.
+ DebAssert(cbSizeFreeChunkNew >= cbSizeChunk,
+ "BLK_MGR::AllocChunk2: new block not large enough after Realloc.");
+
+ // Add it to freelist.
+ AddChunkToFreeList((HCHUNK)cbSizeBlk, cbSizeFreeChunkNew);
+
+ // Now return the result of the recursive call.
+ return AllocChunk2(phchunk, cbSizeChunk, cDepth+1);
+ }
+ else {
+#if ID_DEBUG
+ // If we didn't have to allocate any memory for this block, realloc
+ // it to its current size to guarentee that it gets moved.
+ //
+ if (cDepth == 0) {
+ IfErrRet(m_blkdesc.Realloc(CbSize()));
+ }
+#endif // ID_DEBUG
+
+ // hfreechunk is guaranteed to be large enough, so we just
+ // use it.
+ //
+ DebAssert(
+ ((FREE_CHUNK *)QtrOfHandle(hfreechunk))->m_cbSize >= (USHORT)cbSizeChunk,
+ "bad free chunk.");
+
+ *phchunk = (HCHUNK)hfreechunk;
+ DebCheckHandle(*phchunk);
+ return TIPERR_None;
+ }
+}
+#pragma code_seg()
+
+
+
+
+
+
+
+
+
+/***
+*PUBLIC BLK_MGR::FreeChunk - Frees a chunk in block.
+*Purpose:
+* Frees a chunk of a given size in a block. Returns block to
+* to free chunk list by consing onto front of list.
+*
+*Implementation Notes:
+* Note that the block manager doesn't remember the size of its chunks
+* -- this is the client's responsibility. No checking is done here to
+* ensure that chunks are freed with an accurate size; the size specified
+* by the client is rounded up appropriately to obtain the actual size
+* reserved by the chunk allocator, however. This does not prevent all
+* memory leaks -- freed chunks are not merged into adjacent free chunks.
+* This can produce "creeping fragmentation" that can only be cleaned out
+* by compacting the block.
+* NOTE: that when freechunk coalescing is done this problem will
+* be alleviated.
+*
+* NOTE: Can't be called during compaction.
+* NOTE: it's a bug if client attempts to free a locked chunk,
+* so assert HOWEVER since locking a chunk locks its block
+* this would mean we couldn't let them free "unlocked"
+* chunks. So only enable this assertion if and when
+* we implement true chunk-level locking.
+*
+*Entry:
+* hchunk - handle to chunk to free.
+* cbSizeChunk - size of chunk to free.
+*
+*Exit:
+* m_hfreechunk is updated. No errors.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID BLK_MGR::FreeChunk(HCHUNK hchunk, UINT cbSizeChunk)
+{
+ DebAssert(hchunk != HCHUNK_Nil, "BLK_MGR::FreeChunk: Nil handle.");
+
+ DebAssert(IsValid(), "BLK_MGR::FreeChunk: invalid block.");
+
+ DebAssert((m_pbBlkCopy == NULL) && (m_pbBitmap == NULL),
+ "BLK_MGR::FreeChunk: Compaction underway.");
+
+ // get actual chunk size
+ cbSizeChunk = CbSizeChunkTrue(cbSizeChunk);
+
+ // Add chunk to free list.
+ AddChunkToFreeList(hchunk, cbSizeChunk);
+}
+#pragma code_seg()
+
+/***
+*PUBLIC BLK_MGR::Trim - Shrinks a block to purge trailing free areas.
+*Purpose:
+* Attempts to shrink the block to reclaim free memory at the end of it.
+* A Trim immediately after an EndCompact will reclaim all free memory
+* in the block, as the current implementation leaves all free memory at
+* the end of the block.
+*
+*Implementation Notes:
+* Calls Trim/1 until nothing more trimmed.
+*
+*Entry:
+* None
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR BLK_MGR::Trim()
+{
+ UINT cbReclaimed = 0;
+ TIPERROR err;
+
+ // Trim the block
+ do {
+ IfErrRet(Trim(&cbReclaimed));
+ } while (cbReclaimed != 0);
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE BLK_MGR::Trim - Shrinks a block to purge trailing free areas.
+*Purpose:
+* Attempts to shrink the block to reclaim free memory at the end of it.
+* A Trim immediately after an EndCompact will reclaim all free memory
+* in the block, as the current implementation leaves all free memory at
+* the end of the block.
+*
+*Implementation Notes:
+* NOTE: Can't be called during compaction.
+* WARNING: Trim will only reclaim one free list item! Since the free list
+* is not optimized, Trim will usually have to be called more than
+* once. When Trim has exhausted its possibilities it will return zero
+* bytes freed.
+* NOTE: Trim is intended as a client-directed exception handler for heap
+* allocation, and should only be needed for very large heaps. Because
+* block shrinking can cause other blocks in the heap to be moved,
+* Trim should not be relied on as a fast routine.
+* NOTE: returns OOM if block locked.
+*
+*Entry:
+* puCbReclaimed - Produces the number of bytes
+* that were reclaimed, or zero if the block
+* could not be shrunk (OUT).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR BLK_MGR::Trim(UINT *puCbReclaimed)
+{
+ USHORT cb, cbBytesFreed = 0;
+ FREE_CHUNK freechunkDummy; // dummy chunk to simplify list code
+ FREE_CHUNK *qfreechunk;
+ FREE_CHUNK *qfreechunk2; // scratch pointers for list walking
+ TIPERROR err = TIPERR_None;
+
+ // If this segment is locked then do not trim (return TIPERROR_None)
+ if (IsLocked()) {
+ return TIPERR_None;
+ }
+
+#if ID_DEBUG
+ // For win16 we do not put a real lock on the run-time segment. But we
+ // put a debug lock, to prevent memory movement. To be able to save
+ // the blockmgr while the module is in runnable state we check for the
+ // debug lock. If the there is a debug lock we do not trim this block.
+
+#if OE_SEGMENTED
+ DebAssert(!((SHEAP_MGR *)OOB_MAKEP2(this, 0))->DebIsLocked(),
+ " Cannot trim ");
+#endif
+
+#endif
+
+ freechunkDummy.m_hfreechunkNext = m_hfreechunk; // cons a dummy chunk onto list
+ qfreechunk = &freechunkDummy;
+ while (qfreechunk->m_hfreechunkNext != HCHUNK_Nil) {
+ qfreechunk2 = (FREE_CHUNK *)QtrOfHandle(qfreechunk->m_hfreechunkNext);
+
+ // see if this chunk is at the end of the block, and snip it if so
+ cb = CbSizeChunkTrue(qfreechunk2->m_cbSize);
+ if (CbSize() == (UINT)cb + (UINT)qfreechunk->m_hfreechunkNext) {
+ qfreechunk->m_hfreechunkNext = qfreechunk2->m_hfreechunkNext;
+ // Could argue that shrinking a block can't
+ // generate an error -- don't believe this???
+ // No - don't! Realloc-when-shrinking semantics are NOT
+ // defined thus... some implementations might try to
+ // move block elsewhere... or perhaps block is locked
+ // in a multi-threaded system by another thread.
+ //
+
+ // shrink block
+ IfErrRet(m_blkdesc.Realloc(CbSize() - cb));
+ cbBytesFreed = cb;
+ break; // and stop looking
+ }
+ else {
+ qfreechunk = qfreechunk2; // keep looking
+ }
+ }
+ // cdr off dummy to get list
+ m_hfreechunk = freechunkDummy.m_hfreechunkNext;
+
+ *puCbReclaimed = cbBytesFreed; // return # of bytes freed
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_MGR::HszLen - Returns length of the specified string.
+*Purpose:
+* This computes and returns the length of the zero-terminated string
+* specified by hsz. This is almost equivalent to strlen(QtrOfHandle(hsz)),
+* except that the call to strlen could invalidate the result of
+* QtrOfHandle.
+*
+*Implementation Notes:
+* This function does NOT call strlen to do its work.
+*
+*Entry:
+* hsz - The handle to the string.
+*
+*Exit:
+* Total free size.
+*
+***********************************************************************/
+#if !OE_WIN32 //Dead code on Win32
+#pragma code_seg(CS_INIT)
+UINT BLK_MGR::HszLen(HCHUNK hsz) const
+{
+ XSZ qch;
+ UINT cb;
+
+ qch = (XSZ)QtrOfHandle(hsz);
+ for (cb = 0; *qch != '\0'; qch++, cb++);
+ return cb;
+}
+#pragma code_seg()
+#endif //!OE_WIN32
+
+
+
+/***
+*PUBLIC BLK_MGR::Free - Frees the managed block.
+*Purpose:
+* Frees the block managed by this block manager.
+* NOTE: Can't be called during compaction.
+* NOTE: assert that block not locked --
+* in the sheap-level-only-locking implementation this
+* implies that can't have any locks on the sheap at all
+* in order to free a block.
+*
+*Implementation Notes:
+* Defers to blkdesc member.
+* And then reinitializes private state.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None. No errors.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID BLK_MGR::Free()
+{
+ DebAssert(IsValid(), "BLK_MGR::Free: invalid block.");
+
+ DebAssert((m_pbBlkCopy == NULL) && (m_pbBitmap == NULL),
+ "BLK_MGR::Free: Compaction underway.");
+
+ DebAssert(IsLocked() == FALSE, "whoops! block locked.");
+
+ m_blkdesc.Free();
+ ReInit();
+
+ DebAssert(IsValid() == FALSE,
+ "BLK_MGR::Free: whoops! block manager should be invalid.");
+}
+#pragma code_seg()
+
+
+
+
+/***
+*PUBLIC BLK_MGR::Read - Read in instance from stream
+*Purpose:
+* Load previously serialized BLK_MGR into this BLK_MGR.
+* First read in block "meta"-info. In this case, just the
+* free chunk list head (handle).
+* then defer to BLK_DESC for the block contents itself.
+*
+*Entry:
+* pstrm - stream to read data from
+*
+*Exit:
+* TIPERROR
+*
+*Errors:
+* Returns errors generated by STREAM::Read.
+*
+***********************************************************************/
+
+TIPERROR BLK_MGR::Read(STREAM *pstrm)
+{
+ BYTE fCoalesce;
+ TIPERROR err;
+
+ DebAssert((m_pbBlkCopy == NULL) && (m_pbBitmap == NULL),
+ "BLK_MGR::Read: Compaction underway.");
+
+ DebAssert(IsValid(), "BLK_MGR::Read: Block invalid.");
+
+ // Read freechunk list head from serialized rep.
+ IfErrRet(pstrm->ReadUShort(&m_hfreechunk));
+
+ // Read in coalescse freelist state
+ IfErrRet(pstrm->ReadByte(&fCoalesce));
+ m_fCoalesce = (USHORT) fCoalesce;
+
+
+ // Read actual block contents
+ err = m_blkdesc.Read(pstrm);
+
+#if HP_BIGENDIAN
+ if (!err)
+ SwapFreeList(TRUE); // swap back bytes in the free list
+#endif //HP_BIGENDIAN
+
+ return err;
+}
+
+
+/***
+*PUBLIC BLK_MGR::Write - Write out instance to stream
+*Purpose:
+* Serialize the BLK_MGR to a stream.
+*
+*Implementation Notes:
+* First Trim the block.
+* Then write out block "meta"-info. In this case, just the
+* free chunk list head (handle).
+* then defer to BLK_DESC for the block contents itself.
+*
+*Entry:
+* pstrm - stream to write data to
+*
+*Exit:
+* TIPERROR
+*
+*Exceptions:
+* errors returned by STREAM::Write()
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR BLK_MGR::Write(STREAM *pstrm)
+{
+ BYTE fCoalesce;
+ TIPERROR err;
+
+ DebAssert((m_pbBlkCopy == NULL) && (m_pbBitmap == NULL),
+ "BLK_MGR::Write: Compaction underway.");
+
+ DebAssert(IsValid(), "BLK_MGR::Write: Block invalid.");
+
+ // Trim the block
+ IfErrRet(Trim());
+
+ // Write out freechunk list head to stream.
+ IfErrRet(pstrm->WriteUShort(m_hfreechunk));
+
+ // Write out coalescse freelist state.
+ fCoalesce = (BYTE)m_fCoalesce;
+ IfErrRet(pstrm->WriteByte(fCoalesce));
+
+
+#if HP_BIGENDIAN
+ SwapFreeList(FALSE); // swap bytes in the free list
+#endif //HP_BIGENDIAN
+
+ // Write actual block contents
+ err = m_blkdesc.Write(pstrm);
+#if HP_BIGENDIAN
+ SwapFreeList(TRUE); // swap back bytes in the free list
+#endif //HP_BIGENDIAN
+ return err;
+}
+
+
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_MGR::GetSize
+*Purpose:
+* Returns size of block + extra debug shift bytes.
+*
+
+*Entry:
+* None.
+*
+*Exit:
+* UINT : size of block desc.
+*
+***********************************************************************/
+
+UINT BLK_MGR::GetSize() const
+{
+ if (IsValid())
+ return CbSize();
+ else
+ return 0;
+}
+
+
+#if HP_BIGENDIAN
+/***
+*PRIVATE BLK_MGR::SwapFreeList
+*Purpose:
+* Swaps/unswaps the bytes in the free list in a blkmgr
+*
+*Implementation Notes:
+* Iterates down freechunk list, swapping/unswapping all bytes
+*
+*Entry:
+* fSwapFirst == TRUE if we're to swap bytes before looking at them
+* (ie we're un-swapping)
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE )
+VOID BLK_MGR::SwapFreeList(BOOL fSwapFirst)
+{
+ FREE_CHUNK *qfreechunk; // Iterates over free chunks.
+ HFREE_CHUNK hfreechunk;
+
+ // Iterate over free chunk list.
+ hfreechunk = m_hfreechunk;
+ while (hfreechunk != HCHUNK_Nil) {
+ qfreechunk = (FREE_CHUNK *)QtrOfHandle(hfreechunk);
+
+ hfreechunk = qfreechunk->m_hfreechunkNext; // Get next handle
+ // (assuming we're swapping)
+
+ // swap the FREE_CHUNK structure
+ SwapStruct(qfreechunk, FREE_CHUNK_LAYOUT);
+
+ if (fSwapFirst) // if un-swapping, get next unswapped handle
+ hfreechunk = qfreechunk->m_hfreechunkNext;
+
+ }
+}
+#pragma code_seg( )
+#endif //HP_BIGENDIAN
+
+
+#if ID_DEBUG
+/***
+*PUBLIC BLK_MGR::DebShowState - BLK_MGR state
+*Purpose:
+* Show BLK_MGR state
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+
+VOID BLK_MGR::DebShowState(UINT uLevel) const
+{
+ BYTE *pb;
+ UINT i;
+
+ DebPrintf("free chunk handle: %u\n", m_hfreechunk);
+ DebPrintf("block size: %u\n", CbSize());
+
+ if (uLevel == 0) {
+ for (pb = m_blkdesc.QtrOfBlock(), i=0 ; i < CbSize(); i++, pb++) {
+ DebPrintf("%d: %u\n", i, (CHAR)*pb);
+ }
+ }
+
+ if (uLevel == 1) {
+ HFREE_CHUNK hfreechunk = m_hfreechunk;
+ FREE_CHUNK *qfreechunk;
+
+ while (hfreechunk != HCHUNK_Nil) {
+ qfreechunk = (FREE_CHUNK *)QtrOfHandle(hfreechunk);
+ DebPrintf("free chunk: handle=%u, size=%u\n", hfreechunk,
+ qfreechunk->m_cbSize);
+ hfreechunk = qfreechunk->m_hfreechunkNext; // Get next.
+ }
+ }
+}
+
+/***
+*PUBLIC BLK_MGR::DebCheckState - BLK_MGR state
+*Purpose:
+* Check BLK_MGR state
+*
+*Implementation Notes:
+* Walks the free chunk list verifying that the following is true:
+* (1) the free list is not circular; this is determined by counting
+* number of free chunks and if it exceeds cMaxFreeChunkLimit then
+* we assert with "circular free chunk list".
+* (2) all free chunks are trivially valid; that is, their handles are
+* even and they are contained within the block.
+* (3) none of the free chunks overlap.
+* (4) if this is a coalescing BLK_MGR, that
+* handles are monotonically increasing
+*
+* NOTE: assumes (chunk handle == offset into block) implementation.
+* NOTE: assumes a limit of cMaxFreeChunkLimit free chunks per block --
+* this is used as a guard against list circularity. The current
+* 64K limit on blocks means that this should be at least 16384.
+*
+*Entry:
+* uLevel level of checking: 0 - means NOP (unless g_fHeapChk on).
+* 1 - means do it regardless of g_fHeapChk.
+*
+*
+*Exit:
+* Either asserts or returns.
+*
+***********************************************************************/
+
+#if OE_WIN16
+// NOTE: C7 compiler asserts with -Ox
+#pragma optimize("g", off)
+#endif //OE_WIN16
+VOID BLK_MGR::DebCheckState(UINT uLevel) const
+{
+ const UINT cMaxFreeChunkLimit = 20000; // limit on # of free chunks
+ UINT cFree = 0; // count of # of free chunks
+ HFREE_CHUNK hfreechunk, hchunk; // handles for walking free list
+ FREE_CHUNK *qfreechunk, *qfreechunk2; // pointers for walking free list
+
+ // Do they want us to really do something?
+ if (uLevel == 0) {
+ if (g_fHeapChk == FALSE) {
+ return;
+ }
+ }
+
+ DebAssert(IsValid(), "BLK_MGR::DebCheckState: invalid block.");
+
+ // (1) FREE LIST NOT CIRCULAR
+ // (2) FREE CHUNKS TRIVIALLY VALID
+ for (hfreechunk = m_hfreechunk;
+ hfreechunk != HCHUNK_Nil;
+ hfreechunk = qfreechunk->m_hfreechunkNext) // walk the free list
+ {
+ DebAssert(cFree++ < cMaxFreeChunkLimit,
+ "BLK_MGR::DebCheckState: circular free chunk list.");
+
+ DebAssert(0 == (1 & (UINT)hfreechunk),
+ "BLK_MGR::DebCheckState: odd chunk handle.");
+
+ qfreechunk = (FREE_CHUNK *)QtrOfHandle(hfreechunk);
+
+ DebAssert((UINT)hfreechunk+qfreechunk->m_cbSize <= CbSize(),
+ "BLK_MGR::DebCheckState: free chunk outside the block.");
+
+ if (m_fCoalesce) {
+ // ensure monotonically increasing handles.
+ if (qfreechunk->m_hfreechunkNext != HCHUNK_Nil) {
+ DebAssert(qfreechunk->m_hfreechunkNext > hfreechunk,
+ "freelist not sorted.");
+ }
+ }
+ }
+
+ // (3) NO FREE CHUNKS OVERLAP
+ for (hfreechunk = m_hfreechunk;
+ hfreechunk != HCHUNK_Nil;
+ hfreechunk = qfreechunk->m_hfreechunkNext) // walk the free list
+ {
+ qfreechunk = (FREE_CHUNK *)QtrOfHandle(hfreechunk);
+ for (hchunk = qfreechunk->m_hfreechunkNext;
+ hchunk != HCHUNK_Nil;
+ hchunk = qfreechunk2->m_hfreechunkNext) // walk rest of free list
+ {
+ qfreechunk2 = (FREE_CHUNK *)QtrOfHandle(hchunk);
+ DebAssert((ULONG)qfreechunk+qfreechunk->m_cbSize <= (ULONG) qfreechunk2 ||
+ (ULONG)qfreechunk2+qfreechunk2->m_cbSize <= (ULONG) qfreechunk,
+ "BLK_MGR::DebCheckState: two free chunks overlap.");
+ }
+ }
+
+ // CONSIDER: (Ilanc) Be nice t check that the free list is indeed
+ // coalesced at this point.
+}
+#if OE_WIN16
+#pragma optimize("", on)
+#endif //OE_WIN16
+
+// Checks if chunk handle is valid:
+// even and within bounds,
+// and not on free list.
+//
+VOID BLK_MGR::DebCheckHandle(HCHUNK hchunk) const
+{
+ HFREE_CHUNK hfreechunk;
+ FREE_CHUNK *qfreechunk;
+
+ if (m_fRoundUp) {
+ DebAssert(((hchunk & (sizeof(FREE_CHUNK)-1)) == 0) &&
+ (hchunk < CbSize()), "bad handle.");
+ }
+ else {
+ DebAssert(((hchunk & 1) == 0) && (hchunk < CbSize()), "bad handle.");
+ }
+
+ // walk the free list.
+ // Don't bother with free list during compaction... no point.
+ //
+ if ((m_pbBlkCopy == NULL) && (m_pbBitmap == NULL)) {
+ for (hfreechunk = m_hfreechunk;
+ hfreechunk != HCHUNK_Nil;
+ hfreechunk = qfreechunk->m_hfreechunkNext) {
+
+ DebAssert(hchunk != (HCHUNK)hfreechunk,
+ "BLK_MGR::DebCheckHandle: hchunk in freelist.");
+
+ qfreechunk = (FREE_CHUNK *)QtrOfHandle(hfreechunk);
+ }
+ }
+}
+
+
+
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/typelib/blkmgr.hxx b/private/oleauto/src/typelib/blkmgr.hxx
new file mode 100644
index 000000000..7c343bf9a
--- /dev/null
+++ b/private/oleauto/src/typelib/blkmgr.hxx
@@ -0,0 +1,752 @@
+/***
+*blkmgr.hxx - Block Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The block manager provides memory management services for a
+* a contiguous block of memory allocated from the compile-time
+* heap. It manages sub-blocks ("chunks") and supports compaction.
+* See \silver\doc\ic\blkmgr.doc for more information.
+*
+*Revision History:
+*
+* 30-Jan-91 ilanc: Created.
+* 14-Feb-91 ilanc: Private member HBLOCK becomes BLK_DESC
+* 07-Mar-91 ilanc: Added IsValid() method.
+* 07-Mar-91 ilanc: Moved HCHUNK typedef to inc\types.h
+* 21-Mar-91 ilanc: Made some stuff inline and added
+* PtrOfHandle/2 (with addtl offset param).
+* 27-Mar-91 ilanc: Read and Write blocks.
+* 07-Jun-91 ilanc: Ripped exceptions... return TIPERRORs.
+* 29-Jul-91 t-toddw: added Trim() method, fixed a PtrOfHandle comment.
+* 30-Jul-91 ilanc: Fixed Trim() decl syntax error.
+* 09-Aug-91 t-toddw: Trim now returns UINT, Added CbSizeChunkTrue().
+* 21-Aug-91 ilanc: Added MAKESHEAPMGRP macro. Removed m_psheapmgr
+* member.
+* 25-Mar-92 ilanc: Rm'ed static Create (no need).
+* 26-Mar-92 ilanc: Added CbSizeFree().
+* 01-Apr-92 ilanc: Added *optional* coalescing. Default is yes.
+* Init() takes optional 2nd fCoalesce param.
+* 17-Dec-92 w-peterh: reordered data members
+*
+*Implementation Notes:
+*
+*
+*****************************************************************************/
+
+#ifndef BLKMGR_HXX_INCLUDED
+#define BLKMGR_HXX_INCLUDED
+
+#include <limits.h>
+#include "sheapmgr.hxx"
+
+class STREAM; // #include "stream.hxx"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szBLKMGR_HXX)
+#define SZ_FILE_NAME g_szBLKMGR_HXX
+#endif
+
+
+// Macro to convert a segment pointer to a SHEAP_MGR*
+#define MAKESHEAPMGRP \
+ ((SHEAP_MGR *) OOB_MAKEP(OOB_SELECTOROF(this), 0))
+
+
+// Handle to a free chunk in a block. Implemented just as an offset
+// from beginning of block.
+//
+typedef UINT HFREE_CHUNK;
+
+// Packed handle to a free chunk in a block. Implemented just as an offset
+// from beginning of block.
+//
+typedef USHORT sHFREE_CHUNK;
+
+
+// This constant is the size of the bitmap used during compaction.
+//
+extern const UINT BM_cbSizeBitmap ;
+
+// This constant is used for the initial size of an allocated block.
+//
+extern const UINT BM_cbSizeInitial;
+
+//
+// struct: FREE_CHUNK
+// The following struct simply maps the header of a free chunk
+// into two fields: size and next. Each free chunk on the free
+// list is immediately followed by size number of (free) bytes.
+// NOTE: Assumes that sizeof(USHORT)==sizeof(HCHUNK)
+//
+struct FREE_CHUNK {
+ union {
+ USHORT m_cbSize; // Size of free chunk w/o this header.
+ sHCHUNK m_hchunkNew; // Forwarding handle.
+ };
+ sHFREE_CHUNK m_hfreechunkNext; // Handle of next free chunk in list.
+ // HCHUNK_Nil indicates end of list.
+};
+
+#if HP_BIGENDIAN
+#define FREE_CHUNK_LAYOUT "ss" // layout for byte swapping
+#endif //HP_BIGENDIAN
+
+
+#if OE_MAC68K
+#if ID_SWAPPABLE
+#define CS_BLKMGR "Oblkmgr","swappable"
+#else
+#if !OE_WIN32
+#define CS_BLKMGR "Oblkmgr"
+#else //!OE_WIN32
+#define CS_BLKMGR
+#endif //!OE_WIN32
+#endif
+
+#else
+#define CS_BLKMGR
+#endif
+
+/***
+*class BLK_MGR - 'blkmgr': Block manager
+*Purpose:
+* The class implements the block manager. TYPE_DATA and NAM_MGR
+* use the block manager to manage their idnodes and names respectively.
+*
+***********************************************************************/
+
+class BLK_MGR
+{
+ friend class DYN_BLK_MGR;
+public:
+ BLK_MGR();
+ ~BLK_MGR();
+
+ static void FreeStandalone(BLK_MGR *pbm);
+ // non-OB blkmgr clients, e.g. OLE, do not round up by default.
+ static TIPERROR CreateStandalone(BLK_MGR **ppbm, BOOL fRoundUp = FALSE);
+ nonvirt TIPERROR Init(SHEAP_MGR *psheapmgr,
+ BOOL fCoalesce = TRUE,
+ BOOL fRoundUp = FALSE);
+
+
+ nonvirt TIPERROR AllocChunk(HCHUNK *phchunk, UINT cbSizeChunk);
+ nonvirt TIPERROR AllocXSZ(HCHUNK *phchunk, XSZ xsz);
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt BYTE *QtrOfHandle(HCHUNK hchunk) const;
+ nonvirt BYTE *QtrOfHandle(HCHUNK hchunk, UINT oChunk) const;
+ nonvirt BYTE *QtrOfOldHandle(HCHUNK hchunkOld) const;
+ nonvirt TIPERROR StartCompact();
+ nonvirt HCHUNK MapChunk(HCHUNK hchunkOld, UINT cbSize);
+ nonvirt HCHUNK MapXSZ(HCHUNK hchunkOld);
+ nonvirt BOOL IsForwarded(HCHUNK hchunk) const;
+ nonvirt VOID EndCompact();
+ nonvirt VOID FreeChunk(HCHUNK hchunk, UINT cbSize);
+ nonvirt VOID FreeXSZ(HCHUNK);
+ nonvirt VOID Free();
+ nonvirt BOOL IsValid() const;
+ nonvirt UINT CbSizeFree() const;
+ nonvirt TIPERROR Trim();
+ #if !OE_WIN32
+ nonvirt UINT HszLen(HCHUNK hsz) const;
+ #endif
+
+ // Locking methods
+ nonvirt VOID Lock();
+ nonvirt VOID Unlock();
+ nonvirt BOOL IsLocked() const;
+
+ nonvirt VOID Lock(HCHUNK hchunk);
+ nonvirt VOID Unlock(HCHUNK hchunk);
+ nonvirt BOOL IsLocked(HCHUNK hchunk) const;
+ nonvirt UINT GetSize() const;
+ nonvirt UINT GetRemainingSize() const;
+
+ // Is empty method
+ nonvirt BOOL IsEmpty() const;
+
+ nonvirt SHEAP_MGR *Psheapmgr() const;
+
+ // Debug/test methods
+#if ID_DEBUG
+ nonvirt VOID DebShowState(UINT uLevel) const;
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebCheckHandle(HCHUNK hchunk) const;
+#else
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebCheckHandle(HCHUNK hchunk) const {}
+#endif
+
+
+
+private:
+ nonvirt TIPERROR Trim(UINT *puCbReclaimed);
+ nonvirt TIPERROR AllocChunk2(HCHUNK *phchunk, UINT cbSizeChunk, UINT cDepth);
+ nonvirt BYTE *PtrOfCopy();
+ nonvirt VOID SetBit(UINT uBit) const;
+ nonvirt BOOL GetBit(UINT uBit) const;
+ nonvirt VOID ReInit();
+ nonvirt UINT CbSizeChunkTrue(UINT cbSize) const;
+ nonvirt HFREE_CHUNK HfreechunkOfCbSize(UINT cbSizeChunk);
+ nonvirt VOID AddChunkToFreeList(HCHUNK hchunk, UINT cbSizeChunk);
+ nonvirt VOID ConsChunkToFreeList(HCHUNK hchunk, UINT cbSize);
+ nonvirt UINT CbSize() const;
+#if HP_BIGENDIAN
+ nonvirt VOID SwapFreeList(BOOL fSwapFirst);
+#endif //HP_BIGENDIAN
+
+ BLK_DESC m_blkdesc;
+ sHFREE_CHUNK m_hfreechunk; // serialized
+ BYTE *m_pbBlkCopy;
+ BYTE *m_pbBitmap;
+
+ USHORT m_fCoalesce:1; // serialized
+ USHORT m_fRoundUp:1; // serialized: allocs should be rounded
+ // up to sizeof(FREE_CHUNK) boundaries.
+ USHORT undone:14;
+
+#ifdef BLKMGR_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+// inline methods
+//
+
+/***
+*PUBLIC BLK_MGR::~BLK_MGR - destructor
+*Purpose:
+* Destroys a block manager.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_BLKMGR)
+inline BLK_MGR::~BLK_MGR()
+{
+ // Do nothing, block will vanish when the heap is destructed.
+ // Note that has an embedded BLK_DESC member which is
+ // automagically destructed when this dtor is called.
+ // The BLK_DESC dtor frees the block (by deferring to the
+ // SHEAP_MGR).
+ DebAssert((m_pbBlkCopy == NULL) && (m_pbBitmap == NULL),
+ "BLK_MGR::~BLKMGR: whoops! compaction didn't complete.");
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_MGR::Psheapmgr
+*Purpose:
+* Gets containing sheapmgr
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_BLKMGR)
+inline SHEAP_MGR *BLK_MGR::Psheapmgr() const
+{
+ return m_blkdesc.Psheapmgr();
+}
+
+
+/***
+*PUBLIC BLK_MGR::IsValid - Tests if block manager in valid state.
+*Purpose:
+* Tests if block manager is valid -- i.e. has been allocated
+* a block. Defers to blkdesc member.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns TRUE if valid, else FALSE.
+*
+***********************************************************************/
+#pragma code_seg(CS_BLKMGR)
+inline BOOL BLK_MGR::IsValid() const
+{
+ return m_blkdesc.IsValid();
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE BLK_MGR::CbSize - Size of block.
+*Purpose:
+* Returns size of block. Simply defers to allocating
+* heap manager.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+#pragma code_seg(CS_CORE)
+inline UINT BLK_MGR::CbSize() const
+{
+ DebAssert(IsValid(), "BLK_MGR::cbSize: invalid block.");
+
+ return m_blkdesc.CbSize();
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_MGR::QtrOfHandle - Converts handle to pointer.
+*Purpose:
+* Converts a chunk handle into a pointer. A Nil handle is
+* *NOT* converted to a NULL pointer (asserts).
+*
+*Entry:
+* hchunk - Handle to a chunk.
+*
+*Exit:
+* Returns a pointer to that chunk.
+*
+***********************************************************************/
+#pragma code_seg(CS_CORE)
+// CONSIDER: andrewso 30-Jun-93
+// QtrOfBlockActual is merged with QtrOfBlock, which in turn has
+// been merged with BLK_MGR::QtrOfHandle to avoid a problem
+// with inlining QtrOfBlockActual when QtrOfHandle is called. When we
+// upgrade our compiler with one that does inlining better, put this
+// stuff back.
+//
+// NOTE: This is legal because we are a friend to
+// BLK_DESC.
+//
+inline BYTE *BLK_MGR::QtrOfHandle(HCHUNK hchunk) const
+{
+ DebAssert(hchunk != HCHUNK_Nil, "BLK_MGR::QtrOfHandle: Nil handle.");
+
+ DebAssert(IsValid(), "BLK_MGR::QtrOfHandle: invalid block.");
+
+ DebAssert((UINT)hchunk < CbSize(),
+ "BLK_MGR::QtrOfHandle: handle out of bounds.");
+
+ return
+
+#if OE_MACNATIVE
+ OOB_MAKEP2(m_blkdesc.m_psheapmgr->m_hMemHeap,
+ m_blkdesc.m_qbMemBlock)
+#else
+ OOB_MAKEP2(&m_blkdesc, m_blkdesc.m_qbMemBlock)
+#endif
+
+#if ID_DEBUG
+ + ((m_blkdesc.m_fShiftUp == TRUE) ? 0 : SHM_cbShift)
+#endif
+ + (UINT)hchunk;
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_MGR::QtrOfHandle - Converts handle and offset to pointer.
+*Purpose:
+* Converts a chunk handle and an offset into chunk to a pointer.
+* A Nil handle is *NOT* converted to a NULL pointer
+* (QtrOfHandle asserts).
+*
+*Entry:
+* hchunk - Handle to a chunk.
+* oChunk - Offset into chunk.
+*
+*Exit:
+* Returns a pointer to offset within chunk.
+*
+***********************************************************************/
+#pragma code_seg(CS_CORE)
+inline BYTE *BLK_MGR::QtrOfHandle(HCHUNK hchunk, UINT oChunk) const
+{
+ DebAssert(IsValid(), "BLK_MGR::QtrOfHandle: invalid block.");
+ DebAssert(((UINT)hchunk + oChunk) < CbSize(),
+ "BLK_MGR::QtrOfHandle: handle out of bounds.");
+
+ return QtrOfHandle(hchunk) + oChunk;
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE BLK_MGR::GetBit - Gets bit in bitmap.
+*Purpose:
+* Indicates whether bit is set in bitmap.
+*
+* CONSIDER: make inline
+*
+*Entry:
+* uBit - Bit to test.
+*
+*Exit:
+* Returns TRUE if bit set otherwise FALSE.
+*
+***********************************************************************/
+#pragma code_seg(CS_CORE)
+inline BOOL BLK_MGR::GetBit(UINT uBit) const
+{
+ DebAssert(IsValid(), "BLK_MGR::GetBit: invalid block.");
+
+ UINT uBitsElem=sizeof(m_pbBitmap[0]) * CHAR_BIT;
+ return m_pbBitmap[uBit/uBitsElem] & (1 << (uBit % uBitsElem));
+}
+#pragma code_seg()
+
+/***
+*PRIVATE BLK_MGR::SetBit - Sets bit in bitmap.
+*Purpose:
+* Sets bit in bitmap.
+*
+* CONSIDER: make inline
+*
+*Entry:
+* uBit - Bit to set.
+*
+*Exit:
+*
+***********************************************************************/
+#pragma code_seg(CS_BLKMGR)
+inline VOID BLK_MGR::SetBit(UINT uBit) const
+{
+ DebAssert(IsValid(), "BLK_MGR::SetBit: invalid block.");
+
+ UINT uBitsElem=sizeof(m_pbBitmap[0]) * CHAR_BIT;
+ m_pbBitmap[uBit/uBitsElem] |= (1 << (uBit % uBitsElem));
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE BLK_MGR::ReInit - Reinitializes a block manager.
+*Purpose:
+* Reinitializes the private members of a block manager. Called
+* by Init() and by Free(). Note that can't assert IsValid()
+* here since Free() invalidates a block.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_BLKMGR)
+inline VOID BLK_MGR::ReInit()
+{
+ // Init private members.
+ m_pbBlkCopy=NULL;
+ m_pbBitmap=NULL;
+ m_hfreechunk=HCHUNK_Nil; // Initialize first free chunk
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_MGR::IsForwarded - has chunk been forwarded during compaction.
+*Purpose:
+* Indicates whether chunk addressed by handle has been forwarded
+* during compaction phase. Simply tests bitmap offset. Since
+* even-sized chunks are always allocated, each bit in the bitmap
+* represents one short, hence hchunk is divided by two before
+* bitmap is tested.
+*
+*Entry:
+* hchunk - handle of chunk.
+*
+*Exit:
+* Returns TRUE if chunk already forwarded else FALSE.
+*
+***********************************************************************/
+#pragma code_seg(CS_BLKMGR)
+inline BOOL BLK_MGR::IsForwarded(HCHUNK hchunk) const
+{
+ DebAssert(IsValid(), "BLK_MGR::IsForwarded: invalid block.");
+
+ DebAssert((m_pbBlkCopy != NULL) && (m_pbBitmap != NULL),
+ "BLK_MGR::MapChunk: not in midst of compaction.");
+
+ DebAssert(((UINT)hchunk & (sizeof(FREE_CHUNK)-1)) == 0,
+ "BLK_MGR::IsForwarded: hchunk not even.");
+
+ return GetBit(((UINT)hchunk) >> 2);
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_MGR::AllocChunk - allocates a chunk in block.
+*Purpose:
+* Allocates a contiguous chunk in block of cbSize bytes.
+*
+*Implementation Notes:
+* Note: simply defers to AllocChunk2 (private recursive method).
+*
+*Entry:
+* phchunk - pointer to chunk handle (OUT).
+* cbSizeChunk - count of bytes to allocate (IN).
+*
+*Exit:
+* Returns pointer to handle to allocated chunk in block.
+*
+***********************************************************************/
+#pragma code_seg(CS_CORE)
+inline TIPERROR BLK_MGR::AllocChunk(HCHUNK *phchunk, UINT cbSizeChunk)
+{
+ return AllocChunk2(phchunk, cbSizeChunk, 0);
+}
+
+
+/***
+*PUBLIC BLK_MGR::CbSizeChunkTrue - how much physical memory does a chunk occupy.
+*Purpose:
+* Utility routine to obtain the physical size of a chunk
+* from the client specified size of a chunk.
+* For OB:
+* This enforces the always multiple of sizeof(FREE_CHUNK), big enough
+* to hold a FREE_CHUNK and if this chunk if freed and it's allocated
+* so that some part of it remains, the remnant is be enough to
+* be returned to the freelist.
+*
+* For OLE:
+* Minimum freechunk must be 4 (sizeof(FREE_CHUNK)), but above that
+* we only enforce even size chunks. Possible then 2b remnants
+* can leak, but this is worth it because in OLE we rarely realloc.
+*
+*Entry:
+* cbSize - size client requested (in bytes)
+*
+*Exit:
+* UINT - actual number of bytes that should be allocated
+*
+***********************************************************************/
+
+inline UINT BLK_MGR::CbSizeChunkTrue(UINT cbSize) const
+{
+#if OE_RISC
+
+ return (cbSize < sizeof(FREE_CHUNK)) ?
+ (sizeof(FREE_CHUNK) + SHM_cbAlign-1) & ~(SHM_cbAlign-1) :
+ (cbSize + SHM_cbAlign-1) & ~(SHM_cbAlign-1);
+
+#else
+
+ if (m_fRoundUp) {
+ // round up to multiple of sizeof(FREE_CHUNK)
+ return (cbSize < sizeof(FREE_CHUNK)) ?
+ sizeof(FREE_CHUNK) :
+ (cbSize + sizeof(FREE_CHUNK)-1) & ~(sizeof(FREE_CHUNK)-1);
+ }
+ else {
+ // round up only to even size
+ return (cbSize < sizeof(FREE_CHUNK)) ?
+ sizeof(FREE_CHUNK) :
+ (cbSize + 1 & ~1);
+ }
+
+#endif // OE_RISC
+
+}
+
+
+/***
+*PUBLIC BLK_MGR::Lock
+*Purpose:
+* Lock the block.
+*
+*Implementation Notes:
+* Defers to blkdesc.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+inline VOID BLK_MGR::Lock()
+{
+ DebAssert(IsValid(), "BLK_MGR::Lock: Block invalid.");
+
+ m_blkdesc.Lock();
+}
+
+
+/***
+*PUBLIC BLK_MGR::Unlock
+*Purpose:
+* Unlock the block.
+*
+*Implementation Notes:
+* Defers to blkdesc.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID BLK_MGR::Unlock()
+{
+ DebAssert(IsValid(), "BLK_MGR::Unlock: Block invalid.");
+
+ m_blkdesc.Unlock();
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_MGR::IsLocked
+*Purpose:
+* Tests if block is locked.
+*
+*Implementation Notes:
+* Defers to blkdesc.
+*
+*Entry:
+*
+*Exit:
+* TRUE if block is locked -- i.e. at least one lock.
+***********************************************************************/
+#pragma code_seg(CS_BLKMGR)
+inline BOOL BLK_MGR::IsLocked() const
+{
+ DebAssert(IsValid(), "BLK_MGR::IsLocked: Block invalid.");
+
+ return m_blkdesc.IsLocked();
+}
+
+
+/***
+*PUBLIC BLK_MGR::Lock
+*Purpose:
+* Lock a chunk.
+*
+*Implementation Notes:
+* Defers to Lock/0. Locking a chunk locks its block.
+*
+*Entry:
+* hchunk Handle of chunk to lock.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID BLK_MGR::Lock(HCHUNK hchunk)
+{
+ DebAssert(IsValid(), "BLK_MGR::Lock: Block invalid.");
+ DebCheckHandle(hchunk);
+
+ Lock();
+}
+
+
+/***
+*PUBLIC BLK_MGR::Unlock
+*Purpose:
+* Unlock the block.
+*
+*Implementation Notes:
+* Defers to Unlock()/0. Unlocking a chunk, unlocks its block.
+*
+*Entry:
+* hchunk Handle of chunk to lock.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID BLK_MGR::Unlock(HCHUNK hchunk)
+{
+ DebAssert(IsValid(), "BLK_MGR::Unlock: Block invalid.");
+ DebCheckHandle(hchunk);
+
+ Unlock();
+}
+
+
+/***
+*PUBLIC BLK_MGR::IsLocked
+*Purpose:
+* Tests if chunk is locked.
+*
+*Implementation Notes:
+* Defers to IsLocked()/0
+*
+*Entry:
+* hchunk Handle of chunk to lock.
+*
+*Exit:
+* TRUE if chunk is locked -- i.e. at least one lock.
+***********************************************************************/
+inline BOOL BLK_MGR::IsLocked(HCHUNK hchunk) const
+{
+ DebAssert(IsValid(), "BLK_MGR::IsLocked: Block invalid.");
+ DebCheckHandle(hchunk);
+
+ return IsLocked();
+}
+
+
+/***
+*PUBLIC BLK_MGR::IsEmpty
+*Purpose:
+* Tests if blk is empty.
+*
+*Implementation Notes:
+* Simply compares CbSize with CbSizeFree, since no chunks
+* can leak the block is empty iff CbSize == CbSizeFree.
+*
+*Entry:
+*
+*Exit:
+* TRUE if block is empty -- i.e. no allocated chunks.
+*
+***********************************************************************/
+
+inline BOOL BLK_MGR::IsEmpty() const
+{
+ // In typelib we cannot determine if the block manager is empty or not
+ // as we round up to 2 bytes always.
+ DebAssert(0, " Cannot call this function ");
+ return FALSE;
+}
+
+
+/***
+*PUBLIC BLK_MGR::GetRemainingSize
+*Purpose:
+* Returns remaining size but deferring to blkdesc.
+*
+
+*Entry:
+* None.
+*
+*Exit:
+* UINT - remaining size.
+*
+***********************************************************************/
+
+inline UINT BLK_MGR::GetRemainingSize() const
+{
+ return m_blkdesc.GetRemainingSize();
+}
+
+
+#pragma code_seg()
+
+#endif // ! BLKMGR_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/bstr.h b/private/oleauto/src/typelib/bstr.h
new file mode 100644
index 000000000..a79c59cd1
--- /dev/null
+++ b/private/oleauto/src/typelib/bstr.h
@@ -0,0 +1,109 @@
+// BSTR.H - public BSTR stucture and prototypes
+//
+//
+// Revision History:
+// 11-Aug-92 w-peterh: added CopyBstr()
+//
+
+
+#ifndef BSTR_H_INCLUDED
+#define BSTR_H_INCLUDED
+
+#include "types.h"
+
+#if __cplusplus
+extern "C" {
+#endif
+
+#ifndef ID_INT_IS_LONG
+typedef unsigned int UINT;
+#endif
+
+#define AllocBstr SysAllocString
+#define ReallocBstr SysReAllocString
+#define AllocBstrLen SysAllocStringLen
+#define ReallocBstrLen SysReAllocStringLen
+#define FreeBstr SysFreeString
+
+#if OE_WIN32
+#define AllocBstrA SysAllocStringA
+#define ReallocBstrA SysReAllocStringA
+#define AllocBstrLenA SysAllocStringLenA
+#define ReallocBstrLenA SysReAllocStringLenA
+#define FreeBstrA SysFreeStringA
+#else
+#define AllocBstrA AllocBstr
+#define ReallocBstrA ReallocBstr
+#define AllocBstrLenA AllocBstrLen
+#define ReallocBstrLenA ReallocBstrLen
+#define FreeBstrA FreeBstr
+#define BstrLenA BstrLen
+#define CopyBstrA CopyBstr
+#endif // OE_WIN16
+
+
+#include "tiperr.h"
+
+// define some functions that are simple enough to do inline
+//
+
+__inline UINT BstrLen(BSTR bstr)
+{
+ if(bstr == NULL)
+ return 0;
+#if OE_WIN32
+ return (unsigned int)((((DWORD FAR*)bstr)[-1]) / 2);
+#else
+ return (unsigned int)(((DWORD FAR*)bstr)[-1]);
+#endif
+}
+
+#if OE_WIN32
+__inline UINT BstrLenA(BSTRA bstr)
+{
+ if(bstr == NULL)
+ return 0;
+ return (unsigned int)(((DWORD FAR*)bstr)[-1]);
+}
+#endif //OE_WIN32
+
+
+__inline TIPERROR CopyBstr (LPBSTR lpbstrDest, BSTR bstrSrc)
+{
+ if (bstrSrc) {
+
+ *lpbstrDest = AllocBstrLen(bstrSrc, BstrLen(bstrSrc));
+ if (*lpbstrDest == NULL)
+ return TIPERR_OutOfMemory;
+ }
+ else
+ *lpbstrDest = NULL;
+
+ return TIPERR_None;
+}
+#if OE_WIN32
+__inline TIPERROR CopyBstrA (LPBSTRA lpbstrDest, BSTRA bstrSrc)
+{
+ if (bstrSrc) {
+
+ *lpbstrDest = AllocBstrLenA(bstrSrc, BstrLenA(bstrSrc));
+ if (*lpbstrDest == NULL)
+ return TIPERR_OutOfMemory;
+ }
+ else
+ *lpbstrDest = NULL;
+
+ return TIPERR_None;
+}
+#endif
+
+__inline int PASCAL ReallocBstrBstr(BSTR FAR *pbstrDest, BSTR bstrSrc)
+{
+ return ReallocBstrLen(pbstrDest, bstrSrc, BstrLen(bstrSrc));
+}
+
+#if __cplusplus
+} /* extern C */
+#endif
+
+#endif /* BSTR_H_INCLUDED */
diff --git a/private/oleauto/src/typelib/cltypes.hxx b/private/oleauto/src/typelib/cltypes.hxx
new file mode 100644
index 000000000..5b34156bc
--- /dev/null
+++ b/private/oleauto/src/typelib/cltypes.hxx
@@ -0,0 +1,687 @@
+/***
+*cltypes.hxx - Class Lib component-wide header file.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Component-wide stuff. See \silver\doc\client\tmembers.doc for
+* more info on these definitions.
+*
+* This file defines the following:
+* enum TYPEKIND
+* enum PERSISTENCEKIND
+* typedef HMEMBER
+* typedef HIMPTYPE
+* enum ACCESS
+* enum VAR_KIND
+* enum DECLKIND
+* enum TYPEDESCKIND
+* enum PTRKIND
+* enum FUNC_KIND
+* enum CALLINGCONVENTION
+* enum PARAMKIND
+* enum SPECIALKIND
+* enum INFOKIND
+* enum VARDESCKIND
+* enum DEFNKIND
+* struct VAROFS
+* struct VMETHOFS
+* struct VBASEPOS
+* struct VARPOS
+* struct VMETHPOS
+* struct EDITKIND
+*
+*
+*Revision History:
+* 25-Feb-91 ilanc: Created
+* [01] 25-Feb-91 petergo: Added HIMPTYPE
+* [02] 27-Feb-91 ilanc: Added DECLKIND
+* [03] 28-Feb-91 ilanc: Moved to ..\cl
+* [04] 07-Mar-91 petergo: Add HLNAM_Nil
+* [05] 10-Mar-91 ilanc: Added VKIND_Formal, VKIND_Local, ACCESS_Ignore
+* [06] 21-May-91 ilanc: Added PARAMKIND enum
+* [07] 06-Jun-91 ilanc: Windowsian typedefs...
+* [08] 31-Oct-91 ilanc: Added TKIND_Alias
+* [09] 15-Nov-91 ilanc: Added SPECIALKIND enum.
+* [10] 02-Mar-91 petergo: Added HGNAM_Nil.
+* [11] 16-Mar-92 ilanc: Added EDITKIND
+* [12] 02-Apr-92 ilanc: Added VARDESCKIND.
+* [13] 20-Apr-92 stevenl: Added DEFNKIND.
+* [14] 03-Jun-92 w-peterh: Added HMEMBER Accessor functions
+* [15] 16-Jun-92 w-peterh: Added DEFNKIND DK_RecTypeDefn
+* [16] 02-Jul-92 w-peterh: Added INFOKIND INFOKIND_NestedType
+* [17] 30-Jul-92 w-peterh: Added IsMatchOfVisibility()
+* [18] 18-Aug-92 w-peterh: Added IMPADDR(from impmgr.hxx)
+* [19] 22-Oct-92 w-peterh: Added HRESDESCTBL
+* [20] 14-Nov-92 ilanc: Added INVOKEKIND
+* [21] 21-Nov-92 Rajiv: Updated Edit Kind.
+* [22] 25-Nov-92 ilanc: Made HMEMBER/sHMEMBER 32 bits.
+* [23] 14-Dec-92 w-peterh: Moved INVOKEKIND to clhost.h
+* [24] 12-Feb-93 w-peterh: added VDK_Base*, PARAMKIND_Ignore
+* [25] 30-Apr-93 w-jeffc: added sACCESS, sDEFNKIND and layout strings
+* for virtual function structures
+*
+*Implementation Notes:
+* Note: we assume (for now) large-model compilation on 16-bit.
+* I.e. all pointers are far. If and when we distribute
+* header files we probably need to make sure that pointer
+* types are explicitly far.
+*
+*****************************************************************************/
+
+#ifndef CLTYPES_HXX_INCLUDED
+#define CLTYPES_HXX_INCLUDED
+
+// enum TYPEDESCKIND - tdesckind
+//
+// defined in tdesck.hxx
+//
+// WARNING:
+// There is an array in dumptlib.cxx that is indexed by this enum.
+
+#include "silver.hxx"
+#include "tdesck.hxx"
+#include <limits.h>
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szCLTYPES_HXX)
+#define SZ_FILE_NAME g_szCLTYPES_HXX
+#endif
+
+
+typedef CALLCONV CALLINGCONVENTION;
+
+// Error codes generated by methods of the CLASSLIB protocols are
+// of type TIPERROR. The error code are defined in cliberrs.hxx.
+// NOTE: tiperrs.hxx is defined in types.h
+// typedef USHORT TIPERROR;
+
+class TYPEMGR;
+typedef TYPEMGR *LPTYPEMGR;
+typedef LPTYPEMGR *LPLPTYPEMGR;
+
+typedef ITypeLibA *LPITypeLib;
+typedef LPITypeLib *LPLPITypeLib;
+
+class TYPEINFO;
+typedef TYPEINFO* LPTYPE_INFO;
+typedef LPTYPE_INFO* LPLPTYPEINFO;
+
+class DYN_TYPEMEMBERS;
+typedef DYN_TYPEMEMBERS* LPDYNTYPEMEMBERS;
+typedef LPDYNTYPEMEMBERS* LPLPDYNTYPEMEMBERS;
+
+class TYPEFIXUPS;
+typedef TYPEFIXUPS* LPTYPEFIXUPS;
+typedef LPTYPEFIXUPS* LPLPTYPEFIXUPS;
+
+class DEFN_TYPEBIND;
+typedef DEFN_TYPEBIND* LPDEFNTBIND;
+typedef LPDEFNTBIND* LPLPDEFNTBIND;
+
+typedef LPOLESTR TYPEID;
+typedef TYPEID* LPTYPEID;
+typedef LPTYPEID* LPLPTYPEID;
+
+
+// PERSISTENCEKIND enum - pkind
+//
+// WARNING:
+// There is an array in dumptlib.cxx that is indexed by this enum.
+enum PERSISTENCEKIND
+{
+ PKIND_None,
+ PKIND_Serializable,
+ PKIND_Persistent
+};
+
+
+// HMEMBER - hmember: entry import handle
+// HIMPTYPE - himptype: type imp
+// HLNAM - hlnam: local name handle
+// HGNAM - hgnam: global name handle
+typedef ULONG HMEMBER; // 25-Nov-92: now 32bit
+typedef HMEMBER sHMEMBER;
+typedef UINT HIMPTYPE;
+typedef USHORT sHIMPTYPE;
+typedef UINT HIMPADDR;
+typedef USHORT sHIMPADDR;
+typedef HCHUNK HLNAM;
+typedef sHCHUNK sHLNAM;
+typedef HCHUNK HNAMSTR;
+typedef sHCHUNK sHNAMSTR;
+typedef ULONG HGNAM;
+typedef ULONG sHGNAM;
+typedef LPVOID IMPADDR;
+
+
+// Constants that go with these types
+const HLNAM HLNAM_Nil = HCHUNK_Nil;
+const HGNAM HGNAM_Nil = 0x00000000;
+const HIMPTYPE HIMPTYPE_Nil = 0xFFFF;
+const HIMPADDR HIMPADDR_Nil = 0xFFFF;
+
+/* HMEMBERs The Full story (part II):
+*
+* HMEMBERs are handles to a modules data or function members and
+* are unique (except property fn.) within a TypeInfo's scope.
+*
+* HMEMBERs have the following form:
+*
+* 01<user bits:4><unused:4><nesting level:6><offset:16>
+*
+* Where the user bits can have any value, the unused bits are always
+* zero (reserved for future use) and the nesting level is equal to
+* the number of inhertence levels below the current TypeInfo.
+*
+****************************************************************************/
+
+const HMEMBER HMEMBER_Nil = (HMEMBER)DISPID_UNKNOWN;
+
+#define HMEMBER_ReservedBits (0x80000000) // Reserved
+#define HMEMBER_StdOleId (0x40000000) // Standard OLE Hmember
+
+#define HMEMBER_UserBits (0x3C000000)
+#define HMEMBER_BrkModeBit (0x04000000)
+#define HMEMBER_UserBitsShift 26
+
+#define HMEMBER_Unused (0x03C00000)
+#define HMEMBER_UnusedShift 22
+
+#define HMEMBER_NestDepth (0x003F0000)
+#define HMEMBER_NestDepthShift 16
+#define HMEMBER_NestDepthSize 6
+
+#define HMEMBER_Offset (0x0000FFFF)
+
+// Hmember helpers.
+
+inline UINT UserBits(HMEMBER hmember)
+{
+ return (UINT)((hmember & HMEMBER_UserBits) >> HMEMBER_UserBitsShift);
+}
+
+inline UINT NestDepth(HMEMBER hmember)
+{
+ return (UINT)((hmember & HMEMBER_NestDepth) >> HMEMBER_NestDepthShift);
+}
+
+inline UINT Offset(HMEMBER hmember)
+{
+ return (UINT)(hmember & HMEMBER_Offset);
+}
+
+inline BOOL IsStdOleHmember(HMEMBER hmember)
+{
+ return !(hmember & HMEMBER_ReservedBits)
+ && (hmember & HMEMBER_StdOleId);
+}
+
+inline HMEMBER SetUserBits(UINT bits)
+{
+ DebAssert(!(((LONG)bits << HMEMBER_UserBitsShift) & ~HMEMBER_UserBits),
+ "Invalid field.");
+
+ return (LONG)bits << HMEMBER_UserBitsShift;
+}
+
+inline HMEMBER SetNestDepth(UINT bits)
+{
+ DebAssert(!(((LONG)bits << HMEMBER_NestDepthShift) & ~HMEMBER_NestDepth),
+ "Invalid field.");
+
+ return (LONG)bits << HMEMBER_NestDepthShift;
+}
+
+
+/* OLE HMEMBERS -- the full story (part II)
+*
+* The hmember is set as above with the first set of user bits is
+* formatted as follows:
+*
+* <is FuncDesc>0000
+*
+* The offset is the index of the Desc.
+*
+****************************************************************************/
+
+#define HMEMBER_Func (0x8) // offset is for FuncDesc
+
+const UINT HMEMBER_PredeclId = (UINT)ID_DEFAULTINST;
+
+inline BOOL AddedInBrkMode(HMEMBER hmember)
+{
+ DebAssert(hmember != HMEMBER_Nil, "Bad hmember");
+
+ return (BOOL) ((hmember & HMEMBER_BrkModeBit) == 0);
+}
+
+
+
+inline BOOL IsFunction(HMEMBER hmember)
+{
+ DebAssert(hmember != HMEMBER_Nil, "Bad hmember");
+
+ return (BOOL) UserBits(hmember) & HMEMBER_Func;
+}
+
+inline HMEMBER FunctionHmemberOfOffset(UINT offset, UINT nestDepth)
+{
+ return HMEMBER_StdOleId
+ | SetUserBits(HMEMBER_Func)
+ | SetNestDepth(nestDepth)
+ | (HMEMBER)(offset);
+}
+
+inline HMEMBER DataHmemberOfOffset(UINT offset, UINT nestDepth)
+{
+ return HMEMBER_StdOleId
+ | SetNestDepth(nestDepth)
+ | (HMEMBER)(offset);
+}
+
+
+// enum ACCESS - access
+//
+// WARNING:
+// There is an array in dumptlib.cxx that is indexed by this enum.
+enum ACCESS
+{
+ ACCESS_Private,
+ ACCESS_Public
+};
+
+typedef USHORT sACCESS;
+
+
+/***
+*PROTECTED IsMatchOfVisibility - Filter on visibility.
+*Purpose:
+* Filter on visibility.
+*
+*Implementation Notes:
+* // *** WRITE SOME MORE HERE ****
+*Entry:
+*
+*Exit:
+* None.
+*
+*Errors:
+* BOOL
+*
+***********************************************************************/
+
+inline BOOL IsMatchOfVisibility(ACCESS accessMbr, ACCESS accessClient)
+{
+ return (accessMbr >= accessClient);
+}
+
+
+// enum VAR_KIND - vkind
+//
+// WARNING:
+// There is an array in dumptlib.cxx that is indexed by this enum.
+enum VAR_KIND
+{
+ VKIND_DataMember
+ ,VKIND_Base
+ ,VKIND_Enumerator
+ ,VKIND_Formal
+};
+
+
+// enum DECLKIND - declkind
+//
+enum DECLKIND
+{
+ DECLKIND_Implicit,
+ DECLKIND_Typechar,
+ DECLKIND_Explicit
+};
+
+
+
+// enum PTRKIND - ptrkind
+//
+// WARNING:
+// There is an array in dumptlib.cxx that is indexed by this enum.
+enum PTRKIND
+{
+ PTRKIND_Ignore,
+ PTRKIND_Near,
+ PTRKIND_Far,
+ PTRKIND_Near32,
+ PTRKIND_Far32,
+ PTRKIND_Based,
+ PTRKIND_Huge,
+ PTRKIND_Basic,
+};
+
+
+// enum FUNC_KIND - fkind
+//
+enum FUNC_KIND
+{
+ FKIND_NonVirtual,
+ FKIND_Virtual,
+ FKIND_Static,
+ FKIND_Dispatch
+};
+
+
+// enum PARAMKIND - paramkind
+//
+enum PARAMKIND
+{
+ PARAMKIND_In,
+ PARAMKIND_Out,
+ PARAMKIND_InOut,
+ PARAMKIND_Ignore
+};
+
+
+// enum SPECIALKIND - specialkind
+// Purpose:
+// Enumerates different kinds of special functions.
+//
+enum SPECIALKIND
+{
+ SPECIALKIND_Normal,
+ SPECIALKIND_Ctor,
+ SPECIALKIND_Dtor
+};
+
+
+// enum INFOKIND - infokind
+// Purpose:
+// Enumerates different kinds of INFOs.
+//
+enum INFOKIND
+{
+ INFOKIND_Var,
+ INFOKIND_Func,
+ INFOKIND_Param,
+ INFOKIND_NestedType
+};
+
+
+// enum VARDESCKIND - vdesckind
+// Purpose:
+// Enumerates different kinds Basic variables.
+//
+enum VARDESCKIND
+{
+ VDK_Unknown,
+ VDK_LocalIntrinsic,
+ VDK_LocalRecord,
+ VDK_LocalObject,
+ VDK_ByvalIntrinsic,
+ VDK_ByvalRecord,
+ VDK_ByvalObject, // illegal
+ VDK_ByrefIntrinsic,
+ VDK_ByrefRecord,
+ VDK_ByrefObject,
+ VDK_ByptrIntrinsic, // illegal
+ VDK_ByptrRecord, // illegal
+ VDK_ByptrObject,
+ VDK_DataMemberIntrinsic,
+ VDK_DataMemberRecord,
+ VDK_DataMemberObject,
+ VDK_BaseIntrinsic, // Illegal
+ VDK_BaseRecord, // Illegal
+ VDK_BaseObject
+};
+
+
+// enum DEFNKIND - dk
+// Purpose:
+// Enumerates different kinds of defns.
+// Includes some defns that don't derive
+// from DEFN, like DLLENTRY_DEFN.
+// Specifically excludes MEMBER_DEFN, since
+// it only exists to be included in MBR_VAR_DEFN, etc.
+//
+enum DEFNKIND
+{
+ DK_VarDefn,
+ DK_ParamDefn,
+ DK_MbrVarDefn,
+ DK_FuncDefn,
+ DK_VirtualFuncDefn,
+ DK_DllEntryDefn,
+ DK_RecTypeDefn
+};
+
+typedef USHORT sDEFNKIND;
+
+
+// enum BASICVARKIND - basicvkind
+// Purpose:
+// enumerates different "classes" of basic Variable kinds
+//
+enum BASICVARKIND
+{
+ BVKIND_Intrinsic,
+ BVKIND_Record,
+ BVKIND_Object
+};
+
+
+// enum COMPSTATE
+// enumeration specifying the various possible compilation states
+//
+enum COMPSTATE {
+ CS_UNDECLARED,
+ CS_SEMIDECLARED,
+ CS_DECLARED,
+ CS_REGENERATE,
+ CS_COMPILED,
+ CS_ADDRESSABLE,
+ CS_QUASIDECLARED,
+ CS_QUASIUNDECLARED,
+ CS_RUNNABLE
+};
+
+
+#pragma pack(2) // want all these guys to word-align
+
+// struct VAROFS - vo
+// Purpose:
+// Structure for describing the offset within an instance to
+// a data member, non-virtual base member or virtual function
+// table pointer.
+//
+// *** if you modify this structure, also update the layout string below
+// (see SwapStruct() for more info)
+//
+// CONSIDER: vba2
+// struct VAROFS
+// {
+// LONG oVar;
+// inline VAROFS() { oVar = -1; }
+// };
+//
+// // layout string for TYPE_DATA byte swapping
+// #define VAROFS_LAYOUT "l"
+
+
+// struct VMETHOFS - vmo
+// Purpose:
+// Extends VAROFS to describe the offset w/in the vft indicated
+// by VAROFS::oVar of the slot of a virtual function.
+//
+// *** if you modify this structure, also update the layout string below
+// (see SwapStruct() for more info)
+//
+// CONSIDER: vba2
+// struct VMETHOFS: public VAROFS
+struct VMETHOFS
+{
+ SHORT ovft;
+ inline VMETHOFS() { ovft = -1; }
+};
+
+// layout string for TYPE_DATA byte swapping
+// CONSIDER: vba2
+// #define VMETHOFS_LAYOUT VAROFS_LAYOUT "s"
+#define VMETHOFS_LAYOUT "s"
+
+// struct VBASEPOS - vbp
+// Purpose:
+// Structure for describing the position of a virtual base member.
+// This entails determining (1) where the appropriate vbt is and
+// (2) what the offset with that table is (that offset itself
+// contains the offset from THIS where the virtual base may be
+// found.
+//
+// *** if you modify this structure, also update the layout string below
+// (see SwapStruct() for more info)
+//
+// CONSIDER: vba2
+// struct VBASEPOS
+// {
+// LONG oPvbt;
+// LONG oFixup;
+// SHORT ovbt;
+// inline VBASEPOS() { oPvbt = -1; ovbt = -1; oFixup = -1; }
+// };
+//
+// // layout string for TYPE_DATA byte swapping
+// #define VBASEPOS_LAYOUT "lls"
+
+
+// struct VARPOS - vp
+// Purpose:
+// Combines VBASEPOS and VAROFS to describe the position of
+// a data member, non-virtual base member or Pvft.
+//
+// CONSIDER: vba2
+// struct VARPOS : public VBASEPOS, public VAROFS
+// {
+// // NOTE: no introduced members.
+// };
+
+
+// struct VMETHPOS - vmp
+// Purpose:
+// Combines VMETHOFS and VBASEPOS to describe a
+// virtual method slot. Used to describe overridden methods in
+// base classes to subclassing clients. The VBASEPOS part
+// describes how to access a virtual base member that is or
+// contains the introducing class of the method. The VMETHOFS
+// part completes the description with the accessor to the
+// virtual method slot itself. For instance, the VAROFS part
+// might indicate how to access the pvft in the embedded
+// introducing class given a virtual base member.
+//
+// *** if you modify this structure, also update the layout string below
+// (see SwapStruct() for more info)
+//
+// CONSIDER: vba2
+// struct VMETHPOS : public VMETHOFS, public VBASEPOS
+struct VMETHPOS : public VMETHOFS
+{
+ // NOTE: no introduced members
+};
+
+// layout string for TYPE_DATA byte swapping
+// CONSIDER: vba2
+// #define VMETHPOS_LAYOUT VMETHOFS_LAYOUT VBASEPOS_LAYOUT
+#define VMETHPOS_LAYOUT VMETHOFS_LAYOUT
+
+#pragma pack() // reset to default
+
+// struct VBASECPOS - vbcp
+// Purpose:
+// Structure for "canonically" describing the position of a
+// virtual base member.
+// A "canonic" description is simply encoded as the TYPEID to
+// the TYPEINFO of the virtual base class.
+//
+// CONSIDER: vba2
+// struct VBASECPOS
+// {
+// LPSTR szTypeIdVbase;
+// inline VBASECPOS() { szTypeIdVbase = NULL; }
+// };
+
+
+// struct VARCPOS - vcp
+// Purpose:
+// Combines VBASECPOS and VAROFS to describe the "canonical" position of
+// a data member, non-virtual base member or Pvft.
+// Canonical since it is possibly in terms of the TYPEID to
+// the virtual base "owner" of the table.
+//
+// CONSIDER: vba2
+// struct VARCPOS : public VBASECPOS, public VAROFS
+// {
+// // NOTE: no introduced members.
+// };
+
+
+// struct VMETHCPOS - vmcp
+// Purpose:
+// Combines VMETHOFS and VBASECPOS to describe a "canonic"
+// virtual method slot. Used to describe overridden methods in
+// base classes to subclassing clients. If virtual method is
+// defined by a virtual base then VBASECPOS::szTypeIdVbase
+// attribute is the TYPEID ot the TYPEINFO of that base.
+// Otherwise (i.e. not defined by a virtual base) this is NULL.
+//
+// CONSIDER: vba2
+// struct VMETHCPOS : public VMETHOFS, public VBASECPOS
+// {
+// // NOTE: no introduced members
+// };
+
+// struct VMETHCPOSLIST;
+// typedef VMETHCPOSLIST* LPVMETHCPOSLIST;
+// typedef LPVMETHCPOSLIST* LPLPVMETHCPOSLIST;
+
+// These are stub declarations...
+//
+struct VBTDEFN;
+typedef VBTDEFN* LPVBTDEFN;
+typedef LPVBTDEFN* LPLPVBTDEFN;
+
+struct VBTDEFNLIST;
+typedef VBTDEFNLIST* LPVBTDEFNLIST;
+typedef LPVBTDEFNLIST* LPLPVBTDEFNLIST;
+
+struct VBASEDEFN;
+typedef VBASEDEFN* LPVBASEDEFN;
+typedef LPVBASEDEFN* LPLPVBASEDEFN;
+
+struct VBASEDEFNLIST;
+typedef VBASEDEFNLIST* LPVBASEDEFNLIST;
+typedef LPVBASEDEFNLIST* LPLPVBASEDEFNLIST;
+
+
+#if OE_MACPPC
+/***
+*struct DLLTEMPLATECALLBLOCK
+*Purpose:
+* Structure that holds Mac/PPC Dll Template Calling information.
+* This structure is used by entrymgr.cxx and instmgr.cxx when
+* resolving Dll entry points.
+*
+* [Note: The structure itself resides inside the Declare template and,
+* thus, this MUST match asm description in template.s.]
+*
+***********************************************************************/
+
+struct DLLTEMPLATECALLBLOCK {
+ void * pvTargetAddr; // target address for Dll template
+ void * pv68KAddr; // target 68k address (if applicable)
+ ProcInfoType theProcInfo; // Apple OS ProcInfoType value
+ UniversalProcPtr theProcPtr; // Apple OS Universal Proc Ptr
+ unsigned short usTargetRefnum; // target refnum
+ unsigned short usSavedRefnum; // saved refnum
+};
+#endif // OE_MACPPC
+
+
+#endif // ! CLTYPES_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/clutil.cxx b/private/oleauto/src/typelib/clutil.cxx
new file mode 100644
index 000000000..8561e8d58
--- /dev/null
+++ b/private/oleauto/src/typelib/clutil.cxx
@@ -0,0 +1,3210 @@
+/***
+*clutil.cxx - Class Lib component-wide utility functions.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Component-wide utility function.
+*
+*Revision History:
+* [00] 20-Jun-91 ilanc: Created
+* [01] 02-Dec-91 ilanc: Added IsSimpleType
+* [02] 12-Dec-91 ilanc: Return uDllOrdinal == ~0 if no dll entry pt
+* in GetDllEntryOfDataInfo.
+* [03] 12-Apr-92 ilanc: Changed Count() signature.
+* [04] 12-May-92 stevenl: Added TDESCKIND_Object to the IsSimpleType fn.
+* [05] 15-Nov-92 RajivK: Added GetTimeStamp()
+* [06] 17-Nov-92 RajivK: Added GetTypelibOfLibId()
+* [07] 25-Dec-92 RajivK: Added GetExecutingProject()
+* [08] 18-Jan-93 w-peterh: use new TYPEDESCKIND values
+* [09] 10-Feb-93 RajivK: Added IsModuleFrameOnStack() && IsBasicFrameOnStack()
+* [10] 12-Feb-93 w-peterh: added itdesc utils,
+* changed IsSimpleType to accept Int/Uint
+* 16-Feb-93 w-jeffc: added HinstOfOLB
+* [11] 23-Feb-93 RajivK: Changed AppDataInit() to use IMalloc Interface
+* [12] 23-Feb-93 RajivK: Added ReleaseStackResources()
+* [13] 02-Mar-93 w-peterh: added VtValidInVariant() and VtValidInVariantArg()
+* added SizeEnumOfSysKind()
+* [14] 24-Mar-93 dougf: Added TDESCKIND_LPSTR to the IsSimpleType fn.
+* [15] 04-Apr-93 RajivK: Support for Typelib on MAC
+* [16] 30-Apr-93 w-jeffc: made DEFN data members private
+* [17] 22-May-93 w-barryb: Rename OB to VBA
+* [18] 20-Jul-93 Suresh: Undid the '-' to '\' hack we had for pre 4.2 ole
+* [19] 30-Jul-93 JeffRob: Use PEXFRAME and PEXFRAME_NULL (OOB bug #756)
+* [20] 22-Sep-93 RajivK: Support for accent and case insensitive comparision/Tables.
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "typelib.hxx"
+#include "silver.hxx"
+
+#include "xstring.h"
+#include <time.h>
+#include <ctype.h> // for isspace() et al.
+#include "cltypes.hxx"
+#include "clutil.hxx"
+#include "stdlib.h"
+#include "tdata.hxx" // for TYPE_DATA
+#include "exbind.hxx" // for EXBIND
+#include "tls.h"
+#include "stream.hxx"
+#include "gdtinfo.hxx"
+#include "impmgr.hxx"
+#include "bstr.h"
+
+#include "oletmgr.hxx"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+#pragma hdrstop(RTPCHNAME)
+
+#if OE_WIN32
+STDAPI CoSetState(IUnknown FAR* punk); // from OLE32.DLL
+STDAPI_(void) ReleaseBstrCache(APP_DATA *); // from BSTR.CPP
+#endif //OE_WIN32
+
+#if OE_MAC
+#include <ctype.h>
+#include "macos\resource.h"
+#include "macos\files.h"
+#include "macos\errors.h"
+#include "macos\folders.h"
+#include "macos\textutil.h"
+#include "macos\osutils.h"
+#include "sysutils.h"
+#endif
+
+#if OE_WIN16
+#include "dos.h"
+#endif // OE_WIN16
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+static char szOleClutilCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleClutilCxx
+#else
+static char szClutilCxx[] = __FILE__;
+#define SZ_FILE_NAME szClutilCxx
+#endif
+#endif //ID_DEBUG
+
+#if OE_MAC
+#define g_rgbExcepTblNew Og_rgbExcepTblNew
+#define g_rgbPartialBaseTblMEngIreland Og_rgbPartialBaseTblMEngIreland
+#define g_rgbPartialBaseTblMNorwegian Og_rgbPartialBaseTblMNorwegian
+#define g_rgbPartialBaseTblMGreek Og_rgbPartialBaseTblMGreek
+#define g_rgbPartialBaseTblWEngIreland Og_rgbPartialBaseTblWEngIreland
+#define g_rgbPartialBaseTblWNorwegian Og_rgbPartialBaseTblWNorwegian
+#define g_rgbPartialBaseTblWTurkish Og_rgbPartialBaseTblWTurkish
+#define g_rgbPartialBaseTblWIceland Og_rgbPartialBaseTblWIceland
+#define g_rgbPartialBaseTblWGreek Og_rgbPartialBaseTblWGreek
+#endif // OE_MAC
+
+
+
+
+#if OE_MAC
+OLECHAR FAR* szPlatSubkey1 = "mac";
+#elif OE_WIN16
+OLECHAR FAR* szPlatSubkey1 = "win16";
+OLECHAR FAR* szPlatSubkey2 = "win32";
+#elif OE_WIN32
+OLECHAR FAR* szPlatSubkey1 = L"win32";
+OLECHAR FAR* szPlatSubkey2 = L"win16";
+#else
+#error "unexpected OE"
+#endif // OE_WIN32
+
+#if OE_MAC
+
+EBERR GetPathFromFSSpec(const FSSpec *pfsspec, char *pchPathname, UINT cbPathname)
+{
+ long parID;
+ char * pchPathnameLim = pchPathname+cbPathname;
+ XCHAR rgchFileString[_MAX_PATH+1];
+ CInfoPBRec dirParmblk;
+ ParamBlockRec volParmblk;
+
+ // determine name from FSSpec volume reference number
+
+ volParmblk.volumeParam.ioNamePtr = (unsigned char *)pchPathname;
+ volParmblk.volumeParam.ioVRefNum = pfsspec->vRefNum;
+ volParmblk.volumeParam.ioVolIndex = 0;
+
+ if (PBGetVInfoSync(&volParmblk) != noErr)
+ return TIPERR_PathNotFound;
+
+ // convert PSTR volume name to C string, add a null
+ // and point to it
+
+ p2cstr((unsigned char *)pchPathname);
+ pchPathname += strlen(pchPathname);
+ DebAssert(pchPathname < pchPathnameLim, "rtGetPathFromFSSpec");
+ *pchPathname = '\0';
+
+ // start with parent ID of resulting file
+
+ parID = pfsspec->parID;
+
+ // while directory is not root of volume, process it
+
+ if (parID != fsRtParID) {
+ while (parID != fsRtDirID) {
+
+ // determine name from FSSpec parent directory index
+
+ dirParmblk.hFileInfo.ioNamePtr = (unsigned char *)&rgchFileString;
+ dirParmblk.hFileInfo.ioVRefNum = pfsspec->vRefNum;
+ dirParmblk.hFileInfo.ioDirID = parID;
+ dirParmblk.hFileInfo.ioFDirIndex = -1;
+
+ if (PBGetCatInfoSync(&dirParmblk) != noErr)
+ return TIPERR_PathNotFound;
+
+ // convert PSTR directory name to C string,
+ // and insert it preceded by a colon into result
+
+ if (pchPathname+(unsigned char)rgchFileString[0]+1 >= pchPathnameLim)
+ return TIPERR_PathNotFound;
+
+ p2cstr((unsigned char *)rgchFileString);
+ memmove(pchPathname + strlen(rgchFileString) + 1, pchPathname,
+ strlen(pchPathname) + 1);
+ *pchPathname = ':';
+ strncpy(pchPathname + 1, rgchFileString, strlen(rgchFileString));
+
+ // get parent directory next level up
+
+ parID = dirParmblk.hFileInfo.ioFlParID;
+ }
+
+ // copy the FSSpec filename to the path with
+ // its terminating null
+
+ if (pchPathname + pfsspec->name[0] + 1 >= pchPathnameLim)
+ return TIPERR_PathNotFound;
+
+ p2cstr((unsigned char *)pfsspec->name);
+ pchPathname += strlen(pchPathname);
+ *pchPathname++ = ':';
+ strcpy(pchPathname, (char *)&(pfsspec->name));
+ }
+
+
+ // restore *pfsspec.
+ c2pstr((char *)pfsspec->name);
+
+ return TIPERR_None;
+}
+
+#pragma code_seg(CS_INIT)
+EBERR GetFSSpecOfAliasPath(char *pchPathname, FSSpec *pfsspec,
+ BOOL *pbAliasSeen, char **ppchEnd,
+ BOOL fResolveFile)
+{
+ TIPERROR eberr = TIPERR_None;
+ OSErr err = noErr;
+ Boolean bIsFolder;
+ Boolean bWasAlias;
+ Boolean bAliasSeen = FALSE;
+
+ char chFileString[_MAX_PATH+1];
+
+ char * pchStart;
+ char * pchEnd;
+ char * pchTemp = chFileString;
+
+ // get the substring of the device
+
+ pchStart = pchPathname;
+ pchEnd = xstrchr(pchStart, ':');
+
+ //UNDONE MAC: need to resolve aliases to volumes here
+
+ // if no folder, then return immediately
+
+ if (!pchEnd || *(pchEnd + 1) == '\0')
+ return TIPERR_None;
+
+ // copy device to temp string
+
+ strncpy(pchTemp, pchStart, pchEnd - pchStart);
+ pchTemp += pchEnd - pchStart;
+
+ // get substring of the first folder
+
+ pchStart = pchEnd;
+ pchEnd = xstrchr(pchStart + 1, ':');
+ if (!pchEnd)
+ pchEnd = xstrchr(pchStart + 1, '\0');
+ strncpy(pchTemp, pchStart, pchEnd - pchStart);
+ pchTemp += pchEnd - pchStart;
+
+ // terminate the device and first folder substring
+
+ *pchTemp = '\0';
+
+ // convert "device:folder1" to a PSTR for FSSpec processing
+
+ c2pstr(chFileString);
+
+ // from full pathname in pchPathname make a file specification
+
+ err = FSMakeFSSpec(0, 0, (unsigned char *)chFileString, pfsspec);
+
+ // resolve any alias chains from "device:folder1"
+
+ if (err == noErr && MacEnvHasAliasMgr()) {
+
+ err = ResolveAliasFile(pfsspec, TRUE, &bIsFolder, &bWasAlias);
+ bAliasSeen |= bWasAlias;
+ }
+
+ // update *pfsspec with the next folder string if it exists
+
+ while (err == noErr && *pchEnd == ':' && *(pchEnd + 1) != '\0') {
+
+ // move :<pfsspec->name>:<next folder> string to array
+
+ pchTemp = chFileString;
+ *pchTemp++ = ':';
+ p2cstr(pfsspec->name);
+ strcpy(pchTemp, (char *)&(pfsspec->name));
+ pchTemp += strlen(pchTemp);
+
+ // get the next folder string and copy it to the array
+
+ pchStart = pchEnd;
+
+ pchEnd = xstrchr(pchStart + 1, ':');
+ if (!pchEnd)
+ pchEnd = xstrchr(pchStart + 1, '\0');
+
+ strncpy(pchTemp, pchStart, pchEnd - pchStart);
+ pchTemp += pchEnd - pchStart;
+ *pchTemp = '\0';
+
+ // convert "device:folder1" to a PSTR for FSSpec processing
+
+ c2pstr(chFileString);
+
+ err = FSMakeFSSpec(pfsspec->vRefNum, pfsspec->parID,
+ (unsigned char *)chFileString, pfsspec);
+
+ if (*pchEnd == 0 && !fResolveFile)
+ // Only file part is left, don't resolve the alias.
+ break;
+
+ if (err == noErr && MacEnvHasAliasMgr()) {
+
+ err = ResolveAliasFile(pfsspec, TRUE, &bIsFolder, &bWasAlias);
+ bAliasSeen |= bWasAlias;
+ }
+ }
+
+ // finished scan or error was found, if error was fnfErr and scan
+ // was finished, treat as no error and FSSpec is valid
+
+ if (err == fnfErr && (*pchEnd == '\0' ||
+ (*pchEnd == ':' && *(pchEnd + 1) == '\0')))
+ err = noErr;
+
+ *pbAliasSeen = bAliasSeen;
+ *ppchEnd = pchEnd;
+
+ if (err != noErr) {
+ eberr = TIPERR_PathNotFound;
+ }
+
+ return eberr;
+}
+#pragma code_seg()
+
+/***
+*EBERR GetPathFromAlias - Converts alias record to a fullpath.
+*Inputs:
+* halias - The alias record's handle.
+*
+*Outputs:
+* If the file represented by the alias is found, its fullpath
+* is copied into the output buffer pchPathname. If the resolution
+* of halias involved modifying the alias record, *pwasChanged is
+* set to a non-zero value. Otherwise, it is set to 0.
+*
+* If unsuccessful, the appropriate error code is returned.
+***************************************************************/
+EBERR GetPathFromAlias(AliasHandle halias, char *pchPathname, UINT cbPathname, BOOL *pwasChanged)
+{
+ FSSpec fsspec;
+
+ DebAssert(MacEnvHasAliasMgr(), "GetPathFromAlias");
+
+ // Resolve the alias.
+ if (ResolveAlias(NULL, halias, &fsspec, (unsigned char *)pwasChanged))
+ return TIPERR_PathNotFound;
+
+ // Convert the returned fsspec into a fullpath.
+ if (GetPathFromFSSpec(&fsspec, pchPathname, cbPathname))
+ return TIPERR_PathNotFound;
+
+ return TIPERR_None;
+}
+
+/***
+*EBERR GetAliasFromPath - Converts fullpath to an alias record.
+*Inputs:
+* szPathname - The fullpath.
+*
+*Outputs:
+* If successful, a new alias record is created that can be used
+* (by GetPathFromAlias) to robustly find the specified file later.
+* *phalias is set to point at this new alias record.
+*
+* If unsuccessful, the appropriate error code is returned (most
+* likely out of memory).
+*********************************************************************/
+#pragma code_seg(CS_INIT)
+EBERR GetAliasFromPath(LPSTR szPathname, AliasHandle *phalias)
+{
+ FSSpec fsspec;
+ char *pchEnd;
+ BOOL wasAliased;
+ TIPERROR err;
+ OSErr oserr;
+
+ DebAssert(MacEnvHasAliasMgr(), "GetPathFromAlias");
+
+ // Convert the path to an fsspec, accounting for alias files.
+ IfErrRet(GetFSSpecOfAliasPath(szPathname, &fsspec, &wasAliased, &pchEnd, TRUE));
+
+ // Create an alias record from the fsspec.
+ oserr = NewAlias(NULL, &fsspec, phalias);
+ if (oserr != noErr){
+ // This is not very good. For example, NewAlias will return
+ // (-120) dirNFErr - directory not found, if the given path only
+ // contains the volume name.
+ //
+ // The caller of this routine needs to be careful not to take
+ // the errors it gets back from the routine too seriously.
+ //
+ return TIPERR_OutOfMemory;
+ }
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+/***
+*TIPERROR MacFileSearch - Searches for a filename on the mac.
+*
+*Inputs:
+* szFile - The name (no path portion) of the file to find.
+*
+*Outputs:
+* If the file is found, the full path is returned in *pbstr.
+* Otherwise, TIPERR_FileNotFound is returned.
+*
+*Implementation:
+* The TypelibFolder key in the registry entry is used to obtain the
+* "standard" typelib location, both as a path and as an alias (system7).
+* If the file is not in the standard typelib folder (or if one isn't
+* registered), try the mac's <0,0,name> search (current folder, then
+* system folder).
+**************************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR MacFileSearch(LPSTR szFile, BSTRA *pbstr)
+{
+ BSTRA bstrFolder, bstr;
+ struct _stat statBuf;
+ TIPERROR err;
+ FSSpec fsspec;
+ XCHAR rgchPathName[256];
+ OSErr oserr;
+
+ // Get the registered typelib folder's path.
+ if ((err = TiperrOfHresult(QueryTypeLibFolder(&bstrFolder))) == TIPERR_None) {
+
+ // Combine the filename with that folder's path.
+ err = MakeAbsolutePath(bstrFolder, szFile, &bstr);
+ FreeBstr(bstrFolder);
+ if (err)
+ return err;
+
+ // If the resulting file exists, return success.
+ if (_stat(bstr, &statBuf) != -1) {
+ *pbstr = bstr;
+ return TIPERR_None;
+ }
+
+ // Otherwise, free the guess and try the <0,0,name>.
+ FreeBstr(bstr);
+ }
+
+ // Mac "Poor Man's Search Path"
+ // 1. Look in Current Drive, Current Directory.
+ // 2. Look in System Folder of Boot Drive.
+ //
+ c2pstr(szFile);
+ oserr = FSMakeFSSpec(0, 0, (unsigned char*)szFile, &fsspec);
+ if (oserr) {
+ // Locate the System Folder.
+ oserr = FindFolder( ((short)kOnSystemDisk),
+ kSystemFolderType,
+ kDontCreateFolder,
+ &fsspec.vRefNum,
+ &fsspec.parID );
+ if (oserr) {
+ err = TIPERR_FileNotFound;
+ goto Error;
+ }
+
+ oserr = FSMakeFSSpec(fsspec.vRefNum, fsspec.parID,
+ (unsigned char *)szFile, &fsspec);
+ if (oserr) {
+ err = TIPERR_FileNotFound;
+ goto Error;
+ }
+ }
+
+ // At this point, we should have a valid FSSpec to a file or have exited.
+ IfErrRet(GetPathFromFSSpec(&fsspec, rgchPathName, sizeof(rgchPathName)));
+ if ((bstr = AllocBstr(rgchPathName)) == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ *pbstr = bstr;
+ err = TIPERR_None;
+
+Error:
+ p2cstr((unsigned char*)szFile);
+ return err;
+}
+#pragma code_seg()
+#endif // OE_MAC
+
+
+/***
+*TIPERROR IsUnqualifiable - Can this modules be bound to?
+*
+*Purpose:
+* To determine whether a given ITypeInfo can be bound to
+* in an unqualified way.
+*
+*Inputs:
+* ptinfo - The ITypeInfo to look for
+*
+*Outputs:
+* returns TRUE if bindable
+*
+* NOTE: This can fail, and if so, the results are FALSE
+*
+******************************************************************************/
+#pragma code_seg( CS_CORE2 )
+BOOL IsUnqualifiable(GEN_DTINFO *pgdtinfo)
+{
+ BOOL fUnqual = FALSE;
+ TIPERROR err = TIPERR_None;
+
+ DebAssert(pgdtinfo, "Bad typeinfo");
+
+ // Check the typekind
+ switch (pgdtinfo->GetTypeKind()) {
+ case TKIND_ENUM:
+ case TKIND_MODULE:
+ fUnqual = TRUE;
+ break;
+
+ case TKIND_COCLASS:
+ // In the COCLASS case, we must check to see
+ // if this is an appobj.
+ //
+ if (pgdtinfo->Pdtroot()->GetTypeFlags() & TYPEFLAG_FAPPOBJECT) {
+ fUnqual = TRUE;
+ break;
+ }
+ }
+
+ return fUnqual;
+}
+#pragma code_seg()
+
+
+
+
+
+
+
+#if ID_TEST
+/***
+*PUBLIC DebGetNameCacheStats
+*Purpose:
+* Gets the name cache stats for a non-OB type library. Used
+* in tclcmds.
+*
+*Entry:
+* pgtlibole - the typelib to get the stats from
+*
+*Exit:
+* cProjTrys, cProjHits, cModTrys, cModHits, cGlobHits - the stats
+*
+***********************************************************************/
+STDAPI DebGetNameCacheStats(ITypeLibA FAR* ptlib, UINT FAR* cProjTrys,
+ UINT FAR* cProjHits, UINT FAR* cModTrys,
+ UINT FAR* cModHits, UINT FAR* cGlobHits)
+{
+ GenericTypeLibOLE *pgtlibole = (GenericTypeLibOLE *)ptlib;
+
+ *cModTrys = pgtlibole->DebGetNameCacheModTrys();
+ *cModHits = pgtlibole->DebGetNameCacheModHits();
+ *cGlobHits = pgtlibole->DebGetNameCacheGlobHits();
+
+ return NOERROR;
+}
+#endif //ID_TEST
+
+// Static data members needed for fast comparision of strings.
+//
+static LCID Rby_lcidCur;
+static BOOL Rby_fEuroLcid;
+
+#define UNKNOWN -1
+// Define static array of intrinsic type sizes
+//
+// NOTE: there are three different tables - one each for SYS_WIN32,
+// SYS_MAC and SYS_WIN16. It is assumed that the sizes of things
+// in the table (ie DATE) will NOT CHANGE BETWEEN PLATFORMS RUNNING
+// THE SAME OS. (ie an int on win32 intel is the same size as
+// an int on win32 alpha) If this is not the case, these table
+// must be extended.
+//
+char NEARDATA g_rgrgcbSizeType[SYS_MAX][TDESCKIND_MAX] = {
+
+// SYS_WIN16 sizes
+{
+/* 0 */ UNKNOWN, // "Empty"
+/* 1 */ UNKNOWN, // "Null"
+/* 2 */ 2, // "I2"
+/* 3 */ 4, // "I4"
+/* 4 */ 4, // "R4"
+/* 5 */ 8, // "R8"
+/* 6 */ 8, // "Currency"
+/* 7 */ sizeof(DATE), // "Date"
+/* 8 */ 4, // "String"
+/* 9 */ 4, // "Object"
+/* 10 */ sizeof(SCODE), // "Error"
+/* 11 */ 2, // "Bool"
+/* 12 */ sizeof(VARIANT), // "Value"
+/* 13 */ 4, // "IUnknown"
+/* 14 */ 4, // "WideString"
+/* 15 */ UNKNOWN, // no vartype
+/* 16 */ 1, // "I1"
+/* 17 */ 1, // "UI1"
+/* 18 */ 2, // "UI2"
+/* 19 */ 4, // "UI4"
+/* 20 */ 8, // "I8"
+/* 21 */ 8, // "UI8"
+/* 22 */ 2, // *** "Int"
+/* 23 */ 2, // *** "Uint"
+/* 24 */ 0, // "Void" (note: only one that's 0)
+/* 25 */ sizeof(HRESULT), // "Hresult"
+/* 26 */ 4, // "Ptr"
+/* 27 */ sizeof(ARRAYDESC FAR *), // "BasicArray" -- resizeable is default
+/* 28 */ UNKNOWN, // "Carray"
+/* 29 */ UNKNOWN, // "UserDefined"
+/* 30 */ 4, // "LPSTR"
+/* 31 */ 4, // "LPWSTR"
+}
+,
+
+// SYS_WIN32 sizes
+{
+/* 0 */ UNKNOWN, // "Empty"
+/* 1 */ UNKNOWN, // "Null"
+/* 2 */ 2, // "I2"
+/* 3 */ 4, // "I4"
+/* 4 */ 4, // "R4"
+/* 5 */ 8, // "R8"
+/* 6 */ 8, // "Currency"
+/* 7 */ sizeof(DATE), // "Date"
+/* 8 */ 4, // "String"
+/* 9 */ 4, // "Object"
+/* 10 */ sizeof(SCODE), // "Error"
+/* 11 */ 2, // "Bool"
+/* 12 */ sizeof(VARIANT), // "Value"
+/* 13 */ 4, // "IUnknown"
+/* 14 */ 4, // "WideString"
+/* 15 */ UNKNOWN, // no vartype
+/* 16 */ 1, // "I1"
+/* 17 */ 1, // "UI1"
+/* 18 */ 2, // "UI2"
+/* 19 */ 4, // "UI4"
+/* 20 */ 8, // "I8"
+/* 21 */ 8, // "UI8"
+/* 22 */ 4, // *** "Int"
+/* 23 */ 4, // *** "Uint"
+/* 24 */ 0, // "Void" (note: only one that's 0)
+/* 25 */ sizeof(HRESULT), // "Hresult"
+/* 26 */ 4, // "Ptr"
+/* 27 */ sizeof(ARRAYDESC FAR *), // "BasicArray" -- resizeable is default
+/* 28 */ UNKNOWN, // "Carray"
+/* 29 */ UNKNOWN, // "UserDefined"
+/* 30 */ 4, // "LPSTR"
+/* 31 */ 4, // "LPWSTR"
+}
+,
+
+// SYS_MAC sizes
+{
+/* 0 */ UNKNOWN, // "Empty"
+/* 1 */ UNKNOWN, // "Null"
+/* 2 */ 2, // "I2"
+/* 3 */ 4, // "I4"
+/* 4 */ 4, // "R4"
+/* 5 */ 8, // "R8"
+/* 6 */ 8, // "Currency"
+/* 7 */ sizeof(DATE), // "Date"
+/* 8 */ 4, // "String"
+/* 9 */ 4, // "Object"
+/* 10 */ sizeof(SCODE), // "Error"
+/* 11 */ 2, // "Bool"
+/* 12 */ sizeof(VARIANT), // "Value"
+/* 13 */ 4, // "IUnknown"
+/* 14 */ 4, // "WideString"
+/* 15 */ UNKNOWN, // no vartype
+/* 16 */ 1, // "I1"
+/* 17 */ 1, // "UI1"
+/* 18 */ 2, // "UI2"
+/* 19 */ 4, // "UI4"
+/* 20 */ 8, // "I8"
+/* 21 */ 8, // "UI8"
+/* 22 */ 4, // *** "Int"
+/* 23 */ 4, // *** "Uint"
+/* 24 */ 0, // "Void" (note: only one that's 0)
+/* 25 */ sizeof(HRESULT), // "Hresult"
+/* 26 */ 4, // "Ptr"
+/* 27 */ sizeof(ARRAYDESC FAR *), // "BasicArray" -- resizeable is default
+/* 28 */ UNKNOWN, // "Carray"
+/* 29 */ UNKNOWN, // "UserDefined"
+/* 30 */ 4, // "LPSTR"
+/* 31 */ 4, // "LPWSTR"
+}
+
+}; // end of g_rgrgcbSizeType
+
+
+// Define static array of intrinsic type alignments
+// UNKNOWN indicates unknown -- needs to be computed on the fly.
+//
+// These alignment values are the largest necessary - they are scaled down
+// using the ICreateTypeInfo::SetAlignment function.
+//
+char NEARDATA g_rgcbAlignment[TDESCKIND_MAX] =
+{
+/* 0 */ UNKNOWN, // "Empty",
+/* 1 */ UNKNOWN, // "Null",
+/* 2 */ 2, // "I2",
+/* 3 */ 4, // "I4",
+/* 4 */ 4, // "R4",
+/* 5 */ 8, // "R8",
+/* 6 */ 8, // "Currency",
+/* 7 */ 8, // "Date",
+/* 8 */ 4, // "String",
+/* 9 */ 4, // "Object",
+/* 10 */ 4, // "Error",
+/* 11 */ 2, // "Bool",
+/* 12 */ 8, // "Value",
+/* 13 */ 4, // "IUnknown",
+/* 14 */ 4, // "WideString",
+/* 15 */ UNKNOWN, // no vartype
+/* 16 */ 1, // "I1",
+/* 17 */ 1, // "UI1",
+/* 18 */ 2, // "UI2",
+/* 19 */ 4, // "UI4",
+/* 20 */ 8, // "I8",
+/* 21 */ 8, // "UI8",
+/* 22 */ 4, // "Int",
+/* 23 */ 4, // "Uint",
+/* 24 */ 0, // "Void", (NOTE: only one that's 0)
+/* 25 */ 4, // "Hresult",
+/* 26 */ 4, // "Ptr",
+/* 27 */ 4, // "BasicArray", -- resizeable is default.
+/* 28 */ UNKNOWN, // "Carray"
+/* 29 */ UNKNOWN, // "UserDefined",
+/* 30 */ 4, // "LPSTR",
+/* 31 */ 4, // "LPWSTR",
+};
+
+
+
+
+// ************************************
+// mapping and sizeof VARTYPE functions
+// ************************************
+
+
+#if ID_DEBUG
+// These datamembers are defined here to ensure that all the objects
+// required for typelib.dll are linked into mebapp.exe
+#if OE_MAC
+
+// WARNING : WARNING : WARNING : WARNING : WARNING : WARNING :
+// Do not remove any symbol from this list. Other wise on MAC the linker
+// will screw up and link to the wrong definition and cause more GRIEF then
+// you can imagine.
+
+extern char szOleBlkmgrCxx[];
+extern char szOleDfntbindCxx [];
+extern char szOleDfntcompCxx[];
+extern char szOleDfstreamCxx[];
+extern char szOleDtbindCxx[];
+extern char szOleDtmbrs[];
+extern char szOleGDTInfoCxx[];
+extern char szOleEntryMgrCxx[];
+extern char szOleGptbindCxx[];
+extern char szOleImpmgrCxx[];
+extern char szOleMemCxx[];
+extern char szOleSheapmgrCxx[];
+extern char szOleNammgrCxx[];
+extern char szOleTdataCxx[];
+extern char szOleTdata2Cxx[];
+extern char szOleDebugCxx[];
+extern char szOleRtsheapCxx[];
+extern char szOleFstreamCxx[];
+
+
+
+XCHAR *g_rgMapFileNameType[] = {
+ szOleBlkmgrCxx, szOleClutilCxx, szOleDfntbindCxx ,
+ szOleDfntcompCxx, szOleDfstreamCxx , szOleDtbindCxx,
+ szOleDtmbrs, szOleGDTInfoCxx, szOleEntryMgrCxx, szOleGptbindCxx,
+ szOleImpmgrCxx, szOleMemCxx, szOleDebugCxx, szOleSheapmgrCxx,
+ szOleNammgrCxx, szOleTdataCxx, szOleTdata2Cxx,
+ szOleFstreamCxx, szOleRtsheapCxx
+};
+
+#endif // OE_MAC
+
+#endif // ID_DEBUG
+
+/***
+*void GetTimeStamp() - Returns an ascii time stamp to the specified buffer.
+*
+*Purpose:
+* Constructs an ascii timestamp and puts it into the specified buffer.
+*
+*Inputs:
+* None
+*
+*Outputs:
+* pchTimeStamp - The buffer in which the timestamp is placed. The
+* length of the string placed in the buffer will always
+* be CCH_TIMESTAMP_LENGTH. The string is terminated with
+* '\0', so pbTimeStamp must point to at least
+* CCH_TIMESTAMP_LENGTH+1 characters.
+******************************************************************************/
+#if OE_WIN16
+// Windows call to execute Int 21 - not defined in WINDOWS.H
+extern "C" {void PASCAL DOS3CALL(void);}
+#endif
+
+#pragma code_seg(CS_CORE)
+void GetTimeStamp(OLECHAR *pchTimeStamp)
+{
+ static BYTE bUnique;
+#if OE_WIN32
+ SYSTEMTIME st;
+ ULONG ul;
+
+ GetLocalTime(&st);
+ pchTimeStamp[0] = '0' + (bUnique>>4);
+ pchTimeStamp[1] = '0' + (bUnique&0x0f);
+ bUnique++;
+ ul = st.wSecond+st.wMinute*60+st.wHour*3600+st.wDay*86400+st.wMonth*2678400+(st.wYear-1970)*32140800;
+ oultoa(ul, pchTimeStamp+2, 16);
+#elif OE_WIN16
+ ULONG ul;
+ int iYear;
+ char chMonth, chDay, chHour, chMinute, chSecond;
+
+ __asm {
+ mov ah, 0x2a ; GetDate
+ call DOS3CALL
+ mov iYear, cx
+ mov chMonth, dh
+ mov chDay, dl
+
+ mov ah, 0x2c ; GetTime
+ call DOS3CALL
+ mov chHour, ch
+ mov chMinute, cl
+ mov chSecond, dh
+ }
+ pchTimeStamp[0] = '0' + (bUnique>>4);
+ pchTimeStamp[1] = '0' + (bUnique&0x0f);
+ bUnique++;
+ ul = chSecond+chMinute*60+chHour*3600+chDay*86400+chMonth*2678400+(iYear-1970)*32140800;
+ oultoa(ul, pchTimeStamp+2, 16);
+#else
+ time_t timestamp;
+
+ time(&timestamp);
+ oultoa((ULONG)bUnique++, pchTimeStamp, 16);
+ oultoa((ULONG)timestamp, pchTimeStamp+ostrblen(pchTimeStamp), 16);
+#endif //OE_WIN32
+}
+#pragma code_seg()
+
+
+
+/***
+*TIPERROR SzLibIdLocalTypeIdOfTypeId() - Parses TypeId.
+*
+* Purpose:
+* Parses a TypeId into constituent LibId and Local TypeId.
+*
+* Inputs:
+* szTypeId - The TypeId to dismember (IN).
+*
+* Outputs:
+* If successful:
+* *pbstrLibId is set to a BSTR copy of the LibId (OUT).
+* *pszLocalTypeId is set to point at the Local TypeId (points into
+* szTypeId).
+* Return TIPERR_None.
+*
+* If invalid TypeId, returns TIPERR_BadTypeId.
+* If fails for some other reason (e.g. OutOfMemory), return appropriate
+* TIPERROR value. If fails, *pbstrLibId and *pszLocalTypeId remain
+* unchanged.
+******************************************************************************/
+
+TIPERROR SzLibIdLocalTypeIdOfTypeId(LPOLESTR szTypeId, BSTR *pbstrLibId, LPOLESTR *pszLocalTypeId)
+{
+ LPOLESTR pch;
+ BSTR bstr;
+
+ // If the first character of the TypeId is not an asterisk, then it
+ // refers to a registered TypeId and contains no LibId component.
+ if (szTypeId[0] != WIDE('*')) {
+ *pszLocalTypeId = szTypeId;
+ if (pbstrLibId != NULL)
+ *pbstrLibId = NULL;
+ return TIPERR_None;
+ }
+
+ // Otherwise, locate the last asterisk in the string.
+ pch = ostrrchr(szTypeId, WIDE('*'));
+
+ // It had better not be the initial asterisk.
+ if (pch == szTypeId)
+ return TIPERR_BadTypeId;
+
+ // It is the delimiter between the libid and the local typeid,
+ // so make a copy of the libid and point at the local typeid.
+ // Only copy the libId if the caller requested the libId portion.
+
+ if (pbstrLibId != NULL) {
+ if ((bstr = AllocBstrLen(szTypeId, pch-szTypeId)) == NULL)
+ return TIPERR_OutOfMemory;
+
+ *pbstrLibId = bstr;
+ }
+
+ *pszLocalTypeId = pch+1;
+ return TIPERR_None;
+}
+
+
+
+
+BOOL IsSimpleType(TYPEDESCKIND tdesckind)
+{
+ switch (tdesckind) {
+ case TDESCKIND_Ptr:
+ case TDESCKIND_UserDefined:
+ case TDESCKIND_BasicArray:
+ case TDESCKIND_Carray:
+ return FALSE;
+ case TDESCKIND_UI1:
+ case TDESCKIND_I1:
+ case TDESCKIND_UI2:
+ case TDESCKIND_I2:
+ case TDESCKIND_UI4:
+ case TDESCKIND_I4:
+ case TDESCKIND_UI8:
+ case TDESCKIND_I8:
+ case TDESCKIND_R4:
+ case TDESCKIND_R8:
+ case TDESCKIND_Void:
+ // Beyond this point, not necessarily supported by all impls.
+ case TDESCKIND_String:
+ case TDESCKIND_Currency:
+ case TDESCKIND_Date:
+ case TDESCKIND_Value:
+ case TDESCKIND_Object:
+ case TDESCKIND_IUnknown:
+ case TDESCKIND_Int:
+ case TDESCKIND_Uint:
+ case TDESCKIND_HResult:
+ case TDESCKIND_Bool:
+ case TDESCKIND_Error:
+ case TDESCKIND_LPSTR:
+ case TDESCKIND_LPWSTR:
+ return TRUE;
+ case TDESCKIND_Empty:
+ case TDESCKIND_Null:
+ default:
+ DebHalt("bad tdesckind.");
+ return FALSE;
+ }
+}
+
+
+
+
+/***
+*HashSz
+*Purpose:
+* Compute random value based on sz
+* ANY MODIFICATIONS TO THIS FUNCTION SHOULD ALSO BE DONE FOR HashSzTerm
+*
+*Entry:
+* sz
+*
+*Exit:
+* UINT containing hash value
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+UINT HashSz(LPOLESTR szW)
+
+//UNDONE OA95: use _rotr to compute hash once it can be inlined
+// Pragma below causes following error from compiler:
+// error C2164: '_rotr' : intrinsic function not declared
+//
+// #pragma intrinsic(_rotr) //ensure _rotr is inlined
+//
+{
+#if FV_UNICODE
+#if HP_16BIT
+#error UINT not big enough to hold two characters
+#endif
+#endif
+ UINT Sum = 0;
+ XCHAR *pch;
+
+ DebAssert(szW != 0, "HashSz zero length sz");
+
+#if OE_WIN32
+ LPSTR sz;
+
+ if (ConvertStringToA(szW, &sz))
+ return 0; // UNDONE OA95: out of memory
+#else
+ #define sz szW
+#endif
+
+ pch = sz;
+
+// Process the string two characters at a time
+// If FV_UNICODE this means two words at a time otherwise one word at a time
+
+ for (;;) {
+
+#if FV_UNICODE
+ Sum += *(DWORD *)pch;
+// Sum = _rotr(Sum,3) ^ *(DWORD *)pch;
+#else
+ Sum += *(WORD *)pch;
+// Sum = _rotr(Sum,3) ^ *(WORD *)pch;
+#endif
+
+ // Exit if second char of two chars just used was zero
+ // Note that we don't care about DBCS character boundaries,
+ // so ++ is ok.
+ pch++;
+ if (*pch == 0)
+ break;
+
+ // Exit if first char of next two chars is zero
+ pch++;
+ if (*pch == 0)
+ break;
+ }
+
+#if OE_WIN32
+ ConvertStringFree(sz);
+#else
+ #undef sz
+#endif
+
+ Sum ^= Sum >> 8;
+ return Sum;
+}
+#pragma code_seg()
+
+/***
+*HashSzTerm
+*Purpose:
+* Exactly the same as HashSz above except checks for a specific
+* terminating character in addition to the null character
+* ANY MODIFICATIONS TO THIS FUNCTION SHOULD ALSO BE DONE FOR HashSz
+*
+*Entry:
+* sz
+*
+*Exit:
+* UINT containing hash value
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CORE2)
+UINT HashSzTerm(LPOLESTR szW, XCHAR xchTerm)
+
+//UNDONE OA95: use _rotr to compute hash once it can be inlined
+// Pragma below causes following error from compiler:
+// error C2164: '_rotr' : intrinsic function not declared
+//
+// #pragma intrinsic(_rotr) //ensure _rotr is inlined
+//
+{
+#if FV_UNICODE
+#if HP_16BIT
+#error UINT not big enough to hold two characters
+#endif
+#endif
+ UINT Sum = 0;
+ XCHAR *pch;
+
+ DebAssert(szW != 0, "HashSz zero length sz");
+
+#if OE_WIN32
+ LPSTR sz;
+
+ if (ConvertStringToA(szW, &sz))
+ return 0; // UNDONE OA95: out of memory
+#else
+ #define sz szW
+#endif
+
+ pch = sz;
+
+// Process the string two characters at a time
+// If FV_UNICODE this means two words at a time otherwise one word at a time
+
+ for (;;) {
+
+#if FV_UNICODE
+ // UNONDE : this needs to be fixed to work across different platform.
+ Sum += *(DWORD *)pch;
+ // Sum = _rotr(Sum,3) ^ *(DWORD *)pch;
+#else
+ // Make the hash function platform independent. On BIGENDIAN machine
+ // we byte swap and then interpret is as WORD.
+#if HP_BIGENDIAN
+ Sum += (WORD) *(BYTE *)pch + ((WORD)(*(BYTE *)(pch +1)) << 8);
+#else
+ Sum += *(WORD *)pch;
+#endif
+ // Sum = _rotr(Sum,3) ^ *(WORD *)pch;
+#endif
+
+ // Exit if second char of two chars just used was zero
+ // Note that we don't care about DBCS character boundaries,
+ // so ++ is ok.
+ pch++;
+ if (*pch == xchTerm || *pch == 0)
+ break;
+
+ // Exit if first char of next two chars is zero
+ pch++;
+ if (*pch == xchTerm || *pch == 0)
+ break;
+ }
+
+#if OE_WIN32
+ ConvertStringFree(sz);
+#else
+ #undef sz
+#endif
+
+ Sum ^= Sum >> 8;
+ return Sum;
+}
+#pragma code_seg()
+
+
+// enable stack checking on these suckers -- they're potentially
+// massivly recursive
+#pragma check_stack(on)
+
+#pragma code_seg(CS_CREATE) // only used by dstrmgr code
+/***
+*PUBLIC SwapElementIndex(ULONG *rgulToSort, UINT *rguIndex, UINT iLow, UINT iHigh)
+*Purpose: Swap the element in iLow and iHigh for both
+* the array rgulToSort and rguIndex.
+*
+*Entry
+* rgulToSort, rguIndex : array's whose elements needs to be swapped
+* iLow, iHigh : index to interchange the elements.
+*
+*Exit:
+* None.
+***********************************************************************/
+VOID NEAR SwapElementIndex(ULONG *rgulToSort, UINT *rguIndex, UINT iLow, UINT iHigh)
+{
+ ULONG ulTmp=0;
+ UINT uTmp=0;
+
+ ulTmp = *(rgulToSort+iLow);
+ *(rgulToSort+iLow) = *(rgulToSort+iHigh);
+ *(rgulToSort+iHigh) = ulTmp;
+
+ // if the index array is passed then swap the index array also.
+ if (rguIndex) {
+ uTmp = *(rguIndex+iLow);
+ *(rguIndex+iLow) = *(rguIndex+iHigh);
+ *(rguIndex+iHigh) = uTmp;
+ } //if
+
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC QuickSortIndex(ULONG *rgulToSort, UINT *rguIndex, UINT uCount)
+*Purpose: QuickSort.
+*
+*
+*Entry
+*
+*
+*Exit:
+* None.
+***********************************************************************/
+VOID QuickSortIndex(ULONG *rgulToSort, UINT *rguIndex, UINT uCount)
+{
+ ULONG ulMid=0;
+ UINT iLow=0, iHigh=uCount-1;
+
+ if (uCount <= 1)
+ return;
+
+ // Get the middle element as the value for partition.
+ ulMid = *(rgulToSort + uCount/2);
+
+
+
+ while (iLow < iHigh) {
+ while((*(rgulToSort+iLow) <= ulMid) && (iLow < iHigh)) iLow++;
+
+ while((*(rgulToSort+iHigh) >= ulMid) && (iLow < iHigh)) iHigh--;
+
+ if (iLow < iHigh) {
+ // swap the numbers
+ SwapElementIndex(rgulToSort, rguIndex, iLow, iHigh);
+ } // if
+ } // while
+
+
+ DebAssert(iLow == iHigh, "Terminating condition");
+
+ // Take care of all the termination conditions. iLow and iHigh are
+ // pointing to the same location. Adjust these so that it points to the
+ // end of the subarrays.
+ if (iHigh == uCount-1) {
+ // all elements were < or = to ulMid.
+ //
+ // if the last element is ulMid then dec. iLow
+ // i.e. reduce the array size if possible.
+ if (*(rgulToSort+iHigh) < ulMid) {
+ // swap the middle element with the last element.
+ SwapElementIndex(rgulToSort, rguIndex, uCount/2, iHigh);
+ }
+ iLow--;
+
+ }
+ else {
+ if (iLow == 0) {
+ // all elements were > or = to ulMid
+ //
+ // if the last element is ulMid then inc. iHigh
+ // i.e. reduce the array size if possible.
+ if (*(rgulToSort+iHigh) > ulMid) {
+ // swap the middle element with the first element.
+ SwapElementIndex(rgulToSort, rguIndex, 0, uCount/2);
+ }
+ iHigh++;
+ }
+ else {
+ // Adjust iLow and iHigh so that these points to the right place
+ if (*(rgulToSort+iHigh) > ulMid)
+ iLow--;
+ else
+ iHigh++;
+ }
+ }
+
+ // Sort the lower sub array
+ QuickSortIndex(rgulToSort, rguIndex, (UINT)iLow+1);
+ // Sort the upper sub array
+ QuickSortIndex(rgulToSort+iLow+1, rguIndex+iLow+1, (UINT)(uCount-iLow-1));
+
+
+}
+#pragma code_seg()
+#pragma check_stack() // return to the default
+
+
+
+
+/***
+* Functions for manipulating LISTs implemented with DEFNs (managed
+* by TYPE_DATA).
+*
+*Purpose:
+* The following are functions that implement the "list" protocol.
+* These macros are used specifically by the DYN_TYPEMEMBERS
+* impl that defers to the contained TYPE_DATA.
+*
+*Implementation Notes:
+* POSITION is implemented as a DEFN handle.
+* Some functions are MEMBERINFO specific, some are general
+* to be used by INFOs.
+*
+*****************************************************************************/
+#if ID_DEBUG
+/***
+* Count - List cardinality.
+*
+*Purpose:
+* Returns size of list.
+*
+*Implementation Notes:
+* Cheapo and slow implementation -- enumerates from listhead.
+* CONSIDER: actually "wasting" an int for a m_count data member.
+*****************************************************************************/
+
+UINT Count(TYPE_DATA *ptdata, HDEFN hdefnFirst)
+{
+ /* Cheapo and slow implementation -- enumerates from listhead. */
+ // Note: we ensure no circularity by asserting that list length
+ // is < 64K.
+ //
+ UINT cElements = 0;
+ HDEFN hdefn = hdefnFirst;
+
+ while (hdefn != HDEFN_Nil) {
+ cElements++;
+ DebAssert(cElements < USHRT_MAX, "circular list.");
+ hdefn = ptdata->QdefnOfHdefn(hdefn)->HdefnNext();
+ }
+ return cElements;
+}
+#endif //ID_DEBUG
+
+
+
+
+
+
+/***
+*TIPERROR GetBStrOfHsz
+*
+*Purpose:
+* Allocate a local string containing the string in the passed in XSZ
+*
+*Entry:
+* pbm - The block manager that can dereference hsz.
+* hsz - The hsz refering to the string data to be used for initializing
+* the new BSTRA.
+*
+*Exit:
+* *plstr is set to the new lstr.
+* TIPERROR
+****************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GetBStrOfHsz(BLK_MGR *pbm, HCHUNK hsz, BSTR *pbstr)
+{
+ BSTR bstr;
+
+ // If hsz is a nil handle, return NULL.
+ if (hsz == HCHUNK_Nil) {
+ *pbstr = NULL;
+ return TIPERR_None;
+ }
+
+#if OE_WIN32
+ // Allocate and copy all at once - the Win32 sheap
+ // will not move during the alloc or copy
+ // pbm->HszLen() asumes Ansi strings so isn't valid
+ bstr = AllocBstr((LPOLESTR)pbm->QtrOfHandle(hsz));
+ if (bstr == NULL)
+ return TIPERR_OutOfMemory;
+
+ *pbstr = bstr;
+#else
+ LPOLESTR qchSrc;
+
+ // Allocate enough space for the string.
+ bstr = AllocBstrLen(NULL, pbm->HszLen(hsz));
+ if (bstr == NULL)
+ return TIPERR_OutOfMemory;
+
+ *pbstr = bstr;
+
+ // Now copy the string into the new lstr. Don't use
+ // strcpy, because that far call might invalidate qchSrc.
+ // Note that we don't care about DBCS character boundaries,
+ // so ++ is ok.
+ qchSrc = (LPOLESTR)pbm->QtrOfHandle(hsz);
+ do {
+ *bstr++ = *qchSrc;
+ } while (*qchSrc++ != '\0');
+
+#endif
+
+ return TIPERR_None;
+}
+
+
+#pragma code_seg()
+
+
+
+#if OE_WIN16
+#pragma optimize("q",off)
+#endif
+// UNDONE: do we really need to turn off optimizations for 700 lines???
+
+
+
+
+/**********
+*CompareHimptypes
+*
+*Purpose:
+* Compare two user-defined types for equality given two himptypes
+* Loads their respective typeinfos by extracting
+* their himptypes and compares
+* the addresses of the typeinfos for identity.
+* NOTE: this depends on the typemgr only ever loading
+* a single typeinfo per module w/in a process.
+*
+*Entry:
+* ptdata1 TYPE_DATA of first type (IN)
+* himptype1 Handle of first type (IN) must be != HIMPTYPE_Nil
+* ptdata2 TYPE_DATA of second type (IN)
+* himptype2 Handle of second type (IN) must be != HIMPTYPE_Nil
+* fEqual TRUE if same type (OUT)
+*
+*Errors:
+* TIPERROR
+***********/
+
+TIPERROR CompareHimptypes(TYPE_DATA * const ptdata1,
+ HIMPTYPE himptype1,
+ TYPE_DATA * const ptdata2,
+ HIMPTYPE himptype2,
+ BOOL *pfEqual)
+{
+ ITypeInfoA *ptinfo1;
+ ITypeInfoA *ptinfo2;
+ TIPERROR err;
+
+ DebAssert(himptype1 != HIMPTYPE_Nil && himptype2 != HIMPTYPE_Nil,
+ "caller's job to test for HIMPTYPE_Nil");
+
+ // Get respective typeinfos
+ IfErrRet(ptdata1->Pimpmgr()->GetTypeInfo(himptype1, DEP_None, &ptinfo1));
+ IfErrGo(ptdata2->Pimpmgr()->GetTypeInfo(himptype2, DEP_None, &ptinfo2));
+ // Compare pointer identity.
+ *pfEqual = (ptinfo1 == ptinfo2);
+ RELEASE(ptinfo2);
+
+ // fall through...
+Error:
+ RELEASE(ptinfo1);
+ return err;
+} // CompareHimptypes
+
+
+
+
+/***
+* BOOL VerifyLcid(LCID lcid)
+*
+* Purpose: Checks if the passed in lcid is valid.
+*
+* Inputs:
+* lcid : LCID that needs to be verified.
+*
+* Outputs: BOOL : return TRUE if the passed in lcid is a valid LCID
+* else return FALSE
+*
+*****************************************************************************/
+#pragma code_seg(CS_INIT)
+extern "C" BOOL VerifyLcid(LCID lcid)
+{
+#if 0
+ return IsValidLocale(lcid, LCID_SUPPORTED);
+#else
+ // Call the nlsapi function to compare string. If the compare
+ // succeeds then the LCID is valid or else the passed in lcid is
+ // invalid. This is because the only reason the comparision will
+ // fail is if the lcid is invalid.
+ char rgTest[] = "Test\0";
+
+ if (!lcid)
+ return FALSE;
+ return (BOOL)(CompareStringA(lcid,
+ NORM_IGNORECASE | NORM_IGNORENONSPACE,
+ rgTest, -1,
+ rgTest, -1) == 2);
+#endif
+}
+#pragma code_seg()
+
+
+#if !OE_WIN32
+/***
+* OLE_TYPEMGR Poletmgr() - Returns the current task's OLE_TYPEMGR.
+*
+* Purpose:
+* This function returns a pointer to the current task's OLE_TYPEMGR.
+* Note : OLE_TYPEMGR is not reference counted
+* Inputs:
+* None
+*
+* Outputs:
+*
+*
+*****************************************************************************/
+#pragma code_seg(CS_INIT)
+OLE_TYPEMGR *Poletmgr()
+{
+ return Pappdata()->m_poletmgr;
+}
+#pragma code_seg()
+
+#endif // !OE_WIN32
+
+
+/***
+*TIPERROR SplitGuidLibId - Parses a LIBIDKIND_Registered-format libid.
+*
+*Inputs:
+* szLibId - The LIBIDKIND_Registered-format libid to be parsed.
+*
+*Outputs:
+* *pszGuid points at the beginning of the guid portion.
+* *pszGuidEnd points at the '#' terminating the guid portion.
+* *pwMaj is set to the major version number in the libid.
+* *pwMin is set to the minor version number in the libid.
+* *plcid is set to the lcid in the libid.
+* If pszPath is not NULL, the *pszPath is set to the start of the path
+* portion and *pszPathEnd is set to the terminating '#'.
+* TIPERR_BadLibId is returned if the libid is not in proper format.
+* Otherwise returns TIPERR_None.
+****************************************************************************/
+#pragma code_seg(CS_CORE2)
+TIPERROR SplitGuidLibId(LPOLESTR szLibId, LPOLESTR *pszGuid, LPOLESTR *pszGuidEnd, WORD *pwMaj, WORD *pwMin, LCID *plcid, LPOLESTR *pszPath, LPOLESTR *pszPathEnd)
+{
+ LPOLESTR pchEnd;
+
+ // The LibId must be of the form:
+ // *\<kind><szGuid>#maj.min#lcid#<path>#<regname>
+
+ if (GetLibIdKind(szLibId) != LIBIDKIND_Registered &&
+ GetLibIdKind(szLibId) != LIBIDKIND_ForeignRegistered)
+ return TIPERR_BadLibId;
+
+ // Get the GUID out of the LibId.
+ *pszGuid = szLibId+3;
+ if ((*pszGuidEnd = ostrchr(*pszGuid, WIDE('#'))) == NULL)
+ return TIPERR_BadLibId;
+
+ // Get the version number out.
+ pchEnd = *pszGuidEnd+1;
+ *pwMaj = (WORD)ostrtoul(pchEnd, &pchEnd, 16);
+ if (*pchEnd++ != WIDE('.'))
+ return TIPERR_BadLibId;
+ *pwMin = (WORD)ostrtoul(pchEnd, &pchEnd, 16);
+ if (*pchEnd++ != WIDE('#'))
+ return TIPERR_BadLibId;
+
+ // Get the lcid out.
+ *plcid = (LCID)ostrtoul(pchEnd, &pchEnd, 16);
+ if (*pchEnd++ != WIDE('#'))
+ return TIPERR_BadLibId;
+
+ // Get the path out.
+ if (pszPath != NULL) {
+ *pszPath = pchEnd;
+ if ((*pszPathEnd = ostrchr(*pszPath, WIDE('#'))) == NULL)
+ return TIPERR_BadLibId;
+ }
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+#if 0 //Dead Code
+/***
+*PUBLIC BOOL FIsLibId
+*Purpose:
+* Answers if the given string is a LibId.
+*
+*Entry:
+* szMaybeLibId = the string that might be a LibId.
+*
+*Exit:
+* return value = BOOL
+*
+***********************************************************************/
+BOOL FIsLibId(LPOLESTR szMaybeLibId)
+{
+ return(ostrlen(szMaybeLibId) >= 3
+ && GetLibIdKind(szMaybeLibId) != LIBIDKIND_Unknown);
+}
+#endif //0
+
+/***
+*GetLibIdKind - Returns the kind of libid szLibId is.
+*******************************************************************/
+LIBIDKIND GetLibIdKind(LPOLESTR szLibId)
+{
+ if (szLibId[0] == WIDE('*') && szLibId[1] == WIDE('\\')) {
+ switch (szLibId[2]) {
+
+
+ case 'G':
+ return OE_MAC?LIBIDKIND_ForeignRegistered:LIBIDKIND_Registered;
+ case 'H':
+ return OE_MAC?LIBIDKIND_Registered:LIBIDKIND_ForeignRegistered;
+ case 'R':
+ return LIBIDKIND_Compressed;
+ }
+ }
+
+ return LIBIDKIND_Unknown;
+}
+
+
+
+/***
+*TIPERROR GetPathOfLibId - Returns the path of the specified typelib.
+*
+*Purpose:
+* This function determines the full path of the typelib specified by
+* szLibId and returns a BSTR copy of that path.
+*
+*Inputs:
+* szLibId - The libid.
+*
+*Outputs:
+* *pbstrPath is set to a BSTR copy of the path corresponding to szLibId.
+* TIPERROR
+************************************************************************/
+TIPERROR GetPathOfLibId(LPOLESTR szLibId, BSTR *pbstrPath)
+{
+ TIPERROR err;
+ BSTR bstrPath;
+ LPOLESTR szGuid, szGuidEnd;
+ WORD wMaj, wMin;
+ LCID lcid;
+ OLECHAR *sz=NULL, szPath[_MAX_PATH];
+
+ switch (GetLibIdKind(szLibId)) {
+
+ case LIBIDKIND_Registered:
+ IfErrRet(SplitGuidLibId(szLibId, &szGuid, &szGuidEnd, &wMaj, &wMin, &lcid, NULL, NULL));
+ *szGuidEnd = '\0';
+ err = GetRegInfoForTypeLibOfSzGuid(szGuid, wMaj, wMin, lcid, szPath, TRUE);
+ *szGuidEnd = '#';
+ sz = szPath;
+ break;
+ }
+
+ if (sz != NULL) {
+ if ((bstrPath = AllocBstr(sz)) == NULL)
+ return TIPERR_OutOfMemory;
+ *pbstrPath = bstrPath;
+ return TIPERR_None;
+ }
+
+ return TIPERR_BadLibId;
+}
+
+
+/***
+* TIPERROR GetRegLibOfLibId() - Opens a registered typelib, given a libId.
+*
+* Purpose:
+* This function finds and loads a GenericTypeLibOLE (probably created
+* by MkTypLib), given its LibId. This is used both by the implementation
+* of the OLE version of the import manager (indirectly through
+* GetTypeInfoOfCompressedTypeId) and by the TYPEMGR in OB.
+*
+* Inputs:
+* szLibId - The Typelib's LibId.
+*
+* Outputs:
+* TIPERR_None is returned and *pptlib is set to the loaded
+* typelib if successful.
+*
+* Otherwise, *pptlib remains unchanged.
+*
+*****************************************************************************/
+#pragma code_seg( CS_CORE2 )
+TIPERROR GetRegLibOfLibId(LPOLESTR szLibId, ITypeLibA **pptlib)
+{
+ // The LibId must be of the form:
+ // *\<kind><szGuid>#maj.min#lcid#<path>#<regname>
+ TIPERROR err;
+ WORD wMaj, wMin;
+ LPOLESTR szPath, pchEnd, szGuid, pchGuidEnd;
+ LCID lcid;
+ LPOLESTR szFile;
+
+ IfErrRet(SplitGuidLibId(szLibId, &szGuid, &pchGuidEnd, &wMaj, &wMin, &lcid, &szPath, &pchEnd));
+
+ // Load the Typelib.
+ *pchGuidEnd = '\0';
+ err = TiperrOfHresult(LoadRegTypeLibOfSzGuid(szGuid, wMaj, wMin, lcid,
+ pptlib));
+ *pchGuidEnd = '#';
+
+ // If the registry lookup failed for some reason, then try using the
+ // path encoded in the libid if we have one.
+ if (err != TIPERR_None) {
+
+ // CONSIDER: (dougf) 5/26/93 probably don't want to bother doing this if
+ // the imbedded pathname doesn't correspond to the current
+ // system (e.g. if we're OE_MAC and we're trying to load a MAC
+ // typelib created on Windows, the pathname will be in DOS format)
+
+ // Try loading the typelib.
+ *pchEnd = '\0';
+ if (*szPath != '\0') { // Don't try to load unless we've got a path.
+ // A "library not registered" error (what
+ // we probably have now) is probably better
+ // for the user than a "file not found" error.
+
+ // Strip off any path portion to force LoadTypeLib to search for
+ // the typelib.
+ szFile = IsolateFilename(szPath);
+
+ err = TiperrOfHresult(LoadTypeLib(szFile, pptlib));
+ }
+ *pchEnd = '#';
+ }
+
+ return err;
+}
+#pragma code_seg( )
+
+
+/***
+* TIPERROR GetRegInfoForTypeLibOfSzGuid().
+*
+* Purpose:
+* This function produces the fully qualified path name based on the
+* guid, wMajorNum, wMajorNum, and lcid. It returns
+* a string containing the fully qualified path name.
+*
+* Inputs:
+* szGuid : string representation of GUID
+* wMaj : Mojor version number of the Typelib to be loaded
+* wMin : Minor version number of the Typelib to be loaded
+* lcid : Lcid of the lib to be loaded.
+* fMustExist : TRUE if we're to ensure the existence of the file
+*
+* Outputs:
+* rgFileName : Fully qualified path name (size is _MAX_PATH).
+*
+*
+* TIPERR_None is returned if successful.
+**
+*****************************************************************************/
+#pragma code_seg(CS_QUERY)
+TIPERROR
+GetRegInfoForTypeLibOfSzGuid(LPOLESTR szGuid,
+ WORD wMaj,
+ WORD wMin,
+ LCID lcid,
+ LPOLESTR rgFileName,
+ BOOL fMustExist)
+{
+ TIPERROR err = TIPERR_None;
+ TLIBKEY tlibkey;
+ HKEY hkeyLcid;
+ OLECHAR szPath[_MAX_PATH];
+ OLECHAR szLcid[9];
+ LCID lcidBest;
+ OLECHAR * szPlatform;
+ long cb;
+
+ // Open the registry key for the typelib. Fail if there is no entry
+ // for this typelib.
+ IfErrRet(OpenTypeLibKey(szGuid, wMaj, wMin, &tlibkey));
+
+ // Get the Lcid that we can use to path of the TypeLib.
+ IfErrGo(GetBestLcidMatch(tlibkey.hkeyVers, lcid, &lcidBest, &szPlatform));
+ lcid = lcidBest;
+
+ // point szLcid at a zero-terminated ascii hex
+ // representation of the lcid.
+ oultoa(lcid, szLcid, 16);
+
+ if (oRegOpenKey(tlibkey.hkeyVers, szLcid, &hkeyLcid) != ERROR_SUCCESS) {
+ err = TIPERR_LibNotRegistered;
+ goto Error;
+ }
+
+ // Try to open that file. If that succeeds, then return that
+ // typelib. Otherwise, return the error.
+ cb = sizeof(szPath)/sizeof(szPath[0]);
+
+ if (!(err = GetRegisteredPath(hkeyLcid,
+ szPlatform,
+ szPath,
+ &cb,
+ fMustExist))) {
+ ostrcpy(rgFileName, szPath);
+ }
+
+ RegCloseKey(hkeyLcid);
+
+Error:
+ CloseTypeLibKey(&tlibkey);
+ return err;
+}
+#pragma code_seg()
+
+
+
+
+/***
+* TIPERROR LoadRegTypeLibOfSzGuid().
+*
+* Purpose:
+* This function finds and loads a GenericTypeLibOLE (probably created
+* by MkTypLib), given its guid, wMajorNum, wMajorNum, and lcid. It returns
+* a pointer to the typelib specified by the above parameters.
+*
+* Inputs:
+* szGuid : string representation of the GUID of the lib to be loaded.
+* wMaj : Mojor version number of the Typelib to be loaded
+* wMin : Minor version number of the Typelib to be loaded
+* lcid : Lcid of the lib to be loaded.
+*
+* Outputs:
+* *pptlib : is set to point to the typelib loaded if successful or else
+* pptlib remains unchanged.
+*
+* TIPERR_None is returned if successful.
+**
+*****************************************************************************/
+STDAPI
+LoadRegTypeLibOfSzGuid(LPOLESTR szGuid,
+ WORD wMaj,
+ WORD wMin,
+ LCID lcid,
+ ITypeLibA **pptlib)
+
+{
+
+ OLECHAR szPath[_MAX_PATH];
+ HRESULT hresult;
+ TIPERROR err;
+ BOOL fLoadingStdole;
+
+ // cache the typelib if it is the current stdole[32].tlb
+ fLoadingStdole = ( (wMaj == STDOLE_MAJORVERNUM)
+ && (wMin == STDOLE_MINORVERNUM)
+ && (ostrcmp(szGuid, g_szGuidStdole) == 0));
+
+ if (fLoadingStdole) {
+ APP_DATA *pappdata;
+ pappdata = Pappdata(); // DON'T rely on this after LoadTypeLib
+ if (pappdata != NULL && pappdata->m_ptlibStdole) {
+ // stdole is already cached, so use it and save registry hits, etc.
+ *pptlib = pappdata->m_ptlibStdole;
+ (*pptlib)->AddRef();
+ return NOERROR;
+ }
+ }
+
+ // Get the path name of the file
+ // (don't check that this file/path exists)
+ IfErrRetHresult(GetRegInfoForTypeLibOfSzGuid(szGuid,
+ wMaj,
+ wMin,
+ lcid,
+ szPath,
+ FALSE));
+
+ // Load the lib.
+ hresult = LoadTypeLib(szPath, pptlib);
+
+ // If the load failed due to file not found, then strip off the
+ // path and try the load again to search for the typelib by name.
+ //
+ LPOLESTR szFile;
+
+ if (hresult != NOERROR) {
+ err = TiperrOfHresult(hresult);
+ if (err == TIPERR_PathNotFound || TIPERR_FileNotFound) {
+ // Strip off any path portion to force LoadTypeLib to search for
+ // the typelib.
+ szFile = IsolateFilename(szPath);
+ hresult = LoadTypeLib(szFile, pptlib);
+ }
+ }
+
+ if (hresult == NOERROR && fLoadingStdole) {
+ // cache the stdole pointer for future calls, but don't AddRef(). If
+ // stdole's reference count goes to 0, it will set m_ptlibStdole to
+ // NULL on its own. This is because the APP_DATA structure is freed
+ // when the last typelib is released, and the APP_DATA structure has
+ // a typelib pointer in it. We don't want a circular dependency.
+ // can't use pappdata above, since it might not have been allocated
+ // until LoadTypeLib().
+ Pappdata()->m_ptlibStdole = *pptlib;
+ }
+ return hresult;
+}
+
+
+/***
+* TIPERROR LoadRegTypeLib().
+*
+* Purpose:
+* This function finds and loads a GenericTypeLibOLE (probably created
+* by MkTypLib), given its guid, wMajorNum, wMajorNum, and lcid. It returns
+* a pointer to the typelib specified by the above parameters.
+*
+* Inputs:
+* guid : CLSIID/GUID of the lib to be loaded.
+* wMaj : Mojor version number of the Typelib to be loaded
+* wMin : Minor version number of the Typelib to be loaded
+* lcid : Lcid of the lib to be loaded.
+*
+* Outputs:
+* *pptlib : is set to point to the typelib loaded if successful or else
+* pptlib remains unchanged.
+*
+* TIPERR_None is returned if successful.
+**
+*****************************************************************************/
+STDAPI LoadRegTypeLib(REFGUID guid,
+ WORD wMaj,
+ WORD wMin,
+ LCID lcid,
+ ITypeLibA **pptlib)
+
+{
+
+ HRESULT hresult = NOERROR;
+ TIPERROR err = TIPERR_None;
+ OLECHAR szGuid[CCH_SZGUID0];
+ TLIBATTR *ptlibattr;
+
+#if !OE_WIN32
+ // since this can be the first call into typelib.dll
+ TlsCleanupDeadTasks();
+#endif //!OE_WIN32
+
+ if (pptlib == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ StringFromGUID2(guid, szGuid, CCH_SZGUID0);
+
+ // Free the szGuid before the call to LoadRegTypeLibOfszGuid as that call
+ // can release the APP_DATA
+ //
+ IfOleErrRet(LoadRegTypeLibOfSzGuid(
+ szGuid,
+ wMaj,
+ wMin,
+ lcid,
+ pptlib));
+
+ IfOleErrGo((*pptlib)->GetLibAttr(&ptlibattr));
+
+ // Verify that the loaded typelib has the requested guid and major
+ // version number and the minor version number and the lcid are
+ // compatible with that requested.
+ if (ptlibattr->guid != guid || ptlibattr->wMajorVerNum != wMaj ||
+ ptlibattr->wMinorVerNum < wMin ||
+ (ptlibattr->lcid != lcid && ptlibattr->lcid != (LCID)(PRIMARYLANGID(lcid)) &&
+ ptlibattr->lcid != 0)) {
+ (*pptlib)->ReleaseTLibAttr(ptlibattr);
+ (*pptlib)->Release();
+ return ReportResult(0, TYPE_E_LIBNOTREGISTERED, 0, 0);
+ }
+
+ (*pptlib)->ReleaseTLibAttr(ptlibattr);
+ return NOERROR;
+
+Error:
+ (*pptlib)->Release();
+ return hresult;
+}
+
+
+#pragma code_seg(CS_QUERY)
+/***
+* HRESULT QueryPathOfRegTypeLib().
+*
+* Purpose:
+* This function produces the fully qualified path name based on the
+* guid, wMajorNum, wMajorNum, and lcid. It returns
+* a string containing the fully qualified path name.
+*
+*IMPLEMENTATION NOTES: Defers to GetRegInfoForTypeLibOfSzGuid
+*
+* Inputs:
+* guid : CLSIID/GUID of the lib to be loaded.
+* wMaj : Mojor version number of the Typelib to be loaded
+* wMin : Minor version number of the Typelib to be loaded
+* lcid : Lcid of the lib to be loaded.
+*
+* Outputs:
+* lplpPathName : *lplpPathName points to the string containing the
+* path registered in the typelib.
+*
+*
+* NOERROR is returned if successful. In Case of Error *lplpPathName is not
+* modified.
+*
+*****************************************************************************/
+STDAPI QueryPathOfRegTypeLib(REFGUID guid,
+ WORD wMaj,
+ WORD wMin,
+ LCID lcid,
+ LPBSTR lpbstrPathName)
+{
+
+ OLECHAR szGuid[CCH_SZGUID0];
+ OLECHAR szPath[_MAX_PATH];
+ TIPERROR err;
+
+#if !OE_WIN32
+ // since this can be the first call into typelib.dll
+ TlsCleanupDeadTasks();
+#endif //!OE_WIN32
+
+ if (lpbstrPathName == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ StringFromGUID2(guid, szGuid, CCH_SZGUID0);
+
+ IfErrGo(GetRegInfoForTypeLibOfSzGuid(szGuid,
+ wMaj,
+ wMin,
+ lcid,
+ szPath,
+ FALSE));
+
+ // Allocate Space for return value, and copy pathname to it
+ if ((*lpbstrPathName = AllocBstrLen(szPath, ostrblen0(szPath))) == NULL)
+ err = TIPERR_OutOfMemory;
+
+
+Error:
+ return HresultOfTiperr(err);
+
+}
+#pragma code_seg()
+
+
+
+#if ID_DEBUG
+
+// NAME_CACHE debug methods
+// Note: they are here since there is no ncache.cxx file,
+// the rest of the implementation is inline only however these
+// methods can't be inlined since they contain strings and thus
+// might overflow dgroup.
+//
+
+/***
+*PUBLIC NAME_CACHE::DebShowState - NAME_CACHE state
+*Purpose:
+* Show NAME_CACHE state
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+
+VOID NAME_CACHE::DebShowState(UINT uLevel) const
+{
+ BYTE bNamcache;
+ UINT i, j;
+
+ DebPrintf("*** NAME_CACHE ***\n");
+ if (IsValid()) {
+ for (i=0; i < NAMCACHE_cbSize; i++) {
+ bNamcache = m_rgBitmap[i];
+ for (j=0; j < sizeof(bNamcache) * CHAR_BIT; j++) {
+ DebPrintf("%s", bNamcache & (1 << j));
+ }
+ DebPrintf("\n");
+ }
+ }
+ else {
+ DebPrintf("Invalid\n");
+ }
+
+ DebPrintf("\n");
+
+}
+
+#endif
+
+#if OE_WIN16
+#pragma optimize("q",on)
+#endif
+
+
+/******************** Init Functions *************/
+
+VOID InitTypeDesc(TYPEDESC *ptdesc)
+{
+ DebAssert(ptdesc != NULL, "Invalid Arg.");
+ ptdesc->vt = VT_EMPTY;
+}
+
+
+VOID InitIdlDesc(IDLDESC *pidldesc)
+{
+ DebAssert(pidldesc != NULL, "Invalid Arg.");
+#if OE_WIN16
+ pidldesc->bstrIDLInfo = NULL;
+#else //OE_WIN16
+ pidldesc->dwReserved = 0;
+#endif //OE_WIN16
+}
+
+
+VOID InitElemDesc(ELEMDESC *pelemdesc)
+{
+ DebAssert(pelemdesc != NULL, "Invalid Arg.");
+ InitTypeDesc(&(pelemdesc->tdesc));
+ InitIdlDesc(&(pelemdesc->idldesc));
+}
+
+
+VOID InitVarDesc(VARDESCA *pvardesc)
+{
+ DebAssert(pvardesc != NULL, "Invalid Arg.");
+ pvardesc->varkind = VAR_PERINSTANCE;
+ InitElemDesc(&(pvardesc->elemdescVar));
+}
+
+
+VOID InitFuncDesc(FUNCDESC *pfuncdesc)
+{
+ DebAssert(pfuncdesc != NULL, "Invalid Arg.");
+ pfuncdesc->cParams = 0;
+ pfuncdesc->cParamsOpt = 0;
+ InitElemDesc(&(pfuncdesc->elemdescFunc));
+ pfuncdesc->lprgelemdescParam = NULL;
+}
+
+
+/*************** Clear Functions ******************/
+
+
+VOID ClearTypeDesc(TYPEDESC *ptypedesc)
+{
+ DebAssert(ptypedesc != NULL, "Invalid Arg.");
+
+ switch (ptypedesc->vt) {
+ case VT_PTR :
+ case VT_SAFEARRAY :
+ FreeTypeDesc(ptypedesc->lptdesc);
+ break;
+ case VT_CARRAY :
+ FreeArrayDesc(ptypedesc->lpadesc);
+ break;
+ }
+}
+
+
+VOID ClearIdlDesc(IDLDESC *pidldesc)
+{
+ DebAssert(pidldesc != NULL, "Invalid Arg.");
+
+#if OE_WIN16
+ FreeBstr(pidldesc->bstrIDLInfo);
+#endif //OE_WIN16
+}
+
+
+VOID ClearArrayDesc(ARRAYDESC *parraydesc)
+{
+ DebAssert(parraydesc != NULL, "Invalid Arg.");
+ ClearTypeDesc(&(parraydesc->tdescElem));
+}
+
+
+VOID ClearElemDesc(ELEMDESC *pelemdesc)
+{
+ DebAssert(pelemdesc != NULL, "Invalid Arg.");
+ ClearTypeDesc(&(pelemdesc->tdesc));
+ ClearIdlDesc(&(pelemdesc->idldesc));
+}
+
+
+/*************** Free Functions ********************/
+
+
+VOID FreeVarDesc(VARDESCA *pvardesc)
+{
+ if (pvardesc) {
+ ClearElemDesc(&(pvardesc->elemdescVar));
+ if (pvardesc->varkind == VAR_CONST) {
+ VariantClearA(pvardesc->lpvarValue);
+ MemFree(pvardesc->lpvarValue);
+ }
+ MemFree(pvardesc);
+ }
+}
+
+
+VOID FreeFuncDesc(FUNCDESC *pfuncdesc)
+{
+ UINT cParams;
+ ELEMDESC *pelemdesc;
+
+ if (pfuncdesc) {
+ ClearElemDesc(&(pfuncdesc->elemdescFunc));
+
+ // these limits are defined in defn.hxx
+ DebAssert(pfuncdesc->cParams <= MAX_CARGS, "Too Many Params.");
+
+ if (pfuncdesc->lprgelemdescParam != NULL) {
+ cParams = pfuncdesc->cParams;
+ pelemdesc = pfuncdesc->lprgelemdescParam;
+ while (cParams > 0) {
+ ClearElemDesc(pelemdesc);
+ pelemdesc += 1;
+ cParams -= 1;
+ }
+ MemFree(pfuncdesc->lprgelemdescParam);
+ }
+ // we use new to create FUNCDESC.
+ MemFree(pfuncdesc);
+ }
+}
+
+
+VOID FreeTypeDesc(TYPEDESC *ptypedesc)
+{
+ if (ptypedesc != NULL) {
+ ClearTypeDesc(ptypedesc);
+ MemFree(ptypedesc);
+ }
+}
+
+
+VOID FreeArrayDesc(ARRAYDESC *parraydesc)
+{
+ if (parraydesc) {
+ ClearArrayDesc(parraydesc);
+ MemFree(parraydesc);
+ }
+}
+
+
+TIPERROR CopyArrayDesc(ARRAYDESC **pparraydescDest, ARRAYDESC *parraydescSrc)
+{
+ UINT cb;
+
+ DebAssert(pparraydescDest && parraydescSrc, "Invalid Arguments");
+ cb = offsetof(ARRAYDESC, rgbounds) + parraydescSrc->cDims * sizeof(SAFEARRAYBOUND);
+
+ *pparraydescDest = (ARRAYDESC*) MemAlloc(cb);
+
+ if (! *pparraydescDest) {
+ return TIPERR_OutOfMemory;
+ }
+ memcpy(*pparraydescDest, parraydescSrc, cb);
+
+ return TIPERR_None;
+}
+
+
+TIPERROR CopyTypeDesc(TYPEDESC *ptdescDest, TYPEDESC *ptdescSrc)
+{
+ TIPERROR err;
+
+ DebAssert(ptdescDest && ptdescSrc, "Invalid Arguments");
+
+ ptdescDest->vt = VT_EMPTY;
+
+ switch (ptdescSrc->vt) {
+ case VT_PTR :
+ case VT_SAFEARRAY :
+ DebAssert(ptdescSrc->lptdesc, "Invalid Src ptr");
+ ptdescDest->lptdesc = (TYPEDESC *)MemAlloc(sizeof(TYPEDESC));
+ if (!(ptdescDest->lptdesc)) {
+ return TIPERR_OutOfMemory;
+ }
+ if ((err = CopyTypeDesc(ptdescDest->lptdesc, ptdescSrc->lptdesc))
+ != TIPERR_None) {
+ MemFree(ptdescDest->lptdesc);
+ return err;
+ }
+ break;
+ case VT_USERDEFINED :
+ ptdescDest->hreftype = ptdescSrc->hreftype;
+ break;
+ case VT_CARRAY :
+ IfErrRet(CopyArrayDesc(&(ptdescDest->lpadesc), ptdescSrc->lpadesc));
+ break;
+
+
+ } // switch
+ ptdescDest->vt = ptdescSrc->vt;
+
+ return TIPERR_None;
+}
+
+/***
+*TIPERROR GetLibIdOfRegLib - Constructs the libId of a registered typelib.
+*
+*Purpose:
+* This method creates a registered typelib's LibId, given all of the
+* information that goes into that LibId.
+*
+*Inputs:
+* szGuid - The registry string form of the guid under which the
+* typelib is registered.
+* wMajor - The major version number of the typelib.
+* wMinor - The minor version number of the typelib.
+* lcid - The typelib's lcid.
+* szRegName - The registered name of the typelib.
+*
+*Outputs:
+* If successful, the function returns TIPERR_None and sets *pbstrLibId
+* to a BSTRA copy of the LibId. Otherwise, the appropriate error code
+* is returned.
+***************************************************************************/
+TIPERROR GetLibIdOfRegLib(LPOLESTR szGuid, WORD wMajor, WORD wMinor, LCID lcid, LPOLESTR szPath, LPOLESTR szRegName, BSTR *pbstrLibId)
+{
+ // Note that the chars in rgchLibId will always be single-byte chars in DBCS.
+ // #maj.min#lcid# (*\<kind>, szGuid, path, and regname will not appear in this array).
+ OLECHAR rgchLibId[1+9+1+4+1+1];
+ OLECHAR *pchEnd;
+ BSTR bstr;
+ int cbGuid = ostrblen(szGuid);
+ int cbPath = ostrblen(szPath);
+
+ // Construct (in rgchLibId) all of the libId except for the guid and
+ // the registered name, between which the contents of rgchLibId will
+ // be sandwiched.
+ pchEnd = rgchLibId;
+ *pchEnd++ = '#';
+ oultoa(wMajor, pchEnd, 16);
+ pchEnd = ostrchr(pchEnd, '\0');
+ *pchEnd++ = '.';
+ oultoa(wMinor, pchEnd, 16);
+ pchEnd = ostrchr(pchEnd, '\0');
+ *pchEnd++ = '#';
+ oultoa(lcid, pchEnd, 16);
+ pchEnd = ostrchr(pchEnd, '\0');
+ *pchEnd++ = '#';
+ *pchEnd = '\0';
+
+ // Now that we know the correct length for the bstr, allocate it.
+ bstr = AllocBstrLen(NULL, 3+cbGuid+(pchEnd-rgchLibId)+cbPath+1+ostrblen(szRegName));
+ if (bstr == NULL)
+ return TIPERR_OutOfMemory;
+
+ // Copy the concatenation of "*\<kind>", szGuid, rgchLibId, szPath, '#', and szRegName
+ // (i.e. the whole libId) into the bstr.
+ ostrcpy(bstr, OE_MAC?WIDE("*\\H"):WIDE("*\\G"));
+ ostrcpy(bstr+3, szGuid);
+ ostrcpy(bstr+3+cbGuid, rgchLibId);
+ ostrcpy(bstr+3+cbGuid+(pchEnd-rgchLibId), szPath);
+ bstr[3+cbGuid+(pchEnd-rgchLibId)+cbPath] = '#';
+ ostrcpy(bstr+3+cbGuid+(pchEnd-rgchLibId)+cbPath+1, szRegName);
+ *pbstrLibId = bstr;
+ return TIPERR_None;
+}
+
+
+/***
+*TIPERROR GetLibIdOfTypeLib - Obtains the full LibId from a TypeLib.
+*
+*Purpose:
+* This method can be used to get the libId of a typelib, even if that
+* typelib doesn't support LibIds to external clients. If the typelib
+* is really an OB project, we directly use the GetTypeLib method.
+* Otherwise, we construct a "registered guid" libId, using the guid
+* obtained through the ITypeLib interface.
+*
+*Inputs:
+* ptlib - The typelib whose libId is desired.
+*
+*Outputs:
+* If successful, the function returns TIPERR_None and sets *pbstrLibId
+* to a BSTR copy of the LibId. Otherwise, the appropriate error code
+* is returned.
+***************************************************************************/
+TIPERROR GetLibIdOfTypeLib(ITypeLibA *ptlib, LPOLESTR szPath, BSTR *pbstrLibId)
+{
+ TIPERROR err;
+ HRESULT hresult;
+ TLIBATTR *ptlibattr;
+ BSTR bstrDoc = NULL;
+ OLECHAR szGuid[CCH_SZGUID0];
+
+
+ // Otherwise, get the typelib's guid, version number, lcid, and
+ // docstring, and construct a LibId from that.
+ IfOleErrRetTiperr(ptlib->GetLibAttr(&ptlibattr));
+ IfOleErrGoTo(ptlib->GetDocumentation(-1, NULL, &bstrDoc, NULL, NULL), OleErr);
+
+ // Convert the guid into the registry string format.
+ StringFromGUID2(ptlibattr->guid, szGuid, CCH_SZGUID0);
+
+ // Now construct the LibId from the guid, version number, lcid, and
+ // registered name.
+ err = GetLibIdOfRegLib(
+ szGuid,
+ ptlibattr->wMajorVerNum,
+ ptlibattr->wMinorVerNum,
+ ptlibattr->lcid,
+ szPath,
+ (bstrDoc?bstrDoc:WIDE("")),
+ pbstrLibId);
+
+ // FALL THROUGH!!!
+
+Error:
+ FreeBstr(bstrDoc);
+ ptlib->ReleaseTLibAttr(ptlibattr);
+ return err;
+
+OleErr:
+ err = TiperrOfHresult(hresult);
+ goto Error;
+}
+
+
+
+
+
+/***
+* TIPERROR GetTypeInfoOfTypeId - Gets a typeinfo from an uncompressed typeId.
+* Purpose:
+* Returns a pointer to a TYPEINFO object that describes a class.
+* This TYPEINFO must eventually be released by calling:
+* TYPEINFO::Release()
+*
+* Entry:
+* szTypeId TypeId of TypeInfo to be loaded
+* pptinfo returns pointer to the referenced ITypeInfo.
+*
+* Exit:
+* TIPERROR
+*
+***********************************************************************/
+TIPERROR GetTypeInfoOfTypeId(LPOLESTR szTypeId, ITypeInfoA **pptinfo)
+{
+ ITypeLibA *ptlib;
+ TIPERROR err;
+ BSTR bstrLibId;
+ LPOLESTR szTmp;
+ UINT itype;
+
+ // Split the TypeId into its LibId/LocalTypeId components.
+ // Sets szTypeId to the local typeId component.
+ IfErrRet(SzLibIdLocalTypeIdOfTypeId(szTypeId, &bstrLibId, &szTypeId));
+
+ // Get the typelib.
+ err = GetRegLibOfLibId(bstrLibId, &ptlib);
+ FreeBstr(bstrLibId);
+
+ if (err != TIPERR_None)
+ return err;
+
+
+ // If this is the OLE implementation or the typelib is not a
+ // GEN_PROJECT, interpret the local typeid portion of the typeId
+ // as an index into the typelib and use the ITypeLib::GetTypeInfo
+ // method.
+
+ DebAssert(*szTypeId == '#', "GetTypeInfoOfTypeId");
+ itype = (UINT)ostrtoul(szTypeId+1, &szTmp, 16);
+ DebAssert(*szTmp == '\0', "GetTypeInfoOfTypeId");
+
+ err = TiperrOfHresult(ptlib->GetTypeInfo(itype, pptinfo));
+
+ ptlib->Release();
+ return err;
+}
+
+
+/***
+*TIPERROR OpenTypeLibKey - Opens the registry key for a typelib
+*
+*Purpose:
+* This function opens the system registry key for the specified typelib.
+* From this key, the typelib's registered name, its directory, filespec,
+* and the specific filenames of various localized versions of the typelib
+* may be obtained.
+*
+*Inputs:
+* szGuid - The registry string form of the guid under which the
+* typelib is registered.
+* wMajor - The major version number of the typelib.
+* wMinor - The minor version number of the typelib.
+*
+*Outputs:
+* If successful, the function returns TIPERR_None and fills *ptlibkey
+* with the opened HKEY and all parent HKEYs. In this case, the caller
+* is responsible for eventually using CloseTypeLibKey to close all of
+* these HKEYs.
+*
+* Otherwise, the appropriate error code is returned.
+***************************************************************************/
+#pragma code_seg(CS_QUERY)
+TIPERROR OpenTypeLibKey(LPOLESTR szGuid, WORD wMajor, WORD wMinor, TLIBKEY *ptlibkey)
+{
+ // maj.min\0
+ OLECHAR rgchVer[4+1+4+1];
+ CHAR rgchVerA[4+1+4+1], *pchA;
+ OLECHAR rgchVerBestMatch[4+1+4+1];
+ OLECHAR *pchEnd;
+ HKEY hkeyTLib, hkeyGuid;
+ DWORD iVer;
+ WORD wMaj, wMin;
+ WORD wMinorMax = wMinor;
+ TIPERROR err = TIPERR_None;
+
+ // Open up the typelib section of the registry.
+ if (RegOpenKey(HKEY_CLASSES_ROOT, "TypeLib", &hkeyTLib) != ERROR_SUCCESS)
+ return TIPERR_RegistryAccess;
+
+ // Now open up the guid, if it is registered.
+ if (oRegOpenKey(hkeyTLib, szGuid, &hkeyGuid) != ERROR_SUCCESS) {
+ err = TIPERR_LibNotRegistered;
+ goto Error;
+ }
+
+ // assume the first guess is the best (it usually is)
+ itoa(wMajor, rgchVerA, 10);
+ for (pchA = rgchVerA; *pchA; ++pchA);
+ ;
+ *pchA = '.';
+ pchA++;
+ itoa(wMinor, pchA, 10);
+ if (RegOpenKey(hkeyGuid, rgchVerA, &ptlibkey->hkeyVers) == ERROR_SUCCESS)
+ goto Success;
+
+ // Initialize the best match to nothing.
+ rgchVerBestMatch[0] = '\0';
+
+ for (iVer = 0;
+ oRegEnumKey(hkeyGuid, iVer, rgchVer, sizeof(rgchVer)/sizeof(OLECHAR)) == ERROR_SUCCESS;
+ iVer++) {
+
+ // Get the major version number from rgchVer.
+ wMaj = (WORD)ostrtoul(rgchVer, &pchEnd, 16);
+
+ // If the format of this key isn't #.#, ignore it.
+ if (*pchEnd != '.')
+ continue;
+
+ // Get the minor version number from rgchVer.
+ wMin = (WORD)ostrtoul(pchEnd+1, NULL, 16);
+
+ // If we have an exact version number match, use this key.
+ // Copy the key to the best match string buffer and exit the loop.
+ if (wMaj == wMajor && wMin == wMinor) {
+ ostrcpy(rgchVerBestMatch, rgchVer);
+ break;
+ }
+
+ // Otherwise, check to see if this is a more reasonable match than
+ // any key we've yet encountered in this loop.
+
+ // In OLE code, the best non-exact match is the one with the highest
+ // minor version number, and which matches the major version number
+ // exactly. If no matching major version number is found, the search
+ // will fail.
+ if (wMaj == wMajor && wMin > wMinorMax) {
+ wMinorMax = wMin;
+ ostrcpy(rgchVerBestMatch, rgchVer);
+ }
+ }
+
+ // We have now either found an exact match on the version number,
+ // a usable best match on the version number, or nothing usable.
+ // In the first two cases, rgchVerBestMatch holds the key to be opened.
+ // In the last case, rgchVerBestMatch is zero-length and we fail.
+ if (rgchVerBestMatch[0] != '\0') {
+ if (oRegOpenKey(hkeyGuid, rgchVerBestMatch, &ptlibkey->hkeyVers) != ERROR_SUCCESS)
+ {
+ DebAssert(0, "OpenTypeLibKey");
+ }
+ }
+ else {
+ err = TIPERR_LibNotRegistered;
+ RegCloseKey(hkeyGuid);
+ goto Error;
+ }
+
+Success:
+ ptlibkey->hkeyTLib = hkeyTLib;
+ ptlibkey->hkeyGuid = hkeyGuid;
+ return TIPERR_None;
+
+Error:
+ RegCloseKey(hkeyTLib);
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*VOID CloseTypeLibKey - Closes a TLIBKEY opened by OpenTypeLibKey.
+***************************************************************************/
+#pragma code_seg(CS_QUERY)
+VOID CloseTypeLibKey(TLIBKEY *ptlibkey)
+{
+ RegCloseKey(ptlibkey->hkeyVers);
+ RegCloseKey(ptlibkey->hkeyGuid);
+ RegCloseKey(ptlibkey->hkeyTLib);
+}
+
+
+#pragma code_seg()
+
+
+/***
+*LPOLESTR SkipVolumeName - Skips over the volume name in the specified path.
+*
+*Purpose:
+* Returns a pointer to the next character beyond the volume name (e.g.
+* drive letter or net share name) at the beginning of szPath. If there
+* is no such volume name at the beginning of szPath, then *pszOut is set
+* to szPath.
+************************************************************************/
+static LPOLESTR SkipVolumeName(LPOLESTR szPath)
+{
+ LPOLESTR sz;
+
+#if OE_MAC
+
+ // If the first character is a ':', then szPath does not start with
+ // a volume name.
+ if (szPath[0] == ':')
+ return szPath;
+
+ sz = xstrchr(szPath, ':');
+ if (sz == NULL)
+ return xstrchr(szPath, '\0');
+ else
+ return sz;
+
+#else // OE_MAC
+
+ // If szPath begins with a drive letter, return the char beyond the
+ // colon.
+ if (szPath[0] != '\0' && *ostrinc(szPath) == ':')
+ return ostrinc(ostrinc(szPath));
+
+ // If szPath begins with "\\", then the format should be "\\str\str\path".
+ // In this case, return a pointer to the backslash before <path>.
+ if (szPath[0] == '\\' && szPath[1] == '\\' &&
+ (sz = ostrchr(szPath+2, '\\')) != NULL &&
+ (sz = ostrchr(sz+1, '\\')) != NULL) {
+ return sz;
+ }
+
+ return szPath;
+#endif // OE_MAC
+}
+
+#if OE_MAC
+#define DirectoryDelimiter ':'
+#else
+#define DirectoryDelimiter WIDE('\\')
+#endif
+
+/***
+*LPOLESTR SkipNextDir - Skips over the next directory in the specified path.
+*
+*Purpose:
+* If szPath begins with a directory delimiter, return a pointer just
+* beyond it.
+*
+* Otherwise, return a pointer to the next directory delimiter (or to
+* the terminating zero if there isn't one).
+************************************************************************/
+static LPOLESTR SkipNextDir(LPOLESTR szPath)
+{
+ LPOLESTR sz;
+
+ if (*szPath == DirectoryDelimiter)
+ return szPath+1;
+
+ sz = ostrchr(szPath, DirectoryDelimiter);
+
+ if (sz == NULL)
+ return ostrchr(szPath, '\0');
+ else
+ return sz;
+}
+
+
+/***
+*LPOLESTR StripDirsFromEnd - Strips directory portions from the end of a path.
+*
+*Purpose:
+* This function strips the specified number of directory portions from
+* the end of the specified path.
+*
+*Inputs:
+* szPath - The path.
+* cDirs - The number directories to strip from the end of the path.
+*
+*Outputs:
+* Returns a pointer to the first character of the stripped path.
+* Returns NULL if there aren't cDirs directories in szPath to strip.
+*
+*CONSIDER:
+* This is an n^2/2 algorithm on the number of chars in szPath in the
+* case of multi-byte character set. We need to evaluate how critical
+* this is and do something better in this case if necessary.
+************************************************************************/
+static LPOLESTR StripDirsFromEnd(LPOLESTR szPath, UINT cDirs)
+{
+ LPOLESTR szLim;
+
+ // Find the end of the string.
+ szLim = ostrchr(szPath, '\0');
+
+ // If the last character of the string is a directory delimiter,
+ // back up one to avoid hitting the terminating delimiter when
+ // searching for the last directory.
+ if (szLim > szPath) {
+ szLim = ostrdec(szPath, szLim);
+ if (*szLim != DirectoryDelimiter)
+ szLim = ostrinc(szLim);
+ }
+
+ // Specially handle the boundary case of there being no directories
+ // to strip from szPath.
+ if (szLim == szPath) {
+ if (cDirs == 0)
+ return szLim;
+ else
+ return NULL;
+ }
+
+ // Strip off the correct number of directories.
+ while (cDirs-- > 0) {
+ do {
+ szLim = ostrdec(szPath, szLim);
+ } while (szLim > szPath && *szLim != DirectoryDelimiter);
+
+ // If we ran out of path to strip and we're not done stripping
+ // yet, return NULL to indicate the failure.
+ if (szLim == szPath &&
+ (cDirs != 0 || *szLim != DirectoryDelimiter)) {
+ return NULL;
+ }
+ }
+
+ return szLim;
+}
+
+
+
+
+/***
+*TIPERROR MakeAbsolutePath - Recreates an absolute path from a relative one.
+*
+*Inputs:
+* szFrom - The absolute path from which the relative path goes.
+* This must not contain a filename at the end.
+* szRel - A relative path created by MakeRelativePath. If this is not
+* a relative path, then a BSTR copy of it is returned and szFrom
+* is ignored.
+*
+*Outputs:
+* *pbstrAbs is allocated and set to an absolute path formed by applying
+* szRel to szFrom.
+*
+* Returns TIPERR_PathNotFound if szRel specifies too many "..\"s for
+* szFrom.
+*
+*************************************************************************/
+TIPERROR MakeAbsolutePath(LPOLESTR szFrom, LPOLESTR szRel, BSTR *pbstrAbs)
+{
+ UINT cDotDot;
+ BSTR bstrAbs;
+ LPOLESTR szFromLim;
+
+ // Determine if there's a volume name or if the first character
+ // is a backslash (non-mac only). If so, then szRel is not a
+ // relative path and just return a BSTRA copy of it. Just return
+ // a copy of szRel also if szFrom is empty.
+ if (szFrom[0] == '\0'
+#if OE_MAC
+ // As a special case for this function, treat a stand-alone
+ // filename (no colons) as a relative path, even though
+ // SkipVolumeName treats it as a volume name.
+ || (szRel != SkipVolumeName(szRel) && xstrchr(szRel, ':') != NULL)
+#else
+ || szRel != SkipVolumeName(szRel)
+ || szRel[0] == '\\'
+#endif // OE_MAC
+ ) {
+ bstrAbs = AllocBstr(szRel);
+ if (bstrAbs == NULL)
+ return TIPERR_OutOfMemory;
+ *pbstrAbs = bstrAbs;
+ return TIPERR_None;
+ }
+
+ // szRel begins with 0 or more "..\"s. Count them and skip over
+ // them.
+ for (cDotDot = 0; ostrncmp(szRel, WIDE("..\\"),3) == 0; cDotDot++, szRel = ostrinc(ostrinc(ostrinc(szRel))));
+
+ // Now strip off cDotDot directories from the end of szFrom.
+ szFromLim = StripDirsFromEnd(szFrom, cDotDot);
+
+ //
+ if (szFromLim == NULL)
+ return TIPERR_PathNotFound;
+
+ // The result will be the remaining szFrom appended to the remaining
+ // szTo, with a directory delimiter between them. Calculate the size
+ // of the BSTR to allocate to hold this and allocate it.
+
+#if OE_MAC
+ if (*szRel == ':')
+ szRel++;
+#endif // OE_MAC
+
+ bstrAbs = AllocBstrLen(NULL, (szFromLim+1-szFrom) + ostrblen0(szRel));
+ if (bstrAbs == NULL)
+ return TIPERR_OutOfMemory;
+
+ // Fill the bstr.
+ ostrncpy(bstrAbs, szFrom, szFromLim-szFrom);
+ bstrAbs[szFromLim-szFrom] = DirectoryDelimiter;
+ ostrcpy(bstrAbs+(szFromLim-szFrom)+1, szRel);
+
+ // Set the output parameter and return success.
+ *pbstrAbs = bstrAbs;
+ return TIPERR_None;
+}
+
+/***
+*TIPERROR GetBestLcidMatch - Get best registered lcid.
+*
+*Purpose:
+* Given the hkey of a particular registered typelib and the ideal LCID
+* of the typelib we'd like to reference, get the closest matching LCID
+* that is actually registered for that typelib. We first check for an
+* exact match. Then we check for <primary language/default sublang>.
+* If both of those fail, we just return the default lcid (0).
+*
+*Inputs:
+* hkey - The open registry key (probably opened via OpenTypeLibKey) for
+* a particular version of a particular typelib.
+* lcidIdeal - The lcid we'd ideally like to find.
+*
+*Outputs:
+* *plcidBest is set to the best matching lcid available, if one exists.
+* Returns TIPERR_None if a reasonable match is found.
+*
+* Note that the only possible failures here are due either to hkey being
+* invalid, or to it pointing at a corrupted registry entry.
+*************************************************************************/
+#pragma code_seg(CS_QUERY)
+
+BOOL FExistsRegisteredTypelib(HKEY hkey, char * rgchLcid, OLECHAR ** pszPlatform)
+{
+ HKEY hkeyLcid;
+ HKEY hkeyPlatform;
+ BOOL fExists = FALSE;
+
+ if (RegOpenKey(hkey, rgchLcid, &hkeyLcid) == ERROR_SUCCESS) {
+ if (oRegOpenKey(hkeyLcid, szPlatSubkey1, &hkeyPlatform) == ERROR_SUCCESS){
+ *pszPlatform = szPlatSubkey1;
+ RegCloseKey(hkeyPlatform);
+ fExists = TRUE; // got it
+ }
+#if OE_WIN
+ else if (oRegOpenKey(hkeyLcid, szPlatSubkey2, &hkeyPlatform) == ERROR_SUCCESS){
+ *pszPlatform = szPlatSubkey2;
+ RegCloseKey(hkeyPlatform);
+ fExists = TRUE; // got it
+ }
+#endif //OE_WIN
+ RegCloseKey(hkeyLcid);
+ }
+ return fExists;
+}
+
+TIPERROR GetBestLcidMatch(HKEY hkey, LCID lcidIdeal, LCID *plcidBest, OLECHAR ** pszPlatform)
+{
+ char rgchLcid[10];
+
+ // Create a string form of lcidIdeal.
+ ultoa(lcidIdeal, rgchLcid, 16);
+
+ // Is that LCID available?
+ if (FExistsRegisteredTypelib(hkey, rgchLcid, pszPlatform))
+ goto Found;
+
+ // If we didn't find an exact match to lcidIdeal, try getting the
+ // path corresponding to the same primary language but 0 sublang.
+ lcidIdeal = PRIMARYLANGID(lcidIdeal);
+ ultoa(lcidIdeal, rgchLcid, 16);
+ if (FExistsRegisteredTypelib(hkey, rgchLcid, pszPlatform))
+ goto Found;
+
+ // If we didn't find that, get the path corresponding to lcid 0.
+ lcidIdeal = 0;
+ rgchLcid[0] = '0';
+ rgchLcid[1] = '\0';
+ if (FExistsRegisteredTypelib(hkey, rgchLcid, pszPlatform))
+ goto Found;
+
+ return TIPERR_LibNotRegistered;
+
+Found:
+ // Finally, return the best matching lcid.
+ *plcidBest = lcidIdeal;
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+#if !OE_MAC
+
+/***
+*TIPERROR ConvertPathToUNC - Converts driveletter:path to \\server\share\path
+*Inputs:
+* szPath - A full path which may start with a drive letter.
+*Outputs:
+* If szPath doesn't start with a drive letter or if the drive letter refers
+* to a local device and not to a net share, then TIPERR_None is returned
+* and *pbstrOut is set to NULL.
+*
+* If szPath does start with a drive letter that refers to a net share,
+* then *plpstrOut is set to a copy of szPath, with the UNC \\server\share
+* replacing the drive letter.
+****************************************************************************/
+TIPERROR ConvertPathToUNC(LPOLESTR szPath, LPOLESTR *plpstrOut)
+{
+ OLECHAR szLocalDevice[4];
+ OLECHAR szUNCName[40];
+ LPOLESTR sz;
+ UINT wnErr;
+#if OE_WIN32
+ DWORD cbUNC; //defined differently on NT than Win
+#else
+ UINT cbUNC;
+#endif
+
+ LPOLESTR lpstr;
+
+ if (szPath[0] == '\0' || szPath[1] != ':') {
+ goto NoConversion;
+ }
+
+ szLocalDevice[0] = szPath[0];
+ szLocalDevice[1] = ':';
+ szLocalDevice[2] = '\0';
+
+ cbUNC = sizeof(szUNCName)/sizeof(szUNCName[0]);
+ wnErr = oWNetGetConnection(szLocalDevice, szUNCName, &cbUNC);
+
+ switch (wnErr) {
+ case WN_SUCCESS:
+ // cbUNC is *SUPPOSED* to hold the length of the name + the terminating
+ // zero, but the WIN16 version doesn't work under Windows NT v1.0, so
+ // we ignore it, and re-compute the length ourselves.
+ cbUNC = ostrblen(szUNCName); // length without null
+
+ // If this is not a UNC netname, convert it to a UNC name if possible.
+ if (szUNCName[0] != '\\' || szUNCName[1] != '\\') {
+
+ // If the name is a novell net name, convert it to UNC.
+ // UNDONE: DBCS: szUNCName[cbUNC-1] is incorrect for DBCS strings.
+ // It should probably be a fast-enough equivalent of:
+ // *xstrdec(szUNCName+cbUNC)
+ // The above line of code may, in fact, be fast enough.
+ if ((sz = ostrchr(szUNCName, '/')) != NULL &&
+ szUNCName[cbUNC-1] == ':') {
+ memmove(szUNCName+2, szUNCName, cbUNC*sizeof(OLECHAR));
+ szUNCName[0] = '\\';
+ szUNCName[1] = '\\';
+ DebAssert(sz[2] == '/', "ConvertPathToUNC");
+ sz[2] = '\\';
+ DebAssert(szUNCName[cbUNC+1] == ':', "ConvertPathToUNC");
+ szUNCName[cbUNC+1] = '\0';
+
+ // We added two backslashes and removed a colon.
+ // Update cbUNC appropriately.
+ cbUNC++;
+ }
+
+ // Otherwise, we have no clue what it is so don't convert the
+ // original filename.
+ else {
+ goto NoConversion;
+ }
+ }
+
+ // allocate string of length: UNCnameLen + (PathLen - 2) + 1 (for null)
+ lpstr = (LPOLESTR)MemAlloc(
+ (cbUNC+ostrblen(szPath)-2+1)*sizeof(OLECHAR));
+ if (lpstr == NULL)
+ return TIPERR_OutOfMemory;
+ ostrcpy(lpstr, szUNCName);
+ ostrcpy(lpstr+cbUNC, szPath+2);
+ *plpstrOut = lpstr;
+ return TIPERR_None;
+
+ case WN_BAD_POINTER:
+ case WN_MORE_DATA:
+ DebHalt("ConvertPathToUNC made a bad call to WNetGetConnection");
+ case WN_NET_ERROR:
+ return TIPERR_PathNotFound;
+
+ case WN_OUT_OF_MEMORY:
+ return TIPERR_OutOfMemory;
+
+ case WN_BAD_VALUE:
+ case WN_NOT_CONNECTED:
+ case WN_NOT_SUPPORTED:
+NoConversion:
+ *plpstrOut = NULL;
+ return TIPERR_None;
+ }
+
+ return TIPERR_None;
+}
+
+#endif // !OE_MAC
+
+
+/***
+* XSZ GetPathEnd - Returns the final path delimiter in the fullpath.
+* Returns NULL if there is no path delimiter in the fullpath.
+**************************************************************/
+#pragma code_seg(CS_INIT)
+LPOLESTR GetPathEnd(LPOLESTR szPath)
+{
+ LPOLESTR sz1, sz2;
+ sz1 = ostrrchr(szPath, WIDE('\\'));
+ sz2 = ostrrchr(szPath, WIDE(':'));
+ if (sz2 != NULL && sz1 <= sz2)
+ return sz2;
+ else
+ return sz1;
+}
+#pragma code_seg()
+
+/***
+* LPOLESTR IsolateFilename - Returns the filename in the fullpath.
+**************************************************************/
+LPOLESTR IsolateFilename(LPOLESTR szPath)
+{
+ LPOLESTR sz = GetPathEnd(szPath);
+ if (sz == NULL)
+ return szPath;
+ else
+ return sz+1;
+}
+
+#if OE_MAC
+#pragma code_seg( CS_CORE2 )
+#pragma PCODE_OFF
+#define EqualStringDiacNoCase(str1, str2) EqualString((str1), (str2), false, true)
+BOOL IsFilenameEqual(LPSTR szFile1, LPSTR szFile2)
+{
+ BOOL f;
+ c2pstr(szFile1);
+ c2pstr(szFile2);
+ f = EqualStringDiacNoCase((unsigned char *)szFile1,
+ (unsigned char *)szFile2);
+ p2cstr((unsigned char *)szFile1);
+ p2cstr((unsigned char *)szFile2);
+ return f;
+}
+#pragma PCODE_ON
+#pragma code_seg( )
+#endif // OE_MAC
+
+
+
+
+/***
+*ParseConstValString - parses a string of constant values for conditional compilation
+*
+*Inputs:
+* szDecl - a string with the following syntax :
+* [identifier = [+|-]value[: identifier = [+|-]value]*]
+* where each identifier has to be unique
+*
+*Output:
+* bstrdatarr - filled with the identifier strings and their corresponding values
+*
+* Exit:
+* Returns EBERR_InvalidCanstValSyntax if syntax of szDecl not correct,
+* else TIPERR_None or TIPERR_OutOfMemory.
+***********************************************************************/
+
+
+#if 0 //Dead Code
+/****************
+*TIPERROR IsDispatchType - Does a derive from IDispatch?
+*************************************************************/
+TIPERROR IsDispatchType(ITypeInfoA *ptinfo, BOOL *pisDispatch)
+{
+ TIPERROR err = TIPERR_None;
+ HREFTYPE hreftype;
+ TYPEATTR *ptattr;
+ ITypeInfoA *ptinfoNext;
+
+ ptinfo->AddRef();
+
+ // Loop until we find end of base list or find IDispatch.
+ while (1) {
+ IfErrGo(TiperrOfHresult(ptinfo->GetTypeAttr(&ptattr)));
+
+ // If ptinfo's typekind or guid tells us it's IDispatch, return TRUE.
+ if (ptattr->typekind == TKIND_DISPATCH ||
+ ptattr->guid == IID_IDispatch) {
+ *pisDispatch = TRUE;
+ break;
+ }
+
+ // This interface is not IDispatch and, if it has no base type,
+ // it can't derive from IDispatch. So return FALSE.
+ if (ptattr->cImplTypes == 0) {
+ *pisDispatch = FALSE;
+ break;
+ }
+
+ DebAssert(ptattr->typekind == TKIND_INTERFACE || ptattr->typekind == TKIND_COCLASS, "what else is there?");
+ DebAssert(ptattr->typekind != TKIND_INTERFACE || ptattr->cImplTypes == 1, "interface with multiple inheritance?!");
+
+ // Done with the typeattr.
+ ptinfo->ReleaseTypeAttr(ptattr);
+
+ // Get the base type of this interface
+ // or the default interface of this coclass.
+ IfErrGo(TiperrOfHresult(ptinfo->GetRefTypeOfImplType(0, &hreftype)));
+ IfErrGo(TiperrOfHresult(ptinfo->GetRefTypeInfo(hreftype, &ptinfoNext)));
+
+ ptinfo->Release();
+ ptinfo = ptinfoNext;
+ }
+
+ ptinfo->ReleaseTypeAttr(ptattr);
+
+Error:
+ ptinfo->Release();
+ return err;
+}
+#endif //0
+
+/***
+*oWNetGetConnection() - Faster version of WNetGetConnection for 16-bits
+*
+*Purpose:
+* WNetGetConnection is needlessly slow if the drive letter happens to
+* correspond to a local drive. GetDriveType() is much faster, so call it
+* to see if the drive is local or not. If it isn't, use WNetGetConnection
+* to get the UNC path name
+*
+****************************************************************************/
+#if OE_WIN16 // defined in ntstring.cxx for OE_WIN32
+UINT WINAPI oWNetGetConnection(LPSTR lpLocalName, LPSTR lpRemoteName, UINT FAR* lpnLength)
+{
+ UINT drivetype;
+ INT driveno;
+
+ DebAssert(*lpnLength == 40, "All callers pass a fixed-length string");
+ DebAssert(xstrlen(lpLocalName) == 2, "All callers pass a fixed-length string");
+ DebAssert(lpLocalName[1] == ':', "All callers pass a drive letter only");
+
+ // Win16 GetDriveType() must be passed a drive number (0=A, 1=B, etc.)
+ if (lpLocalName[0] >= 'A' && lpLocalName[0] <= 'Z')
+ driveno=lpLocalName[0]-'A';
+ else if (lpLocalName[0] >= 'a' && lpLocalName[0] <= 'z')
+ driveno=lpLocalName[0]-'a';
+ else
+ goto BadDriveLetter; // let WNetGetConnection choose the return value
+
+ drivetype = GetDriveType(driveno);
+ if ( DRIVE_FIXED == drivetype ||
+ DRIVE_REMOVABLE == drivetype) {
+ return WN_NOT_CONNECTED;
+ }
+BadDriveLetter:
+ return WNetGetConnection(lpLocalName, lpRemoteName, lpnLength);
+}
+#endif //!OE_WIN16
+
+
+
+
+#pragma code_seg(CS_QUERY)
+
+#ifndef OLEMINORVERS
+#if OE_WIN32
+#define OLEMINORVERS 10 // assume OLE 2.10
+#else //OE_WIN32
+// win16 typelib.dll for Daytona will require a special build. Oh well.
+#define OLEMINORVERS 02 // assume OLE 2.02
+#endif //OE_WIN32
+#endif //!OLEMINORVERS
+
+//Typelib version support
+#include "verstamp.h"
+#undef rmm // Use a fixed number for rmm
+#define rmm OLEMINORVERS
+// keep 'rup' the same as OB's version number for simplicity
+
+STDAPI_(DWORD) OaBuildVersion(void)
+{
+ // return rmm in the the high word, rup in the low word
+ return MAKELONG(rup, rmm);
+}
+#pragma code_seg()
diff --git a/private/oleauto/src/typelib/clutil.hxx b/private/oleauto/src/typelib/clutil.hxx
new file mode 100644
index 000000000..0d8fc3f30
--- /dev/null
+++ b/private/oleauto/src/typelib/clutil.hxx
@@ -0,0 +1,417 @@
+/***
+*clutil.hxx - Class Lib component-wide utility functions.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Component-wide utility function headers.
+*
+*Revision History:
+* 20-Jun-91 ilanc: Create
+* 03-Apr-92 martinc: placed the extern declarations outside of inline-fctns
+* 18-Jan-93 w-peterh: moved TypeDescKind <-> VarType functions from icutil.hxx
+* 12-Feb-93 w-peterh: added itdesc util functions
+* 16-Feb-93 w-jeffc: added HinstOfOLB
+* 28-Jun-93 stevenl: HinstOfCurOLB, ReleaseCurOLB
+* 24-Feb-94 RajivK: Added Make Exe support.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef CLUTIL_HXX_INCLUDED
+#define CLUTIL_HXX_INCLUDED
+
+#if OE_MAC
+#include "macos/aliases.h" // for AliasHandle
+#endif // OE_MAC
+
+#include "silver.hxx"
+#include "defn.hxx"
+#include "bstr.h"
+#include "blkmgr.hxx"
+#include "tdesck.hxx"
+
+
+#if OE_WIN32
+#include "winnls.h"
+#endif
+
+
+class EXBIND;
+class DYN_TYPEROOT;
+class NAMMGR;
+class GEN_PROJECT;
+class BSTRDATA_ARRAY;
+class GEN_PROJECT;
+
+ class OLE_TYPEMGR;
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szCLUTIL_HXX)
+#define SZ_FILE_NAME g_szCLUTIL_HXX
+#endif
+
+
+#if OE_WIN16
+#define SYSKIND_CURRENT SYS_WIN16
+#endif // OE_WIN16
+#if OE_WIN32
+#define SYSKIND_CURRENT SYS_WIN32
+#endif // OE_WIN32
+#if OE_MAC
+#define SYSKIND_CURRENT SYS_MAC
+#endif // OE_MAC
+
+
+// utility functions
+// Defines the GUID Layout structure
+#define GUID_Layout "lssbbbbbbbb"
+
+#if OE_MAC
+TIPERROR MacFileSearch(LPSTR szFile, BSTRA *pbstr);
+EBERR GetPathFromAlias(AliasHandle halias, char *pchPathname, UINT cbPathname, BOOL *pwasChanged);
+EBERR GetAliasFromPath(LPSTR szPathname, AliasHandle *phalias);
+#endif // OE_MAC
+
+VOID QuickSortIndex(ULONG *rgulToSort, UINT *rguIndex, UINT uCount);
+
+// Define min instance size for std module, min alignment
+#define CB_MIN_INSTANCE 2
+#define CB_MIN_ALIGNMENT 1
+
+
+#define HIMPTYPE_BASECLASS 0 // Note the himptype of the base class
+ // is always 0
+
+
+#if !OE_MAC
+TIPERROR ConvertPathToUNC(LPOLESTR szPath, LPOLESTR *pbstrOut);
+#endif // !OE_MAC
+
+VOID ReleaseAllRefdTypeLib();
+VOID ReleaseAllAppObject();
+
+class BASIC_TYPEINFO;
+
+#pragma code_seg()
+
+TIPERROR GetRegInfoForTypeLib(REFGUID guid,
+ WORD wMajorNum,
+ WORD wMinorNum,
+ LCID lcid,
+ LPOLESTR rgFileName);
+
+// Free functions free the structure and its contents
+VOID FreeFuncDesc(FUNCDESC FAR *pfdesc);
+VOID FreeVarDesc(VARDESCA FAR *pvardesc);
+VOID FreeTypeDesc(TYPEDESC FAR *ptypedesc);
+VOID FreeArrayDesc(ARRAYDESC FAR *parraydesc);
+
+// Init functions do not free or allocate, they only set a structures values
+// to some default values so Clear or Free functions can operate ok
+VOID InitTypeDesc(TYPEDESC FAR *ptdesc);
+VOID InitIdlDesc(IDLDESC FAR *pidldesc);
+VOID InitElemDesc(ELEMDESC FAR *pelemdesc);
+VOID InitVarDesc(VARDESCA FAR *pvardesc);
+VOID InitFuncDesc(FUNCDESC FAR *pfdesc);
+
+// Clear functions free the structures contents only
+VOID ClearArrayDesc(ARRAYDESC FAR *parraydesc);
+VOID ClearTypeDesc(TYPEDESC FAR *ptypedesc);
+VOID ClearIdlDesc(IDLDESC FAR *pidldesc);
+VOID ClearElemDesc(ELEMDESC FAR *pelemdesc);
+
+// Copy functions
+TIPERROR CopyArrayDesc(ARRAYDESC **pparraydescDest, ARRAYDESC *parraydescSrc);
+TIPERROR CopyTypeDesc(TYPEDESC *ptdescDest, TYPEDESC *ptdescSrc);
+
+#if !OE_WIN32
+// Defined in tip.cxx
+ OLE_TYPEMGR *Poletmgr();
+#endif // !OE_WIN32
+
+
+// some conversion functions
+extern BOOL VtValidInVariant(VARTYPE vt);
+extern BOOL VtValidInVariantArg(VARTYPE vt);
+
+
+// We define here some Tip API functions that are not yet
+// ready for prime time, i.e. they are not to be exposed
+// to object-phobic clients -- thus their decls do not appear
+// in exposed .h files. In principle, they will
+// eventually migrate to cl\clhost.h.
+// These functions are needed for our implemention of other Tip functions
+// that *are* exposed.
+// Like other Tip functions, the actual implementation is in tip.cxx.
+//
+
+
+
+
+TIPERROR ReadTextLine(STREAM *pstrm, XSZ rgchLine, UINT cchMax, BOOL shouldSkipBlankLines);
+TIPERROR WriteTextString(STREAM *pstrm, XSZ sz);
+TIPERROR WriteTextULong(STREAM *pstrm, ULONG ul);
+TIPERROR WriteTextSpaces(STREAM *pstrm, UINT cch);
+
+TIPERROR GetBestLcidMatch(HKEY hkey, LCID lcidIdeal, LCID *plcidBest, OLECHAR ** pszPlatform);
+ VOID SetOleTypemgr(OLE_TYPEMGR *poletmgr);
+
+#if !OE_WIN32
+
+#define Pmalloc() (Pappdata()->m_pimalloc)
+
+// Per-app data structure
+struct APP_DATA
+{
+ OLE_TYPEMGR FAR *m_poletmgr;
+ IMalloc FAR *m_pimalloc; // cache a pointer to the IMalloc
+ USHORT m_cTypeLib;
+ ITypeLib *m_ptlibStdole; // cache a pointer to the stdole typelib
+
+ // UNDONE: the following needs to go away when this functionality
+ // UNDONE: is moved into core OLE.
+ IErrorInfo FAR* m_perrinfo;
+
+ APP_DATA() {
+ m_pimalloc = NULL;
+ m_poletmgr = NULL;
+ m_cTypeLib = 0;
+ m_ptlibStdole = NULL;
+
+ // UNDONE: the following needs to go away when this functionality
+ // UNDONE: is moved into core OLE.
+ m_perrinfo = NULL;
+ }
+};
+
+TIPERROR InitAppData();
+VOID ReleaseAppData();
+APP_DATA *Pappdata();
+
+#endif // !OE_WIN32
+
+#if ID_DEBUG
+#define HeapChecker() Pmalloc()->IMallocHeapChecker();
+#endif
+
+
+#define CCH_TIMESTAMP_LENGTH 10
+void GetTimeStamp(OLECHAR *pchTimeStamp);
+TIPERROR CompareHimptypes(TYPE_DATA * const ptdata1,
+ HIMPTYPE himptype1,
+ TYPE_DATA * const ptdata2,
+ HIMPTYPE himptype2, BOOL *pfEqual);
+TIPERROR EquivHimptypes(TYPE_DATA * const ptdata1,
+ HIMPTYPE himptype1,
+ TYPE_DATA * const ptdata2,
+ HIMPTYPE himptype2,
+ BOOL *pfEqual);
+
+UINT HashOfHgnam(HGNAM hgnam);
+
+class GEN_DTINFO;
+BOOL IsUnqualifiable(GEN_DTINFO *pgdtinfo);
+
+// LibId handling functions
+enum LIBIDKIND {
+ LIBIDKIND_Unknown, // Error value.
+ LIBIDKIND_Registered, // *\G<guid>#maj.min#lcid#<path>#<regname>
+ // *\H on mac
+ LIBIDKIND_ForeignRegistered,// Registered libid created on foreign platform.
+ LIBIDKIND_Compressed, // *\R<hlib>, compressed libid reference.
+};
+
+#if 0
+BOOL FIsLibId(LPOLESTR szMaybeLibId);
+#endif
+LIBIDKIND GetLibIdKind(LPOLESTR szLibId);
+
+
+#if OE_MAC
+extern "C" EBERR GetPathFromFSSpec(const FSSpec *pfsspec, char *pchPathname, UINT cbPathname);
+extern "C" EBERR GetFSSpecOfAliasPath(char *pchPathname, FSSpec *pfsspec, BOOL *pbAliasSeen, char **ppchEnd, BOOL fResolveFile);
+#endif // OE_MAC
+
+TIPERROR MakeRelativePath(LPOLESTR szFrom, LPOLESTR szTo, LPOLESTR mszRel);
+TIPERROR MakeAbsolutePath(LPOLESTR szFrom, LPOLESTR szRel, BSTR *pbstrAbs);
+TIPERROR MakeAbsoluteLibId(LPOLESTR szDir, LPOLESTR szLibId, BSTR *pbstrLibIdAbs);
+TIPERROR SplitGuidLibId(LPOLESTR szLibId, LPOLESTR *pszGuid, LPOLESTR *pszGuidEnd, WORD *pwMaj, WORD *pwMin, LCID *plcid, LPOLESTR *pszPath, LPOLESTR *pszPathEnd);
+TIPERROR GetPathOfLibId(LPOLESTR szLibId, BSTR *pbstrPath);
+TIPERROR GetTypeInfoOfTypeId(LPOLESTR szTypeId, ITypeInfoA **pptinfo);
+TIPERROR GetLibIdOfRegLib(LPOLESTR szGuid, WORD wMajor, WORD wMinor, LCID lcid, LPOLESTR szPath, LPOLESTR szRegName, BSTR *pbstrLibId);
+TIPERROR GetLibIdOfTypeLib(ITypeLibA *ptlib, LPOLESTR szPath, BSTR *pbstrLibId);
+TIPERROR GetRegLibOfLibId(LPOLESTR szLibId, ITypeLibA **pptypelib);
+TIPERROR GetRegInfoForTypeLib(REFGUID guid,
+ WORD wMaj,
+ WORD wMin,
+ LCID lcid,
+ LPOLESTR rgFileName);
+STDAPI LoadRegTypeLibOfSzGuid(LPOLESTR szGuid,
+ WORD wMaj,
+ WORD wMin,
+ LCID lcid,
+ ITypeLibA **pptypelib);
+TIPERROR GetRegInfoForTypeLibOfSzGuid(LPOLESTR szGuid,
+ WORD wMaj,
+ WORD wMin,
+ LCID lcid,
+ LPOLESTR rgFileName,
+ BOOL fMustExist);
+
+struct TLIBKEY {
+ HKEY hkeyTLib, hkeyGuid, hkeyVers;
+};
+TIPERROR OpenTypeLibKey(LPOLESTR szGuid, WORD wMajor, WORD wMinor, TLIBKEY *ptlibkey);
+VOID CloseTypeLibKey(TLIBKEY *ptlibkey);
+
+
+void LibIdFromDocItem(LPOLESTR szDocItem, LPOLESTR szLibIdOut);
+void LibIdFromPath(LPOLESTR szPath, LPOLESTR szLibIdOut);
+TIPERROR SzLibIdLocalTypeIdOfTypeId(LPOLESTR szTypeId, BSTR *pbstrTypeId, LPOLESTR *pszLocalTypeId);
+TIPERROR SplitLocalTypeId(LPOLESTR szLocalTypeId, BSTR *pbstrLocalTypeId, LPOLESTR *pszEmbeddedLocalTypeId);
+TIPERROR MakeEmbeddedTypeId(LPOLESTR szTypeIdContainer, LPOLESTR szEmbeddedLocalTypeId, BSTR *pbstrTypeId);
+LPOLESTR SzTypeIdHmemberOfFunctionId(LPOLESTR szFunctionId, HMEMBER *phmember);
+
+
+TIPERROR IsTypeMembersEqual(LPDYNTYPEMEMBERS ptmbrs, LPDYNTYPEMEMBERS ptmbrs2, BOOL *pfIsEqual);
+BOOL IsSimpleType(TYPEDESCKIND tdesckind);
+
+
+BOOL IsIntegerType(TYPEDESCKIND tdesckind);
+TIPERROR GetDllEntryOfDynInfo(BSTRA *plstrDllFilename,
+ ULONG *puDllOrdinal,
+ LPOLESTR szDllFilename,
+ ULONG uDllOrdinal);
+TIPERROR GetDllEntryOfDataInfo(BSTRA *plstrDllFilename,
+ ULONG *puDllOrdinal,
+ HDLLENTRY_DEFN hdllentrydefn,
+ TYPE_DATA *ptdata);
+TIPERROR RegisterErrorOfHdefn(DYN_TYPEROOT *pdtroot,
+ TIPERROR errBind,
+ HDEFN hdefn);
+TIPERROR AddTypeLibToList(GEN_PROJECT *pgenproj);
+TIPERROR ResetTypeLibList();
+
+UINT Count(TYPE_DATA *ptdata, HDEFN hdefnFirst);
+
+VOID GetExecutingProject(GEN_PROJECT **ppgenproj);
+
+BOOL IsBasicFrameOnStack();
+BOOL IsModuleFrameOnStack(DYN_TYPEROOT *pdtroot);
+
+// Functions related to localization support
+extern "C" BOOL VerifyLcid(LCID lcid);
+BOOL LcStrEqi(LCID lcid, XSZ_CONST szStr1, XSZ_CONST szStr2);
+void StrGetNewLcid(void);
+BOOL IsEuroLang(LANGID langid);
+
+TIPERROR ParseConstValString(LPOLESTR szValues, BSTRDATA_ARRAY *pbstrdatarr);
+
+/***
+*BOOL IsDBCS()
+*Purpose:
+* Determines if a given lcid represents a DBCS locale
+*
+*Inputs:
+* lcid : locale id
+*
+*Outputs:
+* returns TRUE iff a DBCS is used with this locale
+*
+****************************************************************************/
+
+inline BOOL IsDBCS(LCID lcid)
+{
+ switch(PRIMARYLANGID(lcid)) {
+ case LANG_CHINESE:
+ case LANG_JAPANESE:
+ case LANG_KOREAN:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+
+// HCHUNK to BSTR copy/conversions.
+TIPERROR GetBStrOfHChunk(BLK_MGR *pbm, HCHUNK hchunk, int cb, BSTR *plstr);
+TIPERROR GetBStrOfHsz(BLK_MGR *pbm, HCHUNK hsz, BSTR *plstr);
+
+
+extern UINT RoundDownPower2(UINT u);
+
+// inline functions
+
+// had to move the following declerations out of the inline functions
+// SizeofTdesckind and AlignmentTdesckind (for cfront)
+
+extern char NEARDATA g_rgrgcbSizeType[SYS_MAX][TDESCKIND_MAX];
+
+inline USHORT SizeofTdesckind(TYPEDESCKIND tdesckind, SYSKIND syskind)
+{
+ return (USHORT)(SHORT)g_rgrgcbSizeType[syskind][tdesckind];
+}
+
+
+/***
+*HashOfHgnam() - Extracts hash value from hgnam
+*Purpose:
+* Extracts hash value from hgnam.
+* It can relied upon that hgnam & 0xFFFF == HashOfHlnam(hlnam).
+*
+*Entry:
+* None.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline UINT HashOfHgnam(HGNAM hgnam)
+{
+ return (UINT) (hgnam & (unsigned short) 0x0000FFFF);
+}
+
+
+//////////////////////////////////////////////////////////////////
+//
+// OB Specify declarations
+//
+
+
+UINT HashSz(LPOLESTR sz);
+UINT HashSzTerm(LPOLESTR sz, XCHAR xchSeparator);
+
+
+#define _IsValidHdefn_(pos) \
+ HDEFN hdefn = (HDEFN)(ULONG)(void *)pos; \
+ return ((hdefn != HCHUNK_Nil) && (hdefn != (HCHUNK)1));
+
+#define _IsEqualHdefn_(pos, pos2) \
+ HDEFN hdefn = (HDEFN)(ULONG)(void *)pos; \
+ HDEFN hdefn2 = (HDEFN)(ULONG)(void *)pos2; \
+ return hdefn == hdefn2;
+
+
+
+LPOLESTR GetPathEnd(LPOLESTR szPath);
+LPOLESTR IsolateFilename(LPOLESTR szPath);
+
+#if OE_MAC
+BOOL IsFilenameEqual(LPSTR szFile1, LPSTR szFile2);
+#else
+#define IsFilenameEqual(s1, s2) (!ostricmp(s1, s2))
+#endif // OE_MAC
+
+
+
+
+#if 0
+TIPERROR IsDispatchType(ITypeInfoA *ptinfo, BOOL *pisDispatch);
+#endif
+
+#endif // ! CLUTIL_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/convert.cxx b/private/oleauto/src/typelib/convert.cxx
new file mode 100644
index 000000000..1984d4969
--- /dev/null
+++ b/private/oleauto/src/typelib/convert.cxx
@@ -0,0 +1,356 @@
+#include "silver.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+# undef SZ_FILE_NAME
+static char szConvertCxx[] = __FILE__;
+# define SZ_FILE_NAME szConvertCxx
+#endif
+
+/*---------------------------------------------------------------------*/
+/* ANSI BSTR API */
+/*---------------------------------------------------------------------*/
+
+
+STDAPI_(BSTRA)
+SysAllocStringA(const char * psz)
+{
+ if(psz == NULL)
+ return NULL;
+
+ return((BSTRA) SysAllocStringByteLen(psz, xstrlen(psz)));
+}
+
+
+STDAPI_(BSTRA)
+SysAllocStringLenA(const char * psz, unsigned int len)
+{
+ return ((BSTRA) SysAllocStringByteLen(psz, len));
+}
+
+
+STDAPI_(void)
+SysFreeStringA(BSTRA bstr)
+{
+ SysFreeString((BSTR) bstr);
+}
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: StringFromGUID2A
+//
+// Synopsis: Creates an ANSI wrapper of an Unicode OLE2 routine.
+//
+// Returns: See OLE2 docs for details on this API.
+//
+//---------------------------------------------------------------------------
+STDAPI_(int) StringFromGUID2A(REFGUID rguid, LPSTR szGuid, int cbMax)
+{
+ int cchRet;
+
+#ifndef CCH_SZGUID0
+// char count of a guid in ansi/unicode form (including trailing null)
+#define CCH_SZGUID0 39
+#endif
+
+ OLECHAR szGuidW[CCH_SZGUID0];
+
+ cchRet = StringFromGUID2(rguid, szGuidW, CCH_SZGUID0);
+
+ // convert szGuidW from unicode to Ansi. Can't just convert in place.
+ WideCharToMultiByte(CP_ACP,
+ 0,
+ szGuidW,
+ CCH_SZGUID0,
+ szGuid,
+ cbMax,
+ NULL,
+ NULL);
+ return cchRet;
+}
+
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertStringToW
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+HRESULT __fastcall ConvertStringToW(LPCSTR pStrA, LPOLESTR * ppStrW)
+{
+ ULONG Count;
+ HRESULT hResult;
+
+
+ // If input is null then just return the same.
+ if (pStrA == NULL)
+ {
+ *ppStrW = NULL;
+ return ResultFromScode(S_OK);
+ }
+
+ Count = xstrlen(pStrA) + 1;
+
+ hResult = ConvertStringAlloc(Count * sizeof(WCHAR), (LPVOID *)ppStrW);
+ if (FAILED(hResult))
+ return (hResult);
+
+ MultiByteToWideChar(CP_ACP, 0, pStrA, Count, *ppStrW, Count);
+
+ return ResultFromScode(S_OK);
+}
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertStringToA
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+HRESULT __fastcall ConvertStringToA(LPCOLESTR pStrW, LPSTR * ppStrA)
+{
+ ULONG Count, cbAnsi;
+ HRESULT hResult;
+
+
+ // If input is null then just return the same.
+ if (pStrW == NULL)
+ {
+ *ppStrA = NULL;
+ return ResultFromScode(S_OK);
+ }
+
+ Count = wcslen(pStrW)+1;
+ cbAnsi = WideCharToMultiByte(CP_ACP, 0, pStrW, Count, NULL, 0, NULL, NULL);
+
+ hResult = ConvertStringAlloc(cbAnsi, (LPVOID *)ppStrA);
+ if (FAILED(hResult))
+ return (hResult);
+
+ WideCharToMultiByte(CP_ACP, 0, pStrW, Count, *ppStrA, cbAnsi, NULL, NULL);
+
+ return ResultFromScode(S_OK);
+}
+
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertStringAlloc
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+HRESULT __fastcall ConvertStringAlloc(ULONG ulSize, LPVOID * pptr)
+{
+ IMalloc * pIMalloc;
+
+ // CONSIDER: use IMalloc cached in the pappdata structure
+ if (CoGetMalloc(MEMCTX_TASK, &pIMalloc) != 0)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+ *pptr = pIMalloc->Alloc(ulSize);
+
+ pIMalloc->Release();
+
+ if (*pptr == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+ return ResultFromScode(S_OK);
+}
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertStringFree
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+VOID __fastcall ConvertStringFree(LPSTR ptr)
+{
+ IMalloc * pIMalloc;
+
+
+ if (ptr == NULL)
+ return;
+
+ // CONSIDER: use IMalloc cached in the pappdata structure
+ if (CoGetMalloc(MEMCTX_TASK, &pIMalloc) != 0)
+ return;
+
+ pIMalloc->Free(ptr);
+ pIMalloc->Release();
+}
+
+
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertBstrToWInPlace
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+HRESULT __fastcall ConvertBstrToWInPlace(LPBSTR ppStrW)
+{
+ ULONG Count;
+ HRESULT hResult;
+
+
+ // If input is null then just return.
+ if (*ppStrW == NULL)
+ return ResultFromScode(S_OK);
+
+ BSTRA pStrA = (BSTRA)*ppStrW;
+
+ Count = MultiByteToWideChar(CP_ACP, 0, pStrA, SysStringByteLen((BSTR) pStrA),
+ NULL, NULL);
+
+ hResult = ConvertBstrAlloc(Count * sizeof(WCHAR), ppStrW);
+ if (FAILED(hResult))
+ return (hResult);
+
+ MultiByteToWideChar(CP_ACP, 0, pStrA, SysStringByteLen((BSTR) pStrA)+1,
+ *ppStrW, Count+1);
+
+ SysFreeStringA(pStrA);
+
+ return ResultFromScode(NOERROR);
+}
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertBstrToW
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+HRESULT __fastcall ConvertBstrToW(LPCSTR pStrA, BSTR * ppStrW)
+{
+ ULONG Count;
+ HRESULT hResult;
+
+
+ // If input is null then just return the same.
+ if (pStrA == NULL)
+ {
+ *ppStrW = NULL;
+ return ResultFromScode(S_OK);
+ }
+
+ Count = MultiByteToWideChar(CP_ACP, 0, pStrA, SysStringByteLen((BSTR) pStrA),
+ NULL, NULL);
+
+ hResult = ConvertBstrAlloc(Count * sizeof(WCHAR), ppStrW);
+ if (FAILED(hResult))
+ return (hResult);
+
+ MultiByteToWideChar(CP_ACP, 0, pStrA, SysStringByteLen((BSTR) pStrA)+1,
+ *ppStrW, Count+1);
+
+ return ResultFromScode(NOERROR);
+}
+
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertBstrToA
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+HRESULT __fastcall ConvertBstrToAInPlace(LPBSTRA ppStrA)
+{
+ // If input is null then just return.
+ if (*ppStrA == NULL)
+ return ResultFromScode(S_OK);
+
+ BSTR pStrW = (BSTR)*ppStrA;
+
+ HRESULT hResult = ConvertBstrToA(pStrW, ppStrA);
+ if (FAILED(hResult))
+ return (hResult);
+
+ SysFreeString(pStrW);
+
+ return (NOERROR);
+}
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertBstrToA
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+HRESULT __fastcall ConvertBstrToA(BSTR pStrW, LPBSTRA ppStrA)
+{
+ ULONG Count;
+ HRESULT hResult;
+
+
+ // If input is null then just return the same.
+ if (pStrW == NULL)
+ {
+ *ppStrA = NULL;
+ return ResultFromScode(S_OK);
+ }
+
+ Count = WideCharToMultiByte(CP_ACP, 0, pStrW, SysStringLen(pStrW),
+ NULL, NULL, NULL, NULL);
+
+ hResult = ConvertBstrAlloc(Count, (LPBSTR)ppStrA);
+ if (FAILED(hResult))
+ return (hResult);
+
+ WideCharToMultiByte(CP_ACP, 0, pStrW, SysStringLen(pStrW)+1, *ppStrA, Count+1, NULL, NULL);
+
+ return ResultFromScode(NOERROR);
+}
+
+
+
+
+//+--------------------------------------------------------------------------
+//
+// Routine: ConvertBstrAlloc
+//
+// Synopsis:
+//
+// Returns: HRESULT Error code.
+//
+//---------------------------------------------------------------------------
+HRESULT __fastcall ConvertBstrAlloc(ULONG ulSize, LPBSTR pptr)
+{
+ *pptr = SysAllocStringByteLen(NULL, ulSize);
+ if (*pptr == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+ return ResultFromScode(NOERROR);
+}
diff --git a/private/oleauto/src/typelib/convert.hxx b/private/oleauto/src/typelib/convert.hxx
new file mode 100644
index 000000000..4bbad27cc
--- /dev/null
+++ b/private/oleauto/src/typelib/convert.hxx
@@ -0,0 +1,37 @@
+#ifndef CONVERT_HXX_INCLUDED
+#define CONVERT_HXX_INCLUDED
+
+#if OE_WIN32
+
+#if 0
+STDAPI_(int) SysReAllocStringA(BSTRA FAR*, const char FAR*);
+STDAPI_(unsigned int) SysStringLenA(BSTRA);
+HRESULT __fastcall ConvertStringToWInPlace(LPOLESTR * ppStrW);
+HRESULT __fastcall ConvertStringToBstrW(LPCSTR pStrA, LPBSTR pbstrW);
+HRESULT __fastcall ConvertStringToAInPlace(LPSTR * ppStrA);
+#endif
+STDAPI_(BSTRA) SysAllocStringA(const char FAR*);
+STDAPI_(BSTRA) SysAllocStringLenA(const char FAR*, unsigned int);
+STDAPI_(int) SysReAllocStringLenA(BSTRA FAR*, const char FAR*, unsigned int);
+STDAPI_(void) SysFreeStringA(BSTRA);
+
+STDAPI_(int) StringFromGUID2A(REFGUID rguid, LPSTR lpsz, int cbMax);
+
+HRESULT __fastcall ConvertStringToW(LPCSTR pStrA, LPOLESTR * ppStrW);
+
+HRESULT __fastcall ConvertStringToA(LPCOLESTR pStrW, LPSTR * ppStrA);
+
+HRESULT __fastcall ConvertStringAlloc(ULONG ulSize, LPVOID * pptr);
+VOID __fastcall ConvertStringFree(LPSTR ptr);
+
+HRESULT __fastcall ConvertBstrToWInPlace(LPBSTR ppStrW);
+HRESULT __fastcall ConvertBstrToW(LPCSTR pStrA, BSTR * ppStrW);
+
+HRESULT __fastcall ConvertBstrToAInPlace(LPBSTRA ppStrA);
+HRESULT __fastcall ConvertBstrToA(BSTR pStrW, LPBSTRA ppStrA);
+
+HRESULT __fastcall ConvertBstrAlloc(ULONG ulSize, LPBSTR pptr);
+
+#endif //OE_WIN32 (whole file)
+
+#endif //CONVERT_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/ctseg.hxx b/private/oleauto/src/typelib/ctseg.hxx
new file mode 100644
index 000000000..86ca764bc
--- /dev/null
+++ b/private/oleauto/src/typelib/ctseg.hxx
@@ -0,0 +1,84 @@
+/***
+*ctseg.hxx - COMPILETIME_SEG header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* COMPILETIME_SEG maps a SHEAP_MGR managed heap for use by
+* compile-time clients (e.g. DYN_TYPEMEMBERS).
+*
+*Revision History:
+*
+* 20-Mar-91 ilanc: Created.
+*
+*****************************************************************************/
+
+#ifndef CTSEG_HXX_INCLUDED
+#define CTSEG_HXX_INCLUDED
+
+#include "sheapmgr.hxx"
+
+#include "impmgr.hxx"
+#include "dtmbrs.hxx"
+#include "entrymgr.hxx"
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szCTSEG_HXX)
+#define SZ_FILE_NAME g_szCTSEG_HXX
+#endif
+
+
+/***
+*class COMPILETIME_SEG : - ctseg
+*Purpose:
+* The COMPILETIME_SEG structure is used by DYN_TYPEROOT to specify
+* where the objects contained within the compile time segment are
+* to be constructed. No COMPILETIME_SEG instance is constructed.
+***********************************************************************/
+
+class COMPILETIME_SEG
+{
+ friend TIPERROR DYN_TYPEROOT::GetImpMgr(IMPMGR **ppimpmgr);
+ friend TIPERROR DYN_TYPEROOT::GetDtmbrs(DYN_TYPEMEMBERS **pdtmbrs);
+ friend TIPERROR DYN_TYPEROOT::GetEntMgr(ENTRYMGR **pentmgr);
+
+public:
+ SHEAP_MGR m_sheapmgr;
+
+ nonvirt UINT GetSize();
+
+#if ID_DEBUG
+ nonvirt UINT DebShowSize();
+#else
+ nonvirt VOID DebShowSize() {}
+#endif
+
+protected:
+ COMPILETIME_SEG(DYN_TYPEROOT *pdtroot);
+ nonvirt ~COMPILETIME_SEG() {}
+ COMPILETIME_SEG();
+
+ IMPMGR m_impmgr;
+ DYN_TYPEMEMBERS m_dtmbrs;
+ ENTRYMGR m_entmgr;
+};
+
+// inline methods
+//
+
+inline COMPILETIME_SEG::COMPILETIME_SEG(DYN_TYPEROOT *pdtroot)
+// : m_dtmbrs(&m_sheapmgr, pdtroot)
+{
+}
+
+inline COMPILETIME_SEG::COMPILETIME_SEG()
+{
+
+ DebHalt("COMPILETIME_SEG::COMPILETIME_SEG: can't call.");
+}
+
+
+#endif // ! CTSEG_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dassert.c b/private/oleauto/src/typelib/dassert.c
new file mode 100644
index 000000000..3c6618788
--- /dev/null
+++ b/private/oleauto/src/typelib/dassert.c
@@ -0,0 +1,35 @@
+// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+//
+// This file was automatically generated by MKASSERT on 08/04/94 01:46:55
+//
+// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+
+#include "types.h"
+
+#if ID_DEBUG
+
+char FAR g_szBLKMGR_HXX[] = "BLKMGR.HXX";
+char FAR g_szDBLKMGR_HXX[] = "DBLKMGR.HXX";
+char FAR g_szCLTYPES_HXX[] = "CLTYPES.HXX";
+char FAR g_szDBINDTBL_HXX[] = "DBINDTBL.HXX";
+char FAR g_szDEFN_HXX[] = "DEFN.HXX";
+char FAR g_szENTRYMGR_HXX[] = "ENTRYMGR.HXX";
+char FAR g_szEXBIND_HXX[] = "EXBIND.HXX";
+char FAR g_szGBINDTBL_HXX[] = "GBINDTBL.HXX";
+char FAR g_szGDTINFO_HXX[] = "GDTINFO.HXX";
+char FAR g_szGPTBIND_HXX[] = "GPTBIND.HXX";
+char FAR g_szGTLIBOLE_HXX[] = "GTLIBOLE.HXX";
+char FAR g_szNAMMGR_HXX[] = "NAMMGR.HXX";
+char FAR g_szSHEAPMGR_HXX[] = "SHEAPMGR.HXX";
+char FAR g_szSTLTINFO_HXX[] = "STLTINFO.HXX";
+char FAR g_szTDATA_HXX[] = "TDATA.HXX";
+char FAR g_szTLIBUTIL_HXX[] = "TLIBUTIL.HXX";
+char FAR g_szTLS_C[] = "TLS.C";
+char FAR g_szCTSEG_HXX[] = "CTSEG.HXX";
+char FAR g_szBLKDSC32_HXX[] = "BLKDSC32.HXX";
+char FAR g_szMACHINE_HXX[] = "MACHINE.HXX";
+char FAR g_szMACROS_HXX[] = "MACROS.HXX";
+char FAR g_szBLKMGR32_HXX[] = "BLKMGR32.HXX";
+char FAR g_szDBM1632_HXX[] = "DBM1632.HXX";
+
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/typelib/dbindtbl.cxx b/private/oleauto/src/typelib/dbindtbl.cxx
new file mode 100644
index 000000000..71bef3033
--- /dev/null
+++ b/private/oleauto/src/typelib/dbindtbl.cxx
@@ -0,0 +1,811 @@
+/***
+*dbindtbl.cxx - DYN_BINDNAME_TABLE class implementation
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Class for name binding table.
+*
+*Revision History:
+*
+* 17-Jun-92 ilanc: Created (from bindtbl.cxx)
+* 02-Jul-92 w-peterh: added rectypedefn support
+* 10-Jul-92 w-peterh: set ptbind member of BindDescs for Nested Types
+* 30-Jul-92 w-peterh: removed overloading of functions on arity
+* 30-Apr-93 w-jeffc: made DEFN data members private
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+
+#define DYN_BINDNAME_TABLE_VTABLE
+#include "dbindtbl.hxx"
+#include "dtbind.hxx"
+#include "gdtinfo.hxx"
+#include "dtmbrs.hxx"
+#include "nammgr.hxx"
+#include "clutil.hxx" // for HashOfHgnam()
+#include <limits.h> // for INT_MAX
+#include "xstring.h" // for memset
+
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+static char szDbindtblCxx[] = __FILE__;
+#define SZ_FILE_NAME szDbindtblCxx
+#endif
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::Constructor - Construct an instance.
+*Purpose:
+* Constructs a DYN_BINDNAME_TABLE instance.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+DYN_BINDNAME_TABLE::DYN_BINDNAME_TABLE()
+{
+ m_pblkmgr = NULL;
+ m_hchunkBucketTbl = HCHUNK_Nil;
+
+ m_cBuckets = BIND_INVALID_INDEX;
+
+ m_ptdata = NULL;
+ m_pnammgr = NULL;
+}
+#pragma code_seg( )
+
+
+// Dtor: no need to release m_ptdata since refcount
+// wasn't bumped.
+//
+#pragma code_seg( CS_CORE )
+DYN_BINDNAME_TABLE::~DYN_BINDNAME_TABLE()
+{
+}
+#pragma code_seg( )
+
+
+/***
+*PROTECTED DYN_BINDNAME_TBL::Pdtbind
+*Purpose:
+* Gets pointer to containing module-level typebind.
+*
+*Implementation Notes:
+* NOTE: defined inline here and not in the header becuase
+* of mutual dependency between stlib and gptbind.
+*
+* Subtracts from this pointer the offset of this
+* embedded instance in container. Offset is obtained
+* from a DYN_TYPEBIND static member const.
+*
+*Entry:
+*
+*Exit:
+* DYN_TYPEBIND *
+*
+***********************************************************************/
+
+inline DYN_TYPEBIND *DYN_BINDNAME_TABLE::Pdtbind() const
+{
+ return (DYN_TYPEBIND *)((BYTE *)this - DYN_TYPEBIND::oDbindnametbl);
+}
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::Initializer - initialize an instance.
+*Purpose:
+* initializes a DYN_BINDNAME_TABLE instance.
+*
+*Implementation Notes:
+*
+*Entry:
+* pblkmgr
+* pdtroot DYN_TYPEROOT of containing TYPEINFO.
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_BINDNAME_TABLE::Init(BLK_MGR *pblkmgr,
+ DYN_TYPEROOT *pdtroot)
+{
+ TIPERROR err;
+
+ DebAssert(pblkmgr != NULL, "DYN_BINDNAME_TABLE: pblkmgr uninitialized.");
+ DebAssert(pdtroot != NULL, "bad DYN_TYPEROOT.");
+
+ // cache NAMMGR
+ IfErrRet(pdtroot->GetNamMgr(&m_pnammgr));
+
+ // get and cache TYPE_DATA from synthesized DYN_TYPEBIND etc.
+ // Don't bump refcount -- since lifetime is no longer
+ // that TYPE_DATA.
+ //
+ m_ptdata = Pdtbind()->Pdtmbrs()->Ptdata();
+ m_pblkmgr = pblkmgr;
+
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+
+/***
+*PROTECTED DYN_BINDNAME_TABLE::GetBucketOfHlnam
+*Purpose:
+* Gets the bucket of an hlnam, based on its hash value.
+*
+*Implementation Notes:
+*
+*Entry:
+* hlnam - name to get the bucket of.
+*
+*Exit:
+* Returns a pointer to the DEFN.
+*
+***********************************************************************/
+
+UINT DYN_BINDNAME_TABLE::GetBucketOfHlnam(HLNAM hlnam) const
+{
+ DebAssert(hlnam != HCHUNK_Nil, "Invalid hlnam.");
+
+ if (m_cBuckets == 0) {
+ return (UINT)BIND_INVALID_INDEX;
+ }
+
+ return (UINT)(((USHORT)m_pnammgr->HashOfHlnam(hlnam)) % m_cBuckets);
+}
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::BuildTable
+*Purpose:
+* Builds hashtable.
+*
+*Implementation Notes:
+* NOTE: there is a table per derived class, i.e. the list
+* is not flattened. Must recurse on base class bindtables.
+*
+* Hashtable (HLNAM -> HDEFN) is allocated if containing
+* TYPEBIND invalid.
+* Note that only this function need knowledge of the
+* module's TYPE_DATA -- which was cached at Init time.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_BINDNAME_TABLE::BuildTable()
+{
+ UINT cMeth, cDataMember, cNestedType;
+ TIPERROR err;
+
+ DebAssert(m_ptdata != NULL, "null TYPE_DATA.");
+
+ // release the existing table (if any).
+ ReleaseTable();
+
+ // allocate hashtable
+ // (1) determine size of hashtable:
+
+ cMeth = m_ptdata->CMeth();
+ cDataMember = m_ptdata->CDataMember();
+ cNestedType = m_ptdata->CNestedType();
+
+ // allocate the table
+ IfErrRet(SetTableSize(cMeth + cDataMember + cNestedType));
+
+ // (2) Now iterate over member lists and build BIND_DESCs
+ // and enter them into hashtable.
+ // - data members, bases, functions
+ //
+ IfErrGo(TraverseDefnList(m_ptdata->HfdefnFirstMeth()));
+ IfErrGo(TraverseDefnList(m_ptdata->HdefnFirstDataMbrNestedType()));
+
+ return TIPERR_None;
+
+Error:
+ ReleaseTable();
+ return err;
+}
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::ReleaseTable()
+*Purpose:
+* Invalidates the binding table.
+*
+*Entry:
+* None.
+*
+*Exit:
+* BOOL
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID DYN_BINDNAME_TABLE::ReleaseTable()
+{
+ UINT cbSizeTable;
+
+ DebAssert(m_pblkmgr != NULL, "Invalid BLK_MGR.");
+
+ if (IsValid()) {
+ DebAssert(m_cBuckets != ~0, "bad bindtable.");
+
+ // free the table
+ cbSizeTable = m_cBuckets * sizeof(sHDEFN);
+ m_pblkmgr->FreeChunk(m_hchunkBucketTbl, cbSizeTable);
+ m_hchunkBucketTbl = HCHUNK_Nil;
+ }
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::AddHdefn
+*Purpose:
+* Add the given Hdefn to the table.
+*
+*Implementation Notes:
+* Note: Because we allocate the table twice the number of
+* entries in it, it should never be full. Thus we assert.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+void DYN_BINDNAME_TABLE::AddHdefn(HDEFN hdefn)
+{
+ DEFN *qdefn;
+ sHDEFN *rqhdefn;
+ UINT iBucket, iFirstBucket;
+
+ DebAssert(IsValid(), "Table should be valid.");
+
+ // Dereference the hdefn so we can get the hlnam
+ qdefn = QdefnOfHdefn(hdefn);
+ rqhdefn = Rqhdefn();
+ iFirstBucket = GetBucketOfHlnam(qdefn->Hlnam());
+
+ BOOL fDone = FALSE;
+ for (iBucket = iFirstBucket;
+ !fDone;
+ fDone = (iBucket = (iBucket + 1) % m_cBuckets) == iFirstBucket) {
+
+ if (rqhdefn[iBucket] == (sHDEFN)HDEFN_Nil) {
+ rqhdefn[iBucket] = (sHDEFN)hdefn;
+ return;
+ }
+ }
+
+ DebHalt("Table full.");
+}
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::Read
+*Purpose:
+* Read serialized image of BINDNAME_TABLE.
+*
+*Implementation Notes:
+* Serialized format:
+*
+*Entry:
+* pstrm - STREAM to read image from (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_BINDNAME_TABLE::Read(STREAM *pstrm)
+{
+ USHORT ushort;
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // BLK_MGR was already deseralized by TYPE_DATA.
+
+ // Deserialize BINDNAME_TABLE meta-info.
+ IfErrRet(pstrm->ReadUShort(&ushort));
+ m_cBuckets = ushort;
+
+ IfErrRet(pstrm->ReadUShort(&ushort));
+
+ m_hchunkBucketTbl = ushort;
+
+#if HP_BIGENDIAN
+ // now that the above data members are read, we can swap the BIND_DESCs
+ SwapBindDescs();
+#endif //HP_BIGENDIAN
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::Write
+*Purpose:
+* Write image of BINDNAME_TABLE.
+*
+*Implementation Notes:
+* Serialized format:
+* cBuckets
+* hchunkBucketTbl
+*
+*Entry:
+* pstrm - STREAM to write image to (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR DYN_BINDNAME_TABLE::Write(STREAM *pstrm)
+{
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // BLK_MGR was already serialized by TYPE_DATA.
+
+ // Then serialize BINDNAME_TABLE meta-info.
+ IfErrRet(pstrm->WriteUShort((USHORT)m_cBuckets));
+ IfErrRet(pstrm->WriteUShort((USHORT)m_hchunkBucketTbl));
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#if HP_BIGENDIAN
+/***
+*PUBLIC DYN_BINDNAME_TABLE::SwapBindDescs
+*Purpose:
+* Swap the bytes in the binding tables
+*
+*Implementation Notes:
+* sHDEFNs are just USHORTs, so treat the table as one short array.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+void DYN_BINDNAME_TABLE::SwapBindDescs() const
+{
+ if (IsValid()) {
+ SwapShortArray((VOID *)Rqhdefn(), m_cBuckets);
+ }
+}
+#endif // HP_BIGENDIAN
+
+
+/***
+*PROTECTED DYN_BINDNAME_TABLE::FindIndexOfHlnam
+*Purpose:
+* Find the instance of the hlnam.
+*
+*Implementation Notes:
+*
+*Entry:
+* hlnam - The name to find.
+* iStartBucket - Where to start looking from.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+UINT DYN_BINDNAME_TABLE::FindIndexOfHlnam(HLNAM hlnam,
+ UINT iStartBucket) const
+{
+ sHDEFN *rqhdefn;
+ UINT iBucket;
+
+ // If the table is empty, won't find it
+ DebAssert(IsValid(), "Table should be valid.");
+
+ // If the starting bucket isn't valid, then the name
+ // can't be in this table...
+ //
+ if ((USHORT)iStartBucket == BIND_INVALID_INDEX) {
+ return BIND_INVALID_INDEX;
+ }
+
+ // Dereference the hdefn so we can get the hlnam
+ rqhdefn = Rqhdefn();
+
+ // Loop through the table, starting at the given
+ // index.
+ //
+ BOOL fDone = FALSE;
+ for (iBucket = iStartBucket;
+ !fDone;
+ fDone = (iBucket = (iBucket + 1) % m_cBuckets) == iStartBucket) {
+
+ // If the bucket is empty, our linear probe failed
+ // Note: this should be the ONLY way to fail to find a given name.
+ //
+ if (rqhdefn[iBucket] == (sHDEFN)HDEFN_Nil) {
+ return (UINT)BIND_INVALID_INDEX;
+ }
+
+ // Check to see if the names are the same
+ if (QdefnOfHdefn((HDEFN)rqhdefn[iBucket])->Hlnam() == hlnam) {
+ return iBucket;
+ }
+ }
+
+ DebHalt("should never reach here since table should never be full.");
+
+ // We should never reach this, but the compiler will
+ // complain if it isn't there.
+ //
+ return (UINT)BIND_INVALID_INDEX;
+}
+
+
+/***
+*PROTECTED DYN_BINDNAME_TABLE::TraverseDefnList - Traverse vars.
+*Purpose:
+* Builds hashtable by traversing over members.
+* Called to traverse both data members and functions.
+*
+*Implementation Notes:
+* Incrementally adds each member to list ensuring that for
+* each member:
+* - can't have vars and funcs of same name.
+* - can't have funcs of same arity.
+*
+*Entry:
+* hdefn Listhead of defnlist.
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_BINDNAME_TABLE::TraverseDefnList(HDEFN hdefn)
+{
+ DEFN *qdefn, *qdefnMatch;
+ HLNAM hlnam;
+ HVAR_DEFN hvdefn;
+ VAR_DEFN *qvdefn, *qvdefnInner;
+ FUNC_DEFN *qfdefnMatch;
+ HDEFN hdefnNext;
+ INVOKEKIND invokekind, invokekindMatch;
+ UINT cRecTypeDefn = 0;
+ UINT indexMatch;
+
+ // iterate over entire list of defns
+ while (hdefn != HDEFN_Nil) {
+ qdefn = QdefnOfHdefn(hdefn);
+
+ // cache next
+ hdefnNext = qdefn->HdefnNext();
+
+ // If this is a function which has been removed with
+ // conditional compilation, don't add it to the
+ // binding tables.
+ //
+
+ // Get the hlnam to search for
+ hlnam = qdefn->Hlnam();
+
+ // Phase 1 of verification.
+ // Search table for entries of the same name.
+ // Ensure that if there is a match check that
+ // there isn't an ambiguity error.
+ // The only things that can be overloaded are properties.
+ // So...
+ //
+ indexMatch = IndexFirstOfHlnam(hlnam);
+ while (indexMatch != BIND_INVALID_INDEX) {
+ qdefnMatch = QdefnOfHdefn(HdefnOfIndex(indexMatch));
+
+ if (qdefnMatch->IsRecTypeDefn()) {
+ if (qdefn->IsRecTypeDefn()) {
+ // error: can't overload types.
+ goto Error;
+ }
+ }
+ else if (qdefnMatch->IsVarDefn()) {
+ if (!qdefn->IsRecTypeDefn()) {
+ // error: can't overload variables at all
+ // except with records.
+ //
+ goto Error;
+ }
+ }
+ else if (qdefnMatch->IsFuncDefn()) {
+ if (!qdefn->IsRecTypeDefn()) {
+ if (!qdefn->IsFuncDefn()) {
+ // error: can't overload functions except with
+ // suitable properties.
+ //
+ goto Error;
+ }
+ // So we've found a function, which means we
+ // can downcast the qdefn we're examining...
+ // Can overload functions iff safe propertyhood is observed.
+ //
+ qfdefnMatch = (FUNC_DEFN *)qdefnMatch;
+ invokekindMatch = qfdefnMatch->InvokeKind();
+ invokekind = ((FUNC_DEFN *)qdefn)->InvokeKind();
+ if ((invokekind == invokekindMatch) ||
+ (invokekind == INVOKE_FUNC) ||
+ (invokekindMatch == INVOKE_FUNC)) {
+ // error: can't have a func and func/prop of same name
+ // nor two props of same kind.
+ //
+ goto Error;
+ }
+ } // if !isrectypedefn
+ }
+ else {
+ DebHalt("bad match.");
+ } // if
+
+ // Get next
+ indexMatch = IndexNextOfHlnam(hlnam, indexMatch);
+ } // while same name
+
+ // Phase 2 of verification.
+ if (qdefn->IsRecTypeDefn()) {
+ // Check nested types for validity.
+ DebAssert(m_ptdata->Pdtroot()->IsBasic(),
+ "Embedded types in Basic modules only");
+
+ // ensure that members of this nested type
+ // all have unique names
+ // CONSIDER: this is an n-squared search, should improve speed
+ //
+ hvdefn = ((RECTYPE_DEFN *) qdefn)->HvdefnFirstMember();
+ while (hvdefn != HVARDEFN_Nil) {
+ qvdefn = m_ptdata->QvdefnOfHvdefn(hvdefn);
+ hlnam = qvdefn->Hlnam();
+ qvdefnInner = qvdefn;
+ while (qvdefnInner->HdefnNext() != HDEFN_Nil) {
+ qvdefnInner =
+ m_ptdata->QvdefnOfHvdefn((HVAR_DEFN)qvdefnInner->HdefnNext());
+ if (qvdefnInner->Hlnam() == hlnam) {
+ return TIPERR_AmbiguousName;
+ } /* if */
+ } /* while */
+ hvdefn = (HVAR_DEFN) qvdefn->HdefnNext();
+ } /* while */
+
+ cRecTypeDefn++;
+ }
+ else {
+ DebAssert(qdefn->IsVarDefn() || qdefn->IsFuncDefn(),
+ "Unexpected Defnkind");
+ } /* if rectypedefen */
+
+ // Add the defn we found to the table.
+ AddHdefn(hdefn);
+
+ // get next from cached handle.
+ hdefn = hdefnNext;
+ } // end of while
+ return TIPERR_None;
+
+Error:
+ return TIPERR_AmbiguousName;
+}
+
+
+/***
+*DYN_BINDNAME_TABLE::SetTableSize
+*Purpose:
+* Set and allocate the bindname table
+*
+*Implementation Notes:
+* Free any existing table, alloc a new table and set
+* all of its entries to HCHUNK_Nil.
+* Note we set the table size to double (DYN_BIND_SIZE_FACTOR cEntries
+* since we
+* want to improve linear probing performance and also
+* to ensure that the table can never be completely full.
+*
+*Entry:
+* cEntries - The number of entries into this table.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_BINDNAME_TABLE::SetTableSize(UINT cEntries)
+{
+ UINT iBucket;
+ sHDEFN *rgTable;
+ HCHUNK hchunk = HCHUNK_Nil;
+
+ TIPERROR err = TIPERR_None;
+
+ // Free the current table, if any
+ if (IsValid()) {
+ m_pblkmgr->FreeChunk(m_hchunkBucketTbl, m_cBuckets * sizeof(sHDEFN));
+ m_hchunkBucketTbl = HCHUNK_Nil;
+ }
+
+ // Set the new table size
+ // CONSIDER: 27-Aug-93 andrewso
+ // Set the # of buckets to the nearest power of two. Would
+ // require saving cEntries for AddHbindescIncTable and
+ // RemoveHlnam, but should considerable speed up the mods.
+ //
+ // The +1 ensures that we always round up.
+ //
+ // NOTE: we really want to multiply by 1.5 (DYN_BIND_SIZE_FACTOR), but
+ // that drags in the floating point package, which we don't want. So do
+ // the equivelent integer multiply instead.
+ //
+ // #define DYN_BIND_SIZE_FACTOR 1.5
+ m_cBuckets = (cEntries * 3) / 2 + 1;
+
+ // Allocate a new table.
+ IfErrRet(m_pblkmgr->AllocChunk(&hchunk,
+ m_cBuckets * sizeof(sHDEFN)));
+ m_hchunkBucketTbl = hchunk;
+
+ // Initialize all entries with HDEFN_Nil
+ rgTable = Rqhdefn();
+
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ rgTable[iBucket] = (sHDEFN)HDEFN_Nil;
+ }
+
+ return TIPERR_None;
+}
+
+#if ID_DEBUG
+
+// Helper function to determine if given hdefn is in
+// TYPE_DATA list.
+//
+BOOL DebIsHdefnInList(TYPE_DATA *ptdata, HDEFN hdefn, HDEFN hdefnFirst)
+{
+ HDEFN hdefnCur = hdefnFirst;
+
+ while (hdefnCur != HDEFN_Nil) {
+ if (hdefnCur == hdefn) {
+ // found it...
+ return TRUE;
+ }
+ hdefnCur = ptdata->QdefnOfHdefn(hdefnCur)->HdefnNext();
+ }
+ // didn't find it...
+ return FALSE;
+}
+
+
+
+VOID DYN_BINDNAME_TABLE::DebCheckState(UINT uLevel) const
+{
+ sHDEFN *rqhdefn;
+ DEFN *qdefn;
+ UINT iBucket, cDataMember = 0, cNestedType = 0, cMeth = 0;
+
+ // check blkmgr
+ m_pblkmgr->DebCheckState(uLevel);
+
+
+
+ // Walk table and ensure that each entry is in appropriate
+ // TYPE_DATA list.
+ //
+ if (m_cBuckets != 0 && m_cBuckets != BIND_INVALID_INDEX) {
+ rqhdefn = Rqhdefn();
+
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ if (rqhdefn[iBucket] != (sHDEFN)HDEFN_Nil) {
+ qdefn = m_ptdata->QdefnOfHdefn(rqhdefn[iBucket]);
+ switch (qdefn->Defnkind()) {
+ case DK_VarDefn:
+ case DK_MbrVarDefn:
+ // Note: base members should not be in binding table.
+ DebAssert(!m_ptdata->QvdefnOfHvdefn(rqhdefn[iBucket])->IsBase(),
+ "whoops! base members shouldn't be in list.");
+ cDataMember++;
+ DebAssert(DebIsHdefnInList(
+ m_ptdata,
+ rqhdefn[iBucket],
+ m_ptdata->HdefnFirstDataMbrNestedType()),
+ "should be in list.");
+ break;
+ case DK_RecTypeDefn:
+ cNestedType++;
+ DebAssert(DebIsHdefnInList(
+ m_ptdata,
+ rqhdefn[iBucket],
+ m_ptdata->HdefnFirstDataMbrNestedType()),
+ "should be in list.");
+ break;
+ case DK_FuncDefn:
+ case DK_VirtualFuncDefn:
+ cMeth++;
+ DebAssert(DebIsHdefnInList(
+ m_ptdata,
+ rqhdefn[iBucket],
+ m_ptdata->HfdefnFirstMeth()),
+ "should be in list.");
+ break;
+ default:
+ DebHalt("DebCheckState: bad defnkind.");
+ } // switch
+ } // if
+ } // for
+ DebAssert(cMeth == m_ptdata->CAvailMeth()
+ || cMeth == m_ptdata->CMeth(), "bad func count.");
+ DebAssert(cNestedType == m_ptdata->CNestedType(), "bad nested count.");
+ DebAssert(cDataMember == m_ptdata->CDataMember(), "bad var count.");
+ }
+}
+
+
+VOID DYN_BINDNAME_TABLE::DebShowState(UINT uLevel) const
+{
+ UINT iBucket;
+ sHDEFN *rqhdefn;
+ HLNAM hlnam;
+ XCHAR xsz[256];
+
+ DebPrintf("*** DYN_BINDNAME_TABLE ***\n");
+ DebPrintf("buckets: %u\n", m_cBuckets);
+
+ if (uLevel > 0 && m_cBuckets != 0) {
+ rqhdefn = Rqhdefn();
+
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ if (rqhdefn[iBucket] != (sHDEFN)HDEFN_Nil) {
+ hlnam = QdefnOfHdefn(rqhdefn[iBucket])->Hlnam();
+ if (m_pnammgr->StrOfHlnam(hlnam, xsz, 256) == TIPERR_None) {
+ DebPrintf(" hlnam: %s (%X)\n", xsz, hlnam);
+ }
+ else {
+ DebPrintf(" hlnam: <too long> (%X)\n", hlnam);
+ }
+ }
+ else {
+ DebPrintf(" hlnam: 0xFFFF\n");
+ }
+ }
+ }
+}
+
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/typelib/dbindtbl.hxx b/private/oleauto/src/typelib/dbindtbl.hxx
new file mode 100644
index 000000000..160cc5625
--- /dev/null
+++ b/private/oleauto/src/typelib/dbindtbl.hxx
@@ -0,0 +1,249 @@
+/***
+*dbindtbl.hxx - DYN_BINDNAME_TABLE header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Manages module-level hashtable of names for binding.
+* Reuses BINDNAME_TABLE fucntionalkty for hashtable
+* management and provides definition of BuildTable().
+*
+*Revision History:
+*
+* 17-Jun-92 ilanc: created.
+* 02-Jul-92 w-peterh: rectypebind support
+* 30-Jul-92 w-peterh: removed function overloading
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef DYN_BINDNAME_TABLE_HXX_INCLUDED
+#define DYN_BINDNAME_TABLE_HXX_INCLUDED
+
+#include "stream.hxx"
+#include "defn.hxx" // for DEFN binding structs.
+#include "tdata.hxx"
+
+
+class DYN_TYPEBIND;
+class DYN_TYPEROOT;
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDBINDTBL_HXX)
+#define SZ_FILE_NAME g_szDBINDTBL_HXX
+#endif
+
+
+#define BIND_INVALID_INDEX ((USHORT)~0)
+#define DYN_BIND_SIZE_FACTOR 1.5
+
+/***
+*class DYN_BINDNAME_TABLE - 'dbindtbl': BindNameTable implementation.
+*Purpose:
+* BindNameTable impl.
+*
+***********************************************************************/
+
+class DYN_BINDNAME_TABLE
+{
+public:
+ DYN_BINDNAME_TABLE();
+ virtual ~DYN_BINDNAME_TABLE();
+
+ nonvirt TIPERROR Init(BLK_MGR *pblkmgr, DYN_TYPEROOT *pdtroot);
+
+ nonvirt TIPERROR BuildTable();
+ nonvirt BOOL IsValid() const;
+ nonvirt VOID ReleaseTable();
+
+ nonvirt void AddHdefn(HDEFN hdefn);
+ nonvirt UINT IndexFirstOfHlnam(HLNAM hlnam) const;
+ nonvirt UINT IndexNextOfHlnam(HLNAM hlnam, UINT iPrevBucket) const;
+
+ nonvirt HDEFN HdefnOfIndex(UINT index) const;
+ nonvirt DEFN *QdefnOfHdefn(HDEFN hdefn, UINT oChunk = 0) const;
+
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+#if HP_BIGENDIAN
+ VOID SwapBindDescs() const;
+#endif
+
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebShowState(UINT uLevel) const;
+#else //!ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+#endif //!ID_DEBUG
+
+protected:
+
+ UINT GetBucketOfHlnam(HLNAM hlnam) const;
+ UINT FindIndexOfHlnam(HLNAM hlnam, UINT iStartBucket) const;
+
+ TIPERROR TraverseDefnList(HDEFN hdefnCur);
+ TIPERROR SetTableSize(UINT cEntries);
+
+ DYN_TYPEBIND *Pdtbind() const;
+ sHDEFN *Rqhdefn() const;
+
+ // protected data members
+ BLK_MGR *m_pblkmgr; // block manager that holds the table
+ HCHUNK m_hchunkBucketTbl; // hchunk of the bucket table:
+
+
+ UINT m_cBuckets; // The number of "entries" that are
+ // currently in this table.
+
+ TYPE_DATA *m_ptdata; // cached TYPE_DATA
+ NAMMGR *m_pnammgr; // cached NAMMGR
+
+#ifdef DYN_BINDNAME_TABLE_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::IsValid() - Is table valid?
+*Purpose:
+* Reports if table valid.
+*
+*Entry:
+* None.
+*
+*Exit:
+* BOOL
+***********************************************************************/
+
+inline BOOL DYN_BINDNAME_TABLE::IsValid() const
+{
+ return (BOOL)(m_hchunkBucketTbl != HCHUNK_Nil);
+}
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::IndexFirstOfHlnam
+*Purpose:
+* Get the first HDEFN of this HLNAM
+*
+*Implementation Notes:
+*
+*Entry:
+* hlnam - the name to look for
+*
+*Exit:
+* Returns the index to the HDEFN
+*
+***********************************************************************/
+
+inline UINT DYN_BINDNAME_TABLE::IndexFirstOfHlnam(HLNAM hlnam) const
+{
+ return FindIndexOfHlnam(hlnam, GetBucketOfHlnam(hlnam));
+}
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::IndexNextOfHlnam
+*Purpose:
+* Get the next HDEFN of this HLNAM
+*
+*Implementation Notes:
+*
+*Entry:
+* hlnam - the name to look for
+* iPrevBucket - the bucket we want to start searching from
+*
+*Exit:
+* Returns the index to the HDEFN
+*
+***********************************************************************/
+inline UINT DYN_BINDNAME_TABLE::IndexNextOfHlnam(HLNAM hlnam,
+ UINT iPrevBucket) const
+{
+ UINT iStartBucket;
+
+ if (iPrevBucket == BIND_INVALID_INDEX) {
+ return BIND_INVALID_INDEX;
+ }
+
+ iStartBucket = (iPrevBucket + 1) % m_cBuckets;
+ return FindIndexOfHlnam(hlnam, iStartBucket);
+}
+
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::HdefnOfIndex
+*Purpose:
+* Return the Hdefn of a given index
+*
+*Implementation Notes:
+*
+*Entry:
+* index - the index to get the hdefn of.
+*
+*Exit:
+* Returns a pointer to the DEFN.
+*
+***********************************************************************/
+
+inline HDEFN DYN_BINDNAME_TABLE::HdefnOfIndex(UINT index) const
+{
+ if ((USHORT)index == BIND_INVALID_INDEX) {
+ return HDEFN_Nil;
+ }
+
+ DebAssert(index < m_cBuckets, "Invalid index");
+
+ return Rqhdefn()[index];
+}
+
+/***
+*PUBLIC DYN_BINDNAME_TABLE::QdefnOfHdefn - Address of a DEFN
+*Purpose:
+* Converts a handle to a DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hdefn - Handle to a DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the DEFN.
+*
+***********************************************************************/
+
+inline DEFN* DYN_BINDNAME_TABLE::QdefnOfHdefn(HDEFN hdefn, UINT oChunk) const
+{
+ return (DEFN *)m_pblkmgr->QtrOfHandle(hdefn, oChunk);
+}
+
+
+/***
+*PROTECTED DYN_BINDNAME_TABLE::Rqhdefn()
+*Purpose:
+* Returns a pointer to the hdefn table.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns a pointer to the hdefn table. The pointer is only valid
+* for a short time.
+*
+***********************************************************************/
+
+inline sHDEFN *DYN_BINDNAME_TABLE::Rqhdefn() const
+{
+ DebAssert(IsValid(), "Bad table.");
+
+ return (sHDEFN *)m_pblkmgr->QtrOfHandle(m_hchunkBucketTbl);
+}
+
+
+#endif // ! DYN_BINDNAME_TABLE_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dblkmgr.hxx b/private/oleauto/src/typelib/dblkmgr.hxx
new file mode 100644
index 000000000..46bddac67
--- /dev/null
+++ b/private/oleauto/src/typelib/dblkmgr.hxx
@@ -0,0 +1,690 @@
+/***
+*dblkmgr.hxx - Dynamic Block Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The dynamic block manager provides memory management services for a
+* a contiguous block of memory allocated from the compile-time
+* heap. It manages moveable and reallocatable sub-blocks ("chunks")
+* and supports compaction.
+*
+*Revision History:
+*
+* 24-Mar-92 ilanc: Created.
+* 07-Apr-92 ilanc: Cleaned up order of inline funcs for cfront.
+* 17-Dec-92 w-peterh: reordered data members
+*
+*****************************************************************************/
+
+#ifndef DBLKMGR_HXX_INCLUDED
+#define DBLKMGR_HXX_INCLUDED
+
+#include <limits.h>
+#include "sheapmgr.hxx"
+#include "blkmgr.hxx"
+
+class STREAM; // #include "stream.hxx"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDBLKMGR_HXX)
+#define SZ_FILE_NAME g_szDBLKMGR_HXX
+#endif
+
+
+// This constant is used for the initial size of a handle table.
+//
+extern const UINT DBM_cbSizeHandleTableInitial;
+
+// HANDLETABLE_ENTRY - te
+// these describe the entries in the handle table.
+// Guess what? they are just HCHUNKs.
+// For internal use only.
+//
+typedef HCHUNK TE;
+typedef sHCHUNK sTE;
+
+// Handle to a HANDLE_TABLE_ENTRY - hte
+// For external use.
+//
+typedef UINT HTE;
+typedef USHORT sHTE;
+
+#if OE_RISC & !HP_I386
+#define DBLKMGR_HEADER_SIZE 8
+// MIPS and ALPHA must be 8 byte aligned
+#else
+#define DBLKMGR_HEADER_SIZE sizeof(USHORT)
+// Present value of DBLKMGE_HEADER_SIZE
+#endif
+
+/***
+*class DYN_BLK_MGR - 'dblkmgr': Dynamic Block manager
+*Purpose:
+* The class implements the dynamic block manager.
+*
+***********************************************************************/
+
+class DYN_BLK_MGR
+{
+ friend VOID ValidateChunks(DYN_BLK_MGR *pdblkmgr);
+
+public:
+ DYN_BLK_MGR();
+ ~DYN_BLK_MGR();
+
+ static TIPERROR CreateStandalone(DYN_BLK_MGR **ppdbm);
+ static void FreeStandalone(DYN_BLK_MGR *pdbm);
+
+ nonvirt TIPERROR Init(SHEAP_MGR *psheapmgr, BOOL fCoalesce = TRUE);
+
+ nonvirt TIPERROR AllocChunk(HTE *phte, UINT cbSizeChunk);
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt BYTE *QtrOfHandle(HTE hte) const;
+ nonvirt VOID FreeChunk(HTE hte);
+ nonvirt VOID Free();
+ nonvirt BOOL IsValid() const;
+
+ // Locking methods
+ nonvirt VOID Lock();
+ nonvirt VOID Unlock();
+ nonvirt BOOL IsLocked() const;
+
+ nonvirt VOID Lock(HTE hte);
+ nonvirt VOID Unlock(HTE hte);
+ nonvirt BOOL IsLocked(HTE hte) const;
+
+ // Is empty method
+ nonvirt BOOL IsEmpty() const;
+
+ // *** NEW ***
+ nonvirt UINT CbSize(HTE hte);
+ nonvirt TIPERROR Compact();
+ nonvirt TIPERROR ReallocChunk(HTE hte, UINT cbSizeChunkNew);
+ nonvirt UINT CteTable() const;
+ nonvirt UINT GetSize() const;
+
+ // Debug/test methods
+#if ID_DEBUG
+ nonvirt VOID DebShowState(UINT uLevel) const;
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebCheckHandle(HTE hte) const;
+#else
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebCheckHandle(HTE hte) const {}
+#endif
+
+#if ID_TEST
+ nonvirt BOOL IsValidHte(HTE hte) const;
+#endif
+
+
+private:
+ BLK_MGR m_blkmgr;
+ BLK_DESC m_bdHandleTable;
+
+ // handle table related stuff
+ nonvirt TIPERROR GetNewHandleFromTable(HTE *phte);
+ nonvirt VOID InitHandleTable(HTE hteFreeTableEntry);
+ nonvirt VOID InvalidateHandle(sTE *pte);
+ nonvirt VOID UpdateHandleTable(HTE hte, HCHUNK hchunkMemBlock);
+ nonvirt VOID RemoveHandleFromTable(HTE hte);
+ nonvirt HCHUNK HchunkOfHandleTableEntry(HTE hte) const;
+ nonvirt BOOL IsValidHandleTableEntry(TE te) const;
+ nonvirt UINT IndexOfHte(HTE hte) const;
+ nonvirt HTE HteOfIndex(UINT iHte) const;
+ nonvirt UINT CbSizeChunk(TE teTable) const;
+ nonvirt UINT CbSizeOldChunk(TE teTable) const;
+ nonvirt sTE *RgteHandleTable() const;
+
+#ifdef DBLKMGR_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+// inline methods
+//
+
+
+
+/***
+*PUBLIC DYN_BLK_MGR::~DYN_BLK_MGR - destructor
+*Purpose:
+* Destroys a dynamic block manager.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline DYN_BLK_MGR::~DYN_BLK_MGR()
+{
+ // Do nothing, block will vanish when the heap is destructed.
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::IsValidHandleTableEntry - is table entry valid?
+*Purpose:
+* Is table entry valid?
+*
+*Implementation Notes:
+*
+*Entry:
+* te - Handle table entry
+*
+*Exit:
+*
+***********************************************************************/
+
+inline BOOL DYN_BLK_MGR::IsValidHandleTableEntry(TE teTable) const
+{
+ return (teTable & 1) == 0;
+}
+
+
+/***
+*PRIVATE DYN_BLK_MGR::InvalidateHandle - Invalidates a handle.
+*Purpose:
+* Invalidates a handle.
+*
+*Implementation Notes"
+* Invalidates by simply setting low bit.
+*
+*Entry:
+* pte ptr to table entry to invalidate (IN/OUT)
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID DYN_BLK_MGR::InvalidateHandle(sTE *pte)
+{
+ DebAssert(pte != NULL, "bad param.");
+
+ *pte |= 1;
+
+ DebAssert(IsValidHandleTableEntry(*pte) == FALSE,
+ "handle table entry should be invalid.");
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::IsValid - Tests if dynamic block manager in valid state.
+*Purpose:
+* Tests if dynamic block manager is valid -- i.e. has been allocated
+* a block. Defers to blkdesc member.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns TRUE if valid, else FALSE.
+*
+***********************************************************************/
+
+inline BOOL DYN_BLK_MGR::IsValid() const
+{
+ return m_bdHandleTable.IsValid() && m_blkmgr.IsValid();
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::RgteHandleTable - gets handle table as array.
+*Purpose:
+* Gets handle table as array.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns ptr to start of handle table.
+*
+***********************************************************************/
+
+inline sTE *DYN_BLK_MGR::RgteHandleTable() const
+{
+ return (sTE *)m_bdHandleTable.QtrOfBlock();
+}
+
+
+/***
+*PRIVATE DYN_BLK_MGR::IndexOfHte - maps handle to index.
+*Purpose:
+* Maps handle of table entry to index into "array".
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline UINT DYN_BLK_MGR::IndexOfHte(HTE hteTable) const
+{
+ return hteTable / sizeof(sHCHUNK);
+}
+
+
+/***
+*PRIVATE DYN_BLK_MGR::HchunkOfHandleTableEntry - get hchunk from handle.
+*Purpose:
+* get hchunk from external handle.
+*
+*Implementation Notes:
+* Assumes param is offset into handle table.
+*
+*Entry:
+* hte - handle (offset) into handle table.
+*
+*Exit:
+* Returns hchunk of internal mem block.
+* m_blkmgr.QtrOfHandle() of this will point to size field of chunk.
+*
+*Errors:
+*
+***********************************************************************/
+
+inline HCHUNK DYN_BLK_MGR::HchunkOfHandleTableEntry(HTE hte) const
+{
+ return (HCHUNK)RgteHandleTable()[IndexOfHte(hte)];
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::QtrOfHandle - Converts handle to pointer.
+*Purpose:
+* Converts a chunk handle into a pointer. A Nil handle is
+* *NOT* converted to a NULL pointer (asserts).
+*
+*Implementation notes:
+* In a segmented architecture:
+* We assume that the handle table's memblock and the blkmgr's
+* memblock are contiguous and thus we assert this accordingly
+* at initialization time.
+*
+* Thus we can simply get the handle table's ptr and then add
+* in the table's size + the contents of the table entry
+* to produce the ptr.
+*
+* In non-segmented archs:
+* We fetch the HCHUNK from the handle table and then
+* defer to the BLK_MGR for the ptr.
+*
+* Note in either case we add an extra DBLKMGR_HEADER_SIZE
+* to skip over the chunk size.
+*
+*Entry:
+* hte - Handle to a chunk.
+*
+*Exit:
+* Returns a pointer to that chunk.
+*
+***********************************************************************/
+
+inline BYTE *DYN_BLK_MGR::QtrOfHandle(HTE hte) const
+{
+ DebAssert(hte != HCHUNK_Nil, "DYN_BLK_MGR::QtrOfHandle: Nil handle.");
+
+ DebAssert(IsValid(), "DYN_BLK_MGR::QtrOfHandle: invalid block.");
+
+ DebAssert((UINT)hte < m_bdHandleTable.CbSize(),
+ "DYN_BLK_MGR::QtrOfHandle: handle out of bounds.");
+
+ DebAssert(IsValidHandleTableEntry((TE)HchunkOfHandleTableEntry(hte)),
+ "table entry should be valid.");
+
+ // If we're in debug mode we always do the
+ // double indirection becuase of the extra shift bytes.
+ // CONSIDER: we're exercising different code in debug vs.
+ // release versions -- maybe we should consolidate the two.
+ //
+#if ID_DEBUG || !(OE_SEGMENTED || OE_MACNATIVE)
+ // do the vanilla double dereference thing...
+ HCHUNK hchunkMemBlock = HchunkOfHandleTableEntry(hte);
+ return m_blkmgr.QtrOfHandle(hchunkMemBlock) + DBLKMGR_HEADER_SIZE;
+#else
+ sTE *pteHandleTable;
+
+ // get handle table array.
+ pteHandleTable = RgteHandleTable();
+
+ return (BYTE *)pteHandleTable +
+ m_bdHandleTable.CbSize() +
+ *((sHTE *)(((BYTE *)pteHandleTable) + hte)) +
+ DBLKMGR_HEADER_SIZE;
+#endif
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::CteTable - handle table cardinality.
+*Purpose:
+* Handle table cardinality.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline UINT DYN_BLK_MGR::CteTable() const
+{
+ // since sizeof(sHCHUNK) is a power of two, optimizer
+ // will just shift right here (hopefully).
+ //
+ return m_bdHandleTable.CbSize() / sizeof(sHCHUNK);
+}
+
+
+/***
+*PRIVATE DYN_BLK_MGR::CbSizeChunk - chunk size given table entry.
+*Purpose:
+* Returns chunk size given handle.
+*
+*Implementation Notes:
+* Since the chunk size is stored in the first two bytes of
+* of the chunk we simply deref the table entry
+* (i.e. interpret as an HCHUNK), and read the USHORT there.
+* NOTE: can't use during compaction -- use CbSizeOldChunk.
+*
+*Entry:
+* teTable - entry in handle table (IN).
+*
+*Exit:
+* UINT (chunk size)
+***********************************************************************/
+
+inline UINT DYN_BLK_MGR::CbSizeChunk(TE teTable) const
+{
+ DebAssert((m_blkmgr.m_pbBlkCopy == NULL) &&
+ (m_blkmgr.m_pbBitmap == NULL),
+ "DYN_BLK_MGR::CbSizeChunk: compacting - use CbSizeOldChunk.");
+
+ DebAssert(IsValidHandleTableEntry(teTable), "bad handle.");
+
+ return *((USHORT *)m_blkmgr.QtrOfHandle((HCHUNK)teTable));
+}
+
+
+/***
+*PRIVATE DYN_BLK_MGR::CbSizeOldChunk - chunk size given table entry.
+*Purpose:
+* Returns chunk size given handle.
+*
+*Implementation Notes:
+* Since the chunk size is stored in the first two bytes of
+* of the chunk we simply deref the table entry
+* (i.e. interpret as an HCHUNK), and read the USHORT there.
+* NOTE: only can be used during compaction -- else use CbSizeChunk.
+*
+*Entry:
+* teTable - entry in handle table (IN).
+*
+*Exit:
+* UINT (chunk size)
+***********************************************************************/
+
+inline UINT DYN_BLK_MGR::CbSizeOldChunk(TE teTable) const
+{
+ DebAssert((m_blkmgr.m_pbBlkCopy != NULL) &&
+ (m_blkmgr.m_pbBitmap != NULL),
+ "DYN_BLK_MGR::CbSizeOldChunk: not compacting - use CbSizeChunk.");
+
+ DebAssert(IsValidHandleTableEntry(teTable), "bad handle.");
+
+ return *((USHORT *)m_blkmgr.QtrOfOldHandle((HCHUNK)teTable));
+}
+
+
+/***
+*PRIVATE DYN_BLK_MGR::HteOfIndex - maps index to handle.
+*Purpose:
+* Maps index to handle of table entry.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline UINT DYN_BLK_MGR::HteOfIndex(UINT iHte) const
+{
+ return iHte * sizeof(sHCHUNK);
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::CbSize - size of chunk given table entry handle.
+*Purpose:
+* Size of chunk.
+*
+*Implementation Notes:
+* Defers to blkmgr.
+* NOTE: doesn't include size prefix.
+*
+*Entry:
+* hteTable - handle of chunk.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline UINT DYN_BLK_MGR::CbSize(HTE hteTable)
+{
+ return CbSizeChunk((TE)HchunkOfHandleTableEntry(hteTable));
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::Lock
+*Purpose:
+* Lock the block.
+*
+*Implementation Notes:
+* Defers to blkmgr.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID DYN_BLK_MGR::Lock()
+{
+ DebAssert(IsValid(), "DYN_BLK_MGR::Lock: Block invalid.");
+
+ m_blkmgr.Lock();
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::Unlock
+*Purpose:
+* Unlock the block.
+*
+*Implementation Notes:
+* Defers to blkmgr.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID DYN_BLK_MGR::Unlock()
+{
+ DebAssert(IsValid(), "DYN_BLK_MGR::Unlock: Block invalid.");
+
+ m_blkmgr.Unlock();
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::IsLocked
+*Purpose:
+* Tests if block is locked.
+*
+*Implementation Notes:
+* Defers to blkmgr.
+*
+*Entry:
+*
+*Exit:
+* TRUE if block is locked -- i.e. at least one lock.
+***********************************************************************/
+
+inline BOOL DYN_BLK_MGR::IsLocked() const
+{
+ DebAssert(IsValid(), "DYN_BLK_MGR::IsLocked: Block invalid.");
+
+ return m_blkmgr.IsLocked();
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::Lock
+*Purpose:
+* Lock a chunk.
+*
+*Implementation Notes:
+* Defers to Lock/0. Locking a chunk locks its block.
+*
+*Entry:
+* hte Handle of chunk to lock.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID DYN_BLK_MGR::Lock(HTE hte)
+{
+ DebAssert(IsValid(), "DYN_BLK_MGR::Lock: Block invalid.");
+ DebCheckHandle(hte);
+
+ Lock();
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::Unlock
+*Purpose:
+* Unlock the block.
+*
+*Implementation Notes:
+* Defers to Unlock()/0. Unlocking a chunk, unlocks its block.
+*
+*Entry:
+* hte Handle of chunk to lock.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID DYN_BLK_MGR::Unlock(HTE hte)
+{
+ DebAssert(IsValid(), "DYN_BLK_MGR::Unlock: Block invalid.");
+ DebCheckHandle(hte);
+
+ Unlock();
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::IsLocked
+*Purpose:
+* Tests if chunk is locked.
+*
+*Implementation Notes:
+* Defers to IsLocked()/0
+*
+*Entry:
+* hte Handle of chunk to lock.
+*
+*Exit:
+* TRUE if chunk is locked -- i.e. at least one lock.
+***********************************************************************/
+
+inline BOOL DYN_BLK_MGR::IsLocked(HTE hte) const
+{
+ DebAssert(IsValid(), "DYN_BLK_MGR::IsLocked: Block invalid.");
+ DebCheckHandle(hte);
+
+ return IsLocked();
+}
+
+
+/***
+*PUBLIC DYN_BLK_MGR::IsEmpty
+*Purpose:
+* Tests if blk is empty.
+*
+*Implementation Notes:
+* Defers to contained blkmgr.
+*
+*Entry:
+*
+*Exit:
+* TRUE if block is empty -- i.e. no allocated chunks.
+***********************************************************************/
+
+inline BOOL DYN_BLK_MGR::IsEmpty() const
+{
+ // CONSIDER: at least assert that if empty then the handle table
+ // is empty, i.e. no allocated handles, or v.v.
+ //
+ return m_blkmgr.IsEmpty();
+}
+
+#if ID_TEST
+
+/***
+*PUBLIC DYN_BLK_MGR::IsValidHte - Is table entry valid given handle?
+*Purpose:
+* Is there a valid hte at the entry referenced by an hte?
+*
+*Implementation Notes:
+* ID_TEST only.
+*
+*Entry:
+* hte - handle to table entry
+*
+*Exit:
+*
+***********************************************************************/
+
+inline BOOL DYN_BLK_MGR::IsValidHte(HTE hte) const
+{
+ return IsValidHandleTableEntry(RgteHandleTable()[IndexOfHte(hte)]);
+}
+
+#endif
+
+
+#if ID_DEBUG
+
+// Checks if chunk handle is valid: even and within bounds.
+//
+inline VOID DYN_BLK_MGR::DebCheckHandle(HTE hte) const
+{
+ DebAssert(((hte & 1) == 0) &&
+ hte < m_bdHandleTable.CbSize(),
+ "bad handle.");
+}
+
+#endif // ID_DEBUG
+
+#endif // ! DBLKMGR_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/debug.h b/private/oleauto/src/typelib/debug.h
new file mode 100644
index 000000000..71fedaf9d
--- /dev/null
+++ b/private/oleauto/src/typelib/debug.h
@@ -0,0 +1,234 @@
+/***
+*debug.h - Silver debugging macros
+*
+* Copyright (C) 1990-1992, Microsoft Corporation
+*
+*Purpose:
+* This file defines debugging macros used by Silver source files.
+* Documentation for these macros and other useful coding techniques to
+* reduce buggage are in \silver\doc\codestd\debug.doc.
+*
+*Note:
+* All function prototypes in this file are defined in debug.cxx.
+*
+*Revision History:
+*
+* 13-May-92 w-peterh: File created.
+*
+*******************************************************************************/
+
+#ifndef DEBUG_H_INCLUDED
+#define DEBUG_H_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if ID_DEBUG
+
+// the file names passed to DebAssertFailed are all listed in dassert.c
+// so we don't get multiple copies of each string. Define macros so header
+// files can be included by either .C or .CPP files
+
+#ifdef __cplusplus
+#define ASSERTNAME(filename) extern "C" char FAR filename[];
+#else //__cplusplus
+#define ASSERTNAME(filename) extern char FAR filename[];
+#endif
+#endif //ID_DEBUG
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDEBUG_H)
+#define SZ_FILE_NAME g_szDEBUG_H
+#endif
+
+// "debug" routines that can be used by test drivers.
+// Their implementations are in "debug.cxx". Test drivers
+// must link with "debug.obj" explicitly since the release version
+// of "misc.lib" doesn't build with "debug.obj".
+//
+// NOTE: DO NOT DEFINE NON-EMPTY INLINE FUNCTIONS HERE
+// (if you do, they'll end up being included in actual release
+// code).
+//
+#include <stdio.h>
+
+#if OE_WIN32
+BOOL DebParseAndInit(int *pargc, unsigned short ***pargv);
+#else
+BOOL DebParseAndInit(int *pargc, char ***pargv);
+#endif
+int DebPrintf(const char *szFmt, ...);
+int DebConsoleOutput(const char *szFmt, ...);
+//void PrintfIfNotNull(FILE *pfile, const char *szFmt, ...);
+char* DebGets(char *buffer);
+//char* DebFgets(char *buffer, FILE *pfile);
+
+BOOL FIsBadReadPtr(const void FAR* pv, UINT cb);
+BOOL FIsBadWritePtr(void FAR* pv, UINT cb);
+BOOL FIsBadCodePtr(void FAR* pv);
+BOOL FIsBadInterface(void FAR* pv, UINT cMethods);
+
+#if ID_DEBUG
+
+// make sure that this is surrounded by a #if ID_DEBUG.
+// g_fHeapChk is defined in debug.cxx
+extern BOOL g_fHeapChk;
+
+#if OE_WIN16
+#define DebHeapChk() \
+ { \
+ if ((g_fHeapChk) && (_fheapchk() != _HEAPOK)) \
+ DebExamineHeap(); \
+ };
+#elif OE_WIN32
+#define DebHeapChk()
+#else
+#define DebHeapChk() \
+ { \
+ if ((g_fHeapChk) && (_heapchk() != _HEAPOK)) \
+ DebExamineHeap(); \
+ };
+#endif
+
+
+VOID DebExamineHeap();
+
+int DebAssertFailed(SZ_CONST szFileName,
+ USHORT wLine);
+int DebAssertNumFailed(SZ_CONST szFileName,
+ USHORT wLine,
+ int nErr);
+void DebHalted(SZ_CONST szFileName, USHORT wLine);
+
+
+// Note that we must use #define, not inline, to use the __LINE__
+// macro properly.
+
+#define DebHalt(szComment) \
+ DebHalted((SZ_CONST) SZ_FILE_NAME, __LINE__)
+
+// UNDONE OA95: we overflow DGROUP if we include the expression. For
+// UNDONE OA95: now we don't include the expression in the assert;
+// UNDONE OA95: we should fix the DGROUP problem instead.
+
+#if OE_WIN
+#define DebAssert(fExpr, szComment) \
+ if (!(fExpr)) \
+ DebAssertFailed((SZ_CONST) SZ_FILE_NAME, __LINE__); \
+ else 0 /* useless statement */
+#else // !OE_WIN
+#define DebAssert(fExpr, szComment) \
+ if (!(fExpr)) \
+ DebAssertFailed((SZ_CONST) SZ_FILE_NAME, __LINE__); \
+ else 0 /* useless statement */
+
+#define DebAssertNum(fExpr, szComment, nErr) \
+ if (!(fExpr)) \
+ DebAssertNumFailed((SZ_CONST) SZ_FILE_NAME, __LINE__, nErr); \
+ else 0 /* useless statement */
+#endif
+
+#define DebPrintfIf(fPrint, Args) \
+ if (fPrint) \
+ DebPrintf Args; \
+ else 0 /* useless statement */
+
+
+void DebStartError_(void);
+void DebStartErrorCode_(TIPERROR err);
+void DebStopError_(void);
+BOOL DebErrorNow_(TIPERROR err);
+
+#define DebStartError() DebStartError_()
+#define DebStartErrorCode(err) DebStartErrorCode_(err)
+#define DebStopError() DebStopError_()
+#define DebErrorNow(err) DebErrorNow_(err)
+
+VOID DebAddInstTable_(VOID *pInstance);
+VOID DebRemInstTable_(VOID *pInstance);
+VOID DebInInstTable_(VOID *pInstance);
+VOID DebInstTableEmpty_();
+
+#define DebAddInstTable(p) DebAddInstTable_(p)
+#define DebRemInstTable(p) DebRemInstTable_(p)
+#define DebInInstTable(p) DebInInstTable_(p)
+#define DebInstTableEmpty() DebInstTableEmpty_()
+
+// Use this for statements that should only be executed in
+// debug versions. e.g. DEBONLY( phvdefn = 0; )
+#define DEBONLY(x) x
+
+#else // !ID_DEBUG
+
+// Eliminate all debugging code.
+// NOTE: DO NOT DEFINE NON-EMPTY INLINE FUNCTIONS HERE
+// (if you do, they'll end up being included in actual release
+// code).
+//
+
+#define DebHeapChk()
+#define DebHalt(szComment)
+#define DebAssert(expr, szComment)
+#define DebAssertNum(fExpr, szComment, nErr)
+#define DebPrintfIf(fPrint, Args)
+
+#define DebStartError()
+#define DebStartErrorCode(err)
+#define DebStopError()
+#define DebErrorNow(err) 0
+
+#define DebAddInstTable(p)
+#define DebRemInstTable(p)
+#define DebInInstTable(p)
+#define DebInstTableEmpty()
+#define DebExamineHeap()
+
+#define DEBONLY(x)
+
+#endif // !ID_DEBUG
+
+// NoAssertRetail is used in places where you need the expression to
+// be evaluated on both Retail and Debug build. On Debug build
+// we also check to make sure that the expression evaluates to true.
+#if ID_DEBUG
+#define NoAssertRetail(fExpr, szComment) DebAssert(fExpr, szComment)
+#else
+#define NoAssertRetail(fExpr, szComment) (fExpr)
+#endif
+
+#if ID_DEBUG
+// DebAssertInterfaceAvail is to assert that a certain interface is available
+// for a certain object. The following QueryProtocol assert:
+//
+// is eqivalent to the following QueryInterface assert:
+// DebAssertInterfaceAvail((TYPEINFO *)pbtinfo, BASIC_TYPEINFO,
+// IID_BASIC_TYPEINFO, "SaveAsText");
+#define DebAssertInterfaceAvail(pobj, dclass, id, szComment) \
+ { dclass *pobjtmp; \
+ if (pobj->QueryInterface(id, (LPVOID *) &pobjtmp) == NOERROR) \
+ pobjtmp->Release(); \
+ else \
+ DebAssertFailed((SZ_CONST) SZ_FILE_NAME, __LINE__); \
+ }
+
+#define DebAssertInterfaceEq(pobj, dclass, id, szComment) \
+ { dclass *pobjtmp; \
+ if (pobj->QueryInterface(id, (LPVOID *) &pobjtmp) == NOERROR && \
+ pobj == pobjtmp) \
+ pobjtmp->Release(); \
+ else \
+ DebAssertFailed((SZ_CONST) SZ_FILE_NAME, __LINE__); \
+ }
+#else //ID_DEBUG
+#define DebAssertInterfaceAvail(pobj, dclass, id, szComment)
+#define DebAssertInterfaceEq(pobj, dclass, id, szComment)
+#endif //ID_DEBUG
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif // !DEBUG_H_INCLUDED
diff --git a/private/oleauto/src/typelib/debug.hxx b/private/oleauto/src/typelib/debug.hxx
new file mode 100644
index 000000000..1c9421424
--- /dev/null
+++ b/private/oleauto/src/typelib/debug.hxx
@@ -0,0 +1,175 @@
+/***
+*debug.hxx - Silver debugging macros
+*
+* Copyright (C) 1990-1992, Microsoft Corporation
+*
+*Purpose:
+* This file defines debugging macros used by Silver source files.
+* Documentation for these macros and other useful coding techniques to
+* reduce buggage are in \silver\doc\codestd\debug.doc.
+*
+*Revision History:
+*
+* 15-AUG-90 petergo: File created.
+* 31-Mar-91 ilanc: Added DebGets()
+* 22-Apr-91 petergo: Change ternary ops to ifs.
+* 30-May-91 alanc: Add address table support and eliminate
+* exception generation support
+* 22-Jan-92 jamieb: Added DebConsoleOutput()
+* 13-May-92 w-peterh: Moved all non-c++ stuff to debug.h
+* 03-Aug-92 rajivk: changed error generation macros and functions
+*
+*******************************************************************************/
+
+#ifndef DEBUG_HXX_INCLUDED
+#define DEBUG_HXX_INCLUDED
+
+#include "debug.h"
+#include "validate.h"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDEBUG_HXX)
+#define SZ_FILE_NAME g_szDEBUG_HXX
+#endif
+
+// "debug" routines that can be used by test drivers.
+// Their implementations are in "debug.cxx". Test drivers
+// must link with "debug.obj" explicitly since the release version
+// of "misc.lib" doesn't build with "debug.obj".
+//
+// NOTE: DO NOT DEFINE NON-EMPTY INLINE FUNCTIONS HERE
+// (if you do, they'll end up being included in actual release
+// code).
+//
+
+#ifdef __cplusplus
+#if ID_DEBUG
+
+
+//
+// Error generation support
+
+#pragma code_seg(CS_INIT)
+class ERROR_GENERATOR
+{
+public:
+ virtual void Init();
+ virtual BOOL fNow(TIPERROR err);
+ virtual BOOL fContinue(TIPERROR err);
+
+ LPVOID operator new(size_t cbSize)
+ { return MemAlloc(cbSize); }
+ void operator delete(LPVOID pv)
+ { MemFree(pv); }
+
+ UINT m_cErrorGen; // keeps count of error that has been forced
+ UINT m_cNextError;
+ UINT m_cNextErrorReset;
+ BOOL m_fErrorGen; // is set if the current error is a forced error
+ BOOL m_fHandled; // is set if the current error's been handled.
+ BOOL m_fOldHandled;
+
+ TIPERROR m_errOnly;
+#ifdef ERROR_GENERATOR_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+#pragma code_seg()
+
+// resets the flag m_fHandled
+#define HandleErr() \
+ { \
+ if (g_perrorgen) { \
+ g_perrorgen->m_fOldHandled = g_perrorgen->m_fHandled; \
+ g_perrorgen->m_fHandled = TRUE; \
+ } \
+ }
+
+// re-set the flag m_fHandled
+#define UnHandleErr() \
+ { \
+ if (g_perrorgen) { \
+ g_perrorgen->m_fHandled = g_perrorgen->m_fOldHandled; \
+ } \
+ }
+
+// starts error generation: If any error is not passed back (i.e.
+// is ignored) it will assert, and print out the number of times
+// error was forced before being ignored.
+// WARNING: It assumes that error is not generated while handling an
+// error.
+// To Debug:Look at the comments for DEBUGGING HINT at
+// ERROR_GENERATOR:fNow
+//
+#define DoWithErr( func ) \
+ { \
+ DebStartError_(); \
+ while(err = func) { \
+ DebAssert(g_perrorgen != NULL, ""); \
+ if (!g_perrorgen->fContinue(err)) { \
+ break; \
+ } \
+ } \
+ DebStopError_(); \
+ }
+
+// Use the following if you want to verify the error handling
+// while handling another error.
+//
+#define RecDoWithErr( func ) \
+ { \
+ ERROR_GENERATOR *perrorgenSave = NULL; \
+ \
+ if (g_perrorgen != NULL) { \
+ perrorgenSave = g_perrorgen; \
+ g_perrorgen = NULL; \
+ \
+ DoWithErr( func ); \
+ \
+ g_perrorgen = perrorgenSave; \
+ } \
+ }
+
+extern ERROR_GENERATOR FAR *g_perrorgen;
+extern UINT g_fDisableErrorGen;
+
+#define DebSuspendError()
+#define DebResumeError()
+
+// DON'T USE THESE ANYMORE!
+// Use DebSuspendError and DebResumeError instead.
+//
+// DebDisableError: causes DebErrorNow to not fire until reenabled
+// DebEnableError: undoes invocation of DebDisableError
+//#define DebDisableError() g_fDisableErrorGen = TRUE
+//#define DebEnableError() g_fDisableErrorGen = FALSE
+
+// Use this for statements that should only be executed in
+// debug versions. e.g. DEBONLY( phvdefn = 0; )
+#define DEBONLY(x) x
+
+
+
+#else // !ID_DEBUG
+
+// Eliminate all debugging code.
+// NOTE: DO NOT DEFINE NON-EMPTY INLINE FUNCTIONS HERE
+// (if you do, they'll end up being included in actual release
+// code).
+//
+
+#define DEBONLY(x)
+
+#define DebErrorNow(err) 0
+#define DebSuspendError()
+#define DebResumeError()
+//#define DebDisableError()
+//#define DebEnableError()
+#define DoWithErr( func ) func
+#define HandleErr()
+#define UnHandleErr()
+#endif // !ID_DEBUG
+#endif // __cplusplus
+
+#endif // !DEBUG_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/debug2.cxx b/private/oleauto/src/typelib/debug2.cxx
new file mode 100644
index 000000000..7f80a5a27
--- /dev/null
+++ b/private/oleauto/src/typelib/debug2.cxx
@@ -0,0 +1,164 @@
+/***
+*debug2.cxx
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Replacement debug.cxx - *NOT* dependent on Ebapp... etc.
+*
+*Revision History:
+*
+* [00] 13-Nov-92 bradlo: Created.
+*
+*Implementation Notes:
+* <additional documentation, as needed>
+*
+*****************************************************************************/
+
+#include "typelib.hxx"
+#include "silver.hxx"
+
+#include "mem.hxx"
+#include "sheapmgr.hxx"
+#include "blkmgr.hxx"
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleDebugCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleDebugCxx
+#else
+static char szDebugCxx[] = __FILE__;
+#define SZ_FILE_NAME szDebugCxx
+#endif
+#endif //ID_DEBUG
+
+
+extern "C" void
+FnAssertCover(LPSTR lpstrExpr, LPSTR lpstrMsg, LPSTR lpstrFileName, UINT iLine);
+
+BOOL g_fHeapChk = FALSE;
+
+
+BOOL g_fSheapShakingOn = FALSE;
+
+static char chOutputBuf[256];
+
+extern "C" int
+DebPrintf(const char *szFormat, ...)
+{
+ va_list args;
+
+ va_start(args, szFormat);
+
+ vsprintf(chOutputBuf, szFormat, args);
+
+ // REVIEW: should make sure we didnt overflow our buffer.
+
+#if !OE_MAC
+ OutputDebugString(chOutputBuf);
+#endif //!OE_MAC
+
+ return 0;
+}
+
+#if FV_UNICODE_OLE
+#define szTYPELIBASSERT "OLEAUT32.DLL assertion"
+#define szTYPELIBHALT "Halt in OLEAUT32.DLL"
+#else //FV_UNICODE_OLE
+#if OE_MAC
+#define szTYPELIBASSERT "Typelib assertion"
+#define szTYPELIBHALT "Halt in TYPELIB"
+#else //OE_MAC
+#define szTYPELIBASSERT "TYPELIB.DLL assertion"
+#define szTYPELIBHALT "Halt in TYPELIB.DLL"
+#endif //OE_MAC
+#endif //FV_UNICODE_OLE
+extern "C" int
+DebAssertFailed(const char *szFilename, WORD wLine)
+{
+ // use the Ole2 internal assertion mechanism
+ FnAssertCover("", szTYPELIBASSERT, (LPSTR)szFilename, wLine);
+ return 0;
+}
+
+extern "C" void
+DebHalted(const char *szFilename, WORD wLine)
+{
+ FnAssertCover("", szTYPELIBHALT, (LPSTR)szFilename, wLine);
+}
+
+#pragma code_seg(CS_RARE)
+extern "C" void
+DebExamineHeap()
+{ }
+
+extern "C" void
+DebAddInstTable_(void *pv)
+{ }
+
+extern "C" void
+DebRemInstTable_(void *pv)
+{ }
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+BOOL
+DebErrorNow_(TIPERROR err)
+{
+ return FALSE;
+}
+#pragma code_seg()
+
+extern "C" void
+FnAssertCover(LPSTR lpstrExpr, LPSTR lpstrMsg, LPSTR lpstrFileName, UINT iLine)
+{
+
+ char szMsg[256];
+
+#if OE_WIN16 || OE_WIN32
+
+ // Can't use the the Ole2 internal assertion mechanism anymore, because
+ // if we're using the retail OLE, it doesn't assert. So put up a message
+ // box asking abort/retry/ignore.
+
+ sprintf(szMsg, "%s\nFile %s, line %d", lpstrMsg, lpstrFileName, iLine);
+#define szAssertTitle "Abort = UAE, Retry = INT 3, Ignore = Continue"
+ switch (MessageBox(NULL, szMsg, szAssertTitle, MB_ICONHAND | MB_ABORTRETRYIGNORE)) {
+ case IDABORT:
+ FatalAppExit(0, lpstrMsg);
+ break;
+ case IDRETRY:
+#if OE_RISC
+ DebugBreak();
+#else
+ _asm {
+ int 3
+ }
+#endif
+ break;
+ default:
+ break; // just continue
+ }
+
+#else // OE_MAC
+ // Can't use the the Ole2 internal assertion mechanism anymore, because
+ // if we're using the retail OLE, it doesn't assert. So we do it ourselves
+ //FnAssert(lpstrExpr, lpstrMsg, lpstrFileName, iLine);
+
+ *szMsg = sprintf(szMsg+1, "Typelib assertion: File %s, line %d", lpstrFileName, iLine);
+ DebugStr((const unsigned char FAR*)szMsg);
+
+#endif // OE_MAC
+}
+
+#endif /* } */
diff --git a/private/oleauto/src/typelib/defn.hxx b/private/oleauto/src/typelib/defn.hxx
new file mode 100644
index 000000000..0b9f8fc3c
--- /dev/null
+++ b/private/oleauto/src/typelib/defn.hxx
@@ -0,0 +1,1640 @@
+/***
+*defn.hxx - DEFN header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+* 14-May-92 w-peterh: Created from tdata.hxx.
+* 12-Jun-92 w-peterh: Added RECTYPE_DEFN
+* 23-Jun-92 w-peterh: Added HDEFN_Nil
+* 02-Jul-92 w-peterh: added DEFNKIND member to defns
+* 06-Jul-92 davebra: added PtdefnBase() to TYPE_DEFN
+* 30-Jul-92 w-peterh: added access member to rectypedefn
+* 12-Nov-92 w-peterh: added HFUNCDEFN_Nil
+* 18-Jan-93 w-peterh: added constants MAX_CARGS, MAX_CARGSOPT, OPTARGS_LIST
+* 15-Jan-93 RajivK: added Code resource support for MAC
+* 12-Feb-93 w-peterh: vardefn::isDispatch, funcdefn::isRestricted
+* 12-Apr-93 w-jeffc: made DEFN data members private;
+* added layout strings for byte swapping
+*
+*Implementation Notes:
+* A DEFN is the struct used for the internal storage of an INFO
+*
+* DEFN
+* |
+* ---------------------------------------------
+* | | |
+* RECTYPE_DEFN VAR_DEFN MEMBER_DEFN |
+* | | | |
+* ----------| | -------------
+* | ----------- |
+* | | FUNC_DEFN
+* PARAM_DEFN MBR_VAR_DEFN |
+* VIRTUAL_FUNC_DEFN
+*
+* A DEFN really only has a single link field (to simplify
+* list manipulation) and an hlnam field.
+*
+* All of the DEFN structs (except MEMBER_DEFN) inherit from the
+* DEFN struct. In addition, those structs that represent object
+* members (i.e. MBR_VAR_DEFN, FUNC_DEFN, and VIRTUAL_FUNC_DEFN)
+* also inherit from MEMBER_DEFN. VAR_DEFN and PARAM_DEFN only
+* inherit from DEFN.
+*
+* This design allows us to share the commonalities between locals,
+* params and data members (member variables) and in addition, treat
+* params like locals (where appropriate).
+*
+*****************************************************************************/
+
+#ifndef DEFN_HXX_INCLUDED
+#define DEFN_HXX_INCLUDED
+
+#include "typelib.hxx"
+
+class DYN_TYPEBIND; // dtbind.hxx
+class TYPE_DATA; // tdata.hxx
+class PCODE_TYPEROOT; // ptinfo.hxx
+
+
+#include "cltypes.hxx"
+
+
+#include "tdesck.hxx" // for TYPEDESCKIND
+#include "rtarray.h" // for HARRAY_DESC
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDEFN_HXX)
+#define SZ_FILE_NAME g_szDEFN_HXX
+#endif
+
+
+// Layout string for VARIANT struct. We can't layout the data
+// member of the variant, however, because it can contain so many
+// different types of data. It is swapped manually in TYPE_DATA.
+//
+#define VARIANT_LAYOUT "ssss"
+
+// Do this here, even though this only needs be done to
+// ones that are serialized.
+//
+#pragma pack(2)
+
+#define CC_HRESULT CC_RESERVED
+
+// HDEFN - hdefn
+// HFUNC_DEFN - hfdefn
+// HVIRTUAL_FUNC_DEFN - hvfdefn
+// HMEMBER_DEFN - hmdefn
+// HVAR_DEFN - hvdefn
+// HPARAM_DEFN - hparamdefn
+// HMBR_VAR_DEFN - hmvdefn
+
+
+typedef HCHUNK HDEFN;
+typedef sHCHUNK sHDEFN;
+const HDEFN HDEFN_Nil = (HDEFN) HCHUNK_Nil;
+
+typedef HCHUNK HFUNC_DEFN;
+typedef sHCHUNK sHFUNC_DEFN;
+const HFUNC_DEFN HFUNCDEFN_Nil = (HFUNC_DEFN) HCHUNK_Nil;
+
+typedef HCHUNK HVIRTUAL_FUNC_DEFN;
+typedef sHCHUNK sHVIRTUAL_FUNC_DEFN;
+const HVIRTUAL_FUNC_DEFN HVIRTUALFUNCDEFN_Nil =
+ (HVIRTUAL_FUNC_DEFN) HCHUNK_Nil;
+
+typedef HCHUNK HMEMBER_DEFN;
+typedef sHCHUNK sHMEMBER_DEFN;
+const HMEMBER_DEFN HMEMBERDEFN_Nil = (HMEMBER_DEFN) HCHUNK_Nil;
+
+typedef HCHUNK HVAR_DEFN;
+typedef sHCHUNK sHVAR_DEFN;
+const HVAR_DEFN HVARDEFN_Nil = (HVAR_DEFN) HCHUNK_Nil;
+
+typedef HCHUNK HPARAM_DEFN;
+typedef sHCHUNK sHPARAM_DEFN;
+const HPARAM_DEFN HPARAMDEFN_Nil = (HPARAM_DEFN) HCHUNK_Nil;
+
+typedef HCHUNK HMBR_VAR_DEFN;
+typedef sHCHUNK sHMBR_VAR_DEFN;
+const HMBR_VAR_DEFN HMBRVARDEFN_Nil = (HMBR_VAR_DEFN) HCHUNK_Nil;
+
+typedef HCHUNK HBIND_DESC;
+typedef sHCHUNK sHBIND_DESC;
+const HBIND_DESC HBINDESC_Nil = (HBIND_DESC) HCHUNK_Nil;
+
+// HST - hst
+typedef HCHUNK HST;
+typedef sHCHUNK sHST;
+const HST HST_Nil = (HST) HCHUNK_Nil;
+
+// HRECTYPE_DEFN - hrtdefn
+typedef HCHUNK HRECTYPE_DEFN;
+typedef sHCHUNK sHRECTYPE_DEFN;
+const HRECTYPE_DEFN HRECTYPEDEFN_Nil = (HRECTYPE_DEFN) HCHUNK_Nil;
+
+// HTYPE_DEFN - htdefn
+typedef HCHUNK HTYPE_DEFN;
+typedef sHCHUNK sHTYPE_DEFN;
+const HTYPE_DEFN HTYPEDEFN_Nil = (HTYPE_DEFN) HCHUNK_Nil;
+
+// HFUNC_TYPE_DEFN - hftdefn
+typedef HCHUNK HFUNC_TYPE_DEFN;
+typedef sHCHUNK sHFUNC_TYPE_DEFN;
+const HFUNC_TYPE_DEFN HFUNCTYPEDEFN_Nil = (HFUNC_TYPE_DEFN) HCHUNK_Nil;
+
+
+
+// HDLLENTRY_DEFN - hdllentrydefn
+typedef HCHUNK HDLLENTRY_DEFN;
+typedef sHCHUNK sHDLLENTRY_DEFN;
+const HDLLENTRY_DEFN HDLLENTRYDEFN_Nil = (HDLLENTRY_DEFN) HCHUNK_Nil;
+
+
+
+typedef INT (FAR PASCAL * LPDLLENTRYPOINT)(); // should be FARPROC
+
+/***
+*class DLLENTRY_DEFN - 'dllentry_defn': Describes DLL entry point.
+*
+* CONSIDER: make DLLENTRY_DEFN derive from DEFN
+*Purpose:
+* Structure identifying a DLL entry point.
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+***********************************************************************/
+
+class DLLENTRY_DEFN
+{
+public:
+
+ // PCODE_TYPEROOT::ForEachHlnam needs the
+ // address of m_hlnamDllName and m_hlnamDllEntry
+ // (just using a friend function created include file dependency problems)
+ //
+ friend class PCODE_TYPEROOT;
+
+ // ctor
+ DLLENTRY_DEFN() {
+ m_hasOrdinal = FALSE;
+ // set the bit to indicate that this declared is switched in.
+ // Lowest bit is set if the declare is switched out.
+ m_hlnamDllName = HLNAM_Nil & 0xfffe;
+ m_hchunkDllEntry = HCHUNK_Nil;
+ m_hdllentrydefnNext = (sHDLLENTRY_DEFN) HDLLENTRYDEFN_Nil;
+ m_lpDllEntryPoint = NULL;
+ m_hLibrary = 0;
+ }
+
+ // accessors
+ // getters:
+ //
+ BOOL HasOrdinal() const { return m_hasOrdinal; }
+ HLNAM HlnamDllName() const { return (HLNAM)(m_hlnamDllName & 0xfffe); }
+ HCHUNK HchunkDllEntry() const { return (HCHUNK)m_hchunkDllEntry; }
+ USHORT UDllOrdinal() const { return m_uDllOrdinal; }
+ HDLLENTRY_DEFN HdllentrydefnNext() const { return (HDLLENTRY_DEFN)m_hdllentrydefnNext; }
+ LPDLLENTRYPOINT LpDllEntryPoint() const { return m_lpDllEntryPoint; }
+#if OE_MAC
+ Handle HLibrary() const { return (Handle)m_hLibrary; }
+#else
+ HINSTANCE HLibrary() const { return (HINSTANCE)m_hLibrary; }
+#endif
+
+ // setters:
+ VOID SetHasOrdinal(BOOL fParm) { m_hasOrdinal = fParm; }
+ VOID SetHlnamDllName(HLNAM hlnam) { m_hlnamDllName = (sHLNAM)
+ ((m_hlnamDllName & 0x0001) | hlnam); }
+ VOID SetHchunkDllEntry(HCHUNK hchunk) { m_hchunkDllEntry = (sHCHUNK)hchunk; }
+ VOID SetUDllOrdinal(USHORT uParm) { m_uDllOrdinal = uParm; }
+ VOID SetHdllentrydefnNext(HDLLENTRY_DEFN hdllentrydefnParm)
+ { m_hdllentrydefnNext = (sHDLLENTRY_DEFN)hdllentrydefnParm; }
+ VOID SetLpDllEntryPoint(LPDLLENTRYPOINT lpdllentrypointParm)
+ { m_lpDllEntryPoint = lpdllentrypointParm; }
+#if OE_MAC
+ VOID SetHLibrary(Handle hParm) { m_hLibrary = (ULONG)hParm; }
+#else // MAC
+#if OE_WIN16
+ VOID SetHLibrary(HINSTANCE hParm) { m_hLibrary = (ULONG)((WORD)hParm); }
+#else
+ VOID SetHLibrary(HINSTANCE hParm) { m_hLibrary = (ULONG)hParm; }
+#endif
+#endif
+
+private:
+ sBOOL m_hasOrdinal;
+ // NOTE: the lowes bit of the hlnam is used to indicate if the declare
+ // has been switched out.
+ sHLNAM m_hlnamDllName;
+ union {
+ sHCHUNK m_hchunkDllEntry;
+ USHORT m_uDllOrdinal;
+ };
+ sHDLLENTRY_DEFN m_hdllentrydefnNext;
+
+ LPDLLENTRYPOINT m_lpDllEntryPoint;
+ ULONG m_hLibrary; // really a Handle/HINSTANCE
+ // but must make sure that it's
+ // the same size in all platforms
+ // (it's serialized)
+};
+// layout string for byte swapping (don't need to swap m_hLibrary)
+#define DLLENTRY_DEFN_LAYOUT "ssss"
+
+/***
+*class TYPE_DEFN - 'tdefn': Internal rep of a TYPEDESC object.
+*Purpose:
+* This struct represents the internal form of a TYPEDESC.
+* NOTE: VARIABLE LEN STRUCT.
+*
+*Implementation Notes:
+*
+* (1) A TYPE_DEFN can be packed into a single
+* (short) word.
+*
+* (2) The fields immediately following instances of a
+* TYPE_DEFN depend on the TYPEDESCKIND. For the scalar types
+* (UI1, I1, UI2, I2, UI4, I4, UI8, I8, R4, R8, R10, VOID,
+* STRING, CURRENCY, VALUE)
+* there are no following fields.
+*
+* (3) If the TYPEDESCKIND is PTR or REF then the
+* structure is followed by another TYPE_DEFN which
+* describes the type which is referenced.
+*
+* (4) If the TYPEDESCKIND is USER_DEFINED then the struct
+* is followed by an HIMPTYPE containing an himptype (the
+* internal representation of a TYPEID).
+*
+* (5) If the TYPEDESCKIND is BASIC_ARRAY then the struct
+* is followed by an sHARRAY_DESC containing the array descriptor
+* and another TYPE_DEFN for the array elements
+*
+* (6) If the TYPEDESCKIND is Fixed string, then the length
+* is in the following SHORT.
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+***********************************************************************/
+
+class TYPE_DEFN
+{
+public:
+
+ // ctor
+ TYPE_DEFN() {
+ m_tdesckind = (USHORT) TDESCKIND_Value;
+ m_isConst = (USHORT) FALSE;
+ m_isResizable = (USHORT) FALSE;
+ m_isInRecord = (USHORT) FALSE;
+ // only used for params
+ m_isRetval = (USHORT) FALSE;
+ m_isLCID = (USHORT) FALSE;
+ m_ptrkind = (USHORT) PTRKIND_Ignore;
+ m_paramkind = PARAMKIND_In;
+ }
+
+ UINT DefnSize(); // Implemented in tdata1.cxx
+
+ // accessors
+ // Getters:
+ //
+ sHIMPTYPE *Qhimptype() const;
+ HIMPTYPE Himptype() const;
+ HIMPTYPE HimptypeActual() const;
+ TYPE_DEFN *QtdefnFoundation() const;
+ HTYPE_DEFN HtdefnFoundation(HTYPE_DEFN htdefn) const;
+ TYPE_DEFN *QtdefnBase();
+ HARRAY_DESC Harraydesc() const;
+ BOOL IsString() const;
+ BOOL IsBVariant() const;
+ BOOL IsObject() const;
+ BOOL IsUserDefined() const;
+ BOOL IsBasicPtr() const;
+ BOOL IsArray() const;
+ BOOL IsBasicArray() const;
+ BOOL IsConst() const { return (BOOL)m_isConst; }
+ BOOL IsRetval() const { return (BOOL)m_isRetval;}
+ BOOL IsResizable() const;
+ BOOL IsInRecord() const { return (BOOL)m_isInRecord;}
+ BOOL IsLCID() const { return (BOOL)m_isLCID;}
+ TYPEDESCKIND Tdesckind() const { return (TYPEDESCKIND)m_tdesckind; }
+ BOOL IsPointer() const;
+ BOOL IsLastTdefn() const;
+
+ PTRKIND Ptrkind() const { return (PTRKIND)m_ptrkind; }
+ PARAMKIND Paramkind() const { return (PARAMKIND)m_paramkind; }
+ BOOL IsModeIn() const { return Paramkind() == PARAMKIND_In; }
+ BOOL IsModeOut() const { return Paramkind() == PARAMKIND_Out; }
+ BOOL IsModeInOut() const { return Paramkind() == PARAMKIND_InOut; }
+ BOOL IsModeIgnore() const { return Paramkind() == PARAMKIND_Ignore; }
+
+ // Setters:
+ VOID SetHimptype(HIMPTYPE himptype) {
+ *Qhimptype() = (sHIMPTYPE)himptype;
+ }
+ VOID SetTdesckind(TYPEDESCKIND tdesckindParm) { m_tdesckind = (USHORT)tdesckindParm; }
+ VOID SetIsConst(BOOL fParm) { m_isConst = (USHORT)fParm; }
+ VOID SetIsRetval(BOOL fParm) { m_isRetval = (USHORT)fParm; }
+ VOID SetIsResizable(BOOL fParm) { m_isResizable = (USHORT)fParm; }
+ VOID SetIsInRecord(BOOL fParm) { m_isInRecord = (USHORT)fParm; }
+ VOID SetIsLCID(BOOL fParm) { m_isLCID = (USHORT)fParm; }
+ VOID SetPtrkind(PTRKIND ptrkindParm) { m_ptrkind = (USHORT)ptrkindParm; }
+ VOID SetParamkind(PARAMKIND paramkind) { m_paramkind = (USHORT)paramkind; }
+
+private:
+ // data members
+
+ USHORT m_tdesckind:6; // was TYPEDESCKIND
+ USHORT m_isConst:1; // was BOOL
+ USHORT m_isRetval:1; // used for params. Set on function return
+ // value if any params have this bit set.
+ USHORT m_isResizable:1; // was BOOL, used for arrays
+ USHORT m_ptrkind:3; // was PTRKIND
+ USHORT m_isInRecord:1; // TRUE ==> var is part of "Type" decl
+ USHORT m_isLCID:1; // used for params. Set on function return
+ // value if any params have this bit set.
+ USHORT m_paramkind:2; // For OLE params only:
+ // specifies whether param is one of:
+ // {IN, OUT, INOUT}.
+};
+
+// layout string for byte swapping
+#define TYPE_DEFN_LAYOUT "s"
+
+
+/***
+*PUBLIC TYPE_DEFN::Qhimptype - Gets pointer HIMPTYPE field.
+*Purpose:
+* Gets pointer to HIMPTYPE field.
+*
+*Implementation Notes:
+* HIMPTYPE field is assumed to immediately follow THIS.
+*
+*Entry:
+*
+*Exit:
+* Returns pointer to HIMPTYPE field. NULL if not USER_DEFINED.
+*
+***********************************************************************/
+
+inline sHIMPTYPE *TYPE_DEFN::Qhimptype() const
+{
+ if (m_tdesckind == TDESCKIND_UserDefined)
+ return (sHIMPTYPE *)(this+1);
+ else
+ return NULL;
+}
+
+inline HIMPTYPE TYPE_DEFN::Himptype() const
+{
+ return (HIMPTYPE)(*(Qhimptype())) & 0xFFFE;
+}
+
+inline HIMPTYPE TYPE_DEFN::HimptypeActual() const
+{
+ return (HIMPTYPE)(*(Qhimptype()));
+}
+
+// inline definition must be before usage for cfront
+
+inline BOOL TYPE_DEFN::IsBasicArray() const
+{
+ return (BOOL) (m_tdesckind == TDESCKIND_BasicArray);
+}
+
+inline BOOL TYPE_DEFN::IsArray() const
+{
+ return IsBasicArray() || (BOOL)(m_tdesckind == TDESCKIND_Carray);
+}
+
+
+
+/***
+*PUBLIC TYPE_DEFN::Harraydesc()
+*
+*Purpose:
+* returns the handle for the array descriptor
+*
+*Implementation Notes:
+* assumes it immediatly follows the typedefn
+*
+*Entry:
+*
+*Exit:
+*
+*
+***********************************************************************/
+
+inline HARRAY_DESC TYPE_DEFN::Harraydesc() const
+{
+ DebAssert(IsArray(), "Harraydesc : not array type" );
+ return (HARRAY_DESC) *((sHARRAY_DESC*)((BYTE*)this+sizeof(TYPE_DEFN)));
+}
+
+
+/***
+*PUBLIC TYPE_DEFN::Is[whatever]
+*Purpose:
+* returns TRUE if the type defn has the requested attribute
+*
+*Implementation Notes:
+*
+*
+*Entry:
+*
+*Exit:
+*
+*
+***********************************************************************/
+
+inline BOOL TYPE_DEFN::IsString() const
+{
+ return (BOOL) (Tdesckind() == TDESCKIND_String);
+}
+
+inline BOOL TYPE_DEFN::IsBVariant() const
+{
+ return (BOOL) (Tdesckind() == TDESCKIND_Value);
+}
+
+inline BOOL TYPE_DEFN::IsObject() const
+{
+ return (BOOL) (Tdesckind() == TDESCKIND_Object);
+}
+
+inline BOOL TYPE_DEFN::IsUserDefined() const
+{
+ return (BOOL) (Tdesckind() == TDESCKIND_UserDefined);
+}
+
+inline BOOL TYPE_DEFN::IsBasicPtr() const
+{
+ return (Ptrkind() == PTRKIND_Basic)
+ || (Tdesckind() == TDESCKIND_Object)
+ ;
+}
+
+inline BOOL TYPE_DEFN::IsResizable() const
+{
+ return m_isResizable;
+}
+
+inline BOOL TYPE_DEFN::IsPointer() const
+{
+ return (Tdesckind() == TDESCKIND_Ptr) || IsBasicPtr();
+}
+
+inline BOOL TYPE_DEFN::IsLastTdefn() const
+{
+ return Tdesckind() != TDESCKIND_Ptr && !IsArray();
+}
+
+/***
+*PUBLIC TYPE_DEFN::HtdefnFoundation()
+*Purpose:
+* gets handle to foundation typedefn given a handle.
+* skips over arraydesc if there is one.
+*
+*Implementation Notes:
+* assumes it directly follows this typedefn and possible hArrayDesc
+* NOTE: this only works if handles are offsets and not lookup
+* table keys.
+*
+*Entry:
+*
+*Exit:
+*
+*
+***********************************************************************/
+
+inline HTYPE_DEFN TYPE_DEFN::HtdefnFoundation(HTYPE_DEFN htdefn) const
+{
+ // Doesn't handle "Byref" case correctly. See QtdefnFoundation below.
+
+ DebAssert(!IsLastTdefn(), "must not be last one");
+ return (HTYPE_DEFN)((UINT) htdefn +
+ sizeof(TYPE_DEFN) +
+ (IsArray() ? sizeof(sHARRAY_DESC) : 0));
+}
+
+
+
+
+/***
+*PUBLIC TYPE_DEFN::QtdefnBase()
+*Purpose:
+* gets base TYPE_DEFN: this is the lowest level TYPE_DEFN and therefore
+* must be either an intrinsic type or a user-defined type.
+* If the TYPE_DEFN on which this is called is the lowest level, then
+* it is returned.
+*
+*Implementation Notes:
+* assumes it directly follows this TYPE_DEFN and possible hArrayDesc
+*
+*Entry:
+*
+*Exit:
+*
+*
+***********************************************************************/
+
+inline TYPE_DEFN *TYPE_DEFN::QtdefnBase()
+{
+ TYPE_DEFN *qtdefn = this;
+ while (!qtdefn->IsLastTdefn())
+ qtdefn = qtdefn->QtdefnFoundation();
+ return qtdefn;
+}
+
+
+/***
+*class DEFN - 'defn': Root of DEFN hierarchy.
+*Purpose:
+* Root of DEFN hierarchy.
+*
+*
+*Implementation Notes:
+* Has link field to facilitate list manipulation and name handle.
+* Layout:
+* 2 byte flag word // *** NOTE: MUST BE FIRST FIELD ***
+* Handle to next DEFN in list.
+* Local name handle.
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+************************************************************************/
+
+class DEFN
+{
+public:
+
+ // PCODE_TYPEROOT::ForEachHlnam needs the address of m_hlnam
+ // (just using a friend function created include file dependency problems)
+ //
+ friend class PCODE_TYPEROOT;
+
+ // ctor
+ DEFN() {
+ SetHdefnNext(HDEFN_Nil);
+ SetHlnam(HLNAM_Nil);
+
+ m_fV2Flags = 0;
+ }
+
+
+ // accessors
+ // Getters:
+ //
+ HDEFN HdefnNext() const { return m_hdefnNext; }
+ HLNAM Hlnam() const { return m_hlnam; }
+ DEFNKIND Defnkind() const { return (DEFNKIND)m_defnkind; }
+ BOOL IsMemberVarDefn() const { return Defnkind() == DK_MbrVarDefn; }
+ BOOL IsRecTypeDefn() const { return Defnkind() == DK_RecTypeDefn; }
+ BOOL IsVirtualFuncDefn() const { return Defnkind() == DK_VirtualFuncDefn; }
+ BOOL IsParamDefn() const { return Defnkind() == DK_ParamDefn; }
+ BOOL IsVarDefn() const {
+ return (Defnkind() == DK_VarDefn) || IsMemberVarDefn() || IsParamDefn();
+ }
+ BOOL IsFuncDefn() const {
+ return (Defnkind() == DK_FuncDefn) || IsVirtualFuncDefn();
+ }
+ BOOL IsMemberDefn() const {
+ return IsMemberVarDefn() || IsFuncDefn();
+ }
+ ACCESS Access();
+ BOOL HasV2Flags() const {
+ return (BOOL)m_fV2Flags;
+ }
+ VOID SetHasV2Flag(BOOL f) { m_fV2Flags = (USHORT)f; }
+
+ // Setters:
+ VOID SetHdefnNext(HDEFN hdefn) { m_hdefnNext = (sHDEFN)hdefn; }
+ VOID SetDefnkind(DEFNKIND defnkind) { m_defnkind = (sDEFNKIND)defnkind; }
+ VOID SetHlnam(HLNAM hlnam) { m_hlnam = (sHLNAM)hlnam; }
+
+protected:
+ // Following bitfields pack into 16-bit USHORT.
+ // Note: we make them protected so that derived classes
+ // can get at them.
+ // NOTE: MUST BE FIRST FIELD (swapcode assumes this)
+ //
+ USHORT m_defnkind:3; // defn kind
+ USHORT m_access:1; // Private or Public
+ USHORT m_UNUSED5:1; // this bit is 0 in the V1 typelib(s).
+ // and is un-referenced in V1 typelib.dll
+ USHORT m_fV2Flags:1; // if set then it means that there are
+ // 2 trailing bytes at the end of the defn
+
+ // DEFNKIND specific stuff FUNC_DEFN VAR_DEFN
+ USHORT m_kind:3; // either FUNC_KIND or VAR_KIND
+
+ USHORT m_isPureOrSimpleType:1; // IsPure IsSimpleType
+ USHORT m_isStatic:1; // IsStaticLocalVars IsStatic
+ // IsRestricted IsSimpleConst
+ USHORT m_isRestrictedOrSimpleConst:1;
+
+ // WARNING:
+ // The following are reserved by defn deriviations
+ // in whatever way it is appropriate. Do not use them for something
+ // else at this level.
+ //
+ USHORT m_UNUSED1:1;
+ USHORT m_UNUSED2:1;
+ USHORT m_UNUSED3:1;
+ USHORT m_UNUSED4:1;
+
+private:
+ // data members
+ sHDEFN m_hdefnNext;
+ sHLNAM m_hlnam; // Low bit is UNUSED6.
+};
+
+// layout string for byte swapping
+#define DEFN_LAYOUT "sss"
+
+
+
+/***
+*class MEMBER_DEFN - 'mdefn': Base class for MBR_VAR_DEFN and FUNC_DEFN
+*Purpose:
+* This struct represents the commonalities between
+* MBR_VAR_DEFN and FUNC_DEFN.
+*
+*Implementation Notes:
+* Intended to be base of MBR_VAR_DEFN and FUNC_DEFN.
+* MEMBER_DEFN is NOT a member of the DEFN hierarchy.
+*
+* Layout:
+* Handle to DLLENTRY_DEFN
+* Member handle.
+* Doc string handle.
+* Encoded Help context (16-bit).
+* 15th bit<--------->0th bit.
+* // bit 0 represents if the number(diff is stored here)
+* // 1 -> num is stored in the top 14 bits.
+* // 0 -> h is stored in the top 15 bits.
+* // all 15 bits 1 indicates HCHUNK_Nil
+* //
+* if the num is stored then bit 1 represents if the num is -ve or +ve
+* // 1 -> number is positive.
+* // 0 -> number is negative.
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+************************************************************************/
+
+class MEMBER_DEFN
+{
+public:
+ // ctor
+ MEMBER_DEFN() {
+ m_hmember = HMEMBER_Nil;
+ m_hstDocumentation = HST_Nil;
+ m_usHelpContext = 0xfffe; // this indicates that the hchunk stored is
+ // HCHUNK_Nil;
+ }
+
+ // accessors
+ // getters:
+ //
+ HMEMBER Hmember() const { return m_hmember; }
+ HST HstDocumentation() const { return m_hstDocumentation; }
+ WORD WHelpContext() const { return m_usHelpContext; }
+
+ // setters:
+ VOID SetHmember(HMEMBER hmemberParm) { m_hmember = (sHMEMBER)hmemberParm; }
+ VOID SetHstDocumentation(HST hstParm) { m_hstDocumentation = (sHST)hstParm; }
+
+ VOID SetWHelpContext(USHORT uParm) { m_usHelpContext = uParm; }
+
+private:
+
+ // data members
+ sHMEMBER m_hmember; // this is a DWORD
+
+ USHORT m_usHelpContext;
+
+ sHST m_hstDocumentation;
+};
+
+// layout string for byte swapping
+#define MEMBER_DEFN_LAYOUT "lss"
+
+
+/***
+*class VAR_DEFN - 'vdefn': Shared root for locals and params.
+*Purpose:
+* This struct represents the internal form of the shared
+* attributes of datamembers and locals and params for VBA.
+*
+*Implementation Notes:
+* VAR_DEFN does not inherit from MEMBER_DEFN because it is mainly
+* used for locals and parameters. It inherits from DEFN for the
+* link and the hlnam.
+*
+* NOTE!!!! VAR_DEFN is also used for BASIC datamembers so that
+* they can be lighter than regular datamembers. The reason that
+* this can happen is because the only extra information that a
+* BASIC datamember needs above what is in VAR_DEFN is an hmember.
+* We happen to ensure that the oVar field of a BASIC datamember
+* is also its hmember, so we don't actually need an explicit
+* hmember field.
+*
+* Layout:
+* Following reserved bits defined in DEFN are
+* used as following in VAR_DEFN
+*
+* USHORT m_UNUSED1:1; // m_hasConstVal
+* USHORT m_UNUSED2:1; // m_hasNew
+* USHORT m_UNUSED3:1; // m_isDispatch
+* USHORT m_UNUSED4:1; // m_isReadOnly
+*
+* Embedded fixed sized "simple" TYPEDEFN XOR
+* Handle to heap-allocated TYPEDEFN (if "complex").
+*
+* NOTE: this above member *wants* to be a union, but can't be
+* since TYPE_DEFN has a constructor.
+*
+* Offset of non-const var on stack frame if local or
+* of member in instance if non-const datamember XOR
+* Handle to heap-allocated const val if constant var
+* (datamember or local).
+*
+* NOTE: Constant datamembers do not have an oVar/hmember.
+*
+* NOTE: The isTypeSimple flag is used to 'tag' the TYPE_DEFN union.
+*
+* NOTE: can't make varlen since used as base class.
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+************************************************************************/
+
+class VAR_DEFN : public DEFN
+{
+public:
+ // ctor
+ VAR_DEFN() {
+ SetDefnkind(DK_VarDefn);
+ m_access = ACCESS_Private;
+ m_UNUSED5 = 0;
+ m_fV2Flags = 0;
+ m_kind = VKIND_DataMember;
+
+ m_isRestrictedOrSimpleConst = FALSE; // really isSimpleConst for VARs
+ m_isStatic = FALSE; // really isStatic for VARs
+ m_isPureOrSimpleType = TRUE; // really isSimpleType for VARs
+ m_UNUSED1 = FALSE; // m_hasConstVal
+ m_UNUSED2 = FALSE; // m_hasNew
+ m_UNUSED3 = FALSE; // m_isDispatch
+ m_UNUSED4 = FALSE; // m_isReadOnly
+
+ m_oVar = 0xffff; // m_hchunkConstVal = -1
+
+
+ DebAssert(sizeof(m_htdefn) == sizeof(TYPE_DEFN),
+ "bad sizes in wannabe union.");
+
+ m_htdefn = (sHTYPE_DEFN)HTYPEDEFN_Nil;
+ }
+
+ // accessors
+ // getters:
+ //
+ ACCESS Access() const { return (ACCESS)m_access; }
+ BOOL IsPublic() const { return Access() == ACCESS_Public; }
+ BOOL IsPrivate() const { return Access() == ACCESS_Private; }
+ VAR_KIND Vkind() const { return (VAR_KIND)m_kind; }
+ BOOL IsDataMember() const { return Vkind() == VKIND_DataMember; }
+ BOOL IsBase() const { return Vkind() == VKIND_Base; }
+ BOOL IsEnumerator() const { return Vkind() == VKIND_Enumerator; }
+ BOOL IsFormal() const { return Vkind() == VKIND_Formal; }
+ USHORT GetOVar() const { return m_oVar; };
+ SHORT GetSConstVal() const { return m_sConstVal; };
+ USHORT GetImplTypeFlags() const;
+ BOOL HasConstVal() const { return (BOOL)m_UNUSED1; }
+ BOOL IsSimpleConst() const { return (BOOL)m_isRestrictedOrSimpleConst; }
+ BOOL IsStatic() const { return (BOOL)m_isStatic; }
+ BOOL IsSimpleType() const { return (BOOL)m_isPureOrSimpleType; }
+
+ BOOL IsDispatch() const { return (BOOL)m_UNUSED3; }
+ BOOL IsReadOnly() const { return (BOOL)m_UNUSED4; }
+
+ BOOL HasNew() const { return (BOOL)m_UNUSED2; }
+
+ HCHUNK HchunkConstVal() const {
+ return m_UNUSED1 ? m_hchunkConstVal : HCHUNK_Nil;
+ }
+
+ HTYPE_DEFN Htdefn() const { return m_htdefn; }
+
+
+ TYPE_DEFN *QtdefnOfSimpleType() const {
+ DebAssert(IsSimpleType(), "should be simple type.");
+ return (TYPE_DEFN *)&m_htdefn;
+ }
+
+ HMEMBER Hmember() {
+ // CONSIDER: make the whole function EI_OB only since OLE
+ // should never call VAR_DEFN::Hmember().
+ //
+ return HMEMBER_Nil;
+ }
+
+ // The following return "illegal" values. There are defined here
+ // so that basic members which use VAR_DEFN's can share code
+ // with non-basic members that use MBR_VAR_DEFNs.
+ // CONSIDER: maybe we don't really need this...
+ //
+ HDLLENTRY_DEFN Hdllentrydefn() const { return HDLLENTRYDEFN_Nil; }
+ HST HstDocumentation() const { return HST_Nil; }
+ ULONG WHelpContext() const { return 0; }
+
+
+ // setters:
+ VOID SetAccess(ACCESS accessParm) { m_access = (USHORT)accessParm; }
+ VOID SetVkind(VAR_KIND vkindParm) { m_kind = (USHORT)vkindParm; }
+ VOID SetHasConstVal(BOOL fParm) { m_UNUSED1 = (USHORT)fParm; }
+ VOID SetIsSimpleConst(BOOL fParm) { m_isRestrictedOrSimpleConst = (USHORT)fParm; }
+ VOID SetIsStatic(BOOL fParm) { m_isStatic = (USHORT)fParm; }
+ VOID SetIsSimpleType(BOOL fParm) { m_isPureOrSimpleType = (USHORT)fParm; }
+ VOID SetIsDispatch(BOOL fParm) { m_UNUSED3 = (USHORT)fParm; }
+ VOID SetIsReadOnly(BOOL fParm) { m_UNUSED4 = (USHORT)fParm; }
+
+ VOID SetHasNew(BOOL fParm) { m_UNUSED2 = (USHORT)fParm; }
+ VOID SetHtdefn(HTYPE_DEFN htdefnParm) { m_htdefn = (sHTYPE_DEFN)htdefnParm; }
+ VOID SetOVar(USHORT usParm) { m_oVar = usParm; }
+ VOID SetSConstVal(SHORT sParm) { m_sConstVal = sParm; }
+ VOID SetHchunkConstVal(HCHUNK hchunkParm) { m_hchunkConstVal = (sHCHUNK)hchunkParm; }
+
+ VOID SetImplTypeFlags(USHORT wFlags);
+
+
+protected:
+ // Note: protected so that derived classes can get at them.
+ union {
+ USHORT m_oVar;
+ SHORT m_sConstVal;
+ sHCHUNK m_hchunkConstVal;
+
+ USHORT m_fImplType;
+ };
+
+private:
+ sHTYPE_DEFN m_htdefn;
+};
+
+// layout string for byte swapping
+#define VAR_DEFN_LAYOUT DEFN_LAYOUT "ss"
+
+// Special bit to note that ImplTypeFlags were explictly set to SOME value.
+// The m_impltypeflags field we are using is the unused m_ovar/m_hchunkconstval
+// field of the defn. In old typelibs (those created before we added the
+// support for impltypeflags), this field was either 0 (for the first impltype)
+// or -1 (for subsequent impltypes).
+//
+ #define IMPLTYPEFLAG_FSET 0x8000
+
+//NOTE: we OR-in and AND-off our special bit (and do checks for old typelibs
+// here rather than in the wrappers, because the binding code calls
+// these methods directly.
+
+inline VOID VAR_DEFN::SetImplTypeFlags(USHORT wFlags)
+{
+ DebAssert((wFlags & IMPLTYPEFLAG_FSET) == 0, "bogus flags");
+ m_fImplType = wFlags | IMPLTYPEFLAG_FSET;
+}
+
+//
+inline USHORT VAR_DEFN::GetImplTypeFlags() const
+{
+ USHORT fImplType = m_fImplType;
+
+ // Hack for old typelibs -- if no flags were set, then set the
+ // default bit for the first impltype
+ if (fImplType == 0) {
+ return IMPLTYPEFLAG_FDEFAULT;
+ }
+
+ // In old typelibs, non-first impltypes will have -1 for the flags
+ if (fImplType == 0xffff) { // correct flags from old typelib
+ return 0;
+ }
+
+ // new typelib -- strip off our magic bit.
+ return (fImplType & ~IMPLTYPEFLAG_FSET);
+}
+
+/***
+*class RECTYPE_DEFN - 'rtdefn': Describes a nested type
+*Purpose:
+* Structure Identifiing a nested type
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+***********************************************************************/
+
+class RECTYPE_DEFN : public DEFN
+{
+public:
+ // ctor
+ RECTYPE_DEFN() {
+ SetDefnkind(DK_RecTypeDefn);
+ m_hvdefnFirstMember = (sHVAR_DEFN) HVARDEFN_Nil;
+ m_himptype = (sHIMPTYPE) HIMPTYPE_Nil;
+ }
+
+ // accessors
+ // getters:
+ //
+ HVAR_DEFN HvdefnFirstMember() {return m_hvdefnFirstMember; }
+ HIMPTYPE Himptype() { return m_himptype; }
+ ACCESS Access() { return (ACCESS)m_access; }
+
+ // setters:
+ VOID SetAccess(ACCESS accessParm) { m_access = (sACCESS)accessParm; }
+ VOID SetHvdefnFirstMember(HVAR_DEFN hvdefnParm) { m_hvdefnFirstMember = (sHVAR_DEFN)hvdefnParm; }
+ VOID SetHimptype(HIMPTYPE himptypeParm) { m_himptype = (sHIMPTYPE)himptypeParm; }
+
+private:
+ // data members
+ sHVAR_DEFN m_hvdefnFirstMember;
+ sHIMPTYPE m_himptype;
+ sACCESS m_access;
+};
+
+// layout string for byte swapping
+#define RECTYPE_DEFN_LAYOUT DEFN_LAYOUT "sss"
+
+/***
+*class MBR_VAR_DEFN - 'mvdefn': Internal rep of a VARINFO object.
+*Purpose:
+* This struct represents the internal form of a VARINFO. Used
+* to represent a datamember.
+*
+*Implementation Notes:
+* MBR_VAR_DEFN is used to represent all members except
+* BASIC datamembers. This is for space reasons: see VAR_DEFN
+* for more details.
+*
+* Derives from VAR_DEFN and MEMBER_DEFN.
+* Layout:
+* [Inherited VAR_DEFN]
+* [Inherited MEMBER_DEFN]
+* If const or enum then literal binary const val.
+*
+* Note that constants/enums are ULONG length prefixed always -- both
+* for fixed-len datatypes and varlen types.
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+************************************************************************/
+
+class MBR_VAR_DEFN : public VAR_DEFN, public MEMBER_DEFN
+{
+public:
+ // ctor
+ MBR_VAR_DEFN() {
+ SetDefnkind(DK_MbrVarDefn);
+ // Do not initialize this data member as it is not always present.
+ // m_fVarFlags = 0;
+ }
+
+ // accessors
+ // getters:
+ //
+ HCHUNK HchunkConstMbrVal() const {
+ return ((IsDataMember() && HasConstVal()) || IsEnumerator() ?
+ m_hchunkConstVal : // from VAR_DEFN
+ HCHUNK_Nil);
+ }
+
+ // setters:
+ VOID SetHchunkConstMbrVal(HCHUNK hchunk) {
+ m_hchunkConstVal = (sHCHUNK)hchunk;
+ }
+
+ HMEMBER Hmember() const { return MEMBER_DEFN::Hmember(); }
+ HST HstDocumentation() const { return MEMBER_DEFN::HstDocumentation(); }
+ USHORT WHelpContext() const { return MEMBER_DEFN::WHelpContext(); }
+ VOID SetHmember(HMEMBER hmember) { MEMBER_DEFN::SetHmember(hmember); }
+ VOID SetHstDocumentation(HST hst) { MEMBER_DEFN::SetHstDocumentation(hst); }
+
+ VOID SetWHelpContext(USHORT wHelpContext) {
+ MEMBER_DEFN::SetWHelpContext(wHelpContext);
+ }
+
+ // V2 flags.
+ VOID SetWVarFlags(USHORT wFlags) {
+ m_fVarFlags = wFlags;
+ }
+
+ USHORT WVarFlags() const { return m_fVarFlags; }
+
+
+
+// CONSIDER: vba2
+// HCHUNK HchunkVbasePos() const {
+// return IsVirtualBase() ? m_hchunkVbasePos : HCHUNK_Nil;
+// }
+// CONSIDER: vba2
+// VOID SetHchunkVbasePos(HCHUNK hchunkParm)
+// { m_hchunkVbasePos = (sHCHUNK)hchunkParm; }
+private:
+ // Note: no introduced members.
+ // The following data member is added for V2
+ USHORT m_fVarFlags;
+
+};
+
+// layout string for byte swapping (only non-VAR_DEFN part)
+#define MBR_VAR_DEFN_LAYOUT VAR_DEFN_LAYOUT MEMBER_DEFN_LAYOUT ""
+
+#define MBR_VAR_DEFN_V2_LAYOUT MBR_VAR_DEFN_LAYOUT "s"
+
+
+#pragma code_seg(CS_CORE)
+
+/***
+*class PARAM_DEFN - 'paramdefn': Internal parameter for OLE/typelib.
+*Purpose:
+* This struct represents the internal form of a parameter for typelib
+*
+* Layout:
+* m_hlnam // Note: the lsb of hlnam is used to store isSimple flag.
+* //
+* // hlnam:15; Handle to the name of the parameter.
+* // Note: since hlnams are always even, these 15 bits
+* // are the "normalized" hlnam.
+* // IsSimple:1; the parameter is of simple type.
+* m_htdefn // USHORT : handle to the TYPE_DEFN
+*
+* All other param defn flags are stored in the TYPE_DEFN itself.
+* They are for now just: PARAMKIND
+*
+* NOTE: Following flag are not needed for PARAM DEFN in OLE.
+* VARKIND is always VKIND_Formal.
+* DEFNKIND is always DK_ParamDefn.
+*
+* WARNING: if you modify this structure, also update the layout string below
+*
+*
+***********************************************************************/
+
+class PARAM_DEFN
+{
+public:
+ // ctor
+ PARAM_DEFN() {
+ m_hlnam = 0xfffe; // HCHUNK_Nil and isSimpleType is flase.
+ m_htdefn = (sHTYPE_DEFN)HTYPEDEFN_Nil;
+ }
+
+ // accessors
+ // getters:
+ //
+ BOOL IsSimpleType() const { return (BOOL)(m_hlnam & 0x0001); }
+ HLNAM Hlnam() const {
+ // if all bits are 0 then we need to return HLNAM_Nil
+ if ((m_hlnam & ~0x0001) == 0xfffe)
+ return HLNAM_Nil;
+ else
+ return (HLNAM) (m_hlnam & ~0x0001);
+ }
+ HTYPE_DEFN Htdefn() const { return m_htdefn; }
+ TYPE_DEFN *QtdefnOfSimpleType() const {
+ DebAssert(IsSimpleType(), "should be simple type.");
+ return (TYPE_DEFN *)&m_htdefn;
+ }
+ PARAM_DEFN *QparamdefnNext() {
+ // This function assumes that OLE PARAM_DEFNs are always laidout
+ // contiguously in an array.
+ //
+ return (PARAM_DEFN *) (this + 1);
+ }
+
+ // setters:
+ VOID SetHtdefn(HTYPE_DEFN htdefn) {
+ m_htdefn = (sHTYPE_DEFN)htdefn;
+ }
+ VOID SetIsSimpleType(BOOL fSimple) {
+ m_hlnam = fSimple ? (m_hlnam | 0x0001) : (m_hlnam & ~0x0001);
+ }
+ VOID SetHlnam(HLNAM hlnam) {
+ DebAssert(hlnam != 0xfffe, " cannot store this handle ");
+
+ if (hlnam == HCHUNK_Nil) {
+ hlnam &= 0xfffe;
+ }
+
+ DebAssert(!(hlnam & 0x0001), "Hlnam is assumed to be even");
+ // set the hlnam preserving the isSimple bit.
+ m_hlnam = IsSimpleType() ? (hlnam | 0x0001) : hlnam;
+ }
+
+private:
+ USHORT m_hlnam; // Hlnam of the parameter. isSimple is stored in
+ // the lsb.
+ USHORT m_htdefn; // handle to the TYPE_DEFN
+
+};
+// layout string for byte swapping the param defn
+#define PARAM_DEFN_LAYOUT "ss"
+
+
+#pragma code_seg()
+
+
+
+/***
+*class FUNC_TYPE_DEFN - 'ftdefn': Internal rep of a FUNCDESC object.
+*Purpose:
+* This struct represents the internal form of a FUNCDESC.
+*
+*Implementation Notes:
+* Layout:
+* Calling convention:2
+* Arg count:6 (effectively limits to 64)
+*
+* used to be: TYPE_DEFN handle for THIS ptr.
+* TYPE_DEFN handle for RESULT parameter.
+* OB: PARAM_DEFN handle for listhead of first PARAM_DEFN in list
+* of formal params.
+* OLE: PARAM_DEFN handle for first element of PARAM_DEFN array
+* of formal params.
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+* Munging:
+* In order for a basic funcdefn to handle both OLE and OB
+* requirements, we 'munge' the funcdefn by having both a
+* retval parameter and a return type. When the user requests
+* information, we either give them the retval parameter (and
+* set the return type to HRESULT) or give them the actual
+* return type (and reduce CArgs by one). Of course, this means
+* that we can no longer blindly loop over the paramdefns.
+*
+* Note that these 'Unmunged' routines boil down to the
+* normal accessor functions when compiled under OLE. This
+* reduces the number of #if's in the code.
+*
+***********************************************************************/
+
+// ARGS_BITS is the number of bits we use for the cArgs field
+// OPTARGS_BITS is the number of bits we use for the cArgsOpt field
+// OPTARGS_LIST is the value to put in the cArgsOpt field to indicate
+// that the last parameter in the function is a list of
+// parameters (i.e. ParamArray in Basic)
+// MAX_CARGS is the max number of args a function can have
+// MAX_CARGSOPT is the max number of optional args a function can have--
+// it is OPTARGS_LIST-1 because a) zero means none and
+// b) all bits on means that we have an OPTARGS_LIST--
+// this means that we have OPTARGS_LIST-1 combinations
+// left to store the number of optional args
+//
+#define ARGS_BITS 6
+#define OPTARGS_BITS 6
+#define OPTARGS_LIST ((1<<(OPTARGS_BITS))-1)
+#define MAX_CARGS 60
+#define MAX_CARGSOPT 60
+
+class FUNC_TYPE_DEFN
+{
+public:
+
+ // public data member since its address is used
+ //
+ sHDEFN m_hdefnFormalFirst; // OB: actually listhead
+ // OLE: first element in array.
+
+ // methods
+
+ // ctor
+ FUNC_TYPE_DEFN() {
+ m_cc = CC_MSCPASCAL;
+ m_cArgs = 0;
+ m_cArgsOpt = 0;
+ m_isSimpleTypeResult = FALSE;
+ m_htdefnResult = (sHTYPE_DEFN)HTYPEDEFN_Nil;
+ m_hdefnFormalFirst = (sHDEFN)HDEFN_Nil;
+
+ }
+
+ // accessors
+ // getters:
+ //
+
+ BOOL HasRetval() const {
+ // For speed, the retval and/or the lcid bits are set on the
+ // function return type if any of the parameters have these
+ // bits set.
+ //
+ return IsSimpleTypeResult()
+ && QtdefnOfSimpleTypeResult()->IsRetval();
+ }
+
+ BOOL HasLcid() const {
+ // For speed, the retval and/or the lcid bits are set on the
+ // function return type if any of the parameters have these
+ // bits set.
+ //
+ return IsSimpleTypeResult()
+ && QtdefnOfSimpleTypeResult()->IsLCID();
+ }
+
+ CALLINGCONVENTION CcUnmunged() const {
+ return (CALLINGCONVENTION)m_cc;
+ }
+
+ CALLINGCONVENTION Cc() const
+ {
+
+ return (CALLINGCONVENTION)m_cc;
+ }
+
+ BOOL IsCcMscPascal() const
+ {
+ return Cc() == CC_MSCPASCAL
+ ;
+ }
+ BOOL IsCcMacPascal() const
+ {
+ return Cc() == CC_MACPASCAL
+ ;
+ }
+ BOOL IsCcCdecl() const
+ {
+ return Cc() == CC_CDECL
+ ;
+ }
+ BOOL IsCcStdcall() const
+ {
+ return Cc() == CC_STDCALL
+ ;
+ }
+
+ BOOL IsParamArray() const { return (BOOL)(m_cArgsOpt == OPTARGS_LIST); }
+
+ UINT CArgsUnmunged() const {
+ return m_cArgs;
+ }
+
+ UINT CArgs() const
+ {
+ INT r = m_cArgs;
+
+ if (HasRetval()) r--;
+ if (HasLcid()) r--;
+
+ DebAssert(r >= 0, "bit set when not enough args");
+
+ return r;
+ }
+
+ INT CArgsOpt() const { return (IsParamArray() ? -1 : m_cArgsOpt); }
+
+ BOOL IsSimpleTypeResultUnmunged() const {
+
+ return m_isSimpleTypeResult;
+ }
+
+ BOOL IsSimpleTypeResult() const
+ {
+ return (BOOL)m_isSimpleTypeResult;
+ }
+
+ HTYPE_DEFN HtdefnResultUnmunged() const
+ {
+
+ return (HTYPE_DEFN)m_htdefnResult;
+ }
+
+
+ HTYPE_DEFN HtdefnResult() const
+ {
+ return (HTYPE_DEFN)m_htdefnResult;
+ }
+
+ TYPE_DEFN *QtdefnOfSimpleTypeResultUnmunged() const {
+ DebAssert(IsSimpleTypeResultUnmunged(),
+ "result type should be simple.");
+
+
+ return (TYPE_DEFN *)&m_htdefnResult;
+ }
+
+ TYPE_DEFN *QtdefnOfSimpleTypeResult() const {
+ DebAssert(IsSimpleTypeResult(), "result type should be simple.");
+
+ return (TYPE_DEFN *)&m_htdefnResult;
+ }
+
+ // setters:
+ VOID SetCc(CALLINGCONVENTION ccParm) { m_cc = (USHORT)ccParm; }
+ VOID SetCArgs(UINT cParm) { m_cArgs = (USHORT)cParm; }
+ VOID SetCArgsOpt(INT cParm) { m_cArgsOpt = (USHORT)cParm; }
+ VOID SetIsSimpleTypeResult(BOOL fParm) { m_isSimpleTypeResult = (USHORT)fParm; }
+ VOID SetHtdefnResult(HTYPE_DEFN htdefnParm) { m_htdefnResult = (sHTYPE_DEFN)htdefnParm; }
+
+
+private:
+ // data members
+ USHORT m_cc:3; // was CALLINGCONVENTION
+ USHORT m_cArgs:ARGS_BITS; // was BYTE
+ USHORT m_cArgsOpt:OPTARGS_BITS; // was BYTE
+ USHORT m_isSimpleTypeResult:1; // was BOOL
+
+ sHTYPE_DEFN m_htdefnResult;
+};
+
+// layout string for byte swapping
+#define FUNC_TYPE_DEFN_LAYOUT "sss"
+
+
+
+/***
+*class FUNC_DEFN - 'fdefn': Internal rep of a FUNCINFO object.
+*Purpose:
+* This struct represents the internal form of a FUNCINFO.
+*
+*Implementation Notes:
+* Derives from DEFN and MEMBER_DEFN.
+*
+* Used for all non-virtual functions, including BASIC functions
+* and BASIC declares.
+*
+* Layout:
+* [Inherited DEFN and MEMBER_DEFN]
+* Embedded FUNC_TYPE_DEFN.
+* VBA-only: Embedded EXMGR_FUNCDEFN (managed by excode generator).
+* Access
+* Declaration kind
+* Function kind
+* Is pure flag
+* Has static locals flag
+* // Following bit fields are declared in DEFN and are used here
+* // to store the INVOKE_KIND.
+* //
+* USHORT m_UNUSED1 == INVOKE_FUNC
+* USHORT m_UNUSED2 == INVOKE_PROPERTYGET
+* USHORT m_UNUSED3 == INVOKE_PROPERTYPUT
+* USHORT m_UNUSED4 == INVOKE_PROPERTYPUTREF
+*
+* Number of lines in function
+*
+* Prologue delta (to adjust this pointer with).
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+**********************************************************************/
+
+class FUNC_DEFN : public DEFN, public MEMBER_DEFN
+{
+public:
+
+ // these data members are left public since their address is passed
+ // as parms to some functions
+ //
+
+ FUNC_TYPE_DEFN m_ftdefn;
+
+ // ctor
+ FUNC_DEFN() {
+ SetDefnkind(DK_FuncDefn);
+ m_hdllentrydefn = (sHDLLENTRY_DEFN)HDLLENTRYDEFN_Nil;
+ m_access = ACCESS_Public;
+ m_UNUSED5 = 0;
+ m_fV2Flags = 0;
+ m_kind = FKIND_NonVirtual; // FUNC_KIND
+ m_isPureOrSimpleType = FALSE; // isPure
+ m_isStatic = FALSE; // isStaticLocalVars
+ m_isRestrictedOrSimpleConst = FALSE; // isRestricted
+ m_UNUSED1 = INVOKE_FUNC; // INVOKEKIND
+ m_UNUSED2 = m_UNUSED3 = m_UNUSED4 = 0;
+
+
+ // Do not initialize this data member as it is not always present.
+ // m_fFuncFlags = 0;
+ }
+
+ // accessors
+ // getters:
+ //
+ ACCESS Access() const { return (ACCESS)m_access; }
+ BOOL IsPublic() const { return Access() == ACCESS_Public; }
+ BOOL IsPrivate() const { return Access() == ACCESS_Private; }
+
+ FUNC_KIND Fkind() const { return (FUNC_KIND)m_kind; }
+ BOOL IsVirtual() const { return Fkind() == FKIND_Virtual; }
+ BOOL IsNonVirtual() const { return Fkind() == FKIND_NonVirtual; }
+ BOOL IsStatic() const { return Fkind() == FKIND_Static; }
+ BOOL IsDispatch() const { return Fkind() == FKIND_Dispatch; }
+ INVOKEKIND InvokeKind() const {return (INVOKEKIND)(
+ (USHORT) (((USHORT) ((USHORT)m_UNUSED4 << 3)) |
+ ((USHORT) ((USHORT)m_UNUSED3 << 2)) |
+ ((USHORT) ((USHORT)m_UNUSED2 << 1)) |
+ ((USHORT) m_UNUSED1) )); }
+
+ BOOL IsMethod() const { return (BOOL)m_UNUSED1; }
+ BOOL IsPropertyGet() const {
+ return (BOOL)m_UNUSED2;
+ }
+ BOOL IsPropertyLet() const {
+ return (BOOL)m_UNUSED3;
+ }
+ BOOL IsPropertySet() const {
+ return (BOOL)m_UNUSED4;
+ }
+ BOOL IsPure() const { return (BOOL)m_isPureOrSimpleType; }
+ BOOL IsStaticLocalVars() const { return (BOOL)m_isStatic; }
+ BOOL IsRestricted() const { return (BOOL)m_isRestrictedOrSimpleConst;}
+
+ BOOL HasRetval() const {
+ return m_ftdefn.HasRetval();
+ }
+ BOOL HasLcid() const {
+ return m_ftdefn.HasLcid();
+ }
+
+
+ USHORT WFuncFlags() const { return (USHORT)m_fFuncFlags; };
+ HDLLENTRY_DEFN Hdllentrydefn() const {
+ return IsVirtual() ? HDLLENTRYDEFN_Nil : m_hdllentrydefn;
+ }
+ UINT Ovft() const {
+ return (UINT)m_oVft;
+ }
+
+ BOOL IsHresultSub() const
+ {
+ TYPE_DEFN *qtdefn;
+
+ if (IsSub())
+ return TRUE;
+
+ if (!m_ftdefn.IsSimpleTypeResult())
+ return FALSE;
+
+ qtdefn = m_ftdefn.QtdefnOfSimpleTypeResult();
+
+ return qtdefn->Tdesckind() == TDESCKIND_HResult
+ && !qtdefn->IsRetval();
+ }
+
+ BOOL IsSub() const
+ {
+ TYPE_DEFN *qtdefn;
+
+ if (!m_ftdefn.IsSimpleTypeResult()) {
+ return m_ftdefn.HtdefnResult() == HTYPEDEFN_Nil;
+ }
+
+ qtdefn = m_ftdefn.QtdefnOfSimpleTypeResult();
+
+ return qtdefn->Tdesckind() == TDESCKIND_Void
+ && qtdefn->Ptrkind() == PTRKIND_Ignore;
+ }
+
+ // The following two are simple wrappers on the ftdefn to make
+ // fdefn client's life easier.
+ //
+ UINT CArgs() const { return m_ftdefn.CArgs(); }
+ INT CArgsOpt() const { return m_ftdefn.CArgsOpt(); }
+ UINT CArgsUnmunged() const { return m_ftdefn.CArgsUnmunged(); }
+
+ // setters:
+ VOID SetAccess(ACCESS access) { m_access = (USHORT)access; }
+ VOID SetFkind(FUNC_KIND fkind) { m_kind = (USHORT)fkind; }
+ VOID SetIsPure(BOOL fPure) { m_isPureOrSimpleType = (USHORT)fPure; }
+ VOID SetIsStaticLocalVars(BOOL fStatic) { m_isStatic = (USHORT)fStatic; }
+ VOID SetIsRestricted(BOOL fRestricted) {
+ m_isRestrictedOrSimpleConst = (USHORT)fRestricted;
+ }
+ VOID SetHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) {
+ DebAssert(!IsVirtual(), "shouldn't be virtual.");
+ m_hdllentrydefn = (sHDLLENTRY_DEFN)hdllentrydefn;
+ }
+
+ VOID SetWFuncFlags(USHORT wFlags) {
+ m_fFuncFlags = wFlags;
+ }
+
+ VOID SetInvokeKind(INVOKEKIND invkind) {
+ m_UNUSED1 = (invkind == INVOKE_FUNC),
+ m_UNUSED2 = (invkind == INVOKE_PROPERTYGET),
+ m_UNUSED3 = (invkind == INVOKE_PROPERTYPUT),
+ m_UNUSED4 = (invkind == INVOKE_PROPERTYPUTREF); }
+
+ VOID SetOvft(UINT oVft) {
+ m_oVft = (USHORT)oVft;
+ }
+
+
+protected:
+ union {
+ // proteced so that derived classes can access structure members
+ USHORT m_oVft; // offset in Virtual function table.
+ sHDLLENTRY_DEFN m_hdllentrydefn;
+ };
+
+private:
+
+ // The following data member is added for V2
+ USHORT m_fFuncFlags;
+
+
+};
+
+// layout string for byte swapping
+// (different versions for OB & !OB because of EXMGR_FUNCDEFN)
+//
+#define FUNC_DEFN_LAYOUT DEFN_LAYOUT MEMBER_DEFN_LAYOUT \
+ FUNC_TYPE_DEFN_LAYOUT "s"
+
+#define FUNC_DEFN_V2FLAGS_LAYOUT "s" // extra flags word
+
+
+
+
+/***
+*class VIRTUAL_FUNC_DEFN - 'vfdefn'
+*Purpose:
+* This struct represents the internal form of a FUNCINFO for
+* a virtual function.
+*
+*Implementation Notes:
+* Derives from FUNC_DEFN.
+*
+* A virtual function is tagged by FUNC_KIND = FKIND_Virtual.
+* Clients will never know the difference; all code that cares
+* whether it is dealing with a FUNC_DEFN or a VIRTUAL_FUNC_DEFN
+* will check the tag.
+*
+* Layout:
+* [Inherited FUNC_DEFN]
+* Embedded virtual method position descriptor.
+*
+* *** if you modify this structure, also update the layout string below
+* (see SwapStruct() for more info)
+*
+**********************************************************************/
+
+class VIRTUAL_FUNC_DEFN : public FUNC_DEFN
+{
+public:
+
+ // ctor
+ VIRTUAL_FUNC_DEFN() {
+ SetDefnkind(DK_VirtualFuncDefn);
+ }
+
+ // accessors
+ // getters:
+ //
+ // setters:
+
+private:
+//WARNING: Note we have added a USHORT in FUNC_DEFN for our V2 release. So
+// if you add a data member here, it may break the compatibity with
+// V1.
+};
+
+// layout string for byte swapping (non FUNC_DEFN part)
+#define VIRTUAL_FUNC_DEFN_LAYOUT ""
+
+
+// Inline methods that depend on forward declarations.
+//
+inline ACCESS DEFN::Access()
+{
+ if (IsVarDefn())
+ return ((VAR_DEFN *)this)->Access();
+ else if (IsFuncDefn())
+ return ((FUNC_DEFN *)this)->Access();
+ else {
+ DebAssert(IsRecTypeDefn(), "should be nested type.");
+ return ((RECTYPE_DEFN *)this)->Access();
+ }
+}
+
+#pragma pack() // reset to default
+
+
+#endif // DEFN_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dfntbind.cxx b/private/oleauto/src/typelib/dfntbind.cxx
new file mode 100644
index 000000000..db99a8ba1
--- /dev/null
+++ b/private/oleauto/src/typelib/dfntbind.cxx
@@ -0,0 +1,80 @@
+/***
+*dfntbind.cxx - DEFN_TYPEBIND class implementation
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Root protocol for Object Basic specific implementations
+* of TYPEBIND -- specifically, those that are implemented
+* in terms of DEFNs.
+*
+*Revision History:
+*
+* 27-May-92 ilanc: Created
+* 30-Jul-92 w-peterh: Moved IsMatchOfVisibility to cltypes.hxx
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+
+#define DEFN_TYPEBIND_VTABLE
+#include "dfntbind.hxx"
+#include "xstring.h"
+
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleDfntbindCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleDfntbindCxx
+#else
+static char szDfntbindCxx[] = __FILE__;
+#define SZ_FILE_NAME szDfntbindCxx
+#endif
+#endif //ID_DEBUG
+
+
+
+LPOLESTR DEFN_TYPEBIND::szProtocolName = WIDE("MS-DEFN_TYPEBIND");
+LPOLESTR DEFN_TYPEBIND::szBaseName = WIDE("MS-TYPEBIND");
+
+
+// QueryProtocol method
+//
+LPVOID DEFN_TYPEBIND::QueryProtocol(LPOLESTR szInterfaceName)
+{
+ if (szInterfaceName == szProtocolName ||
+ ostrcmp(szInterfaceName, szProtocolName) == 0 ||
+ ostrcmp(szInterfaceName, szBaseName) ==0)
+ return this;
+ else
+ return NULL;
+}
+
+
+// Following virtual methods are stubbed as NOPs essentially
+// and aren't implemented further in the DEFN derivatives.
+//
+LONG DEFN_TYPEBIND::GetOPvft()
+{
+ return 0xFFFFFFFF;
+}
+
+
+USHORT DEFN_TYPEBIND::GetCbSizeVft()
+{
+ return 0;
+}
+
+
+TIPERROR DEFN_TYPEBIND::BindType(HGNAM hgnamType, LPSTR szTidType, UINT cMax)
+{
+ return TIPERR_None;
+}
+
+
diff --git a/private/oleauto/src/typelib/dfntbind.hxx b/private/oleauto/src/typelib/dfntbind.hxx
new file mode 100644
index 000000000..9891f8eb6
--- /dev/null
+++ b/private/oleauto/src/typelib/dfntbind.hxx
@@ -0,0 +1,272 @@
+/***
+*dfntbind.hxx - DEFN_TYPEBIND header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This protocol is intended to be a base class for
+* the Object Basic implementation of TYPEBIND for
+* - modules (DYN_TYPEBIND)
+* - nested types (REC_TYPEBIND)
+* - projects (PROJ_TYPEBIND).
+*
+* It stubs the true TYPEBIND protocol and provides
+* implementations in terms of internal DEFN structs and
+* BIND_DESC structs.
+*
+* It provides some implementation which is shared between
+* nested types (REC_TYPEBIND) and classes (DYN_TYPEBIND).
+*
+*Revision History:
+*
+* 27-May-92 ilanc: Stub created.
+* 30-Jul-92 w-peterh: removed function overloading
+*
+*Implementation Notes:
+*****************************************************************************/
+
+#ifndef DEFN_TYPEBIND_HXX_INCLUDED
+#define DEFN_TYPEBIND_HXX_INCLUDED
+
+#include "stream.hxx"
+#include "defn.hxx" // for DEFN binding structs.
+
+
+
+class EXBIND;
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDFNTBIND_HXX)
+#define SZ_FILE_NAME g_szDFNTBIND_HXX
+#endif
+
+class DYN_TYPEROOT;
+
+/***
+*class DEFN_TYPEBIND - 'dfntbind': Type bind implementation
+*Purpose:
+* The class defines type bind in terms of DEFN structs.
+*
+***********************************************************************/
+
+class DEFN_TYPEBIND
+{
+public:
+ DEFN_TYPEBIND();
+
+ // redeclared pure virtuals
+ virtual ~DEFN_TYPEBIND() = 0;
+ virtual VOID Release() = 0;
+ virtual VOID AddRef() = 0;
+
+ virtual TIPERROR GetTypeInfo(TYPEINFO **lplptinfo) = 0;
+ virtual TYPEKIND GetTypeKind() = 0;
+ virtual USHORT GetCbSize() = 0;
+ virtual USHORT GetAlignment() = 0;
+
+ // overridden virtuals
+ virtual LPVOID QueryProtocol(LPOLESTR szInterfaceName);
+ virtual LONG GetOPvft();
+ virtual USHORT GetCbSizeVft();
+ virtual TIPERROR BindType(HGNAM hgnamType, LPSTR szTidType, UINT cMax);
+
+ // introduce non-virtuals.
+ nonvirt HMEMBER HmemberConstructor();
+ nonvirt HMEMBER HmemberDestructor();
+ nonvirt HMEMBER HmemberAssign();
+ nonvirt HMEMBER HmemberCopy();
+ nonvirt VOID SetHmemberDestructor(HMEMBER hmember);
+ nonvirt VOID SetHmemberAssign(HMEMBER hmember);
+ nonvirt VOID SetHmemberCopy(HMEMBER hmember);
+
+
+ virtual TIPERROR BindDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind) = 0;
+
+ virtual TIPERROR BindTypeDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind) = 0;
+
+
+ virtual TIPERROR BindDefnProjLevelStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ EXBIND *pexbind) = 0;
+
+ virtual TIPERROR BindTypeDefnProjLevelStr(LPSTR szName,
+ UINT, // fuInvokeKind: unused
+ ACCESS access,
+ ACCESS accessProj,
+ EXBIND *pexbind) = 0;
+
+
+ // Public data members
+ static LPOLESTR szProtocolName;
+ static LPOLESTR szBaseName;
+
+protected:
+ sHMEMBER m_hmemberConst; // hmembers of special functions.
+ sHMEMBER m_hmemberDest; // should be serialized
+ sHMEMBER m_hmemberAssign;
+ sHMEMBER m_hmemberCopy;
+
+#ifdef DEFN_TYPEBIND_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+inline DEFN_TYPEBIND::~DEFN_TYPEBIND() {}
+
+
+
+/***
+*PUBLIC DEFN_TYPEBIND::HmemberConstructor()
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+* return HMEMBER for constructor function
+*
+***********************************************************************/
+
+inline HMEMBER DEFN_TYPEBIND::HmemberConstructor()
+{
+ return m_hmemberConst;
+}
+
+
+/***
+*PUBLIC DEFN_TYPEBIND::HmemberDestructor()
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+* return HMEMBER for destructor function
+*
+***********************************************************************/
+
+inline HMEMBER DEFN_TYPEBIND::HmemberDestructor()
+{
+ return m_hmemberDest;
+}
+
+
+/***
+*PUBLIC DEFN_TYPEBIND::HmemberAssign()
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+* return HMEMBER for assign function
+*
+***********************************************************************/
+
+inline HMEMBER DEFN_TYPEBIND::HmemberAssign()
+{
+ return m_hmemberAssign;
+}
+
+
+/***
+*PUBLIC DEFN_TYPEBIND::HmemberCopy()
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+* return HMEMBER for copy function
+*
+***********************************************************************/
+
+inline HMEMBER DEFN_TYPEBIND::HmemberCopy()
+{
+ return m_hmemberCopy;
+}
+
+
+
+
+/***
+*PUBLIC DEFN_TYPEBIND::SetHmemberDestructor()
+*Purpose:
+* Sets the Destructor hmember.
+*
+*Entry:
+* hmember - HMEMBER for Destructor function
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID DEFN_TYPEBIND::SetHmemberDestructor(HMEMBER hmember)
+{
+ m_hmemberDest = hmember;
+}
+
+
+
+/***
+*PUBLIC DEFN_TYPEBIND::SetHmemberAssign()
+*Purpose:
+* Sets the Assign hmember.
+*
+*Entry:
+* hmember - HMEMBER for Assign function
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID DEFN_TYPEBIND::SetHmemberAssign(HMEMBER hmember)
+{
+ m_hmemberAssign = hmember;
+}
+
+
+
+/***
+*PUBLIC DEFN_TYPEBIND::SetHmemberCopy()
+*Purpose:
+* Sets the Copy hmember.
+*
+*Entry:
+* hmember - HMEMBER for Copy function
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID DEFN_TYPEBIND::SetHmemberCopy(HMEMBER hmember)
+{
+ m_hmemberCopy = hmember;
+}
+
+
+/***
+*PUBLIC DEFN_TYPEBIND::DEFN_TYPEBIND()
+*Purpose:
+* Constructor
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline DEFN_TYPEBIND::DEFN_TYPEBIND()
+{
+ m_hmemberConst = m_hmemberDest = m_hmemberAssign = m_hmemberCopy =
+ HMEMBER_Nil;
+}
+
+
+#endif // ! DEFN_TYPEBIND_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dfntcomp.cxx b/private/oleauto/src/typelib/dfntcomp.cxx
new file mode 100644
index 000000000..0887208a1
--- /dev/null
+++ b/private/oleauto/src/typelib/dfntcomp.cxx
@@ -0,0 +1,569 @@
+/***
+*dfntcomp.cxx - CDefnTypeComp class implementation
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Root protocol for Object Basic specific implementations
+* of ITypeComp -- specifically, those that are implemented
+* in terms of DEFNs.
+*
+*Revision History:
+*
+* 24-Jan-93 ilanc: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "dfntcomp.hxx"
+#include "nammgr.hxx"
+#include "tdata.hxx"
+#include "exbind.hxx"
+#include "dfntbind.hxx"
+#include "gptbind.hxx"
+#include "gdtinfo.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleDfntcompCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleDfntcompCxx
+#else
+static char szDfntcompCxx[] = __FILE__;
+#define SZ_FILE_NAME szDfntcompCxx
+#endif
+#endif //ID_DEBUG
+
+TIPERROR IsFunkyDispinterface(GEN_DTINFO *pgdtinfo,
+ BOOL *pisFunkyDispinterface);
+
+/***
+*PUBLIC CDefnTypeComp ctor
+*Purpose:
+* Construct an instance of CDefnTypeComp
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+CDefnTypeComp::CDefnTypeComp()
+{
+ m_pdfntbind = NULL;
+ m_cRefs = 0;
+}
+
+
+/***
+*PUBLIC CDefnTypeComp dtor
+*Purpose:
+* Destruct an instance of CDefnTypeComp
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+CDefnTypeComp::~CDefnTypeComp()
+{
+ // release the single DEFN_TYPEBIND reference that was added
+ // when this instance was inited.
+ //
+ m_pdfntbind->Release();
+}
+
+
+/***
+*static PUBLIC CDefnTypeComp::Create
+*Purpose:
+* Static method to create and init instance.
+*
+*Entry:
+* ppdfntcomp OUT
+* pdfntbind IN
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR CDefnTypeComp::Create(CDefnTypeComp **ppdfntcomp,
+ DEFN_TYPEBIND *pdfntbind)
+{
+ TIPERROR err;
+
+ DebAssert(ppdfntcomp != NULL && pdfntbind != NULL, "null params.");
+
+ // alloc and construct instanc.
+ if ((*ppdfntcomp = MemNew(CDefnTypeComp)) != NULL) {
+ // Init instance
+ ::new (*ppdfntcomp) CDefnTypeComp;
+ err = (*ppdfntcomp)->Init(pdfntbind);
+ if (err != TIPERR_None) {
+ (*ppdfntcomp)->CDefnTypeComp::~CDefnTypeComp();
+ MemFree(*ppdfntcomp);
+ *ppdfntcomp = NULL;
+ }
+ return err;
+ }
+ else {
+ return TIPERR_OutOfMemory;
+ }
+}
+
+
+/***
+*static PUBLIC CDefnTypeComp::Init
+*Purpose:
+* Method to init instance.
+*
+*Entry:
+* pdfntbind IN
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR CDefnTypeComp::Init(DEFN_TYPEBIND *pdfntbind)
+{
+ m_pdfntbind = pdfntbind;
+
+ // add a single reference to the contained DEFN_TYPEBIND
+ // which will be released when this instance is deleted.
+ //
+ m_pdfntbind->AddRef();
+
+ // init ref count
+ m_cRefs = 1;
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC CDefnTypeComp::QueryInterface
+*Purpose:
+* Implementation of QueryInterface method.
+*
+*Entry:
+* riid - Interface GUID
+* ppvObj - LPVOID * that receives the requested protocol.
+*
+*Exit:
+* Return NOERROR or ReportResult(0, E_NOINTERFACE, 0, 0)
+***********************************************************************/
+HRESULT CDefnTypeComp::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
+{
+ if (IIDEQ(riid, IID_CDefnTypeComp)) {
+ *ppvObj = (LPVOID) (CDefnTypeComp *)this;
+ AddRef();
+ return NOERROR;
+ }
+
+ if (IIDEQ(riid, IID_ITypeCompA)) {
+ *ppvObj = (LPVOID) (ITypeCompA *)this;
+ AddRef();
+ return NOERROR;
+ }
+
+ if (IIDEQ(riid, IID_IUnknown)) {
+ *ppvObj = (LPVOID) (IUnknown *)(ITypeLibA *)this;
+ AddRef();
+ return NOERROR;
+ }
+
+ *ppvObj = NULL; // required by OLE
+ return ReportResult(0, E_NOINTERFACE, 0, 0);
+}
+
+/***
+*PUBLIC CDefnTypeComp::AddRef
+*Purpose:
+* Add an external reference to the CDefnTypeComp.
+* Defer to wrapped DEFN_TYPEBIND.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+ULONG CDefnTypeComp::AddRef()
+{
+ m_cRefs++;
+ DebAssert(m_cRefs > 0, "overflow.");
+
+ return m_cRefs;
+}
+
+
+/***
+*PUBLIC CDefnTypeComp::Release
+*Purpose:
+* Release an external reference to the CDefnTypeComp.
+* Defer to wrapped DEFN_TYPEBIND.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+ULONG CDefnTypeComp::Release()
+{
+ ULONG cRefs;
+
+ DebAssert(m_cRefs > 0, "underflow.");
+ m_cRefs--;
+
+ cRefs = m_cRefs;
+
+ if (m_cRefs == 0) {
+ this->CDefnTypeComp::~CDefnTypeComp();
+ MemFree(this);
+ }
+
+ return cRefs;
+}
+
+
+/***
+*PUBLIC CDefnTypeComp::Bind
+*Purpose:
+* Binds to a non-type identifier.
+*
+*Entry:
+* szName IN
+* lHashVal IN
+* fuInvokeKind IN
+* pptinfo OUT
+* pdesckind OUT
+* ppv OUT
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+HRESULT CDefnTypeComp::Bind(LPOLESTR szName,
+ ULONG lHashVal,
+ WORD fuInvokeKind,
+ ITypeInfoA FAR* FAR* pptinfo,
+ DESCKIND FAR* pdesckind,
+ BINDPTRA FAR *pbindptr)
+{
+ EXBIND exbind;
+ VARDESCA *pvardesc;
+ FUNCDESC *pfuncdesc;
+ BIND_KIND bkind;
+ DEFN_TYPEBIND *pdfntbind;
+ CDefnTypeComp *pdfntcomp;
+ GENPROJ_TYPEBIND *pgptbind;
+ DYN_TYPEBIND *pdtbind = NULL;
+ NAMMGR *pnammgr;
+ HGNAM hgnam;
+ TIPERROR err;
+#if OE_WIN32
+ HRESULT hresult;
+ CHAR FAR *szNameA = NULL;
+#endif //OE_WIN32
+
+ if (!szName || !pptinfo || !pdesckind || !pbindptr) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ if ((fuInvokeKind & ~(INVOKE_FUNC | INVOKE_PROPERTYGET | INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF)) != 0) {
+ // ensure no stray bits are set -- 0 is now allowed
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ DebAssert(m_pdfntbind != NULL, "uninitialized.");
+
+#if OE_WIN32
+ IfOleErrRet(ConvertStringToA(szName, &szNameA));
+#else //OE_WIN32
+ #define szNameA szName
+#endif //OE_WIN32
+
+ // Note that for (non-OB) typelibs we use the proj-level-only binder
+ if ((pgptbind = (GENPROJ_TYPEBIND *)m_pdfntbind->
+ QueryProtocol(GENPROJ_TYPEBIND::szProtocolName)) != NULL) {
+ // Use the hashval
+ IfErrGo(pgptbind->Pgtlibole()->GetNamMgr(&pnammgr));
+ IfErrGo(pnammgr->GetHgnamOfStrLhash(szNameA, lHashVal, &hgnam));
+ if (hgnam != HGNAM_Nil) {
+ IfErrGo(pgptbind->BindProjLevel(FALSE,
+ hgnam,
+ fuInvokeKind,
+ ACCESS_Public,
+ ACCESS_Public,
+ pgptbind->Compstate(),
+ &exbind));
+ }
+ }
+ else {
+ NoAssertRetail(
+ pdtbind = (DYN_TYPEBIND *)m_pdfntbind->
+ QueryProtocol(DYN_TYPEBIND::szProtocolName),
+ "should be DYN_TYPEBIND.");
+
+ // Use the hashval.
+ IfErrGo(pdtbind->Ptdata()->Pnammgr()->GetHgnamOfStrLhash(szNameA,
+ lHashVal,
+ &hgnam));
+ if (hgnam != HGNAM_Nil) {
+ IfErrGo(pdtbind->BindIdDefn(FALSE,
+ hgnam,
+ fuInvokeKind,
+ ACCESS_Public,
+ &exbind));
+ }
+ }
+ bkind = exbind.BindKind();
+ switch (bkind) {
+ case BKIND_Error:
+ DebHalt("Should never happen");
+ break;
+
+ case BKIND_NoMatch:
+ *pdesckind = DESCKIND_NONE;
+ break;
+
+ case BKIND_ImplicitAppobjMatch:
+ *pdesckind = DESCKIND_IMPLICITAPPOBJ;
+ goto CommonAppobjVarMatch;
+
+ case BKIND_OneVarMatch:
+ *pdesckind = DESCKIND_VARDESC;
+
+CommonAppobjVarMatch:
+ IfErrGoTo(exbind.Ptdata()->GetVarDescOfHvdefn(exbind.Hdefn(), &pvardesc),
+ Error2);
+ pbindptr->lpvardesc = pvardesc;
+ goto CommonMatch;
+
+ case BKIND_FuncMatch:
+ IfErrGoTo(exbind.Ptdata()->GetFuncDescOfHfdefn(exbind.Hdefn(),
+ &pfuncdesc),
+ Error2);
+ // Note that if we actually bound to a function of a "pseudo-base"
+ // interface of a dispinterface then we have to pretend that
+ // the function is a disp function...
+ //
+ if (exbind.IsDispatch()) {
+ // Since the IsDispatch flag is only set in the funky
+ // dispinterface, we assert that the FUNCKIND is other
+ // than FUNC_DISPATCH.
+ //
+ // Convert this funcdesc from an Interface funcdesc to a
+ // Dispinterface funcdesc.
+ InterfaceFuncdescToDispatch(pfuncdesc);
+ }
+ pbindptr->lpfuncdesc = pfuncdesc;
+ *pdesckind = DESCKIND_FUNCDESC;
+ // fall through...
+
+CommonMatch:
+ // Get the typeinfo from the dfntbind, if we can, so we
+ // can determine if it's a funky dispinterface or not.
+ //
+
+ // if m_pdfntbind is not a GENPROJ_TYPEBIND, the QueryProtocol was already
+ // done, so don't re-do it
+ if (pdtbind == NULL)
+ pdtbind = (DYN_TYPEBIND *)m_pdfntbind->QueryProtocol(DYN_TYPEBIND::szProtocolName);
+
+ if (pdtbind != NULL) {
+ BOOL isFunky;
+ GEN_DTINFO *pgdtinfo = pdtbind->Pdtroot()->Pgdtinfo();
+
+ IfErrGoTo(::IsFunkyDispinterface(pgdtinfo, &isFunky), Error2);
+
+ // If it is funky, replace the exbind we return with the typeinfo
+ // for the current interface.
+ //
+ if (isFunky) {
+ *pptinfo = pgdtinfo;
+ pgdtinfo->AddRef();
+ exbind.Ptinfo()->Release();
+ break;
+ }
+ }
+
+ *pptinfo = exbind.Ptinfo(); // already addref'ed.
+ break;
+
+ case BKIND_DynTypeBindMatch:
+ case BKIND_ProjTypeBindMatch:
+ case BKIND_NestedTypeBindMatch:
+ pdfntbind = exbind.Pdfntbind();
+
+ DebAssert(pdfntbind != NULL, "bad DEFN_TYPEBIND.");
+
+ // Create a CDefnTypeComp to return to the user who must
+ // must release it eventually...
+ //
+ IfErrGoTo(CDefnTypeComp::Create(&pdfntcomp, pdfntbind), Error2);
+ pbindptr->lptcomp = pdfntcomp;
+ *pdesckind = DESCKIND_TYPECOMP;
+ *pptinfo = NULL;
+ break;
+
+ default:
+ DebHalt("bad BIND_KIND.");
+ break;
+ } // switch
+
+ goto Error;
+
+Error2:
+ exbind.Ptinfo()->Release();
+
+ // fall through
+Error:
+#if OE_WIN32
+ ConvertStringFree(szNameA);
+#else
+ #undef szNameA
+#endif //OE_WIN32
+ return HresultOfTiperr(err);
+}
+
+
+/***
+*PUBLIC CDefnTypeComp::BindType
+*Purpose:
+* Binds to a type identifier.
+* CONSIDER: share code with Bind -- ala BindIdDefn.
+*
+*Entry:
+* szName IN
+* lHashVal IN
+* pptinfo OUT - caller must release.
+* pptcomp OUT -- for now always NULL
+* will be non-NULL for nested types.. maybe...
+* Caller must release.
+*Exit:
+* None.
+*
+***********************************************************************/
+
+HRESULT CDefnTypeComp::BindType(LPOLESTR szName,
+ ULONG lHashVal,
+ ITypeInfoA FAR* FAR* pptinfo,
+ ITypeCompA FAR* FAR* pptcomp)
+{
+ EXBIND exbind;
+ BIND_KIND bkind;
+ DEFN_TYPEBIND *pdfntbind;
+ DYN_TYPEBIND *pdtbind;
+ GENPROJ_TYPEBIND *pgptbind;
+ NAMMGR *pnammgr;
+ HGNAM hgnam;
+ TIPERROR err;
+#if OE_WIN32
+ HRESULT hresult;
+ CHAR FAR *szNameA;
+#else //OE_WIN32
+ #define szNameA szName
+#endif //OE_WIN32
+
+ if (szName == NULL || pptinfo == NULL || pptcomp == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+#if OE_WIN32
+ IfOleErrRet(ConvertStringToA(szName, &szNameA));
+#endif //OE_WIN32
+
+ DebAssert(m_pdfntbind != NULL, "uninitialized.");
+
+ if ((pgptbind = (GENPROJ_TYPEBIND *)m_pdfntbind->
+ QueryProtocol(GENPROJ_TYPEBIND::szProtocolName)) != NULL) {
+ // Use the hashval.
+ IfErrGo(pgptbind->Pgtlibole()->GetNamMgr(&pnammgr));
+ IfErrGo(pnammgr->GetHgnamOfStrLhash(szNameA, lHashVal, &hgnam));
+ if (hgnam != HGNAM_Nil) {
+ IfErrGo(pgptbind->BindProjLevel(TRUE,
+ hgnam,
+ 0, // ignored
+ ACCESS_Public,
+ ACCESS_Public,
+ pgptbind->Compstate(),
+ &exbind));
+ }
+ }
+ else {
+ // Return no match otherwise
+ exbind.SetBindKind(BKIND_NoMatch);
+ }
+ bkind = exbind.BindKind();
+ switch (bkind) {
+ case BKIND_Error:
+ DebHalt("Should never happen.");
+ break;
+
+ case BKIND_NoMatch:
+ *pptinfo = NULL;
+ *pptcomp = NULL;
+ err = TIPERR_None;
+ break;
+
+ case BKIND_OneVarMatch:
+ case BKIND_FuncMatch:
+
+ DebHalt("Tried to bind to a type, but got a Var/Func");
+ break;
+
+ case BKIND_DynTypeBindMatch:
+ case BKIND_ProjTypeBindMatch:
+ pdfntbind = exbind.Pdfntbind();
+
+ DebAssert(pdfntbind != NULL, "bad DEFN_TYPEBIND.");
+
+ *pptcomp = NULL;
+ if (bkind == BKIND_DynTypeBindMatch) {
+ pdtbind = (DYN_TYPEBIND *)
+ pdfntbind->QueryProtocol(DYN_TYPEBIND::szProtocolName);
+ DebAssert(pdtbind != NULL, "should be DYN_TYPEBIND.");
+ *pptinfo = pdtbind->Pdtroot()->Pgdtinfo();
+ }
+ else if (bkind == BKIND_ProjTypeBindMatch) {
+ pgptbind = (GENPROJ_TYPEBIND *)
+ pdfntbind->QueryProtocol(GENPROJ_TYPEBIND::szProtocolName);
+ DebAssert(pgptbind != NULL, "should be GENPROJ_TYPEBIND.");
+ *pptinfo = NULL;
+ }
+ if (*pptinfo != NULL) {
+ (*pptinfo)->AddRef(); // caller must release
+ }
+ break;
+
+ default:
+ DebHalt("bad BIND_KIND.");
+ break;
+ } // switch
+
+Error:
+#if OE_WIN32
+ ConvertStringFree(szNameA);
+#endif //OE_WIN32
+ return HresultOfTiperr(err);
+}
diff --git a/private/oleauto/src/typelib/dfntcomp.hxx b/private/oleauto/src/typelib/dfntcomp.hxx
new file mode 100644
index 000000000..d2e212f94
--- /dev/null
+++ b/private/oleauto/src/typelib/dfntcomp.hxx
@@ -0,0 +1,92 @@
+/***
+*dfntcomp.hxx - TYPEINFO header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Implementation of ITypeComp for modules and classes.
+*
+*Revision History:
+*
+* 22-Jan-93 ilanc: Created.
+*
+*Implementation Notes:
+* Implemented by deferring to an instance of DEFN_TYPEBIND that
+* is produced for a record, module or project.
+*
+*****************************************************************************/
+
+#ifndef DFNTCOMP_HXX_INCLUDED
+#define DFNTCOMP_HXX_INCLUDED
+
+#include "cltypes.hxx"
+
+
+class DEFN_TYPEBIND;
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDFNTCOMP_HXX)
+#define SZ_FILE_NAME g_szDFNTCOMP_HXX
+#endif
+
+
+/***
+*class CDefnTypeComp - 'dfntcomp': Type comp implementation
+*Purpose:
+* This class implements the ITypeComp protocol.
+*
+***********************************************************************/
+
+class CDefnTypeComp : public ITypeCompA
+{
+public:
+
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
+ STDMETHOD_(ULONG,AddRef) (THIS);
+ STDMETHOD_(ULONG,Release) (THIS);
+
+ // Creation method
+ static TIPERROR Create(CDefnTypeComp **ppdfntcomp,
+ DEFN_TYPEBIND *pdfntbind);
+
+ // Overridden virtual methods
+ STDMETHOD(Bind)(THIS_ LPOLESTR szName,
+ ULONG lHashVal,
+ WORD wflags,
+ ITypeInfoA FAR* FAR* lplptinfo,
+ DESCKIND FAR* lpdesckind,
+ BINDPTRA FAR* lpbindptr);
+
+ STDMETHOD(BindType)(THIS_ LPOLESTR szName,
+ ULONG lHashVal,
+ ITypeInfoA FAR* FAR* lplptinfo,
+ ITypeCompA FAR* FAR* lplptcomp);
+
+ // ctor
+ CDefnTypeComp();
+
+ // dtor
+ virtual ~CDefnTypeComp();
+
+ // Accessor
+ DEFN_TYPEBIND *Pdfntbind() const;
+
+protected:
+ nonvirt TIPERROR Init(DEFN_TYPEBIND *pdfntbind);
+
+private:
+ DEFN_TYPEBIND *m_pdfntbind;
+ USHORT m_cRefs;
+};
+
+
+// inline accessor
+inline DEFN_TYPEBIND *CDefnTypeComp::Pdfntbind() const
+{
+ return m_pdfntbind;
+}
+
+
+#endif // DFNTCOMP_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dfstream.cxx b/private/oleauto/src/typelib/dfstream.cxx
new file mode 100644
index 000000000..df84ebec1
--- /dev/null
+++ b/private/oleauto/src/typelib/dfstream.cxx
@@ -0,0 +1,408 @@
+/***
+*dfstream.cxx - implementation of DOCFILE_STREAM
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Revision History:
+*
+* [00] 27-Jan-93 mikewo: Created.
+*
+*****************************************************************************/
+
+#define DFSTREAM_VTABLE
+
+#include "silver.hxx"
+#include "typelib.hxx"
+#include "dfstream.hxx"
+#include "gtlibole.hxx"
+
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleDfstreamCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleDfstreamCxx
+#else
+static char szDfstreamCxx[] = __FILE__;
+#define SZ_FILE_NAME szDfstreamCxx
+#endif
+#endif //ID_DEBUG
+
+
+#pragma code_seg(CS_INIT)
+TIPERROR DOCFILE_STREAM::Open(IStorageA **ppstg, IStorageA **ppstgContainer, GenericTypeLibOLE *pgtlibole, UINT hte, BOOL isHost, LPOLESTR szName, STREAM_OPEN_MODE som, STREAM **ppstrm)
+{
+ TIPERROR err;
+
+ IfErrRet(Open(ppstg, ppstgContainer, isHost, szName, som, ppstrm));
+
+ (*(DOCFILE_STREAM **)ppstrm)->m_pgtlibole = pgtlibole;
+ (*(DOCFILE_STREAM **)ppstrm)->m_hte = hte;
+ if (pgtlibole != NULL)
+ pgtlibole->Qte(hte)->m_pdfstrm = *(DOCFILE_STREAM **)ppstrm;
+
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+/***
+* Open - Opens a DOCFILE_STREAM in an IStorage.
+*
+* Purpose:
+* This is used to create a DOCFILE_STREAM instance by opening the
+* specified IStream (creating it if necessary) for the specified
+* permissions.
+*
+* Inputs:
+* *ppstg - The address of an m_pstg of the object requesting the stream.
+* This is released and set to NULL upon this STREAM's closure,
+* if that performs the final release of the IStorage.
+* *ppstgContainer - If NULL, this is ignored. Otherwise, it is the address
+* of *ppstg's container IStorage which also needs to be released.
+* szName - The name of the IStream within that IStorage.
+* som - The permissions with which to open the stream. May be one of:
+* SOM_Read - Open for reading only. The named stream must exist.
+* SOM_Write - Create for read/write. Destroys the data in any
+* existing stream of the same name.
+* SOM_Append - Open for read/write. The named stream must exist.
+*
+* Outputs:
+* *ppstrm is set to the new STREAM and TIPERR_None is returned if
+* successful.
+*
+* *ppstrm is not modified on failure.
+*
+* On failure, *ppstg and *ppstgContainer are released and set to NULL if
+* that was the final release.
+**************************************************************************/
+#pragma code_seg( CS_INIT )
+TIPERROR DOCFILE_STREAM::Open(IStorageA **ppstg, IStorageA **ppstgContainer, BOOL isHost, LPOLESTR szName, STREAM_OPEN_MODE som, STREAM **ppstrm)
+{
+ HRESULT hresult;
+ DWORD stgm;
+ DOCFILE_STREAM *pdfstrm;
+ TIPERROR err;
+
+ if ((pdfstrm = MemNew(DOCFILE_STREAM)) == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ ::new (pdfstrm) DOCFILE_STREAM;
+
+ // Determine the stgm mode constant that corresponds to som's value.
+ switch (som) {
+ case SOM_Read:
+ stgm = STGM_READ | STGM_SHARE_EXCLUSIVE;
+ break;
+
+ case SOM_Write:
+ stgm = STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE;
+ break;
+
+ case SOM_Append:
+ stgm = STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
+ break;
+#if ID_DEBUG
+ default:
+ DebHalt("unsupported som");
+#endif //ID_DEBUG
+ }
+
+ // If SOM_Write, create the stream.
+ if (som == SOM_Write)
+ hresult = (*ppstg)->CreateStream(szName, stgm, 0L, 0L, &pdfstrm->m_pistrm);
+
+ // Otherwise, open the stream.
+ else
+ hresult = (*ppstg)->OpenStream(szName, NULL, stgm, 0L, &pdfstrm->m_pistrm);
+
+ if (hresult != NOERROR) {
+ pdfstrm->Release();
+ err = TiperrOfHresult(hresult);
+ goto Error;
+ }
+
+ pdfstrm->m_ppstg = ppstg;
+ pdfstrm->m_ppstgContainer = ppstgContainer;
+ pdfstrm->m_isHost = isHost;
+
+ *ppstrm = pdfstrm;
+ return TIPERR_None;
+
+Error:
+ if (!(*ppstg)->Release())
+ *ppstg = NULL;
+ if (ppstgContainer != NULL && *ppstgContainer != NULL
+ && !(*ppstgContainer)->Release())
+ *ppstgContainer = NULL;
+ return err;
+}
+#pragma code_seg()
+
+
+
+#pragma code_seg(CS_INIT)
+DOCFILE_STREAM::DOCFILE_STREAM()
+{
+ m_pistrm = NULL;
+ m_ppstg = NULL;
+ m_cbReadBufferLeft = 0;
+ m_cbWriteBufferLeft = sizeof(m_rgbIOBuffer);
+ m_pbBuffer = m_rgbIOBuffer;
+ m_isHost = FALSE;
+ m_dontRelease = FALSE;
+ m_cRefs = 1;
+ m_pgtlibole = NULL;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+DOCFILE_STREAM::~DOCFILE_STREAM()
+{
+ // Do nothing
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+TIPERROR DOCFILE_STREAM::Read(VOID *buffer, ULONG cbSize)
+{
+ BYTE HUGE *hpb = (BYTE HUGE *)buffer;
+ TIPERROR err;
+
+ // Do nothing if nothing is requested.
+ if (cbSize == 0)
+ return TIPERR_None;
+
+ DebAssert(m_cbWriteBufferLeft == sizeof(m_rgbIOBuffer) || m_cbReadBufferLeft == 0, "Read");
+
+ // Empty the I/O buffer into the output buffer and refill it
+ // until the I/O buffer holds enough to finish the requested read.
+ while ((ULONG)m_cbReadBufferLeft < cbSize) {
+ memcpy(hpb, (BYTE HUGE *)m_pbBuffer, m_cbReadBufferLeft);
+ cbSize -= (ULONG)m_cbReadBufferLeft;
+ hpb += m_cbReadBufferLeft;
+ IfErrRet(FillBuffer());
+ }
+
+#if OE_WIN16
+ DebAssert(cbSize <= (ULONG)(USHORT)USHRT_MAX, "whoops! overflow.");
+#endif // VBA2 && OE_WIN16
+
+ // Finish the requested read.
+ memcpy(hpb, (BYTE HUGE *)m_pbBuffer, (UINT)cbSize);
+ m_cbReadBufferLeft -= (UINT)cbSize;
+ m_pbBuffer += (UINT)cbSize;
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+TIPERROR DOCFILE_STREAM::Write(const VOID *buffer, ULONG cbSize)
+{
+ BYTE HUGE *hpb = (BYTE HUGE *)buffer;
+ TIPERROR err;
+
+ DebAssert(m_cbWriteBufferLeft == sizeof(m_rgbIOBuffer) || m_cbReadBufferLeft == 0, "Write");
+
+ // Fill the I/O buffer into the output buffer and flush it
+ // until the I/O is more than big enough to finish the requested
+ // write.
+ while ((ULONG)m_cbWriteBufferLeft <= cbSize) {
+ memcpy((BYTE HUGE *)m_pbBuffer, hpb, m_cbWriteBufferLeft);
+ cbSize -= (ULONG)m_cbWriteBufferLeft;
+ hpb += m_cbWriteBufferLeft;
+ m_cbWriteBufferLeft = 0;
+ IfErrRet(FlushBuffer());
+ }
+ // Finish the requested write. Note that this is guaranteed to
+ // not completely fill the I/O buffer. This important so that
+ // we don't get the situation of a full, but unflushed buffer
+ // (which would be indistinguishable from an empty but unfilled
+ // buffer).
+ //
+#if OE_WIN16
+ DebAssert(cbSize <= (ULONG)(USHORT)USHRT_MAX, "whoops! overflow.");
+#endif // VBA2 && OE_WIN16
+
+ memcpy((BYTE HUGE *)m_pbBuffer, hpb, (UINT)cbSize);
+ m_cbWriteBufferLeft -= (UINT)cbSize;
+ DebAssert(m_cbWriteBufferLeft > 0, "Read");
+ m_pbBuffer += (UINT)cbSize;
+ m_cbReadBufferLeft = 0;
+ return TIPERR_None;
+}
+
+
+#pragma code_seg(CS_INIT)
+TIPERROR DOCFILE_STREAM::ReadTextLine(XSZ szLine, UINT cchMax)
+{
+ DebHalt("Not implemented");
+ return HresultOfScode(E_NOTIMPL);
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_INIT)
+TIPERROR DOCFILE_STREAM::FillBuffer()
+{
+ ULONG cb;
+ HRESULT hresult;
+ TIPERROR err;
+
+ DebAssert(m_cbWriteBufferLeft == sizeof(m_rgbIOBuffer) || m_cbReadBufferLeft == 0, "FillBuffer");
+
+ // If we have something in the write buffer at this time, flush it.
+ if (m_cbWriteBufferLeft != sizeof(m_rgbIOBuffer)) {
+ IfErrRet(FlushBuffer());
+ }
+
+ // Set things up to indicate we're using the I/O buffer as a read buffer.
+ m_cbWriteBufferLeft = sizeof(m_rgbIOBuffer);
+
+ // Fill the I/O buffer.
+ hresult = m_pistrm->Read(m_rgbIOBuffer, sizeof(m_rgbIOBuffer), &cb);
+
+ if (hresult != NOERROR)
+ return TiperrOfHresult(hresult);
+
+ // If we obtained no bytes at all from the read, return EOF.
+ if (cb == 0)
+ return TIPERR_Eof;
+
+ // Otherwise, record the number of bytes placed into the buffer.
+ m_cbReadBufferLeft = (UINT)cb;
+ m_pbBuffer = m_rgbIOBuffer;
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+TIPERROR DOCFILE_STREAM::FlushBuffer()
+{
+ ULONG cb, cbWritten;
+ HRESULT hresult;
+
+ DebAssert(m_cbWriteBufferLeft == sizeof(m_rgbIOBuffer) || m_cbReadBufferLeft == 0, "FlushBuffer");
+
+ // Set things up to indicate we're using the I/O buffer as a write buffer.
+ m_cbReadBufferLeft = 0;
+
+ cb = sizeof(m_rgbIOBuffer)-m_cbWriteBufferLeft;
+
+ // Perform the write only if the write buffer isn't empty.
+ if (cb != 0) {
+ hresult = m_pistrm->Write(m_rgbIOBuffer, cb, &cbWritten);
+
+ if (GetScode(hresult) == STG_E_REVERTED || cb != cbWritten)
+ return TIPERR_WriteFault;
+
+ if (hresult != NOERROR)
+ return TiperrOfHresult(hresult);
+ }
+
+ m_pbBuffer = m_rgbIOBuffer;
+ m_cbWriteBufferLeft = sizeof(m_rgbIOBuffer);
+ return TIPERR_None;
+}
+
+#pragma code_seg(CS_INIT)
+TIPERROR DOCFILE_STREAM::GetPos(LONG *plPos)
+{
+ HRESULT hresult;
+ LARGE_INTEGER li;
+ ULARGE_INTEGER uli;
+
+ LISet32(li, 0L);
+ hresult = m_pistrm->Seek(li, STREAM_SEEK_CUR, &uli);
+ DebAssert(hresult == NOERROR, "GetPos");
+ *plPos = (LONG)uli.LowPart;
+
+ DebAssert(m_cbWriteBufferLeft == sizeof(m_rgbIOBuffer) || m_cbReadBufferLeft == 0, "Read");
+
+ // If the I/O buffer holds read bytes, subtract the number of
+ // as-yet-unused bytes in the I/O buffer from the file offset.
+ // If the I/O buffer holds written bytes, add the number of
+ // bytes placed in the I/O buffer but not yet flushed.
+ *plPos += (INT)(sizeof(m_rgbIOBuffer)-m_cbWriteBufferLeft-m_cbReadBufferLeft);
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#pragma code_seg( CS_CORE )
+TIPERROR DOCFILE_STREAM::SetPos(LONG lPos)
+{
+ HRESULT hresult;
+ LARGE_INTEGER li;
+ TIPERROR err;
+
+ // Flush the write buffer if there's anything in it.
+ if (m_cbWriteBufferLeft != sizeof(m_rgbIOBuffer)) {
+ IfErrRet(FlushBuffer());
+ }
+
+ // In any case, reset the I/O buffer to be empty.
+ m_cbReadBufferLeft = 0;
+ m_cbWriteBufferLeft = sizeof(m_rgbIOBuffer);
+ m_pbBuffer = m_rgbIOBuffer;
+
+ LISet32(li, lPos);
+ hresult = m_pistrm->Seek(li, STREAM_SEEK_SET, NULL);
+ DebAssert(hresult == NOERROR, "SetPos");
+
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+#pragma code_seg( CS_INIT )
+void DOCFILE_STREAM::AddRef()
+{
+ m_cRefs++;
+}
+#pragma code_seg( )
+
+#pragma code_seg(CS_INIT)
+TIPERROR DOCFILE_STREAM::Release()
+{
+ TIPERROR err = TIPERR_None;
+
+ if (--m_cRefs != 0)
+ return TIPERR_None;
+
+ if (m_pgtlibole != NULL) {
+ m_pgtlibole->Qte(m_hte)->m_pdfstrm = NULL;
+ }
+
+ // Flush the write buffer if there's anything in it.
+ if (m_cbWriteBufferLeft != sizeof(m_rgbIOBuffer)) {
+ err = FlushBuffer();
+ }
+
+ if (m_pistrm != NULL) {
+ m_pistrm->Release();
+ }
+
+ if (m_ppstg != NULL) {
+ if (!(*m_ppstg)->Release())
+ *m_ppstg = NULL;
+ if (m_ppstgContainer != NULL && *m_ppstgContainer != NULL
+ && !(*m_ppstgContainer)->Release())
+ *m_ppstgContainer = NULL;
+ }
+
+ // Only delete this instance if m_dontRelease is FALSE. m_dontRelease
+ // will only be TRUE when created with the NewWrapper method.
+ if (!m_dontRelease) {
+ this->DOCFILE_STREAM::~DOCFILE_STREAM();
+ MemFree(this);
+ }
+
+
+ return err;
+}
+
+#pragma code_seg()
diff --git a/private/oleauto/src/typelib/dfstream.hxx b/private/oleauto/src/typelib/dfstream.hxx
new file mode 100644
index 000000000..7e5581e35
--- /dev/null
+++ b/private/oleauto/src/typelib/dfstream.hxx
@@ -0,0 +1,77 @@
+/***
+*dfstream.hxx - declaration of DOCFILE_STREAM
+*
+* Copyright (C) 1990, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* To provide a wrapper on IStream.
+*
+*****************************************************************************/
+
+#ifndef DFSTREAM_HXX_INCLUDED
+#define DFSTREAM_HXX_INCLUDED
+
+#include "stream.hxx"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDFSTREAM_HXX)
+#define SZ_FILE_NAME g_szDFSTREAM_HXX
+#endif
+
+
+class GenericTypeLibOLE;
+
+/***
+*class DOCFILE_STREAM : DOCFILE implementation of Stream protocol.
+*Purpose:
+* Implementation of the STREAM protocol using OLE DOCFILE streams.
+*
+***********************************************************************/
+
+class DOCFILE_STREAM : public STREAM
+{
+public:
+ static TIPERROR Open(IStorageA **ppstg, IStorageA **ppstgContainer, GenericTypeLibOLE *pgtlibole, UINT hte, BOOL isHost, LPOLESTR szName, STREAM_OPEN_MODE som, STREAM **ppstrm);
+ static TIPERROR Open(IStorageA **ppstg, IStorageA **ppstgContainer, BOOL isHost, LPOLESTR szName, STREAM_OPEN_MODE som, STREAM **ppstrm);
+
+ static TIPERROR NewWrapper(DOCFILE_STREAM **ppdfstrm, BOOL fDontRelease);
+
+ nonvirt void InitWrapper(IStorageA **ppstg, IStorageA **ppstgContainer, IStreamA *pistrm, BOOL isHost);
+ nonvirt void FreeWrapper();
+ nonvirt void AddRef();
+
+ virtual TIPERROR Read(VOID *buffer, ULONG cbsize);
+ virtual TIPERROR Write(const VOID *buffer, ULONG cbsize);
+ virtual TIPERROR ReadTextLine(XSZ szLine, UINT cchMax);
+ virtual TIPERROR GetPos(LONG *plPos);
+ virtual TIPERROR SetPos(LONG lPos);
+ virtual TIPERROR Release();
+
+protected:
+ IStorageA **m_ppstg, **m_ppstgContainer;
+ GenericTypeLibOLE *m_pgtlibole;
+ UINT m_hte;
+ IStreamA *m_pistrm;
+ UINT m_cRefs;
+ BOOL m_isHost;
+ BOOL m_dontRelease;
+ UINT m_cbReadBufferLeft;
+ UINT m_cbWriteBufferLeft;
+ BYTE *m_pbBuffer;
+ BYTE m_rgbIOBuffer[512];
+
+ nonvirt TIPERROR FillBuffer();
+ nonvirt TIPERROR FlushBuffer();
+ ~DOCFILE_STREAM(); // Included so clients can't use delete on a stream
+ DOCFILE_STREAM(); // Included to avoid warning
+
+
+#ifdef DFSTREAM_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+#endif // !DFSTREAM_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dstrmgr.cxx b/private/oleauto/src/typelib/dstrmgr.cxx
new file mode 100644
index 000000000..d9f510b27
--- /dev/null
+++ b/private/oleauto/src/typelib/dstrmgr.cxx
@@ -0,0 +1,1692 @@
+/***
+*dstrmg.cxx - Doc string manager.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The Doc, String Manager handles all the help strings in the typelib.
+* In this implementation we huffman encode all the words.
+*
+*Implementation Notes: Steps:
+* 1. Parse all the Doc strings that are passed in and return a handle to the
+* client. This handle is used latter to get the encoded doc string by calling
+* GetEncodedDocStrOfHst(). Note that the encoded doc string is serialized in
+* TYPE_DATA's block manager.
+* 2. Each word of the string hashed and a frequency count is maintained in
+* WORD_ENTRY for that word.
+* 3. For each passed in string cache a SEMI_ENCODED_STRING that
+* represents the original string.
+* 4. When all the strings are parsed Doc string sorts all the WORD ENTRY
+* according to the Frequency using QuickSort.
+* 5. Form a forest of Huffman trees (one of each WORD_ENTRY). (maitain the
+* sorted order)
+* 6. Create a huffman tree using the sub trees with the least frequency.
+* Insert the new tree in the sorted list (using Insert sort).
+* 7. Repeat 6 to create the HUFFMAN TREE.
+*
+*
+*Revision History:
+*
+* 18-July-93 rajivk: Created.
+*
+*Implementation Notes:
+*
+*
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "typelib.hxx"
+#include <stddef.h>
+#include "xstring.h"
+#include <stdlib.h>
+#include <new.h>
+#include "typelib.hxx"
+#include "cltypes.hxx"
+#include "stream.hxx"
+#include "blkmgr.hxx"
+#include "dstrmgr.hxx"
+#include "clutil.hxx"
+#include "tls.h"
+
+#pragma hdrstop(RTPCHNAME)
+
+#undef tolower
+#undef toupper // Don't use unsafe macro forms
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+char szDSTRMgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szDSTRMgrCxx
+#endif
+
+#if ID_DEBUG
+const ULONG UL_MASK = 0xff800000;
+#endif
+
+
+const XCHAR xchNull = '\0';
+
+#define MAX_ENCODING_ALLOWED 64
+
+#define DS_cStrTableInit 256 // initial assumed # of strings
+#define DS_cStrTableGrow 512 // # of string we grow by
+
+const XCHAR xchSpace = ' ';
+
+
+// ____________________________
+// |1| BYTE ..... |8| ------> .... ---->
+// ----------------------------
+// ^ ^
+// 1st bit 8th bit
+
+
+#define FIRST_BIT 0x80
+#define SECOND_BIT 0x40
+#define THIRD_BIT 0x20
+#define FOURTH_BIT 0x10
+#define FIFTH_BIT 0x08
+#define SIXTH_BIT 0x04
+#define SEVENTH_BIT 0x02
+#define EIGHTH_BIT 0x01
+
+#define Get1stBit(b) (b & FIRST_BIT)
+#define Get2ndBit(b) (b & SECOND_BIT)
+#define Get3rdBit(b) (b & THIRD_BIT)
+#define Get4thBit(b) (b & FOURTH_BIT)
+#define Get5thBit(b) (b & FIFTH_BIT)
+#define Get6thBit(b) (b & SIXTH_BIT)
+#define Get7thBit(b) (b & SEVENTH_BIT)
+#define Get8thBit(b) (b & EIGHTH_BIT)
+
+#define Set1stBit(b,v) b = (v) ? (b | FIRST_BIT) : (b & ~FIRST_BIT)
+#define Set2ndBit(b,v) b = (v) ? (b | SECOND_BIT) : (b & ~SECOND_BIT)
+#define Set3rdBit(b,v) b = (v) ? (b | THIRD_BIT) : (b & ~THIRD_BIT)
+#define Set4thBit(b,v) b = (v) ? (b | FOURTH_BIT) : (b & ~FOURTH_BIT)
+#define Set5thBit(b,v) b = (v) ? (b | FIFTH_BIT) : (b & ~FIFTH_BIT)
+#define Set6thBit(b,v) b = (v) ? (b | SIXTH_BIT) : (b & ~SIXTH_BIT)
+#define Set7thBit(b,v) b = (v) ? (b | SEVENTH_BIT) : (b & ~SEVENTH_BIT)
+#define Set8thBit(b,v) b = (v) ? (b | EIGHTH_BIT) : (b & ~EIGHTH_BIT)
+
+VOID ZeroFill(VOID HUGE * pv, ULONG ubSize);
+
+/***
+*PUBLIC DOCSTR_MGR::DOCSTR_MGR - constructor
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+DOCSTR_MGR::DOCSTR_MGR()
+{
+
+ m_uStrCount = 0;
+ m_uMaxStrCount = 0;
+ m_uWordCount = 0;
+ m_ulCmptSizeOfTree = 0;
+ m_ulCurrentOffset = 0;
+ m_usMaxStrLen = 0;
+ m_pvHuffmanCmpt = NULL;
+ m_phtmRoot = NULL;
+ m_uWordCount = 0;
+ m_ppsesHelpStr = NULL;
+ m_ppweHashTbl = NULL;
+
+
+#if ID_DEBUG
+ m_uDebTotalStrSize = 0;
+ m_uDebTotalEncodedStrSize = 0;
+ m_uDebTotalWord = 0;
+#endif
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DOCSTR_MGR::~DOCSTR_MGR - destructor
+*Purpose:
+* Releases the resources owned by the docstrmgr.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+DOCSTR_MGR::~DOCSTR_MGR()
+{
+ UINT i;
+ SEMI_ENCODED_STRING *pses;
+ IMalloc *pmalloc = Pmalloc();
+
+
+ // release the table allocate for the hash table;
+ if (m_ppweHashTbl != NULL) {
+
+ pmalloc->Free(m_ppweHashTbl);
+ }
+
+ // release the table allocate for the strings;
+ if (m_ppsesHelpStr != NULL) {
+ // Walk the table and release all the
+ for (i = 0; i < m_uStrCount; i++) {
+ if ((pses = m_ppsesHelpStr[i]) != NULL) {
+ if (pses->m_ppweStrTbl)
+ pmalloc->Free(pses->m_ppweStrTbl);
+
+
+ pmalloc->Free(pses);
+
+ } //if
+ } //for
+
+ pmalloc->Free(m_ppsesHelpStr);
+ }
+
+ // release the table allocate for the huffman tree
+ if (m_pvHuffmanCmpt != NULL) {
+ pmalloc->Free(m_pvHuffmanCmpt);
+ }
+
+ if (m_uStrCount) {
+ if (m_phtmRoot != NULL)
+ ReleaseHuffmanTree(m_phtmRoot);
+ }
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DOCSTR_MGR::Init - initialize the help manager
+*Purpose:
+* Initializes the doc string manager. Allocates space for the HASH TABLE
+* and the initial space for storing the SEMI_ENCODED strings that are
+* passed in.
+*
+*
+*Entry:
+*
+*Exit:
+* Return TIPERROR indicating success/failure.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR DOCSTR_MGR::Init()
+{
+ TIPERROR err=TIPERR_None;
+
+
+ m_uMaxStrCount = DS_cStrTableInit;
+
+ // initialize the help string array for DS_cStrTableInit entries. We
+ // reallocate more entries as required (this is done in ParseString() ).
+ if ((m_ppsesHelpStr = (SEMI_ENCODED_STRING **)
+ Pmalloc()->Alloc(m_uMaxStrCount*sizeof(SEMI_ENCODED_STRING*))) == NULL) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // initilize the memory to 0
+ ZeroFill(m_ppsesHelpStr, m_uMaxStrCount*sizeof(SEMI_ENCODED_STRING*));
+
+ // initialize the bucket table.
+ if ((m_ppweHashTbl = (WORD_ENTRY **) Pmalloc()->Alloc(DS_cBuckets*sizeof(WORD_ENTRY *))) == NULL)
+ return TIPERR_OutOfMemory;
+
+ // initilize the memory to 0
+ ZeroFill(m_ppweHashTbl, DS_cBuckets*sizeof(WORD_ENTRY *));
+
+ return err;
+
+}
+#pragma code_seg()
+
+/***
+*PUBLIC DOCSTR_MGR::Read
+*Purpose:
+* Reads the serialized doc string Manager. This function also releases
+* the resources that will not be required since we are reading the
+* serialized doc string manager.
+*
+*IMPLEMENTATION Notes:- Since the huffman tree that is serialized could be
+* bigger than 64K and the Stream cannot Read/Write > 64K, we break up the
+* tree into chunks of 32K each.
+*Entry:
+* psstream : Pointer to the STREAM to read from.
+*
+*
+*Exit:
+** TIPERROR
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::Read(STREAM *pstrm)
+{
+ TIPERROR err;
+ USHORT uSizeToRead = 0xffff;
+ LONG lSizeRemaining;
+ VOID HUGE *pv;
+
+ DebAssert(m_usMaxStrLen == 0 &&
+ m_ulCmptSizeOfTree == 0 &&
+ m_phtmRoot == NULL &&
+ m_pvHuffmanCmpt == NULL, " Dstrmgr not initialized ");
+
+ // Write out the maximum size of the string that was compacted.
+ IfErrRet(pstrm->ReadUShort(&m_usMaxStrLen));
+
+ // Read the size of the huffman tree.
+ IfErrRet(pstrm->ReadULong(&m_ulCmptSizeOfTree));
+
+ if (m_ulCmptSizeOfTree > 0) {
+
+ // Allocate space for reading the huffman tree.
+ if ((m_pvHuffmanCmpt = (VOID HUGE *) Pmalloc()->Alloc((size_t)m_ulCmptSizeOfTree)) == NULL) {
+ // in case of error release the memory allocated so far.
+ return TIPERR_OutOfMemory;
+ }
+
+
+ lSizeRemaining = (LONG) m_ulCmptSizeOfTree;
+ pv = m_pvHuffmanCmpt;
+
+ while (lSizeRemaining > 0) {
+ uSizeToRead =(USHORT) ((lSizeRemaining > 0xffff) ? 0xffff : lSizeRemaining);
+
+ // serialize the huffman tree as a stream of bytes.
+ IfErrRet(pstrm->Read((VOID *)pv, uSizeToRead));
+
+ pv = (BYTE *)pv + uSizeToRead;
+ lSizeRemaining -= uSizeToRead;
+ }
+ }
+
+
+ // since we are reading the serialized doc string manager we will not
+ // build it.
+ // so release the table allocate for the hash table;
+ if (m_ppweHashTbl != NULL) {
+ Pmalloc()->Free(m_ppweHashTbl);
+ m_ppweHashTbl = NULL;
+ }
+
+ // release the table allocate for the strings;
+ if (m_ppsesHelpStr != NULL) {
+ Pmalloc()->Free(m_ppsesHelpStr);
+ m_ppsesHelpStr = NULL;
+ }
+
+
+ return TIPERR_None;
+}
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::Write
+*Purpose:
+* Serializes doc string Manager
+*
+*IMPLEMENTATION Notes:- Since the huffman tree that is serialized could be
+* bigger than 64K and the Stream cannot Read/Write > 64K, we break up the
+* tree into chunks of 32K each.
+*Entry:
+* psstream : Pointer to the STREAM to write to.
+*
+*
+*Exit:
+** TIPERROR
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::Write(STREAM *pstrm)
+{
+ TIPERROR err;
+ USHORT uSizeToWrite = 0xffff;
+ LONG lSizeRemaining;
+ VOID HUGE *pv;
+
+ // Write out the maximum size of the string that was compacted.
+ IfErrRet(pstrm->WriteUShort(m_usMaxStrLen));
+
+ // Write out the size of the huffman tree.
+ IfErrRet(pstrm->WriteULong(m_ulCmptSizeOfTree));
+
+ // do not write the tree if there was no helpstring.
+ if (m_ulCmptSizeOfTree > 0) {
+
+ lSizeRemaining = (LONG) m_ulCmptSizeOfTree;
+ pv = m_pvHuffmanCmpt;
+
+ while (lSizeRemaining > 0) {
+ uSizeToWrite = (USHORT) ((lSizeRemaining > 0xffff) ? 0xffff : lSizeRemaining);
+
+ // serialize the huffman tree as a stream of bytes.
+ IfErrRet(pstrm->Write((VOID *)pv, uSizeToWrite));
+
+ pv = (BYTE *)pv + uSizeToWrite;
+ lSizeRemaining -= uSizeToWrite;
+ }
+
+ DebAssert(lSizeRemaining == 0, " write failed ");
+
+ }
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::ParseString
+*Purpose:
+* Parse a string. Returns an array of words that forms the string. We
+* ignore the irst blank. Starting from the 2nd space till the end of the
+* next word forms a word.
+* e.g. "This is an example string" will get prased as following 5 words.
+* 1st word "This"
+* 2nd word "is"
+* 3rd word " a"
+* 4th word " sample"
+* 5th word " string"
+*
+*Entry:
+* szStr : string to parse.
+*
+*
+*Exit:
+* rglstr : array of strings containging the words that forms szStr.
+* uWordCount : size of the array rglstr;
+*
+***********************************************************************/
+
+TIPERROR DOCSTR_MGR::ParseString(XSZ_CONST szStr, BSTRA **lplpbstr, UINT *puWordCount)
+{
+ UINT uLen=0;
+ XSZ_CONST szWordStart;
+ TIPERROR err=TIPERR_None;
+ UINT uchWordLen=0;
+ UINT uWordMax=0;
+ UINT i;
+ UINT uStrLen;
+ BSTRA *lpbstrNew;
+
+ DebAssert(lplpbstr != NULL && puWordCount != NULL, " invalid parameter ");
+
+ *puWordCount=0;
+ *lplpbstr = NULL;
+
+ // if the passed in string is NULL then return
+ if (szStr == NULL)
+ return TIPERR_None;
+
+ // save the max str length
+ uStrLen = strlen(szStr) + 1;
+
+ if (uStrLen > m_usMaxStrLen)
+ m_usMaxStrLen = uStrLen;
+
+#if ID_DEBUG
+ m_uDebTotalStrSize += uStrLen;
+#endif
+
+ // extract all the words out of the string. We terminate when
+ // we get a null word.
+ for (;;) {
+
+ uchWordLen = 0;
+
+ // Remove the first space if it is not the beginning of the Doc Str
+ //
+ if ((*szStr == xchSpace) && *puWordCount)
+ szStr++;
+
+ // mark the begining of the next word.
+ szWordStart = szStr;
+
+ // Check if we have reached the end of the string
+ if (*szStr == xchNull) {
+ uchWordLen = 1;
+ }
+
+ // space preceeding the word becomes part of the next word.
+ while(*szStr == xchSpace) {
+ uchWordLen++;
+ szStr++;
+ }
+
+
+ // if we have not reached the end of the string then extract the
+ // word out of the string.
+ if (*szStr != xchNull) {
+ while ((*szStr != xchSpace) && (*szStr != xchNull)) {
+ uchWordLen++;
+ szStr++;
+ }
+ }
+ else {
+ // throw away the trailing blank characters.
+ // Go for the next iteration
+ if (*szWordStart != xchNull) {
+ continue;
+ }
+ }
+
+#define CWORDSGROW 8 // # of words to grow by -- should be a
+ // multiple of 4 so that CWORDSGROW * sizeof(BSTRA)
+ // is an multiple of a paragraph
+ // if we do not have any empty entry in rglstr then allocate more space.
+ if (uWordMax == *puWordCount) {
+ if ((lpbstrNew = (BSTRA *)Pmalloc()->Realloc(*lplpbstr,
+ (uWordMax+CWORDSGROW)*sizeof(BSTRA)))==NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ *lplpbstr = lpbstrNew;
+ uWordMax += CWORDSGROW;
+ }
+
+ if (((*lplpbstr)[*puWordCount] = AllocBstrLenA((LPSTR)szWordStart, uchWordLen)) == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ // inc the count of words
+ *puWordCount += 1;
+
+ // break out if we have reached the end of the string.
+ if (*szWordStart == xchNull)
+ break;
+
+
+ } // for
+
+#if ID_DEBUG
+ m_uDebTotalWord += *puWordCount;
+#endif
+
+ return err;
+Error:
+ if (lplpbstr != NULL) {
+ for (i=0; i < *puWordCount; i++) {
+ DebAssert((*lplpbstr)[i] != NULL, " should not be null ");
+ FreeBstrA((*lplpbstr)[i]);
+ }
+ Pmalloc()->Free(*lplpbstr);
+ }
+
+ return err;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::AddWord
+*Purpose:
+* Add a word to the hash table and bump the reference count of the word.
+*
+*Entry:
+* szWord : Word to Add.
+*
+*
+*Exit:
+* pwe : pointer to the word entry structure for the word(szWord) passed in.
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::AddWord(BSTRA bstrWord, WORD_ENTRY **ppwe)
+{
+ TIPERROR err;
+ ULONG lHash=0;
+ WORD_ENTRY *pwe;
+ UINT uIndex=0;
+
+ lHash = LHashValOfNameA(0x0000, (LPSTR)bstrWord);
+
+ // get the corresponding index in the hash table for whash.
+ uIndex = IndexOfHash(lHash);
+
+ pwe = *(m_ppweHashTbl+uIndex);
+
+ // walk the link list and see if the word is in the list.
+ while (pwe != NULL) {
+ // does this entry contain the word we are looking for
+ if (!strcmp(bstrWord, pwe->m_bstrWord)) {
+ pwe->m_uFreq++;
+ *ppwe = pwe;
+ break;
+ } // if
+ // get the next Word Entry
+ pwe = pwe->m_pweNext;
+
+ } // while
+
+
+ // if the word does not appear in the table then add a new entry.
+ if (pwe == NULL)
+ IfErrRet(AddNewWord(bstrWord, ppwe));
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::AddNewWord
+*Purpose:
+* Add a new entry for the word passed in. Return a pointer to the Word_Entry
+* that got added.
+*
+*Entry:
+* szWord : Word for which a new WORD_ENTRY needs to be added.
+*
+*
+*Exit:
+* pwe : pointer to the word entry structure for the word(szWord) passed in.
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::AddNewWord(BSTRA bstrWord, WORD_ENTRY **ppwe)
+{
+ ULONG lHash=0;
+ WORD_ENTRY *pwe=NULL;
+ UINT uIndex=0;
+
+
+ lHash = LHashValOfNameA(0x0000, (LPSTR)bstrWord);
+
+ // Allocate a new WORD_ENTRY structure for this word.
+ if ((pwe = (WORD_ENTRY *)Pmalloc()->Alloc(sizeof(WORD_ENTRY))) == NULL)
+ return TIPERR_OutOfMemory;
+
+ // initilize the memory to 0
+ ZeroFill(pwe, sizeof(WORD_ENTRY));
+
+ // initialize the structure
+ pwe->m_uFreq = 1;
+ pwe->m_bstrWord = AllocBstrA(bstrWord);
+
+ uIndex = IndexOfHash(lHash);
+
+ // link this node in the hash table.
+ pwe->m_pweNext = *(m_ppweHashTbl+uIndex);
+ *(m_ppweHashTbl+uIndex) = pwe;
+
+ // bump up the count of the words.
+ m_uWordCount++;
+
+ // set the return parameter
+ *ppwe = pwe;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::GetHstOfHelpString
+*Purpose:
+* This function process a doc string(text form). It returns a handle
+* for the string. This handle is a temporary handle. After all the
+* string is processed we visit all the funcdefn and replaced this
+* handle by hchunk in the TYPE_DATA's blockmgr.
+*
+*Entry:
+* szDocStr : DocString that needs to be encoded.
+*
+*
+*Exit:
+* HST : handle for the doc string.
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::GetHstOfHelpString(XSZ_CONST szDocStr, HST *phst)
+{
+
+ TIPERROR err=TIPERR_None;
+ UINT uWords, i;
+ BSTRA *lpbstr;
+ SEMI_ENCODED_STRING *ses;
+ SEMI_ENCODED_STRING **ppsesHelpStrNew;
+ WORD_ENTRY *pwe;
+
+ DebAssert(szDocStr != NULL && phst != NULL, " invalid parameter ");
+
+ // if we do not have any empty entry for any string then allocate.
+ //
+ if (m_uMaxStrCount == m_uStrCount) {
+
+ m_uMaxStrCount += DS_cStrTableGrow;
+
+ if ((ppsesHelpStrNew = (SEMI_ENCODED_STRING **)
+ Pmalloc()->Realloc(m_ppsesHelpStr, m_uMaxStrCount*sizeof(SEMI_ENCODED_STRING*))) == NULL) {
+
+ m_uMaxStrCount -= DS_cStrTableGrow;
+ return TIPERR_OutOfMemory;
+ }
+ m_ppsesHelpStr = ppsesHelpStrNew;
+
+ }
+
+
+ // Parse the string.
+ IfErrRet(ParseString(szDocStr, &lpbstr, &uWords));
+
+ // allcate space for (semi) encoding the string.
+ if ((ses = (SEMI_ENCODED_STRING *)
+ Pmalloc()->Alloc(sizeof(SEMI_ENCODED_STRING))) == NULL) {
+
+ return TIPERR_OutOfMemory;
+ }
+
+ // initilize the memory to 0
+ ZeroFill(ses, sizeof(SEMI_ENCODED_STRING));
+
+ // allocate space for saving pointers to WORD_ENTRY for each word in the
+ // doc string.
+ if ((ses->m_ppweStrTbl = (WORD_ENTRY **)
+ Pmalloc()->Alloc(uWords*sizeof(WORD_ENTRY*))) == NULL) {
+
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ // initilize the memory to 0
+ ZeroFill(ses->m_ppweStrTbl, uWords*sizeof(WORD_ENTRY*));
+
+ // save the count of words
+ ses->m_uWords = uWords;
+
+ // put each word in the hash table.
+ for (i=0; i < uWords; i++) {
+ IfErrGo(AddWord(*(lpbstr+i), &pwe));
+
+ // cache the pointer to the word entry
+ *(ses->m_ppweStrTbl + i) = pwe;
+ }
+
+
+ // We are done with the words. Free them.
+ for (i=0; i < uWords; i++) {
+ FreeBstrA(*(lpbstr+i));
+
+ }
+
+ Pmalloc()->Free(lpbstr);
+
+ // save the encoding
+ *(m_ppsesHelpStr + m_uStrCount) = ses;
+
+ // return the index of the string to the client.
+ *phst = m_uStrCount;
+
+ // update count of strings and words
+ m_uStrCount++;
+
+ return TIPERR_None;
+
+
+Error:
+ // Cleanup.
+
+ // Free the ses
+ Pmalloc()->Free(ses);
+
+ return err;
+
+}
+#pragma code_seg()
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::CreateSubTree
+*Purpose:
+* Takes the left sub tree and the right sub tree and create a new
+* sub tree.
+*
+*Entry:
+* phtmLeft : Pointer the left sub tree.
+* phtmRight : Pointer the left right sub tree.
+*
+*Exit:
+* pphtmSubTree : points to the tree that was created.
+* TIPERROR_OutOfMemory.
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::CreateSubTree(HUFFMAN_TREE_MEM *phtmLeft,
+ HUFFMAN_TREE_MEM *phtmRight,
+ HUFFMAN_TREE_MEM **pphtmSubTree)
+{
+ TIPERROR err = TIPERR_None;
+
+
+ DebAssert(((phtmLeft != NULL) && (phtmRight != NULL)), " NULL pointers ");
+
+ if ((*pphtmSubTree = (HUFFMAN_TREE_MEM *)
+ Pmalloc()->Alloc(sizeof(HUFFMAN_TREE_MEM))) == NULL) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // initilize the memory to 0
+ ZeroFill(*pphtmSubTree, sizeof(HUFFMAN_TREE_MEM));
+
+
+ // initialize the entries
+ (*pphtmSubTree)->m_pweLeaf = NULL;
+ (*pphtmSubTree)->m_uFreq = phtmLeft->m_uFreq + phtmRight->m_uFreq;
+ (*pphtmSubTree)->m_phtmLeft = phtmLeft;
+ (*pphtmSubTree)->m_phtmRight = phtmRight;
+
+ // calculate the size of the compact representation of the Huffman Tree.
+ m_ulCmptSizeOfTree += sizeof(HT_NON_TERMINAL);
+ return err;
+}
+#pragma code_seg()
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::BuildHuffmanTree
+*Purpose:
+* Builds the intial representation of Huffman Tree.
+
+*Note:- This huffman tree is not serialized. This is created to generate the
+* compact representation of the huffman tree and to encode all the
+* strings.
+*
+*Entry:
+* ppweTbl : table of all the word entries.
+* puFreqTbl : Table of the frequency of occurance of each word.
+* puIndexTbl : Index for each entry.
+*
+*
+*Exit:
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::BuildHuffmanTree( WORD_ENTRY **ppweTbl,
+ LONG *puFreqTbl,
+ UINT *puIndexTbl)
+{
+ HUFFMAN_TREE_MEM **pphtmForest;
+ UINT i, uIndexNext,uInsert;
+ TIPERROR err;
+ HUFFMAN_TREE_MEM *phtmSubTree;
+ HUFFMAN_TREE_MEM *phtmLeft;
+ HUFFMAN_TREE_MEM *phtmRight;
+ HUFFMAN_TREE_MEM *phtmTmp;
+ UINT uhtmToFree;
+
+ // create the forest containing the HUFFMAN subtrees.
+ //
+ if ((pphtmForest = (HUFFMAN_TREE_MEM **)
+ Pmalloc()->Alloc(m_uWordCount*sizeof(HUFFMAN_TREE_MEM *))) == NULL) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // initilize the memory to 0
+ ZeroFill(pphtmForest, m_uWordCount*sizeof(HUFFMAN_TREE_MEM *));
+
+
+ // instantiate one sub tree for each word entry.
+ for (i=0; i < m_uWordCount; i++) {
+ if ((*(pphtmForest+i) = (HUFFMAN_TREE_MEM *)
+ Pmalloc()->Alloc(sizeof(HUFFMAN_TREE_MEM))) == NULL) {
+
+ // We need t Free uhtmToFree # of Huffman trees.
+ uhtmToFree = i-1;
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ phtmTmp = *(pphtmForest+i);
+ // initialize the entries
+ phtmTmp->m_pweLeaf = *(ppweTbl + *(puIndexTbl + i));
+ phtmTmp->m_uFreq = (UINT) *(puFreqTbl + i);
+ DebAssert(phtmTmp->m_uFreq == phtmTmp->m_pweLeaf->m_uFreq,
+ " frequencies should match ");
+ phtmTmp->m_phtmLeft = NULL;
+ phtmTmp->m_phtmRight = NULL;
+
+ // calculate the size of the compact representation of the Huffman Tree.
+ m_ulCmptSizeOfTree += sizeof(HT_TERMINAL) + strlen(phtmTmp->m_pweLeaf->
+ m_bstrWord);
+
+ }
+
+ // if there is only 1 word then we already have the Huffman
+ if (m_uWordCount == 1) {
+ m_phtmRoot = *pphtmForest;
+ return TIPERR_None;
+ }
+
+ // indicates the next subtree that needs to be combined.
+ uIndexNext = 0;
+
+ for(;;) {
+ // form a sub tree out of the first 2 sub trees in the forest.
+ // The first entries are the one with the minimum freq.
+
+ // left sub tree
+ phtmLeft = *(pphtmForest+uIndexNext);
+ uIndexNext++;
+ // right sub tree
+ phtmRight = *(pphtmForest+uIndexNext);
+
+ if (err = CreateSubTree(phtmLeft, phtmRight, &phtmSubTree)) {
+ // We need t Free uhtmToFree # of Huffman trees.
+ uhtmToFree = m_uWordCount;
+ goto Error;
+ }
+
+ // Check if we have processed all the sub trees.
+ // If we have processed all the entries then break out of the while loop.
+ if ((uIndexNext+1) == m_uWordCount)
+ break;
+
+ // insert the new sub tree in the forest.
+ // Note: we do a insertion sort to keep every thing in order.
+ // INSERTION SORT!!!
+ uInsert = uIndexNext+1;
+ phtmTmp = *(pphtmForest+uInsert);
+
+ while ((uInsert < m_uWordCount) &&
+ (phtmSubTree->m_uFreq > phtmTmp->m_uFreq)) {
+ pphtmForest[uInsert-1] = pphtmForest[uInsert];
+ uInsert++;
+
+ // if we just shifted the last element of the array then break out
+ // of the while loop.
+ if (uInsert == m_uWordCount)
+ break;
+
+ phtmTmp = *(pphtmForest+uInsert);
+ } // while
+
+ // insert the subtree in that location
+ pphtmForest[uInsert-1] = phtmSubTree;
+
+ } // while
+
+ // Done!!!!!
+ //
+ m_phtmRoot = phtmSubTree;
+
+ Pmalloc()->Free(pphtmForest);
+
+ return err;
+Error:
+ // Free up all the allocate memory
+ for (i=0; i < uhtmToFree; i++) {
+ DebAssert(*(pphtmForest+i) != NULL, " Should not be Null ");
+ Pmalloc()->Free(*(pphtmForest+i));
+ }
+
+ return err;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::BuildCmptHuffmanTree
+*Purpose:
+* Builds the compact representation of Huffman Tree.
+*
+*Entry:
+* phtmRoot : pointer to the tree to encode.
+*
+*
+*Exit:
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::BuildCmptHuffmanTree(HUFFMAN_TREE_MEM *phtmRoot)
+{
+
+ HT_TERMINAL *phtt;
+ HT_NON_TERMINAL *phtnt;
+ TIPERROR err = TIPERR_None;
+
+
+ // if this is terminal node then encode that and save the string
+ // Check if this is a leaf node.
+ if ((phtmRoot->m_phtmLeft == NULL) &&
+ (phtmRoot->m_phtmRight == NULL)) {
+ phtt = (HT_TERMINAL *) (((BYTE *)m_pvHuffmanCmpt) + m_ulCurrentOffset);
+ // flag the entry to be a terminal node.
+ Set1stBit(phtt->m_byte, Off);
+ // copy the string
+ strcpy(phtt->m_rgText, phtmRoot->m_pweLeaf->m_bstrWord);
+
+ // addjust the current offsetto free space.
+ m_ulCurrentOffset += (sizeof(HT_TERMINAL) +
+ strlen(phtmRoot->m_pweLeaf->m_bstrWord));
+
+ return TIPERR_None;
+ }
+
+ // the root is a non terminal node.
+ DebAssert(phtmRoot->m_pweLeaf == NULL, " should be NULL ");
+
+ // Allocate space for left branch
+ phtnt = new(((BYTE *)m_pvHuffmanCmpt) + m_ulCurrentOffset) HT_NON_TERMINAL;
+
+ // addjust the current offset to free space.
+ m_ulCurrentOffset += sizeof(HT_NON_TERMINAL);
+
+
+ // process the right branch.
+ IfErrGo(BuildCmptHuffmanTree(phtmRoot->m_phtmRight));
+
+ // process the left branch.
+ //
+ // flag the entry to be non terminal node.
+ DebAssert(!(UL_MASK & m_ulCurrentOffset), " can handle offset upto 23 bits only ");
+
+ // save the offset to the left branch
+ phtnt->m_byteL = (BYTE) m_ulCurrentOffset;
+ phtnt->m_byteH = (BYTE) (m_ulCurrentOffset >> CHAR_BIT);
+ phtnt->m_byte = (BYTE) (m_ulCurrentOffset >> 2*CHAR_BIT);
+ Set1stBit(phtnt->m_byte, On);
+
+ IfErrGo(BuildCmptHuffmanTree(phtmRoot->m_phtmLeft));
+
+
+ return TIPERR_None;
+
+Error:
+ m_ulCurrentOffset = 0;
+ return err;
+
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::ProcessDocStrings
+*Purpose:
+* This function build the Huffman Trees.
+*
+*
+*Entry:
+* None.
+*
+*
+*Exit:
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::ProcessDocStrings()
+{
+ TIPERROR err = TIPERR_None;
+ WORD_ENTRY **ppweTbl;
+ WORD_ENTRY *pwe;
+ UINT *puIndexTbl;
+ ULONG *puFreqTbl;
+ UINT i;
+ UINT uCount=0;
+
+ // If there are no doc strings to be processed then return.
+ if (m_uStrCount == 0)
+ return TIPERR_None;
+
+ // Build 3 tables.
+ // Tbl1 : Contains the WORD_ENTRY
+ if ((ppweTbl = (WORD_ENTRY **) Pmalloc()->Alloc(m_uWordCount*sizeof(WORD_ENTRY *))) == NULL)
+ return TIPERR_OutOfMemory;
+
+ // initilize the memory to 0
+ ZeroFill(ppweTbl, m_uWordCount*sizeof(WORD_ENTRY *));
+
+ // initialize the table
+ for (i=0; i < DS_cBuckets; i++) {
+ pwe = m_ppweHashTbl[i];
+
+ // walk the link list and count
+ while (pwe != NULL) {
+ ppweTbl[uCount++] = pwe;
+ pwe = pwe->m_pweNext;
+ } // while
+ } // for
+
+ DebAssert(uCount == m_uWordCount, " # of words should not consistent ");
+
+ // Tbl2 : Table conainting the freq of each word entry
+ if ((puFreqTbl = (ULONG *) Pmalloc()->Alloc(m_uWordCount*sizeof(ULONG))) == NULL) {
+ // in case of error release the memory allocated so far.
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+
+ // initialize the table
+ for (i=0; i < m_uWordCount; i++)
+ puFreqTbl[i] = ppweTbl[i]->m_uFreq;
+
+ // Tbl3 : Table conainting the index for each frequency
+ if ((puIndexTbl = (UINT *) Pmalloc()->Alloc(m_uWordCount*sizeof(UINT))) == NULL) {
+ // in case of error release the memory allocated so far.
+ err = TIPERR_OutOfMemory;
+ IfErrGoTo(err, Error1);
+ }
+
+ // initialize the table
+ for (i=0; i < m_uWordCount; i++)
+ puIndexTbl[i] = i;
+
+
+ // Quick Sort the frequency table. Pass in the index table also.
+ // Index table helps in tracking down the original place where the entry
+ // is stored.
+ QuickSortIndex(puFreqTbl, puIndexTbl, m_uWordCount);
+
+ // Build the huffman tree.
+ //
+ IfErrGoTo(BuildHuffmanTree(ppweTbl, (LONG *)puFreqTbl, puIndexTbl), Error2);
+
+ // Walk the tree and encode each word.
+ //
+ IfErrGoTo(EncodeWords(), Error2);
+
+ // Build the compact representation of the Huffman Tree.
+ //
+ // allocate space for the tree.
+ if ((m_pvHuffmanCmpt = (VOID HUGE *) Pmalloc()->Alloc((size_t)m_ulCmptSizeOfTree)) == NULL) {
+ // in case of error release the memory allocated so far.
+ err = TIPERR_OutOfMemory;
+ IfErrGoTo(err, Error2);
+ }
+
+ err = BuildCmptHuffmanTree(m_phtmRoot);
+
+ // fall through ...
+ //
+
+Error2:
+ // Release resources allocated for this function.
+ Pmalloc()->Free(puIndexTbl);
+
+Error1:
+ Pmalloc()->Free(puFreqTbl);
+
+Error:
+ Pmalloc()->Free(ppweTbl);
+
+ return err;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::EncodeWords
+*Purpose:
+* Walks the Huffman tree and encodes each word(at the leaf).
+*
+*Entry:
+* phtmRoot : Pointer the root of the Huffman tree.
+*
+*
+*Exit:
+** TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::EncodeWords()
+{
+ UINT uBits;
+ BYTE rgbCode[MAX_ENCODING_ALLOWED];
+ UINT i;
+ TIPERROR err = TIPERR_None;
+
+ for (i=0; i < MAX_ENCODING_ALLOWED; i++)
+ rgbCode[i] = 0x00;
+
+ uBits = 0;
+
+ IfErrRet(TraverseHuffmanTree(m_phtmRoot, rgbCode, uBits));
+
+ return err;
+}
+#pragma code_seg()
+
+
+
+
+#pragma code_seg(CS_CREATE)
+
+// enable stack checking on this sucker -- it's potentially massivly recursive
+#pragma check_stack(on)
+
+/***
+*PUBLIC DOCSTR_MGR::TraverseHuffmanTree
+*Purpose:
+* Walks the Huffman tree and encodes each word(at the leaf).
+*
+*Entry:
+* phtmRoot : Pointer the root of the Huffman tree.
+*
+*
+*Exit:
+** TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::TraverseHuffmanTree(HUFFMAN_TREE_MEM *phtmRoot,
+ BYTE *rgbHCode,
+ UINT uBits)
+{
+ TIPERROR err=TIPERR_None;
+ WORD_ENTRY *pwe;
+ UINT uByte;
+
+ // Check if this is a leaf node.
+ if ((phtmRoot->m_phtmLeft == NULL) &&
+ (phtmRoot->m_phtmRight == NULL)) {
+
+ // save the encoding in the WORD ENTRY.
+ pwe = phtmRoot->m_pweLeaf;
+ DebAssert(pwe != NULL, " should not be NULL ");
+ pwe->m_uBits = uBits;
+ // # of bytes to copy
+ uByte = (uBits/CHAR_BIT) + 1;
+ if ((pwe->m_bstrHCode = AllocBstrLenA((LPSTR)rgbHCode, uByte)) == NULL) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // return
+ return TIPERR_None;
+ }
+
+ DebAssert( phtmRoot->m_phtmLeft != NULL && phtmRoot->m_phtmRight != NULL,
+ " non leaf should have both the child ");
+
+ // process left child.
+ // set the next bit to 0
+ SetNthBit(uBits, rgbHCode, Off);
+ IfErrRet(TraverseHuffmanTree(phtmRoot->m_phtmLeft, rgbHCode, uBits+1));
+
+ // process right child
+ // set the next bit to 1
+ SetNthBit(uBits, rgbHCode, On);
+ IfErrRet(TraverseHuffmanTree(phtmRoot->m_phtmRight, rgbHCode, uBits+1));
+
+ return TIPERR_None;
+
+}
+#pragma check_stack() // return to the default
+
+#pragma code_seg()
+
+/***
+*PUBLIC DOCSTR_MGR::GetNthBit
+*Purpose:
+* Sets the nth bit in the byte array (b) to the value hc.
+* ____________
+* |0th bit |
+* | |
+* ~ ~
+* | |
+* | |<- nth bit
+*
+*
+*Entry:
+* phtmRoot : Pointer the root of the Huffman tree.
+* n : can take the value 0 to _UINT_MAX
+*
+*Exit:
+** TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+HCODE DOCSTR_MGR::GetNthBit(UINT n, BYTE *rgb)
+{
+
+ UINT uByte;
+ UINT uBitNum;
+ BYTE *b;
+ CHAR ch = 0x00;
+
+ uByte = n/CHAR_BIT;
+
+ // byte to change
+ b = rgb + uByte;
+
+ // get the bit num (in b)
+ uBitNum = (n % CHAR_BIT)+1;
+
+ switch (uBitNum) {
+ case 1:
+ ch = (HCODE) Get1stBit(*b);
+ break;
+ case 2:
+ ch = (HCODE) Get2ndBit(*b);
+ break;
+ case 3:
+ ch = (HCODE) Get3rdBit(*b);
+ break;
+ case 4:
+ ch = (HCODE) Get4thBit(*b);
+ break;
+ case 5:
+ ch = (HCODE) Get5thBit(*b);
+ break;
+ case 6:
+ ch = (HCODE) Get6thBit(*b);
+ break;
+ case 7:
+ ch = (HCODE) Get7thBit(*b);
+ break;
+ case 8:
+ ch = (HCODE) Get8thBit(*b);
+ break;
+ default:
+ DebAssert(0, " 8 is the max bit # ");
+ break;
+
+ }
+
+ return ((ch) ? On : Off);
+}
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::SetNthBit
+*Purpose:
+* Sets the nth bit in the byte array (b) to the value hc.
+*
+* ____________
+* |0th bit |
+* | |
+* ~ ~
+* | |
+* | |<- nth bit
+*
+*
+*Entry:
+* phtmRoot : Pointer the root of the Huffman tree.
+* n : can take value from 0 to UINT_MAX;
+*
+*Exit:
+** TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+VOID DOCSTR_MGR::SetNthBit(UINT n, BYTE *rgb, HCODE hc)
+{
+
+ UINT uByte;
+ UINT uBitNum;
+ BYTE *b;
+
+ uByte = n/CHAR_BIT;
+
+ // byte to change
+ b = rgb + uByte;
+
+ // get the bit num (in b)
+ uBitNum = (n % CHAR_BIT)+1;
+
+ switch (uBitNum) {
+ case 1:
+ Set1stBit(*b, hc);
+ break;
+ case 2:
+ Set2ndBit(*b, hc);
+ break;
+ case 3:
+ Set3rdBit(*b, hc);
+ break;
+ case 4:
+ Set4thBit(*b, hc);
+ break;
+ case 5:
+ Set5thBit(*b, hc);
+ break;
+ case 6:
+ Set6thBit(*b, hc);
+ break;
+ case 7:
+ Set7thBit(*b, hc);
+ break;
+ case 8:
+ Set8thBit(*b, hc);
+ break;
+ default:
+ DebAssert(0, " 8 is the max bit # ");
+
+ }
+
+}
+#pragma code_seg()
+
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC DOCSTR_MGR::GetEncodedDocStrOfHst
+*Purpose:
+* Returns huffman encoding for the string whose index(in m_ppsesHelpStr)
+* is hst.
+*
+*Entry:
+* hst : handle of the string whose encoded string has to be returned
+*
+*
+*Exit:
+* lplpstr (out) : pointer to the encode string.
+*
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::GetEncodedDocStrOfHst(HST hst, LPSTR *lplpstr, UINT *puLen)
+{
+ SEMI_ENCODED_STRING *pses;
+ WORD_ENTRY *pwe;
+ UINT uWords, uBits;
+ LPSTR lpstr;
+ UINT uBitPos;
+
+ DebAssert(hst < m_uStrCount, " invalid index");
+ DebAssert(m_ulCmptSizeOfTree > 0, " There are no DocString " );
+ DebAssert(lplpstr != NULL && puLen != NULL, " invalid parameter ");
+
+ // allocate space for the encoded string.
+ if ((lpstr = (LPSTR) Pmalloc()->Alloc(m_usMaxStrLen)) == NULL)
+ return TIPERR_OutOfMemory;
+
+ // get the semi encoded string for this index.
+ pses = *(m_ppsesHelpStr + hst);
+
+ uBitPos = 0;
+
+ // CONSIDER : we can optimze this step.
+ // encode the string;
+ //
+ // for each word in the string
+ for (uWords=0; uWords < pses->m_uWords; uWords++) {
+ pwe = *(pses->m_ppweStrTbl + uWords);
+ for (uBits=0; uBits < pwe->m_uBits; uBits++) {
+ SetNthBit(uBitPos++,
+ (BYTE *)lpstr,
+ GetNthBit(uBits, (BYTE *)(pwe->m_bstrHCode)));
+ } // for
+ } // for
+
+
+ // set up the out parameter
+ *lplpstr = lpstr;
+ *puLen = (uBitPos/CHAR_BIT) +1;
+
+#if ID_DEBUG
+ // get the total size of the encoded strings.
+ m_uDebTotalEncodedStrSize += *puLen;
+#endif
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DOCSTR_MGR::GetWord
+*Purpose:
+* This function decodes the bit sequence (pbEncodedStr) to extract one
+* word from the encoding starting from the *puBit position. This
+* function increments the count in *puBit to point to the next word position.
+*
+* This function rrecurses until a terminal node is found.
+*
+*Entry:
+* pbEncodedStr : pointer to the encoded doc. string.
+* *puBit (IN/OUT) : specifies the bit position from where to extract the
+* next word. This bit count is increment to indicate
+* the postion of the next word encoding.
+*
+*Exit:
+* lpstr (out) : pointer to the word extracted.
+*
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::GetWord(VOID *pRoot,
+ BYTE *pbEncodedStr,
+ UINT *puBit,
+ LPSTR lpstr)
+{
+ ULONG ulNextOffset = 0;
+ HT_TERMINAL *phtt;
+ HT_NON_TERMINAL *phtnt;
+ TIPERROR err = TIPERR_None;
+
+ // if the root is a terminal node then return the string stored there.
+ if (!Get1stBit(*(BYTE *)pRoot)) {
+ phtt = (HT_TERMINAL *) pRoot;
+ // Copy the string
+ strcpy(lpstr, phtt->m_rgText);
+ return TIPERR_None;
+ }
+
+ // The root is a terminal node
+ phtnt = (HT_NON_TERMINAL *) pRoot;
+ //
+ // Check the next bit and then move to the next node.
+ if (!GetNthBit(*puBit, pbEncodedStr)) {
+ // move to the left direction
+ *puBit += 1;
+ // calculate the offset stored
+ ulNextOffset = (((ULONG)(phtnt->m_byte & 0x7f)) << 2*CHAR_BIT) |
+ (((ULONG)phtnt->m_byteH) << CHAR_BIT) |
+ (((ULONG)phtnt->m_byteL));
+
+ return GetWord((VOID *) ((BYTE*)m_pvHuffmanCmpt + ulNextOffset),
+ pbEncodedStr,
+ puBit,
+ lpstr);
+
+ }
+ else {
+ // move to the right sub tree
+ *puBit += 1;
+
+ return GetWord((VOID *) ((BYTE*)pRoot + sizeof(HT_NON_TERMINAL)),
+ pbEncodedStr,
+ puBit,
+ lpstr);
+
+
+ }
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC DOCSTR_MGR::GetDecodedDocStrOfHst
+*Purpose:
+* Returns the decoded version of the encoding pointed at by pbDocStr.
+*
+*Entry:
+* pDocStr : pointer to the encoded doc. string.
+*
+*
+*Exit:
+* lplpstr (out) : pointer to the decoded string.
+*
+* TIPERROR : (TIPERR_OutOfMemory)
+*
+***********************************************************************/
+TIPERROR DOCSTR_MGR::GetDecodedDocStrOfHst(BYTE *pbDocStr, BSTR *lpbstr)
+{
+
+ TIPERROR err = TIPERR_None;
+ LPSTR lpstrDoc;
+ LPSTR lpstrWord;
+ UINT uBit = 0;
+#if OE_WIN32
+ int cchUnicode;
+#endif
+
+ DebAssert(m_ulCmptSizeOfTree > 0, " There are no DocString " );
+ DebAssert(pbDocStr != NULL && lpbstr != NULL, " invalid parameter ");
+
+ // allocate space for the decoded string.
+ if ((lpstrWord = (LPSTR) Pmalloc()->Alloc(m_usMaxStrLen)) == NULL)
+ return TIPERR_OutOfMemory;
+
+
+
+ // allocate space for each word
+ if ((lpstrDoc = (LPSTR) Pmalloc()->Alloc(m_usMaxStrLen)) == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ lpstrDoc[0] = NULL;
+
+ // get the Next string until we get a NULL;
+ for (;;) {
+ IfErrGoTo(GetWord((VOID *)m_pvHuffmanCmpt,
+ pbDocStr,
+ &uBit,
+ lpstrWord), Error1);
+
+
+ // if the word is a NULL then we are done.
+ if (strlen(lpstrWord) == 0)
+ break;
+
+ // if this is not the the first word then add a blank at the end
+ if (strlen(lpstrDoc) != 0) {
+ strcat(lpstrDoc, " ");
+ }
+
+ // concatenate the word.
+ strcat(lpstrDoc, lpstrWord);
+
+ }
+
+
+ // set up the out parameter
+#if OE_WIN32
+ cchUnicode = MultiByteToWideChar(CP_ACP, 0, lpstrDoc, m_usMaxStrLen, NULL, 0);
+ if (cchUnicode == 0) {
+ err = TIPERR_OutOfMemory;
+ goto Error1;
+ }
+ *lpbstr = AllocBstrLen(NULL, cchUnicode);
+ if (*lpbstr == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error1;
+ }
+
+ NoAssertRetail(MultiByteToWideChar(CP_ACP, 0, lpstrDoc, m_usMaxStrLen, *lpbstr, cchUnicode), "");
+#else
+ *lpbstr = AllocBstrLen(lpstrDoc, m_usMaxStrLen);
+
+ if (*lpbstr == NULL) {
+ err = TIPERR_OutOfMemory;
+ }
+#endif
+
+ // fall through ...
+
+Error1:
+ Pmalloc()->Free(lpstrDoc);
+
+Error:
+
+ Pmalloc()->Free(lpstrWord);
+ return err;
+
+}
+
+
+/***
+*PUBLIC DOCSTR_MGR::ReleaseHuffmanTree
+*Purpose:
+* Walks the tree passed in and releases all the resources associated
+* with the HUFFMAN_TREE. Does a recursive call to free the left and
+* the right subtree before releasing the node.
+*
+*Entry:
+* phtmRoot : root of the tree whose resources has to be released.
+*
+*
+*Exit:
+* None.
+***********************************************************************/
+VOID DOCSTR_MGR::ReleaseHuffmanTree(HUFFMAN_TREE_MEM *phtmRoot)
+{
+
+ // Check if this is a leaf node.
+ if ((phtmRoot->m_phtmLeft == NULL) &&
+ (phtmRoot->m_phtmRight == NULL)) {
+
+ // Free resources owned by WORD_ENTRY
+ FreeBstrA(phtmRoot->m_pweLeaf->m_bstrWord);
+ FreeBstrA(phtmRoot->m_pweLeaf->m_bstrHCode);
+
+ // Free the WordEntry itself
+ Pmalloc()->Free(phtmRoot->m_pweLeaf);
+
+ }
+ else {
+ // free the the left and right sub tree
+ ReleaseHuffmanTree(phtmRoot->m_phtmLeft);
+
+ ReleaseHuffmanTree(phtmRoot->m_phtmRight);
+ }
+
+ // Free this Huffman node.
+ Pmalloc()->Free(phtmRoot);
+
+ return;
+}
+
+
+//
+
+/***
+*PUBLIC ZeroFill
+*Purpose:
+* Zero fills the memory
+*
+*Entry:
+* pv : Pointer to the memory that needs to be zero initilized
+* ubSize : Size of the memory passed in.
+*
+*Exit:
+* None.
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID ZeroFill(VOID HUGE * pv, ULONG ubSize)
+{
+ UINT i;
+
+ for (i=0; i < ubSize; i++)
+ *((BYTE HUGE *)pv+i) = 0;
+
+}
+#pragma code_seg()
+
+
diff --git a/private/oleauto/src/typelib/dstrmgr.hxx b/private/oleauto/src/typelib/dstrmgr.hxx
new file mode 100644
index 000000000..f91331da7
--- /dev/null
+++ b/private/oleauto/src/typelib/dstrmgr.hxx
@@ -0,0 +1,196 @@
+/***
+*nammgr.hxx - Name Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The Help Manager handles all the help strings in the typelib/project.
+* In this implementation we huffman encode all the words.
+*
+*Revision History:
+*
+* 18-July-93 rajivk: Created.
+*
+*
+*****************************************************************************/
+
+#ifndef DSTRMGR_HXX_INCLUDED
+#define DSTRMGR_HXX_INCLUDED
+
+#include "silver.hxx"
+#include "cltypes.hxx"
+#include "blkmgr.hxx"
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDSTRMGR_HXX)
+#define SZ_FILE_NAME g_szDSTRMGR_HXX
+#endif
+
+
+// This constant defines the number of buckets used in the hash
+// table.
+#define DS_cBuckets 2048
+#define DS_cchMaxName 41 // max chars in a name, including terminator
+#define MAX_SEGMENTS 128 // max seven bits for storing the segment #
+
+typedef enum HCODE {
+ Off = 0, // set for left traversal
+ On = 1 // set for right traversal
+};
+
+// These structs define the layout of the structure which
+// keeps track of the frequency by which the word appears.
+// name : we;
+struct WORD_ENTRY //we
+{
+ UINT m_uFreq; // Frequency of the word.
+ BSTRA m_bstrWord; // the word
+ UINT m_uBits; // # of bits needed for the huffman code
+ BSTRA m_bstrHCode; // Huffman code for the bstr.
+ WORD_ENTRY *m_pweNext; // pointer to the next WORD_ENTRY
+};
+
+
+// Im memory representation of HUFFMAN_TREE. This exist only when we are
+// encoding the strings.
+struct HUFFMAN_TREE_MEM //stm
+{
+ WORD_ENTRY *m_pweLeaf; // This NULL for non-leaf nodes.
+ UINT m_uFreq; // cumulative freq of the subtree
+ HUFFMAN_TREE_MEM *m_phtmLeft; // This is null for leaf nodes.
+ HUFFMAN_TREE_MEM *m_phtmRight; // This is null for leaf nodes.
+};
+
+
+struct SEMI_ENCODED_STRING // ses
+{
+ UINT m_uWords;
+ WORD_ENTRY **m_ppweStrTbl;
+};
+
+//
+// name: htt
+struct HT_TERMINAL // nodes containing the string.
+{
+ BYTE m_byte; // the highest bit is 0 for terninal nodes.
+ // the next 7 bits are not used.
+ CHAR m_rgText[1]; // stores the word.
+};
+
+// name: htnt
+struct HT_NON_TERMINAL // nodes containing the string.
+{
+ BYTE m_byte; // the highest bit is set for non terninal nodes.
+ BYTE m_byteH; // this 2 bytes + the 7 bits in the m_byte forms
+ BYTE m_byteL; // forms the offset to the next entry.
+ // Offset is formed of 23 bits.
+ HT_NON_TERMINAL() {
+ m_byte = 0x00;
+ m_byteH = 0x00;
+ m_byteL = 0x00;
+ };
+
+};
+
+
+/***
+*class DOCSTR_MGR - 'dsmgr': documentation string manager
+*Purpose:
+* The class implements the help manager. This class is owned by the
+* GenericTypeLibOle.
+*
+*
+***********************************************************************/
+
+class DOCSTR_MGR
+{
+public:
+ DOCSTR_MGR();
+ ~DOCSTR_MGR();
+
+ TIPERROR Init();
+ nonvirt TIPERROR Read(STREAM *psstrm);
+ nonvirt TIPERROR Write(STREAM *psstrm);
+ nonvirt TIPERROR GetHstOfHelpString(XSZ_CONST szDocStr, HST *hst);
+ nonvirt TIPERROR ProcessDocStrings();
+ nonvirt TIPERROR GetEncodedDocStrOfHst(HST hst, LPSTR *lplpstr, UINT *uLen);
+ nonvirt TIPERROR GetDecodedDocStrOfHst(BYTE *pbDocStr, BSTR *lpbstr);
+
+
+private:
+
+ nonvirt TIPERROR AddWord(BSTRA bstrWord, WORD_ENTRY **ppwe);
+ nonvirt TIPERROR AddNewWord(BSTRA bstrWord, WORD_ENTRY **ppwe);
+ nonvirt TIPERROR BuildHuffmanTree();
+ nonvirt TIPERROR ParseString(XSZ_CONST szStr, BSTRA **lplpbstr, UINT *uWordCount);
+ nonvirt UINT IndexOfHash(ULONG lHash);
+ nonvirt TIPERROR BuildHuffmanTree(WORD_ENTRY **ppweTbl,
+ LONG *puFreqTbl,
+ UINT *puIndexTbl);
+ nonvirt TIPERROR BuildCmptHuffmanTree(HUFFMAN_TREE_MEM *phtmRoot);
+ nonvirt TIPERROR CreateSubTree(HUFFMAN_TREE_MEM *phtmLeft,
+ HUFFMAN_TREE_MEM *phtmRight,
+ HUFFMAN_TREE_MEM **pphtmSubTree);
+ nonvirt TIPERROR EncodeWords();
+ nonvirt TIPERROR TraverseHuffmanTree(HUFFMAN_TREE_MEM *phtmRootphtmRoot,
+ BYTE *rgbCode,
+ UINT uBits);
+ nonvirt VOID SetNthBit(UINT n, BYTE *b, HCODE hc);
+ nonvirt HCODE GetNthBit(UINT n, BYTE *b);
+ nonvirt VOID ReleaseHuffmanTree(HUFFMAN_TREE_MEM *phtmRoot);
+ nonvirt TIPERROR GetWord(VOID *pRoot,
+ BYTE *pbEncodedStr,
+ UINT *puBit,
+ LPSTR lpstr);
+
+ // Serialized DataMember.
+ ULONG m_ulCmptSizeOfTree;
+ USHORT m_usMaxStrLen;
+ VOID HUGE * m_pvHuffmanCmpt;
+
+
+ // Data Member that are NOT serialized.
+ // the following data members are used only while we are building the
+ // huffman tree and compacting the help strings.
+ UINT m_uMaxStrCount;
+ UINT m_uStrCount;
+ UINT m_uWordCount;
+ SEMI_ENCODED_STRING **m_ppsesHelpStr; // Table of semi encoded strings (help strings)
+ WORD_ENTRY **m_ppweHashTbl; // Hash table containing the frequency of each word.
+ UINT *m_puFreqOfWords; // for each entry in m_ppWord table
+ // this table contains the freq.
+ HUFFMAN_TREE_MEM *m_phtmRoot; // Huffman tree for encoding
+ ULONG m_ulCurrentOffset; // Current next free offset;
+
+#if ID_DEBUG
+ ULONG m_uDebTotalStrSize;
+ ULONG m_uDebTotalEncodedStrSize;
+ ULONG m_uDebTotalWord;
+#endif
+
+
+};
+
+
+
+/***
+*PUBLIC IsValid - tests if DOCSTR_MGR valid
+*Purpose:
+* returns the index in the buckect table for the passed in hash value.
+*
+*Entry:
+*
+*Exit:
+* TRUE if has been initialized, else false.
+*
+***********************************************************************/
+inline UINT DOCSTR_MGR::IndexOfHash(ULONG lHash)
+{
+ return (UINT)(WHashValOfLHashVal(lHash) % DS_cBuckets);
+}
+
+
+#endif // ! DSTRMGR_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dtbind.cxx b/private/oleauto/src/typelib/dtbind.cxx
new file mode 100644
index 000000000..ae2c840cf
--- /dev/null
+++ b/private/oleauto/src/typelib/dtbind.cxx
@@ -0,0 +1,1210 @@
+/***
+*dtbind.cxx - DYN_TYPEBIND class implementation
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Class for type binding class.
+*
+*Revision History:
+*
+* 13-Mar-91 ilanc: Created
+* 03-Apr-92 martinc: changed m_hdefn to m_varaccess.m_hdefn
+* (this change was required for cfront)
+* 29-Apr-92 ilanc: Added GetFuncInfoOfHmember() method:
+* used by TipGetFuncInfo(functionid, phfinfo)
+* 30-Jul-92 w-peterh: removed function overloading
+* 30-Apr-93 w-jeffc: made DEFN data members private
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "typelib.hxx"
+#define DYN_TYPEBIND_VTABLE
+#include "dtbind.hxx"
+#include "tdata.hxx"
+#include "gdtinfo.hxx"
+#include "dtmbrs.hxx"
+
+#include "clutil.hxx" // for IsSimpleType()
+#include "exbind.hxx"
+
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleDtbindCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleDtbindCxx
+#else
+static char szDtbindCxx[] = __FILE__;
+#define SZ_FILE_NAME szDtbindCxx
+#endif
+#endif //ID_DEBUG
+
+
+LPOLESTR DYN_TYPEBIND::szProtocolName = WIDE("MS-DYN_TYPEBIND");
+// LPOLESTR DYN_TYPEBIND::szBaseName = WIDE("MS-DEFN_TYPEBIND");
+
+CONSTDATA UINT DYN_TYPEBIND::oDbindnametbl =
+ offsetof(DYN_TYPEBIND, m_dbindnametbl);
+
+/***
+*PUBLIC DYN_TYPEBIND::Initializer - initialize an instance.
+*Purpose:
+* initializes a DYN_TYPEBIND instance.
+*
+*Implementation Notes:
+*
+*Entry:
+* pdtroot - Pointer to a DYN_TYPEROOT (IN).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_TYPEBIND::Init(BLK_MGR *pblkmgr, DYN_TYPEROOT *pdtroot)
+{
+ TIPERROR err;
+ DebAssert(pdtroot != NULL, "DYN_TYPEBIND: pdtroot uninitialized.");
+ DebAssert(pblkmgr != NULL, "DYN_TYPEBIND: pblkmgr uninitialized.");
+
+ m_pdtroot = pdtroot;
+
+ // Init block manager member.
+ IfErrRet(m_dbindnametbl.Init(pblkmgr, pdtroot));
+
+ return err;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC DYN_TYPEBIND::Constructor - Construct an instance.
+*Purpose:
+* Constructs a DYN_TYPEBIND instance.
+*
+*Implementation Notes:
+* Sets all contained pointers to sub-objects to NULL.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+DYN_TYPEBIND::DYN_TYPEBIND()
+{
+ m_pdtroot= NULL;
+ m_isProtocol = FALSE;
+ m_isBeingLaidOut = FALSE;
+
+ m_cbSize = (USHORT)~0;
+ m_cbAlignment = (USHORT)~0;
+ m_oPvft = -1; // by default, no vft
+ m_cbPvft = 0;
+ m_hvtdPrimary = HCHUNK_Nil;
+
+ m_cbSizeDataMembers = (USHORT)~0;
+}
+#pragma code_seg( )
+
+
+// Dtor: do nothing... we are embedded.
+//
+#pragma code_seg( CS_CORE )
+DYN_TYPEBIND::~DYN_TYPEBIND() {}
+#pragma code_seg( )
+
+
+LPVOID DYN_TYPEBIND::QueryProtocol(LPOLESTR szInterfaceName)
+{
+ if (szInterfaceName == szProtocolName ||
+ ostrcmp(szInterfaceName, szProtocolName) == 0)
+ return this;
+ else
+ return DEFN_TYPEBIND::QueryProtocol(szInterfaceName);
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::AddRef
+*Purpose:
+* Adds external ref.
+*
+*Implementation Notes:
+* Defers to DYN_TYPEMEMBERS.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+VOID DYN_TYPEBIND::AddRef()
+{
+ Pdtmbrs()->AddRef();
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::AddInternalRef
+*Purpose:
+* Implementation of AddInternalRef method.
+*
+*Implementation Notes:
+* Defers to DYN_TYPEMEMBERS
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID DYN_TYPEBIND::AddInternalRef()
+{
+ Pdtmbrs()->AddInternalRef();
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::RelInternalRef
+*Purpose:
+* Implementation of RelInternalRef method.
+*
+*Implementation Notes:
+* Defers to DYN_TYPEMEMBERS.
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID DYN_TYPEBIND::RelInternalRef()
+{
+ Pdtmbrs()->RelInternalRef();
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::Release
+*Purpose:
+* Implementation of Release method.
+*
+*Implementation Notes:
+* Defers to containing DYN_TYPEROOT (which is responsible
+* for tracking DYN_TYPEMEMBERS references).
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID DYN_TYPEBIND::Release()
+{
+ m_pdtroot->ReleaseDtmbrs();
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::Pdtmbrs - accessor for DYN_TYPEMEMBERS.
+*Purpose:
+* Gets DYN_TYPEMEMBERS ptr.
+*
+*Implementation Notes:
+* Wants to be inline but because of hxxtoinc problem with
+* unresolved externs and the fact that is needed by other
+* modules we make it outline.
+*
+*Entry:
+*
+*Exit:
+* DYN_TYPEMEMBERS *
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+DYN_TYPEMEMBERS *DYN_TYPEBIND::Pdtmbrs() const
+{
+ return (DYN_TYPEMEMBERS *)((BYTE *)this - DYN_TYPEMEMBERS::oDtbind);
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC DYN_TYPEBIND::GetTypeInfo
+*Purpose:
+* Gets containing typeinfo.
+*
+*Implementation Notes:
+* Defers to containing typeroot. Increments refcount.
+* Client must release.
+*
+*Entry:
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEBIND::GetTypeInfo(TYPEINFO **pptinfo)
+{
+ DebAssert(pptinfo, "bad param.");
+
+ *pptinfo = Pdtroot()->Pgdtinfo();
+ (*pptinfo)->AddRef();
+ return TIPERR_None;
+}
+
+
+#if ID_DEBUG
+/***
+*PUBLIC DYN_TYPEBIND::IsValid - is binding table valid?
+*Purpose:
+* Is binding table valid
+*
+*Implementation Notes:
+* Valid iff containing DYN_TYPEMEMBERS is laid out.
+*
+*Entry:
+*
+*Exit:
+* BOOL
+*
+***********************************************************************/
+
+BOOL DYN_TYPEBIND::IsValid() const
+{
+ return Pdtmbrs()->IsLaidOut() && m_dbindnametbl.IsValid();
+}
+#endif //EI_OB || ID_DEBUG
+
+
+/***
+*PUBLIC DYN_TYPEBIND::BuildBindNameTable - build bindnametbl
+*Purpose:
+* Builds bindnametbl
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEBIND::BuildBindNameTable()
+{
+ TIPERROR err;
+
+ IfErrRet(m_dbindnametbl.BuildTable());
+
+ DebAssert(m_dbindnametbl.IsValid(), "bad bindnametbl.");
+
+ return err;
+}
+
+/***
+*PUBLIC DYN_TYPEBIND::BindBase - Bind to base given hvdefn.
+*Purpose:
+* Bind to base class.
+*
+*Implementation Notes:
+* Need flag to indecate that restricted functions should be ignored
+* (i.e. as if they don't exist) so that when using this function in
+* the "embedded macro interface" mode we can correctly implement
+* dispinterface restricted semantics (i.e. dispinterfaces don't support
+* restricted funcs thus they shoulnd't exist when "inherited").
+*
+*Entry:
+* fWantType TRUE if they want to bind to a type id, else FALSE (IN).
+* hvdefnBase base to bind to.
+* hgnam Name of id to bind. (IN)
+* fuInvokeKind Kind of invocation (func/var/prop): ignored for types (IN).
+* access Visibility attr: private means everything etc. (IN)
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+* An "unsuitable match" error is returned if a matching name is
+* found but it's unsuitable wrt INVOKEKIND.
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEBIND::BindBase(BOOL fWantType,
+ HVAR_DEFN hvdefnBase,
+ UINT oBase,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind,
+ GenericTypeLibOLE *pgtlibole)
+{
+ TYPE_DATA *ptdata = NULL;
+ VAR_DEFN * qvdefnBase;
+ DYN_TYPEBIND *pdtbindBase; // TYPEBIND for base class
+ GEN_DTINFO *pgdtinfo;
+ TIPERROR err = TIPERR_None;
+
+ ptdata = Pdtmbrs()->Ptdata(); // don't bump refcount
+ DebAssert(ptdata != NULL, "bad TYPE_DATA.");
+
+ qvdefnBase = ptdata->QvdefnOfHvdefn(hvdefnBase);
+ if (IsMatchOfVisibility((ACCESS)qvdefnBase->Access(), access)) {
+ IfErrRet(ptdata->GetDynTypeBindOfHvdefn(hvdefnBase,
+ &pdtbindBase,
+ NULL));
+ DebAssert(pdtbindBase != NULL, "Unsupported base member");
+ // Our current containing project is in pgtlibole
+ // so we get the base's containing project and compare
+ // for identity -- if different, we're cross-project, and we
+ // can't use our existing hgnam.
+ //
+ // Ok to use the non-public interfaces to get the base class's
+ // containing typeinfo, because we know that we're dealing
+ // with one of our own typeinfo's here (GetDynTypeBindOfHvdefn
+ // ensures this).
+ //
+ pgdtinfo = pdtbindBase->Pdtroot()->Pgdtinfo();
+
+ if (pgtlibole != pgdtinfo->PgtlibOleContaining()) {
+ NAMMGR *pnammgr;
+ LPSTR szName;
+
+ // First get a nammgr
+ IfErrGo(m_pdtroot->GetNamMgr(&pnammgr));
+
+ // get the string to pass to BindDefnStr. NOTE: we can use
+ // the api that returns a pointer directly into the name table
+ // because we know that we're just going to turn around and
+ // use the string to look up the name in the typelib again.
+ szName = pnammgr->LpstrOfHgnam(hgnam);
+
+ // CONSIDER: combine BindDefnStr & BindTypeDefnStr
+ if (fWantType) {
+ err = pdtbindBase->BindTypeDefnStr(szName,
+ fuInvokeKind,
+ access,
+ pexbind);
+ }
+ else {
+ err = pdtbindBase->BindDefnStr(szName,
+ fuInvokeKind,
+ access,
+ pexbind);
+ }
+ }
+ else {
+ // We're in the same typlib/proj and we can use
+ // hgnam as is and call the BindDefn interface.
+ //
+ err = pdtbindBase->BindIdDefn(fWantType,
+ hgnam,
+ fuInvokeKind,
+ access,
+ pexbind);
+ }
+
+Error:
+ // Fall through even in error case...
+ pexbind->AdjustOfs(oBase);
+ pdtbindBase->Release();
+ } // of if IsMatchOfVisibility
+ return err;
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::BindIdDefn - Bind to id, produce DEFN.
+*Purpose:
+* Bind to non-type or type id, produce DEFN.
+*
+*Implementation Notes:
+* Defers to BindDefnCur.
+**
+*Entry:
+* fWantType TRUE if they want to bind to a type id, else FALSE (IN).
+* hgnam Name of id to bind. (IN)
+* fuInvokeKind
+* Kind of invocation (func/var/prop): ignored for types (IN).
+* NOTE: fuInvokeKind == 0 means: "bind to first thing".
+* access Visibility attr: private means everything etc. (IN)
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+* An "unsuitable match" error is returned if a matching name is
+* found but it's unsuitable wrt INVOKEKIND.
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEBIND::BindIdDefn(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind)
+{
+ TYPE_DATA *ptdata = NULL;
+ HDEFN hdefnMatch = HDEFN_Nil;
+ TYPEKIND tkind;
+ HVAR_DEFN hvdefnBaseCur, hvdefnBaseFirst, hvdefnBaseNext;
+ VAR_DEFN * qvdefnBase;
+ UINT ityp;
+ GEN_DTINFO *pgdtinfo;
+ GenericTypeLibOLE *pgtlibole;
+
+ NAMMGR *pnammgr;
+ TIPERROR err = TIPERR_None;
+
+ pgdtinfo = Pdtroot()->Pgdtinfo();
+ pgtlibole = pgdtinfo->PgtlibOleContaining();
+ IfErrRet(pgtlibole->GetTypeBind()); // We need the name cache
+
+ // Note that in the OLE case, we can't bind to types in base classes
+ // because we don't support nested types.
+ //
+ DebAssert(fWantType == FALSE, "OLE doesn't have nested types.");
+
+
+ DebAssert((pexbind != NULL), "bad param.");
+ pexbind->SetBindKind(BKIND_NoMatch); // be pessimistic.
+
+ ptdata = Pdtmbrs()->Ptdata(); // don't bump refcount
+ DebAssert(ptdata != NULL, "bad TYPE_DATA.");
+
+ DebAssert(m_dbindnametbl.IsValid(), "bad bindnametbl.");
+
+ IfErrRet(m_pdtroot->GetNamMgr(&pnammgr));
+
+ IfErrRet(BindDefnCur(fWantType, hgnam, fuInvokeKind, access, pexbind));
+
+ // If we didn't find anything, recurse onto the base classes.
+ if (pexbind->IsNoMatch()) {
+
+ // No match. If we have base classes, recursive search for
+ // match in the base classes.
+ // For now, we only do single inheritance,
+ // which simplifies things because we only recurse once, and
+ // we don't have to deal with ambiguity.
+ // After binding, we must adjust
+ // the offset by the offset of the base class.
+ //
+ // But first, check to see if the name we are looking for is in
+ // the name cache for the CURRENT typeinfo. This will tell us if
+ // the name MIGHT be in the base class in those cases where we have
+ // not checked the name cache yet. If we have already checked the
+ // name cache (in BindProjLevel because we're binding "outside-in"),
+ // this section is redundant for the
+ // first base class, but will help for any subsequent base classes.
+ //
+ // Get the name cache's index
+ ityp = pgdtinfo->GetIndex();
+
+ // Look up the name, leave if it isn't here
+ if (!pgtlibole->IsValidNameCache(ityp) ||
+ pgtlibole->IsNameInCache(ityp, hgnam)) {
+
+ // The following is weird but...
+ // For dispinterfaces, we first bind to the
+ // 2nd class and only then to the first "true" base.
+ // For other typekinds we bind "normally" to the 1st base.
+ //
+ tkind = GetTypeKind();
+ hvdefnBaseCur = hvdefnBaseFirst = ptdata->HvdefnFirstBase();
+ if (tkind == TKIND_COCLASS) {
+ // For coclasses, we attempt to bind to the DEFAULT
+ // dispinterface which isn't necessarily the first base
+ //
+ while (hvdefnBaseCur != HDEFN_Nil) {
+ qvdefnBase = ptdata->QvdefnOfHvdefn(hvdefnBaseCur);
+ hvdefnBaseNext = qvdefnBase->HdefnNext();
+ // Is this the DEFAULT dispinterface?
+ if (qvdefnBase->GetImplTypeFlags() == IMPLTYPEFLAG_FDEFAULT) {
+ break;
+ }
+ hvdefnBaseCur = hvdefnBaseNext;
+ }
+ }
+ else if (tkind == TKIND_DISPATCH) {
+ // for dispinterfaces we do the funky "start to bind at
+ // the 2nd base" thing of which there can only be one.
+ // In VBA1 we only support a single "embedded" interface.
+ // We ultimately bind to the 1st base.
+ //
+ DebAssert(hvdefnBaseCur != HDEFN_Nil,
+ "dispinterfaces must have a base class.");
+ hvdefnBaseCur = ptdata->QvdefnOfHvdefn(hvdefnBaseCur)->HdefnNext();
+ }
+ if (hvdefnBaseCur != HDEFN_Nil) {
+ qvdefnBase = ptdata->QvdefnOfHvdefn(hvdefnBaseCur);
+ IfErrRet(BindBase(FALSE,
+ hvdefnBaseCur,
+ qvdefnBase->GetOVar(),
+ hgnam,
+ fuInvokeKind,
+ access,
+ pexbind,
+ pgtlibole));
+
+ // For dispinterfaces, if we matched in the "pseudo-base"
+ // then we need to indicate such.
+ //
+ if ((tkind == TKIND_DISPATCH) && (!pexbind->IsNoMatch())) {
+ DebAssert(pexbind->IsFuncMatch(), "should be function.");
+
+ // Return the dispinterface's typeinfo
+ pexbind->SetIsDispatch(TRUE);
+ pexbind->Ptinfo()->Release();
+ pexbind->SetPtinfo(pgdtinfo);
+ pgdtinfo->AddRef();
+ } // if match
+ else {
+ DebAssert(tkind == TKIND_COCLASS ||
+ pexbind->IsDispatch() == FALSE,
+ "should have been ctor'ed to FALSE.");
+ }
+ } // of if hvdefnBaseCur
+ // If dispinterface then
+ // if no match yet, then
+ // then finally bind to first base.
+ //
+ if (tkind == TKIND_DISPATCH) {
+ if (pexbind->IsNoMatch()) {
+ DebAssert(hvdefnBaseFirst != HDEFN_Nil,
+ "dispinterface must have base.");
+ qvdefnBase = ptdata->QvdefnOfHvdefn(hvdefnBaseFirst);
+ IfErrRet(BindBase(FALSE,
+ hvdefnBaseFirst,
+ qvdefnBase->GetOVar(),
+ hgnam,
+ fuInvokeKind,
+ access,
+ pexbind,
+ pgtlibole));
+ } // if no match
+ } // if dispinterface
+ } // if invalid name cache or hit
+
+ }
+
+ return err;
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::BindDefnCur - Bind to id in current module only.
+*Purpose:
+* Bind to non-type or type id, produce DEFN.
+*
+*Implementation Notes:
+* Defers to BINDNAME_TABLE.
+**
+*Entry:
+* fWantType TRUE if they want to bind to a type id, else FALSE (IN).
+* hgnam Name of id to bind. (IN)
+* fuInvokeKind
+* Kind of invocation (func/var/prop): ignored for types (IN).
+* NOTE: fuInvokeKind == 0 means: "bind to first thing".
+* access Visibility attr: private means everything etc. (IN)
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+* An "unsuitable match" error is returned if a matching name is
+* found but it's unsuitable wrt INVOKEKIND.
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEBIND::BindDefnCur(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind)
+{
+ TYPE_DATA *ptdata = NULL;
+ USHORT indexMatch;
+ HDEFN hdefn, hdefnMatch = HDEFN_Nil;
+ DEFN *qdefn;
+ FUNC_DEFN *qfdefn;
+ INVOKEKIND invokekindMatch;
+ BOOL fMatchProperty, fMatchFunc;
+ HLNAM hlnam;
+ NAMMGR *pnammgr;
+ TIPERROR err = TIPERR_None;
+
+ // Note that in the OLE case, we can't bind to types in base classes
+ // because we don't support nested types.
+ //
+ DebAssert(fWantType == FALSE, "OLE doesn't have nested types.");
+
+
+ DebAssert(pexbind != NULL, "bad param.");
+ pexbind->SetBindKind(BKIND_NoMatch); // be pessimistic.
+
+ ptdata = Pdtmbrs()->Ptdata();
+ DebAssert(ptdata != NULL, "bad TYPE_DATA.");
+
+ DebAssert(m_dbindnametbl.IsValid(), "bad bindnametbl.");
+
+ IfErrRet(m_pdtroot->GetNamMgr(&pnammgr));
+
+ // Be pessimistic about funcs and properties...
+ fMatchFunc = fMatchProperty = FALSE;
+
+ // get first matching name
+ hlnam = pnammgr->HlnamOfHgnam(hgnam);
+ indexMatch = m_dbindnametbl.IndexFirstOfHlnam(hlnam);
+
+ // If we're looking for a type then skip over any
+ // non-type ids (we ignore INVOKEKIND in this case),
+ // otherwise we're looking for a non-type id so skip
+ // over any type ids (only one actually) and then
+ // make sure we've got the right INVOKEKIND.
+ // Note: non-types and types are in different namespaces.
+ //
+ while (indexMatch != BIND_INVALID_INDEX) {
+ // Get the qdefn of our match
+ hdefn = m_dbindnametbl.HdefnOfIndex(indexMatch);
+ qdefn = m_dbindnametbl.QdefnOfHdefn(hdefn);
+
+ // - switch on match kind (var/func/type etc.)
+ // - in each case determine if what they want (invokekind flags)
+ // are what we got
+ // - if so break else determine if there could be something
+ // legitimately overloaded,
+ // - if so getnext
+ // else issue appropriate error msg (type mismatch)
+ //
+ if (qdefn->IsRecTypeDefn()) {
+ if (fWantType) {
+ // Matched a nestedtype of which there can only be one,
+ // so we break out of the loop.
+ //
+ break;
+ }
+ // else we don't a want a type so we fall through to
+ // the bottom to get next.
+ }
+ else if (qdefn->IsVarDefn()) {
+ if (!fWantType) {
+ // Only case that we don't match a variable is if *only*
+ // INVOKE_FUNC specified or if not INVOKE_PROPERTYGET and this
+ // variable is marked as read-only. Note,
+ // fuInvokeKind == 0 is special-case of != INVOKE_FUNC
+ // (thus we match) and exit.
+ //
+ if (fuInvokeKind == (UINT)INVOKE_FUNC) {
+ // else we want a function so we issue an error and return.
+ return TIPERR_ExpectedFuncNotVar;
+ }
+ else if (fuInvokeKind && !(fuInvokeKind & (UINT)INVOKE_PROPERTYGET)
+ && ((VAR_DEFN *)qdefn)->IsReadOnly()) {
+
+ return TIPERR_UnsuitableFuncPropMatch;
+ }
+
+ // Matched a variable of which there can only be one,
+ // so we break out of the loop.
+ //
+ break;
+ }
+ // else we don't want a variable so we fall through to
+ // the bottom to get next.
+ }
+ else if (qdefn->IsFuncDefn()) {
+ if (!fWantType) {
+ // Get the invokekind from the FUNC_DEFN we matched.
+ qfdefn = (FUNC_DEFN *)qdefn;
+ invokekindMatch = qfdefn->InvokeKind();
+ // Note: we special-case fuInvokeKind == 0 to mean match.
+ if ((fuInvokeKind == 0) || (fuInvokeKind & invokekindMatch)) {
+ // Match the appropriate kind of function of which there
+ // can only be one, so we remember that we've already
+ // matched and if this is the first match we remember it
+ // and attempt to match perhaps some other property,
+ // if we do again then it's an ambiguity and we issue
+ // the appropriate error. Note that this can happen e.g.
+ // if there's a Propery Get and Set and we pass in both
+ // the INVOKE_PropertyGet and INVOKE_PropertyPut flags.
+ //
+ if (fMatchProperty) {
+ return TIPERR_AmbiguousName;
+ }
+ else {
+ // Save the matching hdefn cos we might have to
+ // go through the loop again for ambiguity reasons etc..
+ //
+ hdefnMatch = hdefn;
+ fMatchProperty = TRUE;
+ }
+ // and fall through to get next...
+ } // if
+ // else we don't want this property/function or we need to
+ // ensure there's not another suitable match (which would
+ // be an ambiguity), so we fall through to the bottom
+ // to get next.
+ // We do however remember that we matched some kind of
+ // func (perhaps property) so that we can issue the
+ // appropriate if don't find what we're looking for.
+ //
+ fMatchFunc = TRUE;
+ // Since we special-case fuInvokeKind == 0 to mean match the
+ // first thing you find, we prematurely break out of the loop
+ // here with our first match.
+ //
+ if (fuInvokeKind == 0)
+ break;
+ } // if !fWantType
+ // else we don't want a function so we fall through to
+ // the bottom to get next.
+ } // if IsFuncMatch()
+ else {
+ // should never happen: modules only have nested types, vars,
+ // and funcs/props.
+ //
+ DebHalt("bad match.");
+ }
+
+ // get next...
+ indexMatch = m_dbindnametbl.IndexNextOfHlnam(hlnam, indexMatch);
+ } // of while
+
+ // At this point one of 4 conditions holds:
+ // (1) We matched a single property but indexMatch is null
+ // cos we continued to search for ambiguities, however
+ // indexMatch contains saved match.
+ // (2) indexMatch is non-null
+ // (3) indexMatch is NULL and didn't match property but
+ // we did match some other (unsuitable) function.
+ // (4) indexMatch is NULL and didn't match property and
+ // we didn't even match a function.
+ //
+
+ // Well, do we have a suitable match??
+ if ((indexMatch == BIND_INVALID_INDEX) && (fMatchProperty == FALSE)) {
+ if (fMatchFunc == TRUE) {
+ // unsuitable match case -- issue error
+ return (TIPERROR)(fWantType ?
+ TIPERR_UndefinedType :
+ TIPERR_UnsuitableFuncPropMatch);
+ }
+ }
+ else {
+ // Either indexMatch is non-NULL or fMatchProperty is TRUE,
+ // if the latter then we saved the relevant match in
+ // hdefnMatch already.
+ //
+ if (!fMatchProperty) {
+ hdefnMatch = hdefn;
+ }
+
+ // Get the qdefn of the stored match
+ qdefn = m_dbindnametbl.QdefnOfHdefn(hdefnMatch);
+
+ // Functions and Variables.
+ if (qdefn->IsFuncDefn() || qdefn->IsVarDefn()) {
+ // check visibility
+ if (IsMatchOfVisibility((ACCESS)qdefn->Access(), access)) {
+ // update TYPE_DATA member. No need to worry about
+ // releasing since containing typeinfo's lifetime is
+ // at least as long.
+ //
+ pexbind->SetBindKind(qdefn->IsFuncDefn() ? BKIND_FuncMatch
+ : BKIND_OneVarMatch);
+ pexbind->SetHdefn(hdefnMatch);
+ pexbind->SetPtdata(ptdata);
+ ITypeInfoA *ptinfo = ptdata->Pdtroot()->Pgdtinfo();
+ pexbind->SetPtinfo(ptinfo);
+ ptinfo->AddRef(); // client must release
+ }
+ }
+
+ else {
+ DebHalt("unreachable");
+ }
+ }
+
+ return err;
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::HvdefnPredeclared.
+*Purpose:
+* returns the predeclared VAR_DEFN
+*
+*
+*Entry:
+* None.
+*
+*Exit:
+* HVAR_DEFN
+*
+***********************************************************************/
+
+HVAR_DEFN DYN_TYPEBIND::HvdefnPredeclared()
+{
+ return Pdtmbrs()->Ptdata()->HvdefnPredeclared();
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::GetTypeData.
+*Purpose:
+* returns the TYPE_DATA
+*
+*
+*Entry:
+* None.
+*
+*Exit:
+* TYPE_DATA
+*
+***********************************************************************/
+TYPE_DATA *DYN_TYPEBIND::Ptdata()
+{
+
+ return Pdtmbrs()->Ptdata();
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::BindDefnStr - Bind to id.
+*Purpose:
+* Bind to non-type id given string (as opposed to hgnam).
+*
+*Implementation Notes:
+* Converts string to hgnam and then defers to BindDefn.
+* CONSIDER: share code with BindTypeDefnStr
+*
+*Entry:
+* bstrName Name of id to bind. (IN)
+* fuInvokeKind Flags: Kind of invocation (IN).
+* access Visibility attr: private means everything etc. (IN)
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEBIND::BindDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind)
+{
+ HLNAM hlnam;
+ HGNAM hgnam;
+ NAMMGR *pnammgr;
+ TIPERROR err;
+
+ // extract hgnam from string
+ // First get a nammgr
+ //
+ IfErrRet(m_pdtroot->GetNamMgr(&pnammgr));
+
+ // Get the hlnam without adding it to the name manager if it isn't
+ // already there.
+ //
+ hlnam = pnammgr->HlnamOfStrIfExist(szName);
+
+ // If the hlnam == HLNAM_Nil, then the name doesn't exist
+ // in this project.
+ //
+ if (hlnam == HLNAM_Nil) {
+ // We matched nothing
+ pexbind->SetBindKind(BKIND_NoMatch);
+
+ return TIPERR_None;
+ }
+
+ // get the hgnam to pass to BindDefn
+ IfErrRet(pnammgr->HgnamOfHlnam(hlnam, &hgnam));
+
+ // defer to BindIdDefn
+ return BindIdDefn(FALSE, hgnam, fuInvokeKind, access, pexbind);
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::BindTypeDefnStr - Bind to a type.
+*Purpose:
+* Bind to type id given string (as opposed to hgnam).
+*
+*Implementation Notes:
+* Converts string to hgnam and then defers to BindTypeDefn.
+* CONSIDER: share code with BindTypeDefnStr
+*
+*Entry:
+* bstrName Name of id to bind. (IN)
+* fuInvokeKind Flags: Kind of invocation (IN).
+* access Visibility attr: private means everything etc. (IN)
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEBIND::BindTypeDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind)
+{
+ HLNAM hlnam;
+ HGNAM hgnam;
+ NAMMGR *pnammgr;
+ TIPERROR err;
+
+ // extract hgnam from string
+ // First get a nammgr
+ //
+ IfErrRet(m_pdtroot->GetNamMgr(&pnammgr));
+
+ // Get the hlnam without adding it to the name manager if it isn't
+ // already there.
+ //
+ hlnam = pnammgr->HlnamOfStrIfExist(szName);
+
+ // If the hlnam == HLNAM_Nil, then the name doesn't exist
+ // in this project.
+ //
+ if (hlnam == HLNAM_Nil) {
+ // We matched nothing
+ pexbind->SetBindKind(BKIND_NoMatch);
+
+ return TIPERR_None;
+ }
+
+ // get the hgnam to pass to BindDefn
+ IfErrRet(pnammgr->HgnamOfHlnam(hlnam, &hgnam));
+
+ // defer to BindTypeDefn
+ return BindIdDefn(TRUE, hgnam, 0, access, pexbind);
+}
+
+
+// Stub implementations
+//
+
+
+TYPEKIND DYN_TYPEBIND::GetTypeKind()
+{
+ DebAssert(m_pdtroot->Pgdtinfo() != NULL, "bad TYPEINFO.");
+
+ return m_pdtroot->Pgdtinfo()->GetTypeKind();
+}
+
+
+USHORT DYN_TYPEBIND::GetCbSize()
+{
+ DebAssert(m_cbSize != ~0, "bad size attr.");
+ return m_cbSize;
+}
+
+
+USHORT DYN_TYPEBIND::GetAlignment()
+{
+ DebAssert(m_cbAlignment != ~0, "bad alignment attr.");
+ return m_cbAlignment;
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::Read - Read serialized image of DYN_TYPEBIND.
+*Purpose:
+* Read serialized image of DYN_TYPEBIND.
+*
+*Implementation Notes:
+* Serialized format:
+* isProtocol flag
+* cbSize
+* cbAlignment
+* oPvft
+* bindnamtbl
+*
+*Entry:
+* pstrm - STREAM to read image from (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEBIND::Read(STREAM *pstrm)
+{
+ USHORT isProtocol;
+ USHORT cbSize;
+ USHORT cbAlignment;
+ LONG oPvft;
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // Then Deserialize DYN_TYPEBIND meta-info.
+ // (dougf) why read into locals & then assign?
+ // Because some are bitfields.
+ //
+ IfErrRet(pstrm->ReadUShort(&isProtocol));
+ IfErrRet(pstrm->ReadUShort(&cbSize));
+ IfErrRet(pstrm->ReadUShort(&cbAlignment));
+ IfErrRet(pstrm->ReadULong((ULONG *)&oPvft));
+ IfErrRet(pstrm->ReadUShort(&m_cbPvft));
+ IfErrRet(pstrm->ReadULong(&m_hmemberConst));
+ IfErrRet(pstrm->ReadULong(&m_hmemberDest));
+ // Note: don't serialize m_hmemberCopy/Assign, because only
+ // records have copy/assign function, and these are handled
+ // by REC_TYPEBIND
+
+ // deserialize BINDNAME_TABLE embedded member
+ IfErrRet(m_dbindnametbl.Read(pstrm));
+
+ m_isProtocol = (BOOL)isProtocol;
+ m_isBeingLaidOut = FALSE;
+ m_cbSize = cbSize;
+ m_cbAlignment = cbAlignment;
+ m_oPvft = oPvft;
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::Write - Write image of DYN_TYPEBIND.
+*Purpose:
+* Write image of DYN_TYPEBIND.
+*
+*Implementation Notes:
+* Serialized format:
+* isProtocol flag
+* cbSize
+* cbAlignment
+* oPvft
+* bindnametbl
+*
+*Entry:
+* pstrm - STREAM to read image to (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR DYN_TYPEBIND::Write(STREAM *pstrm)
+{
+ USHORT isProtocol = (m_isProtocol != 0);
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // Then serialize DYN_TYPEBIND meta-info.
+ // CONSIDER: this should be rewritten to write out a contiguous set
+ // CONSIDER: of members of DYN_TYPEBIND in a single write
+ //
+ IfErrRet(pstrm->WriteUShort(isProtocol));
+ IfErrRet(pstrm->WriteUShort(m_cbSize));
+ IfErrRet(pstrm->WriteUShort(m_cbAlignment));
+ IfErrRet(pstrm->WriteULong(m_oPvft));
+ IfErrRet(pstrm->WriteUShort(m_cbPvft));
+ IfErrRet(pstrm->WriteULong(m_hmemberConst));
+ IfErrRet(pstrm->WriteULong(m_hmemberDest));
+ // Note: don't serialize m_hmemberCopy/Assign, because only
+ // records have copy/assign function, and these are handled
+ // by REC_TYPEBIND
+
+ // serialize BINDNAME_TABLE embedded member
+ IfErrRet(m_dbindnametbl.Write(pstrm));
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#if 0
+
+
+
+
+
+
+#endif // 0
+
+
+
+
+
+TIPERROR DYN_TYPEBIND::BindDefnProjLevelStr(LPSTR,
+ UINT,
+ ACCESS,
+ ACCESS,
+ EXBIND *)
+{
+ DebAssert(FALSE, "can't call.");
+ return TIPERR_None;
+}
+
+
+TIPERROR DYN_TYPEBIND::BindTypeDefnProjLevelStr(LPSTR,
+ UINT,
+ ACCESS,
+ ACCESS,
+ EXBIND *)
+{
+ DebAssert(FALSE, "can't call.");
+ return TIPERR_None;
+}
+
+#if ID_DEBUG
+
+VOID DYN_TYPEBIND::DebCheckState(UINT uLevel) const
+{
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ m_dbindnametbl.DebCheckState(uLevel);
+ }
+}
+
+
+VOID DYN_TYPEBIND::DebShowState(UINT uLevel) const
+{
+ DebPrintf("*** DYN_TYPEBIND ***\n");
+
+ DebPrintf("isProtocol: %u\n", m_isProtocol);
+ DebPrintf("isIsBeingLaidOut: %u\n", m_isBeingLaidOut);
+
+ DebPrintf("m_cbSize: %u\n", m_cbSize);
+ DebPrintf("m_Alignment: %u\n", m_cbAlignment);
+ DebPrintf("m_oPvft: %u\n", m_oPvft);
+ m_dbindnametbl.DebShowState(uLevel);
+}
+
+
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/typelib/dtbind.hxx b/private/oleauto/src/typelib/dtbind.hxx
new file mode 100644
index 000000000..b8f0d0f42
--- /dev/null
+++ b/private/oleauto/src/typelib/dtbind.hxx
@@ -0,0 +1,282 @@
+/***
+*dtbind.hxx - DYN_TYPEBIND header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+* 03-Apr-91 ilanc: Stub created.
+* 30-Jul-92 w-peterh: removed function overloading
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef DYN_TYPEBIND_HXX_INCLUDED
+#define DYN_TYPEBIND_HXX_INCLUDED
+
+#include "stream.hxx"
+#include "dfntbind.hxx" // derives from DEFN_TYPEBIND
+#include "defn.hxx" // for DEFN binding structs.
+#include "dbindtbl.hxx" // for DYN_BINDNAME_TABLE
+#include "tdata.hxx"
+
+
+class EXBIND;
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDTBIND_HXX)
+#define SZ_FILE_NAME g_szDTBIND_HXX
+#endif
+
+class DYN_TYPEROOT;
+
+/***
+*class DYN_TYPEBIND - 'dtbind': Type bind implementation
+*Purpose:
+* The class defines type bind.
+*
+***********************************************************************/
+
+class DYN_TYPEBIND : public DEFN_TYPEBIND
+{
+ friend class DYN_TYPEMEMBERS;
+
+public:
+ DYN_TYPEBIND();
+ nonvirt TIPERROR Init(BLK_MGR *pblkmgr, DYN_TYPEROOT *pdtroot);
+
+ // overridden methods
+ virtual ~DYN_TYPEBIND();
+ virtual LPVOID QueryProtocol(LPOLESTR szInterfaceName);
+ virtual VOID AddRef();
+ virtual VOID Release();
+
+ virtual TIPERROR GetTypeInfo(TYPEINFO **lplptinfo);
+ virtual TYPEKIND GetTypeKind();
+ virtual USHORT GetCbSize();
+ virtual USHORT GetAlignment();
+ virtual USHORT GetCbSizeVft();
+ virtual LONG GetOPvft();
+
+ virtual TIPERROR BindDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind);
+
+ virtual TIPERROR BindTypeDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind);
+
+ virtual TIPERROR BindDefnProjLevelStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ EXBIND *pexbind);
+
+ virtual TIPERROR BindTypeDefnProjLevelStr(LPSTR szName,
+ UINT, // fuInvokeKind: unused
+ ACCESS access,
+ ACCESS accessProj,
+ EXBIND *pexbind);
+
+
+
+ // introduced methods
+ nonvirt VOID AddInternalRef();
+ nonvirt VOID RelInternalRef();
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt BOOL IsValid() const;
+ nonvirt TIPERROR BuildBindNameTable();
+
+ nonvirt TIPERROR BindIdDefn(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind);
+
+ nonvirt HVAR_DEFN HvdefnPredeclared();
+ nonvirt TYPE_DATA *Ptdata();
+
+ nonvirt TIPERROR BindDefnCur(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind);
+
+ nonvirt DYN_BINDNAME_TABLE *Pdbindnametbl();
+ nonvirt DYN_TYPEMEMBERS *Pdtmbrs() const;
+ nonvirt DYN_TYPEROOT *Pdtroot() const;
+ nonvirt BOOL IsBeingLaidOut();
+
+ // Public data members
+ static LPOLESTR szProtocolName;
+ static LPSTR szBaseName;
+
+ static CONSTDATA UINT oDbindnametbl;
+
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebShowState(UINT uLevel) const;
+#else //!ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+#endif //!ID_DEBUG
+
+protected:
+ nonvirt VOID Invalidate();
+ nonvirt TIPERROR BindBase(BOOL fWantType,
+ HVAR_DEFN hvdefnBase,
+ UINT oBase,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind,
+ GenericTypeLibOLE *pgtlibole);
+
+private:
+ DYN_TYPEROOT *m_pdtroot;
+
+ // following bitfields pack into single USHORT
+ BOOL m_isProtocol:1;
+ BOOL m_isBeingLaidOut:1;
+ USHORT undone:14;
+
+ USHORT m_cbSize; // instance size (top-level)
+ USHORT m_cbAlignment; // alignment
+ LONG m_oPvft; // offset of primary vft.
+ USHORT m_cbPvft; // size of primary vft.
+ sHCHUNK m_hvtdPrimary;
+
+ // DYN_BINDNAME_TABLE embedded instance
+ DYN_BINDNAME_TABLE m_dbindnametbl;
+
+ // size of the data member block within a basic class
+ USHORT m_cbSizeDataMembers;
+
+#ifdef DYN_TYPEBIND_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+
+/***
+*PUBLIC DYN_TYPEBIND::IsBeingLaidOut.
+*Purpose:
+* returns TRUE if the modules is being laid out.
+*
+*
+***********************************************************************/
+
+inline BOOL DYN_TYPEBIND::IsBeingLaidOut()
+{
+ return (BOOL) m_isBeingLaidOut;
+}
+
+/***
+*PUBLIC DYN_TYPEBIND::Pbindnametbl - accessor for BINDNAME_TABLE.
+*Purpose:
+* Gets BINDNAME_TABLE ptr.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* BINDNAME_TABLE *
+*
+***********************************************************************/
+
+inline DYN_BINDNAME_TABLE *DYN_TYPEBIND::Pdbindnametbl()
+{
+ return &m_dbindnametbl;
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::Invalidate - Invalidate.
+*Purpose:
+* Invalidate by deferring to contained binding table.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+inline VOID DYN_TYPEBIND::Invalidate()
+{
+ m_dbindnametbl.ReleaseTable();
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::Pdtroot - accessor for DYN_TYPEROOT.
+*Purpose:
+* Gets containing DYN_TYPEROOT.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* DYN_TYPEROOT *
+*
+***********************************************************************/
+
+inline DYN_TYPEROOT *DYN_TYPEBIND::Pdtroot() const
+{
+ return m_pdtroot;
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::GetCbSizePvft - get size of vft
+*Purpose:
+* Returns the size of the primary virtual function table.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns size in bytes.
+*
+***********************************************************************/
+
+inline USHORT DYN_TYPEBIND::GetCbSizeVft()
+{
+ return m_cbPvft;
+}
+
+
+/***
+*PUBLIC DYN_TYPEBIND::GetOPvft - get offset of primary vft
+*Purpose:
+* Returns the offset of the primary vft. This is
+* -1 if no virtual function table exists.
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns offset or -1.
+*
+***********************************************************************/
+
+inline LONG DYN_TYPEBIND::GetOPvft()
+{
+ return m_oPvft;
+}
+
+
+#endif // ! DYN_TYPEBIND_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dtmbrs.cxx b/private/oleauto/src/typelib/dtmbrs.cxx
new file mode 100644
index 000000000..a48b95b01
--- /dev/null
+++ b/private/oleauto/src/typelib/dtmbrs.cxx
@@ -0,0 +1,3285 @@
+/***
+*dtmbrs.cxx - DYN_TYPEMEMBERS
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This is the interface for DYN_TYPEMEMBERS (Silver implementation
+* of the TYPEMEMBERS protocol).
+* Also provides implementation of "list" protocol used
+* by TYPEMEMBERS (in the form of macros).
+*
+*Revision History:
+*
+* 05-Mar-91 ilanc: Created.
+* 11-Mar-91 ilanc: Deleted constructor definition (not needed).
+* 03-Sep-91 ilanc: Reset DYN_TYPEMEMBERS::m_szDocumentation in Read.
+* 19-Sep-91 ilanc: Added GetMemberInfoOfHmember/HlnamOfHmember
+* 17-Oct-91 ilanc: Implement <LIST>::SetAtPosition
+* 03-Mar-92 ilanc: Init embedded DYN_TYPEBIND with pdtroot as well.
+* 10-Apr-92 alanc: MakeLaidOut now builds bind table
+* 12-Apr-92 ilanc: DebCheckState impl
+* 16-Apr-92 ilanc: Set isBeingLaidOut at outset of Layout()
+* so that if ConstructMemberLists() calls
+* back into TYPECOMPILER (e.g. while evaling a
+* const expr) we can do the right thing.
+* 05-May-92 ilanc: Fixed LayoutDataMembers -- don't alloc
+* instance memory for const datamembers.
+* 02-Jul-92 w-peterh: merged data member/type list in tdata
+* 10-Jul-92 w-peterh: added layout of nested types
+* 30-Jul-92 w-peterh: flag as being laid out before constants are evaled
+* 11-Aug-92 w-peterh: set ptrkindofUDT()
+* 18-Aug-92 w-peterh: only assign hmembers if they are required
+* 15-Nov-92 RajivK: added GetSize and DebGetSize
+* 18-Jan-93 w-peterh: use new tdesckind enum
+* 01-Mar-93 w-peterh: remove named base classes
+* layout OLE virtual functions
+* layout OLE bases
+* layout arrays correctly
+* layout OLE properties correctly
+* 02-Mar-93 w-peterh: fix layout of TKIND_ENUM
+* 24-Mar-93 dougf: Add TDESCKIND_LPSTR to GetSizeAlignmentOfHtdefnNonUdt.
+* 30-Apr-93 w-jeffc: made DEFN data members private
+*
+*Implementation Notes:
+* Contains a TYPE_DATA object that manages DEFNs with a Silver
+* Block Manager (that in turn defers to a Silver Heap Mgr).
+* Note that the TYPE_DATA object is embedded in the DYN_TYPEMEMBERS
+* which implies that the DYN_TYPEMEMBERS is itself embedded
+* in a Silver Heap. The allocating DYN_TYPEINFO (or more
+* precisely DYN_TYPEROOT) is responsible for allocating
+* the DYN_TYPEMEMBERS in a Silver Heap (and likewise deallocating).
+*
+* POSITION is implemented as a VAR_DEFN handle for OOB_VARINFOLIST
+* and FUNC_DEFN handle for OOB_FUNCINFOLIST.
+* Note: currently list mods can't be made while there are any
+* outstanding iterations. Each list has a count of active iterators,
+* incremented by BeginIterate() and decremented by EndIterate().
+*
+*****************************************************************************/
+
+#include "typelib.hxx"
+#include "silver.hxx"
+#include "mem.hxx"
+#include "cltypes.hxx"
+#include "blkmgr.hxx"
+#include "entrymgr.hxx"
+#define DTMBRS_VTABLE // export vtable
+#include "dtmbrs.hxx"
+#include "clutil.hxx"
+#include "tdata.hxx"
+#include "gdtinfo.hxx"
+#include "dtbind.hxx"
+#include "impmgr.hxx"
+#include "exbind.hxx" // for EXBIND
+#include "nammgr.hxx" // for NAMMGR
+
+#include <malloc.h>
+#include "xstring.h"
+#include <stdlib.h>
+
+
+#pragma hdrstop(RTPCHNAME)
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+static char szOleDtmbrsCxx[] = __FILE__;
+char szOleDtmbrs[] = __FILE__;
+#define SZ_FILE_NAME szOleDtmbrsCxx
+#else
+static char szDtmbrsCxx[] = __FILE__;
+#define SZ_FILE_NAME szDtmbrsCxx
+#endif
+#endif //ID_DEBUG
+
+#define CBMAX_FARPTR_HEAPREQ 0xFFE8
+
+CONSTDATA UINT DYN_TYPEMEMBERS::oDtbind = offsetof(DYN_TYPEMEMBERS, m_dtbind);
+
+// Defined in gdtinfo.cxx
+extern TIPERROR IsFunkyDispinterface(GEN_DTINFO *pgdtinfo,
+ BOOL *pisFunkyDispinterface);
+extern HRESULT GetTypeInfoOfImplType(GEN_DTINFO *pgdtinfo,
+ UINT uImplType,
+ ITypeInfoA **pptinfo);
+
+
+
+// This enum defines the layout order of properties
+// NOTE: this should only be used by this file.
+enum PROPKIND {
+ PROPERTY_Method = 0,
+ PROPERTY_Get,
+ PROPERTY_Let,
+ PROPERTY_Set,
+};
+
+
+
+// Maps INVOKEKIND --> PROPKIND
+inline PropkindOfInvokekind(INVOKEKIND invokekind)
+{
+ switch (invokekind) {
+ case INVOKE_FUNC:
+ return PROPERTY_Method;
+ case INVOKE_PROPERTYGET:
+ return PROPERTY_Get;
+ case INVOKE_PROPERTYPUT:
+ return PROPERTY_Let;
+ case INVOKE_PROPERTYPUTREF:
+ return PROPERTY_Set;
+ default:
+ DebHalt("bad invokekind.");
+ return INVOKE_FUNC;
+ }
+}
+
+// Local struct used to link together properties by name
+// per module.
+// Note: lookup is by name.
+//
+struct PROPERTY_NODE
+{
+ PROPERTY_NODE *m_pnodeNext;
+ HLNAM m_hlnamProperty; // lookup key
+ HMEMBER m_hmemberProperty;
+ HFUNC_DEFN m_rghfdefn[PROPERTY_Set+1]; // for tracking properties.
+
+#pragma code_seg(CS_CREATE)
+ // ctor
+ PROPERTY_NODE() {
+ UINT ihfdefn;
+ m_pnodeNext = NULL;
+ m_hlnamProperty = HLNAM_Nil;
+ m_hmemberProperty = HMEMBER_Nil;
+ for (ihfdefn = PROPERTY_Method;
+ ihfdefn < PROPERTY_Set+1;
+ ihfdefn++) {
+ m_rghfdefn[ihfdefn] = HFUNCDEFN_Nil;
+ }
+ }
+
+ // dtor
+ ~PROPERTY_NODE() {
+ if (m_pnodeNext != NULL) {
+ m_pnodeNext->PROPERTY_NODE::~PROPERTY_NODE();
+ MemFree(m_pnodeNext);
+ }
+ }
+
+ // Lookup method
+ PROPERTY_NODE *PnodeOfHlnam(HLNAM hlnam) {
+ if (hlnam == m_hlnamProperty)
+ return this;
+ else if (m_pnodeNext != NULL)
+ return m_pnodeNext->PnodeOfHlnam(hlnam);
+ else
+ return NULL;
+ }
+
+ // Get next
+ PROPERTY_NODE *PnodeNext() {
+ return m_pnodeNext;
+ }
+#pragma code_seg()
+};
+
+#pragma code_seg(CS_CREATE)
+/***
+*TIPERROR VerifyTwoProperties
+*Purpose:
+* Verifies that two properties have compatible formal params.
+*
+*Implementation Notes:
+*
+*Entry:
+* pdtroot The defining type (IN).
+* pnodeProperty Pointer to a property node (IN).
+* propkind1
+* propkind2 Must not be PROPERTY_Get
+*
+*Exit:
+* TIPERROR
+***********************************************************************/
+
+TIPERROR VerifyTwoProperties(DYN_TYPEROOT *pdtroot,
+ TYPE_DATA *ptdata,
+ HFUNC_DEFN hfdefn1,
+ PROPKIND propkind1,
+ HFUNC_DEFN hfdefn2,
+ PROPKIND propkind2)
+{
+ FUNC_TYPE_DEFN ftdefn1, ftdefn2;
+ HPARAM_DEFN hparamdefn1, hparamdefn2;
+ PARAM_DEFN *qparamdefn1, *qparamdefn2;
+ TYPE_DEFN *qtdefn;
+ BOOL fEqual;
+ TIPERROR err = TIPERR_None;
+ BOOL fObject = FALSE;
+ ITypeInfoA *ptinfo = NULL;
+
+ UINT i;
+ UINT cArgs;
+
+ DebAssert(propkind2 != PROPERTY_Get, "bad propkind.");
+
+ ftdefn1 = ptdata->QfdefnOfHfdefn(hfdefn1)->m_ftdefn;
+ ftdefn2 = ptdata->QfdefnOfHfdefn(hfdefn2)->m_ftdefn;
+ hparamdefn1 = (HPARAM_DEFN)ftdefn1.m_hdefnFormalFirst;
+ hparamdefn2 = (HPARAM_DEFN)ftdefn2.m_hdefnFormalFirst;
+
+ // Walk the parameters...and ignore the LCID/RETVAL parameters
+ // if we're in basic. But look at them if we're in OLE.
+ //
+ cArgs = ptdata->QfdefnOfHfdefn(hfdefn1)->CArgs();
+
+ if (propkind1 != PROPERTY_Get) {
+ // if comparing Let with Set, then we don't want to look at the last arg
+ DebAssert(propkind1 == PROPERTY_Let && propkind2 == PROPERTY_Set, "");
+ DebAssert(cArgs > 0, "caller should check for this");
+ cArgs--;
+ }
+
+ for (i=0; i < cArgs; i++) {
+ qparamdefn1 = ptdata->QparamdefnOfIndex(hparamdefn1, i);
+
+ // If this is a retval parameter, we're done looking.
+ if (i == cArgs - 1 && propkind1 == PROPERTY_Get) {
+ qtdefn = qparamdefn1->IsSimpleType()
+ ? qparamdefn1->QtdefnOfSimpleType()
+ : ptdata->QtdefnOfHtdefn(qparamdefn1->Htdefn());
+
+ if (qtdefn->IsRetval()) {
+ break;
+ }
+ }
+
+ qparamdefn2 = ptdata->QparamdefnOfIndex(hparamdefn2, i);
+
+ // Now compare names...
+ if (qparamdefn1->Hlnam() != qparamdefn2->Hlnam()) {
+ err = TIPERR_InconsistentPropFuncs;
+ goto Error;
+ }
+ // ... and types
+ IfErrGo(EquivTypeDefns(ptdata,
+ qparamdefn1->IsSimpleType(),
+ qparamdefn1->Htdefn(),
+ ptdata,
+ qparamdefn2->IsSimpleType(),
+ qparamdefn2->Htdefn(),
+ FEQUIVIGNORE_NULL,
+ &fEqual));
+ if (!fEqual) {
+ err = TIPERR_InconsistentPropFuncs;
+ goto Error;
+ }
+ } // for
+
+ if ((propkind1 == PROPERTY_Get) && (propkind2 == PROPERTY_Let)) {
+ // Note that at this point we know that there must be one more
+ // PARAM_DEFN left to process in the PROPERTY_Let.
+ // In the OB case, hparamdefn2 will reference the last param
+ // of the proplet since we used a while loop to iterate over
+ // the propget's paramlist.
+ // In the OLE case we have to explicitly get proplet's last
+ // param using QparamdefnOfIndex().
+ //
+ DebAssert(ptdata->QfdefnOfHfdefn(hfdefn1)->CArgs()+1
+ == ptdata->QfdefnOfHfdefn(hfdefn2)->CArgs(),
+ "whoops! Let should have one more param than Get.");
+
+ // Last param for proplet is at ordinal CArgs-1, 0-based.
+ qparamdefn2 = ptdata->QparamdefnOfIndex(
+ hparamdefn2,
+ ptdata->QfdefnOfHfdefn(hfdefn2)
+ ->CArgsUnmunged()-1);
+
+ // So far so good. What about return type of Get and last param of Let?
+ // Note we ignore byref vs. byval of the return type vs. the last param.
+ //
+ BOOL fIsSimpleType1;
+ HTYPE_DEFN htdefn1;
+
+ // assume to compare against the return type of the Get
+ fIsSimpleType1 = ftdefn1.IsSimpleTypeResult();
+ htdefn1 = ftdefn1.HtdefnResult();
+
+ TYPE_DEFN * qtdefn1;
+ // if a retval param is given on the propget, compare against this type
+ // instead of against the propget return type
+ qtdefn1 = ptdata->QtdefnResultOfHfdefn(hfdefn1);
+ DebAssert(qtdefn1 != NULL, "return value should have been set");
+ if (qtdefn1->IsRetval()) {
+ // Retval param for propget is at ordinal CArgs()-1, 0-based.
+ qparamdefn1 = ptdata->QparamdefnOfIndex(
+ hparamdefn1,
+ ptdata->QfdefnOfHfdefn(hfdefn1)->CArgsUnmunged()-1);
+ fIsSimpleType1 = qparamdefn1->IsSimpleType();
+ htdefn1 = qparamdefn1->Htdefn();
+ }
+
+ // Special case, if the get is an object or a typeinfo,
+ // the let case should require a variant.
+ //
+ qtdefn = fIsSimpleType1 ? (TYPE_DEFN *)&htdefn1
+ : ptdata->QtdefnOfHtdefn(htdefn1);
+
+ // Only do the following check if we're dealing with
+ // an object of some sort...not for an ENUM or RECORD
+ // or whatnot.
+ //
+ if (qtdefn->Tdesckind() == TDESCKIND_UserDefined) {
+ ITypeLibA *ptlib;
+ UINT ityp;
+ TYPEATTR *ptypeattr;
+ TYPEKIND tkind;
+
+ IfErrRet(ptdata->Pimpmgr()->GetTypeInfo(qtdefn->Himptype(),
+ DEP_None,
+ &ptinfo));
+
+ // Try to get the typekind using the GetTypeInfoType API
+ // to avoid forward typeinfo references.
+ //
+ if (ptinfo->GetContainingTypeLib(&ptlib, &ityp) == NOERROR) {
+ err = TiperrOfHresult(ptlib->GetTypeInfoType(ityp, &tkind));
+
+ ptlib->Release();
+
+ if (err != TIPERR_None) {
+ goto Error;
+ }
+ }
+
+ // If the call to getcontainingtypelib failed, we know we're
+ // not dealing with another typeinfo in this typelib, so we
+ // are free to call GetTypeAttr.
+ //
+ else {
+ IfErrGo(TiperrOfHresult(ptinfo->GetTypeAttr(&ptypeattr)));
+
+ tkind = ptypeattr->typekind;
+ ptinfo->ReleaseTypeAttr(ptypeattr);
+ }
+
+ ptinfo->Release();
+ ptinfo = NULL;
+
+ fObject = tkind == TKIND_COCLASS
+ || tkind == TKIND_DISPATCH
+ || tkind == TKIND_INTERFACE;
+ }
+
+ fEqual = FALSE;
+ if (qtdefn->Tdesckind() == TDESCKIND_Object
+ || fObject
+ ) {
+
+ // Make sure the input parameter is a variant.
+ qtdefn = qparamdefn2->IsSimpleType()
+ ? qparamdefn2->QtdefnOfSimpleType()
+ : ptdata->QtdefnOfHtdefn(qparamdefn2->Htdefn());
+
+ if (qtdefn->Tdesckind() == TDESCKIND_Value) {
+ fEqual = TRUE;
+ }
+ }
+
+ if (!fEqual) {
+ IfErrGo(EquivTypeDefnsIgnoreByRef(ptdata,
+ fIsSimpleType1,
+ htdefn1,
+ ptdata,
+ qparamdefn2->IsSimpleType(),
+ qparamdefn2->Htdefn(),
+ FEQUIVIGNORE_HasLcid,
+ &fEqual,
+ TRUE));
+ if (!fEqual) {
+ err = TIPERR_InconsistentPropFuncs;
+ goto Error;
+ }
+ }
+ }
+ return TIPERR_None;
+
+Error:
+ if (ptinfo != NULL) {
+ ptinfo->Release();
+ }
+
+ return err;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*TIPERROR VerifyProperties
+*Purpose:
+* Verifies that properties get/let/set have compatible formal params.
+*
+*Implementation Notes:
+*
+*Entry:
+* pdtroot The defining type (IN).
+* pnodeProperty Pointer to a property node (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR VerifyProperties(DYN_TYPEROOT *pdtroot, PROPERTY_NODE *pnodeProperty)
+{
+ HFUNC_DEFN hfdefnGet = HFUNCDEFN_Nil;
+ HFUNC_DEFN hfdefnLet = HFUNCDEFN_Nil;
+ HFUNC_DEFN hfdefnSet = HFUNCDEFN_Nil;
+ HFUNC_DEFN hfdefnOther, hfdefnErr;
+ FUNC_DEFN *qfdefnGet, *qfdefnLet, *qfdefnSet;
+ UINT cArgsGet, cArgsLet, cArgsSet, cArgsOther;
+ TYPE_DATA *ptdata;
+ PROPKIND propkindOther;
+ TIPERROR err = TIPERR_None;
+
+ ptdata = pdtroot->Pdtmbrs()->Ptdata();
+
+ // PROPERTY_Get info
+ if ((hfdefnGet = pnodeProperty->m_rghfdefn[PROPERTY_Get]) != HFUNCDEFN_Nil) {
+ hfdefnErr = hfdefnGet;
+ qfdefnGet = ptdata->QfdefnOfHfdefn(hfdefnGet);
+
+
+ // Ensure a function and has no optional params
+ if (qfdefnGet->IsSub()
+ ) {
+ err = TIPERR_InconsistentPropFuncs;
+ goto Error;
+ }
+ cArgsGet = qfdefnGet->CArgs(); // ignore LCID/RETVAL in count
+ }
+
+ // PROPERTY_Let info
+ if ((hfdefnLet = pnodeProperty->m_rghfdefn[PROPERTY_Let]) != HFUNCDEFN_Nil) {
+ hfdefnErr = hfdefnLet;
+ qfdefnLet = ptdata->QfdefnOfHfdefn(hfdefnLet);
+
+
+ // Ensure no optional params and ensure a sub or it returns a hresult
+ if (
+ !qfdefnLet->IsHresultSub()) {
+
+ err = TIPERR_InconsistentPropFuncs;
+ goto Error;
+ }
+
+ cArgsLet = qfdefnLet->CArgs(); // ignore LCID/RETVAL in count
+ if (hfdefnGet != HFUNCDEFN_Nil) {
+ // Should have one more arg than Get
+ if (cArgsLet != cArgsGet+1) {
+ err = TIPERR_InconsistentPropFuncs;
+ goto Error;
+ }
+ IfErrGo(VerifyTwoProperties(pdtroot,
+ ptdata,
+ hfdefnGet,
+ PROPERTY_Get,
+ hfdefnLet,
+ PROPERTY_Let));
+ } // if hfdefnGet
+ } // if Let
+
+ // Get and Let are ok -- finally test set.
+ // PROPERTY_Set info
+ //
+ if ((hfdefnSet = pnodeProperty->m_rghfdefn[PROPERTY_Set]) != HFUNCDEFN_Nil) {
+ hfdefnErr = hfdefnSet;
+ qfdefnSet = ptdata->QfdefnOfHfdefn(hfdefnSet);
+
+
+ // Ensure no optional params and ensure a sub or it has a [retval] arg
+ if (
+ !qfdefnSet->IsHresultSub()) {
+
+ err = TIPERR_InconsistentPropFuncs;
+ goto Error;
+ }
+
+ if (hfdefnGet != HFUNCDEFN_Nil) {
+ hfdefnOther = hfdefnGet;
+ propkindOther = PROPERTY_Get;
+ cArgsOther = cArgsGet;
+ }
+ else if (hfdefnLet != HFUNCDEFN_Nil) {
+ hfdefnOther = hfdefnLet;
+ propkindOther = PROPERTY_Let;
+ cArgsOther = cArgsLet-1; // normalize to cArgsGet
+ }
+ else { // no get or let -- just return
+ return TIPERR_None;
+ }
+ cArgsSet = qfdefnSet->CArgs(); // ignore LCID/RETVAL in count
+
+ // Should have one more arg than Get or Let
+ if (cArgsSet != cArgsOther+1) {
+ err = TIPERR_InconsistentPropFuncs;
+ goto Error;
+ }
+ IfErrGo(VerifyTwoProperties(pdtroot,
+ ptdata,
+ hfdefnOther,
+ propkindOther,
+ hfdefnSet,
+ PROPERTY_Set));
+ } // if set
+ return TIPERR_None;
+
+Error:
+ return err;
+}
+#pragma code_seg()
+
+// Class methods - DYN_TYPEMEMBERS
+//
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::Destructor - Destruct an instance.
+*Purpose:
+* Destructs a DYN_TYPEMEMBERS instance.
+*
+*Implementation Notes:
+* Destructs the three lists, TYPEDESC of the Pvft and frees
+* the doc string.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE )
+DYN_TYPEMEMBERS::~DYN_TYPEMEMBERS()
+{
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS:: AddRef
+*Purpose:
+* Implementation of AddRef method.
+*
+*Implementation Notes:
+* Defers to containing DYN_TYPEROOT (which is responsible
+* for tracking DYN_TYPEMEMBERS references).
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID DYN_TYPEMEMBERS::AddRef()
+{
+ m_pdtroot->AddRefDtmbrs();
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::Release
+*Purpose:
+* Implementation of Release method.
+*
+*Implementation Notes:
+* Defers to containing DYN_TYPEROOT (which is responsible
+* for tracking DYN_TYPEMEMBERS references).
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID DYN_TYPEMEMBERS::Release()
+{
+ // note: do not need to release cached pstlib since
+ // it wasn't obtained through GetContainingTypeLib
+
+ m_pdtroot->ReleaseDtmbrs();
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS:: AddInternalRef
+*Purpose:
+* Implementation of AddInternalRef method.
+*
+*Implementation Notes:
+* Defers to containing GEN_DTINFO.
+* CONSIDER: implementing a separately managed internal refcount
+* for DYN_TYPEMEMBERS. This would enable the
+* separate *unloading* of DYN_TYPEMEMBERS/DYN_TYPEBIND.
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID DYN_TYPEMEMBERS::AddInternalRef()
+{
+ m_pdtroot->Pgdtinfo()->AddInternalRef();
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::RelInternalRef
+*Purpose:
+* Implementation of RelInternalRef method.
+*
+*Implementation Notes:
+* Defers to containing GEN_DTINFO.
+* CONSIDER: implementing a separately managed internal refcount
+* for DYN_TYPEMEMBERS. This would enable the
+* separate *unloading* of DYN_TYPEMEMBERS/DYN_TYPEBIND.
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID DYN_TYPEMEMBERS::RelInternalRef()
+{
+ m_pdtroot->Pgdtinfo()->RelInternalRef();
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::Constructor - Construct an instance.
+*Purpose:
+* Constructs a DYN_TYPEMEMBERS instance.
+*
+*Implementation Notes:
+* Sets all contained pointers to sub-objects to NULL.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+DYN_TYPEMEMBERS::DYN_TYPEMEMBERS()
+{
+ m_pdtroot= NULL;
+ m_uFlags = 0; // m_isLaidOut, m_nestDepth
+ m_pnammgr = NULL;
+ m_pentmgr = NULL;
+ m_pimpmgr = NULL;
+ m_pgtlibole = NULL;
+ m_uOffsetOfNextStaticVar=0;
+
+ m_ptinfoCopy = NULL;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::Initializer - initialize an instance.
+*Purpose:
+* initializes a DYN_TYPEMEMBERS instance.
+*
+*Implementation Notes:
+*
+*Entry:
+* psheapgmr - Pointer to SHEAP_MGR (IN).
+* pdtroot - Pointer to a DYN_TYPEROOT (IN).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_TYPEMEMBERS::Init(SHEAP_MGR *psheapmgr, DYN_TYPEROOT *pdtroot)
+{
+ TIPERROR err;
+
+ DebAssert(pdtroot != NULL, "bad param.");
+
+ m_pdtroot = pdtroot;
+
+ // Get NAMMGR
+ IfErrRet(pdtroot->GetNamMgr(&m_pnammgr));
+
+ // Get ENTRYMGR
+ IfErrRet(m_pdtroot->GetEntMgr(&m_pentmgr));
+
+ // Get IMPMGR
+ IfErrRet(m_pdtroot->GetImpMgr(&m_pimpmgr));
+
+ // Cache the type's project.
+ // NOTE: this doesn't bump ref count.
+ //
+ m_pgtlibole = m_pdtroot->Pgdtinfo()->PgtlibOleContaining();
+
+ IfErrRet(m_tdata.Init(psheapmgr, pdtroot));
+ IfErrRet(m_dtbind.Init(&(m_tdata.m_blkmgr), pdtroot));
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::GetDefnTypeBind - Get DEFN_TYPEBIND
+*Purpose:
+* Get (embedded) DEFN_TYPEBIND
+*
+*Implementation Notes:
+* Ensures that class is in at least CS_SEMIDECLARED state, so
+* that MakeLaidOut() can do its thing.
+*
+* Bumps DYN_TYPEMEMBERS ref count.
+* Note: client must Release() the TYPEBIND.
+*
+*Entry:
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+TIPERROR DYN_TYPEMEMBERS::GetDefnTypeBind(DEFN_TYPEBIND **ppdfntbind)
+{
+ TIPERROR err = TIPERR_None;
+
+ DebAssert(ppdfntbind != NULL, "bad param.");
+
+ DebAssert(m_pdtroot->CompState() >= CS_DECLARED,
+ "GetDefnTypeBind: bad compstate");
+
+ AddRef();
+ *ppdfntbind = Pdtbind();
+ return TIPERR_None;
+}
+
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::MakeLaidOut
+*Purpose:
+* Lays out the class
+*
+*Implementation Notes:
+* Bumps DYN_TYPEMEMBERS ref count.
+* Note: client must Release() the TYPEBIND.
+*
+*Entry:
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEMEMBERS::MakeLaidOut()
+{
+ COMPSTATE compstate;
+
+ TIPERROR err;
+
+ compstate = m_pdtroot->CompState();
+
+ DebAssert(compstate >= CS_SEMIDECLARED,
+ "no binding table yet.");
+
+ DebAssert(m_dtbind.Pdbindnametbl()->IsValid(),
+ "no binding table yet.");
+
+ if (m_dtbind.m_isBeingLaidOut)
+ return TIPERR_CircularType;
+
+ if (!m_isLaidOut) {
+ // (0) Flag DYN_TYPEBIND as being laid out
+ // so that circular definitions can be detected.
+ //
+ m_dtbind.m_isBeingLaidOut = TRUE;
+
+
+ // Now finally lay it out...
+ IfErrGo(Layout());
+ m_dtbind.m_isBeingLaidOut = FALSE;
+ m_isLaidOut = TRUE;
+ }
+
+ DebAssert(m_dtbind.IsValid(), "bad DYN_TYPEBIND.");
+
+ return TIPERR_None;
+
+Error:
+
+ m_dtbind.m_isBeingLaidOut = FALSE;
+
+
+ // undo side effects of laying out the class
+ m_pentmgr->Decompile(compstate);
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::GetTypeKind - Get type's kind.
+*Purpose:
+* Get type's kind.
+*
+*Implementation Notes:
+* Defers to containing TYPEINFO for TYPEKIND.
+*
+*Entry:
+*
+*Exit:
+* TYPEKIND
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TYPEKIND DYN_TYPEMEMBERS::GetTypeKind()
+{
+ DebAssert(m_pdtroot->Pgdtinfo() != NULL, "bad TYPEINFO.");
+
+ return m_pdtroot->Pgdtinfo()->GetTypeKind();
+}
+#pragma code_seg( )
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::IsLaidOut - Is type laidout?
+*Purpose:
+* Tests whether type definition is laid out (i.e. compiled).
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* BOOL
+*
+***********************************************************************/
+
+BOOL DYN_TYPEMEMBERS::IsLaidOut()
+{
+ return (BOOL)m_isLaidOut;
+}
+
+
+
+
+
+
+
+
+
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::AllocHmembers - Allocate HMEMBERs.
+*Purpose:
+* Allocate HMEMBERs for each method in class and
+* for Constructor/Destructor/Assign/Copy functions for records
+* VBA2: handles event handlers:
+* For all event sources in base class (form template) allocate
+* pvft in the instance. This is needed for E&C, i.e. so that
+* (private) event handlers can be added dynamically.
+* Generates an error if signature doesn't match that of
+* handler defined in event set/source.
+* Calls NewNativeEntry with opvft, which is used to generate
+* adjustment thunk for invoking the handler.
+* Adds an override entry to override list for the vtabledefn.
+*
+* Like LayoutDataMembers Issues error if class attempts to override
+* name introduced in base class.
+*
+*Implementation Notes:
+* uses:
+* NewNativeEntry() for Basic functions, i.e. functions
+* that aren't implemented in a DLL.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CREATE )
+TIPERROR DYN_TYPEMEMBERS::AllocHmembers()
+{
+ HFUNC_DEFN hfdefn, hfdefnNext;
+ FUNC_DEFN *qfdefn;
+ ENTRYMGR *pentrymgr;
+ HMEMBER hmember;
+
+ INVOKEKIND invokekind;
+ PROPERTY_NODE *pnodeList, *pnodeProperty;
+ HLNAM hlnamProperty;
+ TYPEKIND tkind = GetTypeKind();
+ PROPERTY_NODE *pnodeCur;
+ TIPERROR err = TIPERR_None;
+ ITypeInfoA *ptinfoBase = NULL;
+
+ UINT iFunc, iVar;
+
+ HMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+
+ // get entrymgr to allocate hmembers in
+ IfErrRet(m_pdtroot->GetEntMgr(&pentrymgr));
+
+ // Note: hmembers for nested types are allocated
+ // in the main layout loop, namely LayoutDataMembers.
+
+
+ // We iterate twice over the functions -- the first
+ // time we're just interested in laying out property functions,
+ // which must be laid out contiguously and then the second
+ // time we layout the public functions. Finally, we layout the
+ // private functions.
+ //
+ DebAssert((PROPERTY_Method == 0) &&
+ (PROPERTY_Get == PROPERTY_Method+1) &&
+ (PROPERTY_Let == PROPERTY_Get+1) &&
+ (PROPERTY_Set == PROPERTY_Let+1),
+ "whoops! bad PROPKIND enum.");
+
+ // (1) Alloc hmembers for properties and verify udts in function.
+ hfdefn = m_tdata.HfdefnFirstAvailMeth();
+ pnodeList = NULL;
+
+ iFunc = 0;
+
+ // Iterate over func defn list
+ while (hfdefn != HFUNCDEFN_Nil) {
+
+ qfdefn = m_tdata.QfdefnOfHfdefn(hfdefn);
+
+
+ // for properties only, where the hmember has not yet been chosen
+ if (!qfdefn->IsMethod()) {
+ invokekind = qfdefn->InvokeKind();
+ hlnamProperty = qfdefn->Hlnam();
+ pnodeProperty = (pnodeList != NULL) ?
+ pnodeList->PnodeOfHlnam(hlnamProperty) :
+ NULL;
+ if (pnodeProperty == NULL) {
+ // need to create new node and cons it to list.
+ IfNullMemErr(pnodeProperty = MemNew(PROPERTY_NODE));
+ ::new (pnodeProperty) PROPERTY_NODE;
+ pnodeProperty->m_pnodeNext = pnodeList;
+ pnodeProperty->m_hlnamProperty = hlnamProperty;
+
+ // save first hfdefn in defn list so ole can use it later
+ // in allocating the hmember
+ pnodeProperty->m_hmemberProperty = (HMEMBER) iFunc;
+
+ pnodeList = pnodeProperty;
+ }
+ // Getting to semi-declared, i.e. construction of the binding
+ // tables will have already ensured unambiguous props.
+ //
+ DebAssert(
+ pnodeProperty->
+ m_rghfdefn[PropkindOfInvokekind(invokekind)] == HFUNCDEFN_Nil,
+ "whoops! ambiguity");
+
+ // save hfdefn of property
+ pnodeProperty->
+ m_rghfdefn[PropkindOfInvokekind(invokekind)] = hfdefn;
+ }
+
+ iFunc++;
+
+ hfdefn = m_tdata.HfdefnNextAvailMeth(hfdefn);
+ } /* while */
+
+
+ // Ensure that formal param lists of property get/set/let are
+ // compatible -- we do this both for OB and OLE.
+ //
+ pnodeCur = pnodeList;
+ while (pnodeCur != NULL) {
+ IfErrGo(VerifyProperties(m_pdtroot, pnodeCur));
+ pnodeCur = pnodeCur->PnodeNext();
+ }
+
+
+ // Get the typeinfo of our base class, if any (used within subsequent loop)
+ if (m_tdata.CBase() > 0) { // if we have base classe(s)
+ IfErrGo(m_tdata.GetTypeInfoOfHvdefn(m_tdata.HvdefnFirstBase(),
+ &ptinfoBase,
+ NULL));
+ DebAssert(ptinfoBase != NULL, "Base not valid");
+ // NOTE: we only support single inheritance here
+ }
+
+ // (2) allocate hmembers for all public non-property functions
+ hfdefn = m_tdata.HfdefnFirstAvailMeth();
+
+ iFunc = 0;
+
+ // Iterate over func defn list
+ //
+ while (hfdefn != HFUNCDEFN_Nil) {
+ hfdefnNext = m_tdata.HfdefnNextAvailMeth(hfdefn);
+
+ qfdefn = m_tdata.QfdefnOfHfdefn(hfdefn);
+
+
+ // We don't assign hmembers for OLE types where the user has
+ // specified the ID for us
+ // NOTE explict casting to a LONG to work around C7 optimizer bug that
+ // caused -1 to go the the default case.
+ switch ((long)(qfdefn->Hmember())) {
+ case DISPID_UNKNOWN:
+ // user didn't pick the id -- we get to assign it
+ if (qfdefn->IsMethod()) {
+ // not a property function
+ // We just use the iFunc in the loword.
+ hmember = (HMEMBER)iFunc;
+ } // IsMethod()
+ else {
+ // property function -- we've already worked out
+ // the hmember.
+ DebAssert(pnodeList != NULL, "whops! where's the prop list");
+ pnodeProperty = pnodeList->PnodeOfHlnam(qfdefn->Hlnam());
+ DebAssert(pnodeProperty != NULL, "whoops! where's the prop?");
+ hmember = pnodeProperty->m_hmemberProperty;
+ DebAssert(hmember != HMEMBER_Nil, "hmember not set!");
+ } /* if */
+
+ qfdefn->SetHmember(FunctionHmemberOfOffset((USHORT)hmember,
+ m_nestDepth));
+ break;
+
+ case DISPID_VALUE:
+ if (tkind == TKIND_INTERFACE) {
+ // cache the hfdefn for value property of interface funcs for speed
+ if (m_tdata.m_hfdefnValue == HFUNCDEFN_Nil) {
+ // if not already set, set this to the hfdefn of the first
+ // function of this name (we don't care if it's a property
+ // function or not).
+ m_tdata.m_hfdefnValue = (sHFUNC_DEFN) hfdefn;
+ }
+ }
+ // fall through to check for a duplicate id
+
+ default:
+ // user picked the ID -- ensure it's not already in use by some other
+ // function in the inheritance heirarchy.
+ //
+ if (ptinfoBase != NULL) { // if we have base classe(s)
+ // see if there's a function with this hmember in the base classe(s)
+ if (ptinfoBase->GetDocumentation(qfdefn->Hmember(), NULL,
+ NULL, NULL, NULL) == NOERROR) {
+ err = TIPERR_DuplicateId;
+ goto Error;
+ }
+ }
+ } // switch
+
+ iFunc++;
+
+ hfdefn = hfdefnNext;
+ } /* while */
+
+
+ // Allocate the hmembers for the data members.
+ iVar = 0;
+
+ hmvdefn = m_tdata.HdefnFirstDataMbrNestedType();
+
+ while (hmvdefn != HMBRVARDEFN_Nil) {
+ qmvdefn = m_tdata.QmvdefnOfHmvdefn(hmvdefn);
+
+ DebAssert(qmvdefn->IsMemberVarDefn(), "Bad defn");
+
+ if (qmvdefn->Hmember() == DISPID_UNKNOWN) {
+ // Set the hmember of this data member.
+ qmvdefn->SetHmember(DataHmemberOfOffset(iVar++,
+ m_nestDepth));
+ }
+
+ hmvdefn = qmvdefn->HdefnNext();
+ }
+
+
+
+Error:
+ // free PROPERTY_NODE list
+ if (pnodeList != NULL) {
+ pnodeList->PROPERTY_NODE::~PROPERTY_NODE();
+ MemFree(pnodeList);
+ }
+ if (ptinfoBase != NULL) {
+ ptinfoBase->Release();
+ }
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::LayoutBases - Layout bases.
+*Purpose:
+* This function lays out three things within an instance:
+* 1: If not inherited, a virtual function table pointer for classes
+* 2: All inherited base classes.
+* 3: For Basic classes, a USHORT member to hold a reference count.
+*
+*Implementation Notes:
+* Only single inheritance is currently supported.
+* Note that while we support multiple bases on the base list
+* only the first one is laid out.
+*
+*Entry:
+* tkind - The kind of the type (module or class)
+* puOffset - Current offset within instance (IN/OUT).
+* puAlignment - Current alignment requirement (IN/OUT)
+*
+*Exit:
+* returns TIPERROR.
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEMEMBERS::LayoutBases(TYPEKIND tkind,
+ UINT *puOffset,
+ UINT *puAlignment)
+{
+ UINT cBase; // number of base classes.
+ HVAR_DEFN hvdefnBase; // var defn of 1st base
+ DYN_TYPEBIND *pdtbindBase = NULL; // type bind of 1st base
+ USHORT oVarBase;
+ TIPERROR err = TIPERR_None;
+ SYSKIND syskind;
+
+ MBR_VAR_DEFN *qmvdefn;
+ UINT iBase;
+
+
+ cBase = m_tdata.CBase();
+#if ID_DEBUG
+ if (tkind == TKIND_DISPATCH) {
+ DebAssert(cBase > 0, "Dispatch must derive from an interface");
+ }
+#endif
+ DebAssert(tkind == TKIND_INTERFACE ||
+ tkind == TKIND_DISPATCH ||
+ tkind == TKIND_COCLASS, "Bad module kind");
+
+ // DebAssert(cBase <= 1, "no multiple inheritance");
+
+ // offset within instance of primary interface vtable
+ m_dtbind.m_oPvft = 0;
+
+ // Check to see if any base classes have vft we can share.
+ // since base classes are sorted, just need to check
+ // if leftmost base has a vft to share.
+ //
+ if (cBase == 0) {
+ // cBase == 0, we don't have a pvft yet -- let's alloc one.
+ // allocate space for new vft.
+ //
+ DebAssert(m_pgtlibole == m_pdtroot->Pgdtinfo()->PgtlibOleContaining(),
+ "whoops! where are we now?");
+ syskind = m_pgtlibole->GetSyskind();
+ #define SYSATTR ,syskind
+ DebAssert(*puOffset == 0, "primary vft must be at offset 0");
+ *puOffset += SizeofTdesckind(TDESCKIND_Ptr SYSATTR);
+ *puAlignment = max(*puAlignment, AlignmentTdesckind(TDESCKIND_Ptr));
+ }
+
+ if (cBase > 0) {
+ // 11-Feb-93: note this means for now cBase == 1.
+ hvdefnBase = m_tdata.HvdefnFirstBase();
+ // CONSIDER: for multiple inheritance, iterate over all base classes.
+
+ // Note we need an extra variable here since LayoutVarOfHvdefn
+ // has to be passed a USHORT rather than a UINT (which is
+ // what *puOffset is).
+ //
+ oVarBase = (USHORT)*puOffset;
+
+ // CONSIDER w-peterh 17-Feb-1993 : check to ensure that the
+ // typekind of the base is consistent with the typekind of this
+
+ // layout base
+ IfErrRet(LayoutVarOfHvdefn(tkind,
+ hvdefnBase,
+ &oVarBase,
+ puAlignment,
+ FALSE, // not a stack frame.
+ 0)); // ignored.
+
+ // Update output param.
+ *puOffset = oVarBase;
+
+ // Set the hmember of each base class.
+ //
+ for (iBase = 0;
+ hvdefnBase != HVARDEFN_Nil;
+ hvdefnBase = (HVAR_DEFN)qmvdefn->HdefnNext(), iBase++) {
+
+ qmvdefn = m_tdata.QmvdefnOfHmvdefn((HMBR_VAR_DEFN)hvdefnBase);
+
+ DebAssert(qmvdefn->IsMemberVarDefn(), "Bad defn");
+
+ if (qmvdefn->Hmember() == DISPID_UNKNOWN) {
+ qmvdefn->SetHmember(DataHmemberOfOffset(iBase+m_tdata.CDataMember(),
+ m_nestDepth));
+ }
+ }
+ }
+
+ return err;
+}
+#pragma code_seg()
+
+
+
+
+
+
+
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::GetSizeAlignmentOfHtdefnUdt
+*Purpose:
+* Get size and alignment for udt.
+*
+*Implementation Notes:
+*
+*Entry:
+* htdefn - Handle to type to layout (IN).
+* pcbSizeType - Size of type (OUT).
+* pcbAlignment - Alignment for type (OUT).
+*
+*Exit:
+* No errors possible.
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEMEMBERS::GetSizeAlignmentOfHtdefnUdt(HTYPE_DEFN htdefn,
+ UINT *pcbSizeType,
+ UINT *pcbAlignment)
+{
+ UINT cbSizeType;
+ UINT cbAlignment;
+ TYPE_DEFN *qtdefn;
+ sHIMPTYPE himptypeEmbedded;
+ ITypeInfoA *ptinfoEmbedded = NULL;
+ TIPERROR err = TIPERR_None;
+ TYPEATTR *ptypeattr = NULL;
+
+ DebAssert(pcbSizeType != NULL && pcbAlignment != NULL, "null param.");
+
+ // Get the TYPE_DEFN.
+ qtdefn = m_tdata.QtdefnOfHtdefn(htdefn);
+
+ DebAssert(qtdefn->IsUserDefined() && !qtdefn->IsBasicPtr(),
+ "expected UDT.");
+
+ // If this is really an embedded type then...
+ // i.e. it isn't really a *reference* to a UDT.
+ //
+ himptypeEmbedded = qtdefn->Himptype();
+ DebAssert(qtdefn->Qhimptype() != NULL, "whoops! bad type.");
+
+ // Get TYPEINFO for embedded member.
+ IfErrRet(m_pimpmgr->GetTypeInfo(himptypeEmbedded,
+ DEP_Layout,
+ &ptinfoEmbedded));
+
+ // Get the TypeAttr
+ IfErrGo(TiperrOfHresult(ptinfoEmbedded->GetTypeAttr(&ptypeattr)));
+
+
+ DebAssert(ptypeattr->cbSizeInstance <= CBMAX_FARPTR_HEAPREQ, "cbSizeInstance > 64K");
+ cbSizeType = LOWORD(ptypeattr->cbSizeInstance);
+
+#if 0
+ DebAssert(cbSizeType != 0xFFFF,
+ "whoops! can't layout this embedded member.");
+#endif //0
+
+ cbAlignment = ptypeattr->cbAlignment;
+
+ DebAssert(cbAlignment != 0xFFFF,
+ "whoops! can't have undefined alignment attribute.");
+
+ // Setup output params.
+ *pcbSizeType = cbSizeType;
+ *pcbAlignment = cbAlignment;
+
+ ptinfoEmbedded->ReleaseTypeAttr(ptypeattr);
+
+ // fall through...
+
+Error:
+
+ RELEASE(ptinfoEmbedded);
+ return err;
+}
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::GetSizeAlignmentOfArray
+*Purpose:
+* Get size and alignment for array
+*
+*Implementation Notes:
+*
+*Entry:
+* tkind - Kind of type (IN).
+* htdefn - Handle to TYPE_DEFN (IN).
+* pcbSizeType - Size of type (OUT).
+* pcbAlignment - Alignment (for embedded UDT) (OUT).
+*
+*Exit:
+* No errors possible.
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEMEMBERS::GetSizeAlignmentOfArray(TYPEKIND tkind,
+ HTYPE_DEFN htdefn,
+ UINT *pcbSizeType,
+ UINT *pcbAlignment)
+{
+ UINT cbSizeTypeArrayElem;
+ TYPEDESCKIND tdesckind;
+ SAFEARRAY *qad;
+ UINT cDims, cbPad;
+ HTYPE_DEFN htdefnArrayElem;
+ HARRAY_DESC harraydesc;
+ TYPE_DEFN *qtdefn;
+ TIPERROR err = TIPERR_None;
+ SYSKIND syskind;
+
+ qtdefn = m_tdata.QtdefnOfHtdefn(htdefn);
+ tdesckind = qtdefn->Tdesckind();
+
+ // Get array descriptor and number of dimensions.
+ harraydesc = qtdefn->Harraydesc();
+ qad = m_tdata.QarraydescOfHarraydesc(harraydesc);
+ cDims = qad->cDims;
+
+ // Note: that we must update the cbElement field of the AD here.
+ // So, we get the type of the element and recursively
+ // call the appropriate GetSizeOfHtdefn method.
+ //
+ htdefnArrayElem = qtdefn->HtdefnFoundation(htdefn);
+
+ IfErrRet(GetSizeAlignmentOfHtdefn(tkind,
+ FALSE, // never simple.
+ htdefnArrayElem,
+ &cbSizeTypeArrayElem,
+ pcbAlignment)); // used for records
+ // and carrays
+ // give error if this is 'void' (size/alignment for void is 0)
+ // can't have arrays of 'void'
+ if (cbSizeTypeArrayElem == 0) {
+ DebAssert(*pcbAlignment == 0, "alignment should be 0");
+ return TIPERR_TypeMismatch;
+ }
+ DebAssert(*pcbAlignment != 0, "alignment shouldn't be 0");
+
+ // Redereference.
+ qtdefn = m_tdata.QtdefnOfHtdefn(htdefn);
+ qad = m_tdata.QarraydescOfHarraydesc(harraydesc);
+
+ // Figure out how much padding we need to ensure that the elements
+ // are always properly aligned.
+ //
+ cbPad = *pcbAlignment - cbSizeTypeArrayElem % *pcbAlignment;
+
+ if (cbPad == *pcbAlignment) {
+ cbPad = 0;
+ }
+
+ // Update AD with element size.
+ qad->cbElements = (USHORT)(cbSizeTypeArrayElem += cbPad);
+
+ // Work out if we're resizable.
+ if (qtdefn->IsResizable()) {
+ // ensure we're not a carray
+ DebAssert(tdesckind != TDESCKIND_Carray, "Carrays can't be resizable");
+ // Reference type-level or module-level growable array.
+ // We just have a pointer to an arraydesc so use default
+ //
+ syskind = m_pgtlibole->GetSyskind();
+ *pcbSizeType = SizeofTdesckind(tdesckind, syskind);
+ *pcbAlignment = AlignmentTdesckind(tdesckind);
+ }
+ else {
+ DebAssert(tkind == TKIND_MODULE ||
+ tkind == TKIND_RECORD ||
+ tdesckind == TDESCKIND_Carray, "layout: bad typekind.");
+
+ // we want Carrays to be embedded like in a record
+ if (tdesckind == TDESCKIND_Carray || tkind == TKIND_RECORD) {
+ // NOTE: ilanc: for now we assume that
+ // arrays in OB are always tagged as BasicArray,
+ // since however fixed arrays in records are
+ // actually themselves embedded, it perhaps would
+ // be better to type them as Carrays -- this way
+ // MkTypLib could handle C structs with embedded
+ // C arrays. If this were the case, then
+ // ConstructMemberLists would have to change.
+ //
+ ULONG uSizeType;
+ UINT iDim;
+ ULONG cElements;
+
+ // Here we know that we have a fixed-size array
+ // in a record. Since it will be embedded in the
+ // record, we need to set FADF_EMBEDDED in the
+ // feature flags of the array descriptor.
+ // (StevenL 12-Jan-93)
+ //
+ qad->fFeatures |= FADF_EMBEDDED;
+
+ // get number of elements in array
+ cElements = 1;
+ for (iDim = 0; iDim < cDims; iDim++) {
+ cElements *= qad->rgsabound[iDim].cElements;
+ if (cElements > CBMAX_FARPTR_HEAPREQ) {
+ return TIPERR_SizeTooBig;
+ }
+ }
+
+ // size is size of element * number of elements
+ uSizeType = cElements * cbSizeTypeArrayElem;
+ if (uSizeType > CBMAX_FARPTR_HEAPREQ) {
+ return TIPERR_SizeTooBig;
+ }
+ *pcbSizeType = (USHORT)uSizeType;
+ }
+ else {
+ // Embedded module-level non-growable array:
+ // The ARRAY_DESC is embedded in the object at top-level.
+ //
+ *pcbSizeType = CbSizeArrayDesc(cDims);
+ // NOTE: we really want to get the "true" alignment of
+ // of an ARRAYDESC however we don't have a way of learning
+ // what the alignment attribute is of a C structure, so
+ // we choose the closest TDESCKIND, which is TDESCKIND_BasicArray
+ // which assumes by default that a basicarray is implemented
+ // as a pointer to an ARRAYDESC, but lo and behold an ARRAYDESC
+ // itself just contains a bunch of longs, shorts and pointers
+ // so it turns out that the TDESCKIND_BasicArray's alignment
+ // is good enough. Yeah.. it's a hack...
+ //
+ *pcbAlignment = AlignmentTdesckind(tdesckind);
+ }
+ }
+ return err;
+}
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::GetSizeAlignmentOfHtdefn
+*Purpose:
+* Get size and alignment for UDT
+* Get size for non-UDT.
+*
+*Implementation Notes:
+*
+*Entry:
+* tkind - Kind of type (IN).
+* isEmbeddedTypeDefn - TRUE if htdefn is literal TYPE_DEFN (IN).
+* htdefn - Handle to TYPE_DEFN (IN).
+* pcbSizeType - Size of type (OUT).
+* pcbAlignment - Alignment (for embedded UDT) (OUT).
+*
+*Exit:
+* No errors possible.
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEMEMBERS::GetSizeAlignmentOfHtdefn(TYPEKIND tkind,
+ BOOL isEmbeddedTypeDefn,
+ HTYPE_DEFN htdefn,
+ UINT *pcbSizeType,
+ UINT *pcbAlignment)
+{
+ UINT cbSizeTypeArray, cbAlignmentArray;
+ BOOL isUserDefined, isBasicPtr, isSimpleType;
+ sHTYPE_DEFN htdefnActual;
+ TYPE_DEFN *qtdefn;
+ TYPEDESCKIND tdesckind;
+ TIPERROR err = TIPERR_None;
+ SYSKIND syskind;
+
+ // TYPE_DEFNs are really 16-bit things on both mac and win.
+ // so in the simple case we have to ensure that we take
+ // the address of a 16-bit thing!
+ //
+ htdefnActual = (sHTYPE_DEFN)htdefn;
+
+ // for typedefn Alias isEmbedded may not equal isSimpleType
+ qtdefn = isEmbeddedTypeDefn ?
+ (TYPE_DEFN *)&htdefnActual :
+ m_tdata.QtdefnOfHtdefn(htdefn);
+ isSimpleType = IsSimpleType(qtdefn->Tdesckind());
+
+ isUserDefined = qtdefn->IsUserDefined();
+ isBasicPtr = qtdefn->IsBasicPtr();
+ tdesckind = qtdefn->Tdesckind();
+
+#if ID_DEBUG
+ if (isUserDefined) {
+ DebAssert(!isSimpleType, "bad simple type.");
+ }
+#endif // ID_DEBUG && !EI_OB
+
+ if (isUserDefined && !isBasicPtr) {
+ IfErrRet(GetSizeAlignmentOfHtdefnUdt(htdefn,
+ pcbSizeType,
+ pcbAlignment));
+
+ }
+ else if (isUserDefined || isBasicPtr) {
+ // CONSIDER: ilanc: i think the first clause of disjunction is
+ // tautological.
+ // This is the case of reference to a class/record or intrinsic.
+ DebAssert(isBasicPtr, "whoops! should be basicptr.");
+
+ // NOTE: 03-Jun-93 ilanc: we have to specially process pointers
+ // to arrays here so that their array descriptors get updated
+ // correctly. In particular the problem is that of formal arrays
+ // (params).
+ //
+ if (tdesckind == TDESCKIND_Carray ||
+ tdesckind == TDESCKIND_BasicArray) {
+ IfErrRet(GetSizeAlignmentOfArray(tkind,
+ htdefn,
+ &cbSizeTypeArray,
+ &cbAlignmentArray));
+ }
+
+ // Pretend we're a pointer.
+ syskind = m_pgtlibole->GetSyskind();
+ *pcbSizeType = SizeofTdesckind(TDESCKIND_Ptr, syskind);
+ *pcbAlignment = AlignmentTdesckind(TDESCKIND_Ptr);
+ }
+ else {
+ // Non-UDT: either a simple type or fixedstring/array etc.
+ if (IsSimpleType(tdesckind)) {
+ syskind = m_pgtlibole->GetSyskind();
+ *pcbSizeType = SizeofTdesckind(tdesckind, syskind);
+ *pcbAlignment = AlignmentTdesckind(tdesckind);
+ }
+ else {
+ IfErrRet(GetSizeAlignmentOfHtdefnNonUdt(tkind,
+ isSimpleType,
+ htdefn,
+ pcbSizeType,
+ pcbAlignment));
+ }
+ } // if non-UDT
+
+ // we'll return 0 for 'void'
+ DebAssert(*pcbAlignment != 0xFFFF, "Alignment not set");
+#if 0
+ DebAssert(*pcbSizeType != 0xFFFF, "Size not set");
+#endif //0
+
+ return err;
+}
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::GetSizeAlignmentOfHtdefnNonUdt
+*Purpose:
+* Get size for non-udt variable but not simple type.
+* E.g. arrays and fixed-strings.
+*
+*Implementation Notes:
+*
+*Entry:
+* hvdefn - Handle to variable to layout (IN).
+* pcbSizeType - Size of type (OUT).
+*
+*Exit:
+* No errors possible.
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEMEMBERS::GetSizeAlignmentOfHtdefnNonUdt(TYPEKIND tkind,
+ BOOL isSimpleType,
+ HTYPE_DEFN htdefn,
+ UINT *pcbSizeType,
+ UINT *pcbAlignment)
+{
+ TYPEDESCKIND tdesckind;
+ TYPE_DEFN *qtdefn;
+ sHTYPE_DEFN htdefnActual;
+#if ID_DEBUG
+ PTRKIND ptrkind;
+#endif
+ TIPERROR err = TIPERR_None;
+ SYSKIND syskind;
+
+ DebAssert(pcbSizeType != NULL, "null param.");
+
+ // TYPE_DEFNs are really 16-bit things on both mac and win.
+ // so in the simple case we have to ensure that we take
+ // the address of a 16-bit thing!
+ //
+ htdefnActual = (sHTYPE_DEFN)htdefn;
+
+ // Deref handle.
+ qtdefn = isSimpleType ?
+ (TYPE_DEFN *)&htdefnActual :
+ m_tdata.QtdefnOfHtdefn(htdefn);
+ tdesckind = qtdefn->Tdesckind();
+
+ // calculate default alignment
+ // will get overridden if this isn't correct
+ *pcbAlignment = AlignmentTdesckind(tdesckind);
+
+ // Calculate size of instance non-UDT or of reference to UDT.
+ switch (tdesckind) {
+ case TDESCKIND_Ptr:
+ case TDESCKIND_UserDefined:
+ // NOTE: 08-Jan-93 ilanc: I think the Ptr case is only reached
+ // in the BYPTR param case... w-peterh - or VT_PTR for ItypeInfos
+ //
+ // The UserDefined case is only reached iff this is a reference
+ // to an OB UDT -- i.e. whose ptrkind basic ptr.
+ // Thus the size of such a member is the sizeof a ptr.
+ // Note that we don't actually get the UDT's typeinfo here,
+ // since we don't need it. However, it was previously
+ // loaded as a side-effect of SetPtrkind in order
+ // to determine the "record-ness"/"class-ness" of the type.
+ //
+#if ID_DEBUG
+ ptrkind = qtdefn->Ptrkind();
+ DebAssert(ptrkind == (tdesckind == TDESCKIND_UserDefined) ?
+ PTRKIND_Basic :
+ PTRKIND_Far,
+ "whoops! bad ptrkind.");
+#endif
+
+ case TDESCKIND_LPWSTR:
+ case TDESCKIND_LPSTR:
+ // We pretend we're a pointer...
+ syskind = m_pgtlibole->GetSyskind();
+ *pcbSizeType = SizeofTdesckind(TDESCKIND_Ptr, syskind);
+ *pcbAlignment = AlignmentTdesckind(TDESCKIND_Ptr);
+ break;
+
+ case TDESCKIND_BasicArray:
+ case TDESCKIND_Carray:
+ IfErrRet(GetSizeAlignmentOfArray(tkind,
+ htdefn,
+ pcbSizeType,
+ pcbAlignment));
+ break;
+
+ default:
+ DebHalt("Simple types shouldn't be here.");
+ break;
+ } // switch
+
+ // Check that we did ok
+ DebAssert((*pcbAlignment > 0) && (*pcbAlignment != 0xFFFF),
+ "Alignment not set correctly");
+ return err;
+}
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::LayoutVarOfHvdefn
+*Purpose:
+* Layout a single var given an hvdefn. In addition adds an
+* entry to the resdesctable for the module if the var is
+* either non-local or static (i.e. includes static locals).
+*
+*Implementation Notes:
+* Defers to LayoutVar.
+*
+*Entry:
+* tkind - Kind of module (IN).
+* hvdefn - Handle to variable to layout (IN).
+* puOffset - Current offset within instance (IN/OUT).
+* Could be negative if stack frame.
+* puAlignment - Alignment so far for members (IN/OUT).
+* isStackFrame - Indicates that client is laying out frame (IN).
+* uStackAlignment - Platform-specific alignment (IN).
+* CONSIDER: could be platform/build specific.
+* fIgnoreHvdefn - Flag used by clients in cases in which they
+* want to prevent this method from registering
+* any errors using the hdefn mechanism. This
+* can happen when the client has a "fake"
+* hvdefn, i.e. one that isn't referenced
+* by the p-code (which is what the error
+* registration depends on) (IN).
+*
+*Exit:
+* No errors possible.
+*
+***********************************************************************/
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEMEMBERS::LayoutVarOfHvdefn(TYPEKIND tkind,
+ HVAR_DEFN hvdefn,
+ USHORT *puOffset,
+ UINT *puAlignment,
+ BOOL isStackFrame,
+ UINT uStackAlignment,
+ BOOL fIgnoreHvdefn)
+{
+ VAR_DEFN *qvdefn;
+ USHORT oVarCur, oVarNext;
+ UINT cbSizeType = 0;
+ UINT cbAlignment = 0;
+ TYPE_DEFN *qtdefn;
+ UINT cRecTypeDefn = 0;
+ HTYPE_DEFN htdefn;
+
+
+ TIPERROR err = TIPERR_None;
+
+ DebAssert((puOffset != NULL) && (puAlignment != NULL),
+ "bad params.");
+
+ // Get current offset.
+ oVarCur = *puOffset;
+
+ // Deref handle to variable.
+ qvdefn = m_tdata.QvdefnOfHvdefn(hvdefn);
+
+
+ DebAssert(qvdefn->IsVarDefn(), "only var defns allowed");
+
+ // Get the TYPE_DEFN so we can query whether it's a UDT or not etc.
+ qtdefn = m_tdata.QtdefnOfHvdefn(hvdefn);
+
+
+ // We get the actual type handle here since the various GetSize meths
+ // will need it.
+ //
+ htdefn = qvdefn->Htdefn();
+
+ // Notes:
+ // (1) all members of standard modules must be static.
+ // (2) all members of class modules (both OB and non-OB)
+ // cannot be static.
+ // (3) all constant members and locals do not have "memory"
+ // and must have an associated literal constval.
+ //
+
+#if ID_DEBUG
+ // (1) Assert if static member then standard module.
+ //
+ if (qvdefn->IsDataMember() && qvdefn->IsStatic()) {
+ DebAssert(tkind == TKIND_MODULE,
+ "whoops! must be std module.");
+ }
+
+ // (2) Assert if datamember then
+ // if std module then static.
+ //
+ if (qvdefn->IsDataMember() && (tkind == TKIND_MODULE)) {
+ DebAssert((qvdefn->IsStatic() || qtdefn->IsConst()),
+ "whoops! should be static or constant member.");
+ }
+
+ // (3) Assert if a datamember then if type IsConst then
+ // const hasConstVal
+ //
+ if (qvdefn->IsDataMember() && qtdefn->IsConst()) {
+ DebAssert(qvdefn->HasConstVal(),
+ "whoops! const datamember should have a literal const val.");
+ }
+#endif
+
+ // Note: datamember/local constants aren't laidout at all.
+ //
+ if (!qtdefn->IsConst()) {
+ // Switch on intrinsic types and userdefined.
+ // For intrinsic types we calculate the desired offset
+ // on the fly. For userdefined types we get their
+ // DYN_TYPEBIND and ask for the Size and Alignment
+ // attributes.
+ //
+
+
+ if (tkind != TKIND_DISPATCH || qvdefn->IsBase()) {
+
+ // Get size and alignment for type. Then adjust based on
+ // uStackAlignment.
+ //
+ err = GetSizeAlignmentOfHtdefn(tkind,
+ qvdefn->IsSimpleType(),
+ htdefn,
+ &cbSizeType,
+ &cbAlignment);
+
+ if (err != TIPERR_None) {
+ return err;
+ }
+
+ // give error if this is 'void' (size/alignment for void is 0)
+ if (cbSizeType == 0) {
+ DebAssert(cbAlignment == 0, "");
+ err = TIPERR_TypeMismatch;
+ goto Error;
+ }
+ DebAssert(cbAlignment != 0, "");
+
+ cbAlignment = max(uStackAlignment, cbAlignment);
+
+ // Now align member:
+ oVarNext = (USHORT)AlignMember(&oVarCur,
+ cbAlignment,
+ cbSizeType,
+ isStackFrame);
+
+ if (oVarNext == 0) {
+ // return error if we overflowed while doing the math
+ err = TIPERR_SizeTooBig;
+ goto Error;
+ }
+ }
+ else {
+ oVarNext = oVarCur;
+ oVarCur = 0;
+ }
+
+ // update VAR_DEFN
+ qvdefn = m_tdata.QvdefnOfHvdefn(hvdefn);
+ if (!qvdefn->IsBase()) { // oVar field doesn't exist for
+ qvdefn->SetOVar(oVarCur); // bases (used as impltypeflags)
+ }
+ oVarCur = oVarNext;
+
+ // setup output params.
+ // Alignment of a class is simply the maximum of the
+ // alignments of its immediate members.
+ //
+ *puOffset = oVarNext;
+ *puAlignment = max(cbAlignment, *puAlignment);
+
+ } // if !isConst
+
+ return TIPERR_None;
+
+Error:
+ // Now register the error -- but only if they don't want
+ // us to ignore the hvdefn. In that case, it's the client's
+ // responsibility to deal with it.
+ //
+
+ return err;
+}
+#pragma code_seg()
+
+
+
+
+
+
+
+
+
+
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::LayoutDataMembers - Layout data members.
+*Purpose:
+* Layout data members.
+*
+*Implementation Notes:
+* Data members are laid out on platform-dependent boundary.
+* Note: zero-length data members (instances of zero-length
+* classes are given length 2 -- so that instance offsets
+* are never shared between members).
+*
+*Entry:
+* tkind - Kind of module (IN)
+* puOffset - Current offset within instance (IN/OUT).
+* puAlignment - Current alignment of instance
+* hdefnFirst - handle to first defn in list of var defns
+* Note: this can contain RecTypeDefns
+*
+*Exit:
+*
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEMEMBERS::LayoutDataMembers(TYPEKIND tkind,
+ UINT *puOffset,
+ UINT *puAlignment,
+ HDEFN hdefnFirst)
+{
+ HDEFN hdefnCur;
+ USHORT oVarCur;
+ UINT cRecTypeDefn = 0;
+ TIPERROR err = TIPERR_None;
+
+ // offset to end of current member
+ oVarCur = (USHORT)*puOffset;
+
+ // Get listhead to the VAR_DEFNs threaded by TYPE_DATA.
+ hdefnCur = hdefnFirst;
+
+ while (hdefnCur != HDEFN_Nil) {
+ DebAssert(!(m_tdata.QdefnOfHdefn(hdefnCur)->IsRecTypeDefn()), "inapplicable");
+ {
+ // layout datamember
+ IfErrRet(LayoutVarOfHvdefn(tkind,
+ hdefnCur,
+ &oVarCur,
+ puAlignment,
+ FALSE, // not a stack frame.
+ 0)); // ignored.
+
+ }
+
+ // get next
+ hdefnCur = m_tdata.QdefnOfHdefn(hdefnCur)->HdefnNext();
+ } // while
+
+ // Setup output params.
+ // Note that puAlignment is already set.
+ //
+ *puOffset = oVarCur;
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::LayoutMembers - Layout members.
+*Purpose:
+* Layout base and data members.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEMEMBERS::LayoutMembers()
+{
+ UINT uOffset = 0;
+ UINT uAlignment = 0;
+ TYPEKIND tkind;
+ USHORT oCur;
+ TIPERROR err;
+ SYSKIND syskind;
+
+
+ tkind = GetTypeKind();
+
+ switch (tkind) {
+ case TKIND_ALIAS:
+ // if this is an alias, then layout its alias and we're done
+ DebAssert((m_tdata.CMeth() == 0) &&
+ (m_tdata.CBase() == 0) &&
+ (m_tdata.CNestedType() == 0) &&
+ (m_tdata.CDataMember() == 0), "Alias can't have members");
+
+ // Get size and alignment for type
+ // see explaination in LayoutVarOfHvdefn
+ //
+ IfErrRet(GetSizeAlignmentOfHtdefn(tkind,
+ m_tdata.IsSimpleTypeAlias(),
+ m_tdata.m_htdefnAlias,
+ &uOffset,
+ &uAlignment));
+ break;
+
+ case TKIND_ENUM:
+ // for enums just layout an int
+ DebAssert(m_pgtlibole == m_pdtroot->Pgdtinfo()->PgtlibOleContaining(),
+ "whoops! where are we now?");
+
+ syskind = m_pgtlibole->GetSyskind();
+ uOffset = SizeofTdesckind(TDESCKIND_Int, syskind);
+ uAlignment = AlignmentTdesckind(TDESCKIND_Int);
+ break;
+
+
+ case TKIND_COCLASS:
+ // Classes and coclasses flagged as an appobj have a predeclared id.
+ if (m_pdtroot->GetTypeFlags() & TYPEFLAG_FAPPOBJECT
+ || m_pdtroot->GetTypeFlags() & TYPEFLAG_FPREDECLID) {
+ IfErrRet(m_tdata.AllocVardefnPredeclared());
+ }
+ if (tkind == TKIND_COCLASS) {
+ DebAssert(m_tdata.HdefnFirstDataMbrNestedType() == HDEFN_Nil, "");
+ }
+
+ // fall through... (dispatch checks below are NOPs, and LayoutDataMembers
+ // call below will also be a NOP)
+ //
+ case TKIND_DISPATCH:
+ // Produce an error if dispinterface has more than one base class
+ // (i.e. has an embedded interface pseudo-base-class *and* has
+ // other datamembers/functions.
+ //
+ if ((m_tdata.CBase() > 1) && (m_tdata.CMeth() > 0 ||
+ m_tdata.CDataMember() > 0)) {
+ return TIPERR_BadModuleKind;
+ }
+ // fall through...
+
+ case TKIND_INTERFACE:
+ // If this is a class then layout its bases and virtual function table.
+ IfErrRet(LayoutBases(tkind, &uOffset, &uAlignment));
+
+ // fall into default processing
+
+#if ID_DEBUG
+ goto DefaultProcessing;
+#endif //ID_DEBUG
+
+ default:
+
+#if ID_DEBUG
+ DebHalt("invalid tkind");
+ case TKIND_RECORD:
+ case TKIND_MODULE:
+ case TKIND_UNION:
+DefaultProcessing:
+#endif //ID_DEBUG
+
+ oCur = uOffset;
+ IfErrRet(LayoutDataMembers(tkind,
+ &uOffset,
+ &uAlignment,
+ m_tdata.HdefnFirstDataMbrNestedType()));
+
+ // Ensure zero-length classes are at least CB_MIN_INSTANCE bytes long.
+ // (can't encounter 'void' here, so the check for 0 isn't a problem)
+ if (uOffset == 0)
+ uOffset = CB_MIN_INSTANCE;
+ if (uAlignment == 0)
+ uAlignment = CB_MIN_ALIGNMENT;
+ break;
+ }; // switch
+
+
+ // Update (embedded) DYN_TYPEBIND (we are friends!)
+ m_dtbind.m_cbSize = uOffset;
+ m_dtbind.m_cbAlignment = uAlignment;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+
+/***
+*DYN_TYPEMEMBERS::GenerateOverrides() - generate vtables and overrides
+*Purpose:
+* This functions goes through every virtual functions of the
+* current class, determine which, if any, base class method
+* it overrides, and tells the entry manager the
+* about it to build the vtables.
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns TIPERROR.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+TIPERROR DYN_TYPEMEMBERS::GenerateOverrides()
+{
+ HFUNC_DEFN hfdefn; // Current function
+ HFUNC_DEFN hfdefnNext; // next function
+ FUNC_DEFN * qfdefn; // " "
+ UINT cBase; // number of bases.
+ UINT ovftSlotNext; // offset of next vtable slot in primary table.
+ ITypeInfoA *ptinfo = NULL;
+ TYPEATTR *ptypeattr = NULL;
+ TIPERROR err = TIPERR_None;
+
+ // Initialize
+ cBase = m_tdata.CBase();
+
+ DebAssert(GetTypeKind() == TKIND_DISPATCH ||
+ GetTypeKind() == TKIND_INTERFACE,
+ "bad tkind for virtual functions");
+
+ // Find current size of position of primary virtual function table.
+ // VBA2: we only generate overrides for the FIRST base
+ //
+ ovftSlotNext = m_dtbind.m_cbPvft;
+
+ // Iterate over func defn list
+ hfdefn = m_tdata.HfdefnFirstMeth();
+ while (hfdefn != HFUNCDEFN_Nil) {
+ qfdefn = m_tdata.QfdefnOfHfdefn(hfdefn);
+ hfdefnNext = qfdefn->HdefnNext();
+
+ if (qfdefn->IsVirtual()) {
+
+ // Set func defn and entrymgr slot.
+ qfdefn->SetOvft(ovftSlotNext);
+
+ // Increment for next function.
+ ovftSlotNext += sizeof(void (*)());
+ }
+
+ hfdefn = hfdefnNext;
+ }
+
+ // Set primary vtable size.
+ m_dtbind.m_cbPvft = ovftSlotNext;
+
+ return err;
+}
+#pragma code_seg()
+
+
+
+/***
+*PROTECTED DYN_TYPEMEMBERS::Layout - Layout a class.
+*Purpose:
+* Layout, i.e. compile, a class.
+*
+*Implementation Notes:
+* Produce the information needed by DYN_TYPEBIND and ENTRYMGR
+* in order to layout an instance of this class. For more
+* detailed layout info, see: \silver\doc\ic\typecomp.doc
+* This method is also know as the TYPECOMPILER.
+*
+* VBA2: note that it is important that datamembers are laid out
+* first since the pvfts of the various event sources
+* in the base class (if any) must follow so that datamember
+* access be more efficient.
+* ---------------
+* | pvft |---------->Primary vft
+* |BASIC_CLASS |
+* | |
+* ---------------
+* | |
+* |compile-time |
+* |datamembers |
+* | |
+* ---------------
+* | pstaticblk |----------->------------
+* --------------- | statics |
+* | pvft1 | | ... |
+* --------------- ------------
+* | pvft2 | | dynamically-added
+* --------------- | datamembers (E&C)
+* | ... | ------------
+* ---------------
+* | pvftN |
+* ---------------
+*
+*
+* Note: flags class as being laidout, so that circular
+* definitions can be detected.
+* Note: does not set m_isLaidOut to TRUE; that is done by MakeLaidOut
+* only if the BindNameTable is successfully built
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEMEMBERS::Layout()
+{
+ TYPEKIND tkind;
+ TIPERROR err = TIPERR_None;
+
+ DebAssert(m_pentmgr != NULL, "null ENTRYMGR.");
+
+ // This class must be in at least CS_SEMIDECLARED.
+ // In principle, this method is only called by MakeLaidOut()
+ // which requires SEMIDECLARED as well... but... just in case...
+ //
+ DebAssert(m_pdtroot->CompState() >= CS_SEMIDECLARED,
+ "no binding table yet.");
+
+ tkind = GetTypeKind();
+
+ m_dtbind.m_cbPvft = 0;
+
+ // Get the typeinfo of our base class if we're not a coclass.
+ if (m_tdata.CBase() > 0 && tkind != TKIND_COCLASS) {
+ ITypeInfoA *ptinfoBase;
+ TYPEATTR *ptypeattrBase;
+
+ IfErrGo(m_tdata.GetTypeInfoOfHvdefn(m_tdata.HvdefnFirstBase(),
+ &ptinfoBase,
+ NULL));
+
+ DebAssert(ptinfoBase != NULL, "Base not valid");
+
+ // Get size of base's vft unless we're a COCLASS
+ err = TiperrOfHresult(ptinfoBase->GetTypeAttr(&ptypeattrBase));
+ if (err == TIPERR_None) {
+ switch(ptypeattrBase->typekind){
+ case TKIND_INTERFACE:
+ m_dtbind.m_cbPvft = ptypeattrBase->cbSizeVft;
+ break;
+ case TKIND_DISPATCH:
+ // 7 == NumMethods(IDispatch);
+ m_dtbind.m_cbPvft = (7 * sizeof(void(*)()));
+ break;
+ default:
+ DebAssert(0/*UNREACHED*/, "");
+ m_dtbind.m_cbPvft = 0;
+ break;
+ }
+ ptinfoBase->ReleaseTypeAttr(ptypeattrBase);
+ }
+
+ ptinfoBase->Release();
+
+ if (err != TIPERR_None) {
+ return err;
+ }
+ }
+
+ // (1) Layout non-virtual bases and immediate data members
+ IfErrGo(LayoutMembers());
+
+ // (2) Allocate HMEMBERS.
+ if (tkind != TKIND_DISPATCH) {
+
+
+ IfErrGo(AllocHmembers());
+ }
+
+ // (3) Generate overrides, really this just lays out virtual functions
+ if (tkind == TKIND_INTERFACE) {
+ IfErrGo(GenerateOverrides());
+ }
+ // fall through...
+
+Error:
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::Read - Read serialized image of DYN_TYPEMEMBERS.
+*Purpose:
+* Read serialized image of DYN_TYPEMEMBERS.
+*
+*Implementation Notes:
+* Serialized format:
+* TYPEDATA instance.
+* DYN_TYPEBIND instance.
+* IsModifiable flag
+* IsLaidOut flag
+* PERSISTENCEKIND
+* Note: TYPEKIND is serialized by the containing TYPEINFO.
+*
+*Entry:
+* pstrm - STREAM to read image from (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEMEMBERS::Read(STREAM *pstrm)
+{
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // Then Deserialize DYN_TYPEMEMBERS meta-info.
+ IfErrRet(pstrm->ReadUShort(&m_uFlags));
+
+ // Deserialize TYPE_DATA member.
+ IfErrRet(m_tdata.Read(pstrm));
+
+ // In OB check if we are decompiling then don't read the typebind.
+ IfErrRet(m_dtbind.Read(pstrm));
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::Write - Write image of DYN_TYPEMEMBERS.
+*Purpose:
+* Write image of DYN_TYPEMEMBERS.
+*
+*Implementation Notes:
+* Serialized format:
+* TYPEDATA instance.
+* DYN_TYPEBIND instance.
+* TYPEDESCKIND of enum impl (relevant for enumerations only).
+* IsModifiable flag
+* IsLaidOut flag
+* PERSISTENCEKIND
+* Note: the TYPEKIND is not serialized since the containing
+* TYPEINFO will do that.
+*
+*Entry:
+* pstrm - STREAM to read image to (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR DYN_TYPEMEMBERS::Write(STREAM *pstrm)
+{
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // Then serialize DYN_TYPEMEMBERS meta-info.
+ IfErrRet(pstrm->WriteUShort(m_uFlags));
+
+ // Serialize TYPE_DATA member.
+ IfErrRet(m_tdata.Write(pstrm));
+
+ // Serialize DYN_TYPEBIND member.
+ IfErrRet(m_dtbind.Write(pstrm));
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::BuildBindNameTable - Build binding table.
+*Purpose:
+* Build binding table.
+*
+*Implementation Notes:
+* If table not already built then:
+* TYPESRC::ConstructMemberList()
+* defer to DYN_TYPEBIND.
+* Note that the latter defers in turn to BINDNAME_TABLE
+* which doesn't require class to be fully laidout -- only that
+* its member lists be constructed already.
+*
+*Entry:
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEMEMBERS::BuildBindNameTable()
+{
+
+ ITypeLibA *ptlib = NULL;
+ UINT ityp;
+ TIPERROR err;
+
+ // We only build the table if need be.
+ if (!m_dtbind.Pdbindnametbl()->IsValid()) {
+
+ // Assert that the cached pstlib is still valid.
+ // e.g. the typeinfo didn't move on us...
+ //
+ DebAssert(m_pgtlibole == m_pdtroot->Pgdtinfo()->PgtlibOleContaining(),
+ "whoops! where are we now?");
+
+ // Ensure that the NAME_CACHE array is loaded.
+ IfErrGo(m_pgtlibole->LoadNameCache());
+
+ // In any event (i.e. for both basic and non-basic classes)
+ // build the name table.
+ IfErrGo(m_dtbind.BuildBindNameTable());
+
+ // Now rebuild the module's cache...as long as we're not laying out the
+ // dispinterface portion of a dual interface, which 'inherits' the
+ // module cache of the interface portion.
+ //
+ if (m_pdtroot->Pgdtinfo()->GetTypeKind() != TKIND_DISPATCH
+ || m_pdtroot->Pgdtinfo()->PgdtinfoPartner() == NULL) {
+ // Get type's index.
+ ityp = m_pdtroot->Pgdtinfo()->GetIndex();
+
+ IfErrGo(BuildNameCache(ityp));
+ }
+
+ } // if
+ return TIPERR_None;
+
+Error:
+
+ return err;
+}
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::UpdateBinderOptimization
+*Purpose:
+* Update the information in the name manager and/or
+* the name cache for the given name. These are both
+* used to optimize the binding process.
+*
+*Entry:
+* hgnam the hgnam we are to add
+* ityp the index of the current ITypeInfo
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+TIPERROR DYN_TYPEMEMBERS::UpdateBinderOptimization(HLNAM hlnam,
+ UINT ityp,
+ BOOL fType)
+{
+ HGNAM hgnam;
+ TIPERROR err = TIPERR_None;
+
+ BOOL fGlobal;
+ UINT itypNammgr;
+
+ // Add the name to the name cache
+ IfErrRet(m_pnammgr->HgnamOfHlnam(hlnam, &hgnam));
+ IfErrRet(m_pgtlibole->AddNameToCache(ityp, hgnam));
+
+ // Mark it as being a non-parameter
+ m_pnammgr->SetNonParam(hlnam, TRUE);
+
+
+ // Determine whether we're globally accessable
+ fGlobal = IsUnqualifiable(m_pdtroot->Pgdtinfo());
+ itypNammgr = m_pnammgr->ItypOfHlnam(hlnam);
+
+ // (1) Check to see if the ityp of the name is valid. If not,
+ // add this one, don't add it to the name cache and return.
+ //
+ if (!m_pnammgr->IsValidItyp(hlnam)) {
+ m_pnammgr->SetItypOfHlnam(hlnam, ityp);
+
+ m_pnammgr->SetMultiple(hlnam, FALSE);
+ m_pnammgr->SetGlobal(hlnam, fGlobal);
+
+ return TIPERR_None;
+ }
+
+ // (2) If the ityp in the nammgr is the same as this one, return.
+ //
+ if (itypNammgr == ityp) {
+ return TIPERR_None;
+ }
+
+ // (3) We know at this point that the ityp is valid and that it is
+ // not the same as the current one.
+ //
+ if (!m_pnammgr->IsMultiple(hlnam)) {
+ m_pnammgr->SetMultiple(hlnam, TRUE);
+ }
+ // fall through...
+
+ // (4) If the ityp in the name manager is GLOBAL, only replace
+ // it with this one if we are also global and our numeric
+ // value is less. Return in any case.
+ // Note: that we must in the multiple case here.
+ //
+ DebAssert(m_pnammgr->IsMultiple(hlnam), "should be multiple.");
+
+ if (m_pnammgr->IsGlobal(hlnam)) {
+ if (fGlobal) {
+ // We have multiple globals, set the ambiguous flag
+ m_pnammgr->SetAmbiguous(hlnam, TRUE);
+
+ if (ityp < itypNammgr) {
+ m_pnammgr->SetItypOfHlnam(hlnam, ityp);
+ }
+ }
+
+ return TIPERR_None;
+ }
+
+ // (5) If the current ityp is global, always place it into
+ // the name manager since the one in there isn't. Return.
+ //
+ // (6) Place the current ityp into the name manager if it is
+ // numerically less than the one currently there.
+ //
+ if (fGlobal || ityp < itypNammgr) {
+ m_pnammgr->SetItypOfHlnam(hlnam, ityp);
+ }
+
+ // If we are global, then set the global flag in the
+ // name manager.
+ //
+ if (fGlobal) {
+ m_pnammgr->SetGlobal(hlnam, TRUE);
+ }
+
+ return TIPERR_None;
+}
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::UpdateNameCacheOfHdefnList
+*Purpose:
+* Traverse a list of member defns.
+* Called to traverse both data members and functions.
+*
+*Implementation Notes:
+* Incrementally adds each member to name cache -- i.e.
+* by deferring to project.
+* NOTE: only PUBLIC names are entered into the cache since
+* (1) the cache is only used at proj-level
+* (2) proj-level binding only has access to public members.
+* The implication of this is that the module-level cache cannot
+* be used for module-level binding -- this is ok, since:
+* (1) it isn't -- module-level binder uses the module's
+* binding table directly.
+* (2) it would be a pessimization to use the module's cache
+* at module-level bindtime since it would imply asking
+* the project for the cache (recall it is owned by the
+* containing project) which would potentially unnecessarily
+* load it -- unnecessary e.g. in the case in which the
+* module has no proj-level references or implicits).
+*
+*Entry:
+* hdefn listhead
+* infokind list kind: one of (var, func, base)
+* ityp index of this typeinfo.
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+TIPERROR DYN_TYPEMEMBERS::UpdateNameCacheOfHdefnList(HDEFN hdefn,
+ INFOKIND infokind,
+ UINT ityp)
+{
+ HDEFN hdefnNext;
+ DEFN *qdefn;
+ HLNAM hlnam;
+
+ TIPERROR err;
+
+ DebAssert((infokind == INFOKIND_Var) || (infokind == INFOKIND_Func),
+ "whoops! bad DEFN.");
+
+ DebAssert(m_pgtlibole == m_pdtroot->Pgdtinfo()->PgtlibOleContaining(),
+ "whoops! where are we now?");
+
+ while (hdefn != HDEFN_Nil) {
+ qdefn = m_tdata.QdefnOfHdefn(hdefn);
+
+ // cache handle of next in list so we don't have to
+ // redereference handle later.
+ //
+ hdefnNext = qdefn->HdefnNext();
+
+ // If this is a function which has been removed with
+ // conditional compilation, don't add it to the
+ // name cache.
+ //
+
+ // If visibility is PUBLIC then add name to binder optimizations.
+ if (qdefn->Access() == ACCESS_Public) {
+ hlnam = qdefn->Hlnam();
+
+ IfErrRet(UpdateBinderOptimization(hlnam,
+ ityp,
+ qdefn->IsRecTypeDefn()));
+ }
+
+ // get next
+ hdefn = hdefnNext;
+ } // end of while
+ return TIPERR_None;
+
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::UpdateNameCacheOfBaseClass
+*Purpose:
+* Merge the namecaches of each of the base classes in the
+* Hdefn list with one.
+* NOTE: one very useful side-effect of this is that inherited member names
+* from imported/referenced typelibs/projects are added to this
+* referencing/importing project/typelib.
+*
+*Implementation Notes:
+*
+*Entry:
+* ptinfo ItypeInfo *
+* ityp index of our TypeInfo
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+TIPERROR DYN_TYPEMEMBERS::UpdateNameCacheOfBaseClass(ITypeInfoA *ptinfo,
+ UINT ityp)
+{
+ ITypeInfoA *ptinfoNext = NULL;
+ BSTRA bstrName = NULL;
+ HREFTYPE hreftype;
+ TYPEATTR *ptypeattr;
+ WORD cFuncs, cVars;
+ FUNCDESC *pfuncdesc = NULL;
+ VARDESCA *pvardesc = NULL;
+ HLNAM hlnamMbr;
+ BOOL fChange;
+ UINT cName, iImplType;
+ TIPERROR err = TIPERR_None;
+
+ // CONSIDER: If the typeinfo we have is in the same typelib that we're
+ // currently building the name cache for, simply grab the other
+ // name cache and OR it directly into this one's.
+ //
+ m_nestDepth++; // count nesting depth
+
+ // (3) Get the TYPEATTR for this ptinfo
+ //
+ IfErrRet(TiperrOfHresult(ptinfo->GetTypeAttr(&ptypeattr)));
+
+ // (4) Iterate over the functions, adding them to the
+ // binder optimizations
+ //
+ for (cFuncs = 0; cFuncs < ptypeattr->cFuncs; cFuncs++) {
+
+ // Get the funcdesc
+ IfErrGo(TiperrOfHresult(ptinfo->GetFuncDesc(cFuncs, &pfuncdesc)));
+
+ // Get the funcdesc's name
+ IfErrGoTo(TiperrOfHresult(ptinfo->GetDocumentation(
+ (HMEMBER)(pfuncdesc->memid),
+ (BSTR *)&bstrName,
+ NULL,
+ NULL,
+ NULL)),
+ Error2);
+#if OE_WIN32
+ IfErrGoTo(TiperrOfHresult(ConvertBstrToAInPlace(&bstrName)), Error2);
+#endif // OE_WIN32
+
+ // Convert the name to an Hlnam
+ IfErrGoTo(m_pnammgr->HlnamOfStr(bstrName, &hlnamMbr, FALSE, &fChange),
+ Error3);
+
+ // Add
+ IfErrGoTo(UpdateBinderOptimization(hlnamMbr, ityp, FALSE), Error3);
+
+ // Free resources
+ FreeBstrA(bstrName);
+ bstrName = NULL;
+ ptinfo->ReleaseFuncDesc(pfuncdesc);
+ pfuncdesc = NULL;
+ } // for
+
+ // (5) Iterate over the variables, adding them to the name cache
+ for (cVars = 0; cVars < ptypeattr->cVars; cVars++) {
+ // Get the vardesc
+ IfErrGoTo(TiperrOfHresult(ptinfo->GetVarDesc(cVars, &pvardesc)),
+ Error3);
+
+ // Get the vardesc's name
+ IfErrGoTo(TiperrOfHresult(ptinfo->GetNames((HMEMBER)(pvardesc->memid),
+ (BSTR *)&bstrName,
+ 1,
+ &cName)),
+ Error4);
+#if FV_UNICODE_OLE
+ IfErrGoTo(TiperrOfHresult(ConvertBstrToAInPlace(&bstrName)), Error4);
+#endif //FV_UNICODE_OLE
+
+ DebAssert(cName, "ITypeInfo member does not have a name");
+
+ // Convert the name to an Hlnam
+ IfErrGoTo(m_pnammgr->HlnamOfStr(bstrName, &hlnamMbr, FALSE, &fChange),
+ Error4);
+
+ // Add
+ IfErrGoTo(UpdateBinderOptimization(hlnamMbr, ityp, FALSE), Error4);
+
+ // Free resources
+ FreeBstrA(bstrName);
+ bstrName = NULL;
+ ptinfo->ReleaseVarDesc(pvardesc);
+ pvardesc = NULL;
+ } // for
+
+ // (6) Get this ptinfo's base class, if it exists
+ for (iImplType = 0; iImplType < ptypeattr->cImplTypes; iImplType++) {
+ IfErrGoTo(TiperrOfHresult(
+ ptinfo->GetRefTypeOfImplType(iImplType, &hreftype)),
+ Error4);
+ IfErrGoTo(TiperrOfHresult(
+ ptinfo->GetRefTypeInfo(hreftype, &ptinfoNext)),
+ Error4);
+
+ // Make recursive call...
+ IfErrGoTo(UpdateNameCacheOfBaseClass(ptinfoNext, ityp),
+ Error5);
+ RELEASE(ptinfoNext);
+ } // for each impltype
+ // fall through...
+
+Error5:
+ RELEASE(ptinfoNext);
+ // fall through...
+
+Error4:
+ if (pvardesc != NULL)
+ ptinfo->ReleaseVarDesc(pvardesc);
+ // Fall through
+
+Error3:
+ FreeBstrA(bstrName);
+ // Fall through
+
+Error2:
+ if (pfuncdesc != NULL)
+ ptinfo->ReleaseFuncDesc(pfuncdesc);
+ // Fall through
+
+Error:
+ ptinfo->ReleaseTypeAttr(ptypeattr);
+ return err;
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::BuildNameCache
+*Purpose:
+* Builds name cache for module.
+*
+*Implementation Notes:
+* Iterates over the three members defn lists of the class.
+*
+*Entry:
+* ityp type index
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEMEMBERS::BuildNameCache(UINT ityp)
+{
+ HFUNC_DEFN hfdefnFirstFunc;
+ HVAR_DEFN hvdefnFirstDataMember;
+ HVAR_DEFN hvdefnBaseCur;
+ HIMPTYPE himptype;
+ BSTRA bstrName;
+ HLNAM hlnam;
+ BOOL isFunkyDispinterface, isCoClass, isDefaultBase;
+#if FV_UNICODE_OLE
+ HRESULT hresult;
+#endif // FV_UNICODE_OLE
+ ITypeInfoA *ptinfo;
+ TIPERROR err;
+
+ DebAssert(m_pgtlibole == m_pdtroot->Pgdtinfo()->PgtlibOleContaining(),
+ "whoops! where are we now?");
+
+ // (1) Invalidate module's cache -- doesn't invalidate proj-cache.
+ //
+ m_pgtlibole->InvalidateNameCache(ityp);
+
+ m_nestDepth = 0;
+
+ // (2) Now iterate over member lists.
+ // - data members, functions
+ //
+ hvdefnFirstDataMember = m_tdata.HdefnFirstDataMbrNestedType();
+ IfErrGo(UpdateNameCacheOfHdefnList(hvdefnFirstDataMember,
+ INFOKIND_Var,
+ ityp));
+
+
+ hfdefnFirstFunc = m_tdata.HfdefnFirstMeth();
+ IfErrGo(UpdateNameCacheOfHdefnList(hfdefnFirstFunc,
+ INFOKIND_Func,
+ ityp));
+
+ // (3) Add the globals of the base classes to this typeinfo's
+ // name cache
+ // Note that V1 only supports single-inheritance binding
+ // so we only look at the first base.
+ // OLE EXCEPTIONS:
+ // (1) funky dispinterfaces:
+ // The members of the 2nd base class
+ // are considered to be immediate members of the derived class.
+ // (2) coclasses:
+ // Only the members of the DEFAULT interface/dispinterface base are
+ // visible from the coclass.
+ //
+ IfErrGo(IsFunkyDispinterface(m_pdtroot->Pgdtinfo(),
+ &isFunkyDispinterface));
+ isCoClass = (GetTypeKind() == TKIND_COCLASS);
+ hvdefnBaseCur = m_tdata.HvdefnFirstBase();
+ while (hvdefnBaseCur != HVARDEFN_Nil) {
+ himptype = m_tdata.QtdefnOfHvdefn(hvdefnBaseCur)->Himptype();
+ // If we have a coclass, then check if this base is the DEFAULT.
+ isDefaultBase =
+ isCoClass &&
+ (m_tdata.QvdefnOfHvdefn(hvdefnBaseCur)->GetImplTypeFlags() ==
+ IMPLTYPEFLAG_FDEFAULT);
+ if (!isCoClass || isDefaultBase) {
+ IfErrGo(m_pimpmgr->GetTypeInfo(himptype, DEP_None, &ptinfo));
+ IfErrGoTo(UpdateNameCacheOfBaseClass(ptinfo, ityp), Error2);
+ ptinfo->Release();
+ // We only bother getting subsequent bases if we have a dispinterface,
+ // or we're a coclass and we haven't found the default yet,
+ // otherwise we short-circuit the iteration.
+ //
+ } // if isDefaultBase
+ if (isFunkyDispinterface || (isCoClass && !isDefaultBase)) {
+ hvdefnBaseCur = m_tdata.QvdefnOfHvdefn(hvdefnBaseCur)->HdefnNext();
+ }
+ else {
+ hvdefnBaseCur = HVARDEFN_Nil;
+ }
+ } // while
+
+ // (4) Mark the name of the typeinfo itself as a non-parameter
+ //
+ // - Marking this name as a nonparameter ensures that it can
+ // be found using IsName. Only do this for OLE because
+ // it is done automaticly when the OB projects are brought
+ // to semi-declared state.
+ //
+ IfErrRet(TiperrOfHresult(m_pdtroot->Pgdtinfo()->GetDocumentation(-1,
+ (BSTR *)&bstrName,
+ NULL,
+ NULL,
+ NULL)));
+#if FV_UNICODE_OLE
+ if ((hresult = ConvertBstrToAInPlace(&bstrName)) != TIPERR_None) {
+ FreeBstrA(bstrName);
+ return TiperrOfHresult(hresult);
+ }
+#endif //FV_UNICODE_OLE
+
+ hlnam = m_pnammgr->HlnamOfStrIfExist(bstrName);
+ DebAssert(hlnam != HLNAM_Nil, "The name of the TypeLib isn't in the nammgr!");
+
+ m_pnammgr->SetNonParam(hlnam, TRUE);
+
+ FreeBstrA(bstrName);
+
+ // (5) Make cache valid.
+ //
+ // - the project-level name cache is rebuilt before
+ // before it is used if all of the module-level
+ // name caches are valid.
+ //
+ m_pgtlibole->SetValidNameCache(ityp);
+
+ return TIPERR_None;
+
+Error2:
+ ptinfo->Release();
+ // fall through...
+
+Error:
+ m_pgtlibole->InvalidateNameCache(ityp);
+ return err;
+}
+
+
+
+
+/***
+*DYN_TYPEMEMBERS::GetSize
+*Purpose:
+* returns the total size of the DYN_TYPEMEMBERS and its subcomponent
+*Entry:
+*
+*Exit:
+* returns size
+***********************************************************************/
+UINT DYN_TYPEMEMBERS::GetSize()
+{
+ return (UINT)sizeof(DYN_TYPEMEMBERS) + (UINT)m_tdata.GetSize();
+}
+
+
+#pragma code_seg(CS_LAYOUT)
+/***
+*PRIVATE DYN_TYPEMEMBERS::AdjustForAlignment
+*Purpose:
+* Adjust offset of embedded data member given alignment.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* Returns adjusted offset.
+*
+***********************************************************************/
+
+UINT DYN_TYPEMEMBERS::AdjustForAlignment(UINT oVarCur,
+ UINT cbAlignment,
+ BOOL isStackFrame)
+{
+ UINT dbRemainder;
+
+ DebAssert(cbAlignment != 0, "bad alignment attribute.");
+
+ // We update oVarCur by the difference between the next available
+ // byte and the offset within the struct that this type
+ // wants to be allocated on for its alignment.
+ //
+ dbRemainder = oVarCur % cbAlignment;
+ if (dbRemainder) {
+ if (isStackFrame) {
+ return oVarCur - dbRemainder; // for all platforms (1/5/94 davebra)
+ }
+ else {
+ return oVarCur + (cbAlignment - dbRemainder);
+ }
+ }
+ else {
+ return oVarCur;
+ }
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::AlignMember
+*Purpose:
+* Align menber
+*
+*Implementation Notes:
+*
+*Entry:
+* puOffset Points to where this member is alloced (IN/OUT).
+* cbAlignment
+* cbSizeType
+* isStackFrame
+*
+*Exit:
+* Returns offset of next available byte.
+* 0 means error -- we overflowed
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+UINT DYN_TYPEMEMBERS::AlignMember(USHORT *puOffset,
+ UINT cbAlignment,
+ UINT cbSizeType,
+ BOOL isStackFrame)
+{
+ UINT oNext;
+ ULONG lTemp;
+
+ // Now align member:
+ // If stackframe then uOffset currently addresses
+ // last "unavailable" byte -- i.e. we must alloc
+ // this var immediately "above" it, i.e. at a lower addr.
+ // So we update uOffset by cbSizeType now.
+ //
+ if (isStackFrame) {
+ lTemp = (ULONG)*puOffset - (ULONG)cbSizeType;
+
+#if OE_RISC
+
+ // On OE_RISC platforms, cbOB_Offset is 0 (i.e., no space between
+ // the frame pointer and the locals). Thus, the value of *puOffset
+ // will be 0 on the first allocation. Several assumptions:
+ //
+ // (1) A 0 *puOffset value really means 0 and not 64K (i.e., wrap).
+ // This is true because on a 64K value, this function will return an
+ // oNext value of 0 (error) and, thus, we won't be called again.
+ //
+ // (2) The value of cbSizeType can't cause an overflow when the
+ // *puOffset value is 0 (i.e., cbSizeType <= 0xFFFF).
+
+ if (*puOffset != 0)
+#endif
+ if (HIWORD(lTemp) != 0)
+ return 0; // overflow -- return 0 to signal error
+ *puOffset = LOWORD(lTemp);
+ }
+
+ oNext = AdjustForAlignment(*puOffset, cbAlignment, isStackFrame);
+
+ // Check for overflow of AdjustForAlignment. Fortunately,
+ // we know that if isStackFrame is false, the returned value will be
+ // greater than or equal to *puOffset. If not, we've overflowed.
+ //
+ if (!isStackFrame) {
+ if (oNext < *puOffset) {
+ return 0; // overflow
+ }
+ }
+ else {
+ // isStackFrame
+ if (oNext > *puOffset) {
+ return 0; // underflow
+ }
+ }
+
+
+ *puOffset = oNext;
+
+ if (!isStackFrame) {
+ // compute return value, checking for overflow
+ lTemp = (ULONG)oNext+(ULONG)cbSizeType;
+ DebAssert(lTemp != 0, ""); // we're using 0 to signal an error
+ // condition -- Our callers should
+ // guarantee we can't get 0 here
+
+ if (lTemp > CBMAX_FARPTR_HEAPREQ)
+ oNext = 0; // overflow -- return 0 to signal an error
+ else
+ oNext = LOWORD(lTemp);
+ }
+ return oNext;
+}
+#pragma code_seg()
+
+
+extern char NEARDATA g_rgcbAlignment[TDESCKIND_MAX];
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::AlignmentTdesckind
+*Purpose:
+* Determine the alignment of a tdesckind.
+*
+*Implementation Notes:
+* Uses natural alignment - gets the size of the tdesckind, returns
+* that OR the value set by ICreateTypeInfo::SetAlignment, which ever
+* is less.
+*
+*Entry:
+* tdesckind
+*
+*Exit:
+* Returns alignment value for this type.
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+USHORT DYN_TYPEMEMBERS::AlignmentTdesckind(TYPEDESCKIND tdesckind)
+{
+ USHORT cbAlignment;
+
+ if (g_rgcbAlignment[tdesckind] == -1)
+ return 0xFFFF;
+
+ cbAlignment = (USHORT)g_rgcbAlignment[tdesckind];
+
+ // If we're dealing with an INT or a UINT and this is WIN16,
+ // the alignment is only 2.
+ //
+ if ((tdesckind == TDESCKIND_Int || tdesckind == TDESCKIND_Uint)
+ && m_pgtlibole->GetSyskind() == SYS_WIN16) {
+
+ DebAssert(cbAlignment == 4, "Confused?");
+ cbAlignment = 2;
+ }
+
+ return min(cbAlignment,
+ Pdtroot()->GetAlignment());
+}
+#pragma code_seg()
+
+
+#if ID_DEBUG
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::DebCheckDefnList
+*Purpose:
+* Check a defn list: one of (var, base, func)
+*
+*Implementation Notes:
+* Note: only PUBLIC names are in cache.
+* CONSIDER: the infokind param is anachronistic, each
+* defn carries its defnkind along with it. We should remove it.
+*
+*Entry:
+* uLevel
+* hdefn listhead
+* infokind list kind: one of (var, func, base)
+* inamcache index in cache array == type index + 1.
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+
+VOID DYN_TYPEMEMBERS::DebCheckDefnList(UINT uLevel,
+ HDEFN hdefn,
+ INFOKIND infokind,
+ UINT inamcache)
+{
+ HDEFN hdefnNext;
+ DEFN *qdefn;
+ HGNAM hgnamMbr;
+ BOOL isPublic;
+ TIPERROR err;
+
+ DebAssert((infokind == INFOKIND_Var) || (infokind == INFOKIND_Func),
+ "whoops! bad DEFN.");
+ DebAssert(m_pgtlibole == m_pdtroot->Pgdtinfo()->PgtlibOleContaining(),
+ "whoops! where are we now?");
+
+ while (hdefn != HDEFN_Nil) {
+ qdefn = m_tdata.QdefnOfHdefn(hdefn);
+
+ // cache handle of next in list so we don't have to
+ // redereference handle later.
+ //
+ hdefnNext = qdefn->HdefnNext();
+
+ err = m_pnammgr->HgnamOfHlnam(qdefn->Hlnam(), &hgnamMbr);
+ DebAssert(err == TIPERR_None, "bad name.");
+
+ if (m_pgtlibole->IsValidNameCache(inamcache)) {
+ // Test if variable/type/function is public
+ isPublic = FALSE;
+ switch (qdefn->Defnkind()) {
+ case DK_VarDefn:
+ case DK_MbrVarDefn:
+ isPublic = ((VAR_DEFN *)qdefn)->IsPublic();
+ break;
+ case DK_RecTypeDefn:
+ isPublic = ((RECTYPE_DEFN *)qdefn)->Access() == ACCESS_Public;
+ break;
+ case DK_FuncDefn:
+ case DK_VirtualFuncDefn:
+ isPublic = ((FUNC_DEFN *)qdefn)->IsPublic();
+ break;
+ default:
+ DebHalt("DebCheckState: bad defnkind.");
+ } // switch
+ if (isPublic) {
+ // Check it's in the cache.
+ DebAssert(m_pgtlibole->IsNameInCache(inamcache, hgnamMbr),
+ "whoops! name missing from cache.");
+ }
+ }
+
+ // get next
+ hdefn = hdefnNext;
+ } // end of while
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::DebCheckNameCache
+*Purpose:
+* Check type's name cache.
+*
+*Implementation Notes:
+* Looks a lot like BuildNameCache/UpdateNameCache
+*
+*Entry:
+* uLevel
+* inamcache index in cache array == type index + 1.
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+
+VOID DYN_TYPEMEMBERS::DebCheckNameCache(UINT uLevel, UINT inamcache)
+{
+ HFUNC_DEFN hfdefnFirstFunc;
+ HVAR_DEFN hvdefnFirstDataMember;
+
+ // Nothing to do if the cache is not yet valid...
+ if (!m_pgtlibole->IsValidNameCache(inamcache)) {
+ return;
+ }
+
+ // (1) Now iterate over member lists.
+ // - data members, functions
+ //
+ hvdefnFirstDataMember = m_tdata.HdefnFirstDataMbrNestedType();
+ DebCheckDefnList(uLevel,
+ hvdefnFirstDataMember,
+ INFOKIND_Var,
+ inamcache);
+
+ hfdefnFirstFunc = m_tdata.HfdefnFirstMeth();
+ DebCheckDefnList(uLevel,
+ hfdefnFirstFunc,
+ INFOKIND_Func,
+ inamcache);
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::DebCheckState - TYPEMEMBERS state
+*Purpose:
+* Check TYPEMEMBERS state
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+
+VOID DYN_TYPEMEMBERS::DebCheckState(UINT uLevel)
+{
+ UINT ityp;
+
+ m_tdata.DebCheckState(uLevel);
+ m_dtbind.DebCheckState(uLevel);
+
+ // Get type's index.
+ ityp = m_pdtroot->Pgdtinfo()->GetIndex();
+
+ // check name cache state
+ DebCheckNameCache(uLevel, ityp);
+}
+
+
+
+
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/typelib/dtmbrs.hxx b/private/oleauto/src/typelib/dtmbrs.hxx
new file mode 100644
index 000000000..04205da1a
--- /dev/null
+++ b/private/oleauto/src/typelib/dtmbrs.hxx
@@ -0,0 +1,361 @@
+/***
+*dtmbrs.hxx - DYN_TYPE_MEMBERS header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+* 05-Mar-91 ilanc: created
+* 19-Sep-91 ilanc: Stubbed GetMemberInfoOfHmember()
+* HlnamOfHmember()
+* 17-Oct-91 ilanc: Implement <LIST>::SetAtPosition
+* 05-Dec-91 ilanc: Rm Get/SetDocumentation (in TYPEINFO now).
+* 10-Jul-92 w-peterh: added layout of nested types
+* 18-Jan-93 w-peterh: use TIPERRORs internally
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef DTMBRS_HXX_INCLUDED
+#define DTMBRS_HXX_INCLUDED
+
+#include "silver.hxx"
+#include <string.h>
+#include "defn.hxx" // and cltypes.hxx
+#include "dtbind.hxx"
+
+
+class COMPILETIME_SEG;
+
+class NAMMGR;
+class DYN_TYPEROOT; // forward ref. Can't include
+ // "dtinfo.hxx" (which has definition)
+ // since it includes this file!
+class ENTRYMGR;
+class GEN_DTINFO;
+class GenericTypeLibOLE;
+# define STAT_TYPELIB GEN_PROJECT
+class GEN_PROJECT;
+class EVENT_SOURCE_TABLE;
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDTMBRS_HXX)
+#define SZ_FILE_NAME g_szDTMBRS_HXX
+#endif
+
+// CONSIDER: should be somewhere else
+class IObEvSourceInfo;
+TIPERROR TipCreateEvSourceInfo(ITypeInfoA *, IObEvSourceInfo **);
+
+/***
+*class DYN_TYPEMEMBERS - 'dtmbrs': Type members implementation.
+*Purpose:
+* The class implements type members.
+*
+***********************************************************************/
+
+class DYN_TYPEMEMBERS
+{
+ friend class COMPILETIME_SEG; // ::~COMPILETIME_SEG();
+ // friend TIPERROR DYN_TYPEROOT::GetDtmbrs(DYN_TYPEMEMBERS **pdtmbrs);
+ friend DYN_TYPEROOT;
+ // friend TIPERROR GEN_DTINFO::GetTypeMembers(TYPEMEMBERS **); // so it can invalidate.
+ friend GEN_DTINFO;
+
+ // friend VOID TYPE_DATA::SwapbmData(BOOL fSwapFirst);
+ friend TYPE_DATA;
+
+public:
+ DYN_TYPEMEMBERS();
+ nonvirt TIPERROR Init(SHEAP_MGR *psheapmgr, DYN_TYPEROOT *pdtroot);
+
+ // overridden methods
+ virtual VOID Release();
+ virtual VOID AddRef();
+ virtual TYPEKIND GetTypeKind();
+ virtual TIPERROR MakeLaidOut();
+ virtual BOOL IsLaidOut();
+ virtual UINT GetSize();
+
+ // Debug/test methods
+#if ID_DEBUG
+ nonvirt VOID DebShowState(UINT uLevel);
+ nonvirt VOID DebCheckState(UINT uLevel);
+ nonvirt UINT DebShowSize();
+ nonvirt VOID DebCheckNameCache(UINT uLevel,
+ UINT inamcache);
+ nonvirt VOID DebCheckDefnList(UINT uLevel,
+ HDEFN hdefn,
+ INFOKIND infokind,
+ UINT inamcache);
+#else
+ nonvirt VOID DebShowState(UINT uLevel) {}
+ nonvirt VOID DebCheckState(UINT uLevel) {}
+ nonvirt VOID DebShowSize() {}
+ nonvirt VOID DebCheckNameCache(UINT uLevel,
+ UINT inamcache) {}
+ nonvirt VOID DebCheckDefnList(UINT uLevel,
+ HDEFN hdefn,
+ INFOKIND infokind,
+ UINT inamcache) {}
+#endif
+
+ // introduced methods
+ nonvirt VOID AddInternalRef();
+ nonvirt VOID RelInternalRef();
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt TIPERROR HlnamOfHmember(HMEMBER hmember, sHLNAM *phlnam);
+
+ nonvirt TIPERROR GetTypeData(TYPE_DATA **pptdata);
+ nonvirt TYPE_DATA *Ptdata();
+ nonvirt TIPERROR GetDefnTypeBind(DEFN_TYPEBIND **ppdfntbind);
+ nonvirt DYN_TYPEROOT *Pdtroot() const;
+
+ nonvirt TIPERROR BuildBindNameTable();
+ nonvirt TIPERROR BuildNameCache(UINT inamcache);
+ nonvirt USHORT GetNestDepth();
+
+
+ UINT LayoutVar(TYPEDESCKIND tdesckind,
+ USHORT *puOffset,
+ USHORT *puOffsetNext,
+ UINT cbSizeType,
+ BOOL isStackFrame,
+ UINT uStackAlignment);
+ TIPERROR LayoutVarOfHvdefn(TYPEKIND tkind,
+ HVAR_DEFN hvdefn,
+ USHORT *puOffset,
+ UINT *puAlignment,
+ BOOL isStackFrame,
+ UINT uStackAlignment,
+ BOOL fIgnoreHvdefn = FALSE);
+
+ TIPERROR LayoutStaticVarOfHvdefn(TYPEKIND tkind,
+ HVAR_DEFN hvdefn,
+ UINT *puAlignment);
+
+
+ nonvirt USHORT GetSizeOfStaticInstance();
+ TIPERROR GetSizeAlignmentOfHtdefnNonUdt(TYPEKIND tkind,
+ BOOL isSimpleType,
+ HTYPE_DEFN htdefn,
+ UINT *pcbSizeType,
+ UINT *pcbAlignment);
+ TIPERROR GetSizeAlignmentOfHtdefnUdt(HTYPE_DEFN htdefn,
+ UINT *pcbSizeType,
+ UINT *pcbAlignment);
+ TIPERROR GetSizeAlignmentOfHtdefn(TYPEKIND tkind,
+ BOOL isEmbeddedTypeDefn,
+ HTYPE_DEFN htdefn,
+ UINT *pcbSizeType,
+ UINT *pcbAlignment);
+ TIPERROR GetSizeAlignmentOfArray(TYPEKIND tkind,
+ HTYPE_DEFN htdefn,
+ UINT *pcbSizeType,
+ UINT *pcbAlignment);
+
+ USHORT AlignmentTdesckind(TYPEDESCKIND tdesckind);
+
+ // Public data members
+ static LPSTR szProtocolName;
+ static LPSTR szBaseName;
+
+ static CONSTDATA UINT oDtbind;
+
+protected:
+ nonvirt VOID Invalidate();
+ TIPERROR Layout();
+
+ TIPERROR UpdateBinderOptimization(HLNAM hlnam, UINT ityp, BOOL fType);
+ TIPERROR UpdateNameCacheOfHdefnList(HDEFN hdefn,
+ INFOKIND infokind,
+ UINT ityp);
+ TIPERROR UpdateNameCacheOfBaseClass(ITypeInfoA *ptinfo,
+ UINT ityp);
+
+ ~DYN_TYPEMEMBERS();
+
+ TIPERROR AllocHmembers();
+ TIPERROR LayoutMembers();
+ TIPERROR LayoutBases(TYPEKIND tkind, UINT *puOffset, UINT *puAlignment);
+ TIPERROR LayoutDataMembers(TYPEKIND tkind,
+ UINT *puOffset,
+ UINT *puAlignment,
+ HDEFN hdefnFirst);
+ TIPERROR GenerateOverrides();
+ static UINT AdjustForAlignment(UINT oVarCur,
+ UINT cbAlignment,
+ BOOL isStackFrame);
+
+ static UINT AlignMember(USHORT *puOffset,
+ UINT cbAlignment,
+ UINT cbSizeType,
+ BOOL isStackFrame);
+ DYN_TYPEBIND *Pdtbind() const;
+
+ TIPERROR VerifyValidUDT(HTYPE_DEFN htdefn,
+ BOOL isSimpleType,
+ BOOL *pisRecord,
+ BOOL *pisPrivateClass,
+ BOOL *phasCoclass,
+ BOOL *pisValidWithNew);
+
+ TIPERROR VerifyFunctionUdts(HFUNC_DEFN hfdefn);
+
+ // These two methods are OB-specific but we don't switch them
+ // out since their implementation is switched out.
+ //
+ TIPERROR AllocHmembersNestedType(UINT uOrdinal);
+ TIPERROR LayoutNestedType(HRECTYPE_DEFN hrtdefn, UINT ordinal);
+
+ TIPERROR LayoutEventSources();
+
+ TYPE_DATA m_tdata; // embedded TYPE_DATA
+ DYN_TYPEBIND m_dtbind; // embedded DYN_TYPEBIND
+ DYN_TYPEROOT *m_pdtroot;
+
+ NAMMGR *m_pnammgr; // cached name manager
+ ENTRYMGR *m_pentmgr; // cached ENTRYMGR
+ IMPMGR *m_pimpmgr; // cached IMPMGR
+ GenericTypeLibOLE *m_pgtlibole; // cached typelib.
+
+ ITypeInfoA *m_ptinfoCopy; // cached typeinfo we're copying to.
+
+ // following flags fit into a single 16-bit USHORT.
+ union {
+ struct {
+ USHORT m_isLaidOut:1;
+ USHORT m_nestDepth:HMEMBER_NestDepthSize;
+ USHORT m_undone2:(10 - HMEMBER_NestDepthSize);
+ USHORT undone:5;
+ };
+ USHORT m_uFlags;
+ };
+
+ // the following member is needed for laying out the static local variables
+ USHORT m_uOffsetOfNextStaticVar;
+
+ static USHORT uMagicNumber;
+ static USHORT uVersionCur;
+
+};
+
+
+// inline methods
+//
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::GetTypeDescKindEnumImpl
+*Purpose:
+* Returns the size of the instance for static variables for the module.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline USHORT DYN_TYPEMEMBERS::GetSizeOfStaticInstance()
+{
+ return m_uOffsetOfNextStaticVar;
+}
+
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::Pdtroot
+*Purpose:
+* Retruns pointer to type root
+*
+*Implementation Notes:
+* Does not increment ref count -- since this is the method
+* that clients should use when they wish to cache
+* a TYPE_DATA pointer in cases in which the container's
+* lifetime is known to be at least as long as the TYPE_DATA.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline DYN_TYPEROOT *DYN_TYPEMEMBERS::Pdtroot() const
+{
+ return m_pdtroot;
+}
+
+
+/***
+*PUBLIC DYN_TYPEMEMBERS::Ptdata
+*Purpose:
+* Retruns pointer to typedata.
+*
+*Implementation Notes:
+* Does not increment ref count -- since this is the method
+* that clients should use when they wish to cache
+* a TYPE_DATA pointer in cases in which the container's
+* lifetime is known to be at least as long as the TYPE_DATA.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline TYPE_DATA *DYN_TYPEMEMBERS::Ptdata()
+{
+ return &m_tdata;
+}
+
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::Pdtbind
+*Purpose:
+* Returns pointer to type bind. Private so that only
+* friends can use it.
+*
+*Implementation Notes:
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline DYN_TYPEBIND *DYN_TYPEMEMBERS::Pdtbind() const
+{
+ return (DYN_TYPEBIND *)&m_dtbind;
+}
+
+/***
+*PRIVATE DYN_TYPEMEMBERS::GetNestDepth
+*Purpose:
+* Returns the nesting depth of base interfaces
+*
+*Implementation Notes:
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline USHORT DYN_TYPEMEMBERS::GetNestDepth()
+{
+ return m_nestDepth;
+}
+
+
+
+
+
+#endif // ! DTMBRS_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/dyntinfo.hxx b/private/oleauto/src/typelib/dyntinfo.hxx
new file mode 100644
index 000000000..300e9e0b2
--- /dev/null
+++ b/private/oleauto/src/typelib/dyntinfo.hxx
@@ -0,0 +1,90 @@
+/***
+*dyntinfo.hxx - DYNTYPEINFO header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Defines the DYNTYPEINFO protocol.
+*
+*Revision History:
+*
+* 03-Oct-91 alanc: Created.
+* 25-Aug-92 rajivk: Support for ensuring all needed to be brought to
+* runnable state.
+* 18-Jan-93 w-peterh: removed IMPTYPEINFO
+*
+*****************************************************************************/
+
+#ifndef DYNTInfo_HXX_INCLUDED
+#define DYNTInfo_HXX_INCLUDED
+
+#include "tinfo.hxx"
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szDYNTINFO_HXX)
+#define SZ_FILE_NAME g_szDYNTINFO_HXX
+#endif
+
+
+struct TINODE;
+
+/***
+*class DYNTYPEINFO - 'dti': DYNAMIC TYPEINFO protocol
+*Purpose:
+* Dynamic TypeInfo protocol
+***********************************************************************/
+
+class DYNTYPEINFO : public TYPEINFO
+{
+public:
+ static const LPSTR szProtocolName;
+
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
+
+ virtual TIPERROR GetMemberName(HMEMBER hmember, BSTRA *plstrName) = 0;
+ virtual TIPERROR GetDynTypeMembers(LPLPDYNTYPEMEMBERS lplpDynTypeMembers) = 0;
+ virtual TIPERROR GetDefnTypeBind(LPLPDEFNTBIND lplpDefnTypeBind) = 0;
+ virtual TIPERROR GetTypeFixups(LPLPTYPEFIXUPS lplpTypeFixups) = 0;
+ // virtual TYPEKIND GetTypeKind() = 0;
+ virtual TIPERROR Reset() = 0;
+ // virtual TIPERROR GetDocumentation(BSTRA *plstr) = 0;
+ // virtual DWORD GetHelpContext() = 0;
+ // virtual TIPERROR GetHelpFileName(BSTRA *plstrFile) = 0;
+ // virtual TIPERROR GetIcon(DWORD *pdw) = 0;
+#if 0
+ virtual TIPERROR CreateInst(LPLPVOID lplpObj) = 0;
+#endif
+
+ // Introduced Methods.
+ virtual TIPERROR Read() = 0;
+ virtual TIPERROR Write() = 0;
+ // Introduced Methods for bringing all needed class to runnable.
+ virtual TIPERROR BeginDepIteration(TINODE **pptinode,
+ TINODE ***ppptinodeCycleMax) = 0;
+ virtual VOID EndDepIteration() = 0;
+ virtual TIPERROR GetNextDepTypeInfo(DYNTYPEINFO **ppdtiNext) = 0;
+ virtual BOOL IsReady() = 0;
+ virtual TIPERROR AllDepReady() = 0;
+ virtual TIPERROR NotReady() = 0;
+
+ virtual TIPERROR CommitChanges() = 0;
+
+
+/*****
+ These are disabled because our implementation make them confusing
+ since they change information stored in the TypeLib directory and
+ so require that the directory be saved
+ virtual TIPERROR SetDocumentation(LPSTR szDoc) = 0;
+ virtual TIPERROR SetHelpContext(ULONG ulHelpIndex) = 0;
+*****/
+
+#ifdef DYNTYPEINFO_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+#endif // DYNTInfo_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/ebvers.h b/private/oleauto/src/typelib/ebvers.h
new file mode 100644
index 000000000..96c58e64a
--- /dev/null
+++ b/private/oleauto/src/typelib/ebvers.h
@@ -0,0 +1,22 @@
+/***
+*ebvers.h - Version of OB to build
+*
+* Copyright (C) 1990, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file determines what version of OB to build.
+*
+*Revision History:
+*
+* 24-Aug-90 Created
+*
+*****************************************************************************/
+
+#ifndef EBVERS_HXX_INCLUDED
+#define EBVERS_HXX_INCLUDED
+
+// Change the following to 1 if you want to build VBA2.
+#define VBA2 1
+
+#endif // !EBVERS_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/entrymgr.cxx b/private/oleauto/src/typelib/entrymgr.cxx
new file mode 100644
index 000000000..960ec4d46
--- /dev/null
+++ b/private/oleauto/src/typelib/entrymgr.cxx
@@ -0,0 +1,1017 @@
+/**
+*cl\EntryMgr.cxx - Entry Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* One instance of this class exists for every GEN_DTINFO.
+* The ENTRYMGR resides in the compile-time segment.
+* ENTRYMGR is a repository for the small subset of information
+* known to DYN_TYPEMEMBERS needed to build a TYPEFIXUPS.
+* Because this information is stored in the ENTRYMGR,
+* it is not necessary to load a DYN_TYPEMEMBERS instance in order to
+* load a class for execution.
+* ENTRYMGR builds tnative, tnativeAddr and VFT_MGR.
+*
+* The Type Compiler is responsible for invoking methods on the
+* ENTRYMGR to define the entry points
+* One NATIVEENTRYDATA exists for every introduced method in this class.
+*
+* When we bring the class to Addressable state we build up the VTABLE(s).
+* The Layout of the Vtable looks like this:
+*
+*
+* +-------+
+* -->| |__\ Pointer to the Primary Interface (VTable).
+* 0| | /
+* |-------|
+* 1| |__\ Pointer to the first Source Interface (VTable).
+* | | /
+* |-------|
+* 2| |
+* | |
+* |-------|
+* 3| |
+* | |
+* |-------|
+* | |
+* | : |
+* | : |
+* | : |__\ Pointer to the n'th Source Interface (Vtable).
+* | : | /
+* +-------+
+*
+*Revision History:
+*
+* 16-Apr-91 alanc: Created.
+* 10-Dec-91 ilanc: Override --> SetOverride
+* ClassAttr --> SetClassAttr
+* 03-Jun-92 w-peterh: Code Cleanup
+* 07-Jul-92 w-peterh: enabled linking to OB.DLL and to functions
+* in statically linked host via Declare stmnts
+* 21-Jul-92 w-peterh: enabled copying of record instanciation stubs
+* into tnative
+* 25-Aug-92 petergo: added vtable support.
+* 15-Nov-92 RajivK: added GetSize and DebGetSize
+* 14-Dec-92 w-peterh: Document AddressOfDllEntry
+* made OtexOfHmember() a release function
+* 08-Dec-92 RajivK: Support for InvokeKind
+* 08-Jan-93 RajivK: Support for Code Resource on Mac
+* 08-Jan-93 RajivK: Fixed some undone(s)
+* 15-Jan-93 RajivK: Support for late binding for DLL functions
+* 30-Apr-93 w-jeffc: made DEFN data members private
+* 22-May-93 w-barryb: Rename OB to VBA
+* 13-Jan-94 jeffrob: native entrypts Free interface changes (OE_RISC)
+*
+*****************************************************************************/
+
+#include "typelib.hxx"
+#include "switches.hxx"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <new.h>
+
+// Include windows.h for AllocDStoCSAlias and Dll functions
+// CONSIDER: adding moving this to another file
+
+#include "silver.hxx"
+#include "xstring.h"
+#include "entrymgr.hxx"
+
+#include "stream.hxx"
+#include "impmgr.hxx"
+#include "nammgr.hxx"
+
+#include "gdtinfo.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+
+// These includes are here to support CODE RESOURCES on Mac.
+// These has to be after hdrstop pragma so that it does not
+// break the fast build on MAC.
+#if OE_MAC
+#include <types.h>
+#include <macos\memory.h>
+#include <string.h>
+#include <aslm.h>
+#include <osutils.h>
+#include <traps.h>
+#include "sysutils.h"
+
+
+
+#if OE_MACPPC
+#include <fragload.h>
+#endif
+
+extern "C" {
+USHORT NumToolboxTraps(void);
+BOOL TrapExists(USHORT sTrapNo);
+
+}
+
+
+
+#if 0
+#define HINSTANCE_SLMLIBLOADED ((Handle)-2)
+#define ForceLibMgrInit() (!g_LibMgrInited ? g_LibMgrInited = (InitLibraryManager(0,kCurrentZone,kNormalMemory) ==0), g_LibMgrInited : TRUE)
+static BOOL g_LibMgrInited=0;
+#endif //0 (ASLM has been cut)
+
+#endif // OE_MAC
+
+
+TIPERROR OvftOfInitTerm(ITypeInfo *ptinfo, BOOL fInit, int *povft);
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleEntryMgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleEntryMgrCxx
+#else
+static char szEntryMgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szEntryMgrCxx
+#endif
+#endif //ID_DEBUG
+
+//this is a table used to map runtime function ordinals to the address of the function
+//on the Mac.
+#if OE_MAC
+extern "C" void *rgMacStrdcl[]; //generated by build process in strdcl.c
+#endif
+
+#define MAX_NAME 255
+
+// Define class constants
+CONSTDATA WORD ENTRYMGR::wFirstSerWord = 'E' * 256 + 'M';
+CONSTDATA WORD ENTRYMGR::cbSizeSerMem =
+ offsetof(ENTRYMGR, m_cbTNativeSize) -
+ offsetof(ENTRYMGR, m_hdllentrydefnFirst) +
+ sizeof(((ENTRYMGR*)NULL)->m_cbTNativeSize);
+
+CONSTDATA WORD ENTRYMGR::wCurFormat = 0;
+
+
+#define RSRCNAME_ENTRYPTS WIDE("EntryPts")
+#define RSRCNAME_DLL WIDE("DllEntryPts")
+#define RSRCNAME_IID_PREFIX WIDE("_IID_")
+#define RSRCNAME_IID_PREFIX_SIZE (5 * sizeof(OLECHAR))
+
+#define RSRCNAME_VFTEXE(a) 0
+#define RSRCTYPE 0
+
+
+#if !OE_MAC
+extern "C" {
+void PASCAL ClassTemplateStart(void);
+void PASCAL ClassTemplateStartPrimary(void);
+void PASCAL ClassTemplateFixupOFFSET(void);
+}
+#endif
+
+// constructor
+//
+#pragma code_seg( CS_CORE2 )
+ENTRYMGR::ENTRYMGR ()
+{
+}
+#pragma code_seg( )
+
+#pragma code_seg( CS_CORE )
+ENTRYMGR::~ENTRYMGR()
+{
+ // Release the Loaded libraries for non-OB libs
+ // The INSTMGR does it for OB.
+ //
+ ReleaseDllEntries(this);
+
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC ENTRYMGR::Init - Initialize an ENTRYMGR instance
+*Purpose:
+* Initializes the data member.
+*
+*Note:
+* *pinstmgr should be initialized before calling this function.
+*
+*
+*Entry:
+* psheapmgr - pointer to SHEAPMGR for initializing blocks
+* pdtroot - pointer to DYN_TYPEROOT for INSTMGR
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR ENTRYMGR::Init(SHEAP_MGR * psheapmgr,
+ DYN_TYPEROOT *pdtroot)
+{
+
+ DebAssert(psheapmgr != NULL, "ENTRYMGR::Init - invalid SHEAP_MGR");
+ DebAssert(pdtroot != NULL, "ENTRYMGR::Init : invalid DYN_TYPEROOT");
+
+ m_pdtroot = pdtroot;
+ m_cbTNativeSize = 0;
+ m_cbTExtEntrySize = 0;
+ m_cbVftbl = 0;
+ m_hdllentrydefnFirst = HDLLENTRYDEFN_Nil;
+ m_hvtdFirst = HCHUNK_Nil;
+
+
+
+ return m_bmEntryData.Init(psheapmgr);
+}
+#pragma code_seg( )
+
+/***
+*PUBLIC ENTRYMGR::DllEntryNameOfHchunk
+*Purpose:
+* Returns the name of the Dll entry point.
+*
+*Entry:
+* hchunk : Handle to the Dll entry name.
+*Exit:
+* szName : Client allocated buffer for the dll name.
+*
+*
+***********************************************************************/
+
+TIPERROR ENTRYMGR::DllEntryNameOfHchunk(HCHUNK hchunk, LPSTR lpstr, UINT cch)
+{
+ BYTE *qbStr;
+
+ // Get the qointer that points to Name of the Dll entry
+ qbStr = m_bmEntryData.QtrOfHandle(hchunk);
+
+ if (cch < xstrblen0((XCHAR *)qbStr))
+ return TIPERR_BufferTooSmall;
+
+ // Copy the string in the memory allocated.
+ xstrcpy(lpstr, (XCHAR *)qbStr);
+
+ return TIPERR_None;
+}
+
+/***
+*PUBLIC ENTRYMGR::Decompile(COMPSTATE compstate)
+*Purpose:
+* Brings this down to compstate
+*
+*Entry:
+* compstate - state to go to
+*
+*Exit:
+* None
+*
+*Note:
+* ENTRYMGR::Decompile() and INSTMGR::Decompile() should
+* allways be called together
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID ENTRYMGR::Decompile(COMPSTATE compstate)
+{
+ return;
+}
+#pragma code_seg( )
+
+
+
+
+/***
+*PUBLIC ENTRYMGR::AllocDllentrydefn
+*
+*Purpose:
+* Allocates a DLLENTRY_DEFN for an entry point specified by a name
+*
+*Entry:
+* hlnamDllModule - dll module name
+* hasordinal - is the entry by ordinal
+* phdllentrydefn - return location
+*
+*Exit:
+* returns a handle to the entry point
+*
+***********************************************************************/
+
+TIPERROR ENTRYMGR::AllocDllentrydefn(HDLLENTRY_DEFN *phdllentrydefn,
+ HLNAM hlnamDllModule,
+ BOOL fHasOrdinal)
+{
+ TIPERROR err = TIPERR_None;
+ DLLENTRY_DEFN *qdllentrydefn;
+
+ DebAssert(phdllentrydefn != NULL,
+ "ENTRYMGR::AllocDllentrydefn invalid pointer");
+ DebAssert(hlnamDllModule != HLNAM_Nil,
+ "ENTRYMGR::AllocDllentrydefn invalid handle");
+
+
+ // allocate dllentrydefn in m_bmDllEntryDefns of INSTMGR for OB. But for
+ // typelib.dll we allocate it in entrymgr's blockmgr
+ IfErrRet(m_bmEntryData.AllocChunk(phdllentrydefn,
+ sizeof(DLLENTRY_DEFN)));
+
+ qdllentrydefn = QdllentrydefnOfHdllentrydefn(*phdllentrydefn);
+
+ // populate dllentrydefn
+ qdllentrydefn->SetHlnamDllName(hlnamDllModule);
+ qdllentrydefn->SetHasOrdinal(fHasOrdinal);
+ qdllentrydefn->SetLpDllEntryPoint(NULL); // native entry for DLLs are
+ // allocated in MakeAddressable.
+ qdllentrydefn->SetHLibrary(0); // Library not loaded yet.
+
+
+
+ // link it in list
+ qdllentrydefn->SetHdllentrydefnNext(m_hdllentrydefnFirst);
+ m_hdllentrydefnFirst = *phdllentrydefn;
+
+ return err;
+}
+
+
+/***
+*PUBLIC ENTRYMGR::ReleaseDllentrydefn
+*
+*Purpose:
+* Releases a dllentry defn that has been allocated with
+* AllocDllentrydefn()
+*
+*Entry:
+* hdllentrydefn - handle to release
+*
+*Exit:
+* VOID
+*
+***********************************************************************/
+
+VOID ENTRYMGR::ReleaseDllentrydefn(HDLLENTRY_DEFN hdllentrydefn)
+{
+ DLLENTRY_DEFN *qdllentrydefn;
+ HDLLENTRY_DEFN hdllentrydefnPrev, hdllentrydefnCurr;
+
+ DebAssert(hdllentrydefn != HDLLENTRYDEFN_Nil,
+ "ReleaseDllentrydefn - invalid handle");
+
+ // ensure the list exists
+ DebAssert(m_hdllentrydefnFirst != HDLLENTRYDEFN_Nil,
+ "ReleaseDllEntryDefn - invalid handle");
+
+
+ // Assert that the module's compilation state is less than ADDRESSABLE
+ // state
+ DebAssert(m_pdtroot->CompState() < CS_ADDRESSABLE,
+ " First decompile the module ");
+
+ // find defn in list
+ hdllentrydefnPrev = HDLLENTRYDEFN_Nil;
+ hdllentrydefnCurr = m_hdllentrydefnFirst;
+
+ // move hdllentrydefnPrev so that it points
+ // to the defn before the one that we want to release
+ while (hdllentrydefnCurr != hdllentrydefn) {
+ hdllentrydefnPrev = hdllentrydefnCurr;
+ hdllentrydefnCurr = QdllentrydefnOfHdllentrydefn(hdllentrydefnCurr)->
+ HdllentrydefnNext();
+
+ // ensure we haven't come to the end of the list
+ DebAssert(hdllentrydefnCurr!= HDLLENTRYDEFN_Nil,
+ "ENTRYMGR::ReleaseDllEntryDefn - invalid handle");
+ } /* while */
+
+ // unlink defn
+ qdllentrydefn = QdllentrydefnOfHdllentrydefn(hdllentrydefn);
+ if (hdllentrydefnPrev == HDLLENTRYDEFN_Nil) {
+ m_hdllentrydefnFirst = qdllentrydefn->HdllentrydefnNext();
+ }
+ else {
+ QdllentrydefnOfHdllentrydefn(hdllentrydefnPrev)->
+ SetHdllentrydefnNext(qdllentrydefn->HdllentrydefnNext());
+ }
+
+ // Free the library if it was loaded
+ // For OB, This works for Mac, Win16, Win32.
+ // MAC Typelib: supports calling SLM DLL.
+#if OE_MAC
+#if 0
+ XCHAR rgbuffer[MAX_NAME]; // CONSIDER:how big should this really be?
+ NAMMGR *pnammgr;
+ TIPERROR err;
+
+ if (qdllentrydefn->HLibrary() == HINSTANCE_SLMLIBLOADED) {
+ err = m_pdtroot->GetNamMgr(&pnammgr);
+ // UNDONE MAC: Needs to return error.
+ DebAssert(err, " Cannot handle error ");
+
+ // load library Name
+ err = pnammgr->StrOfHlnam(qdllentrydefn->HlnamDllName(), rgbuffer,
+ sizeof(rgbuffer));
+
+ DebAssert(err, " cannot handle error ");
+
+ ReleaseLibrary((Handle)rgbuffer);
+ qdllentrydefn->SetHLibrary(NULL);
+ }
+#endif //0
+#else // OE_WIN
+ ReleaseLibrary(qdllentrydefn->HLibrary());
+#endif // OE_MAC & EI_OB
+
+ // Free the Native EntryPoint if it was allocated
+
+ // free instance
+ // free dllentrydefn : dllentrydefn is allocated at a different place
+ // in case of OB and OLE.
+ m_bmEntryData.FreeChunk(hdllentrydefn, sizeof(DLLENTRY_DEFN));
+
+ return;
+}
+
+
+
+
+
+/***
+*PUBLIC ENTRYMGR::Read - read entry manager from stream
+*
+*Purpose:
+* Called by containing TYPE_INFO to read embedded ENTRYMGR
+* instance from stream.
+*
+*Entry:
+* psstrm - stream from which ENTRYMGR is read
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR ENTRYMGR::Read(STREAM *pstrm)
+{
+ WORD w;
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "ENTRYMGR::Read - invalid stream");
+
+ DebAssert(((m_cbTNativeSize == 0)
+ && (m_hdllentrydefnFirst == HDLLENTRYDEFN_Nil)
+ && (m_cbTExtEntrySize == 0)),
+ "ENTRYMGR::Read: data table not empty");
+
+ IfErrRet( pstrm->ReadUShort(&w) );
+
+ if (w != wFirstSerWord || DebErrorNow(TIPERR_InvDataRead)) {
+ return TIPERR_InvDataRead;
+ }
+
+ IfErrRet( pstrm->ReadUShort(&w) );
+
+ if (w != wCurFormat || DebErrorNow(TIPERR_UnsupFormat)) {
+ return TIPERR_UnsupFormat;
+ }
+
+ // Read in persistent ENTRYMGR members
+ IfErrRet(pstrm->Read((BYTE *)&m_hdllentrydefnFirst, cbSizeSerMem));
+
+#if HP_BIGENDIAN
+ SwapStruct(&m_hdllentrydefnFirst, ENTRYMGR_Layout);
+#endif
+
+ // Read in Entry Data block
+ IfErrRet(m_bmEntryData.Read(pstrm));
+
+
+ // Swap back the DllENTRY_DEFN(s)
+#if HP_BIGENDIAN
+ // Swap the Dll entry Defn(s)
+ SwapDllentrydefns(TRUE);
+
+#endif
+
+ // If Code page conversion is needed then walk all the Dll EntryDefns a
+ // CodePage translate the STRING(s) (i.e. DllEntry Name);
+ //
+
+
+ return TIPERR_None;
+}
+
+
+
+/***
+*PUBLIC ENTRYMGR::Write - Write ENTRYMGR to stream
+*
+*Purpose:
+* Called by containing TYPE_INFO to write ENTRYMGR instance to stream.
+*
+*Entry:
+* psstrm - pointer of stream to write to
+*
+*Exit:
+* returns TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR ENTRYMGR::Write(STREAM *pstrm)
+{
+ TIPERROR err = TIPERR_None;
+
+ DebAssert(pstrm != NULL, "ENTRYMGR::Write - invalid STREAM");
+
+ // Write out identification byte and version number
+ IfErrRet( pstrm->WriteUShort(wFirstSerWord) );
+ IfErrRet( pstrm->WriteUShort(wCurFormat) );
+
+#if HP_BIGENDIAN
+ SwapStruct(&m_hdllentrydefnFirst, ENTRYMGR_Layout);
+#endif
+
+ // Write out persistent ENTRYMGR members
+ err = pstrm->Write((BYTE *)&m_hdllentrydefnFirst, cbSizeSerMem);
+
+#if HP_BIGENDIAN
+ SwapStruct(&m_hdllentrydefnFirst, ENTRYMGR_Layout);
+#endif
+ IfErrRet(err);
+
+
+ // Write out Entry Data block
+ err = m_bmEntryData.Write(pstrm);
+
+
+ return err;
+}
+#pragma code_seg()
+
+
+#if HP_BIGENDIAN
+/***
+*PUBLIC ENTRYMGR::SwapDllentrydefns
+*Purpose:
+* Swap a DLLENTRY_DEFN(s). For OB it swaps the dllentrydefn stored in
+* Instmgr and for OLE this swaps the entrymgr stored in Entrymgr.
+*
+*Entry:
+* None;
+*
+*Exit:
+* fSwapFirst : if True then swap the DLLENTRYDEFN first before accessing
+* the m_dllentrydefnNext field.
+*
+*Errors:
+* NONE.
+*
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID ENTRYMGR::SwapDllentrydefns(BOOL fSwapFirst)
+{
+ HDLLENTRY_DEFN hdllentrydefnNext;
+ DLLENTRY_DEFN *qdllentrydefn;
+
+
+
+ Lock();
+
+ // if fSwapFirst is TRUE then we need to swap the structure before accessing
+ // any datamember in the DLLENTRY_DEFN.
+ if (fSwapFirst) {
+ for (hdllentrydefnNext = m_hdllentrydefnFirst;
+ hdllentrydefnNext != HDLLENTRYDEFN_Nil;
+ qdllentrydefn = QdllentrydefnOfHdllentrydefn(hdllentrydefnNext),
+ SwapStruct(qdllentrydefn, DLLENTRY_DEFN_LAYOUT),
+ hdllentrydefnNext = qdllentrydefn->HdllentrydefnNext());
+
+ // end of FOR Loop
+ }
+ else {
+ for (hdllentrydefnNext = m_hdllentrydefnFirst;
+ hdllentrydefnNext != HDLLENTRYDEFN_Nil;
+ qdllentrydefn = QdllentrydefnOfHdllentrydefn(hdllentrydefnNext),
+ hdllentrydefnNext = qdllentrydefn->HdllentrydefnNext(),
+ SwapStruct(qdllentrydefn, DLLENTRY_DEFN_LAYOUT));
+ // end of FOR Loop
+ }
+
+
+ Unlock();
+}
+#pragma code_seg( )
+#endif //HP_BIGENDIAN
+
+
+
+
+
+
+
+#if ID_DEBUG
+
+
+/***
+*PUBLIC ENTRYMGR::DebCheckState
+*Purpose:
+* Check internal state of ENTRYMGR
+*
+*Entry:
+* uLevel
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+VOID ENTRYMGR::DebCheckState(UINT uLevel) const
+{
+}
+
+
+
+#endif //ID_DEBUG
+
+
+///////////////////////////////////////////////////////////////////////
+//
+// Below are the functions needed by EntryMgr at compile time (for OLE)
+// and is also needed by INSTMGR at RunTime. Hence they are Global functions.
+// WHY??? b'cos INSTMGR is not included in OLE. :)
+//
+//
+/***
+*ReleaseLibrary(HANDLE hLibrary)
+*Purpose:
+* Release one library.
+* Note:- On MAC this function releases the CODE RESOURCE.
+*
+*Entry:
+* hLibrary - handle to librry to release
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+// UNDONE: MPPC. Need to free CFM DLLs
+#if OE_MAC
+VOID ReleaseLibrary(Handle hLibrary)
+{
+
+// UNDONE: PPC: [jimcool]: PowerPC doesn't do DLL binding yet. (1-12-94)
+#if OE_MAC68K
+ if (hLibrary != 0) {
+#if 0
+ UnloadClass(FunctionSetID((LPSTR)hLibrary)); // UNDONE: MAC68k do these ref count correctly?
+#else //0
+ DebHalt("how'd it get set?");
+#endif //0
+ }
+#endif // OE_MAC68K
+}
+#else
+VOID ReleaseLibrary(HINSTANCE hLibrary)
+{
+ // ensure library is valid
+ if (hLibrary >= (HINSTANCE) HINSTANCE_ERROR) {
+ FreeLibrary(hLibrary);
+ } /* if */
+ return;
+}
+#endif
+
+
+/***
+*ReleaseDllEntries()
+*Purpose:
+* Releases all the loaded libraries
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID ReleaseDllEntries(VOID *pv)
+{
+ ENTRYMGR* pmgr=((ENTRYMGR*)pv);
+ DLLENTRY_DEFN *qdllentrydefn;
+ HDLLENTRY_DEFN hdllentrydefn;
+
+ // iterate over list of DLLENTRY_DEFNs and release the Lib.
+ hdllentrydefn = pmgr->m_hdllentrydefnFirst;
+
+ while (hdllentrydefn != HDLLENTRYDEFN_Nil) {
+
+
+ qdllentrydefn = pmgr->QdllentrydefnOfHdllentrydefn(hdllentrydefn);
+
+ ReleaseLibrary(qdllentrydefn->HLibrary());
+
+ qdllentrydefn->SetHLibrary(0);
+ qdllentrydefn->SetLpDllEntryPoint(NULL);
+ hdllentrydefn = qdllentrydefn->HdllentrydefnNext();
+ }
+ return;
+}
+#pragma code_seg()
+
+////////////////////////////////////////////////////////////////////////
+//
+// Function common to both ENTRYMGR(for OLE) and INSTRMGR(for OB)
+//
+////////////////////////////////////////////////////////////////////////
+TIPERROR ENTRYMGR::GetAddressOfDllentry(HDLLENTRY_DEFN hdllentrydefn,VOID **ppv
+#if OE_MACPPC
+ , DLLTEMPLATECALLBLOCK *pDllBlock
+#endif // OE_MACPPC
+)
+
+{
+ DLLENTRY_DEFN *qdllentrydefn;
+ NAMMGR *pnammgr;
+ TIPERROR err = TIPERR_None;
+ XCHAR rgbuffer[MAX_NAME];
+
+
+ qdllentrydefn = QdllentrydefnOfHdllentrydefn(hdllentrydefn);
+
+
+ IfErrGoTo(m_pdtroot->GetNamMgr(&pnammgr), RaiseException);
+
+ // Get the library Name
+ IfErrGoTo(pnammgr->StrOfHlnam(qdllentrydefn->HlnamDllName(), rgbuffer,
+ sizeof(rgbuffer)), RaiseException);
+
+
+
+#if !OE_MAC
+
+ UINT uRetCode;
+ XCHAR *szFileName;
+ HFILE hfile;
+ OFSTRUCT OpenBuff;
+
+ // if the full path is specified then first try to load from that
+ // directory. If this will fail then try to load the library from the
+ // directories in the "path".
+
+ // Check if the path specified is a full path.
+ // Full Path either starts with \ or has a :
+ if ((rgbuffer[0] == '\\') || (xstrchr(rgbuffer, ':') != NULL)) {
+ // Check if we can load from from the specified directory.
+ hfile = OpenFile(rgbuffer, &OpenBuff, OF_EXIST);
+
+ // if an error occured then the file does not exist
+ if (hfile == HFILE_ERROR) {
+
+ // Change the file name, so that it does not include the path.
+ szFileName = xstrrchr (rgbuffer, '\\');
+
+ // if the name does not contain "\" then get the name of the file
+ // starting from ":"
+ if (szFileName == NULL) {
+ szFileName = xstrrchr(rgbuffer, ':');
+ }
+
+ // move up 1 character to the beginning of the file name.
+ xstrinc(szFileName);
+
+ // Copy the file name to rgbuffer
+ xstrcpy(rgbuffer, szFileName);
+ } // if
+
+ } // if
+
+
+
+
+
+ // CONSIDER : Caching the pointer to the function.
+
+ // Tell the OS, to stop displaying the FileNotFound or any error occured
+ // while loading the dll.
+ uRetCode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+
+ // Load the library if we have not yet loaded the library
+ if (qdllentrydefn->HLibrary() < (HINSTANCE) HINSTANCE_ERROR) {
+ qdllentrydefn->SetHLibrary(LoadLibrary(rgbuffer));
+ } /* if */
+
+ DWORD dwError;
+
+ if (qdllentrydefn->HLibrary() < (HINSTANCE) HINSTANCE_ERROR) {
+ // Reset the OS's error reporting capability.
+ uRetCode = SetErrorMode(uRetCode);
+
+
+#if OE_WIN16
+ dwError = (INT)qdllentrydefn->HLibrary();
+#else // OE_WIN32
+ // On NT we need to get the specific error code by calling GetLastError.
+ dwError = GetLastError();
+#endif // OE_WIN16
+
+ goto Error;
+ }
+
+ // Reset the OS's error reporting capability.
+ uRetCode = SetErrorMode(uRetCode);
+
+
+ // get the procedures address
+ if (qdllentrydefn->HasOrdinal()) {
+ // Get Address of the Procedure
+ // CONSIDER: this may return a bogus non-'NULL value if
+ // the ordinal is invalid creating a warp into
+ // never-never land. see windows documentation
+ // for GetProcAddress()
+ // Rajivk: The document says this can happen but according to a
+ // other(semi-reliable) sources this will never happen.
+ if (!(*ppv = GetProcAddress( qdllentrydefn->HLibrary(),
+ MAKEINTRESOURCE(qdllentrydefn->UDllOrdinal())))) {
+ // GetProcAddress() failed so....
+ // set error code
+ err = TIPERR_InvalidOrdinal;
+ } /* if */
+ }
+ else {
+
+ // Get Name for Procedure
+ DllEntryNameOfHchunk(qdllentrydefn->HchunkDllEntry(), rgbuffer, MAX_NAME);
+
+ if (!(*ppv = GetProcAddress(qdllentrydefn->HLibrary(), rgbuffer))) {
+ // failed, set error code
+ //
+ err = TIPERR_InvalidDllFunctionName;
+ }
+
+ } /* if HasOrdinal else */
+
+
+ // check if an error occured
+ if (err != TIPERR_None) {
+ // free the library that was successfully loaded
+ ReleaseLibrary(qdllentrydefn->HLibrary());
+ qdllentrydefn->SetHLibrary(0);
+
+ // in case of error raise an exception for OB
+ goto RaiseException;
+ } /* if */
+
+
+
+#else //OE_MAC
+
+#if OE_MAC68K
+ if ((!xstricmp(rgbuffer, "vba"))||(!xstricmp(rgbuffer, "vba.dll"))) {
+ // RajivK: this is a work around. Since we do not have DLLs
+ // on MAC we use a table to map function name to its address.
+
+#define RTORDINAL_FIRST 512
+#define RTORDINAL_LAST 685 // rtErrObj
+
+ if (!qdllentrydefn->HasOrdinal()) {
+ err = TIPERR_InvalidDllFunctionName;
+ }
+
+ // ensure ordinal number is within the range of runtime entrypoints
+ if (qdllentrydefn->UDllOrdinal() < RTORDINAL_FIRST ||
+ qdllentrydefn->UDllOrdinal() > RTORDINAL_LAST) {
+
+ err = TIPERR_InvalidDllFunctionName;
+ goto RaiseException;
+ }
+
+ *ppv = (INT (FAR PASCAL *)()) rgMacStrdcl[qdllentrydefn->UDllOrdinal()-RTORDINAL_FIRST];
+
+ } else
+#endif //OE_MAC68K
+ {
+
+ // ASLM & Code resources do not support call by ordinal functions
+ //
+ // UNDONE: PPC: [jimcool]: PPC support these (1-11-94)
+ //
+ if (qdllentrydefn->HasOrdinal()) {
+ // CONSIDER: better error?
+ err = TIPERR_InvalidDllFunctionName;
+ goto RaiseException;
+ }
+
+#if OE_MAC68K
+ // No more ASLM DLL's -- just return an error
+ return TIPERR_DLLLoadErr;
+
+#else //!OE_MAC68K
+
+ // UNDONE: PPC: [jimcool]: PowerPC to support CFM calling. (1-11-94)
+ return TIPERR_DLLLoadErr;
+
+#if 0
+ char rgFnName[80];
+ // Handle hInstance;
+
+ ConnectionID hInstance=kNoConnectionID;
+ Ptr pfnMainEntry;
+ Str255 rgchErrBuff;
+
+
+ // See if Proc name valid:
+ if ((err = DllEntryNameOfHchunk(qdllentrydefn->HchunkDllEntry(), rgFnName, MAX_NAME))) {
+ return TIPERR_InvalidDllFunctionName;
+ }
+
+ if (!qdllentrydefn->HLibrary()) {
+ err = GetSharedLibrary(c2pstr(rgbuffer), kPowerPC, (kFindLib | kLoadLib | kUseInPlace), &hInstance, &pfnMainEntry, rgchErrBuff);
+ if (!err) {
+ qdllentrydefn->SetHLibrary(hInstance);
+
+ // get the procedures address
+ err = FindSymbol(hInstance, c2pstr(rgFnName), ppv, kCodeSym);
+ if (err) {
+ return TIPERR_InvalidDllFunctionName;
+ }
+
+ } else {
+
+ // UNDONE: PPC: [jimcool]: Temp until PPC supports 68k ASLM Calling (1-11-94)
+ return TIPERR_DLLLoadErr;
+ }
+ }
+
+
+#endif // 0
+
+#endif //!OE_MAC68K
+
+ }
+
+#endif // OE_MAC
+
+
+
+#if !OE_MAC
+
+ // if we got an error then raise exception in OB
+ goto RaiseException;
+
+Error:
+
+#if OE_WIN32
+
+#define ERROR_OUT_OF_MEMORY 0
+
+#else
+ // Define the constants
+#define ERROR_FILE_NOT_FOUND 2
+#define ERROR_PATH_NOT_FOUND 3
+#define ERROR_OUT_OF_MEMORY 8
+#endif
+
+ // LoadLibrary() failed so....
+ // add error code returned by LoadLibrary() to our error code base
+ // for LoadLibrary errors
+ if (dwError == ERROR_FILE_NOT_FOUND
+#if OE_WIN32
+ || dwError == ERROR_MOD_NOT_FOUND
+ || dwError == ERROR_PROC_NOT_FOUND
+#endif // OE_WIN32
+ ) {
+ err = TIPERR_FileNotFound;
+ } else {
+ if (dwError == ERROR_PATH_NOT_FOUND) {
+ err = TIPERR_PathNotFound;
+ } else {
+ if (dwError == ERROR_OUT_OF_MEMORY) {
+ err = TIPERR_OutOfMemory;
+ } else {
+ err = TIPERR_DLLLoadErr;
+ }
+ }
+ }
+
+#endif //!OE_MAC
+
+RaiseException:
+
+ return err;
+}
+
+
+
+
diff --git a/private/oleauto/src/typelib/entrymgr.hxx b/private/oleauto/src/typelib/entrymgr.hxx
new file mode 100644
index 000000000..e9b996573
--- /dev/null
+++ b/private/oleauto/src/typelib/entrymgr.hxx
@@ -0,0 +1,506 @@
+/***
+*EntryMgr.hxx - Entry Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* One instance of this class exists for every GEN_DTINFO and
+* resides in CT segment. It manages entry point info during
+* method compilation.
+*
+* ENTRYMGR is a repository for the small subset of information
+* known to DYN_TYPEMEMBERS needed to build a TYPEFIXUPS. Its
+* reason for being is to avoid having to load a
+* DYN_TYPEMEMBERS instance every time a class is loaded for
+* execution. ENTRYMGR builds tnative, tnativeAddr.
+*
+* Using an ENTRYMGR
+* When compiling functions the following steps should be taken:
+* - NewNativeEntry() should be called for each BASIC function and
+* AllocDllEntryDefn() should be called for each DECLARE function.
+* - SetPrtmi() should be called for each BASIC function and
+* AssignDLlentrydefnHmember() should be called for each DECLARE function
+* - MakeAddressable() brings the class to a runnable state in which
+* - Decompile() should be called to bring the class out of runnable
+* state.
+* - After Decompilation NewNativeEntry(), SetPrtmi() and
+* AssignDllentrydefnHmember() must be called again, However
+* Dllentrydefns created with AllocDllEntryDefn() must be freed
+* explicitly with ReleaseDllentrydefn().
+*
+*
+*
+*CONSIDER:
+* Currently the Dll entry points are managed in a simple(slow)
+* way. Some thought should be given to managing a completly
+* free list of entry points so that calls to LoadLibrary,
+* GetProcAddress, and FreeLibrary can be kept to a minimum
+* during the edit/compile/run cycle.
+*
+* RajivK : June-05-93 :Since we have implemented late binding we call load
+* library/GetProcAddress/FreeLibrary only once.
+*
+* Also class modules are not supported. This includes virtual functions
+* and Creation of classes Copy/Assign/Construct and Destruct functions.
+* Dll support should be reviewed for non-windows platforms.
+* Building the VFT_MGR.
+*
+*
+*Revision History:
+*
+* 16-Apr-91 alanc: Created.
+* 10-Dec-91 ilanc: Override --> SetOverride
+* ClassAttr --> SetClassAttr
+* 23-Apr-92 ilanc: m_hchunkDllEntryDefn --> m_hdllentrydefn.
+* 28-May-92 stevenl: Fixed bugs in OrdinalOfDllEntryDefn and
+* DllEntryOfDllEntryDefn.
+* 07-Jul-92 w-peterh: added LoadDllEntry()
+* 23-Sep-92 rajivk: new naming convention ( P-->Q )
+* 14-Dec-92 w-peterh: made OtexOfHmember() a release function
+* 08-Dec-92 RajivK: Support for InvokeKind
+* 08-Jan-93 RajivK: Support for Code Resource on Mac
+* 08-Jan-93 RajivK: Fixed some undone(s)
+* 15-Jan-93 RajivK: Support for late binding for DLL functions
+* 30-Apr-93 w-jeffc: made DEFN data members private
+* 11-Aug-93 Rajivk: added SetPrtmi() and PrtmiOfHmember()
+* 17-Nov-93 Rajivk: added CreateNewVtableSlotData & modified DefVtableSlot
+*
+*****************************************************************************/
+
+// In later versions,
+// entry manager needs to be a protocol because there will
+// be a DLL specific implementation.
+// The GEN_DTINFO method which returns a pointer to the
+// entry manager needs to be virtual OR there needs to be
+// a GEN_DTINFO constructor which takes a pointer to
+// the ENTRYMGR.
+
+#ifndef ENTRYMGR_HXX_INCLUDED
+#define ENTRYMGR_HXX_INCLUDED
+
+#include "sheapmgr.hxx"
+#include "cltypes.hxx"
+#include "blkmgr.hxx"
+#include "defn.hxx"
+#include "gdtinfo.hxx"
+
+
+#if OE_MAC
+#include <macos\resource.h>
+#endif
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szENTRYMGR_HXX)
+#define SZ_FILE_NAME g_szENTRYMGR_HXX
+#endif
+
+class INSTMGR; // instmgr.hxx
+class STREAM; // stream.hxx
+
+#if OE_MAC
+ VOID ReleaseLibrary(Handle hCodeResource);
+#else
+ VOID ReleaseLibrary(HINSTANCE hLibrary);
+#endif
+
+
+typedef HCHUNK HVTABLESLOTDATA; // hvtsd
+typedef sHCHUNK sHVTABLESLOTDATA;
+typedef HCHUNK HVTABLEDATA; // hvtd
+typedef sHCHUNK sHVTABLEDATA;
+
+
+// global function
+UINT OffsetOfHmember(HMEMBER hmember,
+ INVOKEKIND invokekind,
+ UINT cbProcTemplateSize);
+
+
+
+
+
+
+/***
+*struct VTABLESLOTDATA - vtsd
+*Purpose:
+* Used to describe a single vtable slot. These are linked
+* in a list (not in order), with the head of the list held by
+* a VTABLEDATA. Each vtsd represents a virtual function in the VFT.
+*
+*
+***********************************************************************/
+
+struct VTABLESLOTDATA {
+ sHVTABLESLOTDATA m_hvtsdNext; // next in list.
+ INVOKEKIND m_invokekind; // invoke kind.
+ USHORT m_ovftSlot; // offset of vtable slot
+ sHMEMBER m_hmember; // member handle of function
+ BYTE m_isPublic:1; // is the event sub public.
+ BYTE m_fAddedInBrkMode:1;
+ BYTE m_UNDONE:6;
+};
+
+
+
+/***
+*struct VTABLEDATA - vtd
+*Purpose:
+* Used to describe a single vtable. These are linked
+* in a list (not in order), with the head of the list held by
+* the ENTRYMGR.
+*
+***********************************************************************/
+
+struct VTABLEDATA {
+ sHVTABLEDATA m_hvtdNext; // next in list.
+ sHVTABLESLOTDATA m_hvtsdFirst; // list of vtable slots
+ USHORT m_oPvft; // offset of the vtable ptr
+ // in the class instance.
+ USHORT m_cb; // size of the vtable
+ HIMPTYPE m_himptype; // himptype of the source.
+ MEMBERID m_memid;
+};
+
+
+
+
+// Defines the ENTRYMGR structure layout
+#define ENTRYMGR_Layout "sssss"
+
+
+/***
+*class ENTRYMGR - 'entmgr'
+*Purpose:
+* ENTRYMGR is a repository for the small subset of information
+* known to DYN_TYPEMEMBERS needed to build a TYPEFIXUPS. Its
+* reason for being is to avoid having to load a
+* DYN_TYPEMEMBERS instance every time a class is loaded for
+* execution. ENTRYMGR builds tnative, tnativeAddr,textentryaddr and VFTMGR.
+*Notes:
+* When Dll entries are being built:
+* Call AllocDllEntry() to allocate an entry in the ENTRYMGR's
+* BLK_MGR. Calling AssignDllentry() allocates a block in the
+* INSTMGR's TExtEntryAddr table. ReleaseDllentry() will create
+* an unused entry in tExtEntryAddr so both the ENTRYMGR and
+* the INSTMGR should be brought to CS_UNDECLARED state by
+* calling Decompile(CS_UNDECLARED) and re-Assigning hmembers
+* whenever ReleaseDllEntry() is called.
+* This allows MakeAddressable() to not regenerate tExtEntryAddr
+* each time it is called since if tExtEntryAddr exists when
+* it has been called then it has not been modified and can
+* simply be re-used. Again this has the consequence that
+* the tExtEntryAddr table must be completely rebuilt even
+* if a new dll entry is added, otherwise the old table will
+* be reused, without the new entry. So after any calls to
+* AllocDllEntryDefn(), ReleaseDllentrydefn(), and AssignDllentrydefnHmember()
+* both ENTRYMGR::Decompile() and INSTMGR::Decompile() must be
+* called.
+*
+*
+***********************************************************************/
+
+class ENTRYMGR
+{
+ friend VOID ReleaseDllEntries(VOID* pv); // releases the loaded library
+
+public:
+ ENTRYMGR();
+ ~ENTRYMGR();
+ nonvirt TIPERROR Init(SHEAP_MGR *psheapmgr,
+ DYN_TYPEROOT *pdtroot);
+ nonvirt VOID Decompile(COMPSTATE compstate);
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+
+ nonvirt inline VOID Lock() { m_bmEntryData.Lock(); }
+ nonvirt inline VOID Unlock() { m_bmEntryData.Unlock(); }
+
+
+ nonvirt TIPERROR DllEntryNameOfHchunk(HCHUNK hchunk, LPSTR lpstr, UINT cch);
+ nonvirt VOID SwapDllentrydefns(BOOL fSwapFirst);
+ nonvirt TIPERROR AllocDllentrydefnByName(HLNAM hlnamDllModule,
+ LPSTR szName,
+ HDLLENTRY_DEFN *phdllentrydefn);
+ nonvirt TIPERROR AllocDllentrydefnByOrdinal(HLNAM hlnamDllModule,
+ UINT ordinal,
+ HDLLENTRY_DEFN *phdllentrydefn);
+ nonvirt VOID ReleaseDllentrydefn(HDLLENTRY_DEFN hdllentrydefn);
+
+ nonvirt DLLENTRY_DEFN *QdllentrydefnOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt BOOL HasOrdinalOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt HLNAM DllNameOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt USHORT OrdinalOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt HCHUNK DllEntryOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt TIPERROR GetAddressOfDllentry(HDLLENTRY_DEFN hdllentrydefn,
+ VOID **ppv
+#if OE_MACPPC
+ , DLLTEMPLATECALLBLOCK *pDllTemplateCallBlock
+#endif // OE_MACPPC
+ );
+
+ nonvirt BOOL IsEmpty();
+ nonvirt TIPERROR MakeAddressable();
+ nonvirt UINT GetSize();
+
+ nonvirt TIPERROR CreateNewVtableData(HIMPTYPE himptypeBase,
+ ULONG oPvft,
+ UINT cbVftBase,
+ MEMBERID memid,
+ HVTABLEDATA *phvtd);
+ nonvirt TIPERROR DefVtableSlot(HMEMBER hmember,
+ INVOKEKIND invokekind,
+ UINT ovftSlot,
+ HVTABLEDATA hvtd);
+
+ nonvirt TIPERROR DefVtableSlotInBreakMode(HMEMBER hmember,
+ INVOKEKIND invokekind,
+ UINT ovftSlot,
+ HVTABLEDATA hvtd);
+
+
+ nonvirt TIPERROR RecompileToAddressableState();
+
+
+
+ nonvirt HMEMBER HmemberBasicClassConstructor();
+ nonvirt HMEMBER HmemberBasicClassDestructor();
+ nonvirt HMEMBER HmemberBasicClassAddRef();
+ nonvirt HMEMBER HmemberBasicClassRelease();
+ nonvirt HMEMBER HmemberBasicClassQueryInt();
+
+ //NOTE: probably want to add extra methods for OB to support
+ //NOTE: per-instance data
+ //VOID PerInstConstructor(SHORT oVar, HIMPTYPE himptype);
+ //VOID SetVbaseTbl(USHORT oPvbt, USHORT cb, SHORT rgdelta[]);
+
+
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebShowState(UINT uLevel);
+ nonvirt VOID DebShowStateRtmi();
+ nonvirt UINT DebShowSize();
+#else //!ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebShowState(UINT uLevel) {}
+ nonvirt VOID DebShowState() {}
+ nonvirt VOID DebShowSize() {}
+#endif
+
+private:
+
+
+ nonvirt TIPERROR AllocDllentrydefn(HDLLENTRY_DEFN *phdllentrydefn,
+ HLNAM hlnamDllModule,
+ BOOL fHasOrdinal);
+
+ nonvirt VOID ReleaseDllList(HDLLENTRY_DEFN hdllentrydefnStop);
+
+
+ nonvirt VTABLEDATA * QvtdOfHvtd(HVTABLEDATA hvtd) const;
+ nonvirt VTABLESLOTDATA * QvtsdOfHvtsd(HVTABLESLOTDATA hvtsd) const;
+ nonvirt TIPERROR MakeClassAddressable();
+
+ static CONSTDATA WORD wFirstSerWord; // First word of serialization
+ static CONSTDATA WORD cbSizeSerMem; // size of serialized members of ENTRYMGR
+ static CONSTDATA WORD wCurFormat; // Serialization format version number
+
+ // THESE MEMBERS ARE SERIALIZED IN THIS ORDER
+ sHDLLENTRY_DEFN m_hdllentrydefnFirst;
+
+
+
+ sHVTABLEDATA m_hvtdFirst;
+ USHORT m_cbTExtEntrySize; // bytes used in DllEntryTable
+ USHORT m_cbVftbl; // bytes used in bdVftbl
+ USHORT m_cbTNativeSize; // bytes used in TNative
+ // THESE MEMBERS ARE SERIALIZED IN THIS ORDER
+
+ USHORT m_usecfuncCount; // count of functions added in E&C.
+ BLK_MGR m_bmEntryData; // contains NATIVEENTRYDATAs
+ // for OLE it contains DLL_ENTRYDEFN also
+
+ USHORT m_cInterfaces; // Keeps the count of Interfaces.
+
+ // Start of non-serialized data members
+ DYN_TYPEROOT *m_pdtroot;
+ INSTMGR *m_pinstmgr;
+
+ // Size, location and fixup location of procedure template. These are
+ // different depending on if we're a class or a module.
+ UINT m_cbProcTemplateSize;
+ USHORT m_hProcTemplate;
+
+};
+
+
+
+/***
+*PUBLIC ENTRYMGR::XXX-OfHdllentrydefn
+*
+*Purpose:
+* Get/Set a XXX given a handle to a dllentrydefn
+*
+*Entry:
+* hdllentrydefn - handle to get
+*
+*Exit:
+* XXX
+*
+***********************************************************************/
+
+inline DLLENTRY_DEFN *ENTRYMGR::QdllentrydefnOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const
+{
+ DebAssert(hdllentrydefn != HDLLENTRYDEFN_Nil,
+ "QdllentrydefnOfHdllentrydefn : bad handle");
+ return (DLLENTRY_DEFN*) m_bmEntryData.QtrOfHandle(hdllentrydefn);
+}
+
+
+inline BOOL ENTRYMGR::HasOrdinalOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const
+{
+ return QdllentrydefnOfHdllentrydefn(hdllentrydefn)->HasOrdinal();
+}
+
+
+inline HLNAM ENTRYMGR::DllNameOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const
+{
+ return QdllentrydefnOfHdllentrydefn(hdllentrydefn)->HlnamDllName();
+}
+
+
+inline USHORT ENTRYMGR::OrdinalOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const
+{
+ DebAssert(HasOrdinalOfHdllentrydefn(hdllentrydefn),
+ "OrdinalOfHDllentrydefn : bad dllentrydefn");
+ return QdllentrydefnOfHdllentrydefn(hdllentrydefn)->UDllOrdinal();
+}
+
+
+inline HCHUNK ENTRYMGR::DllEntryOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const
+{
+ DebAssert(!HasOrdinalOfHdllentrydefn(hdllentrydefn),
+ "OrdinalOfHDllentrydefn : bad dllentrydefn");
+ return QdllentrydefnOfHdllentrydefn(hdllentrydefn)->HchunkDllEntry();
+}
+
+
+/***
+*PUBLIC ENTRYMGR::AllocDllentrydefnByName
+*
+*Purpose:
+* allocate a dllentrydefn in the entrymgr
+*
+*Entry
+* hlnamDllModule - handle of dll module name
+* szName - name of the Entry (Dll Function/Code Resource/SLM Dll Function Name)
+* phdllentrydefn - address of return value
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+inline TIPERROR ENTRYMGR::AllocDllentrydefnByName(HLNAM hlnamDllModule,
+ LPSTR szName,
+ HDLLENTRY_DEFN *phdllentrydefn)
+{
+ TIPERROR err;
+ HCHUNK hchunk;
+ BYTE *qbStr;
+
+ DebAssert(hlnamDllModule != HLNAM_Nil,
+ "ENTRYMGR::AllocDllentrydefnByName - invalid handle");
+ DebAssert(szName != NULL,
+ "ENTRYMGR::AllocDllentrydefnByName - invalid handle");
+ DebAssert(phdllentrydefn != NULL,
+ "ENTRYMGR::AllocDllentrydefnByName - invalid pointer");
+
+ IfErrRet(AllocDllentrydefn(phdllentrydefn, hlnamDllModule, FALSE));
+
+ // Allocate space for the Name of the entry point.
+ IfErrRet(m_bmEntryData.AllocChunk(&hchunk, xstrblen0(szName)));
+ qbStr = m_bmEntryData.QtrOfHandle(hchunk);
+
+ // Copy the string in the memory allocated.
+ xstrcpy((XCHAR *)qbStr, szName);
+
+ QdllentrydefnOfHdllentrydefn(*phdllentrydefn)->SetHchunkDllEntry(hchunk);
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC ENTRYMGR::AllocDllentrydefnByOrdinal
+*
+*Purpose:
+* allocate a dllentrydefn in the entrymgr
+*
+*Entry
+* hlnamDllModule - handle of dll module name
+* ordinal - ordinal of dll entry
+* phdllentrydefn - address of return value
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+inline TIPERROR ENTRYMGR::AllocDllentrydefnByOrdinal(HLNAM hlnamDllModule,
+ UINT ordinal,
+ HDLLENTRY_DEFN *phdllentrydefn)
+{
+ TIPERROR err;
+
+ DebAssert(hlnamDllModule != HLNAM_Nil,
+ "ENTRYMGR::AllocDllentrydefnByOrdinal - invalid handle");
+ DebAssert(phdllentrydefn != NULL,
+ "ENTRYMGR::AllocDllentrydefnByOrdinal - invalid pointer");
+
+ IfErrRet(AllocDllentrydefn(phdllentrydefn, hlnamDllModule, TRUE));
+ QdllentrydefnOfHdllentrydefn(*phdllentrydefn)->SetUDllOrdinal(ordinal);
+ return TIPERR_None;
+}
+
+
+/***
+*ENTRYMGR::QvtdOfHvtd, QvtsdOfHvtsd - get ptr from handle
+*Purpose:
+* Gets a pointer to a VTABLEDATA or VTABLESLOTDATA from a handle
+* thereof.
+*
+***********************************************************************/
+
+
+inline VTABLEDATA * ENTRYMGR::QvtdOfHvtd(HVTABLEDATA hvtd) const
+{
+ return (VTABLEDATA *) m_bmEntryData.QtrOfHandle(hvtd);
+}
+
+inline VTABLESLOTDATA * ENTRYMGR::QvtsdOfHvtsd(HVTABLESLOTDATA hvtsd) const
+{
+ return (VTABLESLOTDATA *) m_bmEntryData.QtrOfHandle(hvtsd);
+}
+
+
+
+/***
+*PUBLIC ENTRYMGR::IsEmpty -
+*Purpose:
+* Returns TRUE if there is nothing in the the Entry manager
+* to serialize.
+*
+*Entry:
+*
+*Exit:
+* BOOL : returns TRUE if the Entry manager is empty. Else returns FALSE.
+***********************************************************************/
+inline BOOL ENTRYMGR::IsEmpty()
+{
+ return (m_hdllentrydefnFirst == HDLLENTRYDEFN_Nil);
+}
+
+
+#endif // ! ENTRYMGR_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/errmap.cxx b/private/oleauto/src/typelib/errmap.cxx
new file mode 100644
index 000000000..e1022ed83
--- /dev/null
+++ b/private/oleauto/src/typelib/errmap.cxx
@@ -0,0 +1,161 @@
+/***
+*errmap.cxx - Error mapping utilities
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Error mapping utilities.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#pragma hdrstop(RTPCHNAME)
+
+#if OE_WIN16
+#include "dos.h"
+#endif // OE_WIN16
+
+#if OE_MAC
+#include "macos\errors.h"
+#endif
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+static char szErrmapCxx[] = __FILE__;
+#define SZ_FILE_NAME szErrmapCxx
+#endif
+
+
+/***
+*PUBLIC HRESULT GetErrorInfo
+*Purpose:
+* Filling the given EXCEPINFO structure from the contents of
+* the current OLE error object (if any).
+*
+*Entry:
+* pexcepinfo = pointer to caller allocated EXCEPINFO to fillin.
+*
+*Exit:
+* return value = HRESULT
+*
+*Note:
+* This routine assumes that the given EXCEPINFO does *not* contain
+* any strings that need to be freed before its contents are set.
+*
+***********************************************************************/
+HRESULT
+GetErrorInfo(EXCEPINFO *pexcepinfo)
+{
+ HRESULT hresult;
+
+ memset(pexcepinfo, 0, sizeof(*pexcepinfo));
+ IErrorInfo *perrinfo;
+ if((hresult = GetErrorInfo(0L, &perrinfo)) == NOERROR){
+ perrinfo->GetSource(&pexcepinfo->bstrSource);
+ perrinfo->GetDescription(&pexcepinfo->bstrDescription);
+ perrinfo->GetHelpFile(&pexcepinfo->bstrHelpFile);
+ perrinfo->GetHelpContext(&pexcepinfo->dwHelpContext);
+ perrinfo->Release();
+ }
+ return hresult;
+}
+
+
+#if !OE_MAC
+/***
+*TiperrOfOFErr - Maps error codes returned from OpenFile to TIPERRORs.
+***********************************************************************/
+TIPERROR TiperrOfOFErr(UINT nErrCode)
+{
+ switch (nErrCode) {
+ case 0x02: return TIPERR_FileNotFound;
+ case 0x03:
+ case 0x0f:
+ case 0x33:
+ case 0x35:
+ case 0x37:
+ case 0x40:
+ case 0x43: return TIPERR_PathNotFound;
+ case 0x04:
+ case 0x23:
+ case 0x24:
+ case 0x44:
+ case 0x45:
+ case 0x54: return TIPERR_TooManyFiles;
+ case 0x05:
+ case 0x0c:
+ case 0x13:
+ case 0x20:
+ case 0x21:
+ case 0x41:
+ case 0x42:
+ case 0x15:
+ case 0x36: return TIPERR_PermissionDenied;
+ case 0x08: return TIPERR_OutOfMemory;
+ case 0x19: return TIPERR_SeekErr;
+ case 0x1d:
+ case 0x58: return TIPERR_WriteFault;
+ case 0x1e: return TIPERR_ReadFault;
+ case 0x34:
+ case 0x50: return TIPERR_FileAlreadyExists;
+ default: return TIPERR_IOError;
+ }
+}
+
+#else // !OE_MAC
+
+/***
+*TIPERROR TiperrOfOSErr
+*Purpose:
+* Return the TIPERROR that corresponds to the given
+* Mac system error (OSErr).
+*
+*Entry:
+* oserr = the Mac OSErr to mac.
+*
+*Exit:
+* return value = TIPERROR
+*
+*Note:
+* This list isn't necessarrily complete. It was
+* created to handle errors resulting from file open
+* when loading a typelib, so if you have other uses,
+* go ahead and add aditional errors as needed.
+*
+***********************************************************************/
+TIPERROR
+TiperrOfOSErr(OSErr oserr)
+{
+static struct {
+ OSErr oserr;
+ TIPERROR tiperr;
+} rgerrmap[] = {
+ { fnfErr, TIPERR_FileNotFound }
+ , { bdNamErr, TIPERR_FileNotFound }
+ , { tmfoErr, TIPERR_TooManyFiles }
+ , { dirFulErr, TIPERR_TooManyFiles }
+ , { writErr, TIPERR_IOError }
+ , { readErr, TIPERR_IOError }
+ , { ioErr, TIPERR_IOError }
+ , { dskFulErr, TIPERR_DiskFull }
+ , { opWrErr, TIPERR_PermissionDenied }
+ , { wPrErr, TIPERR_PermissionDenied }
+ , { permErr, TIPERR_PermissionDenied }
+ , { dupFNErr, TIPERR_PermissionDenied }
+ , { dirNFErr, TIPERR_PathNotFound }
+};
+
+ for(int i = 0; i < DIM(rgerrmap); ++i){
+ if(oserr == rgerrmap[i].oserr){
+ return rgerrmap[i].tiperr;
+ }
+ }
+
+
+ DebAssert(0/*UNREACHED*/, "");
+ return TIPERR_OutOfMemory; // an unmapped error
+};
+#endif // !OE_MAC
diff --git a/private/oleauto/src/typelib/errmap.hxx b/private/oleauto/src/typelib/errmap.hxx
new file mode 100644
index 000000000..eefdd58cb
--- /dev/null
+++ b/private/oleauto/src/typelib/errmap.hxx
@@ -0,0 +1,31 @@
+/***
+*errmap.hxx - Error mapping utilities
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Error mapping utilities.
+*
+*Implementation Notes:
+* These utilities are all built into both OB and OLE.
+*
+*****************************************************************************/
+
+#ifndef ERRMAP_HXX_INCLUDED
+#define ERRMAP_HXX_INCLUDED
+
+
+#if OE_MAC
+TIPERROR TiperrOfOSErr(OSErr err);
+#else // !OE_MAC
+TIPERROR TiperrOfOFErr(UINT nErrCode);
+#endif
+
+HRESULT GetErrorInfo(EXCEPINFO *pexcepinfo);
+HRESULT SetErrorInfo(EXCEPINFO *pexcepinfo);
+
+#define TiperrOfHresult(s) (s)
+#define HresultOfTiperr(s) (s)
+
+#endif // ! ERRMAP_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/exbind.hxx b/private/oleauto/src/typelib/exbind.hxx
new file mode 100644
index 000000000..c10b6a2d5
--- /dev/null
+++ b/private/oleauto/src/typelib/exbind.hxx
@@ -0,0 +1,167 @@
+/***
+*exbind.hxx - excode binding interface
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+* [01] 04-Aug-92 ilanc/davebra
+*
+*Design: see exmgr.doc
+*Implementation Notes:
+* See exmgr.cxx.
+*
+*
+*****************************************************************************/
+
+#ifndef EXBIND_HXX_INCLUDED
+#define EXBIND_HXX_INCLUDED
+
+#include "defn.hxx"
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szEXBIND_HXX)
+#define SZ_FILE_NAME g_szEXBIND_HXX
+#endif
+
+class EXBIND
+{
+private:
+ BIND_KIND m_bkind; // typetag essentially
+ ITypeInfoA *m_ptinfo; // ITypeInfo of defining type.
+ union {
+ // NOTE: For now we cache the
+ // ITypeInfo of the defining type -- this is in particular
+ // important for the REAL ITypeInfo from the providing
+ // ITypeLib as opposed to the mockup (proxy) instance
+ // of GEN_DTINFO used for the exmgr.
+ // Note that probably as we abstract EXBIND more and more
+ // we will introduce a DESCKIND and BINDPTR as well, and
+ // probably not be able to unionize any longer (????)
+ //
+ struct {
+ TYPE_DATA *m_ptdata; // TYPE_DATA that contains DEFN.
+ SHORT m_ofs; // for vars: offset within instance
+ // of "introducing" base. In SI == 0.
+ // for funcs: offset of pointer to vft
+ // from THIS. In SI == 0.
+ sHDEFN m_hdefn; // for vars: hdefn of VAR_DEFN
+ // for Funcs: hdefn of FUNC_DEFN
+ } m_AccessMember;
+ struct {
+ DEFN_TYPEBIND *m_pdfntbind; // DEFN_TYPEBIND for types/projects.
+ } m_AccessType;
+ }; // end of union
+
+ BOOL m_isDispatch; // Used to support dispinterfaces
+ // that are defined in terms of
+ // a pseudo-base interface.
+ // In this case, m_ptinfo is that of
+ // the defining "pseudo-base" interface
+ // and m_isDispatch indicates that
+ // the "derived" class was a
+ // dispinterface.
+
+public:
+ // ctor
+ EXBIND() {
+ m_bkind = BKIND_NoMatch;
+ m_ptinfo = NULL;
+ m_AccessMember.m_ptdata = NULL; // m_ptbind = NULL
+ m_AccessMember.m_ofs = 0;
+ m_AccessMember.m_hdefn = HDEFN_Nil;
+ m_isDispatch = FALSE;
+ }
+
+ // accessors
+ BIND_KIND BindKind() const { return m_bkind; }
+ BOOL IsError() const { return m_bkind == BKIND_Error; }
+ BOOL IsNoMatch() const { return m_bkind == BKIND_NoMatch; }
+ BOOL IsOneVarMatch() const { return m_bkind == BKIND_OneVarMatch; }
+ BOOL IsFuncMatch() const { return m_bkind == BKIND_FuncMatch; }
+ BOOL IsDynTypeBindMatch() const { return m_bkind == BKIND_DynTypeBindMatch; }
+ BOOL IsProjTypeBindMatch() const { return m_bkind == BKIND_ProjTypeBindMatch; }
+ BOOL IsNestedTypeBindMatch() const { return m_bkind == BKIND_NestedTypeBindMatch; }
+ BOOL IsWrongArity() const { return m_bkind == BKIND_WrongArity; }
+ BOOL IsTypeInfoMatch() const { return m_bkind == BKIND_TypeInfoMatch; }
+ BOOL IsImplicitAppobjMatch() const {
+ return m_bkind == BKIND_ImplicitAppobjMatch;
+ }
+
+ INT OIntroducingBase() const {
+ DebAssert(IsOneVarMatch(), "must be var.");
+ return m_AccessMember.m_ofs;
+ }
+ INT OPvft() const {
+ DebAssert(IsFuncMatch(), "must be func.");
+ return m_AccessMember.m_ofs;
+ }
+ HDEFN Hdefn() const {
+ DebAssert(IsImplicitAppobjMatch() || IsOneVarMatch() || IsFuncMatch(),
+ "must be func or var or appobj.");
+ return (HDEFN)m_AccessMember.m_hdefn;
+ }
+ HVAR_DEFN Hvdefn() const {
+ DebAssert(IsImplicitAppobjMatch() || IsOneVarMatch(),
+ "must be var or implicit appobj.");
+ return (HVAR_DEFN)Hdefn();
+ }
+ HFUNC_DEFN Hfdefn() const {
+ DebAssert(IsFuncMatch(), "must be func.");
+ return (HFUNC_DEFN)Hdefn();
+ }
+ DEFN_TYPEBIND *Pdfntbind() const {
+ DebAssert(IsDynTypeBindMatch() ||
+ IsProjTypeBindMatch() ||
+ IsNestedTypeBindMatch(), "must be type or proj match.");
+ return m_AccessType.m_pdfntbind;
+ }
+ TYPE_DATA *Ptdata() const {
+ DebAssert(IsOneVarMatch() || IsFuncMatch() || IsImplicitAppobjMatch(),
+ "must be var or func or appobj match.");
+ return m_AccessMember.m_ptdata;
+ }
+
+ ITypeInfoA *Ptinfo() const {
+ return m_ptinfo;
+ }
+
+ BOOL IsDispatch() const {
+ return m_isDispatch;
+ }
+
+ // mutators
+ VOID SetBindKind(BIND_KIND bkind) { m_bkind = bkind; }
+ VOID SetOfs(INT ofs) { m_AccessMember.m_ofs = (SHORT)ofs; }
+ VOID SetHdefn(HDEFN hdefn) { m_AccessMember.m_hdefn = (sHDEFN)hdefn; }
+ VOID SetPtdata(TYPE_DATA *ptdata) { m_AccessMember.m_ptdata = ptdata; }
+ VOID SetPdfntbind(DEFN_TYPEBIND *pdfntbind) { m_AccessType.m_pdfntbind = pdfntbind; }
+ VOID SetPtinfo(ITypeInfoA *ptinfo) { m_ptinfo = ptinfo; }
+ VOID SetIsDispatch(BOOL isDispatch) {
+ m_isDispatch = isDispatch;
+ }
+ VOID AdjustOfs(INT db) {m_AccessMember.m_ofs += db;}
+
+ // Non-virtual functions
+ nonvirt TIPERROR GetOrdinalHparamdefnOfHlnam(NAMMGR *pnammgr,
+ HLNAM hlnamParam,
+ USHORT *pusOrdinal,
+ sHPARAM_DEFN *phparamdefn);
+ nonvirt BOOL IsBasicFunction() const;
+
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebShowState(UINT uLevel) const;
+#else //!ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+#endif //!ID_DEBUG
+};
+
+
+#endif // EXBIND_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/fstream.cxx b/private/oleauto/src/typelib/fstream.cxx
new file mode 100644
index 000000000..dfe40e764
--- /dev/null
+++ b/private/oleauto/src/typelib/fstream.cxx
@@ -0,0 +1,364 @@
+/***
+*fstream.cxx - Simple stream based on CFile.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Defines FILE_STREAM implementation.
+*
+*Revision History:
+*
+* [00] 06-Jun-91 alanc: Created.
+* [01] 03-Mar-93 rajivk : Added SwapStructArray()
+*
+*Implementation Notes:
+* All data must be written in Intel byte ordering, so that files
+* are compatible between platforms. This requires byte-swapping;
+* it is done automatically by the WriteUShort, WriteULong functions,
+* if useing Write, the user should swap bytes before writing.
+*
+*****************************************************************************/
+
+#define STREAM_VTABLE
+#define FILE_STREAM_VTABLE
+#define SEEKSTREAM_VTABLE
+
+#include "silver.hxx"
+#include "typelib.hxx"
+
+#include <stdlib.h> // for errno
+
+#if OE_MAC
+ #include <macos\Files.h>
+#endif
+
+#include "xstring.h"
+#include "stream.hxx"
+#include "tiperr.h"
+#include "mem.hxx"
+#include "sheapmgr.hxx" // for min macro
+#include "clutil.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+#if OE_MAC
+ #include <macos\Errors.h>
+#endif
+
+#include <sys\types.h>
+#include <sys\stat.h>
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleFstreamCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleFstreamCxx
+#else
+static char szFstreamCxx[] = __FILE__;
+#define SZ_FILE_NAME szFstreamCxx
+#endif
+#endif
+
+
+//
+// Implementation of STREAM abstract class non-inline methods
+//
+
+
+
+/***
+*PUBLIC STREAM::ReadSz - read LPOLESTR from the stream
+*Purpose:
+* Read an LPOLESTR from a stream. Will not modify psz unless the
+* string is successfully read in.
+*
+*Entry:
+* pointer to LPOLESTR
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR STREAM::ReadSz(LPOLESTR *psz)
+{
+ USHORT cbLen;
+ TIPERROR tiperr;
+ XSZ xszLocal;
+
+ if (tiperr = ReadUShort(&cbLen)) // read in length of serialized string
+ return tiperr;
+
+ xszLocal = (SZ)MemAlloc(cbLen + sizeof(XCHAR));
+
+ if (xszLocal == NULL)
+ return TIPERR_OutOfMemory;
+
+ if (tiperr = Read(xszLocal, cbLen)) {
+ MemFree(xszLocal);
+ return tiperr;
+ }
+
+ xszLocal[cbLen] = 0; //null terminate string
+
+#if OE_WIN32
+ // Convert from Ansi to Unicode and free up Ansi copy
+ tiperr = TiperrOfHresult(ConvertStringToW(xszLocal, psz));
+ MemFree(xszLocal);
+ return tiperr;
+#else //OE_WIN32
+ *psz = xszLocal;
+ return TIPERR_None;
+#endif //OE_WIN32
+}
+
+
+/***
+*Read - read data from the stream.
+*Purpose:
+* These functions read data from the stream. Either a byte, word,
+* long.
+*
+*Exit:
+* Returns number of bytes written, which is always the
+* same as the numberof bytes requested.
+*
+***********************************************************************/
+
+TIPERROR STREAM::ReadByte(BYTE *pb)
+{
+ return Read(pb, sizeof(BYTE));
+}
+
+
+#pragma code_seg(CS_INIT)
+TIPERROR STREAM::ReadUShort(USHORT *pus)
+{
+#if HP_BIGENDIAN
+ USHORT us;
+ TIPERROR err;
+
+ IfErrRet(Read(&us, sizeof(USHORT)));
+ // Swap bytes to read in Intel byte ordering.
+ *pus = ((us & 0xFF) << 8) | (us >> 8);
+ return TIPERR_None;
+#else //!HP_BIGENDIAN
+ return Read(pus, sizeof(USHORT));
+#endif //!HP_BIGENDIAN
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+TIPERROR STREAM::ReadULong(ULONG * pul)
+{
+#if HP_BIGENDIAN
+ ULONG ul;
+ TIPERROR err;
+
+ IfErrRet(Read(&ul, sizeof(ULONG)));
+ // Swap bytes to read in Intel byte ordering.
+ *pul = ((ul & 0x000000FF) << 24) |
+ ((ul & 0x0000FF00) << 8) |
+ ((ul & 0x00FF0000) >> 8) |
+ (ul >> 24);
+ return TIPERR_None;
+#else //!HP_BIGENDIAN
+ return Read(pul, sizeof(ULONG));
+#endif //!HP_BIGENDIAN
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC STREAM::Write - write data to the stream
+*Purpose:
+* These function write data to the stream. Bytes, words, longs.
+*
+* CONDIDER: Should below functions be . I think it's slightly
+* CONSIDER: worse to be based on code size, but haven't
+* CONSIDER: tested it. Might be made up by optimizer.
+*Exit:
+* Returns number of bytes written, which is always the number of
+* bytes requested.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR STREAM::WriteByte(BYTE b)
+{
+ return Write(&b, sizeof(BYTE));
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+TIPERROR STREAM::WriteUShort(USHORT us)
+{
+#if HP_BIGENDIAN
+ // Swap bytes to write in Intel byte ordering.
+ us = ((us & 0xFF) << 8) | (us >> 8);
+#endif //!HP_BIGENDIAN
+ return Write(&us, sizeof(USHORT));
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+TIPERROR STREAM::WriteULong(ULONG ul)
+{
+#if HP_BIGENDIAN
+ // Swap bytes to write in Intel byte ordering.
+ ul = ((ul & 0x000000FF) << 24) |
+ ((ul & 0x0000FF00) << 8) |
+ ((ul & 0x00FF0000) >> 8) |
+ (ul >> 24);
+#endif //HP_BIGENDIAN
+
+ return Write(&ul, sizeof(ULONG));
+}
+#pragma code_seg()
+
+
+#if HP_BIGENDIAN
+/***
+*SwapShortArray - byte swap an array of shorts.
+*Purpose:
+* This function byte swaps an array of shorts in place.
+*
+*Entry:
+* pvArray - pointer to array
+* cShorts - number of shorts in the array.
+*
+*Exit:
+* None.
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+void SwapShortArray(void * pvArray, UINT cShorts)
+{
+ // The run-time function _swab is used here; it should be
+ // better optimized.
+ _swab((char *)pvArray, (char *)pvArray, cShorts * 2);
+}
+#pragma code_seg()
+
+/***
+*SwapLongArray - byte swap an array of longs.
+*Purpose:
+* This function byte swaps an array of longs in place.
+*
+*Entry:
+* pvArray - pointer to array
+* cLongs - number of shorts in the array.
+*
+*Exit:
+* None.
+***********************************************************************/
+
+void SwapLongArray(void * pvArray, UINT cLongs)
+{
+ ULONG * plArray = (ULONG *)pvArray;
+
+ while (cLongs--) {
+ *plArray = ((*plArray & 0x000000FF) << 24) |
+ ((*plArray & 0x0000FF00) << 8) |
+ ((*plArray & 0x00FF0000) >> 8) |
+ (*plArray >> 24);
+ ++plArray;
+ }
+}
+
+
+/***
+*SwapStruct - swap a structure.
+*Purpose:
+* Byte swaps a struct in place. The layout of the structure is
+* described by a character string, which has a character for each
+* member of the string, which is one of:
+* 'b': BYTE/CHAR
+* 's': SHORT/USHORT
+* 'l': LONG/ULONG
+*
+*Entry:
+* pvStruct - points to struct
+* szFormat - formatting string (NOTE: NOT AN XSZ -- NEVER UNICODE!)
+*
+*Exit:
+* UINT : size of the structure that was passed in (in bytes)
+* None.
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+UINT SwapStruct(void * pvArray, SZ szFormat)
+{
+ USHORT us;
+ ULONG ul;
+ UINT uSize = 0;
+
+ for (;;) {
+ switch (*szFormat++) {
+ case '\0':
+ // End of string.
+ return uSize;
+
+ case 'b':
+ // Nothing to swap - a byte.
+ pvArray = (BYTE *) pvArray + 1;
+ // Increment the size
+ uSize++;
+ break;
+
+ case 's':
+ us = *(USHORT *)pvArray;
+ *(USHORT *)pvArray = ((us & 0xFF) << 8) |
+ (us >> 8);
+ pvArray = (USHORT *) pvArray + 1;
+ // Increment the size
+ uSize += 2;
+ break;
+
+ case 'l':
+ ul = *(ULONG *)pvArray;
+ *(ULONG *)pvArray = ((ul & 0x000000FF) << 24) |
+ ((ul & 0x0000FF00) << 8) |
+ ((ul & 0x00FF0000) >> 8) |
+ (ul >> 24);
+
+ pvArray = (ULONG *) pvArray + 1;
+ // Increment the size
+ uSize += 4;
+ break;
+
+ default:
+ DebHalt("SwapStruct: Bad format string");
+ }
+ }
+ return uSize;
+}
+#pragma code_seg()
+
+
+/***
+*SwapStructArray - swaps an array of structures.
+*Purpose: For each structure in the array
+* Byte swaps the structs in place. Differs to SwapStruct to swap a struct.
+*
+*Entry:
+* pvStruct - points to struct
+* sStructs - count of structures in the array
+* szFormat - formatting string (NOTE: NOT AN XSZ -- NEVER UNICODE!)
+*
+*Exit:
+* None.
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+void SwapStructArray(void * pvArray, UINT cStructs, SZ szFormat)
+{
+ UINT i;
+ UINT uSize = 0;
+
+ for (i=0; i< cStructs ; i++)
+ uSize = SwapStruct((VOID *)((BYTE *)pvArray + i*uSize), szFormat);
+
+}
+#pragma code_seg()
+#endif //HP_BIGENDIAN
diff --git a/private/oleauto/src/typelib/gbindtbl.cxx b/private/oleauto/src/typelib/gbindtbl.cxx
new file mode 100644
index 000000000..3a1c86499
--- /dev/null
+++ b/private/oleauto/src/typelib/gbindtbl.cxx
@@ -0,0 +1,1377 @@
+/***
+*gbindtbl.cxx - GENPROJ_BINDNAME_TABLE class implementation
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Class for name binding table.
+*
+*Revision History:
+*
+* 17-Jun-92 ilanc: Created (from bindtbl.cxx)
+* 02-Jul-92 w-peterh: added support for serializing pointers to typebinds
+* 30-Jul-92 w-peterh: removed function overloading
+* 01-Mar-93 w-peterh: use OLE interface to get module names
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+
+#define GENPROJ_BINDNAME_TABLE_VTABLE
+#include "gbindtbl.hxx"
+#include "gptbind.hxx"
+#include "gdtinfo.hxx"
+#include "dtmbrs.hxx"
+#include "nammgr.hxx"
+#include "clutil.hxx" // for HashOfHgnam()
+#include <limits.h> // for INT_MAX
+#include "xstring.h" // for memset
+
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+static char szGpbindtblCxx[] = __FILE__;
+#define SZ_FILE_NAME szGpbindtblCxx
+#endif
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::Constructor - Construct an instance.
+*Purpose:
+* Constructs a GENPROJ_BINDNAME_TABLE instance.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+GENPROJ_BINDNAME_TABLE::GENPROJ_BINDNAME_TABLE()
+{
+ m_indexFirstGlobal = BIND_INVALID_INDEX; // listhead
+ m_hchunkRqpdtbind = HCHUNK_Nil; // array of DYN_TYPEBIND
+
+ m_hchunkBucketTbl = HCHUNK_Nil;
+ m_cBuckets = (UINT)BIND_INVALID_INDEX;
+ m_pnammgr = NULL;
+}
+#pragma code_seg()
+
+// Dtor:
+// Implementation Notes:
+// Free caches and binding table.
+//
+#pragma code_seg(CS_INIT) // called during initialization ?
+GENPROJ_BINDNAME_TABLE::~GENPROJ_BINDNAME_TABLE()
+{
+ ReleaseTable(); // will free caches as well.
+}
+#pragma code_seg()
+
+
+/***
+*PROTECTED GENPROJ_BINDNAME_TBL::Pgptbind
+*Purpose:
+* Gets pointer to containing project-level typebind.
+*
+*Implementation Notes:
+* NOTE: defined inline here and not in the header becuase
+* of mutual dependency between gtlibole and gptbind.
+*
+* Subtracts from this pointer the offset of this
+* embedded instance in container. Offset is obtained
+* from a GENPROJ_TYPEBIND static member const.
+*
+*Entry:
+*
+*Exit:
+* GENPROJ_TYPEBIND *
+*
+***********************************************************************/
+
+inline GENPROJ_TYPEBIND *GENPROJ_BINDNAME_TABLE::Pgptbind() const
+{
+ return (GENPROJ_TYPEBIND *)((BYTE *)this - GENPROJ_TYPEBIND::oGbindnametbl);
+}
+
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::Initializer - initialize an instance.
+*Purpose:
+* initializes a GENPROJ_BINDNAME_TABLE instance.
+*
+*Implementation Notes:
+*
+*Entry:
+* psheapmgr SHEAP_MGR to manage binding table and caches.
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GENPROJ_BINDNAME_TABLE::Init(SHEAP_MGR *psheapmgr, NAMMGR *pnammgr)
+{
+ TIPERROR err;
+
+ DebAssert(psheapmgr != NULL, "GENPROJ_BINDNAME_TABLE: bad params.");
+ DebAssert(pnammgr != NULL, "BINDNAME_TABLE: pnammgr uninitialized.");
+
+ // Cache name manager member
+ m_pnammgr = pnammgr;
+
+ // Set cache size
+ m_cBuckets = 0;
+
+ IfErrRet(m_bmBindTable.Init(psheapmgr));
+ IfErrGo(m_bmArrayCache.Init(psheapmgr));
+ return err;
+
+Error:
+ m_bmBindTable.Free();
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PROTECTED GENPROJ_BINDNAME_TABLE::GetBucketOfHlnam
+*Purpose:
+* Gets the bucket of an hlnam, based on its hash value.
+*
+*Implementation Notes:
+*
+*Entry:
+* hlnam - name to get the bucket of.
+*
+*Exit:
+* Returns a pointer to the gpbinddesc.
+*
+***********************************************************************/
+
+inline UINT GENPROJ_BINDNAME_TABLE::GetBucketOfHlnam(HLNAM hlnam) const
+{
+ DebAssert(hlnam != HCHUNK_Nil, "Invalid hlnam.");
+
+ if (m_cBuckets == 0) {
+ return (UINT)BIND_INVALID_INDEX;
+ }
+
+ return (UINT)(((USHORT)m_pnammgr->HashOfHlnam(hlnam)) % m_cBuckets);
+}
+
+
+/***
+*PROTECTED GENPROJ_BINDNAME_TABLE::IndexOfHlnam
+*Purpose:
+* Find the instance of the hlnam.
+*
+*Implementation Notes:
+*
+*Entry:
+* hlnam - The name to find.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+UINT GENPROJ_BINDNAME_TABLE::IndexOfHlnam(HLNAM hlnam) const
+{
+ GENPROJ_BIND_DESC *rqbinddesc;
+ UINT iBucket, iStartBucket;
+
+ // If the table is not valid, just return INVALID
+ if (m_cBuckets == 0) {
+ return (UINT)BIND_INVALID_INDEX;
+ }
+
+ // Dereference the hdefn so we can get the hlnam
+ rqbinddesc = Rqgpbinddesc();
+ iStartBucket = GetBucketOfHlnam(hlnam);
+
+ // Loop through the table, starting at the given
+ // index.
+ //
+ BOOL fDone = FALSE;
+ for (iBucket = iStartBucket;
+ !fDone;
+ fDone = (iBucket = (iBucket + 1) % m_cBuckets) == iStartBucket) {
+
+ // If the bucket is empty, our linear probe failed
+ if (rqbinddesc[iBucket].Hlnam() == (HLNAM)HCHUNK_Nil) {
+ return (UINT)BIND_INVALID_INDEX;
+ }
+
+ // Check to see if the names are the same
+ if (rqbinddesc[iBucket].Hlnam() == hlnam) {
+ return iBucket;
+ }
+ }
+
+ DebHalt("should never reach here since table should never be full.");
+
+ // We should never reach this, but the compiler will
+ // complain if it isn't there.
+ //
+ return (UINT)BIND_INVALID_INDEX;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::Read - read table
+*Purpose:
+* read a GENPROJ_BINDNAME_TABLE instance and caches.
+*
+*Implementation Notes:
+*
+*Entry:
+* pstrm - stream to read from
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_BINDNAME_TABLE::Read(STREAM *pstrm)
+{
+ USHORT ctyp, cRefLibs=0;
+ USHORT ushort;
+ TIPERROR err;
+
+ IfErrRet(m_bmBindTable.Read(pstrm));
+ IfErrRet(pstrm->ReadUShort(&ctyp)); // # of types in this lib
+
+ IfErrRet(pstrm->ReadUShort(&ushort));
+ m_indexFirstGlobal = (UINT)ushort;
+
+ IfErrRet(pstrm->ReadUShort(&ushort));
+ m_cBuckets = (UINT)ushort;
+
+ IfErrRet(pstrm->ReadUShort(&ushort));
+ m_hchunkBucketTbl = (HCHUNK)ushort;
+
+#if HP_BIGENDIAN
+ // now that the above data members are read, we can swap the BIND_DESCs
+ SwapBindDescs();
+#endif //HP_BIGENDIAN
+
+ // Build the new array caches: note that upon deserialization
+ // they have to be reinited anyway since we don't serialize pointers.
+ //
+ IfErrRet(AllocCaches(ctyp, cRefLibs));
+
+ DebCheckState(1); // blkmgrs will be checked.
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::Write - write table
+*Purpose:
+* write a GENPROJ_BINDNAME_TABLE instance.
+*
+*Implementation Notes:
+* layout:
+* bindtable
+* cache arrays (ptrs nullified on reload).
+* hchunk of module cache
+* hchunk of ref'ed proj cache
+*
+*Entry:
+* pstrm - stream to write to
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR GENPROJ_BINDNAME_TABLE::Write(STREAM *pstrm)
+{
+ TIPERROR err;
+
+ DebCheckState(1); // blkmgrs will be checked.
+
+#if HP_BIGENDIAN
+ SwapBindDescs();
+#endif // HP_BIGENDIAN
+
+ IfErrRet(m_bmBindTable.Write(pstrm));
+
+#if HP_BIGENDIAN
+ SwapBindDescs();
+#endif // HP_BIGENDIAN
+
+ // Write out the number of types in this proj/typelib.
+ IfErrRet(pstrm->WriteUShort((USHORT)(m_hchunkRqpdtbind != HCHUNK_Nil ?
+ (ULONG)Rqpdtbind()[0] :
+ HCHUNK_Nil)));
+
+
+ IfErrRet(pstrm->WriteUShort((USHORT)m_indexFirstGlobal));
+ IfErrRet(pstrm->WriteUShort((USHORT)m_cBuckets));
+ IfErrRet(pstrm->WriteUShort((USHORT)m_hchunkBucketTbl));
+
+ // To verify everything is un-swapped correctly
+ DebCheckState(0);
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#if HP_BIGENDIAN
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::SwapBindDescs
+*Purpose:
+* Swap the entries in the given binddesc for serialization
+*
+*Entry:
+* hbinddesc - the binddesc to swap
+*
+*Exit:
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+void GENPROJ_BINDNAME_TABLE::SwapBindDescs() const
+{
+ UINT iBucket;
+ GENPROJ_BIND_DESC *rqbinddesc;
+
+ if (m_hchunkBucketTbl != HCHUNK_Nil) {
+ rqbinddesc = Rqgpbinddesc();
+
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ SwapStruct((VOID *)&rqbinddesc[iBucket], GENPROJ_BIND_DESC_LAYOUT);
+ }
+ }
+}
+#pragma code_seg( )
+#endif // HP_BIGENDIAN
+
+
+
+/***
+*PRIVATE GENPROJ_BINDNAME_TABLE::AddNameToTable
+*Purpose:
+* Adds a module or project name to project's binding table.
+*
+*Implementation Notes:
+* Allocs a binddesc and adds it to table.
+*
+*Entry:
+* hlnam name handle to add.
+* uOrdinal Ordinal of module/project: note: 0xFFFF reserved for curproj.
+* isTypeInfo TRUE if describes a typeinfo
+* isTypeGlobal TRUE if describes type that exposes global names (IN).
+*
+*Exit:
+*
+*Errors:
+* TIPERROR (OOM if can't alloc binddesc).
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GENPROJ_BINDNAME_TABLE::AddNameToTable(HLNAM hlnam,
+ UINT uOrdinal,
+ BOOL isTypeInfo,
+ BOOL isGlobal)
+{
+ UINT ctyp = 0, cRefLibs = 0, ctypAdd, cRefLibsAdd=0;
+ GENPROJ_BIND_DESC gpbinddesc;
+ TIPERROR err;
+
+ // Add the information to the new entry
+ gpbinddesc.m_fTypeInfoIndex = isTypeInfo;
+ gpbinddesc.m_hlnam = (sHLNAM)hlnam >> 1;
+ gpbinddesc.m_uOrdinal = (USHORT)uOrdinal;
+
+ // We figure out whether this name is global or not by the contents of
+ // m_iNextGlobal. (BIND_INVALID_INDEX means not global)
+ // So set m_iNextGlobal accordingly.
+ //
+ if (isGlobal && isTypeInfo) {
+ gpbinddesc.m_iNextGlobal = 0; // anything besides Invalid
+ }
+ else {
+ gpbinddesc.m_iNextGlobal = BIND_INVALID_INDEX;
+ }
+
+ // Adjust the size of the project cache, depending on what
+ // we have added..
+ //
+ if (m_hchunkRqpdtbind != HCHUNK_Nil) {
+ ctyp = (UINT)(ULONG)(Rqpdtbind()[0]);
+ }
+
+ ctypAdd = ctyp + (UINT)(isTypeInfo ? 1 : 0);
+
+
+ // We must change the size of the project caches to reflect the
+ // new number of TypeInfos in the current project. At the end
+ // of each compile, the contents of the caches are released but
+ // the caches themselves are not. Thus we must first release
+ // the current caches before we allocate the new caches (of the
+ // new size).
+ //
+ FreeCaches();
+
+ // Note that in EI_OLE, cRefLibsAdd isn't initialized
+ // BUT IT DOESN'T MATTER since there aren't any reflibs in OLE.
+ // (yes, there are cleaner ways to do this... VBA2).
+ //
+ IfErrGo(AllocCaches(ctypAdd, cRefLibsAdd));
+
+ // Readjust the size of the table.
+ // SetTableSize will automaticly copy the contents of the
+ // table into the new, larger table, and will properly set
+ // up the Global list.
+ //
+ IfErrGo(SetTableSize(m_cBuckets / BIND_SIZE_FACTOR + 1));
+
+
+ // Add it to the name cache
+ AddQgpbinddesc(&gpbinddesc);
+
+ return TIPERR_None;
+
+Error:
+ // We failed to reset the table size, so we must reset
+ // the project-level caches to their previous value. We know
+ // this will succeed because FreeCaches will free up more
+ // memory than we are going to allocate. In any event, we must
+ // ignore any error returned by AllocCaches because we are
+ // already handling an error.
+ //
+ FreeCaches();
+
+ DebSuspendError();
+
+ (VOID)AllocCaches(ctyp, cRefLibs);
+
+ DebResumeError();
+
+ return err;
+}
+#pragma code_seg( )
+
+
+/***
+*PRIVATE GENPROJ_BINDNAME_TABLE::AddQgpbinddesc
+*Purpose:
+* Adds a GENPROJ_BIND_DESC to project's binding table.
+*
+*Implementation Notes:
+* Adds a given binddesc to the table.
+*
+*Entry:
+* gpbinddesc - the gpbinddesc to add
+*
+*Exit:
+*
+*Errors:
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID GENPROJ_BINDNAME_TABLE::AddQgpbinddesc(GENPROJ_BIND_DESC *pgpbinddesc)
+{
+ UINT iBucket, iStartBucket;
+ GENPROJ_BIND_DESC *rqbinddesc;
+
+ DebAssert(m_cBuckets != 0, "Invalid table");
+
+ // Dereference the table
+ rqbinddesc = Rqgpbinddesc();
+
+ // Assert that this gpbinddesc is valid. We must
+ // strip off the lowest-order bit of the HCHUNK_Nil below
+ // because it lowest order bit of the hlnam is lost
+ // while it is stored in the gpbinddesc.
+ //
+ DebAssert(pgpbinddesc->Hlnam() != (HLNAM)HCHUNK_Nil,
+ "Invalid gpbinddesc.");
+
+ iStartBucket = GetBucketOfHlnam(pgpbinddesc->Hlnam());
+
+ // Determine where we are going to put this.
+ BOOL fDone = FALSE;
+ for (iBucket = iStartBucket;
+ !fDone;
+ fDone = (iBucket = (iBucket + 1) % m_cBuckets) == iStartBucket) {
+
+ // If the bucket is empty, add
+ if (rqbinddesc[iBucket].Hlnam() == (HLNAM)HCHUNK_Nil) {
+
+ // Just do a shallow copy
+ rqbinddesc[iBucket] = *pgpbinddesc;
+
+ // If this is a global typeinfo (m_iNextGlobal != BIND_INVALID_INDEX),
+ // add it to the front of the global list.
+ //
+ if (rqbinddesc[iBucket].m_iNextGlobal != BIND_INVALID_INDEX) {
+ // The last entry of the list points to itself
+ if ((USHORT)m_indexFirstGlobal == BIND_INVALID_INDEX) {
+ rqbinddesc[iBucket].m_iNextGlobal = (USHORT)iBucket;
+ m_indexFirstGlobal = iBucket;
+ }
+ else {
+ rqbinddesc[iBucket].m_iNextGlobal = (USHORT)m_indexFirstGlobal;
+ m_indexFirstGlobal = iBucket;
+ }
+ }
+
+ return;
+ }
+ }
+
+ DebHalt("Table full.");
+}
+#pragma code_seg( )
+
+
+/***
+*PRIVATE GENPROJ_BINDNAME_TABLE::RemoveNameFromTableOfIBucket
+*Purpose:
+* Removes a module or project name from project's binding table.
+* Called by both RemoveNameFromTableOf{Hlnam | Ordinal}
+*Entry:
+* Ibucket bucket entry to remove.
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_BINDNAME_TABLE::RemoveNameFromTableOfIbucket(UINT iBucket)
+{
+ BOOL isTypeInfo;
+ UINT ctyp = 0, cRefLibs = 0;
+ GENPROJ_BIND_DESC *rqbinddesc;
+ GENPROJ_BIND_DESC binddescSave;
+ TIPERROR err;
+
+ // Make sure it's in here
+ DebAssert((USHORT)iBucket != BIND_INVALID_INDEX, "bad index.");
+
+ rqbinddesc = Rqgpbinddesc();
+
+ // Determine if this is a typeinfo.
+ isTypeInfo = rqbinddesc[iBucket].IsTypeInfo();
+
+ // Save the entry so that we can restore in the error case.
+ binddescSave = rqbinddesc[iBucket];
+
+ // Clear this entry
+ rqbinddesc[iBucket].m_fTypeInfoIndex = TRUE;
+ rqbinddesc[iBucket].m_hlnam = (USHORT)(HLNAM_Nil >> 1);
+ rqbinddesc[iBucket].m_uOrdinal = (USHORT)~0;
+ rqbinddesc[iBucket].m_iNextGlobal = BIND_INVALID_INDEX;
+
+ // Allocate the new array, shrinking it by 1.
+ IfErrGo(SetTableSize(m_cBuckets / BIND_SIZE_FACTOR - 1));
+
+ // Adjust the size of the project cache, depending on what
+ // we have removed...
+ //
+ if (m_hchunkRqpdtbind != HCHUNK_Nil) {
+ ctyp = (UINT)(ULONG)(Rqpdtbind()[0]);
+ }
+
+ ctyp -= (UINT)(isTypeInfo ? 1 : 0);
+
+ if (ctyp == 0) {
+ ctyp = (UINT)HCHUNK_Nil;
+ }
+
+
+ // We must change the size of the project caches to reflect the
+ // new number of TypeInfos in the current project. At the end
+ // of each compile, the contents of the caches are released but
+ // the caches themselves are not. Thus we must first release
+ // the current caches before we allocate the new caches (of the
+ // new size).
+ //
+ // The call to AllocCaches will NOT fail because we are
+ // shrinking the size of the caches.
+ //
+ FreeCaches();
+
+ DebSuspendError();
+
+ err = AllocCaches(ctyp, cRefLibs);
+ DebAssert(err == TIPERR_None, "AllocCaches failed.");
+
+ DebResumeError();
+
+
+ return TIPERR_None;
+
+Error:
+ // Restore the saved entry.
+ rqbinddesc[iBucket] = binddescSave;
+
+ return err;
+}
+
+
+/***
+*PRIVATE GENPROJ_BINDNAME_TABLE::RemoveNameFromTableOfHlnam
+*Purpose:
+* Removes a module or project name from project's binding table.
+*
+*Entry:
+* hlnam name handle to remove.
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_BINDNAME_TABLE::RemoveNameFromTableOfHlnam(HLNAM hlnam)
+{
+ UINT iBucket;
+
+ // If the table is empty, then there is nothing
+ // to remove.
+ //
+ if (m_cBuckets == 0) {
+ return TIPERR_None;
+ }
+
+ iBucket = IndexOfHlnam(hlnam);
+
+ // Make sure it's in here
+ if ((USHORT)iBucket == BIND_INVALID_INDEX) {
+ return TIPERR_None;
+ }
+
+ return RemoveNameFromTableOfIbucket(iBucket);
+}
+
+
+#if 0 //Dead Code
+/***
+*PRIVATE GENPROJ_BINDNAME_TABLE::RemoveNameFromTableOfOrdinal
+*Purpose:
+* Removes a module or project name from project's binding table
+* by ordinal.
+*
+*Entry:
+* ordinal ordinal of typeinfo/ref'ed typelib to remove.
+* isTypeInfo TRUE if ordinal is of typeinfo, otherwise of ref'ed typelib.
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_BINDNAME_TABLE::RemoveNameFromTableOfOrdinal(UINT uOrdinal,
+ BOOL isTypeInfo)
+{
+ UINT iBucket;
+ GENPROJ_BIND_DESC *rqbinddesc;
+
+ // If the table is empty, then there is nothing
+ // to remove.
+ //
+ if (m_cBuckets == 0) {
+ return TIPERR_None;
+ }
+
+ rqbinddesc = Rqgpbinddesc();
+ // Loop through the array, looking for the ordinal we want,
+ // if we find it, remove it by iBucket.
+ //
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ if ((isTypeInfo && rqbinddesc[iBucket].IsTypeInfo()) ||
+ (!isTypeInfo && !rqbinddesc[iBucket].IsTypeInfo())) {
+ if (rqbinddesc[iBucket].Ordinal() == uOrdinal) {
+ return RemoveNameFromTableOfIbucket(iBucket);
+ }
+ }
+ } // for
+ return TIPERR_None;
+}
+#endif //0
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::VerifyNameOfOrdinal
+*Purpose:
+* Check the given name against the given ordinal (and type/proj) to
+* see if our table is current. If not, change it.
+*
+*Entry:
+* hlnam hlnam to verify
+* ordinal ordinal of typeinfo/ref'ed typelib to verify.
+* isTypeInfo TRUE if ordinal is of typeinfo, otherwise of ref'ed typelib.
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_BINDNAME_TABLE::VerifyNameOfOrdinal(HLNAM hlnam,
+ UINT uOrdinal,
+ BOOL isTypeInfo)
+{
+ GENPROJ_BIND_DESC *qbinddesc, *rqbinddescTable, binddescSave;
+ UINT iBucket;
+ TIPERROR err;
+
+ // If the table is empty, just return.
+ if (m_cBuckets == 0) {
+ return TIPERR_None;
+ }
+
+ rqbinddescTable = Rqgpbinddesc();
+
+ // To avoid having to iterate over the table each time we are
+ // called, look up the name and compare.
+ //
+ iBucket = IndexOfHlnam(hlnam);
+
+ // Compare the name we found to the information we have.
+ if (iBucket != BIND_INVALID_INDEX) {
+ qbinddesc = &rqbinddescTable[iBucket];
+
+ if ( ( (qbinddesc->IsTypeInfo() && isTypeInfo) ||
+ (!qbinddesc->IsTypeInfo() && !isTypeInfo) ) &&
+ (qbinddesc->Ordinal() == uOrdinal) ) {
+ // The information in the table is valid, return
+ return TIPERR_None;
+ }
+ }
+
+ // The table is not correct, so we must update this entry by
+ // ordinal. So search the table for an entry with the same
+ // ordinal and isTypeInfo.
+ // This loop produces an ordinal: iBucket
+ //
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ qbinddesc = &rqbinddescTable[iBucket];
+ // if there's a valid typeinfo entry then...
+ if (qbinddesc->Hlnam() != (HLNAM)HCHUNK_Nil) {
+ if ((isTypeInfo && qbinddesc->IsTypeInfo()) ||
+ (!isTypeInfo && !qbinddesc->IsTypeInfo())) {
+ // if it's got the ordinal we want, then map it and break.
+ if (qbinddesc->Ordinal() == uOrdinal) {
+ break;
+ } // if
+ } // if
+ } // if
+ } // for
+
+ DebAssert(iBucket < m_cBuckets, "should have found ordinal.");
+
+ // Save the old bind desc for error recovery.
+ binddescSave = *qbinddesc;
+
+ // Update the hlnam of the TypeInfo
+ qbinddesc->m_hlnam = hlnam >> 1;
+
+ // We need to rebuild the binding table because changing this
+ // entries HLNAM corrupts the hashing w/linear probing. Calling
+ // SetTableSize with the current size does this.
+ //
+ IfErrGo(SetTableSize(m_cBuckets / BIND_SIZE_FACTOR));
+
+ return TIPERR_None;
+
+Error:
+ // Reset the entry we changed to keep the binding table valid.
+ *qbinddesc = binddescSave;
+
+ return err;
+}
+
+/***
+*PRIVATE GENPROJ_BINDNAME_TABLE::FreeCaches
+*Purpose:
+* Frees arrays for caches.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Errors:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID GENPROJ_BINDNAME_TABLE::FreeCaches()
+{
+ UINT ctyp;
+ UINT cbSizeRqpdtbind;
+#if ID_DEBUG
+ UINT ityp;
+#endif // ID_DEBUG
+
+
+
+ // We need to release resources explicitly here since
+ // there could be callers that FreeCaches directly w/o
+ // releasing resources themselves.
+ //
+ ReleaseResources();
+
+
+ if (m_hchunkRqpdtbind != HCHUNK_Nil) {
+ // Get array cardinality -- stored at offset 0 of array.
+ ctyp = (UINT)(ULONG)Rqpdtbind()[0];
+ cbSizeRqpdtbind = (ctyp+1) * sizeof(DYN_TYPEBIND *);
+
+#if ID_DEBUG
+ for (ityp = 1; ityp <= ctyp; ityp++) {
+ DebAssert(Rqpdtbind()[ityp] == NULL, "unreleased ref.");
+ }
+#endif // ID_DEBUG
+
+ // Free array of DYN_TYPEBIND*.
+ m_bmArrayCache.FreeChunk(m_hchunkRqpdtbind, cbSizeRqpdtbind);
+ m_hchunkRqpdtbind = HCHUNK_Nil;
+ }
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE GENPROJ_BINDNAME_TABLE::AllocCaches
+*Purpose:
+* Allocates arrays for caches.
+*
+*Implementation Notes:
+* Allocates array of size ctyp for module typebinds
+* and array of size cRefLibs for ref'ed proj typebinds.
+*
+*Entry:
+* ctyp
+* cRefLibs
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GENPROJ_BINDNAME_TABLE::AllocCaches(UINT ctyp, UINT cRefLibs)
+{
+ HCHUNK hchunkRqpdtbind = HCHUNK_Nil;
+ UINT cbSizeRqpdtbind;
+ TIPERROR err;
+
+ if (ctyp != (USHORT)HCHUNK_Nil) {
+ // Allocate array of DYN_TYPEBIND* for modules indexed by ordinal,
+ // store array cardinality at offset 0.
+ //
+ cbSizeRqpdtbind = (ctyp+1) * sizeof(DYN_TYPEBIND *);
+ IfErrRet(m_bmArrayCache.AllocChunk(&hchunkRqpdtbind, cbSizeRqpdtbind));
+ m_hchunkRqpdtbind = (sHCHUNK)hchunkRqpdtbind;
+
+ // initialize entries to NULL
+ memset(m_bmArrayCache.QtrOfHandle(hchunkRqpdtbind),
+ (int)NULL,
+ cbSizeRqpdtbind);
+
+ // store array cardinality at offset 0.
+ DebAssert(sizeof(ULONG) >= sizeof(DYN_TYPEBIND *), "bad ptr size.");
+ Rqpdtbind()[0] = (DYN_TYPEBIND *)ctyp;
+ }
+ else {
+ m_hchunkRqpdtbind = HCHUNK_Nil;
+ }
+
+
+ return TIPERR_None;
+
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::ReleaseTable
+*Purpose:
+* Release hashtable and associated typebind arrays.
+*
+*Implementation Notes:
+* Defers to base class to free table and frees
+* (proj-level only) typebind arrays.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID GENPROJ_BINDNAME_TABLE::ReleaseTable()
+{
+ UINT cbSizeTable;
+
+ FreeCaches();
+
+ // free the table
+ if (m_hchunkBucketTbl != HCHUNK_Nil) {
+ DebAssert(m_cBuckets != BIND_INVALID_INDEX, "bad bindtable.");
+
+ cbSizeTable = m_cBuckets * sizeof(GENPROJ_BIND_DESC);
+ m_bmBindTable.FreeChunk(m_hchunkBucketTbl, cbSizeTable);
+ m_hchunkBucketTbl = HCHUNK_Nil;
+ m_cBuckets = 0;
+ } // end of if
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::ReleaseResources
+*Purpose:
+* Release resources owned by binding table.
+*
+*Implementation Notes:
+* Iterates over each non-NIL entry in array of ref'ed proj
+* typebinds and module typebinds.
+* Note that module-level typebinds maintain *internal*
+* refcounts and proj-level typebinds have *external* refcounts,
+* thus they are released accordingly.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID GENPROJ_BINDNAME_TABLE::ReleaseResources()
+{
+ UINT ctyp, ityp;
+
+ if (m_hchunkRqpdtbind != HCHUNK_Nil) {
+ // Release internal references to module typebinds.
+ ctyp = (UINT)(ULONG)Rqpdtbind()[0];
+ for (ityp = 1; ityp <= ctyp; ityp++) {
+ if (Rqpdtbind()[ityp] != NULL) {
+ Rqpdtbind()[ityp]->RelInternalRef();
+ Rqpdtbind()[ityp]=NULL;
+ }
+ }
+ }
+
+
+
+}
+#pragma code_seg()
+
+
+/***
+*GENPROJ_BINDNAME_TABLE::SetTableSize
+*Purpose:
+* Set and allocate the bindname table.
+*
+*Implementation Notes:
+* Copy all of the elements from the existing table into a newly
+* allocated table.
+* Note: we save the old table in dynalloced memory, the free old table,
+* create a new table
+* and then copy back the save table to the new.
+* Finally, we free the dynalloced memory.
+*
+*Entry:
+* cEntries - The number of entries into this table.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GENPROJ_BINDNAME_TABLE::SetTableSize(UINT cEntries)
+{
+ UINT iBucket, cBucketOld, cBucketNew;
+ GENPROJ_BIND_DESC *rqbinddesc, *rqbinddescTableOld;
+ HCHUNK hchunkBucketTblNew, hchunkBucketTblOld;
+ BYTE *pbTableCopy = NULL;
+ UINT indexFirstGlobalOld;
+ TIPERROR err = TIPERR_None, err2;
+
+ // VBA2: Rewrite the table to use a BLK_DESC instead of a
+ // BLK_MGR so that we can just Realloc the table instead
+ // of going through the BS below.
+ //
+ // Also, we should be able to reorganize the table in place
+ // instead of copying it to a separate block of memory by
+ // utilizing the iNextGlobal field to store any information
+ // we might require.
+
+ // Cache and save the old table, if it exists
+ hchunkBucketTblOld = m_hchunkBucketTbl;
+ if (hchunkBucketTblOld != HCHUNK_Nil) {
+ cBucketOld = m_cBuckets;
+ indexFirstGlobalOld = m_indexFirstGlobal;
+ IfNullRet(pbTableCopy =
+ (BYTE *)MemAlloc(cBucketOld * sizeof(GENPROJ_BIND_DESC)));
+ rqbinddescTableOld = Rqgpbinddesc();
+ // save the old table
+ memcpy(pbTableCopy,
+ (BYTE *)rqbinddescTableOld,
+ cBucketOld * sizeof(GENPROJ_BIND_DESC));
+ // Free the old array
+ m_bmBindTable.Free();
+
+ // The following should never fail because we just freed up
+ // a bunch of memory.
+ //
+ DebSuspendError();
+
+ // need to reinit with sheapmgr -- but gosh how hard it is to get.
+ err = m_bmBindTable.Init(Pgptbind()->Pgtlibole()->Psheapmgr());
+ DebAssert(err == TIPERR_None, "Can't fail.");
+
+ DebResumeError();
+ }
+
+ // Clear the existing table
+ m_indexFirstGlobal = (UINT)BIND_INVALID_INDEX;
+
+ // Set the new table size
+ // CONSIDER: 27-Aug-93 andrewso
+ // Set the # of buckets to the nearest power of two. Would
+ // require saving cEntries for AddHbindescIncTable and
+ // RemoveHlnam, but should considerable speed up the mods.
+ //
+ cBucketNew = cEntries * BIND_SIZE_FACTOR;
+ hchunkBucketTblNew = HCHUNK_Nil;
+
+ // Allocate a new table.
+ IfErrGoTo(m_bmBindTable.AllocChunk(&hchunkBucketTblNew,
+ cBucketNew * sizeof(GENPROJ_BIND_DESC)),
+ Error2);
+
+ // Store the new table size and handle.
+ m_cBuckets = (USHORT)cBucketNew;
+ m_hchunkBucketTbl = (sHCHUNK)hchunkBucketTblNew;
+
+ // Initialize all entries with HCHUNK_Nil
+ rqbinddesc = Rqgpbinddesc();
+
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ new (&rqbinddesc[iBucket]) GENPROJ_BIND_DESC;
+ }
+
+ // If we have a saved copy of the old table we need to transfer
+ // it to the new table.
+ //
+ if (hchunkBucketTblOld != HCHUNK_Nil) {
+ rqbinddescTableOld = (GENPROJ_BIND_DESC *)pbTableCopy;
+
+ // Loop through the old array, adding all entries to the new array.
+ for (iBucket = 0; iBucket < cBucketOld; iBucket++) {
+ // if there's a valid entry then add to new table.
+ if (rqbinddescTableOld[iBucket].Hlnam() != (HLNAM)HCHUNK_Nil) {
+ AddQgpbinddesc(&rqbinddescTableOld[iBucket]);
+ }
+ } // for
+ } // if
+ goto Error;
+
+Error2:
+ // We want to restore the old table so that error recovery can
+ // continue correctly.
+ // Note that we MUST be able to allocate a chunk sufficient
+ // for the old block since we just freed it.
+ //
+ if (hchunkBucketTblOld != HCHUNK_Nil) {
+ m_cBuckets = cBucketOld;
+ m_indexFirstGlobal = indexFirstGlobalOld;
+
+ // Allocate a chunk for the old table.
+ //
+ // Since we freed a chunk the same size as this above, the
+ // below should never fail.
+ //
+ DebSuspendError();
+
+ err2 = m_bmBindTable.AllocChunk(&hchunkBucketTblOld,
+ m_cBuckets * sizeof(GENPROJ_BIND_DESC));
+ DebAssert(err2 == TIPERR_None, "must be able to go back to old table.");
+
+ DebResumeError();
+
+ // Restore it.
+ m_hchunkBucketTbl = (sHCHUNK)hchunkBucketTblOld;
+ memcpy((BYTE *)Rqgpbinddesc(),
+ pbTableCopy,
+ cBucketOld * sizeof(GENPROJ_BIND_DESC));
+
+ }
+ // fall through...
+
+Error:
+ MEMFREE(pbTableCopy);
+ return err;
+}
+#pragma code_seg( )
+
+
+#if 0 //Dead Code
+/***
+*GENPROJ_BINDNAME_TABLE::NotifyNewOrdinalOfOldOrdinal
+*Purpose:
+* Used by clients to notify binder that the ordinal of typeinfo
+* has been changed (probably cos of a deleted module).
+*
+*Implementation Notes:
+* Searches proj-level binding table and replaces the old ordinal
+* with the new ordinal.
+* Asserts if old ordinal not found -- client bug.
+*
+*Entry:
+* uOrdinalOld
+* uOrdinalNew
+* isTypeInfo
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+VOID GENPROJ_BINDNAME_TABLE::NotifyNewOrdinalOfOldOrdinal(UINT uOrdinalNew,
+ UINT uOrdinalOld,
+ BOOL isTypeInfo)
+{
+ UINT iBucket;
+ GENPROJ_BIND_DESC *rqbinddescTable;
+ GENPROJ_BIND_DESC *qbinddesc;
+#if ID_DEBUG
+ BOOL fFound = FALSE; // be pessimistic
+#endif // ID_DEBUG
+
+ // If the table is empty, there is nothing for us to do.
+ if (m_cBuckets == 0) {
+ return;
+ }
+
+ // get binding table.
+ rqbinddescTable = Rqgpbinddesc();
+
+ // Loop through the array, searching for uOrdinalOld.
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ qbinddesc = &rqbinddescTable[iBucket];
+ // if there's a valid typeinfo entry then...
+ if (qbinddesc->Hlnam() != (HLNAM)HCHUNK_Nil) {
+ if ((isTypeInfo && qbinddesc->IsTypeInfo()) ||
+ (!isTypeInfo && !qbinddesc->IsTypeInfo())) {
+ // if it's got the ordinal we want, then map it and break.
+ if (qbinddesc->Ordinal() == uOrdinalOld) {
+ qbinddesc->m_uOrdinal = (USHORT)uOrdinalNew;
+#if ID_DEBUG
+ fFound = TRUE;
+#endif // ID_DEBUG
+ break;
+ } // if
+ } // if
+ } // if
+ } // for
+ DebAssert(fFound, "should have found old ordinal.");
+ return;
+}
+#endif
+
+
+#if ID_DEBUG
+
+/***
+*GENPROJ_BINDNAME_TABLE::DebCheckState
+*Purpose:
+* Verify that the information in the binding table is valid.
+*
+*Entry:
+* uLevel - unused
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+VOID GENPROJ_BINDNAME_TABLE::DebCheckState(UINT uLevel) const
+{
+ USHORT cTypeInfo;
+ UINT iBucket, cTable;
+ GenericTypeLibOLE *pgtlibole;
+ GENPROJ_BIND_DESC *rqbinddescTable;
+ BYTE *rgFound;
+
+
+ // Check state of embedded blkmgrs.
+ m_bmBindTable.DebCheckState(uLevel);
+ m_bmArrayCache.DebCheckState(uLevel);
+
+ DebSuspendError();
+
+ pgtlibole = m_pnammgr->Pgtlibole();
+
+ // Get the number of TypeInfos and RefLibs in this TypeLib
+ cTypeInfo = pgtlibole->GetTypeInfoCount();
+
+
+ // (1) Check the size of the table
+ //
+ DebAssert((UINT)(cTypeInfo * BIND_SIZE_FACTOR) == m_cBuckets,
+ "Invalid table size.");
+
+ // If the table is empty, we must leave before we try to
+ // dereference the binding table.
+ //
+ if (m_cBuckets == 0) {
+ DebResumeError();
+
+ return;
+ }
+
+ // (2) Check the TypeInfos in the table
+ // Verify that:
+ // A) The number of TypeInfos in the table agrees
+ // with the number in the TypeLib.
+ // B) The ordinals of the TypeInfos are valid.
+ // and
+ // C) The are no duplicate ordinals
+ //
+ // get binding table.
+ rqbinddescTable = Rqgpbinddesc();
+
+ // We set the nth field of this array when we find an entry
+ // with an ordinal of n.
+ //
+ // This could be done with bits.
+ //
+ if (!(rgFound = (BYTE *)MemZalloc(cTypeInfo))) {
+ DebResumeError();
+
+ return;
+ }
+
+ for (iBucket = 0, cTable = 0; iBucket < m_cBuckets; iBucket++) {
+ if (rqbinddescTable[iBucket].IsTypeInfo() &&
+ rqbinddescTable[iBucket].Ordinal() != BIND_INVALID_INDEX) {
+
+ cTable++;
+
+ // The ordinal should be less than the total number
+ // of TypeInfos in the TypeLib.
+ //
+ DebAssert(rqbinddescTable[iBucket].Ordinal() < cTypeInfo,
+ "Invalid GENPROJ_BIND_DESC ordinal.");
+
+ // Check the nth entry in the Found array, where n is the ordinal
+ // in this binddesc.
+ //
+ DebAssert(rgFound[rqbinddescTable[iBucket].Ordinal()]++ == 0,
+ "Duplicate ordinal.");
+ }
+ }
+
+ MemFree(rgFound);
+
+ // Assert that the number of TypeInfos we found in the table
+ // matches the number in the TypeLib.
+ //
+ DebAssert(cTable == cTypeInfo, "Invalid binding table");
+
+ // (3) Check the global list, making sure there is no invalid
+ // links or loops.
+ //
+ cTable = 0; // Counts the number of entries we've visited
+
+ iBucket = IndexFirstGlobal();
+
+ while(iBucket != BIND_INVALID_INDEX) {
+
+ // Is a valid index
+ DebAssert(iBucket < m_cBuckets, "Invalid bucket");
+
+ // Points to a valid GENPROJ_BIND_DESC
+ DebAssert(rqbinddescTable[iBucket].IsTypeInfo(),
+ "Global list points to a RefLib.");
+
+ // Points to a global typeinfo entry
+ DebAssert(rqbinddescTable[iBucket].IndexNextGlobal() != BIND_INVALID_INDEX,
+ "Global list points to a non-global TypeInfo.");
+
+ // This is valid!
+ cTable++;
+
+ // If we've found more entries than are in the table, there
+ // must be a loop somewhere.
+ //
+ DebAssert(cTable <= cTypeInfo, "Loop in global list.");
+
+ // Get the next entry in the list. If it is the same as the
+ // current entry, we are at the end of the list and should
+ // exit.
+ //
+ if (iBucket == rqbinddescTable[iBucket].IndexNextGlobal()) {
+ iBucket = BIND_INVALID_INDEX;
+ }
+ else {
+ iBucket = rqbinddescTable[iBucket].IndexNextGlobal();
+ }
+ }
+
+
+ DebResumeError();
+}
+
+
+VOID GENPROJ_BINDNAME_TABLE::DebShowState(UINT uLevel) const
+{
+ UINT iBucket;
+ GENPROJ_BIND_DESC *rqbinddesc;
+
+ DebPrintf("*** GENPROJ_BINDNAME_TABLE ***\n");
+ DebPrintf("buckets: %u\n", m_cBuckets);
+
+ if (uLevel > 0 && m_cBuckets != 0) {
+ rqbinddesc = Rqgpbinddesc();
+
+ for (iBucket = 0; iBucket < m_cBuckets; iBucket++) {
+ DebPrintf(" hlnam: %X\n", rqbinddesc[iBucket].Hlnam());
+ }
+ }
+}
+
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/typelib/gbindtbl.hxx b/private/oleauto/src/typelib/gbindtbl.hxx
new file mode 100644
index 000000000..4734d7ec7
--- /dev/null
+++ b/private/oleauto/src/typelib/gbindtbl.hxx
@@ -0,0 +1,415 @@
+/***
+*gbindtbl.hxx - GENPROJ_BINDNAME_TABLE header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Manages hashtable of names for binding.
+* Project-level specific implementation.
+*
+*Revision History:
+*
+* 02-Mar-92 ilanc: created.
+* 02-Jul-92 w-peterh: added serializing pointers to typebinds
+* 30-Jul-92 w-peterh: removed function overloading
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef GENPROJ_BINDNAME_TABLE_HXX_INCLUDED
+#define GENPROJ_BINDNAME_TABLE_HXX_INCLUDED
+
+#include "stream.hxx"
+#if OE_MAC
+#include "silver.hxx"
+#endif
+
+
+class DYN_TYPEBIND;
+class DEFN_TYPEBIND;
+class GENPROJ_TYPEBIND;
+#define STAT_TYPELIB GEN_PROJECT
+class GEN_PROJECT;
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szGBINDTBL_HXX)
+#define SZ_FILE_NAME g_szGBINDTBL_HXX
+#endif
+
+class GenericTypeLibOLE;
+
+#define BIND_INVALID_INDEX ((USHORT)~0)
+#define BIND_SIZE_FACTOR 2
+
+/***
+*struct GENPROJ_BIND_DESC - 'pbinddesc'
+*Purpose:
+* Holds the information stored in the project-level binding table
+*
+***********************************************************************/
+struct GENPROJ_BIND_DESC
+{
+ // Data members
+
+ // m_fTypeInfoIndex determins whether m_uOrdinal reflects
+ // the index to a TypeInfo or the index to a referenced library.
+ // It can be stored in the same word as the HLNAM because the
+ // lowest bit of an HLNAM is always zero.
+ //
+ USHORT m_fTypeInfoIndex:1;
+ USHORT m_hlnam:15;
+
+ USHORT m_uOrdinal;
+ USHORT m_iNextGlobal;
+
+ // ctor
+ GENPROJ_BIND_DESC() {
+ m_fTypeInfoIndex = TRUE;
+ m_hlnam = HLNAM_Nil >> 1;
+ m_uOrdinal = (USHORT)~0;
+ m_iNextGlobal = BIND_INVALID_INDEX;
+ }
+
+ // accessors
+ BOOL IsTypeInfo() {
+ return m_fTypeInfoIndex;
+ }
+
+ HLNAM Hlnam() {
+ // We must check to see if hlnam contains
+ // an HCHUNK_Nil, and, if so, return an
+ // HCHUNK_Nil.
+ //
+ if (m_hlnam == ((USHORT)HCHUNK_Nil >> 1)) {
+ return HCHUNK_Nil;
+ }
+ else {
+ return (HLNAM)(m_hlnam << 1);
+ }
+ }
+
+ UINT Ordinal() {
+ return m_uOrdinal;
+ }
+
+ UINT IndexNextGlobal() {
+ return m_iNextGlobal;
+ }
+};
+
+// The layout string must be kept updated with the
+// structure of the struct above.
+//
+#define GENPROJ_BIND_DESC_LAYOUT "sss"
+
+// Private struct for cross-typelib binding: needed to distinguish
+// between OB projects and non-OB typelibs.
+//
+
+// Tagfield enumeration
+enum BINDINFOKIND
+{
+ BINDINFOKIND_Empty,
+ BINDINFOKIND_OB,
+ BINDINFOKIND_NonOB,
+ BINDINFOKIND_CountRefLib,
+};
+
+struct BINDINFO
+{
+ BINDINFOKIND m_bindinfokind;
+ union {
+ ULONG m_cRefLibs; // only ever in first elem of array.
+ DEFN_TYPEBIND *m_pdfntbind;
+ ITypeCompA *m_ptcomp;
+ };
+
+ // paramless ctor
+ BINDINFO() {
+ m_bindinfokind = BINDINFOKIND_Empty;
+ m_ptcomp = NULL; // m_pdfnbind == NULL
+ }
+
+ // accessors
+ BINDINFOKIND BindInfoKind() { return m_bindinfokind; }
+
+ ULONG CRefLibs() {
+ DebAssert(m_bindinfokind == BINDINFOKIND_CountRefLib, "whoops!");
+ return m_cRefLibs;
+ }
+
+ DEFN_TYPEBIND *Pdfntbind() {
+ DebAssert(m_bindinfokind == BINDINFOKIND_OB, "whoops!");
+ return m_pdfntbind;
+ }
+
+ ITypeCompA *Ptcomp() {
+ DebAssert(m_bindinfokind == BINDINFOKIND_NonOB, "whoops!");
+ return m_ptcomp;
+ }
+
+ BOOL IsEmpty() {
+ return (BOOL)(m_bindinfokind == BINDINFOKIND_Empty);
+ }
+};
+
+
+/***
+*class GENPROJ_BINDNAME_TABLE - 'gbindtbl': BindNameTable implementation.
+*Purpose:
+* BindNameTable impl. Project-level specific.
+*
+***********************************************************************/
+
+class GENPROJ_BINDNAME_TABLE
+{
+ // We let the project-level binder be a friend so that
+ // it can walk our binding table. For the sake of
+ // efficiency this is sometimes useful, i.e. avoids
+ // iterating over the typeinfo's in the lib in some cases
+ // and lets the binder modify fields in the BIND_DESC's.
+ //
+ friend class GENPROJ_TYPEBIND;
+
+public:
+ GENPROJ_BINDNAME_TABLE();
+ nonvirt ~GENPROJ_BINDNAME_TABLE();
+
+ nonvirt TIPERROR Init(SHEAP_MGR *psheapmgr, NAMMGR *pnammgr);
+
+ nonvirt TIPERROR AddNameToTable(HLNAM hlnam,
+ UINT uOrdinal,
+ BOOL isTypeInfo,
+ BOOL isGlobal=FALSE);
+ nonvirt TIPERROR RemoveNameFromTableOfHlnam(HLNAM hlnam);
+#if 0
+ nonvirt TIPERROR RemoveNameFromTableOfOrdinal(UINT uOrdinal,
+ BOOL isTypeInfo);
+#endif
+
+ nonvirt TIPERROR VerifyNameOfOrdinal(HLNAM hlnam,
+ UINT uOrdinal,
+ BOOL isTypeInfo);
+
+ nonvirt UINT IndexOfHlnam(HLNAM hlnam) const;
+ nonvirt UINT IndexFirstGlobal() const;
+
+
+ nonvirt GENPROJ_BIND_DESC *QgpbinddescOfIndex(UINT index) const;
+
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+#if HP_BIGENDIAN
+ nonvirt VOID SwapBindDescs() const;
+#endif
+
+ // introduced methods: Cache methods
+
+ nonvirt VOID ReleaseResources();
+ nonvirt VOID ReleaseTable();
+
+ nonvirt DYN_TYPEBIND *PdtbindOfOrdinal(UINT uOrdinal) const;
+ nonvirt VOID SetPdtbindOfOrdinal(UINT uOrdinal, DYN_TYPEBIND *);
+#if 0
+ nonvirt VOID NotifyNewOrdinalOfOldOrdinal(UINT uOrdinalNew,
+ UINT uOrdinalOld,
+ BOOL isTypeInfo);
+#endif //0
+
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebShowState(UINT uLevel) const;
+#else //!ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+#endif //!ID_DEBUG
+
+protected:
+ TIPERROR RemoveNameFromTableOfIbucket(UINT Ibucket);
+
+ UINT GetBucketOfHlnam(HLNAM hlnam) const;
+ VOID AddQgpbinddesc(GENPROJ_BIND_DESC *gpbinddesc);
+
+ TIPERROR SetTableSize(UINT cEntries);
+
+ GENPROJ_BIND_DESC *Rqgpbinddesc() const;
+
+ // Typeinfo cache methods.
+ nonvirt TIPERROR AllocCaches(UINT ctyp, UINT cRefLibs);
+ nonvirt VOID FreeCaches();
+
+ GENPROJ_TYPEBIND *Pgptbind() const;
+
+ DYN_TYPEBIND **Rqpdtbind() const;
+
+ // data members
+ UINT m_indexFirstGlobal; // listhead of first binddesc
+ // of type that exposes global
+ // names.
+
+ BLK_MGR m_bmBindTable; // Contains proj-level binding table.
+ HCHUNK m_hchunkBucketTbl; // hchunk of the bucket table:
+
+ UINT m_cBuckets; // The number of "entries" that are
+ // currently in this table.
+
+ // below is not serialized
+
+ NAMMGR *m_pnammgr; // cached NAMMGR
+
+ BLK_MGR m_bmArrayCache; // manages typebind array caches
+ // for ref'ed projs and
+ // contained modules.
+
+ HCHUNK m_hchunkRqpdtbind; // hchunk of array of
+ // module typebinds.
+ // Nil if not valid.
+
+
+#ifdef GENPROJ_BINDNAME_TABLE_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+/***
+*Rqpdtbind() - Get pointer module-level typebind array.
+*Purpose:
+* Returns a pointer to array of module-level typebinds.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns a pointer to array. Only valid
+* for a short time.
+*
+***********************************************************************/
+
+inline DYN_TYPEBIND **GENPROJ_BINDNAME_TABLE::Rqpdtbind() const
+{
+ return (DYN_TYPEBIND **)m_bmArrayCache.QtrOfHandle(m_hchunkRqpdtbind);
+}
+
+
+
+
+
+
+/***
+*PdtbindOfOrdinal()
+*Purpose:
+* Get GENPROJ_TYPEBIND* given ordinal (of ref'ed proj).
+* Since array cardinality is stored at offset 0, the input
+* param is incremented and then derefed.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns a GENPROJ_TYPEBIND* or NULL.
+*
+***********************************************************************/
+
+inline DYN_TYPEBIND *GENPROJ_BINDNAME_TABLE::PdtbindOfOrdinal(UINT uOrdinal) const
+{
+#if ID_DEBUG
+ ULONG ctyp;
+
+ ctyp = (ULONG)(Rqpdtbind()[0]);
+ DebAssert((ULONG)uOrdinal < ctyp, "bad subscript.");
+#endif
+ return Rqpdtbind()[uOrdinal+1];
+}
+
+
+
+/***
+*SetPdtbindOfOrdinal()
+*Purpose:
+* Set DYN_TYPEBIND* given ordinal (of ref'ed proj).
+* Since array cardinality is stored at offset 0, the input
+* param is incremented and then derefed.
+*
+*Entry:
+* None.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID GENPROJ_BINDNAME_TABLE::SetPdtbindOfOrdinal(
+ UINT uOrdinal,
+ DYN_TYPEBIND *pdtbind)
+{
+#if ID_DEBUG
+ ULONG ctyp;
+
+ ctyp = (ULONG)(Rqpdtbind()[0]);
+ DebAssert((ULONG)uOrdinal < ctyp, "bad subscript.");
+#endif
+ Rqpdtbind()[uOrdinal+1] = pdtbind;
+}
+
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::IndexFirstGlobal
+*Purpose:
+* Returns the index of the first global.
+*
+*Entry:
+* None.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline UINT GENPROJ_BINDNAME_TABLE::IndexFirstGlobal() const
+{
+ return m_indexFirstGlobal;
+}
+
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::QgpbinddescOfIndex
+*Purpose:
+* Returns the GENPROJ_BIND_DESC of the given index
+*
+*Entry:
+* index - which gpbinddesc to return
+*
+*Exit:
+*
+***********************************************************************/
+
+inline GENPROJ_BIND_DESC *GENPROJ_BINDNAME_TABLE::QgpbinddescOfIndex(UINT index) const
+{
+ DebAssert(index < m_cBuckets, "Invalid index.");
+
+ return &(Rqgpbinddesc()[index]);
+}
+
+
+/***
+*PUBLIC GENPROJ_BINDNAME_TABLE::Rqgpbinddesc
+*Purpose:
+* Returns a pointer to the gpbinddesc array.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline GENPROJ_BIND_DESC *GENPROJ_BINDNAME_TABLE::Rqgpbinddesc() const
+{
+ DebAssert(m_hchunkBucketTbl != HCHUNK_Nil, "Bad table.");
+
+ return (GENPROJ_BIND_DESC *)m_bmBindTable.QtrOfHandle(m_hchunkBucketTbl);
+}
+
+
+#endif // ! GENPROJ_BINDNAME_TABLE_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/gdtinfo.cxx b/private/oleauto/src/typelib/gdtinfo.cxx
new file mode 100644
index 000000000..ef6e87db3
--- /dev/null
+++ b/private/oleauto/src/typelib/gdtinfo.cxx
@@ -0,0 +1,4981 @@
+/***
+*gdtinfo.cxx - GEN_DTINFO definition
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* GEN_DTINFO is inherited by BASIC_TYPEINFO and used directly
+* by clients such as COMPOSER.
+*
+*Owner:
+* AlanC
+*
+*Revision History:
+*
+* 01-Mar-91 alanc: Created.
+* [01] 20-Mar-91 ilanc: include ctseg.hxx (COMPILETIME_SEG)
+* [02] 04-Apr-91 ilanc: init private universe member in constructor.
+* [03] 13-Nov-91 ilanc: rm TYPEKIND param from Init of DYN_TYPEMEMBERS.
+* [04] 05-Mar-92 ilanc: Added m_isBasic attr to DYN_TYPEROOT::Init().
+* [05] 12-Apr-92 ilanc: Check for NULL m_pdtmbrs in DebCheckState();
+* [06] 05-May-92 ilanc: Added CS_SEMIDECLARED stuff.
+* [07] 02-Jul-92 w-peterh: add OrdinalOfRectbind() and PrtbindOfOrdinal()
+* [08] 10-Jul-92 w-peterh: set TypeInfo's of imptype in CreateRecTinfos
+* [09] 01-Sep-92 rajivk: Functions for bringing all needed class to runnable state.
+* [10] 17-Sep-92 rajivk: implementing "edit and continue" support.
+* [11] 17-Nov-92 rajivk: Added CanProjChange() stuff.
+* [11] 12-Nov-92 w-peterh: added immediate/watch functions
+* [12] 21-Nov-92 rajivk : call User Defined Reset() when reseting a module
+* [13] 02-Dec-92 rajivk : Lock sheapmgr when the module is in runnable state
+* [14] 02-Dec-92 rajivk :DecompileToCompiledState()
+* [15] 08-Jan-93 RajivK: Support for Code Resource on Mac
+* [16] 08-Jan-93 RajivK: Fixed some undone(s)
+* [17] 18-Jan-93 w-peterh: implemented AddFuncDesc and AddVarDesc
+* [18] 26-Jan-93 w-peterh: added doc and help functions
+* [19] 02-Feb-93 w-peterh: added IndexOfFuncName
+* [20] 10-Feb-93 rajivk: added DefineFuncAsDllEntry() & AddressOfMember()
+* [21] 12-Feb-93 w-peterh: added RefTypeInfo, ImplTypeInfo, TypeDescAlias etc.
+* [22] 23-Feb-93 rajivk : add CreateInstance support
+* [23] 01-Mar-93 w-peterh: used new dispatch.h names
+* [24] 02-Mar-93 w-peterh: move m_guid to DYN_TYPEROOT check that enum size is ok
+* [25] 19-Mar-93 w-jeffc: added GetDocumentationOfFuncName
+* [26] 26-Mar-93 mikewo: move m_guid back to gtlibole's TYPE_ENTRY
+* [27] 30-Apr-93 w-jeffc: made DEFN data members private
+* [28] 07-Sep-93 w-jeffc: enabled TYPE_DATA compaction
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "macros.hxx"
+#include "typelib.hxx"
+#include <new.h>
+#include <stdlib.h>
+
+#define GEN_DTINFO_VTABLE // export GEN_DTINFO vtable
+#define DYN_TYPEROOT_VTABLE // export DYN_TYPEROOT vtable
+
+#include "string.h"
+#include "gdtinfo.hxx"
+#include "ctseg.hxx"
+#include "sheapmgr.hxx"
+#include "dtbind.hxx"
+#include "mem.hxx"
+#include "dfntcomp.hxx"
+#include "clutil.hxx"
+#include "exbind.hxx"
+
+
+
+#pragma hdrstop(RTPCHNAME)
+
+OLECHAR FAR * g_szGuidStdole = WIDE("{00020430-0000-0000-C000-000000000046}");
+
+// Define static class constants
+//
+CONSTDATA LPOLESTR GEN_DTINFO::szProtocolName = WIDE("*D\0");
+
+// Serialization format version numbers
+CONSTDATA BYTE DYN_TYPEROOT::bCurVersion = 5; // DO NOT CHANGE!
+
+CONSTDATA BYTE DYN_TYPEROOT::bFirstSerByte = LOBYTE('D' * 4 + 'T' * 2 + 'I');
+ // offsetof(Firstmemberafterlastserializedmember) -
+ // offsetof(firstserializedmember)
+CONSTDATA WORD DYN_TYPEROOT::cbSizeDir =
+ offsetof(DYN_TYPEROOT, m_unused1) + 3 * sizeof(USHORT) -
+ offsetof(DYN_TYPEROOT, m_lImpMgr);
+
+
+
+// typedefs for calling basic functions
+//
+typedef void (FAR PASCAL *CALL_SUB) (void);
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleGDTInfoCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleGDTInfoCxx
+#else
+static char szGDTInfoCxx[] = __FILE__;
+#define SZ_FILE_NAME szGDTInfoCxx
+#endif
+#endif //ID_DEBUG
+
+
+// Global useful functions...
+//
+// Works out if a given GEN_DTINFO is funky dispinterface,
+// i.e. a dispinterface defined in terms of an interface.
+//
+#define HREFTYPE_FUNKY_DISPATCH (HREFTYPE)0
+#define HREFTYPE_FUNKY_SIGNAL_DISPATCH (HREFTYPE)-2
+#define HREFTYPE_FUNKY_SIGNAL_PARTNER (HREFTYPE)-4
+
+TIPERROR IsFunkyDispinterface(GEN_DTINFO *pgdtinfo,
+ BOOL *pisFunkyDispinterface)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ DebAssert(pisFunkyDispinterface, "bad param.");
+ IfErrRet(pgdtinfo->Pdtroot()->GetDtmbrs(&pdtmbrs));
+
+ // Work out if we're a dispinterface defined in terms of an interface...
+ *pisFunkyDispinterface = (pgdtinfo->GetTypeKind() == TKIND_DISPATCH) &&
+ (pdtmbrs->Ptdata()->CBase() > 1);
+ return TIPERR_None;
+}
+
+
+// Helper function to munge an interface funcdesc into a dispinterface funcdesc
+void InterfaceFuncdescToDispatch(FUNCDESC * pfuncdesc)
+{
+ DebAssert(pfuncdesc->funckind != FUNC_DISPATCH,
+ "should have been set to something other than disp.");
+ pfuncdesc->funckind = FUNC_DISPATCH;
+
+ // If necessary, nuke the lcid & retval parms, and convert return value
+ WORD cParams;
+ ELEMDESC * pelemdesc;
+
+ cParams = pfuncdesc->cParams;
+ pelemdesc = pfuncdesc->lprgelemdescParam;
+ while (cParams > 0) {
+
+ // loop through the parameters, looking for the 'lcid' and 'retval' parms
+ // retval should be the last one, 'lcid' should be the last one before
+ // retval
+
+ cParams--;
+
+ if (pelemdesc->idldesc.wIDLFlags & IDLFLAG_FLCID) {
+ // nuke the LCID param if it was specified
+ ClearElemDesc(pelemdesc);
+ pfuncdesc->cParams -= 1; // pretend one less param
+
+ // If the next parameter is NOT a retval parameter, copy it down
+ // into the LCID parameter's spot and quit. We can do this
+ // without worrying about freeing any resources becuase the lcid
+ // parameter is always a simple type.
+ // This case will happen for a property put function with an LCID
+ // parameter.
+ //
+ if (cParams > 0
+ && !((pelemdesc + 1)->idldesc.wIDLFlags & IDLFLAG_FRETVAL)) {
+
+ DebAssert(cParams == 1, "Can only have 1 param after LCID");
+ *pelemdesc = *(pelemdesc + 1);
+ break;
+ }
+ }
+ else if (pelemdesc->idldesc.wIDLFlags & IDLFLAG_FRETVAL) {
+ TYPEDESC * ptdesc;
+ // handle the RETVAL param if it was specified
+ // first free the return value elemdesc
+ DebAssert(pfuncdesc->elemdescFunc.tdesc.vt == VT_HRESULT, "");
+ ClearElemDesc(&pfuncdesc->elemdescFunc);
+ pfuncdesc->cParams -= 1; // pretend one less param
+ // copy the retval param's type to the return value, removing one
+ // level of "VT_PTR" indirection.
+ pfuncdesc->elemdescFunc = *pelemdesc;
+ DebAssert(pfuncdesc->elemdescFunc.tdesc.vt == VT_PTR, "");
+ ptdesc = pfuncdesc->elemdescFunc.tdesc.lptdesc;
+ pfuncdesc->elemdescFunc.tdesc = *ptdesc;
+ MemFree(ptdesc); // free the old tdesc's memory
+
+ // the must be the last param, so we don't have to worry about
+ // copying params down
+ DebAssert(cParams == 0, "shouldn't be any parms left");
+ goto NoHresultCheck; // last parm -- we're done
+ }
+
+ pelemdesc += 1; // point to next param
+ }
+
+ // if we have a HRESULT-returning function with no 'retval' parm, then
+ // it should look like a SUB.
+ if (pfuncdesc->elemdescFunc.tdesc.vt == VT_HRESULT) {
+ pfuncdesc->elemdescFunc.tdesc.vt = VT_VOID; // pretend it's a SUB
+ }
+
+NoHresultCheck:
+ ;
+}
+
+
+
+// Gets a base typeinfo given an impltype ordinal.
+//
+HRESULT GetTypeInfoOfImplType(GEN_DTINFO *pgdtinfo,
+ UINT uImplType,
+ ITypeInfoA **pptinfo)
+{
+ HREFTYPE hreftype;
+ IMPMGR *pimpmgr;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ BOOL fGetInterface;
+ ITypeInfoA *ptinfoDisp = NULL;
+
+ TIPERROR err;
+
+ IfErrGo(pgdtinfo->Pdtroot()->GetDtmbrs(&pdtmbrs));
+ IfErrGo(pdtmbrs->Ptdata()->GetRefTypeOfImplType(uImplType, &hreftype));
+
+ fGetInterface = (BOOL)(hreftype & 0x00000001);
+ hreftype &= ~0x00000001;
+
+ IfErrGo(pgdtinfo->Pdtroot()->GetImpMgr(&pimpmgr));
+ IfErrGo(pimpmgr->GetTypeInfo(pgdtinfo->Pdtroot()
+ ->HimptypeOfHreftype(hreftype),
+ DEP_None,
+ pptinfo));
+
+ // Check to see if we should load the interface of the
+ // just gotten dual interface.
+ //
+ if (fGetInterface) {
+ TYPEATTR *ptypeattr;
+ TYPEKIND tkind;
+
+ ptinfoDisp = *pptinfo;
+
+ IfErrGo(TiperrOfHresult(ptinfoDisp->GetTypeAttr(&ptypeattr)));
+ tkind = ptypeattr->typekind;
+ DebAssert(ptypeattr->wTypeFlags & TYPEFLAG_FDUAL, "Not a dual");
+ ptinfoDisp->ReleaseTypeAttr(ptypeattr);
+
+ if (tkind == TKIND_DISPATCH) {
+ // Get the other interface.
+ IfErrGo(TiperrOfHresult(ptinfoDisp->GetRefTypeOfImplType((UINT)-1,
+ &hreftype)));
+ err = TiperrOfHresult(ptinfoDisp->GetRefTypeInfo(hreftype,
+ pptinfo));
+ }
+ else {
+ ptinfoDisp = NULL;
+ }
+ }
+
+Error:
+ RELEASE(ptinfoDisp);
+ return HresultOfTiperr(err);
+}
+
+
+
+// Determines if given interface is supported in V1.
+// I.e. it and its bases must recursively been created by typelib.dll
+
+HRESULT IsInterfaceSupported(ITypeInfoA *ptinfo,
+ BOOL *pisInterfaceSupported)
+{
+ GEN_DTINFO *pgdtinfo;
+ ITypeInfoA *ptinfoBase;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ HRESULT hresult;
+ TIPERROR err;
+
+ *pisInterfaceSupported = TRUE; // be optimistic
+ hresult = ptinfo->QueryInterface(IID_TYPELIB_GEN_DTINFO,
+ (LPVOID *)&pgdtinfo);
+ if (hresult != NOERROR) {
+ *pisInterfaceSupported = FALSE;
+ return NOERROR;
+ }
+
+ IfErrGo(pgdtinfo->Pdtroot()->GetDtmbrs(&pdtmbrs));
+
+ // do we have yet another base?
+ if (pdtmbrs->Ptdata()->CBase() > 0) {
+ // Now check if base interface is supported...
+ hresult = GetTypeInfoOfImplType(pgdtinfo, 0, &ptinfoBase);
+ pgdtinfo->Release();
+ if (hresult == NOERROR) {
+ hresult = IsInterfaceSupported(ptinfoBase, pisInterfaceSupported);
+ ptinfoBase->Release();
+ }
+ return hresult;
+ }
+ // fall through...
+
+Error:
+ pgdtinfo->Release();
+ return HresultOfTiperr(err);
+}
+
+
+ // Class methods
+//#if OE_MAC
+//class MY_GDTINFO : public GEN_DTINFO {};
+//MY_GDTINFO gendtinfo;
+//#endif
+
+
+/***
+*PROTECTED GEN_DTINFO::GEN_DTINFO()
+*
+*Purpose:
+*
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+GEN_DTINFO::GEN_DTINFO()
+{
+ m_pdtroot = NULL;
+ m_pvResetFunc = NULL;
+
+}
+#pragma code_seg( )
+
+
+/***
+*PROTECTED GEN_DTINFO::~GEN_DTINFO()
+*
+*Purpose:
+*
+*
+*Entry:
+* None.
+*
+*Exit:
+***********************************************************************/
+#pragma code_seg( CS_CORE )
+GEN_DTINFO::~GEN_DTINFO()
+{
+
+ delete m_pdtroot;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GEN_DTINFO::ReleasePublicResources()
+*
+*Purpose:
+* Releases any resources we don't want to keep around after
+* the public refcount goes to zero.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+***********************************************************************/
+
+VOID GEN_DTINFO::ReleasePublicResources()
+{
+#if OE_WIN32
+#if _X86_
+ if (!g_fWin32s)
+#endif // _X86_
+ {
+ if (Pdtroot()->m_htinfo != HTINFO_Nil) {
+ g_AppObjectTable.RemoveTypeInfo(Pdtroot()->m_htinfo);
+ Pdtroot()->m_htinfo = HTINFO_Nil;
+ }
+ }
+#if _X86_
+ else if (m_pdtroot->m_punk != NULL) {
+ m_pdtroot->m_punk->Release();
+ m_pdtroot->m_punk = NULL;
+ }
+#endif _X86_
+#else // !OE_WIN32
+ if (m_pdtroot->m_punk != NULL) {
+ m_pdtroot->m_punk->Release();
+ m_pdtroot->m_punk = NULL;
+ }
+#endif // !OE_WIN32
+}
+
+
+
+
+
+/***
+*PUBLIC GEN_DTINFO::Create
+*
+*Purpose:
+* Static function for creation of a GEN_DTINFO.
+*
+*Entry:
+* ppgdtinfo - set to point to produced GEN_DTINFO
+* accessModule - Indicates visibility of module wrt other projects (IN).
+* syskind (OLE) - syskind of the containing typelib
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GEN_DTINFO::Create(GEN_DTINFO **ppgdtinfo,
+ TYPEKIND tkind,
+ BOOL isBasic,
+ ACCESS accessModule
+ , SYSKIND syskind
+ )
+{
+ GEN_DTINFO *pgdtinfo;
+ DYN_TYPEROOT *pdtroot;
+ SHEAP_MGR *psheapmgr;
+ TIPERROR err;
+
+ pgdtinfo = MemNew(GEN_DTINFO);
+
+ if (pgdtinfo == NULL)
+ return(TIPERR_OutOfMemory);
+
+ ::new (pgdtinfo) GEN_DTINFO;
+
+ // Construct the DYN_TYPEROOT.
+ // Note that the reason that the Create method constructs the DYN_TYPEROOT
+ // instead of the Init method is because the Init method is called
+ // by classes that derive from GEN_DTINFO and they need to
+ // construct their own derivative of TYPEROOT.
+
+ err = SHEAP_MGR::Create((SHEAP_MGR **)&psheapmgr,
+ sizeof(SHEAP_MGR) + sizeof(DYN_TYPEROOT));
+
+ if (err != TIPERR_None) {
+ goto Error;
+ }
+
+ // Construct the dtroot immediately following the sheapmgr.
+ pdtroot = ::new (psheapmgr+1) DYN_TYPEROOT;
+
+ if (err = pdtroot->Init(pgdtinfo,
+ sizeof(DYN_TYPEROOT),
+ sizeof(COMPILETIME_SEG),
+ isBasic,
+ accessModule,
+ tkind
+ , syskind
+ )) {
+ delete pdtroot;
+ goto Error;
+ }
+
+ // initialize the datamember
+ pgdtinfo->m_pdtroot = pdtroot;
+
+ *ppgdtinfo = pgdtinfo;
+ return TIPERR_None;
+
+Error:
+ pgdtinfo->GEN_DTINFO::~GEN_DTINFO();
+ MemFree(pgdtinfo);
+ return err;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::RemoveInternalRefs()
+*Purpose:
+* Remove internal references from a module to other modules in
+* the same project. This is called before destructor is called.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+***********************************************************************/
+
+#pragma code_seg( CS_CORE )
+VOID GEN_DTINFO::RemoveInternalRefs()
+{
+ IMPMGR *pimpmgr;
+
+ // If this fails, assume there is nothing to remove.
+ if (!m_pdtroot->GetImpMgr( &pimpmgr )) {
+ pimpmgr->RemoveInternalRefs();
+ }
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC GEN_DTINFO::QueryInterface
+*Purpose:
+* Implementation of QueryInterface method. Supports casting to GEN_DTINFO.
+*
+*Entry:
+* riid - Interface GUID
+* ppvObj - LPVOID * that receives the requested protocol.
+*
+*Exit:
+* Return NOERROR or ReportResult(0, E_NOINTERFACE, 0, 0)
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HRESULT GEN_DTINFO::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
+{
+ if (IIDEQ(riid, IID_TYPELIB_GEN_DTINFO)) {
+ *ppvObj = (LPVOID) (GEN_DTINFO *) this;
+ AddRef();
+ return NOERROR;
+ }
+ return this->STL_TYPEINFO::QueryInterface(riid, ppvObj);
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GEN_DTINFO::GetDynTypeMembers - return DynTypeMembers of the Type
+*Purpose:
+* Retrieve the DYN_TYPEMEMBERS of the TYPEINFO
+*
+*Implementation Notes:
+* Defers to GetDtmbrs() which does NOT add a ref, hence
+* explicitly adds a reference. Clients must eventually release.
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns DynTypeMembers instance or Null if one can not be produced
+*
+***********************************************************************/
+
+TIPERROR GEN_DTINFO::GetDynTypeMembers(DYN_TYPEMEMBERS **ppdtmbrs)
+{
+ TIPERROR err;
+
+ IfErrRet(m_pdtroot->GetDtmbrs(ppdtmbrs));
+
+ // Add reference
+ m_pdtroot->AddRefDtmbrs();
+
+ // Invalidate
+ // ilanc: 19-Nov-92: No need to decompile anymore -- since
+ // we're replacing the typemembers interface and implementation
+ // we cross our fingers and hope that no client of GetTypeMembers
+ // will attempt to edit the class definition... that is
+ // if its state isn't undeclared.
+ //
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetDefnTypeBind - return DefnTypeBind of the Type
+*Purpose:
+* TYPEMEMBERS must be laid out, if not, will attempt to layout.
+* NOTE: bumps refcount -- by deferring to
+* DYN_TYPEMEMBES::GetDefnTypeBind) -- hence client must Release().
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns TypeBind instance or Null if one can not be produced
+*
+***********************************************************************/
+
+TIPERROR GEN_DTINFO::GetDefnTypeBind(DEFN_TYPEBIND **ppdfntbind)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err = TIPERR_None;
+
+ IfErrRet( EnsureInDeclaredState() );
+
+ IfErrRet(m_pdtroot->GetDtmbrs(&pdtmbrs));
+
+ DebAssert(pdtmbrs != NULL, "whoops! null dtmbrs.");
+
+ return pdtmbrs->GetDefnTypeBind(ppdfntbind);
+
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::CreateInstance - return new instance of class
+*
+*Purpose: It returns a pointer to the active object for predeclared ID and
+* if the FAPPOBJECT flag is set. Otherwise call CoCreateInstance()
+* to get a pointer to the object.
+*
+*Entry:
+* iid : Guid of the object
+*
+*Exit:
+* lplpObj : Pointer to the object whose GUID is passed int.
+* HRESULT : if an error is returned then lplpObj is not modified.
+*
+***********************************************************************/
+
+
+// The Ole version of CreateInstance
+HRESULT GEN_DTINFO::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ LPLPVOID lplpObj)
+{
+ GUID guid;
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+ if (lplpObj == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ *lplpObj = NULL;
+
+ // Create Instance can only be called for CoClasses
+ if(GetTypeKind() != TKIND_COCLASS)
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+
+ // UNDONE: Bug #4849. I am certain that the following check is wrong
+ // for at least the CoCreateInstance class below -bradlo.
+
+ // we require that punkOuter be NULL in this version?
+ if (punkOuter != NULL)
+ return HresultOfScode(CLASS_E_NOAGGREGATION);
+
+ // Can't create instances if type hasn't been laid yet...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ PgtlibOleContaining()->GetTypeGuid(GetIndex(), &guid);
+
+ // for predeclared Id we return the Active Object if there is one
+ if ((lplpObj == (LPLPVOID) &(m_pdtroot->m_punk)) &&
+ (m_pdtroot->m_uTypeFlags & TYPEFLAG_FAPPOBJECT)) {
+
+ hresult = GetActiveObject(guid, NULL, &punk);
+
+ // if the above call to GetActiveObject succeeded then return
+ // else fall through and try CoCreateInstance.
+ if (hresult == NOERROR) {
+ hresult = punk->QueryInterface(riid, lplpObj);
+ // if the QueryInterface fails for some reason we still want to
+ // release the object returned by GetActiveObject then return
+ // the error to the caller
+ punk->Release();
+ return hresult;
+ }
+ }
+
+ // create an instance of the object specified by guid
+ hresult = CoCreateInstance(guid,
+ NULL,
+ CLSCTX_SERVER,
+ riid,
+ lplpObj);
+ return hresult;
+}
+
+
+
+/***
+*PUBLIC GEN_DTINFO::GetMemberName
+* Not implemented.
+*
+*Purpose:
+* Returns name of a specified member
+*
+*Entry:
+* hmember - handle of the member whose name is to be returned
+* plstrName - returns lstr containing name
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GEN_DTINFO::GetMemberName(HMEMBER hmember, BSTRA *plstrName)
+{
+ DebAssert(0, "GetMemberName -- not implemented");
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::CommitChanges
+* This function commits all the changes made in the module.
+*
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+TIPERROR GEN_DTINFO::CommitChanges()
+{
+return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SzTypeIdOfTypeInfo
+*Purpose:
+* Returns the TypeId of the TypeInfo instance
+*Entry:
+* None.
+*Exit:
+* TypeId of the TypeInfo instance
+***********************************************************************/
+
+LPOLESTR GEN_DTINFO::SzTypeIdofTypeInfo()
+{
+ return szProtocolName;
+}
+
+
+
+/***
+*PUBLIC GEN_DTINFO::Reset - Reset the global runtime state of this TYPEINFO.
+*Purpose:
+* This method resets the global runtime state of this GEN_DTINFO.
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR
+***********************************************************************/
+
+#pragma code_seg( CS_CORE )
+TIPERROR GEN_DTINFO::ResetPrePass()
+{
+ TIPERROR err = TIPERR_None;
+ return TIPERR_None;
+}
+
+
+
+
+/***
+*PUBLIC GEN_DTINFO::Reset - Reset the global runtime state of this TYPEINFO.
+*Purpose:
+* This method resets the global runtime state of this GEN_DTINFO.
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR
+***********************************************************************/
+
+#pragma code_seg( CS_CORE )
+TIPERROR GEN_DTINFO::Reset()
+{
+ TIPERROR err = TIPERR_None;
+
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+
+
+
+
+
+
+
+
+
+/***
+*GEN_DTINFO::MakeDual
+*Purpose:
+* Creates a dual typeinfo out of the current typeinfo.
+*
+*Entry:
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GEN_DTINFO::MakeDual()
+{
+ GEN_DTINFO *pgdtinfoNew, *pgdtinfoInterface, *pgdtinfoDispatch;
+ UINT cRefsThis, cRefsNew;
+
+ TIPERROR err;
+
+ DebAssert(PgdtinfoPartner() == NULL, "Already have a partner.");
+
+ // Create the new partner typeinfo.
+ IfErrRet(Create(&pgdtinfoNew,
+ GetTypeKind() == TKIND_INTERFACE
+ ? TKIND_DISPATCH
+ : TKIND_INTERFACE,
+ FALSE, // !Basic
+ ACCESS_Public,
+ PgtlibOleContaining()->GetSyskind()));
+
+ // Determine which typeinfo is which.
+ pgdtinfoInterface = GetTypeKind() == TKIND_INTERFACE
+ ? this
+ : pgdtinfoNew;
+
+ pgdtinfoDispatch = GetTypeKind() == TKIND_DISPATCH
+ ? this
+ : pgdtinfoNew;
+
+ // Copy the attributes from us to the new typeinfo.
+ pgdtinfoNew->SetContainingTypeLib(PgtlibOleContaining());
+ pgdtinfoNew->SetHTEntry(GetIndex());
+
+ pgdtinfoNew->Pdtroot()->m_uTypeFlags = Pdtroot()->m_uTypeFlags
+ & (TYPEFLAG_FHIDDEN
+ | TYPEFLAG_FDUAL
+ | TYPEFLAG_FNONEXTENSIBLE);
+
+ pgdtinfoNew->Pdtroot()->m_wMajorVerNum = Pdtroot()->m_wMajorVerNum;
+ pgdtinfoNew->Pdtroot()->m_wMinorVerNum = Pdtroot()->m_wMinorVerNum;
+
+#if ID_DEBUG
+ // Copy the debug string info.
+ strcpy(pgdtinfoNew->m_szDebName, m_szDebName);
+#endif // ID_DEBUG
+
+ // Link them together.
+ SetPstltiPartner(pgdtinfoNew);
+ pgdtinfoNew->SetPstltiPartner(this);
+
+ // Sync their refcounts. We can do this because we are a
+ // friend of STL_TYPEINFO.
+ //
+ cRefsThis = (UINT)m_cRefs + (UINT)m_cInternalRefs;
+ cRefsNew = (UINT)pgdtinfoNew->m_cRefs + (UINT)pgdtinfoNew->m_cInternalRefs;
+
+ for (; cRefsThis > 0; cRefsThis--) {
+ AddPartnerRef();
+ }
+ for (; cRefsNew > 0; cRefsNew--) {
+ pgdtinfoNew->AddPartnerRef();
+ }
+
+ // If we're the interface, then we must change the ptinfo stored
+ // in the type_entry for the typeinfo to point to the
+ // dispinterface.
+ //
+ if (GetTypeKind() == TKIND_INTERFACE) {
+ TYPE_ENTRY *qte;
+
+ // If we're currently laid out, we must lay out the new
+ // typeinfo we just created.
+ //
+ if (Pdtroot()->CompState() > CS_UNDECLARED) {
+ IfErrGoTo(TiperrOfHresult(pgdtinfoNew->LayOut()), Error2);
+ }
+
+ // Update the information in the type entry.
+ qte = PgtlibOleContaining()->Qte(GetIndex());
+
+ qte->m_ste.m_typekind = TKIND_DISPATCH;
+ qte->m_pstltinfo = pgdtinfoDispatch;
+ }
+
+ SetIsDual(TRUE);
+ pgdtinfoNew->SetIsDual(TRUE);
+
+ goto Error;
+
+Error2:
+ SetPstltiPartner(NULL);
+
+Error:
+ RELEASE(pgdtinfoNew);
+
+ return err;
+}
+
+
+/***
+*DYN_TYPEROOT::MakeHimptypeLevels
+*Purpose:
+* Make sure LHrefOffset is set.
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEROOT::MakeHimptypeLevels()
+{
+ ITypeInfo *ptinfo;
+ GEN_DTINFO *pgdtinfoBase;
+ IMPMGR *pimpmgr;
+ BOOL fGetInterface = FALSE;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TYPE_DATA *ptdata;
+
+ TIPERROR err;
+
+ // We don't need to do anything if:
+ // - we've read or already calculated the offset
+ // - we're not a TKIND_INTERFACE
+ // - we're not laid out yet.
+ //
+ if (FUseHrefOffset()
+ || Pgdtinfo()->GetTypeKind() != TKIND_INTERFACE
+ || CompState() == CS_UNDECLARED) {
+
+ return TIPERR_None;
+ }
+
+ IfErrRet(GetDtmbrs(&pdtmbrs));
+ ptdata = pdtmbrs->Ptdata();
+
+ // Make sure our impmgr/dependencies are read.
+
+ // If we don't have a base class, set the offset to zero.
+ if (ptdata->CBase() == 0) {
+ SetLHrefOffset(0);
+ return TIPERR_None;
+ }
+
+ // Get our base class.
+ IfErrRet(ptdata->GetTypeInfoOfHvdefn(ptdata->HvdefnFirstBase(),
+ &ptinfo,
+ NULL));
+
+ if (ptinfo->QueryInterface(IID_TYPELIB_GEN_DTINFO,(LPVOID *)&pgdtinfoBase)
+ != NOERROR) {
+
+ ptinfo->Release();
+ return TIPERR_NotYetImplemented; // CONSIDER: better error?
+ }
+
+ // Make sure the base class has its HimptypeLevels set.
+ IfErrGo(pgdtinfoBase->Pdtroot()->MakeHimptypeLevels());
+ IfErrGo(pgdtinfoBase->Pdtroot()->GetImpMgr(&pimpmgr));
+
+ DebAssert(pgdtinfoBase->Pdtroot()->FUseHrefOffset(), "Must be set");
+
+ // Calculate the offset.
+ SetLHrefOffset(pgdtinfoBase->Pdtroot()->LHrefOffset()
+ + pimpmgr->GetImpTypeSize());
+
+Error:
+ pgdtinfoBase->Release();
+ ptinfo->Release();
+
+ return err;
+}
+
+
+#if ID_DEBUG
+
+/***
+*PUBLIC GEN_DTINFO::DebCheckState
+*Purpose:
+* Check internal state of GEN_DTINFO and its parts.
+* Delegates to DYN_TYPEROOT::DebCheckState
+*
+*Entry:
+* uLevel
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+VOID GEN_DTINFO::DebCheckState(UINT uLevel) const
+{
+ m_pdtroot->DebCheckState(uLevel);
+}
+
+
+
+
+#endif //ID_DEBUG
+
+//CONSIDER: The following new and delete operations can be used if a
+//CONSIDER: GEN_DTINFO instance is to be a member of a DYN_TYPEROOT,
+//CONSIDER: i.e. if for locality of reference the GEN_DTINFO resides
+//CONSIDER: in the DYN_TYPEROOT segment.
+//***
+//*PUBLIC GEN_DTINFO::operator new - allocates space for a GEN_DTINFO
+//*Purpose:
+//*
+//*Implementation Notes:
+//* Allocate a SHEAP_MGR segment and return a pointer to immediately
+//* following the sheap_mgr instance so the GEN_DTINFO
+//* will be constructed there
+//*
+//*Entry:
+//* size - always sizeof(GEN_DTINFO)
+//*
+//*Exit:
+//* None.
+//***********************************************************************/
+//
+//VOID *GEN_DTINFO::operator new(size_t size)
+//{
+// SHEAP_MGR *psheap_mgr = new SHEAP_MGR;
+//
+// DebAssert(psheap_mgr != 0, "Couldn't allocate sheap_mgr");
+// psheap_mgr->Init(sizeof(DYN_TYPEROOT));
+// return(psheap_mgr+1);
+//}
+//
+//
+///***
+//*PUBLIC GEN_DTINFO::operator delete - releases memory of GEN_DTINFO
+//*Purpose:
+//*
+//*Implementation Notes:
+//* Deletes the SHEAP_MGR segment
+//*
+//*Entry:
+//* pv - Pointer to where the GEN_DTINFO instance used to
+//* be within its SHEAP_MGR segment.
+//*
+//*Exit:
+//* None.
+//***********************************************************************/
+//
+//VOID GEN_DTINFO::operator delete(VOID *pv)
+//{
+// SHEAP_MGR *psheapmgr = (SHEAP_MGR *)pv;
+//
+// delete (SHEAP_MGR *)OOB_MAKEP(OOB_SELECTOROF(pv),0);
+//}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetTypeAttr()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::GetTypeAttr(TYPEATTR FAR* FAR*pptypeattr)
+{
+ TYPEATTR *ptypeattr;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TYPE_DATA *ptdata;
+ DYN_TYPEBIND *pdtbind;
+
+ USHORT cbSizeVft = 0;
+
+ TIPERROR err = TIPERR_None;
+ HRESULT hresult;
+
+ if (pptypeattr == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+
+ if (m_pdtroot->m_ptypeattrCache == NULL) {
+
+ // Can't get attributes unless been laid...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ // use one allocation to get both ptypeattrCache and ptypeattrOut
+ ptypeattr = (TYPEATTR FAR*)MemZalloc(2*sizeof(TYPEATTR));
+ if (!ptypeattr) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ // no need to zero these ase they are already zero from the MemZalloc
+ // idldesc
+ //ptypeattr->idldescType.wIDLFlags = 0;
+ //ptypeattr->idldescType.bstrIDLInfo = NULL;
+
+ //ptypeattr->lpstrSchema = NULL; // not used
+
+ ptypeattr->typekind = GetTypeKind();
+ ptypeattr->wTypeFlags = m_pdtroot->GetTypeFlags();
+
+ ptypeattr->wMajorVerNum = m_pdtroot->m_wMajorVerNum;
+ ptypeattr->wMinorVerNum = m_pdtroot->m_wMinorVerNum;
+
+ IfErrGo(GetLcid(&(ptypeattr->lcid)));
+ IfErrGo(m_pdtroot->GetDtmbrs(&pdtmbrs));
+
+ ptdata = pdtmbrs->Ptdata();
+
+ // Work out if we're a dispinterface defined in terms of an interface...
+ BOOL isFunkyDispinterface; // for the lack of a better name...
+ ITypeInfoA FAR* ptinfoBase;
+ TYPEATTR *ptypeattrBase;
+
+ IfErrGo(IsFunkyDispinterface(this, &isFunkyDispinterface));
+ if (isFunkyDispinterface) {
+ // HACK: Get the 2nd base class's vft size, and conclude that the
+ // func count in the "derived" dispinterface is just the
+ // the number of funcs in the interface's vft.
+ // The "right" way to do this is to recurse on the 2nd impltype.
+ // NOTE: we can't call GetImplTypeOfRefType for the 2nd base
+ // of a funky dispinterface because it will deny all knowledge
+ // of having one! So we delve into the gory internals...
+ //
+ // pseudo-base
+ //
+ IfOleErrGoTo(GetTypeInfoOfImplType(this, 1, &ptinfoBase),
+ Error1);
+ hresult = ptinfoBase->GetTypeAttr(&ptypeattrBase);
+ if (hresult != NOERROR) {
+ ptinfoBase->Release();
+ goto Error1;
+ }
+
+ ptypeattr->cFuncs = ptypeattrBase->cbSizeVft / sizeof(VOID *);
+
+ ptypeattr->cVars = 0; // can't have datamembers
+ ptypeattr->cImplTypes = 1; // only one true base: IDispatch
+ ptinfoBase->ReleaseTypeAttr(ptypeattrBase);
+ ptinfoBase->Release();
+ }
+ else
+ {
+ ptypeattr->cFuncs = ptdata->CAvailMeth();
+ ptypeattr->cVars = ptdata->CDataMember();
+ ptypeattr->cImplTypes = ptdata->CBase();
+ }
+
+ PgtlibOleContaining()->GetTypeGuid(GetIndex(), &ptypeattr->guid);
+
+ pdtbind = pdtmbrs->Pdtbind();
+
+ ptypeattr->cbAlignment = pdtbind->GetAlignment();
+ ptypeattr->cbSizeInstance = pdtbind->GetCbSize();
+ ptypeattr->cbSizeVft = pdtbind->GetCbSizeVft();
+
+ ptypeattr->memidConstructor = MEMBERID_NIL;
+ ptypeattr->memidDestructor = MEMBERID_NIL;
+
+ InitTypeDesc(&(ptypeattr->tdescAlias));
+
+ m_pdtroot->m_ptypeattrCache = ptypeattr;
+ m_pdtroot->m_ptypeattrOut = ptypeattr+1; // both typeattrs are allocated at once
+ m_pdtroot->m_ftypeattrOutUsed = FALSE;
+
+ } else {
+ ptdata = NULL; // in case we're an alias
+ } //if
+
+ if (m_pdtroot->m_ftypeattrOutUsed) {
+ // ptypeattrOut has been given out, so allocate memory to make a copy
+ // of the cached type attr
+ ptypeattr = (TYPEATTR FAR*)MemZalloc(sizeof(TYPEATTR));
+ if (!ptypeattr) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ } else {
+ // use the pre-allocated ptypeattr pointer
+ ptypeattr = m_pdtroot->m_ptypeattrOut;
+ m_pdtroot->m_ftypeattrOutUsed = TRUE;
+ }
+
+ // copy
+ memcpy(ptypeattr, m_pdtroot->m_ptypeattrCache, sizeof(TYPEATTR));
+
+
+ if (GetTypeKind() == TKIND_ALIAS) {
+ if (ptdata == NULL) {
+ // if we're getting it from the cached typeattr, must set up this stuff
+ IfErrGo(m_pdtroot->GetDtmbrs(&pdtmbrs));
+ ptdata = pdtmbrs->Ptdata();
+ }
+ // get the type desc from the type data
+ IfErrGo(ptdata->AllocTypeDescOfTypeDefn(ptdata->HtdefnAlias(),
+ ptdata->IsSimpleTypeAlias(),
+ &(ptypeattr->tdescAlias)));
+ }
+
+ *pptypeattr = ptypeattr;
+ return NOERROR;
+
+Error:
+ hresult = HresultOfTiperr(err);
+ // fall through...
+Error1:
+ ReleaseTypeAttr(ptypeattr); // can pass in NULL.
+ return hresult;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::ReleaseFuncDesc(FUNCDESC FAR*pFuncDesc)
+*Purpose: Free this data structure and anything it points to
+* directly or indirectly
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+VOID GEN_DTINFO::ReleaseFuncDesc(FUNCDESC FAR*pFuncDesc)
+{
+ FreeFuncDesc(pFuncDesc);
+}
+
+/***
+*PUBLIC GEN_DTINFO::ReleaseVarDesc(VARDESC FAR*pVarDesc)
+*Purpose: Free this data structure and anything it points to
+* directly or indirectly
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+VOID GEN_DTINFO::ReleaseVarDesc(VARDESCA FAR*pVarDesc)
+{
+ FreeVarDesc(pVarDesc);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::ReleaseTypeAttr(TYPEATTR FAR*ptypeattr)
+*Purpose: Free this data structure and anything it points to
+* directly or indirectly
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+VOID GEN_DTINFO::ReleaseTypeAttr(TYPEATTR FAR*ptypeattr)
+{
+ if (ptypeattr != NULL) {
+ ClearTypeDesc(&(ptypeattr->tdescAlias));
+ if (ptypeattr == m_pdtroot->m_ptypeattrOut) {
+ DebAssert(m_pdtroot->m_ftypeattrOutUsed, "Cached typeattr released twice");
+ m_pdtroot->m_ftypeattrOutUsed = FALSE;
+ } else
+ MemFree(ptypeattr);
+ }
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetTypeComp(ITypeCompA FAR* FAR*)
+*Purpose:
+*
+*Entry:
+* pptcomp OUT
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::GetTypeComp(ITypeCompA FAR* FAR* pptcomp)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ DYN_TYPEBIND *pdtbind;
+ CDefnTypeComp *pdfntcomp;
+ TIPERROR err = TIPERR_None;
+
+ if (pptcomp == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ // Can't get an ITypeCompA if type hasn't been laid yet...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ IfErrGo(m_pdtroot->GetDtmbrs(&pdtmbrs));
+
+ DebAssert(pdtmbrs != NULL, "whoops! null dtmbrs.");
+
+ // Note no need to bump refcount here since the CDefnTypeComp
+ // instance that we create will do so.
+ //
+ pdtbind = pdtmbrs->Pdtbind();
+
+ // Create a CDefnTypeComp to return to the user who must
+ // must release it eventually...
+ //
+ IfErrGo(CDefnTypeComp::Create(&pdfntcomp, pdtbind));
+ *pptcomp = pdfntcomp;
+
+Error:
+ return HresultOfTiperr(err);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetNames()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::GetNames(MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ UINT cNameMax,
+ UINT FAR* lpcName)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+ ITypeInfoA FAR* ptinfo;
+ HRESULT hresult;
+
+ if (rgbstrNames == NULL || lpcName == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ // Can't get attributes if type hasn't been laid yet...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ // only works with things that can have members
+ if (GetTypeKind() == TKIND_ALIAS) {
+ err = TIPERR_BadModuleKind;
+ }
+ else {
+ BOOL isFunkyDispinterface;
+ IfErrGo(IsFunkyDispinterface(this, &isFunkyDispinterface));
+ if (isFunkyDispinterface) {
+ GEN_DTINFO *pgdtinfo;
+ USHORT cNamCount;
+
+ //CONSIDER: share code with code below
+ IfOleErrRet(GetTypeInfoOfImplType(this, 1, &ptinfo)); // pseudo-base
+ hresult = ptinfo->GetNames(memid, rgbstrNames, cNameMax, lpcName);
+
+ // Determine if the funcdesc for this memid has a retval parameter.
+ if (hresult == NOERROR) {
+ hresult = ptinfo->QueryInterface(IID_TYPELIB_GEN_DTINFO, (VOID **)&pgdtinfo);
+ DebAssert(hresult == NOERROR, "Must be typeinfo GDTINFO!");
+
+ // If we have a retval/lcid, remove the last names.
+ if (pgdtinfo->Pdtroot()->IsIdMungable(memid, &cNamCount)
+ && cNameMax >= cNamCount) {
+
+ for (;*lpcName > cNamCount;) {
+ *lpcName -= 1;
+ FreeBstr(rgbstrNames[*lpcName]);
+ rgbstrNames[*lpcName] = NULL;
+ }
+ }
+
+ pgdtinfo->Release();
+ }
+
+ ptinfo->Release();
+ return hresult;
+ }
+ err = pdtmbrs->Ptdata()->GetNames(memid, rgbstrNames, cNameMax, lpcName);
+ if (err == TIPERR_ElementNotFound && pdtmbrs->Ptdata()->CBase() > 0) {
+ // if not found locally, try recursing on base class, if any
+ // Note we only recurse on the FIRST base class (except for COCLASS's).
+ //
+
+ UINT index = 0;
+ INT impltypeflags;
+ if (GetTypeKind() == TKIND_COCLASS) {
+ for (;;index++) {
+ IfOleErrRet(GetImplTypeFlags(index, &impltypeflags))
+ // if no 'default' base interface, this will return
+ // TIPERR_ElementNotFound (mapped to a HRESULT), which is exactly
+ // what we want.
+ if (impltypeflags == IMPLTYPEFLAG_FDEFAULT) {
+ break; // found it
+ }
+ }
+ }
+
+ IfOleErrRet(GetTypeInfoOfImplType(this, index, &ptinfo));
+ hresult = ptinfo->GetNames(memid, rgbstrNames, cNameMax, lpcName);
+ ptinfo->Release();
+ return hresult;
+ }
+ }
+
+Error:
+ return HresultOfTiperr(err);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetRefTypeInfoOfImplType(UINT, HREFTYPE FAR*)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+HRESULT GEN_DTINFO::GetRefTypeOfImplType(UINT index,
+ HREFTYPE FAR* phreftype)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ if (phreftype == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+
+ // Can't get base list if construct member lists hasn't run
+ if (m_pdtroot->CompState() < CS_SEMIDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+
+ // Can't get at our partner unless we're flagged as a
+ // dual interface and the passed in index is -1.
+ //
+ if (Pdtroot()->GetTypeFlags() & TYPEFLAG_FDUAL
+ && index == (UINT)-1) {
+
+ DebAssert(PgdtinfoPartner() != NULL, "Bad dual");
+
+ *phreftype = HREFTYPE_FUNKY_SIGNAL_PARTNER;
+
+ return NOERROR;
+ }
+
+ // only works for classes
+ switch (GetTypeKind()) {
+ case TKIND_DISPATCH:
+ BOOL isFunkyDispinterface;
+ IfErrGo(IsFunkyDispinterface(this, &isFunkyDispinterface));
+ if (isFunkyDispinterface) {
+ if (index > 0) {
+ err = TIPERR_ElementNotFound;
+ goto Error;
+ }
+
+ // If we're trying to get the first base class of the
+ // funky dispinterface, return HREFTYPE_FUNKY_SIGNAL.
+ //
+#if ID_DEBUG
+ err = pdtmbrs->Ptdata()->GetRefTypeOfImplType(index, phreftype);
+
+ // Parallel code in GetRefTypeInfo assumes it can convert
+ // HREFTYPE_FUNKY_SIGNAL_DISPATCH to HREFTYPE_FUNKY_DISPATCH.
+ //
+ DebAssert (err != TIPERR_None || *phreftype == HREFTYPE_FUNKY_DISPATCH,
+ "IDispatch must be first");
+#endif //ID_DEBUG
+
+ *phreftype = HREFTYPE_FUNKY_SIGNAL_DISPATCH; // signal funky dispinterface
+
+ break;
+ } // isFunkyDispinterface
+
+ // fall through...
+
+ case TKIND_COCLASS :
+
+ case TKIND_INTERFACE :
+ err = pdtmbrs->Ptdata()->GetRefTypeOfImplType(index, phreftype);
+ break;
+ default :
+ err = TIPERR_BadModuleKind;
+ break;
+ } // switch
+
+Error:
+ return HresultOfTiperr(err);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetImplTypeFlags(UINT, INT FAR*)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+HRESULT GEN_DTINFO::GetImplTypeFlags(UINT index,
+ INT FAR* pimpltypeflags)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ if (pimpltypeflags == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ err = pdtmbrs->Ptdata()->GetImplTypeFlags(index, pimpltypeflags);
+
+ return HresultOfTiperr(err);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetDocumentation(ID, BSTR FAR*, BSTR FAR*, DWORD FAR*, BSTR FAR *)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+HRESULT GEN_DTINFO::GetDocumentation(MEMBERID memid,
+ BSTR FAR*lpbstrName,
+ BSTR FAR*lpbstrDocString,
+ DWORD FAR*lpdwHelpContext,
+ BSTR FAR *lpbstrHelpFile)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ HRESULT hresult;
+ TIPERROR err;
+ ITypeInfoA FAR* ptinfo;
+
+ if (memid == MEMBERID_NIL) {
+ // get module documentation from typelib
+ return PgtlibOleContaining()->GetDocumentation(
+ GetIndex(),
+ lpbstrName,
+ lpbstrDocString,
+ lpdwHelpContext,
+ lpbstrHelpFile);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ BOOL isFunkyDispinterface;
+ IfOleErrRet(HresultOfTiperr(IsFunkyDispinterface(
+ this,
+ &isFunkyDispinterface)));
+ if (isFunkyDispinterface) {
+ //CONSIDER: share code with code below
+ IfOleErrRet(GetTypeInfoOfImplType(
+ this,
+ 1,
+ &ptinfo)); // pseudo-base
+ hresult = ptinfo->GetDocumentation(memid,
+ lpbstrName,
+ lpbstrDocString,
+ lpdwHelpContext,
+ lpbstrHelpFile);
+ ptinfo->Release();
+ return hresult;
+ }
+ err = pdtmbrs->Ptdata()->GetDocumentation(memid,
+ lpbstrName,
+ lpbstrDocString,
+ lpdwHelpContext);
+ if (err == TIPERR_ElementNotFound && pdtmbrs->Ptdata()->CBase() > 0) {
+ // if not found locally, try recursing on base class, if any
+ // Note we only recurse on FIRST base class (except for COCLASS's)
+ //
+ UINT index = 0;
+ INT impltypeflags;
+ if (GetTypeKind() == TKIND_COCLASS) {
+ for (;;index++) {
+ IfOleErrRet(GetImplTypeFlags(index, &impltypeflags))
+ // if no 'default' base interface, this will return
+ // TIPERR_ElementNotFound (mapped to a HRESULT), which is exactly
+ // what we want.
+ if (impltypeflags == IMPLTYPEFLAG_FDEFAULT) {
+ break; // found it
+ }
+ }
+ }
+
+ IfOleErrRet(GetTypeInfoOfImplType(this, index, &ptinfo));
+ hresult = ptinfo->GetDocumentation(memid,
+ lpbstrName,
+ lpbstrDocString,
+ lpdwHelpContext,
+ lpbstrHelpFile);
+ ptinfo->Release();
+ return hresult;
+ }
+
+ if (err != TIPERR_None)
+ return HresultOfTiperr(err);
+
+ // get help file from typelib, if requested
+
+ // Though we could do without the following check, I've added it as a
+ // speed optimization, as the Layout code calls this function.
+ if (lpbstrHelpFile == NULL) {
+ return NOERROR;
+ }
+
+ hresult = PgtlibOleContaining()->GetDocumentation(-1,
+ NULL,
+ NULL,
+ NULL,
+ lpbstrHelpFile);
+ if (hresult != NOERROR) {
+ // free any alloced strings
+ if (lpbstrName) {
+ SysFreeString(*lpbstrName);
+ *lpbstrName = NULL;
+ }
+ if (lpbstrDocString) {
+ SysFreeString(*lpbstrDocString);
+ *lpbstrDocString = NULL;
+ }
+ }
+
+ return hresult;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GEN_DTINFO::GetRefTypeInfo(UINT, ITypeInfoA FAR* FAR*)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::GetRefTypeInfo(HREFTYPE hreftype,
+ ITypeInfoA FAR* FAR* pptinfo)
+{
+ IMPMGR *pimpmgr;
+ TIPERROR err = TIPERR_None;
+
+ // CONSIDER: (dougf) how to validate hreftype?
+ if (pptinfo == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ BOOL isFunkyDispinterface;
+ ITypeInfoA FAR* ptinfoBase, *ptinfoDisp = NULL;
+ HRESULT hresult;
+ GEN_DTINFO *pgdtinfoBase = NULL;
+ BOOL fGetInterface;
+
+ // If the low bit of the hreftype is set, we want to get this
+ // type's interface (assuming its a dual).
+ //
+ fGetInterface = (BOOL)(hreftype & 0x00000001);
+ hreftype &= ~0x00000001;
+
+ if (hreftype == HREFTYPE_FUNKY_SIGNAL_PARTNER) {
+ // They want our partner...so give it to them.
+ DebAssert(PgdtinfoPartner() != NULL, "Not a dual");
+
+ *pptinfo = PgdtinfoPartner();
+ (*pptinfo)->AddRef();
+
+ goto Error;
+ }
+
+ IfErrGo(IsFunkyDispinterface(this, &isFunkyDispinterface));
+ if (isFunkyDispinterface) {
+ // defer to pseudo-base UNLESS this hreftype came from
+ // GetRefTypeInfoOfImplType where the hreftype for the base of a
+ // Funky dispinterface is being returned. In that case, we've got a
+ // special value HREFTYPE_FUNKY_SIGNAL, which means that we're just
+ // supposed to return the typeinfo for the first base (HREFTYPE_FUNKY).
+
+ if (hreftype == HREFTYPE_FUNKY_SIGNAL_DISPATCH) {
+ hreftype = HREFTYPE_FUNKY_DISPATCH;
+ }
+ else {
+ // get the first interface in the inheritance heirarchy
+ IfOleErrRet(GetTypeInfoOfImplType(this, 1, &ptinfoBase));
+
+ // Must ensure this is one of "our" typeinfo's in order to do the cast
+ hresult = ptinfoBase->QueryInterface(IID_TYPELIB_GEN_DTINFO,
+ (LPVOID *)&pgdtinfoBase);
+ ptinfoBase->Release();
+ if (hresult != NOERROR) {
+ return HresultOfScode(E_NOTIMPL); // CONSIDER: better error?
+ }
+
+ while (!pgdtinfoBase->Pdtroot()->FUseHrefOffset()
+ || !pgdtinfoBase->Pdtroot()->IsHimptypeLevel(hreftype)) {
+ // recurse on first base (assumes no multiple-inheritance)
+ // We could use our internal gory implementation details here...
+ // but we don't, cos it would be a bloody mess.
+ // Note: only support single inheritance here...
+ //
+ hresult = GetTypeInfoOfImplType(pgdtinfoBase, 0, &ptinfoBase);
+ pgdtinfoBase->Release();
+ if (hresult != NOERROR) {
+ return hresult;
+ }
+ // Must ensure this is one of "our" typeinfo's in order to do the cast
+ hresult = ptinfoBase->QueryInterface(IID_TYPELIB_GEN_DTINFO,
+ (LPVOID *)&pgdtinfoBase);
+ ptinfoBase->Release();
+ if (hresult != NOERROR) {
+ return HresultOfScode(E_NOTIMPL); // CONSIDER: better error?
+ }
+ }
+
+ IfErrGo(pgdtinfoBase->Pdtroot()->GetImpMgr(&pimpmgr));
+ err = pimpmgr->GetTypeInfo(pgdtinfoBase->Pdtroot()
+ ->HimptypeOfHreftype(hreftype),
+ DEP_None, pptinfo);
+
+ goto GetInterface;
+ }
+ // fall into original code
+ }
+
+ IfErrGo(Pdtroot()->GetImpMgr(&pimpmgr));
+ IfErrGo(pimpmgr->GetTypeInfo(Pdtroot()->HimptypeOfHreftype(hreftype),
+ DEP_None,
+ pptinfo));
+ // fall through...
+
+GetInterface:
+
+ // Check to see if we should load the interface of the
+ // just gotten dual interface.
+ //
+ if (fGetInterface) {
+ TYPEATTR *ptypeattr;
+ TYPEKIND tkind;
+
+ ptinfoDisp = *pptinfo;
+
+ IfErrGo(TiperrOfHresult(ptinfoDisp->GetTypeAttr(&ptypeattr)));
+ tkind = ptypeattr->typekind;
+ DebAssert(ptypeattr->wTypeFlags & TYPEFLAG_FDUAL, "Not a dual");
+ ptinfoDisp->ReleaseTypeAttr(ptypeattr);
+
+ if (tkind == TKIND_DISPATCH) {
+ // Get the other interface.
+ IfErrGo(TiperrOfHresult(ptinfoDisp->GetRefTypeOfImplType((UINT)-1,
+ &hreftype)));
+ IfErrGo(TiperrOfHresult(ptinfoDisp->GetRefTypeInfo(hreftype,
+ pptinfo)));
+ }
+ else {
+ ptinfoDisp = NULL;
+ }
+ }
+
+Error:
+ RELEASE(ptinfoDisp);
+ RELEASE(pgdtinfoBase);
+ return HresultOfTiperr(err);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetDllEntry(MEMBERID, INVOKEKIND, BSTR FAR*, BSTR FAR*, WORD FAR*)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+* CONSIDER: this code looks a lot like AddressOfMember() below.
+* CONSIDER: maybe some of it could be shared?
+***********************************************************************/
+HRESULT GEN_DTINFO::GetDllEntry(MEMBERID memid,
+ INVOKEKIND invokekind,
+ BSTR FAR* lpbstrDllName,
+ BSTR FAR* lpbstrName,
+ WORD FAR* lpwOrdinal)
+{
+ TIPERROR err;
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ HDLLENTRY_DEFN hdllentrydefn;
+ ENTRYMGR *pentrymgr;
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+ XCHAR rgBuffer[255];
+ DLLENTRY_DEFN *qdllentrydefn;
+
+
+ if (memid == MEMBERID_NIL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ if ((invokekind & (INVOKE_FUNC | INVOKE_PROPERTYGET | INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF)) == 0) { // one of the bits must be set
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ // Can't get attributes if type hasn't been laid yet...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ // Get the DYN_TYPEMEMBERS
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ // Get the ENTRYMGR
+ if ((err = m_pdtroot->GetEntMgr(&pentrymgr)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ // Get the NAMMGR
+ if ((err = m_pdtroot->GetNamMgr(&pnammgr)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ // check if the member whose address is requested is a function.
+ // If it is not a function then return error.
+ //
+ hfdefn = pdtmbrs->Ptdata()->HfdefnOfHmember((HMEMBER) memid, invokekind);
+ if (hfdefn == HFUNCDEFN_Nil) {
+ return HresultOfTiperr(TIPERR_ElementNotFound);
+ }
+
+ // Get the address of the FUNC_DEFN
+ qfdefn = pdtmbrs->Ptdata()->QfdefnOfHfdefn(hfdefn);
+
+ // Is it a DLL function ?
+ if ((GetTypeKind() != TKIND_MODULE) ||
+ (hdllentrydefn = qfdefn->Hdllentrydefn()) == HDLLENTRYDEFN_Nil) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+
+ if (lpbstrDllName) {
+ hlnam = pentrymgr->DllNameOfHdllentrydefn(hdllentrydefn);
+ if ((err = pnammgr->BstrWOfHlnam(hlnam, lpbstrDllName)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ }
+
+ if (pentrymgr->HasOrdinalOfHdllentrydefn(hdllentrydefn)) {
+ // call-by-ordinal
+ if (lpwOrdinal) {
+ *lpwOrdinal = pentrymgr->OrdinalOfHdllentrydefn(hdllentrydefn);
+ }
+ if (lpbstrName) {
+ *lpbstrName = NULL; // no name
+ }
+ }
+ else {
+ // call by name
+ if (lpwOrdinal) {
+ *lpwOrdinal = 0; // no ordinal
+ }
+
+ if (lpbstrName) {
+
+ // Get the entry name from the entry manager.
+ qdllentrydefn = pentrymgr->QdllentrydefnOfHdllentrydefn(hdllentrydefn);
+
+ err = pentrymgr->DllEntryNameOfHchunk(qdllentrydefn->HchunkDllEntry(),
+ rgBuffer,
+ sizeof(rgBuffer));
+
+ if (err == TIPERR_None) {
+#if OE_WIN32
+ int cchUnicode, cbBuffer;
+
+ cbBuffer = xstrblen0(rgBuffer);
+ cchUnicode = MultiByteToWideChar(CP_ACP, 0, rgBuffer, cbBuffer, NULL, 0);
+ if (cchUnicode == 0)
+ err = TIPERR_OutOfMemory;
+ else {
+ if ((*lpbstrName = AllocBstrLen(NULL, cchUnicode)) == NULL)
+ err = TIPERR_OutOfMemory;
+ else
+ NoAssertRetail(MultiByteToWideChar(CP_ACP, 0, rgBuffer, cbBuffer, *lpbstrName, cchUnicode), "");
+ }
+#else
+ if ((*lpbstrName = AllocBstr(rgBuffer)) == NULL) {
+ err = TIPERR_OutOfMemory;
+ }
+#endif
+ }
+
+ if (err != TIPERR_None) {
+ if (lpbstrDllName) {
+ SysFreeString(*lpbstrDllName);
+ }
+ return HresultOfTiperr(err);
+ }
+ }
+ }
+
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::AddressOfMember(ID, INVOKEKIND, VOID FAR* FAR*)
+*Purpose: Returns the addess of the member identified by ID.
+*
+*Entry:
+* ID : identifies the member.
+* INOKEKIND : specifies the invoke kind (GET, LET or SET)
+*
+*Exit:
+* VOID FAR* FAR* : address of the member.
+* HRESULT : error
+* None.
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::AddressOfMember(MEMBERID memid,
+ INVOKEKIND invokekind,
+ VOID FAR* FAR* ppv)
+{
+ TIPERROR err = TIPERR_None;
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ HDLLENTRY_DEFN hdllentrydefn;
+ ENTRYMGR *pentrymgr;
+
+
+ // Can't get address if type hasn't been laid yet...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if (memid == MEMBERID_NIL || ppv == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ if ((invokekind & (INVOKE_FUNC | INVOKE_PROPERTYGET | INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF)) == 0) { // one of the bits must be set
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ // if memid represents the PREDECLARED identifier then return the
+ // pointer to the ModuleInstance.
+ if (memid == ID_DEFAULTINST) {
+ if (!((m_pdtroot->m_typekind == TKIND_COCLASS
+ )
+ && m_pdtroot->GetTypeFlags()
+ & (TYPEFLAG_FAPPOBJECT | TYPEFLAG_FPREDECLID))) {
+
+ return HresultOfTiperr(TIPERR_ElementNotFound);
+ }
+
+#if OE_WIN32
+#if _X86_
+ if (g_fWin32s) {
+ *ppv = &(m_pdtroot->m_punk);
+ }
+ else
+#endif //_X86_
+ {
+ if (Pdtroot()->m_htinfo == HTINFO_Nil) {
+ GUID guid;
+
+ PgtlibOleContaining()->GetTypeGuid(GetIndex(), &guid);
+
+ IfErrRet(g_AppObjectTable.AddTypeInfo(&guid,
+ &Pdtroot()->m_htinfo));
+ }
+
+ g_AppObjectTable.AddressOfAppObject(Pdtroot()->m_htinfo,
+ ppv);
+ }
+#else // !OE_WIN32
+ *ppv = &(m_pdtroot->m_punk);
+#endif // !OE_WIN32
+
+ return NOERROR;
+ }
+
+ // UNDONE :: VBA3 Before returning the address we need to ensure that
+ // the class/module is in ADDRESSABLE state.
+
+ // Get the DYN_TYPEMEMBERS
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ // Get the ENTRYMGR
+ if ((err = m_pdtroot->GetEntMgr(&pentrymgr)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ // check if the member whose address is requested is a function.
+ // If it is not a function then return error.
+ //
+ hfdefn = pdtmbrs->Ptdata()->HfdefnOfHmember((HMEMBER) memid, invokekind);
+ if (hfdefn == HFUNCDEFN_Nil) {
+ return HresultOfTiperr(TIPERR_ElementNotFound);
+ }
+
+ // Get the address of the FUNC_DEFN
+ qfdefn = pdtmbrs->Ptdata()->QfdefnOfHfdefn(hfdefn);
+
+ // Is it a DLL function ?
+ if ((GetTypeKind() != TKIND_MODULE) ||
+ (hdllentrydefn = qfdefn->Hdllentrydefn()) == HDLLENTRYDEFN_Nil) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+
+ // Get the address of the the function.
+#if OE_MACPPC
+ if ( err = pentrymgr->GetAddressOfDllentry(hdllentrydefn, ppv, NULL)) {
+#else // OE_MACPPC
+ if ( err = pentrymgr->GetAddressOfDllentry(hdllentrydefn, ppv)) {
+#endif // OE_MACPPC
+ return HresultOfTiperr(err);
+ }
+
+ return HresultOfTiperr(err);
+}
+
+#pragma code_seg(CS_RARE)
+/***
+*PUBLIC GEN_DTINFO::GetMops(MEMBERID, BSTR FAR*)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::GetMops(MEMBERID memid, BSTR FAR* lpbstrMops)
+{
+ if (lpbstrMops == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ // Can't get attributes if type hasn't been laid yet...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ // Return a Null string
+ *lpbstrMops = NULL;
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetGuid(REFGUID)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetGuid(REFGUID guid)
+{
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ PgtlibOleContaining()->SetTypeGuid(GetIndex(), guid);
+ return NOERROR;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GEN_DTINFO::SetDocString(LPOLESTR)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetDocString(LPOLESTR lpstrDoc)
+{
+ HRESULT hresult;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ hresult = HresultOfTiperr(PgtlibOleContaining()->SetTypeDocString(GetIndex(), lpstrDoc));
+
+ return hresult;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetHelpContext(DWORD)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetHelpContext(DWORD dwHelpContext)
+{
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ return HresultOfTiperr(PgtlibOleContaining()->SetTypeHelpContext(GetIndex(), dwHelpContext));
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetVersion(WORD, WORD)
+*Purpose:
+*
+*Entry:
+* wMajorVerNum - Major version number for the type
+* wMinorVerNum - Minor version number for the type
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetVersion(WORD wMajorVerNum, WORD wMinorVerNum)
+{
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ m_pdtroot->m_wMajorVerNum = wMajorVerNum;
+ m_pdtroot->m_wMinorVerNum = wMinorVerNum;
+
+ // If this is a dual interface, we must update out partner.
+ if (IsDual()) {
+ PgdtinfoPartner()->Pdtroot()->m_wMajorVerNum = wMajorVerNum;
+ PgdtinfoPartner()->Pdtroot()->m_wMinorVerNum = wMinorVerNum;
+ }
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetTypeFlags(UINT uTypeFlags)
+*Purpose:
+*
+*Entry:
+* uTypeFlags - type flags to set.
+*
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetTypeFlags(UINT uTypeFlags)
+{
+ TYPEKIND tkind;
+ HRESULT hresult = NOERROR;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ DebAssert( ((uTypeFlags & ~(TYPEFLAG_FAPPOBJECT
+ | TYPEFLAG_FCANCREATE
+ | TYPEFLAG_FLICENSED
+ | TYPEFLAG_FPREDECLID
+ | TYPEFLAG_FHIDDEN
+ | TYPEFLAG_FCONTROL
+ | TYPEFLAG_FDUAL
+ | TYPEFLAG_FNONEXTENSIBLE
+ | TYPEFLAG_FOLEAUTOMATION
+ )) == 0),
+ " SetTypeFlags passed invalid flags " );
+
+ tkind = GetTypeKind();
+ switch (tkind) {
+ case TKIND_COCLASS:
+ if (uTypeFlags & ~(TYPEFLAG_FAPPOBJECT
+ | TYPEFLAG_FCANCREATE
+ | TYPEFLAG_FLICENSED
+ | TYPEFLAG_FPREDECLID
+ | TYPEFLAG_FHIDDEN
+ | TYPEFLAG_FCONTROL)) {
+ return HresultOfScode(TYPE_E_BADMODULEKIND);
+ }
+ break;
+ case TKIND_INTERFACE:
+ if (uTypeFlags & ~(TYPEFLAG_FHIDDEN
+ | TYPEFLAG_FDUAL
+ | TYPEFLAG_FNONEXTENSIBLE
+ | TYPEFLAG_FOLEAUTOMATION)) {
+ return HresultOfScode(TYPE_E_BADMODULEKIND);
+ }
+ break;
+ case TKIND_DISPATCH:
+ if (uTypeFlags & ~(TYPEFLAG_FHIDDEN
+ | TYPEFLAG_FDUAL
+ | TYPEFLAG_FNONEXTENSIBLE)) {
+ return HresultOfScode(TYPE_E_BADMODULEKIND);
+ }
+ break;
+
+ case TKIND_ALIAS:
+ case TKIND_MODULE:
+ case TKIND_ENUM:
+ case TKIND_RECORD:
+ case TKIND_UNION:
+ if ((uTypeFlags & ~(TYPEFLAG_FHIDDEN))) {
+ return HresultOfScode(TYPE_E_BADMODULEKIND);
+ }
+ break;
+
+ default:
+ DebHalt("bad TKIND");
+ }
+
+ // WARNING -- this is a bit field -- if you add support for new bits,
+ // you must expand the definition of m_uTypeFlags.
+ m_pdtroot->m_uTypeFlags = uTypeFlags;
+
+ // If we're already a dual interface, copy the new typeflags
+ // to our partner.
+ //
+ if (IsDual()) {
+ PgdtinfoPartner()->Pdtroot()->m_uTypeFlags = uTypeFlags;
+ }
+
+ // If we're setting the FDUAL bit, turn this interface into
+ // a dual interface.
+ //
+ if (uTypeFlags & TYPEFLAG_FDUAL && !IsDual()) {
+ PgtlibOleContaining()->SetDualTypeLib();
+ IfOleErrRet(HresultOfTiperr(MakeDual()));
+ }
+
+ // If we change this to an appobject, we must update it in the
+ // project-level binding table. The easiest way to do this is to
+ // remove it from the table then readd it.
+ //
+ if (tkind == TKIND_COCLASS &&
+ uTypeFlags & TYPEFLAG_FAPPOBJECT) {
+
+ BSTR bstrName = NULL;
+ GENPROJ_TYPEBIND *pgptbind;
+#if OE_WIN32
+ LPSTR lpstr = NULL;
+#endif
+
+ pgptbind = PgtlibOleContaining()->Pgptbind();
+
+ IfOleErrRet(GetDocumentation(-1, &bstrName, NULL, NULL, NULL));
+
+ IfOleErrGo(HresultOfTiperr(pgptbind->RemoveNameFromTable(bstrName)));
+#if OE_WIN32
+ IfOleErrGo(ConvertStringToA(bstrName, &lpstr));
+ IfOleErrGo(HresultOfTiperr(pgptbind->AddNameToTable(lpstr,
+ GetIndex(),
+ TRUE)))
+ ConvertStringFree(lpstr);
+#else //OE_WIN32
+ IfOleErrGo(HresultOfTiperr(pgptbind->AddNameToTable(bstrName,
+ GetIndex(),
+ TRUE)));
+#endif
+
+Error:
+ FreeBstr(bstrName);
+ }
+
+ return hresult;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::AddRefTypeInfo(ITypeInfoA FAR*, UINT FAR*)
+*Purpose:
+* Creates an impmgr entry for imported typeinfo.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_LAYOUT)
+HRESULT GEN_DTINFO::AddRefTypeInfo(ITypeInfoA FAR* ptinfo,
+ HREFTYPE FAR* phreftype)
+{
+ IMPMGR *pimpmgr;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+ sHIMPTYPE himptype;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ DebAssert(ptinfo && phreftype, "invalid arguments");
+
+ IfErrGo(Pdtroot()->GetImpMgr(&pimpmgr));
+ IfErrGo(Pdtroot()->GetDtmbrs(&pdtmbrs));
+ IfErrGo(Pdtroot()->MakeHimptypeLevels());
+
+ IfErrGo(pimpmgr->GetHimptype(ptinfo, DEP_None, &himptype));
+
+ *phreftype = Pdtroot()->HreftypeOfHimptype(himptype);
+
+ // fall through...
+
+Error:
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_LAYOUT)
+/***
+*PUBLIC GEN_DTINFO::AddImplType(UINT, UINT)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+HRESULT GEN_DTINFO::AddImplType(UINT index, HREFTYPE hreftype)
+{
+ IMPMGR *pimpmgr;
+ ITypeInfoA *ptinfoImplType = NULL, *ptinfoImplTypeCur = NULL;
+ TYPEATTR *ptypeattrImplType = NULL, *ptypeattrImplTypeCur = NULL;
+ HRESULT hresult;
+ TYPEKIND tkindImplType;
+#if 0
+ HREFTYPE hreftypeImplTypeCur;
+ BOOL isDispatch;
+ UINT iImplType;
+#endif //0
+ BOOL isInterfaceSupported;
+ TYPEKIND tkind;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ IfErrRetHresult(m_pdtroot->GetDtmbrs(&pdtmbrs));
+
+ tkind = GetTypeKind();
+
+ // only works for classes
+ switch (tkind) {
+ case TKIND_COCLASS:
+ case TKIND_DISPATCH:
+ case TKIND_INTERFACE:
+ // check that typekind of impltype is ok
+
+ // get typekind of impltype requested
+ IfErrRetHresult(m_pdtroot->GetImpMgr(&pimpmgr));
+ IfErrRetHresult(pimpmgr->GetTypeInfo(m_pdtroot
+ ->HimptypeOfHreftype(hreftype),
+ DEP_None,
+ (TYPEINFO**)&ptinfoImplType));
+
+ IfOleErrGo(ptinfoImplType->GetTypeAttr(&ptypeattrImplType));
+ tkindImplType = ptypeattrImplType->typekind;
+
+ // Record that this is a dual interface in the hreftype
+ // so we know to dereference it later when we get the
+ // interface back. Don't want to get the Interface typeinfo if
+ // this is a CoClass's impltype.
+ //
+ if (tkind != TKIND_COCLASS && (ptypeattrImplType->wTypeFlags & TYPEFLAG_FDUAL)) {
+ hreftype |= 0x00000001;
+ }
+
+ if (tkindImplType != TKIND_INTERFACE) {
+ // Everybody can derive from an interface
+ switch (tkind) {
+ case TKIND_COCLASS:
+ if (tkindImplType == TKIND_DISPATCH) {
+#if 0
+ // coclass. We can't check here anymore (because flags aren't
+ // set yet. So we rely on mktyplib to do this checking..
+ for (iImplType = 0;
+ iImplType < pdtmbrs->Ptdata()->CBase();
+ iImplType++) {
+ // Note: can't use ITypeInfo::GetRefTypeOfImplType interface
+ // method here
+ // yet cos not laid out... so use TYPE_DATA stuff.
+ //
+ IfErrGo(pdtmbrs->Ptdata()->GetRefTypeOfImplType(
+ iImplType,
+ &hreftypeImplTypeCur));
+ // However can use GetRefTypeInfo...
+ IfOleErrGo(GetRefTypeInfo(hreftypeImplTypeCur,
+ &ptinfoImplTypeCur));
+ IfOleErrGo(ptinfoImplTypeCur->GetTypeAttr(
+ &ptypeattrImplTypeCur));
+ isDispatch =
+ (ptypeattrImplTypeCur->typekind == TKIND_DISPATCH);
+ ptinfoImplTypeCur->ReleaseTypeAttr(ptypeattrImplTypeCur);
+ ptypeattrImplTypeCur = NULL;
+ RELEASE(ptinfoImplTypeCur);
+ if (isDispatch) {
+ err = TIPERR_BadModuleKind;
+ break;
+ }
+ } // for each impltype
+#endif //0
+ break;
+ }
+ // fall into code to give error
+
+ default:
+ err = TIPERR_WrongTypeKind;
+ break;
+ } // switch
+ } // if !TKIND_INTERFACE
+ else {
+ // We want to derive from an interface,
+ // well ok, but if we're a dispinterface then
+ // the interface had better be from typelib.dll.
+ //
+ if (tkind == TKIND_DISPATCH) {
+ IfOleErrRet(IsInterfaceSupported(
+ ptinfoImplType,
+ &isInterfaceSupported));
+ if (!isInterfaceSupported) {
+ err = TIPERR_BadModuleKind;
+ break;
+ }
+ } // if TKIND_DISPATCH
+ }
+
+ ptinfoImplType->ReleaseTypeAttr(ptypeattrImplType);
+ ptypeattrImplType = NULL;
+ RELEASE(ptinfoImplType);
+ // return error, if any
+ IfErrRetHresult(err);
+
+ err = pdtmbrs->Ptdata()->AddImplType(index, hreftype);
+
+ break;
+
+ default :
+ err = TIPERR_BadModuleKind;
+ break;
+ } // switch
+
+ return HresultOfTiperr(err);
+
+Error:
+ if (ptypeattrImplType)
+ ptinfoImplType->ReleaseTypeAttr(ptypeattrImplType);
+ if (ptinfoImplTypeCur && ptypeattrImplTypeCur)
+ ptinfoImplType->ReleaseTypeAttr(ptypeattrImplTypeCur);
+ RELEASE(ptinfoImplType);
+ RELEASE(ptinfoImplTypeCur);
+ return hresult;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetFuncAndParamNames()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetFuncAndParamNames(UINT index,
+ LPOLESTR FAR *rgszNames,
+ UINT cNames)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ return HresultOfTiperr(pdtmbrs->Ptdata()->SetFuncAndParamNames(index,
+ rgszNames,
+ cNames));
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetVarName()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetVarName(UINT index, LPOLESTR szName)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+ HRESULT hresult;
+#if OE_WIN32
+ LPSTR szNameA;
+#else //OE_WIN32
+ #define szNameA szName
+#endif //OE_WIN32
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+#if OE_WIN32
+ IfOleErrRet(ConvertStringToA(szName, &szNameA));
+#endif //OE_WIN32
+
+ hresult = HresultOfTiperr(pdtmbrs->Ptdata()->SetVarName(index, szNameA));
+#if OE_WIN32
+ ConvertStringFree(szNameA);
+#endif //OE_WIN32
+ return hresult;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetTypeDescAlias(TYPEDESC FAR*)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetTypeDescAlias(TYPEDESC FAR* ptdesc)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if (GetTypeKind() != TKIND_ALIAS) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ return HresultOfTiperr(pdtmbrs->Ptdata()->SetTypeDefnAlias(ptdesc));
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetFuncDocString(UINT, LPOLESTR)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetFuncDocString(UINT index, LPOLESTR szDoc)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+#if OE_WIN32
+ HRESULT hresult;
+ LPSTR szDocA;
+#else //OE_WIN32
+ #define szDocA szDoc
+#endif //OE_WIN32
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+#if OE_WIN32
+ IfOleErrRet(ConvertStringToA(szDoc, &szDocA));
+#endif //OE_WIN32
+
+ IfErrGo(m_pdtroot->GetDtmbrs(&pdtmbrs));
+ IfErrGo(pdtmbrs->Ptdata()->SetFuncDocString(index, szDocA));
+
+ SetModified(TRUE);
+ // fall through (with err == TIPERR_None)
+
+Error:
+#if OE_WIN32
+ ConvertStringFree(szDocA);
+#endif //OE_WIN32
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::DefineFuncAsDllEntry
+*Purpose:
+*
+*Entry:
+* UINT : index of the function
+* LPSTR : Name Of the DLL containing the entry point
+* DWORD : Specifies the entrypoint : If the high word of lpProcName is
+* 0 then the low word contains the ordinal of the entrypoint.
+* Otherwise lpProcName is a pointer to the NULL terminated name.
+*
+*
+*Exit:
+* retruns HRESULT :
+* TIPERR_ElementNotFound : if the index is has bad value.
+* TIPERR_OutOfMemory
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::DefineFuncAsDllEntry(UINT index,
+ LPOLESTR szDllName,
+ LPOLESTR szProcName)
+{
+ TIPERROR err = TIPERR_None;
+ HLNAM hlnamDll;
+ NAMMGR *pnammgr;
+ ENTRYMGR *pentrymgr;
+ HDLLENTRY_DEFN hdllentrydefn;
+ DYN_TYPEMEMBERS *pdtmbrs;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ // Get the NAMMGR
+ if (err = m_pdtroot->GetNamMgr(&pnammgr))
+ return HresultOfTiperr(err);
+
+ // Get the ENTRYMGR
+ if (err = m_pdtroot->GetEntMgr(&pentrymgr))
+ return HresultOfTiperr(err);
+
+
+ // Get the hlnam for the szDllName;
+ if (err = pnammgr->HlnamOfStrW(szDllName, &hlnamDll, FALSE, NULL))
+ return HresultOfTiperr(err);
+
+
+ // is szProcName a pointer to the name of the function
+ if (((DWORD) szProcName) & 0xffff0000) {
+ // The uppper word is non NULL. So we have a pointer to the name
+ // of the DLL entry point
+
+ // Call the entrymgr to allocate a DLLENTRY_DEFN for the Dll entry
+ // by Name.
+#if OE_WIN32
+ // Convert from UNICODE to ANSI
+ LPSTR szAnsiProcName;
+ HRESULT hResult = ConvertStringToA(szProcName, &szAnsiProcName);
+
+ if (hResult)
+ return hResult;
+
+ err = pentrymgr->AllocDllentrydefnByName(hlnamDll,
+ szAnsiProcName,
+ &hdllentrydefn);
+ ConvertStringFree(szAnsiProcName);
+#else
+ err = pentrymgr->AllocDllentrydefnByName(hlnamDll,
+ szProcName,
+ &hdllentrydefn);
+#endif
+ if (err != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ }
+ else {
+ // ordinal of the entrypoint is specified
+
+ // call the entrymgr to allcate a DLL_ENTRYDEFN for the DLL entry point
+ if (err = pentrymgr->AllocDllentrydefnByOrdinal(hlnamDll,
+ (UINT) (ULONG)szProcName,
+ &hdllentrydefn)) {
+ return HresultOfTiperr(err);
+ }
+ }
+
+ // Get the DYN_TYPE_MEMBER
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ // Save the hdllentrydefn in FUNC_DEFN (of TYPEDATA)
+ if (err = pdtmbrs->Ptdata()->SetDllEntryDefn(index, hdllentrydefn)) {
+ return HresultOfTiperr(err);
+ }
+
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::SetVarDocString(UINT, LPSTR)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetVarDocString(UINT index, LPOLESTR szDoc)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+#if OE_WIN32
+ CHAR FAR* szDocA;
+#else //OE_WIN32
+ #define szDocA szDoc
+#endif //OE_WIN32
+ HRESULT hresult;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+#if OE_WIN32
+ IfOleErrRet(ConvertStringToA(szDoc, &szDocA));
+#endif //OE_WIN32
+
+ hresult = HresultOfTiperr(pdtmbrs->Ptdata()->SetVarDocString(index, szDocA));
+
+#if OE_WIN32
+ ConvertStringFree(szDocA);
+#endif //OE_WIN32
+ return hresult;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GEN_DTINFO::SetFuncHelpContext(UINT, DWORD)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetFuncHelpContext(UINT index, DWORD dwHelpContext)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ return HresultOfTiperr(pdtmbrs->Ptdata()->SetFuncHelpContext(index,
+ dwHelpContext));
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GEN_DTINFO::SetVarHelpContext(UINT, DWORD)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetVarHelpContext(UINT index, DWORD dwHelpContext)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ return HresultOfTiperr(pdtmbrs->Ptdata()->SetVarHelpContext(index,
+ dwHelpContext));
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_RARE)
+/***
+*PUBLIC GEN_DTINFO::SetMops(UINT, BSTR)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::SetMops(UINT index, BSTR bstrMops)
+{
+ return HresultOfScode(E_NOTIMPL);
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_RARE)
+/***
+*PUBLIC GEN_DTINFO::SetTypeIdldesc(IDLDESC FAR*)
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::SetTypeIdldesc(IDLDESC FAR* lpidldesc)
+{
+ return HresultOfScode(E_NOTIMPL);
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::LayOut()
+*Purpose:
+* Lays out the class
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_LAYOUT)
+HRESULT GEN_DTINFO::LayOut()
+{
+ GEN_DTINFO *pgdtinfoDisp, *pgdtinfoInt;
+ ITypeInfoA *ptinfo = NULL, *ptinfoNext;
+ TYPEATTR *ptypeattr;
+ HREFTYPE hreftype;
+
+
+ TIPERROR err = TIPERR_None; // assume no error
+ HRESULT hresult;
+
+ // Determine if we are a dual interface and which interface
+ // is which.
+ //
+ if (GetTypeKind() == TKIND_DISPATCH) {
+ pgdtinfoDisp = this;
+ pgdtinfoInt = PgdtinfoPartner();
+ }
+ else {
+ DebAssert(!IsDual() || GetTypeKind() == TKIND_INTERFACE,
+ "Dual interfaces can only have INTERFACe or DISP");
+
+ pgdtinfoDisp = PgdtinfoPartner();
+ pgdtinfoInt = this;
+ }
+
+ // Make sure that an interface is laid out before we start to
+ // process it.
+ //
+ if (pgdtinfoInt != NULL
+ && pgdtinfoInt->Pdtroot()->CompState() < CS_DECLARED) {
+
+ IfErrGoTo(pgdtinfoInt->EnsureInDeclaredState(), Error2);
+ IfErrGoTo(pgdtinfoInt->Pdtroot()->MakeHimptypeLevels(), Error2);
+ }
+
+ // Once the interface is laid out, we must add IDispatch
+ // and the interface as base classes of the dispinterface.
+ //
+ // Try to get IDispatch from a registered STDOLE, it not,
+ // get it from the base class of the interface typeinfo.
+ // We may have to iterate down the base class list.
+ //
+ // NOTE: Only do this for dual interfaces.
+ //
+ if (pgdtinfoInt != NULL && pgdtinfoDisp != NULL) {
+ ITypeLibA *ptlib;
+
+ if (LoadRegTypeLibOfSzGuid(g_szGuidStdole,
+ STDOLE_MAJORVERNUM,
+ STDOLE_MINORVERNUM,
+ STDOLE_LCID,
+ &ptlib) == NOERROR) {
+
+ // Load IDispatch.
+ err = TiperrOfHresult(ptlib->GetTypeInfoOfGuid(IID_IDispatch,
+ &ptinfo));
+
+ ptlib->Release();
+
+ if (err != TIPERR_None) {
+ goto Error;
+ }
+ }
+
+ // Didn't find it, so get it from the base class of the interface.
+ else {
+
+ for (ptinfo = (ITypeInfoA *)pgdtinfoInt, ptinfo->AddRef();;) {
+ IfOleErrGo(ptinfo->GetTypeAttr(&ptypeattr));
+
+ if (ptypeattr->guid == IID_IDispatch) {
+ ptinfo->ReleaseTypeAttr(ptypeattr);
+ break;
+ }
+
+ // We've run out of base classes and haven't found
+ // IDispatch, so return an error.
+ //
+ if (ptypeattr->cImplTypes == 0) {
+ err = TIPERR_ElementNotFound;
+ }
+
+ ptinfo->ReleaseTypeAttr(ptypeattr);
+
+ IfErrGoTo(err, Error2);
+
+ IfOleErrGo(ptinfo->GetRefTypeOfImplType(0, &hreftype));
+ IfOleErrGo(ptinfo->GetRefTypeInfo(hreftype, &ptinfoNext));
+ ptinfo->Release();
+ ptinfo = ptinfoNext;
+ }
+ }
+
+ // Add it as the first base class of the dispinterface.
+ IfOleErrGo(pgdtinfoDisp->AddRefTypeInfo(ptinfo, &hreftype));
+ IfOleErrGo(pgdtinfoDisp->AddImplType(0, hreftype));
+
+ // Add the interface as the pseudo-base of the dispinterface.
+ IfOleErrGo(pgdtinfoDisp->AddRefTypeInfo(pgdtinfoInt, &hreftype));
+
+ DebAssert(pgdtinfoDisp->Pdtroot()->Pdtmbrs() != NULL,
+ "Should have been loaded.");
+
+ IfErrGoTo(pgdtinfoDisp->Pdtroot()->Pdtmbrs()
+ ->Ptdata()->AddImplType(1, hreftype),
+ Error2);
+ }
+
+ // If we're the interface portion of a dual interface,
+ // make sure the dispinterface is laid out before we leave.
+ //
+ if (pgdtinfoDisp != NULL) {
+ err = pgdtinfoDisp->EnsureInDeclaredState();
+ }
+
+Error2:
+ hresult = HresultOfTiperr(err);
+
+Error:
+ RELEASE(ptinfo);
+ return hresult;
+}
+#pragma code_seg()
+
+
+//
+//DYN_TYPEROOT method definitions
+//
+//
+
+
+/***
+*PUBLIC DYN_TYPEROOT constructor
+*Purpose:
+* Initializes the members of DYN_TYPEROOT which are pointers to
+* subparts to NULL so that if the destructor is called before
+* initialization is complete then it will not try to free uninitialized
+* pointers.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+DYN_TYPEROOT::DYN_TYPEROOT()
+{
+ m_pctseg = NULL;
+ m_pdtmbrs = NULL;
+ m_pimpmgr = NULL;
+ m_pentmgr = NULL;
+ m_pbModuleInstance = NULL;
+ m_ptypeattrCache = NULL;
+
+
+ m_cRefsDtmbrs = 0;
+
+ m_fNotDual = TRUE;
+ m_lHrefOffset = (ULONG)OHREF_INVALID;
+
+#if OE_WIN32
+ m_htinfo = HTINFO_Nil;
+#endif // OE_WIN32
+}
+#pragma code_seg( )
+
+
+/***
+*PROTECTED DYN_TYPEROOT operator delete
+*Purpose:
+* Deletes the sheap.
+*
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID DYN_TYPEROOT::operator delete(VOID *pv)
+{
+ // This deletes the sheapmgr within which we are embedded.
+ delete (SHEAP_MGR *)((BYTE *)pv - sizeof(SHEAP_MGR));
+}
+#pragma code_seg( )
+
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::Init
+*Purpose:
+* Initializes the members of DYN_TYPEROOT.
+* Initializes all block_desc's in the DYN_TYPEROOT segment.
+* Does not allocate the compile time segment since it may not be needed.
+*
+*Entry:
+* pdti - pointer to GEN_DTINFO instance
+* cbRootReserve - number of bytes reserved in runtime seg for Root instance
+* cbCtSegReserve - number of bytes reserved in ct seg for fixed structs
+* isBasic - TRUE if basic module.
+* accessModule - access attribute of this mod wrt other projs.
+* syskind (OLE) - syskind of the containing typelib
+* (this has to be provided explicitly since the GEN_DTINFO
+* hasn't been added to the typelib yet)
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_TYPEROOT::Init(GEN_DTINFO *pdti,
+ UINT cbRootReserve,
+ UINT cbCtSegReserve,
+ BOOL isBasic,
+ ACCESS accessModule,
+ TYPEKIND tkind
+ , SYSKIND syskind
+ )
+{
+ TIPERROR err;
+
+ m_pgdti = pdti;
+ m_hasDiskImage = FALSE;
+ m_lImpMgr = -1;
+ m_lEntryMgr = -1;
+ m_lDtmbrs = -1;
+ m_lTdata = -1;
+ m_hasWriteAccess = FALSE;
+ m_wasInRunnableState = FALSE;
+ m_willDecompile = FALSE;
+ m_isWatchModule = FALSE;
+ m_isImmediateModule = FALSE;
+
+ m_canDecompile = FALSE;
+ m_cbCtSegReserve = (USHORT)cbCtSegReserve;
+ m_compstate = CS_UNDECLARED;
+ m_isBasic = isBasic;
+ m_accessModule = (USHORT)accessModule;
+ m_fBadTypelib = 0; // good typelib -- initializes it's data
+ m_unused2 = 0x3FFF; // unused bits. All bits are set in both
+ // old & new typelibs
+ m_unused1 = 0; // unused word -- 0 in new typelibs, corrected
+ // to 0 when loading old, bad typelibs
+ m_typekind = tkind;
+ m_uTypeFlags = 0;
+ m_unused3 = 0; // unused bits -- 0 in new typlibs, corrected
+ // to 0 when loading old, bad typelibs
+ m_wMajorVerNum = 0;
+ m_wMinorVerNum = 0;
+
+ // Initialize the instance manager
+ //We don't need to be concerned with undoing the side-affects of
+ // these allocation since the DYN_TYPEROOT will be discarded if
+ // Init fails
+
+ IfErrRet(m_bdTimptype.Init(Psheapmgr(), 0));
+ IfErrRet(m_bdTimpaddr.Init(Psheapmgr(), 0));
+
+ // Initialize the data members in typeinfo needed for MakeRunnable
+ pdti->InitializeIteration();
+
+
+
+
+// If this is OLE, this value is set based on the SysKind of the
+// containing typelib. (only a 'best guess' since this won't work
+// for the risc platforms) It really should be set with
+// ICreateTypeInfo::SetAlignment anyway.
+// For OB, set this value according to the platform we're building on.
+//
+ switch (syskind) {
+ case SYS_WIN16:
+ m_cbAlignMax = 1;
+ break;
+ case SYS_MAC:
+ m_cbAlignMax = 2;
+ break;
+ case SYS_WIN32:
+ m_cbAlignMax = 4;
+ break;
+ default:
+ DebHalt("bad SYSKIND");
+ }
+
+
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT destructor
+*Purpose:
+* Deletes those parts of the GEN_DTINFO implementation which are
+* referenced by the DYN_TYPEROOT. Specifically this includes all
+* objects created in the compile time segment.
+* Essentially restores the DYN_TYPEROOT to an uninitialized state
+* then deletes it.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE )
+DYN_TYPEROOT::~DYN_TYPEROOT()
+{
+
+#if ID_DEBUG
+ // if the module is in runnable state then remove the debug lock before
+ // destructing.
+ // Note : For Std. basic modules the lock is removed in ~BASIC_TYPEROOT
+ if ((CompState() == CS_RUNNABLE) && Psheapmgr()->DebIsLocked() ) {
+ Psheapmgr()->DebUnlock();
+ }
+#endif
+
+ // if the module is in runnable state and the sheapmgr is locked then
+ // unlock it before decompiling.
+ // Note : For Std. basic modules the lock is removed in ~BASIC_TYPEROOT
+ if (CompState() == CS_RUNNABLE) {
+ // Here compstate is being used as a flag to indicate that
+ // the lock has been removed. Since we do this in the destructor we
+ // are safe.
+ SetCompState(CS_ADDRESSABLE);
+ DebAssert(Psheapmgr()->IsLocked(), " Should be locked " );
+ Psheapmgr()->Unlock();
+ }
+
+ if (m_pentmgr != NULL)
+ m_pentmgr->ENTRYMGR::~ENTRYMGR();
+ if (m_pdtmbrs != NULL)
+ m_pdtmbrs->DYN_TYPEMEMBERS::~DYN_TYPEMEMBERS();
+ if (m_pimpmgr != NULL)
+ m_pimpmgr->IMPMGR::~IMPMGR();
+
+
+ if (m_punk != NULL) {
+ // in this case m_punk points to a appobject.
+ // Just release the object
+ m_punk->Release();
+ }
+
+ // Release the typeattribute
+ Pgdtinfo()->ReleaseTypeAttr(m_ptypeattrCache);
+
+#if OE_WIN32
+ // Release the appdata (if needed)
+ if (m_htinfo != HTINFO_Nil) {
+ g_AppObjectTable.RemoveTypeInfo(m_htinfo);
+ }
+#endif // OE_WIN32
+
+ delete (SHEAP_MGR *)m_pctseg;
+}
+#pragma code_seg( )
+
+
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::GetNamMgr - return pointer to the NAMMGR
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* May generate exceptions reading NAMMGR from GEN_DTINFO image.
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_TYPEROOT::GetNamMgr(NAMMGR **ppnammgr)
+{
+ // delegate to containing typelib
+ return m_pgdti->PgtlibOleContaining()->GetNamMgr(ppnammgr);
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::GetImpMgr - return pointer to the IMPMGR
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* May generate exceptions reading IMPMGR from GEN_DTINFO image.
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_TYPEROOT::GetImpMgr(IMPMGR **ppimpmgr)
+{
+ STREAM *pstrm = NULL;
+ TIPERROR err = 0;
+
+ if (m_pimpmgr == NULL) {
+ // Ensure that the COMPILETIME_SEG is created
+ if (m_pctseg == NULL)
+ IfErrRet( SHEAP_MGR::Create((SHEAP_MGR **)&m_pctseg, m_cbCtSegReserve));
+
+ // Create the ImpMgr within the ctseg
+ m_pimpmgr = ::new (&m_pctseg->m_impmgr) IMPMGR;
+ if (err = m_pimpmgr->Init(&m_pctseg->m_sheapmgr,
+ &m_bdTimptype,
+ &m_bdTimpaddr,
+ this)) {
+ m_pimpmgr->IMPMGR::~IMPMGR();
+ m_pimpmgr = NULL;
+ return err;
+ }
+
+ // If DTI has a disk image then read in the name manager
+ if (m_hasDiskImage && (m_lImpMgr != -1) ) {
+
+ // Open stream for reading import manager
+ if (err = m_pgdti->OpenStream(&pstrm, SOM_Read)) {
+ m_pimpmgr->IMPMGR::~IMPMGR();
+ m_pimpmgr = NULL;
+ return err;
+ }
+
+ if ((err = pstrm->SetPos(m_lImpMgr)) ||
+ (err = m_pctseg->m_impmgr.Read(pstrm))) {
+ pstrm->Release();
+ m_pimpmgr->IMPMGR::~IMPMGR();
+ m_pimpmgr = NULL;
+ return err;
+ };
+
+ pstrm->Release();
+
+ }
+ }
+ *ppimpmgr = m_pimpmgr;
+ return TIPERR_None;
+
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::GetEntMgr - return pointer to the ENTRYMGR
+*Purpose:
+* Returns pointer to entry manager associated with the DYN_TYPEROOT.
+* If there is no entry manager then a new one is created and if there
+* is an associated disk image then its contents is read in.
+*
+*Entry:
+* ppentmgr - for returning pointer to import manager
+*
+*Exit:
+* TIPERROR
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_TYPEROOT::GetEntMgr(ENTRYMGR **ppentmgr)
+{
+ STREAM *pstrm = NULL;
+ TIPERROR err = 0;
+
+ if (m_pentmgr == NULL) {
+ // Ensure that the COMPILETIME_SEG is created
+ if (m_pctseg == NULL)
+ IfErrRet( SHEAP_MGR::Create((SHEAP_MGR **)&m_pctseg, m_cbCtSegReserve));
+
+ // Create the EntryMgr within the ctseg
+ m_pentmgr = ::new (&m_pctseg->m_entmgr) ENTRYMGR;
+ if (err = m_pentmgr->Init(&m_pctseg->m_sheapmgr, this)) {
+ m_pentmgr->ENTRYMGR::~ENTRYMGR();
+ m_pentmgr = NULL;
+ return err;
+ }
+
+ // If DTI has a disk image then read in the name manager
+ if (m_hasDiskImage && (m_lEntryMgr != -1)) {
+
+ // Open stream for reading import manager
+ if (err = m_pgdti->OpenStream(&pstrm, SOM_Read)) {
+ m_pentmgr->ENTRYMGR::~ENTRYMGR();
+ m_pentmgr = NULL;
+ return err;
+ }
+
+ if ((err = pstrm->SetPos(m_lEntryMgr)) ||
+ (err = m_pctseg->m_entmgr.Read(pstrm))) {
+ pstrm->Release();
+ m_pentmgr->ENTRYMGR::~ENTRYMGR();
+ m_pentmgr = NULL;
+ return err;
+ };
+
+ pstrm->Release();
+
+ } // if
+ } // if
+
+ *ppentmgr = m_pentmgr;
+ return TIPERR_None;
+
+}
+#pragma code_seg( )
+
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::GetDtmbrs - return pointer to DYN_TYPEMEMBERS
+*Purpose:
+*
+*Implementation Notes:
+* Does NOT add a reference, hence clients should not Release.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_TYPEROOT::GetDtmbrs(DYN_TYPEMEMBERS **ppdtmbrs)
+{
+ STREAM *pstrm = NULL;
+ TIPERROR err= TIPERR_None;
+
+ if (m_pdtmbrs == NULL) {
+ // Open for all to use
+ if (m_hasDiskImage) {
+ IfErrRet(m_pgdti->OpenStream(&pstrm, SOM_Read));
+ }
+
+ // Ensure that the COMPILETIME_SEG is created
+ if (m_pctseg == NULL) {
+ IfErrGo( SHEAP_MGR::Create((SHEAP_MGR **)&m_pctseg, m_cbCtSegReserve));
+ }
+
+ // Create the DYN_TYPEMEMBERS within the ctseg
+ m_pdtmbrs = ::new (&m_pctseg->m_dtmbrs) DYN_TYPEMEMBERS;
+ IfErrGoTo(m_pdtmbrs->Init(&m_pctseg->m_sheapmgr, this), Error1);
+
+ // If DTI has a disk image then read in the name manager
+ if (m_hasDiskImage) {
+ if (m_lDtmbrs != -1) {
+ IfErrGoTo(pstrm->SetPos(m_lDtmbrs), Error1);
+ IfErrGoTo(m_pctseg->m_dtmbrs.Read(pstrm), Error1);
+ }
+ pstrm->Release();
+ }
+ }
+
+ *ppdtmbrs = m_pdtmbrs;
+
+ return TIPERR_None;
+
+Error1:
+ m_pdtmbrs->DYN_TYPEMEMBERS::~DYN_TYPEMEMBERS();
+ m_pdtmbrs = NULL;
+
+ // Fall through
+
+Error:
+ if (m_hasDiskImage) {
+ pstrm->Release();
+ }
+
+ return err;
+}
+#pragma code_seg( )
+
+
+
+
+
+
+/***
+*PUBLIC GEN_DTINFO::EnsurePartsRead
+*Purpose:
+* Ensure that all parts of the GEN_DTINFO have been read in.
+* NOTE: wrapper on the *VIRTUAL* (as of 15-Dec-92) typeroot method.
+* Each derived implementation has to override this appropriately.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GEN_DTINFO::EnsurePartsRead()
+{
+ return m_pdtroot->EnsurePartsRead();
+}
+#pragma code_seg( )
+
+
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::ReleaseDtmbrs - Release DYN_TYPEMEMBERS member.
+*Purpose:
+* Method used by DYN_TYPEMEMBERS member to notify that
+* a client has released.
+* Decrements private ref count of dtmbrs and
+* defers to GEN_DTINFO::Release() -- which could result
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+VOID DYN_TYPEROOT::ReleaseDtmbrs()
+{
+ DebAssert(m_cRefsDtmbrs > 0, "underflow.");
+ m_cRefsDtmbrs--;
+ Pgdtinfo()->Release();
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::AddRefDtmbrs - Add a ref DYN_TYPEMEMBERS member.
+*Purpose:
+* Method used by DYN_TYPEMEMBERS member to notify that
+* a client has added a ref.
+* Bumps private ref count of dtmbrs and defers to GEN_DTINFO::AddRef().
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+VOID DYN_TYPEROOT::AddRefDtmbrs()
+{
+ m_cRefsDtmbrs++;
+ Pgdtinfo()->AddRef();
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::Read - read in DYN_TYPEROOT
+*Purpose:
+* Read in DYN_TYPEROOT using associated FileLoc
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEROOT::Read()
+{
+ STREAM * pstrm;
+ BYTE bVersion, b;
+ TIPERROR err;
+
+ DebAssert(!m_hasDiskImage &&
+ m_pctseg == NULL,
+ "DYN_TYPEROOT::Read subparts exist");
+
+ IfErrRet( m_pgdti->OpenStream(&pstrm, SOM_Read) );
+
+ IfErrGo( pstrm->ReadByte(&b) );
+
+ if (b != bFirstSerByte || DebErrorNow(TIPERR_InvDataRead)) {
+ err = TIPERR_InvDataRead;
+ goto Error;
+ }
+
+ IfErrGo( pstrm->ReadByte(&bVersion) );
+
+ if (bVersion != bCurVersion || DebErrorNow(TIPERR_UnsupFormat)) {
+ err = TIPERR_UnsupFormat;
+ goto Error;
+ }
+
+
+ IfErrGo( ReadFixed(pstrm) );
+
+ if (m_fBadTypelib) {
+ // initialize data that was indeterminate in old typelibs
+ m_unused1 = 0;
+ m_uTypeFlags &= (WORD)(TYPEFLAG_FCANCREATE | TYPEFLAG_FAPPOBJECT);
+ m_unused3 = 0;
+ }
+
+ m_hasDiskImage = TRUE;
+ IfErrGo(m_pgdti->SetModified(FALSE));
+
+Error:
+ // Close the stream
+ pstrm->Release(); // ignore errors from closing read stream
+
+
+ if (Pgdtinfo()->IsDual()) {
+ err = Pgdtinfo()->MakeDual();
+ }
+
+ DebCheckState(1); // Arg=1 will will force blkmgrs to be checked.
+ return err;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::ReadFixed
+*Purpose:
+* Read in the fixed sized part of the DYN_TYPEROOT
+*
+*Entry:
+* pstrm - stream to read from
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR DYN_TYPEROOT::ReadFixed(STREAM *pstrm)
+{
+ BYTE byte;
+ TIPERROR err;
+
+
+
+ IfErrRet(pstrm->Read((void *)&m_lImpMgr, cbSizeDir));
+
+#if HP_BIGENDIAN
+ SwapStruct(&m_lImpMgr, DYN_TYPEROOT_Layout);
+#endif
+
+ // Read the ENUMS
+ IfErrRet(pstrm->ReadByte(&byte));
+ m_compstate = (COMPSTATE) byte;
+
+ IfErrRet(pstrm->ReadByte(&byte));
+ m_typekind = (TYPEKIND) byte;
+
+ // Load the hrefoffset last so modified V1 typelibs can read this
+ // typeinfo without having to worry about changing their
+ // file formats.
+ //
+ if (Pgdtinfo()->PgtlibOleContaining()->GetVersion() > 2) {
+ ULONG lHrefOffset;
+
+ IfErrRet(pstrm->ReadULong(&lHrefOffset));
+ SetLHrefOffset(lHrefOffset);
+ }
+
+ return TIPERR_None;
+
+}
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::EnsurePartsRead
+*Purpose:
+* Ensure that all parts of the DYN_TYPEROOT have been read in.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR DYN_TYPEROOT::EnsurePartsRead()
+{
+ NAMMGR *pnammgr;
+ IMPMGR *pimpmgr;
+ ENTRYMGR *pentmgr;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ DEPEND_KIND dependkind;
+ TIPERROR err;
+
+ IfErrRet( GetNamMgr(&pnammgr) );
+
+ // Fix for OB bug# 5793
+ // Dtmbrs should be read before the import manager is read so
+ // that all rectinfos are read in before the impmgr attempts
+ // to reference any of them.
+ //
+ IfErrRet( GetDtmbrs(&pdtmbrs) );
+
+ IfErrRet( GetImpMgr(&pimpmgr) );
+
+ IfErrRet( pimpmgr->CheckRemainingDep(&dependkind) );
+
+ DebAssert(dependkind == DEP_None, "For OLE it is always DEP_None");
+
+ IfErrRet( GetEntMgr(&pentmgr) );
+
+ m_hasDiskImage = FALSE;
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC DYN_TYPEROOT::EnsureInDeclaredState
+*Purpose:
+* Bring the state of the module to CS_DECLARED
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEROOT::EnsureInDeclaredState()
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ DebAssert((m_compstate != CS_QUASIUNDECLARED) &&
+ (m_compstate != CS_QUASIDECLARED),
+ " This module did not get decompiled ");
+
+
+ // Note:- We unconditionally bring the module to Semideclared state because
+ // we need to read the layout dependencies even if we are already in SEMI_DECLARED
+ // state.
+ //
+ IfErrRet(EnsureInSemiDeclaredState());
+
+ if (m_compstate < CS_DECLARED) {
+ DebAssert(m_compstate == CS_SEMIDECLARED, " We should be in semideclared state here ");
+
+
+ // Update the type ID. Note that if we get an error after we
+ // successfully update the TypeId then it doesn't really matter.
+ //
+ IfErrRet(
+ m_pgdti->PgtlibOleContaining()->UpdateTypeId(m_pgdti->GetIndex()));
+
+
+ IfErrRet( GetDtmbrs(&pdtmbrs) );
+ IfErrRet( pdtmbrs->MakeLaidOut() );
+ IfErrRet(m_pgdti->SetModified(TRUE));
+ m_compstate = CS_DECLARED;
+ }
+ return TIPERR_None;
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DYN_TYPEROOT::EnsureInSemiDeclaredState
+*Purpose:
+* Bring the state of the module to CS_SEMIDECLARED
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEROOT::EnsureInSemiDeclaredState()
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ DebAssert((m_compstate != CS_QUASIUNDECLARED) &&
+ (m_compstate != CS_QUASIDECLARED),
+ " This module did not get decompiled ");
+
+ if (m_compstate < CS_SEMIDECLARED) {
+ IfErrRet(GetDtmbrs(&pdtmbrs) );
+ IfErrRet(pdtmbrs->BuildBindNameTable() );
+ IfErrRet(m_pgdti->SetModified(TRUE));
+ m_compstate = CS_SEMIDECLARED;
+
+ }
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DYN_TYPEROOT::Write - write out DYN_TYPEROOT to default stream
+*Purpose:
+* Write out DYN_TYPEROOT using associated FileLoc
+* Format currenty is:
+* MagicNumber
+* Directory
+* Name
+* Import Manager
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+TIPERROR DYN_TYPEROOT::Write()
+{
+ STREAM * pstrm;
+ TIPERROR err, err2;
+
+ // If we're the dispinterface protion of a dual interface,
+ // save the interface portion instead.
+ //
+ if (Pgdtinfo()->IsDualDispinterface()) {
+ return Pgdtinfo()->PgdtinfoPartner()->Write();
+ }
+
+ // Before openning up the stream for writing make sure all parts
+ // are loaded
+ IfErrRet( EnsurePartsRead() );
+
+ // Check state before writing
+ DebCheckState(1); // Arg=1 will will force blkmgrs to be checked.
+
+ // Open the stream.
+ IfErrRet( m_pgdti->OpenStream(&pstrm, SOM_Write) );
+
+ // Write everything to it.
+ err = WriteToStream(pstrm);
+
+ // Close the stream.
+ err2 = pstrm->Release();
+
+ if (err == TIPERR_None)
+ err = err2;
+
+ if (err == TIPERR_None) {
+ m_hasDiskImage = TRUE;
+
+ // Clear the dirty flag.
+ // WARNING WARNING !!! SetModified(FALSE) will release the TYPEINFO
+ // if there are no references to the TYPEINFO
+ IfErrRet(m_pgdti->SetModified(FALSE));
+ }
+
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DYN_TYPEROOT::WriteToStream - write out DYN_TYPEROOT to a stream
+*Purpose:
+* Write out DYN_TYPEROOT using specified stream.
+* Format currenty is:
+* MagicNumber
+* Directory
+* Name
+* Import Manager
+*
+*Entry:
+* pstrm - The stream to which the write should occur.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR DYN_TYPEROOT::WriteToStream(STREAM *pstrm)
+{
+ TIPERROR err;
+ LONG lDirPostn;
+ ENTRYMGR *pentrymgr;
+
+ IfErrRet(GetEntMgr(&pentrymgr));
+
+#if HP_BIGENDIAN
+ // Swap the Dll entry Defn(s)
+ pentrymgr->SwapDllentrydefns(FALSE);
+#endif
+
+ // Write out identification byte and version number
+ IfErrGo( pstrm->Write(&bFirstSerByte, sizeof(bFirstSerByte)) );
+ IfErrGo( pstrm->Write(&bCurVersion, sizeof(bCurVersion)) );
+
+
+ // Get the position of where the directory is stored in the stream
+ // so we can return to this position and write out the directory
+ IfErrGo( pstrm->GetPos(&lDirPostn) );
+
+ // DO NOT serialize any datamember here.
+
+ // Write out current contents of directory -- must be rewritten later
+ IfErrGo( WriteFixed(pstrm) );
+
+ // WARNING: DON'T SERIALIZE ANY INFORMATION HERE; SERIALIZE IT IN
+ // WARNING: WriteFixed; OTHERWISE, THE INFORMATION IS NOT SERIALIZED
+ // WARNING: FOR DERIVATIVES OF GEN_DTINFO
+
+ IfErrGo( WriteParts(pstrm) );
+
+ // Seek to position of directory and rewrite it
+ IfErrGo( pstrm->SetPos(lDirPostn) );
+ err = WriteFixed(pstrm);
+
+Error:
+#if HP_BIGENDIAN
+ // Swap the Dll entry Defn(s)
+ pentrymgr->SwapDllentrydefns(TRUE);
+#endif
+
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DYN_TYPEROOT::WriteFixed
+*Purpose:
+* Write out the fixed sized part of the DYN_TYPEROOT
+*
+*Entry:
+* pstrm - stream to write to
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR DYN_TYPEROOT::WriteFixed(STREAM *pstrm)
+{
+ TIPERROR err;
+ COMPSTATE compstateOld;
+ BYTE byte;
+
+
+ compstateOld = m_compstate;
+
+ // If compstate greater than COMPILED then just write out COMPILED.
+ m_compstate = (m_compstate > CS_COMPILED) ?
+ (COMPSTATE) CS_COMPILED :
+ m_compstate;
+
+
+#if HP_BIGENDIAN
+ SwapStruct(&m_lImpMgr, DYN_TYPEROOT_Layout);
+#endif
+ err = pstrm->Write((void *)&m_lImpMgr, cbSizeDir);
+
+#if HP_BIGENDIAN
+ SwapStruct(&m_lImpMgr, DYN_TYPEROOT_Layout);
+#endif
+
+ // Check for error
+ IfErrGo(err);
+
+ // Save the ENUMS
+ byte = (BYTE) m_compstate;
+ IfErrGo(pstrm->WriteByte(byte));
+
+ byte = (BYTE) m_typekind;
+ IfErrGo(pstrm->WriteByte(byte));
+
+ // Save this last for backwards compatibility.
+ IfErrGo(pstrm->WriteULong(LHrefOffset()));
+
+Error:
+ // restore saved compstate
+ m_compstate = compstateOld;
+ return err;
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DYN_TYPEROOT::WriteParts
+*Purpose:
+* Write out the variable sized parts of the DYN_TYPEROOT
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR DYN_TYPEROOT::WriteParts(STREAM *pstrm)
+{
+ TIPERROR err;
+ IMPMGR *pimpmgr;
+ ENTRYMGR *pentmgr;
+ DYN_TYPEMEMBERS *pdtmbrs;
+
+ // Write out import manager if it is not empty
+ IfErrRet(GetImpMgr(&pimpmgr));
+ // in OLE we serialize the impmgr only if it is not empty.
+ if (!pimpmgr->IsEmpty()) {
+ IfErrRet(pstrm->GetPos(&m_lImpMgr));
+ IfErrRet(pimpmgr->Write(pstrm));
+ }
+
+
+ // Write out DYN_TYPEMEMBERS
+ IfErrRet(pstrm->GetPos(&m_lDtmbrs));
+ IfErrRet(GetDtmbrs(&pdtmbrs));
+ IfErrRet(pdtmbrs->Write(pstrm));
+
+ // Write out entry manager
+ IfErrRet(GetEntMgr(&pentmgr));
+ // in OLE we serialize the entrymgr only if it is not empty.
+ if (!pentmgr->IsEmpty()) {
+ IfErrRet(pstrm->GetPos(&m_lEntryMgr));
+ IfErrRet(pentmgr->Write(pstrm));
+ }
+
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_RARE)
+/***
+*PUBLIC DYN_TYPEINFO::GetEmbeddedTypeInfo()
+*Purpose:
+* This TYPEINFO impl doesn't support embedded typeinfos.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR GEN_DTINFO::GetEmbeddedTypeInfo(LPOLESTR, LPLPTYPEINFO)
+{
+ DebAssert(0, "GEN_DTINFO::GetEmbeddedTypeInfo not Implemented ");
+
+ return TIPERR_NotYetImplemented;
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::Init
+*Purpose:
+* Initializes the data members ( required for bringing all dependent
+* class to runnable state.
+*
+*Entry:
+*
+*
+*Exit:
+* void
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GEN_DTINFO::InitializeIteration()
+{
+ m_pptinode = NULL;
+ m_himptypeNextDep = HIMPTYPE_Nil;
+
+ return TIPERR_None;
+
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GEN_DTINFO::BeginDepIteration()
+*Purpose:
+* Marks the beginnning of the iteration over all the modules this calls
+* depends on. This also checks if this calls is in the process of
+* bringing itself to runnable state. In case this class is in the meddle
+* of bringing it self to runnalble state, then it sets ppptinodeCycleMax to
+* pptinode of the first invocation ( the one that stared the process of bringing
+* this class to runnable state). This is done by caching pptinode in m_pptinode;
+*
+*Entry:
+* ptinode : pointer to TINODE
+*
+*
+*Exit:
+* TIPERROR.
+*
+* ppptinodeCylcleMax : returns the contents of pptinode if cycle is detected.
+* If the m_pptinode is not NULL then it means that this
+* type info is in the process is bringing it self to runnalble
+* state. Otherwise this caches pptinode and brings the class to
+* addressable state.
+*
+****************************************************************************/
+#pragma code_seg(CS_CREATE)
+TIPERROR GEN_DTINFO::BeginDepIteration( TINODE **pptinode, TINODE ***ppptinodeCycleMax)
+{
+ TIPERROR err = TIPERR_None;
+
+
+ return err;
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::GetNextDepTypeInfo(GEN_DTINFO **)
+*Purpose:
+* Returns the next typeinfo on which this module is dependent on
+* if none is left it returns NULL;
+*
+*Entry:
+*
+*
+*
+*Exit:
+* TIPERROR.
+*
+* ppdtiNext : used for return value. To return the next typeinfo
+* on which this class depends on.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+TIPERROR GEN_DTINFO::GetNextDepTypeInfo(DYNTYPEINFO **ppdtiNext)
+{
+ TIPERROR err = TIPERR_None;
+ IMPMGR *pimpmgr;
+ ITypeInfoA *ptinfo;
+
+ IfErrGo(m_pdtroot->GetImpMgr(&pimpmgr));
+
+ // the the typeinfo associated with the m_himptypeNextDep
+ // It is first initialized in BeginDepItertion.
+ if (m_himptypeNextDep == HIMPTYPE_Nil) {
+ ptinfo = NULL;
+ }
+ else {
+ // Yes, this bumps the reference count, but we release it after we have
+ // completed the processing (i.e after the CheckAllDep call for this typeinfo.
+ IfErrGo(pimpmgr->GetTypeInfo(m_himptypeNextDep, DEP_None, &ptinfo));
+ }
+
+ *ppdtiNext = (DYNTYPEINFO *) ptinfo;
+
+ if (*ppdtiNext != NULL) {
+ // cache the next himptype for next invocation.
+ m_himptypeNextDep = pimpmgr->HimptypeNext(m_himptypeNextDep);
+ }
+
+ return TIPERR_None;
+
+Error:
+ EndDepIteration();
+ return err;
+
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_RARE)
+/***
+*PUBLIC GEN_DTINFO::GetTypeFixups - return TypeFixups of the Type
+*Purpose:
+* Retrieve the TYPEFIXUPS of the TYPEINFO
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns TypeFixups instance or Null if one can not be produced
+*
+***********************************************************************/
+
+TIPERROR GEN_DTINFO::GetTypeFixups(TYPEFIXUPS **pptfixups)
+{
+ DebAssert(0, " TypeFixup will die. ");
+
+#if 0
+#endif
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+/***
+*PUBLIC GEN_DTINFO::AllDepReady()
+*Purpose:
+* Causes the class to be totally ready. binds the import addresses and
+* marks the class to be in runnable state. This call brings the typeinfo
+* runnable state. This is called after bringing all the dependent typeinfos
+* to runnable state.
+* Caches a pointer to the User Defined RESET function (if defined).
+*
+*
+*Entry: None;
+*
+*
+*
+*Exit:
+* TIPERROR.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+TIPERROR GEN_DTINFO::AllDepReady()
+{
+ TIPERROR err = TIPERR_None;
+
+
+ return err;
+
+}
+#pragma code_seg()
+
+
+
+
+
+/***
+*PUBLIC GEN_DTINFO::NotReady()
+*Purpose:
+*
+*Entry:
+*
+*
+*
+*Exit:
+* TIPERROR.
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+TIPERROR GEN_DTINFO::NotReady()
+{
+
+ DebAssert( m_pdtroot->CompState() == CS_RUNNABLE, "GEN_DTINFO::NotReady failed ");
+
+ // Unlock the segment since we lock it when we go to Runnable state.
+ //
+ m_pdtroot->Psheapmgr()->Unlock();
+ m_pdtroot->Psheapmgr()->DebUnlock();
+
+ m_pdtroot->SetCompState(CS_ADDRESSABLE);
+
+
+ // Set the pointer to reset function to NULL
+ m_pvResetFunc = NULL;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC DYN_TYPEROOT::PdfntbindSemiDeclared - Get a semi-decled DEFN_TYPEBIND.
+*Purpose:
+* Get a DEFN_TYPEBIND that is at least in CS_SEMIDECLARED.
+* Does not increment DYN_TYPEMEMBERS external or internal refcount -- hence
+* client must not eventually release the internal ref.
+*
+*Entry:
+* ppdfntbind Pointer to callee-allocated DEFN_TYPEBIND (OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+***********************************************************************/
+
+TIPERROR DYN_TYPEROOT::PdfntbindSemiDeclared(DEFN_TYPEBIND **ppdfntbind)
+{
+
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ DebAssert(ppdfntbind != NULL, "bad param.");
+
+ IfErrRet(m_pgdti->EnsureInSemiDeclaredState());
+ IfErrRet(GetDtmbrs(&pdtmbrs));
+
+ DebAssert(pdtmbrs != NULL, "bad DYN_TYPEMEMBERS.");
+
+ *ppdfntbind = pdtmbrs->Pdtbind();
+
+ DebAssert(pdtmbrs->Pdtbind()->Pdbindnametbl()->IsValid(),
+ "no binding table yet.");
+
+ return TIPERR_None;
+}
+
+
+
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::IsIdMungable
+*Purpose:
+* See if the given function has a retval parameter.
+*
+*Entry:
+* memid - the function to get
+*
+*Exit:
+* returns TRUE if func has a retval parameter.
+***********************************************************************/
+
+BOOL DYN_TYPEROOT::IsIdMungable(HMEMBER memid, USHORT *usNamCount)
+{
+ TYPE_DATA *ptdata;
+ HFUNC_DEFN hfdefn;
+ TYPE_DEFN *qtdefn;
+
+ HRESULT hresult;
+
+ ptdata = Pdtmbrs()->Ptdata();
+
+ // Get the funcdesc for the property get function. If it
+ // doesn't exist, get the first one we find.
+ //
+ hfdefn = ptdata->HfdefnOfHmember(memid, INVOKE_PROPERTYGET);
+ if (hfdefn == HFUNCDEFN_Nil) {
+ hfdefn = ptdata->HfdefnOfHmember(memid);
+ }
+
+ if (hfdefn == HFUNCDEFN_Nil) {
+ GEN_DTINFO *pgdtinfo;
+ BOOL fRet = FALSE;
+
+ // Recurse on our base class, if we have one.
+ hresult = GetTypeInfoOfImplType(Pgdtinfo(), 0, (ITypeInfo **)&pgdtinfo);
+
+ if (hresult == NOERROR) {
+ fRet = pgdtinfo->Pdtroot()->IsIdMungable(memid, usNamCount);
+ }
+
+ pgdtinfo->Release();
+
+ return fRet;
+ }
+
+ // Get the max # of names.
+ *usNamCount = ptdata->QfdefnOfHfdefn(hfdefn)->CArgsUnmunged() + 1;
+
+ // Return whether it has a retval parameter or not.
+ if (ptdata->QfdefnOfHfdefn(hfdefn)->m_ftdefn.HtdefnResult()
+ == HTYPEDEFN_Nil) {
+
+ return FALSE;
+ }
+
+ // If this has an lcid/retval paramter, adjust the
+ // count of parameters.
+ //
+ qtdefn = ptdata->QtdefnResultOfHfdefn(hfdefn);
+
+ if (qtdefn->IsLCID()) {
+ (*usNamCount)--;
+ }
+
+ if (qtdefn->IsRetval()) {
+ (*usNamCount)--;
+ }
+
+ return qtdefn->IsLCID() || qtdefn->IsRetval();
+}
+
+
+
+
+
+
+
+#if ID_DEBUG
+
+/***
+*PUBLIC DYN_TYPEROOT::DebCheckState
+*Purpose:
+* Check internal state of GEN_DTINFO and its parts.
+* Delegates to DYN_TYPEROOT::DebCheckState
+*
+*Entry:
+* uLevel
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+VOID DYN_TYPEROOT::DebCheckState(UINT uLevel) const
+{
+ // if this module is going to decompile then we do not want to do
+ // the state checking.
+ if (m_willDecompile)
+ return;
+
+ if (m_pimpmgr != NULL) {
+ m_pimpmgr->DebCheckState(uLevel);
+ }
+
+ if (m_pdtmbrs != NULL) {
+ m_pdtmbrs->DebCheckState(uLevel);
+ }
+
+ if (m_pentmgr != NULL) {
+ m_pentmgr->DebCheckState(uLevel);
+ }
+
+}
+
+
+#endif //ID_DEBUG
+
+
+//CONSIDER: May want to change the way that a COMPILETIME_SEG to be the
+//CONSIDER: as how a DYN_TYPEROOT is built so that its constructor is called.
+//CONSIDER: If this is done then the statements which explicitly create
+//CONSIDER: instances of the members of COMPILETIME_SEG above must be deleted.
+//CONSIDER: A disadvantage of this is that we would need to construct all the
+//CONSIDER: elements of the COMPILETIME_SEG to load the class which is
+//CONSIDER: unnecessary.
+//
+///*
+///***
+//*PUBLIC COMPILETIME_SEG::operator new - allocates space for a COMPILETIME_SEG
+//*Purpose:
+//*
+//*Implementation Notes:
+//* Allocate a SHEAP_MGR segment and return a pointer to immediately
+//* following the sheap_mgr instance so the GEN_DTINFO
+//* will be constructed there
+//*
+//*Entry:
+//* size - always sizeof(COMPILETIME_SEG)
+//*
+//*Exit:
+//* None.
+//*
+//***********************************************************************
+//
+//VOID *COMPILETIME_SEG::operator new(size_t size)
+//{
+// return SHEAP_MGR::operator new(size);
+//}
+//
+//
+///***
+//*PUBLIC COMPILETIME_SEG::operator delete - releases memory of COMPILETIME_SEG
+//*Purpose:
+//* Releases memory allocated by COMPILETIME_SEG::new
+//*
+//*Entry:
+//* pv - Pointer to COMPILETIME_SEG to delete.
+//*
+//*Exit:
+//* None.
+//*
+//***********************************************************************/
+//
+//VOID COMPILETIME_SEG::operator delete(VOID *pv)
+//{
+// SHEAP_MGR::operator delete(pv);
+//}
+
+
+
+/***
+*PUBLIC GEN_DTINFO::GetVarDesc
+*Purpose:
+* Get a var desc given an index
+*
+*Implementation Notes:
+*
+*Entry:
+* index - index of var to get
+*
+*Exit:
+* Returns HRESULT
+* *ppvardesc - pointer to vardesc returned
+***********************************************************************/
+
+HRESULT GEN_DTINFO::GetVarDesc(UINT index, VARDESCA **ppvardesc)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ if (ppvardesc == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ // Can't get attributes unless been laid...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ return HresultOfTiperr(pdtmbrs->Ptdata()->GetVarDesc(index, ppvardesc));
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::AddVarDesc
+*Purpose:
+* Add a var desc
+*
+*Implementation Notes:
+*
+*Entry:
+* index - index of var to add
+* pvardesc - var desc to add
+*
+*Exit:
+* Returns HRESULT
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::AddVarDesc(UINT index, VARDESCA *pvardesc)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ DebAssert(pvardesc != NULL, "NULL param.");
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ switch (GetTypeKind()) {
+ case TKIND_RECORD :
+ case TKIND_UNION :
+ if (pvardesc->varkind != VAR_PERINSTANCE) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+ break;
+ case TKIND_ENUM :
+ if (pvardesc->varkind != VAR_CONST) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+#if ID_DEBUG
+ // check that enum size is correct
+ DebAssert(pvardesc->lpvarValue, "variant const val isn't set");
+
+ switch (PgtlibOleContaining()->GetSyskind())
+ {
+ case SYS_WIN16:
+ DebAssert(pvardesc->lpvarValue->vt == VT_I2,
+ "expected two byte constant");
+ break;
+
+ case SYS_WIN32:
+ case SYS_MAC:
+ DebAssert(pvardesc->lpvarValue->vt == VT_I4,
+ "expected four byte constant");
+ break;
+
+ default:
+ DebHalt("Invalid SYSKIND");
+ } // switch
+#endif // ID_DEBUG
+ break;
+ case TKIND_MODULE :
+ if (pvardesc->varkind != VAR_CONST && pvardesc->varkind != VAR_STATIC) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+ break;
+ case TKIND_DISPATCH :
+ if (pvardesc->varkind != VAR_DISPATCH) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+ break;
+#if 0
+ case TKIND_Class :
+ if (pvardesc->varkind == VAR_DISPATCH) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+ break;
+#endif //VBA2
+ case TKIND_INTERFACE :
+ case TKIND_ALIAS :
+ case TKIND_COCLASS :
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ break;
+ default:
+ DebHalt("Unrecognzed typekind");
+ } // switch
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ return HresultOfTiperr(pdtmbrs->Ptdata()->AddVarDesc(index, pvardesc));
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GEN_DTINFO::GetFuncDesc
+*Purpose:
+* Get a func desc given an index
+*
+*Implementation Notes:
+*
+*Entry:
+* index - index of function to get
+*
+*Exit:
+* Returns HRESULT
+* *ppfuncdesc - pointer to funcdesc returned
+***********************************************************************/
+
+HRESULT GEN_DTINFO::GetFuncDesc(UINT index, FUNCDESC **ppfuncdesc)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ if (ppfuncdesc == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+ // Can't get attributes unless been laid...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ BOOL isFunkyDispinterface;
+ TYPEATTR *ptypeattrBase;
+ ITypeInfoA *ptinfoBase, *ptinfo;
+ UINT cFuncs, cFuncsLeft, cImplTypes;
+ HREFTYPE hreftype;
+ HRESULT hresult;
+
+ // Work out if we're a dispinterface defined in terms of an interface...
+ // If so, our life becomes somewhat harder since we've effectively
+ // flattened the inheritance hierarchy of the pseudo-base interface
+ // and now we have to work out which base the function was really
+ // introduced in.
+ //
+ IfErrGo(IsFunkyDispinterface(this, &isFunkyDispinterface));
+ if (isFunkyDispinterface) {
+ // Work out how many funcs in the flattened hierarchy...
+ // Need the typeattr for this...
+ //
+ IfOleErrRet(GetTypeInfoOfImplType(
+ this,
+ 1, // pseudo-base
+ &ptinfoBase));
+ IfOleErrGoTo(ptinfoBase->GetTypeAttr(&ptypeattrBase), Error2);
+ DebAssert(ptypeattrBase->typekind == TKIND_INTERFACE, "bad base.");
+ cFuncs = ptypeattrBase->cbSizeVft / sizeof(VOID *);
+
+ // index is 0-based
+ // Note: cFuncsLeft is used to count the total number of funcs
+ // inherited from all base interfaces.
+ //
+ for (;;) {
+ cFuncsLeft = cFuncs - ptypeattrBase->cFuncs;
+ cImplTypes = ptypeattrBase->cImplTypes;
+ ptinfoBase->ReleaseTypeAttr(ptypeattrBase);
+ if (cFuncsLeft <= index) {
+ hresult = ptinfoBase->GetFuncDesc(index - cFuncsLeft, ppfuncdesc);
+ if (hresult == NOERROR) {
+ // Eureka! now pretend the function is a FUNC_DISPATCH
+ // and not some esoteric virtual thingy...
+ //
+ InterfaceFuncdescToDispatch(*ppfuncdesc);
+ }
+ goto Error2;
+ }
+ cFuncs = cFuncsLeft;
+ if (cImplTypes > 0) {
+ // set up for next iteration
+ // Note: we only look at the first base (no MI here).
+ //
+ IfOleErrGoTo(ptinfoBase->GetRefTypeOfImplType(0, &hreftype),
+ Error2);
+ IfOleErrGoTo(ptinfoBase->GetRefTypeInfo(hreftype, &ptinfo),
+ Error2);
+ ptinfoBase->Release();
+ ptinfoBase = ptinfo;
+ IfOleErrGoTo(ptinfoBase->GetTypeAttr(&ptypeattrBase), Error2);
+ }
+ else {
+ err = TIPERR_ElementNotFound; // not found means that our index
+ ptinfoBase->Release(); // is out of bounds
+ goto Error;
+ }
+ } // while
+ } // if funky disp
+
+ return HresultOfTiperr(pdtmbrs->Ptdata()->GetFuncDesc(index, ppfuncdesc));
+
+Error2:
+ ptinfoBase->Release();
+ return hresult;
+
+Error:
+ return HresultOfTiperr(err);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::AddFuncDesc
+*Purpose:
+* Add a func desc
+*
+*Implementation Notes:
+*
+*Entry:
+* index - index of function to add
+* pfuncdesc - func desc to add
+*
+*Exit:
+* Returns HRESULT
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::AddFuncDesc(UINT index, FUNCDESC *pfuncdesc)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ DebAssert(pfuncdesc != NULL, "NULL param.");
+
+ // Can't modify type unless still in undeclared.
+ if (m_pdtroot->CompState() > CS_UNDECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ switch (GetTypeKind()) {
+ case TKIND_RECORD :
+ case TKIND_UNION :
+ case TKIND_ENUM :
+ case TKIND_ALIAS :
+ case TKIND_COCLASS :
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ break;
+ case TKIND_MODULE :
+ if (pfuncdesc->funckind != FUNC_STATIC) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+ break;
+ case TKIND_DISPATCH :
+ if (pfuncdesc->funckind != FUNC_DISPATCH) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+ break;
+#if 0
+ case TKIND_Class :
+ if (pfuncdesc->funckind == FUNC_DISPATCH) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+ break;
+#endif //VBA2
+ case TKIND_INTERFACE :
+ if (pfuncdesc->funckind != FUNC_PUREVIRTUAL) {
+ return HresultOfTiperr(TIPERR_BadModuleKind);
+ }
+ break;
+ default:
+ DebHalt("Unrecognzed typekind");
+ } // switch
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ return HresultOfTiperr(pdtmbrs->Ptdata()->AddFuncDesc(index, pfuncdesc));
+}
+#pragma code_seg()
+
+
+/***
+*GEN_DTINFO::PrepareForDestructio
+*Purpose:
+* NO OP
+*Entry:
+* None
+*Exit:
+* None
+***********************************************************************/
+#pragma code_seg( CS_CORE )
+VOID GEN_DTINFO::PrepareForDestruction()
+{
+ // No op
+}
+#pragma code_seg( )
+
+
+
+
+
+
+
+
+
+/***
+*PUBLIC GEN_DTINFO::SetImplTypeFlags
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetImplTypeFlags(UINT index,
+ INT impltypeflags)
+{
+ DYN_TYPEMEMBERS *pdtmbrs;
+ TIPERROR err;
+
+ // no flags are valid for non-coclass's
+ if (GetTypeKind() != TKIND_COCLASS) {
+ return HresultOfScode(TYPE_E_BADMODULEKIND);
+ }
+
+ if ((err = m_pdtroot->GetDtmbrs(&pdtmbrs)) != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ err = pdtmbrs->Ptdata()->SetImplTypeFlags(index, impltypeflags);
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GEN_DTINFO::SetAlignment
+*Purpose:
+* Set maximum alignment value for this type info. Members will be
+* naturally aligned, not exceeding this value.
+*
+*Entry:
+* cbAlignment - maximum alignment value
+*
+*Exit:
+* No errors possible.
+*
+*Implementation notes:
+* caches the alignment value in DYN_TYPEROOT
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+HRESULT GEN_DTINFO::SetAlignment(WORD cbAlignment)
+{
+ Pdtroot()->SetAlignment(cbAlignment);
+ return NOERROR;
+
+
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GEN_DTINFO::SetSchema
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_RARE)
+HRESULT GEN_DTINFO::SetSchema(LPOLESTR lpstrSchema)
+{
+ return ResultFromScode(E_NOTIMPL); // NYI (used by Cairo)
+}
+#pragma code_seg()
+
+
+#if ID_DEBUG
+
+
+#endif //ID_DEBUG
diff --git a/private/oleauto/src/typelib/gdtinfo.hxx b/private/oleauto/src/typelib/gdtinfo.hxx
new file mode 100644
index 000000000..b6862e717
--- /dev/null
+++ b/private/oleauto/src/typelib/gdtinfo.hxx
@@ -0,0 +1,1323 @@
+/***
+*gdtinfo.hxx - GEN_DTINFO header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* GEN_DTINFO is inherited by BASIC_TYPEINFO and used directly
+* by clients such as COMPOSER.
+*
+*
+*Revision History:
+*
+* 26-Feb-91 alanc: Created.
+* [01] 11-Mar-91 ilanc: Added constructor decl.
+* [02] 20-Mar-91 ilanc: Move COMPILETIME_SEG out and forward decl
+* it and DYN_TYPEMEMBERS instead of including.
+* [03] 04-Apr-91 ilanc: Added universe member to DYN_TYPEROOT.
+* [04] 14-May-91 ilanc: Added ID_TEST wrapper around friends.
+* [05] 05-Mar-92 ilanc: Added isBasic flag.
+* [06] 16-Mar-92 ilanc: Added DYN_TYPEROOT::CanChange()
+* [07] 18-Jun-92 w-peterh: add rectypeinfo stuff
+* [08] 02-Jul-92 w-peterh: OrdinalOfRectbind() and PrtbindOfOrdinal()
+* [09] 18-Aug-92 w-peterh: added ImpAddrOfHImpAddr()
+* [10] 25-Aug-92 rajivk: support for bringing all needed class to runnable state
+* [11] 17-Sep-92 rajivk: Edit & Continue support ( CanOtherChange ).
+* [12] 17-Sep-92 rajivk: Suport for saving all the edits. ( CommitChanges).
+* [13] 12-Nov-92 w-peterh: added watch/immediate support
+* [14] 21-Nov-92 rajivk : call User Defined Reset() when reseting a module
+* [15] 09-Dec-92 rajivk : PContainingProject();
+* [16] 08-Jan-93 RajivK: Support for Code Resource on Mac
+* [17] 08-Jan-93 RajivK: Fixed some undone(s)
+* [18] 18-Jan-93 w-peterh: moved Clear funcs to itdesc.hxx, moved GetFunctions to cxx
+* [19] 02-Feb-93 w-peterh: added IndexOfFuncName
+* [20] 23-Feb-93 rajivk : add CreateInstance support
+*
+*****************************************************************************/
+
+#ifndef GDTInfo_HXX_INCLUDED
+#define GDTInfo_HXX_INCLUDED
+
+
+#include "sheapmgr.hxx" //Note that this include should come first
+ // to avoid overly deep nesting of includes
+#include "cltypes.hxx"
+#include "stltinfo.hxx"
+#include "mem.hxx"
+#include "macros.hxx"
+#include "dtmbrs.hxx"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szGDTINFO_HXX)
+#define SZ_FILE_NAME g_szGDTINFO_HXX
+#endif
+
+class IMPMGR;
+class ENTRYMGR;
+class NAMMGR;
+class COMPILETIME_SEG;
+class DYN_TYPEROOT;
+class BASIC_TYPESRC;
+class DYN_CLASSLIB;
+class DEFN_TYPEBIND;
+#define STAT_TYPELIB GEN_PROJECT
+class GEN_PROJECT;
+
+extern OLECHAR FAR *g_szGuidStdole; // string version of STDOLE's GUID
+
+// Layout of DYN_TYPEROOT serialized data members except for GUID and enums
+#define DYN_TYPEROOT_Layout "llllsssss"
+
+#define CCCONSTANT_INCREMENT 16
+
+#define OHREF_INVALID (~(0L))
+
+/***
+*class GEN_DTINFO - 'dti': DYNAMIC TYPEINFO implementation
+*Purpose:
+* GEN_DTINFO is inherited by BASIC_TYPEINFO and used directly
+* by clients such as COMPOSER.
+*
+***********************************************************************/
+class GEN_DTINFO : public STL_TYPEINFO
+{
+friend class STL_TYPEINFO;
+friend class GenericTypeLibOLE;
+public:
+
+ // Inherited methods
+// OLE2 ITypeInfo methods
+
+ STDMETHOD(GetTypeAttr)(THIS_ TYPEATTR FAR* FAR* lplptypeattr);
+ STDMETHOD(GetTypeComp)(THIS_ ITypeCompA FAR* FAR* lplptcomp);
+ STDMETHOD(GetFuncDesc)(THIS_ UINT index,
+ FUNCDESC FAR* FAR* lplpfuncdesc);
+ STDMETHOD(GetVarDesc)(THIS_ UINT index,
+ VARDESCA FAR* FAR* lplpvardesc);
+ STDMETHOD(GetNames)(THIS_ MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ UINT cMaxNames,
+ UINT FAR* lpcNames);
+ STDMETHOD(GetRefTypeOfImplType)(THIS_ UINT index,
+ HREFTYPE FAR* phreftype);
+ STDMETHOD(GetImplTypeFlags)(THIS_ UINT index,
+ INT FAR* pimpltypeflags);
+ STDMETHOD(GetIDsOfNames)(THIS_ OLECHAR FAR* FAR* rgszNames,
+ UINT cNames,
+ MEMBERID FAR* rgmemid);
+ STDMETHOD(Invoke)(THIS_ VOID FAR* lpvInstance,
+ MEMBERID memid,
+ WORD wFlags,
+ DISPPARAMSA FAR *lpdispparams,
+ VARIANTA FAR *lpvarResult,
+ EXCEPINFOA FAR *lpexcepinfo,
+ UINT FAR *lpuArgErr);
+ STDMETHOD(GetDocumentation)(THIS_ MEMBERID memid,
+ BSTR FAR* lpbstrName,
+ BSTR FAR* lpbstrDocString,
+ DWORD FAR* lpdwHelpContext,
+ BSTR FAR* lpbstrHelpFile);
+ STDMETHOD(GetDllEntry)(THIS_
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ BSTR FAR* lpbstrDllName,
+ BSTR FAR* lpbstrName,
+ WORD FAR* lpwOrdinal);
+ STDMETHOD(GetRefTypeInfo)(THIS_ HREFTYPE hreftype,
+ ITypeInfoA FAR* FAR* lplptinfo);
+ STDMETHOD(AddressOfMember)(THIS_ MEMBERID memid,
+ INVOKEKIND invkind,
+ VOID FAR* FAR* lplpv);
+ STDMETHOD(CreateInstance)(THIS_
+ IUnknown FAR* punkOuter,
+ REFIID iid,
+ VOID FAR* FAR* lplpvObject);
+ STDMETHOD(GetMops)(THIS_ MEMBERID memid,
+ BSTR FAR* lpbstrMops);
+ STDMETHOD_(void, ReleaseTypeAttr)(THIS_ TYPEATTR FAR* lptypeattr);
+ STDMETHOD_(void, ReleaseFuncDesc)(THIS_ FUNCDESC FAR* lpfuncdesc);
+ STDMETHOD_(void, ReleaseVarDesc)(THIS_ VARDESCA FAR* lpvardesc);
+
+// OLE2 ICreateTypeInfo methods
+ STDMETHOD(SetGuid)(THIS_ REFGUID guid);
+ STDMETHOD(SetTypeFlags)(THIS_ UINT uTypeFlags);
+ STDMETHOD(SetDocString)(THIS_ LPOLESTR lpstrDoc);
+ STDMETHOD(SetHelpContext)(THIS_ DWORD dwHelpContext);
+ STDMETHOD(SetVersion)(THIS_ WORD wMajorVerNum,
+ WORD wMinorVerNum);
+ STDMETHOD(AddRefTypeInfo)(THIS_ ITypeInfoA FAR* ptinfo,
+ HREFTYPE FAR* lphreftype);
+ STDMETHOD(AddFuncDesc)(THIS_ UINT index,
+ FUNCDESC FAR* lpfuncdesc);
+ STDMETHOD(AddImplType)(THIS_ UINT index,
+ HREFTYPE hreftype);
+ STDMETHOD(SetImplTypeFlags)(THIS_ UINT index,
+ INT impltypeflags);
+ STDMETHOD(SetAlignment)(THIS_ WORD cbAlignment);
+
+ STDMETHOD(SetSchema)(THIS_ LPOLESTR lpstrSchema);
+
+ STDMETHOD(AddVarDesc)(THIS_ UINT index,
+ VARDESCA FAR* lpvardesc);
+ STDMETHOD(SetFuncAndParamNames)(THIS_ UINT index,
+ LPOLESTR FAR* rgszNames,
+ UINT cNames);
+ STDMETHOD(SetVarName)(THIS_ UINT index,
+ LPOLESTR szName);
+ STDMETHOD(SetTypeDescAlias)(THIS_ TYPEDESC FAR* lptdescAlias);
+ STDMETHOD(DefineFuncAsDllEntry)(THIS_ UINT index,
+ LPOLESTR szDllName,
+ LPOLESTR szProcName);
+ STDMETHOD(SetFuncDocString)(THIS_ UINT index,
+ LPOLESTR szDocString);
+ STDMETHOD(SetVarDocString)(THIS_ UINT index,
+ LPOLESTR szDocString);
+ STDMETHOD(SetFuncHelpContext)(THIS_ UINT index,
+ DWORD dwHelpContext);
+ STDMETHOD(SetVarHelpContext)(THIS_ UINT index,
+ DWORD dwHelpContext);
+ STDMETHOD(SetMops)(THIS_
+ UINT index, BSTR bstrMops);
+ STDMETHOD(SetTypeIdldesc)(THIS_
+ IDLDESC FAR* lpidldesc);
+ STDMETHOD(LayOut)(THIS);
+
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
+
+#if 0
+ virtual TIPERROR CreateInst(LPLPVOID lplpObj);
+#endif
+ virtual TIPERROR GetDynTypeMembers(LPLPDYNTYPEMEMBERS lplpDynTypeMembers);
+ virtual TIPERROR GetDefnTypeBind(DEFN_TYPEBIND **pdfntbind);
+ virtual TIPERROR GetTypeFixups(LPLPTYPEFIXUPS lplpTypeFixups);
+ nonvirt TYPEKIND GetTypeKind();
+ virtual TIPERROR Read();
+ virtual TIPERROR Write();
+ virtual TIPERROR WriteToStream(STREAM *pstrm);
+ virtual TIPERROR GetMemberName(HMEMBER hmember, BSTRA *plstrName);
+ virtual LPOLESTR SzTypeIdofTypeInfo();
+ virtual TIPERROR Reset();
+ virtual TIPERROR ResetPrePass();
+ virtual TIPERROR EnsurePartsRead();
+ virtual TIPERROR GetEmbeddedTypeInfo(LPOLESTR szTypeId,
+ LPLPTYPEINFO pptinfo);
+ virtual VOID ReleasePublicResources();
+
+ // Introduced methods
+ static TIPERROR Create(GEN_DTINFO **ppgdtinfo);
+ static TIPERROR Create(GEN_DTINFO **ppgdtinfo,
+ TYPEKIND typekind,
+ BOOL isBasic,
+ ACCESS access,
+ SYSKIND syskind
+ );
+
+ nonvirt TIPERROR GetDefnTypeBindSemiDeclared(DEFN_TYPEBIND **ppdfntbind);
+ nonvirt TIPERROR EnsureInDeclaredState();
+ nonvirt TIPERROR EnsureInSemiDeclaredState();
+ nonvirt TIPERROR Pdfntbind(DEFN_TYPEBIND **ppdfntbind);
+ nonvirt TIPERROR PdfntbindSemiDeclared(DEFN_TYPEBIND **ppdfntbind);
+
+ nonvirt TIPERROR GetDocumentationOfFuncName(LPOLESTR szFuncName,
+ BSTR FAR *lpbstrDocString,
+ DWORD FAR *lpdwHelpContext,
+ UINT *puIndex);
+
+ // Methods for Watch/Immediate support
+ nonvirt TIPERROR GetLpfnOfHfdefn(HFUNC_DEFN hfdefn, VOID **lplpfn);
+ nonvirt TIPERROR GetHfdefnOfFunctionName(LPSTR szFuncName,
+ INVOKEKIND invokekind,
+ HFUNC_DEFN *phfdefn);
+ nonvirt TIPERROR GetFunctionNameOfHfdefn(HFUNC_DEFN hfdefn,
+ BSTRA *pbstrName,
+ INVOKEKIND *pinvokekind);
+ nonvirt TIPERROR GetFunctionCount(ACCESS access,
+ UINT *pcFunctions);
+ nonvirt TIPERROR GetNextFunctionName(HFUNC_DEFN *phfdefn,
+ ACCESS access,
+ BSTRA *pbstrName,
+ INVOKEKIND *pinvokekind);
+ nonvirt TIPERROR CreateImmediateImplicitVar(XSZ xszName,
+ TYPEDESCKIND tdesckind);
+
+ // Method to remove cycle problem within a project.
+ virtual VOID RemoveInternalRefs();
+
+ // inherited methods for bringing needed modules to runnable state.
+ virtual TIPERROR BeginDepIteration(TINODE **pptinode, TINODE ***ppptinodeCycleMax);
+ virtual VOID EndDepIteration();
+ virtual TIPERROR GetNextDepTypeInfo(DYNTYPEINFO **ppdtiNext);
+ virtual BOOL IsReady();
+ virtual TIPERROR AllDepReady();
+ virtual TIPERROR NotReady();
+ virtual TIPERROR CommitChanges();
+ nonvirt DYN_TYPEROOT* Pdtroot();
+ virtual BOOL IterationNotInProgress();
+ virtual TIPERROR InitializeIteration();
+
+
+ // methods for adding a funcdesc/vardescs and getting hdefns back
+ nonvirt TIPERROR AddFuncDesc(UINT index,
+ FUNCDESC *pfuncdesc,
+ HFUNC_DEFN *phfdefn);
+ nonvirt TIPERROR AddVarDesc(UINT index,
+ VARDESCA *pvardesc,
+ HVAR_DEFN *phvdefn);
+ virtual VOID PrepareForDestruction();
+
+
+ // the following are related to the implementation of ITypeInfo::Invoke().
+ struct INVOKEARGS{
+ UINT cArgs;
+ VARTYPE FAR* rgvt;
+ VARIANTARGA FAR* FAR* rgpvarg;
+ VARIANTARGA FAR* rgvarg;
+ VARIANTARGA FAR* rgvarg2;
+ VARIANTARGA FAR* FAR* rgpvargByref;
+ BYTE FAR* rgbVarMustBeFreed; // array of BYTEs which flag for each
+ // argument as to whether GDTINFO owns the
+ // memory and should free it or not
+ // (vba2 #3279)
+ SAFEARRAYA FAR* psa; // for the vararg case
+ };
+
+ nonvirt HRESULT NEARCODE IndexOfParam(DISPPARAMSA FAR* pdispparams,
+ UINT uPos,
+ UINT FAR* puIndex);
+ nonvirt HRESULT NEARCODE VariantVtOfTypedesc(TYPEDESC FAR* lptdesc,
+ USHORT *pfGotObjGuid,
+ GUID *pGuid,
+ VARTYPE FAR* pvt);
+ nonvirt HRESULT NEARCODE VariantVtOfHtdefn(HTYPE_DEFN htdefn,
+ TYPE_DATA * ptdata,
+ BOOL fSimpleType,
+ USHORT *pfGotObjGuid,
+ GUID *pGuid,
+ VARTYPE FAR* pvt);
+ nonvirt HRESULT NEARCODE AllocInvokeArgs(UINT cArgs, UINT cArgsVarArg, INVOKEARGS FAR* FAR* ppinvargs);
+ nonvirt void NEARCODE ReleaseInvokeArgs(INVOKEARGS FAR* pinvargs);
+ nonvirt HRESULT NEARCODE CoerceArg(VARIANTARGA FAR* pvargSrc,
+ VARTYPE vt,
+ USHORT fGotObjGuid,
+ GUID FAR* pGuid,
+ INVOKEARGS FAR* pinvargs,
+ UINT u);
+ nonvirt HRESULT NEARCODE GetInvokeArgs(HFUNC_DEFN hfdefn,
+ TYPE_DATA * ptdata,
+ WORD wFlags,
+ DISPPARAMSA FAR* pdispparams,
+ VARIANTA ** ppvarRetval,
+ void * pbufRetval,
+ INVOKEARGS FAR* FAR* ppinvargsOut,
+ UINT FAR* puArgErr,
+ BOOL fPropParamSplit);
+
+ nonvirt BOOL IsPropGet(WORD wFlags);
+ nonvirt BOOL IsPropPut(WORD wFlags);
+ nonvirt BOOL IsLegalInvokeFlags(WORD wFlags);
+ nonvirt HRESULT NEARCODE CopyBackByrefArgs(INVOKEARGS FAR* pinvargs);
+
+ // Dual functions.
+ nonvirt BOOL IsDual();
+ nonvirt BOOL IsDualInterface();
+ nonvirt BOOL IsDualDispinterface();
+
+ nonvirt VOID SetIsDual(BOOL fParam);
+
+ nonvirt GEN_DTINFO *PgdtinfoPartner();
+
+ nonvirt TIPERROR MakeDual();
+
+ // Versioning functions.
+ nonvirt UINT GetVersion();
+
+ // Public data members
+ static CONSTDATA LPOLESTR szProtocolName;
+
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebShowState(UINT uLevel) const;
+ nonvirt UINT DebShowSize();
+#else // !ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+ nonvirt VOID DebShowSize() {}
+#endif // ID_DEBUG
+
+
+protected:
+ GEN_DTINFO();
+ ~GEN_DTINFO();
+
+ DYN_TYPEROOT *m_pdtroot;
+
+ //CONSIDER: new and delete operations needed if GEN_DTINFO allocated
+ //CONSIDER: within the DYN_TYPEROOT segment
+ // nonvirt VOID *operator new(size_t cbSize);
+ //
+ //
+ // now have to redefine operator new that is inherited from COBJECT because
+ // the preceeding declaration shadows it
+ // VOID * operator new(size_t, VOID *p) { return p; }
+ //
+ // nonvirt VOID operator delete(VOID *pv); should this be virtual?
+
+ // these data memebers are required for bringing all dependent class to
+ // runnable state.
+ TINODE **m_pptinode;
+ HIMPTYPE m_himptypeNextDep;
+ // cache a pointer to the RESET function
+ VOID *m_pvResetFunc;
+
+#ifdef GEN_DTINFO_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+
+
+/***
+*class DYN_TYPEROOT - 'dtroot':
+*Purpose:
+* Each GEN_DTINFO has a DYN_TYPEROOT which serves as an interface
+* between the GEN_DTINFO and its subparts.
+*
+***********************************************************************/
+
+class DYN_TYPEROOT
+{
+
+friend class GEN_DTINFO;
+friend class ENTRYMGR; // for m_pbModuleInstance;
+friend class INSTMGR; // ditto
+#if ID_TEST
+ friend TIPERROR GetSheapSize(UINT argc, BSTRA *rglstr);
+#endif
+
+public:
+ // No Create method is defined since GEN_DTINFO is only client
+ TIPERROR Init(GEN_DTINFO *pgdti,
+ UINT cbRootReserve,
+ UINT cbSegReserve,
+ BOOL isBasic,
+ ACCESS accessModule,
+ TYPEKIND tkind
+ , SYSKIND syskind
+ );
+ nonvirt TIPERROR Release();
+ VOID operator delete(VOID *pv);
+
+ nonvirt TIPERROR GetNamMgr(NAMMGR **ppnammgr);
+ nonvirt TIPERROR GetImpMgr(IMPMGR **ppimpmgr);
+ nonvirt TIPERROR GetEntMgr(ENTRYMGR **ppentmgr);
+ virtual TIPERROR GetDtmbrs(DYN_TYPEMEMBERS **pdtmbrs);
+ nonvirt GEN_DTINFO *Pgdtinfo();
+ nonvirt DYN_TYPEMEMBERS * Pdtmbrs();
+ nonvirt COMPSTATE CompState() const;
+ nonvirt TIPERROR SetCompState( COMPSTATE compstate);
+
+ nonvirt TIPERROR Pdfntbind(DEFN_TYPEBIND **ppdfntbind);
+ nonvirt TIPERROR PdfntbindSemiDeclared(DEFN_TYPEBIND **ppdfntbind);
+
+ nonvirt TIPERROR EnsureInSemiDeclaredState();
+ nonvirt TIPERROR EnsureInDeclaredState();
+
+ nonvirt SHEAP_MGR *Psheapmgr();
+
+
+ nonvirt VOID ReleaseDtmbrs();
+ nonvirt VOID AddRefDtmbrs();
+
+ nonvirt BOOL IsBasic() const;
+ nonvirt IMPADDR ImpAddrOfHImpAddr(HIMPADDR himpaddr);
+ nonvirt TIPERROR GetWriteAccess();
+ nonvirt ACCESS Access() const;
+ nonvirt VOID SetAccess(ACCESS access);
+ nonvirt UINT GetTypeFlags() const;
+ nonvirt TIPERROR CreateInstance(HIMPTYPE himptype, LPLPVOID lplpObj);
+ nonvirt BOOL IsIdMungable(HMEMBER memid, USHORT *usNamCount);
+
+ nonvirt VOID SetAlignment(USHORT cbAlign) { m_cbAlignMax = cbAlign; }
+ nonvirt USHORT GetAlignment() { return m_cbAlignMax; }
+
+ nonvirt BYTE *PbModuleInstance();
+
+ // HREFTYPE functions.
+ ULONG LHrefOffset();
+ VOID SetLHrefOffset(ULONG lOffset);
+ BOOL FUseHrefOffset();
+ TIPERROR MakeHimptypeLevels();
+
+ HREFTYPE HreftypeOfHimptype(HIMPTYPE himptype);
+ HIMPTYPE HimptypeOfHreftype(HREFTYPE hreftype);
+ BOOL IsHimptypeLevel(HREFTYPE hreftype);
+
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebShowState(UINT uLevel) const;
+ nonvirt VOID DebShowStateAndSize(UINT uLevel);
+ nonvirt UINT DebShowSize();
+#else //!ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+ nonvirt VOID DebShowStateAndSize(UINT uLevel) {};
+ nonvirt VOID DebShowSize() {}
+#endif //!ID_DEBUG
+
+protected:
+ DYN_TYPEROOT();
+ ~DYN_TYPEROOT();
+
+ // client should call SHEAP_MGR::Create() and use placement
+ // new.
+ //
+ VOID *operator new(size_t cbSize);
+ virtual TIPERROR Read(); //invoked by GEN_DTINFO::Read
+ virtual TIPERROR Write(); //invoked by GEN_DTINFO::Write
+ virtual TIPERROR WriteToStream(STREAM *pstrm); //invoked by GEN_DTINFO::WriteToStream
+ virtual TIPERROR WriteParts(STREAM *pstrm);
+ virtual TIPERROR ReadFixed(STREAM *pstrm);
+ virtual TIPERROR EnsurePartsRead();
+ virtual TIPERROR WriteFixed(STREAM *pstrm);
+
+
+
+ static CONSTDATA BYTE bCurVersion; // Serialization format version number
+ static CONSTDATA BYTE bFirstSerByte; // First byte of serialization
+ static CONSTDATA WORD cbSizeDir; // Size of directory
+
+
+ GEN_DTINFO *m_pgdti;
+ COMPILETIME_SEG *m_pctseg;
+ BLK_DESC m_bdTimpaddr;
+ BLK_DESC m_bdTimptype;
+
+ USHORT m_cbCtSegReserve;
+
+ // non-serialized flag word
+ USHORT m_hasDiskImage:1;
+ USHORT m_hasWriteAccess:1;
+ USHORT m_wasInRunnableState:1;
+ USHORT m_willDecompile:1; // module will get decompiled
+ USHORT m_isWatchModule:1; // is this a watch module
+ USHORT m_isImmediateModule:1; // is this an immed module
+ USHORT m_isImmedImplicitMod:1; // is this the immediate implicit mod
+ USHORT m_canDecompile:1; // is set if the module can decompile
+ USHORT undone:8; // extra bits
+
+ // These are serialized by passing pointer to m_lImpMgr
+ // and serializing cbSizeDir bytes.
+
+ // If you add a new data member please update DYN_TYPEROOT_Layout
+ // FIRST serialized member.
+ LONG m_lImpMgr;
+ LONG m_lEntryMgr;
+ LONG m_lDtmbrs;
+ LONG m_lTdata;
+ WORD m_wMajorVerNum;
+ WORD m_wMinorVerNum;
+ USHORT m_unused1; // WARNING: this is unused/uninitialized in V1
+ // typelibs (0 in new typelibs). This is
+ // corrected in DYN_TYPEROOT::ReadFixed().
+ USHORT m_fBadTypelib:1; // set ==> bad V1 typelib (with uninitialized
+ // data items)
+ // clear ==> new typelib with initialized data.
+
+ USHORT m_fNotDual:1; // This typeinfo is not part of a dual
+ // interface.
+
+ USHORT m_unused2:14; // these bits are all unused at present. They
+ // are all set in both old and new typelibs
+
+ // serialized flag word (LAST serialized member)
+ USHORT m_isBasic:1; // is this an Object Basic class?
+ USHORT m_accessModule:2; // type wannabe ACCESS
+ USHORT m_uTypeFlags:9; // TypeInfo TypeFlags
+ // possible bits are:
+ // TYPEFLAG_FCANCREATE 0x0001
+ // TYPEFLAG_FAPPOBJECT 0x0002
+ // TYPEFLAG_FLICENSED 0x0004
+ // TYPEFLAG_FPREDECLID 0x0008
+ // TYPEFLAG_FHIDDEN 0x0010
+ // TYPEFLAG_FCONTROL 0x0020
+ // TYPEFLAG_FDUAL 0x0040
+ // TYPEFLAG_FNONEXTENSIBLE 0x0080
+ // TYPEFLAG_FOLEAUTOMATION 0x0100
+ // WARNING: all but FCANCREATE and FAPPOBJECT
+ // were uninitialized in V1 typelibs. This is
+ // corrected in DYN_TYPEROOT::ReadFixed().
+ USHORT m_unused3:4; // extra bits
+ // WARNING: these bits were uninitialized in V1
+ // typelibs. This is corrected in
+ // DYN_TYPEROOT::ReadFixed().
+
+ IMPMGR *m_pimpmgr; // Must follow last serialized members.
+
+ // This must be serialized separately to support the PPC
+ // hybrid-V1/V2 typelib.
+ //
+ ULONG m_lHrefOffset;
+
+ // NOTE: must be serialized separately
+ // since hxxtoinc needs its offset.
+ //
+ // RajivK : for portability reasons enumerated data types are serialized
+ // separately.
+ // CONSIDER: (dougf) for size on disk (and in-memory) considerations,
+ // CONSIDER: could move these enums into the unused bits above
+ // CONSIDER: (at the expense of speed of accessing them).
+ COMPSTATE m_compstate; ENUMPAD(m_compstate) // Must follow bit flags.
+ TYPEKIND m_typekind; ENUMPAD(m_typekind)
+
+ ENTRYMGR *m_pentmgr;
+ DYN_TYPEMEMBERS *m_pdtmbrs;
+
+
+ // The dual partner of this interface, if it exists.
+ GEN_DTINFO *m_pgdtinfoDualPartner;
+
+ TYPEATTR *m_ptypeattrCache; // "template" typeattr to be copied
+ TYPEATTR *m_ptypeattrOut; // typeattr to be passed out, to save MemAlloc calls
+ BOOL m_ftypeattrOutUsed; // TRUE if ptypeattrOutUsed has been returned to a caller
+
+ // m_pbModuleInstance should not be under EI_OB switch as we are
+ // overloading this pointer to use it as the predeclared Identifier.
+
+ union {
+ BYTE *m_pbModuleInstance; // pointer to instance for standard module
+ IUnknown *m_punk; // pointer to the object instance (for predeclared id)
+ };
+
+
+ //CONSIDER: following is needed if GEN_DTINFO allocated within DYN_TYPEROOT
+ //GEN_DTINFO m_dti;
+
+ // DYN_TYPEMEMBERS reference count - 25-Jun-92 ilanc
+ USHORT m_cRefsDtmbrs;
+
+ // Max alignment value - used with DYN_TYPEMEMBERS::AlignmentTdesckind
+ // and set by GEN_DTINFO::SetAlignment
+ USHORT m_cbAlignMax;
+
+#if OE_WIN32
+ HTINFO m_htinfo;
+#endif // OE_WIN32
+
+#ifdef DYN_TYPEROOT_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::Psheapmgr()
+*Purpose:
+* returns pointer to the containing SHEAP_MGR
+*Exit:
+* returns pointer to the SHEAP_MGR.
+*
+***********************************************************************/
+inline SHEAP_MGR *DYN_TYPEROOT::Psheapmgr()
+{
+ return (SHEAP_MGR *)((BYTE *)this - sizeof(SHEAP_MGR));
+}
+
+
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::PbModuleInstance()
+*Purpose:
+* returns module instance
+*Exit:
+* returns module instance
+*
+***********************************************************************/
+inline BYTE *DYN_TYPEROOT::PbModuleInstance() {
+ DebAssert (m_typekind == TKIND_MODULE, "need module in order to call PbModuleInstance");
+ return m_pbModuleInstance;
+}
+
+
+
+
+/***
+*PUBLIC DYN_TYPEROOT::CompState()
+*Purpose:
+* Accessor: Returns class's compilation state.
+*
+*Entry:
+*
+*Exit:
+* COMPSTATE
+*
+***********************************************************************/
+inline COMPSTATE DYN_TYPEROOT::CompState() const
+{
+ return (COMPSTATE)m_compstate;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::SetCompState(COMPSTATE)
+*Purpose:
+* set the m_compstate to the COMPSTATE passed to it.
+*
+*Entry:
+* COMPSTATE
+*
+*Exit:
+* COMPSTATE
+*
+***********************************************************************/
+inline TIPERROR DYN_TYPEROOT::SetCompState(COMPSTATE compstate)
+{
+ m_compstate = compstate;
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::IsBasic - is this a Basic class?
+*Purpose:
+* Tests whether this is a class defined in Basic.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* BOOL
+*
+***********************************************************************/
+
+inline BOOL DYN_TYPEROOT::IsBasic() const
+{
+ return (BOOL)m_isBasic;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::Access - get access attribute.
+*Purpose:
+* Gets the access/visibility attribute of this module.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* ACCESS
+*
+***********************************************************************/
+
+inline ACCESS DYN_TYPEROOT::Access() const
+{
+ return (ACCESS)m_accessModule;
+}
+
+inline VOID DYN_TYPEROOT::SetAccess(ACCESS access)
+{
+ m_accessModule = access;
+}
+
+/***
+*PUBLIC DYN_TYPEROOT::GetTypeFlags - get access attribute.
+*Purpose:
+* Gets the access/visibility attribute of this module.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* ACCESS
+*
+***********************************************************************/
+
+inline UINT DYN_TYPEROOT::GetTypeFlags() const
+{
+ return (UINT)m_uTypeFlags;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::Pgdtinfo
+*Purpose:
+* Return a pointer to the GEN_DTINFO of the DYN_TYPEROOT
+*
+*Entry:
+* None.
+*
+*Exit:
+* Return a pointer to the GEN_DTINFO of the DYN_TYPEROOT
+*
+***********************************************************************/
+
+inline GEN_DTINFO *DYN_TYPEROOT::Pgdtinfo()
+{
+ return m_pgdti;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::Pdtmbrs()
+*Purpose:
+* returns pointer to the dtmbrs
+*Exit:
+* returns pointer to the dtmbrs
+*
+***********************************************************************/
+inline DYN_TYPEMEMBERS *DYN_TYPEROOT::Pdtmbrs() {
+ return m_pdtmbrs;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::IterationNotInProgress()
+*Purpose:
+* To check if iteraion is in progress or not.
+*
+*Entry:
+*
+*Exit:
+* True if iteration is not in progress.
+*
+***********************************************************************/
+inline BOOL GEN_DTINFO::IterationNotInProgress() {
+ return ( m_pptinode == NULL );
+}
+
+/***
+*PUBLIC GEN_DTINFO::EnsureInDeclaredState
+*Purpose:
+* Bring the state of the module to CS_DECLARED
+* Defer to DYN_TYPEROOT.
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+inline TIPERROR GEN_DTINFO::EnsureInDeclaredState()
+{
+ return m_pdtroot->EnsureInDeclaredState();
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::EnsureInSemiDeclaredState
+*Purpose:
+* Bring the state of the module to CS_SEMIDDECLARED
+* Defer to DYN_TYPEROOT.
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+inline TIPERROR GEN_DTINFO::EnsureInSemiDeclaredState()
+{
+ return m_pdtroot->EnsureInSemiDeclaredState();
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::Pdtroot
+*Purpose:
+* Returns the pointer to the DYN_TYPEROOT of this typeinfo.
+*Entry:
+* None.
+*
+*Exit:
+* pointer to dyn type root.
+*
+***********************************************************************/
+
+inline DYN_TYPEROOT* GEN_DTINFO::Pdtroot()
+{
+ return m_pdtroot;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::Read - read in GEN_DTINFO
+*Purpose:
+* Defer to DYN_TYPEROOT Read method
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline TIPERROR GEN_DTINFO::Read()
+{
+ return m_pdtroot->Read();
+}
+
+
+
+/***
+*PUBLIC GEN_DTINFO::Write - write out GEN_DTINFO
+*Purpose:
+* Defer to DYN_TYPEROOT Write method
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline TIPERROR GEN_DTINFO::Write()
+{
+ return m_pdtroot->Write();
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::WriteToStream - write GEN_DTINFO to a specified stream
+*Purpose:
+* Defer to DYN_TYPEROOT Write method
+*
+***********************************************************************/
+
+inline TIPERROR GEN_DTINFO::WriteToStream(STREAM *pstrm)
+{
+ return m_pdtroot->WriteToStream(pstrm);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::Create
+*
+*Purpose:
+* Static function for creation of a GEN_DTINFO.
+*
+*Entry:
+* ppdtinfo -- set to point to produced GEN_DTINFO
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+inline TIPERROR GEN_DTINFO::Create(GEN_DTINFO **ppdtinfo)
+{
+ // Create a new public Basic module.
+ return Create(ppdtinfo,
+ TKIND_MODULE,
+ TRUE,
+ ACCESS_Public
+ // this function is used only in typelib creation, so
+ // it doesn't matter what the syskind value is
+ , SYSKIND_CURRENT
+ );
+}
+
+
+
+
+/***
+*PUBLIC GEN_DTINFO::Pdfntbind - Get a decled DEFN_TYPEBIND.
+*Purpose:
+* Get a DEFN_TYPEBIND that is at least in CS_DECLARED.
+* Does not increment DYN_TYPEMEMBERS refcount -- hence
+* client must not release produced pointer (and can
+* cache it).
+*
+*Entry:
+* ppdfntbind Pointer to callee-allocated DEFN_TYPEBIND (OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+***********************************************************************/
+
+inline TIPERROR GEN_DTINFO::Pdfntbind(DEFN_TYPEBIND **ppdfntbind)
+{
+ return m_pdtroot->Pdfntbind(ppdfntbind);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::PdfntbindSemiDeclared - Get a decled DEFN_TYPEBIND.
+*Purpose:
+* Get a DEFN_TYPEBIND that is at least in CS_DECLARED.
+* Does not increment DYN_TYPEMEMBERS refcount -- hence
+* client must not release produced pointer (and can
+* cache it).
+*
+*Entry:
+* ppdfntbind Pointer to callee-allocated DEFN_TYPEBIND (OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+***********************************************************************/
+
+inline TIPERROR GEN_DTINFO::PdfntbindSemiDeclared(DEFN_TYPEBIND **ppdfntbind)
+{
+ return m_pdtroot->PdfntbindSemiDeclared(ppdfntbind);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::EndDepIteration
+*Purpose:
+* This marks the end of the iteration over all the dependent
+* modules.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline VOID GEN_DTINFO::EndDepIteration()
+{
+ m_pptinode = NULL;
+ m_himptypeNextDep = HIMPTYPE_Nil;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::IsReady
+*Purpose:
+* Is this class in runnable state.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Boolean : true if the module is in CS_RUNNABLE state else false.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline BOOL GEN_DTINFO::IsReady()
+{
+ return (m_pdtroot->CompState() == CS_RUNNABLE);
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::IsDual
+*Purpose:
+* Returns TRUE if this interface is part of a dual interface.
+*
+* NOTE: The bit used to store this value defaults to TRUE,
+* so we store the opposite of what we truely want.
+*
+*Entry:
+* None.
+*
+*Exit:
+* BOOLEAN
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline BOOL GEN_DTINFO::IsDual()
+{
+ return !m_pdtroot->m_fNotDual;
+}
+
+/***
+*PUBLIC GEN_DTINFO::GetTypeKind - return TypeKind of Type
+*Purpose:
+* Retrieve the TYPEKIND of the TYPEINFO
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns TypeKind of described Type
+*
+***********************************************************************/
+
+inline TYPEKIND GEN_DTINFO::GetTypeKind()
+{
+ return m_pdtroot->m_typekind;
+}
+
+/***
+*PUBLIC GEN_DTINFO::IsDualInterface
+*Purpose:
+* Returns TRUE if this is the interface portion of a dual interface.
+*
+*Entry:
+* None.
+*
+*Exit:
+* BOOLEAN
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline BOOL GEN_DTINFO::IsDualInterface()
+{
+ return IsDual() && GetTypeKind() == TKIND_INTERFACE;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::IsDualDispinterface.
+*Purpose:
+* Returns TRUE if this member is the dispinterface protion of a
+* dual interface.
+*
+*Entry:
+* None.
+*
+*Exit:
+* BOOLEAN
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline BOOL GEN_DTINFO::IsDualDispinterface()
+{
+ return IsDual() && GetTypeKind() == TKIND_DISPATCH;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::SetIsDual
+*Purpose:
+* Sets whether we are a dual interface.
+*
+* NOTE: The bit used to store this value defaults to TRUE,
+* so we store the opposite of what we truely want.
+*
+*Entry:
+* None.
+*
+*Exit:
+* BOOLEAN
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline VOID GEN_DTINFO::SetIsDual(BOOL fParam)
+{
+ m_pdtroot->m_fNotDual = !fParam;
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::PgdtinfoPartner
+*Purpose:
+* Returns this typeinfo's partner, if its part of a dual pair.
+*
+*Entry:
+* None.
+*
+*Exit:
+* GEN_DTINFO * of the parnter.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline GEN_DTINFO *GEN_DTINFO::PgdtinfoPartner()
+{
+ return (GEN_DTINFO *)PstltiPartner();
+}
+
+
+/***
+*PUBLIC GEN_DTINFO::GetVersion
+*Purpose:
+* Returns the typeinfo's version
+*
+*Entry:
+* None.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline UINT GEN_DTINFO::GetVersion()
+{
+ return PgtlibOleContaining()->GetVersion();
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::LHrefOffset
+*Purpose:
+* Accessors for m_wHrefOffset.
+*
+*Entry:
+* None.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline ULONG DYN_TYPEROOT::LHrefOffset()
+{
+ return m_lHrefOffset;
+}
+
+inline VOID DYN_TYPEROOT::SetLHrefOffset(ULONG lOffset)
+{
+ m_lHrefOffset = lOffset;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::FUseHrefOffset
+*Purpose:
+* Returns TRUE if we need to adjust our hreftypes.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline BOOL DYN_TYPEROOT::FUseHrefOffset()
+{
+ return LHrefOffset() != OHREF_INVALID;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::IsHimptypeLevel
+*Purpose:
+* Returns TRUE if this is the correct level in the inheritence
+* heirarchy to dereference this hreftype at.
+*
+*Entry:
+* hreftype
+*
+*Exit:
+* BOOL
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline BOOL DYN_TYPEROOT::IsHimptypeLevel(HREFTYPE hreftype)
+{
+ return FUseHrefOffset() ? ((LONG)hreftype - (LONG)LHrefOffset()) >= 0
+ : TRUE;
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::HreftypeOfHimptype
+*Purpose:
+* Calculate an hreftype given an himptype.
+*
+*Entry:
+* himptype
+*
+*Exit:
+* hreftype
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline HREFTYPE DYN_TYPEROOT::HreftypeOfHimptype(HIMPTYPE himptype)
+{
+ if (!FUseHrefOffset()) {
+ DebAssert(Pgdtinfo()->GetTypeKind() != TKIND_INTERFACE
+ || CompState() == CS_UNDECLARED,
+ "Levels must be set for interfaces.");
+
+ return (HREFTYPE)himptype;
+ }
+
+ return (HREFTYPE)(himptype + LHrefOffset());
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::HimptypeOfHreftype
+*Purpose:
+* Calculate an himptype given an hreftype.
+*
+*Entry:
+* hreftype
+*
+*Exit:
+* himptype
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline HIMPTYPE DYN_TYPEROOT::HimptypeOfHreftype(HREFTYPE hreftype)
+{
+ if (!FUseHrefOffset()) {
+ DebAssert(Pgdtinfo()->GetTypeKind() != TKIND_INTERFACE
+ || CompState() == CS_UNDECLARED,
+ "Levels must be set for interfaces.");
+
+ return (HIMPTYPE)hreftype;
+ }
+
+ DebAssert(IsHimptypeLevel(hreftype), "Not proper level!");
+
+ return (HIMPTYPE)(hreftype - LHrefOffset());
+}
+
+
+/***
+*PUBLIC DYN_TYPEROOT::ImpAddrOfHImpAddr
+*Purpose:
+* Dereference a HIMPADDR
+*Entry:
+* HimpAddr to be dereferenced
+*
+*Exit:
+* IMPADDR
+***********************************************************************/
+
+inline IMPADDR DYN_TYPEROOT::ImpAddrOfHImpAddr(HIMPADDR himpaddr)
+{
+ DebAssert(m_bdTimpaddr.CbSize() > himpaddr, "invalid handle");
+ return *(IMPADDR *)((BYTE*)m_bdTimpaddr.QtrOfBlock() + himpaddr);
+}
+
+
+
+void InterfaceFuncdescToDispatch(FUNCDESC * pfuncdesc);
+
+
+#endif // ! GDTInfo_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/gdtrt.cxx b/private/oleauto/src/typelib/gdtrt.cxx
new file mode 100644
index 000000000..13653dce4
--- /dev/null
+++ b/private/oleauto/src/typelib/gdtrt.cxx
@@ -0,0 +1,2576 @@
+/***
+*gdtrt.cxx - definition of GEN_DTINFO runtime (rt) members
+*
+* Copyright (C) 1991-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* GEN_DTINFO is inherited by BASIC_TYPEINFO and used directly
+* by clients such as COMPOSER.
+*
+*Owner:
+* AlanC
+*
+*Revision History:
+*
+* [00] 05-Apr-93 bradlo: split off from gdtinfo.cxx
+* [01] 30-Apr-93 w-jeffc: made DEFN data members private
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "macros.hxx"
+#include "typelib.hxx"
+#include <new.h>
+#include <stdlib.h>
+
+#include "gdtinfo.hxx"
+#include "ctseg.hxx"
+#include "dtbind.hxx"
+#include "mem.hxx"
+#include "exbind.hxx"
+
+#if VBA3 && !EI_VBARUN && OE_WIN32
+#include "rtdispmod.hxx"
+#endif
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if EI_OLE && OE_MAC
+char szOleGDTRTCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleGDTRTCxx
+#else
+static char szGDTRTCxx[] = __FILE__;
+#define SZ_FILE_NAME szGDTRTCxx
+#endif
+#endif //ID_DEBUG
+
+#if EI_OLE
+// Defined in gdtinfo.cxx
+extern TIPERROR IsFunkyDispinterface(GEN_DTINFO *pgdtinfo,
+ BOOL *pisFunkyDispinterface);
+#endif //EI_OLE
+
+extern HRESULT GetTypeInfoOfImplType(GEN_DTINFO *pgdtinfo,
+ UINT uImplType,
+ ITypeInfo **pptinfo);
+
+// InvokeFlags helpers
+//
+inline BOOL
+GEN_DTINFO::IsPropGet(WORD wFlags)
+{
+ return ((wFlags & DISPATCH_PROPERTYGET) != 0);
+}
+
+inline BOOL
+GEN_DTINFO::IsPropPut(WORD wFlags)
+{
+ return ((wFlags & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) != 0);
+}
+
+#if EI_OLE || ID_DEBUG
+inline BOOL
+GEN_DTINFO::IsLegalInvokeFlags(WORD wFlags)
+{ // one (or more) of the bits must be set
+ return (wFlags && ((wFlags & ~(DISPATCH_METHOD | DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) == 0));
+}
+#endif //EI_OLE || ID_DEBUG
+
+/***
+*PUBLIC GEN_DTINFO::GetIDsOfNames(OLECHAR FAR* FAR*, UINT, ID FAR*)
+*Purpose:
+* This routine maps an array of names into a corresponding
+* array of MEMBERIDs.
+*
+*Entry:
+* rgszNames = the array of names to map
+* cNames = count of names in the array
+*
+*Exit:
+* return value = HRESULT
+*
+* rgmemid = array of MEMBERIDs corresponding to the given array of names
+*
+***********************************************************************/
+HRESULT GEN_DTINFO::GetIDsOfNames(OLECHAR FAR* FAR* rgszNames,
+ UINT cNames,
+ MEMBERID FAR* rgmemid)
+{
+ UINT u;
+ HLNAM hlnam;
+ TIPERROR err;
+ EXBIND exbind;
+ NAMMGR *pnammgr;
+ HRESULT hresult;
+ TYPE_DATA *ptdata;
+ FUNC_DEFN *qfdefn;
+ VAR_DEFN *qvdefn;
+ HFUNC_DEFN hfdefn;
+ HVAR_DEFN hvdefn;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ PARAM_DEFN *qparamdefn;
+ HPARAM_DEFN hparamdefn;
+#if EI_OB
+ HPARAM_DEFN hparamdefnFirst;
+#endif // EI_OB
+ DYN_TYPEBIND *pdtbind;
+ UINT cArgs, i, iArg;
+ HGNAM hgnam;
+
+ hresult = NOERROR;
+
+ // CONSIDER: do we really want to error cNames == 0?
+ if (rgszNames == NULL || rgmemid == NULL || cNames == 0)
+ return HresultOfScode(E_INVALIDARG);
+
+#if ID_DEBUG // param validation
+#if OE_WIN16
+ if (IsBadReadPtr(rgszNames, cNames * sizeof(char FAR*)))
+ return HresultOfScode(E_INVALIDARG);
+ for (u = 0; u < cNames; ++u) {
+ if (IsBadStringPtr(rgszNames[u], -1))
+ return HresultOfScode(E_INVALIDARG);
+ }
+ if (IsBadWritePtr(rgmemid, cNames * sizeof(MEMBERID)))
+ return HresultOfScode(E_INVALIDARG);
+#endif
+#endif
+
+ // Can't get attributes if type hasn't been laid yet...
+ if (m_pdtroot->CompState() < CS_DECLARED) {
+ return HresultOfScode(TYPE_E_INVALIDSTATE);
+ }
+
+ // assume the worst for simplicity
+ for (u = 0; u < cNames; ++u)
+ rgmemid[u] = DISPID_UNKNOWN;
+
+ IfErrRetHresult(m_pdtroot->GetDtmbrs(&pdtmbrs));
+
+ // NOTE: we really want to match the first thing with the given name,
+ // regardless of invokekind, so we pass in 0 for the invokekind
+ pdtbind = pdtmbrs->Pdtbind();
+
+ ptdata = pdtmbrs->Ptdata();
+
+ // Convert the first string into an HGNAM.
+ IfErrRetHresult(m_pdtroot->GetNamMgr(&pnammgr));
+
+#if OE_WIN32
+ LPSTR lpszName0;
+ int cbName0, cchUnicode;
+
+ cchUnicode = wcslen(rgszNames[0])+1;
+ cbName0 = WideCharToMultiByte(CP_ACP, 0, rgszNames[0], cchUnicode, NULL, 0, NULL, NULL);
+ if (cbName0 == 0)
+ return E_OUTOFMEMORY;
+ lpszName0 = (LPSTR)MemAlloc(cbName0);
+ if (lpszName0 == NULL)
+ return E_OUTOFMEMORY;
+ WideCharToMultiByte(CP_ACP, 0, rgszNames[0], cchUnicode, lpszName0, cbName0, NULL, NULL);
+
+ hlnam = pnammgr->HlnamOfStrIfExist(lpszName0);
+
+ MemFree(lpszName0);
+#else
+ hlnam = pnammgr->HlnamOfStrIfExist(rgszNames[0]);
+#endif
+
+ // If the name isn't in this TypeLib, then don't even bother
+ // going futher.
+ //
+ if (hlnam == HLNAM_Nil) {
+ return HresultOfScode(DISP_E_UNKNOWNNAME);
+ }
+
+ // See if the name is in this TypeInfo.
+ IfErrRetHresult(pnammgr->HgnamOfHlnam(hlnam, &hgnam));
+
+ IfErrRetHresult(pdtmbrs->Pdtbind()->BindDefnCur(FALSE,
+ hgnam,
+ 0,
+ ACCESS_Public,
+ &exbind));
+
+ // NOTE: all code paths after this point must release the exbind's ptinfo
+
+ switch (exbind.BindKind()) {
+ case BKIND_FuncMatch:
+ hfdefn = exbind.Hfdefn();
+ ptdata = exbind.Ptdata();
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+ rgmemid[0] = qfdefn->Hmember(); // for the function itself
+
+ // Now let's get its parameter names.
+ if (cNames > 1) {
+ hparamdefn = (HPARAM_DEFN)qfdefn->m_ftdefn.m_hdefnFormalFirst;
+#if EI_OB
+ hparamdefnFirst = hparamdefn;
+#endif // EI_OB
+
+ IfOleErrGo(HresultOfTiperr(m_pdtroot->GetNamMgr(&pnammgr)));
+ cArgs = qfdefn->CArgs(); // don't count LCID & RETVAL parms
+
+ IfErrRetHresult(m_pdtroot->GetNamMgr(&pnammgr));
+
+ // Note: since the input array of names is not necessarily
+ // sorted by parameter position, we have a nested loop to
+ // search for a given param name in the formal list.
+ //
+ // We always search through the list starting from the last
+ // parameter we matched, as people are likely to use the
+ // named parameters in the order they were defined.
+ //
+ for (u = 1, iArg = 0; u < cNames; ++u) {
+ IfOleErrGo(HresultOfTiperr(pnammgr->HlnamOfStrW(rgszNames[u],
+ &hlnam,
+ FALSE,
+ NULL)));
+ for (i=0; i < cArgs; i++, iArg++) {
+ // If we're trying to get past the last argument, start over
+ // with the first.
+ //
+ if (iArg == cArgs) {
+ iArg = 0;
+#if EI_OB
+ hparamdefn = hparamdefnFirst;
+#endif // EI_OB
+ }
+
+ // Check, which param defn (name) matches u'th name stored in the
+ // passed in array of names.
+ //
+#if EI_OB
+ DebAssert(hparamdefn != HPARAMDEFN_Nil,
+ "number vs actual dont match");
+
+ // In OB we walk the linked list of PARAM_DEFN(s).
+ qparamdefn = ptdata->QparamdefnOfHparamdefn(hparamdefn);
+
+ // Get the next param defn.
+ hparamdefn = qparamdefn->HparamdefnNext();
+#else //EI_OB
+ qparamdefn = ptdata->QparamdefnOfIndex(hparamdefn, iArg);
+#endif //EI_OB
+
+ if (qparamdefn->Hlnam() == hlnam) {
+ // NOTE: this memid can't be used as input to GetNames
+ // but only by Invoke.
+ // The memid for a parameter is just its ordinal.
+ //
+ rgmemid[u] = iArg;
+ break;
+ }
+ } // for
+ // If we reach here with i==cArgs, then we didn't find the name
+ // thus the error.
+ //
+ if (i == cArgs) {
+ hresult = HresultOfScode(DISP_E_UNKNOWNNAME);
+ break;
+ }
+
+ // Start the next search with the parameter after this one.
+ iArg++;
+ } // for
+ } // if
+ goto Done;
+ break;
+
+ case BKIND_OneVarMatch:
+ hvdefn = exbind.Hvdefn();
+ qvdefn = exbind.Ptdata()->QvdefnOfHvdefn(hvdefn);
+ // NOTE: extra casting here to appease the mac compiler.
+ DebAssert(qvdefn->IsMemberVarDefn(), "Bad defn");
+ rgmemid[0] = (MEMBERID)((MBR_VAR_DEFN *)qvdefn)->Hmember();
+ goto Done;
+ break;
+
+ case BKIND_NoMatch:
+ // The name wasn't found in our current TypeInfo, so check out
+ // our base class(es).
+ //
+#if EI_OB
+ TYPE_DEFN *qtdefn;
+ HIMPTYPE himptype;
+ ITypeInfo *ptinfo;
+
+ // Get HIMPTYPE of the base class.
+ if (ptdata->CBase() > 0) {
+ qtdefn = ptdata->QtdefnOfHvdefn(ptdata->HvdefnFirstBase());
+ DebAssert(qtdefn->IsUserDefined(), "Bad base class.");
+
+ himptype = qtdefn->Himptype();
+
+ // Try to load the TYPEINFO.
+ IfErrRetHresult(ptdata->Pimpmgr()->GetTypeInfo(himptype,
+ DEP_None,
+ &ptinfo));
+
+ hresult = ptinfo->GetIDsOfNames(rgszNames, cNames, rgmemid);
+
+ ptinfo->Release();
+ }
+
+ break;
+#else // !EI_OB
+ TYPEKIND tkind;
+ HVAR_DEFN hvdefnBaseCur, hvdefnBaseFirst, hvdefnBaseNext;
+ VAR_DEFN *qvdefnBase;
+ TYPE_DEFN *qtdefnBase;
+ HIMPTYPE himptype;
+ ITypeInfo *ptinfo;
+
+ // The following is weird but...
+ // For dispinterfaces, we first check the
+ // 2nd class and only then to the first "true" base.
+ //
+ tkind = GetTypeKind();
+ hvdefnBaseCur = hvdefnBaseFirst = ptdata->HvdefnFirstBase();
+ if (tkind == TKIND_COCLASS) {
+ // For coclasses, we attempt to bind to the DEFAULT
+ // dispinterface which isn't necessarily the first base
+ //
+ while (hvdefnBaseCur != HDEFN_Nil) {
+ qvdefnBase = ptdata->QvdefnOfHvdefn(hvdefnBaseCur);
+ hvdefnBaseNext = qvdefnBase->HdefnNext();
+ // Is this the DEFAULT dispinterface?
+ if (qvdefnBase->GetImplTypeFlags() == IMPLTYPEFLAG_FDEFAULT) {
+ break;
+ }
+ hvdefnBaseCur = hvdefnBaseNext;
+ }
+ }
+ else if (tkind == TKIND_DISPATCH) {
+ // for dispinterfaces we do the funky "start to bind at
+ // the 2nd base" thing of which there can only be one.
+ // In VBA1 we only support a single "embedded" interface.
+ // We ultimately bind to the 1st base.
+ //
+ DebAssert(hvdefnBaseCur != HDEFN_Nil,
+ "dispinterfaces must have a base class.");
+ hvdefnBaseCur = ptdata->QvdefnOfHvdefn(hvdefnBaseCur)->HdefnNext();
+ }
+
+ if (hvdefnBaseCur != HDEFN_Nil) {
+ qvdefnBase = ptdata->QvdefnOfHvdefn(hvdefnBaseCur);
+
+ qtdefnBase = ptdata->QtdefnOfHtdefn(qvdefnBase->Htdefn());
+ DebAssert(qtdefnBase->IsUserDefined(), "Bad base class.");
+
+ himptype = qtdefnBase->Himptype();
+
+ // Try to load the TYPEINFO.
+ IfErrRetHresult(ptdata->Pimpmgr()->GetTypeInfo(himptype,
+ DEP_None,
+ &ptinfo));
+
+ hresult = ptinfo->GetIDsOfNames(rgszNames, cNames, rgmemid);
+
+ ptinfo->Release();
+ }else{
+ hresult = HresultOfScode(DISP_E_UNKNOWNNAME);
+ }
+
+ // If dispinterface then
+ // if no match yet, then
+ // then finally check the first base.
+ //
+ if (tkind == TKIND_DISPATCH
+ && hresult == HresultOfScode(DISP_E_UNKNOWNNAME)) {
+
+ DebAssert(hvdefnBaseFirst != HDEFN_Nil,
+ "dispinterface must have base.");
+ qvdefnBase = ptdata->QvdefnOfHvdefn(hvdefnBaseFirst);
+
+ qtdefnBase = ptdata->QtdefnOfHtdefn(qvdefnBase->Htdefn());
+ DebAssert(qtdefnBase->IsUserDefined(), "Bad base class.");
+
+ himptype = qtdefnBase->Himptype();
+
+ // Try to load the TYPEINFO.
+ IfErrRetHresult(ptdata->Pimpmgr()->GetTypeInfo(himptype,
+ DEP_None,
+ &ptinfo));
+
+ hresult = ptinfo->GetIDsOfNames(rgszNames, cNames, rgmemid);
+
+ ptinfo->Release();
+ } // if dispinterface
+
+ break;
+#endif //EI_OLE
+
+ default:
+ // Undefined name
+ hresult = HresultOfScode(DISP_E_UNKNOWNNAME);
+ break;
+
+ } // switch
+
+ // fall through...
+Done:
+Error:
+ if (exbind.Ptinfo() != NULL) {
+ exbind.Ptinfo()->Release();
+ }
+ return hresult;
+}
+
+/***
+*PRIVATE GEN_DTINFO::IndexOfParam
+*Purpose:
+* Return the index in the given dispparams->rgvarg array of the
+* param identified by the given position.
+*
+* This is a helper for implementations of ITypeInfo::Invoke()
+*
+*Entry:
+* pdispparams = the dispparams struct to lookup in
+* uPos = the position of the param
+*
+*Exit:
+* return value = HRESULT
+*
+* *puIndex = the index in the rgvarg array of the param
+*
+***********************************************************************/
+HRESULT NEARCODE
+GEN_DTINFO::IndexOfParam(DISPPARAMS *pdispparams, UINT uPos, UINT *puIndex)
+{
+ int i;
+
+ // try for named parameter first (if there are any)
+
+ for (i = 0; i < (int)pdispparams->cNamedArgs; ++i)
+ if (pdispparams->rgdispidNamedArgs[i] == (DISPID)((int)uPos))
+ goto LGotIt;
+
+ // otherwise the param was passed positionally
+
+ i = pdispparams->cArgs - (int)uPos - 1;
+
+ if (i < (int)pdispparams->cNamedArgs)
+ return HresultOfScode(DISP_E_PARAMNOTFOUND);
+
+ DebAssert(i >= (int)pdispparams->cNamedArgs
+ && i < (int)pdispparams->cArgs, "");
+
+LGotIt:;
+ *puIndex = (UINT)i;
+
+ return NOERROR;
+}
+
+
+/***
+*PRIVATE HRESULT NEARCODE GEN_DTINFO::VariantVtOfTypedesc
+*Purpose:
+* Convert the given typeinfo TYPEDESC into a VARTYPE that can be represented
+* in a VARIANT. For some this is a 1:1 mapping, for others we convert to a
+* (possibly machine dependent, eg VT_INT->VT_I2) base type, and
+* others we cant represent in a VARIANT.
+*
+* This is a helper for implementatinos of ITypeInfo::Invoke()
+* and makes some assumptions about how the low level invocation
+* support routines expect to see things represented (void is
+* represented as VT_EMPTY for example).
+*
+*Entry:
+* lptdesc = * to the typedesc to convert
+* *pGuid -- NULL if caller doesn't care about this return value
+*
+*Exit:
+* return value = HRESULT
+*
+* *pvt = a VARTYPE that may be stored in a VARIANT.
+* *pGuid = a guid for a INTERFACE/DISPINTERFACE typeinfo (see below)
+*
+* *pfGotObjGuid = 0 no cached guid in *pGuid
+* *pfGotObjGuid = 1 Seen 'MyInterface' -- *pGuid contains MyInterface's guid
+* *pfGotObjGuid = 2 Seen 'MyInterface *' -- *pGuid contains the guid
+* NOTE: Not sufficient to check *pfGotObjGuid without
+* also checking *pvt, since the VT_BYREF and/or VT_ARRAY
+* bits could be or'ed in with VT_DISPATCH/VT_UNKNOWN
+*
+*
+***********************************************************************/
+HRESULT NEARCODE
+GEN_DTINFO::VariantVtOfTypedesc(TYPEDESC FAR* lptdesc,
+ USHORT * pfGotObjGuid,
+ GUID * pGuid,
+ VARTYPE FAR* pvt)
+{
+ HRESULT hresult = NOERROR;
+ ITypeInfo FAR * lptinfo;
+ LPTYPEATTR ptypeattr;
+ VARTYPE vt;
+
+ *pfGotObjGuid = 0; // haven't got a interface/dispinterface guid
+
+ if (lptdesc->vt <= VT_UNKNOWN || lptdesc->vt == VT_HRESULT || lptdesc->vt == VT_UI1)
+ {
+ // all types from VT_EMPTY (0) up to & including VT_UNKNOWN
+ *pvt = lptdesc->vt; // are dispatchable
+ }
+ else {
+
+ // Accept a limited set of non-simple types (like int's, alias's, and
+ // enum's) that we can easily handle.
+
+ switch (lptdesc->vt) {
+ case VT_INT:
+ // don't switch on the typelib's syskind, because at this point,
+ // we can/must assume that our syskind matches the syskind of
+ // the routine we are invoking.
+#if HP_16BIT
+ *pvt = VT_I2;
+#else
+ *pvt = VT_I4;
+#endif
+ break;
+
+ case VT_VOID:
+ *pvt = VT_EMPTY; // this is how DoInvoke() represents void
+ break;
+
+ case VT_USERDEFINED:
+ hresult = GetRefTypeInfo(lptdesc->hreftype, &lptinfo);
+ if (hresult == NOERROR) {
+ hresult = lptinfo->GetTypeAttr(&ptypeattr);
+ if (hresult == NOERROR) {
+ switch (ptypeattr->typekind) {
+ case TKIND_ENUM:
+ // don't switch on the typelib's syskind, because at this point,
+ // we can/must assume that our syskind matches the syskind of
+ // the routine we are invoking.
+#if HP_16BIT
+ *pvt = VT_I2;
+#else
+ *pvt = VT_I4;
+#endif
+ break;
+ case TKIND_ALIAS:
+ hresult = VariantVtOfTypedesc(&(ptypeattr->tdescAlias),
+ pfGotObjGuid,
+ pGuid,
+ pvt);
+ break;
+ case TKIND_COCLASS:
+ *pvt = VT_DISPATCH;
+ if(pGuid){
+ ITypeInfo *ptinfoDef;
+ TYPEATTR *ptypeattrDef;
+ INT impltypeflags;
+ UINT iImplType, cImplTypes = ptypeattr->cImplTypes;
+ HREFTYPE hreftype;
+
+ for(iImplType = 0; iImplType < cImplTypes; ++iImplType) {
+ IfOleErrGo(lptinfo->GetImplTypeFlags(iImplType,
+ &impltypeflags));
+
+ if (IMPLTYPEFLAG_FDEFAULT
+ == (impltypeflags
+ & (IMPLTYPEFLAG_FDEFAULT
+ | IMPLTYPEFLAG_FSOURCE))) {
+
+ // Found It!
+ IfOleErrGo(lptinfo->GetRefTypeOfImplType(iImplType,
+ &hreftype));
+
+ IfOleErrGo(lptinfo->GetRefTypeInfo(hreftype,
+ &ptinfoDef));
+ break;
+ } // if
+ } // for
+
+ DebAssert(iImplType != cImplTypes, "No default base.");
+
+ hresult = ptinfoDef->GetTypeAttr(&ptypeattrDef);
+
+ if (hresult == NOERROR) {
+ *pGuid = ptypeattrDef->guid;
+ ptinfoDef->ReleaseTypeAttr(ptypeattrDef);
+ }
+
+ ptinfoDef->Release();
+ }
+ (*pfGotObjGuid)++; // set flag to 1
+ break;
+ case TKIND_INTERFACE:
+ *pvt = VT_UNKNOWN;
+ goto StuffGuid;
+#if EI_OB
+ case TKIND_CLASS:
+#endif // EI_OB
+ case TKIND_DISPATCH:
+ *pvt = VT_DISPATCH;
+StuffGuid:
+ if (pGuid) { // only if we care about this info
+ *pGuid = ptypeattr->guid;
+ }
+ (*pfGotObjGuid)++; // set flag to 1
+ break;
+ default:
+ hresult = HresultOfScode(DISP_E_BADVARTYPE);
+ } // switch
+Error:
+ lptinfo->ReleaseTypeAttr(ptypeattr);
+ }
+ lptinfo->Release();
+ }
+ break;
+
+ case VT_PTR:
+ hresult = VariantVtOfTypedesc(lptdesc->lptdesc,
+ pfGotObjGuid,
+ pGuid,
+ &vt);
+ if (hresult == NOERROR) {
+ if (*pfGotObjGuid == 1) {
+ DebAssert(vt == VT_DISPATCH || vt == VT_UNKNOWN, "");
+ *pvt = vt; // don't OR in VT_BYREF here
+ (*pfGotObjGuid)++; // set flag to 2
+ } else
+ if (vt & VT_BYREF) {
+ // error if nested pointer type
+ hresult = HresultOfScode(DISP_E_BADVARTYPE);
+ } else {
+ *pvt = (vt | VT_BYREF);
+ }
+ }
+ break;
+
+ case VT_SAFEARRAY:
+ hresult = VariantVtOfTypedesc(lptdesc->lptdesc,
+ pfGotObjGuid,
+ pGuid,
+ &vt);
+ if (hresult == NOERROR) {
+ if (vt & (VT_BYREF | VT_ARRAY)) {
+ // error if nested array or array of pointers
+ hresult = HresultOfScode(DISP_E_BADVARTYPE);
+ } else {
+ *pvt = (vt | VT_ARRAY);
+ }
+ }
+ break;
+
+ default:
+ // don't know how to handle other non-simple VT_xxx types.
+ hresult = HresultOfScode(DISP_E_BADVARTYPE);
+ } // switch
+ } // if
+
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT NEARCODE GEN_DTINFO::VariantVtOfHtdefn
+*Purpose:
+* Obtain an Variant-compatible vt type for the given htdefn, or
+* return an error if this is not possible.
+*
+*Entry:
+* htdefn = the htdefn to look at
+* ptdata = the tdata
+* fSimpleType = is this htdefn a simple type or not
+* pVt = where to put the resulting VARTYPE
+*
+*Exit:
+* return value = HRESULT
+*
+* *pvt = a VARTYPE that may be stored in a VARIANT.
+*
+***********************************************************************/
+HRESULT NEARCODE
+GEN_DTINFO::VariantVtOfHtdefn(HTYPE_DEFN htdefn,
+ TYPE_DATA * ptdata,
+ BOOL fSimpleType,
+ USHORT * pfGotObjGuid,
+ GUID * pGuid,
+ VARTYPE FAR * pVt)
+{
+ HRESULT hresult;
+ TYPEDESC typedesc;
+ TIPERROR err;
+
+ IfErrRetHresult(ptdata->AllocTypeDescOfTypeDefn(htdefn,
+ fSimpleType,
+ &typedesc));
+ hresult = VariantVtOfTypedesc(&typedesc,
+ pfGotObjGuid,
+ pGuid,
+ pVt);
+
+ // don't need the typedesc anymore
+ ClearTypeDesc(&typedesc);
+ return hresult;
+
+}
+
+#if OE_MAC && !OE_DLL || OE_MACPPC // mac static lib version can't do this
+#define DoInvoke(a,b,c,d,e,f,g,h) HresultOfScode(E_NOTIMPL);
+#else //OE_MAC && !OE_DLL
+
+#if EI_OB
+// OB must have it's own low-level dispatch helper. It cannot use the OLE
+// version because the DoInvokeMethod API exposed by ole2disp.dll is private
+// and can only be used by typelib.dll.
+STDAPI
+DoInvoke(
+ void FAR* pvInstance,
+ unsigned int oVft,
+ CALLCONV cc,
+ VARTYPE vtReturn,
+ unsigned int cActuals,
+ VARTYPE FAR* rgvt,
+ VARIANTARG FAR* FAR* rgpvarg,
+ VARIANT FAR* pvarResult);
+#else //EI_OB
+STDAPI
+DoInvokeMethod(
+ void FAR* pvInstance,
+ unsigned int oVft,
+ CALLCONV cc,
+ VARTYPE vtReturn,
+ unsigned int cActuals,
+ VARTYPE FAR* rgvt,
+ VARIANTARG FAR* FAR* rgpvarg,
+ VARIANT FAR* pvarResult);
+
+#define DoInvoke DoInvokeMethod
+#endif //EI_OB
+#endif //OE_MAC && !OE_DLL
+
+#if VBA3 && !EI_VBARUN && OE_WIN32 // helper function for invoking functions in standard module
+STDAPI
+DoInvokeFunction(
+// void FAR* pvInstance, // must pass NULL
+ VOID * pvTemplate,
+ CALLCONV cc,
+ VARTYPE vtReturn,
+ unsigned int cActuals,
+ VARTYPE FAR* rgvt,
+ VARIANTARGA FAR* FAR* rgpvarg,
+ VARIANTA FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo);
+#endif
+
+
+
+/***
+*PUBLIC GEN_DTINFO(VOID FAR*, INVOKEDESC FAR*)
+*Purpose:
+* Invoke the method identified by the given memid and wFlags,
+* using the parameters in the given dispparams struct on the
+* given instance.
+*::Invoke
+*Entry:
+* pvInstance = the instance to invoke on or NULL if this is a standard module's gtdinfo
+* memid = the MEMBERID of the method to invoke
+* wFlags = the 'kind' of the invocation
+* pdispparams = the arguments to the method
+*
+*Exit:
+* return value = HRESULT
+*
+* *pvarResult = the return value from the method
+* *pexcepinfo = a structure of extended error (exception) info
+* if the return value was DISP_E_EXCEPTION
+* *puArgErr = the index of the offending argument if a
+* typemismatch occured
+*
+*
+*Change made on Oct 20,94 for supporting UDF: (meichint)
+*Note:
+*
+*Implementation note:
+* (1) Return value issues:(for OB)
+* * If the memid is a function, the return value can be disgarded. Local variable
+* varResult is used to temporarily hold the return value when invoking either
+* DoInvoke or DoInvokeFunction.
+* * If the memid is a subroutine, the design is that an error of Type_Mismatch
+* will be generated when invoked with nonNULL pvarResult.
+*
+* (2) In the case of TKIND_MODULE
+* * If GetTypeKind()==TKIND_MODULE, vtable doesn't exist. Therefore,
+* we invoke with the native entry point of the memid through DoInvokeFunction
+* * AddressOfMember is used to retrieve native entry point
+* * In the case of OB, pvarResult must be of NULL value if the method
+* to be invoked is a subroutine rather than a function.(This is by
+* design so that we can catch this compiler error at runtime.)
+***********************************************************************/
+HRESULT GEN_DTINFO::Invoke(VOID FAR* pvInstance,
+ MEMBERID memid,
+ WORD wFlags,
+ DISPPARAMS FAR *pdispparams,
+ VARIANT FAR *pvarResult,
+ EXCEPINFO FAR *pexcepinfo,
+ UINT FAR *puArgErr)
+{
+ TIPERROR err;
+ HRESULT hresult;
+ UINT uArgErr;
+ VARTYPE vtReturn;
+ VARTYPE vtReturnTypeinfo;
+ VARIANT varResult; // temporary result holder if pvarResult==NULL
+ VARIANT *pvarRetval = NULL;
+ VARIANT bufRetval; // big enough to hold a variant
+ TYPE_DATA *ptdata;
+ FUNC_DEFN *qfdefn;
+ HFUNC_DEFN hfdefn;
+ INVOKEARGS *pinvargs;
+ DYN_TYPEMEMBERS *pdtmbrs;
+ LCID lcid;
+ ITypeInfo FAR* ptinfo;
+ USHORT fGotObjGuid;
+ CALLINGCONVENTION cc;
+#if EI_OB
+ BOOL fClean;
+ BOOL fIsSub;
+#endif // EI_OB
+ BOOL fPropParamSplit = FALSE; // TRUE if we're splitting the parameter
+ // list on a collection lookup.
+ // (vba3 bug #4481)
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ BOOL isModule = 0; // TRUE if we're invoking a method of a standard module
+ LPVOID pvTemplate; // native entry point
+ INVOKEKIND invkind; // type casting for wFlags
+
+ invkind = (INVOKEKIND) wFlags;
+#endif
+
+ DebAssert(m_pdtroot->CompState() >= CS_DECLARED, "");
+
+ switch(GetTypeKind()) {
+#if EI_OB
+ // pretend this is an interface, its supposed to have all
+ // of the necessarry info, in all of the correct places.
+ case TKIND_CLASS:
+#endif
+ case TKIND_INTERFACE:
+ break;
+
+ case TKIND_DISPATCH:
+#if EI_OLE
+ // If this is a funky dispinterface, i.e. defined in terms
+ // of an interface, then recursively call invoke on the
+ // second base member (the "pseudo-base" interface).
+ // Note that this is the ONLY way currently (v1) to invoke
+ // a method on a dispinterface.
+ //
+ BOOL isFunkyDispinterface;
+
+ IfOleErrRet(HresultOfTiperr(
+ IsFunkyDispinterface(this, &isFunkyDispinterface)));
+ if (isFunkyDispinterface) {
+ // "pseudo-base"
+ IfOleErrRet(GetTypeInfoOfImplType(this, 1, &ptinfo));
+ hresult = ptinfo->Invoke(pvInstance,
+ memid,
+ wFlags,
+ pdispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+ ptinfo->Release();
+ return hresult;
+ }
+#endif // EI_OLE
+
+ return HresultOfScode(DISP_E_MEMBERNOTFOUND);
+
+ case TKIND_COCLASS:
+#if 0 //CONSIDER: activate for V2. don't want to pay the testing
+ //CONSIDER: cost for V1
+ { // recursively call invoke on the first member of CoClass
+ // NOTE: this assumes that the first implemented interface is what we
+ // want to invoke on. This may be incorrect.
+
+ // CONSIDER: the following is implemented using the public TypeInfo
+ // interface - there may be a more efficient internal way to do this.
+
+ HREFTYPE hreftype;
+
+ if ((hresult = GetRefTypeOfImplType(0, &hreftype)) != NOERROR)
+ return hresult;
+ if ((hresult = GetRefTypeInfo(hreftype, &ptinfo)) != NOERROR)
+ return hresult;
+
+ hresult = ptinfo->Invoke(pvInstance,
+ memid,
+ wFlags,
+ pdispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+ ptinfo->Release();
+
+ return hresult;
+ }
+#endif //0
+
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ return HresultOfScode(E_NOTIMPL);
+#endif
+
+ case TKIND_MODULE: //CONSIDER: maybe implement for V2
+#if VBA3 && !EI_VBARUN && OE_WIN32 // TKIND_MODULE is implemented for mercury
+ isModule = 1;
+ break;
+#else
+ return HresultOfScode(E_NOTIMPL);
+#endif
+
+ default:
+ // cant invoke on anything else.
+ return HresultOfScode(E_INVALIDARG);
+ } // end switch
+
+#if EI_OLE // simple parm validation
+ if (pvInstance == NULL || pdispparams == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+#endif //EI_OLE
+
+ // design issue :
+ // When invoking a function, the return value can be disgarded.
+ // Thus varResult is disposable placeholder for the return value if the caller is not
+ // expecting a return value.
+ if (puArgErr == NULL)
+ puArgErr = &uArgErr;
+ if (pvarResult == NULL) {
+ varResult.vt = VT_EMPTY;
+ pvarResult = &varResult;
+ }
+
+#if ID_DEBUG // param validation
+#if OE_WIN16
+ if (IsBadReadPtr(pvInstance, sizeof(void FAR*)))
+ return HresultOfScode(E_INVALIDARG);
+ // CONSIDER: need a debug routine to check the contents of the following
+ if (IsBadReadPtr(pdispparams, sizeof(*pdispparams)))
+ return HresultOfScode(E_INVALIDARG);
+ if (IsBadWritePtr(pvarResult, sizeof(*pvarResult)))
+ return HresultOfScode(E_INVALIDARG);
+ if (IsBadWritePtr(puArgErr, sizeof(*puArgErr)))
+ return HresultOfScode(E_INVALIDARG);
+#endif
+#endif
+
+#if EI_OLE
+ // make sure no illegal wFlags are set
+ if (!IsLegalInvokeFlags(wFlags))
+ return HresultOfScode(E_INVALIDARG);
+#else //EI_OLE
+ DebAssert(IsLegalInvokeFlags(wFlags), "bogus flags");
+#endif //EI_OLE
+
+ IfErrRetHresult(m_pdtroot->GetDtmbrs(&pdtmbrs));
+ ptdata = pdtmbrs->Ptdata();
+
+ // 1. lookup the hdefn corresponding to the given memid & wFlags
+
+#if EI_OB
+ err = ptdata->HfdefnOfAnyHmember(memid,
+ wFlags,
+ &hfdefn,
+ &fClean);
+
+ if (err == TIPERR_FuncArityMismatch) {
+ return HresultOfScode(DISP_E_BADPARAMCOUNT);
+ }
+ else if (err != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ if (hfdefn != HFUNCDEFN_Nil) {
+#else // !EI_OB
+ if ((hfdefn = ptdata->HfdefnOfHmember(memid, wFlags)) != HFUNCDEFN_Nil) {
+#endif // !EI_OB
+
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ if (isModule)
+ IfFailGoTo(AddressOfMember( memid,
+ invkind,
+ &pvTemplate),
+ Error);
+#endif
+
+ // validate the arg count
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+
+ UINT cArgsMax = qfdefn->CArgs(); // don't count LCID & RETVAL parms
+ UINT cArgsOpt = qfdefn->CArgsOpt();
+ UINT cArgsReq;
+
+ if (cArgsOpt == -1) { // vararg case
+ cArgsReq = cArgsMax - 1; // don't include SAFEARRAY in min # of args
+ cArgsMax = (UINT)~0; // no upper limit on # of args
+ if (pdispparams->cNamedArgs != 0) {
+ // named args aren't allowed in a vararg function
+ hresult = HresultOfScode(DISP_E_NONAMEDARGS);
+ goto Error;
+ }
+ }
+ else {
+ cArgsReq = cArgsMax - cArgsOpt;
+ }
+
+ if (pdispparams->cArgs <= cArgsMax) {
+ if (pdispparams->cArgs >= cArgsReq) {
+ // legal parameter counts
+ goto LInvokeStandard;
+ }
+ }
+ else { // more args than the maximum
+
+ // handle possible indexed collection property access
+ // We allow property get with 0 args, and property put/putref
+ // where the matching property get function takes 0 args
+ //
+ // We also allow a property put/putref where the matching
+ // property get function takes all but the RHS parameter.
+ // (vba2 bug #4481).
+ //
+ if (IsPropGet(wFlags)) {
+ if (cArgsMax == 0)
+ goto LCollectionProperty;
+ }
+ else if (IsPropPut(wFlags)) {
+#if EI_OB
+ if (fClean) {
+ ptdata->FreeFuncDefn(hfdefn);
+ }
+ err = ptdata->HfdefnOfAnyHmember(memid,
+ (INVOKEKIND) DISPATCH_PROPERTYGET,
+ &hfdefn,
+ &fClean);
+
+ if (err == TIPERR_FuncArityMismatch) {
+ return HresultOfScode(DISP_E_BADPARAMCOUNT);
+ }
+ else if (err != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+ if (hfdefn != HFUNCDEFN_Nil) {
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs() == 0) {
+ if (isModule)
+ IfFailGoTo(AddressOfMember(memid,
+ INVOKE_PROPERTYGET,
+ &pvTemplate),
+ Error);
+ goto LCollectionProperty;
+ }
+#else
+ if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs() == 0) {
+ goto LCollectionProperty;
+ }
+#endif
+ // Allow the property put function takes all of the arguments
+ // except for the RHS parameter. (vba2 bug #4481)
+ //
+ else if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs()
+ == pdispparams->cArgs - 1) {
+
+ fPropParamSplit = TRUE;
+ goto LCollectionProperty;
+ }
+ }
+#else // !EI_OB
+ // UNDONE OA95: more code could be shared between OA and OB.
+ if ((hfdefn = ptdata->HfdefnOfHmember(memid, DISPATCH_PROPERTYGET))
+ != HFUNCDEFN_Nil) {
+
+ if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs() == 0) {
+ goto LCollectionProperty;
+ }
+ // Allow the property put function takes all of the arguments
+ // except for the RHS parameter. (vba2 bug #4481)
+ //
+ else if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs()
+ == pdispparams->cArgs - 1) {
+
+ fPropParamSplit = TRUE;
+ goto LCollectionProperty;
+ }
+ }
+#endif // !EI_OB
+ }
+ }
+
+ hresult = HresultOfScode(DISP_E_BADPARAMCOUNT);
+ goto Error;
+ }
+
+ // Member not found... but there is one more special case to check for.
+ //
+ // This may be an indexed collection PropertyPut where the collection
+ // property itself has only a get method.
+
+ if (IsPropPut(wFlags)) {
+#if EI_OB
+ // We know there is no put/putref -- now ensure there is no putref/put
+ err = ptdata->HfdefnOfAnyHmember(memid,
+ (wFlags == DISPATCH_PROPERTYPUT)
+ ? DISPATCH_PROPERTYPUTREF
+ : DISPATCH_PROPERTYPUT,
+ &hfdefn,
+ &fClean);
+
+ if (err == TIPERR_FuncArityMismatch) {
+ return HresultOfScode(DISP_E_BADPARAMCOUNT);
+ }
+ else if (err != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ if (hfdefn == HFUNCDEFN_Nil) {
+ // no put or putref -- see if there is a get
+ err = ptdata->HfdefnOfAnyHmember(memid,
+ DISPATCH_PROPERTYGET,
+ &hfdefn,
+ &fClean);
+
+ if (err == TIPERR_FuncArityMismatch) {
+ return HresultOfScode(DISP_E_BADPARAMCOUNT);
+ }
+ else if (err != TIPERR_None) {
+ return HresultOfTiperr(err);
+ }
+
+ if (hfdefn != HFUNCDEFN_Nil) {
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ if (isModule)
+ IfFailGoTo(AddressOfMember( memid,
+ INVOKE_PROPERTYGET,
+ &pvTemplate),
+ Error);
+#endif
+ if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs() == 0) {
+ goto LCollectionProperty;
+ }
+ // Allow the property put function takes all of the arguments
+ // except for the RHS parameter. (vba2 bug #4481)
+ //
+ else if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs()
+ == pdispparams->cArgs - 1) {
+
+ fPropParamSplit = TRUE;
+ goto LCollectionProperty;
+ }
+ }
+ }
+#else // !EI_OB
+ // We know there is no put/putref -- now ensure there is no putref/put
+ if (ptdata->HfdefnOfHmember(memid,
+ (wFlags == DISPATCH_PROPERTYPUT) ?
+ DISPATCH_PROPERTYPUTREF :
+ DISPATCH_PROPERTYPUT
+ ) == HFUNCDEFN_Nil) {
+ // no put or putref -- see if there is a get
+ if ((hfdefn = ptdata->HfdefnOfHmember(memid, DISPATCH_PROPERTYGET))
+ != HFUNCDEFN_Nil) {
+
+ if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs() == 0) {
+ goto LCollectionProperty;
+ }
+ // Allow the property put function takes all of the arguments
+ // except for the RHS parameter. (vba2 bug #4481)
+ //
+ else if (ptdata->QfdefnOfHfdefn(hfdefn)->CArgs()
+ == pdispparams->cArgs - 1) {
+
+ fPropParamSplit = TRUE;
+ goto LCollectionProperty;
+ }
+ }
+ }
+#endif // !EI_OB
+//#if EI_OB
+
+ }
+
+ // Yet another special case to check for. If we have a base interface,
+ // then this member could be defined in it. Recurse.
+
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ if (isModule) // for TKIND_MODULE, there is no base class
+ return HresultOfScode(DISP_E_MEMBERNOTFOUND);
+#endif
+
+#if EI_OB
+ DebAssert(GetTypeKind() == TKIND_INTERFACE || GetTypeKind() == TKIND_CLASS, "assuming interface");
+#else
+ DebAssert(GetTypeKind() == TKIND_INTERFACE, "assuming interface");
+#endif
+
+ if (ptdata->CBase() > 0) {
+ // recurse on first (only) base interface
+ DebAssert(ptdata->CBase() == 1, "no multiple-inheritance");
+ IfOleErrRet(GetTypeInfoOfImplType(this, 0, &ptinfo));
+ hresult = ptinfo->Invoke(pvInstance,
+ memid,
+ wFlags,
+ pdispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+ ptinfo->Release();
+ return hresult;
+ }
+
+ return HresultOfScode(DISP_E_MEMBERNOTFOUND);
+
+
+LInvokeStandard:;
+//upon entry :: if TKIND_MODULE case : pvTemplate is the native entry point
+// hfdefn describes the function
+
+// gather and coerce the actuals
+ hresult = GetInvokeArgs(hfdefn,
+ ptdata,
+ wFlags,
+ pdispparams,
+ &pvarRetval,
+ (VOID *)&bufRetval,
+ &pinvargs,
+ puArgErr,
+ FALSE);
+ if (hresult != NOERROR) {
+ goto Error;
+ }
+
+ // WARNING: All error paths after this point must free pinvargs!
+
+ // get (and potentially translate) the return type
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+
+#if EI_OB
+ fIsSub = qfdefn->IsSub(); // put in a local 'cause it's big & slow
+ // Error if we're trying to invoke a Basic Sub late-bound and our caller
+ // passed us a pVarResult parm (meaning that Basic code is calling trying
+ // to call a sub as a function). This is a compile-time error in the
+ // early-bound case. Latebound, the best we can do is a runtime error in
+ // the IDE. There will be no error in a made exe (since the default OLE
+ // implementation is used), but those are the breaks.
+ //
+ // Note that it is an error when a return value is expeccted by caller
+ // while calling a subroutine.
+ if (fIsSub && pvarResult != &varResult) {
+ hresult = HresultOfScode(DISP_E_TYPEMISMATCH); // CONSIDER: better error?
+ goto LError2;
+ }
+ if (fIsSub && !qfdefn->IsMunged()){
+#else // !EI_OB
+ if (qfdefn->IsSub()){
+#endif // !EI_OB
+ vtReturn = vtReturnTypeinfo = VT_EMPTY;
+ } else {
+#if EI_OB
+ hresult = VariantVtOfHtdefn(qfdefn->m_ftdefn.HtdefnResultUnmunged(),
+ ptdata,
+ qfdefn->m_ftdefn.IsSimpleTypeResultUnmunged(),
+ &fGotObjGuid,
+ // don't need the guid if Retval is an object
+ NULL,
+ &vtReturnTypeinfo);
+#else // EI_OLE
+ hresult = VariantVtOfHtdefn(qfdefn->m_ftdefn.HtdefnResult(),
+ ptdata,
+ qfdefn->m_ftdefn.IsSimpleTypeResult(),
+ &fGotObjGuid,
+ // don't need the guid if Retval is an object
+ NULL,
+ &vtReturnTypeinfo);
+#endif // EI_OLE
+
+ if (hresult != NOERROR) {
+ goto LError2;
+ } // Do we allow VT_HRESULT for module case??? We don't allow it for class's case....
+ vtReturn = (vtReturnTypeinfo == VT_HRESULT) ? VT_ERROR : vtReturnTypeinfo;
+ }
+
+ // call the low-level invocation helper
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+#if EI_OB
+ cc = qfdefn->m_ftdefn.CcUnmunged();
+#else // EI_OLE
+ cc = qfdefn->m_ftdefn.Cc();
+#endif // EI_OLE
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+
+
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ if (isModule)
+ hresult = DoInvokeFunction(pvTemplate,
+ cc,
+ vtReturn,
+ pinvargs->cArgs,
+ pinvargs->rgvt,
+ (VARIANTARG FAR* FAR*)pinvargs->rgpvarg,
+ (VARIANT FAR*)pvarResult,
+ pexcepinfo);
+ else
+#endif
+ hresult = DoInvoke(pvInstance,
+ (SHORT)((VIRTUAL_FUNC_DEFN*)qfdefn)->Ovft(),
+ cc,
+ vtReturn,
+ pinvargs->cArgs,
+ pinvargs->rgvt,
+ (VARIANTARG FAR* FAR*)pinvargs->rgpvarg,
+ (VARIANT FAR*)pvarResult);
+
+ // copy back the Byref args passed to Byref Variants, if any
+ if (hresult == NOERROR) {
+ hresult = CopyBackByrefArgs(pinvargs);
+ }
+
+ // if the return type of this function is HRESULT, then we want to
+ // fill in the excepinfo structure if the function returned an error
+ if (hresult == NOERROR) {
+ if (vtReturnTypeinfo == VT_HRESULT) {
+ DebAssert(pvarResult->vt == VT_ERROR, "bad func return type");
+ if (FAILED(pvarResult->scode)) {
+ // Put the specific error the function returned into the
+ // excepinfo structure.
+ if (pexcepinfo != NULL) {
+ //
+ // UNDONE: need to check and see if this instance supports
+ // UNDONE: rich error information before we do the following...
+ //
+
+ GetErrorInfo(pexcepinfo); // zeros out *pexcepinfo
+ // stuff error code from function in excepinfo structure
+ pexcepinfo->scode = pvarResult->scode;
+ }
+ // signal that the excepinfo structure contains error info.
+ hresult = HresultOfScode(DISP_E_EXCEPTION);
+ }
+ else {
+ // if the retval arg was specified, then the function put it's real
+ // return value in *pvarRetval. Copy this to pvarResult. Ok to
+ // just overwrite *pvarResult because it's not an owner.
+ if (pvarRetval) {
+ DebAssert(pvarRetval->vt & VT_BYREF, "not a byref return");
+ vtReturn = (pvarRetval->vt & ~VT_BYREF);
+ if (vtReturn == VT_VARIANT) {
+ *pvarResult = bufRetval; // copy entire variant returned
+ } else {
+ pvarResult->vt = vtReturn; // set tag
+ memcpy(&pvarResult->iVal, &bufRetval, 8); // copy data
+ }
+ goto RealRetVal;
+ }
+ }
+ // HRESULT-returning function with no retval parm should act like a SUB
+ pvarResult->vt = VT_EMPTY;
+RealRetVal:;
+ }
+
+ // if we put the result into a temporary, must discard it
+ if (pvarResult == &varResult) {
+ VariantClear(pvarResult);
+ }
+ }
+
+LError2:
+ ReleaseInvokeArgs(pinvargs);
+
+ goto Error;
+
+LCollectionProperty:;
+ // upon entry : pvTemplate and hfdefn should be set up as LInvokeStandard
+
+ VARIANT varTmp;
+ // don't have to init this because routine is a property get function,
+ // and is guaranteed to return some sort of value in here.
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+
+ DebAssert(qfdefn->CArgs()==0
+ || fPropParamSplit && qfdefn->CArgs() == pdispparams->cArgs - 1,
+ ""); // munged arg count
+
+ DebAssert(qfdefn->InvokeKind() == INVOKE_PROPERTYGET, "");
+
+ // get the propget function's return type from the typelib
+#if EI_OB
+ hresult = VariantVtOfHtdefn(qfdefn->m_ftdefn.HtdefnResultUnmunged(),
+ ptdata,
+ qfdefn->m_ftdefn.IsSimpleTypeResultUnmunged(),
+ &fGotObjGuid,
+ // don't need the guid if Retval is an object
+ // UNDONE: maybe use the guid below???
+ NULL,
+ &vtReturnTypeinfo);
+#else // EI_OLE
+ hresult = VariantVtOfHtdefn(qfdefn->m_ftdefn.HtdefnResult(),
+ ptdata,
+ qfdefn->m_ftdefn.IsSimpleTypeResult(),
+ &fGotObjGuid,
+ // don't need the guid if Retval is an object
+ // UNDONE: maybe use the guid below???
+ NULL,
+ &vtReturnTypeinfo);
+#endif // EI_OLE
+
+ if (hresult != NOERROR)
+ goto Error;
+
+ if (qfdefn->CArgsUnmunged() == 0) {
+ // "normal" case of no retval/lcid hidden params, no param split
+ switch (vtReturnTypeinfo) {
+ case VT_DISPATCH:
+ case VT_VARIANT:
+ break; // these are ok
+ default:
+ hresult = HresultOfScode(DISP_E_NOTACOLLECTION);
+ goto Error;
+ } // end switch
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+#if EI_OB
+ cc = qfdefn->m_ftdefn.CcUnmunged();
+#else // EI_OLE
+ cc = qfdefn->m_ftdefn.Cc();
+#endif // EI_OLE
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ if (isModule)
+ hresult = DoInvokeFunction(pvTemplate,
+ cc,
+ vtReturnTypeinfo,
+ 0,
+ NULL,
+ NULL,
+ (VARIANT FAR *)&varTmp,
+ pexcepinfo);
+ else
+#endif
+ // Invoke the PropertyGet
+ hresult = DoInvoke(pvInstance,
+ (SHORT)((VIRTUAL_FUNC_DEFN*)qfdefn)->Ovft(),
+ (CALLCONV)cc,
+ vtReturnTypeinfo,
+ 0, NULL, NULL,
+ (VARIANT FAR *)&varTmp);
+ } else {
+ // Bummer -- we have lcid and/or retval hidden params
+ // UNDONE: (dougf) For code size, is there any way we can combine this with
+ // UNDONE: the InvokeStandard code above?
+
+ // alloc the invoke args structure & fill in lcid/retval args
+
+ hresult = GetInvokeArgs(hfdefn,
+ ptdata,
+ wFlags,
+ pdispparams,
+ &pvarRetval,
+ (VOID *)&bufRetval,
+ &pinvargs,
+ puArgErr,
+ fPropParamSplit);
+
+ if (hresult != NOERROR)
+ goto Error;
+
+ // WARNING: All error paths after this point must free pinvargs!
+
+ vtReturn = (vtReturnTypeinfo == VT_HRESULT) ? VT_ERROR : vtReturnTypeinfo;
+
+ switch (vtReturnTypeinfo) {
+ case VT_DISPATCH:
+ case VT_VARIANT:
+ break; // these are ok
+ case VT_HRESULT:
+ // ensure that the 'retval' type is VT_DISPATCH or VT_VARIANT
+ // error if no 'retval' type.
+ if (pvarRetval) {
+ // It's inconvienient to check the return type of 'retval' parm
+ // here (to see if it's VT_DISPATCH or VT_VARIANT). So we'll
+ // just go ahead and do the Invoke in this case, and catch the
+ // error later if it is a problem.
+ break;
+ }
+ // fall through to give error
+ default:
+ ReleaseInvokeArgs(pinvargs);
+ hresult = HresultOfScode(DISP_E_NOTACOLLECTION);
+ goto Error;
+ } // end of switch
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+#if EI_OB
+ cc = qfdefn->m_ftdefn.CcUnmunged();
+#else // EI_OLE
+ cc = qfdefn->m_ftdefn.Cc();
+#endif // EI_OLE
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+ // Invoke the PropertyGet
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ if (isModule)
+ hresult = DoInvokeFunction(pvTemplate,
+ cc,
+ vtReturn,
+ pinvargs->cArgs,
+ pinvargs->rgvt,
+ (VARIANTARG FAR* FAR*)pinvargs->rgpvarg,
+ (VARIANT FAR*)pvarResult,
+ pexcepinfo);
+ else
+#endif
+ hresult = DoInvoke(pvInstance,
+ (SHORT)((VIRTUAL_FUNC_DEFN*)qfdefn)->Ovft(),
+ cc,
+ vtReturn,
+ pinvargs->cArgs,
+ pinvargs->rgvt,
+ (VARIANTARG FAR* FAR*)pinvargs->rgpvarg,
+ (VARIANT FAR*)&varTmp);
+
+ // if the return type of this function is HRESULT, then we want to
+ // fill in the excepinfo structure if the function returned an error
+ if (hresult == NOERROR) {
+ if (vtReturnTypeinfo == VT_HRESULT) {
+ DebAssert(varTmp.vt == VT_ERROR, "bad func return type");
+ if (varTmp.scode != NOERROR) {
+ // Ignore the specific error the function returned (since we have
+ // no place to put it), and fill in the excepinfo structure with
+ // a lame generic error.
+ if (pexcepinfo != NULL) {
+ // zero/NULL all fields initially
+ GetErrorInfo(pexcepinfo); // zeros out *pexcepinfo
+ // stuff error code from function in excepinfo structure
+ pexcepinfo->scode = GetScode(varTmp.scode);
+ }
+ // signal that the excepinfo structure contains error info.
+ hresult = HresultOfScode(DISP_E_EXCEPTION);
+ } else {
+ // if the retval arg was specified, then the function put it's real
+ // return value in *pvarRetval. Copy this to varTmp. Ok to
+ // just overwrite varTmp because it's not an owner.
+ if (pvarRetval) {
+ DebAssert(pvarRetval->vt & VT_BYREF, "not a byref return");
+ vtReturn = (pvarRetval->vt & ~VT_BYREF);
+ if (vtReturn == VT_VARIANT) {
+ varTmp = bufRetval; // copy entire variant returned
+ } else {
+ varTmp.vt = vtReturn; // set tag
+ memcpy(&varTmp.iVal, &bufRetval, 8); // copy data
+ }
+ }
+ }
+ }
+ }
+ ReleaseInvokeArgs(pinvargs);
+ }
+
+ if (hresult != NOERROR)
+ goto Error;
+
+ // If the property returns an object, then delegate to it
+
+ if (V_VT(&varTmp) != VT_DISPATCH) {
+ hresult = HresultOfScode(DISP_E_NOTACOLLECTION);
+ } else if (V_DISPATCH(&varTmp) == NULL) {
+ hresult = HresultOfScode(DISP_E_MEMBERNOTFOUND);
+
+ } else {
+ UINT cArgsDisp, cNamedArgsDisp;
+
+ if ((err = GetLcid(&lcid)) != TIPERR_None) {
+ hresult = HresultOfTiperr(err);
+ goto LError1;
+ }
+#if VBA3 && !EI_VBARUN && OE_WIN32
+ if (isModule)
+ hresult = DoInvokeFunction(pvTemplate,
+ cc,
+ vtReturn,
+ pinvargs->cArgs,
+ pinvargs->rgvt,
+ (VARIANTARG FAR* FAR*)pinvargs->rgpvarg,
+ (VARIANT FAR*)pvarResult,
+ pexcepinfo);
+ else
+#endif
+ // If we're splitting the parameters, only "pass"
+ // the RHS parameter. Fortunately, it's always the first
+ // in the pdisparams array. (vba2 bug #4481)
+ //
+ if (fPropParamSplit) {
+ cArgsDisp = pdispparams->cArgs;
+ cNamedArgsDisp = pdispparams->cNamedArgs;
+
+ pdispparams->cArgs = pdispparams->cNamedArgs = 1;
+ }
+
+ hresult = V_DISPATCH(&varTmp)->Invoke(DISPID_VALUE,
+ IID_NULL,
+ lcid,
+ wFlags,
+ pdispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+
+ // Fix the dispparams structure, if we've modified it. (vba2 bug #4481)
+ if (fPropParamSplit) {
+ pdispparams->cArgs = cArgsDisp;
+ pdispparams->cNamedArgs = cNamedArgsDisp;
+ }
+
+ // if we put the result into a temporary, must discard it
+ if (hresult == NOERROR && pvarResult == &varResult) {
+ VariantClearA(pvarResult);
+ }
+ }
+
+LError1:;
+ VariantClear(&varTmp);
+
+Error:
+#if EI_OB
+ if (fClean) {
+ ptdata->FreeFuncDefn(hfdefn);
+ }
+#endif // EI_OB
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT NEARCODE GEN_DTINFO::CoerceArg
+*Purpose:
+* Helper function for GetInvokeArgs
+* Coerces an a argument to a given type
+*
+*Entry:
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT NEARCODE GEN_DTINFO::CoerceArg
+(
+ VARIANTARG FAR* pvargSrc, // * to source variant
+ VARTYPE vt, // destination VT type
+ USHORT fGotObjGuid,
+ GUID FAR* pGuid,
+ INVOKEARGS FAR* pinvargs, // invoke args structure
+ UINT u // param index
+)
+{
+ VARIANTARG FAR* pvarg;
+ HRESULT hresult = NOERROR;
+
+ // attempt to coerce to the expected type
+
+ switch(vt) {
+ case VT_UI1:
+ case VT_I2:
+ case VT_I4:
+ case VT_R4:
+ case VT_R8:
+ case VT_CY:
+ case VT_DATE:
+ case VT_BSTR:
+ case VT_ERROR:
+ case VT_BOOL:
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ if (V_VT(pvargSrc) == vt) {
+ // if type already correct, don't have to copy the variant (speed opt)
+ if (fGotObjGuid != 2
+ || vt & VT_ARRAY
+ || V_DISPATCH(pvargSrc) == NULL) {
+
+ goto NoChangeType;
+ }
+ // For object parms, QI to the desired interface/dispinterface
+ // (addref's the obj), and set the object pointer in our temp variant
+ pvarg = &pinvargs->rgvarg[u];
+ if ((V_DISPATCH(pvargSrc)->QueryInterface(*pGuid,
+ (LPVOID *)&V_DISPATCH(pvarg))) != NOERROR) {
+ hresult = HresultOfScode(DISP_E_TYPEMISMATCH);
+ break;
+ }
+ // update the tag of the temp variant, and set ptr so that we use it
+ V_VT(pvarg) = V_VT(pvargSrc);
+ pinvargs->rgpvarg[u] = pvarg;
+ break;
+ }
+ pvarg = &pinvargs->rgvarg[u];
+ hresult = VariantChangeType(pvarg, pvargSrc, 0, vt);
+ if (hresult != NOERROR) {
+ // If VariantChangeType returned a TypeMismatch, and the
+ // TypeMismatch was do to an attempt to pass an unsupplied
+ // optional param to a non variant argument, then translate
+ // the error to the more appropriate DISP_E_PARAMNOTOPTIONAL
+ //
+ // Remember: unsupplied optional params are passed by the
+ // client as VT_ERROR(DISP_E_PARAMNOTFOUND)
+ //
+ if (GetScode(hresult) == DISP_E_TYPEMISMATCH) {
+ if (V_VT(pvargSrc) == VT_ERROR
+ && V_ERROR(pvargSrc) == DISP_E_PARAMNOTFOUND)
+ {
+ hresult = HresultOfScode(DISP_E_PARAMNOTOPTIONAL);
+ }
+ }
+ break;
+ }
+ pinvargs->rgpvarg[u] = pvarg;
+ if (fGotObjGuid == 2) {
+ // For object parms, QI to the desired interface/dispinterface
+ // (addref's the obj), and set the object pointer in our temp variant
+ DebAssert(V_VT(pvarg) == VT_DISPATCH || V_VT(pvarg)==VT_UNKNOWN, "");
+ if (V_DISPATCH(pvarg)) {
+ V_DISPATCH(pvarg)->Release(); // release the extra ref that
+ // VariantChangeType added.
+ if ((V_DISPATCH(pvarg)->QueryInterface(*pGuid,
+ (LPVOID *)&V_DISPATCH(pvarg))) != NOERROR) {
+ V_VT(pvarg) = VT_EMPTY; // so we don't "re-release" it
+ hresult = HresultOfScode(DISP_E_TYPEMISMATCH);
+ break;
+ }
+ }
+ }
+ break;
+
+ case VT_VARIANT:
+NoChangeType:
+ pinvargs->rgpvarg[u] = pvargSrc;
+ break;
+
+ default:
+
+ // if the variant is an array, assume it is owned by the caller and
+ // therefore should not be freed by us
+ if (vt & VT_ARRAY)
+ pinvargs->rgbVarMustBeFreed[u] = FALSE;
+
+ if (vt & (VT_BYREF | VT_ARRAY)) {
+ // get ptr to a temp variant we can use
+ pvarg = &pinvargs->rgvarg[u];
+
+ // If the target argument is ByRef (or Array), then we
+ // require an exact match in type between formal and actual
+ // because we want the original copy to get updated, and
+ // we cant of course coerce the original in place (and we
+ // dont have rules for the coersion of an Array).
+ //
+ // if types match exactly, then we're fine
+ if (V_VT(pvargSrc) == vt) {
+
+ // If we're copying objects, make sure we have the correct
+ // types.
+ //
+ if (fGotObjGuid == 2
+ && !(vt & VT_ARRAY)
+ && V_DISPATCH(pvargSrc) != NULL
+ && *V_DISPATCHREF(pvargSrc) != NULL) {
+
+ // For object parms, QI to the desired interface/dispinterface
+ // (addref's the obj) and put it in our temp variant. Later,
+ // we'll add an extra level of indirection.
+ //
+ if ((*V_DISPATCHREF(pvargSrc))->QueryInterface(*pGuid,
+ (LPVOID *)&V_DISPATCH(pvarg)) != NOERROR) {
+
+ hresult = HresultOfScode(DISP_E_TYPEMISMATCH);
+ break;
+ }
+
+ // update the tag of the temp variant and save * to original
+ // byref variant for copy-back time.
+ //
+ V_VT(pvarg) = V_VT(pvargSrc) & ~VT_BYREF;
+ pinvargs->rgpvargByref[u] = pvargSrc;
+
+ goto CreateByrefTemp;
+ }
+ else {
+ pinvargs->rgpvarg[u] = pvargSrc;
+ }
+
+ break;
+ }
+
+ // Special case allowing a source of VT_BYREF VTARRAY, and target
+ // of a non-VT_BYREF VT_ARRAY, where the base VT types match.
+ // We do the de-referencing in this case.
+ if ( ((V_VT(pvargSrc) & (VT_BYREF | VT_ARRAY)) == (VT_BYREF | VT_ARRAY))
+ && ((vt & (VT_BYREF | VT_ARRAY)) == VT_ARRAY)
+ && ((V_VT(pvargSrc) & ~VT_BYREF) == vt) ) {
+
+ // dereference and copy the source variant
+ V_VT(pvarg) = vt;
+ V_ARRAY(pvarg) = *V_ARRAYREF(pvargSrc);
+ pinvargs->rgpvarg[u] = pvarg;
+
+ // flag this variant as owned by the caller, so we won't free it
+ pinvargs->rgbVarMustBeFreed[u] = FALSE;
+ break;
+ }
+
+ // special case allowing a source BYVAL to be passed to a target BYREF
+ if ((vt & VT_BYREF) && (V_VT(pvargSrc) & VT_BYREF) == 0) {
+ // change type of pvargSrc to the base VT-type, filling in
+ // pinvargs->rgpvarg[u]
+ hresult = CoerceArg(pvargSrc, (vt & ~VT_BYREF), fGotObjGuid, pGuid,
+ pinvargs, u);
+ if (hresult != NOERROR) {
+ break;
+ }
+ if (pinvargs->rgpvarg[u] != pvarg) {
+ // if CoerceArg was tricky and thought it didn't have to copy the
+ // arg, make a copy of it now.
+ DebAssert(pinvargs->rgpvarg[u] == pvargSrc, "");
+ hresult = VariantCopy(pvarg, pvargSrc);
+ if (hresult != NOERROR) {
+ break;
+ }
+ //flag this variant as owned by us, so it will be freed by us
+ pinvargs->rgbVarMustBeFreed[u] = TRUE;
+ // not needed (overwritten below)
+ //pinvargs->rgpvarg[u] = pvarg;
+ }
+
+CreateByrefTemp:
+ // Now set up a byref variant to point to this guy, and adjust
+ // rgpvarg[u] accordingly.
+ VARIANTARG * pvarg2;
+
+ pvarg2 = &pinvargs->rgvarg2[u];
+ V_VT(pvarg2) = vt;
+ if ((vt & ~VT_BYREF) == VT_VARIANT) {
+ V_BYREF(pvarg2) = (void *)pvarg; // point to variant
+ } else {
+ V_BYREF(pvarg2) = (void *)&pvarg->iVal; // point to data
+ }
+ pinvargs->rgpvarg[u] = pvarg2;
+ break;
+ }
+
+ // Suprise, suprise, it's another special case. This one allows a
+ // source BYREF to be passed to a target BYREF VARIANT.
+ if (vt == (VT_BYREF | VT_VARIANT) && (V_VT(pvargSrc) & VT_BYREF)) {
+ // In this case we make a copy of the value, and create a temp
+ // byref variant to pass to the function. After the function
+ // returns, the value in the temp variant is copied back into
+ // the original variant.
+ //
+ hresult = VariantCopyInd(pvarg, pvargSrc);
+ if (hresult != NOERROR) {
+ break;
+ }
+ //flag this variant as owned by us, so it will be freed by us
+ pinvargs->rgbVarMustBeFreed[u] = TRUE;
+
+ // save * to original byref variant for copy-back time.
+ pinvargs->rgpvargByref[u] = pvargSrc;
+ goto CreateByrefTemp;
+ }
+
+ hresult = HresultOfScode(DISP_E_TYPEMISMATCH);
+ break;
+ }
+
+ // Otherwise: unrecognized or unsupported member argument type.
+ // this means there is a problem with the given method description.
+ // Things such as VT_HRESULT, VT_VOID, and VT_NULL are bogus parm types,
+ // (but can be a valid function return type), so VariantVtOfHtdefn lets
+ // them slide, but we must reject them here.
+ hresult = HresultOfScode(DISP_E_BADVARTYPE);
+ break;
+ } // switch
+
+ return hresult;
+}
+
+/***
+*PRIVATE HRESULT NEARCODE GEN_DTINFO::GetInvokeArgs
+*Purpose:
+* Gather all arguments (looking up by position or name), coerce
+* to the expected type (if possible) and build a linearized
+* positional array of pointers to those arguments.
+*
+* Note: this is a helper for ITypeInfo::Invoke implementations
+*
+*Entry:
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppinvargs = structure containing the collected arguments
+* *puArgErr = if there was an error coercing an argument, this is the
+* index in the pdispparams->rgvarg array of the problem arg.
+*
+***********************************************************************/
+HRESULT NEARCODE
+GEN_DTINFO::GetInvokeArgs(
+ HFUNC_DEFN hfdefn,
+ TYPE_DATA *ptdata,
+ WORD wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT ** ppvarRetval,
+ VOID * pbufRetval,
+ INVOKEARGS FAR* FAR* ppinvargsOut,
+ UINT FAR* puArgErr,
+ BOOL fPropParamSplit)
+{
+ VARTYPE vt;
+ HRESULT hresult;
+ FUNC_DEFN *qfdefn;
+ HPARAM_DEFN hparamdefn;
+ UINT uTo, uFrom;
+ UINT uArgIndex, cArgsGiven, cArgsFunc, cArgsMunged;
+ UINT cArgsNonOptional, cArgsUsed;
+ TIPERROR err;
+ INVOKEARGS FAR* pinvargs;
+ VARIANTARG FAR* pvarg, FAR* pvargSrc, FAR* pvarg2;
+ PARAM_DEFN paramdefn;
+ BOOL fVarArg;
+ LONG saElemIndex;
+ UINT uSaArg;
+ USHORT fGotObjGuid;
+ GUID guid;
+ HTYPE_DEFN htdefn;
+#if EI_OLE
+ TYPE_DEFN *qtdefn;
+#endif // EI_OLE
+
+ qfdefn = ptdata->QfdefnOfHfdefn(hfdefn);
+ hparamdefn = (HPARAM_DEFN)qfdefn->m_ftdefn.m_hdefnFormalFirst;
+
+ cArgsFunc = qfdefn->CArgsUnmunged();
+ cArgsMunged = qfdefn->CArgs();
+ // don't include retval or lcid parms (if present) in non-optional
+ // count -- the user doesn't supply these.
+ cArgsNonOptional = cArgsMunged - qfdefn->CArgsOpt();
+ cArgsGiven = pdispparams->cArgs;
+ cArgsUsed = 0;
+
+ // If we have any non-optional parameters that come after any
+ // optional ones (such as RHS of prop functions), decrease
+ // the number of non-optional parameters by one.
+ //
+ if (qfdefn->IsPropertyLet()
+ || qfdefn->IsPropertySet()) {
+ DebAssert(cArgsNonOptional > 0, "not enough args");
+ cArgsNonOptional--;
+ }
+
+ fVarArg = (qfdefn->CArgsOpt() == -1);
+ uSaArg = cArgsMunged-1; // if we're a vararg function, this is the
+ // 0-based index of the last parameter (which
+ // is a SAFEARRAY of variants)
+#if ID_DEBUG
+ if (fVarArg) {
+ DebAssert(cArgsGiven >= uSaArg, "caller didn't check right");
+ }
+#endif
+
+ if ((hresult = AllocInvokeArgs(cArgsFunc,
+ fVarArg ? (cArgsGiven - uSaArg): -1,
+ &pinvargs)) != NOERROR) {
+ goto LError0;
+ }
+
+ // Loop over all of the arguments that this function expects and
+ // match it to the value that was passed in.
+ //
+ for (uTo = uFrom = 0; uTo < cArgsFunc; ++uTo)
+ {
+ // Get the expected argument type.
+#if EI_OB
+ DebAssert(hparamdefn != HPARAMDEFN_Nil, "number vs actual dont match");
+
+ // In OB we walk the linked list of PARAM_DEFN(s).
+ paramdefn = *ptdata->QparamdefnOfHparamdefn(hparamdefn);
+ hparamdefn = paramdefn.HparamdefnNext();
+#else //EI_OB
+ paramdefn = *ptdata->QparamdefnOfIndex(hparamdefn, uTo);
+#endif //EI_OB
+
+ htdefn = paramdefn.Htdefn();
+
+#if EI_OLE
+ qtdefn = paramdefn.IsSimpleType()
+ ? paramdefn.QtdefnOfSimpleType()
+ : ptdata->QtdefnOfHtdefn(htdefn);
+#endif // EI_OLE
+
+ // Get the type of this parameter.
+ hresult = VariantVtOfHtdefn(htdefn,
+ ptdata,
+ paramdefn.IsSimpleType(),
+ &fGotObjGuid,
+ &guid,
+ &vt);
+
+ if (hresult != NOERROR) {
+ goto LError1;
+ }
+
+ // Handle an LCID parameter.
+#if EI_OB
+ if (paramdefn.IsLCID())
+#else // EI_OLE
+ if (qtdefn->IsLCID())
+#endif // EI_OLE
+ {
+ // get & fill in the LCID param
+ pinvargs->rgvt[uTo] = VT_I4;
+ pvarg = &pinvargs->rgvarg[uTo];
+ pvarg->vt = VT_I4; // CONSIDER: redundant with rgvt[u]?
+
+ // get this typeinfo's lcid (from the containing typelib)
+ if ((err = GetLcid((DWORD *)&(pvarg->lVal))) != TIPERR_None) {
+ hresult = HresultOfTiperr(err);
+ goto LError1;
+ }
+
+ pinvargs->rgpvarg[uTo] = pvarg;
+ continue; // next param
+ }
+
+ // Handle a retval parameter.
+#if EI_OB
+ else if (paramdefn.IsRetval())
+#else // EI_OLE
+ else if (qtdefn->IsRetval())
+#endif // EI_OLE
+ {
+ DebAssert(vt & VT_BYREF, "non-byref retval param");
+ pinvargs->rgvt[uTo] = vt;
+ pvarg = &pinvargs->rgvarg[uTo];
+ pvarg->vt = vt;
+ pvarg->byref = pbufRetval; // where function should put it's data
+
+ // Clear the retval buffer (guaranteed to be as big as a variant).
+ memset(pbufRetval, 0, sizeof(VARIANT));
+ pinvargs->rgpvarg[uTo] = pvarg;
+ *ppvarRetval = pvarg; // return pointer to function retval
+
+ continue; // next param
+ }
+
+ // If this is a PARAMARRAY (VarArg), loop over the rest of the
+ // input parameters and add them to the array.
+ //
+ else if (fVarArg && uFrom == uSaArg) {
+ DebAssert((vt & ~VT_BYREF) == (VT_VARIANT | VT_ARRAY),
+ "vararg func with bad last parm");
+
+ // Set up the safearray.
+ pvarg = &pinvargs->rgvarg[uTo];
+ V_ARRAY(pvarg) = pinvargs->psa;
+
+ // If the paramarray is VT_BYREF, add the byref flag to the
+ // destination varg and adjust rgpvarg[uFrom] accordingly.
+ //
+ if (vt & VT_BYREF) {
+ pvarg2 = &pinvargs->rgvarg2[uTo];
+ V_VT(pvarg2) = vt;
+ V_ARRAYREF(pvarg2) = &pvarg->parray; // point to array
+
+ pinvargs->rgpvarg[uTo] = pvarg2;
+ pinvargs->rgvt[uTo] = vt;
+ }
+
+ // Add the rest of the given parameters to the paramarray.
+ for (; uFrom < cArgsGiven; uFrom++, cArgsUsed++) {
+ // Get the parameter.
+ hresult = IndexOfParam(pdispparams, uFrom, &uArgIndex);
+ if (hresult != NOERROR) {
+ goto LError1;
+ }
+
+ // Add the parameter.
+ saElemIndex = uFrom - uSaArg;
+ hresult = SafeArrayPutElement(pinvargs->psa,
+ &saElemIndex,
+ &pdispparams->rgvarg[uArgIndex]);
+
+ if (hresult != NOERROR) {
+ goto LError1;
+ }
+ }
+
+ continue; // next param
+ }
+
+ // Get the parameter that was passed in.
+ //
+ // special case the handling of the rhs of a property put
+ //
+ // if we are looking for the last arg in the list, and this is
+ // a property put function, the we know this argument is the
+ // "put-value" or right-hand-side of the property put, in which
+ // case we know it is passed in element 0 of the rgvarg array
+ // and is marked with the special name, DISPID_PROPERTYPUT
+ //
+ if (uTo == (cArgsFunc-1) && IsPropPut(wFlags)) {
+ if (pdispparams->cNamedArgs == 0
+ || pdispparams->rgdispidNamedArgs[0] != DISPID_PROPERTYPUT) {
+
+ hresult = HresultOfScode(DISP_E_PARAMNOTOPTIONAL); // CONSIDER: correct error?
+ }
+ uArgIndex = 0;
+ }
+ else {
+ hresult = IndexOfParam(pdispparams, uFrom, &uArgIndex);
+ }
+
+ // If the above lookup failed and the current parameter is optional,
+ // just set it to the default value. Otherwise return an error.
+ //
+ if (hresult != NOERROR) {
+ if (uFrom >= cArgsNonOptional) {
+ DebAssert(!fVarArg, "VarArgs can't coexist with optional params.");
+ DebAssert((vt & ~VT_BYREF) == VT_VARIANT, "Optional must be variant.");
+
+ // Set up the variant.
+ pinvargs->rgvt[uTo] = VT_VARIANT;
+ pvarg = &pinvargs->rgvarg[uTo];
+ pvarg->vt = VT_ERROR;
+ pvarg->scode = DISP_E_PARAMNOTFOUND;
+ pinvargs->rgpvarg[uTo] = pvarg;
+
+ // Now set up a byref variant to point to this guy, and adjust
+ // rgpvarg[uFrom] accordingly.
+ //
+ if (vt & VT_BYREF) {
+ pvarg2 = &pinvargs->rgvarg2[uTo];
+ V_VT(pvarg2) = vt;
+ V_BYREF(pvarg2) = (void *)pvarg; // point to variant
+
+ pinvargs->rgpvarg[uTo] = pvarg2;
+ pinvargs->rgvt[uTo] = vt;
+ }
+
+ uFrom++;
+ continue;
+ }
+ else {
+ goto LError1;
+ }
+ }
+
+ DebAssert(cArgsUsed < cArgsGiven, "Using too may args!");
+
+ // Do the copy.
+ pvargSrc = &pdispparams->rgvarg[uArgIndex];
+ pinvargs->rgvt[uTo] = vt;
+
+ // coerce the argument to the expected type
+ hresult = CoerceArg(pvargSrc, vt, fGotObjGuid, &guid, pinvargs, uTo);
+ if (hresult != NOERROR) {
+ *puArgErr = uArgIndex; // which arg got the error
+ goto LError1;
+ }
+
+ // If this is an 'out' parameter, free any resources currently
+ // stored in the input variant. Do this after CoerceArg to handle
+ // all the wierd cases that will result in CoerceArg spitting out a
+ // byref value when the input was not byref.
+ //
+#if EI_OB
+ if (paramdefn.IsOut() && !paramdefn.IsIn())
+#else // EI_OLE
+ TYPE_DEFN *qtdefn;
+
+ qtdefn = paramdefn.IsSimpleType()
+ ? paramdefn.QtdefnOfSimpleType()
+ : ptdata->QtdefnOfHtdefn(paramdefn.Htdefn());
+
+ if (qtdefn->IsModeOut())
+#endif // EI_OLE
+ {
+ pvargSrc = pinvargs->rgpvarg[uTo];
+ DebAssert(vt & VT_BYREF, "target must be byref");
+ DebAssert(V_ISBYREF(pvargSrc), "source must be byref");
+ switch(V_VT(pvargSrc)) {
+ case VT_BSTR | VT_BYREF:
+ SysFreeString(*V_BSTRREF(pvargSrc));
+ *V_BSTRREF(pvargSrc) = NULL;
+ break;
+
+ case VT_UNKNOWN | VT_BYREF:
+ if (V_UNKNOWNREF(pvargSrc) != NULL) {
+ if (*V_UNKNOWNREF(pvargSrc) != NULL) {
+ (*V_UNKNOWNREF(pvargSrc))->Release();
+ *V_UNKNOWNREF(pvargSrc) = NULL;
+ }
+ }
+ break;
+
+ case VT_DISPATCH | VT_BYREF:
+ if (V_DISPATCHREF(pvargSrc) != NULL) {
+ if (*V_DISPATCHREF(pvargSrc) != NULL) {
+ (*V_DISPATCHREF(pvargSrc))->Release();
+ *V_DISPATCHREF(pvargSrc) = NULL;
+ }
+ }
+ break;
+
+ default:
+ if(V_ISARRAY(pvargSrc)) {
+ IfFailRet(SafeArrayDestroy(*V_ARRAYREF(pvargSrc)));
+ *V_ARRAYREF(pvargSrc) = NULL;
+ }
+ }
+ }
+
+ // Next argument.
+ uFrom++; cArgsUsed++;
+ } // for
+
+ // Make sure we actually used all of the given arguments, unless
+ // we're processing a collection lookup.
+ //
+ // If we're splitting the parameters on a colletion lookup, we'll
+ // use all of the parameters passed in except one. (vba2 bug #4481)
+ //
+ if (cArgsUsed != cArgsGiven
+ && (!fPropParamSplit || cArgsUsed != cArgsGiven - 1)
+ && cArgsUsed) {
+
+ hresult = HresultOfScode(DISP_E_PARAMNOTFOUND);
+ goto LError1;
+ }
+
+ *ppinvargsOut = pinvargs;
+ return NOERROR;
+
+LError1:;
+ ReleaseInvokeArgs(pinvargs);
+ *ppinvargsOut = NULL;
+
+LError0:;
+ return hresult;
+}
+
+
+/***
+*PRIVATE HRESULT NEARCODE GEN_DTINFO::AllocInvokeArgs
+*Purpose:
+* Allocate and initialize an INVOKEARGS structure
+*
+*Entry:
+* cArgs = the count of args to be held by the invokeargs struct
+* cArgsVarArg = # of args that get put into a safearray trailing arg,
+* -1 if this isn't a vararg function.
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppinvargs = ptr to a newly allocated INVOKEARGS struct
+*
+***********************************************************************/
+HRESULT NEARCODE
+GEN_DTINFO::AllocInvokeArgs(UINT cArgs, UINT cArgsVarArg, INVOKEARGS FAR* FAR* ppinvargs)
+{
+ INVOKEARGS FAR* pinvargs;
+
+#define CB_rgvarg (sizeof(VARIANTARG) * cArgs)
+#define CB_rgvarg2 (sizeof(VARIANTARG) * cArgs)
+#define CB_rgpvarg (sizeof(VARIANTARG FAR *) * cArgs)
+#define CB_rgpvargByref (sizeof(VARIANTARG FAR *) * cArgs)
+#define CB_rgvt (sizeof(VARTYPE) * cArgs)
+#define CB_rgbVarMustBeFreed (sizeof(BYTE) * cArgs)
+
+ if ((pinvargs = (INVOKEARGS *)MemAlloc(sizeof(INVOKEARGS)
+// NOTE: (OE_RISC) assumes that INVOKEARGS structure doesn't end in a SHORT
+ + CB_rgvarg
+ + CB_rgvarg2
+ + CB_rgpvarg
+ + CB_rgpvargByref
+ + CB_rgvt
+ + CB_rgbVarMustBeFreed
+ )) == NULL)
+ goto LError0;
+ ::new (pinvargs) INVOKEARGS;
+ pinvargs->cArgs = cArgs;
+ pinvargs->psa = NULL;
+ if (cArgs == 0) {
+ pinvargs->rgvarg = NULL;
+ pinvargs->rgpvarg = NULL;
+ pinvargs->rgvt = NULL;
+ pinvargs->rgbVarMustBeFreed = NULL;
+ // not needed
+ //pinvargs->rgvarg2 = NULL;
+ //pinvargs->rgpvargByref = NULL;
+ }else{
+ pinvargs->rgvarg = (VARIANTARG FAR *)((BYTE *)pinvargs
+ + sizeof(INVOKEARGS));
+ pinvargs->rgvarg2 = (VARIANTARG FAR *)((BYTE *)pinvargs
+ + sizeof(INVOKEARGS)
+ + CB_rgvarg);
+ pinvargs->rgpvarg = (VARIANTARG FAR * FAR *)((BYTE *)pinvargs
+ + sizeof(INVOKEARGS)
+ + CB_rgvarg
+ + CB_rgvarg2);
+ pinvargs->rgpvargByref = (VARIANTARG FAR * FAR *)((BYTE *)pinvargs
+ + sizeof(INVOKEARGS)
+ + CB_rgvarg
+ + CB_rgvarg2
+ + CB_rgpvarg);
+ pinvargs->rgvt = (VARTYPE FAR *)((BYTE *)pinvargs
+ + sizeof(INVOKEARGS)
+ + CB_rgvarg
+ + CB_rgvarg2
+ + CB_rgpvarg
+ + CB_rgpvargByref);
+ pinvargs->rgbVarMustBeFreed = (BYTE FAR*)((BYTE *)pinvargs
+ + sizeof(INVOKEARGS)
+ + CB_rgvarg
+ + CB_rgvarg2
+ + CB_rgpvarg
+ + CB_rgpvargByref
+ + CB_rgvt);
+
+ for (UINT u = 0; u < cArgs; ++u) {
+ V_VT(&pinvargs->rgvarg[u]) = VT_EMPTY;
+ pinvargs->rgpvargByref[u] = NULL;
+ pinvargs->rgbVarMustBeFreed[u] = TRUE; // assume we own all the variants
+ }
+
+ if (cArgsVarArg != -1) {
+ if (cArgsVarArg == 0) {
+ // SafeArrayCreate rejects 0 for cElements.
+ if (SafeArrayAllocDescriptor(1, &pinvargs->psa) != NOERROR) {
+ goto LError4; // if error, just assume out of memory.
+ }
+ }
+ else {
+ SAFEARRAYBOUND sabounds;
+ sabounds.cElements = cArgsVarArg;
+ sabounds.lLbound = 0;
+ if ((pinvargs->psa = SafeArrayCreate(VT_VARIANT,
+ 1,
+ &sabounds)) == NULL) {
+ goto LError4;
+ }
+ }
+ // set the last invoke arg to point to this array
+ VARIANTARG FAR* pvarg;
+ UINT uSaArg = cArgs-1;
+ pvarg = &pinvargs->rgvarg[uSaArg];
+ pinvargs->rgpvarg[uSaArg] = pvarg;
+ V_VT(pvarg) = VT_VARIANT | VT_ARRAY;
+ pinvargs->rgvt[uSaArg] = VT_VARIANT | VT_ARRAY;
+ pvarg->parray = pinvargs->psa;
+ }
+ }
+ *ppinvargs = pinvargs;
+ return NOERROR;
+
+LError4:;
+ MemFree(pinvargs);
+LError0:;
+ return HresultOfScode(E_OUTOFMEMORY);
+}
+
+
+/***
+*PRIVATE NEARCODE GEN_DTINFO::ReleaseInvokeArgs
+*Purpose:
+* Free the given INVOKEARGS structure
+*
+*Entry:
+* pinvargs = the structure to free
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void NEARCODE
+GEN_DTINFO::ReleaseInvokeArgs(INVOKEARGS FAR* pinvargs)
+{
+ if (pinvargs != NULL) {
+ if (pinvargs->rgvarg != NULL) {
+ for (UINT u = 0; u < pinvargs->cArgs; ++u) {
+
+ // release the variant only if we own the memory. We won't if the
+ // variant is a byval array created by coercing a byref array to
+ // byval in CoerceArgs().
+ if (pinvargs->rgbVarMustBeFreed[u] != FALSE) {
+ VariantClear(&pinvargs->rgvarg[u]);
+ }
+ }
+ }
+ if (pinvargs->psa != NULL)
+ SafeArrayDestroy(pinvargs->psa);
+ MemFree(pinvargs);
+ }
+}
+
+
+/***
+*PRIVATE NEARCODE GEN_DTINFO::CopyBackByrefArgs
+*Purpose:
+* Copy back byref temp's that were created when calling a routine that
+* wants a BYREF VARIANT, but is given a BYREF <something else>
+*
+*Entry:
+* pinvargs = the structure containing the byref args to copy back
+*
+*Exit:
+* None
+*
+***********************************************************************/
+HRESULT NEARCODE
+GEN_DTINFO::CopyBackByrefArgs(INVOKEARGS FAR* pinvargs)
+{
+ VARIANT * pvargByrefOld;
+ VARIANT * pvargNew;
+ HRESULT hresult;
+ VARTYPE vtOld;
+
+ DebAssert (pinvargs != NULL, "");
+ for (UINT u = 0; u < pinvargs->cArgs; ++u) {
+ if ((pvargByrefOld = pinvargs->rgpvargByref[u]) != NULL) {
+
+ pvargNew = &pinvargs->rgvarg[u];
+
+ DebAssert(pvargByrefOld->vt & VT_BYREF, "");
+ vtOld = pvargByrefOld->vt & ~VT_BYREF;
+
+ // if the user changed the type of the byref variant during the invoke,
+ // attempt to change it back to the original type.
+ if (vtOld != pvargNew->vt) {
+ hresult = VariantChangeType(pvargNew, pvargNew, 0, vtOld);
+ if (hresult != NOERROR)
+ return hresult;
+ }
+
+ // Handle array.
+ if (vtOld & VT_ARRAY) {
+ SAFEARRAY FAR* psaOld, FAR* psaNew;
+ SAFEARRAYBOUND FAR* psaboundOld, FAR* psaboundNew;
+ ULONG cbData = 0L;
+ USHORT us;
+
+ psaOld = *pvargByrefOld->pparray;
+ psaNew = pvargNew->parray;
+
+ // If this is a fixd-size array, make sure the size of it
+ // hasn't changed.
+ //
+ if (psaOld && psaOld->fFeatures & FADF_FIXEDSIZE) {
+ if (psaOld->cDims != psaNew->cDims
+ || psaOld->cbElements != psaNew->cbElements) {
+
+ return HresultOfScode(DISP_E_TYPEMISMATCH);
+ }
+
+ if (psaOld->cDims){
+ psaboundOld = &psaOld->rgsabound[psaOld->cDims - 1];
+ psaboundNew = &psaNew->rgsabound[psaNew->cDims - 1];
+
+ cbData = (ULONG)psaOld->cbElements;
+
+ for(us = 0; us < psaOld->cDims; ++us){
+ // Make sure none of these have changed.
+ if (psaboundOld->cElements != psaboundNew->cElements
+ || psaboundOld->lLbound != psaboundNew->lLbound) {
+
+ return HresultOfScode(DISP_E_TYPEMISMATCH);
+ }
+
+ cbData *= psaboundOld->cElements;
+ --psaboundOld;
+ --psaboundNew;
+ }
+
+ // Copy the data from the new to the old.
+ hmemcpy(psaOld->pvData, psaNew->pvData, cbData);
+
+ // Delete the new array descriptor, but don't
+ // free any of the array's resources as ownership
+ // has been transferred.
+ //
+ DebAssert(!(psaNew->fFeatures & FADF_AUTO
+ && psaNew->fFeatures & FADF_STATIC
+ && psaNew->fFeatures & FADF_EMBEDDED),
+ "Can't free.");
+
+ psaNew->fFeatures = 0; // don't free any resources
+ (VOID)SafeArrayDestroy(psaNew); // Ignore the error, as there's
+ // no going back.
+ }
+ }
+
+ // If the array is redimmable, replace the old safearray with the
+ // new one.
+ //
+ else {
+ if (psaOld) {
+ DebAssert(!(psaOld->fFeatures & FADF_AUTO
+ && psaOld->fFeatures & FADF_STATIC
+ && psaOld->fFeatures & FADF_EMBEDDED),
+ "Can't free");
+
+ if (hresult = SafeArrayDestroy(psaOld)) {
+ (VOID)SafeArrayDestroy(psaNew);
+ return hresult;
+ }
+ }
+
+ *pvargByrefOld->pparray = psaNew;
+ }
+ }
+ else {
+ // Free the original byref variant's data
+ switch (vtOld) {
+ case VT_BSTR:
+ SysFreeString(*pvargByrefOld->pbstrVal);
+ break;
+ case VT_DISPATCH:
+ case VT_UNKNOWN:
+ if (*pvargByrefOld->ppdispVal != NULL) {
+ (*pvargByrefOld->ppdispVal)->Release();
+ }
+ break;
+#if ID_DEBUG
+ case VT_EMPTY:
+ case VT_NULL:
+ case VT_VARIANT:
+ DebAssert(FALSE, "bad orginal vartype");
+#endif //ID_DEBUG
+
+ default:
+ break;
+ }
+
+ // copy the new variant's data back over the original data
+#if EI_OLE
+ memcpy(pvargByrefOld->byref, &pvargNew->iVal, SizeofTdesckind((TYPEDESCKIND)vtOld, SYSKIND_CURRENT));
+#else //EI_OLE
+ memcpy(pvargByrefOld->byref, &pvargNew->iVal, SizeofTdesckind((TYPEDESCKIND)vtOld));
+#endif //EI_OLE
+ }
+
+ // mark the new variant as free, since ownership transfers to the
+ // old variant.
+ pvargNew->vt = VT_EMPTY;
+ }
+ }
+ return NOERROR;
+}
+
+
diff --git a/private/oleauto/src/typelib/gptbind.cxx b/private/oleauto/src/typelib/gptbind.cxx
new file mode 100644
index 000000000..9429b28f6
--- /dev/null
+++ b/private/oleauto/src/typelib/gptbind.cxx
@@ -0,0 +1,1526 @@
+/***
+*gptbind.cxx - GENPROJ_TYPEBIND class implementation
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* TYPEBIND for an Object Basic project.
+* Describes referenced project names, standard module names
+* and class modules names.
+* Note that in OB, referenced projects have an implicit
+* order such that (names in) the i'th referenced project hides the
+* (names in) i+1'th referenced project.
+* In a single project, if multiple modules present different
+* of the same name it is an ambiguity.
+* Methods are provided to bind to identifiers:
+* - at project-level.
+* - globals within standard modules (types and members).
+* - visible identifiers in referenced projects (includes
+* modules names and global members).
+*
+* Note that the project's project-level cache is validated
+* (as the disjunction of all its modules' caches) when
+* a GENPROJ_TYPEBIND is requested and it's invalid and all
+* the modules' caches are valid.
+*
+* An instance is embedded in an STL_TYPEBIND -- and the
+* implementation assumes this, i.e. that it can get at
+* its containing ITypeLib by subtracting its offset into
+* the containing instance from its this pointer to obtain
+* the ITypeLib instance. To this end, STL_TYPEBIND makes
+* available a public static const member with that value.@
+*
+*
+*Revision History:
+*
+* 16-Jun-92 ilanc: Created
+* 30-Jul-92 w-peterh: removed function overloading
+* 23-Feb-93 rajivk : Support for Predeclared Identifier
+* 30-Apr-93 w-jeffc: made DEFN data members private
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "typelib.hxx"
+
+#define GENPROJ_TYPEBIND_VTABLE
+#include "clutil.hxx" // [cfront] needed for HashOfHgnam which is
+ // needed by ncache.hxx etc. etc.
+#include "gptbind.hxx"
+#include "dtbind.hxx"
+#include "gtlibole.hxx"
+#include "gdtinfo.hxx"
+#include "exbind.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleGptbindCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleGptbindCxx
+#else
+static char szGptbindCxx[] = __FILE__;
+#define SZ_FILE_NAME szGptbindCxx
+#endif
+#endif
+
+#define MAXCOPY 32
+
+extern BOOL IsTypeBasicIntrinsic(TYPEDESCKIND tdesckind);
+
+
+
+LPOLESTR GENPROJ_TYPEBIND::szProtocolName = WIDE("MS-GENPROJ_TYPEBIND");
+// LPOLESTR GENPROJ_TYPEBIND::szBaseName = WIDE("MS-DEFN_TYPEBIND");
+
+CONSTDATA UINT GENPROJ_TYPEBIND::oGbindnametbl =
+ offsetof(GENPROJ_TYPEBIND, m_gbindnametbl);
+
+
+// empty dtor
+//
+
+// CONSIDER: inlining?
+
+#pragma code_seg(CS_INIT)
+GENPROJ_TYPEBIND::~GENPROJ_TYPEBIND() {}
+#pragma code_seg()
+
+// QueryProtocol method
+//
+LPVOID GENPROJ_TYPEBIND::QueryProtocol(LPOLESTR szInterfaceName)
+{
+ if (szInterfaceName == szProtocolName ||
+ ostrcmp(szInterfaceName, szProtocolName) == 0)
+ return this;
+ else
+ return DEFN_TYPEBIND::QueryProtocol(szInterfaceName);
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::Pgtlibole
+*Purpose:
+* Gets pointer to containing typelib.
+*
+*Implementation Notes:
+* NOTE: defined inline here and not in the header becuase
+* of mutual dependency between gtlibole and gptbind.
+* NOTE: this method is called in gbindtbl and so cannot be
+* inline. mikewo.
+*
+* Subtracts from this pointer the offset of this
+* embedded instance in container. Offset is obtained
+* from a GenericTypeLibOLE static member.
+*
+*Entry:
+*
+*Exit:
+* GenericTypeLibOLE *
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+GenericTypeLibOLE *GENPROJ_TYPEBIND::Pgtlibole() const
+{
+ return (GenericTypeLibOLE *)((BYTE *)this - GenericTypeLibOLE::oGptbind);
+}
+#pragma code_seg()
+
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::Initializer - initialize an instance.
+*Purpose:
+* initializes a GENPROJ_TYPEBIND instance.
+*
+*Implementation Notes:
+*
+*Entry:
+* psheapmgr SHEAP_MGR for tables and caches.
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GENPROJ_TYPEBIND::Init(SHEAP_MGR *psheapmgr)
+{
+ NAMMGR *pnammgr;
+ TIPERROR err;
+
+ DebAssert(psheapmgr != NULL, "GENPROJ_TYPEBIND: psheapmgr uninitialized.");
+
+ IfErrRet(Pgtlibole()->GetNamMgr(&pnammgr));
+
+ // Init block manager member.
+ IfErrRet(m_gbindnametbl.Init(psheapmgr, pnammgr));
+
+ // Init compstate member
+ m_compstateModule = CS_SEMIDECLARED;
+
+
+ return err;
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::Constructor - Construct an instance.
+*Purpose:
+* Constructs a GENPROJ_TYPEBIND instance.
+*
+*Implementation Notes:
+* Sets all contained pointers to sub-objects to NULL.
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+GENPROJ_TYPEBIND::GENPROJ_TYPEBIND()
+{
+}
+#pragma code_seg()
+
+
+
+
+
+
+
+
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::AddNameToTable
+*Purpose:
+* Converts the given szName to an HLNAM and adds it to the
+* project-level binding table.
+*
+*Implementation Notes:
+*
+*Entry:
+* szName The name of the typeinfo
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GENPROJ_TYPEBIND::AddNameToTable(LPSTR szName,
+ UINT ityp,
+ BOOL isTypeInfo)
+{
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+ BOOL isGlobal;
+ GEN_DTINFO *pgdti;
+ TIPERROR err;
+
+ // Get the hlnam for the type's name
+ IfErrRet(Pgtlibole()->GetTypeBind());
+ IfErrRet(Pgtlibole()->GetNamMgr(&pnammgr));
+
+ IfErrRet(pnammgr->HlnamOfStr(szName, &hlnam, FALSE, NULL));
+
+ // Determine if the type is global
+ if (isTypeInfo) {
+ IfErrRet(Pgtlibole()->GetGdtiOfItyp(ityp, &pgdti));
+ isGlobal = IsUnqualifiable(pgdti);
+ pgdti->Release();
+ }
+ else {
+ // Reference librarys are not "global"
+ isGlobal = FALSE;
+ }
+
+ // Add the type's name the project-level binding table.
+ err = m_gbindnametbl.AddNameToTable(hlnam,
+ ityp,
+ isTypeInfo,
+ isGlobal);
+
+ return err;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::RemoveNameFromTable
+*Purpose:
+* Converts the given szName to an HLNAM and removes it from the
+* project-level binding table.
+*
+*Implementation Notes:
+*
+*Entry:
+* szName The name of the typeinfo
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::RemoveNameFromTable(LPOLESTR szName)
+{
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+ TIPERROR err;
+
+ // Get the hlnam for the type's name
+ IfErrRet(Pgtlibole()->GetTypeBind());
+ IfErrRet(Pgtlibole()->GetNamMgr(&pnammgr));
+
+ IfErrRet(pnammgr->HlnamOfStrW(szName, &hlnam, FALSE, NULL));
+
+ // Remove the type's name from the project-level binding table.
+ return m_gbindnametbl.RemoveNameFromTableOfHlnam(hlnam);
+}
+
+#if 0 //Dead Code
+/***
+*PUBLIC GENPROJ_TYPEBIND::VerifyNameOfOrdinal
+*Purpose:
+* Converts the given szName to an HLNAM and verifies that it
+* is the correct name for the given ordinal.
+*
+*Implementation Notes:
+*
+*Entry:
+* szName The name of the typeinfo
+* ityp The index for the name
+* isTypeInfo True if we're verifying a typeinfo
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::VerifyNameOfOrdinal(LPSTR szName,
+ UINT ityp,
+ BOOL isTypeInfo)
+{
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+ TIPERROR err;
+
+ // Get the hlnam for the type's name
+ IfErrRet(Pgtlibole()->GetTypeBind());
+ IfErrRet(Pgtlibole()->GetNamMgr(&pnammgr));
+
+ IfErrRet(pnammgr->HlnamOfStr(szName, &hlnam, FALSE, NULL));
+
+ // Do the verification
+ return m_gbindnametbl.VerifyNameOfOrdinal(hlnam, ityp, isTypeInfo);
+}
+#endif //0
+
+/***
+*PROTECTED GENPROJ_TYPEBIND::BindAll - Bind to id.
+*Purpose:
+* Bind to type or non-type id in current proj
+* or referenced project.
+*
+*Implementation Notes:
+* Defer to BindProjLevel callback of current project --
+* if not found there iterate over referenced projects,
+* deferring likewise to BindDefnProjLevel respectively.
+*
+*Entry:
+* BindRefProjLevel Proj-level binding function callback for ref'ed projs (IN).
+* fuInvokeKind Invocation kind flags (IN).
+* access Visibility attr: private means everything etc. (IN)
+* compstate The state to bring each module to when we bind.
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+#define HACKERY
+#ifdef HACKERY
+TIPERROR tcomp(ITypeLibA *ptlibRef, ITypeCompA **pptcompRefLib)
+{
+ return TiperrOfHresult(ptlibRef->GetTypeComp(pptcompRefLib));
+}
+#endif
+TIPERROR GENPROJ_TYPEBIND::BindAll(
+ BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ COMPSTATE compstate,
+ EXBIND *pexbind)
+{
+ TIPERROR err;
+
+ DebAssert(pexbind != NULL, "bad param.");
+
+ // First, consider current project.
+ // Note: We can bind to both PRIVATE and PUBLIC modules
+ // in the current proj.
+ //
+ IfErrRet(BindProjLevel(fWantType,
+ hgnam,
+ fuInvokeKind,
+ access, // mod-level
+ ACCESS_Private, // proj-level
+ compstate,
+ pexbind));
+
+
+ return TIPERR_None;
+
+ return err;
+}
+
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::BindDefnStr - Bind to id.
+*Purpose:
+* Bind to id given a string (as opposed to an hgnam).
+*
+*
+*Entry:
+* szName Name of id to bind. (IN)
+* fuInvokeKind flagkind of invocation (IN).
+* access Visibility attr: private means everything etc. (IN)
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::BindDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind)
+{
+ NAMMGR *pnammgr;
+ HGNAM hgnam;
+ TIPERROR err;
+
+ IfErrRet(Pgtlibole()->GetNamMgr(&pnammgr));
+
+ // Map string to hlnam
+ IfErrRet(pnammgr->HgnamOfStr(szName, &hgnam));
+
+ // a good manager delegates...
+ if (err = BindAll(FALSE,
+ hgnam,
+ fuInvokeKind,
+ access,
+ Compstate(),
+ pexbind))
+ {
+ // In an error case, make sure we release any of those
+ // resources we've gathered.
+ //
+ ReleaseResources();
+ }
+
+ return err;
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::Release
+*Purpose:
+* Implementation of Release method.
+*
+*Implementation Notes:
+* Defer to typelib.
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID GENPROJ_TYPEBIND::Release()
+{
+ Pgtlibole()->Release();
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::AddRef
+*Purpose:
+* Implementation of AddRef method.
+*
+*Implementation Notes:
+* Defer to typelib.
+*
+*Entry:
+*
+*Exit:
+***********************************************************************/
+
+VOID GENPROJ_TYPEBIND::AddRef()
+{
+ // Defer to containing typelib
+ Pgtlibole()->AddRef();
+}
+
+
+TYPEKIND GENPROJ_TYPEBIND::GetTypeKind()
+{
+ return (TYPEKIND)0;
+}
+
+
+BOOL GENPROJ_TYPEBIND::IsProtocol()
+{
+ return FALSE;
+}
+
+
+USHORT GENPROJ_TYPEBIND::GetCbSize()
+{
+ return (USHORT)~0;
+}
+
+
+USHORT GENPROJ_TYPEBIND::GetAlignment()
+{
+ return (USHORT)~0;
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::Read - Read serialized image of GENPROJ_TYPEBIND.
+*Purpose:
+* Read serialized image of GENPROJ_TYPEBIND.
+*
+*Implementation Notes:
+* Serialized format:
+* byte containing COMPSTATE
+* serialized GENPROJ_BINDNAME_TABLE
+*
+*Entry:
+* pstrm - STREAM to read image from (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::Read(STREAM *pstrm)
+{
+ BYTE bCompState;
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // Deserialize GENPROJ_TYPEBIND meta-info.
+ IfErrRet(pstrm->Read(&bCompState, sizeof(bCompState)));
+
+ // Deserialize BINDNAME_TABLE embedded member
+ IfErrRet(m_gbindnametbl.Read(pstrm));
+
+ m_compstateModule = (COMPSTATE)bCompState;
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::Write - Write image of GENPROJ_TYPEBIND.
+*Purpose:
+* Write image of GENPROJ_TYPEBIND.
+*
+*Implementation Notes:
+*
+*Entry:
+* pstrm - STREAM to read image to (IN).
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR GENPROJ_TYPEBIND::Write(STREAM *pstrm)
+{
+ BYTE bCompState = (BYTE)m_compstateModule;
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // Serialize GENPROJ_TYPEBIND meta-info.
+ IfErrRet(pstrm->Write(&bCompState, sizeof(bCompState)));
+
+ // serialize BINDNAME_TABLE embedded member
+ IfErrRet(m_gbindnametbl.Write(pstrm));
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::BindTypeDefnStr - Bind to a type.
+*Purpose:
+* Bind to a type given a string (as opposed to an hgnam).
+*
+*Implementation Notes:
+* Just defers to BindAll(szName).
+* CONSIDER: define shared function for BindDefnStr and BindTypeDefnStr
+* that abstract getting nammgr and mapping to hgnam.
+*
+*Entry:
+* szName Name of id to bind. (IN)
+* fuInvokeKind flagkind of invocation (IN).
+* access Visibility attr: private means everything etc. (IN)
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+* None.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::BindTypeDefnStr(LPSTR szName,
+ UINT, // fuInvokeKind: ignored
+ ACCESS access,
+ EXBIND *pexbind)
+{
+ NAMMGR *pnammgr;
+ HGNAM hgnam;
+ TIPERROR err;
+
+ IfErrRet(Pgtlibole()->GetNamMgr(&pnammgr));
+
+ // Map string to hlnam
+ IfErrRet(pnammgr->HgnamOfStr(szName, &hgnam));
+
+ // Bind to a type id in this or referenced project.
+ return BindAll(
+ TRUE, // want type
+ hgnam,
+ 0, // fuInvokeKind: ignored for types.
+ access,
+ Compstate(),
+ pexbind);
+}
+
+
+/***
+*PROTECTED GENPROJ_TYPEBINDs::BindProjLevel
+*Purpose:
+* Bind to type or non-type id at project level given callback.
+*
+*Implementation Notes:
+* Binds to a visible id at project-level:
+* - test project-level cache first.
+* - query project-level table first
+* - if not found then
+* iterate over each module deferring to module-level
+* callback to bind at module-level.
+*
+* CONSIDER: is there any need to distinguish between
+* dyn vs. proj typebind match???
+*
+*Entry:
+* BindModuleLevel Module-level binding function callback (IN).
+* hgnam Name of id to bind. (IN)
+* fuInvokeKind Flag word: invoke kinds (IN).s
+* accessMod Visibility attr for names at module-level
+* private means everything etc. (IN)
+* accessProj Visibility attr for names at proj-level (IN).
+* compstate What state to bring module to when bound.
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::BindProjLevel(
+ BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ COMPSTATE compstate,
+ EXBIND *pexbind)
+{
+ BOOL fMatchProj;
+ UINT uOrdinal;
+ USHORT indexMatch;
+ GENPROJ_BIND_DESC gpbinddescMatch;
+ EXBIND exbindMatch;
+ GenericTypeLibOLE *pgtlibole = NULL;
+ DEFN_TYPEBIND *pdfntbindMod = NULL;
+ DEFN_TYPEBIND *pdfntbindRefLib = NULL;
+ DYN_TYPEBIND *pdtbindMod = NULL;
+ GENPROJ_TYPEBIND *pgptbindRefLib = NULL;
+ TYPE_DATA *ptdataMod = NULL;
+ HVAR_DEFN hvdefn;
+ ITypeLibA *ptlibRef = NULL;
+ GEN_DTINFO *pgdti = NULL;
+ BINDINFO bindinfoProjLevel;
+ TIPERROR err = TIPERR_None;
+ HLNAM hlnam;
+ NAMMGR *pnammgr;
+
+ DebAssert((pexbind != NULL), "bad param.");
+
+ pgtlibole = Pgtlibole(); // get containing typelib.
+ fMatchProj = FALSE; // be pessimistic
+
+
+ // Get containing typelib's nammgr
+ IfErrRet(pgtlibole->GetNamMgr(&pnammgr));
+
+
+ // Get the HLNAM of the HGNAM
+ hlnam = pnammgr->HlnamOfHgnam(hgnam);
+
+ // Look up name at project-level.
+ indexMatch = m_gbindnametbl.IndexOfHlnam(hlnam);
+
+ if (indexMatch != BIND_INVALID_INDEX) {
+ // We have a project-level match!
+ fMatchProj = TRUE;
+
+ // We cache all the attributes of gpbinddescMatch here
+ // since it's in movable memory. To do so we simply shallow
+ // copy it to a local stack-alloced BIND_DESC.
+ //
+ gpbinddescMatch = *(m_gbindnametbl.QgpbinddescOfIndex(indexMatch));
+
+ // Get the module or project's ordinal in its respective
+ // container collection.
+ //
+ uOrdinal = gpbinddescMatch.Ordinal();
+
+ // Then get its possibly cached typebind unless it's the
+ // the current project: in that case we already have
+ // its typebind, namely this.
+ // 0xFFFF means the current project -- all other modules and
+ // ref'ed projs have an ordinal >= 0 that is set when
+ // the BIND_DESC is created.
+ //
+ if (uOrdinal == (UINT)0xFFFF) {
+ // they want to bind to something in the current project...
+ bindinfoProjLevel.m_bindinfokind = BINDINFOKIND_OB;
+ bindinfoProjLevel.m_pdfntbind = this;
+ }
+ else if (gpbinddescMatch.IsTypeInfo()) {
+ // Create a bindinfo for this module.
+ bindinfoProjLevel.m_bindinfokind = BINDINFOKIND_OB;
+ bindinfoProjLevel.m_pdfntbind =
+ m_gbindnametbl.PdtbindOfOrdinal(uOrdinal);
+ }
+
+ // If we matched on a module then ensure that
+ // that its TYPEBIND is in the appropriate compstate.
+ // Likewise for a project.
+ // If we haven't yet cached the typebind for the module
+ // or project, then get the appropriate typebind and cache it now.
+ //
+ if (bindinfoProjLevel.IsEmpty() ||
+ (bindinfoProjLevel.BindInfoKind() == BINDINFOKIND_OB &&
+ bindinfoProjLevel.Pdfntbind() == NULL) ||
+ (bindinfoProjLevel.BindInfoKind() == BINDINFOKIND_NonOB &&
+ bindinfoProjLevel.Ptcomp() == NULL)) {
+ // This switches on proj vs. mod-level, and produces
+ // a non-null bindinfoProjLevel
+ //
+ if (gpbinddescMatch.IsTypeInfo()) {
+ // Get the gdtinfo for the module and then its typebind
+ IfErrRet(pgtlibole->GetGdtiOfItyp(uOrdinal, &pgdti));
+
+ // Get the typebind.
+ IfErrGo(pgdti->PdfntbindSemiDeclared(&pdfntbindMod));
+
+ pdtbindMod =
+ (DYN_TYPEBIND *)pdfntbindMod->QueryProtocol(DYN_TYPEBIND::szProtocolName);
+ DebAssert(pdtbindMod != NULL, "bad DYN_TYPEBIND.");
+
+ // bump internal refcount.
+ pdtbindMod->AddInternalRef();
+
+ // and cache.
+ m_gbindnametbl.SetPdtbindOfOrdinal(uOrdinal, pdtbindMod);
+
+ bindinfoProjLevel.m_bindinfokind = BINDINFOKIND_OB;
+ bindinfoProjLevel.m_pdfntbind = pdtbindMod;
+
+ // and release the typeinfo
+ RELEASE(pgdti);
+ }
+ } // if !bindinfoProjLevel.IsEmpty()
+
+ DebAssert(!bindinfoProjLevel.IsEmpty(),
+ "whoops! no proj-level typebind/typecomp.");
+
+ // Ensure that if a module-level typebind it's
+ // (1) That the access attribute matches.
+ // (2) in DECLARED if need be.
+ //
+ BOOL isClassOk;
+
+ if (gpbinddescMatch.IsTypeInfo()) {
+ pdtbindMod = (DYN_TYPEBIND *)
+ (bindinfoProjLevel.Pdfntbind()->
+ QueryProtocol(DYN_TYPEBIND::szProtocolName));
+ DebAssert(pdtbindMod != NULL, "bad DYN_TYPEBIND.");
+ // Note that for now the only
+ // types (i.e. modules) that are in the variable namespace are:
+ // appobj COCLASSes, ENUM, MODULE -- thus for others we fail to bind
+ // if the client wants to bind to a non-type. Eventually
+ // we'll explicitly flag each typeinfo as to whether its
+ // name is in the variable namespace.
+ //
+ TYPEKIND tkindMod = pdtbindMod->GetTypeKind();
+ // Either a class or coclass with either the appobject or the
+ // predeclared identifier is ok.
+ //
+ isClassOk =
+ (tkindMod == TKIND_COCLASS
+ )
+ && (pdtbindMod->Pdtroot()->GetTypeFlags() & TYPEFLAG_FAPPOBJECT
+ || pdtbindMod->Pdtroot()->GetTypeFlags() & TYPEFLAG_FPREDECLID);
+ if (!fWantType &&
+ !((tkindMod == TKIND_ENUM) ||
+ (tkindMod == TKIND_MODULE) ||
+ isClassOk))
+ {
+ fMatchProj = FALSE;
+ indexMatch = BIND_INVALID_INDEX;
+ goto NoProjLevelMatch;
+ }
+ if (IsMatchOfVisibility(pdtbindMod->Pdtroot()->Access(),
+ accessProj) == FALSE) {
+ // Matched private module and we want only public modules.
+ // "break" by resetting fMatchProj.
+ // Note: we reset indexMatch to BIND_INVALID_INDEX so that we can
+ // "reuse" it later -- this isn't strictly necesssary
+ // but we assert thus later...
+ //
+ fMatchProj = FALSE;
+ indexMatch = BIND_INVALID_INDEX;
+ }
+ else {
+ if (compstate == CS_DECLARED) {
+ IfErrGo(pdtbindMod->Pdtroot()->EnsureInDeclaredState());
+ }
+ else {
+ DebAssert(compstate == CS_SEMIDECLARED,
+ "bad compstate.");
+ }
+
+ // Check to see if we need to bind to the the predeclared
+ // identifier. Note that only class and coclass types
+ // that are flagged as appobjs or predeclared ids
+ // have predeclared ids. Note in addition that we only
+ // bind to the predeclared id if they want to bind to
+ // a non-type.
+ //
+ if (!fWantType && isClassOk)
+ {
+ ITypeInfoA *ptinfoPredeclared;
+ // Get the TYPE_DATA and the predeclared VAR_DEFN
+ ptdataMod = pdtbindMod->Ptdata();
+ hvdefn = pdtbindMod->HvdefnPredeclared();
+ // Set the output parameter and return
+ pexbind->SetBindKind(BKIND_OneVarMatch);
+ pexbind->SetHdefn(hvdefn);
+ pexbind->SetPtdata(ptdataMod);
+ ptinfoPredeclared = ptdataMod->Pdtroot()->Pgdtinfo();
+ pexbind->SetPtinfo(ptinfoPredeclared);
+ ptinfoPredeclared->AddRef(); // client must release
+ return TIPERR_None;
+ }
+ } // if visibility match
+ }
+
+ if (fMatchProj == TRUE) {
+ // Note that the only way the fMatchProj could have
+ // become reset is if the visibility attr didn't match.
+ //
+ // Setup result param.
+ if (bindinfoProjLevel.BindInfoKind() == BINDINFOKIND_OB) {
+ pexbind->SetPdfntbind(bindinfoProjLevel.Pdfntbind());
+ }
+ else {
+ }
+ pexbind->SetBindKind((BIND_KIND)(gpbinddescMatch.IsTypeInfo() ?
+ BKIND_DynTypeBindMatch :
+ BKIND_ProjTypeBindMatch));
+ return TIPERR_None;
+ }
+ } // if proj-level match
+
+NoProjLevelMatch:
+
+ // In the OLE case, don't attempt to bind in the modules
+ // if we are searching for a type.
+ //
+ if (fWantType)
+ return TIPERR_None;
+
+
+ // No match at proj-level, so try the individual modules...
+ //
+ DebAssert((fMatchProj == FALSE) &&
+ (indexMatch == BIND_INVALID_INDEX), "bad match.");
+
+ // Decide if we want to bind using the nammgr or the name cache
+ // optimizations. We want to use the name cache if:
+ // - we are attempting to bind to a type (OB only)
+ // or
+ // - the project only wants to bind to a public modules and
+ // the name is ambiguous.
+ //
+ if (fWantType
+ || !pnammgr->IsValidItyp(hlnam)
+ || accessProj == ACCESS_Public && pnammgr->IsAmbiguous(hlnam)) {
+ // Try to bind.
+ IfErrRet(BindModulesWithCaches(fWantType,
+ hgnam,
+ fuInvokeKind,
+ access,
+ accessProj,
+ compstate,
+ pexbind));
+ }
+ else {
+ // Try to bind.
+ IfErrRet(BindModulesWithNammgr(fWantType,
+ hgnam,
+ fuInvokeKind,
+ access,
+ accessProj,
+ compstate,
+ pexbind));
+ }
+
+ // Fall through...
+
+Error:
+ RELEASE(pgdti);
+ RELEASE(ptlibRef);
+ return err;
+}
+
+
+/***
+*PROTECTED GENPROJ_TYPEBINDs::BindModulesWithCaches
+*Purpose:
+* Bind to a type or nontype in the modules of this project
+*
+*Entry:
+* BindModuleLevel Module-level binding function callback (IN).
+* szName Name of id to bind. (IN)
+* fuInvokeKind Flag word: invoke kinds (IN).s
+* accessMod Visibility attr for names at module-level
+* private means everything etc. (IN)
+* accessProj Visibility attr for names at proj-level (IN).
+* compstate What state to bring module to when bound.
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::BindModulesWithCaches(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ COMPSTATE compstate,
+ EXBIND *pexbind)
+{
+ BOOL fMatch;
+ UINT ityp;
+ UINT iGlobalBucket, iGlobalBucketNext;
+ GENPROJ_BIND_DESC gpbinddescMatch;
+ EXBIND exbindMatch;
+ GenericTypeLibOLE *pgtlibole;
+ TIPERROR err;
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+
+ pgtlibole = Pgtlibole(); // get containing typelib.
+ fMatch = FALSE;
+
+ // Reset the exbind
+ *pexbind = EXBIND();
+
+ // Get containing typelib's nammgr
+ IfErrRet(pgtlibole->GetNamMgr(&pnammgr));
+
+ // Map string to hlnam
+ hlnam = pnammgr->HlnamOfHgnam(hgnam);
+
+ // Loop through the TypeInfos which expose global names, checking
+ // the name cache and (if there's a hit) attempting to bind to
+ // the name.
+ //
+ // Get the first type that exposes global names.
+ iGlobalBucket = m_gbindnametbl.IndexFirstGlobal();
+
+ while (iGlobalBucket != BIND_INVALID_INDEX) {
+ // Cache the next global so we don't have to redef later.
+ gpbinddescMatch = *(m_gbindnametbl.QgpbinddescOfIndex(iGlobalBucket));
+ iGlobalBucketNext = gpbinddescMatch.IndexNextGlobal();
+
+ // The last entry of the list is determined by a reference
+ // to itself.
+ //
+ if (iGlobalBucket == iGlobalBucketNext) {
+ iGlobalBucketNext = BIND_INVALID_INDEX;
+ }
+ ityp = gpbinddescMatch.Ordinal();
+
+ // We have the index of the TypeInfo we are most interested
+ // in, so attempt to bind.
+ //
+ // Keeps name cache stats
+ pgtlibole->DebSetNameCacheModTrys();
+
+ // Cache is not valid or the name is in the cache, try to bind
+ if (!pgtlibole->IsValidNameCache(ityp) ||
+ pgtlibole->IsNameInCache(ityp, hgnam)) {
+
+ // Keeps name cache stats
+ pgtlibole->DebSetNameCacheModHits();
+
+ // Try to bind.
+ IfErrGo(BindItyp(ityp,
+ fWantType,
+ hgnam,
+ fuInvokeKind,
+ access,
+ accessProj,
+ compstate,
+ &exbindMatch));
+
+ // Did we bind?
+ if (!exbindMatch.IsNoMatch()) {
+
+ // Keeps name cache stats
+ pgtlibole->DebSetNameCacheGlobHits();
+
+ if (fMatch == FALSE) {
+ // This is the first match, remember it...
+ // and hope we don't match again, cos if we do
+ // it's an ambiguity.
+ //
+ fMatch = TRUE;
+
+ // Setup OUT params.
+ // Note: we are copying handles or pointers.
+ // The pointers are owned by their binding table
+ // thus the client must eventually call ReleaseResources()
+ // and must guarantee not to cache them beyond that.
+ //
+ *pexbind = exbindMatch;
+ exbindMatch = EXBIND();
+ }
+ else {
+ err = TIPERR_AmbiguousName;
+ goto Error;
+ } // if previously matched
+ } // if match
+ } // if module visible
+ // Move on to the next name
+ iGlobalBucket = iGlobalBucketNext;
+ } // while in list
+ // Fall through...
+
+Error:
+ // In the error case, need to release the ptinfo from the first
+ // match and possibly a second ambiguous.
+ //
+ if (err != TIPERR_None) {
+ if (fMatch == TRUE) {
+ // We matched at least once and save the match in pexbind.
+ if (pexbind->Ptinfo() != NULL) {
+ pexbind->Ptinfo()->Release();
+ }
+ }
+ // If we matched twice -- so release the 2nd match as well.
+ if (exbindMatch.Ptinfo() != NULL) {
+ exbindMatch.Ptinfo()->Release();
+ }
+ }
+
+ return err;
+}
+
+
+/***
+*PROTECTED GENPROJ_TYPEBINDs::BindModulesWithNammgr
+*Purpose:
+* Bind to a type or nontype in the modules of this project
+*
+*Entry:
+* BindModuleLevel Module-level binding function callback (IN).
+* szName Name of id to bind. (IN)
+* fuInvokeKind Flag word: invoke kinds (IN).s
+* accessMod Visibility attr for names at module-level
+* private means everything etc. (IN)
+* accessProj Visibility attr for names at proj-level (IN).
+* compstate What state to bring module to when bound.
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::BindModulesWithNammgr(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ COMPSTATE compstate,
+ EXBIND *pexbind)
+{
+ UINT ityp;
+ HLNAM hlnam;
+ GenericTypeLibOLE *pgtlibole;
+ TIPERROR err;
+ NAMMGR *pnammgr;
+
+ pgtlibole = Pgtlibole(); // get containing typelib.
+
+ // Reset the exbind
+ *pexbind = EXBIND();
+
+ // Get containing typelib's nammgr
+ IfErrRet(pgtlibole->GetNamMgr(&pnammgr));
+
+ // Map hgnam to hlnam
+ hlnam = pnammgr->HlnamOfHgnam(hgnam);
+
+ // Check the nammgr to see if this name is valid and
+ // is global. If so, bind to it.
+ //
+ if (pnammgr->IsValidItyp(hlnam) && pnammgr->IsGlobal(hlnam)) {
+
+ // If this name is marked as ambiguous, return an error.
+ if (pnammgr->IsAmbiguous(hlnam)) {
+ return TIPERR_AmbiguousName;
+ }
+
+ ityp = pnammgr->ItypOfHlnam(hlnam);
+
+ // We have the index of the TypeInfo we are most interested
+ // in, so attempt to bind.
+ //
+ IfErrGo(BindItyp(ityp,
+ fWantType,
+ hgnam,
+ fuInvokeKind,
+ access,
+ accessProj,
+ compstate,
+ pexbind));
+ }
+
+Error:
+ // In the error case, need to release the ptinfo from the first
+ // match.
+ //
+ if (err != TIPERR_None) {
+ // We matched at least once and save the match in pexbind.
+ if (pexbind->Ptinfo() != NULL) {
+ pexbind->Ptinfo()->Release();
+ }
+ }
+
+ return err;
+}
+
+
+/***
+*PROTECTED GENPROJ_TYPEBIND::BindItyp
+*Purpose:
+* Attempt to bind to the given name in the given ityp.
+*
+*Implementation Notes:
+* Defers to generic id binder passing in callback to
+* use at module-level.
+*
+* NOTE: pexbind should be cleared before this function is called.
+* Also, pexbind is not cleaned up if there is an error, the caller
+* should do this.
+*
+*Entry:
+* ityp Index to the typeinfo to bind to
+* szName Name of type id to bind. (IN)
+* fuInvokeKind IGNORED FOR TYPES.
+* access Module-level visibility
+* accessProj Visibility attr for names at proj-level (IN).
+* compstate What state to bring module to when bound.
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::BindItyp(UINT ityp,
+ BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ COMPSTATE compstate,
+ EXBIND *pexbind)
+{
+ GenericTypeLibOLE *pgtlibole = NULL;
+ DEFN_TYPEBIND *pdfntbindMod = NULL;
+ DYN_TYPEBIND *pdtbindMod = NULL;
+ GEN_DTINFO *pgdti = NULL;
+ BOOL fImplicitAppobj;
+ TIPERROR err = TIPERR_None;
+
+ DebAssert((pexbind != NULL), "bad param.");
+
+ pgtlibole = Pgtlibole(); // get containing typelib.
+
+ // If there's a module-level typebind in the BIND_DESC
+ // already use it,otherwise get the typeinfo for the module.
+ //
+ pdtbindMod = m_gbindnametbl.PdtbindOfOrdinal(ityp);
+
+ if (pdtbindMod != NULL) {
+#if ID_DEBUG
+ DebAssert(pdtbindMod->GetTypeKind() == TKIND_MODULE ||
+ pdtbindMod->GetTypeKind() == TKIND_ENUM ||
+ (pdtbindMod->Pdtroot()->GetTypeFlags() &
+ TYPEFLAG_FAPPOBJECT) != 0, "bad typebind.");
+#endif // ID_DEBUG
+
+ // Ensure that it's still in at least semi-declared.
+ // If not, rebuild...
+ //
+ if (pdtbindMod->Pdtroot()->CompState() < CS_SEMIDECLARED) {
+ // This doesn't bump refcount.
+ IfErrRet(pdtbindMod->Pdtroot()->PdfntbindSemiDeclared(&pdfntbindMod));
+ pdtbindMod = (DYN_TYPEBIND *)
+ pdfntbindMod->QueryProtocol(DYN_TYPEBIND::szProtocolName);
+ DebAssert(pdtbindMod != NULL, "bad DYN_TYPEBIND.");
+ }
+ }
+ else {
+ // No typebind loaded yet for this module, load it
+ // and see if it's standard -- if so, load its
+ // typebind and cache it. Don't forget to
+ // bump its internal refcount.
+ //
+ IfErrRet(pgtlibole->GetGdtiOfItyp(ityp, &pgdti));
+
+ // Switch on m_compstateModule -- which
+ // is set by proj-level GetDefnTypeBind[SemiDeclared].
+ // The idea is that when in "evalconstexpr" mode,
+ // the exmgr sets the compstate to SEMIDECLARED
+ // and if in "codegen" mode the DECLARED and
+ // here is where we switch on it.
+ // ISSUE: are there reentrancy probs? race-conditions?
+ //
+ // What we actually do is get a SEMIDECLARED
+ // typebind and attempt to match. If no match,
+ // then regardless of how m_compstateModule is set
+ // there's no point bringing all the way to DECLARED.
+ // If there is a match, then we bring the module
+ // to DECLARED iff the m_compstateModule is DECLARED.
+
+ // This doesn't bump refcount.
+ IfErrGo(pgdti->PdfntbindSemiDeclared(&pdfntbindMod));
+
+ pdtbindMod =
+ (DYN_TYPEBIND *)pdfntbindMod->QueryProtocol(DYN_TYPEBIND::szProtocolName);
+ DebAssert(pdtbindMod != NULL, "bad DYN_TYPEBIND.");
+
+ // Might as well cache the TYPEBIND we just loaded
+ // in the binding table
+ // and bump its internal refcount at this point
+ // to ensure that the module won't get unloaded.
+ //
+ pdtbindMod->AddInternalRef();
+
+ // Cache it.
+ m_gbindnametbl.SetPdtbindOfOrdinal(ityp, pdtbindMod);
+ } // if pdtbind != NULL
+
+ // We should reach here with non-NULL pdtbindMod,
+ // which means that either we had a cached one in
+ // our binding table or we just loaded one. In any
+ // event, it will be for a standard module
+ // or Class or CoClass.
+ //
+ DebAssert(pdtbindMod != NULL, "should have dtbind.");
+
+ // Ensure that we can see this module -- E.g.
+ // if we're referencing it from another project
+ // then it must be public.
+ //
+ if (IsMatchOfVisibility(pdtbindMod->Pdtroot()->Access(), accessProj)) {
+ // Determine whether we're binding to an implict appobj,
+ // if so, and we successfully bind we will want to actually
+ // return to our caller the VARDEFN of the appobj!
+ //
+ fImplicitAppobj =
+ pdtbindMod->Pdtroot()->GetTypeFlags() & TYPEFLAG_FAPPOBJECT;
+
+ // Try and bind in this module.
+ IfErrGo(pdtbindMod->BindIdDefn(fWantType,
+ hgnam,
+ fuInvokeKind,
+ access,
+ pexbind));
+
+ // Did we match?
+ if (!pexbind->IsNoMatch()) {
+ DebAssert(pexbind->IsFuncMatch() ||
+ pexbind->IsOneVarMatch() ||
+ pexbind->IsNestedTypeBindMatch(),
+ "bad match.");
+
+
+ // Ensure that exbind contains a pointer to
+ // the TypeInfo which we started with not the
+ // base class in which we found the member
+ // This is just needed for AppObject support.
+ // Only do this abomination if we're binding to
+ // a non-type id.
+ //
+ if (fImplicitAppobj & !fWantType) {
+ pexbind->Ptinfo()->Release();
+
+ // We need to get the typebind's typeinfo since
+ // we might have retrieved the typebind from
+ // the cache and thus never loaded its typeinfo.
+ //
+ pexbind->SetPtinfo(pdtbindMod->Pdtroot()->Pgdtinfo());
+ pdtbindMod->Pdtroot()->Pgdtinfo()->AddRef();
+
+ // Set the bindkind to implicit appobj
+ pexbind->SetBindKind(BKIND_ImplicitAppobjMatch);
+
+ // Set the vardefn to be the appobj's predeclared id.
+ pexbind->SetHdefn(pdtbindMod->HvdefnPredeclared());
+
+ // And finally its typedata
+ pexbind->SetPtdata(pdtbindMod->Ptdata());
+ } // if implicitappobj && !type
+ } // if we matched
+ } // if visible
+
+Error:
+ RELEASE(pgdti);
+
+ return err;
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::BindTypeDefnProjLevelStr
+*Purpose:
+* Bind to type at project level.
+*
+*Implementation Notes:
+* Map str to hgnam and defer to proj-level hgnam binder.
+*
+*Entry:
+* szName Name of type id to bind. (IN)
+* fuInvokeKind IGNORED FOR TYPES.
+* access Mod-level Visibility attr:
+* private means everything etc. (IN)
+* accessProj Proj-level Visibility attr:
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::BindTypeDefnProjLevelStr(
+ LPSTR szName,
+ UINT, // fuInvokeKind: ignored
+ ACCESS access,
+ ACCESS accessProj,
+ EXBIND *pexbind)
+{
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+ HGNAM hgnam;
+ TIPERROR err;
+
+ // Bind to a non-type id in this project.
+ // Map str to hgnam and defer to hgnam binder.
+ //
+ IfErrRet(Pgtlibole()->GetNamMgr(&pnammgr));
+
+ // get the hlnam to pass to BindDefn
+ hlnam = pnammgr->HlnamOfStrIfExist(szName);
+
+ if (hlnam == HLNAM_Nil) {
+ // Make sure pexbind is set to nomatch
+ pexbind->SetBindKind(BKIND_NoMatch);
+
+ return TIPERR_None;
+ }
+
+ // Get the hgnam of this hlnam
+ IfErrRet(pnammgr->HgnamOfHlnam(hlnam, &hgnam));
+
+ return BindProjLevel(TRUE,
+ hgnam,
+ 0, // ignored
+ access,
+ accessProj,
+ Compstate(),
+ pexbind);
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::BindDefnProjLevelStr
+*Purpose:
+* Bind to non-type or type id at project level.
+*
+*Implementation Notes:
+* Map str to hgnam and defer to proj-level hgnam binder.
+*
+*Entry:
+* szName Name of id to bind. (IN)
+* fuInvokeKind invoke kind flags (IN)
+* access Mod-level Visibility attr:
+* private means everything etc. (IN)
+* accessProj Proj-level Visibility attr:
+* pexbind Pointer to caller-allocated struct for EXBIND (IN/OUT).
+*
+*Exit:
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR GENPROJ_TYPEBIND::BindDefnProjLevelStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ EXBIND *pexbind)
+{
+ NAMMGR *pnammgr;
+ HGNAM hgnam;
+ HLNAM hlnam;
+ TIPERROR err;
+
+ // Bind to a non-type id in this project.
+ // Map str to hgnam and defer to hgnam binder.
+ //
+ IfErrRet(Pgtlibole()->GetNamMgr(&pnammgr));
+
+ // get the hlnam to pass to BindDefn
+ hlnam = pnammgr->HlnamOfStrIfExist(szName);
+
+ if (hlnam == HLNAM_Nil) {
+ // Make sure pexbind is set to nomatch
+ pexbind->SetBindKind(BKIND_NoMatch);
+
+ return TIPERR_None;
+ }
+
+ // Get the hgnam of this hlnam
+ IfErrRet(pnammgr->HgnamOfHlnam(hlnam, &hgnam));
+
+ return BindProjLevel(FALSE,
+ hgnam,
+ fuInvokeKind,
+ access,
+ accessProj,
+ Compstate(),
+ pexbind);
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::ReleaseResources
+*Purpose:
+* Release resources owned by proj-level binder.
+*
+*Implementation Notes:
+* Defers to binding table.
+*
+*Entry:
+*
+*Exit:
+*
+*Errors:
+* None
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID GENPROJ_TYPEBIND::ReleaseResources()
+{
+ m_gbindnametbl.ReleaseResources();
+
+}
+#pragma code_seg()
+
+
+
+
+#if ID_DEBUG
+
+VOID GENPROJ_TYPEBIND::DebCheckState(UINT uLevel) const
+{
+ DebAssert(m_compstateModule == CS_SEMIDECLARED ||
+ m_compstateModule == CS_DECLARED, "bad compstate.");
+
+ m_gbindnametbl.DebCheckState(uLevel);
+}
+
+
+VOID GENPROJ_TYPEBIND::DebShowState(UINT uLevel) const
+{
+ DebPrintf("*** GENPROJ_TYPEBIND ***\n");
+
+ m_gbindnametbl.DebShowState(uLevel);
+}
+
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/typelib/gptbind.hxx b/private/oleauto/src/typelib/gptbind.hxx
new file mode 100644
index 000000000..5021d4085
--- /dev/null
+++ b/private/oleauto/src/typelib/gptbind.hxx
@@ -0,0 +1,254 @@
+/***
+*gptbind.hxx - GENPROJ_TYPEBIND header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Implementation of TYPEBIND at project-level.
+*
+*Revision History:
+*
+* 13-Mar-92 ilanc: Created.
+* 30-Jul-92 w-peterh: removed function overloading
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef GENPROJ_TYPEBIND_HXX_INCLUDED
+#define GENPROJ_TYPEBIND_HXX_INCLUDED
+
+#include "stream.hxx"
+#include "dfntbind.hxx"
+#include "dtbind.hxx" // for DYN_TYPEBIND
+#include "defn.hxx" // for DEFN binding structs.
+#include "gbindtbl.hxx" // for GENPROJ_BINDNAME_TABLE
+// #include "gtlibole.hxx"
+
+
+class GenericTypeLibOLE;
+class EXBIND;
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szGPTBIND_HXX)
+#define SZ_FILE_NAME g_szGPTBIND_HXX
+#endif
+
+class GENPROJ_TYPEBIND;
+class MOCKUP_TYPEBIND;
+
+/***
+*class GENPROJ_TYPEBIND - 'gptbind': Generic proj-level binding impl
+*Purpose:
+* The class defines the project-level type bind.
+*
+***********************************************************************/
+
+class GENPROJ_TYPEBIND : public DEFN_TYPEBIND
+{
+ friend class GEN_PROJECT;
+ friend class GenericTypeLibOLE;
+
+public:
+ GENPROJ_TYPEBIND();
+ nonvirt TIPERROR Init(SHEAP_MGR *psheapmgr);
+
+ // overridden methods
+ virtual ~GENPROJ_TYPEBIND();
+ virtual LPVOID QueryProtocol(LPOLESTR szInterfaceName);
+ virtual VOID Release();
+ virtual VOID AddRef();
+
+ virtual TIPERROR GetTypeInfo(TYPEINFO **lplptinfo);
+ virtual TYPEKIND GetTypeKind();
+ virtual BOOL IsProtocol();
+ virtual USHORT GetCbSize();
+ virtual USHORT GetAlignment();
+
+ virtual TIPERROR BindDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind);
+
+ virtual TIPERROR BindTypeDefnStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ EXBIND *pexbind);
+
+ virtual TIPERROR BindDefnProjLevelStr(LPSTR szName,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ EXBIND *pexbind);
+
+ virtual TIPERROR BindTypeDefnProjLevelStr(LPSTR szName,
+ UINT, // fuInvokeKind: unused
+ ACCESS access,
+ ACCESS accessProj,
+ EXBIND *pexbind);
+
+
+
+
+ // introduced methods
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt GenericTypeLibOLE *Pgtlibole() const;
+ nonvirt VOID ReleaseResources();
+
+ nonvirt TIPERROR AddNameToTable(LPSTR szName, UINT ityp, BOOL isTypeInfo);
+ nonvirt TIPERROR RemoveNameFromTable(LPOLESTR szName);
+#if 0
+ nonvirt TIPERROR VerifyNameOfOrdinal(LPSTR szName,
+ UINT ityp,
+ BOOL isTypeInfo);
+#endif
+
+ nonvirt const GENPROJ_BINDNAME_TABLE *Pgbindnametbl() const;
+
+ nonvirt TIPERROR BindProjLevel(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ COMPSTATE compstate,
+ EXBIND *pexbind);
+
+ nonvirt TIPERROR BindAll(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ COMPSTATE compstate,
+ EXBIND *pexbind);
+
+
+ nonvirt COMPSTATE Compstate() const;
+
+ // Public data members
+ static LPOLESTR szProtocolName;
+ static LPSTR szBaseName;
+
+ static CONSTDATA UINT oGbindnametbl;
+
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebShowState(UINT uLevel) const;
+#else //!ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+#endif //!ID_DEBUG
+
+protected:
+
+ // Note: 1st parameter is of type member function.
+ nonvirt TIPERROR BindItyp(UINT ityp,
+ BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ COMPSTATE compstate,
+ EXBIND *pexbind);
+
+ // Note: 1st parameter is of type member function.
+ nonvirt TIPERROR BindModulesWithCaches(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ COMPSTATE compstate,
+ EXBIND *pexbind);
+
+ // Note: 1st parameter is of type member function.
+ nonvirt TIPERROR BindModulesWithNammgr(BOOL fWantType,
+ HGNAM hgnam,
+ UINT fuInvokeKind,
+ ACCESS access,
+ ACCESS accessProj,
+ COMPSTATE compstate,
+ EXBIND *pexbind);
+
+private:
+ COMPSTATE m_compstateModule; // for BindDefnProjLevel()
+
+ // GENPROJ_BINDNAME_TABLE embedded instance
+ GENPROJ_BINDNAME_TABLE m_gbindnametbl;
+
+
+#ifdef GENPROJ_TYPEBIND_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::Pbindnametbl - accessor for BINDNAME_TABLE.
+*Purpose:
+* Gets BINDNAME_TABLE ptr.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* BINDNAME_TABLE *
+*
+***********************************************************************/
+
+inline const GENPROJ_BINDNAME_TABLE *GENPROJ_TYPEBIND::Pgbindnametbl() const
+{
+ return &m_gbindnametbl;
+}
+
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::GetTypeInfo
+*Purpose:
+* N/A
+*
+*Implementation Notes:
+* Inapplicable to typelibs -- they don't have typeinfos.
+*
+*Entry:
+* pptinfo
+*Exit:
+* TIPERROR
+* Produces NULL ptr.
+*
+***********************************************************************/
+
+inline TIPERROR GENPROJ_TYPEBIND::GetTypeInfo(TYPEINFO **pptinfo)
+{
+ // Inapplicable to typelibs -- they don't have typeinfos.
+ DebAssert(pptinfo, "bad param.");
+
+ *pptinfo = NULL;
+ return TIPERR_None;
+}
+
+/***
+*PUBLIC GENPROJ_TYPEBIND::Compstate()
+*Purpose:
+* Gets the target compstate.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* BINDNAME_TABLE *
+*
+***********************************************************************/
+
+inline COMPSTATE GENPROJ_TYPEBIND::Compstate() const
+{
+ return m_compstateModule;
+}
+
+
+#endif // ! GENPROJ_TYPEBIND_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/gtlibole.cxx b/private/oleauto/src/typelib/gtlibole.cxx
new file mode 100644
index 000000000..9d37d0ec9
--- /dev/null
+++ b/private/oleauto/src/typelib/gtlibole.cxx
@@ -0,0 +1,6619 @@
+/**
+*gtlibole.cxx - GenericTypeLibOLE
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Implementation of the TypeLib protocol which supports reading
+* TypeLib's only. Derivatives of this implementation can support
+* reading and writing.
+* This TypeLib implementation uses an IStorage for storage.
+*
+*Implementation:
+* NOTE: currently 18-Mar-93 there are 3 funcs that can be the
+* first call into typelib.dll - these functions must call InitAppData().
+* CreateTypeLib, LoadTypeLib, RegisterTypeLib -- as you add
+* similar such funcs, you have to call InitAppData() as well!
+*
+* Type Entry Array:
+* The implementation uses an array of TYPE_ENTRY structures each of which
+* describes an element of the library. This array is stored in the
+* directory stream of the IStorage. Elements of the library are identified
+* by their index in this array. These indexes are sometimes encapsulated
+* as HTENTRYs (handles to type entries). The interface to ITypeLibs uses
+* indexes; however, it is possible that the implementation might change to
+* not treat the passed in indexes as indexes into the TYPE_ENTRY array and
+* in that case the concept of an HTENTRY would become useful.
+*
+* Local TypeIds
+* Currently the implementation of GenericTypeLibOLE always assumes that the
+* the TypeInfos stored in it are not separately registered since the
+* implementation of GetRegId always prepends the libid to the stored
+* local TypeId.
+* It would be possible to extend this implementation
+* so it maintained a flag indicating whether or not the types are
+* registered independently. Currently it is assumed that the library
+* is just registered.
+*
+* Hash Table:
+* A hash table which maps a TYPEID to the TYPE_ENTRY for the specified
+* type is maintained so that the GetTypeInfo function which returns
+* a TYPEINFO given its TYPEID can determine the correct TYPE_ENTRY quickly.
+*
+* Storage:
+* A GenericTypeLibOLE instance is stored within a SHEAP_MGR heap. It is stored
+* immediatly following the SHEAP_MGR instances. Operator new and operator
+* delete allocate/deallocate the SHEAP_MGR heap. The heap is used
+* to contain a BLK_DESC containing the TYPE_ENTRY array and a BLK_MGR
+* containing the hash table.
+*
+* STL_TYPEINFO:
+* The GenericTypeLibOLE implementation and its derivatives can not store any
+* implementation of the TYPEINFO protocol; they can only store TYPEINFO
+* implementations that derive from STL_TYPEINFO. STL_TYPEINFO is an
+* class which provides a partial implementation of the TYPEINFO protocol
+* and adds additional functions to support storing them in a GenericTypeLibOLE.
+* The STL_TYPEINFO and GenericTypeLibOLE implementations coordinate loading,
+* unloading, adding and removing the TypeInfo instance to/from the TypeLib.
+*
+* SUPPORT FOR UNLOADING GenericTypeLibOLEs AND CONTAINED STL_TYPEINFOs:
+* There are two types of references to the TYPEINFOs in a GenericTypeLibOLE.
+* An internal reference is a reference to a Type from another Type within
+* the TypeLib. An external reference is a reference from outside
+* the TypeLib. An external reference to a Type in a TypeLib is sufficient
+* to keep that Type and its containing TypeLib loaded. An internal
+* reference is sufficent to keep a Type loaded as long as there is one
+* Type in the containing TypeLib which has an external reference.
+* Once there are no external references to any Type in the TypeLib,
+* then the TypeLib and all containing Types are unloaded.
+* To implement this a STL_TYPEINFO has two counters: one for internal
+* and one for external references. Each external reference to a TypeInfo
+* is counted as an external reference to a TypeLib. Thus the reference
+* count of a TypeLib is equal to the sum of the external reference counts
+* of its contained Types plus the number of direct references to the
+* TypeLib from client code. The internal reference count is maintained
+* via the AddInternalRef and RelInternalRef methods.
+*
+* The reference from a TypeLib to one of its contained TypeInfos is not
+* reference counted at all. When an internal or external reference to
+* a STL_TYPEINFO is removed (by calling Release or RelInternalRef
+* respectively), if there are no more internal or external references
+* then the TypeInfo is deleted and the containing GenericTypeLibOLE
+* is notified that the TypeInfo has been deleted.
+*
+*Revision History:
+*
+* 25-Apr-91 alanc: Created.
+* 17-Sep-92 rajivk: added functions for editing modules. Edit & Continue
+* 15-Nov-92 rajivk: Support for Project Version Number
+* 15-Nov-92 rajivk: Added CanProjChange Support
+* 15-Nov-92 rajivk: Cyclic refrence of project not allowed
+* 04-Apr-93 RajivK: Support for Typelib on MAC
+*
+*****************************************************************************/
+
+#include "typelib.hxx"
+#include "silver.hxx"
+#include <new.h>
+#include <time.h>
+#include <stdlib.h>
+
+#include "gtlibole.hxx"
+#include "stltinfo.hxx"
+#include "gdtinfo.hxx"
+#include "clutil.hxx"
+#include "dfntcomp.hxx"
+#include "dfstream.hxx"
+#include "oletmgr.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+
+#if OE_MACPPC
+// UNDONE: M68K: Make ifdef OE_MAC when using unified headers
+#include <macos\lowmem.h>
+#endif // OE_MACPPC
+
+#include <sys\types.h>
+#include <sys\stat.h>
+#if OE_MACPPC
+// UNDONE: M68K: Make ifdef OE_MAC when using unified headers
+#include <macos\lowmem.h>
+#endif // OE_MACPPC
+
+#if OE_WIN
+// WIN16 exe header format
+#include "newexe.h"
+#endif //OE_WIN
+#if OE_WIN16
+// WIN32 exe header format
+// Note: on Win32 the exe header definitions come from winnt.h
+typedef unsigned char UCHAR;
+typedef UCHAR FAR* PUCHAR;
+typedef USHORT FAR* PUSHORT;
+typedef ULONG FAR* PULONG;
+typedef VOID FAR* PVOID;
+typedef BOOL BOOLEAN;
+#include "ntimage.h"
+#endif //OE_WIN16
+
+#if OE_MAC
+#include "macos\errors.h"
+#define _llseek _lseek
+#define _lread _read
+#define _lclose _close
+#endif
+
+#if OE_MAC
+//defined in wlm\winuser.h, but including that gives lots of errors
+#define CF_PRIVATEFIRST 0x0200
+#endif //!EI_OB && OE_MAC
+
+#if OE_WIN32
+#include "ntstring.h"
+#endif
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+static char szgtliboleCxx[] = __FILE__;
+#define SZ_FILE_NAME szgtliboleCxx
+#endif
+
+extern "C" GUID CLSID_PSDispatch;
+extern "C" GUID CLSID_PSAutomation;
+
+// Define static class constants
+CONSTDATA WORD GenericTypeLibOLE::wFirstSerWord = 'G' * 256 + 'T' * 32 + 'L';
+
+
+// Serialization format version number
+// WARNING: this is FIXED for typelib V2 -- do not change or you will break
+// WARNING: V2 typelib.dll compatiblity
+CONSTDATA WORD GenericTypeLibOLE::wDefaultVersion = 03; // DO NOT CHANGE
+CONSTDATA WORD GenericTypeLibOLE::wDualVersion = 04; // DO NOT CHANGE
+CONSTDATA WORD GenericTypeLibOLE::wMaxVersion = 04; // DO NOT CHANGE
+
+CONSTDATA XCHAR GenericTypeLibOLE::chMinorVerNumSep = '/';
+CONSTDATA OLECHAR GenericTypeLibOLE::chLibIdSep = WIDE('*');
+CONSTDATA LPOLESTR GenericTypeLibOLE::szDirStreamName = WIDE("dir");
+CONSTDATA UINT GenericTypeLibOLE::oGptbind =
+ offsetof(GenericTypeLibOLE, m_gptbind);
+
+
+/***
+* BOOL FFullyQualified() - Is path fully-qualifed or not
+*
+* Purpose:
+* This function give a conservative guess as to whether the a path is
+* fully-qualifed or not. For the mac, this if if the name begins with
+* a colon. For Windows, this is if this is a UNC pathname, or if the
+* name is of the form <driveletter>:\<path>, we assume it's fully-qualifed
+* (may not be if the <path> contains "." or ".." in it)
+*
+* Inputs:
+* szFile - The pathname to check
+*
+* Outputs:
+* TRUE if fully-qualifed, FALSE if not
+*
+* Implementation:
+*
+*****************************************************************************/
+#pragma code_seg(CS_INIT)
+static BOOL FFullyQualified(LPCOLESTR szFile)
+{
+#if OE_MAC
+ // on mac, it's fully-qualified if it does not starts with a ':' and
+ // if it is not a file name(i.e there is a ":" in the path).
+ return ((*szFile != ':') && (xstrchr(xstrinc(szFile), ':')));
+#else //OE_MAC
+ LPOLESTR pch;
+
+ DebAssert(*szFile, "we assume at least 2 bytes in pathname");
+ pch = ostrinc((LPOLESTR)szFile); // get 2nd char
+ if ((*szFile == '\\' && *pch == '\\') || // UNC pathname
+ (*pch == ':' && *ostrinc(pch) == '\\') // path of the form: x:\y
+ ) {
+ return TRUE; // assume fully-qualifed
+ }
+ return FALSE; // not fully-qualifed
+#endif //OE_MAC
+}
+#pragma code_seg()
+
+
+/***
+* TIPERROR GetRegisteredPath - Gets a path from the registry.
+*
+* Purpose:
+* In win16/32, this is merely a wrapper on RegQueryValue with existence
+* checking thrown in. On the Mac, this first tries the specified
+* RegQueryValue and, if the retrieved path doesn't exist, looks in the
+* Alias subkey to get an alias record and uses that alias record to
+* find the path.
+*
+* Inputs:
+* Same as RegQueryValue, where hkey is the parent key, szSubkey is the
+* name of the subkey whose value holds the path and which itself may
+* have an "Alias" subkey.
+* fMustExist == TRUE if we're to check to see that the path/file exists.
+* Otherwise, we just return what's in the registry without
+* checking if it exists, is fully-qualified, etc.
+*
+* Outputs:
+* Same as RegQueryValue, except the error code returned is a TIPERROR.
+*
+*************************************************************************/
+#pragma code_seg( CS_QUERY )
+TIPERROR GetRegisteredPath(HKEY hkey,
+ LPOLESTR szSubkey,
+ LPOLESTR szPath,
+ LONG *pcbPath,
+ BOOL fMustExist)
+{
+ struct _stat statBuf;
+
+ if (oRegQueryValue(hkey, szSubkey, szPath, pcbPath) != ERROR_SUCCESS)
+ return TIPERR_RegistryAccess;
+
+ // Verify that the path is valid and return if it is.
+ if (fMustExist == FALSE || ostat(szPath, &statBuf) != -1)
+ return TIPERR_None;
+
+#if OE_MAC
+ if (*szPath != '\0') { // code below can't handle a null path string
+ // system7 always has an alias manager
+ AliasHandle halias;
+ long cbAlias;
+ HKEY hkeyPath;
+ TIPERROR err;
+ BOOL wasChanged;
+
+ if (RegOpenKey(hkey, szSubkey, &hkeyPath) != ERROR_SUCCESS)
+ return TIPERR_RegistryAccess;
+
+ // Determine the size of the registered alias.
+ if (RegQueryValueEx(hkeyPath, "Alias", NULL, NULL, NULL, &cbAlias) != ERROR_SUCCESS) {
+ err = TIPERR_PathNotFound;
+ goto Error;
+ }
+ DebAssert(cbAlias >= sizeof(AliasRecord), "GetRegisteredPath");
+
+ // Allocate memory for the alias record. NewHandle must be
+ // used for this because ResolveAlias may try to resize the
+ // alias record assuming it was allocated by NewHandle.
+ halias = (AliasHandle)NewHandle(cbAlias);
+ if (halias == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ HLock((Handle)halias);
+ if (RegQueryValueEx(hkeyPath, "Alias", NULL, NULL, (unsigned char *)*halias, &cbAlias) != ERROR_SUCCESS) {
+ HUnlock((Handle)halias);
+ err = TIPERR_PathNotFound;
+ goto Error2;
+ }
+ HUnlock((Handle)halias);
+
+ // Convert the alias record to a path.
+ IfErrGo(GetPathFromAlias(halias, szPath, (UINT)*pcbPath, &wasChanged));
+
+ // If the alias record was updated during the resolution, write
+ // it back out to the registry. Ignore the error if this fails.
+ if (wasChanged) {
+ HLock((Handle)halias);
+ (void)RegSetValueEx(hkeyPath, "Alias", 0L, REG_BINARY, (char *)*halias, (*halias)->aliasSize);
+ HUnlock((Handle)halias);
+ }
+
+ // Now update the registered path, ignoring any errors.
+ (void)RegSetValue(hkeyPath, NULL, REG_SZ, szPath, *pcbPath);
+
+Error2:
+ // Release the alias record, now that we're done with it.
+ DisposeHandle((Handle)halias);
+
+Error:
+ RegCloseKey(hkeyPath);
+ return err;
+ }
+#endif // OE_MAC
+
+ return TIPERR_PathNotFound;
+}
+#pragma code_seg( )
+
+
+#pragma code_seg(CS_CREATE)
+/***
+* STDAPI CreateTypeLib() - Creates a new typelib.
+*
+* Purpose:
+* This function creates a new instance of GenericTypeLibOLE.
+* The storage object to which this typelib is saved can only be set via
+* GenericTypeLibOLE::SaveAllChanges.
+*
+* Inputs:
+* syskind - The target platform on which this typelib is expected
+* to be used.
+* szFile - The name of the file to which this typelib should be saved
+* when SaveAllChanges is called. This can be NULL if
+* SaveAllChanges will never be called.
+*
+* Outputs:
+* TIPERR_None is returned and *pptlib is set to the new typelib
+* if successful.
+*
+* Otherwise, *pptlib remains unchanged.
+*
+* Implementation:
+* This is implemented by simply creating a DOCFILE_BUNDLE and then
+* creating a new GenericTypeLibOLE with that bundle.
+* NOTE: since this can be the first call into typelib.dll
+* we must ensure that the APPDATA struct has been inited,
+* thus InitAppData().
+*
+*****************************************************************************/
+
+STDAPI
+CreateTypeLib(SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLibA **ppctlib)
+{
+ TIPERROR err;
+ HRESULT hresult = NOERROR;
+ GenericTypeLibOLE *pgtlibole = NULL;
+
+#if !OE_WIN32
+ BOOL wasNoAppData;
+
+ // since this can be the first call into typelib.dll
+ TlsCleanupDeadTasks();
+
+ wasNoAppData = (Pappdata() == NULL);
+#endif // !OE_WIN32
+
+ // Initialize the per-client-app data structures, if they haven't
+ // already been allocated.
+ IfErrGo(InitAppData());
+
+ IfErrGoTo(GenericTypeLibOLE::Create(NULL, &pgtlibole), Error2);
+ IfErrGoTo(pgtlibole->SetLibId((LPOLESTR)szFile), Error2);
+ pgtlibole->m_syskind = syskind;
+ // The project is definitely modified (i.e. it hasn't been saved
+ // yet, so there unsaved changes), so mark it as such.
+ pgtlibole->m_fDirModified = TRUE;
+ pgtlibole->m_isModified = TRUE;
+
+ *ppctlib = pgtlibole;
+ return NOERROR;
+
+Error2:
+ if(pgtlibole != NULL)
+ pgtlibole->Release();
+
+#if !OE_WIN32
+ if (wasNoAppData)
+ ReleaseAppData();
+#endif // !OE_WIN32
+
+Error:
+
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+/***
+* TIPERROR RegisterPathAndAlias - Registers a path (and alias on mac sys7).
+*
+* Purpose:
+* This is a helper routine used by RegisterTypeLib and
+* RegisterTypeLibFolder. It sets the value of hkeyPath to szPath
+* and, if we're on the mac system 7, creates a subkey called "Alias",
+* creates an alias record corresponding to the path, and sets the
+* value of the "Alias" subkey to the alias record.
+************************************************************************/
+#pragma code_seg(CS_INIT)
+static TIPERROR RegisterPathAndAlias(HKEY hkeyPath, LPOLESTR szPath)
+{
+ TIPERROR err = TIPERR_None;
+
+ if (oRegSetValue(hkeyPath, NULL, REG_SZ, szPath, ostrblen0(szPath)) != ERROR_SUCCESS)
+ return TIPERR_RegistryAccess;
+
+#if OE_MAC
+
+ {
+ // system7 always has an alias manager
+ AliasHandle halias;
+
+ // Convert the path to an alias record.
+ if(GetAliasFromPath(szPath, &halias) == TIPERR_None){
+
+ // Associate the alias record with the path key.
+ HLock((Handle)halias);
+ if (RegSetValueEx(hkeyPath, "Alias", 0L, REG_BINARY, (char *)*halias, (*halias)->aliasSize) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ }
+ HUnlock((Handle)halias);
+
+ // Release the alias record, now that it's in the registry.
+ DisposeHandle((Handle)halias);
+ }
+ }
+#endif // OE_MAC
+
+ return err;
+}
+
+#if OE_WIN
+/***
+*PUBLIC TIPERROR ErrOpenFile
+*Purpose:
+* Open the given file for reading. Returns a fully qualified filename
+* if successfully opened.
+*
+*Entry:
+* szFile = the file to open.
+*
+*Exit:
+* return value = TIPERROR
+*
+* *phfile = handle of the opened file
+* *plpstrPath = fully qualified path of the opened file
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR ErrOpenFile(LPOLESTR szFile, int *phfile, LPOLESTR *plpstrPath)
+{
+ int hfile;
+ OFSTRUCT of;
+ TIPERROR err;
+
+ if((hfile = oOpenFile(szFile, &of, OF_READ)) == HFILE_ERROR)
+ return TiperrOfOFErr(of.nErrCode);
+
+ if(plpstrPath != NULL)
+ {
+#if OE_WIN32
+ // On Win32, of.szPathName is an Ansi string (not Unicode or OEM code page)
+ int cchUnicode = MultiByteToWideChar(CP_ACP, 0, of.szPathName, -1, NULL, 0);
+
+ if (cchUnicode == 0)
+ IfErrGo(TIPERR_OutOfMemory);
+
+ if((*plpstrPath = (LPOLESTR)MemAlloc(cchUnicode*sizeof(OLECHAR))) == NULL){
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ MultiByteToWideChar(CP_ACP, 0, of.szPathName, -1, *plpstrPath, cchUnicode);
+#else
+ if((*plpstrPath = (LPSTR)MemAlloc(strlen(of.szPathName)+1)) == NULL){
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ // Convert fully qualified path back to Ansi char set (its OEM now)
+ OemToAnsi(of.szPathName, *plpstrPath);
+#endif
+ }
+
+ *phfile = hfile;
+ return TIPERR_None;
+
+Error:;
+ _lclose(hfile);
+ return err;
+}
+#endif // }
+
+
+/***
+*PRIVATE TIPERROR ErrOpen
+*Purpose:
+* Open the given file for reading. This is a helper for LoadTypeLib.
+*
+*Entry:
+* szFile = the file to open
+*
+*Exit:
+* return value = HRESULT
+*
+* *phfile = the handle of the newly opened file.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR ErrOpen(LPOLESTR szFileW, int *phfile)
+{
+ int hfile;
+
+#if OE_MAC
+ if((hfile = _sopen(szFileW,
+ (_O_BINARY|_O_RDONLY),
+ _SH_DENYNO,
+ (_S_IWRITE | _S_IREAD))) == -1)
+ {
+ // "too many files" on sopen sets errno, but not _macerrno
+ if (_macerrno == 0 && errno == EMFILE)
+ _macerrno = tmfoErr;
+ return TiperrOfOSErr((OSErr)_macerrno);
+ }
+#else // OE_MAC
+ OFSTRUCT of;
+#if OE_WIN32
+ LPSTR szFile;
+ TIPERROR err;
+
+ IfErrRet(TiperrOfHresult(ConvertStringToA(szFileW, &szFile)));
+#else //OE_WIN32
+ #define szFile szFileW
+#endif //OE_WIN32
+
+ if((hfile = _lopen(szFile, OF_READ)) == HFILE_ERROR){
+ // try again with OpenFile so we can get the extended-error info
+ if((hfile = OpenFile(szFile, &of, OF_READ)) == HFILE_ERROR) {
+#if OE_WIN32
+ ConvertStringFree(szFile);
+#endif //OE_WIN32
+ return TiperrOfOFErr(of.nErrCode);
+ }
+ }
+#if OE_WIN32
+ ConvertStringFree(szFile);
+#endif //OE_WIN32
+#endif // OE_MAC
+
+ *phfile = hfile;
+ return TIPERR_None;
+}
+
+// The following inline gives some bogus error on win16 (debug build),
+// so disable for now...
+//
+//inline
+HRESULT HrSeek(int hfile, long lOffset, int nOrigin)
+{
+ return _llseek(hfile, lOffset, nOrigin) == -1
+ ? HresultOfScode(TYPE_E_IOERROR) : NOERROR;
+}
+
+//inline
+HRESULT HrRead(int hfile, void HUGEP* pv, UINT cb)
+{
+ return _lread(hfile, pv, cb) == HFILE_ERROR
+ ? HresultOfScode(TYPE_E_IOERROR) : NOERROR;
+}
+
+//inline
+HRESULT HrCurPos(int hfile, ULONG *poCur)
+{
+ return (*poCur = _llseek(hfile, 0, SEEK_CUR)) == -1
+ ? HresultOfScode(TYPE_E_IOERROR) : NOERROR;
+}
+
+#if OE_WIN16
+// simple implementations of Unicode string routines
+UINT wcslen(USHORT FAR* lpwstr)
+{
+ UINT i;
+ for (i = 0; *lpwstr++; i++)
+ ;
+ return i;
+}
+
+// lame implementation of Unicode wcsicmp -- only checks for equality.
+// DO NOT use this for greater than/less than checks.
+UINT wcsicmp(USHORT FAR* lpwstr1, USHORT FAR* lpwstr2)
+{
+ USHORT ch1, ch2;
+
+ while (1) {
+ ch1 = *lpwstr1++;
+ ch2 = *lpwstr2++;
+ if (ch1 == 0 || ch2 == 0)
+ break;
+ if (tolower(LOBYTE(ch1)) != tolower(LOBYTE(ch2)))
+ return -1; // not equal
+ }
+ return ch1 || ch2;
+}
+#endif //OE_WIN16
+
+#if OE_WIN
+//
+// Find the directory entry in the given resource directory with
+// either the given name, or (if the name is NULL) the given ID.
+//
+#pragma code_seg(CS_INIT)
+HRESULT GetRsrcDirEntry(int hfile,
+ DWORD oRsrcDir,
+ WCHAR *pwchName,
+ DWORD dwId,
+ _IMAGE_RESOURCE_DIRECTORY_ENTRY *prsrcdirentry)
+{
+ UINT i;
+ HRESULT hresult, hresult2;
+ ULONG oCur, oString, oSave;
+ WORD wEntryNameLen, wNameLen;
+ _IMAGE_RESOURCE_DIRECTORY rsrcdir;
+
+ // Note: I dont support resource names >128 characters..
+ // if you really need this, then you'll need to modify this routine
+ WCHAR rgwchEntryName[128];
+ rgwchEntryName[0] = 0;
+
+ // save the current file offset
+ IfFailRet(HrCurPos(hfile, &oSave));
+
+ IfFailGo(HrSeek(hfile, oRsrcDir, SEEK_SET));
+ IfFailGo(HrRead(hfile, &rsrcdir, sizeof(rsrcdir)));
+
+ // If the given name is a wildcard, then just grab the first entry.
+ //
+ if(pwchName != NULL){
+ // Note: lstrlenW is not available on chicago, so use the C runtime
+ // routine, which is good enough for our purposes
+ wNameLen = wcslen(pwchName);
+ if(wNameLen == 1 && *pwchName == L'*'){
+ // make sure there is at least one entry
+ if(rsrcdir.NumberOfNamedEntries > 0 || rsrcdir.NumberOfIdEntries > 0){
+ IfFailGo(HrRead(hfile, prsrcdirentry, sizeof(*prsrcdirentry)));
+ goto Done;
+ }
+ }
+ }
+
+ if(pwchName == NULL){
+
+ //
+ // lookup the entry by ID
+ //
+
+ // skip the named entries
+ IfFailGo(HrSeek(hfile, rsrcdir.NumberOfNamedEntries * sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY), SEEK_CUR));
+
+ for(i=0;; ++i){
+ if(i == rsrcdir.NumberOfIdEntries){
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error; // didnt find it
+ }
+ IfFailGo(HrRead(hfile, prsrcdirentry, sizeof(*prsrcdirentry)));
+ if(prsrcdirentry->Name & IMAGE_RESOURCE_NAME_IS_STRING){
+ // Were supposed to be in the ID section of the directory,
+ // if this bit is set, then the image is toast...
+ DebAssert(0, "");
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error;
+ }
+ if(prsrcdirentry->Name == dwId){
+ break; // Got It!
+ }
+ }
+ }else{
+
+ //
+ // lookup the entry by Name
+ //
+
+ if(wNameLen >= DIM(rgwchEntryName)){
+ // see note above wrt limitation on length of name
+ hresult = HresultOfScode(E_INVALIDARG);
+ goto Error;
+ }
+
+ for(i = 0;; ++i){
+ if(i == rsrcdir.NumberOfNamedEntries){
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error;
+ }
+ IfFailGo(HrRead(hfile, prsrcdirentry, sizeof(*prsrcdirentry)));
+ if((prsrcdirentry->Name & IMAGE_RESOURCE_NAME_IS_STRING) == 0){
+ // We are searching the named portion of the table,
+ // If this bit isn't set, then the image must be toast...
+ DebAssert(0/*UNREACHED*/, "");
+ // but we may have a bogus image, so bag out..
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error;
+ }
+ IfFailGo(HrCurPos(hfile, &oCur)); // save the current position
+ oString = (prsrcdirentry->Name & ~IMAGE_RESOURCE_NAME_IS_STRING) + oRsrcDir;
+ IfFailGo(HrSeek(hfile, oString, SEEK_SET));
+ IfFailGo(HrRead(hfile, &wEntryNameLen, sizeof(wEntryNameLen)));
+ if(wEntryNameLen == wNameLen){
+ IfFailGo(HrRead(hfile, rgwchEntryName, wEntryNameLen * sizeof(WCHAR)));
+ rgwchEntryName[wEntryNameLen] = L'\0';
+ }
+ IfFailGo(HrSeek(hfile, oCur, SEEK_SET)); // back to where we were
+ // Note: lstrcmpiW is not available on chicago, so use the C runtime
+ // routine, which is good enough for our purposes
+ if(wcsicmp(rgwchEntryName, pwchName) == 0) {
+ break; // Found the type entry!
+ }
+ }
+ }
+
+Done:;
+
+ hresult = NOERROR;
+
+Error:;
+ hresult2 = HrSeek(hfile, oSave, SEEK_SET);
+ return hresult == NOERROR ? hresult2 : hresult;
+}
+
+
+/***
+*HRESULT GetOffsetOfResource
+*Purpose:
+* Locate the typelib resource withing the given executable,
+* and return its offset.
+*
+*Entry:
+* hfile = the file handle of the executable.
+* pexehdr = ptr to the exe file header.
+*
+*Exit:
+* return value = HRESULT
+*
+* *poResource = typelib resource offset
+*
+*Note:
+* This is a helper for LoadTypeLib
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+HRESULT GetOffsetOfResource(int hfile,
+ CHAR *pchName,
+ int resID,
+ _IMAGE_DOS_HEADER *pexehdr,
+ long *poResource,
+ long *pcbResource)
+{
+#define CCH_MAX 128 // maximum resource name size.
+ HRESULT hresult;
+ DWORD dwSignature;
+
+ DebAssert(strlen(pchName) < CCH_MAX, "Name too long.");
+
+ // Seek to the beginning of the PE header
+ IfFailGo(HrSeek(hfile, pexehdr->e_lfanew, SEEK_SET));
+
+ // read and verify the NT PE signature
+ // for win16 exe's, this is the combination of ne_magic, ne_ver, & ne_rev.
+ IfFailGo(HrRead(hfile, &dwSignature, sizeof(dwSignature)));
+
+ if (dwSignature == IMAGE_NT_SIGNATURE) {
+//
+// For a description of the Win32 PE File format, including a description
+// of the format of the .rsrc (resource) section, take a look at:
+//
+// MSDN#7 - "The Portable Executable File Format From Top To Bottom"
+//
+
+ int i;
+ WORD w;
+ BOOL fIsDir;
+ ULONG oRsrc;
+ ULONG oRsrcDir;
+ WCHAR rs_string[CCH_MAX + 1];
+
+ _IMAGE_FILE_HEADER pehdr;
+ _IMAGE_SECTION_HEADER secthdr;
+ _IMAGE_RESOURCE_DATA_ENTRY rsrcdataentry;
+ _IMAGE_RESOURCE_DIRECTORY_ENTRY rsrcdirentry;
+
+// the following describes the resource directory path we're trying to find
+static struct rsrcpath {
+ WCHAR *pwchName;
+ DWORD dwId;
+} rgrsrcpath[] = {
+ { NULL, 0 } // type
+ , { NULL, 1 } // name
+ , { L"*", 0 } // language (we currently ignore this)
+};
+
+ // Convert the inputted ANSI string to a wide-character string.
+#if OE_WIN16
+ mbstowcs(rs_string, pchName, 128);
+#else // !OE_WIN16
+ MultiByteToWideChar(CP_ACP, 0, pchName,
+ xstrclen(pchName)+1, rs_string, 128);
+#endif // !OE_WIN16
+
+ // REVIEW: hack-o-rama
+ rgrsrcpath[0].pwchName = rs_string;
+ rgrsrcpath[1].dwId = resID;
+
+ // Read the PE header
+ IfFailGo(HrRead(hfile, &pehdr, sizeof(pehdr)));
+
+ // Skip over the "optional" header.
+ IfFailGo(HrSeek(hfile, pehdr.SizeOfOptionalHeader, SEEK_CUR));
+
+ // Search the section headers for .rsrc...
+ for(w = 0;; ++w){
+ if(w == pehdr.NumberOfSections){
+ // didnt find the .rsrc section
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error;
+ }
+ IfFailGo(HrRead(hfile, &secthdr, sizeof(secthdr)));
+#if OE_WIN16
+ #define lstrcmpiA lstrcmpi
+#endif //OE_WIN16
+ if(lstrcmpiA((const char*)&secthdr.Name, ".rsrc") == 0)
+ break;
+ }
+
+ // start at the root of the resource section
+ oRsrcDir = oRsrc = secthdr.PointerToRawData;
+
+ // the following code expects the resource path to be non-empty
+ DebAssert(DIM(rgrsrcpath) > 0, "");
+
+ for(i = 0;; ++i){
+
+ IfFailGo(GetRsrcDirEntry(hfile,
+ oRsrcDir,
+ rgrsrcpath[i].pwchName,
+ rgrsrcpath[i].dwId,
+ &rsrcdirentry));
+
+ fIsDir = (rsrcdirentry.OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY) != 0;
+ // compute the file offset of the location pointed at by this entry
+ oRsrcDir = oRsrc + (rsrcdirentry.OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY);
+
+ if(i == DIM(rgrsrcpath)-1){
+ // were at the end of the path - so we expect a leaf
+ if(fIsDir){
+ // image must be toast...
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error;
+ }
+
+ // We have found the location of the data node.. seek to it,
+ // extract the virtual address of the resource, and convert
+ // this into an absolute file offset.
+ //
+ // Note: all the offsets in the resource directory tree are
+ // relative to the beginning of .rsrc, *except* for the final
+ // offset to the resource, which is virtual.
+ //
+ IfFailGo(HrSeek(hfile, oRsrcDir, SEEK_SET));
+ IfFailGo(HrRead(hfile, &rsrcdataentry, sizeof(rsrcdataentry)));
+ *poResource = (rsrcdataentry.OffsetToData - secthdr.VirtualAddress) + oRsrc;
+ *pcbResource = rsrcdataentry.Size;
+ break;
+ }
+
+ // were not at the end of the path, so this should be a subdir
+ if(!fIsDir){
+ // image must be toast...
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error;
+ }
+ }
+
+ // successfully handled WIN32 EXE
+ return NOERROR;
+
+ // now check for win16 EXE format.
+ // LOWORD(dwSignature) is the ne_magic field of the WIN16 header if this
+ // is really a win16 EXE..
+ } else if(LOWORD(dwSignature) == IMAGE_OS2_SIGNATURE) {
+
+ WORD i;
+ char rs_len, cbName = xstrblen(pchName);
+ char rs_string[CCH_MAX+1];
+ USHORT usRsrcAlign;
+ IMAGE_OS2_HEADER newexe;
+ struct rsrc_nameinfo nameinfo;
+ struct rsrc_typeinfo typeinfo;
+ ULONG oCur, oString, oRsrcTable;
+
+ //
+ // Read and verify the remainder of the new-exe header.
+ //
+ IfFailGo(HrRead(hfile, (char far *)&newexe+sizeof(dwSignature), sizeof(newexe) - sizeof(dwSignature)));
+
+ //
+ // Compute the absolute offset in the file of the resource table.
+ //
+ // exe_ndr.e_lfanew = offset of new exehdr
+ // new_exe.ne_rsrctab = offset of resource table, relative to the
+ // beginning of the new-exe hdr.
+ // new_exe.cres = number of resource segments
+
+ if (newexe.ne_rsrctab != newexe.ne_restab) {
+ // if there are any resources in this EXE/DLL
+ // (yes, this check assumes that all linkers put the resident names table
+ // immediately after the resource table, but Windows' loader makes this
+ // assumption, too.
+
+ oRsrcTable = pexehdr->e_lfanew + newexe.ne_rsrctab;
+ IfFailGo(HrSeek(hfile, oRsrcTable, SEEK_SET));
+ IfFailGo(HrRead(hfile, &usRsrcAlign, sizeof(usRsrcAlign)));
+
+ //
+ // Search the resource table entries for the resource
+ // of type "typelib", with an ID of 1.
+ //
+
+ while(1){
+
+ // read the resource type-id
+ IfFailGo(HrRead(hfile, &typeinfo.rt_id, sizeof(typeinfo.rt_id)));
+
+ if(typeinfo.rt_id == 0) // end of table marker.. nothing else to look at
+ break;
+
+ // read the count of resources of this type
+ IfFailGo(HrRead(hfile, &typeinfo.rt_nres, sizeof(typeinfo.rt_nres)));
+ // some other thing that isnt used (but read to keep us in sync)
+ IfFailGo(HrRead(hfile, &typeinfo.rt_proc, sizeof(typeinfo.rt_proc)));
+
+ // If the entry is for resources of type "typelib", then scan
+ // the actual resources for one with an ID of 1.
+ //
+ if((typeinfo.rt_id & RSORDID) == 0){
+
+ // save the current position...
+ IfFailGo(HrCurPos(hfile, &oCur));
+
+ // Seek to the string table, and grab the type name.
+ oString = oRsrcTable + typeinfo.rt_id;
+ IfFailGo(HrSeek(hfile, oString, SEEK_SET));
+ IfFailGo(HrRead(hfile, &rs_len, sizeof(rs_len)));
+ // If the string length looks right, then go ahead and grab the string
+ if(rs_len == cbName){
+ IfFailGo(HrRead(hfile, &rs_string, cbName));
+ rs_string[cbName] = '\0';
+ }
+ // seek back to current position
+ IfFailGo(HrSeek(hfile, oCur, SEEK_SET));
+
+ if(rs_len == cbName && lstrcmpi(rs_string, pchName)==0){
+
+ // we have found the set of resources of type "typelib",
+ // The guy we are looking for is either here, or nowhere
+
+ for(i = 0; i < typeinfo.rt_nres; ++i){
+ IfFailGo(HrRead(hfile, &nameinfo, sizeof(nameinfo)));
+ if(nameinfo.rn_id == (RSORDID | resID)){
+ // Found it!
+ // Compute and return the offset of the actual resource.
+ *poResource = ((ULONG)nameinfo.rn_offset) << usRsrcAlign;
+ *pcbResource = ((ULONG)nameinfo.rn_length) << usRsrcAlign;
+ return NOERROR;
+ }
+ }
+ // If its not in the "typelib" directory, then its not in the exe
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error;
+ }
+ }
+ // This is not the resource type we are looking for, so skip
+ // over the nameinfo records for all resources of this type
+ IfFailGo(HrSeek(hfile, typeinfo.rt_nres * sizeof(nameinfo), SEEK_CUR));
+ }
+ }
+
+ } // not WIN32 PE header not WIN16 EXE header, or some error
+
+ // no typelibs in the .EXE
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+
+Error:;
+ return hresult;
+}
+
+/***
+*HRESULT GetOffsetOfTypeLibResource
+*Purpose:
+* Locate the typelib resource withing the given executable,
+* and return its offset.
+*
+*Entry:
+* hfile = the file handle of the executable.
+* pexehdr = ptr to the exe file header.
+*
+*Exit:
+* return value = HRESULT
+*
+* *poResource = typelib resource offset
+*
+*Note:
+* This is a helper for LoadTypeLib
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+HRESULT GetOffsetOfTypeLibResource(int hfile,
+ int resID,
+ _IMAGE_DOS_HEADER *pexehdr,
+ long *poResource,
+ long *pcbResource)
+{
+ return GetOffsetOfResource(hfile,
+ "typelib",
+ resID,
+ pexehdr,
+ poResource,
+ pcbResource);
+}
+#endif //OE_WIN
+
+
+struct LoadInfo
+{
+ LPOLESTR lpstrPath;// fully qualified path
+ int hfile;
+ BOOL fRegister; // does the typelib need to be registered?
+ BOOL fIsTypeLib;
+#if OE_WIN
+ BOOL fIsExe; // does the path name an exe or dll?
+ int resID; // the typelib resource ID to use
+ SYSKIND syskind; // the syskind of the exe/dll
+ _IMAGE_DOS_HEADER exehdr;
+#endif
+};
+
+#pragma code_seg(CS_INIT)
+void InitLoadInfo(LoadInfo *ploadinfo)
+{
+ ploadinfo->lpstrPath = NULL;
+ ploadinfo->hfile = -1;
+ ploadinfo->fRegister = FALSE;
+ ploadinfo->fIsTypeLib = FALSE;
+#if OE_WIN
+ ploadinfo->fIsExe = FALSE;
+ ploadinfo->resID = -1;
+ ploadinfo->syskind = SYSKIND_CURRENT;
+#endif //OE_WIN
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+void UninitLoadInfo(LoadInfo *ploadinfo)
+{
+#if OE_WIN
+ MemFree(ploadinfo->lpstrPath);
+#else
+ FreeBstr(ploadinfo->lpstrPath);
+#endif
+ ploadinfo->lpstrPath = NULL;
+ if(ploadinfo->hfile != -1)
+ _lclose(ploadinfo->hfile);
+ ploadinfo->hfile = -1;
+}
+#pragma code_seg()
+
+#if OE_WIN
+/***
+*TIPERROR NEARCODE VerifyIsExeOrTlb
+*Purpose:
+* Determine if the loadinfo is a .exe file or a standalone typelib.
+*
+*Entry:
+* ploadinfo = loadinfo with a valid hfile
+*
+*Exit:
+* TIPERR_FileNotFound - file is neither .exe nor .tlb
+* TIPERR_None - ploadinfo->fIsExe, ploadinfo->fIsTypeLib, ploadinfo->exehdr
+* updated
+*
+* File pointer is unchanged after the call
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR NEARCODE VerifyIsExeOrTlb(LoadInfo *ploadinfo)
+{
+ LONG oCur;
+ TIPERROR err = TIPERR_FileNotFound; // asume the worst
+
+ // save the current offset
+ if((oCur = _llseek(ploadinfo->hfile, 0, SEEK_CUR)) != -1){
+
+ // rewind the file if necessarry
+ if(oCur == 0 || _llseek(ploadinfo->hfile, 0, SEEK_SET) != -1){
+
+ if(_lread(ploadinfo->hfile, &ploadinfo->exehdr, sizeof(ploadinfo->exehdr)) != HFILE_ERROR){
+
+ if (ploadinfo->exehdr.e_magic == IMAGE_DOS_SIGNATURE) {
+
+ // the file is a .exe
+ if(ploadinfo->resID == -1)
+ ploadinfo->resID = 1; // default to resource ID 1, if non specified
+ ploadinfo->fIsExe = TRUE;
+ err = TIPERR_None; // indicate success
+
+ } else if ( ((GTLibStgHdr*)&(ploadinfo->exehdr))->ulSignature == GTLIBSTORAGE_SIGNATURE ) {
+
+ // the file is a typelib
+
+ // Make sure the caller didn't specify a resource ID. We
+ // definately don't know how to deal with this.
+ if(ploadinfo->resID == -1) {
+ ploadinfo->fIsTypeLib = TRUE;
+ err = TIPERR_None; // indicate success
+ }
+
+ } // else fall out with TIPERR_FileNotFound
+
+ }
+ // restore to original offset
+ _llseek(ploadinfo->hfile, oCur, SEEK_SET);
+
+ }
+
+ }
+ return err;
+}
+#pragma code_seg()
+#endif //OE_WIN
+
+// Attempt to split a resource id off the end of the given string
+//WARNING: If SplitResID returns TIPERR_None, the '\' between
+//WARNING: the file name and the resource ID has been replaced by
+//WARNING: a '\0' character. IN OTHER WORDS, szFile HAS BEEN
+//WARNING: MODIFIED! *(*pszResID+1)='\\' will repair szFile.
+#pragma code_seg(CS_INIT)
+TIPERROR SplitResID(LPOLESTR szFile, LPOLESTR *pszResID)
+{
+ int len;
+ LPOLESTR pch;
+ LPOLESTR pchEnd;
+
+ len = ostrlen(szFile);
+ DebAssert(len > 0, "");
+
+ pchEnd = &szFile[len-1];
+ for(pch = pchEnd; *pch >= '0' && *pch <= '9'; --pch)
+ {
+ if(pch == szFile)
+ return TIPERR_ElementNotFound; // didn't find it
+ }
+
+ if(pch == pchEnd || *pch != '\\')
+ return TIPERR_ElementNotFound;
+
+ // Split the resource ID off by replacing the preceeding '\' by a '\0'
+ *pch = '\0';
+ *pszResID = pch+1;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+/***
+*PRIVATE TIPERROR FindTypeLibUnqual
+*Purpose:
+* Locate and classify the typelib based on the given unqualified
+* fielname.
+*
+*Entry:
+* szFile = the file to open
+*
+*Exit:
+* return value = TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR FindTypeLibUnqual(LPOLESTR szFile, LoadInfo *ploadinfo)
+{
+ int hfile;
+ TIPERROR err;
+
+ hfile = -1;
+
+#if OE_MAC
+
+ BSTRA lpstrPath = NULL;
+
+ // On the Mac, check for the file in the registered Typelib Folder
+ // if a typelib folder is registered.
+ IfErrGo(MacFileSearch(szFile, &lpstrPath));
+ IfErrGo(ErrOpen(lpstrPath, &hfile));
+
+#else // OE_MAC
+
+ UINT cbPath;
+ UINT cbResID;
+ LPOLESTR lpstrPath=NULL;
+ LPOLESTR lpstrTemp;
+ LPOLESTR pchResID;
+
+ err = ErrOpenFile(szFile, &hfile, &lpstrPath);
+
+ switch((ULONG)err){
+ case (ULONG)TIPERR_None:
+ break;
+ case (ULONG)TIPERR_FileNotFound:
+ case (ULONG)TIPERR_PathNotFound:
+ // Try to split a resource ID off the end of the name, and
+ // then open...
+ if(SplitResID(szFile, &pchResID) == TIPERR_None){
+ if(ErrOpenFile(szFile, &hfile, &lpstrPath) == TIPERR_None){
+ // Glue the fully qualified filename, and the resource ID
+ // back together into a fully qualified specifier
+ cbPath = ostrlen(lpstrPath);
+ cbResID = ostrlen(pchResID);
+ if((lpstrTemp = (LPOLESTR)MemAlloc((cbPath+1+cbResID+1)*sizeof(OLECHAR))) == NULL){
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ memcpy(lpstrTemp, lpstrPath, cbPath*sizeof(OLECHAR));
+ lpstrTemp[cbPath] = '\\';
+ memcpy(&lpstrTemp[1+cbPath], pchResID, cbResID*sizeof(OLECHAR));
+ lpstrTemp[1+cbPath+cbResID] = (OLECHAR)0; // Null terminate
+ ploadinfo->resID = oatoi(pchResID);
+ MemFree(lpstrPath);
+ lpstrPath = lpstrTemp;
+ err = TIPERR_None;
+ }
+ // replace the '\' in szFile (hammered by SplitResID)
+ *(pchResID-1)='\\';
+ }
+ IfErrGo(err);
+ break;
+ default:
+ goto Error;
+ }
+#endif
+
+ DebAssert(hfile != -1, "");
+ ploadinfo->hfile = hfile;
+ hfile = -1;
+ ploadinfo->lpstrPath = lpstrPath;
+ err = TIPERR_None;
+
+Error:;
+#if OE_MAC
+ FreeBstr(lpstrPath);
+#endif
+ if(hfile != -1)
+ _lclose(hfile);
+ return err;
+}
+#pragma code_seg()
+
+/***
+*PRIVATE TIPERROR FindTypeLib
+*Purpose:
+* Locate and classify the typelib indicated by the given name.
+*
+*Entry:
+* szFile = the file to localte
+*
+*Exit:
+* return value = TIPERROR.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR FindTypeLib(LPOLESTR szFile, LoadInfo *ploadinfo)
+{
+ TIPERROR err;
+
+ DebAssert(szFile != NULL && szFile[0] != WIDE('\0'), "");
+
+ if(FFullyQualified(szFile))
+ {
+ err = ErrOpen(szFile, &ploadinfo->hfile);
+#if OE_WIN
+ if(err == TIPERR_FileNotFound
+ || err == TIPERR_PathNotFound){
+ LPOLESTR pchResID;
+ // Try to strip off a resource ID, and then open
+ if(SplitResID(szFile, &pchResID) == TIPERR_None) {
+ if((err = ErrOpen(szFile, &ploadinfo->hfile)) == TIPERR_None)
+ ploadinfo->resID = oatoi(pchResID);
+ // replace the '\' char in szFile (hammered by SplitResID)
+ *(pchResID-1)='\\';
+ }
+ }
+#endif //OE_WIN
+ IfErrGo(err);
+ if((ploadinfo->lpstrPath = (LPOLESTR)MemAlloc(ostrblen0(szFile)*sizeof(OLECHAR))) == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ ostrcpy(ploadinfo->lpstrPath, szFile);
+ }
+ else
+ {
+ ploadinfo->fRegister = TRUE;
+ IfErrGo(FindTypeLibUnqual(szFile, ploadinfo));
+ }
+
+ // If we get here, then we must have opened something...
+ DebAssert(ploadinfo->hfile != -1, "");
+
+#if OE_WIN
+ IfErrGo(VerifyIsExeOrTlb(ploadinfo));
+#else //OE_MAC
+ ploadinfo->fIsTypeLib = TRUE;
+#endif //OE_WIN
+
+ return TIPERR_None;
+
+Error:;
+ UninitLoadInfo(ploadinfo);
+ return err;
+}
+#pragma code_seg()
+
+/***
+* STDAPI LoadTypeLib() - Loads an existing typelib
+*
+* Purpose:
+* This function creates a new instance of GenericTypeLibOLE.
+* The storage object to which this typelib is saved can only be set via
+* GenericTypeLibOLE::SaveAllChanges.
+*
+* Inputs:
+* szFile - The file containing the stand-alone GenericTypeLibOLE.
+*
+* Outputs:
+* TIPERR_None is returned and *pptlib is set to the new typelib
+* if successful.
+*
+* Otherwise, *pptlib remains unchanged.
+*
+* Implementation:
+* This is implemented by simply opening a docfile and then
+* loading a new GenericTypeLibOLE from that docfile.
+* NOTE: since this can be the first call into typelib.dll
+* we must ensure that the APPDATA struct has been inited,
+* thus InitAppData().
+*
+*****************************************************************************/
+
+#pragma code_seg(CS_INIT)
+STDAPI LoadTypeLib(LPCOLESTR szFile, ITypeLibA **pptlib)
+{
+ LONG offset;
+ TIPERROR err;
+ HRESULT hresult;
+ LoadInfo loadinfo;
+ ITypeLibA *ptlib;
+ IStorageA *pstg;
+ ILockBytesA *plockbytes;
+ GenericTypeLibOLE *pgtlibole;
+ LONG cbResource;
+
+#if !OE_WIN32
+ BOOL fWasNoAppData;
+
+ // since this can be the first call into typelib.dll
+ TlsCleanupDeadTasks();
+#endif //!OE_WIN32
+
+ if (szFile == NULL || pptlib == NULL)
+ return HresultOfScode(E_INVALIDARG);
+
+ pstg = NULL;
+ pgtlibole = NULL;
+ plockbytes = NULL;
+ InitLoadInfo(&loadinfo);
+
+#if !OE_WIN32
+ fWasNoAppData = (Pappdata() == NULL);
+#endif // !OE_WIN32
+
+ // Initialize the per-client-app data structures, if they haven't
+ // already been allocated.
+ IfErrGo(InitAppData());
+
+ // code can't deal well with an empty string, so check for it here.
+ if (*szFile == OLESTR('\0'))
+ IfErrGoTo(TIPERR_FileNotFound, TipError);
+
+ // if the pathname is fully-qualified and it is already cached, AddRef
+ // and return it without checking whether the image exists on disk or not.
+ // This saves time in the case that stdole.tlb is referenced using a
+ // fully-qualified path.
+ if(FFullyQualified(szFile) &&
+ (ptlib = Poletmgr()->LookupTypeLib((LPOLESTR)szFile)) != NULL) {
+ goto DoAddRefAndReturn;
+ }
+
+ if(FindTypeLib((LPOLESTR)szFile, &loadinfo) == TIPERR_None)
+ {
+ // If the specified typelib was already loaded, just AddRef and
+ // return it.
+ if((ptlib = Poletmgr()->LookupTypeLib(loadinfo.lpstrPath)) != NULL){
+ UninitLoadInfo(&loadinfo);
+DoAddRefAndReturn:
+ ptlib->AddRef();
+ *pptlib = ptlib;
+ return NOERROR;
+ }
+
+ offset = 0;
+ cbResource = 0;
+#if OE_WIN
+ if(loadinfo.fIsExe){
+ IfFailGo(GetOffsetOfTypeLibResource(loadinfo.hfile,
+ loadinfo.resID,
+ &loadinfo.exehdr,
+ &offset,
+ &cbResource));
+ }
+#endif //OE_WIN
+
+ // Create an IStorage for type typelib
+ IfFailGo(CreateFileLockBytesOnHFILE(loadinfo.hfile, FALSE, offset, cbResource, &plockbytes));
+ loadinfo.hfile = -1; // file is now owned by the lockbytes
+ IfFailGo(GTLibStorage::OpenForReadOnly(plockbytes, &pstg));
+ RELEASE(plockbytes); // lockbytes will be released when storage is
+
+ // Create the TypeLib
+ IfErrGoTo(GenericTypeLibOLE::Create(pstg, &pgtlibole), TipError);
+ RELEASE(pstg);
+ IfErrGoTo(pgtlibole->SetLibId(loadinfo.lpstrPath), TipError);
+ IfErrGoTo(pgtlibole->SetDirectory(loadinfo.lpstrPath), TipError);
+
+ // Load type TypeLib
+ IfErrGoTo(pgtlibole->Read(), TipError);
+
+ // Tell the type manager about the newly loaded typelib.
+ IfErrGo(Poletmgr()->TypeLibLoaded(loadinfo.lpstrPath, pgtlibole));
+
+ // But don't change the help file if it hasn't already been changed.
+ // Ignore any failure from RegisterTypeLib at this point.
+ if(loadinfo.fRegister)
+ hresult = RegisterTypeLib(pgtlibole, loadinfo.lpstrPath, NULL);
+ }
+ else
+ {
+ // Attempt to parse the given name into a moniker, and bind to it.
+ // This enables binding to non OLE typelib implementations, including
+ // implementations that have no corresponding persistent representation.
+
+ IBindCtx *pbc;
+ IMoniker *pmk;
+ ULONG chEaten;
+
+ hresult = CreateBindCtx(0, &pbc);
+ if(hresult == NOERROR){
+ BSTR bstr;
+ bstr = SysAllocString(szFile);
+ if (bstr == NULL)
+ hresult = HresultOfScode(E_OUTOFMEMORY);
+ else {
+ hresult = MkParseDisplayName(pbc, bstr, &chEaten, &pmk);
+ SysFreeString(bstr);
+ if(hresult == NOERROR){
+ hresult = pmk->BindToObject(pbc,
+ NULL,
+ IID_ITypeLib,
+ (void**)&pgtlibole);
+ pmk->Release();
+ }
+ }
+ pbc->Release();
+ }
+
+ // translate to a reasonable typelib error, if necessarry
+ if(hresult != NOERROR){
+ hresult = HresultOfScode(TYPE_E_CANTLOADLIBRARY);
+ goto Error;
+ }
+ }
+
+ UninitLoadInfo(&loadinfo);
+ *pptlib = pgtlibole;
+ return NOERROR;
+
+TipError:;
+ hresult = HresultOfTiperr(err);
+
+Error:
+ if(pgtlibole != NULL)
+ pgtlibole->Release();
+ if(pstg != NULL)
+ pstg->Release();
+ if(plockbytes != NULL)
+ plockbytes->Release();
+ UninitLoadInfo(&loadinfo);
+
+#if !OE_WIN32
+ if(fWasNoAppData && Pappdata() != NULL)
+ ReleaseAppData();
+#endif // !OE_WIN32
+
+ return hresult;
+}
+#pragma code_seg()
+
+/***
+* STDAPI RegisterTypeLib() - Registers a typelib with the registry
+*
+* Purpose:
+* RegisterTypeLib adds information to the registry for the
+* specified TypeLib. After the TypeLib is
+* registered then LoadRegTypeLib can be used to load the type library.
+*
+* Inputs:
+* ptlib - the typelib to register (IN)
+* szFullPath - Its complete path. (IN)
+* szHelpDir - Where to find help directory. (IN)
+* If this is NULL and there is already a HELPDIR, don't
+* change the HELPDIR string. If this is NULL and there
+* isn't a HELPDIR, then take the helpdir from szFullPath.
+*
+* Outputs:
+*
+* Implementation:
+* We register the following bits of info:
+* Guid
+* Docstring
+* Major.Minor version numbers
+* Lcid
+* Help directory
+* Platform
+*
+* The typelib subkey hierarchy looks like this:
+* \ [root]
+* TypeLib
+* {GUID}
+* Version [major.minor] = <docstring>
+* HELPDIR = <some-dir>
+* FLAGS = <typelib flags>
+* <LCID>
+* <PLATFORM> = <fullpath of typelib>
+*
+* The interface subkey hierarchy looks like this:
+* \ [root]
+* Interface
+* {<iid of interface>} = <typeinfo name>
+* ProxyStubClsid = {GUID of ProxyStubClsid}
+* NumMethods = 7
+* BaseInterface = { GUID of IDispatch }
+*
+* NOTE: since this can be the first call into typelib.dll
+* we must ensure that the APPDATA struct has been inited,
+* thus InitAppData().
+*
+******************************************************************************/
+
+/***
+*PRIVATE
+*Purpose:
+* Helper for RegisterTypeLib. Creates a subkey under the given
+* key, with the given name, and the given value.
+*
+*Entry:
+* hkey = the registry key under which to create the subkey.
+* szSubKey = the name of the subkey.
+* szValue = the value to assign to the sub key.
+* cbValue = the length of the value string
+*
+*Exit:
+* return value = TIPERROR.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR
+RegCreateSubKey(HKEY hkey, LPOLESTR szSubKey, LPOLESTR szValue, int cbValue)
+{
+ HKEY hkeySub;
+ TIPERROR err;
+
+ err = TIPERR_RegistryAccess; // pessimism...
+ if(oRegCreateKey(hkey, szSubKey, &hkeySub) == ERROR_SUCCESS){
+ if(oRegSetValue(hkeySub, NULL, REG_SZ, szValue, cbValue) == ERROR_SUCCESS){
+ err = TIPERR_None;
+ }
+ RegCloseKey(hkeySub);
+ }
+ return err;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+STDAPI RegisterTypeLib(ITypeLibA *ptlib, LPOLESTR szFullPath, LPOLESTR szHelpDir)
+{
+ TIPERROR err = TIPERR_None;
+ TLIBATTR *ptlibattr;
+ LPOLESTR szSys;
+ HKEY hkeyTypelib, hkeyGuid, hkeyVersion, hkeyLcid, hkeyPlatform, hkeyHelpdir, hkeyFlags;
+ OLECHAR rgchVer[4+1+4+1]; // maj.min\0
+ OLECHAR rgchVerMinor[4+1]; // XXXX\0
+ OLECHAR rgchLcid[4+1]; // XXXX\0
+ OLECHAR rgchFlags[4+1]; // XXXX\0
+// OLECHAR rgchNumMethods[5+1]; // XXXXX\0
+ LPOLESTR pchEnd;
+ OLECHAR chSave;
+ BSTR bstrDocString;
+ OLECHAR szGuidTypeLib[CCH_SZGUID0];
+ OLECHAR szGuidTypeInfo[CCH_SZGUID0];
+// LPOLESTR szGuidBaseInterface;
+ LPOLESTR szGuidPS;
+ BSTR bstrName;
+ HKEY hkeyInterface;
+ HKEY hkeyGuidTypeinfo;
+ TYPEATTR *ptypeattr;
+ USHORT ustiCount;
+ ITypeInfoA *pitinfo;
+ TYPEKIND typekind;
+ UINT i;
+static OLECHAR szGuidIDispatch[] = WIDE("{00020400-0000-0000-C000-000000000046}");
+static OLECHAR szGuidPSDispatch[] = WIDE("{00020420-0000-0000-C000-000000000046}");
+static OLECHAR szGuidPSAutomation[] = WIDE("{00020424-0000-0000-C000-000000000046}");
+
+
+ if (ptlib == NULL || szFullPath == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+#if !OE_MAC
+ LPOLESTR lpstrUNC=NULL;
+ IfErrGo(ConvertPathToUNC(szFullPath, &lpstrUNC));
+
+ // If the file is on the net, then use the UNC name instead.
+ if (lpstrUNC != NULL)
+ szFullPath = lpstrUNC;
+#endif // !OE_MAC
+
+ // Get the typelib's guid and version number.
+ IfErrGo(TiperrOfHresult(ptlib->GetLibAttr(&ptlibattr)));
+
+ // Verify that the syskind of the typelib is compatible with the platform.
+ // Also, get the subkey string for the syskind.
+ // Do this validation FIRST so that we don't end up half-registering
+ // the typelib if we get an error here.
+ switch (ptlibattr->syskind) {
+#if OE_MAC
+ case SYS_MAC:
+ szSys = "mac";
+ break;
+#endif // OE_MAC
+
+#if OE_WIN32 || OE_WIN16
+ case SYS_WIN32:
+ szSys = WIDE("win32");
+ break;
+
+ case SYS_WIN16:
+ szSys = WIDE("win16");
+ break;
+#endif // OE_WIN16 || OE_WIN32
+
+ default:
+ err = TIPERR_LibNotRegistered;
+ goto Error2;
+ }
+
+ // Now create the typelibs subkey.
+ if (oRegCreateKey(HKEY_CLASSES_ROOT, WIDE("TypeLib"), &hkeyTypelib) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error2;
+ }
+
+ // Convert the guid into the registry string format.
+ StringFromGUID2(ptlibattr->guid, szGuidTypeLib, CCH_SZGUID0);
+
+ if (oRegCreateKey(hkeyTypelib, szGuidTypeLib, &hkeyGuid) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error4;
+ }
+
+ // Now create the major.minor version subkey under guid.
+ // Convert the major and minor vernums to hex strings...
+ //
+ oultoa(ptlibattr->wMajorVerNum, rgchVer, 16);
+ oultoa(ptlibattr->wMinorVerNum, rgchVerMinor, 16);
+
+ // Tack them together with a dividing ".".
+ pchEnd = ostrchr(rgchVer, '\0'); // find end
+ *pchEnd++ = '.'; // add the dot
+ *pchEnd = '\0'; // null terminate again
+ ostrcat(rgchVer, rgchVerMinor); // concatenate
+
+ // Now create the subkey
+ if (oRegCreateKey(hkeyGuid, rgchVer, &hkeyVersion) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error5;
+ }
+
+ // Now set the doc string value
+ IfErrGoTo(TiperrOfHresult(ptlib->GetDocumentation(-1,
+ NULL,
+ &bstrDocString,
+ NULL,
+ NULL)),
+ Error6);
+
+ // And set its value.
+ if (oRegSetValue(hkeyVersion,
+ NULL,
+ REG_SZ,
+ (bstrDocString) ? bstrDocString : WIDE(""),
+ (bstrDocString) ? ostrblen0(bstrDocString) : 1) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error7;
+ }
+
+ // Now create the FLAGS subkey in under the version subkey
+ if (oRegCreateKey(hkeyVersion, WIDE("FLAGS"), &hkeyFlags) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error7;
+ }
+ // Get flags value in hex with no leading zeros
+ oultoa(ptlibattr->wLibFlags, rgchFlags, 16);
+
+ // And set the value.
+ if (oRegSetValue(hkeyFlags,
+ NULL,
+ REG_SZ,
+ rgchFlags,
+ ostrblen0(rgchFlags)) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ }
+ RegCloseKey(hkeyFlags);
+ if (err != TIPERR_None)
+ goto Error7;
+
+ // Now create the lcid subkey in hex string under version subkey
+ oultoa(ptlibattr->lcid, rgchLcid, 16);
+
+ // Now create the subkey
+ if (oRegCreateKey(hkeyVersion, rgchLcid, &hkeyLcid) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error7;
+ }
+
+ // Now create the subkey
+ if (oRegCreateKey(hkeyLcid, szSys, &hkeyPlatform) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error8;
+ }
+
+ // And set its value
+ IfErrGoTo(RegisterPathAndAlias(hkeyPlatform, szFullPath), Error9);
+
+ // If the HELPDIR was not specified and there is already a HELPDIR
+ // in the registry, don't do anything to the existing HELPDIR item.
+ // Otherwise, create the HELPDIR subkey under the version.
+ if (szHelpDir != NULL ||
+ oRegOpenKey(hkeyVersion, WIDE("HELPDIR"), &hkeyHelpdir) != ERROR_SUCCESS) {
+
+ if (oRegCreateKey(hkeyVersion, WIDE("HELPDIR"), &hkeyHelpdir) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error9;
+ }
+
+ // If szHelpDir wasn't specified, use szFullPath without the filename.
+ if (szHelpDir == NULL) {
+ szHelpDir = szFullPath;
+ pchEnd = GetPathEnd(szFullPath);
+ if (pchEnd == NULL) {
+ pchEnd = szFullPath;
+ }
+ chSave = *pchEnd;
+ *pchEnd = '\0';
+ }
+ else
+ pchEnd = NULL;
+
+ // Set the HELPDIR value.
+ err = RegisterPathAndAlias(hkeyHelpdir, szHelpDir);
+ // UNDONE: if this fails, the error is never reported. Intentional?
+
+ if (pchEnd != NULL)
+ *pchEnd = chSave;
+ }
+
+ RegCloseKey(hkeyHelpdir);
+
+ // Now register all the typeinfo that supports IDISPATCH interface.
+ //
+ // Get the count of typeinfo.
+ ustiCount = ptlib->GetTypeInfoCount();
+
+ // Now create the interface subkey.
+ if (oRegCreateKey(HKEY_CLASSES_ROOT, WIDE("Interface"), &hkeyInterface) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error9;
+ }
+
+ // For each typeinfo in the typelib register it's dispinterface/interface.
+ for (i=0; i < ustiCount; i++) {
+ // get the typekind
+ IfErrGoTo(TiperrOfHresult(ptlib->GetTypeInfoType(i, &typekind)), Error12);
+
+ // Check if this typeinfo's supports IDispatch interface
+ if (typekind == TKIND_DISPATCH || typekind == TKIND_INTERFACE) {
+
+ // Get the pointer to the typeinfo
+ IfErrGoTo(TiperrOfHresult(ptlib->GetTypeInfo(i, &pitinfo)), Error12);
+
+ // Get the type attribute of this typeinfo
+ IfErrGoTo(TiperrOfHresult(pitinfo->GetTypeAttr(&ptypeattr)), Error13);
+
+ if (ptypeattr->wTypeFlags & (TYPEFLAG_FOLEAUTOMATION | TYPEFLAG_FDUAL)) {
+ szGuidPS = szGuidPSAutomation;
+ } else {
+ if (typekind == TKIND_INTERFACE) {
+ goto DontRegisterInteface; // don't register non-OA interfaces
+ }
+ szGuidPS = szGuidPSDispatch;;
+ }
+
+ // Convert the guid into the registry string format.
+ StringFromGUID2(ptypeattr->guid, szGuidTypeInfo, CCH_SZGUID0);
+
+#if 0
+ // DUAL intefaces. It was added so that we would allow a user to
+ // specify their own custom remoting code for an interface & not have
+ // it overwritten by RegisterTypeLib. But the other scenario is more
+ // important.
+ if (ptypeattr->wTypeFlags & (TYPEFLAG_FOLEAUTOMATION | TYPEFLAG_FDUAL)) {
+ // if this guid already exists, leave it alone
+ if (oRegOpenKey(hkeyInterface, szGuidTypeInfo, &hkeyGuidTypeinfo) == ERROR_SUCCESS) {
+ goto DontRegisterInteface1; // don't re-register this interface
+ }
+ }
+#endif //0
+
+ // Get the Name of the typeinfo
+ IfErrGoTo(TiperrOfHresult(ptlib->GetDocumentation(i,
+ &bstrName,
+ NULL,
+ NULL,
+ NULL)), Error14);
+
+ // Now create the guid subkey under Interface
+ if (oRegCreateKey(hkeyInterface, szGuidTypeInfo, &hkeyGuidTypeinfo) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error16;
+ } // if
+
+ // And set the name of the typeinfo
+ if (oRegSetValue(hkeyGuidTypeinfo,
+ NULL,
+ REG_SZ,
+ bstrName,
+ ostrblen0(bstrName)) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error17;
+ }
+
+#if 0
+ // Dont register either "NumMethods" or "BaseInterface"
+ // anymore. They are largely cosmetic, and we cant afford
+ // the registry space (just used it below for the 2 kinds of
+ // ProxyStubClsid's)
+
+ IfErrGoTo(RegCreateSubKey(hkeyGuidTypeinfo,
+ WIDE("BaseInterface"),
+ szGuidBaseInterface,
+ CCH_SZGUID0), Error17);
+
+ IfErrGoTo(RegCreateSubKey(hkeyGuidTypeinfo,
+ WIDE("NumMethods"),
+ rgchNumMethods,
+ ostrblen0(rgchNumMethods)), Error17);
+#endif
+
+#define SZ_ProxyStubClsid1 WIDE("ProxyStubClsid")
+#if OE_WIN
+#define SZ_ProxyStubClsid2 WIDE("ProxyStubClsid32")
+#endif
+ IfErrGoTo(RegCreateSubKey(hkeyGuidTypeinfo,
+ SZ_ProxyStubClsid1,
+ szGuidPS,
+ CCH_SZGUID0), Error17);
+
+#if OE_WIN
+ // Have to create both 16-bit & 32-bit keys on win16 & win32, since
+ // we don't know whether or not the user will try to do 16-32 interop
+ // stuff.
+ IfErrGoTo(RegCreateSubKey(hkeyGuidTypeinfo,
+ SZ_ProxyStubClsid2,
+ szGuidPS,
+ CCH_SZGUID0), Error17);
+#endif //OE_WIN
+
+ IfErrGoTo(RegCreateSubKey(hkeyGuidTypeinfo,
+ WIDE("TypeLib"),
+ szGuidTypeLib,
+ CCH_SZGUID0), Error17);
+
+ FreeBstr(bstrName);
+ bstrName = NULL;
+
+//DontRegisterInteface1:
+ RegCloseKey(hkeyGuidTypeinfo);
+
+DontRegisterInteface:
+ // Release the typeinfo and the type attribute.
+ pitinfo->ReleaseTypeAttr(ptypeattr);
+ pitinfo->Release();
+
+ } // if
+
+ } // for loop
+
+ // Go to Error12 to clean up the resources.
+ goto Error12;
+
+Error17:
+ RegCloseKey(hkeyGuidTypeinfo);
+ // fall through...
+
+Error16:
+ FreeBstr(bstrName);
+ // Fall through...
+
+Error14:
+ pitinfo->ReleaseTypeAttr(ptypeattr);
+ // Fall through...
+
+Error13:
+ pitinfo->Release();
+ // Fall through...
+
+Error12:
+ RegCloseKey(hkeyInterface);
+ // Fall through...
+
+Error9:
+ RegCloseKey(hkeyPlatform);
+ // fall through...
+
+Error8:
+ RegCloseKey(hkeyLcid);
+ // fall through...
+
+Error7:
+ FreeBstr(bstrDocString);
+ // fall through...
+
+Error6:
+ RegCloseKey(hkeyVersion);
+ // fall through...
+
+Error5:
+ RegCloseKey(hkeyGuid);
+ // fall through...
+
+Error4:
+ RegCloseKey(hkeyTypelib);
+ // fall through...
+
+Error2:
+ ptlib->ReleaseTLibAttr(ptlibattr);
+ // fall through...
+
+Error:
+#if !OE_MAC
+ MemFree(lpstrUNC);
+#endif // !OE_MAC
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+#if OE_MAC
+
+/***
+* STDAPI LoadTypeLibFS - Loads a typelib given an FSSpec.
+***************************************************************/
+#pragma code_seg(CS_INIT)
+STDAPI LoadTypeLibFSp(const FSSpec *pfsspec, ITypeLibA **pptlib)
+{
+ XCHAR rgchPathName[256];
+ HRESULT hresult;
+
+ // if vRefNum and parID are both 0, then call LoadTypeLib
+ // with just the name (to force the search).
+ if (pfsspec->vRefNum == 0 && pfsspec->parID == 0) {
+ memcpy(rgchPathName, pfsspec->name+1, pfsspec->name[0]);
+ rgchPathName[pfsspec->name[0]] = '\0';
+ }
+ else {
+ IfOleErrRet(HresultOfTiperr(GetPathFromFSSpec(pfsspec,
+ rgchPathName,
+ sizeof(rgchPathName))));
+ }
+ return LoadTypeLib(rgchPathName, pptlib);
+}
+#pragma code_seg()
+
+/***
+* STDAPI RegisterTypeLibFolder() - Registers the typelib folder.
+*
+* Purpose:
+* RegisterTypeLibFolder is only available on the Mac. It stores in the
+* registry the location of the standard TypeLib folder. This folder
+* is searched for requested typelibs by LoadTypeLib as a last resort.
+* The specified path is always put in the registry. On System 7, the
+* corresponding alias record is also stored in the registry so that
+* the user can move the typelib folder around without invalidating the
+* registry.
+*
+* Inputs:
+* szFullPath - Its complete path. This must not end with a colon. (IN)
+*
+* Implementation:
+* The subkey hierarchy looks like this:
+* \ [root]
+* TypeLib
+* TypeLibFolder=<szFullPath>
+* Alias=<alias> [system 7 only]
+*
+* NOTE: since this can be the first call into typelib.dll
+* we must ensure that the APPDATA struct has been inited,
+* thus InitAppData().
+*
+******************************************************************************/
+#pragma code_seg(CS_INIT)
+STDAPI RegisterTypeLibFolder(LPSTR szFullPath)
+{
+ HKEY hkeyPath;
+ TIPERROR err = TIPERR_None;
+
+ // Create the TypeLibFolder key...
+ if (RegCreateKey(HKEY_CLASSES_ROOT, "TypeLibFolder", &hkeyPath) != ERROR_SUCCESS) {
+ err = TIPERR_RegistryAccess;
+ goto Error;
+ }
+
+ // ...and set its value.
+ err = RegisterPathAndAlias(hkeyPath, szFullPath);
+
+ RegCloseKey(hkeyPath);
+
+Error:
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+/***
+* STDAPI QueryTypeLibFolder() - Returns path of the registered typelib folder.
+*
+* Purpose:
+* QueryTypeLibFolder is only available on the Mac. It returns the path
+* of the registered typelib folder if it is registered and the registered
+* folder exists. The folder's location is recorded both as a path and
+* as an alias record. If the path exists, that is returned. Otherwise,
+* the alias is used to get the folder's path. If that succeeds, the
+* registered path is updated and returned.
+*
+* Inputs:
+* None.
+*
+* Outputs:
+* On success, *pbstr is set to an allocate BSTR containing the path.
+* If there is no typelib folder entry, RegistryAccess is returned.
+* If the registered folder cannot be located, even through the alias,
+* PathNotFound is returned.
+*
+******************************************************************************/
+#pragma code_seg(CS_INIT)
+STDAPI QueryTypeLibFolder(LPBSTRA pbstr)
+{
+ TIPERROR err = TIPERR_None;
+ LONG cbPath;
+ XSZ mszPath;
+ BSTRA bstr;
+
+ mszPath = (XSZ)GetMemPool(MEMPOOL_1024_0);
+ cbPath = (LONG)MemPoolSize(MEMPOOL_1024_0);
+
+ // Lookup the path from the registry, ensuring it exists.
+ IfErrGo(GetRegisteredPath(HKEY_CLASSES_ROOT, "TypeLibFolder", mszPath, &cbPath, TRUE));
+
+ if ((bstr = AllocBstr(mszPath)) == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ *pbstr = bstr;
+
+Error:
+ FreeMemPool(mszPath);
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+#endif // OE_MAC
+
+
+/***
+*PROTECTED GenericTypeLibOLE::operator new
+*Purpose:
+* Allocates space for a GenericTypeLibOLE
+*
+*Implementation Notes:
+* Allocates a SHEAP_MGR segment and returns a pointer into segment
+* immediately following the SHEAP_MGR instance.
+* The heap is initialized with enough reserved space to contain the
+* SHEAP_MGR instance and the GenericTypeLibOLE (or derived) instance.
+*
+*Entry:
+* size - this is the size of GenericTypeLibOLE or the derived instance
+*
+*Exit:
+* pointer to location at which the GenericTypeLibOLE or derived instance
+* is to be constructed
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID* GenericTypeLibOLE::operator new(size_t size)
+{
+ SHEAP_MGR *psheapmgr;
+ TIPERROR err;
+
+ err = SHEAP_MGR::Create(&psheapmgr, sizeof(SHEAP_MGR) + size);
+
+ if (err != TIPERR_None) {
+ return NULL;
+ }
+ else {
+ return psheapmgr + 1;
+ }
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GenericTypeLibOLE::Init
+*Purpose:
+* Initializes a new GenericTypeLibOLE.
+*
+*Entry:
+* szLibIdFile - In EI_OB, this is the libId of the typelib, or NULL if it
+* is not known. In the OLE implementation this is the filename.
+* psheapmgr - pointer to SHEAP_MGR instance used for initializing
+* blkdesc's belonging to the GenericTypeLibOLE.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::Init()
+{
+ UINT i;
+ TIPERROR err;
+
+ m_cRefs = 1;
+ m_cTypeEntries = 0;
+ m_pstg = NULL;
+ m_pstgContainer = NULL;
+ m_wLibFlags = 0;
+ m_lSampleHashVal = 0;
+
+ m_lcidZero = FALSE;
+
+ m_lcid = GetUserDefaultLCID(); // Get the systems default LCID
+ if (!VerifyLcid(m_lcid)) { // for typelib.dll, if the lcid is bad,
+ m_lcid = 0x0409; // then we assume International English
+ m_lcidZero = TRUE; // set the flag to indicate that the lib's
+ // lcid was 0
+ }
+
+ // cache DBCS flag
+ m_isDBCS = IsDBCS(m_lcid);
+
+ // Initialize each bucket list to empty
+ for (i = 0; i < GTLIBOLE_cBuckets; i++)
+ m_rghteBucket[i] = HTENTRY_Nil;
+
+ SHEAP_MGR *psheapmgr = Psheapmgr();
+ IfErrRet(m_nammgr.Init(psheapmgr));
+ IfErrRet(m_bdte.Init(psheapmgr, 0));
+ IfErrRet(m_bmData.Init(psheapmgr));
+ IfErrRet(m_gptbind.Init(psheapmgr));
+
+ IfErrRet(m_nammgr.SetGtlibole(this));
+
+ IfErrRet(m_dstrmgr.Init());
+
+
+ return TIPERR_None;
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::Create
+*Purpose:
+* Create and initialize a typelib instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = TIPERROR
+*
+* *pptlib = ptr to the newly created typelib instance.
+*
+***********************************************************************/
+TIPERROR
+GenericTypeLibOLE::Create(IStorageA *pstg, GenericTypeLibOLE **pptlib)
+{
+ TIPERROR err;
+ GenericTypeLibOLE *ptlib;
+
+ if ((ptlib = new GenericTypeLibOLE) == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ // Here we initialize the protected m_psheapmgr member.
+ // Since we know that operator new returns a pointer to
+ // memory allocated immediately after a SHEAP_MGR instance,
+ // we simply initialize m_psheapmgr accordingly.
+ //
+ ptlib->m_psheapmgr = (SHEAP_MGR *)ptlib - 1;
+#if OE_SEGMENTED
+ DebAssert(OOB_OFFSETOF(ptlib->m_psheapmgr) == 0,
+ "Heap manager not on seg boundary");
+#endif
+
+ IfErrGo(ptlib->Init());
+
+ if(pstg != NULL){
+ pstg->AddRef();
+ ptlib->m_pstg = pstg;
+ }
+
+ *pptlib = ptlib;
+ return TIPERR_None;
+
+Error:;
+ return err;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GenericTypeLibOLE::QueryInterface
+*Purpose:
+* Implementation of QueryInterface method.
+* Only supports casting to ITypeLibA and ICreateTypeLibA.
+*
+*Entry:
+* riid - Interface GUID
+* ppv - LPVOID * that receives the requested protocol.
+*
+*Exit:
+* Return NOERROR or ReportResult(0, E_NOINTERFACE, 0, 0)
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+STDMETHODIMP
+GenericTypeLibOLE::QueryInterface(REFIID riid, LPVOID FAR* ppv)
+{
+ *ppv = NULL; // required by OLE
+ if(riid == IID_IUnknown){
+ *ppv = (LPVOID)(IUnknown*)(ITypeLibA*)this;
+ }else
+ if(riid == IID_ICreateTypeLibA){
+ *ppv = (LPVOID)(ICreateTypeLibA*)this;
+ }else
+ if(riid == IID_ITypeLibA
+ || riid == IID_IGenericTypeLibOLE
+ ){
+ *ppv = (LPVOID)(ITypeLibA*)this;
+ }
+
+ if(*ppv == NULL)
+ return HresultOfScode(E_NOINTERFACE);
+ ((IUnknown*)*ppv)->AddRef();
+ return NOERROR;
+}
+#pragma code_seg( )
+
+/***
+*PUBLIC GenericTypeLibOLE::AddRef
+*Purpose:
+* Increment reference count of the typelib
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+STDMETHODIMP_(ULONG)
+GenericTypeLibOLE::AddRef()
+{
+ // WARNING : WARNING : We set the count to -1 when the typelib is
+ // being destructed. m_cRefs is geing used as a semaphore
+ // to ensure that we do not get into a recursive release.
+ // Hence do not bump up the count if the typelib is being
+ // destructed.
+ if (m_cRefs != -1) {
+ m_cRefs++;
+ }
+ return m_cRefs;
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GenericTypeLibOLE
+*Purpose:
+* Initialize members of GenericTypeLibOLE so release can be called even
+* if initialization fails.
+* need to initialize const/static class members
+* since cfront is buggy and we have no ctor linker.
+*
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+GenericTypeLibOLE::GenericTypeLibOLE()
+{
+ m_cRefs = 1;
+ m_cTypeEntries = 0;
+ m_pstg = NULL;
+ m_pstgContainer = NULL;
+ m_hlnamLib = HLNAM_Nil;
+ m_hszDefaultTITypeId = HCHUNK_Nil;
+ m_hasValidDiskImageNameCache = (USHORT)FALSE;
+ m_lPosGptbind = -1;
+ m_fGptbindDeserialized = FALSE;
+ m_fDstrmgrDeserialized = FALSE;
+ m_lPosDstrmgr -1;
+ m_wCurVersion = wDefaultVersion;
+ m_fNammgrDeserialized = FALSE;
+ m_lPosNammgr = -1;
+ m_lPosRgnamcache = -1;
+ m_fDirModified = FALSE;
+ m_isModified = FALSE;
+ m_hszDocString = HCHUNK_Nil;
+ m_dwHelpContext = 0;
+ m_hszHelpFile = HCHUNK_Nil;
+ m_psheapmgr = NULL;
+ m_wMajorVerNum = 0;
+ m_wMinorVerNum = 0;
+ m_guid = IID_NULL;
+ m_hszFile = HCHUNK_Nil;
+ m_hszDirectory = HCHUNK_Nil;
+ // Bump the count of typelib currently loaded.
+ Pappdata()->m_cTypeLib++;
+
+ m_syskind = SYSKIND_CURRENT;
+
+#if ID_DEBUG
+ m_szDebName[0] = 0;
+#endif // ID_DEBUG
+
+ // moved setting of m_lcid and m_codepageSrc/Dst to Init()
+
+ DebResetNameCacheStats();
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GenericTypeLibOLE::Release
+*Purpose:
+* Release a reference to the TypeLib.
+* Frees the TypeLib if no more references.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+STDMETHODIMP_(ULONG)
+GenericTypeLibOLE::Release()
+{
+ ULONG cRefs;
+
+ // WARNING : We set the count to -1 when the typelib is
+ // being destructed. m_cRefs is geing used as a semaphore
+ // to ensure that we do not get into a recursive release.
+ // Hence if m_cRefs == -1 then return as we are already
+ // in the process of destructing this LIB.
+ if (m_cRefs == -1)
+ return m_cRefs;
+
+ DebAssert(m_cRefs > 0, "underflow.");
+
+ // Error generation suspended.
+ DebSuspendError();
+
+ m_cRefs--;
+ cRefs = m_cRefs;
+ if (m_cRefs == 0) {
+
+ APP_DATA *pappdata = Pappdata();
+
+ // if this is the last reference to stdole.tlb, invalidate the
+ // appdata cache
+ if (this == pappdata->m_ptlibStdole)
+ pappdata->m_ptlibStdole = NULL;
+
+ // WARNING : WARNING : We set the count to -1 when the typelib is
+ // being destructed. m_cRefs is geing used as a semaphore
+ // to ensure that we do not get into a recursive release.
+ m_cRefs = (ULONG)-1;
+ delete this;
+ Poletmgr()->TypeLibUnloaded(this);
+ }
+
+ // Error generation resumed.
+ DebResumeError();
+ return cRefs;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GenericTypeLibOLE::~GenericTypeLibOLE
+*Purpose:
+* Release resources of GenericTypeLibOLE
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+GenericTypeLibOLE::~GenericTypeLibOLE()
+{
+ UINT i;
+
+ // Release the lib's binding resources.
+ // This walks the proj-level binding table and releases
+ // external references to other projects (recursively).
+ //
+ ReleaseResources();
+
+ // Before releasing the resources, make sure that there is
+ // no internal refrences within the project.
+ for (i = 0; i < m_cTypeEntries; i++) {
+ if (Qte(i)->m_pstltinfo != NULL) {
+ if (Qte(i)->m_pstltinfo->PstltiPartner() != NULL) {
+ Qte(i)->m_pstltinfo->PstltiPartner()->RemoveInternalRefs();
+ }
+ Qte(i)->m_pstltinfo->RemoveInternalRefs();
+ }
+ }
+
+ for (i = 0; i < m_cTypeEntries; i++) {
+ while (Qte(i)->m_pdfstrm != NULL) {
+ Qte(i)->m_pdfstrm->Release();
+ }
+ }
+
+ // Release the resourses owned by the TYPE_ENTRY table which are
+ // external to the GenericTypeLibOLE's heap.
+ // Elements of the heap don't need to be released since the whole
+ // heap will be released.
+ // Note that some TYPEINFOs may still be loaded due to internal
+ // references from other TYPEINFOs in this ITypeLib.
+ for (i = 0; i < m_cTypeEntries; i++) {
+ // !!!!!!HACK ALERT!!!!!
+ // In EI_OLE, we know the truetype of the typeinfo is GEN_DTINFO
+ // and that it was allocated via MemAlloc and that global delete
+ // is not allowed. So explicitly call its destructor and use
+ // MemFree to deallocate it.
+ // THIS WILL BREAK IF THE TRUETYPE EVER CHANGES TO SOMETHING ELSE.
+ //////////////////////////////////////////////////////////////////
+ if (Qte(i)->m_pstltinfo != NULL) {
+ if (Qte(i)->m_pstltinfo->PstltiPartner() != NULL) {
+ ((GEN_DTINFO *)(Qte(i)->m_pstltinfo->PstltiPartner()))
+ ->GEN_DTINFO::~GEN_DTINFO();
+ MemFree(Qte(i)->m_pstltinfo->PstltiPartner());
+ }
+
+ ((GEN_DTINFO *)(Qte(i)->m_pstltinfo))->GEN_DTINFO::~GEN_DTINFO();
+ MemFree(Qte(i)->m_pstltinfo);
+ }
+ RelTypeEntExtResources(i);
+ }
+
+ if (m_pstg != NULL) {
+ m_pstg->Release();
+ }
+
+}
+#pragma code_seg()
+
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::Deleting
+*Purpose:
+* Called by a TypeInfo when its last external reference has been released.
+*
+*Entry:
+* hte - handle for the TypeInfo being deleted
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#if OE_MAC
+#pragma code_seg(CS_INIT)
+#endif
+VOID GenericTypeLibOLE::Deleting(HTENTRY hte)
+{
+ Qte(hte)->m_pstltinfo = NULL;
+}
+#if OE_MAC
+#pragma code_seg()
+#endif
+
+/***
+*PUBLIC GenericTypeLibOLE::GetTypeInfoCount
+*Purpose:
+* Return the number of TypeInfos contained in the library.
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns number of TypeInfos
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+UINT GenericTypeLibOLE::GetTypeInfoCount()
+{
+ return m_cTypeEntries;
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetDocumentation
+*Purpose:
+* Return the various pieces of documentation about the specified type
+* (or the current typelib).
+*
+*Entry:
+* i - index of TypeInfo whose documentation is to be returned.
+* This should be -1 if the typelib's documentation is desired instead.
+*
+*Exit:
+* HRESULT
+* The info corresponding to each pointer is set appropriately, provided
+* that pointer is not NULL. The strings are allocated as BSTRs and must
+* be freed (eventually) by the caller.
+*
+* If an error occurs, the pointers are not modified.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+HRESULT GenericTypeLibOLE::GetDocumentation(INT i,
+ LPBSTR lpbstrName,
+ LPBSTR lpbstrDocString,
+ LPDWORD lpdwHelpContext,
+ LPBSTR lpbstrHelpFile)
+{
+ BSTRA bstrName = NULL;
+ BSTR bstrDocString = NULL;
+ BSTR bstrHelpFile = NULL;
+ DWORD dwHelpContext;
+ TIPERROR err = TIPERR_None;
+ NAMMGR *pnammgr;
+ HRESULT hresult;
+
+ // Get the help file, if it is requested. Note that this is the
+ // same regardless of the value of the index.
+ if (lpbstrHelpFile != NULL) {
+
+ // If the helpfile is not known, just return NULL.
+ if (m_hszHelpFile == HCHUNK_Nil) {
+ *lpbstrHelpFile = NULL;
+ goto AfterHelpFile;
+ }
+
+
+ // The OLE implementation prepends the registered HELPDIR to the
+ // helpfile name.
+ TLIBKEY tlibkey;
+ TLIBATTR *ptlibattr;
+ long cbDir;
+ OLECHAR szDir[256];
+ OLECHAR szGuid[CCH_SZGUID0];
+
+ // Get the typelib's guid and version number.
+ IfErrGo(TiperrOfHresult((GetLibAttr(&ptlibattr))));
+
+ // Convert the guid into the registry string format.
+ StringFromGUID2(ptlibattr->guid, szGuid, CCH_SZGUID0);
+
+ // Open the registry key for the typelib. Fail if there is no entry
+ // for this typelib.
+ err = OpenTypeLibKey(
+ szGuid,
+ ptlibattr->wMajorVerNum,
+ ptlibattr->wMinorVerNum,
+ &tlibkey);
+
+ // Free the TLIBATTR now that we're done with it.
+ ReleaseTLibAttr(ptlibattr);
+
+ // If the typelib is registered, use the registered helpdir.
+ if (err == TIPERR_None) {
+ cbDir = sizeof(szDir)/sizeof(OLECHAR); //NOTE: this is really cchDir on OE_WIN32
+ // Verify that the path exists.
+ err = GetRegisteredPath(tlibkey.hkeyVers, WIDE("HELPDIR"), szDir, &cbDir, TRUE);
+ CloseTypeLibKey(&tlibkey);
+ if (err == TIPERR_None)
+ cbDir = ostrblen(szDir);
+ }
+
+ // If the typelib wasn't registered or there was an error in getting
+ // the registered helpdir, just use its current directory.
+ if (err != TIPERR_None) {
+ cbDir = ostrblen(QszOfHsz(m_hszDirectory));
+ if (cbDir != 0) {
+ ostrcpy(szDir, QszOfHsz(m_hszDirectory));
+ }
+ szDir[cbDir] = '\0';
+ }
+
+ m_bmData.Lock();
+ err = MakeAbsolutePath(szDir, QszOfHsz(m_hszHelpFile), &bstrHelpFile);
+ m_bmData.Unlock();
+ if (err)
+ goto Error;
+ }
+
+AfterHelpFile:
+
+ if (i == -1) {
+ if ((lpbstrName != NULL) && (m_hlnamLib != HLNAM_Nil)) {
+ // Get the name of the project/typelib from the Nammgr.
+ IfErrGo(GetNamMgr(&pnammgr));
+
+ IfErrGo(pnammgr->BstrOfHlnam(m_hlnamLib, &bstrName));
+
+ }
+ if (lpbstrDocString != NULL) {
+ IfErrGo(GetBStrOfHsz(&m_bmData, m_hszDocString, &bstrDocString));
+ }
+ if (lpdwHelpContext != NULL) {
+ dwHelpContext = m_dwHelpContext;
+ }
+ }
+ else {
+ if ((UINT)i >= m_cTypeEntries) {
+ err = TIPERR_ElementNotFound;
+ goto Error;
+ }
+ if (lpbstrName != NULL) {
+ IfErrGo(GetNamMgr(&pnammgr));
+
+ if (Qte(i)->m_ste.m_hlnamType != HLNAM_Nil)
+ IfErrGo(pnammgr->BstrOfHlnam(Qte(i)->m_ste.m_hlnamType, &bstrName));
+ }
+
+ if (lpbstrDocString != NULL) {
+ DOCSTR_MGR *pdstrmgr;
+ TIPERROR err;
+ BYTE *pbChunkStr;
+
+ if (Qte(i)->m_ste.m_hszEncodedDocString != HCHUNK_Nil) {
+ // Get the doc string manager.
+ IfErrGo(GetDstrMgr(&pdstrmgr));
+
+ pbChunkStr = m_bmData.QtrOfHandle(Qte(i)->m_ste.m_hszEncodedDocString);
+
+ // Get the decoded Doc string.
+ //
+ IfErrGo(pdstrmgr->GetDecodedDocStrOfHst(pbChunkStr, &bstrDocString));
+
+ }
+
+ }
+ if (lpdwHelpContext != NULL) {
+ dwHelpContext = Qte(i)->m_ste.m_dwHelpContext;
+ }
+ }
+
+ if (lpbstrName != NULL) {
+#if OE_WIN32
+ IfErrGo(TiperrOfHresult(ConvertBstrToWInPlace((BSTR *)&bstrName)));
+#endif
+ *lpbstrName = (BSTR)bstrName;
+ }
+ if (lpbstrDocString != NULL)
+ *lpbstrDocString = bstrDocString;
+ if (lpbstrHelpFile != NULL) {
+ *lpbstrHelpFile = (BSTR)bstrHelpFile;
+ }
+ if (lpdwHelpContext != NULL)
+ *lpdwHelpContext = dwHelpContext;
+
+ return NOERROR;
+
+Error:
+ hresult = HresultOfTiperr(err);
+
+ FreeBstrA(bstrName);
+ FreeBstr(bstrDocString);
+ FreeBstr(bstrHelpFile);
+ return hresult;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GenericTypeLibOLE::IsName
+*Purpose:
+* Tests whether name is defined in library. Returns true if the passed
+* in name matches the name of any type, member name, or parameter name.
+* If a matching name is found then the szNameBuf is modified to so that
+* characters are cased according to how they appear in the library.
+*
+*Entry:
+* szNameBuf : String that needs to be searched.
+* lHashVal : Hashvalue of the string that needs to be searched.
+*
+*Exit:
+* lpfName : True if the name was found in the Lib. else false.
+* HRESULT : Error
+*
+***********************************************************************/
+
+HRESULT GenericTypeLibOLE::IsName(OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ int FAR* lpfName)
+{
+ NAMMGR *pnammgr;
+ TIPERROR err= TIPERR_None;
+#if OE_WIN32
+ CHAR FAR* szNameBufA;
+ HRESULT hresult;
+#else //OE_WIN32
+ #define szNameBufA szNameBuf
+#endif //OE_WIN32
+
+ if (szNameBuf == NULL || lpfName == NULL) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+#if OE_WIN32
+ hresult = ConvertStringToA(szNameBuf, &szNameBufA);
+ if (hresult != NOERROR) {
+ return hresult;
+ }
+#endif //OE_WIN32
+
+ if (!IsHashValCompatible(lHashVal, GetSampleHashVal())) {
+ // hash value is not compatible hence we need to recalculate the hash
+ // value
+ lHashVal = LHashValOfNameSysA(GetSyskind(), GetLcid(), szNameBufA);
+
+ }
+ // Ensure that the nammgr is read from the disk if it has not been
+ // read yet and do a quick check to see if this name is in the
+ // TypeLib at all..
+ //
+ IfErrGo(GetNamMgr(&pnammgr));
+ err = pnammgr->IsName(szNameBufA, lHashVal, lpfName);
+
+#if OE_WIN32
+ if (err == TIPERR_None && *lpfName) {
+ // If name, found, copy name we found back. No need to do a length
+ // check on the output buffer, since the string is guaranteed to be the
+ // same length coming out as it was coming in.
+ UINT cb = xstrblen0(szNameBufA);
+ MultiByteToWideChar(CP_ACP, 0, szNameBufA, cb, szNameBuf, cb);
+ }
+#endif //OE_WIN32
+
+Error:
+#if OE_WIN32
+ ConvertStringFree(szNameBufA);
+#endif //OE_WIN32
+ return HresultOfTiperr(err);
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::FindName
+*Purpose:
+* Find the first cFound entries in this TypeLib return
+* their TypeInfos and MEMBERIDs
+*
+*Entry:
+* szNameBuf : String that needs to be found.
+* lHashVal : Hashvalue of the string that needs to be searched.
+* pcFound : The size of the TypeInfo/MEMBERID arrays.
+*
+*Exit:
+* rgptinfo : Holds the ptinfos where the name is found.
+* rgmemid : Holds the MEMBERID of the name in the corresponding
+* TypeLib, MEMBERID_NIL if the name is a class.
+* pcFound : The number of times the name appears in this TypeLib
+* HRESULT : Error
+*
+***********************************************************************/
+
+HRESULT GenericTypeLibOLE::FindName(OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ ITypeInfoA FAR* FAR* rgptinfo,
+ MEMBERID FAR* rgmemid,
+ unsigned short FAR* pcFound)
+{
+ BOOL fName;
+ NAMMGR *pnammgr;
+ TIPERROR err= TIPERR_None;
+#if OE_WIN32
+ HRESULT hresult;
+ char FAR* szNameBufA;
+#else //OE_WIN32
+ #define szNameBufA szNameBuf
+#endif //OE_WIN32
+
+ if (!szNameBuf || !rgptinfo || !rgmemid || !pcFound) {
+ return HresultOfScode(E_INVALIDARG);
+ }
+
+#if OE_WIN32
+ IfOleErrRet(ConvertStringToA(szNameBuf, &szNameBufA));
+#endif //OE_WIN32
+
+ if (!IsHashValCompatible(lHashVal, GetSampleHashVal())) {
+ // hash value is not compatible hence we need to recalculate the hash
+ // value
+ lHashVal = LHashValOfNameSysA(GetSyskind(), GetLcid(), szNameBufA);
+
+ }
+
+ // Ensure that the nammgr is read from the disk if it has not been
+ // read yet and do a quick check to see if this name is in the
+ // TypeLib at all..
+ //
+ IfErrGo(GetNamMgr(&pnammgr));
+
+ IfErrGo(pnammgr->IsName(szNameBufA, lHashVal, &fName));
+
+ // If the name exists and we are interested in knowing anything
+ // else, defer to FindMembers to get the names.
+ //
+ if (fName && *pcFound) {
+ err = FindMembers(szNameBufA, lHashVal, rgptinfo, rgmemid, pcFound);
+ }
+ else {
+ // We didn't find it, so return nothing.
+ *pcFound = 0;
+ }
+
+Error:
+#if OE_WIN32
+ ConvertStringFree(szNameBufA);
+#endif //OE_WIN32
+ return HresultOfTiperr(err);
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetLibAttr
+*Purpose:
+* Allocates and returns a TLIBATTR structure containing various
+* attributes of this typelib.
+*
+*Entry:
+*
+*Exit:
+* *pptlibattr - A callee-allocated structure filled with attributes.
+* The caller is responsible for eventually freeing the memory associated
+* with this structure by calling the non-member function ReleaseTLibAttr().
+* HRESULT
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+HRESULT GenericTypeLibOLE::GetLibAttr(TLIBATTR **pptlibattr)
+{
+ TLIBATTR *ptlibattr;
+ TIPERROR err=TIPERR_None;
+
+ if (pptlibattr == NULL)
+ return HresultOfScode(E_INVALIDARG);
+
+ // Allocate the TLIBATTR structure.
+ if ((ptlibattr = (TLIBATTR *)MemAlloc(sizeof(TLIBATTR))) == NULL)
+ return HresultOfScode(E_OUTOFMEMORY);
+
+ // if the lcid was set to be zero then return 0 as the lcid.
+ if (m_lcidZero)
+ ptlibattr->lcid = 0;
+ else
+ ptlibattr->lcid = m_lcid;
+
+
+ ptlibattr->syskind = (SYSKIND)m_syskind;
+ ptlibattr->wLibFlags = m_wLibFlags;
+
+ ptlibattr->wMajorVerNum = m_wMajorVerNum;
+ ptlibattr->wMinorVerNum = m_wMinorVerNum;
+ ptlibattr->guid = m_guid;
+
+ *pptlibattr = ptlibattr;
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC void GenericTypeLibOLE::ReleaseTLibAttr
+*Purpose:
+* Frees a TLIBATTR structure allocated by GetLibAttr.
+* ptlibattr may be NULL, in which case this method does nothing.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+void GenericTypeLibOLE::ReleaseTLibAttr(TLIBATTR *ptlibattr)
+{
+ if (ptlibattr != NULL) {
+ MemFree(ptlibattr);
+ }
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*HRESULT GenericTypeLibOLE::CreateTypeInfo
+*
+*Entry:
+* szName - The new typeinfo's name.
+* tkind - The kind of type to be represented by the new typeinfo.
+*
+*Exit:
+* *ppictinfo - Points at the new typeinfo if successful.
+***********************************************************************/
+HRESULT GenericTypeLibOLE::CreateTypeInfo(LPOLESTR szName, TYPEKIND tkind, ICreateTypeInfoA **ppictinfo)
+{
+ TIPERROR err;
+ GEN_DTINFO *pgdtinfo;
+
+ // Create the typeinfo.
+ err = GEN_DTINFO::Create(&pgdtinfo,
+ tkind,
+ FALSE,
+ ACCESS_Public
+ , GetSyskind()
+ );
+ if (err) goto Error;
+
+ // Add it to the specified project.
+ if (err = Add(pgdtinfo, szName))
+ pgdtinfo->Release();
+ else
+ *ppictinfo = pgdtinfo;
+
+ // FALL THROUGH!!!
+
+Error:
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+/***
+*HRESULT GenericTypeLibOLE::SetDocString
+*
+*Entry:
+* szDocString - The new documentation string.
+***********************************************************************/
+HRESULT GenericTypeLibOLE::SetDocString(LPOLESTR szDoc)
+{
+ return HresultOfTiperr(ResetHsz(szDoc, &m_hszDocString));
+}
+#pragma code_seg()
+
+/***
+*HRESULT GenericTypeLibOLE::SetHelpFileName
+*
+*Entry:
+* szHelpFileName - The new help file name.
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GenericTypeLibOLE::SetHelpFileName(LPOLESTR szHelpFileName)
+{
+ return HresultOfTiperr(ResetHsz(szHelpFileName, &m_hszHelpFile));
+}
+#pragma code_seg()
+
+/***
+*HRESULT GenericTypeLibOLE::SetHelpContext
+*
+*Entry:
+* dwHelpContext - The new help context.
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GenericTypeLibOLE::SetHelpContext(DWORD dwHelpContext)
+{
+ m_dwHelpContext = dwHelpContext;
+ return NOERROR;
+}
+#pragma code_seg()
+
+/***
+*HRESULT GenericTypeLibOLE::SetLibFlags
+*
+*Entry:
+* uLibFlags -- the library flags
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GenericTypeLibOLE::SetLibFlags(UINT uLibFlags)
+{
+ DebAssert(((uLibFlags & ~(LIBFLAG_FRESTRICTED
+ | LIBFLAG_FCONTROL
+ | LIBFLAG_FHIDDEN
+ )) == 0), "invalid flags");
+ m_wLibFlags = (WORD)uLibFlags;
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+
+
+/***
+*HRESULT GenericTypeLibOLE::SetLcid
+*
+*Entry:
+* lcid - The new lcid.
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+HRESULT GenericTypeLibOLE::SetLcid(LCID lcid)
+{
+ NAMMGR *pnammgr;
+ TIPERROR err;
+
+ // Make this call to nammgr only after setting the LCID.
+ IfErrRetHresult(GetNamMgr(&pnammgr));
+
+ // in typelib if the passed in lcid is zero then we default to
+ // US english.
+ if (lcid == 0x0000) {
+ m_lcid = 0x0409;
+ m_lcidZero = TRUE;
+ }
+ else {
+ // Verify Lcid
+ // check if the LCID is correct
+ if (!VerifyLcid(lcid)) {
+ return HresultOfScode(TYPE_E_UNKNOWNLCID);
+ }
+
+ m_lcid = lcid;
+ m_lcidZero = FALSE;
+ }
+
+ // cache DBCS flag
+ m_isDBCS = IsDBCS(m_lcid);
+
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetTypeComp
+*Purpose:
+* Return a ITypeComp for binding to globals defined by the library.
+* NOTE: the above function will vanish eventually.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+HRESULT GenericTypeLibOLE::GetTypeComp(ITypeCompA **pptcomp)
+{
+ CDefnTypeComp *pdfntcomp;
+ TIPERROR err;
+
+ if (pptcomp == NULL)
+ return HresultOfScode(E_INVALIDARG);
+
+ // Deserialize/create the binding table
+ IfErrGo(GetTypeBind());
+
+ // Create a CDefnTypeComp to return to the user who must
+ // must release it eventually...
+ //
+ IfErrGo(CDefnTypeComp::Create(&pdfntcomp, &m_gptbind));
+ *pptcomp = pdfntcomp;
+ // fall through...
+
+Error:
+ return HresultOfTiperr(err);
+}
+
+
+
+
+
+
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::SetDirectory(LPOLESTR szFile)
+{
+ LPOLESTR sz;
+ OLECHAR ch;
+ TIPERROR err;
+
+ // Find the first character beyond the directory portion of szFile.
+ // This is either the last backslash, the last colon, or the beginning
+ // of szFile, whichever comes last.
+ if ((sz = GetPathEnd(szFile)) == NULL)
+ sz = szFile;
+
+ // Temporarily set that character to \0 to turn szFile into a
+ // zero-terminated directory string.
+ ch = *sz;
+ *sz = '\0';
+
+ // Set m_hszDirectory to this string.
+ err = ResetHsz(szFile, &m_hszDirectory);
+
+ // Restore szFile and return.
+ *sz = ch;
+ return err;
+}
+#pragma code_seg()
+
+
+#if 0 //Dead Code
+/***
+*PUBLIC GenericTypeLibOLE::GetLibid - return libid
+*Purpose:
+* Return the TypeLib's Libid.
+*
+*Entry:
+* pbstr - set to point to a BSTR containing the library's registered id
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::GetLibId(BSTR *pbstr)
+{
+ BSTR bstrPath;
+ TIPERROR err;
+
+ IfErrRet(GetBStrOfHsz(&m_bmData, m_hszFile, &bstrPath));
+
+ // Note that this is not the infinite recursion that it looks like.
+ // GetLibIdOfTypeLib will only call this method if the true type of
+ // the typelib is an OB implementation, which is not the case here.
+ err = GetLibIdOfTypeLib(this, bstrPath?bstrPath:WIDE(""), pbstr);
+ FreeBstr(bstrPath);
+ return err;
+}
+#pragma code_seg( )
+#endif //0
+
+#pragma code_seg(CS_INIT)
+TIPERROR
+GenericTypeLibOLE::SetLibId(LPOLESTR szLibId)
+{
+ TIPERROR err;
+
+ if(szLibId == NULL)
+ return TIPERR_None;
+ IfErrRet(CreateHsz(szLibId, &m_hszFile));
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetTypeInfoOfGuid
+*Purpose:
+* Return the TypeInfo with a specified GUID. Note that this always
+* fails in the OB version.
+*
+*Entry:
+* guid - The guid to be mapped to a typeinfo.
+* pptinfo - return parameter for TypeInfo
+*
+*Exit:
+* TIPERROR
+* Increments reference count of the TYPEINFO and ITypeLib
+***********************************************************************/
+
+HRESULT GenericTypeLibOLE::GetTypeInfoOfGuid (REFGUID guid, ITypeInfoA **pptinfo)
+{
+ UINT ite;
+
+ if (pptinfo == NULL)
+ return HresultOfScode(E_INVALIDARG);
+
+ for (ite = 0; ite < m_cTypeEntries; ite++) {
+ if (Qte(ite)->m_ste.m_guid == guid)
+ return GetTypeInfo(ite, pptinfo);
+ }
+
+ return HresultOfScode(TYPE_E_ELEMENTNOTFOUND);
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetTypeInfo
+*Purpose:
+* Return the TypeInfo of a specified TYPE_ENTRY.
+*
+*Entry:
+* hte - handle to a TYPE_ENTRY
+* pptypeinfo - return parameter for TypeInfo
+*
+*Exit:
+* HRESULT
+* Increments reference count of the ITypeInfo and ITypeLib
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+
+HRESULT GenericTypeLibOLE::GetTypeInfo(UINT hte, ITypeInfoA **pptinfo)
+{
+ TIPERROR err;
+ STL_TYPEINFO *pstltinfo;
+ IMPMGR *pimpmgr = NULL;
+
+ if (hte >= m_cTypeEntries || pptinfo == NULL)
+ return HresultOfScode(E_INVALIDARG);
+
+ if (Qte(hte)->m_pstltinfo == NULL) {
+ //load the TYPEINFO and return it
+
+ // We blindly assume that the created instance is
+ // or singly inherits STL_TYPEINFO
+ IfErrGo( CreateInstance(GetQszTypeInfoTypeId(hte),
+ (void **)&pstltinfo) );
+
+ Qte(hte)->m_pstltinfo = pstltinfo;
+
+ pstltinfo->SetContainingTypeLib(this);
+
+ pstltinfo->SetHTEntry(hte);
+
+#if ID_DEBUG
+ // Store the typeinfo's name.
+ NAMMGR *pnammgr;
+ BSTRA bstrName;
+ HLNAM hlnam = Qte(hte)->m_ste.m_hlnamType;
+
+ if (GetNamMgr(&pnammgr) == TIPERR_None && hlnam != HLNAM_Nil) {
+ if (pnammgr->BstrOfHlnam(hlnam, &bstrName) == TIPERR_None) {
+ strncpy(Qte(hte)->m_pstltinfo->m_szDebName, bstrName, DEBNAMESIZE-1);
+ m_szDebName[DEBNAMESIZE - 1] = 0;
+ FreeBstrA(bstrName);
+ }
+ }
+#endif // ID_DEBUG
+
+ IfErrGoTo(pstltinfo->Read(), Error2);
+
+ // There is no guarentee (because of dual intefaces) that
+ // the typeinfo we just loaded will be the one we return.
+ //
+ Qte(hte)->m_pstltinfo->AddRef();
+ pstltinfo->Release();
+ }
+ else {
+ Qte(hte)->m_pstltinfo->AddRef();
+ }
+
+ *pptinfo = (ITypeInfoA*) Qte(hte)->m_pstltinfo;
+
+ return NOERROR;
+
+Error2:
+ Qte(hte)->m_pstltinfo->SetContainingTypeLib(NULL);
+ Qte(hte)->m_pstltinfo = NULL;
+ // FALL THROUGH!!!
+
+Error:
+ return HresultOfTiperr(err);
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetGdtiOfItyp
+*Purpose:
+* Get the GEN_DTINFO of a typeinfo
+*
+*Entry:
+*
+*Exit:
+*
+*Errors:
+* None
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::GetGdtiOfItyp(UINT ityp, GEN_DTINFO **ppgdti)
+{
+ ITypeInfoA *ptinfo;
+ HRESULT hresult;
+
+ // Get the typeinfo for the module and then its typebind.
+ IfOleErrRetTiperr(GetTypeInfo(ityp, &ptinfo));
+
+ // Get the gdtinfo for this ole type and thence its typebind.
+ // Note that it's ok to *cast* the typeinfo to a gdtinfo
+ // since this type is contained in the current typelib
+ // and we own its implementation. Note in addition that
+ // that we can't QueryInterface to gdti since ole typeinfos
+ // don't publicly acknowledge their gdtinfo'edness.
+ //
+ *ppgdti = (GEN_DTINFO *)ptinfo;
+
+
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetTypeInfoType
+*Purpose:
+* Return the TypeInfo of a specified TYPE_ENTRY.
+*
+*Entry:
+* hte - handle to a TYPE_ENTRY
+* ptypekind - return parameter for typekind
+*
+*Exit:
+* HRESULT
+***********************************************************************/
+
+#pragma code_seg(CS_INIT)
+HRESULT GenericTypeLibOLE::GetTypeInfoType(UINT hte, TYPEKIND * ptypekind)
+{
+ if (hte >= m_cTypeEntries || ptypekind == NULL)
+ return HresultOfScode(E_INVALIDARG);
+
+ *ptypekind = (TYPEKIND)Qte(hte)->m_ste.m_typekind;
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+/***
+*TIPERROR GetCompressedTypeId - Returns a compressed typeid.
+*
+*Purpose:
+* This method is called by WriteTypeId or GetFunctionIdOfExBind to get a
+* typeinfo's typeid in the compressed typeid format. The typeinfo can be
+* any implementation of ITypeInfo and it may reside in any typelib, though
+* it must either be an OB project or registered in the system.
+*
+* The returned typeId is in a compressed a form which can only be
+* interpreted by the GetTypeInfoOfCompressedTypeId method.
+*
+*Inputs:
+* ptinfo - The typeinfo whose typeId we are writing out.
+*
+*Outputs:
+* Allocates the compressed typeid string in a BSTR assigned to *pbstrOut.
+* TIPERROR
+***************************************************************************/
+TIPERROR GenericTypeLibOLE::GetCompressedTypeId(ITypeInfoA *ptinfo, BSTR *pbstrOut)
+{
+ TIPERROR err= TIPERR_None;
+ HRESULT hresult;
+ ITypeLibA *ptlib;
+ UINT itype;
+ UINT hlib;
+ BSTR bstrOut, bstrPath, bstrLibId = NULL;
+ OLECHAR *pchEnd;
+ OLECHAR rgchTypeId[3+4+1+4+1]; // *\R<hlib>*<itype><0>
+ USHORT cbBstrLibId, cbRgchTypeId;
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+
+ // Get the ref'd typeinfo's containing typelib.
+ // Note that this doesn't allocate any memory, since the typelib
+ // must already be loaded (because the typeinfo is loaded).
+ IfOleErrRetTiperr(ptinfo->GetContainingTypeLib(&ptlib, &itype));
+
+ // If the ref'd typeinfo is in this typelib, then use
+ // the "same typelib" value for hlib when compressing the LibId.
+ // Otherwise, try some other means of compression.
+ if (ptlib == this) {
+ hlib = 0xffff;
+ }
+ else {
+ // Get the LibId of the ref'd typeinfo's typelib. This libid
+ // will contain no path if ptlib is an OLE typelib.
+ IfErrGo(GetLibIdOfTypeLib(ptlib, WIDE(""), &bstrLibId));
+
+ // Now get the path corresponding to this typelib.
+ // This is guaranteed to give us the path we need because
+ // the referenced typelib must be registered in all cases
+ // where we need the path.
+ IfErrGo(GetPathOfLibId(bstrLibId, &bstrPath));
+
+ // Replace bstrLibId with a version that has the path.
+ FreeBstr(bstrLibId);
+ bstrLibId = NULL;
+ err = GetLibIdOfTypeLib(ptlib, bstrPath, &bstrLibId);
+ FreeBstr(bstrPath);
+ if (err != TIPERR_None)
+ goto Error;
+
+ // In the OLE version, set hlib to the hlnam of bstrLibId and
+ // use that hlib for the compression.
+ IfErrGo(GetNamMgr(&pnammgr));
+#if OE_WIN32
+ LPSTR lpszLibId;
+
+ IfErrGo(TiperrOfHresult(ConvertStringToA(bstrLibId, &lpszLibId)));
+
+ err = pnammgr->HlnamOfStr(lpszLibId, &hlnam, TRUE, NULL);
+
+ ConvertStringFree(lpszLibId);
+ if (err)
+ goto Error;
+#else
+ IfErrGo(pnammgr->HlnamOfStr(bstrLibId, &hlnam, TRUE, NULL));
+#endif
+ hlib = hlnam;
+ FreeBstr(bstrLibId);
+ bstrLibId = NULL;
+ }
+
+ // If, at this point, bstrLibId is NULL, then hlib contains
+ // the ushort to use for the libId portion of the typeId.
+ // In this case, the libId portion is *\R<hex ascii of hlib>
+ // Otherwise, bstrLibId holds the uncompressed libId portion
+ // and should be used to generate the uncompressed typeId and
+ // then freed.
+
+ // Now, construct the typeId in rgchTypeId.
+ // If the typeinfo is not an STL_TYPEINFO or REC_TYPEINFO, the format is:
+ // <libId>*#<hex ascii of itype>
+ // If the typeinfo is an STL_TYPEINFO or REC_TYPEINFO, the format is:
+ // <libId>*<localTypeId>
+ // Note that we only attempt to generate the STL_TYPEINFO/REC_TYPEINFO
+ // case in the OB implementation.
+
+ pchEnd = rgchTypeId;
+
+ // If we can used the compressed libId format, then put the "<libId>*"
+ // into rgchTypeId. Otherwise, just put the "*" in.
+ if (bstrLibId == NULL) {
+ ostrcpy(pchEnd, WIDE("*\\R"));
+ oultoa(hlib, pchEnd+3, 16);
+ pchEnd = ostrchr(rgchTypeId, '\0');
+ }
+
+ *pchEnd++ = chLibIdSep;
+ *pchEnd = '\0';
+
+ // In the OLE implementation, just return the non-stltinfo format.
+ *pchEnd++ = '#';
+ oultoa(itype, pchEnd, 16);
+
+ // At this point, the full compressed typeId is obtained by concatenating
+ // bstrLibId (if not NULL) and rgchTypeId. Create it.
+ /////////////////////////////////////////////////////////////////////
+
+ // Compute the length of each portion of the typeId.
+ if (bstrLibId != NULL)
+ cbBstrLibId = ostrblen(bstrLibId);
+ else
+ cbBstrLibId = 0;
+
+ cbRgchTypeId = ostrblen(rgchTypeId);
+
+ // Allocate a buffer of the correct size.
+ bstrOut = AllocBstrLen(NULL, cbBstrLibId+cbRgchTypeId);
+ if (bstrOut == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+
+ // Copy bstrLibId, if not NULL, into bstrOut.
+ if (bstrLibId != NULL)
+ ostrcpy(bstrOut, bstrLibId);
+
+ // Copy rgchTypeId.
+ ostrcpy(bstrOut+cbBstrLibId, rgchTypeId);
+
+ *pbstrOut = bstrOut;
+
+Error:
+ FreeBstr(bstrLibId);
+ ptlib->Release();
+ return err;
+}
+
+
+/***
+*TIPERROR FindMembers - Locate all instances of the given name
+*
+*Purpose:
+* Search the project-level (type) names and modules to find all
+* instances of a given name. Place the typinfos where the name
+* was found and the name's MEMBERID into a given array, when the
+* array is filled, only increment the count of the number of
+* names found.
+*
+* If the name is found at the project level (is a type), the MEMBERID
+* is set to MEMBERID_NULL.
+*
+*Inputs:
+* szName - The name to search for.
+* lHashVal - Passed to bind.
+* pcSearch - The size of the rgptinfo and rgid arrays.
+*
+*Outputs:
+* rgptinfo - An array of typinfos where the names were found.
+* rgid - The MEMBERID of the name in the respective typeinfo.
+* pcSearch - On successful completion, contains the number of
+* names found (may be more than the size of the array).
+* Returns ...
+*
+***************************************************************************/
+TIPERROR GenericTypeLibOLE::FindMembers(LPSTR szName,
+ ULONG lHashVal,
+ ITypeInfoA **rgptinfo,
+ MEMBERID *rgmemid,
+ USHORT *pcSearch)
+{
+ UINT cArraySize;
+ UINT cNamesFound = 0;
+ UINT iName;
+ UINT uOrdinal, ityp, ctyp;
+ UINT itypFirstGlobal;
+ BOOL fMultiple;
+
+ HGNAM hgnam;
+ HLNAM hlnam;
+
+ NAMMGR *pnammgr;
+ const GENPROJ_BINDNAME_TABLE *pgbindnametbl;
+
+ USHORT ibinddesc;
+ GENPROJ_BIND_DESC projbinddesc;
+
+ ITypeInfoA *ptinfo;
+ DEFN_TYPEBIND *pdfntbindMod;
+ DYN_TYPEBIND *pdtbindMod;
+ GEN_DTINFO *pgdti;
+ EXBIND exbindMatch;
+
+ HRESULT hresult;
+ TIPERROR err = TIPERR_None;
+
+ DebAssert(rgptinfo && rgmemid && pcSearch, "Bad args");
+ DebAssert(*pcSearch, "Zero parameter");
+
+ cArraySize = *pcSearch;
+
+
+ // Get typelib's nammgr
+ IfErrRet(GetNamMgr(&pnammgr));
+
+ // Get the gptbind
+ IfErrRet(GetTypeBind());
+
+ // Get the nametable
+ pgbindnametbl = m_gptbind.Pgbindnametbl();
+ DebAssert(pgbindnametbl != NULL, "No BINDNAME_TABLE");
+
+ // Map string to hgnam and hlnam
+ IfErrRet(pnammgr->HgnamOfStr(szName, &hgnam));
+ hlnam = pnammgr->HlnamOfHgnam(hgnam);
+
+ // Check the project level names (types)
+ ibinddesc = pgbindnametbl->IndexOfHlnam(hlnam);
+
+ if (ibinddesc != BIND_INVALID_INDEX) {
+ // We have a project-level match!
+
+ // We cache all the attributes of qbinddescMatch here
+ // since it's in movable memory. To do so we simply shallow
+ // copy it to a local stack-alloced BIND_DESC.
+ //
+ projbinddesc = *(pgbindnametbl->QgpbinddescOfIndex(ibinddesc));
+
+ // Get the module or project's ordinal in its respective
+ // container collection.
+ //
+ uOrdinal = projbinddesc.Ordinal();
+
+ // We only care about a module/class match, so just
+ // ignore a referenced project match.
+ //
+ if (projbinddesc.IsTypeInfo()) {
+ // Store the typeinfo into the given arrays.
+
+ // Get the typeinfo for the module.
+ IfOleErrRetTiperr(GetTypeInfo(uOrdinal, &ptinfo));
+
+ // Add the module to the output array.
+ rgptinfo[cNamesFound] = ptinfo;
+ rgmemid[cNamesFound] = MEMBERID_NIL;
+
+ // Increment the number of names found.
+ if (++cNamesFound == cArraySize) {
+ *pcSearch = cNamesFound;
+ return TIPERR_None;
+ }
+
+ } // of if module/class
+ } // of found project-level match
+
+ // If the ityp stored in the name manager is not valid, we
+ // don't have any more instances of the name and may return.
+ //
+ if (!pnammgr->IsValidItyp(hlnam)) {
+ *pcSearch = cNamesFound;
+ return TIPERR_None;
+ }
+
+ fMultiple = pnammgr->IsMultiple(hlnam);
+
+ // Get the ityp from the name manager, which represents the first
+ // instance of the name in the TypeLib.
+ //
+ itypFirstGlobal = pnammgr->ItypOfHlnam(hlnam);
+
+
+ // If IsMultiple is set, check the name cache and bind. If not,
+ // bind anyway. If more names are required, move on to the next
+ // TypeInfo and try again.
+ // Note: the following loop wraps around from itypFirstGlobal back again
+ // if need be...
+ //
+ BOOL fFirst = TRUE;
+ for (ctyp = GetTypeInfoCount(), ityp = itypFirstGlobal;
+ fFirst || ityp != itypFirstGlobal;
+ fFirst = FALSE, ityp = (ityp + 1) % ctyp)
+
+ { // start of FOR loop
+
+#if ID_DEBUG
+ if (fMultiple) {
+ // Keeps name cache stats
+ DebSetNameCacheModTrys();
+ }
+#endif // ID_DEBUG
+
+ DebSetNameCacheModTrys();
+
+ // Check the name cache
+ if (!fMultiple ||
+ !IsValidNameCache(ityp) ||
+ IsNameInCache(ityp, hgnam)) {
+
+#if ID_DEBUG
+ if (fMultiple) {
+ // Keeps name cache stats
+ DebSetNameCacheModHits();
+ }
+#endif // ID_DEBUG
+
+ // We hit the name cache, so try to bind to the name.
+ // So we start by loading the GEN_DTINFO..
+ // Don't forget to Release eventually.
+ //
+ IfErrGo(GetGdtiOfItyp(ityp, &pgdti));
+
+ // This doesn't bump refcount.
+ IfErrGoTo(pgdti->PdfntbindSemiDeclared(&pdfntbindMod), Error2);
+
+ pdtbindMod =
+ (DYN_TYPEBIND *)pdfntbindMod->QueryProtocol(DYN_TYPEBIND::szProtocolName);
+ DebAssert(pdtbindMod != NULL, "bad DYN_TYPEBIND.");
+
+ // We should reach here with non-NULL pdtbindMod.
+ // It will be for a standard module, a Class
+ // or a CoClass
+ //
+ DebAssert(pdtbindMod != NULL, "should have dtbind.");
+
+ // Try and bind in this module. We don't want to attempt
+ // to bind to a type because OLE projects don't have nested
+ // types and OB nested types are uninteresting.
+ //
+ IfErrGoTo(pdtbindMod->BindIdDefn(FALSE,
+ hgnam,
+ 0, // first match
+ ACCESS_Private,
+ &exbindMatch),
+ Error2);
+
+ // Check the results to see if we actually bound.
+ if (exbindMatch.IsOneVarMatch() || exbindMatch.IsFuncMatch()) {
+ DebAssert(cNamesFound < cArraySize, "Bad array index");
+
+ // Add the module to the output array.
+ rgptinfo[cNamesFound] = exbindMatch.Ptinfo();
+ rgptinfo[cNamesFound]->AddRef();
+
+ if (exbindMatch.IsOneVarMatch()) {
+ VAR_DEFN *qvdefn;
+
+ qvdefn = exbindMatch.Ptdata()->
+ QvdefnOfHvdefn(exbindMatch.Hvdefn());
+
+ DebAssert(qvdefn->IsMemberVarDefn(), "bad defn");
+ rgmemid[cNamesFound] = ((MBR_VAR_DEFN *)qvdefn)->Hmember();
+ }
+ else {
+ // Func defn
+ FUNC_DEFN *qfdefn;
+ qfdefn = exbindMatch.Ptdata()->
+ QfdefnOfHfdefn(exbindMatch.Hfdefn());
+
+ rgmemid[cNamesFound] = qfdefn->Hmember();
+ }
+
+ // Check the ptinfo/memid pair we just found against
+ // all of the others in the output arrays. If there is
+ // a duplicate, remove it.
+ //
+ // This search winds up being an O(n^2) operation, but the
+ // size of the array passed into FindName are usually small
+ // so it probably isn't worth doing something to speed
+ // this up.
+ //
+ ptinfo = rgptinfo[cNamesFound];
+ for (iName = 0; iName < cNamesFound; iName++) {
+ if (rgptinfo[iName] == ptinfo
+ && rgmemid[iName] == rgmemid[cNamesFound]) {
+
+ // Release the typeinfo, decrement the count of names
+ // found so it will still be correct when it is incremented
+ // below.
+ //
+ ptinfo->Release();
+ cNamesFound--;
+ break;
+ }
+ }
+
+ // Increment the number of names found. Stop if either
+ // we found all of the names the user wants OR if
+ // IsMultiple is not set.
+ //
+ if (++cNamesFound == cArraySize || !fMultiple) {
+ *pcSearch = cNamesFound;
+ goto Error3;
+ }
+ } // match
+
+ if (!exbindMatch.IsNoMatch()) {
+ exbindMatch.Ptinfo()->Release();
+ }
+ new (&exbindMatch) EXBIND; // re-init for next time through loop
+
+ // Move on to the next TypInfo
+ RELEASE(pgdti);
+ } // name cache hit
+ } // for
+
+ *pcSearch = cNamesFound;
+
+ return TIPERR_None;
+
+Error3:
+ if (exbindMatch.Ptinfo())
+ exbindMatch.Ptinfo()->Release();
+
+ // Fall through
+
+Error2:
+ RELEASE(pgdti);
+
+ // Fall through
+Error:
+ // Release whatever we have found if we're in error
+ if (err != TIPERR_None) {
+ for (ityp = 0; ityp < cNamesFound; ityp++) {
+ rgptinfo[ityp]->Release();
+ }
+ }
+
+ return err;
+}
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*TIPERROR WriteTypeId - Writes out a compressed typeid for the import manager.
+*
+*Purpose:
+* This method is called by the import manager when it wants to write out
+* the typeid of a typeinfo referenced by the import manager. The typeinfo
+* can be any implementation of ITypeInfo and it may reside in any typelib,
+* though it must either be an OB project or registered in the system.
+* It writes out the typeId in a compressed a form which can only be
+* interpreted by the GetTypeInfoOfCompressedTypeId method.
+*
+* Note that this method allocates memory and so can fail in low memory
+* situations. It is the import manager's responsibility to succeed in
+* its write despite this failure.
+*
+*Inputs:
+* pstrm - The stream to which the typeId should be written.
+* ptinfo - The typeinfo whose typeId we are writing out.
+*
+*Outputs:
+* TIPERROR
+***************************************************************************/
+TIPERROR GenericTypeLibOLE::WriteTypeId(STREAM *pstrm, ITypeInfoA *ptinfo)
+{
+ TIPERROR err;
+ BSTRA bstr;
+ USHORT cb;
+
+ IfErrRet(GetCompressedTypeId(ptinfo, (BSTR *)&bstr));
+
+#if OE_WIN32
+ // Read and write ANSI strings
+
+ IfErrRet(TiperrOfHresult(ConvertBstrToAInPlace(&bstr)));
+#endif
+
+ cb = (USHORT)xstrblen(bstr);
+ IfErrGo(pstrm->WriteUShort(cb));
+ err = pstrm->Write(bstr, cb);
+
+Error:
+ FreeBstrA(bstr);
+ return err;
+}
+#pragma code_seg()
+
+/***
+*TIPERROR TypeInfoFromCompressedTypeId - Loads a typeinfo, given a compressed typeid.
+*
+*Purpose:
+* This method is called by the import manager and funcId dereferencers
+* to map a compressed typeid to the specified typeinfo. This method,
+* despite its name, can also handle a normal typeId. It defers to the
+* typemgr to perform the dereference if the typeid is not in the compressed
+* (*\R) format.
+*
+*Inputs:
+* szTypeId - The typeid to map to a typeinfo.
+*
+*Outputs:
+* TIPERROR
+***************************************************************************/
+TIPERROR GenericTypeLibOLE::TypeInfoFromCompressedTypeId(LPOLESTR szTypeId, ITypeInfoA **pptinfo)
+{
+ WORD hlib, itype;
+ TIPERROR err;
+ ITypeLibA *ptlib;
+
+ // If the typeId is not a compressed typeId form, just defer to
+ // GetTypeInfoOfTypeId.
+ if (GetLibIdKind(szTypeId) != LIBIDKIND_Compressed) {
+ return GetTypeInfoOfTypeId(szTypeId, pptinfo);
+ }
+
+ // Otherwise, decode the compressed format.
+ /////////////////////////////////////////////////
+
+ szTypeId += 3;
+
+ // Get the hlib from the libId.
+ hlib = (WORD)ostrtoul(szTypeId, &szTypeId, 16);
+ if (szTypeId[0] != chLibIdSep)
+ return TIPERR_BadTypeId;
+
+ // If the typeId is a numeric index, decode it into itype
+ // and set szTypeId to NULL to indicate we are using an index.
+ if (szTypeId[1] == '#') {
+ itype = (WORD)ostrtoul(szTypeId+2, NULL, 16);
+ szTypeId = NULL;
+ }
+
+ // Otherwise, point szTypeId at the local typeId we'll use.
+ // In the non-OLE case, this can't happen, so return an error
+ // about the corrupted typeId.
+ else {
+ return TIPERR_BadTypeId;
+ }
+
+ // If hlib is 0xffff, then the desired typeinfo is contained within
+ // this typelib. In this case, addref this typelib so we can safely
+ // release it at the end.
+ if (hlib == 0xffff) {
+ AddRef();
+ ptlib = this;
+ }
+
+ // Otherwise, the exact meaning of hlib depends on whether this is
+ // the OB or OLE implementation of GenericTypeLibOLE.
+ else {
+ BSTR bstr;
+ NAMMGR *pnammgr;
+
+ // hlib is an hlnam in this typelib's local name manager.
+ // Map it to a true LibId and load the typelib from that.
+ IfErrRet(GetNamMgr(&pnammgr));
+ IfErrRet(pnammgr->BstrWOfHlnam(hlib, &bstr));
+
+ err = GetRegLibOfLibId(bstr, &ptlib);
+
+ FreeBstr(bstr);
+ if (err != TIPERR_None)
+ return err;
+ }
+
+ // ptlib now points at the typelib containing the desired typeinfo.
+ // Get the (itype)th typeinfo within that typelib.
+ DebAssert(szTypeId == NULL, "TypeInfoFromCompressedTypeId: szTypeId not NULL");
+ err = TiperrOfHresult(ptlib->GetTypeInfo(itype, pptinfo));
+
+ // Finally, release the typelib containing the typeinfo.
+ ptlib->Release();
+
+ return err;
+}
+
+
+/***
+*PROTECTED GenericTypeLibOLE::AddTypeEntry
+*Purpose:
+* Add a type entry of the specified name for the specified kind of
+* typeinfo to this typelib.
+*
+*Entry:
+* szName - The name.
+* szTypeInfoTypeId - The typeId of the truetype of the typeinfo.
+*
+*Exit:
+* *phte is set to the index of the new type entry.
+* TIPERROR
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+TIPERROR GenericTypeLibOLE::AddTypeEntry(LPSTR szName, LPOLESTR szTypeInfoTypeId, HTENTRY *phte)
+{
+ LPOLESTR qszLocalTypeId;
+ UINT ihteBucket;
+ HTENTRY hte;
+ TYPE_ENTRY *qte;
+ TIPERROR err;
+ USHORT usTemp;
+ HCHUNK hchunkTypeId, hsz;
+ NAMMGR *pnammgr;
+ HGNAM hgnam;
+ HLNAM hlnam;
+
+ // Generate an error if the name being added is not new or if the
+ // returned error is not one of TIPERR_ModuleNotFound and
+ // TIPERR_ElementNotFound.
+ //
+ err = GetIndexOfName(szName, &usTemp);
+
+ if (err == TIPERR_None) {
+ err = TIPERR_ModNameConflict;
+ goto Done;
+ }
+ else if (err != TIPERR_ElementNotFound) {
+ goto Done;
+ }
+
+
+ // Create a local typeId (it'll just be a timestamp).
+ IfErrRet( MakeLocalTypeId(&hchunkTypeId) );
+ qszLocalTypeId = QszOfHsz(hchunkTypeId);
+
+ ihteBucket = IhteHash(qszLocalTypeId);
+
+#if ID_DEBUG
+ // Search in the bucket list for an entry with a matching local TypeId.
+ // Return an error if one is found.
+
+ hte = m_rghteBucket[ihteBucket];
+ for (;;) {
+
+ // If the end of the bucket list is reached ...
+ if (hte == HTENTRY_Nil) {
+ break;
+ }
+
+ qte = Qte(hte);
+
+ // This entry in the bucket list matches ...
+ if (!ostrcmp(QszOfHsz(qte->m_ste.m_hszLocalTypeId), qszLocalTypeId)) {
+ DebAssert(0, "Timestamped localtypeid conflicted with existing typeid");
+ }
+
+ hte = qte->m_hteNext;
+ } // end for-ever
+#endif // ID_DEBUG
+
+ // Set the directory's modified flag to TRUE.
+ IfErrGoTo(SetModified(TRUE), ReleaseChunk);
+ m_fDirModified = TRUE;
+
+ // Allocate a new entry and link it to the front of the list
+ if (err = m_bdte.Realloc(m_bdte.CbSize() + sizeof(TYPE_ENTRY)) )
+ goto ReleaseChunk;
+
+ hte = m_cTypeEntries++;
+
+ qte = Qte(hte);
+ ::new (qte) TYPE_ENTRY;
+
+ // initialize the fields of the type element
+ qte->m_ste.m_hszLocalTypeId = hchunkTypeId;
+ qte->m_hteNext = m_rghteBucket[ihteBucket];
+ m_rghteBucket[ihteBucket] = hte;
+
+ // Get the nammgr
+ IfErrGoTo(GetNamMgr(&pnammgr), DeleteEntry);
+
+ // Get the Hlnam for the type's name and cache the hlnam.
+ // The last "TRUE" in the param list means that the case of the
+ // name should not be changed. (This sets the "sticky" bit.)
+ //
+ IfErrGoTo(pnammgr->HlnamOfStr(szName, &hlnam, FALSE,
+ NULL, TRUE), DeleteEntry);
+
+ Qte(hte)->m_ste.m_hlnamType = hlnam;
+
+ // If TypeId of TypeInfo is not the default TypeId then set the
+ // TYPEENTRY's TypeInfo's TypeId.
+ if (ostrcmp(szTypeInfoTypeId, GetQszTypeInfoTypeId(hte)) != 0) {
+ if (err = CreateHsz(szTypeInfoTypeId, &hsz))
+ goto DeleteEntry;
+
+ Qte(hte)->m_ste.m_hszTypeInfoTypeId = hsz;
+ }
+
+ // Create an entry in any event for this (possibly new) name
+ // in the nammgr
+ // so that other functions that optimize lookup/binding
+ // by first searching the nametable won't prematurely fail.
+ // The problem is that only once the binder has done its thing
+ // will this name necessarily be in the name table.
+ //
+ IfErrGoTo(pnammgr->HgnamOfStr(szName, &hgnam), DeleteEntry);
+
+
+ // Grow namcache array if there is one...
+ if (m_bdRgnamcache.IsValid()) {
+ IfErrGoTo(m_bdRgnamcache.Realloc(
+ m_bdRgnamcache.CbSize() + sizeof(NAME_CACHE)),
+ DeleteEntry);
+
+ // Invalidate the new cache entry, we haven't incremented
+ // m_cTypeEntries yet. Acutally, this assertion isn't too
+ // useful as we set this value above.
+ //
+ DebAssert(hte + 1 == m_cTypeEntries, "bad type index.");
+
+ InvalidateNameCache(hte);
+ // WARNING: currently no errors can occur after this, thus there
+ // is no need for any shrink cleanup code.
+ }
+
+ *phte = hte;
+
+ err = TIPERR_None;
+ goto Done;
+
+DeleteEntry:
+ // Delete the type entry, this removes the qte from the
+ // bucket list and decrements m_cTypeEntry.
+ //
+ GenericTypeLibOLE::UnAddTypeEntry(hte);
+
+ goto Done;
+
+ReleaseChunk:
+ m_bmData.FreeChunk(hchunkTypeId, CCH_TIMESTAMP_LENGTH*sizeof(OLECHAR));
+
+Done:
+ return err;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PROTECTED GenericTypeLibOLE::UnAddTypeEntry
+*Purpose:
+* Performs error-recovery cleanup if an error occurred between a
+* call to AddTypeEntry and when the corresponding typeinfo was actually
+* made available to the typelib.
+*
+*Entry:
+* hte - The index of the typeentry to be removed. This must be the
+* element most recently added by AddTypeEntry.
+*
+***********************************************************************/
+void GenericTypeLibOLE::UnAddTypeEntry(UINT hte)
+{
+ UINT ihteBucket;
+
+ // The element is assumed to be at the front of a bucket list.
+ // Find it and unlink the element from the bucket list.
+ for (ihteBucket = 0;
+ ihteBucket < GTLIBOLE_cBuckets && m_rghteBucket[ihteBucket] != hte;
+ ihteBucket++);
+ m_rghteBucket[ihteBucket] = Qte(hte)->m_hteNext;
+
+ GenericTypeLibOLE::DestructTypeEntry(hte);
+ m_bdte.Realloc(m_bdte.CbSize() - sizeof(TYPE_ENTRY));
+ m_cTypeEntries--;
+}
+#pragma code_seg()
+
+
+
+/***
+*PROTECTED GenericTypeLibOLE::CreateInstance
+*Purpose:
+* This function creates an instance creates a TypeInfo instances
+* given the TYPEID for the TypeInfo.
+* For now just hard code the TYPEIDs that can be
+* be stored in the ITypeLib. Eventually we will call
+* the CreateInstance function which uses the registry.
+* When this is eliminated delete includes for btinfo.
+* This function is virtual so GEN_PROJECT can override it and
+* allow construction of BASIC and MACRO TYPEINFOs.
+* Disallowing them here avoids the need to link with ic.lib.
+*
+*Entry:
+* szTypeId - TypeId of TypeInfo to be created
+* ppvoid - returns pointer to the created instance
+*
+*Exit:
+* TIPERROR
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::CreateInstance(LPOLESTR szTypeId, void **ppvoid)
+{
+ TIPERROR err;
+
+ if (ostrcmp(szTypeId, GEN_DTINFO::szProtocolName) == 0) {
+ IfErrRet( GEN_DTINFO::Create((GEN_DTINFO **)ppvoid) );
+ }
+ else
+ DebHalt("GenericTypeLibOLE::CreateInstance: unexpected TYPEID");
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PROTECTED GenericTypeLibOLE::IhteHash - hash function
+*Purpose:
+* Map LocalTypeId to index into the bucket table.
+*
+*Entry:
+* TypeId - class id to be mapped to a bucket number
+* Only that part of the string preceeding the minor version
+* number separator is used in computing the hash value.
+*
+*Exit:
+* ihtype - index into bucket array
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+UINT GenericTypeLibOLE::IhteHash(TYPEID LocalTypeId)
+{
+ return HashSzTerm(LocalTypeId, chMinorVerNumSep) % GTLIBOLE_cBuckets;
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetTypeBind
+*Purpose:
+* Build bindnametable for proj.
+*
+*Entry:
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::GetTypeBind()
+{
+ STREAM *pstrm;
+ NAMMGR *pnammgr;
+ TIPERROR err;
+
+ // Ensure nammgr has been deserialized.
+ IfErrRet(GetNamMgr(&pnammgr));
+
+ // Test if gptbind has been serialized ever or if it has
+ // already been deserialized, if not, no gptbind to read.
+ //
+ if ((m_fGptbindDeserialized == FALSE) && (m_lPosGptbind != -1)) {
+
+ IfErrRet(OpenTypeStream((UINT)-1, SOM_Read, &pstrm));
+
+ // No need to init the gptbind. It is embedded and thus
+ // is constructed at container construction time, in addition
+ // is inited at container's init time.
+ // And seek to where the gptbind should be.
+ //
+ IfErrGo(pstrm->SetPos(m_lPosGptbind));
+ IfErrGo(m_gptbind.Read(pstrm));
+ m_fGptbindDeserialized = TRUE;
+
+ // At this point stream position is exactly at start
+ // of the NAME_CACHE array, cache the stream position
+ // and use it later...
+ //
+ IfErrGo(pstrm->GetPos(&m_lPosRgnamcache));
+
+ // Close the stream
+ pstrm->Release();
+
+ // Read in the name cache as well since the binder uses the
+ // namecache as an optimization. Note that if this didn't
+ // happen here, the binder would still work correctly albeit
+ // more slowly.
+ //
+ IfErrRet(ReadNameCacheArray());
+ }
+
+ return TIPERR_None;
+
+Error:
+ // Close the stream
+ pstrm->Release();
+ return err;
+}
+#pragma code_seg( )
+
+
+
+
+
+
+/***
+*PROTECTED GenericTypeLibOLE::GetBinddescOfSzName
+*
+*Inputs:
+* szName The name of a module or ref'd lib to be bound to (IN).
+* Note: must be unqualifed --
+* call GetRgbstrOfSzName to parse.
+* pbinddesc Produced BIND_DESC for name (OUT).
+* Caller allocated!!
+*
+*Outputs:
+* TIPERR_ELementNotFound if not found.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::GetBinddescOfSzName(LPSTR szName,
+ GENPROJ_BIND_DESC *pprojbinddesc)
+{
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+ BOOL fChanged;
+ USHORT ibinddesc;
+ TIPERROR err = TIPERR_None;
+
+ DebAssert(pprojbinddesc != NULL, "null param.");
+
+ // Get the typelib-level nammgr
+ IfErrRet(GetNamMgr(&pnammgr));
+
+ // NOTE: can't optimize this lookup by testing for name's
+ // presence in nammgr before using the binder cos there's
+ // no certainty that name has been entered into nammgr yet.
+ // If it hasn't the binder will create the entry.
+ //
+ // Look for the name in the project-level binder.
+ IfErrRet(pnammgr->HlnamOfStr(szName, &hlnam, FALSE, &fChanged));
+ IfErrRet(GetTypeBind());
+
+ ibinddesc =m_gptbind.Pgbindnametbl()->IndexOfHlnam(hlnam);
+ if (ibinddesc != BIND_INVALID_INDEX) {
+ // Setup output param -- must copy since can't return pointer
+ // to movable memory.
+ //
+ *pprojbinddesc = *(m_gptbind.Pgbindnametbl()->
+ QgpbinddescOfIndex(ibinddesc));
+
+ return TIPERR_None;
+ }
+ return TIPERR_ElementNotFound;
+}
+#pragma code_seg( )
+
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetIndexOfName
+*Purpose:
+* Return the Hte of the TYPEENTRY containing the specified name.
+*
+*Entry:
+* szName - name to search for
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::GetIndexOfName(LPSTR szName, WORD *pw)
+{
+ GENPROJ_BIND_DESC binddesc;
+ TIPERROR err;
+
+ err = GetBinddescOfSzName(szName, &binddesc);
+
+
+ if (err != TIPERR_None) {
+ return err;
+ }
+
+ // Make sure we have a module (and not e.g. a ref'ed typelib/proj)
+ if (binddesc.IsTypeInfo()) {
+ *pw = (WORD)binddesc.Ordinal();
+ return TIPERR_None;
+ }
+ else {
+ return TIPERR_ElementNotFound;
+ }
+}
+#pragma code_seg( )
+
+
+
+
+
+/***
+*PROTECTED GenericTypeLibOLE::GetStorage - Get the IStorage for this typelib
+*Purpose:
+* Open or create the IStorage for this typelib, given the current
+* LibId.
+*
+*Entry:
+* stgm - The mode in which the IStorage should be opened.
+*
+*Exit:
+* If ppstg is NULL, then m_pstg is set to the desired IStorage, and
+* m_pstgContainer is set to its container storage if there is one (or
+* NULL if not).
+*
+* If ppstg is not NULL, the *ppstg is set to the desired storage and
+* there must not be a container storage.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::GetStorage(DWORD stgm, IStorageA **ppstg)
+{
+
+ // If compiling for typelib.dll, the IStorage is guaranteed to
+ // be a stand-alone docfile or dll-embedded docfile. Open it.
+ HRESULT hresult;
+ IStorageA *pstg;
+#if !OE_MACPPC
+ IStorageA *pstgSub;
+ GUID guid;
+#endif // OE_MACPPC
+ ILockBytesA *plockbytes;
+
+ m_bmData.Lock();
+
+ if (stgm & STGM_CREATE) {
+ IfOleErrGo(OpenFileLockBytes(TRUE, QszLibIdOrFile(), &plockbytes));
+ hresult = GTLibStorage::Create(plockbytes, m_cTypeEntries+2, &pstg);
+ plockbytes->Release();
+ if (hresult != NOERROR)
+ goto Error;
+ }
+ else {
+ // first try to open this as a stand-alone type library. Reasons
+ // for doing this first instead of the DLL lookup are:
+ // (a) More likely to be stand-alone file than embedded as a resource,
+ // so it will require less disk hits.
+ // (b) LoadLibrary has an annoying habbit of sometimes putting up
+ // a dialog if it can't find the file.
+ // (c) We are better able to control the search semantics by not
+ // even attempting to load the file as a DLL if can't load it
+ // as a standard file.
+ // (d) LoadLibary prints a (benign) message that it failed when
+ // running under debug Windows.
+ hresult = OpenFileLockBytes(FALSE, QszLibIdOrFile(), &plockbytes);
+ if (hresult == NOERROR) {
+ // only continue if we found the file & were able to open it ok.
+ // now check the signature, etc, to see if it's really a stand-alone
+ // type libary. In the case of trying to load a DLL/EXE, this check
+ // will fail.
+ hresult = GTLibStorage::OpenForReadOnly(plockbytes, &pstg);
+ plockbytes->Release();
+#if 0
+#if !OE_MAC
+ if (hresult != NOERROR) {
+ // most likely failed the signature check -- try it again as a DLL
+
+ // Ignore the error code if attempt to load it as a DLL fails, since
+ // DLL load errors are somewhat bogus. We're better off reporting
+ // the signature check error (TYPE_E_INVDATAREAD) that we got above.
+ if (DllResourceLockBytes::Open(QszLibIdOrFile(), &plockbytes) != NOERROR) {
+ goto Error;
+ }
+ hresult = GTLibStorage::OpenForReadOnly(plockbytes, &pstg);
+ plockbytes->Release();
+ }
+#endif
+#endif //!OE_MAC
+ }
+
+ if (hresult != NOERROR)
+ goto Error;
+
+// UNDONE: PPC: [jimcool]: Temp, remove Docfile dependency (1-29-94)
+#if !OE_MACPPC
+ // If we did successfully open the docfile, check the GUID of the
+ // object stored in it.
+
+ hresult = ReadClassStg(pstg, &guid);
+ if (hresult != NOERROR)
+ goto Error2;
+
+ // If the object stored in the docfile is not a typelib, look for
+ // a substorage named '\6TYPELIB'.
+ if (guid != CLSID_GenericTypeLibOLE) {
+ hresult = pstg->OpenStorage(OLESTR("\006TypeLib"),
+ NULL, stgm, NULL, 0L, &pstgSub);
+ if (hresult != NOERROR)
+ goto Error2;
+
+ // If we found a \6TypeLib substorage, verify it contains a typelib.
+ hresult = ReadClassStg(pstg, &guid);
+ if (hresult != NOERROR) {
+ pstgSub->Release();
+ goto Error2;
+ }
+ DebAssert(guid == CLSID_GenericTypeLibOLE, "");
+
+ // If the substorage contains a typelib, store the docfile IStorage
+ // away so we can close it later.
+ m_pstgContainer = pstg;
+ pstg = pstgSub;
+
+ DebAssert(ppstg == NULL, "GetStorage");
+ }
+#endif // OE_MACPPC
+ }
+
+ m_bmData.Unlock();
+ if (ppstg == NULL)
+ m_pstg = pstg;
+ else
+ *ppstg = pstg;
+ return TiperrOfHresult(hresult);
+
+#if !OE_MACPPC
+Error2:
+#endif // OE_MACPPC
+ pstg->Release();
+
+Error:
+ m_bmData.Unlock();
+ return TiperrOfHresult(hresult);
+
+}
+#pragma code_seg()
+
+
+/***
+*PROTECTED GenericTypeLibOLE::Read - read GenericTypeLibOLE directory
+*Purpose:
+* Deserialize the directory.
+* Note that this function just opens the directory stream and
+* calls the (possibly overridden) function Read(STREAM).
+*
+*Entry:
+* none
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::Read()
+{
+ STREAM *pstrm;
+ TIPERROR err;
+
+ BOOL wasStgOpen = (m_pstg != NULL);
+
+ IfErrRet(OpenTypeStream((UINT)-1, SOM_Read, &pstrm));
+ err = Read(pstrm);
+
+ // In ole build only, if this call to read actually opened the
+ // typelib's file, make sure the file isn't closed until the typelib
+ // itself is actually released.
+ if (!wasStgOpen)
+ m_pstg->AddRef();
+
+ pstrm->Release();
+
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PROTECTED GenericTypeLibOLE::ReadNameCacheArray - read in NAME_CACHE array.
+*Purpose:
+* Deserialize the NAME_CACHE is there is one.
+*
+*Entry:
+* none
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::ReadNameCacheArray()
+{
+ STREAM *pstrm;
+ USHORT hasValidDiskImageNameCache;
+ TIPERROR err;
+
+ // Test if library has been deserialized --
+ // if not, no cache to read.
+ //
+ if (m_lPosRgnamcache == -1)
+ return TIPERR_None;
+
+ // Otherwise open the stream.
+ IfErrRet(OpenTypeStream((UINT)-1, SOM_Read, &pstrm));
+
+ // And seek to where the namcache should be.
+ IfErrGoTo(pstrm->SetPos(m_lPosRgnamcache), Error2);
+
+ // First determine if there is in fact a serialized NAME_CACHE.
+ IfErrGoTo(pstrm->Read(&hasValidDiskImageNameCache,
+ sizeof(hasValidDiskImageNameCache)),
+ Error2);
+ m_hasValidDiskImageNameCache = (USHORT)hasValidDiskImageNameCache;
+
+ // Then read it in... if there is one.
+ if (m_hasValidDiskImageNameCache) {
+ if (!m_bdRgnamcache.IsValid()) {
+ IfErrGoTo(m_bdRgnamcache.Init(Psheapmgr(), 0), Error2);
+ }
+ IfErrGoTo(m_bdRgnamcache.Read(pstrm), Error3);;
+ }
+
+ pstrm->Release();
+ return TIPERR_None;
+
+Error3:
+ m_bdRgnamcache.Free();
+ // fall through...
+
+Error2:
+ pstrm->Release();
+ return err;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GenericTypeLibOLE::AddNameToCache
+*Purpose:
+* Adds given name to a given cache.
+* If not loaded, loads and validates the NAME_CACHE array.
+* Updates both given type's cache and project's cache.
+*
+*Entry:
+* inamcache index of TYPEINFO in library + 1 (IN)
+* hgnam Global name handle to add (IN).
+*
+*Exit:
+* TIPERROR
+* Updated NAME_CACHE array.
+*
+***********************************************************************/
+TIPERROR GenericTypeLibOLE::AddNameToCache(UINT inamcache, HGNAM hgnam)
+{
+ TIPERROR err;
+
+ DebAssert(inamcache < m_cTypeEntries, "bad type index.");
+
+ IfErrRet(LoadNameCache());
+
+ // add name to type's cache
+ Rgnamcache()[inamcache].AddNameToCache(hgnam);
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::LoadNameCache
+*Purpose:
+* Loads/Inits namecache array by either deserializing or
+* creating a new one.
+* If not loaded, loads and validates the NAME_CACHE array.
+*
+*Entry:
+*
+*Exit:
+* TIPERROR
+* Updated NAME_CACHE array.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::LoadNameCache()
+{
+ UINT inamcacheCur;
+ BOOL hasLibChanged = FALSE;
+ TIPERROR err = TIPERR_None;
+
+ // If it hasn't been loaded or created yet...
+ if (m_bdRgnamcache.IsValid() == FALSE) {
+
+ // Then load in a serialized cache if there is one...
+ // This might create a valid cache in memory.
+ //
+ IfErrRet(ReadNameCacheArray());
+
+ if (m_bdRgnamcache.IsValid()) {
+ hasLibChanged = (m_bdRgnamcache.CbSize()/sizeof(NAME_CACHE)
+ != (USHORT)m_cTypeEntries);
+
+ if (hasLibChanged) {
+ // If the lib has changed since the cache was serialized
+ // then free it... it'll be initialized later as if there never
+ // was a cache.
+ //
+ m_bdRgnamcache.Free();
+ }
+ }
+
+ if (!m_bdRgnamcache.IsValid() || hasLibChanged) {
+ // If the lib has changed or there is no valid cache,
+ // then create a new initialized cache:
+ // one for each type and one for the project.
+ //
+ IfErrGo(m_bdRgnamcache.Init(Psheapmgr(),
+ m_cTypeEntries * sizeof(NAME_CACHE)));
+
+ // Iterate over the the array, invalidating the caches.
+ // NOTE: Invalidating a cache sets all its bits to zero
+ // and its state to invalid. It is still ok
+ // to set a bit in an invalid cache, the cache
+ // becomes valid if and when the last bit is set:
+ // For types this happens when the last name
+ // has been added to its binding table
+ // i.e. in DYN_TYPEMEMBERS::BuildBindNameTable().
+ // For the project this happens iff all of its
+ // type's caches are valid. This is detected
+ // likewise in DYN_TYPEMEMBERS::BuildBindNameTable().
+ // The point is that the validity of the cache
+ // only determines whether it can be relied upon
+ // for binding purposes.
+ //
+ for (inamcacheCur = 0;
+ inamcacheCur < m_cTypeEntries;
+ inamcacheCur++) {
+ // Treat array as namecache array.
+ // CONSIDER: using placement syntax to explicitly
+ // construct NAME_CACHEs -- ctor Invalidate()'s cache.
+ //
+ Rgnamcache()[inamcacheCur].Invalidate();
+ }
+ }
+ }
+ // else there's a loaded name cache array
+ // so just use it...
+ //
+ DebAssert(m_bdRgnamcache.IsValid(), "bad cache.");
+ DebAssert(m_bdRgnamcache.CbSize() % sizeof(NAME_CACHE) == 0,
+ "bad cache.");
+ DebAssert(m_bdRgnamcache.CbSize()/sizeof(NAME_CACHE) == (USHORT)m_cTypeEntries,
+ "bad cache.");
+
+ // fall through...
+
+Error:
+ return err;
+}
+#pragma code_seg( )
+
+
+/***
+*PROTECTED GenericTypeLibOLE::ReadString - read a string into m_bmData
+*Purpose:
+* Read in a word-length-prefixed string and allocate it in the data
+* block manager. If the 2-byte length is 0xffff, then don't even
+* allocate a zero-length string. Instead, just set *phsz to HCHUNK_Nil.
+*
+*Entry:
+* pstrm - The stream from which to read the string.
+*
+*Exit:
+* *phsz is set to refer to the allocated string in the block manager.
+*
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::ReadString(STREAM *pstrm, HCHUNK *phsz)
+{
+ XSZ sz;
+ USHORT cb;
+ HCHUNK hsz;
+ TIPERROR err;
+
+ IfErrRet(pstrm->Read(&cb, sizeof(USHORT)));
+#if HP_BIGENDIAN
+ cb = SwapShort(cb);
+#endif
+
+ // If the length is ~0, just set *phsz to HCHUNK_Nil and return.
+ if (cb == (USHORT)~0) {
+ *phsz = HCHUNK_Nil;
+ return TIPERR_None;
+ }
+
+#if OE_WIN32
+ int cchUnicode;
+ LPOLESTR lpwstr = NULL;
+
+ // Translate Ansi strings to Unicode on-the-fly
+ sz = (XSZ)MemAlloc(cb+sizeof(XCHAR));
+ if (sz == NULL)
+ return TIPERR_OutOfMemory;
+
+ IfErrGo(pstrm->Read(sz, cb));
+ sz[cb++] = '\0'; // add the null-terminator
+
+ cchUnicode = MultiByteToWideChar(CP_ACP, 0, sz, cb, NULL, 0);
+ if (cchUnicode == 0)
+ return TIPERR_OutOfMemory;
+
+ IfErrGo(m_bmData.AllocChunk(&hsz, cchUnicode*sizeof(OLECHAR)));
+
+ m_bmData.Lock();
+ lpwstr = (LPOLESTR)QtrOfHChunk(hsz);
+ cchUnicode = MultiByteToWideChar(CP_ACP, 0, sz, cb, lpwstr, cchUnicode);
+ *phsz = hsz;
+ err = TIPERR_None;
+
+Error:
+ m_bmData.Unlock();
+ MemFree(sz);
+
+#else
+ // Allocate enough space for a zero-terminated string of that length.
+ IfErrRet(m_bmData.AllocChunk(&hsz, cb + sizeof(XCHAR)));
+
+ m_bmData.Lock();
+ sz = (XSZ)QtrOfHChunk(hsz);
+ IfErrGo(pstrm->Read(sz, cb));
+ sz[cb] = 0;
+ *phsz = hsz;
+ err = TIPERR_None;
+
+Error:;
+ m_bmData.Unlock();
+#endif
+
+ return err;
+}
+#pragma code_seg()
+
+/***
+*PROTECTED GenericTypeLibOLE::WriteString - write out a string.
+*Purpose:
+* Write out a string specified by an HSZ in the format:
+* 2 byte length
+* string without zero terminator
+*
+* If hsz is HCHUNK_Nil, write out 0xffff for the length
+* and don't write out any string bytes.
+*
+*Entry:
+* pstrm - The stream to which to write the string.
+* hsz - The string to write out.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR GenericTypeLibOLE::WriteString(STREAM *pstrm, HCHUNK hsz)
+{
+ TIPERROR err;
+ USHORT cb;
+ XSZ qsz;
+
+ // If hsz is HCHUNK_Nil, just write out ~0 to indicate there is
+ // no string.
+ if (hsz == HCHUNK_Nil)
+ return pstrm->WriteUShort((USHORT)~0);
+
+ // Get the string and its length.
+#if OE_WIN32
+ // write Ansi strings for Win16, Mac compatibility
+
+ LPOLESTR lpwstr;
+ int cchUnicode;
+
+ qsz = NULL;
+
+ m_bmData.Lock();
+ lpwstr = (LPOLESTR)QtrOfHChunk(hsz);
+ cchUnicode = wcslen(lpwstr)+1;
+
+ cb = WideCharToMultiByte(CP_ACP, 0, lpwstr, cchUnicode, NULL, 0, NULL, NULL);
+ if (cb == 0)
+ IfErrGo(TIPERR_OutOfMemory);
+
+ qsz = (XSZ)MemAlloc(cb);
+ if (qsz == NULL)
+ IfErrGo(TIPERR_OutOfMemory);
+
+ WideCharToMultiByte(CP_ACP, 0, lpwstr, cchUnicode, qsz, cb, NULL, NULL);
+
+#else
+ m_bmData.Lock();
+ qsz = (XSZ)QtrOfHChunk(hsz);
+
+ cb = xstrblen(qsz);
+
+#endif
+
+ // Write out the length.
+ IfErrGo(pstrm->WriteUShort(cb));
+
+ // Write out the string.
+ err = pstrm->Write(qsz, cb);
+
+Error:
+ m_bmData.Unlock();
+#if OE_WIN32
+ MemFree(qsz);
+#endif
+ return err;
+}
+#pragma code_seg()
+
+/***
+*PROTECTED GenericTypeLibOLE::Read - read TypeLib directory
+*Purpose:
+* Read in GenericTypeLibOLE.
+* NOTE: that if this function fails, the TypeLib is left in an
+* indeterminate state and should be deleted.
+*
+*Entry:
+* pstrm
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::Read(STREAM *pstrm)
+{
+ UINT i;
+ ULONG dw;
+ HCHUNK hsz;
+ TIPERROR err;
+ HTENTRY hte;
+ USHORT usHlnam;
+ WORD w;
+ GUID guid;
+ BYTE *qbChunkStr;
+ HCHUNK hchunk;
+ USHORT usEncodedDocStrSize;
+
+
+// The first chunk of stuff written out in the typelib header
+#pragma pack(1)
+typedef struct tagCHUNK1 {
+ WORD wFirstWord;
+ WORD wVersion;
+ USHORT usHlnam;
+} CHUNK1;
+#pragma pack()
+#define CHUNK1_Layout "sss"
+
+// The second chunk of stuff written out in the typelib header.
+#pragma pack(1)
+typedef struct tagCHUNK2 {
+ ULONG dwHelpContext;
+ USHORT syskind;
+ LCID lcid;
+ USHORT usTmp;
+ USHORT wLibFlags;
+ USHORT wMajorVerNum;
+ USHORT wMinorVerNum;
+ GUID guid;
+ HTENTRY rghteBucket[GTLIBOLE_cBuckets];
+ USHORT cTypeEntries;
+} CHUNK2;
+#pragma pack()
+
+// Note: the 'chunk2' layout string only describes the struct up to,
+// but not including rghteBucket. Everything after must be swapped by hand.
+#define CHUNK2_Layout "lslssss" GUID_Layout
+
+ CHUNK1 chunk1;
+ CHUNK2 chunk2;
+
+
+ IfErrRet(pstrm->Read(&chunk1, sizeof(chunk1)));
+#if HP_BIGENDIAN
+ SwapStruct(&chunk1, CHUNK1_Layout);
+#endif
+
+ if(chunk1.wFirstWord != wFirstSerWord || DebErrorNow(TIPERR_InvDataRead))
+ return TIPERR_InvDataRead;
+ if(chunk1.wVersion > wMaxVersion
+ || DebErrorNow(TIPERR_UnsupFormat)) {
+
+ return TIPERR_UnsupFormat;
+ }
+
+ m_wCurVersion = chunk1.wVersion;
+
+ m_hlnamLib = (HLNAM)chunk1.usHlnam;
+
+ // Read in default TYPEINFO TypeId
+ IfErrRet(ReadString(pstrm, &m_hszDefaultTITypeId));
+
+ // Read in documentation string.
+ IfErrRet(ReadString(pstrm, &m_hszDocString));
+
+ // Read in helpfile name.
+ IfErrRet(ReadString(pstrm, &m_hszHelpFile));
+
+ IfErrRet(pstrm->Read(&chunk2, sizeof(chunk2)));
+#if HP_BIGENDIAN
+ SwapStruct(&chunk2, CHUNK2_Layout);
+ SwapShortArray(chunk2.rghteBucket, DIM(chunk2.rghteBucket));
+ chunk2.cTypeEntries = SwapShort(chunk2.cTypeEntries);
+#endif
+
+ m_dwHelpContext = chunk2.dwHelpContext;
+ m_lcid = chunk2.lcid;
+ m_wLibFlags = chunk2.wLibFlags;
+ m_lcidZero = (BOOL)chunk2.usTmp;
+ m_wMajorVerNum = chunk2.wMajorVerNum;
+ m_wMinorVerNum = chunk2.wMinorVerNum;
+ m_guid = chunk2.guid;
+ m_syskind = chunk2.syskind;
+ DebAssert(DIM(m_rghteBucket) == GTLIBOLE_cBuckets, "");
+ memcpy(m_rghteBucket, chunk2.rghteBucket, sizeof(m_rghteBucket));
+
+ IfErrRet(m_bdte.Realloc(chunk2.cTypeEntries * sizeof(TYPE_ENTRY)));
+
+ // Note that if we break out of this loop because of errors,
+ // m_cTypeEntries equals the number of entries which have been
+ // constructed and must be freed.
+
+ m_cTypeEntries = 0;
+ for (i = 0; i < chunk2.cTypeEntries; ++i) {
+ ::new (Qte(i)) TYPE_ENTRY;
+ m_cTypeEntries++;
+ IfErrRet(ReadString(pstrm, &hsz));
+ Qte(i)->m_ste.m_hszStrm = hsz;
+ IfErrRet(ReadString(pstrm, &hsz));
+ Qte(i)->m_ste.m_hszLocalTypeId = hsz;
+ IfErrRet(ReadString(pstrm, &hsz));
+ Qte(i)->m_ste.m_hszTypeInfoTypeId = hsz;
+ IfErrRet(pstrm->ReadUShort(&usHlnam));
+ Qte(i)->m_ste.m_hlnamType = (HLNAM) usHlnam;
+
+ // Read the size of the encoded doc string.
+ IfErrRet(pstrm->ReadUShort(&usEncodedDocStrSize));
+ Qte(i)->m_ste.m_usEncodedDocStrSize = usEncodedDocStrSize;
+
+ // Read the sting if there is one.
+ if (usEncodedDocStrSize > 0) {
+ // allocated space for the encoded string.
+ IfErrRet(m_bmData.AllocChunk(&hchunk, usEncodedDocStrSize));
+ qbChunkStr = m_bmData.QtrOfHandle(hchunk);
+ // Read the encoded doc string.
+ IfErrRet(pstrm->Read(qbChunkStr, usEncodedDocStrSize));
+ Qte(i)->m_ste.m_hszEncodedDocString = hchunk;
+ }
+ else
+ Qte(i)->m_ste.m_hszEncodedDocString = HCHUNK_Nil;
+ IfErrRet(ReadString(pstrm, &hsz));
+ Qte(i)->m_ste.m_hszHelpFile = hsz;
+ IfErrRet(pstrm->ReadULong(&dw));
+ Qte(i)->m_ste.m_dwHelpContext = dw;
+ IfErrRet(pstrm->ReadUShort(&hte));
+ Qte(i)->m_hteNext = hte;
+ IfErrRet(pstrm->Read(&guid, sizeof(guid)) );
+#if HP_BIGENDIAN
+ SwapStruct(&guid, GUID_Layout);
+#endif
+ Qte(i)->m_ste.m_guid = guid;
+ IfErrRet(pstrm->ReadUShort(&w));
+ Qte(i)->m_ste.m_typekind = w;
+ }
+
+ // Read the position of the nammgr. [we demand load it],
+ // we cache the stream position and use it later...
+ // Note that the namecache array immediately follows it...
+ // In addition note that the nammgr must be deserialized
+ // before (temporally and physically) the namecache array.
+ //
+ IfErrRet(pstrm->ReadULong((ULONG *)&m_lPosNammgr));
+
+ // At this point stream position is at the start of DOCSTR_MGR.
+ // We demand load the doc manager hence cache the position.
+ IfErrRet(pstrm->GetPos(&m_lPosDstrmgr));
+
+#if ID_DEBUG
+ // Store the typelib's name.
+ NAMMGR *pnammgr;
+ BSTRA bstrName;
+
+ if (GetNamMgr(&pnammgr) == TIPERR_None && m_hlnamLib != HLNAM_Nil) {
+ if (pnammgr->BstrOfHlnam(m_hlnamLib, &bstrName) == TIPERR_None) {
+ strncpy(m_szDebName, bstrName, DEBNAMESIZE - 1);
+ m_szDebName[DEBNAMESIZE - 1] = 0;
+ FreeBstrA(bstrName);
+ }
+ }
+#endif // ID_DEBUG
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GenericTypeLibOLE::InvalidateNameCache
+*Purpose:
+* Invalidates a given module's namecache if there is a cache at all.
+* NOTE: DOES NOT invalidate project's cache.
+* Since the project's cache is at offset zero
+* in the cache array, clients must increment
+* their type index when calling this func.
+* Note it is ok to call this function with inamcache == 0 since
+* that refers to the project's cache.
+*
+*Entry:
+* inamcache index of TYPEINFO in library + 1.
+*
+*Exit:
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID GenericTypeLibOLE::InvalidateNameCache(UINT inamcache)
+{
+ if (m_bdRgnamcache.IsValid()) {
+ DebAssert(inamcache <= m_cTypeEntries, "bad type index.");
+
+ // Invalidate i'th name cache
+ Rgnamcache()[inamcache].Invalidate();
+ }
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GenericTypeLibOLE::QtrOfHChunk
+*Purpose:
+* Return the pointer to data contained in a given chunk of m_bmData.
+* If hv is HCHUNK_Nil returns NULL.
+*
+*Entry:
+* hv - hchunk of chunk containing the data.
+*
+*Exit:
+* returns a pointer into the chunk.
+* This pointer will be invalidated by heap movement.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID *GenericTypeLibOLE::QtrOfHChunk(HCHUNK hv)
+{
+ return (hv == HCHUNK_Nil) ? NULL : m_bmData.QtrOfHandle(hv);
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GenericTypeLibOLE::QszLibIdOrFile
+*Purpose:
+* Return a pointer to the LibId string. This may point into
+* m_bmData, so don't hold onto it too long.
+*
+*Entry:
+* None
+*
+*Exit:
+* Returns a pointer into the chunk if the LibId is known.
+* Returns NULL if the LibId is not known.
+* This pointer may be invalidated by heap movement.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+LPOLESTR GenericTypeLibOLE::QszLibIdOrFile()
+{
+ return (m_hszFile == HCHUNK_Nil) ? NULL : (LPOLESTR)m_bmData.QtrOfHandle(m_hszFile);
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GenericTypeLibOLE::QszOfHsz
+*Purpose:
+* Return the string contained in a given chunk of m_bmData
+* If hsz is HCHUNK_Nil returns an empty string
+*
+*Entry:
+* hsz - hchunk of chunk containing the string
+*
+*Exit:
+* returns a pointer into the chunk.
+* This pointer will be invalidated by heap movement.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+LPOLESTR GenericTypeLibOLE::QszOfHsz(HCHUNK hsz)
+{
+ return (hsz == HCHUNK_Nil) ? WIDE("") : (LPOLESTR)m_bmData.QtrOfHandle(hsz);
+}
+#pragma code_seg( )
+
+
+/***
+*PROTECTED GenericTypeLibOLE::GetQszTypeInfoTypeId
+*Purpose:
+* Function which returns an SZ containing the TYPEID of the TYPEINFO
+* of a Type stored in the ITypeLib.
+* Note that this returns an sz which may point in to a moveable heap.
+* It is a non-public function.
+*
+*Entry:
+* hte - handle for the TYPEENTRY whose TYPEINFO's TYPEID is to be
+* returned.
+*
+*Exit:
+* returns sz containing the TYPEID
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+LPOLESTR GenericTypeLibOLE::GetQszTypeInfoTypeId(HTENTRY hte)
+{
+ HCHUNK hsz;
+
+ hsz = Qte(hte)->m_ste.m_hszTypeInfoTypeId;
+ if (hsz != HCHUNK_Nil)
+ return QszOfHsz(hsz);
+ else if (m_hszDefaultTITypeId != HCHUNK_Nil)
+ return QszOfHsz(m_hszDefaultTITypeId);
+ else
+ // If no default was set then use GEN_DTINFO
+ return GEN_DTINFO::szProtocolName;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC GenericTypeLibOLE::ReleaseResources
+*Purpose:
+* Release resources owned by proj-level binder.
+*
+*Implementation Notes:
+* Defers to binder.
+*
+*Entry:
+*
+*Exit:
+*
+*Errors:
+* None
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID GenericTypeLibOLE::ReleaseResources()
+{
+ m_gptbind.ReleaseResources();
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GenericTypeLibOLE::Add
+*Purpose:
+* Add a TYPEINFO to the GenericTypeLibOLE.
+* Note that this increments the reference count of the ITypeLib by
+* the number of references to the TYPEINFO so their reference
+* counts are in sync.
+* The reference count of the TYPEINFO is not changed and if the caller's
+* reference is the only one then the TYPEINFO will be deleted when
+* he releases his reference.
+* Add returns an error if there is a TypeInfo in the TypeLib whose
+* LocalTypeId matches the TypeId passed in regardless of what the
+* minor version number is.
+* There is no need to support having two TypeInfos whose TypeId's
+* differ only in their minor version number since the one with the
+* highest version number would always be the one that should be
+* retrieved from the TypeLib anyway.
+* Returns an error if the name of the TypeInfo being added matches the
+* name of a TypeInfo already in the library.
+*
+* NOTE: the namecache array is grown appropriately as well -- in addition
+* the project-level cache is invalidated. Note that
+* the namcache array must parallel the typeentry array.
+*
+*Entry:
+* pgdtinfo - pointer to GEN_DTINFO to be added
+* szName - name of the TYPEINFO being added
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR GenericTypeLibOLE::Add(GEN_DTINFO *pgdtinfo, LPOLESTR szName)
+{
+ HTENTRY hte;
+ TIPERROR err;
+#if OE_WIN32
+ LPSTR szNameA;
+
+ IfErrRet(TiperrOfHresult(ConvertStringToA(szName, &szNameA)));
+#else
+ #define szNameA szName
+#endif
+ // Add the new typeentry.
+ IfErrGoTo(AddTypeEntry(szNameA, pgdtinfo->SzTypeIdofTypeInfo(), &hte), ErrorRet);
+
+ // NOTE: any errors after this point must release the type entry
+
+ // Tell the TypeInfo about its container
+ pgdtinfo->SetContainingTypeLib(this);
+
+ // Assign the pointer to the TYPEINFO
+ Qte(hte)->m_pstltinfo = pgdtinfo;
+
+ // Tell the typeinfo its index in this typelib.
+ pgdtinfo->SetHTEntry(hte);
+
+ pgdtinfo->AddInternalRef();
+ pgdtinfo->m_isModified = TRUE;
+
+ SetTypeKind(hte, pgdtinfo->GetTypeKind());
+
+ // Add the name to the binding table
+ IfErrGo(GetTypeBind());
+ IfErrGo(m_gptbind.AddNameToTable(szNameA, hte, TRUE));
+
+ goto ErrorRet;
+
+Error:
+ UnAddTypeEntry(hte); // undo the AddTypeEntry
+
+ErrorRet:
+#if OE_WIN32
+ ConvertStringFree(szNameA);
+#else
+ #undef szNameA
+#endif
+ return err;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC UpdateTypeId - Creates a new typeId for an existing typeinfo
+*Purpose:
+* This method creates a new TypeId for the specified typeinfo. It
+* is called whenever a change is made to a typeinfo that would prevent
+* code that is compiled against that typeinfo from working. In effect,
+* the typeinfo has become a new type and so needs a new typeId.
+*
+*Entry:
+* itype - The index (ite or hte) of the typeentry for the type.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_LAYOUT)
+TIPERROR GenericTypeLibOLE::UpdateTypeId(UINT hteUpdate)
+{
+ LPOLESTR qszLocalTypeId;
+ HTENTRY *qhtePrev;
+ TYPE_ENTRY *qteUpdate;
+ int ihte;
+
+ DebAssert(hteUpdate != HTENTRY_Nil, "UpdateTypeId");
+
+ m_bmData.Lock();
+ qteUpdate = Qte(hteUpdate);
+ qszLocalTypeId = QszOfHsz(qteUpdate->m_ste.m_hszLocalTypeId);
+
+ // Remove hteUpdate from the hash table.
+ qhtePrev = QHteRef(hteUpdate);
+ *qhtePrev = qteUpdate->m_hteNext;
+
+ // Update the typeId in place (i.e. we don't have to change the
+ // allocated space for the typeId). We can do this because
+ // MakeLocalTypeId allocated enough space for the largest possible
+ // timestamp.
+ DebAssert(ostrlen(qszLocalTypeId) <= CCH_TIMESTAMP_LENGTH, "UpdateTypeId");
+ GetTimeStamp(qszLocalTypeId);
+
+ // Put the type entry back into the hash table, in the bucket list
+ // corresponding to the new typeId.
+ ihte = IhteHash(qszLocalTypeId);
+ m_bmData.Unlock();
+ qteUpdate->m_hteNext = m_rghteBucket[ihte];
+ m_rghteBucket[ihte] = hteUpdate;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PROTECTED GenericTypeLibOLE::CreateHsz
+*Purpose:
+* Allocata a new chunk in m_mbData and copy an LPOLESTR into it
+*
+*Entry:
+* sz - contains to be copied to the new chunk
+* phchunk - returns a pointer to the newly allocated chunk
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::CreateHsz(LPOLESTR sz, HCHUNK *phchunk)
+{
+ UINT cb;
+ TIPERROR err;
+ HCHUNK hchunk;
+
+ cb = ostrblen(sz)*sizeof(OLECHAR);
+ IfErrRet( m_bmData.AllocChunk(&hchunk, cb+sizeof(OLECHAR)) );
+ ostrcpy((LPOLESTR)m_bmData.QtrOfHandle(hchunk), sz);
+ *phchunk = hchunk;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PROTECTED GenericTypeLibOLE::MakeLocalTypeId
+*Purpose:
+* Create an hchunk containing the LocalTypeId by concatenating the
+* passed in minor version number and a separator character
+* on to the passed in TypeId.
+*
+*Entry:
+* None
+*
+*Exit:
+* pchunkTypeId - for returning the TypeId
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR GenericTypeLibOLE::MakeLocalTypeId(HCHUNK *phchunkTypeId)
+{
+ TIPERROR err;
+
+ // Allocate space for the timestamp (er, typeid).
+ IfErrRet(m_bmData.AllocChunk(phchunkTypeId, (CCH_TIMESTAMP_LENGTH+1)*sizeof(OLECHAR)));
+
+ // Get the new typeId into the allocated space.
+ m_bmData.Lock();
+ GetTimeStamp((LPOLESTR)m_bmData.QtrOfHandle(*phchunkTypeId));
+ m_bmData.Unlock();
+
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+
+
+/***
+*PROTECTED GenericTypeLibOLE::HteRef
+*Purpose:
+* Return a pointer to the reference of a given HTE.
+* Normally this will be a pointer to the m_hteNext field of
+* the TYPE_ENTRY which preceeds it in the bucket. If it is
+* the first entry in the bucket list then a pointer to
+* the head of the bucket list is returned.
+*
+*Entry:
+* ptinfo - pointer to TYPEINFO whose hte reference is returned
+*
+*Exit:
+* HTENTRY * - pointer to word that contains the passed in hte.
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HTENTRY *GenericTypeLibOLE::QHteRef(HTENTRY hteSearch)
+{
+ HTENTRY *qhte;
+
+ m_bmData.Lock();
+
+ // Set qhte to point to the entry in the bucket array which
+ // is the head of the list that contains the TYPEENTRY whose
+ // handle was passed in.
+ qhte = m_rghteBucket +
+ IhteHash(QszOfHsz(Qte(hteSearch)->m_ste.m_hszLocalTypeId));
+
+ m_bmData.Unlock();
+
+ // Scan down the bucket list for the entry which preceeds
+ // the one we are looking for
+ while (*qhte != hteSearch) {
+ DebAssert(*qhte != HTENTRY_Nil, "HteRef: Entry Table messed up");
+
+ // set qhte to point to the hteNext field of the entry referenced
+ // by qhte
+ qhte = &(Qte(*qhte)->m_hteNext);
+ }
+ return qhte;
+}
+#pragma code_seg( )
+
+
+/***
+*PROTECTED GenericTypeLibOLE::Write - write GenericTypeLibOLE directory
+*Purpose:
+* Serialize GenericTypeLibOLE directory. Note that this function invokes
+* the (possibly overridden) Write(STREAM) function.
+*
+*Entry:
+* none
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR GenericTypeLibOLE::Write()
+{
+ STREAM *pstrm;
+ TIPERROR err, err2;
+
+ IfErrRet(OpenTypeStream((UINT)-1, SOM_Write, &pstrm));
+
+ if (!(err = Write(pstrm))) {
+ err = SetModified(FALSE);
+ }
+
+ err2 = pstrm->Release();
+ if (err == TIPERR_None)
+ err = err2;
+
+
+ return err;
+}
+#pragma code_seg()
+
+
+
+/***
+*PROTECTED GenericTypeLibOLE::Write - write GenericTypeLibOLE directory
+*Purpose:
+* Serialize GenericTypeLibOLE directory.
+*
+*Entry:
+* pstrm - stream to which GenericTypeLibOLE is written
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR GenericTypeLibOLE::Write(STREAM *pstrm)
+{
+ TIPERROR err;
+ USHORT hasValidDiskImageNameCache;
+ UINT i;
+ TYPE_ENTRY *pte;
+ LONG lNammgrPos = 0;
+ LONG lPosTmp = 0;
+ USHORT usTmp;
+ BYTE *qbChunkStr;
+
+ m_bmData.Lock();
+
+ // Write out identification byte and version number
+ IfErrGo( pstrm->WriteUShort(wFirstSerWord) );
+
+ IfErrGo( pstrm->WriteUShort(m_wCurVersion) );
+
+ // Write out hlnam of the typelib
+ IfErrGo( pstrm->WriteUShort(m_hlnamLib) );
+
+ // Write out default TYPEINFO TYPEID
+ IfErrGo(WriteString(pstrm, m_hszDefaultTITypeId));
+
+ // Write out documentation string.
+ IfErrGo( WriteString(pstrm, m_hszDocString) );
+
+ // Write out helpfile name.
+ IfErrGo( WriteString(pstrm, m_hszHelpFile) );
+
+ // Write out help context.
+ IfErrGo( pstrm->WriteULong(m_dwHelpContext) );
+
+ // Write out the platform for which this is compiled.
+ IfErrGo( pstrm->WriteUShort(m_syskind) );
+
+ // Write out the local code for this project
+ IfErrGo( pstrm->WriteULong(m_lcid) );
+ usTmp = (USHORT) m_lcidZero;
+ IfErrRet(pstrm->WriteUShort(usTmp));
+
+
+ // Write out the flags
+ IfErrGo( pstrm->WriteUShort(m_wLibFlags) );
+
+
+ // Write the version number of the project (GenericTypeLibOLE)
+ IfErrGo(pstrm->WriteUShort(m_wMajorVerNum));
+ IfErrGo(pstrm->WriteUShort(m_wMinorVerNum));
+
+#if HP_BIGENDIAN
+ // Before serializing GUID swap the bytes on Big-Endian machine
+ SwapStruct(&m_guid, GUID_Layout);
+#endif // !HP_BIGENDIAN
+
+ err = pstrm->Write(&m_guid, sizeof(GUID));
+
+#if HP_BIGENDIAN
+ // restore the guid structure even in case of error
+ SwapStruct(&m_guid, GUID_Layout);
+#endif // !HP_BIGENDIAN
+
+ IfErrGo(err);
+
+ // Swap the bucket entries.
+#if HP_BIGENDIAN
+ SwapShortArray(m_rghteBucket, sizeof(m_rghteBucket)/sizeof(HTENTRY));
+#endif
+
+ // Write out hash table
+ err = pstrm->Write(m_rghteBucket, sizeof(m_rghteBucket));
+
+ // swap back before handling the error.
+#if HP_BIGENDIAN
+ SwapShortArray(m_rghteBucket, sizeof(m_rghteBucket)/sizeof(HTENTRY));
+#endif
+
+ IfErrGo(err);
+
+ // Write out number of type entries then the type entry array
+ IfErrGo( pstrm->WriteUShort(m_cTypeEntries) );
+
+ for (i = 0; i < m_cTypeEntries; i++) {
+ pte = Qte(i);
+ IfErrGo( WriteString(pstrm, pte->m_ste.m_hszStrm) );
+ IfErrGo( pstrm->WriteUShort(CCH_TIMESTAMP_LENGTH) );
+#if OE_WIN32
+ CHAR szTemp[CCH_TIMESTAMP_LENGTH];
+ NoAssertRetail(WideCharToMultiByte(CP_ACP, 0,
+ QszOfHsz(pte->m_ste.m_hszLocalTypeId), CCH_TIMESTAMP_LENGTH,
+ szTemp, CCH_TIMESTAMP_LENGTH,
+ NULL, NULL), "Timestamp must only contain ANSI chars");
+ IfErrGo( pstrm->Write(szTemp, CCH_TIMESTAMP_LENGTH) );
+#else
+ IfErrGo( pstrm->Write(QszOfHsz(pte->m_ste.m_hszLocalTypeId), CCH_TIMESTAMP_LENGTH) );
+#endif
+ IfErrGo( WriteString(pstrm, pte->m_ste.m_hszTypeInfoTypeId) );
+ IfErrGo( pstrm->WriteUShort(pte->m_ste.m_hlnamType) );
+ // write out the string.
+ IfErrGo( pstrm->WriteUShort(pte->m_ste.m_usEncodedDocStrSize) );
+
+ // write out the string only if there is one.
+ if (pte->m_ste.m_usEncodedDocStrSize > 0) {
+ qbChunkStr = m_bmData.QtrOfHandle(pte->m_ste.m_hszEncodedDocString);
+
+ // Write the encoded doc string.
+ err = pstrm->Write(qbChunkStr, pte->m_ste.m_usEncodedDocStrSize);
+ }
+#if ID_DEBUG
+ else
+ DebAssert(pte->m_ste.m_hszEncodedDocString == HCHUNK_Nil, " should be nil");
+#endif
+
+ IfErrGo( WriteString(pstrm, pte->m_ste.m_hszHelpFile) );
+ IfErrGo( pstrm->WriteULong(pte->m_ste.m_dwHelpContext) );
+ IfErrGo( pstrm->WriteUShort(pte->m_hteNext) );
+
+#if HP_BIGENDIAN
+ // Before serializing GUID swap the bytes on Big-Endian machine
+ SwapStruct(&pte->m_ste.m_guid, GUID_Layout);
+#endif // !HP_BIGENDIAN
+
+ err = pstrm->Write(&pte->m_ste.m_guid, sizeof(GUID));
+
+#if HP_BIGENDIAN
+ // restore the guid structure even in case of error
+ SwapStruct(&pte->m_ste.m_guid, GUID_Layout);
+#endif // !HP_BIGENDIAN
+
+ IfErrGo( pstrm->WriteUShort(pte->m_ste.m_typekind) );
+
+ IfErrGo(err);
+
+ }
+
+ // Get the position so that we can seek back and write the position
+ // of the nammgr.
+ IfErrGo(pstrm->GetPos(&lPosTmp));
+
+ // Write out 0 temporarily. Latter we will write the serialized
+ // position of the Nammgr.
+ IfErrGo(pstrm->WriteULong(lNammgrPos));
+
+ // Write out embedded doc string manager
+ IfErrGo(m_dstrmgr.Write(pstrm));
+
+ // save the current position (this is the position where the nammgr
+ // will be read from.
+ IfErrGo(pstrm->GetPos(&lNammgrPos));
+
+ // Go back and write the position of the nammgr.
+ IfErrGo(pstrm->SetPos(lPosTmp));
+ IfErrGo(pstrm->WriteULong(lNammgrPos));
+ // reset the position
+ IfErrGo(pstrm->SetPos(lNammgrPos));
+
+ // Write out embedded proj-level nammgr.
+ IfErrGo(m_nammgr.Write(pstrm));
+
+ // Write out embedded proj-level typebind.
+ IfErrGo(m_gptbind.Write(pstrm));
+
+ // Finally write out the Rgnamcache if there is one.
+ // Note that we always write a single flag byte indicating
+ // whether in fact a valid array follows.
+ // WARNING: GenericTypeLibOLE::Read() assumes that this array
+ // is the last element in its serialization stream.
+ //
+ hasValidDiskImageNameCache = (USHORT)m_bdRgnamcache.IsValid();
+ IfErrGo(pstrm->Write(&hasValidDiskImageNameCache,
+ sizeof(hasValidDiskImageNameCache)));
+ if (hasValidDiskImageNameCache) {
+ IfErrGo(m_bdRgnamcache.Write(pstrm));
+ }
+
+ // Set this to -1 to indicate that we no longer know or care about
+ // serialization offset of the name cache (if it was blown away
+ // before the write, it wasn't written, so we shouldn't try to
+ // load it. If it exists when it's written, we don't need to load it).
+ m_lPosRgnamcache = -1;
+
+ // fall through...
+
+Error:
+ m_bmData.Unlock();
+ return err;
+}
+#pragma code_seg()
+
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::SaveOrCopyChanges
+*Purpose:
+* Write the typelib to the specified IStorage. shouldCopy determines
+* whether or not the "dirty" state of the typelib is preserved.
+*
+*Entry:
+* pstg - The IStorage to which the typelib should be saved.
+* The caller is expected to release pstg -- this method
+* does not assume ownership.
+* shouldCopy - If TRUE, then the "dirty" state is preserved. Otherwise,
+* the typelib's dirty state is set to clean.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR GenericTypeLibOLE::SaveOrCopyChanges(IStorageA *pstg, BOOL shouldCopy)
+{
+ UINT i;
+ TIPERROR err;
+ STL_TYPEINFO *pstltinfo;
+ ITypeCompA *ptcompLib;
+
+ // In the non-OB case, we ensure that the typelib-level
+ // binding tables have been built so that they will get
+ // serialized, to do so we just get the typelib's ITypeComp,
+ // which immediately release since we're just interested in
+ // the side-effects of getting it.
+ //
+ IfErrRet(TiperrOfHresult(GetTypeComp(&ptcompLib)));
+ ptcompLib->Release();
+
+ // If we currently have an open IStorage, close it.
+ if (m_pstg != NULL) {
+ m_pstg->Release();
+ }
+
+ m_pstg = pstg;
+
+ // WARNING: all errors paths after this point must NULL out m_pstg.
+
+ // Write out each of the dirty typeinfos. If we're copying,
+ // all of the typeinfo's are written, regardless of the dirty flag.
+ for (i = 0; i < m_cTypeEntries; i++) {
+ pstltinfo = Qte(i)->m_pstltinfo;
+
+ // If we have the dispinterface protion of a dual interface,
+ // save the interface portion instead.
+ //
+ if (pstltinfo->PstltiPartner() != NULL) {
+ pstltinfo = pstltinfo->PstltiPartner();
+ }
+
+ if (pstltinfo != NULL) {
+ if (pstltinfo->IsModified()) {
+ err = pstltinfo->Write();
+ if (err)
+ goto Error;
+ }
+ }
+ }
+
+ // Write out the directory.
+ IfErrGo( Write() );
+
+
+ // Mark the IStorage of the OLE typelib with the GUID of the
+ // typelib implementation.
+
+ err = TiperrOfHresult(WriteClassStg((IStorage *)m_pstg,
+ CLSID_GenericTypeLibOLE));
+
+ // Also mark the IStorage with the TYPELIB format.
+ // VBA2: We may eventually need to define a real clipboard format
+ // constant for a typelib. Right now, we just use a random one
+ // that WriteFmtUserTypeStg doesn't complain about.
+ if (err == TIPERR_None) {
+
+ err = TiperrOfHresult(WriteFmtUserTypeStgA(m_pstg,
+ 0x200,
+ OLESTR("TYPELIB")));
+
+ }
+
+
+Error:
+ m_pstg = NULL;
+
+
+ return err;
+}
+#pragma code_seg()
+
+
+#if OE_MAC
+
+#pragma code_seg(CS_CREATE)
+
+#if OE_MAC68K
+inline long LMGetCurDirStore() { return (*((long*)0x398)); };
+inline void LMSetCurDirStore(const long l) { *((long*)0x398)=l; };
+inline short LMGetSFSaveDisk() { return (*((short*)0x214)); };
+inline void LMSetSFSaveDisk(const short s) { *((short*)0x214)=s; };
+#endif
+#define MAX_PAS_STRLEN 255
+#define MAX_FILENAME_LEN 32
+
+/***
+* PRIVATE GetFSSpecOfPartialPath
+*Purpose:
+* Creates an FSSpec from a full or partially specified path.
+*
+* This is similar in function to GetPathname() + GetFSSpecOfAliasPath except
+* it's faster than either one of those.
+*
+*Entry:
+* pszFileName = Full or partial path
+* pfspec = pointer to completed FSSpec.
+* fResolveFileAliases = Indicates whether or not file aliases are to be resolved.
+* (Aliases along the path are always resolved, but not necc. the teminal file/folder)
+*
+* Note: Currently limited to 256 character strings.
+*
+*Exit:
+* result code signifies error
+*
+* For RTScript, the 90% cases will either error out up top (script > 32 chars, no ':'),
+* or not require a call to GetPathFromFSSpec().
+*
+*Exceptions:
+*
+***********************************************************************/
+TIPERROR GetFSSpecOfPartialPath(char *pszFileName, FSSpec* pfspec, BOOL fResolveFileAliases)
+{
+ char* pColn;
+ short sLen;
+ OSErr ec;
+ TIPERROR err;
+ BOOL fAliasSeen;
+ char pchPathname[MAX_PAS_STRLEN+1];
+
+ // If filename is > 32chars, it must have at least 1 ':'
+ // or we can say it isn't a file right now.
+ sLen = strlen(pszFileName);
+ pColn= strchr(pszFileName,':');
+ if (!sLen || ((sLen > MAX_FILENAME_LEN) && !pColn) ) {
+ return TiperrOfOSErr(fnfErr);
+ }
+
+ // Convert to Pascal String:
+ memcpy(pchPathname+1, pszFileName, sLen);
+ pchPathname[0]=(char)(sLen & 0xFF);
+
+ // Get Current directory for partial path & file resolution:
+ ec = FSMakeFSSpec(-LMGetSFSaveDisk(), LMGetCurDirStore(), (unsigned char*)pchPathname, pfspec);
+ err = TiperrOfOSErr(ec);
+
+ // If an error, it means one of two things:
+ // 1) we couldn't find the file,
+ // or 2) the path contains aliases.
+ if (ec == fnfErr) {
+ pColn = (char*)memchr(pchPathname+1,':',*pchPathname);
+ if (pColn) {
+ // UNDONE MAC: We're looking at an alias in the path.
+ // For now I do something rude: convert the FSSpec back to a full path, and then
+ // call GetFSSpecOfAliasPath. This works, and this is an uncommon case, so it's not
+ // too critical. If it wasn't 1:00 AM, I'd probably move portions of GetFSSpecOfAliasPath
+ // into here & do it right.
+ err = GetPathFromFSSpec(pfspec, pchPathname, MAX_PAS_STRLEN);
+ if (err == TIPERR_None) {
+ err = GetFSSpecOfAliasPath(pchPathname, pfspec, &fAliasSeen, &pColn, fResolveFileAliases);
+ }
+ }
+ }
+
+ return err;
+}
+
+#define TYPE_TYPELIB 'OTLB'
+#define TYPE_NULL ' '
+#define CREATOR_TYPELIB 'Ole2'
+
+/***
+ * FSetMacFileType - set MAC file type in resource fork
+ *
+ * Purpose:
+ * Set the file type field in the file resource fork to OTLB (for typelibs)
+ *
+ * Entry:
+ * pchPath - path to file
+ *
+ * Exit:
+ * Return FALSE if error setting fields.
+ *
+ * Exceptions:
+ ***********************************************************************/
+
+BOOL FSetMacFileType(CHAR * pchPath)
+{
+ OSErr oserr;
+ FSSpec fspec;
+ FInfo fndrInfo;
+
+
+ // Get FSSpec (resolve aliases in path but not file):
+ if (GetFSSpecOfPartialPath(pchPath, &fspec, FALSE) != NOERROR)
+ return FALSE;
+
+ // Get FInfo:
+ if ((oserr = FSpGetFInfo(&fspec, &fndrInfo)) != noErr)
+ return FALSE;
+
+#if 0
+ // determine if creator is to be set
+ if (fndrInfo.fdCreator == TYPE_NULL)
+#endif //0
+ fndrInfo.fdCreator = CREATOR_TYPELIB;
+
+ // set the file type
+ fndrInfo.fdType = TYPE_TYPELIB;
+
+ // Set File Info:
+ if ((oserr = FSpSetFInfo(&fspec, &fndrInfo)) != noErr)
+ return FALSE;
+
+ // Flush Vol info so Finder will pick up changes:
+ if ((oserr = FlushVol(NULL, fspec.vRefNum)) != noErr)
+ return FALSE;
+
+ return TRUE;
+}
+#pragma code_seg()
+#endif //EI_OLE && OE_MAC
+
+/***
+*PUBLIC GenericTypeLibOLE::SaveAllChanges
+*Purpose:
+* Save all TypeInfo's in the library which have been modified
+* (or added to the library) without being saved.
+*
+*Entry:
+* None
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE )
+HRESULT GenericTypeLibOLE::SaveAllChanges()
+{
+ IStorageA *pstg;
+ HRESULT hresult;
+ TIPERROR err;
+ UINT i, uLen;
+ GEN_DTINFO *pgdtinfo;
+ LPSTR lpstr;
+ BYTE *qbChunkStr;
+ HCHUNK hchunk;
+
+
+ // Tell the DocStr_Mgr to process all the doc strings.
+ IfErrRetHresult(m_dstrmgr.ProcessDocStrings());
+
+ // Inform all the TYPE_ENTRIES to update the doc strings.
+ //
+ // Walk all the type entries
+ for (i = 0; i < m_cTypeEntries; i++) {
+ pgdtinfo = (GEN_DTINFO *) Qte(i)->m_pstltinfo;
+ DebAssert(pgdtinfo != NULL, " all typeinfo's should be loaded ");
+
+ // If we have the dispinterface portion of a dual interface,
+ // get the interface.
+ //
+ if (pgdtinfo->IsDualDispinterface()) {
+ pgdtinfo = pgdtinfo->PgdtinfoPartner();
+ }
+
+ IfErrRetHresult(
+ pgdtinfo->Pdtroot()->Pdtmbrs()->Ptdata()->UpdateDocStrings());
+
+ // Save the encoded doc string for each TYPE ENTRY also.
+ //
+ if (Qte(i)->m_ste.m_hszEncodedDocString != HCHUNK_Nil) {
+ // ask the doc str manager for the encoded string.
+ IfErrRetHresult(
+ m_dstrmgr.GetEncodedDocStrOfHst(Qte(i)->m_ste.m_hszEncodedDocString,
+ &lpstr,
+ &uLen));
+ DebAssert(lpstr != NULL, "");
+
+ // save the encoded string in the blkmgr.
+ err = m_bmData.AllocChunk(&hchunk, uLen);
+
+ if (err != TIPERR_None) {
+ MemFree(lpstr);
+ return HresultOfTiperr(err);
+ }
+
+ qbChunkStr = m_bmData.QtrOfHandle(hchunk);
+ memcpy(qbChunkStr, lpstr, uLen);
+ // save the size of the encode doc sting
+ Qte(i)->m_ste.m_usEncodedDocStrSize = uLen;
+
+ Qte(i)->m_ste.m_hszEncodedDocString = hchunk;
+
+ // Free the clients memory
+ MemFree(lpstr);
+ } // if
+ } // for loop
+
+ IfErrRetHresult(GetStorage(STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, &pstg));
+ hresult = SaveAllChanges(pstg);
+ if (hresult == NOERROR)
+ hresult = pstg->Commit(0L);
+ if (hresult != NOERROR) {
+#if OE_WIN32
+ LPSTR szFileA;
+
+ IfErrRetHresult(ConvertStringToA(QszOfHsz(m_hszFile), &szFileA));
+ remove(szFileA);
+ ConvertStringFree(szFileA);
+#else
+ remove(QszOfHsz(m_hszFile)); // kill off partial file
+#endif
+ }
+ pstg->Release();
+
+#if OE_MAC
+ if (hresult == NOERROR) {
+ // Now that the file is closed, set the file type of this typelib to OTLB.
+ // Ignore any errors, since we don't want the failure of this routine to
+ // keep us from getting our valid typelib.
+ FSetMacFileType(QszOfHsz(m_hszFile));
+ }
+#endif //OE_MAC
+
+ return hresult;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GenericTypeLibOLE::SaveAllChanges
+*Purpose:
+* Save all TypeInfo's in the library which have been modified
+* (or added to the library) without being saved.
+*
+*Entry:
+* pstg - The IStorage to which the typelib should be saved.
+* The caller is expected to release pstg -- this method
+* does not assume ownership.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+HRESULT GenericTypeLibOLE::SaveAllChanges(IStorageA *pstg)
+{
+ return HresultOfTiperr(SaveOrCopyChanges(pstg, FALSE));
+
+
+}
+#pragma code_seg()
+
+
+/***
+*PROTECTED GenericTypeLibOLE::ResetHsz
+*Purpose:
+* Allocate a new chunk in m_mbData and copy an LPSTR into it
+*
+*Entry:
+* sz - contains to be copied to the new chunk
+* phchunk - returns a pointer to the newly allocated chunk
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::ResetHsz(LPOLESTR sz, HCHUNK *phchunk)
+{
+ TIPERROR err;
+ HCHUNK hchunkSave;
+
+ IfErrRet(SetModified(TRUE));
+ m_fDirModified = TRUE;
+
+ hchunkSave = *phchunk;
+
+ IfErrRet(CreateHsz(sz, phchunk));
+
+ // Release the old chunk
+ if (hchunkSave != HCHUNK_Nil)
+ DeleteHsz(hchunkSave);
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC GenericTypeLibOLE::SetTypeDocString
+*Purpose:
+* Set the documentation string of the ith TypeInfo.
+*
+*Entry:
+* i - index of TypeInfo to be changed
+* szDocString - new docstring.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+TIPERROR GenericTypeLibOLE::SetTypeDocString(UINT i, LPOLESTR szDocString)
+{
+ TIPERROR err;
+
+ DOCSTR_MGR *pdstrmgr;
+
+ IfErrRet(GetDstrMgr(&pdstrmgr));
+
+ // get the handle for the help string.
+ // Note:- This is a temporary handle. This handle is replaced
+ // when we do SaveAllChanges. We update this handle by a handle to
+ // the encoded string.
+ //
+#if OE_WIN32
+ LPSTR lpstrA;
+
+ IfErrRet(TiperrOfHresult(ConvertStringToA(szDocString, &lpstrA)));
+ err = pdstrmgr->GetHstOfHelpString(lpstrA, &(Qte(i)->m_ste.m_hszEncodedDocString));
+ ConvertStringFree(lpstrA);
+ IfErrRet(err);
+#else
+ IfErrRet(pdstrmgr->GetHstOfHelpString(szDocString,
+ &(Qte(i)->m_ste.m_hszEncodedDocString)));
+#endif //OE_WIN32
+
+
+ return err;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC GenericTypeLibOLE::SetTypeHelpContext
+*Purpose:
+* Set the help context of the ith TypeInfo.
+*
+*Entry:
+* i - index of TypeInfo to be changed
+* dwHelpContext - The new help context.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+TIPERROR GenericTypeLibOLE::SetTypeHelpContext(UINT i, DWORD dwHelpContext)
+{
+
+ Qte(i)->m_ste.m_dwHelpContext = dwHelpContext;
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC GenericTypeLibOLE::SetVersion
+*Purpose:
+* Set the version number associated with the TypeLib
+*
+*Entry:
+* wMajorVerNum - The major version number.
+* wMinorVerNum - The minor version number.
+*
+*Exit:
+* HRESULT
+*
+***********************************************************************/
+
+HRESULT GenericTypeLibOLE::SetVersion(WORD wMajorVerNum, WORD wMinorVerNum)
+{
+ m_wMajorVerNum = wMajorVerNum;
+ m_wMinorVerNum = wMinorVerNum;
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC GenericTypeLibOLE::SetName
+*Purpose:
+* Set the name associated with the TypeLib
+*
+*Entry:
+* szName - the name
+*
+*Exit:
+* HRESULT
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+HRESULT GenericTypeLibOLE::SetName(LPOLESTR szNameW)
+{
+ TIPERROR err = TIPERR_None;
+ NAMMGR *pnammgr;
+ HLNAM hlnamOld = m_hlnamLib;
+#if OE_WIN32
+ LPSTR szName;
+#else
+ #define szName szNameW
+#endif
+
+ IfErrRetHresult(GetNamMgr(&pnammgr));
+
+#if OE_WIN32
+ // convert the name to Ansi
+ IfErrRet(ConvertStringToA(szNameW, &szName));
+#endif
+ IfErrGo(pnammgr->HlnamOfStr(szName, &m_hlnamLib, TRUE, NULL));
+
+
+#if OE_WIN32
+ ConvertStringFree(szName);
+#endif // OE_WIN32
+
+ return NOERROR;
+
+Error:
+ // Restore original name.
+ m_hlnamLib = hlnamOld;
+#if OE_WIN32
+ ConvertStringFree(szName);
+#else //OE_WIN32
+ #undef szName
+#endif //OE_WIn32
+ return HresultOfTiperr(err);
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC GenericTypeLibOLE::SetGuid
+*Purpose:
+* Set the guid associated with the TypeLib
+*
+*Entry:
+* guid - the guid
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+HRESULT GenericTypeLibOLE::SetGuid(REFGUID guid)
+{
+ m_guid = guid;
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC TIPERROR GenericTypeLibOLE::SetModified
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::SetModified(BOOL isModified)
+{
+ TIPERROR err = TIPERR_None;
+
+ // If the modified state is already correct, don't bother with it.
+ if (isModified == m_isModified)
+ return TIPERR_None;
+
+ // If we are clearing the modified flag, it means we've just saved all
+ // changes or decided to trash all changes. In either case, the
+ // directory mod flag should be cleared. On the other hand, we don't
+ // want to set the directory mod flag just because some contained
+ // typeinfo changed.
+ if (!isModified) {
+ m_fDirModified = FALSE;
+
+ }
+
+ // This flag is always changed.
+ m_isModified = isModified;
+
+ return err;
+}
+#pragma code_seg()
+
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetNamMgr - return pointer to the NAMMGR
+*Purpose:
+* Produce the typelib's nammgr. If necessary deserialized from
+* stream if there is a serialized image and hasn't been deserialized
+* yet.
+* Note: sets the namecache stream offset as a side-effect.
+*
+*Entry:
+* None.
+*
+*Exit:
+* *ppnammgr
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::GetNamMgr(NAMMGR **ppnammgr)
+{
+ STREAM *pstrm;
+ TIPERROR err;
+
+ DebAssert(ppnammgr != NULL, "null param.");
+ DebAssert(m_nammgr.IsValid(), "whoops! nammgr should be valid.");
+
+ // Test if nammgr has been serialized ever or if it has
+ // already been deserialized, if not, no nammgr to read.
+ //
+ if ((m_fNammgrDeserialized == FALSE) && (m_lPosNammgr != -1)) {
+ // Otherwise open the stream.
+
+ IfErrRet(OpenTypeStream((UINT)-1, SOM_Read, &pstrm));
+
+ // No need to init the NamMgr. It is embedded and thus
+ // is constructed at container construction time, in addition
+ // is inited at container's init time.
+ // And seek to where the nammgr should be.
+ //
+ IfErrGo(pstrm->SetPos(m_lPosNammgr));
+ IfErrGo(m_nammgr.Read(pstrm));
+ m_fNammgrDeserialized = TRUE;
+
+ // At this point stream postion is at the start of the
+ // proj-level typebind. However since we don't want to
+ // load it now (we demand load it at bind time),
+ // we cache the stream position and use it later...
+ //
+ IfErrGo(pstrm->GetPos(&m_lPosGptbind));
+
+ // Close the stream
+ pstrm->Release();
+ }
+
+ // setup output param
+ *ppnammgr = &m_nammgr;
+ return TIPERR_None;
+
+Error:
+ pstrm->Release();
+ return err;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC GenericTypeLibOLE::GetDstrMgr - Get the string manager
+*Purpose:
+*
+* Returns the docstring manager.
+*
+*Entry:
+* None.
+*
+*Exit:
+* *ppdstrmgr
+*
+***********************************************************************/
+
+TIPERROR GenericTypeLibOLE::GetDstrMgr(DOCSTR_MGR **ppdstrmgr)
+{
+ STREAM *pstrm;
+ TIPERROR err;
+
+ DebAssert(ppdstrmgr != NULL, "null param.");
+
+ // Test if nammgr has been serialized ever or if it has
+ // already been deserialized, if not, no nammgr to read.
+ //
+ if ((m_fDstrmgrDeserialized == FALSE) && (m_lPosNammgr != -1)) {
+ // Otherwise open the stream.
+
+ IfErrGoTo(OpenTypeStream((UINT)-1, SOM_Read, &pstrm), Error);
+
+ // No need to init the NamMgr. It is embedded and thus
+ // is constructed at container construction time, in addition
+ // is inited at container's init time.
+ // And seek to where the nammgr should be.
+ //
+ IfErrGo(pstrm->SetPos(m_lPosDstrmgr));
+ IfErrGo(m_dstrmgr.Read(pstrm));
+ m_fDstrmgrDeserialized = TRUE;
+
+ // Close the stream
+ pstrm->Release();
+ }
+
+ // setup output param
+ *ppdstrmgr = &m_dstrmgr;
+ return TIPERR_None;
+
+Error:
+ pstrm->Release();
+ return err;
+
+
+}
+
+
+/***
+* OpenTypeStream - Open a typeinfo's STREAM.
+*
+* Purpose:
+* This method is called by a contained typeinfo whenever that typeinfo
+* wants to read or write its data.
+*
+* Inputs:
+* hte - The index of the typeinfo whose stream is to be opened.
+* som - The access mode of the STREAM. See DOCFILE_STREAM::Open for
+* details.
+*
+* Outputs:
+* TIPERROR
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR GenericTypeLibOLE::OpenTypeStream(UINT hte, STREAM_OPEN_MODE som, STREAM **ppstrm)
+{
+ TIPERROR err;
+ HCHUNK hchunk;
+ LPOLESTR lpstrStream;
+
+
+ // If m_szCopyTmp is NULL, then just open the stream inside the current
+ // storage object.
+
+ DebAssert(hte == -1 || som == SOM_Write || Qte(hte)->m_ste.m_hszStrm != HCHUNK_Nil, "OpenTypeStream");
+
+ // If the DOCFILE_STREAM for the typeinfo is already open, just
+ // AddRef and return it. Note that we must be attempting to open for
+ // readonly permissions in this case.
+ if (hte != -1 && Qte(hte)->m_pdfstrm != NULL) {
+ DebAssert(som == SOM_Read, "OpenTypeStream");
+ Qte(hte)->m_pdfstrm->AddRef();
+ *ppstrm = Qte(hte)->m_pdfstrm;
+ return TIPERR_None;
+ }
+
+ // If there isn't yet a name for the stream, make one (from a timestamp).
+ // NOTE: Don't be confused by the name "MakeLocalTypeId". We're NOT
+ // making a typeId. We are making a stream name which will not change
+ // for the persistent life of the typeinfo.
+ if (hte != -1 && Qte(hte)->m_ste.m_hszStrm == HCHUNK_Nil) {
+ IfErrRet(MakeLocalTypeId(&hchunk));
+ Qte(hte)->m_ste.m_hszStrm = hchunk;
+ }
+
+ if (m_pstg == NULL) {
+ IfErrRet(GetStorage(((som==SOM_Read)?STGM_READ:STGM_READWRITE) | STGM_SHARE_EXCLUSIVE, NULL));
+ }
+ else {
+ m_pstg->AddRef();
+ if (m_pstgContainer != NULL)
+ m_pstgContainer->AddRef();
+ }
+
+ m_bmData.Lock();
+ if (hte == -1)
+ lpstrStream = GenericTypeLibOLE::szDirStreamName;
+ else {
+ lpstrStream = QszOfHsz(Qte(hte)->m_ste.m_hszStrm);
+ }
+
+ err = DOCFILE_STREAM::Open(&m_pstg, &m_pstgContainer,
+ (hte == -1) ? NULL : this,
+ hte,
+ EI_OB,
+ lpstrStream,
+ som, ppstrm);
+ m_bmData.Unlock();
+ return err;
+}
+#pragma code_seg()
+
+
+
+#if ID_DEBUG
+
+/***
+*PUBLIC GenericTypeLibOLE::DebCheckState
+*Purpose:
+* Check internal state of GenericTypeLibOLE object.
+*
+*Entry:
+* uLevel - no checking is done if uLevel < 0
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+void GenericTypeLibOLE::DebCheckState(UINT uLevel)
+{
+ UINT iBucket, cTypeEntries;
+ TYPE_ENTRY *qte;
+ LPOLESTR qsz;
+ HTENTRY hte;
+ STL_TYPEINFO *pstltinfo;
+
+ m_bmData.Lock();
+
+ // Walk the Type_Entries by walking the hash table buckets
+
+ cTypeEntries = 0;
+ for (iBucket = 0; iBucket < GTLIBOLE_cBuckets; iBucket++) {
+ hte = m_rghteBucket[iBucket];
+ while (hte != HTENTRY_Nil) {
+ cTypeEntries++;
+ qte = Qte(hte);
+
+ //
+ // Check the TYPE_ENTRY
+ //
+
+ // Ensure that this entry is in the right hash table
+ qsz = QszOfHsz(qte->m_ste.m_hszLocalTypeId);
+ DebAssert(iBucket == IhteHash(qsz), "");
+
+ // Ensure that the TypeInfo has the correct handle for itself
+ if ((pstltinfo = qte->m_pstltinfo) != NULL) {
+ DebAssert(pstltinfo->m_hte == hte, "");
+ }
+
+ // Ensure that there is an sz name string
+ DebAssert(qte->m_ste.m_hlnamType != HLNAM_Nil, "");
+
+ hte = qte->m_hteNext;
+ } // while
+ } // for
+ // Ensure that number of entries in hash table matches number of entries
+ DebAssert(cTypeEntries == m_cTypeEntries, "");
+
+ // Ensure that the size of m_bdte is correct
+ DebAssert(m_bdte.CbSize() == cTypeEntries * sizeof(TYPE_ENTRY), "");
+
+ m_bmData.Unlock();
+
+ // Check the binding tables
+ m_gptbind.DebCheckState(uLevel);
+}
+
+
+
+#endif // ID_DEBUG
+
+// catches vector destructor code generation
+#if OE_MAC
+#pragma code_seg(CS_INIT)
+#endif
diff --git a/private/oleauto/src/typelib/gtlibole.hxx b/private/oleauto/src/typelib/gtlibole.hxx
new file mode 100644
index 000000000..d1586de6f
--- /dev/null
+++ b/private/oleauto/src/typelib/gtlibole.hxx
@@ -0,0 +1,1220 @@
+/***
+*gtlibole.hxx - GenericTypeLibOLE header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Defines GenericTypeLibOLE interface which is an implementation
+* of the IDynTypeLib protocol which allows TYPEINFOs to be
+* dynamically added.
+*
+*Revision History:
+*
+* 14-Dec-92 mikewo: Created.
+*
+*****************************************************************************/
+
+#ifndef GTLIBOLE_HXX_INCLUDED
+#define GTLIBOLE_HXX_INCLUDED
+
+#include "clutil.hxx" // needed for SYSKIND_CURRENT
+#include "xstring.h"
+#include "blkmgr.hxx"
+#include "dfstream.hxx"
+#include "ncache.hxx" // NAME_CACHE
+#include "gptbind.hxx" // GENPROJ_TYPEBIND
+#include "nammgr.hxx" // needed for embedded NAMMGR
+#include "obguid.h"
+#include <time.h>
+
+#include "dstrmgr.hxx"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szGTLIBOLE_HXX)
+#define SZ_FILE_NAME g_szGTLIBOLE_HXX
+#endif
+
+TIPERROR GetRegisteredPath(HKEY hkey,
+ LPOLESTR szSubkey,
+ LPOLESTR szPath,
+ LONG *pcbPath,
+ BOOL fMustExist);
+
+
+#define GTLIBOLE_cBuckets 32
+
+#define DEBNAMESIZE 32
+
+// An HTENTRY is an opaque handle for a TYPE_ENTRY in a GenericTypeLibOLE
+// Their internal representation is an index into the TYPE_ENTRY array.
+typedef USHORT HTENTRY;
+
+#define HTENTRY_Nil 0xFFFF
+
+class STL_TYPEINFO;
+class GEN_PROJECT;
+class GEN_DTINFO;
+
+class DOCSTR_MGR;
+
+
+class SER_TYPE_ENTRY
+{
+public:
+ HCHUNK m_hszStrm; // The name of the stream for this typeinfo.
+ HCHUNK m_hszLocalTypeId; // The local typeId of this type.
+ HLNAM m_hlnamType; // This type's name.
+ HCHUNK m_hszTypeInfoTypeId; // The typeId of the true type of the
+ // TYPEINFO instance representing this
+ // type, HCHUNK_Nil if that is the default
+ // TYPEINFO true type for this typelib.
+ USHORT m_usEncodedDocStrSize;
+ HCHUNK m_hszEncodedDocString; // The encoded doc string for this type.
+
+ ULONG m_dwHelpContext; // The help context for this type.
+ HCHUNK m_hszHelpFile; // The help filename for this type.
+ GUID m_guid; // The typeinfo's guid.
+ USHORT m_typekind; // The kind of typeinfo's this is
+
+ SER_TYPE_ENTRY();
+};
+
+/***
+*class TYPE_ENTRY - 'te'
+*Purpose:
+* A GenericTypeLibOLE maintains a TYPE_ENTRY instance for each type which
+* it contains.
+***********************************************************************/
+
+class TYPE_ENTRY
+{
+public:
+
+ // These items are not serialized.
+ HTENTRY m_hteNext; // The next type entry in the hash list.
+ STL_TYPEINFO *m_pstltinfo;
+ // The TYPEINFO for this type, or NULL if
+ // not currently loaded.
+ DOCFILE_STREAM *m_pdfstrm; // The module's DOCFILE_STREAM, or NULL if it
+ // isn't currently open.
+
+ // One of these (never both) is serialized.
+ SER_TYPE_ENTRY m_ste; // The serialized data in the type entry.
+
+ TYPE_ENTRY();
+};
+
+
+/***
+*PUBLIC SER_TYPE_ENTRY::SER_TYPE_ENTRY
+*Purpose:
+* Construct a SER_TYPE_ENTRY.
+***********************************************************************/
+
+inline SER_TYPE_ENTRY::SER_TYPE_ENTRY()
+{
+ m_hszStrm = HCHUNK_Nil;
+ m_hszLocalTypeId = HCHUNK_Nil;
+ m_hlnamType = HLNAM_Nil;
+ m_hszTypeInfoTypeId = HCHUNK_Nil;
+ m_usEncodedDocStrSize = 0;
+ m_hszEncodedDocString = HCHUNK_Nil;
+
+ m_hszHelpFile = HCHUNK_Nil;
+ m_dwHelpContext = 0; // default help context is 0 (not -1)
+
+ m_guid = IID_NULL;
+ m_typekind = TKIND_MAX;
+}
+
+
+/***
+*PUBLIC TYPE_ENTRY::TYPE_ENTRY
+*Purpose:
+* Construct a TYPE_ENTRY.
+***********************************************************************/
+
+inline TYPE_ENTRY::TYPE_ENTRY()
+{
+ m_pstltinfo = NULL;
+ m_pdfstrm = NULL;
+}
+
+
+/***
+*class GenericTypeLibOLE - 'gtlibole'
+*Purpose:
+* Implementation of the ITypeLib protocol which supports reading
+* TypeLib's only, and the ICreateTypeLib protocol which supports
+* creating new typelibs.
+* A hash table is used for looking up a TypeInfo in the TypeLib based
+* on its GUID.
+***********************************************************************/
+
+class GenericTypeLibOLE : public ITypeLibA, public ICreateTypeLibA
+{
+friend STL_TYPEINFO;
+friend TYPEMGR;
+friend DOCFILE_STREAM;
+
+friend HRESULT STDAPICALLTYPE CreateTypeLib(SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLibA FAR* FAR* lplptlib);
+friend HRESULT STDAPICALLTYPE LoadTypeLib(LPCOLESTR szFile, ITypeLibA **pptlib);
+
+//#if FV_UNICODE_OLE
+//friend HRESULT STDAPICALLTYPE CreateTypeLibW(SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLib FAR* FAR* lplptlib);
+//#endif //FV_UNICODE_OLE
+
+
+#if ID_TEST
+friend TIPERROR GetSheapSize(UINT argc, BSTRA *rglstr);
+#endif
+
+public:
+ static TIPERROR Create(IStorageA *pstg, GenericTypeLibOLE **pptlib);
+ virtual TIPERROR Init(void);
+
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface)(REFIID riid, VOID FAR* FAR* ppvObj);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ // *** ITypeLib methods ***
+ STDMETHOD_(unsigned int, GetTypeInfoCount)(void);
+ STDMETHOD(GetTypeInfo)(UINT index,
+ ITypeInfoA FAR* FAR* lplptinfo);
+ STDMETHOD(GetTypeInfoType)(UINT index,
+ TYPEKIND FAR* ptypekind);
+ STDMETHOD(GetTypeInfoOfGuid)(REFGUID guid,
+ ITypeInfoA FAR* FAR* lplptinfo);
+ STDMETHOD(GetLibAttr)(TLIBATTR FAR* FAR* lplptlibattr);
+ STDMETHOD(GetTypeComp)(ITypeCompA FAR* FAR* lplptcomp);
+ STDMETHOD(GetDocumentation)(INT index,
+ LPBSTR lpbstrName,
+ LPBSTR lpbstrDocString,
+ LPDWORD lpdwHelpContext,
+ LPBSTR lpbstrHelpFile);
+ STDMETHOD(IsName)(OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ int FAR* lpfName);
+ STDMETHOD(FindName)(OLECHAR FAR* szNameBuf,
+ unsigned long lHashVal,
+ ITypeInfoA FAR* FAR* rgptinfo,
+ MEMBERID FAR* rgmemid,
+ unsigned short FAR* pcFound);
+ STDMETHOD_(void, ReleaseTLibAttr)(TLIBATTR FAR* lptlibattr);
+
+ // *** ICreateTypeLib methods ***
+ STDMETHOD(CreateTypeInfo)(LPOLESTR szName,
+ TYPEKIND tkind,
+ ICreateTypeInfoA FAR* FAR* ppctinfo);
+ STDMETHOD(SetName)(LPOLESTR szName);
+ STDMETHOD(SetVersion)(WORD wMajorVerNum, WORD wMinorVerNum);
+ STDMETHOD(SetGuid)(REFGUID guid);
+ STDMETHOD(SetDocString)(LPOLESTR szDoc);
+ STDMETHOD(SetHelpFileName)(LPOLESTR szHelpFileName);
+ STDMETHOD(SetHelpContext)(DWORD dwHelpContext);
+ STDMETHOD(SetLcid)(LCID lcid);
+ STDMETHOD(SetLibFlags)(UINT uLibFlags);
+ STDMETHOD(SaveAllChanges)(void);
+
+ STDMETHOD(SaveAllChanges)(IStorageA FAR *pstg);
+
+ nonvirt TIPERROR GetGdtiOfItyp(UINT ityp, GEN_DTINFO **ppgdti);
+
+ nonvirt TIPERROR SaveOrCopyChanges(IStorageA *pstg, BOOL shouldCopy);
+ nonvirt TIPERROR GetIndexOfName(LPSTR szName, WORD *pw);
+ nonvirt TIPERROR GetTypeInfoLocal(TYPEID szLocalTypeId,
+ ITypeInfoA **pptinfo);
+
+ nonvirt TIPERROR GetIndexOfLocalRegId(LPOLESTR szLocalTypeId, WORD *pw);
+ nonvirt TIPERROR GetCompressedTypeId(ITypeInfoA *ptinfo, BSTR *pbstrOut);
+ nonvirt TIPERROR WriteTypeId(STREAM *pstrm, ITypeInfoA *ptinfo);
+ nonvirt TIPERROR TypeInfoFromCompressedTypeId(LPOLESTR szTypeId,
+ ITypeInfoA **pptinfo);
+
+
+ nonvirt TIPERROR FindMembers(LPSTR szName,
+ unsigned long lHashVal,
+ ITypeInfoA **rgptinfo,
+ MEMBERID *rgmemid,
+ USHORT *pcSearch);
+
+ // NAME_CACHE methods
+ nonvirt BOOL IsExistNameCache() const;
+ nonvirt BOOL IsValidNameCache(UINT inamcache) const;
+ nonvirt BOOL IsNameInCache(UINT inamcache, HGNAM hgnam) const;
+ nonvirt TIPERROR LoadNameCache();
+ nonvirt VOID InvalidateNameCache(UINT inamcache);
+ nonvirt VOID SetValidNameCache(UINT inamcache);
+ nonvirt TIPERROR AddNameToCache(UINT inamcache, HGNAM hgnam);
+
+ nonvirt TIPERROR Add(GEN_DTINFO *pstltinfo, LPOLESTR szName);
+ nonvirt TIPERROR UpdateTypeId(UINT itype);
+
+ nonvirt TIPERROR SetTypeName(UINT i, LPOLESTR szName);
+ nonvirt TIPERROR SetTypeDocString(UINT i, LPOLESTR szDocString);
+ nonvirt TIPERROR SetTypeHelpContext(UINT i, DWORD dwHelpContext);
+ nonvirt VOID GetTypeGuid(UINT i, GUID FAR *pguid);
+ nonvirt VOID SetTypeGuid(UINT i, REFGUID guid);
+ nonvirt VOID SetTypeKind(UINT i, TYPEKIND tkind);
+ nonvirt TIPERROR GetHstOfHelpString(XSZ_CONST szDocStr, HST *hst);
+ nonvirt TIPERROR EncodeHelpStrings();
+ nonvirt TIPERROR GetDstrMgr(DOCSTR_MGR **ppdstrmgr);
+
+ nonvirt BOOL IsModified();
+ nonvirt TIPERROR SetModified(BOOL isModified);
+
+
+ nonvirt BOOL StriEq(XSZ_CONST szStr1, XSZ_CONST szStr2);
+
+ nonvirt TIPERROR GetDirectory(BSTR *pbstr);
+
+ nonvirt TIPERROR SetLibId(LPOLESTR szLibId);
+#if 0
+ nonvirt TIPERROR GetLibId(BSTR *pbstr);
+#endif
+
+ nonvirt TIPERROR GetStorage(DWORD stgm, IStorageA **ppstg);
+ nonvirt TIPERROR OpenTypeStream(UINT hte,
+ STREAM_OPEN_MODE som,
+ STREAM **ppstrm);
+
+ // Release binding resources method.
+ nonvirt VOID ReleaseResources();
+
+ // Method to create proj-level typebind
+ nonvirt TIPERROR GetTypeBind();
+
+ // Method to lookup a name in proj-level binding table
+ nonvirt TIPERROR GetBinddescOfSzName(LPSTR szName,
+ GENPROJ_BIND_DESC *pprojbinddesc);
+
+ // Method to map a qualified name to a typelib
+ nonvirt TIPERROR GetTypelibOfRgbstr(UINT cNames,
+ BSTRA *rgbstr,
+ ITypeLibA **pptlib);
+
+ // Method to map a non-qualified name to a typeinfo
+ nonvirt TIPERROR GetTypeInfoOfSzName(LPSTR szName,
+ ITypeInfoA **pptinfo);
+
+ // Accessor to produce embedded typebind
+ nonvirt GENPROJ_TYPEBIND *Pgptbind();
+
+ // NAMMGR methods
+ TIPERROR GetNamMgr(NAMMGR **ppnammgr);
+ ULONG GetSampleHashVal();
+
+ nonvirt LCID GetLcid();
+ nonvirt SYSKIND GetSyskind();
+ nonvirt SHEAP_MGR *Psheapmgr();
+
+ nonvirt TYPE_ENTRY *Qte(HTENTRY hte) const;
+
+ nonvirt BOOL IsProjectDBCS() { return m_isDBCS; };
+
+ USHORT MajorVerNum();
+ VOID SetMajorVerNum(USHORT wVer);
+
+ USHORT MinorVerNum();
+ VOID SetMinorVerNum(USHORT wVer);
+
+ GUID Guid();
+ VOID SetLibGuid(GUID guid);
+
+ // Versioning information.
+ WORD GetVersion();
+ VOID SetDualTypeLib();
+
+// Debugging methods
+#if ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel);
+ nonvirt VOID DebShowState(UINT uLevel);
+#else //!ID_DEBUG
+ nonvirt VOID DebCheckState(UINT uLevel) {}
+ nonvirt VOID DebShowState(UINT uLevel) {}
+#endif //!ID_DEBUG
+
+ // Offset of embedded GENPROJ_TYPEBIND member
+ // used to get pointer to STL_TYPEBIND instance
+ // from within the embedded member.
+ // NOTE: we don't make this protected and provide a public
+ // accessor since such a method would want to be inline
+ // and would reference the protected static member in the
+ // header file -- which eventually results in an unresolved
+ // external in hxxtoinc.
+ // I.e. leave this as a public member -- when we can
+ // use a compiler the correctly implements const static
+ // initializers then this can be a const (and thus safe).
+ //
+ static CONSTDATA UINT oGptbind;
+
+#if ID_DEBUG
+ // Used for typelib leak reporting.
+ CHAR *SzDebName();
+ ULONG CRefs();
+#endif // ID_DEBUG
+
+ // Access functions for name cache stats
+ nonvirt VOID DebResetNameCacheStats();
+
+ nonvirt VOID DebSetNameCacheModTrys();
+ nonvirt VOID DebSetNameCacheModHits();
+ nonvirt VOID DebSetNameCacheGlobHits();
+
+ nonvirt UINT DebGetNameCacheModHits();
+ nonvirt UINT DebGetNameCacheModTrys();
+ nonvirt UINT DebGetNameCacheGlobHits();
+
+protected:
+ // CONSIDER: make both operator new and operator delete
+ // private and "undefined" -- i.e. assert in debug --
+ // in addition, "macro expand" the respective calls
+ // to new and delete in CreateNew() and Release(). The
+ // advantage is that it's clearer to the reader what is
+ // actually going on in terms of memory mgmt and stresses
+ // that the only way to alloc/free instances is via
+ // the Create/Release paradigm.
+ //
+ void *operator new(size_t cbSize);
+ GenericTypeLibOLE();
+ virtual ~GenericTypeLibOLE();
+
+ nonvirt TIPERROR Read();
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt UINT IhteHash(TYPEID TypeId);
+ nonvirt VOID RelTypeEntExtResources(HTENTRY hte);
+ nonvirt VOID *QtrOfHChunk(HCHUNK hv);
+ nonvirt LPOLESTR QszLibIdOrFile();
+ nonvirt LPOLESTR QszOfHsz(HCHUNK hsz);
+ nonvirt LPOLESTR SzLocalTypeId(TYPEID TypeId);
+ nonvirt LPOLESTR GetQszTypeInfoTypeId(HTENTRY hte);
+ nonvirt TIPERROR SetDirectory(LPOLESTR szFile);
+ nonvirt TIPERROR MakeRelativeLibId(LPOLESTR szLibId, LPOLESTR *pmszLibIdRel);
+ nonvirt TIPERROR CreateInstance(LPOLESTR szTypeId, void **ppvoid);
+
+// Modification and writing methods.
+ nonvirt TIPERROR AddTypeEntry(LPSTR szName,
+ LPOLESTR szTypeInfoTypeId,
+ HTENTRY *phte);
+ nonvirt void UnAddTypeEntry(UINT hte);
+ nonvirt TIPERROR MakeLocalTypeId(HCHUNK *phchunkTypeId);
+ nonvirt TIPERROR CreateHsz(LPOLESTR sz, HCHUNK *phchunk);
+ nonvirt HTENTRY *QHteRef(HTENTRY i);
+ nonvirt TIPERROR ResetHsz(LPOLESTR sz, HCHUNK *phchunk);
+ nonvirt VOID DeleteHsz(HCHUNK hchunk);
+ nonvirt TIPERROR Write();
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt VOID DestructTypeEntry(HTENTRY hte);
+ nonvirt TIPERROR CloneChunk(HCHUNK hSrc, UINT cbSrc, HCHUNK *phDest);
+ nonvirt TIPERROR CloneString(HCHUNK hszSrc, HCHUNK *phszDest);
+
+ // Serialization helper functions
+ nonvirt TIPERROR ReadString(STREAM *pstrm, HCHUNK *phsz);
+ nonvirt TIPERROR WriteString(STREAM *pstrm, HCHUNK hsz);
+
+#if ID_DEBUG
+ // The name of this typelib.
+ CHAR m_szDebName[DEBNAMESIZE];
+#endif // ID_DEBUG
+
+ BOOL m_fDirModified; // Is the directory info modified?
+
+ BOOL m_isModified;
+ // Is the directory info or any contained typeinfo modified?
+
+// Methods accessed by STL_TYPEINFO
+ nonvirt VOID Deleting(HTENTRY hte);
+
+ // NAME_CACHE methods
+ nonvirt TIPERROR ReadNameCacheArray();
+ nonvirt NAME_CACHE *Rgnamcache() const;
+
+// static constant data members
+ static CONSTDATA WORD wFirstSerWord;
+ static CONSTDATA WORD wDefaultVersion;
+ static CONSTDATA WORD wDualVersion;
+ static CONSTDATA WORD wMaxVersion;
+ static CONSTDATA XCHAR chMinorVerNumSep;
+ static CONSTDATA OLECHAR chLibIdSep;
+ static CONSTDATA LPOLESTR szDirStreamName;
+
+// non-static data members
+ // Not needed really for Win16 but useful for other
+ // platforms.
+ // CONSIDER: synthesize for Win16 from selector and offset 0.
+ // Note: must be protected so that derived classes
+ // can initialize.
+ //
+ SHEAP_MGR *m_psheapmgr;
+
+ BLK_DESC m_bdte;
+ BLK_MGR m_bmData;
+ IStorageA *m_pstg;
+ IStorageA *m_pstgContainer; // NULL unless m_pstg is a substorage.
+ ULONG m_cRefs;
+ HCHUNK m_hszDirectory;
+ // The directory containing this typelib. Set by LoadTypeLib.
+ // Never ends in a backslash in non-mac builds. HCHUNK_Nil if not known.
+
+ HCHUNK m_hszFile;
+ // The full path, or HCHUNK_Nil if unknown.
+
+ // These members (or the data referenced by the HCHUNKs) are all
+ // serialized, except where noted.
+ HTENTRY m_rghteBucket[GTLIBOLE_cBuckets];
+ HCHUNK m_hlnamLib;
+ USHORT m_cTypeEntries;
+ HCHUNK m_hszDefaultTITypeId;
+ HCHUNK m_hszDocString; // The lib's short doc string.
+ ULONG m_dwHelpContext; // The lib's help context.
+ HCHUNK m_hszHelpFile; // The lib's help filename.
+ USHORT m_syskind; // The lib's current syskind.
+ LCID m_lcid; // the lib's language id
+ BOOL m_lcidZero; // Was this typelib created with lcid == 0;
+ WORD m_wCurVersion; // The version of this typelib.
+ USHORT m_wLibFlags; // the lib's flags
+
+ USHORT m_wMajorVerNum; // The major and minor version numbers
+ USHORT m_wMinorVerNum; // of the typelib.
+ GUID m_guid; // The lib's GUID.
+
+ // These members are not serialized.
+
+ BOOL m_fNamespaceChange;
+ ULONG m_lSampleHashVal; // for space optimization(e.g nammgr)
+
+ // The embedded GENPROJ_TYPEBIND -- this is serialized.
+ GENPROJ_TYPEBIND m_gptbind;
+
+ // Serialization position of m_gptbind
+ // set by GenericTypeLibOLE::Read() and used by
+ // GenericTypeLibOLE::GetTypeBind()
+ //
+ LONG m_lPosGptbind;
+
+ // Indicates whether gptbind has been deserialized.
+ BOOL m_fGptbindDeserialized;
+
+
+ // REVISION MARK: 22-Feb-93 ilanc: added following line
+ //
+ // Nammgr related data members
+ //
+
+ // Serialization position of NAMMGR array:
+ // set by GenericTypeLibOLE::Read() and used by
+ // GenericTypeLibOLE::GetNamMgr()
+ //
+ LONG m_lPosNammgr;
+
+ // Indicates whether nammgr has been deserialized.
+ BOOL m_fNammgrDeserialized;
+
+ // The nammgr itself. This is serialized.
+ NAMMGR m_nammgr;
+
+ // END OF REVISION MARK: 22-Feb-93 ilanc
+
+ //
+ // Name cache related data members
+ //
+
+ // Serialization position of NAME_CACHE array:
+ // set by GenericTypeLibOLE::GetNamMgr() and used by
+ // GenericTypeLibOLE::ReadNameCacheArray()
+ //
+ LONG m_lPosRgnamcache;
+
+ // flag word: note only a single bit is really needed here
+ // so if you want more flags, turn this into a bitfield.
+ //
+ USHORT m_hasValidDiskImageNameCache;
+
+ // The cache itself. This is serialized.
+ // Note: the cache is loaded iff its BLK_DESC is valid.
+ // When constructed it is invalidated so that
+ // deserialization will Init(), and then
+ // actually read it in.
+ //
+ BLK_DESC m_bdRgnamcache;
+ // Persistent Name cache array --
+ // 0th element is project's cache, 1..N are TYPEINFO's.
+
+ BOOL m_isDBCS; // TRUE iff lcid is a double-byte locale id
+
+ // Serialization position of DOCSTR_MGR
+ // GenericTypeLibOLE::GetDstrMgr()
+ //
+ LONG m_lPosDstrmgr;
+
+ // Indicates whether nammgr has been deserialized.
+ BOOL m_fDstrmgrDeserialized;
+
+ DOCSTR_MGR m_dstrmgr;
+
+#if ID_TEST
+ // Name cache statistics
+ UINT m_cNameCacheModTrys;
+ UINT m_cNameCacheModHits;
+ UINT m_cNameCacheGlobHits;
+#endif
+
+private:
+ // NOTE: must be declared inline since defined later inline and
+ // cfront otherwise complains that declared with
+ // external linkage and used before defined as inline.
+ // I believe that this is because a derived class's dtor
+ // is implicitly declared and defined as inline. (???)
+ // 10-Jun-92 ilanc
+ //
+ inline void operator delete(void *pv);
+
+};
+
+
+/***
+*PRIVATE GenericTypeLibOLE::operator delete
+*Purpose:
+* Deletes the SHEAP_MGR instance that held the GenericTypeLibOLE instance.
+*
+*Entry:
+* pv - Pointer to GenericTypeLibOLE to delete.
+* NOTE: we assume that the truetype of pv is GenericTypeLibOLE
+* and thus we know we can cast and correctly offset
+* into the instance to retrieve the m_psheapmgr datamember.
+*
+* Disaster will result if the dtor ever decides to delete
+* the m_psheapmgr member itself or just reset it.
+*
+* NOTE: operator delete MUST be private in all implementations
+* of GenericTypeLibOLE (as of today 06-Aug-92 GenericTypeLibOLE
+* and GEN_PROJECT) since we want to *require*
+* it being called from virtual Release() such that the
+* true type of pv be known. By making it private we ensure
+* that a base operator delete can't be called.
+*
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline VOID GenericTypeLibOLE::operator delete(void *pv)
+{
+ // delete ((SHEAP_MGR *)pv - 1);
+ // 09-Jun-92 ilanc
+ DebAssert( ((GenericTypeLibOLE *)pv)->m_psheapmgr != NULL,
+ "null sheapmgr.");
+ delete ((GenericTypeLibOLE *)pv)->m_psheapmgr;
+}
+
+
+/***
+*PROTECTED GenericTypeLibOLE::Qte
+*Purpose:
+* Method to map hte to pointer to TYPE_ENTRY
+*
+*Entry:
+* hte - handle for the TYPE_ENTRY
+*
+*Exit:
+* Qte - pointer to the TYPE_ENTRY
+*
+***********************************************************************/
+
+inline TYPE_ENTRY *GenericTypeLibOLE::Qte(HTENTRY hte) const
+{
+ DebAssert(hte * sizeof(TYPE_ENTRY) <= m_bdte.CbSize(), "Out of bounds");
+
+ return ((TYPE_ENTRY *)m_bdte.QtrOfBlock()) + hte;
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::IsModified
+* This is a internal flag. There is a external flag added to GenProj
+* to track the changes due to user action.
+*Exit:
+* BOOL - TRUE if the project has changes to save.
+*
+***********************************************************************/
+inline BOOL GenericTypeLibOLE::IsModified()
+{
+ return m_isModified;
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::Psheapmgr
+*Purpose:
+* To return a pointer to the SHEAP_MGR associated with a GenericTypeLibOLE
+* or any ITypeLib whose new operation delegates to GenericTypeLibOLE::new
+*
+*Entry:
+*
+*Exit:
+* Return a pointer to the SHEAP_MGR
+*
+***********************************************************************/
+
+inline SHEAP_MGR *GenericTypeLibOLE::Psheapmgr()
+{
+ DebAssert(m_psheapmgr != NULL, "uninitialized SHEAP_MGR.");
+
+ return m_psheapmgr;
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::Pgptbind
+*Purpose:
+* Produces pointer to embedded proj-level typebind.
+*
+*Entry:
+*
+*Exit:
+* Return a pointer to the GENPROJ_TYPEBIND
+*
+***********************************************************************/
+
+inline GENPROJ_TYPEBIND *GenericTypeLibOLE::Pgptbind()
+{
+ return &m_gptbind;
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::RelTypeEntExtResources
+*Purpose:
+* Release the resources owned by a TYPE_ENTRY which are external
+* to a TypeLib; i.e. not in the TypeLib's heap.
+*
+*Entry:
+* hte - index to TYPE_ENTRY
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline VOID GenericTypeLibOLE::RelTypeEntExtResources(HTENTRY hte)
+{
+}
+
+
+/***
+*IsExistNameCache() - does name cache exist at all?
+*Purpose:
+* Tests whether cache exists at all -- whether it was
+* loaded or created.
+*
+*Entry:
+* None.
+*
+*Exit:
+* TRUE if BLK_DESC containing cache has been inited.
+* FALSE otherwise.
+***********************************************************************/
+
+inline BOOL GenericTypeLibOLE::IsExistNameCache() const
+{
+ return m_bdRgnamcache.IsValid();
+}
+
+
+/***
+*Rgnamcache() - Get pointer to NAME_CACHE array
+*Purpose:
+* Returns a pointer the NAME_CACHE array
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns a pointer to the NAME_CACHE array. The pointer
+* is only valid for a short time.
+*
+***********************************************************************/
+
+inline NAME_CACHE *GenericTypeLibOLE::Rgnamcache() const
+{
+ return (NAME_CACHE *)m_bdRgnamcache.QtrOfBlock();
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::IsValidNameCache
+*Purpose:
+* Tests if a given type's NAME_CACHE is valid.
+* If not loaded, does NOT load the NAME_CACHE array.
+*
+*Entry:
+* inamcache index of TYPEINFO in library + 1.
+* Zero is reserved for project's cache.
+*
+*Exit:
+* TRUE if type's NAME_CACHE loaded and valid
+* FALSE otherwise.
+*
+***********************************************************************/
+
+inline BOOL GenericTypeLibOLE::IsValidNameCache(UINT inamcache) const
+{
+ return IsExistNameCache() && Rgnamcache()[inamcache].IsValid();
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::IsNameInCache
+*Purpose:
+* Tests if a given name is in a given cache.
+* If not loaded, does NOT load the NAME_CACHE array.
+*
+*Entry:
+* inamcache index of TYPEINFO in library + 1.
+* hgnam Global name handle to test for.
+*
+*Exit:
+* TRUE if type's NAME_CACHE loaded, valid and name is in cache.
+* FALSE otherwise.
+*
+***********************************************************************/
+
+inline BOOL GenericTypeLibOLE::IsNameInCache(UINT inamcache, HGNAM hgnam) const
+{
+ return IsExistNameCache() && Rgnamcache()[inamcache].IsNameInCache(hgnam);
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::SetValidNameCache
+*Purpose:
+* Sets a given name cache to be valid.
+*
+*Entry:
+* inamcache index of TYPEINFO in library + 1.
+*
+*Exit:
+* None
+***********************************************************************/
+
+inline VOID GenericTypeLibOLE::SetValidNameCache(UINT inamcache)
+{
+ Rgnamcache()[inamcache].SetValid();
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::DestructTypeEntry
+*Purpose:
+* Release all resources owned by a TYPE_ENTRY.
+*
+*Entry:
+* hte - pointer to the TYPE_ENTRY whose resources are to be released.
+*
+*Exit:
+* None.
+***********************************************************************/
+
+inline VOID GenericTypeLibOLE::DestructTypeEntry(HTENTRY hte)
+{
+ // Release all external resources.
+ RelTypeEntExtResources(hte);
+
+ // Release all resources allocated to m_bmData.
+ DeleteHsz(Qte(hte)->m_ste.m_hszLocalTypeId);
+ DeleteHsz(Qte(hte)->m_ste.m_hszTypeInfoTypeId);
+
+}
+
+
+
+/***
+* BOOL StrEqi
+*
+* Purpose: locale-specific string equality.
+* returns TRUE if equal, FALSE if not equal
+* case/accent insensitive, according to codepage/locale specified.
+*
+* Inputs:
+* szStr1 : String to be compared
+* szStr2 : String to be compared
+*
+*
+* Outputs: BOOL : return TRUE if the strings passed in are equal
+* else return FALSE
+*
+*NOTE:- Defer to nammgr.
+*****************************************************************************/
+inline BOOL GenericTypeLibOLE::StriEq(XSZ_CONST szStr1, XSZ_CONST szStr2)
+{
+ DebAssert(m_nammgr.IsValid() && m_fNammgrDeserialized == TRUE ,
+ "whoops! nammgr should be valid and deserialized.");
+
+ return m_nammgr.StriEq(szStr1, szStr2);
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::GetLcid()
+*Purpose:
+*
+*Entry:
+* None
+*
+*Exit:
+* Returns the local code of the project
+*
+***********************************************************************/
+inline LCID GenericTypeLibOLE::GetLcid()
+{
+ return m_lcid;
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::GetSyskind()
+*Purpose:
+*
+*Entry:
+* None
+*
+*Exit:
+* Returns the local code of the project
+*
+***********************************************************************/
+inline SYSKIND GenericTypeLibOLE::GetSyskind()
+{
+ return (SYSKIND)m_syskind;
+
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::ResetNameCacheStats()
+*Purpose:
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+inline VOID GenericTypeLibOLE::DebResetNameCacheStats()
+{
+#if ID_TEST
+ m_cNameCacheModTrys =
+ m_cNameCacheModHits =
+ m_cNameCacheGlobHits = 0;
+#endif // ID_TEST
+}
+
+
+
+/***
+*PUBLIC GenericTypeLibOLE::VerifyProjChange()
+*Purpose:
+* Returns the sample hash value. This is calculated when the typelib is
+* loaded.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+inline ULONG GenericTypeLibOLE::GetSampleHashVal()
+{
+ // if the hash value is not initialized yet then initialize it now.
+ if (m_lSampleHashVal == 0) {
+#if OE_WIN32
+ m_lSampleHashVal = LHashValOfNameSysW(GetSyskind(), GetLcid(), L" ");
+#else
+ m_lSampleHashVal = LHashValOfNameSysA(GetSyskind(), GetLcid(), " ");
+#endif
+ }
+ return m_lSampleHashVal;
+}
+
+
+
+/***
+*PROTECTED GenericTypeLibOLE::DeleteHsz
+*Purpose:
+* Release the chunk that an Hsz is stored in.
+*
+*Entry:
+* hsz - hchunk of m_bmData which contains an xsz
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+
+inline VOID GenericTypeLibOLE::DeleteHsz(HCHUNK hchunk)
+{
+ if (hchunk != HCHUNK_Nil)
+ m_bmData.FreeChunk(hchunk, ostrblen0(QszOfHsz(hchunk)));
+}
+
+
+/***
+*PUBLIC GenericTypeLibOLE::GetTypeGuid
+*Purpose:
+* Set the guid of the ith TypeInfo.
+*
+*Entry:
+* i - index of TypeInfo to be changed
+* guid - The new guid.
+*
+*Exit:
+* HRESULT
+*
+***********************************************************************/
+inline VOID GenericTypeLibOLE::GetTypeGuid(UINT i, GUID FAR *pguid)
+{
+ DebAssert(i >= 0 || i < m_cTypeEntries, "GetTypeGuid");
+ *pguid = Qte(i)->m_ste.m_guid;
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::SetTypeGuid
+*Purpose:
+* Set the guid of the ith TypeInfo.
+*
+*Entry:
+* i - index of TypeInfo to be changed
+* guid - The new guid.
+*
+*Exit:
+* None
+*
+***********************************************************************/
+inline VOID GenericTypeLibOLE::SetTypeGuid(UINT i, REFGUID guid)
+{
+ DebAssert(i >= 0 || i < m_cTypeEntries, "SetTypeGuid");
+
+ Qte(i)->m_ste.m_guid = guid;
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::SetTypeKind
+*Purpose:
+* Set the guid of the ith TypeInfo.
+*
+*Entry:
+* i - index of TypeInfo to be changed
+* tkind - The new typekind.
+*
+*Exit:
+* HRESULT
+*
+***********************************************************************/
+inline VOID GenericTypeLibOLE::SetTypeKind(UINT i, TYPEKIND tkind)
+{
+ DebAssert(i >= 0 || i < m_cTypeEntries, "SetTypeKind");
+
+ Qte(i)->m_ste.m_typekind = tkind;
+}
+
+
+
+/***
+*PUBLIC MajorVerNum
+*Purpose:
+* Setter and getter for m_wMajorVerNum.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+inline USHORT GenericTypeLibOLE::MajorVerNum()
+{
+ return m_wMajorVerNum;
+}
+
+inline VOID GenericTypeLibOLE::SetMajorVerNum(USHORT wVer)
+{
+ m_wMajorVerNum = wVer;
+}
+
+
+
+/***
+*PUBLIC MinorVerNum
+*Purpose:
+* Setter and getter for m_wMinorVerNum.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+inline USHORT GenericTypeLibOLE::MinorVerNum()
+{
+ return m_wMinorVerNum;
+}
+
+inline VOID GenericTypeLibOLE::SetMinorVerNum(USHORT wVer)
+{
+ m_wMinorVerNum = wVer;
+}
+
+
+
+
+/***
+*PUBLIC Guid
+*Purpose:
+* Setter and getter for m_guid
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+inline GUID GenericTypeLibOLE::Guid()
+{
+ return m_guid;
+}
+
+inline VOID GenericTypeLibOLE::SetLibGuid(GUID guid)
+{
+ m_guid = guid;
+}
+
+
+/***
+*PUBLIC Guid
+*Purpose:
+* Setter and getter for m_wCurVersion.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+inline WORD GenericTypeLibOLE::GetVersion()
+{
+ return m_wCurVersion;
+}
+
+inline VOID GenericTypeLibOLE::SetDualTypeLib()
+{
+ m_wCurVersion = wDualVersion;
+}
+
+#if ID_DEBUG
+/***
+*PUBLIC SzDebName, CRefs
+*Purpose:
+* Accessor functions for memory leak reporting.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+inline CHAR *GenericTypeLibOLE::SzDebName()
+{
+ return m_szDebName;
+}
+
+inline ULONG GenericTypeLibOLE::CRefs()
+{
+ return m_cRefs;
+}
+#endif // ID_DEBUG
+
+/***
+*PUBLIC GenericTypeLibOLE::GetSetNameCacheProjTrys()
+*Purpose:
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+inline VOID GenericTypeLibOLE::DebSetNameCacheModTrys()
+{
+#if ID_TEST
+ m_cNameCacheModTrys++;
+#endif // ID_TEST
+}
+
+inline VOID GenericTypeLibOLE::DebSetNameCacheModHits()
+{
+#if ID_TEST
+ m_cNameCacheModHits++;
+#endif // ID_TEST
+}
+
+inline VOID GenericTypeLibOLE::DebSetNameCacheGlobHits()
+{
+#if ID_TEST
+ m_cNameCacheGlobHits++;
+#endif // ID_TEST
+}
+
+/***
+*PUBLIC GenericTypeLibOLE::GetNameCacheProjTrys()
+*Purpose:
+*
+*Entry:
+* None
+*
+*Exit:
+* returns m_cNameCacheProjTrys
+*
+***********************************************************************/
+inline UINT GenericTypeLibOLE::DebGetNameCacheModTrys()
+{
+#if ID_TEST
+ return m_cNameCacheModTrys;
+#else
+ return 0;
+#endif // ID_TEST
+}
+
+inline UINT GenericTypeLibOLE::DebGetNameCacheModHits()
+{
+#if ID_TEST
+ return m_cNameCacheModHits;
+#else
+ return 0;
+#endif // ID_TEST
+}
+
+inline UINT GenericTypeLibOLE::DebGetNameCacheGlobHits()
+{
+#if ID_TEST
+ return m_cNameCacheGlobHits;
+#else
+ return 0;
+#endif // ID_TEST
+}
+
+
+#endif // ! GTLIBOLE_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/gtlibstg.cxx b/private/oleauto/src/typelib/gtlibstg.cxx
new file mode 100644
index 000000000..69e33d690
--- /dev/null
+++ b/private/oleauto/src/typelib/gtlibstg.cxx
@@ -0,0 +1,1609 @@
+/***
+*gtlibstg.cxx - Light-weight implementations of IStorage and IStream.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This is used in IE_OLE build only as the default underlying IStorage
+* and IStream implementations for serializing ITypeLib.
+*
+*Revision History:
+* [00] Sept-01-93 mikewo: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "typelib.hxx"
+#include "silver.hxx"
+#include "xstring.h"
+#include "cltypes.hxx"
+#include "clutil.hxx"
+#include "gtlibstg.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+#if OE_MAC
+#include <ctype.h>
+#include "macos\resource.h"
+#include "macos\errors.h"
+#include "macos\files.h"
+#endif
+
+#if OE_WIN16
+#include "dos.h"
+#endif // OE_WIN16
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+static char szOleGtlibstgCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleGtlibstgCxx
+#else
+static char szGtlibstgCxx[] = __FILE__;
+#define SZ_FILE_NAME szGtlibstgCxx
+#endif
+#endif //ID_DEBUG
+
+#if OE_MAC
+#define _llseek _lseek // UNDONE MAC: (dougf) correct?
+#endif //OE_MAC
+
+/////////////////////////////////////////////////////////////////////////////
+// Implementation of GTLibStorage
+/////////////////////////////////////////////////////////////////////////////
+
+
+#define CB_GTLIBSTREAM_NAME_MAX 11
+
+// The streaminfo structure used in memory.
+struct StreamInfo {
+ ULONG ulCb; // Length of the stream.
+ union {
+ ULONG ulOffset; // Offset of the stream from the start of the lockbytes.
+ struct {
+ USHORT istrminfoOrg;
+ USHORT istrminfoCur;
+ } map;
+ };
+ LPSTR szName; // Pointer into the name table of the stream's name.
+};
+
+// The streaminfo structure that appears in the serialized format.
+// In the file, there is an array of these which is sorted alphabetically
+// by stream name.
+struct SerStreamInfo {
+ ULONG ulCb; // Length of the stream.
+ USHORT wOffsetName; // Offset of the name in the name table.
+ USHORT wNextStream; // Index into this array of the next stream.
+ // This linked list specifies the order of the
+ // actual stream data in the file.
+};
+
+#define SZ_GTLibStgHdr_Swap "lssss" GUID_Layout
+#define SZ_SerStreamInfo_Swap "lss"
+
+/***
+* OpenForReadOnly - Opens a GTLibStorage on the specified ILockBytes.
+****************************************************************************/
+#pragma code_seg(CS_INIT)
+HRESULT GTLibStorage::OpenForReadOnly(ILockBytesA FAR *plockbytes, IStorageA FAR * FAR *ppstg)
+{
+ BYTE rgbHeaderBuf[256];
+ HRESULT hresult;
+ GTLibStorage FAR *pgtlstg;
+ ULONG cbRead, ulOffset;
+ ULARGE_INTEGER uli;
+ UINT cstrm, cbSer, cbMem, istrm, istrmNext;
+ SerStreamInfo *pserstrminfo;
+ StreamInfo *pstrminfo, *pstrminfoLim;
+ LPSTR szNameTable;
+ LPVOID pvHdrData;
+
+ // Read the header and a bunch of bytes following it, hoping to get
+ // the entire directory table in this one read.
+ uli.LowPart = uli.HighPart = 0;
+ IfOleErrRet(plockbytes->ReadAt(uli, rgbHeaderBuf, sizeof(rgbHeaderBuf), &cbRead));
+#if HP_BIGENDIAN
+ SwapStruct(rgbHeaderBuf, SZ_GTLibStgHdr_Swap);
+#endif // HP_BIGENDIAN
+
+ // If there weren't even enough bytes for the header or if the signature
+ // is wrong, then return INVDATAREAD.
+ if (cbRead < sizeof(GTLibStgHdr) ||
+ ((GTLibStgHdr *)rgbHeaderBuf)->ulSignature != GTLIBSTORAGE_SIGNATURE)
+ return HresultOfScode(TYPE_E_INVDATAREAD);
+
+ cstrm = ((GTLibStgHdr *)rgbHeaderBuf)->wCStrm;
+ cbSer = cstrm * sizeof(SerStreamInfo) + ((GTLibStgHdr *)rgbHeaderBuf)->wCbNameTable;
+ cbMem = cstrm * sizeof(StreamInfo) + ((GTLibStgHdr *)rgbHeaderBuf)->wCbNameTable;
+
+ // Allocate enough memory to hold the stream directory and the name table.
+ if ((pvHdrData = MemAlloc(cbMem)) == NULL)
+ return HresultOfScode(E_OUTOFMEMORY);
+
+ cbRead -= sizeof(GTLibStgHdr);
+ pserstrminfo = (SerStreamInfo *)(((BYTE *)pvHdrData)+cbMem-cbSer);
+
+ // Copy the already-read part of the table from rgbHeaderBuf.
+ memcpy(pserstrminfo, rgbHeaderBuf+sizeof(GTLibStgHdr),
+ (cbRead>cbSer)?cbSer:(UINT)cbRead);
+
+ // If there is any more header info to read, read it.
+ if (cbRead < cbSer) {
+
+ DebAssert(cbRead == sizeof(rgbHeaderBuf)-sizeof(GTLibStgHdr), "OpenForReadOnly");
+ uli.LowPart = sizeof(rgbHeaderBuf);
+ IfOleErrGo(plockbytes->ReadAt(uli,
+ ((BYTE *)pserstrminfo)+sizeof(rgbHeaderBuf)-sizeof(GTLibStgHdr),
+ cbSer-(sizeof(rgbHeaderBuf)-sizeof(GTLibStgHdr)),
+ &cbRead));
+
+ if (cbRead != cbSer-(sizeof(rgbHeaderBuf)-sizeof(GTLibStgHdr))) {
+ hresult = HresultOfScode(TYPE_E_INVDATAREAD);
+ goto Error;
+ }
+ }
+
+#if HP_BIGENDIAN
+ SwapStructArray(pserstrminfo, cstrm, SZ_SerStreamInfo_Swap);
+#endif // HP_BIGENDIAN
+
+ szNameTable = (LPSTR)(pserstrminfo + cstrm);
+
+ // Now expand the serialized table into the in-mem table.
+ for (pstrminfo = (StreamInfo *)pvHdrData, pstrminfoLim = pstrminfo+cstrm;
+ pstrminfo < pstrminfoLim; pstrminfo++, pserstrminfo++) {
+
+ DebAssert((LPVOID)(pstrminfo+1) <= (LPVOID)(pserstrminfo+1), "OpenForReadOnly");
+
+ pstrminfo->ulCb = pserstrminfo->ulCb;
+ pstrminfo->ulOffset = (signed short)pserstrminfo->wNextStream;
+ pstrminfo->szName = szNameTable+pserstrminfo->wOffsetName;
+ }
+
+ pstrminfo -= cstrm;
+
+ // Compute the offset of the first byte of the first stream.
+ ulOffset = sizeof(GTLibStgHdr)+cbSer+((GTLibStgHdr *)rgbHeaderBuf)->wCbExtra;
+
+ // Walk the linked list to compute the offset of each stream.
+ for (istrm = ((GTLibStgHdr *)rgbHeaderBuf)->wStreamFirst;
+ istrm != ~0;
+ istrm = istrmNext) {
+ istrmNext = (int)pstrminfo[istrm].ulOffset;
+ pstrminfo[istrm].ulOffset = ulOffset;
+ ulOffset += pstrminfo[istrm].ulCb;
+ }
+
+ // Now that we've computed all the info we need, instantiate and
+ // initialize the desired GTLibStorage.
+
+ if ((pgtlstg = MemNew(GTLibStorage)) == NULL) {
+ hresult = HresultOfScode(E_OUTOFMEMORY);
+ goto Error;
+ }
+
+ ::new (pgtlstg) GTLibStorage;
+
+ pgtlstg->m_cRefs = 1;
+
+ plockbytes->AddRef();
+ pgtlstg->m_plockbytes = plockbytes;
+
+ pgtlstg->m_guid = ((GTLibStgHdr *)rgbHeaderBuf)->guid;
+ pgtlstg->m_rgstrminfo = pstrminfo;
+ pgtlstg->m_pvHdrData = pvHdrData;
+ pgtlstg->m_cstrminfo = cstrm;
+ *ppstg = pgtlstg;
+ return NOERROR;
+
+Error:
+ MemFree(pvHdrData);
+ return hresult;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+GTLibStorage::GTLibStorage()
+{
+ m_cRefs = 1;
+ m_plockbytes = NULL;
+ m_rgstrminfo = NULL;
+ m_pvHdrData = NULL;
+ m_cstrminfo = 0;
+ m_ulOffsetNext = 0;
+ m_szNameFirst = NULL;
+ m_szNameLim = NULL;
+ m_istrminfoOpen = (UINT)-1;
+ m_guid = CLSID_NULL;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+GTLibStorage::~GTLibStorage()
+{
+ if (m_plockbytes != NULL)
+ m_plockbytes->Release();
+
+ MemFree(m_pvHdrData);
+}
+#pragma code_seg()
+
+HRESULT GTLibStorage::QueryInterface(REFIID riid, LPVOID FAR *ppvObj)
+{
+ if (riid == IID_IStorageA) {
+ AddRef();
+ *ppvObj = this;
+ return S_OK;
+ }
+ else {
+ *ppvObj = NULL;
+ return HresultOfScode(E_NOINTERFACE);
+ }
+}
+
+#pragma code_seg(CS_INIT)
+ULONG GTLibStorage::AddRef()
+{
+ return ++m_cRefs;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_INIT)
+ULONG GTLibStorage::Release()
+{
+ ULONG cRefs;
+
+ DebAssert(m_cRefs > 0, "Release");
+ cRefs = --m_cRefs;
+ if (cRefs == 0) {
+ this->GTLibStorage::~GTLibStorage();
+ MemFree(this);
+ }
+
+ return cRefs;
+}
+#pragma code_seg()
+
+
+/***
+* LookupStream - Map a stream name to the info structure for that stream.
+*
+* Inputs:
+* pwcsName - The name of the desired stream.
+* Outputs:
+* If found, returns a pointer to the matching element of m_rgstrminfo.
+* Otherwise, returns NULL.
+*
+* Implementation:
+* Binary search, which assumes that m_rgstrminfo is sorted by name.
+* I decided against a hashing algorithm because it seems overly complex
+* (to do it right, which would involve a variable-size hash table due
+* to the extreme differences in stream counts between different typelibs)
+* for very little gain. Note that this function will almost always be
+* followed very quickly by a disk hit (either a seek or a read or both).
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+StreamInfo FAR *GTLibStorage::LookupStream(const char FAR* pwcsName)
+{
+ int i;
+ int istrminfoLow, istrminfoHigh, istrminfoCur;
+
+ // Perform a case-insensitive binary search of the streaminfo array.
+
+ istrminfoLow = 0;
+ istrminfoHigh = (int)m_cstrminfo-1;
+
+ while (istrminfoLow <= istrminfoHigh) {
+
+ // Check halfway between high and low possibilities.
+ istrminfoCur = (istrminfoLow+istrminfoHigh)/2;
+
+ // Compare the current guess against the desired string.
+ i = xstrcmp((LPSTR)pwcsName, m_rgstrminfo[istrminfoCur].szName);
+
+ // If the names match, then return the found StreamInfo entry.
+ if (i == 0)
+ return m_rgstrminfo+istrminfoCur;
+
+ // If desired name is lower than the guess, update the upper bound
+ // to be one lower than the current guess.
+ else if (i < 0)
+ istrminfoHigh = istrminfoCur-1;
+
+ // If desired name is higher than the guess, update the lower bound
+ // to be one higher than the current guess.
+ else
+ istrminfoLow = istrminfoCur+1;
+ }
+
+ // The requested name was not found, so return NULL.
+ return NULL;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+HRESULT GTLibStorage::OpenStream(const OLECHAR FAR* pwcsName, void FAR *reserved1, DWORD grfMode, DWORD reserved2, IStreamA FAR *FAR *ppstm)
+{
+ StreamInfo *pstrminfo;
+ HRESULT hresult;
+#if FV_UNICODE_OLE
+ CHAR FAR* pwcsNameA;
+
+ IfOleErrRet(ConvertStringToA(pwcsName, &pwcsNameA));
+#else //FV_UNICODE_OLE
+ #define pwcsNameA pwcsName
+#endif //FV_UNICODE_OLE
+
+ // If we're trying to open stream with write permissions, make sure
+ // it was the most recently created stream, that we're in the process
+ // creating a new storage, and that the stream being opened has not
+ // yet been written to.
+ if (grfMode & (STGM_READ | STGM_READWRITE | STGM_WRITE)) {
+ if (m_szNameFirst == NULL || xstrcmp(m_szNameFirst, (LPSTR)pwcsNameA) != 0) {
+ DebHalt("OpenStream");
+ hresult = HresultOfScode(STG_E_INVALIDFUNCTION);
+ goto Done;
+ }
+
+ DebAssert(m_istrminfoOpen == -1, "OpenStream");
+
+ // Only one stream to be open at a time when writing streams.
+ if (m_istrminfoOpen != -1) {
+ hresult = HresultOfScode(STG_E_INVALIDFUNCTION);
+ goto Done;
+ }
+
+ m_istrminfoOpen = m_cstrminfo-1;
+
+ DebAssert(m_rgstrminfo[m_istrminfoOpen].szName == m_szNameFirst, "OpenStream");
+
+ // Instantiate the GTLibStream.
+ hresult = GTLibStream::Create(m_plockbytes, m_ulOffsetNext, this, ppstm);
+ goto Done;
+ }
+
+ // Look up the StreamInfo corresponding to pwcsName.
+ // If it isn't found, return FILENOTFOUND, just like the docfile
+ // implementation does.
+ if ((pstrminfo = LookupStream(pwcsNameA)) == NULL) {
+ hresult = HresultOfScode(STG_E_FILENOTFOUND);
+ goto Done;
+ }
+
+ // Create the GTLibStream with the plockbytes, offset and size.
+ hresult = GTLibStream::Open(m_plockbytes, pstrminfo->ulOffset, pstrminfo->ulCb, ppstm);
+
+Done:
+#if FV_UNICODE_OLE
+ ConvertStringFree(pwcsNameA);
+#endif //FV_UNICODE_OLE
+
+ return hresult;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_INIT)
+HRESULT GTLibStorage::Stat(STATSTGA FAR *pstatstg, DWORD grfStatFlag)
+{
+ pstatstg->pwcsName = NULL;
+ pstatstg->type = STGTY_STORAGE;
+ ULISet32(pstatstg->cbSize, 0);
+ pstatstg->mtime.dwLowDateTime = pstatstg->mtime.dwHighDateTime = 0;
+ pstatstg->ctime.dwLowDateTime = pstatstg->ctime.dwHighDateTime = 0;
+ pstatstg->atime.dwLowDateTime = pstatstg->atime.dwHighDateTime = 0;
+ pstatstg->grfMode = STGM_READ | STGM_SHARE_DENY_WRITE;
+ pstatstg->grfLocksSupported = 0;
+ pstatstg->clsid = m_guid;
+ pstatstg->grfStateBits = 0;
+ pstatstg->reserved = 0;
+ return NOERROR;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+HRESULT
+GTLibStorage::Create(
+ ILockBytesA FAR *plockbytes,
+ UINT cstreamMax,
+ IStorageA FAR* FAR* ppstg)
+{
+ ULARGE_INTEGER uli;
+ GTLibStorage *pgtlstg;
+ UINT cbHdrData;
+ HRESULT hresult;
+
+ if ((pgtlstg = MemNew(GTLibStorage)) == NULL)
+ return HresultOfScode(E_OUTOFMEMORY);
+
+ ::new (pgtlstg) GTLibStorage;
+
+ pgtlstg->m_cRefs = 1;
+
+ plockbytes->AddRef();
+ pgtlstg->m_plockbytes = plockbytes;
+
+ // If you change this formula, you must also change the inverse used
+ // in GTLibStorage::Commit.
+ cbHdrData = cstreamMax*(sizeof(StreamInfo)+CB_GTLIBSTREAM_NAME_MAX);
+
+ pgtlstg->m_ulOffsetNext = sizeof(GTLibStgHdr)+cstreamMax*(sizeof(SerStreamInfo)+CB_GTLIBSTREAM_NAME_MAX);
+ DebAssert(pgtlstg->m_ulOffsetNext <= (ULONG)cbHdrData+sizeof(GTLibStgHdr), "Create");
+
+ // alloc the buffer to the larger of cbHdrData (what we need) and
+ // m_ulOffsetNext (what we are using to fill the header region of the file
+ // with zeros).
+ if ((pgtlstg->m_pvHdrData = MemZalloc((size_t)max(cbHdrData, pgtlstg->m_ulOffsetNext))) == NULL) {
+ hresult = HresultOfScode(E_OUTOFMEMORY);
+ }
+
+ // Initialize the header region of the file with zeros.
+ uli.HighPart = uli.LowPart = 0;
+ IfOleErrGo(plockbytes->WriteAt(uli, pgtlstg->m_pvHdrData, pgtlstg->m_ulOffsetNext, NULL));
+
+ // Initialize the allocation heap of StreamInfos, which starts at
+ // m_pvHdrData and grow up.
+ pgtlstg->m_rgstrminfo = (StreamInfo *)pgtlstg->m_pvHdrData;
+
+ // Initialize the allocation heap of stream names, which starts at
+ // the top of m_pvHdrData and grows down.
+ pgtlstg->m_szNameFirst = ((char *)pgtlstg->m_pvHdrData)+cbHdrData;
+ pgtlstg->m_szNameLim = pgtlstg->m_szNameFirst;
+
+ *ppstg = pgtlstg;
+ return NOERROR;
+
+Error:
+ pgtlstg->Release();
+ return hresult;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+HRESULT
+GTLibStorage::CreateStream(
+ const OLECHAR FAR* pwcsName,
+ DWORD grfMode,
+ DWORD reserved1,
+ DWORD reserved2,
+ IStreamA FAR *FAR *ppstm)
+{
+ LPSTR szName;
+ HRESULT hresult;
+#if FV_UNICODE_OLE
+ CHAR FAR* pwcsNameA;
+#endif //FV_UNICODE_OLE
+
+ DebAssert(m_istrminfoOpen == -1, "CreateStream");
+
+ // Only one stream to be open at a time when creating streams.
+ if (m_istrminfoOpen != -1)
+ return HresultOfScode(STG_E_INVALIDFUNCTION);
+
+#if FV_UNICODE_OLE
+ IfOleErrRet(ConvertStringToA(pwcsName, &pwcsNameA));
+#endif //FV_UNICODE_OLE
+
+ // Update the stream count and record the open stream. This implicitly
+ // allocates a new strminfo structure from pvHdrData (the m_rgstrminfo
+ // grows up from the bottom of pvHdrData).
+ m_istrminfoOpen = m_cstrminfo++;
+
+ // Allocate the stream name from pvHdrData. The name table grows down
+ // from the top of pvHdrData.
+ szName = m_szNameFirst-xstrblen0(pwcsNameA);
+
+ // If the name collided with the stream directory table, we've tried
+ // to open too many streams with names that were too long.
+ if (szName < (LPSTR)(m_rgstrminfo+m_cstrminfo)) {
+ hresult = HresultOfScode(STG_E_TOOMANYOPENFILES);
+ goto Error;
+ }
+
+ // Copy the name into the allocated space and point the streaminfo at it.
+ xstrcpy(szName, pwcsNameA);
+ m_rgstrminfo[m_istrminfoOpen].szName = szName;
+ m_rgstrminfo[m_istrminfoOpen].ulCb = 0;
+
+ // Finally, instantiate the GTLibStream.
+ IfOleErrGo(GTLibStream::Create(m_plockbytes, m_ulOffsetNext, this, ppstm));
+
+ m_szNameFirst = szName;
+#if FV_UNICODE_OLE
+ ConvertStringFree(pwcsNameA);
+#endif //FV_UNICODE_OLE
+ return NOERROR;
+
+Error:
+ m_cstrminfo--;
+ m_istrminfoOpen = (UINT)-1;
+#if FV_UNICODE_OLE
+ ConvertStringFree(pwcsNameA);
+#endif //FV_UNICODE_OLE
+ return hresult;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+void GTLibStorage::NotifyStreamClosed(ULONG ulCb)
+{
+ DebAssert(m_istrminfoOpen >= 0 && m_istrminfoOpen < m_cstrminfo, "NotifyStreamClosed");
+ m_rgstrminfo[m_istrminfoOpen].ulCb = ulCb;
+ m_ulOffsetNext += ulCb;
+ m_istrminfoOpen = (UINT)-1;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+/***
+*SwapStreamInfos() - Swaps two StreamInfos -- used by SortStreamInfo.
+***********************************************************************/
+void GTLibStorage::SwapStreamInfos(StreamInfo *pstrminfo1, StreamInfo *pstrminfo2)
+{
+ ULONG ulCbTmp;
+ LPSTR szNameTmp;
+ USHORT istrminfoTmp;
+
+ // Swap only the ulCb, szName, and istrminfoCur fields.
+ ulCbTmp = pstrminfo1->ulCb;
+ szNameTmp = pstrminfo1->szName;
+ istrminfoTmp = pstrminfo1->map.istrminfoCur;
+ pstrminfo1->ulCb = pstrminfo2->ulCb;
+ pstrminfo1->szName = pstrminfo2->szName;
+ pstrminfo1->map.istrminfoCur = pstrminfo2->map.istrminfoCur;
+ pstrminfo2->ulCb = ulCbTmp;
+ pstrminfo2->szName = szNameTmp;
+ pstrminfo2->map.istrminfoCur = istrminfoTmp;
+
+ // Update the affected istrminfoOrg fields in rgstrminfo so that
+ // we maintain the invariant that the ith element's istrminfoOrg contains
+ // the index of the element that was the ith element before sorting.
+ // In other words, we are tracking the movement of elements so we can
+ // easily walk the elements in the original order once sorting is done.
+ m_rgstrminfo[(int)pstrminfo1->map.istrminfoCur].map.istrminfoOrg = (USHORT)(pstrminfo1-m_rgstrminfo);
+ m_rgstrminfo[(int)pstrminfo2->map.istrminfoCur].map.istrminfoOrg = (USHORT)(pstrminfo2-m_rgstrminfo);
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*void SortStreamInfo - Sorts a StreamInfo array by name using quicksort.
+***********************************************************************/
+void GTLibStorage::SortStreamInfo(StreamInfo *rgstrminfo, UINT uCount)
+{
+ LPSTR szNameMid;
+ UINT iLow=0, iHigh=uCount-1;
+
+ if (uCount <= 1)
+ return;
+
+ // Get the middle element as the value for partition.
+ szNameMid = rgstrminfo[uCount/2].szName;
+
+ while (iLow < iHigh) {
+ while ((xstrcmp(rgstrminfo[iLow].szName,szNameMid) < 0) && (iLow < iHigh))
+ iLow++;
+
+ while ((xstrcmp(rgstrminfo[iHigh].szName,szNameMid) >= 0) && (iLow < iHigh))
+ iHigh--;
+
+ if (iLow < iHigh) {
+ // swap the StreamInfos
+ SwapStreamInfos(rgstrminfo+iLow, rgstrminfo+iHigh);
+ } // if
+ } // while
+
+
+ DebAssert(iLow == iHigh, "Terminating condition");
+
+ // Take care of all the termination conditions. iLow and iHigh are
+ // pointing to the same location. Adjust these so that it points to the
+ // end of the subarrays.
+ if (iHigh == uCount-1) {
+ // all elements were < or = to ulMid.
+ //
+ // if the last element is ulMid then dec. iLow
+ // i.e. reduce the array size if possible.
+ if (xstrcmp(rgstrminfo[iHigh].szName, szNameMid) < 0) {
+ // swap the middle element with the last element.
+ SwapStreamInfos(rgstrminfo+uCount/2, rgstrminfo+iHigh);
+ }
+ iLow--;
+ }
+
+ else if (iLow == 0) {
+ // all elements were > or = to ulMid
+ //
+ // if the last element is ulMid then inc. iHigh
+ // i.e. reduce the array size if possible.
+ if (xstrcmp(rgstrminfo[iHigh].szName, szNameMid) > 0) {
+ // swap the middle element with the first element.
+ SwapStreamInfos(rgstrminfo, rgstrminfo+uCount/2);
+ }
+ iHigh++;
+ }
+
+ else {
+ // Adjust iLow and iHigh so that these points to the right place
+ if (xstrcmp(rgstrminfo[iHigh].szName, szNameMid) > 0)
+ iLow--;
+ else
+ iHigh++;
+ }
+
+ // Sort the lower sub array
+ SortStreamInfo(rgstrminfo, (UINT)iLow+1);
+
+ // Sort the upper sub array
+ SortStreamInfo(rgstrminfo+iLow+1, (UINT)(uCount-iLow-1));
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+HRESULT GTLibStorage::Commit(DWORD grfCommitFlags)
+{
+ GTLibStgHdr gtlhdr;
+ SerStreamInfo serstrminfo;
+ ULARGE_INTEGER uli;
+ HRESULT hresult;
+ UINT istrminfo, cstreamMax;
+
+ // We don't need the ulOffset fields anymore, so record the current
+ // sort order in that field.
+ for (istrminfo = 0; istrminfo < m_cstrminfo; istrminfo++) {
+ m_rgstrminfo[istrminfo].map.istrminfoOrg =
+ m_rgstrminfo[istrminfo].map.istrminfoCur = istrminfo;
+ }
+
+ // Sort m_rgstrminfo by name, preserving the original sort order
+ // in the istrminfoOrg fields. This allows us to easily construct the
+ // list (sorted by stream offset) of the SERSTREAMINFOs.
+ SortStreamInfo(m_rgstrminfo, m_cstrminfo);
+
+ // Note that this is the inverse calculation performed to compute
+ // the size of the buffer initially. If you change that, this must
+ // also be changed.
+ cstreamMax = (((BYTE *)m_szNameLim)-((BYTE *)m_pvHdrData))/
+ (sizeof(StreamInfo)+CB_GTLIBSTREAM_NAME_MAX);
+
+ gtlhdr.ulSignature = GTLIBSTORAGE_SIGNATURE;
+ gtlhdr.wCStrm = m_cstrminfo;
+ gtlhdr.wCbExtra = ((BYTE *)m_szNameFirst)-(BYTE *)(m_rgstrminfo+m_cstrminfo);
+ gtlhdr.wCbExtra -= (cstreamMax-m_cstrminfo)*(sizeof(StreamInfo)-sizeof(SerStreamInfo));
+ gtlhdr.wCbNameTable = (USHORT)((m_szNameLim - m_szNameFirst)*sizeof(*m_szNameFirst));
+ gtlhdr.wStreamFirst = m_rgstrminfo[0].map.istrminfoOrg;
+ gtlhdr.guid = m_guid;
+
+ // Write out the header info at the beginning of the file.
+ uli.HighPart = uli.LowPart = 0;
+#if HP_BIGENDIAN
+ SwapStruct(&gtlhdr, SZ_GTLibStgHdr_Swap);
+#endif // HP_BIGENDIAN
+ IfOleErrRet(m_plockbytes->WriteAt(uli, &gtlhdr, sizeof(gtlhdr), NULL));
+#if HP_BIGENDIAN
+ // Swap the header structure back because we later use parts of it.
+ SwapStruct(&gtlhdr, SZ_GTLibStgHdr_Swap);
+#endif // HP_BIGENDIAN
+
+ uli.LowPart += sizeof(gtlhdr);
+
+ // Write out the streaminfo table.
+ for (istrminfo = 0; istrminfo < m_cstrminfo; istrminfo++) {
+ serstrminfo.ulCb = m_rgstrminfo[istrminfo].ulCb;
+ serstrminfo.wOffsetName = m_rgstrminfo[istrminfo].szName - m_szNameFirst;
+ serstrminfo.wNextStream = m_rgstrminfo[istrminfo].map.istrminfoCur;
+ if (serstrminfo.wNextStream != m_cstrminfo-1)
+ serstrminfo.wNextStream = m_rgstrminfo[serstrminfo.wNextStream+1].map.istrminfoOrg;
+ else
+ serstrminfo.wNextStream = (USHORT)-1;
+#if HP_BIGENDIAN
+ SwapStruct(&serstrminfo, SZ_SerStreamInfo_Swap);
+#endif // HP_BIGENDIAN
+ IfOleErrRet(m_plockbytes->WriteAt(uli, &serstrminfo, sizeof(serstrminfo), NULL));
+ uli.LowPart += sizeof(serstrminfo);
+ }
+
+ // Finally, write out the name table, if there's any name to write out.
+ // Do NOT write out a 0-length name table because that will truncate the
+ // file.
+ if (gtlhdr.wCbNameTable != 0)
+ return m_plockbytes->WriteAt(uli, m_szNameFirst, gtlhdr.wCbNameTable, NULL);
+ else
+ return NOERROR;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_RARE)
+HRESULT GTLibStorage::CreateStorage(const OLECHAR FAR* pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorageA FAR *FAR *ppstg)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::OpenStorage(const OLECHAR FAR* pwcsName, IStorageA FAR *pstgPriority, DWORD grfMode, SNBA snbExclude, DWORD reserved, IStorageA FAR *FAR *ppstg)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::CopyTo(DWORD ciidExclude, IID const FAR *rgiidExclude, SNBA snbExclude, IStorageA FAR *pstgDest)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::MoveElementTo(OLECHAR const FAR* lpszName, IStorageA FAR *pstgDest, OLECHAR const FAR* lpszNewName, DWORD grfFlags)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::Revert()
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::EnumElements(DWORD reserved1, void FAR *reserved2, DWORD reserved3, IEnumSTATSTGA FAR *FAR *ppenm)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::DestroyElement(const OLECHAR FAR* pwcsName)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::RenameElement(const OLECHAR FAR* pwcsOldName, const OLECHAR FAR* pwcsNewName)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::SetElementTimes(const OLECHAR FAR *lpszName, FILETIME const FAR *pctime, FILETIME const FAR *patime, FILETIME const FAR *pmtime)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStorage::SetStateBits(DWORD grfStateBits, DWORD grfMask)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+#pragma code_seg()
+
+HRESULT GTLibStorage::SetClass(REFCLSID clsid)
+{
+ m_guid = clsid;
+ return NOERROR;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Implementation of GTLibStream
+/////////////////////////////////////////////////////////////////////////////
+
+
+#pragma code_seg(CS_INIT)
+GTLibStream::GTLibStream()
+{
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+GTLibStream::~GTLibStream()
+{
+ ULARGE_INTEGER uli;
+
+ if (m_pgtlstgContainer != NULL) {
+ m_pgtlstgContainer->NotifyStreamClosed(m_ulCb);
+ uli.HighPart = 0;
+ uli.LowPart = m_ulOffsetStart+m_ulCb;
+ (void)(m_plockbytes->WriteAt(uli, NULL, 0, NULL));
+ }
+
+ if (m_plockbytes != NULL)
+ m_plockbytes->Release();
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+HRESULT GTLibStream::Open(ILockBytesA FAR *plockbytes, ULONG ulOffset, ULONG ulCb, IStreamA FAR * FAR *ppstm)
+{
+ GTLibStream FAR *pstm;
+
+ if ((pstm = MemNew(GTLibStream)) == NULL)
+ return HresultOfScode(E_OUTOFMEMORY);
+
+ ::new (pstm) GTLibStream;
+
+ pstm->m_cRefs = 1;
+
+ plockbytes->AddRef();
+ pstm->m_plockbytes = plockbytes;
+
+ pstm->m_ulOffsetStart = ulOffset;
+ pstm->m_ulOffsetCur = 0;
+ pstm->m_ulCb = ulCb;
+ pstm->m_pgtlstgContainer = NULL;
+
+ *ppstm = pstm;
+ return NOERROR;
+}
+#pragma code_seg()
+
+HRESULT GTLibStream::QueryInterface(REFIID riid, LPVOID FAR *ppvObj)
+{
+ if (riid == IID_IStreamA) {
+ AddRef();
+ *ppvObj = this;
+ return S_OK;
+ }
+ else {
+ *ppvObj = NULL;
+ return HresultOfScode(E_NOINTERFACE);
+ }
+}
+
+#pragma code_seg(CS_INIT)
+ULONG GTLibStream::AddRef()
+{
+ return ++m_cRefs;
+}
+
+ULONG GTLibStream::Release()
+{
+ ULONG cRefs;
+
+ DebAssert(m_cRefs > 0, "Release");
+ cRefs = --m_cRefs;
+ if (cRefs == 0) {
+ this->GTLibStream::~GTLibStream();
+ MemFree(this);
+ }
+
+ return cRefs;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+HRESULT GTLibStream::Read(void HUGEP *pv, ULONG cb, ULONG FAR *pcbRead)
+{
+ ULARGE_INTEGER uli;
+
+ // Compute the position from which the read is to take place.
+ uli.HighPart = 0;
+ uli.LowPart = m_ulOffsetStart+m_ulOffsetCur;
+
+ // Truncate the read if it is an attempt to go beyond the end of the
+ // the stream.
+ if (m_ulOffsetCur + cb > m_ulCb)
+ cb = m_ulCb-m_ulOffsetCur;
+
+ // Update m_ulOffsetCur to the new seek position.
+ m_ulOffsetCur += cb;
+
+ return m_plockbytes->ReadAt(uli, pv, cb, pcbRead);
+}
+#pragma code_seg()
+
+HRESULT GTLibStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER FAR *plibNewPosition)
+{
+ DebAssert(dlibMove.HighPart == 0 || (dlibMove.HighPart == -1 && (dlibMove.LowPart & 0x80000000)), "ReadAt");
+
+ switch (dwOrigin) {
+ case STREAM_SEEK_SET:
+ // Don't allow a seek before the beginning of the stream.
+ if (dlibMove.HighPart == -1)
+ goto Error;
+
+ m_ulOffsetCur = dlibMove.LowPart;
+ break;
+
+ case STREAM_SEEK_CUR:
+ // Don't allow a seek before the beginning of the stream.
+ if ((m_ulOffsetCur + dlibMove.LowPart) & 0x80000000)
+ goto Error;
+
+ m_ulOffsetCur += dlibMove.LowPart;
+ break;
+
+ case STREAM_SEEK_END:
+ // Don't allow a seek before the beginning of the stream.
+ if (dlibMove.LowPart > m_ulCb)
+ goto Error;
+
+ m_ulOffsetCur = m_ulCb-dlibMove.LowPart;
+ break;
+
+ default:
+Error:
+ DebHalt("Seek");
+ return HresultOfScode(STG_E_INVALIDPARAMETER);
+ }
+
+ if (plibNewPosition != NULL) {
+ plibNewPosition->HighPart = 0;
+ plibNewPosition->LowPart = m_ulOffsetCur;
+ }
+ return NOERROR;
+}
+
+
+#pragma code_seg(CS_CREATE)
+HRESULT
+GTLibStream::Create(
+ ILockBytesA FAR *plockbytes,
+ ULONG ulOffset,
+ GTLibStorage FAR *pgtlstgContainer,
+ IStreamA FAR * FAR *ppstm)
+{
+ GTLibStream FAR *pstm;
+
+ if ((pstm = MemNew(GTLibStream)) == NULL)
+ return HresultOfScode(E_OUTOFMEMORY);
+
+ ::new (pstm) GTLibStream;
+
+ pstm->m_cRefs = 1;
+
+ plockbytes->AddRef();
+ pstm->m_plockbytes = plockbytes;
+
+ pstm->m_ulOffsetStart = ulOffset;
+ pstm->m_ulOffsetCur = 0;
+ pstm->m_pgtlstgContainer = pgtlstgContainer;
+
+ DebAssert(pgtlstgContainer != NULL && pgtlstgContainer->m_istrminfoOpen != -1, "Create");
+ pstm->m_ulCb = pgtlstgContainer->m_rgstrminfo[pgtlstgContainer->m_istrminfoOpen].ulCb;
+
+ *ppstm = pstm;
+ return NOERROR;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+HRESULT GTLibStream::Write(void const HUGEP *pv, ULONG cb, ULONG FAR *pcbWritten)
+{
+ ULARGE_INTEGER uli;
+
+ // Compute the position from which the read is to take place.
+ uli.HighPart = 0;
+ uli.LowPart = m_ulOffsetStart+m_ulOffsetCur;
+
+ // Update m_ulOffsetCur to the new seek position.
+ m_ulOffsetCur += cb;
+
+ // If the new offset is greater than the current length of the stream,
+ // update the length to the new offset.
+ if (m_ulOffsetCur > m_ulCb)
+ m_ulCb = m_ulOffsetCur;
+
+ // Perform the write.
+ return m_plockbytes->WriteAt(uli, pv, cb, pcbWritten);
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+HRESULT GTLibStream::Commit(DWORD grfCommitFlags)
+{
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_RARE)
+HRESULT GTLibStream::SetSize(ULARGE_INTEGER libNewSize)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStream::CopyTo(IStreamA FAR *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER FAR *pcbRead, ULARGE_INTEGER FAR *pcbWritten)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStream::Revert()
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStream::LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStream::UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStream::Stat(STATSTGA FAR *pstatstg, DWORD grfStatFlag)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT GTLibStream::Clone(IStreamA FAR * FAR *ppstm)
+{
+ DebHalt("Method not implemented");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+#pragma code_seg()
+
+/////////////////////////////////////////////////////////////////////////////
+// Implementation of FileLockBytes
+/////////////////////////////////////////////////////////////////////////////
+
+class FileLockBytes : public ILockBytesA
+{
+friend HRESULT OpenFileLockBytes(BOOL isNew,
+ LPOLESTR szFile,
+ ILockBytesA FAR* FAR* pplockbytes);
+friend HRESULT CreateFileLockBytesOnHFILE(int hfile,
+ BOOL isNew,
+ ULONG oStart,
+ ULONG cbData,
+ ILockBytesA FAR* FAR* pplockbytes);
+
+public:
+
+ // Methods implemented for IUnknown.
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR *ppvObj);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ // Methods implemented for ILockBytes.
+ STDMETHOD(ReadAt)(ULARGE_INTEGER uliOffset,
+ void HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbRead);
+ STDMETHOD(WriteAt)(ULARGE_INTEGER uliOffset,
+ void const HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbWritten);
+ STDMETHOD(Flush)(void);
+ STDMETHOD(SetSize)(ULARGE_INTEGER uliCb);
+ STDMETHOD(LockRegion)(ULARGE_INTEGER uliOffset,
+ ULARGE_INTEGER uliCb,
+ DWORD dwLockType);
+ STDMETHOD(UnlockRegion)(ULARGE_INTEGER uliOffset,
+ ULARGE_INTEGER uliCb,
+ DWORD dwLockType);
+ STDMETHOD(Stat)(STATSTGA FAR *pstatstg, DWORD grfStatFlag);
+
+protected:
+ FileLockBytes();
+ ~FileLockBytes();
+
+ ULONG m_cRefs; // The reference count.
+
+ int m_hfile; // The DOS file handle on windows
+ // The wings sopen file handle on the mac.
+ // -1 if the file is not open.
+
+ ULONG m_oStart;
+};
+
+#if OE_WIN32
+class FileLockBytesMemory : public ILockBytesA
+{
+friend HRESULT CreateFileLockBytesOnHFILE(int hfile,
+ BOOL isNew,
+ ULONG oStart,
+ ULONG cbData,
+ ILockBytesA FAR* FAR* pplockbytes);
+
+public:
+
+ // Methods implemented for IUnknown.
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR *ppvObj);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ // Methods implemented for ILockBytes.
+ STDMETHOD(ReadAt)(ULARGE_INTEGER uliOffset,
+ void HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbRead);
+ STDMETHOD(WriteAt)(ULARGE_INTEGER uliOffset,
+ void const HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbWritten);
+ STDMETHOD(Flush)(void);
+ STDMETHOD(SetSize)(ULARGE_INTEGER uliCb);
+ STDMETHOD(LockRegion)(ULARGE_INTEGER uliOffset,
+ ULARGE_INTEGER uliCb,
+ DWORD dwLockType);
+ STDMETHOD(UnlockRegion)(ULARGE_INTEGER uliOffset,
+ ULARGE_INTEGER uliCb,
+ DWORD dwLockType);
+ STDMETHOD(Stat)(STATSTGA FAR *pstatstg, DWORD grfStatFlag);
+
+protected:
+ FileLockBytesMemory();
+ ~FileLockBytesMemory();
+
+ ULONG m_cRefs; // The reference count.
+
+ int m_hfile; // The DOS file handle on windows
+ // The wings sopen file handle on the mac.
+ // -1 if the file is not open.
+
+ HANDLE m_hmapping; // The file-mapping handle
+ // NULL if the file is not open.
+
+ LPVOID m_pvmappingBase; // pointer to the file mapping
+ LPVOID m_pvmapping; // pointer to the file mapping, with offset to ILockBytes start added
+ ULONG m_ulEOF; // offset of end-of-file
+};
+#endif //OE_WIN32
+
+
+#pragma code_seg(CS_INIT)
+HRESULT OpenFileLockBytes(BOOL isNew, LPOLESTR szFile, ILockBytesA **pplockbytes)
+{
+ int hfile;
+ HRESULT hresult;
+
+#if OE_MAC
+ int omode, smode;
+
+ if(isNew){
+ omode = (_O_CREAT | _O_BINARY | _O_RDWR);
+ smode = _SH_DENYRW;
+ }else{
+ omode = (_O_BINARY | _O_RDONLY);
+ smode = _SH_DENYNO;
+ }
+ if((hfile = _sopen(szFile, omode, smode, (_S_IWRITE | _S_IREAD))) == -1){
+ // "too many files" on sopen sets errno, but not _macerrno
+ if (_macerrno == 0 && errno == EMFILE)
+ _macerrno = tmfoErr;
+ hresult = HresultOfTiperr(TiperrOfOSErr((OSErr)_macerrno));
+ goto Error;
+ }
+#else // OE_MAC
+ // The win16 and win32 implementation.
+ OFSTRUCT ofstruct;
+
+ hfile = oOpenFile(szFile,
+ &ofstruct,
+ isNew
+ ? (OF_CREATE | OF_WRITE | OF_SHARE_EXCLUSIVE)
+ : (OF_READ));
+
+ if (hfile == HFILE_ERROR) {
+ hresult = HresultOfTiperr(TiperrOfOFErr(ofstruct.nErrCode));
+ goto Error;
+ }
+#endif // OE_MAC
+
+ IfFailGoTo(CreateFileLockBytesOnHFILE(hfile, isNew, 0L, 0L, pplockbytes), Error);
+ return NOERROR;
+
+Error:;
+#if OE_MAC
+ _close(hfile);
+#else
+ _lclose(hfile);
+#endif
+ return hresult;
+}
+
+HRESULT
+CreateFileLockBytesOnHFILE(int hfile, BOOL isNew, ULONG oStart, ULONG cbData, ILockBytesA **pplockbytes)
+{
+
+ FileLockBytes *plockbytes;
+
+#if OE_WIN32
+ if (isNew) {
+MappedFileFailed:
+#endif //OE_WIN32
+
+ if ((plockbytes = MemNew(FileLockBytes)) == NULL)
+ return HresultOfScode(E_OUTOFMEMORY);
+ ::new (plockbytes) FileLockBytes;
+ plockbytes->m_hfile = hfile;
+ plockbytes->m_oStart = oStart;
+ *pplockbytes = plockbytes;
+
+#if OE_WIN32
+ } else {
+ // use memory-mapped file I/O for read-only typelibs
+
+ HANDLE h;
+ LPVOID lpv;
+ FileLockBytesMemory *plockmem;
+ DWORD ulEOFLow, ulEOFHigh;
+ SYSTEM_INFO si;
+ ULONG oMappedStart;
+ static DWORD dwAllocationGranularity=0;
+
+ // get the length of the file as a 64-bit int
+ ulEOFLow = GetFileSize((HANDLE)hfile, &ulEOFHigh);
+ if (ulEOFLow == 0xffffffff && GetLastError()) {
+ goto MappedFileFailed; // use the old I/O code
+ }
+
+ DebAssert(ulEOFHigh == 0, "Don't support files >4GB");
+ ulEOFLow -= oStart;
+
+ h = CreateFileMapping((HANDLE)hfile, // handle of file to map
+ NULL, // security attributes pointer
+ PAGE_READONLY, // fdwProtect
+ 0, // dwMaximumSizeHigh
+ 0, // dwMaximumSizeLow
+ NULL // lpszMapName (create with no name)
+ );
+ if (h == NULL) {
+ goto MappedFileFailed; // use the old I/O code
+ }
+
+ // look up and cache information about the allocation granularity
+ if (dwAllocationGranularity == 0) {
+ GetSystemInfo(&si);
+ dwAllocationGranularity = si.dwAllocationGranularity;
+ }
+
+ // The file offset passed to MapViewOfFile() must be aligned on the
+ // machine's allocation granularity (typically 64K)
+ oMappedStart = oStart % dwAllocationGranularity;
+ oStart -= oMappedStart;
+ if (cbData) {
+ // if the caller only wants a specific part of the file mapped in,
+ // we may have to map more in so that the start of the mapping is
+ // properly aligned
+ cbData+=oMappedStart;
+ }
+
+ lpv = MapViewOfFile(h, // hMapObject
+ FILE_MAP_READ, // fdwAccess
+ 0, // dwFileOffsetHigh
+ oStart, // dwFileOffsetLow
+ cbData // cbMap (0 = entire file)
+ );
+ if (lpv == NULL) {
+ CloseHandle(h);
+ goto MappedFileFailed; // possibly out of memory for the mapping
+ }
+
+ if ((plockmem = MemNew(FileLockBytesMemory)) == NULL) {
+ UnmapViewOfFile(lpv);
+ CloseHandle(h);
+ return HresultOfScode(E_OUTOFMEMORY);
+ }
+ ::new (plockmem) FileLockBytesMemory;
+ plockmem->m_hfile = hfile;
+ plockmem->m_hmapping = h;
+ plockmem->m_pvmappingBase = lpv;
+ plockmem->m_pvmapping = ((char *)lpv)+oMappedStart;
+ plockmem->m_ulEOF = ulEOFLow;
+ *pplockbytes = plockmem;
+ }
+#endif //OE_WIN32
+
+ return NOERROR;
+}
+
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+FileLockBytes::FileLockBytes()
+{
+ m_cRefs = 1;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+FileLockBytes::~FileLockBytes()
+{
+#if OE_MAC
+ if (m_hfile != -1)
+ _close(m_hfile);
+#else // OE_MAC
+ // Close the DOS file handle on the DLL, if it's open.
+ if (m_hfile != -1)
+ _lclose(m_hfile);
+#endif // OE_MAC
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+ULONG FileLockBytes::AddRef()
+{
+ return ++m_cRefs;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+ULONG FileLockBytes::Release()
+{
+ ULONG cRefs;
+
+ DebAssert(m_cRefs > 0, "Release");
+
+ cRefs = --m_cRefs;
+ if (cRefs == 0) {
+ this->FileLockBytes::~FileLockBytes();
+ MemFree(this);
+ }
+ return cRefs;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_INIT)
+HRESULT
+FileLockBytes::ReadAt(
+ ULARGE_INTEGER uliOffset,
+ void HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbRead)
+{
+ UINT cbRead;
+ DebAssert(m_hfile != -1, "ReadAt");
+ DebAssert(uliOffset.HighPart == 0, "ReadAt");
+
+#if !OE_MAC
+ // Ensure that cb fits in a WORD for _lread.
+ if ((cb & 0xffff0000) != 0) {
+ return HresultOfTiperr(TIPERR_ReadFault);
+ }
+#endif // !OE_MAC
+
+ // Seek to the specified location, relative to the start of the resource.
+ if (_llseek(m_hfile, uliOffset.LowPart + m_oStart, SEEK_SET) == -1L) {
+ return HresultOfScode(STG_E_SEEKERROR);
+ }
+
+#if OE_MAC
+ cbRead = _read(m_hfile, pv, cb);
+
+ if (cbRead == -1) {
+ return HresultOfScode(STG_E_READFAULT);
+ }
+#else // OE_MAC
+ cbRead = _lread(m_hfile, (LPSTR)pv, (WORD)cb);
+
+ if (cbRead == HFILE_ERROR) {
+ return HresultOfScode(STG_E_READFAULT);
+ }
+#endif // OE_MAC
+
+ if (pcbRead != NULL)
+ *pcbRead = cbRead;
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+HRESULT FileLockBytes::QueryInterface(REFIID riid, LPVOID FAR *ppvObj)
+{
+ if (riid == IID_ILockBytesA) {
+ AddRef();
+ *ppvObj = (ILockBytesA *)this;
+ return S_OK;
+ }
+ else {
+ *ppvObj = NULL;
+ return HresultOfScode(E_NOINTERFACE);
+ }
+}
+
+#pragma code_seg(CS_CREATE)
+HRESULT
+FileLockBytes::WriteAt(
+ ULARGE_INTEGER uliOffset,
+ void const HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbWritten)
+{
+ UINT cbWritten;
+ DebAssert(m_hfile != -1, "WriteAt");
+ DebAssert(uliOffset.HighPart == 0, "WriteAt");
+
+#if !OE_MAC
+ // Ensure that cb fits in a WORD for _lwrite.
+ if ((cb & 0xffff0000) != 0) {
+ return HresultOfTiperr(TIPERR_WriteFault);
+ }
+#endif // !OE_MAC
+
+ // Seek to the specified location, relative to the start of the resource.
+ if (_llseek(m_hfile, uliOffset.LowPart, SEEK_SET) == -1L) {
+ return HresultOfScode(STG_E_SEEKERROR);
+ }
+
+#if OE_MAC
+ cbWritten = _write(m_hfile, pv, cb);
+
+ if (cbWritten == -1) {
+ return HresultOfScode(STG_E_WRITEFAULT);
+ }
+#else // OE_MAC
+ cbWritten = _lwrite(m_hfile, (LPSTR)pv, (WORD)cb);
+
+ if (cbWritten == HFILE_ERROR) {
+ return HresultOfScode(STG_E_WRITEFAULT);
+ }
+#endif // OE_MAC
+
+ if (pcbWritten != NULL)
+ *pcbWritten = cbWritten;
+
+ return S_OK;
+}
+
+HRESULT FileLockBytes::Flush()
+{
+ // Since _lwrite is unbuffered, this does nothing.
+ return S_OK;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_RARE)
+HRESULT FileLockBytes::SetSize(ULARGE_INTEGER uliCb)
+{
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT FileLockBytes::LockRegion(ULARGE_INTEGER uliOffset, ULARGE_INTEGER uliCb, DWORD dwLockType)
+{
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT FileLockBytes::UnlockRegion(ULARGE_INTEGER uliOffset, ULARGE_INTEGER uliCb, DWORD dwLockType)
+{
+ // Locks are never necessary, so don't bother.
+ return S_OK;
+}
+
+HRESULT FileLockBytes::Stat(STATSTGA FAR *pstatstg, DWORD grfStatFlag)
+{
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+#pragma code_seg()
+
+
+
+#if OE_WIN32 //FileLockBytesMemory is Win32-only
+FileLockBytesMemory::FileLockBytesMemory()
+{
+ m_cRefs = 1;
+}
+
+FileLockBytesMemory::~FileLockBytesMemory()
+{
+ // Close the DOS file handle on the DLL, if it's open.
+ if (m_hfile != -1)
+ _lclose(m_hfile);
+ if (m_pvmappingBase)
+ UnmapViewOfFile(m_pvmappingBase);
+ if (m_hmapping)
+ CloseHandle(m_hmapping);
+}
+
+ULONG FileLockBytesMemory::AddRef()
+{
+ return ++m_cRefs;
+}
+
+ULONG FileLockBytesMemory::Release()
+{
+ ULONG cRefs;
+
+ DebAssert(m_cRefs > 0, "Release");
+
+ cRefs = --m_cRefs;
+ if (cRefs == 0) {
+ this->FileLockBytesMemory::~FileLockBytesMemory();
+ MemFree(this);
+ }
+ return cRefs;
+}
+
+HRESULT
+FileLockBytesMemory::ReadAt(
+ ULARGE_INTEGER uliOffset,
+ void HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbRead)
+{
+ DebAssert(m_hfile != -1, "ReadAt");
+ DebAssert(uliOffset.HighPart == 0, "ReadAt");
+
+ // make sure the seek is within the file
+ if (uliOffset.LowPart > m_ulEOF)
+ return HresultOfScode(STG_E_SEEKERROR);
+
+ if (uliOffset.LowPart+cb >= m_ulEOF)
+ cb = uliOffset.LowPart-m_ulEOF;
+
+ // use structured exception handling to cope with read errors
+ // during the file I/O
+ __try {
+
+ memcpy(pv, ((char *)m_pvmapping)+uliOffset.LowPart, cb);
+
+ } __except(EXCEPTION_EXECUTE_HANDLER) {
+
+ return HresultOfScode(STG_E_READFAULT);
+
+ }
+
+ if (pcbRead != NULL)
+ *pcbRead = cb;
+
+ return NOERROR;
+}
+
+HRESULT FileLockBytesMemory::QueryInterface(REFIID riid, LPVOID FAR *ppvObj)
+{
+ if (riid == IID_ILockBytesA) {
+ AddRef();
+ *ppvObj = (ILockBytesA *)this;
+ return S_OK;
+ }
+ else {
+ *ppvObj = NULL;
+ return HresultOfScode(E_NOINTERFACE);
+ }
+}
+
+HRESULT
+FileLockBytesMemory::WriteAt(
+ ULARGE_INTEGER uliOffset,
+ void const HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbWritten)
+{
+ DebAssert(FALSE, "Memory-mapped files are only used for READ");
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT FileLockBytesMemory::Flush()
+{
+ // Since the file is open for read-only, this is a no-op
+ return S_OK;
+}
+
+HRESULT FileLockBytesMemory::SetSize(ULARGE_INTEGER uliCb)
+{
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT FileLockBytesMemory::LockRegion(ULARGE_INTEGER uliOffset, ULARGE_INTEGER uliCb, DWORD dwLockType)
+{
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+
+HRESULT FileLockBytesMemory::UnlockRegion(ULARGE_INTEGER uliOffset, ULARGE_INTEGER uliCb, DWORD dwLockType)
+{
+ // Locks are never necessary, so don't bother.
+ return S_OK;
+}
+
+HRESULT FileLockBytesMemory::Stat(STATSTGA FAR *pstatstg, DWORD grfStatFlag)
+{
+ return HresultOfScode(STG_E_UNIMPLEMENTEDFUNCTION);
+}
+#endif //OE_WIN32
+
+#if OE_MAC
+#pragma code_seg(CS_INIT)
+#endif
diff --git a/private/oleauto/src/typelib/gtlibstg.hxx b/private/oleauto/src/typelib/gtlibstg.hxx
new file mode 100644
index 000000000..558dfa4e3
--- /dev/null
+++ b/private/oleauto/src/typelib/gtlibstg.hxx
@@ -0,0 +1,208 @@
+/***
+*gtlibstg.hxx - Light-weight implementations of IStorage and IStream.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This is used in IE_OLE build only as the default underlying IStorage
+* and IStream implementations for serializing ITypeLib.
+*
+*Revision History:
+* [00] Sept-01-93 mikewo: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef GTLIBSTG_HXX_INCLUDED
+#define GTLIBSTG_HXX_INCLUDED
+
+
+#define GTLIBSTORAGE_SIGNATURE 0x47544c53
+
+struct GTLibStgHdr {
+ ULONG ulSignature; // The signature at the beginning of the file.
+ USHORT wCStrm; // The number of streams.
+ USHORT wCbExtra; // The number of bytes between the name table
+ // and the first stream. This is generally a
+ // small multiple of 8.
+ USHORT wCbNameTable; // The number of bytes in the name table.
+ USHORT wStreamFirst; // The first SerStreamInfo in the linked list
+ // which is sorted by order of the actual stream
+ // data in the file.
+ GUID guid; // The guid associated with this IStorage.
+};
+
+
+HRESULT
+OpenFileLockBytes(BOOL isNew,
+ LPOLESTR szFile,
+ ILockBytesA **pplockbytes);
+
+HRESULT
+CreateFileLockBytesOnHFILE(int hfile,
+ BOOL isNew,
+ ULONG oStart,
+ ULONG cbData,
+ ILockBytesA **plockbytes);
+
+struct StreamInfo;
+class GTLibStream;
+
+class GTLibStorage : public IStorageA
+{
+friend class GTLibStream;
+
+public:
+ static HRESULT Create(ILockBytesA FAR *plockbytes,
+ UINT cstreamMax,
+ IStorageA FAR * FAR *ppstg);
+ static HRESULT OpenForReadOnly(ILockBytesA FAR *plockbytes,
+ IStorageA FAR * FAR *ppstg);
+
+ // Methods implemented for IUnknown.
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR *ppvObj);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ // Methods implemented for IStorage.
+ STDMETHOD(CreateStream)(const OLECHAR FAR* pwcsName,
+ DWORD grfMode,
+ DWORD reserved1,
+ DWORD reserved2,
+ IStreamA FAR *FAR *ppstm);
+ STDMETHOD(OpenStream)(const OLECHAR FAR* pwcsName,
+ void FAR *reserved1,
+ DWORD grfMode,
+ DWORD reserved2,
+ IStreamA FAR *FAR *ppstm);
+ STDMETHOD(CreateStorage)(const OLECHAR FAR* pwcsName,
+ DWORD grfMode,
+ DWORD reserved1,
+ DWORD reserved2,
+ IStorageA FAR *FAR *ppstg);
+ STDMETHOD(OpenStorage)(const OLECHAR FAR* pwcsName,
+ IStorageA FAR *pstgPriority,
+ DWORD grfMode,
+ SNBA snbExclude,
+ DWORD reserved,
+ IStorageA FAR *FAR *ppstg);
+ STDMETHOD(CopyTo)(DWORD ciidExclude,
+ IID const FAR *rgiidExclude,
+ SNBA snbExclude,
+ IStorageA FAR *pstgDest);
+ STDMETHOD(MoveElementTo)(OLECHAR const FAR* lpszName,
+ IStorageA FAR *pstgDest,
+ OLECHAR const FAR* lpszNewName,
+ DWORD grfFlags);
+ STDMETHOD(Commit)(DWORD grfCommitFlags);
+ STDMETHOD(Revert)(void);
+ STDMETHOD(EnumElements)(DWORD reserved1,
+ void FAR *reserved2,
+ DWORD reserved3,
+ IEnumSTATSTGA FAR *FAR *ppenm);
+ STDMETHOD(DestroyElement)(const OLECHAR FAR* pwcsName);
+ STDMETHOD(RenameElement)(const OLECHAR FAR* pwcsOldName,
+ const OLECHAR FAR* pwcsNewName);
+ STDMETHOD(SetElementTimes)(const OLECHAR FAR *lpszName,
+ FILETIME const FAR *pctime,
+ FILETIME const FAR *patime,
+ FILETIME const FAR *pmtime);
+ STDMETHOD(SetClass)(REFCLSID clsid);
+ STDMETHOD(SetStateBits)(DWORD grfStateBits, DWORD grfMask);
+ STDMETHOD(Stat)(STATSTGA FAR *pstatstg, DWORD grfStatFlag);
+
+protected:
+ GTLibStorage(); // No external client should directly construct
+ ~GTLibStorage();// or destruct an instance of this class.
+
+ // Used by OpenStream.
+ nonvirt StreamInfo FAR *LookupStream(const char FAR* pwcsName);
+
+ // Used by GTLibStream destructor after we're done writing a stream.
+ nonvirt void NotifyStreamClosed(ULONG ulCb);
+ VOID SortStreamInfo(StreamInfo *rgstrminfo, UINT uCount);
+ VOID SwapStreamInfos(StreamInfo *pstrminfo1, StreamInfo *pstrminfo2);
+
+ ULONG m_cRefs; // The reference count.
+ GUID m_guid; // The guid;
+ ILockBytesA FAR *m_plockbytes; // The underlying ILockBytes instance.
+ StreamInfo FAR *m_rgstrminfo; // The array of info about each stream,
+ // sorted alphabetically by name.
+ // This points into m_pvHdrData.
+ LPVOID m_pvHdrData; // The raw header data read from the file.
+ ULONG m_ulOffsetNext; // The offset of the next stream to be
+ // created. Used only in write mode.
+ LPSTR m_szNameFirst; // The pointer (into m_pvHdrData) to the
+ // most recent name allocated. The name
+ // grows down from the top of m_pvHdrData.
+ // Used only in write mode.
+ LPSTR m_szNameLim; // Marks the end of the name table heap.
+ // Used only in write mode.
+ UINT m_istrminfoOpen; // The index (into m_rgstrminfo) of the
+ // currently open stream, or -1 if none.
+ // Used only in write mode.
+ UINT m_cstrminfo; // The number of entries in m_rgstrminfo.
+};
+
+
+class GTLibStream : public IStreamA
+{
+public:
+ static HRESULT Create(ILockBytesA FAR *plockbytes,
+ ULONG ulOffset,
+ GTLibStorage FAR *pgtlstgContainer,
+ IStreamA FAR * FAR *ppstm);
+ static HRESULT Open(ILockBytesA FAR *plockbytes,
+ ULONG ulOffset,
+ ULONG ulCb,
+ IStreamA FAR* FAR* ppstm);
+
+ // Methods implemented for IUnknown.
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID FAR *ppvObj);
+ virtual ULONG STDMETHODCALLTYPE AddRef();
+ virtual ULONG STDMETHODCALLTYPE Release();
+
+ // Methods implemented for IStream.
+ virtual HRESULT STDMETHODCALLTYPE Read(VOID HUGEP *pv,
+ ULONG cb, ULONG FAR *pcbRead);
+ virtual HRESULT STDMETHODCALLTYPE Write(VOID const HUGEP *pv,
+ ULONG cb,
+ ULONG FAR *pcbWritten);
+ virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER dlibMove,
+ DWORD dwOrigin,
+ ULARGE_INTEGER FAR *plibNewPosition);
+ virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER libNewSize);
+ virtual HRESULT STDMETHODCALLTYPE CopyTo(IStreamA FAR *pstm,
+ ULARGE_INTEGER cb,
+ ULARGE_INTEGER FAR *pcbRead,
+ ULARGE_INTEGER FAR *pcbWritten);
+ virtual HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags);
+ virtual HRESULT STDMETHODCALLTYPE Revert();
+ virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType);
+ virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER libOffset,
+ ULARGE_INTEGER cb,
+ DWORD dwLockType);
+ virtual HRESULT STDMETHODCALLTYPE Stat(STATSTGA FAR *pstatstg, DWORD grfStatFlag);
+ virtual HRESULT STDMETHODCALLTYPE Clone(IStreamA FAR * FAR *ppstm);
+
+protected:
+ GTLibStream(); // No external client should directly construct
+ ~GTLibStream(); // or destruct an instance of this class.
+
+ ULONG m_cRefs; // The reference count.
+ ILockBytesA FAR *m_plockbytes; // The underlying ILockBytes instance.
+ ULONG m_ulCb; // The length of the stream in bytes.
+ ULONG m_ulOffsetStart; // The offset (in the lockbytes) of the
+ // start of the stream.
+ ULONG m_ulOffsetCur; // The current seek position (from start
+ // of the stream).
+ GTLibStorage FAR *m_pgtlstgContainer; // The containing storage, if it
+ // needs to be notified on closure.
+};
+
+
+#endif // GTLIBSTG_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/impmgr.cxx b/private/oleauto/src/typelib/impmgr.cxx
new file mode 100644
index 000000000..2b80ef62b
--- /dev/null
+++ b/private/oleauto/src/typelib/impmgr.cxx
@@ -0,0 +1,1502 @@
+/***
+*impmgr.cxx - Import Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The Import Manager for a Type manages references to other Types.
+*
+*Owner:
+* AlanC
+*
+*Implementation Notes:
+* The IMPTYPE entries are represented using two parallel arrays.
+* Qimptype(himptype) returns a pointer to the entry in the IMPTYPE
+* array for that import entry.
+* Qubimptype(himptype) returns a pointer to the entry in the UB_IMPTYPE
+* array for the import entry.
+* When an impory entry's reference count goes to zero it is added to
+* the free list. This implies that the arrays are sparse in that free
+* array elements may be inter-mixed with allocated elements.
+* When a new import entry must be allocated and the free list is empty
+* then cimptypeGrow entries are added to the free list.
+*
+* The import manager distinguishes between four types of references
+* to TypeInfos:
+* - a self-referential import entry references the module itself
+* This case is explicitly checked for by testing whether the TypeInfo
+* pointer associated with the entry is equal to the pointer to
+* the TypeInfo which contains the import manager
+* - references to nested TypeInfos (record TypeInfos in same module)
+* The import entries which reference record TypeInfos in this module
+* do not 'bump' the reference count of the record TypeInfos in any way
+* Such references are indicated by m_depkind == DEP_Nested
+* - references to other TypeInfos in the same library.
+* Import entries of this type maintain an internal reference to the
+* TypeInfo
+* Such references are indicated by m_isInternalRef == TRUE
+* - references to TypeInfos in other libraries
+* These maintain a normal external reference.
+*
+* Note that references to record TypeInfos defined in other modules are not
+* distinguished from references to other TypeInfos except for the case
+* where an external reference to the record TypeInfo is needed because
+* it is defined by a TypeInfo contained in the same library as this
+* TypeInfo. It is necessary to explicitly test for this situation in
+* order to add an internal reference to the RecTypeInfo since there is no
+* common protocol that introduces the AddInternal method.
+*
+* UNDONE OA95: When the impmgr is saved or when it drops a reference to a
+* ITypeInfo then it should update its copy of the ITypeInfo's TYPEID
+*
+*
+*Revision History:
+* 26-Aug-91 ilanc: Ripped asserts in Init
+* 27-Nov-91 ilanc: Ripped const cast away of this in
+* DebCheckState and DebShowState.
+* 03-Apr-92 martinc: added explicit casts from bitfield to enum (for cfront)
+* 18-Jun-92 w-peterh: changes to debshowstate
+* 10-Jul-92 w-peterh: added SetTypeInfoAndDepKind()
+* 26-Aug-92 rajivk : wrapped all the DePrintf with ID_TEST and ID_DEBUG
+* 17-Sep-92 rajivk: added functions for editing modules. Edit & Continue
+* 15-Nov-92 rajivk: CheckLaoutDep verifies the project id.
+* 12-Feb-93 w-peterh: GetContainingTypeLib returns HRESULT
+* 12-Mar-93 rajivk: Support for Byte swapping.
+*
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "typelib.hxx"
+#include <new.h>
+#include "sheapmgr.hxx"
+#include "impmgr.hxx"
+#include "xstring.h"
+#include "gdtinfo.hxx"
+#include "clutil.hxx"
+#include "nammgr.hxx"
+#include "exbind.hxx" // for EXBIND -- BindTypeDefn needs it.
+
+//#if !OE_REALMODE
+//#include "genproj.hxx"
+//#endif
+
+#include <stdlib.h>
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleImpmgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleImpmgrCxx
+#else
+static char szImpmgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szImpmgrCxx
+#endif
+#endif
+
+//this is a table used to map runtime function ordinals to the address of the function
+//on the Mac.
+#if OE_MAC
+#define RTORDINAL_FIRST 512
+#define RTORDINAL_LAST 685 // rtErrObj
+#define RTORDINAL_BAD ((WORD)0xFFFF) //bad ordinal value
+extern "C" void *rgMacStrdcl[]; //generated by build process in strdcl.c
+#endif
+
+// Define static class constants
+#pragma code_seg(CS_INIT)
+BYTE IMPMGR::bFirstSerByte = 0;
+BYTE IMPMGR::bCurVersion = 0;
+#define cimptypeGrow 1
+#pragma code_seg(CS_INIT)
+
+
+/***
+*PUBLIC IMPMGR constructor
+*Purpose:
+* need to initialize const/static class members
+* since cfront is buggy and we have no ctor linker.
+*
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+IMPMGR::IMPMGR()
+{
+ if (bFirstSerByte == 0) {
+ bFirstSerByte = 'I' * 2 + 'M';
+ }
+
+ m_fCheckRemainingDepCalled = TRUE;
+
+ m_lPosOfDeps = 0;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC IMPMGR::Init - import manager initialization method
+*Purpose:
+* initialize import manager.
+*
+*Entry:
+* psheapmgr - pointer to SHEAP_MGR.
+* pbdTimptype - pointer to BLK_DESC of Timptype table
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+TIPERROR IMPMGR::Init(SHEAP_MGR * psheapmgr,
+ BLK_DESC * pbdTimptype,
+ BLK_DESC * pbdTimpaddr,
+ DYN_TYPEROOT *pdtroot)
+{
+ UINT i;
+ TIPERROR err;
+
+ IfErrRet( m_bdTubimptype.Init(psheapmgr, 0) );
+
+ // Save pointer to bdTimptype and bdTimpaddr
+ m_pbdTimptype = pbdTimptype;
+
+ DebAssert(pbdTimptype->CbSize() == 0, "IMPMGR::Init bdTimptype not empty");
+ DebAssert(pbdTimptype->IsValid(), "IMPMGR::Init bdTimptype not valid");
+
+ // Initialize the bucket table
+ for (i = 0; i < IMPMGR_cBuckets; i++) {
+ m_rghimptypeBucket[i] = (sHIMPTYPE) HIMPTYPE_Nil;
+ }
+
+ m_himptypeFreeList = (sHIMPTYPE) HIMPTYPE_Nil;
+
+
+ m_fCheckRemainingDepCalled = TRUE;
+ m_lPosOfDeps = 0;
+#if OE_RISC
+ m_ptlbtempl = NULL;
+#endif //OE_RISC
+
+ m_pdtroot = pdtroot;
+
+ // Note: the destructor checks to see if the bmData block is valid to
+ // determine whether or not initialization succeeded
+ IfErrRet(m_bmData.Init(psheapmgr));
+
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+
+/***
+*PRIVATE IMPMGR::Rqimptype - returns pointer to timptype
+*Purpose:
+* Returns pointer to array of pointers to TypeInfo's
+*
+*Entry:
+* none
+*
+*Exit:
+* return pointer to timptype
+*
+***********************************************************************/
+
+inline IMPTYPE* IMPMGR::Rqimptype() const
+{
+ return (IMPTYPE *)(m_pbdTimptype->QtrOfBlock());
+}
+
+
+/***
+*PRIVATE IMPMGR::Rqubimptype - returns pointer to tubimptype
+*Purpose:
+* Returns pointer to tubimptype
+*
+*Entry:
+* none
+*
+*Exit:
+* return pointer to tubimptype
+*
+***********************************************************************/
+
+inline UB_IMPTYPE *IMPMGR::Rqubimptype() const
+{
+ return (UB_IMPTYPE *)(m_bdTubimptype.QtrOfBlock());
+}
+
+
+/***
+*PRIVATE IMPMGR::Himptype - return handle for import entry given qubimptype
+*Purpose:
+* return handle for import entry given qubimptype
+* Causes no heap movement.
+*
+*Entry:
+* qubimptype - pointer to UB_IMPTYPE entry
+*
+*Exit:
+* return handle for import entry
+*
+***********************************************************************/
+
+inline HIMPTYPE IMPMGR::Himptype(UB_IMPTYPE *qubimptype) const
+{
+ return (qubimptype - Rqubimptype()) * sizeof(IMPTYPE);
+}
+
+
+
+
+/***
+*PRIVATE IMPMGR::ReleasePtinfo
+*Purpose:
+* Release the typeinfo pointer owned by an import entry.
+* If the pointer is null on entry do nothing.
+* Sets the pointer to null before exiting.
+*
+*Entry:
+* himptype - handle of import entry whose ptinfo is to be released
+*
+*Exit:
+* None
+***********************************************************************/
+
+#pragma code_seg(CS_CORE2)
+VOID IMPMGR::ReleasePtinfo(HIMPTYPE himptype)
+{
+ ITypeInfoA *ptinfo = ((ITypeInfoA *)(ULONG) Qimptype(himptype)->m_ptinfo);
+
+ // If the pointer is NULL of if the import entry references the
+ // container TypeInfo then don't release it
+ // 21-Aug-92 ilanc: don't do this for nested types (was == Nested)
+ // 24-Aug-92 ilanc: do this for nested types --
+ // but make it internal release.
+ // 24-Aug-92 ilanc: if this is nested type contained w/in
+ // this type -- do nothing as well.
+ // 24-Aug-92 ilanc: commented out DEP_Nested conjunct.
+ // 25-Aug-92 ilanc: reintroduced DEP_Nested conjunct since
+ // it's only ever set for nested types
+ // of this module and SetNestedTypeInfo
+ // doesn't an int/ext refcount.
+ //
+ if (ptinfo != NULL &&
+ ptinfo != m_pdtroot->Pgdtinfo()) {
+
+ if (Qubimptype(himptype)->m_depkind != DEP_Nested) {
+
+ // If this is a reference to a TypeInfo in the same library then
+ // release its internal reference; otherwise do a normal release
+ if (Qubimptype(himptype)->m_isInternalRef) {
+ // Note that we know the truetype of the typeinfo in this case
+ // since ptinfo must point into this impmgr's containing typelib.
+ // That truetype supports the ole implementation of STL_TYPEINFO
+ // even though we can't QueryInterface to STL_TYPEINFO.
+ ((STL_TYPEINFO *)ptinfo)->RelInternalRef();
+ }
+ else
+ ptinfo->Release();
+ }
+ Qimptype(himptype)->m_ptinfo = NULL;
+ }
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE IMPMGR::SetPtinfo
+*Purpose:
+* Set m_ptinfo of the import entry to the passed in TypeInfo
+* SetPtinfo changes the internal/external reference status of the
+* passed in TypeInfo as needed to account for the addition of
+* a reference to that TypeInfo from the import entry.
+*
+*Entry:
+* himptype - handle of import entry whose ptinfo is to be released
+* ptinfo - pointer to TypeInfo
+*
+*Exit:
+* None
+***********************************************************************/
+
+TIPERROR IMPMGR::SetPtinfo(HIMPTYPE himptype, ITypeInfoA *ptinfo, BOOL fDepBeingRead)
+{
+ TIPERROR err;
+ ITypeLibA *ptlib1, *ptlib2;
+
+
+ // Store the reference
+ Qimptype(himptype)->m_ptinfo = ptinfo;
+
+ // Avoid adding a reference to the typeinfo which contains
+ // the import manager so that there is not a circular reference problem
+ if (ptinfo == m_pdtroot->Pgdtinfo())
+ return TIPERR_None;
+
+ // Assume that an external reference will be needed.
+ ptinfo->AddRef();
+
+ // Check whether the referenced TypeInfo is in the same library.
+ // If it is then release the external reference and add an internal
+ // reference to the TypeInfo instead.
+ // Have to deal with the REC_TYPEINFO and STL_TYPEINFO cases separately
+ // since there is no protocol that contains the AddInternalRef function
+
+ // First get a pointer to the containing TypeLib
+ err = TiperrOfHresult(m_pdtroot->Pgdtinfo()->GetContainingTypeLib(&ptlib2, NULL));
+ DebAssert(err == TIPERR_None, "SetPtinfo - no container");
+ ptlib2->Release();
+
+ // If ptinfo is contained in the same library as this impmgr's typeinfo,
+ // then change the reference to internal.
+ err = TiperrOfHresult(ptinfo->GetContainingTypeLib(&ptlib1, NULL));
+ DebAssert(err == TIPERR_None, "SetPtinfo - no container");
+
+ ptlib1->Release();
+ if (ptlib1 == ptlib2) {
+ ((STL_TYPEINFO *)ptinfo)->AddInternalRef();
+ ptinfo->Release();
+ Qubimptype(himptype)->m_isInternalRef = TRUE;
+ }
+ return TIPERR_None;
+}
+
+
+/***
+*PRIVATE IMPMGR::HimptypeAlloc
+*Purpose:
+* Allocate an imptype entry. Grows free list if its empty.
+*
+*Entry:
+* phimptype - Return parameter for himptype
+*
+*Exit:
+* himptype - handle for allocated import entry
+*
+*CONSIDER: it may not be worth the extra code to grow the free list
+*CONSIDER: 10 at a time since the SHEAPMGR will be changed to buffer
+*CONSIDER: the heap entries
+***********************************************************************/
+
+TIPERROR IMPMGR::HimptypeAlloc(sHIMPTYPE *phimptype)
+{
+ UB_IMPTYPE *qubimptype, *qubimptypeEmpty;
+ IMPTYPE *qimptype;
+ UINT cbSize;
+ HIMPTYPE himptype;
+ TIPERROR err;
+
+ if (m_himptypeFreeList == (sHIMPTYPE) HIMPTYPE_Nil) {
+
+ // Add cimptypeGrow Imptype enties to free list
+
+ // Increase size of Timptype array by cimptype entries
+ // and initialize each entry to NULL
+ // Note that the constructor of the IMPTYPE entries is never called
+ cbSize = m_pbdTimptype->CbSize();
+ IfErrRet( m_pbdTimptype->Realloc(cbSize +
+ cimptypeGrow*sizeof(IMPTYPE)) );
+ qimptype = (IMPTYPE *)(((BYTE *)Rqimptype()) + cbSize);
+ if (cimptypeGrow == 1)
+ ::new (qimptype) IMPTYPE;
+ else
+ ::new (qimptype) IMPTYPE[cimptypeGrow];
+
+ // Grow the Tubimptype array by cimptypeGrow elements
+ cbSize = m_bdTubimptype.CbSize();
+
+ if (err = m_bdTubimptype.Realloc(cbSize +
+ cimptypeGrow*sizeof(UB_IMPTYPE)) ) {
+ // Undo growing the Timptype table
+ m_pbdTimptype->Realloc(m_pbdTimptype->CbSize() -
+ cimptypeGrow*sizeof(IMPTYPE));
+ return err;
+ }
+
+ // Initialize entries and link them into the free list
+ // qubimptypeEmpty points to front of free list when loop exited
+ qubimptypeEmpty = (UB_IMPTYPE *)(((BYTE *)Rqubimptype()) + cbSize);
+ himptype = m_himptypeFreeList;
+ for (qubimptype = qubimptypeEmpty + cimptypeGrow - 1;
+ qubimptype >= qubimptypeEmpty;
+ qubimptype--) {
+
+ // call the Constructor to initialize the UB_IMPTYPE instance.
+ ::new (qubimptype) UB_IMPTYPE;
+
+ qubimptype->m_himptypeNext = (sHIMPTYPE) himptype;
+
+ himptype = Himptype(qubimptype);
+ }
+
+ }
+ else {
+ qubimptypeEmpty = Qubimptype((HIMPTYPE) m_himptypeFreeList);
+ DebAssert(qubimptypeEmpty->m_cRefs == 0 &&
+ qubimptypeEmpty->m_isInternalRef == FALSE &&
+ qubimptypeEmpty->m_isExcodeRef == FALSE &&
+ qubimptypeEmpty->m_isDeclRef == FALSE &&
+ qubimptypeEmpty->m_refkind == REF_NoName &&
+ qubimptypeEmpty->m_depkind == DEP_None, " The way things should be ");
+ }
+
+
+#if ID_DEBUG
+ // Set up head of free list and check state of the IMPMGR
+ m_himptypeFreeList = (sHIMPTYPE) Himptype(qubimptypeEmpty);
+ DebCheckState(1);
+#endif
+
+ // qubimptypeEmpty points to the head of the free list
+ // Update the m_himptypeFreeList to point to the second element
+ // in the free list and return the old head.
+ m_himptypeFreeList = (sHIMPTYPE) qubimptypeEmpty->m_himptypeNext;
+
+ // Reset the NEXT pointer of the entry we're returning
+ qubimptypeEmpty->m_himptypeNext = (sHIMPTYPE) HIMPTYPE_Nil;
+
+ *phimptype = Himptype(qubimptypeEmpty);
+ return TIPERR_None;
+}
+
+
+/***
+*PRIVATE IMPMGR::NewEntry - allocate a new IMPTYPE entry
+*Purpose:
+* Allocates and initializes a new IMPTYPE entry.
+* Links the new entry into the front of the bucket list.
+*
+*Entry:
+* pqubimptype - returns pointer to UB_IMPTYPE of the new entry
+* phimptype - returns the himptype of the new entry
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+TIPERROR IMPMGR::NewEntry(UB_IMPTYPE **pqubimptype,
+ sHIMPTYPE *phimptype)
+{
+ TIPERROR err;
+ UB_IMPTYPE *qubimptype;
+
+ IfErrRet( HimptypeAlloc(phimptype) );
+
+ // Initialize the new entry
+ Qimptype(*phimptype)->m_ptinfo = NULL;
+ qubimptype = *pqubimptype = Qubimptype(*phimptype);
+
+ // Following assertions are true because the entry was previously free
+ DebAssert( qubimptype->m_cRefs == 0 &&
+ qubimptype->m_isExcodeRef == FALSE,
+ "IMPMGR::NewEntry: entry incorrectly initialized");
+
+ qubimptype->m_refkind = REF_Name; // Set to this so that the entry
+ // can be passed to Free without
+ // additional initialization
+ qubimptype->m_depkind = DEP_None;
+
+ return TIPERR_None;
+}
+
+
+/***
+*PRIVATE IBucket - hash function for hlnam
+*Purpose:
+* Map hlnam to a bucket index.
+*Entry:
+* hlnam
+*
+*Exit:
+* bucket index
+*
+***********************************************************************/
+
+inline UINT IMPMGR::IBucket(HLNAM hlnam)
+{
+ return (hlnam >> 3) % IMPMGR_cBuckets;
+}
+
+
+/***
+*PRIVATE IMPMGR::IBucket - hash function for qualified name
+*Purpose:
+* Map a qualified name to the index of the bucket in which an import
+* entry with that name should be stored.
+*
+*Entry:
+* cName - number of names in qualified name
+* rghlnam - array of local name handles
+*
+*Exit:
+* bucket index
+*
+***********************************************************************/
+
+inline UINT IMPMGR::IBucket(UINT cName, sHLNAM rghlnam[])
+{
+ // Hash based on the last name
+ return IBucket(rghlnam[cName - 1]);
+}
+
+
+
+
+
+
+
+/***
+*PUBLIC IMPMGR::GetHimptype - return Himptype given pointer to TypeInfo
+*Purpose:
+* Returns handle of ImpType entry associated with passed in TypeInfo.
+* Adds new entry if there is none and assigns it depkind.
+* Always increments the reference count of the import entry.
+*
+*Entry:
+* ptinfo - pointer to TypeInfo
+* depkind - specifies to what level decompilation is needed if can't
+* refind the TypeInfo.
+* phimptype - parameter for returning HIMPTYPE
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR IMPMGR::GetHimptype(ITypeInfoA *ptinfo,
+ DEPEND_KIND depkind,
+ sHIMPTYPE *phimptype)
+{
+ UB_IMPTYPE *qubimptype;
+ TIPERROR err;
+ UINT cImpType = m_pbdTimptype->CbSize() / sizeof(IMPTYPE);
+ UB_IMPTYPE *rqubimptype = Rqubimptype();
+ IMPTYPE *rqimptype = Rqimptype();
+ BOOL fNew = FALSE;
+
+ *phimptype = GetHimptypeIfExists( ptinfo );
+ if ( *phimptype != HIMPTYPE_Nil) {
+ qubimptype = Qubimptype(*phimptype);
+ }
+ else {
+ // No matching entry found --- allocate a new one
+ // Note that the new entry is not linked into the hash table
+ IfErrRet (NewEntry(&qubimptype, phimptype));
+
+ qubimptype->m_refkind = (depkind == DEP_Base) ? REF_Base :
+ REF_NoName;
+ fNew = TRUE;
+ }
+
+ // Set the depend kind to MAX_OF(qubimptype->m_depkind and depkind)
+ qubimptype->m_depkind = max(qubimptype->m_depkind, depkind);
+ qubimptype->m_cRefs++;
+
+ if (fNew)
+ IfErrRet(SetPtinfo(*phimptype, ptinfo));
+
+ return TIPERR_None;
+}
+
+
+
+
+/***
+*PUBLIC IMPMGR::GetHimptypeIfExists - return Himptype, given a pointer to TypeInfo
+*Purpose:
+* It returns the corresponding himptype for given typeinfo.
+* If there is no import entry for this typeinfo then HIMPTYPE_Nil
+* is returned.
+*
+*Entry:
+* ptinfo - pointer to TypeInfo
+*
+*
+*Exit:
+* HIMPTYPE
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HIMPTYPE IMPMGR::GetHimptypeIfExists(ITypeInfoA *ptinfo)
+{
+ UINT i;
+ UINT cImpType = m_pbdTimptype->CbSize() / sizeof(IMPTYPE);
+ UB_IMPTYPE *rqubimptype = Rqubimptype();
+ IMPTYPE *rqimptype = Rqimptype();
+
+ // Does a linear search on ImpAddr to find a matching TypeInfo pointer.
+ // CONSIDER: building a non-persistant hash table to make this faster
+ for (i = 0; i < cImpType; i++)
+ if (!rqubimptype[i].isFree() && // if not a free entry
+ rqimptype[i].m_ptinfo == ptinfo) { // and TypeInfo ptr matches
+
+ return HimptypeOfIndex(i);
+ }
+
+ return HIMPTYPE_Nil;
+
+}
+#pragma code_seg( )
+
+
+
+#if ID_DEBUG
+/***
+*PUBLIC GetName
+*Purpose:
+* Retrieves the array of names for an ImpType entry. The
+* returned pointer may become invalid after invoking other
+* methods on the import manager.
+*
+*Entry:
+* himptype - handle for import entry whose name is to be retrieved
+* pcName - returns the number of names
+* prghlnam - returns pointer to array of names
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+VOID IMPMGR::GetName(HIMPTYPE himptype, UINT *pcName, sHLNAM *prghlnam[])
+{
+ UB_IMPTYPE *qubimptype = Qubimptype(himptype);
+ USHORT *qus;
+
+ if (qubimptype->m_refkind == REF_Name) {
+ *pcName = 1;
+ *prghlnam = &(qubimptype->m_hlnam);
+ }
+ else {
+ DebAssert(qubimptype->m_refkind == REF_QualName, "");
+ qus = (USHORT *)m_bmData.QtrOfHandle(qubimptype->m_hrghlnam);
+ *pcName = *qus;
+ *prghlnam = (sHLNAM *)(qus + 1);
+ }
+}
+#endif //EI_OB || ID_DEBUG
+
+
+
+
+/***
+*PUBLIC IMPMGR::GetTypeInfo - returns pointer to TypeInfo of import entry
+*Purpose:
+* Returns pointer to TYPEINFO of import entry.
+*
+*Entry:
+* himptype - handle for ImpType entry
+* pptinfo - returns pointer to ITypeInfo
+*
+*Exit:
+* TIPERROR
+* If TIPERROR = TIPERR_None then *pptinfo returns a pointer to the
+* TYPEINFO. This reference must be released by the caller.
+*
+***********************************************************************/
+
+TIPERROR IMPMGR::GetTypeInfo(HIMPTYPE himptype,
+ DEPEND_KIND depkind,
+ ITypeInfoA **pptinfo)
+{
+ TIPERROR err;
+
+ // We don't care what depkind is set to by this call.
+ IfErrRet( CheckRemainingDep( &depkind ) );
+ *pptinfo = Qimptype(himptype)->m_ptinfo;
+ DebAssert(*pptinfo != NULL, "IMPMGR::GetTypeInfo: m_ptinfo null");
+
+ // Add a reference to account for the TypeInfo pointer being returned
+ (*pptinfo)->AddRef();
+ return TIPERR_None;
+}
+
+
+
+#if 0 //Dead Code
+/***
+*PUBLIC IMPMGR::AddrefHimptype - add reference to an import entry
+*Purpose:
+* Increments reference count of import entry
+*
+*Entry:
+* himptype - handle for ImpType entry
+*
+*Exit:
+* none
+*
+***********************************************************************/
+
+void IMPMGR::AddrefHimptype(HIMPTYPE himptype)
+{
+ UB_IMPTYPE *qubimptype;
+
+ if (himptype==HIMPTYPE_Nil) return;
+
+ qubimptype = Qubimptype(himptype);
+ qubimptype->m_cRefs++;
+}
+#endif //0
+
+
+/***
+*PUBLIC IMPMGR::Unref - unreference an import entry
+*Purpose:
+* Decrements reference count of import entry
+*
+*Entry:
+* himptype - handle for ImpType entry
+*
+*Exit:
+* none
+*
+***********************************************************************/
+
+void IMPMGR::Unref(HIMPTYPE himptype)
+{
+ UB_IMPTYPE *qubimptype;
+
+ if (himptype==HIMPTYPE_Nil) return;
+
+ qubimptype = Qubimptype(himptype);
+
+ DebAssert(qubimptype->m_cRefs > 0, "IMPMGR::Unref: m_cRefs <= 0");
+
+ qubimptype->m_cRefs--;
+
+ // Assert that if the ref count is zero and the entry is not
+ // going to be freed, then the NEXT field does not contain a
+ // valid HIMPTYPE.
+ //
+ DebAssert( qubimptype->m_cRefs != 0
+ || qubimptype->isFree()
+ || qubimptype->m_himptypeNext == (sHIMPTYPE)HIMPTYPE_Nil,
+ "Next field is not Nil");
+
+ DebAssert (!(Qubimptype(himptype)->isFree()), "typelib import entries aren't ever freed");
+}
+
+
+/***
+*PUBLIC IMPMGR::HimptypeFirst - return first Himptype in sequence
+*Purpose:
+* Returns first Himptype in sequence.
+* Subsequent elements of the sequence are generated by HimptypeNext
+* Used by clients who need to iterate over all valid Himptype's
+*
+*Entry:
+* None
+*
+*Exit:
+* return first Himptype or HIMPTYPE_Nil if no Himptype's
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HIMPTYPE IMPMGR::HimptypeFirst() const
+{
+ // The above becomes greatly simplified in the OLE case, where
+ // import entries are never freed (isFree() always returns FALSE).
+ // I chose to do this by hand instead of counting on the C optimizer,
+ // because this routine is called a lot.
+ if (m_pbdTimptype->CbSize()) {
+ return 0;
+ }
+ return HIMPTYPE_Nil;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC IMPMGR::HimptypeNext - return next Himptype in sequence
+*Purpose:
+* Return the Himptype in the sequence which follows HimptypeNext.
+* Note that the ordering of elements in the sequence is irrelevant as
+* long as all Himptypes are in the sequence exactly once.
+* Used by clients who need to iterate over all valid Himptype's
+*
+*Entry:
+* Himptype
+*
+*Exit:
+* return next Himptype in sequence or HIMPTYPE_Nil if no more elements
+* in the sequence
+*
+***********************************************************************/
+
+HIMPTYPE IMPMGR::HimptypeNext(HIMPTYPE himptype) const
+{
+ // The above becomes greatly simplified in the OLE case, where
+ // import entries are never freed (isFree() always returns FALSE).
+ // I chose to do this by hand instead of counting on the C optimizer,
+ // because this routine is called a lot.
+ if ((himptype+sizeof(IMPTYPE)) < m_pbdTimptype->CbSize()) {
+ return himptype+sizeof(IMPTYPE);
+ }
+ return HIMPTYPE_Nil;
+}
+
+
+
+
+
+
+//
+// Import Address Support
+//
+
+
+/***
+*PUBLIC IMPMGR ::RegisterDeclRefDep
+*Purpose: Registers a dependency of the typeinfo (of this impmgr) on Ptinfo.
+* The dependency registered is of type declref.
+*
+*Entry:
+* ptinfo : typeinfo on which this typeinfo depends on.
+*
+*Exit:
+* TIPERROR
+*
+*
+***********************************************************************/
+TIPERROR IMPMGR::RegisterDeclRefDep(ITypeInfoA *ptinfo)
+{
+ TIPERROR err=TIPERR_None;
+ sHIMPTYPE himptype;
+ DEPEND_KIND depkind;
+
+ depkind = m_pdtroot->CompState() < CS_DECLARED ? DEP_Layout : DEP_Code;
+
+ IfErrRet(GetHimptype(ptinfo, depkind, &himptype));
+
+ // Set the DeclRef flag and unref the
+ // himptype to decrement the reference added by GetHimptype.
+
+ Qubimptype(himptype)->m_isDeclRef = TRUE;
+ Unref(himptype);
+
+ DebAssert(himptype != HIMPTYPE_Nil, " Bad Himptype ");
+
+ return err;
+}
+
+
+
+/***
+*PUBLIC IMPMGR::CheckRemainingDep - read import typeids for
+* dependncy that are not of DEP_KIND (DEP_Layout).
+*Purpose:
+* Read previously serialized Typeids from stream.
+* Does modify Timptype table.
+*
+*Entry:
+* pdepkindFail: used for return value. Represents the dependency type that
+* failed.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+TIPERROR IMPMGR::CheckRemainingDep(DEPEND_KIND *pdepkindFail)
+{
+ TIPERROR err = TIPERR_None;
+
+ BYTE b;
+ UINT cEntries;
+ UB_IMPTYPE *qubimptype;
+ IMPTYPE *qimptype, *qimptypeLimit;
+ LPOLESTR szTypeId=NULL;
+ ITypeInfoA *ptinfo;
+ HIMPTYPE himptype;
+ STREAM *pstrm;
+ GenericTypeLibOLE *pgtlibole;
+
+ *pdepkindFail = DEP_None;
+ if ( m_fCheckRemainingDepCalled ) {
+ return TIPERR_None;
+ }
+
+
+ // open the stream
+ IfErrRet(m_pdtroot->Pgdtinfo()->OpenStream(&pstrm, SOM_Read));
+
+ // Set the flag indicating that this function has been called.
+ m_fCheckRemainingDepCalled = TRUE;
+
+ // set the position of the head to read the typeinfos.
+ IfErrGo(pstrm->SetPos( m_lPosOfDeps ));
+
+ // Lock the block desc so that the memory does not move
+ m_bdTubimptype.Lock();
+ m_pbdTimptype->Lock();
+
+ qimptype = Rqimptype();
+ qubimptype = Rqubimptype();
+
+ // Read in the TypeId associated with each TypeInfo when the IMPMGR
+ // was saved. Convert it to a pointer to the TypeInfo.
+ cEntries = m_bdTubimptype.CbSize() / sizeof(UB_IMPTYPE);
+
+ pgtlibole = m_pdtroot->Pgdtinfo()->PgtlibOleContaining();
+
+ qimptypeLimit = Rqimptype() + cEntries;
+ for (; qimptype < qimptypeLimit; qimptype++, qubimptype++) {
+ if ( qubimptype->isFree() == FALSE ) {
+
+ // Read in the typeid.
+ IfErrGo(pstrm->ReadSz(&szTypeId));
+
+ // Map TypeId to the associated TypeInfo
+ err = pgtlibole->TypeInfoFromCompressedTypeId(szTypeId, &ptinfo);
+
+ // Free the szTypeId
+ MemFree(szTypeId);
+ szTypeId = NULL;
+
+ IfErrGo(err);
+
+ // Convert the qimptype to an Himptype
+ himptype = (BYTE *)qimptype - m_pbdTimptype->QtrOfBlock();
+
+ err = SetPtinfo(himptype, (TYPEINFO *)ptinfo);
+ // fall through ...
+
+ // Release the reference added by the TypeInfoFromCompressedTypeId
+ ptinfo->Release();
+
+ IfErrGo(err);
+ } // if
+ } // for
+
+ // Ensure that we have read in all the TypeIds
+ IfErrGo( pstrm->ReadByte(&b) );
+
+ if (b != bFirstSerByte) {
+ err = TIPERR_InvDataRead;
+ goto Error;
+ }
+
+Error:
+ // UnLock the block desc(s)
+ m_bdTubimptype.Unlock();
+ m_pbdTimptype->Unlock();
+
+ if (szTypeId)
+ MemFree(szTypeId);
+
+ // If there was an error then we want to flag that remaining dep(s)
+ // were not read in.
+ if (err) {
+ // Set the flag indicating that this function has not been called.
+ m_fCheckRemainingDepCalled = FALSE;
+ }
+
+ // Release the STREAM;
+ pstrm->Release();
+
+#if ID_DEBUG
+ // Check the state
+ if ((!err) && (*pdepkindFail == DEP_None))
+ DebCheckState(1);
+#endif
+
+ return err;
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC IMPMGR::Read - read import manager from stream
+*Purpose:
+* Read previously serialized IMPMGR from stream.
+* Does not modify Timptype table.
+*
+*Entry:
+* pstrm - stream from which IMPMGR is read
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR IMPMGR::Read(STREAM *pstrm)
+{
+ BYTE b;
+ BYTE bVersion;
+ UINT cEntries;
+ TIPERROR err;
+ IMPTYPE *qimptype, *qimptypeLimit;
+ HIMPTYPE himptype;
+
+ IfErrRet( pstrm->ReadByte(&b) );
+
+ if (b != bFirstSerByte || DebErrorNow(TIPERR_InvDataRead)) {
+ return TIPERR_InvDataRead;
+ }
+
+ IfErrRet( pstrm->ReadByte(&bVersion) );
+
+ if (bVersion != bCurVersion || DebErrorNow(TIPERR_UnsupFormat)) {
+ return TIPERR_UnsupFormat;
+ }
+
+
+ // Read in head of free list and bucket table
+ IfErrRet( pstrm->ReadUShort(&m_himptypeFreeList));
+
+ IfErrRet( pstrm->Read(&m_rghimptypeBucket, sizeof(m_rghimptypeBucket)));
+
+#if HP_BIGENDIAN
+ // For big endian swap the bytes back after reading
+ SwapShortArray(m_rghimptypeBucket, IMPMGR_cBuckets);
+#endif
+
+
+ IfErrRet( m_bdTubimptype.Read(pstrm) );
+
+#if HP_BIGENDIAN
+ SwapStructArray(m_bdTubimptype.QtrOfBlock(),
+ m_bdTubimptype.CbSize() / sizeof(UB_IMPTYPE),
+ UB_IMPTYPE_Layout);
+#endif
+
+
+ IfErrRet( m_bmData.Read(pstrm) );
+
+#if HP_BIGENDIAN
+ SwapbmData(TRUE);
+#endif
+
+ cEntries = m_bdTubimptype.CbSize() / sizeof(UB_IMPTYPE);
+ IfErrRet( m_pbdTimptype->Realloc(cEntries * sizeof(IMPTYPE)) );
+ qimptype = Rqimptype();
+
+ qimptypeLimit = Rqimptype() + cEntries;
+
+ for (; qimptype < qimptypeLimit; qimptype++) {
+ // Convert the qimptype to an Himptype
+ // Initialize each pointer of imptype to NULL;
+ himptype = (BYTE *)qimptype - m_pbdTimptype->QtrOfBlock();
+ // Initialize to NULL
+ Qimptype(himptype)->m_ptinfo = NULL;
+ }
+
+ // Initialize the flags indicating that the CheckRemainingDep and
+ // CheckLayoutDep has not yet been read.
+ m_fCheckRemainingDepCalled = FALSE;
+
+
+ // save the position to the beginning of the typeids
+ pstrm->GetPos( &m_lPosOfDeps );
+
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC IMPMGR::Write - write import manager from stream
+*Purpose:
+* Serialize IMPMGR to stream.
+* Does not serialize Timptype since that is separately serialized.
+*
+*Entry:
+* pstrm - stream to which IMPMGR is written
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR IMPMGR::Write(STREAM *pstrm)
+{
+ TIPERROR err;
+
+ // Write out identification byte and version number
+ IfErrRet( pstrm->WriteByte(bFirstSerByte) );
+ IfErrRet( pstrm->WriteByte(bCurVersion) );
+
+
+ // Write out head of free list and bucket table
+ IfErrRet( pstrm->WriteUShort(m_himptypeFreeList));
+
+
+#if HP_BIGENDIAN
+ // For big endian swap the bytes before writing out and then swap back
+ SwapShortArray(m_rghimptypeBucket, IMPMGR_cBuckets);
+#endif
+
+ err = pstrm->Write(m_rghimptypeBucket, sizeof(m_rghimptypeBucket));
+
+#if HP_BIGENDIAN
+ // For big endian swap the bytes before writing out and then swap back
+ SwapShortArray(m_rghimptypeBucket, (UINT)IMPMGR_cBuckets);
+#endif
+
+ IfErrRet(err);
+
+
+#if HP_BIGENDIAN
+ SwapStructArray(m_bdTubimptype.QtrOfBlock(),
+ m_bdTubimptype.CbSize() / sizeof(UB_IMPTYPE),
+ UB_IMPTYPE_Layout);
+#endif
+
+ // Write out tubimptype
+ err = m_bdTubimptype.Write(pstrm);
+
+#if HP_BIGENDIAN
+ SwapStructArray(m_bdTubimptype.QtrOfBlock(),
+ m_bdTubimptype.CbSize() / sizeof(UB_IMPTYPE),
+ UB_IMPTYPE_Layout);
+#endif
+
+ IfErrRet(err);
+
+#if HP_BIGENDIAN
+ SwapbmData(FALSE);
+#endif
+ err = m_bmData.Write(pstrm);
+
+#if HP_BIGENDIAN
+ SwapbmData(TRUE);
+#endif
+
+ IfErrRet(err);
+
+
+ // For OLE libraries we don't need to verify the project ID and
+ // we WriteLayoutEntries is called only once to write out the TypeIds
+ // for all referenced TypeInfos.
+ // write the type info for which the depend kind is not DEP_Layout kind
+ IfErrRet(WriteLayoutEntries(pstrm, FALSE));
+
+
+ // Write out identification byte in the end so that it is verified in
+ // CheckRemainingDep that we are in sync.
+ IfErrRet( pstrm->WriteByte(bFirstSerByte));
+
+ return TIPERR_None;
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC IMPMGR::WriteLayoutEntries - write import manager's TYPEID to stream
+*Purpose:
+* Writes out the typeids.
+*Entry:
+* pstrm - stream to which IMPMGR is written
+* isLayoutDep - True if entries for layout dep has to be written
+* False if the remaining dep has to be written
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_CREATE)
+TIPERROR IMPMGR::WriteLayoutEntries( STREAM *pstrm, BOOL isLayoutDep )
+{
+ TIPERROR err = TIPERR_None;
+ IMPTYPE *qimptype, *qimptypeEnd;
+ UB_IMPTYPE *qubimptype;
+ GenericTypeLibOLE *pgtlibole;
+
+ pgtlibole = m_pdtroot->Pgdtinfo()->PgtlibOleContaining();
+
+ // Lock the block desc so that the memory does not move
+ m_bdTubimptype.Lock();
+ m_pbdTimptype->Lock();
+
+ qubimptype = Rqubimptype();
+ qimptype = Rqimptype();
+ qimptypeEnd = Rqimptype() + (m_bdTubimptype.CbSize() / sizeof(UB_IMPTYPE));
+
+ for(; qimptype < qimptypeEnd; qimptype++, qubimptype++) {
+ if ( qubimptype->isFree() == FALSE ) {
+ IfErrGo(pgtlibole->WriteTypeId(pstrm, qimptype->m_ptinfo));
+ }
+ }
+
+Error:
+ // Unlock the block desc
+ m_bdTubimptype.Unlock();
+ m_pbdTimptype->Unlock();
+
+ return err;
+}
+#pragma code_seg()
+
+
+
+
+/***
+*PUBLIC IMPMGR::~IMPMGR - IMPMGR destructor
+*Purpose:
+* release resources of IMPMGR instance
+*Entry:
+* psstrm - stream to which IMPMGR is written
+*
+*Exit:
+* none
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE )
+IMPMGR::~IMPMGR()
+{
+ HIMPTYPE himptype;
+
+ // Check to ensure that initialization was successful
+ if (m_bdTubimptype.IsValid() && m_bmData.IsValid()) {
+
+ // Walk the Timptype array and release every TypeInfo
+ for (himptype = HimptypeFirst();
+ himptype != HIMPTYPE_Nil;
+ himptype = HimptypeNext(himptype))
+ ReleasePtinfo(himptype);
+
+ // Shrink space usage back to minimum
+ m_pbdTimptype->Realloc(0);
+
+ //the destructor for member m_pbdTubimptype will release its space
+ }
+
+
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC IMPMGR::RemoveInternalRefs() - Removes internal references.
+*Purpose:
+* This function nulls out the pointer to the referenced typeinfo
+* if this reference is to an internal module. This is done so that
+* in case of a cycle there is no dangling pointer reference.
+* This is called from GEN_DTINFO::RemoveInternalRefs();
+*
+* WARNING :: This should only be called from GEN_DTINFO::RemoveInternalRefs()
+* Which is called from STAT_TYPELIBs desctructor. Never call this
+* function unless you are sure what this does as it will create
+* leaks if the type infos are not deleted explicitly.
+*
+*Entry:
+* None.
+*
+*Exit:
+* none
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE )
+VOID IMPMGR::RemoveInternalRefs()
+{
+ HIMPTYPE himptype;
+
+ DebAssert(m_bdTubimptype.IsValid() && m_bmData.IsValid(), "");
+
+ // Walk the Timptype array and release every TypeInfo
+ for (himptype = HimptypeFirst();
+ himptype != HIMPTYPE_Nil;
+ himptype = HimptypeNext(himptype)) {
+
+ if ( Qubimptype(himptype)->m_isInternalRef )
+ Qimptype(himptype)->m_ptinfo = NULL;
+ }
+}
+#pragma code_seg( )
+
+
+
+
+#if HP_BIGENDIAN
+/***
+*PRIVATE IMPMGR::SwapbmData
+*Purpose:
+* Swaps the array(s) of sHLNAM(s) stored in the BLK_MGR (m_bmData)
+*
+*Entry:
+* fSwapFirst == TRUE if we're un-swapping (i.e. we must swap any
+* data first before we look at it)
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CORE2)
+VOID IMPMGR::SwapbmData(BOOL fSwapFirst) const
+{
+ UINT cEntries;
+ UINT i;
+ UB_IMPTYPE *rqubimptype = Rqubimptype();
+ sHCHUNK hchunk;
+ USHORT cHlnam;
+ HLNAM *qhlnam;
+
+
+ // Count the number of UB_IMPTYPE
+ cEntries = m_bdTubimptype.CbSize() / sizeof(UB_IMPTYPE);
+
+ for (i=0; i < cEntries; i++, rqubimptype++) {
+
+ if (rqubimptype->m_refkind == REF_QualName) {
+ hchunk = rqubimptype->m_hrghlnam;
+
+ qhlnam = (HLNAM *)m_bmData.QtrOfHandle(hchunk);
+
+ // Get the count of HLNAM(s)
+ cHlnam = *(USHORT *)qhlnam;
+
+ if (fSwapFirst) // if un-swapping, must unswap
+ SwapStruct(&cHlnam, "s"); // this before we use it
+ // (otherwise we trash a TON
+ // of memory -- trust me :) )
+
+ // Swap the array of SHORT(s) stored at hchunk.
+ // +1 is for the count of the HLNAM(s)
+ SwapShortArray(qhlnam, cHlnam +1);
+ }
+ }
+}
+#pragma code_seg()
+#endif //HP_BIGENDIAN
+
+
+
+
+
+#if ID_DEBUG
+#pragma code_seg(CS_DEBUG)
+/***
+*PUBLIC IMPMGR::DebCheckState
+*Purpose:
+* Check internal state of IMPMGR.
+*
+*Entry:
+* uLevel
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+nonvirt void IMPMGR::DebCheckState(UINT uLevel) const
+{
+ UINT cbTubimptype = m_bdTubimptype.CbSize();
+ UINT cbSize = m_pbdTimptype->CbSize();
+ UB_IMPTYPE *qubimptype;
+ NAMMGR *pnammgr;
+ USHORT *qus;
+ UINT i;
+ HIMPTYPE himptype;
+ UINT cEntries = 0;
+
+ //
+ // First check the ImpType tables
+ //
+ DebAssert(cbTubimptype / sizeof(UB_IMPTYPE) ==
+ cbSize / sizeof(IMPTYPE),
+ "IMPMGR::DebCheckState: table sizes inconsistent");
+ DebAssert(m_pbdTimptype->IsValid(),
+ "IMPMGR::DebCheckState bdTimptype not valid");
+ DebAssert(m_bdTubimptype.IsValid(),
+ "IMPMGR::DebCheckState bdTubimptype not valid");
+
+ DebAssert(m_pdtroot->GetNamMgr(&pnammgr) == TIPERR_None, "");
+ for (himptype = HimptypeFirst();
+ himptype != HIMPTYPE_Nil;
+ himptype = HimptypeNext(himptype)) {
+ cEntries++;
+ qubimptype = Qubimptype(himptype);
+ if ((qubimptype->m_depkind != DEP_None) &&
+ (qubimptype->m_depkind != DEP_Nested) &&
+ (qubimptype->m_refkind != REF_Name) &&
+ (qubimptype->m_refkind != REF_QualName))
+ DebAssert(Qimptype(himptype)->m_ptinfo != NULL,
+ "IMPMGR::DebCheckState: Ptinfo should be set. ");
+
+ if (qubimptype->m_refkind == REF_Name)
+ pnammgr->DebCheckHlnam(qubimptype->m_hlnam);
+ else if (qubimptype->m_refkind == REF_QualName) {
+ qus = (USHORT *)m_bmData.QtrOfHandle(qubimptype->m_hrghlnam);
+ for (i = *qus++; i > 0; i--)
+ pnammgr->DebCheckHlnam(*(sHLNAM *)qus++);
+ }
+ else
+ DebAssert(qubimptype->m_refkind == REF_Base ||
+ qubimptype->m_refkind == REF_NoName,
+ "IMPMGR::DebChkState: invalid RefKind");
+
+ }
+
+ // In Ole there is nothing in the free list. All entries are valid
+ // entries
+
+ //
+ DebAssert(cbSize / sizeof(IMPTYPE) == cEntries,
+ "IMPMGR::DebCheckState: Free list messed up");
+
+}
+#pragma code_seg()
+
+
+
+
+/***
+*PUBLIC IMPMGR::DebChkHimptype
+*Purpose:
+* Check whether an himptype is valid
+*
+*Entry:
+* himptype
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+void IMPMGR::DebChkHimptype(HIMPTYPE himptype) const
+{
+
+DebAssert( (himptype < m_pbdTimptype->CbSize() &&
+ (himptype % sizeof(IMPTYPE)) == 0 ) ||
+ ( m_fCheckRemainingDepCalled == FALSE ),
+ "DebChkHimptype: invalid import entry");
+}
+
+
+/***
+*PUBLIC IMPMGR::DebChkHimpaddr
+*Purpose:
+* Check whether an himpaddr is valid
+*
+*Entry:
+* himpaddr
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+void IMPMGR::DebChkHimpaddr(HIMPADDR himpaddr) const
+{
+}
+#pragma code_seg()
+
+#endif
+
+
+
+// catches compiler generated code for static construction.
+#pragma code_seg(CS_INIT)
diff --git a/private/oleauto/src/typelib/impmgr.hxx b/private/oleauto/src/typelib/impmgr.hxx
new file mode 100644
index 000000000..043358f69
--- /dev/null
+++ b/private/oleauto/src/typelib/impmgr.hxx
@@ -0,0 +1,490 @@
+/**
+*impmgr.hxx - IMPMGR header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Declaration of IMPMGR class.
+*
+*Revision History:
+*
+* 05-Mar-91 alanc: Created.
+* 27-Nov-91 ilanc: Made SzOfHsz const (to avoid const castaway).
+* 10-Jul-92 w-peterh: added SetTypeInfoAndDepKind()
+* 18-Aug-92 w-peterh: moved IMPADDR def to cltypes.hxx
+* 17-Sep-92 rajivk: Edit & Continue support ( Check LayoutDep and RemainingDep)
+* 17-Sep-92 rajivk: Suport for saving all the edits. ( GetHimpType ).
+* 12-Feb-93 w-peterh: added HimpTypeOfIndex()
+* 09-Jun-93 RajivK : Remove impaddr from typelib.dll and cleanup language dep code.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef IMPMGR_HXX_INCLUDED
+#define IMPMGR_HXX_INCLUDED
+
+#include "sheapmgr.hxx"
+#include "cltypes.hxx"
+#include "stream.hxx"
+#include "blkmgr.hxx"
+#include "gdtinfo.hxx"
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szIMPMGR_HXX)
+#define SZ_FILE_NAME g_szIMPMGR_HXX
+#endif
+
+const UINT IMPMGR_cBuckets = 32;
+
+class TINFO;
+#if OE_RISC
+class TLB_TEMPLATE;
+#endif //OE_RISC
+
+// The higher the number the more decompilation is required to
+// remove that dependency. For example DEP_Layout has the highest
+// number since it requires the type to be decompiled to CS_UNDECLARED
+// when the referenced type's interface changes.
+enum DEPEND_KIND
+{
+ DEP_None,
+ DEP_Code,
+ DEP_Frame,
+ DEP_Layout,
+ DEP_Nested,
+ DEP_Base
+};
+
+enum REF_KIND
+{
+ REF_Name = 0,
+ REF_QualName = 1,
+ REF_NoName = 2,
+ REF_Base = 3
+};
+
+
+/***
+*class UB_IMPTYPE: Element of TUBIMPTYPE array.
+*Purpose:
+* Structure containing the unbound description of an Import entry.
+*
+*NOTE:- If the struture's layout changes then change
+* UB_IMPTYPE_Layout also for correct serialization
+***********************************************************************/
+
+class UB_IMPTYPE
+{
+public:
+ BOOL isFree() const;
+
+ USHORT m_cRefs;
+
+ // all of the following are packed into a single USHORT
+ USHORT m_refkind:6; //(REF_KIND)
+ USHORT m_isDeclRef:1; //(BOOL) set if this entry was created (or would have
+ // been created if it didn't already exist) as
+ // part of the process of getting to Declared state.
+ // Such an entry is created for the containing
+ // modules of nested types referenced by this module.
+ USHORT m_isExcodeRef:1; //(BOOL)set if this entry is refd from the excode table
+ USHORT m_depkind:6; //(DEPEND_KIND)describes how THIS class depends upon imported class.
+ USHORT m_isInternalRef:1; //(BOOL) set if this is a reference to a TypeInfo
+ // in the same library
+
+ sHIMPTYPE m_himptypeNext;
+
+ union {
+ sHLNAM m_hlnam;
+ sHCHUNK m_hrghlnam; //first word of chunk contains count followed
+ //by 1-n words containing sHLNAM's
+ };
+
+ UB_IMPTYPE() {
+ m_cRefs = 0;
+ m_isInternalRef = FALSE;
+ m_isExcodeRef = FALSE;
+ m_isDeclRef = FALSE;
+ m_refkind = REF_NoName;
+ m_depkind = DEP_None;
+ m_himptypeNext = HIMPTYPE_Nil;
+ }
+
+};
+
+// Defines the UB_IMPTYPE structure layout
+#define UB_IMPTYPE_Layout "ssss"
+
+
+
+/***
+*PUBLIC UB_IMPTYPE::isFree - test whether the import entry is free
+*Purpose:
+* Method to test whether this import entry is free
+*
+***********************************************************************/
+
+inline BOOL UB_IMPTYPE::isFree() const
+{
+ return FALSE; // In typelib import entries are never freed
+ // in the typelib.dll implementation.
+}
+
+
+/***
+*CLASS IMPTYPE - element of TIMPTYPE array
+*Purpose:
+* An IMPTYPE entry and its correponding UB_IMPTYPEENTRY contains the
+* complete description of an import entry.
+*
+***********************************************************************/
+
+class IMPTYPE
+{
+public:
+ inline IMPTYPE() {m_ptinfo = NULL;}
+ ITypeInfoA *m_ptinfo;
+};
+
+
+class IMPSTATUS; //needed for friend declaration below
+class COMPILETIME_SEG;
+
+
+/***
+*CLASS IMPMGR - 'impmgr': Import Manager
+*Purpose:
+* The Import Manager for a Type manages references to other Types.
+*
+***********************************************************************/
+
+class IMPMGR
+{
+friend void CheckImpMgrStatus(IMPSTATUS rgimpstatus[],
+ IMPMGR *pimpmgr,
+ NAMMGR *pnammgr);
+
+friend COMPILETIME_SEG;
+
+public:
+
+ IMPMGR(); //called by GEN_DTINFO::GetImpMgr
+ ~IMPMGR();
+ nonvirt TIPERROR Init(SHEAP_MGR * psheapmgr,
+ BLK_DESC * pbdTimptype,
+ BLK_DESC * pbdTimpaddr,
+ DYN_TYPEROOT *pdtroot);
+ HIMPTYPE HimptypeOfIndex(UINT i);
+ UINT IndexOfHimptype(HIMPTYPE himptype);
+
+ nonvirt HIMPTYPE GetHimptypeIfExists(ITypeInfoA *ptinfo);
+ nonvirt TIPERROR GetHimptype(UINT cName,
+ sHLNAM *rghlnam,
+ sHIMPTYPE *phimptype);
+ nonvirt TIPERROR GetHimptype(HLNAM hlnam, sHIMPTYPE *phimptype);
+ nonvirt TIPERROR GetHimptype(UINT cName,
+ sHLNAM *rghlnam,
+ ITypeInfoA *ptinfo,
+ sHIMPTYPE *phimptype);
+ nonvirt TIPERROR GetHimptype(ITypeInfoA *ptinfo,
+ DEPEND_KIND depkind,
+ sHIMPTYPE *phimptype);
+ nonvirt VOID GetName(HIMPTYPE himptype, UINT *pcName, sHLNAM *prghlnam[]);
+
+ nonvirt TIPERROR GetTypeInfo(HIMPTYPE himptype,
+ DEPEND_KIND depkind,
+ TYPEINFO **pptinfo);
+ nonvirt TIPERROR GetTypeInfo(HIMPTYPE himptype,
+ DEPEND_KIND depkind,
+ ITypeInfoA **pptinfo);
+#if 0
+ nonvirt void AddrefHimptype(HIMPTYPE himptype);
+#endif
+ nonvirt void Unref(HIMPTYPE himptype);
+ nonvirt TIPERROR CheckRemainingDep( DEPEND_KIND *pdepkindFail);
+ nonvirt TIPERROR CheckLayoutDep();
+ nonvirt TIPERROR RegisterDeclRefDep(ITypeInfoA *ptinfo);
+ nonvirt TIPERROR RegisterCodeRefDep(ITypeInfoA *ptinfo);
+ nonvirt DEPEND_KIND DepKind(HIMPTYPE himptype);
+
+ nonvirt BOOL IsEmpty();
+
+ nonvirt VOID BindImpTypes();
+ // Method to remove cycle problem within a project.
+ nonvirt VOID RemoveInternalRefs();
+ nonvirt TIPERROR ReadEntireImpMgr();
+ nonvirt TIPERROR WriteLayoutEntries( STREAM *pstrm, BOOL isLayoutDep );
+
+ HIMPTYPE HimptypeFirst() const;
+ HIMPTYPE HimptypeNext(HIMPTYPE himptype) const;
+
+ TIPERROR Read(STREAM *pstrm );
+ TIPERROR Write(STREAM *pstrm);
+
+ // OB specific functions
+
+ nonvirt UINT GetSize();
+
+ nonvirt UINT GetImpTypeSize();
+
+#if ID_DEBUG
+ nonvirt void DebCheckState(UINT uLevel) const;
+ nonvirt void DebShowState(UINT uLevel) const;
+ nonvirt void DebChkHimptype(HIMPTYPE himptype) const;
+ nonvirt void DebChkHimpaddr(HIMPADDR himpaddr) const;
+ nonvirt UINT DebShowSize();
+#else //!ID_DEBUG
+ nonvirt void DebCheckState(UINT uLevel) const {}
+ nonvirt void DebShowState(UINT uLevel) const {}
+ nonvirt void DebChkHimptype(HIMPTYPE himptype) const {}
+ nonvirt void DebChkHimpaddr(HIMPADDR himpaddr) const {}
+ nonvirt void DebShowSize() {}
+#endif
+
+private:
+ nonvirt TIPERROR BindTypeInfo(HIMPTYPE himptype, ITypeInfoA **pptinfo);
+ nonvirt TIPERROR BindTypeInfoOfHlnam(sHLNAM hlnam, ITypeInfoA **pptinfo);
+ nonvirt TIPERROR BindTypeInfoOfRghlnam(UINT chlnam,
+ sHLNAM *rghlnam,
+ ITypeInfoA **pptinfo);
+ nonvirt TIPERROR NewEntry(UB_IMPTYPE **pqubimptype,
+ sHIMPTYPE *phimptype);
+ nonvirt UINT IBucket(HLNAM hlnam);
+ nonvirt UINT IBucket(UINT cName, sHLNAM rghlnam[]);
+ nonvirt UINT IBucketOfHimptype(HIMPTYPE himptype);
+ nonvirt BOOL HasQualName(HIMPTYPE himptype, UINT cName, sHLNAM *rghlnam);
+ nonvirt UB_IMPTYPE* Qubimptype(TYPEID tid);
+ nonvirt UB_IMPTYPE* Qubimptype(HIMPTYPE himptype) const;
+ nonvirt HIMPTYPE Himptype(UB_IMPTYPE *qubimptype) const;
+ nonvirt IMPTYPE* Qimptype(HIMPTYPE himptype) const;
+ nonvirt TIPERROR HimptypeAlloc(sHIMPTYPE *phimptype);
+ nonvirt VOID HimptypeDelete(HIMPTYPE himptype);
+ nonvirt UB_IMPTYPE* Rqubimptype() const; //return tubimptype
+ nonvirt IMPTYPE* Rqimptype() const; //return timptype
+ TIPERROR SetPtinfo(HIMPTYPE himptype, ITypeInfoA *ptinfo, BOOL fDepBeingRead=FALSE);
+ VOID ReleasePtinfo(HIMPTYPE himptype);
+ LPSTR LqstrOfHsz(HCHUNK hsz) const;
+ UINT ChlnamQual(HIMPTYPE himptype) const;
+ sHLNAM *RqhlnamQual(HIMPTYPE himptype) const;
+ VOID SwapbmData(BOOL fSwapFirst) const;
+
+ // ImpAddr functions; only required for OB.
+
+
+ // Data Members
+ static USHORT cimptypeGrow;
+ static BYTE bFirstSerByte; // First byte of serialization
+ static BYTE bCurVersion; // Serialization format version number
+
+ // Data members for checking dependencies.
+ BOOL m_fCheckRemainingDepCalled;
+
+ // Datamember to record the address from where the typeids are.
+ // For the types where the dependecy is not Layout dependency.
+ LONG m_lPosOfDeps;
+
+
+
+ DYN_TYPEROOT *m_pdtroot;
+
+ //BLK_DESC for tubimptype
+ BLK_DESC m_bdTubimptype;
+
+ //pointer to BLK_DESC of timptype
+ BLK_DESC *m_pbdTimptype;
+
+ sHIMPTYPE m_rghimptypeBucket[IMPMGR_cBuckets];
+ sHIMPTYPE m_himptypeFreeList;
+
+ BLK_MGR m_bmData;
+#if OE_RISC
+ TLB_TEMPLATE *m_ptlbtempl;
+#endif // OE_RISC
+
+ // Impaddrs not required for OLE
+
+};
+
+
+
+/***
+*PRIVATE IMPMGR::Qubimptype - return pointer to UB_IMPTYPE of import entry
+*Purpose:
+* Returns pointer to UB_IMPTYPE entry associated with given himptype
+*
+*Entry:
+* himptype - imptype handle
+*
+*Exit:
+* return pointer to UB_IMPTYPE entry associated with himptype
+*
+***********************************************************************/
+
+inline UB_IMPTYPE* IMPMGR::Qubimptype(HIMPTYPE himptype) const
+{
+ DebChkHimptype(himptype);
+
+ return (UB_IMPTYPE *)(m_bdTubimptype.QtrOfBlock()) +
+ himptype/sizeof(IMPTYPE);
+}
+
+
+/***
+* IMPMGR::DepKind - Returns the dependency kind
+*Purpose:
+* Get the Dependency Kind for the given himptype
+*
+*Entry:
+* himptype - imptype handle
+*
+*Exit:
+* return DEPEND_KIND
+*
+***********************************************************************/
+
+inline DEPEND_KIND IMPMGR::DepKind(HIMPTYPE himptype)
+{
+ DebChkHimptype(himptype);
+
+ return (DEPEND_KIND) Qubimptype(himptype)->m_depkind;
+}
+
+
+
+/***
+*PUBLIC IMPMGR::HimptypeOfIndex
+*Purpose:
+* Returns the Himptype of an index into the import arrays.
+*
+*Entry:
+* index into timptype and tubimptype
+*
+*Exit:
+* himptype - imptype handle
+*
+***********************************************************************/
+
+inline HIMPTYPE IMPMGR::HimptypeOfIndex(UINT i)
+{
+ DebChkHimptype(i * sizeof(IMPTYPE));
+ return i * sizeof(IMPTYPE);
+}
+
+
+/***
+*PUBLIC IMPMGR::IndexOfHimptype
+*Purpose:
+* Returns the index of an himptype into the import arrays.
+*
+*Entry:
+* index into timptype and tubimptype
+*
+*Exit:
+* index
+*
+***********************************************************************/
+
+inline UINT IMPMGR::IndexOfHimptype(HIMPTYPE himptype)
+{
+ DebChkHimptype(himptype);
+ return ((UINT) himptype) / sizeof(IMPTYPE);
+}
+
+ // These functions are not available for OLE
+
+/***
+*PRIVATE IMPMGR::Qimptype - return pointer to IMPTYPE of import entry
+*Purpose:
+* Returns pointer to IMPTYPE entry associated with given himptype
+*
+*Entry:
+* himptype - imptype handle
+*
+*Exit:
+* return pointer to IMPTYPE entry associated with himptype
+*
+***********************************************************************/
+
+inline IMPTYPE* IMPMGR::Qimptype(HIMPTYPE himptype) const
+{
+ return (IMPTYPE *)(m_pbdTimptype->QtrOfBlock() + himptype);
+}
+
+
+
+
+
+
+/***
+*PUBLIC IMPMGR::LqstrOfHsz
+*
+***********************************************************************/
+
+inline LPSTR IMPMGR::LqstrOfHsz(HCHUNK hsz) const
+{
+ return (char *)m_bmData.QtrOfHandle(hsz);
+}
+
+
+/***
+*PUBLIC IMPMGR::GetTypeInfo - returns pointer to TypeInfo of import entry
+*Purpose:
+* Returns pointer to TYPEINFO of import entry.
+*
+*Entry:
+* himptype - handle for ImpType entry
+* pptinfo - returns pointer to TYPEINFO
+*
+*Exit:
+* TIPERROR
+* If TIPERROR = TIPERR_None then *pptinfo returns a pointer to the
+* TYPEINFO. This reference must be released by the caller.
+*
+***********************************************************************/
+
+inline TIPERROR IMPMGR::GetTypeInfo(HIMPTYPE himptype,
+ DEPEND_KIND depkind,
+ TYPEINFO **pptinfo)
+{
+ return GetTypeInfo(himptype,
+ depkind,
+ (ITypeInfoA **)pptinfo);
+}
+
+/***
+*PUBLIC IMPMGR::IsEmpty -
+*Purpose:
+* Returns TRUE if there is nothing in the the import manager
+* to serialize.
+*
+*Entry:
+*
+*Exit:
+* BOOL : returns TRUE if the import manager is empty. Else returns FALSE.
+***********************************************************************/
+inline BOOL IMPMGR::IsEmpty()
+{
+ return (m_bdTubimptype.CbSize() == 0);
+}
+
+/***
+*PUBLIC IMPMGR::GetImpTypeSize
+*Purpose:
+* Returns the size of the IMPTYPE table.
+*
+*Entry:
+*
+*Exit:
+* UINT
+***********************************************************************/
+inline UINT IMPMGR::GetImpTypeSize()
+{
+ return m_bdTubimptype.CbSize();
+}
+
+
+#endif // ! IMPMGR_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/machine.hxx b/private/oleauto/src/typelib/machine.hxx
new file mode 100644
index 000000000..da6ddec10
--- /dev/null
+++ b/private/oleauto/src/typelib/machine.hxx
@@ -0,0 +1,222 @@
+/***
+*machine.hxx - Helpers for dealing with machine dependencies.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains helper functions for dealing with machine
+* dependencies. For example, inline function sin this file do
+* efficient reading and write words and longs to unaligned addresses.
+*
+* The macros used the HP_* symbols to find out the characteristics
+* of the current machine.
+*
+*Revision History:
+*
+* [00] 15-Mar-91 petergo: Created.
+*
+*****************************************************************************/
+
+#ifndef MACHINE_HXX_INCLUDED
+#define MACHINE_HXX_INCLUDED
+
+#include <limits.h>
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szMACHINE_HXX)
+#define SZ_FILE_NAME g_szMACHINE_HXX
+#endif
+
+
+// This file requires 8-bit bytes, 16-bit shorts, 32-bit longs.
+#if CHAR_BIT != 8 || USHRT_MAX != 0xffff || ULONG_MAX != 0xffffffff
+#error Fundemental types have unexpected sizes.
+#endif
+
+
+
+
+/***
+*ReadUnaligned() - read data type from unaligned address
+*Purpose:
+* Reads the value of a data type from a possibly unaligned address.
+*
+*Entry:
+* p - address to read from
+* type - type of value to read
+*
+*Exit:
+* Reads the value read. The value returned is of the correct type.
+*
+***********************************************************************/
+
+#define ReadUnaligned(p, type) \
+ ((type) ReadUnalignedHelper((p), sizeof(type)))
+
+
+
+/***
+*ReadUnalignedHelper - read unaligned value
+*Purpose:
+* Reads a value from a possible unaligned address.
+* On processors that can efficiently read from unaligned addresses,
+* we just do the read. Otherwise we assemble the value from
+* bytes.
+*
+*Entry:
+* pb - pointer to value to read.
+* cb - number of bytes to read.
+*
+*Exit:
+* Value read.
+*
+***********************************************************************/
+
+inline ULONG ReadUnalignedHelper(void * pv, UINT cb)
+{
+#if HP_MUSTALIGNSHORT && HP_BIGENDIAN
+
+ BYTE * pb = (BYTE *) pv; // to eliminate annoying casts.
+
+ if (cb == 1)
+ return pb[0];
+ else if (cb == 2)
+ return (pb[0] << 8) + (pb[1]);
+ else if (cb == 4)
+ return ((ULONG) pb[0] << 24) + ((ULONG) pb[1] << 16) +
+ ((ULONG) pb[2] << 8) + ((ULONG) pb[3]);
+ else
+ { DebHalt("ReadUnaligned: bad data type size"); return 0;}
+
+#elif HP_MUSTALIGNSHORT && !HP_BIGENDIAN
+
+ BYTE * pb = (BYTE *) pv; // to eliminate annoying casts.
+
+ if (cb == 1)
+ return pb[0];
+ else if (cb == 2)
+ return (pb[0]) + (pb[1] << 8);
+ else if (cb == 4)
+ return ((ULONG) pb[0]) + ((ULONG) pb[1] << 8) +
+ ((ULONG) pb[2] << 16) + ((ULONG) pb[3] << 24);
+ else
+ { DebHalt("ReadUnaligned: bad data type size"); return 0;}
+
+#else // ! HP_MUSTALIGNSHORT
+
+ if (cb == 1)
+ return * (BYTE *) pv;
+ else if (cb == 2)
+ return * (USHORT *) pv;
+ else if (cb == 4)
+ return * (ULONG *) pv;
+ else
+ { DebHalt("ReadUnaligned: bad data type size"); return 0;}
+
+#endif // ! HP_MUSTALIGNSHORT
+}
+
+
+/***
+*WriteUnaligned - write an unaligned value.
+*Purpose:
+* Writes the value of a data type to a possibly unaligned address.
+*
+*Entry:
+* p - address to write to
+* val - value to write
+* type - type of value to write
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#define WriteUnaligned(p, val, type) \
+ (WriteUnalignedHelper((p), (ULONG) (val), sizeof(type)))
+
+
+/***
+*WriteUnalignedHelper - write unaligned value
+*Purpose:
+* Writes a value to a possible unaligned address.
+* On processors that can efficiently write to unaligned addresses,
+* we just do the write. Otherwise we split the value into bytes.
+*
+*Entry:
+* pb - pointer to location to write at.
+* ul - value to write
+* cb - number of bytes to write.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline void WriteUnalignedHelper(void * pv, ULONG ul, UINT cb)
+{
+#if HP_MUSTALIGNSHORT && HP_BIGENDIAN
+
+ BYTE * pb = (BYTE *) pv; // to eliminate annoying casts.
+
+ if (cb == 1)
+ *pb = (BYTE) ul;
+ else if (cb == 2) {
+ pb[1] = (BYTE) (ul);
+ pb[0] = (BYTE) (ul >> 8);
+ }
+ else if (cb == 4) {
+ pb[3] = (BYTE) (ul);
+ ul >>= 8;
+ pb[2] = (BYTE) (ul);
+ ul >>= 8;
+ pb[1] = (BYTE) (ul);
+ ul >>= 8;
+ pb[0] = (BYTE) (ul);
+ }
+ else {
+ DebHalt("WriteUnaligned: bad data type size");
+ }
+
+
+#elif HP_MUSTALIGNSHORT && !HP_BIGENDIAN
+
+ BYTE * pb = (BYTE *) pv; // to eliminate annoying casts.
+
+ if (cb == 1)
+ *pb = (BYTE) ul;
+ else if (cb == 2) {
+ pb[0] = (BYTE) (ul);
+ pb[1] = (BYTE) (ul >> 8);
+ }
+ else if (cb == 4) {
+ pb[0] = (BYTE) (ul);
+ ul >>= 8;
+ pb[1] = (BYTE) (ul);
+ ul >>= 8;
+ pb[2] = (BYTE) (ul);
+ ul >>= 8;
+ pb[3] = (BYTE) (ul);
+ }
+ else {
+ DebHalt("WriteUnaligned: bad data type size");
+ }
+
+#else // ! HP_MUSTALIGNSHORT
+
+ if (cb == 1)
+ * (BYTE *) pv = (BYTE) ul;
+ else if (cb == 2)
+ * (USHORT *) pv = (USHORT) ul;
+ else if (cb == 4)
+ * (ULONG *) pv = (ULONG) ul;
+ else
+ DebHalt("WriteUnaligned: bad data type size");
+
+#endif // ! HP_MUSTALIGNSHORT
+}
+
+
+#endif // MACHINE_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/macros.hxx b/private/oleauto/src/typelib/macros.hxx
new file mode 100644
index 000000000..dac97ca8e
--- /dev/null
+++ b/private/oleauto/src/typelib/macros.hxx
@@ -0,0 +1,276 @@
+/***
+*macros.hxx - Utility macros for Silver
+*
+* Copyright (C) 1990, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Contains useful utility macros for Silver.
+*
+* Macros defined here:
+* OOB_MAKEULONG
+* OOB_MAKELONG
+* OOB_MAKEP
+* OOB_SELECTOROF
+* OOB_OFFSETOF
+* PURE
+* RoundUp
+* RoundDown
+* NOTUSED
+* OOB_DELETE
+* MEMFREE
+* RELEASE
+*
+*Revision History:
+*
+* 14-Feb-91 ilanc: Created
+* [01] 28-Feb-91 ilanc: Prefix all macros with SILVER_
+* [02] 01-Mar-91 ilanc: No, prefix them all with OOB_
+* [03] 11-Mar-91 ilanc: define PURE (AFX no longers uses it).
+* [04] 25-Mar-91 petergo: Added RoundUp and RoundDown.
+* [05] 18-Jul-91 mikewo: Added NOTUSED macro (to declare unused formals).
+* [06] 05-Sep-91 ilanc: Added DELETE/MEMFREE (reset pointers to NULL).
+* [07] 11-Sep-91 ilanc: DELETE -> OOB_DELETE (WIN32 has its own DELETE).
+* [08] 01-Nov-91 ilanc: Added RELEASE.
+*
+*****************************************************************************/
+
+#ifndef MACROS_HXX_INCLUDED
+#define MACROS_HXX_INCLUDED
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szMACROS_HXX)
+#define SZ_FILE_NAME g_szMACROS_HXX
+#endif
+
+/*** Useful Helper Macros */
+
+// These are better than the standard OS2DEF.H versions since
+// allow you to manipulate a non-lvalue pointer -- in particular THIS.
+
+/* Combine l & h to form a 32 bit quantity. */
+#define OOB_MAKEULONG(l, h) ((ULONG)(((USHORT)(l)) | ((ULONG)((USHORT)(h))) << 16))
+#define OOB_MAKELONG(l, h) ((LONG)OOB_MAKEULONG(l, h))
+
+/* Create untyped far pointer from selector and offset */
+#define OOB_MAKEP(sel, off) ((VOID *)OOB_MAKEULONG(off, sel))
+
+/* Extract selector or offset from far pointer */
+#define OOB_SELECTOROF(p) ((USHORT) ((ULONG) (p) >> 16))
+
+// #define OFFSETOF(p) ((USHORT) ((ULONG) p & USHRT_MAX))
+#define OOB_OFFSETOF(p) ((USHORT) (ULONG) (p))
+
+
+// NOTUSED - this macro "declares" formal parameters that are not used in
+// their function. This prevents compiler warnings from being
+// generated. Only one formal can be declared at a time.
+// Usage is:
+// NOTUSED parm1;
+// NOTUSED parm2;
+// ...
+#define NOTUSED (void)
+
+
+// Evaluates to the number of elements in the given array.
+//
+#define DIM(X) (sizeof(X) / (sizeof((X)[0])))
+
+
+/***
+*operator new - supports placement syntax
+*Purpose:
+* Support placement syntax
+*
+*Entry:
+* size_t - ignored
+* pv - address
+*
+*Exit:
+* Returns pv
+*
+***********************************************************************/
+
+inline void *operator new(size_t, void* pv)
+{
+ return pv;
+}
+
+
+// OOB_DELETE
+//
+// This macro deletes an object (previously allocated with new)
+// via a pointer to said object and resets the pointer to NULL.
+//
+#define OOB_DELETE(pobject) (delete pobject, pobject = NULL)
+
+
+// MEMFREE
+//
+// This macro frees an object (previously allocated with MemAlloc)
+// via a pointer to said object and resets the pointer to NULL.
+//
+#define MEMFREE(pobject) (MemFree(pobject), pobject = NULL)
+
+
+// RELEASE
+//
+// This macro releases an object (previously constructed)
+// with its class's Release method and resets the object
+// pointer to null.
+//
+//
+#define RELEASE(pobject) \
+ if ((pobject) != NULL) { \
+ (pobject)->Release(); \
+ pobject = NULL; \
+ }
+
+
+/***
+*RoundUp - round up uint to a multiply of a power of two.
+*Purpose:
+* Rounds a value up.
+*
+*Entry:
+* u - value to round
+* uPower2 - round to multiple of this, must be a power of two.
+*
+*Exit:
+* Returns smallest multiple of uPower2 not less than u.
+*
+***********************************************************************/
+
+inline UINT RoundUp(UINT u, UINT uPower2)
+{
+ DebAssert((uPower2 & (uPower2 - 1)) == 0,
+ "RoundUp: not a power of two");
+
+ return (u + (uPower2 - 1)) & ~(uPower2 - 1);
+}
+
+#ifndef ID_INT_IS_LONG
+inline ULONG RoundUp(ULONG u, ULONG uPower2)
+{
+ DebAssert((uPower2 & (uPower2 - 1)) == 0,
+ "RoundUp: not a power of two");
+
+ return (u + (uPower2 - 1)) & ~(uPower2 - 1);
+}
+#endif
+
+/***
+*RoundDown - round down uint to a multiply of a power of two.
+*Purpose:
+* Rounds a value down.
+*
+*Entry:
+* u - value to round
+* uPower2 - round to multiple of this, must be a power of two.
+*
+*Exit:
+* Returns largest multiple of uPower2 not greater than u.
+*
+***********************************************************************/
+
+inline UINT RoundDown(UINT u, UINT uPower2)
+{
+ DebAssert((uPower2 & (uPower2 - 1)) == 0,
+ "RoundUp: not a power of two");
+
+ return u & ~(uPower2 - 1);
+}
+
+#ifndef ID_INT_IS_LONG
+inline ULONG RoundDown(ULONG u, ULONG uPower2)
+{
+ DebAssert((uPower2 & (uPower2 - 1)) == 0,
+ "RoundUp: not a power of two");
+
+ return u & ~(uPower2 - 1);
+}
+#endif
+
+/************************************************************
+* ODD and EVEN
+*********/
+inline BOOL ODD(UINT u)
+{
+ return((u&1) != 0);
+}
+
+inline BOOL EVEN(UINT u)
+{
+ return(!ODD(u));
+}
+
+
+#if 0
+# define ASSERTONERROR() DebAssert(!getenv("ASSERTONERR"), "Error detected")
+#else
+# define ASSERTONERROR()
+#endif
+
+//
+// The following are the correct/current OLE failure code macros
+//
+#define IfFailRet(s) { \
+ hresult = (s); \
+ if(FAILED(GetScode(hresult))){ \
+ ASSERTONERROR(); \
+ return hresult; }}
+#define IfFailRetTiperr(s) IfFailRet(s)
+#define IfFailGo(s) { \
+ hresult = (s); \
+ if(FAILED(GetScode(hresult))){ \
+ ASSERTONERROR(); \
+ goto Error; }}
+#define IfFailGoTo(s, label) { \
+ hresult = (s); \
+ if(FAILED(GetScode(hresult))){ \
+ ASSERTONERROR(); \
+ goto label; }}
+
+#define IfOleErrRet(s) IfFailRet(s)
+#define IfOleErrRetTiperr(s) IfFailRet(s)
+#define IfOleErrGo(s) IfFailGo(s)
+#define IfOleErrGoTo(s,label) IfFailGoTo(s, label)
+
+#define IfErrRet(s) { \
+ err = (s); \
+ if(FAILED(GetScode(err))){ \
+ ASSERTONERROR(); \
+ return err; }}
+#define IfErrRetHresult(s) IfErrRet(s)
+#define IfErrGo(s) { \
+ err = (s); \
+ if(FAILED(GetScode(err))){ \
+ ASSERTONERROR(); \
+ goto Error; }}
+#define IfErrGoTo(s, label) { \
+ err = (s); \
+ if(FAILED(GetScode(err))){ \
+ ASSERTONERROR(); \
+ goto label; }}
+
+#define IfNullRet(s) { \
+ if (!(s)) { \
+ ASSERTONERROR(); \
+ return HresultOfScode(E_OUTOFMEMORY); }}
+#define IfNullGo(s) { \
+ if (!(s)) { \
+ ASSERTONERROR(); \
+ goto Error; }}
+#define IfNullGoTo(s, label) { \
+ if (!(s)) { \
+ ASSERTONERROR(); \
+ goto label; }}
+#define IfNullMemErr(s) { \
+ if (!(s)) { \
+ ASSERTONERROR(); \
+ err = HresultOfScode(E_OUTOFMEMORY); goto Error;}}
+
+
+#endif // !MACROS_HXX_INCLUDED
+
diff --git a/private/oleauto/src/typelib/mbstring.cxx b/private/oleauto/src/typelib/mbstring.cxx
new file mode 100644
index 000000000..c1e32ac4f
--- /dev/null
+++ b/private/oleauto/src/typelib/mbstring.cxx
@@ -0,0 +1,667 @@
+/***
+*mbstring.c
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Defines various functions that support Multi Bytes Code System.
+*
+*Revision History:
+*
+* [00] 07-Mar-93 kazusy: Created.
+*
+*Implementation Notes:
+*
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "typelib.hxx" // Redefine DebAssertFailed to ODebAssertFailed
+ // in the statically linked Mac TYPELIB.LIB
+#include <stdlib.h>
+#include <string.h>
+
+#include "debug.h"
+
+#pragma hdrstop(RTPCHNAME)
+
+#include "mbstring.h"
+
+#if OE_MAC
+#include <script.h>
+#endif //OE_MAC
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+static CHAR szMbString[] = __FILE__;
+#define SZ_FILE_NAME szMbString
+#endif
+
+
+
+// CONSIDER: move the IsSBCS macro into a header file.
+BOOL g_fSBCS = FALSE; // true if the system is SBCS -- be conservative
+ // because InitMbString (called by InitAppData)
+ // isn't always called on entry to every
+ // typelib API.
+#define IsSBCS() (g_fSBCS)
+
+
+/***
+*
+* InitMbString()
+*
+*Purpose:
+*
+*Create a lookup table which allows a small, fast isleadbyte() implementation,
+*and set up fJapan, fKorea, and fTaiwan macros.
+*
+****************************************************************************/
+
+char FAR g_rgchLeadByteTable[256];
+#pragma code_seg(CS_QUERY) // called from LibMain for OE_WIN16 and OE_WIN32
+void InitMbString(void)
+{
+#if OE_WIN
+
+ BYTE ctr;
+
+ // need to set up g_fSBCS.
+ g_fSBCS=TRUE; // assume SBCS
+ memset(g_rgchLeadByteTable, 0, 256);
+ // stop at 128 since there aren't any lead bytes under that
+ for (ctr = 255; ctr>127; ctr--) {
+ if (IsDBCSLeadByte(ctr)) {
+ g_rgchLeadByteTable[ctr] = -1;
+ g_fSBCS=FALSE; // must be DBCS
+ }
+ }
+
+#else //OE_MAC
+
+ // preserve the old font in the current grafPort
+ short fontSave = qd.thePort->txFont;
+
+ // then set the grafPort font to 1 (Application Default) because
+ // ParseTable uses qd.thePort->txFont to determine the currect script,
+ // which in turn determines the lead byte table. We want the application
+ // default table. OB Bug #3858
+ TextFont(1);
+
+ memset(g_rgchLeadByteTable, 0, 256);
+
+ // fill in the table. If the function fails, the table is already 0-filled
+ ParseTable(g_rgchLeadByteTable);
+
+ // restore the old font
+ TextFont(fontSave);
+
+ // for OE_MAC, FJapan is #defined to 1, so skip setting g_SystemLangId.
+ // UNDONE: (dougf) how to figure out if we can set g_fSBCS=FALSE on
+ // UNDONE: the MAC? Supposedly, GetUserDefaultLangID can't be used
+ // UNDONE: to do the check.
+
+#endif //OE_MAC
+}
+#pragma code_seg()
+
+
+#define _MBCS_OS
+
+#ifdef _MBCS_OS
+/***
+*
+* _mbascii
+*
+*Purpose:
+* Disable MB ASCII support (set _mbascii flag to 0).
+*
+* The _mbascii flag indicates whether the lib routines and
+* macros should operate on MB ASCII characters (i.e., the
+* double-byte versions of the ASCII characters that exist
+* in certain MBCS representations such as Kanji).
+*
+* In some cases, people want these to be worked on by the
+* various MB is/to/cmp routines. However, in most cases,
+* you do NOT want to do this (e.g., when modifying filenames,
+* you do NOT want to change the case of the MB ASCII chars
+* even though you DO want to change the case of the SB
+* ASCII chars.)
+*
+*******************************************************************************/
+
+unsigned int _mbascii = 0; /* 0 = do NOT operate on MB ASCII chars */
+
+#endif //_MBCS_OS
+
+#define _ISLEADBYTE(c) g_rgchLeadByteTable[(BYTE)c]
+
+/***
+* _mbschr - Multibyte implementation of strchr
+*******************************************************************************/
+#pragma code_seg(CS_INIT)
+unsigned char * __cdecl _mbschr( const unsigned char *pchSrc, const unsigned short ch)
+{
+ const unsigned char *p;
+
+ if (IsSBCS())
+ return (unsigned char *) strchr( (CHAR *) pchSrc, ch );
+
+ DebAssert( pchSrc != NULL, "_mbschr: null string is assigned.");
+
+ if (ch < 256) {
+ DebAssert(_ISLEADBYTE(ch) == 0, "_mbschr: invalid character is specified.");
+ for (p = pchSrc ; *p ; ) {
+ if (*p == ch)
+ break;
+ if (_ISLEADBYTE(*p)) {
+ p++;
+ if (*p == '\0')
+ break;
+ }
+ p++;
+ }
+ return (unsigned char *) (*p == ch ? p : NULL);
+ }
+ else {
+ for (p = pchSrc ; *p ; ) {
+ if (*p == (ch >> 8) ) {
+ if (*(p+1) == (ch & 0xFF))
+ break;
+ if (*++p == '\0')
+ break;
+ p++;
+ }
+ else {
+ if (_ISLEADBYTE(*p)) {
+ p++;
+ if (*p == '\0')
+ break;
+ }
+ p++;
+ }
+ }
+ return (unsigned char *) (*p? p : NULL);
+ }
+
+ return (NULL); // to satisfy compiler
+}
+#pragma code_seg()
+
+/***
+* _mbsrchr - Multibyte implementation of strrchr
+*******************************************************************************/
+#pragma code_seg(CS_INIT)
+unsigned char * __cdecl _mbsrchr( const unsigned char *pchSrc, const unsigned short ch)
+{
+ unsigned char *p;
+ unsigned char *pchFind = NULL;
+
+ if (IsSBCS())
+ return (unsigned char *) strrchr( (CHAR *) pchSrc, ch );
+
+ DebAssert( pchSrc != NULL, "_mbschr: null string is assigned.");
+
+ if (ch < 256) {
+ DebAssert(_ISLEADBYTE(ch) == 0, "_mbschr: invalid character is specified.");
+ for (p = (unsigned char *)pchSrc ; *p ; ) {
+ if (*p == ch)
+ pchFind = p;
+ if (_ISLEADBYTE(*p)) {
+ p++;
+ if (*p == '\0')
+ break;
+ }
+ p++;
+ }
+ return pchFind;
+ }
+ else {
+ for (p = (unsigned char *)pchSrc ; *p ; ) {
+ if (*p == (ch >> 8) ) {
+ if (*(p+1) == (ch & 0xFF))
+ pchFind = p;
+ if (*++p == '\0')
+ break;
+ p++;
+ }
+ else {
+ if (_ISLEADBYTE(*p)) {
+ p++;
+ if (*p == '\0')
+ break;
+ }
+ p++;
+ }
+ }
+ return pchFind;
+ }
+}
+#pragma code_seg()
+
+
+#if 0 //Dead Code
+unsigned char * __cdecl _mbsinc(const unsigned char *pchStr)
+{
+ DebAssert( !IsSBCS(), "_mbsinc called in SBCS environment." );
+
+ DebAssert(*pchStr != '\0', "_mbsinc: end of string");
+ if (_ISLEADBYTE(*pchStr)) {
+ pchStr++;
+ DebAssert(*pchStr != '\0', "_mbsinc: 2nd byte is null");
+ }
+ pchStr++;
+ return (unsigned char *)pchStr;
+}
+#endif //0
+
+
+#if 0 //Dead Code
+int __cdecl _ismbblead(unsigned char c)
+{
+ return _ISLEADBYTE(c);
+}
+#endif //0
+
+
+/***
+* _mbslen - Multibyte implementation of strclen
+*******************************************************************************/
+unsigned int __cdecl _mbslen(const unsigned char *pchStr)
+{
+ int nCnt = 0;
+ unsigned char ch;
+
+ if (IsSBCS())
+ return strlen((CHAR *) pchStr );
+
+
+ while (ch = *pchStr++) {
+ if (_ISLEADBYTE(ch)) {
+ if (*pchStr++ == '\0')
+ break;
+ }
+ nCnt++;
+ }
+ return nCnt;
+}
+
+
+#if 0 //Dead Code
+unsigned int __cdecl __mbblen(const unsigned char *pchStr)
+{
+ int nCnt = 0;
+
+ while (*pchStr) {
+ if (_ISLEADBYTE(*pchStr)) {
+ if (*++pchStr == '\0')
+ break;
+ nCnt++;
+ }
+ pchStr++;
+ nCnt++;
+ }
+ return nCnt;
+}
+#endif //0
+
+
+#if !OE_WIN32
+/***
+* _mbsnbcpy - Copy one string to another, n bytes only (MBCS strncpy)
+*
+*Purpose:
+* Copies exactly cnt bytes from src to dst. If strlen(src) < cnt, the
+* remaining character are padded with null bytes. If strlen >= cnt, no
+* terminating null byte is added. 2-byte MBCS characters are handled
+* correctly.
+*
+*Entry:
+* unsigned char *dst = destination for copy
+* unsigned char *src = source for copy
+* int cnt = number of characters to copy
+*
+*Exit:
+* returns dst = destination of copy
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+unsigned char * __cdecl _mbsnbcpy(unsigned char *dst, const unsigned char *src, size_t cnt)
+{
+
+ unsigned char *start = dst;
+ size_t i;
+
+ if (IsSBCS())
+ return (unsigned char *) strncpy((CHAR *) dst, (CHAR *) src, cnt );
+
+ for (i = 0; i < cnt; i++) {
+
+ if (_ISLEADBYTE(*src)) {
+ *dst++ = *src++;
+ i++;
+ if (i==cnt) {
+ dst[-1] = '\0';
+ break;
+ }
+ if ((*dst++ = *src++) == '\0') {
+ dst[-2] = '\0';
+ break;
+ }
+ }
+
+ else
+ if ((*dst++ = *src++) == '\0')
+ break;
+
+ }
+
+ /* pad with nulls as needed */
+
+ while (++i < cnt)
+ *dst++ = '\0';
+
+ return(start);
+}
+#endif //!OE_WIN32
+
+
+#if !OE_WIN32
+/***
+*int _mbsncmp(s1, s2, n) - Compare n characters of two MBCS strings (strncmp)
+*
+*Purpose:
+* Compares up to n characters of two strings for lexical order.
+* Strings are compared on a character basis, not a byte basis.
+*
+*Entry:
+* unsigned char *s1, *s2 = strings to compare
+* size_t n = maximum number of characters to compare
+*
+*Exit:
+* returns <0 if s1 < s2
+* returns 0 if s1 == s2
+* returns >0 if s1 > s2
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+int __cdecl _mbsncmp( const unsigned char *s1, const unsigned char *s2, size_t n)
+{
+ unsigned short c1, c2;
+
+ if (IsSBCS())
+ return strncmp( (CHAR *) s1, (CHAR *) s2, n );
+
+ if (n==0)
+ return(0);
+
+ while (n--) {
+
+ c1 = *s1++;
+ if (_ISLEADBYTE(c1))
+ c1 = ( (*s1 == '\0') ? 0 : ((c1<<8) | *s1++) );
+
+ c2 = *s2++;
+ if (_ISLEADBYTE(c2))
+ c2 = ( (*s2 == '\0') ? 0 : ((c2<<8) | *s2++) );
+
+ if (c1 != c2)
+ return( (c1 > c2) ? 1 : -1);
+
+ if (c1 == 0)
+ return(0);
+ }
+
+ return(0);
+}
+#endif //!OE_WIN32
+
+#define _MBSSPNP(p,s) _mbsspnp(p,s)
+#define _MBSPBRK(q,s) _mbspbrk(q,s);
+
+/***
+* _mbsicmp - Case-insensitive string comparision routine (MBCS lstrcmpi)
+*
+*Purpose:
+* Compares two strings for lexical order without regard to case.
+* Strings are compared on a character basis, not a byte basis.
+*
+*Entry:
+* char *s1, *s2 = strings to compare
+*
+*Exit:
+* returns <0 if s1 < s2
+* returns 0 if s1 == s2
+* returns >0 if s1 > s2
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+#if !OE_WIN32
+int __cdecl _mbsicmp(const unsigned char *s1, const unsigned char *s2)
+{
+ unsigned short c1, c2;
+
+ if (IsSBCS()) {
+#if OE_WIN
+ return lstrcmpi( (CHAR *) s1, (CHAR *) s2 );
+#else //OE_WIN
+ // UNDONE: (dougf) shouldn't it always be this instead? lstrcmpi is
+ // UNDONE: win.ini sensitive, and we may not want that.
+ return stricmp( (XCHAR *) s1, (XCHAR *) s2 );
+#endif //OE_WIN
+ }
+
+ for (;;) {
+
+ c1 = *s1++;
+ if (_ISLEADBYTE(c1)) {
+ if (*s1 == '\0')
+ c1 = 0;
+ else {
+ c1 = ((c1<<8) | *s1++);
+#ifndef _MBCS_OS
+ if ( (_mbascii) &&
+ ((c1 >= _MBLOWERLOW) && (c1 <= _MBLOWERHIGH))
+ )
+ c1 -= _MBCASEDIFF;
+#endif
+ }
+ }
+ else
+ c1 = toupper(c1);
+
+ c2 = *s2++;
+ if (_ISLEADBYTE(c2)) {
+ if (*s2 == '\0')
+ c2 = 0;
+ else {
+ c2 = ((c2<<8) | (unsigned char)*s2++);
+#ifndef _MBCS_OS
+ if ( (_mbascii) &&
+ ((c2 >= _MBLOWERLOW) && (c2 <= _MBLOWERHIGH))
+ )
+ c2 -= _MBCASEDIFF;
+#endif
+ }
+ }
+ else
+ c2 = toupper(c2);
+
+ if (c1 != c2)
+ return( (c1 > c2) ? 1 : -1);
+ if (c1 == 0)
+ return(0);
+
+ }
+
+}
+#endif //!OE_WIN32
+
+/***
+* _mbscmp - Compare MBCS strings (strcmp)
+*
+*Purpose:
+* Compares two strings for lexical order. Strings
+* are compared on a character basis, not a byte basis.
+*
+*Entry:
+* char *s1, *s2 = strings to compare
+*
+*Exit:
+* returns <0 if s1 < s2
+* returns 0 if s1 == s2
+* returns >0 if s1 > s2
+*
+*Exceptions:
+*
+*******************************************************************************/
+int __cdecl _mbscmp( const unsigned char *s1, const unsigned char *s2)
+{
+ unsigned short c1, c2;
+
+ if (IsSBCS())
+ return strcmp( (CHAR *) s1, (CHAR *) s2 );
+
+ for (;;) {
+ c1 = *s1++;
+ if (_ISLEADBYTE(c1))
+ c1 = ( (*s1 == '\0') ? 0 : ((c1<<8) | *s1++) );
+
+ c2 = *s2++;
+ if (_ISLEADBYTE(c2))
+ c2 = ( (*s2 == '\0') ? 0 : ((c2<<8) | *s2++) );
+
+ if (c1 != c2)
+ return( (c1 > c2) ? 1 : -1);
+ if (c1 == 0)
+ return(0);
+ }
+
+}
+
+
+#if !OE_WIN32 //Dead Code for Win32
+/***
+* XCHAR *xstrdec(XCHAR *pxchStart, XCHAR *pxch)
+*
+* Purpose:
+* This is used to find the previous character in a
+* double byte string.
+*
+* Entry:
+* pxchFirst = pointer to the beginning of the string
+* pxchCur = pointer to a character in the string. Must not
+* point to the beginning of the string. Also, must not
+* point to the middle of a character.
+*
+* Exit:
+* returns a pointer to the character preceding the one
+* pointed to by pxchCur
+***********************************************************************/
+XCHAR *xstrdec(XCHAR *pxchFirst, XCHAR *pxchCur)
+{
+ XCHAR *pxch = pxchCur;
+
+ if (IsSBCS())
+ return pxchCur-1;
+
+
+ DebAssert(pxch > pxchFirst, "invalid pointers");
+ pxch--;
+
+ // Optimization: If the last byte is a lead byte, then
+ // we know that the last character is a double byte character.
+ // That is, we know that the last byte is not functioning as
+ // a lead byte (because it has no trail byte after it), and
+ // therefore, it must itself be a trail byte. Remember that
+ // when xislead returns TRUE, it means that the byte *may* be
+ // a lead byte, but it may also be a trail byte.
+ //
+ if (xislead(*pxch)) {
+ DebAssert(pxch > pxchFirst, "string of length one cannot contain lead byte");
+ return pxch-1;
+ }
+
+ if (pxch == pxchFirst) {
+ return pxchFirst;
+ }
+
+ // Now, we search along the string until either we hit
+ // the beginning of the string, or we find a non-lead byte.
+ //
+ while (--pxch >= pxchFirst && xislead(*pxch)) {}
+
+ // At this point, pxch + 1 is either equal to pxchFirst,
+ // or else it is pointing to a character just past
+ // a non-lead byte. In either case, we know that
+ // pxch points to the beginning of a character.
+
+ // We also know that everything between pxch + 1 and the
+ // last byte of the string must be lead bytes, and therefore
+ // must consist of double byte characters. Therefore, depending
+ // on whether there are an odd or even number of lead bytes,
+ // we can deduce whether the last byte was a trail byte or not:
+ return pxchCur - 1 - ((pxchCur - pxch) & 1);
+}
+#endif //!OE_WIN32
+
+
+#if 0 //Dead Code
+/***
+*XCHAR *PxchFindPrevCharOrBeginOfChar(XSZ xszStart, XCHAR *pxchCur)
+*Purpose:
+* This finds the first character in the string xszStart which
+* begins at an address lower than pxchCur. This is used
+* to move backwards in a string possibly containing double
+* byte characters.
+*
+* Unlike xstrdec, this may be called in the case where
+* pxchCur may point into the middle of a character. (If
+* pxchCur does happen to point into the middle of a character,
+* then this returns a pointer to the beginning of that character.
+* (Hence the long name for this function.))
+*
+* If you are sure that pxchCur doesn't point into the middle
+* of a double byte character, you should call xstrdec.
+*
+***********************************************************************/
+XCHAR *PxchFindPrevCharOrBeginOfChar(XCHAR *pxchFirst, XCHAR *pxchCur)
+{
+ XCHAR *pxch = pxchCur;
+
+ DebAssert(pxch > pxchFirst, "invalid pointers");
+ pxch--;
+
+ // We search along the string until either we hit
+ // the beginning of the string, or we find a non-lead byte.
+ //
+ while (--pxch >= pxchFirst && xislead(*pxch)) {}
+
+ // At this point, pxch + 1 is either equal to pxchFirst,
+ // or else it is pointing to a character just past
+ // a non-lead byte. In either case, we know that
+ // pxch points to the beginning of a character.
+
+ // We also know that everything between pxch + 1 and the
+ // last byte of the string must be lead bytes, and therefore
+ // must consist of double byte characters. Therefore, depending
+ // on whether there are an odd or even number of lead bytes,
+ // we can deduce whether the last byte was a trail byte or not:
+ return pxchCur - 1 - ((pxchCur - pxch) & 1);
+}
+#endif //0
+
+
+
+
+#if OE_MAC
+#pragma code_seg(CS_INIT)
+#endif
diff --git a/private/oleauto/src/typelib/mbstring.h b/private/oleauto/src/typelib/mbstring.h
new file mode 100644
index 000000000..8ae9f3fc5
--- /dev/null
+++ b/private/oleauto/src/typelib/mbstring.h
@@ -0,0 +1,46 @@
+/***
+*mbstring.h - declarations for string manipulation functions for MBCS
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the function declarations for the string
+* manipulation functions of MBCS version.
+*
+*Revision History:
+*
+* [01] 08-Mar-93 kazusy: Created.
+*
+*****************************************************************************/
+
+#ifndef MBSTRING_H_INCLUDED
+#define MBSTRING_H_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void InitMbString(void);
+unsigned char * __cdecl _mbschr(const unsigned char *, const unsigned short);
+unsigned char * __cdecl _mbsrchr(const unsigned char *, const unsigned short);
+unsigned int __cdecl _mbslen(const unsigned char *);
+int __cdecl _mbscmp(const unsigned char *, const unsigned char *);
+
+#if !OE_WIN32
+unsigned char * __cdecl _mbsnbcpy(unsigned char *, const unsigned char *, size_t);
+int __cdecl _mbsncmp(const unsigned char *, const unsigned char *, size_t);
+int __cdecl _mbsicmp(const unsigned char *, const unsigned char *);
+#endif //!OE_WIN32
+
+#if 0 //Dead Code
+unsigned char * __cdecl _mbsinc(const unsigned char *);
+int __cdecl _ismbblead(unsigned char);
+unsigned int __cdecl __mbblen(const unsigned char *);
+#endif //0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MBSTRING_H_INCLUDED
diff --git a/private/oleauto/src/typelib/mem.cxx b/private/oleauto/src/typelib/mem.cxx
new file mode 100644
index 000000000..1acc149c6
--- /dev/null
+++ b/private/oleauto/src/typelib/mem.cxx
@@ -0,0 +1,417 @@
+/***
+*mem.cxx - implementation of the simple memory allocation routines.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the implementations of the simple memory allocators,
+* MemAlloc(), MemZalloc, and MemRealloc().
+*
+*Revision History:
+*
+* [00] 19-Feb-91 mikewo: Created.
+* [01] 15-Mar-91 ilanc: Added segment mm for Win and Os/2.
+* [02] 12-Apr-91 ilanc: Added exception handling.
+* [03] 16-May-91 alanc: Added SZ functions
+* [04] 08-Oct-91 ilanc: LStrFree is NOP if arg is NULL.
+* [05] 23-Oct-91 stevenl: Fixed MemRealloc for shrinking blocks.
+* [06] 19-Dec-91 mattsh: Fixed MemFree
+* [07] 06-Apr-92 martinc: Mac-specific changes
+* [08] 20-Apr-92 martinc: restored file i/o for OE_MAC
+* [09] 27-May-92 petergo: LStr routine now defer to BStr routines
+* [10] 13-Nov-92 bradlo: moved LStr wrappers to separate file
+* [11] 18-Feb-93 RajivK: Changed the implementation of MemAlloc/Free/ReAlloc
+*
+*Implementation Notes:
+* Include os2.h/windows.h *after* silver.hxx
+*
+*****************************************************************************/
+
+#include <limits.h>
+
+// Include some Silver stuff that defines some symbols needed
+// immediately.
+//
+#include "switches.hxx"
+#include "typelib.hxx"
+#include "version.hxx"
+#include "silver.hxx"
+#include "mem.hxx"
+#include "clutil.hxx"
+#include "bstr.h"
+#include "xstring.h"
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleMemCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleMemCxx
+#else
+static char szMemCxx[] = __FILE__;
+#define SZ_FILE_NAME szMemCxx
+#endif
+#endif
+
+#if ID_DEBUG
+// This variables can used to find out the memory USAGE. g_cbHeapAllocdMax
+// is the Max memory allocate by OB during the execution.
+ULONG g_cbHeapAllocd, g_cbHeapAllocdMax;
+#endif
+
+/***
+*void *MemAlloc - Allocates memory from the global heap.
+*Purpose:
+* This method allocates memory from the global heap, just like the
+* standard C library routine, malloc().
+*
+*Implementation Notes: Defer to OLE's IMalloc interface to allocate memory.
+*
+*Entry:
+* cb - The number of bytes to allocate.
+*
+*Exit:
+* Returns a pointer to the allocated memory. THIS CAN RETURN NULL.
+*
+*Errors:
+* Returns NULL in case of error
+*
+****************************************************************/
+#pragma code_seg(CS_INIT)
+#if ID_DEBUG
+void *MemAlloc(ULONG cb)
+#else // !ID_DEBUG
+void *MemAlloc(size_t cb)
+#endif // !ID_DEBUG
+{
+ void *pvRet;
+
+
+ DebAssert(cb <= USHRT_MAX, "Block will overflow.");
+
+ DebHeapChk();
+
+#if ID_DEBUG
+ if (DebErrorNow(TIPERR_OutOfMemory))
+ return NULL;
+#endif // ID_DEBUG
+
+ // Allocate Memory using OLE interface
+ APP_DATA FAR* pappdata;
+
+#if OE_WIN32
+ if (FAILED(GetAppData(&pappdata))) {
+ return NULL;
+ }
+
+ pvRet = pappdata->m_pimalloc->Alloc(cb);
+#else // !OE_WIN32
+ IMalloc FAR* pmalloc;
+
+ // If the APP_DATA hasn't yet been initialized, get the
+ // IMalloc from CoGetMalloc directly.
+ if ((pappdata = Pappdata()) == NULL) {
+ if (CoGetMalloc(MEMCTX_TASK, &pmalloc))
+ return NULL;
+ pvRet = pmalloc->Alloc(cb);
+ pmalloc->Release();
+ }
+ else
+ pvRet = pappdata->m_pimalloc->Alloc(cb);
+#endif // !OE_WIN32
+
+#if ID_DEBUG
+ if (pvRet == NULL)
+ return NULL;
+
+ g_cbHeapAllocd += cb;
+ if (g_cbHeapAllocd > g_cbHeapAllocdMax)
+ g_cbHeapAllocdMax = g_cbHeapAllocd;
+#endif
+
+ return(pvRet);
+}
+#pragma code_seg()
+
+/***
+*void *MemZalloc - Allocates 0-initialized memory from the global heap.
+*Purpose:
+* This is the same as MemAlloc(), except the returned memory block is
+* initialized to 0.
+*
+*Entry:
+* cb - The number of bytes to allocate.
+*
+*Implementation Notes: Defer to OLE's IMalloc interface to allocate memory
+*
+*Exit:
+* Returns a pointer to the allocated memory, which is initialized to hold
+* all zeros. THIS CAN RETURN NULL.
+*
+*Errors:
+* OutOfMemory
+*
+****************************************************************/
+#pragma code_seg(CS_INIT)
+#if ID_DEBUG
+void *MemZalloc(ULONG cb)
+#else // !ID_DEBUG
+void *MemZalloc(size_t cb)
+#endif // !ID_DEBUG
+{
+ void *pvRet;
+
+ DebAssert(cb <= USHRT_MAX, "Block will overflow.");
+
+ DebHeapChk();
+
+ // Allocate Memory using MemAlloc
+ if (DebErrorNow(TIPERR_OutOfMemory) || ((pvRet = MemAlloc(cb)) == NULL)) {
+ return NULL;
+ }
+
+#if ID_DEBUG
+ g_cbHeapAllocd += cb;
+ if (g_cbHeapAllocd > g_cbHeapAllocdMax)
+ g_cbHeapAllocdMax = g_cbHeapAllocd;
+#endif
+
+ // IMalloc does not provide interface for zero initialized memory
+ // allocation , so we need to initialize the memory.
+ memset(pvRet, 0, (size_t)cb);
+
+ return(pvRet);
+}
+#pragma code_seg()
+
+#if OE_MAC || OE_RISC || OE_WIN32
+/***
+*void *MemRealloc - Resizes a previously allocated block of memory.
+*Purpose:
+* This function changes the size of a block of memory previously allocated
+* with MemAlloc(), MemZalloc(), or MemRealloc(), just like the standard
+* C library function realloc().
+*
+*Entry:
+* pvOld - The memory block whose size should be changed.
+* cbNew - The new size of the memory block.
+*
+*Exit:
+* Returns a pointer to the reallocated memory block, which may not be
+* the same as pvOld. If the allocation fails, NULL is returned and the
+* original block of memory (pvOld) is NOT deallocated.
+*
+*Errors;
+* OutOfMemory
+*
+****************************************************************/
+#pragma code_seg(CS_INIT)
+#pragma PCODE_OFF
+#if ID_DEBUG
+void *MemRealloc(void *pvOld, ULONG cbNew)
+#else // !ID_DEBUG
+void *MemRealloc(void *pvOld, size_t cbNew)
+#endif // !ID_DEBUG
+{
+ void *pvRet;
+#if ID_DEBUG
+ size_t cbOld;
+#endif
+
+ DebAssert(cbNew <= USHRT_MAX, "Block will overflow.");
+
+ DebHeapChk();
+
+
+ // save size of old block
+
+
+#if ID_DEBUG
+ // We should only fail if we're trying to increase the
+ // size of a block.
+ //
+ cbOld = (pvOld == NULL) ? 0 : (size_t)MemSize(pvOld);
+ if (cbNew > cbOld && DebErrorNow(TIPERR_OutOfMemory))
+ return NULL;
+#endif // ID_DEBUG
+
+ APP_DATA FAR* pappdata;
+
+ // Call IMalloc's Realloc
+#if OE_WIN32
+ if (FAILED(GetAppData(&pappdata))) {
+ return NULL;
+ }
+
+ pvRet = pappdata->m_pimalloc->Realloc(pvOld, cbNew);
+#else // !OE_WIN32
+ IMalloc FAR* pmalloc;
+
+ // If the APP_DATA hasn't yet been initialized, get the
+ // IMalloc from CoGetMalloc directly.
+ if ((pappdata = Pappdata()) == NULL) {
+ if (CoGetMalloc(MEMCTX_TASK, &pmalloc))
+ return NULL;
+ pvRet = pmalloc->Realloc(pvOld, cbNew);
+ pmalloc->Release();
+ }
+ else
+ pvRet = pappdata->m_pimalloc->Realloc(pvOld, cbNew);
+#endif // !OE_WIN32
+
+ return(pvRet);
+}
+#pragma PCODE_ON
+#pragma code_seg()
+#endif //EI_OB || OE_MAC || OE_RISC || OE_WIN32
+
+/***
+*void MemFree - Frees memory allocated by MemAlloc/MemZalloc/MemRealloc
+*Purpose:
+* Frees memory allocated by MemAlloc/MemZalloc/MemRealloc
+*
+*Entry:
+* pv - pointer to memory block to be deallocated
+*
+*Exit:
+* None.
+****************************************************************/
+#if !OE_MAC
+#pragma code_seg(CS_QUERY)
+#else
+#pragma code_seg(CS_INIT)
+#endif
+#pragma PCODE_OFF
+void MemFree(void *pv)
+{
+ if ( pv==NULL )
+ return;
+
+#if ID_DEBUG
+ g_cbHeapAllocd -= MemSize(pv);
+#endif // ID_DEBUG
+
+ // Call IMalloc's Free to free the memory pointed by pv
+#if OE_WIN32 && 0 // can't rely on appdata being there
+ // because bad apps may end up releasing
+ // things after calling OleUninitialize.
+ DebAssert(Pappdata(), "How'd we alloc without IMalloc?");
+
+ Pappdata()->m_pimalloc->Free(pv);
+#else // !OE_WIN32
+ APP_DATA FAR* pappdata;
+ IMalloc FAR* pmalloc;
+
+ // If the APP_DATA hasn't yet been initialized (or has been
+ // initialized and then thrown away), get the
+ // IMalloc from CoGetMalloc directly.
+ if ((pappdata = Pappdata()) == NULL) {
+ if (CoGetMalloc(MEMCTX_TASK, &pmalloc))
+ return;
+ pmalloc->Free(pv);
+ pmalloc->Release();
+ }
+ else
+ pappdata->m_pimalloc->Free(pv);
+#endif // !OE_WIN32
+
+ DebHeapChk();
+}
+#pragma PCODE_ON
+#pragma code_seg()
+
+/***
+*void
+*Purpose:
+* Returns the Size, in bytes, of the memory block pointed by pv
+*
+*Entry:
+* pv - pointer to memory block whose size is requested
+*
+*Exit:
+* None.
+****************************************************************/
+#if ID_DEBUG
+#pragma code_seg( CS_CORE )
+ULONG MemSize(void *pv)
+{
+ ULONG cbSize;
+
+ // Get the Size of the memory block
+#if OE_WIN32 && 0 // can't rely on appdata being there
+ // because bad apps may end up releasing
+ // things after calling OleUninitialize.
+ DebAssert(Pappdata(), "How'd we alloc without IMalloc?");
+ cbSize = Pappdata()->m_pimalloc->GetSize(pv);
+#else // !OE_WIN32
+ IMalloc FAR* pmalloc;
+ APP_DATA FAR* pappdata;
+
+ // If the APP_DATA hasn't yet been initialized, get the
+ // IMalloc from CoGetMalloc directly.
+ if ((pappdata = Pappdata()) == NULL) {
+ if (CoGetMalloc(MEMCTX_TASK, &pmalloc))
+ return 0;
+ cbSize = pmalloc->GetSize(pv);
+ pmalloc->Release();
+ }
+ else
+ cbSize = pappdata->m_pimalloc->GetSize(pv);
+#endif // !OE_WIN32
+
+ return cbSize;
+}
+#pragma code_seg( )
+#endif //ID_DEBUG
+
+
+
+
+#if OE_MAC
+// CONSIDER: (dougf) Tune the size of this sucker (it's huge -- 1K). It's only
+// CONSIDER: used by gtlibole.cxx to hold a libid, which
+// CONSIDER: shouldn't require a 1K static buffer!
+MEMPOOL NEAR g_mempool;
+
+#if ID_DEBUG
+
+void NEAR *GetMemPool(int i)
+{
+ switch (i) {
+ case 0:
+ DebAssert(!g_mempool.is1024n0InUse, "GetMemPool");
+ g_mempool.is1024n0InUse = 1;
+ return g_mempool.rgb1024n0;
+
+ default:
+ DebHalt("GetMemPool");
+ }
+ return NULL;
+}
+
+void FreeMemPool(void *pmv)
+{
+ if (pmv == g_mempool.rgb1024n0) {
+ DebAssert(g_mempool.is1024n0InUse, "MemPool Already Free");
+ g_mempool.is1024n0InUse = 0;
+ }
+ else {
+ DebHalt("Bad pointer to FreeMemPool");
+ }
+}
+
+int MemPoolSize(int i)
+{
+ switch (i) {
+ case 0:
+ return sizeof(g_mempool.rgb1024n0);
+ default:
+ DebHalt("MemPoolSize");
+ }
+ return 0;
+}
+
+#endif // ID_DEBUG
+#endif //OE_MAC
diff --git a/private/oleauto/src/typelib/mem.hxx b/private/oleauto/src/typelib/mem.hxx
new file mode 100644
index 000000000..f97d9599a
--- /dev/null
+++ b/private/oleauto/src/typelib/mem.hxx
@@ -0,0 +1,174 @@
+/***
+*mem.hxx - Prototypes for simple memory allocation/freeing
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This header file contains the declarations of the simple memory
+* allocation functions, MemAlloc, MemZalloc, MemRealloc, and MemFree.
+* These functions are identical to their standard C library counterparts,
+* except they raise an OOM (out of memory) exception on failure.
+*
+* Note that
+*
+*Revision History:
+*
+* [00] 19-Feb-91 mikewo: Created.
+* [01] 14-Mar-91 ilanc: Added global segment mm for Win and Os/2.
+* [02] 01-Jul-91 ilanc: Move segment stuff to sheapmgr.
+* [03] 02-Dec-91 ilanc: no longer include cltypes.hxx (no need -- get
+* TIPERROR from types.h now).
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef MEM_HXX_INCLUDED
+#define MEM_HXX_INCLUDED
+
+#include <malloc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if OE_MAC
+// MEMPOOL routines
+//////////////////////////////
+
+typedef struct MEMPOOL {
+ char rgb1024n0[1024];
+#if ID_DEBUG
+ BOOL is1024n0InUse;
+#endif // ID_DEBUG
+} MEMPOOL;
+
+extern MEMPOOL NEAR g_mempool;
+
+#if ID_DEBUG
+
+#define MEMPOOL_1024_0 0
+void NEAR *GetMemPool(int i);
+void FreeMemPool(void *pmv);
+int MemPoolSize(int i);
+
+#else // ID_DEBUG
+
+#define MEMPOOL_1024_0 rgb1024n0
+#define GetMemPool(i) (g_mempool.i)
+#define FreeMemPool(pmv)
+#define MemPoolSize(i) (sizeof(g_mempool.i))
+
+#endif // ID_DEBUG
+#endif //OE_MAC
+
+
+// Base Allocation routines
+//////////////////////////////
+
+#if ID_DEBUG
+// Pass in a ULONG so we can assert that the size of the block being
+// allocated is < 64K.
+//
+LPVOID MemAlloc(ULONG cb);
+LPVOID MemZalloc(ULONG cb);
+LPVOID MemRealloc(LPVOID pvOld, ULONG cbNew);
+#else // !ID_DEBUG
+LPVOID MemAlloc(size_t cb);
+LPVOID MemZalloc(size_t cb);
+LPVOID MemRealloc(LPVOID pvOld, size_t cbNew);
+#endif // !ID_DEBUG
+
+void MemFree(LPVOID pv);
+ULONG MemSize(void *pv);
+
+#if 0 //Dead Code
+VOID hmemmove(VOID *pvDest, VOID *pvSrc, ULONG ulSize);
+VOID *HugeMemAlloc(ULONG ulSize);
+VOID *HugeMemRealloc(VOID *pvOld, ULONG ulSizeNew);
+VOID HugeMemFree(VOID *pv);
+#endif //0
+
+// SZ allocating functions
+//
+TIPERROR CreateXsz(XSZ FAR *psz, XSZ_CONST sz);
+TIPERROR ErrCopy(XSZ_CONST sz, XSZ szBuf, UINT cMax);
+
+#ifdef __cplusplus
+}
+
+#if !(OE_MAC && OE_DLL)
+// gets dup def warnings if included into the mac ole applet, and none of
+// our typelib code is *SUPPOSED* to call it, so it's safe to remove it.
+
+/***
+*operator new
+*Purpose:
+* Redefines standard new operator to invoke MemAlloc
+*
+*Entry:
+* size_t - size of instance to be allocated
+*
+*Exit:
+* Returns allocated memory block or NULL if OutOfMemory
+*
+***********************************************************************/
+
+inline LPVOID operator new(size_t cbSize)
+{
+// In non-OLE builds, this is just MemAlloc.
+#if FV_UNICODE_OLE || OE_MACPPC
+ return MemAlloc(cbSize);
+
+// In debug builds, force a divide-by-0 trap.
+#elif ID_DEBUG
+ int i = 0;
+ return (LPVOID)(1/i);
+
+// The compiler disallows the divide-by-0 attempt in the retail builds,
+// so just return NULL to simulate an out-of-memory condition.
+#else
+ return NULL;
+#endif // EI_OB
+}
+#endif // !(OE_MAC && EI_OLE && OE_DLL)
+
+/***
+*MemNew - Use this instead of the new operator in OLE code to allocate memory.
+****************************************************************************/
+#define MemNew(type) ((type FAR *)MemAlloc(sizeof(type)))
+
+
+/***
+*operator delete
+*Purpose:
+* Redefines standard operator delete to invoke MemFree
+*
+*Entry:
+* pv - address
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#if !(OE_MAC && OE_DLL)
+// gets dup def warnings if included into the mac ole applet, and none of
+// our typelib code is *SUPPOSED* to call it, so it's safe to remove it.
+
+inline void operator delete(LPVOID pv)
+{
+#if FV_UNICODE_OLE || OE_MACPPC
+ MemFree(pv);
+// In debug builds, force a divide-by-0 trap.
+#elif ID_DEBUG
+ int i = 0;
+ i = 1 / i;
+// The compiler disallows the divide-by-0 attempt in the retail builds
+#endif // EI_OB
+}
+#endif // !(OE_MAC && EI_OLE && OE_DLL)
+
+#endif // cplusplus
+#endif // MEM_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/namemacs.h b/private/oleauto/src/typelib/namemacs.h
new file mode 100644
index 000000000..7a574c6a7
--- /dev/null
+++ b/private/oleauto/src/typelib/namemacs.h
@@ -0,0 +1,1305 @@
+ #undef StgCreateDocfile
+ #undef StgCreateDocfileOnILockBytes
+ #undef StgOpenStorage
+ #undef StgOpenStorageOnILockBytes
+ #undef StgIsStorageFile
+ #undef StgIsStorageILockBytes
+ #undef StgSetTimes
+ #undef StgSetTimesMac
+ #undef StgSetTimesFSp
+ #undef DllGetClassObject
+ #undef StgCreateDocfileFSp
+ #undef StgOpenStorageFSp
+ #undef StgCreateDocfileMac
+ #undef StgOpenStorageMac
+ #undef StgIsStorageFileMac
+ #undef StgIsStorageFileFSp
+ #undef StgGetFSpFromIStorage
+ #undef StgGetFRefFromIStorage
+ #undef OleregOpenRegistration
+ #undef OleregCloseRegistration
+ #undef OleregGetValue
+ #undef OleregSetValue
+ #undef OleregRemoveKey
+ #undef OleGlobalAddAtom
+ #undef OleGlobalDuplicateAtom
+ #undef OleGlobalDeleteAtom
+ #undef OleGlobalFindAtom
+ #undef OleGlobalGetAtomName
+ #undef OleGlobalAlloc
+ #undef OleGlobalCompact
+ #undef OleGlobalFree
+ #undef OleGlobalHandle
+ #undef OleGlobalLock
+ #undef OleGlobalReAlloc
+ #undef OleGlobalSize
+ #undef OleGlobalUnlock
+ #undef RegQueryValue
+ #undef RegOpenKey
+ #undef RegSetValue
+ #undef RegEnumKey
+ #undef RegEnumProgID
+ #undef RegDeleteKey
+ #undef RegCreateKey
+ #undef RegCloseKey
+ #undef RegInitialize
+ #undef InitUserData
+ #undef SendHighLevelEvent
+ #undef OleWinExec
+ #undef InitDB
+ #undef CloseDB
+ #undef OleGetCurrentTask
+ #undef OleGetProcAddress
+ #undef OleLoadLibrary
+ #undef OleFreeLibrary
+ #undef OutputDebugString
+ #undef SoftAssert
+ #undef FnAssert
+ #undef IsValidInterface
+ #undef IsValidIid
+ #undef IsValidHandle
+ #undef EnterOLEApi
+ #undef ExitOLEApi
+ #undef FnAssertOn
+ #undef GlobalFreePtr
+ #undef GlobalAllocPtr
+ #undef UserInitialize
+ #undef UserUninitialize
+ #undef IsValidInPtr
+ #undef IsValidOutPtr
+ #undef RegQueryValueEx
+ #undef RegFlush
+ #undef RegDeleteValue
+ #undef RegSetValueEx
+ #undef RegEnumValue
+ #undef OLEInitDBCSCountry
+ #undef IAnsiNext
+ #undef IAnsiPrev
+ #undef OleMakeFSSpec
+ #undef OleFullPathFromFSSpec
+ #undef OleGetFSSpecInfo
+ #undef DllGetClassObject
+ #undef SysAllocString
+ #undef SysReAllocString
+ #undef SysAllocStringLen
+ #undef SysReAllocStringLen
+ #undef SysFreeString
+ #undef SysStringLen
+ #undef VariantInit
+ #undef VariantClear
+ #undef VariantCopy
+ #undef VariantCopyInd
+ #undef VariantChangeType
+ #undef VarI2FromI4
+ #undef VarI2FromR4
+ #undef VarI2FromR8
+ #undef VarI2FromCy
+ #undef VarI2FromDate
+ #undef VarI2FromStr
+ #undef VarI2FromDisp
+ #undef VarI2FromBool
+ #undef VarI4FromI2
+ #undef VarI4FromR4
+ #undef VarI4FromR8
+ #undef VarI4FromCy
+ #undef VarI4FromDate
+ #undef VarI4FromStr
+ #undef VarI4FromDisp
+ #undef VarI4FromBool
+ #undef VarR4FromI2
+ #undef VarR4FromI4
+ #undef VarR4FromR8
+ #undef VarR4FromCy
+ #undef VarR4FromDate
+ #undef VarR4FromStr
+ #undef VarR4FromDisp
+ #undef VarR4FromBool
+ #undef VarR8FromI2
+ #undef VarR8FromI4
+ #undef VarR8FromR4
+ #undef VarR8FromCy
+ #undef VarR8FromDate
+ #undef VarR8FromStr
+ #undef VarR8FromDisp
+ #undef VarR8FromBool
+ #undef VarDateFromI2
+ #undef VarDateFromI4
+ #undef VarDateFromR4
+ #undef VarDateFromR8
+ #undef VarDateFromCy
+ #undef VarDateFromStr
+ #undef VarDateFromDisp
+ #undef VarDateFromBool
+ #undef VarCyFromI2
+ #undef VarCyFromI4
+ #undef VarCyFromR4
+ #undef VarCyFromR8
+ #undef VarCyFromDate
+ #undef VarCyFromStr
+ #undef VarCyFromDisp
+ #undef VarCyFromBool
+ #undef VarBstrFromI2
+ #undef VarBstrFromI4
+ #undef VarBstrFromR4
+ #undef VarBstrFromR8
+ #undef VarBstrFromCy
+ #undef VarBstrFromDate
+ #undef VarBstrFromDisp
+ #undef VarBstrFromBool
+ #undef VarBoolFromI2
+ #undef VarBoolFromI4
+ #undef VarBoolFromR4
+ #undef VarBoolFromR8
+ #undef VarBoolFromDate
+ #undef VarBoolFromCy
+ #undef VarBoolFromStr
+ #undef VarBoolFromDisp
+ #undef SafeArrayCreate
+ #undef SafeArrayDestroy
+ #undef SafeArrayGetDim
+ #undef SafeArrayGetElemsize
+ #undef SafeArrayGetUBound
+ #undef SafeArrayGetLBound
+ #undef SafeArrayLock
+ #undef SafeArrayUnlock
+ #undef SafeArrayAccessData
+ #undef SafeArrayUnaccessData
+ #undef SafeArrayGetElement
+ #undef SafeArrayPutElement
+ #undef SafeArrayCopy
+ #undef SafeArrayAllocDescriptor
+ #undef SafeArrayAllocData
+ #undef SafeArrayDestroyDescriptor
+ #undef SafeArrayDestroyData
+ #undef SafeArrayRedim
+ #undef VariantTimeToDosDateTime
+ #undef DosDateTimeToVariantTime
+ #undef DispGetParam
+ #undef DispGetIDsOfNames
+ #undef DispInvoke
+ #undef CreateDispTypeInfo
+ #undef CreateStdDispatch
+ #undef RegisterActiveObject
+ #undef RevokeActiveObject
+ #undef GetActiveObject
+ #undef DoInvokeMethod
+ #undef VariantChangeTypeEx
+ #undef SafeArrayPtrOfIndex
+ #undef MPWVarFromR4
+ #undef MPWVarFromR8
+ #undef MPWR4FromVar
+ #undef MPWR8FromVar
+ #undef CreateTypeLib
+ #undef LoadTypeLib
+ #undef LoadRegTypeLib
+ #undef RegisterTypeLib
+ #undef LHashValOfNameSys
+ #undef QueryPathOfRegTypeLib
+ #undef LoadTypeLibFSp
+ #undef RegisterTypeLibFolder
+ #undef QueryTypeLibFolder
+ #undef OleBuildVersion
+ #undef OleInitialize
+ #undef OleUninitialize
+ #undef DllGetClassObject
+ #undef OleQueryLinkFromData
+ #undef OleQueryCreateFromData
+ #undef OleCreateFromData
+ #undef OleCreateLinkFromData
+ #undef OleCreate
+ #undef OleCreateLink
+ #undef OleLoad
+ #undef OleSave
+ #undef OleRun
+ #undef OleIsRunning
+ #undef OleLockRunning
+ #undef ReadClassStg
+ #undef WriteClassStg
+ #undef ReadClassStm
+ #undef WriteClassStm
+ #undef BindMoniker
+ #undef MkParseDisplayName
+ #undef OleSaveToStream
+ #undef OleLoadFromStream
+ #undef CreateBindCtx
+ #undef CreateItemMoniker
+ #undef CreateFileMoniker
+ #undef CreateGenericComposite
+ #undef GetRunningObjectTable
+ #undef OleGetMalloc
+ #undef ReleaseStgMedium
+ #undef ReadStringStream
+ #undef WriteStringStream
+ #undef RegisterDragDrop
+ #undef RevokeDragDrop
+ #undef DoDragDrop
+ #undef CreateOleAdviseHolder
+ #undef CreateDataAdviseHolder
+ #undef OpenOrCreateStream
+ #undef CreateAntiMoniker
+ #undef CreatePointerMoniker
+ #undef MonikerRelativePathTo
+ #undef MonikerCommonPrefixWith
+ #undef OleSetClipboard
+ #undef OleGetClipboard
+ #undef OleDuplicateData
+ #undef CreateILockBytesOnHGlobal
+ #undef GetHGlobalFromILockBytes
+ #undef GetClassFile
+ #undef OleDraw
+ #undef OleCreateDefaultHandler
+ #undef OleCreateEmbeddingHelper
+ #undef OleConvertIStorageToOLESTREAMEx
+ #undef OleConvertOLESTREAMToIStorageEx
+ #undef SetDocumentBitStg
+ #undef GetDocumentBitStg
+ #undef WriteOleStg
+ #undef ReadOleStg
+ #undef OleCreateFromFile
+ #undef OleCreateLinkToFile
+ #undef CreateDataCache
+ #undef OleConvertIStorageToOLESTREAM
+ #undef OleConvertOLESTREAMToIStorage
+ #undef ReadFmtUserTypeStg
+ #undef WriteFmtUserTypeStg
+ #undef OleFlushClipboard
+ #undef OleIsCurrentClipboard
+ #undef OleTranslateAccelerator
+ #undef OleDoAutoConvert
+ #undef OleGetAutoConvert
+ #undef OleSetAutoConvert
+ #undef GetConvertStg
+ #undef SetConvertStg
+ #undef CreateStreamOnHGlobal
+ #undef GetHGlobalFromStream
+ #undef OleDuplicateMedium
+ #undef OleSetContainedObject
+ #undef OleNoteObjectVisible
+ #undef OleCreateStaticFromData
+ #undef OleRegGetUserType
+ #undef OleRegGetMiscStatus
+ #undef OleRegEnumFormatEtc
+ #undef OleRegEnumVerbs
+ #undef OleGetEnumFormatEtc
+ #undef OleSetEnumFormatEtc
+ #undef OleRemoveEnumFormatEtc
+ #undef OleSendLLE
+ #undef OleSetInPlaceWindow
+ #undef OleUnSetInPlaceWindow
+ #undef OleClipWindow
+ #undef OleClipWindows
+ #undef OleInsertMenus
+ #undef OleHashMenuID
+ #undef OleUnhashMenuID
+ #undef OlePatchGetMHandle
+ #undef OleUnpatchGetMHandle
+ #undef OleAddMBarMenu
+ #undef OleSetInPlaceRects
+ #undef OleMaskMouse
+ #undef OleMoveWindow
+ #undef OleSizeParentWindow
+ #undef OleSizeObjectWindow
+ #undef OleDragParentWindow
+ #undef OleDragObjectWindow
+ #undef OleGrowParentWindow
+ #undef OleGrowObjectWindow
+ #undef OleNewMBar
+ #undef OleDisposeMBar
+ #undef OleProcessDdeAE
+ #undef OleProcessClipboardAE
+ #undef InitializeClipboard
+ #undef UnInitializeClipboard
+ #undef OleIsClipboardFormatAvailable
+ #undef OleGetClipboardData
+ #undef OleSetClipboardData
+ #undef OleEnumClipboardFormats
+ #undef StoreClap
+ #undef OleCountClipboardFormats
+ #undef OleCloseClipboard
+ #undef OleEmptyClipboard
+ #undef OleSetClipboardEx
+ #undef OleZoomParentWindow
+ #undef OleSetParentRgns
+ #undef CreateFileMonikerFSp
+ #undef OleCreateFromFSp
+ #undef OleCreateLinkToFSp
+ #undef OleGetCursor
+ #undef OleSetCursor
+ #undef OleUpdateCursor
+ #undef GetClassFSp
+ #undef ReadOle1FmtProgIDStgMac
+ #undef WriteOle1FmtProgIDStgMac
+ #undef OleGetIconOfFile
+ #undef OleGetIconOfClass
+ #undef OleGetIconOfFSp
+ #undef OlePictFromIconAndLabel
+ #undef OleGetIconFromIconSuite
+ #undef OleUIPictIconFree
+ #undef OleUIPictIconDraw
+ #undef OleUIPictExtractIcon
+ #undef OleUIPictExtractLabel
+ #undef OleUIPictExtractIconSource
+ #undef OleMetaFileToPict
+ #undef OleQueryCreateAll
+ #undef OleWhichGrowHandle
+ #undef MkGetMacNetInfo
+ #undef CoBuildVersion
+ #undef CoInitialize
+ #undef CoUninitialize
+ #undef CoGetMalloc
+ #undef CoRegisterClassObject
+ #undef CoRevokeClassObject
+ #undef CoGetClassObject
+ #undef CoMarshalInterface
+ #undef CoUnmarshalInterface
+ #undef CoLoadLibrary
+ #undef CoFreeLibrary
+ #undef CoFreeAllLibraries
+ #undef CoCreateInstance
+ #undef StringFromIID
+ #undef CoDisconnectObject
+ #undef CoReleaseMarshalData
+ #undef CoFreeUnusedLibraries
+ #undef IsEqualGUID
+ #undef StringFromCLSID
+ #undef CLSIDFromString
+ #undef RESULTFROMSCODE
+ #undef GETSCODE
+ #undef CoRegisterMessageFilter
+ #undef CoIsHandlerConnected
+ #undef CoMarshalHresult
+ #undef CoUnmarshalHresult
+ #undef CoGetCurrentProcess
+ #undef CoIsOle1Class
+ #undef CLSIDFromProgID
+ #undef ProgIDFromCLSID
+ #undef CoLockObjectExternal
+ #undef CoGetTreatAsClass
+ #undef CoTreatAsClass
+ #undef CoGetStandardMarshal
+ #undef PropagateResult
+ #undef IIDFromString
+ #undef CoCreateStandardMalloc
+ #undef CoCreateGuid
+ #undef StringFromGUID2
+ #undef CoGetClassExt
+ #undef Ole1ClassFromCLSID2
+ #undef CLSIDFromOle1Class
+ #undef CoOpenClassKey
+ #undef GUIDFromString
+ #undef CoFileTimeNow
+ #undef RemAllocOID
+ #undef RemFreeOID
+ #undef RemCreateRemoteHandler
+ #undef RemConnectToObject
+ #undef RemGetInfoForCid
+ #undef LrpcCall
+ #undef LrpcDispatch
+ #undef LrpcRegisterMonitor
+ #undef LrpcRevokeMonitor
+ #undef LrpcGetThreadWindow
+ #undef LookupEtask
+ #undef SetEtask
+ #undef RemLookupSHUnk
+ #undef CoMemctxOf
+ #undef CoMemAlloc
+ #undef CoMemFree
+ #undef CoRunModalLoop
+ #undef CoHandleIncomingCall
+ #undef CoSetAckState
+ #undef OleProcessLrpcAE
+ #undef CoFileTimeToMacDateTime
+ #undef CoMacDateTimeToFileTime
+ #undef InternalCoInitialize
+ #undef CoHandlePendingMessage
+ #undef DllGetClassObject
+ #undef CompareStringA
+ #undef LCMapStringA
+ #undef GetLocaleInfoA
+ #undef GetStringTypeA
+ #undef GetSystemDefaultLangID
+ #undef GetUserDefaultLangID
+ #undef GetSystemDefaultLCID
+ #undef GetUserDefaultLCID
+#if ID_MUNGE_STAT_NAMES
+#if ID_OLE_STAT_DOCFILE
+ #define StgCreateDocfile StaticStgCreateDocfile
+ #define StgCreateDocfileOnILockBytes StaticStgCreateDocfileOnILockBytes
+ #define StgOpenStorage StaticStgOpenStorage
+ #define StgOpenStorageOnILockBytes StaticStgOpenStorageOnILockBytes
+ #define StgIsStorageFile StaticStgIsStorageFile
+ #define StgIsStorageILockBytes StaticStgIsStorageILockBytes
+ #define StgSetTimes StaticStgSetTimes
+ #define StgSetTimesMac StaticStgSetTimesMac
+ #define StgSetTimesFSp StaticStgSetTimesFSp
+ #define DllGetClassObject StaticDllGetClassObject
+ #define StgCreateDocfileFSp StaticStgCreateDocfileFSp
+ #define StgOpenStorageFSp StaticStgOpenStorageFSp
+ #define StgCreateDocfileMac StaticStgCreateDocfileMac
+ #define StgOpenStorageMac StaticStgOpenStorageMac
+ #define StgIsStorageFileMac StaticStgIsStorageFileMac
+ #define StgIsStorageFileFSp StaticStgIsStorageFileFSp
+ #define StgGetFSpFromIStorage StaticStgGetFSpFromIStorage
+ #define StgGetFRefFromIStorage StaticStgGetFRefFromIStorage
+#endif // ID_OLE_STAT_DOCFILE
+#if ID_OLE_STAT_USER
+ #define OleregOpenRegistration StaticOleregOpenRegistration
+ #define OleregCloseRegistration StaticOleregCloseRegistration
+ #define OleregGetValue StaticOleregGetValue
+ #define OleregSetValue StaticOleregSetValue
+ #define OleregRemoveKey StaticOleregRemoveKey
+ #define OleGlobalAddAtom StaticOleGlobalAddAtom
+ #define OleGlobalDuplicateAtom StaticOleGlobalDuplicateAtom
+ #define OleGlobalDeleteAtom StaticOleGlobalDeleteAtom
+ #define OleGlobalFindAtom StaticOleGlobalFindAtom
+ #define OleGlobalGetAtomName StaticOleGlobalGetAtomName
+ #define OleGlobalAlloc StaticOleGlobalAlloc
+ #define OleGlobalCompact StaticOleGlobalCompact
+ #define OleGlobalFree StaticOleGlobalFree
+ #define OleGlobalHandle StaticOleGlobalHandle
+ #define OleGlobalLock StaticOleGlobalLock
+ #define OleGlobalReAlloc StaticOleGlobalReAlloc
+ #define OleGlobalSize StaticOleGlobalSize
+ #define OleGlobalUnlock StaticOleGlobalUnlock
+ #define RegQueryValue StaticRegQueryValue
+ #define RegOpenKey StaticRegOpenKey
+ #define RegSetValue StaticRegSetValue
+ #define RegEnumKey StaticRegEnumKey
+ #define RegEnumProgID StaticRegEnumProgID
+ #define RegDeleteKey StaticRegDeleteKey
+ #define RegCreateKey StaticRegCreateKey
+ #define RegCloseKey StaticRegCloseKey
+ #define RegInitialize StaticRegInitialize
+ #define InitUserData StaticInitUserData
+ #define SendHighLevelEvent StaticSendHighLevelEvent
+ #define OleWinExec StaticOleWinExec
+ #define InitDB StaticInitDB
+ #define CloseDB StaticCloseDB
+ #define OleGetCurrentTask StaticOleGetCurrentTask
+ #define OleGetProcAddress StaticOleGetProcAddress
+ #define OleLoadLibrary StaticOleLoadLibrary
+ #define OleFreeLibrary StaticOleFreeLibrary
+ #define OutputDebugString StaticOutputDebugString
+ #define SoftAssert StaticSoftAssert
+ #define FnAssert StaticFnAssert
+ #define IsValidInterface StaticIsValidInterface
+ #define IsValidIid StaticIsValidIid
+ #define IsValidHandle StaticIsValidHandle
+ #define EnterOLEApi StaticEnterOLEApi
+ #define ExitOLEApi StaticExitOLEApi
+ #define FnAssertOn StaticFnAssertOn
+ #define GlobalFreePtr StaticGlobalFreePtr
+ #define GlobalAllocPtr StaticGlobalAllocPtr
+ #define UserInitialize StaticUserInitialize
+ #define UserUninitialize StaticUserUninitialize
+ #define IsValidInPtr StaticIsValidInPtr
+ #define IsValidOutPtr StaticIsValidOutPtr
+ #define RegQueryValueEx StaticRegQueryValueEx
+ #define RegFlush StaticRegFlush
+ #define RegDeleteValue StaticRegDeleteValue
+ #define RegSetValueEx StaticRegSetValueEx
+ #define RegEnumValue StaticRegEnumValue
+ #define OLEInitDBCSCountry StaticOLEInitDBCSCountry
+ #define IAnsiNext StaticIAnsiNext
+ #define IAnsiPrev StaticIAnsiPrev
+ #define OleMakeFSSpec StaticOleMakeFSSpec
+ #define OleFullPathFromFSSpec StaticOleFullPathFromFSSpec
+ #define OleGetFSSpecInfo StaticOleGetFSSpecInfo
+#endif //ID_OLE_STAT_USER
+#if ID_OLE_STAT_OLE2DISP
+ #define DllGetClassObject StaticDllGetClassObject
+ #define SysAllocString StaticSysAllocString
+ #define SysReAllocString StaticSysReAllocString
+ #define SysAllocStringLen StaticSysAllocStringLen
+ #define SysReAllocStringLen StaticSysReAllocStringLen
+ #define SysFreeString StaticSysFreeString
+ #define SysStringLen StaticSysStringLen
+ #define VariantInit StaticVariantInit
+ #define VariantClear StaticVariantClear
+ #define VariantCopy StaticVariantCopy
+ #define VariantCopyInd StaticVariantCopyInd
+ #define VariantChangeType StaticVariantChangeType
+ #define VarI2FromI4 StaticVarI2FromI4
+ #define VarI2FromR4 StaticVarI2FromR4
+ #define VarI2FromR8 StaticVarI2FromR8
+ #define VarI2FromCy StaticVarI2FromCy
+ #define VarI2FromDate StaticVarI2FromDate
+ #define VarI2FromStr StaticVarI2FromStr
+ #define VarI2FromDisp StaticVarI2FromDisp
+ #define VarI2FromBool StaticVarI2FromBool
+ #define VarI4FromI2 StaticVarI4FromI2
+ #define VarI4FromR4 StaticVarI4FromR4
+ #define VarI4FromR8 StaticVarI4FromR8
+ #define VarI4FromCy StaticVarI4FromCy
+ #define VarI4FromDate StaticVarI4FromDate
+ #define VarI4FromStr StaticVarI4FromStr
+ #define VarI4FromDisp StaticVarI4FromDisp
+ #define VarI4FromBool StaticVarI4FromBool
+ #define VarR4FromI2 StaticVarR4FromI2
+ #define VarR4FromI4 StaticVarR4FromI4
+ #define VarR4FromR8 StaticVarR4FromR8
+ #define VarR4FromCy StaticVarR4FromCy
+ #define VarR4FromDate StaticVarR4FromDate
+ #define VarR4FromStr StaticVarR4FromStr
+ #define VarR4FromDisp StaticVarR4FromDisp
+ #define VarR4FromBool StaticVarR4FromBool
+ #define VarR8FromI2 StaticVarR8FromI2
+ #define VarR8FromI4 StaticVarR8FromI4
+ #define VarR8FromR4 StaticVarR8FromR4
+ #define VarR8FromCy StaticVarR8FromCy
+ #define VarR8FromDate StaticVarR8FromDate
+ #define VarR8FromStr StaticVarR8FromStr
+ #define VarR8FromDisp StaticVarR8FromDisp
+ #define VarR8FromBool StaticVarR8FromBool
+ #define VarDateFromI2 StaticVarDateFromI2
+ #define VarDateFromI4 StaticVarDateFromI4
+ #define VarDateFromR4 StaticVarDateFromR4
+ #define VarDateFromR8 StaticVarDateFromR8
+ #define VarDateFromCy StaticVarDateFromCy
+ #define VarDateFromStr StaticVarDateFromStr
+ #define VarDateFromDisp StaticVarDateFromDisp
+ #define VarDateFromBool StaticVarDateFromBool
+ #define VarCyFromI2 StaticVarCyFromI2
+ #define VarCyFromI4 StaticVarCyFromI4
+ #define VarCyFromR4 StaticVarCyFromR4
+ #define VarCyFromR8 StaticVarCyFromR8
+ #define VarCyFromDate StaticVarCyFromDate
+ #define VarCyFromStr StaticVarCyFromStr
+ #define VarCyFromDisp StaticVarCyFromDisp
+ #define VarCyFromBool StaticVarCyFromBool
+ #define VarBstrFromI2 StaticVarBstrFromI2
+ #define VarBstrFromI4 StaticVarBstrFromI4
+ #define VarBstrFromR4 StaticVarBstrFromR4
+ #define VarBstrFromR8 StaticVarBstrFromR8
+ #define VarBstrFromCy StaticVarBstrFromCy
+ #define VarBstrFromDate StaticVarBstrFromDate
+ #define VarBstrFromDisp StaticVarBstrFromDisp
+ #define VarBstrFromBool StaticVarBstrFromBool
+ #define VarBoolFromI2 StaticVarBoolFromI2
+ #define VarBoolFromI4 StaticVarBoolFromI4
+ #define VarBoolFromR4 StaticVarBoolFromR4
+ #define VarBoolFromR8 StaticVarBoolFromR8
+ #define VarBoolFromDate StaticVarBoolFromDate
+ #define VarBoolFromCy StaticVarBoolFromCy
+ #define VarBoolFromStr StaticVarBoolFromStr
+ #define VarBoolFromDisp StaticVarBoolFromDisp
+ #define SafeArrayCreate StaticSafeArrayCreate
+ #define SafeArrayDestroy StaticSafeArrayDestroy
+ #define SafeArrayGetDim StaticSafeArrayGetDim
+ #define SafeArrayGetElemsize StaticSafeArrayGetElemsize
+ #define SafeArrayGetUBound StaticSafeArrayGetUBound
+ #define SafeArrayGetLBound StaticSafeArrayGetLBound
+ #define SafeArrayLock StaticSafeArrayLock
+ #define SafeArrayUnlock StaticSafeArrayUnlock
+ #define SafeArrayAccessData StaticSafeArrayAccessData
+ #define SafeArrayUnaccessData StaticSafeArrayUnaccessData
+ #define SafeArrayGetElement StaticSafeArrayGetElement
+ #define SafeArrayPutElement StaticSafeArrayPutElement
+ #define SafeArrayCopy StaticSafeArrayCopy
+ #define SafeArrayAllocDescriptor StaticSafeArrayAllocDescriptor
+ #define SafeArrayAllocData StaticSafeArrayAllocData
+ #define SafeArrayDestroyDescriptor StaticSafeArrayDestroyDescriptor
+ #define SafeArrayDestroyData StaticSafeArrayDestroyData
+ #define SafeArrayRedim StaticSafeArrayRedim
+ #define VariantTimeToDosDateTime StaticVariantTimeToDosDateTime
+ #define DosDateTimeToVariantTime StaticDosDateTimeToVariantTime
+ #define DispGetParam StaticDispGetParam
+ #define DispGetIDsOfNames StaticDispGetIDsOfNames
+ #define DispInvoke StaticDispInvoke
+ #define CreateDispTypeInfo StaticCreateDispTypeInfo
+ #define CreateStdDispatch StaticCreateStdDispatch
+ #define RegisterActiveObject StaticRegisterActiveObject
+ #define RevokeActiveObject StaticRevokeActiveObject
+ #define GetActiveObject StaticGetActiveObject
+ #define DoInvokeMethod StaticDoInvokeMethod
+ #define VariantChangeTypeEx StaticVariantChangeTypeEx
+ #define SafeArrayPtrOfIndex StaticSafeArrayPtrOfIndex
+ #define MPWVarFromR4 StaticMPWVarFromR4
+ #define MPWVarFromR8 StaticMPWVarFromR8
+ #define MPWR4FromVar StaticMPWR4FromVar
+ #define MPWR8FromVar StaticMPWR8FromVar
+#endif //ID_OLE_STAT_OLE2DISP
+#if ID_OLE_STAT_TYPELIB
+ #define CreateTypeLib StaticCreateTypeLib
+ #define LoadTypeLib StaticLoadTypeLib
+ #define LoadRegTypeLib StaticLoadRegTypeLib
+ #define RegisterTypeLib StaticRegisterTypeLib
+ #define LHashValOfNameSys StaticLHashValOfNameSys
+ #define QueryPathOfRegTypeLib StaticQueryPathOfRegTypeLib
+ #define LoadTypeLibFSp StaticLoadTypeLibFSp
+ #define RegisterTypeLibFolder StaticRegisterTypeLibFolder
+ #define QueryTypeLibFolder StaticQueryTypeLibFolder
+#endif //ID_OLE_STAT_TYPELIB
+#if ID_OLE_STAT_DEF
+ #define OleBuildVersion StaticOleBuildVersion
+ #define OleInitialize StaticOleInitialize
+ #define OleUninitialize StaticOleUninitialize
+ #define DllGetClassObject StaticDllGetClassObject
+ #define OleQueryLinkFromData StaticOleQueryLinkFromData
+ #define OleQueryCreateFromData StaticOleQueryCreateFromData
+ #define OleCreateFromData StaticOleCreateFromData
+ #define OleCreateLinkFromData StaticOleCreateLinkFromData
+ #define OleCreate StaticOleCreate
+ #define OleCreateLink StaticOleCreateLink
+ #define OleLoad StaticOleLoad
+ #define OleSave StaticOleSave
+ #define OleRun StaticOleRun
+ #define OleIsRunning StaticOleIsRunning
+ #define OleLockRunning StaticOleLockRunning
+ #define ReadClassStg StaticReadClassStg
+ #define WriteClassStg StaticWriteClassStg
+ #define ReadClassStm StaticReadClassStm
+ #define WriteClassStm StaticWriteClassStm
+ #define BindMoniker StaticBindMoniker
+ #define MkParseDisplayName StaticMkParseDisplayName
+ #define OleSaveToStream StaticOleSaveToStream
+ #define OleLoadFromStream StaticOleLoadFromStream
+ #define CreateBindCtx StaticCreateBindCtx
+ #define CreateItemMoniker StaticCreateItemMoniker
+ #define CreateFileMoniker StaticCreateFileMoniker
+ #define CreateGenericComposite StaticCreateGenericComposite
+ #define GetRunningObjectTable StaticGetRunningObjectTable
+ #define OleGetMalloc StaticOleGetMalloc
+ #define ReleaseStgMedium StaticReleaseStgMedium
+ #define ReadStringStream StaticReadStringStream
+ #define WriteStringStream StaticWriteStringStream
+ #define RegisterDragDrop StaticRegisterDragDrop
+ #define RevokeDragDrop StaticRevokeDragDrop
+ #define DoDragDrop StaticDoDragDrop
+ #define CreateOleAdviseHolder StaticCreateOleAdviseHolder
+ #define CreateDataAdviseHolder StaticCreateDataAdviseHolder
+ #define OpenOrCreateStream StaticOpenOrCreateStream
+ #define CreateAntiMoniker StaticCreateAntiMoniker
+ #define CreatePointerMoniker StaticCreatePointerMoniker
+ #define MonikerRelativePathTo StaticMonikerRelativePathTo
+ #define MonikerCommonPrefixWith StaticMonikerCommonPrefixWith
+ #define OleSetClipboard StaticOleSetClipboard
+ #define OleGetClipboard StaticOleGetClipboard
+ #define OleDuplicateData StaticOleDuplicateData
+ #define CreateILockBytesOnHGlobal StaticCreateILockBytesOnHGlobal
+ #define GetHGlobalFromILockBytes StaticGetHGlobalFromILockBytes
+ #define GetClassFile StaticGetClassFile
+ #define OleDraw StaticOleDraw
+ #define OleCreateDefaultHandler StaticOleCreateDefaultHandler
+ #define OleCreateEmbeddingHelper StaticOleCreateEmbeddingHelper
+ #define OleConvertIStorageToOLESTREAMEx StaticOleConvertIStorageToOLESTREAMEx
+ #define OleConvertOLESTREAMToIStorageEx StaticOleConvertOLESTREAMToIStorageEx
+ #define SetDocumentBitStg StaticSetDocumentBitStg
+ #define GetDocumentBitStg StaticGetDocumentBitStg
+ #define WriteOleStg StaticWriteOleStg
+ #define ReadOleStg StaticReadOleStg
+ #define OleCreateFromFile StaticOleCreateFromFile
+ #define OleCreateLinkToFile StaticOleCreateLinkToFile
+ #define CreateDataCache StaticCreateDataCache
+ #define OleConvertIStorageToOLESTREAM StaticOleConvertIStorageToOLESTREAM
+ #define OleConvertOLESTREAMToIStorage StaticOleConvertOLESTREAMToIStorage
+ #define ReadFmtUserTypeStg StaticReadFmtUserTypeStg
+ #define WriteFmtUserTypeStg StaticWriteFmtUserTypeStg
+ #define OleFlushClipboard StaticOleFlushClipboard
+ #define OleIsCurrentClipboard StaticOleIsCurrentClipboard
+ #define OleTranslateAccelerator StaticOleTranslateAccelerator
+ #define OleDoAutoConvert StaticOleDoAutoConvert
+ #define OleGetAutoConvert StaticOleGetAutoConvert
+ #define OleSetAutoConvert StaticOleSetAutoConvert
+ #define GetConvertStg StaticGetConvertStg
+ #define SetConvertStg StaticSetConvertStg
+ #define CreateStreamOnHGlobal StaticCreateStreamOnHGlobal
+ #define GetHGlobalFromStream StaticGetHGlobalFromStream
+ #define OleDuplicateMedium StaticOleDuplicateMedium
+ #define OleSetContainedObject StaticOleSetContainedObject
+ #define OleNoteObjectVisible StaticOleNoteObjectVisible
+ #define OleCreateStaticFromData StaticOleCreateStaticFromData
+ #define OleRegGetUserType StaticOleRegGetUserType
+ #define OleRegGetMiscStatus StaticOleRegGetMiscStatus
+ #define OleRegEnumFormatEtc StaticOleRegEnumFormatEtc
+ #define OleRegEnumVerbs StaticOleRegEnumVerbs
+ #define OleGetEnumFormatEtc StaticOleGetEnumFormatEtc
+ #define OleSetEnumFormatEtc StaticOleSetEnumFormatEtc
+ #define OleRemoveEnumFormatEtc StaticOleRemoveEnumFormatEtc
+ #define OleSendLLE StaticOleSendLLE
+ #define OleSetInPlaceWindow StaticOleSetInPlaceWindow
+ #define OleUnSetInPlaceWindow StaticOleUnSetInPlaceWindow
+ #define OleClipWindow StaticOleClipWindow
+ #define OleClipWindows StaticOleClipWindows
+ #define OleInsertMenus StaticOleInsertMenus
+ #define OleHashMenuID StaticOleHashMenuID
+ #define OleUnhashMenuID StaticOleUnhashMenuID
+ #define OlePatchGetMHandle StaticOlePatchGetMHandle
+ #define OleUnpatchGetMHandle StaticOleUnpatchGetMHandle
+ #define OleAddMBarMenu StaticOleAddMBarMenu
+ #define OleSetInPlaceRects StaticOleSetInPlaceRects
+ #define OleMaskMouse StaticOleMaskMouse
+ #define OleMoveWindow StaticOleMoveWindow
+ #define OleSizeParentWindow StaticOleSizeParentWindow
+ #define OleSizeObjectWindow StaticOleSizeObjectWindow
+ #define OleDragParentWindow StaticOleDragParentWindow
+ #define OleDragObjectWindow StaticOleDragObjectWindow
+ #define OleGrowParentWindow StaticOleGrowParentWindow
+ #define OleGrowObjectWindow StaticOleGrowObjectWindow
+ #define OleNewMBar StaticOleNewMBar
+ #define OleDisposeMBar StaticOleDisposeMBar
+ #define OleProcessDdeAE StaticOleProcessDdeAE
+ #define OleProcessClipboardAE StaticOleProcessClipboardAE
+ #define InitializeClipboard StaticInitializeClipboard
+ #define UnInitializeClipboard StaticUnInitializeClipboard
+ #define OleIsClipboardFormatAvailable StaticOleIsClipboardFormatAvailable
+ #define OleGetClipboardData StaticOleGetClipboardData
+ #define OleSetClipboardData StaticOleSetClipboardData
+ #define OleEnumClipboardFormats StaticOleEnumClipboardFormats
+ #define StoreClap StaticStoreClap
+ #define OleCountClipboardFormats StaticOleCountClipboardFormats
+ #define OleCloseClipboard StaticOleCloseClipboard
+ #define OleEmptyClipboard StaticOleEmptyClipboard
+ #define OleSetClipboardEx StaticOleSetClipboardEx
+ #define OleZoomParentWindow StaticOleZoomParentWindow
+ #define OleSetParentRgns StaticOleSetParentRgns
+ #define CreateFileMonikerFSp StaticCreateFileMonikerFSp
+ #define OleCreateFromFSp StaticOleCreateFromFSp
+ #define OleCreateLinkToFSp StaticOleCreateLinkToFSp
+ #define OleGetCursor StaticOleGetCursor
+ #define OleSetCursor StaticOleSetCursor
+ #define OleUpdateCursor StaticOleUpdateCursor
+ #define GetClassFSp StaticGetClassFSp
+ #define ReadOle1FmtProgIDStgMac StaticReadOle1FmtProgIDStgMac
+ #define WriteOle1FmtProgIDStgMac StaticWriteOle1FmtProgIDStgMac
+ #define OleGetIconOfFile StaticOleGetIconOfFile
+ #define OleGetIconOfClass StaticOleGetIconOfClass
+ #define OleGetIconOfFSp StaticOleGetIconOfFSp
+ #define OlePictFromIconAndLabel StaticOlePictFromIconAndLabel
+ #define OleGetIconFromIconSuite StaticOleGetIconFromIconSuite
+ #define OleUIPictIconFree StaticOleUIPictIconFree
+ #define OleUIPictIconDraw StaticOleUIPictIconDraw
+ #define OleUIPictExtractIcon StaticOleUIPictExtractIcon
+ #define OleUIPictExtractLabel StaticOleUIPictExtractLabel
+ #define OleUIPictExtractIconSource StaticOleUIPictExtractIconSource
+ #define OleMetaFileToPict StaticOleMetaFileToPict
+ #define OleQueryCreateAll StaticOleQueryCreateAll
+ #define OleWhichGrowHandle StaticOleWhichGrowHandle
+ #define MkGetMacNetInfo StaticMkGetMacNetInfo
+#endif //ID_OLE_STAT_DEF
+#if ID_OLE_STAT_COMPOBJ
+ #define CoBuildVersion StaticCoBuildVersion
+ #define CoInitialize StaticCoInitialize
+ #define CoUninitialize StaticCoUninitialize
+ #define CoGetMalloc StaticCoGetMalloc
+ #define CoRegisterClassObject StaticCoRegisterClassObject
+ #define CoRevokeClassObject StaticCoRevokeClassObject
+ #define CoGetClassObject StaticCoGetClassObject
+ #define CoMarshalInterface StaticCoMarshalInterface
+ #define CoUnmarshalInterface StaticCoUnmarshalInterface
+ #define CoLoadLibrary StaticCoLoadLibrary
+ #define CoFreeLibrary StaticCoFreeLibrary
+ #define CoFreeAllLibraries StaticCoFreeAllLibraries
+ #define CoCreateInstance StaticCoCreateInstance
+ #define StringFromIID StaticStringFromIID
+ #define CoDisconnectObject StaticCoDisconnectObject
+ #define CoReleaseMarshalData StaticCoReleaseMarshalData
+ #define CoFreeUnusedLibraries StaticCoFreeUnusedLibraries
+ #define IsEqualGUID StaticIsEqualGUID
+ #define StringFromCLSID StaticStringFromCLSID
+ #define CLSIDFromString StaticCLSIDFromString
+ #define RESULTFROMSCODE StaticRESULTFROMSCODE
+ #define GETSCODE StaticGETSCODE
+ #define CoRegisterMessageFilter StaticCoRegisterMessageFilter
+ #define CoIsHandlerConnected StaticCoIsHandlerConnected
+ #define CoMarshalHresult StaticCoMarshalHresult
+ #define CoUnmarshalHresult StaticCoUnmarshalHresult
+ #define CoGetCurrentProcess StaticCoGetCurrentProcess
+ #define CoIsOle1Class StaticCoIsOle1Class
+ #define CLSIDFromProgID StaticCLSIDFromProgID
+ #define ProgIDFromCLSID StaticProgIDFromCLSID
+ #define CoLockObjectExternal StaticCoLockObjectExternal
+ #define CoGetTreatAsClass StaticCoGetTreatAsClass
+ #define CoTreatAsClass StaticCoTreatAsClass
+ #define CoGetStandardMarshal StaticCoGetStandardMarshal
+ #define PropagateResult StaticPropagateResult
+ #define IIDFromString StaticIIDFromString
+ #define CoCreateStandardMalloc StaticCoCreateStandardMalloc
+ #define CoCreateGuid StaticCoCreateGuid
+ #define StringFromGUID2 StaticStringFromGUID2
+ #define CoGetClassExt StaticCoGetClassExt
+ #define Ole1ClassFromCLSID2 StaticOle1ClassFromCLSID2
+ #define CLSIDFromOle1Class StaticCLSIDFromOle1Class
+ #define CoOpenClassKey StaticCoOpenClassKey
+ #define GUIDFromString StaticGUIDFromString
+ #define CoFileTimeNow StaticCoFileTimeNow
+ #define RemAllocOID StaticRemAllocOID
+ #define RemFreeOID StaticRemFreeOID
+ #define RemCreateRemoteHandler StaticRemCreateRemoteHandler
+ #define RemConnectToObject StaticRemConnectToObject
+ #define RemGetInfoForCid StaticRemGetInfoForCid
+ #define LrpcCall StaticLrpcCall
+ #define LrpcDispatch StaticLrpcDispatch
+ #define LrpcRegisterMonitor StaticLrpcRegisterMonitor
+ #define LrpcRevokeMonitor StaticLrpcRevokeMonitor
+ #define LrpcGetThreadWindow StaticLrpcGetThreadWindow
+ #define LookupEtask StaticLookupEtask
+ #define SetEtask StaticSetEtask
+ #define RemLookupSHUnk StaticRemLookupSHUnk
+ #define CoMemctxOf StaticCoMemctxOf
+ #define CoMemAlloc StaticCoMemAlloc
+ #define CoMemFree StaticCoMemFree
+ #define CoRunModalLoop StaticCoRunModalLoop
+ #define CoHandleIncomingCall StaticCoHandleIncomingCall
+ #define CoSetAckState StaticCoSetAckState
+ #define OleProcessLrpcAE StaticOleProcessLrpcAE
+ #define CoFileTimeToMacDateTime StaticCoFileTimeToMacDateTime
+ #define CoMacDateTimeToFileTime StaticCoMacDateTimeToFileTime
+ #define InternalCoInitialize StaticInternalCoInitialize
+ #define CoHandlePendingMessage StaticCoHandlePendingMessage
+#endif //ID_OLE_STAT_COMPOBJ
+#if ID_OLE_STAT_PROXY
+ #define DllGetClassObject StaticDllGetClassObject
+#endif //ID_OLE_STAT_PROXY
+#if ID_OLE_STAT_OLE2NLS
+ #define CompareStringA StaticCompareStringA
+ #define LCMapStringA StaticLCMapStringA
+ #define GetLocaleInfoA StaticGetLocaleInfoA
+ #define GetStringTypeA StaticGetStringTypeA
+ #define GetSystemDefaultLangID StaticGetSystemDefaultLangID
+ #define GetUserDefaultLangID StaticGetUserDefaultLangID
+ #define GetSystemDefaultLCID StaticGetSystemDefaultLCID
+ #define GetUserDefaultLCID StaticGetUserDefaultLCID
+#endif //ID_OLE_STAT_OLE2NLS
+#endif //ID_MUNGE_STAT_NAMES
+#if ID_MUNGE_DLL_NAMES
+#if !ID_OLE_STAT_DOCFILE
+ #define StgCreateDocfile _DllStgCreateDocfile
+ #define StgCreateDocfileOnILockBytes _DllStgCreateDocfileOnILockBytes
+ #define StgOpenStorage _DllStgOpenStorage
+ #define StgOpenStorageOnILockBytes _DllStgOpenStorageOnILockBytes
+ #define StgIsStorageFile _DllStgIsStorageFile
+ #define StgIsStorageILockBytes _DllStgIsStorageILockBytes
+ #define StgSetTimes _DllStgSetTimes
+ #define StgSetTimesMac _DllStgSetTimesMac
+ #define StgSetTimesFSp _DllStgSetTimesFSp
+ #define DllGetClassObject _DllDllGetClassObject
+ #define StgCreateDocfileFSp _DllStgCreateDocfileFSp
+ #define StgOpenStorageFSp _DllStgOpenStorageFSp
+ #define StgCreateDocfileMac _DllStgCreateDocfileMac
+ #define StgOpenStorageMac _DllStgOpenStorageMac
+ #define StgIsStorageFileMac _DllStgIsStorageFileMac
+ #define StgIsStorageFileFSp _DllStgIsStorageFileFSp
+ #define StgGetFSpFromIStorage _DllStgGetFSpFromIStorage
+ #define StgGetFRefFromIStorage _DllStgGetFRefFromIStorage
+#endif // ID_OLE_STAT_DOCFILE
+#if !ID_OLE_STAT_USER
+ #define OleregOpenRegistration _DllOleregOpenRegistration
+ #define OleregCloseRegistration _DllOleregCloseRegistration
+ #define OleregGetValue _DllOleregGetValue
+ #define OleregSetValue _DllOleregSetValue
+ #define OleregRemoveKey _DllOleregRemoveKey
+ #define OleGlobalAddAtom _DllOleGlobalAddAtom
+ #define OleGlobalDuplicateAtom _DllOleGlobalDuplicateAtom
+ #define OleGlobalDeleteAtom _DllOleGlobalDeleteAtom
+ #define OleGlobalFindAtom _DllOleGlobalFindAtom
+ #define OleGlobalGetAtomName _DllOleGlobalGetAtomName
+ #define OleGlobalAlloc _DllOleGlobalAlloc
+ #define OleGlobalCompact _DllOleGlobalCompact
+ #define OleGlobalFree _DllOleGlobalFree
+ #define OleGlobalHandle _DllOleGlobalHandle
+ #define OleGlobalLock _DllOleGlobalLock
+ #define OleGlobalReAlloc _DllOleGlobalReAlloc
+ #define OleGlobalSize _DllOleGlobalSize
+ #define OleGlobalUnlock _DllOleGlobalUnlock
+ #define RegQueryValue _DllRegQueryValue
+ #define RegOpenKey _DllRegOpenKey
+ #define RegSetValue _DllRegSetValue
+ #define RegEnumKey _DllRegEnumKey
+ #define RegEnumProgID _DllRegEnumProgID
+ #define RegDeleteKey _DllRegDeleteKey
+ #define RegCreateKey _DllRegCreateKey
+ #define RegCloseKey _DllRegCloseKey
+ #define RegInitialize _DllRegInitialize
+ #define InitUserData _DllInitUserData
+ #define SendHighLevelEvent _DllSendHighLevelEvent
+ #define OleWinExec _DllOleWinExec
+ #define InitDB _DllInitDB
+ #define CloseDB _DllCloseDB
+ #define OleGetCurrentTask _DllOleGetCurrentTask
+ #define OleGetProcAddress _DllOleGetProcAddress
+ #define OleLoadLibrary _DllOleLoadLibrary
+ #define OleFreeLibrary _DllOleFreeLibrary
+ #define OutputDebugString _DllOutputDebugString
+ #define SoftAssert _DllSoftAssert
+ #define FnAssert _DllFnAssert
+ #define IsValidInterface _DllIsValidInterface
+ #define IsValidIid _DllIsValidIid
+ #define IsValidHandle _DllIsValidHandle
+ #define EnterOLEApi _DllEnterOLEApi
+ #define ExitOLEApi _DllExitOLEApi
+ #define FnAssertOn _DllFnAssertOn
+ #define GlobalFreePtr _DllGlobalFreePtr
+ #define GlobalAllocPtr _DllGlobalAllocPtr
+ #define UserInitialize _DllUserInitialize
+ #define UserUninitialize _DllUserUninitialize
+ #define IsValidInPtr _DllIsValidInPtr
+ #define IsValidOutPtr _DllIsValidOutPtr
+ #define RegQueryValueEx _DllRegQueryValueEx
+ #define RegFlush _DllRegFlush
+ #define RegDeleteValue _DllRegDeleteValue
+ #define RegSetValueEx _DllRegSetValueEx
+ #define RegEnumValue _DllRegEnumValue
+ #define OLEInitDBCSCountry _DllOLEInitDBCSCountry
+ #define IAnsiNext _DllIAnsiNext
+ #define IAnsiPrev _DllIAnsiPrev
+ #define OleMakeFSSpec _DllOleMakeFSSpec
+ #define OleFullPathFromFSSpec _DllOleFullPathFromFSSpec
+ #define OleGetFSSpecInfo _DllOleGetFSSpecInfo
+#endif //ID_OLE_STAT_USER
+#if !ID_OLE_STAT_OLE2DISP
+ #define DllGetClassObject _DllDllGetClassObject
+ #define SysAllocString _DllSysAllocString
+ #define SysReAllocString _DllSysReAllocString
+ #define SysAllocStringLen _DllSysAllocStringLen
+ #define SysReAllocStringLen _DllSysReAllocStringLen
+ #define SysFreeString _DllSysFreeString
+ #define SysStringLen _DllSysStringLen
+ #define VariantInit _DllVariantInit
+ #define VariantClear _DllVariantClear
+ #define VariantCopy _DllVariantCopy
+ #define VariantCopyInd _DllVariantCopyInd
+ #define VariantChangeType _DllVariantChangeType
+ #define VarI2FromI4 _DllVarI2FromI4
+ #define VarI2FromR4 _DllVarI2FromR4
+ #define VarI2FromR8 _DllVarI2FromR8
+ #define VarI2FromCy _DllVarI2FromCy
+ #define VarI2FromDate _DllVarI2FromDate
+ #define VarI2FromStr _DllVarI2FromStr
+ #define VarI2FromDisp _DllVarI2FromDisp
+ #define VarI2FromBool _DllVarI2FromBool
+ #define VarI4FromI2 _DllVarI4FromI2
+ #define VarI4FromR4 _DllVarI4FromR4
+ #define VarI4FromR8 _DllVarI4FromR8
+ #define VarI4FromCy _DllVarI4FromCy
+ #define VarI4FromDate _DllVarI4FromDate
+ #define VarI4FromStr _DllVarI4FromStr
+ #define VarI4FromDisp _DllVarI4FromDisp
+ #define VarI4FromBool _DllVarI4FromBool
+ #define VarR4FromI2 _DllVarR4FromI2
+ #define VarR4FromI4 _DllVarR4FromI4
+ #define VarR4FromR8 _DllVarR4FromR8
+ #define VarR4FromCy _DllVarR4FromCy
+ #define VarR4FromDate _DllVarR4FromDate
+ #define VarR4FromStr _DllVarR4FromStr
+ #define VarR4FromDisp _DllVarR4FromDisp
+ #define VarR4FromBool _DllVarR4FromBool
+ #define VarR8FromI2 _DllVarR8FromI2
+ #define VarR8FromI4 _DllVarR8FromI4
+ #define VarR8FromR4 _DllVarR8FromR4
+ #define VarR8FromCy _DllVarR8FromCy
+ #define VarR8FromDate _DllVarR8FromDate
+ #define VarR8FromStr _DllVarR8FromStr
+ #define VarR8FromDisp _DllVarR8FromDisp
+ #define VarR8FromBool _DllVarR8FromBool
+ #define VarDateFromI2 _DllVarDateFromI2
+ #define VarDateFromI4 _DllVarDateFromI4
+ #define VarDateFromR4 _DllVarDateFromR4
+ #define VarDateFromR8 _DllVarDateFromR8
+ #define VarDateFromCy _DllVarDateFromCy
+ #define VarDateFromStr _DllVarDateFromStr
+ #define VarDateFromDisp _DllVarDateFromDisp
+ #define VarDateFromBool _DllVarDateFromBool
+ #define VarCyFromI2 _DllVarCyFromI2
+ #define VarCyFromI4 _DllVarCyFromI4
+ #define VarCyFromR4 _DllVarCyFromR4
+ #define VarCyFromR8 _DllVarCyFromR8
+ #define VarCyFromDate _DllVarCyFromDate
+ #define VarCyFromStr _DllVarCyFromStr
+ #define VarCyFromDisp _DllVarCyFromDisp
+ #define VarCyFromBool _DllVarCyFromBool
+ #define VarBstrFromI2 _DllVarBstrFromI2
+ #define VarBstrFromI4 _DllVarBstrFromI4
+ #define VarBstrFromR4 _DllVarBstrFromR4
+ #define VarBstrFromR8 _DllVarBstrFromR8
+ #define VarBstrFromCy _DllVarBstrFromCy
+ #define VarBstrFromDate _DllVarBstrFromDate
+ #define VarBstrFromDisp _DllVarBstrFromDisp
+ #define VarBstrFromBool _DllVarBstrFromBool
+ #define VarBoolFromI2 _DllVarBoolFromI2
+ #define VarBoolFromI4 _DllVarBoolFromI4
+ #define VarBoolFromR4 _DllVarBoolFromR4
+ #define VarBoolFromR8 _DllVarBoolFromR8
+ #define VarBoolFromDate _DllVarBoolFromDate
+ #define VarBoolFromCy _DllVarBoolFromCy
+ #define VarBoolFromStr _DllVarBoolFromStr
+ #define VarBoolFromDisp _DllVarBoolFromDisp
+ #define SafeArrayCreate _DllSafeArrayCreate
+ #define SafeArrayDestroy _DllSafeArrayDestroy
+ #define SafeArrayGetDim _DllSafeArrayGetDim
+ #define SafeArrayGetElemsize _DllSafeArrayGetElemsize
+ #define SafeArrayGetUBound _DllSafeArrayGetUBound
+ #define SafeArrayGetLBound _DllSafeArrayGetLBound
+ #define SafeArrayLock _DllSafeArrayLock
+ #define SafeArrayUnlock _DllSafeArrayUnlock
+ #define SafeArrayAccessData _DllSafeArrayAccessData
+ #define SafeArrayUnaccessData _DllSafeArrayUnaccessData
+ #define SafeArrayGetElement _DllSafeArrayGetElement
+ #define SafeArrayPutElement _DllSafeArrayPutElement
+ #define SafeArrayCopy _DllSafeArrayCopy
+ #define SafeArrayAllocDescriptor _DllSafeArrayAllocDescriptor
+ #define SafeArrayAllocData _DllSafeArrayAllocData
+ #define SafeArrayDestroyDescriptor _DllSafeArrayDestroyDescriptor
+ #define SafeArrayDestroyData _DllSafeArrayDestroyData
+ #define SafeArrayRedim _DllSafeArrayRedim
+ #define VariantTimeToDosDateTime _DllVariantTimeToDosDateTime
+ #define DosDateTimeToVariantTime _DllDosDateTimeToVariantTime
+ #define DispGetParam _DllDispGetParam
+ #define DispGetIDsOfNames _DllDispGetIDsOfNames
+ #define DispInvoke _DllDispInvoke
+ #define CreateDispTypeInfo _DllCreateDispTypeInfo
+ #define CreateStdDispatch _DllCreateStdDispatch
+ #define RegisterActiveObject _DllRegisterActiveObject
+ #define RevokeActiveObject _DllRevokeActiveObject
+ #define GetActiveObject _DllGetActiveObject
+ #define DoInvokeMethod _DllDoInvokeMethod
+ #define VariantChangeTypeEx _DllVariantChangeTypeEx
+ #define SafeArrayPtrOfIndex _DllSafeArrayPtrOfIndex
+ #define MPWVarFromR4 _DllMPWVarFromR4
+ #define MPWVarFromR8 _DllMPWVarFromR8
+ #define MPWR4FromVar _DllMPWR4FromVar
+ #define MPWR8FromVar _DllMPWR8FromVar
+#endif //ID_OLE_STAT_OLE2DISP
+#if !ID_OLE_STAT_TYPELIB
+ #define CreateTypeLib _DllCreateTypeLib
+ #define LoadTypeLib _DllLoadTypeLib
+ #define LoadRegTypeLib _DllLoadRegTypeLib
+ #define RegisterTypeLib _DllRegisterTypeLib
+ #define LHashValOfNameSys _DllLHashValOfNameSys
+ #define QueryPathOfRegTypeLib _DllQueryPathOfRegTypeLib
+ #define LoadTypeLibFSp _DllLoadTypeLibFSp
+ #define RegisterTypeLibFolder _DllRegisterTypeLibFolder
+ #define QueryTypeLibFolder _DllQueryTypeLibFolder
+#endif //ID_OLE_STAT_TYPELIB
+#if !ID_OLE_STAT_DEF
+ #define OleBuildVersion _DllOleBuildVersion
+ #define OleInitialize _DllOleInitialize
+ #define OleUninitialize _DllOleUninitialize
+ #define DllGetClassObject _DllDllGetClassObject
+ #define OleQueryLinkFromData _DllOleQueryLinkFromData
+ #define OleQueryCreateFromData _DllOleQueryCreateFromData
+ #define OleCreateFromData _DllOleCreateFromData
+ #define OleCreateLinkFromData _DllOleCreateLinkFromData
+ #define OleCreate _DllOleCreate
+ #define OleCreateLink _DllOleCreateLink
+ #define OleLoad _DllOleLoad
+ #define OleSave _DllOleSave
+ #define OleRun _DllOleRun
+ #define OleIsRunning _DllOleIsRunning
+ #define OleLockRunning _DllOleLockRunning
+ #define ReadClassStg _DllReadClassStg
+ #define WriteClassStg _DllWriteClassStg
+ #define ReadClassStm _DllReadClassStm
+ #define WriteClassStm _DllWriteClassStm
+ #define BindMoniker _DllBindMoniker
+ #define MkParseDisplayName _DllMkParseDisplayName
+ #define OleSaveToStream _DllOleSaveToStream
+ #define OleLoadFromStream _DllOleLoadFromStream
+ #define CreateBindCtx _DllCreateBindCtx
+ #define CreateItemMoniker _DllCreateItemMoniker
+ #define CreateFileMoniker _DllCreateFileMoniker
+ #define CreateGenericComposite _DllCreateGenericComposite
+ #define GetRunningObjectTable _DllGetRunningObjectTable
+ #define OleGetMalloc _DllOleGetMalloc
+ #define ReleaseStgMedium _DllReleaseStgMedium
+ #define ReadStringStream _DllReadStringStream
+ #define WriteStringStream _DllWriteStringStream
+ #define RegisterDragDrop _DllRegisterDragDrop
+ #define RevokeDragDrop _DllRevokeDragDrop
+ #define DoDragDrop _DllDoDragDrop
+ #define CreateOleAdviseHolder _DllCreateOleAdviseHolder
+ #define CreateDataAdviseHolder _DllCreateDataAdviseHolder
+ #define OpenOrCreateStream _DllOpenOrCreateStream
+ #define CreateAntiMoniker _DllCreateAntiMoniker
+ #define CreatePointerMoniker _DllCreatePointerMoniker
+ #define MonikerRelativePathTo _DllMonikerRelativePathTo
+ #define MonikerCommonPrefixWith _DllMonikerCommonPrefixWith
+ #define OleSetClipboard _DllOleSetClipboard
+ #define OleGetClipboard _DllOleGetClipboard
+ #define OleDuplicateData _DllOleDuplicateData
+ #define CreateILockBytesOnHGlobal _DllCreateILockBytesOnHGlobal
+ #define GetHGlobalFromILockBytes _DllGetHGlobalFromILockBytes
+ #define GetClassFile _DllGetClassFile
+ #define OleDraw _DllOleDraw
+ #define OleCreateDefaultHandler _DllOleCreateDefaultHandler
+ #define OleCreateEmbeddingHelper _DllOleCreateEmbeddingHelper
+ #define OleConvertIStorageToOLESTREAMEx _DllOleConvertIStorageToOLESTREAMEx
+ #define OleConvertOLESTREAMToIStorageEx _DllOleConvertOLESTREAMToIStorageEx
+ #define SetDocumentBitStg _DllSetDocumentBitStg
+ #define GetDocumentBitStg _DllGetDocumentBitStg
+ #define WriteOleStg _DllWriteOleStg
+ #define ReadOleStg _DllReadOleStg
+ #define OleCreateFromFile _DllOleCreateFromFile
+ #define OleCreateLinkToFile _DllOleCreateLinkToFile
+ #define CreateDataCache _DllCreateDataCache
+ #define OleConvertIStorageToOLESTREAM _DllOleConvertIStorageToOLESTREAM
+ #define OleConvertOLESTREAMToIStorage _DllOleConvertOLESTREAMToIStorage
+ #define ReadFmtUserTypeStg _DllReadFmtUserTypeStg
+ #define WriteFmtUserTypeStg _DllWriteFmtUserTypeStg
+ #define OleFlushClipboard _DllOleFlushClipboard
+ #define OleIsCurrentClipboard _DllOleIsCurrentClipboard
+ #define OleTranslateAccelerator _DllOleTranslateAccelerator
+ #define OleDoAutoConvert _DllOleDoAutoConvert
+ #define OleGetAutoConvert _DllOleGetAutoConvert
+ #define OleSetAutoConvert _DllOleSetAutoConvert
+ #define GetConvertStg _DllGetConvertStg
+ #define SetConvertStg _DllSetConvertStg
+ #define CreateStreamOnHGlobal _DllCreateStreamOnHGlobal
+ #define GetHGlobalFromStream _DllGetHGlobalFromStream
+ #define OleDuplicateMedium _DllOleDuplicateMedium
+ #define OleSetContainedObject _DllOleSetContainedObject
+ #define OleNoteObjectVisible _DllOleNoteObjectVisible
+ #define OleCreateStaticFromData _DllOleCreateStaticFromData
+ #define OleRegGetUserType _DllOleRegGetUserType
+ #define OleRegGetMiscStatus _DllOleRegGetMiscStatus
+ #define OleRegEnumFormatEtc _DllOleRegEnumFormatEtc
+ #define OleRegEnumVerbs _DllOleRegEnumVerbs
+ #define OleGetEnumFormatEtc _DllOleGetEnumFormatEtc
+ #define OleSetEnumFormatEtc _DllOleSetEnumFormatEtc
+ #define OleRemoveEnumFormatEtc _DllOleRemoveEnumFormatEtc
+ #define OleSendLLE _DllOleSendLLE
+ #define OleSetInPlaceWindow _DllOleSetInPlaceWindow
+ #define OleUnSetInPlaceWindow _DllOleUnSetInPlaceWindow
+ #define OleClipWindow _DllOleClipWindow
+ #define OleClipWindows _DllOleClipWindows
+ #define OleInsertMenus _DllOleInsertMenus
+ #define OleHashMenuID _DllOleHashMenuID
+ #define OleUnhashMenuID _DllOleUnhashMenuID
+ #define OlePatchGetMHandle _DllOlePatchGetMHandle
+ #define OleUnpatchGetMHandle _DllOleUnpatchGetMHandle
+ #define OleAddMBarMenu _DllOleAddMBarMenu
+ #define OleSetInPlaceRects _DllOleSetInPlaceRects
+ #define OleMaskMouse _DllOleMaskMouse
+ #define OleMoveWindow _DllOleMoveWindow
+ #define OleSizeParentWindow _DllOleSizeParentWindow
+ #define OleSizeObjectWindow _DllOleSizeObjectWindow
+ #define OleDragParentWindow _DllOleDragParentWindow
+ #define OleDragObjectWindow _DllOleDragObjectWindow
+ #define OleGrowParentWindow _DllOleGrowParentWindow
+ #define OleGrowObjectWindow _DllOleGrowObjectWindow
+ #define OleNewMBar _DllOleNewMBar
+ #define OleDisposeMBar _DllOleDisposeMBar
+ #define OleProcessDdeAE _DllOleProcessDdeAE
+ #define OleProcessClipboardAE _DllOleProcessClipboardAE
+ #define InitializeClipboard _DllInitializeClipboard
+ #define UnInitializeClipboard _DllUnInitializeClipboard
+ #define OleIsClipboardFormatAvailable _DllOleIsClipboardFormatAvailable
+ #define OleGetClipboardData _DllOleGetClipboardData
+ #define OleSetClipboardData _DllOleSetClipboardData
+ #define OleEnumClipboardFormats _DllOleEnumClipboardFormats
+ #define StoreClap _DllStoreClap
+ #define OleCountClipboardFormats _DllOleCountClipboardFormats
+ #define OleCloseClipboard _DllOleCloseClipboard
+ #define OleEmptyClipboard _DllOleEmptyClipboard
+ #define OleSetClipboardEx _DllOleSetClipboardEx
+ #define OleZoomParentWindow _DllOleZoomParentWindow
+ #define OleSetParentRgns _DllOleSetParentRgns
+ #define CreateFileMonikerFSp _DllCreateFileMonikerFSp
+ #define OleCreateFromFSp _DllOleCreateFromFSp
+ #define OleCreateLinkToFSp _DllOleCreateLinkToFSp
+ #define OleGetCursor _DllOleGetCursor
+ #define OleSetCursor _DllOleSetCursor
+ #define OleUpdateCursor _DllOleUpdateCursor
+ #define GetClassFSp _DllGetClassFSp
+ #define ReadOle1FmtProgIDStgMac _DllReadOle1FmtProgIDStgMac
+ #define WriteOle1FmtProgIDStgMac _DllWriteOle1FmtProgIDStgMac
+ #define OleGetIconOfFile _DllOleGetIconOfFile
+ #define OleGetIconOfClass _DllOleGetIconOfClass
+ #define OleGetIconOfFSp _DllOleGetIconOfFSp
+ #define OlePictFromIconAndLabel _DllOlePictFromIconAndLabel
+ #define OleGetIconFromIconSuite _DllOleGetIconFromIconSuite
+ #define OleUIPictIconFree _DllOleUIPictIconFree
+ #define OleUIPictIconDraw _DllOleUIPictIconDraw
+ #define OleUIPictExtractIcon _DllOleUIPictExtractIcon
+ #define OleUIPictExtractLabel _DllOleUIPictExtractLabel
+ #define OleUIPictExtractIconSource _DllOleUIPictExtractIconSource
+ #define OleMetaFileToPict _DllOleMetaFileToPict
+ #define OleQueryCreateAll _DllOleQueryCreateAll
+ #define OleWhichGrowHandle _DllOleWhichGrowHandle
+ #define MkGetMacNetInfo _DllMkGetMacNetInfo
+#endif //ID_OLE_STAT_DEF
+#if !ID_OLE_STAT_COMPOBJ
+ #define CoBuildVersion _DllCoBuildVersion
+ #define CoInitialize _DllCoInitialize
+ #define CoUninitialize _DllCoUninitialize
+ #define CoGetMalloc _DllCoGetMalloc
+ #define CoRegisterClassObject _DllCoRegisterClassObject
+ #define CoRevokeClassObject _DllCoRevokeClassObject
+ #define CoGetClassObject _DllCoGetClassObject
+ #define CoMarshalInterface _DllCoMarshalInterface
+ #define CoUnmarshalInterface _DllCoUnmarshalInterface
+ #define CoLoadLibrary _DllCoLoadLibrary
+ #define CoFreeLibrary _DllCoFreeLibrary
+ #define CoFreeAllLibraries _DllCoFreeAllLibraries
+ #define CoCreateInstance _DllCoCreateInstance
+ #define StringFromIID _DllStringFromIID
+ #define CoDisconnectObject _DllCoDisconnectObject
+ #define CoReleaseMarshalData _DllCoReleaseMarshalData
+ #define CoFreeUnusedLibraries _DllCoFreeUnusedLibraries
+ #define IsEqualGUID _DllIsEqualGUID
+ #define StringFromCLSID _DllStringFromCLSID
+ #define CLSIDFromString _DllCLSIDFromString
+ #define RESULTFROMSCODE _DllRESULTFROMSCODE
+ #define GETSCODE _DllGETSCODE
+ #define CoRegisterMessageFilter _DllCoRegisterMessageFilter
+ #define CoIsHandlerConnected _DllCoIsHandlerConnected
+ #define CoMarshalHresult _DllCoMarshalHresult
+ #define CoUnmarshalHresult _DllCoUnmarshalHresult
+ #define CoGetCurrentProcess _DllCoGetCurrentProcess
+ #define CoIsOle1Class _DllCoIsOle1Class
+ #define CLSIDFromProgID _DllCLSIDFromProgID
+ #define ProgIDFromCLSID _DllProgIDFromCLSID
+ #define CoLockObjectExternal _DllCoLockObjectExternal
+ #define CoGetTreatAsClass _DllCoGetTreatAsClass
+ #define CoTreatAsClass _DllCoTreatAsClass
+ #define CoGetStandardMarshal _DllCoGetStandardMarshal
+ #define PropagateResult _DllPropagateResult
+ #define IIDFromString _DllIIDFromString
+ #define CoCreateStandardMalloc _DllCoCreateStandardMalloc
+ #define CoCreateGuid _DllCoCreateGuid
+ #define StringFromGUID2 _DllStringFromGUID2
+ #define CoGetClassExt _DllCoGetClassExt
+ #define Ole1ClassFromCLSID2 _DllOle1ClassFromCLSID2
+ #define CLSIDFromOle1Class _DllCLSIDFromOle1Class
+ #define CoOpenClassKey _DllCoOpenClassKey
+ #define GUIDFromString _DllGUIDFromString
+ #define CoFileTimeNow _DllCoFileTimeNow
+ #define RemAllocOID _DllRemAllocOID
+ #define RemFreeOID _DllRemFreeOID
+ #define RemCreateRemoteHandler _DllRemCreateRemoteHandler
+ #define RemConnectToObject _DllRemConnectToObject
+ #define RemGetInfoForCid _DllRemGetInfoForCid
+ #define LrpcCall _DllLrpcCall
+ #define LrpcDispatch _DllLrpcDispatch
+ #define LrpcRegisterMonitor _DllLrpcRegisterMonitor
+ #define LrpcRevokeMonitor _DllLrpcRevokeMonitor
+ #define LrpcGetThreadWindow _DllLrpcGetThreadWindow
+ #define LookupEtask _DllLookupEtask
+ #define SetEtask _DllSetEtask
+ #define RemLookupSHUnk _DllRemLookupSHUnk
+ #define CoMemctxOf _DllCoMemctxOf
+ #define CoMemAlloc _DllCoMemAlloc
+ #define CoMemFree _DllCoMemFree
+ #define CoRunModalLoop _DllCoRunModalLoop
+ #define CoHandleIncomingCall _DllCoHandleIncomingCall
+ #define CoSetAckState _DllCoSetAckState
+ #define OleProcessLrpcAE _DllOleProcessLrpcAE
+ #define CoFileTimeToMacDateTime _DllCoFileTimeToMacDateTime
+ #define CoMacDateTimeToFileTime _DllCoMacDateTimeToFileTime
+ #define InternalCoInitialize _DllInternalCoInitialize
+ #define CoHandlePendingMessage _DllCoHandlePendingMessage
+#endif //ID_OLE_STAT_COMPOBJ
+#if !ID_OLE_STAT_PROXY
+ #define DllGetClassObject _DllDllGetClassObject
+#endif //ID_OLE_STAT_PROXY
+#if !ID_OLE_STAT_OLE2NLS
+ #define CompareStringA _DllCompareStringA
+ #define LCMapStringA _DllLCMapStringA
+ #define GetLocaleInfoA _DllGetLocaleInfoA
+ #define GetStringTypeA _DllGetStringTypeA
+ #define GetSystemDefaultLangID _DllGetSystemDefaultLangID
+ #define GetUserDefaultLangID _DllGetUserDefaultLangID
+ #define GetSystemDefaultLCID _DllGetSystemDefaultLCID
+ #define GetUserDefaultLCID _DllGetUserDefaultLCID
+#endif //ID_OLE_STAT_OLE2NLS
+#endif //ID_MUNGE_DLL_NAMES
diff --git a/private/oleauto/src/typelib/nammgr.cxx b/private/oleauto/src/typelib/nammgr.cxx
new file mode 100644
index 000000000..8c8b2825e
--- /dev/null
+++ b/private/oleauto/src/typelib/nammgr.cxx
@@ -0,0 +1,1521 @@
+/***
+*nammgr.cxx - Name manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The Name Manager handles the hashing and storing of names. Each
+* class has its own name manager. See \silver\doc\ic\nammgr.doc for
+* information on the name manager.
+*
+*Revision History:
+*
+* 22-Jan-91 petergo: Created.
+* [01] 25-Feb-91 petergo: Now uses heap/block manager for mem mgt.
+* [02] 13-Jun-91 petergo: Updated for new AFX-less protocols.
+* [03] 02-Dec-91 ilanc: Used IfErrRet in Write
+* [04] 12-Mar-92 ilanc: Added DebDeleteGlobalDefault()
+* [05] 15-May-92 w-peterh: added CaseChange parameters to HlnamOfStr()
+* [06] 15-Nov-92 RajivK: added isStrDef() for Edit & Continue stuff
+* [07] 19-Nov-92 RajivK: added CbOfHlnam() and CchOfHgnam();
+* [08] 31-Dec-92 RajivK: Support for code page conversion.
+* [09] 08-Jan-93 RajivK: Fixed some undone(s)
+* [10] 12-Feb-93 w-peterh: removed Undone in IsStrDef
+* [11] 12-Feb-93 rajivk: added GetLcid() and SetLcid() and StriCmp()
+*
+*Implementation Notes:
+*
+* The name table is stored in an expandable buffer, managed by deriving
+* from the BUF class. This buffer is structure in two parts: the first
+* part is the bucket table. The bucket table allows a mapping from the
+* hash value low bits to the offset first name in that bucket. The bucket
+* table occupies sizeof(sHLNAM)*NM_cBuckets bytes. Following the bucket
+* table the names are stored, one after another. Each name is stored in 2
+* parts. The first part NAM_INFO contains all the information related to a
+* name. The second part NAM_STR only contains the string/name.
+* These 2 are stored in different sheap. This is done purely for
+* capacity reasons.
+*
+* Starting with the name pointed to by the bucket table, all of the names
+* which fall into a given bucket are stored in a binary tree, ordered by
+* the full 16-bit hash value. Thus, searching for a given name involves
+*
+* 1) Hashing to get 16-bit hash value
+* 2) Go name at root of bucket (bucket is low bits of hash)
+* 3) Search for hash value in binary tree
+* 4) Compare each name with the same 16-bit hash value to find it.
+*
+*****************************************************************************/
+
+#define NAMMGR_VTABLE // export nam mgr vtable
+
+#include "silver.hxx"
+#include "typelib.hxx"
+#include <stddef.h>
+#include "xstring.h"
+#include <stdlib.h>
+#include <new.h>
+#include "cltypes.hxx"
+#include "stream.hxx"
+#include "blkmgr.hxx"
+
+
+#include "nammgr.hxx"
+#include "clutil.hxx"
+#include "tls.h"
+
+#pragma hdrstop(RTPCHNAME)
+
+#undef tolower
+#undef toupper // Don't use unsafe macro forms
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleNammgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleNammgrCxx
+#else
+static char szNammgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szNammgrCxx
+#endif
+#endif
+
+
+#define CHAR_SET_SIZE 256
+
+
+/***
+*PUBLIC NAMMGR::NAMMGR - constructor
+*Purpose:
+* This is private -- used by Create only.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+NAMMGR::NAMMGR()
+{
+ m_fInit = FALSE;
+ m_fSortKeys = FALSE;
+ m_fOLBKwordInit = FALSE;
+
+ m_pbmNamInfo = NULL;
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC NAMMGR::~NAMMGR - destructor
+*Purpose:
+* Destroys a name manager.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+NAMMGR::~NAMMGR()
+{
+
+ // Release the sheap containing the names and the overhead
+ BLK_MGR::FreeStandalone(m_pbmNamInfo);
+
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC NAMMGR::Init - initialize the name manager
+*Purpose:
+* Initializes the name manager.
+*
+* Note: we are careful in this routine that if an error occurs
+* when we try to allocate memory, we aren't in a bad state. In particular;
+* we don't link ourselves onto the list of name managers until our
+* construction is complete.
+*
+*Entry:
+* psheapmgr - pointer to SHEAP_MGR to place in.
+* pdtroot : pointer to DYN_TYPEROOT ( is a default parameter );
+*
+*Exit:
+* *pnammgr - pointer to new name manager.
+* Return TIPERROR indicating success/failure.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR NAMMGR::Init(SHEAP_MGR * psheapmgr, DYN_TYPEROOT *pdtroot)
+{
+ UINT cbBuckets; // number of bytes in bucket table.
+ UINT i;
+ TIPERROR err;
+ HCHUNK hchunk;
+
+ DebAssert(m_fInit == FALSE, "NAMMGR::Init: table already initialized");
+
+ // Initialize the block manager. Could return error: do first.
+ IfErrRet(m_bm.Init(psheapmgr));
+
+ // Create bucket table
+ cbBuckets = NM_cBuckets * sizeof(sHLNAM);
+ IfErrRet(m_bm.AllocChunk(&hchunk, cbBuckets));
+
+ m_hchunkBucketTbl = hchunk;
+
+ // Initialize bucket table to all empty.
+ for (i = 0; i < NM_cBuckets; ++i)
+ SetBucketOfHash(i, HLNAM_Nil);
+
+
+ // Create the sheap that will contain name overhead (NAM_INFO)
+ IfErrGo(BLK_MGR::CreateStandalone(&m_pbmNamInfo, FALSE));
+
+
+ m_fInit = TRUE;
+ return TIPERR_None;
+
+
+Error:
+ // Free the table we allocate earlier
+ m_bm.FreeChunk(m_hchunkBucketTbl, cbBuckets);
+ return err;
+
+}
+#pragma code_seg()
+
+/***
+*SetGtlibole()
+*Purpose:
+* set the pointer to the project that owns this nammgr.
+*
+*Entry:
+*
+*Exit:
+*
+******************************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR NAMMGR::SetGtlibole(GenericTypeLibOLE *pgtlibole)
+{
+
+ m_pgtlibole = pgtlibole;
+ return TIPERR_None;
+
+}
+#pragma code_seg()
+
+
+
+/***
+*GetBucketOfHash() - get the number stored in the bucket
+*Purpose:
+* Given a hash value, gets the value in the bucket corresponding
+* to that hash value.
+*
+* Before calling this function make sure there are no police
+* or customs agents around.
+*
+*Entry:
+* uHash - hash value
+*
+*Exit:
+* Returns the hlnam stored in that bucket.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HLNAM NAMMGR::GetBucketOfHash(UINT uHash) const
+{
+ return RqhlnamBucketTbl()[uHash % NM_cBuckets];
+}
+#pragma code_seg( )
+
+
+/***
+*SetBucketOfHash - set the number stored in the bucket
+*Purpose:
+* Given a hash value, sets the value in the bucket corresponding
+* to that hash value.
+*
+*Entry:
+* uHash - hash value
+* hlnam - value to set
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+void NAMMGR::SetBucketOfHash(UINT uHash, HLNAM hlnam)
+{
+ DebCheckHlnam(hlnam);
+
+ RqhlnamBucketTbl()[uHash % NM_cBuckets] = hlnam;
+}
+#pragma code_seg()
+
+/***
+*NAMMGR::Read - read presistant representation.
+*Purpose:
+* Reads in the persistant representation of the name table from
+* a stream. The global name handles are all removed, since they
+* do not persist.
+*
+*Entry:
+* psstrm - stream to read from.
+*
+*Exit:
+* Returns TIPERROR.
+* If an error occurs, you can only call Read again or destroy it.
+*
+***********************************************************************/
+
+TIPERROR NAMMGR::Read(STREAM * psstrm)
+{
+ TIPERROR err;
+
+ if ((err = m_bm.Read(psstrm)) ||
+ (err = psstrm->ReadUShort(&m_hchunkBucketTbl)) ||
+ // In ole we have only one sheap to store both the structures.
+ // In OB we have different sheaps to allocate NAM_INFO and NAM_STR structs
+ (err = m_pbmNamInfo->Read(psstrm)))
+ {
+ return err;
+ }
+
+#if HP_BIGENDIAN
+ // Swap bytes on Big-Endian machine.
+ SwapBytesBack();
+#else // !HP_BIGENDIAN
+#endif // !HP_BIGENDIAN
+
+
+ DebCheckState(1); // arg=1 forces blkmgrs to be checked.
+ return TIPERR_None;
+}
+
+
+#if HP_BIGENDIAN
+
+/***
+*NAMMGR::SwapHlnamBytes - swap bytes in an hlnam
+*Purpose:
+* Swaps the bytes in the structure corresponding to an HLNAM.
+*
+*Entry:
+* hlnam - hlnam
+*
+*Exit:
+* None.
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+void NAMMGR::SwapHlnamBytes(HLNAM hlnam)
+{
+ NAM_INFO * qnam;
+
+ qnam = QnamOfHlnam(hlnam);
+ DebAssert(IsTextName(qnam), "Bad name");
+ SwapStruct(qnam, NM_NamInfoLayout);
+}
+#pragma code_seg( )
+
+/***
+*NAMMGR::SwapBytes - swaps bytes for Mac serialization
+*Purpose:
+* This function swaps bytes in place for serialization and deserialization
+* on different platforms. Swaps from valid ordering for this platform,
+* to reverse ordering.
+*
+*Entry:
+* None.
+*Exit:
+* None.
+***********************************************************************/
+
+void NAMMGR::SwapBytes()
+{
+ sHLNAM * rqhlnam;
+
+ // Swap bytes in the name chunks
+ ForEachName(SwapHlnamBytes, TRUE);
+
+ // Swap bytes in the bucket table.
+ rqhlnam = RqhlnamBucketTbl();
+ SwapShortArray(rqhlnam, NM_cBuckets);
+}
+
+/***
+*NAMMGR::SwapBytesBack - swaps bytes for Mac serialization
+*Purpose:
+* This function swaps bytes in place for serialization and deserialization
+* on different platforms. Swaps from invalid ordering for this platform,
+* to valid ordering.
+*
+*Entry:
+*
+*Exit:
+* None.
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+void NAMMGR::SwapBytesBack()
+{
+ sHLNAM * rqhlnam;
+
+ // Swap bytes in the bucket table.
+ rqhlnam = RqhlnamBucketTbl();
+ SwapShortArray(rqhlnam, NM_cBuckets);
+
+ // Swap bytes in the name chunks
+ ForEachName(SwapHlnamBytes, FALSE);
+}
+#pragma code_seg( )
+
+#endif //HP_BIGENDIAN
+
+/***
+*Write - write persistant representation.
+*Purpose:
+* Writes the persistant representation of the name table from
+* a stream.
+*
+*Entry:
+* psstrm - stream to read from.
+*
+*Exit:
+* Returns TIPERROR.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR NAMMGR::Write(STREAM * psstrm)
+{
+ TIPERROR err;
+
+ DebCheckState(1); // arg=1 forces blkmgrs to be checked.
+
+ // For Big Endian: Must byte swap to write, then swap back.
+#if HP_BIGENDIAN
+ SwapBytes();
+#endif //HP_BIGENDIAN
+
+ IfErrGo(m_bm.Write(psstrm));
+ IfErrGo(psstrm->WriteUShort(m_hchunkBucketTbl));
+ IfErrGo(m_pbmNamInfo->Write(psstrm));
+
+
+Error:
+#if HP_BIGENDIAN
+ SwapBytesBack();
+#endif //HP_BIGENDIAN
+
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*ForEachName - call function for each name in the nam mgr
+*Purpose:
+* This function calls its argument (a pointer to a member of NAMMGR)
+* and passes it an HLNAM for every name in the name table. This
+* is used for rebinding localized names, serialization, and
+* other fun stuff.
+*
+*Entry:
+* pfn - pointer to member function of NAMMGR to call
+* fBefore - TRUE if child handles should be fetched before swapping,
+* FALSE if after.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#if HP_BIGENDIAN
+#pragma code_seg( CS_CORE2 )
+void NAMMGR::ForEachName(void (NAMMGR::*pfn)(HLNAM), BOOL fBefore)
+{
+ UINT i;
+ HLNAM hlnam;
+
+ for (i = 0; i < NM_cBuckets; ++i) {
+ hlnam = GetBucketOfHash(i);
+ if (hlnam != HLNAM_Nil)
+ ForEachDescendant(hlnam, pfn, fBefore);
+ }
+}
+#pragma code_seg( )
+#endif //HP_BIGENDIAN
+
+/***
+*ForEachDescendant - call function for name and its descendants
+*Purpose:
+* This function calls its argument (a pointer to a member of NAMMGR)
+* and passes it an HLNAM for the HLNAM passed and all its descendants in
+* the binary tree.
+*
+*Entry:
+* hlnam - name at root of names to process.
+* pfn - pointer to member function of NAMMGR to call
+* fBefore - TRUE if child handles should be fetched before swapping,
+* FALSE if after. (Needed for byte swapping support.)
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+void NAMMGR::ForEachDescendant(HLNAM hlnamRoot, void (NAMMGR::*pfn)(HLNAM),
+ BOOL fBefore)
+{
+ NAM_INFO * qnam;
+ HLNAM hlnamLeft, hlnamRight;
+
+ DebCheckHlnam(hlnamRoot);
+ DebAssert(hlnamRoot != HLNAM_Nil, "ForEachDescendant: HLNAM_Nil passed");
+
+ if (fBefore) {
+ qnam = QnamOfHlnam(hlnamRoot);
+ hlnamLeft = qnam->m_hlnamLeft;
+ hlnamRight = qnam->m_hlnamRight;
+ }
+
+ (this->*pfn)(hlnamRoot); // call function on this one.
+
+ if (!fBefore) {
+ qnam = QnamOfHlnam(hlnamRoot);
+ hlnamLeft = qnam->m_hlnamLeft;
+ hlnamRight = qnam->m_hlnamRight;
+ }
+
+ if (QnamOfHlnam(hlnamRoot)->m_hlnamLeft != HLNAM_Nil)
+ ForEachDescendant(hlnamLeft, pfn, fBefore);
+ if (QnamOfHlnam(hlnamRoot)->m_hlnamRight != HLNAM_Nil)
+ ForEachDescendant(hlnamRight, pfn, fBefore);
+}
+#pragma code_seg( )
+
+
+/***
+*NAMMGR::AddEntry - link a new table entry into the correct tree
+*Purpose:
+* Takes a new table entry that has just been created, but not
+* linked into the table bucket and binary tree, and puts it in
+* the correct place. The entry must be new and not a duplicate; this
+* isn't checked by this routine.
+*
+*Entry:
+* hlnam - offset of new entry to add.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+void NAMMGR::AddEntry(HLNAM hlnamNew)
+{
+ HLNAM hlnam; // current position in tree.
+ HLNAM hlnamChild; // child of current position.
+ UINT uHashNew; // hash value of the hlnamNew
+ UINT uHash; // hash value of hlnam.
+
+ DebCheckHlnam(hlnamNew);
+ DebAssert(hlnamNew != HLNAM_Nil, "AddEntry: nil hlnam");
+
+ uHashNew = WHashValOfLHashVal(HashOfHlnam(hlnamNew));
+
+ // Check the bucket to see if any names in this bucket
+ hlnam = GetBucketOfHash(uHashNew);
+ if (hlnam == HLNAM_Nil) {
+ // No entries in this bucket. Make this the root of the bucket.
+ SetBucketOfHash(uHashNew, hlnamNew);
+ }
+ else {
+ // Traverse the tree until we hit one without a child, and put
+ // the new entry as that child.
+ for (;;) {
+ DebCheckHlnam(hlnam);
+ uHash = WHashValOfLHashVal(HashOfHlnam(hlnam));
+
+ if (uHashNew < uHash) {
+ hlnamChild = QnamOfHlnam(hlnam)->m_hlnamLeft;
+ if (hlnamChild == HLNAM_Nil) {
+ // hit the end of the tree -- put new entry here.
+ QnamOfHlnam(hlnam)->m_hlnamLeft = hlnamNew;
+ return;
+ }
+ }
+ else {
+ hlnamChild = QnamOfHlnam(hlnam)->m_hlnamRight;
+ if (hlnamChild == HLNAM_Nil) {
+ // hit the end of the tree -- put new entry here.
+ QnamOfHlnam(hlnam)->m_hlnamRight = hlnamNew;
+ return;
+ }
+ }
+
+ hlnam = hlnamChild;
+ }
+ }
+}
+#pragma code_seg( )
+
+
+#if 0 //Dead Code
+/***
+*NAMMGR::CleanNames
+*Purpose:
+* Clear the name manager optimizations from the name
+* manager entries.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+void NAMMGR::CleanNames()
+{
+ // Clear the optimizations for all entries
+ ForEachName(CleanHlnam, TRUE);
+}
+
+
+/***
+*NAMMGR::CleanHlnam
+*Purpose:
+* Clear the optimization in this name manager entry.
+*
+*Entry:
+* hlnam - the name to clean
+*
+*Exit:
+*
+***********************************************************************/
+void NAMMGR::CleanHlnam(HLNAM hlnam)
+{
+ NAM_INFO *qnam;
+
+ qnam = (NAM_INFO *)QnamOfHlnam(hlnam);
+ DebAssert(IsTextName(qnam), "Bad name");
+
+ // Clear the optimizations
+
+ // initialize other bits to 0
+ qnam->m_fGlobal = 0;
+ qnam->m_fMultiple = 0;
+ qnam->m_fAmbiguous = 0;
+ qnam->m_fNonParam = 0;
+
+ // Make sure that the ityp is invalid
+ qnam->m_ityp = NM_InvalidItyp;
+}
+#endif //0
+
+/***
+*NAMMGR::FindHash - find a hash value in this table.
+*Purpose:
+* Tries to find a given hash value in the binary tree starting
+* at hlnam.
+*
+*Entry:
+* uHashFind - the hash value to find
+* hlnam - starting hlnam to look at. Can be HLNAM_Nil, in which
+* case HLNAM_Nil is immediately returned again.
+*
+*Exit:
+* Returns the HLNAM of the first entry with this hash value found,
+* or HLNAM_Nil if it isn't in this table.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HLNAM NAMMGR::FindHash(UINT uHashFind, HLNAM hlnam) const
+{
+ UINT uHash; // hash value of hlnam
+
+ // Traverse the binary tree until we find the hash value.
+ for (;;) {
+ DebCheckHlnam(hlnam);
+
+ if (hlnam == HLNAM_Nil)
+ return HLNAM_Nil; // Didn't find the name.
+
+ uHash = WHashValOfLHashVal(((NAMMGR *)this)->HashOfHlnam(hlnam));
+
+ if (uHashFind == uHash)
+ return hlnam;
+ else if (uHashFind < uHash)
+ hlnam = QnamOfHlnam(hlnam)->m_hlnamLeft;
+ else
+ hlnam = QnamOfHlnam(hlnam)->m_hlnamRight;
+ }
+}
+#pragma code_seg( )
+
+
+/***
+*NAMMGR::FindTextNam - Find a text name in the hash table.
+*Purpose:
+* Tries to find a given text name in the name table. Only unlocalized
+* text names are searched.
+*
+*Entry:
+* xsz - string to find
+* uHash - hash value of string -- a parameter to avoid recomputation.
+* fChangeCase - if TRUE then an existing string of differing case
+* will be overwritten with the new case only if the name
+* stored is not imported from a referenced typelib.
+*
+*Exit:
+* Returns the HLNAM of the string if it's in the table, or HLNAM_Nil
+* if it isn't in the table.
+* *pfCaseChanged - whetheror not the case of the string has been changed
+* if pfCaseChanged is NULL then it is ignored
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HLNAM NAMMGR::FindTextNam(XSZ_CONST xsz, UINT uHash,
+ BOOL fChangeCase, BOOL *pfCaseChanged,
+ BOOL fPreserveCase)
+{
+ HLNAM hlnam;
+ NAM_INFO * qnam;
+ NAM_STR *qnamstr;
+
+ DebAssert(uHash == WHashValOfLHashVal(LHashValOfNameSysA(Pgtlibole()->GetSyskind(),
+ Pgtlibole()->GetLcid(),
+ (LPSTR) xsz)),
+ "FindTextNam: incorrect uHash parameter");
+
+ if (pfCaseChanged) {
+ *pfCaseChanged = FALSE; // assume we're not changing case
+ }
+ // Search the binary tree at the bucket for the given hash value, until
+ // we have checked all nodes with that hash value and none are the
+ // actual string.
+
+ hlnam = GetBucketOfHash(uHash);
+
+ while ((hlnam = FindHash(uHash, hlnam)) != HLNAM_Nil) {
+ // Found a node with the given hash value. Check to see if
+ // string is there.
+ qnam = QnamOfHlnam(hlnam);
+
+ qnamstr = QnamstrOfHlnam(hlnam);
+
+ if ( IsTextName(qnam) &&
+ (StriEq(xsz, (((NAM_STR *) qnamstr)->m_xsz)) == 0)) {
+ // Found the string, so we're done. However, if the case
+ // spelling is different, we need to store the new version;
+ // the lengths better be the same to change in place.
+ // Also note that we won't change the case if the "sticky bit"
+ // (m_fPreserveCase) is set, unless we want to override the name
+ // with another m_fPreserveCase name, in which case fPreserveCase
+ // will be TRUE.
+ //
+
+ qnam->m_fPreserveCase = fPreserveCase || qnam->m_fPreserveCase;
+
+ // If we have 2 DBCS strings of different length, don't overwrite the string.
+ if (xstrblen(qnamstr->m_xsz) != xstrblen(xsz))
+ return hlnam;
+
+
+ if (fChangeCase && xstrcmp(xsz, (((NAM_STR *) qnamstr)->m_xsz)) &&
+ ((!((NAM_INFO *)qnam)->m_fPreserveCase) || fPreserveCase)) {
+
+ xstrcpy((((NAM_STR *) qnamstr)->m_xsz), xsz);
+
+ if (pfCaseChanged) {
+ *pfCaseChanged = TRUE;
+ }
+ } // changed case
+
+ return hlnam;
+ }
+
+ // didn't find the string at this node, continue on to the
+ // right child (by convention, equal hash values sort to the
+ // right) and keep looking.
+ hlnam = qnam->m_hlnamRight;
+ }
+ return HLNAM_Nil;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC NAMMGR::HlnamOfStrIfExist - get hlnam of string
+*Purpose:
+* Looks up the string in the name table.
+*
+*Entry:
+* xsz - string to look up
+*
+*Exit:
+* *phlnam - name handle
+* Return TIPERROR.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HLNAM NAMMGR::HlnamOfStrIfExist(XSZ_CONST xsz)
+{
+ UINT uHash;
+
+ DebCheckState(0);
+
+ // Hash the string.
+ uHash = (UINT)WHashValOfLHashVal(LHashValOfNameSysA(Pgtlibole()->GetSyskind(),
+ Pgtlibole()->GetLcid(),
+ (LPSTR) xsz));
+
+ // Search the binary tree for the name.
+ return FindTextNam(xsz, uHash, FALSE, NULL, FALSE);
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC NAMMGR::HlnamOfStr - get hlnam of string, adding if necessary
+*Purpose:
+* Looks up the string in the name table, adding it if its
+* not there.
+*
+*Entry:
+* xsz - string to look up
+* fChangeCase - change the case of the xsz in the name table if it
+* already exists
+* bFlagsInitial - used to initialize qnam->m_bFlags
+*
+*Exit:
+* *phlnam - name handle
+* *pfCaseChanged - whether the case ogf the xsz for this name changed
+* if NULL then ignore
+* Return TIPERROR.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+
+#if OE_WIN32
+TIPERROR NAMMGR::HlnamOfStrW(const OLECHAR FAR* lpstrW, HLNAM * phlnam,
+ BOOL fChangeCase, BOOL *pfCaseChanged,
+ BOOL fPreserveCase, BOOL fAppToken)
+{
+ HRESULT hresult;
+ TIPERROR err;
+ LPSTR lpstrA;
+
+ if ((hresult = ConvertStringToA(lpstrW, &lpstrA)) != NOERROR) {
+ return TiperrOfHresult(hresult);
+ }
+ err = HlnamOfStr(lpstrA, phlnam, fChangeCase, pfCaseChanged, fPreserveCase, fAppToken);
+ ConvertStringFree(lpstrA);
+ return err;
+}
+#endif //OE_WIN32
+
+
+TIPERROR NAMMGR::HlnamOfStr(XSZ_CONST xsz, HLNAM * phlnam,
+ BOOL fChangeCase, BOOL *pfCaseChanged,
+ BOOL fPreserveCase, BOOL fAppToken)
+{
+ UINT uHash;
+ HLNAM hlnam;
+ HNAMSTR hnamstr;
+ UINT cbStr;
+ NAM_INFO * qnam;
+ NAM_STR * qnamstr;
+ TIPERROR err = TIPERR_None;
+ #define szCopy xsz // for OLE, we don't change the case,
+ // so we don't need to make a copy
+ BOOL fCaseChanged = FALSE;
+
+ DebCheckState(0);
+
+ // Hash the string.
+ uHash = (UINT)WHashValOfLHashVal(LHashValOfNameSysA(Pgtlibole()->GetSyskind(),
+ Pgtlibole()->GetLcid(),
+ (LPSTR) xsz));
+
+ // Search the binary tree for the name.
+ hlnam = FindTextNam(xsz, uHash, fChangeCase,
+ pfCaseChanged, fPreserveCase);
+
+ if (hlnam == HLNAM_Nil) {
+ // Not in the table: we must create a new table entry,
+ // and place it in the table.
+
+ // Unless we're creating this type library, we should NEVER end
+ // up adding a name to the typelib's name table. Typelib's that
+ // we're in the process of creating should have the modified bit set,
+ // and those that we're reading won't have the bit set.
+ DebAssert(m_pgtlibole->IsModified(), "Name allocated by lookup");
+
+
+ // cb has the number of bytes in this string.
+ cbStr = xstrblen0(szCopy);
+
+ // In Typelib we allocate the space for both the structures in the same
+ // segment. We allocate 1 chunk for both the logical structures.
+ // Note that phsyically they are in the same structure (NAM_INFO).
+
+ // Allocate new chunk for the name overhead.
+ IfErrGo(m_pbmNamInfo->AllocChunk(&hlnam, sizeof(NAM_INFO) + cbStr));
+
+ // hnammstr in typelib is same as hlnam
+ hnamstr = hlnam;
+
+
+
+ // Fill in the string entry.
+ qnam = (NAM_INFO *) QnamOfHlnam(hlnam);
+ qnam->m_uHash = uHash;
+ qnam->m_hlnamLeft = HLNAM_Nil;
+ qnam->m_hlnamRight = HLNAM_Nil;
+
+ // Get the pointer to the NAM_STR. We need to copy the string there.
+ qnamstr = QnamstrOfHlnam(hlnam);
+
+ xstrcpy(qnamstr->m_xsz, szCopy);
+
+ qnam->m_fAppToken = fAppToken;
+
+ // if the name was found in the typelib then set the Imported name bit
+ // to denote that this name is imported and hence should not change.
+ // Also if the fPreserveCase flag is set then we set the ImpNam bit
+ // so that we will preserve the case of this name. Note that the
+ // fCaseChanged flag is not the same as *pfCaseChanged which is an
+ // argument to this function.
+ //
+ qnam->m_fPreserveCase = (fCaseChanged || fPreserveCase);
+
+ // VBA2: need a constructor for NAM_INFO/NAM_STR.
+ // initialize other bits to 0
+ qnam->m_fGlobal = 0;
+ qnam->m_fMultiple = 0;
+ qnam->m_fAmbiguous = 0;
+ qnam->m_fNonParam = 0;
+
+ // Make sure that the ityp is invalid
+ qnam->m_ityp = NM_InvalidItyp;
+
+ // And add the string entry into the table.
+ AddEntry(hlnam); // (may invalidate qnam)
+
+ // return CaseChanged flag if asked for
+ if (pfCaseChanged)
+ *pfCaseChanged = fCaseChanged;
+
+
+Error:
+ ;
+
+ } // if hlnam == HLNAM_Nil
+
+ // Done.
+ *phlnam = hlnam;
+
+ return err;
+}
+#pragma code_seg( )
+
+
+
+
+
+/***
+*NAMMGR::StrOfHlnam - get a string from the name table
+*Purpose:
+* Returns the string associated with a given name.
+* The hlnam must be valid (won't return error for invalid hlnam)
+*
+*Entry:
+* hlnam - name to get
+* xsz - buffer to store name
+* cchMax - max chars to store (include terminator)
+*
+*Exit:
+* String stored into xsz.
+* Returns TIPERR_BufferToSmall if buffer was too small.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CORE2)
+TIPERROR NAMMGR::StrOfHlnam(HLNAM hlnam, XSZ xsz, UINT cbMax) const
+{
+ NAM_STR *qnamstr;
+ UINT cbStr;
+
+ DebCheckState(0);
+ DebCheckHlnam(hlnam);
+
+
+ qnamstr = (NAM_STR *) QnamstrOfHlnam(hlnam);
+
+ cbStr = xstrblen0(qnamstr->m_xsz);
+ if (cbMax < cbStr)
+ return TIPERR_BufferTooSmall;
+
+ xstrcpy(xsz, qnamstr->m_xsz);
+
+ return TIPERR_None;
+}
+
+
+#if 0 //Dead Code: OE_WIN32
+TIPERROR NAMMGR::StrOfHlnamW(HLNAM hlnam, LPOLESTR xsz, UINT cchMax) const
+{
+ NAM_STR *qnamstr;
+ UINT cbStr;
+ int cchUnicode;
+
+ DebCheckState(0);
+ DebCheckHlnam(hlnam);
+
+
+ qnamstr = (NAM_STR *) QnamstrOfHlnam(hlnam);
+
+ cbStr = xstrblen0(qnamstr->m_xsz);
+
+ cchUnicode = MultiByteToWideChar(CP_ACP, 0, qnamstr->m_xsz, cbStr, xsz, cchMax);
+
+ if (cchUnicode == 0) // MBTWC failed
+ return TIPERR_BufferTooSmall; //CONSIDER: is this the right error for all cases?
+
+ return TIPERR_None;
+}
+#endif //OE_WIN32
+
+#pragma code_seg()
+
+
+/***
+*NAMMGR::GetHgnamOfStrLhash
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+* phgnam :
+* TIPERROR : Error
+*
+***********************************************************************/
+TIPERROR NAMMGR::GetHgnamOfStrLhash(LPSTR szNameBuf,
+ ULONG lHashVal,
+ HGNAM *phgnam)
+{
+ ULONG lHashValSample;
+ HLNAM hlnam;
+ TIPERROR err = TIPERR_None;
+
+ lHashValSample = m_pgtlibole->GetSampleHashVal();
+ if (!IsHashValCompatible(lHashValSample, lHashVal)) {
+ // need to recalc hashval
+ lHashVal = LHashValOfNameSysA(Pgtlibole()->GetSyskind(),
+ Pgtlibole()->GetLcid(),
+ szNameBuf);
+ }
+ hlnam = FindTextNam(szNameBuf,
+ WHashValOfLHashVal(lHashVal),
+ FALSE,
+ NULL,
+ FALSE);
+
+ if (hlnam != HLNAM_Nil) {
+ IfErrRet(HgnamOfHlnam(hlnam, phgnam));
+ }
+ else {
+ *phgnam = HGNAM_Nil;
+ }
+ return err;
+}
+
+
+/***
+*NAMMGR::IsName - is this name defined in this nammgr.
+*Purpose:
+* Tests whether name is defined in library. Returns true if the passed
+* is name matches the name of any type, member name, or parameter name.
+* If a matching name is found then the szNameBuf is modified to so that
+* characters are cased according to how they appear in the library.
+*
+*Entry:
+* szNameBuf : String that needs to be searched.
+* wHashVal : Hashvalue of the string that needs to be searched.
+*
+*Exit:
+* pfName : True is the name was found in the Lib. else false.
+* TIPERROR : Error
+*
+***********************************************************************/
+TIPERROR NAMMGR::IsName(LPSTR szNameBuf, ULONG lHashVal, BOOL FAR *pfName)
+{
+ HLNAM hlnam;
+ USHORT wHashVal;
+ NAM_INFO *qnam;
+ NAM_STR *qnamstr;
+ TIPERROR err = TIPERR_None;
+
+ *(UNALIGNED BOOL FAR *)pfName = FALSE;
+
+ DebAssert(IsHashValCompatible(lHashVal, m_pgtlibole->GetSampleHashVal()),
+ " Hash value is not compatible ");
+
+
+ // The "0" param means don't look for application tokens.
+ // (These have NM_fAppToken set.)
+ //
+ wHashVal = WHashValOfLHashVal(lHashVal);
+
+ hlnam = FindTextNam(szNameBuf, wHashVal, FALSE, NULL, FALSE);
+
+ // if string was found then copy the string in szNameBuf
+ if (hlnam != HLNAM_Nil) {
+ qnam = QnamOfHlnam(hlnam);
+ qnamstr = QnamstrOfHlnam(hlnam);
+
+
+ // If this name is only a paramter, then pretend we didn't find it.
+ if (qnam->m_fNonParam) {
+ *(UNALIGNED BOOL FAR *)pfName = TRUE;
+
+ // DBCS strings can be of different lengths and still match.
+ // (as crazy as it sounds)
+ // If this is true, don't modify szNameBuf.
+ if(xstrblen(szNameBuf) != xstrblen(qnamstr->m_xsz))
+ return TIPERR_None;
+
+ xstrcpy(szNameBuf, qnamstr->m_xsz);
+ }
+ }
+
+ return TIPERR_None;
+}
+
+
+/***
+*NAMMGR::BstrOfHlnam - get a bstr from the name table
+*Purpose:
+* Returns a BSTR copy of the string associated with a given name.
+* The hlnam must be valid (won't return error for invalid hlnam)
+*
+*Entry:
+* hlnam - name to get
+* cchMax - max chars to store (include terminator)
+*
+*Exit:
+* Returns TIPERR_None and sets *pbstr to a copy of the string if
+* successful. Otherwise, returns TIPERR_OutOfMemory.
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR NAMMGR::BstrOfHlnam(HLNAM hlnam, BSTRA *pbstr) const
+{
+ BSTRA bstr;
+
+ DebCheckState(0);
+ DebCheckHlnam(hlnam);
+
+ bstr = AllocBstrA(((NAM_STR *)QnamstrOfHlnam(hlnam))->m_xsz);
+ if (bstr == NULL)
+ return TIPERR_OutOfMemory;
+
+ *pbstr = bstr;
+ return TIPERR_None;
+}
+
+#if OE_WIN32
+TIPERROR NAMMGR::BstrWOfHlnam(HLNAM hlnam, BSTR *pbstr) const
+{
+ BSTR bstr;
+ int cchUnicode;
+ char *sz;
+ int cbAnsi;
+
+ DebCheckState(0);
+ DebCheckHlnam(hlnam);
+
+ sz = ((NAM_STR *)QnamstrOfHlnam(hlnam))->m_xsz;
+ cbAnsi = xstrblen(sz);
+
+ cchUnicode = MultiByteToWideChar(CP_ACP, 0, sz, cbAnsi, NULL, 0);
+ if (cchUnicode == 0 && cbAnsi != 0)
+ return TIPERR_OutOfMemory;
+
+ bstr = AllocBstrLen(NULL, cchUnicode);
+ if (bstr == NULL)
+ return TIPERR_OutOfMemory;
+
+ cchUnicode = MultiByteToWideChar(CP_ACP, 0, sz, cbAnsi, bstr, cchUnicode);
+ DebAssert(cchUnicode || cbAnsi == 0, "translation failed");
+
+ *pbstr = bstr;
+ return TIPERR_None;
+}
+#endif //OE_WIN32
+
+#pragma code_seg( )
+
+
+#if 0 //Dead Code
+/***
+*NAMMGR::CbOfHlnam - Returns size (# of bytes) of string(nam).
+*Purpose:
+* Returns the size of the string associated with a given name.
+* The hlnam must be valid (won't return error for invalid hlnam)
+*
+*Entry:
+* hlnam - name whose size is to be returned
+*
+*Exit:
+* Returns size of the string
+*
+***********************************************************************/
+#pragma code_seg(CS_CORE2)
+UINT NAMMGR::CbOfHlnam(HLNAM hlnam) const
+{
+ return (UINT) (xstrblen0((QnamstrOfHlnam(hlnam))->m_xsz));
+}
+#pragma code_seg()
+#endif //0
+
+
+
+
+
+/***
+*PUBLIC NAMMGR::HgnamOfHlnam - get hgnam from an hlnam
+*Purpose:
+* Gets a global per-process name handle from a local name handle
+* to use for comparing name entries across class boundaries.
+*
+*Entry:
+* hlnam - hlnam to get hgnam of
+*
+*Exit:
+* *phgnam the hgnam corresponding to this local name. It can be
+* relied upon that hgnam & 0xFFFF == HashOfHlnam(hlnam).
+*
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+TIPERROR NAMMGR::HgnamOfHlnam(HLNAM hlnam, HGNAM * phgnam)
+{
+ NAM_INFO * qnam;
+ UINT uHash; // hash value being searched for.
+
+ DebCheckState(0);
+
+ // Make sure we're dealing with an unlocalized name.
+ qnam = QnamOfHlnam(hlnam);
+
+ uHash = WHashValOfLHashVal(HashOfHlnam(hlnam));
+
+ *phgnam = ((HGNAM) ((USHORT)hlnam) << 16) + uHash;
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+/***
+*PUBLIC NAMMGR::LpstrOfHgnam - get pointer to the text associated with an HGNAM.
+*Purpose:
+* Returns the string associated with an HGNAM.
+*
+*Implementaion Notes:
+* Returns a pointer directly into the name table.
+* DANGEROUS -- Callers must guarantee that heap movement won't occur
+* before this pointer is used.
+*
+*Entry:
+* hgnam - hgnam to look up. Must be a hgnam earlier returned.
+*
+*Exit:
+* returns the pointer to the string data (WARNING -- SHORT TERM!)
+*
+***********************************************************************/
+LPSTR NAMMGR::LpstrOfHgnam(HGNAM hgnam) const
+{
+
+ return (LPSTR) QnamstrOfHlnam(HlnamOfHgnam(hgnam))->m_xsz;
+}
+
+
+
+
+
+
+
+/***
+*PUBLIC HgnamOfStr - make HGNAM from a string.
+*Purpose:
+* This function makes a HGNAM directly from a string. It is provided
+* for class providers which don't use a local name table. It works
+* by using the static name table NAMMGR::m_nmGlobalDefault to store
+* the name.
+*
+*Note:
+* This function is a friend of NAMMGR.
+*
+*Entry:
+* xsz - string to convert to HGNAM
+*
+*Exit:
+* *phgnam - the name of the string.
+* Returns SCODE;
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR NAMMGR::HgnamOfStr(LPSTR szName, HGNAM FAR * phgnam)
+{
+ TIPERROR err;
+ HLNAM hlnam;
+
+ // Add as hlnam, convert to hgnam.
+ if ((err = HlnamOfStr(szName, &hlnam, FALSE, NULL)) ||
+ (err = HgnamOfHlnam(hlnam, phgnam))) {
+ return err;
+ }
+
+ return TIPERR_None;
+}
+#pragma code_seg( )
+
+
+
+
+
+
+
+/***
+*PUBLIC StrCmp(LPSTR szStr1, LPSTR szStr2)
+*Purpose: Compares two character strings of the same locale according to the
+* LCID stored .
+*Note : locale-specific string equality (only)
+* case-insensitive, according to codepage/locale specified.
+*
+*
+*Entry
+* szStr1, szStr2 strings that needs to be compared.
+*
+*Exit:
+* returns 0 if equal,
+*
+* Note:- This routine needs to be really fast.
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+INT NAMMGR::StriEq(XSZ_CONST szStr1, XSZ_CONST szStr2)
+{
+ if(!m_pgtlibole->IsProjectDBCS()) {
+
+ UINT uCount;
+
+ // Make sure the sort keys have been generated
+ if (!m_fSortKeys) {
+ TIPERROR err;
+
+ // This should never fail.
+ err = GenerateSortKey();
+ DebAssert(err == TIPERR_None, "Bad error.");
+ }
+
+ // compare strings based on the the sort key cached in m_rgchTable.
+ if ((uCount = strlen(szStr1)) != xstrlen(szStr2))
+ return 1;
+
+ for(;
+ ((*(m_rguSortKeys + (0x00ff & (*szStr1))) ==
+ *(m_rguSortKeys + (0x00ff & (*szStr2)))) && uCount);
+
+ szStr1++, szStr2++, uCount--);
+ // END of FOR loop
+
+ // if all the characters matched(i.e. uCount == 0) then return 0
+ // (i.e. both strings are equal).
+ if (uCount)
+ return 1;
+ else
+ return 0;
+
+ INT nRetCode = 0;
+
+ } else {
+ return !(CompareStringA(m_pgtlibole->GetLcid(),
+ NORM_IGNORECASE |
+ NORM_IGNOREWIDTH |
+ NORM_IGNOREKANATYPE,
+ (LPSTR)szStr1,
+ -1,
+ (LPSTR)szStr2, -1)
+ == 2);
+ }
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC GenerateSortKey()
+*Purpose: Initialize the table for Accent insensitive comparision.
+*
+*Entry
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_CORE2)
+TIPERROR NAMMGR::GenerateSortKey()
+{
+ BYTE rgch[256];
+ UINT i;
+
+ GetInsensitiveCompTbl(m_pgtlibole->GetLcid(), m_pgtlibole->GetSyskind(), (LPSTR)rgch );
+
+ for (i = 0; i < 256; m_rguSortKeys[i] = (UINT)rgch[i], i++);
+
+ // Mark the table as having been built.
+ m_fSortKeys = TRUE;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC HashOfHlnam - retrieve hash value stored in the hlnam entry
+*Purpose:
+* Returns the the hash value that is stored in the name entry corresponding
+* to this hlnam. Actually we store only the whashVal for space optimization.
+*
+*Entry:
+* hlnam - name to get hash value of
+*
+*Exit:
+* Returns the hash value this name has.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+ULONG NAMMGR::HashOfHlnam(HLNAM hlnam)
+{
+ return (ULONG) ( (ULONG) (m_pgtlibole->GetSampleHashVal() & 0xffff0000) |
+ (ULONG) ((USHORT)QnamOfHlnam(hlnam)->m_uHash) ) ;
+}
+#pragma code_seg( )
+
+
+
+
+
+
+/////////////////////////////////////////////////////////
+// BELOW HERE IS DEBUGGING CODE ONLY!
+/////////////////////////////////////////////////////////
+
+#if ID_DEBUG
+
+/***
+*DebCheckState() - check state of this table.
+*Purpose:
+* Checks the current state of the table.
+*
+*Entry:
+* uLevel - 0 - quick check
+* 1 - recursive check all entries too.
+*
+*Exit:
+* None. Asserts if things are wrong.
+*
+***********************************************************************/
+
+void NAMMGR::DebCheckState(UINT uLevel) const
+{
+ UINT i;
+
+ DebAssert(m_fInit, "NAMMGR::DebCheckState: not initialized");
+
+ // Check the blkmgrs.
+ m_bm.DebCheckState(uLevel);
+ m_pbmNamInfo->DebCheckState(uLevel);
+
+ if (uLevel > 0) {
+ for (i = 0; i < NM_cBuckets; ++i) {
+ DebCheckHlnamRecurse(GetBucketOfHash(i));
+ }
+ }
+}
+
+
+
+
+
+/***
+*DebCheckHlnam - check that an hlnam is valid.
+*Purpose:
+* Checks to see that an hlnam is valid. HLNAM_Nil is a valid
+* value for this function.
+*
+*Entry:
+* hlnam - name handle to check
+*
+*Exit:
+* None. Assert if hlnam is invalid.
+*
+***********************************************************************/
+
+void NAMMGR::DebCheckHlnam(HLNAM hlnam) const
+{
+
+ DebAssert(hlnam == HLNAM_Nil || m_pbmNamInfo->QtrOfHandle(hlnam) != NULL,
+ "DebCheckHlnam: invalid hlnam");
+ if (hlnam == HLNAM_Nil) {
+ return;
+ }
+}
+
+
+/***
+*DebCheckHlnamRecurse - check that an hlnam is valid, and its descendants.
+*Purpose:
+* Checks to see that an hlnam is valid. HLNAM_Nil is a valid
+* value for this function. The descendants of this hlnam are checked also.
+*
+*Entry:
+* hlnam - name handle to check
+*
+*Exit:
+* None. Assert if hlnam is invalid.
+*
+***********************************************************************/
+
+void NAMMGR::DebCheckHlnamRecurse(HLNAM hlnam) const
+{
+ DebCheckHlnam(hlnam);
+
+ if (hlnam != HLNAM_Nil) {
+ DebCheckHlnamRecurse(QnamOfHlnam(hlnam)->m_hlnamLeft);
+ DebCheckHlnamRecurse(QnamOfHlnam(hlnam)->m_hlnamRight);
+ }
+}
+
+
+#endif // ID_DEBUG
+
+// catch global constructors and destructors
+#pragma code_seg(CS_INIT)
diff --git a/private/oleauto/src/typelib/nammgr.hxx b/private/oleauto/src/typelib/nammgr.hxx
new file mode 100644
index 000000000..8925b8a08
--- /dev/null
+++ b/private/oleauto/src/typelib/nammgr.hxx
@@ -0,0 +1,621 @@
+/***
+*nammgr.hxx - Name Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The Name Manager handles the hashing and storing of names. Each
+* class has its own name manager. See \silver\doc\ic\nammgr.doc for
+* information on the name manager.
+*
+*Revision History:
+*
+* 22-Jan-91 petergo: Created.
+* [01] 25-Feb-91 petergo: Now uses heap/block manager for mem mgt.
+* [02] 13-Jun-91 petergo: Updated for new protocols.
+* [03] 18-Mar-92 ilanc: Fixed release def of DebDeleteGlobalDefault()
+* [04] 15-May-92 w-peterh: added case change parameters to HlnamOfStr
+* [05] 15-Nov-92 RajivK: added isStrDef() for Edit & Continue stuff
+* [06] 19-Nov-92 RajivK: added CbOfHlnam() and CchOfHgnam();
+* [07] 31-Dec-92 RajivK: Support for code page conversion.
+* [08] 08-Jan-93 RajivK: Support for Code Resource on Mac
+* [09] 08-Jan-93 RajivK: Fixed some undone(s)
+* [10] 27-Feb-93 RajivK: added the data member m_lcid
+* [11] 01-Oct-93 StevenL: Don't make different hlnams for bracketed ids
+*
+*Implementation Notes:
+* See nammgr.cxx.
+*
+*****************************************************************************/
+
+#ifndef NAMMGR_HXX_INCLUDED
+#define NAMMGR_HXX_INCLUDED
+
+#include "cltypes.hxx"
+
+class STREAM;
+class GEN_PROJECT;
+class GenericTypeLibOLE;
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szNAMMGR_HXX)
+#define SZ_FILE_NAME g_szNAMMGR_HXX
+#endif
+
+
+// This constant defines the number of buckets used in the hash
+// table. Each bucket uses 2 bytes.
+// For testing purposes, it is useful to set this number very
+// low to force many bucket collisions.
+const UINT NM_cBuckets = 256;
+
+class DYN_TYPEROOT;
+
+
+
+// These structs define the layout of name structure which can
+// be stored in the name table. The following 2 struct(s) are logically
+// one struct. We have split it into two structs to separate the strings that
+// from the rest of the NamMgr information. This was done to increase the
+// capacity of the name table.
+
+// Over head of storing a name.
+// Name :- nam. Size: 10 bytes.
+struct NAM_INFO
+{
+ USHORT m_uHash; // Hash value of the string.
+ // NOTE:- we only cache the low 2 bytes. When we
+ // have to return a hash value then we form
+ // the 4 byte hash value and return it.
+ sHLNAM m_hlnamLeft; // Left child in binary tree
+ sHLNAM m_hlnamRight; // Right child in binary tree
+
+
+ USHORT m_fAppToken:1; // Used as a dirty bit--we set it if the
+ // name has ever been used as an app token.
+ USHORT m_fPreserveCase:1; // Don't change the case of this name
+ USHORT m_fGlobal:1; // This name can be bound to in an unqualified way
+ USHORT m_fMultiple:1; // There are multiple instances of this name
+ USHORT m_fAmbiguous:1; // There exists two global instances of this name
+ USHORT m_fNonParam:1; // There exists a non-parameter instance of name
+ USHORT m_ityp:10; // this name's index into the typeinfos
+
+};
+// Unlocalized text name
+struct NAM_STR : public NAM_INFO
+{
+ CHAR m_xsz[1]; // the name -- variable length extending beyond
+ // this structure.
+};
+
+
+// This is an invalid value of ityp
+#define NM_InvalidItyp 0x03FF
+
+// This defines the layout out a NAM_INFO for serialization;
+// It must be updated if new members are added to the structures.
+#define NM_NamInfoLayout "ssss"
+
+
+class NAMMGR;
+
+/***
+*class NAMMGR - 'nammgr': Name manager
+*Purpose:
+* The class implements the name manager. Each project has its own
+* name manager, which is created and owned by GTLIBOLE .
+*
+***********************************************************************/
+
+class NAMMGR
+{
+public:
+ NAMMGR();
+ ~NAMMGR();
+
+ TIPERROR Init(SHEAP_MGR * psheapmgr, DYN_TYPEROOT *pdtroot=NULL);
+ nonvirt TIPERROR HgnamOfStr(LPSTR szName, HGNAM FAR * phgnam);
+ nonvirt TIPERROR HlnamOfStr(XSZ_CONST sz, HLNAM *phlnam,
+ BOOL fChangeCase, BOOL *pfCaseChanged,
+ BOOL fPreserveCase = FALSE,
+ BOOL fAppToken = FALSE);
+#if OE_WIN32
+ nonvirt TIPERROR HlnamOfStrW(const OLECHAR FAR* lpstrW, HLNAM *phlnam,
+ BOOL fChangeCase, BOOL *pfCaseChanged,
+ BOOL fPreserveCase = FALSE,
+ BOOL fAppToken = FALSE);
+#else //OE_WIN32
+ #define HlnamOfStrW HlnamOfStr
+#endif //OE_WIN32
+ nonvirt HLNAM HlnamOfStrIfExist(XSZ_CONST xsz);
+ nonvirt TIPERROR StrOfHlnam(HLNAM hlnam, XSZ sz, UINT cbMax) const;
+#if 0
+#if OE_WIN32
+ nonvirt TIPERROR StrOfHlnamW(HLNAM hlnam, LPOLESTR sz, UINT cbMax) const;
+#else
+ #define StrOfHlnamW StrOfHlnam
+#endif //OE_WIN32
+#endif //0
+ nonvirt TIPERROR BstrOfHlnam(HLNAM hlnam, BSTRA *pbstr) const;
+#if OE_WIN32
+ nonvirt TIPERROR BstrWOfHlnam(HLNAM hlnam, BSTR *pbstr) const;
+#else //OE_WIN32
+ #define BstrWOfHlnam BstrOfHlnam
+#endif //OE_WIN32
+ nonvirt TIPERROR HgnamOfHlnam(HLNAM hlnam, HGNAM *hgnam);
+ nonvirt HLNAM HlnamOfHgnam(HGNAM hgnam) const;
+ nonvirt ULONG HashOfHlnam(HLNAM hlnam);
+ nonvirt BOOL IsStrDef(XSZ_CONST xsz);
+ nonvirt TIPERROR Read(STREAM *psstrm);
+ nonvirt TIPERROR Write(STREAM *psstrm);
+#if 0
+ nonvirt UINT CbOfHlnam(HLNAM hlnam) const;
+#endif
+ nonvirt TIPERROR CchOfHgnam(HGNAM hgnam, UINT *pcchMax) const;
+ nonvirt TIPERROR IsName(LPSTR szNameBuf, ULONG lHashVal, BOOL FAR *pfName);
+
+ nonvirt BOOL IsAppToken(HLNAM hlnam) const;
+ nonvirt BOOL IsCasePreserved(HLNAM hlnam) const;
+ nonvirt BOOL IsGlobal(HLNAM hlnam) const;
+ nonvirt BOOL IsMultiple(HLNAM hlnam) const;
+ nonvirt BOOL IsAmbiguous(HLNAM hlnam) const;
+ nonvirt BOOL IsNonParam(HLNAM hlnam) const;
+
+ nonvirt void SetAppToken(HLNAM hlnam, BOOL fValue);
+ nonvirt void SetPreserveCase(HLNAM hlnam, BOOL fValue);
+ nonvirt void SetGlobal(HLNAM hlnam, BOOL fValue);
+ nonvirt void SetMultiple(HLNAM hlnam, BOOL fValue);
+ nonvirt void SetAmbiguous(HLNAM hlnam, BOOL fValue);
+ nonvirt void SetNonParam(HLNAM hlnam, BOOL fValue);
+
+ nonvirt BOOL IsValidItyp(HLNAM hlnam) const;
+ nonvirt UINT ItypOfHlnam(HLNAM hlnam) const;
+ nonvirt void SetItypOfHlnam(HLNAM hlnam, UINT ityp);
+ nonvirt UINT IndexOfHlnam(HLNAM hlnam) const;
+
+ TIPERROR StrOfHgnam(HGNAM hgnam, XSZ sz, UINT cchMax);
+ nonvirt LPSTR LpstrOfHgnam(HGNAM hgnam) const;
+
+ TIPERROR GetHgnamOfStrLhash(XSZ xsz, ULONG lHashVal, HGNAM *phgnam);
+
+ nonvirt ULONG GetSize();
+ // function for code page conversion
+ nonvirt TIPERROR ConvertCodePage();
+ nonvirt LCID GetLcid();
+ nonvirt INT StriEq(XSZ_CONST szStr1, XSZ_CONST szStr2);
+ nonvirt TIPERROR GenerateSortKey();
+
+ // Has nammgr been initialized?
+ nonvirt BOOL IsValid() const;
+ nonvirt TIPERROR SetGtlibole(GenericTypeLibOLE *pgtlibole);
+ nonvirt GenericTypeLibOLE * Pgtlibole();
+
+
+#if 0
+ // Clean up the nammgr entries
+ nonvirt void CleanNames();
+#endif
+
+#if ID_DEBUG
+ nonvirt void DebCheckState(UINT uLevel) const;
+ nonvirt void DebCheckHlnam(HLNAM hlnam) const;
+ nonvirt void DebCheckHlnamRecurse(HLNAM hlnam) const;
+#else
+ // Make check functions No-op in release version
+ inline void NAMMGR::DebCheckState(UINT uLevel) const {}
+ inline void NAMMGR::DebCheckHlnam(HLNAM hlnam) const {}
+ inline void NAMMGR::DebCheckHlnamRecurse(HLNAM hlnam) const {}
+#endif // ID_DEBUG
+
+
+#if ID_DEBUG
+ nonvirt ULONG DebShowSize();
+#else
+ nonvirt VOID DebShowSize() {}
+#endif
+
+protected:
+ nonvirt VOID RehashNodes(HLNAM hlnamRoot);
+
+private:
+
+ BLK_MGR m_bm; // the block manager to manage memory
+ BLK_MGR *m_pbmNamInfo; // to store the over head of each name.
+
+
+ sHCHUNK m_hchunkBucketTbl; // hchunk of the bucket table.
+
+ BOOL m_fInit:1; // Init() has been called?
+ BOOL m_fSortKeys:1; // Sort keys table generated?
+ BOOL m_fOLBKwordInit:1; // OLBKword table has been inited
+ // BOOL m_unused:13;
+
+
+ GenericTypeLibOLE *m_pgtlibole; // pointer to the containing Project
+
+
+ UINT m_rguSortKeys[256];
+
+ nonvirt BOOL IsTextName(NAM_INFO * pnam) const;
+ nonvirt NAM_INFO* QnamOfHlnam(HLNAM hlnam) const;
+ nonvirt NAM_STR* QnamstrOfHlnam(HLNAM hlnam) const;
+ nonvirt sHLNAM * RqhlnamBucketTbl() const;
+ nonvirt HLNAM GetBucketOfHash(UINT uHash) const;
+ nonvirt void SetBucketOfHash(UINT uHash, HLNAM hlnam);
+ nonvirt HLNAM FindHash(UINT uHashFind, HLNAM hlnam) const;
+ nonvirt HLNAM FindTextNam(XSZ_CONST sz, UINT uHash,
+ BOOL fChangeCase, BOOL *pfCaseChanged,
+ BOOL fPreserveCase);
+ nonvirt void AddEntry(HLNAM hlnamNew);
+#if 0
+ nonvirt void CleanHlnam(HLNAM hlnam);
+#endif
+ nonvirt void ForEachName(void (NAMMGR::*)(HLNAM), BOOL fBefore);
+ nonvirt void ForEachDescendant(HLNAM hlnamRoot,
+ void (NAMMGR::*pfn)(HLNAM),
+ BOOL fBefore);
+ TIPERROR GetInfoOfHgnam(HGNAM hgnam, XSZ sz, UINT *cchMax) const;
+
+#if HP_BIGENDIAN
+ nonvirt void SwapBytes();
+ nonvirt void SwapBytesBack();
+ nonvirt void SwapHlnamBytes(HLNAM hlnam);
+#endif //HP_BIGENDIAN
+
+#ifdef NAMMGR_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+
+
+/***
+*IsTextName - checks to see if name is normal text name
+*Purpose:
+* Determines if the give name structure refers to a text name
+* which is not a localized name.
+*
+*Entry:
+* NAM * pnam - points to base part of a name structure.
+*
+*Exit:
+* return TRUE if is a text name.
+*
+******************************************************************************/
+
+inline BOOL NAMMGR::IsTextName(NAM_INFO * pnam) const
+{
+ // Now have only text names!
+ return TRUE;
+}
+
+
+/***
+*IndexOfHlnam
+*Purpose:
+* Computes the index of the given hlnam in the name table. This is
+* primarily used to compute hash values for the various hash
+* tables.
+*
+*Entry:
+* hlnam - the hlnam to compute the index of.
+*
+*Exit:
+* return index.
+*
+******************************************************************************/
+
+inline UINT NAMMGR::IndexOfHlnam(HLNAM hlnam) const
+{
+ DebAssert(hlnam % 2 == 0, "Bad hlnam!");
+ return hlnam / 2; // We use only the upper 15 bits
+}
+
+
+
+#if 0
+/***
+*GetLcid()
+*Purpose:
+* returns pointer to local code for the nammgr/project
+*
+*Entry:
+*
+*Exit:
+* returns pointer to the DYN_TYPEROOT;
+*
+*
+******************************************************************************/
+inline LCID NAMMGR::GetLcid()
+{
+ return m_pgtlib->GetLcid();
+}
+#endif //0
+
+
+/***
+*Pgtlibole()
+*Purpose:
+* returns pointer to the project that owns this nammgr.
+*
+*Entry:
+*
+*Exit:
+*
+******************************************************************************/
+inline GenericTypeLibOLE * NAMMGR::Pgtlibole()
+{
+ return m_pgtlibole;
+}
+
+
+/***
+*RqhlnamBucketTbl() - Get pointer to bucket table
+*Purpose:
+* Returns a pointer to the bucket table of the name mgr.
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns a pointer to the bucket table. The pointer is only valid
+* for a short time.
+*
+***********************************************************************/
+
+inline sHLNAM * NAMMGR::RqhlnamBucketTbl() const
+{
+ return (sHLNAM *) m_bm.QtrOfHandle(m_hchunkBucketTbl);
+}
+
+
+
+/***
+*QnamOfHlnam - gets a pointer to the NAM_INFO instance from an hlnam
+*Purpose:
+* From an hlnam, gets a pointer to the NAM instance which that
+* hlnam refers to. Since hlnams are just offsets into the name
+* table, this is a simple conversion of an offset to pointer.
+*
+* Be careful! The pointer returned by this function will be invalidated
+* when any name is added to the name table, so don't hold on to
+* it too long.
+*
+*Entry:
+* hlnam - hlnam to get pointer to
+*
+*Exit:
+* Returns a pointer to the NAM_INFO structure associated with this hlnam.
+*
+***********************************************************************/
+
+inline NAM_INFO * NAMMGR::QnamOfHlnam(HLNAM hlnam) const
+{
+ DebCheckHlnam(hlnam);
+ DebAssert(hlnam != HLNAM_Nil, "QnamOfHlnam: nil hlnam");
+
+ return (NAM_INFO *) m_pbmNamInfo->QtrOfHandle(hlnam);
+}
+
+
+
+/***
+*QnamstrOfHlnam - gets a pointer to the NAM_STR instance for a hlnam
+*Purpose:
+* From an hlnam, gets a pointer to the NAM_STR.
+*
+* Be careful! The pointer returned by this function will be invalidated
+* when any name is added to the name table, so don't hold on to
+* it too long.
+*
+*NOTE:- For ole this is same as QnamOfHlnam();
+*
+*Entry:
+* hlnam - hlnam for which we have to return the pointer to the NAM_STR
+*
+*Exit:
+* Returns a pointer to the NAM_STR structure associated with this hlnam.
+*
+***********************************************************************/
+
+inline NAM_STR * NAMMGR::QnamstrOfHlnam(HLNAM hlnam) const
+{
+ return (NAM_STR *) QnamOfHlnam(hlnam);
+}
+
+/***
+*PUBLIC IsXXX - returns the value of the given flag
+*Purpose:
+* Returns the flags byte of the hlnam.
+*
+*Entry:
+* hlnam - name handle
+*
+*Exit:
+* returns flag.
+***********************************************************************/
+
+inline BOOL NAMMGR::IsAppToken(HLNAM hlnam) const
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ return ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fAppToken;
+}
+
+inline BOOL NAMMGR::IsCasePreserved(HLNAM hlnam) const
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ return ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fPreserveCase;
+}
+
+inline BOOL NAMMGR::IsGlobal(HLNAM hlnam) const
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ return ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fGlobal;
+}
+
+inline BOOL NAMMGR::IsMultiple(HLNAM hlnam) const
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ return ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fMultiple;
+}
+
+inline BOOL NAMMGR::IsAmbiguous(HLNAM hlnam) const
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ return ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fAmbiguous;
+}
+
+inline BOOL NAMMGR::IsNonParam(HLNAM hlnam) const
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ return ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fNonParam;
+}
+
+/***
+*PUBLIC SetXXX - set the value of the given flag
+*Purpose:
+* Set the value of the given flag
+*
+*Entry:
+* hlnam - name handle
+* fValue - what to set the flag to
+*
+*Exit:
+*
+***********************************************************************/
+
+inline void NAMMGR::SetAppToken(HLNAM hlnam, BOOL fValue)
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fAppToken = fValue;
+}
+
+inline void NAMMGR::SetPreserveCase(HLNAM hlnam, BOOL fValue)
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fPreserveCase = fValue;
+}
+
+inline void NAMMGR::SetGlobal(HLNAM hlnam, BOOL fValue)
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fGlobal = fValue;
+}
+
+inline void NAMMGR::SetMultiple(HLNAM hlnam, BOOL fValue)
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fMultiple = fValue;
+}
+
+inline void NAMMGR::SetAmbiguous(HLNAM hlnam, BOOL fValue)
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fAmbiguous = fValue;
+}
+
+inline void NAMMGR::SetNonParam(HLNAM hlnam, BOOL fValue)
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ ((NAM_INFO *)QnamOfHlnam(hlnam))->m_fNonParam = fValue;
+}
+
+
+/***
+*PUBLIC IsValidITyp - Returns whether the ityp is valid
+*Purpose:
+* Returns the ityp of the hlnam
+*
+*Entry:
+* hlnam - name handle
+*
+*Exit:
+* returns bool
+***********************************************************************/
+
+inline BOOL NAMMGR::IsValidItyp(HLNAM hlnam) const
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ return ((NAM_INFO *)QnamOfHlnam(hlnam))->m_ityp != NM_InvalidItyp;
+}
+
+/***
+*PUBLIC ItypOfHlnam - reads ityp of an hlnam
+*Purpose:
+* Returns the ityp of the hlnam
+*
+*Entry:
+* hlnam - name handle
+*
+*Exit:
+* returns ityp
+***********************************************************************/
+
+inline UINT NAMMGR::ItypOfHlnam(HLNAM hlnam) const
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ return (UINT)((NAM_INFO *)QnamOfHlnam(hlnam))->m_ityp;
+}
+
+/***
+*PUBLIC SetItypOfHlnam - Sets the ityp of the given hlnam
+*Purpose:
+* Set the ityp of the given hlnam
+*
+*Entry:
+* hlnam - name handle
+* ityp - the index to the TypeInfo
+*
+*Exit:
+* None.
+***********************************************************************/
+
+inline void NAMMGR::SetItypOfHlnam(HLNAM hlnam, UINT ityp)
+{
+ DebAssert(IsTextName(QnamOfHlnam(hlnam)), "not a text name");
+ DebAssert(ityp < NM_InvalidItyp, "ityp is too large");
+
+ ((NAM_INFO *)QnamOfHlnam(hlnam))->m_ityp = ityp;
+}
+
+/***
+*PUBLIC HlnamOfHgnam - extracts hlnam from hgnam
+*Purpose:
+* Extracts hlnam from hgnam. Guaranteed to be the hiword.
+*
+*Entry:
+*
+*Exit:
+* HLNAM
+*
+***********************************************************************/
+
+inline HLNAM NAMMGR::HlnamOfHgnam(HGNAM hgnam) const
+{
+ return (HLNAM)(USHORT)(hgnam >> 16);
+}
+
+
+/***
+*PUBLIC IsValid - tests if nammgr valid
+*Purpose:
+* Tests if nammgr valid, i.e. has been initialized.
+*
+*Entry:
+*
+*Exit:
+* TRUE if has been initialized, else false.
+*
+***********************************************************************/
+
+inline BOOL NAMMGR::IsValid() const
+{
+ return (BOOL)m_fInit;
+}
+
+
+#endif // ! NAMMGR_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/ncache.hxx b/private/oleauto/src/typelib/ncache.hxx
new file mode 100644
index 000000000..d06e5cf06
--- /dev/null
+++ b/private/oleauto/src/typelib/ncache.hxx
@@ -0,0 +1,287 @@
+/***
+*ncache.hxx - NAME_CACHE header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* NAME_CACHE class used for project-level binding
+*
+*Revision History:
+*
+* 01-Jun-92 ilanc: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef NAME_CACHE_HXX_INCLUDED
+#define NAME_CACHE_HXX_INCLUDED
+
+#include <limits.h> // for CHAR_BIT
+#include "xstring.h" // for memset
+#include "cltypes.hxx"
+// #include "clutil.hxx"
+
+
+// WARMING: this is really from clutil.hxx
+// but we include this explicitly because we don't
+// want header files to depend on clutil.hxx cos it
+// has the effect of requiring hxxtoinc to know about
+// any global symbols it (clutil.hxx) defines.
+//
+inline UINT HashOfHgnam(HGNAM hgnam);
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szNCACHE_HXX)
+#define SZ_FILE_NAME g_szNCACHE_HXX
+#endif
+
+// NAME_CACHE byte size
+#define NAMCACHE_cbSize 16
+
+/***
+*class NAME_CACHE - 'namcache': Project-level NAME_CACHE
+*Purpose:
+* The class defines the project-level NAME_CACHE
+*
+*Implementation Notes:
+* Only has non-virtual/static methods. instances of NAME_CACHE
+* are allocated in BLK_DESCs and thus must have no virtual
+* funcs.
+*
+***********************************************************************/
+
+class NAME_CACHE
+{
+ friend class GenericTypeLibOLE;
+
+private:
+ BYTE m_rgBitmap[NAMCACHE_cbSize];
+ USHORT m_isValid;
+ nonvirt VOID SetBit(UINT uBit);
+ nonvirt BOOL GetBit(UINT uBit) const;
+
+public:
+ NAME_CACHE();
+ nonvirt VOID Invalidate();
+ nonvirt BOOL IsValid() const;
+ nonvirt VOID SetValid();
+ nonvirt BOOL IsNameInCache(HGNAM hgnam) const;
+ nonvirt VOID AddNameToCache(HGNAM hgnam);
+
+#if ID_DEBUG
+ nonvirt VOID DebShowState(UINT uLevel) const;
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+#else
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+#endif
+};
+
+
+/***
+*PUBLIC NAME_CACHE::Invalidate - Invalidates cache.
+*Purpose:
+* Invalidates cache -- sets all bits to zero.
+* NOTE: must precede ctor since referenced by ctor and inline
+* and cfront complains otherwise.
+*
+*Entry:
+*
+*Exit:
+* Sets m_isValid to FALSE and all bits in bitmap to zero.
+*
+***********************************************************************/
+
+inline VOID NAME_CACHE::Invalidate()
+{
+ m_isValid = (USHORT)FALSE;
+ memset(m_rgBitmap, (int)0, sizeof(m_rgBitmap));
+}
+
+
+/***
+*PRIVATE NAME_CACHE::NAME_CACHE - constructor
+*Purpose:
+* Constructor - invalidates cache.
+*
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline NAME_CACHE::NAME_CACHE()
+{
+ Invalidate();
+}
+
+
+/***
+*PRIVATE NAME_CACHE::IsValid - is cache valid
+*Purpose:
+* tests if cache is valid
+*
+*Entry:
+*
+*Exit:
+* TRUE if valid, FALSE otherwise
+*
+***********************************************************************/
+
+inline BOOL NAME_CACHE::IsValid() const
+{
+ return (BOOL)m_isValid;
+}
+
+
+/***
+*PRIVATE NAME_CACHE::SetValid - makes cache valid
+*Purpose:
+* Makes cache valid.
+*
+*Entry:
+*
+*Exit:
+* None
+*
+***********************************************************************/
+
+inline VOID NAME_CACHE::SetValid()
+{
+ m_isValid = (USHORT)TRUE;
+}
+
+
+/***
+*PRIVATE NAME_CACHE::GetBit - Gets bit in bitmap.
+*Purpose:
+* Indicates whether bit that hash value maps to is set in bitmap.
+* Doesn't require cache to be valid -- up to client
+* to validate/invalidate cache.
+*
+*Entry:
+* uHash - Hash value to map and test.
+*
+*Exit:
+* Returns TRUE if bit set otherwise FALSE.
+*
+***********************************************************************/
+
+inline BOOL NAME_CACHE::GetBit(UINT uHash) const
+{
+ UINT uBitsElem;
+ UINT uBit;
+
+ uBitsElem=sizeof(m_rgBitmap[0]) * CHAR_BIT;
+
+ // map hash value to bit
+ uBit = uHash % (sizeof(m_rgBitmap) * uBitsElem);
+
+ return m_rgBitmap[uBit/uBitsElem] & (1 << (uBit % uBitsElem));
+}
+
+
+/***
+*PRIVATE NAME_CACHE::SetBit - Sets bit in bitmap.
+*Purpose:
+* Sets bit that hash value maps to in bitmap.
+* Doesn't require cache to be valid -- up to client
+* to validate/invalidate cache.
+*
+*Entry:
+* uHash - Hash value to map and set.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID NAME_CACHE::SetBit(UINT uHash)
+{
+ UINT uBitsElem;
+ UINT uBit;
+
+ uBitsElem=sizeof(m_rgBitmap[0]) * CHAR_BIT;
+
+ // map hash value to bit
+ uBit = uHash % (sizeof(m_rgBitmap) * uBitsElem);
+
+ m_rgBitmap[uBit/uBitsElem] |= (1 << (uBit % uBitsElem));
+}
+
+
+/***
+*PUBLIC NAME_CACHE::IsNameInCache
+*Purpose:
+* Tests if a given name is in cache.
+* Doesn't care if cache is valid -- up to clients
+* to validate/invalidate cache.
+*
+*Entry:
+* hgnam Global name handle to test for.
+
+*
+*Exit:
+* TRUE if name is in cache.
+* FALSE otherwise.
+*
+***********************************************************************/
+
+inline BOOL NAME_CACHE::IsNameInCache(HGNAM hgnam) const
+{
+ return GetBit(HashOfHgnam(hgnam));
+}
+
+
+/***
+*PUBLIC NAME_CACHE::AddNameToCache
+*Purpose:
+* Adds name to cache but setting appropriate bit in map.
+* Doesn't care if cache is valid -- up to clients
+* to validate/invalidate cache.
+*
+*Entry:
+* hgnam Global name handle to set bit for.
+*
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID NAME_CACHE::AddNameToCache(HGNAM hgnam)
+{
+ SetBit(HashOfHgnam(hgnam));
+}
+
+
+#if ID_DEBUG
+
+/***
+*PUBLIC NAME_CACHE::DebCheckState - NAME_CACHE state
+*Purpose:
+* Cache NAME_CACHE state
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+
+inline VOID NAME_CACHE::DebCheckState(UINT uLevel) const
+{
+}
+
+#endif // ID_DEBUG
+
+
+#endif // NAME_CACHE_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/newexe.h b/private/oleauto/src/typelib/newexe.h
new file mode 100644
index 000000000..d4c0bee49
--- /dev/null
+++ b/private/oleauto/src/typelib/newexe.h
@@ -0,0 +1,387 @@
+/*static char *SCCSID = "@(#)newexe.h:2.9";*/
+/*
+ * Title
+ *
+ * newexe.h
+ * Pete Stewart
+ * Copyright (c) 1984-1993, Microsoft Corporation. All rights reserved.
+ * 17 August 1984
+ *
+ * Description
+ *
+ * Data structure definitions for the DOS 4.0/Windows 2.0
+ * executable file format.
+ *
+ * Modification History
+ *
+ * 84/08/17 Pete Stewart Initial version
+ * 84/10/17 Pete Stewart Changed some constants to match OMF
+ * 84/10/23 Pete Stewart Updates to match .EXE format revision
+ * 84/11/20 Pete Stewart Substantial .EXE format revision
+ * 85/01/09 Pete Stewart Added constants ENEWEXE and ENEWHDR
+ * 85/01/10 Steve Wood Added resource definitions
+ * 85/03/04 Vic Heller Reconciled Windows and DOS 4.0 versions
+ * 85/03/07 Pete Stewart Added movable entry count
+ * 85/04/01 Pete Stewart Segment alignment field, error bit
+ * 88/03/28 Craig Critchley Version 3.00 stuff
+ */
+
+#define EMAGIC 0x5A4D /* Old magic number */
+#define ENEWEXE sizeof(struct exe_hdr)
+ /* Value of E_LFARLC for new .EXEs */
+#define ENEWHDR 0x003C /* Offset in old hdr. of ptr. to new */
+#define ERESWDS 0x0010 /* No. of reserved words in header */
+#define ECP 0x0004 /* Offset in struct of E_CP */
+#define ECBLP 0x0002 /* Offset in struct of E_CBLP */
+#define EMINALLOC 0x000A /* Offset in struct of E_MINALLOC */
+
+struct exe_hdr /* DOS 1, 2, 3 .EXE header */
+ {
+ unsigned short e_magic; /* Magic number */
+ unsigned short e_cblp; /* Bytes on last page of file */
+ unsigned short e_cp; /* Pages in file */
+ unsigned short e_crlc; /* Relocations */
+ unsigned short e_cparhdr; /* Size of header in paragraphs */
+ unsigned short e_minalloc; /* Minimum extra paragraphs needed */
+ unsigned short e_maxalloc; /* Maximum extra paragraphs needed */
+ unsigned short e_ss; /* Initial (relative) SS value */
+ unsigned short e_sp; /* Initial SP value */
+ unsigned short e_csum; /* Checksum */
+ unsigned short e_ip; /* Initial IP value */
+ unsigned short e_cs; /* Initial (relative) CS value */
+ unsigned short e_lfarlc; /* File address of relocation table */
+ unsigned short e_ovno; /* Overlay number */
+ unsigned short e_res[ERESWDS]; /* Reserved words */
+ long e_lfanew; /* File address of new exe header */
+ };
+
+#define E_MAGIC(x) (x).e_magic
+#define E_CBLP(x) (x).e_cblp
+#define E_CP(x) (x).e_cp
+#define E_CRLC(x) (x).e_crlc
+#define E_CPARHDR(x) (x).e_cparhdr
+#define E_MINALLOC(x) (x).e_minalloc
+#define E_MAXALLOC(x) (x).e_maxalloc
+#define E_SS(x) (x).e_ss
+#define E_SP(x) (x).e_sp
+#define E_CSUM(x) (x).e_csum
+#define E_IP(x) (x).e_ip
+#define E_CS(x) (x).e_cs
+#define E_LFARLC(x) (x).e_lfarlc
+#define E_OVNO(x) (x).e_ovno
+#define E_RES(x) (x).e_res
+#define E_LFANEW(x) (x).e_lfanew
+
+#define NEMAGIC 0x454E /* New magic number */
+#define NERESBYTES 0
+
+struct new_exe /* New .EXE header */
+ {
+ unsigned short int ne_magic; /* Magic number NE_MAGIC */
+ char ne_ver; /* Version number */
+ char ne_rev; /* Revision number */
+ unsigned short int ne_enttab; /* Offset of Entry Table */
+ unsigned short int ne_cbenttab; /* Number of bytes in Entry Table */
+ long ne_crc; /* Checksum of whole file */
+ unsigned short int ne_flags; /* Flag word */
+ unsigned short int ne_autodata; /* Automatic data segment number */
+ unsigned short int ne_heap; /* Initial heap allocation */
+ unsigned short int ne_stack; /* Initial stack allocation */
+ long ne_csip; /* Initial CS:IP setting */
+ long ne_sssp; /* Initial SS:SP setting */
+ unsigned short int ne_cseg; /* Count of file segments */
+ unsigned short int ne_cmod; /* Entries in Module Reference Table */
+ unsigned short int ne_cbnrestab; /* Size of non-resident name table */
+ unsigned short int ne_segtab; /* Offset of Segment Table */
+ unsigned short int ne_rsrctab; /* Offset of Resource Table */
+ unsigned short int ne_restab; /* Offset of resident name table */
+ unsigned short int ne_modtab; /* Offset of Module Reference Table */
+ unsigned short int ne_imptab; /* Offset of Imported Names Table */
+ long ne_nrestab; /* Offset of Non-resident Names Table */
+ unsigned short int ne_cmovent; /* Count of movable entries */
+ unsigned short int ne_align; /* Segment alignment shift count */
+ unsigned short int ne_cres; /* Count of resource segments */
+ unsigned char ne_exetyp; /* Target operating system */
+ unsigned char ne_flagsother; /* Additional exe flags */
+ unsigned short int ne_gangstart; /* offset to gangload area */
+ unsigned short int ne_ganglength; /* length of gangload area */
+ unsigned short int ne_swaparea; /* Minimum code swap area size */
+ unsigned short int ne_expver; /* Expected Windows version number */
+ };
+
+#define NE_MAGIC(x) (x).ne_magic
+#define NE_VER(x) (x).ne_ver
+#define NE_REV(x) (x).ne_rev
+#define NE_ENTTAB(x) (x).ne_enttab
+#define NE_CBENTTAB(x) (x).ne_cbenttab
+#define NE_CRC(x) (x).ne_crc
+#define NE_FLAGS(x) (x).ne_flags
+#define NE_AUTODATA(x) (x).ne_autodata
+#define NE_HEAP(x) (x).ne_heap
+#define NE_STACK(x) (x).ne_stack
+#define NE_CSIP(x) (x).ne_csip
+#define NE_SSSP(x) (x).ne_sssp
+#define NE_CSEG(x) (x).ne_cseg
+#define NE_CMOD(x) (x).ne_cmod
+#define NE_CBNRESTAB(x) (x).ne_cbnrestab
+#define NE_SEGTAB(x) (x).ne_segtab
+#define NE_RSRCTAB(x) (x).ne_rsrctab
+#define NE_RESTAB(x) (x).ne_restab
+#define NE_MODTAB(x) (x).ne_modtab
+#define NE_IMPTAB(x) (x).ne_imptab
+#define NE_NRESTAB(x) (x).ne_nrestab
+#define NE_CMOVENT(x) (x).ne_cmovent
+#define NE_ALIGN(x) (x).ne_align
+#define NE_RES(x) (x).ne_res
+
+#define NE_USAGE(x) (WORD)*((WORD FAR *)(x)+1)
+#define NE_PNEXTEXE(x) (WORD)(x).ne_cbenttab
+#define NE_PAUTODATA(x) (WORD)(x).ne_crc
+#define NE_PFILEINFO(x) (WORD)((DWORD)(x).ne_crc >> 16)
+
+#ifdef DOS5
+#define NE_MTE(x) (x).ne_psegcsum /* DOS 5 MTE handle for this module */
+#endif
+
+
+/*
+ * Format of NE_FLAGS(x):
+ *
+ * p Not-a-process
+ * l Private Library
+ * e Errors in image
+ * xxxx Unused
+ * ww Uses PM API
+ * G Library GlobalAlloc above the line
+ * M Multiple Instance
+ * L Uses LIM 3.2
+ * P Runs in protected mode
+ * r Runs in real mode
+ * i Instance data
+ * s Solo data
+ */
+#define NENOTP 0x8000 /* Not a process */
+#define NEPRIVLIB 0x4000 /* Private Library */
+#define NENONC 0x4000 /* Non-conforming program */
+#define NEIERR 0x2000 /* Errors in image */
+#define NEWINAPI 0x0300 /* Uses PM API. For binary compat */
+#define NEEMSLIB 0x0040 /* Library GA above EMS line */
+#define NEMULTINST 0x0020 /* multiple instance flag */
+#define NELIM32 0x0010 /* LIM 32 expanded memory */
+#define NEPROT 0x0008 /* Runs in protected mode */
+#define NEREAL 0x0004 /* Runs in real mode */
+#define NEINST 0x0002 /* Instance data */
+#define NESOLO 0x0001 /* Solo data */
+
+/*
+ * Format of additional flags:
+ *
+ * xxxx
+ * p Preload area defined after seg table
+ * P 2.X supports protected mode
+ * F 2.X supports proportional font
+ * L Long file name support
+ */
+
+#define NEPRELOAD 0x08 /* preload segments */
+#define NEINPROT 0x04 /* protect mode */
+#define NEINFONT 0x02 /* prop. system font */
+#define NELONGNAMES 0x01 /* long file names */
+
+struct new_seg /* New .EXE segment table entry */
+ {
+ unsigned short ns_sector; /* File sector of start of segment */
+ unsigned short ns_cbseg; /* Number of bytes in file */
+ unsigned short ns_flags; /* Attribute flags */
+ unsigned short ns_minalloc; /* Minimum allocation in bytes */
+ };
+
+struct new_seg1 /* New .EXE segment table entry */
+ {
+ unsigned short ns_sector; /* File sector of start of segment */
+ unsigned short ns_cbseg; /* Number of bytes in file */
+ unsigned short ns_flags; /* Attribute flags */
+ unsigned short ns_minalloc; /* Minimum allocation in bytes */
+ unsigned short ns_handle; /* Handle of segment */
+ };
+
+#define NS_SECTOR(x) (x).ns_sector
+#define NS_CBSEG(x) (x).ns_cbseg
+#define NS_FLAGS(x) (x).ns_flags
+#define NS_MINALLOC(x) (x).ns_minalloc
+
+/*
+ * Format of NS_FLAGS(x):
+ *
+ * xxxx Unused
+ * DD 286 DPL bits
+ * d Segment has debug info
+ * r Segment has relocations
+ * e Execute/read only
+ * p Preload segment
+ * P Pure segment
+ * m Movable segment
+ * i Iterated segment
+ * ttt Segment type
+ */
+#define NSTYPE 0x0007 /* Segment type mask */
+#define NSCODE 0x0000 /* Code segment */
+#define NSDATA 0x0001 /* Data segment */
+#define NSITER 0x0008 /* Iterated segment flag */
+#define NSMOVE 0x0010 /* Movable segment flag */
+#define NSPURE 0x0020 /* Pure segment flag */
+#define NSPRELOAD 0x0040 /* Preload segment flag */
+#define NSEXRD 0x0080 /* Execute-only (code segment), or
+ * read-only (data segment)
+ */
+#define NSRELOC 0x0100 /* Segment has relocations */
+#define NSDEBUG 0x0200 /* Segment has debug info */
+#define NSDPL 0x0C00 /* 286 DPL bits */
+#define NSDISCARD 0x1000 /* Discard bit for segment */
+
+#define NSALIGN 9 /* Segment data aligned on 512 byte boundaries */
+
+struct new_segdata /* Segment data */
+ {
+ union
+ {
+ struct
+ {
+ unsigned short ns_niter; /* number of iterations */
+ unsigned short ns_nbytes; /* number of bytes */
+ char ns_iterdata; /* iterated data bytes */
+ } ns_iter;
+ struct
+ {
+ char ns_data; /* data bytes */
+ } ns_noniter;
+ } ns_union;
+ };
+
+struct new_rlcinfo /* Relocation info */
+ {
+ unsigned short nr_nreloc; /* number of relocation items that */
+ }; /* follow */
+
+struct new_rlc /* Relocation item */
+ {
+ char nr_stype; /* Source type */
+ char nr_flags; /* Flag byte */
+ unsigned short nr_soff; /* Source offset */
+ union
+ {
+ struct
+ {
+ char nr_segno; /* Target segment number */
+ char nr_res; /* Reserved */
+ unsigned short nr_entry; /* Target Entry Table offset */
+ } nr_intref; /* Internal reference */
+ struct
+ {
+ unsigned short nr_mod; /* Index into Module Reference Table */
+ unsigned short nr_proc; /* Procedure ordinal or name offset */
+ } nr_import; /* Import */
+ } nr_union; /* Union */
+ };
+
+#define NR_STYPE(x) (x).nr_stype
+#define NR_FLAGS(x) (x).nr_flags
+#define NR_SOFF(x) (x).nr_soff
+#define NR_SEGNO(x) (x).nr_union.nr_intref.nr_segno
+#define NR_RES(x) (x).nr_union.nr_intref.nr_res
+#define NR_ENTRY(x) (x).nr_union.nr_intref.nr_entry
+#define NR_MOD(x) (x).nr_union.nr_import.nr_mod
+#define NR_PROC(x) (x).nr_union.nr_import.nr_proc
+
+/*
+ * Format of NR_STYPE(x):
+ *
+ * xxxxx Unused
+ * sss Source type
+ */
+#define NRSTYP 0x07 /* Source type mask */
+#define NRSSEG 0x02 /* 16-bit segment */
+#define NRSPTR 0x03 /* 32-bit pointer */
+#define NRSOFF 0x05 /* 16-bit offset */
+
+/*
+ * Format of NR_FLAGS(x):
+ *
+ * xxxxx Unused
+ * a Additive fixup
+ * rr Reference type
+ */
+#define NRADD 0x04 /* Additive fixup */
+#define NRRTYP 0x03 /* Reference type mask */
+#define NRRINT 0x00 /* Internal reference */
+#define NRRORD 0x01 /* Import by ordinal */
+#define NRRNAM 0x02 /* Import by name */
+
+
+/* Resource type or name string */
+struct rsrc_string
+ {
+ char rs_len; /* number of bytes in string */
+ char rs_string[ 1 ]; /* text of string */
+ };
+
+#define RS_LEN( x ) (x).rs_len
+#define RS_STRING( x ) (x).rs_string
+
+/* Resource type information block */
+struct rsrc_typeinfo
+ {
+ unsigned short rt_id;
+ unsigned short rt_nres;
+ long rt_proc;
+ };
+
+#define RT_ID( x ) (x).rt_id
+#define RT_NRES( x ) (x).rt_nres
+#define RT_PROC( x ) (x).rt_proc
+
+/* Resource name information block */
+struct rsrc_nameinfo
+ {
+ /* The following two fields must be shifted left by the value of */
+ /* the rs_align field to compute their actual value. This allows */
+ /* resources to be larger than 64k, but they do not need to be */
+ /* aligned on 512 byte boundaries, the way segments are */
+ unsigned short rn_offset; /* file offset to resource data */
+ unsigned short rn_length; /* length of resource data */
+ unsigned short rn_flags; /* resource flags */
+ unsigned short rn_id; /* resource name id */
+ unsigned short rn_handle; /* If loaded, then global handle */
+ unsigned short rn_usage; /* Initially zero. Number of times */
+ /* the handle for this resource has */
+ /* been given out */
+ };
+
+#define RN_OFFSET( x ) (x).rn_offset
+#define RN_LENGTH( x ) (x).rn_length
+#define RN_FLAGS( x ) (x).rn_flags
+#define RN_ID( x ) (x).rn_id
+#define RN_HANDLE( x ) (x).rn_handle
+#define RN_USAGE( x ) (x).rn_usage
+
+#define RSORDID 0x8000 /* if high bit of ID set then integer id */
+ /* otherwise ID is offset of string from
+ the beginning of the resource table */
+
+ /* Ideally these are the same as the */
+ /* corresponding segment flags */
+#define RNMOVE 0x0010 /* Moveable resource */
+#define RNPURE 0x0020 /* Pure (read-only) resource */
+#define RNPRELOAD 0x0040 /* Preloaded resource */
+#define RNDISCARD 0x1000 /* Discard bit for resource */
+
+#define RNLOADED 0x0004 /* True if handler proc return handle */
+
+/* Resource table */
+struct new_rsrc
+ {
+ unsigned short rs_align; /* alignment shift count for resources */
+ struct rsrc_typeinfo rs_typeinfo;
+ };
+
+#define RS_ALIGN( x ) (x).rs_align
diff --git a/private/oleauto/src/typelib/ntimage.h b/private/oleauto/src/typelib/ntimage.h
new file mode 100644
index 000000000..43a9bd479
--- /dev/null
+++ b/private/oleauto/src/typelib/ntimage.h
@@ -0,0 +1,968 @@
+/*++ BUILD Version: 0004 // Increment this if a change has global effects
+
+Copyright (c) 1989-1993 Microsoft Corporation
+
+Module Name:
+
+ ntimage.h
+
+Abstract:
+
+ This is the include file that describes all image structures.
+
+Author:
+
+ Mike O'Leary (mikeol) 21-Mar-1991
+
+Revision History:
+
+--*/
+
+#ifndef _NTIMAGE_
+#define _NTIMAGE_
+
+//
+// Define the linker version number. This is temporary to aid
+// in debugging with people trying to load images built with
+// an older linker. This is not required in the final product.
+//
+
+#define IMAGE_MAJOR_LINKER_VERSION 2
+
+// begin_winnt
+
+
+//
+// Image Format
+//
+
+#ifndef RC_INVOKED
+#pragma pack (1)
+#endif // !RC_INVOKED
+
+#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
+#define IMAGE_OS2_SIGNATURE 0x454E // NE
+#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
+#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
+
+typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
+ USHORT e_magic; // Magic number
+ USHORT e_cblp; // Bytes on last page of file
+ USHORT e_cp; // Pages in file
+ USHORT e_crlc; // Relocations
+ USHORT e_cparhdr; // Size of header in paragraphs
+ USHORT e_minalloc; // Minimum extra paragraphs needed
+ USHORT e_maxalloc; // Maximum extra paragraphs needed
+ USHORT e_ss; // Initial (relative) SS value
+ USHORT e_sp; // Initial SP value
+ USHORT e_csum; // Checksum
+ USHORT e_ip; // Initial IP value
+ USHORT e_cs; // Initial (relative) CS value
+ USHORT e_lfarlc; // File address of relocation table
+ USHORT e_ovno; // Overlay number
+ USHORT e_res[4]; // Reserved words
+ USHORT e_oemid; // OEM identifier (for e_oeminfo)
+ USHORT e_oeminfo; // OEM information; e_oemid specific
+ USHORT e_res2[10]; // Reserved words
+ LONG e_lfanew; // File address of new exe header
+ } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
+
+typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header
+ USHORT ne_magic; // Magic number
+ CHAR ne_ver; // Version number
+ CHAR ne_rev; // Revision number
+ USHORT ne_enttab; // Offset of Entry Table
+ USHORT ne_cbenttab; // Number of bytes in Entry Table
+ LONG ne_crc; // Checksum of whole file
+ USHORT ne_flags; // Flag word
+ USHORT ne_autodata; // Automatic data segment number
+ USHORT ne_heap; // Initial heap allocation
+ USHORT ne_stack; // Initial stack allocation
+ LONG ne_csip; // Initial CS:IP setting
+ LONG ne_sssp; // Initial SS:SP setting
+ USHORT ne_cseg; // Count of file segments
+ USHORT ne_cmod; // Entries in Module Reference Table
+ USHORT ne_cbnrestab; // Size of non-resident name table
+ USHORT ne_segtab; // Offset of Segment Table
+ USHORT ne_rsrctab; // Offset of Resource Table
+ USHORT ne_restab; // Offset of resident name table
+ USHORT ne_modtab; // Offset of Module Reference Table
+ USHORT ne_imptab; // Offset of Imported Names Table
+ LONG ne_nrestab; // Offset of Non-resident Names Table
+ USHORT ne_cmovent; // Count of movable entries
+ USHORT ne_align; // Segment alignment shift count
+ USHORT ne_cres; // Count of resource segments
+ UCHAR ne_exetyp; // Target Operating system
+ UCHAR ne_flagsothers; // Other .EXE flags
+ USHORT ne_pretthunks; // offset to return thunks
+ USHORT ne_psegrefbytes; // offset to segment ref. bytes
+ USHORT ne_swaparea; // Minimum code swap area size
+ USHORT ne_expver; // Expected Windows version number
+ } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
+
+//
+// File header format.
+//
+
+typedef struct _IMAGE_FILE_HEADER {
+ USHORT Machine;
+ USHORT NumberOfSections;
+ ULONG TimeDateStamp;
+ ULONG PointerToSymbolTable;
+ ULONG NumberOfSymbols;
+ USHORT SizeOfOptionalHeader;
+ USHORT Characteristics;
+} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
+
+#define IMAGE_SIZEOF_FILE_HEADER 20
+
+#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.
+#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references).
+#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.
+#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.
+#define IMAGE_FILE_MINIMAL_OBJECT 0x0010 // Reserved.
+#define IMAGE_FILE_UPDATE_OBJECT 0x0020 // Reserved.
+#define IMAGE_FILE_16BIT_MACHINE 0x0040 // 16 bit word machine.
+#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed.
+#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
+#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file
+#define IMAGE_FILE_PATCH 0x0400 // Reserved.
+#define IMAGE_FILE_SYSTEM 0x1000 // System File.
+#define IMAGE_FILE_DLL 0x2000 // File is a DLL.
+#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed.
+
+#define IMAGE_FILE_MACHINE_UNKNOWN 0
+#define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386.
+#define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian
+#define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian
+#define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP
+
+//
+// Directory format.
+//
+
+typedef struct _IMAGE_DATA_DIRECTORY {
+ ULONG VirtualAddress;
+ ULONG Size;
+} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
+
+#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
+
+//
+// Optional header format.
+//
+
+typedef struct _IMAGE_OPTIONAL_HEADER {
+ //
+ // Standard fields.
+ //
+
+ USHORT Magic;
+ UCHAR MajorLinkerVersion;
+ UCHAR MinorLinkerVersion;
+ ULONG SizeOfCode;
+ ULONG SizeOfInitializedData;
+ ULONG SizeOfUninitializedData;
+ ULONG AddressOfEntryPoint;
+ ULONG BaseOfCode;
+ ULONG BaseOfData;
+
+ //
+ // NT additional fields.
+ //
+
+ ULONG ImageBase;
+ ULONG SectionAlignment;
+ ULONG FileAlignment;
+ USHORT MajorOperatingSystemVersion;
+ USHORT MinorOperatingSystemVersion;
+ USHORT MajorImageVersion;
+ USHORT MinorImageVersion;
+ USHORT MajorSubsystemVersion;
+ USHORT MinorSubsystemVersion;
+ ULONG Reserved1;
+ ULONG SizeOfImage;
+ ULONG SizeOfHeaders;
+ ULONG CheckSum;
+ USHORT Subsystem;
+ USHORT DllCharacteristics;
+ ULONG SizeOfStackReserve;
+ ULONG SizeOfStackCommit;
+ ULONG SizeOfHeapReserve;
+ ULONG SizeOfHeapCommit;
+ ULONG LoaderFlags;
+ ULONG NumberOfRvaAndSizes;
+ IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
+} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
+
+typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
+ USHORT Magic;
+ UCHAR MajorLinkerVersion;
+ UCHAR MinorLinkerVersion;
+ ULONG SizeOfCode;
+ ULONG SizeOfInitializedData;
+ ULONG SizeOfUninitializedData;
+ ULONG AddressOfEntryPoint;
+ ULONG BaseOfCode;
+ ULONG BaseOfData;
+ ULONG BaseOfBss;
+ ULONG GprMask;
+ ULONG CprMask[4];
+ ULONG GpValue;
+} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
+
+#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56
+#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28
+#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224
+
+#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
+#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
+
+typedef struct _IMAGE_NT_HEADERS {
+ ULONG Signature;
+ IMAGE_FILE_HEADER FileHeader;
+ IMAGE_OPTIONAL_HEADER OptionalHeader;
+} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
+
+typedef struct _IMAGE_ROM_HEADERS {
+ IMAGE_FILE_HEADER FileHeader;
+ IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
+} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
+
+#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \
+ ((ULONG)ntheader + \
+ FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
+ ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \
+ ))
+
+
+// Subsystem Values
+
+#define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
+#define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem.
+#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem.
+#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem.
+#define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem.
+#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image run in the Posix character subsystem.
+
+// Dll Characteristics
+
+#define IMAGE_LIBRARY_PROCESS_INIT 1 // Dll has a process initialization routine.
+#define IMAGE_LIBRARY_PROCESS_TERM 2 // Dll has a thread termination routine.
+#define IMAGE_LIBRARY_THREAD_INIT 4 // Dll has a thread initialization routine.
+#define IMAGE_LIBRARY_THREAD_TERM 8 // Dll has a thread termination routine.
+
+//
+// Loader Flags
+//
+
+#define IMAGE_LOADER_FLAGS_BREAK_ON_LOAD 0x00000001
+#define IMAGE_LOADER_FLAGS_DEBUG_ON_LOAD 0x00000002
+
+
+// Directory Entries
+
+#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
+#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
+#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
+#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
+#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
+#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
+#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
+#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String
+#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP)
+#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
+#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
+
+//
+// Section header format.
+//
+
+#define IMAGE_SIZEOF_SHORT_NAME 8
+
+typedef struct _IMAGE_SECTION_HEADER {
+ UCHAR Name[IMAGE_SIZEOF_SHORT_NAME];
+ union {
+ ULONG PhysicalAddress;
+ ULONG VirtualSize;
+ } Misc;
+ ULONG VirtualAddress;
+ ULONG SizeOfRawData;
+ ULONG PointerToRawData;
+ ULONG PointerToRelocations;
+ ULONG PointerToLinenumbers;
+ USHORT NumberOfRelocations;
+ USHORT NumberOfLinenumbers;
+ ULONG Characteristics;
+} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
+
+#define IMAGE_SIZEOF_SECTION_HEADER 40
+
+#define IMAGE_SCN_TYPE_REGULAR 0x00000000 //
+#define IMAGE_SCN_TYPE_DUMMY 0x00000001 // Reserved.
+#define IMAGE_SCN_TYPE_NO_LOAD 0x00000002 // Reserved.
+#define IMAGE_SCN_TYPE_GROUPED 0x00000004 // Used for 16-bit offset code.
+#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.
+#define IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved.
+
+#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
+#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
+#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
+
+#define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved.
+#define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.
+#define IMAGE_SCN_LNK_OVERLAY 0x00000400 // Section contains an overlay.
+#define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.
+#define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat.
+
+#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 //
+#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 //
+#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 //
+#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 //
+#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified.
+#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 //
+#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 //
+
+#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
+#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
+#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
+#define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
+#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
+#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
+#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
+
+//
+// Symbol format.
+//
+
+typedef struct _IMAGE_SYMBOL {
+ union {
+ UCHAR ShortName[8];
+ struct {
+ ULONG Short; // if 0, use LongName
+ ULONG Long; // offset into string table
+ } Name;
+ PUCHAR LongName[2];
+ } N;
+ ULONG Value;
+ SHORT SectionNumber;
+ USHORT Type;
+ UCHAR StorageClass;
+ UCHAR NumberOfAuxSymbols;
+} IMAGE_SYMBOL;
+typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;
+
+#define IMAGE_SIZEOF_SYMBOL 18
+
+//
+// Section values.
+//
+// Symbols have a section number of the section in which they are
+// defined. Otherwise, section numbers have the following meanings:
+//
+
+#define IMAGE_SYM_UNDEFINED (SHORT)0 // Symbol is undefined or is common.
+#define IMAGE_SYM_ABSOLUTE (SHORT)-1 // Symbol is an absolute value.
+#define IMAGE_SYM_DEBUG (SHORT)-2 // Symbol is a special debug item.
+
+//
+// Type (fundamental) values.
+//
+
+#define IMAGE_SYM_TYPE_NULL 0 // no type.
+#define IMAGE_SYM_TYPE_VOID 1 //
+#define IMAGE_SYM_TYPE_CHAR 2 // type character.
+#define IMAGE_SYM_TYPE_SHORT 3 // type short integer.
+#define IMAGE_SYM_TYPE_INT 4 //
+#define IMAGE_SYM_TYPE_LONG 5 //
+#define IMAGE_SYM_TYPE_FLOAT 6 //
+#define IMAGE_SYM_TYPE_DOUBLE 7 //
+#define IMAGE_SYM_TYPE_STRUCT 8 //
+#define IMAGE_SYM_TYPE_UNION 9 //
+#define IMAGE_SYM_TYPE_ENUM 10 // enumeration.
+#define IMAGE_SYM_TYPE_MOE 11 // member of enumeration.
+#define IMAGE_SYM_TYPE_UCHAR 12 //
+#define IMAGE_SYM_TYPE_USHORT 13 //
+#define IMAGE_SYM_TYPE_UINT 14 //
+#define IMAGE_SYM_TYPE_ULONG 15 //
+
+//
+// Type (derived) values.
+//
+
+#define IMAGE_SYM_DTYPE_NULL 0 // no derived type.
+#define IMAGE_SYM_DTYPE_POINTER 1 // pointer.
+#define IMAGE_SYM_DTYPE_FUNCTION 2 // function.
+#define IMAGE_SYM_DTYPE_ARRAY 3 // array.
+
+//
+// Storage classes.
+//
+
+#define IMAGE_SYM_CLASS_END_OF_FUNCTION (UCHAR)-1
+#define IMAGE_SYM_CLASS_NULL 0
+#define IMAGE_SYM_CLASS_AUTOMATIC 1
+#define IMAGE_SYM_CLASS_EXTERNAL 2
+#define IMAGE_SYM_CLASS_STATIC 3
+#define IMAGE_SYM_CLASS_REGISTER 4
+#define IMAGE_SYM_CLASS_EXTERNAL_DEF 5
+#define IMAGE_SYM_CLASS_LABEL 6
+#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7
+#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8
+#define IMAGE_SYM_CLASS_ARGUMENT 9
+#define IMAGE_SYM_CLASS_STRUCT_TAG 10
+#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11
+#define IMAGE_SYM_CLASS_UNION_TAG 12
+#define IMAGE_SYM_CLASS_TYPE_DEFINITION 13
+#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14
+#define IMAGE_SYM_CLASS_ENUM_TAG 15
+#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16
+#define IMAGE_SYM_CLASS_REGISTER_PARAM 17
+#define IMAGE_SYM_CLASS_BIT_FIELD 18
+#define IMAGE_SYM_CLASS_BLOCK 100
+#define IMAGE_SYM_CLASS_FUNCTION 101
+#define IMAGE_SYM_CLASS_END_OF_STRUCT 102
+#define IMAGE_SYM_CLASS_FILE 103
+// new
+#define IMAGE_SYM_CLASS_SECTION 104
+#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105
+
+// type packing constants
+
+#define N_BTMASK 017
+#define N_TMASK 060
+#define N_TMASK1 0300
+#define N_TMASK2 0360
+#define N_BTSHFT 4
+#define N_TSHIFT 2
+
+// MACROS
+
+// Basic Type of x
+#define BTYPE(x) ((x) & N_BTMASK)
+
+// Is x a pointer?
+#ifndef ISPTR
+#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
+#endif
+
+// Is x a function?
+#ifndef ISFCN
+#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
+#endif
+
+// Is x an array?
+
+#ifndef ISARY
+#define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))
+#endif
+
+// Is x a structure, union, or enumeration TAG?
+#ifndef ISTAG
+#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)
+#endif
+
+#ifndef INCREF
+#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
+#endif
+#ifndef DECREF
+#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
+#endif
+
+//
+// Auxiliary entry format.
+//
+
+typedef union _IMAGE_AUX_SYMBOL {
+ struct {
+ ULONG TagIndex; // struct, union, or enum tag index
+ union {
+ struct {
+ USHORT Linenumber; // declaration line number
+ USHORT Size; // size of struct, union, or enum
+ } LnSz;
+ ULONG TotalSize;
+ } Misc;
+ union {
+ struct { // if ISFCN, tag, or .bb
+ ULONG PointerToLinenumber;
+ ULONG PointerToNextFunction;
+ } Function;
+ struct { // if ISARY, up to 4 dimen.
+ USHORT Dimension[4];
+ } Array;
+ } FcnAry;
+ USHORT TvIndex; // tv index
+ } Sym;
+ struct {
+ UCHAR Name[IMAGE_SIZEOF_SYMBOL];
+ } File;
+ struct {
+ ULONG Length; // section length
+ USHORT NumberOfRelocations; // number of relocation entries
+ USHORT NumberOfLinenumbers; // number of line numbers
+ ULONG CheckSum; // checksum for communal
+ SHORT Number; // section number to associate with
+ UCHAR Selection; // communal selection type
+ } Section;
+} IMAGE_AUX_SYMBOL;
+typedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL;
+
+#define IMAGE_SIZEOF_AUX_SYMBOL 18
+
+//
+// Communal selection types.
+//
+
+#define IMAGE_COMDAT_SELECT_UNKNOWN 0
+#define IMAGE_COMDAT_SELECT_NODUPLICATES 1
+#define IMAGE_COMDAT_SELECT_ANY 2
+#define IMAGE_COMDAT_SELECT_SAME_SIZE 3
+#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
+#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
+
+#define IMAGE_WEAK_EXTERN_SEARCH_UNKNOWN 0
+#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
+#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
+
+
+//
+// Relocation format.
+//
+
+typedef struct _IMAGE_RELOCATION {
+ ULONG VirtualAddress;
+ ULONG SymbolTableIndex;
+ USHORT Type;
+} IMAGE_RELOCATION;
+typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;
+
+#define IMAGE_SIZEOF_RELOCATION 10
+
+//
+// I386 relocation types.
+//
+
+#define IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary
+#define IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address
+#define IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address
+#define IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address
+#define IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included
+#define IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
+#define IMAGE_REL_I386_SECTION 012
+#define IMAGE_REL_I386_SECREL 013
+#define IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address
+
+//
+// MIPS relocation types.
+//
+
+#define IMAGE_REL_MIPS_ABSOLUTE 0 // Reference is absolute, no relocation is necessary
+#define IMAGE_REL_MIPS_REFHALF 01
+#define IMAGE_REL_MIPS_REFWORD 02
+#define IMAGE_REL_MIPS_JMPADDR 03
+#define IMAGE_REL_MIPS_REFHI 04
+#define IMAGE_REL_MIPS_REFLO 05
+#define IMAGE_REL_MIPS_GPREL 06
+#define IMAGE_REL_MIPS_LITERAL 07
+#define IMAGE_REL_MIPS_SECTION 012
+#define IMAGE_REL_MIPS_SECREL 013
+#define IMAGE_REL_MIPS_REFWORDNB 042
+#define IMAGE_REL_MIPS_PAIR 045
+
+//
+// Alpha Relocation types.
+//
+
+#define IMAGE_REL_ALPHA_ABSOLUTE 0x0
+#define IMAGE_REL_ALPHA_REFLONG 0x1
+#define IMAGE_REL_ALPHA_REFQUAD 0x2
+#define IMAGE_REL_ALPHA_GPREL32 0x3
+#define IMAGE_REL_ALPHA_LITERAL 0x4
+#define IMAGE_REL_ALPHA_LITUSE 0x5
+#define IMAGE_REL_ALPHA_GPDISP 0x6
+#define IMAGE_REL_ALPHA_BRADDR 0x7
+#define IMAGE_REL_ALPHA_HINT 0x8
+#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x9
+#define IMAGE_REL_ALPHA_REFHI 0xA
+#define IMAGE_REL_ALPHA_REFLO 0xB
+#define IMAGE_REL_ALPHA_PAIR 0xC
+#define IMAGE_REL_ALPHA_MATCH 0xD
+#define IMAGE_REL_ALPHA_SECTION 0xE
+#define IMAGE_REL_ALPHA_SECREL 0xF
+#define IMAGE_REL_ALPHA_REFLONGNB 0x10
+
+//
+// Based relocation format.
+//
+
+typedef struct _IMAGE_BASE_RELOCATION {
+ ULONG VirtualAddress;
+ ULONG SizeOfBlock;
+// USHORT TypeOffset[1];
+} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
+
+#define IMAGE_SIZEOF_BASE_RELOCATION 8
+
+//
+// Based relocation types.
+//
+
+#define IMAGE_REL_BASED_ABSOLUTE 0
+#define IMAGE_REL_BASED_HIGH 1
+#define IMAGE_REL_BASED_LOW 2
+#define IMAGE_REL_BASED_HIGHLOW 3
+#define IMAGE_REL_BASED_HIGHADJ 4
+#define IMAGE_REL_BASED_MIPS_JMPADDR 5
+
+//
+// Line number format.
+//
+
+typedef struct _IMAGE_LINENUMBER {
+ union {
+ ULONG SymbolTableIndex; // Symbol table index of function name if Linenumber is 0.
+ ULONG VirtualAddress; // Virtual address of line number.
+ } Type;
+ USHORT Linenumber; // Line number.
+} IMAGE_LINENUMBER;
+typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;
+
+#define IMAGE_SIZEOF_LINENUMBER 6
+
+//
+// Archive format.
+//
+
+#define IMAGE_ARCHIVE_START_SIZE 8
+#define IMAGE_ARCHIVE_START "!<arch>\n"
+#define IMAGE_ARCHIVE_END "`\n"
+#define IMAGE_ARCHIVE_PAD "\n"
+#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
+#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
+
+typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
+ UCHAR Name[16]; // File member name - `/' terminated.
+ UCHAR Date[12]; // File member date - decimal.
+ UCHAR UserID[6]; // File member user id - decimal.
+ UCHAR GroupID[6]; // File member group id - decimal.
+ UCHAR Mode[8]; // File member mode - octal.
+ UCHAR Size[10]; // File member size - decimal.
+ UCHAR EndHeader[2]; // String to end header.
+} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
+
+#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
+
+//
+// DLL support.
+//
+
+//
+// Export Format
+//
+
+typedef struct _IMAGE_EXPORT_DIRECTORY {
+ ULONG Characteristics;
+ ULONG TimeDateStamp;
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ ULONG Name;
+ ULONG Base;
+ ULONG NumberOfFunctions;
+ ULONG NumberOfNames;
+ PULONG *AddressOfFunctions;
+ PULONG *AddressOfNames;
+ PUSHORT *AddressOfNameOrdinals;
+} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
+
+//
+// Import Format
+//
+
+typedef struct _IMAGE_IMPORT_BY_NAME {
+ USHORT Hint;
+ UCHAR Name[1];
+} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
+
+typedef struct _IMAGE_THUNK_DATA {
+ union {
+ PULONG Function;
+ ULONG Ordinal;
+ PIMAGE_IMPORT_BY_NAME AddressOfData;
+ } u1;
+} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA;
+
+#define IMAGE_ORDINAL_FLAG 0x80000000
+#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
+#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
+
+typedef struct _IMAGE_IMPORT_DESCRIPTOR {
+ ULONG Characteristics;
+ ULONG TimeDateStamp;
+ ULONG ForwarderChain;
+ ULONG Name;
+ PIMAGE_THUNK_DATA FirstThunk;
+} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
+
+#if 0
+//
+// Thread Local Storage
+//
+
+typedef VOID
+(NTAPI *PIMAGE_TLS_CALLBACK) (
+ PVOID DllHandle,
+ ULONG Reason,
+ PVOID Reserved
+ );
+
+typedef struct _IMAGE_TLS_DIRECTORY {
+ ULONG StartAddressOfRawData;
+ ULONG EndAddressOfRawData;
+ PULONG AddressOfIndex;
+ PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
+ ULONG SizeOfZeroFill;
+ ULONG Characteristics;
+} IMAGE_TLS_DIRECTORY, *PIMAGE_TLS_DIRECTORY;
+#endif //0
+
+
+//
+// Resource Format.
+//
+
+//
+// Resource directory consists of two counts, following by a variable length
+// array of directory entries. The first count is the number of entries at
+// beginning of the array that have actual names associated with each entry.
+// The entries are in ascending order, case insensitive strings. The second
+// count is the number of entries that immediately follow the named entries.
+// This second count identifies the number of entries that have 31-bit integer
+// Ids as their name. These entries are also sorted in ascending order.
+//
+// This structure allows fast lookup by either name or number, but for any
+// given resource entry only one form of lookup is supported, not both.
+// This is consistant with the syntax of the .RC file and the .RES file.
+//
+
+typedef struct _IMAGE_RESOURCE_DIRECTORY {
+ ULONG Characteristics;
+ ULONG TimeDateStamp;
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ USHORT NumberOfNamedEntries;
+ USHORT NumberOfIdEntries;
+// IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
+} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
+
+#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
+#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
+
+//
+// Each directory contains the 32-bit Name of the entry and an offset,
+// relative to the beginning of the resource directory of the data associated
+// with this directory entry. If the name of the entry is an actual text
+// string instead of an integer Id, then the high order bit of the name field
+// is set to one and the low order 31-bits are an offset, relative to the
+// beginning of the resource directory of the string, which is of type
+// IMAGE_RESOURCE_DIRECTORY_STRING. Otherwise the high bit is clear and the
+// low-order 31-bits are the integer Id that identify this resource directory
+// entry. If the directory entry is yet another resource directory (i.e. a
+// subdirectory), then the high order bit of the offset field will be
+// set to indicate this. Otherwise the high bit is clear and the offset
+// field points to a resource data entry.
+//
+
+typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
+ ULONG Name;
+ ULONG OffsetToData;
+} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
+
+//
+// For resource directory entries that have actual string names, the Name
+// field of the directory entry points to an object of the following type.
+// All of these string objects are stored together after the last resource
+// directory entry and before the first resource data object. This minimizes
+// the impact of these variable length objects on the alignment of the fixed
+// size directory entry objects.
+//
+
+typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
+ USHORT Length;
+ CHAR NameString[ 1 ];
+} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
+
+
+typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
+ USHORT Length;
+ WCHAR NameString[ 1 ];
+} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
+
+
+//
+// Each resource data entry describes a leaf node in the resource directory
+// tree. It contains an offset, relative to the beginning of the resource
+// directory of the data for the resource, a size field that gives the number
+// of bytes of data at that offset, a CodePage that should be used when
+// decoding code point values within the resource data. Typically for new
+// applications the code page would be the unicode code page.
+//
+
+typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
+ ULONG OffsetToData;
+ ULONG Size;
+ ULONG CodePage;
+ ULONG Reserved;
+} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
+
+//
+// Load Configuration Directory Entry
+//
+
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
+ ULONG Characteristics;
+ ULONG TimeDateStamp;
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ ULONG GlobalFlagsClear;
+ ULONG GlobalFlagsSet;
+ ULONG CriticalSectionDefaultTimeout;
+ ULONG DeCommitFreeBlockThreshold;
+ ULONG DeCommitTotalFreeThreshold;
+ PVOID LockPrefixTable;
+ ULONG MaximumAllocationSize;
+ ULONG VirtualMemoryThreshold;
+ ULONG Reserved[ 5 ];
+} IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;
+
+
+//
+// Function table entry format for MIPS/ALPHA images. Function table is
+// pointed to by the IMAGE_DIRECTORY_ENTRY_EXCEPTION directory entry.
+// This definition duplicates ones in ntmips.h and ntalpha.h for use
+// by portable image file mungers.
+//
+
+typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
+ ULONG BeginAddress;
+ ULONG EndAddress;
+ PVOID ExceptionHandler;
+ PVOID HandlerData;
+ ULONG PrologEndAddress;
+} IMAGE_RUNTIME_FUNCTION_ENTRY, *PIMAGE_RUNTIME_FUNCTION_ENTRY;
+
+//
+// Debug Format
+//
+
+typedef struct _IMAGE_DEBUG_DIRECTORY {
+ ULONG Characteristics;
+ ULONG TimeDateStamp;
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ ULONG Type;
+ ULONG SizeOfData;
+ ULONG AddressOfRawData;
+ ULONG PointerToRawData;
+} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
+
+#define IMAGE_DEBUG_TYPE_UNKNOWN 0
+#define IMAGE_DEBUG_TYPE_COFF 1
+#define IMAGE_DEBUG_TYPE_CODEVIEW 2
+#define IMAGE_DEBUG_TYPE_FPO 3
+#define IMAGE_DEBUG_TYPE_MISC 4
+#define IMAGE_DEBUG_TYPE_EXCEPTION 5
+#define IMAGE_DEBUG_TYPE_FIXUP 6
+#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
+#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
+
+typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
+ ULONG NumberOfSymbols;
+ ULONG LvaToFirstSymbol;
+ ULONG NumberOfLinenumbers;
+ ULONG LvaToFirstLinenumber;
+ ULONG RvaToFirstByteOfCode;
+ ULONG RvaToLastByteOfCode;
+ ULONG RvaToFirstByteOfData;
+ ULONG RvaToLastByteOfData;
+} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
+
+#define FRAME_FPO 0
+#define FRAME_TRAP 1
+#define FRAME_TSS 2
+
+typedef struct _FPO_DATA {
+ ULONG ulOffStart; // offset 1st byte of function code
+ ULONG cbProcSize; // # bytes in function
+ ULONG cdwLocals; // # bytes in locals/4
+ USHORT cdwParams; // # bytes in params/4
+ USHORT cbProlog : 8; // # bytes in prolog
+ USHORT cbRegs : 3; // # regs saved
+ USHORT fHasSEH : 1; // TRUE if SEH in func
+ USHORT fUseBP : 1; // TRUE if EBP has been allocated
+ USHORT reserved : 1; // reserved for future use
+ USHORT cbFrame : 2; // frame type
+} FPO_DATA, *PFPO_DATA;
+#define SIZEOF_RFPO_DATA 16
+
+
+#define IMAGE_DEBUG_MISC_EXENAME 1
+
+typedef struct _IMAGE_DEBUG_MISC {
+ ULONG DataType; // type of misc data, see defines
+ ULONG Length; // total length of record, rounded to four
+ // byte multiple.
+ BOOLEAN Unicode; // TRUE if data is unicode string
+ UCHAR Reserved[ 3 ];
+ UCHAR Data[ 1 ]; // Actual data
+} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
+
+
+//
+// Debugging information can be stripped from an image file and placed
+// in a separate .DBG file, whose file name part is the same as the
+// image file name part (e.g. symbols for CMD.EXE could be stripped
+// and placed in CMD.DBG). This is indicated by the IMAGE_FILE_DEBUG_STRIPPED
+// flag in the Characteristics field of the file header. The beginning of
+// the .DBG file contains the following structure which captures certain
+// information from the image file. This allows a debug to proceed even if
+// the original image file is not accessable. This header is followed by
+// zero of more IMAGE_SECTION_HEADER structures, followed by zero or more
+// IMAGE_DEBUG_DIRECTORY structures. The latter structures and those in
+// the image file contain file offsets relative to the beginning of the
+// .DBG file.
+//
+// If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure
+// is left in the image file, but not mapped. This allows a debugger to
+// compute the name of the .DBG file, from the name of the image in the
+// IMAGE_DEBUG_MISC structure.
+//
+
+typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
+ USHORT Signature;
+ USHORT Flags;
+ USHORT Machine;
+ USHORT Characteristics;
+ ULONG TimeDateStamp;
+ ULONG CheckSum;
+ ULONG ImageBase;
+ ULONG SizeOfImage;
+ ULONG NumberOfSections;
+ ULONG ExportedNamesSize;
+ ULONG DebugDirectorySize;
+ ULONG Reserved[ 3 ];
+} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
+
+#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
+
+#ifndef RC_INVOKED
+#pragma pack ()
+#endif // !RC_INVOKED
+
+//
+// End Image Format
+//
+
+// end_winnt
+
+#endif // _NTIMAGE_
diff --git a/private/oleauto/src/typelib/ntstring.cxx b/private/oleauto/src/typelib/ntstring.cxx
new file mode 100644
index 000000000..e21a31f4e
--- /dev/null
+++ b/private/oleauto/src/typelib/ntstring.cxx
@@ -0,0 +1,397 @@
+/***
+* ntstring.cxx - Multibyte interface to Wide Character APIs
+*
+* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Purpose:
+* This module provides handy functions which can be used to manipulate
+* LPOLESTR strings on both Win32 (Unicode) and Win16/Mac (Ansi)
+*
+* Revision History:
+*
+* [00] 12-Aug-93 w-barryb: Module created.
+* [01] 22-Jun-94 barrybo: Revived for Chicago/Daytona unicode
+*
+* Implementation Notes:
+*
+*****************************************************************************/
+
+#include <errno.h>
+#include <sys/stat.h>
+#include "silver.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+#if !OE_WIN32
+#error This file is NT-only
+#endif //!OE_WIN32
+
+#include "debug.h"
+#include "ntstring.h"
+#include "winerror.h"
+#include "mem.hxx" // for MemAlloc, MemFree
+#include "convert.hxx"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+static char szNtString[] = __FILE__;
+#define SZ_FILE_NAME szNtString
+#endif
+
+#ifdef _X86_
+extern "C" BOOL g_fChicago;
+#endif //_X86_
+
+
+
+
+
+
+
+
+
+
+LONG APIENTRY oRegSetValue (HKEY hKey, LPCWSTR lpSubKey, DWORD dwType, LPCWSTR lpData, DWORD cbData)
+{
+ DebAssert(lpSubKey == NULL, "lpSubKey is not required by our callers");
+
+#ifdef _X86_
+ if (g_fChicago) {
+ LPSTR szAnsi;
+ int cbAnsi;
+ LONG ret;
+
+ cbAnsi = WideCharToMultiByte(CP_ACP, 0, lpData, cbData, NULL, 0, NULL, NULL);
+ if (cbAnsi == 0)
+ return NULL;
+
+ szAnsi = (LPSTR)MemAlloc(cbAnsi);
+ if (szAnsi == NULL)
+ return NULL;
+
+ if (WideCharToMultiByte(CP_ACP, 0, lpData, cbData, szAnsi, cbAnsi, NULL, NULL) == 0) {
+ MemFree(szAnsi);
+ return NULL;
+ }
+
+ ret = RegSetValueA(hKey, NULL /* lpSubKey */, dwType, szAnsi, cbAnsi);
+
+ MemFree(szAnsi);
+
+ return ret;
+
+ } else
+#endif //_X86_
+ return RegSetValueW(hKey, lpSubKey, dwType, lpData, cbData);
+}
+
+DWORD APIENTRY oWNetGetConnection (LPCWSTR lpLocalName, LPWSTR lpRemoteName, LPDWORD lpnLength)
+{
+ UINT drivetype;
+
+ DebAssert(*lpnLength == 40, "All callers pass a fixed-length string");
+ DebAssert(wcslen(lpLocalName) == 2, "All callers pass a fixed-length string");
+ DebAssert(lpLocalName[1] == ':', "All callers pass a drive letter only");
+
+
+#ifdef _X86_
+ if (g_fChicago) {
+ CHAR szRemoteName[40];
+ CHAR szLocalName[4];
+ DWORD ret;
+
+ if (WideCharToMultiByte(CP_ACP, 0, lpLocalName, 2, szLocalName, sizeof(szLocalName), NULL, NULL) == 0)
+ return ERROR_MORE_DATA;
+
+ // Performance: WNetGetConnection is slow, so call GetDriveType do
+ // determine if the drive letter is really a local drive or not.
+ szLocalName[2] = '\\'; // GetDriveType expects a root dir (ie.
+ szLocalName[3] = '\0';
+ drivetype = GetDriveType(szLocalName);
+ szLocalName[2] = '\0'; // WNetGetConnection wants a drive and a colon only.
+
+ if ( DRIVE_FIXED == drivetype ||
+ DRIVE_CDROM == drivetype ||
+ DRIVE_RAMDISK == drivetype ||
+ DRIVE_REMOVABLE == drivetype) {
+ return ERROR_NOT_CONNECTED;
+ }
+
+ ret = WNetGetConnectionA(szLocalName, szRemoteName, lpnLength);
+
+ if (ret != NO_ERROR)
+ return ret;
+
+ if (MultiByteToWideChar(CP_ACP, 0, szRemoteName, -1, lpRemoteName, *lpnLength) == 0)
+ return ERROR_MORE_DATA;
+
+ return NO_ERROR;
+
+ } else
+#endif //_X86_
+ {
+ OLECHAR szLocalRootDir[4];
+
+ // GetDriveType() must be passed the root directory (ie "C:\")
+ szLocalRootDir[0] = lpLocalName[0];
+ szLocalRootDir[1] = lpLocalName[1];
+ szLocalRootDir[2] = '\\';
+ szLocalRootDir[3] = '\0';
+
+ // Performance: WNetGetConnection is slow, so call GetDriveType do
+ // determine if the drive letter is really a local drive or not.
+ drivetype = GetDriveTypeW(szLocalRootDir);
+
+ if ( DRIVE_FIXED == drivetype ||
+ DRIVE_CDROM == drivetype ||
+ DRIVE_RAMDISK == drivetype ||
+ DRIVE_REMOVABLE == drivetype) {
+ return ERROR_NOT_CONNECTED;
+ }
+
+ return WNetGetConnectionW(lpLocalName, lpRemoteName, lpnLength);
+ }
+}
+
+LONG APIENTRY oRegOpenKey (HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
+{
+#ifdef _X86_
+ if (g_fChicago) {
+ char rgchSubKey[50];
+
+ DebAssert(wcslen(lpSubKey) < 50, "ANSI buffer too small");
+ if (WideCharToMultiByte(CP_ACP, 0, lpSubKey, -1, rgchSubKey, sizeof(rgchSubKey), NULL, NULL) == 0)
+ return ERROR_OUTOFMEMORY;
+
+ return RegOpenKeyA(hKey, rgchSubKey, phkResult);
+
+ } else
+#endif //_X86_
+ return RegOpenKeyW(hKey, lpSubKey, phkResult);
+}
+
+
+#if OE_OB
+STDAPI LoadTypeLibA(const char FAR* szFile, ITypeLib FAR* FAR* pptlib)
+{
+ LPOLESTR lpwstr;
+ HRESULT err;
+
+ err = ConvertStringToW(szFile, &lpwstr);
+ if (err)
+ return err;
+
+ err = LoadTypeLib(lpwstr, pptlib);
+
+ ConvertStringFree((LPSTR)lpwstr);
+
+ return err;
+}
+#endif //EI_OB
+
+#if 0
+STDAPI RegisterTypeLibA(ITypeLib FAR* ptlib, char FAR* szFullPath, char FAR* szHelpDir)
+{
+ LPOLESTR lpwstrPath, lpwstrHelp;
+ HRESULT err;
+
+ err = ConvertStringToW(szFullPath, &lpwstrPath);
+ if (err)
+ return err;
+
+ err = ConvertStringToW(szHelpDir, &lpwstrHelp);
+ if (err) {
+ ConvertStringFree((LPSTR)lpwstrPath);
+ return err;
+ }
+
+ err = RegisterTypeLib(ptlib, lpwstrPath, lpwstrHelp);
+
+ ConvertStringFree((LPSTR)lpwstrPath);
+ ConvertStringFree((LPSTR)lpwstrHelp);
+
+ return err;
+}
+#endif //0
+
+
+
+
+
+
+
+
+
+LONG APIENTRY oRegEnumKey(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
+{
+#ifdef _X86_
+ if (g_fChicago) {
+ LONG ret;
+ LPSTR lpNameA = (LPSTR)MemAlloc(cbName*2);
+
+ if (lpNameA == NULL)
+ return E_OUTOFMEMORY;
+
+ ret = RegEnumKeyA(hKey, dwIndex, lpNameA, cbName*2);
+
+ if (ret == ERROR_SUCCESS)
+ if (MultiByteToWideChar(CP_ACP, 0, lpNameA, -1, lpName, cbName) == 0)
+ ret = E_OUTOFMEMORY;
+
+ MemFree(lpNameA);
+
+ return ret;
+
+ } else
+#endif //_X86_
+ return RegEnumKeyW(hKey, dwIndex, lpName, cbName);
+}
+
+
+
+int ostat(const OLECHAR *pathname, struct _stat *buffer)
+{
+ char oempath[_MAX_PATH+1];
+
+ // translate from Unicode to OEM characters (NOT ANSI!!)
+ if (WideCharToMultiByte(CP_OEMCP, 0, pathname, -1, oempath, _MAX_PATH+1, NULL, NULL) == 0) {
+ return -1;
+ }
+
+#if OE_WIN32 && _X86_
+ // win32s is wierd, and returns 0 for _stat("");
+ if (*oempath == '\0')
+ return -1;
+#endif //OE_WIN32
+ return _stat(oempath, buffer);
+}
+
+
+
+HFILE WINAPI oOpenFile(LPCWSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle)
+{
+ char lpAnsiName[_MAX_PATH+1];
+
+ // convert from Unicode to OEM characters (NOT ANSI!!)
+ if (WideCharToMultiByte(CP_OEMCP, 0, lpFileName, -1, lpAnsiName, _MAX_PATH+1, NULL, NULL) == 0)
+ return HFILE_ERROR; // GetLastError() will report whatever the error was
+
+ return OpenFile(lpAnsiName, lpReOpenBuff, uStyle);
+}
+
+
+
+LONG APIENTRY oRegQueryValue (HKEY hKey, LPCWSTR lpSubKey, LPWSTR lpValue, PLONG lpcbValue)
+{
+ DebAssert(lpValue != NULL, "Querying key size is NYI");
+
+#ifdef _X86_
+ if (g_fChicago) {
+ LONG cbAnsiValue, ret;
+ LPSTR lpSubKeyA;
+ LPSTR lpValueA;
+
+ if (ConvertStringToA(lpSubKey, &lpSubKeyA))
+ return ERROR_OUTOFMEMORY;
+
+ // get the required size of the buffer to receive the Ansi value into
+ ret = RegQueryValueA(hKey, lpSubKeyA, NULL, &cbAnsiValue);
+ if (ret != ERROR_SUCCESS) {
+ ConvertStringFree(lpSubKeyA);
+ return ret;
+ }
+
+ lpValueA = (LPSTR)MemAlloc(cbAnsiValue);
+ if (lpValueA == NULL) {
+ ConvertStringFree(lpSubKeyA);
+ return ERROR_OUTOFMEMORY;
+ }
+
+ ret = RegQueryValueA(hKey, lpSubKeyA, lpValueA, &cbAnsiValue);
+
+ if (ret == ERROR_SUCCESS) {
+ if (MultiByteToWideChar(CP_ACP, 0, lpValueA, cbAnsiValue, lpValue, *lpcbValue) == 0)
+ ret = GetLastError();
+ }
+
+ MemFree(lpValueA);
+ ConvertStringFree(lpSubKeyA);
+
+ return ret;
+ } else
+#endif //_X86_
+ return RegQueryValueW(hKey, lpSubKey, lpValue, lpcbValue);
+}
+
+
+LONG APIENTRY oRegCreateKey (HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
+{
+#ifdef _X86_
+ if (g_fChicago) {
+ LPSTR lpSubKeyA;
+ LONG ret;
+
+ if (ConvertStringToA(lpSubKey, &lpSubKeyA))
+ return ERROR_OUTOFMEMORY;
+
+ ret = RegCreateKeyA(hKey, lpSubKeyA, phkResult);
+
+ ConvertStringFree(lpSubKeyA);
+
+ return ret;
+
+ } else
+#endif //_X86_
+ return RegCreateKeyW(hKey, lpSubKey, phkResult);
+}
+
+
+// defined in CRT.LIB, but not in CRTDLL.LIB
+wchar_t * _CRTAPI1 _ultow (unsigned long val, wchar_t *buf, int radix)
+{
+ char temp[34]; // C help for ultoa says the max. string length is 33 bytes
+
+ _ultoa(val, temp, radix);
+
+ MultiByteToWideChar(CP_ACP, 0, temp, -1, buf, 34);
+
+ return buf;
+}
+
+#if 0 //Dead Code
+// defined in CRT.LIB, but not in CRTDLL.LIB
+wchar_t * _CRTAPI1 _itow (int val, wchar_t *buf, int radix)
+{
+ char temp[18]; // C help for ultoa says the max. string length is 17 bytes
+
+ _itoa(val, temp, radix);
+
+ MultiByteToWideChar(CP_ACP, 0, temp, -1, buf, 18);
+
+ return buf;
+}
+#endif //0
+
+// defined in CRT.LIB, but not in CRTDLL.LIB
+int _CRTAPI1 _wtoi(const wchar_t *nptr)
+{
+ char temp[16]; // big enough for any kind of signed integer value
+
+ WideCharToMultiByte(CP_ACP, 0, nptr, -1, temp, sizeof(temp), NULL, NULL);
+
+ return atoi(temp);
+}
+
+
+#if 0 //Dead Code
+// defined in CRT.LIB, but not in CRTDLL.LIB
+long _CRTAPI1 _wtol(const wchar_t *nptr)
+{
+ char temp[16]; // big enough for any kind of signed long value
+
+ WideCharToMultiByte(CP_ACP, 0, nptr, -1, temp, sizeof(temp), NULL, NULL);
+
+ return atol(temp);
+}
+#endif //0
diff --git a/private/oleauto/src/typelib/ntstring.h b/private/oleauto/src/typelib/ntstring.h
new file mode 100644
index 000000000..510d3d91a
--- /dev/null
+++ b/private/oleauto/src/typelib/ntstring.h
@@ -0,0 +1,153 @@
+/***
+* ntstring.h - Wide Character interface to Multibyte APIs
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+* Purpose:
+* This module provides handy functions which can be used to manipulate
+* LPOLESTR strings on both Win32 (Unicode) and Win16/Mac (Ansi)
+*
+*
+* Revision History:
+*
+* [00] 12-Aug-93 w-barryb: Module created.
+* [01] 22-Jun-94 barrybo: Revived for Chicago/Daytona unicode
+*
+* Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef NTSTRING_H_INCLUDED
+#define NTSTRING_H_INCLUDED
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if OE_WIN32
+
+#define ostrcat wcscat
+#define ostrchr wcschr
+#define ostrcpy wcscpy
+#define ostrlen wcslen
+#define ostricmp wcsicmp
+#define ostrcmp wcscmp
+#define ostrncmp wcsncmp
+#define ostrpbrk wcspbrk
+#define ostrblen(x) wcslen(x) //NOTE: returns count of characters - not BYTES
+#define ostrblen0(x) (wcslen(x)+1) //NOTE: returns count of characters - not BYTES
+#define ostrrchr wcsrchr
+#define ostrncpy wcsncpy
+#define ostrinc(p) ((p)+1)
+#define ostrdec(s,p) ((p)-1)
+#define ostrnicmp wcsnicmp
+#define ostrncat wcsncat
+#define ogetc(p) (*(p))
+
+#define oultoa _ultow
+#define ostrtoul wcstoul
+#define ostrtod wcstod
+#define oisxdigit iswxdigit
+#define oisspace iswspace
+#define oisdigit iswdigit
+#define oatoi _wtoi
+#if 0
+#define oitoa _itow
+#define oatol _wtol
+#endif
+
+
+HFILE WINAPI oOpenFile(LPCWSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle);
+LONG APIENTRY oRegSetValue (HKEY hKey, LPCWSTR lpSubKey, DWORD dwType, LPCWSTR lpData, DWORD cbData);
+LONG APIENTRY oRegQueryValue (HKEY hKey, LPCWSTR lpSubKey, LPWSTR lpValue, PLONG lpcbValue);
+LONG APIENTRY oRegCreateKey (HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult);
+DWORD APIENTRY oWNetGetConnection (LPCWSTR lpLocalName, LPWSTR lpRemoteName, LPDWORD lpnLength);
+LONG APIENTRY oRegOpenKey (HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult);
+OLECHAR oIntlNormCharFromStr(LCID, OLECHAR *, int, OLECHAR **);
+OLECHAR oIntlNormChar(LCID, OLECHAR);
+#define oIntlNormStr IntlNormStrW
+#define LHashValOfNameA(lcid, szName) \
+ LHashValOfNameSysA(SYS_WIN32, lcid, szName)
+LONG APIENTRY oRegEnumKey(HKEY kKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName);
+int ostat(const OLECHAR *pathname, struct _stat *buffer);
+
+#else
+
+#define ostrcat xstrcat
+#define ostrchr xstrchr
+#define ostrcpy xstrcpy
+#define omemset memset
+#define ostrlen xstrlen
+#define ostricmp xstricmp
+#define ostrcmp xstrcmp
+#define ostrncmp xstrncmp
+#define ostrpbrk xstrpbrk
+#define ostrblen(x) xstrblen(x)
+#define ostrblen0(x) xstrblen0(x)
+#define ostrrchr xstrrchr
+#define ostrinc(x) xstrinc(x)
+#define ostrdec(s,p) xstrdec(s,p)
+#define ostrncpy xstrncpy
+#define ostrnicmp xstrnicmp
+#define ostrncat xstrncat
+#define ogetc xgetc
+
+#define oultoa _ultoa
+#define ostrtoul strtoul
+#define ostrtod strtod
+#define oisxdigit isxdigit
+#define oisspace ISSPACE
+#define oisdigit ISDIGIT
+#define oitoa itoa
+#define oatoi atoi
+#define oatol atol
+
+#define oLCMapString LCMapStringA
+#define oGetLocaleInfo GetLocaleInfoA
+#define oCompareString CompareStringA
+#define oFindWindow FindWindow
+#define oVarDateFromStr VarDateFromStr
+#define oVarR8FromStr VarR8FromStr
+#define oVarCyFromStr VarCyFromStr
+#define oRegSetValue RegSetValue
+#define oRegOpenKey RegOpenKey
+#define oRegQueryValue RegQueryValue
+#define oRegCreateKey RegCreateKey
+#define oIntlNormStr IntlNormStr
+#define oIntlNormCharFromStr IntlNormCharFromStr
+#define oIntlNormChar IntlNormChar
+#define LHashValOfNameA LHashValOfName
+#define LHashValOfNameSysA LHashValOfNameSys
+#define RegisterTypeLibA RegisterTypeLib
+#define CreateTypeLibA CreateTypeLib
+#define CLSIDFromStringA CLSIDFromString
+#define StringFromCLSIDA StringFromCLSID
+#define StringFromGUID2A StringFromGUID2
+#define ofullpath _fullpath
+#define oRegEnumKey RegEnumKey
+#define ostat _stat
+#define oLoadLibrary LoadLibrary
+#define oOpenFile OpenFile
+
+// this is a helper even on Win16/Mac (defined in clutil.cxx)
+UINT WINAPI oWNetGetConnection(LPSTR, LPSTR, UINT FAR*);
+
+#if OE_WIN16
+#define oCharUpperBuff AnsiUpperBuff
+#define oCharLowerBuff AnsiLowerBuff
+#else
+#define oCharUpperBuff CharUpperBuff
+#define oCharLowerBuff CharLowerBuff
+#endif
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#endif
diff --git a/private/oleauto/src/typelib/oautil.cxx b/private/oleauto/src/typelib/oautil.cxx
new file mode 100644
index 000000000..79305c612
--- /dev/null
+++ b/private/oleauto/src/typelib/oautil.cxx
@@ -0,0 +1,522 @@
+/**
+*oautil.cxx - OLE Automation-wide utility routines
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Holds all of the per-process and per-thread information for OLE Autmation.
+*
+*Revision History:
+*
+* 23-Nov-94 andrewso: Created.
+*
+*****************************************************************************/
+
+#include "typelib.hxx"
+#include "silver.hxx"
+
+#if OE_WIN32
+#include "oautil.h"
+#endif // OE_WIN32
+
+#pragma hdrstop(RTPCHNAME)
+
+// Per-app APP_DATA instance
+ITLS g_itlsAppData = ITLS_EMPTY;
+
+#if !OE_WIN32
+// AppData cache speeds up Pappdata.
+extern "C" {
+ TID g_tidAppdataCache = NULL; // cache threadid to speed up Pappdata
+ APP_DATA* g_pAppdataCache = NULL; // pointer to equivalent thread
+}
+#endif // !OE_WIN32
+
+#if OE_WIN32
+// Per process AO table.
+AppObjectTable g_AppObjectTable;
+
+STDAPI CoSetState(IUnknown FAR *punk);
+STDAPI_(void) ReleaseBstrCache(APP_DATA *);
+#endif // OE_WIN32
+
+#if !OE_WIN32
+/***
+*APP_DATA *Pappdata()
+*
+*Purpose:
+* Returns per-app struct shared by typelib and obrun.
+*
+*Inputs:
+*
+*Outputs:
+* APP_DATA *
+*
+******************************************************************************/
+#pragma code_seg(CS_INIT)
+APP_DATA *Pappdata()
+{
+ // If the APP_DATA has not yet been allocated, return NULL.
+ if (g_itlsAppData == ITLS_EMPTY)
+ return NULL;
+ TlsCache(g_itlsAppData, (LPVOID *)&g_pAppdataCache, &g_tidAppdataCache);
+ return g_pAppdataCache;
+}
+#pragma code_seg()
+#endif // !OE_WIN32
+
+#if OE_MAC
+// flag for initialization of the lead byte table
+static BOOL fLeadByteTableInit = FALSE;
+#endif //OE_MAC
+
+
+#if OE_WIN32
+/***
+*HRESULT InitProcessData()
+*
+*Purpose:
+* Initialize the per-process data used by OLE Automation.
+*
+*Inputs:
+*
+*Outputs:
+* HRESULT
+*
+******************************************************************************/
+
+HRESULT InitProcessData()
+{
+ if (g_itlsAppData == ITLS_EMPTY) {
+ // Check if the APP_DATA has been initialized.
+ if ((g_itlsAppData = TlsAlloc()) == ITLS_EMPTY) {
+ return TIPERR_OutOfMemory;
+ }
+ }
+
+ return TIPERR_None;
+}
+#endif // OE_WIN32
+
+#if OE_WIN32
+/***
+*HRESULT ReleaseProcessData()
+*
+*Purpose:
+* Destroy the per-process data.
+*
+*Inputs:
+*
+*Outputs:
+*
+******************************************************************************/
+
+VOID ReleaseProcessData()
+{
+ TlsFree(g_itlsAppData);
+
+#if ID_DEBUG
+ g_AppObjectTable.DebIsTableEmpty();
+#endif // ID_DEBUG
+}
+
+/***
+*CReleaseAppData, etc
+*
+*Purpose:
+* Silly class that exists for the sole purpose of calling ReleaseAppData
+* at OleUninitialize time.
+*
+*Inputs:
+*
+*Outputs:
+*
+******************************************************************************/
+
+class CReleaseAppData
+{
+ STDMETHOD(QueryInterface)(REFIID riid, void ** ppvObj);
+ STDMETHOD_(unsigned long, AddRef)();
+ STDMETHOD_(unsigned long, Release)();
+};
+
+STDMETHODIMP
+CReleaseAppData::QueryInterface(REFIID riid, void ** ppvObj)
+{
+ return E_NOTIMPL; // shouldn't ever be called
+};
+
+STDMETHODIMP_(unsigned long)
+CReleaseAppData::AddRef()
+{
+ return 1; // shouldn't ever be called
+};
+
+STDMETHODIMP_(unsigned long)
+CReleaseAppData::Release()
+{
+ ReleaseAppData();
+ return 0; // should only be called once
+};
+
+static CReleaseAppData MyReleaseAppData;
+
+#endif // OE_WIN32
+
+/***
+*TIPERROR InitAppData()
+*
+*Purpose:
+* Initializes per-app data that is used by typelib.dll.
+* The point is that typelib.dll can't use
+* the per-app EBAPP struct since it is OB only.
+*
+*Inputs:
+*
+*Outputs:
+* TIPERROR
+*
+******************************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR InitAppData()
+{
+ APP_DATA *pappdata;
+ IMalloc FAR* pmalloc;
+ TIPERROR err;
+
+#if !OE_WIN32
+ // Check if the APP_DATA has been initialized.
+ if (g_itlsAppData == ITLS_EMPTY) {
+ if ((g_itlsAppData = TlsAlloc()) == ITLS_EMPTY)
+ return TIPERR_OutOfMemory;
+ }
+#endif // !OE_WIN32
+
+ if ((pappdata = (APP_DATA *)TlsGetValue(g_itlsAppData)) == NULL) {
+ // 1st call for this instance
+
+#if OE_MAC // for OE_WIN16 and OE_WIN32, this is done by LibMain/DllMain
+ // init mbstring lead byte table
+ if (!fLeadByteTableInit) {
+ InitMbString();
+ fLeadByteTableInit = TRUE;
+ }
+#endif //OE_MAC
+
+ if (CoGetMalloc(MEMCTX_TASK, &pmalloc)) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // allocate struct for the Appdata
+ pappdata =(APP_DATA *) pmalloc->Alloc(sizeof(APP_DATA));
+ if (pappdata == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+
+ // Call the constructor for APP_DATA
+ pappdata = new(pappdata) APP_DATA;
+
+ // Cache the pointer to IMalloc in App_Data
+ pappdata->m_pimalloc = pmalloc;
+
+ // Cache the value of the g_itlsAppData
+ if (!TlsSetValue(g_itlsAppData, pappdata)) {
+ err = TIPERR_OutOfMemory;
+ goto Error2;
+ }
+
+ // Invalidate the cache, so the next attempt to get the appdata
+ // will succeed.
+#if !OE_WIN32
+ // Invalidate the cache also.
+ g_tidAppdataCache = TID_EMPTY;
+#endif
+
+ // Initialize the OLE_TYPEMGR.
+ IfErrGoTo(OLE_TYPEMGR::Create(&pappdata->m_poletmgr), Error3);
+
+#if OE_WIN32
+ // lastly, tell OLE to call us back at OleUninitialize time for this
+ // thread, so we can clean up after ourselves.
+ IfErrGoTo(CoSetState((IUnknown *)&MyReleaseAppData), Error4);
+#endif //OE_WIN32
+ }
+
+ return TIPERR_None;
+
+#if OE_WIN32
+Error4:
+ pappdata->m_poletmgr->Release();
+#endif // OE_WIN32
+
+Error3:
+ TlsSetValue(g_itlsAppData, NULL);
+
+Error2:
+ pmalloc->Free(pappdata);
+
+Error:
+ pmalloc->Release();
+ return err;
+}
+#pragma code_seg()
+
+/***
+*VOID ReleaseAppData()
+*
+*Purpose:
+* Release per-app data that is shared by both typelib.dll
+* and obrun.dll. The point is that typelib.dll can't use
+* the per-app EBAPP struct since it is OB only.
+*
+*Inputs:
+*
+*Outputs:
+*
+******************************************************************************/
+#pragma code_seg(CS_INIT)
+VOID ReleaseAppData()
+{
+ APP_DATA *pappdata;
+ IMalloc *pmalloc;
+
+ DebAssert(g_itlsAppData != ITLS_EMPTY, "bad itls.");
+
+ if (pappdata = Pappdata()) {
+
+ if (pappdata->m_ptlibStdole)
+ pappdata->m_ptlibStdole->Release();
+
+#if OE_WIN32
+ g_AppObjectTable.Release();
+#endif // OE_WIN32
+
+ pappdata->m_poletmgr->Release();
+
+ pmalloc = pappdata->m_pimalloc;
+
+#if OE_WIN32
+ if (pappdata->m_perrinfo != NULL) {
+ pappdata->m_perrinfo->Release();
+ }
+
+ ReleaseBstrCache(pappdata); // no BSTR ops must happen after this.
+#endif // OE_WIN32
+
+ pmalloc->Free(pappdata);
+
+ // Release the IMalloc
+ pmalloc->Release();
+
+ // releases this app's resources
+ TlsSetValue(g_itlsAppData, NULL);
+
+#if !OE_WIN32
+ // Invalidate the cache also.
+ g_tidAppdataCache = TID_EMPTY;
+#endif
+ }
+}
+#pragma code_seg()
+
+
+#if OE_WIN32
+/***
+*PUBLIC AppObjectTable::Release()
+*
+*Purpose:
+* Release the app object table.
+*
+*Inputs:
+*
+*Outputs:
+*
+******************************************************************************/
+
+VOID AppObjectTable::Release()
+{
+ UINT iNode;
+
+ if (m_rgaotbl == NULL) {
+ return;
+ }
+
+ // Loop over all of the nodes, seeing if ANY of them
+ // still have a reference.
+ //
+ for (iNode = 0; iNode < m_cNodes; iNode++) {
+ // If there is a reference left, don't do anything.
+ if (m_rgaotbl[iNode].m_cRefs != 0) {
+ return;
+ }
+ }
+
+ // Delete the pv members.
+ for (iNode = 0; iNode < m_cNodes; iNode++) {
+ MemFree((VOID *)m_rgaotbl[iNode].m_ppv);
+ }
+
+ // Delete the node table.
+ MemFree(m_rgaotbl);
+ m_rgaotbl = NULL;
+
+ // Get rid of the critical section.
+ DeleteCriticalSection(&m_criticalsection);
+
+ return;
+}
+
+#if ID_DEBUG
+/***
+*PUBLIC AppObjectTable::DebIsTableEmpty()
+*
+*Purpose:
+* Make sure the table has been completely released.
+*
+*Inputs:
+*
+*Outputs:
+*
+******************************************************************************/
+
+VOID AppObjectTable::DebIsTableEmpty()
+{
+ DebAssert(m_rgaotbl == NULL, "Table not empty.");
+}
+#endif // ID_DEBUG
+
+/***
+*PUBLIC AppObjectTable::AddTypeLib()
+*
+*Purpose:
+* Add a new typelib to the appobject table.
+*
+*Inputs:
+* clsid - the IID of the typeinfo
+*
+*Outputs:
+* phtinfo - the handle of the typelib in this table.
+*
+******************************************************************************/
+
+HRESULT AppObjectTable::AddTypeInfo(CLSID *pclsid,
+ HTINFO *phtinfo)
+{
+ AOTABLE_NODE *paotblNew;
+ UINT iNode;
+ HRESULT hresult = NOERROR;
+
+ EnterCriticalSection(&m_criticalsection);
+
+ // See if it already exists in the table.
+ for (iNode = 0; iNode < m_cNodes; iNode++) {
+ if (m_rgaotbl[iNode].m_clsid == *pclsid) {
+ // Increment the reference count and return.
+ m_rgaotbl[iNode].m_cRefs++;
+ DebAssert(m_rgaotbl[iNode].m_cRefs != 0, "Overflow");
+
+ *phtinfo = iNode;
+
+ goto Exit;
+ }
+ }
+
+ // Doesn't exist in the table, add a new entry for it.
+ paotblNew = (AOTABLE_NODE *)MemRealloc(m_rgaotbl,
+ (m_cNodes + 1) * sizeof(AOTABLE_NODE));
+
+ if (paotblNew == NULL) {
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto Exit;
+ }
+
+ m_rgaotbl = paotblNew;
+
+ // Allocate the member to return. If it fails, just return. We'll
+ // fix up the size of the allocate node array the next time we add
+ // a new member.
+ //
+ if (!(m_rgaotbl[iNode].m_ppv = (VOID **)MemZalloc(sizeof(VOID *)))) {
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto Exit;
+ }
+
+ // Initialize the new entry. iNode has the correct value from the
+ // above for loop.
+ //
+ m_rgaotbl[iNode].m_clsid = *pclsid;
+ m_rgaotbl[iNode].m_cRefs = 1;
+
+ // Increase the table size.
+ m_cNodes++;
+
+ // Return the handle.
+ *phtinfo = iNode;
+
+Exit:
+ LeaveCriticalSection(&m_criticalsection);
+
+ return hresult;
+}
+
+/***
+*PUBLIC AppObjectTable::RemoveTypeInfo()
+*
+*Purpose:
+* Remove a typeinfo from the appobject table.
+*
+*Inputs:
+* htnfo - the handle of the typelib in this table.
+*
+*Outputs:
+
+******************************************************************************/
+
+VOID AppObjectTable::RemoveTypeInfo(HTINFO htinfo)
+{
+ EnterCriticalSection(&m_criticalsection);
+
+ DebAssert(htinfo < m_cNodes, "Out of range.");
+ DebAssert(m_rgaotbl[htinfo].m_cRefs != 0, "Underflow");
+
+ m_rgaotbl[htinfo].m_cRefs--;
+
+ // Release the appobjects if there is nobody left.
+ if (m_rgaotbl[htinfo].m_cRefs == 0) {
+ if (*m_rgaotbl[htinfo].m_ppv) {
+ ((IUnknown *)*m_rgaotbl[htinfo].m_ppv)->Release();
+ *m_rgaotbl[htinfo].m_ppv = NULL;
+ }
+ }
+
+ LeaveCriticalSection(&m_criticalsection);
+}
+
+/***
+*PUBLIC AppObjectTable::AddressOfAppObject()
+*
+*Purpose:
+* Return the slot to hold the appobject.
+*
+*Inputs:
+* htinfo - the typelib of the object.
+* ityp - the typeinfo to get the appobject for
+*
+*Outputs:
+* ppv - the address of the object.
+*
+******************************************************************************/
+
+VOID AppObjectTable::AddressOfAppObject(HTINFO htinfo, VOID **ppv)
+{
+ EnterCriticalSection(&m_criticalsection);
+
+ DebAssert(htinfo < m_cNodes, "Out of range.");
+
+ *ppv = (VOID *)m_rgaotbl[htinfo].m_ppv;
+ LeaveCriticalSection(&m_criticalsection);
+}
+
+#endif // OE_WIN32
diff --git a/private/oleauto/src/typelib/obguid.c b/private/oleauto/src/typelib/obguid.c
new file mode 100644
index 000000000..07349682a
--- /dev/null
+++ b/private/oleauto/src/typelib/obguid.c
@@ -0,0 +1,65 @@
+/***
+*obguid.c - All OB-owned GUIDs are defined in this module.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module contains the definitions of the GUIDs for all classes
+* in ob.dll and obrun.dll that derive (or will eventually derive)
+* from OLE's IUnknown.
+*
+* Do not allocate GUIDs anywhere else, since we need to ensure that
+* they are unique throughout the project.
+*
+*Revision History:
+*
+* [00] 10-Nov-92 mikewo: created
+*
+*****************************************************************************/
+
+#include "switches.hxx"
+#include "version.hxx"
+#if BLD_MAC
+#include "silver.hxx"
+#endif //BLD_MAC
+#include "typelib.hxx"
+
+#if OE_MAC
+// HACK to make GUID's be defined in a FAR segment w/o changing the OLE
+// header files (works arounds a Wings bug). Define-away 'const' so that
+// they get put into .fardata like they're supposed to.
+#define const
+#endif
+
+//OLE uses _MAC to determine if this is a Mac build
+#if OE_MAC
+# define _MAC
+#endif
+
+// initguid.h requires this
+#if OE_WIN32
+#define INC_OLE2
+#include <ole2.h>
+#else
+#include <compobj.h>
+#endif
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+#include <initguid.h>
+
+#if OE_MAC
+# undef _MAC
+#endif
+
+// due to the previous header, including this causes our DEFINE_GUID defs
+// in dispatch.h to actually allocate data.
+//
+#include "obguid.h"
+
+// UNDONE: PPC: [jimcool]: The PowerPC linker can't handle multiple defn's.
+// They cause errors. To remove the multiple defn's, we use the typelib's
+// compilation of obguid.c. If we included obguid.h here, we'd get multiple
+// defn's. So, we include these symbols whose names are mangled
+// (hence unusable) in the TypeLib compilation of obguid.c
+
diff --git a/private/oleauto/src/typelib/obguid.h b/private/oleauto/src/typelib/obguid.h
new file mode 100644
index 000000000..ce035b2a4
--- /dev/null
+++ b/private/oleauto/src/typelib/obguid.h
@@ -0,0 +1,46 @@
+/***
+*obguid.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definitions of private OB owned GUIDs.
+*
+* [00] 26-Jan-93 gustavj: Created.
+*
+*Implementation Notes:
+* OLE has given OB a range of GUIDs to use for its classes. This range
+* consists of 256 possible GUIDs. The GUIDs for public classes
+* (such as ItypeInfo) take GUIDs starting at the low end of the range,
+* private classes(such as GEN_DTINFO), take GUIDs starting at the high
+* end. New GUIDs that are added should maintain this convention.
+*
+* GUIDs for OB public classes are defined in typelib.hxx.
+*
+*****************************************************************************/
+
+#ifndef obguid_HXX_INCLUDED
+#define obguid_HXX_INCLUDED
+
+#define DEFINE_OBOLEGUID(name, b) DEFINE_OLEGUID(name,(0x00020400+b), 0, 0);
+
+DEFINE_OBOLEGUID(CLSID_GenericTypeLibOLE, 0xff);
+
+DEFINE_OBOLEGUID(IID_TYPEINFO , 0xfc);
+DEFINE_OBOLEGUID(IID_DYNTYPEINFO , 0xfb);
+
+DEFINE_OBOLEGUID(IID_CDefnTypeComp , 0xf5);
+
+DEFINE_OBOLEGUID(IID_TYPELIB_GEN_DTINFO , 0xf2);
+
+// {DD23B040-296F-101B-99A1-08002B2BD119}
+DEFINE_GUID(CLSID_TypeLibCF,
+ 0xDD23B040L,0x296F,0x101B,0x99,0xA1,0x08,0x00,0x2B,0x2B,0xD1,0x19);
+//{F5AA2660-BA14-1069-8AEE-00DD010F7D13}
+DEFINE_GUID(IID_IGenericTypeLibOLE,
+ 0xF5AA2660L,0xBA14,0x1069,0x8A,0xEE,0x00,0xDD,0x01,0x0F,0x7D,0x13);
+
+
+#endif // !obguid_HXX_INCLUDED
+
diff --git a/private/oleauto/src/typelib/obole2.h b/private/oleauto/src/typelib/obole2.h
new file mode 100644
index 000000000..d8343a38c
--- /dev/null
+++ b/private/oleauto/src/typelib/obole2.h
@@ -0,0 +1,224 @@
+/***
+*obole2.hxx - Cover for including Win16, Win32, and Mac Ole include files
+*
+* Copyright (C) 1993, Microsoft Corporation
+*
+*Purpose:
+* This include file includes the Ole2 include files and covers any
+* differences between the versions. Ole2.h should never be directly
+* included.
+*
+*Revision History:
+*
+* 03-Feb-93 dennisc: Created.
+*
+*******************************************************************************/
+
+#ifndef OBOLE2_H_INCLUDED
+#define OBOLE2_H_INCLUDED
+
+#if OE_MAC
+ #define _MAC
+ #undef _fmemcmp
+ #define _fmemcmp memcmp
+ #undef _fstrncpy
+ #define _fstrncpy strncpy
+ #undef _fstrcmp
+ #define _fstrcmp strcmp
+ #define HINSTANCE long
+ #define USE_INCLUDE
+#endif
+
+#if OE_WIN32
+# define __export
+# undef EXPORT
+# define EXPORT
+#endif
+
+#if ID_DEBUG
+#define _DEBUG 1 // OLE wants _DEBUG defined
+#endif
+
+#if OE_MACPPC
+#include "olenames.h"
+#endif
+
+#if !OE_WIN32 && !OE_MACPPC
+#pragma code_seg("OLEConst")
+#endif // !OE_WIN32 && !OE_MACPPC
+
+// On Win32, all the standard OLE2 headers get included by windows.h
+#if !OE_WIN32
+#include "ole2.h"
+#include "olenls.h"
+#include "dispatch.h"
+#endif
+
+// taken from the now-defunct ole2anac.h
+#define IIDEQ(riid1, riid2) IsEqualIID(riid1, riid2)
+#define CLSIDEQ(rclsid1, rclsid2) IsEqualCLSID(rclsid1, rclsid2)
+
+#define ReportResult(a,b,c,d) ResultFromScode(b) // this is now obsolete
+#define HresultOfScode(X) ResultFromScode(X)
+
+#ifndef OLESTR
+# if OE_MAC
+ typedef char OLECHAR;
+ typedef LPSTR LPOLESTR;
+ typedef LPCSTR LPCOLESTR;
+# define OLESTR(str) str
+# else
+# if OE_WIN32
+ typedef WCHAR OLECHAR;
+ typedef LPWSTR LPOLESTR;
+ typedef LPCWSTR LPCOLESTR;
+# define OLESTR(str) L##str
+# else
+ typedef char OLECHAR;
+ typedef LPSTR LPOLESTR;
+ typedef LPCSTR LPCOLESTR;
+# define OLESTR(str) str
+# endif
+# endif
+#endif
+
+#ifndef OLEBOOL
+# if OE_MAC
+# define OLEBOOL ULONG
+# else
+# define OLEBOOL BOOL
+# endif
+#endif
+
+//end of the SYSKIND enumeration
+#define SYS_MAX (SYS_MAC+1)
+
+// char count of a guid in ansi/unicode form (including trailing null)
+#define CCH_SZGUID0 39
+
+// Method counts for the interfaces commonly used by VBA
+#define CMETH_IUNKNOWN 3
+#define CMETH_IDISPATCH 7
+#define CMETH_ITYPELIB 13
+#define CMETH_ITYPEINFO 22
+#define CMETH_ISTORAGE 18
+#define CMETH_IMONIKER 23
+#define CMETH_IBINDCTX 13
+
+
+#if FV_UNICODE_OLE
+#define CreateTypeLibW CreateTypeLib
+#define RegisterTypeLibW RegisterTypeLib
+#define LHashValOfNameSysW LHashValOfNameSys
+
+#else //FV_UNICODE_OLE
+
+#define LoadRegTypeLibA LoadRegTypeLib
+#define LHashValOfNameSysW LHashValOfNameSys
+
+#endif //FV_UNICODE_OLE
+
+// In general, the "A" versions just map onto the non-A names.
+#define IStreamA IStream
+#define IStorageA IStorage
+#define ILockBytesA ILockBytes
+#define IDispatchA IDispatch
+#define IDispatchAVtbl IDispatchVtbl
+#define ITypeInfoA ITypeInfo
+#define ITypeLibA ITypeLib
+#define ICreateTypeInfoA ICreateTypeInfo
+#define ICreateTypeLibA ICreateTypeLib
+#define ITypeCompA ITypeComp
+#define IEnumSTATSTGA IEnumSTATSTG
+#define IEnumVARIANTA IEnumVARIANT
+#define IPersistFileA IPersistFile
+
+//[bb] this is where BSTR is defined
+#define BSTRA LPSTR
+#define LPBSTRA LPSTR *
+
+#define STATSTGA STATSTG
+#define SNBA SNB
+#define VARIANTA VARIANT
+#define VARIANTARGA VARIANTARG
+#define SAFEARRAYA SAFEARRAY
+#define EXCEPINFOA EXCEPINFO
+#define VARDESCA VARDESC
+#define BINDPTRA BINDPTR
+#define DISPPARAMSA DISPPARAMS
+#define PARAMDATAA PARAMDATA
+
+#define LPDISPATCHA LPDISPATCH
+#define LPEXCEPINFOA LPEXCEPINFO
+#define LPVARIANTA LPVARIANT
+#define LPVARIANTARGA LPVARIANTARG
+
+#define ReadClassStgA ReadClassStg
+#define WriteClassStgA WriteClassStg
+#define WriteFmtUserTypeStgA WriteFmtUserTypeStg
+#define CLSIDFromProgIDA CLSIDFromProgID
+#define MkParseDisplayNameA MkParseDisplayName
+#define VariantInitA VariantInit
+#define VariantClearA VariantClear
+#define VariantChangeTypeA VariantChangeType
+#define VariantCopyA VariantCopy
+#define VariantCopyIndA VariantCopyInd
+#define VarBstrFromI2A VarBstrFromI2
+#define VarBstrFromI4A VarBstrFromI4
+#define VarBstrFromR4A VarBstrFromR4
+#define VarBstrFromR8A VarBstrFromR8
+#define VarBstrFromCyA VarBstrFromCy
+#define VarBstrFromDateA VarBstrFromDate
+#define VarI2FromStrA VarI2FromStr
+#define VarI4FromStrA VarI4FromStr
+#define VarR4FromStrA VarR4FromStr
+#define VarR8FromStrA VarR8FromStr
+#define VarCyFromStrA VarCyFromStr
+#define VarDateFromStrA VarDateFromStr
+
+#define IID_ICreateTypeLibA IID_ICreateTypeLib
+#define IID_ICreateTypeInfoA IID_ICreateTypeInfo
+#define IID_ITypeLibA IID_ITypeLib
+#define IID_ITypeInfoA IID_ITypeInfo
+#define IID_ITypeCompA IID_ITypeComp
+#define IID_IStorageA IID_IStorage
+#define IID_IStreamA IID_IStream
+#define IID_ILockBytesA IID_ILockBytes
+#define IID_IDispatchA IID_IDispatch
+#define IID_IEnumVARIANTA IID_IEnumVARIANT
+#define IID_IPersistFileA IID_IPersistFile
+
+#if FV_UNICODE_OLE
+
+STDAPI
+RegisterTypeLibA(
+ ITypeLibA * ptlib,
+ char * szFullPath,
+ char * szHelpDir);
+
+STDAPI
+CreateTypeLibA(SYSKIND syskind, const char * szFile, ICreateTypeLibA * * ppctlib);
+#endif //FV_UNICODE_OLE
+
+
+#ifndef FACILITY_CONTROL
+# define FACILITY_CONTROL 0x9
+#endif
+
+
+#pragma code_seg()
+
+#if OE_MAC
+# undef _fstrncmp
+# undef _fstrcmp
+# undef _fmemcmp
+# undef _MAC
+# ifndef CALLBACK
+# define CALLBACK FAR PASCAL
+# endif // !defined(CALLBACK)
+//
+// OLE Vectoring is only needed for 68k builds
+//
+#endif // OE_MAC
+
+#endif // OBOLE2_H_INCLUDED
diff --git a/private/oleauto/src/typelib/obwin.hxx b/private/oleauto/src/typelib/obwin.hxx
new file mode 100644
index 000000000..ea0944684
--- /dev/null
+++ b/private/oleauto/src/typelib/obwin.hxx
@@ -0,0 +1,93 @@
+/***
+*obwin.hxx - Fundamental Silver include file
+*
+* Copyright (C) 1990, Microsoft Corporation
+*
+*Purpose:
+* Includes the correct version of the windows header file (windows.h
+* or wlm.h) depending on the settings of the switches.
+*
+*Revision History:
+*
+* 12-May-92 martinc: created
+*
+*******************************************************************************/
+
+#ifndef OBWIN_HXX_INCLUDED
+#define OBWIN_HXX_INCLUDED
+
+#include "switches.hxx"
+#include "version.hxx"
+
+
+#if OE_WIN
+
+#if !OE_WLM
+
+ // This is either the Win16 or Win32 build.
+ #define STRICT
+
+#if OE_WIN32
+// force include of OLE2 rather than OLE1
+# define INC_OLE2
+#define _OLEAUT32_ // for the new oleauto.h when we pick it up
+
+// On Win32, windows.h pulls in so damn much stuff that even the
+// 32bit compiler croaks on some of our files. So trim it down a bit...
+# define WIN32_LEAN_AND_MEAN
+// Yea, right...
+#endif
+
+ #include "windows.h"
+
+#if OE_WIN16
+ #include "windowsx.h16"
+#else
+ #include "windowsx.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif //__cplusplus
+ #include "shellapi.h"
+#ifdef __cplusplus
+ }
+#endif //__cplusplus
+
+#else // OE_WLM
+
+ // This is the WLM build.
+ #define _MACNAMES
+ // wlm.h defines its own PASCAL
+ #undef PASCAL
+ #include "wlm.h"
+ #undef PASCAL
+ #define PASCAL
+
+#endif // !OE_WLM
+
+#endif // !OE_WIN
+
+
+// This is the native Mac build.
+#if OE_MAC && !OE_WLM
+ #define _MAC
+ #include <macos\types.h>
+ #include <macos\quickdra.h>
+ #include <macos\events.h>
+ #include <macos\controls.h>
+ #include <macos\windows.h>
+
+ typedef int BOOL;
+ #define CONST
+ //#define NEAR
+
+ #include "obwlm.h"
+
+ // min, max are defined in stdlib.h
+ #undef min
+ #undef max
+
+#endif // !OE_WIN
+
+#endif // OBWIN_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/obwlm.h b/private/oleauto/src/typelib/obwlm.h
new file mode 100644
index 000000000..af8732235
--- /dev/null
+++ b/private/oleauto/src/typelib/obwlm.h
@@ -0,0 +1,374 @@
+/***
+*obwlm.h - Hacked up wlm include file for OB
+*
+* Copyright (C) 1992, Microsoft Corporation
+*
+*Purpose:
+* This file extracts all currently used functions of wlm for the "native"
+* mac build.
+* Do NOT directly include thsi file, but include silver.hxx, or obwin.hxx
+* since these files will correctly set up all our mac-types.
+*
+*Revision History:
+*
+* 2-Feb-93 martinc: File created.
+*
+*******************************************************************************/
+//
+//
+//
+
+// NOTE - wlm.h defines _WINDOWS_ and not _INC_WINDOWS_
+// but for compatibility with windows.h we keep _INC_WINDOWS
+#ifndef _INC_WINDOWS
+#define _INC_WINDOWS
+
+#ifndef OE_MAC
+#error - obwlm should not be included in non-mac builds
+#endif
+
+#if OE_MACPPC
+#define _PPC_
+#else
+#define _68K_
+#endif
+
+#define HWND WLMHWND
+#define HCURSOR WLMHCURSOR
+
+#undef PASCAL
+
+//#define HWND UINT
+// we set HWND to WindowPtr in owr native Mac build. When we are going
+// to move to full WLM we will have to fix this
+
+#include "windef.h"
+
+#if OE_MAC68K
+#include "wlmdef.h"
+#endif
+#include "wingdi.h"
+
+#if HE_WIN32
+#include "windowsx.h"
+#else
+#include "wlmx.h"
+#endif
+
+#undef HWND
+#undef HCURSOR
+
+
+// our wlm-version does not define this value
+#define DEFAULT_CHARSET 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct tagCOLOR48
+{
+ WORD red;
+ WORD green;
+ WORD blue;
+} COLOR48, FAR* LPCOLOR48;
+
+
+#define CA_NONE 0x0000
+#define CA_COLOR 0x0001
+#define CA_PEN 0x0002
+#define CA_BRUSH 0x0004
+#define CA_FONT 0x0008
+#define CA_CLIP 0x0010
+#define CA_TRANSFORM 0x0020
+#define CA_PORT 0x8000
+#define CA_ALL 0xffff
+
+int WINAPI AfxFillRect(HDC hDC,CONST RECT *lprc,HBRUSH hbr);
+BOOL WINAPI AfxLineTo(HDC, int, int);
+BOOL WINAPI SetRectEmpty(LPRECT lprc);
+
+
+#define AfxMoveTo MoveToEx
+BOOL WINAPI MoveToEx(HDC, int, int, LPPOINT);
+
+BOOL WINAPI AfxPtInRect(const RECT FAR*, POINT);
+BOOL WINAPI AfxEqualRect(CONST RECT *lprc1, CONST RECT *lprc2);
+
+void WINAPI CheckinPort(HDC hdc, UINT ca);
+struct GrafPort FAR* WINAPI CheckoutPort(HDC hdc, UINT ca);
+
+
+#ifndef UNICODE
+#define CreateFont CreateFontA
+#define CreateIC CreateICA
+#define ExtTextOut ExtTextOutA
+#define TextOut TextOutA
+
+HFONT WINAPI CreateFontA(int, int, int, int, int, DWORD,
+ DWORD, DWORD, DWORD, DWORD, DWORD,
+ DWORD, DWORD, LPCSTR);
+HDC WINAPI CreateICA(LPCSTR, LPCSTR , LPCSTR , CONST DEVMODEA *);
+BOOL WINAPI ExtTextOutA(HDC, int, int, UINT, CONST RECT *, LPCSTR, UINT, LPINT);
+BOOL WINAPI TextOutA(HDC, int, int, LPCSTR, int);
+#else
+#error UNICODE defined!
+#endif
+
+
+HDC WINAPI WrapPort(struct GrafPort*);
+
+HPEN WINAPI CreatePen(int, int, COLORREF);
+HBRUSH WINAPI CreateSolidBrush(COLORREF);
+
+BOOL WINAPI DeleteDC(HDC);
+BOOL WINAPI UnwrapPort(HDC);
+BOOL WINAPI LockDC(HDC);
+BOOL WINAPI UnlockDC(HDC);
+
+BOOL WINAPI DeleteObject(HGDIOBJ);
+int WINAPI ExcludeClipRect(HDC, int, int, int, int);
+
+BOOL WINAPI GDIInit(DWORD fdCreator);
+void WINAPI GDITerm(void);
+
+COLORREF WINAPI GetBkColor(HDC);
+int WINAPI GetClipBox(HDC, LPRECT);
+BOOL WINAPI GetCurrentPositionEx(HDC, LPPOINT);
+HGDIOBJ WINAPI GetStockObject(int);
+COLORREF WINAPI GetTextColor(HDC);
+BOOL WINAPI GetTextMetricsA(HDC, LPTEXTMETRICA);
+BOOL WINAPI InitDC(HDC);
+int WINAPI IntersectClipRect(HDC, int, int, int, int);
+BOOL WINAPI IsRectEmpty(CONST RECT *lprc);
+
+BOOL WINAPI PatBlt(HDC, int, int, int, int, DWORD);
+BOOL WINAPI Rectangle(HDC, int, int, int, int);
+
+BOOL WINAPI ResetMacDC(HDC);
+BOOL WINAPI RestoreDC(HDC, int);
+int WINAPI SaveDC(HDC);
+
+HGDIOBJ WINAPI SelectObject(HDC, HGDIOBJ);
+COLORREF WINAPI SetBkColor(HDC, COLORREF);
+int WINAPI SetBkMode(HDC, int);
+UINT WINAPI SetTextAlign(HDC, UINT);
+COLORREF WINAPI SetTextColor(HDC, COLORREF);
+
+int WINAPI lstrcmp(LPCSTR, LPCSTR);
+int WINAPI lstrcmpi(LPCSTR, LPCSTR);
+
+#if ID_DEBUG
+ void WINAPI DebugBreak(void);
+// This is provided by Mac OLE as of MM6.2.
+// void WINAPI OutputDebugString(LPCSTR);
+#endif
+
+// from winbase.h
+
+int
+WINAPI
+MulDiv(
+ int nNumber,
+ int nNumerator,
+ int nDenominator
+ );
+
+UINT
+WINAPI
+GetPrivateProfileIntA(
+ LPCSTR lpAppName,
+ LPCSTR lpKeyName,
+ DWORD nDefault,
+ LPCSTR lpFileName
+ );
+UINT
+WINAPI
+GetPrivateProfileIntW(
+ LPCWSTR lpAppName,
+ LPCWSTR lpKeyName,
+ DWORD nDefault,
+ LPCWSTR lpFileName
+ );
+#ifdef UNICODE
+#define GetPrivateProfileInt GetPrivateProfileIntW
+#else
+#define GetPrivateProfileInt GetPrivateProfileIntA
+#endif // !UNICODE
+
+DWORD
+WINAPI
+GetPrivateProfileStringA(
+ LPCSTR lpAppName,
+ LPCSTR lpKeyName,
+ LPCSTR lpDefault,
+ LPSTR lpReturnedString,
+ DWORD nSize,
+ LPCSTR lpFileName
+ );
+DWORD
+WINAPI
+GetPrivateProfileStringW(
+ LPCWSTR lpAppName,
+ LPCWSTR lpKeyName,
+ LPCWSTR lpDefault,
+ LPWSTR lpReturnedString,
+ DWORD nSize,
+ LPCWSTR lpFileName
+ );
+#ifdef UNICODE
+#define GetPrivateProfileString GetPrivateProfileStringW
+#else
+#define GetPrivateProfileString GetPrivateProfileStringA
+#endif // !UNICODE
+
+BOOL
+WINAPI
+WritePrivateProfileStringA(
+ LPCSTR lpAppName,
+ LPCSTR lpKeyName,
+ LPCSTR lpString,
+ LPCSTR lpFileName
+ );
+BOOL
+WINAPI
+WritePrivateProfileStringW(
+ LPCWSTR lpAppName,
+ LPCWSTR lpKeyName,
+ LPCWSTR lpString,
+ LPCWSTR lpFileName
+ );
+#ifdef UNICODE
+#define WritePrivateProfileString WritePrivateProfileStringW
+#else
+#define WritePrivateProfileString WritePrivateProfileStringA
+#endif // !UNICODE
+
+
+DWORD
+WINAPI
+CharUpperBuffA(
+ LPSTR lpsz,
+ DWORD cchLength);
+DWORD
+WINAPI
+CharUpperBuffW(
+ LPWSTR lpsz,
+ DWORD cchLength);
+#ifdef UNICODE
+#define CharUpperBuff CharUpperBuffW
+#else
+#define CharUpperBuff CharUpperBuffA
+#endif // !UNICODE
+
+
+DWORD
+WINAPI
+CharLowerBuffA(
+ LPSTR lpsz,
+ DWORD cchLength);
+DWORD
+WINAPI
+CharLowerBuffW(
+ LPWSTR lpsz,
+ DWORD cchLength);
+#ifdef UNICODE
+#define CharLowerBuff CharLowerBuffW
+#else
+#define CharLowerBuff CharLowerBuffA
+#endif // !UNICODE
+
+int
+WINAPI
+lstrcmpA(
+ LPCSTR lpString1,
+ LPCSTR lpString2
+ );
+int
+WINAPI
+lstrcmpW(
+ LPCWSTR lpString1,
+ LPCWSTR lpString2
+ );
+#ifdef UNICODE
+#define lstrcmp lstrcmpW
+#else
+#define lstrcmp lstrcmpA
+#endif // !UNICODE
+
+int
+WINAPI
+lstrcmpiA(
+ LPCSTR lpString1,
+ LPCSTR lpString2
+ );
+int
+WINAPI
+lstrcmpiW(
+ LPCWSTR lpString1,
+ LPCWSTR lpString2
+ );
+#ifdef UNICODE
+#define lstrcmpi lstrcmpiW
+#else
+#define lstrcmpi lstrcmpiA
+#endif // !UNICODE
+
+
+LPSTR
+WINAPI
+lstrcpyA(
+ LPSTR lpString1,
+ LPCSTR lpString2
+ );
+LPWSTR
+WINAPI
+lstrcpyW(
+ LPWSTR lpString1,
+ LPCWSTR lpString2
+ );
+#ifdef UNICODE
+#define lstrcpy lstrcpyW
+#else
+#define lstrcpy lstrcpyA
+#endif // !UNICODE
+
+LPSTR
+WINAPI
+lstrcatA(
+ LPSTR lpString1,
+ LPCSTR lpString2
+ );
+LPWSTR
+WINAPI
+lstrcatW(
+ LPWSTR lpString1,
+ LPCWSTR lpString2
+ );
+#ifdef UNICODE
+#define lstrcat lstrcatW
+#else
+#define lstrcat lstrcatA
+#endif // !UNICODE
+
+int
+WINAPI
+lstrlenA(
+ LPCSTR lpString
+ );
+int
+WINAPI
+lstrlenW(
+ LPCWSTR lpString
+ );
+#ifdef UNICODE
+#define lstrlen lstrlenW
+#else
+#define lstrlen lstrlenA
+#endif // !UNICODE
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _INC_WINDOWS_
diff --git a/private/oleauto/src/typelib/oleaut32.def b/private/oleauto/src/typelib/oleaut32.def
new file mode 100644
index 000000000..447802942
--- /dev/null
+++ b/private/oleauto/src/typelib/oleaut32.def
@@ -0,0 +1,241 @@
+#include "switches.hxx"
+
+//
+// Note: To currently debug shared libraries on PPC, the LIBRARY clause must be of the form xxx.dll.dll
+// The ouput from the linker must be xxx.dll, and the name in the 'cfrg' segment must be xxx.dll
+//
+#if OE_MACPPC
+LIBRARY MicrosoftOLE2AutomationLib
+#else // OE_MACPPC
+LIBRARY OLEAUT32
+#endif // OE_MACPPC
+
+#if OE_WIN
+DESCRIPTION 'OLE Automation Library'
+CODE EXECUTE READ SHARED
+;DATA READ WRITE
+#endif
+
+EXPORTS
+
+ ; (Not used in Win32)
+ ;WEP @0 RESIDENTNAME
+
+ ; DLL Support API
+ DllGetClassObject @1
+
+ ; BSTR API (ANSI)
+ ;
+ SysAllocString @2
+ SysReAllocString @3
+ SysAllocStringLen @4
+ SysReAllocStringLen @5
+ SysFreeString @6
+ SysStringLen @7
+
+ ; VARIANT API
+ ;
+ VariantInit @8
+ VariantClear @9
+ VariantCopy @10
+ VariantCopyInd @11
+ VariantChangeType @12
+
+ ; VARIANT TIME API
+ ;
+ VariantTimeToDosDateTime @13
+ DosDateTimeToVariantTime @14
+
+ ; SAFEARRAY API
+ ;
+ SafeArrayCreate @15
+ SafeArrayDestroy @16
+ SafeArrayGetDim @17
+ SafeArrayGetElemsize @18
+ SafeArrayGetUBound @19
+ SafeArrayGetLBound @20
+ SafeArrayLock @21
+ SafeArrayUnlock @22
+ SafeArrayAccessData @23
+ SafeArrayUnaccessData @24
+ SafeArrayGetElement @25
+ SafeArrayPutElement @26
+ SafeArrayCopy @27
+
+ ; IDispatch helpers/implementation
+ ;
+ DispGetParam @28
+ DispGetIDsOfNames @29
+ DispInvoke @30
+ CreateDispTypeInfo @31
+ CreateStdDispatch @32
+
+ ; Active Object API
+ ;
+ RegisterActiveObject @33
+ RevokeActiveObject @34
+ GetActiveObject @35
+
+ ; additional SafeArray APIs
+ ;
+ SafeArrayAllocDescriptor @36
+ SafeArrayAllocData @37
+ SafeArrayDestroyDescriptor @38
+ SafeArrayDestroyData @39
+ SafeArrayRedim @40
+
+ ; low-level VARTYPE coersion API
+ ;
+ VarI2FromUI1 @48
+ VarI2FromI4 @49
+ VarI2FromR4 @50
+ VarI2FromR8 @51
+ VarI2FromCy @52
+ VarI2FromDate @53
+ VarI2FromStr @54
+ VarI2FromDisp @55
+ VarI2FromBool @56
+
+ VarI4FromUI1 @58
+ VarI4FromI2 @59
+ VarI4FromR4 @60
+ VarI4FromR8 @61
+ VarI4FromCy @62
+ VarI4FromDate @63
+ VarI4FromStr @64
+ VarI4FromDisp @65
+ VarI4FromBool @66
+
+ VarR4FromUI1 @68
+ VarR4FromI2 @69
+ VarR4FromI4 @70
+ VarR4FromR8 @71
+ VarR4FromCy @72
+ VarR4FromDate @73
+ VarR4FromStr @74
+ VarR4FromDisp @75
+ VarR4FromBool @76
+
+ VarR8FromUI1 @78
+ VarR8FromI2 @79
+ VarR8FromI4 @80
+ VarR8FromR4 @81
+ VarR8FromCy @82
+ VarR8FromDate @83
+ VarR8FromStr @84
+ VarR8FromDisp @85
+ VarR8FromBool @86
+
+ VarDateFromUI1 @88
+ VarDateFromI2 @89
+ VarDateFromI4 @90
+ VarDateFromR4 @91
+ VarDateFromR8 @92
+ VarDateFromCy @93
+ VarDateFromStr @94
+ VarDateFromDisp @95
+ VarDateFromBool @96
+
+ VarCyFromUI1 @98
+ VarCyFromI2 @99
+ VarCyFromI4 @100
+ VarCyFromR4 @101
+ VarCyFromR8 @102
+ VarCyFromDate @103
+ VarCyFromStr @104
+ VarCyFromDisp @105
+ VarCyFromBool @106
+
+ VarBstrFromUI1 @108
+ VarBstrFromI2 @109
+ VarBstrFromI4 @110
+ VarBstrFromR4 @111
+ VarBstrFromR8 @112
+ VarBstrFromCy @113
+ VarBstrFromDate @114
+ VarBstrFromDisp @115
+ VarBstrFromBool @116
+
+ VarBoolFromUI1 @118
+ VarBoolFromI2 @119
+ VarBoolFromI4 @120
+ VarBoolFromR4 @121
+ VarBoolFromR8 @122
+ VarBoolFromDate @123
+ VarBoolFromCy @124
+ VarBoolFromStr @125
+ VarBoolFromDisp @126
+
+ VarUI1FromI2 @130
+ VarUI1FromI4 @131
+ VarUI1FromR4 @132
+ VarUI1FromR8 @133
+ VarUI1FromCy @134
+ VarUI1FromDate @135
+ VarUI1FromStr @136
+ VarUI1FromDisp @137
+ VarUI1FromBool @138
+
+ ; IIDs
+ ;
+#if OE_MACPPC
+ IID_IDispatch @144
+ IID_IEnumVARIANT @145
+#endif
+
+ ; Not needed in combined DLL's
+ ;DoInvokeMethod @146
+
+ ; Varaint Coersion API Extension
+ ;
+ VariantChangeTypeEx @147
+
+ ; SAFEARRAY APIs
+ ;
+ SafeArrayPtrOfIndex @148
+
+#if OE_WIN32
+ ; BSTR Byte APIs
+ ;
+ SysStringByteLen @149
+ SysAllocStringByteLen @150
+ ;SysReAllocStringByteLen @151
+#endif //OE_WIN32
+
+ ; Type librarary APIs
+ CreateTypeLib @160
+ LoadTypeLib @161
+ LoadRegTypeLib @162
+ RegisterTypeLib @163
+ QueryPathOfRegTypeLib @164
+ LHashValOfNameSys @165
+#if OE_WIN32
+ LHashValOfNameSysA @166
+#endif //OE_WIN32
+
+ ; New API's for OA94
+ OaBuildVersion @170
+
+ ; Rich error APIs
+ GetErrorInfo @200
+ SetErrorInfo @201
+ CreateErrorInfo @202
+
+ ; Mac Specific Entry Points
+#if OE_MACPPC
+
+ ; TypeLib
+ LoadTypeLibFSp @300
+ QueryTypeLibFolder @301
+ RegisterTypeLibFolder @302
+
+ ; NLS
+ CompareStringA @403
+ LCMapStringA @400
+ GetLocaleInfoA @404
+ GetStringTypeA @405
+ GetSystemDefaultLangID @406
+ GetUserDefaultLangID @407
+ GetSystemDefaultLCID @408
+ GetUserDefaultLCID @409
+#endif
diff --git a/private/oleauto/src/typelib/oleaut32.rc b/private/oleauto/src/typelib/oleaut32.rc
new file mode 100644
index 000000000..e5da7e63f
--- /dev/null
+++ b/private/oleauto/src/typelib/oleaut32.rc
@@ -0,0 +1,96 @@
+/***
+*oleaut32.rc - Resource file for oleaut32.DLL
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file in the resource file for oleaut32.DLL that is compiled and
+* added to the file. String resources are included in this file
+* via an include statement, since these are automatically generated.
+*
+*Revision History:
+*
+* [00] 07-Feb-94 dougf: Created from ole2disp.rc & typelib.rc
+* [00] 04-Jan-93 ilanc: Created --
+*
+*****************************************************************************/
+
+// This includes WINDOWS.H, and all the OB switches, like ID_DEBUG, etc.
+#include "obwin.hxx"
+
+#include "verstamp.h" // for 'rup'
+
+#ifndef OLEMINORVERS
+#define OLEMINORVERS 10 // assume OLE 2.10
+#endif //!OLEMINORVERS
+
+/* Version information -- hardcoded */
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 2,OLEMINORVERS,rup,01
+PRODUCTVERSION 2,OLEMINORVERS,rup,01
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+
+#if 0
+#define BETAFLAG VS_FF_PRERELEASE
+#else //1
+#define BETAFLAG 0L
+#endif //1
+
+#if ID_DEBUG
+FILEFLAGS VS_FF_DEBUG | BETAFLAG
+#else // !ID_DEBUG
+FILEFLAGS BETAFLAG
+#endif // !ID_DEBUG
+FILEOS VOS_NT_WINDOWS32
+
+FILETYPE VFT_DLL
+FILESUBTYPE 0
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "Microsoft OLE 2.1 for Windows NT(TM) Operating System\0"
+ VALUE "FileVersion", "2.1\0"
+ VALUE "InternalName", "OLEAUT32.DLL\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1993-1995.\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows NT(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.1 for Windows NT(TM) Operating System\0"
+ VALUE "ProductVersion", "2.1\0"
+ VALUE "Comments", "Microsoft OLE 2.1 for Windows NT(TM) Operating System\0"
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+
+END
+
+#if ID_DEBUG
+// Assertion stuff for ole2disp
+#define ASSERT_ID_BREAK 5103
+#define ASSERT_ID_EXIT 5104
+#define ASSERT_ID_IGNORE 5105
+#define ASSERT_ID_LOC 5106
+#define ASSERT_ID_EXPR 5107
+#define ASSERT_ID_MSG 5108
+
+
+ASSERTFAILDLG DIALOG 72, 32, 260, 67
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "Assertion failure!"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CTEXT "", ASSERT_ID_LOC, 11, 15, 240, 8
+ CTEXT "", ASSERT_ID_MSG, 11, 28, 240, 8
+ PUSHBUTTON "&Break", ASSERT_ID_BREAK, 54, 47, 40, 14
+ PUSHBUTTON "E&xit", ASSERT_ID_EXIT, 110, 47, 40, 14
+ PUSHBUTTON "&Ignore", ASSERT_ID_IGNORE, 166, 47, 40, 14
+END
+#endif // ID_DEBUG
diff --git a/private/oleauto/src/typelib/olenames.h b/private/oleauto/src/typelib/olenames.h
new file mode 100644
index 000000000..806384d6c
--- /dev/null
+++ b/private/oleauto/src/typelib/olenames.h
@@ -0,0 +1,100 @@
+/*==========================================================================*
+ | olenames.h - redefinition of OLE function names for DLL entry points
+ |
+ | Purpose:
+ |
+ |
+ | Revision History:
+ |
+ |---------------------------------------------------------------------------
+ | Implementation Notes:
+ |
+ | The actual macros are generated via AWK from the OLE def files.
+ |
+ *==========================================================================*
+ | Copyright: (c) 1992, 1993 Microsoft Corporation, all rights reserved.
+ | Information Contained Herin is Proprietary and Confidential.
+ *==========================================================================*/
+
+
+
+#if !OE_MAC
+#error !This file is intended for Macintosh only
+#endif
+
+//==============================================================================
+//
+// MAC PPC Definitions
+//
+//==============================================================================
+#if OE_MACPPC
+#define ID_OLE_STAT_DOCFILE 0
+#define ID_OLE_STAT_USER 0
+#define ID_OLE_STAT_OLE2DISP 0
+#define ID_OLE_STAT_TYPELIB 0
+#define ID_OLE_STAT_DEF 0
+#define ID_OLE_STAT_COMPOBJ 0
+#define ID_OLE_STAT_PROXY 0
+#define ID_OLE_STAT_OLE2NLS 0
+
+#define ID_MUNGE_DLL_NAMES 0
+#define ID_MUNGE_STAT_NAMES 1
+
+#else // OE_MACPPC
+
+#if defined( OLENAMES_MUNGE_FOR_STATIC )
+
+#define ID_OLE_STAT_DOCFILE 1
+#define ID_OLE_STAT_USER 1
+#define ID_OLE_STAT_OLE2DISP 1
+#define ID_OLE_STAT_TYPELIB 1
+#define ID_OLE_STAT_DEF 1
+#define ID_OLE_STAT_COMPOBJ 1
+#define ID_OLE_STAT_PROXY 0
+#define ID_OLE_STAT_OLE2NLS 1
+
+#define ID_MUNGE_DLL_NAMES 0
+#define ID_MUNGE_STAT_NAMES 1
+
+#endif // OLENAMES_MUNGE_FOR_STATIC
+
+#if defined( OLENAMES_MUNGE_FOR_DLL ) // No DLL munging at this time,
+ // keep the functionality just in
+ // case we need it later!
+
+#define ID_OLE_STAT_DOCFILE 0
+#define ID_OLE_STAT_USER 0
+#define ID_OLE_STAT_OLE2DISP 0
+#define ID_OLE_STAT_TYPELIB 0
+#define ID_OLE_STAT_DEF 0
+#define ID_OLE_STAT_COMPOBJ 0
+#define ID_OLE_STAT_PROXY 0
+#define ID_OLE_STAT_OLE2NLS 0
+
+#define ID_MUNGE_DLL_NAMES 0
+#define ID_MUNGE_STAT_NAMES 0
+
+#endif // OLENAMES_MUNGE_FOR_DLL
+
+#endif// OE_MACPPC
+
+#include "namemacs.h"
+
+#if OE_MAC68K
+
+#undef ID_OLE_STAT_DOCFILE
+#undef ID_OLE_STAT_USER
+#undef ID_OLE_STAT_OLE2DISP
+#undef ID_OLE_STAT_TYPELIB
+#undef ID_OLE_STAT_DEF
+#undef ID_OLE_STAT_COMPOBJ
+#undef ID_OLE_STAT_PROXY
+#undef ID_OLE_STAT_OLE2NLS
+#undef ID_MUNGE_STAT_NAMES
+#undef ID_MUNGE_DLL_NAMES
+
+#undef OLENAMES_MUNGE_FOR_STATIC
+#undef OLENAMES_MUNGE_FOR_DLL
+
+#endif // OE_MAC68K
+
diff --git a/private/oleauto/src/typelib/oletmgr.cxx b/private/oleauto/src/typelib/oletmgr.cxx
new file mode 100644
index 000000000..a6bca2c9c
--- /dev/null
+++ b/private/oleauto/src/typelib/oletmgr.cxx
@@ -0,0 +1,468 @@
+/***
+*oletmgr.cxx - OLE_TYPEMGR definition
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* There is a single instance of the OLE_TYPEMGR per process.
+* The OLE_TYPEMGR maintains an in-memory collection of typelibs,
+* so that multiple copies of the same typelib need not be loaded
+* simultaneously.
+*
+*Implementation:
+* Each TYPEMGR instance is embedded within a SHEAP_MGR's "reserved block".
+* The memory map for this looks like:
+*
+* +--------------------------+
+* | SHEAP_MGR instance |
+* +--------------------------+ -- This is the SHEAP_MGR's reserved
+* | TYPEMGR instance | <--- block allocated by SHEAP_MGR::Create.
+* +--------------------------+
+* | LIBENTRY |
+* | instances alloc'd by | <--- Additional space allocated at the
+* | m_blkmgr in the TYPEMGR. | request of the embedded block manager.
+* +--------------------------+
+*
+*
+* The SHEAP_MGR is used instead of normal (malloc/new) heap management
+* because it is more efficient in win16 to grow a segment than to try
+* to call realloc(). On the other (flat) platforms, the SHEAP_MGR is
+* probably implemented with malloc/realloc anyway.
+*
+* This is similar to, but much more limited in functionality than,
+* OB's TYPEMGR class. There is no inheritance or code sharing between
+* them (except that OB's TYPEMGR will defer to OLE_TYPEMGR to register
+* all non-OB typelibs.
+*
+*Revision History:
+*
+* 26-Feb-93 mikewo: Created.
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+#include "oletmgr.hxx"
+#include "sheapmgr.hxx"
+#include "mem.hxx"
+#include "clutil.hxx"
+#include "xstring.h"
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+static char szOleTMgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleTMgrCxx
+#endif
+
+// This assumes OLE_TYPEMGR_cTypeLibBuckets is a power of two. Code using
+// this macro should assert that this is true (using the IsPowerOf2 macro
+// defined below.
+#define HashFileName(szFile) (HashSz(szFile) & (OLE_TYPEMGR_cTypeLibBuckets-1))
+
+// This macro determines whether or not an integer is an integral power of 2.
+// Trust me.
+#define IsPowerOf2(i) (!((i) & ((i)-1)))
+
+
+#if ID_DEBUG
+extern "C" void
+FnAssertCover(LPSTR lpstrExpr, LPSTR lpstrMsg, LPSTR lpstrFileName, UINT iLine);
+#endif // ID_DEBUG
+
+// This whole file is in the init segment of TYPELIB.DLL
+#pragma code_seg(CS_INIT)
+
+OLE_TYPEMGR::OLE_TYPEMGR()
+{
+ UINT i;
+
+ // Initialize all the locals to 0.
+ for (i = 0; i < sizeof(m_rghlibeBucket)/sizeof(m_rghlibeBucket[0]); i++)
+ m_rghlibeBucket[i] = HCHUNK_Nil;
+}
+
+OLE_TYPEMGR::~OLE_TYPEMGR()
+{
+ // Does nothing.
+}
+
+
+/***
+*static TIPERROR OLE_TYPEMGR::Create() - Create and init a new OLE_TYPEMGR instance.
+*Purpose:
+* Create and initialize a new OLE_TYPEMGR instance. Called by InitAppData.
+*
+*Entry:
+* psheapmgr - pointer to a SHEAP_MGR to be used for allocating
+* any space needed by the OLE_TYPEMGR.
+*
+*Exit:
+* Returns TIPERR_None and points *ppoletmgr to the new OLE_TYPEMGR
+* if successful.
+*
+* Returns something other than TIPERR_None if not successful. In this
+* case, *ppoletmgr remains unchanged.
+*
+***********************************************************************/
+TIPERROR OLE_TYPEMGR::Create(OLE_TYPEMGR **ppoletmgr)
+{
+ OLE_TYPEMGR *poletmgr;
+ TIPERROR tiperr;
+ SHEAP_MGR *psheapmgr;
+
+ // Create the SHEAP_MGR in which the OLE_TYPEMGR will reside.
+ if ((tiperr = SHEAP_MGR::Create(&psheapmgr, sizeof(OLE_TYPEMGR) + sizeof(SHEAP_MGR))))
+ return tiperr;
+
+ // Instantiate the OLE_TYPEMGR in the SHEAP_MGR created above.
+ poletmgr = new(psheapmgr+1) OLE_TYPEMGR;
+
+ // There should be no way for this to fail.
+ DebAssert(poletmgr != NULL, "OLE_TYPEMGR::Create");
+
+ // Initialize the OLE_TYPEMGR's block manager with the sheapmgr.
+ // Note that the only future clients of the SHEAP_MGR are this block
+ // manager and the OLE_TYPEMGR's destructor. The destructor obtains
+ // the SHEAP_MGR by subtracting its size from the OLE_TYPEMGR *.
+
+ if ((tiperr = poletmgr->m_bm.Init(psheapmgr)) != TIPERR_None) {
+ delete psheapmgr;
+ return(tiperr);
+ }
+
+ *ppoletmgr = poletmgr;
+ return(TIPERR_None);
+}
+
+/***
+* void Release() - Delete this OLE_TYPEMGR. There is no reference count,
+* so this will always delete the OLE_TYPEMGR.
+*
+***********************************************************************/
+void OLE_TYPEMGR::Release()
+{
+#if ID_DEBUG
+ // Make sure that all of the typelibs have been released.
+ CHAR szMsg[256];
+ ULONG iBucket, cLeak;
+ HLIBENTRY hlibe;
+ LIBENTRY *qlibe;
+ GenericTypeLibOLE *pgtlibole;
+ STL_TYPEINFO *pstlti;
+
+ UINT ityp, ctyps;
+
+ for (iBucket = 0; iBucket < OLE_TYPEMGR_cTypeLibBuckets; iBucket++) {
+ for (hlibe = m_rghlibeBucket[iBucket];
+ hlibe != HCHUNK_Nil;
+ hlibe = qlibe->m_hlibeNext) {
+
+ qlibe = QlibentryOfHlibentry(hlibe);
+
+ // Determine what's leaking and report it.
+ cLeak = 0;
+ pgtlibole = (GenericTypeLibOLE *)qlibe->m_ptlib;
+ ctyps = pgtlibole->GetTypeInfoCount();
+
+ for (ityp = 0; ityp < ctyps; ityp++) {
+ pstlti = pgtlibole->Qte(ityp)->m_pstltinfo;
+
+ if (pstlti) {
+ if (pstlti->CRefs() > 0) {
+ sprintf(szMsg,
+ "OLE Automation has determined that the application has leaked the following:\n\nTypeInfo \"%s\" (hte = 0x%X) of TypeLib \"%s\" (htlibe = 0x%X), cRefs = %ld\n",
+ pstlti->SzDebName(),
+ pstlti->GetIndex(),
+ pstlti->PgtlibOleContaining()->SzDebName(),
+ hlibe,
+ pstlti->CRefs());
+
+ FnAssertCover(NULL, szMsg, __FILE__, __LINE__);
+
+ cLeak += pstlti->CRefs();
+ }
+ }
+ }
+
+ // See if the typelib has leaked at all.
+ if (cLeak != pgtlibole->CRefs() || !cLeak) {
+ sprintf(szMsg,
+ "OLE Automation has determined that the application has leaked the following:\n\nTypeLib \"%s\" (htlibe = 0x%X), cRefs = %ld\n",
+ pgtlibole->SzDebName(),
+ hlibe,
+ pgtlibole->CRefs() - cLeak);
+
+ FnAssertCover(NULL, szMsg, __FILE__, __LINE__);
+ }
+ }
+ }
+#endif // ID_DEBUG
+
+ // Delete this OLE_TYPEMGR by deleting its containing SHEAP_MGR.
+ delete (((SHEAP_MGR *)this)-1);
+}
+
+
+/***
+* TIPERROR TypeLibLoaded() - Called by every typelib creator.
+*
+* Purpose:
+* This function is called by LoadTypeLib. It adds an element
+* to the szFile==>LoadedTypeLib map, mapping a copy of szFile to ptlib.
+*
+* Inputs:
+* szFile - The full path of the type library just loaded by LoadTypeLib.
+* A copy of this is made. The copy is released by
+* TipTypeLibUnloaded().
+* ptlib - The type library just created.
+*
+* Outputs:
+* Returns TIPERR_None if successful.
+* Asserts if the specified ITypeLib is already in the szFile==>ITypeLib map.
+*
+* This function does not perform any operations on ptlib itself.
+* Specifically, it does not grab another reference to the library.
+*
+*****************************************************************************/
+TIPERROR OLE_TYPEMGR::TypeLibLoaded(LPOLESTR szFile, ITypeLibA *ptlib)
+{
+ TIPERROR err = TIPERR_None;
+ HLIBENTRY hlibe = HLIBENTRY_Nil;
+ LIBENTRY *qlibe;
+
+ // Get the handle to the LIBENTRY for szFile.
+ IfErrRet(GetHlibentryOfFileName(szFile, &hlibe));
+
+ // The above call should always succeed
+ DebAssert(hlibe != HLIBENTRY_Nil, "GetHlibentryOfFileName failed");
+
+ qlibe = QlibentryOfHlibentry(hlibe);
+
+ // It should never happen that this method is called twice for
+ // the same library. Verify this.
+ DebAssert(qlibe->m_ptlib == NULL, "ITypeLib is already loaded");
+
+ qlibe->m_ptlib = ptlib;
+
+ return TIPERR_None;
+}
+
+
+/***
+* void TypeLibUnloaded() - Called by every typelib's destructor.
+*
+* Purpose:
+* This function must be called by the destructor of all implementations
+* of the ITypeLib protocol. It removes the element of the
+* szFile==>LoadedTypeLib map corresponding to ptlib.
+*
+* Inputs:
+* ptlib - The typelib being unloaded from memory.
+*
+* Outputs:
+* Asserts if ptlib was not in the map for this process.
+*
+* This function does not perform any operations on ptlib itself.
+* Specifically, it does not free ptlib. That is the responsibility
+* of the caller.
+*
+* NOTE!!!! DO NOT DEREFERENCE ptlib. It is almost certainly an invalid
+* (i.e. freed/deleted/dead/bad) pointer by this time.
+*
+*****************************************************************************/
+void OLE_TYPEMGR::TypeLibUnloaded(ITypeLibA *ptlib)
+{
+ HLIBENTRY hlibe, *qhlibe;
+ int i;
+
+ // Look up ptlib using a linear search through all the LIBENTRYs.
+ for (i = 0; i < sizeof(m_rghlibeBucket)/sizeof(m_rghlibeBucket[0]); i++) {
+ qhlibe = m_rghlibeBucket+i;
+ while (*qhlibe != HCHUNK_Nil &&
+ ptlib != QlibentryOfHlibentry(*qhlibe)->m_ptlib) {
+ qhlibe = &QlibentryOfHlibentry(*qhlibe)->m_hlibeNext;
+ }
+
+ // If the specified typelib is found, exit the loop.
+ if (*qhlibe != HCHUNK_Nil)
+ break;
+ }
+
+ // If the specified typelib is not in the hash table, don't remove it.
+ if (*qhlibe != HCHUNK_Nil) {
+
+ // Unlink the LIBENTRY from its hash collision list.
+ hlibe = *qhlibe;
+ *qhlibe = QlibentryOfHlibentry(hlibe)->m_hlibeNext;
+
+ // Free the filename string pointed at by the LIBENTRY.
+ m_bm.FreeChunk(QlibentryOfHlibentry(hlibe)->m_hszFile,
+ xstrblen0((XSZ)m_bm.QtrOfHandle(((LIBENTRY *)
+ m_bm.QtrOfHandle(hlibe))->m_hszFile)));
+
+
+ }
+
+#if !OE_WIN32
+ // Release the AppData. If there isn't any
+ // typelib loaded then the APP_DATA and the
+ // ole's typemgr will get released.
+ // Release the typemgr and IMalloc if the count of typelib
+ // goes to 0.
+ if ((--Pappdata()->m_cTypeLib) == 0) {
+ ReleaseAppData();
+ }
+#endif // !OE_WIN32
+}
+
+
+/***
+* ITypeLib *LookupTypeLib() - Maps a filename to a loaded typelib.
+*
+* Purpose:
+* This function returns a pointer to the specified ITypeLib, if it
+* is already in this OLE_TYPEMGR. If it isn't, then the caller must
+* load the typelib itself.
+*
+* Input:
+* szFile - The full path of the desired typelib.
+*
+* Output:
+* If there is a file of the specified name already in this OLE_TYPEMGR,
+* its associated typelib is returned. Otherwise, NULL is returned.
+*
+*****************************************************************************/
+ITypeLibA *OLE_TYPEMGR::LookupTypeLib(LPOLESTR szFile)
+{
+ HLIBENTRY *qhlibe;
+
+ qhlibe = LookupLibEntry(szFile);
+
+ if (qhlibe == NULL)
+ return NULL;
+
+ else
+ return (QlibentryOfHlibentry(*qhlibe))->m_ptlib;
+}
+
+/***
+* HCHUNK *LookupLibEntry() - Looks up a LIBENTRY, given its full path.
+*
+* Purpose:
+* This method looks for a LIBENTRY corresponding to the specified
+* filename. If successful, it returns a pointer to the hchunk
+* field referring to that LIBENTRY. This pointer can either be
+* dereferenced if only the value is desired, or overwritten if
+* the LIBENTRY is to be deleted. NULL is returned if the filename
+* is not found in the table.
+*
+*****************************************************************************/
+HLIBENTRY *OLE_TYPEMGR::LookupLibEntry(LPOLESTR szFile)
+{
+ UINT ihlibeHash;
+ HLIBENTRY *qhlibe;
+
+ // Get the index of the bucket in which szFile would be hashed
+ // if present.
+ ihlibeHash = HashFileName(szFile);
+
+ // Search down the hash list for a LIBENTRY whose filename string
+ // matches szFile exactly.
+ qhlibe = m_rghlibeBucket + ihlibeHash;
+ while (*qhlibe != HLIBENTRY_Nil &&
+ !IsFilenameEqual(szFile,
+ (LPOLESTR)(m_bm.QtrOfHandle(((LIBENTRY *)m_bm.QtrOfHandle(*qhlibe))->m_hszFile)))) {
+ qhlibe = &((LIBENTRY *)m_bm.QtrOfHandle(*qhlibe))->m_hlibeNext;
+ }
+
+ // If no match is found, return NULL.
+ if (*qhlibe == HLIBENTRY_Nil)
+ qhlibe = NULL;
+
+ return qhlibe;
+}
+
+
+/***
+*TIPERROR GetHlibentryOfFileName(LPSTR szFile, HLIBENTRY *qhlibe)
+*
+* Purpose: Returns the handle to the LIBENTRY corresponding to szFile.
+*
+* Defers to LookUpLibEntry() to look for a LIBENTRY corresponding
+* to the specified library id. If successful, it returns a pointer
+* to the handle of the LIBENTRY.
+* If LookUpLibEntry returns null ( LIBENTRY does not exist for this
+* filename) then a dummy LIBENTRY is created for this filename and handle
+* to this dummy LIBENTRY is returned.
+*
+* Note : for detailed description of the data structure and related
+* algorithm, pl refer to the edtcont.doc.
+*
+* Input:
+* szFile : full path of the library whose LIBENTRY needs to be returned.
+*
+* Output:
+* TIPERROR
+*
+*
+*****************************************************************************/
+TIPERROR OLE_TYPEMGR::GetHlibentryOfFileName(LPOLESTR szFile, HLIBENTRY *qhlibe)
+{
+ TIPERROR err = TIPERR_None;
+ UINT ihlibeHash;
+ HCHUNK hchunkFile;
+ HLIBENTRY hlibe, *qhlibeTmp;
+ LIBENTRY *qlibe;
+
+
+ // Check if LIBENTRY already exist
+ qhlibeTmp = LookupLibEntry(szFile);
+
+ // if there is no LIBENTRY for this filename then we need to create a
+ // dummy LIBENTRY and attach it to the hash table
+ //
+ if (qhlibeTmp == NULL) {
+ // Allocate a new LIBENTRY structure
+ if ((err = m_bm.AllocChunk(&hlibe, sizeof(LIBENTRY))))
+ return(err);
+
+ // Allocate space for a copy of szFile.
+ if ((err = m_bm.AllocChunk(&hchunkFile, ostrblen0(szFile)*sizeof(OLECHAR)))) {
+ m_bm.FreeChunk(hlibe, sizeof(LIBENTRY));
+ return(err);
+ }
+
+ // Copy szFile to the space allocated above.
+ ostrcpy((LPOLESTR)m_bm.QtrOfHandle(hchunkFile), szFile);
+
+ // Assert that OLE_TYPEMGR_cTypeLibBuckets is a power of 2.
+ DebAssert(IsPowerOf2(OLE_TYPEMGR_cTypeLibBuckets), "TypeLibLoaded");
+
+ // Get a hash value in the range 0 to <# of buckets>-1.
+ ihlibeHash = HashFileName(szFile);
+
+ qlibe = QlibentryOfHlibentry(hlibe);
+
+ // Fill the new LIBENTRY
+ qlibe->m_hszFile = hchunkFile;
+
+ // This is a dummy node so initialize m_ptlib to NULL.
+ qlibe->m_ptlib = NULL;
+
+ // Insert the new LIBENTRY into the appropriate hash list.
+ qlibe->m_hlibeNext = m_rghlibeBucket[ihlibeHash];
+ m_rghlibeBucket[ihlibeHash] = hlibe;
+
+ // Initialize the return value
+ *qhlibe = hlibe;
+
+ }
+ else
+ *qhlibe = *qhlibeTmp;
+
+ return err;
+}
+
+#pragma code_seg()
diff --git a/private/oleauto/src/typelib/oletmgr.hxx b/private/oleauto/src/typelib/oletmgr.hxx
new file mode 100644
index 000000000..8c43ba25c
--- /dev/null
+++ b/private/oleauto/src/typelib/oletmgr.hxx
@@ -0,0 +1,100 @@
+/***
+*oletmgr.hxx - TYPE_MGR header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* There is a single instance of the TYPE_MGR per process (per task in
+* in win16). The TYPE_MGR maintains an in-memory collection of TYPEINFOs
+* and ITypeLibs. It supports change information notification for types
+* and libraries under development. It also prevents a type library from
+* being loaded more than once.
+*
+*Revision History:
+*
+* 08-Apr-91 alanc: Created.
+* 18-Feb-92 mikewo: commented out old code and added ITypeLib handling.
+* 17-Sep-92 rajivk: Edit & Continue support ( CanTypeChange Register/UnRegister ).
+*
+*****************************************************************************/
+
+#ifndef OLE_TYPEMGR_HXX_INCLUDED
+#define OLE_TYPEMGR_HXX_INCLUDED
+
+#include "silver.hxx"
+#include "sheapmgr.hxx"
+#include "blkmgr.hxx"
+#include "cltypes.hxx"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szOLE_TYPEMGR_HXX)
+#define SZ_FILE_NAME g_szOLE_TYPEMGR_HXX
+#endif
+
+
+typedef HCHUNK HLIBENTRY;
+typedef sHCHUNK sHLIBENTRY;
+#define HLIBENTRY_Nil HCHUNK_Nil
+
+/***
+* This structure appears in the hash table lists hanging off of
+* m_rghlibeBucket[].
+******************************************************************/
+struct LIBENTRY
+{
+ HCHUNK m_hszFile;
+ ITypeLibA *m_ptlib;
+ HLIBENTRY m_hlibeNext;
+};
+
+const UINT OLE_TYPEMGR_cTypeLibBuckets = 32;
+
+/***
+*class OLE_TYPEMGR - 'oletmgr'
+*Purpose:
+* There is a single instance of the OLE_TYPEMGR per process.
+* It maintains a mapping from LIBIDs to ITypeLibs loaded into
+* this process. This is also used for Change Notification between
+* typeinfos. This also has the knowledge of backward dependencies
+* within loaded projects.
+*
+*Implementation
+* The OLE_TYPEMGR uses a hash table to map from the LIBID string to a
+* ITypeLib pointer.
+***********************************************************************/
+
+class OLE_TYPEMGR
+{
+
+public:
+ static TIPERROR Create(OLE_TYPEMGR **ppoletmgr);
+ nonvirt void Release();
+ nonvirt TIPERROR TypeLibLoaded(LPOLESTR szFile, ITypeLibA *ptlib);
+ nonvirt void TypeLibUnloaded(ITypeLibA *ptlib);
+ nonvirt ITypeLibA *LookupTypeLib(LPOLESTR szFile);
+
+private:
+ OLE_TYPEMGR(); // Clients should use Create() and Release() methods
+ ~OLE_TYPEMGR(); // instead of new/delete.
+
+ // Helper methods.
+ nonvirt HLIBENTRY *LookupLibEntry(LPOLESTR szFile);
+ nonvirt TIPERROR GetHlibentryOfFileName(LPOLESTR szFile, HLIBENTRY *qhlibe);
+ nonvirt LIBENTRY *QlibentryOfHlibentry(HLIBENTRY hlibe);
+
+ // Data members.
+ HCHUNK m_rghlibeBucket[OLE_TYPEMGR_cTypeLibBuckets];
+ BLK_MGR m_bm;
+};
+
+/*****
+* Wrapper function
+********************************************************************/
+inline LIBENTRY *OLE_TYPEMGR::QlibentryOfHlibentry(HLIBENTRY hlibe)
+{
+ return (LIBENTRY *) (m_bm.QtrOfHandle((HCHUNK) hlibe));
+}
+
+#endif // ! OLE_TYPEMGR_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/rtarray.h b/private/oleauto/src/typelib/rtarray.h
new file mode 100644
index 000000000..ef86a9e15
--- /dev/null
+++ b/private/oleauto/src/typelib/rtarray.h
@@ -0,0 +1,39 @@
+/* rtarray.h - variable array support
+*
+* Revision History:
+* 11-Aug-92 w-peterh: added suppport for UserDefined Types
+* 30-Apr-93 w-jeffc: added layout strings for DD and AD
+*
+*************************************************************************/
+
+
+#ifndef RTARRAY_H_INCLUDED
+#define RTARRAY_H_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// HARRAY_DESC- harraydesc
+
+typedef HCHUNK HARRAY_DESC;
+typedef sHCHUNK sHARRAY_DESC;
+const HARRAY_DESC HARRAYDESC_Nil = (HARRAY_DESC)HCHUNK_Nil;
+
+
+// layout string for TYPE_DATA byte swapping
+#define DD_LAYOUT "ll"
+
+
+// layout string for TYPE_DATA byte swapping
+#define AD_LAYOUT "ssssll"
+
+
+extern UINT ENCALL CbSizeArrayDesc(UINT);
+
+#ifdef __cplusplus
+} /* extern C */
+#endif
+
+
+#endif /* RTARRAY_H_INCLUDED */
diff --git a/private/oleauto/src/typelib/rtsheap.cxx b/private/oleauto/src/typelib/rtsheap.cxx
new file mode 100644
index 000000000..f7c2bf0a3
--- /dev/null
+++ b/private/oleauto/src/typelib/rtsheap.cxx
@@ -0,0 +1,473 @@
+/**
+*rtsheap.cxx - Implementation of C wrapper for SHEAPMGR.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the C API needed to wrap the
+* SHEAPMGR/BLKMGR/DYN_BLKMGR so that the run-time can call it.
+*
+*Revision History:
+*
+* 31-Aug-92 ilanc: Created.
+* 10-Feb-93 RajivK: Changed the error checking in HsysAlloc
+*
+*
+*****************************************************************************/
+
+#include "switches.hxx"
+#include "version.hxx"
+
+#if OE_MAC
+// include Mac stuff
+#include "macos\memory.h"
+#endif
+
+#include "silver.hxx"
+#include "typelib.hxx"
+#include "rtsheap.h"
+#include "sheapmgr.hxx"
+#include "blkmgr.hxx"
+#include "dblkmgr.hxx"
+#include <stdlib.h>
+
+#pragma hdrstop(RTPCHNAME)
+
+#if OE_MAC
+ #include "macos\errors.h"
+ THz g_pOBZone = NULL; // ptr to zone to alloc out of
+ // this is initialized in EbThreadDllInit.
+ // size declarations are also carried there.
+#endif
+
+#if OE_WIN16
+#pragma optimize("q",off)
+#endif //OE_WIN16
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleRtsheapCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleRtsheapCxx
+#else
+static char szRtsheapCxx[] = __FILE__;
+#define SZ_FILE_NAME szRtsheapCxx
+#endif
+#endif
+
+
+
+// **************************************************
+// Low-level system moveable memory allocation wrappers
+// **************************************************
+//
+
+/***
+* HsysAlloc
+*
+* Purpose:
+* Allocate a system memblock of given size and return its handle.
+* Note: on Win16 dereferences handle and produce 32-bit
+* address = selector:offset=0.
+*
+* Inputs:
+* bch Allocation request. Can be >64K.
+*
+* Outputs:
+* Returns an HSYS. HSYS_Nil if unsuccessful.
+*
+*****************************************************************************/
+
+#pragma code_seg( CS_CORE )
+HSYS PASCAL EXPORT HsysAlloc(BCH bch)
+{
+#if OE_WIN16
+
+ VOID *pv;
+ HANDLE hMem;
+
+ if (DebErrorNow(TIPERR_OutOfMemory) ||
+ ((hMem = GlobalAlloc(GMEM_MOVEABLE, bch)) == NULL)) {
+ return HSYS_Nil;
+ }
+ else if ((pv = GlobalLock(hMem)) == NULL) {
+ return HSYS_Nil;
+ }
+ else {
+#if ID_DEBUG
+ // debug-only: init alloced mem to a weird bitpattern
+ //
+ if (bch <= USHRT_MAX) {
+ memset(pv, 0x69, (size_t)bch);
+ }
+#endif // ID_DEBUG
+ return (HSYS)pv;
+ }
+
+#elif OE_MACNATIVE
+
+ Handle hMemBlock;
+ THz pCurrZone;
+ OSErr oserr;
+
+ //--------------------------------------------------------
+ // The following is a work-around to our bogus code that
+ // caches pointers to moveable memory. The basic idea
+ // is that we allocate all such memory out of a sub-heap
+ // inside the host application (or inside our own heap when
+ // a .DLL). The zone is switched in briefly to allocate,
+ // then switched back to avoid the OS or CODE seg loads
+ // from allocating there-in.
+ //
+ // The practice of caching pointers to moveable memory on
+ // the mac should be fixed to gain optimal use of available
+ // memory. The sub-heap scheme pools available memory
+ // and keeps it from being used for loading code when data
+ // is small. Visa-versa, we cannot flush more code out
+ // when the data expands to the heap limit. (jwc)
+ //--------------------------------------------------------
+
+ DebAssert(g_pOBZone != NULL, "OB Zone used before being allocated.");
+ pCurrZone = GetZone(); // save current heap zone.
+ SetZone(g_pOBZone); // set to OB's zone.
+
+ // Allocate moveable mac memblock.
+ hMemBlock = NewHandle(bch);
+ // get the error before calling SetZone. 'Cos SetZone can
+ // change the memory error.
+ oserr = MemError();
+
+ SetZone(pCurrZone); // always restore zone.
+
+ if (oserr) {
+ return HSYS_Nil;
+ }
+ else {
+ return (HSYS)hMemBlock;
+ }
+
+#elif OE_MAC
+
+ Handle hMemBlock;
+ OSErr oserr;
+
+ // Allocate moveable mac memblock.
+ hMemBlock = NewHandle(bch);
+ oserr = MemError();
+ if (oserr) {
+ return HSYS_Nil;
+ }
+ else {
+ return (HSYS)hMemBlock;
+ }
+
+#elif OE_WIN32
+
+ // Reserve and commit bch bytes.
+ return (HSYS)VirtualAlloc(NULL, bch, MEM_COMMIT, PAGE_READWRITE);
+
+#else
+#error Bad OE
+#endif
+}
+#pragma code_seg( )
+
+
+/***
+* HsysReallocHsys
+*
+* Purpose:
+* Reallocate a system memblock given handle to new size.
+* Shrinking won't move block.
+*
+* Inputs:
+* hsys Handle to sys memblock they want to realloc.
+* bchNew New size they want. Can be >64K.
+*
+* Outputs:
+* Returns an HSYS. HSYS_Nil if unsuccessful.
+*
+*****************************************************************************/
+
+HSYS PASCAL EXPORT HsysReallocHsys(HSYS hsys, BCH bchNew)
+{
+ DebAssert(hsys != HSYS_Nil, "null HSYS.");
+
+#if OE_WIN16
+
+ HANDLE hMem, hMemNew;
+ VOID *pv, *pvNew;
+ USHORT usSel;
+ DWORD dwMem;
+ DWORD dwNewSize = bchNew;
+#if ID_DEBUG
+ ULONG cbOld;
+#endif // ID_DEBUG
+
+ pv = (VOID *)hsys;
+
+ // Get selector
+ usSel = OOB_SELECTOROF(pv);
+
+ if ((dwMem = GlobalHandle((WORD)usSel)) == NULL) {
+ return HSYS_Nil;
+ }
+ else {
+ // Extract the handle.
+ hMem = (HANDLE) LOWORD(dwMem);
+
+#if ID_DEBUG
+ // get the size of the old block
+ cbOld = GlobalSize(hMem);
+#endif // ID_DEBUG
+
+ if (DebErrorNow(TIPERR_OutOfMemory) ||
+ ((hMemNew =
+ GlobalReAlloc(hMem, bchNew, GMEM_MOVEABLE)) == NULL)) {
+ return HSYS_Nil;
+ }
+ else if ((pvNew = GlobalLock(hMemNew)) == NULL) {
+ return HSYS_Nil;
+ }
+ else {
+#if ID_DEBUG
+ // if growing then init new memory with weird bitpattern
+ if (bchNew > cbOld) {
+ ULONG cbNew = bchNew - cbOld;
+ if (cbNew <= USHRT_MAX) {
+ memset((BYTE HUGE *)pvNew + cbOld, 0x69, (size_t)cbNew);
+ }
+ }
+#endif // ID_DEBUG
+ return (HSYS)pvNew;
+ }
+ }
+
+#elif OE_MACNATIVE
+
+ Handle hMemBlock;
+ THz pCurrZone;
+ OSErr oserr;
+#if ID_DEBUG
+ ULONG cbOld;
+#endif // ID_DEBUG
+
+ hMemBlock = (Handle)hsys;
+
+#if ID_DEBUG
+ // get the size of the old block
+ cbOld = GetHandleSize(hMemBlock);
+#endif // ID_DEBUG
+
+ pCurrZone = GetZone(); // save current zone
+ SetZone(HandleZone((Handle)hsys)); // must set proper zone or
+ SetHandleSize(hMemBlock, bchNew); // handle will likely
+ // jump to curr zone if it moves.
+ oserr = MemError();
+ SetZone(pCurrZone); // restore current zone.
+
+
+ if (oserr == memFullErr) {
+ // Out of memory
+ return HSYS_Nil;
+ }
+
+ DebAssert ((MemError() != nilHandleErr),
+ "HsysReallocHsys: NIL master pointer ");
+
+ DebAssert ((MemError() != memWZErr),
+ "HsysReallocHsys: Attempt to operate on free Block");
+
+ // anything else would be an undocumented error
+ DebAssert (MemError() == noErr,
+ "HsysReallocHsys: undocumented Mac error");
+
+#if ID_DEBUG
+ // if growing then init new memory with weird bitpattern
+ if (bchNew > cbOld) {
+ memset((BYTE *)*hMemBlock + cbOld, 0x69, (size_t)(bchNew - cbOld));
+ }
+#endif // ID_DEBUG
+ return (HSYS)hMemBlock;
+
+#elif OE_MAC
+
+ Handle hMemBlock;
+ OSErr oserr;
+#if ID_DEBUG
+ ULONG cbOld;
+#endif // ID_DEBUG
+
+ hMemBlock = (Handle)hsys;
+
+#if ID_DEBUG
+ // get the size of the old block
+ cbOld = GetHandleSize(hMemBlock);
+#endif // ID_DEBUG
+
+ SetHandleSize(hMemBlock, bchNew); // realloc
+ oserr = MemError();
+
+ if (oserr == memFullErr) {
+ // Out of memory
+ return HSYS_Nil;
+ }
+
+ DebAssert ((MemError() != nilHandleErr),
+ "HsysReallocHsys: NIL master pointer ");
+
+ DebAssert ((MemError() != memWZErr),
+ "HsysReallocHsys: Attempt to operate on free Block");
+
+ // anything else would be an undocumented error
+ DebAssert (MemError() == noErr,
+ "HsysReallocHsys: undocumented Mac error");
+
+#if ID_DEBUG
+ // if growing then init new memory with weird bitpattern
+ if (bchNew > cbOld) {
+ memset((BYTE *)*hMemBlock + cbOld, 0x69, (size_t)(bchNew - cbOld));
+ }
+#endif // ID_DEBUG
+ return (HSYS)hMemBlock;
+
+#elif OE_WIN32
+ HSYS hsysNew;
+ // Get current block size
+ BCH bchOld = BchSizeBlockHsys(hsys);
+
+ // Alloc memory for the new block
+ hsysNew = HsysAlloc(bchNew);
+ if (hsysNew != HSYS_Nil) {
+ // Copy old block to new
+ memcpy((BYTE *)hsysNew, (BYTE* )hsys, bchOld < bchNew ?
+ (size_t)bchOld :
+ (size_t)bchNew);
+#if ID_DEBUG
+ // if growing then init new memory with weird bitpattern
+ if (bchNew > bchOld) {
+ memset((BYTE *)hsysNew + bchOld, 0x69, (size_t)(bchNew - bchOld));
+ }
+#endif // ID_DEBUG
+
+ }
+ return hsysNew;
+
+#else
+#error Bad OE
+#endif
+}
+
+
+/***
+* FreeHsys
+*
+* Purpose:
+* Free the sys memblock given a handle.
+* Implementation:
+* On Win16, get selector part of hsys,
+* get its handle, unlock and finally free.
+* On Mac: Just use DisposHandle
+*
+* Inputs:
+* hsys Handle to memblock they want to free.
+*
+* Outputs:
+* Returns HSYS_Nil if successful, otherwise on failure
+* returns the input param.
+*
+*****************************************************************************/
+
+#pragma code_seg( CS_CORE )
+HSYS PASCAL EXPORT FreeHsys(HSYS hsys)
+{
+ DebAssert(hsys != HSYS_Nil, "null hsys.");
+
+#if OE_WIN16
+
+ HANDLE hMem;
+ DWORD dwMem;
+ USHORT usSel = OOB_SELECTOROF((VOID *)hsys);
+
+ dwMem = GlobalHandle((WORD)usSel);
+ if (dwMem == NULL) {
+ // error
+ return hsys;
+ }
+ else {
+ hMem = (HANDLE) LOWORD(dwMem);
+ GlobalUnlock(hMem); // Can't fail cos nondiscardable.
+ if (GlobalFree(hMem) != NULL) {
+ // error
+ return hsys;
+ }
+ else {
+ // ok
+ return HSYS_Nil;
+ }
+ }
+
+#elif OE_MACNATIVE
+ THz pCurrZone;
+#if ID_DEBUG
+ OSErr oserr;
+#endif
+
+ pCurrZone = GetZone(); // save current zone
+ SetZone(HandleZone((Handle)hsys)); // must set to proper zone to correctly update free list.
+
+ DisposHandle((Handle)hsys);
+
+#if ID_DEBUG
+ oserr = MemError(); // SetZone() will destroy MemError() result.
+#endif
+
+ SetZone(pCurrZone); // restore zone.
+
+ DebAssert (oserr != memWZErr,
+ "FreeHsys: attempt to operate on already free block.");
+
+ DebAssert(oserr == noErr,
+ "FreeHsys: unexpected error.");
+
+ return HSYS_Nil;
+
+#elif OE_MAC
+#if ID_DEBUG
+ OSErr oserr;
+#endif
+
+ DisposHandle((Handle)hsys);
+
+#if ID_DEBUG
+ oserr = MemError(); // SetZone() will destroy MemError() result.
+#endif
+
+ DebAssert (oserr != memWZErr,
+ "FreeHsys: attempt to operate on already free block.");
+
+ DebAssert(oserr == noErr,
+ "FreeHsys: unexpected error.");
+
+ return HSYS_Nil;
+
+#elif OE_WIN32
+
+ BOOL fFreeOk = VirtualFree((LPVOID) hsys, 0, MEM_RELEASE);
+#if ID_DEBUG
+ if (!fFreeOk) {
+ DWORD oserr = GetLastError();
+ DebHalt("FreHSys: VirtualFree failed.");
+ }
+#endif
+ return HSYS_Nil;
+#else
+#error Bad OE
+#endif
+
+}
+#pragma code_seg( )
+
+
diff --git a/private/oleauto/src/typelib/rtsheap.h b/private/oleauto/src/typelib/rtsheap.h
new file mode 100644
index 000000000..d7939264c
--- /dev/null
+++ b/private/oleauto/src/typelib/rtsheap.h
@@ -0,0 +1,128 @@
+/***
+*rtsheap.hxx - Run-time SHEAP wrapper for C API.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Defines the Rtsheap* entry points exported from ob.dll. These entry
+* points are documented in the Object Basic Host Application
+* Implementor's Guide (obguide.doc).
+*
+*Revision History:
+*
+* 31-Aug-92 ilanc: Created.
+* 28-Jan-93 ilanc: Added IsSheapEmpty
+*
+*****************************************************************************/
+
+#ifndef RTSHEAP_H_INCLUDED
+#define RTSHEAP_H_INCLUDED
+
+#include "types.h"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szRTSHEAP_H)
+#define SZ_FILE_NAME g_szRTSHEAP_H
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Handle to system memory
+// On Win16: selector:offset==0 address
+// On Win32: 32-bit pointer
+// On Mac: 32-bit Handle (pointer to master pointer).
+//
+typedef VOID* HSYS;
+#define HSYS_Nil ((HSYS)NULL)
+
+// Byte count of system alloc -- dword for "huge" arrays.
+typedef DWORD BCH;
+
+// HH: Handle to a heap -- return by a call to e.g. SheapInit.
+typedef struct SHEAP_WRAPPER* HH;
+#define HH_Nil ((HH)NULL)
+
+// BC: byte count -- entrysize.
+typedef WORD BC;
+
+// HBP: handle to entry block: implemented as HCHUNK.
+typedef sHCHUNK HBP;
+#define HBP_Nil ((HBP)HCHUNK_Nil)
+
+// **************************************************
+// Low-level system memory allocation wrappers
+// **************************************************
+//
+
+// Allocate system memory
+HSYS PASCAL EXPORT HsysAlloc(BCH bch);
+
+// Reallocate system memory.
+HSYS PASCAL EXPORT HsysReallocHsys(HSYS hsys, BCH bch);
+
+// Free system memory.
+HSYS PASCAL EXPORT FreeHsys(HSYS hsys);
+
+// Get memblock size.
+BCH PASCAL EXPORT BchSizeBlockHsys(HSYS hsys);
+
+// Lock system memblock.
+VOID * PASCAL EXPORT PvLockHsys(HSYS hsys);
+
+// Unlock system memblock.
+VOID PASCAL EXPORT UnlockHsys(HSYS hsys);
+
+// Dereference system memblock.
+VOID * PASCAL EXPORT PvDerefHsys(HSYS hsys);
+
+
+// **************************************************
+// Sheapmgr wrappers
+// **************************************************
+//
+// Sheap initialization
+HH PASCAL EXPORT SheapInit(BC bc);
+
+// Sheap termination
+VOID PASCAL EXPORT SheapTerm(HH hh);
+
+// Heap entry allocation.
+HBP PASCAL EXPORT HbpAllocHh(HH hh, BC bc);
+
+// Heap entry reallocation.
+HBP PASCAL EXPORT HbpReallocHhHbp(HH hh, HBP hbp, BC bc);
+
+// Heap entry reallocation.
+HBP PASCAL EXPORT HbpReallocHhHbp(HH hh, HBP hbp, BC bc);
+
+// Heap entry deallocation.
+VOID PASCAL EXPORT FreeHhHbp(HH hh, HBP hbp);
+
+// Return heap entry size.
+BC PASCAL EXPORT BcSizeBlockHhHbp(HH hh, HBP hbp);
+
+// Heap compaction.
+BC PASCAL EXPORT BcHeapCompactHh(HH hh, BC bc);
+
+// Handle dereference.
+VOID * PASCAL EXPORT PvDerefHhHbp(HH hh, HBP hbp);
+
+// Handle locking.
+VOID * PASCAL EXPORT PvLockHhHbp(HH hh, HBP hbp);
+
+// Handle unlocking.
+VOID PASCAL EXPORT UnlockHhHbp(HH hh, HBP hbp);
+
+// Is sheap empty?
+BOOL PASCAL EXPORT IsSheapEmpty(HH hh);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ! RTSHEAP_H_INCLUDED
diff --git a/private/oleauto/src/typelib/segnames.h b/private/oleauto/src/typelib/segnames.h
new file mode 100644
index 000000000..f076c99e2
--- /dev/null
+++ b/private/oleauto/src/typelib/segnames.h
@@ -0,0 +1,246 @@
+/***
+*segnames.h - Segment name declarations
+*
+* Copyright (C) 1991-1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is to provide names for segmentation purposes and to forward declare
+* those segment names on platforms that require it.
+*
+*
+*Revision History:
+*
+* [00] 19-Feb-94 jimcool: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+ // ------------ Include Files --------------------
+#if !defined (SWITCHES_HXX_INCLUDED)
+#include "switches.hxx"
+#endif
+
+
+ // ------------ Defines --------------------------
+// REVIEW: the following could be HC_ specific depending on what WIN32
+// wants to do with these.
+//
+// USAGE:
+//
+// ALLOC_NEAR - use to allocate data near or in the current data seg.
+// ALLOC_FAR - use to allocate data far. Use #pragma data_seg() to
+// change segment name & attributes. (Win16)
+// ALLOC_STACK - use to allocate data in stack segment
+// ALLOC_CODE - use to allocate data in the current code seg. Use
+// #pragma code_seg() to change seg name. (Win16,Mac,Win32)
+//
+#if OE_MAC68K
+#define ALLOC_CODE(type) __declspec(allocate("_CODE")) type
+#define ALLOC_NEAR(type) __declspec(allocate("_DATA")) type
+#define ALLOC_FAR(type) __declspec(allocate("_FAR_DATA")) type
+#define ALLOC_STACK(type) type
+#endif
+
+#if OE_WIN32 || OE_MACPPC
+#define ALLOC_NEAR(type) type
+#define ALLOC_FAR(type) type
+#define ALLOC_STACK(type) type
+#define ALLOC_CODE(type) type
+#endif
+
+#if OE_WIN16
+#define ALLOC_NEAR(type) type __based(__segname("_DATA"))
+#define ALLOC_FAR(type) type __based(__segname("_DATA"))
+#define ALLOC_STACK(type) type __based(__segname("_STACK"))
+#define ALLOC_CODE(type) type __based(__segname("_CODE"))
+#endif
+
+
+
+//
+// Segment Names:
+//
+//
+// Definitions:
+// ------------
+//
+// CS_CORE - Frequently called code (working set)
+// CS_CORE2 - split into two segs under debug for size reasons
+// CS_DEBUG - ID_DEBUG only code (cuts working set)
+// CS_INIT - Code used at startup and after
+// CS_CREATE - Code used only at typelib creation (by mktyplib)
+// CS_LAYOUT - GEN_DTINFO::LayOut() and things it calls. This
+// is used when loading a Dual Interface typelib
+// (CS_INIT) and from mktyplib (CS_CREATE), so split
+// into its own segment
+// CS_QUERY - Code used by QueryPathOfRegTypeLib (only routine
+// called at startup by some apps)
+// CS_RARE - Rarely called code (cuts working set size)
+// CS_DBCSHASH - LHashValOfDBCSName and its tables and helpers
+// CS_CP - Common code page data for LHashValOfNameSys
+// CS_CPW... - Windows code page data for LHashValOfNameSys
+// CS_CPM... - Mac code page data for LHashValOfNameSys
+//
+
+#if !OE_WIN32 && !OE_MACPPC
+
+#if OE_MAC
+
+#define CS_CORE "TLibCore", "swappable"
+#define CS_CORE2 "TLibCore", "swappable"
+#define CS_DEBUG "TLibDebug", "swappable"
+#define CS_INIT "TLibLoad", "swappable"
+#define CS_CREATE "TLibCreate", "swappable"
+#define CS_LAYOUT "TLibLayOut", "swappable"
+#define CS_QUERY "TLibQuery", "swappable"
+#define CS_RARE "TLibRare", "swappable"
+#define CS_DBCSHASH "TLibHash", "swappable"
+#define CS_CP1250 "TLibCP1250", "swappable"
+#define CS_CP1251 "TLibCP1251", "swappable"
+#define CS_CP1252 "TLibCP1252", "swappable"
+#define CS_CP1255 "TLibCP1255", "swappable"
+#define CS_CP1256 "TLibCP1256", "swappable"
+#define CS_CP10000 "TLibCP10000", "swappable"
+#define CS_CP10004 "TLibCP10004", "swappable"
+#define CS_CP10005 "TLibCP10005", "swappable"
+#define CS_CP10029 "TLibCP10029", "swappable"
+#define CS_CP10007 "TLibCP10007", "swappable"
+#define CS_CPWGREEK "TLibCPWGre", "swappable"
+#define CS_CPWICELAND "TLibCPWIce", "swappable"
+#define CS_CPWTURKISH "TLibCPWTur", "swappable"
+#define CS_CPWNORWEGIAN "TLibCPWNor", "swappable"
+#define CS_CPWENGIRELAND "TLibCPWIre", "swappable"
+#define CS_CPMGREEK "TLibCPMGre", "swappable"
+#define CS_CPMNORWEGIAN "TLibCPMNor", "swappable"
+#define CS_CPMENGIRELAND "TLibCPMIre", "swappable"
+
+#elif OE_WIN16
+
+#define CS_CORE "TLibCore"
+#define CS_CORE2 "TLibCore"
+#define CS_DEBUG "TLibDebug"
+#define CS_INIT "TLibLoad"
+#define CS_CREATE "TLibCreate"
+#define CS_LAYOUT "TLibLayOut"
+#define CS_QUERY "TLibQuery"
+#define CS_RARE "TLibRare"
+#define CS_DBCSHASH "TLibHash"
+#define CS_CP1250 "TLibCP1250"
+#define CS_CP1251 "TLibCP1251"
+#define CS_CP1252 "TLibCP1252"
+#define CS_CP1255 "TLibCP1255"
+#define CS_CP1256 "TLibCP1256"
+#define CS_CP10000 "TLibCP10000"
+#define CS_CP10004 "TLibCP10004"
+#define CS_CP10005 "TLibCP10005"
+#define CS_CP10029 "TLibCP10029"
+#define CS_CP10007 "TLibCP10007"
+#define CS_CPWGREEK "TLibCPWGre"
+#define CS_CPWICELAND "TLibCPWIce"
+#define CS_CPWTURKISH "TLibCPWTur"
+#define CS_CPWNORWEGIAN "TLibCPWNor"
+#define CS_CPWENGIRELAND "TLibCPWIre"
+#define CS_CPMGREEK "TLibCPMGre"
+#define CS_CPMNORWEGIAN "TLibCPMNor"
+#define CS_CPMENGIRELAND "TLibCPMIre"
+
+#else // OE_WIN16
+#error !Unsupported Platform
+#endif // OE_WIN16
+
+//
+// Win-32 & PowerPC prefers no explicit segmentation.
+//
+#else // !OE_WIN32 && !OE_MACPPC
+
+#define CS_CORE
+#define CS_CORE2
+#define CS_DEBUG
+#define CS_INIT
+#define CS_CREATE
+#define CS_LAYOUT
+#define CS_QUERY
+#define CS_RARE
+#define CS_DBCSHASH
+#define CS_CP1250
+#define CS_CP1251
+#define CS_CP1252
+#define CS_CP1255
+#define CS_CP1256
+#define CS_CP10000
+#define CS_CP10004
+#define CS_CP10005
+#define CS_CP10029
+#define CS_CP10007
+#define CS_CPWGREEK
+#define CS_CPWICELAND
+#define CS_CPWTURKISH
+#define CS_CPWNORWEGIAN
+#define CS_CPWENGIRELAND
+#define CS_CPMGREEK
+#define CS_CPMNORWEGIAN
+#define CS_CPMENGIRELAND
+
+#endif // !OE_WIN32 && !OE_MACPPC
+
+
+// On Wings & PowerPC compilers, must forward declare section names.
+#if OE_MAC
+
+#pragma code_seg(CS_CORE)
+#pragma code_seg(CS_CORE2)
+#pragma code_seg(CS_DEBUG)
+#pragma code_seg(CS_INIT)
+#pragma code_seg(CS_CREATE)
+#pragma code_seg(CS_LAYOUT)
+#pragma code_seg(CS_QUERY)
+#pragma code_seg(CS_RARE)
+#pragma code_seg(CS_DBCSHASH)
+#pragma code_seg(CS_CP1250)
+#pragma code_seg(CS_CP1251)
+#pragma code_seg(CS_CP1252)
+#pragma code_seg(CS_CP1255)
+#pragma code_seg(CS_CP1256)
+#pragma code_seg(CS_CP10000)
+#pragma code_seg(CS_CP10004)
+#pragma code_seg(CS_CP10005)
+#pragma code_seg(CS_CP10029)
+#pragma code_seg(CS_CP10007)
+#pragma code_seg(CS_CPWGREEK)
+#pragma code_seg(CS_CPWICELAND)
+#pragma code_seg(CS_CPWTURKISH)
+#pragma code_seg(CS_CPWNORWEGIAN)
+#pragma code_seg(CS_CPWENGIRELAND)
+#pragma code_seg(CS_CPMGREEK)
+#pragma code_seg(CS_CPMNORWEGIAN)
+#pragma code_seg(CS_CPMENGIRELAND)
+#pragma code_seg()
+
+#endif // OE_MAC
+
+
+// Some more #pragma macros //
+
+#if OE_MAC
+
+#if defined (_PCODE)
+
+#define PCODE_OFF optimize( "q", off )
+#define PCODE_ON optimize( "q", on )
+
+#else // _PCODE
+
+#define PCODE_OFF
+#define PCODE_ON
+
+#endif // _PCODE
+
+#else // OE_MAC
+
+#define PCODE_OFF
+#define PCODE_ON
+
+#endif //OE_MAC
diff --git a/private/oleauto/src/typelib/segorder.asm b/private/oleauto/src/typelib/segorder.asm
new file mode 100644
index 000000000..553c2c1eb
--- /dev/null
+++ b/private/oleauto/src/typelib/segorder.asm
@@ -0,0 +1,99 @@
+;***
+;segorder.asm - Control segment ordering in the Win16 build
+;
+; Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+; Information Contained Herein Is Proprietary and Confidential.
+;
+;Purpose:
+; This file defines the segment order for Win16 Typelib.dll. Segments
+; not listed here will be at the mercy of the linker.
+;
+; WARNING: THIS FILE MUST BE THE FIRST OBJECT FILE IN THE LIST PASSED TO
+; THE LINKER. IF IT IS NOT, THIS FILE WILL NOT WORK.
+;
+;Revision History:
+;
+; [00] 27-Sep-94 barrybo: Created
+;
+;Implementation Notes:
+;
+;******************************************************************************
+
+ .286
+ .MODEL LARGE, C
+
+ ; Pack these logical segments into one physical segment
+ .CODE _TEXT
+ .CODE TLibQuery
+ .CODE WEP_TEXT
+
+ INITGROUP GROUP _TEXT, TLibQuery, WEP_TEXT
+
+
+ ; Pack segments not used during typelib load or registration
+ .CODE MEM_TEXT
+ .CODE DFSTREAM_TEXT
+ .CODE ENTRYMGR_TEXT
+ .CODE DFNTBIND_TEXT
+ .CODE GBINDTBL_TEXT
+ .CODE DSTRMGR_TEXT
+ .CODE GPTBIND_TEXT
+ .CODE DFNTCOMP_TEXT
+
+ RAREGROUP GROUP MEM_TEXT, DFSTREAM_TEXT, ENTRYMGR_TEXT, DFNTBIND_TEXT
+ RAREGROUP GROUP GBINDTBL_TEXT, DSTRMGR_TEXT, GPTBIND_TEXT, DFNTCOMP_TEXT
+
+ ; Pack other segments together as tightly as possible
+
+ .CODE BLKMGR_TEXT
+ .CODE FSTREAM_TEXT
+ .CODE SHEAPMGR_TEXT
+ .CODE RTSHEAP_TEXT
+ .CODE TLIBUTIL_TEXT
+ .CODE TLIBGUID_TEXT
+ .CODE OBGUID_TEXT
+ .CODE STLTINFO_TEXT
+ .CODE NAMMGR_TEXT
+ .CODE GTLIBOLE_TEXT
+ .CODE IMPMGR_TEXT
+
+ MISC1GROUP GROUP BLKMGR_TEXT, FSTREAM_TEXT, SHEAPMGR_TEXT, RTSHEAP_TEXT
+ MISC1GROUP GROUP TLIBUTIL_TEXT, TLIBGUID_TEXT, OBGUID_TEXT, STLTINFO_TEXT
+ MISC1GROUP GROUP NAMMGR_TEXT, GTLIBOLE_TEXT, IMPMGR_TEXT
+
+ .CODE ERRMAP_TEXT
+ .CODE CLUTIL_TEXT
+ .CODE TDATA1_TEXT
+ .CODE TDATA2_TEXT
+ .CODE DTMBRS_TEXT
+ .CODE DTBIND_TEXT
+ .CODE OLEConst
+ .CODE DBINDTBL_TEXT
+ .CODE GTLIBSTG_TEXT
+ .CODE COMDAT_SEG1
+
+ MISC2GROUP GROUP ERRMAP_TEXT, CLUTIL_TEXT, TDATA1_TEXT, TDATA2_TEXT
+ MISC2GROUP GROUP DTMBRS_TEXT, DTBIND_TEXT, DTBIND_TEXT, OLEConst
+IFDEF _DEBUG
+ ; MISC2 is too big for the debug build, so add an extra physical segment
+ MISC3GROUP GROUP DBINDTBL_TEXT, GTLIBSTG_TEXT, COMDAT_SEG1
+ELSE
+ MISC2GROUP GROUP DBINDTBL_TEXT, GTLIBSTG_TEXT, COMDAT_SEG1
+ENDIF
+
+ ; CORE is really the MBString stuff and TLibCore
+
+ .CODE TLibCore
+ .CODE MBSTRING_TEXT
+ COREGROUP GROUP TLibCore, MBSTRING_TEXT
+
+ ; put debugging stuff together here
+IFDEF _DEBUG
+ .CODE DEBUG2_TEXT
+ .CODE TLibDebug
+ DEBUGGROUP GROUP DEBUG2_TEXT, TLibDebug
+ENDIF
+
+ ; all other segments are not packed
+
+ END
diff --git a/private/oleauto/src/typelib/sheapmgr.cxx b/private/oleauto/src/typelib/sheapmgr.cxx
new file mode 100644
index 000000000..5aae0d6b1
--- /dev/null
+++ b/private/oleauto/src/typelib/sheapmgr.cxx
@@ -0,0 +1,1996 @@
+/***
+*sheapmgr.cxx - Silver Heap Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The silver Heap Manager describes a heap manager that
+* manages contiguous blocks of memory in a heap. Blocks are
+* accessed via block descriptor object (BLK_DESC)
+* upon allocation and maybe grown/shrunk.
+* See \silver\doc\ic\sheapmgr.doc for more information.
+*
+* This file implements the following classes:
+* SHEAP_MGR
+* BLK_DESC
+*
+*Revision History:
+* 14-Feb-91 ilanc: Created.
+* 27-Feb-91 ilanc: Removed 2nd param on SHEAP_MGR::Init()
+* 07-Mar-91 petergo: added NO_INCLUDE_AFX
+* 15-Mar-91 ilanc: Modified to use OS-independent mem mgmt.
+* 28-Mar-91 ilanc: Constructor asserts if not seg aligned.
+* 31-Mar-91 ilanc: Fixed Realloc. (Allow |dbSize| > 2^15).
+* 04-Apr-91 ilanc: Subsumes blkdesc.cxx -- all BLK_DESC
+* outline methods are here as well.
+* 15-Apr-91 ilanc: Removed NO_INCLUDE_AFX since need exceptions.
+* 29-Aug-91 ilanc: Zapped #if (_MSC_VER) test (C7 does static
+* const members ok now).
+* 26-Sep-91 ilanc: Return TIPERR_OutOfMemory instead of
+* asserting that blocksize <= USHRT_MAX for
+* segmented archs.
+* 20-Mar-92 martinc: added support for Mac (OE_MAC)
+* changed REALMODEMemRealloc to call MemRealloc
+* 07-Apr-92 ilanc: Added DebSheapShake().
+* 15-Apr-92 martinc: Commented the Mac specific memory mgmt out
+* (now does the same as in Realmode)
+* 20-Apr-92 martinc: restored file i/o for OE_MAC
+* 20-Sept-92 Rajivk: Sheapshaking
+* 19-Mar-93 ilanc: OE_MAC renamed OE_MACNATIVE (since it uses
+* macos moveable memory). Introduced new OE_MAC
+* to mean fixed memory for blocks.
+*
+*
+*Implementation Notes:
+* Uses AllocSeg to allocate heap segment.
+* Uses ReallocSeg to reallocate.
+* Uses FreeSeg to free.
+* [All of above implemented in mem.cxx -- which has Win and Os/2 versions]
+*
+* CONSIDER: using BASED POINTERS - unclear whether
+* supported on 32-bit flat and Mac. If SHEAP_MGR
+* goes away in 32-bit world, then can use
+* based pointers in 16:16 plus use block allocation lib.
+*
+*****************************************************************************/
+
+#define SHEAPMGR_VTABLE // export sheap mgr vtable.
+#define BLKDESC_VTABLE // export blk desc vtable
+
+#include "switches.hxx"
+#include "version.hxx"
+#include "obwin.hxx"
+
+#include <stdlib.h> // for min.
+#include <string.h> // for memmove.
+
+// Nonuse of precompiled headers only works for WIN16
+// and WIN32.
+
+#if OE_REALMODE || OE_MAC
+
+// do nothing...
+
+#elif OE_MACNATIVE
+# include "macos\Memory.h"
+#endif
+
+#include "silver.hxx"
+#include "typelib.hxx"
+#include "tls.h"
+#include "mem.hxx"
+#include "sheapmgr.hxx"
+#include "debug.hxx"
+#include "stream.hxx"
+#include "rtsheap.h"
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleSheapmgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleSheapmgrCxx
+#else
+static char szSheapmgrCxx[] = __FILE__;
+#define SZ_FILE_NAME szSheapmgrCxx
+#endif
+#endif
+
+
+
+
+#if ID_DEBUG
+extern BOOL g_fSheapShakingOn; // defaults to FALSE (in tshell.cxx)
+
+static LONG g_cSheapmgr = 0;
+BOOL g_fValidSheapmgrList = TRUE;
+ITLS g_itlsSheapmgr = ITLS_EMPTY;
+#endif
+
+
+// allocs bigger than this cause trouble on Win16 when running in Standard
+// Mode on a 80286/NT Wow: GlobalReAlloc of sizes > CBALLOCMAX may cause
+// the selector to change. To avoid this, the max size of all sheaps has
+// been shrunk by 32 bytes. (vba2 #3982)
+#define CBALLOCMAX (WORD)0xFFDF
+
+
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+#if OE_SEGMENTED
+
+#if ID_DEBUG
+// These are tracked only in the os/2 debug build.
+ULONG g_cbSegsAllocd, g_cbSegsAllocdMax;
+#endif
+
+// Segment alloc stuff.
+/***
+*USHORT AllocSeg - Allocates a segment under Win or Os/2.
+*
+*Purpose:
+* Allocates a segment under Win or Os/2.
+*
+*Entry:
+* usSize - Count of bytes to allocate. Must be < 64K.
+* If usSize == 0, 64K will be allocated.
+*
+*Exit:
+* Returns a 16-bit segment selector. Return (invalid selector) 0
+* if fails.
+*
+*Implementation Notes:
+* Os/2: Simply calls DosAllocSeg.
+* Win: Calls GlobalAlloc to get a handle, then dereferences
+* the handle with GlobalLock and returns selector part
+* of pointer to memblock.
+*
+*Errors:
+* Returns 0 if:
+* Os/2: ERR_DosAllocSegFailed
+* Win: ERR_GlobalAllocFailed
+* ERR_GlobalLockFailed
+*
+****************************************************************/
+
+USHORT AllocSeg(ULONG ulSize)
+{
+#if OE_WIN16
+
+ VOID *pv;
+ HSYS hsys;
+ DWORD dwSize = ulSize;
+
+ if (ulSize > CBALLOCMAX) //GlobalReAlloc causes selector movement for allocs > 0xffdf bytes
+ return 0;
+
+ // If ulSize == 0, then actually want to allocate 64K.
+ if (!ulSize)
+ dwSize = CBALLOCMAX;
+
+ if ((hsys = HsysAlloc(dwSize)) == HSYS_Nil) {
+ return 0;
+ }
+ else {
+ pv = (VOID *)hsys;
+ DebAssert(OOB_OFFSETOF(pv) == 0, "HsysAlloc: whoops! non-seg aligned.");
+ return OOB_SELECTOROF(pv);
+ }
+
+#else
+#error
+#endif // OE_WIN16
+}
+
+
+/***
+*TIPERROR ReallocSeg - Reallocates a segment under Win or Os/2.
+*
+*Purpose:
+* Reallocates a segment under Win or Os/2.
+*
+*Entry:
+* usNewSize - Count of bytes to allocate. Must be < 64K.
+* If usNewSize == 0, 64K will be allocated.
+* usSel - Selector of segment to reallocate.
+*Exit:
+* TIPERROR
+*
+*Implementation Notes:
+* Os/2: Simply calls DosReallocSeg.
+* Win: Calls GlobalHandle to get handle of selector and then
+* GlobalReAlloc. Since we are managing segments of <=64K
+* the handle returned is the same as the handle passed in.
+*
+*Errors:
+* Returns TIPERR_OutOfMemory if:
+* Os/2: ERR_DosReallocSegFailed
+* Win: ERR_GlobalHandleFailed
+* ERR_GlobalReAllocFailed
+****************************************************************/
+
+TIPERROR ReallocSeg(ULONG ulNewSize, USHORT usSel)
+{
+#if OE_WIN16
+
+ HSYS hsys, hsysNew;
+ DWORD dwNewSize = ulNewSize;
+
+ if (ulNewSize > CBALLOCMAX) //GlobalReAlloc causes selector movement for allocs > 0xffdf bytes
+ return TIPERR_OutOfMemory;
+
+ // If ulNewSize == 0, then actually want to allocate 64K.
+ if (!ulNewSize)
+ dwNewSize = CBALLOCMAX;
+
+ hsys = (HSYS)OOB_MAKEP(usSel, 0);
+
+ // Finally, do the reallocation.
+ hsysNew = HsysReallocHsys(hsys, dwNewSize);
+ if (hsysNew == HSYS_Nil) {
+ return TIPERR_OutOfMemory;
+ }
+ else {
+ DebAssert(hsysNew == hsys, "whoops! block moved.");
+ return TIPERR_None;
+ }
+
+#else
+#error
+#endif
+}
+
+
+/***
+*TIPERROR FreeSeg - Frees an allocated segment under Win or Os/2.
+*
+*Purpose:
+* Frees an allocated segment under Win or Os/2.
+*
+*Entry:
+* usSel - Selector of segment to free.
+*
+*Exit:
+* TIPERROR
+*
+*Implementation Notes:
+* Os/2: Simply calls DosFreeSeg.
+* Win: Calls GlobalHandle to get handle of selector and then
+* GlobalUnlock to release it. Finally GlobalFree.
+*
+*Errors:
+* Return TIPERR_OutOfMemory if:
+* Os/2: ERR_DosFreeSegFailed
+* Win: ERR_GlobalHandleFailed
+* ERR_GlobalUnlockFailed
+* ERR_GlobalFreeFailed
+****************************************************************/
+
+TIPERROR FreeSeg(USHORT usSel)
+{
+
+#if OE_WIN16
+
+ HSYS hsys;
+
+ hsys = (HSYS)OOB_MAKEP(usSel, 0);
+
+ if (FreeHsys(hsys) != HSYS_Nil) {
+ return TIPERR_OutOfMemory;
+ }
+ else {
+ return TIPERR_None;
+ }
+
+#else
+#error
+#endif
+}
+
+#endif // OE_SEGMENTED
+
+#endif // !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+// The static class constant "initial heap size" is initialized here.
+
+#if OE_SEGMENTED || OE_REALMODE || OE_MACNATIVE || OE_MAC || OE_RISC || OE_WIN32
+
+// const UINT SHEAP_MGR::m_cbSizeInitial = 0x100; // Initial heap size
+CONSTDATA UINT SHEAP_MGR::m_cbSizeInitial = 0x20; // Initial heap size
+
+#endif // OE
+
+
+/***
+*STATIC PUBLIC SHEAP_MGR::Create - Create a heap manager.
+*Purpose:
+* Allocs and inits a heap manager.
+* Operator new is protected so that clients can't call it
+* and have to call Create. The actual implementation
+* of new is inlined here.
+*
+*Implementation Notes:
+* If Init() fails, deletes heap and resets *ppsheapmgr.
+*
+*Entry:
+* cbSizeReserved - Byte count to reserve at start of seg.
+*
+*Exit:
+* Inits m_pblkdescFirst.
+* Returns TRUE if successful.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR SHEAP_MGR::Create(SHEAP_MGR **ppsheapmgr, UINT cbSizeReserved)
+{
+ TIPERROR err;
+ SHEAP_MGR *psheapmgr;
+
+ DebAssert(ppsheapmgr, "bad param.");
+
+ err = TIPERR_None;
+
+
+#if OE_SEGMENTED
+
+ USHORT usSel;
+
+ usSel = AllocSeg(cbSizeReserved);
+ psheapmgr = (usSel == 0) ? NULL : (SHEAP_MGR *)OOB_MAKEP(usSel, 0);
+
+#elif OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+ // On Mac, MemAlloc is defined in terms of host-supplied implementation
+ // of IMalloc.
+ //
+ psheapmgr = (SHEAP_MGR *)MemAlloc(cbSizeReserved);
+
+#elif OE_MACNATIVE
+
+ psheapmgr = (SHEAP_MGR *)MemAlloc(cbSizeReserved);
+
+#endif
+
+ if (psheapmgr == NULL) {
+ return TIPERR_OutOfMemory;
+ }
+
+#if ID_DEBUG
+ if (g_itlsSheapmgr == ITLS_EMPTY) {
+ if ((g_itlsSheapmgr = TlsAlloc()) == ITLS_EMPTY)
+ return TIPERR_OutOfMemory;
+ }
+
+ ++g_cSheapmgr;
+
+ // Add the sheap manager to the per-thread list of sheapmgrs.
+ //
+ DebAddSheapmgrToList(psheapmgr);
+#endif
+
+ // Construct in place
+ ::new (psheapmgr) SHEAP_MGR;
+
+
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+ psheapmgr->m_cbSizeHeap = cbSizeReserved;
+#endif // !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+ // And initialize
+ if (err = psheapmgr->Init(cbSizeReserved)) {
+ delete psheapmgr;
+ return err;
+ }
+
+ *ppsheapmgr = psheapmgr;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC SHEAP_MGR::operator new - allocates memory for heap seg.
+*Purpose:
+*
+*Implementation Notes:
+* We assert in debug -- clients aren't supposed to be able
+* to call.
+*
+*Entry:
+*
+*Exit:
+*
+*Errors:
+*
+*
+***********************************************************************/
+
+void *SHEAP_MGR::operator new(size_t size)
+{
+ DebHalt("SHEAP_MGR::operator new: can't call.");
+ return NULL;
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::operator delete - destroys heap seg mem.
+*Purpose:
+* Destroys heap seg mem.
+*
+*Implementation Notes:
+* Uses FreeSeg.
+*
+*Entry:
+* pv - Pointer to SHEAP_MGR to delete.
+*
+*Exit:
+* None.
+*
+*Errors:
+* IGNORED
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+void SHEAP_MGR::operator delete(void *pv)
+{
+#if OE_SEGMENTED
+
+ FreeSeg(OOB_SELECTOROF(pv));
+
+#elif OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+ // On Mac, MemFree is defined in terms of host-supplied
+ // implementation of IMalloc.
+ //
+ MemFree(pv);
+
+#elif OE_MACNATIVE
+ // Free the sheapmgr instance itself.
+ MemFree(pv);
+
+#endif
+}
+#pragma code_seg()
+
+// SHEAP_MGR: Class methods
+//
+
+/***
+*PUBLIC SHEAP_MGR::SHEAP_MGR - constructor
+*Purpose:
+*
+* Asserts that is allocated on seg boundary, hence no other
+* need assert that.
+* Calls Invalidate().
+* Note that Init() must still be called before
+* this heap manager can be used.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+SHEAP_MGR::SHEAP_MGR()
+{
+#if OE_SEGMENTED
+
+ DebAssert(OOB_OFFSETOF(this) == 0,
+ "SHEAP_MGR:SHEAP_MGR: Heap mgr not allocated on seg boundary.");
+#endif // OE_SEGMENTED
+
+ // Invalidate semaphore
+ m_cLocks = (UINT)~0;
+
+#if ID_DEBUG
+ m_canSheapShake = FALSE; // assume can't be shaken
+ m_cbSizeReserved = (UINT)~0;
+ m_cDebLocks = (UINT)~0;
+#endif
+
+ m_pblkdescFirst = BD_pblkdescNil;
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+ m_cbSizeHeap = 0;
+ m_qbFree = (BYTE *)~0;
+#if OE_MACNATIVE
+ m_hMemHeap = (Handle)HSYS_Nil;
+#endif
+#endif
+}
+#pragma code_seg()
+
+/***
+*PUBLIC SHEAP_MGR::~SHEAP_MGR - destructor
+*Purpose:
+* Destroys a heap manager.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+SHEAP_MGR::~SHEAP_MGR()
+{
+#if ID_DEBUG
+ // remove this sheapmgr from the threads current list of sheapmgrs
+ DebRemoveSheapmgrFromList(this);
+
+ --g_cSheapmgr;
+ DebAssert(g_cSheapmgr >= 0, "");
+
+ if (g_cSheapmgr == 0){
+ TlsFree(g_itlsSheapmgr);
+ g_itlsSheapmgr = ITLS_EMPTY;
+ }
+#endif
+
+#if OE_MACNATIVE
+ // Free the relocatable memblock referenced by m_hMemHeap.
+ if (m_hMemHeap != HSYS_Nil) {
+ FreeHsys((Handle)m_hMemHeap);
+ }
+#elif OE_MAC || OE_RISC || OE_WIN32
+ // Walk the blkdescs and destruct each of them.
+ BLK_DESC *pblkdescNext, *pblkdescCur = m_pblkdescFirst;
+ while (pblkdescCur != BD_pblkdescNil) {
+ pblkdescNext = pblkdescCur->m_pblkdescNext;
+ pblkdescCur->BLK_DESC::~BLK_DESC();
+ pblkdescCur = pblkdescNext;
+ }
+#else
+ // A heap is destroyed by deleting it (delete is overloaded).
+#endif
+
+}
+#pragma code_seg()
+
+/***
+*PROTECTED SHEAP_MGR::Init - initialize the heap manager.
+*Purpose:
+* Initializes a heap manager.
+* On Win16/32: Assumes that a heap segment of
+* some initial size has been allocated by client.
+* Reserves some number of bytes (for heap management
+* overhead). In particular, the heap manager itself is
+* allocated at the start of the heap segment itself.
+* On Mac: allocates a relocatable block of cbSizeReserved.
+*
+*Implementation Notes:
+* 16-bit:
+* Asserts if cbSizeHeapSeg < cbSizeReserved.
+* Asserts if cbSizeHeapSeg > 64K.
+* 32-bit:
+*
+*Entry:
+* cbSizeReserved - Byte count to reserve at start of seg.
+*
+*Exit:
+* Inits m_cbSizeheap with m_cbSizeInitial.
+ Inits m_pblkdescFirst.
+* Returns TRUE if successful.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR SHEAP_MGR::Init(UINT cbSizeReserved)
+{
+
+#if ID_DEBUG
+ m_cbSizeReserved = 0;
+ m_cDebLocks = 0;
+#endif // ID_DEBUG
+
+ // Init semaphore.
+ m_cLocks = 0;
+
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+#if OE_MACNATIVE
+
+ HSYS hsys;
+
+ DebAssert(m_hMemHeap == (Handle)HSYS_Nil,
+ "Init: attempt to reinit a sheap.");
+
+ hsys = HsysAlloc(cbSizeReserved);
+ if (hsys == (Handle)HSYS_Nil) {
+ return TIPERR_OutOfMemory;
+ }
+ m_hMemHeap = (Handle)hsys;
+ m_qbFree = (BYTE *)cbSizeReserved;
+
+#else
+
+ m_qbFree = OOB_MAKEP3(this, cbSizeReserved);
+
+#endif
+
+#endif // !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+ m_pblkdescFirst = BD_pblkdescNil; // init blkdesc list
+
+#if ID_DEBUG
+ m_cbSizeReserved = cbSizeReserved; // mainly for debugging.
+ // Make sure that by default the sheap will shake
+#if !(OE_MAC || OE_RISC || OE_WIN32)
+ m_canSheapShake=TRUE;
+ m_cDebLocks = 0;
+#endif
+#endif
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+/***
+*PROTECTED SHEAP_MGR::PtrOfBlkDescPrev - Returns previous blk desc in list.
+*Purpose:
+* Returns pointer to previous blk desc in linked list, given
+* an offset to blk desc. Returns NULL if at list head.
+*
+*Implementation Notes:
+* Assumes that pblkdesc is offset in heap seg.
+* Asserts if pblkdesc not in reserved range at start of heap.
+*
+* Since no back pointers are maintained, the list is traversed from
+* the start until the current blk desc is reached -- the previous
+* blk desc is remembered and thus can be returned.
+*
+*Entry:
+* pblkdesc - offset of block desc in heap.
+*
+*Exit:
+* Returns NULL if the parameter refers to the list head,
+* otherwise returns pointer to previous blk desc.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+BLK_DESC *SHEAP_MGR::PtrOfBlkDescPrev(BLK_DESC *pblkdesc) const
+{
+ BLK_DESC *pblkdescPrev;
+ BLK_DESC *pblkdescCur;
+
+#if ID_DEBUG
+ ULONG oBlkDesc;
+
+#if OE_MACNATIVE || OE_MAC || OE_RISC || OE_WIN32
+ DebAssert((BYTE *)pblkdesc > (BYTE *)this, "bad pblkdesc.");
+ oBlkDesc = (ULONG)((BYTE *)pblkdesc - (BYTE *)this);
+#else
+ oBlkDesc = OOB_MAKEOFFSET(this, pblkdesc);
+#endif
+
+ DebAssert(oBlkDesc < (ULONG)m_cbSizeReserved,
+ "SHEAP_MGR::PtrOfBlkDescPrev: blk desc not in reserved heap part.");
+
+#endif // ID_DEBUG
+
+ pblkdescPrev = NULL;
+ pblkdescCur = m_pblkdescFirst;
+ pblkdescCur = PtrOfBlkDesc(pblkdescCur);
+ while (pblkdescCur != pblkdesc) {
+ pblkdescPrev = PtrOfBlkDesc(pblkdescCur); // Save prev.
+ pblkdescCur = PtrOfBlkDesc(pblkdescCur->m_pblkdescNext); // Get next.
+ }
+ return pblkdescPrev;
+}
+#pragma code_seg()
+
+/***
+*PROTECTED SHEAP_MGR::PtrOfBlkDescLast - Returns previous blk desc in list.
+*Purpose:
+* Returns pointer to last blk desc in linked list.
+* (Returns NULL if empty list).
+*
+*Implementation Notes:
+* Since no back pointers are maintained, the list is traversed from
+* the start until the last entry is reached.
+*
+*Entry:
+*
+*Exit:
+* Returns NULL if the parameter refers to the list head,
+* otherwise returns pointer to last blk desc.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+BLK_DESC *SHEAP_MGR::PtrOfBlkDescLast() const
+{
+ BLK_DESC *pblkdesc;
+ BLK_DESC *pblkdescCur = m_pblkdescFirst;
+
+ while (pblkdescCur != BD_pblkdescNil) {
+ pblkdesc = PtrOfBlkDesc(pblkdescCur);
+ pblkdescCur = pblkdesc->m_pblkdescNext;
+ if (pblkdescCur == BD_pblkdescNil)
+ return pblkdesc;
+ }
+ DebAssert(pblkdescCur == BD_pblkdescNil,
+ "SHEAP_MGR::PtrOfBlkDescFirst: bad list.");
+ return NULL;
+}
+#pragma code_seg()
+
+/***
+*PROTECTED SHEAP_MGR::RemoveBlkdesc -- removes blkdesc
+*Purpose:
+* Removes a blkdesc by delinking from linked list of blkdescs
+* in sheap and initing some fields.
+*
+*Entry:
+* pblkdesc IN
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID SHEAP_MGR::RemoveBlkdesc(BLK_DESC *pblkdesc)
+{
+ // Remove block desc from list and
+ // update listhead if needed.
+ //
+ BLK_DESC *pblkdescPrev = PtrOfBlkDescPrev(pblkdesc);
+ if (pblkdescPrev != NULL) {
+ pblkdescPrev->m_pblkdescNext = pblkdesc->m_pblkdescNext; // link
+ }
+ else {
+ // blk desc is now first in list, so update list head.
+ m_pblkdescFirst = pblkdesc->m_pblkdescNext;
+ }
+ return;
+}
+#pragma code_seg()
+
+/***
+*PROTECTED SHEAP_MGR::AddBlkdesc -- updates new blkdesc
+*Purpose:
+* Inits a new blkdesc by linking to linked list of blkdescs
+* in sheap and initing some fields.
+*
+*Entry:
+* pblkdesc IN
+* cbSize IN
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+VOID SHEAP_MGR::AddBlkdesc(BLK_DESC *pblkdesc, ULONG cbSize)
+{
+ DebAssert(cbSize <= USHRT_MAX, "Should have caught this earlier.");
+
+ // Update size field.
+ pblkdesc->m_cbSize = (USHORT)cbSize;
+
+ // Now link in blkdesc to linked list.
+ // Get end of blk desc list.
+ //
+ BLK_DESC *pblkdescLast = PtrOfBlkDescLast();
+ if (pblkdescLast != NULL) {
+ DebAssert(pblkdescLast->m_pblkdescNext == BD_pblkdescNil,
+ "AddBlkdesc: bad Nil of blk desc list.");
+
+ pblkdescLast->m_pblkdescNext = pblkdesc;
+ }
+ else {
+ // No last blk desc, must be no first blk desc... if not,
+ // had better Assert...
+ DebAssert(m_pblkdescFirst == BD_pblkdescNil,
+ "BLK_DESC::Init: bad BOL of blk desc list -- should be null.");
+
+ m_pblkdescFirst = pblkdesc;
+ }
+ // Since blk desc is always added at end of list,
+ // simply set the next field to null.
+ //
+ pblkdesc->m_pblkdescNext = BD_pblkdescNil;
+ return;
+}
+#pragma code_seg()
+
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+/***
+*PUBLIC SHEAP_MGR::Alloc - Allocates block on heap.
+*Purpose:
+* Allocates moveable block on heap.
+* Appends blkdesc to end of list of blk descs describing
+* blocks in heap.
+*
+*Implementation Notes:
+* 16-bit:
+* Asserts if block descriptor not in same seg as heap.
+* Returns OOM if sheap locked and need to grow heap to
+* satisfy this alloc request. Actually ReallocHeap will
+* do this for us.
+* Only called by BLK_DESC::Init which does some post-processing
+* to insert blkdesc into linked list sheapmgr maintains. The
+* reason we do this in BLK_DESC rather than here is that not
+* all implementations have Alloc.
+*
+*Entry:
+* pblkdesc - Pointer to a block descriptor.
+* cbSize - Requested block size.
+*
+*Exit:
+* Updates block descriptor.
+* TIPERROR
+*
+*Errors:
+* OutOfMemory
+***********************************************************************/
+
+// NOTE: the following is to work around a C7 bug, see below
+// CONSIDER: turn back on optimizations when are using C8 on all
+// platforms.
+//
+#if OE_WIN16
+#pragma optimize("cegl", off)
+#endif //OE_WIN16
+TIPERROR SHEAP_MGR::Alloc(BLK_DESC *pblkdesc, ULONG cbSize)
+{
+ ULONG cbSizeNewHeap;
+ ULONG cbGrowHeap; // How much to grow heap if needed.
+ ULONG oFree; // Distance from heap start to first free
+ // byte.
+ TIPERROR err;
+
+ // Assert if the sheapmgr has a debug lock
+ DebAssert(!DebIsLocked(), "SHEAPMGR::Alloc: Sheapmgr is locked");
+
+#if OE_SEGMENTED
+ DebAssert(OOB_SELECTOROF(this) == OOB_SELECTOROF(pblkdesc),
+ "SHEAP_MGR::Alloc: Block desc not in same seg as heap.");
+ cbGrowHeap = m_cbSizeInitial;
+#elif OE_MACNATIVE
+ cbGrowHeap = m_cbSizeInitial;
+#else
+#error bad OE
+#endif
+
+ // Ensure enough memory, if not then try to grow heap.
+ // This is a bit weird: we want the actual offset of the next
+ // free byte in the managed memblock. On Mac we have to convert
+ // the "pseudo-pointer" m_qbFree to an offset, i.e. we just take
+ // the loword (OOB_OFFSETOF just takes the low 16-bits of a long).
+ // On win16/32, the managed memblock is physically contiguous with
+ // the sheapmgr itself so we can use the OOB_MAKEOFFSET macro
+ // which knows how to deal with all this stuff. Note that we use
+ // an actual pointer for Win32, which is why the variable is
+ // called m_qbFree.
+ //
+#if OE_MACNATIVE
+ oFree = OOB_OFFSETOF(m_qbFree);
+#else
+ oFree = OOB_MAKEOFFSET(this, m_qbFree);
+#endif
+
+ if (m_cbSizeHeap - oFree < cbSize) {
+ // Grow heap since not enough room for this new block alloc request.
+ // We grow heap in multiple blocks of cbGrowHeap bytes.
+ //
+
+ // NOTE: C7 generates incorrect code (under -Oxswz) for the
+ // following line - the division by cbGrowHeap is omitted. This
+ // is worked around above by using #pragma optimize.
+ // CONSIDER: when we go to C8 on all platforms we won't
+ // have this problem.
+ //
+ cbSizeNewHeap = (ULONG)m_cbSizeHeap +
+ (((cbSize / cbGrowHeap)+1) * cbGrowHeap);
+
+ IfErrRet(ReallocHeap(cbSizeNewHeap));
+ }
+
+ // Update blkdesc
+ pblkdesc->m_qbMemBlock = m_qbFree;
+ AddBlkdesc(pblkdesc, cbSize);
+
+ // Update next available byte pointer.
+ m_qbFree += cbSize;
+
+ return TIPERR_None;
+}
+#if OE_WIN16
+// NOTE: restore optimization, see above
+#pragma optimize("",on)
+#endif //OE_WIN16
+
+
+/***
+*PRIVATE SHEAP_MGR::ShiftHeap - Shifts heap.
+*Purpose:
+* Shifts heap.
+*
+*Implementation Notes:
+* We assert that sheap is locked cos we invalidate ptrs.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+VOID SHEAP_MGR::ShiftHeap(BLK_DESC *pblkdesc, LONG dbSize)
+{
+ BLK_DESC *pblkdescCur, *pblkdescNext;
+ ULONG oFree;
+ ULONG oMemBlockCur;
+ BYTE *qbBlockSrc;
+
+ DebAssert(IsLocked() == FALSE, "SHEAP_MGR::ShiftHeap: locked!");
+
+ // Now shift blocks at higher addresses up by dbSize
+ // which could be negative of course (corresponding to
+ // to a shrinking heap).
+ //
+ pblkdescNext = pblkdesc->m_pblkdescNext;
+ if (pblkdescNext != BD_pblkdescNil) {
+ pblkdescCur = PtrOfBlkDesc(pblkdescNext);
+
+ // Shift heap by dbSize: newSize-curSize.
+ // Note that dbSize could be negative of course.
+ // The bytecount to shift is oFree-oMemBlockCur: this
+ // is the cumulative size of the blocks at higher addresses.
+ //
+#if OE_MACNATIVE
+ oMemBlockCur = OOB_OFFSETOF(pblkdescCur->m_qbMemBlock);
+#else
+ oMemBlockCur = OOB_MAKEOFFSET(this, pblkdescCur->m_qbMemBlock);
+#endif
+ qbBlockSrc = pblkdescCur->QtrOfBlockActual();
+
+ DebAssert(qbBlockSrc != NULL, "SHEAP_MGR::ShiftHeap: NULL qbBlockSrc.");
+
+#if OE_MACNATIVE
+ oFree = OOB_OFFSETOF(m_qbFree);
+#else
+ oFree = OOB_MAKEOFFSET(this, m_qbFree);
+#endif
+ memmove(qbBlockSrc + dbSize, qbBlockSrc, (UINT)(oFree - oMemBlockCur));
+
+ // Now iterate over the block desc list, updating
+ // block locations, starting at pblkdescCur.
+ //
+ do {
+ // Update blk desc
+ pblkdescCur->m_qbMemBlock += dbSize;
+ // Get next in list.
+ pblkdescNext = pblkdescCur->m_pblkdescNext;
+ if (pblkdescNext != BD_pblkdescNil)
+ pblkdescCur = PtrOfBlkDesc(pblkdescNext);
+ } while (pblkdescNext != BD_pblkdescNil);
+ }
+ // Update free offset.
+ m_qbFree += dbSize;
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::Free - Frees block on heap.
+*Purpose:
+* Frees block on heap. Relocates all blocks with higher
+* addresses so that heap is contiguous.
+* Removes block desc from linked list of blk descs.
+*
+*Implementation Notes:
+* Asserts if block descriptor not in same seg as heap.
+* Since invariant is that nth blk desc corresponds
+* to nth alloced block from start of heap seg, can simply
+* shift all blocks from the n+1'th up by size of block to be
+* freed.
+* This is done simply by moving en masse all the blocks
+* at once. The invariant is that the blocks are
+* contiguous. Once the blocks have been moved, we only
+* have to update the block descriptors with the blocks'
+* new locations -- that's easy, just iterate
+* and subtract size of freed block.
+* memmove is used since there might be overlap.
+*
+* We assert that sheap isn't locked since we shift heap
+* and thus invalidate pointers.
+*
+* CONSIDER: private non-virtual methods to manipulate blkdesc list.
+*
+*Entry:
+* pblkdesc - Pointer to a block descriptor of block to free.
+*
+*Exit:
+*
+***********************************************************************/
+
+VOID SHEAP_MGR::Free(BLK_DESC *pblkdesc)
+{
+ UINT cbSize; // size of block to be freed.
+
+ DebAssert(IsLocked() == FALSE, "SHEAP_MGR::Free: locked!");
+ DebAssert(pblkdesc != NULL, "SHEAP_MGR::Free: pblkdesc NULL.");
+ // Assert if the sheapmgr has a debug lock
+ DebAssert(!DebIsLocked(), "SHEAP_MGR::Free: Sheapmgr is locked ");
+
+#if OE_SEGMENTED
+ DebAssert(OOB_SELECTOROF(this) == OOB_SELECTOROF(pblkdesc),
+ "SHEAP_MGR::Free: Block desc not in same seg as heap.");
+#endif
+
+ // Must use actual memblock size cos of extra debug shift bytes.
+ cbSize = pblkdesc->CbSizeActual();
+
+ // Remove block desc from list and update listhead if needed.
+ RemoveBlkdesc(pblkdesc);
+
+ // Now shift heap.
+ // cbSize always positive so make it negative so
+ // that heap will shrink.
+ //
+ ShiftHeap(pblkdesc, -(LONG)cbSize);
+
+ // Shake the sheap.
+ DebSheapShake();
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::Realloc - Grow/shrink block on heap.
+*Purpose:
+* Grow/shrink block on heap, preserving current contents.
+* Rest of heap is shifted to accomodate realloc. Relative
+* position of blocks is unchanged.
+*
+*Implementation Notes:
+* Asserts if block descriptor not in same seg as heap.
+* Since invariant is that nth blk desc corresponds
+* to nth alloced block from start of heap seg, all blocks
+* from the n+1'th are shifted up/down by the change in size
+* of the realloced block.
+* This is done simply by moving en masse all the blocks
+* at once. The invariant is that the blocks are
+* contiguous. Once the blocks have been moved, we only
+* have to update the block descriptors with the blocks'
+* new locations -- that's easy, just iterate
+* and add difference between size of new block and old block.
+* memmove is used since might be overlap.
+* dbSize is signed integer in range (-2^16, 2^16) indicating
+* difference in current size and new size (negative if shrinking,
+* positive if growing). Note: must use LONG.
+*
+* Return OOM if sheap is locked (since after resizing heap
+* we shift contents, thus invalidating contents).
+* CONSIDER: should this be an assert?
+* CONSIDER: since this code is almost identical to
+* similar section in Free, factor into private method.
+*
+*Entry:
+* pblkdesc - Pointer to a block descriptor of block to realloc.
+* cbSizeNew - New size of block.
+*
+*Exit:
+* TIPERROR
+***********************************************************************/
+TIPERROR SHEAP_MGR::Realloc(BLK_DESC *pblkdesc, ULONG cbSizeNew)
+{
+ LONG dbSize; // difference between new and cur size.
+ ULONG oFree, cbSizeNewHeap, cbFree;
+ TIPERROR err;
+
+ // Assert if the sheapmgr has a debug lock
+ DebAssert(!DebIsLocked(), "SHEAP_MGR::Realloc: Sheapmgr is locked ");
+
+#if OE_SEGMENTED
+ DebAssert(OOB_SELECTOROF(this) == OOB_SELECTOROF(pblkdesc),
+ "SHEAP_MGR::Realloc: Block desc not in same seg as heap.");
+#endif
+
+ // Request too big?
+ if ((ULONG)cbSizeNew > (ULONG)CBALLOCMAX) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // Return OOM if we're locked.
+ if (IsLocked()) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // How much to grow/shrink?
+ // Note must use actual blkdesc memblock size cos
+ // of extra debug shift bytes.
+ //
+ dbSize = (LONG)cbSizeNew - (LONG)pblkdesc->CbSizeActual();
+ if (dbSize == 0)
+ return TIPERR_None; // NOP if no size change.
+
+#if OE_MACNATIVE
+ oFree = OOB_OFFSETOF(m_qbFree);
+#else
+ oFree = OOB_MAKEOFFSET(this, m_qbFree);
+#endif
+
+ if (dbSize > 0) {
+ // Grow block.
+ // Ensure enough memory, if not then try to grow heap.
+ // cbFree is number of free allocated bytes currently in sheap,
+ // which we can use to accommodate this blkdesc realloc request.
+ //
+ cbFree = (ULONG)m_cbSizeHeap - (ULONG)oFree;
+ while (cbFree < (ULONG)dbSize) {
+ // Grow heap since not enough room for this new block alloc request.
+ cbSizeNewHeap = (ULONG)m_cbSizeHeap +
+ max((ULONG)dbSize - cbFree, (ULONG)m_cbSizeInitial);
+
+ // ReallocHeap side-effects m_cbSizeHeap
+ IfErrRet(ReallocHeap(cbSizeNewHeap));
+ cbFree = (ULONG)m_cbSizeHeap - (ULONG)oFree;
+ } // while
+ } // if
+
+ // Now shift heap.
+ // dbSize could be negative: corresponds to shrinking heap.
+ //
+ ShiftHeap(pblkdesc, dbSize);
+
+ // Update blk size attr
+ DebAssert(cbSizeNew <= USHRT_MAX, "Should have caught this by now.");
+ pblkdesc->m_cbSize = (USHORT)cbSizeNew;
+
+ // shake the heap.
+ DebSheapShake();
+
+ return TIPERR_None;
+}
+
+
+/***
+*PRIVATE SHEAP_MGR::ReallocHeap - Grows/shrinks heap.
+*Purpose:
+* Grows/shrinks heap as a result of block reallocation. Contents
+* preserved.
+*
+*Implementation Notes:
+* Asserts if live blocks would get zapped if heap shrunk by too much.
+* 16-bit: Uses ReallocSeg.
+* Returns OOM if sheap is locked and we are *growing* the heap.
+* NOTE: we assume that shrinking a heap does not move it.
+* CONSIDER: should this be an assert? i.e. clients shouldn't
+* be calling this method anyway if sheap is locked.
+*
+*Entry:
+* cbSizeNewHeap - Size of new heap.
+*
+*Exit:
+* Updates private member m_cbSizeHeap
+* Returns TIPERROR
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR SHEAP_MGR::ReallocHeap(ULONG cbSizeNewHeap)
+{
+ LONG dbSize;
+ TIPERROR err = TIPERR_None;
+
+ if (cbSizeNewHeap > (ULONG)CBALLOCMAX)
+ return TIPERR_OutOfMemory;
+
+ dbSize = cbSizeNewHeap - m_cbSizeHeap;
+
+
+ // Return OOM if we are growing and sheap is locked.
+ if ((dbSize > 0) && IsLocked()) {
+ return TIPERR_OutOfMemory;
+ }
+
+#if OE_MACNATIVE
+ DebAssert((dbSize > 0) ||
+ (-dbSize <
+ (INT)(m_cbSizeHeap - OOB_OFFSETOF(m_qbFree))),
+ "SHEAP_MGR::ReallocHeap: can't shrink heap -- will zap blocks.");
+#else
+ DebAssert((dbSize > 0) ||
+ (-dbSize < (INT)(m_cbSizeHeap - OOB_MAKEOFFSET(this, m_qbFree))),
+ "SHEAP_MGR::ReallocHeap: can't shrink heap -- will zap blocks.");
+#endif
+
+#if OE_SEGMENTED
+
+ err = ReallocSeg((USHORT)cbSizeNewHeap, OOB_SELECTOROF(this));
+ // fall through...
+
+#elif OE_MACNATIVE
+
+ HSYS hsys, hsysNew;
+
+ hsys = (HSYS)m_hMemHeap;
+
+ // Finally, do the reallocation.
+ hsysNew = HsysReallocHsys(hsys, cbSizeNewHeap);
+ if (hsysNew == HSYS_Nil) {
+ err = TIPERR_OutOfMemory;
+ }
+ else {
+ DebAssert(hsys == hsysNew,
+ "whoops! handle shouldn't have changed.");
+ err = TIPERR_None;
+ }
+ // fall through...
+
+#else
+#error bad OE.
+#endif
+
+ if (err == TIPERR_None) {
+ // update heap size.
+ m_cbSizeHeap = (UINT)cbSizeNewHeap;
+ }
+ return err;
+}
+
+#endif // ! (OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+#if ID_DEBUG
+
+/***
+*PUBLIC SHEAP_MGR::DebSheapShakeOn
+*Purpose:
+* Sets the flag indicating this sheapmgr can shake.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+VOID SHEAP_MGR::DebSheapShakeOn()
+{
+ m_canSheapShake=TRUE;
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebSheapShakeOff
+*Purpose:
+* Resets the flag that indicating this sheapmgr cannot shake.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+VOID SHEAP_MGR::DebSheapShakeOff()
+{
+ m_canSheapShake=FALSE;
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebCanSheapShake
+*Purpose:
+* returns true if this sheap can shake;
+*
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+BOOL SHEAP_MGR::DebCanSheapShake()
+{
+ return m_canSheapShake;
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebAddSheapmgrToList
+*Purpose:
+* adds the sheapmgr to the per-thread list of sheapmgrs
+*
+*Entry:
+* psheapmgr : sheap mgr to be added.
+*
+*Exit:
+* None
+*
+***********************************************************************/
+VOID SHEAP_MGR::DebAddSheapmgrToList(SHEAP_MGR *psheapmgr)
+{
+ SHEAPMGR_LIST *psheapmgrlist;
+
+ // Stop error generation for now
+ DebSuspendError();
+
+ DebAssert(psheapmgr != NULL, "bad pointer");
+ DebAssert(g_itlsSheapmgr != ITLS_EMPTY, "");
+
+ // allocate space for the new node
+ psheapmgrlist = MemNew(SHEAPMGR_LIST);
+
+ // if we weren't able to allocate this entry, set the list
+ // to invalid. NOTE: this merely displays a warning when the
+ // list is displayed telling the user that the list is
+ // incomplete.
+ //
+ if (psheapmgrlist == NULL) {
+ g_fValidSheapmgrList = FALSE;
+ }
+ else {
+ ::new (psheapmgrlist) SHEAPMGR_LIST;
+
+ // add the current sheapmgr and add the node to the beginning of the list
+ psheapmgrlist->m_psheapmgr = psheapmgr;
+ psheapmgrlist->m_psheapmgrlistNext =
+ (SHEAPMGR_LIST*)TlsGetValue(g_itlsSheapmgr);
+
+ BOOL fSet = TlsSetValue(g_itlsSheapmgr, psheapmgrlist);
+ DebAssert(fSet == TRUE, "");
+ }
+
+ DebResumeError();
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebRemoveSheapmgrFromList
+*Purpose:
+* removes the sheapmgr from the per-thread list of sheap managers.
+*
+*Entry:
+* psheapmgr : sheap mgr to be removed.
+*
+*Exit:
+* None
+*
+***********************************************************************/
+VOID SHEAP_MGR::DebRemoveSheapmgrFromList(SHEAP_MGR *psheapmgr)
+{
+ SHEAPMGR_LIST *psheapmgrlist, **ppsheapmgrlist, *psheapmgrlistDead;
+
+ DebAssert(psheapmgr != NULL, "bad pointer");
+ DebAssert(g_itlsSheapmgr != ITLS_EMPTY, "");
+
+ psheapmgrlist = (SHEAPMGR_LIST*)TlsGetValue(g_itlsSheapmgr);
+
+ for (ppsheapmgrlist = &psheapmgrlist;
+ *ppsheapmgrlist != NULL;
+ ppsheapmgrlist = &(*ppsheapmgrlist)->m_psheapmgrlistNext) {
+ // DebAssert(IsValidWritePtr(*ppsheapmgrlist, sizeof(**ppsheapmgrlist));
+
+ if ((*ppsheapmgrlist)->m_psheapmgr == psheapmgr) {
+ psheapmgrlistDead = *ppsheapmgrlist;
+ *ppsheapmgrlist = (*ppsheapmgrlist)->m_psheapmgrlistNext;
+ MemFree(psheapmgrlistDead);
+ BOOL fSet = TlsSetValue(g_itlsSheapmgr, psheapmgrlist);
+ DebAssert(fSet == TRUE, "");
+ return;
+ }
+ }
+
+ // The assertion below should only be reached if a sheapmgr could
+ // not be added to the debug list (caused by a lack of memory).
+ //
+ DebAssert(!g_fValidSheapmgrList, "");
+}
+
+
+
+/***
+*PUBLIC SHEAP_MGR::DebCheckState - Checks heap.
+*Purpose:
+* (1) Checks if heap is in a consistent state after initialization.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+VOID SHEAP_MGR::DebCheckState(UINT uLevel) const
+{
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+ // Check if heap is consistent after init.
+ if (uLevel == 0) {
+#if OE_MACNATIVE
+ DebAssert(OOB_OFFSETOF(m_qbFree) == m_cbSizeReserved &&
+ m_pblkdescFirst == BD_pblkdescNil,
+ "bad heap after init.");
+#else
+ DebAssert(OOB_MAKEOFFSET(this, m_qbFree) == m_cbSizeReserved &&
+ m_pblkdescFirst == BD_pblkdescNil,
+ "bad heap after init.");
+#endif
+ }
+#endif
+}
+
+/***
+*PUBLIC SHEAP_MGR::DebShowState - SHEAP_MGR state
+*Purpose:
+* Show SHEAP_MGR state
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+
+VOID SHEAP_MGR::DebShowState(UINT uLevel) const
+{
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+ if (uLevel == 0) {
+ DebPrintf("*** SHEAP_MGR private members ***\n");
+ DebPrintf("m_pblkdescFirst = %u\n", m_pblkdescFirst);
+ DebPrintf("m_cbSizeHeap = %u\n", m_cbSizeHeap);
+ DebPrintf("m_qbFree = %u\n", m_qbFree);
+ DebPrintf("m_cbSizeReserved = %u\n", m_cbSizeReserved);
+ }
+#endif //!(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebSheapShakeOne - Shakes Sheap.
+*Purpose:
+* Moves managed memblocks around in Sheap -- this is to ensure
+* that clients don't hold onto dereferenced handles too long.
+*
+*Implementation Notes:
+* Locked sheaps aren't shaken.
+*
+* Since a sheap is a contiguous memory block itself, we shake
+* its managed blocks (BLK_DESCs) by shifting each one
+* up or down into the extra SHM_cbShift at the top or bottom
+* of the memblock. This extra two bytes is always allocated
+* at the end of a memblock in the debug version and in addition
+* there is a debug-only flag indicating which way to shift.
+* this ensures that any cached ptrs into the memblocks would be
+* effectively invalidated).
+*
+* Note: we do not shift locked BLK_DESCs.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+VOID SHEAP_MGR::DebSheapShakeOne()
+{
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+ INT dbShift;
+ BLK_DESC *pblkdescCur, *pblkdescNext;
+
+#if 0
+ // NOP if they don't want to shake.
+ if (g_fSheapShakingOn == FALSE)
+ return;
+#endif // 0
+
+ // check to see if we can shake this sheap mgr.
+ if (DebCanSheapShake() == FALSE)
+ return;
+
+ // NOP if sheap locked.
+ if (IsLocked())
+ return;
+
+ // Else for each non-locked block, shift it up or down
+ // depending on its shift state.
+ //
+ pblkdescNext = m_pblkdescFirst;
+ while (pblkdescNext != BD_pblkdescNil) {
+ pblkdescCur = PtrOfBlkDesc(pblkdescNext);
+ // If block isn't locked, shift it.
+ // NOTE: this actually could be an assertion since
+ // with sheap-level-only locking, the sheap is locked
+ // if any of its blocks are locked.
+ //
+ if (pblkdescCur->IsLocked() == FALSE) {
+ // Calculate the displacement -- negative or positive?
+ dbShift = (pblkdescCur->m_fShiftUp) ?
+ SHM_cbShift :
+ -SHM_cbShift;
+
+ // Shift it based on the m_fShiftUp flag.
+ memmove(pblkdescCur->QtrOfBlock() + dbShift,
+ pblkdescCur->QtrOfBlock(),
+ pblkdescCur->CbSize());
+
+ // toggle shift flag
+ pblkdescCur->m_fShiftUp = !pblkdescCur->m_fShiftUp;
+ }
+ pblkdescNext = pblkdescCur->m_pblkdescNext;
+ }
+#endif
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebSheapShake - Shakes Sheap.
+*Purpose:
+* Walks the list of sheapmgr and shakes the all the sheap in Unison.
+*
+* NOTE: If a sheap could not be added to the list due to a lack of
+* memory, it will not get shaken.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+VOID SHEAP_MGR::DebSheapShake()
+{
+ SHEAPMGR_LIST *psheapmgrlist;
+
+ DebAssert(g_itlsSheapmgr != ITLS_EMPTY, "");
+
+ for(psheapmgrlist = (SHEAPMGR_LIST*)TlsGetValue(g_itlsSheapmgr);
+ psheapmgrlist != NULL;
+ psheapmgrlist = psheapmgrlist->m_psheapmgrlistNext)
+ {
+ psheapmgrlist->m_psheapmgr->DebSheapShakeOne();
+ }
+}
+
+#endif // ID_DEBUG
+
+
+
+// BLK_DESC: class methods
+//
+
+/***
+*PUBLIC BLK_DESC::BLK_DESC - constructor
+*Purpose:
+* Initializes private members.
+* Note that Init() must still be called before
+* this block descriptor can be used.
+* CONSIDER: making inline
+*
+* Invalidates block desc. Note that a 0-size block is valid,
+* however its oMemBlock must be non-zero to be valid (i.e. a
+* 0-size block does have an entry in the heap -- it just happens
+* to be of length 0). Since the SHEAP_MGR itself is always
+* allocated at offset 0 in the heap, this really does mean
+* that an oMemBlock of 0 is in fact invalid.
+* NOTE: definition must precede BLK_DESC constructor.
+*
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+BLK_DESC::BLK_DESC()
+{
+ m_qbMemBlock=NULL; // This is what invalidates a block.
+ m_pblkdescNext=BD_pblkdescNil;
+#if ID_DEBUG
+ m_fShiftUp = TRUE; // Initially shift up.
+#endif
+
+#if OE_WIN32 || OE_MACNATIVE || OE_MAC
+ // OE_RISC needs this, too
+ m_psheapmgr = NULL;
+#endif // OE_WIN32
+
+#if OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+ m_cLocks = (UINT)~0; // invalidate lock count
+#endif // OE_REALMODE || OE_MAC
+}
+#pragma code_seg()
+
+/***
+*PUBLIC BLK_DESC::~BLK_DESC - destructor
+*Purpose:
+* Destroys a block descriptor.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+BLK_DESC::~BLK_DESC()
+{
+ if (IsValid())
+ Free();
+}
+#pragma code_seg()
+
+/***
+*PUBLIC BLK_DESC::Init - initialize the block manager
+*Purpose:
+* Initializes a block descriptor. Allocates block of default
+* minimum size.
+*
+*Implementation Notes:
+* Defers to heap manager for allocation. Asserts if THIS and
+* its psheapmgr arg are not in the same segment. Note that
+* a heap is always allocated on a segment boundary.
+* Asserts if heap manager not allocated on seg boundary.
+* CONSIDER: making inline
+*
+*Entry:
+* psheapmgr - pointer to a heap manager object.
+* cbSize - initial block size.
+*
+*Exit:
+* TIPERROR
+*
+*Errors:
+* OutOfMemory (from SHEAP_MGR::Alloc)
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR BLK_DESC::Init(SHEAP_MGR *psheapmgr, UINT cbSize)
+{
+ TIPERROR err = TIPERR_None;
+
+#if OE_SEGMENTED
+ DebAssert(OOB_OFFSETOF(psheapmgr)==0,
+ "BLK_DESC::Init: Heap manager not allocated on seg boundary.");
+ DebAssert(OOB_SELECTOROF(this) == OOB_SELECTOROF(psheapmgr),
+ "BLK_DESC::Init: Block desc not in same seg as heap.");
+#endif // OE_SEGMENTED
+
+ DebAssert(IsValid() == FALSE,
+ "BLK_DESC::Init: Whoops! Block should be invalid.");
+
+ // "this" is passed to the heap manager's Alloc, which
+ // updates its members appropriately.
+ // (i.e. cbSize, oMemBlock and oBlkDescNext).
+ //
+
+ // Note that in the debug version we allocate an extra
+ // SHM_cbShift bytes.
+ // In the release version, cbShift is zero so this is nop.
+ //
+ cbSize += SHM_cbShift;
+
+#if OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+
+ m_cLocks = 0; // Init lockcount
+ m_qbMemBlock = (BYTE *)MemAlloc(cbSize);
+ if (m_qbMemBlock == NULL)
+ return TIPERR_OutOfMemory;
+#if OE_RISC
+ DebAssert (((ULONG)(this->m_qbMemBlock) & (SHM_cbAlign-1)) == 0, "RISC: Unaligned allocation");
+#endif
+
+#else
+
+ err = psheapmgr->Alloc(this, cbSize);
+
+#endif // OE
+
+ if (err == TIPERR_None) {
+ // Update this instance
+ psheapmgr->AddBlkdesc(this, cbSize);
+
+#if !(OE_SEGMENTED)
+ m_psheapmgr = psheapmgr;
+#endif
+ DebAssert(IsValid(), "BLK_DESC::Init: Block invalid.");
+ }
+
+ return err;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC BLK_DESC::Realloc - Grows/shrinks block.
+*Purpose:
+* Grows/shrinks block, preserving contents. Defers to heap manager.
+*
+*Implementation Notes:
+* 16-bit: Assumes that heap manager is allocated at offset 0 in this
+* segment.
+* Returns OOM if block locked since reallocation will shift
+* other blocks around thus invalidating any pointers to them.
+* [Actually only those at higher addresses so there's a possible
+* optimization here].
+*
+*Entry:
+* cbSizeNew - new size of block.
+*
+*Exit:
+* TIPERROR
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+#pragma code_seg(CS_INIT)
+TIPERROR BLK_DESC::Realloc(ULONG cbSizeNew)
+{
+ DebAssert(IsValid(), "BLK_DESC::Realloc: Block invalid.");
+
+ // Request too big?
+ if ((ULONG)cbSizeNew > (ULONG)CBALLOCMAX) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // Are we locked?
+ if (IsLocked()) {
+ return TIPERR_OutOfMemory;
+ }
+
+#if ID_DEBUG
+ // Note that in the debug version we allocate an extra
+ // SHM_cbShift bytes.
+ // In the release version, cbShift is zero so this is nop.
+ //
+ // Request too big?
+ //
+ if ((ULONG)(cbSizeNew+SHM_cbShift) > (ULONG)CBALLOCMAX) {
+ return TIPERR_OutOfMemory;
+ }
+ cbSizeNew += SHM_cbShift;
+#endif
+
+#if OE_SEGMENTED
+
+ return ((SHEAP_MGR *)OOB_MAKEP2(this, 0))->Realloc(this, cbSizeNew);
+
+#elif OE_MACNATIVE
+
+ return m_psheapmgr->Realloc(this, cbSizeNew);
+
+#elif OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+
+ BYTE *qbMemBlockNew;
+
+#if ID_DEBUG
+ // Alloc a new block to guarentee that any outstanding pointers
+ // are invalidated.
+ //
+ qbMemBlockNew = (BYTE *)MemAlloc(cbSizeNew);
+
+ if (qbMemBlockNew) {
+ memcpy(qbMemBlockNew, m_qbMemBlock, min(m_cbSize, cbSizeNew));
+ MemFree(m_qbMemBlock);
+ }
+#else // !ID_DEBUG
+ qbMemBlockNew = (BYTE *)MemRealloc(m_qbMemBlock, cbSizeNew);
+#endif // !ID_DEBUG
+
+ // return OutOfMemory if the returned pointer is NULL and the requested
+ // size of memory was > 0. Relloc returns NULL if the requested mem size
+ // is 0.
+ //
+ // NOTE: the semantics of BLK_DESC::Realloc are such that
+ // a valid non-null ptr is produced even if the request was
+ // for zero bytes.
+ // *** THIS IS DIFFERENT FROM ANSI REALLOC SEMANTICS. ***
+ //
+ if (qbMemBlockNew == NULL) {
+ if (cbSizeNew != 0) {
+ return TIPERR_OutOfMemory;
+ }
+ else {
+ // We've already freed the old block and we know that cbSizeNew is 0,
+ // so just get a new block of 0.
+ if ((m_qbMemBlock = (qbMemBlockNew = (BYTE *)MemAlloc(0))) == NULL) {
+ // Note that in this error case, m_qbMemBlock is set "correctly"
+ // but m_cbSize retains its old value which is ok because
+ // we use m_qbMemBlock to indicate a block's validity.
+ //
+ return TIPERR_OutOfMemory;
+ }
+ }
+ }
+
+#if OE_RISC
+ DebAssert (((ULONG)(this->m_qbMemBlock) & (SHM_cbAlign-1)) == 0,
+ "RISC: Unaligned allocation");
+#endif
+
+ m_qbMemBlock = qbMemBlockNew;
+
+ DebAssert(cbSizeNew <= USHRT_MAX, "Should have caught this by now.");
+ m_cbSize = (USHORT)cbSizeNew;
+ return TIPERR_None;
+
+#else
+#error bad OE.
+#endif
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC BLK_DESC::Read - Read in instance from stream
+*Purpose:
+* Load previously serialized BLK_DESC into this BLK_DESC.
+* The BlkDesc must be initialized.
+* The serialized representation is simply the size of the
+* block (a long) followed the data contained in the block.
+*
+*Entry:
+* cfile: stream to read data from
+*
+*Exit:
+* number of bytes read from the stream
+*
+***********************************************************************/
+
+TIPERROR BLK_DESC::Read(STREAM *pstrm)
+{
+ ULONG cbBlockSize;
+ TIPERROR err;
+
+ DebAssert(IsValid(), "BLK_DESC::Read: Block invalid.");
+
+ // read in block size from serialized rep.
+ if (!(err = pstrm->ReadULong(&cbBlockSize))) {
+ DebAssert(cbBlockSize <= CBALLOCMAX,
+ "BLK_DESC::Read: invalid block size");
+
+ // reallocate block to the size that was read in
+ if (!(err = Realloc((UINT)cbBlockSize)))
+ // There is a bug in the STREAM implementation of read : Returns an
+ // error if we try to read 0 bytes.
+ if (cbBlockSize > 0)
+ err = pstrm->Read(QtrOfBlock(), (UINT)cbBlockSize);
+ }
+ return err;
+}
+
+
+/***
+*PUBLIC BLK_DESC::Write - Write out instance to stream
+*Purpose:
+* Serialize the BLK_DESC to a stream.
+* The serialized representation is simply the size of the
+* block (a long) followed the data contained in the block.
+*
+*Entry:
+* cfile: stream to write data to
+*
+*Exit:
+* number of bytes written to stream
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR BLK_DESC::Write(STREAM *pstrm)
+{
+ ULONG cbBlockSize;
+ TIPERROR err;
+
+ DebAssert(IsValid(), "BLK_DESC::Write: Block invalid.");
+
+ cbBlockSize = CbSize();
+
+ // write out block size to serialized rep.
+ if (!(err = pstrm->WriteULong(cbBlockSize))) {
+ // write out contents of block.
+ err = pstrm->Write(QtrOfBlock(), (UINT)cbBlockSize);
+ }
+ return err;
+}
+
+#pragma code_seg()
+
+
+
+
+
+#if ID_DEBUG
+/***
+*PUBLIC BLK_DESC::DebShowState - BLK_DESC state
+*Purpose:
+* Show BLK_DESC state
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+*Exceptions:
+* None.
+*
+***********************************************************************/
+
+VOID BLK_DESC::DebShowState(UINT uLevel) const
+{
+ BYTE *pb;
+ UINT i;
+
+ DebPrintf("block size: %u \n", m_cbSize);
+ for (pb = QtrOfBlock(), i=0 ; i < m_cbSize; i++, pb++) {
+ DebPrintf("%u\n", (CHAR)*pb);
+ }
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebLock
+*Purpose:
+* Lock the sheap to ensure that this sheap is not used until the
+* lock is removed.
+*
+*Implementation Notes:
+* Increment counting semaphore.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+VOID SHEAP_MGR::DebLock()
+{
+ m_cDebLocks++;
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebUnlock
+*
+*Implementation Notes:
+* Decrements counting semaphore.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+VOID SHEAP_MGR::DebUnlock()
+{
+ DebAssert(m_cDebLocks > 0, "SHEAP_MGR::DebUnlock: underflow.");
+ m_cDebLocks--;
+
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::DebIsLocked
+*Purpose:
+* Tests if sheap has a debug lock.
+*
+*Implementation Notes:
+* Tests counting semaphore.
+*
+*Entry:
+*
+*Exit:
+* TRUE if sheap is locked -- i.e. at least one lock.
+***********************************************************************/
+BOOL SHEAP_MGR::DebIsLocked()
+{
+ return (BOOL)(m_cDebLocks > 0);
+}
+
+
+#endif // ID_DEBUG
+
+// catches operator new
+#if OE_MAC
+#pragma code_seg(CS_INIT)
+#endif
diff --git a/private/oleauto/src/typelib/sheapmgr.hxx b/private/oleauto/src/typelib/sheapmgr.hxx
new file mode 100644
index 000000000..c83f73ab1
--- /dev/null
+++ b/private/oleauto/src/typelib/sheapmgr.hxx
@@ -0,0 +1,1057 @@
+/***
+*sheapmgr.hxx - Silver Heap Manager
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* The silver Heap Manager describes a heap manager that
+* manages contiguous blocks of memory in a heap. Blocks are
+* accessed via block descriptor object (see blkdesc.hxx)
+* upon allocation and maybe grown/shrunk.
+* See \silver\doc\ic\sheapmgr.doc for more information.
+*
+* This file defines the following classes:
+* SHEAP_MGR
+* BLK_DESC
+*
+* Implementation Notes:
+* Inline methods are *declared* inline in the class definition
+* even though our guidelines state that they should be
+* simply defined inline (i.e. at point of definition). The
+* reason is that there are interdependenices between inline
+* methods of BLK_DESC and SHEAP_MGR.
+*
+* In the 16-bit version, pointers into the heap that
+* are needed by the SHEAP_MGR and BLK_DESC are stored in a
+* far pointer but only the loword is used as an offset into
+* the heap segment. I.e. they are effectively based pointers.
+*
+* In the 32-bit version, pointers into the heap are stored as
+* 32-bit pointers ("far pointers").
+
+* In both cases, the NIL pointer is expressed as UINT_MAX (rather
+* than NULL) since 0 is a valid offset in the 16-bit version.
+*
+*Revision History:
+*
+* 13-Feb-91 ilanc: Created.
+* 04-Apr-91 ilanc: Incorporated blkdesc. All inline BLK_DESC
+* methods are here as well. Note that
+* there is a partial order imposed by
+* SHEAP_MGR/BLK_DESC interdependencies.
+* 15-Apr-91 ilanc: Made BLK_DESC destructor outline.
+* 05-Jun-91 ilanc: Rip exceptions... use C7
+* 29-Aug-91 ilanc: #define min and max. C7 uses __min/__max.
+* 06-Sep-91 ilanc: Start 32-bit version.
+* Make private/protected methods that
+* no one outside the SHEAP_MGR/BLK_DESC/BLK_MGR
+* need know about. Make those three incestuous.
+* Remove BLK_DESC::OMemBlock and OBlkDescNext.
+* 20-Mar-92 martinc: added support for Mac (OE_MACNATIVE)
+* 07-Apr-92 ilanc: Added DebSheapShakeOne().
+* 15-Apr-92 martinc: Commented the Mac specific memory mgmt out
+* (now does the same as in Realmode)
+* 03-Sep-92 ilanc: The (real?) mac version.
+* 07-Oct-92 Rajivk: Added DebSheapShake().
+* 19-Mar-93 ilanc: OE_MAC renamed OE_MACNATIVE (since it uses
+* macos moveable memory). Introduced new OE_MAC
+* to mean fixed memory for blocks.
+*
+*****************************************************************************/
+
+#ifndef SHEAPMGR_HXX_INCLUDED
+#define SHEAPMGR_HXX_INCLUDED
+
+#include <stddef.h> // for size_t
+#include <limits.h> // for USHRT_MAX
+
+
+#if OE_MACNATIVE
+#include "MacOs\types.h"
+#endif // OE_MACNATIVE
+
+#include "rtsheap.h"
+
+class STREAM;
+class BLK_DESC;
+class SHEAP_MGR;
+class SHEAPMGR_LIST;
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szSHEAPMGR_HXX)
+#define SZ_FILE_NAME g_szSHEAPMGR_HXX
+#endif
+
+#if OE_RISC
+// Sheap Alignment
+// [NOTE: The Sheap alignment factor must match the alignment of
+// our host's IMalloc() implimentation.]
+#if HP_R4000 || HP_ALPHA
+ #define SHM_cbAlign 8
+#elif HP_I386 || HP_POWERPC
+ #define SHM_cbAlign 4
+#else
+ #error Unknown Platform
+#endif
+#endif // OE_RISC
+
+#undef max
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#undef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+
+// Setup OE_SEGMENTED
+//
+#undef OE_SEGMENTED
+#if OE_WIN16
+#define OE_SEGMENTED 1
+#else
+#define OE_SEGMENTED 0
+#endif
+
+#if OE_SEGMENTED
+
+USHORT AllocSeg(ULONG ulSize);
+TIPERROR ReallocSeg(ULONG ulNewSize, USHORT usSel);
+TIPERROR FreeSeg(USHORT usSel);
+
+#endif
+
+// Note: in the following macros we "abstract" low-level OS differences.
+// The fixed mac implementation (as opposed to native mac which uses
+// macos movable mem) can be thought of as yet another 32-bit
+// architecture.
+//
+// OOB_MAKEOFFSET - Makes offset from pointer.
+// On Win16: Simulate based pointers. Ignore seg selector. I.e.
+// assume offset is near ptr into seg addressed by selector.
+// On native Mac:
+// Do ptr arithmetic, assuming first arg is handle.
+// On mac:
+// On realmode:
+// On Win32: Do ptr arithmetic: i.e. subtract.
+//
+#undef OOB_MAKEOFFSET
+
+#if OE_SEGMENTED
+#define OOB_MAKEOFFSET(p, p2) OOB_OFFSETOF(p2)
+#elif OE_MACNATIVE
+#define OOB_MAKEOFFSET(p, p2) (ULONG)((BYTE *)(p2) - (BYTE *)(*p))
+#else
+// NOTE: want to assert here that p2 >= p but can't
+// have DebAssert inside of DebAssert.
+//
+#define OOB_MAKEOFFSET(p, p2) (ULONG)((BYTE *)(p2) - (BYTE *)(p))
+#endif
+
+
+// OOB_MAKEP2 - makes a 32-bit pointer
+// On 16-bit: makes ptr out of seg selector and seg ofs.
+// On native Mac:
+// makes ptr out of handle and offset in referenced block.
+// On 32-bit: ignore seg selector and uses 32-bit ofs as 32-bit ptr.
+//
+#undef OOB_MAKEP2
+#if OE_SEGMENTED
+#define OOB_MAKEP2(p, p2) (BYTE *)OOB_MAKEP(OOB_SELECTOROF(p), OOB_OFFSETOF(p2))
+#elif OE_MACNATIVE
+#define OOB_MAKEP2(p, p2) (BYTE *)((BYTE *)(*p) + OOB_OFFSETOF(p2))
+#else
+#define OOB_MAKEP2(p, p2) (BYTE *)(p2)
+#endif
+
+
+// OOB_MAKEP3 - makes a 32-bit pointer
+// On 16-bit: makes ptr out of seg selector and seg ofs: == OOB_MAKEP2
+// On native Mac:
+// makes ptr out of handle and offset in referenced block == OOB_MAKEP2
+// On 32-bit: pointer arithmetic: assume p is base and add in p2 offset.
+//
+#undef OOB_MAKEP3
+#if (OE_SEGMENTED || OE_MACNATIVE)
+#define OOB_MAKEP3(p, p2) OOB_MAKEP2(p, p2)
+#else
+#define OOB_MAKEP3(p, p2) (BYTE *)((BYTE *)(p) + (ULONG)(p2))
+#endif
+
+
+// The constant sheapshake size is inited here.
+// Note: we don't use a static class member since it's
+// referenced in an inline method and hxxtoinc would
+// end up requiring its definition.
+//
+#if ID_DEBUG
+#if OE_RISC
+// CONSIDER: This value must be correspond to the hardware alignment
+// CONSIDER: for each platform. [jeffrob]
+#define SHM_cbShift 0
+#else
+#define SHM_cbShift 2
+#endif
+#else
+// no shifting unless debug
+#define SHM_cbShift 0
+#endif
+
+#if ID_DEBUG
+// struct defined for keeping the list of sheap mgr in the system.
+class SHEAPMGR_LIST {
+public:
+ SHEAPMGR_LIST();
+
+ SHEAP_MGR *m_psheapmgr;
+ SHEAPMGR_LIST *m_psheapmgrlistNext;
+};
+#endif
+
+//
+// **********************************
+// *** class SHEAP_MGR starts here **
+// **********************************
+//
+
+/***
+*class SHEAP_MGR - 'sheapmgr': Silver heap manager
+*Purpose:
+* The class implements the Silver heap manager.
+*
+***********************************************************************/
+
+class SHEAP_MGR
+{
+ friend class BLK_DESC;
+ friend class BLK_MGR;
+ friend void CreateEbInc(void); //tool that generates EB.INC file
+#if ID_TEST
+ friend TIPERROR GetSheapSize(UINT argc, BSTRA *rglstr);
+ friend TIPERROR GetAllSizes(UINT argc, BSTRA *rglstr);
+#endif
+public:
+ static TIPERROR Create(SHEAP_MGR **ppsheapmgr, UINT cbSizeReserved);
+ nonvirt UINT CbSizeHeap() const;
+
+ SHEAP_MGR();
+ ~SHEAP_MGR();
+ void operator delete(void *pv);
+
+ // Locking methods
+ nonvirt VOID Lock();
+ nonvirt VOID Unlock();
+ nonvirt BOOL IsLocked() const;
+
+ // CONSIDER: make private???
+ static CONSTDATA UINT m_cbSizeInitial;
+
+#if ID_DEBUG
+ static VOID DebSheapShake();
+ nonvirt VOID DebShowState(UINT uLevel) const;
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt BOOL DebCanSheapShake();
+ nonvirt VOID DebSheapShakeOn();
+ nonvirt VOID DebSheapShakeOff();
+ nonvirt VOID DebSheapShakeOne();
+ nonvirt VOID DebLock();
+ nonvirt VOID DebUnlock();
+ nonvirt BOOL DebIsLocked();
+ nonvirt static VOID DebAddSheapmgrToList(SHEAP_MGR *psheapmgr);
+ nonvirt static VOID DebRemoveSheapmgrFromList(SHEAP_MGR *psheapmgr);
+
+#else
+ static VOID DebSheapShake() {}
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+ nonvirt VOID DebCheckState(UINT uLevel) const {}
+ nonvirt VOID DebCanSheapShake() {}
+ nonvirt VOID DebSheapShakeOn() {}
+ nonvirt VOID DebSheapShakeOff() {}
+ nonvirt VOID DebSheapShakeOne() {}
+ nonvirt VOID DebLock() {}
+ nonvirt VOID DebUnlock() {}
+ nonvirt VOID DebIsLocked() {}
+ nonvirt static VOID DebAddSheapmgrToList(SHEAP_MGR *psheapmgr) {}
+ nonvirt static VOID DebRemoveSheapmgrFromList(SHEAP_MGR *psheapmgr) {}
+
+#endif // ID_DEBUG
+
+protected:
+ // Clients should use Create().
+ void *operator new(size_t cbSize);
+
+ nonvirt TIPERROR Init(UINT cbSizeReserved);
+
+ // 24-Mar-93 ilanc: needed by OE_MAC as well
+ /* inline */ nonvirt BLK_DESC *PtrOfBlkDesc(BLK_DESC *pblkdesc) const;
+ nonvirt BLK_DESC *PtrOfBlkDescPrev(BLK_DESC *pblkdesc) const;
+ nonvirt BLK_DESC *PtrOfBlkDescLast() const;
+
+ nonvirt VOID AddBlkdesc(BLK_DESC *pblkdesc, ULONG cbSize);
+ nonvirt VOID RemoveBlkdesc(BLK_DESC *pblkdesc);
+
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+ nonvirt BOOL IsValid() const;
+
+ // Following methods are in principle public, but really
+ // only accessed by the BLK_MGR/BLK_DESC, thus instead
+ // of making them globally accessible we "restrict"
+ // their access to BLK_MGR/BLK_DESC by making BLK_MGR/BLK_DESC
+ // friends.
+ // (So, friendship can be useful...).
+ //
+ nonvirt TIPERROR Alloc(BLK_DESC *pblkdesc, ULONG cbSize);
+ nonvirt VOID Free(BLK_DESC *pblkdesc);
+ nonvirt TIPERROR Realloc(BLK_DESC *pblkdesc, ULONG cbSizeNew);
+
+private:
+ // These are *really* private
+ nonvirt TIPERROR ReallocHeap(ULONG cbSizeNewHeap);
+ nonvirt VOID ShiftHeap(BLK_DESC *pblkdesc, LONG dbSize);
+
+ // 32-bits are reserved even if 16-bit version for
+ // following two pointer members.
+ // In Win16, used as "near" pointer in heap seg.
+ // Hiword ignored (should be 0).
+ //
+ // On native Mac: m_pblkdescFirst is a 32-bit ptr to the first blkdesc
+ // managed by this heap and m_pbFree is a 16-bit "near" ptr
+ // into the relocatable memory block managed by the sheap,
+ // i.e. to get a ptr to the first free byte:
+ // (BYTE *)(*m_hMemHeap + LOWORD(m_pbFree))
+ //
+ // On 32-bits: each is a true 32-bit ptr.
+ //
+ BYTE *m_qbFree;
+
+#endif // ! (OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+ // All implementation link together their blkdescs -- for
+ // purposes of destruction.
+ //
+ BLK_DESC *m_pblkdescFirst;
+
+ // All implementations have a counting semaphore for locking.
+ // Note however that for REALMODE and MAC we lock memory directly at
+ // the block level as well.
+ // We use a 16-bit counter on 16-bit machines since
+ // sheaps are limited to 64K and thus there can't be
+ // more than 64K entries -- likewise we use a 32-bit counter
+ // on 32-bit archs, since in principle their sheaps can be
+ // larger and thus more than 64K entries can be managed.
+ //
+ // Locking implementation: a sheap is locked (i.e. the counter
+ // is incremented) by locking a chunk, a block or the heap
+ // itself. It is considered unlocked iff the counting semaphore
+ // is zero -- unlocking a chunk, block or heap decrements
+ // this counter. A locked sheap cannot be grown or shrunk
+ // in such a way that will move any contained blocks or chunks.
+ //
+ // Allocating a new chunk however will succeed if there's a
+ // large enough chunk on the freelist. Freeing a chunk always
+ // succeeds.
+ //
+ // In addition the sheap is physically locked. On Win16 this
+ // is a NOP since sheaps are addressed with selectors. On
+ // native Mac, sheaps are implemented as relocatable memblocks and
+ // are actually locked and unlocked.
+ //
+ UINT m_cLocks;
+
+#if ID_DEBUG
+ BOOL m_canSheapShake;
+ UINT m_cbSizeReserved;
+ UINT m_cDebLocks;
+#endif
+
+#if OE_SEGMENTED
+
+ USHORT m_cbSizeHeap;
+
+#elif OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+
+ // Each block is separately managed, i.e. there is no
+ // contiguous sheap memblock
+
+#elif OE_MACNATIVE
+
+ USHORT m_cbSizeHeap;
+ Handle m_hMemHeap; // On mac: the sheap is a single
+ // relocatable block within which
+ // we manage blkdescs.
+#else
+#error Incorrect OE
+#endif // OE
+
+#ifdef SHEAPMGR_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+// **********************************
+// *** class BLK_DESC starts here ***
+// **********************************
+//
+
+// This constant defines the end of list sentinel
+// (used by the linked list of block descriptors).
+//
+BLK_DESC* const BD_pblkdescNil = (BLK_DESC *)UINT_MAX;
+
+/***
+*class BLK_DESC - 'blkdesc': block descriptor
+*Purpose:
+* The class implements block descriptors.
+* Describes a block allocated the heap manager.
+* See \silver\doc\ic\sheapmgr.doc for more information.
+*
+*Implementation Notes:
+* Since block descriptors and the heap manager, that it interfaces
+* to, are both allocated in the same segment, there's no need to
+* explicitly contain a reference to the allocating heap (of the
+* block described by this descriptor).
+*
+* The debug version allocates an extra two bytes at the end
+* of the managed memblock for sheapshaking purposes
+* and has a debug-only flag indicating the state of shift:
+* up or down.
+*
+*Friends: SHEAP_MGR
+*
+***********************************************************************/
+
+class BLK_DESC
+{
+ friend class SHEAP_MGR;
+ friend class BLK_MGR;
+ friend class DYN_BLK_MGR;
+ friend void CreateEbInc(void); //tool that generates EB.INC file
+
+public:
+ BLK_DESC();
+ ~BLK_DESC();
+
+ nonvirt TIPERROR Init(SHEAP_MGR *psheapmgr, UINT cbSize);
+
+ inline nonvirt BYTE *QtrOfBlock() const;
+ inline nonvirt UINT CbSize() const;
+ inline nonvirt VOID Free();
+ nonvirt TIPERROR Realloc(ULONG cbSizeNew);
+ inline nonvirt BOOL IsValid() const;
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt UINT GetSize() const;
+ nonvirt UINT GetRemainingSize() const;
+ nonvirt SHEAP_MGR *Psheapmgr() const;
+
+ // Locking methods
+ nonvirt VOID Lock();
+ nonvirt VOID Unlock();
+ nonvirt BOOL IsLocked() const;
+
+ // Debug/test methods
+#if ID_DEBUG
+ nonvirt VOID DebShowState(UINT uLevel) const;
+#else
+ nonvirt VOID DebShowState(UINT uLevel) const {}
+#endif
+
+private:
+ inline nonvirt BYTE *QtrOfBlockActual() const;
+ inline nonvirt UINT CbSizeActual() const;
+
+
+ // 32-bits are reserved even if 16-bit version for
+ // following two pointer members.
+ //
+ // In Win16/Os2 1.x: used as "near" pointer in heap seg.
+ // Hiword ignored (should be 0).
+ //
+ // In realmode used as "far" pointer to memblock/blkdesc.
+ //
+ // In 32-bit: 32-bit pointer to memblock/blkdesc.
+ //
+ // On Mac: m_pbMemBlock is "near ptr" relative to *m_hMemHeap:
+ // i.e. to get pointer to memblock:
+ // (BYTE *)(*m_hMemHeap + LOWORD(m_pbMemBlock));
+ // m_pblkdescNext is 32-bit pointer to next blkdesc.
+ //
+ BYTE *m_qbMemBlock;
+ BLK_DESC *m_pblkdescNext;
+
+#if OE_SEGMENTED
+
+ USHORT m_cbSize;
+
+#elif OE_REALMODE || OE_MACNATIVE || OE_MAC || OE_RISC || OE_WIN32
+
+ USHORT m_cbSize;
+ SHEAP_MGR *m_psheapmgr;
+
+#else
+#error Incorrect OE
+#endif // OE
+
+#if (OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+ // Since blocks are managed separately in realmode and fixed mem
+ // Mac, we lock them at the block level rather than deferring
+ // to the containing sheap as is the case for other implementations.
+ //
+ UINT m_cLocks;
+#endif // (OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+#if ID_DEBUG
+ // Debug-only flag indicating state of shift for sheapshaking
+ // purposes.
+ // TRUE if extra two bytes is at end of memblock and thus
+ // should shift up (to a higher address) to shake,
+ // otherwise should shift down.
+ // Initially set to TRUE.
+ //
+ BOOL m_fShiftUp;
+#endif
+
+#ifdef BLKDESC_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+
+
+// **************************************
+// *** SHEAP_MGR inline class methods ***
+// **************************************
+
+// Most inline methods have been made *temporarily* outline.
+// The reason is that cfront complains (spuriously) about
+// about "const cast away" then the this pointer for const
+// methods (which these all are) is cast to an integer.
+// C7 doesn't complain though... so....
+//
+
+/***
+*PUBLIC SHEAP_MGR::Lock
+*Purpose:
+* Lock the sheap.
+*
+*Implementation Notes:
+* Increment counting semaphore.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID SHEAP_MGR::Lock()
+{
+#if OE_MACNATIVE
+ // We could do this for OE_WIN as well, but since
+ // it's a NOP why waste the funccall.
+ //
+ // Only need to physically lock if never locked.
+ if (m_cLocks == 0) {
+ (VOID)PvLockHsys((HSYS)m_hMemHeap);
+ }
+#endif
+ m_cLocks++;
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::Unlock
+*Purpose:
+* Unlock the sheap.
+*
+*Implementation Notes:
+* Decrements counting semaphore.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID SHEAP_MGR::Unlock()
+{
+ DebAssert(m_cLocks > 0, "SHEAP_MGR::Unlock: underflow.");
+ m_cLocks--;
+
+#if OE_MACNATIVE
+ // We could do this for OE_WIN as well, but since
+ // it's a NOP why waste the funccall.
+ //
+ if (m_cLocks == 0) {
+ // No more outstanding locks, we can physically unlock.
+ UnlockHsys((HSYS)m_hMemHeap);
+ }
+#endif
+}
+
+
+/***
+*PUBLIC SHEAP_MGR::IsLocked
+*Purpose:
+* Tests if sheap is locked.
+*
+*Implementation Notes:
+* Tests counting semaphore.
+*
+*Entry:
+*
+*Exit:
+* TRUE if sheap is locked -- i.e. at least one lock.
+***********************************************************************/
+
+inline BOOL SHEAP_MGR::IsLocked() const
+{
+ return (BOOL)(m_cLocks > 0);
+}
+
+
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+
+/***
+*PROTECTED SHEAP_MGR::IsValid
+*Purpose:
+* Is sheap valid -- i.e has it been initialized?
+*
+*Implementation Notes:
+* We test the m_cbSizeHeap member. After initialization
+* it must always be >= sizeof(SHEAP_MGR).
+*
+*Entry:
+*
+*Exit:
+* TRUE if already initialized, else FALSE
+*
+***********************************************************************/
+
+inline BOOL SHEAP_MGR::IsValid() const
+{
+ return (BOOL)(m_cbSizeHeap > 0);
+}
+
+
+
+#endif // !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+
+/***
+*PUBLIC SHEAP_MGR::CbSizeHeap
+*Purpose:
+* Returns the current size of the heap.
+*
+* Note: NA for MAC or REALMODE (since no sheap really).
+*
+*Entry:
+*
+*Exit:
+* ULONG size of the sheap.
+*
+***********************************************************************/
+
+inline UINT SHEAP_MGR::CbSizeHeap() const
+{
+#if !(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+ return (UINT)m_cbSizeHeap;
+#else
+ return UINT_MAX;
+#endif //(OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32)
+}
+
+// *******************************
+// *** BLK_DESC inline methods ***
+// *******************************
+//
+
+
+/***
+*PUBLIC BLK_DESC::Psheapmgr
+*Purpose:
+* Get containing sheapmgr
+*
+*Implementation Notes:
+* Defers to sheap.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline SHEAP_MGR *BLK_DESC::Psheapmgr() const
+{
+#if OE_SEGMENTED
+ return ((SHEAP_MGR *)OOB_MAKEP2(this, 0));
+#else
+ return m_psheapmgr;
+#endif
+}
+
+/***
+*PROTECTED SHEAP_MGR::PtrOfBlkDesc - Convert blk desc offset to address.
+*Purpose:
+* Convert blk desc offset to address.
+*
+*Implementation Notes:
+* On Win16: Assumes that pblkdesc is offset in heap seg.
+* Asserts if oBlkDesc not in reserved range at start of heap.
+* On Mac: Assumes the pblkdesc 32-bit ptr.
+* NOTE: wants to be inline. Will be when C7 is used cos
+* then spurious "const castaway" warning won't be
+* generated.
+*
+*Entry:
+* 16-bit:
+* pblkdesc - offset of block desc in heap.
+*
+*Exit:
+*
+***********************************************************************/
+
+inline BLK_DESC *SHEAP_MGR::PtrOfBlkDesc(BLK_DESC *pblkdesc) const
+{
+ DebAssert(pblkdesc != BD_pblkdescNil,
+ "SHEAP_MGR::PtrOfBlkDesc: NIL BlkDesc handle.");
+
+#if OE_SEGMENTED
+ DebAssert(OOB_MAKEOFFSET(this, pblkdesc) < m_cbSizeReserved,
+ "SHEAP_MGR::PtrOfBlkDesc: blk desc not in reserved heap part.");
+#endif
+
+#if OE_MACNATIVE || OE_MAC || OE_RISC || OE_WIN32
+ return pblkdesc;
+#else
+ return (BLK_DESC *)OOB_MAKEP2(this, pblkdesc);
+#endif // OE_MACNATIVE || OE_MAC || OE_RISC || OE_WIN32
+}
+
+
+/***
+*PUBLIC BLK_DESC::Lock
+*Purpose:
+* Lock the block.
+*
+*Implementation Notes:
+* Defers to sheap.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID BLK_DESC::Lock()
+{
+ DebAssert(IsValid(), "BLK_DESC::Lock: Block invalid.");
+
+#if OE_SEGMENTED || OE_MACNATIVE
+ Psheapmgr()->Lock();
+#elif OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+ m_cLocks++;
+#else
+#error bad OE.
+#endif
+}
+
+
+/***
+*PUBLIC BLK_DESC::Unlock
+*Purpose:
+* Unlock the block.
+*
+*Implementation Notes:
+* Defers to sheap.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID BLK_DESC::Unlock()
+{
+ DebAssert(IsValid(), "BLK_DESC::Unlock: Block invalid.");
+
+#if OE_SEGMENTED || OE_MACNATIVE
+
+ Psheapmgr()->Unlock();
+
+#elif OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+
+ DebAssert(m_cLocks > 0, "BLK_DESC::Unlock: underflow.");
+ m_cLocks--;
+
+#else
+#error bad OE.
+#endif
+}
+
+
+/***
+*PUBLIC BLK_DESC::IsLocked
+*Purpose:
+* Tests if block is locked.
+*
+*Implementation Notes:
+* Defers to sheap.
+*
+*Entry:
+*
+*Exit:
+* TRUE if block is locked -- i.e. at least one lock.
+***********************************************************************/
+
+inline BOOL BLK_DESC::IsLocked() const
+{
+ DebAssert(IsValid(), "BLK_DESC::IsLocked: Block invalid.");
+
+#if OE_SEGMENTED || OE_MACNATIVE
+
+ return Psheapmgr()->IsLocked();
+
+#elif OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+
+ // we're locked also if our containing sheap is locked.
+ return (BOOL)(m_cLocks > 0) || Psheapmgr()->IsLocked();
+
+#else
+#error bad OE.
+#endif
+
+}
+
+
+/***
+*PUBLIC BLK_DESC::IsValid - Tests if block is valid.
+*Purpose:
+* Tests if block is valid. Note that a 0-size block is valid,
+* however its oMemBlock must be non-zero to be valid (i.e. a
+* 0-size block does have an entry in the heap -- it just happens
+* to be of length 0). Since the SHEAP_MGR itself is always
+* allocated at offset 0 in the heap, this really does mean
+* that an oMemBlock of 0 is in fact invalid.
+* CONSIDER: making inline
+*
+*Entry:
+* None.
+*
+*Exit:
+* Returns TRUE if block valid (i.e. oMemBlock != 0), else FALSE.
+*
+***********************************************************************/
+
+inline BOOL BLK_DESC::IsValid() const
+{
+ return (m_qbMemBlock != NULL);
+}
+
+
+/***
+*PUBLIC BLK_DESC::CbSizeActual - actual size of block accessor (get).
+*Purpose:
+* Returns size of block + extra debug shift bytes.
+*
+*Implementation Notes:
+* In the debug version the extra cbShift bytes are included
+* in the actual size already.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline UINT BLK_DESC::CbSizeActual() const
+{
+ DebAssert(IsValid(), "BLK_DESC::cbSize: Block invalid.");
+ return m_cbSize;
+}
+
+
+/***
+*PUBLIC BLK_DESC::CbSize - size of block accessor (get).
+*Purpose:
+* Returns size of block.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline UINT BLK_DESC::CbSize() const
+{
+ DebAssert(IsValid(), "BLK_DESC::cbSize: Block invalid.");
+ // We could actually just use the debug version for release
+ // as well since m_cbShift will be zero in that case --
+ // however we make it explicit that there's no shakeshift
+ // in the rel version here.
+ //
+#if ID_DEBUG
+ return CbSizeActual() - SHM_cbShift;
+#else
+ return CbSizeActual();
+#endif
+}
+
+
+/***
+*PUBLIC BLK_DESC::Free - Frees an allocated block.
+*Purpose:
+* Frees a block from the heap. Defers to heap manager.
+*
+*Implementation Notes:
+* 16-bit: Assumes that heap manager is allocated at offset 0 in this
+* segment.
+* CONSIDER: making inline
+*
+*Entry:
+* None.
+*
+*Exit:
+* Sets private members to invalid state.
+*
+***********************************************************************/
+
+inline VOID BLK_DESC::Free()
+{
+ DebAssert(IsValid(), "BLK_DESC::Free: Block invalid.");
+
+#if OE_SEGMENTED || OE_MACNATIVE
+
+ Psheapmgr()->Free(this);
+
+#elif OE_REALMODE || OE_MAC || OE_RISC || OE_WIN32
+
+ MemFree(m_qbMemBlock);
+ Psheapmgr()->RemoveBlkdesc(this);
+
+#else
+#error bad OE.
+#endif
+
+ // Reinitialize by reconstructing in place.
+ ::new (this) BLK_DESC;
+
+ DebAssert(IsValid() == FALSE,
+ "BLK_DESC::Free: Whoops! Block should be invalid.");
+}
+
+
+/***
+*PUBLIC BLK_DESC::QtrOfBlockActual - returns block address.
+*Purpose:
+* Returns ptr to actual memblock -- ignoring the extra cbShift.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+// CONSIDER: andrewso 30-Jun-93
+// QtrOfBlockActual is merged with QtrOfBlock, which in turn has
+// been merged with BLK_MGR::QtrOfHandle to avoid a problem
+// with inlining QtrOfBlockActual when QtrOfHandle is called.
+//
+// When we upgrade to a better compiler, we should think of putting
+// all of this back.
+//
+inline BYTE *BLK_DESC::QtrOfBlockActual() const
+{
+ DebAssert(IsValid(), "BLK_DESC::QtrOfBlockActual: Block invalid.");
+
+#if OE_MACNATIVE
+ return OOB_MAKEP2(m_psheapmgr->m_hMemHeap, m_qbMemBlock);
+#else
+ return OOB_MAKEP2(this, m_qbMemBlock);
+#endif
+}
+
+/***
+*PUBLIC BLK_DESC::QtrOfBlock - returns block address.
+*Purpose:
+* Returns pointer to logical memblock -- i.e. in debug
+* version takes into account cbShift, in release version
+* there is no cbShift.
+*
+*Implementation Notes:
+* In debug version we test the fShiftUp flag -- if set,
+* that means that if we need to shake the block, we
+* should shift it up, thus QtrOfBlockActual() is actually
+* correct, otherwise we should shift it down, thus
+* we should offset QtrOfBlockActual() by SHM_cbShift
+* bytes in order to reference the logical memblock.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+// CONSIDER: andrewso 30-Jun-93
+// QtrOfBlockActual is merged with QtrOfBlock, which in turn has
+// been merged with BLK_MGR::QtrOfHandle to avoid a problem
+// with inlining QtrOfBlockActual when QtrOfHandle is called.
+//
+// When we upgrade to a better compiler, we should consider putting
+// this back.
+//
+inline BYTE *BLK_DESC::QtrOfBlock() const
+{
+ DebAssert(IsValid(), "BLK_DESC::QtrOfBlock: Block invalid.");
+
+ return
+
+#if OE_MACNATIVE
+ OOB_MAKEP2(m_psheapmgr->m_hMemHeap, m_qbMemBlock)
+#else
+ OOB_MAKEP2(this, m_qbMemBlock)
+#endif
+
+#if ID_DEBUG
+ + ((m_fShiftUp == TRUE) ? 0 : SHM_cbShift)
+#endif
+ ;
+}
+
+#if ID_DEBUG
+
+//////////////////////////////////////////////////////////////////
+// SHEAPMGR_LIST methods
+//////////////////////////////////////////////////////////////////
+/***
+*PUBLIC SHEAPMGR_LIST::SHEAPMGR_LIST - returns block address.
+*Purpose:
+* constructor : initializes the data member
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+inline SHEAPMGR_LIST::SHEAPMGR_LIST() {
+
+ m_psheapmgr = NULL;
+ m_psheapmgrlistNext = NULL;
+
+
+}
+#endif
+
+
+#endif // ! SHEAPMGR_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/silver.hxx b/private/oleauto/src/typelib/silver.hxx
new file mode 100644
index 000000000..5272a2860
--- /dev/null
+++ b/private/oleauto/src/typelib/silver.hxx
@@ -0,0 +1,143 @@
+/***
+*silver.hxx - Fundamental Silver include file
+*
+* Copyright (C) 1990, Microsoft Corporation
+*
+*Purpose:
+* This include file defines the basic types used by Silver, and
+* sets up the compile switches and the debug macros.
+*
+* This file should be included before all others.
+*
+*
+*Revision History:
+*
+* 15-AUG-90 petergo: File created.
+* 14-Feb-91 ilanc: added macros.hxx
+* 02-Dec-91 ilanc: debug.hxx must be included before tiperrs.hxx
+* (which includes cltypes.hxx) cos of
+* operator new and explicit ctors (cfront prob).
+* 22-Apr-92 martinc: moved #include "version.hxx" to top of file
+*
+*******************************************************************************/
+
+#ifndef SILVER_HXX_INCLUDED
+#define SILVER_HXX_INCLUDED
+
+#include "switches.hxx"
+#include "version.hxx"
+
+
+#if OE_WIN32
+#define __export
+#define EXPORT
+//This line specifies widechar ctype table instead of ascii (ctype.h).
+#define _NEWCTYPETABLE
+#endif
+
+#if 0
+// ingore certain high-frequency, almost always benign warnings when compiling
+// at high warning levels, in order to cut down on the noise
+#pragma warning(disable:4100) // unreferenced formal parameter
+#pragma warning(disable:4209) // benign typedef redefinition
+#pragma warning(disable:4214) // non-standard extension used
+#pragma warning(disable:4505) // unreferenced local function has been removed
+#if !OE_WIN16
+#pragma warning(disable:4706) // assignment in conditional expression
+#endif
+#endif //0
+
+#if OE_MAC
+// Wings doesn't put all data far even though we told it to. This is a
+// problem for ASLM 1.1 dll's (which includes the mac typelib.dll). We don't
+// have much constant data, so it's easiest to just to put all data far.
+#if OE_MAC68K
+#pragma data_seg("_FAR_DATA")
+#endif
+
+// Even with the above pragma, constant data doesn't go into the proper segment
+// so we define OLECONST which un-const's the problem data items
+#define CONSTDATA
+#else
+#define CONSTDATA const
+#endif
+
+#if !FV_UNICODE_OLE && 0
+// NOTE: 21-Jan-93 ilanc: we #define some long typenames to
+// something shorter to appease the buggy C compiler/linker
+// we're using. Apparently when mangled names get too long
+// (more than 64 chars) it does evil things.
+//
+// UNDONE: these hacks should be removed when we switch over to use C8.
+//
+
+#define tagARRAYDESC tAD
+#define tagBINDPTR tBPTR
+#define tagCALLCONV tCC
+#define tagDESCKIND tDK
+#define tagDISPPARAMS tDPS
+#define tagELEMDESC tED
+#define tagEXCEPINFO tEXI
+#define tagFUNCDESC tFD
+#define tagFUNCFLAGS tFF
+#define tagFUNCKIND tFK
+#define tagIDLDESC tIDLD
+#define tagINTERFACEDATA tID
+#define tagINVOKEKIND tIK
+#define tagMETHODDATA tMD
+#define tagPARAMDATA tPD
+#define tagSYSKIND tSK
+#define tagTLIBATTR tTLA
+#define tagTYPEATTR tTA
+#define tagTYPEDESC tTD
+#define tagTYPEFLAGS tTF
+#define tagTYPEKIND tTK
+#define tagVARDESC tVD
+#define tagVARIANT tVAR
+#define tagVARKIND tVK
+
+#endif //!FV_UNICODE_OLE
+
+
+// These name result in "multiply defined" errors for Mtypelib.lib(on MAC).
+// So we have to rename these names in mtypelib.lib
+
+// <NOTE: I think these were moved to typelib.hxx - jimcool>
+
+
+#include "obwin.hxx"
+
+#include "obole2.h"
+#include "types.h"
+#include "xutil.h" // core functions/macros to manupilate xstring
+
+
+
+// REVIEW: temporarily ifdef out C++ specific stuff (so this header can
+// be included in C files as well). Eventually this needs to be fixed by
+// a better factorization of the header files.
+//
+#ifdef __cplusplus
+
+// A bit of new C++ syntax
+#define nonvirt
+
+#define START_PAS_INCLUDE
+#define END_PAS_INCLUDE
+
+// Setup OE_REALMODE if not already set.
+// (It's only explicitly defined and set in dos (bound) builds).
+//
+#ifndef OE_REALMODE
+#define OE_REALMODE 0
+#endif
+
+#include "mem.hxx" // FYI: defines operator new and delete
+#include "debug.hxx"
+#include "macros.hxx"
+#include "tiperr.h"
+
+#endif // }
+
+
+#endif // !SILVER_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/stltinfo.cxx b/private/oleauto/src/typelib/stltinfo.cxx
new file mode 100644
index 000000000..e4e9bae58
--- /dev/null
+++ b/private/oleauto/src/typelib/stltinfo.cxx
@@ -0,0 +1,500 @@
+/***
+*stltinfo.cxx - STL_TYPEINFO definition
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* STL_TYPEINFO must be inherited by those TYPEINFOs which are stored
+* in a GenericTypeLibOLE.
+*
+*Revision History:
+*
+* 14-May-91 alanc: Created.
+* 12-Feb-93 w-peterh: GetContainingTypeLib returns HRESULT
+* 02-Mar-93 w-peterh: GetContainingTypeLib takes UINT* not USHORT*
+*
+*****************************************************************************/
+
+#include "silver.hxx"
+
+#define STL_TYPEINFO_VTABLE // export STL_TYPEINFO vtable
+#include "typelib.hxx"
+#include "stltinfo.hxx"
+#include "gdtinfo.hxx"
+#include "string.h"
+
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+static char szOleDTInfoCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleDTInfoCxx
+#else
+static char szDTInfoCxx[] = __FILE__;
+#define SZ_FILE_NAME szDTInfoCxx
+#endif
+#endif
+
+
+
+/***
+*PUBLIC STL_TYPEINFO::GetLcid
+*Purpose:
+* Get the lcid from the containing typelibs nammgr
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR STL_TYPEINFO::GetLcid(LCID *plcid)
+{
+ *plcid = PgtlibOleContaining()->GetLcid();
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::RelInternalRef
+*Purpose:
+* Release an internal (from a TypeInfo in the same TypeLib) reference
+* to the TypeInfo.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+VOID STL_TYPEINFO::RelInternalRef()
+{
+ DebAssert(m_pgtliboleContainer != NULL,
+ "STL_TYPEINFO::RelInternalRef m_pgtliboleContainer NULL");
+
+
+ // If the count is equal to zero, we are only being called to destroy
+ // this object...so don't decrement either our or our partner's
+ // internal refcount.
+ //
+ if (m_cInternalRefs != 0) {
+ m_cInternalRefs--;
+
+ if (PstltiPartner() != NULL) {
+ // Now release a reference on our partner.
+ ReleasePartner();
+ }
+ }
+
+ if (m_cRefs + m_cInternalRefs == 0) {
+
+ // Make sure our partner's pointer to use is invalidated.
+ if (PstltiPartner() != NULL) {
+ PstltiPartner()->SetPstltiPartner(NULL);
+ }
+
+ if (m_hte != HTENTRY_Nil) {
+ // unlink from TypeLib's list
+ m_pgtliboleContainer->Deleting(m_hte);
+ }
+ ((GEN_DTINFO *)this)->GEN_DTINFO::~GEN_DTINFO();
+ MemFree(this);
+ }
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC DYNTYPEINFO::QueryInterface
+*Purpose:
+* Implementation of QueryInterface method. Supports casting to
+* DYNTYPEINFO.
+*Entry:
+* riid - Interface GUID
+* ppvObj - LPVOID * that receives the requested protocol.
+*
+*Exit:
+* Return NOERROR or ReportResult(0, E_NOINTERFACE, 0, 0)
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HRESULT DYNTYPEINFO::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
+{
+ if (IIDEQ(riid, IID_IUnknown)) {
+ *ppvObj = (LPVOID) (IUnknown *) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ if (IIDEQ(riid, IID_ITypeInfoA)) {
+ *ppvObj = (LPVOID) (ITypeInfoA *) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ if (IIDEQ(riid, IID_TYPEINFO)) {
+ *ppvObj = (LPVOID) (TYPEINFO *) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ if (IIDEQ(riid, IID_DYNTYPEINFO)) {
+ *ppvObj = (LPVOID) (DYNTYPEINFO *) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ *ppvObj = NULL; // required by OLE
+ return ReportResult(0, E_NOINTERFACE, 0, 0);
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC STL_TYPEINFO::QueryInterface
+*Purpose:
+* Implementation of QueryInterface method. Supports casting to
+* STL_TYPEINFO.
+*Entry:
+* riid - Interface GUID
+* ppvObj - LPVOID * that receives the requested protocol.
+*
+*Exit:
+* Return NOERROR or ReportResult(0, E_NOINTERFACE, 0, 0)
+***********************************************************************/
+HRESULT STL_TYPEINFO::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
+{
+ if (IIDEQ(riid, IID_ITypeInfoA)) {
+ *ppvObj = (LPVOID) (ITypeInfoA *) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ if (IIDEQ(riid, IID_ICreateTypeInfoA)) {
+ *ppvObj = (LPVOID) (ICreateTypeInfoA *) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ if (IIDEQ(riid, IID_IUnknown)) {
+ *ppvObj = (LPVOID) (IUnknown *)(ITypeInfoA *) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ *ppvObj = NULL; // required by OLE
+ return ReportResult(0, E_NOINTERFACE, 0, 0);
+}
+
+/***
+*PUBLIC STL_TYPEINFO::AddRef
+*Purpose:
+* Add an external reference to the TypeInfo.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+ULONG STL_TYPEINFO::AddRef()
+{
+ m_cRefs++;
+
+ // Since there are at least test cases which invoke this function
+ // on a TYPEINFO that has no container we must check for NULL.
+ if (m_pgtliboleContainer != NULL)
+ m_pgtliboleContainer->AddRef();
+
+ // Check to see if we're a dual interface, if so, increment
+ // the count on our partner.
+ //
+ if (PstltiPartner() != NULL) {
+ AddPartnerRef();
+ }
+
+ return m_cRefs;
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC STL_TYPEINFO::Release
+*Purpose:
+* Release an external reference to the STL_TYPEINFO.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+ULONG STL_TYPEINFO::Release()
+{
+ ULONG cRefs;
+ GenericTypeLibOLE *pgtliboleContainer = m_pgtliboleContainer;
+
+ DebAssert(m_cRefs > 0, "underflow.");
+ m_cRefs--;
+ cRefs = m_cRefs;
+
+ // Check to see if we're a dual interface, if so, decrement
+ // the count on our partner.
+ //
+ if (PstltiPartner() != NULL) {
+ ReleasePartner();
+ }
+
+ // If our external references go to zero, release the appobject
+ // in case it holds a reference to the typelib.
+ //
+ if (cRefs == 0) {
+ ReleasePublicResources();
+ }
+
+ if (m_cRefs + m_cInternalRefs == 0) {
+ if (pgtliboleContainer != NULL) {
+ if (m_hte != HTENTRY_Nil) {
+ // unlink from typelib's list
+ pgtliboleContainer->Deleting(m_hte);
+ }
+ }
+
+ ((GEN_DTINFO *)this)->GEN_DTINFO::~GEN_DTINFO();
+ MemFree(this);
+ }
+
+ if (pgtliboleContainer != NULL)
+ pgtliboleContainer->Release(); // if this reduces the typelib's
+ // ref count to zero, then the typelib
+ // plus all ref'ed TYPEINFOs are deleted
+ return cRefs;
+
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC STL_TYPEINFO::SetModified
+*Purpose:
+* Sets the TYPEINFO's modified status.
+*
+*Entry:
+* isModified
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR STL_TYPEINFO::SetModified(BOOL isModified)
+{
+ TIPERROR err = TIPERR_None;
+
+ // Only do something if we're actually changing the isModified
+ // state. This comparison is done with ! in order to normalize
+ // against different non-zero "true" values.
+ if (!m_isModified != !isModified) {
+
+ // In any case, update the isModified flag.
+ // It is important to do this before the RelInternalRef, since
+ // the RelInternalRef potentially causes THIS to be deleted.
+ m_isModified = isModified;
+
+ // If we're marking the type as modified, then add an internal
+ // reference so that the typeinfo won't go away (and lose the
+ // changes). The reference is released when the type is saved.
+ if (isModified) {
+ AddInternalRef();
+ err = m_pgtliboleContainer->SetModified(TRUE);
+ DebAssert(err == TIPERR_None, "SetModified");
+ }
+ // If we're marking the type as not modified, then we need to
+ // release the internal reference that was added when the type
+ // was marked modified.
+ else {
+
+ RelInternalRef();
+ }
+ }
+
+ return err;
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC STL_TYPEINFO::SetContainingTypeLib - Set container of Type
+*Purpose:
+* Called when TYPEINFO is added or removed from a ITypeLib.
+*
+*Entry:
+* pgtlibole - pointer to ITypeLib or NULL if being removed from ITypeLib
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID STL_TYPEINFO::SetContainingTypeLib(GenericTypeLibOLE *pgtlibole)
+{
+ UINT i;
+
+ if (pgtlibole != NULL) {
+ DebAssert(m_pgtliboleContainer == NULL, "");
+ // increment the containing TypeLib's reference count by the
+ // number of reference counts to this TypeInfo
+ for (i = 0; i < m_cRefs; i++)
+ pgtlibole->AddRef();
+
+ // Fix for bug#: 6153.
+ // set the containing typelib/project.
+ m_pgtliboleContainer = pgtlibole;
+
+ }
+ else {
+ // decrement the containing TypeLib's reference count by the
+ // number of reference counts to this TypeInfo
+ for (i = 0; i < m_cRefs; i++)
+ m_pgtliboleContainer->Release();
+
+ // Now blow this TYPEINFO away. Nobody should have any references
+ // of any kind this this anymore.
+ ((GEN_DTINFO *)this)->GEN_DTINFO::~GEN_DTINFO();
+ MemFree(this);
+ }
+
+}
+#pragma code_seg( )
+
+
+/***
+*PUBLIC STL_TYPEINFO::~STL_TYPEINFO
+*Purpose:
+* Destruct a STL_TYPEINFO.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE )
+STL_TYPEINFO::~STL_TYPEINFO()
+{
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC STL_TYPEINFO::name - return the name of the Type
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+//TIPERROR STL_TYPEINFO::SetName(SZ namebuf, USHORT cbMax)
+//{
+// return SzCopy(sz_Name, namebuf, cbMax);
+//}
+
+
+/***
+*PUBLIC STL_TYPEINFO::GetContainingTypeLib
+*Purpose:
+* Return the TypeLib which contains the given TypeInfo
+*Entry:
+* lplpTypeLib returns pointer to the TypeLib.
+* *lplpTypeLib is set only if lplpTypeLib is not NULL.
+* pindex returns the index of this typeinfo in the containing typelib.
+* *pindex is set only if pindex is not NULL.
+*
+*Exit:
+* TIPERROR --- if no containing TypeLib returns TIPERR_NoContainingLib
+*
+*NOTE:
+* This method can be used in several ways:
+* To get the containing typelib only, pass NULL for pindex.
+* To get the index only, pass NULL for lplpTypeLib.
+* To get both, pass valid pointers.
+* To get neither, but find out if there is a containing typelib,
+* pass NULL for both parameters and look at the return value.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HRESULT STL_TYPEINFO::GetContainingTypeLib(ITypeLibA **lplpTypeLib, UINT *pindex)
+{
+ if (m_pgtliboleContainer == NULL)
+ return HresultOfScode(E_NOINTERFACE);
+
+ if (lplpTypeLib != NULL) {
+ m_pgtliboleContainer->AddRef();
+ *lplpTypeLib = m_pgtliboleContainer;
+ }
+
+ if (pindex != NULL)
+ *pindex = m_hte;
+
+ return NOERROR;
+}
+#pragma code_seg()
+
+
+/***
+*STL_TYPEINFO::PrepareForDestructio
+*Purpose:
+* NO OP
+*Entry:
+* None
+*Exit:
+* None
+***********************************************************************/
+VOID STL_TYPEINFO::PrepareForDestruction()
+{
+ // No op
+}
+
+/***
+*STL_TYPEINFO::Invoke
+*Purpose:
+* NO OP
+*Entry:
+* None
+*Exit:
+* None
+***********************************************************************/
+HRESULT STL_TYPEINFO::Invoke(VOID FAR* pvInstance,
+ MEMBERID memid,
+ WORD wFlags,
+ DISPPARAMSA FAR *pdispparams,
+ VARIANTA FAR *pvarResult,
+ EXCEPINFOA FAR *pexcepinfo,
+ UINT FAR *puArgErr)
+{
+ return NOERROR; // NOP
+}
diff --git a/private/oleauto/src/typelib/stltinfo.hxx b/private/oleauto/src/typelib/stltinfo.hxx
new file mode 100644
index 000000000..5ea4f512d
--- /dev/null
+++ b/private/oleauto/src/typelib/stltinfo.hxx
@@ -0,0 +1,558 @@
+/***
+*stltinfo.hxx - STL_TYPEINFO header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* STL_TYPEINFO is inherited by those TYPEINFO derivatives that
+* are stored in STAT_TYPELIBs.
+*
+*
+*Revision History:
+*
+* 14-May-91 alanc: Created.
+* 25-Aug-92 rajivk: support for bringing all needed class to runnable state
+*
+*****************************************************************************/
+
+#ifndef stltinfo_HXX_INCLUDED
+#define stltinfo_HXX_INCLUDED
+
+#include "errmap.hxx"
+#include "dyntinfo.hxx"
+#include "gtlibole.hxx"
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szSTLTINFO_HXX)
+#define SZ_FILE_NAME g_szSTLTINFO_HXX
+#endif
+
+struct TINODE;
+class GEN_DTINFO; //needed for friendship declaration
+class GenericTypeLibOLE;
+class GEN_PROJECT;
+class GEN_DTINFO;
+
+#define STAT_TYPELIB GEN_PROJECT
+
+
+/***
+*class STL_TYPEINFO
+*Purpose:
+* STL_TYPEINFO is inherited by those TYPEINFO derivatives that
+* are stored in STAT_TYPELIBs.
+*
+***********************************************************************/
+
+class STL_TYPEINFO : public DYNTYPEINFO, public ICreateTypeInfoA
+{
+friend GenericTypeLibOLE;
+friend STAT_TYPELIB;
+friend GEN_PROJECT;
+
+friend GEN_DTINFO;
+
+#if ID_TEST
+friend TIPERROR WriteTypeInfoToFile(LPSTR szFileName, GEN_DTINFO *pgdtinfo);
+friend TIPERROR ReadTypeInfoFromFile(LPSTR szFileName, GEN_DTINFO **ppgdtinfo);
+#endif
+
+public:
+
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
+ STDMETHOD_(ULONG,AddRef) (THIS);
+ STDMETHOD_(ULONG,Release) (THIS);
+
+ // Stubbed inherited virtual functions from ITypeInfo and
+ // ICreateTypeInfo.
+ // NOTE: They are simply stubbed here with a null body.
+ //
+
+ // Methods from ITypeInfo
+ STDMETHOD(GetTypeAttr)(THIS_ TYPEATTR FAR* FAR* lplptypeattr) { return 0; }
+ STDMETHOD(GetTypeComp)(THIS_ ITypeCompA FAR* FAR* lplptcomp) { return 0; }
+ STDMETHOD(GetFuncDesc)(THIS_ UINT index,
+ FUNCDESC FAR* FAR* lplpfuncdesc) { return 0; }
+ STDMETHOD(GetVarDesc)(THIS_ UINT index,
+ VARDESCA FAR* FAR* lplpvardesc) { return 0; }
+ STDMETHOD(GetNames)(THIS_ MEMBERID memid,
+ BSTR FAR* rgbstrNames,
+ UINT cMaxNames,
+ UINT FAR* lpcNames) { return 0; }
+ STDMETHOD(GetRefTypeOfImplType)(THIS_ UINT index,
+ HREFTYPE FAR* phreftype) { return 0; }
+ STDMETHOD(GetImplTypeFlags)(THIS_ UINT index,
+ INT FAR* pimpltypeflags) { return 0; }
+ STDMETHOD(GetIDsOfNames)(THIS_ OLECHAR FAR* FAR* rgszNames,
+ UINT cNames,
+ MEMBERID FAR* rgmemid) { return 0; }
+ STDMETHOD(Invoke)(THIS_ VOID FAR* lpvInstance,
+ MEMBERID memid,
+ WORD wFlags,
+ DISPPARAMSA FAR *lpdispparams,
+ VARIANTA FAR *lpvarResult,
+ EXCEPINFOA FAR *lpexcepinfo,
+ UINT FAR *lpuArgErr); // stub in stltinfo.cxx
+ STDMETHOD(GetDocumentation)(THIS_ MEMBERID memid,
+ BSTR FAR* lpbstrName,
+ BSTR FAR* lpbstrDocString,
+ DWORD FAR* lpdwHelpContext,
+ BSTR FAR* lpbstrHelpFile) { return 0; }
+ STDMETHOD(GetDllEntry)(THIS_
+ MEMBERID memid,
+ INVOKEKIND invkind,
+ BSTR FAR* lpbstrDllName,
+ BSTR FAR* lpbstrName,
+ WORD FAR* lpwOrdinal)
+ { return 0; }
+ STDMETHOD(GetRefTypeInfo)(THIS_ HREFTYPE hreftype,
+ ITypeInfoA FAR* FAR* lplptinfo) { return 0; }
+ STDMETHOD(AddressOfMember)(THIS_ MEMBERID memid,
+ INVOKEKIND invkind,
+ VOID FAR* FAR* lplpv) { return 0; }
+ STDMETHOD(CreateInstance)(THIS_
+ IUnknown FAR* punkOuter,
+ REFIID iid,
+ VOID FAR* FAR* lplpvObject) { return 0; }
+ STDMETHOD(GetMops)(THIS_ MEMBERID memid,
+ BSTR FAR* lpbstrMops) { return 0; }
+ STDMETHOD(GetContainingTypeLib)(THIS_ ITypeLibA FAR* FAR* lplptlib,
+ UINT FAR* lpindex);
+ STDMETHOD_(void, ReleaseTypeAttr)(THIS_ TYPEATTR FAR* lptypeattr) {}
+ STDMETHOD_(void, ReleaseFuncDesc)(THIS_ FUNCDESC FAR* lpfuncdesc) {}
+ STDMETHOD_(void, ReleaseVarDesc)(THIS_ VARDESCA FAR* lpvardesc) {}
+
+ // Methods from ICreateTypeInfo
+ STDMETHOD(SetGuid)(THIS_ REFGUID guid) { return 0; }
+ STDMETHOD(SetTypeFlags)(THIS_ UINT uTypeFlags) { return 0; }
+ STDMETHOD(SetDocString)(THIS_ LPOLESTR lpstrDoc) { return 0; }
+ STDMETHOD(SetHelpContext)(THIS_ DWORD dwHelpContext) { return 0; }
+ STDMETHOD(SetVersion)(THIS_ WORD wMajorVerNum,
+ WORD wMinorVerNum) { return 0; }
+ STDMETHOD(AddRefTypeInfo)(THIS_ ITypeInfoA FAR* ptinfo,
+ HREFTYPE FAR* lphreftype) { return 0; }
+ STDMETHOD(AddFuncDesc)(THIS_ UINT index,
+ FUNCDESC FAR* lpfuncdesc) { return 0; }
+ STDMETHOD(AddImplType)(THIS_ UINT index,
+ HREFTYPE hreftype) { return 0; }
+ STDMETHOD(SetImplTypeFlags)(THIS_ UINT index,
+ INT impltypeflags) { return 0; }
+ STDMETHOD(SetAlignment)(THIS_ WORD cbAlignment) { return 0; }
+ STDMETHOD(SetSchema)(THIS_ LPOLESTR lpstrSchema) { return 0; }
+ STDMETHOD(AddVarDesc)(THIS_ UINT index,
+ VARDESCA FAR* lpvardesc) { return 0; }
+ STDMETHOD(SetFuncAndParamNames)(THIS_ UINT index,
+ LPSTR FAR* rgszNames,
+ UINT cNames) { return 0; }
+ STDMETHOD(SetVarName)(THIS_ UINT index,
+ LPSTR szName) { return 0; }
+ STDMETHOD(SetTypeDescAlias)(THIS_ TYPEDESC FAR* lptdescAlias) { return 0; }
+ STDMETHOD(DefineFuncAsDllEntry)(THIS_ UINT index,
+ LPOLESTR szDllName,
+ LPOLESTR szProcName) { return 0; }
+ STDMETHOD(SetFuncDocString)(THIS_ UINT index,
+ LPOLESTR szDocString) { return 0; }
+ STDMETHOD(SetVarDocString)(THIS_ UINT index,
+ LPOLESTR szDocString) { return 0; }
+ STDMETHOD(SetFuncHelpContext)(THIS_ UINT index,
+ DWORD dwHelpContext) { return 0; }
+ STDMETHOD(SetVarHelpContext)(THIS_ UINT index,
+ DWORD dwHelpContext) { return 0; }
+ STDMETHOD(SetMops)(THIS_
+ UINT index, BSTR bstrMops)
+ { return 0; }
+ STDMETHOD(SetTypeIdldesc)(THIS_
+ IDLDESC FAR* lpidldesc)
+ { return 0; }
+ STDMETHOD(LayOut)(THIS) { return 0; }
+
+// Inherited Pure methods
+ virtual TIPERROR GetMemberName(HMEMBER hmember, BSTRA *plstrName) = 0;
+ virtual TIPERROR GetDynTypeMembers(LPLPDYNTYPEMEMBERS lplpDynTypeMembers) = 0;
+ virtual TIPERROR GetDefnTypeBind(DEFN_TYPEBIND **pdfntbind) = 0;
+ virtual TIPERROR GetTypeFixups(LPLPTYPEFIXUPS lplpTypeFixups) = 0;
+ //virtual TYPEKIND GetTypeKind() = 0;
+#if 0
+ virtual TIPERROR CreateInst(LPLPVOID lplpObj) = 0;
+#endif
+ virtual TIPERROR Reset() = 0;
+ // Method to remove cycle problem within a project.
+ virtual VOID RemoveInternalRefs()=0;
+
+ // inherited methods for bringing needed modules to runnable state.
+ virtual TIPERROR BeginDepIteration(TINODE **pptinode,
+ TINODE ***ppptinodeCycleMax) = 0;
+ virtual VOID EndDepIteration() = 0;
+ virtual TIPERROR GetNextDepTypeInfo(DYNTYPEINFO
+ **ppdtiNext) = 0;
+ virtual BOOL IsReady() = 0;
+ virtual TIPERROR AllDepReady() = 0;
+ virtual TIPERROR NotReady() = 0;
+
+ // Introduced Methods
+ virtual TIPERROR Read() = 0;
+ virtual TIPERROR Write() = 0;
+ virtual TIPERROR WriteToStream(STREAM *pstrm) = 0;
+ virtual LPOLESTR SzTypeIdofTypeInfo() = 0;
+ virtual TIPERROR EnsurePartsRead() = 0;
+ virtual TIPERROR GetEmbeddedTypeInfo(LPOLESTR szTypeId,
+ LPLPTYPEINFO pptinfo) = 0;
+
+ virtual VOID ReleasePublicResources() = 0;
+
+ nonvirt VOID AddPartnerRef();
+ nonvirt VOID ReleasePartner();
+
+ nonvirt STL_TYPEINFO *PstltiPartner();
+ nonvirt VOID SetPstltiPartner(STL_TYPEINFO *pstlti);
+
+// Overridden Inherited methods
+ // virtual TIPERROR GetIcon(DWORD *pdw);
+ // virtual TIPERROR GetDocumentation(BSTR *plstr);
+
+ // virtual DWORD GetHelpContext();
+ // virtual TIPERROR GetHelpFileName(BSTR *plstrFile);
+/*****
+ These are disabled because our implementation make them confusing
+ since they change information stored in the TypeLib directory and
+ so require that the directory be saved
+ virtual TIPERROR SetDocumentation(LPSTR szDoc);
+ virtual TIPERROR SetHelpContext(ULONG ulHelpIndex);
+*****/
+
+
+
+// Introduced methods
+ nonvirt VOID AddInternalRef();
+ nonvirt VOID RelInternalRef();
+ nonvirt BOOL IsModified();
+ nonvirt TIPERROR SetModified(BOOL isModified);
+ nonvirt UINT GetIndex();
+
+ virtual VOID PrepareForDestruction();
+ nonvirt GenericTypeLibOLE *PgtlibOleContaining();
+ nonvirt TIPERROR OpenStream(STREAM **ppstrm, STREAM_OPEN_MODE som);
+
+#if ID_DEBUG
+ nonvirt CHAR *SzDebName();
+ nonvirt ULONG CRefs();
+ nonvirt ULONG CInternalRefs();
+#endif // ID_DEBUg
+
+protected:
+ STL_TYPEINFO();
+ virtual ~STL_TYPEINFO(); // Invoked by STAT_TYPELIB to delete TYPEINFO
+ nonvirt VOID SetHTEntry(HTENTRY hte);
+ nonvirt VOID SetContainingTypeLib(GenericTypeLibOLE *pgtlibole);
+ nonvirt TIPERROR GetLcid(LCID *plcid);
+ virtual TIPERROR CommitChanges() = 0;
+
+#if ID_DEBUG
+ CHAR m_szDebName[DEBNAMESIZE];
+#endif // ID_DEBUG
+
+private:
+ BOOL m_isModified;
+ GenericTypeLibOLE *m_pgtliboleContainer;
+ ULONG m_cRefs;
+ ULONG m_cInternalRefs;
+ HTENTRY m_hte;
+
+ STL_TYPEINFO *m_pstltiPartner;
+
+#ifdef STL_TYPEINFO_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+/***
+*PUBLIC STL_TYPEINFO::STL_TYPEINFO
+*Purpose:
+* STL_TYPEINFO constructor
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline STL_TYPEINFO::STL_TYPEINFO()
+{
+ m_cRefs = 1;
+ m_isModified = FALSE;
+ m_cInternalRefs = 0;
+ m_pgtliboleContainer = NULL;
+ m_hte = HTENTRY_Nil;
+
+#if ID_DEBUG
+ m_szDebName[0] = 0;
+#endif // ID_DEBUG
+
+ m_pstltiPartner = NULL;
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::GetIndex
+*Purpose:
+* Returns the index of this type in its containing lib.
+* NOTE: Assumes that the hte members it the correct index!
+*
+*Entry:
+*
+*Exit:
+* Index of type in lib.
+*
+***********************************************************************/
+
+inline UINT STL_TYPEINFO::GetIndex()
+{
+ return (UINT)m_hte;
+}
+
+
+
+/***
+*PUBLIC STL_TYPEINFO::PgtlibOleContaining
+*Purpose:
+* Return the GenericTypeLibOLE which contains the given TypeInfo --
+* however do not increment the reference count cos otherwise
+* this would create a circular reference.
+* Asserts if typelib null.
+*
+*Entry:
+* None
+*
+*Exit:
+* GenericTypeLibOLE *
+*
+***********************************************************************/
+
+inline GenericTypeLibOLE *STL_TYPEINFO::PgtlibOleContaining()
+{
+ DebAssert(m_pgtliboleContainer != NULL, "No containing lib.");
+
+ return m_pgtliboleContainer;
+}
+
+
+
+/***
+*PUBLIC STL_TYPEINFO::OpenStream - Open the STREAM for this TYPEINFO.
+*Purpose:
+* Return a STREAM opened in the specified mode on this TYPEINFO.
+*
+*Entry:
+* som - The access mode in which the stream is to be opened. See
+* DOCFILE_STREAM::Open for details.
+*
+*Exit:
+* TIPERROR
+*
+***********************************************************************/
+
+inline TIPERROR STL_TYPEINFO::OpenStream(STREAM **ppstrm, STREAM_OPEN_MODE som)
+{
+ return m_pgtliboleContainer->OpenTypeStream(m_hte, som, ppstrm);
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::PstltiPartner
+*Purpose:
+* Returns the typeinfo of the partner for this dual interface.
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns the pointer to the partner.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline STL_TYPEINFO *STL_TYPEINFO::PstltiPartner()
+{
+ return m_pstltiPartner;
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::SetPstltiPartner
+*Purpose:
+* Sets the typeinfo of the partner for this dual interface.
+*
+*Entry:
+* pstlti - the partner to set
+*
+*Exit:
+* None.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline VOID STL_TYPEINFO::SetPstltiPartner(STL_TYPEINFO *pstlti)
+{
+ m_pstltiPartner = pstlti;
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::AddPartnerRef
+*Purpose:
+* Used to keep the number of references of the partners of a dual
+* interface in sync.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline VOID STL_TYPEINFO::AddPartnerRef()
+{
+ DebAssert(m_pstltiPartner != NULL, "Not a dual interface");
+
+ m_pstltiPartner->m_cInternalRefs++;
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::ReleasePartner
+*Purpose:
+* Used to keep the number of references of the partners of a dual
+* interface in sync.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+*Errors:
+* None.
+***********************************************************************/
+
+inline VOID STL_TYPEINFO::ReleasePartner()
+{
+ STL_TYPEINFO *pstlti = PstltiPartner();
+
+ DebAssert(pstlti != NULL, "Not a dual interface");
+
+ // We're a friend of STL_TYPEINFO.
+ DebAssert(pstlti->m_cInternalRefs > 0, "Bad refcount.");
+
+ pstlti->m_cInternalRefs--;
+
+ // If we have no more references, call the REAL ReleaseInternalRef
+ // and it will destroy this instance for us. Since the refcount
+ // is zero, it won't call ReleasePartner on our partner.
+ //
+ if ((pstlti->m_cInternalRefs + pstlti->m_cRefs) == 0) {
+ pstlti->RelInternalRef();
+ }
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::AddInternalRef
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline VOID STL_TYPEINFO::AddInternalRef()
+{
+ DebAssert(m_pgtliboleContainer != NULL, "AddInternalRef");
+ m_cInternalRefs++;
+
+ // Check to see if we're a dual interface, if so, increment
+ // the count on our partner.
+ //
+ if (PstltiPartner() != NULL) {
+ AddPartnerRef();
+ }
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::SetHTEntry
+*Purpose:
+* Inform a TYPEINFO instance of its HTEntry in its containing TypeLib
+*Entry:
+* HTENTRY
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline VOID STL_TYPEINFO::SetHTEntry(HTENTRY hte)
+{
+ m_hte = hte;
+}
+
+
+/***
+*PUBLIC STL_TYPEINFO::IsModified
+*Purpose:
+* Returns boolean indicating whether or not the TYPEINFO has been modified
+*
+*Entry:
+* None.
+*
+*Exit:
+* returns bool
+*
+***********************************************************************/
+
+inline BOOL STL_TYPEINFO::IsModified()
+{
+ return m_isModified;
+}
+
+
+#if ID_DEBUG
+/***
+*PUBLIC STL_TYPEINFO::SzDebName, CRefs, CInternalRefs
+*Purpose:
+* Memory leak reporting accessors.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+inline CHAR *STL_TYPEINFO::SzDebName()
+{
+ return m_szDebName;
+}
+
+inline ULONG STL_TYPEINFO::CRefs()
+{
+ return m_cRefs;
+}
+
+inline ULONG STL_TYPEINFO::CInternalRefs()
+{
+ return m_cInternalRefs;
+}
+#endif // ID_DEBUG
+
+#endif // ! stltinfo_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/strdcl.c b/private/oleauto/src/typelib/strdcl.c
new file mode 100644
index 000000000..451894bb4
--- /dev/null
+++ b/private/oleauto/src/typelib/strdcl.c
@@ -0,0 +1,2 @@
+void *rgMacStrdcl[]={
+(void *)0 };
diff --git a/private/oleauto/src/typelib/stream.hxx b/private/oleauto/src/typelib/stream.hxx
new file mode 100644
index 000000000..49fadbbee
--- /dev/null
+++ b/private/oleauto/src/typelib/stream.hxx
@@ -0,0 +1,188 @@
+/***
+*stream.hxx - stub stream class for Silver.
+*
+* Copyright (C) 1990, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* To provide a simple definition of streams
+*
+*****************************************************************************/
+
+#ifndef STREAM_HXX_INCLUDED
+#define STREAM_HXX_INCLUDED
+
+#include "stdio.h"
+#include "cltypes.hxx"
+#include "mem.hxx"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szSTREAM_HXX)
+#define SZ_FILE_NAME g_szSTREAM_HXX
+#endif
+
+
+#define SwapShort(us) (((us & 0xFF) << 8) | (us >> 8))
+
+enum STREAM_OPEN_MODE {
+ SOM_Read,
+ SOM_Write,
+ SOM_Append
+};
+
+/***
+*class STREAM : Stream Abstract Class
+*Purpose:
+* Simple stream class with read, write, getpos and setpos methods.
+*
+*CONSIDER:
+* To reduce the overhead of individual Read/Write operations,
+* the virtual Read/Write functions could be modified to do
+* reading/writing to a buffer. When the buffer was empty/full
+* then they could invoke virtual functions that do the actual
+* device I/O.
+***********************************************************************/
+
+class STREAM
+{
+public:
+ virtual TIPERROR Read(VOID *buffer, ULONG cbsize) = 0;
+ nonvirt TIPERROR ReadByte(BYTE *pb);
+ nonvirt TIPERROR ReadChar(CHAR *pb);
+ nonvirt TIPERROR ReadShort(SHORT *ps);
+ nonvirt TIPERROR ReadUShort(USHORT *pus);
+ nonvirt TIPERROR ReadLong(LONG *pl);
+ nonvirt TIPERROR ReadULong(ULONG *pul);
+ nonvirt TIPERROR ReadSz(LPOLESTR *sz);
+
+ virtual TIPERROR ReadTextLine(XSZ szLine, UINT cchMax) = 0;
+
+ virtual TIPERROR Write(const VOID *buffer, ULONG cbsize) = 0;
+ nonvirt TIPERROR WriteByte(BYTE b);
+ nonvirt TIPERROR WriteChar(CHAR b);
+ nonvirt TIPERROR WriteShort(SHORT s);
+ nonvirt TIPERROR WriteUShort(USHORT us);
+ nonvirt TIPERROR WriteLong(LONG l);
+ nonvirt TIPERROR WriteULong(ULONG ul);
+ nonvirt TIPERROR WriteSz(LPCOLESTR sz);
+
+ virtual TIPERROR GetPos(LONG *plPos) = 0;
+ virtual TIPERROR SetPos(LONG lPos) = 0;
+
+ // Note: Release must be overridden by derived classes since
+ // there is no virtual destructor
+ virtual TIPERROR Release() = 0;
+
+protected:
+ ~STREAM(); // Included so clients can't use delete on a stream
+ STREAM(); // Included to avoid warning
+
+#ifdef STREAM_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+inline STREAM::~STREAM() {} // Included so clients can't use delete on a stream
+inline STREAM::STREAM() {} // Included to avoid warning
+
+
+/***
+*class SEEKSTREAM : Abstract class adding seek methods to STREAM
+*Purpose:
+* Derivative of STREAM class that adds seek methods.
+***********************************************************************/
+
+class SEEKSTREAM : public STREAM
+{
+public:
+// Inherited pure functions
+ virtual TIPERROR Read(VOID *buffer, ULONG cbsize) = 0;
+ virtual TIPERROR Write(const VOID *buffer, ULONG cbsize) = 0;
+ virtual TIPERROR SetPos(LONG lPos) = 0;
+ virtual TIPERROR GetPos(LONG *plPos) = 0;
+ virtual TIPERROR Release() = 0;
+
+// Introduced pure functions
+ virtual TIPERROR Seek(LONG lPosition) = 0; // lPosition always > 0.
+ virtual TIPERROR SeekFromEnd(LONG lPosition) = 0;// lPosition always > 0.
+ virtual TIPERROR SeekFromCur(LONG lPosition) = 0;// lPosition any value.
+
+#ifdef SEEKSTREAM_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+
+/***
+*Prototypes for byte swapping helpers
+*
+***********************************************************************/
+
+void SwapShortArray(void * pvArray, UINT cShorts);
+void SwapLongArray(void * pvArray, UINT cLongs);
+UINT SwapStruct(void * pvArray, SZ szFormat);
+void SwapStructArray(void * pvArray, UINT cStructs, SZ szFormat);
+
+
+
+/***
+*Read - read data from the stream.
+*Purpose:
+* These functions read data from the stream. Either a byte, word,
+* long, or user-specified amount of data.
+*
+*Exit:
+* Returns number of bytes written, which is always the
+* same as the numberof bytes requested.
+*
+***********************************************************************/
+
+
+
+inline TIPERROR STREAM::ReadChar(CHAR *pb)
+{
+ return ReadByte((BYTE *)pb);
+}
+
+inline TIPERROR STREAM::ReadShort(SHORT *ps)
+{
+ return ReadUShort((USHORT *)ps);
+}
+
+inline TIPERROR STREAM::ReadLong(LONG * pl)
+{
+ return ReadULong((ULONG *)pl);
+}
+
+
+/***
+*PUBLIC STREAM::Write - write data to the stream
+*Purpose:
+* These function write data to the stream. Bytes, words, longs,
+* or any length of data can be written.
+*
+*Exit:
+* Returns number of bytes written, which is always the number of
+* bytes requested.
+*
+***********************************************************************/
+
+inline TIPERROR STREAM::WriteChar(CHAR b)
+{
+ return WriteByte((BYTE)b);
+}
+
+inline TIPERROR STREAM::WriteShort(SHORT s)
+{
+ return WriteUShort((USHORT)s);
+}
+
+inline TIPERROR STREAM::WriteLong(LONG l)
+{
+ return WriteULong((ULONG)l);
+}
+
+
+#endif // !STREAM_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/switches.hxx b/private/oleauto/src/typelib/switches.hxx
new file mode 100644
index 000000000..144321685
--- /dev/null
+++ b/private/oleauto/src/typelib/switches.hxx
@@ -0,0 +1,457 @@
+/***
+*switches.hxx - Compile switches for Silver
+*
+* Copyright (C) 1990, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains all the conditional compilation switches used
+* by Silver. For making version-specific changes, see version.hxx.
+*
+*Revision History:
+*
+* 24-Aug-90 petergo: Created
+* 10-May-91 ilanc: add ID_TEST
+* 14-Jun-91 petergo: Added Kanji/Unicode switches
+* 06-Mar-92 tomc: Added several switches, generate switches.inc
+* 10-Dec-92 ilanc: Added EI_OB and EI_OLE2.
+* 25-Jan-93 jeffrob: Corrected WIN32 HP_I386 and added OE_WIN32MT
+* 12-Mar-93 kazusy: Added BLD_FEVER switch
+* 05-May-93 jeffrob: Added ID_PROFILE
+* 04-Oct-93 w-marioc Added support for MIPS
+* 02-Jan-94 gburns: Added EI_VBARUN.
+*
+*****************************************************************************/
+
+#ifndef SWITCHES_HXX_INCLUDED
+#define SWITCHES_HXX_INCLUDED
+
+#include "ebvers.h"
+#include "version.hxx"
+
+// Need to define some constants to 0 that weren't defined or
+// mrc will choke on them:
+#ifndef BLD_WIN16
+#define BLD_WIN16 0
+#endif
+
+#ifndef BLD_WIN32
+#define BLD_WIN32 0
+#endif
+
+#ifndef BLD_WLM
+#define BLD_WLM 0
+#endif
+
+#ifndef BLD_MAC
+#define BLD_MAC 0
+#endif
+
+#ifndef BLD_FEVER
+#define BLD_FEVER 0
+#endif
+
+#ifndef HE_WIN32
+#define HE_WIN32 0 // [jwc] undone: Right now, mac os/2 toolset & NT toolset have
+#endif // differences that require source changes. This allows
+ // coexistance of both builds
+
+// Unlike ID_PROFILE, BLD_PROFILE indicates that the build was built with
+// profiling stubs (-Gh cl68 & c8/32) to collecting timing information.
+// Currently, this must be set by hand either in a special version.hxx or on the
+// compile line.
+#ifndef BLD_PROFILE
+#define BLD_PROFILE 0
+#endif
+
+
+// ID_TEST - This is used to surround test code that will not be
+// part of the released build. This is assumed to be equal ID_DEBUG.
+// However, in the test build (twinc7), ID_TEST is turned on, but ID_DEBUG
+// is off.
+//
+#ifndef ID_TEST
+ #define ID_TEST ID_DEBUG
+#endif
+
+
+// ID_PROFILE - This is used to surround test code that collects profiling
+// data. Currently, it is defined to equal ID_DEBUG but could be turned
+// on in the release build, if desired.
+//
+#ifndef ID_PROFILE
+ #define ID_PROFILE ID_DEBUG
+#endif
+
+
+// ID_SWAPTUNE - This is used to surround code that collects segment swapping info.
+// Currently, it is always set off, and must be set on by hand. This need
+// not be tied to either debug or release builds, so assume that code under
+// this switch could be turned on for either.
+#ifndef ID_SWAPTUNE
+ #define ID_SWAPTUNE 0
+#endif
+
+
+// HC switches: relate to the Host Compiler or Compiler version
+// Use this to accomodate syntactic differences between compilers
+//
+#if defined (_MSC_VER)
+#if (_MSC_VER >= 800)
+#define HC_MSC8
+
+// Both these are versions of C8 or C9
+#ifdef _M_M68K
+#define HC_MSC68K
+#elif defined (_M_MPPC)
+#define HC_MSCPPC
+#else
+// REVIEW: Probably need to check for C8/32 vs. C8/16
+#define HC_MSC832
+#endif
+
+#else
+#if (_MSC_VER == 700)
+#define HC_MSC7
+#else
+#define HC_MSC6
+#endif
+#endif
+
+#else
+// UNDONE OA95: rc uses a c-preprocessor that doesn't define _MSC_VER...
+// need to figure out what to do here.
+//#error Unsupported Compiler!
+#endif
+
+
+
+//OE switches: relate to the Operating Environment, or
+//API set used by the program
+
+// If TRUE, OE_WIN indicates we are using one of the variant of the
+// Windows API sets. This is set for all of our released versions,
+// except the native Mac build.
+// It not set only for the OS/2 internal build, or for the DOS tools build.
+// It is set for the Mac WLM build (provided for WLM clients).
+//
+
+#if BLD_WIN16 || BLD_WIN32 || BLD_WLM
+#define OE_WIN 1
+#else
+#define OE_WIN 0
+#define OE_WIN16 0
+#define OE_WIN32 0
+#define OE_WLM 0
+#define OE_WIN32S 0
+#define OE_WIN32F 0
+#define OE_NT 0
+#endif
+
+
+//If OE_WIN is set, exactly one of the following 3 switches is set,
+//indicate which variant of the Windows API is being used.
+
+#if OE_WIN
+
+#if BLD_WLM
+ #define OE_WLM 1
+ //Indicates we are running the Windows Library for the Mac.
+ //This should only be used for those few cases that depend on
+ //differences in function signatures between WLM.H and WINDOWS.H.
+#else
+ #define OE_WLM 0
+#endif
+
+#if BLD_WIN16
+ #define OE_WIN16 1
+ //Indicates we are using the Windows 3.0/3.1 API set. Should
+ //be used when using features specific to Windows 3.0/3.1. You
+ //can assume protected mode only with this switch; we never have
+ //and never will support Real mode Windows.
+#else
+ #define OE_WIN16 0
+#endif
+
+#if BLD_WIN32
+ #define OE_WIN32 1
+ //Indicates we are using the Win32 API set, on either NT or
+ //DOS. On for both Win32/NT, Win32/DOS, and Win32S.
+#else
+ #define OE_WIN32 0
+#endif
+
+#endif
+
+// If OE_WIN32 is set, the following switches indicate which subvariant
+// of the Win32 API is being used. These should be rarely needed,
+// if at all. NOTE: currently there are no builds which turns these
+// on.
+
+#if OE_WIN32
+ #define OE_WIN32S 0
+ //Indicates we are using the Win32S API subset.
+
+ #define OE_WIN32F 0
+ //Indicates we are using the full Win32 API, under either
+ //DOS or NT. Should be used to control use of APIs
+ //not in the Win32S subset.
+
+ #define OE_NT 0
+ //Indicates we are running under NT, as opposed to Win32/DOS.
+ //Should be used only to control NT specific features, like
+ //calling an NT API directly.
+
+ #define OE_WIN32MT 0
+ //Indicates we support multiple WIN32 threads within a single
+ //process. (Version 1.0 of OB only supports one thread so
+ //we've optimized some code paths with this in mind.)
+
+#endif
+
+// OE_RISC is used to specify if the portable engine code is to be used
+// instead of the intel specific assembly
+#ifndef OE_RISC
+ #define OE_RISC 0
+#endif
+
+//OS/2 is no longer a target in any of the builds.
+#define OE_OS2 0
+
+
+// OE_MAC indicates that we are targetting the Macintosh. This
+// is set for both the WLM build and the native Mac build.
+#if BLD_WLM || BLD_MAC
+#define OE_MAC 1
+#else
+#define OE_MAC 0
+#endif
+
+#if OE_MAC
+
+ // OE_MACAPI indicates that we are using the MacIntosh API. This is
+ // set whenever we are targetting the Mac and we aren't using WLM.
+ //
+#if BLD_MAC
+ #define OE_MACAPI 1
+#else
+ #define OE_MACAPI 0
+#endif
+
+ // Macintosh PowerPC environment is slightly different than the 68k
+ // environment. You should use this switch to control differences rather
+ // than HP_POWERPC because they are operating environment differences, not
+ // true hardware differences (unless, you're talking about asm or something)
+ // Besides, there may even be an NT on PowerPC, and then use of HP_POWERPC
+ // would be a big mistake.
+ //
+ // This indicates MAC API and PowerPC runtime environment
+#if defined (HC_MSCPPC)
+ #define OE_MACPPC 1
+ #define OE_MAC68K 0
+#else
+ #define OE_MACPPC 0
+ #define OE_MAC68K 1
+#endif
+
+#else
+ #define OE_MACAPI 0
+ #define OE_MAC68K 0
+ #define OE_MACPPC 0
+ #define ID_SWAPPABLE 0
+#endif
+
+
+// OE_DLL: True for versions in which Object Basic code is linked into a DLL.
+// When TRUE, host routines are in a separate DLL or EXE. For now,
+// this is only TRUE for Windows versions, but future Macintosh
+// versions will likely have this set TRUE.
+//
+#if (BLD_WIN16 || BLD_WIN32 || defined (OE_DLL)) && !defined (VBARUNBLD)
+ #define OE_DLL 1
+#else
+ #define OE_DLL 0
+#endif
+
+#if OE_MAC && !OE_MACPPC
+// all mac versions are swappable now
+ #define ID_SWAPPABLE 1
+#endif //OE_MAC
+
+// DOS build. (Probably should be called OE_DOS, but isn't.)
+// There is no dos build. This is always off.
+#define OE_REALMODE 0
+
+//HP switches: relate to the Hardware Processor.
+// The hardware switches indicate what kind of processor we are running
+// on. These switches should be used when you need to do specific thing
+// depending on the hardware you are running on.
+//
+// Switches that indicate general characteristic of the processor
+//(16bit/32bit, etc).
+// HP switches are for Hardware Processor. If possible, do not use
+// the specific processor type switches, but instead use the following
+// switches pertaining to various characteristic of the processors.
+// This makes porting to a new processor easier.
+//
+// HP_16BIT = Using a 16-bit register processor
+// HP_32BIT = Using a 32-bit register processor
+// HP_BIGENDIAN = Using a big-endian machine
+// least significant byte of a word is
+// at the highest byte address.
+// HP_MUSTALIGN = Must load/store objects from natural alignments.
+// indicates that 2byte words must be read/written
+// from a two byte boundary, 4byte words must be
+// read/written from a 4 byte boundary, 8 byte word
+// must be read/written from an 8 byte boundary.
+
+#if BLD_WIN16
+ #define HP_16BIT 1
+#else
+ #define HP_16BIT 0
+#endif
+
+#if BLD_WIN32 || BLD_MAC || BLD_WLM
+ #define HP_32BIT 1
+#else
+ #define HP_32BIT 0
+#endif
+
+#if BLD_MAC || BLD_WLM
+ #define HP_BIGENDIAN 1
+#else
+ #define HP_BIGENDIAN 0
+#endif
+
+#if BLD_MAC || BLD_WLM
+ #define HP_MUSTALIGN 0
+#endif
+
+// Switches that indicate the exact chip family:
+// (It is preferable to use the above switches since they are more
+// general than the following switches.)
+//
+// HP_I286 = Intel 286 AND ABOVE, running in 16 bit mode
+// --- -----
+// HP_I386 = Intel 386 and above, running in 32 bit mode
+// HP_M68000 = Motorola 680x0
+// HP_R4000 MIPS = R4000
+// HP_ALPHA = DEC/AXP
+// HP_SPARC = SPARC
+//
+
+#if BLD_WIN16
+#define HP_I286 1
+#else
+#define HP_I286 0
+#endif
+
+#if BLD_WIN32
+
+#ifdef _M_MRX000
+#define HP_ALPHA 0
+#define HP_R4000 1
+#define HP_I386 0
+#else
+#ifdef _M_ALPHA
+#define HP_ALPHA 1
+#define HP_R4000 0
+#define HP_I386 0
+#else
+#define HP_ALPHA 0
+#define HP_R4000 0
+#define HP_I386 1
+#endif // _M_ALPHA_
+#endif // _M_MRX000
+
+#else
+#define HP_ALPHA 0
+#define HP_R4000 0
+#define HP_I386 0
+#endif // BLD_WIN32
+
+#if BLD_MAC || BLD_WLM
+#ifdef _M_MPPC
+#define HP_POWERPC 1
+#define HP_M68000 0
+#else
+#define HP_POWERPC 0
+#define HP_M68000 1
+#endif
+
+#else
+#define HP_POWERPC 0
+#define HP_M68000 0
+#endif
+
+#define HP_SPARC 0
+
+// The following switches distinguish between an OB specific build,
+// a build of a run-time only version of OB, and an OLE2 "generic" build.
+//
+#undef EI_OB
+#undef EI_OLE
+#undef EI_VBARUN
+
+#define EI_VBA 1 // This differentiates between VBA and hosts which
+ // may use VBA header files.
+
+// Runtime switches:
+#ifdef OLEBLD
+ #define EI_OB 0
+ #define EI_OLE 1
+ #define EI_VBARUN 0
+ #define EI_VBARUN_VB 0
+#else
+ #define EI_OLE 0
+ #define EI_OB 1
+#if defined (VBARUNBLD)
+ // Build VB version of runtime.
+ #define EI_VBARUN 1
+ #define EI_VBARUN_VB 1
+#else
+ // Build IDE.
+ #define EI_VBARUN 0
+ #define EI_VBARUN_VB 0
+#endif
+#endif
+
+
+// Base processor alignment values.
+// HP_ALIGNMENT is used is the sheapmgr to align data. Currently non-risc
+// set to 1.
+// HP_ALIGNMENT_MAX is used by OB in conjunction with the g_rgcbAlignment table
+// (in clutil.cxx) as a 'capping' value - used by typelib when laying out
+// a typeinfo.
+//
+#if OE_RISC
+#if HP_R4000 || HP_POWERPC || HP_ALPHA
+#define HP_ALIGNMENT 8
+#define HP_ALIGNMENT_MAX 8
+#elif HP_I386
+#define HP_ALIGNMENT 4
+#define HP_ALIGNMENT_MAX 4
+#else
+#error !Unsupported Platform -- [Add Processor Alignment Value here.]
+#endif
+
+#else // !OE_RISC
+#define HP_ALIGNMENT 1
+
+#if HP_I286
+#define HP_ALIGNMENT_MAX 1
+#elif HP_M68000
+#define HP_ALIGNMENT_MAX 2
+#elif HP_I386
+#define HP_ALIGNMENT_MAX 4
+#else
+#error !Unsupported Platform
+#endif
+
+#endif // !OE_RISC
+
+
+// Switches for code system.
+#define FV_UNICODE 0 // No unicode char set
+
+#endif // !SWITCHES_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/sysutils.h b/private/oleauto/src/typelib/sysutils.h
new file mode 100644
index 000000000..16e3e83fa
--- /dev/null
+++ b/private/oleauto/src/typelib/sysutils.h
@@ -0,0 +1,13 @@
+/*==========================================================================*
+ | Copyright: (c) 1992, 1993 Microsoft Corporation, all rights reserved.
+ | Information Contained Herin is Proprietary and Confidential.
+ *==========================================================================*/
+
+#ifndef _SYSUTILS
+#define _SYSUTILS
+
+#if OE_MAC
+ #define MacEnvHasAliasMgr() 1
+#endif //OE_MAC
+
+#endif // _SYSUTILS
diff --git a/private/oleauto/src/typelib/tdata.hxx b/private/oleauto/src/typelib/tdata.hxx
new file mode 100644
index 000000000..e0e3c7df8
--- /dev/null
+++ b/private/oleauto/src/typelib/tdata.hxx
@@ -0,0 +1,1372 @@
+/***
+*tdata.hxx - TYPE_DATA header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This class maintains listheads to threaded DEFNs for member
+* definitions. Has private instance of BLK_MGR to manage
+* block of DEFNs.
+* List tails are also maintained since when members are always
+* added to the *end* of each list (aka appended).
+*
+*Revision History:
+*
+* 24-Feb-91 ilanc: Created.
+* [01] 04-Mar-91 ilanc: Added HTYPE_DEFN
+* [02] 10-Mar-91 ilanc: Added bit to VAR_DEFN::varkind (for locals/formals).
+* [03] 15-Mar-91 ilanc: FUNC_TYPE_DEFN tag --> ftdefn
+* [04] 23-Jan-92 davebra: added EXMGR_FUNCDEFN member to FUNC_DEFN
+* [05] 31-Jan-92 stevenl: reorganized DEFN hierarchy, modified DEFN structs
+* [06] 28-Feb-92 ilanc: added public Pdtroot() method:
+* Clients can get at containing TYPEINFO
+* by going: TYPE_DATA::Pdtroot()->Pgdtinfo()
+* [07] 03-Mar-92 ilanc: added list count members and accessor meths.
+* [08] 10-Mar-92 davebra: added friend EXMGR::AllocVarDefn to TYPE_DATA
+* [09] 18-Mar-92 ilanc: fixed release def of DebShowFuncDefn.
+* [10] 19-Mar-92 ilanc: Modified BIND_DESC (1-1 mapping to members now).
+* [11] 03-Apr-92 ilanc: GetAdded VardesckindOfHvdefn, VAR_DEFN::Ptdefn()
+* [12] 05-Apr-92 martinc: Moved the definition of TYPE_DEFN::IsArray();
+* named the formerly anonymos struct in BIND_DESC to m_varaccess
+* [13] 12-Apr-92 ilanc: TYPE_DATA::DebCheckState decl and def.
+* [14] 24-Apr-92 ilanc: Added masses of struct inline accessor meths.
+* [15] 29-Apr-92 ilanc: Added HfdefnOfHmember().
+* [16] 30-Apr-92 stevenl: Changed DEFN initializers.
+* [17] 05-May-92 stevenl: Changed DEFN initializers again.
+* [18] 14-May-92 w-peterh: moved defns to defn.hxx
+* [19] 28-May-92 stevenl: Changed friend declarations in TDATA defn.
+* [20] 18-Jun-92 w-peterh: added RecTypeDefn list
+* [21] 02-Jul-92 w-peterh: merged data member/type lists
+* [22] 18-Jan-93 w-peterh: use TIPERROR instead of SCODE
+* 02-Feb-93 w-peterh: added IndexOfFuncName
+* 12-Feb-93 w-peterh: added m_htdefnAlias, ImpleType, RefType funcs
+* 23-Feb-93 rajivk : Support for Predeclared Identifier
+* 17-Mar-93 w-jeffc: added TYPE_DATA Lock & Unlock
+* 30-Apr-93 w-jeffc: made DEFN data members private; added Swap*defn functions
+*
+*Implementation Notes:
+* A DEFN is the struct used for the internal storage of an INFO
+* The DEFN hierarchy more or less mirrors the MEMBERINFO hierarchy:
+*
+* DEFN
+* |
+* ---------------------------
+* | |
+* VAR_DEFN MEMBER_DEFN |
+* | | | |
+* ----------| | -------------
+* | ----------- |
+* | | FUNC_DEFN
+* PARAM_DEFN MBR_VAR_DEFN |
+* VIRTUAL_FUNC_DEFN
+*
+* A DEFN really only has a single link field (to simplify
+* list manipulation) and an hlnam field.
+*
+* All of the DEFN structs (except MEMBER_DEFN) inherit from the
+* DEFN struct. In addition, those structs that represent object
+* members (i.e. MBR_VAR_DEFN, FUNC_DEFN, and VIRTUAL_FUNC_DEFN)
+* also inherit from MEMBER_DEFN. VAR_DEFN and PARAM_DEFN only
+* inherit from DEFN.
+*
+* This design allows us to share the commonalities between locals,
+* params and data members (member variables) and in addition, treat
+* params like locals (where appropriate).
+*
+*****************************************************************************/
+
+#ifndef TDATA_HXX_INCLUDED
+#define TDATA_HXX_INCLUDED
+
+#include "clutil.hxx"
+#include "defn.hxx" // also includes rtarray.h, exstruct.hxx, cltypes.hxx
+
+#include "blkmgr.hxx"
+
+#include "dstrmgr.hxx"
+
+
+class IMPMGR;
+class NAMMGR;
+class DYN_TYPEROOT; // #include "dtinfo.hxx"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szTDATA_HXX)
+#define SZ_FILE_NAME g_szTDATA_HXX
+#endif
+
+// Definitions for structs used by DYN_TYPEBIND implementation.
+//
+enum BIND_KIND {
+ BKIND_Error, // look at returned TIPERROR for more info.
+ BKIND_NoMatch,
+ BKIND_OneVarMatch, // matched variable
+ BKIND_FuncMatch, // matche function
+ BKIND_DynTypeBindMatch, // matched module/class
+ BKIND_ProjTypeBindMatch, // matched project
+ BKIND_NestedTypeBindMatch, // matched nested type
+ BKIND_WrongArity, // UNUSED: Matched but wrong arity.
+ BKIND_TypeInfoMatch, // matched type: only typeinfo valid,
+ // no typebind.
+ BKIND_ImplicitAppobjMatch, // Matched an implicit appobj -- i.e.
+ // one that wasn't actually mentioned
+ // in the program text. Client
+ // should treat it like a OneVarMatch
+ // and extract the typebind from
+ // the VAR_DEFN and rebind.
+};
+
+TIPERROR EquivTypeDefnsIgnoreByRef(TYPE_DATA *ptdata1,
+ BOOL fSimple1,
+ sHTYPE_DEFN htdefn1,
+ TYPE_DATA *ptdata2,
+ BOOL fSimple2,
+ sHTYPE_DEFN htdefn2,
+ WORD wFlags,
+ BOOL *pfEqual,
+ BOOL fIgnoreByRef);
+
+BOOL IsTypeBasicIntrinsic(TYPEDESCKIND tdesckind);
+
+#define ARITY_Unknown ~(USHORT)0
+
+
+/***
+*class TYPE_DATA - 'tdata': Type descriptor class.
+*Purpose:
+* The class implements TYPE_DATA
+*
+***********************************************************************/
+
+class TYPE_DATA
+{
+ friend class DYN_TYPEMEMBERS;
+
+
+public:
+ nonvirt TIPERROR Init(SHEAP_MGR *psheapmgr, DYN_TYPEROOT *pdtroot);
+
+#if ID_TEST
+ // Only used in test code.
+ nonvirt VOID Release();
+#endif // ID_TEST
+
+ ~TYPE_DATA();
+ TYPE_DATA();
+
+ nonvirt SHEAP_MGR *Psheapmgr() const;
+
+ nonvirt VOID Compact();
+ nonvirt UINT CMeth() const;
+ nonvirt UINT CDataMember() const;
+ nonvirt UINT CBase() const;
+ nonvirt UINT CNestedType() const;
+
+ nonvirt UINT CAvailMeth() const;
+ nonvirt HFUNC_DEFN HfdefnFirstMeth() const;
+ nonvirt HFUNC_DEFN HfdefnFirstAvailMeth();
+ nonvirt HFUNC_DEFN HfdefnNextAvailMeth(HFUNC_DEFN hfdefn) const;
+
+ nonvirt HDEFN HdefnFirstDataMbrNestedType() const;
+ nonvirt HVAR_DEFN HvdefnFirstBase() const;
+ nonvirt HTYPE_DEFN HtdefnAlias() const;
+ nonvirt BOOL IsSimpleTypeAlias() const;
+ nonvirt VOID SetIsSimpleTypeAlias(BOOL isSimpleType);
+ nonvirt UINT SizeOfTypeDefn(HTYPE_DEFN htdefn) const;
+
+ // Locking functions
+ nonvirt inline VOID Lock() { m_blkmgr.Lock(); }
+ nonvirt inline VOID Unlock() { m_blkmgr.Unlock(); }
+
+ // DESC Functions
+ nonvirt TIPERROR GetFuncDesc(UINT index, FUNCDESC **ppfuncdesc);
+ nonvirt TIPERROR AddFuncDesc(UINT index,
+ FUNCDESC *pfuncdesc,
+ HFUNC_DEFN *phfdefn = NULL);
+
+ nonvirt TIPERROR GetVarDesc(UINT index, VARDESCA **ppvardesc);
+ nonvirt TIPERROR AllocTypeDefnOfTypeDesc(TYPEDESC *ptdesc,
+ UINT cb,
+ sHTYPE_DEFN *phtdefn,
+ BOOL fAllowCoClass,
+ BOOL * pfIsSimpleType);
+ nonvirt TIPERROR AllocTypeDescOfTypeDefn(HTYPE_DEFN htdefn,
+ BOOL isSimpleType,
+ TYPEDESC *ptdesc);
+ nonvirt TIPERROR AddVarDesc(UINT index,
+ VARDESCA *pvardesc,
+ HVAR_DEFN *phvdefn = NULL);
+ nonvirt TIPERROR GetVarDescOfHvdefn(HVAR_DEFN hvdefn,
+ VARDESCA **ppvardesc);
+ nonvirt TIPERROR GetFuncDescOfHfdefn(HFUNC_DEFN hfdefn,
+ FUNCDESC **ppfuncdesc);
+
+ nonvirt TIPERROR SetTypeDefnAlias(TYPEDESC *ptdesc);
+ nonvirt TIPERROR AddImplType(UINT index, HREFTYPE hreftype);
+ nonvirt TIPERROR GetRefTypeOfImplType(UINT index, HREFTYPE *phreftype);
+ nonvirt TIPERROR SetImplTypeFlags(UINT index, INT impltypeflags);
+ nonvirt TIPERROR GetImplTypeFlags(UINT index, INT *pimpltypeflags);
+
+ nonvirt TIPERROR GetNames(MEMBERID memid,
+ BSTR *rgbstrNames,
+ UINT cNameMax,
+ UINT *pcName);
+ nonvirt TIPERROR SetDllEntryDefn(UINT index, HDLLENTRY_DEFN hdllentrydefn);
+ nonvirt TIPERROR GetDllEntryDefn(UINT index, HDLLENTRY_DEFN *phdllentrydefn);
+ nonvirt TIPERROR SetFuncAndParamNames(UINT index,
+ LPOLESTR *rgszNames,
+ UINT cNames);
+ nonvirt TIPERROR SetFuncAndParamNamesOfHfdefn(HFUNC_DEFN hfdefn,
+ LPOLESTR *rgszNames,
+ UINT cNames);
+ nonvirt TIPERROR SetVarName(UINT index, LPSTR szName);
+ nonvirt HFUNC_DEFN GetFuncDefnForDoc(UINT index);
+ nonvirt TIPERROR SetFuncDocString(UINT index, LPSTR szDocString);
+ nonvirt TIPERROR SetVarDocString(UINT index, LPSTR szDocString);
+ nonvirt TIPERROR SetFuncHelpContext(UINT index, DWORD dwHelpContext);
+ nonvirt TIPERROR SetVarHelpContext(UINT index, DWORD dwHelpContext);
+ nonvirt TIPERROR GetDocumentation(MEMBERID memid,
+ BSTR FAR*lpbstrName,
+ BSTR FAR*lpbstrDocString,
+ DWORD FAR*lpdwHelpContext);
+ nonvirt TIPERROR GetDocumentationOfFuncName(LPOLESTR szFuncName,
+ BSTR FAR *lpbstrDocString,
+ DWORD FAR *lpdwHelpContext,
+ UINT *puIndex);
+
+ nonvirt TIPERROR UpdateDocStrings();
+ nonvirt PARAM_DEFN *QparamdefnOfIndex(HPARAM_DEFN hparamdefn, UINT i) const;
+ nonvirt VOID RemMbrVarDefn(HMBR_VAR_DEFN hmvdefn);
+ nonvirt VOID RemFuncDefn(HFUNC_DEFN hfdefn);
+ nonvirt VOID RemParamDefn(HPARAM_DEFN hparamdefn,
+ sHDEFN *phdefnFirst,
+ sHDEFN *phdefnLast);
+ nonvirt VOID RemRecTypeDefn(HRECTYPE_DEFN hrtdefn);
+ nonvirt DEFN *QdefnOfHdefn(HDEFN hdefn, UINT oChunk=0) const;
+ nonvirt VAR_DEFN *QvdefnOfHvdefn(HVAR_DEFN hvdefn, UINT oChunk=0) const;
+ nonvirt PARAM_DEFN *QparamdefnOfHparamdefn(HPARAM_DEFN hparamdefn, UINT oChunk=0) const;
+ nonvirt FUNC_DEFN *QfdefnOfHfdefn(HFUNC_DEFN hfdefn, UINT oChunk=0) const;
+ nonvirt VIRTUAL_FUNC_DEFN *QvfdefnOfHvfdefn(HVIRTUAL_FUNC_DEFN hfdefn, UINT oChunk=0) const;
+ nonvirt MBR_VAR_DEFN *QmvdefnOfHmvdefn(HMBR_VAR_DEFN hmvdefn, UINT oChunk=0) const;
+ nonvirt MEMBER_DEFN *QmdefnOfHmdefn(HMEMBER_DEFN hmdefn, UINT oChunk=0) const;
+ nonvirt TYPE_DEFN *QtdefnOfHtdefn(HTYPE_DEFN htdefn, UINT oChunk=0) const;
+ nonvirt RECTYPE_DEFN *QrtdefnOfHrtdefn(HRECTYPE_DEFN hrtdefn, UINT oChunk=0) const;
+ nonvirt FUNC_TYPE_DEFN *QftdefnOfHftdefn(HFUNC_TYPE_DEFN hftdefn,
+ UINT oChunk=0) const;
+
+ nonvirt BOOL HasOrdinalOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt HLNAM DllNameOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt USHORT DllOrdinalOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt HLNAM DllEntryOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt TIPERROR AllocDllentrydefnByName(HLNAM hlnamDllModule,
+ LPSTR szEntryName,
+ HDLLENTRY_DEFN *phdllentrydefn);
+ nonvirt TIPERROR AllocDllentrydefnByOrdinal(HLNAM hlnamDllModule,
+ USHORT ordinal,
+ HDLLENTRY_DEFN *phdllentrydefn);
+ nonvirt VOID ReleaseDllentrydefn(HDLLENTRY_DEFN hdllentrydefn);
+ nonvirt DLLENTRY_DEFN *QdllentrydefnOfHdllentrydefn(HDLLENTRY_DEFN hdllentrydefn) const;
+
+ nonvirt SAFEARRAYA *QarraydescOfHarraydesc(HARRAY_DESC, UINT oChunk=0) const;
+ nonvirt TYPE_DEFN *QtdefnOfHvdefn(HVAR_DEFN hvdefn, UINT oChunk=0) const;
+ nonvirt TYPE_DEFN *QtdefnResultOfHfdefn(HFUNC_DEFN hfdefn, UINT oChunk=0) const;
+ nonvirt TYPE_DEFN *QtdefnResultOfHfdefnUnmunged(HFUNC_DEFN hfdefn, UINT oChunk=0) const;
+ nonvirt TIPERROR StringOfHchunk(HCHUNK hchunkStr, BSTRA *plstr);
+ nonvirt ULONG LengthOfHchunk(HCHUNK hchunk);
+ nonvirt BYTE *QtrOfHandle(HCHUNK hchunk);
+ nonvirt IMPMGR *Pimpmgr() const;
+ nonvirt NAMMGR *Pnammgr() const;
+ nonvirt DYN_TYPEROOT *Pdtroot() const;
+ nonvirt TIPERROR Read(STREAM *pstrm);
+ nonvirt TIPERROR Write(STREAM *pstrm);
+ nonvirt VOID Free();
+ nonvirt TIPERROR GetVardesckindOfHvdefn(VARDESCKIND *pvdesckind,
+ HVAR_DEFN hvdefn);
+ nonvirt TIPERROR GetBvkindOfHimptype(HIMPTYPE himptype,
+ BASICVARKIND *pbasicvkind);
+ nonvirt HDEFN HdefnOfHmember(HMEMBER hmember,
+ UINT *pdefnkind);
+ nonvirt HFUNC_DEFN HfdefnOfHmember(HMEMBER hmember,
+ UINT fInvokekind = (UINT)(INVOKE_FUNC |
+ INVOKE_PROPERTYGET |
+ INVOKE_PROPERTYPUT |
+ INVOKE_PROPERTYPUTREF)) const;
+
+
+ nonvirt HVAR_DEFN HvdefnPredeclared() const;
+ nonvirt VOID SetHvdefnPredeclared(HVAR_DEFN hvdefnPredeclared);
+ nonvirt LONG GetSize();
+ nonvirt VOID FreeAllDefns();
+ nonvirt UINT MapTypeDefn(HTYPE_DEFN htdefn); // used by BTSRC::Compact
+
+ HVAR_DEFN HvdefnOfHlnam(HLNAM hlnam);
+ HFUNC_DEFN HfdefnFirstOfHlnam(HLNAM hlnam,INVOKEKIND *pinvokekind);
+ HFUNC_DEFN HfdefnNextOfHlnam(HLNAM hlnam, HFUNC_DEFN hfdefn,INVOKEKIND *pinvokekind);
+
+ nonvirt HMBR_VAR_DEFN HmvdefnOfHmember(HMEMBER hmember) const;
+ TIPERROR HfdefnOfIndex(UINT index, HFUNC_DEFN *phfdefn);
+
+ TIPERROR GetDynTypeBindOfHvdefn(HVAR_DEFN hvardefn,
+ DYN_TYPEBIND ** ppdtbind,
+ HIMPTYPE * phimptype);
+ TIPERROR GetTypeInfoOfHvdefn(HVAR_DEFN hvdefn,
+ ITypeInfoA **pptinfo,
+ HIMPTYPE *phimptype);
+ TIPERROR AllocVardefnPredeclared();
+
+ ULONG UHelpContextOfEncoding(WORD wHelpContext);
+ TIPERROR GetEncodedHelpContext(ULONG uHelpContext, WORD *pwHelpContext);
+
+ UINT SizeofConstVal(VAR_DEFN *qvdefn, HCHUNK hchunkConstVal);
+
+ VOID FreeArrayDescriptor(HARRAY_DESC harraydesc);
+ VOID FreeTypeDefn(HTYPE_DEFN htdefn);
+ VOID FreeTypeDefnResources(HTYPE_DEFN htdefn);
+ VOID FreeVarDefn(HVAR_DEFN hvdefn);
+ VOID FreeMbrVarDefn(HMBR_VAR_DEFN hmvdefn);
+ VOID FreeFuncDefn(HFUNC_DEFN hfdefn);
+ VOID FreeRecTypeDefn(HRECTYPE_DEFN hrtdefn);
+ VOID FreeParamDefn(HPARAM_DEFN hparamdefn);
+ nonvirt VOID FreeChunk(HCHUNK hchunk, UINT cbSizeChunk);
+
+#if HP_BIGENDIAN
+ HVAR_DEFN SwapVarDefnOfHvdefn(HVAR_DEFN hvdefn, BOOL fSwapFirst);
+ HFUNC_DEFN SwapFuncDefnOfHfdefn(HFUNC_DEFN hfdefn, BOOL fSwapFirst);
+ VOID SwapTypeDefnOfHtdefn(HTYPE_DEFN htdefn, BOOL fSwapFirst);
+ HRECTYPE_DEFN SwapRectypeDefnOfHrtdefn(HRECTYPE_DEFN hrtdefn,
+ BOOL fSwapFirst,
+ BOOL fSwapVarDefns);
+ VOID SwapbmData(BOOL fSwapFirst);
+ VOID SwapAllFuncDefns(BOOL fSwapFirst);
+ VOID SwapTypeDefnOfQtdefn(TYPE_DEFN *qtdefn, BOOL fSwapFirst);
+#endif
+
+
+#if ID_DEBUG
+ nonvirt VOID DebShowDefn(HDEFN hdefn, BOOL fShowList);
+ nonvirt VOID DebShowVarDefn(sHVAR_DEFN hvdefn, BOOL fShowList);
+ nonvirt VOID DebShowParamDefn(sHPARAM_DEFN hparamdefn, BOOL fShowList);
+ nonvirt VOID DebShowFuncDefn(sHFUNC_DEFN hfdefn, BOOL fShowList);
+ nonvirt VOID DebShowRecTypeDefn(sHRECTYPE_DEFN hrtdefn, BOOL fShowList);
+ nonvirt VOID DebShowSimpleTypeDefn(TYPE_DEFN *ptdefn);
+ nonvirt VOID DebShowTypeDefn(TYPE_DEFN *ptdefn);
+ nonvirt VOID DebShowDefnList(HDEFN hdefnFirst, HDEFN hdefnLast, UINT uLevel);
+ nonvirt VOID DebShowMemberLists(UINT uLevel);
+ nonvirt VOID DebCheckState(UINT uLevel) const;
+ nonvirt VOID DebCheckDefn(HDEFN hdefn) const;
+ nonvirt VOID DebCheckVarDefn(HVAR_DEFN hvdefn) const;
+ nonvirt VOID DebCheckParamDefn(HPARAM_DEFN hparamdefn) const;
+ nonvirt VOID DebCheckMbrVarDefn(HMBR_VAR_DEFN hmvdefn) const;
+ nonvirt VOID DebCheckFuncDefn(HFUNC_DEFN hfdefn) const;
+ nonvirt VOID DebCheckVirtualFuncDefn(HVIRTUAL_FUNC_DEFN hvfdefn) const;
+ nonvirt VOID DebCheckDllentryDefn(HDLLENTRY_DEFN hdllentrydefn) const;
+ nonvirt VOID DebCheckRecTypeDefn(HRECTYPE_DEFN hrtdefn) const;
+ nonvirt VOID DebCheckFuncTypeDefn(FUNC_TYPE_DEFN ftdefn) const;
+#else
+ nonvirt inline VOID DebShowDefn(HDEFN hdefn, BOOL fShowList) {};
+ nonvirt inline VOID DebShowVarDefn(sHVAR_DEFN hvdefn, BOOL fShowList) {};
+ nonvirt inline VOID DebShowParamDefn(sHPARAM_DEFN hparamdefn, BOOL fShowList) {};
+ nonvirt inline VOID DebShowFuncDefn(sHFUNC_DEFN hfdefn, BOOL fShowList) {};
+ nonvirt inline VOID DebShowRecTypeDefn(sHRECTYPE_DEFN hrtdefn, BOOL fShowList) {};
+ nonvirt inline VOID DebShowSimpleTypeDefn(TYPE_DEFN *ptdefn) {};
+ nonvirt inline VOID DebShowTypeDefn(TYPE_DEFN *ptdefn) {};
+ nonvirt inline VOID DebShowDefnList(HDEFN hdefnFirst, HDEFN hdefnLast, UINT uLevel) {};
+ nonvirt inline VOID DebShowMemberLists(UINT uLevel) {};
+ nonvirt VOID DebCheckState(UINT) const {}
+ nonvirt VOID DebCheckDefn(HDEFN hdefn) const {}
+ nonvirt VOID DebCheckVarDefn(HVAR_DEFN hvdefn) const {}
+ nonvirt VOID DebCheckParamDefn(HPARAM_DEFN hparamdefn) const {}
+ nonvirt VOID DebCheckMbrVarDefn(HMBR_VAR_DEFN hmvdefn) const {}
+ nonvirt VOID DebCheckFuncDefn(HFUNC_DEFN hfdefn) const {}
+ nonvirt VOID DebCheckVirtualFuncDefn(HVIRTUAL_FUNC_DEFN hvfdefn) const {}
+ nonvirt VOID DebCheckDllentryDefn(HDLLENTRY_DEFN hdllentrydefn) const {}
+ nonvirt VOID DebCheckRecTypeDefn(HRECTYPE_DEFN hrtdefn) const {}
+ nonvirt VOID DebCheckFuncTypeDefn(FUNC_TYPE_DEFN ftdefn) const {}
+#endif
+
+private:
+
+ BLK_MGR m_blkmgr;
+ DYN_TYPEROOT *m_pdtroot;
+ USHORT m_cMeth; // elem count in respective lists
+ USHORT m_cAvailMeth;
+ USHORT m_cDataMember;
+ USHORT m_cBase;
+ USHORT m_cNestedType;
+ ULONG m_uHelpContextBase;
+
+ sHDEFN m_hdefnFirstMeth;
+ sHDEFN m_hdefnFirstDataMbrNestedType;
+ sHDEFN m_hdefnFirstBase;
+
+ sHDEFN m_hdefnLastMeth;
+ sHDEFN m_hdefnLastDataMbrNestedType;
+ sHDEFN m_hdefnLastBase;
+
+ USHORT m_isSimpleTypeAlias:1; // serialized
+ USHORT m_UNUSED:15;
+
+ // unserialized
+ UINT m_uOrdinalHfdefnLast; // ordinal of last fdefn they wanted
+ HFUNC_DEFN m_hfdefnLast;
+
+ UINT m_uOrdinalHvdefnLast; // ordinal of last vdefn they wanted
+ HVAR_DEFN m_hvdefnLast;
+
+ // this union is switched on the TKIND of the conatining typeinfo
+ // m_htdefnAlias is for TKIND_ALIAS
+ // m_hfdefnValue is for TKIND_INTERFACE
+ union {
+ sHTYPE_DEFN m_htdefnAlias; // for ITypeInfo::SetTypeDescAlias
+ sHFUNC_DEFN m_hfdefnValue; // for DISPID_VALUE
+ };
+
+ IMPMGR *m_pimpmgr; // cached import manager
+ NAMMGR *m_pnammgr; // cached name manager
+ // for the predeclared instance of the class
+ sHMBR_VAR_DEFN m_hmvdefnPredeclared;
+
+ // private methods
+ HFUNC_DEFN HfdefnValue();
+ UINT SizeTypeDefnOfTDescKind(UINT cTypes, TYPEDESCKIND *rgtdesckind) const;
+ TIPERROR HchunkOfString(LPSTR szStr, HCHUNK *phchunk);
+ TIPERROR HlnamOfName(LPSTR szStr, HLNAM *phlnam);
+ VOID AppendDefn(HDEFN hdefn, sHDEFN *phdefnFirst, sHDEFN *phdefnLast);
+ VOID AppendMbrVarDefn(HMBR_VAR_DEFN hmvdefn);
+ VOID AppendFuncDefn(HFUNC_DEFN hfdefn);
+ VOID AppendRecTypeDefn(HRECTYPE_DEFN hrtdefn);
+ HDEFN HdefnPrev(HDEFN hdefn, HDEFN hdefnFirst);
+ nonvirt HMBR_VAR_DEFN HmvdefnOfIndex(UINT index);
+
+ TIPERROR HdefnOfIndex(UINT index, HDEFN *phdefn);
+ VOID RemDefn(HDEFN hdefn,
+ sHDEFN *phdefnFirst,
+ sHDEFN *phdefnLast,
+ VOID (TYPE_DATA::*FreeDefn)(HDEFN));
+
+ // These are used by "friend" clients
+ nonvirt TIPERROR AllocVarDefn(sHVAR_DEFN *phvdefn);
+ nonvirt TIPERROR AllocFuncDefn(sHFUNC_DEFN *phfdefn, BOOL fV2Flags);
+ nonvirt TIPERROR AllocVirtualFuncDefn(sHVIRTUAL_FUNC_DEFN *phvfdefn,
+ BOOL fV2Flags);
+ nonvirt TIPERROR AllocMbrVarDefn(sHMBR_VAR_DEFN *phmvdefn
+ , BOOL fV2Flags);
+ nonvirt TIPERROR AllocTypeDefn(UINT cTypes,
+ TYPEDESCKIND rgtdesckind[],
+ sHTYPE_DEFN *phtdefn);
+ nonvirt TIPERROR AllocArrayDescriptor(UINT uNumDim, sHARRAY_DESC *pharraydesc);
+ nonvirt TIPERROR AllocRecTypeDefn(sHRECTYPE_DEFN *phrtdefn);
+ nonvirt TIPERROR AllocChunk(HCHUNK *phchunk, UINT cbSizeChunk);
+
+ nonvirt TIPERROR AllocConstValOfVariant(VARIANTA *pvariant,
+ HVAR_DEFN hvdefn);
+ nonvirt TIPERROR SetTypeDefnOfVarDefn(HVAR_DEFN hvdefn, TYPE_DEFN *ptdefn, UINT cbSizeDefn);
+ nonvirt TIPERROR CopyTypeDefn(HTYPE_DEFN htdefnDest, HTYPE_DEFN htdefnSrc, TYPE_DATA *ptdataSrc);
+ nonvirt TIPERROR CopyArrayDescriptor(HARRAY_DESC harraydescDest, HARRAY_DESC harraydescSrc, TYPE_DATA *ptdataSrc);
+ nonvirt TIPERROR CopyTypeDefnIntoVarDefn(HVAR_DEFN hvdefn, HTYPE_DEFN htdefn, BOOL isSimpleType, TYPE_DATA *ptdataSrc);
+ nonvirt VOID ChangeTypeDefnOfVarDefn(HVAR_DEFN hvdefn, TYPE_DEFN *ptdefn, UINT cbSizeDefn);
+ nonvirt TIPERROR SetTypeDefnResultOfFuncDefn(HFUNC_DEFN hfdefn,
+ TYPE_DEFN *ptdefn,
+ UINT cbSizeDefn);
+ nonvirt UINT UOrdinalHfdefnLast() const {
+ return m_uOrdinalHfdefnLast;
+ }
+ nonvirt UINT UOrdinalHvdefnLast() const {
+ return m_uOrdinalHvdefnLast;
+ }
+ nonvirt VOID SetUOrdinalHfdefnLast(UINT uOrdinalHfdefnLast) {
+ m_uOrdinalHfdefnLast = uOrdinalHfdefnLast;
+ }
+ nonvirt VOID SetUOrdinalHvdefnLast(UINT uOrdinalHvdefnLast) {
+ m_uOrdinalHvdefnLast = uOrdinalHvdefnLast;
+ }
+ nonvirt HFUNC_DEFN HfdefnLast() const {
+ return m_hfdefnLast;
+ }
+ nonvirt HVAR_DEFN HvdefnLast() const {
+ return m_hvdefnLast;
+ }
+ nonvirt VOID SetHfdefnLast(HFUNC_DEFN hfdefnLast) {
+ m_hfdefnLast = hfdefnLast;
+ }
+ nonvirt VOID SetHvdefnLast(HVAR_DEFN hvdefnLast) {
+ m_hvdefnLast = hvdefnLast;
+ }
+};
+
+// Equivalence functions
+
+#define FEQUIVIGNORE_NULL 0
+#define FEQUIVIGNORE_FuncKind 0x0001
+#define FEQUIVIGNORE_Cc 0x0002
+#define FEQUIVIGNORE_EquivTypes 0x0004
+#define FEQUIVIGNORE_VarKind 0x0008
+#define FEQUIVIGNORE_HasLcid 0x0010
+
+TIPERROR EquivFuncDefns(TYPE_DATA * ptdata1, HFUNC_DEFN hfdefn1,
+ TYPE_DATA * ptdata2, HFUNC_DEFN hfdefn2,
+ WORD wFlags, BOOL * fEqual, HDEFN *phdefnFail);
+TIPERROR EquivFuncDescFuncDefn(FUNCDESC *pfuncdesc, ITypeInfo *ptinfo,
+ TYPE_DATA *ptdata, HFUNC_DEFN hfdefn,
+ WORD wFlags, BOOL *fEqual, HDEFN *phdefnFail);
+
+TIPERROR EquivVarDefns(TYPE_DATA * ptdata1, HVAR_DEFN hvdefn1,
+ TYPE_DATA * ptdata2, HVAR_DEFN hvdefn2,
+ WORD wFlags, BOOL * fEqual);
+
+TIPERROR EquivVarDescVarDefn(VARDESC *pvardesc, ITypeInfo *ptinfo,
+ TYPE_DATA *ptdata, HVAR_DEFN hvdefn,
+ WORD wFlags, BOOL *fEqual);
+
+TIPERROR EquivFuncDescVarDefn(FUNCDESC *pfuncdesc, ITypeInfo *ptinfo,
+ TYPE_DATA *ptdata, HVAR_DEFN hvdefn,
+ WORD wFlags, BOOL *fEqual);
+
+TIPERROR EquivFuncTypeDefns(TYPE_DATA * ptdata1, FUNC_TYPE_DEFN * pftdefn1,
+ TYPE_DATA * ptdata2, FUNC_TYPE_DEFN * pftdefn2,
+ WORD wFlags, BOOL * fEqual, HDEFN *phdefnFail);
+
+TIPERROR EquivTypeDefns(TYPE_DATA * ptdata1, BOOL fSimple1, sHTYPE_DEFN htdefn1,
+ TYPE_DATA * ptdata2, BOOL fSimple2, sHTYPE_DEFN htdefn2,
+ WORD wFlags, BOOL * fEqual);
+
+
+// inline methods
+//
+
+inline TYPE_DATA::TYPE_DATA()
+{
+ m_pdtroot = NULL;
+ m_hdefnFirstMeth =
+ m_hdefnFirstDataMbrNestedType =
+ m_hdefnFirstBase =
+ m_hdefnLastMeth =
+ m_hdefnLastDataMbrNestedType =
+ m_hdefnLastBase = (sHDEFN)HDEFN_Nil;
+ m_htdefnAlias = (sHTYPE_DEFN) HTYPEDEFN_Nil;
+ m_pimpmgr = NULL;
+ m_pnammgr = NULL;
+ m_cMeth = m_cDataMember = m_cBase = m_cNestedType = (USHORT)~0;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::Psheapmgr
+*Purpose:
+* Get containing sheapmgr
+*
+*Implementation Notes:
+* Defers to blkmgr.
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline SHEAP_MGR *TYPE_DATA::Psheapmgr() const
+{
+ return m_blkmgr.Psheapmgr();
+}
+
+
+/***
+*PUBLIC TYPE_DATA::CDataMember - Get length of data member list.
+*Purpose:
+* Get length of data member list.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* UINT
+*
+***********************************************************************/
+
+inline UINT TYPE_DATA::CDataMember() const
+{
+ return m_cDataMember;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::CBase - Get length of base list.
+*Purpose:
+* Get length of base list.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* UINT
+*
+***********************************************************************/
+
+inline UINT TYPE_DATA::CBase() const
+{
+ return m_cBase;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::CMeth - Get length of meth list.
+*Purpose:
+* Get length of meth list.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* UINT
+*
+***********************************************************************/
+
+inline UINT TYPE_DATA::CMeth() const
+{
+ return m_cMeth;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::CNestedType - Get length of nested type list.
+*Purpose:
+* Get length of nested type list.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* UINT
+*
+***********************************************************************/
+
+inline UINT TYPE_DATA::CNestedType() const
+{
+ return m_cNestedType;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::CAvailMeth - Get length of availible meth list.
+*Purpose:
+* Get length of availible meth list.
+*
+*Implementation Notes:
+*
+*Entry:
+* None.
+*
+*Exit:
+* UINT
+*
+***********************************************************************/
+
+inline UINT TYPE_DATA::CAvailMeth() const
+{
+ // All OLE methods are availible.
+ return CMeth();
+}
+
+
+
+
+/***
+*PUBLIC TYPE_DATA::Pnammgr - Get class's name manager.
+*Purpose:
+* Get class's name manager.
+*
+*Implementation Notes:
+b*
+*Entry:
+* None.
+*
+*Exit:
+* Returns pointer to NAMMGR object owned by containing GEN_DTINFO.
+*
+***********************************************************************/
+
+inline NAMMGR* TYPE_DATA::Pnammgr() const
+{
+ DebAssert(m_pnammgr != NULL,
+ "TYPE_DATA::Pnammgr: m_pnammgr NULL.");
+
+ return m_pnammgr;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::Pimpmgr - Get class's import manager.
+*Purpose:
+* Get class's import manager.
+*
+*Implementation Notes:
+b*
+*Entry:
+* None.
+*
+*Exit:
+* Returns pointer to IMPMGR object owned by containing GEN_DTINFO.
+*
+***********************************************************************/
+
+inline IMPMGR* TYPE_DATA::Pimpmgr() const
+{
+ DebAssert(m_pimpmgr != NULL,
+ "TYPE_DATA::Pimpmgr: m_pimpmgr NULL.");
+
+ return m_pimpmgr;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::Pdtroot - Get class's DYN_TYPEROOT.
+*Purpose:
+* Get class's DYN_TYPEROOT.
+*
+*Implementation Notes:
+b*
+*Entry:
+* None.
+*
+*Exit:
+* Returns pointer to DYN_TYPEROOT.
+*
+***********************************************************************/
+
+inline DYN_TYPEROOT* TYPE_DATA::Pdtroot() const
+{
+ DebAssert(m_pdtroot != NULL,
+ "TYPE_DATA::Pdtroot: m_pdtroot NULL.");
+
+ return m_pdtroot;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QdefnOfHdefn - Address of a DEFN
+*Purpose:
+* Converts a handle to a DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hdefn - Handle to a DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the DEFN.
+*
+***********************************************************************/
+
+inline DEFN* TYPE_DATA::QdefnOfHdefn(HDEFN hdefn, UINT oChunk) const
+{
+ return (DEFN *)m_blkmgr.QtrOfHandle(hdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QvdefnOfHvdefn - Address of a VAR_DEFN
+*Purpose:
+* Converts a handle to a VAR_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hvdefn - Handle to a VAR_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the VAR_DEFN.
+*
+***********************************************************************/
+
+inline VAR_DEFN* TYPE_DATA::QvdefnOfHvdefn(HVAR_DEFN hvdefn, UINT oChunk) const
+{
+ return (VAR_DEFN *)QdefnOfHdefn((HDEFN)hvdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QparamdefnOfHparamdefn - Address of a PARAM_DEFN
+*Purpose:
+* Converts a handle to a PARAM_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hparamdefn - Handle to a PARAM_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the PARAM_DEFN.
+*
+***********************************************************************/
+
+inline PARAM_DEFN* TYPE_DATA::QparamdefnOfHparamdefn(HPARAM_DEFN hparamdefn, UINT oChunk) const
+{
+ return (PARAM_DEFN *)QdefnOfHdefn((HDEFN)hparamdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QmdefnOfHmdefn - Address of a MEMBER_DEFN
+*Purpose:
+* Converts a handle to a MEMBER_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hmdefn - Handle to a MEMBER_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the MEMBER_DEFN.
+*
+***********************************************************************/
+
+inline MEMBER_DEFN* TYPE_DATA::QmdefnOfHmdefn(HMEMBER_DEFN hmdefn, UINT oChunk) const
+{
+ return (MEMBER_DEFN *)QdefnOfHdefn((HDEFN)hmdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QmvdefnOfHmvdefn - Address of a MBR_VAR_DEFN
+*Purpose:
+* Converts a handle to a MBR_VAR_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hmvdefn - Handle to a MBR_VAR_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the MBR_VAR_DEFN.
+*
+***********************************************************************/
+
+inline MBR_VAR_DEFN* TYPE_DATA::QmvdefnOfHmvdefn(HMBR_VAR_DEFN hmvdefn, UINT oChunk) const
+{
+ return (MBR_VAR_DEFN *)QdefnOfHdefn((HDEFN)hmvdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QfdefnOfHfdefn - Address of a FUNC_DEFN
+*Purpose:
+* Converts a handle to a FUNC_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hfdefn - Handle to a FUNC_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the FUNC_DEFN.
+*
+***********************************************************************/
+
+inline FUNC_DEFN* TYPE_DATA::QfdefnOfHfdefn(HFUNC_DEFN hfdefn, UINT oChunk) const
+{
+ return (FUNC_DEFN *)m_blkmgr.QtrOfHandle((HDEFN)hfdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QvfdefnOfHvfdefn - Address of a VIRTUAL_FUNC_DEFN
+*Purpose:
+* Converts a handle to a VIRTUAL_FUNC_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hvfdefn - Handle to a FUNC_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the VIRTUAL_FUNC_DEFN.
+*
+***********************************************************************/
+
+inline VIRTUAL_FUNC_DEFN* TYPE_DATA::QvfdefnOfHvfdefn(HVIRTUAL_FUNC_DEFN hvfdefn, UINT oChunk) const
+{
+ return (VIRTUAL_FUNC_DEFN *)QdefnOfHdefn((HDEFN)hvfdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QtdefnOfHtdefn - Address of a TYPE_DEFN
+*Purpose:
+* Converts a handle to a TYPE_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hvdefn - Handle to a TYPE_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the TYPE_DEFN.
+*
+***********************************************************************/
+
+inline TYPE_DEFN* TYPE_DATA::QtdefnOfHtdefn(HTYPE_DEFN htdefn, UINT oChunk) const
+{
+ return (TYPE_DEFN *)m_blkmgr.QtrOfHandle(htdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QrtdefnOfHrtdefn - Address of a RECTYPE_DEFN
+*Purpose:
+* Converts a handle to a RECTYPE_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hrtdefn - Handle to a RECTYPE_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the RECTYPE_DEFN.
+*
+***********************************************************************/
+
+inline RECTYPE_DEFN *TYPE_DATA::QrtdefnOfHrtdefn(HRECTYPE_DEFN hrtdefn, UINT oChunk) const
+{
+ return (RECTYPE_DEFN *)m_blkmgr.QtrOfHandle(hrtdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QftdefnOfHftdefn - Address of a FUNC_TYPE_DEFN
+*Purpose:
+* Converts a handle to a FUNC_TYPE_DEFN to a pointer.
+*
+*Implementation Notes:
+*
+*Entry:
+* hvdefn - Handle to a FUNC_TYPE_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns a pointer to the FUNC_TYPE_DEFN.
+*
+***********************************************************************/
+
+inline FUNC_TYPE_DEFN* TYPE_DATA::QftdefnOfHftdefn(HFUNC_TYPE_DEFN hftdefn,
+ UINT oChunk) const
+{
+ return (FUNC_TYPE_DEFN *)m_blkmgr.QtrOfHandle(hftdefn, oChunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QarraydescOfHarraydesc - Get ptr to ARRAY_DESC.
+*Purpose:
+* Get ptr to ARRAY_DESC given handle.
+*
+*Implementation Notes:
+*
+*Entry:
+* harraydesc - Handle of arraydesc on local heap.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns pointer to ARRAY_DESC.
+*
+***********************************************************************/
+
+inline SAFEARRAYA* TYPE_DATA::QarraydescOfHarraydesc(
+ HARRAY_DESC harraydesc,
+ UINT oChunk) const
+{
+ return (SAFEARRAYA *)m_blkmgr.QtrOfHandle(harraydesc, oChunk);
+}
+
+
+
+/***
+*PUBLIC TYPE_DATA::QtdefnOfHvdefn - Get ptr to TYPE_DEFN.
+*Purpose:
+* Given a handle to a VAR_DEFN, get a pointer to its
+* TYPE_DEFN.
+*
+*Implementation Notes:
+*
+*Entry:
+* HVAR_DEFN hvdefn - Handle of VAR_DEFN.
+* oChunk - Optional offset within chunk.
+*
+*Exit:
+* Returns pointer to TYPE_DEFN.
+* Note: returns NULL if type handle is Nil.
+*
+***********************************************************************/
+
+inline TYPE_DEFN* TYPE_DATA::QtdefnOfHvdefn(
+ HVAR_DEFN hvdefn,
+ UINT oChunk) const
+{
+ VAR_DEFN *qvdefn;
+ HTYPE_DEFN htdefn;
+
+ DebAssert(hvdefn != HVARDEFN_Nil, "QtdefnOfHvdefn: bad hvdefn");
+
+ qvdefn = QvdefnOfHvdefn(hvdefn, oChunk);
+ htdefn = qvdefn->Htdefn();
+
+ // NOTE: for simple types must actually return address
+ // of embedded member and not address of stack-alloced
+ // local. I.e. can't use Htdefn() accessor.
+ //
+ return htdefn == HTYPEDEFN_Nil ?
+ NULL :
+ (qvdefn->IsSimpleType() ?
+ qvdefn->QtdefnOfSimpleType() :
+ QtdefnOfHtdefn(htdefn));
+}
+
+
+inline TYPE_DEFN* TYPE_DATA::QtdefnResultOfHfdefn(HFUNC_DEFN hfdefn,
+ UINT oChunk) const
+{
+ FUNC_DEFN *qfdefn;
+ HTYPE_DEFN htdefnResult;
+ DebAssert(hfdefn != HFUNCDEFN_Nil, "bad hfdefn");
+
+ qfdefn = QfdefnOfHfdefn(hfdefn, oChunk);
+ htdefnResult = qfdefn->m_ftdefn.HtdefnResult();
+
+ // NOTE: for simple types must actually return address
+ // of embedded member and not address of stack-alloced
+ // local. I.e. can't use HtdefnResult() accessor.
+ //
+ return htdefnResult == HTYPEDEFN_Nil ?
+ NULL :
+ (qfdefn->m_ftdefn.IsSimpleTypeResult() ?
+ qfdefn->m_ftdefn.QtdefnOfSimpleTypeResult() :
+ QtdefnOfHtdefn(htdefnResult));
+}
+
+
+inline TYPE_DEFN* TYPE_DATA::QtdefnResultOfHfdefnUnmunged(HFUNC_DEFN hfdefn,
+ UINT oChunk) const
+{
+ FUNC_DEFN *qfdefn;
+ HTYPE_DEFN htdefnResult;
+ DebAssert(hfdefn != HFUNCDEFN_Nil, "bad hfdefn");
+
+ qfdefn = QfdefnOfHfdefn(hfdefn, oChunk);
+ htdefnResult = qfdefn->m_ftdefn.HtdefnResultUnmunged();
+
+ // NOTE: for simple types must actually return address
+ // of embedded member and not address of stack-alloced
+ // local. I.e. can't use HtdefnResult() accessor.
+ //
+ return htdefnResult == HTYPEDEFN_Nil
+ ? NULL
+ : (qfdefn->m_ftdefn.IsSimpleTypeResultUnmunged()
+ ? qfdefn->m_ftdefn.QtdefnOfSimpleTypeResultUnmunged()
+ : QtdefnOfHtdefn(htdefnResult));
+}
+
+/***
+*PUBLIC TYPE_DATA::LengthOfHchunk - Gets length of chunk.
+*Purpose:
+* Gets length of chunk (assumes is ULONG prefixed ST).
+*
+*Implementation Notes:
+*
+*Entry:
+* hchunkStr - handle to chunk containing an ST.
+*
+*Exit:
+* ST length
+*
+***********************************************************************/
+
+inline ULONG TYPE_DATA::LengthOfHchunk(HCHUNK hchunk)
+{
+ return *(ULONG *)m_blkmgr.QtrOfHandle(hchunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::QtrOfHandle - Gets pointer from handle.
+*Purpose:
+* Allows client to get pointer for TYPE_DATA owned handle.
+*
+*Implementation Notes:
+*
+*Entry:
+* hchunk - handle to get pointer of.
+*
+*Exit:
+* VOID pointer
+*
+***********************************************************************/
+
+inline BYTE *TYPE_DATA::QtrOfHandle(HCHUNK hchunk)
+{
+ return m_blkmgr.QtrOfHandle(hchunk);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::Free - Frees instance.
+*Purpose:
+* Frees instance.
+*
+*Implementation Notes:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+
+inline VOID TYPE_DATA::Free()
+{
+ m_blkmgr.Free();
+}
+
+
+/***
+*PUBLIC TYPE_DATA::HfdefnFirstMeth - First meth in list.
+*Purpose:
+* Returns first method in list of class's methods.
+*
+*Implementation Notes:
+*
+*Entry:
+* None
+*
+*Exit:
+* Returns handle to first method in list of methods.
+*
+***********************************************************************/
+
+inline HFUNC_DEFN TYPE_DATA::HfdefnFirstMeth() const
+{
+ return (HFUNC_DEFN) m_hdefnFirstMeth;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::HdefnFirstDataMbrNestedType - First data member in list.
+*Purpose:
+* Returns first data member in list of class's data members.
+*
+*Implementation Notes:
+* CONSIDER: making inline.
+*
+*Entry:
+* None
+*
+*Exit:
+* Returns handle to first data member in list of data members.
+*
+***********************************************************************/
+
+inline HDEFN TYPE_DATA::HdefnFirstDataMbrNestedType() const
+{
+ return (HDEFN) m_hdefnFirstDataMbrNestedType;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::HvdefnFirstBase - First base in list.
+*Purpose:
+* Returns first base in list of class's bases.
+*
+*Implementation Notes:
+* CONSIDER: making inline.
+*
+*Entry:
+* None
+*
+*Exit:
+* Returns handle to first base in list of bases.
+*
+***********************************************************************/
+
+inline HVAR_DEFN TYPE_DATA::HvdefnFirstBase() const
+{
+ return (HVAR_DEFN) m_hdefnFirstBase;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::HfdefnNextAvailMeth - Next availible method in list.
+*Purpose:
+* Returns next availible method in list of class's methods.
+*
+*Implementation Notes:
+*
+*Entry:
+* None
+*
+*Exit:
+* returns handle to next availible function.
+*
+***********************************************************************/
+
+inline HFUNC_DEFN TYPE_DATA::HfdefnNextAvailMeth(HFUNC_DEFN hfdefn) const
+{
+ // All OLE functions are availible.
+ return QfdefnOfHfdefn(hfdefn)->HdefnNext();
+}
+
+
+/***
+*PUBLIC TYPE_DATA::RemNestedTypeDefn - Remove a RECTYPE_DEFN from a list.
+*Purpose:
+* Remove a RECTYPE_DEFN from a list.
+*
+*Implementation Notes:
+* Defers to RemDefn
+*
+*Entry:
+* hrtdefn - Handle to a RECTYPE_DEFN to remove from list (IN).
+*
+*Exit:
+* Updates the appropriate listtail/listhead if needed.
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+inline VOID TYPE_DATA::RemRecTypeDefn(HRECTYPE_DEFN hrtdefn)
+{
+ RemDefn(hrtdefn, &m_hdefnFirstDataMbrNestedType, &m_hdefnLastDataMbrNestedType,
+ &TYPE_DATA::FreeRecTypeDefn);
+ m_cNestedType--;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::RemParamDefn - Remove a PARAM_DEFN from a list.
+*Purpose:
+* Remove a PARAM_DEFN from a list.
+*
+*Implementation Notes:
+* Traverses list, searching for PARAM_DEFN reference by handle param
+* and remembers the previous element in list.
+* When it finds the element it removes it by linking the previous
+* to skip over the found element, and frees the memory associated
+* with the element to be removed.
+* It's a bug if the element can't be found, so assert.
+* Updates list head and tail if needed.
+*
+*Entry:
+* hparamdefn - Handle to a PARAM_DEFN to remove from list (IN).
+*
+*Exit:
+* Updates the appropriate listtail/listhead if needed.
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+inline VOID TYPE_DATA::RemParamDefn(HPARAM_DEFN hparamdefn,
+ sHDEFN *phdefnFirst,
+ sHDEFN *phdefnLast)
+{
+ RemDefn(hparamdefn, phdefnFirst, phdefnLast, &TYPE_DATA::FreeParamDefn);
+}
+
+
+
+
+/***
+*TYPE_DATA::GetSize
+*Purpose:
+* returns the size of the TYPE_DEFN
+*Entry:
+*
+*Exit:
+* returns size
+***********************************************************************/
+inline LONG TYPE_DATA::GetSize()
+{
+ return m_blkmgr.GetSize();
+}
+
+
+/***
+*PRIVATE TYPE_DEFN::ChangeTypeDefnOfVarDefn()
+*Purpose:
+* Takes a pointer to a VAR_DEFN and puts the right
+* thing in the htdefn field.
+* For now, VAR_DEFN must already be isSimpleType and the
+* new TYPE_DEFN must also be isSimpleType.
+*
+*Implementation Notes:
+*
+*Entry:
+* pvdefn - pointer to the VAR_DEFN
+* ptdefn - pointer to the TYPE_DEFN
+* cbSizeDefn - size of the TYPE_DEFN
+*
+*Exit:
+*
+*
+***********************************************************************/
+
+inline VOID TYPE_DATA::ChangeTypeDefnOfVarDefn(HVAR_DEFN hvdefn,
+ TYPE_DEFN *ptdefn, UINT cbSizeDefn)
+{
+ VAR_DEFN *pvdefn;
+
+ DebAssert(hvdefn != HVARDEFN_Nil, "hvdefn is Nil");
+ DebAssert(ptdefn != NULL, "ptdefn is NULL");
+ DebAssert(IsSimpleType(ptdefn->Tdesckind()),
+ "not a simple TYPE_DEFN");
+
+ pvdefn = QvdefnOfHvdefn(hvdefn);
+ DebAssert(pvdefn->IsSimpleType(), "must currently be simple type");
+
+ // This copies the type defn directly in to the htdefn field
+ *((TYPE_DEFN *)(pvdefn->QtdefnOfSimpleType())) = *ptdefn;
+}
+
+
+/***
+*PUBLIC TYPE_DEFN::QparamdefnOfIndex()
+*Purpose:
+* Takes a handle to the first paramdefn in a paramdefn array and index(i)
+* returns a pointer to ith paramdefn.
+*
+*Implementation Notes:
+*
+*Entry:
+* hparamdefn
+* UINT : pointer to the PARAM DEFN to return.
+*Exit:
+* PARAM_DEFN *
+*
+***********************************************************************/
+
+inline PARAM_DEFN *TYPE_DATA::QparamdefnOfIndex(HPARAM_DEFN hparamdefn, UINT i) const
+{
+ return (PARAM_DEFN *) ((BYTE*)QparamdefnOfHparamdefn(hparamdefn) +
+ i*sizeof(PARAM_DEFN));
+}
+
+
+#endif // ! TDATA_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/tdata1.cxx b/private/oleauto/src/typelib/tdata1.cxx
new file mode 100644
index 000000000..8771544a3
--- /dev/null
+++ b/private/oleauto/src/typelib/tdata1.cxx
@@ -0,0 +1,2465 @@
+/***
+*tdata1.cxx - Type Data part 1
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* TYPEDATA manages the internal representation of a class's members.
+* In particular, it maintains three linked lists of data members,
+* base members and methods respectively.
+* See \silver\doc\ic\dtmbrs.doc for more information.
+*
+*Revision History:
+*
+* 27-Feb-91 ilanc: Created.
+* 28-Mar-91 alanc: Added include statement for impmgr
+* 06-Nov-91 ilanc: Mods cos of code review plus
+* implementaiotn of FreeDefn methods.
+* 31-Jan-91 stevenl: Modified for new hierarchy--see tdata.hxx.
+* 03-Apr-92 ilanc: Added GetVardesckindOfHvdefn
+* 03-Apr-92 martinc: Changed m_hdefn to m_varaccess.m_hdefn
+* (this change was required for cfront)
+* 12-Apr-92 ilanc: Implemented DebCheckState().
+* 29-Apr-92 ilanc: Added HfdefnOfHmember().
+* 30-Apr-92 stevenl: Minor changes to AllocTypeDefn.
+* 01-Jun-92 stevenl: DebShowVarDefn now dumps arraydescs.
+* 15-Jun-92 stevenl: Updated debug methods.
+* 16-Jun-92 w-peterh: Added RECTYPE_DEFN list
+* 18-Jun-92 stevenl: The debug .obj size of this file on the Mac
+* is greater than 32K, so any files after
+* the 32K boundary are not accessible outside
+* this module. Moved internal functions to the
+* end of the module so that all client calls
+* are in the first 32K.
+* 28-Jun-92 stevenl: Changed AllocArrayDescriptor so that it
+* allows zero-dimension arrays.
+* 02-Jul-92 w-peterh: merged data member/type lists
+* 13-Jul-92 stevenl: Added FreeVarDefn; fixed up FreeRectypeDefn
+* and FreeFuncDefn. Added DebShowDefn.
+* 11-Aug-92 stevenl: Put infrequently used functions into tdata2.cxx.
+* 18-Jan-93 w-peterh: removed TypeDefnResult
+* 12-Feb-93 w-peterh: VDK_BaseObject, htdefnAlias, HmvdefnOfHmember
+* 23-Feb-93 rajivk : Support for Predeclared Identifier
+* 23-Feb-93 davebra: Added FreeChunk
+* 30-Apr-93 w-jeffc: made DEFN data members private; added
+* Swap*defn functions
+*
+*Implementation Notes:
+* ST's are implemented as ULONG prefixed.
+*
+*****************************************************************************/
+
+#define TDATA_VTABLE // export blk mgr vtable
+
+#include "silver.hxx"
+#include "xstring.h" // for memcpy
+#include "typelib.hxx"
+#include "tdata.hxx" // no longer includes dtinfo.hxx
+#include "clutil.hxx"
+#include "nammgr.hxx"
+#include "impmgr.hxx"
+#include "entrymgr.hxx"
+#include "exbind.hxx"
+
+
+#pragma hdrstop(RTPCHNAME)
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleTdataCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleTdataCxx
+#else
+static char szTdataCxx[] = __FILE__;
+#define SZ_FILE_NAME szTdataCxx
+#endif
+#endif
+
+#if HP_BIGENDIAN
+// forward declarations
+static VOID Swap8Bytes(void * pv);
+#endif
+
+// defined in tdata2.cxx
+extern BYTE *PbConstVal(TYPE_DATA *ptdata, VAR_DEFN *qvdefn);
+extern VOID SetHchunkConstVal(VAR_DEFN *qvdefn, HCHUNK hchunk);
+
+// for help context encoding (defined in tdata2.cxx)
+#define IsHchunk(us) (!(us & 0x0001))
+#define GetHchunk(us) (us & ~0x0001)
+
+
+
+UINT ENCALL CbSizeArrayDesc(UINT);
+void ENCALL rtArrayInit(SAFEARRAY *, UINT);
+
+/***
+* CbSizeArrayDesc - return array descriptor size
+*
+* Purpose:
+* This function returns the size (in bytes) of an array
+* descriptor with uNDim dimensions.
+*
+* This static function is called by the AllocArrayDescriptor,
+* which needs a non-method function call to return the size of
+* an ARRAY_DESC.
+*
+* Entry:
+* uNDim - dimension count value
+*
+* Exit:
+* returns size in bytes of array descriptor
+*
+* Exceptions:
+***********************************************************************/
+
+UINT ENCALL CbSizeArrayDesc (UINT uNDim)
+{
+ if (uNDim > 0)
+ return sizeof(SAFEARRAY) + (uNDim - 1) * sizeof(SAFEARRAYBOUND);
+ else
+ return sizeof(SAFEARRAY);
+}
+
+void ENCALL rtArrayInit (SAFEARRAY * pad, UINT uNDim)
+{
+ UINT i;
+
+ pad->cDims = 0;
+ pad->fFeatures = 0;
+ pad->cbElements = 0;
+ pad->cLocks = 0;
+#if !OE_WIN32
+ pad->handle = 0;
+#endif
+ pad->pvData = NULL;
+
+ for (i = 0; i < uNDim; i++) {
+
+ pad->rgsabound[i].cElements = 0;
+ pad->rgsabound[i].lLbound = 0;
+ }
+}
+
+
+
+#if ID_DEBUG
+// EXBIND debug methods
+//
+VOID EXBIND::DebCheckState(UINT uLevel) const
+{
+}
+
+
+#endif // ID_DEBUG
+
+
+
+
+// Class methods
+//
+
+/***
+*PUBLIC TYPE_DATA::Initializer - initialize an instance
+*Purpose:
+* initializes a TYPE_DATA instance.
+*
+*Implementation Notes:
+*
+*Entry:
+* psheapmgr - Pointer to a heap mgr.
+* pdtroot - Pointer to owning DYN_TYPEROOT
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+TIPERROR TYPE_DATA::Init(SHEAP_MGR *psheapmgr, DYN_TYPEROOT *pdtroot)
+{
+ TIPERROR err = TIPERR_None;
+
+ DebAssert(pdtroot != NULL, "TYPE_DATA: pdtroot uninitialized.");
+ DebAssert(psheapmgr != NULL, "TYPE_DATA: psheapmgr uninitialized.");
+
+ m_pdtroot = pdtroot;
+
+ // Init block manager member.
+ IfErrRet(m_blkmgr.Init(psheapmgr));
+
+ // Cache name manager member
+ IfErrRet(pdtroot->GetNamMgr(&m_pnammgr));
+
+ // Cache import manager member
+ IfErrRet(pdtroot->GetImpMgr(&m_pimpmgr));
+
+ m_hdefnFirstMeth =
+ m_hdefnFirstDataMbrNestedType =
+ m_hdefnFirstBase =
+ m_hdefnLastMeth =
+ m_hdefnLastDataMbrNestedType =
+ m_hdefnLastBase = (sHDEFN)HDEFN_Nil;
+
+ // init elem count of lists.
+ m_cMeth = m_cDataMember = m_cBase = m_cNestedType = 0;
+ m_uHelpContextBase = 0;
+
+ // set alias to null
+ m_htdefnAlias = (sHTYPE_DEFN) HTYPEDEFN_Nil;
+
+ // Init iteration cache
+ m_uOrdinalHfdefnLast = m_uOrdinalHvdefnLast = 0xFFFF;
+ m_hfdefnLast = HFUNCDEFN_Nil;
+ m_hvdefnLast = HVARDEFN_Nil;
+
+ // Assume not a class.
+ SetHvdefnPredeclared(HMBRVARDEFN_Nil);
+ return err;
+}
+#pragma code_seg( )
+
+
+
+
+/***
+*PUBLIC TYPE_DATA::~TYPE_DATA - destructor
+*Purpose:
+* Destroys a TYPE_DATA instance.
+*
+*Implementation Notes:
+* If embedded BLKMGR is valid then free it.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE )
+TYPE_DATA::~TYPE_DATA()
+{
+ if (m_blkmgr.IsValid())
+ m_blkmgr.Free();
+}
+#pragma code_seg( )
+
+
+
+
+
+
+
+
+
+
+/***
+*PRIVATE TYPE_DATA::AppendDefn - Append a DEFN to end of list.
+*Purpose:
+* Append a DEFN to end of list: either base or data member.
+*
+*Implementation Notes:
+* Works out what list to append to by looking at the varkind attr.
+* NOTE: Since this function sets the hdefnNext field of the
+* DEFN to HCHUNK_Nil, you can't use it for appending a
+* list of DEFNs onto another list.
+*
+*Entry:
+* hdefn - Handle of a DEFN
+*
+*Exit:
+* Updates the appropriate listtail (and listhead if needed).
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+VOID TYPE_DATA::AppendDefn(HDEFN hdefn,
+ sHDEFN *phdefnFirst,
+ sHDEFN *phdefnLast)
+{
+ DEFN *pdefn, *pdefnLast;
+
+ pdefn = QdefnOfHdefn(hdefn);
+ pdefn->SetHdefnNext(HDEFN_Nil);
+
+ if (*phdefnLast != (sHDEFN)HDEFN_Nil) {
+ pdefnLast = QdefnOfHdefn((HDEFN)*phdefnLast);
+ *phdefnLast = (sHDEFN)hdefn;
+ pdefnLast->SetHdefnNext(hdefn);
+ }
+ else {
+ DebAssert((*phdefnFirst == (sHDEFN)HDEFN_Nil) &&
+ (*phdefnLast == (sHDEFN)HDEFN_Nil),
+ "TYPE_DATA::AppendDefn: whoops! bad listhead/listtail.");
+
+ *phdefnFirst = *phdefnLast = (sHDEFN)hdefn;
+ }
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_LAYOUT)
+/***
+*PRIVATE TYPE_DATA::AppendMbrVarDefn - Append MBR_VAR_DEFN to end of list.
+*Purpose:
+* Append a MBR_VAR_DEFN to end of list: either base or data member.
+*
+*Implementation Notes:
+* Works out what list to append to by looking at the varkind attr.
+*
+*Entry:
+* hmvdefn - Handle of a MBR_VAR_DEFN
+*
+*Exit:
+* Updates the appropriate listtail (and listhead if needed).
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+VOID TYPE_DATA::AppendMbrVarDefn(HMBR_VAR_DEFN hmvdefn)
+{
+ sHDEFN *phdefnLast, *phdefnFirst;
+ MBR_VAR_DEFN *pmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+
+ // Switch on kind of member (data member or base)
+ switch (pmvdefn->Vkind()) {
+ case VKIND_Base: {
+ phdefnFirst = &m_hdefnFirstBase;
+ phdefnLast = &m_hdefnLastBase;
+ m_cBase++;
+ break;
+ }
+ case VKIND_Enumerator:
+ case VKIND_DataMember: {
+ phdefnFirst = &m_hdefnFirstDataMbrNestedType;
+ phdefnLast = &m_hdefnLastDataMbrNestedType;
+ m_cDataMember++;
+ break;
+ }
+ default: {
+ DebHalt("TYPE_DATA::AppendMbrVarDefn: bad MBR_VAR_DEFN param.");
+ }
+ }
+ AppendDefn(hmvdefn, phdefnFirst, phdefnLast);
+}
+#pragma code_seg()
+
+
+
+
+
+
+/***
+*PRIVATE TYPE_DATA::ReleaseDllentrydefn
+*Purpose:
+* Releases a dll entry defn from the entrymgr
+*
+*Implementation Notes:
+*
+*Entry:
+* hdllentrydefn - the handle to release
+*Exit:
+* VOID
+*
+***********************************************************************/
+
+VOID TYPE_DATA::ReleaseDllentrydefn(HDLLENTRY_DEFN hdllentrydefn)
+{
+ ENTRYMGR *pentrymgr;
+ TIPERROR err;
+ err = m_pdtroot->GetEntMgr(&pentrymgr);
+
+ DebAssert(!err, "TYPE_DATA::AllocDllEntrydefn");
+ pentrymgr->ReleaseDllentrydefn(hdllentrydefn);
+
+ return;
+}
+
+
+/***
+*PRIVATE TYPE_DATA::FreeArrayDescriptor - Release AD memory.
+*Purpose:
+* Release memory for an AD and its parts.
+*
+*Implementation Notes:
+* Calculates the size of the array descriptor and then frees it.
+*
+*Entry:
+* harraydesc - handle to an AD.
+*
+*Exit:
+*
+*Errors:
+*
+***********************************************************************/
+
+VOID TYPE_DATA::FreeArrayDescriptor(HARRAY_DESC harraydesc)
+{
+ SAFEARRAY *pad;
+
+ if (harraydesc != HARRAYDESC_Nil) {
+ pad = QarraydescOfHarraydesc(harraydesc);
+ m_blkmgr.FreeChunk(harraydesc,
+ CbSizeArrayDesc(pad->cDims));
+ }
+}
+
+
+/***
+*PRIVATE TYPE_DATA::FreeTypeDefnResources - Release TYPE_DEFN memory.
+*Purpose:
+* Release and unref TYPE_DEFN-owned resources.
+*
+*Implementation Notes:
+* Works a lot like SizeOfTypeDefn: just frees/unrefs stuff
+* when necessary.
+*
+*Entry:
+* htdefn - handle to a TYPE_DEFN.
+*
+*Exit:
+*
+*Errors:
+*
+***********************************************************************/
+
+VOID TYPE_DATA::FreeTypeDefnResources(HTYPE_DEFN htdefn)
+{
+ TYPE_DEFN *ptdefn;
+ TYPEDESCKIND tdesckind;
+
+ ptdefn = (TYPE_DEFN *)m_blkmgr.QtrOfHandle(htdefn);
+ DebAssert(ptdefn != NULL, "bad TYPE_DEFN");
+
+ tdesckind = (TYPEDESCKIND)ptdefn->Tdesckind();
+ if (!IsSimpleType(tdesckind)) {
+ switch (tdesckind) {
+ case TDESCKIND_Ptr:
+ // adjust handle to next contiguous TYPE_DEFN.
+ FreeTypeDefnResources(htdefn + sizeof(TYPE_DEFN));
+ break;
+ case TDESCKIND_Carray:
+ case TDESCKIND_BasicArray:
+ FreeArrayDescriptor(ptdefn->Harraydesc());
+ FreeTypeDefnResources(htdefn + sizeof(TYPE_DEFN) + sizeof(sHARRAY_DESC));
+ break;
+ case TDESCKIND_UserDefined:
+ DebAssert(ptdefn->Qhimptype(), "whoops! null Phimptype.");
+ m_pimpmgr->Unref(ptdefn->Himptype());
+ break;
+ } // end switch
+ } // end if
+}
+
+
+/***
+*PRIVATE TYPE_DATA::FreeTypeDefn - Release TYPE_DEFN memory.
+*Purpose:
+* Release memory for a TYPE_DEFN and its parts.
+*
+*Implementation Notes:
+* Calls FreeTypeDefnResources to free anything owned by
+* the TYPE_DEFN, then frees the TYPE_DEFN itself.
+*
+*Entry:
+* htdefn - handle to a TYPE_DEFN.
+*
+*Exit:
+*
+*Errors:
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+VOID TYPE_DATA::FreeTypeDefn(HTYPE_DEFN htdefn)
+{
+ if (htdefn != HTYPEDEFN_Nil) {
+ FreeTypeDefnResources(htdefn);
+ m_blkmgr.FreeChunk(htdefn, SizeOfTypeDefn(htdefn));
+ }
+}
+#pragma code_seg( )
+
+
+
+
+/***
+*PRIVATE TYPE_DATA::FreeMbrVarDefn - Release MBR_VAR_DEFN memory.
+*Purpose:
+* Release memory for a MBR_VAR_DEFN and its parts.
+*
+*Implementation Notes:
+* Free referenced sub-chunks first (that this DEFN has
+* handles to, then free top-level chunk itself.
+* Namely: DLLENTRY_DEFN, doc string and TYPE_DEFN.
+*
+*Entry:
+* hmvdefn - handle to a MBR_VAR_DEFN.
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+VOID TYPE_DATA::FreeMbrVarDefn(HMBR_VAR_DEFN hmvdefn)
+{
+ MBR_VAR_DEFN *pmvdefn;
+ HDLLENTRY_DEFN hdllentrydefn;
+ HST hstDocumentation;
+ ULONG uCbSizeStr;
+ HCHUNK hchunkConstVal;
+
+ DebAssert(hmvdefn != HMBRVARDEFN_Nil,
+ "TYPE_DATA::FreeMbrVarDefn: bad param.");
+
+ pmvdefn = (MBR_VAR_DEFN *)m_blkmgr.QtrOfHandle(hmvdefn);
+
+ // Free referenced sub-objects first (referenced by handles).
+ hdllentrydefn = pmvdefn->Hdllentrydefn();
+ if (hdllentrydefn != HDLLENTRYDEFN_Nil)
+ m_blkmgr.FreeChunk(hdllentrydefn, sizeof(DLLENTRY_DEFN));
+
+ // Work out size of ULONG-length-prefixed doc string and free it.
+ hstDocumentation = pmvdefn->HstDocumentation();
+ if (hstDocumentation != HST_Nil) {
+ uCbSizeStr = *(ULONG *)m_blkmgr.QtrOfHandle(hstDocumentation);
+ m_blkmgr.FreeChunk(hstDocumentation, (UINT)(uCbSizeStr+sizeof(ULONG)));
+ }
+
+ // Free the const value if any.
+ if (pmvdefn->HasConstVal() && !pmvdefn->IsSimpleConst()) {
+ hchunkConstVal = pmvdefn->HchunkConstMbrVal();
+ if (hchunkConstVal != HCHUNK_Nil) {
+ m_blkmgr.FreeChunk(hchunkConstVal,
+ SizeofConstVal((VAR_DEFN *)pmvdefn, hchunkConstVal));
+ }
+ }
+
+ if (!pmvdefn->IsSimpleType()) {
+ // Free (varlen) TYPE_DEFN
+ FreeTypeDefn(pmvdefn->Htdefn());
+ }
+
+
+ // Finally free top-level memory of MBR_VAR_DEFN itself
+ m_blkmgr.FreeChunk(hmvdefn, pmvdefn->HasV2Flags() ?
+ sizeof(MBR_VAR_DEFN):
+ sizeof(MBR_VAR_DEFN) - sizeof(USHORT));
+
+ m_blkmgr.DebCheckState(0);
+}
+
+/***
+*PRIVATE TYPE_DATA::SizeofConstVal - Determine how big a constant is
+*Purpose: Determine how big a constant is, so we can free it.
+*
+*
+*Implementation Notes:
+*
+*Entry:
+* hchunkConstVal - handle to block containing the constant data.
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+UINT TYPE_DATA::SizeofConstVal(VAR_DEFN *qvdefn, HCHUNK hchunkConstVal)
+{
+ UINT cb;
+ BYTE * pbConst;
+ TYPEDESCKIND tdesckind;
+
+ pbConst = m_blkmgr.QtrOfHandle(hchunkConstVal);
+
+ // what is the type?
+ if (qvdefn->IsSimpleType()) {
+ tdesckind = qvdefn->QtdefnOfSimpleType()->Tdesckind();
+ }
+ else {
+ tdesckind = QtdefnOfHtdefn(qvdefn->Htdefn())->Tdesckind();
+ }
+ DebAssert(IsSimpleType(tdesckind), "tdesckind must be simple");
+
+ switch (tdesckind) {
+ case TDESCKIND_R8:
+ case TDESCKIND_Date:
+ case TDESCKIND_Currency:
+ cb = sizeof(double);
+ break;
+
+ case TDESCKIND_String:
+ // string is prefixed by a SHORT indicating string length
+ cb = sizeof(USHORT) + (UINT)*((USHORT *)pbConst);
+ break;
+
+ case TDESCKIND_Value:
+ cb = sizeof(VARIANT);
+ if (((LPVARIANT)pbConst)->vt == VT_BSTR) {
+ // string data is stored after the VARIANT structure.
+ // string is prefixed by a short indicating string length
+ cb += sizeof(USHORT) + (UINT)*((USHORT *)(pbConst + sizeof(VARIANT)));
+ }
+ break;
+
+ default:
+ cb = sizeof(long); // everybody else is just a long
+
+ } // switch
+ return cb;
+}
+
+
+/***
+*PRIVATE TYPE_DATA::FreeFuncDefn - Release FUNC_DEFN memory.
+*Purpose:
+* Release memory for a FUNC_DEFN and its parts.
+*
+*Implementation Notes:
+* Free referenced sub-chunks first (that this DEFN has
+* handles to, then free top-level chunks.
+* Namely, DLLENTRY_DEFN, doc string and FUNC_TYPE_DEFN's
+* list of PARAM_DEFN's (formal param list).
+*
+*Entry:
+* hfdefn - handle to a FUNC_DEFN.
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+VOID TYPE_DATA::FreeFuncDefn(HFUNC_DEFN hfdefn)
+{
+ FUNC_DEFN *pfdefn, *qfdefn;
+ HDLLENTRY_DEFN hdllentrydefn;
+ HST hstDocumentation;
+ HPARAM_DEFN hparamdefn;
+ ULONG uCbSizeStr;
+ BOOL fFound = FALSE;
+ HLNAM hlnam;
+ USHORT usSize;
+
+ UINT iArg, cArgs;
+
+ DebAssert(hfdefn != HFUNCDEFN_Nil,
+ "TYPE_DATA::FreeFuncDefn: bad param.");
+
+ pfdefn = (FUNC_DEFN *)m_blkmgr.QtrOfHandle(hfdefn);
+
+
+ // Free referenced sub-objects first (referenced by handles).
+ // The hdllentrydefn and hstDocumentation come from the
+ // MEMBER_DEFN part of the FUNC_DEFN.
+ //
+ if (!(pfdefn->IsVirtual())) {
+ hdllentrydefn = pfdefn->Hdllentrydefn();
+ if (hdllentrydefn != HDLLENTRYDEFN_Nil)
+ ReleaseDllentrydefn(hdllentrydefn);
+ }
+
+ // Work out size of ULONG-length-prefixed doc string and free it.
+ hstDocumentation = pfdefn->HstDocumentation();
+ if (hstDocumentation != HST_Nil) {
+ // if this is a property function then pass the owner ship
+ // some other property (if it exists).
+ if (pfdefn->InvokeKind() != INVOKE_FUNC ) {
+ hlnam = pfdefn->Hlnam();
+ hfdefn = HfdefnFirstMeth();
+ while (hfdefn != HDEFN_Nil) {
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ if ((qfdefn->InvokeKind() != INVOKE_FUNC) &&
+ (hlnam == qfdefn->Hlnam())) {
+ // Assign the doc string to this function
+
+ qfdefn->SetHstDocumentation(hstDocumentation);
+ // set the flag to indicate that we have assigned the
+ // doc string to some other function. So that we do not
+ // release the doc string.
+ fFound = TRUE;
+
+ } // if
+
+ hfdefn = qfdefn->HdefnNext();
+ }// while
+ } // if
+
+ // we did not assign the string to some other function hence
+ // delete the doc string.
+ if (!fFound) {
+ uCbSizeStr = *(ULONG *)m_blkmgr.QtrOfHandle(hstDocumentation);
+ m_blkmgr.FreeChunk(hstDocumentation, (UINT)(uCbSizeStr+sizeof(ULONG)));
+ }
+ }
+
+ // Now free the parts of the FUNC_TYPE_DEFN.
+
+
+ // free the (embedded) formal param list.
+ hparamdefn = pfdefn->m_ftdefn.m_hdefnFormalFirst;
+ if (hparamdefn != HPARAMDEFN_Nil) { // if any params
+ HPARAM_DEFN hparamdefnCur = hparamdefn; // first array elem
+
+ // We have an array of (OLE) PARAM_DEFNs.
+ cArgs = pfdefn->CArgsUnmunged();
+ for (iArg = 0; iArg < cArgs; iArg++) {
+ // Note: we fake the hparamdefn by adding in sizeof(PARAM_DEFN)
+ // each time through the loop.
+ // Note that the OLE impl of FreeParamDefn doesn't actually
+ // free this quasi-chunk, cos we just have a quasi-handle.
+ //
+ FreeParamDefn(hparamdefnCur);
+ hparamdefnCur += sizeof(PARAM_DEFN);
+ }
+
+ m_blkmgr.FreeChunk(hparamdefn, cArgs * sizeof(PARAM_DEFN));
+ }
+
+ // Now, free the TYPE_DEFN owned by the FUNC_TYPE_DEFN.
+ if (!(pfdefn->m_ftdefn.IsSimpleTypeResult()))
+ FreeTypeDefn(pfdefn->m_ftdefn.HtdefnResult());
+
+ DebAssert(sizeof(FUNC_DEFN) == sizeof(VIRTUAL_FUNC_DEFN), " size changed");
+
+ // Finally free top-level memory of FUNC_DEFN itself
+ // Must check to see whether it's a FUNC_DEFN or a
+ // VIRTUAL_FUNC_DEFN.
+ //
+ usSize = pfdefn->HasV2Flags() ? sizeof(FUNC_DEFN):
+ sizeof(FUNC_DEFN) - sizeof(USHORT) ;
+
+ m_blkmgr.FreeChunk(hfdefn, usSize);
+
+ m_blkmgr.DebCheckState(0);
+}
+
+
+/***
+*PRIVATE TYPE_DATA::FreeParamDefn - Release PARAM_DEFN memory.
+*Purpose:
+* Release memory for a PARAM_DEFN and its parts.
+*
+*Implementation Notes:
+* Free referenced sub-chunks first (that this DEFN has
+* handles to, then free top-level chunks).
+* Namely, doc string and TYPE_DEFN.
+*
+*Entry:
+* hparamdefn - handle to a PARAM_DEFN.
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+VOID TYPE_DATA::FreeParamDefn(HPARAM_DEFN hparamdefn)
+{
+ PARAM_DEFN *pparamdefn;
+
+ DebAssert(hparamdefn != HPARAMDEFN_Nil,
+ "TYPE_DATA::FreeParamDefn: bad param.");
+
+ pparamdefn = (PARAM_DEFN *)m_blkmgr.QtrOfHandle(hparamdefn);
+
+ // Free referenced sub-objects first (referenced by handles).
+ if (!pparamdefn->IsSimpleType()) {
+ // Free (varlen) TYPE_DEFN
+ FreeTypeDefn(pparamdefn->Htdefn());
+ }
+
+
+ m_blkmgr.DebCheckState(0);
+}
+
+
+
+
+
+
+/***
+*PUBLIC TYPE_DATA::Write - Serialize an instance.
+*Purpose:
+* Serialize an instance.
+*
+*Implementation Notes:
+* Serialization layout:
+* Handle to method listhead.
+* Handle to datamember listhead.
+* Handle to base listhead.
+* Handle to method listtail.
+* Handle to datamember listtail.
+* Handle to base listtail.
+* Embedded BLKMGR
+*
+* Note that it's ok to save BLKMGR handles: when the
+* the TYPE_DATA is deserialized they are still valid since
+* no relocation is done within the block.
+*
+*Entry:
+* pstrm - Pointer to stream to write to.
+*
+*Exit:
+*
+*Errors:
+* TIPERROR.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR TYPE_DATA::Write(STREAM *pstrm)
+{
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+#if HP_BIGENDIAN
+ // swap bytes for mac
+ SwapbmData(FALSE);
+
+ // swap the binding table
+ m_pdtroot->Pdtmbrs()->Pdtbind()->Pdbindnametbl()->SwapBindDescs();
+#endif // HP_BIGENDIAN
+
+ // Serialize BLK_MGR member.
+ // Save the error because we can't return until we've
+ // swapped back.
+ //
+ err = m_blkmgr.Write(pstrm);
+
+#if HP_BIGENDIAN
+ // swap bytes back
+ SwapbmData(TRUE);
+
+ // swap the binding table
+ m_pdtroot->Pdtmbrs()->Pdtbind()->Pdbindnametbl()->SwapBindDescs();
+#endif // HP_BIGENDIAN
+
+ // Now that we've swapped back, we can return the Write error,
+ // if any.
+ //
+ IfErrRet(err);
+
+ // serialize TYPE_DATA meta-info, namely list counts and heads.
+ IfErrRet(pstrm->WriteUShort(m_cMeth));
+ IfErrRet(pstrm->WriteUShort(m_cDataMember));
+ IfErrRet(pstrm->WriteUShort(m_cBase));
+ IfErrRet(pstrm->WriteUShort(m_cNestedType));
+ IfErrRet(pstrm->WriteUShort(m_hdefnFirstMeth));
+ IfErrRet(pstrm->WriteUShort(m_hdefnFirstDataMbrNestedType));
+ IfErrRet(pstrm->WriteUShort(m_hdefnFirstBase));
+ IfErrRet(pstrm->WriteUShort(m_hdefnLastMeth));
+ IfErrRet(pstrm->WriteUShort(m_hdefnLastDataMbrNestedType));
+ IfErrRet(pstrm->WriteUShort(m_hdefnLastBase));
+ IfErrRet(pstrm->WriteUShort(m_htdefnAlias));
+ IfErrRet(pstrm->WriteUShort(m_hmvdefnPredeclared));
+ IfErrRet(pstrm->WriteULong(m_uHelpContextBase));
+ IfErrRet(pstrm->WriteUShort((USHORT)m_isSimpleTypeAlias));
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC TYPE_DATA::Read - Deserialize an instance.
+*Purpose:
+* Deserialize an instance.
+*
+*Implementation Notes:
+* (See Write for layout).
+*
+*Entry:
+* pstrm - Pointer to stream to read from (IN).
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::Read(STREAM *pstrm)
+{
+ USHORT isSimpleTypeAlias;
+ TIPERROR err;
+
+ DebAssert(pstrm != NULL, "bad param.");
+
+ // Deserialize BLK_MGR member.
+ IfErrRet(m_blkmgr.Read(pstrm));
+
+ // serialize TYPE_DATA meta-info, namely list counts and heads.
+ IfErrRet(pstrm->ReadUShort(&m_cMeth));
+ IfErrRet(pstrm->ReadUShort(&m_cDataMember));
+ IfErrRet(pstrm->ReadUShort(&m_cBase));
+ IfErrRet(pstrm->ReadUShort(&m_cNestedType));
+ IfErrRet(pstrm->ReadUShort(&m_hdefnFirstMeth));
+ IfErrRet(pstrm->ReadUShort(&m_hdefnFirstDataMbrNestedType));
+ IfErrRet(pstrm->ReadUShort(&m_hdefnFirstBase));
+ IfErrRet(pstrm->ReadUShort(&m_hdefnLastMeth));
+ IfErrRet(pstrm->ReadUShort(&m_hdefnLastDataMbrNestedType));
+ IfErrRet(pstrm->ReadUShort(&m_hdefnLastBase));
+ IfErrRet(pstrm->ReadUShort(&m_htdefnAlias));
+ IfErrRet(pstrm->ReadUShort(&m_hmvdefnPredeclared));
+ IfErrRet(pstrm->ReadULong(&m_uHelpContextBase));
+ IfErrRet(pstrm->ReadUShort(&isSimpleTypeAlias));
+ m_isSimpleTypeAlias = isSimpleTypeAlias; // update bitfield
+
+ DebAssert(Pdtroot()->CompState() == CS_DECLARED,
+ " Should be in Declared State ");
+
+#if HP_BIGENDIAN
+ // for OLE swap all defns
+ SwapbmData(TRUE);
+#endif // HP_BIGENDIAN
+
+ return TIPERR_None;
+}
+
+
+#if HP_BIGENDIAN
+
+/***
+*PRIVATE TYPE_DATA::SwapbmData
+*Purpose:
+* Swap TYPE_DATA defns for mac serialization (typelib only)
+*
+*Entry:
+* fSwapFirst - do the defns need to be swapped _before_ the links
+* are followed?
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+*Implementation Notes:
+* traverses the member, method and base lists of the TYPE_DATA,
+* swapping all DEFNs
+*
+***********************************************************************/
+
+VOID TYPE_DATA::SwapbmData(BOOL fSwapFirst)
+{
+ HMBR_VAR_DEFN hmvdefn;
+ DEFN *qdefn;
+ USHORT usDefnkind;
+ sDEFNKIND defnkind;
+
+
+ // swap the data member MBR_VAR_DEFNs
+ for (hmvdefn = (HMBR_VAR_DEFN)HdefnFirstDataMbrNestedType();
+ hmvdefn != HMBRVARDEFN_Nil;) {
+
+ qdefn = QdefnOfHdefn(hmvdefn);
+
+ // 3 BIT Hack::
+ // Before we can correctly swap the DEFN we need to
+ // know the "kind" of the defn. To find the "kind" we might have to
+ // swap the first byte of the DEFN if the defn is already
+ // swapped (i.e. fSwapFirst == TRUE)
+ //
+ // if we need to swap first then swap defnkind.
+ if (fSwapFirst) {
+ SwapStruct(qdefn, "s");
+ usDefnkind = qdefn->Defnkind();
+ // swap back the first word of the defn.
+ SwapStruct(qdefn, "s");
+ defnkind = (DEFNKIND)usDefnkind;
+ }
+ else {
+ defnkind = qdefn->Defnkind();
+ }
+
+
+ if ((DEFNKIND) defnkind == DK_RecTypeDefn) {
+ hmvdefn = (HMBR_VAR_DEFN)SwapRectypeDefnOfHrtdefn((HVAR_DEFN)hmvdefn,
+ fSwapFirst, TRUE);
+
+ }
+ else {
+
+ DebAssert((DEFNKIND) defnkind == DK_VarDefn ||
+ (DEFNKIND) defnkind == DK_MbrVarDefn , " bad defn kind ");
+
+ hmvdefn = (HMBR_VAR_DEFN)SwapVarDefnOfHvdefn((HVAR_DEFN)hmvdefn,
+ fSwapFirst);
+ }
+ }
+
+ // swap the base list MBR_VAR_DEFNs
+ for(hmvdefn = (HMBR_VAR_DEFN)HvdefnFirstBase();
+ hmvdefn != HMBRVARDEFN_Nil;
+ hmvdefn = (HMBR_VAR_DEFN)SwapVarDefnOfHvdefn((HVAR_DEFN)hmvdefn,
+ fSwapFirst));
+
+ // swap the method FUNC_DEFNs
+ SwapAllFuncDefns(fSwapFirst);
+
+ // swap the predeclared MBR_VAR_DEFN, if any
+ hmvdefn = m_hmvdefnPredeclared;
+ if (hmvdefn != HMBRVARDEFN_Nil) {
+ hmvdefn = (HMBR_VAR_DEFN)SwapVarDefnOfHvdefn((HVAR_DEFN)hmvdefn,
+ fSwapFirst);
+ DebAssert(hmvdefn == HMBRVARDEFN_Nil, ""); // shouldn't be a chain
+ }
+ if (Pdtroot()->Pgdtinfo()->GetTypeKind() == TKIND_ALIAS && !m_isSimpleTypeAlias) {
+ DebAssert(m_htdefnAlias != (sHTYPE_DEFN)HTYPEDEFN_Nil, "");
+ SwapTypeDefnOfHtdefn(m_htdefnAlias, fSwapFirst);
+ }
+}
+
+
+/***
+*PRIVATE TYPE_DATA::SwapAllFuncDefns
+*Purpose:
+* Swap TYPE_DATA funcdefns for mac serialization (typelib only)
+*
+*Entry:
+* fSwapFirst - do the defns need to be swapped _before_ the links
+* are followed?
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+*Implementation Notes:
+* traverses the method list of the TYPE_DATA, swapping all FUNC_DEFNs
+*
+***********************************************************************/
+
+VOID TYPE_DATA::SwapAllFuncDefns(BOOL fSwapFirst)
+{
+ HFUNC_DEFN hfdefn;
+
+ for (hfdefn = HfdefnFirstMeth();
+ hfdefn != HFUNCDEFN_Nil;
+ hfdefn = SwapFuncDefnOfHfdefn(hfdefn, fSwapFirst));
+}
+
+
+/***
+*PUBLIC TYPE_DATA::SwapVarDefnOfHvdefn
+*Purpose:
+* Swap a VAR_DEFN (or MBR_VAR_DEFN) for mac serialization
+*
+*Entry:
+* hvdefn - handle to the VAR_DEFN (or MBR_VAR_DEFN)
+* fSwapFirst - do the defns need to be swapped _before_ the links
+* are followed?
+*
+*Exit:
+* returns a handle to the next VAR_DEFN in the list
+*
+*Errors:
+* NONE.
+*
+* HVARDEFN_Nil is invalid input!
+*
+***********************************************************************/
+
+HVAR_DEFN TYPE_DATA::SwapVarDefnOfHvdefn(HVAR_DEFN hvdefn, BOOL fSwapFirst)
+{
+ HVAR_DEFN hvdefnNext;
+ VAR_DEFN *qvdefn;
+ BYTE *pbConst, *pbVariantConst;
+ TYPEDESCKIND tdesckind;
+ HST hstDocumentation;
+ USHORT usDefnkind;
+ BOOL fHasV2Flags;
+
+ DebAssert(hvdefn != HVARDEFN_Nil, "Can't swap HVARDEFN_Nil");
+
+ Lock();
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+
+ if (fSwapFirst) {
+
+ // swap either the MBR_VAR_DEFN or the VAR_DEFN
+
+ // first get & un-swap defnkind so we can figure out which one this is
+ SwapStruct(qvdefn, "s");
+ usDefnkind = qvdefn->Defnkind();
+ fHasV2Flags = qvdefn->HasV2Flags();
+ // swap back the first word of the defn.
+ SwapStruct(qvdefn, "s");
+
+ // can't use IsMemberVarDefn() here, because m_defnkind is swapped
+ if ((DEFNKIND) usDefnkind == DK_MbrVarDefn) {
+ SwapStruct((BYTE *)qvdefn, fHasV2Flags ? MBR_VAR_DEFN_V2_LAYOUT:
+ MBR_VAR_DEFN_LAYOUT);
+ }
+ else {
+
+ // swap the VAR_DEFN structure
+ SwapStruct(qvdefn, VAR_DEFN_LAYOUT);
+ }
+
+ // swap the TYPE_DEFN if necessary
+ if (!qvdefn->IsSimpleType()
+ && qvdefn->Htdefn() != HTYPEDEFN_Nil) {
+ SwapTypeDefnOfHtdefn(qvdefn->Htdefn(), fSwapFirst);
+ }
+ }
+
+ // in this section, we have a defn with the correct byte ordering
+
+ DebAssert(qvdefn->IsVarDefn(),
+ "SwapVarDefn: MUST be a VAR_DEFN or MBR_VAR_DEFN");
+
+ hvdefnNext = qvdefn->HdefnNext();
+
+ // swap the length-prefix of the documentation string, if any
+ if ((hstDocumentation = qvdefn->HstDocumentation()) != HST_Nil)
+ SwapStruct((BYTE *)m_blkmgr.QtrOfHandle(hstDocumentation), "l");
+
+ // swap the help context if it is a HCHUNK guy
+ if (qvdefn->IsMemberVarDefn()) {
+ WORD wHelpContext;
+ HCHUNK hchunk;
+ // if there was some encoded string then check/free any space allocated
+ // for the previous help context.
+ wHelpContext = ((MBR_VAR_DEFN *)qvdefn)->WHelpContext();
+
+ if(IsHchunk(wHelpContext)) {
+ // Get the hchunk
+ hchunk = GetHchunk(wHelpContext);
+
+ // check if the hchunk stored is valid. if all top 15 bits are 1 then
+ // it is HCHUNK_Nil and we do not have to swap it. Otherwise swap the
+ // hchunk's data
+ if (hchunk != 0xfffe) {
+ SwapStruct(m_blkmgr.QtrOfHandle(hchunk), "l");
+ }
+ }
+ }
+
+ // swap the constant if it's not a simple constant
+ if (qvdefn->HasConstVal() && !qvdefn->IsSimpleConst()) {
+ // NOTE: there isn't necessarily a const val to swap
+ // if the module hasn't been compiled.
+ //
+ if ((pbConst = PbConstVal(this, qvdefn)) != NULL) {
+
+ // what is the type?
+ if (qvdefn->IsSimpleType()) {
+ tdesckind = qvdefn->QtdefnOfSimpleType()->Tdesckind();
+ }
+ else {
+ tdesckind = QtdefnOfHtdefn(qvdefn->Htdefn())->Tdesckind();
+ }
+ DebAssert(IsSimpleType(tdesckind), "tdesckind must be simple");
+
+ // do any necessary swapping based on the type
+ switch(tdesckind) {
+
+ case TDESCKIND_Uint: // INT's are I4's on the mac & NT. We know we
+ case TDESCKIND_Int: // aren't dealing with an win16 typelib/project
+ // because I2 constants are stored as simple
+ // constants.
+ case TDESCKIND_HResult:
+ case TDESCKIND_Error:
+ case TDESCKIND_Bool:
+ case TDESCKIND_UI4:
+ case TDESCKIND_I4:
+ case TDESCKIND_R4:
+ SwapStruct(pbConst, "l"); // swap 4 bytes
+ break;
+
+ // strings are prefixed by a SHORT, indicating string length
+ case TDESCKIND_String:
+ SwapStruct(pbConst, "s"); // swap 2 bytes
+ break;
+
+ case TDESCKIND_R8:
+ case TDESCKIND_Date:
+ case TDESCKIND_Currency:
+ // swap 8 bytes
+ Swap8Bytes(pbConst);
+ break;
+
+ case TDESCKIND_Value:
+ if (fSwapFirst) {
+ // swap VARIANT structure
+ SwapStruct(pbConst, VARIANT_LAYOUT);
+ }
+ pbVariantConst = (BYTE *)&((LPVARIANT)pbConst)->iVal;
+
+ // swap more bytes based on variant type
+ switch(((LPVARIANT)pbConst)->vt) {
+ case VT_I2:
+ case VT_BOOL:
+ SwapStruct(pbVariantConst, "s");
+ break;
+
+ case VT_I4:
+ case VT_R4:
+ case VT_ERROR:
+ SwapStruct(pbVariantConst, "l");
+ break;
+
+ case VT_R8:
+ case VT_CY:
+ case VT_DATE:
+ Swap8Bytes(pbVariantConst);
+ break;
+
+ case VT_BSTR:
+ // SHORT string length follows VARIANT structure, so swap it
+ SwapStruct(pbConst + sizeof(VARIANT), "s");
+ break;
+
+ case VT_NULL:
+ // do nothing
+ break;
+
+ default:
+ DebHalt("Invalid constant variant type");
+ break;
+ }
+
+ if (!fSwapFirst) {
+ // swap VARIANT structure
+ SwapStruct(pbConst, VARIANT_LAYOUT);
+ }
+ break;
+
+ default:
+ DebHalt("Unsupported constant type");
+ break;
+
+ }
+ } // if pbConst != NULL
+ } // if hasConstVal
+
+ if (!fSwapFirst) {
+ // swap the TYPE_DEFN if necessary
+ if (!qvdefn->IsSimpleType()
+ && qvdefn->Htdefn() != HTYPEDEFN_Nil) {
+ SwapTypeDefnOfHtdefn(qvdefn->Htdefn(), fSwapFirst);
+ }
+
+ // swap the MBR_VAR_DEFN part, if necessary
+ if (qvdefn->IsMemberVarDefn()) {
+ SwapStruct((BYTE *)qvdefn,
+ qvdefn->HasV2Flags() ? MBR_VAR_DEFN_V2_LAYOUT:
+ MBR_VAR_DEFN_LAYOUT);
+ }
+ else {
+
+ // swap the VAR_DEFN structure
+ SwapStruct(qvdefn, VAR_DEFN_LAYOUT);
+ }
+ }
+
+ Unlock();
+
+ return hvdefnNext;
+}
+
+
+
+/***
+*static Swap8Bytes
+*Purpose:
+* Swap 8 bytes in place
+*
+*Entry:
+* pv - pointer to first byte
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+static VOID Swap8Bytes(void * pv)
+{
+ ULONG ulFirst, ulLast, ulTemp;
+
+ ulFirst = *(ULONG *)pv;
+ ulLast = *(ULONG *)((BYTE *)pv + 4);
+
+ // byte swap the first long, and the second long
+ // then switch the longs themselves
+ //
+ ulTemp = ((ulFirst & 0x000000FF) << 24) |
+ ((ulFirst & 0x0000FF00) << 8) |
+ ((ulFirst & 0x00FF0000) >> 8) |
+ (ulFirst >> 24);
+
+ ulFirst = ((ulLast & 0x000000FF) << 24) |
+ ((ulLast & 0x0000FF00) << 8) |
+ ((ulLast & 0x00FF0000) >> 8) |
+ (ulLast >> 24);
+
+ ulLast = ulTemp;
+
+ *(ULONG *)pv = ulFirst;
+ *(ULONG *)((BYTE *)pv + 4) = ulLast;
+}
+
+
+
+
+/***
+*PUBLIC TYPE_DATA::SwapFuncDefnOfHfdefn
+*Purpose:
+* Swap a FUNC_DEFN (or VIRTUAL_FUNC_DEFN) for mac serialization
+*
+*Entry:
+* hfdefn - handle to the FUNC_DEFN (or VIRTUAL_FUNC_DEFN)
+* fSwapFirst - do the defns need to be swapped _before_ the links
+* are followed?
+*
+*Exit:
+* returns a handle to the next FUNC_DEFN in the list
+*
+*Errors:
+* NONE.
+*
+* HFUNCDEF_Nil is invalid input!
+*
+***********************************************************************/
+
+#pragma code_seg( CS_CORE2 )
+HFUNC_DEFN TYPE_DATA::SwapFuncDefnOfHfdefn(HFUNC_DEFN hfdefn, BOOL fSwapFirst)
+{
+ HFUNC_DEFN hfdefnNext;
+ HPARAM_DEFN hparamdefn;
+ PARAM_DEFN *qparamdefn;
+ FUNC_DEFN *qfdefn;
+ PARAM_DEFN *qparamdefnNext;
+ UINT i;
+
+ DebAssert(hfdefn != HFUNCDEFN_Nil, "Can't swap HFUNCDEFN_Nil");
+
+ Lock();
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ if (fSwapFirst) {
+ SwapStruct(qfdefn, FUNC_DEFN_LAYOUT);
+ }
+
+ // In this section, we have a defn with the correct byte ordering
+ DebAssert(qfdefn->IsFuncDefn(),
+ "SwapFuncDefn: MUST be a FUNC_DEFN or VIRTUAL_FUNC_DEFN");
+
+ hfdefnNext = qfdefn->HdefnNext();
+
+ // We do not serialize the length of the encoded string in case of OLE.
+
+ // swap the help context if it is a HCHUNK guy
+ WORD wHelpContext;
+ HCHUNK hchunk;
+ // if there was some encoded string then check/free any space allocated
+ // for the previous help context.
+ wHelpContext = qfdefn->WHelpContext();
+
+ if(IsHchunk(wHelpContext)) {
+ // Get the hchunk
+ hchunk = GetHchunk(wHelpContext);
+
+ // check if the hchunk stored is valid. if all top 15 bits are 1 then
+ // it is HCHUNK_Nil and we do not have to swap it. Otherwise swap the
+ // hchunk's data
+ if (hchunk != 0xfffe) {
+ SwapStruct(m_blkmgr.QtrOfHandle(hchunk), "l");
+ }
+ }
+
+ // if necessary, swap the result TYPE_DEFN
+ //
+ if(!qfdefn->m_ftdefn.IsSimpleTypeResult() &&
+ qfdefn->m_ftdefn.HtdefnResult() != HTYPEDEFN_Nil) {
+ SwapTypeDefnOfHtdefn(qfdefn->m_ftdefn.HtdefnResult(), fSwapFirst);
+ }
+
+ // swap the PARAM_DEFNs
+ hparamdefn = (HPARAM_DEFN)qfdefn->m_ftdefn.m_hdefnFormalFirst;
+
+ // Layout of OB and OLE PARAM_DEFN(s) are different.
+ if (qfdefn->CArgsUnmunged() > 0) {
+ // We have an array of PARAM_DEFNs.
+ qparamdefn = QparamdefnOfHparamdefn(hparamdefn);
+ }
+
+ for (i=0; i < qfdefn->CArgsUnmunged(); i++) {
+
+ DebAssert(qfdefn->CArgsUnmunged(), " # of arg should be > 0");
+
+ if (fSwapFirst) {
+ SwapStruct((BYTE *)qparamdefn, PARAM_DEFN_LAYOUT);
+ }
+
+ // swap the TYPE_DEFN if necessary
+ if (!qparamdefn->IsSimpleType() &&
+ qparamdefn->Htdefn() != HTYPEDEFN_Nil) {
+ SwapTypeDefnOfHtdefn(qparamdefn->Htdefn(), fSwapFirst);
+ }
+
+ qparamdefnNext = qparamdefn->QparamdefnNext();
+
+ if (!fSwapFirst) {
+ SwapStruct((BYTE *)qparamdefn, PARAM_DEFN_LAYOUT);
+ }
+
+ qparamdefn = qparamdefnNext;
+ }
+
+ // Note: DllEntryDefns are swapped by entrymgr and hence we do not have
+ // to do it here.
+
+ // swap the extra V2 flags word if it's present
+ if (qfdefn->HasV2Flags()) {
+ SwapStruct(((BYTE*)qfdefn + sizeof(FUNC_DEFN) - sizeof(USHORT)),
+ FUNC_DEFN_V2FLAGS_LAYOUT);
+ }
+
+ // if it's a VIRTUAL_FUNC_DEFN, swap the non-FUNC_DEFN
+ // part of the structure
+ //
+ if (qfdefn->IsVirtualFuncDefn()) {
+ SwapStruct((BYTE *)qfdefn + sizeof(FUNC_DEFN), VIRTUAL_FUNC_DEFN_LAYOUT);
+ }
+
+ if (!fSwapFirst) {
+ SwapStruct(qfdefn, FUNC_DEFN_LAYOUT);
+ }
+
+ Unlock();
+ return hfdefnNext;
+}
+#pragma code_seg( )
+
+
+
+/***
+*PUBLIC TYPE_DATA::SwapTypeDefnOfHtdefn
+*Purpose:
+* Swap a TYPE_DEFN for mac serialization
+*
+*Implementation Notes:
+* defers to SwapTypeDefnOfQtdefn
+*
+*Entry:
+* htdefn - handle to the TYPE_DEFN
+* fSwapFirst - do the defns need to be swapped _before_ the links
+* are followed?
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+* HTYPEDEFN_Nil is invalid input!
+*
+***********************************************************************/
+
+VOID TYPE_DATA::SwapTypeDefnOfHtdefn(HTYPE_DEFN htdefn, BOOL fSwapFirst)
+{
+ DebAssert(htdefn != HTYPEDEFN_Nil, "Can't swap HTYPEDEFN_Nil" );
+
+ Lock();
+ SwapTypeDefnOfQtdefn(QtdefnOfHtdefn(htdefn), fSwapFirst);
+ Unlock();
+}
+
+
+
+/***
+*PRIVATE TYPE_DATA::SwapTypeDefnOfQtdefn
+*Purpose:
+* Swap a TYPE_DEFN for mac serialization
+*
+*Implementation Notes:
+* Does a 'deep swap' of the TYPE_DEFN - possibly recursive.
+* Note that a qointer is passed to this routine -
+* TYPE_DATA must be locked!!! (there really isn't a reason why this
+* routine should be called by anything other than SwapTypeDefnOfHtdefn
+* so this shouldn't be a problem)
+*
+*Entry:
+* qtdefn - qointer to the TYPE_DEFN
+* fSwapFirst - do the defns need to be swapped _before_ the links
+* are followed?
+*
+*Exit:
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+VOID TYPE_DATA::SwapTypeDefnOfQtdefn(TYPE_DEFN *qtdefn, BOOL fSwapFirst)
+{
+ BYTE * pbFollowing;
+ SAFEARRAY *qad;
+ UINT i;
+
+ pbFollowing = (BYTE *)qtdefn + sizeof(TYPE_DEFN);
+
+ if (fSwapFirst) {
+ // swap the TYPE_DEFN structure
+ SwapStruct(qtdefn, TYPE_DEFN_LAYOUT);
+ }
+
+ // in this section, we have a defn with the correct byte ordering
+
+ // determine if any other swapping has to be done based on
+ // the tdesckind (see defn.hxx)
+ //
+ switch (qtdefn->Tdesckind()) {
+
+ case TDESCKIND_Ptr:
+ // the TYPE_DEFN following specifies the type being pointed to
+ SwapTypeDefnOfQtdefn((TYPE_DEFN *)pbFollowing, fSwapFirst);
+ break;
+
+ case TDESCKIND_UserDefined:
+ // swap the sHIMPTYPE following
+ SwapStruct(pbFollowing, "s");
+ break;
+
+ case TDESCKIND_Carray:
+ case TDESCKIND_BasicArray:
+
+ if (fSwapFirst) {
+ // swap following sHARRAY_DESC
+ SwapStruct(pbFollowing, "s");
+ }
+
+ qad = QarraydescOfHarraydesc(*(sHARRAY_DESC *)pbFollowing);
+
+ // swap array descriptor
+ if (fSwapFirst) {
+ SwapStruct(qad, AD_LAYOUT);
+ }
+ for (i=0; i < qad->cDims; i++) {
+ SwapStruct(&qad->rgsabound[i], DD_LAYOUT);
+ }
+ if (!fSwapFirst) {
+ SwapStruct(qad, AD_LAYOUT);
+ }
+
+ // swap array TYPE_DEFN
+ SwapTypeDefnOfQtdefn((TYPE_DEFN *)(pbFollowing + sizeof(sHARRAY_DESC)),
+ fSwapFirst);
+
+ if (!fSwapFirst) {
+ // swap following sHARRAY_DESC
+ SwapStruct(pbFollowing, "s");
+ }
+ break;
+ }
+
+ if (!fSwapFirst) {
+ // swap the TYPE_DEFN structure
+ SwapStruct(qtdefn, TYPE_DEFN_LAYOUT);
+ }
+}
+
+
+/***
+*PUBLIC TYPE_DATA::SwapRectypeDefnOfHrtdefn
+*Purpose:
+* Swap a RECTYPE_DEFN for mac serialization
+*
+*Entry:
+* hrtdefn - handle to the RECTYPE_DEFN
+* fSwapFirst - do the defns need to be swapped _before_ the links
+* are followed?
+*
+*Exit:
+* returns a handle to the next RECTYPE_DEFN in the list
+*
+*Errors:
+* NONE.
+*
+* HRECTYPEDEFN_Nil is invalid input!
+*
+***********************************************************************/
+
+HRECTYPE_DEFN TYPE_DATA::SwapRectypeDefnOfHrtdefn(HRECTYPE_DEFN hrtdefn,
+ BOOL fSwapFirst,
+ BOOL fSwapVarDefns)
+{
+ RECTYPE_DEFN *qrtdefn;
+ HRECTYPE_DEFN hrtdefnNext;
+ HVAR_DEFN hvdefn;
+
+ DebAssert(hrtdefn != HRECTYPEDEFN_Nil, "Can't swap HRECTYPEDEFN_Nil" );
+
+ Lock();
+ qrtdefn = QrtdefnOfHrtdefn(hrtdefn);
+
+ if (fSwapFirst) {
+ SwapStruct(qrtdefn, RECTYPE_DEFN_LAYOUT);
+
+ // if TYPE_DATA is swapping then swap the contained var defns.
+ if (fSwapVarDefns) {
+ // walk the list of var defns and swap them.
+ // swap the base list MBR_VAR_DEFNs
+ for (hvdefn = (HVAR_DEFN)qrtdefn->HvdefnFirstMember();
+ hvdefn != HVARDEFN_Nil;
+ hvdefn = (HVAR_DEFN)SwapVarDefnOfHvdefn((HVAR_DEFN)hvdefn,
+ fSwapFirst));
+
+ }
+
+ }
+
+ hrtdefnNext = (HRECTYPE_DEFN)qrtdefn->HdefnNext();
+
+ if (!fSwapFirst) {
+
+ // if TYPE_DATA is swapping then swap the contained var defns.
+ if (fSwapVarDefns) {
+ // walk the list of var defns and swap them.
+ // swap the base list MBR_VAR_DEFNs
+ for (hvdefn = (HVAR_DEFN)qrtdefn->HvdefnFirstMember();
+ hvdefn != HVARDEFN_Nil;
+ hvdefn = (HVAR_DEFN)SwapVarDefnOfHvdefn((HVAR_DEFN)hvdefn,
+ fSwapFirst));
+ }
+
+ SwapStruct(qrtdefn, RECTYPE_DEFN_LAYOUT);
+
+ }
+
+ Unlock();
+
+ return hrtdefnNext;
+}
+
+#endif // HP_BIGENDIAN
+
+
+/***
+*PRIVATE TYPE_DATA::Alloc[--]Defn - Allocate a some kind of DEFN
+*Purpose:
+* The following functions all share the same macro
+* template that allocates some sort of structure
+* in this TYPE_DATA's block.
+*
+*Implementation Notes:
+*
+*Entry:
+* Pointer to handle of the structure (OUT).
+*
+*Exit:
+* Produces handle.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+// Here's the macro.
+// It's pretty straightforward.
+// Note the syntax for constructing an instance
+// at a particular location.
+//
+#define ALLOCSTRUCT(type,phandle,fV2) \
+ TIPERROR err; \
+ HCHUNK hchunk; \
+ DebAssert(phandle != NULL, "AllocStruct: phandle is NULL"); \
+ IfErrGo(m_blkmgr.AllocChunk(&hchunk, fV2 ? sizeof(type): (sizeof(type) - sizeof(USHORT)) )); \
+ new (QdefnOfHdefn(hchunk)) type; \
+ *phandle = (sH ## type)hchunk; \
+ return TIPERR_None; \
+Error: \
+ *phandle = (sHCHUNK)HCHUNK_Nil; \
+ return err
+
+TIPERROR TYPE_DATA::AllocMbrVarDefn(sHMBR_VAR_DEFN *phmvdefn, BOOL fV2Flags)
+{
+ ALLOCSTRUCT(MBR_VAR_DEFN,phmvdefn, fV2Flags);
+}
+
+
+TIPERROR TYPE_DATA::AllocFuncDefn(sHFUNC_DEFN *phfdefn, BOOL fV2Flags)
+{
+ ALLOCSTRUCT(FUNC_DEFN,phfdefn, fV2Flags);
+}
+
+TIPERROR TYPE_DATA::AllocVirtualFuncDefn(sHVIRTUAL_FUNC_DEFN *phvfdefn,
+ BOOL fV2Flags)
+{
+ ALLOCSTRUCT(VIRTUAL_FUNC_DEFN,phvfdefn, fV2Flags);
+}
+
+
+
+
+
+/***
+*PRIVATE TYPE_DATA::AllocTypeDefn - Allocate a TYPE_DEFN
+*Purpose:
+* Allocate a TYPE_DEFN.
+*
+*Implementation Notes:
+*
+*Entry:
+* UINT cTypes - number of simple type defns passed in
+* USHORT rgtdesckind - array of tdesckinds
+* (this was TYPEDESCKIND, but a CFront bug forces it to USHORT)
+* sHTYPE_DEFN *phtdefn - pointer to tdefn handle (OUT)
+*
+*Exit:
+* Produces TYPE_DEFN handle.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR TYPE_DATA::AllocTypeDefn(UINT cTypes,
+ TYPEDESCKIND rgtdesckind[],
+ sHTYPE_DEFN *phtdefn)
+{
+ TIPERROR err;
+ HCHUNK hchunk;
+
+ DebAssert(phtdefn != NULL, "AllocTypeDefn: phtdefn is NULL");
+
+ IfErrRet(m_blkmgr.AllocChunk(&hchunk,
+ SizeTypeDefnOfTDescKind(cTypes, rgtdesckind)));
+ *phtdefn = (sHTYPE_DEFN)hchunk;
+ new (QtdefnOfHtdefn(*phtdefn)) TYPE_DEFN;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+
+/***
+*PRIVATE TYPE_DATA::AllocArrayDescriptor - Allocate an array descriptor.
+*Purpose:
+* Allocate an array descriptor.
+*
+*Implementation Notes:
+*
+*Entry:
+* pharraydesc - Pointer to handle of array descriptor (OUT).
+*
+*Exit:
+* Produces array descriptor handle.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+TIPERROR TYPE_DATA::AllocArrayDescriptor(UINT uNDim, sHARRAY_DESC *pharraydesc)
+{
+ ULONG uSize;
+ TIPERROR err;
+ HCHUNK hchunk;
+
+ DebAssert(pharraydesc != NULL, "AllocArrayDescriptor: pharraydesc is NULL");
+
+ uSize = CbSizeArrayDesc(uNDim);
+ IfErrRet(m_blkmgr.AllocChunk(&hchunk, (UINT)uSize));
+ *pharraydesc = (sHARRAY_DESC)hchunk;
+ rtArrayInit( QarraydescOfHarraydesc(*pharraydesc), uNDim );
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+
+/***
+*PUBLIC TYPE_DATA::HdefnOfHmember - Map HMEMBER to HDEFN
+*Purpose:
+* Map HMEMBER to HDEFN.
+*
+*Implementation Notes:
+* For OLE the hmember is just the hdefn with the low bit twiddled for
+* functions, except for BASIC and TKIND_DISPATCH which just linear search.
+* The tricky one is for TKIND_INTERFACE, DISPID_VALUE which is zero.
+* For this we cached the hfdefn in m_hfdefnValue. Note that this can't be a
+* hvardefn because TKIND_INTERFACE can't have them.
+*
+*Entry:
+* hmember - Handle of member we want (IN).
+*
+*Exit:
+* *pdefnkind - kind
+* returns hdefn of hmember (returns a VARDEFN or a FUNCDEFN only)
+* HCHUNK_Nil if unsuccessful.
+*
+*Errors:
+* None.
+*
+***********************************************************************/
+
+HDEFN TYPE_DATA::HdefnOfHmember(HMEMBER hmember, UINT *pdefnkind)
+{
+ HDEFN hdefn;
+ DebAssert(hmember != DISPID_UNKNOWN, "which defn do you want?");
+
+ // do linear search on defns
+ // Check variables first.
+ // Let's see if this is a vardefn?
+ //
+ hdefn = (HDEFN) HmvdefnOfHmember(hmember);
+
+ if (hdefn != HDEFN_Nil) {
+ // yes, it's a vardefn
+ DebAssert(QdefnOfHdefn(hdefn)->IsVarDefn(), "Bad defn kind");
+ *pdefnkind = DK_VarDefn;
+ }
+ else {
+ // well, a funcdefn then?
+ hdefn = (HDEFN) HfdefnOfHmember(hmember);
+ if (hdefn != HDEFN_Nil) {
+ *pdefnkind = DK_FuncDefn;
+ }
+ }
+
+ return hdefn;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::HfdefnOfHmember - Map HMEMBER to HFUNC_DEFN
+*Purpose:
+* Map HMEMBER to HFUNC_DEFN.
+*
+*Implementation Notes:
+* Walk funcdefn list searching for matching hmember.
+*
+*Entry:
+* hmember - Handle of function member we want (IN).
+* fInvokekind - The invoke kind of the function we want to bind to.
+* (one of INVOKE_FUNC, INVOKE_PROPGET, INVOKE_PROPPUT,
+* INVOKE_PROPPUTREF).
+* The default value for this parm (if it is omitted)
+* contains all invoke kind(s), which causes us to return
+* the first function with the give hmember (used when
+* we don't care about the invoke kind).
+*
+*Exit:
+* Returns HFUNC_DEFN of FUNC_DEFN describing function or
+* HCHUNK_Nil if unsuccessful.
+*
+*Errors:
+* None.
+*
+***********************************************************************/
+HFUNC_DEFN TYPE_DATA::HfdefnOfHmember(HMEMBER hmember,
+ UINT fInvokekind) const
+{
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *pfdefn;
+
+
+ // at least one of the interesting bits must be set
+ DebAssert((fInvokekind & (INVOKE_FUNC | INVOKE_PROPERTYGET | INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF)) != 0, "invalid invoke flags");
+
+ // For ole ITypeInfos where we computed the id, the hmember is just the
+ // hdefn in the loword and a bit set in the hiword for functions.
+ // Special case of the Value parameter of TKIND_INTERFACE
+ //
+ DebAssert(DISPID_VALUE == 0, "dispid value must be 0 else weirdness");
+ if (hmember == DISPID_VALUE) {
+ if (Pdtroot()->Pgdtinfo()->GetTypeKind() == TKIND_INTERFACE) {
+ // get cached defn, if any
+ hfdefn = m_hfdefnValue;
+ if (hfdefn == HDEFN_Nil) {
+ return hfdefn;
+ }
+ goto short_circuit; // for property functions, this will be the
+ // first hfdefn with the given id. So use
+ // our "shortcut" method to skip into the loop
+ }
+ }
+
+
+ hfdefn = m_hdefnFirstMeth;
+ while (hfdefn != HFUNCDEFN_Nil) {
+short_circuit:
+ pfdefn = QfdefnOfHfdefn(hfdefn);
+ if (pfdefn->Hmember() == hmember && pfdefn->InvokeKind() & fInvokekind) {
+ return hfdefn;
+ }
+ hfdefn = pfdefn->HdefnNext();
+ }
+
+ // couldn't find it...
+ return HFUNCDEFN_Nil;
+}
+
+
+
+
+/***
+*PUBLIC TYPE_DATA::HvdefnPredeclared.
+*Purpose:
+* returns the predeclared VAR_DEFN
+*
+*Entry:
+* None.
+*
+*Exit:
+* HVAR_DEFN
+*
+***********************************************************************/
+
+HVAR_DEFN TYPE_DATA::HvdefnPredeclared() const
+{
+ return m_hmvdefnPredeclared;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::SetHvdefnPredeclared.
+*Purpose:
+* Sets the predeclared VAR_DEFN
+* NOTE: lsb reserved to indicate IsSimpleTypeAlias
+*
+*Entry:
+* None.
+*
+*Exit:
+*
+***********************************************************************/
+#pragma code_seg( CS_CORE2 )
+VOID TYPE_DATA::SetHvdefnPredeclared(HVAR_DEFN hvdefnPredeclared)
+{
+ m_hmvdefnPredeclared = (sHMBR_VAR_DEFN)hvdefnPredeclared;
+}
+#pragma code_seg( )
+
+
+
+
+/***
+*PUBLIC TYPE_DATA::HmvdefnOfHmember - Map HMEMBER to HMBRVAR_DEFN
+*Purpose:
+* Map HMEMBER to HMBRVAR_DEFN.
+*
+*Implementation Notes:
+* Walk vardefn list searching for matching hmember.
+*NOTE: only works for OLE typeinfos
+*
+*Entry:
+* hmember - Handle of data member we want (IN).
+*
+*Exit:
+* Returns HMBRVAR_DEFN of MBRVAR_DEFN describing data member or
+* HVARDEFN_Nil if unsuccessful.
+*
+*Errors:
+* None.
+*
+***********************************************************************/
+
+HMBR_VAR_DEFN TYPE_DATA::HmvdefnOfHmember(HMEMBER hmember) const
+{
+ HMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+
+ if (hmember == ID_DEFAULTINST) {
+ // special case of the id for the pre-declared identifier.
+ return HvdefnPredeclared();
+ }
+
+
+ hmvdefn = HdefnFirstDataMbrNestedType();
+ while (hmvdefn != HMBRVARDEFN_Nil) {
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ DebAssert(qmvdefn->IsMemberVarDefn(), "Bad defn kind");
+ if (qmvdefn->Hmember() == hmember) {
+ break;
+ } else {
+ hmvdefn = qmvdefn->HdefnNext();
+ }
+ }
+
+ return hmvdefn;
+}
+
+
+#if ID_DEBUG
+
+
+
+/***
+*PUBLIC TYPE_DATA::DebCheckState - check TYPE_DATA state
+*Purpose:
+* Check TYPE_DATA state
+*
+*Implementation Notes:
+* Defers to embedded BLK_MGR method.
+*
+*Entry:
+* uLevel Check level.
+*
+*Exit:
+*
+*Errors:
+* Asserts on failures.
+*
+**********************************************************************/
+
+VOID TYPE_DATA::DebCheckState(UINT uLevel) const
+{
+ HDEFN hdefn;
+
+ m_blkmgr.DebCheckState(uLevel);
+
+ // check member lists
+ if (uLevel > 0) {
+ DebAssert((m_hdefnFirstMeth == HDEFN_Nil) ||
+ (m_cMeth == ::Count((TYPE_DATA *)this, m_hdefnFirstMeth)),
+ "bad func list.");
+
+ DebAssert((m_hdefnFirstDataMbrNestedType == HDEFN_Nil) ||
+ ((USHORT)(m_cDataMember + m_cNestedType) ==
+ ::Count((TYPE_DATA *)this, m_hdefnFirstDataMbrNestedType)),
+ "bad var list.");
+
+ DebAssert((m_hdefnFirstBase == HDEFN_Nil) ||
+ (m_cBase == ::Count((TYPE_DATA *)this, m_hdefnFirstBase)),
+ "bad base list.");
+
+ hdefn = m_hdefnFirstMeth;
+ while (hdefn != HDEFN_Nil) {
+ DebCheckDefn(hdefn);
+ hdefn = QdefnOfHdefn(hdefn)->HdefnNext();
+ }
+
+ hdefn = m_hdefnFirstDataMbrNestedType;
+ while (hdefn != HDEFN_Nil) {
+ DebCheckDefn(hdefn);
+ hdefn = QdefnOfHdefn(hdefn)->HdefnNext();
+ }
+
+ hdefn = m_hdefnFirstBase;
+ while (hdefn != HDEFN_Nil) {
+ DebCheckDefn(hdefn);
+ hdefn = QdefnOfHdefn(hdefn)->HdefnNext();
+ }
+ }
+}
+
+
+/***
+*PUBLIC TYPE_DATA::DebCheck*Defn - check TYPE_DATA Defns
+*Purpose:
+* Check TYPE_DATA Defn
+*
+*Implementation Notes:
+* DebCheckDefn should not be called for DLLENTRY_DEFNs, for these
+* DebCheckDllentryDefn should be called directly.
+*
+*Entry:
+* HDEFN handle of defn to check. Note we switch off defnkind.
+*
+*Exit:
+*
+*Errors:
+* Asserts on failures.
+*
+**********************************************************************/
+
+VOID TYPE_DATA::DebCheckVarDefn(HVAR_DEFN hvdefn) const
+{
+ VAR_DEFN *qvdefn;
+
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+
+ DebAssert(qvdefn->IsPublic() || qvdefn->IsPrivate(), "bad access.");
+ if (qvdefn->HasConstVal()) {
+ DebAssert(qvdefn->IsDataMember() ||
+ qvdefn->IsEnumerator(),
+ "only locals, datamembers, enumerators can be constants.");
+ }
+
+ if (qvdefn->IsStatic()) {
+ DebAssert(qvdefn->IsDataMember() ||
+ qvdefn->IsEnumerator(),
+ "only locals, datamembers, enumerators can be static.");
+ }
+}
+
+VOID TYPE_DATA::DebCheckParamDefn(HPARAM_DEFN hparamdefn) const
+{
+}
+
+
+VOID TYPE_DATA::DebCheckMbrVarDefn(HMBR_VAR_DEFN hmvdefn) const
+{
+ DebCheckVarDefn((HVAR_DEFN)hmvdefn); // check the vardefn part
+ // CONSIDER: any more state consistency to check here?
+}
+
+
+VOID TYPE_DATA::DebCheckFuncDefn(HFUNC_DEFN hfdefn) const
+{
+ FUNC_DEFN *qfdefn;
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ DebAssert(qfdefn->IsPublic() || qfdefn->IsPrivate(),
+ "should be public or private.");
+ DebCheckFuncTypeDefn(qfdefn->m_ftdefn);
+}
+
+
+VOID TYPE_DATA::DebCheckVirtualFuncDefn(HVIRTUAL_FUNC_DEFN hvfdefn) const
+{
+ DebCheckFuncDefn((HFUNC_DEFN)hvfdefn); // check funcdefn part
+ // CONSIDER: anything else to check?
+}
+
+
+VOID TYPE_DATA::DebCheckFuncTypeDefn(FUNC_TYPE_DEFN ftdefn) const
+{
+}
+
+
+VOID TYPE_DATA::DebCheckRecTypeDefn(HRECTYPE_DEFN hrtdefn) const
+{
+ UINT cMember;
+ RECTYPE_DEFN *qrtdefn = QrtdefnOfHrtdefn(hrtdefn);
+
+ cMember = ::Count((TYPE_DATA *)this, qrtdefn->HvdefnFirstMember());
+ DebAssert(cMember < USHRT_MAX, "bad list.");
+}
+
+
+VOID TYPE_DATA::DebCheckDefn(HDEFN hdefn) const
+{
+ DEFN *qdefn;
+
+ if (hdefn != HDEFN_Nil) {
+ qdefn = QdefnOfHdefn(hdefn);
+ switch (qdefn->Defnkind()) {
+ case DK_VarDefn:
+ DebCheckVarDefn(hdefn);
+ break;
+ case DK_ParamDefn:
+ DebCheckParamDefn(hdefn);
+ break;
+ case DK_MbrVarDefn:
+ DebCheckMbrVarDefn(hdefn);
+ break;
+ case DK_FuncDefn:
+ DebCheckFuncDefn(hdefn);
+ break;
+ case DK_VirtualFuncDefn:
+ DebCheckVirtualFuncDefn(hdefn);
+ break;
+ case DK_RecTypeDefn:
+ DebCheckRecTypeDefn(hdefn);
+ break;
+ default:
+ DebHalt("bad defnkind.");
+ } // switch
+ }
+}
+
+
+#endif // ID_DEBUG
+
+
+/*********************************************************************/
+// These functions have been moved to the end of the file because
+// they are only called by internal clients.
+
+
+/***
+*PRIVATE TYPE_DATA::SizeTypeDefnOfTDescKind - Calculates size of TYPE_DEFN
+*Purpose:
+* Calculates size of a TYPE_DEFN instance. TYPE_DEFN
+* is defined recursively in terms of itself.
+*
+*Implementation Notes:
+* CONSIDER: switching on rel/debug and use default clause
+*
+
+*Entry:
+* cTypes - size of typedesckind array (IN)
+* rgtdesckind - array of typedesckinds (IN)
+*
+*Exit:
+* Returns size of TYPE_DEFN for array of typedesckind.
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+#pragma code_seg(CS_CREATE)
+UINT TYPE_DATA::SizeTypeDefnOfTDescKind(UINT cTypes,
+ TYPEDESCKIND *rgtdesckind) const
+{
+ UINT cbSizeChunk = 0, uType;
+ TYPEDESCKIND tdesckind;
+
+ for (uType = 0; uType < cTypes; uType++) {
+ tdesckind = rgtdesckind[uType];
+ if (IsSimpleType(tdesckind)) {
+ DebAssert(uType+1 == cTypes, "Only last typedefn can be simple");
+ cbSizeChunk += sizeof(TYPE_DEFN);
+ }
+ else {
+ switch (tdesckind) {
+ case TDESCKIND_Ptr: {
+ cbSizeChunk += sizeof(TYPE_DEFN);
+ break;
+ }
+ case TDESCKIND_Carray:
+ case TDESCKIND_BasicArray: {
+ cbSizeChunk += sizeof(TYPE_DEFN) + sizeof(sHARRAY_DESC);
+ break;
+ }
+ case TDESCKIND_UserDefined: {
+ cbSizeChunk += sizeof(TYPE_DEFN) + sizeof(sHIMPTYPE);
+ break;
+ }
+ default: {
+ DebHalt("TYPE_DATA::SizeTypeDefnOfTDescKind: whoops! bad tdesckind.");
+ break;
+ } // end default
+ } // end switch
+ } // end else
+ } // end for
+
+ return cbSizeChunk;
+}
+#pragma code_seg()
+
+
+/***
+*PRIVATE TYPE_DATA::SizeOfTypeDefn - Calculates size of TYPE_DEFN
+*Purpose:
+* Calculates size of a TYPE_DEFN instance. TYPE_DEFN
+* is defined recursively in terms of itself.
+*
+*Implementation Notes:
+* Note: Can't inline since recursive.
+* CONSIDER: switching on rel/debug and use default clause
+*
+*Entry:
+* htdefn - Handle of TYPE_DEFN (IN)
+*
+*Exit:
+* Returns size of TYPE_DEFN (var len).
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+UINT TYPE_DATA::SizeOfTypeDefn(HTYPE_DEFN htdefn) const
+{
+ return ((TYPE_DEFN *)m_blkmgr.QtrOfHandle(htdefn))->DefnSize();
+}
+
+UINT TYPE_DEFN::DefnSize()
+{
+ UINT cbSizeChunk;
+ TYPEDESCKIND tdesckind;
+
+ tdesckind = Tdesckind();
+ cbSizeChunk = sizeof(TYPE_DEFN);
+ if (IsSimpleType(tdesckind)) {
+ return cbSizeChunk;
+ }
+ else {
+ switch (tdesckind) {
+ case TDESCKIND_Ptr: {
+ // adjust handle to next contiguous TYPE_DEFN.
+ return cbSizeChunk +
+ ((TYPE_DEFN *)(((BYTE * const)this)+cbSizeChunk))->DefnSize();
+ }
+ case TDESCKIND_Carray:
+ case TDESCKIND_BasicArray: {
+ return cbSizeChunk + sizeof(sHARRAY_DESC) +
+ ((TYPE_DEFN *)(((BYTE * const)this)+cbSizeChunk+sizeof(sHARRAY_DESC)))->DefnSize();
+ }
+ case TDESCKIND_UserDefined: {
+ // NOTE: assumes that the cName attr is 0!
+ // Can't assert here cos don't have TYPE_DEFN.
+ //
+ return cbSizeChunk + sizeof(sHIMPTYPE);
+ }
+ default:
+ DebHalt("TYPE_DEFN::DefnSize: whoops! bad tdesckind.");
+ return 0; // C7 wants return value on all control paths.
+ }
+ }
+}
+
+
+/***
+*PRIVATE TYPE_DATA::MapTypeDefn - Maps TYPE_DEFN to new block
+*Purpose:
+* Walks TYPE_DEFN and maps any owned parts to new chunks.
+* Also returns size of TYPE_DEFN so that caller can map
+* the TYPE_DEFN to a new chunk.
+*
+* IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT!
+* IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT!
+* IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT!
+*
+* Right now the only client that compacts the TYPE_DATA
+* is the BASIC_TYPESRC. This function is only meant for
+* use within BASIC_TYPESRC::Compact. Be careful if you
+* plan to use it for general-purpose TYPE_DATA compaction.
+*
+* IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT!
+* IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT!
+* IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT! IMPORTANT!
+*
+*Implementation Notes:
+* Works like TYPE_DATA::SizeOfTypeDefn.
+* Recurses for arrays and pointer/ref types.
+*
+*Entry:
+* htdefn - Handle of TYPE_DEFN (IN)
+*
+*Exit:
+* Returns size of TYPE_DEFN (var len).
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+
+
+/***
+*PUBLIC TYPE_DATA::AllocVardefnPredeclared - Allocs vardefn for predeclared
+*Purpose:
+* Allocs vardefn for predeclared id.
+*
+*Implementation Notes:
+*
+
+*Entry:
+* htdefn - Handle of TYPE_DEFN (IN)
+*
+*Exit:
+* Returns size of TYPE_DEFN (var len).
+*
+*Errors:
+* NONE.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::AllocVardefnPredeclared()
+{
+ MBR_VAR_DEFN *qmvdefnPredeclared;
+ TYPE_DEFN *qtdefnPredeclared;
+ sHTYPE_DEFN htdefnPredeclared;
+ BSTRA bstr;
+ NAMMGR *pnammgr;
+ HLNAM hlnam;
+ TYPEDESCKIND tdesckind;
+ sHIMPTYPE himptypePredeclared;
+ sHMBR_VAR_DEFN hmvdefnPredeclared;
+ TIPERROR err = TIPERR_None;
+
+ // We need to initialize the Var defn for predeclared identifier
+ // Allocate a VAR_DEFN
+ //
+ IfErrRet(AllocMbrVarDefn(&hmvdefnPredeclared, FALSE));
+ SetHvdefnPredeclared(hmvdefnPredeclared);
+
+ // Get the name of the class
+ IfErrGo(TiperrOfHresult(m_pdtroot->Pgdtinfo()->GetDocumentation(
+ -1,
+ (BSTR *)&bstr,
+ NULL,
+ NULL,
+ NULL)));
+
+#if OE_WIN32
+ HRESULT hresult;
+ if ((hresult = ConvertBstrToAInPlace(&bstr)) != NOERROR) {
+ err = TiperrOfHresult(hresult);
+ goto Error;
+ }
+#endif //OE_WIN32
+
+ // Get the hlnam of the name
+ IfErrGo(m_pdtroot->GetNamMgr(&pnammgr));
+ IfErrGo(pnammgr->HlnamOfStr(bstr, &hlnam, FALSE, NULL));
+
+ // Free the BSTR
+ FreeBstrA(bstr);
+
+ qmvdefnPredeclared =
+ (MBR_VAR_DEFN *)QvdefnOfHvdefn(HvdefnPredeclared());
+ qmvdefnPredeclared->SetHlnam(hlnam);
+ qmvdefnPredeclared->SetHasNew(TRUE);
+ qmvdefnPredeclared->SetVkind(VKIND_DataMember);
+ qmvdefnPredeclared->SetHmember((ULONG)ID_DEFAULTINST);
+ qmvdefnPredeclared->SetOVar(HMEMBER_PredeclId);
+ qmvdefnPredeclared->SetIsStatic(TRUE);
+
+ // Alloc a TYPE_DEFN for the predecl'ed var
+ qmvdefnPredeclared->SetIsSimpleType(FALSE);
+ tdesckind = TDESCKIND_UserDefined;
+ IfErrGo(AllocTypeDefn(1, &tdesckind, &htdefnPredeclared));
+
+ // Get a qointer to the TYPE_DEFN and initialize the data members
+ qtdefnPredeclared = QtdefnOfHtdefn(htdefnPredeclared);
+
+ qtdefnPredeclared->SetTdesckind(TDESCKIND_UserDefined);
+ qtdefnPredeclared->SetPtrkind(PTRKIND_Basic);
+
+ // Set the himptype by importing ourselves.
+ // Note we don't want to add a reference!
+ //
+ IfErrGo(m_pimpmgr->RegisterDeclRefDep(m_pdtroot->Pgdtinfo()));
+ himptypePredeclared =
+ m_pimpmgr->GetHimptypeIfExists(m_pdtroot->Pgdtinfo());
+ DebAssert(himptypePredeclared != HIMPTYPE_Nil, "should have existed.");
+
+ // Get a qointer to the TYPE_DEFN and initialize the data members
+ qtdefnPredeclared = QtdefnOfHtdefn(htdefnPredeclared);
+
+ *(qtdefnPredeclared->Qhimptype()) = himptypePredeclared;
+
+ // Update the htdefn field of the vardefn
+ // (Note need to rederef)
+ //
+ QvdefnOfHvdefn(HvdefnPredeclared())->SetHtdefn(htdefnPredeclared);
+ return err;
+
+Error:
+ FreeMbrVarDefn(hmvdefnPredeclared);
+ // Free the BSTR
+ FreeBstrA(bstr);
+ return err;
+}
diff --git a/private/oleauto/src/typelib/tdata2.cxx b/private/oleauto/src/typelib/tdata2.cxx
new file mode 100644
index 000000000..10ce43924
--- /dev/null
+++ b/private/oleauto/src/typelib/tdata2.cxx
@@ -0,0 +1,3651 @@
+/***
+*tdata2.cxx - Type Data part 2
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* TYPEDATA manages the internal representation of a class's members.
+* In particular, it maintains three linked lists of data members,
+* base members and methods respectively.
+* See \silver\doc\ic\dtmbrs.doc for more information.
+*
+*Revision History:
+*
+* [00] 11-Aug-92 stevenl: Broken off from tdata.cxx.
+* [01] 18-Jan-93 w-peterh: implemented AddFuncDesc/ AddVarDesc
+* [02] 02-Feb-93 w-peterh: added IndexOfFuncName
+* [03] 12-Feb-93 w-peterh: bunches of typelib support
+* [04] 02-Mar-93 w-peterh: fix AddVarDesc of const
+* enable EI_OB AddRefTypeInfo and AddImplType
+* [05] 19-Mar-93 w-jeffc: added GetDocumentationOfFuncName
+* [06] 30-Apr-93 w-jeffc: made DEFN data members private
+*
+*Implementation Notes:
+* ST's are implemented as ULONG prefixed.
+*
+*****************************************************************************/
+
+#define TDATA_VTABLE // export blk mgr vtable
+
+#include "silver.hxx"
+#include "xstring.h" // for memcpy
+#include "typelib.hxx"
+#include "tdata.hxx" // no longer includes dtinfo.hxx
+#include "clutil.hxx"
+#include "nammgr.hxx"
+#include "impmgr.hxx"
+#include "entrymgr.hxx"
+#include "exbind.hxx"
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+char szOleTdata2Cxx[] = __FILE__;
+#define SZ_FILE_NAME szOleTdata2Cxx
+#else
+static char szTdata2Cxx[] = __FILE__;
+#define SZ_FILE_NAME szTdata2Cxx
+#endif
+#endif
+
+
+// Second bit indicates if the number is negtive.
+#define SetNegativeBit(us, f) \
+ us = f ? (us | 0x0002) : (us & ~0x0002)
+#define IsNegative(us) (us & 0x0002)
+
+// First bit indicates if we stored a hlnam or a number
+#define SetIsNumber(us) (us |= 0x0001)
+#define SetIsHchunk(us) (us &= ~0x0001)
+#define IsHchunk(us) (!(us & 0x0001))
+
+#define AbsDiff(a,b) (a > b ? (a-b) : (b-a))
+#define GetHchunk(us) (us & ~0x0001)
+#define GetDiff(us) (USHORT(us >> 2))
+
+// A helper function for retrieving pointers to consts for both
+// VAR_DEFN and MBR_VAR_DEFNs
+// Returns NULL if no const val exists yet (i.e. the compiler
+// hasn't been called to evaluate a const initializer yet for
+// this variable).
+//
+BYTE *PbConstVal(TYPE_DATA *ptdata, VAR_DEFN *qvdefn)
+{
+ HCHUNK hchunk;
+
+ DebAssert(qvdefn->HasConstVal(), "bad const.");
+ DebAssert(!qvdefn->IsSimpleConst(), "can't be simple.");
+
+ // NOTE: the following could be done with nested conditional
+ // exprs (?:) -- but it got too cryptic.
+ //
+ hchunk = qvdefn->IsMemberVarDefn() ?
+ ((MBR_VAR_DEFN *)qvdefn)->HchunkConstMbrVal() :
+ qvdefn->HchunkConstVal();
+ return (hchunk == HCHUNK_Nil) ? NULL : ptdata->QtrOfHandle(hchunk);
+}
+
+
+#pragma code_seg(CS_CREATE)
+// A helper function for setting const val for both
+// VAR_DEFN and MBR_VAR_DEFNs
+//
+VOID SetHchunkConstVal(VAR_DEFN *qvdefn, HCHUNK hchunk)
+{
+ DebAssert(qvdefn->HasConstVal(), "bad const.");
+ DebAssert(!qvdefn->IsSimpleConst(), "can't be simple.");
+ if (qvdefn->IsMemberVarDefn()) {
+ ((MBR_VAR_DEFN *)qvdefn)->SetHchunkConstMbrVal(hchunk);
+ }
+ else {
+ qvdefn->SetHchunkConstVal(hchunk);
+ }
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_CREATE)
+TIPERROR ValidateMemid(MEMBERID memid)
+{
+ // If the top two bits of the memid are 01, we must verify that the
+ // memid is in the format 010000<inheritence level><16 anything bits>.
+ // Unfortunately, we don't know what the inheritence level is at
+ // this point, so we have to check in DYN_TYPEMEMBERS::AllocHmembers.
+
+ // validate incoming memid -- the top bit is reserved for internal
+ // use (special case allowing of DISPID_UNKNOWN & DISPID_NEWENUM)
+ //
+#ifndef DISPID_COLLECT // temporary until everybody upgrades header files
+#define DISPID_COLLECT (-8)
+#endif
+ if (memid & HMEMBER_ReservedBits) {
+ // NOTE explict casting to a LONG to work around C7 optimizer bug
+ switch ((long)(memid)) {
+ case DISPID_UNKNOWN:
+ case DISPID_NEWENUM:
+ case DISPID_EVALUATE:
+ case DISPID_CONSTRUCTOR:
+ case DISPID_DESTRUCTOR:
+ case DISPID_COLLECT:
+ break;
+
+ default:
+ // Also allow the special range -999 to -500 for the controls folks.
+ // This range will be documented as reserved in the next version.
+ if ((long)memid >= -999 && (long)memid <= -500) {
+ break;
+ }
+ // Also allow the special range 0x80010000 to 0x8001FFFF for Control
+ // containers such as VB4.
+ if (HIWORD(memid) == 0x8001) {
+ break;
+ }
+ return TIPERR_InvalidArg;
+ }
+ }
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+/***
+*PUBLIC TYPE_DATA::HvdefnOfHlnam
+*Purpose:
+* get the hvdefn of an hlnam
+*
+*Entry:
+* hlnam - hlnam to search for
+*
+*Exit:
+* hvdefn of matching variable
+***********************************************************************/
+
+HVAR_DEFN TYPE_DATA::HvdefnOfHlnam(HLNAM hlnam)
+{
+ HVAR_DEFN hvdefn;
+ VAR_DEFN *qvdefn;
+
+ hvdefn = HdefnFirstDataMbrNestedType();
+ while (hvdefn != HVARDEFN_Nil) {
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+ DebAssert(qvdefn->IsVarDefn(), "Bad defn kind");
+ if (qvdefn->Hlnam() == hlnam) {
+ break;
+ }
+ hvdefn = qvdefn->HdefnNext();
+ }
+
+ return hvdefn;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::HfdefnFirstOfHlnam
+*Purpose:
+* get the hfdefn of an hlnam
+*
+*Entry:
+* hlnam - hlnam to search for
+*
+*Exit:
+* hfdefn of matching function
+***********************************************************************/
+
+HFUNC_DEFN TYPE_DATA::HfdefnFirstOfHlnam(HLNAM hlnam,INVOKEKIND *pinvokekind)
+{
+ return HfdefnNextOfHlnam(hlnam, HfdefnFirstAvailMeth(),pinvokekind);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::HfdefnNextOfHlnam
+*Purpose:
+* get the hfdefn of an hlnam
+*
+*Entry:
+* hlnam - hlnam to search for
+* hfdefn -
+*
+*Exit:
+* hfdefn of matching function
+***********************************************************************/
+
+HFUNC_DEFN TYPE_DATA::HfdefnNextOfHlnam(HLNAM hlnam, HFUNC_DEFN hfdefn,INVOKEKIND *pinvokekind)
+{
+ FUNC_DEFN *qfdefn;
+
+ while (hfdefn != HFUNCDEFN_Nil) {
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ if (qfdefn->Hlnam() == hlnam) {
+ *pinvokekind = qfdefn->InvokeKind();
+ break;
+ }
+ hfdefn = HfdefnNextAvailMeth(hfdefn);
+ }
+
+ return hfdefn;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::HfdefnFirstAvailMeth - First availible method in list.
+*Purpose:
+* Returns first availible method in list of class's methods.
+*
+*Implementation Notes:
+*
+*Entry:
+* None
+*
+*Exit:
+* returns handle to first availible function.
+*
+***********************************************************************/
+
+HFUNC_DEFN TYPE_DATA::HfdefnFirstAvailMeth()
+{
+ // All OLE functions are availilble.
+ return HfdefnFirstMeth();
+}
+
+
+/***
+*PUBLIC TYPE_DATA::GetFuncDescOfHfdefn
+*Purpose:
+* Get FUNC_DESC given a FUNC_DEFN.
+*
+*Entry:
+* hfdefn - handle to FUNC_DEFN (IN).
+* lplpfuncdesc - Returns a pointer to a FUNCDESC that describes
+* the specified function.
+*
+*Exit:
+* *lplpfuncdesc points to a FUNC_DESC or error returned
+***********************************************************************/
+TIPERROR TYPE_DATA::GetFuncDescOfHfdefn(HFUNC_DEFN hfdefn,
+ FUNCDESC **ppfuncdesc)
+{
+ FUNC_DEFN *qfdefn;
+ PARAM_DEFN *qparamdefn;
+ HPARAM_DEFN hparamdefn;
+ FUNCDESC *pfuncdesc;
+ ELEMDESC *pelemdesc;
+ UINT i;
+ TIPERROR err = TIPERR_None;
+ WORD wFlags;
+ UINT cArgs;
+ TYPE_DEFN *qtdefn;
+
+ DebAssert(hfdefn != HFUNCDEFN_Nil, "bad FUNC_DEFN handle.");
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ // Create a FUNCDESC instance.
+ //
+ pfuncdesc = MemNew(FUNCDESC);
+ if (pfuncdesc == NULL) {
+ return TIPERR_OutOfMemory;
+ }
+ ::new (pfuncdesc) FUNCDESC;
+ InitFuncDesc(pfuncdesc);
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ // set FUNCKIND
+ // VIRTUAL, PUREVIRTUAL, NONVIRTUAL, STATIC, DISPATCH
+ if (qfdefn->IsVirtual()) {
+ pfuncdesc->funckind =
+ qfdefn->IsPure() ? FUNC_PUREVIRTUAL : FUNC_VIRTUAL;
+ // for FUNC_VIRTUAL, specifies the offset in the virtual function table
+ pfuncdesc->oVft = (SHORT)((VIRTUAL_FUNC_DEFN *)qfdefn)->Ovft();
+ }
+ else {
+ pfuncdesc->oVft = 0;
+ if (qfdefn->IsNonVirtual())
+ pfuncdesc->funckind = FUNC_NONVIRTUAL;
+ else if (qfdefn->IsStatic())
+ pfuncdesc->funckind = FUNC_STATIC;
+ else if (qfdefn->IsDispatch())
+ pfuncdesc->funckind = FUNC_DISPATCH;
+ else DebHalt("Invalid FuncKind");
+ }
+
+ // invocation kind; indicates if this is a property function and if so what kind
+ pfuncdesc->invkind = qfdefn->InvokeKind();
+
+ // CC_MSCPASCAL, CC_MACPASCAL, CC_STDCALL, CC_THISCALL,CC_CDECL
+ pfuncdesc->callconv = (CALLCONV)qfdefn->m_ftdefn.CcUnmunged();
+
+ // count of parameters
+ cArgs = pfuncdesc->cParams = qfdefn->m_ftdefn.CArgsUnmunged();
+
+ // count of optional parameters; see detailed description below
+ pfuncdesc->cParamsOpt = qfdefn->m_ftdefn.CArgsOpt();
+
+//CONSIDER: (size/speed) are we double-initializing any of these fields?
+//CONSIDER: What exactly does InitFuncDesc() above do?
+
+ // scodes (reserved for future use)
+ pfuncdesc->lprgscode = NULL;
+ pfuncdesc->cScodes = 0;
+
+ // idldesc
+ pfuncdesc->elemdescFunc.idldesc.wIDLFlags = 0;
+#if OE_WIN16
+ pfuncdesc->elemdescFunc.idldesc.bstrIDLInfo = NULL;
+#else //OE_WIN16
+ pfuncdesc->elemdescFunc.idldesc.dwReserved = 0;
+#endif //OE_WIN16
+
+ // Set Function Return Type
+ if (qfdefn->IsSub()) {
+ pfuncdesc->elemdescFunc.tdesc.vt = VT_VOID;
+ }
+ else {
+ IfErrGo(AllocTypeDescOfTypeDefn(
+ qfdefn->m_ftdefn.HtdefnResultUnmunged(),
+ qfdefn->m_ftdefn.IsSimpleTypeResultUnmunged(),
+ &(pfuncdesc->elemdescFunc.tdesc)));
+ }
+ // contains the ID, name, and return type of the function
+ pfuncdesc->memid = qfdefn->Hmember();
+
+ // set the func flags
+ if (qfdefn->IsRestricted()) {
+ pfuncdesc->wFuncFlags = (WORD) FUNCFLAG_FRESTRICTED;
+ }
+ else {
+ pfuncdesc->wFuncFlags = 0;
+ }
+ if (qfdefn->HasV2Flags()) {
+ // if the typelib was create using V2 typelib.dll then we store the
+ // flags in the word we added.
+ pfuncdesc->wFuncFlags |= qfdefn->WFuncFlags();
+ }
+
+ // Parameters
+ //
+ if (cArgs > 0) {
+ pelemdesc = (ELEMDESC *)MemAlloc(sizeof(ELEMDESC) * cArgs);
+
+ if (pelemdesc == NULL) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ // array containing the ID, name, and return type of the parameters
+ pfuncdesc->lprgelemdescParam = pelemdesc;
+ for (i = 0; i < cArgs; i++) {
+ InitElemDesc(pfuncdesc->lprgelemdescParam + i);
+ }
+
+ hparamdefn = qfdefn->m_ftdefn.m_hdefnFormalFirst;
+
+#if ID_DEBUG & EI_OLE
+ if (qfdefn->CArgs() > 0) {
+ DebAssert(hparamdefn != HPARAMDEFN_Nil,
+ "number vs actual dont match");
+ }
+#endif // ID_DEBUG & EI_OLE
+
+ i = 0;
+ while (i < cArgs) {
+ // In OLE we have an array of PARAM_DEFN(s).
+ // Get the ith PARAM_DEFN
+ //
+ qparamdefn = QparamdefnOfIndex(hparamdefn, i);
+
+
+ // idldesc
+ wFlags = IDLFLAG_NONE;
+ // set the idldesc
+ if (qparamdefn->IsSimpleType()) {
+ qtdefn = qparamdefn->QtdefnOfSimpleType();
+ }
+ else {
+ qtdefn = QtdefnOfHtdefn(qparamdefn->Htdefn());
+ }
+
+ if (qtdefn->IsModeIn() || qtdefn->IsModeInOut()) {
+ wFlags |= (WORD) IDLFLAG_FIN;
+ }
+ if (qtdefn->IsModeOut() || qtdefn->IsModeInOut()) {
+ wFlags |= (WORD) IDLFLAG_FOUT;
+ }
+ if (qtdefn->IsRetval()) {
+ wFlags |= (WORD) IDLFLAG_FRETVAL;
+ }
+ if (qtdefn->IsLCID()) {
+ wFlags |= (WORD) IDLFLAG_FLCID;
+ }
+ pelemdesc[i].idldesc.wIDLFlags = wFlags;
+
+
+#if OE_WIN16
+ pelemdesc[i].idldesc.bstrIDLInfo = NULL;
+#else //OE_WIN16
+ pelemdesc[i].idldesc.dwReserved = 0;
+#endif //OE_WIN16
+
+ // Parameter Type
+ IfErrGo(AllocTypeDescOfTypeDefn(qparamdefn->Htdefn(),
+ qparamdefn->IsSimpleType(),
+ &(pelemdesc[i].tdesc)));
+ i++;
+ } // while param list or array
+
+ } // if parameters
+ else {
+ // no parameters
+ pfuncdesc->lprgelemdescParam = NULL;
+ }
+
+ *ppfuncdesc = pfuncdesc;
+ return err;
+
+Error:
+ FreeFuncDesc(pfuncdesc);
+
+ return err;
+}
+
+
+
+
+
+
+/***
+*PUBLIC TYPE_DATA::GetFuncDesc
+*Purpose:
+* Get the index'th FUNCDESC
+*
+*Entry:
+* index - Index of the function to be returned.
+* The index should be in the range
+* of 0 up to the number of functions in this type -1.
+* lplpfuncdesc - Returns a pointer to a FUNCDESC that describes
+* the specified function.
+*
+*Exit:
+* *lplpfuncdesc points to a FUNCDESC or error returned
+***********************************************************************/
+TIPERROR TYPE_DATA::GetFuncDesc(UINT index,
+ FUNCDESC **ppfuncdesc)
+{
+ FUNC_DEFN *qfdefn;
+ HFUNC_DEFN hfdefn, hfdefnStart;
+ UINT ifdefn, ifdefnStart;
+ TIPERROR err = TIPERR_None;
+
+ if (CAvailMeth() <= index) {
+ return TIPERR_ElementNotFound;
+ }
+
+ // count up to the function indicated
+ // in OLE use the cache if there is one and it's useful.
+ if ((HfdefnLast() != HFUNCDEFN_Nil) &&
+ (index >= UOrdinalHfdefnLast())) {
+ // start from where we stopped last
+ ifdefnStart = UOrdinalHfdefnLast();
+ hfdefnStart = HfdefnLast();
+ }
+ else {
+ ifdefnStart = 0;
+ hfdefnStart = HfdefnFirstMeth();
+ }
+
+ for (ifdefn = ifdefnStart, hfdefn = hfdefnStart;;) {
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ if (index == ifdefn++) {
+ // cache the match in OLE
+ SetUOrdinalHfdefnLast(index);
+ SetHfdefnLast(hfdefn);
+ break;
+ } // if match
+
+ hfdefn = HfdefnNextAvailMeth(hfdefn);
+ } // for
+
+ return GetFuncDescOfHfdefn(hfdefn, ppfuncdesc);
+}
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::AddFuncDesc
+*Purpose:
+* Adds a function/method description to the TypeInfo.
+* The index is used to specify the order of the functions.
+* The first function has an index of zero. If an index is
+* specified that is greater than the number of functions
+* currently in the TypeInfo then an error is returned.
+* Calling this function does not pass ownership of the FUNCDESC
+* structure to the IDynTypeInfo.
+*
+*Entry:
+* index - Index before which function is to be inserted.
+* The index should be in the range
+* of 0 up to the number of functions in this type.
+* pfuncdesc - A pointer to a FUNCDESC that describes
+* the specified function.
+* phfdefn - Pointer to allocated handle (OUT). If NULL then
+* client doesn't care (default).
+*
+*Exit:
+* Status code returned.
+***********************************************************************/
+
+TIPERROR TYPE_DATA::AddFuncDesc(UINT index,
+ FUNCDESC *pfuncdesc,
+ HFUNC_DEFN *phfdefn)
+{
+ sHVIRTUAL_FUNC_DEFN hvfdefn;
+ VIRTUAL_FUNC_DEFN *qvfdefn;
+ sHTYPE_DEFN htdefn;
+ HFUNC_DEFN hfdefnNext;
+ sHFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+ sHDEFN hdefnLast;
+ PARAM_DEFN *qparamdefn;
+ UINT i, cArgs;
+ TIPERROR err;
+ WORD wIDLFlags;
+ TYPE_DEFN *qtdefn;
+ HPARAM_DEFN hparamdefn;
+ BOOL fIsSimpleType;
+ BOOL fV2Flags;
+
+
+ DebAssert(pfuncdesc != NULL,
+ "TYPE_DATA::AddFuncDesc: null FUNCDESC.");
+
+ DebAssert(Pdtroot()->CompState() == CS_UNDECLARED, "Invalid state");
+
+ if (index > CAvailMeth()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ fV2Flags = ((pfuncdesc->wFuncFlags & ~FUNCFLAG_FRESTRICTED) != 0);
+
+ // Now fill in the fields of the FUNC_DEFN to be added
+ // (with the attributes of the input param FUNCDESC).
+ // VIRTUAL, PUREVIRTUAL, NONVIRTUAL, STATIC, DISPATCH
+ switch(pfuncdesc->funckind) {
+ case FUNC_PUREVIRTUAL:
+ case FUNC_VIRTUAL:
+ IfErrRet(AllocVirtualFuncDefn(&hvfdefn, fV2Flags));
+ hfdefn = (HFUNC_DEFN) hvfdefn;
+ qvfdefn = QvfdefnOfHvfdefn(hvfdefn);
+ qfdefn = (FUNC_DEFN *) qvfdefn;
+ qvfdefn->SetFkind(FKIND_Virtual);
+ if (pfuncdesc->funckind == FUNC_PUREVIRTUAL) {
+ qvfdefn->SetIsPure(TRUE); // Default is false
+ }
+ // this is set to -1 so that TKIND_DISPATCH functions
+ // are intialized to some known bogus value
+ // others will be set at layout time w-peterh 17-Feb-93
+ ((VIRTUAL_FUNC_DEFN *)qfdefn)->SetOvft((UINT)-1);
+ break;
+
+ case FUNC_NONVIRTUAL:
+ case FUNC_STATIC:
+ case FUNC_DISPATCH:
+ IfErrRet(AllocFuncDefn(&hfdefn, fV2Flags));
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ if (pfuncdesc->funckind == FUNC_NONVIRTUAL) {
+ qfdefn->SetFkind(FKIND_NonVirtual);
+ }
+ else if (pfuncdesc->funckind == FUNC_STATIC) {
+ qfdefn->SetFkind(FKIND_Static);
+ }
+ else {
+ qfdefn->SetFkind(FKIND_Dispatch);
+ }
+ break;
+ default:
+ return TIPERR_InvalidArg;
+ }
+
+ // NOTE: All error paths after this point must free the hfdefn!
+
+ // NOTE: There should not be any error between the allocation of the defn
+ // and this call.
+ // set the flag indicating whether we have the V2 flags.
+ qfdefn->SetHasV2Flag(fV2Flags);
+
+ // validate the incoming memid
+ IfErrGo(ValidateMemid(pfuncdesc->memid));
+
+ qfdefn->SetHmember(pfuncdesc->memid);
+
+ // invocation kind; indicates if this is a property function and if so what kind
+ qfdefn->SetInvokeKind(pfuncdesc->invkind);
+ qfdefn->SetHlnam(HLNAM_Nil);
+
+ if (pfuncdesc->wFuncFlags & FUNCFLAG_FRESTRICTED) {
+ qfdefn->SetIsRestricted(TRUE);
+ }
+ if (fV2Flags) {
+ DebAssert(qfdefn->HasV2Flags(), "Bad qfdefn");
+ qfdefn->SetWFuncFlags(pfuncdesc->wFuncFlags);
+ }
+
+
+ // CC_MSCPASCAL, CC_MACPASCAL, CC_STDCALL, CC_THISCALL,CC_CDECL
+ // CC_CDECL is 1
+ DebAssert(pfuncdesc->callconv >= CC_CDECL && pfuncdesc->callconv < CC_MAX, "invalid callconv");
+ qfdefn->m_ftdefn.SetCc(pfuncdesc->callconv);
+ if ((pfuncdesc->cParams > MAX_CARGS) || (pfuncdesc->cParams < 0)){
+ err = TIPERR_OutOfBounds;
+ goto Error;
+ }
+ cArgs = pfuncdesc->cParams;
+
+ if ((pfuncdesc->cParamsOpt > MAX_CARGSOPT) || (pfuncdesc->cParamsOpt < -1)) {
+ err = TIPERR_OutOfBounds;
+ goto Error;
+ }
+ if (pfuncdesc->cParamsOpt == -1) {
+ DebAssert(pfuncdesc->cParams >= 1,
+ "number of optional params can't be more then total");
+ qfdefn->m_ftdefn.SetCArgsOpt(OPTARGS_LIST);
+ }
+ else {
+ DebAssert(pfuncdesc->cParamsOpt <= pfuncdesc->cParams,
+ "number of optional params can't be more then total");
+ qfdefn->m_ftdefn.SetCArgsOpt(pfuncdesc->cParamsOpt);
+ }
+
+ // The following are initted by the constructor:
+ // hstDocumentation, uHelpContext, hdllentrydefn,
+ // access and declkind.
+ //
+ IfErrGo(AllocTypeDefnOfTypeDesc(&(pfuncdesc->elemdescFunc.tdesc),
+ 0,
+ &htdefn,
+ TRUE, // coclasses allowed
+ &fIsSimpleType));
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ qfdefn->m_ftdefn.SetHtdefnResult(htdefn);
+ qfdefn->m_ftdefn.SetIsSimpleTypeResult(fIsSimpleType);
+
+ // parameters
+ hdefnLast = HDEFN_Nil;
+ hparamdefn = HPARAMDEFN_Nil;
+
+ // In OLE allocate enough memory for all the PARAM_DEFN(s).
+ // For OB we allocate one at a time.
+ //
+ // if there are parameters for this function then allocate that array of
+ // of param defn(s).
+ if (cArgs > 0) {
+ IfErrGo(m_blkmgr.AllocChunk(&hparamdefn,
+ cArgs*sizeof(PARAM_DEFN)));
+
+ // construct all the paramdefn's
+ for (i = 0; i < cArgs; i++) {
+ qparamdefn = QparamdefnOfIndex(hparamdefn, i);
+ new (qparamdefn) PARAM_DEFN; // constuct in place
+ }
+ }
+
+ // Dereference the qointer to the funcdefn.
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ qfdefn->m_ftdefn.m_hdefnFormalFirst = hparamdefn;
+ qfdefn->m_ftdefn.SetCArgs(cArgs); // can now set the cArgs, now that
+ // the paramdefn's are allocated/init'ed
+ // (required by FreeFuncDefn)
+
+ for (i = 0; i < cArgs; i++) {
+ // set parameter type
+ IfErrGo(AllocTypeDefnOfTypeDesc(&(pfuncdesc->lprgelemdescParam[i].tdesc),
+ 0,
+ &htdefn,
+ TRUE, // coclasses allowed
+ &fIsSimpleType));
+
+ // NOTE -- need to set up IsSimpleType AFTER AllocTypeDefnOfTypeDesc,
+ // or else FreeFuncDefn/FreeParamDefn will crap out if
+ // AllocTypeDefnOfTypeDesc failed
+
+ // Get the ith param defn
+ qparamdefn = QparamdefnOfIndex(hparamdefn, i); // rederef
+ qparamdefn->SetHtdefn(htdefn);
+
+ // Determine if type supports "IsSimpleType" optimization.
+ qparamdefn->SetIsSimpleType(fIsSimpleType);
+ qparamdefn->SetHlnam(HLNAM_Nil);
+
+ // Set the param kind.
+ wIDLFlags = pfuncdesc->lprgelemdescParam[i].idldesc.wIDLFlags;
+ DebAssert((wIDLFlags & ~(IDLFLAG_FIN
+ | IDLFLAG_FOUT
+ | IDLFLAG_FRETVAL
+ | IDLFLAG_FLCID
+ )) == 0, "unknown wIDLFLags");
+#if OE_WIN16
+ DebAssert(pfuncdesc->lprgelemdescParam[i].idldesc.bstrIDLInfo == NULL,
+ "bstrIDLInfo must be NULL for future compatibility");
+#else //OE_WIN16
+ DebAssert(pfuncdesc->lprgelemdescParam[i].idldesc.dwReserved == 0,
+ "dwReserved must be 0 for future compatibility");
+#endif //OE_WIN16
+
+ // Get pointer to the TYPE_DEFN.
+ //
+ // if the parameter is a simple type then htdefn is the TYPE_DEFN
+ if (qparamdefn->IsSimpleType()) {
+ qtdefn = qparamdefn->QtdefnOfSimpleType();
+ }
+ else {
+ qtdefn = QtdefnOfHtdefn(htdefn);
+ }
+
+ // Set the paramkind
+ if (wIDLFlags & IDLFLAG_FIN) {
+ if (wIDLFlags & IDLFLAG_FOUT) {
+ qtdefn->SetParamkind(PARAMKIND_InOut);
+ }
+ else {
+ qtdefn->SetParamkind(PARAMKIND_In);
+ }
+ }
+ else {
+ if (wIDLFlags & IDLFLAG_FOUT) {
+ qtdefn->SetParamkind(PARAMKIND_Out);
+ }
+ else {
+ qtdefn->SetParamkind(PARAMKIND_Ignore);
+ }
+ }
+
+ if (wIDLFlags & (IDLFLAG_FRETVAL | IDLFLAG_FLCID)) {
+ TYPE_DEFN * qtdefnResult = QtdefnResultOfHfdefn(hfdefn);
+ DebAssert(qtdefnResult != NULL, "return type should have been set");
+ if (wIDLFlags & IDLFLAG_FRETVAL) {
+ qtdefn->SetIsRetval(TRUE);
+ // note param has RETVAL attr
+ qtdefnResult->SetIsRetval(TRUE);
+ }
+ if (wIDLFlags & IDLFLAG_FLCID) {
+ qtdefn->SetIsLCID(TRUE);
+ // note param has LCID attr
+ qtdefnResult->SetIsLCID(TRUE);
+ }
+ }
+
+ } // for
+
+
+ // insert into list of func_defns if index != ~0
+
+ // check for insert at end of list
+ if (index == CAvailMeth()) {
+ m_hdefnLastMeth = hfdefn;
+ }
+ // check for insert at begining of list
+ if (index == 0) {
+ QfdefnOfHfdefn(hfdefn)->SetHdefnNext(m_hdefnFirstMeth);
+ m_hdefnFirstMeth = hfdefn;
+ }
+ else {
+ hfdefnNext = m_hdefnFirstMeth;
+ qfdefn = QfdefnOfHfdefn(hfdefnNext);
+ while (--index) {
+ hfdefnNext = qfdefn->HdefnNext();
+ qfdefn = QfdefnOfHfdefn(hfdefnNext);
+ } // while
+ QfdefnOfHfdefn(hfdefn)->SetHdefnNext(qfdefn->HdefnNext());
+ qfdefn->SetHdefnNext(hfdefn);
+ }
+
+ m_cMeth++;
+
+
+ // Return the allocated handle if they want it.
+ if (phfdefn != NULL) {
+ *phfdefn = hfdefn;
+ }
+ return err;
+
+Error:
+ FreeFuncDefn(hfdefn);
+ return err;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC TYPE_DATA::GetVarDescOfHvdefn
+*Purpose:
+* Get a VARDESC given a VAR_DEFN
+*
+*Entry:
+* hvdefn - Handle to VAR_DEFN (IN).
+* ppvardesc - Returns a pointer to a VARDESC that describes
+* the specified variable (OUT).
+*
+*Exit:
+* *ppvardesc points to a VARDESC or error returned
+***********************************************************************/
+
+TIPERROR TYPE_DATA::GetVarDescOfHvdefn(HVAR_DEFN hvdefn,
+ VARDESCA **ppvardesc)
+{
+ VAR_DEFN *qvdefn;
+ VARDESCA *pvardesc;
+ TYPEDESCKIND tdesckind;
+ VARIANT *pvariant;
+ UINT cb;
+ BSTR bstr;
+ TIPERROR err = TIPERR_None;
+#if OE_WIN32
+ HRESULT hresult;
+#endif //OE_WIN32
+ TYPE_DEFN *qtdefn;
+ PTRKIND ptrkind;
+
+ DebAssert(hvdefn != HVARDEFN_Nil, "bad VAR_DEFN handle.");
+ // Create a VAR_DESC instance.
+ //
+ pvardesc = MemNew(VARDESCA);
+ if (pvardesc == NULL) {
+ return TIPERR_OutOfMemory;
+ }
+ ::new (pvardesc) VARDESCA;
+
+ InitVarDesc(pvardesc);
+
+ pvardesc->wVarFlags = 0;
+
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+
+ // set varkind
+ if (qvdefn->IsStatic()) {
+ pvardesc->varkind = VAR_STATIC;
+ pvardesc->oInst = NULL; // set oInst/lpvarValue to NULL
+ }
+ else if (qvdefn->HasConstVal()) {
+ pvardesc->varkind = VAR_CONST;
+ // lpvarValue will be set below
+ }
+ else if (qvdefn->IsDispatch()) {
+ pvardesc->varkind = VAR_DISPATCH;
+ pvardesc->oInst = qvdefn->GetOVar();
+ }
+ else {
+ pvardesc->varkind = VAR_PERINSTANCE;
+ pvardesc->oInst = qvdefn->GetOVar();
+ }
+
+ pvardesc->lpstrSchema = NULL; // reserved
+
+ // set ID
+ // Note we don't have virtual functions to work with so we
+ // do the type casting "manually".
+ //
+ DebAssert(qvdefn->IsMemberVarDefn(), "bad defn");
+ pvardesc->memid = ((MBR_VAR_DEFN *)qvdefn)->Hmember();
+
+ // set typedesc
+ IfErrGo(AllocTypeDescOfTypeDefn(qvdefn->Htdefn(),
+ qvdefn->IsSimpleType(),
+ &(pvardesc->elemdescVar.tdesc)));
+
+
+ if (qvdefn->IsReadOnly())
+ pvardesc->wVarFlags = (WORD) VARFLAG_FREADONLY;
+ else
+ pvardesc->wVarFlags = 0;
+
+ // set the var flags
+ if (qvdefn->HasV2Flags()) {
+ DebAssert(qvdefn->IsMemberVarDefn(), "Bad Defn type");
+
+ pvardesc->wVarFlags |= ( ((MBR_VAR_DEFN *)qvdefn)->WVarFlags() );
+ }
+
+ // const value
+ if (qvdefn->HasConstVal()) {
+ if (qvdefn->IsSimpleType()) {
+ qtdefn = qvdefn->QtdefnOfSimpleType();
+ }
+ else {
+ qtdefn = QtdefnOfHtdefn(qvdefn->Htdefn());
+ }
+ tdesckind = qtdefn->Tdesckind();
+ ptrkind = qtdefn->Ptrkind();
+ pvariant = (VARIANT *) MemAlloc(sizeof(VARIANT));
+ if (!pvariant) {
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ pvariant->vt = (VARTYPE) tdesckind;
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+
+ switch (tdesckind) {
+
+ case VT_INT:
+ case VT_UINT:
+ if (m_pdtroot->Pgdtinfo()->PgtlibOleContaining()->GetSyskind()
+ != SYS_WIN16)
+ goto TagAsI4;
+
+ // these are invalid as variant tags -- must tag variant as an I2
+ case VT_I1:
+ if (ptrkind == PTRKIND_Basic) {
+ goto TagAsString; // char * is a string
+ }
+ case VT_UI1:
+ case VT_UI2:
+ pvariant->vt = VT_I2;
+
+ case VT_I2 : // these are supported as variant tags
+ case VT_BOOL :
+ DebAssert(offsetof(VARIANT, iVal) == offsetof(VARIANT, bool), "Bad offsets in Variant Union");
+ DebAssert(qvdefn->IsSimpleConst(), "Bad vardefn");
+ pvariant->iVal = (qvdefn->IsSimpleConst()) ?
+ qvdefn->GetSConstVal() :
+ *(SHORT *)PbConstVal(this, qvdefn);
+ break;
+
+ // these are invalid as variant tags -- must tag variant as an I4
+ case VT_UI4:
+TagAsI4:
+ pvariant->vt = VT_I4;
+
+ case VT_I4 : // these are supported as variant tags
+ case VT_R4 :
+ case VT_R8 :
+ case VT_CY :
+ case VT_DATE :
+ case VT_ERROR :
+ // allocate chunk for value
+
+ // We cheat here and pass in SYSKIND_CURRENT instead of m_syskind,
+ // because we've only got system-independent data types coming in here.
+ cb = SizeofTdesckind((TYPEDESCKIND) pvariant->vt, SYSKIND_CURRENT);
+
+ // copy chunk into value
+ DebAssert((offsetof(VARIANT, lVal) == offsetof(VARIANT, fltVal)) &&
+ (offsetof(VARIANT, lVal) == offsetof(VARIANT, dblVal)) &&
+ (offsetof(VARIANT, lVal) == offsetof(VARIANT, cyVal)) &&
+ (offsetof(VARIANT, lVal) == offsetof(VARIANT, scode)) &&
+ (offsetof(VARIANT, lVal) == offsetof(VARIANT, date)),
+ "Bad offsets in Variant Union");
+ memcpy(&(pvariant->lVal), PbConstVal(this, qvdefn), cb);
+ break;
+
+ case VT_LPSTR: // const value should also be a bstr
+TagAsString:
+ pvariant->vt = VT_BSTR; // update tag & fall through
+ case VT_BSTR : // TDESCKIND_String
+ cb = (UINT)*(USHORT *)PbConstVal(this, qvdefn);
+ bstr = (BSTR)AllocBstrLenA(NULL, cb);
+ if (!bstr) {
+ MemFree(pvariant);
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+ memcpy(bstr, PbConstVal(this, qvdefn) + sizeof(USHORT), cb);
+#if OE_WIN32
+ if ((hresult = ConvertBstrToWInPlace(&bstr)) != NOERROR) {
+ FreeBstr(bstr);
+ err = TiperrOfHresult(hresult);
+ goto Error;
+ }
+#endif //OE_WIN32
+ pvariant->bstrVal = bstr;
+ break;
+ case VT_VARIANT :
+ if (!(pvariant->pvarVal = (VARIANT *) MemAlloc(sizeof(VARIANT)))) {
+ err = TIPERR_OutOfMemory;
+ MemFree(pvariant);
+ goto Error;
+ }
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+ memcpy(pvariant->pvarVal,
+ PbConstVal(this, qvdefn),
+ sizeof(VARIANT));
+ DebAssert((pvariant->pvarVal->vt == VT_I2) ||
+ (pvariant->pvarVal->vt == VT_BOOL) ||
+ (pvariant->pvarVal->vt == VT_I4) ||
+ (pvariant->pvarVal->vt == VT_R4) ||
+ (pvariant->pvarVal->vt == VT_R8) ||
+ (pvariant->pvarVal->vt == VT_CY) ||
+ (pvariant->pvarVal->vt == VT_DATE) ||
+ (pvariant->pvarVal->vt == VT_ERROR) ||
+ (pvariant->pvarVal->vt == VT_BSTR),
+ "Invalid vt in variant constant");
+ // CONSIDER: share code with VT_BSTR case above
+ if (pvariant->pvarVal->vt == VT_BSTR) {
+ cb = (UINT)*(USHORT *)(PbConstVal(this, qvdefn) + sizeof(VARIANT));
+ bstr = (BSTR)AllocBstrLenA(NULL, cb);
+ if (!bstr) {
+ MemFree(pvariant->pvarVal);
+ MemFree(pvariant);
+ err = TIPERR_OutOfMemory;
+ goto Error;
+ }
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+ memcpy(bstr,
+ PbConstVal(this, qvdefn) + sizeof(VARIANT) + sizeof(USHORT),
+ cb);
+#if OE_WIN32
+ if ((hresult = ConvertBstrToWInPlace(&bstr)) != NOERROR) {
+ FreeBstr(bstr);
+ err = TiperrOfHresult(hresult);
+ goto Error;
+ }
+#endif //OE_WIN32
+ pvariant->pvarVal->bstrVal = bstr;
+ }
+ break;
+
+ default:
+ DebHalt("Invalid tdesckind");
+ break;
+
+ } // switch
+ pvardesc->lpvarValue = pvariant;
+ }
+
+ // no idl info for variables
+ pvardesc->elemdescVar.idldesc.wIDLFlags = 0;
+#if OE_WIN16
+ pvardesc->elemdescVar.idldesc.bstrIDLInfo = NULL;
+#else //OE_WIN16
+ pvardesc->elemdescVar.idldesc.dwReserved = 0;
+#endif //OE_WIN16
+
+ *ppvardesc = pvardesc;
+
+ return err;
+Error:
+ FreeVarDesc(pvardesc);
+ return err;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::GetVarDesc
+*Purpose:
+* Get the index'th VARDESC
+* NOTE: in OLE uses cache.
+*
+*Entry:
+* index - Index of the variable to be returned.
+* The index should be in the range
+* of 0 up to the number of variables in this type -1.
+* ppvardesc - Returns a pointer to a VARDESC that describes
+* the specified variable.
+*
+*Exit:
+* *ppvardesc points to a VARDESC or error returned
+***********************************************************************/
+TIPERROR TYPE_DATA::GetVarDesc(UINT index,
+ VARDESCA **ppvardesc)
+{
+ HDEFN hdefn;
+ DEFN *qdefn;
+ HVAR_DEFN hvdefn, hdefnStart;
+ UINT ivdefn, ivdefnStart;
+ TIPERROR err = TIPERR_None;
+
+ if (CDataMember() <= index) {
+ return TIPERR_ElementNotFound;
+ }
+
+ // Count up to the variable indicated
+ // Note: must skip over nested types.
+ //
+ // in OLE use the cache if there is one and it's useful.
+ if ((HvdefnLast() != HVARDEFN_Nil) &&
+ (index >= UOrdinalHvdefnLast())) {
+ // start from where we stopped last
+ ivdefnStart = UOrdinalHvdefnLast();
+ hdefnStart = HvdefnLast();
+ }
+ else {
+ ivdefnStart = 0;
+ hdefnStart = HdefnFirstDataMbrNestedType();
+ }
+
+ for (ivdefn = ivdefnStart, hdefn = hdefnStart;;) {
+ qdefn = QdefnOfHdefn(hdefn);
+
+ if (qdefn->IsVarDefn()) {
+ if (index == ivdefn++) {
+ // cache the match in OLE
+ SetUOrdinalHvdefnLast(index);
+ SetHvdefnLast((HVAR_DEFN)hdefn);
+ break;
+ } // if match
+ } // if IsVarDefn
+ // no need to rederef!
+ hdefn = qdefn->HdefnNext();
+ } // for
+ hvdefn = (HVAR_DEFN)hdefn;
+ DebAssert(hvdefn != HVARDEFN_Nil, "bad var list.");
+
+ return GetVarDescOfHvdefn(hvdefn, ppvardesc);
+}
+
+
+/***
+*PUBLIC TYPE_DATA::AllocTypeDescOfTypeDefn()
+*Purpose:
+* Allocs a typedesc from a typedefn
+*
+*Entry:
+* htdefn - handle to the typedefn that we are creating a typedesc for
+* isSimpleType - TRUE if handle is literal TYPE_DEFN
+* ptdesc - ptr typedesc to create
+*
+*Exit:
+* Status code returned.
+***********************************************************************/
+
+TIPERROR TYPE_DATA::AllocTypeDescOfTypeDefn(HTYPE_DEFN htdefn,
+ BOOL isSimpleType,
+ TYPEDESC *ptdesc)
+{
+ TYPE_DEFN *qtdefn;
+ SAFEARRAY *qad;
+ HARRAY_DESC had;
+ UINT i, cDims;
+ sHTYPE_DEFN htdefnActual;
+ TIPERROR err = TIPERR_None;
+
+ DebAssert((htdefn != HTYPEDEFN_Nil) && ptdesc, "Invalid Arguments");
+
+ htdefnActual = (sHTYPE_DEFN)htdefn;
+ qtdefn = isSimpleType ?
+ (TYPE_DEFN *)&htdefnActual :
+ QtdefnOfHtdefn(htdefnActual);
+
+ // Note: can't use IsBasicPtr() accessor here since it'll be true
+ // for objects as well (not what we want).
+ //
+ if (qtdefn->Ptrkind() == PTRKIND_Basic) {
+ // Set the top-level typedesc to be VT_PTR, then alloc another
+ // typedesc and enter the switch statement to handle the base type.
+ //
+ qtdefn->SetPtrkind(PTRKIND_Ignore);
+ ptdesc->vt = VT_PTR;
+ if (!(ptdesc->lptdesc = (TYPEDESC *)MemAlloc(sizeof(TYPEDESC)))) {
+ return TIPERR_OutOfMemory;
+ }
+
+ // Now we recurse: note that we've cleared the PTRKIND above
+ // temporarily to avoid infinite recursion...
+ //
+ if ((err = AllocTypeDescOfTypeDefn(htdefnActual,
+ isSimpleType,
+ ptdesc->lptdesc)) != TIPERR_None) {
+ MemFree(ptdesc->lptdesc);
+ ptdesc->lptdesc = NULL;
+ }
+ qtdefn = isSimpleType ?
+ (TYPE_DEFN *)&htdefnActual :
+ QtdefnOfHtdefn(htdefnActual);
+ qtdefn->SetPtrkind(PTRKIND_Basic);
+ return err;
+ } // if
+
+ switch (qtdefn->Tdesckind()) {
+ case TDESCKIND_Ptr :
+ case TDESCKIND_BasicArray :
+ if (!(ptdesc->lptdesc = (TYPEDESC *)MemAlloc(sizeof(TYPEDESC)))) {
+ return TIPERR_OutOfMemory;
+ }
+ // rederef after MemAlloc
+ DebAssert(!isSimpleType, "can't be simple.");
+ qtdefn = QtdefnOfHtdefn(htdefnActual);
+ if ((err = AllocTypeDescOfTypeDefn(
+ qtdefn->HtdefnFoundation(htdefnActual),
+ isSimpleType,
+ ptdesc->lptdesc)) != TIPERR_None) {
+ MemFree(ptdesc->lptdesc);
+ ptdesc->lptdesc = NULL;
+ return err;
+ }
+ qtdefn = QtdefnOfHtdefn(htdefnActual);
+ break;
+ case TDESCKIND_Carray :
+ had = qtdefn->Harraydesc();
+ qad = QarraydescOfHarraydesc(had);
+ cDims = qad->cDims;
+ if (!(ptdesc->lpadesc = (ARRAYDESC*) MemAlloc(offsetof(ARRAYDESC, rgbounds)
+ + cDims * sizeof(SAFEARRAYBOUND)))) {
+ return TIPERR_OutOfMemory;
+ }
+ // rederef after MemAlloc
+ DebAssert(!isSimpleType, "can't be simple.");
+ qtdefn = QtdefnOfHtdefn(htdefnActual);
+ if ((err = AllocTypeDescOfTypeDefn(
+ qtdefn->HtdefnFoundation(htdefnActual),
+ isSimpleType,
+ &(ptdesc->lpadesc->tdescElem))) != TIPERR_None) {
+ MemFree(ptdesc->lpadesc);
+ ptdesc->lpadesc = NULL;
+ return err;
+ }
+ ptdesc->lpadesc->cDims = cDims;
+ qad = QarraydescOfHarraydesc(had);
+ for (i = 0; i < cDims; i++) {
+ ptdesc->lpadesc->rgbounds[i].cElements = qad->rgsabound[i].cElements;
+ ptdesc->lpadesc->rgbounds[i].lLbound = qad->rgsabound[i].lLbound;
+ }
+ qtdefn = QtdefnOfHtdefn(htdefnActual);
+ break;
+ case TDESCKIND_UserDefined :
+
+ // Make sure the himptype levels have been set.
+ IfErrRet(Pdtroot()->MakeHimptypeLevels());
+
+ qtdefn = QtdefnOfHtdefn(htdefnActual);
+ ptdesc->hreftype = Pdtroot()->HreftypeOfHimptype(qtdefn->Himptype());
+ break;
+ default:
+ // Nothing to do here.. just fall through...
+ break;
+ } // switch
+ ptdesc->vt = (VARTYPE) qtdefn->Tdesckind();
+
+ return TIPERR_None;
+}
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::AllocConstValOfVariant
+*Purpose:
+* Allocate a chunk in the typedata that contains the value of a variant
+*
+*Entry:
+* pvariant - the variant to allocate
+* hvdefn - vardefn to add constant value to
+*
+*Exit:
+* TIPERROR
+***********************************************************************/
+
+TIPERROR TYPE_DATA::AllocConstValOfVariant(VARIANT *pvariant,
+ HVAR_DEFN hvdefn)
+{
+ VAR_DEFN *qvdefn;
+ HCHUNK hchunk;
+ ULONG cb;
+ TIPERROR err;
+ BYTE *pbConstVal;
+ BSTRA bstrValA;
+#if OE_WIN32
+ HRESULT hresult;
+#endif //OE_WIN32
+
+ DebAssert(pvariant && (hvdefn != HVARDEFN_Nil), "Invalid args");
+
+ switch (pvariant->vt) {
+ case VT_I2 :
+ case VT_BOOL :
+ DebAssert(offsetof(VARIANT, iVal) == offsetof(VARIANT, bool), "Bad offsets in Variant Union");
+
+ // don't allocate chunk just insert value
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+ qvdefn->SetSConstVal(pvariant->iVal);
+ qvdefn->SetIsSimpleConst(TRUE);
+ break;
+ case VT_I4 :
+ case VT_R4 :
+ case VT_R8 :
+ case VT_CY :
+ case VT_DATE :
+ case VT_ERROR :
+ // allocate chunk for value
+
+ // We cheat here and pass in SYSKIND_CURRENT instead of m_syskind,
+ // because we've only got system-independent data types coming in here.
+ cb = SizeofTdesckind((TYPEDESCKIND)pvariant->vt, SYSKIND_CURRENT);
+ IfErrRet(m_blkmgr.AllocChunk(&hchunk, (UINT)cb));
+
+ // copy value into chunk
+ DebAssert((offsetof(VARIANT, lVal) == offsetof(VARIANT, fltVal)) &&
+ (offsetof(VARIANT, lVal) == offsetof(VARIANT, dblVal)) &&
+ (offsetof(VARIANT, lVal) == offsetof(VARIANT, cyVal)) &&
+ (offsetof(VARIANT, lVal) == offsetof(VARIANT, date)),
+ "Bad offsets in Variant Union");
+ memcpy(m_blkmgr.QtrOfHandle(hchunk),
+ &(pvariant->lVal),
+ (UINT)cb);
+
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+ SetHchunkConstVal(qvdefn, hchunk); // handles mvdefns as well
+ break;
+ case VT_BSTR :
+#if OE_WIN32
+ IfOleErrRetTiperr(ConvertBstrToA(pvariant->bstrVal, &bstrValA));
+#else //OE_WIN32
+ bstrValA = pvariant->bstrVal;
+#endif //OE_WIN32
+ // allocate chunk for string and length prefix
+ cb = BstrLenA(bstrValA);
+
+ if (cb + sizeof(USHORT) > USHRT_MAX) {
+#if OE_WIN32
+ FreeBstrA(bstrValA);
+#endif //OE_WIN32
+ return TIPERR_OutOfMemory;
+ }
+
+ if ((err = m_blkmgr.AllocChunk(&hchunk, (UINT)cb + sizeof(USHORT))) != TIPERR_None) {
+#if OE_WIN32
+ FreeBstrA(bstrValA);
+#endif //OE_WIN32
+ return err;
+ }
+
+ // copy in string USHORT length prefix and string data
+ pbConstVal = m_blkmgr.QtrOfHandle(hchunk);
+ *((USHORT *)pbConstVal) = (USHORT)cb;
+ memcpy(pbConstVal+sizeof(USHORT),
+ (BYTE*)bstrValA,
+ (UINT)cb);
+#if OE_WIN32
+ FreeBstrA(bstrValA);
+#endif //OE_WIN32
+
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+ SetHchunkConstVal(qvdefn, hchunk); // handles mvdefns as well
+ break;
+ case VT_VARIANT :
+ DebAssert((pvariant->pvarVal->vt == VT_I2) ||
+ (pvariant->pvarVal->vt == VT_BOOL) ||
+ (pvariant->pvarVal->vt == VT_I4) ||
+ (pvariant->pvarVal->vt == VT_R4) ||
+ (pvariant->pvarVal->vt == VT_R8) ||
+ (pvariant->pvarVal->vt == VT_CY) ||
+ (pvariant->pvarVal->vt == VT_DATE) ||
+ (pvariant->pvarVal->vt == VT_ERROR) ||
+ (pvariant->pvarVal->vt == VT_BSTR),
+ "Invalid vt in variant constant");
+
+ // copy in whole variant
+ cb = 0;
+ if (pvariant->pvarVal->vt == VT_BSTR) {
+#if OE_WIN32
+ IfOleErrRetTiperr(ConvertBstrToA(pvariant->pvarVal->bstrVal, &bstrValA));
+#else //OE_WIN32
+ bstrValA = pvariant->pvarVal->bstrVal;
+#endif //OE_WIN32
+ // for string copy in string val and length prefix after variant
+ cb = sizeof(USHORT) + BstrLenA(bstrValA);
+
+ if (cb > USHRT_MAX) {
+#if OE_WIN32
+ FreeBstrA(bstrValA);
+#endif // OE_WIN32
+ return TIPERR_OutOfMemory;
+ }
+ }
+
+ if ((err = m_blkmgr.AllocChunk(&hchunk, (UINT)cb + sizeof(VARIANT))) != TIPERR_None) {
+#if OE_WIN32
+ FreeBstrA(bstrValA);
+#endif //OE_WIN32
+ return err;
+ }
+ pbConstVal = m_blkmgr.QtrOfHandle(hchunk);
+
+ // copy in variant
+ memcpy(pbConstVal, pvariant->pvarVal, sizeof(VARIANT));
+
+ if (pvariant->pvarVal->vt == VT_BSTR) {
+ // if string, copy in length prefix and string data
+ *(USHORT *)(pbConstVal + sizeof(VARIANT)) = (USHORT)(cb - sizeof(USHORT));
+ memcpy(pbConstVal + sizeof(VARIANT),
+ (BYTE*)bstrValA,
+ (UINT)cb - sizeof(USHORT));
+#if FV_UNICODE_OLE
+ FreeBstrA(bstrValA);
+#endif //FV_UNICODE_OLE
+ }
+
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+ SetHchunkConstVal(qvdefn, hchunk); // handles mvdefns as well
+ break;
+ default:
+ DebHalt("Invalid vt in variant");
+ break;
+ } // switch
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::SetTypeDefnAlias()
+*Purpose:
+* Allocs a typedefn for the alias
+*
+*Entry:
+* ptdesc - typedesc to crete typedefn for
+*
+*Exit:
+* Tiperror
+***********************************************************************/
+
+TIPERROR TYPE_DATA::SetTypeDefnAlias(TYPEDESC *ptdesc)
+{
+ TIPERROR err;
+ BOOL fIsSimpleType;
+
+ DebAssert(ptdesc, "Invalid parameter");
+ DebAssert((HTYPE_DEFN)m_htdefnAlias == HTYPEDEFN_Nil,
+ "Alias already Set");
+ // This does all the work we want
+ IfErrRet(AllocTypeDefnOfTypeDesc(ptdesc,
+ 0,
+ &m_htdefnAlias,
+ TRUE, // is an alias/allow coclass
+ &fIsSimpleType));
+
+ SetIsSimpleTypeAlias(fIsSimpleType);
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC TYPE_DATA::AddImplType()
+*Purpose:
+* Adds a base class vardefn to this class
+*
+*Entry:
+* index - where to add this class in the list of bases
+* hreftype - which typeinfo for base
+*
+*Exit:
+* Tiperror
+***********************************************************************/
+
+#pragma code_seg(CS_LAYOUT)
+TIPERROR TYPE_DATA::AddImplType(UINT index, HREFTYPE hreftype)
+{
+ sHMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+ HCHUNK hchunk;
+ HTYPE_DEFN htdefn;
+ TYPE_DEFN *qtdefn;
+ TIPERROR err;
+
+ DebAssert(Pdtroot()->CompState() == CS_UNDECLARED, "Invalid state");
+
+ // for V1, we only support appending to the end of the list.
+ // CONSIDER: support arbitrary insertion point like AddFuncDesc/AddVarDesc.
+ if (index != CBase()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ // allocate the var defn
+ IfErrRet(AllocMbrVarDefn(&hmvdefn, FALSE));
+
+ // allocate the type defn for the user defined type
+ IfErrGo(m_blkmgr.AllocChunk(&hchunk, sizeof(TYPE_DEFN) + sizeof(sHIMPTYPE)));
+ htdefn = (HTYPE_DEFN) hchunk;
+ qtdefn = QtdefnOfHtdefn(htdefn);
+ new (qtdefn) TYPE_DEFN;
+
+ qtdefn->SetTdesckind(TDESCKIND_UserDefined);
+
+ // set himptype
+ // CONSIDER: checking the himptype with the impmgr
+ *qtdefn->Qhimptype() = Pdtroot()->HimptypeOfHreftype(hreftype);
+
+ // set the rest of the defns values
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ qmvdefn->SetAccess(ACCESS_Public);
+ qmvdefn->SetVkind(VKIND_Base);
+ qmvdefn->SetIsSimpleType(FALSE);
+ qmvdefn->SetHtdefn(htdefn);
+
+ qmvdefn->SetHmember((ULONG)DISPID_UNKNOWN);
+ qmvdefn->SetImplTypeFlags(0); // init flags to 0
+
+
+ AppendMbrVarDefn(hmvdefn);
+ return TIPERR_None;
+Error:
+ FreeMbrVarDefn(hmvdefn);
+ return err;
+}
+#pragma code_seg()
+
+
+
+/***
+*PRIVATE TYPE_DATA::QtdefnOfIndex(index)
+*Purpose:
+* Gets the qtdefn, given an impltype index
+*
+*Entry:
+* index - index of base class of interest
+*
+*Exit:
+* hmvdefn for this guy
+***********************************************************************/
+
+HMBR_VAR_DEFN TYPE_DATA::HmvdefnOfIndex (UINT index)
+{
+ HMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+
+ // find correct base in list
+ hmvdefn = m_hdefnFirstBase;
+ while (index > 0) {
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ hmvdefn = qmvdefn->HdefnNext();
+ index -= 1;
+ }
+ return hmvdefn;
+}
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::SetImplTypeFlags()
+*Purpose:
+* Sets the impltype flags for a given base class
+*
+*Entry:
+* index - index of base class to set
+* fImplType - flags to set
+*
+*Exit:
+* Tiperror
+***********************************************************************/
+
+TIPERROR TYPE_DATA::SetImplTypeFlags(UINT index, INT fImplType)
+{
+ MBR_VAR_DEFN *qmvdefn;
+
+ if (index >= CBase()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ qmvdefn = QmvdefnOfHmvdefn(HmvdefnOfIndex(index));
+
+ qmvdefn->SetImplTypeFlags((WORD) fImplType);
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC TYPE_DATA::GetImplTypeFlags()
+*Purpose:
+* Gets the impltype flags for a given base class
+*
+*Entry:
+* index - index of base class to get
+* pfImplType - where to put flags
+*
+*Exit:
+* Tiperror
+***********************************************************************/
+
+TIPERROR TYPE_DATA::GetImplTypeFlags(UINT index, INT FAR* pfImplType)
+{
+ MBR_VAR_DEFN *qmvdefn;
+
+ if (index >= CBase()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ qmvdefn = QmvdefnOfHmvdefn(HmvdefnOfIndex(index));
+
+ *pfImplType = (INT)qmvdefn->GetImplTypeFlags();
+
+ return TIPERR_None;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::GetRefTypeOfImplType()
+*Purpose:
+* returns a pointer to a typeinfo for a base class
+*
+*Entry:
+* index - index of base class to get
+*
+*Exit:
+* *pptinfo - pointer to ITypeInfo of base class
+* Tiperror
+***********************************************************************/
+
+TIPERROR TYPE_DATA::GetRefTypeOfImplType(UINT index, HREFTYPE *phreftype)
+{
+ MBR_VAR_DEFN *qmvdefn;
+ HTYPE_DEFN htdefn;
+ TIPERROR err;
+ TYPE_DEFN *qtdefn;
+
+ if (index >= CBase()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ // Make sure all of our levels have been set.
+ IfErrRet(Pdtroot()->MakeHimptypeLevels());
+
+ // get type defn for Himptype
+ qmvdefn = QmvdefnOfHmvdefn(HmvdefnOfIndex(index));
+
+ htdefn = qmvdefn->Htdefn();
+ qtdefn = QtdefnOfHtdefn(htdefn);
+
+ *phreftype = Pdtroot()->HreftypeOfHimptype(qtdefn->HimptypeActual());
+
+ return TIPERR_None;
+}
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::AllocTypeDefnOfTypeDesc()
+*Purpose:
+* Allocs a typedefn from a typedesc
+*
+*Entry:
+* ptdesc - typedesc to crete typedefn for
+* cb - count of bytes required for this typedefn
+* phtdefn - returned handle to the alloced typedefn
+* fAllowCoClass - TRUE if this typedesc can contain a ptr to
+* a coclass.
+*
+*Exit:
+* Status code returned.
+***********************************************************************/
+
+TIPERROR TYPE_DATA::AllocTypeDefnOfTypeDesc(TYPEDESC *ptdesc,
+ UINT cb,
+ sHTYPE_DEFN *phtdefn,
+ BOOL fAllowCoClass,
+ BOOL *pfIsSimpleType)
+{
+ UINT cbNew;
+ UINT i;
+ sHARRAY_DESC had;
+ SAFEARRAY *qad;
+ BYTE *pb;
+
+ HCHUNK hchunk;
+
+ TYPE_DEFN *qtdefn;
+ TYPE_DEFN tdefn;
+ TYPEDESCKIND tdesckind;
+ BOOL isBaseSimple;
+ ITypeInfoA *ptinfo = NULL;
+ TYPEKIND tkind;
+
+ TIPERROR err = TIPERR_None;
+
+ *pfIsSimpleType = FALSE;
+ DebAssert(ptdesc && phtdefn, " Invalid parameters");
+
+ switch (ptdesc->vt) {
+
+ case VT_CARRAY :
+ IfErrRet(AllocArrayDescriptor(ptdesc->lpadesc->cDims, &had));
+ qad = QarraydescOfHarraydesc(had);
+ qad->cDims = ptdesc->lpadesc->cDims;
+ cbNew = sizeof(TYPE_DEFN) + sizeof(sHARRAY_DESC);
+ if ((err = AllocTypeDefnOfTypeDesc(&(ptdesc->lpadesc->tdescElem),
+ cbNew + cb,
+ phtdefn,
+ FALSE, // not an alias
+ &isBaseSimple)) != TIPERR_None) {
+ FreeArrayDescriptor(had);
+ return err;
+ }
+ pb = m_blkmgr.QtrOfHandle(*phtdefn);
+ qtdefn = (TYPE_DEFN *) (pb + cb);
+ new (qtdefn) TYPE_DEFN;
+ qtdefn->SetTdesckind(TDESCKIND_Carray);
+ *((sHARRAY_DESC*)(qtdefn+1)) = (sHARRAY_DESC) had;
+ qad = QarraydescOfHarraydesc(had);
+
+ qad->cbElements = SizeofTdesckind(
+ (TYPEDESCKIND)ptdesc->lpadesc->tdescElem.vt
+ ,m_pdtroot->Pgdtinfo()->PgtlibOleContaining()->GetSyskind()
+ );
+ switch (ptdesc->lpadesc->tdescElem.vt) {
+ case VT_BSTR :
+ qad->fFeatures |= FADF_BSTR;
+ break;
+ case VT_VARIANT :
+ qad->fFeatures |= FADF_VARIANT;
+ break;
+ case VT_DISPATCH :
+ qad->fFeatures |= FADF_DISPATCH;
+ break;
+ case VT_UNKNOWN :
+ qad->fFeatures |= FADF_UNKNOWN;
+ break;
+ default :
+ break;
+ } // switch
+ for (i = 0; i < ptdesc->lpadesc->cDims; i++) {
+ qad->rgsabound[i].cElements = ptdesc->lpadesc->rgbounds[i].cElements;
+ qad->rgsabound[i].lLbound = ptdesc->lpadesc->rgbounds[i].lLbound;
+ }
+ break;
+
+ case VT_SAFEARRAY :
+ IfErrRet(AllocArrayDescriptor(0, &had));
+ qad = QarraydescOfHarraydesc(had);
+ qad->cDims = 0;
+ cbNew = sizeof(TYPE_DEFN) + sizeof(sHARRAY_DESC);
+ // We now need to allocate a TYPE_DEFN for this array's
+ // element type which will be allocated immediately
+ // following the first part.
+ //
+ err = AllocTypeDefnOfTypeDesc(ptdesc->lptdesc, // element typedesc
+ cbNew + cb,
+ phtdefn,
+ fAllowCoClass,
+ &isBaseSimple);
+ if (err != TIPERR_None) {
+ FreeArrayDescriptor(had);
+ return err;
+ }
+ pb = m_blkmgr.QtrOfHandle(*phtdefn);
+ qtdefn = (TYPE_DEFN *) (pb + cb);
+ new (qtdefn) TYPE_DEFN;
+ qtdefn->SetTdesckind(TDESCKIND_BasicArray);
+ qtdefn->SetIsResizable(TRUE);
+ *((sHARRAY_DESC*)(qtdefn+1)) = (sHARRAY_DESC) had;
+ break;
+
+ case VT_PTR :
+ // For BASIC and OLE we always want a PTR to a non-ptr-type
+ // to take up
+ // only two bytes. So, if this PTR points to a non-ptr-type
+ // we set cbNew to zero so that we don't allocate extra space
+ // for the PTR TYPE_DEFN. Instead, we'll set PTRKIND_Basic
+ // on the intrinsic TYPE_DEFN.
+ // And oh by the way we need to remember that this type
+ // is also simple so that we can potentially encode this
+ // TYPE_DEFN in its handle (the famous IsSimpleType optimization).
+ //
+ // In OB, however, we imply a level of indirection with
+ // TDESCKIND_UserDefined so we can pack UDT ** into
+ // one tdefn.
+ //
+ if ((TYPEDESCKIND)ptdesc->lptdesc->vt != TDESCKIND_Ptr
+ ) {
+ cbNew = 0;
+ }
+ else {
+ cbNew = sizeof(TYPE_DEFN);
+ }
+
+ // Create the TYPE_DEFN for the base type. Note that even if
+ // cbNew is zero, we still might alloc space if cb is non-zero.
+ // (Notice that the only memory allocation, if any, happens in
+ // the terminal case of the recursion. At that point, we will
+ // have summed up the total size of the TYPE_DEFN, and we
+ // can just do one alloc and then fill in the parts as we
+ // go back up the stack.)
+ //
+ IfErrRet(AllocTypeDefnOfTypeDesc(ptdesc->lptdesc,
+ cbNew + cb,
+ phtdefn,
+ fAllowCoClass,
+ &isBaseSimple));
+
+
+ // So we've got the base TYPE_DEFN. There are three cases that
+ // we need to handle.
+ // 1) cbNew is nonzero. This means that the base type will
+ // be allocated in the TYPE_DATA's heap.
+ // 2) cbNew is zero, but cb (passed in from above) is nonzero.
+ // Then the base type will be allocated in the TYPE_DATA's heap,
+ // BUT since cbNew is zero, we want to set PTRKIND_BASIC on the
+ // base type instead of creating a new TYPE_DEFN for the PTR.
+ // The other reason that we might want this case is when the
+ // base type has a non-simple TYPEDEFN.
+ // 3) cbNew and cb are zero. In this case, the base type is
+ // actually allocated in *phtdefn that we passed down
+ // recursively. CAREFUL: This means that phtdefn is NOT a
+ // pointer to a handle; it is really a pointer to a TYPE_DEFN.
+ // This is so that intrinsic types (and PTR to intrinsic) only
+ // take up the two bytes of the handle, and don't use space in the
+ // TYPE_DATA's heap. In this case, we have to fake up a pointer
+ // to the TYPE_DEFN and then set PTRKIND_BASIC on it.
+ //
+ if (cbNew) {
+ pb = m_blkmgr.QtrOfHandle(*phtdefn);
+ qtdefn = (TYPE_DEFN *) (pb + cb);
+ new (qtdefn) TYPE_DEFN;
+ qtdefn->SetTdesckind(TDESCKIND_Ptr);
+ qtdefn->SetPtrkind(PTRKIND_Far);
+ }
+ else if (cb || !isBaseSimple) {
+ pb = m_blkmgr.QtrOfHandle(*phtdefn);
+ qtdefn = (TYPE_DEFN *) (pb + cb);
+ qtdefn->SetPtrkind(PTRKIND_Basic);
+ }
+ else {
+ qtdefn = (TYPE_DEFN *) phtdefn;
+ *pfIsSimpleType = TRUE;
+ qtdefn->SetPtrkind(PTRKIND_Basic);
+ }
+ break;
+
+ case VT_USERDEFINED :
+ IfErrRet(Pimpmgr()->GetTypeInfo(
+ Pdtroot()->HimptypeOfHreftype(ptdesc->hreftype),
+ DEP_None,
+ &ptinfo));
+
+ DebAssert(ptinfo != NULL, "null TYPEINFO.");
+
+ ITypeLib *ptlib;
+ UINT index;
+ HRESULT hresult;
+
+ hresult = ptinfo->GetContainingTypeLib(&ptlib, &index);
+
+ if (hresult == NOERROR) {
+ hresult = ptlib->GetTypeInfoType(index, &tkind);
+
+ ptlib->Release();
+ }
+
+ // No longer need this.
+ ptinfo->Release();
+
+ if (hresult != NOERROR) {
+ return TiperrOfHresult(hresult);
+ }
+
+ // Need to give error if the type we're referring to is
+ // TKIND_COCLASS, TKIND_MODULE.
+ //
+ // Those items aren't valid as alias's, or as structure elements,
+ // parameter types, etc -- even pointers to them are no good.
+ //
+ // Note that it's NOT ok to *cast* the typeinfo to a gdtinfo
+ // since this typeinfo could be wrapped.
+ //
+ switch (tkind) {
+ case TKIND_COCLASS:
+ if (fAllowCoClass) {
+ break; // allow alias's to coclass's
+ }
+ case TKIND_MODULE:
+ return TIPERR_TypeMismatch;
+
+ default:
+ break;
+ }
+
+ cbNew = sizeof(TYPE_DEFN) + sizeof(sHIMPTYPE);
+ IfErrRet(m_blkmgr.AllocChunk(&hchunk, cbNew + cb));
+ *phtdefn = (sHTYPE_DEFN) hchunk;
+ pb = m_blkmgr.QtrOfHandle(hchunk);
+ qtdefn = (TYPE_DEFN *) (pb + cb);
+ new (qtdefn) TYPE_DEFN;
+ qtdefn->SetTdesckind(TDESCKIND_UserDefined);
+
+ // set himptype from index
+ *qtdefn->Qhimptype() = Pdtroot()->HimptypeOfHreftype(ptdesc->hreftype);
+ break;
+
+ default :
+ // NOTE: This assert won't work because of things like VT_LPSTR
+ // which can be used in typelib.dll.
+ //
+ // DebAssert(IsSimpleType((TYPEDESCKIND) ptdesc->vt), "must be simple");
+
+ if (cb) {
+ // must allocate block
+ //
+ cbNew = sizeof(TYPE_DEFN);
+ IfErrRet(m_blkmgr.AllocChunk(&hchunk, cbNew + cb));
+ *phtdefn = (sHTYPE_DEFN) hchunk;
+ pb = m_blkmgr.QtrOfHandle(hchunk);
+ qtdefn = (TYPE_DEFN *) (pb + cb);
+ tdesckind = (TYPEDESCKIND)ptdesc->vt;
+ }
+ else {
+ // this is the only type defn, so just use handle as type defn
+ qtdefn = (TYPE_DEFN *)phtdefn;
+ *pfIsSimpleType = TRUE;
+ {
+ tdesckind = (TYPEDESCKIND)ptdesc->vt;
+ }
+ }
+ new (qtdefn) TYPE_DEFN; // construct in place.
+ qtdefn->SetTdesckind(tdesckind); // set the tdesckind finally.
+ break;
+ } // switch
+
+ return TIPERR_None;
+
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::AddVarDesc
+*Purpose:
+* Adds a variable description to the TypeInfo.
+* The index is used to specify the order of the variables.
+* The first variable has an index of zero. If an index is
+* specified that is greater than the number of variables
+* currently in the TypeInfo then an error is returned.
+* Calling this function does not pass ownership of the VARDESC
+* structure to the ICreateTypeInfo.
+*
+*Entry:
+* index - Index before which the variable is to be inserted.
+* The index should be in the range
+* of 0 up to the number of variables in this type.
+* lpvardesc - A pointer to a VARDESC that describes
+* the specified variable.
+* phvdefn - Pointer to allocated handle (OUT). If NULL then
+* client doesn't care (default).
+*
+*Exit:
+* Status code returned.
+***********************************************************************/
+TIPERROR TYPE_DATA::AddVarDesc(UINT index,
+ VARDESCA *pvardesc,
+ HVAR_DEFN *phvdefn)
+{
+ sHMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+ sHTYPE_DEFN htdefn;
+ HDEFN hdefn;
+ DEFN *qdefn;
+ BOOL fIsSimpleType;
+ TIPERROR err = TIPERR_None;
+ BOOL fV2Flags;
+
+ DebAssert(pvardesc != NULL,
+ "TYPE_DATA::AddVarDesc: null VARDESC.");
+
+ DebAssert(Pdtroot()->CompState() == CS_UNDECLARED, "Invalid state");
+
+ if (index > CDataMember()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ fV2Flags = ((pvardesc->wVarFlags & ~VARFLAG_FREADONLY) != 0);
+ IfErrRet(AllocMbrVarDefn(&hmvdefn, fV2Flags));
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ qmvdefn->SetHasV2Flag(fV2Flags);
+
+
+ IfErrGo(AllocTypeDefnOfTypeDesc(&(pvardesc->elemdescVar.tdesc),
+ 0,
+ &htdefn,
+ TRUE, // coclass allowed
+ &fIsSimpleType));
+
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+
+
+ qmvdefn->SetAccess(ACCESS_Public);
+ qmvdefn->SetHlnam(HLNAM_Nil);
+ qmvdefn->SetVkind(VKIND_DataMember);
+
+ qmvdefn->SetHtdefn(htdefn);
+ qmvdefn->SetIsSimpleType(fIsSimpleType);
+
+ // Note that we can distinguish between vars and funcs
+ // by looking at the defnkind.
+ //
+ // validate the incoming memid
+ IfErrGo(ValidateMemid(pvardesc->memid));
+
+ if (pvardesc->memid != DISPID_UNKNOWN) {
+ qmvdefn->SetHmember(pvardesc->memid);
+ } else {
+ TYPEKIND tkind = Pdtroot()->Pgdtinfo()->GetTypeKind();
+
+ if (tkind == TKIND_ENUM || tkind == TKIND_ALIAS) {
+ // Neither of these inherit from anybody, so we can use
+ // a nested depth of zero.
+ //
+ qmvdefn->SetHmember(DataHmemberOfOffset(CDataMember(), 0));
+ }
+ else {
+ qmvdefn->SetHmember((ULONG)DISPID_UNKNOWN);
+ }
+ }
+
+
+#if 0
+ // document that these fields are ignored for AddVarDesc. Callers
+ // shouldn't have to initialize this memory if it is going to
+ // alway be ignored (only applies to function parameters).
+ DebAssert(pvardesc->elemdescVar.idldesc.bstrIDLInfo == NULL,
+ "Idldesc must be NULL");
+ DebAssert(pvardesc->elemdescVar.idldesc.wIDLFlags == 0,
+ "idldesc must be empty");
+#endif //0
+
+
+ qmvdefn->SetIsReadOnly((pvardesc->wVarFlags & VARFLAG_FREADONLY) != 0);
+
+ if (fV2Flags) {
+ DebAssert(qmvdefn->HasV2Flags(), "Bad qmvdefn");
+ qmvdefn->SetWVarFlags(pvardesc->wVarFlags & ~VARFLAG_FREADONLY);
+ }
+
+
+ switch(pvardesc->varkind) {
+ case VAR_PERINSTANCE:
+ qmvdefn->SetOVar(0);
+ break;
+ case VAR_STATIC:
+ qmvdefn->SetIsStatic(TRUE);
+ break;
+ case VAR_CONST:
+ qmvdefn->SetHasConstVal(TRUE);
+ if (qmvdefn->IsSimpleType()) {
+ qmvdefn->QtdefnOfSimpleType()->SetIsConst(TRUE);
+ }
+ else {
+ QtdefnOfHvdefn((HVAR_DEFN)hmvdefn)->SetIsConst(TRUE);
+ }
+ IfErrGo(AllocConstValOfVariant(pvardesc->lpvarValue,
+ (HVAR_DEFN) hmvdefn));
+ // memory may have moved, so re-deref
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ break;
+ case VAR_DISPATCH:
+ qmvdefn->SetIsDispatch(TRUE);
+ // init to some bogus value since this should never be used
+ qmvdefn->SetOVar((USHORT) ~0);
+ break;
+ default:
+ DebHalt("Unrecognized VarKind");
+ } // switch
+
+ // insert defn into list
+ if (index == CDataMember()) {
+ m_hdefnLastDataMbrNestedType = hmvdefn;
+ }
+ if (index == 0) {
+ qmvdefn->SetHdefnNext(HdefnFirstDataMbrNestedType());
+ m_hdefnFirstDataMbrNestedType = hmvdefn;
+ }
+ else {
+ hdefn = HdefnFirstDataMbrNestedType();
+ qdefn = QdefnOfHdefn(hdefn);
+ DebAssert(qdefn->IsMemberVarDefn(), "bad defn type");
+ while (--index) {
+ hdefn = qdefn->HdefnNext();
+ qdefn = QdefnOfHdefn(hdefn);
+ DebAssert(qdefn->IsMemberVarDefn(), "bad defn type");
+ }
+ qmvdefn->SetHdefnNext(qdefn->HdefnNext());
+ qdefn->SetHdefnNext(hmvdefn);
+ }
+
+ m_cDataMember++;
+
+ // Return the allocated handle if they want it.
+ if (phvdefn != NULL) {
+ *phvdefn = hmvdefn;
+ }
+ return err;
+
+Error:
+ FreeMbrVarDefn(hmvdefn);
+ return err;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::SetVarName()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+TIPERROR TYPE_DATA::SetVarName(UINT index, LPSTR szName)
+{
+ HDEFN hdefn;
+ DEFN *qdefn;
+ HLNAM hlnam;
+ TIPERROR err = TIPERR_None;
+ INVOKEKIND invokekind;
+ DebAssert(Pdtroot()->CompState() == CS_UNDECLARED, "Invalid state");
+
+ if (index >= CDataMember()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ IfErrRet(Pnammgr()->HlnamOfStr(szName, &hlnam, FALSE, NULL));
+
+ if (HvdefnOfHlnam(hlnam) != HVARDEFN_Nil) {
+ return TIPERR_AmbiguousName;
+ }
+ if (HfdefnFirstOfHlnam(hlnam,&invokekind) != HFUNCDEFN_Nil) {
+ return TIPERR_AmbiguousName;
+ }
+
+ hdefn = HdefnFirstDataMbrNestedType();
+ qdefn = QdefnOfHdefn(hdefn);
+ DebAssert(qdefn->IsMemberVarDefn(), "bad defn type");
+ while (index > 0) {
+ hdefn = qdefn->HdefnNext();
+ qdefn = QdefnOfHdefn(hdefn);
+ DebAssert(qdefn->IsMemberVarDefn(), "bad defn type");
+ index -= 1;
+ }
+
+ DebAssert(qdefn->Hlnam() == HLNAM_Nil, "Name allready set");
+ qdefn->SetHlnam(hlnam);
+
+ return err;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::SetFuncAndParamNames()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::SetFuncAndParamNames(UINT index,
+ LPOLESTR *rgszNames,
+ UINT cNames)
+{
+ HFUNC_DEFN hfdefn;
+
+ DebAssert(Pdtroot()->CompState() == CS_UNDECLARED, "Invalid state");
+
+ if (index >= CAvailMeth()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ hfdefn = HfdefnFirstAvailMeth();
+ while (index > 0) {
+ index -= 1;
+ hfdefn = HfdefnNextAvailMeth(hfdefn);
+ }
+
+ return SetFuncAndParamNamesOfHfdefn(hfdefn, rgszNames, cNames);
+}
+
+/***
+*PUBLIC TYPE_DATA::SetFuncAndParamNamesOfHfdefn()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::SetFuncAndParamNamesOfHfdefn(HFUNC_DEFN hfdefn,
+ LPOLESTR *rgszNames,
+ UINT cNames)
+{
+ HFUNC_DEFN hfdefnCheck;
+ INVOKEKIND invokekindDummy;
+ FUNC_DEFN *qfdefnCheck;
+
+ FUNC_DEFN *qfdefn;
+ HPARAM_DEFN hparamdefn;
+ PARAM_DEFN *qparamdefn;
+ UINT cParams, i;
+ HLNAM hlnam = HLNAM_Nil;
+ TIPERROR err = TIPERR_None;
+
+ i = 0;
+
+ if (rgszNames[i] != NULL) {
+ IfErrRet(Pnammgr()->HlnamOfStrW(rgszNames[i], &hlnam, FALSE, NULL));
+ }
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ // check for name conflict with variables
+ if (hlnam != HLNAM_Nil && HvdefnOfHlnam(hlnam) != HVARDEFN_Nil) {
+ return TIPERR_AmbiguousName;
+ }
+
+ // check for name conflict with function
+ // This will also catch the case of trying to set the name twice.
+ // It will give "duplicate definition" in this case.
+ //
+ if (hlnam != HLNAM_Nil) {
+ hfdefnCheck = HfdefnFirstOfHlnam(hlnam, &invokekindDummy);
+
+ if (hfdefnCheck != HFUNCDEFN_Nil) {
+ if (qfdefn->IsMethod()) {
+ // can't have non property functions with same name
+ return TIPERR_AmbiguousName;
+ } else {
+ // check for matching name and property kind
+ do {
+ qfdefnCheck = QfdefnOfHfdefn(hfdefnCheck);
+ if (qfdefnCheck->IsMethod()) {
+ return TIPERR_AmbiguousName;
+ }
+ if (qfdefnCheck->InvokeKind() == qfdefn->InvokeKind()) {
+ return TIPERR_AmbiguousName;
+ }
+ hfdefnCheck = HfdefnNextOfHlnam(hlnam, qfdefn->HdefnNext(),&invokekindDummy);
+ } while (hfdefnCheck != HFUNCDEFN_Nil);
+ }
+ }
+ }
+
+ // check for the correct number of parameters
+ cParams = qfdefn->CArgsUnmunged();
+
+ // for PUT and PUTREF (i.e. let and set) property functions, the
+ // last parameters name is not set.
+ //
+ if ((UINT)qfdefn->InvokeKind() &
+ ((UINT)INVOKE_PROPERTYPUT |
+ (UINT)INVOKE_PROPERTYPUTREF))
+ cParams--;
+
+ if ((cParams + 1) != cNames) {
+ return TIPERR_ElementNotFound;
+ }
+
+ DebAssert(qfdefn->Hlnam() == HLNAM_Nil, "Name already set");
+
+ if (hlnam != HLNAM_Nil) {
+ qfdefn->SetHlnam(hlnam);
+ }
+
+ i = 1;
+
+ hparamdefn = qfdefn->m_ftdefn.m_hdefnFormalFirst;
+ while(i <= cParams && i < cNames) {
+ hlnam = HLNAM_Nil;
+
+ if (rgszNames[i] != NULL) {
+ IfErrRet(Pnammgr()->HlnamOfStrW(rgszNames[i], &hlnam, FALSE, NULL));
+ }
+
+ // In OLE we have an array of PARAM_DEFN(s).
+ // Get the ith PARAM_DEFN
+ //
+ qparamdefn = QparamdefnOfIndex(hparamdefn, i-1);
+
+ if (hlnam != HLNAM_Nil) {
+ qparamdefn->SetHlnam(hlnam);
+ }
+
+ i++;
+ }
+ return TIPERR_None;
+}
+
+#pragma code_seg()
+
+
+/***
+*PUBLIC TYPE_DATA::GetNames()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::GetNames(MEMBERID memid,
+ BSTR *rgbstrNames,
+ UINT cNameMax,
+ UINT *lpcName)
+{
+ HDEFN hdefn;
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+ HPARAM_DEFN hparamdefn;
+ PARAM_DEFN *qparamdefn;
+ UINT defnkind;
+ HVAR_DEFN hvdefn;
+ HLNAM hlnam;
+ UINT cParams, i;
+ UINT uParam;
+ TIPERROR err = TIPERR_None;
+
+ if (cNameMax == 0) {
+ *lpcName = 0;
+ return TIPERR_None;
+ }
+
+ i = 0;
+ // check variables
+ // find var defn
+ hdefn = HdefnOfHmember((HMEMBER) memid, &defnkind);
+
+ if (hdefn != HDEFN_Nil) {
+ if (defnkind == DK_VarDefn || defnkind == DK_MbrVarDefn) {
+ // NOTE: no need to cast to MBR_VAR_DEFN since we can treat
+ // a MBR_VAR_DEFN as a VAR_DEFN for our purposes here.
+ //
+ hvdefn = (HVAR_DEFN) hdefn;
+ hlnam = QvdefnOfHvdefn(hvdefn)->Hlnam();
+
+ if (hlnam != HLNAM_Nil) {
+ IfErrGo(Pnammgr()->BstrWOfHlnam(hlnam, rgbstrNames+i));
+ }
+ else {
+ rgbstrNames[i] = AllocBstr(WIDE(""));
+ }
+
+ i++;
+ }
+ else {
+ DebAssert(defnkind == DK_FuncDefn || defnkind == DK_VirtualFuncDefn,
+ "bad defnkind");
+
+ // NOTE: no need to cast to VIRTUAL_FUNC_DEFN since we can treat
+ // a VIRTUAL_FUNC_DEFN as a FUNC_DEFN for our purposes here.
+ //
+ hfdefn = (HFUNC_DEFN) hdefn;
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ // We'd REALLY like to deal only with the PROPERTYGET function
+ // if it exists...so try to get it.
+ //
+ if (!qfdefn->IsPropertyGet()) {
+ HFUNC_DEFN hfdefnGet;
+
+ hfdefnGet = HfdefnOfHmember((HMEMBER)memid, INVOKE_PROPERTYGET);
+
+ if (hfdefnGet != HFUNCDEFN_Nil) {
+ hfdefn = hfdefnGet;
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ }
+ }
+
+ hlnam = qfdefn->Hlnam();
+
+ if (hlnam != HLNAM_Nil) {
+ IfErrRet(Pnammgr()->BstrWOfHlnam(hlnam, rgbstrNames+i));
+ }
+ else {
+ rgbstrNames[i] = AllocBstr(WIDE(""));
+ }
+
+ i++;
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ cParams = qfdefn->CArgsUnmunged();
+
+ // for PUT and PUTREF (i.e. let and set) property functions, the
+ // last parameters name is ignored
+ if ((UINT)qfdefn->InvokeKind() &
+ ((UINT)INVOKE_PROPERTYPUT |
+ (UINT)INVOKE_PROPERTYPUTREF))
+ cParams--;
+
+ hparamdefn = (HPARAM_DEFN) qfdefn->m_ftdefn.m_hdefnFormalFirst;
+ uParam = 0;
+ while (i < min(cParams + 1, cNameMax)) {
+ // In OLE we have an array of PARAM_DEFN(s).
+ //
+ // Get the (uParam)th PARAM_DEFN
+ qparamdefn = QparamdefnOfIndex(hparamdefn, uParam);
+ uParam++;
+
+ hlnam = qparamdefn->Hlnam();
+
+ if (hlnam != HLNAM_Nil) {
+ IfErrGo(Pnammgr()->BstrWOfHlnam(hlnam, rgbstrNames + i));
+ }
+ else {
+ rgbstrNames[i] = AllocBstr(WIDE(""));
+ }
+
+ i++;
+ } // while
+ } // else
+ }
+ else {
+ return TIPERR_ElementNotFound;
+ }
+ *lpcName = i;
+ return err;
+
+Error:
+ while (i > 0) {
+ i -= 1;
+ FreeBstr(rgbstrNames[i]);
+ rgbstrNames[i] = NULL;
+ }
+ *lpcName = 0;
+
+ return err;
+}
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::GetFuncDefnForDoc()
+*Purpose: Returns the HFUNC_DEFN where the caller can save the doc string
+* or the helpContext.
+*
+*Implementation : Get the FUNC_DEFN for passed in index. If this is a
+* property function then check if there is some other
+* property that is the current owner of the doc string/
+* helpContext. If there is some other owner then return
+* the func_defn of that property.
+*
+*Entry:
+* index : index of the function
+*
+*Exit:
+* FUNC_DEFN : func_defn of the function with the passed in index.
+*
+***********************************************************************/
+
+HFUNC_DEFN TYPE_DATA::GetFuncDefnForDoc(UINT index)
+{
+ HFUNC_DEFN hfdefn = HDEFN_Nil;
+ HFUNC_DEFN hfdefnSearch = HDEFN_Nil;
+ FUNC_DEFN *qfdefn, *qfdefnSearch;
+
+ TIPERROR err = TIPERR_None;
+ HLNAM hlnam;
+
+ if (index >= CAvailMeth()) {
+ return HDEFN_Nil;
+ }
+
+ IfErrGo(HfdefnOfIndex(index, &hfdefn));
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ // Search for the owner if this is not the owner
+ if ((qfdefn->HstDocumentation() == HST_Nil) &&
+ (UHelpContextOfEncoding(qfdefn->WHelpContext()) == 0) ) {
+
+ // for property functions walk the list of func_defn and see if there
+ // is some other property(func) who is the owner of the Doc/HelpContext.
+ if (qfdefn->InvokeKind() != INVOKE_FUNC ) {
+ hlnam = qfdefn->Hlnam();
+ hfdefnSearch = HfdefnFirstAvailMeth();
+ while (hfdefnSearch != HDEFN_Nil) {
+ qfdefnSearch = QfdefnOfHfdefn(hfdefnSearch);
+ if ((qfdefnSearch->InvokeKind() != INVOKE_FUNC) &&
+ (hlnam == qfdefnSearch->Hlnam()) &&
+ hfdefn != hfdefnSearch) {
+
+ // Check if the doc string or the help context is set for this
+ // func_defn
+ if ((qfdefnSearch->HstDocumentation() != HST_Nil) ||
+ (UHelpContextOfEncoding(qfdefnSearch->WHelpContext()) != 0) ) {
+ // we found some other owner.
+ break;
+ } // if
+ } // if
+
+ hfdefnSearch = HfdefnNextAvailMeth(hfdefnSearch);
+ }// while
+ } // if
+ } // if
+
+ if (hfdefnSearch != HDEFN_Nil)
+ hfdefn = hfdefnSearch;
+
+
+#if ID_DEBUG
+ // Verify that there is only one owner
+ hfdefnSearch = HfdefnFirstAvailMeth();
+ qfdefnSearch = QfdefnOfHfdefn(hfdefnSearch);
+ if (qfdefn->InvokeKind() != INVOKE_FUNC ) {
+ hlnam = qfdefn->Hlnam();
+
+ hfdefnSearch = HfdefnFirstAvailMeth();
+
+ while (hfdefnSearch != HDEFN_Nil) {
+ qfdefnSearch = QfdefnOfHfdefn(hfdefnSearch);
+ if ((qfdefnSearch->InvokeKind() != INVOKE_FUNC) &&
+ (hlnam == qfdefnSearch->Hlnam()) &&
+ hfdefn != hfdefnSearch) {
+
+ // Check if the doc string or the help context is set for this
+ // func_defn
+ if ((qfdefnSearch->HstDocumentation() != HST_Nil) ||
+ (UHelpContextOfEncoding(qfdefnSearch->WHelpContext()) != 0) ) {
+ DebAssert(hfdefn == hfdefnSearch, " There should be only one owner ");
+ } // if
+ } // if
+
+ hfdefnSearch = qfdefnSearch->HdefnNext();
+ }// while
+ } // if
+
+#endif
+
+ return hfdefn;
+
+
+Error:
+ return HDEFN_Nil;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::SetFuncDocString()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::SetFuncDocString(UINT index, LPSTR szDocString)
+{
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+ TIPERROR err = TIPERR_None;
+
+ HCHUNK hchunk;
+
+
+
+ DebAssert(Pdtroot()->CompState() == CS_UNDECLARED, "Invalid state");
+
+ if (index >= CAvailMeth()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ hfdefn = GetFuncDefnForDoc(index);
+
+ if (hfdefn == HDEFN_Nil) {
+ return TIPERR_ElementNotFound;
+ }
+
+
+ IfErrRet(HchunkOfString(szDocString, &hchunk));
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+
+ qfdefn->SetHstDocumentation((HST)hchunk);
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::SetVarDocString()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::SetVarDocString(UINT index, LPSTR szDocString)
+{
+ HMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+ HCHUNK hchunk;
+ TIPERROR err = TIPERR_None;
+
+ DebAssert(Pdtroot()->CompState() == CS_UNDECLARED, "Invalid state");
+
+ if (index >= CDataMember()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ hmvdefn = (HMBR_VAR_DEFN) HdefnFirstDataMbrNestedType();
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ DebAssert(qmvdefn->IsMemberVarDefn(), "bad defn type");
+ while (index > 0) {
+ hmvdefn = (HMBR_VAR_DEFN) qmvdefn->HdefnNext();
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ DebAssert(qmvdefn->IsMemberVarDefn(), "bad defn type");
+ index -= 1;
+ }
+
+ IfErrRet(HchunkOfString(szDocString, &hchunk));
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ qmvdefn->SetHstDocumentation((HST)hchunk);
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::SetFuncHelpContext()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::SetFuncHelpContext(UINT index, DWORD dwHelpContext)
+{
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+ TIPERROR err = TIPERR_None;
+ WORD wHelpContextEncoded;
+
+ if (index >= CAvailMeth()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ hfdefn = GetFuncDefnForDoc(index);
+
+ if (hfdefn == HDEFN_Nil) {
+ return TIPERR_ElementNotFound;
+ }
+
+ // For space optimization we store encoded help context(2 bytes).
+ // NOTE: this call allocs memory
+ IfErrRet(GetEncodedHelpContext(dwHelpContext, &wHelpContextEncoded));
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+
+ qfdefn->SetWHelpContext(wHelpContextEncoded);
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC TYPE_DATA::SetVarHelpContext()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::SetVarHelpContext(UINT index, DWORD dwHelpContext)
+{
+ HMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+ TIPERROR err = TIPERR_None;
+ WORD wHelpContextEncoded;
+
+ DebAssert(Pdtroot()->CompState() == CS_UNDECLARED, "Invalid state");
+
+ if (index >= CDataMember()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ // For optimizing space we store encoded help context in the DEFN
+ // NOTE: this call allocs memory
+ IfErrRet(GetEncodedHelpContext(dwHelpContext, &wHelpContextEncoded));
+
+ hmvdefn = HdefnFirstDataMbrNestedType();
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ DebAssert(qmvdefn->IsMemberVarDefn(), "bad defn type");
+ while (index > 0) {
+ hmvdefn = (HMBR_VAR_DEFN) qmvdefn->HdefnNext();
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ DebAssert(qmvdefn->IsMemberVarDefn(), "bad defn type");
+ index -= 1;
+ }
+
+ qmvdefn->SetWHelpContext(wHelpContextEncoded);
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC TYPE_DATA::GetDocumentation()
+*Purpose:
+* return the documentation for a func or var
+*
+*Notes:
+* For BASIC modules can not get doc or help for vars/funcs so just
+* return error if asked for
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::GetDocumentation(MEMBERID memid,
+ BSTR FAR*lpbstrName,
+ BSTR FAR*lpbstrDocString,
+ DWORD FAR*lpdwHelpContext)
+{
+ HDEFN hdefn;
+ UINT defnkind;
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+ HMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+ HST hst;
+ ULONG uHelpContext;
+ HLNAM hlnam;
+ TIPERROR err = TIPERR_None;
+
+ // check variables
+ // find var defn
+ hdefn = HdefnOfHmember((HMEMBER) memid, &defnkind);
+ if (hdefn != HDEFN_Nil) {
+ if (defnkind == DK_VarDefn) {
+ hmvdefn = (HMBR_VAR_DEFN) hdefn;
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ hlnam = qmvdefn->Hlnam();
+ hst = qmvdefn->HstDocumentation();
+ uHelpContext = UHelpContextOfEncoding(qmvdefn->WHelpContext());
+ } else {
+ DebAssert(defnkind == DK_FuncDefn, "bad defnkind");
+ hfdefn = (HFUNC_DEFN) hdefn;
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ hlnam = qfdefn->Hlnam();
+
+ hst = qfdefn->HstDocumentation();
+ uHelpContext = UHelpContextOfEncoding(qfdefn->WHelpContext());
+ }
+ } else {
+ return TIPERR_ElementNotFound;
+ }
+
+ // set return values wanted
+ if (lpbstrName) {
+ IfErrRet(Pnammgr()->BstrWOfHlnam(hlnam, lpbstrName));
+ }
+
+ if (lpbstrDocString) {
+ // get doc string if there is one
+ if (hst != HST_Nil) {
+ IfErrGo(StringOfHchunk(hst, (BSTRA *)lpbstrDocString));
+#if OE_WIN32
+ HRESULT hresult;
+ if ((hresult = ConvertBstrToWInPlace(lpbstrDocString)) != NOERROR) {
+ FreeBstr(*lpbstrDocString);
+ err = TiperrOfHresult(hresult);
+ goto Error;
+ }
+#endif //OE_WIN32
+ } else {
+ *lpbstrDocString = NULL;
+ }
+ }
+ if (lpdwHelpContext) {
+ *lpdwHelpContext = uHelpContext;
+ }
+
+ return TIPERR_None;
+Error:
+ if (lpbstrName) {
+ SysFreeString(*lpbstrName);
+ }
+ return err;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::UHelpContextOfEncoding()
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+ULONG TYPE_DATA::UHelpContextOfEncoding(WORD wHelpContext)
+{
+ ULONG uHelpContext;
+ BYTE *pbChunkStr;
+ HCHUNK hchunk;
+ USHORT usDiff;
+
+
+ // check if the encoded help context contains a chunk
+ if(IsHchunk(wHelpContext)) {
+ // Get the hchunk
+ hchunk = GetHchunk(wHelpContext);
+
+ // check if the hchunk stored is valid. if all top 15 bits are 1 then
+ // it is HCHUNK_Nil
+ if (hchunk == 0xfffe) {
+ uHelpContext = 0;
+ }
+ else {
+ // Get the help context stored in the block manager.
+ pbChunkStr = m_blkmgr.QtrOfHandle(hchunk);
+ uHelpContext = *(ULONG *)pbChunkStr;
+ }
+ }
+ else {
+ // get the diff
+ usDiff = GetDiff(wHelpContext);
+ // Calculate the help context
+ if (IsNegative(wHelpContext)) {
+ uHelpContext = m_uHelpContextBase - usDiff;
+ }
+ else {
+ uHelpContext = m_uHelpContextBase + usDiff;
+ }
+
+ }
+
+ return uHelpContext;;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::GetEncodedHelpContext()
+*Purpose: Encodes the help context to a WORD. This is done for space
+* space optimization.
+*
+*IMPLEMENTATION : in the MBR_DEFN we store the difference from the base( the
+* first help context) . The difference can be -ve of +ve #.
+* We only store difference up to 2 to the power of 14.
+* In case the difference is greater than we allocate a
+* chunk of 4 bytes(ULONG) and store the difference there.
+*
+*Entry:
+* None.
+*
+*Exit:
+* None.
+*
+***********************************************************************/
+TIPERROR TYPE_DATA::GetEncodedHelpContext(ULONG uHelpContext, WORD *pwHelpContext)
+{
+ ULONG uDiff;
+ TIPERROR err;
+ HCHUNK hchunk;
+ BYTE *pbChunkStr;
+
+ // if we do not have the base yet then make this the base.
+ if (m_uHelpContextBase == 0) {
+ m_uHelpContextBase = uHelpContext;
+ }
+
+ // if the difference can be stored
+ if ((uDiff = AbsDiff(uHelpContext, m_uHelpContextBase)) <= 0x3fff) {
+ *pwHelpContext = 0;
+ *pwHelpContext |= (((USHORT) uDiff) << 2);
+ // set the flag to indicate that we have stored a number
+ SetIsNumber(*pwHelpContext);
+ // Set if the number is -ve;
+ SetNegativeBit(*pwHelpContext, uHelpContext < m_uHelpContextBase);
+ }
+ else {
+ // Since we cannot store the diff we will allocate a chunk for the long
+ // and store the uHelpContext there.
+ IfErrRet(m_blkmgr.AllocChunk(&hchunk, sizeof(ULONG)));
+ pbChunkStr = m_blkmgr.QtrOfHandle(hchunk);
+ *(ULONG *)pbChunkStr = (ULONG)uHelpContext;
+
+ DebAssert(!(hchunk & 0x0001), " hchunk should be even ");
+ // Store the hchunk.
+ // Note: the lsb will be used to idicate that we are storing a
+ // hchunk
+ //
+ *pwHelpContext = hchunk;
+
+ // Set the bit to indicate that we have stored a hchunk.
+ SetIsHchunk(*pwHelpContext);
+
+ }
+
+ return TIPERR_None;
+}
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PRIVATE TYPE_DATA::HchunkOfString - Writes string to chunk.
+*Purpose:
+* Allocates a chunk for string, writes string to chunk and
+* produces handle.
+*
+*Implementation Notes:
+* Stores string as an ST (i.e. a ULONG prefixed buffer).
+*
+*Entry:
+* szStr - string (IN).
+* phchunk - Pointer to handle of chunk for string (OUT).
+*
+*Exit:
+* Produces handle to ST for doc string on heap.
+*
+*Errors:
+* TIPERROR
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::HchunkOfString(LPSTR szStr, HCHUNK *phchunk)
+{
+ TIPERROR err;
+
+ DebAssert(phchunk != NULL, "bad param");
+
+ DOCSTR_MGR *pdstrmgr;
+ HST hst;
+
+ // Get the containing typelib.
+ IfErrRet(Pdtroot()->Pgdtinfo()->PgtlibOleContaining()->
+ GetDstrMgr(&pdstrmgr));
+
+ // get the handle for the help string.
+ // Note:- This is a temporary handle. This handle is replaced by
+ // a another handle in UpdateDocStrings().
+ //
+ IfErrRet(pdstrmgr->GetHstOfHelpString(szStr, &hst));
+
+ *phchunk = hst;
+
+ return TIPERR_None;
+}
+#pragma code_seg()
+
+
+/***
+*PUBLIC TYPE_DATA::StringOfHchunk - Reads string from chunk.
+*Purpose:
+* Reads a ULONG-prefixed ST from a chunk and produces a BSTRA.
+*
+*Implementation Notes:
+*
+*Entry:
+* hchunkStr - Handle to chunk containing an ST (IN).
+* plstr - Pointer to a BSTRA (OUT).
+*
+*Exit:
+* Produces BSTRA from chunk on heap.
+*
+*Errors:
+* TIPERR_OutOfMemory
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::StringOfHchunk(HCHUNK hchunkStr, BSTRA *plstr)
+{
+ BYTE *pbChunkStr;
+
+ DebAssert(plstr != NULL, "bad param.");
+
+
+ DOCSTR_MGR *pdstrmgr;
+ TIPERROR err;
+
+ // Get the doc string manager.
+ IfErrRet(Pdtroot()->Pgdtinfo()->PgtlibOleContaining()->
+ GetDstrMgr(&pdstrmgr));
+
+ pbChunkStr = m_blkmgr.QtrOfHandle(hchunkStr);
+
+ // Get the decoded Doc string.
+ //
+ IfErrRet(pdstrmgr->GetDecodedDocStrOfHst(pbChunkStr, (BSTR *)plstr));
+#if OE_WIN32
+ IfErrRet(TiperrOfHresult(ConvertBstrToAInPlace(plstr)));
+#endif
+
+ return (*plstr == NULL) ? TIPERR_OutOfMemory : TIPERR_None;
+}
+
+
+
+
+/***
+*TYPE_DATA::GetDynTypeBindOfHvdefn - get type bind of a var defn
+*Purpose:
+* CONSIDER: ilanc 10-Feb-93:
+* this function should vanish -- all clients should
+* use GetTypeComp and GetTypeAttr after having used GetTypeInfoOfHvdefn.
+*
+* Gets the DYN_TYPEBIND associated with a var defn which describes
+* a base member of a class.
+*
+*Entry:
+* hvardefn - VAR_DEFN describing a base member.
+*
+*Exit:
+* returns TIPERROR.
+* *ppdtbind has the DYN_TYPEBIND, or NULL if the base member isn't
+* of class type or doesn't have a DYN_TYPEBIND.
+* *himptype has himptype (in THIS impmgr) of the type. himptype can be NULL.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::GetDynTypeBindOfHvdefn(HVAR_DEFN hvdefn,
+ DYN_TYPEBIND **ppdtbind,
+ HIMPTYPE * phimptype)
+{
+ DEFN_TYPEBIND *pdfntbind;
+ ITypeInfoA * ptinfo;
+ GEN_DTINFO * pgdtinfo;
+
+ BOOL fGetInterface = FALSE;
+
+ TIPERROR err = TIPERR_None;
+
+ *ppdtbind = NULL; // by default, none.
+
+ IfErrRet(GetTypeInfoOfHvdefn(hvdefn, &ptinfo, phimptype));
+
+ // we only support getting the typebind from an ITypeInfo if it's
+ // one of "our" ITypeInfo's (owned by TYPELIB.DLL or VBA.DLL)
+ if (ptinfo->QueryInterface(IID_TYPELIB_GEN_DTINFO,(LPVOID *)&pgdtinfo) != NOERROR)
+ {
+ err = TIPERR_NotYetImplemented; // CONSIDER: better error?
+ }
+ else {
+ err = pgdtinfo->GetDefnTypeBind(&pdfntbind);
+ pgdtinfo->Release();
+ }
+
+ ptinfo->Release();
+
+ if (err)
+ return err;
+
+ // NOTE: this cast will return NULL in the case of failure
+ // which is what we want.
+ //
+ *ppdtbind = (DYN_TYPEBIND *)
+ pdfntbind->QueryProtocol(DYN_TYPEBIND::szProtocolName);
+
+ return err;
+}
+
+
+/***
+*TYPE_DATA::GetTypeInfoOfHvdefn - get type info of a var defn
+*Purpose:
+* Gets the ITypeInfo associated with a var defn which describes
+* a base member of a class.
+*
+*Entry:
+* hvdefn - VAR_DEFN describing a base member.
+*
+*Exit:
+* returns TIPERROR.
+* *pptinfo has the ITypeInfo, or NULL if the base member isn't
+* of class type.
+* *himptype has himptype (in THIS impmgr) of the type. himptype can be NULL.
+*
+***********************************************************************/
+
+TIPERROR TYPE_DATA::GetTypeInfoOfHvdefn(HVAR_DEFN hvdefn,
+ ITypeInfoA **pptinfo,
+ HIMPTYPE *phimptype)
+{
+ VAR_DEFN *qvdefn;
+ TYPE_DEFN *qtdefn;
+ HIMPTYPE himptype;
+ ITypeInfoA *ptinfo;
+ BOOL fGetInterface = FALSE;
+
+ TIPERROR err = TIPERR_None;
+
+ *pptinfo = NULL; // by default, none.
+
+ // Get HIMPTYPE of the base class.
+ qvdefn = QvdefnOfHvdefn(hvdefn);
+
+ DebAssert(!qvdefn->IsSimpleType(), "can't be simple type");
+ qtdefn = QtdefnOfHtdefn(qvdefn->Htdefn());
+ DebAssert(qtdefn->IsUserDefined(), " must derive from user defined type");
+
+ himptype = qtdefn->HimptypeActual();
+
+ // See if we should be getting the interface side of a dual
+ // interface.
+ //
+ if (himptype & 0x1) {
+ fGetInterface = TRUE;
+ himptype &= ~0x1;
+ }
+
+ if (phimptype != NULL)
+ *phimptype = himptype;
+
+ // Try to load the TYPEINFO.
+ err = Pimpmgr()->GetTypeInfo(himptype, DEP_None, &ptinfo);
+ if (err != TIPERR_None) {
+ }
+ else {
+ if (fGetInterface) {
+ ITypeInfoA *ptinfoDisp;
+ TYPEATTR *ptypeattr;
+ TYPEKIND tkind;
+ HREFTYPE hreftype;
+
+ ptinfoDisp = ptinfo;
+
+ IfErrGo(TiperrOfHresult(ptinfoDisp->GetTypeAttr(&ptypeattr)));
+ tkind = ptypeattr->typekind;
+ DebAssert(ptypeattr->wTypeFlags & TYPEFLAG_FDUAL, "Not a dual");
+ ptinfoDisp->ReleaseTypeAttr(ptypeattr);
+
+ if (tkind == TKIND_DISPATCH) {
+ // Get the other interface.
+ IfErrGo(TiperrOfHresult(ptinfoDisp->GetRefTypeOfImplType(
+ (UINT)-1,
+ &hreftype)));
+ IfErrGo(TiperrOfHresult(ptinfoDisp->GetRefTypeInfo(hreftype,
+ &ptinfo)));
+ ptinfoDisp->Release();
+ }
+ }
+ *pptinfo = ptinfo;
+ }
+
+ return err;
+
+Error:
+ ptinfo->Release();
+
+ return err;
+}
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC EquivTypeDefnsIgnoreByRef
+*Purpose:
+* Compares two type defns. For Basic Arrays, the types
+* are the same if the base type of the arrays are the same.
+* Optionally ignores byref vs. byval differences.
+*
+* Two Nil types are considered equivalent.
+*
+*Entry:
+* ptdata1 - TYPE_DATA containing first type defn.
+* fSimple1 - if htdefn1 is a simple type
+* htdefn1 - first type defn
+* ptdata2 - TYPE_DATA containing 2nd type defn.
+* fSimple2 - if htdefn2 is a simple type
+* htdefn2 - second type defn
+* pfEqual -
+*
+*Exit:
+* returns TRUE if the two have the exact same type.
+***********************************************************************/
+
+TIPERROR EquivTypeDefnsIgnoreByRef(TYPE_DATA *ptdata1,
+ BOOL fSimple1,
+ sHTYPE_DEFN htdefn1,
+ TYPE_DATA *ptdata2,
+ BOOL fSimple2,
+ sHTYPE_DEFN htdefn2,
+ WORD wFlags,
+ BOOL *pfEqual,
+ BOOL fIgnoreByRef)
+{
+ TYPE_DEFN *qtdefn1, *qtdefn2;
+
+ // Special case: htdefn==Nil means the same as void.
+ //
+ // CONSIDER: Should we keep this special case?
+ //
+ if (!fSimple1 && htdefn1 == HDEFN_Nil) {
+ fSimple1 = TRUE;
+ htdefn1 = 0; ((TYPE_DEFN *) &htdefn1)->SetTdesckind(TDESCKIND_Void);
+ }
+ if (!fSimple2 && htdefn2 == HDEFN_Nil) {
+ fSimple2 = TRUE;
+ htdefn2 = 0; ((TYPE_DEFN *) &htdefn2)->SetTdesckind(TDESCKIND_Void);
+ }
+
+ // Simple types are encoded in the handle.
+ if (fSimple1)
+ qtdefn1 = (TYPE_DEFN *) &htdefn1;
+ else
+ qtdefn1 = ptdata1->QtdefnOfHtdefn(htdefn1);
+ if (fSimple2)
+ qtdefn2 = (TYPE_DEFN *) &htdefn2;
+ else
+ qtdefn2 = ptdata2->QtdefnOfHtdefn(htdefn2);
+
+ // This loop iterates along the TYPE_DEFN, comparing all
+ // modifier until we hit a terminating TYPE_DEFN.
+ for (;;) {
+ if (fIgnoreByRef == FALSE) {
+ if (*(USHORT *)qtdefn1 != *(USHORT *)qtdefn2) {
+ *pfEqual = FALSE;
+ return TIPERR_None;
+ }
+ }
+ else {
+ // We don't care about PTRKIND_Basic differences
+ // so just compare the tdesckinds
+ //
+ if (qtdefn1->Tdesckind() != qtdefn2->Tdesckind()
+ || (qtdefn1->IsLCID() != qtdefn2->IsLCID())
+ && !(wFlags & FEQUIVIGNORE_HasLcid)
+ ) {
+ if (qtdefn1->Tdesckind() == TDESCKIND_Ptr) {
+ ++qtdefn1; // increment this guy and go around again
+ continue; // this goes around
+ }
+ if (qtdefn2->Tdesckind() == TDESCKIND_Ptr) {
+ ++qtdefn2; // increment this guy and go around again
+ continue; // this goes around
+ }
+ *pfEqual = FALSE;
+ return TIPERR_None;
+ }
+ }
+
+ switch (qtdefn1->Tdesckind()) {
+ case TDESCKIND_Ptr:
+ // followed by another TYPEDEFN
+ ++qtdefn1;
+ ++qtdefn2;
+ break;
+
+ case TDESCKIND_UserDefined:
+ {
+ HIMPTYPE himptype1, himptype2;
+ // Defer to CompareUHimptypes
+ himptype1 = qtdefn1->Himptype();
+ himptype2 = qtdefn2->Himptype();
+
+ return CompareHimptypes(ptdata1,
+ himptype1,
+ ptdata2,
+ himptype2,
+ pfEqual);
+ }
+
+ case TDESCKIND_Carray:
+ case TDESCKIND_BasicArray:
+ // followed by sHARRAY_DESC which we don't need to
+ // compare, then followed by TYPE_DEFN of base type.
+ qtdefn1 = (TYPE_DEFN *) (((BYTE *) qtdefn1) + sizeof(sHARRAY_DESC) +
+ sizeof(TYPE_DEFN));
+ qtdefn2 = (TYPE_DEFN *) (((BYTE *) qtdefn2) + sizeof(sHARRAY_DESC) +
+ sizeof(TYPE_DEFN));
+ break;
+
+ default:
+ DebHalt("unknown or unsupported TDESCKIND");
+#if ID_DEBUG
+ case TDESCKIND_UI1:
+ case TDESCKIND_I1:
+ case TDESCKIND_UI2:
+ case TDESCKIND_I2:
+ case TDESCKIND_UI4:
+ case TDESCKIND_I4:
+ case TDESCKIND_UI8:
+ case TDESCKIND_I8:
+ case TDESCKIND_R4:
+ case TDESCKIND_R8:
+ case TDESCKIND_Void:
+ case TDESCKIND_String:
+ case TDESCKIND_Currency:
+ case TDESCKIND_Value:
+ case TDESCKIND_Object:
+ case TDESCKIND_IUnknown:
+ case TDESCKIND_LPSTR:
+ case TDESCKIND_LPWSTR:
+ case TDESCKIND_Date:
+ case TDESCKIND_Int:
+ case TDESCKIND_Uint:
+ case TDESCKIND_HResult:
+ case TDESCKIND_Bool:
+ case TDESCKIND_Error:
+ case TDESCKIND_Empty:
+ case TDESCKIND_Null:
+#endif //ID_DEBUG
+ // Nothing additional to compare
+ *pfEqual = TRUE;
+ return TIPERR_None;
+
+ } // switch
+ } // for
+
+ DebHalt("I can never get here, even though compiler thinks I could.");
+ return 0;
+}
+#pragma code_seg()
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*PUBLIC EquivTypeDefns - compare two TYPE_DEFNs
+*Purpose:
+* Compares two type defns. For Basic Arrays, the types
+* are the same if the base type of the arrays are the same.
+*
+* Two Nil types are considered equivalent.
+*
+*Entry:
+* ptdata1 - TYPE_DATA containing first type defn.
+* fSimple1 - if htdefn1 is a simple type
+* htdefn1 - first type defn
+* ptdata2 - TYPE_DATA containing 2nd type defn.
+* fSimple2 - if htdefn2 is a simple type
+* htdefn2 - second type defn
+* pfEqual -
+*
+*Exit:
+* returns TRUE if the two have the exact same type.
+***********************************************************************/
+
+TIPERROR EquivTypeDefns(TYPE_DATA *ptdata1, BOOL fSimple1, sHTYPE_DEFN htdefn1,
+ TYPE_DATA *ptdata2, BOOL fSimple2, sHTYPE_DEFN htdefn2,
+ WORD wFlags, BOOL *pfEqual)
+{
+ return EquivTypeDefnsIgnoreByRef(ptdata1,
+ fSimple1,
+ htdefn1,
+ ptdata2,
+ fSimple2,
+ htdefn2,
+ wFlags,
+ pfEqual,
+ FALSE); // byref != byval
+}
+#pragma code_seg()
+
+
+
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*Private : SetDllEntryDefn
+*Purpose:
+* returns FUNC_DEFN of index
+*Entry:
+* UINT : index of the func defn to retrun
+*
+*Exit:
+* retruns HFUNC_DEFN for the index passed in .
+*
+**********************************************************************/
+TIPERROR TYPE_DATA::SetDllEntryDefn(UINT index, HDLLENTRY_DEFN hdllentrydefn)
+{
+ TIPERROR err = TIPERR_None;
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+
+ IfErrRet(HfdefnOfIndex(index, &hfdefn));
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+
+ qfdefn->SetHdllentrydefn(hdllentrydefn);
+
+ return TIPERR_None;
+
+}
+#pragma code_seg()
+
+
+
+
+
+/***
+*Private : HfdefnOfIndex
+*Purpose:
+* returns FUNC_DEFN of index
+*Entry:
+* UINT : index of the func defn to retrun
+*
+*Exit:
+* retruns HFUNC_DEFN for the index passed in .
+*
+**********************************************************************/
+TIPERROR TYPE_DATA::HfdefnOfIndex(UINT index, HFUNC_DEFN *phfdefn)
+{
+ HFUNC_DEFN hfdefn;
+
+ if (index >= CAvailMeth()) {
+ return TIPERR_ElementNotFound;
+ }
+
+ hfdefn = HfdefnFirstAvailMeth();
+ while (index > 0) {
+ index -= 1;
+ hfdefn = HfdefnNextAvailMeth(hfdefn);
+ DebAssert(hfdefn != HFUNCDEFN_Nil, " Bad func defn " );
+ }
+
+ *phfdefn = hfdefn;
+
+ return TIPERR_None;
+}
+
+
+
+
+
+
+
+#pragma code_seg(CS_CREATE)
+/***
+*Public : UpdateDocStrings
+*Purpose:
+* Walks all the fundefn/vardefn and update the handle to the doc string.
+*
+*Entry:
+* None.
+*
+*Exit:
+* TIPERROR (Tiperr_OutOfMemory);
+*
+**********************************************************************/
+TIPERROR TYPE_DATA::UpdateDocStrings()
+{
+ HFUNC_DEFN hfdefn;
+ FUNC_DEFN *qfdefn;
+ HST hst;
+ LPSTR lpstr;
+ UINT uLen;
+ DOCSTR_MGR *pdstrmgr;
+ HCHUNK hchunk;
+ BYTE *qbChunkStr;
+ HMBR_VAR_DEFN hmvdefn;
+ MBR_VAR_DEFN *qmvdefn;
+ TIPERROR err = TIPERR_None;
+
+ // Get the doc string manager
+ IfErrRet(Pdtroot()->Pgdtinfo()->PgtlibOleContaining()->
+ GetDstrMgr(&pdstrmgr));
+
+ // walk all the func defn and store all the encoded strings.
+ hfdefn = HfdefnFirstMeth();
+ while (hfdefn != HFUNCDEFN_Nil) {
+
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ hst = (HST) qfdefn->HstDocumentation();
+
+ //
+ if (hst != HST_Nil) {
+
+ // ask the doc str manager for the encoded string.
+ IfErrRet(pdstrmgr->GetEncodedDocStrOfHst(hst, &lpstr, &uLen));
+ DebAssert(lpstr != NULL, "");
+
+ // save the encoded string in the blkmgr.
+ IfErrGo(m_blkmgr.AllocChunk(&hchunk, uLen));
+
+ qbChunkStr = m_blkmgr.QtrOfHandle(hchunk);
+ memcpy(qbChunkStr, lpstr, uLen);
+
+ // qfdefn may be invalid by now.
+ qfdefn = QfdefnOfHfdefn(hfdefn);
+ qfdefn->SetHstDocumentation((HST)hchunk);
+
+ // Free the clients memory
+ MemFree(lpstr);
+ }
+
+ // get the next func defn.
+ hfdefn = qfdefn->HdefnNext();
+ }
+
+ DebAssert(hfdefn == HFUNCDEFN_Nil, " Bad func defn " );
+
+ // process each var defn(s)
+ hmvdefn = (HMBR_VAR_DEFN) HdefnFirstDataMbrNestedType();
+
+ while (hmvdefn != HFUNCDEFN_Nil) {
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ DebAssert(qmvdefn->IsMemberVarDefn(), "bad defn type");
+
+ hst = (HST) qmvdefn->HstDocumentation();
+
+ //
+ if (hst != HST_Nil) {
+ // ask the doc str manager for the encoded string.
+ IfErrRet(pdstrmgr->GetEncodedDocStrOfHst(hst, &lpstr, &uLen));
+ DebAssert(lpstr != NULL, "");
+
+ // save the encoded string in the blkmgr.
+ IfErrGo(m_blkmgr.AllocChunk(&hchunk, uLen));
+
+ qbChunkStr = m_blkmgr.QtrOfHandle(hchunk);
+ memcpy(qbChunkStr, lpstr, uLen);
+
+ // re deference the qointer.
+ qmvdefn = QmvdefnOfHmvdefn(hmvdefn);
+ qmvdefn->SetHstDocumentation((HST)hchunk);
+
+ // Free the clients memory
+ MemFree(lpstr);
+ }
+
+ hmvdefn = (HMBR_VAR_DEFN) qmvdefn->HdefnNext();
+ }
+
+ return TIPERR_None;
+Error:
+ MemFree(lpstr);
+}
+#pragma code_seg()
+
+
+// methods that want to be inline but cause header file problems if they are.
+//
+/***
+*PUBLIC TYPE_DATA::HtdefnAlias - TypeDefn of alias
+*Purpose:
+* Returns htdefn of tinfos alias
+*
+*Entry:
+* None
+*
+*Exit:
+* Returns htdefn of tinfos alia
+*
+***********************************************************************/
+
+HTYPE_DEFN TYPE_DATA::HtdefnAlias() const
+{
+ DebAssert(m_pdtroot->Pgdtinfo()->GetTypeKind() == TKIND_ALIAS,
+ "should be TKIND_ALIAS");
+ return (HTYPE_DEFN) m_htdefnAlias;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::SetIsSimpleTypeAlias
+*Purpose:
+* Changes simple type state of alias.
+*
+*Entry:
+* isSimpleType
+*
+*Exit:
+*
+***********************************************************************/
+
+VOID TYPE_DATA::SetIsSimpleTypeAlias(BOOL isSimpleType)
+{
+ DebAssert(m_pdtroot->Pgdtinfo()->GetTypeKind() == TKIND_ALIAS,
+ "should be TKIND_ALIAS");
+ m_isSimpleTypeAlias = (USHORT)isSimpleType;
+}
+
+
+/***
+*PUBLIC TYPE_DATA::IsSimpleTypeAlias - TypeDefn of alias
+*Purpose:
+* TRUE if alias typedefn is simple.
+*
+*Entry:
+* None
+*
+*Exit:
+* TRUE if alias typedefn is simple.
+*
+***********************************************************************/
+
+BOOL TYPE_DATA::IsSimpleTypeAlias() const
+{
+ DebAssert(m_pdtroot->Pgdtinfo()->GetTypeKind() == TKIND_ALIAS,
+ "should be TKIND_ALIAS");
+ return (BOOL)m_isSimpleTypeAlias;
+}
diff --git a/private/oleauto/src/typelib/tdesck.hxx b/private/oleauto/src/typelib/tdesck.hxx
new file mode 100644
index 000000000..66f961ec3
--- /dev/null
+++ b/private/oleauto/src/typelib/tdesck.hxx
@@ -0,0 +1,72 @@
+// tdesck.hxx
+// included by cltypes.hxx
+
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// IMPORTANT: Read this before changing this file
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+// As far as I can tell, here are the other files
+// that need updating when tdesck.hxx is changed.
+// They are:
+// clutil.cxx
+//
+// So if you change this file, make sure you update
+// the others. And if you discover any others that
+// need updating, please add them here.
+//
+// 22-Mar-92 stevenl
+//
+
+#ifndef TDESCK_HXX_INCLUDED
+#define TDESCK_HXX_INCLUDED
+
+// enum TYPEDESCKIND - tdesckind
+//
+enum TYPEDESCKIND
+{
+ TDESCKIND_Empty= VT_EMPTY,
+ TDESCKIND_Null= VT_NULL,
+ TDESCKIND_I2= VT_I2,
+ TDESCKIND_I4= VT_I4,
+ TDESCKIND_R4= VT_R4,
+ TDESCKIND_R8= VT_R8,
+ TDESCKIND_Currency= VT_CY,
+ TDESCKIND_Date= VT_DATE,
+ TDESCKIND_String= VT_BSTR,
+ TDESCKIND_Object= VT_DISPATCH,
+ TDESCKIND_Error= VT_ERROR,
+ TDESCKIND_Bool= VT_BOOL,
+ TDESCKIND_Value= VT_VARIANT,
+ TDESCKIND_IUnknown= VT_UNKNOWN,
+
+ TDESCKIND_I1= VT_I1,
+ TDESCKIND_UI1= VT_UI1,
+ TDESCKIND_UI2= VT_UI2,
+ TDESCKIND_UI4= VT_UI4,
+ TDESCKIND_I8= VT_I8,
+ TDESCKIND_UI8= VT_UI8,
+ TDESCKIND_Int= VT_INT,
+ TDESCKIND_Uint= VT_UINT,
+ TDESCKIND_Void= VT_VOID,
+ TDESCKIND_HResult= VT_HRESULT,
+ TDESCKIND_Ptr= VT_PTR,
+ TDESCKIND_BasicArray= VT_SAFEARRAY,
+ TDESCKIND_Carray= VT_CARRAY,
+ TDESCKIND_UserDefined= VT_USERDEFINED,
+ TDESCKIND_LPSTR= VT_LPSTR,
+ TDESCKIND_LPWSTR= VT_LPWSTR,
+
+ TDESCKIND_MAX, // end of enum marker
+
+ TDESCKIND_Filetime= VT_FILETIME,
+ TDESCKIND_Blob= VT_BLOB,
+ TDESCKIND_Stream= VT_STREAM,
+ TDESCKIND_Storage= VT_STORAGE,
+ TDESCKIND_StreamedObj= VT_STREAMED_OBJECT,
+ TDESCKIND_StoredObj= VT_STORED_OBJECT,
+ TDESCKIND_BlobObj= VT_BLOB_OBJECT,
+ TDESCKIND_CF= VT_CF,
+ TDESCKIND_CLSID= VT_CLSID,
+};
+
+#endif // TDESCK_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/tinfo.hxx b/private/oleauto/src/typelib/tinfo.hxx
new file mode 100644
index 000000000..b0d638dd8
--- /dev/null
+++ b/private/oleauto/src/typelib/tinfo.hxx
@@ -0,0 +1,56 @@
+/***
+*tinfo.hxx - TYPEINFO header file
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Protocol for root of all information about a type.
+*
+*Revision History:
+*
+* 03-Jun-91 alanc: Recreated.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef TINFO_HXX_INCLUDED
+#define TINFO_HXX_INCLUDED
+
+#include "cltypes.hxx"
+
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szTINFO_HXX)
+#define SZ_FILE_NAME g_szTINFO_HXX
+#endif
+
+// UNDONE OA95: This structure should go away.
+
+/***
+*class TYPEINFO - 'ti'
+*Purpose:
+* TYPEINFO Protocol.
+*
+***********************************************************************/
+
+class TYPEINFO : public ITypeInfoA
+{
+public:
+ // TYPEINFO methods
+ virtual TIPERROR EXPORT GetMemberName(HMEMBER hmember, BSTRA *plstrName) = 0;
+ virtual TIPERROR EXPORT GetDynTypeMembers(LPLPDYNTYPEMEMBERS lplpDynTypeMembers) = 0;
+ virtual TIPERROR EXPORT GetDefnTypeBind(LPLPDEFNTBIND pdfntbind) = 0;
+ virtual TIPERROR EXPORT GetTypeFixups(LPLPTYPEFIXUPS lplpTypeFixups) = 0;
+ //virtual TYPEKIND EXPORT GetTypeKind() = 0;
+ virtual TIPERROR EXPORT Reset() = 0;
+
+#ifdef TYPEINFO_VTABLE
+#pragma VTABLE_EXPORT
+#endif
+};
+
+
+#endif // ! TINFO_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/tiperr.h b/private/oleauto/src/typelib/tiperr.h
new file mode 100644
index 000000000..4e05b85f9
--- /dev/null
+++ b/private/oleauto/src/typelib/tiperr.h
@@ -0,0 +1,92 @@
+/***
+*C:\SILVER\D2W32ND\tiperr.h - Defines error code constants
+*
+* THIS FILE IS AUTOMATICALLY GENERATED FROM EB.ERR
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Defines the TIPERR_XXX error codes.
+*
+*****************************************************************************/
+
+#ifndef TIPERR_H_INCLUDED
+#define TIPERR_H_INCLUDED
+
+// Map all of the old TIPERRORs to HRESULTS
+
+#define TIPERR_None NOERROR
+
+#define TIPERR_NotYetImplemented HresultOfScode(E_NOTIMPL)
+#define TIPERR_OutOfMemory HresultOfScode(E_OUTOFMEMORY)
+#define TIPERR_Abort HresultOfScode(E_ABORT)
+#define TIPERR_Unexpected HresultOfScode(E_UNEXPECTED)
+#define TIPERR_InvalidPointer HresultOfScode(E_POINTER)
+#define TIPERR_InvalidHandle HresultOfScode(E_HANDLE)
+#define TIPERR_InvalidArg HresultOfScode(E_INVALIDARG)
+#define TIPERR_NoInterface HresultOfScode(E_NOINTERFACE)
+#define TIPERR_PermissionDenied HresultOfScode(E_ACCESSDENIED)
+
+#define TIPERR_WriteFault HresultOfScode(STG_E_WRITEFAULT)
+#define TIPERR_InsufficientMemory HresultOfScode(STG_E_INSUFFICIENTMEMORY)
+#define TIPERR_NoMoreFiles HresultOfScode(STG_E_NOMOREFILES)
+#define TIPERR_FileShareViolation HresultOfScode(STG_E_SHAREVIOLATION)
+#define TIPERR_FileLockViolation HresultOfScode(STG_E_LOCKVIOLATION)
+#define TIPERR_AbnormalApiExit HresultOfScode(STG_E_ABNORMALAPIEXIT)
+#define TIPERR_InvalidHeader HresultOfScode(STG_E_INVALIDHEADER)
+#define TIPERR_Unknown HresultOfScode(STG_E_UNKNOWN)
+#define TIPERR_InvalidFlag HresultOfScode(STG_E_INVALIDFLAG)
+#define TIPERR_InUse HresultOfScode(STG_E_INUSE)
+#define TIPERR_NotCurrent HresultOfScode(STG_E_NOTCURRENT)
+#define TIPERR_Reverted HresultOfScode(STG_E_REVERTED)
+#define TIPERR_CantSave HresultOfScode(STG_E_CANTSAVE)
+#define TIPERR_BadFunctionId HresultOfScode(STG_E_INVALIDFUNCTION)
+#define TIPERR_FileNotFound HresultOfScode(STG_E_FILENOTFOUND)
+#define TIPERR_PathNotFound HresultOfScode(STG_E_PATHNOTFOUND)
+#define TIPERR_TooManyFiles HresultOfScode(STG_E_TOOMANYOPENFILES)
+#define TIPERR_SeekErr HresultOfScode(STG_E_SEEKERROR)
+#define TIPERR_ReadFault HresultOfScode(STG_E_READFAULT)
+#define TIPERR_NoContainingLib HresultOfScode(STG_E_READFAULT)
+#define TIPERR_BadTypeId HresultOfScode(STG_E_READFAULT)
+#define TIPERR_BadLibId HresultOfScode(STG_E_READFAULT)
+#define TIPERR_Eof HresultOfScode(STG_E_READFAULT)
+#define TIPERR_FileAlreadyExists HresultOfScode(STG_E_FILEALREADYEXISTS)
+#define TIPERR_DiskFull HresultOfScode(STG_E_MEDIUMFULL)
+#define TIPERR_ShareRequired HresultOfScode(STG_E_SHAREREQUIRED)
+#define TIPERR_DLLLoadErr HresultOfScode(TYPE_E_CANTLOADLIBRARY)
+#define TIPERR_CodeResourceNotFound HresultOfScode(TYPE_E_CANTLOADLIBRARY)
+#define TIPERR_CodeResourceLockError HresultOfScode(TYPE_E_CANTLOADLIBRARY)
+#define TIPERR_InvalidOrdinal HresultOfScode(TYPE_E_DLLFUNCTIONNOTFOUND)
+#define TIPERR_InvalidDllFunctionName HresultOfScode(TYPE_E_DLLFUNCTIONNOTFOUND)
+#define TIPERR_TypeMismatch HresultOfScode(TYPE_E_TYPEMISMATCH)
+#define TIPERR_ExpectedFuncNotModule HresultOfScode(TYPE_E_TYPEMISMATCH)
+#define TIPERR_ExpectedFuncNotRecord HresultOfScode(TYPE_E_TYPEMISMATCH)
+#define TIPERR_ExpectedFuncNotProject HresultOfScode(TYPE_E_TYPEMISMATCH)
+#define TIPERR_ExpectedFuncNotVar HresultOfScode(TYPE_E_TYPEMISMATCH)
+#define TIPERR_ExpectedTypeNotProj HresultOfScode(TYPE_E_TYPEMISMATCH)
+#define TIPERR_UnsuitableFuncPropMatch HresultOfScode(TYPE_E_TYPEMISMATCH)
+#define TIPERR_WrongTypeKind HresultOfScode(TYPE_E_WRONGTYPEKIND)
+#define TIPERR_OutOfBounds HresultOfScode(TYPE_E_OUTOFBOUNDS)
+#define TIPERR_IOError HresultOfScode(TYPE_E_IOERROR)
+#define TIPERR_CantCreateTmpFile HresultOfScode(TYPE_E_CANTCREATETMPFILE)
+#define TIPERR_BufferTooSmall HresultOfScode(TYPE_E_BUFFERTOOSMALL)
+#define TIPERR_InvDataRead HresultOfScode(TYPE_E_INVDATAREAD)
+#define TIPERR_UnsupFormat HresultOfScode(TYPE_E_UNSUPFORMAT)
+#define TIPERR_ModNameConflict HresultOfScode(TYPE_E_NAMECONFLICT)
+#define TIPERR_RegistryAccess HresultOfScode(TYPE_E_REGISTRYACCESS)
+#define TIPERR_LibNotRegistered HresultOfScode(TYPE_E_LIBNOTREGISTERED)
+#define TIPERR_UndefinedType HresultOfScode(TYPE_E_UNDEFINEDTYPE)
+#define TIPERR_QualifiedNameDisallowed HresultOfScode(TYPE_E_QUALIFIEDNAMEDISALLOWED)
+#define TIPERR_InvalidState HresultOfScode(TYPE_E_INVALIDSTATE)
+#define TIPERR_ElementNotFound HresultOfScode(TYPE_E_ELEMENTNOTFOUND)
+#define TIPERR_AmbiguousName HresultOfScode(TYPE_E_AMBIGUOUSNAME)
+#define TIPERR_UnknownLcid HresultOfScode(TYPE_E_UNKNOWNLCID)
+#define TIPERR_BadModuleKind HresultOfScode(TYPE_E_BADMODULEKIND)
+#define TIPERR_SizeTooBig HresultOfScode(TYPE_E_SIZETOOBIG)
+#define TIPERR_DuplicateId HresultOfScode(TYPE_E_DUPLICATEID)
+#define TIPERR_InvalidId HresultOfScode(TYPE_E_INVALIDID)
+#define TIPERR_InconsistentPropFuncs HresultOfScode(TYPE_E_INCONSISTENTPROPFUNCS)
+#define TIPERR_CircularType HresultOfScode(TYPE_E_CIRCULARTYPE)
+
+#endif // !TIPERR_H_INCLUDED
diff --git a/private/oleauto/src/typelib/tlibfrag.r b/private/oleauto/src/typelib/tlibfrag.r
new file mode 100644
index 000000000..671f00431
--- /dev/null
+++ b/private/oleauto/src/typelib/tlibfrag.r
@@ -0,0 +1,36 @@
+
+/*
+
+ For PowerPC native Shared Libraries and Applications, make a cfrg resource.
+ For Applications be sure to use kIsApp and not kIsLib.
+ For Shared Libraries be sure to use kIsLib not kIsApp.
+
+ For application plug ins, see the conventions established by the application vendor.
+
+ Making a shared library:
+ Rez -i : Types.r CodeFragmentTypes.r LibIcon.r {Active} -a -o MathLib -t shlb -c cfmg
+ SetFile MathLib -a iB
+
+ Making an application:
+ Rez Types.r CodeFragmentTypes.r {Active} -a -o Application -t APPL
+
+ This example is customized for building an application "MyApp"
+
+ Change all occurences of MyApp to YourApp or YourLib
+ NOTE: ID must be zero.
+ (Sysheap & Locked are no longer required, and not recommended.)
+
+*/
+#include "Types.r"
+#include "CodeFrag.r"
+resource 'cfrg' (0) {
+ {
+ kPowerPC,
+ kFullLib,
+ kNoVersionNum,kNoVersionNum,
+ 0, 0,
+ kIsApp,kOnDiskFlat,kZeroOffset,kWholeFork,
+ TLIB_NAME
+ }
+};
+
diff --git a/private/oleauto/src/typelib/tlibguid.c b/private/oleauto/src/typelib/tlibguid.c
new file mode 100644
index 000000000..170bf447f
--- /dev/null
+++ b/private/oleauto/src/typelib/tlibguid.c
@@ -0,0 +1,69 @@
+/***
+*tlibguid.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module instantiates the data for the TypeInfo related GUIDs
+* that are exported by typelib.dll.
+*
+* Note: the numbers that appear in the DEFINE_OLEGUID macros below
+* *must* match those that appear in the ole supplied header: dispatch.h.
+*
+*
+*Revision History:
+*
+* [00] 13-Feb-92 bradlo: created
+*
+*****************************************************************************/
+
+#include "switches.hxx"
+#include "version.hxx"
+#include "typelib.hxx"
+
+#if OE_MAC
+// HACK to make GUID's be defined in a FAR segment w/o changing the OLE
+// header files (works arounds a Wings bug). Define-away 'const' so that
+// they get put into .fardata like they're supposed to.
+#define const
+#endif
+
+#if BLD_MAC
+#include "silver.hxx"
+#endif //BLD_MAC
+
+//OLE uses _MAC to determine if this is a Mac build
+#if OE_MAC
+# define _MAC
+#endif
+
+// initguid.h requires this.
+#if OE_WIN32
+#define INC_OLE2
+#include <ole2.h>
+#else
+#include <compobj.h>
+#endif
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+
+#if !FV_UNICODE_OLE && !OE_MACPPC
+// gives dup def warnings when linked with the static ole2di32.lib
+DEFINE_OLEGUID(IID_ITypeInfo, 0x00020401, 0, 0);
+DEFINE_OLEGUID(IID_ITypeLib, 0x00020402, 0, 0);
+DEFINE_OLEGUID(IID_ITypeComp, 0x00020403, 0, 0);
+DEFINE_OLEGUID(IID_ICreateTypeInfo, 0x00020405, 0, 0);
+DEFINE_OLEGUID(IID_ICreateTypeLib, 0x00020406, 0, 0);
+
+DEFINE_OLEGUID(CLSID_PSDispatch, 0x00020420, 0, 0);
+#endif //!FV_UNICODE_OLE
+
+DEFINE_OLEGUID(CLSID_PSRemoteTypeInfo, 0x00020424, 0, 0);
+
+#if OE_MAC
+# undef _MAC
+#endif
diff --git a/private/oleauto/src/typelib/tlibpch.cxx b/private/oleauto/src/typelib/tlibpch.cxx
new file mode 100644
index 000000000..1e7a6ca85
--- /dev/null
+++ b/private/oleauto/src/typelib/tlibpch.cxx
@@ -0,0 +1,178 @@
+// TYPELIB.DLL specific precompiled header
+// 05-Jan-93 ilanc
+// 31-Jan-93 Rajivk: removed typemgr from typelib.dll
+//
+#include "typelib.hxx"
+#include "silver.hxx"
+
+#if OE_MAC
+//
+// We want to include Memory.h, Windows.h and Files.h as they are the
+// most frequently included. The others are files that will be included
+// from Windows.h or Files.h in order of inclusion.
+// These are in order of include frequency, so if you have to cut, cut from
+// the bottom.
+//
+#include <macos\osutils.h>
+#include <macos\segload.h>
+#include <macos\files.h>
+#include <macos\aliases.h>
+#include <macos\memory.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <float.h>
+#include <limits.h>
+#include <malloc.h>
+#include <new.h>
+#include <search.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys\types.h>
+#include <sys\locking.h>
+#include <sys\stat.h>
+#include <sys\timeb.h>
+#include <time.h>
+#if !OE_MAC
+#include <conio.h>
+#endif
+#include <io.h>
+
+#ifndef CONVERT_HXX_INCLUDED
+#include "convert.hxx"
+#endif //CONVERT_HXX_INCLUDED
+
+#ifndef NTSTRING_H_INCLUDED
+#include "ntstring.h"
+#endif //NTSTRING_H_INCLUDED
+
+#ifndef BLKDESC32_HXX_INCLUDED
+#include "blkdsc32.hxx"
+#endif
+
+#ifndef BLKMGR_HXX_INCLUDED
+#include "blkmgr.hxx"
+#endif
+
+#ifndef CLTYPES_HXX_INCLUDED
+#include "cltypes.hxx"
+#endif
+#ifndef CLUTIL_HXX_INCLUDED
+#include "clutil.hxx"
+#endif
+#ifndef CTSEG_HXX_INCLUDED
+#include "ctseg.hxx"
+#endif
+#ifndef DBLKMGR_HXX_INCLUDED
+#include "dblkmgr.hxx"
+#endif
+
+#ifndef DEFN_HXX_INCLUDED
+#include "defn.hxx"
+#endif
+#ifndef DFNTBIND_HXX_INCLUDED
+#include "dfntbind.hxx"
+#endif
+#ifndef DFNTCOMP_HXX_INCLUDED
+#include "dfntcomp.hxx"
+#endif
+#ifndef DFSTREAM_HXX_INCLUDED
+#include "dfstream.hxx"
+#endif
+#ifndef DTBIND_HXX_INCLUDED
+#include "dtbind.hxx"
+#endif
+#ifndef DTMBRS_HXX_INCLUDED
+#include "dtmbrs.hxx"
+#endif
+#ifndef DYNTINFO_HXX_INCLUDED
+#include "dyntinfo.hxx"
+#endif
+#ifndef ENTRYMGR_HXX_INCLUDED
+#include "entrymgr.hxx"
+#endif
+#ifndef ERRMAP_HXX_INCLUDED
+#include "errmap.hxx"
+#endif
+#ifndef EXBIND_HXX_INCLUDED
+#include "exbind.hxx"
+#endif
+#ifndef FCNTL_H_INCLUDED
+#include "fcntl.h"
+#endif
+#ifndef GDTINFO_HXX_INCLUDED
+#include "gdtinfo.hxx"
+#endif
+#ifndef GENPROJ_TYPEBIND_HXX_INCLUDED
+#include "gptbind.hxx"
+#endif
+#ifndef GTLIBSTG_HXX_INCLUDED
+#include "gtlibstg.hxx"
+#endif
+#ifndef IMPMGR_HXX_INCLUDED
+#include "impmgr.hxx"
+#endif
+#ifndef MACHINE_HXX_INCLUDED
+#include "machine.hxx"
+#endif
+#ifndef MEM_HXX_INCLUDED
+#include "mem.hxx"
+#endif
+#ifndef NAMMGR_HXX_INCLUDED
+#include "nammgr.hxx"
+#endif
+#if OE_WIN32
+#ifndef OAUTIL_H_INCLUDED
+#include "oautil.h"
+#endif
+#endif // OE_WIN32
+#ifndef OLE_TYPEMGR_HXX_INCLUDED
+#include "oletmgr.hxx"
+#endif
+#ifndef DSTRMGR_HXX_INCLUDED
+#include "dstrmgr.hxx"
+#endif
+#ifndef RTSHEAP_H_INCLUDED
+#include "rtsheap.h"
+#endif
+#ifndef SHARE_H_INCLUDED
+#include "share.h"
+#endif
+#ifndef SHEAPMGR_HXX_INCLUDED
+#include "sheapmgr.hxx"
+#endif
+#ifndef STLTINFO_HXX_INCLUDED
+#include "stltinfo.hxx"
+#endif
+#ifndef STREAM_HXX_INCLUDED
+#include "stream.hxx"
+#endif
+#ifndef TDATA_HXX_INCLUDED
+#include "tdata.hxx"
+#endif
+#ifndef TINFO_HXX_INCLUDED
+#include "tinfo.hxx"
+#endif
+#ifndef TIPERR_H_INCLUDED
+#include "tiperr.h"
+#endif
+#ifndef TLS_H_INCLUDED
+#include "tls.h"
+#endif
+#ifndef TLIBUTIL_HXX_INCLUDED
+#include "tlibutil.hxx"
+#endif
+#ifndef XSTRING_H_INCLUDED
+#include "xstring.h"
+#endif
+#ifndef TYPELIB_H_INCLUDED
+#include "typelib.hxx"
+#endif
+
+#pragma hdrstop(RTPCHNAME)
+
diff --git a/private/oleauto/src/typelib/tlibutil.cxx b/private/oleauto/src/typelib/tlibutil.cxx
new file mode 100644
index 000000000..2dc4a8d25
--- /dev/null
+++ b/private/oleauto/src/typelib/tlibutil.cxx
@@ -0,0 +1,7729 @@
+/***
+*clutil.cxx - Class Lib component-wide utility functions.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* typelib utility functions
+*
+*Revision History:
+* [00] 24-Jan-93 RajivK: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "typelib.hxx"
+#include "silver.hxx"
+#include <xstring.h>
+#include <time.h>
+#include <ctype.h> // for isspace() et al.
+
+
+#pragma hdrstop(RTPCHNAME)
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+#if OE_MAC
+static char szOleTlibutilCxx[] = __FILE__;
+#define SZ_FILE_NAME szOleTlibutilCxx
+#else
+static char szTlibutilCxx[] = __FILE__;
+#define SZ_FILE_NAME szTlibutilCxx
+#endif
+#endif
+
+
+// forward declarations for DBCS processing
+
+ACHAR MapDBChar(ACHAR xch, LCID lcid);
+unsigned long LHashValOfDBCSName(SYSKIND syskind, LCID lcid, const char FAR* szName);
+
+
+// Define an array for mapping all the characters.
+//
+#pragma code_seg(CS_CP1252)
+ALLOC_CODE(BYTE) g_rgbCodePage1252[256] = {
+ 0 ,
+ 1 ,
+ 2 ,
+ 3 ,
+ 4 ,
+ 5 ,
+ 6 ,
+ 7 ,
+ 8 ,
+ 9 ,
+ 10 ,
+ 11 ,
+ 12 ,
+ 13 ,
+ 14 ,
+ 15 ,
+ 16 ,
+ 17 ,
+ 18 ,
+ 19 ,
+ 20 ,
+ 21 ,
+ 22 ,
+ 23 ,
+ 24 ,
+ 25 ,
+ 26 ,
+ 27 ,
+ 28 ,
+ 29 ,
+ 30 ,
+ 31 ,
+ 32 ,
+ 33 ,
+ 34 ,
+ 35 ,
+ 36 ,
+ 37 ,
+ 38 ,
+ 39 ,
+ 40 ,
+ 41 ,
+ 42 ,
+ 43 ,
+ 44 ,
+ 45 ,
+ 46 ,
+ 0 ,
+ 48 ,
+ 49 ,
+ 50 ,
+ 51 ,
+ 52 ,
+ 53 ,
+ 54 ,
+ 55 ,
+ 56 ,
+ 57 ,
+ 58 ,
+ 59 ,
+ 60 ,
+ 61 ,
+ 62 ,
+ 63 ,
+ 64 ,
+ 65 ,
+ 66 ,
+ 67 ,
+ 68 ,
+ 69 ,
+ 70 ,
+ 71 ,
+ 72 ,
+ 73 ,
+ 74 ,
+ 75 ,
+ 76 ,
+ 77 ,
+ 78 ,
+ 79 ,
+ 80 ,
+ 81 ,
+ 82 ,
+ 83 ,
+ 84 ,
+ 85 ,
+ 86 ,
+ 86 ,
+ 88 ,
+ 85 ,
+ 90 ,
+ 91 ,
+ 92 ,
+ 93 ,
+ 94 ,
+ 95 ,
+ 96 ,
+ 65 ,
+ 66 ,
+ 67 ,
+ 68 ,
+ 69 ,
+ 70 ,
+ 71 ,
+ 72 ,
+ 73 ,
+ 74 ,
+ 75 ,
+ 76 ,
+ 77 ,
+ 78 ,
+ 79 ,
+ 80 ,
+ 81 ,
+ 82 ,
+ 83 ,
+ 84 ,
+ 85 ,
+ 86 ,
+ 86 ,
+ 88 ,
+ 85 ,
+ 90 ,
+ 123 ,
+ 124 ,
+ 125 ,
+ 126 ,
+ 127 ,
+ 127 ,
+ 127 ,
+ 130 ,
+ 70 ,
+ 132 ,
+ 133 ,
+ 134 ,
+ 135 ,
+ 127 ,
+ 137 ,
+ 83 ,
+ 139 ,
+ 140 ,
+ 127 ,
+ 127 ,
+ 127 ,
+ 127 ,
+ 145 ,
+ 146 ,
+ 147 ,
+ 148 ,
+ 149 ,
+ 150 ,
+ 150 ,
+ 152 ,
+ 153 ,
+ 83 ,
+ 155 ,
+ 140 ,
+ 127 ,
+ 127 ,
+ 85 ,
+ 160 ,
+ 161 ,
+ 162 ,
+ 163 ,
+ 164 ,
+ 165 ,
+ 166 ,
+ 167 ,
+ 168 ,
+ 169 ,
+ 65 ,
+ 171 ,
+ 172 ,
+ 150 ,
+ 174 ,
+ 175 ,
+ 176 ,
+ 177 ,
+ 50 ,
+ 51 ,
+ 180 ,
+ 181 ,
+ 182 ,
+ 183 ,
+ 184 ,
+ 49 ,
+ 79 ,
+ 187 ,
+ 188 ,
+ 189 ,
+ 190 ,
+ 191 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 68 ,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 215 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 222 ,
+ 223 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 68 ,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 247 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 222 ,
+ 85
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CP10000)
+ALLOC_CODE(BYTE) g_rgbCodePage10000[256] = {
+ 0 ,
+ 1 ,
+ 2 ,
+ 3 ,
+ 4 ,
+ 5 ,
+ 6 ,
+ 7 ,
+ 8 ,
+ 9 ,
+ 10 ,
+ 11 ,
+ 12 ,
+ 13 ,
+ 14 ,
+ 15 ,
+ 16 ,
+ 17 ,
+ 18 ,
+ 19 ,
+ 20 ,
+ 21 ,
+ 22 ,
+ 23 ,
+ 24 ,
+ 25 ,
+ 26 ,
+ 27 ,
+ 28 ,
+ 29 ,
+ 30 ,
+ 31 ,
+ 32 ,
+ 33 ,
+ 34 ,
+ 35 ,
+ 36 ,
+ 37 ,
+ 38 ,
+ 39 ,
+ 40 ,
+ 41 ,
+ 42 ,
+ 43 ,
+ 44 ,
+ 45 ,
+ 46 ,
+ 0 ,
+ 48 ,
+ 49 ,
+ 50 ,
+ 51 ,
+ 52 ,
+ 53 ,
+ 54 ,
+ 55 ,
+ 56 ,
+ 57 ,
+ 58 ,
+ 59 ,
+ 60 ,
+ 61 ,
+ 62 ,
+ 63 ,
+ 64 ,
+ 65 ,
+ 66 ,
+ 67 ,
+ 68 ,
+ 69 ,
+ 70 ,
+ 71 ,
+ 72 ,
+ 73 ,
+ 74 ,
+ 75 ,
+ 76 ,
+ 77 ,
+ 78 ,
+ 79 ,
+ 80 ,
+ 81 ,
+ 82 ,
+ 83 ,
+ 84 ,
+ 85 ,
+ 86 ,
+ 86 ,
+ 88 ,
+ 85 ,
+ 90 ,
+ 91 ,
+ 92 ,
+ 93 ,
+ 94 ,
+ 95 ,
+ 96 ,
+ 65 ,
+ 66 ,
+ 67 ,
+ 68 ,
+ 69 ,
+ 70 ,
+ 71 ,
+ 72 ,
+ 73 ,
+ 74 ,
+ 75 ,
+ 76 ,
+ 77 ,
+ 78 ,
+ 79 ,
+ 80 ,
+ 81 ,
+ 82 ,
+ 83 ,
+ 84 ,
+ 85 ,
+ 86 ,
+ 86 ,
+ 88 ,
+ 85 ,
+ 90 ,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 78 ,
+ 79 ,
+ 85 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 65 ,
+ 79 ,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 65 ,
+ 79 ,
+ 189,
+ 65 ,
+ 79 ,
+ 192,
+ 193,
+ 194,
+ 195,
+ 70 ,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 65 ,
+ 65 ,
+ 79 ,
+ 206,
+ 206,
+ 208,
+ 208,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 85 ,
+ 85 ,
+ 218,
+ 219,
+ 220,
+ 221,
+ 63 ,
+ 63 ,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 65 ,
+ 69 ,
+ 65 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 79 ,
+ 79 ,
+ 63 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 73 ,
+ 127,
+ 247,
+ 127,
+ 249,
+ 250,
+ 251,
+ 63 ,
+ 253,
+ 254,
+ 127
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CP1250)
+ALLOC_CODE(BYTE) g_rgbCodePage1250[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+0 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+127,
+127,
+127,
+130,
+127,
+132,
+133,
+134,
+135,
+127,
+137,
+83 ,
+139,
+83 ,
+84 ,
+90 ,
+90 ,
+127,
+145,
+146,
+147,
+148,
+149,
+150,
+150,
+127,
+153,
+83 ,
+155,
+83 ,
+84 ,
+90 ,
+90 ,
+160,
+127,
+162,
+76 ,
+164,
+65 ,
+166,
+167,
+168,
+169,
+83 ,
+171,
+172,
+150,
+174,
+90 ,
+176,
+177,
+178,
+76 ,
+180,
+181,
+182,
+183,
+184,
+65 ,
+83 ,
+187,
+76 ,
+189,
+76 ,
+90 ,
+82 ,
+65 ,
+65 ,
+65 ,
+65 ,
+76 ,
+67 ,
+67 ,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+68 ,
+208,
+78 ,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+215,
+82 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+84 ,
+223,
+82 ,
+65 ,
+65 ,
+65 ,
+65 ,
+76 ,
+67 ,
+67 ,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+68 ,
+208,
+78 ,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+247,
+82 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+84 ,
+255
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CP1251)
+ALLOC_CODE(BYTE) g_rgbCodePage1251[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+0 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+127,
+127,
+127,
+130,
+70 ,
+132,
+133,
+134,
+135,
+127,
+137,
+83 ,
+139,
+140,
+127,
+127,
+127,
+127,
+145,
+146,
+147,
+148,
+149,
+150,
+150,
+152,
+153,
+83 ,
+155,
+140,
+127,
+127,
+89 ,
+160,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+150,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+79 ,
+215,
+79 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+222,
+223,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+79 ,
+247,
+79 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+222,
+89
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CP10029)
+ALLOC_CODE(BYTE) g_rgbCodePage10029[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+0 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+127,
+65 ,
+65 ,
+65 ,
+69 ,
+65 ,
+79 ,
+85 ,
+65 ,
+65 ,
+67 ,
+65 ,
+67 ,
+67 ,
+67 ,
+69 ,
+90 ,
+90 ,
+68 ,
+73 ,
+68 ,
+69 ,
+69 ,
+69 ,
+79 ,
+69 ,
+79 ,
+79 ,
+79 ,
+85 ,
+69 ,
+69 ,
+85 ,
+160,
+161,
+69 ,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+170,
+69 ,
+172,
+173,
+71 ,
+73 ,
+73 ,
+73 ,
+178,
+179,
+73 ,
+75 ,
+182,
+183,
+76 ,
+76 ,
+76 ,
+76 ,
+76 ,
+76 ,
+76 ,
+78 ,
+78 ,
+78 ,
+194,
+195,
+78 ,
+78 ,
+198,
+199,
+200,
+201,
+202,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+208,
+208,
+210,
+211,
+212,
+213,
+214,
+215,
+79 ,
+82 ,
+82 ,
+82 ,
+220,
+221,
+82 ,
+82 ,
+82 ,
+83 ,
+226,
+227,
+83 ,
+83 ,
+83 ,
+65 ,
+84 ,
+84 ,
+73 ,
+90 ,
+90 ,
+85 ,
+79 ,
+79 ,
+85 ,
+85 ,
+85 ,
+85 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+89 ,
+75 ,
+90 ,
+76 ,
+76 ,
+71 ,
+255
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CP10007)
+ALLOC_CODE(BYTE) g_rgbCodePage10007[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+0 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+127,
+128,
+129,
+130,
+131,
+132,
+133,
+134,
+135,
+136,
+137,
+138,
+139,
+140,
+141,
+142,
+143,
+144,
+145,
+146,
+147,
+148,
+149,
+150,
+151,
+152,
+153,
+154,
+155,
+156,
+157,
+158,
+159,
+160,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+170,
+171,
+171,
+173,
+174,
+174,
+176,
+177,
+178,
+179,
+167,
+181,
+182,
+183,
+184,
+184,
+186,
+186,
+188,
+188,
+190,
+190,
+183,
+193,
+194,
+195,
+70 ,
+197,
+198,
+199,
+200,
+201,
+202,
+203,
+203,
+205,
+205,
+193,
+208,
+208,
+210,
+211,
+212,
+213,
+214,
+215,
+216,
+216,
+218,
+218,
+220,
+221,
+221,
+159,
+128,
+129,
+130,
+131,
+132,
+133,
+134,
+135,
+136,
+137,
+138,
+139,
+140,
+141,
+142,
+143,
+144,
+145,
+146,
+147,
+148,
+149,
+150,
+151,
+152,
+153,
+154,
+155,
+156,
+157,
+158,
+159
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CPWGREEK)
+ALLOC_CODE(BYTE) g_rgbCodePageWGreek[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+47 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+0 ,
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+0 ,
+139,
+0 ,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+0 ,
+153,
+0 ,
+155,
+0 ,
+0 ,
+0 ,
+0 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+0 ,
+171,
+172,
+45 ,
+174,
+45 ,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+185,
+186,
+187,
+188,
+189,
+190,
+191,
+186,
+162,
+194,
+195,
+196,
+184,
+198,
+185,
+200,
+186,
+202,
+203,
+204,
+205,
+206,
+188,
+208,
+209,
+0 ,
+211,
+212,
+190,
+214,
+215,
+216,
+191,
+186,
+190,
+162,
+184,
+185,
+186,
+190,
+162,
+194,
+195,
+196,
+184,
+198,
+185,
+200,
+186,
+202,
+203,
+204,
+205,
+206,
+188,
+208,
+209,
+211,
+211,
+212,
+190,
+214,
+215,
+216,
+191,
+186,
+190,
+188,
+190,
+191,
+0
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CPWICELAND)
+ALLOC_CODE(BYTE) g_rgbCodePageWIceland[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+47 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+0 ,
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+83 ,
+139,
+140,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+152,
+153,
+83 ,
+155,
+140,
+0 ,
+0 ,
+89 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+45 ,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+193,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+201,
+69 ,
+69 ,
+73 ,
+205,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+211,
+79 ,
+79 ,
+214,
+215,
+214,
+85 ,
+218,
+85 ,
+85 ,
+221,
+222,
+223,
+65 ,
+193,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+201,
+69 ,
+69 ,
+73 ,
+205,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+211,
+79 ,
+79 ,
+214,
+247,
+214,
+85 ,
+218,
+85 ,
+85 ,
+221,
+222,
+89
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CPWTURKISH)
+ALLOC_CODE(BYTE) g_rgbCodePageWTurkish[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+47 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+0 ,
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+83 ,
+139,
+140,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+152,
+153,
+83 ,
+155,
+140,
+0 ,
+0 ,
+89 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+45 ,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+199,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+214,
+215,
+79 ,
+85 ,
+85 ,
+85 ,
+220,
+221,
+222,
+223,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+199,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+214,
+247,
+79 ,
+85 ,
+85 ,
+85 ,
+220,
+221,
+222,
+89
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CPWNORWEGIAN)
+ALLOC_CODE(BYTE) g_rgbCodePageWNorwegian[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+47 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+0 ,
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+83 ,
+139,
+140,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+152,
+153,
+83 ,
+155,
+140,
+0 ,
+0 ,
+89 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+45 ,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+65 ,
+65 ,
+65 ,
+196,
+197,
+196,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+68 ,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+214,
+215,
+214,
+85 ,
+85 ,
+85 ,
+89 ,
+89 ,
+222,
+223,
+65 ,
+65 ,
+65 ,
+65 ,
+196,
+197,
+196,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+68 ,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+214,
+247,
+214,
+85 ,
+85 ,
+85 ,
+89 ,
+89 ,
+222,
+89
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CPWENGIRELAND)
+ALLOC_CODE(BYTE) g_rgbCodePageWEngIreland[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+47 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+0 ,
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+83 ,
+139,
+140,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+152,
+153,
+83 ,
+155,
+140,
+0 ,
+0 ,
+89 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+45 ,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+79 ,
+215,
+79 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+222,
+223,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+79 ,
+247,
+79 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+222,
+89
+};
+
+#pragma code_seg()
+
+#pragma code_seg(CS_CPMGREEK)
+ALLOC_CODE(BYTE) g_rgbCodePageMGreek[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+47 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+0 ,
+65 ,
+49 ,
+50 ,
+69 ,
+51 ,
+79 ,
+85 ,
+135,
+65 ,
+65 ,
+65 ,
+0 ,
+140,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+146,
+147,
+73 ,
+73 ,
+150,
+151,
+152,
+79 ,
+79 ,
+155,
+63 ,
+85 ,
+85 ,
+85 ,
+160,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+170,
+171,
+172,
+173,
+174,
+175,
+176,
+177,
+178,
+179,
+180,
+181,
+182,
+183,
+184,
+171,
+186,
+187,
+188,
+189,
+190,
+191,
+176,
+193,
+194,
+195,
+196,
+197,
+198,
+199,
+200,
+201,
+9 ,
+189,
+204,
+176,
+182,
+207,
+45 ,
+45 ,
+210,
+211,
+212,
+213,
+214,
+184,
+171,
+195,
+189,
+182,
+184,
+171,
+195,
+191,
+189,
+176,
+181,
+190,
+162,
+182,
+188,
+161,
+184,
+171,
+165,
+186,
+164,
+187,
+193,
+195,
+166,
+191,
+196,
+170,
+198,
+163,
+191,
+170,
+204,
+189,
+183,
+171,
+189,
+171,
+189,
+63
+};
+
+#pragma code_seg()
+
+#pragma code_seg(CS_CPMNORWEGIAN)
+ALLOC_CODE(BYTE) g_rgbCodePageMNorwegian[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+33 ,
+34 ,
+35 ,
+36 ,
+37 ,
+38 ,
+39 ,
+40 ,
+41 ,
+42 ,
+43 ,
+44 ,
+45 ,
+46 ,
+47 ,
+48 ,
+49 ,
+50 ,
+51 ,
+52 ,
+53 ,
+54 ,
+55 ,
+56 ,
+57 ,
+58 ,
+59 ,
+60 ,
+61 ,
+62 ,
+63 ,
+64 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+91 ,
+92 ,
+93 ,
+94 ,
+95 ,
+96 ,
+65 ,
+66 ,
+67 ,
+68 ,
+69 ,
+70 ,
+71 ,
+72 ,
+73 ,
+74 ,
+75 ,
+76 ,
+77 ,
+78 ,
+79 ,
+80 ,
+81 ,
+82 ,
+83 ,
+84 ,
+85 ,
+86 ,
+87 ,
+88 ,
+89 ,
+90 ,
+123,
+124,
+125,
+126,
+0 ,
+128,
+129,
+67 ,
+69 ,
+78 ,
+133,
+89 ,
+65 ,
+65 ,
+65 ,
+128,
+65 ,
+129,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+78 ,
+79 ,
+79 ,
+79 ,
+133,
+79 ,
+85 ,
+85 ,
+85 ,
+89 ,
+160,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+170,
+171,
+172,
+173,
+128,
+133,
+176,
+177,
+178,
+179,
+180,
+181,
+182,
+183,
+184,
+185,
+186,
+65 ,
+79 ,
+189,
+128,
+133,
+192,
+193,
+194,
+195,
+70 ,
+197,
+198,
+199,
+200,
+201,
+9 ,
+65 ,
+65 ,
+79 ,
+206,
+206,
+45 ,
+45 ,
+210,
+211,
+212,
+213,
+214,
+215,
+89 ,
+89 ,
+218,
+219,
+220,
+221,
+63 ,
+63 ,
+224,
+225,
+226,
+227,
+228,
+65 ,
+69 ,
+65 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+79 ,
+79 ,
+63 ,
+79 ,
+85 ,
+85 ,
+85 ,
+73 ,
+0 ,
+247,
+0 ,
+249,
+250,
+251,
+63 ,
+253,
+254,
+0
+};
+
+#pragma code_seg()
+
+#pragma code_seg(CS_CPMENGIRELAND)
+ALLOC_CODE(BYTE) g_rgbCodePageMEngIreland[256] = {
+0 ,
+1 ,
+2 ,
+3 ,
+4 ,
+5 ,
+6 ,
+7 ,
+8 ,
+9 ,
+10 ,
+11 ,
+12 ,
+13 ,
+14 ,
+15 ,
+16 ,
+17 ,
+18 ,
+19 ,
+20 ,
+21 ,
+22 ,
+23 ,
+24 ,
+25 ,
+26 ,
+27 ,
+28 ,
+29 ,
+30 ,
+31 ,
+32 ,
+ 33 ,
+ 34 ,
+ 35 ,
+ 36 ,
+ 37 ,
+ 38 ,
+ 39 ,
+ 40 ,
+ 41 ,
+ 42 ,
+ 43 ,
+ 44 ,
+ 45 ,
+ 46 ,
+ 47 ,
+ 48 ,
+ 49 ,
+ 50 ,
+ 51 ,
+ 52 ,
+ 53 ,
+ 54 ,
+ 55 ,
+ 56 ,
+ 57 ,
+ 58 ,
+ 59 ,
+ 60 ,
+ 61 ,
+ 62 ,
+ 63 ,
+ 64 ,
+ 65 ,
+ 66 ,
+ 67 ,
+ 68 ,
+ 69 ,
+ 70 ,
+ 71 ,
+ 72 ,
+ 73 ,
+ 74 ,
+ 75 ,
+ 76 ,
+ 77 ,
+ 78 ,
+ 79 ,
+ 80 ,
+ 81 ,
+ 82 ,
+ 83 ,
+ 84 ,
+ 85 ,
+ 86 ,
+ 87 ,
+ 88 ,
+ 89 ,
+ 90 ,
+ 91 ,
+ 92 ,
+ 93 ,
+ 94 ,
+ 95 ,
+ 96 ,
+ 65 ,
+ 66 ,
+ 67 ,
+ 68 ,
+ 69 ,
+ 70 ,
+ 71 ,
+ 72 ,
+ 73 ,
+ 74 ,
+ 75 ,
+ 76 ,
+ 77 ,
+ 78 ,
+ 79 ,
+ 80 ,
+ 81 ,
+ 82 ,
+ 83 ,
+ 84 ,
+ 85 ,
+ 86 ,
+ 87 ,
+ 88 ,
+ 89 ,
+ 90 ,
+ 123,
+ 124,
+ 125,
+ 126,
+ 0 ,
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 78 ,
+ 79 ,
+ 85 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 79 ,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 65 ,
+ 79 ,
+ 189,
+ 174,
+ 79 ,
+ 192,
+ 193,
+ 194,
+ 195,
+ 70 ,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 9 ,
+ 65 ,
+ 65 ,
+ 79 ,
+ 206,
+ 206,
+ 45 ,
+ 45 ,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 89 ,
+ 89 ,
+ 218,
+ 219,
+ 220,
+ 221,
+ 63 ,
+ 63 ,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 65 ,
+ 69 ,
+ 65 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 79 ,
+ 79 ,
+ 63 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 73 ,
+ 0 ,
+ 247,
+ 0 ,
+ 249,
+ 250,
+ 251,
+ 63 ,
+ 253,
+ 254,
+ 0
+};
+#pragma code_seg()
+
+// BIDI stuff
+#pragma code_seg(CS_CP1255)
+ALLOC_CODE(BYTE) g_rgbCodePage1255[256] = {
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 70,
+ 132,
+ 133,
+ 134,
+ 135,
+ 94,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 50,
+ 51,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 49,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 234,
+ 236,
+ 237,
+ 237,
+ 239,
+ 239,
+ 241,
+ 242,
+ 243,
+ 243,
+ 245,
+ 245,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 0,
+ 0,
+ 255
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CP1256)
+ALLOC_CODE(BYTE) g_rgbCodePage1256[256] = {
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 70,
+ 132,
+ 133,
+ 134,
+ 135,
+ 94,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 140,
+ 157,
+ 0,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 50,
+ 51,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 49,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 193,
+ 193,
+ 193,
+ 193,
+ 199,
+ 200,
+ 201,
+ 201,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 0,
+ 221,
+ 222,
+ 223,
+ 65,
+ 225,
+ 65,
+ 227,
+ 228,
+ 229,
+ 230,
+ 67,
+ 69,
+ 69,
+ 69,
+ 69,
+ 236,
+ 236,
+ 73,
+ 73,
+ 240,
+ 241,
+ 242,
+ 243,
+ 79,
+ 245,
+ 246,
+ 247,
+ 248,
+ 85,
+ 250,
+ 85,
+ 85,
+ 0,
+ 0,
+ 255
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CP10004)
+ALLOC_CODE(BYTE) g_rgbCodePage10004[256] = {
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 65,
+ 129,
+ 67,
+ 69,
+ 78,
+ 79,
+ 85,
+ 65,
+ 65,
+ 65,
+ 65,
+ 139,
+ 140,
+ 67,
+ 69,
+ 69,
+ 69,
+ 69,
+ 73,
+ 147,
+ 73,
+ 73,
+ 78,
+ 79,
+ 152,
+ 79,
+ 79,
+ 155,
+ 85,
+ 85,
+ 85,
+ 85,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 193,
+ 193,
+ 193,
+ 193,
+ 199,
+ 200,
+ 201,
+ 201,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 0,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 233,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 255,
+};
+#pragma code_seg()
+
+#pragma code_seg(CS_CP10005)
+ALLOC_CODE(BYTE) g_rgbCodePage10005[256] = {
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 65,
+ 65,
+ 67,
+ 69,
+ 78,
+ 79,
+ 85,
+ 65,
+ 65,
+ 65,
+ 65,
+ 65,
+ 65,
+ 67,
+ 69,
+ 69,
+ 69,
+ 69,
+ 73,
+ 73,
+ 73,
+ 73,
+ 78,
+ 79,
+ 79,
+ 79,
+ 79,
+ 79,
+ 85,
+ 85,
+ 85,
+ 85,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 234,
+ 236,
+ 237,
+ 237,
+ 239,
+ 239,
+ 241,
+ 242,
+ 243,
+ 243,
+ 245,
+ 245,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 255,
+};
+#pragma code_seg()
+
+
+
+// This is 2-D table of Code Page Vs. System.
+// To get the address of the mapping table to use; Use
+// pb = g_prgHashTbl[CodePage][Syskind];
+//
+ALLOC_CODE(BYTE *)g_prgHashTbl[15][2] = {
+ {NULL, NULL},
+ {g_rgbCodePage1252, g_rgbCodePage10000}, // English/European
+ {g_rgbCodePage1250, g_rgbCodePage10029},
+ {g_rgbCodePage1251, g_rgbCodePage10007},
+ {NULL, NULL}, // JAPNESE_CP
+ {NULL, NULL}, // KOREAN_CP
+ {NULL, NULL}, // CHINESES_CP
+ {NULL, NULL}, // CHINESET_CP
+
+ // MAC: UNDONE: Tables of Turkish and Icelandic is not available on MAC.
+ {g_rgbCodePageWGreek, g_rgbCodePageMGreek }, // GREEK
+ {g_rgbCodePageWIceland, g_rgbCodePageWIceland }, // ICELANDIC
+ {g_rgbCodePageWTurkish, g_rgbCodePageWTurkish }, // TURKISH
+ {g_rgbCodePageWNorwegian, g_rgbCodePageMNorwegian }, // NORWEIGIAN
+ {g_rgbCodePageWEngIreland, g_rgbCodePageMEngIreland }, // ENGLISH(IRELAND)
+ {g_rgbCodePage1256, g_rgbCodePage10004}, // Arabic
+ {g_rgbCodePage1255, g_rgbCodePage10005} // Hebrew
+};
+
+// Following are the code page "codes" for the dbcs world.
+#define JAPNESE_CP 0x4
+#define KOREAN_CP 0x5
+#define CHINESES_CP 0x6
+#define CHINESET_CP 0x7
+
+#define GREEK_CP 0x8
+#define ICELANDIC_CP 0x9
+#define TURKISH_CP 0xa
+#define NORWEIGIAN_CP 0xb
+#define IRELAND_CP 0xc
+#define ARABIC_CP 0xd
+#define HEBREW_CP 0xe
+
+
+/***
+*PUBLIC LHashValOfName
+*Purpose: This API calculates the hash value depending on the system and
+* the lcid that was passed in.
+*
+*Implementation Notes:
+* Use the table pointed by pbHashTable to map each character in the
+* szName.
+*
+*
+*Entry:
+* xsz: String whose hash value has to be calculated
+*
+*Exit:
+* ULONG : hash value of the passed in string
+*
+* 31 23 19 15 0
+* |-------|---|----|-------------------|
+* |UNUSED |CP |Sys | wHashVal |
+* |_______|___|____|___________________|
+* ^ ^
+* | |
+* CodePageId Encoding bits for System kind
+*
+*
+*
+***********************************************************************/
+#pragma optimize("t", on)
+
+#if OE_WIN32
+STDAPI_(unsigned long) LHashValOfNameSysW(SYSKIND syskind,
+ LCID lcid,
+ LPCOLESTR szName)
+{
+ // NOTE: We only bother to translate the first 255 chars of the name.
+ // NOTE: This should sill get a pretty good hash function, without
+ // NOTE: having burn more stack space, or (worse) alloc & free memory
+ // NOTE: on this call.
+ char szNameA[255+1];
+
+ if (szName == NULL) // can't return E_INVALIDARG here, so just
+ return 0; // don't crash
+
+ // convert szName from Unicode to Ansi.
+ NoAssertRetail (WideCharToMultiByte(CP_ACP,
+ 0,
+ szName,
+ -1,
+ szNameA,
+ 255+1,
+ NULL,
+ NULL) != 0, "");
+ szNameA[255] = '\0'; // ensure null-terminated (in case truncated).
+
+ return LHashValOfNameSysA(syskind, lcid, szNameA);
+}
+#endif //OE_WIN32
+
+STDAPI_(unsigned long) LHashValOfNameSysA(SYSKIND syskind,
+ LCID lcid,
+ const char FAR* szName)
+{
+ ULONG ulHash; // hash value which accumulates hash
+ USHORT uIndex;
+ BYTE *pbHashTable;
+ USHORT usSystem, usCodePage;
+ ULONG uEncoding;
+
+ if (szName == NULL) // can't return E_INVALIDARG here, so just
+ return 0; // don't crash
+
+ // If DBCS then defer to LHashValOfDBCSName
+ if (IsDBCS(lcid))
+ return LHashValOfDBCSName(syskind, lcid, szName);
+
+ // Deternine the hash table that should be used.
+ //
+ // Find the index corresponding to the system passed in.
+ usSystem = (syskind == SYS_MAC) ? 1 : 0;
+
+ // Determine the Code page.
+ if (lcid == 0x409)
+ usCodePage = 1; // English is most likely.
+ else switch (lcid) {
+ default:
+ if (LOBYTE(lcid) == 0x01 || lcid == 0x0429) {
+ usCodePage = ARABIC_CP; break;
+ }
+ usCodePage = 1; break; // default gets US English (1252)
+ case 0x0419:
+ usCodePage = 3; break;
+ case 0x0408:
+ usCodePage = GREEK_CP; break;
+ case 0x040f:
+ usCodePage = ICELANDIC_CP; break;
+ case 0x041f:
+ usCodePage = TURKISH_CP; break;
+ case 0x0814:
+ usCodePage = NORWEIGIAN_CP; break;
+ case 0x1809:
+ usCodePage = IRELAND_CP; break;
+ case 0x040d:
+ usCodePage = HEBREW_CP; break;
+ case 0x0405:
+ case 0x040e:
+ case 0x0415:
+ case 0x041b:
+ usCodePage = 2; break;
+ }
+
+
+
+
+ pbHashTable = g_prgHashTbl[usCodePage][usSystem];
+
+ uEncoding = (ULONG) (((ULONG) ((usCodePage << 4) | usSystem)) << 16);
+
+
+ // Algorithm: compute 32-bit value by multipling by 37 and adding
+ // in the character. Ignore all overflows. Then convert to
+ // a 16-bit number by moding by 65599 (a prime).
+
+ ulHash = 0xDeadBee; // arbitrary starting number
+
+
+ for (;*szName; szName++) {
+
+ // use pbHashTable[] to map characters
+ //
+
+ uIndex = ((BYTE) *szName) & 0x00ff;
+
+ ulHash = ulHash * 37 + pbHashTable[uIndex];
+
+ } // for
+
+ ulHash = ulHash % 65599;
+
+ return (ULONG) (uEncoding | (ulHash & 0x0000FFFF));
+}
+
+
+
+/***
+*LHashValOfDBCSName
+*Purpose: Calculates the hash value for strings from DBCS language.
+*
+*Implementation Notes:
+* Use the table pointed by pbHashTable to map each character in the
+* szName.
+*
+*
+*Entry:
+* xsz: String whose hash value has to be calculated
+*
+*Exit:
+* ULONG : hash value of the passed in string
+*
+*
+***********************************************************************/
+#pragma code_seg(CS_DBCSHASH)
+unsigned long LHashValOfDBCSName(SYSKIND syskind, LCID lcid, const char FAR* szName)
+{
+ ULONG ulHash; // hash value which accumulates hash
+ ACHAR xch;
+ USHORT uIndex;
+ BYTE *pbHashTable;
+ USHORT usSystem, usCodePage;
+ ULONG uEncoding;
+
+ // UNDONE : for MAC
+ //
+ // For DBCS characters < 255, the mapping rules are same as CODE page for
+ // US english.
+ //
+ pbHashTable = g_rgbCodePage1252;
+
+ // Find the index corresponding to the system passed in.
+ usSystem = (syskind == SYS_MAC) ? 1 : 0;
+
+ // Get the code page.
+ switch (PRIMARYLANGID(lcid)) {
+ case LANG_JAPANESE:
+ usCodePage = JAPNESE_CP;
+ break;
+ case LANG_KOREAN:
+ usCodePage = KOREAN_CP;
+ break;
+ case LANG_CHINESE:
+ switch (SUBLANGID(lcid)) {
+ case SUBLANG_CHINESE_TRADITIONAL:
+ usCodePage = CHINESET_CP;
+ break;
+ case SUBLANG_CHINESE_SIMPLIFIED:
+ usCodePage = CHINESES_CP;
+ break;
+ default:
+ // We default to chinese_simplified sub-lang.
+ usCodePage = CHINESES_CP;
+ break;
+ }
+ break;
+ default:
+ DebHalt("bad lcid");
+ }
+
+ uEncoding = (ULONG) (((ULONG) ((usCodePage << 4) | usSystem)) << 16);
+
+ // Algorithm: compute 32-bit value by multipling by 37 and adding
+ // in the character. Ignore all overflows. Then convert to
+ // a 16-bit number by moding by 65599 (a prime).
+
+ ulHash = 0xDeadBee; // arbitrary starting number
+
+ for (; (xch = xpch((LPSTR)szName)) != '\0'; szName = xstrinc(szName)) {
+
+ // use pbHashTable[] to map characters
+ //
+
+ // If the next character is a double byte character then first map it.
+ if ((USHORT)xch > 0xff) {
+ xch = MapDBChar(xch, lcid);
+
+ // process the high byte.
+ // shift the upper byte down to get the index.
+ if (uIndex = (((USHORT) xch & 0xff00) >> 8)) {
+ ulHash = ulHash * 37 + pbHashTable[uIndex];
+ }
+ }
+
+ // process the low byte.
+ uIndex = ((USHORT) xch) & 0x00ff;
+
+ ulHash = ulHash * 37 + pbHashTable[uIndex];
+
+ } // for
+
+ ulHash = ulHash % 65599;
+
+ return (ULONG) (uEncoding | (ulHash & 0x0000FFFF));
+
+}
+#pragma optimize("t", )
+
+
+
+ALLOC_CODE(ACHAR) m_rgJapneseExcepMap[][2] = {
+0x829F, 0x00A7,
+0x82A0, 0x00B1,
+0x82A1, 0x00A8,
+0x82A2, 0x00B2,
+0x82A3, 0x00A9,
+0x82A4, 0x00B3,
+0x82A5, 0x00AA,
+0x82A6, 0x00B4,
+0x82A7, 0x00AB,
+0x82A8, 0x00B5,
+0x82A9, 0x00B6,
+0x82AA, 0xB6DE,
+0x82AB, 0x00B7,
+0x82AC, 0xB7DE,
+0x82AD, 0x00B8,
+0x82AE, 0xB8DE,
+0x82AF, 0x00B9,
+0x82B0, 0xB9DE,
+0x82B1, 0x00BA,
+0x82B2, 0xBADE,
+0x82B3, 0x00BB,
+0x82B4, 0xBBDE,
+0x82B5, 0x00BC,
+0x82B6, 0xBCDE,
+0x82B7, 0x00BD,
+0x82B8, 0xBDDE,
+0x82B9, 0x00BE,
+0x82BA, 0xBEDE,
+0x82BB, 0x00BF,
+0x82BC, 0xBFDE,
+0x82BD, 0x00C0,
+0x82BE, 0xC0DE,
+0x82BF, 0x00C1,
+0x82C0, 0xC1DE,
+0x82C1, 0x00AF,
+0x82C2, 0x00C2,
+0x82C3, 0xC2DE,
+0x82C4, 0x00C3,
+0x82C5, 0xC3DE,
+0x82C6, 0x00C4,
+0x82C7, 0xC4DE,
+0x82C8, 0x00C5,
+0x82C9, 0x00C6,
+0x82CA, 0x00C7,
+0x82CB, 0x00C8,
+0x82CC, 0x00C9,
+0x82CD, 0x00CA,
+0x82CE, 0xCADE,
+0x82CF, 0xCADF,
+0x82D0, 0x00CB,
+0x82D1, 0xCBDE,
+0x82D2, 0xCBDF,
+0x82D3, 0x00CC,
+0x82D4, 0xCCDE,
+0x82D5, 0xCCDF,
+0x82D6, 0x00CD,
+0x82D7, 0xCDDE,
+0x82D8, 0xCDDF,
+0x82D9, 0x00CE,
+0x82DA, 0xCEDE,
+0x82DB, 0xCEDF,
+0x82DC, 0x00CF,
+0x82DD, 0x00D0,
+0x82DE, 0x00D1,
+0x82DF, 0x00D2,
+0x82E0, 0x00D3,
+0x82E1, 0x00AC,
+0x82E2, 0x00D4,
+0x82E3, 0x00AD,
+0x82E4, 0x00D5,
+0x82E5, 0x00AE,
+0x82E6, 0x00D6,
+0x82E7, 0x00D7,
+0x82E8, 0x00D8,
+0x82E9, 0x00D9,
+0x82EA, 0x00DA,
+0x82EB, 0x00DB,
+0x82EC, 0x838E,
+0x82ED, 0x00DC,
+0x82EE, 0x8390,
+0x82EF, 0x8391,
+0x82F0, 0x00A6,
+0x82F1, 0x00DD,
+
+0x8340, 0x00A7,
+0x8341, 0x00B1,
+0x8342, 0x00A8,
+0x8343, 0x00B2,
+0x8344, 0x00A9,
+0x8345, 0x00B3,
+0x8346, 0x00AA,
+0x8347, 0x00B4,
+0x8348, 0x00AB,
+0x8349, 0x00B5,
+0x834A, 0x00B6,
+0x834B, 0xB6DE,
+0x834C, 0x00B7,
+0x834D, 0xB7DE,
+0x834E, 0x00B8,
+0x834F, 0xB8DE,
+0x8350, 0x00B9,
+0x8351, 0xB9DE,
+0x8352, 0x00BA,
+0x8353, 0xBADE,
+0x8354, 0x00BB,
+0x8355, 0xBBDE,
+0x8356, 0x00BC,
+0x8357, 0xBCDE,
+0x8358, 0x00BD,
+0x8359, 0xBDDE,
+0x835A, 0x00BE,
+0x835B, 0xBEDE,
+0x835C, 0x00BF,
+0x835D, 0xBFDE,
+0x835E, 0x00C0,
+0x835F, 0xC0DE,
+0x8360, 0x00C1,
+0x8361, 0xC1DE,
+0x8362, 0x00AF,
+0x8363, 0x00C2,
+0x8364, 0xC2DE,
+0x8365, 0x00C3,
+0x8366, 0xC3DE,
+0x8367, 0x00C4,
+0x8368, 0xC4DE,
+0x8369, 0x00C5,
+0x836A, 0x00C6,
+0x836B, 0x00C7,
+0x836C, 0x00C8,
+0x836D, 0x00C9,
+0x836E, 0x00CA,
+0x836F, 0xCADE,
+0x8370, 0xCADF,
+0x8371, 0x00CB,
+0x8372, 0xCBDE,
+0x8373, 0xCBDF,
+0x8374, 0x00CC,
+0x8375, 0xCCDE,
+0x8376, 0xCCDF,
+0x8377, 0x00CD,
+0x8378, 0xCDDE,
+0x8379, 0xCDDF,
+0x837A, 0x00CE,
+0x837B, 0xCEDE,
+0x837C, 0xCEDF,
+0x837D, 0x00CF,
+0x837E, 0x00D0,
+0x8380, 0x00D1,
+0x8381, 0x00D2,
+0x8382, 0x00D3,
+0x8383, 0x00AC,
+0x8384, 0x00D4,
+0x8385, 0x00AD,
+0x8386, 0x00D5,
+0x8387, 0x00AE,
+0x8388, 0x00D6,
+0x8389, 0x00D7,
+0x838A, 0x00D8,
+0x838B, 0x00D9,
+0x838C, 0x00DA,
+0x838D, 0x00DB,
+0x838E, 0x838E,
+0x838F, 0x00DC,
+0x8390, 0x8390,
+0x8391, 0x8391,
+0x8392, 0x00A6,
+0x8393, 0x00DD,
+0x8394, 0xB3DE,
+0x8395, 0x8395,
+0x8396, 0x8396,
+
+0x824F, 0x30,
+0x8250, 0x31,
+0x8251, 0x32,
+0x8252, 0x33,
+0x8253, 0x34,
+0x8254, 0x35,
+0x8255, 0x36,
+0x8256, 0x37,
+0x8257, 0x38,
+0x8258, 0x39,
+0x8260, 0x41,
+0x8261, 0x42,
+0x8262, 0x43,
+0x8263, 0x44,
+0x8264, 0x45,
+0x8265, 0x46,
+0x8266, 0x47,
+0x8267, 0x48,
+0x8268, 0x49,
+0x8269, 0x4A,
+0x826A, 0x4B,
+0x826B, 0x4C,
+0x826C, 0x4D,
+0x826D, 0x4E,
+0x826E, 0x4F,
+0x826F, 0x50,
+0x8270, 0x51,
+0x8271, 0x52,
+0x8272, 0x53,
+0x8273, 0x54,
+0x8274, 0x55,
+0x8275, 0x56,
+0x8276, 0x57,
+0x8277, 0x58,
+0x8278, 0x59,
+0x8279, 0x5A,
+0x8151, 0x5F,
+0x8281, 0x61,
+0x8282, 0x62,
+0x8283, 0x63,
+0x8284, 0x64,
+0x8285, 0x65,
+0x8286, 0x66,
+0x8287, 0x67,
+0x8288, 0x68,
+0x8289, 0x69,
+0x828A, 0x6A,
+0x828B, 0x6B,
+0x828C, 0x6C,
+0x828D, 0x6D,
+0x828E, 0x6E,
+0x828F, 0x6F,
+0x8290, 0x70,
+0x8291, 0x71,
+0x8292, 0x72,
+0x8293, 0x73,
+0x8294, 0x74,
+0x8295, 0x75,
+0x8296, 0x76,
+0x8297, 0x77,
+0x8298, 0x78,
+0x8299, 0x79,
+0x829A, 0x7A,
+0x0000, 0x00
+};
+
+ALLOC_CODE(ACHAR) m_rgKoreaExcepMap[][2] = {
+0xA3B0, 0x30,
+0xA3B1, 0x31,
+0xA3B2, 0x32,
+0xA3B3, 0x33,
+0xA3B4, 0x34,
+0xA3B5, 0x35,
+0xA3B6, 0x36,
+0xA3B7, 0x37,
+0xA3B8, 0x38,
+0xA3B9, 0x39,
+0xA3C1, 0x41,
+0xA3C2, 0x42,
+0xA3C3, 0x43,
+0xA3C4, 0x44,
+0xA3C5, 0x45,
+0xA3C6, 0x46,
+0xA3C7, 0x47,
+0xA3C8, 0x48,
+0xA3C9, 0x49,
+0xA3CA, 0x4A,
+0xA3CB, 0x4B,
+0xA3CC, 0x4C,
+0xA3CD, 0x4D,
+0xA3CE, 0x4E,
+0xA3CF, 0x4F,
+0xA3D0, 0x50,
+0xA3D1, 0x51,
+0xA3D2, 0x52,
+0xA3D3, 0x53,
+0xA3D4, 0x54,
+0xA3D5, 0x55,
+0xA3D6, 0x56,
+0xA3D7, 0x57,
+0xA3D8, 0x58,
+0xA3D9, 0x59,
+0xA3DA, 0x5A,
+0xA3DF, 0x5F,
+0xA3E1, 0x61,
+0xA3E2, 0x62,
+0xA3E3, 0x63,
+0xA3E4, 0x64,
+0xA3E5, 0x65,
+0xA3E6, 0x66,
+0xA3E7, 0x67,
+0xA3E8, 0x68,
+0xA3E9, 0x69,
+0xA3EA, 0x6A,
+0xA3EB, 0x6B,
+0xA3EC, 0x6C,
+0xA3ED, 0x6D,
+0xA3EE, 0x6E,
+0xA3EF, 0x6F,
+0xA3F0, 0x70,
+0xA3F1, 0x71,
+0xA3F2, 0x72,
+0xA3F3, 0x73,
+0xA3F4, 0x74,
+0xA3F5, 0x75,
+0xA3F6, 0x76,
+0xA3F7, 0x77,
+0xA3F8, 0x78,
+0xA3F9, 0x79,
+0xA3FA, 0x7A,
+0x0000, 0x00
+};
+
+
+ALLOC_CODE(ACHAR) m_rgChinaTExcepMap[][2] = {
+0xA2AF, 0x30,
+0xA2B0, 0x31,
+0xA2B1, 0x32,
+0xA2B2, 0x33,
+0xA2B3, 0x34,
+0xA2B4, 0x35,
+0xA2B5, 0x36,
+0xA2B6, 0x37,
+0xA2B7, 0x38,
+0xA2B8, 0x39,
+0xA2CF, 0x41,
+0xA2D0, 0x42,
+0xA2D1, 0x43,
+0xA2D2, 0x44,
+0xA2D3, 0x45,
+0xA2D4, 0x46,
+0xA2D5, 0x47,
+0xA2D6, 0x48,
+0xA2D7, 0x49,
+0xA2D8, 0x4A,
+0xA2D9, 0x4B,
+0xA2DA, 0x4C,
+0xA2DB, 0x4D,
+0xA2DC, 0x4E,
+0xA2DD, 0x4F,
+0xA2DE, 0x50,
+0xA2DF, 0x51,
+0xA2E0, 0x52,
+0xA2E1, 0x53,
+0xA2E2, 0x54,
+0xA2E3, 0x55,
+0xA2E4, 0x56,
+0xA2E5, 0x57,
+0xA2E6, 0x58,
+0xA2E7, 0x59,
+0xA2E8, 0x5A,
+0xA1C5, 0x5F,
+0xA2E9, 0x61,
+0xA2EA, 0x62,
+0xA2EB, 0x63,
+0xA2EC, 0x64,
+0xA2ED, 0x65,
+0xA2EE, 0x66,
+0xA2EF, 0x67,
+0xA2F0, 0x68,
+0xA2F1, 0x69,
+0xA2F2, 0x6A,
+0xA2F3, 0x6B,
+0xA2F4, 0x6C,
+0xA2F5, 0x6D,
+0xA2F6, 0x6E,
+0xA2F7, 0x6F,
+0xA2F8, 0x70,
+0xA2F9, 0x71,
+0xA2FA, 0x72,
+0xA2FB, 0x73,
+0xA2FC, 0x74,
+0xA2FD, 0x75,
+0xA2FE, 0x76,
+0xA340, 0x77,
+0xA341, 0x78,
+0xA342, 0x79,
+0xA343, 0x7A,
+};
+
+ALLOC_CODE(ACHAR) m_rgChinaSExcepMap[][2] = {
+0xA3B0, 0x30,
+0xA3B1, 0x31,
+0xA3B2, 0x32,
+0xA3B3, 0x33,
+0xA3B4, 0x34,
+0xA3B5, 0x35,
+0xA3B6, 0x36,
+0xA3B7, 0x37,
+0xA3B8, 0x38,
+0xA3B9, 0x39,
+0xA3C1, 0x41,
+0xA3C2, 0x42,
+0xA3C3, 0x43,
+0xA3C4, 0x44,
+0xA3C5, 0x45,
+0xA3C6, 0x46,
+0xA3C7, 0x47,
+0xA3C8, 0x48,
+0xA3C9, 0x49,
+0xA3CA, 0x4A,
+0xA3CB, 0x4B,
+0xA3CC, 0x4C,
+0xA3CD, 0x4D,
+0xA3CE, 0x4E,
+0xA3CF, 0x4F,
+0xA3D0, 0x50,
+0xA3D1, 0x51,
+0xA3D2, 0x52,
+0xA3D3, 0x53,
+0xA3D4, 0x54,
+0xA3D5, 0x55,
+0xA3D6, 0x56,
+0xA3D7, 0x57,
+0xA3D8, 0x58,
+0xA3D9, 0x59,
+0xA3DA, 0x5A,
+0xA3DF, 0x5F,
+0xA3E1, 0x61,
+0xA3E2, 0x62,
+0xA3E3, 0x63,
+0xA3E4, 0x64,
+0xA3E5, 0x65,
+0xA3E6, 0x66,
+0xA3E7, 0x67,
+0xA3E8, 0x68,
+0xA3E9, 0x69,
+0xA3EA, 0x6A,
+0xA3EB, 0x6B,
+0xA3EC, 0x6C,
+0xA3ED, 0x6D,
+0xA3EE, 0x6E,
+0xA3EF, 0x6F,
+0xA3F0, 0x70,
+0xA3F1, 0x71,
+0xA3F2, 0x72,
+0xA3F3, 0x73,
+0xA3F4, 0x74,
+0xA3F5, 0x75,
+0xA3F6, 0x76,
+0xA3F7, 0x77,
+0xA3F8, 0x78,
+0xA3F9, 0x79,
+0xA3FA, 0x7A,
+};
+
+
+/***
+*MapDBChar
+*Purpose: Maps a double byte character to a (1 or 2) single byte character
+*
+*Implementation Notes:
+* Use the exception tables above for the appropriate language.
+*
+*Entry:
+* xch: Character to be mapped
+* lcid: LCID of language in use
+*
+*Exit:
+* returns mapped character
+*
+*CONSIDER: there are some optimizations that could be done here
+*
+***********************************************************************/
+ACHAR MapDBChar(ACHAR xch, LCID lcid)
+{
+ ACHAR * pchException;
+
+ DebAssert(0xff00 & (USHORT)xch, " should a double byte character ");
+
+ // Do language specific mapping.
+ switch (PRIMARYLANGID(lcid)) {
+ case LANG_JAPANESE:
+ // Japan
+ pchException = m_rgJapneseExcepMap[0];
+ break;
+ case LANG_KOREAN:
+ // Korea
+ pchException = m_rgKoreaExcepMap[0];
+ break;
+ case LANG_CHINESE:
+ switch (SUBLANGID(lcid)) {
+ case SUBLANG_CHINESE_TRADITIONAL:
+ // China(T)
+ pchException = m_rgChinaTExcepMap[0];
+ break;
+ case SUBLANG_CHINESE_SIMPLIFIED:
+ // China(S)
+ pchException = m_rgChinaSExcepMap[0];
+ break;
+ default:
+ DebHalt("bad lcid");
+ }
+ break;
+ default:
+ DebHalt("bad lcid");
+ }
+
+ for (; *pchException != 0x0000 && *pchException != xch; pchException += 2);
+ // end of for loop
+
+ if (*pchException == 0x0000)
+ return xch;
+ else
+ return *(pchException+1);
+
+}
+#pragma code_seg()
+
+
+// ***** Start case mapping tables
+
+/////////////////////////////////////////////////////////////////////////
+// The following tables/Code is used to generate the tables for accent and
+// and case insensitive comparision.
+//
+
+
+
+/******
+* 0x0409 // These uses the base table it self.
+* 0x0407,
+* 0x040c,
+* 0x0809,
+* 0x0c09,
+* 0x1009,
+* 0x1409,
+* 0x0413,
+* 0x0813,
+* 0x080c,
+* 0x0c0c,
+* 0x100c,
+* 0x0807,
+* 0x0c07,
+* 0x0410,
+* 0x0810,
+* 0x0416,
+* 0x0816,
+* 0x0419 // Russian(in different code page):
+* // but the comparision table is same as US english.
+*
+* 0x040b, // these uses g_rgbExcepTblWin1035 as execption table
+* 0x041d,
+*
+*
+* 0x0406, // these uses g_rgbExcepTblWin1030 as execption table
+* 0x0414,
+*
+*
+* 0x040a, // these uses g_rgbExcepTblWin1034 as execption table
+* 0x080a,
+* 0x0c0a,
+*
+*
+* These falls in a different Code Page (WIN:1240, MAC:10029)
+* 0x0405, These uses the base table it self.
+*
+* 0x040e,
+*
+* 0x0415,
+*
+* 0x041b,
+***************************************************************************/
+
+// Partial base Tables. The partial tables are used to build the CodePage
+// and sysytem kind dependent base table. We the full blown table when we
+// load the typelib.dll
+//
+
+// In the partial base tables we do not have the first 128 characters.
+// We construct the first 128 characters in the following way:
+// From 0 to 96 we have identity (index == the entry).
+// From 97 to 122 we have 65 to 90 (note this is 'a' to 'z' that naps to 'A' to 'Z').
+// From 123 to 127 we again have identity.
+//
+#pragma code_seg(CS_CORE2)
+ALLOC_CODE(BYTE) g_rgbPartialBaseTbl1252[128] = {
+ 127,
+ 127,
+ 130,
+ 70 ,
+ 132,
+ 133,
+ 134,
+ 135,
+ 127,
+ 137,
+ 83 ,
+ 139,
+ 140,
+ 127,
+ 127,
+ 127,
+ 127,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 150,
+ 152,
+ 153,
+ 83 ,
+ 155,
+ 140,
+ 127,
+ 127,
+ 89 ,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 65 ,
+ 171,
+ 172,
+ 150,
+ 174,
+ 175,
+ 176,
+ 177,
+ 50 ,
+ 51 ,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 49 ,
+ 79 ,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 198,
+ 67 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 208,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 215,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 89 ,
+ 222,
+ 223,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 198,
+ 67 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 208,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 247,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 89 ,
+ 222,
+ 89
+};
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTbl1250[128] = {
+ 127,
+ 127,
+ 130,
+ 127,
+ 132,
+ 133,
+ 134,
+ 135,
+ 127,
+ 137,
+ 138,
+ 139,
+ 83 ,
+ 84 ,
+ 142,
+ 90 ,
+ 127,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 150,
+ 127,
+ 153,
+ 138,
+ 155,
+ 83 ,
+ 84 ,
+ 142,
+ 90 ,
+ 160,
+ 127,
+ 162,
+ 76 ,
+ 164,
+ 65 ,
+ 166,
+ 167,
+ 168,
+ 169,
+ 83 ,
+ 171,
+ 172,
+ 150,
+ 174,
+ 90 ,
+ 176,
+ 177,
+ 178,
+ 76 ,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 65 ,
+ 83 ,
+ 187,
+ 76 ,
+ 189,
+ 76 ,
+ 90 ,
+ 82 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 76 ,
+ 67 ,
+ 67 ,
+ 200,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 68 ,
+ 208,
+ 78 ,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 215,
+ 216,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 89 ,
+ 84 ,
+ 223,
+ 82 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 76 ,
+ 67 ,
+ 67 ,
+ 200,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 68 ,
+ 208,
+ 78 ,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 247,
+ 216,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 89 ,
+ 84 ,
+ 255
+};
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTbl10000[128] = {
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 78 ,
+ 79 ,
+ 85 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 79 ,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 65 ,
+ 79 ,
+ 189,
+ 174,
+ 79 ,
+ 192,
+ 193,
+ 194,
+ 195,
+ 70 ,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 65 ,
+ 65 ,
+ 79 ,
+ 206,
+ 206,
+ 208,
+ 208,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 89 ,
+ 89 ,
+ 218,
+ 219,
+ 220,
+ 221,
+ 63 ,
+ 63 ,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 65 ,
+ 69 ,
+ 65 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 79 ,
+ 79 ,
+ 63 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 73 ,
+ 127,
+ 247,
+ 127,
+ 249,
+ 250,
+ 251,
+ 63 ,
+ 253,
+ 254,
+ 127
+
+};
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTbl10029[128] = {
+ 65 ,
+ 65 ,
+ 65 ,
+ 69 ,
+ 65 ,
+ 79 ,
+ 85 ,
+ 65 ,
+ 65 ,
+ 137,
+ 65 ,
+ 137,
+ 67 ,
+ 67 ,
+ 69 ,
+ 90 ,
+ 90 ,
+ 68 ,
+ 73 ,
+ 68 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 79 ,
+ 69 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 85 ,
+ 69 ,
+ 69 ,
+ 85 ,
+ 160,
+ 161,
+ 69 ,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 69 ,
+ 172,
+ 173,
+ 71 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 178,
+ 179,
+ 73 ,
+ 75 ,
+ 182,
+ 183,
+ 76 ,
+ 76 ,
+ 76 ,
+ 76 ,
+ 76 ,
+ 76 ,
+ 76 ,
+ 78 ,
+ 78 ,
+ 78 ,
+ 194,
+ 195,
+ 78 ,
+ 78 ,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 208,
+ 208,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 79 ,
+ 82 ,
+ 82 ,
+ 219,
+ 220,
+ 221,
+ 219,
+ 82 ,
+ 82 ,
+ 225,
+ 226,
+ 227,
+ 225,
+ 83 ,
+ 83 ,
+ 65 ,
+ 84 ,
+ 84 ,
+ 73 ,
+ 235,
+ 235,
+ 85 ,
+ 79 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 89 ,
+ 89 ,
+ 75 ,
+ 90 ,
+ 76 ,
+ 76 ,
+ 71 ,
+ 255
+
+
+};
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTbl10007[128] = {
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 171,
+ 173,
+ 174,
+ 174,
+ 176,
+ 177,
+ 178,
+ 179,
+ 167,
+ 181,
+ 182,
+ 183,
+ 184,
+ 184,
+ 186,
+ 186,
+ 188,
+ 188,
+ 190,
+ 190,
+ 183,
+ 193,
+ 194,
+ 195,
+ 70 ,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 203,
+ 205,
+ 205,
+ 193,
+ 208,
+ 208,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 216,
+ 218,
+ 218,
+ 220,
+ 221,
+ 221,
+ 159,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159
+
+};
+
+
+// Now we use g_rgbCodePageWGreek to build the table.
+#if 0
+ALLOC_CODE(BYTE) g_rgbPartialBaseTblWGreek[128] = {
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+0 ,
+139,
+0 ,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+0 ,
+153,
+0 ,
+155,
+0 ,
+0 ,
+0 ,
+0 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+0 ,
+171,
+172,
+45 ,
+174,
+45 ,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+185,
+186,
+187,
+188,
+189,
+190,
+191,
+186,
+162,
+194,
+195,
+196,
+184,
+198,
+185,
+200,
+186,
+202,
+203,
+204,
+205,
+206,
+188,
+208,
+209,
+0 ,
+211,
+212,
+190,
+214,
+215,
+216,
+191,
+186,
+190,
+162,
+184,
+185,
+186,
+190,
+162,
+194,
+195,
+196,
+184,
+198,
+185,
+200,
+186,
+202,
+203,
+204,
+205,
+206,
+188,
+208,
+209,
+211,
+211,
+212,
+190,
+214,
+215,
+216,
+191,
+186,
+190,
+188,
+190,
+191,
+0
+};
+#endif //0
+
+// Now we use g_rgbCodePageWIceland to build the table.
+#if 0
+ALLOC_CODE(BYTE) g_rgbPartialBaseTblWIceland[128] = {
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+83 ,
+139,
+140,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+152,
+153,
+83 ,
+155,
+140,
+0 ,
+0 ,
+89 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+45 ,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+193,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+201,
+69 ,
+69 ,
+73 ,
+205,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+211,
+79 ,
+79 ,
+214,
+215,
+214,
+85 ,
+218,
+85 ,
+85 ,
+221,
+222,
+223,
+65 ,
+193,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+201,
+69 ,
+69 ,
+73 ,
+205,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+211,
+79 ,
+79 ,
+214,
+247,
+214,
+85 ,
+218,
+85 ,
+85 ,
+221,
+222,
+89
+};
+
+#endif //0
+
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTblWTurkish[128] = {
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+83 ,
+139,
+140,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+152,
+153,
+83 ,
+155,
+140,
+0 ,
+0 ,
+89 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+45 ,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+199,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+214,
+215,
+79 ,
+85 ,
+85 ,
+85 ,
+220,
+221,
+222,
+223,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+199,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+214,
+247,
+79 ,
+85 ,
+85 ,
+85 ,
+220,
+221,
+222,
+89
+};
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTblWNorwegian[128] = {
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+83 ,
+139,
+140,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+152,
+153,
+83 ,
+155,
+140,
+0 ,
+0 ,
+89 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+45 ,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+65 ,
+65 ,
+65 ,
+196,
+197,
+196,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+68 ,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+214,
+215,
+214,
+85 ,
+85 ,
+85 ,
+89 ,
+89 ,
+222,
+223,
+65 ,
+65 ,
+65 ,
+65 ,
+196,
+197,
+196,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+68 ,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+214,
+247,
+214,
+85 ,
+85 ,
+85 ,
+89 ,
+89 ,
+222,
+89
+};
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTblWEngIreland[128] = {
+0 ,
+0 ,
+130,
+70 ,
+132,
+133,
+134,
+135,
+0 ,
+137,
+83 ,
+139,
+140,
+0 ,
+0 ,
+0 ,
+0 ,
+145,
+146,
+147,
+148,
+149,
+45 ,
+45 ,
+152,
+153,
+83 ,
+155,
+140,
+0 ,
+0 ,
+89 ,
+9 ,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+65 ,
+171,
+172,
+45 ,
+174,
+175,
+176,
+177,
+50 ,
+51 ,
+180,
+181,
+182,
+183,
+184,
+49 ,
+79 ,
+187,
+188,
+189,
+190,
+191,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+79 ,
+215,
+79 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+222,
+223,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+65 ,
+198,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+208,
+78 ,
+79 ,
+79 ,
+79 ,
+79 ,
+79 ,
+247,
+79 ,
+85 ,
+85 ,
+85 ,
+85 ,
+89 ,
+222,
+89
+};
+
+
+// Now we use g_rgbCodePageMGreek to build the table.
+#if 0
+ALLOC_CODE(BYTE) g_rgbPartialBaseTblMGreek[128] = {
+65 ,
+49 ,
+50 ,
+69 ,
+51 ,
+79 ,
+85 ,
+135,
+65 ,
+65 ,
+65 ,
+0 ,
+140,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+146,
+147,
+73 ,
+73 ,
+150,
+151,
+152,
+79 ,
+79 ,
+155,
+63 ,
+85 ,
+85 ,
+85 ,
+160,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+170,
+171,
+172,
+173,
+174,
+175,
+176,
+177,
+178,
+179,
+180,
+181,
+182,
+183,
+184,
+171,
+186,
+187,
+188,
+189,
+190,
+191,
+176,
+193,
+194,
+195,
+196,
+197,
+198,
+199,
+200,
+201,
+9 ,
+189,
+204,
+176,
+182,
+207,
+45 ,
+45 ,
+210,
+211,
+212,
+213,
+214,
+184,
+171,
+195,
+189,
+182,
+184,
+171,
+195,
+191,
+189,
+176,
+181,
+190,
+162,
+182,
+188,
+161,
+184,
+171,
+165,
+186,
+164,
+187,
+193,
+195,
+166,
+191,
+196,
+170,
+198,
+163,
+191,
+170,
+204,
+189,
+183,
+171,
+189,
+171,
+189,
+63
+};
+#endif // 0
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTblMNorwegian[128] = {
+128,
+129,
+67 ,
+69 ,
+78 ,
+133,
+89 ,
+65 ,
+65 ,
+65 ,
+128,
+65 ,
+129,
+67 ,
+69 ,
+69 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+78 ,
+79 ,
+79 ,
+79 ,
+133,
+79 ,
+85 ,
+85 ,
+85 ,
+89 ,
+160,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+170,
+171,
+172,
+173,
+128,
+133,
+176,
+177,
+178,
+179,
+180,
+181,
+182,
+183,
+184,
+185,
+186,
+65 ,
+79 ,
+189,
+128,
+133,
+192,
+193,
+194,
+195,
+70 ,
+197,
+198,
+199,
+200,
+201,
+9 ,
+65 ,
+65 ,
+79 ,
+206,
+206,
+45 ,
+45 ,
+210,
+211,
+212,
+213,
+214,
+215,
+89 ,
+89 ,
+218,
+219,
+220,
+221,
+63 ,
+63 ,
+224,
+225,
+226,
+227,
+228,
+65 ,
+69 ,
+65 ,
+69 ,
+69 ,
+73 ,
+73 ,
+73 ,
+73 ,
+79 ,
+79 ,
+63 ,
+79 ,
+85 ,
+85 ,
+85 ,
+73 ,
+0 ,
+247,
+0 ,
+249,
+250,
+251,
+63 ,
+253,
+254,
+0
+};
+
+ALLOC_CODE(BYTE) g_rgbPartialBaseTblMEngIreland[128] = {
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 78 ,
+ 79 ,
+ 85 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 65 ,
+ 67 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 78 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 79 ,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 65 ,
+ 79 ,
+ 189,
+ 174,
+ 79 ,
+ 192,
+ 193,
+ 194,
+ 195,
+ 70 ,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 9 ,
+ 65 ,
+ 65 ,
+ 79 ,
+ 206,
+ 206,
+ 45 ,
+ 45 ,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 89 ,
+ 89 ,
+ 218,
+ 219,
+ 220,
+ 221,
+ 63 ,
+ 63 ,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 65 ,
+ 69 ,
+ 65 ,
+ 69 ,
+ 69 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 73 ,
+ 79 ,
+ 79 ,
+ 63 ,
+ 79 ,
+ 85 ,
+ 85 ,
+ 85 ,
+ 73 ,
+ 0 ,
+ 247,
+ 0 ,
+ 249,
+ 250,
+ 251,
+ 63 ,
+ 253,
+ 254,
+ 0
+};
+
+
+
+// Table that is used to generate the base table for each code page for
+// WIN and MAC.
+ALLOC_CODE(BYTE*) g_prgbPartialBaseTbl[11][2] = {
+ // WIN // MAC
+ {NULL, NULL},
+ {g_rgbPartialBaseTbl1252, g_rgbPartialBaseTbl10000},
+ {g_rgbPartialBaseTbl1250, g_rgbPartialBaseTbl10029},
+ {g_rgbPartialBaseTbl1252, g_rgbPartialBaseTbl10007},
+
+ // MAC: UNDONE: Tables of Turkish and Icelandic is not available on MAC.
+// UNDONE: they are now available. Add them.
+ {g_rgbCodePageWGreek+128, g_rgbCodePageMGreek+128 }, // GREEK
+ {g_rgbCodePageWIceland+128, g_rgbCodePageWIceland+128 }, // ICELANDIC
+ {g_rgbPartialBaseTblWTurkish, g_rgbPartialBaseTblWTurkish }, // TURKISH
+ {g_rgbPartialBaseTblWNorwegian, g_rgbPartialBaseTblMNorwegian }, // NORWEIGIAN
+ {g_rgbPartialBaseTblWEngIreland, g_rgbPartialBaseTblMEngIreland }, // ENGLISH(IRELAND)
+ {g_rgbCodePage1256+128, g_rgbCodePage10004+128}, // Arabic
+ {g_rgbCodePage1255+128, g_rgbCodePage10005+128} // Hebrew
+
+};
+
+
+#define GREEK_CP_Partial 0x4
+#define ICELANDIC_CP_Partial 0x5
+#define TURKISH_CP_Partial 0x6
+#define NORWEIGIAN_CP_Partial 0x7
+#define IRELAND_CP_Partial 0x8
+#define ARABIC_CP_Partial 0x9
+#define HEBREW_CP_Partial 0xa
+
+
+ALLOC_CODE(BYTE) g_rgbExcepTblWin1030[][2] = {
+ {196, 196},
+ {197, 197},
+ {198, 196},
+ {208, 68 },
+ {214, 214},
+ {216, 214},
+ {220, 89 },
+ {228, 196},
+ {229, 197},
+ {230, 196},
+ {240, 68 },
+ {246, 214},
+ {248, 214},
+ {252, 89 },
+ {0, 0}
+};
+
+ALLOC_CODE(BYTE) g_rgbExcepTblMac1030[][2] = {
+ {128, 128},
+ {129, 129},
+ {133, 133},
+ {134, 89},
+ {138, 128},
+ {140, 129},
+ {154, 133},
+ {159, 89 },
+ {174, 128},
+ {175, 133},
+ {190, 128},
+ {191, 133},
+ {0, 0}
+};
+
+
+ALLOC_CODE(BYTE) g_rgbExcepTblWin1034[][2] = {
+ {209, 209},
+ {241, 209},
+ {0, 0}
+};
+
+ALLOC_CODE(BYTE) g_rgbExcepTblMac1034[][2] = {
+ {132, 132},
+ {150, 132},
+ {0, 0}
+};
+
+
+ALLOC_CODE(BYTE) g_rgbExcepTblWin1035[][2] = {
+ {87, 86 },
+ {119, 86 },
+ {196, 196},
+ {197, 197},
+ {208, 68 },
+ {214, 214},
+ {216, 214},
+ {220, 89 },
+ {228, 196},
+ {229, 197},
+ {240, 68 },
+ {246, 214},
+ {248, 214},
+ {252, 89 },
+ {0, 0}
+};
+
+
+ALLOC_CODE(BYTE) g_rgbExcepTblMac1035[][2] = {
+ {87, 86 },
+ {119, 86 },
+ {128, 128},
+ {129, 129},
+ {133, 133},
+ {134, 89 },
+ {138, 128},
+ {140, 129},
+ {154, 133},
+ {159, 89 },
+ {175, 133},
+ {191, 133},
+ {0, 0}
+};
+
+
+
+ALLOC_CODE(BYTE) g_rgbExcepTblWin1038[][2] = {
+ {138, 83 },
+ {142, 90 },
+ {154, 83 },
+ {158, 90 },
+ {200, 67 },
+ {213, 213},
+ {214, 213},
+ {216, 82 },
+ {218, 218},
+ {219, 219},
+ {220, 219},
+ {232, 67 },
+ {245, 213},
+ {246, 213},
+ {248, 82 },
+ {250, 218},
+ {251, 219},
+ {252, 219},
+ {0, 0}
+};
+
+
+ALLOC_CODE(BYTE) g_rgbExcepTblMac1038[][2] = {
+ {133, 133},
+ {134, 134},
+ {137, 67 },
+ {139, 67 },
+ {154, 133},
+ {156, 156},
+ {159, 134},
+ {204, 133},
+ {206, 133},
+ {219, 82 },
+ {222, 82 },
+ {225, 83 },
+ {228, 83 },
+ {235, 90 },
+ {236, 90 },
+ {242, 156},
+ {244, 134},
+ {245, 134},
+ {0, 0}
+};
+
+
+ALLOC_CODE(BYTE) g_rgbExcepTblWin1045[][2] = {
+ {138, 83 },
+ {140, 140},
+ {142, 90 },
+ {143, 143},
+ {154, 83 },
+ {156, 140},
+ {158, 90 },
+ {159, 143},
+ {163, 163},
+ {165, 165},
+ {175, 175},
+ {179, 163},
+ {185, 165},
+ {191, 175},
+ {198, 198},
+ {200, 67 },
+ {202, 202},
+ {209, 209},
+ {211, 211},
+ {216, 82 },
+ {230, 198},
+ {232, 67 },
+ {241, 209},
+ {243, 211},
+ {248, 82 },
+ {0, 0}
+};
+
+ALLOC_CODE(BYTE) g_rgbExcepTblMac1045[][2] = {
+ {132, 132},
+ {136, 132},
+ {137, 67 },
+ {139, 67 },
+ {140, 140},
+ {140, 140},
+ {143, 143},
+ {144, 143},
+ {151, 151},
+ {162, 162},
+ {171, 162},
+ {184, 184},
+ {193, 193},
+ {196, 193},
+ {219, 82 },
+ {222, 82 },
+ {225, 83 },
+ {228, 83 },
+ {229, 229},
+ {230, 229},
+ {235, 90 },
+ {236, 90 },
+ {238, 151},
+ {251, 251},
+ {252, 184},
+ {0, 0}
+};
+
+
+ALLOC_CODE(BYTE) g_rgbExcepTblWin1051[][2] = {
+ {196, 196},
+ {212, 212},
+ {228, 196},
+ {244, 212},
+ {0, 0}
+};
+
+ALLOC_CODE(BYTE) g_rgbExcepTblMac1051[][2] = {
+ {138, 138},
+ {153, 153},
+ {239, 153},
+ {0, 0}
+};
+
+ALLOC_CODE(BYTE) g_rgbExcepTblNew[][2] = {
+ {127, 0},
+ {0, 0}
+};
+
+
+struct LcidToExcep {
+ LCID m_lcid;
+ VOID *pvExcepTbl;
+};
+
+// Table containing pointers to the exception table for both windows and
+// Mac platform.
+ALLOC_CODE(struct LcidToExcep) g_rgLcidToExcepTbl[][2] = {
+ // WIN // MAC
+ { {1030, g_rgbExcepTblWin1030}, {1030, g_rgbExcepTblMac1030}, },
+ { {1044, g_rgbExcepTblWin1030}, {1044, g_rgbExcepTblMac1030}, },
+ { {1035, g_rgbExcepTblWin1035}, {1035, g_rgbExcepTblMac1035}, },
+ { {1053, g_rgbExcepTblWin1035}, {1053, g_rgbExcepTblMac1035}, },
+ { {1034, g_rgbExcepTblWin1034}, {1034, g_rgbExcepTblMac1034}, },
+ { {2058, g_rgbExcepTblWin1034}, {2058, g_rgbExcepTblMac1034}, },
+ { {3082, g_rgbExcepTblWin1034}, {3082, g_rgbExcepTblMac1034}, },
+ { {0x403, g_rgbExcepTblWin1034}, {0x403, g_rgbExcepTblMac1034}, },
+ { {1038, g_rgbExcepTblWin1038}, {1038, g_rgbExcepTblMac1038}, },
+ { {1045, g_rgbExcepTblWin1045}, {1045, g_rgbExcepTblMac1045}, },
+ { {1051, g_rgbExcepTblWin1051}, {1051, g_rgbExcepTblMac1051}, },
+
+ { {1032, g_rgbExcepTblNew}, {1032, g_rgbExcepTblNew}, },
+ { {1039, g_rgbExcepTblNew}, {1039, g_rgbExcepTblNew}, },
+ { {1055, g_rgbExcepTblNew}, {1055, g_rgbExcepTblNew}, },
+ { {2068, g_rgbExcepTblNew}, {2068, g_rgbExcepTblNew}, },
+ { {6153, g_rgbExcepTblNew}, {6153, g_rgbExcepTblNew}, },
+
+ { {0, NULL}, {0, NULL} }
+};
+
+
+
+/***
+*VOID GetInsensitiveCompTbl()
+*Purpose: This function returns a table that can be used for accent and case
+* insensitive comparision.
+*IMPLEMENTATION : There are 2 steps to build the table. First build the base
+* table for the code page that contains the passed in lcid.
+* Then see if there is any exception table for that code page.
+* If there is then fix up the exception cases.
+*
+* From 0 to 96 we have identity (index == the entry).
+* From 97 to 122 we have 65 to 90 (note this is 'a' to 'z' that naps to 'A' to 'Z').
+* From 123 to 127 we again have identity.
+*
+*Inputs:
+* lcid : locale for which that table is required.
+* syskind : the system for which the table is required.
+*
+*Outputs:
+* rgchTbl : This table is initialized. This can be used to do accent and
+* case insensitive comparision.
+*
+*
+****************************************************************************/
+VOID GetInsensitiveCompTbl(LCID lcid, SYSKIND syskind, XCHAR *rgchTbl)
+{
+ BYTE *pbPartialTable;
+ // BYTE *pbrgExcepTable[2];
+ BYTE *pbExcepTable;
+ USHORT usSystem, usCodePage;
+ UINT i;
+
+ DebAssert(rgchTbl != NULL, " Bad Argument ");
+
+ // In retail version, return if we have a bad argument.
+ if (rgchTbl == NULL)
+ return;
+
+
+ // Deternine the partail base table to use to get the generate the
+ // base table.
+ //
+ // Find the index corresponding to the system passed in.
+ usSystem = (syskind == SYS_MAC) ? 1 : 0;
+
+ // Determine the Code page.
+ if (lcid == 0x0419) {
+ usCodePage = 3;
+ }
+ else
+ if (lcid == 0x0408) {
+ usCodePage = GREEK_CP_Partial;
+ }
+ else
+ if (lcid == 0x040f) {
+ usCodePage = ICELANDIC_CP_Partial;
+ }
+ else
+ if (lcid == 0x041f) {
+ usCodePage = TURKISH_CP_Partial;
+ }
+ else
+ if (lcid == 0x0814) {
+ usCodePage = NORWEIGIAN_CP_Partial;
+ }
+ else
+ if (lcid == 0x1809) {
+ usCodePage = IRELAND_CP_Partial;
+ }
+ else
+ if (lcid == 0x0405 ||
+ lcid == 0x040e ||
+ lcid == 0x0415 ||
+ lcid == 0x041b) {
+ usCodePage = 2;
+ } else
+ if (lcid == 0x040d) {
+ usCodePage = HEBREW_CP_Partial;
+ } else
+ if (LOBYTE(lcid) == 0x01 || lcid == 0x0429) {
+ usCodePage = ARABIC_CP_Partial;
+ }
+ else {
+ // this is the default. (US english, 1252)
+ usCodePage = 1;
+ }
+
+
+ // Get the partial base table
+ pbPartialTable = g_prgbPartialBaseTbl[usCodePage][usSystem];
+
+ // Generate the table.
+ //
+ // the first 128 characters is identity (except for 90 to 122)
+ for (i=0; i < 128; rgchTbl[i]=i, i++);
+
+ // fix up the characters between 97 and 122 (i. A-Z maps to a-z)
+ for (i=0; i < 26; rgchTbl[97+i] = 'A'+i, i++);
+
+ // Get the top 128 characters from the partial table
+ for (i=0;
+ i < 128;
+ rgchTbl[128+i] = pbPartialTable[i], i++);
+ // end of FOR loop.
+
+ // Now check if the is any exception for this lcid.
+ i = 0;
+ while ((g_rgLcidToExcepTbl[i][usSystem].m_lcid != 0) &&
+ (g_rgLcidToExcepTbl[i][usSystem].m_lcid != lcid)) {
+ i++;
+ }
+
+ // check if there is an exception table for this lcid
+ if (g_rgLcidToExcepTbl[i][usSystem].m_lcid != 0) {
+ // there is an exception table, hence we need to do some more fix up
+ pbExcepTable = (BYTE *)g_rgLcidToExcepTbl[i][usSystem].pvExcepTbl;
+
+ i = 0;
+ while (*(pbExcepTable + 2*i) != 0) {
+ rgchTbl[ (0x00ff & *(pbExcepTable + 2*i)) ] =
+ (0x00ff & *(pbExcepTable + 2*i + 1));
+ i++;
+ } // while
+
+ } // if
+
+ // DONE !!!
+ return;
+}
+#pragma code_seg()
+
+
diff --git a/private/oleauto/src/typelib/tlibutil.hxx b/private/oleauto/src/typelib/tlibutil.hxx
new file mode 100644
index 000000000..3f12f940e
--- /dev/null
+++ b/private/oleauto/src/typelib/tlibutil.hxx
@@ -0,0 +1,40 @@
+/***
+*clutil.hxx - Class Lib component-wide utility functions.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* typelib utility functions
+*
+*Revision History:
+* [00] 24-Jan-93 RajivK: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef TLIBUTIL_HXX_INCLUDED
+#define TLIBUTIL_HXX_INCLUDED
+
+#include "typesx.h"
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szTLIBUTIL_HXX)
+#define SZ_FILE_NAME g_szTLIBUTIL_HXX
+#endif
+
+VOID GetInsensitiveCompTbl(LCID lcid, SYSKIND syskind, XCHAR *rgchTbl);
+
+// This table is not used on MAC. On Mac all characters greater than
+// 128 is mapped to 128
+#if !OE_MAC
+// Define an array for mapping characters > 128 (for WIN)
+//
+extern BYTE g_rgbHashTable[];
+#endif
+
+
+
+#endif // ! TLIBUTIL_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/tls.c b/private/oleauto/src/typelib/tls.c
new file mode 100644
index 000000000..9719d335c
--- /dev/null
+++ b/private/oleauto/src/typelib/tls.c
@@ -0,0 +1,340 @@
+/***
+*tls.c - Thread local storage functions for Macintosh, Win16 platforms
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This mimics Win32 Thread-Local-Storage (TLS) functions on non-Win32
+* platforms.
+* For non-preemptive environments, these functions can be used by DLL
+* components that want to maintain a different copy of a struct for
+* every thread (i.e. client application) that uses the DLL. All of the
+* component's per-thread static data can be kept in this struct.
+* When a DLL is initialized, the DLL's LIBMAIN function calls TlsAlloc
+* to allocate an index of type ITLS.
+* Each time a new thread calls a DLL initialization function, that
+* function allocates a struct to store its per-thread static data,
+* and calls TlsSetValue to save a pointer to that per-thread struct.
+* Whenever a context switch may have occurred, e.g. after a call to
+* GetMessage, Yield, etc., the DLL calls TlsGetValue to re-fetch
+* a pointer to the current thread's static struct.
+* When the DLL is about to be unloaded (WEP), it calls TlsFree.
+*
+* ITLS TlsAlloc(void) - allocate 1 slot for each thread
+* void TlsFree(ITLS) - release slot allocated by TlsAlloc
+* BOOL TlsSetValue(ITLS, LPVOID) - set this thread's value for
+* slot ITLS. Unlike Win4 function, this returns FALSE if
+* there's no room for this thread's set of slots.
+* LPVOID TlsGetValue(ITLS) - get value set by TlsSetValue
+*
+* See the Win32 API for more details.
+*
+*Revision History:
+*
+* 11-Mar-92 tomc: Created.
+*
+*****************************************************************************/
+
+
+#include "typelib.hxx"
+#include "silver.hxx"
+
+#include <string.h>
+#include <memory.h>
+#include "tls.h"
+#include "debug.h"
+
+ // This is currently needed to avoid multiply defines on the Mac link.
+ // It assumes that mob.lib necessarily requires mtypelib.lib to link
+ // (DougF assures me that it does). It should be removed when the
+ // typelib becomes a real DLL on the Mac too. -SatishC.
+
+#if ID_DEBUG
+#undef SZ_FILE_NAME
+ASSERTNAME(g_szTLS_C)
+#define SZ_FILE_NAME g_szTLS_C
+#endif
+
+
+// g_rgthread is an array of THREAD structs with one entry per thread.
+// This limits the number of threads that can access the DLL to
+// ITLS_THREADS.
+//
+// CONSIDER: We undoubtably want to change this to be a dynamically
+// grown list. An array was expedient until we know whether
+// this, or something functionally equivalent, may become a
+// part of OLExxx.dll, and thus, whether or not it is ok
+// to depend on OB memory mgmt primitives.
+//
+// Each THREAD instance has another array of pointers.
+// TlsAlloc allocates a slot in this array of pointers for all THREADs.
+// An element of g_rgthread is allocated the 1st time the thread calls
+// TlsSetValue. The element is released when each pointer in the THREAD
+// has been set to NULL by TlsSetValue.
+//
+
+#if OE_WIN16
+#pragma optimize("q",off)
+#endif //OE_WIN16
+
+// g_rgbSlot remembers which slots have been allocated by TlsAlloc.
+// g_rgbSlot[x] is TRUE if slot x has been allocated by TlsAlloc.
+//
+char g_rgbSlot[ITLS_COMPONENTS];
+THREAD g_rgthread[ITLS_THREADS];
+PTHREAD g_pthreadEnd = NULL; // points to first unused THREAD
+
+// The following are used to cache the pointer to the current thread's
+// THREAD instance, speeding up TlsGetValue.
+//
+TID g_tidThreadCache; // cache current thread id
+PTHREAD g_pthreadCache; // pointer to equivalent THREAD instance
+
+// TlsInit is called once 1st time TlsAlloc is called after DLL is loaded.
+// Initializes collection of CDllThread instances.
+//
+#pragma code_seg(CS_INIT)
+#if !OE_MAC
+// UNDONE: linker bug won't allow cross seg call to static func.
+static
+#endif
+void PASCAL TlsInit()
+{
+ int i;
+
+ for(i = 0; i < (sizeof(g_rgthread)/sizeof(g_rgthread[0])); i++) {
+ g_rgthread[i].tid = TID_EMPTY;
+#if ID_DEBUG
+ // Note that in order to be compatible with Win32 TLS, we do
+ // not initialize rgtls. Instead we use rgfSlotUsed to keep
+ // track of TLS usage.
+ {
+ int j;
+ for( j = 0; j < ITLS_COMPONENTS; j++ )
+ g_rgthread[ i ].rgfSlotUsed[ j ] = 0;
+ }
+#endif
+ }
+
+ g_pthreadEnd = (PTHREAD)(&g_rgthread[ITLS_THREADS]);
+ // points 1 byte beyond end of g_rgthread
+
+ memset(g_rgbSlot, 0, ITLS_COMPONENTS);
+ g_tidThreadCache = TID_EMPTY;
+}
+#pragma code_seg()
+
+
+// Allocate a slot for storing per-thread pointers.
+// Called when a client DLL's LIBMAIN is initializing the DLL.
+//
+#pragma code_seg(CS_INIT)
+ITLS PASCAL EXPORT TlsAlloc()
+{
+ ITLS itls;
+
+ if (g_pthreadEnd == NULL) {
+ // 1st time this has been called.
+ TlsInit();
+ }
+
+ for (itls = 0; itls < ITLS_COMPONENTS; itls++) {
+ if (g_rgbSlot[itls] == 0) {
+ g_rgbSlot[itls] = 1;
+ return itls;
+ }
+ }
+ return ITLS_EMPTY; // no slot available
+}
+#pragma code_seg()
+
+
+// Release a slot allocated by TlsAlloc.
+//
+#pragma code_seg(CS_CORE)
+void PASCAL EXPORT TlsFree(ITLS itls)
+{
+ if (itls != ITLS_EMPTY) {
+ DebAssert(g_pthreadEnd != NULL, "TlsAlloc must be called 1st.");
+ DebAssert(itls < ITLS_COMPONENTS, "TlsFree err1");
+ DebAssert(g_rgbSlot[itls] != 0, "TlsFree err2");
+#if ID_DEBUG
+ {
+ int i;
+ for( i = 0; i < ITLS_THREADS; i++ )
+ g_rgthread[ i ].rgfSlotUsed[ itls ] = 0;
+ }
+#endif
+ g_rgbSlot[itls] = 0;
+ }
+}
+#pragma code_seg()
+
+
+// TlsSetValue stores a pointer for this thread in a slot allocated by
+// TlsAlloc. It isn't called frequently, and thus, need not be super fast.
+// It doesn't depend on or affect the cache maintained by TlsGetValue.
+// This allocates a THREAD entry for this thread if necessary.
+// Unlike the WIN32 version, it return FALSE if it wasn't possible to
+// allocate a THREAD instance.
+// Otherwise, set the itls slot for this thread to pvParam and return TRUE;
+//
+#pragma code_seg(CS_INIT)
+BOOL PASCAL EXPORT TlsSetValue(ITLS itls, LPVOID pvParam)
+{
+ TID tid;
+ PTHREAD pthread, pthreadFree;
+ LPVOID * ppv;
+#if ID_DEBUG
+ PID pidTmp;
+#endif //ID_DEBUG
+
+ tid = GETTID(&tid); // tid = caller's SS
+
+ DebAssert(tid != TID_EMPTY, "");
+ DebAssert(itls < ITLS_COMPONENTS, "TlsSetValue err1");
+ DebAssert(g_rgbSlot[itls] != 0, "TlsSetValue err2");
+
+ // search for thread's tid field
+
+ pthreadFree = NULL;
+ for (pthread = g_rgthread; pthread < g_pthreadEnd; pthread++) {
+ if (pthread->tid == tid) {
+#if ID_DEBUG
+ GETPID(pidTmp);
+ DebAssert(ISEQUALPID(pidTmp, pthread->pid), "bad pid");
+#endif //ID_DEBUG
+ goto SetValue; // found it -- set the value
+ }
+ if ((pthreadFree == NULL) &&
+ (pthread->tid == TID_EMPTY)) {
+ // remember 1st free thread
+ pthreadFree = pthread;
+ }
+ }
+ if (pthreadFree == NULL)
+ return FALSE; // no free slots available for this thread
+
+ // allocate a new THREAD instance
+ pthread = pthreadFree;
+ GETPID(pthread->pid);
+
+SetValue:
+ pthread->rgtls[itls] = pvParam;
+
+ // WARNING: setting of tid must be AFTER the data value is set (directly
+ // above). This is required for the interrupt-driven break check,
+ // which assumes the data is valid if the tid is non-empty.
+ //
+ pthread->tid = tid;
+
+#if ID_DEBUG
+ pthread->rgfSlotUsed[ itls ] = -1;
+#endif
+ if (pvParam != NULL)
+ return TRUE;
+
+ // See if all of this thread's slots are NULL.
+ // If so, release resources occupied by the thread.
+
+ for (ppv = &pthread->rgtls[0];
+ ppv < &pthread->rgtls[ITLS_COMPONENTS];
+ ppv++) {
+ if (*ppv != NULL)
+ return TRUE; // at least one slot is still in use by this thread
+ }
+
+ // This thread's last field is NULL - release the thread, flush cache
+
+ pthread->tid = TID_EMPTY;
+ g_tidThreadCache = TID_EMPTY;
+ return TRUE;
+}
+#pragma code_seg()
+
+
+// Retrieve a value stored by TlsSetValue - must be fast.
+//
+#pragma code_seg(CS_INIT)
+LPVOID PASCAL EXPORT TlsGetValue(ITLS itls)
+{
+ PTHREAD pthread;
+ TID tid;
+#if ID_DEBUG
+ PID pidTmp;
+#endif //ID_DEBUG
+
+ tid = GETTID(&tid); // tid = caller's SS
+
+ DebAssert(tid != TID_EMPTY, "");
+ DebAssert(itls < ITLS_COMPONENTS, "TlsGetValue err1");
+ DebAssert(g_rgbSlot[itls] != 0, "TlsGetValue err2");
+
+ if (g_tidThreadCache == tid) {
+#if ID_DEBUG
+ GETPID(pidTmp);
+ DebAssert(ISEQUALPID(pidTmp, g_pthreadCache->pid), "bad pid");
+#endif //ID_DEBUG
+ return g_pthreadCache->rgtls[itls];
+ }
+
+ // cache doesn't contain desired value
+ // search for thread's tid field
+
+ for (pthread = g_rgthread; pthread < g_pthreadEnd; pthread++) {
+ if (pthread->tid == tid) {
+#if ID_DEBUG
+ GETPID(pidTmp);
+ DebAssert(ISEQUALPID(pidTmp, pthread->pid), "bad pid");
+#endif //ID_DEBUG
+ g_tidThreadCache = tid;
+ g_pthreadCache = pthread;
+ return pthread->rgtls[itls];
+ }
+ }
+
+ // thread not found.
+ // value must be NULL since TlsSetValue hasn't been called.
+ //
+ return NULL;
+}
+#pragma code_seg()
+
+#pragma code_seg(CS_QUERY)
+// Clean out thread data that we know to be obsolete (leftover from a task
+// that UAE'd or didn't cleanup after itself correctly).
+//
+void TlsCleanupDeadTasks()
+{
+ PTHREAD pthread;
+ TID tid;
+ PID pid;
+
+ tid = GETTID(&tid); // tid = caller's SS
+ GETPID(pid); // pid = caller's process id
+
+ DebAssert(tid != TID_EMPTY, "");
+
+ // search for thread's tid field
+
+ for (pthread = g_rgthread; pthread < g_pthreadEnd; pthread++) {
+ // if we find an entry with our own SS, but a different process id,
+ // then it must be a process that has terminated without cleaning up
+ // after itself. So we wipe out it's entry now.
+ if (pthread->tid == tid && !ISEQUALPID(pthread->pid, pid)) {
+
+ // This thread's entry contains obsolete data, since the thread has
+ // terminated, and the memory pointed to by our structures is either
+ // gone, or in use by somebody else.
+
+ // Pretend this thread did TlsSetValue(itls, NULL) on all it's itls's,
+ // to put us back into a stable state.
+ memset (pthread->rgtls, 0, ITLS_COMPONENTS * sizeof(LPVOID));
+ pthread->tid = TID_EMPTY;
+ g_tidThreadCache = TID_EMPTY;
+ break;
+ }
+ }
+}
+#pragma code_seg()
diff --git a/private/oleauto/src/typelib/tls.h b/private/oleauto/src/typelib/tls.h
new file mode 100644
index 000000000..dcaa43efb
--- /dev/null
+++ b/private/oleauto/src/typelib/tls.h
@@ -0,0 +1,175 @@
+/***
+*tls.h - Defines Win16/Mac interface for Thread-Local-Storage functions.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the interface to functions for Thread-Local-Storage.
+* They allow DLL functions to easily maintain per-app static data.
+* These functions mimic Win32 Thread-Local-Storage (TLS) functions on
+* non-Win32 platforms. For more info, see the Win32 definitions for:
+* TlsAlloc, TlsFree, TlsSetValue, TlsGetValue.
+*
+* For non-preemptive environments, these functions can be used by DLL
+* components that want to maintain a different copy of a struct for
+* every thread (i.e. client application) that uses the DLL. All of the
+* component's per-thread static data can be kept in this struct.
+* When a DLL is initialized, the DLL's LIBMAIN function calls TlsAlloc
+* to allocate an index of type ITLS.
+* Each time a new thread calls a DLL initialization function, that
+* function allocates a struct to store its per-thread static data,
+* and calls TlsSetValue to save a pointer to that per-thread struct.
+* Whenever a context switch may have occurred, e.g. after a call to
+* GetMessage, Yield, etc., the DLL calls TlsGetValue to re-fetch
+* a pointer to the current thread's static struct.
+* When the DLL is about to be unloaded (WEP), it calls TlsFree.
+*
+* ITLS TlsAlloc(void) - allocate 1 slot for each thread
+* void TlsFree(ITLS) - release slot allocated by TlsAlloc
+* BOOL TlsSetValue(ITLS, LPVOID) - set this thread's value for
+* slot ITLS. Unlike Win4 function, this returns FALSE if
+* there's no room for this thread's set of slots.
+* LPVOID TlsGetValue(ITLS) - get value set by TlsSetValue
+*
+* See the Win32 API for more details.
+*
+*
+*****************************************************************************/
+#ifndef TLS_H_INCLUDED
+#define TLS_H_INCLUDED
+
+
+#if OE_WIN32
+ typedef DWORD TID; //Thread Id
+ typedef DWORD ITLS; //index to a thread-local-storage slot.
+ #define TID_EMPTY 0xFFFFFFFF
+ #define ITLS_EMPTY 0xFFFFFFFF
+#else //OE_WIN32
+#if HP_I286
+ typedef WORD TID; //Thread Id - SS register on Win16
+#else //HP_I286
+ typedef DWORD TID; //Thread Id - A5 register on Mac
+#endif //HP_I286
+ typedef WORD ITLS; //index to a thread-local-storage slot.
+#if OE_MAC68K
+ typedef ProcessSerialNumber PID; // process id (from GetCurrentProcess)
+#define ISEQUALPID(a, b) \
+ (a.highLongOfPSN == b.highLongOfPSN && a.lowLongOfPSN == b.lowLongOfPSN)
+#else //OE_MAC68K
+ typedef DWORD PID; //process id (from CoGetCurrentProcess)
+#define ISEQUALPID(a, b) (a == b)
+#endif //OE_MAC68K
+ #define TID_EMPTY 0xFFFF
+ #define ITLS_EMPTY 0xFFFF //impossible ITLS value
+ #define PID_EMPTY 0xFFFFFFFF //impossible PID value
+#endif //OE_WIN32
+
+#if !(OE_MAC && !OE_DLL)
+
+#define ITLS_COMPONENTS 2 // only 2 are used in typelib.dll
+ // Number of per-thread components,
+ // i.e. number of times TlsAlloc can be called.
+#define ITLS_THREADS 50
+
+#else //EI_OLE
+
+#if OE_MAC
+#define ITLS_COMPONENTS 8 // CONSIDER: tune this constant
+#define ITLS_THREADS 1 // Statically linked, cannot have more than 1
+#else //OE_MAC
+#define ITLS_COMPONENTS 8 // CONSIDER: tune this constant
+#define ITLS_THREADS 20
+#endif
+#endif //EI_OLE
+ // Number of threads supported
+
+// One instance of THREAD per thread that calls TlsSetValue(<non-null>)
+typedef struct {
+ TID tid; // thread id
+#if !OE_WIN32
+ PID pid; // process id (from CoGetCurrentProcess)
+#endif //!OE_WIN32
+ LPVOID rgtls[ITLS_COMPONENTS]; // per-thread component pointers
+#if ID_DEBUG
+ CHAR rgfSlotUsed[ ITLS_COMPONENTS ];
+ //Used in debug mode to validate Tls calls.
+#endif
+} THREAD;
+typedef THREAD *PTHREAD;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !OE_WIN32
+ //These functions only need to be defined on non-Win32 platforms
+ ITLS FAR PASCAL EXPORT TlsAlloc(void);
+ void FAR PASCAL EXPORT TlsFree(ITLS itls);
+ LPVOID FAR PASCAL EXPORT TlsGetValue(ITLS itls);
+ BOOL FAR PASCAL EXPORT TlsSetValue(ITLS itls, LPVOID);
+
+ // not in the "offical" TLS API, but we need this to be able to invalidate
+ // entries in our task list for ill-behaved apps.
+ void FAR TlsCleanupDeadTasks(void);
+
+//
+// GETTID, GETPID
+//
+
+#if OE_MAC68K
+
+static const LPLONG pCurrentA5 = (LPLONG)(0x904);
+#define GETTID(x) *pCurrentA5
+
+#define GETPID(dest) (GetCurrentProcess(&dest))
+
+#elif OE_MACPPC
+
+// Note: Mac/PPC has per-process data and only one thread
+#define GETTID(x) ((TID)1)
+#define GETPID(dest) (dest = (PID)1)
+
+#else
+
+#define GETTID(x) (__segment)(x)
+#define GETPID(dest) (dest = CoGetCurrentProcess())
+
+#endif
+
+
+#ifdef __cplusplus
+//TlsCache is useful in non-preemptive environments for caching
+//a particular pointer stored with TlsSetValue for the current thread.
+//
+//Sample usage:
+// //Assume we want to maintain a static instance of X for every thread.
+// ITLS g_itlsPx; //index to per-thread slot allocated by TlsAlloc
+// TID g_tidPxCache; //cache current thread id
+// PEBTHREAD g_pxCache; //pointer to current thread's instance of X
+// :
+// TlsCache(g_itlsPx, (LPVOID *)&g_pxCache, &g_tidPxCache);
+// //update g_pxCache and g_tidPxCache if caller is different
+// //thread than the last time this was called.
+//
+
+inline void TlsCache(ITLS itls, LPVOID *ppvCache, TID * ptidCache)
+{
+ TID tid;
+
+ tid = GETTID(&tid); //tid = caller's SS
+ if (tid != *ptidCache) {
+ //caller's thread is different than *ptidCache - update cache
+ *ppvCache = TlsGetValue(itls);
+ *ptidCache = tid;
+ }
+}
+#endif //__cplusplus
+
+#endif //OE_WIN32
+
+#ifdef __cplusplus
+}
+#endif //__cplusplus
+
+#endif //TLS_H_INCLUDED
diff --git a/private/oleauto/src/typelib/tmpguid.c b/private/oleauto/src/typelib/tmpguid.c
new file mode 100644
index 000000000..f5c091898
--- /dev/null
+++ b/private/oleauto/src/typelib/tmpguid.c
@@ -0,0 +1,104 @@
+/***
+*tmpguid.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is intended for the misc instantiation of guids
+* from other components (Ole2 for example) that are not available
+* for some reason, or that we dont want to pull in from somewhere
+* else (for example, as imported data from a dll that we otherwise
+* don't use).
+*
+* Guids that are part of OB, or that name things internal to OB
+* should be declared in obguid.h, and thereby instantiated by
+* obguid.c
+*
+* This file should probably be called miscguid.c.
+*
+*
+*Revision History:
+*
+* [00] 27-Dec-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "switches.hxx"
+#include "version.hxx"
+
+#if OE_MAC
+// HACK to make GUID's be defined in a FAR segment w/o changing the OLE
+// header files (works arounds a Wings bug). Define-away 'const' so that
+// they get put into .fardata like they're supposed to.
+#define const
+#endif
+
+#include "silver.hxx"
+
+//OLE uses _MAC to determine if this is a Mac build
+#if OE_MAC
+# define _MAC
+#endif
+
+// initguid.h requires this.
+#if OE_WIN32
+#define INC_OLE2
+#include <ole2.h>
+#else
+#include <compobj.h>
+#endif
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+
+#if !OE_MACPPC // already defined in dispiid.c for the PPC
+// The following guid is not yet available in the Automation Dll(s).
+//
+DEFINE_GUID(IID_IErrorInfo,
+ 0xC093F1A0L,0x1827,0x101B,0x99,0xA1,0x08,0x00,0x2B,0x2B,0xD1,0x19);
+#endif //OE_MACPPC
+
+// The following Connection Point related GUIDs are not instantiated
+// by any of the Ole2 dlls (yet).
+// These definitions are cut out of ole2ctlid.h, which was picked
+// up from the CDK beta on 11/23/93.
+//
+DEFINE_GUID(IID_IProvideClassInfo,
+ 0xB196B283,0xBAB4,0x101A,0xB6,0x9C,0x00,0xAA,0x00,0x34,0x1D,0x07);
+DEFINE_GUID(IID_IConnectionPointContainer,
+ 0xB196B284,0xBAB4,0x101A,0xB6,0x9C,0x00,0xAA,0x00,0x34,0x1D,0x07);
+DEFINE_GUID(IID_IEnumConnectionPoints,
+ 0xB196B285,0xBAB4,0x101A,0xB6,0x9C,0x00,0xAA,0x00,0x34,0x1D,0x07);
+DEFINE_GUID(IID_IConnectionPoint,
+ 0xB196B286,0xBAB4,0x101A,0xB6,0x9C,0x00,0xAA,0x00,0x34,0x1D,0x07);
+DEFINE_GUID(IID_IEnumConnections,
+ 0xB196B287,0xBAB4,0x101A,0xB6,0x9C,0x00,0xAA,0x00,0x34,0x1D,0x07);
+//
+// Interface IDs for licensing interfaces
+DEFINE_GUID(IID_IClassFactory2,
+ 0xB196B28F,0xBAB4,0x101A,0xB6,0x9C,0x00,0xAA,0x00,0x34,0x1D,0x07);
+
+
+
+// IIDs on PPC & 68k Mac:
+#if OE_MAC
+DEFINE_OLEGUID(IID_ILockBytes, 0x0000000aL, 0, 0);
+DEFINE_OLEGUID(IID_IPersistFile, 0x0000010bL, 0, 0);
+DEFINE_OLEGUID(IID_IStorage, 0x0000000bL, 0, 0);
+#endif
+
+// IIDs on 68k Mac only:
+#if OE_MAC68K
+DEFINE_OLEGUID(IID_IDispatch, 0x00020400, 0, 0);
+DEFINE_OLEGUID(IID_IEnumVARIANT, 0x00020404, 0, 0);
+DEFINE_OLEGUID(IID_IUnknown, 0x00000000, 0, 0);
+DEFINE_OLEGUID(IID_IStream, 0x0000000cL, 0, 0);
+DEFINE_GUID(GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+#endif
+
+
diff --git a/private/oleauto/src/typelib/typelib.def b/private/oleauto/src/typelib/typelib.def
new file mode 100644
index 000000000..d69ea95bd
--- /dev/null
+++ b/private/oleauto/src/typelib/typelib.def
@@ -0,0 +1,74 @@
+;pull in OE_WIN16, OE_WIN32, and OE_MAC switches
+#include "switches.hxx"
+
+#if OE_WIN32
+LIBRARY TYPLIB32
+#endif
+#if OE_WIN16 || OE_MACPPC
+LIBRARY TYPELIB
+#endif //OE_WIN16
+
+DESCRIPTION 'OLE Automation Type Information Interfaces'
+
+#if !OE_MACPPC
+EXETYPE WINDOWS
+CODE MOVEABLE DISCARDABLE
+#if OE_WIN32
+DATA MULTIPLE MOVEABLE PRELOAD
+#else //OE_WIN32
+DATA SINGLE MOVEABLE PRELOAD
+#endif //OE_WIN32
+
+PROTMODE
+HEAPSIZE 512
+
+SEGMENTS
+ _TEXT PRELOAD
+#if OE_WIN16
+ TlibQuery PRELOAD
+ WEP_TEXT PRELOAD
+ TlibCreate //[bb]this doesn't need to be listed here anymore
+
+#endif
+#endif // !OE_MACPPC
+; Please try to keep the following list in alphabetical order,
+; but retain ordinal values from version to version.
+;
+EXPORTS
+#if OE_MAC
+ CreateTypeLib @1
+ LoadTypeLib @2
+ LoadRegTypeLib @3
+ RegisterTypeLib @4
+ QueryPathOfRegTypeLib @5
+ LHashValOfNameSys @6
+ LoadTypeLibFSp @7
+ RegisterTypeLibFolder @8
+ QueryTypeLibFolder @9
+ IID_ICreateTypeInfo @10
+ IID_ICreateTypeLib @11
+ IID_ITypeComp @12
+ IID_ITypeInfo @13
+ IID_ITypeLib @14
+
+#else
+ CreateTypeLib@12 @2
+ LoadTypeLib@8 @3
+ LoadRegTypeLib@20 @11
+ RegisterTypeLib@12 @10
+ QueryPathOfRegTypeLib@20 @14
+#if OE_WIN16
+ WEP@4 @1 RESIDENTNAME
+#endif
+ LHashValOfNameSys@12 @4
+ _IID_ICreateTypeInfo @5
+ _IID_ICreateTypeLib @6
+ _IID_ITypeComp @7
+ _IID_ITypeInfo @8
+ _IID_ITypeLib @9
+#endif
+
+ ; New API's for OA94
+ OaBuildVersion@0 @15
+
+ ; Highest ordinal in use is @15, next is @16
diff --git a/private/oleauto/src/typelib/typelib.hxx b/private/oleauto/src/typelib/typelib.hxx
new file mode 100644
index 000000000..df638ce2b
--- /dev/null
+++ b/private/oleauto/src/typelib/typelib.hxx
@@ -0,0 +1,336 @@
+/***
+*typelib.hxx
+*
+* Copyright (C) 1990, Microsoft Corporation
+*
+*Purpose:
+* This file defines newNames for the function defined in MAC typelib.
+*
+*
+*Revision History:
+*
+* 29-Mar-93 Rajivk: File created.
+*
+*******************************************************************************/
+
+#ifndef TYPELIB_HXX_INCLUDED
+#define TYPELIB_HXX_INCLUDED
+
+#include "switches.hxx"
+#include "version.hxx"
+
+#if OE_MAC68K
+#if !OE_DLL
+#define OLENAMES_MUNGE_FOR_STATIC
+#include "olenames.h"
+#endif //!OE_DLL
+#endif //EI_OB
+
+#define GenericTypeLibOLE OGTOLE
+#define STL_TYPEINFO OSTL_TI
+#define CDefnTypeComp ODfnTCmp
+#define REC_TYPEINFO OREC_TI
+#define CreateTypeInfo OCreateTI
+#define GetRefTypeInfo OGtRfTI
+#define GetBestLcidMatch OGetBestLcidMatch
+#define g_mempool Og_mempool
+#if ID_DEBUG
+#define GetMemPool OGetMemPool
+#define FreeMemPool OFreeMemPool
+#define MemPoolSize OMemPoolSize
+#endif //ID_DEBUG
+#if OE_MAC
+#define g_rgLcidToExcepTbl Og_rgLcidToExcepTbl
+#define g_rgbExcepTblMac1051 Og_rgbExcepTblMac1051
+#define g_rgbExcepTblWin1051 Og_rgbExcepTblWin1051
+#define g_rgbExcepTblMac1045 Og_rgbExcepTblMac1045
+#define g_rgbExcepTblWin1045 Og_rgbExcepTblWin1045
+#define g_rgbExcepTblMac1038 Og_rgbExcepTblMac1038
+#define g_rgbExcepTblWin1038 Og_rgbExcepTblWin1038
+#define g_rgbExcepTblMac1035 Og_rgbExcepTblMac1035
+#define g_rgbExcepTblWin1035 Og_rgbExcepTblWin1035
+#define g_rgbExcepTblMac1034 Og_rgbExcepTblMac1034
+#define g_rgbExcepTblWin1034 Og_rgbExcepTblWin1034
+#define g_rgbExcepTblMac1030 Og_rgbExcepTblMac1030
+#define g_rgbExcepTblWin1030 Og_rgbExcepTblWin1030
+#define g_prgbPartialBaseTbl Og_prgbPartialBaseTbl
+#define g_rgbPartialBaseTbl10007 Og_rgbPartialBaseTbl10007
+#define g_rgbPartialBaseTbl10029 Og_rgbPartialBaseTbl10029
+#define g_rgbPartialBaseTbl10000 Og_rgbPartialBaseTbl10000
+#define g_rgbPartialBaseTbl1250 Og_rgbPartialBaseTbl1250
+#define g_rgbPartialBaseTbl1252 Og_rgbPartialBaseTbl1252
+
+#define GetInsensitiveCompTbl OGetInsensitiveCompTbl
+#define g_presetlib Og_presetlib
+#define BINDINFO OBINDINFO
+#define IMPTYPE OIMPTYPE
+#define PROPERTY_NODE OPROPERTY_NODE
+#define SHEAPMGR_LIST OSHEAPMGR_LIST
+#define SHEAP_WRAPPER OSHEAP_WRAPPER
+#define VAROFS OVAROFS
+#define VBASEPOS OVBASEPOS
+#define VMETHOFS OVMETHOFS
+#define VMETHPOS OVMETHPOS
+#define PROPERTY_NODE OPROPERTY_NODE
+#define SHEAP_WRAPPER OSHEAP_WRAPPER
+#define YAPAXI OYAPAXI
+#define YAPAXIPAX OYAPAXIPAX
+#define YAXPAX OYAXPAX
+#define PROPERTY_NODE OPROPERTY_NODE
+#define NAME_CACHE ONAME_CACHE
+#define DataMemberHmemberOfOffset ODataMemberHmemberOfOffset
+#define DllFuncHmemberOfOffset ODllFuncHmemberOfOffset
+#define HashOfHgnam OHashOfHgnam
+#define IsDataMember OIsDataMember
+#define IsMatchOfVisibility OIsMatchOfVisibility
+#define IsPropertyGet OIsPropertyGet
+#define IsPropertyLet OIsPropertyLet
+#define IsPropertySet OIsPropertySet
+#define PropkindOfInvokekind OPropkindOfInvokekind
+#define SizeofTdesckind OSizeofTdesckind
+#define XszAddXChar OXszAddXChar
+#define XszCat OXszCat
+#define XszDup OXszDup
+#define XszFind OXszFind
+#define XszFindOneOf OXszFindOneOf
+#define XszLeft OXszLeft
+#define g_fTdataSwap Og_fTdataSwap
+#define XszMid OXszMid
+#define UB_IMPTYPE OUB_IMPTYPE
+#define GetLStrOfSz OGetLStrOfSz
+#define LStrAlloc OLStrAlloc
+#define LStrFree OLStrFree
+#define LStrOfBuf OLStrOfBuf
+#define LStrOfSz OLStrOfSz
+#define LStrSize OLStrSize
+#define OB_SER_TYPE_ENTRY OOB_SER_TYPE_ENTRY
+#define OB_TYPE_ENTRY OOB_TYPE_ENTRY
+#define ELEMPROP OELEMPROP
+#define REFLIB OREFLIB
+#define SER_TYPE_ENTRY OSER_TYPE_ENTRY
+#define TYPE_ENTRY OTYPE_ENTRY
+#define DYN_TYPEROOT ODYN_TYPEROOT
+#define GEN_DTINFO OGEN_DTINFO
+#define COMPILETIME_SEG OCOMPILETIME_SEG
+#define BIND_DESC OBIND_DESC
+#define EXBIND OEXBIND
+#define TYPE_DATA OTYPE_DATA
+#define ENTRYMGR OENTRYMGR
+#define NAMMGR ONAMMGR
+#define DYNTYPEINFO ODYNTYPEINFO
+#define DYN_TYPEMEMBERS ODYN_TYPEMEMBERS
+#define DYN_TYPEBIND ODYN_TYPEBIND
+#define BINDNAME_TABLE OBINDNAME_TABLE
+#define DYN_BINDNAME_TABLE ODYN_BINDNAME_TABLE
+#define IMPMGR OIMPMGR
+#define BLK_MGR OBLK_MGR
+#define GENPROJ_TYPEBIND OGENPROJ_TYPEBIND
+#define DEFN_TYPEBIND ODEFN_TYPEBIND
+#define GENPROJ_BINDNAME_TABLE OGENPROJ_BINDNAME_TABLE
+#define _Mem O_Mem
+#define STREAM OSTREAM
+#define SHEAP_MGR OSHEAP_MGR
+#define BLK_DESC OBLK_DESC
+#define DOCFILE_STREAM ODOCFILE_STREAM
+#define IMPMGR OIMPMGR
+#define IMPMGR OIMPMGR
+#define IMPMGR OIMPMGR
+#define DEFN ODEFN
+#define MEMBER_DEFN OMEMBER_DEFN
+#define VAR_DEFN OVAR_DEFN
+#define MBR_VAR_DEFN OMBR_VAR_DEFN
+#define RECTYPE_DEFN ORECTYPE_DEFN
+#define TYPE_DEFN OTYPE_DEFN
+#define FUNC_DEFN OFUNC_DEFN
+#define VIRTUAL_FUNC_DEFN OVIRTUAL_FUNC_DEFN
+#define FUNC_TYPE_DEFN OFUNC_TYPE_DEFN
+#define PARAM_DEFN OPARAM_DEFN
+#define DLLENTRY_DEFN ODLLENTRY_DEFN
+
+#define OpenTypeLibKey OOpenTypeLibKey
+#define CloseTypeLibKey OCloseTypeLibKey
+#define GetLibIdKind OGetLibIdKind
+
+#undef GETSCODE
+#define GETSCODE OGETSCODE
+#define REPORTRESULT OREPORTRESULT
+#define CkVt OCkVt
+#define g_pOBZone Og_pOBZone
+#define HsysAlloc OHsysAlloc
+#define HsysReallocHsys OHsysReallocHsys
+#define PvLockHsys OPvLockHsys
+#define PvDerefHsys OPvDerefHsys
+#define FreeHsys OFreeHsys
+#define UnlockHsys OUnlockHsys
+#define BchSizeBlockHsys OBchSizeBlockHsys
+#define SheapTerm OSheapTerm
+#define HbpAllocHh OHbpAllocHh
+#define HbpReallocHhHbp OHbpReallocHhHbp
+#define FreeHhHbp OFreeHhHbp
+#define BcSizeBlockHhHbp OBcSizeBlockHhHbp
+#define BcHeapCompactHh OBcHeapCompactHh
+#define PvDerefHhHbp OPvDerefHhHbp
+#define PvLockHhHbp OPvLockHhHbp
+#define UnlockHhHbp OUnlockHhHbp
+#define IsSheapEmpty OIsSheapEmpty
+#define rtReallocMem OrtReallocMem
+#define rtFreeMem OrtFreeMem
+#define rtSizeMem OrtSizeMem
+#define rtDerefMem OrtDerefMem
+#define rtLockMem OrtLockMem
+#define rtUnlockMem OrtUnlockMem
+#define rtTermMem OrtTermMem
+#define GetNewIndex OGetNewIndex
+#define CbSizeArrayDesc OCbSizeArrayDesc
+#define rtArrayInit OAD_Init
+#define MakeRelativePath OMakeRelativePath
+#define MakeAbsolutePath OMakeAbsolutePath
+#define SplitGuidLibId OSplitGuidLibId
+#define GetPathOfLibId OGetPathOfLibId
+#define MakeAbsoluteLibId OMakeAbsoluteLibId
+#define DBM_cbSizeHandleTableInitial ODBM_cbSizeHandleTableInitial
+#define DYN_BLK_MGR ODYN_BLK_MGR
+#define IndexOfParam OIndexOfParam
+#define g_fHeapChk Og_fHeapChk
+#define g_fSheapShakingOn Og_fSheapShakingOn
+#define g_fValidSheapmgrList Og_fValidSheapmgrList
+#define g_itlsSheapmgr Og_itlsSheapmgr
+#define rtDim OrtDim
+#define rtAllocMem OrtAllocMem
+#define SheapInit OSheapInit
+#define rtSheapMgrInit OrtSheapMgrInit
+#define DebPrintf ODebPrintf
+#define DebAssertFailed ODebAssertFailed
+#define DebHalted ODebHalted
+#if ID_DEBUG
+#define DebExamineHeap ODebExamineHeap
+#endif //ID_DEBUG
+#define DebAddInstTable_ ODebAddInstTable_
+#define DebRemInstTable_ ODebRemInstTable_
+#define DebErrorNow_ ODebErrorNow_
+#define LoadRegTypeLibOfSzGuid OLoadRegTypeLibOfSzGuid
+#define GetRegInfoForTypeLibOfSzGuid OGetRegInfoForTypeLibOfSzGuid
+#define cbSizeBitmap OcbSizeBitmap
+#define cbSizeInitial OcbSizeInitial
+#define g_cbHeapAllocd Og_cbHeapAllocd
+#define g_cbHeapAllocdMax Og_cbHeapAllocdMax
+#define MemAlloc OMemAlloc
+#define MemZalloc OMemZalloc
+#define MemRealloc OMemRealloc
+#define MemFree OMemFree
+#define MemSize OMemSize
+#define CreateXsz OCreateXsz
+#define ErrCopy OErrCopy
+#define SwapShortArray OSwapShortArray
+#define SwapLongArray OSwapLongArray
+#define SwapStruct OSwapStruct
+#define SwapStructArray OSwapStructArray
+#define g_rgusErrorMap Og_rgusErrorMap
+
+#if 0
+#define OleerrOfTiperr OOleerrOfTiperr
+#define TiperrOfOleerr OTiperrOfOleerr
+#define HresultOfTiperr OHresultOfTiperr
+#define TiperrOfHresult OTiperrOfHresult
+#define TiperrToHresult OTiperrToHresult
+#define HresultToTiperr OHresultToTiperr
+#define LookupHresultOfTiperr OLookupHresultOfTiperr
+#define LookupTiperrOfHresult OLookupTiperrOfHresult
+#endif //0
+
+#define IsTypeBasicIntrinsic OIsTypeBasicIntrinsic
+#define OffsetOfHmember OOffsetOfHmember
+#define ReleaseLibrary OReleaseLibrary
+#define ReleaseDllEntries OReleaseDllEntries
+#define g_rgrgcbSizeType Og_rgrgcbSizeType
+#define g_rgrgcbAlignment Og_rgrgcbAlignment
+#define VtValidInVariant OVtValidInVariant
+#define VtValidInVariantArg OVtValidInVariantArg
+#define IsIntegerType OIsIntegerType
+#define ReadTextLine OIsIntegerType
+#define WriteTextString OWriteTextString
+#define WriteTextULong OWriteTextULong
+#define WriteTextSpaces OWriteTextSpaces
+#define GetTimeStamp OGetTimeStamp
+#define LibIdFromDocItem OLibIdFromDocItem
+#define LibIdFromPath OLibIdFromPath
+#define SzLibIdLocalTypeIdOfTypeId OSzLibIdLocalTypeIdOfTypeId
+#define SzTypeIdHmemberOfFunctionId OSzTypeIdHmemberOfFunctionId
+#define SplitLocalTypeId OSplitLocalTypeId
+#define MakeEmbeddedTypeId OMakeEmbeddedTypeId
+#define IsTypeMembersEqual OIsTypeMembersEqual
+#define IsSimpleType OIsSimpleType
+#define GetDllEntryOfDynInfo OGetDllEntryOfDynInfo
+#define GetDllEntryOfDataInfo OGetDllEntryOfDataInfo
+#define HashSz OHashSz
+#define HashSzTerm OHashSzTerm
+#define Countd OCountd
+#define RegisterErrorOfHdefn ORegisterErrorOfHdefn
+#define GetLStrOfHChunk OGetLStrOfHChunk
+#define GetLStrOfHsz OGetLStrOfHsz
+#define GetExecutingProject OGetExecutingProject
+#define RoundDownPower2 ORoundDownPower2
+#define GetFunctionIdOfExbind OGetFunctionIdOfExbind
+#define CompareUDTs OCompareUDTs
+#define CompareHimptypes OCompareHimptypes
+#define ConvertString OConvertString
+#define GetRegLibOfLibId OGetRegLibOfLibId
+#define GetTypelibOfLibId OGetTypelibOfLibId
+#define DebShowState ODebShowState
+#define TypeDescOfTypeDefn OTypeDescOfTypeDefn
+#define BstrOfHlnam OBstrOfHlnam
+#define GetTypeKindOfITypeInfo OGetTypeKindOfITypeInfo
+#define InitTypeDesc OInitTypeDesc
+#define InitIdlDesc OInitIdlDesc
+#define InitElemDesc OInitElemDesc
+#define InitVarDesc OInitVarDesc
+#define InitFuncDesc OInitFuncDesc
+#define ClearTypeDesc OClearTypeDesc
+#define ClearIdlDesc OClearIdlDesc
+#define ClearArrayDesc OClearArrayDesc
+#define ClearElemDesc OClearElemDesc
+#define FreeVarDesc OFreeVarDesc
+#define FreeFuncDesc OFreeFuncDesc
+#define FreeTypeDesc OFreeTypeDesc
+#define FreeArrayDesc OFreeArrayDesc
+#define CopyArrayDesc OCopyArrayDesc
+#define CopyTypeDesc OCopyTypeDesc
+#define GetLibIdOfRegLib OGetLibIdOfRegLib
+#define GetLibIdOfTypeLib OGetLibIdOfTypeLib
+#define GetTypeInfoOfTypeId OGetTypeInfoOfTypeId
+#define StringFromGuid OStringFromGuid
+#define GetRegInfoForTypeLib OGetRegInfoForTypeLib
+#define BM_cbSizeBitmap OBM_cbSizeBitmap
+#define BM_cbSizeInitial OBM_cbSizeInitial
+#define VerifyLcid OVerifyLcid
+#define IsEuroLang OIsEuroLang
+#define StrGetNewLcid OStrGetNewLcid
+#define LcStrEqi OLcStrEqi
+#define CopyBstrAInternal OCopyBstrAInternal
+#define QuickSortIndex OQuickSortIndex
+#define SwapElementIndex OSwapElementIndex
+#define MacFileSearch OMacFileSearch
+#define GetPathFromFSSpec OGetPathFromFSSpec
+#define GetFSSpecOfAliasPath OGetFSSpecOfAliasPath
+#define GetPathFromAlias OGetPathFromAlias
+#define GetAliasFromPath OGetAliasFromPath
+#define GetRegisteredPath OGetRegisteredPath
+
+#if !OE_MACPPC
+#define CLSID_GenericTypeLibOLE OCLSID_GenericTypeLibOLE
+#endif
+
+#define IID_TYPEINFO OIID_TYPEINFO
+#define IID_DYNTYPEINFO OIID_DYNTYPEINFO
+#define IID_CDefnTypeComp OIID_CDefnTypeComp
+#define IID_TYPELIB_GEN_DTINFO OIID_TYPELIB_GEN_DTINFO
+#define GetPathEnd OGetPathEnd
+#define IsolateFilename OIsolateFilename
+#define g_rgcbAlignment Og_rgcbAlignment
+#define IsFilenameEqual OIsFilenameEqual
+
+#endif // OE_MAC
+
+
+
+#endif // !TYPELIB_HXX_INCLUDED
diff --git a/private/oleauto/src/typelib/typelib.rc b/private/oleauto/src/typelib/typelib.rc
new file mode 100644
index 000000000..a8122fe51
--- /dev/null
+++ b/private/oleauto/src/typelib/typelib.rc
@@ -0,0 +1,131 @@
+/***
+*typelib.rc - Resource file for typelib.DLL
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file in the resource file for typelib.DLL that is compiled and
+* added to the file. String resources are included in this file
+* via an include statement, since these are automatically generated.
+*
+*Revision History:
+*
+* [01] 24-Feb-93 dougf: Added version information.
+* [00] 04-Jan-93 ilanc: Created --
+*
+*****************************************************************************/
+
+// This includes WINDOWS.H, and all the OB switches, like ID_DEBUG, etc.
+#include "obwin.hxx"
+#include <ver.h>
+
+#include "verstamp.h"
+
+#ifndef OLEMINORVERS
+// win16 typelib.dll for Daytona will require a special build. Oh well.
+#define OLEMINORVERS 02 // assume OLE 2.02
+#endif //!OLEMINORVERS
+
+// for OLE, we want the major version # to be 2
+#undef rmj
+#define rmj 2
+#undef rmm
+#define rmm OLEMINORVERS // want version # to be 2.OLEMINORVERS.xxxx
+// keep 'rup' the same as OB's version number for simplicity
+
+// WARNING: Similar code exists in tlibutil.cxx in the implementation of
+// WARNING: OaBuildVersion -- keep the two versions in ssync!
+
+/* Define the version string with more preprocessor magic */
+#define STRING(x) #x
+#define VERSTRINGX(maj,min,rev) STRING(maj ## . ## min ## . ## rev ## \0)
+#define VERSTRING VERSTRINGX(rmj,rmm,rup)
+
+/* Version information */
+VS_VERSION_INFO VERSIONINFO
+//FILEVERSION rmj,rmm,rup,0
+//PRODUCTVERSION rmj,rmm,rup,0
+
+#if 0
+
+// WARNING: Similar code exists in tlibutil.cxx in the implementation of
+// WARNING: OaBuildVersion -- keep the two versions in ssync!
+
+// Version 2.01.0100.14 (non-dbcs enabled) was shipped with the OLE 2.01 CD
+// Version 2.01.0100.15 (non-dbcs enabled) is to be shipped with Excel 5.0
+// Version 2.01.0100.35 (dbcs enabled) was shipped with Excel 5.0J
+FILEVERSION 2,rmm,0100,0
+PRODUCTVERSION 2,rmm,0100,0
+#else //0
+
+// WARNING: Similar code exists in tlibutil.cxx in the implementation of
+// WARNING: OaBuildVersion -- keep the two versions in ssync!
+
+// Use VBA's verstamp.h to get the file versions for now.
+FILEVERSION 2,rmm,rup,01
+PRODUCTVERSION 2,rmm,rup,01
+#endif //0
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+
+#if 0
+#define BETAFLAG VS_FF_PRERELEASE
+#else //1
+#define BETAFLAG 0L
+#endif //1
+
+#if ID_DEBUG
+FILEFLAGS VS_FF_DEBUG | BETAFLAG
+#else // !ID_DEBUG
+FILEFLAGS BETAFLAG
+#endif // !ID_DEBUG
+
+#if (OLEMINORVERS == 02)
+// re-distributable 16-bit DLL
+FILEOS VOS_DOS_WINDOWS16
+#else
+FILEOS VOS_DOS_WINDOWS32
+// non-re-distributable 16-bit DLL (shipped with the OS)
+#endif
+
+FILETYPE VFT_DLL
+FILESUBTYPE 0
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+#if (OLEMINORVERS == 02)
+// re-distributable 16-bit DLL
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE Automation Type Information Interfaces\0"
+ VALUE "FileVersion", "2.02\0"
+ VALUE "InternalName", "TYPELIB.DLL\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1993-1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.02 for Windows\0"
+ VALUE "ProductVersion", "2.02\0"
+ VALUE "Comments", "Windows OLE DLLs\0"
+#else
+// non-re-distributable 16-bit DLL (shipped with the OS)
+ VALUE "CompanyName", "Microsoft Corporation\0"
+ VALUE "FileDescription", "OLE 2.1 16/32 Interoperability Library\0"
+ VALUE "FileVersion", "2.1\0"
+ VALUE "InternalName", "TYPELIB.DLL\0"
+ VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1993-1995\0"
+ VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
+ VALUE "ProductName", "Microsoft OLE 2.1 16/32 Interoperability for Windows NT\0"
+ VALUE "ProductVersion", "2.1\0"
+ VALUE "Comments", "Windows NT OLE 16/32 Interoperability DLLs\0"
+#endif
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
diff --git a/private/oleauto/src/typelib/types.h b/private/oleauto/src/typelib/types.h
new file mode 100644
index 000000000..4cf71d516
--- /dev/null
+++ b/private/oleauto/src/typelib/types.h
@@ -0,0 +1,342 @@
+/***
+*types.h - Common types used by Silver
+*
+* Copyright (C) 1990, Microsoft Corporation
+*
+*Purpose:
+* This include file defines the basic types used by Silver, and the basic
+* constants. The file is designed to be both C and C++ compatible.
+*
+* Note that types depended upon by externally-released include files
+* should be defined in typesx.h. types.h just defines types referenced
+* by internal source files.
+*
+* Note that this file is included before the compile switches, so
+* it should not contain any conditional compilations.
+*
+*Revision History:
+*
+* 15-AUG-90 petergo: File created.
+* 05-Feb-91 ilanc: Added VOID (wow!!!!)
+* 05-Mar-91 petergo: removed INTRINSIC_KIND, now TDKIND in cltypes.hxx
+* 07-Mar-91 petergo: changed WCHAR to a normal character due
+* to AFX limitations/bugs. Add HCHUNK, HCHUNK_Nil.
+* 12-Mar-91 petergo: re-changed WCHAR; AFX bug fixed.
+* 30-May-91 alanc: use windows type names
+* 06-Jun-91 ilanc: Undef stuff we typedef or redefine.
+* 14-Jun-91 petergo: Added Unicode XCHAR/XSZ
+* 25-Jun-91 petergo: Fix WINDOWS.H handling of WORD.
+* 11-Nov-91 satishc: Added BASIC_TRUE and BASIC_FALSE constants.
+* 15-Nov-91 satishc: Added SINGLE and DOUBLE types
+* 14-Apr-92 martinc: defined BOOL as short for OE_MAC (as in WLM)
+* 01-Jun-92 tomc: moved types depended upon by externally-released
+* headers to typesx.h. types.h defines types used by
+* internal source files.
+* 17-Mar-93 w-jeffc: moved defns of PASCAL, CDECL, etc from typesx.h
+* 23-Mar-93 w-jeffc: added EBCALL
+* 11-Apr-93 kazusy: added DBCS stuff.
+* 30-Apr-93 w-jeffc: added sBOOL
+* 04-Apr-94 jeffrob: Mac/PowerPC support
+*
+*Implementation Notes:
+*
+* In order to coexist peacefully, we must follow the following rules
+* for #include order:
+*
+* 1. First must come all non-Silver #includes
+* 2. Then must come silver.hxx
+* 3. Then comes the Silver include files (in any order)
+*
+* In order to promote 16/32 bit portability, two versions of each
+* data type are defined. The type name without an 's' prefix denotes
+* the efficient version of the type, typically used for locals, formals
+* and return values. The type name with an 's' prefix denotes the
+* short version of the type, typically used as member variables.
+* This applies only to new types, not BOOL, USHORT, etc.
+*
+*******************************************************************************/
+
+#ifndef TYPES_HXX_INCLUDED
+#define TYPES_HXX_INCLUDED
+
+#include "switches.hxx"
+#include "version.hxx"
+
+// OS2DEF.h typedef's BOOL to be unsigned short and we want it to be int.
+// We use #define to textually replace BOOL definitions to int when
+// OS2DEF.h is included. This must be defined before typesx.h is included.
+#ifdef OS2_INCLUDED
+#define BOOL int
+#endif
+
+// do this to pickup up the same definition as used in typesx.h
+#undef FAR
+#define FAR EBFAR
+
+//
+// internal definitions
+//
+
+#if OE_MAC68K
+
+ #define UNALIGNED
+
+#ifdef PASCAL
+ #undef PASCAL
+#endif
+
+ #define PASCAL
+
+ #define CDECL _cdecl
+ #pragma message("CDECL defined to be _cdecl")
+
+ #define EXPORT
+ #define HUGE
+
+ #define ENCALL CDECL
+ #define EXMCALL CDECL
+ #define RTCALL _pascal
+ #define ENTMPLT _pascal
+
+#endif // OE_MAC68K
+
+
+#if OE_MACPPC
+
+ #define UNALIGNED
+
+#ifndef PASCAL
+ #define PASCAL _stdcall
+#endif
+
+#ifndef CDECL
+ #define CDECL _cdecl
+ #pragma message("CDECL defined to be _cdecl")
+#endif
+
+ #define EXPORT
+ #define HUGE
+
+ #define ENCALL _stdcall
+ #define EXMCALL _stdcall
+ #define RTCALL _stdcall
+ #define ENTMPLT _stdcall
+
+#endif // OE_MACPPC
+
+
+#if OE_WIN32
+#ifndef PASCAL
+ #define PASCAL __stdcall
+#endif
+
+#ifndef CDECL
+ #define CDECL __cdecl
+#endif
+
+#ifndef HUGE
+ #define HUGE
+#endif
+
+#ifndef EXPORT
+ #define EXPORT _export
+#endif
+
+#ifndef CALLBACK
+ #define CALLBACK __stdcall
+#endif
+
+ #define ENCALL __stdcall
+ #define EXMCALL __stdcall
+ #define RTCALL __stdcall
+ #define ENTMPLT __stdcall
+
+#ifdef _H2INC
+ // The version we have only understands 1 underscore on the following:
+ #define __stdcall _stdcall
+ #define __cdecl _cdecl
+#endif
+
+#endif // OE_WIN32
+
+
+#if OE_WIN16
+
+ #define UNALIGNED
+
+#ifndef PASCAL
+ #define PASCAL _pascal
+#endif
+
+#ifndef CDECL
+ #define CDECL _cdecl
+#endif
+
+#ifndef HUGE
+ #define HUGE _huge
+#endif
+
+#ifndef EXPORT
+ # define EXPORT _export
+#endif
+
+#ifndef CALLBACK
+ # define CALLBACK FAR PASCAL
+#endif
+
+ #define ENCALL PASCAL
+ #define EXMCALL CDECL
+ #define RTCALL PASCAL
+ #define ENTMPLT PASCAL
+
+#endif
+
+#include "typesx.h"
+
+
+typedef LPVOID * LPLPVOID;
+
+// platform dependent type
+
+typedef float SINGLE; // sng
+typedef double DOUBLE; // dbl
+
+// Synonyms included for compatability with existing code
+//typedef WORD USHORT; // u
+//typedef DWORD ULONG; // ul
+#if OE_WIN32
+typedef char * SZ; // sz
+typedef const char * SZ_CONST; // sz
+#else
+typedef char FAR * SZ; // sz
+typedef const char FAR * SZ_CONST; // sz
+#endif
+
+// Type which is enough size to keep a character.
+typedef unsigned short ACHAR;
+
+// Extended char and string types for Unicode
+#if FV_UNICODE
+typedef unsigned short XCHAR;
+#else // !FV_UNICODE
+typedef char XCHAR;
+#endif //!FV_UNICODE
+#if OE_WIN32
+typedef XCHAR * XSZ;
+typedef const XCHAR * XSZ_CONST;
+#else
+typedef XCHAR FAR * XSZ;
+typedef const XCHAR FAR * XSZ_CONST;
+#endif
+
+typedef unsigned short WCHAR;
+
+typedef XSZ LPSTR;
+typedef XSZ_CONST LPSTR_CONST;
+
+
+/* Fundamental types of Silver. */
+typedef UINT STRID; /* string id; hungarian = strid */
+typedef UINT ERR; /* an error code */
+typedef UINT HCHUNK; /* a memory chunk */
+typedef ULONG HCHUNK32; /* a 32bit memory chunk */
+
+typedef USHORT sSTRID;
+typedef USHORT sERR;
+typedef USHORT sHCHUNK;
+typedef USHORT sTIPERROR;
+typedef USHORT sEBERR;
+typedef USHORT sBOOL;
+typedef ULONG sHCHUNK32;
+
+/* constants that go with these fundemental types */
+#define HCHUNK_Nil (0xFFFF)
+#define HCHUNK32_Nil (0xFFFFFFFF)
+
+// ENUMPAD is used to pad enums in a structure when a
+// 16-bit compiler is used for 32-bit code (hxxtoinc on Mac).
+#ifndef ID_INT_IS_LONG
+#define ENUMPAD(x) // don't pad enums to Long
+#endif
+
+/* By default everything is far. If you want near stuff on a Intel 16-bit
+ * processor, then the following are used.
+ */
+#if HP_16BIT
+
+#define NEARCODE near
+#define NEARDATA near
+
+#else /* !HP_16BITS */
+
+#define NEARCODE
+#define NEARDATA
+
+#endif /* !HP_16BITS */
+
+#if EI_VBARUN_VB && HP_16BIT
+ #define FARDATA_EXE far
+#else
+ #define FARDATA_EXE
+#endif
+
+
+#include "segnames.h"
+
+
+/* The BASIC boolean constants. Only BASIC_TRUE is different, but I added
+ BASIC_FALSE for uniformity */
+
+#define BASIC_TRUE -1
+
+#define BASIC_FALSE 0
+
+
+#if OE_MAC
+#define huge
+#define _far
+#endif
+
+/* This should be identical to the definition of HOSTCALLBACK in typesx.h,
+ * except that the EXPORT keyword is removed.
+ */
+#undef HOSTCALLBACK
+#undef EBAPI
+#undef EBCALL
+
+#if OE_MAC68K
+ #define HOSTCALLBACK _cdecl
+ #define EBCALL _pascal
+ #define EBAPI _cdecl
+
+#elif OE_MACPPC
+ #define HOSTCALLBACK
+ #define EBCALL
+ #define EBAPI
+
+#elif OE_WIN16
+ #define HOSTCALLBACK _far _cdecl
+ #define EBCALL _pascal
+ #define EBAPI _far _pascal _export
+
+#elif OE_WIN32
+ #define HOSTCALLBACK __stdcall
+ #define EBCALL __stdcall
+ #define EBAPI __stdcall
+
+#endif // OE_WIN32
+
+
+#ifndef _INC_WINDOWS
+ typedef DWORD COLORREF;
+#endif
+
+// this defines a macro which on Win32 builds gives UNICODE string literals
+// and character literals, but on Win16 and Mac, gives ANSI literals
+#if OE_WIN32
+#define WIDE(x) L##x
+#else //!OE_WIN32
+#define WIDE(x) x
+#endif //!OE_WIN32
+
+#endif /* !TYPES_HXX_INCLUDED */
diff --git a/private/oleauto/src/typelib/typesx.h b/private/oleauto/src/typelib/typesx.h
new file mode 100644
index 000000000..1f19a0d70
--- /dev/null
+++ b/private/oleauto/src/typelib/typesx.h
@@ -0,0 +1,190 @@
+/***
+*typesx.h - Public common types used by Silver
+*
+* Copyright (C) 1992, Microsoft Corporation
+*
+*Purpose:
+* This include file defines the basic types used by Silver,
+* that are referenced by header files that are released to
+* other groups.
+* The file is designed to be both C and C++ compatible.
+*
+* It depends on the switches documented in switches.h
+*
+*Revision History:
+*
+* 29-Apr-92 tomc: File created.
+* 17-Mar-93 w-jeffc: removed all references to PASCAL, FAR, CDECL, etc
+* 23-Mar-93 w-jeffc: added EBCALL
+*
+*******************************************************************************/
+
+#ifndef TYPESX_H_INCLUDED
+#define TYPESX_H_INCLUDED
+
+#if OE_WIN16
+ #define EBFAR _far
+#else
+ #define EBFAR
+#endif
+
+// Host* function calling convention
+#undef HOSTCALLBACK
+#undef EBAPI
+#undef EBLIBAPI
+#undef EBCALL
+
+
+#if OE_MAC68K
+ #define HOSTCALLBACK _cdecl
+ #define EBCALL _pascal
+ #define EBAPI _cdecl
+ #define EBLIBAPI _cdecl
+
+#elif OE_MACPPC
+ #define HOSTCALLBACK
+ #define EBCALL
+ #define EBAPI
+ #define EBLIBAPI
+
+#elif OE_WIN16
+ #define HOSTCALLBACK _far _cdecl _export
+ #define EBCALL _pascal _export
+ #define EBAPI _far _pascal
+ #define EBLIBAPI _cdecl
+
+#elif OE_WIN32
+ #define HOSTCALLBACK __stdcall
+ #define EBCALL __stdcall
+ #define EBAPI __stdcall
+ #define EBLIBAPI __stdcall
+
+#endif // OE_WIN32
+
+
+// INT is needed due to hxxtoinc dependency inside windows decl section.
+// UINT is needed for 16-bit tools to build 32-bit targets.
+#ifndef ID_INT_IS_LONG
+#ifndef _H2INC
+ #undef INT
+ typedef int INT; // n
+#else
+#ifndef INT
+ #define INT int // INT is reserved in MASM
+#endif
+#if !HP_16BIT
+ // NOTE!: the following definitions are here to allow a 16bit
+ // hosted h2inc to generate correct offsets for a 32bit target.
+ #define ID_INT_IS_LONG
+ typedef unsigned long UINT; // un
+#endif
+#endif
+#endif
+
+#if OE_WIN32
+# ifdef _WINDOWS_
+# define _INC_WINDOWS
+# endif
+#endif
+
+#ifndef _INC_WINDOWS
+ // Standard types defined by windows.
+
+ #define VOID void
+
+ typedef VOID EBFAR * LPVOID;
+ typedef int EBFAR * LPINT; // pn
+ typedef long LONG; // l
+ typedef LONG EBFAR * LPLONG; // ul
+ typedef unsigned char BYTE; // b
+ typedef BYTE EBFAR * LPBYTE; // pb
+ typedef char EBFAR * LPSTR; // sz
+ typedef const char EBFAR * LPCSTR; // sz
+ typedef unsigned short WORD; // w
+ typedef WORD EBFAR * LPWORD; // pw
+ typedef unsigned long DWORD; // dw
+ typedef DWORD EBFAR * LPDWORD; // pdw
+#ifndef ID_INT_IS_LONG
+ typedef unsigned int UINT; // un
+#endif
+
+#if OE_WIN32
+ typedef VOID * HANDLE; // h
+#endif
+
+#if OE_WIN16
+ typedef UINT HANDLE; // h
+#endif
+
+#if OE_WIN
+ typedef HANDLE HDC; // hdc
+#endif
+
+#if OE_WIN
+ typedef HANDLE HCURSOR; // hcrs
+ typedef HANDLE HFONT; // hfont
+ typedef HANDLE HBRUSH; // hbr
+ typedef HANDLE HINSTANCE; // hInst
+ typedef UINT WPARAM; // wparam
+ typedef long LPARAM; // lparam
+#endif
+
+
+#ifndef BOOL
+ // WLM wants this signed, hxxtoinc cannot use 'int'.
+ typedef INT BOOL;
+#endif
+
+#if OE_WIN16
+ typedef unsigned int HWND;
+#endif
+
+#if OE_WIN32
+ typedef HANDLE HWND;
+#endif
+
+#if OE_MAC
+ // leave HWND undefined. This is picked up in macport.hxx (defined as WindowPtr)
+#endif
+
+ typedef BOOL EBFAR * LPBOOL; // pf, pis, pwas, pcan
+
+#endif // _INC_WINDOWS
+
+
+ // Types not defined by Windows:
+#undef CHAR
+typedef char CHAR; // ch
+typedef CHAR EBFAR * LPCHAR; // pch
+
+#undef SHORT
+typedef short SHORT; // s
+typedef SHORT EBFAR * LPSHORT; // ps
+
+typedef WORD USHORT; // u
+typedef DWORD ULONG; // ul
+
+typedef UINT EBFAR * LPUINT; // pun
+
+#undef NULL
+#define NULL 0
+
+#undef TRUE
+#define TRUE 1
+
+#undef FALSE
+#define FALSE 0
+
+#define TIPERROR HRESULT
+#define EBERR HRESULT
+
+// Types defined by OLE.
+#ifndef _OLE2_H_
+typedef long SCODE;
+#endif // _OLE2_H_
+
+#define VTABLE_EXPORT
+#define VTABLE_IMPORT
+
+
+#endif //TYPESX_H_INCLUDED
diff --git a/private/oleauto/src/typelib/validate.h b/private/oleauto/src/typelib/validate.h
new file mode 100644
index 000000000..602325a54
--- /dev/null
+++ b/private/oleauto/src/typelib/validate.h
@@ -0,0 +1,71 @@
+/***
+*validate.h
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Some pointer/interface validation routines.
+*
+*Revision History:
+*
+* [00] 23-Mar-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef VALIDATE_H_INCLUDED
+#define VALIDATE_H_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BOOL FIsBadReadPtr(const void FAR* pv, UINT cb);
+BOOL FIsBadWritePtr(void FAR* pv, UINT cb);
+BOOL FIsBadCodePtr(void FAR* pv);
+BOOL FIsBadStringPtr(void FAR* psz, UINT cchMax);
+BOOL FIsBadInterface(void FAR* pv, UINT cMethods);
+
+HRESULT __inline
+ValidateReadPtr(const void FAR* pv, UINT cb)
+{
+ return FIsBadReadPtr(pv, cb)
+ ? HresultOfScode(E_INVALIDARG) : NOERROR;
+}
+
+HRESULT __inline
+ValidateWritePtr(void FAR* pv, UINT cb)
+{
+ return FIsBadWritePtr(pv, cb)
+ ? HresultOfScode(E_INVALIDARG) : NOERROR;
+}
+
+HRESULT __inline
+ValidateCodePtr(void FAR* pv)
+{
+ return FIsBadCodePtr(pv)
+ ? HresultOfScode(E_INVALIDARG) : NOERROR;
+}
+
+HRESULT __inline
+ValidateStringPtr(void FAR* pv, UINT cchMax)
+{
+ return FIsBadStringPtr(pv, cchMax)
+ ? HresultOfScode(E_INVALIDARG) : NOERROR;
+}
+
+HRESULT __inline
+ValidateInterface(void FAR* pv, UINT cMethods)
+{
+ return FIsBadInterface(pv, cMethods)
+ ? HresultOfScode(E_INVALIDARG) : NOERROR;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VALIDATE_H_INCLUDED
+
diff --git a/private/oleauto/src/typelib/version.hxx b/private/oleauto/src/typelib/version.hxx
new file mode 100644
index 000000000..94a5a5f8d
--- /dev/null
+++ b/private/oleauto/src/typelib/version.hxx
@@ -0,0 +1,67 @@
+/***
+*version.hxx - Local overriding of switches
+*
+* Copyright (C) 1990, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is included immediately after switches.h.
+* This file is a hand assembled collection of all version.hxxs.
+* ID_DEBUG was taken out from this file and should be passed on CL
+* command line to the compiler.
+*
+*Revision History:
+*
+* [00] 02-Aug-94 t-issacl: Created
+*
+*****************************************************************************/
+
+#ifndef VERSION_HXX_INCLUDED
+#define VERSION_HXX_INCLUDED
+
+#define BLD_FEVER 1
+
+#ifdef WIN16
+#define BLD_WIN16 1
+#endif
+
+#if defined (WIN16) && !ID_DEBUG
+// special case for rwin16
+// don't include these #pragmas when running RC
+#ifndef RC_INVOKED
+#pragma message ("rwin16 building with inline_depth(10)")
+#pragma inline_depth(10)
+#endif //RC_INVOKED
+#endif
+
+
+#ifdef WIN32
+#define BLD_WIN32 1
+#endif
+
+
+#if defined (_MIPS_) || defined (_ALPHA_) || defined (_PPC_)
+#define OE_RISC 1
+#endif //DWIN32 mips
+
+
+#ifdef MACPPC
+#define BLD_MAC 1
+#define OE_RISC 1
+#define HE_WIN32 1 // Host is Win32
+#define USESROUTINEDESCRIPTORS 1 // For PPC routine descriptors
+
+// PowerPC currently uses the same yahu tool to convert MPW headers.
+#define __sysapi
+#define pascal _stdcall
+#define _pascal _stdcall
+#define __pascal _stdcall
+#endif //MACPPC
+
+
+#ifdef MAC
+#define BLD_MAC 1
+#endif //MAC
+
+
+#endif
diff --git a/private/oleauto/src/typelib/wep.c b/private/oleauto/src/typelib/wep.c
new file mode 100644
index 000000000..b8c40150f
--- /dev/null
+++ b/private/oleauto/src/typelib/wep.c
@@ -0,0 +1,144 @@
+/***
+*wep.c - Generic DLL termination code.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Contains the initialization and termination functions.
+* This is linked with DLLs (e.g. tls.dll and bind.dll) that don't
+* need to take any action at DLL termination time. It is included
+* simply to keep debug versions of windows from complaining that
+* a WEP entry point cannot be found.
+*
+*Revision History:
+*
+* [00] 24-Jun-92 tomc: Created.
+*
+*****************************************************************************/
+
+#include "switches.hxx"
+#if OE_WIN32
+#include "silver.hxx"
+#else
+#include "version.hxx"
+#include "types.h"
+#endif
+#include <stdlib.h> // for size_t
+#include "mbstring.h"
+
+
+/***
+*LibMain - Main entrypoint into TYPELIB.DLL
+*Purpose:
+* Called just before DLL is unloaded.
+*
+*Entry:
+* hinst - instance of the DLL
+* wDataSeg - value of the DS register
+* cbHeapSize - heap size as specified in the .DEF file
+* lpszCmdLine - ptr to command-line information
+*
+*Exit:
+* returns 1 to indicate success.
+*
+*Notes:
+*
+******************************************************************************/
+int PASCAL __export LibMain(HANDLE hinst, WORD wDataSeg, WORD cbHeapSize,
+ LPSTR lpszCmdLine)
+{
+ InitMbString();
+
+ return 1;
+}
+
+
+/***
+*WEP - Windows Exit Procedure
+*Purpose:
+* Called just before DLL is unloaded.
+*
+*Entry:
+* nExitType- Specifies whether all of Windows is shutting down or only the
+* individual library. This parameter can be either WEP_FREE_DLL or
+* WEP_SYSTEM_EXIT.
+*
+*Exit:
+* returns 1 to indicate success.
+*
+*Notes:
+*
+* UNDONE: Ensure this function is in a FIXED segment.
+*
+* For Windows version 3.1, WEP is called on the stack of the application that
+* is terminating. This enables WEP to call Windows functions. In Windows
+* version 3.0, however, WEP is called on a KERNEL stack that is too small to
+* process most calls to Windows functions. These calls, including calls to
+* global-memory functions, should be avoided in a WEP function for Windows
+* 3.0. Calls to MS-DOS functions go through a KERNEL intercept and can also
+* overflow the stack in Windows 3.0. There is no general reason to free memory
+* from the global heap in a WEP function, because the kernel frees this kind
+* of memory automatically.
+*
+* In some low-memory conditions, WEP can be called before the library
+* initialization function is called and before the library's DGROUP
+* data-segment group has been created. A WEP function that relies on the
+* library initialization function should verify that the initialization
+* function has been called. Also, WEP functions that rely on the validity of
+* DGROUP should check for this. The following procedure is recommended for
+* dynamic-link libraries in Windows 3.0; for Windows 3.1, only step 3 is
+* necessary.
+*
+* 1 Verify that the data segment is present by using a lar instruction and
+* checking the present bit. This will indicate whether DS has been loaded.
+* (The DS register always contains a valid selector.)
+*
+* 2 Set a flag in the data segment when the library initialization is
+* performed. Once the WEP function has verified that the data segment
+* exists, it should test this flag to determine whether initialization has
+* occurred.
+*
+* 3 Declare WEP in the EXPORTS section of the module-definition file for the
+* DLL. Following is an example declaration:
+*
+* WEP @1 RESIDENTNAME
+*
+* The keyword RESIDENTNAME makes the name of the function (WEP) resident at
+* all times. (It is not necessary to use the ordinal reference 1.) The name
+* listed in the LIBRARY statement of the module-definition file must be in
+* uppercase letters and must match the name of the DLL file.
+*
+* Windows calls the WEP function by name when it is ready to remove the DLL.
+* Under low-memory conditions, it is possible for the DLL's nonresident-name
+* table to be discarded from memory. If this occurs, Windows must load the
+* table to determine whether a WEP function was declared for the DLL. Under
+* low-memory conditions, this method could fail, causing a fatal exit. Using
+* the RESIDENTNAME option forces Windows to keep the name entry for WEP in
+* memory whenever the DLL is in use.
+*
+* In Windows 3.0, WEP must be placed in a fixed code segment. If it is placed
+* instead in a discardable segment, under low-memory conditions Windows must
+* load the WEP segment from disk so that the WEP function can be called before
+* the DLL is discarded. Under certain low-memory conditions, attempting to
+* load the segment containing WEP can cause a fatal exit. When WEP is in a
+* fixed segment, this situation cannot occur. (Because fixed DLL code is also
+* page-locked, you should minimize the amount of fixed code.)
+*
+* If a DLL is explicitly loaded by calling the LoadLibrary function, its WEP
+* function is called when the DLL is freed by a call to the FreeLibrary
+* function. (The FreeLibrary function should not be called from within a WEP
+* function.) If the DLL is implicitly loaded, WEP is also called, but some
+* debugging applications will indicate that the application has been
+* terminated before WEP is called.
+*
+* The WEP functions of dependent DLLs can be called in any order. This order
+* depends on the order in which the usage counts for the DLLs reach zero.
+*
+******************************************************************************/
+#pragma optimize("q",off)
+
+int PASCAL _WEP(int nExitType)
+{
+ return 1;
+}
diff --git a/private/oleauto/src/typelib/xstring.h b/private/oleauto/src/typelib/xstring.h
new file mode 100644
index 000000000..c303f9101
--- /dev/null
+++ b/private/oleauto/src/typelib/xstring.h
@@ -0,0 +1,60 @@
+/***
+*xstring.h - Multi-byte/Unicode string handling stub.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is a an include file containing macros and declarations
+* defining string handling functions so we can build SBCS/Kanji/Unicode
+* versions from the same source.
+*
+*Revision History:
+*
+* [00] 14-Jun-91 petergo: Created.
+* [01] 27-Feb-93 kazusy: Added DBCS version.
+* move non standard function to xutil.h
+*
+*Implementation Notes:
+* See \silver\doc\codestd\codestd.doc for info on these.
+* See the International handbook for background info.
+*
+*****************************************************************************/
+
+#ifndef XSTRING_H_INCLUDED
+#define XSTRING_H_INCLUDED
+
+#include <string.h>
+#include "mbstring.h" //[01]
+#include <stdlib.h>
+
+#if FV_UNICODE
+#error UNICODE support not available!
+#endif // FV_UNICODE
+
+
+#define xstrcpy(d,s) (char *)strcpy( (char *)(d), (const char *)(s) )
+#define xstrcat(d,s) (char *)strcat( (char *)(d), (const char *)(s) )
+#define xstrchr(p,c) (char *)_mbschr( (const unsigned char *)(p), c)
+#define xstrrchr(p,c) (char *)_mbsrchr( (const unsigned char *)(p), c)
+#define xstrcmp(s1,s2) _mbscmp( (const unsigned char *)(s1), (const unsigned char *)(s2) )
+
+#define xstrlen strlen
+#define xstrclen(s) _mbslen( (const unsigned char *)(s) ) // character length
+#define xstrblen strlen // byte length
+#define xstrblen0(s) (strlen(s)+1) // byte length w/ terminator
+#define xstrncpy(d,s,c) (char *)_mbsnbcpy( (unsigned char *)(d), (const unsigned char *)(s), c )
+#define xstrncmp(s1,s2,c) _mbsncmp( (const unsigned char *)(s1), (const unsigned char *)(s2), c )
+
+#define xstricmp(s1,s2) _mbsicmp( (const unsigned char *)(s1), (const unsigned char *)(s2) )
+
+#define xtoupper toupper
+#define xtolower tolower
+#define xstrupr strupr
+
+#define xatoi atoi
+#define xltoa ltoa // not DBCS-dependent
+#define xitoa itoa // not DBCS-dependent
+
+
+#endif // XSTRING_H_INCLUDED
diff --git a/private/oleauto/src/typelib/xutil.h b/private/oleauto/src/typelib/xutil.h
new file mode 100644
index 000000000..499e1f363
--- /dev/null
+++ b/private/oleauto/src/typelib/xutil.h
@@ -0,0 +1,196 @@
+/***
+*xutil.h - Multi-byte/Unicode string handling stub.
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is a an include file containing macros and declarations
+* defining string handling functions so we can build SBCS/MBCS/Unicode
+* versions from the same source.
+*
+*Revision History:
+*
+* [01] 08-Mar-93 kazusy: Created.
+*
+*Implementation Notes:
+* See \silver\doc\codestd\codestd.doc for info on these.
+* See the International handbook for background info.
+*
+*****************************************************************************/
+
+#ifndef XUTIL_H_INCLUDED
+#define XUTIL_H_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+extern char g_rgchLeadByteTable[256]; // defined in mbstring.c
+#define xislead(c) g_rgchLeadByteTable[(BYTE)c]
+
+
+/****************************************************************************
+* xgetc - DBCS version
+*
+* Returns a character from a string. If the character is composed of a DBCS
+* lead byte followed by '\0' (an illegal character), '\0' is returned.
+*
+****************************************************************************/
+unsigned short __inline xgetc(char *p)
+{
+ unsigned short c;
+
+ if (xislead((unsigned char)(c = (*(unsigned char*)p++)))) {
+ if (*p == '\0') {
+ c = '\0';
+ } else {
+ c *= 256;
+ c += (unsigned short)*(unsigned char *)p;
+ }
+ }
+ return c;
+}
+
+/****************************************************************************
+* xgetincc - DBCS version
+*
+* Returns a character from a string and updates the string pointer to the
+* start of the next character.. If the character is composed of a DBCS
+* lead byte followed by '\0' (an illegal character), '\0' is returned and the
+* string pointer points to the '\0' byte.
+*
+****************************************************************************/
+unsigned short __inline xgetincc(unsigned char **p)
+{
+ unsigned char *q = *p;
+ unsigned short c = 0;
+
+ if (xislead((unsigned char)(c = *q++))) {
+ if (*q == '\0') {
+ c = '\0';
+ } else {
+ c *= 256;
+ c += (unsigned short)*q++;
+ }
+ }
+ *p = q;
+ return c;
+}
+
+/****************************************************************************
+* xputc - DBCS version
+*
+* Writes a character into a string without moving the string pointer.
+* Note that no checking is done to verify that the high byte of the character
+* is a valid lead byte: if the character has a high byte, then two bytes are
+* written. If the character has a high byte==0, then one byte is written.
+*
+****************************************************************************/
+void __inline xputc(unsigned char *p, unsigned short c)
+{
+ if (c >= 256)
+ *p++ = (unsigned char)(c >> 8);
+ *p = (unsigned char)c;
+}
+
+/****************************************************************************
+* xputincc - DBCS version
+*
+* Writes a character into a string and moves the string pointer to the
+* byte following the character just written. Note that no checking is done
+* to verify that the high byte of the character is a valid lead byte: if
+* the character has a high byte, then two bytes are written. If the
+* character has a high byte==0, then one byte is written.
+*
+****************************************************************************/
+void __inline xputincc(unsigned char **p, unsigned short c)
+{
+ unsigned char *q = *p;
+
+ if (c >= 256)
+ *q++ = (unsigned char)(c >> 8);
+ *q++ = (unsigned char)c;
+ *p = q;
+}
+
+/****************************************************************************
+* xincc - DBCS version
+*
+* Moves the string pointer to the beginning of the next character. If the
+* character is compose of a DBCS lead byte followed by a '\0', move the
+* pointer so that it points at the '\0', not the byte beyond the end of
+* the string.
+*
+****************************************************************************/
+void __inline xincc(unsigned char **p)
+{
+ unsigned char *q = *p;
+
+ if (xislead(*q) && *q++ == '\0')
+ q--;
+ q++;
+ *p = q;
+}
+
+/****************************************************************************
+* xsizc - DBCS version
+*
+* Returns the size of a character in bytes.
+*
+****************************************************************************/
+#define xsizc(c) ( (unsigned short)(c) >= 256 ? 2 : 1 )
+
+/***
+* xstrinc - DBCS version
+*
+* Returns a pointer to the next character in a string.
+********************************************************************/
+#define xstrinc(p) (xislead(*p) ? p+2 : p+1)
+
+/****
+* xstrdec(s,p)
+*
+* Returns a pointer to a previous character in a string
+***********************************************************************/
+#if !OE_WIN32
+XCHAR *xstrdec(XCHAR *pxchStart,XCHAR *pxch);
+#endif
+
+/***
+*XCHAR *PxchFindPrevCharOrBeginOfChar(XSZ xszStart, XCHAR *pxchCur)
+*Purpose:
+* This finds the first character in the string xszStart which
+* begins at an address lower than pxchCur. This is used
+* to move backwards in a string possibly containing double
+* byte characters.
+*
+* Unlike xstrdec, this may be called in the case where
+* pxchCur may point into the middle of a character. (If
+* pxchCur does happen to point into the middle of a character,
+* then this returns a pointer to the beginning of that character.
+* (Hence the long name for this function.))
+*
+* If you are sure that pxchCur doesn't point into the middle
+* of a double byte character, you should call xstrdec.
+*
+***********************************************************************/
+#if 0
+XCHAR *PxchFindPrevCharOrBeginOfChar(XCHAR *pxchFirst, XCHAR *pxchCur);
+#endif
+
+
+
+/***
+* xpch - DBCS and non-DBCS
+* // CONSIDER - replace uses of xpch with xgetc
+***********************************************************************/
+#define xpch(p) xgetc(p)
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // XUTIL_H_INCLUDED
diff --git a/private/oleauto/tests/build16.bat b/private/oleauto/tests/build16.bat
new file mode 100644
index 000000000..ec8369cfc
--- /dev/null
+++ b/private/oleauto/tests/build16.bat
@@ -0,0 +1,5 @@
+setlocal
+set NMAKEDIR=%vbatools%\%host%\bin
+if not '%_NTBINDIR%' == '' set NMAKEDIR=%_NTBINDIR%\mstools
+%NMAKEDIR%\nmake CPU=i386 dev=win16 KIND=D
+endlocal
diff --git a/private/oleauto/tests/build32.bat b/private/oleauto/tests/build32.bat
new file mode 100644
index 000000000..a4315bd92
--- /dev/null
+++ b/private/oleauto/tests/build32.bat
@@ -0,0 +1,15 @@
+@setlocal
+set OA_CPU=i386
+if '%HOST%' == 'WIN32' goto copy
+
+set OA_CPU=%HOST%
+
+:copy
+set NMAKEDIR=%vbatools%\%host%\bin
+if not '%_NTBINDIR%' == '' set NMAKEDIR=%_NTBINDIR%\mstools
+%NMAKEDIR%\nmake CPU=%OA_CPU% dev=win32 UNICODE=2 KIND=D %1 %2 %3
+:goto done
+
+:done
+@endlocal
+@ECHO DONE
diff --git a/private/oleauto/tests/common/assert.cpp b/private/oleauto/tests/common/assert.cpp
new file mode 100644
index 000000000..083540d45
--- /dev/null
+++ b/private/oleauto/tests/common/assert.cpp
@@ -0,0 +1,131 @@
+/***
+*assert.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Internal assertion support.
+*
+*Revision History:
+*
+* [00] 22-May-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+// Disable Unicode expansion for assertions
+#if defined(WIN32)
+ #undef UNICODE
+#endif
+
+#include "common.h"
+#include "assrtdlg.h"
+
+#include <stdio.h> /* sprintf */
+
+
+#ifdef _DEBUG /* { */
+
+#ifndef _MAC /* { */
+
+
+extern HINSTANCE g_hinst;
+
+LPSTR g_szLoc;
+LPSTR g_szMsg;
+
+BOOL EXPORT FAR PASCAL
+AssertDlgProc(
+ HWND hdlg,
+ WORD message,
+ WORD wParam,
+ LONG lParam)
+{
+ switch (message){
+ case WM_INITDIALOG:
+ SetDlgItemText(hdlg, ASSERT_ID_LOC, g_szLoc);
+ if(g_szMsg)
+ SetDlgItemText(hdlg, ASSERT_ID_MSG, g_szMsg);
+ break;
+
+ case WM_COMMAND:
+ switch(wParam){
+ case ASSERT_ID_BREAK:
+ case ASSERT_ID_EXIT:
+ case ASSERT_ID_IGNORE:
+ EndDialog(hdlg, wParam);
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+#endif /* } */
+
+#endif /* } */
+
+STDAPI_(void)
+DispAssert(
+ char FAR* szMsg,
+ char FAR* szFileName,
+ int line)
+{
+#ifdef _DEBUG /* { */
+
+ char rgchBuf[200];
+ char rgchLoc[200];
+
+#ifdef _MAC /* { */
+
+ sprintf(rgchLoc, "File %s, line %d", szFileName, line);
+ rgchBuf[0] = sprintf(
+ rgchBuf+1, "Assertion failed: %s %s\n",
+ rgchLoc, szMsg == NULL ? "" : szMsg);
+ --rgchBuf[0]; // kill the cr in string
+ DebugStr((const unsigned char FAR*)rgchBuf);
+
+#else /* }{ */
+
+ int i;
+ FARPROC pfnAssertDlgProc;
+
+ pfnAssertDlgProc = MakeProcInstance((FARPROC)AssertDlgProc, g_hinst);
+ wsprintf(rgchBuf, "Assertion failed: ");
+ wsprintf(rgchLoc, "File %s, line %d", szFileName, line);
+
+ OutputDebugString(rgchBuf);
+ OutputDebugString(rgchLoc);
+ if(szMsg){
+ OutputDebugString("\r\n");
+ OutputDebugString(szMsg);
+ }
+ OutputDebugString("\r\n");
+
+ g_szMsg = szMsg;
+ g_szLoc = rgchLoc;
+
+#ifdef WIN32 // required by new Daytona headers
+ i = DialogBox(g_hinst, "AssertFailDlg", NULL, (DLGPROC)pfnAssertDlgProc);
+#else //WIN32
+ i = DialogBox(g_hinst, "AssertFailDlg", NULL, pfnAssertDlgProc);
+#endif //WIN32
+ FreeProcInstance(pfnAssertDlgProc);
+
+ switch(i){
+ case ASSERT_ID_BREAK:
+ DebugBreak();
+ break;
+ case ASSERT_ID_EXIT:
+ CoFreeAllLibraries();
+ FatalAppExit(0, "Assertion failure");
+ break;
+ }
+
+#endif /* } */
+#endif /* } */
+}
+
diff --git a/private/oleauto/tests/common/assert.dlg b/private/oleauto/tests/common/assert.dlg
new file mode 100644
index 000000000..d520400ee
--- /dev/null
+++ b/private/oleauto/tests/common/assert.dlg
@@ -0,0 +1,13 @@
+#include "assrtdlg.h"
+
+ASSERTFAILDLG DIALOG 72, 32, 260, 67
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "Assertion failure!"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CTEXT "", ASSERT_ID_LOC, 11, 15, 240, 8
+ CTEXT "", ASSERT_ID_MSG, 11, 28, 240, 8
+ PUSHBUTTON "&Break", ASSERT_ID_BREAK, 54, 47, 40, 14
+ PUSHBUTTON "E&xit", ASSERT_ID_EXIT, 110, 47, 40, 14
+ PUSHBUTTON "&Ignore", ASSERT_ID_IGNORE, 166, 47, 40, 14
+END
diff --git a/private/oleauto/tests/common/assrtdlg.h b/private/oleauto/tests/common/assrtdlg.h
new file mode 100644
index 000000000..4a27b9ba9
--- /dev/null
+++ b/private/oleauto/tests/common/assrtdlg.h
@@ -0,0 +1,11 @@
+#ifndef _ASSRTDLG_H_ /* { */
+#define _ASSRTDLG_H_
+
+#define ASSERT_ID_BREAK 5103
+#define ASSERT_ID_EXIT 5104
+#define ASSERT_ID_IGNORE 5105
+#define ASSERT_ID_LOC 5106
+#define ASSERT_ID_EXPR 5107
+#define ASSERT_ID_MSG 5108
+
+#endif /* } */
diff --git a/private/oleauto/tests/common/cdisp.cpp b/private/oleauto/tests/common/cdisp.cpp
new file mode 100644
index 000000000..4de2424c4
--- /dev/null
+++ b/private/oleauto/tests/common/cdisp.cpp
@@ -0,0 +1,378 @@
+/***
+*cdisp.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements a trivial class that supports IDispatch, and
+* exposes a single property.
+*
+*Revision History:
+*
+* [00] 10-Apr-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "common.h"
+#include "cdisp.h"
+
+
+CDisp::CDisp()
+{
+ m_refs = 0;
+ V_VT(&m_var) = VT_BSTR;
+ V_BSTR(&m_var) = SysAllocString(OLESTR("13.14"));
+}
+
+
+HRESULT
+CDisp::Create(IDispatch FAR* FAR* ppdisp)
+{
+ CDisp FAR* pdisp;
+
+ if((pdisp = new FAR CDisp()) == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+ pdisp->AddRef();
+
+ *ppdisp = (IDispatch FAR*)pdisp;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CDisp::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(!IsEqualIID(riid, IID_IUnknown))
+ if(!IsEqualIID(riid, IID_IDispatch))
+ return ResultFromScode(E_NOINTERFACE);
+
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDisp::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDisp::Release()
+{
+ if(--m_refs == 0){
+ VariantClear(&m_var);
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP
+CDisp::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDisp::GetTypeInfo(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ UNUSED(lcid);
+ UNUSED(itinfo);
+ UNUSED(pptinfo);
+
+ return ResultFromScode(DISP_E_BADINDEX);
+}
+
+STDMETHODIMP
+CDisp::GetIDsOfNames(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ unsigned int u;
+ HRESULT hresult;
+
+ UNUSED(lcid);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ if(cNames == 0)
+ return ResultFromScode(E_INVALIDARG);
+
+ rgdispid[0] =
+ (STRICMP(STRING(rgszNames[0]), TSTR("value")))
+ ? DISPID_UNKNOWN : DISPID_VALUE;
+
+ hresult = NOERROR;
+ if(cNames > 1){
+ hresult = ResultFromScode(DISP_E_UNKNOWNNAME);
+ for(u = 1; u < cNames; ++u)
+ rgdispid[u] = DISPID_UNKNOWN;
+ }
+
+ return hresult;
+}
+
+STDMETHODIMP
+CDisp::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ VARIANT var;
+ unsigned int uArgErr;
+ VARIANT varResult;
+
+ UNUSED(lcid);
+ UNUSED(pexcepinfo);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ if(puArgErr == NULL)
+ puArgErr = &uArgErr;
+ if(pvarResult == NULL)
+ pvarResult = &varResult;
+
+ if(dispidMember == DISPID_VALUE){
+ if(wFlags & DISPATCH_PROPERTYPUT){
+ if(pdispparams->cArgs != 1)
+ return ResultFromScode(DISP_E_BADPARAMCOUNT);
+ IfFailRet(VariantCopyInd(&var, &pdispparams->rgvarg[0]));
+ put_value(var);
+ IfFailRet(VariantClear(&var));
+ return NOERROR;
+ }
+
+ if(wFlags & DISPATCH_PROPERTYGET){
+ if(pdispparams->cArgs != 0)
+ return ResultFromScode(DISP_E_BADPARAMCOUNT);
+ var = get_value();
+ IfFailRet(VariantCopy(pvarResult, &var));
+ IfFailRet(VariantClear(&var));
+ return NOERROR;
+ }
+ }
+
+ return ResultFromScode(DISP_E_MEMBERNOTFOUND);
+}
+
+
+STDMETHODIMP_(void)
+CDisp::put_value(VARIANT var)
+{
+ VariantClear(&m_var);
+ VariantCopy(&m_var, &var);
+}
+
+STDMETHODIMP_(VARIANT)
+CDisp::get_value()
+{
+ VARIANT var;
+
+ VariantInit(&var);
+ VariantCopy(&var, &m_var);
+ return var;
+}
+
+
+
+/***************************************************************/
+/* WIN32 Unicode Support */
+/***************************************************************/
+
+#if OE_WIN32 && 0
+
+CDispW::CDispW()
+{
+ m_refs = 0;
+ V_VT(&m_var) = VT_WBSTR;
+ V_WBSTR(&m_var) = SysAllocStringW(L"13.14");
+}
+
+
+HRESULT
+CDispW::Create(IDispatchW FAR* FAR* ppdisp)
+{
+ CDispW FAR* pdisp;
+
+ if((pdisp = new FAR CDispW()) == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+ pdisp->AddRef();
+
+ *ppdisp = (IDispatchW FAR*)pdisp;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CDispW::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(riid == IID_IUnknown || riid == IID_IDispatchW){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDispW::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDispW::Release()
+{
+ if(--m_refs == 0){
+ VariantClear(&m_var);
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP
+CDispW::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispW::GetTypeInfo(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfoW FAR* FAR* pptinfo)
+{
+ UNUSED(lcid);
+ UNUSED(pptinfo);
+
+ return ResultFromScode(DISP_E_BADINDEX);
+}
+
+STDMETHODIMP
+CDispW::GetIDsOfNames(
+ REFIID riid,
+ WCHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ unsigned int u;
+ HRESULT hresult;
+
+ UNUSED(lcid);
+
+ if(riid != IID_NULL)
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ if(cNames == 0)
+ return ResultFromScode(E_INVALIDARG);
+
+ rgdispid[0] =
+ (lstrcmpW(rgszNames[0], L"value"))
+ ? DISPID_UNKNOWN : DISPID_VALUE;
+
+ hresult = NOERROR;
+ if(cNames > 1){
+ hresult = ResultFromScode(DISP_E_UNKNOWNNAME);
+ for(u = 1; u < cNames; ++u)
+ rgdispid[u] = DISPID_UNKNOWN;
+ }
+
+ return hresult;
+}
+
+STDMETHODIMP
+CDispW::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ WEXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ VARIANT var;
+ unsigned int uArgErr;
+ VARIANT varResult;
+
+ UNUSED(lcid);
+
+ if(riid != IID_NULL)
+ return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
+
+ if(puArgErr == NULL)
+ puArgErr = &uArgErr;
+ if(pvarResult == NULL)
+ pvarResult = &varResult;
+
+ if(dispidMember == DISPID_VALUE){
+ if(wFlags & DISPATCH_PROPERTYPUT){
+ if(pdispparams->cArgs != 1)
+ return ResultFromScode(DISP_E_BADPARAMCOUNT);
+ IfFailRet(VariantCopyInd(&var, &pdispparams->rgvarg[0]));
+ put_value(var);
+ IfFailRet(VariantClear(&var));
+ return NOERROR;
+ }
+
+ if(wFlags & DISPATCH_PROPERTYGET){
+ if(pdispparams->cArgs != 0)
+ return ResultFromScode(DISP_E_BADPARAMCOUNT);
+ var = get_value();
+ IfFailRet(VariantCopy(pvarResult, &var));
+ IfFailRet(VariantClear(&var));
+ return NOERROR;
+ }
+ }
+
+ return ResultFromScode(DISP_E_MEMBERNOTFOUND);
+}
+
+
+STDMETHODIMP_(void)
+CDispW::put_value(VARIANT var)
+{
+ VariantClear(&m_var);
+ VariantCopy(&m_var, &var);
+}
+
+STDMETHODIMP_(VARIANT)
+CDispW::get_value()
+{
+ VARIANT var;
+
+ VariantInit(&var);
+ VariantCopy(&var, &m_var);
+ return var;
+}
+
+#endif
diff --git a/private/oleauto/tests/common/cdisp.h b/private/oleauto/tests/common/cdisp.h
new file mode 100644
index 000000000..34a2913dc
--- /dev/null
+++ b/private/oleauto/tests/common/cdisp.h
@@ -0,0 +1,64 @@
+/***
+*cdisp.h
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Declares a trivial class that implements IDispatch, and has a
+* single value property.
+*
+*Revision History:
+*
+* [00] 10-Apr-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+class CDisp : public IUnknown {
+public:
+ static HRESULT Create(IDispatch FAR* FAR* ppdisp);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo);
+
+ STDMETHOD(GetTypeInfo)(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+
+ // introduced methods
+
+ STDMETHOD_(void, put_value)(VARIANT var);
+ STDMETHOD_(VARIANT, get_value)(void);
+
+ CDisp::CDisp();
+
+private:
+
+ unsigned long m_refs;
+ VARIANT m_var;
+};
+
diff --git a/private/oleauto/tests/common/common.h b/private/oleauto/tests/common/common.h
new file mode 100644
index 000000000..121de2558
--- /dev/null
+++ b/private/oleauto/tests/common/common.h
@@ -0,0 +1,407 @@
+/***
+*common.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definitions that are common to all IDispatch test apps
+*
+*Revision History:
+*
+* [00] 20-Apr-93 bradlo: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#if defined(_MAC)
+
+#if defined(_PPCMAC)
+#define OE_MACPPC 1
+/*
+#pragma data_seg("_FAR_DATA")
+#pragma data_seg( )
+*/
+#define MAXLONG 0x7fffffff
+#define EventHandlerProcPtr AEEventHandlerUPP
+#else //_PPCMAC
+#define GetMenuItemText(mApple,menuItem,daName) GetItem(mApple,menuItem,daName)
+#define OE_MAC68K 0
+#endif //_PPCMAC
+
+#define OE_WIN 0
+#define OE_WIN16 0
+#define OE_WIN32 0
+#define OE_MAC 1
+
+typedef int BOOL;
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned long DWORD;
+
+#define IfWin(X)
+#define IfMac(X) (X)
+
+#ifdef _MSC_VER
+# define HC_MSC 1
+# define HC_MPW 0
+#else
+# define HC_MSC 0
+# define HC_MPW 1
+#endif
+
+#elif defined(WIN32)
+
+#define OE_WIN 1
+#define OE_WIN16 0
+#define OE_WIN32 1
+#define OE_MAC 0
+#define OE_MAC68K 0
+#define OE_MACPPC 0
+
+#define HC_MPW 0
+
+#define IfWin(X)
+#define IfMac(X)
+
+#else
+
+#define OE_WIN 1
+#define OE_WIN16 1
+#define OE_WIN32 0
+#define OE_MAC 0
+#define OE_MAC68K 0
+#define OE_MACPPC 0
+
+#define HC_MPW 0
+
+#define IfWin(X) (X)
+#define IfMac(X)
+
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#if OE_MAC
+# define TRUE 1
+# define FALSE 0
+# if HC_MPW
+# include <values.h>
+# include <types.h>
+# include <quickdraw.h>
+# include <strings.h>
+# include <fonts.h>
+# include <events.h>
+# include <resource.h>
+# include <windows.h>
+# include <menus.h>
+# include <textedit.h>
+# include <dialogs.h>
+# include <toolutils.h>
+# include <memory.h>
+# include <files.h>
+# include <osutils.h>
+# include <scrap.h>
+# include <osevents.h>
+# include <packages.h>
+# include <traps.h>
+# include <desk.h>
+# include <AppleEvents.h>
+//# include <LibraryManager.h>
+# else
+# define __SANE__
+# include <macos/values.h>
+# include <macos/types.h>
+# include <macos/quickdra.h>
+# include <macos/fonts.h>
+# include <macos/events.h>
+# include <macos/resource.h>
+# include <macos/windows.h>
+# include <macos/menus.h>
+# include <macos/textedit.h>
+# include <macos/dialogs.h>
+# include <macos/toolutil.h>
+# include <macos/memory.h>
+# include <macos/files.h>
+# include <macos/osutils.h>
+# include <macos/scrap.h>
+# include <macos/osevents.h>
+# include <macos/packages.h>
+# include <macos/traps.h>
+# include <macos/desk.h>
+# include <macos/appleeve.h>
+# ifndef _PPCMAC
+# include <macos/aslm.h>
+# define pascal _pascal
+# endif
+# define far
+# define FAR far
+# define near
+# define NEAR near
+# define PASCAL pascal
+# define cdecl _cdecl
+# define CDECL cdecl
+# endif
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+#elif OE_WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#else
+# include <windows.h>
+# include <ole2.h>
+# include <olenls.h>
+# include <dispatch.h>
+#endif
+
+#if OE_WIN16
+#pragma intrinsic(memcpy)
+#pragma intrinsic(memcmp)
+#pragma intrinsic(memset)
+#pragma intrinsic(strcpy)
+#pragma intrinsic(_fmemcpy)
+#pragma intrinsic(_fmemcmp)
+#pragma intrinsic(_fmemset)
+#pragma intrinsic(_fstrcpy)
+# define STRLEN _fstrlen
+# define STRCPY _fstrcpy
+# define STRCAT _fstrcat
+# define STRCHR _fstrchr
+# define STRREV _fstrrev
+# define STRUPR _fstrupr
+# define STRCMP _fstrcmp
+# define STRNCMP _fstrncmp
+# define STRSTR _fstrstr
+# define STRTOD strtod
+# define SPRINTF sprintf
+# define TOLOWER tolower
+# define MEMCPY _fmemcpy
+# define MEMCMP _fmemcmp
+# define MEMSET _fmemset
+# define MEMMOVE _fmemmove
+# define STRICMP _fstricmp
+# define OASTR(str) str
+# define SIZEOFCH(x) sizeof(x)
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(x) (x)
+# define WIDESTRING(x) (x)
+#endif
+
+#if OE_WIN32
+# define MEMCPY memcpy
+# define MEMCMP memcmp
+# define MEMSET memset
+# define MEMMOVE memmove
+# define STRLEN lstrlen
+# define STRCPY lstrcpy
+# define STRCAT lstrcat
+# define STRCMP lstrcmp
+# define STRICMP lstrcmpi
+# if defined(UNICODE)
+# define STRSTR wcsstr
+# define STRREV _wcsrev
+# define STRCHR wcschr
+# define STRNCMP wcsncmp
+# define STRTOD wcstod
+# define STRUPR _wcsupr
+# define SPRINTF swprintf
+# define TOLOWER towlower
+# define SIZEOFCH(x) (sizeof(x)/2)
+# define OASTR(str) L##str
+# define TCHAR WCHAR
+# define TSTR(str) L##str
+# define STRING(str) (str)
+# define WIDESTRING(str) (str)
+# else
+# define STRSTR strstr
+# define STRREV _strrev
+# define STRCHR strchr
+# define STRNCMP strncmp
+# define STRTOD strtod
+# define STRUPR _strupr
+# define SPRINTF sprintf
+# define TOLOWER tolower
+# define SIZEOFCH(x) sizeof(x)
+# define OASTR(str) str
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(x) DbAnsiString(x)
+# define WIDESTRING(x) DbWideString(x)
+# endif
+#endif
+
+#if OE_MAC
+# define STRLEN strlen
+# define STRCPY strcpy
+# define STRCAT strcat
+# define STRCHR strchr
+# define STRREV _strrev
+# define STRUPR _strupr
+# define STRCMP strcmp
+# define STRNCMP strncmp
+# define STRSTR strstr
+# define STRTOD strtod
+# define SPRINTF sprintf
+# define TOLOWER tolower
+# define MEMCPY memcpy
+# define MEMCMP memcmp
+# define MEMSET memset
+# define MEMMOVE memmove
+# define SIZEOFCH(x) sizeof(x)
+# define OASTR(str) str
+# define TCHAR char
+# define TSTR(str) str
+# define STRING(x) (x)
+# define WIDESTRING(x) (x)
+# if HC_MPW
+# define STRICMP disp_stricmp
+# else
+# define STRICMP _stricmp
+# endif
+#endif
+
+#if HC_MPW
+# define CDECL_(TYPE) TYPE
+# define PASCAL_(TYPE) pascal TYPE
+# define UNUSED(X) ((void)&(X))
+#else
+# define CDECL_(TYPE) TYPE __cdecl
+# define PASCAL_(TYPE) TYPE __pascal
+# define UNUSED(X) (X)
+#endif
+
+#ifndef NEARDATA
+# if OE_WIN16
+# define NEARDATA __near
+# else
+# define NEARDATA
+# endif
+#endif
+
+#ifndef EXTERN_C
+# ifdef __cplusplus
+# define EXTERN_C extern "C"
+# else
+# define EXTERN_C extern
+# endif
+#endif
+
+#ifdef _DEBUG
+# define LOCAL
+
+STDAPI_(void)
+DispAssert(
+ char FAR* szMsg,
+ char FAR* szFile,
+ int line);
+
+# define ASSERT(X) \
+ if(!(X)){DispAssert(NULL, g_szFileName, __LINE__);}else{}
+# define ASSERTSZ(X, MSG) \
+ if(!(X)){DispAssert( MSG, g_szFileName, __LINE__);}else{}
+# define ASSERTDATA static char g_szFileName[] = __FILE__;
+#else
+# define LOCAL static
+# define ASSERT(X)
+# define ASSERTSZ(X, SZ)
+# define ASSERTDATA
+#endif
+
+#ifndef EXPORT
+# if OE_WIN16
+# define EXPORT __export
+# else
+# define EXPORT
+# endif
+#endif
+
+#define UNREACHED 0
+
+#define MAX(X,Y) (((X) >= (Y)) ? (X) : (Y))
+#define MIN(X,Y) (((X) <= (Y)) ? (X) : (Y))
+
+#define DIM(X) (sizeof(X) / sizeof(X[0]))
+
+#define HRESULT_FAILED(X) ((X) != NOERROR && FAILED(GetScode(X)))
+
+#define IfFailGo(expression, label) \
+ { hresult = (expression); \
+ if(HRESULT_FAILED(hresult)) \
+ goto label; \
+ }
+
+#define IfFailRet(expression) \
+ { HRESULT hresult = (expression); \
+ if(HRESULT_FAILED(hresult)) \
+ return hresult; \
+ }
+
+#define RESULT(X) ResultFromScode(X)
+
+
+// common\disphelp.cpp
+//
+STDAPI CreateObject(OLECHAR FAR* szClassName, IDispatch FAR* FAR* ppdisp);
+
+
+// common\util.cpp
+
+#if HC_MPW
+int _stricmp(char*, char*);
+char *_strupr(char*);
+#endif
+
+STDAPI ErrBstrAlloc(OLECHAR FAR* sz, BSTR FAR* pbstrOut);
+
+// NLS functions
+
+#if !OE_WIN32
+ #ifdef _PPCMAC
+ #undef CompareString
+ #endif
+ #define CompareString CompareStringA
+ #define LCMapString LCMapStringA
+ #define GetLocaleInfo GetLocaleInfoA
+ #define GetStringType GetStringTypeA
+#endif
+
+
+#if OE_WIN32
+
+EXTERN_C char FAR*
+DbAnsiString(OLECHAR FAR* strIn);
+
+EXTERN_C OLECHAR FAR*
+DbWideString(char FAR* strIn);
+
+
+#if 0 // new WIN32 headers define these
+EXTERN_C
+int __stdcall CompareStringA(LCID lcid, DWORD dwFlags,
+ LPSTR lpStr1, int cch1,
+ LPSTR lpStr2, int cch2);
+
+EXTERN_C
+int __stdcall LCMapStringA(LCID, unsigned long, const char FAR*, int, char FAR*, int);
+
+EXTERN_C
+int __stdcall GetLocaleInfoA(LCID, LCTYPE, char FAR*, int);
+
+EXTERN_C
+int __stdcall GetStringTypeA(LCID, unsigned long, const char FAR*, int, unsigned short FAR*);
+#endif //0
+
+#endif
+
+#if OE_WIN32 && defined(__cplusplus)
+
+extern "C" char FAR*
+ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size = 256);
+
+extern "C" OLECHAR FAR*
+ConvertStrAtoW(char FAR* strIn, OLECHAR FAR* buf, UINT size = 256);
+
+#endif
diff --git a/private/oleauto/tests/common/crempoly.cpp b/private/oleauto/tests/common/crempoly.cpp
new file mode 100644
index 000000000..739d3e9cb
--- /dev/null
+++ b/private/oleauto/tests/common/crempoly.cpp
@@ -0,0 +1,610 @@
+/***
+*crempoly.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the implementation of CRemPoly, the remote polygon
+* class. This class presents a standard C++ vtable interface to the
+* rest of the application, and hides the details of talking to the
+* actual remote CPoly class exposed by the SPoly server. Each of
+* the introduced methods is simply a cover for an IDispatch invocation
+* of the actual method on the remote object.
+*
+*Implementation Notes:
+*
+* NOTE: this is a derivative of crempoly.cpp from the sample dispdemo,
+* but has been modified to for use in our test apps. This is no longer
+* a legit sample because it contains references to private definitions
+* from src/dispatch.
+*
+*****************************************************************************/
+
+#include "common.h"
+#include "crempoly.h"
+
+
+// method names on the CPoly class.
+//
+OLECHAR FAR* CRemPoly::m_rgszMethods[] = {
+ OLESTR("draw"),
+ OLESTR("dump"),
+ OLESTR("reset"),
+ OLESTR("addpoint"),
+ OLESTR("enumpoints"),
+ OLESTR("getxorigin"),
+ OLESTR("setxorigin"),
+ OLESTR("getyorigin"),
+ OLESTR("setyorigin"),
+ OLESTR("getwidth"),
+ OLESTR("setwidth"),
+ OLESTR("get_red"),
+ OLESTR("set_red"),
+ OLESTR("get_green"),
+ OLESTR("set_green"),
+ OLESTR("get_blue"),
+ OLESTR("set_blue")
+};
+
+
+CRemPoly::CRemPoly()
+{
+ m_refs = 0;
+ m_pdisp = (IDispatch FAR*)NULL;
+}
+
+
+// A useful pre-initialized DISPATCHPARAMS, used on all the methods that
+// take 0 arguments.
+//
+DISPPARAMS g_dispparamsNoArgs = {NULL, NULL, 0, 0};
+
+
+/***
+*HRESULT CRemPoly::Create(OLECHAR*, CRemPoly**)
+*
+*Purpose:
+* This function creates an instance of the CRemPoly class, connects
+* it to the IDispatch interface of the remote CPoly class, and learns
+* the DISPIDs for the members (that we know about) exposed by that
+* class.
+*
+*Entry:
+* clsid = The CLSID of the CPoly we are to create. (taking this as a
+* param is a bit weird, but allows us to connect to several remote
+* versions.
+*
+*Exit:
+* return value = HRESULT
+*
+* *pprempoly = pointer to the newly created CRemPoly, if successfyl.
+*
+***********************************************************************/
+HRESULT
+CRemPoly::Create(OLECHAR FAR* szProgID, CRemPoly FAR* FAR* pprempoly)
+{
+ int i;
+ HRESULT hresult;
+ CRemPoly FAR* prempoly;
+
+
+ prempoly = new FAR CRemPoly();
+ if(prempoly == (CRemPoly FAR*)NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError;
+ }
+ prempoly->AddRef();
+
+ hresult = CreateObject(szProgID, &prempoly->m_pdisp);
+ if(hresult != NOERROR)
+ goto LFreeCRemPoly;
+
+ // We learn *all* the member IDs up front. A more sophisticated
+ // implementation might defer learning about the IDs for a given
+ // method until the first time the method is invoked, thereby
+ // amortizing the creation costs.
+ //
+ for(i = 0; i < IMETH_CREMPOLY_MAX; ++i){
+ hresult = prempoly->m_pdisp->GetIDsOfNames(
+ IID_NULL,
+ &prempoly->m_rgszMethods[i],
+ 1, LOCALE_SYSTEM_DEFAULT,
+ &prempoly->m_rgdispid[i]);
+ if(hresult != NOERROR)
+ goto LFreeCRemPoly;
+ }
+
+ *pprempoly = prempoly;
+
+ return NOERROR;
+
+
+LFreeCRemPoly:;
+ prempoly->Release();
+
+LError:;
+ return hresult;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown methods
+//---------------------------------------------------------------------
+
+
+/***
+*HRESULT CRemPoly::QueryInterface(REFIID, void**)
+*
+*Purpose:
+* Standard Ole2 implementation of QueryInterface. This class
+* supports the IUnknown interface, and introduces a number of
+* nonvirtual members.
+*
+*Entry:
+* riid = reference to the requested interface id
+*
+*Exit:
+* return value = HRESULT
+* *ppv = pointer to the requested interface, if successful.
+*
+***********************************************************************/
+STDMETHODIMP
+CRemPoly::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+/***
+*unsigned long CRemPoly::AddRef(void)
+*
+*Purpose:
+* Add a reference to the instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long. The resulting reference count.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CRemPoly::AddRef(void)
+{
+ return ++m_refs;
+}
+
+
+/***
+*unsigned long CRemPoly::Release(void)
+*
+*Purpose:
+* Release a reference to the instance. If the reference count goes
+* to zero, delete the instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = unsigned long. The resulting reference count.
+*
+***********************************************************************/
+STDMETHODIMP_(unsigned long)
+CRemPoly::Release(void)
+{
+ if(--m_refs == 0){
+ if(m_pdisp != (IDispatch FAR*)NULL){
+ m_pdisp->Release();
+ }
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// Introduced methods
+//---------------------------------------------------------------------
+
+
+/*
+ * Each of these methods is simply a cover for an IDispatch Invocation
+ * of the actual method on the remote CPoly class. This allows CRemPoly
+ * to present an interface that looks and acts just like the CPoly
+ * object, even though the actual work is being done in another process.
+ *
+ */
+
+/***
+*HRESULT CRemPoly::Draw(void)
+*
+*Purpose:
+* Invoke the Draw method on the remote CPoly instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::Draw()
+{
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_DRAW],
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, NULL, NULL, NULL);
+}
+
+
+/***
+*HRESULT CRemPoly::Dump(void)
+*
+*Purpose:
+* Invoke the Dump() method on the remote CPoly instance. This method
+* dumps the contained CPoints and writes the properties of the remote
+* CPoly instance to the debug window.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::Dump()
+{
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_DUMP],
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, NULL, NULL, NULL);
+}
+
+
+/***
+*HRESULT CRemPoly::Reset(void)
+*
+*Purpose:
+* Invoke the Reset() method on the remote CPoly instance. The Reset()
+* method causes the remote CPoly to release all contained CPoints.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::Reset()
+{
+ return m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_RESET],
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, NULL, NULL, NULL);
+}
+
+
+/***
+*HRESULT CRemPoly::AddPoint(short, short)
+*
+*Purpose:
+* Invoke the AddPoint method in the remote CPoly object to add a
+* new point with the given coordinates to this instance.
+*
+*Entry:
+* x,y = the x and y coordinates of the new point.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::AddPoint(short x, short y)
+{
+ HRESULT hresult;
+ VARIANTARG rgvarg[2];
+ DISPPARAMS dispparams;
+
+
+ V_VT(&rgvarg[0]) = VT_I2;
+ V_I2(&rgvarg[0]) = y;
+ V_VT(&rgvarg[1]) = VT_I2;
+ V_I2(&rgvarg[1]) = x;
+ dispparams.cArgs = 2;
+ dispparams.rgvarg = rgvarg;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+
+ hresult = m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_ADDPOINT],
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &dispparams, NULL, NULL, NULL);
+
+ return hresult;
+}
+
+
+/***
+*HRESULT CRemPoly::EnumPoints(IEnumVARIANT**)
+*Purpose:
+* Inoke the EnumPoints() method in the remote object to
+* get a enumerator for the points contained in the current poly.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppenum = pointer to the point enumerator
+*
+***********************************************************************/
+HRESULT
+CRemPoly::EnumPoints(IEnumVARIANT FAR* FAR* ppenum)
+{
+ HRESULT hresult;
+ IEnumVARIANT FAR* penum;
+ VARIANT varResult, FAR* pvarResult;
+
+
+ pvarResult = &varResult;
+ VariantInit(pvarResult);
+ hresult = m_pdisp->Invoke(
+ m_rgdispid[IMETH_CREMPOLY_ENUMPOINTS],
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs, pvarResult, NULL, NULL);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ if(V_VT(pvarResult) != VT_UNKNOWN)
+ return ResultFromScode(E_FAIL);
+
+ hresult = V_UNKNOWN(pvarResult)->QueryInterface(
+ IID_IEnumVARIANT, (void FAR* FAR*)&penum);
+
+ if(hresult == NOERROR)
+ *ppenum = penum;
+
+ VariantClear(pvarResult);
+
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CRemPoly::GetXOrigin(short*)
+*
+*Purpose:
+* Invoke the GetXOrigin() method on the remote object to extract
+* the current value of the XOrigin property.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pxorg = the current X origin of the polygon.
+*
+***********************************************************************/
+HRESULT
+CRemPoly::GetXOrigin(short FAR* pxorg)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETXORIGIN], pxorg);
+}
+
+
+/***
+*HRESULT CRemPoly::SetXOrigin(short)
+*
+*Purpose:
+* Invoke the SetXOrigin method on the remote object to set the
+* XOrigin property of the polygon to the given value.
+*
+*Entry:
+* xorg = the new X origin
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::SetXOrigin(short xorg)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETXORIGIN], xorg);
+}
+
+
+/***
+*HRESULT CRemPoly::GetYOrigin(short*)
+*
+*Purpose:
+* Invoke the GetYOrigin() method on the remote object to extract
+* the current value of the YOrigin property.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pyorg = the current Y origin of the polygon
+*
+***********************************************************************/
+HRESULT
+CRemPoly::GetYOrigin(short FAR* pyorg)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETYORIGIN], pyorg);
+}
+
+
+/***
+*HRESULT CRemPoly::SetYOrigin(short)
+*
+*Purpose:
+* Invoke the SetYOrigin method on the remote object to set the
+* YOrigin property of the polygon to the given value.
+*
+*Entry:
+* yorg = the new Y origin
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::SetYOrigin(short yorg)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETYORIGIN], yorg);
+}
+
+
+/***
+*HRESULT CRemPoly::GetWidth(short*)
+*
+*Purpose:
+* Invoke the GetWidth() method on the remote object to extract
+* the current value of the line width property.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pwidth = short, the current line width of the polygon
+*
+***********************************************************************/
+HRESULT
+CRemPoly::GetWidth(short FAR* pwidth)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETWIDTH], pwidth);
+}
+
+
+/***
+*HRESULT CRemPoly::SetWidth(short)
+*
+*Purpose:
+* Invoke the SetWidth method on the remote object to set the
+* line width property of the polygon to the given value.
+*
+*Entry:
+* width = the new value for the line width property.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+CRemPoly::SetWidth(short width)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETWIDTH], width);
+}
+
+
+
+HRESULT CRemPoly::get_red(short FAR* psRed)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETRED], psRed);
+}
+
+HRESULT CRemPoly::set_red(short sRed)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETRED], sRed);
+}
+
+
+HRESULT CRemPoly::get_green(short FAR* psGreen)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETGREEN], psGreen);
+}
+
+HRESULT CRemPoly::set_green(short sGreen)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETGREEN], sGreen);
+}
+
+
+HRESULT CRemPoly::get_blue(short FAR* psBlue)
+{
+ return get_i2(m_rgdispid[IMETH_CREMPOLY_GETBLUE], psBlue);
+}
+
+HRESULT CRemPoly::set_blue(short sBlue)
+{
+ return set_i2(m_rgdispid[IMETH_CREMPOLY_SETBLUE], sBlue);
+}
+
+
+
+HRESULT
+CRemPoly::get_i2(DISPID dispid, short FAR* ps)
+{
+ HRESULT hresult;
+ VARIANT varResult;
+
+ VariantInit(&varResult);
+
+ hresult = m_pdisp->Invoke(
+ dispid,
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &g_dispparamsNoArgs,
+ &varResult, NULL, NULL);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ hresult = VariantChangeType(&varResult, &varResult, 0, VT_I2);
+ if(hresult != NOERROR){
+ VariantClear(&varResult);
+ return hresult;
+ }
+
+ *ps = V_I2(&varResult);
+ return NOERROR;
+}
+
+HRESULT
+CRemPoly::set_i2(DISPID dispid, short s)
+{
+ VARIANTARG varg;
+ DISPPARAMS dispparams;
+
+ V_VT(&varg) = VT_I2;
+ V_I2(&varg) = s;
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgvarg = &varg;
+
+ return m_pdisp->Invoke(
+ dispid,
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ &dispparams, NULL, NULL, NULL);
+}
diff --git a/private/oleauto/tests/common/crempoly.h b/private/oleauto/tests/common/crempoly.h
new file mode 100644
index 000000000..9ca1895a7
--- /dev/null
+++ b/private/oleauto/tests/common/crempoly.h
@@ -0,0 +1,90 @@
+/***
+*crempoly.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CRemPoly remote polygon object.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+class CRemPoly : public IUnknown {
+public:
+ static HRESULT Create(OLECHAR FAR* szProgID, CRemPoly FAR* FAR*);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // Introduced methods
+ //
+ HRESULT Draw(void);
+ HRESULT Dump(void);
+ HRESULT Reset(void);
+ HRESULT AddPoint(short x, short y);
+ HRESULT EnumPoints(IEnumVARIANT FAR* FAR* ppenum);
+ HRESULT GetXOrigin(short FAR* pxorg);
+ HRESULT SetXOrigin(short xorg);
+ HRESULT GetYOrigin(short FAR* pyorg);
+ HRESULT SetYOrigin(short yorg);
+ HRESULT GetWidth(short FAR* pwidth);
+ HRESULT SetWidth(short width);
+
+ HRESULT get_red(short FAR* pred);
+ HRESULT set_red(short red);
+ HRESULT get_green(short FAR* pgreen);
+ HRESULT set_green(short green);
+ HRESULT get_blue(short FAR* pblue);
+ HRESULT set_blue(short blue);
+
+private:
+ CRemPoly();
+
+ HRESULT get_i2(DISPID dispid, short FAR* ps);
+ HRESULT set_i2(DISPID dispid, short);
+
+ unsigned long m_refs;
+ IDispatch FAR* m_pdisp;
+
+ // NOTE: this enumeration exists simply to allow us to symbolicly
+ // index the member name and id arrays (m_rgid and m_rgszMethods).
+ // This doesn't (necessarrily) have any connection to the vtable
+ // indices, it *only* needs to correspond correctly to the m_rgid
+ // and m_rgszMethods arrays.
+ //
+ enum CREMPOLY_METHODS {
+ IMETH_CREMPOLY_DRAW = 0,
+ IMETH_CREMPOLY_DUMP,
+ IMETH_CREMPOLY_RESET,
+ IMETH_CREMPOLY_ADDPOINT,
+ IMETH_CREMPOLY_ENUMPOINTS,
+ IMETH_CREMPOLY_GETXORIGIN,
+ IMETH_CREMPOLY_SETXORIGIN,
+ IMETH_CREMPOLY_GETYORIGIN,
+ IMETH_CREMPOLY_SETYORIGIN,
+ IMETH_CREMPOLY_GETWIDTH,
+ IMETH_CREMPOLY_SETWIDTH,
+ IMETH_CREMPOLY_GETRED,
+ IMETH_CREMPOLY_SETRED,
+ IMETH_CREMPOLY_GETGREEN,
+ IMETH_CREMPOLY_SETGREEN,
+ IMETH_CREMPOLY_GETBLUE,
+ IMETH_CREMPOLY_SETBLUE,
+ IMETH_CREMPOLY_MAX
+ };
+
+ // member IDs - these are used by IDispatch::Invoke to identify the
+ // method or property on the remote object we accessing.
+ //
+ DISPID m_rgdispid[IMETH_CREMPOLY_MAX];
+
+ // member names - these are used to learn the member IDs when we
+ // connect to the remote object.
+ //
+ static OLECHAR FAR* m_rgszMethods[IMETH_CREMPOLY_MAX];
+};
diff --git a/private/oleauto/tests/common/cunk.cpp b/private/oleauto/tests/common/cunk.cpp
new file mode 100644
index 000000000..e562dd43a
--- /dev/null
+++ b/private/oleauto/tests/common/cunk.cpp
@@ -0,0 +1,65 @@
+/***
+*cunk.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements a trivial class that supports IUnknown*.
+*
+*Revision History:
+*
+* [00] 10-Apr-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "common.h"
+#include "cunk.h"
+
+
+HRESULT
+CUnk::Create(IUnknown FAR* FAR* ppunk)
+{
+ CUnk FAR* punk;
+
+ if((punk = new FAR CUnk()) == NULL)
+ return ResultFromScode(E_OUTOFMEMORY);
+
+ punk->AddRef();
+
+ *ppunk = (IUnknown FAR*)punk;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CUnk::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CUnk::AddRef()
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CUnk::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
diff --git a/private/oleauto/tests/common/cunk.h b/private/oleauto/tests/common/cunk.h
new file mode 100644
index 000000000..b9f92f713
--- /dev/null
+++ b/private/oleauto/tests/common/cunk.h
@@ -0,0 +1,33 @@
+/***
+*cunk.h
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Declares a trivial class that implements IUnknown.
+*
+*Revision History:
+*
+* [00] 10-Apr-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+class CUnk : public IUnknown {
+public:
+ static HRESULT Create(IUnknown FAR* FAR* ppunk);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ CUnk::CUnk(){
+ m_refs = 0;
+ }
+
+private:
+
+ unsigned long m_refs;
+};
diff --git a/private/oleauto/tests/common/dballoc.cpp b/private/oleauto/tests/common/dballoc.cpp
new file mode 100644
index 000000000..245d40f58
--- /dev/null
+++ b/private/oleauto/tests/common/dballoc.cpp
@@ -0,0 +1,916 @@
+/***
+*dballoc.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains a debug implementation of the IMalloc interface.
+*
+* This implementation is basically a simple wrapping of the C runtime,
+* with additional work to detect memory leakage, and memory overwrite.
+*
+* Leakage is detected by tracking each allocation in an address
+* instance table, and then checking to see if the table is empty
+* when the last reference to the allocator is released.
+*
+* Memory overwrite is detected by placing a signature at the end
+* of every allocated block, and checking to make sure the signature
+* is unchanged when the block is freed.
+*
+* This implementation also has additional param validation code, as
+* well as additional check make sure that instances that are passed
+* to Free() were actually allocated by the corresponding instance
+* of the allocator.
+*
+*
+* Creating an instance of this debug allocator that uses the default
+* output interface would look like the following,
+*
+*
+* int init_application_instance()
+* {
+* HRESULT hresult;
+* IMalloc FAR* pmalloc;
+*
+* pmalloc = NULL;
+*
+* if((hresult = CreateDbAlloc(DBALLOC_NONE, NULL, &pmalloc)) != NOERROR)
+* goto LReturn;
+*
+* hresult = OleInitialize(pmalloc);
+*
+* LReturn:;
+* if(pmalloc != NULL)
+* pmalloc->Release();
+*
+* return (hresult == NOERROR) ? TRUE : FALSE;
+* }
+*
+*
+* CONSIDER: could add an option to force error generation, something
+* like DBALLOC_ERRORGEN, that works along the lines of OB's
+* DebErrorNow.
+*
+* CONSIDER: add support for heap-checking. say for example,
+* DBALLOC_HEAPCHECK would do a heapcheck every free? every 'n'
+* calls to free? ...
+*
+*
+*Revision History:
+*
+* [00] 25-Feb-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+* The method IMalloc::DidAlloc() is allowed to always return
+* "Dont Know" (-1). This method is called by Ole, and they take
+* some appropriate action when they get this answer. UNDONE -- elaborate.
+*
+*****************************************************************************/
+
+#include "common.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <limits.h>
+
+#if !HC_MPW
+# include <malloc.h>
+#endif
+
+#include "dballoc.h"
+
+#if defined(WIN32)
+ #define OUTPUTDEBUGSTRING OutputDebugStringA
+#else
+ #define OUTPUTDEBUGSTRING OutputDebugString
+#endif
+
+#if OE_MAC
+# define MALLOC(CB) NewPtr(CB)
+# define REALLOC(PV, CB) ERROR
+# define FREE(PV) DisposePtr((Ptr)PV)
+# define HEAPMIN() CompactMem(maxSize)
+#elif OE_WIN32
+# define MALLOC(CB) malloc(CB)
+# define REALLOC(PV, CB) realloc((PV), (CB))
+# define FREE(PV) free(PV)
+# define HEAPMIN()
+#else
+# define MALLOC(CB) _fmalloc(CB)
+# define REALLOC(PV, CB) _frealloc(PV, CB)
+# define FREE(PV) _ffree(PV)
+# define HEAPMIN() _fheapmin()
+
+
+void
+hmemset(void HUGEP* pv, int val, unsigned long size)
+{
+ size_t cb;
+ char HUGEP* pdata;
+
+ pdata = (char HUGEP*)pv;
+
+ // compute the # of bytes to the end of the current segment.
+ cb = (size_t)((unsigned long)UINT_MAX + (unsigned long)1 - ((unsigned long)pdata&(unsigned long)UINT_MAX));
+
+ if(size <= cb){
+ // easy, the entire area fits within the current segment
+ MEMSET(pdata, val, (size_t)size);
+ return;
+ }
+
+ // clear out to the end of the current segment.
+ MEMSET(pdata, val, cb);
+ size -= cb;
+ pdata += cb;
+
+ // loop through the remaining segments
+ while(size > 0){
+
+ if(size <= UINT_MAX){
+ MEMSET(pdata, val, (size_t)size);
+ break;
+ }
+
+ // otherwise, fill as much as we can with one call to memset
+
+ MEMSET(pdata, val, UINT_MAX);
+
+ // the following leaves us pointing @ the last byte of the segment.
+ pdata += UINT_MAX;
+
+ // fill the last byte of the segment, and move on to the next segment.
+ *pdata++ = (char)val;
+
+ size -= ((unsigned long)UINT_MAX+1UL);
+ }
+}
+
+#endif
+
+
+class FAR CStdDbOutput : public IDbOutput {
+public:
+ static IDbOutput FAR* Create();
+
+ // IUnknown methods
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+
+ // IDbOutput methods
+
+ STDMETHOD_(void, Printf)(char FAR* szFmt, ...);
+
+ STDMETHOD_(void, Assertion)(
+ int cond,
+ char FAR* szFile,
+ unsigned int uLine,
+ char FAR* szMsg);
+
+
+ void FAR* operator new(size_t cb){
+ return MALLOC(cb);
+ }
+ void operator delete(void FAR* pv){
+ FREE(pv);
+ }
+
+ CStdDbOutput(){
+ m_refs = 0;
+ }
+
+private:
+ unsigned long m_refs;
+
+ char m_rgch[128]; // buffer for output formatting
+};
+
+
+
+//---------------------------------------------------------------------
+// implementation of the debug allocator
+//---------------------------------------------------------------------
+
+
+class FAR CAddrNode
+{
+public:
+ void FAR* m_pv; // instance
+ unsigned long m_cb; // size of allocation in BYTES
+ unsigned long m_nAlloc; // the allocation pass count
+ CAddrNode FAR* m_next;
+
+ void FAR* operator new(size_t cb){
+ return MALLOC(cb);
+ }
+ void operator delete(void FAR* pv){
+ FREE(pv);
+ }
+};
+
+
+class FAR CDbAlloc : public IMalloc
+{
+public:
+ static HRESULT Create(
+ unsigned long options, IDbOutput FAR* pdbout, IMalloc FAR* FAR* ppmalloc);
+
+ // IUnknown methods
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IMalloc methods
+
+ STDMETHOD_(void FAR*, Alloc)(unsigned long cb);
+ STDMETHOD_(void FAR*, Realloc)(void FAR* pv, unsigned long cb);
+ STDMETHOD_(void, Free)(void FAR* pv);
+ STDMETHOD_(unsigned long, GetSize)(void FAR* pv);
+ STDMETHOD_(int, DidAlloc)(void FAR* pv);
+ STDMETHOD_(void, HeapMinimize)(void);
+
+ void IncAllocCalls(void);
+
+ void FAR* operator new(size_t cb){
+ return MALLOC(cb);
+ }
+ void operator delete(void FAR* pv){
+ FREE(pv);
+ }
+
+ CDbAlloc();
+
+private:
+
+ unsigned long m_refs;
+ unsigned long m_options;
+ unsigned long m_cAllocCalls; // total count of allocation calls
+ IDbOutput FAR* m_pdbout; // output interface
+ CAddrNode FAR* m_rganode[64]; // address instance table
+
+
+ // instance table methods
+
+ int IsEmpty(void);
+
+ void AddInst(void FAR* pv, unsigned long nAlloc, unsigned long cb);
+ void DelInst(void FAR* pv);
+ CAddrNode FAR* GetInst(void FAR* pv);
+
+ void ReportLeakage(void);
+ void DumpInst(CAddrNode FAR* pn);
+
+ inline unsigned int HashInst(void FAR* pv) const {
+ return ((unsigned int)((unsigned long)pv >> 4)) % DIM(m_rganode);
+ }
+
+
+ // output method(s)
+
+ inline void Assertion(
+ int cond,
+ char FAR* szFile,
+ unsigned int uLine,
+ char FAR* szMsg)
+ {
+ m_pdbout->Assertion(cond, szFile, uLine, szMsg);
+ }
+
+ #undef ASSERT
+ #define ASSERT(X) Assertion(X, __FILE__, __LINE__, NULL)
+
+ #undef ASSERTSZ
+ #define ASSERTSZ(X, SZ) Assertion(X, __FILE__, __LINE__, SZ)
+};
+
+CDbAlloc::CDbAlloc()
+{
+ m_refs = 1;
+ m_pdbout = NULL;
+ m_cAllocCalls = 0;
+ MEMSET(m_rganode, 0, sizeof(m_rganode));
+}
+
+unsigned char g_rgchSig[] = { 0xDE, 0xAD, 0xBE, 0xEF };
+
+#if OE_WIN16
+// answer if an allocation of the given size would be a "huge" allocation
+int
+IsHuge(unsigned long cb)
+{
+ return (cb + sizeof(g_rgchSig)) >= UINT_MAX;
+}
+#endif
+
+// check the signature on the given instance
+int
+CheckSig(CAddrNode FAR* pn)
+{
+ int i;
+ unsigned char HUGEP* pchSig;
+
+ pchSig = ((unsigned char HUGEP*)pn->m_pv) + pn->m_cb;
+
+ for(i = 0; i < DIM(g_rgchSig); ++i){
+ if(pchSig[i] != g_rgchSig[i])
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void
+ApplySig(unsigned char HUGEP* pch)
+{
+ for(int i = 0; i < DIM(g_rgchSig); ++i)
+ pch[i] = g_rgchSig[i];
+}
+
+
+/***
+*HRESULT CreateDbAlloc(unsigned long, IDbOutput*, IMalloc**)
+*Purpose:
+* Create an instance of CDbAlloc -- a debug implementation
+* of IMalloc.
+*
+*Entry:
+* pdbout = optional IDbOutput interface to use for ouput
+* (if NULL, then the default debug output interface will be used)
+* options =
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppmalloc = pointer to an IMalloc interface
+*
+***********************************************************************/
+STDAPI
+CreateDbAlloc(
+ unsigned long options,
+ IDbOutput FAR* pdbout,
+ IMalloc FAR* FAR* ppmalloc)
+{
+ return CDbAlloc::Create(options, pdbout, ppmalloc);
+}
+
+HRESULT
+CDbAlloc::Create(
+ unsigned long options,
+ IDbOutput FAR* pdbout,
+ IMalloc FAR* FAR* ppmalloc)
+{
+ HRESULT hresult;
+ CDbAlloc FAR* pmalloc;
+
+
+ // default the instance of IDbOutput if the user didn't supply one
+ if(pdbout == NULL && ((pdbout = CStdDbOutput::Create()) == NULL)){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ pdbout->AddRef();
+
+ if((pmalloc = new FAR CDbAlloc()) == NULL){
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ pmalloc->m_pdbout = pdbout;
+ pmalloc->m_options = options;
+
+ *ppmalloc = pmalloc;
+
+ return NOERROR;
+
+LError1:;
+ pdbout->Release();
+ pmalloc->Release();
+
+LError0:;
+ return hresult;
+}
+
+STDMETHODIMP
+CDbAlloc::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(!IsEqualIID(riid,IID_IUnknown))
+ if(IsEqualIID(riid, IID_IMalloc))
+ return ResultFromScode(E_NOINTERFACE);
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CDbAlloc::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CDbAlloc::Release()
+{
+ if(--m_refs == 0){
+
+ if(m_options & DBALLOC_DETECTLEAKS)
+ ReportLeakage();
+
+ m_pdbout->Release();
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP_(void FAR*)
+CDbAlloc::Alloc(unsigned long cb)
+{
+ size_t size;
+
+ IncAllocCalls();
+
+#if OE_WIN16
+ if(IsHuge(cb))
+ {
+ unsigned char HUGEP* pch;
+
+ if((pch = (unsigned char HUGEP*)_halloc(cb+sizeof(g_rgchSig), 1)) == NULL)
+ return NULL;
+
+ hmemset(pch, -1, cb);
+
+ ApplySig(pch + cb);
+
+ AddInst((void FAR*)pch, m_cAllocCalls, cb);
+
+ return (void FAR*)pch;
+
+ }
+ else
+#endif
+ {
+ void FAR* pv;
+
+ size = (size_t)cb + sizeof(g_rgchSig);
+
+ if((pv = MALLOC(size)) == NULL)
+ return NULL;
+
+ // set allocated block to some non-zero value
+ MEMSET(pv, -1, size);
+
+ // put signature at end of allocated block
+ ApplySig((unsigned char HUGEP*)pv + cb);
+
+ AddInst(pv, m_cAllocCalls, cb);
+
+ return pv;
+ }
+}
+
+STDMETHODIMP_(void FAR*)
+CDbAlloc::Realloc(void FAR* pv, unsigned long cb)
+{
+ CAddrNode FAR* pn;
+
+ if(pv == NULL){
+ return Alloc(cb);
+ }
+
+ if(cb == 0){
+ Free(pv);
+ return NULL;
+ }
+
+ pn = GetInst(pv);
+ ASSERTSZ(pn != NULL, "pointer realloc'd by wrong allocator");
+
+#if OE_WIN16
+ // if either the new or the old allocation is huge, then just
+ // allocate a new block and copy. This is the easiest implementation.
+ if(IsHuge(cb) || IsHuge(pn->m_cb))
+ {
+ void HUGEP* pvNew;
+
+ if((pvNew = (void HUGEP*)Alloc(cb)) == NULL)
+ return NULL;
+
+ // copy in the existing data
+ hmemcpy(pvNew, (void HUGEP*)pv, MIN(cb, pn->m_cb));
+
+ Free(pv);
+
+ return (void FAR*)pvNew;
+ }
+ else
+#endif
+ {
+ void FAR* pvNew;
+
+ IncAllocCalls();
+
+ size_t size = (size_t)cb + sizeof(g_rgchSig);
+#if OE_MAC
+ SetPtrSize((Ptr)pv, size);
+ if(MemError() != noErr)
+ return NULL;
+ pvNew = pv;
+#else
+ if((pvNew = REALLOC(pv, size)) == NULL)
+ return NULL;
+#endif
+
+ DelInst(pv);
+ AddInst(pvNew, m_cAllocCalls, cb);
+
+ // put signature at end of allocated block
+ ApplySig((unsigned char HUGEP*)pvNew + cb);
+
+ return pvNew;
+ }
+}
+
+STDMETHODIMP_(void)
+CDbAlloc::Free(void FAR* pv)
+{
+#if OE_WIN16
+ int fIsHuge;
+#endif
+ CAddrNode FAR* pn;
+static char szSigMsg[] = "Signature Check Failed";
+
+ // REVIEW: is the following correct?
+ if(pv == NULL)
+ return;
+
+ pn = GetInst(pv);
+
+ // check for attempt to free an instance we didnt allocate
+ if(pn == NULL){
+ ASSERTSZ(FALSE, "pointer freed by wrong allocator");
+ return;
+ }
+
+#if OE_WIN16
+ fIsHuge = IsHuge(pn->m_cb);
+#endif
+
+ // verify the signature
+ if(!CheckSig(pn)){
+ m_pdbout->Printf(szSigMsg); m_pdbout->Printf("\n");
+ DumpInst(pn);
+ ASSERTSZ(FALSE, szSigMsg);
+ }
+
+ // stomp on the contents of the block
+#if OE_WIN16
+ if(fIsHuge)
+ {
+ hmemset(pv, 0xCC, pn->m_cb + sizeof(g_rgchSig));
+ }
+ else
+#endif
+ {
+ MEMSET(pv, 0xCC, (size_t)pn->m_cb + sizeof(g_rgchSig));
+ }
+
+ DelInst(pv);
+
+#if OE_WIN16
+ if(fIsHuge)
+ {
+ _hfree(pv);
+ }
+ else
+#endif
+ {
+ FREE(pv);
+ }
+}
+
+
+STDMETHODIMP_(unsigned long)
+CDbAlloc::GetSize(void FAR* pv)
+{
+ CAddrNode FAR* pn;
+
+ pn = GetInst(pv);
+
+ ASSERT(pn != NULL);
+
+ return pn->m_cb;
+}
+
+
+/***
+*PUBLIC HRESULT CDbAlloc::DidAlloc
+*Purpose:
+* Answer if the given address belongs to a block allocated by
+* this allocator.
+*
+*Entry:
+* pv = the instance to lookup
+*
+*Exit:
+* return value = int
+* 1 - did alloc
+* 0 - did *not* alloc
+* -1 - dont know (according to the ole2 spec it is always legal
+* for the allocator to answer "dont know")
+*
+***********************************************************************/
+STDMETHODIMP_(int)
+CDbAlloc::DidAlloc(void FAR* pv)
+{
+ UNUSED(pv);
+
+ return -1; // answer "I dont know"
+}
+
+
+STDMETHODIMP_(void)
+CDbAlloc::HeapMinimize()
+{
+ HEAPMIN();
+}
+
+void CDbAlloc::IncAllocCalls(void)
+{
+ ++m_cAllocCalls;
+}
+
+//---------------------------------------------------------------------
+// instance table methods
+//---------------------------------------------------------------------
+
+/***
+*PRIVATE CDbAlloc::AddInst
+*Purpose:
+* Add the given instance to the address instance table.
+*
+*Entry:
+* pv = the instance to add
+* nAlloc = the allocation passcount of this instance
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CDbAlloc::AddInst(void FAR* pv, unsigned long nAlloc, unsigned long cb)
+{
+ unsigned int hash;
+ CAddrNode FAR* pn;
+
+
+ ASSERT(pv != NULL);
+
+ pn = (CAddrNode FAR*)new FAR CAddrNode();
+
+ ASSERT(pn != NULL);
+
+ pn->m_pv = pv;
+ pn->m_cb = cb;
+ pn->m_nAlloc = nAlloc;
+
+ hash = HashInst(pv);
+ pn->m_next = m_rganode[hash];
+ m_rganode[hash] = pn;
+}
+
+
+/***
+*UNDONE
+*Purpose:
+* Remove the given instance from the address instance table.
+*
+*Entry:
+* pv = the instance to remove
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CDbAlloc::DelInst(void FAR* pv)
+{
+ CAddrNode FAR* FAR* ppn, FAR* pnDead;
+
+ for(ppn = &m_rganode[HashInst(pv)]; *ppn != NULL; ppn = &(*ppn)->m_next){
+ if((*ppn)->m_pv == pv){
+ pnDead = *ppn;
+ *ppn = (*ppn)->m_next;
+ delete pnDead;
+ // make sure it doesnt somehow appear twice
+ ASSERT(GetInst(pv) == NULL);
+ return;
+ }
+ }
+
+ // didnt find the instance
+ ASSERT(UNREACHED);
+}
+
+
+CAddrNode FAR*
+CDbAlloc::GetInst(void FAR* pv)
+{
+ CAddrNode FAR* pn;
+
+ for(pn = m_rganode[HashInst(pv)]; pn != NULL; pn = pn->m_next){
+ if(pn->m_pv == pv)
+ return pn;
+ }
+ return NULL;
+}
+
+
+void
+CDbAlloc::DumpInst(CAddrNode FAR* pn)
+{
+ m_pdbout->Printf("[%lp] nAlloc=%ld size=%ld\n",
+ pn->m_pv, pn->m_nAlloc, GetSize(pn->m_pv));
+}
+
+
+/***
+*PRIVATE int IsEmpty
+*Purpose:
+* Answer if the address instance table is empty.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = int, TRUE if empty, FALSE otherwise
+*
+***********************************************************************/
+int
+CDbAlloc::IsEmpty()
+{
+ unsigned int u;
+
+ for(u = 0; u < DIM(m_rganode); ++u){
+ if(m_rganode[u] != NULL)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/***
+*PRIVATE CDbAlloc::Dump
+*Purpose:
+* Print the current contents of the address instance table,
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CDbAlloc::ReportLeakage()
+{
+ unsigned int u, cInst;
+ unsigned long cbTotal;
+ CAddrNode FAR* pn;
+
+ // check for memory leakage
+ if(IsEmpty()){
+ m_pdbout->Printf("No Memory Leaks.\n");
+ return;
+ }
+
+ cInst = 0;
+ cbTotal = 0;
+ for(u = 0; u < DIM(m_rganode); ++u){
+ for(pn = m_rganode[u]; pn != NULL; pn = pn->m_next){
+ ++cInst;
+ cbTotal += pn->m_cb;
+ }
+ }
+
+ m_pdbout->Printf(
+ "Memory Leak Detected: %d Allocations / %ld Bytes,\n", cInst, cbTotal);
+
+ cInst = 0;
+ for(u = 0; u < DIM(m_rganode); ++u){
+ for(pn = m_rganode[u]; pn != NULL; pn = pn->m_next){
+ if(++cInst > 16){
+ m_pdbout->Printf("etc...\n");
+ return;
+ }
+ DumpInst(pn);
+ }
+ }
+}
+
+
+//---------------------------------------------------------------------
+// implementation of CStdDbOutput
+//---------------------------------------------------------------------
+
+IDbOutput FAR*
+CStdDbOutput::Create()
+{
+ return (IDbOutput FAR*)new FAR CStdDbOutput();
+}
+
+STDMETHODIMP
+CStdDbOutput::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CStdDbOutput::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CStdDbOutput::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+#if OE_MAC
+extern "C" void DbPrintf(char *szFmt, ...);
+#endif
+
+STDMETHODIMP_(void)
+CStdDbOutput::Printf(char FAR* szFmt, ...)
+{
+ va_list args;
+static char rgchOutputBuf[128];
+
+#if OE_MAC
+ va_start(args, szFmt);
+ vsprintf(rgchOutputBuf, szFmt, args);
+ DbPrintf(rgchOutputBuf);
+
+#else
+ char *pn, FAR* pf;
+static char rgchFmtBuf[128];
+
+ // copy the 'far' format string to a near buffer so we can use
+ // a medium model vsprintf, which only supports near data pointers.
+ //
+ pn = rgchFmtBuf, pf=szFmt;
+ while(*pf != '\0')
+ *pn++ = *pf++;
+ *pn = '\0';
+
+ va_start(args, szFmt);
+ vsprintf(rgchOutputBuf, rgchFmtBuf, args);
+ OUTPUTDEBUGSTRING(rgchOutputBuf);
+#endif
+}
+
+STDMETHODIMP_(void)
+CStdDbOutput::Assertion(
+ int cond,
+ char FAR* szFile,
+ unsigned int uLine,
+ char FAR* szMsg)
+{
+ if(cond)
+ return;
+
+# if OE_MAC
+
+ char *szFmt;
+ char buf[128];
+ szFmt = (szMsg == NULL)
+ ? "Assertion failed: %s(%d)"
+ : "Assertion failed: %s(%d) '%s'";
+ sprintf(&buf[1], szFmt, szFile, uLine, szMsg);
+ buf[0] = strlen(&buf[1]);
+ DebugStr((unsigned char *)buf);
+
+# else
+
+ DispAssert(szMsg, szFile, uLine);
+
+# endif
+}
+
diff --git a/private/oleauto/tests/common/dballoc.h b/private/oleauto/tests/common/dballoc.h
new file mode 100644
index 000000000..236ebb5f1
--- /dev/null
+++ b/private/oleauto/tests/common/dballoc.h
@@ -0,0 +1,51 @@
+/***
+*dballoc.h
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains the definition of CDbAlloc - A debug implementation
+* of the IMalloc interface.
+*
+*Revision History:
+*
+* [00] 25-Feb-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef DBALLOC_H_INCLUDED /* { */
+#define DBALLOC_H_INCLUDED
+
+
+interface IDbOutput : public IUnknown
+{
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, void FAR* FAR* ppv) PURE;
+ STDMETHOD_(unsigned long, AddRef)(THIS) PURE;
+ STDMETHOD_(unsigned long, Release)(THIS) PURE;
+
+ STDMETHOD_(void, Printf)(THIS_
+ char FAR* szFmt, ...) PURE;
+
+ STDMETHOD_(void, Assertion)(THIS_
+ int cond,
+ char FAR* szFile,
+ unsigned int uLine,
+ char FAR* szMsg) PURE;
+};
+
+
+STDAPI CreateDbAlloc(
+ unsigned long options,
+ IDbOutput FAR* pdbout,
+ IMalloc FAR* FAR* ppmalloc);
+
+// dballoc option flags - these are set at create time.
+
+#define DBALLOC_NONE 0
+#define DBALLOC_DETECTLEAKS 0x01
+
+
+#endif /* } DBALLOC_H_INCLUDED */
diff --git a/private/oleauto/tests/common/dispdbug.cpp b/private/oleauto/tests/common/dispdbug.cpp
new file mode 100644
index 000000000..c3d606f73
--- /dev/null
+++ b/private/oleauto/tests/common/dispdbug.cpp
@@ -0,0 +1,890 @@
+/***
+*dispdbug.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Misc Debug utilities.
+*
+*Revision History:
+*
+* [00] 25-Sep-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "common.h"
+#include "dispdbug.h"
+
+LOCAL char *rgszVtFmt[] = {
+ "" // VT_EMPTY
+ , "" // VT_NULL
+ , "%d" // VT_I2
+ , "%ld" // VT_I4
+ , "%#f" // VT_R4
+ , "%#f" // VT_R8
+ , "%ld.%lu" // VT_CY
+ , "%#f" // VT_DATE
+#if HC_MPW
+ , "\"%s\"" // VT_BSTR
+#else
+ , "\"%Fs\"" // VT_BSTR
+#endif
+ , "" // VT_DISPATCH
+ , "0x%lX" // VT_ERROR
+ , "%d" // VT_BOOL
+ , NULL // VT_VARIANT - special format
+ , "" // VT_UNKNOWN
+ , "" // 14 is unused
+ , "" // 15 is unused
+ , "%d" // VT_I1
+ , "%ud" // VT_UI1
+};
+
+#if 0 /* Note: this is now supplied by the host test app */
+#ifndef _MAC
+
+extern "C" void
+DbPrintf(char FAR* szFormat, ...)
+{
+ va_list args;
+ char *pn, FAR* pf;
+static char rgchFmtBuf[512];
+static char rgchOutputBuf[1024];
+
+
+ // copy the 'far' format string to a near buffer so we can use
+ // the medium model vsprintf, which only supports near data pointers.
+ //
+ pn = rgchFmtBuf, pf=szFormat;
+ while(*pf != '\0')
+ *pn++ = *pf++;
+ *pn = '\0';
+
+ va_start(args, szFormat);
+ vsprintf(rgchOutputBuf, rgchFmtBuf, args);
+ OutputDebugString(rgchOutputBuf);
+}
+
+#endif
+#endif
+
+
+
+extern "C" void
+DbPrVt(VARTYPE vt)
+{
+ DbPrintf(DbSzOfVt(vt));
+}
+
+
+extern "C" char FAR*
+SzOfVarg(VARIANTARG FAR* pvarg)
+{
+ char *p;
+ short s;
+ VARTYPE vt;
+ void FAR* pv;
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+static char buf[512];
+#if OE_WIN32
+ char buf2[256];
+#endif
+
+ if(pvarg == NULL)
+ return "(null)";
+
+ p = buf;
+
+ STRCPY(p, DbSzOfVt(V_VT(pvarg)));
+ p += strlen(p);
+
+ vt = V_VT(pvarg) & ~(VT_BYREF | VT_ARRAY);
+
+ pv = (V_ISBYREF(pvarg)) ? V_BYREF(pvarg) : &V_NONE(pvarg);
+
+ *p++ = '(';
+ *p = '\0';
+
+ switch(V_VT(pvarg)){
+ case VT_NULL:
+ case VT_EMPTY:
+ *p = '\0';
+ break;
+
+#if VBA2
+ case VT_UI1:
+ case VT_UI1 | VT_BYREF:
+ sprintf(p, rgszVtFmt[vt], (unsigned int)*(unsigned char FAR*)pv);
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_I2 | VT_BYREF:
+ sprintf(p, rgszVtFmt[vt], *(short FAR*)pv);
+ break;
+
+ case VT_I4:
+ case VT_ERROR:
+ case VT_I4 | VT_BYREF:
+ case VT_ERROR | VT_BYREF:
+ sprintf(p, rgszVtFmt[vt], *(long FAR*)pv);
+ break;
+
+ case VT_R4:
+ case VT_R4 | VT_BYREF:
+ sprintf(p, rgszVtFmt[vt], (double)*(float FAR*)pv);
+ break;
+
+ case VT_CY:
+ case VT_CY | VT_BYREF:
+ sprintf(p, rgszVtFmt[vt], ((CY FAR*)pv)->Hi, ((CY FAR*)pv)->Lo);
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ case VT_R8 | VT_BYREF:
+ case VT_DATE | VT_BYREF:
+ sprintf(p, rgszVtFmt[vt], *(double FAR*)pv);
+ break;
+
+ case VT_BSTR:
+ case VT_BSTR | VT_BYREF:
+#if OE_WIN32
+ ConvertStrWtoA(*(BSTR FAR*)pv, buf2),
+ sprintf(p, rgszVtFmt[vt], buf2);
+#else
+ sprintf(p, rgszVtFmt[vt], *(BSTR FAR*)pv);
+#endif
+ break;
+
+ case VT_BOOL:
+ case VT_BOOL | VT_BYREF:
+ s = *(short FAR*)pv;
+ if(s == 0){
+ strcpy(p, "False(0)");
+ }else if(s == -1){
+ strcpy(p, "True(-1)");
+ }else{
+ *p++ = '?';
+ *p = '\0';
+ }
+ break;
+
+ case VT_UNKNOWN:
+ case VT_UNKNOWN | VT_BYREF:
+ punk = *(IUnknown FAR* FAR*)pv;
+ sprintf(p, rgszVtFmt[vt], punk);
+ break;
+
+ case VT_DISPATCH:
+ case VT_DISPATCH | VT_BYREF:
+ pdisp = *(IDispatch FAR* FAR*)pv;
+ sprintf(p, rgszVtFmt[vt], pdisp);
+ break;
+
+ case VT_VARIANT | VT_BYREF:
+ SzOfVarg(V_VARIANTREF(pvarg));
+ break;
+
+ default:
+ if(V_VT(pvarg) & VT_ARRAY){
+#if 0 /* Dont print addresses, makes the logfile un-diffable */
+ if(V_VT(pvarg) & VT_BYREF){
+ sprintf(p, "%lp", V_ARRAYREF(pvarg));
+ }else{
+ sprintf(p, "%lp", V_ARRAY(pvarg));
+ }
+#endif
+ }else{
+ *p++ = '?';
+ *p = '\0';
+ }
+ break;
+ }
+
+ p = buf + strlen(buf);
+
+ *p++ = ')';
+ *p = '\0';
+
+ return buf;
+}
+
+
+extern "C" void
+DbPrVarg(VARIANTARG FAR* pvarg)
+{
+ DbPrintf(SzOfVarg(pvarg));
+}
+
+
+/***
+*void DbPrData(void*, VARTYPE)
+*Purpose:
+* Print the given data according to the given VARTYPE.
+*
+*Entry:
+* vt = the VARTYPE of the data
+* pv = pointer to the data to print
+*
+*Exit:
+* None
+*
+***********************************************************************/
+extern "C" void
+DbPrData(void FAR* pv, VARTYPE vt)
+{
+#if OE_WIN32
+ char buf2[256];
+#endif
+ switch(vt){
+#if VBA2
+ case VT_UI1:
+ DbPrintf(rgszVtFmt[vt], (unsigned int)*(unsigned char FAR*)pv);
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ DbPrintf(rgszVtFmt[vt], *(short FAR*)pv);
+ break;
+
+ case VT_I4:
+ case VT_ERROR:
+ DbPrintf(rgszVtFmt[vt], *(long FAR*)pv);
+ break;
+
+ case VT_R4:
+ DbPrintf(rgszVtFmt[vt], (double)*(float FAR*)pv);
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ DbPrintf(rgszVtFmt[vt], *(double FAR*)pv);
+ break;
+
+ case VT_CY:
+ DbPrintf(rgszVtFmt[vt], ((CY FAR*)pv)->Hi, ((CY FAR*)pv)->Lo);
+ break;
+
+ case VT_BSTR:
+#if OE_WIN32
+ ConvertStrWtoA(*(BSTR FAR*)pv, buf2),
+ DbPrintf(rgszVtFmt[vt], buf2);
+#else
+ DbPrintf(rgszVtFmt[vt], *(BSTR FAR*)pv);
+#endif
+ break;
+
+ case VT_VARIANT:
+ DbPrVarg((VARIANT FAR*)pv);
+ break;
+
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ DbPrintf(rgszVtFmt[vt], *(IUnknown FAR* FAR*)pv);
+ break;
+
+#if OE_WIN32 && 0
+ case VT_WBSTR:
+ {
+ BSTR bstr;
+ bstr = SysStringWtoA(*(WBSTR FAR*)pv, CP_ACP);
+ DbPrintf(rgszVtFmt[vt], bstr);
+ SysFreeString(bstr);
+ break;
+ }
+
+ case VT_DISPATCHW:
+ DbPrintf(rgszVtFmt[vt], *(IUnknown FAR* FAR*)pv);
+ break;
+#endif
+
+ default:;
+ DbPrintf("?");
+ break;
+ }
+}
+
+
+/***
+*void DbPrExcepinfo(EXCEPINFO*)
+*Purpose:
+* Dump the given EXCEPINFO struct to the debug window.
+*
+*Entry:
+* pexcepinfo - the EXCEPINFO struct to dump
+*
+*Exit:
+* None
+*
+***********************************************************************/
+extern "C" void
+DbPrExcepinfo(EXCEPINFO FAR* pexcepinfo)
+{
+ DbPrintf("wCode=%d dwHelpContext=%ld\n",
+ pexcepinfo->wCode, pexcepinfo->dwHelpContext);
+
+#if HC_MPW
+ DbPrintf("bstrSource = \"%s\"\n", pexcepinfo->bstrSource);
+ DbPrintf("bstrDescription = \"%s\"\n", pexcepinfo->bstrDescription);
+ DbPrintf("bstrHelpFile = \"%s\"\n", pexcepinfo->bstrHelpFile);
+#else
+ DbPrintf("bstrSource = \"%Fs\"\n", pexcepinfo->bstrSource);
+ DbPrintf("bstrDescription = \"%Fs\"\n", pexcepinfo->bstrDescription);
+ DbPrintf("bstrHelpFile = \"%Fs\"\n", pexcepinfo->bstrHelpFile);
+#endif
+}
+
+#if OE_WIN32 && 0
+extern "C" void
+DbPrExcepinfoW(WEXCEPINFO FAR* pexcepinfo)
+{
+ BSTR source, description, helpFile;
+
+ source = SysStringWtoA(pexcepinfo->wbstrSource, CP_ACP);
+ description = SysStringWtoA(pexcepinfo->wbstrDescription, CP_ACP);
+ helpFile = SysStringWtoA(pexcepinfo->wbstrHelpFile, CP_ACP);
+
+ DbPrintf("wCode=%d dwHelpContext=%ld\n",
+ pexcepinfo->wCode, pexcepinfo->dwHelpContext);
+ DbPrintf("bstrSource = \"%Fs\"\n", source);
+ DbPrintf("bstrDescription = \"%Fs\"\n", description);
+ DbPrintf("bstrHelpFile = \"%Fs\"\n", helpFile);
+ SysFreeString(source);
+ SysFreeString(description);
+ SysFreeString(helpFile);
+}
+#endif
+
+/***
+*void DbPrParams(DISPPARAMS*)
+*Purpose:
+* Dump the given DISPPARAMS struct to the debug window.
+*
+*Entry:
+* pdispparams = the DISPPARAMS struct to dump.
+*
+*Exit:
+* None
+*
+***********************************************************************/
+extern "C" void
+DbPrParams(DISPPARAMS FAR* pdispparams)
+{
+ unsigned int i;
+
+ DbPrintf("cArgs = %d\n", pdispparams->cArgs);
+ DbPrintf("rgvarg = [");
+ for(i = 0; i < pdispparams->cArgs; ++i){
+ DbPrVarg(&pdispparams->rgvarg[i]);
+ if(i+1 < pdispparams->cArgs)
+ DbPrintf(", ");
+ }
+ DbPrintf("]\n");
+
+ DbPrintf("cNamedArgs = %d\n", pdispparams->cNamedArgs);
+ DbPrintf("rgdispidNamedArgs = [");
+ for(i = 0; i < pdispparams->cNamedArgs; ++i){
+ DbPrintf("%ld", pdispparams->rgdispidNamedArgs[i]);
+ if(i+1 < pdispparams->cNamedArgs)
+ DbPrintf(", ");
+ }
+ DbPrintf("]\n");
+}
+
+
+void
+PrScode(SCODE sc)
+{
+#if HC_MPW
+ DbPrintf("[%s]", DbSzOfScode(sc));
+#else
+ DbPrintf("[%Fs]", DbSzOfScode(sc));
+#endif
+}
+
+
+//---------------------------------------------------------------------
+// TypeInfo dumping utilities
+//---------------------------------------------------------------------
+
+/* naming convention:
+ *
+ * Pr<type> - dump the type with cr/lf
+ * Pr<type>N - dump type without cr/lf
+ * Pr<type>X - dump type with given indent level
+ *
+ */
+
+void
+DbIndent(int level)
+{
+ for(int i = 0; i < level; ++i)
+ DbPrintf(" ");
+}
+
+void
+PrGuidN(GUID FAR* pguid)
+{
+ DbPrintf("{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
+ pguid->Data1, pguid->Data2, pguid->Data3,
+ pguid->Data4[0], pguid->Data4[1], pguid->Data4[2], pguid->Data4[3],
+ pguid->Data4[4], pguid->Data4[5], pguid->Data4[6], pguid->Data4[7]);
+}
+
+void
+PrGuid(GUID FAR* pguid)
+{
+ PrGuidN(pguid);
+ DbPrintf("\n");
+}
+
+void
+PrTypekindN(TYPEKIND tkind)
+{
+ switch(tkind){
+ case TKIND_ENUM:
+ DbPrintf("TKIND_ENUM");
+ break;
+ case TKIND_RECORD:
+ DbPrintf("TKIND_RECORD");
+ break;
+ case TKIND_MODULE:
+ DbPrintf("TKIND_MODULE");
+ break;
+ case TKIND_INTERFACE:
+ DbPrintf("TKIND_INTERFACE");
+ break;
+ case TKIND_DISPATCH:
+ DbPrintf("TKIND_DISPATCH");
+ break;
+ case TKIND_COCLASS:
+ DbPrintf("TKIND_COCLASS");
+ break;
+ case TKIND_ALIAS:
+ DbPrintf("TKIND_ALIAS");
+ break;
+ case TKIND_UNION:
+ DbPrintf("TKIND_UNION");
+ break;
+ default:
+ DbPrintf("UNKNOWN");
+ break;
+ }
+}
+
+void PrVarkindN(VARKIND vkind)
+{
+ switch(vkind){
+ case VAR_PERINSTANCE:
+ DbPrintf("VAR_PERINSTANCE");
+ break;
+ case VAR_STATIC:
+ DbPrintf("VAR_STATIC");
+ break;
+ case VAR_CONST:
+ DbPrintf("VAR_CONST");
+ break;
+ case VAR_DISPATCH:
+ DbPrintf("VAR_DISPATCH");
+ break;
+ default:
+ DbPrintf("UNKNOWN");
+ }
+}
+
+void
+PrFunckindN(FUNCKIND fkind)
+{
+ switch(fkind){
+ case FUNC_VIRTUAL:
+ DbPrintf("FUNC_VIRTUAL");
+ break;
+ case FUNC_PUREVIRTUAL:
+ DbPrintf("FUNC_PUREVIRTUAL");
+ break;
+ case FUNC_NONVIRTUAL:
+ DbPrintf("FUNC_NONVIRTUAL");
+ break;
+ case FUNC_STATIC:
+ DbPrintf("FUNC_STATIC");
+ break;
+ case FUNC_DISPATCH:
+ DbPrintf("FUNC_DISPATCH");
+ break;
+ default:
+ DbPrintf("UNKNOWN");
+ }
+}
+
+void
+PrInvokekindN(INVOKEKIND invkind)
+{
+ switch(invkind){
+ case INVOKE_FUNC:
+ DbPrintf("INVOKE_FUNC");
+ break;
+ case INVOKE_PROPERTYGET:
+ DbPrintf("INVOKE_PROPERTYGET");
+ break;
+ case INVOKE_PROPERTYPUT:
+ DbPrintf("INVOKE_PROPERTYPUT");
+ break;
+ case INVOKE_PROPERTYPUTREF:
+ DbPrintf("INVOKE_PROPERTYPUTREF");
+ break;
+ default:
+ DbPrintf("UNKNOWN");
+ break;
+ }
+}
+
+void
+PrCallconvN(CALLCONV cc)
+{
+ switch(cc){
+ case CC_CDECL:
+ DbPrintf("CC_CDECL");
+ break;
+ case CC_MSCPASCAL:
+ DbPrintf("CC_MSCPASCAL");
+ break;
+ case CC_MACPASCAL:
+ DbPrintf("CC_MACPASCAL");
+ break;
+ case CC_STDCALL:
+ DbPrintf("CC_STDCALL");
+ break;
+ case CC_RESERVED:
+ DbPrintf("CC_RESERVED");
+ break;
+ default:
+ DbPrintf("UNKNOWN");
+ break;
+ }
+}
+
+void
+PrTypeFlagsN(unsigned short wTypeFlags)
+{
+ DbPrintf("[");
+ if(wTypeFlags & TYPEFLAG_FAPPOBJECT)
+ DbPrintf("AppObject");
+ DbPrintf("]");
+}
+
+void
+PrFuncFlagsN(unsigned short wFuncFlags)
+{
+ DbPrintf("[");
+ if(wFuncFlags & FUNCFLAG_FRESTRICTED)
+ DbPrintf("Restricted");
+ DbPrintf("]");
+}
+
+void
+PrTypedescN(TYPEDESC FAR* ptdesc)
+{
+ DbPrVt(ptdesc->vt);
+
+ switch(ptdesc->vt){
+#if 0 /* REVIEW: NYI */
+ case VT_CARRAY:
+ DbPrintf(" ");
+ PrAdesc(ptdesc->lpadesc);
+ break;
+#endif
+ case VT_PTR:
+ DbPrintf(" ");
+ PrTypedescN(ptdesc->lptdesc);
+ break;
+ case VT_USERDEFINED:
+ DbPrintf(" hreftype=%d", (int)ptdesc->hreftype);
+ break;
+#if 0 /* obsolete */
+ case VT_FIXEDSTRING:
+ DbPrintf(" cbSize=%d", (int)ptdesc->cbSize);
+ break;
+#endif
+ }
+}
+
+void
+PrTdesc(TYPEDESC FAR* ptdesc)
+{
+ PrTypedescN(ptdesc);
+ DbPrintf("\n");
+}
+
+// print the given TYPEATTR
+void
+PrTypeattrXN(TYPEATTR FAR* ptattr, int level)
+{
+ PrTypekindN(ptattr->typekind);
+
+ DbPrintf(" ");
+ PrGuidN(&ptattr->guid);
+
+ DbPrintf("\n");
+ DbIndent(level);
+ DbPrintf("ver=%d.%d lcid=0x%lx",
+ (int)ptattr->wMajorVerNum,
+ (int)ptattr->wMinorVerNum,
+ ptattr->lcid);
+
+ DbPrintf(" cFunc=%d cVar=%d cImpl=%d cbAlign=%d cbInst=%d cbVft=%d",
+ (int)ptattr->cFuncs,
+ (int)ptattr->cVars,
+ (int)ptattr->cImplTypes,
+ (int)ptattr->cbAlignment,
+ (int)ptattr->cbSizeInstance,
+ (int)ptattr->cbSizeVft);
+
+#if 0 /* REVIEW: add support for the following */
+ ptattr->idldescType
+ ptattr->memidConstructor
+ ptattr->memidDestructor
+#endif
+
+ if(ptattr->typekind == TKIND_ALIAS){
+ DbPrintf(" alias=");
+ PrTypedescN(&ptattr->tdescAlias);
+ }
+
+ DbPrintf(" ");
+ PrTypeFlagsN(ptattr->wTypeFlags);
+}
+
+void
+PrTypeattrX(TYPEATTR FAR* ptattr, int level)
+{
+ PrTypeattrXN(ptattr, level);
+ DbPrintf("\n");
+}
+
+void
+PrIdldescN(IDLDESC FAR* pidldesc)
+{
+ UNUSED(pidldesc);
+ // REVIEW: NYI
+}
+
+void
+PrElemdescN(ELEMDESC FAR* pelemdesc)
+{
+ PrTypedescN(&pelemdesc->tdesc);
+#if 0 /* REVIEW: NYI */
+ DbPrintf(" ");
+ PrIdldescN(&pelemdesc->idldesc);
+#endif
+}
+
+void
+PrVardescXN(VARDESC FAR* pvdesc, int level)
+{
+ UNUSED(level);
+
+ DbPrintf("ID(0x%lx) ", (long)pvdesc->memid);
+ PrVarkindN(pvdesc->varkind);
+ DbPrintf(" ");
+ PrElemdescN(&pvdesc->elemdescVar);
+ switch(pvdesc->varkind){
+ case VAR_PERINSTANCE:
+ DbPrintf("oInst=%lu", pvdesc->oInst);
+ break;
+ case VAR_CONST:
+ DbPrintf("value=%Fs", SzOfVarg(pvdesc->lpvarValue));
+ break;
+ case VAR_STATIC:
+ case VAR_DISPATCH:
+ break;
+ }
+}
+
+void
+PrFuncdescXN(FUNCDESC FAR* pfdesc, int level)
+{
+ int i;
+
+ PrFunckindN(pfdesc->funckind);
+
+ DbPrintf(" ID(%ld)", pfdesc->memid);
+
+ DbPrintf(" ");
+ PrInvokekindN(pfdesc->invkind);
+
+ DbPrintf(" ");
+ PrCallconvN(pfdesc->callconv);
+
+ DbPrintf(" oVft=%d", (int)pfdesc->oVft);
+
+ DbPrintf(" cParam=%d(%d)",
+ (int)pfdesc->cParams, (int)pfdesc->cParamsOpt);
+
+ DbPrintf(" ");
+ PrFuncFlagsN(pfdesc->wFuncFlags);
+
+ DbPrintf("\n");
+ DbIndent(level);
+
+ PrElemdescN(&pfdesc->elemdescFunc);
+
+ DbPrintf(" (");
+ if(pfdesc->cParams > 0){
+ for(i = 0;;){
+ PrElemdescN(&pfdesc->lprgelemdescParam[i]);
+ if(++i >= pfdesc->cParams)
+ break;
+ DbPrintf(", ");
+ }
+ }
+ DbPrintf(")");
+}
+
+// helper for PrTi()
+LOCAL HRESULT
+PrMembersX(
+ ITypeInfo FAR* ptinfo,
+ TYPEATTR FAR* ptattr,
+ int fFuncs,
+ int level)
+{
+ int i, num;
+ MEMBERID memid;
+ VARDESC FAR* pvdesc;
+ FUNCDESC FAR* pfdesc;
+ unsigned long dwHelpContext;
+ BSTR bstrName, bstrDoc, bstrHelpFile;
+#if OE_WIN32
+ char buf[256], buf2[256];
+#endif
+ num = fFuncs ? ptattr->cFuncs : ptattr->cVars;
+
+ for(i = 0; i < num; ++i){
+ if(fFuncs){
+ IfFailRet(ptinfo->GetFuncDesc(i, &pfdesc));
+ memid = pfdesc->memid;
+ }else{
+ IfFailRet(ptinfo->GetVarDesc(i, &pvdesc));
+ memid = pvdesc->memid;
+ }
+
+ IfFailRet(ptinfo->GetDocumentation(
+ memid, &bstrName, &bstrDoc, &dwHelpContext, &bstrHelpFile));
+
+ DbIndent(level);
+ DbPrintf("- ");
+ if(fFuncs){
+ PrFuncdescXN(pfdesc, level+2);
+ ptinfo->ReleaseFuncDesc(pfdesc);
+ }else{
+ PrVardescXN(pvdesc, level+2);
+ ptinfo->ReleaseVarDesc(pvdesc);
+ }
+
+ DbPrintf("\n");
+ DbIndent(level+2);
+#if OE_WIN32
+ ConvertStrWtoA(bstrName, buf);
+ DbPrintf("\"%Fs\"", buf);
+#else
+ DbPrintf("\"%Fs\"", bstrName);
+#endif
+
+ DbPrintf(" Doc=\"%Fs\" HelpFile=\"%Fs\" HelpContext=%ld\n",
+#if OE_WIN32
+ bstrDoc == NULL ? "" : ConvertStrWtoA(bstrDoc, buf),
+ bstrHelpFile == NULL ? "" : ConvertStrWtoA(bstrHelpFile, buf2),
+ dwHelpContext);
+#else
+ bstrDoc == NULL ? "" : bstrDoc,
+ bstrHelpFile == NULL ? "" : bstrHelpFile,
+ dwHelpContext);
+#endif
+
+ SysFreeString(bstrName);
+ SysFreeString(bstrDoc);
+ SysFreeString(bstrHelpFile);
+ }
+
+ return NOERROR;
+}
+
+void
+PrTiX(ITypeInfo FAR* ptinfo, int level)
+{
+ int i;
+ HRESULT hresult;
+ HREFTYPE hreftype;
+ TYPEATTR FAR* ptattr;
+ ITypeInfo FAR* ptinfoRef;
+
+
+ // indent based on the given level
+ DbIndent(level);
+
+ DbPrintf("[ ");
+
+ IfFailGo(ptinfo->GetTypeAttr(&ptattr), LError0);
+
+ PrTypeattrX(ptattr, level+2);
+
+ // dump the variables, if any
+ if(ptattr->cVars != 0){
+ IfFailGo(PrMembersX(ptinfo, ptattr, FALSE, level+2), LError1);
+ }
+
+ // dump the functions, if any
+ if(ptattr->cFuncs != 0){
+ IfFailGo(PrMembersX(ptinfo, ptattr, TRUE, level+2), LError1);
+ }
+
+ // dump the referenced type infos, if any
+ if(ptattr->cImplTypes != 0){
+ for(i = 0; i < (int)ptattr->cImplTypes; ++i){
+ if((hresult = ptinfo->GetRefTypeOfImplType(i, &hreftype)) != NOERROR){
+ PrScode(GetScode(hresult));
+ break;
+ }
+ if((hresult = ptinfo->GetRefTypeInfo(hreftype, &ptinfoRef)) != NOERROR){
+ PrScode(GetScode(hresult));
+ break;
+ }
+ PrTiX(ptinfoRef, level+6);
+ ptinfoRef->Release();
+ }
+ }
+
+ DbIndent(level);
+ DbPrintf("]");
+
+LError1:;
+ ptinfo->ReleaseTypeAttr(ptattr);
+
+LError0:;
+ DbPrintf("\n");
+
+ if(hresult != NOERROR){
+ DbPrintf("ERROR: ");
+ PrScode(GetScode(hresult));
+ DbPrintf("\n");
+ }
+}
+
+// print the given TypeInfo
+void
+PrTi(ITypeInfo FAR* ptinfo)
+{
+ PrTiX(ptinfo, 0);
+}
diff --git a/private/oleauto/tests/common/dispdbug.h b/private/oleauto/tests/common/dispdbug.h
new file mode 100644
index 000000000..f6559bd9d
--- /dev/null
+++ b/private/oleauto/tests/common/dispdbug.h
@@ -0,0 +1,66 @@
+/***
+*dispdbug.h - oledisp debug function definitions.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module defines the private oledisp debug support routines.
+*
+*Revision History:
+*
+* [00] 15-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// "printf" to the dbwin debug output window.
+//
+void DbPrintf(char FAR*, ...);
+
+
+// VARTYPE dumpers
+
+TCHAR FAR* DbSzOfVt(VARTYPE);
+void DbPrVt(VARTYPE);
+
+void DbPrData(void FAR*, VARTYPE);
+
+
+// VARIANTARG dumpers
+
+char FAR* SzOfVarg(VARIANTARG FAR*);
+void DbPrVarg(VARIANTARG FAR*);
+
+
+// Excepinfo dumper
+
+void DbPrExcepinfo(EXCEPINFO FAR*);
+#if OE_WIN32 && 0
+void DbPrExcepinfoW(WEXCEPINFO FAR*);
+#endif
+
+// DISPPARAMS dumper
+
+void DbPrParams(DISPPARAMS FAR*);
+
+
+// SCODE dumper
+
+TCHAR FAR* DbSzOfScode(SCODE);
+
+
+// TypeInfo dumpber
+
+void PrTi(ITypeInfo FAR*);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tests/common/disphelp.cpp b/private/oleauto/tests/common/disphelp.cpp
new file mode 100644
index 000000000..3a45ecd17
--- /dev/null
+++ b/private/oleauto/tests/common/disphelp.cpp
@@ -0,0 +1,402 @@
+/***
+*disphelp.cpp - IDispatch helpers
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains several useful IDispatch related utilities.
+*
+*****************************************************************************/
+
+#include <stdarg.h>
+
+#include "common.h"
+#include "disphelp.h"
+
+#if 0 /* { */
+
+/* helper for DispBuildParams */
+HRESULT PASCAL
+CArgsOfFmt(DISPPARAMS FAR* pdispparams, char FAR* szFmt)
+{
+ char FAR* sz;
+
+ pdispparams->cArgs = 0;
+ pdispparams->cNamedArgs = 0;
+
+ if(szFmt == NULL)
+ return NOERROR;
+
+ for(sz = szFmt; *sz != '\0'; ++sz){
+ if(*sz == '&')
+ ++sz;
+
+ switch(*sz){
+ case 'e':
+ case 'n':
+ case 'f':
+ case 'i': case 'I':
+ case 'r': case 'R':
+ case 'c':
+ case 'b':
+ case 's':
+ case 'd':
+ case 'v':
+ case 'D':
+#if OE_WIN32 && 0
+ case 'B': // VT_WBSTR
+ case 'W': // VT_DISPATCHW
+#endif
+ ++pdispparams->cArgs;
+ break;
+
+ default:
+ return RESULT(E_INVALIDARG);
+ }
+ }
+
+ return NOERROR;
+}
+
+
+/* helper for DispBuildParams */
+VARTYPE PASCAL
+VtOfFmtChar(char ch)
+{
+ switch(ch){
+ case 'e': return VT_EMPTY;
+ case 'n': return VT_NULL;
+ case 'f': return VT_BOOL;
+ case 'i': return VT_I2;
+ case 'I': return VT_I4;
+ case 'r': return VT_R4;
+ case 'R': return VT_R8;
+ case 'c': return VT_CY;
+ case 'b': return VT_BSTR;
+ case 's': return VT_ERROR;
+ case 'd': return VT_DATE;
+ case 'v': return VT_VARIANT;
+ case 'U': return VT_UNKNOWN;
+ case 'D': return VT_DISPATCH;
+#if OE_WIN32 && 0
+ case 'B': return VT_WBSTR;
+ case 'W': return VT_DISPATCHW;
+#endif
+ }
+
+ // REVIEW: this is really an error
+ return VT_EMPTY;
+}
+
+
+/***
+*PUBLIC DispBuildParams(DISPPARAMS**, unsigned int, DISPID*, char*, ...)
+*Purpose:
+* Construct a DISPPARAMS struct based on the given format string.
+*
+* '&' = mark the following record VT_BYREF
+*
+* 'e' = VT_EMPTY
+* 'n' = VT_NULL
+* 'f' = VT_BOOL 'f' as in flag
+* 'i' = VT_I2
+* 'I' = VT_I4
+* 'r' = VT_R4
+* 'R' = VT_R8
+* 'c' = VT_CY
+* 'b' = VT_BSTR
+* 's' = VT_ERROR 's' as in scode
+* 'd' = VT_DATE
+* 'v' = VT_VARIANT
+* 'D' = VT_DISPATCH
+* 'U' = VT_UNKNOWN
+* 'B' = VT_BSTR
+* 'W' = VT_DISPATCH
+*
+#
+*Entry:
+* UNDONE
+*
+*Exit:
+* UNDONE
+*
+***********************************************************************/
+extern "C" HRESULT FAR CDECL
+DispBuildParams(
+ DISPPARAMS FAR* FAR* ppdispparams,
+ unsigned int cNamedArgs,
+ DISPID FAR* rgdispid,
+ char FAR* szFmt, ...)
+{
+ int ix;
+ va_list args;
+ char FAR* sz;
+ HRESULT hresult;
+ VARIANTARG FAR* pvarg;
+
+ VARTYPE vt, vtMode;
+ DISPPARAMS FAR* pdispparams;
+
+
+ pdispparams = new DISPPARAMS;
+ if(pdispparams == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ // compute the total number of arguments represented by the format
+ // string, *and* validate the contents of the format string.
+ //
+ if((hresult = CArgsOfFmt(pdispparams, szFmt)) != NOERROR)
+ goto LFreeDispParams;
+
+ // the total number of arguments numst be >= the number of named args.
+ //
+ if(pdispparams->cArgs < cNamedArgs){
+ hresult = RESULT(E_INVALIDARG);
+ goto LFreeDispParams;
+ }
+ pdispparams->cNamedArgs = cNamedArgs;
+
+ pdispparams->rgvarg = new VARIANTARG[pdispparams->cArgs];
+ if((pdispparams->rgvarg) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LFreeDispParams;
+ }
+
+ if(pdispparams->cNamedArgs == 0){
+ pdispparams->rgdispidNamedArgs = NULL;
+ }else{
+ pdispparams->rgdispidNamedArgs = new DISPID[pdispparams->cNamedArgs];
+ if((pdispparams->rgdispidNamedArgs) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LFreeRgVarg;
+ }
+ for(unsigned int i = 0; i < cNamedArgs; ++i)
+ pdispparams->rgdispidNamedArgs[i] = rgdispid[cNamedArgs - i - 1];
+ }
+
+ va_start(args, szFmt);
+ ix = pdispparams->cArgs;
+
+ for(sz = szFmt; *sz != '\0'; ++sz){
+ --ix;
+
+ vtMode = 0;
+ pvarg = &pdispparams->rgvarg[ix];
+
+ if(*sz == '&'){
+ ++sz;
+ vtMode |= VT_BYREF;
+ }
+
+ vt = VtOfFmtChar(*sz);
+
+ if(vtMode & VT_BYREF){
+
+ V_BYREF(pvarg) = va_arg(args, void FAR*);
+
+ }else{
+
+ switch(*sz){
+ case 'e': // VT_EMPTY
+ break;
+
+ case 'n': // VT_NULL
+ V_I4(pvarg) = 0;
+ break;
+
+ case 'I': // VT_I4
+ case 's': // VT_ERROR
+ V_I4(pvarg) = va_arg(args, long);
+ break;
+
+ case 'f': // VT_BOOL
+ case 'i': // VT_I2
+ V_I2(pvarg) = va_arg(args, short);
+ break;
+
+ case 'r': // VT_R4
+ V_R4(pvarg) = (float)va_arg(args, double);
+ break;
+
+ case 'd': // VT_DATE
+ case 'R': // VT_R8
+ V_R8(pvarg) = va_arg(args, double);
+ break;
+
+ case 'c': // VT_CY
+ V_CY(pvarg) = va_arg(args, CY);
+ break;
+
+ case 'b': // VT_BSTR
+ //REVIEW: do we need to make a copy of this?
+ V_BSTR(pvarg) = va_arg(args, BSTR);
+ break;
+
+ case 'v': // VT_VARIANT
+ V_VARIANTREF(pvarg) = va_arg(args, VARIANT FAR*);
+ break;
+
+ case 'U': // VT_UNKNOWN
+ vt = VT_DISPATCH;
+ V_UNKNOWN(pvarg) = va_arg(args, IUnknown FAR*);
+ break;
+
+ case 'D': // VT_DISPATCH
+ vt = VT_DISPATCH;
+ V_DISPATCH(pvarg) = va_arg(args, IDispatch FAR*);
+ break;
+
+#if OE_WIN32 && 0
+ case 'B': // VT_WBSTR
+ //REVIEW: do we need to make a copy of this?
+ V_WBSTR(pvarg) = va_arg(args, WBSTR);
+ break;
+
+
+ case 'W': // VT_DISPATCHW
+ vt = VT_DISPATCHW;
+ V_DISPATCHW(pvarg) = va_arg(args, IDispatchW FAR*);
+ break;
+#endif
+
+ default:
+ hresult = RESULT(E_FAIL);
+ goto LFreeRgVarg;
+ }
+ }
+
+ V_VT(pvarg) = vtMode | vt;
+ }
+
+ *ppdispparams = pdispparams;
+
+ return NOERROR;
+
+
+LFreeRgVarg:;
+ delete pdispparams->rgvarg;
+
+LFreeDispParams:;
+ delete pdispparams;
+
+ return hresult;
+}
+
+/***
+*PUBLIC HRESULT DispFreeParams(DISPPARAMS*)
+*Purpose:
+* Free the given DISPPARAMS struct, and its contents.
+*
+*Entry:
+* pdispparams = the DISPPARAMS structure to free
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+DispFreeParams(DISPPARAMS FAR* pdispparams)
+{
+ unsigned int i;
+ HRESULT hresult;
+
+ for(i = 0; i < pdispparams->cArgs; ++i){
+ if ((hresult = VariantClear(&pdispparams->rgvarg[i])) != NOERROR)
+ return hresult;
+ }
+
+ delete pdispparams->rgvarg;
+ delete pdispparams->rgdispidNamedArgs;
+ delete pdispparams;
+
+ return NOERROR;
+}
+
+#endif /* } */
+
+
+
+/***
+*HRESULT CreateObject(char*, IDispatch **)
+*
+*Purpose:
+* Connect to the IDispatch interface on a *new* instance of a class
+* with the given class ID.
+*
+*Entry:
+* szProgName = the name of the class.
+*
+*Exit:
+* return value = HRESULT
+* NOERROR
+* E_FAIL - couldn't bind (REVIEW: need a better error for this?)
+*
+* *ppdisp = pointer to an IDispatch* if the connect was successful.
+*
+***********************************************************************/
+STDAPI
+CreateObject(OLECHAR FAR* szProgName, IDispatch FAR* FAR* ppdisp)
+{
+ CLSID clsid;
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+
+ // map the given class name to a CLSID
+ //
+ hresult = CLSIDFromProgID(szProgName, &clsid);
+ if(hresult != NOERROR)
+ goto LError0;
+
+
+ // Create an instance of a class with the given CLSID
+ //
+ hresult = CoCreateInstance(
+ clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void FAR* FAR*)&punk);
+ if(hresult != NOERROR)
+ goto LError0;
+
+ // Create the proxies
+ //
+ hresult = punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)ppdisp);
+
+ punk->Release();
+
+LError0:;
+ return hresult;
+}
+
+#if OE_WIN32 && 0
+STDAPI
+CreateObjectW(char FAR* szProgName, IDispatchW FAR* FAR* ppdisp)
+{
+ CLSID clsid;
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+
+ // map the given class name to a CLSID
+ //
+ hresult = CLSIDFromProgID(szProgName, &clsid);
+ if(hresult != NOERROR)
+ goto LError0;
+
+
+ // Create an instance of a class with the given CLSID
+ //
+ hresult = CoCreateInstance(
+ clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void FAR* FAR*)&punk);
+ if(hresult != NOERROR)
+ goto LError0;
+
+ // Create the proxies
+ //
+ hresult = punk->QueryInterface(IID_IDispatchW, (void FAR* FAR*)ppdisp);
+
+ punk->Release();
+
+LError0:;
+ return hresult;
+}
+#endif
diff --git a/private/oleauto/tests/common/disphelp.h b/private/oleauto/tests/common/disphelp.h
new file mode 100644
index 000000000..1ee064fec
--- /dev/null
+++ b/private/oleauto/tests/common/disphelp.h
@@ -0,0 +1,41 @@
+/***
+*disphelp.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+*
+*Purpose:
+* This file defines several IDispatch related utility functions.
+*
+*Implementation Notes:
+* This file requires ole2.h
+*
+*****************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if 0 /* { */
+/* build a DISPPARAMs struct from the given format string and arguments.
+ */
+HRESULT FAR CDECL
+DispBuildParams(
+ DISPPARAMS FAR* FAR* ppdispparams,
+ unsigned int cNamedArgs,
+ DISPID FAR* rgdispid,
+ char FAR* szFmt, ...);
+
+/* free the given DISPPARAMs struct, and its contents.
+ */
+STDAPI
+DispFreeParams(DISPPARAMS FAR* pdispparams);
+
+#endif /* } */
+
+STDAPI
+CreateObject(OLECHAR FAR* szProgID, IDispatch FAR* FAR* ppdisp);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tests/common/dualtst.h b/private/oleauto/tests/common/dualtst.h
new file mode 100644
index 000000000..12ab0c9b4
--- /dev/null
+++ b/private/oleauto/tests/common/dualtst.h
@@ -0,0 +1,81 @@
+/***
+*dualtst.h
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the IDualTst interface.
+*
+*Revision History:
+*
+* [00] 27-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+* Ideally, this would be generated by MkTypLib, but I don't have time
+* to monkey around with the build, so just hard code it for now.
+*
+*****************************************************************************/
+
+interface IDualTst : public IDispatch
+{
+ virtual HRESULT STDMETHODCALLTYPE get_ui1(unsigned char FAR* pui1) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_ui1(unsigned char ui1) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_i2(short FAR* pi2) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_i2(short i2) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_i4(long FAR* pi4) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_i4(long i4) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_r4(float FAR* pr4) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_r4(float r4) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_r8(double FAR* pr8) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_r8(double r8) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_cy(CY FAR* pcy) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_cy(CY cy) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_date(DATE FAR* pdate) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_date(DATE date) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_bstr(BSTR FAR* pbstr) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_bstr(BSTR bstr) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_disp(IDispatch FAR* FAR* ppdisp) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_disp(IDispatch FAR* pdisp) PURE;
+ virtual HRESULT STDMETHODCALLTYPE putref_disp(IDispatch FAR* pdisp) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE get_var(VARIANT FAR* pvar) PURE;
+ virtual HRESULT STDMETHODCALLTYPE put_var(VARIANT var) PURE;
+ virtual HRESULT STDMETHODCALLTYPE putref_var(VARIANT var) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE m0(unsigned char ui1,
+ short i2,
+ long i4,
+ float r4,
+ double r8,
+ CY cy,
+ DATE date,
+ BSTR bstr,
+ IDispatch FAR* pdisp,
+ VARIANT var) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE m1(unsigned char FAR* pui1,
+ short FAR* pi2,
+ long FAR* pi4,
+ float FAR* pr4,
+ double FAR* pr8,
+ CY FAR* pcy,
+ DATE FAR* pdate,
+ BSTR FAR* pbstr,
+ IDispatch FAR* FAR* ppdisp,
+ VARIANT FAR* pvar) PURE;
+
+ virtual HRESULT STDMETHODCALLTYPE raise(long error,
+ BSTR bstrSource,
+ BSTR bstrDescription,
+ long dwHelpContest,
+ BSTR bstrHelpFile) PURE;
+};
diff --git a/private/oleauto/tests/common/nlshelp.cpp b/private/oleauto/tests/common/nlshelp.cpp
new file mode 100644
index 000000000..56faf5958
--- /dev/null
+++ b/private/oleauto/tests/common/nlshelp.cpp
@@ -0,0 +1,131 @@
+/***
+*nlshelp.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+* This module implements Ansi NLS wrapper functions for WIN32
+*
+*Revision History:
+*
+* [00] 30-Jun-93 tomteng: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "common.h"
+
+ASSERTDATA
+
+
+
+#if OE_WIN32 && 0 /* defined as part of Daytona */
+
+//---------------------------------------------------------------------
+// ASCII NLS Wrapper Functions (for Win32)
+//---------------------------------------------------------------------
+
+
+const unsigned int MAX_BUFSIZE = 512;
+
+// REVIEW: The code page used in the MultiByteToWideChar & WideCharToMultByte
+// functions should really be the primary code page assoicated with
+// the inputed lcid instead of the default Ansi code page (CP_ACP).
+// Need to correct this.
+
+
+extern "C"
+int CompareStringA(
+ LCID lcid,
+ unsigned long dwFlags,
+ LPSTR lpStr1, int cch1,
+ LPSTR lpStr2, int cch2)
+{
+ WCHAR lpwStr1[MAX_BUFSIZE], lpwStr2[MAX_BUFSIZE];
+
+
+ //ASSERT(((cch1 < MAX_BUFSIZE) && (cch2 < MAX_BUFSIZE)));
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ lpStr1, cch1, lpwStr1, MAX_BUFSIZE);
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ lpStr2, cch2, lpwStr2, MAX_BUFSIZE);
+ return(CompareStringW(lcid, dwFlags, lpwStr1, cch1, lpwStr2, cch2));
+}
+
+
+extern "C"
+int LCMapStringA(
+ LCID lcid,
+ unsigned long dwMapFlags,
+ const char FAR* lpSrcStr,
+ int cchSrc,
+ char FAR* lpDestStr,
+ int cchDest)
+{
+ WCHAR lpwSrcStr[MAX_BUFSIZE], lpwDestStr[MAX_BUFSIZE];
+ int result;
+ BOOL badConversion = FALSE;
+
+
+ //ASSERT(((cchSrc < MAX_BUFSIZE) && (cchDest < MAX_BUFSIZE)));
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ lpSrcStr, cchSrc, lpwSrcStr, MAX_BUFSIZE);
+ result = LCMapStringW(lcid, dwMapFlags,
+ lpwSrcStr, cchSrc,
+ lpwDestStr, cchDest);
+ WideCharToMultiByte(CP_ACP, NULL,
+ lpwDestStr, -1,
+ lpDestStr, cchDest,
+ NULL, &badConversion);
+ if (badConversion)
+ return 0;
+
+ return result;
+}
+
+
+extern "C"
+int GetLocaleInfoA(
+ LCID lcid,
+ LCTYPE lcType,
+ char FAR* lpStr,
+ int cch)
+{
+ WCHAR lpwStr[MAX_BUFSIZE];
+ int result;
+ BOOL badConversion = FALSE;
+
+ //ASSERT(cch < MAX_BUFSIZE);
+ result = GetLocaleInfoW(lcid, lcType, lpwStr, MAX_BUFSIZE);
+ WideCharToMultiByte(CP_ACP, NULL,
+ lpwStr, -1,
+ lpStr, cch,
+ NULL, &badConversion);
+ if (badConversion)
+ return 0;
+
+ return result;
+}
+
+
+extern "C"
+int GetStringTypeA(
+ LCID lcid,
+ unsigned long dwInfoType,
+ const char FAR* lpSrcStr,
+ int cch,
+ unsigned short FAR* lpChar)
+{
+ // Currently not used internally within OLEDI32.DLL
+ UNUSED(lcid);
+ UNUSED(dwInfoType);
+ UNUSED(lpSrcStr);
+ UNUSED(cch);
+ UNUSED(lpChar);
+ return 0;
+}
+
+#endif
diff --git a/private/oleauto/tests/common/statbar.cpp b/private/oleauto/tests/common/statbar.cpp
new file mode 100644
index 000000000..4959201c7
--- /dev/null
+++ b/private/oleauto/tests/common/statbar.cpp
@@ -0,0 +1,374 @@
+/***
+*statbar.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "common.h"
+#include "statbar.h"
+
+
+extern "C" long FAR PASCAL StatBarWndProc(HWND, UINT, WPARAM, LPARAM);
+
+
+TCHAR FAR* CStatBar::m_szWndClass = TSTR("StatBarWndClass");
+
+
+CStatBar::CStatBar()
+{
+ m_refs = 0;
+
+ m_x = 0;
+ m_y = 0;
+ m_width = 0;
+ m_height = 0;
+
+ m_bstrMsg = NULL;
+
+ m_hfont = (HFONT)0;
+}
+
+CStatBar::~CStatBar()
+{
+ SysFreeString(m_bstrMsg);
+}
+
+
+/***
+*PUBLIC CStatBar FAR* CStatBar::Create(HANDLE, HWND)
+*
+*Purpose:
+*
+*Entry:
+*
+*Exit:
+*
+***********************************************************************/
+CStatBar FAR*
+CStatBar::Create(HANDLE hinst, HWND hwndFrame)
+{
+ CStatBar FAR* psb;
+
+ psb = new FAR CStatBar();
+ if(psb == NULL)
+ return NULL;
+ psb->AddRef();
+
+ if(!psb->Register(hinst))
+ goto LFail;
+
+ psb->m_hwnd = CreateWindow(
+ CStatBar::m_szWndClass,
+ NULL,
+ WS_CHILD | WS_CLIPSIBLINGS,
+ 0, 0, 0, 0,
+ hwndFrame,
+ 0,
+ (HINSTANCE)hinst,
+ NULL);
+
+ if(!psb->m_hwnd)
+ goto LFail;
+
+ // Stash the newly created CStatBar* in the extra bytes of the
+ // associated window so we can get at the instance in the message
+ // proc.
+ //
+ // Note: we do not AddRef for this reference. We make sure that the
+ // window is destroyed when the refcnt goes to 0.
+ //
+ SetWindowLong(psb->m_hwnd, 0, (LONG)psb);
+
+ return psb;
+
+LFail:;
+ delete psb;
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CStatBar::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ *ppv = (void FAR*)NULL;
+ return ResultFromScode(E_NOINTERFACE);
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStatBar::AddRef(void)
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CStatBar::Release(void)
+{
+ if(--m_refs == 0){
+
+ // destroy the status bar window.
+ //
+ SendMessage(m_hwnd, WM_DESTROY, 0, 0L);
+
+ delete this;
+ return 0;
+ }
+
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// Introduced Methods
+//---------------------------------------------------------------------
+
+
+/***
+*PRIVATE BOOL CStatBar::Register(HANDLE)
+*
+*Purpose:
+* Register the status bar window class.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = BOOL, TRUE if successful, FALSE if not.
+*
+***********************************************************************/
+BOOL
+CStatBar::Register(HANDLE hinst)
+{
+ WNDCLASS wc;
+
+ // register the class, unless already registered.
+ if(GetClassInfo((HINSTANCE)hinst, m_szWndClass, &wc) == 0){
+ wc.style = 0;
+ wc.lpfnWndProc = StatBarWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = sizeof(CStatBar FAR*);
+ wc.hInstance = (HINSTANCE)hinst;
+ wc.hIcon = 0;
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
+ wc.lpszMenuName = 0;
+ wc.lpszClassName = CStatBar::m_szWndClass;
+ if(!RegisterClass(&wc))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/***
+*PUBLIC void CStatBar::Show(void)
+*
+*Purpose:
+* Show the status bar window associated with this CStatBar instance.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CStatBar::Show()
+{
+ ShowWindow(m_hwnd, SW_SHOW);
+}
+
+void
+CStatBar::SetFont(HFONT hfont)
+{
+ HDC hdc;
+ TEXTMETRIC tm;
+ HFONT hfontOld;
+
+ // compute the character sizes given this new font.
+ //
+ hdc = GetDC(m_hwnd);
+ hfontOld = (HFONT)SelectObject(hdc, hfont);
+ GetTextMetrics(hdc, &tm);
+ m_dxFont = tm.tmAveCharWidth;
+ m_dyFont = tm.tmHeight + tm.tmExternalLeading;
+ SelectObject(hdc, hfontOld);
+ ReleaseDC(m_hwnd, hdc);
+
+ m_hfont = hfont;
+}
+
+/***
+*PRIVATE CStatBar::WMPaint(void)
+*
+*Purpose:
+* This method is responsible for drawing the status bar, and is called
+* in response to a WM_PAINT message.
+*
+*Entry:
+* None
+*
+*Exit:
+* None
+*
+***********************************************************************/
+void
+CStatBar::WMPaint()
+{
+ HDC hdc;
+ RECT rcMsg;
+ HRGN hrgn;
+ HFONT hfontOld;
+ PAINTSTRUCT ps;
+ HPEN hpenBlack, hpenWhite, hpenGray, hpenOld;
+
+ hdc = BeginPaint(m_hwnd, &ps);
+
+ // compute the message box rect
+ //
+ rcMsg.top = 3;
+ rcMsg.bottom= m_height - 3;
+ rcMsg.left = m_dxFont;
+ rcMsg.right = m_width - m_dxFont;
+
+ // prepare the pens
+ //
+ hpenWhite = (HPEN)GetStockObject(WHITE_PEN);
+ hpenBlack = (HPEN)GetStockObject(BLACK_PEN);
+ hpenGray = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
+
+ // draw a top gray line
+ //
+ hpenOld = (HPEN)SelectObject(hdc, hpenGray);
+#if defined(WIN16)
+ MoveTo(hdc, ps.rcPaint.left, 0);
+#elif defined(WIN32)
+ MoveToEx(hdc, ps.rcPaint.left, 0, NULL);
+#endif
+ LineTo(hdc, ps.rcPaint.right, 0);
+
+ // draw a white line just under
+ //
+ SelectObject(hdc, hpenWhite);
+#if defined(WIN16)
+ MoveTo(hdc, ps.rcPaint.left, 1);
+#elif defined(WIN32)
+ MoveToEx(hdc, ps.rcPaint.left, 1, NULL);
+#endif
+ LineTo(hdc, ps.rcPaint.right, 1);
+
+ // do not overwrite the background color
+ //
+ SetBkMode(hdc, TRANSPARENT);
+
+ // message area
+ //
+ SelectObject(hdc, hpenBlack);
+#if defined(WIN16)
+ MoveTo(hdc, rcMsg.left, rcMsg.bottom);
+#elif defined(WIN32)
+ MoveToEx(hdc, rcMsg.left, rcMsg.bottom, NULL);
+#endif
+ LineTo(hdc, rcMsg.left, rcMsg.top);
+ LineTo(hdc, rcMsg.right, rcMsg.top);
+
+ SelectObject(hdc, hpenWhite);
+ LineTo(hdc, rcMsg.right, rcMsg.bottom);
+ LineTo(hdc, rcMsg.left, rcMsg.bottom);
+
+ // select the black pen for writing
+ //
+ SelectObject(hdc, hpenBlack);
+
+ // select the status bar font to write in
+ //
+ hfontOld = (HFONT)SelectObject(hdc, m_hfont);
+
+ // set the clipping region
+ //
+ hrgn = CreateRectRgn(
+ rcMsg.left, rcMsg.top, rcMsg.right, rcMsg.bottom);
+
+ SelectClipRgn(hdc, hrgn);
+
+ // draw the status message
+ //
+ TextOut(
+ hdc,
+ rcMsg.left + (m_dxFont / 2),
+ rcMsg.top + ((rcMsg.bottom - rcMsg.top - m_dyFont) / 2),
+ STRING(m_bstrMsg), SysStringLen(m_bstrMsg));
+
+ // cleanup
+ //
+ SelectObject(hdc, hpenOld);
+ SelectObject(hdc, hfontOld);
+
+ DeleteObject(hrgn);
+ DeleteObject(hpenGray);
+
+ EndPaint(m_hwnd, &ps);
+}
+
+extern "C" long FAR PASCAL
+StatBarWndProc(
+ HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ CStatBar FAR* psb;
+
+ switch(message){
+ case WM_SIZE:
+ return 0;
+ case WM_PAINT:
+ psb = (CStatBar FAR*)GetWindowLong(hwnd, 0);
+ psb->WMPaint();
+ return 0;
+ }
+ return(DefWindowProc(hwnd, message, wParam, lParam));
+}
+
+
+//---------------------------------------------------------------------
+// Status Bar Utilities
+//---------------------------------------------------------------------
+
+extern "C" void
+SBprintf(CStatBar FAR* psb, char FAR* szFmt, ...)
+{
+ va_list args;
+static char buf[1024];
+
+ va_start(args, szFmt);
+#if defined(WIN32)
+ wvsprintfA(buf, szFmt, args);
+#else
+ wvsprintf(buf, szFmt, args);
+#endif
+ psb->SetText(buf);
+ psb->Update();
+}
diff --git a/private/oleauto/tests/common/statbar.h b/private/oleauto/tests/common/statbar.h
new file mode 100644
index 000000000..f47d8607b
--- /dev/null
+++ b/private/oleauto/tests/common/statbar.h
@@ -0,0 +1,147 @@
+/***
+*statbar.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Implementation Notes:
+* This file requires windows.h and ole2.h
+*
+*****************************************************************************/
+
+class CStatBar : public IUnknown {
+public:
+ static CStatBar FAR* Create(HANDLE hinst, HWND hwndFrame);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // Introduced methods
+ //
+ void Show(void);
+ inline void Move(void);
+ inline void Update(void);
+
+ inline int GetX(void);
+ inline void SetX(int x);
+
+ inline int GetY(void);
+ inline void SetY(int y);
+
+ inline int GetHeight(void);
+ inline void SetHeight(int height);
+
+ inline int GetWidth(void);
+ inline void SetWidth(int width);
+
+ //inline HFONT GetFont(void);
+ void SetFont(HFONT hfont);
+
+ //char FAR* GetText(void);
+ inline void SetText(char FAR* sz);
+
+ void WMPaint(void);
+ BOOL Register(HANDLE);
+
+private:
+ CStatBar();
+ ~CStatBar();
+
+ unsigned long m_refs;
+
+ HWND m_hwnd; // the status bar window handle
+
+ int m_x; // x coordinate of upper left corner
+ int m_y; // y coordinate of upper left corner
+ int m_height;
+ int m_width;
+
+ HFONT m_hfont;
+ int m_dyFont; // font height
+ int m_dxFont; // font width
+
+ BSTR m_bstrMsg; // the status bar text
+
+ static TCHAR FAR* m_szWndClass;
+};
+
+inline void
+CStatBar::Move()
+{
+ MoveWindow(m_hwnd, m_x, m_y, m_width, m_height, TRUE);
+}
+
+inline void
+CStatBar::Update()
+{
+ InvalidateRect(m_hwnd, NULL, TRUE);
+ UpdateWindow(m_hwnd);
+}
+
+inline int
+CStatBar::GetX()
+{
+ return m_x;
+}
+
+inline void
+CStatBar::SetX(int x)
+{
+ m_x = x;
+}
+
+inline int
+CStatBar::GetY(void)
+{
+ return m_y;
+}
+
+inline void
+CStatBar::SetY(int y)
+{
+ m_y = y;
+}
+
+inline int
+CStatBar::GetHeight(void)
+{
+ return m_height;
+}
+
+inline void
+CStatBar::SetHeight(int height)
+{
+ m_height = height;
+}
+
+inline int
+CStatBar::GetWidth(void)
+{
+ return m_width;
+}
+
+inline void
+CStatBar::SetWidth(int width)
+{
+ m_width = width;
+}
+
+inline void
+CStatBar::SetText(char FAR* sz)
+{
+ SysFreeString(m_bstrMsg);
+#if OE_WIN32
+ OLECHAR buf[256];
+ m_bstrMsg = SysAllocString(ConvertStrAtoW(sz, buf));
+#else
+ m_bstrMsg = SysAllocString(sz);
+#endif
+}
+
+extern "C" void
+SBprintf(CStatBar FAR* psb, char FAR* szFmt, ...);
diff --git a/private/oleauto/tests/common/testhelp.cpp b/private/oleauto/tests/common/testhelp.cpp
new file mode 100644
index 000000000..b0303a85d
--- /dev/null
+++ b/private/oleauto/tests/common/testhelp.cpp
@@ -0,0 +1,1252 @@
+/***
+*testhelp.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file contains IDispatch test helpers.
+*
+*
+*Revision History:
+*
+* [00] 09-Nov-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "common.h"
+#include "dispdbug.h"
+
+#include "testhelp.h"
+#include "cunk.h"
+#include "cdisp.h"
+
+ASSERTDATA
+
+
+//---------------------------------------------------------------------
+// BSTR Helpers
+//---------------------------------------------------------------------
+
+
+/***
+*PUBLIC BuildBstr(BSTR*, ...)
+*Purpose:
+* Build a BSTR that is a concatination of the given list of strings.
+*
+*Entry:
+* ...
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* E_OUTOFMEMORY
+*
+* *pbstr = pointer to the constructed BSTR
+*
+***********************************************************************/
+extern "C" CDECL_(HRESULT)
+BuildBstr(BSTR FAR* pbstr, OLECHAR FAR* szName)
+{
+ *pbstr = SysAllocString(szName);
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// VARIANT Utilities
+//---------------------------------------------------------------------
+
+
+/***
+*HRESULT VariantClearAll
+*Purpose:
+* Release the given variang, and if its a ByRef also release any
+* resources it may be pointing at.
+*
+*Entry:
+* pvarg = the variant to clear
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+VariantClearAll(VARIANTARG FAR* pvarg)
+{
+ HRESULT hresult;
+
+ if(V_ISBYREF(pvarg)){
+ switch(V_VT(pvarg) & ~VT_BYREF){
+ case VT_BSTR:
+ SysFreeString(*V_BSTRREF(pvarg));
+ break;
+ case VT_ARRAY:
+ hresult = SafeArrayDestroy(*V_ARRAYREF(pvarg));
+ ASSERT(hresult == NOERROR);
+ break;
+ case VT_UNKNOWN:
+ if(*V_UNKNOWNREF(pvarg) != NULL)
+ (*V_UNKNOWNREF(pvarg))->Release();
+ break;
+ case VT_DISPATCH:
+ if(*V_DISPATCHREF(pvarg) != NULL)
+ (*V_DISPATCHREF(pvarg))->Release();
+ break;
+ }
+ }
+
+ return VariantClear(pvarg);
+}
+
+
+extern "C" int
+VariantCompare(VARIANT FAR* pvarLeft, VARIANT FAR* pvarRight)
+{
+ void FAR* pvLeft, FAR* pvRight;
+
+ if(V_VT(pvarLeft) != V_VT(pvarRight))
+ return FALSE;
+
+ if(V_ISBYREF(pvarLeft)){
+ pvLeft = V_BYREF(pvarLeft);
+ pvRight = V_BYREF(pvarRight);
+ }else{
+ pvLeft = (void FAR*)&V_NONE(pvarLeft);
+ pvRight = (void FAR*)&V_NONE(pvarRight);
+ }
+
+ switch(V_VT(pvarLeft) & ~VT_BYREF){
+#if VBA2
+ case VT_UI1:
+ return *(unsigned char FAR*)pvLeft == *(unsigned char FAR*)pvRight;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ return *(short FAR*)pvLeft == *(short FAR*)pvRight;
+
+ case VT_I4:
+ case VT_ERROR:
+ return *(long FAR*)pvLeft == *(long FAR*)pvRight;
+
+ case VT_R4:
+ return *(float FAR*)pvLeft == *(float FAR*)pvRight;
+
+ case VT_R8:
+ case VT_DATE:
+ return *(double FAR*)pvLeft == *(double FAR*)pvRight;
+
+ case VT_CY:
+ return(((CY FAR*)pvLeft)->Hi == ((CY FAR*)pvRight)->Hi
+ && ((CY FAR*)pvLeft)->Lo == ((CY FAR*)pvRight)->Lo);
+
+ case VT_BSTR:
+ return !STRCMP(STRING(*((BSTR FAR*)pvLeft)),
+ STRING(*((BSTR FAR*)pvRight)));
+
+ default:
+ ASSERT(UNREACHED);
+ }
+ return FALSE;
+}
+
+
+#if 0
+
+/***
+*VARIANTARG VariantCreate(VARTYPE, ...)
+*Purpose:
+* Build and return a VARIANTARG using the given VARTYPE and value.
+*
+*Entry:
+* vt = the VARTYPE of the variant to create.
+*
+*Exit:
+* return value = VARIANTARG. The constructed VARIANTARG, returned by value.
+*
+***********************************************************************/
+extern "C" VARIANTARG
+VariantCreate(VARTYPE vt, ...)
+{
+ OLECHAR FAR* sz;
+ va_list args;
+ HRESULT hresult;
+ VARIANTARG varg;
+
+ va_start(args, vt);
+
+ V_VT(&varg) = vt;
+
+ switch(vt & ~(VT_BYREF)){
+ case VT_EMPTY:
+ break;
+
+ case VT_NULL:
+ V_I4(&varg) = 0L;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ V_UI1(&varg) = va_arg(args, unsigned char);
+#endif //VBA2
+
+ case VT_I2:
+ V_I2(&varg) = va_arg(args, short);
+ break;
+
+ case VT_BOOL:
+ V_BOOL(&varg) = va_arg(args, short);
+ break;
+
+ case VT_I4:
+ V_I4(&varg) = va_arg(args, long);
+ break;
+
+ case VT_ERROR:
+ V_ERROR(&varg) = va_arg(args, long);
+ break;
+
+ case VT_R4:
+ V_R4(&varg) = (float)va_arg(args, double);
+ break;
+
+ case VT_R8:
+ V_R8(&varg) = va_arg(args, double);
+ break;
+
+ case VT_DATE:
+ V_DATE(&varg) = va_arg(args, double);
+ break;
+
+ case VT_CY:
+ V_CY(&varg) = va_arg(args, CY);
+ break;
+
+ case VT_BSTR:
+ sz = va_arg(args, OLECHAR FAR*);
+ V_BSTR(&varg) = SysAllocString(sz);
+ break;
+
+ case VT_UNKNOWN:
+ hresult = CUnk::Create(&V_UNKNOWN(&varg));
+ ASSERT(hresult == NOERROR);
+ break;
+
+ case VT_DISPATCH:
+ hresult = CDisp::Create(&V_DISPATCH(&varg));
+ ASSERT(hresult == NOERROR);
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ break;
+ }
+
+ if(V_ISBYREF(&varg)){
+ VARIANT FAR* pvarRef = va_arg(args, VARIANT FAR*);
+ *pvarRef = varg;
+ V_BYREF(&varg) = &V_NONE(pvarRef);
+ }
+
+ return varg;
+}
+
+#endif
+
+
+//---------------------------------------------------------------------
+// SafeArray Helpers
+//---------------------------------------------------------------------
+
+
+/***
+*PUBLIC HRESULT first_element(unsigned int, SAFEARRAYBOUND*, long*)
+*Purpose:
+* Initialize the given array indices from the given SAFEARRAYBOUNDS.
+*
+*Entry:
+* cDims = count of array dimentions
+* rgsabound = the SafeArray bounds
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+*
+* rgIndices = indices initialized to the first element of the array
+*
+***********************************************************************/
+extern "C" HRESULT
+first_element(
+ unsigned int cDims,
+ SAFEARRAYBOUND FAR* rgsabound,
+ long FAR* rgIndices)
+{
+ unsigned int i;
+
+ for(i = 0; i < cDims; ++i)
+ rgIndices[i] = rgsabound[cDims-i-1].lLbound;
+
+ return NOERROR;
+}
+
+
+/***
+*PUBLIC HRESULT next_element(unsigned int, SAFEARRAYBOUND*, long*)
+*Purpose:
+* Increment the given array indices to address the next element in
+* the array (if there is one).
+*
+*Entry:
+* cDims = count of array dimentions
+* rgsabound = the SafeArray bounds
+* rgIndices = current array index
+*
+*Exit:
+* return value = HRESULT,
+* S_OK
+* S_FALSE - no more elements
+*
+***********************************************************************/
+extern "C" HRESULT
+next_element(
+ unsigned int cDims,
+ SAFEARRAYBOUND FAR* rgsabound,
+ long FAR* rgIndices)
+{
+ int i, iRev;
+ long ubound;
+
+ for(i = 0; i < (int)cDims; ++i){
+ // the bounds are stored in reverse-textual order in the descriptor
+ iRev = cDims-i-1;
+ ubound = rgsabound[iRev].lLbound + rgsabound[iRev].cElements;
+ if(++rgIndices[i] < ubound)
+ return NOERROR;
+ rgIndices[i] = rgsabound[iRev].lLbound;
+ }
+ return RESULT(S_FALSE);
+}
+
+
+/***
+*PUBLIC long LongOfIndices(unsigned int, long*)
+*Purpose:
+* return a long that is a function of the given array of indices.
+*
+*Entry:
+* cDims = count of dimentions in the array
+* rgIndices = an array of indices
+*
+*Exit:
+* return value = long, sum of array indices
+*
+***********************************************************************/
+extern "C" long
+LongOfIndices(unsigned int cDims, long FAR* rgIndices)
+{
+ unsigned int i;
+ long l;
+ short s;
+
+ l = 0L;
+ for(i = 0; i < cDims; ++i){
+ l *= 10;
+ l += rgIndices[i];
+ }
+
+ s = (short)l;
+
+ return (long)s;
+}
+
+
+/***
+*PUBLIC HRESULT SafeArrayCreateIdentity(VARTYPE, SARRAYDESC*, SAFEARRAY**)
+*Purpose:
+* Build an "identity" SafeArray of the given VARTYPE, where we define
+* an identity array to be an array whose elements, when coerced to
+* VT_I4 are equal to the sum of the elements array indices.
+*
+*Entry:
+* vt = the VARTYPE of the SafeArray we are to construct
+* psarraydesc = pointer to structure describing shape of the SafeArray
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppsa = SAFEARRAY FAR*
+*
+***********************************************************************/
+extern "C" HRESULT
+SafeArrayCreateIdentity(
+ VARTYPE vt,
+ SARRAYDESC FAR* psarraydesc,
+ SAFEARRAY FAR* FAR* ppsa)
+{
+ unsigned int cDims;
+ void FAR* pv;
+ HRESULT hresult;
+ SAFEARRAY FAR* psa;
+ VARIANT varI4, var;
+ long FAR* rgIndices;
+ SAFEARRAYBOUND FAR* rgsabound;
+
+ // verify (and possibly adjust) the given VARTYPE.
+ switch(vt){
+ case VT_DATE:
+ vt = VT_R8; // REVIEW: no date coersions yet, so treat it like R8
+ break;
+ case VT_ERROR:
+ vt = VT_I4; // cannot convert to/from error, so treat like I4
+ break;
+#if VBA2
+ case VT_UI1:
+#endif //VBA2
+ case VT_I2:
+ case VT_I4:
+ case VT_R4:
+ case VT_R8:
+ case VT_CY:
+ case VT_BSTR:
+ case VT_BOOL:
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+ case VT_VARIANT:
+ break;
+ default:
+ // unsupported/unknown VARTYPE
+ return RESULT(DISP_E_BADVARTYPE);
+ }
+
+ cDims = psarraydesc->cDims;
+ rgsabound = psarraydesc->rgsabound;
+
+ psa = SafeArrayCreate(vt, cDims, rgsabound);
+ if(psa == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ rgIndices = new FAR long[cDims];
+ if(rgIndices == NULL)
+ goto LError0;
+
+ VariantInit(&var);
+ for(hresult = first_element(cDims, psa->rgsabound, rgIndices);
+ hresult == NOERROR;
+ hresult = next_element(cDims, psa->rgsabound, rgIndices))
+ {
+ V_VT(&varI4) = VT_I4;
+ V_I4(&varI4) = LongOfIndices(cDims, rgIndices);
+
+ VariantInit(&var);
+ switch(vt){
+ case VT_CY:
+ // REVIEW: until we have coersions to/from variant
+ V_VT(&var) = vt;
+ V_CY(&var).Lo = V_I4(&varI4);
+ V_CY(&var).Hi = V_I4(&varI4);
+ pv = (void FAR*)&V_NONE(&var);
+ goto LPutElement;
+
+ case VT_BSTR:
+ IfFailGo(VariantChangeType(&var, &varI4, 0, VT_BSTR), LError1);
+ pv = (void FAR*)V_BSTR(&var);
+ goto LPutElement;
+
+ case VT_UNKNOWN:
+ V_VT(&var) = vt;
+ IfFailGo(CUnk::Create(&V_UNKNOWN(&var)), LError1);
+ pv = (void FAR*)V_UNKNOWN(&var);
+ goto LPutElement;
+
+ case VT_DISPATCH:
+ V_VT(&var) = vt;
+ IfFailGo(CDisp::Create(&V_DISPATCH(&var)), LError1);
+ pv = (void FAR*)V_DISPATCH(&var);
+ goto LPutElement;
+
+ case VT_VARIANT:
+ pv = (void FAR*)&varI4;
+ goto LPutElement;
+
+ default:
+#if VBA2
+ // hack to keep the test passing. Using 254 instead of 255 because
+ // of increment/decrement tests
+ if (vt == VT_UI1 && (unsigned long)V_I4(&varI4) > 254) {
+ V_I4(&varI4) = 254;
+ }
+#endif //VBA2
+ IfFailGo(VariantChangeType(&var, &varI4, 0, vt), LError1);
+ pv = (void FAR*)&V_NONE(&var);
+ /* FALLTHROUGH */
+
+LPutElement:;
+ IfFailGo(SafeArrayPutElement(psa, rgIndices, pv), LError1);
+ hresult = VariantClear(&var);
+ ASSERT(hresult == NOERROR);
+ break;
+ }
+ }
+
+ if(HRESULT_FAILED(hresult))
+ goto LError1;
+
+ delete rgIndices;
+
+ *ppsa = psa;
+
+ return hresult;
+
+LError1:;
+ delete rgIndices;
+
+LError0:;
+ SafeArrayDestroy(psa);
+ *ppsa = NULL;
+
+ return hresult;
+}
+
+
+/***
+*HRESULT SafeArrayValidateIdentity(VARTYPE, SAFEARRAY*, long)
+*Purpose:
+* Verify that the given SafeArray is an identity array (as we
+* have defined it.
+*
+*Entry:
+* vt = the VARTYPE of the array
+* psa = pointer to the SafeArray descriptor
+* offset = the ammount each element is supposed to be off from
+* its 'identity' value.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+extern "C" HRESULT
+SafeArrayValidateIdentity(VARTYPE vt, SAFEARRAY FAR* psa, long offset)
+{
+ void FAR* pv;
+ HRESULT hresult;
+ long FAR* pIndices;
+ VARIANTARG varGet, varBaseline;
+
+ switch(vt){
+ case VT_DATE:
+ vt = VT_R8; // REVIEW: no date coersions yet, so pretend...
+ goto LCommon;
+
+ case VT_ERROR:
+ vt = VT_I4;
+ goto LCommon;
+
+#if VBA2
+ case VT_UI1:
+#endif //VBA2
+ case VT_I2:
+ case VT_I4:
+ case VT_R4:
+ case VT_R8:
+ case VT_CY:
+ case VT_BSTR:
+ case VT_BOOL:
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+
+LCommon:;
+ pv = &V_NONE(&varGet);
+ break;
+
+ case VT_VARIANT:
+ pv = &varGet;
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ break;
+ }
+
+ pIndices = new FAR long[psa->cDims];
+ if(pIndices == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ VariantInit(&varGet);
+ VariantInit(&varBaseline);
+ for(hresult = first_element(psa->cDims, psa->rgsabound, pIndices);
+ hresult == NOERROR;
+ hresult = next_element(psa->cDims, psa->rgsabound, pIndices))
+ {
+ // build the reference variant
+ V_VT(&varBaseline) = VT_I4;
+ V_I4(&varBaseline) = LongOfIndices(psa->cDims, pIndices) + offset;
+
+ // extract the data from the current index
+ //
+ IfFailGo(SafeArrayGetElement(psa, pIndices, pv), LError0);
+
+ if(vt != VT_VARIANT)
+ V_VT(&varGet) = vt;
+
+ // compare the extracted data against our reference.
+ switch(vt){
+ case VT_CY:
+ // REVIEW: special case CY until we have rt coersions.
+ if (V_CY(&varGet).Hi != V_I4(&varBaseline)
+ || V_CY(&varGet).Lo != (unsigned long)V_I4(&varBaseline))
+ hresult = RESULT(E_FAIL);
+ break;
+
+ case VT_VARIANT:
+ IfFailGo(
+ VariantChangeType(&varBaseline, &varBaseline, 0, V_VT(&varGet)),
+ LError0);
+ goto LCmp;
+
+ case VT_BOOL:
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+#if OE_WIN32 && 0
+ case VT_DISPATCHW:
+#endif
+ // REVIEW: havn't figured a good test for these yet...
+ break;
+
+#if VBA2
+ case VT_UI1:
+ if (V_UI1(&varGet) >= 254)
+ goto DoneCheck; // possible overflow, so don't check
+ // fall through to check
+#endif //VBA2
+
+ default:
+ // coerce the baseline to the type of the extracted data.
+ IfFailGo(
+ VariantChangeType(&varBaseline, &varBaseline, 0, vt), LError0);
+LCmp:;
+ if(!VariantCompare(&varGet, &varBaseline))
+ hresult = RESULT(E_FAIL);
+ }
+
+DoneCheck:
+ VariantClear(&varGet);
+ VariantClear(&varBaseline);
+
+ if(HRESULT_FAILED(hresult))
+ goto LError0;
+ }
+
+LError0:;
+ delete pIndices;
+
+ return hresult;
+}
+
+
+/***
+*void DbPrIndices(unsigned int, long*)
+*Purpose:
+* Print the given SafeArray indices.
+*
+*Entry:
+* cDims = count of array dimentions
+* rgindices = array of indices
+*
+*Exit:
+* None
+*
+***********************************************************************/
+extern "C" void
+DbPrIndices(unsigned int cDims, long FAR* rgindices)
+{
+ unsigned int u;
+
+ DbPrintf("[");
+ for(u = 0; u < cDims; ++u){
+ DbPrintf("%ld", rgindices[u]);
+ if(u+1 < cDims)
+ DbPrintf(",");
+ }
+ DbPrintf("]");
+}
+
+
+/***
+*void DbPrSafeArray(SAFEARRAY*)
+*Purpose:
+* Dump the given SafeArray (the descriptor and some of its contents)
+* to the debug window.
+*
+*Entry:
+* psa = pointer to the SAFEARRAY to dump.
+* vt = the VARTYPE of the array data (VT_EMPTY indicates UNKNOWN)
+*
+*Exit:
+* None
+*
+***********************************************************************/
+extern "C" void
+DbPrSafeArray(SAFEARRAY FAR* psa, VARTYPE vt)
+{
+ unsigned int i;
+ long pIndices[10];
+
+#if 1
+# define MAX_ROWS 1
+#else
+# define MAX_ROWS 3
+#endif
+
+ if(psa == NULL){
+ DbPrintf("psa == NULL\n");
+ return;
+ }
+
+ ASSERT((vt & (VT_ARRAY | VT_BYREF)) == 0);
+
+ // verify that the features bits correspond to the given VARTYPE
+ switch(vt){
+ case VT_BSTR:
+ ASSERT(psa->fFeatures & FADF_BSTR);
+ break;
+ case VT_VARIANT:
+ ASSERT(psa->fFeatures & FADF_VARIANT);
+ break;
+ case VT_UNKNOWN:
+ ASSERT(psa->fFeatures & FADF_UNKNOWN);
+ break;
+ case VT_DISPATCH:
+ ASSERT(psa->fFeatures & FADF_DISPATCH);
+ break;
+
+ }
+
+ DbPrintf("psa => cDims=%d (", (int)psa->cDims);
+
+ for(i = 0; i < psa->cDims; ++i){
+ DbPrintf("%lu:%ld",
+ psa->rgsabound[i].cElements, psa->rgsabound[i].lLbound);
+ if(i+1 < psa->cDims)
+ DbPrintf(",");
+ }
+
+ DbPrintf(") cbElem=%d cLocks=%d fFeatures=0x%x",
+ (int)psa->cbElements,
+ (int)psa->cLocks,
+ (int)psa->fFeatures);
+
+ DbPrintf(" [");
+ if(psa->fFeatures != 0){
+ if(psa->fFeatures & FADF_AUTO)
+ DbPrintf("Auto");
+ if(psa->fFeatures & FADF_STATIC)
+ DbPrintf("Stat");
+ if(psa->fFeatures & FADF_FIXEDSIZE)
+ DbPrintf("Fixed");
+ if(psa->fFeatures & FADF_BSTR)
+ DbPrintf("Bstr");
+ if(psa->fFeatures & FADF_VARIANT)
+ DbPrintf("Var");
+ if(psa->fFeatures & FADF_UNKNOWN)
+ DbPrintf("Unk");
+ if(psa->fFeatures & FADF_DISPATCH)
+ DbPrintf("Disp");
+ }
+ DbPrintf("]");
+
+ // Dump at least some of the array contents, *if* we know the
+ // type of the data and the array has a reasonable number of
+ // indices.
+ //
+ if(vt != VT_EMPTY && psa->cDims < DIM(pIndices)){
+ void FAR* pv;
+ VARIANT var;
+ int count, rows;
+
+ rows = 0;
+ count = 0;
+ VariantInit(&var);
+ pv = (void FAR*)&var;
+
+ DbPrintf("\n");
+
+ HRESULT hresult;
+ for(hresult = first_element(psa->cDims, psa->rgsabound, pIndices);
+ hresult == NOERROR;
+ hresult = next_element(psa->cDims, psa->rgsabound, pIndices))
+ {
+ SafeArrayGetElement(psa, pIndices, pv);
+
+ DbPrIndices(psa->cDims, pIndices);
+ DbPrintf("=");
+ DbPrData(pv, vt);
+ DbPrintf(" ");
+
+ // release the element, as appropriate
+ switch(vt){
+ case VT_BSTR:
+ SysFreeString(*(BSTR FAR*)pv);
+ break;
+ case VT_VARIANT:
+ VariantClear((VARIANT*)pv);
+ break;
+ case VT_UNKNOWN:
+ case VT_DISPATCH:
+#if OE_WIN32 && 0
+ case VT_DISPATCHW:
+#endif
+ if(*(IUnknown FAR* FAR*)pv != NULL)
+ (*(IUnknown FAR* FAR*)pv)->Release();
+ break;
+ }
+
+ if((++count % 5) == 0){
+ DbPrintf("\n");
+ if(++rows >= MAX_ROWS)
+ return;
+ }
+ }
+ }
+
+ DbPrintf("\n");
+
+#undef MAX_ROWS
+}
+
+
+//---------------------------------------------------------------------
+// Invoke Helpers
+//---------------------------------------------------------------------
+
+
+/***
+*HRESULT GetDISPIDs(IDispatch*, NAMEDESC*, DISPID**)
+*Purpose:
+* Helper for translating an array of names into an array of DISPIDs
+* via IDispatch::GetIDsOfNames().
+*
+*Entry:
+* pdisp = the IDispatch*
+* pnd = pointer to a name descriptor
+*
+*Exit:
+* return value = HRESULT
+*
+* *prgdispid = array filled with DISPIDs corresponding to the given names
+*
+***********************************************************************/
+
+extern "C" HRESULT
+GetDISPIDs(
+ IDispatch FAR* pdisp,
+ NAMEDESC FAR* pnd,
+ DISPID FAR* FAR* prgdispid)
+{
+ HRESULT hresult;
+ DISPID FAR* rgdispid;
+
+ rgdispid = new FAR DISPID[pnd->cNames];
+
+ IfFailGo(
+ pdisp->GetIDsOfNames(
+ IID_NULL,
+ pnd->rgszNames,
+ pnd->cNames,
+ LOCALE_SYSTEM_DEFAULT,
+ rgdispid),
+ LError0);
+
+ *prgdispid = rgdispid;
+
+ return NOERROR;
+
+LError0:;
+ delete rgdispid;
+
+ return hresult;
+}
+
+
+/***
+*HRESULT DoInvoke(...)
+*Purpose:
+* Execute 'Invoke' on the given IDispatch* and log results to the
+* debug window.
+*
+*Entry:
+* ...
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+
+extern "C" HRESULT
+DoInvoke(
+ IDispatch FAR* pdisp,
+ DISPID dispidMember,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ HRESULT hresult;
+ unsigned int i, c;
+ VARIANTARG FAR* pvarg;
+
+ TCHAR buf[512], *psz;
+
+ psz = buf;
+
+ SPRINTF(buf, TSTR("IDispatch::Invoke(%ld, ["), dispidMember);
+ psz = psz + STRLEN(buf);
+ c = pdispparams->cNamedArgs;
+ for(i = 0; i < c; ++i){
+ SPRINTF(psz, (i+1 < c) ? TSTR("%d,") : TSTR("%d"), pdispparams->rgdispidNamedArgs[i]);
+ psz += STRLEN(psz);
+ }
+ SPRINTF(psz, TSTR("]["));
+ psz += STRLEN(psz);
+ c = pdispparams->cArgs;
+ for(i = 0; i < c; ++i){
+ pvarg = &pdispparams->rgvarg[i];
+ SPRINTF(psz, (i+1 < c) ? TSTR("%s, ") : TSTR("%s"), SzOfVarg(pvarg));
+ psz += STRLEN(psz);
+ }
+ SPRINTF(psz, TSTR("],);\n"));
+ psz += STRLEN(psz);
+
+ ASSERT(psz < &buf[DIM(buf)]);
+
+ DbPrintf((char FAR*) buf);
+
+ hresult = pdisp->Invoke(
+ dispidMember,
+ IID_NULL,
+ LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD,
+ pdispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+
+ psz = buf;
+ SPRINTF(psz, TSTR(" = %s"), DbSzOfScode(GetScode(hresult)));
+ psz += STRLEN(psz);
+
+ SPRINTF(psz, TSTR(", pvarResult = %s"),
+ pvarResult == NULL ? "NULL" : SzOfVarg(pvarResult));
+ psz += STRLEN(psz);
+
+ if(puArgErr == NULL){
+ SPRINTF(psz, TSTR(", puArgErr = NULL\n"));
+ }else{
+ SPRINTF(psz, TSTR(", *puArgErr = %d\n"), (int)*puArgErr);
+ }
+ psz += STRLEN(psz);
+
+ ASSERT(psz < &buf[DIM(buf)]);
+
+ DbPrintf((char FAR*) buf);
+
+ return hresult;
+}
+
+
+/***
+*PUBLIC BOOL IsBadInvokeParams(...)
+*Purpose:
+* Validate the given IDispatch::Invoke parameters.
+*
+*Entry:
+* ...
+*
+*Exit:
+* return value = BOOL, TRUE if bad params, FALSE if not.
+*
+***********************************************************************/
+
+
+extern "C" int
+IsBadInvokeParams(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+#if OE_MAC
+ // REVIEW: enable this for the mac when we have the proper stubs
+
+ UNUSED(dispidMember);
+ UNUSED(lcid);
+ UNUSED(wFlags);
+ UNUSED(pdispparams);
+ UNUSED(pexcepinfo);
+ UNUSED(puArgErr);
+
+#else
+ unsigned int size;
+
+ if(IsBadReadPtr(pdispparams, sizeof(*pdispparams)))
+ return TRUE;
+
+ if(pdispparams->cArgs > 0){
+ size = pdispparams->cArgs * sizeof(pdispparams->rgvarg[0]);
+ if(IsBadReadPtr(pdispparams->rgvarg, size))
+ return TRUE;
+ }
+
+ if(pdispparams->cNamedArgs > 0){
+ size =
+ pdispparams->cNamedArgs * sizeof(pdispparams->rgdispidNamedArgs[0]);
+ if(IsBadReadPtr(pdispparams->rgdispidNamedArgs, size))
+ return TRUE;
+ }
+
+ if(pvarResult != NULL){
+ if(IsBadWritePtr(pvarResult, sizeof(*pvarResult)))
+ return TRUE;
+ }
+
+ if(pexcepinfo != NULL){
+ if(IsBadWritePtr(pexcepinfo, sizeof(*pexcepinfo)))
+ return TRUE;
+ }
+
+ if(puArgErr != NULL){
+ if(IsBadWritePtr(puArgErr, sizeof(*puArgErr)))
+ return TRUE;
+ }
+#endif
+ return FALSE;
+}
+
+
+#if OE_WIN32
+
+extern "C" char FAR*
+ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size)
+{
+ int badConversion = FALSE;
+
+ WideCharToMultiByte(CP_ACP, NULL,
+ strIn, -1,
+ buf, size,
+ NULL, &badConversion);
+ return buf;
+}
+
+extern "C" char FAR*
+DbAnsiString(OLECHAR FAR* strIn)
+{
+ static char buf[256];
+
+ return (ConvertStrWtoA(strIn, buf, 256));
+}
+
+extern "C" OLECHAR FAR*
+ConvertStrAtoW(char FAR* strIn, OLECHAR FAR* buf, UINT size)
+{
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ strIn, -1, buf, size) ;
+ return buf;
+}
+
+extern "C" OLECHAR FAR*
+DbWideString(char FAR* strIn)
+{
+ static OLECHAR buf[256];
+
+ return (ConvertStrAtoW(strIn, buf, 256));
+}
+
+
+#endif
+
+
+/***
+*char *DbSzOfScode(SCODE)
+*Purpose:
+* Return a string representing the given SCODE.
+*
+*Entry:
+* sc = the SCODE to return the string of.
+*
+*Exit:
+* return value = char*, the string representing the given SCODE.
+*
+***********************************************************************/
+extern "C" TCHAR FAR*
+DbSzOfScode(SCODE sc)
+{
+static TCHAR buf[64];
+
+#if defined(UNICODE)
+#define DBSZOFSCODE(SC, SCTRY) if(SC == SCTRY){return L#SCTRY;}else;
+#else
+#define DBSZOFSCODE(SC, SCTRY) if(SC == SCTRY){return #SCTRY;}else;
+#endif
+ DBSZOFSCODE(sc,S_OK);
+ DBSZOFSCODE(sc,S_FALSE);
+
+ DBSZOFSCODE(sc,E_UNEXPECTED);
+ DBSZOFSCODE(sc,E_NOTIMPL);
+ DBSZOFSCODE(sc,E_OUTOFMEMORY);
+ DBSZOFSCODE(sc,E_INVALIDARG);
+ DBSZOFSCODE(sc,E_NOINTERFACE);
+ DBSZOFSCODE(sc,E_POINTER);
+ DBSZOFSCODE(sc,E_HANDLE);
+ DBSZOFSCODE(sc,E_ABORT);
+
+// REVIEW: ntole2 and mac compobj.h not in sync yet...
+//
+#if !defined(WIN32) && !defined(_MAC)
+ DBSZOFSCODE(sc,E_FAIL);
+ DBSZOFSCODE(sc,E_ACCESSDENIED);
+ DBSZOFSCODE(sc,REGDB_E_READREGDB);
+ DBSZOFSCODE(sc,REGDB_E_WRITEREGDB);
+ DBSZOFSCODE(sc,REGDB_E_KEYMISSING);
+ DBSZOFSCODE(sc,REGDB_E_INVALIDVALUE);
+ DBSZOFSCODE(sc,REGDB_E_CLASSNOTREG);
+ DBSZOFSCODE(sc,REGDB_E_IIDNOTREG);
+
+ DBSZOFSCODE(sc,CO_E_NOTINITIALIZED);
+ DBSZOFSCODE(sc,CO_E_ALREADYINITIALIZED);
+ DBSZOFSCODE(sc,CO_E_CANTDETERMINECLASS);
+ DBSZOFSCODE(sc,CO_E_CLASSSTRING);
+ DBSZOFSCODE(sc,CO_E_IIDSTRING);
+ DBSZOFSCODE(sc,CO_E_APPNOTFOUND);
+ DBSZOFSCODE(sc,CO_E_APPSINGLEUSE);
+ DBSZOFSCODE(sc,CO_E_ERRORINAPP);
+ DBSZOFSCODE(sc,CO_E_DLLNOTFOUND);
+ DBSZOFSCODE(sc,CO_E_ERRORINDLL);
+ DBSZOFSCODE(sc,CO_E_WRONGOSFORAPP);
+ DBSZOFSCODE(sc,CO_E_OBJNOTREG);
+ DBSZOFSCODE(sc,CO_E_OBJISREG);
+ DBSZOFSCODE(sc,CO_E_OBJNOTCONNECTED);
+ DBSZOFSCODE(sc,CO_E_APPDIDNTREG);
+ DBSZOFSCODE(sc,CO_E_APPDIDNTREG);
+#endif
+
+#if 0
+ DBSZOFSCODE(sc,RPC_E_BUSY);
+ DBSZOFSCODE(sc,RPC_E_MSG_REJECTED);
+ DBSZOFSCODE(sc,RPC_E_CONNECTION_LOST);
+#endif
+ DBSZOFSCODE(sc,RPC_E_SERVER_DIED);
+#if 0
+ DBSZOFSCODE(sc,RPC_E_CANCELLED);
+ DBSZOFSCODE(sc,RPC_E_DISPATCH_ASYNCCALL);
+#endif
+
+ DBSZOFSCODE(sc,OLE_E_NOCONNECTION);
+ DBSZOFSCODE(sc,OLE_E_NOTRUNNING);
+#if 0
+ DBSZOFSCODE(sc,OLE_E_NOTSUPPORTED);
+
+ DBSZOFSCODE(sc,OLE_E_REGDB_KEY);
+ DBSZOFSCODE(sc,OLE_E_REGDB_FMT);
+#endif
+
+ DBSZOFSCODE(sc,DISP_E_UNKNOWNINTERFACE);
+ DBSZOFSCODE(sc,DISP_E_MEMBERNOTFOUND);
+ DBSZOFSCODE(sc,DISP_E_PARAMNOTFOUND);
+ DBSZOFSCODE(sc,DISP_E_TYPEMISMATCH);
+ DBSZOFSCODE(sc,DISP_E_UNKNOWNNAME);
+ DBSZOFSCODE(sc,DISP_E_NONAMEDARGS);
+ DBSZOFSCODE(sc,DISP_E_BADVARTYPE);
+ DBSZOFSCODE(sc,DISP_E_EXCEPTION);
+ DBSZOFSCODE(sc,DISP_E_OVERFLOW);
+ DBSZOFSCODE(sc,DISP_E_BADINDEX);
+ DBSZOFSCODE(sc,DISP_E_UNKNOWNLCID);
+ DBSZOFSCODE(sc,DISP_E_ARRAYISLOCKED);
+
+ // otherwise its unknown
+ SPRINTF(buf, TSTR("SCODE(0x%lX)"), sc);
+ return buf;
+
+#undef DBSZOFSCODE
+}
+
+
+
+LOCAL TCHAR *rgszVtNames[] = {
+ TSTR("VT_EMPTY")
+ , TSTR("VT_NULL")
+ , TSTR("VT_I2")
+ , TSTR("VT_I4")
+ , TSTR("VT_R4")
+ , TSTR("VT_R8")
+ , TSTR("VT_CY")
+ , TSTR("VT_DATE")
+ , TSTR("VT_BSTR")
+ , TSTR("VT_DISPATCH")
+ , TSTR("VT_ERROR")
+ , TSTR("VT_BOOL")
+ , TSTR("VT_VARIANT")
+ , TSTR("VT_UNKNOWN") // max VARIANT vartype
+ , TSTR("invalid_vartype") // 14 is unused
+ , TSTR("invalid_vartype") // 15 is unused
+ , TSTR("VT_I1")
+ , TSTR("VT_UI1")
+ , TSTR("VT_UI2")
+ , TSTR("VT_UI4")
+ , TSTR("VT_I8")
+ , TSTR("VT_UI8")
+ , TSTR("VT_INT")
+ , TSTR("VT_UINT")
+ , TSTR("VT_VOID")
+ , TSTR("VT_HRESULT")
+ , TSTR("VT_PTR")
+ , TSTR("VT_SAFEARRAY")
+ , TSTR("VT_CARRAY")
+ , TSTR("VT_USERDEFINED")
+ , TSTR("VT_LPSTR")
+ , TSTR("VT_LPWSTR")
+};
+
+extern "C" TCHAR FAR*
+DbSzOfVt(VARTYPE vt)
+{
+ TCHAR *p;
+ VARTYPE vtBase;
+static TCHAR buf[32];
+
+ if(vt & VT_RESERVED)
+ return TSTR("?");
+
+ p = buf;
+
+ if(vt & VT_BYREF)
+ *p++ = TSTR('&');
+
+ vtBase = vt & ~(VT_RESERVED|VT_BYREF|VT_ARRAY);
+
+ if(vtBase >= DIM(rgszVtNames)){
+ *p++ = TSTR('?');
+ }else{
+ STRCPY(p, rgszVtNames[vtBase]);
+ p += STRLEN(p);
+ }
+
+ if(vt & VT_ARRAY){
+ *p++ = TSTR('[');
+ *p++ = TSTR(']');
+ }
+
+ *p = TSTR('\0');
+
+ return buf;
+}
diff --git a/private/oleauto/tests/common/testhelp.h b/private/oleauto/tests/common/testhelp.h
new file mode 100644
index 000000000..07ecfa227
--- /dev/null
+++ b/private/oleauto/tests/common/testhelp.h
@@ -0,0 +1,141 @@
+/***
+*testhelp.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of common test helper functions.
+*
+*Revision History:
+*
+* [00] 09-Nov-92 Bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+typedef struct tagNAMEDESC NAMEDESC;
+struct tagNAMEDESC {
+ OLECHAR FAR* FAR* rgszNames;
+ int cNames;
+};
+
+
+typedef struct tagSARRAYDESC SARRAYDESC;
+struct tagSARRAYDESC {
+ unsigned int cDims;
+ SAFEARRAYBOUND rgsabound[5];
+};
+
+
+//---------------------------------------------------------------------
+// BSTR Helpers
+//---------------------------------------------------------------------
+
+EXTERN_C CDECL_(HRESULT)
+BuildBstr(BSTR FAR* pbstr, OLECHAR FAR* szName);
+
+
+//---------------------------------------------------------------------
+// Variant Helpers
+//---------------------------------------------------------------------
+
+STDAPI VariantClearAll(VARIANTARG FAR* pvarg);
+
+EXTERN_C int
+VariantCompare(
+ VARIANT FAR* pvarLeft,
+ VARIANT FAR* pvarRight);
+
+//---------------------------------------------------------------------
+// SafeArray Helpers
+//---------------------------------------------------------------------
+
+
+EXTERN_C long
+sumof_indices(unsigned int cDims, long FAR* rgIndices);
+
+// SafeArray iterator
+EXTERN_C HRESULT
+first_element(unsigned int, SAFEARRAYBOUND FAR*, long FAR*);
+EXTERN_C HRESULT
+next_element(unsigned int, SAFEARRAYBOUND FAR*, long FAR*);
+
+EXTERN_C HRESULT
+SafeArrayCreateIdentity(
+ VARTYPE vt,
+ SARRAYDESC FAR* psarraydesc,
+ SAFEARRAY FAR* FAR* ppsa);
+
+EXTERN_C HRESULT
+SafeArrayValidateIdentity(VARTYPE vt, SAFEARRAY FAR* psa, long offset);
+
+EXTERN_C void
+DbPrSafeArray(SAFEARRAY FAR*, VARTYPE);
+
+
+//---------------------------------------------------------------------
+// Invoke Helpers
+//---------------------------------------------------------------------
+
+
+EXTERN_C HRESULT
+GetDISPIDs(
+ IDispatch FAR* pdisp,
+ NAMEDESC FAR* pnd,
+ DISPID FAR* FAR* prgdispid);
+
+
+EXTERN_C HRESULT
+DoInvoke(
+ IDispatch FAR* pdisp,
+ DISPID idMember,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+EXTERN_C int
+IsBadInvokeParams(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+
+
+#if OE_WIN32 && 0
+
+EXTERN_C HRESULT
+GetWDISPIDs(
+ IDispatchW FAR* pdisp,
+ NAMEDESC FAR* pnd,
+ DISPID FAR* FAR* prgdispid);
+
+
+EXTERN_C HRESULT
+DoInvokeW(
+ IDispatchW FAR* pdisp,
+ DISPID idMember,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ WEXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+EXTERN_C int
+IsBadInvokeWParams(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ WEXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+#endif
diff --git a/private/oleauto/tests/common/util.cpp b/private/oleauto/tests/common/util.cpp
new file mode 100644
index 000000000..9e435ddcd
--- /dev/null
+++ b/private/oleauto/tests/common/util.cpp
@@ -0,0 +1,65 @@
+/***
+*util.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Misc test utilities
+*
+*Revision History:
+*
+* [00] 24-Jun-93 bradlo: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <ctype.h>
+#include <stdio.h>
+
+#include "common.h"
+
+
+#if HC_MPW
+
+int
+_stricmp(char *first, char *last)
+{
+ unsigned short f, l;
+
+ do{
+ f = tolower(*first++);
+ l = tolower(*last++);
+ }while(f && f == l);
+
+ return f - l;
+}
+
+char*
+_strupr(char *sz)
+{
+ char *pch = sz;
+
+ while(*pch != '\0'){
+
+ *pch = toupper(*pch);
+ ++pch;
+ }
+ return sz;
+}
+
+#endif
+
+
+STDAPI
+ErrBstrAlloc(OLECHAR FAR* psz, BSTR FAR* pbstr)
+{
+ if(psz == NULL){
+ *pbstr = NULL;
+ return NOERROR;
+ }
+ *pbstr = SysAllocString(psz);
+ return (*pbstr == NULL) ? RESULT(E_OUTOFMEMORY) : NOERROR;
+}
+
diff --git a/private/oleauto/tests/disptest/cbind.cpp b/private/oleauto/tests/disptest/cbind.cpp
new file mode 100644
index 000000000..6b5a611cd
--- /dev/null
+++ b/private/oleauto/tests/disptest/cbind.cpp
@@ -0,0 +1,393 @@
+/***
+*cbind.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CBindSuite test object.
+*
+*Revision History:
+*
+* [00] 11-Nov-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+#include "tstsuite.h"
+#include "clsid.h"
+
+
+extern OLECHAR FAR* g_szCSArray;
+extern OLECHAR FAR* g_szCDispTst;
+
+struct TEST {
+ HRESULT (*pfnTest)(void);
+ OLECHAR FAR* szName;
+};
+
+HRESULT BindTest1();
+HRESULT BindTest2();
+HRESULT BindTest3();
+HRESULT GetObject1();
+HRESULT GetObject2();
+HRESULT GetObject3();
+
+static TEST rgtest[] = {
+ { BindTest1, OLESTR("binding test #1") }
+ , { BindTest2, OLESTR("binding test #2") }
+ , { BindTest3, OLESTR("binding test #3") }
+ , { GetObject1, OLESTR("GetObject test #1") }
+ , { GetObject2, OLESTR("GetObject test #2") }
+ , { GetObject3, OLESTR("GetObject test #3") }
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CBindSuite)
+
+SUITE_IUNKNOWN_IMPL(CBindSuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CBindSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Object binding"), pbstr);
+}
+
+STDMETHODIMP
+CBindSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("bind.log"), pbstr);
+}
+
+STDMETHODIMP
+CBindSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+
+ return NOERROR;
+}
+
+STDMETHODIMP
+CBindSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return ErrBstrAlloc(rgtest[iTest].szName, pbstr);
+}
+
+/***
+*HRESULT CBindSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CBindSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CBindSuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return rgtest[iTest].pfnTest();
+}
+
+// Create and isntance of our test and sample objects, QI them to
+// IDispatch, and then immediately release.
+//
+HRESULT
+BindTest1()
+{
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+static struct {
+ const CLSID FAR* pclsid;
+ char FAR* psz;
+} rg[] = {
+#define DAT(X) {&X, #X}
+ DAT(CLSID_CPoly)
+ , DAT(CLSID_CPoly2)
+ , DAT(CLSID_CCalc)
+ , DAT(CLSID_SDispTst_CDispTst)
+#undef DAT
+};
+
+ for(int i = 0; i < DIM(rg); ++i){
+ DbPrintf("CoCreateInstance(%s)\n", rg[i].psz);
+ IfFailRet(
+ CoCreateInstance(
+ *rg[i].pclsid,
+ NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void FAR* FAR*)&punk));
+ DbPrintf(" QueryInterface(IID_IDispatch)\n");
+ IfFailRet(punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp));
+ pdisp->Release();
+ punk->Release();
+ }
+ return NOERROR;
+}
+
+// bind to a new instance of the sdisptst application object, and
+// dump its typeinfos.
+
+HRESULT
+BindTest2()
+{
+ unsigned int u, ctinfo;
+ HRESULT hresult;
+ IDispatch FAR* pdisp;
+ ITypeInfo FAR* ptinfo;
+
+ IfFailGo(CreateObject(OLESTR("sdisptst.application"), &pdisp), LError0);
+
+ IfFailGo(pdisp->GetTypeInfoCount(&ctinfo), LError1);
+
+ for(u = 0; u < ctinfo; ++u){
+ IfFailGo(pdisp->GetTypeInfo(u, 0, &ptinfo), LError1);
+
+ // dump the type info
+ PrTi(ptinfo);
+ ptinfo->Release();
+ }
+
+LError1:;
+ pdisp->Release();
+
+LError0:;
+ return hresult;
+}
+
+// same as BindTest2 - but dump the typeinfo for dspcalc2.
+//
+HRESULT
+BindTest3()
+{
+ unsigned int u, ctinfo;
+ HRESULT hresult;
+ IDispatch FAR* pdisp;
+ ITypeInfo FAR* ptinfo;
+
+ IfFailGo(CreateObject(OLESTR("Dspcalc2.Application"), &pdisp), LError0);
+
+ IfFailGo(pdisp->GetTypeInfoCount(&ctinfo), LError1);
+
+ for(u = 0; u < ctinfo; ++u){
+ IfFailGo(pdisp->GetTypeInfo(u, 0, &ptinfo), LError1);
+
+ // dump the type info
+ PrTi(ptinfo);
+ ptinfo->Release();
+ }
+
+LError1:;
+ pdisp->Release();
+
+LError0:;
+ return hresult;
+}
+
+// Test GetActiveObject()
+HRESULT
+GetObject1()
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+ IDispatch FAR* pdispApp;
+ IDispatch FAR* pdispCDispTst;
+
+ VARIANT varResult;
+ VARIANTARG rgvarg[1];
+ DISPID rgdispid[1];
+ DISPPARAMS dispparams;
+ OLECHAR FAR* rgszNames[1];
+
+#if OE_WIN16
+ // make sure the server is running first
+ if(!WinExec("sdisptst", SW_NORMAL))
+ return RESULT(E_UNEXPECTED);
+#endif
+
+ // get the active application object
+ IfFailGo(
+ GetActiveObject(CLSID_SDispTst_CAppObject, NULL, &punk),
+ LError0);
+
+ IfFailGo(
+ punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdispApp),
+ LError1);
+
+ // invoke the NewCDispTst method on the application object to
+ // create an instance of the CDispTst object.
+
+ rgszNames[0] = OLESTR("newcdisptst");
+ IfFailGo(
+ pdispApp->GetIDsOfNames(
+ IID_NULL, rgszNames, 1, LOCALE_USER_DEFAULT, rgdispid),
+ LError2);
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgvarg = rgvarg;
+ pdispCDispTst = NULL;
+ V_VT(&rgvarg[0]) = VT_BYREF | VT_DISPATCH;
+ V_DISPATCHREF(&rgvarg[0]) = &pdispCDispTst;
+ VariantInit(&varResult);
+ IfFailGo(
+ DoInvoke(pdispApp, rgdispid[0], &dispparams, &varResult, NULL, NULL),
+ LError2);
+
+ // invoke CDispTst::Hello(), just to make sure this is really working
+
+ rgszNames[0] = OLESTR("hello");
+ IfFailGo(
+ pdispCDispTst->GetIDsOfNames(
+ IID_NULL, rgszNames, 1, LOCALE_USER_DEFAULT, rgdispid),
+ LError2);
+
+ dispparams.cArgs = 0;
+ dispparams.cNamedArgs = 0;
+ IfFailGo(
+ DoInvoke(pdispCDispTst, rgdispid[0], &dispparams, NULL, NULL, NULL),
+ LError3);
+
+ hresult = NOERROR;
+
+LError3:;
+ pdispCDispTst->Release();
+
+LError2:;
+ pdispApp->Release();
+
+LError1:;
+ punk->Release();
+
+LError0:;
+ return hresult;
+}
+
+HRESULT
+GetObject2()
+{
+ HRESULT hresult;
+ IUnknown FAR* punkCalcGet;
+ IDispatch FAR* pdispCalcGet;
+ IDispatch FAR* pdispCalcCreate;
+
+ DISPID rgdispid[1];
+ DISPPARAMS dispparams;
+ OLECHAR FAR* rgszNames[1];
+
+ // make sure the server is running
+ DbPrintf("CreateObject(\"Dispcalc.Application\",)\n");
+ IfFailGo(CreateObject(OLESTR("Dispcalc.Application"), &pdispCalcCreate),
+ LError0);
+
+#ifdef _MAC
+ // REVIEW: currently a problem with GetActiveObj on the mac
+ IfFailGo(pdispCalcCreate->QueryInterface(IID_IUnknown, (void FAR* FAR*) &punkCalcGet), LError0);
+#else
+ // get the active application object
+ DbPrintf("GetActiveObject(CLSID_CCalc,)\n");
+ IfFailGo(GetActiveObject(CLSID_CCalc, NULL, &punkCalcGet), LError1);
+#endif
+
+ DbPrintf("QueryInterface(IID_IDispatch,)\n");
+ IfFailGo(
+ punkCalcGet->QueryInterface(
+ IID_IDispatch, (void FAR* FAR*)&pdispCalcGet), LError2);
+
+ // REVIEW: set accum on the create version, and get the accum on
+ // the get version - then check to see that its the same value
+
+ DbPrintf("GetIDsOfNames(\"quit\",)\n");
+ rgszNames[0] = OLESTR("quit");
+ IfFailGo(
+ pdispCalcGet->GetIDsOfNames(IID_NULL, rgszNames, 1, 0, rgdispid),
+ LError3);
+
+ DbPrintf("Invoke(\"quit\",)\n");
+ dispparams.cArgs = 0;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgvarg = NULL;
+ IfFailGo(
+ DoInvoke(pdispCalcGet, rgdispid[0], &dispparams, NULL, NULL, NULL),
+ LError3);
+
+ hresult = NOERROR;
+
+LError3:;
+ pdispCalcGet->Release();
+
+LError2:;
+ punkCalcGet->Release();
+
+LError1:;
+#if !defined(WIN32) // BUGBUG: ole32.dll GPF is channel code...
+ // cause and identity table assertion to occur
+ pdispCalcCreate->Release();
+#endif
+
+LError0:;
+ return hresult;
+}
+
+
+// test repeatedly getting and releasing an active object
+
+HRESULT
+GetObject3()
+{
+ int i;
+ HRESULT hresult;
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+ punk = NULL;
+ pdisp = NULL;
+
+ // make sure the server is running
+ hresult = CreateObject(OLESTR("Dispcalc.Application"), &pdisp);
+ if(hresult != NOERROR)
+ goto LError0;
+
+ // the calculator stays in memory until the quit method is invoked
+ pdisp->Release();
+ pdisp = NULL;
+
+ for(i = 0; i < 10; ++i){
+ // get the active application object
+ IfFailGo(GetActiveObject(CLSID_CCalc, NULL, &punk), LError0);
+
+ IfFailGo(
+ punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp),
+ LError0);
+
+ punk->Release();
+ punk = NULL;
+
+ pdisp->Release();
+ pdisp = NULL;
+ }
+
+LError0:;
+ if(pdisp!=NULL)
+ pdisp->Release();
+ if(punk!=NULL)
+ punk->Release();
+
+ return hresult;
+}
+
diff --git a/private/oleauto/tests/disptest/cbstr.cpp b/private/oleauto/tests/disptest/cbstr.cpp
new file mode 100644
index 000000000..a0d2689ee
--- /dev/null
+++ b/private/oleauto/tests/disptest/cbstr.cpp
@@ -0,0 +1,313 @@
+/***
+*cbstr.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CBstrSuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <limits.h>
+
+#include "disptest.h"
+#include "tstsuite.h"
+
+
+struct TEST {
+ HRESULT (*pfnTest)(void);
+ OLECHAR FAR* szName;
+};
+
+HRESULT BstrLimits(void);
+HRESULT BstrOleprog5(void);
+HRESULT BstrOleprog8(void);
+HRESULT BstrOleprog65(void);
+HRESULT BstrOleprog234(void);
+
+static TEST rgtest[] = {
+ { BstrOleprog5, OLESTR("raid!oleprog#5") }
+#if !OE_MAC
+ , { BstrOleprog8, OLESTR("raid!oleprog#8") }
+#endif
+ , { BstrOleprog65, OLESTR("raid!oleprog#65") }
+ , { BstrOleprog234, OLESTR("raid!oleprog#234") }
+ , { BstrLimits, OLESTR("Bstr limits") }
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CBstrSuite)
+
+SUITE_IUNKNOWN_IMPL(CBstrSuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CBstrSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("BSTR API"), pbstr);
+}
+
+STDMETHODIMP
+CBstrSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("bstrapi.log"), pbstr);
+}
+
+STDMETHODIMP
+CBstrSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+
+ return NOERROR;
+}
+
+STDMETHODIMP
+CBstrSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ *pbstr = SysAllocString(rgtest[iTest].szName);
+ return NOERROR;
+}
+
+/***
+*HRESULT CBstrSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CBstrSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CBstrSuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return rgtest[iTest].pfnTest();
+}
+
+HRESULT
+BstrLimits()
+{
+ unsigned long u;
+ BSTR bstr;
+
+#if OE_WIN32 /* { */
+
+
+static unsigned long s2M = 2097152;
+static unsigned long INCREMENT = 262144;
+
+ DbPrintf("SysAllocStringLen()\n");
+
+ DbPrintf("linear increasing...\n");
+ for(u = 1; u < s2M; u+=INCREMENT){
+ DbPrintf("%lu\n", u);
+ bstr = SysAllocStringLen(NULL, (unsigned int)u);
+ IfWin(Yield());
+ if(bstr == NULL)
+ break;
+ SysFreeString(bstr);
+ }
+ DbPrintf("max len = %lu\n", u-1);
+
+ DbPrintf("linear decreasing...\n");
+ for(u = s2M; u > 0; u-=INCREMENT){
+ DbPrintf("%lu\n", u);
+ bstr = SysAllocStringLen(NULL, (unsigned int)u);
+ IfWin(Yield());
+ if(bstr == NULL)
+ break;
+ SysFreeString(bstr);
+ }
+ DbPrintf("max len = %lu\n", u);
+
+ return NOERROR;
+
+#else
+
+#if OE_MAC
+static unsigned long s64k = 64000;
+#else
+static unsigned long s64k = UINT_MAX;
+#endif
+ DbPrintf("SysAllocStringLen()\n");
+
+ DbPrintf("linear increasing...\n");
+ for(u = s64k-(1024*4); u < s64k; ++u){
+ if((u%1024) == 0){
+ DbPrintf("%lu\n", u);
+ }
+ bstr = SysAllocStringLen(NULL, (unsigned int)u);
+ IfWin(Yield());
+ if(bstr == NULL)
+ break;
+ SysFreeString(bstr);
+ }
+ DbPrintf("max len = %lu\n", u-1);
+
+ DbPrintf("linear decreasing...\n");
+ for(u = s64k; u > 0; --u){
+ bstr = SysAllocStringLen(NULL, (unsigned int)u);
+ IfWin(Yield());
+ if(bstr != NULL){
+ SysFreeString(bstr);
+ break;
+ }
+ }
+ DbPrintf("max len = %lu\n", u);
+
+ return NOERROR;
+
+#endif /* } */
+}
+
+
+// regression test for raid!oleprog:5
+//
+HRESULT
+BstrOleprog5()
+{
+ unsigned int len;
+ BSTR bstr;
+static OLECHAR a_string[] = OLESTR("a string");
+static OLECHAR another_string[] = OLESTR("another (longer) string");
+
+ bstr = SysAllocString(a_string);
+ if(bstr == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ len = SysStringLen(bstr);
+#if (defined(WIN32) && !defined(UNICODE))
+ if(len != (unsigned int)wcslen(a_string))
+#else
+ if(len != STRLEN(a_string))
+#endif
+ return RESULT(E_FAIL);
+
+ if(!SysReAllocString(&bstr, another_string))
+ return RESULT(E_OUTOFMEMORY);
+
+ len = SysStringLen(bstr);
+#if (defined(WIN32) && !defined(UNICODE))
+ if(len != (unsigned int)wcslen(another_string))
+#else
+ if(len != STRLEN(another_string))
+#endif
+ return RESULT(E_FAIL);
+
+ SysFreeString(bstr);
+
+ return NOERROR;
+}
+
+// regression test for raid!oleprog:8
+//
+HRESULT
+BstrOleprog8()
+{
+ unsigned int len;
+ HRESULT hresult;
+ BSTR bstr1, bstr2;
+#define LARGE_BSTR_SIZE 64300
+
+ if((bstr1 = SysAllocStringLen(NULL, LARGE_BSTR_SIZE)) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ if((bstr2 = SysAllocString(OLESTR("hello world"))) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ if((len = SysStringLen(bstr1)) != LARGE_BSTR_SIZE){
+ hresult = RESULT(E_FAIL);
+ goto LError2;
+ }
+
+ hresult = NOERROR;
+
+LError2:;
+ SysFreeString(bstr1);
+
+LError1:;
+ SysFreeString(bstr2);
+
+LError0:;
+ return hresult;
+
+#undef LARGE_BSTR_SIZE
+}
+
+// regression test for raid!oleprog:8
+//
+// SysAllocString of a string containing an embedded '\0' stops
+// copying at the '\0';
+//
+HRESULT
+BstrOleprog65()
+{
+ BSTR bstr;
+ HRESULT hresult;
+ static OLECHAR sz_embedded_null[] =
+ OLESTR("a string \0 with an embedded null");
+
+
+ bstr = SysAllocStringLen(sz_embedded_null, SIZEOFCH(sz_embedded_null));
+
+ hresult = (MEMCMP(bstr, sz_embedded_null, sizeof(sz_embedded_null)) == 0)
+ ? NOERROR
+ : RESULT(E_UNEXPECTED);
+
+ SysFreeString(bstr);
+
+ return hresult;
+}
+
+// regression test for raid!oleprog:234
+//
+// make sure we are properly handling Reallocing a bstr thats Null.
+//
+HRESULT
+BstrOleprog234()
+{
+ unsigned int len;
+ BSTR bstr;
+ static OLECHAR szHooHa[] = OLESTR("HooHa");
+
+ bstr = NULL;
+ if(!SysReAllocString(&bstr, szHooHa))
+ return RESULT(E_OUTOFMEMORY);
+
+ len = SysStringLen(bstr);
+#if (defined(WIN32) && !defined(UNICODE))
+ if(len != (unsigned int)wcslen(szHooHa))
+#else
+ if(len != STRLEN(szHooHa))
+#endif
+ return RESULT(E_FAIL);
+
+ SysFreeString(bstr);
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/tests/disptest/ccollect.cpp b/private/oleauto/tests/disptest/ccollect.cpp
new file mode 100644
index 000000000..91aa5d101
--- /dev/null
+++ b/private/oleauto/tests/disptest/ccollect.cpp
@@ -0,0 +1,422 @@
+/***
+*ccollect.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CCollectionSuite test object.
+*
+*Revision History:
+*
+* [00] 06-Dec-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+
+#include <math.h>
+
+#include "tstsuite.h"
+#include "disphelp.h"
+#include "clsid.h"
+#include "crempoly.h"
+
+ASSERTDATA
+
+
+extern OLECHAR FAR* g_CPoly;
+
+
+HRESULT CollectionTest0(void);
+HRESULT CollectionTest1(void);
+
+static struct TEST {
+ HRESULT (*pfnTest)(void);
+ OLECHAR FAR* szName;
+} rgtest[] = {
+ { CollectionTest0, OLESTR("collection test #0") }
+ , { CollectionTest1, OLESTR("collection test #1") }
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CCollectionSuite)
+
+SUITE_IUNKNOWN_IMPL(CCollectionSuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CCollectionSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Collections"), pbstr);
+}
+
+STDMETHODIMP
+CCollectionSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("collect.log"), pbstr);
+}
+
+STDMETHODIMP
+CCollectionSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CCollectionSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return ErrBstrAlloc(rgtest[iTest].szName, pbstr);
+}
+
+
+/***
+*HRESULT CCollectionSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CCollectionSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CCollectionSuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return rgtest[iTest].pfnTest();
+}
+
+
+HRESULT
+DoInvokeName(
+ IDispatch FAR* pdisp,
+ OLECHAR FAR* szMethod,
+ VARIANT FAR* pvarResult,
+ DISPPARAMS FAR* pdispparams)
+{
+ DISPID dispid;
+ OLECHAR FAR* rgsz[1];
+ DISPPARAMS dispparams;
+
+ if(pdispparams == NULL){
+ pdispparams = &dispparams;
+ pdispparams->cArgs = 0;
+ pdispparams->rgvarg = NULL;
+ pdispparams->cNamedArgs = 0;
+ pdispparams->rgdispidNamedArgs = NULL;
+ }
+
+ rgsz[0] = szMethod;
+ IfFailRet(
+ pdisp->GetIDsOfNames(
+ IID_NULL, rgsz, 1, LOCALE_SYSTEM_DEFAULT, &dispid));
+
+ return DoInvoke(pdisp, dispid, pdispparams, pvarResult, NULL, NULL);
+}
+
+
+HRESULT
+VtIs(VARIANT FAR* pvar, VARTYPE vt)
+{
+ return (V_VT(pvar) != vt) ? RESULT(E_INVALIDARG) : NOERROR;
+}
+
+struct oledisp_point { short x,y; };
+
+static struct oledisp_point rgptTriangle[] = {
+ {50, 0},
+ {0, 100},
+ {100, 100}
+};
+
+static struct oledisp_point rgptSquare[] = {
+ {0, 0},
+ {0, 100},
+ {100, 100},
+ {100, 0},
+};
+
+static struct oledisp_point rgptOctagon[] = {
+ {25, 0},
+ {75, 0},
+ {100, 25},
+ {100, 75},
+ {75, 100},
+ {25, 100},
+ {0, 75},
+ {0, 25}
+};
+
+struct oledisp_shape {
+ struct oledisp_point ptOrigin;
+ unsigned int cPoints;
+ struct oledisp_point FAR* rgpt;
+} g_rgshape[] = {
+ {{100, 50}, DIM(rgptTriangle), rgptTriangle},
+ {{200, 50}, DIM(rgptSquare), rgptSquare},
+ {{300, 50}, DIM(rgptOctagon), rgptOctagon}
+};
+
+
+HRESULT
+BuildShape(CRemPoly FAR* ppoly, struct oledisp_shape FAR* pshape)
+{
+ unsigned int i;
+
+ IfFailRet(ppoly->SetWidth(1));
+ IfFailRet(ppoly->set_red(0));
+ IfFailRet(ppoly->set_green(0));
+ IfFailRet(ppoly->set_blue(0));
+ IfFailRet(ppoly->SetXOrigin((short)pshape->ptOrigin.x));
+ IfFailRet(ppoly->SetYOrigin((short)pshape->ptOrigin.y));
+ for(i = 0; i < pshape->cPoints; ++i)
+ IfFailRet(
+ ppoly->AddPoint((short)pshape->rgpt[i].x, (short)pshape->rgpt[i].y));
+
+ return NOERROR;
+}
+
+static struct {
+ short red, green, blue;
+} g_rgrgbColors[] = {
+#if OE_MAC
+ { 0, 0, 0}
+ , { 0, 0, 0x7fff}
+ , { 0, 0x7fff, 0}
+ , {0x7fff, 0, 0}
+ , {0x7fff, 0, 0x7fff}
+ , {0x7fff, 0x7fff, 0}
+ , {0x7fff, 0x7fff, 0x7fff}
+ , { 0, 0, 0xffff}
+ , { 0, 0xffff, 0}
+ , {0xffff, 0, 0}
+ , {0xffff, 0, 0xffff}
+ , {0xffff, 0xffff, 0}
+#else
+ { 0, 0, 0}
+ , { 0, 0, 127}
+ , { 0, 127, 0}
+ , {127, 0, 0}
+ , {127, 0, 127}
+ , {127, 127, 0}
+ , {127, 127, 127}
+ , { 0, 0, 255}
+ , { 0, 255, 0}
+ , {255, 0, 0}
+ , {255, 0, 255}
+ , {255, 255, 0}
+#endif
+};
+
+HRESULT
+MoveShape(CRemPoly FAR* ppoly)
+{
+ short s;
+ int i, ix;
+ HRESULT hresult;
+ unsigned long celtFetched;
+ IDispatch FAR* pdisp;
+ IEnumVARIANT FAR* penum;
+ DISPPARAMS dispparams;
+ VARIANT varX, varY, varElt;
+
+ double delta_rads;
+
+
+ // get an enumerator for the points we just added.
+ //
+ IfFailGo(ppoly->EnumPoints(&penum), LError0);
+
+ // degrees -> radians
+ delta_rads = ((double)20.0 * 3.14159) / 180.0;
+
+ for(i = 0; i < 15; ++i){
+ IfFailGo(penum->Reset(), LError1);
+
+ VariantInit(&varElt);
+ while((hresult = penum->Next(1, &varElt, &celtFetched)) == NOERROR){
+ // make sure we got what we expected.
+ //
+ ASSERT(celtFetched == 1);
+ IfFailGo(VtIs(&varElt, VT_DISPATCH), LError1);
+
+ pdisp = V_DISPATCH(&varElt);
+ V_VT(&varElt) = VT_EMPTY;
+
+ // get the X and Y coordinates
+
+ VariantInit(&varX);
+ IfFailGo(DoInvokeName(pdisp, OLESTR("getx"), &varX, NULL), LError2);
+ IfFailGo(VtIs(&varX, VT_I2), LError3);
+
+ VariantInit(&varY);
+ IfFailGo(DoInvokeName(pdisp, OLESTR("gety"), &varY, NULL), LError3);
+ IfFailGo(VtIs(&varY, VT_I2), LError4);
+
+ // rotate the point
+
+ double x = (double)V_I2(&varX);
+ double y = (double)V_I2(&varY);
+ double radius = sqrt((x*x) + (y*y));
+ double theta = ((x == 0.0) && (y == 0.0) ? 0.0 : atan2(y, x))
+ + delta_rads;
+
+ V_I2(&varX) = (short)(radius * cos(theta));
+ V_I2(&varY) = (short)(radius * sin(theta));
+
+ // set the new X and Y coordinates
+
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = &varX;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ IfFailGo(DoInvokeName(pdisp, OLESTR("setx"), NULL, &dispparams), LError4);
+
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = &varY;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ IfFailGo(DoInvokeName(pdisp, OLESTR("sety"), NULL, &dispparams), LError4);
+
+ VariantClear(&varY);
+ VariantClear(&varX);
+
+ pdisp->Release();
+ pdisp = NULL;
+ }
+
+ if(HRESULT_FAILED(hresult))
+ goto LError1;
+
+ ASSERT(GetScode(hresult) == S_FALSE);
+
+ IfFailGo(ppoly->SetWidth(i), LError1);
+
+ IfFailGo(ppoly->GetXOrigin(&s), LError1);
+ IfFailGo(ppoly->SetXOrigin(i + i + s), LError1);
+
+ IfFailGo(ppoly->GetYOrigin(&s), LError1);
+ IfFailGo(ppoly->SetYOrigin(i + i + s), LError1);
+
+ ix = i % DIM(g_rgrgbColors);
+ IfFailGo(ppoly->set_red(g_rgrgbColors[i].red), LError1);
+ IfFailGo(ppoly->set_green(g_rgrgbColors[i].green), LError1);
+ IfFailGo(ppoly->set_blue(g_rgrgbColors[i].blue), LError1);
+
+ IfFailGo(ppoly->Draw(), LError1);
+
+ IfWin(Yield());
+ }
+
+ penum->Release();
+
+ return NOERROR;
+
+
+LError4:;
+ VariantClear(&varY);
+
+LError3:;
+ VariantClear(&varX);
+
+LError2:;
+ pdisp->Release();
+
+LError1:;
+ penum->Release();
+
+LError0:;
+ return hresult;
+}
+
+
+HRESULT
+CollectionTest1()
+{
+ int i, j;
+ HRESULT hresult;
+ CRemPoly FAR* ppoly[2];
+
+ for(i = 0; i < DIM(ppoly); ++i)
+ ppoly[i] = NULL;
+
+ IfFailGo(CRemPoly::Create(OLESTR("SPoly.Application"), &ppoly[0]), LError0);
+ IfFailGo(CRemPoly::Create(OLESTR("SPoly2.Application"), &ppoly[1]), LError0);
+
+ for(j = 0; j < DIM(g_rgshape); ++j)
+ {
+ for(i = 0; i < DIM(ppoly); ++i)
+ IfFailGo(BuildShape(ppoly[i], &g_rgshape[j]), LError0);
+
+ for(i = 0; i < DIM(ppoly); ++i){
+ IfFailGo(ppoly[i]->Draw(), LError0);
+ IfFailGo(MoveShape(ppoly[i]), LError0);
+ }
+
+ for(i = 0; i < DIM(ppoly); ++i)
+ IfFailGo(ppoly[i]->Reset(), LError0);
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+ for(i = 0; i < DIM(ppoly); ++i)
+ if(ppoly[i] != NULL)
+ ppoly[i]->Release();
+
+ return hresult;
+}
+
+
+HRESULT
+CollectionTest0()
+{
+ HRESULT hresult;
+ CRemPoly FAR* ppoly;
+ IEnumVARIANT FAR* penum;
+ IEnumVARIANT FAR* penumClone;
+
+ IfFailGo(CRemPoly::Create(OLESTR("SPoly.Application"), &ppoly), LError0);
+
+ ppoly->AddPoint(0, 0);
+ ppoly->AddPoint(0, 50);
+ ppoly->AddPoint(50, 0);
+ ppoly->AddPoint(50, 50);
+ ppoly->Draw();
+
+ IfFailGo(ppoly->EnumPoints(&penum), LError1);
+
+ IfFailGo(penum->Clone(&penumClone), LError2);
+
+ hresult = NOERROR;
+
+ penumClone->Release();
+
+LError2:;
+ penum->Release();
+
+LError1:;
+ ppoly->Release();
+
+LError0:;
+ return hresult;
+}
+
diff --git a/private/oleauto/tests/disptest/cdatecnv.cpp b/private/oleauto/tests/disptest/cdatecnv.cpp
new file mode 100644
index 000000000..70ebdd436
--- /dev/null
+++ b/private/oleauto/tests/disptest/cdatecnv.cpp
@@ -0,0 +1,491 @@
+/***
+*cdatecnv.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CDateCoersionSuite. This suite tests date/time
+* coersions - primarrily date<->bstr.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include "disptest.h"
+#include "tstsuite.h"
+
+
+static LCID rglcid[] = {
+ 0
+ , 0x040c
+ , 0x0407
+ , 0x0409
+ , 0x0809
+ , 0x0c09
+ , 0x1009
+ , 0x1409
+ , 0x0406
+ , 0x0413
+ , 0x0813
+ , 0x040b
+ , 0x080c
+ , 0x0c0c
+ , 0x100c
+ , 0x0807
+ , 0x0c07
+ , 0x0410
+ , 0x0810
+ , 0x040a
+ , 0x080a
+ , 0x0c0a
+ , 0x041d
+ , 0x0414
+ , 0x0416
+ , 0x0816
+ , 0x0405
+ , 0x040e
+ , 0x0415
+ , 0x041b
+ , 0x0419
+};
+
+static OLECHAR FAR* rgpszSimpleDate[] =
+{
+ OLESTR("1-7-66")
+ , OLESTR("1.20")
+ , OLESTR("1-7-100")
+ , OLESTR("1-7-1966")
+ , OLESTR("01-7-66")
+ , OLESTR("01-07-66")
+ , OLESTR("01-07-0100")
+ , OLESTR("01-07-1966")
+ , OLESTR("1/7/66")
+ , OLESTR("1/7/100")
+ , OLESTR("1/7/1966")
+ , OLESTR("1-7/66")
+ , OLESTR("1-7/100")
+ , OLESTR("1-7/1966")
+ , OLESTR("1/7-66")
+ , OLESTR("1/7-100")
+ , OLESTR("1/7-1966")
+ , OLESTR("1-7-66")
+ , OLESTR("1-7-100")
+ , OLESTR("1-7-1966")
+ , OLESTR("1 - 7 - 66")
+ , OLESTR("1 - 7 - 100")
+ , OLESTR("1 - 7 - 1966")
+ , OLESTR(" 1/7/1966")
+ , OLESTR("1/7/1966 ")
+ , OLESTR(" 1 / 07 / 66 ")
+ , OLESTR("\t1\t/\t07\t/\t66\t")
+ , NULL
+};
+
+static OLECHAR FAR* rgpszShortMonth[] =
+{
+ OLESTR("jan 10, 22")
+ , OLESTR("feb 03, 1999")
+ , OLESTR("mar 31, 1945")
+ , OLESTR("apr 1, 2002")
+ , OLESTR("may 15, 2020")
+ , OLESTR("jun 08, 1978")
+ , OLESTR("jul 30 1492")
+ , OLESTR("aug 12 1010")
+ , OLESTR("sep 3 1877")
+ , OLESTR(" oct 4, 1214")
+ , OLESTR("nov 12 1313 ")
+ , OLESTR(" dec 7, 1942 ")
+ , OLESTR("10 jan 22")
+ , OLESTR("03 feb 1999")
+ , OLESTR("31, mar 1945")
+ , OLESTR("1, apr 2002")
+ , OLESTR("15, may 2020")
+ , OLESTR("08 jun, 1978")
+ , OLESTR("30 jul 1492")
+ , OLESTR("12 aug 1010")
+ , OLESTR(" 3 sep 1877")
+ , OLESTR("004 oct, 1214")
+ , OLESTR("12 nov 1313 ")
+ , OLESTR("7, dec, 1942 ")
+ , OLESTR("\t7\t,\tdec\t,\t1942\t")
+ , NULL
+};
+
+static OLECHAR FAR* rgpszLongMonth[] =
+{
+ OLESTR("january 10, 22")
+ , OLESTR("february 03, 1999")
+ , OLESTR("march 31, 1945")
+ , OLESTR("april 1, 2002")
+ , OLESTR("may 15, 2020")
+ , OLESTR("june 08, 1978")
+ , OLESTR("july 30 1492")
+ , OLESTR("august 12 1010")
+ , OLESTR("september 3 1877")
+ , OLESTR(" october 4, 1214")
+ , OLESTR("november 12 1313 ")
+ , OLESTR(" december 7, 1942 ")
+ , OLESTR("10 January 22")
+ , OLESTR("03 February 1999")
+ , OLESTR("31, March 1945")
+ , OLESTR("1, April 2002")
+ , OLESTR("15, May 2020")
+ , OLESTR("08 June, 1978")
+ , OLESTR("30 JULY 1492")
+ , OLESTR("12 AugUST 1010")
+ , OLESTR(" 3 SePtEmBeR 1877")
+ , OLESTR("004 OCTOBER, 1214")
+ , OLESTR("12 NOVembER 1313 ")
+ , OLESTR("7, DeceMBeR, 1942 ")
+ , OLESTR("\t7,\tDeceMBeR,\t1942\t")
+ , NULL
+};
+
+static OLECHAR FAR* rgpszPartialDate[] =
+{
+ OLESTR("1-10")
+ , OLESTR("2-99")
+ , OLESTR("mar 15")
+ , OLESTR("15 april")
+ , OLESTR("may 45")
+ , OLESTR("99 JUN")
+ , OLESTR(" 1/20")
+ , OLESTR(" 12-15 ")
+ , NULL
+};
+
+static OLECHAR FAR* rgpszSimpleTime[] = {
+ OLESTR("0:0:0")
+ , OLESTR("0:0:0 am")
+ , OLESTR("0:0:0 pm")
+ , OLESTR("1:0:0")
+ , OLESTR("1:0:0 am")
+ , OLESTR("1:0:0 pm")
+ , OLESTR("11:0:0")
+ , OLESTR("11:0:0 am")
+ , OLESTR("11:0:0 pm")
+ , OLESTR("12:0:0")
+ , OLESTR("12:0:0 am")
+ , OLESTR("12:0:0 pm")
+ , OLESTR("13:0:0")
+ , OLESTR("23:0:0")
+ , OLESTR("1:2:3")
+ , OLESTR("01:2:3")
+ , OLESTR("1:02:3")
+ , OLESTR("01:2:03")
+ , OLESTR("01:02:03")
+ , OLESTR("1.2.3")
+ , OLESTR("01.2.3")
+ , OLESTR("1.02.3")
+ , OLESTR("01.2.03")
+ , OLESTR("01.02.03")
+ , OLESTR("1.2.3 am")
+ , OLESTR("01.2.3 am")
+ , OLESTR("1.02.3 am")
+ , OLESTR("01.2.03 am")
+ , OLESTR("01.02.03 am")
+ , OLESTR("1.2.3 pm")
+ , OLESTR("01.2.3 pm")
+ , OLESTR("1.02.3 pm")
+ , OLESTR("01.2.03 pm")
+ , OLESTR("01.02.03 pm")
+ , OLESTR("1.2.3 a")
+ , OLESTR("01.2.3 a")
+ , OLESTR("1.02.3 a")
+ , OLESTR("01.2.03 a")
+ , OLESTR("01.02.03 a")
+ , OLESTR("1.2.3 p")
+ , OLESTR("01.2.3 p")
+ , OLESTR("1.02.3 p")
+ , OLESTR("01.2.03 p")
+ , OLESTR("01.02.03 p")
+ , OLESTR(" 1. 2. 3 ")
+ , OLESTR(" 01. 2. 3 am ")
+ , OLESTR(" 1.02: 3 p ")
+ , OLESTR(" 01: 2.03 pm ")
+ , OLESTR(" 01:02:03 p ")
+ , OLESTR(" 25:0 ")
+ , OLESTR("1.61 p")
+ , OLESTR("1.2.99")
+ , NULL
+};
+
+static OLECHAR FAR* rgpszPartialTime[] = {
+ OLESTR("1 a")
+ , OLESTR("2 am")
+ , OLESTR("3 p ")
+ , OLESTR("04 pm")
+ , OLESTR("5:50")
+ , OLESTR("6:6 a")
+ , OLESTR("7:7 am")
+ , OLESTR("08:08 p")
+ , OLESTR("09:09 pm")
+ , OLESTR("10:10")
+ , OLESTR("11:11 ")
+ , OLESTR(" 12:12")
+ , OLESTR(" 13:13 ")
+ , OLESTR("14.14")
+ , OLESTR("15.15 ")
+ , OLESTR(" 16.16")
+ , OLESTR(" 17.17 ")
+ , OLESTR("18:18")
+ , OLESTR("19:19 ")
+ , OLESTR(" 20:20")
+ , OLESTR(" 21.21 ")
+ , OLESTR("22.22")
+ , OLESTR("23.59 ")
+ , NULL
+};
+
+static OLECHAR FAR* rgpszDateTime[] = {
+ OLESTR("1-7-66 12:14:00")
+ , OLESTR("1/7/1966 12:14")
+ , OLESTR("1/7 12:14")
+ , OLESTR("jan 7, 1966 12:14 am")
+ , OLESTR("jan 7 12:14")
+ , OLESTR("january 7 1993 1:20 pm")
+ , OLESTR("feb 18, 2002 23:59:50")
+ , OLESTR("mar 12 1 am")
+ , OLESTR("apr 30 45 2 a")
+ , OLESTR("may/7, 1475 10.02")
+ , OLESTR("1 7 5 am")
+ , OLESTR("7 jan 1966 12:14 am")
+ , OLESTR("17 jan 12:14")
+ , OLESTR("7 january 1993 1:20 pm")
+ , OLESTR("18 feb, 2002 23:59:50")
+ , OLESTR("12 mar 1 am")
+ , OLESTR("30 apr 45 2 a")
+ , OLESTR("7/may, 1475 10.02")
+ , NULL
+};
+
+static OLECHAR FAR* rgpszTimeDate[] = {
+ OLESTR("12:14:00 1-7-66")
+ , OLESTR("12:14 1/7/1966")
+ , OLESTR("12:14 1/7")
+ , OLESTR("12:14 am jan 7, 1966")
+ , OLESTR("12:14:00 jan 7")
+ , OLESTR("1:20 pm january 7 1993")
+ , OLESTR("23.59:50 feb 18, 2002")
+ , OLESTR("1 am mar 12")
+ , OLESTR("2 a apr 30 45")
+ , OLESTR("10.02 may/7, 1475 ")
+ , OLESTR("5 am 1 7")
+ , OLESTR(" 12:14 am 7 jan 1966 ")
+ , OLESTR("02.04 17 jan")
+ , OLESTR("1.20 pm 7 january 1993")
+ , OLESTR("23:59.50 18 feb, 2002")
+ , OLESTR("1 am 12 mar ")
+ , OLESTR(" 2 a 30 apr 45")
+ , OLESTR(" 10.02 7/may, 1475 ")
+ , NULL
+};
+
+// the following date strings are invalid formats and should generate errors
+
+static OLECHAR FAR* rgpszErrors[] = {
+ OLESTR("")
+ , OLESTR(" ")
+ , OLESTR("\t")
+ , OLESTR("1")
+ , OLESTR("33/33")
+ , OLESTR("1-2-3-4")
+ , OLESTR("1-2-3 4")
+ , OLESTR("1-2 3 4")
+ , OLESTR("1 2 3 4")
+ , OLESTR("1/2/3/4")
+ , OLESTR("1/2/3 4")
+ , OLESTR("1/2 3 4")
+ , OLESTR("1 2 3 4")
+ , OLESTR("1/")
+ , OLESTR("1-")
+ , OLESTR("-1")
+ , OLESTR("/1")
+ , OLESTR("jan")
+ , OLESTR("august")
+ , OLESTR("1:")
+ , OLESTR(":1")
+ , OLESTR("1:.2")
+ , OLESTR("1.2.3.4")
+ , OLESTR("1 am 2")
+ , OLESTR("2 p 3.3")
+ , OLESTR("1-7-66 2:20 pm 1-7-66")
+ , OLESTR("2:20 1-7 2 pm")
+ , OLESTR("25 p")
+ , OLESTR("1.60")
+ , OLESTR("1.2.60")
+ , NULL
+};
+
+static OLECHAR FAR* rgpszBugs[] = {
+ OLESTR("1993-04-01")
+ , OLESTR("2:30:30 5:40:") // error
+ , OLESTR("2:30:30p")
+ , OLESTR("2/3/4 3.4.5")
+ , OLESTR("13.13.13")
+ , OLESTR("1,2,3")
+ , OLESTR("March 23, 1900")
+ , OLESTR("September 2000")
+ , OLESTR("1/68")
+ , OLESTR("3/13")
+ , OLESTR("3/31")
+ , OLESTR("3/32")
+ , OLESTR("2.3.4 3.4.5") // error
+ , OLESTR("1993-02-01")
+ , OLESTR("1993/2/28")
+ , NULL
+};
+
+static OLECHAR FAR* FAR* rgprgszTests[] = {
+ rgpszBugs
+ , rgpszSimpleDate
+ , rgpszShortMonth
+ , rgpszLongMonth
+ , rgpszPartialDate
+ , rgpszSimpleTime
+ , rgpszPartialTime
+ , rgpszDateTime
+ , rgpszTimeDate
+ , rgpszErrors
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CDateCoersionSuite)
+
+SUITE_IUNKNOWN_IMPL(CDateCoersionSuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CDateCoersionSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Date Coersions"), pbstr);
+}
+
+STDMETHODIMP
+CDateCoersionSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("bstrdate.log"), pbstr);
+}
+
+STDMETHODIMP
+CDateCoersionSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rglcid);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDateCoersionSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ TCHAR rgch[32];
+
+ if(iTest >= DIM(rglcid))
+ return RESULT(E_INVALIDARG);
+
+ SPRINTF(rgch, TSTR("(lcid=0x%lx) bstr->date"), rglcid[iTest]);
+ *pbstr = SysAllocString(WIDESTRING(rgch));
+ return NOERROR;
+}
+
+// run a single set of date->bstr coersion tests
+HRESULT
+DoDateOfBstr(LCID lcid, int index)
+{
+ int i;
+ HRESULT hresult;
+ VARIANT varBstr, varDate;
+ OLECHAR FAR* FAR* rgpsz, FAR* psz;
+
+ rgpsz = rgprgszTests[index];
+
+ for(i = 0; rgpsz[i] != NULL; ++i){
+
+ psz = rgpsz[i];
+
+ VariantInit(&varBstr);
+ VariantInit(&varDate);
+
+ V_VT(&varBstr) = VT_BSTR;
+ if((V_BSTR(&varBstr) = SysAllocString(psz)) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ DbPrintf("\"%Fs\" =>", STRING(V_BSTR(&varBstr)));
+
+ hresult = VariantChangeTypeEx(&varDate, &varBstr, lcid, 0, VT_DATE);
+
+ if(hresult != NOERROR){
+
+ DbPrintf(" [%Fs]", DbSzOfScode(GetScode(hresult)));
+
+ }else{
+
+ DbPrintf(" %g => ", V_DATE(&varDate));
+
+ VariantClear(&varBstr);
+
+ hresult = VariantChangeTypeEx(&varBstr, &varDate, lcid, 0, VT_BSTR);
+
+ if(hresult != NOERROR){
+
+ DbPrintf(" [%Fs]", DbSzOfScode(GetScode(hresult)));
+
+ }else{
+
+ DbPrintf(" \"%Fs\"", STRING(V_BSTR(&varBstr)));
+
+ }
+ }
+
+ DbPrintf("\n");
+
+ VariantClear(&varDate);
+ VariantClear(&varBstr);
+ }
+
+ return NOERROR;
+}
+
+// run all of the bstr-date coersion tests for a given locale
+HRESULT
+DateOfBstr(LCID lcid)
+{
+ int i;
+
+ for(i = 0; i < DIM(rgprgszTests); ++i){
+ IfFailRet(DoDateOfBstr(lcid, i));
+ }
+ return NOERROR;
+}
+
+/***
+*HRESULT CDateCoersionSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CDateCoersionSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CDateCoersionSuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rglcid))
+ return RESULT(E_INVALIDARG);
+
+ return DateOfBstr(rglcid[iTest]);
+}
+
diff --git a/private/oleauto/tests/disptest/cdisptst.def b/private/oleauto/tests/disptest/cdisptst.def
new file mode 100644
index 000000000..632886c5f
--- /dev/null
+++ b/private/oleauto/tests/disptest/cdisptst.def
@@ -0,0 +1,13 @@
+NAME DispTest
+
+EXETYPE WINDOWS
+
+CODE PRELOAD MOVEABLE DISCARDABLE
+
+DATA PRELOAD MOVEABLE MULTIPLE
+
+HEAPSIZE 1024
+STACKSIZE 16384
+
+;EXPORTS
+; MainWndProc @1
diff --git a/private/oleauto/tests/disptest/cdisptst.r b/private/oleauto/tests/disptest/cdisptst.r
new file mode 100644
index 000000000..a20ae22f6
--- /dev/null
+++ b/private/oleauto/tests/disptest/cdisptst.r
@@ -0,0 +1,329 @@
+#ifdef _PPCMAC
+include "cfrg.rsc";
+#endif
+
+#include "systypes.r"
+#include "types.r"
+#include "macmain.h"
+
+resource 'vers' (1) {
+ 0x02, 0x00, release, 0x00,
+ verUS,
+ "1.02",
+ "1.02, Copyright \251 1993 Microsoft."
+};
+
+/* we use an MBAR resource to conveniently load all the menus */
+
+resource 'MBAR' (rMenuBar, preload) {
+ { mApple, mFile, mEdit, mSuite, mOptions };
+};
+
+
+resource 'MENU' (mApple, preload) {
+ mApple, textMenuProc,
+ 0b1111111111111111111111111111101,
+ enabled, apple,
+ {
+ "About CDispTst\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mFile, preload) {
+ mFile, textMenuProc,
+ 0b0000000000000000000100000000000,
+ enabled, "File",
+ {
+ "New",
+ noicon, "N", nomark, plain;
+ "Open",
+ noicon, "O", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Close",
+ noicon, "W", nomark, plain;
+ "Save",
+ noicon, "S", nomark, plain;
+ "Save As\311",
+ noicon, nokey, nomark, plain;
+ "Revert",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Page Setup\311",
+ noicon, nokey, nomark, plain;
+ "Print\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Quit",
+ noicon, "Q", nomark, plain
+ }
+};
+
+resource 'MENU' (mEdit, preload) {
+ mEdit, textMenuProc,
+ 0b0000000000000000000000000000000,
+ enabled, "Edit",
+ {
+ "Undo",
+ noicon, "Z", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Cut",
+ noicon, "X", nomark, plain;
+ "Copy",
+ noicon, "C", nomark, plain;
+ "Paste",
+ noicon, "V", nomark, plain;
+ "Clear",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mSuite, preload) {
+ mSuite, textMenuProc,
+ 0b0000000000000000000111111111111,
+ enabled, "Suite",
+ {
+ "Bstr API",
+ noicon, nokey, nomark, plain;
+ "Time API",
+ noicon, nokey, nomark, plain;
+ "Date Coersions",
+ noicon, nokey, nomark, plain;
+ "Variant API",
+ noicon, nokey, nomark, plain;
+ "SafeArray API",
+ noicon, nokey, nomark, plain;
+ "NLS API",
+ noicon, nokey, nomark, plain;
+ "Binding",
+ noicon, nokey, nomark, plain;
+ "Invoke ByVal",
+ noicon, nokey, nomark, plain;
+ "Invoke ByRef",
+ noicon, nokey, nomark, plain;
+ "Invoke Array",
+ noicon, nokey, nomark, plain;
+ "Invoke Excepinfo",
+ noicon, nokey, nomark, plain;
+ "Collections",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mOptions, preload) {
+ mOptions, textMenuProc,
+ 0b0000000000000000000000000000011,
+ enabled, "Options",
+ {
+ "Clear",
+ noicon, "C", nomark, plain;
+ "Debugger",
+ noicon, nokey, nomark, plain
+ }
+};
+
+
+/* this ALRT and DITL are used as an About screen */
+
+resource 'ALRT' (rAboutAlert, purgeable) {
+ {40, 20, 160, 296}, rAboutAlert, {
+ OK, visible, silent;
+ OK, visible, silent;
+ OK, visible, silent;
+ OK, visible, silent
+ };
+};
+
+resource 'DITL' (rAboutAlert, purgeable) {
+ { /* array DITLarray: 5 elements */
+ /* [1] */
+ {88, 184, 108, 264},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {8, 8, 24, 274},
+ StaticText {
+ disabled,
+ "IDispatch Test Application"
+ },
+ /* [3] */
+ {32, 8, 48, 237},
+ StaticText {
+ disabled,
+ "Copyright \251 1993 Microsoft"
+ },
+ /* [4] */
+ {56, 8, 72, 136},
+ StaticText {
+ disabled,
+ "Brought to you by:"
+ },
+ /* [5] */
+ {80, 24, 112, 167},
+ StaticText {
+ disabled,
+ "The Ole Automation Team"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an error screen */
+
+resource 'ALRT' (rUserAlert, purgeable) {
+ {40, 20, 150, 260},
+ rUserAlert,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+
+resource 'DITL' (rUserAlert, purgeable) {
+ { /* array DITLarray: 3 elements */
+ /* [1] */
+ {80, 150, 100, 230},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 60, 230},
+ StaticText {
+ disabled,
+ "Error. ^0."
+ },
+ /* [3] */
+ {8, 8, 40, 40},
+ Icon {
+ disabled,
+ 2
+ }
+ }
+};
+
+
+resource 'WIND' (rDocWindow, preload, purgeable) {
+ {64, 60, 314, 460},
+ zoomDocProc, invisible, goAway, 0x0, "untitled"
+};
+
+
+resource 'CNTL' (rVScroll, preload, purgeable) {
+ {-1, 385, 236, 401},
+ 0, visible, 0, 0, scrollBarProc, 0, ""
+};
+
+
+resource 'CNTL' (rHScroll, preload, purgeable) {
+ {235, -1, 251, 386},
+ 0, visible, 0, 0, scrollBarProc, 0, ""
+};
+
+resource 'STR#' (kErrStrings, purgeable) {
+ {
+ "You must run on 512Ke or later";
+ "Application Memory Size is too small";
+ "Not enough memory to run CDispTst";
+ "Not enough memory to do Cut";
+ "Cannot do Cut";
+ "Cannot do Copy";
+ "Cannot exceed 32,000 characters with Paste";
+ "Not enough memory to do Paste";
+ "Cannot create window";
+ "Cannot exceed 32,000 characters";
+ "Cannot do Paste"
+ }
+};
+
+resource 'SIZE' (-1) {
+ dontSaveScreen,
+ acceptSuspendResumeEvents,
+ enableOptionSwitch,
+ canBackground,
+ multiFinderAware,
+ backgroundAndForeground,
+ dontGetFrontClicks,
+ ignoreChildDiedEvents,
+ is32BitCompatible,
+ isHighLevelEventAware,
+ localAndRemoteHLEvents,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ kPrefSize * 1024,
+ kMinSize * 1024
+};
+
+
+type 'MOOT' as 'STR ';
+
+
+resource 'MOOT' (0) {
+ "MultiFinder-Aware TextEdit Sample Application"
+};
+
+
+resource 'BNDL' (128) {
+ 'MOOT',
+ 0,
+ {
+ 'ICN#',
+ {
+ 0, 128
+ },
+ 'FREF',
+ {
+ 0, 128
+ }
+ }
+};
+
+
+resource 'FREF' (128) {
+ 'APPL',
+ 0,
+ ""
+};
+
+
+resource 'ICN#' (128) {
+ { /* array: 2 elements */
+ /* [1] */
+ $"04 30 40 00 0A 50 A0 00 0B 91 10 02 08 22 08 03"
+ $"12 24 04 05 20 28 02 09 40 10 01 11 80 0C 00 A1"
+ $"80 03 FF C2 7E 00 FF 04 01 00 7F 04 03 00 1E 08"
+ $"04 E0 00 0C 08 E0 00 0A 10 E0 00 09 08 C0 00 06"
+ $"04 87 FE 04 02 88 01 04 01 88 00 84 00 88 00 44"
+ $"00 88 00 44 00 88 00 C4 01 10 01 88 02 28 03 10"
+ $"01 C4 04 E0 00 02 08 00 73 BF FB EE 4C A2 8A 2A"
+ $"40 AA AA EA 52 AA AA 24 5E A2 8A EA 73 BE FB 8E",
+ /* [2] */
+ $"04 30 40 00 0E 70 E0 00 0F F1 F0 02 0F E3 F8 03"
+ $"1F E7 FC 07 3F EF FE 0F 7F FF FF 1F FF FF FF BF"
+ $"FF FF FF FE 7F FF FF FC 01 FF FF FC 03 FF FF F8"
+ $"07 FF FF FC 0F FF FF FE 1F FF FF FF 0F FF FF FE"
+ $"07 FF FF FC 03 FF FF FC 01 FF FF FC 00 FF FF FC"
+ $"00 FF FF FC 00 FF FF FC 01 FF FF F8 03 EF FF F0"
+ $"01 C7 FC E0 00 03 F8 00 73 BF FB EE 7F BE FB EE"
+ $"7F BE FB EE 7F BE FB E4 7F BE FB EE 73 BE FB 8E"
+ }
+};
+
diff --git a/private/oleauto/tests/disptest/cdisptst.rc b/private/oleauto/tests/disptest/cdisptst.rc
new file mode 100644
index 000000000..848ccda54
--- /dev/null
+++ b/private/oleauto/tests/disptest/cdisptst.rc
@@ -0,0 +1,87 @@
+/***
+*cdisptst.rc
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Resource script for cdisptst.exe
+*
+*
+*Revision History:
+*
+* [00] 27-Apr-93 bradlo: Created (added header).
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# include <wlm.h>
+#else
+# include <windows.h>
+#endif
+#include "resource.h"
+
+#include "assert.dlg"
+
+SUITEDLG DIALOG DISCARDABLE 0, 0, 177, 114
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Executing..."
+FONT 8, "MS Sans Serif"
+BEGIN
+ PUSHBUTTON "Cancel",IDCANCEL,65,91,47,17
+ LTEXT "",IDD_SUITE_NAME,17,20,145,8
+ LTEXT "",IDD_SUITE_TESTNAME,17,42,145,8
+ LTEXT "",IDD_SUITE_GUAGE,16,58,145,12
+ CTEXT "",IDD_SUITE_PERCENT,78,75,20,9
+ LTEXT "Suite:",1002,17,11,20,8
+ LTEXT "Test:",1003,17,33,20,8
+END
+
+AboutBox DIALOG 22, 17, 144, 75
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "About IDispatch Test App"
+BEGIN
+ CTEXT "Microsoft Windows" -1, 0, 5, 144, 8
+ CTEXT "IDispatch Test Application" -1, 0, 14, 144, 8
+ CTEXT "Version 1.0" -1, 0, 34, 144, 8
+ DEFPUSHBUTTON "OK" IDOK, 53, 59, 32, 14, WS_GROUP
+END
+
+
+DISPTESTMENU MENU DISCARDABLE
+BEGIN
+ MENUITEM "All", IDM_ALL
+ POPUP "Suite"
+ BEGIN
+ MENUITEM "Bstr API", IDM_SUITE_BSTR
+ MENUITEM "Time API", IDM_SUITE_TIME
+ MENUITEM "Date Coersions", IDM_SUITE_DATECNV
+ MENUITEM "Variant API", IDM_SUITE_VARIANT
+ MENUITEM "SafeArray API", IDM_SUITE_SAFEARRAY
+ MENUITEM "NLS API", IDM_SUITE_NLS
+ MENUITEM "Binding", IDM_SUITE_BIND
+ MENUITEM "Invoke ByVal", IDM_SUITE_INVOKE_BYVAL
+ MENUITEM "Invoke ByRef", IDM_SUITE_INVOKE_BYREF
+ MENUITEM "Invoke Multiple", IDM_SUITE_INVOKE_MULTIPLE, GRAYED
+ MENUITEM "Invoke Array", IDM_SUITE_INVOKE_SAFEARRAY
+ MENUITEM "Invoke Excepinfo", IDM_SUITE_INVOKE_EXCEPINFO
+ MENUITEM "Collections", IDM_SUITE_COLLECTION
+#if VBA2
+ MENUITEM "Early binding", IDM_SUITE_EARLY
+#endif
+
+ END
+ POPUP "Options"
+ BEGIN
+ MENUITEM "Named", IDM_OPTIONS_NAMED
+ MENUITEM "Trace", IDM_OPTIONS_TRACE
+ MENUITEM "MultiThread", IDM_OPTIONS_MULTITHREAD
+ END
+ POPUP "Help"
+ BEGIN
+ MENUITEM "About IDispatch Test App...", IDM_HELP_ABOUT
+
+ END
+END
diff --git a/private/oleauto/tests/disptest/cearly.cpp b/private/oleauto/tests/disptest/cearly.cpp
new file mode 100644
index 000000000..17671f7c4
--- /dev/null
+++ b/private/oleauto/tests/disptest/cearly.cpp
@@ -0,0 +1,319 @@
+/***
+*cearly.cpp
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CEarlySuite test object.
+*
+*Revision History:
+*
+* [00] 30-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include "disptest.h"
+#include "tstsuite.h"
+#include "clsid.h"
+#include "dualtst.h"
+
+ASSERTDATA
+
+HRESULT Properties(IDualTst FAR* pdual);
+HRESULT Methods0(IDualTst FAR* pdual);
+HRESULT Methods1(IDualTst FAR* pdual);
+HRESULT ErrorInfo(IDualTst FAR* pdual);
+
+struct TEST{
+ HRESULT (*pfnTest)(IDualTst FAR*);
+ OLECHAR FAR* szName;
+};
+
+#if OE_WIN32
+# define TESTCASE(X) X, L#X
+#else
+# define TESTCASE(X) X, #X
+#endif
+
+
+static TEST rgtest[] =
+{
+ { TESTCASE(Properties) }
+ , { TESTCASE(Methods0) }
+ , { TESTCASE(Methods1) }
+ , { TESTCASE(ErrorInfo) }
+};
+
+SUITE_CONSTRUCTION_IMPL(CEarlySuite)
+
+SUITE_IUNKNOWN_IMPL(CEarlySuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CEarlySuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Early"), pbstr);
+}
+
+STDMETHODIMP
+CEarlySuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("early.log"), pbstr);
+}
+
+STDMETHODIMP
+CEarlySuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CEarlySuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ TCHAR *szFmt;
+ TCHAR buf[128];
+
+ szFmt = TSTR("Early binding - Universal marshaler");
+
+ SPRINTF(buf, szFmt, STRING(rgtest[iTest].szName));
+ *pbstr = SysAllocString(WIDESTRING(buf));
+ return NOERROR;
+}
+
+/***
+*HRESULT CEarlySuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CEarlySuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CEarlySuite::DoTest(unsigned int iTest)
+{
+ HRESULT hresult;
+ IDualTst FAR* pdual;
+ IDispatch FAR* pdisp;
+
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_FAIL);
+
+ pdisp = NULL;
+ pdual =NULL;
+
+ IfFailGo(CreateObject(OLESTR("sdisptst.cdualtst"), &pdisp), Error);
+ IfFailGo(pdisp->QueryInterface(IID_IDualTst, (void FAR* FAR*)&pdual), Error);
+ IfFailGo(rgtest[iTest].pfnTest(pdual), Error);
+
+ hresult = NOERROR;
+
+Error:;
+ if(pdisp != NULL)
+ pdisp->Release();
+ if(pdual != NULL)
+ pdual->Release();
+ return hresult;
+}
+
+HRESULT
+Properties(IDualTst FAR* pdual)
+{
+ unsigned char ui1;
+ short i2;
+ long i4;
+ float r4;
+ double r8;
+ CY cy;
+ DATE date;
+ BSTR bstr;
+ VARIANT var;
+ IDispatch FAR* pdisp;
+ HRESULT hresult;
+
+ bstr = NULL;
+ pdisp = NULL;
+ VariantInit(&var);
+
+ IfFailGo(pdual->get_ui1(&ui1), Error);
+ IfFailGo(pdual->put_ui1(ui1+1), Error);
+
+ IfFailGo(pdual->get_i2(&i2), Error);
+ IfFailGo(pdual->put_i2(i2+1), Error);
+
+ IfFailGo(pdual->get_i4(&i4), Error);
+ IfFailGo(pdual->put_i4(i4+1), Error);
+
+ IfFailGo(pdual->get_r4(&r4), Error);
+ IfFailGo(pdual->put_r4(r4+(float)1.0), Error);
+
+ IfFailGo(pdual->get_r8(&r8), Error);
+ IfFailGo(pdual->put_r8(r8+1.0), Error);
+
+ IfFailGo(pdual->get_cy(&cy), Error);
+ cy.Hi += 1;
+ cy.Lo += 1;
+ IfFailGo(pdual->put_cy(cy), Error);
+
+ IfFailGo(pdual->get_date(&date), Error);
+ IfFailGo(pdual->put_date(date+1.0), Error);
+
+ IfFailGo(pdual->get_bstr(&bstr), Error);
+ IfFailGo(pdual->put_bstr(bstr), Error);
+
+ IfFailGo(pdual->get_disp(&pdisp), Error);
+ IfFailGo(pdual->putref_disp(pdisp), Error);
+ IfFailGo(pdual->putref_disp(NULL), Error);
+
+ IfFailGo(pdual->get_var(&var), Error);
+ VariantClear(&var);
+ V_VT(&var) = VT_I2;
+ V_I2(&var) = 42;
+ IfFailGo(pdual->putref_var(var), Error);
+
+ hresult = NOERROR;
+
+Error:;
+ if(pdisp != NULL)
+ pdisp->Release();
+ SysFreeString(bstr);
+ VariantClear(&var);
+ return hresult;
+}
+
+HRESULT
+Methods0(IDualTst FAR* pdual)
+{
+ CY cy;
+ BSTR bstr;
+ VARIANT var;
+ IDispatch FAR* pdisp;
+ HRESULT hresult;
+
+ bstr = NULL;
+ pdisp = NULL;
+ VariantInit(&var);
+ MEMSET(&cy, 0, sizeof(cy));
+
+ IfFailRet(pdual->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp));
+ bstr = SysAllocString(OLESTR("A string!"));
+
+ IfFailGo(pdual->m0(41, 42, 43, 4.2, 4.3, cy, 4.4, bstr, pdisp, var), Error);
+ IfFailGo(pdual->putref_disp(NULL), Error); // cleanup cycle
+
+ hresult = NOERROR;
+
+Error:;
+ if(pdisp != NULL)
+ pdisp->Release();
+ SysFreeString(bstr);
+ VariantClear(&var);
+ return hresult;
+}
+
+HRESULT
+Methods1(IDualTst FAR* pdual)
+{
+ unsigned char ui1 = 0;
+ short i2 = 0;
+ long i4 = 0;
+ float r4 = 0;
+ double r8 = 0;
+ CY cy;
+ DATE date = 0;
+ BSTR bstr;
+ VARIANT var;
+ IDispatch FAR* pdisp;
+ HRESULT hresult;
+
+ cy.Hi = 0;
+ cy.Lo = 0;
+ bstr = NULL;
+ pdisp = NULL;
+ VariantInit(&var);
+
+ IfFailGo(pdual->m1(&ui1, &i2, &i4, &r4, &r8, &cy, &date, &bstr, &pdisp, &var), Error);
+ IfFailGo(pdual->m1(&ui1, &i2, &i4, &r4, &r8, &cy, &date, &bstr, &pdisp, &var), Error);
+ hresult = NOERROR;
+
+Error:;
+ if(pdisp != NULL)
+ pdisp->Release();
+ SysFreeString(bstr);
+ VariantClear(&var);
+ return hresult;
+}
+
+HRESULT
+ErrorInfo(IDualTst FAR* pdual)
+{
+ HRESULT hresult;
+ IErrorInfo FAR* perrinfo;
+ unsigned long dwHelpContext;
+ BSTR bstrSource, bstrDescription, bstrHelpFile;
+#if OE_WIN32
+ char rgchTemp[128]; //Unicode-to-ansi conversion buffer
+#endif
+
+ perrinfo = NULL;
+ bstrSource = SysAllocString(OLESTR("foobar - (source)"));
+ bstrDescription = SysAllocString(OLESTR("a foo type bar (description)"));
+ bstrHelpFile = SysAllocString(OLESTR("foobar.hlp"));
+
+ hresult = pdual->raise(42, bstrSource, bstrDescription, 13, bstrHelpFile);
+
+ SysFreeString(bstrSource);
+ SysFreeString(bstrDescription);
+ SysFreeString(bstrHelpFile);
+ bstrSource = NULL;
+ bstrDescription = NULL;
+ bstrHelpFile = NULL;
+
+ DbPrintf("hresult=0x%lx\n", GetScode(hresult));
+ if(GetErrorInfo(0L, &perrinfo) == NOERROR){
+ perrinfo->GetSource(&bstrSource);
+ perrinfo->GetDescription(&bstrDescription);
+ perrinfo->GetHelpFile(&bstrHelpFile);
+ perrinfo->GetHelpContext(&dwHelpContext);
+#if OE_WIN32
+ WideCharToMultiByte(CP_ACP, 0, bstrSource, SysStringLen(bstrSource)+1,
+ rgchTemp, sizeof(rgchTemp), NULL, NULL);
+ DbPrintf("Source=\"%Fs\"\n", rgchTemp);
+ WideCharToMultiByte(CP_ACP, 0, bstrDescription, SysStringLen(bstrDescription)+1,
+ rgchTemp, sizeof(rgchTemp), NULL, NULL);
+ DbPrintf("Description=\"%Fs\"\n", rgchTemp);
+ WideCharToMultiByte(CP_ACP, 0, bstrHelpFile, SysStringLen(bstrHelpFile)+1,
+ rgchTemp, sizeof(rgchTemp), NULL, NULL);
+ DbPrintf("HelpFile=\"%Fs\"\n", rgchTemp);
+#else
+ DbPrintf("Source=\"%Fs\"\n", bstrSource);
+ DbPrintf("Description=\"%Fs\"\n", bstrDescription);
+ DbPrintf("HelpFile=\"%Fs\"\n", bstrHelpFile);
+#endif
+ DbPrintf("HelpContext=%ld\n", dwHelpContext);
+ }else{
+ DbPrintf("No error info!\n");
+ }
+
+ hresult = NOERROR;
+
+ if(perrinfo != NULL)
+ perrinfo->Release();
+ SysFreeString(bstrSource);
+ SysFreeString(bstrDescription);
+ SysFreeString(bstrHelpFile);
+ return hresult;
+}
diff --git a/private/oleauto/tests/disptest/cinvex.cpp b/private/oleauto/tests/disptest/cinvex.cpp
new file mode 100644
index 000000000..d17f86294
--- /dev/null
+++ b/private/oleauto/tests/disptest/cinvex.cpp
@@ -0,0 +1,156 @@
+/***
+*cinvex.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CInvokeExcepinfoSuite test object. The
+* purpose of this object is to drive testing of the EXCEPINFO
+* remoting support.
+*
+*Revision History:
+*
+* [00] 02-Dec-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+#include "tstsuite.h"
+
+
+extern OLECHAR FAR* g_szCExcepinfo;
+
+struct TEST{
+ HRESULT (*pfnTest)(int);
+ NAMEDESC namedesc;
+ OLECHAR FAR* szName;
+};
+
+OLECHAR FAR* rgszExcepinfo0[] = { OLESTR("excepinfo0") };
+OLECHAR FAR* rgszExcepinfo1[] = { OLESTR("excepinfo1") };
+OLECHAR FAR* rgszExcepinfo2[] = { OLESTR("excepinfo2") };
+
+HRESULT DefExcepinfoTest(int iTest);
+HRESULT DefExcepinfoTestW(int iTest);
+
+static TEST rgtest[] =
+{
+ { DefExcepinfoTest,
+ {rgszExcepinfo0, DIM(rgszExcepinfo0)},
+ OLESTR("excepinfo-0")
+ },
+
+ { DefExcepinfoTest,
+ {rgszExcepinfo1, DIM(rgszExcepinfo1)},
+ OLESTR("excepinfo-1")
+ },
+
+ { DefExcepinfoTest,
+ {rgszExcepinfo2, DIM(rgszExcepinfo2)},
+ OLESTR("excepinfo-2")
+ },
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CInvokeExcepinfoSuite)
+
+SUITE_IUNKNOWN_IMPL(CInvokeExcepinfoSuite)
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CInvokeExcepinfoSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Invoke Excepinfo"), pbstr);
+}
+
+STDMETHODIMP
+CInvokeExcepinfoSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("invex.log"), pbstr);
+}
+
+STDMETHODIMP
+CInvokeExcepinfoSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CInvokeExcepinfoSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_FAIL);
+ return ErrBstrAlloc(rgtest[iTest].szName, pbstr);
+}
+
+HRESULT
+DefExcepinfoTest(int iTest)
+{
+ HRESULT hresult;
+ EXCEPINFO excepinfo;
+ DISPID FAR* rgdispid;
+ IDispatch FAR* pdisp;
+ DISPPARAMS dispparams;
+
+
+ IfFailGo(CreateObject(g_szCExcepinfo, &pdisp), LError0);
+
+ IfFailGo(
+ GetDISPIDs(pdisp, &rgtest[iTest].namedesc, &rgdispid),
+ LError1);
+
+ dispparams.cArgs = 0;
+ dispparams.cNamedArgs = 0;
+
+ excepinfo.bstrSource = NULL;
+ excepinfo.bstrHelpFile = NULL;
+ excepinfo.bstrDescription = NULL;
+ hresult = DoInvoke(pdisp, rgdispid[0], &dispparams, NULL, &excepinfo, NULL);
+ if(GetScode(hresult) != DISP_E_EXCEPTION)
+ goto LError2;
+
+ DbPrExcepinfo(&excepinfo);
+
+ SysFreeString(excepinfo.bstrSource);
+ SysFreeString(excepinfo.bstrDescription);
+ SysFreeString(excepinfo.bstrHelpFile);
+
+ hresult = NOERROR;
+
+LError2:;
+ delete rgdispid;
+
+LError1:;
+ pdisp->Release();
+
+LError0:;
+ return hresult;
+}
+
+/***
+*HRESULT CInvokeExcepinfoSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CInvokeExcepinfoSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CInvokeExcepinfoSuite::DoTest(unsigned int iTest)
+{
+ IfFailRet(rgtest[iTest].pfnTest(iTest));
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/tests/disptest/cinvref.cpp b/private/oleauto/tests/disptest/cinvref.cpp
new file mode 100644
index 000000000..ca10f566d
--- /dev/null
+++ b/private/oleauto/tests/disptest/cinvref.cpp
@@ -0,0 +1,545 @@
+/***
+*cinvref.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CInvokeByRefSuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include "disptest.h"
+#include "tstsuite.h"
+
+ASSERTDATA
+
+
+extern OLECHAR FAR* g_szCDispTst;
+
+struct TEST{
+ HRESULT (*pfnTest)(IDispatch FAR*, int, int);
+ NAMEDESC namedesc;
+ OLECHAR FAR* szName;
+ VARTYPE vt;
+};
+
+#if VBA2
+OLECHAR FAR* rgszUI1Ref[] = { OLESTR("ui1ref"), OLESTR("pbval") };
+OLECHAR FAR* rgszUI1RefC[] = { OLESTR("ui1refC"), OLESTR("pbval") };
+#endif //VBA2
+OLECHAR FAR* rgszI2Ref[] = { OLESTR("i2ref"), OLESTR("psval") };
+OLECHAR FAR* rgszI2RefC[] = { OLESTR("i2refC"), OLESTR("psval") };
+OLECHAR FAR* rgszI4Ref[] = { OLESTR("i4ref"), OLESTR("plval") };
+OLECHAR FAR* rgszI4RefC[] = { OLESTR("i4refC"), OLESTR("plval") };
+OLECHAR FAR* rgszR4Ref[] = { OLESTR("r4ref"), OLESTR("pfltval") };
+OLECHAR FAR* rgszR4RefC[] = { OLESTR("r4refC"), OLESTR("pfltval") };
+OLECHAR FAR* rgszR8Ref[] = { OLESTR("r8ref"), OLESTR("pdblval") };
+OLECHAR FAR* rgszR8RefC[] = { OLESTR("r8refC"), OLESTR("pdblval") };
+OLECHAR FAR* rgszCyRef[] = { OLESTR("cyref"), OLESTR("pcyval") };
+OLECHAR FAR* rgszCyRefC[] = { OLESTR("cyrefC"), OLESTR("pcyval") };
+OLECHAR FAR* rgszBstrRef[] = { OLESTR("bstrref"), OLESTR("pbstr") };
+OLECHAR FAR* rgszBstrRefC[] = { OLESTR("bstrrefC"), OLESTR("pbstr") };
+OLECHAR FAR* rgszWBstrRef[] = { OLESTR("wbstrref"), OLESTR("pwbstr") };
+OLECHAR FAR* rgszWBstrRefC[] = { OLESTR("wbstrrefC"), OLESTR("pwbstr") };
+OLECHAR FAR* rgszDateRef[] = { OLESTR("dateref"), OLESTR("pdate") };
+OLECHAR FAR* rgszDateRefC[] = { OLESTR("daterefC"), OLESTR("pdate") };
+OLECHAR FAR* rgszErrorRef[] = { OLESTR("scoderef"), OLESTR("pscode") };
+OLECHAR FAR* rgszErrorRefC[] = { OLESTR("scoderefC"), OLESTR("pscode") };
+OLECHAR FAR* rgszBoolRef[] = { OLESTR("boolref"), OLESTR("pbool") };
+OLECHAR FAR* rgszBoolRefC[] = { OLESTR("boolrefC"), OLESTR("pbool") };
+OLECHAR FAR* rgszDispRef[] = { OLESTR("dispref"), OLESTR("ppdisp") };
+
+HRESULT DefByRefTest(IDispatch FAR*, int, int);
+HRESULT DispByRefTest(IDispatch FAR*, int, int);
+
+#if OE_WIN32
+#define TESTCASE(X,Y) X, {rgsz ## Y, DIM( rgsz ## Y)}, L#Y
+#else
+#define TESTCASE(X,Y) X, {rgsz ## Y, DIM( rgsz ## Y)}, #Y
+#endif
+
+static TEST rgtest[] =
+{
+ // UNDONE: move this back to the end once its debugged
+ { TESTCASE(DispByRefTest, DispRef), VT_DISPATCH}
+
+ , { TESTCASE(DefByRefTest, I2Ref), VT_I2}
+ , { TESTCASE(DefByRefTest, I2RefC), VT_I2}
+#if VBA2
+ , { TESTCASE(DefByRefTest, UI1Ref), VT_UI1}
+ , { TESTCASE(DefByRefTest, UI1RefC), VT_UI1}
+#endif //VBA2
+ , { TESTCASE(DefByRefTest, I4Ref), VT_I4}
+ , { TESTCASE(DefByRefTest, I4RefC), VT_I4}
+ , { TESTCASE(DefByRefTest, R4Ref), VT_R4}
+ , { TESTCASE(DefByRefTest, R8Ref), VT_R8}
+#if OE_WIN32 && 0
+ , { TESTCASE(DefByRefTest, R4RefC), VT_R4}
+ , { TESTCASE(DefByRefTest, R8RefC), VT_R8}
+#endif
+ , { TESTCASE(DefByRefTest, CyRef), VT_CY}
+ , { TESTCASE(DefByRefTest, CyRefC), VT_CY}
+ , { TESTCASE(DefByRefTest, DateRef), VT_DATE}
+#if OE_WIN32 && 0
+ , { TESTCASE(DefByRefTest, DateRefC), VT_DATE}
+#endif
+ , { TESTCASE(DefByRefTest, BstrRef), VT_BSTR}
+ , { TESTCASE(DefByRefTest, BstrRefC), VT_BSTR}
+ , { TESTCASE(DefByRefTest, ErrorRef), VT_ERROR}
+ , { TESTCASE(DefByRefTest, ErrorRefC), VT_ERROR}
+ , { TESTCASE(DefByRefTest, BoolRef), VT_BOOL}
+ , { TESTCASE(DefByRefTest, BoolRefC), VT_BOOL}
+
+ // REVIEW: needs tests for ByRef IUnknown and IDispatch
+};
+
+SUITE_CONSTRUCTION_IMPL(CInvokeByRefSuite)
+
+SUITE_IUNKNOWN_IMPL(CInvokeByRefSuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CInvokeByRefSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Invoke ByRef"), pbstr);
+}
+
+STDMETHODIMP
+CInvokeByRefSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("invref.log"), pbstr);
+}
+
+STDMETHODIMP
+CInvokeByRefSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CInvokeByRefSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ TCHAR *szFmt;
+ TCHAR buf[128];
+
+#if HC_MPW
+ szFmt = "IDispatch::Invoke(%s)";
+#else
+ szFmt = TSTR("IDispatch::Invoke(%Fs)");
+#endif
+
+ SPRINTF(buf, szFmt, STRING(rgtest[iTest].szName));
+ *pbstr = SysAllocString(WIDESTRING(buf));
+ return NOERROR;
+}
+
+#define VT_MAXSIZE VT_UI1 + 1
+
+VARIANT g_varRefMem[VT_MAXSIZE];
+VARIANTARG g_vargRef[VT_MAXSIZE];
+
+static HRESULT
+init()
+{
+ int i;
+ CY cy;
+ VARIANT FAR* pvarRef;
+ VARIANTARG FAR* pvarg;
+
+ for(i = 0; i < DIM(g_vargRef); ++i){
+ V_VT(&g_vargRef[i]) = VT_EMPTY;
+ V_VT(&g_varRefMem[i]) = VT_EMPTY;
+ }
+
+#define VAR_MAKE_BYREF(TYPE, VALUE) \
+ pvarRef = &g_varRefMem[VT_ ## TYPE]; \
+ pvarg = &g_vargRef[VT_ ## TYPE]; \
+ V_VT(pvarRef) = VT_ ## TYPE; \
+ V_ ## TYPE ## (pvarRef) = VALUE; \
+ V_VT(pvarg) = VT_ ## TYPE | VT_BYREF; \
+ V_BYREF(pvarg) = &V_NONE(pvarRef);
+
+#if VBA2
+ VAR_MAKE_BYREF(UI1, 41);
+#endif //VBA2
+
+ VAR_MAKE_BYREF(I2, 42);
+
+ VAR_MAKE_BYREF(I4, 43L);
+
+ VAR_MAKE_BYREF(R4, (float) 42.42);
+
+ VAR_MAKE_BYREF(R8, 43.43);
+
+ cy.Hi=107, cy.Lo=66;
+ VAR_MAKE_BYREF(CY, cy);
+
+ VAR_MAKE_BYREF(DATE, 107.66);
+
+ VAR_MAKE_BYREF(BSTR, SysAllocString(OLESTR("a binary string")));
+
+ VAR_MAKE_BYREF(ERROR, S_OK);
+
+ VAR_MAKE_BYREF(BOOL, -1);
+
+ return NOERROR;
+
+#undef VAR_MAKE_BYREF
+}
+
+static HRESULT
+clear()
+{
+ int i;
+
+ for(i = 0; i < DIM(g_vargRef); ++i)
+ IfFailRet(VariantClearAll(&g_vargRef[i]));
+
+ return NOERROR;
+}
+
+HRESULT
+DefByRefTest(IDispatch FAR* pdisp, int iTest, int fNamed)
+{
+ VARTYPE vt;
+ unsigned int uArgErr;
+ VARIANT varResult;
+ DISPID FAR* rgdispid;
+ DISPPARAMS dispparams;
+ HRESULT hresult, hresultTmp;
+ VARIANTARG vargExpected, vargExpectedRef;
+
+
+ vt = rgtest[iTest].vt;
+ ASSERT(vt < DIM(g_vargRef));
+
+ IfFailGo(init(), LError0);
+ ASSERT((V_VT(&g_vargRef[vt]) & VT_BYREF) != 0);
+
+ IfFailGo(
+ GetDISPIDs(pdisp, &rgtest[iTest].namedesc, &rgdispid),
+ LError1);
+
+ // build a variant for the expected out parameter.
+ //
+ VariantInit(&vargExpected);
+
+ MEMCPY(&vargExpectedRef, &g_varRefMem[vt], sizeof(vargExpectedRef));
+
+ V_VT(&vargExpectedRef) = vt;
+
+ // update the in value in the same way we expect the callee to...
+ //
+ switch(vt){
+#if VBA2
+ case VT_UI1:
+ ++V_UI1(&vargExpectedRef);
+ break;
+#endif //VBA2
+ case VT_I2:
+ ++V_I2(&vargExpectedRef);
+ break;
+ case VT_I4:
+ ++V_I4(&vargExpectedRef);
+ break;
+ case VT_R4:
+ V_R4(&vargExpectedRef) += (float)1.0;
+ break;
+ case VT_R8:
+ case VT_DATE:
+ V_R8(&vargExpectedRef) += 1.0;
+ break;
+ case VT_CY:
+ ++V_CY(&vargExpectedRef).Hi;
+ ++V_CY(&vargExpectedRef).Lo;
+ break;
+ case VT_BSTR:
+ V_BSTR(&vargExpectedRef) = SysAllocString(V_BSTR(&vargExpectedRef));
+#if OE_WIN32
+ _wcsupr(V_BSTR(&vargExpectedRef));
+#else
+ STRUPR(V_BSTR(&vargExpectedRef));
+#endif
+ break;
+ case VT_ERROR:
+ V_ERROR(&vargExpectedRef) = E_FAIL;
+ break;
+ case VT_BOOL:
+ V_BOOL(&vargExpectedRef) = 0;
+ break;
+ default:
+ ASSERT(UNREACHED);
+ break;
+ }
+
+ V_VT(&vargExpected) = VT_BYREF | vt;
+ V_BYREF(&vargExpected) = &V_NONE(&vargExpectedRef);
+
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = &g_vargRef[rgtest[iTest].vt];
+ if(fNamed){
+ dispparams.cNamedArgs = 1;
+ dispparams.rgdispidNamedArgs = &rgdispid[1];
+ }else{
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ }
+
+ uArgErr = 0;
+ VariantInit(&varResult);
+ IfFailGo(
+ DoInvoke(pdisp, rgdispid[0], &dispparams, &varResult, NULL, &uArgErr),
+ LError2);
+
+ if(V_VT(&varResult) != VT_ERROR
+ || V_ERROR(&varResult) != NOERROR
+ || !VariantCompare(&dispparams.rgvarg[0], &vargExpected))
+ {
+ hresult = RESULT(E_FAIL);
+ goto LError2;
+ }
+
+ hresult = NOERROR;
+
+LError2:;
+ hresultTmp = VariantClear(&varResult);
+ ASSERT(hresultTmp == NOERROR);
+
+ hresultTmp = VariantClearAll(&dispparams.rgvarg[0]);
+ ASSERT(hresultTmp == NOERROR);
+
+ hresultTmp = VariantClearAll(&vargExpected);
+ ASSERT(hresultTmp == NOERROR);
+
+ delete rgdispid;
+
+LError1:;
+ hresultTmp = clear();
+ ASSERT(hresultTmp == NOERROR);
+
+LError0:;
+ return hresult;
+}
+
+/***
+*HRESULT CInvokeByRefSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CInvokeByRefSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CInvokeByRefSuite::DoTest(unsigned int iTest)
+{
+ HRESULT hresult;
+ IDispatch FAR* pdisp;
+#if OE_WIN32 && 0
+ IDispatchW FAR* pdispW;
+#endif
+
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_FAIL);
+
+ pdisp = NULL;
+
+ IfFailRet(CreateObject(g_szCDispTst, &pdisp));
+ IfFailGo(rgtest[iTest].pfnTest(pdisp, iTest, FALSE), LError0);
+ IfFailGo(rgtest[iTest].pfnTest(pdisp, iTest, TRUE), LError0);
+
+ hresult = NOERROR;
+
+LError0:;
+ if(pdisp != NULL)
+ pdisp->Release();
+
+ return hresult;
+}
+
+
+//
+// A little do-nothing IDispatch object
+//
+
+class CNopDisp : public IDispatch
+{
+public:
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo);
+
+ STDMETHOD(GetTypeInfo)(unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+ STDMETHOD(GetIDsOfNames)(REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ CNopDisp();
+
+private:
+ unsigned long m_cRefs;
+};
+
+CNopDisp::CNopDisp()
+{
+ m_cRefs = 1;
+}
+
+STDMETHODIMP
+CNopDisp::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(riid == IID_IUnknown || riid == IID_IDispatch){
+ *ppv = this;
+ }else{
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+ ++m_cRefs;
+ return NOERROR;
+}
+
+STDMETHODIMP_(unsigned long)
+CNopDisp::AddRef()
+{
+ return ++m_cRefs;
+}
+
+STDMETHODIMP_(unsigned long)
+CNopDisp::Release()
+{
+ if(--m_cRefs == 0){
+ delete this;
+ return 0;
+ }
+ return m_cRefs;
+}
+
+STDMETHODIMP
+CNopDisp::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = 0;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CNopDisp::GetTypeInfo(unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ return RESULT(DISP_E_BADINDEX); // we dont return any
+}
+
+STDMETHODIMP
+CNopDisp::GetIDsOfNames(REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ return RESULT(DISP_E_UNKNOWNNAME); // because there are no names
+}
+
+STDMETHODIMP
+CNopDisp::Invoke(DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ return RESULT(DISP_E_MEMBERNOTFOUND); // because there are no members
+}
+
+
+
+// Tests passing a ByRef IDispatch*
+HRESULT
+DispByRefTest(IDispatch FAR* pdisp, int unused1, int unused2)
+{
+ DISPID dispid;
+ HRESULT hresult;
+ VARIANTARG varg;
+ VARIANT varResult;
+ unsigned int uArgErr = 0;
+ DISPPARAMS dispparams;
+ OLECHAR FAR* rgszNames[1];
+ IDispatch FAR* pdispLocal;
+
+ pdispLocal = NULL;
+
+ if((pdispLocal = new CNopDisp()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ rgszNames[0] = OLESTR("dispref");
+ IfFailGo(pdisp->GetIDsOfNames(IID_NULL,
+ rgszNames, 1,
+ LOCALE_USER_DEFAULT,
+ &dispid), Error);
+
+
+ V_VT(&varg) = VT_BYREF | VT_DISPATCH;
+ V_DISPATCHREF(&varg) = &pdispLocal;
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgvarg = &varg;
+ dispparams.rgdispidNamedArgs = NULL;
+
+ VariantInit(&varResult);
+
+ IfFailGo(DoInvoke(pdisp,
+ dispid,
+ &dispparams,
+ &varResult,
+ NULL,
+ &uArgErr), Error);
+
+ if(V_VT(&varResult) != VT_ERROR || V_ERROR(&varResult) != NOERROR){
+ hresult = RESULT(E_FAIL);
+ goto Error;
+ }
+
+ hresult = NOERROR;
+
+Error:;
+ if(pdispLocal != NULL)
+ pdispLocal->Release();
+ return hresult;
+}
+
+
diff --git a/private/oleauto/tests/disptest/cinvsary.cpp b/private/oleauto/tests/disptest/cinvsary.cpp
new file mode 100644
index 000000000..d9a24bd74
--- /dev/null
+++ b/private/oleauto/tests/disptest/cinvsary.cpp
@@ -0,0 +1,641 @@
+/***
+*cinvsary.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CInvokeSafeArraySuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+#include "tstsuite.h"
+
+ASSERTDATA
+
+
+#if VBA2
+static OLECHAR FAR* rgszUI1SafeArray[] = {OLESTR("ui1safearray"), OLESTR("psa")};
+#endif //VBA2
+static OLECHAR FAR* rgszI2SafeArray[] = {OLESTR("i2safearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszI4SafeArray[] = {OLESTR("i4safearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszR4SafeArray[] = {OLESTR("r4safearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszR8SafeArray[] = {OLESTR("r8safearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszCySafeArray[] = {OLESTR("cysafearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszDateSafeArray[] = {OLESTR("datesafearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszBstrSafeArray[] = {OLESTR("bstrsafearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszScodeSafeArray[] = {OLESTR("scodesafearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszBoolSafeArray[] = {OLESTR("boolsafearray"), OLESTR("psa")};
+static OLECHAR FAR* rgszVarSafeArray[] = {OLESTR("varsafearray"), OLESTR("psa")};
+// REVIEW: DispSafeArray() ?
+
+#if VBA2
+static OLECHAR FAR* rgszUI1SafeArrayRef[] = {OLESTR("ui1safearrayref"), OLESTR("psa")};
+#endif //VBA2
+static OLECHAR FAR* rgszI2SafeArrayRef[] = {OLESTR("i2safearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszI4SafeArrayRef[] = {OLESTR("i4safearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszR4SafeArrayRef[] = {OLESTR("r4safearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszR8SafeArrayRef[] = {OLESTR("r8safearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszCySafeArrayRef[] = {OLESTR("cysafearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszDateSafeArrayRef[] = {OLESTR("datesafearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszBstrSafeArrayRef[] = {OLESTR("bstrsafearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszScodeSafeArrayRef[] = {OLESTR("scodesafearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszBoolSafeArrayRef[] = {OLESTR("boolsafearrayref"), OLESTR("psa")};
+static OLECHAR FAR* rgszVarSafeArrayRef[] = {OLESTR("varsafearrayref"), OLESTR("psa")};
+
+#if VBA2
+static OLECHAR FAR* rgszUI1SafeArrayErase[] = {OLESTR("ui1safearrayerase"), OLESTR("psa")};
+#endif //VBA2
+static OLECHAR FAR* rgszI2SafeArrayErase[] = {OLESTR("i2safearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszI4SafeArrayErase[] = {OLESTR("i4safearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszR4SafeArrayErase[] = {OLESTR("r4safearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszR8SafeArrayErase[] = {OLESTR("r8safearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszCySafeArrayErase[] = {OLESTR("cysafearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszDateSafeArrayErase[] = {OLESTR("datesafearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszBstrSafeArrayErase[] = {OLESTR("bstrsafearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszScodeSafeArrayErase[] = {OLESTR("scodesafearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszBoolSafeArrayErase[] = {OLESTR("boolsafearrayerase"), OLESTR("psa")};
+static OLECHAR FAR* rgszVarSafeArrayErase[] = {OLESTR("varsafearrayerase"), OLESTR("psa")};
+
+#if VBA2
+static OLECHAR FAR* rgszUI1SafeArrayAlloc[] = {OLESTR("ui1safearrayalloc"), OLESTR("psa")};
+#endif //VBA2
+static OLECHAR FAR* rgszI2SafeArrayAlloc[] = {OLESTR("i2safearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszI4SafeArrayAlloc[] = {OLESTR("i4safearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszR4SafeArrayAlloc[] = {OLESTR("r4safearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszR8SafeArrayAlloc[] = {OLESTR("r8safearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszCySafeArrayAlloc[] = {OLESTR("cysafearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszDateSafeArrayAlloc[] = {OLESTR("datesafearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszBstrSafeArrayAlloc[] = {OLESTR("bstrsafearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszScodeSafeArrayAlloc[] = {OLESTR("scodesafearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszBoolSafeArrayAlloc[] = {OLESTR("boolsafearrayalloc"), OLESTR("psa")};
+static OLECHAR FAR* rgszVarSafeArrayAlloc[] = {OLESTR("varsafearrayalloc"), OLESTR("psa")};
+
+extern OLECHAR FAR* g_szCSArray;
+
+// REVIEW: DispSafeArrayRef() ?
+
+struct TEST {
+ HRESULT (*pfnTest)(TEST FAR* ptinfo);
+ NAMEDESC namedesc;
+ OLECHAR FAR* szName; // test name
+ VARTYPE vt;
+};
+
+HRESULT DefSafeArrayTest(TEST FAR* ptinfo);
+HRESULT EraseSafeArrayTest(TEST FAR* ptinfo);
+HRESULT AllocSafeArrayTest(TEST FAR* ptinfo);
+HRESULT SafeArrayCalleeRedim(TEST FAR* ptinfoDummy);
+HRESULT SafeArrayReturn(TEST FAR* ptinfoDummy);
+
+#if OE_WIN32
+#define TESTCASE(X,Y) X, {rgsz ## Y, DIM( rgsz ## Y)}, L#Y
+#else
+#define TESTCASE(X,Y) X, {rgsz ## Y, DIM( rgsz ## Y)}, #Y
+#endif
+
+static TEST rgtest[] =
+{
+ {TESTCASE(DefSafeArrayTest, I2SafeArray), VT_I2}
+#if VBA2
+ , {TESTCASE(DefSafeArrayTest, UI1SafeArray), VT_UI1}
+#endif //VBA2
+ , {TESTCASE(DefSafeArrayTest, I4SafeArray), VT_I4}
+ , {TESTCASE(DefSafeArrayTest, R4SafeArray), VT_R4}
+ , {TESTCASE(DefSafeArrayTest, R8SafeArray), VT_R8}
+ , {TESTCASE(DefSafeArrayTest, CySafeArray), VT_CY}
+ , {TESTCASE(DefSafeArrayTest, DateSafeArray), VT_DATE}
+ , {TESTCASE(DefSafeArrayTest, BstrSafeArray), VT_BSTR}
+ , {TESTCASE(DefSafeArrayTest, ScodeSafeArray), VT_ERROR}
+ , {TESTCASE(DefSafeArrayTest, BoolSafeArray), VT_BOOL}
+ , {TESTCASE(DefSafeArrayTest, VarSafeArray), VT_VARIANT}
+
+ , {TESTCASE(DefSafeArrayTest, I2SafeArrayRef), VT_BYREF|VT_I2}
+#if VBA2
+ , {TESTCASE(DefSafeArrayTest, UI1SafeArrayRef), VT_BYREF|VT_UI1}
+#endif //VBA2
+ , {TESTCASE(DefSafeArrayTest, I4SafeArrayRef), VT_BYREF|VT_I4}
+ , {TESTCASE(DefSafeArrayTest, R4SafeArrayRef), VT_BYREF|VT_R4}
+ , {TESTCASE(DefSafeArrayTest, R8SafeArrayRef), VT_BYREF|VT_R8}
+ , {TESTCASE(DefSafeArrayTest, CySafeArrayRef), VT_BYREF|VT_CY}
+ , {TESTCASE(DefSafeArrayTest, DateSafeArrayRef), VT_BYREF|VT_DATE}
+ , {TESTCASE(DefSafeArrayTest, BstrSafeArrayRef), VT_BYREF|VT_BSTR}
+ , {TESTCASE(DefSafeArrayTest, ScodeSafeArrayRef), VT_BYREF|VT_ERROR}
+ , {TESTCASE(DefSafeArrayTest, BoolSafeArrayRef), VT_BYREF|VT_BOOL}
+ , {TESTCASE(DefSafeArrayTest, VarSafeArrayRef), VT_BYREF|VT_VARIANT}
+
+ , {SafeArrayCalleeRedim, {NULL, 0}, OLESTR("SafeArray callee redim"), 0}
+ , {SafeArrayReturn, {NULL, 0}, OLESTR("SafeArray return"), 0}
+
+ , {TESTCASE(EraseSafeArrayTest, I2SafeArrayErase), VT_BYREF|VT_I2}
+#if VBA2
+ , {TESTCASE(EraseSafeArrayTest, UI1SafeArrayErase), VT_BYREF|VT_UI1}
+#endif //VBA2
+ , {TESTCASE(EraseSafeArrayTest, I4SafeArrayErase), VT_BYREF|VT_I4}
+ , {TESTCASE(EraseSafeArrayTest, R4SafeArrayErase), VT_BYREF|VT_R4}
+ , {TESTCASE(EraseSafeArrayTest, R8SafeArrayErase), VT_BYREF|VT_R8}
+ , {TESTCASE(EraseSafeArrayTest, CySafeArrayErase), VT_BYREF|VT_CY}
+ , {TESTCASE(EraseSafeArrayTest, DateSafeArrayErase),VT_BYREF|VT_DATE}
+ , {TESTCASE(EraseSafeArrayTest, BstrSafeArrayErase),VT_BYREF|VT_BSTR}
+ , {TESTCASE(EraseSafeArrayTest, ScodeSafeArrayErase),VT_BYREF|VT_ERROR}
+ , {TESTCASE(EraseSafeArrayTest, BoolSafeArrayErase),VT_BYREF|VT_BOOL}
+ , {TESTCASE(EraseSafeArrayTest, VarSafeArrayErase), VT_BYREF|VT_VARIANT}
+
+ , {TESTCASE(AllocSafeArrayTest, I2SafeArrayAlloc), VT_BYREF|VT_I2}
+#if VBA2
+ , {TESTCASE(AllocSafeArrayTest, UI1SafeArrayAlloc), VT_BYREF|VT_UI1}
+#endif //VBA2
+ , {TESTCASE(AllocSafeArrayTest, I4SafeArrayAlloc), VT_BYREF|VT_I4}
+ , {TESTCASE(AllocSafeArrayTest, R4SafeArrayAlloc), VT_BYREF|VT_R4}
+ , {TESTCASE(AllocSafeArrayTest, R8SafeArrayAlloc), VT_BYREF|VT_R8}
+ , {TESTCASE(AllocSafeArrayTest, CySafeArrayAlloc), VT_BYREF|VT_CY}
+ , {TESTCASE(AllocSafeArrayTest, DateSafeArrayAlloc),VT_BYREF|VT_DATE}
+ , {TESTCASE(AllocSafeArrayTest, BstrSafeArrayAlloc),VT_BYREF|VT_BSTR}
+ , {TESTCASE(AllocSafeArrayTest, ScodeSafeArrayAlloc),VT_BYREF|VT_ERROR}
+ , {TESTCASE(AllocSafeArrayTest, BoolSafeArrayAlloc),VT_BYREF|VT_BOOL}
+ , {TESTCASE(AllocSafeArrayTest, VarSafeArrayAlloc), VT_BYREF|VT_VARIANT}
+};
+
+static SARRAYDESC
+rgsarraydesc[] =
+{
+ {0, {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{2,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{1024,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{2,0}, {2,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{32,0}, {32,0}, {0,0}, {0,0}, {0,0}}}
+ , {3, {{2,0}, {2,0}, {2,0}, {0,0}, {0,0}}}
+ , {3, {{10,0}, {10,0}, {10,0}, {0,0}, {0,0}}}
+ , {4, {{2,0}, {2,0}, {2,0}, {2,0}, {0,0}}}
+ , {4, {{6,0}, {6,0}, {6,0}, {6,0}, {0,0}}}
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CInvokeSafeArraySuite)
+
+SUITE_IUNKNOWN_IMPL(CInvokeSafeArraySuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CInvokeSafeArraySuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Invoke SafeArray"), pbstr);
+}
+
+STDMETHODIMP
+CInvokeSafeArraySuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("invsary.log"), pbstr);
+}
+
+STDMETHODIMP
+CInvokeSafeArraySuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CInvokeSafeArraySuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return BuildBstr(
+ pbstr,
+ rgtest[iTest].szName);
+}
+
+/***
+*HRESULT CInvokeSafeArraySuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CInvokeSafeArraySuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CInvokeSafeArraySuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ IfFailRet(rgtest[iTest].pfnTest(&rgtest[iTest]));
+ return NOERROR;
+}
+
+HRESULT
+DefSafeArrayTest(TEST FAR* ptinfo)
+{
+ long ofs;
+ unsigned long rcnt;
+ int i, fNames;
+ HRESULT hresult;
+ VARTYPE vt, vtBase;
+ VARIANT varResult;
+ SAFEARRAY FAR* psa;
+ DISPID FAR* rgdispid;
+ IDispatch FAR* pdisp;
+ VARIANTARG rgvarg[1];
+ DISPPARAMS dispparams;
+ SARRAYDESC FAR* psadesc;
+
+
+ // REVIEW : This is really ugly! The use of templates or abstract
+ // classes would be much cleaner.
+
+ vt = ptinfo->vt;
+ vtBase = vt & ~VT_BYREF;
+
+ // if this is a ByRef array test then the "identity offset" is 1,
+ // because we know that all ByRef methods that we invoke add 1
+ // to each element of their given array. (this is how the test
+ // is defined).
+ //
+ ofs = (vt & VT_BYREF) ? 1 : 0;
+
+ IfFailRet(CreateObject(g_szCSArray, &pdisp));
+ IfFailGo(GetDISPIDs(pdisp, &ptinfo->namedesc, &rgdispid), LError1);
+
+ VariantInit(&varResult);
+ for(fNames = 0; fNames <= 1; ++fNames)
+ {
+ for(i = 0; i < DIM(rgsarraydesc); ++i)
+ {
+ psadesc = &rgsarraydesc[i];
+
+ if(psadesc->cDims == 0){
+ psa = NULL;
+ }else{
+ IfFailGo(SafeArrayCreateIdentity(vtBase, psadesc, &psa), LError2);
+ }
+
+ V_VT(rgvarg) = VT_ARRAY | vt;
+ if(vt & VT_BYREF){
+ V_ARRAYREF(rgvarg) = &psa;
+ }else{
+ V_ARRAY(rgvarg) = psa;
+ }
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = rgvarg;
+
+ if(fNames){
+ dispparams.cNamedArgs = 1;
+ dispparams.rgdispidNamedArgs = &rgdispid[1];
+ }else{
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ }
+
+ IfFailGo(
+ DoInvoke(pdisp, rgdispid[0], &dispparams, &varResult, NULL, NULL),
+ LError2);
+
+ if(V_VT(&varResult) != VT_ERROR || V_ERROR(&varResult) != NOERROR)
+ hresult = RESULT(E_FAIL);
+
+ VariantClear(&varResult);
+
+ if(HRESULT_FAILED(hresult))
+ goto LError2;
+ if(psa != NULL){
+ IfFailGo(SafeArrayValidateIdentity(vtBase, psa, ofs), LError2);
+ IfFailGo(SafeArrayDestroy(psa), LError2);
+ }
+ }
+ }
+
+ hresult = NOERROR;
+
+
+LError2:;
+ delete rgdispid;
+
+LError1:;
+ rcnt = pdisp->Release();
+ //ASSERT(rcnt == 0);
+ return hresult;
+}
+
+// Call ByRef SafeArray methods where the callee erases the given array
+//
+HRESULT
+EraseSafeArrayTest(TEST FAR* ptinfo)
+{
+ int i, fNames;
+ HRESULT hresult;
+ unsigned long rcnt;
+ VARTYPE vt, vtBase;
+ VARIANT varResult;
+ SAFEARRAY FAR* psa;
+ DISPID FAR* rgdispid;
+ IDispatch FAR* pdisp;
+ VARIANTARG rgvarg[1];
+ DISPPARAMS dispparams;
+ SARRAYDESC FAR* psadesc;
+
+ vt = ptinfo->vt;
+ vtBase = vt & ~VT_BYREF;
+
+ IfFailRet(CreateObject(g_szCSArray, &pdisp));
+ IfFailGo(GetDISPIDs(pdisp, &ptinfo->namedesc, &rgdispid), LError1);
+
+ VariantInit(&varResult);
+ for(fNames = 0; fNames <= 1; ++fNames)
+ {
+ for(i = 0; i < DIM(rgsarraydesc); ++i)
+ {
+ psadesc = &rgsarraydesc[i];
+
+ if(psadesc->cDims == 0){
+ psa = NULL;
+ }else{
+ IfFailGo(SafeArrayCreateIdentity(vtBase, psadesc, &psa), LError2);
+ }
+
+ ASSERT((vt & VT_BYREF) != 0);
+ V_VT(rgvarg) = VT_ARRAY | vt;
+ V_ARRAYREF(rgvarg) = &psa;
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = rgvarg;
+
+ if(fNames){
+ dispparams.cNamedArgs = 1;
+ dispparams.rgdispidNamedArgs = &rgdispid[1];
+ }else{
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ }
+
+ IfFailGo(
+ DoInvoke(pdisp, rgdispid[0], &dispparams, &varResult, NULL, NULL),
+ LError2);
+
+ if(V_VT(&varResult) != VT_ERROR || V_ERROR(&varResult) != NOERROR)
+ hresult = RESULT(E_FAIL);
+
+ VariantClear(&varResult);
+
+ if(HRESULT_FAILED(hresult))
+ goto LError2;
+
+ // These methods are supposed to erase the passed array
+ if(*V_ARRAYREF(&dispparams.rgvarg[0]) != NULL){
+ hresult = RESULT(E_FAIL);
+ goto LError2;
+ }
+ }
+ }
+
+ hresult = NOERROR;
+
+LError2:;
+ delete rgdispid;
+
+LError1:;
+ rcnt = pdisp->Release();
+ //ASSERT(rcnt == 0);
+ return hresult;
+}
+
+// Call ByRef SafeArray methods where the callee erases the given array
+//
+HRESULT
+AllocSafeArrayTest(TEST FAR* ptinfo)
+{
+ unsigned long rcnt;
+ int i, fNames;
+ HRESULT hresult;
+ VARTYPE vt, vtBase;
+ VARIANT varResult;
+ SAFEARRAY FAR* psa;
+ DISPID FAR* rgdispid;
+ IDispatch FAR* pdisp;
+ VARIANTARG rgvarg[1];
+ DISPPARAMS dispparams;
+ SARRAYDESC FAR* psadesc;
+
+ vt = ptinfo->vt;
+ vtBase = vt & ~VT_BYREF;
+
+ IfFailRet(CreateObject(g_szCSArray, &pdisp));
+ IfFailGo(GetDISPIDs(pdisp, &ptinfo->namedesc, &rgdispid), LError1);
+
+ VariantInit(&varResult);
+ for(fNames = 0; fNames <= 1; ++fNames)
+ {
+ for(i = 0; i < DIM(rgsarraydesc); ++i)
+ {
+ psadesc = &rgsarraydesc[i];
+
+ ASSERT((vt & VT_BYREF) != 0);
+
+ psa = NULL;
+ V_VT(rgvarg) = VT_ARRAY | vt;
+ V_ARRAYREF(rgvarg) = &psa;
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = rgvarg;
+
+ if(fNames){
+ dispparams.cNamedArgs = 1;
+ dispparams.rgdispidNamedArgs = &rgdispid[1];
+ }else{
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ }
+
+ IfFailGo(
+ DoInvoke(pdisp, rgdispid[0], &dispparams, &varResult, NULL, NULL),
+ LError2);
+
+ if(V_VT(&varResult) != VT_ERROR || V_ERROR(&varResult) != NOERROR)
+ hresult = RESULT(E_FAIL);
+
+ VariantClear(&varResult);
+
+ if(HRESULT_FAILED(hresult))
+ goto LError2;
+
+ // These methods are supposed to allocate an array, and return
+ // via the out param.
+ psa = *V_ARRAYREF(&dispparams.rgvarg[0]);
+ if(psa == NULL){
+ hresult = RESULT(E_FAIL);
+ goto LError2;
+ }
+ IfFailGo(SafeArrayValidateIdentity(vtBase, psa, 0L), LError2);
+ IfFailGo(SafeArrayDestroy(psa), LError2);
+ }
+ }
+
+ hresult = NOERROR;
+
+LError2:;
+ delete rgdispid;
+
+LError1:;
+ rcnt = pdisp->Release();
+ //ASSERT(rcnt == 0);
+ return hresult;
+}
+
+HRESULT
+SafeArrayCalleeRedim(TEST FAR* ptinfoDummy)
+{
+ int i;
+ unsigned long rcnt;
+ VARTYPE vt;
+ HRESULT hresult;
+ SAFEARRAY FAR* psa;
+ DISPID FAR* rgdispid;
+ IDispatch FAR* pdisp;
+ VARIANTARG rgvarg[2];
+ DISPPARAMS dispparams;
+ VARIANT varResult;
+ SARRAYDESC FAR* psadesc;
+static OLECHAR FAR* rgszNames[] = {OLESTR("safearrayredim"), OLESTR("vt"), OLESTR("ppsa")};
+static NAMEDESC namedesc = {rgszNames, DIM(rgszNames)};
+
+ UNUSED(ptinfoDummy);
+
+ vt = VT_VARIANT;
+
+ IfFailRet(CreateObject(g_szCSArray, &pdisp));
+ IfFailGo(GetDISPIDs(pdisp, &namedesc, &rgdispid), LError1);
+
+ VariantInit(&varResult);
+
+ for(i = 0; i < DIM(rgsarraydesc); ++i){
+ psadesc = &rgsarraydesc[i];
+
+ if(psadesc->cDims == 0) // ignore this one
+ continue;
+
+ IfFailGo(SafeArrayCreateIdentity(vt, psadesc, &psa), LError2);
+
+ V_VT(&rgvarg[0]) = VT_ARRAY | VT_BYREF | vt;
+ V_ARRAYREF(&rgvarg[0]) = &psa;
+
+ V_VT(&rgvarg[1]) = VT_I2;
+ V_I2(&rgvarg[1]) = vt;
+
+ dispparams.cArgs = 2;
+ dispparams.rgvarg = rgvarg;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ IfFailGo(
+ DoInvoke(pdisp, rgdispid[0], &dispparams, &varResult, NULL, NULL),
+ LError2);
+
+ if(V_VT(&varResult) != VT_ERROR || V_ERROR(&varResult) != NOERROR)
+ hresult = RESULT(E_FAIL);
+
+ VariantClear(&varResult);
+
+ if(HRESULT_FAILED(hresult))
+ goto LError2;
+ IfFailGo(SafeArrayValidateIdentity(vt, psa, 0L), LError2);
+ IfFailGo(SafeArrayDestroy(psa), LError2);
+ }
+
+ hresult = NOERROR;
+
+LError2:;
+ delete rgdispid;
+
+LError1:;
+ rcnt = pdisp->Release();
+ //ASSERT(rcnt == 0);
+ return hresult;
+}
+
+// test invoking a method that returns a SafeArray
+HRESULT
+SafeArrayReturn(TEST FAR* ptinfoDummy)
+{
+ unsigned long rcnt;
+ VARTYPE vt;
+ NAMEDESC namedesc;
+ SARRAYDESC sadesc;
+ VARIANT varResult;
+ SAFEARRAY FAR* psa;
+ DISPID FAR* rgdispid;
+ IDispatch FAR* pdisp;
+ VARIANTARG rgvarg[2];
+ DISPPARAMS dispparams;
+ HRESULT hresult, hrTmp;
+
+static OLECHAR FAR* rgszNames[] = {OLESTR("i2safearrayret"), OLESTR("var")};
+
+ UNUSED(ptinfoDummy);
+
+ namedesc.rgszNames = rgszNames;
+ namedesc.cNames = DIM(rgszNames);
+
+ sadesc.cDims = 1;
+ sadesc.rgsabound[0].lLbound = 0;
+ sadesc.rgsabound[0].cElements = 2;
+
+ vt = VT_I2;
+ psa = NULL;
+ rgdispid = NULL;
+ VariantInit(&varResult);
+
+ IfFailGo(CreateObject(g_szCSArray, &pdisp), LError0);
+ IfFailGo(GetDISPIDs(pdisp, &namedesc, &rgdispid), LError0);
+
+ IfFailGo(SafeArrayCreateIdentity(vt, &sadesc, &psa), LError0);
+
+ V_VT(&rgvarg[0]) = VT_ARRAY | vt;
+ V_ARRAY(&rgvarg[0]) = psa;
+
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = rgvarg;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+
+ IfFailGo(DoInvoke(pdisp, rgdispid[0], &dispparams,
+ &varResult, NULL, NULL),
+ LError0);
+ if(V_VT(&varResult) != (VT_ARRAY | VT_I2)){
+ hresult = RESULT(E_FAIL);
+ goto LError0;
+ }
+
+ IfFailGo(SafeArrayValidateIdentity(vt, psa, 0L), LError0);
+
+ hresult = NOERROR;
+
+LError0:;
+ VariantClear(&varResult);
+
+ if(psa != NULL){
+ hrTmp = SafeArrayDestroy(psa);
+ ASSERT(hrTmp == NOERROR);
+ }
+
+ if(pdisp != NULL){
+ rcnt = pdisp->Release();
+ //ASSERT(rcnt == 0);
+ }
+ if(rgdispid != NULL)
+ delete rgdispid;
+
+ return hresult;
+}
diff --git a/private/oleauto/tests/disptest/cinvval.cpp b/private/oleauto/tests/disptest/cinvval.cpp
new file mode 100644
index 000000000..3ec3245eb
--- /dev/null
+++ b/private/oleauto/tests/disptest/cinvval.cpp
@@ -0,0 +1,571 @@
+/***
+*cinvval.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CInvokeByValSuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include "disptest.h"
+#include "tstsuite.h"
+
+ASSERTDATA
+
+extern OLECHAR FAR* g_szCDispTst;
+
+struct TEST{
+ HRESULT (*pfnTest)(IDispatch FAR*, int, int);
+ NAMEDESC namedesc;
+ OLECHAR FAR* szName;
+};
+
+OLECHAR FAR* rgszHello[] = { OLESTR("hello") };
+#if VBA2
+OLECHAR FAR* rgszUI1[] = { OLESTR("ui1"), OLESTR("bval") };
+OLECHAR FAR* rgszUI1C[] = { OLESTR("ui1C"), OLESTR("bval") };
+#endif //VBA2
+OLECHAR FAR* rgszI2[] = { OLESTR("i2"), OLESTR("sval") };
+OLECHAR FAR* rgszI2C[] = { OLESTR("i2C"), OLESTR("sval") };
+OLECHAR FAR* rgszI4[] = { OLESTR("i4"), OLESTR("lval") };
+OLECHAR FAR* rgszI4C[] = { OLESTR("i4C"), OLESTR("lval") };
+OLECHAR FAR* rgszR4[] = { OLESTR("r4"), OLESTR("fltval") };
+OLECHAR FAR* rgszR4C[] = { OLESTR("r4C"), OLESTR("fltval") };
+OLECHAR FAR* rgszR8[] = { OLESTR("r8"), OLESTR("dblval") };
+OLECHAR FAR* rgszR8C[] = { OLESTR("r8C"), OLESTR("dblval") };
+OLECHAR FAR* rgszCy[] = { OLESTR("cy"), OLESTR("cyval") };
+OLECHAR FAR* rgszCyC[] = { OLESTR("cyC"), OLESTR("cyval") };
+OLECHAR FAR* rgszDate[] = { OLESTR("date"), OLESTR("date") };
+OLECHAR FAR* rgszDateC[] = { OLESTR("dateC"), OLESTR("date") };
+OLECHAR FAR* rgszBstr[] = { OLESTR("bstr"), OLESTR("bstr") };
+OLECHAR FAR* rgszBstrC[] = { OLESTR("bstrC"), OLESTR("bstr") };
+OLECHAR FAR* rgszScode[] = { OLESTR("scode"), OLESTR("scode") };
+OLECHAR FAR* rgszScodeC[] = { OLESTR("scodeC"), OLESTR("scode") };
+OLECHAR FAR* rgszBool[] = { OLESTR("bool"), OLESTR("bool") };
+OLECHAR FAR* rgszBoolC[] = { OLESTR("boolC"), OLESTR("bool") };
+OLECHAR FAR* rgszVariant[] = { OLESTR("var"), OLESTR("varg") };
+OLECHAR FAR* rgszVariantC[] = { OLESTR("varC"), OLESTR("varg") };
+OLECHAR FAR* rgszDispatch[] = { OLESTR("NewCDispTst") };
+OLECHAR FAR* rgszDispatchC[]= { OLESTR("NewCDispTstC") };
+
+OLECHAR FAR* rgszStdI2I4R4R8[] = {
+ OLESTR("stdI2I4R4R8")
+#if VBA2
+ , OLESTR("bval")
+#endif //VBA2
+ , OLESTR("sval")
+ , OLESTR("lval")
+ , OLESTR("fltval")
+ , OLESTR("dblval")
+};
+OLECHAR FAR* rgszAltI2I4R4R8[] = {
+ OLESTR("altI2I4R4R8")
+#if VBA2
+ , OLESTR("bval")
+#endif //VBA2
+ , OLESTR("sval")
+ , OLESTR("lval")
+ , OLESTR("fltval")
+ , OLESTR("dblval")
+};
+
+OLECHAR FAR* rgszStdAll[] = {
+ OLESTR("stdall")
+#if VBA2
+ , OLESTR("bval")
+#endif //VBA2
+ , OLESTR("sval")
+ , OLESTR("lval")
+ , OLESTR("fltval")
+ , OLESTR("dblval")
+ , OLESTR("cyval")
+ , OLESTR("date")
+ , OLESTR("bstr")
+ , OLESTR("sc")
+ , OLESTR("bool")
+};
+OLECHAR FAR* rgszAltAll[] = {
+ OLESTR("altall")
+#if VBA2
+ , OLESTR("bval")
+#endif //VBA2
+ , OLESTR("sval")
+ , OLESTR("lval")
+ , OLESTR("fltval")
+ , OLESTR("dblval")
+ , OLESTR("cyval")
+ , OLESTR("date")
+ , OLESTR("bstr")
+ , OLESTR("sc")
+ , OLESTR("bool")
+};
+
+HRESULT InvokeByValHello(IDispatch FAR*, int, int);
+HRESULT InvokeByValDefault(IDispatch FAR*, int, int);
+HRESULT InvokeByValDisp(IDispatch FAR*, int, int);
+
+#if OE_WIN32
+# define TESTCASE(X,Y) X, {rgsz ## Y, DIM( rgsz ## Y)}, L#Y
+#else
+# define TESTCASE(X,Y) X, {rgsz ## Y, DIM( rgsz ## Y)}, #Y
+#endif
+
+
+static TEST rgtest[] =
+{
+ { TESTCASE(InvokeByValHello,Hello) }
+#if VBA2
+ , { TESTCASE(InvokeByValDefault,UI1) }
+ , { TESTCASE(InvokeByValDefault,UI1C) }
+#endif //VBA2
+ , { TESTCASE(InvokeByValDefault,I2) }
+ , { TESTCASE(InvokeByValDefault,I2C) }
+ , { TESTCASE(InvokeByValDefault,I4) }
+ , { TESTCASE(InvokeByValDefault,I4C) }
+#if !OE_WIN16
+ , { TESTCASE(InvokeByValDefault,R4) }
+#endif
+ , { TESTCASE(InvokeByValDefault,R4C) }
+
+#if !OE_WIN16
+ , { TESTCASE(InvokeByValDefault,R8) }
+#endif
+ , { TESTCASE(InvokeByValDefault,R8C) }
+
+ , { TESTCASE(InvokeByValDefault,Cy) }
+ , { TESTCASE(InvokeByValDefault,CyC) }
+#if !OE_WIN16
+ , { TESTCASE(InvokeByValDefault,Date) }
+#endif
+
+ , { TESTCASE(InvokeByValDefault,DateC) }
+
+ , { TESTCASE(InvokeByValDefault,Bstr) }
+ , { TESTCASE(InvokeByValDefault,BstrC) }
+
+ , { TESTCASE(InvokeByValDefault,Scode) }
+ , { TESTCASE(InvokeByValDefault,ScodeC) }
+ , { TESTCASE(InvokeByValDefault,Bool) }
+ , { TESTCASE(InvokeByValDefault,BoolC) }
+ , { TESTCASE(InvokeByValDefault,Variant) }
+ , { TESTCASE(InvokeByValDefault,VariantC) }
+ , { TESTCASE(InvokeByValDisp,Dispatch) }
+ , { TESTCASE(InvokeByValDisp,DispatchC) }
+
+ , { TESTCASE(InvokeByValDefault,StdI2I4R4R8) }
+ , { TESTCASE(InvokeByValDefault,AltI2I4R4R8) }
+ , { TESTCASE(InvokeByValDefault,StdAll) }
+ , { TESTCASE(InvokeByValDefault,AltAll) }
+};
+
+SUITE_CONSTRUCTION_IMPL(CInvokeByValSuite)
+
+SUITE_IUNKNOWN_IMPL(CInvokeByValSuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CInvokeByValSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Invoke ByVal"), pbstr);
+}
+
+STDMETHODIMP
+CInvokeByValSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("invval.log"), pbstr);
+}
+
+STDMETHODIMP
+CInvokeByValSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+
+ return NOERROR;
+}
+
+STDMETHODIMP
+CInvokeByValSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ TCHAR *szFmt;
+ TCHAR buf[128];
+
+ szFmt = TSTR("IDispatch::Invoke(%Fs)");
+
+ SPRINTF(buf, szFmt, STRING(rgtest[iTest].szName));
+ *pbstr = SysAllocString(WIDESTRING(buf));
+ return NOERROR;
+}
+
+/***
+*HRESULT CInvokeByValSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CInvokeByValSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CInvokeByValSuite::DoTest(unsigned int iTest)
+{
+ HRESULT hresult;
+ IDispatch FAR* pdisp;
+
+
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_FAIL);
+
+ pdisp = NULL;
+
+ IfFailRet(CreateObject(g_szCDispTst, &pdisp));
+ IfFailGo(rgtest[iTest].pfnTest(pdisp, iTest, FALSE), LError0);
+ IfFailGo(rgtest[iTest].pfnTest(pdisp, iTest, TRUE), LError0);
+
+ hresult = NOERROR;
+
+LError0:;
+ if(pdisp != NULL)
+ pdisp->Release();
+
+ return hresult;
+}
+
+
+#if VBA2
+VARIANTARG g_rgvarg[21];
+#else //VBA2
+VARIANTARG g_rgvarg[20];
+#endif //VBA2
+
+static HRESULT
+init()
+{
+ VARIANTARG FAR* pvarg;
+
+ pvarg = g_rgvarg;
+
+ V_VT(pvarg) = VT_EMPTY;
+ pvarg++;
+
+ V_VT(pvarg) = VT_NULL;
+ pvarg++;
+
+#if VBA2
+ V_VT(pvarg) = VT_UI1; V_UI1(pvarg) = 41;
+ pvarg++;
+#endif //VBA2
+
+ V_VT(pvarg) = VT_I2; V_I2(pvarg) = 42;
+ pvarg++;
+
+ V_VT(pvarg) = VT_I4; V_I4(pvarg) = 43L;
+ pvarg++;
+
+ V_VT(pvarg) = VT_R4; V_R4(pvarg) = 42.42;
+ pvarg++;
+
+ V_VT(pvarg) = VT_R8; V_R8(pvarg) = 43.43;
+ pvarg++;
+
+ V_VT(pvarg) = VT_CY; V_CY(pvarg).Hi = 0; V_CY(pvarg).Lo = 6;
+ pvarg++;
+
+ V_VT(pvarg) = VT_CY; V_CY(pvarg).Hi = 107; V_CY(pvarg).Lo = 66;
+ pvarg++;
+
+ V_VT(pvarg) = VT_DATE; V_DATE(pvarg) = 0.6;
+ pvarg++;
+
+ V_VT(pvarg) = VT_DATE; V_DATE(pvarg) = 107.66;
+ pvarg++;
+
+ V_VT(pvarg) = VT_BSTR; V_BSTR(pvarg) = SysAllocString(OLESTR("binary string"));
+ pvarg++;
+
+ V_VT(pvarg) = VT_BSTR; V_BSTR(pvarg) = SysAllocString(NULL);
+ pvarg++;
+
+ V_VT(pvarg) = VT_BSTR; V_BSTR(pvarg) = SysAllocString(OLESTR("42"));
+ pvarg++;
+
+ V_VT(pvarg) = VT_BSTR; V_BSTR(pvarg) = SysAllocString(OLESTR("43.43"));
+ pvarg++;
+
+ V_VT(pvarg) = VT_BSTR; V_BSTR(pvarg) = SysAllocString(OLESTR("#TRUE#"));
+ pvarg++;
+
+ V_VT(pvarg) = VT_BSTR; V_BSTR(pvarg) = SysAllocString(OLESTR("#FALSE#"));
+ pvarg++;
+
+ V_VT(pvarg) = VT_ERROR; V_ERROR(pvarg) = S_OK;
+ pvarg++;
+
+ V_VT(pvarg) = VT_ERROR; V_ERROR(pvarg) = E_FAIL;
+ pvarg++;
+
+ V_VT(pvarg) = VT_BOOL; V_BOOL(pvarg) = 0;
+ pvarg++;
+
+ V_VT(pvarg) = VT_BOOL; V_BOOL(pvarg) = -1;
+ pvarg++;
+
+ ASSERT(pvarg == &g_rgvarg[DIM(g_rgvarg)]);
+
+ return NOERROR;
+}
+
+static HRESULT
+clear()
+{
+ VARIANTARG FAR* pvarg;
+
+ for(pvarg = g_rgvarg; pvarg < &g_rgvarg[DIM(g_rgvarg)]; ++pvarg){
+ IfFailRet(VariantClear(pvarg));
+ }
+
+ return NOERROR;
+}
+
+HRESULT
+InvokeByValDefault(IDispatch FAR* pdisp, int iTest, int fNamed)
+{
+ unsigned int uArgErr;
+ int i, j, cArgs;
+ NAMEDESC FAR* pnd;
+ VARIANT varResult;
+ DISPID FAR* rgdispid;
+ DISPPARAMS dispparams;
+ HRESULT hresult, hresultTmp;
+
+
+ pnd = &rgtest[iTest].namedesc;
+ hresult = GetDISPIDs(pdisp, pnd, &rgdispid);
+
+ if(HRESULT_FAILED(hresult)){
+#if OE_WIN32
+// when doing 16/32 interop, 3 tests aren't available when talking to a
+// 16-bit server. No easy away to tell, so if we get the right error
+// on the right 3 tests, we'll pretend it worked. Baselines will catch
+// us if there's a problem doing 32-32.
+ SCODE sc = GetScode(hresult);
+ if (sc == DISP_E_UNKNOWNNAME) {
+ if (!wcsicmp(OLESTR("r4"), pnd->rgszNames[0])
+ || !wcsicmp(OLESTR("r8"), pnd->rgszNames[0])
+ || !wcsicmp(OLESTR("date"), pnd->rgszNames[0])) {
+ return NOERROR; // pretend we worked
+ }
+ }
+#endif //OE_WIN32
+ return hresult;
+ }
+
+ cArgs = pnd->cNames - 1;
+
+ dispparams.cArgs = cArgs;
+ dispparams.rgvarg = NULL;
+ if(!fNamed){
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ }else{
+ dispparams.cNamedArgs = cArgs;
+ dispparams.rgdispidNamedArgs = &rgdispid[1];
+ }
+
+ if(cArgs > 0){
+ if((dispparams.rgvarg = new FAR VARIANT [cArgs]) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ for(j = 0; j < cArgs; ++j)
+ VariantInit(&dispparams.rgvarg[j]);
+ }
+
+ init();
+
+ for(i = 0; i < DIM(g_rgvarg); ++i){
+
+ if(i > 0 && V_VT(&g_rgvarg[i]) == VT_EMPTY)
+ continue;
+
+ for(j = 0; j < cArgs; ++j){
+ IfFailGo(VariantCopy(&dispparams.rgvarg[j], &g_rgvarg[i]), LError0);
+ }
+
+ uArgErr = 0;
+ MEMSET(&varResult, -1, sizeof(varResult));
+ VariantInit(&varResult);
+
+ hresult = DoInvoke(
+ pdisp, rgdispid[0], &dispparams, &varResult, NULL, &uArgErr);
+
+ for(j = 0; j < cArgs; ++j){
+ hresultTmp = VariantClear(&dispparams.rgvarg[j]);
+ ASSERT(hresultTmp == NOERROR);
+ }
+
+ hresultTmp = VariantClear(&varResult);
+ ASSERT(hresultTmp == NOERROR);
+
+ if(HRESULT_FAILED(hresult)){
+ SCODE sc = GetScode(hresult);
+ if (sc != E_NOTIMPL
+ && sc != DISP_E_OVERFLOW
+ && sc != DISP_E_TYPEMISMATCH)
+ goto LError0;
+ }
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+ if(dispparams.rgvarg != NULL)
+ delete dispparams.rgvarg;
+
+ hresultTmp = clear();
+ ASSERT(hresultTmp == NOERROR);
+
+ delete rgdispid;
+
+ return hresult;
+}
+
+HRESULT
+InvokeByValHello(IDispatch FAR* pdisp, int iTest, int fNamed)
+{
+ HRESULT hresult;
+ DISPID FAR* rgdispid;
+ DISPPARAMS dispparams;
+
+ UNUSED(fNamed);
+
+ IfFailRet(
+ GetDISPIDs(
+ pdisp, &rgtest[iTest].namedesc, &rgdispid));
+
+ dispparams.cArgs = 0;
+ dispparams.cNamedArgs = 0;
+ IfFailGo(
+ DoInvoke(pdisp, rgdispid[0], &dispparams, NULL, NULL, NULL),
+ LError0);
+
+ hresult = NOERROR;
+
+LError0:;
+ delete rgdispid;
+
+ return hresult;
+}
+
+HRESULT
+InvokeByValDisp(IDispatch FAR* pdisp, int iTest, int fNamed)
+{
+ HRESULT hresult;
+ VARIANT varResult;
+ DISPID dispidMember;
+ DISPID FAR* rgdispid;
+ DISPPARAMS dispparams;
+ OLECHAR FAR* rgszNames[1];
+
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp0, FAR* pdisp1;
+
+ UNUSED(fNamed);
+
+ hresult = NOERROR;
+
+ IfFailRet(
+ GetDISPIDs(pdisp, &rgtest[iTest].namedesc, &rgdispid));
+
+ dispparams.cArgs = 0;
+ dispparams.rgvarg = NULL;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+
+ MEMSET(&varResult, -1, sizeof(varResult));
+ VariantInit(&varResult);
+
+ IfFailGo(
+ DoInvoke(pdisp, rgdispid[0], &dispparams, &varResult, NULL, NULL),
+ LError0);
+
+ if(V_VT(&varResult) != VT_DISPATCH){
+ hresult = RESULT(E_FAIL);
+ goto LError0;
+ }
+
+ /* check out the IDispatch* we got back */
+
+ // QI to IUnknown and back
+
+ pdisp0 = V_DISPATCH(&varResult);
+ pdisp0->AddRef();
+
+ hresult = VariantClear(&varResult);
+ ASSERT(!HRESULT_FAILED(hresult));
+
+ hresult = pdisp0->QueryInterface(IID_IUnknown, (void FAR* FAR*)&punk);
+ DbPrintf("QueryInterface(IUnknown) => %s\n",
+ DbSzOfScode(GetScode(hresult)));
+ if(HRESULT_FAILED(hresult))
+ goto LError1;
+
+ hresult = punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp1);
+ DbPrintf("QueryInterface(IDispatch) => %s\n",
+ DbSzOfScode(GetScode(hresult)));
+ if(HRESULT_FAILED(hresult))
+ goto LError2;
+
+ /* invoke Hello() method on pdisp0 and pdisp1 */
+
+ dispparams.cArgs = 0;
+ dispparams.cNamedArgs = 0;
+
+ rgszNames[0] = OLESTR("hello");
+
+ IfFailGo(
+ pdisp0->GetIDsOfNames(
+ IID_NULL, rgszNames, 1, LOCALE_USER_DEFAULT, &dispidMember),
+ LError3);
+
+ IfFailGo(
+ DoInvoke(pdisp0, dispidMember, &dispparams, NULL, NULL, NULL), LError3);
+
+ IfFailGo(
+ pdisp1->GetIDsOfNames(
+ IID_NULL, rgszNames, 1, LOCALE_USER_DEFAULT, &dispidMember),
+ LError3);
+
+ IfFailGo(
+ DoInvoke(pdisp1, dispidMember, &dispparams, NULL, NULL, NULL), LError3);
+
+ hresult = NOERROR;
+
+LError3:
+ pdisp1->Release();
+
+LError2:
+ punk->Release();
+
+LError1:
+ pdisp0->Release();
+
+LError0:;
+ delete rgdispid;
+
+ return hresult;
+}
diff --git a/private/oleauto/tests/disptest/clsid.h b/private/oleauto/tests/disptest/clsid.h
new file mode 100644
index 000000000..9a62d1290
--- /dev/null
+++ b/private/oleauto/tests/disptest/clsid.h
@@ -0,0 +1,31 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+`* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs referenced by the IDispatch test app.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+DEFINE_OLEGUID(IID_ITestSuite, 0x00020440, 0, 0);
+
+DEFINE_OLEGUID(CLSID_CPoly, 0x00020462, 0, 0);
+DEFINE_OLEGUID(CLSID_CPoint, 0x00020463, 0, 0);
+
+DEFINE_OLEGUID(CLSID_CPoly2, 0x00020464, 0, 0);
+DEFINE_OLEGUID(CLSID_CPoint2, 0x00020465, 0, 0);
+
+DEFINE_OLEGUID(CLSID_CCalc, 0x00020467, 0, 0);
+
+DEFINE_OLEGUID(CLSID_SDispTst_CSArray, 0x00020461, 0, 0);
+DEFINE_OLEGUID(CLSID_SDispTst_CDispTst, 0x00020460, 0, 0);
+DEFINE_OLEGUID(CLSID_SDispTst_CExcepinfo, 0x00020466, 0, 0);
+DEFINE_OLEGUID(CLSID_SDispTst_CAppObject, 0x00020468, 0, 0);
+
+#if VBA2
+DEFINE_OLEGUID(IID_IDualTst, 0x00020475, 0, 0);
+#endif
diff --git a/private/oleauto/tests/disptest/cnls.cpp b/private/oleauto/tests/disptest/cnls.cpp
new file mode 100644
index 000000000..540300f85
--- /dev/null
+++ b/private/oleauto/tests/disptest/cnls.cpp
@@ -0,0 +1,421 @@
+/***
+*cnls.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CNlsSuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+#include "tstsuite.h"
+
+
+struct TEST {
+ HRESULT (*pfnTest)(LCID);
+ OLECHAR FAR* szName;
+ LCID lcid;
+};
+
+HRESULT DumpNlsInfo(LCID lcid);
+HRESULT NlsAPIRaid28(LCID ignore);
+HRESULT NlsAPIRaid418(LCID ignore);
+HRESULT OB4589(LCID ignore);
+HRESULT NlsCurrentLCID(LCID ignore);
+
+#if !defined(WIN32)
+#define NLSTEST(X) { DumpNlsInfo, OLESTR("lcid = ") #X, X }
+#endif
+static TEST rgtest[] = {
+#if defined(WIN32)
+ { DumpNlsInfo, OLESTR("lcid = 0x0409"), 0x0409}
+ , { NlsCurrentLCID, OLESTR("CurrentLcid"), 0 }
+#else //WIN32
+ NLSTEST(0x040c)
+ , NLSTEST(0x0407)
+ , NLSTEST(0x0409)
+ , NLSTEST(0x0809)
+ , NLSTEST(0x0c09)
+ , NLSTEST(0x1009)
+ , NLSTEST(0x1409)
+ , NLSTEST(0x0406)
+ , NLSTEST(0x0413)
+ , NLSTEST(0x0813)
+ , NLSTEST(0x040b)
+ , NLSTEST(0x080c)
+ , NLSTEST(0x0c0c)
+ , NLSTEST(0x100c)
+ , NLSTEST(0x0807)
+ , NLSTEST(0x0c07)
+ , NLSTEST(0x0410)
+ , NLSTEST(0x0810)
+ , NLSTEST(0x040a)
+ , NLSTEST(0x080a)
+ , NLSTEST(0x0c0a)
+ , NLSTEST(0x041d)
+ , NLSTEST(0x0414)
+ , NLSTEST(0x0416)
+ , NLSTEST(0x0816)
+ , NLSTEST(0x0405)
+ , NLSTEST(0x040e)
+ , NLSTEST(0x0415)
+ , NLSTEST(0x041b)
+ , NLSTEST(0x0419)
+ , NLSTEST(0x0403)
+ , NLSTEST(0x0408)
+ , NLSTEST(0x040f)
+ , NLSTEST(0x041f)
+ , NLSTEST(0x0814)
+ , NLSTEST(0x1809)
+// BIDI locales
+ , NLSTEST(0x040d)
+ , NLSTEST(0x0401)
+ , NLSTEST(0x0801)
+ , NLSTEST(0x0c01)
+ , NLSTEST(0x1001)
+ , NLSTEST(0x1401)
+ , NLSTEST(0x1801)
+ , NLSTEST(0x1c01)
+ , NLSTEST(0x2001)
+ , NLSTEST(0x2401)
+ , NLSTEST(0x2801)
+ , NLSTEST(0x2c01)
+ , NLSTEST(0x3001)
+ , NLSTEST(0x3401)
+ , NLSTEST(0x3801)
+ , NLSTEST(0x3C01)
+ , NLSTEST(0x4001)
+ , NLSTEST(0x0429)
+
+// DBCS locales
+ , NLSTEST(0x0404)
+ , NLSTEST(0x0804)
+ , NLSTEST(0x0411)
+ , NLSTEST(0x0412)
+
+ , { NlsCurrentLCID, OLESTR("CurrentLcid"), 0 }
+
+ // regression tests
+ , { NlsAPIRaid28, OLESTR("raid:oleprog#28"), 0 }
+ , { NlsAPIRaid418, OLESTR("raid:oleprog#418"), 0 }
+ , { OB4589, OLESTR("raid:ob#4589"), 0 }
+#endif //WIN32
+};
+#undef NLSTEST
+
+
+SUITE_CONSTRUCTION_IMPL(CNlsSuite)
+
+SUITE_IUNKNOWN_IMPL(CNlsSuite)
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CNlsSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("NLS API"), pbstr);
+}
+
+STDMETHODIMP
+CNlsSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("nlsapi.log"), pbstr);
+}
+
+STDMETHODIMP
+CNlsSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CNlsSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return ErrBstrAlloc(rgtest[iTest].szName, pbstr);
+}
+
+/***
+*HRESULT CNlsSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CNlsSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CNlsSuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return rgtest[iTest].pfnTest(rgtest[iTest].lcid);
+}
+
+#define LCINIT(X) {X, #X}
+static struct {
+ LCTYPE lctype;
+ char FAR* szLctype;
+} rglctype[] = {
+ LCINIT(LOCALE_ILANGUAGE) /* language id */
+ , LCINIT(LOCALE_SLANGUAGE) /* localized name of language */
+ , LCINIT(LOCALE_SENGLANGUAGE) /* English name of language */
+ , LCINIT(LOCALE_SABBREVLANGNAME) /* abbreviated language name */
+ , LCINIT(LOCALE_SNATIVELANGNAME) /* native name of language */
+ , LCINIT(LOCALE_ICOUNTRY) /* country code */
+ , LCINIT(LOCALE_SCOUNTRY) /* localized name of country */
+ , LCINIT(LOCALE_SENGCOUNTRY) /* English name of country */
+ , LCINIT(LOCALE_SABBREVCTRYNAME) /* abbreviated country name */
+ , LCINIT(LOCALE_SNATIVECTRYNAME) /* native name of country */
+ , LCINIT(LOCALE_IDEFAULTLANGUAGE) /* default language id */
+ , LCINIT(LOCALE_IDEFAULTCOUNTRY) /* default country code */
+ , LCINIT(LOCALE_IDEFAULTCODEPAGE) /* default code page */
+ , LCINIT(LOCALE_SLIST) /* list item separator */
+ , LCINIT(LOCALE_IMEASURE) /* 0 = metric, 1 = US */
+ , LCINIT(LOCALE_SDECIMAL) /* decimal separator */
+ , LCINIT(LOCALE_STHOUSAND) /* thousand separator */
+ , LCINIT(LOCALE_SGROUPING) /* digit grouping */
+ , LCINIT(LOCALE_IDIGITS) /* number of fractional digits */
+ , LCINIT(LOCALE_ILZERO) /* leading zeros for decimal */
+ , LCINIT(LOCALE_SNATIVEDIGITS) /* native ascii 0-9 */
+ , LCINIT(LOCALE_SCURRENCY) /* local monetary symbol */
+ , LCINIT(LOCALE_SINTLSYMBOL) /* intl monetary symbol */
+ , LCINIT(LOCALE_SMONDECIMALSEP) /* monetary decimal separator */
+ , LCINIT(LOCALE_SMONTHOUSANDSEP) /* monetary thousand separator */
+ , LCINIT(LOCALE_SMONGROUPING) /* monetary grouping */
+ , LCINIT(LOCALE_ICURRDIGITS) /* # local monetary digits */
+ , LCINIT(LOCALE_IINTLCURRDIGITS) /* # intl monetary digits */
+ , LCINIT(LOCALE_ICURRENCY) /* positive currency mode */
+ , LCINIT(LOCALE_INEGCURR) /* negative currency mode */
+ , LCINIT(LOCALE_SDATE) /* date separator */
+ , LCINIT(LOCALE_STIME) /* time separator */
+ , LCINIT(LOCALE_SSHORTDATE) /* short date-time separator */
+ , LCINIT(LOCALE_SLONGDATE) /* long date-time separator */
+ , LCINIT(LOCALE_IDATE) /* short date format ordering */
+ , LCINIT(LOCALE_ILDATE) /* long date format ordering */
+ , LCINIT(LOCALE_ITIME) /* time format specifier */
+ , LCINIT(LOCALE_ICENTURY) /* century format specifier */
+ , LCINIT(LOCALE_ITLZERO) /* leading zeros in time field */
+ , LCINIT(LOCALE_IDAYLZERO) /* leading zeros in day field */
+ , LCINIT(LOCALE_IMONLZERO) /* leading zeros in month field */
+ , LCINIT(LOCALE_S1159) /* AM designator */
+ , LCINIT(LOCALE_S2359) /* PM designator */
+ , LCINIT(LOCALE_SDAYNAME1) /* long name for Monday */
+ , LCINIT(LOCALE_SDAYNAME2) /* long name for Tuesday */
+ , LCINIT(LOCALE_SDAYNAME3) /* long name for Wednesday */
+ , LCINIT(LOCALE_SDAYNAME4) /* long name for Thursday */
+ , LCINIT(LOCALE_SDAYNAME5) /* long name for Friday */
+ , LCINIT(LOCALE_SDAYNAME6) /* long name for Saturday */
+ , LCINIT(LOCALE_SDAYNAME7) /* long name for Sunday */
+ , LCINIT(LOCALE_SABBREVDAYNAME1) /* abbreviated name for Monday */
+ , LCINIT(LOCALE_SABBREVDAYNAME2) /* abbreviated name for Tuesday */
+ , LCINIT(LOCALE_SABBREVDAYNAME3) /* abbreviated name for Wednesday */
+ , LCINIT(LOCALE_SABBREVDAYNAME4) /* abbreviated name for Thursday */
+ , LCINIT(LOCALE_SABBREVDAYNAME5) /* abbreviated name for Friday */
+ , LCINIT(LOCALE_SABBREVDAYNAME6) /* abbreviated name for Saturday */
+ , LCINIT(LOCALE_SABBREVDAYNAME7) /* abbreviated name for Sunday */
+ , LCINIT(LOCALE_SMONTHNAME1) /* long name for January */
+ , LCINIT(LOCALE_SMONTHNAME2) /* long name for February */
+ , LCINIT(LOCALE_SMONTHNAME3) /* long name for March */
+ , LCINIT(LOCALE_SMONTHNAME4) /* long name for April */
+ , LCINIT(LOCALE_SMONTHNAME5) /* long name for May */
+ , LCINIT(LOCALE_SMONTHNAME6) /* long name for June */
+ , LCINIT(LOCALE_SMONTHNAME7) /* long name for July */
+ , LCINIT(LOCALE_SMONTHNAME8) /* long name for August */
+ , LCINIT(LOCALE_SMONTHNAME9) /* long name for September */
+ , LCINIT(LOCALE_SMONTHNAME10) /* long name for October */
+ , LCINIT(LOCALE_SMONTHNAME11) /* long name for November */
+ , LCINIT(LOCALE_SMONTHNAME12) /* long name for December */
+ , LCINIT(LOCALE_SABBREVMONTHNAME1) /* abbreviated name for January */
+ , LCINIT(LOCALE_SABBREVMONTHNAME2) /* abbreviated name for February */
+ , LCINIT(LOCALE_SABBREVMONTHNAME3) /* abbreviated name for March */
+ , LCINIT(LOCALE_SABBREVMONTHNAME4) /* abbreviated name for April */
+ , LCINIT(LOCALE_SABBREVMONTHNAME5) /* abbreviated name for May */
+ , LCINIT(LOCALE_SABBREVMONTHNAME6) /* abbreviated name for June */
+ , LCINIT(LOCALE_SABBREVMONTHNAME7) /* abbreviated name for July */
+ , LCINIT(LOCALE_SABBREVMONTHNAME8) /* abbreviated name for August */
+ , LCINIT(LOCALE_SABBREVMONTHNAME9) /* abbreviated name for September */
+ , LCINIT(LOCALE_SABBREVMONTHNAME10) /* abbreviated name for October */
+ , LCINIT(LOCALE_SABBREVMONTHNAME11) /* abbreviated name for November */
+ , LCINIT(LOCALE_SABBREVMONTHNAME12) /* abbreviated name for December */
+ , LCINIT(LOCALE_SPOSITIVESIGN) /* positive sign */
+ , LCINIT(LOCALE_SNEGATIVESIGN) /* negative sign */
+ , LCINIT(LOCALE_IPOSSIGNPOSN) /* positive sign position */
+ , LCINIT(LOCALE_INEGSIGNPOSN) /* negative sign position */
+ , LCINIT(LOCALE_IPOSSYMPRECEDES) /* mon sym precedes pos amt */
+ , LCINIT(LOCALE_IPOSSEPBYSPACE) /* mon sym sep by space from pos */
+ , LCINIT(LOCALE_INEGSYMPRECEDES) /* mon sym precedes neg amt */
+ , LCINIT(LOCALE_INEGSEPBYSPACE) /* mon sym sep by space from neg */
+ , LCINIT(LOCALE_IFIRSTDAYOFWEEK)
+ , LCINIT(LOCALE_IFIRSTWEEKOFYEAR)
+ , LCINIT(LOCALE_IDEFAULTANSICODEPAGE)
+ , LCINIT(LOCALE_INEGNUMBER)
+ , LCINIT(LOCALE_STIMEFORMAT)
+ , LCINIT(LOCALE_ITIMEMARKPOSN)
+ , LCINIT(LOCALE_ICALENDARTYPE)
+ , LCINIT(LOCALE_IOPTIONALCALENDAR)
+ , LCINIT(LOCALE_SMONTHNAME13)
+ , LCINIT(LOCALE_SABBREVMONTHNAME13)
+};
+
+// dump all nls info for all our supported locales!
+HRESULT
+DumpNlsInfo(LCID lcid)
+{
+ BSTR bstr;
+ LCTYPE lctype;
+ int iLctype, size, fetched;
+ BSTR bstrDecimal = NULL;
+ BSTR bstrThousand = NULL;
+
+
+ DbPrintf("LCID = %ld\n", lcid);
+
+ for(iLctype = 0; iLctype < DIM(rglctype); ++iLctype){
+ DbPrintf(HC_MPW ? "%s = " : "%Fs = ",
+ (char FAR*)rglctype[iLctype].szLctype);
+
+ lctype = rglctype[iLctype].lctype;
+
+ size = GetLocaleInfoA(lcid, lctype, NULL, 0);
+ if(size == 0)
+ return RESULT(E_FAIL);
+
+#ifndef SysAllocStringByteLen
+#define SysAllocStringByteLen SysAllocStringLen
+#endif
+ bstr = SysAllocStringByteLen(NULL, size);
+ if(bstr == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ fetched = GetLocaleInfoA(lcid, lctype, (char FAR *)bstr, size);
+
+ DbPrintf(HC_MPW ? "\"%s\"\n" : "\"%Fs\"\n", (char FAR *)bstr);
+
+ switch (lctype) {
+ // save these for later checking
+ case LOCALE_SDECIMAL:
+ bstrDecimal = bstr;
+ break;
+ case LOCALE_STHOUSAND:
+ bstrThousand = bstr;
+ break;
+ default:
+ SysFreeString(bstr);
+ }
+
+ if(fetched != size)
+ return RESULT(E_FAIL);
+ }
+#if defined(WIN32)
+ if (!wcscmp(bstrDecimal, bstrThousand))
+#else //WIN32
+ if (!lstrcmp(bstrDecimal, bstrThousand))
+#endif //WIN32
+ {
+ DbPrintf("ERROR: decimal and thousands separators are the same for lcid = 0x%lx\n", lcid);
+ }
+ SysFreeString(bstrDecimal);
+ SysFreeString(bstrThousand);
+
+ DbPrintf("\n");
+
+ return NOERROR;
+}
+
+HRESULT
+NlsCurrentLCID(LCID ignore)
+{
+ UNUSED(ignore);
+
+ return DumpNlsInfo(GetSystemDefaultLCID());
+}
+
+// regression test for raid!oleprog#28 (sublanguages dont work)
+//
+HRESULT
+NlsAPIRaid28(LCID ignore)
+{
+ int size;
+ LCID lcid;
+
+ UNUSED(ignore);
+
+#if !defined(WIN32) // UNDONE: TEMPORARY
+ lcid = MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_NEUTRAL));
+ size = GetLocaleInfoA(lcid, LOCALE_ILANGUAGE, NULL, 0);
+ if(size <= 0)
+ return RESULT(E_FAIL);
+
+ lcid = MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS));
+ size = GetLocaleInfoA(lcid, LOCALE_ILANGUAGE, NULL, 0);
+ if(size <= 0)
+ return RESULT(E_FAIL);
+#endif //!WIN32
+
+ return NOERROR;
+}
+
+// regression test for raid!oleprog#418
+//
+// problem: LCMapStringA is returning 0 (error) for some characters
+// in some locales.
+//
+HRESULT
+NlsAPIRaid418(LCID ignore)
+{
+ int res;
+ char rgchIn[2], rgchOut[32];
+
+ rgchIn[0] = (BYTE)0x8C;
+
+ res = LCMapStringA(
+ 0x0407,
+ LCMAP_SORTKEY|NORM_IGNORECASE|NORM_IGNORENONSPACE,
+ rgchIn, 1, rgchOut, 32);
+
+ if(res == 0)
+ return RESULT(E_FAIL);
+ return NOERROR;
+}
+
+HRESULT
+OB4589(LCID ignore)
+{
+ int cmp;
+ char rgch1[2], rgch2[2];
+
+ UNUSED(ignore);
+
+ rgch1[0] = 'a';
+ rgch2[0] = 'A';
+ cmp = CompareStringA(0x0409, NORM_IGNORENONSPACE, rgch1, 1, rgch2, 1);
+ DbPrintf(
+ "CompareStringA(0409, NORM_IGNORENONSPACE, 'a', 'A') = %d\n", cmp);
+
+ rgch1[0] = 'a';
+ rgch2[0] = 'C';
+ cmp = CompareStringA(0x0409, NORM_IGNORENONSPACE, rgch1, 1, rgch2, 1);
+ DbPrintf(
+ "CompareStringA(0409, NORM_IGNORENONSPACE, 'a', 'C') = %d\n", cmp);
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/tests/disptest/csarray.cpp b/private/oleauto/tests/disptest/csarray.cpp
new file mode 100644
index 000000000..7dd783aa7
--- /dev/null
+++ b/private/oleauto/tests/disptest/csarray.cpp
@@ -0,0 +1,371 @@
+/***
+*csarray.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CSafeArraySuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+
+#include "disptest.h"
+#include "tstsuite.h"
+
+ASSERTDATA
+
+HRESULT SafeArrayRedimTest(VARTYPE vt, SAFEARRAY FAR* psa);
+HRESULT SafeArrayOleprog181();
+HRESULT SafeArrayOleprog302();
+
+
+static SARRAYDESC rgsarraydesc[] =
+{
+
+ {1, {{1,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{2,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{4,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{8,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{16,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{32,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{64,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{128,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{256,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{512,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{1024,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{2048,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{4096,0}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{5,100}, {0,0}, {0,0}, {0,0}, {0,0}}}
+ , {1, {{5,-100}, {0,0}, {0,0}, {0,0}, {0,0}}}
+
+ , {2, {{1,0}, {1,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{2,0}, {1,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{4,0}, {1,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{8,0}, {1,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{16,0}, {16,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{32,0}, {32,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{64,0}, {64,0}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{5,100}, {5,100}, {0,0}, {0,0}, {0,0}}}
+ , {2, {{5,-100}, {5,-100}, {0,0}, {0,0}, {0,0}}}
+
+ , {3, {{1,0}, {1,0}, {1,0}, {0,0}, {0,0}}}
+ , {3, {{2,0}, {2,0}, {2,0}, {0,0}, {0,0}}}
+ , {3, {{4,0}, {4,0}, {4,0}, {0,0}, {0,0}}}
+ , {3, {{8,0}, {8,0}, {8,0}, {0,0}, {0,0}}}
+ , {3, {{16,0}, {16,0}, {16,0}, {0,0}, {0,0}}}
+ , {3, {{5,100}, {5,100}, {5,100}, {0,0}, {0,0}}}
+ , {3, {{5,-100}, {5,-100}, {5,-100}, {0,0}, {0,0}}}
+
+ , {4, {{1,0}, {1,0}, {1,0}, {1,0}, {0,0}}}
+ , {4, {{2,0}, {2,0}, {2,0}, {2,0}, {0,0}}}
+ , {4, {{4,0}, {4,0}, {4,0}, {4,0}, {0,0}}}
+ , {4, {{8,0}, {8,0}, {8,0}, {8,0}, {0,0}}}
+ , {4, {{5,100}, {5,100}, {5,100}, {5,100}, {0,0}}}
+ , {4, {{5,-100}, {5,-100}, {5,-100}, {5,-100}, {0,0}}}
+};
+
+static OLECHAR FAR* rgszSArrayDesc[] =
+{
+ OLESTR("(1)"),
+ OLESTR("(2)"),
+ OLESTR("(4)"),
+ OLESTR("(8)"),
+ OLESTR("(16)"),
+ OLESTR("(32)"),
+ OLESTR("(64)"),
+ OLESTR("(128)"),
+ OLESTR("(256)"),
+ OLESTR("(512)"),
+ OLESTR("(1024)"),
+ OLESTR("(2048)"),
+ OLESTR("(4096)"),
+ OLESTR("(100 To 105)"),
+ OLESTR("(-100 To -95)"),
+
+ OLESTR("(1, 1)"),
+ OLESTR("(2, 2)"),
+ OLESTR("(4, 4)"),
+ OLESTR("(8, 8)"),
+ OLESTR("(16, 16)"),
+ OLESTR("(32, 32)"),
+ OLESTR("(64, 64)"),
+ OLESTR("(100 To 105, 100 To 105)"),
+ OLESTR("(-100 To -95, -100 To -95)"),
+
+ OLESTR("(1, 1, 1)"),
+ OLESTR("(2, 2, 2)"),
+ OLESTR("(4, 4, 4)"),
+ OLESTR("(8, 8, 8)"),
+ OLESTR("(16, 16, 16)"),
+ OLESTR("(100 To 105, 100 To 105, 100 To 105)"),
+ OLESTR("(-100 To -95, -100 To -95, -100 To -95)"),
+
+ OLESTR("(1, 1, 1, 1)"),
+ OLESTR("(2, 2, 2, 2)"),
+ OLESTR("(4, 4, 4, 4)"),
+ OLESTR("(8, 8, 8, 8)"),
+
+ OLESTR("(100 To 105, 100 To 105, 100 To 105, 100 To 105)"),
+ OLESTR("(-100 To -95, -100 To -95, -100 To -95, -100 To -95)")
+};
+
+static VARTYPE rgvtArrayTypes[] =
+{
+ VT_I2
+#if VBA2
+ , VT_UI1
+#endif //VBA2
+ , VT_I4
+ , VT_R4
+ , VT_R8
+ , VT_CY
+ , VT_DATE
+ , VT_BSTR
+ , VT_ERROR
+ , VT_BOOL
+ , VT_VARIANT
+ , VT_UNKNOWN
+ , VT_DISPATCH
+};
+
+
+
+struct TEST {
+ HRESULT (*pfnTest)();
+ OLECHAR FAR* szName;
+};
+
+static TEST rgtest[] =
+{
+ { SafeArrayOleprog181, OLESTR("raid:oleprog#181")}
+ , { SafeArrayOleprog302, OLESTR("raid!oleprog#302")}
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CSafeArraySuite)
+
+SUITE_IUNKNOWN_IMPL(CSafeArraySuite)
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CSafeArraySuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("SafeArray API"), pbstr);
+}
+
+STDMETHODIMP
+CSafeArraySuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("saryapi.log"), pbstr);
+}
+
+STDMETHODIMP
+CSafeArraySuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgvtArrayTypes) * DIM(rgsarraydesc) + DIM(rgtest);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSafeArraySuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ TCHAR buf[128];
+ int iVt, iDesc;
+
+ if(iTest >= (DIM(rgvtArrayTypes) * DIM(rgsarraydesc) + DIM(rgtest)))
+ return RESULT(E_INVALIDARG); // out-of-bounds really
+
+ if(iTest < (DIM(rgvtArrayTypes) * DIM(rgsarraydesc))) {
+ iVt = iTest / DIM(rgsarraydesc);
+ iDesc = iTest % DIM(rgsarraydesc);
+
+ ASSERT(iVt < DIM(rgvtArrayTypes));
+ ASSERT(iDesc < DIM(rgsarraydesc));
+ ASSERT(iDesc < DIM(rgszSArrayDesc));
+
+#if HC_MPW
+ sprintf(buf, "Dim <Array> %s As %s",
+#else
+ SPRINTF(buf, TSTR("Dim <Array> %Fs As %Fs"),
+#endif
+ rgszSArrayDesc[iDesc],
+ DbSzOfVt(rgvtArrayTypes[iVt]));
+
+ *pbstr = SysAllocString(WIDESTRING(buf));
+ return NOERROR;
+ }
+
+ iTest -= (DIM(rgvtArrayTypes) * DIM(rgsarraydesc));
+ return ErrBstrAlloc(rgtest[iTest].szName, pbstr);
+}
+
+/***
+*HRESULT CSafeArraySuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single SafeArray test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CSafeArraySuite::DoTest(unsigned int iTest)
+{
+ VARTYPE vt;
+ int iVt, iDesc;
+ SAFEARRAY FAR* psa;
+ SARRAYDESC FAR* psadesc;
+ HRESULT hresult, hresultTmp;
+
+
+ if(iTest >= (DIM(rgvtArrayTypes) * DIM(rgsarraydesc) + DIM(rgtest)))
+ return RESULT(E_INVALIDARG); // out-of-bounds really
+
+ if(iTest >= (DIM(rgvtArrayTypes) * DIM(rgsarraydesc))) {
+ iTest -= (DIM(rgvtArrayTypes) * DIM(rgsarraydesc));
+ return rgtest[iTest].pfnTest();
+
+ } else {
+ iVt = iTest / DIM(rgsarraydesc);
+ iDesc = iTest % DIM(rgsarraydesc);
+
+ ASSERT(iVt < DIM(rgvtArrayTypes));
+ ASSERT(iDesc < DIM(rgsarraydesc));
+
+ vt = rgvtArrayTypes[iVt];
+ psadesc = &rgsarraydesc[iDesc];
+
+ IfFailGo(SafeArrayCreateIdentity(vt, psadesc, &psa), LError0);
+
+ DbPrSafeArray(psa, vt);
+
+ IfFailGo(SafeArrayValidateIdentity(vt, psa, 0L), LError1);
+
+ IfFailGo(SafeArrayRedimTest(vt, psa), LError1);
+ hresult = NOERROR;
+ }
+
+LError1:;
+ hresultTmp = SafeArrayDestroy(psa);
+ ASSERT(hresultTmp == NOERROR);
+
+LError0:;
+ return hresult;
+}
+
+HRESULT
+SafeArrayRedimTest(VARTYPE vt, SAFEARRAY FAR* psa)
+{
+ unsigned long cElements;
+ HRESULT hresult;
+ SAFEARRAYBOUND sabound;
+
+ sabound = psa->rgsabound[0];
+
+ cElements = sabound.cElements;
+
+ sabound.cElements = cElements*2;
+ if((hresult = SafeArrayRedim(psa, &sabound)) != NOERROR){
+ if(GetScode(hresult) != E_OUTOFMEMORY)
+ return hresult;
+ // try once more with a smaller increase
+ sabound.cElements = cElements + 5;
+ IfFailRet(SafeArrayRedim(psa, &sabound));
+ }
+
+ DbPrSafeArray(psa, vt);
+
+ if(cElements == 1)
+ return NOERROR;
+
+ sabound.cElements = cElements/2;
+ IfFailRet(SafeArrayRedim(psa, &sabound));
+ DbPrSafeArray(psa, vt);
+
+ return NOERROR;
+}
+
+// regression test for oleprog#181: infinite loop in SafeArrayCopy
+// if the array is a simple type (ie, not unknown/dispatch/bstr/variant).
+
+HRESULT
+SafeArrayOleprog181()
+{
+ SARRAYDESC sadesc;
+ HRESULT hresult, hresultTmp;
+ SAFEARRAY FAR* psaSrc, FAR* psaDst;
+
+ sadesc.cDims = 2;
+ sadesc.rgsabound[0].lLbound = 0;
+ sadesc.rgsabound[0].cElements = 4;
+ sadesc.rgsabound[1].lLbound = 0;
+ sadesc.rgsabound[1].cElements = 4;
+
+
+ IfFailGo(SafeArrayCreateIdentity(VT_I2, &sadesc, &psaSrc), LError0);
+
+ DbPrSafeArray(psaSrc, VT_I2);
+
+ IfFailGo(SafeArrayCopy(psaSrc, &psaDst), LError1);
+
+ DbPrSafeArray(psaDst, VT_I2);
+
+ hresult = NOERROR;
+
+ hresultTmp = SafeArrayDestroy(psaDst);
+ ASSERT(hresultTmp == NOERROR);
+
+LError1:
+ hresultTmp = SafeArrayDestroy(psaSrc);
+ ASSERT(hresultTmp == NOERROR);
+
+LError0:
+ return hresult;
+}
+
+
+// regression test for oleprog#302: Creating a multi-dim SafeArray with a
+// dimension element of zero should return a psa of NULL
+//
+
+HRESULT
+SafeArrayOleprog302()
+{
+ SAFEARRAYBOUND rgsabound[4];
+ SAFEARRAY FAR* psa;
+ int cDims;
+
+ cDims = 4;
+ rgsabound[0].lLbound = 0;
+ rgsabound[0].cElements = 10;
+ rgsabound[1].lLbound = 0;
+ rgsabound[1].cElements = 10;
+ rgsabound[2].lLbound = 0;
+ rgsabound[2].cElements = 0;
+ rgsabound[3].lLbound = 0;
+ rgsabound[3].cElements = 10;
+
+ psa = SafeArrayCreate(VT_I2, cDims, rgsabound);
+
+ if (psa == NULL)
+ return NOERROR;
+
+ SafeArrayDestroy(psa);
+ return RESULT(E_FAIL);
+}
+
+
diff --git a/private/oleauto/tests/disptest/ctime.cpp b/private/oleauto/tests/disptest/ctime.cpp
new file mode 100644
index 000000000..fd8303d41
--- /dev/null
+++ b/private/oleauto/tests/disptest/ctime.cpp
@@ -0,0 +1,266 @@
+/***
+*ctime.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CTimeSuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+#include "tstsuite.h"
+
+
+void DbPrDosDateTime(unsigned short, unsigned short);
+
+struct TEST {
+ HRESULT (*pfnTest)(void);
+ OLECHAR FAR* szName;
+};
+
+HRESULT DosToVariant(void);
+HRESULT VariantToDos(void);
+
+static TEST rgtest[] = {
+ { DosToVariant, OLESTR("DosDateTimeToVariantTime") },
+ { VariantToDos, OLESTR("VariantTimeToDosDateTime") }
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CTimeSuite)
+
+SUITE_IUNKNOWN_IMPL(CTimeSuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CTimeSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Time API"), pbstr);
+}
+
+STDMETHODIMP
+CTimeSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("timeapi.log"), pbstr);
+}
+
+STDMETHODIMP
+CTimeSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CTimeSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return ErrBstrAlloc(rgtest[iTest].szName, pbstr);
+}
+
+/***
+*HRESULT CTimeSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CTimeSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CTimeSuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return rgtest[iTest].pfnTest();
+}
+
+#define DOSDATE(MONTH, DAY, YEAR)\
+ ((((YEAR)-1980) << 9) + ((MONTH) << 5) + (DAY))
+
+#define DOSTIME(HOUR, MIN, SEC)\
+ (((HOUR) << 11) + ((MIN) << 5) + ((SEC) / 2))
+
+HRESULT
+DosToVariant()
+{
+ int i;
+ VARIANT var;
+ unsigned short wDosDate, wDosTime;
+static struct {
+ unsigned short wDosDate;
+ unsigned short wDosTime;
+} rgdostime[] = {
+ { DOSDATE(1, 1, 1980), DOSTIME(0, 0, 0) }
+ , { DOSDATE(1, 1, 1990), DOSTIME(0, 0, 0) }
+ , { DOSDATE(1, 1, 2000), DOSTIME(0, 0, 0) }
+ , { DOSDATE(1, 1, 2099), DOSTIME(0, 0, 0) }
+ , { DOSDATE(1, 1, 1980), DOSTIME(1, 0, 0) }
+ , { DOSDATE(1, 1, 1980), DOSTIME(1, 1, 0) }
+ , { DOSDATE(1, 1, 1980), DOSTIME(1, 1, 1) }
+ , { DOSDATE(1, 1, 1980), DOSTIME(1, 1, 2) }
+ , { DOSDATE(1, 1, 1980), DOSTIME(1, 1, 3) }
+ , { DOSDATE(1, 1, 1980), DOSTIME(1, 1, 4) }
+ , { DOSDATE(5, 8, 1983), DOSTIME(12, 22, 4) }
+ , { DOSDATE(10, 23, 2000), DOSTIME(1, 1, 9) }
+ , { DOSDATE(10, 23, 2015), DOSTIME(1, 1, 22) }
+ , { DOSDATE(11, 30, 2099), DOSTIME(23, 59, 59) }
+};
+
+ for(i = 0; i < DIM(rgdostime); ++i){
+ wDosDate = rgdostime[i].wDosDate;
+ wDosTime = rgdostime[i].wDosTime;
+
+ DbPrDosDateTime(wDosDate, wDosTime);
+ DbPrintf(" = ");
+
+ V_VT(&var) = VT_DATE;
+ V_DATE(&var) = 0.0;
+ if(DosDateTimeToVariantTime(wDosDate, wDosTime, &V_DATE(&var)) == 0){
+ DbPrintf("False\n");
+ }else{
+ DbPrintf("vartime(%#g) = ", V_DATE(&var));
+ if(VariantChangeType(&var, &var, 0, VT_BSTR) != NOERROR)
+ return RESULT(E_FAIL);
+#if HC_MPW
+ DbPrintf("%s\n", V_BSTR(&var));
+#else
+ DbPrintf("%Fs\n", STRING(V_BSTR(&var)));
+#endif
+ }
+ if(VariantClear(&var) != NOERROR)
+ return RESULT(E_FAIL);
+ }
+
+ return NOERROR;
+}
+
+HRESULT
+VariantToDos()
+{
+ int i;
+ VARIANT var;
+ unsigned short wDosDate;
+ unsigned short wDosTime;
+
+static OLECHAR FAR* rgszTime[] = {
+ OLESTR("1/1/1980")
+ , OLESTR("1/1/1990")
+ , OLESTR("1/1/2000")
+ , OLESTR("1/1/2099")
+ , OLESTR("1/1/1980 1:0:0")
+ , OLESTR("1/1/1980 1:1:0")
+ , OLESTR("1/1/1980 1:1:1")
+ , OLESTR("1/1/1980 1:1:2")
+ , OLESTR("1/1/1980 1:1:3")
+ , OLESTR("1/1/1980 1:1:4")
+ , OLESTR("5/8/1983 12:22:4")
+ , OLESTR("10/10/2000 1:1:18")
+ , OLESTR("11/30/2099 23:59:59")
+};
+
+ VariantInit(&var);
+ for(i = 0; i < DIM(rgszTime); ++i){
+#if HC_MPW
+ DbPrintf("\'%s' = ", rgszTime[i]);
+#else
+ DbPrintf("\'%Fs' = ", STRING(rgszTime[i]));
+#endif
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(rgszTime[i]);
+ if(VariantChangeType(&var, &var, 0, VT_DATE) != NOERROR)
+ return RESULT(E_FAIL);
+ DbPrintf("vartime(%#g) = ", V_DATE(&var));
+ if(VariantTimeToDosDateTime(V_DATE(&var), &wDosDate, &wDosTime) == 0){
+ DbPrintf("False\n");
+ }else{
+ DbPrDosDateTime(wDosDate, wDosTime);
+ DbPrintf("\n");
+ }
+ if(VariantClear(&var) != NOERROR)
+ return RESULT(E_FAIL);
+ }
+
+ return NOERROR;
+}
+
+unsigned short
+YearOfDosDate(unsigned short wDosDate)
+{
+ return ((wDosDate >> 9) & 0x007f);
+}
+
+unsigned short
+MonthOfDosDate(unsigned short wDosDate)
+{
+ return ((wDosDate >> 5) & 0x000f);
+}
+
+unsigned short
+DayOfDosDate(unsigned short wDosDate)
+{
+ return ((wDosDate) & 0x001f);
+}
+
+void
+DbPrDosDate(unsigned short wDosDate)
+{
+ DbPrintf("%d-%d-%d",
+ MonthOfDosDate(wDosDate),
+ DayOfDosDate(wDosDate),
+ YearOfDosDate(wDosDate));
+}
+
+unsigned short
+HourOfDosTime(unsigned short wDosTime)
+{
+ return ((wDosTime >> 11) & 0x001f);
+}
+
+unsigned short
+MinOfDosTime(unsigned short wDosTime)
+{
+ return ((wDosTime >> 5) & 0x003f);
+}
+
+unsigned short
+SecOfDosTime(unsigned short wDosTime)
+{
+ return ((wDosTime) & 0x001f);
+}
+
+void
+DbPrDosTime(unsigned short wDosTime)
+{
+ DbPrintf("%d:%d:%d",
+ HourOfDosTime(wDosTime),
+ MinOfDosTime(wDosTime),
+ SecOfDosTime(wDosTime));
+}
+
+void
+DbPrDosDateTime(unsigned short wDosDate, unsigned short wDosTime)
+{
+ DbPrDosDate(wDosDate);
+ DbPrintf(" ");
+ DbPrDosTime(wDosTime);
+}
+
diff --git a/private/oleauto/tests/disptest/cvariant.cpp b/private/oleauto/tests/disptest/cvariant.cpp
new file mode 100644
index 000000000..3b62c9d4c
--- /dev/null
+++ b/private/oleauto/tests/disptest/cvariant.cpp
@@ -0,0 +1,1617 @@
+/***
+*cvariant.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CVariantSuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+
+#include <float.h> /* for DBL_MAX */
+
+#include "tstsuite.h"
+#include "cunk.h"
+#include "cdisp.h"
+
+ASSERTDATA
+
+#ifdef _MAC
+# define CY_(HI,LO) {HI,LO}
+#else
+# define CY_(HI,LO) {LO,HI}
+#endif
+
+
+// return on an hresult that is not success, and *not* one of the
+// errors we are expecting/allowing.
+//
+#define IFFAILRET(X) \
+ { HRESULT hresultTmp = (X); \
+ if(HRESULT_FAILED(hresultTmp)){ \
+ SCODE sc = GetScode(hresultTmp); \
+ if (sc != E_NOTIMPL \
+ && sc != DISP_E_OVERFLOW \
+ && sc != E_NOINTERFACE \
+ && sc != DISP_E_TYPEMISMATCH) \
+ return hresultTmp; \
+ } \
+ }
+
+
+long rgEmptyVal[] = {0};
+
+long rgNullVal[] = {0};
+
+#if VBA2
+unsigned char rgUI1Val[] = {0, 1, 128, 255};
+#endif //VBA2
+
+short rgI2Val[] = {0, 1, -1, 42};
+
+long rgI4Val[] = {0, 1, -1, 42000};
+
+float rgR4Val[] = {(float)0.0, (float)42.42, (float)107.66, (float)-2147483648.0};
+
+double rgR8Val[] = {0.0, 42.42, 107.66};
+
+CY rgCyVal[] = {CY_(0,0), CY_(0,2), CY_(42,43), CY_(107,66), CY_(5000,0)};
+
+DATE rgDateVal[] = {0.0, 42.42, 107.66};
+
+OLECHAR FAR* rgBstrVal[] = {
+ OLESTR("a binary string")
+ , OLESTR("42")
+ , OLESTR("42000")
+ , OLESTR("92233800000")
+ , OLESTR("42.42")
+ , OLESTR("#TRUE#")
+ , OLESTR("#FALSE#")
+ , OLESTR("1/7/66")
+ , OLESTR("1:20 pm")
+};
+
+
+SCODE rgErrorVal[] = {S_OK, DISP_E_TYPEMISMATCH};
+
+VARIANT_BOOL rgBoolVal[] = {0, -1};
+
+struct VARIANT_TEST_INFO{
+ VARTYPE vtFrom;
+ int nValues;
+ void FAR* rgValues;
+};
+
+HRESULT VariantOB1469(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOB2078(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOB2834(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOB3028(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOB3336(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOB3354(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOB3603(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOB3875(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOB3876(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog10(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog11(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog12(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog27(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog50(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog82(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog84(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog94(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog235(VARIANT_TEST_INFO FAR*);
+HRESULT VariantOleprog351(VARIANT_TEST_INFO FAR*);
+HRESULT VariantBug0(VARIANT_TEST_INFO FAR*);
+HRESULT VariantBug1(VARIANT_TEST_INFO FAR*);
+HRESULT OverflowTests(VARIANT_TEST_INFO FAR*);
+HRESULT DefVariantTest(VARIANT_TEST_INFO FAR*);
+
+
+struct TEST {
+ HRESULT (*pfnTest)(VARIANT_TEST_INFO FAR*);
+ OLECHAR FAR* szName;
+ struct VARIANT_TEST_INFO vti;
+};
+
+static TEST rgtest[] =
+{
+ { VariantBug1, OLESTR("bug#1"), {0, 0, NULL}}
+
+ , { VariantOleprog10, OLESTR("raid!oleprog#10"), {0, 0, NULL}}
+ , { VariantOleprog11, OLESTR("raid!oleprog#11"), {0, 0, NULL}}
+ , { VariantOleprog12, OLESTR("raid!oleprog#12"), {0, 0, NULL}}
+ , { VariantOleprog27, OLESTR("raid!oleprog#27"), {0, 0, NULL}}
+ , { VariantOleprog50, OLESTR("raid!oleprog#50"), {0, 0, NULL}}
+ , { VariantOleprog82, OLESTR("raid!oleprog#82"), {0, 0, NULL}}
+ , { VariantOleprog84, OLESTR("raid!oleprog#84"), {0, 0, NULL}}
+ , { VariantOleprog94, OLESTR("raid!oleprog#94"), {0, 0, NULL}}
+ , { VariantOleprog235,OLESTR("raid!oleprog#235"),{0, 0, NULL}}
+ , { VariantOleprog351,OLESTR("raid!oleprog#351"),{0, 0, NULL}}
+
+ , { VariantOB1469, OLESTR("raid!ob#1469"), {0,0,NULL}}
+// , { VariantOB2078, OLESTR("raid!ob#2078"), {0,0,NULL}}
+ , { VariantOB2834, OLESTR("raid!ob#2834"), {0,0,NULL}}
+// , { VariantOB3028 OLESTR("raid!ob#3028"), {0,0,NULL}}
+ , { VariantOB3336, OLESTR("raid!ob#3336"), {0,0,NULL}}
+ , { VariantOB3354, OLESTR("raid!ob#3354"), {0,0,NULL}}
+ , { VariantOB3603, OLESTR("raid!ob#3603"), {0,0,NULL}}
+// , { VariantOB3875, OLESTR("raid!ob#3875"), {0,0,NULL}}
+ , { VariantOB3876, OLESTR("raid!ob#3876"), {0,0,NULL}}
+
+ , { VariantBug0, OLESTR("bug#0"), {0, 0, NULL}}
+
+ , { DefVariantTest, OLESTR("VT_EMPTY To *"),
+ {VT_EMPTY, DIM(rgEmptyVal),rgEmptyVal}}
+
+ , { DefVariantTest, OLESTR("VT_NULL To *"),
+ {VT_NULL, DIM(rgNullVal), rgNullVal}}
+
+#if VBA2
+ , { DefVariantTest, OLESTR("VT_UI1 To *"),
+ {VT_UI1, DIM(rgUI1Val), rgUI1Val}}
+#endif //VBA2
+
+ , { DefVariantTest, OLESTR("VT_I2 To *"),
+ {VT_I2, DIM(rgI2Val), rgI2Val}}
+
+ , { DefVariantTest, OLESTR("VT_I4 To *"),
+ {VT_I4, DIM(rgI4Val), rgI4Val}}
+
+ , { DefVariantTest, OLESTR("VT_R4 To *"),
+ {VT_R4, DIM(rgR4Val), rgR4Val}}
+
+ , { DefVariantTest, OLESTR("VT_R8 To *"),
+ {VT_R8, DIM(rgR8Val), rgR8Val}}
+
+ , { DefVariantTest, OLESTR("VT_CY To *"),
+ {VT_CY, DIM(rgCyVal), rgCyVal}}
+
+ , { DefVariantTest, OLESTR("VT_DATE To *"),
+ {VT_DATE, DIM(rgDateVal), rgDateVal}}
+
+ , { DefVariantTest, OLESTR("VT_BSTR To *"),
+ {VT_BSTR, DIM(rgBstrVal), rgBstrVal}}
+
+ , { DefVariantTest, OLESTR("VT_DISPATCH To *"),
+ {VT_DISPATCH, 1, NULL}}
+
+ , { DefVariantTest, OLESTR("VT_ERROR To *"),
+ {VT_ERROR, DIM(rgErrorVal),rgErrorVal}}
+
+ , { DefVariantTest, OLESTR("VT_BOOL To *"),
+ {VT_BOOL, DIM(rgBoolVal), rgBoolVal}}
+
+ , { DefVariantTest, OLESTR("VT_UNKNOWN To *"),
+ {VT_UNKNOWN, 1, NULL}}
+
+#if VBA2
+ , { DefVariantTest, OLESTR("VT_UI1Ref To *"),
+ {VT_BYREF | VT_UI1, DIM(rgUI1Val), rgUI1Val}}
+#endif //VBA2
+
+ , { DefVariantTest, OLESTR("VT_I2Ref To *"),
+ {VT_BYREF | VT_I2, DIM(rgI2Val), rgI2Val}}
+
+ , { DefVariantTest, OLESTR("VT_I4Ref To *"),
+ {VT_BYREF | VT_I4, DIM(rgI4Val), rgI4Val}}
+
+ , { DefVariantTest, OLESTR("VT_R4Ref To *"),
+ {VT_BYREF | VT_R4, DIM(rgR4Val), rgR4Val}}
+
+ , { DefVariantTest, OLESTR("VT_R8Ref To *"),
+ {VT_BYREF | VT_R8, DIM(rgR8Val), rgR8Val}}
+
+ , { DefVariantTest, OLESTR("VT_CYRef To *"),
+ {VT_BYREF | VT_CY, DIM(rgCyVal), rgCyVal}}
+
+ , { DefVariantTest, OLESTR("VT_DATERef To *"),
+ {VT_BYREF | VT_DATE, DIM(rgDateVal), rgDateVal}}
+
+ , { DefVariantTest, OLESTR("VT_BSTRRef To *"),
+ {VT_BYREF | VT_BSTR, DIM(rgBstrVal), rgBstrVal}}
+
+ , { DefVariantTest, OLESTR("VT_DISPATCHRef To *"),
+ {VT_BYREF | VT_DISPATCH, 1, NULL}}
+
+ , { DefVariantTest, OLESTR("VT_ERRORRef To *"),
+ {VT_BYREF | VT_ERROR, DIM(rgErrorVal), rgErrorVal}}
+
+ , { DefVariantTest, OLESTR("VT_BOOLRef To *"),
+ {VT_BYREF | VT_BOOL, DIM(rgBoolVal), rgBoolVal}}
+
+#if 0 /* REVIEW: need a bit more work for this test */
+ , { DefVariantTest, OLESTR("VT_VARIANTRef To *"),
+ {VT_BYREF | VT_VARIANT, 1, NULL}}
+#endif
+
+ , { DefVariantTest, OLESTR("VT_UNKNOWNRef To *"),
+ {VT_BYREF | VT_UNKNOWN, 1, NULL}}
+};
+
+SUITE_CONSTRUCTION_IMPL(CVariantSuite)
+
+SUITE_IUNKNOWN_IMPL(CVariantSuite)
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+
+/***
+*HRESULT CVariantSuite::GetNameOfSuite(BSTR*)
+*Purpose:
+* Return the name of this test suite.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pbstr = BSTR containing the name of the suite
+*
+***********************************************************************/
+STDMETHODIMP
+CVariantSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("Variant API"), pbstr);
+}
+
+STDMETHODIMP
+CVariantSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc(OLESTR("varapi.log"), pbstr);
+}
+
+/***
+*HRESULT CVariantSuite::GetTestCount(unsigned int*)
+*Purpose:
+* Return a count of the number of tests in this suite.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *pcTests = The count of tests
+*
+***********************************************************************/
+STDMETHODIMP
+CVariantSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+ return NOERROR;
+}
+
+/***
+*HRESULT CVariant::GetNameOfTest(unsigned int, BSTR*)
+*Purpose:
+* Return the name of the test associated with the given test index.
+*
+*Entry:
+* iTest = index of the test whose name is requested
+*
+*Exit:
+* return value = HRESULT
+* S_OK, E_INVALIDARG
+*
+* *pbstr = BSTR containing the name of the test
+*
+***********************************************************************/
+STDMETHODIMP
+CVariantSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return ErrBstrAlloc(rgtest[iTest].szName, pbstr);
+}
+
+/***
+*HRESULT CVariantSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single SafeArray test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CVariantSuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG); // out-of-bounds really
+
+ return rgtest[iTest].pfnTest(&rgtest[iTest].vti);
+}
+
+HRESULT
+VariantFromVariantTestInfo(
+ VARIANT_TEST_INFO FAR* pvti,
+ int ix,
+ VARIANTARG FAR* pvarg,
+ VARIANT FAR* pvarRefMem)
+{
+ VARTYPE vt;
+ HRESULT hresult;
+
+ V_VT(pvarg) = vt = pvti->vtFrom;
+
+ switch(vt & ~VT_BYREF){
+ case VT_NULL:
+ case VT_EMPTY:
+ break;
+
+#if VBA2
+ case VT_UI1:
+ V_UI1(pvarg) = ((unsigned char FAR*)pvti->rgValues)[ix];
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ case VT_BOOL:
+ V_I2(pvarg) = ((short FAR*)pvti->rgValues)[ix];
+ break;
+
+ case VT_I4:
+ case VT_ERROR:
+ V_I4(pvarg) = ((long FAR*)pvti->rgValues)[ix];
+ break;
+
+ case VT_R4:
+ V_R4(pvarg) = ((float FAR*)pvti->rgValues)[ix];
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ V_R8(pvarg) = ((double FAR*)pvti->rgValues)[ix];
+ break;
+
+ case VT_CY:
+ V_CY(pvarg) = ((CY FAR*)pvti->rgValues)[ix];
+ break;
+
+ case VT_BSTR:
+ V_BSTR(pvarg) = SysAllocString(((OLECHAR FAR* FAR*)pvti->rgValues)[ix]);
+ ASSERT(V_BSTR(pvarg) != NULL);
+ break;
+
+ case VT_DISPATCH:
+ hresult = CDisp::Create(&V_DISPATCH(pvarg));
+ ASSERT(hresult == NOERROR);
+ break;
+
+ case VT_UNKNOWN:
+ hresult = CUnk::Create(&V_UNKNOWN(pvarg));
+ ASSERT(hresult == NOERROR);
+ break;
+
+ default:
+ ASSERT(UNREACHED);
+ }
+
+ if(vt & VT_BYREF){
+ MEMCPY(pvarRefMem, pvarg, sizeof(VARIANTARG));
+ V_BYREF(pvarg) = &V_NONE(pvarRefMem);
+ }
+
+ return NOERROR;
+}
+
+HRESULT
+doCoerce(VARIANTARG FAR* pvargFrom, VARTYPE vtTo)
+{
+ VARIANTARG vargTo;
+ HRESULT hresult, hrTmp;
+
+ VariantInit(&vargTo);
+
+ DbPrVarg(pvargFrom);
+ DbPrintf(" to ");
+
+ hresult = VariantChangeType(&vargTo, pvargFrom, 0, vtTo);
+
+ if(!HRESULT_FAILED(hresult)){
+ DbPrVarg(&vargTo);
+ }else{
+ DbPrVt(vtTo);
+#if HC_MPW
+ DbPrintf(" => [%s]", DbSzOfScode(GetScode(hresult)));
+#else
+ DbPrintf(" => [%Fs]", DbSzOfScode(GetScode(hresult)));
+#endif
+ }
+ DbPrintf("\n");
+
+ hrTmp = VariantClear(&vargTo);
+ ASSERT(hrTmp == NOERROR);
+
+ return hresult;
+}
+
+/***
+*HRESULT coerce(VARIANTARG*)
+*Purpose:
+* Attempt to coerce the given VARIANTARG to each of the integral types.
+*
+*Entry:
+* pvargFrom = the VARIANTARG to coerce 'from'
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+coerce(VARIANTARG FAR* pvargFrom)
+{
+ IFFAILRET(doCoerce(pvargFrom, VT_EMPTY));
+ IFFAILRET(doCoerce(pvargFrom, VT_NULL));
+#if VBA2
+ IFFAILRET(doCoerce(pvargFrom, VT_UI1));
+#endif //VBA2
+ IFFAILRET(doCoerce(pvargFrom, VT_I2));
+ IFFAILRET(doCoerce(pvargFrom, VT_I4));
+ IFFAILRET(doCoerce(pvargFrom, VT_R4));
+ IFFAILRET(doCoerce(pvargFrom, VT_R8));
+ IFFAILRET(doCoerce(pvargFrom, VT_CY));
+ IFFAILRET(doCoerce(pvargFrom, VT_DATE));
+ IFFAILRET(doCoerce(pvargFrom, VT_BSTR));
+ IFFAILRET(doCoerce(pvargFrom, VT_DISPATCH));
+ IFFAILRET(doCoerce(pvargFrom, VT_ERROR));
+ IFFAILRET(doCoerce(pvargFrom, VT_BOOL));
+ IFFAILRET(doCoerce(pvargFrom, VT_UNKNOWN));
+
+ return NOERROR;
+}
+
+HRESULT
+DefVariantTest(VARIANT_TEST_INFO FAR* pvti)
+{
+ int i;
+ VARIANTARG vargFrom;
+ VARIANTARG vargRefMem;
+
+
+ for(i = 0; i < pvti->nValues; ++i){
+ VariantInit(&vargFrom);
+
+ IfFailRet(VariantFromVariantTestInfo(pvti, i, &vargFrom, &vargRefMem));
+
+ IfFailRet(coerce(&vargFrom));
+
+ VariantClearAll(&vargFrom);
+ }
+
+ return NOERROR;
+}
+
+
+#define CYFACTOR 10000
+
+// NOTE: we define our own max/min values here, because these differ
+// slightly than those supplied by limits.h for some compilers we use.
+// specifically: C8 (and predecessors) define min short to be -32767,
+// while we allow it to be one lower, -32768.
+
+#if VBA2
+#define MAX_UI1 0xFF
+#define MIN_UI1 0x00
+#endif //VBA2
+
+#define MAX_I2 0x7FFF
+#define MIN_I2 0x8000
+
+#define MAX_I4 0x7FFFFFFF
+#define MIN_I4 0x80000000
+
+#define MAX_R4 3.402823466e+38
+#define MIN_R4 (-3.402823466e+38)
+
+#if VBA2
+unsigned char g_bMax = MAX_UI1;
+unsigned char g_bMin = MIN_UI1;
+#endif //VBA2
+
+short g_sMax = MAX_I2;
+short g_sMin = MIN_I2;
+
+long g_lMax = MAX_I4;
+long g_lMin = MIN_I4;
+
+CY g_cyMax = CY_(0x7FFFFFFF, 0xFFFFFFFF);
+CY g_cyMin = CY_(0x80000000, 0x00000000);
+
+float g_fltMax = (float) MAX_R4;
+float g_fltMin = (float) MIN_R4;
+
+void KillOpt(){}
+
+void
+IncVar(VARIANT FAR* pvar)
+{
+ unsigned long ul;
+ float fltOrg, fltInc;
+ double dblOrg, dblInc;
+
+#if HC_MPW
+ float FAR* pfltTmp;
+ double FAR* pdblTmp;
+#else
+ volatile float FAR* pfltTmp;
+ volatile double FAR* pdblTmp;
+#endif
+
+ pfltTmp = &V_R4(pvar);
+ pdblTmp = &V_R8(pvar);
+
+ switch(V_VT(pvar)){
+#if VBA2
+ case VT_UI1:
+ ++V_UI1(pvar);
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ ++V_I2(pvar);
+ break;
+
+ case VT_I4:
+ ++V_I4(pvar);
+ break;
+
+ case VT_R4:
+ fltInc = (float)1.0;
+ fltOrg = *pfltTmp;
+ while(1){
+ *pfltTmp = *pfltTmp + fltInc;
+ KillOpt();
+ if(*pfltTmp != fltOrg)
+ break;
+ fltInc *= (float)2.0;
+ }
+ break;
+
+ case VT_R8:
+ dblInc = 1.0;
+ dblOrg = *pdblTmp;
+ while(1){
+ *pdblTmp = *pdblTmp + dblInc;
+ KillOpt();
+ if(*pdblTmp != dblOrg)
+ break;
+ dblInc *= 2.0;
+ }
+ break;
+
+ case VT_CY:
+ ul = V_CY(pvar).Lo;
+ if((V_CY(pvar).Lo += CYFACTOR) <= ul){
+ ++V_CY(pvar).Hi;
+ }
+ break;
+ }
+}
+
+void
+DecVar(VARIANT FAR* pvar)
+{
+ unsigned long ul;
+ float fltInc, fltOrg;
+ double dblInc, dblOrg;
+
+#if HC_MPW
+ float FAR* pfltTmp;
+ double FAR* pdblTmp;
+#else
+ volatile float FAR* pfltTmp;
+ volatile double FAR* pdblTmp;
+#endif
+
+ pfltTmp = &V_R4(pvar);
+ pdblTmp = &V_R8(pvar);
+
+ switch(V_VT(pvar)){
+#if VBA2
+ case VT_UI1:
+ --V_UI1(pvar);
+ break;
+#endif //VBA2
+ case VT_I2:
+ --V_I2(pvar);
+ break;
+
+ case VT_I4:
+ --V_I4(pvar);
+ break;
+
+ case VT_R4:
+ fltOrg = *pfltTmp;
+ fltInc = (float)1.0;
+ while(1){
+ *pfltTmp = *pfltTmp - fltInc;
+ KillOpt();
+ if(*pfltTmp != fltOrg)
+ break;
+ fltInc *= (float)2.0;
+ }
+ break;
+
+ case VT_R8:
+ dblOrg = *pdblTmp;
+ dblInc = 1.0;
+ while(1){
+ *pdblTmp = *pdblTmp - dblInc;
+ KillOpt();
+ if(*pdblTmp != dblOrg)
+ break;
+ dblInc *= 2.0;
+ }
+ break;
+
+ case VT_CY:
+ ul = V_CY(pvar).Lo;
+ if((V_CY(pvar).Lo -= CYFACTOR) >= ul){
+ --V_CY(pvar).Hi;
+ }
+ break;
+ }
+}
+
+HRESULT
+doOverflow(VARTYPE vt, VARIANT varMax, VARIANT varMin)
+{
+ int i;
+ HRESULT hr;
+ VARIANT var;
+ VARTYPE vtFrom;
+
+#define BACKOFF_ITERATIONS 3
+
+ vtFrom = V_VT(&varMax);
+ ASSERT(vtFrom == V_VT(&varMin));
+
+
+ VariantInit(&var);
+ IfFailRet(VariantChangeType(&var, &varMax, 0, vt));
+
+ // back off the max value,
+ for(i = 0; i < BACKOFF_ITERATIONS; ++i)
+ DecVar(&var);
+
+ for(i = 0; i <= BACKOFF_ITERATIONS*3; ++i){
+ hr = doCoerce(&var, vtFrom);
+ if(hr != NOERROR){
+ if(GetScode(hr) == DISP_E_OVERFLOW)
+ goto LDoneWithMax;
+ return hr;
+ }
+ IncVar(&var);
+ }
+ return RESULT(E_FAIL); // failed to detect overflow
+
+LDoneWithMax:;
+
+ VariantInit(&var);
+ IfFailRet(VariantChangeType(&var, &varMin, 0, vt));
+
+ // back off the min value
+ for(i = 0; i < BACKOFF_ITERATIONS; ++i)
+ IncVar(&var);
+
+ for(i = 0; i <= BACKOFF_ITERATIONS*3; ++i){
+ hr = doCoerce(&var, vtFrom);
+ if(hr != NOERROR){
+ if(GetScode(hr) == DISP_E_OVERFLOW)
+ goto LDoneWithMin;
+ return hr;
+ }
+ DecVar(&var);
+ }
+ return RESULT(E_FAIL); // failed to detect overflow
+
+LDoneWithMin:;
+
+ return NOERROR;
+}
+
+/***
+*PRIVATE HRESULT OverflowTests
+*Purpose:
+* Test various coersions to make sure they properly catch overflows.
+*
+* The heirarchy of ranges for each datatype is as follows,
+*
+* ui1 < i2 < i4 < cy < r4 < r8
+*
+* which means that we need to check the following coersions for overflow,
+*
+* i2->ui1
+* i4->ui1, i4->i2
+* cy->ui1, cy->i2, cy->i4
+* r4->ui1, r4->i2, r4->i4, r4->cy
+* r8->ui1, r8->i2, r8->i4, r8->cy, r8->r4
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+OverflowTests(VARIANT_TEST_INFO FAR* dummy)
+{
+#if VBA2
+ VARIANT varUI1Max, varUI1Min;
+#endif //VBA2
+ VARIANT varI2Max, varI2Min;
+ VARIANT varI4Max, varI4Min;
+ VARIANT varCyMax, varCyMin;
+ VARIANT varR4Max, varR4Min;
+
+ UNUSED(dummy);
+
+#if VBA2
+ V_VT(&varUI1Max) = VT_UI1; V_UI1(&varUI1Max) = g_bMax;
+ V_VT(&varUI1Min) = VT_UI1; V_UI1(&varUI1Min) = g_bMin;
+#endif //VBA2
+
+ V_VT(&varI2Max) = VT_I2; V_I2(&varI2Max) = g_sMax;
+ V_VT(&varI2Min) = VT_I2; V_I2(&varI2Min) = g_sMin;
+
+ V_VT(&varI4Max) = VT_I4; V_I4(&varI4Max) = g_lMax;
+ V_VT(&varI4Min) = VT_I4; V_I4(&varI4Min) = g_lMin;
+
+ V_VT(&varCyMax) = VT_CY; V_CY(&varCyMax) = g_cyMax;
+ V_VT(&varCyMin) = VT_CY; V_CY(&varCyMin) = g_cyMin;
+
+ V_VT(&varR4Max) = VT_R4; V_R4(&varR4Max) = g_fltMax;
+ V_VT(&varR4Min) = VT_R4; V_R4(&varR4Min) = g_fltMin;
+
+#if VBA2
+ IfFailRet(doOverflow(VT_I2, varUI1Max, varUI1Min));
+#endif //VBA2
+
+#if VBA2
+ IfFailRet(doOverflow(VT_I4, varUI1Max, varUI1Min));
+#endif //VBA2
+ IfFailRet(doOverflow(VT_I4, varI2Max, varI2Min));
+
+#if VBA2
+ IfFailRet(doOverflow(VT_CY, varUI1Max, varUI1Min));
+#endif //VBA2
+ IfFailRet(doOverflow(VT_CY, varI2Max, varI2Min));
+ IfFailRet(doOverflow(VT_CY, varI4Max, varI4Min));
+
+#if VBA2
+ IfFailRet(doOverflow(VT_R4, varUI1Max, varUI1Min));
+#endif //VBA2
+ IfFailRet(doOverflow(VT_R4, varI2Max, varI2Min));
+ IfFailRet(doOverflow(VT_R4, varI4Max, varI4Min));
+ IfFailRet(doOverflow(VT_R4, varCyMax, varCyMin));
+
+#if VBA2
+ IfFailRet(doOverflow(VT_R8, varUI1Max, varUI1Min));
+#endif //VBA2
+ IfFailRet(doOverflow(VT_R8, varI2Max, varI2Min));
+ IfFailRet(doOverflow(VT_R8, varI4Max, varI4Min));
+ IfFailRet(doOverflow(VT_R8, varCyMax, varCyMin));
+ IfFailRet(doOverflow(VT_R8, varR4Max, varR4Min));
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// regression tests
+//---------------------------------------------------------------------
+
+
+// regression test for raid:oob#1469
+//
+// problem: Currency literal parsed wrong (BSTR -> CY)
+//
+HRESULT
+VariantOB1469(VARIANT_TEST_INFO FAR* dummy)
+{
+ int i;
+ VARIANT var;
+ HRESULT hresult;
+static OLECHAR FAR* str[] = {
+ OLESTR("92233700000"),
+ OLESTR("92233800000"),
+};
+
+ UNUSED(dummy);
+
+ for(i = 0; i < DIM(str); ++i){
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(str[i]);
+ if(V_BSTR(&var) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ IfFailGo(VariantChangeType(&var, &var, 0, VT_CY), LError0);
+ VariantClear(&var);
+ }
+
+ return NOERROR;
+
+LError0:;
+ VariantClear(&var);
+
+ return hresult;
+}
+
+
+
+// regression for raid:ob#2078
+//
+// problem: double output off by 1 in last digit
+//
+HRESULT
+VariantOB2078(VARIANT_TEST_INFO FAR* dummy)
+{
+ LCID lcid;
+ HRESULT hresult;
+ BSTR bstr1, bstr2;
+ double r1 = -1.797693134862315E+308,
+ r2 = 1.797693134862315E+308;
+
+ UNUSED(dummy);
+
+ bstr1 = bstr2 = NULL;
+
+ lcid = GetUserDefaultLCID();
+
+ IfFailGo(VarBstrFromR8(r1, lcid, NULL, &bstr1), LError0);
+ IfFailGo(VarBstrFromR8(r2, lcid, NULL, &bstr2), LError0);
+
+ if (STRCMP(STRING(bstr1), TSTR("-1.797693134862312E+308")) != 0){
+ hresult = RESULT(E_FAIL);
+ goto LError0;
+ }
+
+ if (STRCMP(STRING(bstr2), TSTR("1.797693134862312E+308")) != 0){
+ hresult = RESULT(E_FAIL);
+ goto LError0;
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+ SysFreeString(bstr1);
+ SysFreeString(bstr2);
+ return hresult;
+}
+
+
+
+// regression for raid:ob#2834
+//
+// problem: not accepting YMD without year (accepted by VB3)
+//
+HRESULT
+VariantOB2834(VARIANT_TEST_INFO FAR* dummy)
+{
+ DATE date;
+ BSTR bstr;
+ HRESULT hresult;
+
+ UNUSED(dummy);
+
+ IfFailRet(VarDateFromStr(OLESTR("8:07 AM"),
+ GetUserDefaultLCID(), 0,
+ &date));
+
+ bstr = NULL;
+
+ hresult = VarBstrFromDate(date, GetUserDefaultLCID(), 0, &bstr);
+
+ SysFreeString(bstr);
+
+ return hresult;
+}
+
+
+// regression for raid:ob#3028
+//
+// problem: Leading 0 is being ignored for the system (&prj) locale
+//
+HRESULT
+VariantOB3028(VARIANT_TEST_INFO FAR* dummy)
+{
+ CY cy;
+ LCID lcid;
+ char szBuff[2];
+ BSTR bstr1, bstr2;
+ HRESULT hresult;
+
+ UNUSED(dummy);
+
+ bstr1 = bstr2 = NULL;
+
+ lcid = GetUserDefaultLCID();
+
+ IfFailGo(VarBstrFromR8(0.739, lcid, NULL, &bstr1), LError0);
+ DbPrintf("VarBstrFromR8(0.739) = \"%Fs\"\n", STRING(bstr1));
+
+ IfFailGo(VarCyFromR8(0.739, &cy), LError0);
+ IfFailGo(VarBstrFromCy(cy, lcid, NULL, &bstr2), LError0);
+ DbPrintf("VarBstrFromCy(0.739) = \"%Fs\"\n", STRING(bstr2));
+
+ GetLocaleInfoA(lcid, LOCALE_ILZERO, szBuff, SIZEOFCH(szBuff));
+ if (szBuff[0] == '0') {
+ if (STRCMP(STRING(bstr1), TSTR(".739")) != 0 ||
+ STRCMP(STRING(bstr2), TSTR(".739")) != 0){
+ hresult = RESULT(E_FAIL);
+ goto LError0;
+ }
+ } else {
+ if (STRCMP(STRING(bstr1), TSTR("0.739")) != 0 ||
+ STRCMP(STRING(bstr2), TSTR("0.739")) != 0){
+ hresult = RESULT(E_FAIL);
+ goto LError0;
+ }
+ }
+
+ hresult = NOERROR;
+
+LError0:;
+ SysFreeString(bstr1);
+ SysFreeString(bstr2);
+ return hresult;
+}
+
+
+// regression for raid:ob#3336
+//
+// problem: Conversion routines does not remove thousands separators
+// when coersing from STR to either R8 or CY.
+//
+HRESULT
+VariantOB3336(VARIANT_TEST_INFO FAR* dummy)
+{
+ int i;
+ VARIANT var;
+ HRESULT hresult;
+ static OLECHAR FAR* str[] = {
+ OLESTR("12,456.78"),
+ OLESTR("1,2,3,4,5,6,,789.123"),
+ OLESTR(",1234,5678,9"),
+ OLESTR("123,456,789.124")
+};
+
+ UNUSED(dummy);
+
+ for(i = 0; i < DIM(str); ++i){
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(str[i]);
+ if(V_BSTR(&var) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ IfFailGo(VariantChangeType(&var, &var, 0, VT_CY), LError0);
+ IfFailGo(VariantChangeType(&var, &var, 0, VT_R8), LError0);
+ VariantClear(&var);
+ }
+
+ return NOERROR;
+
+LError0:;
+ VariantClear(&var);
+
+ return hresult;
+}
+
+// regression for raid:ob#3354
+//
+// problem: Coersion to Date doesn't validate input value.
+//
+HRESULT
+VariantOB3354(VARIANT_TEST_INFO FAR* dummy)
+{
+ DATE date;
+
+ UNUSED(dummy);
+ if (VarDateFromR8(3000, &date) != NOERROR) return RESULT(E_FAIL);
+ if (VarDateFromR8(30000000, &date) == NOERROR) return RESULT(E_FAIL);
+ return NOERROR;
+}
+
+
+// regression for raid:ob#3603
+//
+// problem: VarCyFromStr is hammering the input string (it is removing
+// the negative sign in the following example in place).
+//
+HRESULT
+VariantOB3603(VARIANT_TEST_INFO FAR* dummy)
+{
+ CY cy;
+ TCHAR strIn[32];
+ HRESULT hresult;
+
+ UNUSED(dummy);
+ STRCPY(strIn, TSTR("-1.0000000001"));
+ DbPrintf("strIn = \"%Fs\"\n", (char FAR*) strIn);
+ DbPrintf("strIn = \"%Fs\"\n", (char FAR*) strIn);
+ hresult = VarCyFromStr(WIDESTRING(strIn), 0, 0, &cy);
+ DbPrintf("VarCyFromStr(strIn, 0, 0, &cy) = %Fs\n",
+ DbSzOfScode(GetScode(hresult)));
+ DbPrintf("strIn = \"%Fs\"\n", (char FAR*) strIn);
+ return NOERROR;
+}
+
+
+// regression for raid:ob#3875
+//
+// problem: not accepting YMD without year (accepted by VB3)
+//
+HRESULT
+VariantOB3875(VARIANT_TEST_INFO FAR* dummy)
+{
+ DATE date;
+
+ UNUSED(dummy);
+ IfFailRet(VarDateFromStr(OLESTR("93/4/30"),
+ GetUserDefaultLCID(), 0,
+ &date));
+ IfFailRet(VarDateFromStr(OLESTR("4/30"),
+ GetUserDefaultLCID(), 0,
+ &date));
+ return NOERROR;
+}
+
+
+
+// regression for raid:ob#3876
+//
+// problem: medium month with period (dec.) not recognized in date string
+//
+HRESULT
+VariantOB3876(VARIANT_TEST_INFO FAR* dummy)
+{
+ DATE date;
+
+ UNUSED(dummy);
+ IfFailRet(VarDateFromStr(OLESTR("12 dec 05 1:23 pm"),
+ GetUserDefaultLCID(), 0,
+ &date));
+ IfFailRet(VarDateFromStr(OLESTR("12 dec. 05 1:23 pm"),
+ GetUserDefaultLCID(), 0,
+ &date));
+ return NOERROR;
+}
+
+
+// regression test for raid:oleprog#10
+//
+// problem: overflow not detected on coersion from VT_R8 to VT_R4.
+//
+HRESULT
+VariantOleprog10(VARIANT_TEST_INFO FAR* dummy)
+{
+ SCODE scode;
+ HRESULT hresult;
+ VARIANT varFrom, varTo;
+
+ UNUSED(dummy);
+
+ VariantInit(&varTo);
+
+ V_VT(&varFrom) = VT_R8;
+ V_R8(&varFrom) = DBL_MAX;
+
+ hresult = VariantChangeType(&varTo, &varFrom, 0, VT_R4);
+
+ scode = GetScode(hresult);
+
+ if(scode != DISP_E_OVERFLOW)
+ return RESULT(E_UNEXPECTED);
+
+ return NOERROR;
+}
+
+
+// regression test for raid:oleprog#11
+//
+// problem: failed in place coersion of a variant destroys the
+// contents of the variant.
+//
+HRESULT
+VariantOleprog11(VARIANT_TEST_INFO FAR* dummy)
+{
+ SCODE scode;
+ VARIANT var;
+ HRESULT hresult;
+
+ UNUSED(dummy);
+
+ V_VT(&var) = VT_R8;
+ V_R8(&var) = DBL_MAX;
+ hresult = VariantChangeType(&var, &var, 0, VT_R4);
+ scode = GetScode(hresult);
+
+ // make sure the overflow was caught correctly.
+ if(scode != DISP_E_OVERFLOW)
+ return RESULT(E_UNEXPECTED);
+
+ // if the coersion failed, the contents should not be destroyed
+ //
+ if(V_VT(&var) != VT_R8 || V_R8(&var) != DBL_MAX)
+ return RESULT(E_UNEXPECTED);
+
+ return NOERROR;
+}
+
+
+// regression test for raid:oleprog#12
+//
+// problem: coersion of variants in place do not free strings.
+//
+HRESULT
+VariantOleprog12(VARIANT_TEST_INFO FAR* dummy)
+{
+ int i;
+ VARIANT var;
+ HRESULT hresult;
+
+#if VBA2
+static VARTYPE rgvt[] = {VT_UI1, VT_I2, VT_I4, VT_R4, VT_R8, VT_CY};
+#else //VBA2
+static VARTYPE rgvt[] = {VT_I2, VT_I4, VT_R4, VT_R8, VT_CY};
+#endif //VBA2
+
+
+ UNUSED(dummy);
+
+ for(i = 0; i < DIM(rgvt); ++i){
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(OLESTR("14"));
+ if(V_BSTR(&var) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ IfFailGo(VariantChangeType(&var, &var, 0, rgvt[i]), LError0);
+ VariantClear(&var);
+ }
+
+ return NOERROR;
+
+LError0:;
+ VariantClear(&var);
+
+ return hresult;
+}
+
+
+// retression test for raid:oleprog#27
+//
+// problem: cant VariantCopyInd on a variant containing a ByRef array.
+//
+HRESULT
+VariantOleprog27(VARIANT_TEST_INFO FAR* dummy)
+{
+ VARIANT var, varTo;
+ SAFEARRAY FAR* psa;
+ SARRAYDESC sadesc;
+ HRESULT hresult, hresultTmp;
+
+ UNUSED(dummy);
+
+ sadesc.cDims = 1;
+ sadesc.rgsabound[0].lLbound = 5;
+ sadesc.rgsabound[0].cElements = 5;
+
+ IfFailRet(SafeArrayCreateIdentity(VT_BSTR, &sadesc, &psa));
+
+ V_VT(&var) = (VT_ARRAY|VT_BYREF|VT_BSTR);
+ V_ARRAYREF(&var) = &psa;
+
+ VariantInit(&varTo);
+ IfFailGo(VariantCopyInd(&varTo, &var), LError0);
+ if(V_VT(&varTo) != (VT_ARRAY|VT_BSTR)
+#if 0
+// add this back in when VariantCompare can handle arrays
+ || !VariantCompare(&varTo, &var)
+#endif
+ ){
+ hresult = RESULT(E_UNEXPECTED);
+ goto LError1;
+ }
+
+ hresultTmp = VariantClear(&varTo);
+ ASSERT(hresultTmp == NOERROR);
+
+ // now try the copy in-place
+ //
+ V_VT(&var) |= VT_BYREF;
+ IfFailGo(VariantCopyInd(&var, &var), LError0);
+ if(V_VT(&var) != (VT_ARRAY|VT_BSTR)){
+ hresult = RESULT(E_UNEXPECTED);
+ goto LError0;
+ }
+
+ hresultTmp = VariantClear(&var);
+ ASSERT(hresultTmp == NOERROR);
+
+ hresultTmp = SafeArrayDestroy(psa);
+ ASSERT(hresultTmp == NOERROR);
+
+ return NOERROR;
+
+LError1:;
+ VariantClear(&varTo);
+
+LError0:;
+ VariantClearAll(&var);
+
+ return hresult;
+}
+
+
+// regression test for raid:oleprog#50
+//
+// problem: in place variant coersion from VT_BYREF fail (all types)
+//
+HRESULT
+VariantOleprog50(VARIANT_TEST_INFO FAR* dummy)
+{
+ short i2;
+ VARIANT var;
+
+ UNUSED(dummy);
+
+ i2 = 42;
+ V_I2REF(&var) = &i2;
+ V_VT(&var) = VT_BYREF | VT_I2;
+ return VariantChangeType(&var, &var, 0, VT_I2);
+}
+
+
+// regression test for raid:oleprog#84
+//
+// problem: need to allow literal copying of ByRef variants.
+//
+HRESULT
+VariantOleprog84(VARIANT_TEST_INFO FAR* dummy)
+{
+ short i2;
+ HRESULT hr, hrTmp;
+ VARIANT varSrc, varDst;
+
+ UNUSED(dummy);
+
+ i2 = 42;
+ V_I2REF(&varSrc) = &i2;
+ V_VT(&varSrc) = VT_BYREF | VT_I2;
+ VariantInit(&varDst);
+ hr = VariantCopy(&varDst, &varSrc);
+ hrTmp = VariantClear(&varDst);
+ ASSERT(hrTmp == NOERROR);
+ hrTmp = VariantClear(&varSrc);
+ ASSERT(hrTmp == NOERROR);
+ return hr;
+}
+
+
+// regression for unraided bug
+//
+// problem: VariantCopy/VariantCopyInd incorrectly report OutOfMemory
+// when copying a VT_BSTR that is NULL.
+//
+HRESULT
+VariantBug0(VARIANT_TEST_INFO FAR* dummy)
+{
+ BSTR bstr;
+ VARIANT varFrom, varTo;
+ HRESULT hresult, hresultTmp;
+
+ UNUSED(dummy);
+
+ V_VT(&varFrom) = VT_BSTR;
+ V_BSTR(&varFrom) = NULL;
+
+ VariantInit(&varTo);
+
+ IfFailRet(VariantCopy(&varTo, &varFrom));
+
+ hresultTmp = VariantClear(&varTo);
+ ASSERT(hresultTmp == NOERROR);
+
+ bstr = NULL;
+ V_VT(&varFrom) = VT_BYREF | VT_BSTR;
+ V_BSTRREF(&varFrom) = &bstr;
+
+ hresult = VariantCopyInd(&varTo, &varFrom);
+
+ hresultTmp = VariantClear(&varTo);
+ ASSERT(hresultTmp == NOERROR);
+
+ return hresult;
+}
+
+
+// regression test for raid:oleprog#82
+//
+// problem: variant copy on a VT_BSTR containing an embedded null
+// looses everything after the embedded null.
+//
+HRESULT
+VariantOleprog82(VARIANT_TEST_INFO FAR* dummy)
+{
+ BSTR bstr;
+ HRESULT hresult;
+ VARIANT varFrom, varTo;
+ static OLECHAR sz_embedded_null[] =
+ OLESTR("where is \0 the rest of my string?");
+
+
+ UNUSED(dummy);
+
+ VariantInit(&varTo);
+ VariantInit(&varFrom);
+
+ bstr = SysAllocStringLen(sz_embedded_null, sizeof(sz_embedded_null));
+
+ V_VT(&varFrom) = VT_BSTR;
+ V_BSTR(&varFrom) = bstr;
+
+ VariantInit(&varTo);
+
+ if((hresult = VariantCopy(&varTo, &varFrom)) != NOERROR)
+ goto LError0;
+
+ if(MEMCMP(V_BSTR(&varTo), sz_embedded_null, sizeof(sz_embedded_null)) != 0){
+ hresult = RESULT(E_UNEXPECTED);
+ goto LError1;
+ }
+
+
+ VariantClear(&varTo);
+ VariantClear(&varFrom);
+
+
+ bstr = SysAllocStringLen(sz_embedded_null, sizeof(sz_embedded_null));
+
+ V_VT(&varFrom) = VT_BYREF | VT_BSTR;
+ V_BSTRREF(&varFrom) = &bstr;
+
+ VariantInit(&varTo);
+
+ if((hresult = VariantCopyInd(&varTo, &varFrom)) != NOERROR)
+ goto LError0;
+
+ if(MEMCMP(V_BSTRREF(&varTo), sz_embedded_null, sizeof(sz_embedded_null)) != 0){
+ hresult = RESULT(E_UNEXPECTED);
+ goto LError1;
+ }
+
+ hresult = NOERROR;
+
+LError1:;
+ VariantClear(&varTo);
+
+LError0:;
+ VariantClearAll(&varFrom);
+
+ return hresult;
+}
+
+
+HRESULT
+VariantOleprog94(VARIANT_TEST_INFO FAR* dummy)
+{
+ BSTR bstr;
+ VARIANT var;
+ HRESULT hresult;
+
+ UNUSED(dummy);
+
+ bstr = SysAllocString(OLESTR("hello world"));
+ V_VT(&var) = VT_BYREF | VT_BSTR;
+ V_BSTRREF(&var) = &bstr;
+
+ hresult = doCoerce(&var, VT_BSTR);
+
+ VariantClearAll(&var);
+
+ return hresult;
+}
+
+
+// regression test for raid!oleprog#235
+//
+// Problem: not correctly handling variants of VT_UNKNOWN or VT_DISPATCH
+// that have a null IDispatch or IUnknown ptr.
+//
+HRESULT
+VariantOleprog235(VARIANT_TEST_INFO FAR* dummy)
+{
+ HRESULT hresult;
+ VARIANT varSrc, varDst;
+
+ UNUSED(dummy);
+
+ V_VT(&varSrc) = VT_UNKNOWN;
+ V_UNKNOWN(&varSrc) = NULL;
+ VariantInit(&varDst);
+ IfFailRet(VariantCopy(&varDst, &varSrc));
+ VariantClear(&varDst);
+
+ V_VT(&varSrc) = VT_DISPATCH;
+ V_DISPATCH(&varSrc) = NULL;
+ VariantInit(&varDst);
+ IfFailRet(VariantCopy(&varDst, &varSrc));
+ VariantClear(&varDst);
+
+ // a null object cannot be converted to any fundamental type -
+ // because there is no way for us to extract its value property
+
+ hresult = VariantChangeType(&varDst, &varSrc, 0, VT_I2);
+ if(hresult == NOERROR || GetScode(hresult) != DISP_E_TYPEMISMATCH)
+ return RESULT(E_FAIL);
+
+ VariantClear(&varDst);
+ VariantClear(&varSrc);
+ return NOERROR;
+}
+
+
+// regression test for raid!oleprog#351
+//
+// Problem: not correctly handling coersion of interface variants types
+// of VT_UNKNOWN, VT_DISPATCH, or VT_DISPATCHW
+//
+
+
+class CBar : public IUnknown {
+public:
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+ CBar::CBar(){
+ m_refs = 1;
+ }
+private:
+ unsigned long m_refs;
+};
+STDMETHODIMP
+CBar::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(!IsEqualIID(riid, IID_IUnknown))
+ if(!IsEqualIID(riid, IID_IDispatch))
+ return RESULT(E_NOINTERFACE);
+
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+}
+STDMETHODIMP_(unsigned long)
+CBar::AddRef()
+{
+ return ++m_refs;
+}
+STDMETHODIMP_(unsigned long)
+CBar::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+HRESULT
+VariantOleprog351(VARIANT_TEST_INFO FAR* dummy)
+{
+ HRESULT hresult;
+ VARIANT varSrc, varDst;
+ IUnknown FAR* punk;
+
+ UNUSED(dummy);
+
+ if((punk = (IUnknown FAR*)new FAR CBar()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ VariantInit(&varSrc);
+ VariantInit(&varDst);
+ V_VT(&varSrc) = VT_UNKNOWN;
+ V_UNKNOWN(&varSrc) = punk;
+
+ // Test Non-Interface Coersion
+ VariantClear(&varDst);
+ hresult = VariantChangeType(&varDst, &varSrc, 0, VT_I2);
+ if(!(hresult == NOERROR || GetScode(hresult) == DISP_E_TYPEMISMATCH))
+ return RESULT(E_FAIL);
+
+ // Test IUnknown Coersion
+ VariantClear(&varDst);
+ hresult = VariantChangeType(&varDst, &varSrc, 0, VT_UNKNOWN);
+ if(!(hresult == NOERROR || GetScode(hresult) == DISP_E_TYPEMISMATCH))
+ return RESULT(E_FAIL);
+
+ // Test IDispatch Coersion
+ VariantClear(&varDst);
+ hresult = VariantChangeType(&varDst, &varSrc, 0, VT_DISPATCH);
+ if(!(hresult == NOERROR || GetScode(hresult) == DISP_E_TYPEMISMATCH))
+ return RESULT(E_FAIL);
+
+ VariantClear(&varDst);
+ VariantClear(&varSrc);
+ return NOERROR;
+}
+
+class CFoo : public IUnknown {
+public:
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+ CFoo::CFoo(){
+ m_refs = 0;
+ }
+private:
+ unsigned long m_refs;
+};
+STDMETHODIMP
+CFoo::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ return RESULT(E_NOINTERFACE);
+}
+STDMETHODIMP_(unsigned long)
+CFoo::AddRef()
+{
+ return ++m_refs;
+}
+STDMETHODIMP_(unsigned long)
+CFoo::Release()
+{
+ if(--m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+HRESULT
+VariantBug1(VARIANT_TEST_INFO FAR* dummy)
+{
+ unsigned long refs;
+ VARIANT varDst, var;
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+ UNUSED(dummy);
+
+ if((punk = (IUnknown FAR*)new FAR CFoo()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ punk->AddRef();
+
+ V_VT(&var) = VT_BYREF | VT_DISPATCH;
+ V_UNKNOWNREF(&var) = &punk;
+ VariantInit(&varDst);
+ hresult = VariantCopyInd(&varDst, &var);
+ ASSERT(hresult == NOERROR);
+ ASSERT(V_VT(&varDst) == VT_DISPATCH);
+ refs = punk->Release();
+ ASSERT(refs == 1);
+ refs = V_DISPATCH(&varDst)->Release();
+ ASSERT(refs == 0);
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/tests/disptest/cwbstr.cpp b/private/oleauto/tests/disptest/cwbstr.cpp
new file mode 100644
index 000000000..443ff47a3
--- /dev/null
+++ b/private/oleauto/tests/disptest/cwbstr.cpp
@@ -0,0 +1,320 @@
+/***
+*cbstr.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CBstrSuite test object.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+
+#include <limits.h>
+
+#include "tstsuite.h"
+
+ASSERTDATA
+
+#if OE_WIN32 && 0
+
+struct TEST {
+ HRESULT (*pfnTest)(void);
+ char FAR* szName;
+};
+
+
+HRESULT WBstrOleprog5(void);
+HRESULT WBstrOleprog8(void);
+HRESULT WBstrOleprog65(void);
+HRESULT WBstrOleprog234(void);
+HRESULT WBstrLimits(void);
+HRESULT WBstrConvert(void);
+
+static TEST rgtest[] = {
+ { WBstrOleprog5, "raid!oleprog#5W" }
+ , { WBstrOleprog8, "raid!oleprog#8W" }
+ , { WBstrOleprog65, "raid!oleprog#65W" }
+ , { WBstrOleprog234, "raid!oleprog#234W" }
+ , { WBstrLimits, "WBstr limits" }
+ , { WBstrConvert, "WBstr conversion" }
+};
+
+
+SUITE_CONSTRUCTION_IMPL(CWBstrSuite)
+
+SUITE_IUNKNOWN_IMPL(CWBstrSuite)
+
+
+//---------------------------------------------------------------------
+// ITestSuite Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CWBstrSuite::GetNameOfSuite(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc("WBSTR API", pbstr);
+}
+
+STDMETHODIMP
+CWBstrSuite::GetNameOfLogfile(BSTR FAR* pbstr)
+{
+ return ErrBstrAlloc("wbstrapi.log", pbstr);
+}
+
+STDMETHODIMP
+CWBstrSuite::GetTestCount(unsigned int FAR* pcTests)
+{
+ *pcTests = DIM(rgtest);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CWBstrSuite::GetNameOfTest(unsigned int iTest, BSTR FAR* pbstr)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ *pbstr = SysAllocString(rgtest[iTest].szName);
+ return NOERROR;
+}
+
+
+/***
+*HRESULT CWBstrSuite::DoTest(unsigned int)
+*Purpose:
+* Execute a single CWBstrSuite test.
+*
+*Entry:
+* iTest = the index of the test to execute
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDMETHODIMP
+CWBstrSuite::DoTest(unsigned int iTest)
+{
+ if(iTest >= DIM(rgtest))
+ return RESULT(E_INVALIDARG);
+
+ return rgtest[iTest].pfnTest();
+}
+
+
+
+//---------------------------------------------------------------------
+// WBSTR Test Suites
+//---------------------------------------------------------------------
+
+
+// regression test for raid!oleprog:5
+//
+HRESULT
+WBstrOleprog5()
+{
+ unsigned int len;
+ WBSTR wbstr;
+static WCHAR a_string[] = L"a string";
+static WCHAR another_string[] = L"another (longer) string";
+
+ wbstr = SysAllocStringW(a_string);
+ if(wbstr == NULL)
+ return RESULT(E_OUTOFMEMORY);
+
+ len = SysStringLenW(wbstr);
+ if(len != (unsigned int) lstrlenW(a_string))
+ return RESULT(E_FAIL);
+
+ if(!SysReAllocStringW(&wbstr, another_string))
+ return RESULT(E_OUTOFMEMORY);
+
+ len = SysStringLenW(wbstr);
+ if(len != (unsigned int) lstrlenW(another_string))
+ return RESULT(E_FAIL);
+
+ SysFreeStringW(wbstr);
+
+ return NOERROR;
+}
+
+// regression test for raid!oleprog:8
+//
+HRESULT
+WBstrOleprog8()
+{
+ unsigned int len;
+ HRESULT hresult;
+ WBSTR wbstr1, wbstr2;
+#define LARGE_BSTR_SIZE 128600
+
+ if((wbstr1 = SysAllocStringLenW(NULL, LARGE_BSTR_SIZE)) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ if((wbstr2 = SysAllocStringW(L"hello world")) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError1;
+ }
+
+ if((len = SysStringLenW(wbstr1)) != LARGE_BSTR_SIZE){
+ hresult = RESULT(E_FAIL);
+ goto LError2;
+ }
+
+ hresult = NOERROR;
+
+LError2:;
+ SysFreeStringW(wbstr1);
+
+LError1:;
+ SysFreeStringW(wbstr2);
+
+LError0:;
+ return hresult;
+
+#undef LARGE_BSTR_SIZE
+}
+
+// regression test for raid!oleprog:8
+//
+// SysAllocString of a string containing an embedded '\0' stops
+// copying at the '\0';
+//
+HRESULT
+WBstrOleprog65()
+{
+ WBSTR wbstr;
+ HRESULT hresult;
+static WCHAR sz_embedded_null[] = L"a string \0 with an embedded null";
+
+
+ wbstr = SysAllocStringLenW(sz_embedded_null, sizeof(sz_embedded_null));
+
+ hresult = (MEMCMP(wbstr, sz_embedded_null, sizeof(sz_embedded_null)) == 0)
+ ? NOERROR
+ : RESULT(E_UNEXPECTED);
+
+ SysFreeStringW(wbstr);
+
+ return hresult;
+}
+
+// regression test for raid!oleprog:234
+//
+// make sure we are properly handling Reallocing a bstr thats Null.
+//
+HRESULT
+WBstrOleprog234()
+{
+ unsigned int len;
+ WBSTR wbstr;
+static WCHAR szHooHa[] = L"HooHa";
+
+ wbstr = NULL;
+ if(!SysReAllocStringW(&wbstr, szHooHa))
+ return RESULT(E_OUTOFMEMORY);
+
+ len = SysStringLenW(wbstr);
+ if(len != (unsigned int) lstrlenW(szHooHa))
+ return RESULT(E_FAIL);
+
+ SysFreeStringW(wbstr);
+
+ return NOERROR;
+}
+
+HRESULT
+WBstrLimits()
+{
+ unsigned long u;
+ WBSTR wbstr;
+
+static unsigned long s2M = 2097152;
+static unsigned long INCREMENT = 262144;
+
+ DbPrintf("SysAllocStringLen()\n");
+
+ DbPrintf("linear increasing...\n");
+ for(u = 1; u < s2M; u+=INCREMENT){
+ DbPrintf("%lu\n", u);
+ wbstr = SysAllocStringLenW(NULL, (unsigned int)u);
+ Yield();
+ if(wbstr == NULL)
+ break;
+ SysFreeStringW(wbstr);
+ }
+ DbPrintf("max len = %lu\n", u-1);
+
+ DbPrintf("linear decreasing...\n");
+ for(u = s2M; u > 0; u-=INCREMENT){
+ DbPrintf("%lu\n", u);
+ wbstr = SysAllocStringLenW(NULL, (unsigned int)u);
+ Yield();
+ if(wbstr == NULL)
+ break;
+ SysFreeStringW(wbstr);
+ }
+ DbPrintf("max len = %lu\n", u);
+
+ return NOERROR;
+}
+
+
+HRESULT
+WBstrConvert()
+{
+ static char* rgStrVal[] = {
+ "This is line #1"
+ , "This is another line"
+ };
+
+ static WCHAR* rgWStrVal[] ={
+ L"This is line #1"
+ , L"This is another line"
+ };
+ BSTR bstr;
+ WBSTR wbstr;
+ unsigned long len;
+ unsigned int i;
+
+ DbPrintf("SysStringAtoW test\n");
+ for(i = 0; i < DIM(rgStrVal); i++) {
+ bstr = SysAllocString(rgStrVal[i]);
+ wbstr = SysStringAtoW(bstr, CP_ACP);
+ if (wbstr != NULL) {
+ len = SysStringLenW(wbstr);
+ if((len != (unsigned int) lstrlenW(rgWStrVal[i])) ||
+ (lstrcmpW(wbstr, rgWStrVal[i]) != 0))
+ return RESULT(E_FAIL);
+ SysFreeStringW(wbstr);
+ SysFreeString(bstr);
+ }
+ }
+
+ DbPrintf("SysStringWtoA test\n");
+ for(i = 0; i < DIM(rgWStrVal); i++) {
+ wbstr = SysAllocStringW(rgWStrVal[i]);
+ bstr = SysStringWtoA(wbstr, CP_ACP);
+ if (bstr != NULL) {
+ len = SysStringLen(bstr);
+ if((len != (unsigned int) lstrlen(rgStrVal[i])) ||
+ (lstrcmp(bstr, rgStrVal[i]) != 0))
+ return RESULT(E_FAIL);
+ SysFreeString(bstr);
+ SysFreeStringW(wbstr);
+ }
+ }
+
+ return NOERROR;
+}
+
+#endif
diff --git a/private/oleauto/tests/disptest/disptest.cpp b/private/oleauto/tests/disptest/disptest.cpp
new file mode 100644
index 000000000..f8cd8a163
--- /dev/null
+++ b/private/oleauto/tests/disptest/disptest.cpp
@@ -0,0 +1,316 @@
+/***
+*disptest.c - IDispatch test driver.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module contains the entry point for the IDispatch test app.
+*
+* iid.cpp - allocation of the ITestSuite IID
+* dtmisc.cpp - misc helpers and utilities
+* cbstr.cpp - CBstrSuite
+* cwbstr.cpp - CWBstrSuite (WIN32 Only)
+* ctime.cpp - CTimeSuite
+* cdatecnv.cpp = CDateCoersionSuite
+* cvariant.cpp - CVariantSuite
+* csarray.cpp - CSafeArraySuite
+* cinvval.cpp - CInvokeByValSuite
+* cinvref.cpp - CInvokeByRefSuite
+* cinvmult.cpp - CInvokeMultipleSuite
+* cinvsary.cpp - CInvokeSafeArraySuite
+* cinvex.cpp - CInvokeExcepinfoSuite
+* ccollect.cpp - CCollectionSuite
+* cearly.cpp - CEarlySuite
+*
+* REVIEW: tests still needed for the following,
+* heterogeneous variant arrays - csarray/cinvsary
+*
+*Revision History:
+*
+* [00] 23-Sep-92 bradlo: Added header.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "disptest.h"
+#include "tstsuite.h"
+
+ASSERTDATA
+
+STDAPI_(void) PassFail(HRESULT, OLECHAR FAR*, HWND);
+STDAPI DispTestAll(HWND, int, int);
+STDAPI DispTestOne(HWND, int);
+
+BOOL InitApplication(HINSTANCE hinst);
+BOOL InitInstance(HINSTANCE hist, int nCmdShow);
+
+extern "C" BOOL CALLBACK EXPORT
+AboutDlgProc(HWND, unsigned, WORD, LONG);
+
+extern "C" LRESULT CALLBACK EXPORT
+MainWndProc(HWND, UINT, WPARAM, LPARAM);
+
+
+int g_fTrace = FALSE;
+int g_fNamed = FALSE;
+int g_fMultiThread = FALSE;
+int g_fDetectLeaks = FALSE;
+
+HINSTANCE g_hinst; // current instance
+
+HWND g_hwnd = NULL;
+
+TCHAR g_szFrameWinClass[] = TSTR("DispTestWinClass");
+
+#if OE_WIN32
+CRITICAL_SECTION g_csDbPrintf;
+#endif // OE_WIN32
+
+/***
+*int WinMain(HANDLE, HANDLE, LPSTR, int)
+*Purpose:
+* Windows recognizes this function by name as the initial entry
+* point for the program
+*
+*Entry:
+* hinst = instance handle of this instance
+* hinstPrev = instance handle of previous running instance (if any)
+* lpszCmdLine = command line passed to the program
+* nCmdShow = how to show the main window
+*
+*Exit:
+* return value = int, exit status of the program
+*
+***********************************************************************/
+extern "C" int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hinstPrev,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+
+ if(!hinstPrev)
+ if(!InitApplication(hinst))
+ return FALSE;
+
+#if OE_WIN32
+ if(strstr(lpCmdLine, "-detectleaks"))
+#else
+ if(STRSTR(lpCmdLine, "-detectleaks"))
+#endif
+ g_fDetectLeaks = TRUE;
+
+ if(InitOle() != NOERROR)
+ return FALSE;
+
+ if(!InitInstance(hinst, nCmdShow) || !InitAppData()) {
+ UninitOle();
+ return FALSE;
+ }
+
+#if OE_WIN32
+ InitializeCriticalSection(&g_csDbPrintf);
+#endif // OE_WIN32
+
+#if OE_WIN32
+ if(strstr(lpCmdLine, "-all"))
+#else
+ if(STRSTR(lpCmdLine, "-all"))
+#endif
+ { DispTestAll(g_hwnd, FALSE, FALSE); PostQuitMessage(0); }
+
+ while(GetMessage(&msg, NULL, NULL, NULL)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ ReleaseAppData();
+ UninitOle();
+
+ return msg.wParam; /* Returns the value from PostQuitMessage */
+}
+
+BOOL
+InitApplication(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ wc.style = NULL;
+ wc.lpfnWndProc = MainWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wc.lpszMenuName = TSTR("DispTestMenu");
+ wc.lpszClassName = g_szFrameWinClass;
+ if(!RegisterClass(&wc))
+ return FALSE;
+
+ return TRUE;
+}
+
+#ifdef WIN32
+#define szAppTitle TSTR("IDispatch Test App (32-bit)")
+#else //WIN32
+#define szAppTitle TSTR("IDispatch Test App")
+#endif //WIN32
+
+BOOL
+InitInstance(HINSTANCE hinst, int nCmdShow)
+{
+ HWND hwnd;
+
+ g_hinst = hinst;
+
+ /* Create a main window for this application instance. */
+
+ hwnd = CreateWindow(
+ g_szFrameWinClass,
+ szAppTitle, // title bar text
+ WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, // window style
+ CW_USEDEFAULT, // horizontal position
+ CW_USEDEFAULT, // vertical position
+ 550, // width position
+ 100, // height position
+ NULL, // no parent
+ NULL, // use the window class menu
+ hinst, // this instance owns this window
+ NULL); // pointer not needed
+
+ if(!hwnd)
+ return FALSE;
+
+#if OE_WIN16
+ // Multithreading is not availible on WIN16.
+ // UNDONE: Grey this for WIN32s.
+ //
+ EnableMenuItem(GetMenu(hwnd), IDM_OPTIONS_MULTITHREAD, MF_DISABLED);
+#endif // OE_WIN16
+
+ ShowWindow(hwnd, nCmdShow);
+ UpdateWindow(hwnd);
+
+ g_hwnd = hwnd;
+ return TRUE;
+}
+
+
+/***
+*BOOL AboutDlgProc(HWND, unsigned, WORD, LONG)
+*Purpose:
+* The "about" dialog box procedure.
+*
+*Entry:
+* hwndDlg = window handle for the dialog box
+* message = the window message
+* wparam = message data
+* lparam = message data
+*
+*Exit:
+* return value = BOOL. TRUE if processed message, FALSE if not
+*
+***********************************************************************/
+extern "C" BOOL CALLBACK EXPORT
+AboutDlgProc(HWND hwndDlg, unsigned message, WORD wparam, LONG lparam)
+{
+ switch(message){
+ case WM_INITDIALOG: /* message: initialize dialog box */
+ return TRUE;
+
+ case WM_COMMAND:
+ if(wparam == IDOK || wparam == IDCANCEL){
+ EndDialog(hwndDlg, TRUE);
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+
+extern "C" LRESULT CALLBACK EXPORT
+MainWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
+{
+ BOOL fChk;
+ HMENU hmenu;
+static DLGPROC pfnAboutDlgProc;
+ HRESULT hresult;
+
+ switch(message){
+ case WM_COMMAND:
+ switch(wparam){
+ case IDM_OPTIONS_MULTITHREAD:
+ fChk = g_fMultiThread = (g_fMultiThread) ? FALSE : TRUE;
+ goto LCheckMark;
+
+ case IDM_OPTIONS_TRACE:
+ fChk = g_fTrace = (g_fTrace) ? FALSE : TRUE;
+ goto LCheckMark;
+
+ case IDM_OPTIONS_NAMED:
+ fChk = g_fNamed = (g_fNamed) ? FALSE : TRUE;
+
+LCheckMark:;
+ hmenu = GetMenu(hwnd);
+ CheckMenuItem(hmenu, wparam, fChk ? MF_CHECKED : MF_UNCHECKED);
+ return 0;
+
+ case IDM_ALL:
+ hresult = DispTestAll(hwnd, TRUE, g_fMultiThread);
+
+ // If S_FALSE is returned, we've already displayed an error, so
+ // don't do it again.
+ //
+ if (GetScode(hresult) != S_FALSE) {
+ PassFail(hresult, OLESTR("Test All"), hwnd);
+ }
+
+ return 0;
+
+ case IDM_SUITE_BSTR:
+#if OE_WIN32 && 0
+ case IDM_SUITE_WBSTR:
+#endif
+ case IDM_SUITE_TIME:
+ case IDM_SUITE_DATECNV:
+ case IDM_SUITE_VARIANT:
+ case IDM_SUITE_SAFEARRAY:
+ case IDM_SUITE_NLS:
+ case IDM_SUITE_BIND:
+ case IDM_SUITE_INVOKE_BYVAL:
+ case IDM_SUITE_INVOKE_BYREF:
+ case IDM_SUITE_INVOKE_SAFEARRAY:
+ case IDM_SUITE_INVOKE_EXCEPINFO:
+ case IDM_SUITE_COLLECTION:
+#if VBA2
+ case IDM_SUITE_EARLY:
+#endif
+ DispTestOne(hwnd, wparam);
+ return 0;
+
+ case IDM_HELP_ABOUT:
+ pfnAboutDlgProc =
+ (DLGPROC)MakeProcInstance((DLGPROC)AboutDlgProc, g_hinst);
+ DialogBox(g_hinst, TSTR("AboutBox"), hwnd, pfnAboutDlgProc);
+ FreeProcInstance(pfnAboutDlgProc);
+ return 0;
+ }
+ break;
+
+ case WM_CLOSE:
+ DestroyWindow(hwnd);
+ return 0;
+
+ case WM_DESTROY: /* message: window being destroyed */
+ PostQuitMessage(0);
+ return 0;
+ }
+
+ return DefWindowProc(hwnd, message, wparam, lparam);
+}
diff --git a/private/oleauto/tests/disptest/disptest.h b/private/oleauto/tests/disptest/disptest.h
new file mode 100644
index 000000000..6822aa2f5
--- /dev/null
+++ b/private/oleauto/tests/disptest/disptest.h
@@ -0,0 +1,63 @@
+/***
+*disptest.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* IDispatch test app definitions.
+*
+*Revision History:
+*
+* [00] 28-Sep-92 bradlo: Added this cool header.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef _DISPTEST_H_
+#define _DISPTEST_H_
+
+#include "common.h"
+#include "resource.h"
+#include "testhelp.h"
+#include "dispdbug.h"
+
+#ifdef _MAC
+# include <stdio.h>
+typedef FILE* HFILE;
+# define HFILE_ERROR NULL
+#endif
+
+// misc.cpp
+//
+struct APP_DATA {
+ HFILE m_hfLogfile;
+
+ APP_DATA() {
+ m_hfLogfile = HFILE_ERROR;
+ }
+};
+
+#if OE_WIN32
+extern unsigned long g_itlsAppData;
+#else // !OE_WIN32
+extern APP_DATA g_appdata;
+#endif // !OE_WIN32
+
+APP_DATA *Pappdata();
+BOOL InitAppData();
+VOID ReleaseAppData();
+
+STDAPI InitOle(void);
+STDAPI_(void) UninitOle(void);
+
+EXTERN_C void DbPrintf(char FAR*, ...);
+
+void PrintSuiteHeader(TCHAR FAR* szFmt, ...);
+void PrintTestHeader(TCHAR FAR* szFmt, ...);
+void PrintVarg(OLECHAR FAR* sz, VARIANTARG FAR* pvarg);
+void PrintDate(DATE date);
+
+#endif
+
diff --git a/private/oleauto/tests/disptest/guid.c b/private/oleauto/tests/disptest/guid.c
new file mode 100644
index 000000000..3cf489210
--- /dev/null
+++ b/private/oleauto/tests/disptest/guid.c
@@ -0,0 +1,56 @@
+/***
+*guid.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates (via Ole macro mania) the ITestSuite IID.
+*
+*Revision History:
+*
+* [00] 31-Oct-92 bradlo: Created.
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# ifdef _MSC_VER
+# include <macos/types.h>
+# include <macos/processe.h>
+# include <macos/appleeve.h>
+# define far
+# define FAR far
+# define near
+# define NEAR near
+# define PASCAL pascal
+# define cdecl _cdecl
+# define CDECL cdecl
+#ifndef _PPCMAC
+# define pascal _pascal
+#endif
+# else
+# include <Types.h>
+# include <Processes.h>
+# include <AppleEvents.h>
+# endif
+#else
+# include <windows.h>
+#endif
+
+#ifndef WIN32
+#include <compobj.h>
+#endif //!WIN32
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+#ifndef INITGUID
+# define INITGUID
+#endif
+
+// due to the previous header, including this causes our DEFINE_GUID defs
+// in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
+
diff --git a/private/oleauto/tests/disptest/macmain.cpp b/private/oleauto/tests/disptest/macmain.cpp
new file mode 100644
index 000000000..9ee2a2f40
--- /dev/null
+++ b/private/oleauto/tests/disptest/macmain.cpp
@@ -0,0 +1,1447 @@
+/***
+*mcdsptst.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* UNDONE
+*
+*
+*Revision History:
+*
+* [00] 28-Apr-93 bradlo: Created from TESample.c.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "disptest.h"
+#include "macmain.h"
+#include "resource.h"
+
+#if HC_MSC && !defined(_PPCMAC)
+#include <swap.h>
+#endif
+
+ASSERTDATA
+
+STDAPI
+DispTestOne(void*, int);
+
+typedef struct {
+ WindowRecord docWindow;
+ TEHandle docTE;
+ ControlHandle docVScroll;
+ ControlHandle docHScroll;
+#if 0
+// ProcPtr docClik;
+#endif
+} Doc;
+
+
+SysEnvRec g_sysenv;
+Boolean g_fInitOle = false;
+Boolean g_fInBackground = false;
+Boolean g_fLibrariesLoaded = false;
+
+short g_cNumDocs = 0;
+
+
+
+/* Define HIWRD and LOWRD macros for efficiency. */
+#define HIWRD(aLong) (((aLong) >> 16) & 0xFFFF)
+#define LOWRD(aLong) ((aLong) & 0xFFFF)
+
+/* Define TOPLEFT and BOTRIGHT macros for convenience. Notice the implicit
+ dependency on the ordering of fields within a Rect */
+#define TOPLEFT(aRect) (*(Point*)&(aRect).top)
+#define BOTRIGHT(aRect) (*(Point*)&(aRect).bottom)
+
+
+void
+Exit()
+{
+ if(g_fInitOle)
+ UninitOle();
+#ifndef _PPCMAC
+ if(g_fLibrariesLoaded)
+#endif
+#if 0
+ CleanupLibraryManager();
+#else
+#ifndef _PPCMAC
+ UninitOleManager(); // clean up applet
+#endif
+#endif
+ ExitToShell();
+}
+
+/* display fatal error alert, and exit */
+void
+Fatal(char *msg)
+{
+static const unsigned char pnil[2] = {0,0};
+ unsigned char buf[128];
+
+ SetCursor(&qd.arrow);
+
+ buf[0] = (unsigned char)strlen(msg);
+ memcpy(&buf[1], msg, buf[0]+1);
+
+ ParamText(buf, pnil, pnil, pnil);
+ Alert(rUserAlert, nil);
+ Exit();
+}
+
+extern "C" int
+main()
+{
+
+
+
+ Init();
+ long l = OleBuildVersion();
+ DbPrintf("OleBuildVersion = %d.%d\n", (int)HIWRD(l), (int)LOWRD(l));
+
+#ifdef _DEBUG
+ FnAssertOn(false); // TEMPORARY: to get around IMessageFilter assertions
+#endif
+ EventLoop();
+ return 0;
+}
+
+/* Get events forever, and handle them by calling DoEvent.
+ Also call AdjustCursor each time through the loop. */
+void
+EventLoop()
+{
+ Point mouse;
+ Boolean gotEvent;
+ EventRecord event;
+ RgnHandle cursorRgn;
+
+ cursorRgn = NewRgn(); /* we'll pass WNE an empty region the 1st time thru */
+ do{
+ GetGlobalMouse(&mouse);
+ AdjustCursor(mouse, cursorRgn);
+ gotEvent = WaitNextEvent(everyEvent, &event, GetSleep(), cursorRgn);
+ if(gotEvent){
+ /* make sure we have the right cursor before handling the event */
+ AdjustCursor(event.where, cursorRgn);
+ DoEvent(&event);
+ }else{
+ DoIdle(); /* perform idle tasks when it's not our event */
+ }
+
+ }while(true);
+}
+
+
+/* Do the right thing for an event. Determine what kind of event it is,
+ and call the appropriate routines. */
+void
+DoEvent(EventRecord *pevent)
+{
+ char key;
+ short part;
+ WindowPtr window;
+
+ switch(pevent->what){
+ case nullEvent:
+ // we idle for null/mouse moved events ands for events which
+ // aren't ours (see EventLoop)
+ DoIdle();
+ break;
+
+ case mouseDown:
+ part = FindWindow(pevent->where, &window);
+ switch(part){
+ case inMenuBar: /* process a mouse menu command (if any) */
+ AdjustMenus(); /* bring 'em up-to-date */
+ DoMenuCommand(MenuSelect(pevent->where));
+ break;
+
+ case inSysWindow: /* let the system handle the mouseDown */
+ SystemClick(pevent, window);
+ break;
+
+ case inContent:
+ if(window != FrontWindow()){
+ SelectWindow(window);
+ }else{
+ DoContentClick(window, pevent);
+ }
+ break;
+
+ case inDrag: /* pass screenBits.bounds to get all gDevices */
+ DragWindow(window, pevent->where, &qd.screenBits.bounds);
+ break;
+
+ case inGoAway:
+ if(TrackGoAway(window, pevent->where))
+ DoCloseWindow(window); /* we don't care if the user cancelled */
+ break;
+
+ case inGrow:
+ DoGrowWindow(window, pevent);
+ break;
+
+ case inZoomIn:
+ case inZoomOut:
+ if(TrackBox(window, pevent->where, part))
+ DoZoomWindow(window, part);
+ break;
+ }
+ break;
+
+ case keyDown:
+ case autoKey: /* check for menukey equivalents */
+ key = (char)(pevent->message & charCodeMask);
+ if(pevent->modifiers & cmdKey){/* Command key down */
+ if(pevent->what == keyDown){
+ AdjustMenus(); /* enable/disable/check menu items properly */
+ DoMenuCommand(MenuKey(key));
+ }
+ }else{
+ DoKeyDown(pevent);
+ }
+ break;
+
+ case activateEvt:
+ DoActivate(
+ (WindowPtr)pevent->message,
+ (Boolean)((pevent->modifiers & activeFlag) != 0));
+ break;
+
+ case updateEvt:
+ DoUpdate((WindowPtr)pevent->message);
+ break;
+
+ case kOSEvent:
+ switch((pevent->message >> 24) & 0x0FF){ /* high byte of message */
+ case kMouseMovedMessage:
+ DoIdle(); /* mouse-moved is also an idle event */
+ break;
+
+ case kSuspendResumeMessage:
+ /* suspend/resume is also an activate/deactivate */
+ g_fInBackground = (pevent->message & kResumeMask) == 0;
+ DoActivate(FrontWindow(), (Boolean)!g_fInBackground);
+ break;
+ }
+ break;
+
+ case kHighLevelEvent:
+ AEProcessAppleEvent(pevent);
+ break;
+ }
+}
+
+/* Change the cursor's shape, depending on its position. This also
+ calculates the region where the current cursor resides (for
+ WaitNextEvent). When the mouse moves outside of this region,
+ an event is generated. If there is more to the event than just
+ the mouse moved, we get called before the event is processed to
+ make sure the cursor is the right one. In any (ahem) event, this
+ is called again before we fall back into WNE. */
+void
+AdjustCursor(Point mouse, RgnHandle region)
+{
+ Rect iBeamRect;
+ WindowPtr window;
+ RgnHandle arrowRgn;
+ RgnHandle iBeamRgn;
+
+ /* we only adjust the cursor when we are in front */
+ window = FrontWindow();
+
+ if((!g_fInBackground) && (!IsDAWindow(window))){
+ /* calculate regions for different cursor shapes */
+ arrowRgn = NewRgn();
+ iBeamRgn = NewRgn();
+
+ /* start arrowRgn wide open */
+ SetRectRgn(arrowRgn, kExtremeNeg, kExtremeNeg, kExtremePos, kExtremePos);
+
+ /* calculate iBeamRgn */
+ if(IsAppWindow(window)){
+ iBeamRect = (*((Doc*)window)->docTE)->viewRect;
+ SetPort(window); /* make a global version of the viewRect */
+ LocalToGlobal(&TOPLEFT(iBeamRect));
+ LocalToGlobal(&BOTRIGHT(iBeamRect));
+ RectRgn(iBeamRgn, &iBeamRect);
+ /* we temporarily change the port's origin to "globalfy" the visRgn */
+ SetOrigin(
+ (short)-window->portBits.bounds.left,
+ (short)-window->portBits.bounds.top);
+ SectRgn(iBeamRgn, window->visRgn, iBeamRgn);
+ SetOrigin((short)0, (short)0);
+ }
+
+ /* subtract other regions from arrowRgn */
+ DiffRgn(arrowRgn, iBeamRgn, arrowRgn);
+
+ /* change the cursor and the region parameter */
+ if(PtInRgn(mouse, iBeamRgn)){
+ SetCursor(*GetCursor(iBeamCursor));
+ CopyRgn(iBeamRgn, region);
+ }else{
+ SetCursor(&qd.arrow);
+ CopyRgn(arrowRgn, region);
+ }
+ DisposeRgn(arrowRgn);
+ DisposeRgn(iBeamRgn);
+ }
+}
+
+/* Get the global coordinates of the mouse. When you call OSEventAvail
+ it will return either a pending event or a null event. In either case,
+ the where field of the event record will contain the current position
+ of the mouse in global coordinates and the modifiers field will reflect
+ the current state of the modifiers. Another way to get the global
+ coordinates is to call GetMouse and LocalToGlobal, but that requires
+ being sure that thePort is set to a valid port. */
+void
+GetGlobalMouse(Point *mouse)
+{
+ EventRecord event;
+
+ /* we aren't interested in any events */
+ OSEventAvail(kNoEvents, &event);
+
+ /* just the mouse position */
+ *mouse = event.where;
+}
+
+/* Called when a mouseDown occurs in the grow box of an active window.
+ In order to eliminate any 'flicker', we want to invalidate only what
+ is necessary. Since ResizeWindow invalidates the whole portRect, we
+ save the old TE viewRect, intersect it with the new TE viewRect, and
+ remove the result from the update region. However, we must make sure
+ that any old update region that might have been around gets put back. */
+void
+DoGrowWindow(WindowPtr window, EventRecord *event)
+{
+ Rect tempRect;
+ long growResult;
+ Doc* doc;
+ RgnHandle tempRgn;
+
+ tempRect = qd.screenBits.bounds; /* set up limiting values */
+ tempRect.left = kMinDocDim;
+ tempRect.top = kMinDocDim;
+ growResult = GrowWindow(window, event->where, &tempRect);
+
+ /* see if it really changed size */
+ if(growResult != 0){
+ doc = (Doc*)window;
+ /* save old text box */
+ tempRect = (*doc->docTE)->viewRect;
+ tempRgn = NewRgn();
+ /* get localized update region */
+ GetLocalUpdateRgn(window, tempRgn);
+ SizeWindow(window, (short)LOWRD(growResult), (short)HIWRD(growResult), (Boolean)true);
+ ResizeWindow(window);
+
+ /* calculate & validate the region that hasn't changed so
+ it won't get redrawn */
+ SectRect(&tempRect, &(*doc->docTE)->viewRect, &tempRect);
+ ValidRect(&tempRect); /* take it out of update */
+ InvalRgn(tempRgn); /* put back any prior update */
+ DisposeRgn(tempRgn);
+ }
+}
+
+/* Called when a mouseClick occurs in the zoom box of an active window.
+ Everything has to get re-drawn here, so we don't mind that
+ ResizeWindow invalidates the whole portRect. */
+void DoZoomWindow(WindowPtr window, short part)
+{
+ EraseRect(&window->portRect);
+ ZoomWindow(window, part, (Boolean)(window == FrontWindow()));
+ ResizeWindow(window);
+}
+
+/* Called when the window has been resized to fix up the controls and
+ content. */
+void ResizeWindow(WindowPtr window)
+{
+ AdjustScrollbars(window, true);
+ AdjustTE(window);
+ InvalRect(&window->portRect);
+}
+
+/* Returns the update region in local coordinates */
+void GetLocalUpdateRgn(WindowPtr window, RgnHandle localRgn)
+{
+ /* save old update region */
+ CopyRgn(((WindowPeek) window)->updateRgn, localRgn);
+
+ OffsetRgn(
+ localRgn,
+ window->portBits.bounds.left,
+ window->portBits.bounds.top);
+}
+
+void
+DoUpdate(WindowPtr window)
+{
+ if(IsAppWindow(window)){
+ /* this sets up the visRgn */
+ BeginUpdate(window);
+ /* draw if updating needs to be done */
+ if(!EmptyRgn(window->visRgn))
+ DrawWindow(window);
+ EndUpdate(window);
+ }
+}
+
+/* This is called when a window is activated or deactivated.
+ It calls TextEdit to deal with the selection. */
+void
+DoActivate(WindowPtr window, Boolean becomingActive)
+{
+ Rect growRect;
+ Doc* doc;
+ RgnHandle tempRgn, clipRgn;
+
+ if(IsAppWindow(window)){
+ doc = (Doc*)window;
+ if(becomingActive){
+ /* since we don't want TEActivate to draw a selection in an
+ area where we're going to erase and redraw, we'll clip
+ out the update region before calling it. */
+ tempRgn = NewRgn();
+ clipRgn = NewRgn();
+ /* get localized update region */
+ GetLocalUpdateRgn(window, tempRgn);
+ GetClip(clipRgn);
+ /* subtract updateRgn from clipRgn */
+ DiffRgn(clipRgn, tempRgn, tempRgn);
+ SetClip(tempRgn);
+ TEActivate(doc->docTE);
+ /* restore the full-blown clipRgn */
+ SetClip(clipRgn);
+ DisposeRgn(tempRgn);
+ DisposeRgn(clipRgn);
+
+ /* the controls must be redrawn on activation: */
+ (*doc->docVScroll)->contrlVis = kControlVisible;
+ (*doc->docHScroll)->contrlVis = kControlVisible;
+ InvalRect(&(*doc->docVScroll)->contrlRect);
+ InvalRect(&(*doc->docHScroll)->contrlRect);
+ /* the growbox needs to be redrawn on activation: */
+ growRect = window->portRect;
+ /* adjust for the scrollbars */
+ growRect.top = growRect.bottom - kScrollbarAdjust;
+ growRect.left = growRect.right - kScrollbarAdjust;
+ InvalRect(&growRect);
+ }else{
+ TEDeactivate(doc->docTE);
+ /* the controls must be hidden on deactivation: */
+ HideControl(doc->docVScroll);
+ HideControl(doc->docHScroll);
+ /* the growbox should be changed immediately on deactivation: */
+ DrawGrowIcon(window);
+ }
+ }
+}
+
+/* This is called when a mouseDown occurs in the content of a window. */
+void
+DoContentClick(WindowPtr window, EventRecord *event)
+{
+ Rect teRect;
+ Point mouse;
+ Doc* doc;
+ short part, value;
+ Boolean shiftDown;
+ ControlHandle control;
+
+ if(IsAppWindow(window)){
+ SetPort(window);
+ mouse = event->where; /* get the click position */
+ GlobalToLocal(&mouse);
+ doc = (Doc*)window;
+ /* see if we are in the viewRect. if so, we won't check the controls */
+ GetTERect(window, &teRect);
+ if(PtInRect(mouse, &teRect)){
+ /* see if we need to extend the selection - extend if Shift is down */
+ shiftDown = (event->modifiers & shiftKey) != 0;
+ TEClick(mouse, shiftDown, doc->docTE);
+#if 0
+ PascalClikLoop();
+#endif
+ }else{
+ part = FindControl(mouse, window, &control);
+ switch(part){
+ case 0: /* do nothing for viewRect case */
+ break;
+ case inThumb:
+ value = GetCtlValue(control);
+ part = TrackControl(control, mouse, nil);
+ if(part != 0){
+ value -= GetCtlValue(control);
+ /* value now has CHANGE in value; if value changed, scroll */
+ if(value != 0){
+ if(control == doc->docVScroll){
+ TEScroll(
+ (short)0,
+ (short)(value * (*doc->docTE)->lineHeight),
+ doc->docTE);
+ }else{
+ TEScroll((short)value, (short)0, doc->docTE);
+ }
+ }
+ }
+ break;
+
+ default: /* they clicked in an arrow, so track & scroll */
+ if(control == doc->docVScroll)
+#ifdef _PPCMAC
+ value = TrackControl(control, mouse, (ControlActionUPP)VActionProc);
+ else
+ value = TrackControl(control, mouse, (ControlActionUPP)HActionProc);
+#else
+ value = TrackControl(control, mouse, (ProcPtr)VActionProc);
+ else
+ value = TrackControl(control, mouse, (ProcPtr)HActionProc);
+ break;
+#endif
+ }
+ }
+ }
+}
+
+/* This is called for any keyDown or autoKey events, except when the
+ Command key is held down. It looks at the frontmost window to decide what
+ to do with the key typed. */
+void
+DoKeyDown(EventRecord *event)
+{
+ char key;
+ TEHandle te;
+ WindowPtr window;
+
+ window = FrontWindow();
+ if(IsAppWindow(window)){
+ te = ((Doc*) window)->docTE;
+ key = (char)(event->message & charCodeMask);
+ /* we have a char. for our window; see if we are still below TextEditÕs
+ limit for the number of characters (but deletes are always rad) */
+ if(key == kDelChar
+ || (*te)->teLength - ((*te)->selEnd - (*te)->selStart)+1 < kMaxTELength)
+ {
+ TEKey(key, te);
+ AdjustScrollbars(window, false);
+ AdjustTE(window);
+ }
+ }
+}
+
+/* Common algorithm for pinning the value of a control. It returns
+ the actual amount the value of the control changed. Note the
+ pinning is done for the sake of returning the amount the control
+ value changed. */
+void
+CommonAction(ControlHandle control, short *amount)
+{
+ short value, max;
+
+ value = GetCtlValue(control); /* get current value */
+ max = GetCtlMax(control); /* and maximum value */
+ *amount = value - *amount;
+ if(*amount < 0)
+ *amount = 0;
+ else if(*amount > max)
+ *amount = max;
+ SetCtlValue(control, *amount);
+ *amount = value - *amount; /* calculate the real change */
+}
+
+/* Determines how much to change the value of the vertical scrollbar
+ by and how much to scroll the TE record. */
+extern "C"
+PASCAL_(void)
+VActionProc(ControlHandle control, short part)
+{
+ TEPtr te;
+ short amount;
+ WindowPtr window;
+
+ if(part != 0){ /* if it was actually in the control */
+ window = (*control)->contrlOwner;
+ te = *((Doc*) window)->docTE;
+ switch(part){
+ case inUpButton:
+ case inDownButton: /* one line */
+ amount = 1;
+ break;
+ case inPageUp: /* one page */
+ case inPageDown:
+ amount = (te->viewRect.bottom - te->viewRect.top) / te->lineHeight;
+ break;
+ }
+ if((part == inDownButton) || (part == inPageDown))
+ amount = -amount; /* reverse direction for a downer */
+ CommonAction(control, &amount);
+ if(amount != 0){
+ TEScroll((short)0,
+ (short)(amount * te->lineHeight),
+ ((Doc*)window)->docTE);
+ }
+ }
+}
+
+/* Determines how much to change the value of the horizontal scrollbar
+ by and how much to scroll the TE record. */
+extern "C"
+PASCAL_(void)
+HActionProc(ControlHandle control, short part)
+{
+ TEPtr te;
+ short amount;
+ WindowPtr window;
+
+ if(part != 0){
+ window = (*control)->contrlOwner;
+ te = *((Doc*) window)->docTE;
+ switch(part){
+ case inUpButton:
+ case inDownButton: /* a few pixels */
+ amount = kButtonScroll;
+ break;
+ case inPageUp: /* a page */
+ case inPageDown:
+ amount = te->viewRect.right - te->viewRect.left;
+ break;
+ }
+ if((part == inDownButton) || (part == inPageDown))
+ amount = -amount; /* reverse direction */
+ CommonAction(control, &amount);
+ if(amount != 0)
+ TEScroll(amount, 0, ((Doc*) window)->docTE);
+ }
+}
+
+/* This is called whenever we get a null event et al. It takes care
+ of necessary periodic actions. For this program, it calls TEIdle. */
+void
+DoIdle()
+{
+ WindowPtr window;
+
+ window = FrontWindow();
+ if(IsAppWindow(window))
+ TEIdle(((Doc*)window)->docTE);
+}
+
+/* Draw the contents of an application window. */
+void DrawWindow(WindowPtr window)
+{
+ SetPort(window);
+ EraseRect(&window->portRect);
+ DrawControls(window);
+ DrawGrowIcon(window);
+ TEUpdate(&window->portRect, ((Doc*)window)->docTE);
+}
+
+/* Enable and disable menus based on the current state. */
+
+void DoEnableItem(MenuHandle hmenu, short sItem) {
+ EnableItem(hmenu, sItem);
+}
+
+void DoDisableItem(MenuHandle hmenu, short sItem) {
+ DisableItem(hmenu, sItem);
+}
+
+/* Enable and disable menus based on the current state. */
+void
+AdjustMenus()
+{
+ long offset;
+ TEHandle hte;
+ MenuHandle menu;
+ WindowPtr window;
+ Boolean undo;
+ Boolean paste;
+ Boolean cutCopyClear;
+ void (*pfnEnable)(MenuHandle, short);
+
+#if 0
+
+ File
+ New
+ Close
+
+ Edit
+ Undo
+ Cut
+ Copy
+ Clear
+ Paste
+#endif
+
+ window = FrontWindow();
+
+ menu = GetMHandle(mFile);
+
+ pfnEnable = ((g_cNumDocs < kMaxOpenDocs) ? DoEnableItem : DoDisableItem);
+ pfnEnable(menu, iNew);
+
+ pfnEnable = ((window != nil) ? DoEnableItem : DoDisableItem);
+ pfnEnable(menu, iClose);
+
+ menu = GetMHandle(mEdit);
+ undo = false;
+ paste = false;
+ cutCopyClear = false;
+
+ if(IsDAWindow(window)){
+ undo = true; /* all editing is enabled for DA windows */
+ cutCopyClear = true;
+ paste = true;
+ }else if(IsAppWindow(window)){
+ hte = ((Doc*) window)->docTE;
+ if((*hte)->selStart < (*hte)->selEnd){
+ /* Cut, Copy, and Clear is enabled for app. windows with selections */
+ cutCopyClear = true;
+ }
+ if(GetScrap(nil, 'TEXT', &offset) > 0){
+ /* if there's any text in the clipboard, paste is enabled */
+ paste = true;
+ }
+ }
+
+ pfnEnable = (undo) ? DoEnableItem : DoDisableItem;
+ pfnEnable(menu, iUndo);
+
+ pfnEnable = (cutCopyClear) ? DoEnableItem : DoDisableItem;
+ pfnEnable(menu, iCut);
+ pfnEnable(menu, iCopy);
+ pfnEnable(menu, iClear);
+
+ pfnEnable = (paste) ? DoEnableItem : DoDisableItem;
+ pfnEnable(menu, iPaste);
+}
+
+
+/* This is called when an item is chosen from the menu bar (after calling
+ MenuSelect or MenuKey). It does the right thing for each command. */
+void
+DoMenuCommand(long menuResult)
+{
+ TEHandle te;
+ Str255 daName;
+ OSErr saveErr;
+ Handle aHandle;
+ WindowPtr window;
+ long oldSize, newSize, total, contig;
+ short menuID, menuItem, itemHit, daRefNum;
+static int rgIDMOfItem[] = {
+ -1 // <placeholder>
+ , IDM_SUITE_BSTR // iBstrAPI
+ , IDM_SUITE_TIME // iTimeAPI
+ , IDM_SUITE_DATECNV // iDateCnv
+ , IDM_SUITE_VARIANT // iVariantAPI
+ , IDM_SUITE_SAFEARRAY // iSafeArrayAPI
+ , IDM_SUITE_NLS // iNlsAPI
+ , IDM_SUITE_BIND // iBinding
+ , IDM_SUITE_INVOKE_BYVAL // iInvokeByVal
+ , IDM_SUITE_INVOKE_BYREF // iInvokeByRef
+ , IDM_SUITE_INVOKE_SAFEARRAY // iInvokeArray
+ , IDM_SUITE_INVOKE_EXCEPINFO // iInvokeExinfo
+ , IDM_SUITE_COLLECTION // iCollections
+};
+
+ window = FrontWindow();
+
+ menuID = (short)HIWRD(menuResult);
+ menuItem = (short)LOWRD(menuResult);
+
+ /* get menu item number and menu number */
+ switch(menuID){
+ case mApple:
+ switch(menuItem){
+ case iAbout: /* bring up alert for About */
+ itemHit = Alert(rAboutAlert, nil);
+ break;
+ default: /* all non-About items in this menu are DAs et al */
+ /* type Str255 is an array in MPW 3 */
+ GetMenuItemText(GetMHandle(mApple), menuItem, daName);
+ daRefNum = OpenDeskAcc(daName);
+ break;
+ }
+ break;
+
+ case mFile:
+ switch(menuItem){
+ case iNew:
+ DoNew();
+ break;
+ case iClose:
+ DoCloseWindow(FrontWindow()); /* ignore the result */
+ break;
+ case iQuit:
+ Terminate();
+ break;
+ }
+ break;
+
+ case mEdit: /* call SystemEdit for DA editing & MultiFinder */
+ if(!SystemEdit((short)(menuItem-1))){
+ te = ((Doc*)FrontWindow())->docTE;
+ switch(menuItem){
+ case iCut:
+ if(ZeroScrap() == noErr){
+ PurgeSpace(&total, &contig);
+ if((*te)->selEnd - (*te)->selStart + kTESlop > contig){
+ AlertUser(eNoSpaceCut);
+ }else{
+ TECut(te);
+ if(TEToScrap() != noErr){
+ AlertUser(eNoCut);
+ ZeroScrap();
+ }
+ }
+ }
+ break;
+
+ case iCopy:
+ if(ZeroScrap() == noErr){
+ TECopy(te); /* after copying, export the TE scrap */
+ if(TEToScrap() != noErr){
+ AlertUser(eNoCopy);
+ ZeroScrap();
+ }
+ }
+ break;
+
+ case iPaste: /* import the TE scrap before pasting */
+ if(TEFromScrap() == noErr){
+ if(TEGetScrapLen() + ((*te)->teLength -
+ ((*te)->selEnd - (*te)->selStart)) > kMaxTELength){
+ AlertUser(eExceedPaste);
+ }else{
+ aHandle = (Handle)TEGetText(te);
+ oldSize = GetHandleSize(aHandle);
+ newSize = oldSize + TEGetScrapLen() + kTESlop;
+ SetHandleSize(aHandle, newSize);
+ saveErr = MemError();
+ SetHandleSize(aHandle, oldSize);
+ if(saveErr != noErr)
+ AlertUser(eNoSpacePaste);
+ else
+ TEPaste(te);
+ }
+ }else{
+ AlertUser(eNoPaste);
+ }
+ break;
+
+ case iClear:
+ TEDelete(te);
+ break;
+ }
+ AdjustScrollbars(window, false);
+ AdjustTE(window);
+ }
+ break;
+
+ case mSuite:
+ switch(menuItem){
+ case iBstrAPI:
+ case iTimeAPI:
+ case iDateCnv:
+ case iVariantAPI:
+ case iSafeArrayAPI:
+ case iNlsAPI:
+ case iBinding:
+ case iInvokeByVal:
+ case iInvokeByRef:
+ case iInvokeArray:
+ case iInvokeExinfo:
+ case iCollections:
+ DispTestOne(NULL, rgIDMOfItem[menuItem]);
+ break;
+ }
+ break;
+
+ case mOptions:
+ switch(menuItem){
+ case iClearAll:
+ te = ((Doc*)FrontWindow())->docTE;
+ TESetSelect(0, 32767, te);
+ TEDelete(te);
+ break;
+ case iDebugger:
+ Debugger();
+ break;
+ }
+ break;
+ }
+ HiliteMenu(0); /* unhighlight what MenuSelect (or MenuKey) hilited */
+}
+
+/* Create a new document and window. */
+void
+DoNew()
+{
+ Ptr storage;
+ Boolean good;
+ Doc* doc;
+ WindowPtr window;
+ Rect destRect, viewRect;
+
+ storage = NewPtr(sizeof(Doc));
+ if(storage != nil){
+ window = GetNewWindow(rDocWindow, storage, (WindowPtr) -1);
+ if(window != nil){
+ /* this will be decremented when we call DoCloseWindow */
+ good = false;
+ g_cNumDocs += 1;
+ SetPort(window);
+
+ short font;
+ GetFNum((const unsigned char*)"\006Monaco", &font);
+ TextFont(font);
+ TextSize(9);
+
+ doc = (Doc*)window;
+ GetTERect(window, &viewRect);
+ destRect = viewRect;
+ destRect.right = destRect.left + kMaxDocWidth;
+ doc->docTE = TENew(&destRect, &viewRect);
+
+ /* if TENew succeeded, we have a good document */
+ good = doc->docTE != nil;
+ if(good){
+ AdjustViewRect(doc->docTE);
+ TEAutoView(true, doc->docTE);
+ }
+
+ if(good){
+ doc->docVScroll = GetNewControl(rVScroll, window);
+ good = (doc->docVScroll != nil);
+ }
+
+ if(good){
+ doc->docHScroll = GetNewControl(rHScroll, window);
+ good = (doc->docHScroll != nil);
+ }
+
+ if(good){ /* good? adjust & draw the controls, draw the window */
+ /* false to AdjustScrollValues means musn't redraw;
+ technically, of course, the window is hidden so
+ it wouldn't matter whether we called ShowControl
+ or not. */
+ AdjustScrollValues(window, false);
+ ShowWindow(window);
+ }else{
+ /* otherwise regret we ever created it... */
+ DoCloseWindow(window);
+ AlertUser(eNoWindow);
+ }
+ }else{
+ /* get rid of the storage if it is never used */
+ DisposPtr(storage);
+ }
+ }
+}
+
+
+/* Close a window. This handles desk accessory and application windows. */
+/* 1.01 - At this point, if there was a document associated with a
+ window, you could do any document saving processing if it is 'dirty'.
+ DoCloseWindow would return true if the window actually closed, i.e.,
+ the user didn't cancel from a save dialog. This result is handy when
+ the user quits an application, but then cancels the save of a document
+ associated with a window. */
+Boolean
+DoCloseWindow(WindowPtr window)
+{
+ TEHandle te;
+
+ if(IsDAWindow(window)){
+ CloseDeskAcc(((WindowPeek) window)->windowKind);
+ }else if(IsAppWindow(window)){
+ te = ((Doc*)window)->docTE;
+ if(te != nil){
+ /* dispose the TEHandle if we got far enough to make one */
+ TEDispose(te);
+ }
+ CloseWindow(window);
+ DisposPtr((Ptr)window);
+ g_cNumDocs -= 1;
+ }
+ return true;
+}
+
+/* Clean up the application and exit. We close all of the windows
+ so that they can update their documents, if any. */
+void
+Terminate()
+{
+ Boolean closed;
+ WindowPtr aWindow;
+
+ closed = true;
+ do{
+ aWindow = FrontWindow(); /* get the current front window */
+ if(aWindow != nil)
+ closed = DoCloseWindow(aWindow); /* close this window */
+ } while (closed && (aWindow != nil));
+
+ if(closed)
+ Exit(); /* exit if no cancellation */
+}
+
+/* Return a rectangle that is inset from the portRect by the
+ size of the scrollbars and a little extra margin. */
+void
+GetTERect(WindowPtr window, Rect *teRect)
+{
+ *teRect = window->portRect;
+ InsetRect(teRect, kTextMargin, kTextMargin);/* adjust for margin */
+ teRect->bottom = teRect->bottom - 15; /* and for the scrollbars */
+ teRect->right = teRect->right - 15;
+}
+
+/* Update the TERec's view rect so that it is the greatest multiple
+ of the lineHeight that still fits in the old viewRect. */
+void
+AdjustViewRect(TEHandle docTE)
+{
+ TEPtr te;
+
+ te = *docTE;
+ te->viewRect.bottom = (((te->viewRect.bottom - te->viewRect.top) / te->lineHeight) * te->lineHeight) + te->viewRect.top;
+}
+
+/* Scroll the TERec around to match up to the potentially updated
+ scrollbar values. This is really useful when the window has been
+ resized such that the scrollbars became inactive but the TERec
+ was already scrolled. */
+void
+AdjustTE(WindowPtr window)
+{
+ TEPtr te;
+
+ te = *((Doc*)window)->docTE;
+
+ TEScroll(
+ (short)((te->viewRect.left - te->destRect.left) -
+ GetCtlValue(((Doc*)window)->docHScroll)),
+ (short)((te->viewRect.top - te->destRect.top) -
+ (GetCtlValue(((Doc*)window)->docVScroll) * te->lineHeight)),
+ ((Doc*)window)->docTE);
+}
+
+
+/* Calculate the new control maximum value and current value, whether
+ it is the horizontal or vertical scrollbar. The vertical max is
+ calculated by comparing the number of lines to the vertical size
+ of the viewRect. The horizontal max is calculated by comparing the
+ maximum document width to the width of the viewRect. The current
+ values are set by comparing the offset between the view and
+ destination rects. If necessary and we canRedraw, have the control
+ be re-drawn by calling ShowControl. */
+void
+AdjustHV(
+ Boolean isVert,
+ ControlHandle control,
+ TEHandle docTE,
+ Boolean canRedraw)
+{
+ TEPtr te;
+ short value, lines, max, oldValue, oldMax;
+
+ oldValue = GetCtlValue(control);
+ oldMax = GetCtlMax(control);
+ te = *docTE; /* point to TERec for convenience */
+
+ if(isVert){
+ lines = te->nLines;
+ /* since nLines isn't right if the last character is a return,
+ check for that case */
+ if(*(*te->hText + te->teLength - 1) == kCrChar)
+ lines += 1;
+ max = lines - ((te->viewRect.bottom - te->viewRect.top) / te->lineHeight);
+ }else{
+ max = kMaxDocWidth - (te->viewRect.right - te->viewRect.left);
+ }
+
+ if ( max < 0 ) max = 0;
+ SetCtlMax(control, max);
+
+ /* Must deref. after SetCtlMax since, technically, it could
+ draw and therefore move memory. This is why we don't just
+ do it once at the beginning. */
+ te = *docTE;
+ if(isVert)
+ value = (te->viewRect.top - te->destRect.top) / te->lineHeight;
+ else
+ value = te->viewRect.left - te->destRect.left;
+
+ if(value < 0)
+ value = 0;
+ else if(value > max)
+ value = max;
+
+ SetCtlValue(control, value);
+ /* now redraw the control if it needs to be and can be */
+ if(canRedraw || (max != oldMax) || (value != oldValue))
+ ShowControl(control);
+}
+
+/* Simply call the common adjust routine for the vertical and
+ horizontal scrollbars. */
+void
+AdjustScrollValues(WindowPtr window, Boolean canRedraw)
+{
+ Doc* doc;
+
+ doc = (Doc*)window;
+ AdjustHV(true, doc->docVScroll, doc->docTE, canRedraw);
+ AdjustHV(false, doc->docHScroll, doc->docTE, canRedraw);
+}
+
+/* Re-calculate the position and size of the viewRect and the
+ scrollbars. kScrollTweek compensates for off-by-one requirements
+ of the scrollbars to have borders coincide with the growbox. */
+void
+AdjustScrollSizes(WindowPtr window)
+{
+ Rect teRect;
+ Doc* doc;
+
+ doc = (Doc*) window;
+ GetTERect(window, &teRect); /* start with TERect */
+ (*doc->docTE)->viewRect = teRect;
+ AdjustViewRect(doc->docTE); /* snap to nearest line */
+
+ MoveControl(
+ doc->docVScroll,
+ (short)(window->portRect.right - kScrollbarAdjust),
+ (short)-1);
+ SizeControl(
+ doc->docVScroll,
+ (short)kScrollbarWidth,
+ (short)((window->portRect.bottom - window->portRect.top) -
+ (kScrollbarAdjust - kScrollTweek)));
+
+ MoveControl(
+ doc->docHScroll,
+ (short)-1,
+ (short)(window->portRect.bottom - kScrollbarAdjust));
+ SizeControl(
+ doc->docHScroll,
+ (short)((window->portRect.right - window->portRect.left) -
+ (kScrollbarAdjust - kScrollTweek)),
+ (short)kScrollbarWidth);
+}
+
+/* Turn off the controls by jamming a zero into their contrlVis
+ fields (HideControl erases them and we don't want that). If the
+ controls are to be resized as well, call the procedure to do that,
+ then call the procedure to adjust the maximum and current values.
+ Finally re-enable the controls by jamming a $FF in their contrlVis
+ fields. */
+void
+AdjustScrollbars(WindowPtr window, Boolean needsResize)
+{
+ Doc* doc;
+
+ doc = (Doc*)window;
+
+ /* First, turn visibility of scrollbars off so we won't get
+ unwanted redrawing */
+ (*doc->docVScroll)->contrlVis = kControlInvisible; /* turn them off */
+ (*doc->docHScroll)->contrlVis = kControlInvisible;
+ if(needsResize) /* move & size as needed */
+ AdjustScrollSizes(window);
+
+ /* fool with max and current value */
+ AdjustScrollValues(window, needsResize);
+
+ /* Now, restore visibility in case we never had to ShowControl
+ during adjustment */
+ (*doc->docVScroll)->contrlVis = kControlVisible; /* turn them on */
+ (*doc->docHScroll)->contrlVis = kControlVisible;
+}
+
+#if 0
+/* Gets called from our assembly language routine, AsmClikLoop,
+ which is in turn called by the TEClick toolbox routine. Saves
+ the windows clip region, sets it to the portRect, adjusts the
+ scrollbar values to match the TE scroll amount, then restores
+ the clip region. */
+PASCAL_(Boolean)
+PascalClikLoop()
+{
+ WindowPtr window;
+ RgnHandle region;
+
+ window = FrontWindow();
+
+ region = NewRgn();
+ GetClip(region); /* save clip */
+ ClipRect(&window->portRect);
+ AdjustScrollValues(window, true); /* pass true for canRedraw */
+ SetClip(region); /* restore clip */
+ DisposeRgn(region);
+
+ return true;
+}
+#endif
+
+Boolean
+IsAppWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind == userKind);
+}
+
+/* Check to see if a window belongs to a desk accessory. */
+Boolean IsDAWindow(WindowPtr window)
+{
+ /* DA windows have negative windowKinds */
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind < 0);
+}
+
+void
+AlertUser(short error)
+{
+ short itemHit;
+ Str255 message, tmp;
+
+ SetCursor(&qd.arrow);
+ GetIndString(message, kErrStrings, error);
+ tmp[0] = '\0';
+ ParamText(message, tmp, tmp, tmp);
+ itemHit = Alert(rUserAlert, nil);
+}
+
+PASCAL_(OSErr)
+RemoteLowLevelEvt(
+ AppleEvent theAppEvt,
+ AppleEvent reply,
+ long HandlerRefCon)
+{
+ long cb;
+ OSErr err;
+ DescType descType;
+ EventRecord event;
+
+ UNUSED(reply);
+ UNUSED(HandlerRefCon);
+
+ err = AEGetKeyPtr(
+ &theAppEvt,
+ keyDirectObject,
+ typeWildCard,
+ &descType,
+ (Ptr)&event,
+ sizeof(event),
+ &cb);
+
+ if(err != noErr){
+ ASSERT(0);
+ return err;
+ }
+
+ DoEvent(&event);
+
+ return noErr;
+}
+
+void
+InitAE()
+{
+ OSErr err;
+
+ err = AEInstallEventHandler(
+ 'OLE2', 'EVNT', (EventHandlerProcPtr)RemoteLowLevelEvt, 0, false);
+ ASSERT(err == noErr);
+}
+
+
+void
+Init()
+{
+ short count;
+ Handle menuBar;
+ long total, contig;
+ EventRecord event;
+
+ g_fInBackground = false;
+
+#if 0
+ MoreMasters();
+#endif
+ MaxApplZone();
+
+ InitGraf((Ptr)&qd.thePort);
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ TEInit();
+ InitDialogs(nil);
+ InitCursor();
+ FlushEvents(everyEvent, 0);
+ InitCursor();
+
+ // REVIEW: move this above load of Ole?
+ SysEnvirons(kSysEnvironsVersion, &g_sysenv);
+ if (g_sysenv.machineType < 0
+ || g_sysenv.systemVersion < 0x0600
+ || g_sysenv.hasColorQD == false
+ || TrapExists(_WaitNextEvent) == false)
+ {
+ Fatal("System is too whimpy");
+ }
+
+ /* get MultiFinder started */
+ for(count = 1; count <= 3; count++)
+ EventAvail(everyEvent, &event);
+
+ /* make sure we have enough memory to run */
+ if((long)GetApplLimit() - (long)ApplicZone() < kMinHeap)
+ Fatal("Not enough memory to run");
+ PurgeSpace(&total, &contig);
+ if(total < kMinSpace)
+ Fatal("Not enough memory after purge");
+
+ menuBar = GetNewMBar(rMenuBar); /* read menus into menu bar */
+ if(menuBar == nil)
+ Fatal("Unable to load menu bar");
+ SetMenuBar(menuBar);
+ DisposHandle(menuBar);
+ AddResMenu(GetMHandle(mApple), 'DRVR'); /* add DA names to Apple menu */
+ DrawMenuBar();
+
+ DoNew();
+
+#ifdef _MSC_VER
+ DbPrintf("Wings Build\n");
+#else
+ DbPrintf("MPW Build\n");
+#endif
+
+ DbPrintf("InitLibraryManager\n");
+#ifndef _PPCMAC
+ if (InitOleManager(0) != NOERROR)
+ Fatal("Unable to initialize Library Manager");
+ g_fLibrariesLoaded = true;
+#endif
+
+ DbPrintf("Initializing Ole\n");
+ if(InitOle() != NOERROR)
+ Fatal("Failed to initialize Ole");
+ g_fInitOle = true;
+
+ InitAE();
+}
+
+/* Calculate a sleep value for WaitNextEvent. This takes into
+ account the things that DoIdle does with idle time. */
+unsigned long
+GetSleep()
+{
+ long sleep;
+ TEHandle te;
+ WindowPtr window;
+
+ sleep = MAXLONG; /* default value for sleep */
+ if(!g_fInBackground){
+ window = FrontWindow(); /* and the front window is ours... */
+ if(IsAppWindow(window)){
+ /* and the selection is an insertion point... */
+ te = ((Doc*)window)->docTE;
+ if((*te)->selStart == (*te)->selEnd){
+ /* blink time for the insertion point */
+ sleep = GetCaretTime();
+ }
+ }
+ }
+ return sleep;
+}
+
+/* Check the bits of a trap number to determine its type. If bit 11
+ is set, its a Toolbox trap, otherwise its an OS trap. */
+TrapType
+GetTrapType(short theTrap)
+{
+ return ((theTrap & 0x0800) == 0) ? OSTrap : ToolTrap;
+}
+
+/* Find the size of the Toolbox trap table. This can be either 0x0200
+ or 0x0400 bytes, depending on which Macintosh we are running on. We
+ determine the size by taking advantage of an anomaly of the smaller
+ trap table: any entries that fall beyond the end of the table are
+ mirrored back down into the lower part. For example, on a large table,
+ trap numbers A86E and AA6E correspond to different routines. However,
+ on a small table, they correspond to the same routine. By checking
+ the address of these routines, we can determine the size of the
+ table. */
+short
+NumToolboxTraps()
+{
+ return
+ (NGetTrapAddress((short)0xA86E, ToolTrap) ==
+ NGetTrapAddress((short)0xAA6E, ToolTrap)) ? 0x0200 : 0x0400;
+}
+
+/* Check to see if a given trap is implemented */
+Boolean
+TrapExists(short theTrap)
+{
+ TrapType theTrapType;
+
+ theTrapType = GetTrapType(theTrap);
+ if((theTrapType == ToolTrap)
+ && ((theTrap & 0x07FF) >= NumToolboxTraps()))
+ return false;
+ return (NGetTrapAddress((short)_Unimplemented, ToolTrap) !=
+ NGetTrapAddress(theTrap, theTrapType));
+}
+
+
+STDAPI_(void)
+OutputDebugString(const char *sz)
+{
+ long len;
+ TEHandle hTE;
+ WindowPtr window;
+
+ len = strlen(sz);
+
+ window = FrontWindow();
+ if(window == nil)
+ return;
+
+ hTE = ((Doc*)window)->docTE;
+ if(hTE == nil || *hTE == nil)
+ return;
+
+ // if this insertion will cause us to overflow the TextEdit
+ // buffer, then delete enough from the beginning of the buffer
+ // to make room
+
+ if(((long)(*hTE)->teLength + len) > 30000){
+ TESetSelect(0, 15000, hTE);
+ TEDelete(hTE);
+ TESetSelect(30000, 30000, hTE);
+ }
+
+ TEInsert(sz, len, hTE);
+ TESelView(hTE);
+}
+
diff --git a/private/oleauto/tests/disptest/macmain.h b/private/oleauto/tests/disptest/macmain.h
new file mode 100644
index 000000000..fc36822bc
--- /dev/null
+++ b/private/oleauto/tests/disptest/macmain.h
@@ -0,0 +1,191 @@
+
+#ifndef rez // {
+void AlertUser(short error );
+void EventLoop(void );
+void DoEvent( EventRecord *event );
+void AdjustCursor(Point mouse, RgnHandle region );
+void GetGlobalMouse(Point *mouse );
+void DoGrowWindow(WindowPtr window, EventRecord *event );
+void DoZoomWindow(WindowPtr window, short part );
+void ResizeWindow(WindowPtr window );
+void GetLocalUpdateRgn(WindowPtr window, RgnHandle localRgn );
+void DoUpdate(WindowPtr window );
+void DoDeactivate(WindowPtr window );
+void DoActivate(WindowPtr window, Boolean becomingActive);
+void DoContentClick(WindowPtr window, EventRecord *event );
+void DoKeyDown(EventRecord *event );
+void CommonAction(ControlHandle control, short *amount);
+extern "C" PASCAL_(void) VActionProc(ControlHandle control, short part);
+extern "C" PASCAL_(void) HActionProc(ControlHandle control, short part);
+void DoIdle(void );
+void DrawWindow(WindowPtr window );
+void AdjustMenus(void );
+void DoMenuCommand(long menuResult );
+void DoNew(void );
+void Terminate(void );
+void Init(void );
+void BigBadError(short error );
+void GetTERect(WindowPtr window, Rect *teRect );
+void AdjustViewRect(TEHandle docTE );
+void AdjustTE(WindowPtr window );
+void AdjustHV(Boolean isVert, ControlHandle control, TEHandle docTE, Boolean canRedraw );
+void AdjustScrollValues(WindowPtr window, Boolean canRedraw );
+void AdjustScrollSizes(WindowPtr window );
+void AdjustScrollbars(WindowPtr window, Boolean needsResize );
+unsigned long GetSleep(void );
+Boolean DoCloseWindow(WindowPtr window );
+Boolean IsAppWindow(WindowPtr window );
+Boolean IsDAWindow(WindowPtr window );
+Boolean TrapExists(short tNumber);
+PASCAL_(Boolean) PascalClikLoop();
+#endif // }
+
+
+#define kPrefSize 3500
+#define kMinSize 2100
+
+/* The following constants are used to identify menus and their items.
+ The menu IDs have an "m" prefix and the item numbers within each menu
+ have an "i" prefix. */
+#define mApple 128 /* Apple menu */
+#define iAbout 1
+
+#define mFile 129 /* File menu */
+#define iNew 1
+#define iClose 4
+#define iQuit 12
+
+#define mEdit 130 /* Edit menu */
+#define iUndo 1
+#define iCut 3
+#define iCopy 4
+#define iPaste 5
+#define iClear 6
+
+#define mSuite 131
+#define iBstrAPI 1
+#define iTimeAPI 2
+#define iDateCnv 3
+#define iVariantAPI 4
+#define iSafeArrayAPI 5
+#define iNlsAPI 6
+#define iBinding 7
+#define iInvokeByVal 8
+#define iInvokeByRef 9
+#define iInvokeArray 10
+#define iInvokeExinfo 11
+#define iCollections 12
+
+#define mOptions 132
+#define iClearAll 1
+#define iDebugger 2
+
+#define kDITop 0x0050
+#define kDILeft 0x0070
+
+/* kTextMargin is the number of pixels we leave blank at the edge
+ of the window. */
+#define kTextMargin 2
+
+/* kMaxOpenDocs is used to determine whether a new document can be
+ opened or created. We keep track of the number of open documents, and
+ disable the menu items that create a new document when the maximum is
+ reached. If the number of documents falls below the maximum, the items
+ are enabled again. */
+#define kMaxOpenDocs 1
+
+/* kMaxDocWidth is an arbitrary number used to specify the width of the
+ TERec's destination rectangle so that word wrap and horizontal scrolling
+ can be demonstrated. */
+#define kMaxDocWidth 576
+
+/* kMinDocDim is used to limit the minimum dimension of a window when
+ GrowWindow is called. */
+#define kMinDocDim 64
+
+/* kControlInvisible is used to 'turn off' controls (i.e., cause the
+ control not to be redrawn as a result of some Control Manager call
+ such as SetCtlValue) by being put into the contrlVis field of the
+ record. kControlVisible is used the same way to 'turn on' the control. */
+#define kControlInvisible 0
+#define kControlVisible 0xFF
+
+/* kScrollbarAdjust and kScrollbarWidth are used in calculating
+ values for control positioning and sizing. */
+#define kScrollbarWidth 16
+#define kScrollbarAdjust (kScrollbarWidth - 1)
+
+/* kScrollTweek compensates for off-by-one requirements of the
+ scrollbars to have borders coincide with the growbox. */
+#define kScrollTweek 2
+
+/* kCrChar is used to match with a carriage return when calculating
+ the number of lines in the TextEdit record. kDelChar is used to
+ check for delete in keyDowns. */
+#define kCrChar 13
+#define kDelChar 8
+
+/* kButtonScroll is how many pixels to scroll horizontally when the
+ button part of the horizontal scrollbar is pressed. */
+#define kButtonScroll 4
+
+/* kMaxTELength is an arbitrary number used to limit the length of text
+ in the TERec so that various errors won't occur from too many characters
+ in the text. */
+#define kMaxTELength 32000
+
+/* kSysEnvironsVersion is passed to SysEnvirons to tell it which version of the
+ SysEnvRec we understand. */
+#define kSysEnvironsVersion 1
+
+/* kOSEvent is the event number of the suspend/resume and mouse-moved
+ events sent by MultiFinder. Once we determine that an event is an
+ OSEvent, we look at the high byte of the message sent to determine
+ which kind it is. To differentiate suspend and resume events we check
+ the resumeMask bit. */
+#define kOSEvent app4Evt /* event used by MultiFinder */
+
+/* high byte of suspend/resume event message */
+#define kSuspendResumeMessage 1
+
+/* bit of message field for resume vs. suspend */
+#define kResumeMask 1
+
+/* high byte of mouse-moved event message */
+#define kMouseMovedMessage 0xFA
+
+#define kNoEvents 0 /* no events mask */
+
+
+#define kMinHeap (29 * 1024)
+
+#define kMinSpace (20 * 1024)
+
+/* kExtremeNeg and kExtremePos are used to set up wide open rectangles
+ and regions. */
+#define kExtremeNeg -32768
+#define kExtremePos (32767 - 1) /* required to address an old region bug */
+
+/* kTESlop provides some extra security when pre-flighting edit commands. */
+#define kTESlop 1024
+
+/* The following are indicies into STR# resources. */
+#define eWrongMachine 1
+#define eSmallSize 2
+#define eNoMemory 3
+#define eNoSpaceCut 4
+#define eNoCut 5
+#define eNoCopy 6
+#define eExceedPaste 7
+#define eNoSpacePaste 8
+#define eNoWindow 9
+#define eExceedChar 10
+#define eNoPaste 11
+
+#define rMenuBar 128 /* application's menu bar */
+#define rAboutAlert 128 /* about alert */
+#define rUserAlert 129 /* user error alert */
+#define rDocWindow 128 /* application's window */
+#define rVScroll 128 /* vertical scrollbar control */
+#define rHScroll 129 /* horizontal scrollbar control */
+#define kErrStrings 128 /* error string list */
diff --git a/private/oleauto/tests/disptest/makefile b/private/oleauto/tests/disptest/makefile
new file mode 100644
index 000000000..e9e562dfc
--- /dev/null
+++ b/private/oleauto/tests/disptest/makefile
@@ -0,0 +1,552 @@
+##############################################################################
+#
+# (c) Copyright Microsoft Corp. 1992-1993 All Rights Reserved
+#
+# File:
+#
+# makefile - makefile for cdisptst.exe
+#
+# Purpose:
+#
+# Builds the OLE Automation test apps, cdisptst.exe.
+#
+#
+# Usage:
+#
+# NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option: dev = [win16 | win32 | mac] ; dev=win16 is the default
+#
+#
+# Notes:
+#
+# This makefile assumes that the PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+#
+# Revision History:
+#
+# [00] 21-Sep-92 bradlo: Created
+# [00] 1-Mar-93 tometeng: Update for Win32 build
+#
+##############################################################################
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if !defined(OLEPROG)
+!error OLEPROG environment variable not set
+!endif
+
+TESTS = $(OLEPROG)\TESTS
+!INCLUDE $(OLEPROG)\TESTS\OLEPROG.MAK
+
+APPS = cdisptst
+
+
+##########################################################################
+#
+# Common Directories
+#
+
+SRCDIR = $(TESTS)\DISPTEST
+COMDIR = $(TESTS)\COMMON
+
+
+##########################################################################
+#
+# Local WIN16 Settings
+#
+!if "$(TARG)" == "WIN16"
+
+OBJDIR = $(SRCDIR)\win16
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+GOAL = $(OBJDIR)\$(APPS).exe
+
+LCFLAGS = -Fo$(OBJDIR)\ -Fd$(OBJDIR)\cdsptst.pdb -AM -GA -GEs -I$(COMDIR)
+
+INCPATHS = $(INCPATHS);$(OLEPROG)\TESTS\COMMON
+
+CLIBS = \
+ $(OLEPROG)\tools\win16\hdos\c800\lib\libw.lib \
+ $(OLEPROG)\tools\win16\hdos\c800\lib\mlibcew.lib \
+ $(OLEPROG)\tools\win16\hdos\c800\lib\shell.lib
+
+OLELIBS = \
+ $(OLEPROG)\ole\win16\lib\ole2.lib \
+ $(OLEPROG)\ole\win16\lib\compobj.lib \
+ $(OLEPROG)\dwin16\ole2disp.lib \
+ $(OLEPROG)\dwin16\ole2nls.lib
+
+OBJS = $(OBJDIR)\assert.obj \
+ $(OBJDIR)\dispdbug.obj \
+ $(OBJDIR)\dballoc.obj \
+# $(OBJDIR)\dispbind.obj \
+ $(OBJDIR)\cunk.obj \
+ $(OBJDIR)\cdisp.obj \
+ $(OBJDIR)\testhelp.obj \
+ $(OBJDIR)\util.obj \
+ $(OBJDIR)\suite.obj \
+ $(OBJDIR)\disptest.obj \
+ $(OBJDIR)\disphelp.obj \
+ $(OBJDIR)\crempoly.obj \
+ $(OBJDIR)\cbstr.obj \
+ $(OBJDIR)\cdatecnv.obj \
+ $(OBJDIR)\ctime.obj \
+ $(OBJDIR)\cnls.obj \
+ $(OBJDIR)\cvariant.obj \
+ $(OBJDIR)\cbind.obj \
+ $(OBJDIR)\cinvsary.obj \
+ $(OBJDIR)\cinvval.obj \
+ $(OBJDIR)\cinvref.obj \
+ $(OBJDIR)\cinvex.obj \
+ $(OBJDIR)\csarray.obj \
+ $(OBJDIR)\ccollect.obj \
+ $(OBJDIR)\cearly.obj \
+ $(OBJDIR)\misc.obj \
+ $(OBJDIR)\guid.obj
+
+$(OBJDIR)\$(APPS).exe : \
+ $(OBJS) \
+ $(CLIBS) \
+ $(OLELIBS) \
+ $(OBJDIR)\$(APPS).res
+ $(LD) $(LFLAGS) $(LNOI) @<<$(OBJDIR)\cdisptst.lnk
+$(OBJS: = +^
+)
+$@,
+$(OBJDIR)\$(APPS).map,
+$(CLIBS) +
+$(OLELIBS),
+$(SRCDIR)\$(APPS).def
+<<KEEP
+ rc -k -t $(OBJDIR)\$(APPS).res $@
+
+$(OBJDIR)\$(APPS).res : \
+ $(SRCDIR)\resource.h \
+ $(COMDIR)\assert.dlg \
+ $(SRCDIR)\$(APPS).rc
+ rc $(RCFLAGS) -r -fo$@ $(SRCDIR)\$(APPS).rc
+
+!endif
+
+
+##########################################################################
+#
+# WIN32 Settings
+#
+!if "$(TARG)" == "WIN32"
+
+OBJDIR = $(SRCDIR)\win32
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+GOAL = $(OBJDIR)\$(APPS).exe
+
+LCFLAGS = -Fo$(OBJDIR)\ -I$(COMDIR)
+
+INCPATHS = $(INCPATHS);$(OLEPROG)\TESTS\COMMON
+
+LIBS = \
+ libcmt.lib \
+ kernel32.lib \
+ user32.lib \
+ gdi32.lib \
+ ole32.lib \
+ $(OLEPROG)\dwin32\oleaut32.lib \
+ uuid.lib
+
+
+OBJS = $(OBJDIR)\assert.obj \
+ $(OBJDIR)\dispdbug.obj \
+ $(OBJDIR)\dballoc.obj \
+ $(OBJDIR)\nlshelp.obj \
+# $(OBJDIR)\dispbind.obj \
+ $(OBJDIR)\cunk.obj \
+ $(OBJDIR)\cdisp.obj \
+ $(OBJDIR)\testhelp.obj \
+ $(OBJDIR)\util.obj \
+ $(OBJDIR)\suite.obj \
+ $(OBJDIR)\disptest.obj \
+ $(OBJDIR)\disphelp.obj \
+ $(OBJDIR)\crempoly.obj \
+ $(OBJDIR)\cbstr.obj \
+ $(OBJDIR)\cdatecnv.obj \
+ $(OBJDIR)\ctime.obj \
+ $(OBJDIR)\cvariant.obj \
+ $(OBJDIR)\cbind.obj \
+ $(OBJDIR)\cinvsary.obj \
+ $(OBJDIR)\cinvval.obj \
+ $(OBJDIR)\cinvref.obj \
+ $(OBJDIR)\cinvex.obj \
+ $(OBJDIR)\csarray.obj \
+ $(OBJDIR)\ccollect.obj \
+ $(OBJDIR)\cearly.obj \
+ $(OBJDIR)\misc.obj \
+ $(OBJDIR)\cnls.obj \
+ $(OBJDIR)\guid.obj
+
+$(OBJDIR)\$(APPS).exe : \
+ $(OBJS) \
+ $(SRCDIR)\$(APPS).def \
+ $(OBJDIR)\$(APPS).res
+ cvtres -$(CPU) $(OBJDIR)\$(APPS).res -o $(OBJDIR)\$(APPS).rs
+ $(LD) @<<
+ -entry:WinMainCRTStartup
+ -out:$@
+ -map:$*.map
+ -nodefaultlib
+ $(LFLAGS)
+ $(OBJS)
+ $(OBJDIR)\$(APPS).rs
+ $(LIBS)
+<<
+
+$(OBJDIR)\$(APPS).res : $(SRCDIR)\$(APPS).rc $(SRCDIR)\resource.h
+ rc $(RCFLAGS) -r -fo$@ $(SRCDIR)\$(APPS).rc
+
+!endif
+
+
+##########################################################################
+#
+# MAC Settings
+#
+!if "$(TARG)" == "MAC"
+
+OASRC = $(DISPDIR)\mac
+
+!if "$(TARGCPU)"=="PPC"
+OBJDIR = $(SRCDIR)\macppc
+!else
+OBJDIR = $(SRCDIR)\mac
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+MACLIBDIR = $(VBATOOLS)\win32\$(COMPILER)\LIB
+
+!if "$(TARGCPU)"=="PPC"
+LCFLAGS = -Fd$(OBJDIR)\cdisptst.pdb -Fo$(OBJDIR)\ -D _SLM
+!else
+LCFLAGS = -AL -Gt1 -Fd$(OBJDIR)\cdisptst.pdb -Fo$(OBJDIR)\ -D _SLM
+!endif
+
+
+INCPATHS = $(INCPATHS);$(OLEPROG)\TESTS\COMMON;$(VBATOOLS)\win32\$(COMPILER)\INC\MRC
+
+LIBS = \
+ $(MACLIBDIR)\interfac.lib \
+!if "$(TARGCPU)"=="PPC"
+ ole2auto.lib \
+ ole2.lib \
+ $(MACLIBDIR)\mprof.lib \
+ $(MACLIBDIR)\libc.lib
+!else
+ $(MACLIBDIR)\wlm.lib \
+!if ("$(SWAP)" == "1")
+ $(MACLIBDIR)\llibcs.lib \
+ $(MACLIBDIR)\lsanes.lib \
+ $(MACLIBDIR)\swap.lib
+!else
+ $(MACLIBDIR)\llibc.lib \
+ $(MACLIBDIR)\lsane.lib
+!endif
+
+OLEOBJS = \
+!if ("$(SWAP)" == "1")
+ $(OLEDIR)\olelds.obj $(OLEDIR)\oalds.obj
+!else
+ $(OLEDIR)\olendf.obj $(OLEDIR)\oandf.obj
+!endif
+
+!endif # TARGCPU=PPC
+
+
+
+STATIC_OBJS = \
+ $(OBJDIR)\assert.obj \
+ $(OBJDIR)\dispdbug.obj \
+ $(OBJDIR)\macmain.obj \
+ $(OBJDIR)\suite.obj \
+ $(OBJDIR)\dballoc.obj \
+ $(OBJDIR)\cunk.obj \
+ $(OBJDIR)\cdisp.obj \
+ $(OBJDIR)\testhelp.obj \
+ $(OBJDIR)\util.obj \
+ $(OBJDIR)\cbstr.obj \
+ $(OBJDIR)\cdatecnv.obj \
+ $(OBJDIR)\ctime.obj \
+ $(OBJDIR)\cnls.obj \
+ $(OBJDIR)\cvariant.obj \
+ $(OBJDIR)\csarray.obj \
+ $(OBJDIR)\misc.obj \
+ $(OBJDIR)\guid.obj \
+ $(OBJDIR)\oleguids.obj
+
+DLL_OBJS = \
+ $(OBJDIR)\disphelp.obj \
+ $(OBJDIR)\crempoly.obj \
+ $(OBJDIR)\cbind.obj \
+ $(OBJDIR)\cinvsary.obj \
+ $(OBJDIR)\cinvval.obj \
+ $(OBJDIR)\ccollect.obj \
+ $(OBJDIR)\cinvref.obj \
+ $(OBJDIR)\cinvex.obj
+
+OBJS = \
+ $(STATIC_OBJS) \
+ $(DLL_OBJS)
+
+
+$(OBJDIR)\$(APPS).exe : \
+ $(OBJS) \
+ $(OLEOBJS) \
+ $(OBJDIR)\$(APPS).x
+ $(LD) @<<
+ $(OBJS)
+ $(OLEOBJS)
+ $(LIBS)
+!if "$(TARGCPU)"=="PPC"
+ -machine:mppc
+!else
+ -machine:m68k
+!endif
+ -entry:mainCRTStartup
+ -debug:full
+ -debugtype:cv
+ -nopack
+ -nodefaultlib
+ -out:$@
+ -map:$*.map
+<<KEEP
+ cvpack $(OBJDIR)\$(APPS).exe
+
+
+$(OBJDIR)\$(APPS).x : $(SRCDIR)\$(APPS).r
+!if "$(TARGCPU)" == "PPC"
+ mrc -s$(VBATOOLS)\win32\ppc\lib -D_PPCMAC -o $(OBJDIR)\$(APPS).x $(SRCDIR)\$(APPS).r
+!else
+ mrc -D_MAC -o $(OBJDIR)\$(APPS).x $(SRCDIR)\$(APPS).r
+!endif
+
+!if "$(TARGCPU)" == "PPC"
+GOAL = $(OBJDIR)\$(APPS).pef
+
+$(OBJDIR)\$(APPS) : $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).x
+ copy $(OBJDIR)\$(APPS).x $(OBJDIR)\$(APPS)
+ makepef $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).pef
+
+!else
+
+GOAL = $(OBJDIR)\$(APPS)
+
+$(OBJDIR)\$(APPS) : $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).x
+ copy $(OBJDIR)\$(APPS).x $(OBJDIR)\$(APPS)
+ mrc -e $(OBJDIR)\$(APPS).exe -a -o $(OBJDIR)\$(APPS)
+
+!endif
+
+$(OBJDIR)\oleguids.obj : $(SRCDIR)\oleguids.c $(SRCDIR)\oleguids.h
+ $(CC) -c $(SRCDIR)\oleguids.c
+
+$(OBJDIR)\macmain.obj : $(SRCDIR)\macmain.h $(SRCDIR)\macmain.cpp
+ $(CCPP) -c $(SRCDIR)\macmain.cpp
+
+!endif
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+all : setflags $(GOAL)
+
+setflags :
+ set CL=$(CFLAGS) $(LCFLAGS)
+ set LIB=$(LIBPATHS)
+ set PATH=$(BINPATHS)
+ set INCLUDE=$(INCPATHS)
+
+
+##########################################################################
+#
+# Clean (erase) generated files
+#
+clean :
+ -erase $(OBJDIR)\*.obj
+ -erase $(OBJDIR)\*.lib
+ -erase $(OBJDIR)\*.dll
+ -erase $(OBJDIR)\*.exe
+ -erase $(OBJDIR)\*.map
+ -erase $(OBJDIR)\*.res
+ -erase $(OBJDIR)\*.rs
+ -erase $(OBJDIR)\*.lnk
+ -erase $(OBJDIR)\*.rpp
+ -erase $(OBJDIR)\*.x
+
+
+##########################################################################
+#
+# Dependencies
+#
+
+$(OBJDIR)\disptest.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\resource.h \
+ $(SRCDIR)\disptest.cpp
+ $(CCPP) -c $(SRCDIR)\disptest.cpp
+
+$(OBJDIR)\suite.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\resource.h \
+ $(SRCDIR)\suite.cpp
+ $(CCPP) -c $(SRCDIR)\suite.cpp
+
+$(OBJDIR)\misc.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\misc.cpp
+ $(CCPP) -c $(SRCDIR)\misc.cpp
+
+$(OBJDIR)\guid.obj : \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\clsid.h \
+ $(SRCDIR)\guid.c
+ $(CCPP) -c $(SRCDIR)\guid.c
+
+$(OBJDIR)\cbstr.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cbstr.cpp
+ $(CCPP) -c $(SRCDIR)\cbstr.cpp
+
+$(OBJDIR)\cwbstr.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cwbstr.cpp
+ $(CCPP) -c $(SRCDIR)\cwbstr.cpp
+
+$(OBJDIR)\cdatecnv.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cdatecnv.cpp
+ $(CCPP) -c $(SRCDIR)\cdatecnv.cpp
+
+$(OBJDIR)\ctime.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\ctime.cpp
+ $(CCPP) -c $(SRCDIR)\ctime.cpp
+
+$(OBJDIR)\cnls.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cnls.cpp
+ $(CCPP) -c $(SRCDIR)\cnls.cpp
+
+$(OBJDIR)\cbind.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cbind.cpp
+ $(CCPP) -c $(SRCDIR)\cbind.cpp
+
+$(OBJDIR)\cvariant.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cvariant.cpp
+ $(CCPP) -c $(SRCDIR)\cvariant.cpp
+
+$(OBJDIR)\csarray.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\csarray.cpp
+ $(CCPP) -c $(SRCDIR)\csarray.cpp
+
+$(OBJDIR)\cinvval.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cinvval.cpp
+ $(CCPP) -c $(SRCDIR)\cinvval.cpp
+
+$(OBJDIR)\cinvref.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cinvref.cpp
+ $(CCPP) -c $(SRCDIR)\cinvref.cpp
+
+$(OBJDIR)\cinvsary.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cinvsary.cpp
+ $(CCPP) -c $(SRCDIR)\cinvsary.cpp
+
+$(OBJDIR)\cinvex.obj : \
+ $(SRCDIR)\disptest.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cinvex.cpp
+ $(CCPP) -c $(SRCDIR)\cinvex.cpp
+
+$(OBJDIR)\ccollect.obj : \
+ $(SRCDIR)\disptest.h \
+ $(COMDIR)\crempoly.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\ccollect.cpp
+ $(CCPP) -c $(SRCDIR)\ccollect.cpp
+
+$(OBJDIR)\cearly.obj : \
+ $(SRCDIR)\disptest.h \
+ $(COMDIR)\dualtst.h \
+ $(SRCDIR)\tstsuite.h \
+ $(SRCDIR)\cearly.cpp
+ $(CCPP) -c $(SRCDIR)\cearly.cpp
+
+$(OBJDIR)\cunk.obj : $(COMDIR)\cunk.h $(COMDIR)\cunk.cpp
+ $(CCPP) -c $(COMDIR)\cunk.cpp
+
+$(OBJDIR)\cdisp.obj : $(COMDIR)\cdisp.h $(COMDIR)\cdisp.cpp
+ $(CCPP) -c $(COMDIR)\cdisp.cpp
+
+$(OBJDIR)\testhelp.obj : $(COMDIR)\testhelp.h $(COMDIR)\testhelp.cpp
+ $(CCPP) -c $(COMDIR)\testhelp.cpp
+
+$(OBJDIR)\util.obj : $(COMDIR)\common.h $(COMDIR)\util.cpp
+ $(CCPP) -c $(COMDIR)\util.cpp
+
+$(OBJDIR)\crempoly.obj : $(COMDIR)\crempoly.h $(COMDIR)\crempoly.cpp
+ $(CCPP) -c $(COMDIR)\crempoly.cpp
+
+$(OBJDIR)\disphelp.obj : $(COMDIR)\disphelp.h $(COMDIR)\disphelp.cpp
+ $(CCPP) -c $(COMDIR)\disphelp.cpp
+
+#$(OBJDIR)\dispbind.obj : $(COMDIR)\dispbind.cpp
+# $(CCPP) -c $(COMDIR)\dispbind.cpp
+
+$(OBJDIR)\assert.obj : \
+ $(COMDIR)\assrtdlg.h \
+ $(COMDIR)\assert.cpp
+ $(CCPP) -c $(COMDIR)\assert.cpp
+
+$(OBJDIR)\nlshelp.obj : \
+ $(COMDIR)\common.h \
+ $(COMDIR)\nlshelp.cpp
+ $(CCPP) -c $(COMDIR)\nlshelp.cpp
+
+$(OBJDIR)\dispdbug.obj : \
+ $(COMDIR)\common.h \
+ $(COMDIR)\dispdbug.h \
+ $(COMDIR)\dispdbug.cpp
+ $(CCPP) -c $(COMDIR)\dispdbug.cpp
+
+$(OBJDIR)\dballoc.obj : $(COMDIR)\dballoc.h $(COMDIR)\dballoc.cpp
+ $(CCPP) -c $(COMDIR)\dballoc.cpp
diff --git a/private/oleauto/tests/disptest/makefile.mpw b/private/oleauto/tests/disptest/makefile.mpw
new file mode 100644
index 000000000..ab3fb0a6e
--- /dev/null
+++ b/private/oleauto/tests/disptest/makefile.mpw
@@ -0,0 +1,181 @@
+#***
+#makefile.mpw
+#
+# Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+#
+#Purpose:
+# Makefile for the Ole Automation Test App (Client), cdisptst
+#
+#
+#Implementation Notes:
+#
+#****************************************************************************/
+
+OleRoot = HD:Ole2:
+
+OleIncDir= {OleRoot}MPW:Interfaces:CIncludes:
+OleLibDir= {OleRoot}MPW:Libraries:CLibraries:
+
+Common = hd:ole2auto:tests:common:
+ObjDir = hd:ole2auto:build:cdisptst:d:
+BinDir = hd:ole2auto:bin:
+
+defs = -d _MAC -d _DEBUG
+incs = -i {CIncludes} -i {OleIncDir} -i {Common}
+
+cflags = -mf -w3 -z6 -model far -sym full -mbg full {defs} {incs}
+cppflags = -mf -w3 -z6 -model far -sym full -mbg full {defs} {incs}
+
+pch = -load {ObjDir}disptest.h.dump
+
+AppleLibObjs = \
+ "{Libraries}"Runtime.o \
+ "{Libraries}"Interface.o \
+ "{CLibraries}"CPluslib.o \
+ "{CLibraries}"Math.o \
+ "{CLibraries}"CSANELib.o \
+ "{CLibraries}"StdCLib.o
+
+OleLibs = \
+ {OleLibDir}LibraryManager.o \
+ {OleLibDir}CompObjLib.cl.o \
+ {OleLibDir}DefLib.cl.o \
+ {OleLibDir}ole2nlsLib.cl.o \
+ {OleLibDir}ole2dispLib.cl.o
+
+pchObjs = \
+ {ObjDir}disptest.h.o
+
+commonObjs = \
+ {ObjDir}assert.cpp.o \
+ {ObjDir}cdisp.cpp.o \
+ {ObjDir}crempoly.cpp.o \
+ {ObjDir}cunk.cpp.o \
+ {ObjDir}dballoc.cpp.o \
+ {ObjDir}dispdbug.cpp.o \
+ {ObjDir}disphelp.cpp.o \
+ {ObjDir}testhelp.cpp.o \
+ {ObjDir}util.cpp.o
+
+Objs = \
+ {pchObjs} \
+ {commonObjs} \
+ {ObjDir}guid.c.o \
+ {ObjDir}oleguids.c.o \
+ {ObjDir}cbind.cpp.o \
+ {ObjDir}cbstr.cpp.o \
+ {ObjDir}ccollect.cpp.o \
+ {ObjDir}cdatecnv.cpp.o \
+ {ObjDir}cinvsary.cpp.o \
+ {ObjDir}cinvval.cpp.o \
+ {ObjDir}cinvref.cpp.o \
+ {ObjDir}cinvex.cpp.o \
+ {ObjDir}cnls.cpp.o \
+ {ObjDir}csarray.cpp.o \
+ {ObjDir}ctime.cpp.o \
+ {ObjDir}cvariant.cpp.o \
+ {ObjDir}macmain.cpp.o \
+ {ObjDir}misc.cpp.o \
+ {ObjDir}suite.cpp.o
+
+
+all ^ {ObjDir}cdisptst
+
+
+{ObjDir}cdisptst ^^ {Objs} {ObjDir}AppleLib.o {OleLibs} cdisptst.r resource.h
+ Link -model far -d -o {targ} -sym full {Objs} {ObjDir}AppleLib.o {OleLibs}
+ SetFile {targ} -t APPL -c 'CDSP' -a B
+ Rez -d _MAC -rd -append -o {targ} cdisptst.r
+ Duplicate -y {targ} {BinDir}
+ Duplicate -y {targ}.SYM {BinDir}
+
+{ObjDir}AppleLib.o ^ {AppleLibObjs}
+ Lib -o {ObjDir}AppleLib.o {AppleLibObjs}
+
+
+## precompiled header
+
+{ObjDir}disptest.h.o ^ disptest.h
+ cplus disptest.h -o {targ} {cppflags} -dumpc {ObjDir}disptest.h.dump
+
+
+{ObjDir}guid.c.o ^ guid.c
+ cplus guid.c -o {targ} {cppflags}
+
+{ObjDir}oleguids.c.o ^ oleguids.c oleguids.h
+ cplus oleguids.c -o {targ} {cppflags}
+
+
+{ObjDir}assert.cpp.o ^ {Common}assert.cpp
+ cplus {Common}assert.cpp -o {targ} {cppflags}
+
+{ObjDir}crempoly.cpp.o ^ {Common}crempoly.cpp disptest.h
+ cplus {Common}crempoly.cpp -o {targ} {cppflags}
+
+{ObjDir}cunk.cpp.o ^ {Common}cunk.cpp {Common}cunk.h
+ cplus {Common}cunk.cpp -o {targ} {cppflags}
+
+{ObjDir}cdisp.cpp.o ^ {Common}cdisp.cpp {Common}cdisp.h
+ cplus {Common}cdisp.cpp -o {targ} {cppflags}
+
+{ObjDir}dballoc.cpp.o ^ {Common}dballoc.cpp {Common}dballoc.h
+ cplus {Common}dballoc.cpp -o {targ} {cppflags}
+
+{ObjDir}dispdbug.cpp.o ^ {Common}dispdbug.cpp disptest.h
+ cplus {Common}dispdbug.cpp -o {targ} {cppflags}
+
+{ObjDir}disphelp.cpp.o ^ {Common}disphelp.cpp disptest.h
+ cplus {Common}disphelp.cpp -o {targ} {cppflags}
+
+{ObjDir}testhelp.cpp.o ^ {Common}testhelp.cpp disptest.h
+ cplus {Common}testhelp.cpp -o {targ} {cppflags}
+
+{ObjDir}util.cpp.o ^ {Common}util.cpp disptest.h
+ cplus {Common}util.cpp -o {targ} {cppflags}
+
+
+{ObjDir}cbind.cpp.o ^ cbind.cpp disptest.h
+ cplus cbind.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cbstr.cpp.o ^ cbstr.cpp disptest.h
+ cplus cbstr.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}ccollect.cpp.o ^ ccollect.cpp disptest.h
+ cplus ccollect.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cdatecnv.cpp.o ^ cdatecnv.cpp disptest.h
+ cplus cdatecnv.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cinvsary.cpp.o ^ cinvsary.cpp disptest.h
+ cplus cinvsary.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cinvval.cpp.o ^ cinvval.cpp disptest.h
+ cplus cinvval.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cinvref.cpp.o ^ cinvref.cpp disptest.h
+ cplus cinvref.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cinvex.cpp.o ^ cinvex.cpp disptest.h
+ cplus cinvex.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cnls.cpp.o ^ cnls.cpp disptest.h
+ cplus cnls.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}csarray.cpp.o ^ csarray.cpp disptest.h
+ cplus csarray.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}ctime.cpp.o ^ ctime.cpp disptest.h
+ cplus ctime.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cvariant.cpp.o ^ cvariant.cpp disptest.h
+ cplus cvariant.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}macmain.cpp.o ^ macmain.cpp disptest.h
+ cplus macmain.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}misc.cpp.o ^ misc.cpp disptest.h
+ cplus misc.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}suite.cpp.o ^ suite.cpp disptest.h
+ cplus suite.cpp -o {targ} {pch} {cppflags}
+
diff --git a/private/oleauto/tests/disptest/misc.cpp b/private/oleauto/tests/disptest/misc.cpp
new file mode 100644
index 000000000..d5773d13a
--- /dev/null
+++ b/private/oleauto/tests/disptest/misc.cpp
@@ -0,0 +1,271 @@
+/***
+*misc.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Misc DispTest helpers and initialization functions.
+*
+*Revision History:
+*
+* [00] 02-Oct-92 bradlo: Created
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "disptest.h"
+#include "dballoc.h"
+
+ASSERTDATA
+
+extern int g_fDetectLeaks;
+
+#if OE_WIN32
+extern CRITICAL_SECTION g_csDbPrintf;
+#endif // OE_WIN32
+
+int g_fLog = TRUE;
+
+OLECHAR FAR* g_szCPoly = OLESTR("spoly.cpoly");
+OLECHAR FAR* g_szCSArray = OLESTR("sdisptst.csarray");
+OLECHAR FAR* g_szCDispTst = OLESTR("sdisptst.cdisptst");
+OLECHAR FAR* g_szCExcepinfo = OLESTR("sdisptst.cexcepinfo");
+OLECHAR FAR* g_szCWExcepinfo = OLESTR("sdisptst.cwexcepinfo");
+
+#if OE_WIN32
+unsigned long g_itlsAppData = ~(ULONG)0;
+#else // !OE_WIN32
+APP_DATA g_appdata;
+#endif // !OE_WIN32
+
+APP_DATA *Pappdata()
+{
+#if OE_WIN32
+ return (APP_DATA *)TlsGetValue(g_itlsAppData);
+#else // !OE_WIN32
+ return &g_appdata;
+#endif // !OE_WIN32
+}
+
+
+BOOL InitAppData()
+{
+#if OE_WIN32
+ APP_DATA *pappdata;
+
+ if (g_itlsAppData == ~(ULONG)0) {
+ if ((g_itlsAppData = TlsAlloc()) == ~(ULONG)0) {
+ return FALSE;
+ }
+ }
+
+ ASSERT(TlsGetValue(g_itlsAppData) == NULL);
+
+ pappdata = new APP_DATA;
+
+ if (pappdata == NULL) {
+ return FALSE;
+ }
+
+ TlsSetValue(g_itlsAppData, (LPVOID)pappdata);
+#endif // OE_WIN32
+
+ return TRUE;
+}
+
+VOID ReleaseAppData()
+{
+#if OE_WIN32
+ ASSERT(g_itlsAppData != ~(ULONG)0);
+
+ delete Pappdata();
+ TlsSetValue(g_itlsAppData, NULL);
+#endif // OE_WIN32
+}
+
+STDAPI
+InitOle()
+{
+ HRESULT hresult;
+ IMalloc FAR* pmalloc;
+
+ pmalloc = NULL;
+
+#if OE_MAC
+
+#if 0
+ OSErr oserr = LoadAllLibraries();
+ if(oserr != noErr){
+ hresult = ResultFromScode(E_FAIL);
+ goto LError0;
+ }
+#endif
+
+#else
+
+#if !OE_WIN32 // latest OLE complains about our allocs not being
+ // properly aligned (it wants 8-byte alignment even
+ // on x86). New OLE debug allocator is pretty good
+ // now, so we'll just use theirs.
+ unsigned long options = DBALLOC_NONE;
+
+ if(g_fDetectLeaks)
+ options |= DBALLOC_DETECTLEAKS;
+
+ IfFailGo(CreateDbAlloc(options, NULL, &pmalloc), LError0);
+#endif //!OE_WIN32
+
+#endif
+
+ hresult = OleInitialize(pmalloc);
+
+#if !OE_WIN32
+LError0:;
+#endif // !OE_WIN32
+
+ if(pmalloc != NULL)
+ pmalloc->Release();
+
+ return hresult;
+}
+
+STDAPI_(void)
+UninitOle()
+{
+ OleUninitialize();
+}
+
+void
+PrintSuiteHeader(TCHAR FAR* szFmt, ...)
+{
+ int i, len;
+ va_list args;
+ TCHAR rgch[256];
+
+ va_start(args, szFmt);
+#if OE_MAC
+ vsprintf(rgch, szFmt, args);
+#else
+ wvsprintf(rgch, szFmt, args);
+#endif
+
+ DbPrintf("\n\nSuite : ");
+ DbPrintf((char FAR*)rgch);
+ DbPrintf("\n");
+ len = STRLEN(rgch) + 8;
+ for(i = 0; i < len+8; ++i)
+ rgch[i] = TSTR('-');
+ rgch[i] = TSTR('\n');
+ rgch[i+1] = TSTR('\0');
+ DbPrintf((char FAR*) rgch);
+}
+
+void
+PrintTestHeader(TCHAR FAR* szFmt, ...)
+{
+ va_list args;
+ TCHAR rgch[256];
+
+ va_start(args, szFmt);
+#if OE_MAC
+ vsprintf(rgch, szFmt, args);
+#else
+ wvsprintf(rgch, szFmt, args);
+#endif
+ DbPrintf("Test : ");
+ DbPrintf((char FAR*)rgch);
+ DbPrintf("\n");
+}
+
+
+#if OE_MAC
+STDAPI_(void) OutputDebugString(const OLECHAR*);
+#endif
+
+
+extern "C" void
+DbPrintf(char FAR* szFmt, ...)
+{
+ int len;
+ va_list args;
+ char *pn, FAR* pf;
+ static char rgchFmtBuf[512];
+ static char rgchOutputBuf[1024];
+
+#if OE_WIN32
+ EnterCriticalSection(&g_csDbPrintf);
+#endif // OE_WIN32
+
+#if HC_MPW
+
+ // translate all instances of %Fs to %s
+
+ for(pf=szFmt, pn=rgchFmtBuf; *pf != '\0';){
+
+ if(pf[0] == '%' && pf[1] == 'F' && pf[2] == 's'){
+ pn[0] = '%';
+ pn[1] = 's';
+ pf += 3;
+ pn += 2;
+ }else{
+ *pn++ = *pf++;
+ }
+
+ }
+ *pn = '\0';
+
+ pn = rgchFmtBuf;
+
+#else
+
+# if OE_WIN16
+
+ // copy the 'far' format string to a near buffer so we can use
+ // the medium model vsprintf, which only supports near data pointers.
+
+ pn = rgchFmtBuf, pf=szFmt;
+ while(*pf != '\0')
+ *pn++ = *pf++;
+ *pn = '\0';
+
+ pn = rgchFmtBuf;
+
+# else
+
+ pn = szFmt;
+
+# endif
+
+#endif
+
+ va_start(args, szFmt);
+ vsprintf(rgchOutputBuf, pn, args);
+
+ len = strlen(rgchOutputBuf);
+ ASSERT(len < DIM(rgchOutputBuf));
+#if OE_WIN32
+ OutputDebugStringA(rgchOutputBuf);
+#else
+ OutputDebugString(rgchOutputBuf);
+#endif
+ if(Pappdata()->m_hfLogfile != HFILE_ERROR){
+#if OE_MAC
+ fprintf(Pappdata()->m_hfLogfile, rgchOutputBuf);
+#else
+ _lwrite(Pappdata()->m_hfLogfile, rgchOutputBuf, len);
+#endif
+ }
+
+#if OE_WIN32
+ LeaveCriticalSection(&g_csDbPrintf);
+#endif // OE_WIN32
+
+}
+
diff --git a/private/oleauto/tests/disptest/oleguids.c b/private/oleauto/tests/disptest/oleguids.c
new file mode 100644
index 000000000..360169b83
--- /dev/null
+++ b/private/oleauto/tests/disptest/oleguids.c
@@ -0,0 +1,51 @@
+/***
+*oleguids.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates (via Ole macro mania) the Ole GUIDS that are
+* referenced by the OLEDISP dll.
+*
+*Revision History:
+*
+* [00] 21-Jan-93 bradlo: Created.
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# ifdef _MSC_VER
+# include <macos/types.h>
+# include <macos/processe.h>
+# include <macos/appleeve.h>
+# define far
+# define FAR far
+# define near
+# define NEAR near
+# define pascal _pascal
+# define PASCAL pascal
+# define cdecl _cdecl
+# define CDECL cdecl
+# else
+# include <Types.h>
+# include <Processes.h>
+# include <AppleEvents.h>
+# endif
+#endif
+#include <compobj.h>
+
+// this redefines the Ole DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+#ifndef INITGUID
+# define INITGUID
+#endif
+
+// due to the previous header, including this causes our DEFINE_GUID
+// definitions in the following headers to actually allocate data.
+
+// instantiate the ole2 guids that we use
+#include "oleguids.h"
+
diff --git a/private/oleauto/tests/disptest/oleguids.h b/private/oleauto/tests/disptest/oleguids.h
new file mode 100644
index 000000000..446f7631b
--- /dev/null
+++ b/private/oleauto/tests/disptest/oleguids.h
@@ -0,0 +1,37 @@
+/***
+*oleguids.h
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is a subset of the Ole2 guid header: coguid.h.
+*
+* This file is used to instantiate the data for the Ole2 IIDs that
+* are used in OLEDISP.DLL, rather than linking with the Ole2 implib,
+* which causes us to pull in way more IID and CLSID definitions than
+* we want.
+*
+* NOTE: the GUIDs below must be *exactly* the same as those assigned
+* by the Ole group - If the Ole group ever changes their numbers, we
+* must change accordingly.
+*
+*Revision History:
+*
+* [00] 03-Jun-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0);
+DEFINE_OLEGUID(IID_IMalloc, 0x00000002L, 0, 0);
+
+#ifdef _MAC
+DEFINE_OLEGUID(IID_IDispatch, 0x00020400L, 0, 0);
+DEFINE_OLEGUID(IID_IEnumVARIANT,0x00020404L, 0, 0);
+#endif
+
diff --git a/private/oleauto/tests/disptest/pch.cpp b/private/oleauto/tests/disptest/pch.cpp
new file mode 100644
index 000000000..9a23250d4
--- /dev/null
+++ b/private/oleauto/tests/disptest/pch.cpp
@@ -0,0 +1,5 @@
+// this file is used to construct the precompiled header
+
+#include "disptest.h"
+#include "tstsuite.h"
+
diff --git a/private/oleauto/tests/disptest/resource.h b/private/oleauto/tests/disptest/resource.h
new file mode 100644
index 000000000..c3a0102a6
--- /dev/null
+++ b/private/oleauto/tests/disptest/resource.h
@@ -0,0 +1,41 @@
+#ifdef _MAC
+# define MBARID_CDISPTST 128
+# define MENUID_APPLE 128
+# define ICONID_CDISPTST 228
+#endif
+
+#define IDM_ALL 200
+
+#define IDM_SUITE 300
+#define IDM_SUITE_BSTR 301
+#define IDM_SUITE_TIME 302
+#define IDM_SUITE_DATECNV 303
+#define IDM_SUITE_VARIANT 304
+#define IDM_SUITE_SAFEARRAY 305
+#define IDM_SUITE_NLS 306
+#define IDM_SUITE_BIND 307
+#define IDM_SUITE_INVOKE_BYVAL 308
+#define IDM_SUITE_INVOKE_BYREF 309
+#define IDM_SUITE_INVOKE_MULTIPLE 310
+#define IDM_SUITE_INVOKE_SAFEARRAY 311
+#define IDM_SUITE_INVOKE_EXCEPINFO 312
+#define IDM_SUITE_COLLECTION 313
+#define IDM_SUITE_EARLY 314
+
+#define IDM_OPTIONS 400
+#define IDM_OPTIONS_TRACE 401
+#define IDM_OPTIONS_NAMED 402
+#define IDM_OPTIONS_MULTITHREAD 403
+
+#define IDM_HELP 500
+#define IDM_HELP_ABOUT 501
+
+
+#define IDD_SUITE_NAME 600
+#define IDD_SUITE_TESTNAME 601
+#define IDD_SUITE_PERCENT 603
+#define IDD_SUITE_GUAGE 604
+
+#ifdef WIN32
+#define IDM_SUITE_WBSTR 314
+#endif
diff --git a/private/oleauto/tests/disptest/src2mac.mak b/private/oleauto/tests/disptest/src2mac.mak
new file mode 100644
index 000000000..7100cf7b1
--- /dev/null
+++ b/private/oleauto/tests/disptest/src2mac.mak
@@ -0,0 +1,228 @@
+#***
+#src2mac.mak
+#
+# Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+# Information Contained Herein Is Proprietary and Confidential.
+#
+#Purpose:
+# UNDONE
+#
+#
+#Revision History:
+#
+# [00] 15-Jun-93 bradlo: Created.
+#
+#Implementation Notes:
+#
+#****************************************************************************/
+
+.SUFFIXES: .c .cpp .h
+
+all: setflags files
+
+# source directories
+#
+SRCCOMN = $(OLEPROG)\TESTS\COMMON
+SRCCDSP = $(OLEPROG)\TESTS\DISPTEST
+
+# destination directories
+#
+MACCOMN = :hd:ole2auto:tests:common:
+MACCDSP = :hd:ole2auto:tests:disptest:
+
+# timestamp directories
+#
+TMPCOMN = $(TMP)\common
+TMPCDSP = $(TMP)\disptest
+
+CP2MAC=ec copy -l -t TEXT -c "MPS "
+
+setflags:
+ set path=%tools%\hnt\wings\bin;%oleprog%\bin
+ if not exist %TMP%\common mkdir %TMP%\common
+ if not exist %TMP%\disptest mkdir %TMP%\disptest
+
+
+files : common cdisptst
+
+common : \
+ $(TMPCOMN)\assrtdlg.h \
+ $(TMPCOMN)\cdisp.h \
+ $(TMPCOMN)\common.h \
+ $(TMPCOMN)\crempoly.h \
+ $(TMPCOMN)\cunk.h \
+ $(TMPCOMN)\dballoc.h \
+ $(TMPCOMN)\dispdbug.h \
+ $(TMPCOMN)\disphelp.h \
+ $(TMPCOMN)\testhelp.h \
+ $(TMPCOMN)\assert.cpp \
+ $(TMPCOMN)\cdisp.cpp \
+ $(TMPCOMN)\crempoly.cpp \
+ $(TMPCOMN)\cunk.cpp \
+ $(TMPCOMN)\dispdbug.cpp \
+ $(TMPCOMN)\dballoc.cpp \
+ $(TMPCOMN)\disphelp.cpp \
+ $(TMPCOMN)\testhelp.cpp \
+ $(TMPCOMN)\util.cpp
+
+cdisptst : \
+ $(TMPCDSP)\clsid.h \
+ $(TMPCDSP)\disptest.h \
+ $(TMPCDSP)\macmain.h \
+ $(TMPCDSP)\oleguids.h \
+ $(TMPCDSP)\resource.h \
+ $(TMPCDSP)\tstsuite.h \
+ $(TMPCDSP)\guid.c \
+ $(TMPCDSP)\oleguids.c \
+ $(TMPCDSP)\cbind.cpp \
+ $(TMPCDSP)\cbstr.cpp \
+ $(TMPCDSP)\ccollect.cpp \
+ $(TMPCDSP)\cdatecnv.cpp \
+ $(TMPCDSP)\cinvsary.cpp \
+ $(TMPCDSP)\cinvval.cpp \
+ $(TMPCDSP)\cinvref.cpp \
+ $(TMPCDSP)\cinvex.cpp \
+ $(TMPCDSP)\cnls.cpp \
+ $(TMPCDSP)\csarray.cpp \
+ $(TMPCDSP)\ctime.cpp \
+ $(TMPCDSP)\cvariant.cpp \
+ $(TMPCDSP)\macmain.cpp \
+ $(TMPCDSP)\misc.cpp \
+ $(TMPCDSP)\suite.cpp \
+ $(TMPCDSP)\cdisptst.r \
+ $(TMPCDSP)\makefile.tmp
+
+
+#---------------------------------------------------------------------
+# default rules
+#---------------------------------------------------------------------
+
+##### tests\common
+
+{$(SRCCOMN)}.h{$(TMPCOMN)}.h:
+ $(CP2MAC) $< $(MACCOMN)$(@F)
+ echo $(@F) > $@
+
+{$(SRCCOMN)}.c{$(TMPCOMN)}.c:
+ $(CP2MAC) $< $(MACCOMN)$(@F)
+ echo $(@F) > $@
+
+{$(SRCCOMN)}.cpp{$(TMPCOMN)}.cpp:
+ $(CP2MAC) $< $(MACCOMN)$(@F)
+ echo $(@F) > $@
+
+
+##### tests\disptest
+
+{$(SRCCDSP)}.h{$(TMPCDSP)}.h:
+ $(CP2MAC) $< $(MACCDSP)$(@F)
+ echo $(@F) > $@
+
+{$(SRCCDSP)}.c{$(TMPCDSP)}.c:
+ $(CP2MAC) $< $(MACCDSP)$(@F)
+ echo $(@F) > $@
+
+{$(SRCCDSP)}.cpp{$(TMPCDSP)}.cpp:
+ $(CP2MAC) $< $(MACCDSP)$(@F)
+ echo $(@F) > $@
+
+
+#---------------------------------------------------------------------
+# common test sources
+#---------------------------------------------------------------------
+
+$(TMPCOMN)\assrtdlg.h : $(SRCCOMN)\assrtdlg.h
+
+$(TMPCOMN)\cdisp.h : $(SRCCOMN)\cdisp.h
+
+$(TMPCOMN)\common.h : $(SRCCOMN)\common.h
+
+$(TMPCOMN)\crempoly.h : $(SRCCOMN)\crempoly.h
+
+$(TMPCOMN)\cunk.h : $(SRCCOMN)\cunk.h
+
+$(TMPCOMN)\dballoc.h : $(SRCCOMN)\dballoc.h
+
+$(TMPCOMN)\dispdbug.h : $(SRCCOMN)\dispdbug.h
+
+$(TMPCOMN)\disphelp.h : $(SRCCOMN)\disphelp.h
+
+$(TMPCOMN)\testhelp.h : $(SRCCOMN)\testhelp.h
+
+$(TMPCOMN)\assert.cpp : $(SRCCOMN)\assert.cpp
+
+$(TMPCOMN)\cdisp.cpp : $(SRCCOMN)\cdisp.cpp
+
+$(TMPCOMN)\crempoly.cpp : $(SRCCOMN)\crempoly.cpp
+
+$(TMPCOMN)\cunk.cpp : $(SRCCOMN)\cunk.cpp
+
+$(TMPCOMN)\dispdbug.cpp : $(SRCCOMN)\dispdbug.cpp
+
+$(TMPCOMN)\dballoc.cpp : $(SRCCOMN)\dballoc.cpp
+
+$(TMPCOMN)\disphelp.cpp : $(SRCCOMN)\disphelp.cpp
+
+$(TMPCOMN)\testhelp.cpp : $(SRCCOMN)\testhelp.cpp
+
+$(TMPCOMN)\util.cpp : $(SRCCOMN)\util.cpp
+
+
+#---------------------------------------------------------------------
+# cdisptst sources
+#---------------------------------------------------------------------
+
+$(TMPCDSP)\clsid.h : $(SRCCDSP)\clsid.h
+
+$(TMPCDSP)\disptest.h : $(SRCCDSP)\disptest.h
+
+$(TMPCDSP)\macmain.h : $(SRCCDSP)\macmain.h
+
+$(TMPCDSP)\oleguids.h : $(SRCCDSP)\oleguids.h
+
+$(TMPCDSP)\resource.h : $(SRCCDSP)\resource.h
+
+$(TMPCDSP)\tstsuite.h : $(SRCCDSP)\tstsuite.h
+
+$(TMPCDSP)\guid.c : $(SRCCDSP)\guid.c
+
+$(TMPCDSP)\oleguids.c : $(SRCCDSP)\oleguids.c
+
+$(TMPCDSP)\cbind.cpp : $(SRCCDSP)\cbind.cpp
+
+$(TMPCDSP)\cbstr.cpp : $(SRCCDSP)\cbstr.cpp
+
+$(TMPCDSP)\ccollect.cpp : $(SRCCDSP)\ccollect.cpp
+
+$(TMPCDSP)\cdatecnv.cpp : $(SRCCDSP)\cdatecnv.cpp
+
+$(TMPCDSP)\cinvsary.cpp : $(SRCCDSP)\cinvsary.cpp
+
+$(TMPCDSP)\cinvval.cpp : $(SRCCDSP)\cinvval.cpp
+
+$(TMPCDSP)\cinvref.cpp : $(SRCCDSP)\cinvref.cpp
+
+$(TMPCDSP)\cinvex.cpp : $(SRCCDSP)\cinvex.cpp
+
+$(TMPCDSP)\cnls.cpp : $(SRCCDSP)\cnls.cpp
+
+$(TMPCDSP)\csarray.cpp : $(SRCCDSP)\csarray.cpp
+
+$(TMPCDSP)\ctime.cpp : $(SRCCDSP)\ctime.cpp
+
+$(TMPCDSP)\cvariant.cpp : $(SRCCDSP)\cvariant.cpp
+
+$(TMPCDSP)\macmain.cpp : $(SRCCDSP)\macmain.cpp
+
+$(TMPCDSP)\misc.cpp : $(SRCCDSP)\misc.cpp
+
+$(TMPCDSP)\suite.cpp : $(SRCCDSP)\suite.cpp
+
+$(TMPCDSP)\cdisptst.r : $(SRCCDSP)\cdisptst.r
+ $(CP2MAC) $(SRCCDSP)\cdisptst.r $(MACCDSP)$(@F)
+ echo $(@F) > $@
+
+$(TMPCDSP)\makefile.tmp : $(SRCCDSP)\makefile.mpw
+ mungemak $(SRCCDSP)\makefile.mpw > $(TMPCDSP)\makefile.tmp
+ $(CP2MAC) $(TMPCDSP)\makefile.tmp $(MACCDSP)makefile
+
diff --git a/private/oleauto/tests/disptest/suite.cpp b/private/oleauto/tests/disptest/suite.cpp
new file mode 100644
index 000000000..d38eaedbb
--- /dev/null
+++ b/private/oleauto/tests/disptest/suite.cpp
@@ -0,0 +1,590 @@
+/***
+*suite.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module contains the test suite drivers.
+*
+*Revision History:
+*
+* [00] 29-Apr-93 bradlo: Added header.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+
+#include "disptest.h"
+#include "tstsuite.h"
+
+ASSERTDATA
+
+
+#if OE_MAC
+typedef void* HWND;
+#endif
+
+#if !OE_MAC
+extern HINSTANCE g_hinst;
+#endif
+
+struct TEST_INFO {
+ HRESULT hresult;
+ HWND hwnd;
+ BSTR bstr;
+
+ ITestSuite FAR * ptst;
+
+ TEST_INFO () {
+ hresult = NOERROR;
+ hwnd = NULL;
+ bstr = NULL;
+ ptst = NULL;
+ }
+};
+
+extern int g_fLog;
+
+STDAPI_(void)
+PassFail(HRESULT hresult, OLECHAR FAR* szCaption, HWND hwnd)
+{
+ SCODE sc;
+ TCHAR buf[80];
+
+ sc = GetScode(hresult);
+ // E_ABORT indicates the test was aborted by the user, so we do nothing.
+ if(sc == E_ABORT)
+ return;
+ SPRINTF(buf,
+ HC_MPW ? TSTR("%s : %s") : TSTR("%Fs : %Fs"),
+ (TCHAR FAR*)(FAILED(sc) ? TSTR("FAIL") : TSTR("PASS")),
+ DbSzOfScode(sc));
+
+ DbPrintf(
+ HC_MPW ? "DT : %s ==> %s\n" : "DT : %Fs ==> %Fs\n",
+ szCaption == NULL ? "" : (char FAR*) STRING(szCaption), (char FAR*)buf);
+
+#if OE_MAC
+ UNUSED(hwnd);
+#else
+ MessageBox(hwnd, buf, STRING(szCaption), MB_OK);
+#endif
+}
+
+#if !OE_MAC /* { */
+
+int g_nPercent = 0;
+BOOL g_fCancel = FALSE;
+
+void PASCAL
+PaintTheGuage(HWND hwndDlg)
+{
+ RECT rc;
+ HDC hdc;
+ int width;
+ HBRUSH hbrush;
+ HWND hwndGuage;
+
+ hwndGuage = GetDlgItem(hwndDlg, IDD_SUITE_GUAGE);
+
+ hdc = GetDC(hwndGuage);
+
+ GetClientRect(hwndGuage, &rc);
+
+ // draw the border
+ //
+ hbrush = CreateSolidBrush(RGB(255, 255, 255));
+ hbrush = (HBRUSH)SelectObject(hdc, hbrush);
+ Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
+ DeleteObject(SelectObject(hdc, hbrush));
+
+ // leave room for the border
+ //
+ rc.left++, rc.top++, rc.right--, rc.bottom--;
+
+ // compute the ammount of the guage rect to fill
+ //
+ width = ((rc.right - rc.left) * g_nPercent) / 100;
+ rc.right = rc.left + width;
+
+ // fill the guage
+ //
+ hbrush = CreateSolidBrush(RGB(0, 0, 255)); // Blue brush
+ FillRect(hdc, &rc, hbrush);
+ DeleteObject(hbrush);
+
+ ReleaseDC(hwndGuage, hdc);
+}
+
+
+extern "C" BOOL CALLBACK EXPORT
+SuiteDlgProc(HWND hwndDlg, unsigned message, WORD wparam, LONG lparam)
+{
+ switch(message){
+ case WM_INITDIALOG:
+ return TRUE;
+
+ case WM_COMMAND:
+ if(wparam == IDCANCEL){
+ g_fCancel = TRUE;
+ return TRUE;
+ }
+ break;
+
+ case WM_PAINT:
+ PaintTheGuage(hwndDlg);
+ break;
+ }
+
+ return FALSE;
+}
+
+
+void PASCAL
+ProgressYield(HWND hwnd)
+{
+ MSG msg;
+
+ // empty the message loop...
+ while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
+ if(!hwnd || !IsDialogMessage(hwnd, &msg)){
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+}
+
+#endif /* } */
+
+
+// Open a logfile for the given suite, in the directory that the
+// test app lives.
+//
+
+#if defined(WIN32)
+ #define GETMODULEFILENAME GetModuleFileNameA
+#else
+ #define GETMODULEFILENAME GetModuleFileName
+#endif
+
+HFILE
+OpenLogFile(ITestSuite FAR* ptst)
+{
+ BSTR bstr;
+ HFILE hfile;
+ char szModuleName[512], FAR* p, FAR* q;
+ char buf[256];
+
+ bstr = NULL;
+ hfile = HFILE_ERROR;
+
+#if OE_WIN
+ int cb;
+ if((cb = GETMODULEFILENAME(g_hinst, szModuleName,sizeof(szModuleName)))==0)
+ goto LError0; /* couldn't get the module name */
+#endif
+
+ // get the logfile name for this suite
+ if(ptst->GetNameOfLogfile(&bstr) != NOERROR)
+ goto LError0;
+
+#if OE_WIN
+ // backup to the first path separator (ie, backup over the .exe name)
+ for(p = &szModuleName[cb]; p > szModuleName; --p){
+ if(*p == '\\'){
+ ++p;
+ break;
+ }
+ }
+#else
+ p = szModuleName;
+#endif
+
+ // tack the logfile name onto the end of the path
+#if OE_WIN32
+ for(q = ConvertStrWtoA(bstr, buf); *q != '\0';)
+#else
+ for(q = bstr; *q != '\0';)
+#endif
+ *p++ = *q++;
+ *p = '\0';
+
+#if OE_WIN
+ OFSTRUCT of;
+ hfile = OpenFile(szModuleName, &of, OF_CREATE);
+#else
+ hfile = fopen(szModuleName, "w");
+#endif
+
+LError0:;
+ SysFreeString(bstr);
+
+ return hfile;
+}
+
+/***
+*HRESULT DispTestDoSuite(ITestSuite*, HWND)
+*Purpose:
+* Execute all tests in the given suite.
+*
+*Entry:
+* ptst = the ITestSuite* to execute tests from
+* hwnd = HWND of the parent window
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+HRESULT
+DispTestDoSuite(ITestSuite FAR* ptst, HWND hwnd)
+{
+ BSTR bstr;
+ HRESULT hresult;
+ unsigned int i, cTests;
+
+#if !OE_MAC
+ TCHAR buf[32];
+ HWND hwndSuiteDlg;
+
+#if OE_WIN16
+static DLGPROC pfnSuiteDlgProc;
+#endif // OE_WIN16
+#endif
+
+#if OE_MAC
+ UNUSED(hwnd);
+#endif
+
+#if !OE_MAC
+ g_fCancel = FALSE;
+#endif
+
+ if(g_fLog){
+ ASSERT(Pappdata()->m_hfLogfile == HFILE_ERROR);
+ if((Pappdata()->m_hfLogfile = OpenLogFile(ptst)) == HFILE_ERROR){
+ hresult = RESULT(E_FAIL);
+ goto LError0;
+ }
+ }
+
+ IfFailGo(ptst->GetNameOfSuite(&bstr), LError0);
+ IfFailGo(ptst->GetTestCount(&cTests), LError0);
+ PrintSuiteHeader(STRING(bstr));
+
+#if OE_WIN
+
+#if OE_WIN16
+ pfnSuiteDlgProc =
+ (DLGPROC)MakeProcInstance((DLGPROC)SuiteDlgProc, g_hinst);
+
+ hwndSuiteDlg = CreateDialog(g_hinst, TSTR("SuiteDlg"), hwnd, pfnSuiteDlgProc);
+
+#else // !OE_WIN16
+ hwndSuiteDlg = CreateDialog(g_hinst, TSTR("SuiteDlg"), hwnd, (DLGPROC)SuiteDlgProc);
+#endif // !OE_WIN16
+
+ SetDlgItemText(hwndSuiteDlg, IDD_SUITE_NAME, STRING(bstr));
+ ShowWindow(hwndSuiteDlg, SW_SHOW);
+#endif
+
+ SysFreeString(bstr);
+
+ for(i = 0; i < cTests; ++i){
+ IfFailGo(ptst->GetNameOfTest(i, &bstr), LError0);
+ PrintTestHeader(STRING(bstr));
+#if OE_WIN
+ SetDlgItemText(hwndSuiteDlg, IDD_SUITE_TESTNAME, STRING(bstr));
+#endif
+ SysFreeString(bstr);
+
+#if OE_WIN
+ g_nPercent = (i*100) / cTests;
+ SPRINTF(buf, TSTR("%d%%"), g_nPercent);
+ SetDlgItemText(hwndSuiteDlg, IDD_SUITE_PERCENT, buf);
+ PaintTheGuage(hwndSuiteDlg);
+#endif
+
+ // ** Execute the Test **
+ //
+ IfFailGo(ptst->DoTest(i), LError0);
+
+#if OE_WIN
+ ProgressYield(hwndSuiteDlg);
+ if(g_fCancel == TRUE){
+ hresult = RESULT(E_ABORT);
+ goto LError0;
+ }
+#endif
+ }
+
+#if OE_WIN
+ g_nPercent = 100;
+ PaintTheGuage(hwndSuiteDlg);
+#endif
+
+ hresult = NOERROR;
+
+LError0:;
+#if OE_WIN
+ if(hwndSuiteDlg)
+ DestroyWindow(hwndSuiteDlg);
+
+#if OE_WIN16
+ FreeProcInstance(pfnSuiteDlgProc);
+#endif // OE_WIN16
+#endif
+
+ if(Pappdata()->m_hfLogfile != HFILE_ERROR){
+#if OE_MAC
+ fclose(Pappdata()->m_hfLogfile);
+#else
+ _lclose(Pappdata()->m_hfLogfile);
+#endif
+ Pappdata()->m_hfLogfile = HFILE_ERROR;
+ }
+
+ return hresult;
+}
+
+struct {
+ int idm;
+ ITestSuite FAR* (*create)(void);
+} g_rgTestSuite[] = {
+#if OE_MAC
+ { IDM_SUITE_BSTR, CBstrSuite::Create }
+ , { IDM_SUITE_TIME, CTimeSuite::Create }
+ , { IDM_SUITE_DATECNV, CDateCoersionSuite::Create }
+ , { IDM_SUITE_VARIANT, CVariantSuite::Create }
+ , { IDM_SUITE_SAFEARRAY, CSafeArraySuite::Create }
+ , { IDM_SUITE_NLS, CNlsSuite::Create }
+// # if HC_MPW
+ , { IDM_SUITE_BIND, CBindSuite::Create }
+ , { IDM_SUITE_INVOKE_BYVAL, CInvokeByValSuite::Create }
+ , { IDM_SUITE_INVOKE_BYREF, CInvokeByRefSuite::Create }
+ , { IDM_SUITE_INVOKE_SAFEARRAY, CInvokeSafeArraySuite::Create }
+ , { IDM_SUITE_INVOKE_EXCEPINFO, CInvokeExcepinfoSuite::Create }
+ , { IDM_SUITE_COLLECTION, CCollectionSuite::Create }
+// # endif
+#else
+ { IDM_SUITE_BSTR, CBstrSuite::Create }
+ , { IDM_SUITE_TIME, CTimeSuite::Create }
+ , { IDM_SUITE_DATECNV, CDateCoersionSuite::Create }
+ , { IDM_SUITE_VARIANT, CVariantSuite::Create }
+ , { IDM_SUITE_SAFEARRAY, CSafeArraySuite::Create }
+ , { IDM_SUITE_NLS, CNlsSuite::Create }
+ , { IDM_SUITE_BIND, CBindSuite::Create }
+ , { IDM_SUITE_INVOKE_BYVAL, CInvokeByValSuite::Create }
+ , { IDM_SUITE_INVOKE_BYREF, CInvokeByRefSuite::Create }
+ , { IDM_SUITE_INVOKE_SAFEARRAY, CInvokeSafeArraySuite::Create }
+ , { IDM_SUITE_INVOKE_EXCEPINFO, CInvokeExcepinfoSuite::Create }
+ , { IDM_SUITE_COLLECTION, CCollectionSuite::Create }
+ , { IDM_SUITE_EARLY, CEarlySuite::Create }
+#endif
+};
+
+
+/***
+*PRIVATE ITestSuite *ITestSuiteFromIDM(int)
+*Purpose:
+* Create an ITestSuite* from the given message ID.
+*
+*Entry:
+* idm = the message ID.
+*
+*Exit:
+* return value = ITestSuite*, NULL if unable to create.
+*
+***********************************************************************/
+HRESULT
+ITestSuiteFromIDM(int idm, ITestSuite FAR* FAR* pptst)
+{
+ int ix;
+
+ for(ix = 0; ix < DIM(g_rgTestSuite); ++ix){
+ if(g_rgTestSuite[ix].idm == idm){
+ return((*pptst = g_rgTestSuite[ix].create()) != NULL
+ ? NOERROR : RESULT(E_OUTOFMEMORY));
+ }
+ }
+ return RESULT(E_FAIL); // test suite not found
+}
+
+
+#if OE_WIN32
+
+/***
+*DWORD ThreadDoSuite
+*Purpose:
+* Run a test inside it's own thread.
+*
+*Entry:
+* Pointer to a TEST_INFO structure.
+*
+*Exit:
+* returns 0.
+*
+***********************************************************************/
+DWORD ThreadDoSuite(LPDWORD lpdwParam)
+{
+ TEST_INFO FAR* ptinfo = (TEST_INFO FAR *)lpdwParam;
+ HRESULT hresult;
+
+ hresult = OleInitialize(NULL);
+ ASSERT(SUCCEEDED(hresult));
+
+ if (InitAppData()) {
+ ptinfo->hresult = DispTestDoSuite(ptinfo->ptst, NULL);
+ ReleaseAppData();
+ }
+
+ OleUninitialize();
+
+ return 0;
+}
+#endif // OE_WIN32
+
+
+/***
+*HRESULT DispTestAll(HWND)
+*Purpose:
+* Execute All IDispatch tests in all suites.
+*
+*Entry:
+* hwnd = window handle
+* fShowDialog = TRUE if we should display a dialog on a failure.
+* fMultiThread = TRUE if we should multithread the tests.
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+DispTestAll(HWND hwnd, int fShowDialog, int fMultiThread)
+{
+ int i;
+ HRESULT hresult = NOERROR;
+
+ TEST_INFO rgtinfo[DIM(g_rgTestSuite)];
+
+#if OE_WIN32
+ HANDLE rghThread[DIM(g_rgTestSuite)];
+ DWORD rgThreadId[DIM(g_rgTestSuite)];
+
+ HRESULT hRet;
+#endif // OE_WIN32
+
+ // Set up all of the tests.
+ for(i = 0; i < DIM(g_rgTestSuite); ++i) {
+ rgtinfo[i].hwnd = hwnd;
+ rgtinfo[i].ptst = g_rgTestSuite[i].create();
+ if(rgtinfo[i].ptst == NULL) {
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ IfFailGo(rgtinfo[i].ptst->GetNameOfSuite(&rgtinfo[i].bstr), LError0);
+ }
+
+ // Run the suites.
+ for(i = 0; i < DIM(g_rgTestSuite); ++i) {
+#if OE_WIN32
+ if (fMultiThread) {
+ rghThread[i] = CreateThread(NULL,
+ 0,
+ (LPTHREAD_START_ROUTINE)ThreadDoSuite,
+ &rgtinfo[i],
+ 0,
+ &rgThreadId[i]);
+
+ if (rghThread[i] == NULL) {
+ hresult = ResultFromScode(E_OUTOFMEMORY);
+ break;
+ }
+ }
+ else
+#endif // OE_WIN32
+ {
+ rgtinfo[i].hresult = DispTestDoSuite(rgtinfo[i].ptst, hwnd);
+
+ // E_ABORT means the test was aborted by the user.
+ //
+ if(GetScode(rgtinfo[i].hresult) == E_ABORT) {
+ hresult = ResultFromScode(E_ABORT);
+ goto LError0;
+ }
+ }
+ }
+
+#if OE_WIN32
+ // Wait for all of the threads to finish.
+ if (fMultiThread) {
+ hRet = WaitForMultipleObjects(DIM(g_rgTestSuite),
+ rghThread,
+ TRUE,
+ INFINITE);
+
+ ASSERT(SUCCEEDED(hRet));
+ }
+#endif // OE_WIN32
+
+ // Check the results.
+ for (i = 0; i < DIM(g_rgTestSuite) && fShowDialog; ++i) {
+ if (FAILED(rgtinfo[i].hresult)) {
+ PassFail(rgtinfo[i].hresult, rgtinfo[i].bstr, hwnd);
+ hresult = ResultFromScode(S_FALSE);
+ }
+ }
+
+LError0:;
+ for (i = 0; i < DIM(g_rgTestSuite) && rgtinfo[i].ptst; ++i) {
+ rgtinfo[i].ptst->Release();
+ SysFreeString(rgtinfo[i].bstr);
+ }
+
+ return hresult;
+}
+
+
+/***
+*PRIVATE HRESULT DispTestOne(int)
+*Purpose:
+* Execute the test suite associated with the given message ID.
+*
+*Entry:
+* idm = the message id
+*
+*Exit:
+* return value = HRESULT
+*
+***********************************************************************/
+STDAPI
+DispTestOne(HWND hwnd, int idm)
+{
+ BSTR bstr;
+ HRESULT hresult;
+ ITestSuite FAR* ptst;
+
+ ptst = NULL;
+ bstr = NULL;
+
+ IfFailGo(ITestSuiteFromIDM(idm, &ptst), LError0);
+
+ IfFailGo(ptst->GetNameOfSuite(&bstr), LError0);
+
+ hresult = DispTestDoSuite(ptst, hwnd);
+
+LError0:;
+ PassFail(hresult, bstr, hwnd);
+
+ if(bstr != NULL)
+ SysFreeString(bstr);
+
+ if(ptst != NULL)
+ ptst->Release();
+
+ return hresult;
+}
+
diff --git a/private/oleauto/tests/disptest/timer.c b/private/oleauto/tests/disptest/timer.c
new file mode 100644
index 000000000..1b28ca802
--- /dev/null
+++ b/private/oleauto/tests/disptest/timer.c
@@ -0,0 +1,29 @@
+/***
+*timer.c - Timing functions.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+* [00] 02-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include <sys/timeb.h>
+
+double
+GetTime()
+{
+ double secs;
+ struct _timeb t;
+
+ _ftime(&t);
+ secs = t.time + (t.millitm/1000.0);
+ return secs;
+}
diff --git a/private/oleauto/tests/disptest/tstsuite.h b/private/oleauto/tests/disptest/tstsuite.h
new file mode 100644
index 000000000..5fe433bd9
--- /dev/null
+++ b/private/oleauto/tests/disptest/tstsuite.h
@@ -0,0 +1,119 @@
+/***
+*tstsuite.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the ITestSuite interface.
+*
+*Revision History:
+*
+* [00] 30-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+DEFINE_OLEGUID(IID_ITestSuite, 0x00020440, 0, 0);
+
+DECLARE_INTERFACE_(ITestSuite, IUnknown)
+{
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv) = 0;
+ STDMETHOD_(unsigned long, AddRef)(void) = 0;
+ STDMETHOD_(unsigned long, Release)(void) = 0;
+
+ // Introduced methods
+ //
+ STDMETHOD(GetNameOfSuite)(BSTR FAR* pbstr) = 0;
+ STDMETHOD(GetNameOfLogfile)(BSTR FAR* pbstr) = 0;
+ STDMETHOD(GetTestCount)(unsigned int FAR* pcTests) = 0;
+ STDMETHOD(GetNameOfTest)(unsigned int iTest, BSTR FAR* pbstr) = 0;
+ STDMETHOD(DoTest)(unsigned int iTest) = 0;
+};
+
+
+// Standard CTestSuite definition used by all TestSuite objects.
+//
+#define DEFINE_SUITE(CLASS) \
+ class CLASS : public ITestSuite { \
+ public: \
+ static ITestSuite FAR* Create(void); \
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv); \
+ STDMETHOD_(unsigned long, AddRef)(void); \
+ STDMETHOD_(unsigned long, Release)(void); \
+ STDMETHOD(GetNameOfSuite)(BSTR FAR* pbstr); \
+ STDMETHOD(GetNameOfLogfile)(BSTR FAR* pbstr); \
+ STDMETHOD(GetTestCount)(unsigned int FAR* pcTests);\
+ STDMETHOD(GetNameOfTest)(unsigned int iTest, BSTR FAR* pbstr); \
+ STDMETHOD(DoTest)(unsigned int iTest); \
+ private: \
+ CLASS(); \
+ ~CLASS(); \
+ unsigned long m_refs; \
+ }
+
+// Default creation an destruction routines
+// used by all test suite objects.
+//
+#define SUITE_CONSTRUCTION_IMPL(CLASS) \
+ CLASS::CLASS() \
+ { m_refs = 0; } \
+ CLASS::~CLASS() \
+ { } \
+ ITestSuite FAR* CLASS::Create() \
+ { \
+ CLASS FAR* pclass; \
+ pclass = new FAR CLASS(); \
+ if(pclass == NULL) \
+ return NULL; \
+ pclass->AddRef(); \
+ return pclass; \
+ }
+
+
+// Default implementation of IUnknown used by
+// all test suite objects.
+//
+#define SUITE_IUNKNOWN_IMPL(CLASS) \
+ STDMETHODIMP CLASS::QueryInterface( \
+ REFIID riid, void FAR* FAR* ppv) \
+ { \
+ if(!IsEqualIID(riid, IID_IUnknown)) \
+ if(!IsEqualIID(riid, IID_ITestSuite)) \
+ return RESULT(E_NOINTERFACE); \
+ *ppv = this; \
+ ++m_refs; \
+ return NOERROR; \
+ } \
+ STDMETHODIMP_(unsigned long) CLASS::AddRef() \
+ { return ++m_refs; } \
+ STDMETHODIMP_(unsigned long) CLASS::Release() \
+ { \
+ if(--m_refs == 0){ \
+ delete this; \
+ return 0; \
+ } \
+ return m_refs; \
+ }
+
+
+DEFINE_SUITE(CBstrSuite); // cbstr.cpp
+DEFINE_SUITE(CTimeSuite); // ctime.cpp
+DEFINE_SUITE(CDateCoersionSuite); // cdatecnv.cpp
+DEFINE_SUITE(CVariantSuite); // cvariant.cpp
+DEFINE_SUITE(CSafeArraySuite); // csarray.cpp
+DEFINE_SUITE(CNlsSuite); // cnls.cpp
+DEFINE_SUITE(CBindSuite); // cbind.cpp
+DEFINE_SUITE(CInvokeByValSuite); // cinvval.cpp
+DEFINE_SUITE(CInvokeByRefSuite); // cinvref.cpp
+DEFINE_SUITE(CInvokeMultipleSuite); // cinvmult.cpp
+DEFINE_SUITE(CInvokeSafeArraySuite); // cinvsary.cpp
+DEFINE_SUITE(CInvokeExcepinfoSuite); // cinvex.cpp
+DEFINE_SUITE(CCollectionSuite); // ccollect.cpp
+#if VBA2
+DEFINE_SUITE(CEarlySuite); // cearly.cpp
+#endif
diff --git a/private/oleauto/tests/make.bat b/private/oleauto/tests/make.bat
new file mode 100644
index 000000000..25bd84ec0
--- /dev/null
+++ b/private/oleauto/tests/make.bat
@@ -0,0 +1,144 @@
+@echo off
+setlocal
+REM *********************************************************************
+REM
+REM (c) Copyright Microsoft Corp. 1992-1993 All Rights Reserved
+REM
+REM File:
+REM
+REM make.bat
+REM
+REM Purpose:
+REM
+REM oleprog project tests master make batch file.
+REM
+REM Description:
+REM
+REM Usage: run make with no arguments for usage.
+REM This batch file will set up all required variables and fire up
+REM one of disptest\makefile or sdisptst\makefile
+REM
+REM
+REM The structure of the TESTS direcoty is
+REM
+REM %OLEPROG%\TESTS The root of the directory
+REM |___DISPTEST makefile and .c** .h** files
+REM |___WIN32 Win32 .obj, .exe files
+REM |___WIN16 ..
+REM |___MAC ..
+REM |___MACPPC ..
+REM |___CDISPTST makefile and .c** .h** files
+REM |___WIN32 Win32 .obj, .exe files
+REM |___WIN16 ..
+REM |___MAC ..
+REM |___MACPPC ..
+REM ...
+REM
+REM
+REM Environment:
+REM
+REM oleprog, HOST must be set
+REM
+REM Revision History:
+REM
+REM [00] 02-Aug-94 t-issacl: Created
+REM
+REM *********************************************************************
+
+
+if '%oleprog%' == '' goto ERROR_BadEnv
+
+REM set VERS=2
+
+for %%a in ( win16 win32 mac macppc) do if "%1"=="%%a" goto %1
+
+:usage
+echo USAGE: make VERSION [TESTS] options
+echo where VERSION is:
+echo win16 Win16 build
+echo win32 Win32 build
+echo mac Mac build
+echo macppc PPC build
+echo.
+echo where TEST is: (default to disptest and sdisptst)
+echo disptest will build disptest tests
+echo sdisptst will build sdisptst tests
+echo.
+echo options will be passed to makefile by nmake
+echo "clean" option will clean up the target directory.
+echo.
+goto end
+
+
+:win16
+ set BUILDBATCHFILE=build16
+ set MKTYPLIBSRC=%OLEPROG%\dwin32
+ goto build
+
+:win32
+ set BUILDBATCHFILE=build32
+ set MKTYPLIBSRC=%OLEPROG%\dwin32
+ goto build
+
+:mac
+ set BUILDBATCHFILE=build68k
+ set MKTYPLIBSRC=%OLEPROG%\dwin32
+ goto build
+
+:macppc
+ set BUILDBATCHFILE=buildppc
+ set MKTYPLIBSRC=%OLEPROG%\dwin32
+ goto build
+
+
+REM *********************************************************************
+REM here we call nmake to make it
+REM *********************************************************************
+:build
+
+set TESTBUILDALL=FALSE
+for %%a in ( disptest sdisptst nlstest) do if "%2"=="%%a" goto NeedShift
+set TESTBUILDALL=TRUE
+goto disptest
+
+:NeedShift
+set TEMPFLAG=%2
+shift
+goto %TEMPFLAG%
+
+:disptest
+REM Build disptest
+cd disptest
+REM call ..\%BUILDBATCHFILE% clean
+call ..\%BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:sdisptst
+REM Build sdisptst
+cd sdisptst
+REM call ..\%BUILDBATCHFILE% clean
+copy %MKTYPLIBSRC%\mktyplib.exe
+call ..\%BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+
+:nlstest
+REM Build nlstest
+cd nlstest
+REM call ..\%BUILDBATCHFILE% clean
+call ..\%BUILDBATCHFILE% %2 %3 %4
+cd ..
+if "%TESTBUILDALL%"=="FALSE" goto end
+
+goto end
+
+:ERROR_BadEnv
+echo.
+echo Must set oleprog variable
+
+:end
+endlocal
+@echo on
diff --git a/private/oleauto/tests/oleprog.mak b/private/oleauto/tests/oleprog.mak
new file mode 100644
index 000000000..85f148b2b
--- /dev/null
+++ b/private/oleauto/tests/oleprog.mak
@@ -0,0 +1,584 @@
+#################################################################
+#
+# (c) Copyright Microsoft Corp. 1992-1993 All Rights Reserved
+#
+# File:
+#
+# oleprog.mak
+#
+# Purpose:
+#
+# Setup OLE Automation project default variables. To be use in
+# conjunction with standalone makefiles, not to be invoke directly.
+#
+# Setup Options:
+#
+# dev = [win16 | win32 | mac] ; Convience short hand option
+#
+# HOST = [DOS | OS2 | NT] ; Host build platform
+# TARG = [WIN16 | WIN32 | MAC] ; Targeted OS platform
+# TARGCPU = [i386 | M68K | ; Targeted hardware platform
+# MIPS | ALPHA | PPC ]
+#
+# APPLET = [1,0] ; Build Mac Applet? (Mac only)
+#
+# KIND = [D,R] ; Debug or Release.
+# DBTYPE = [NONE, CV] ; type of debug info
+#
+# USEPCH = [1,0] ; Pre-compiled eader files
+#
+# UNICODE = [1,2] ; Win32 Unicode mode
+#
+# PROFILE = [1,0] ; Include Profiling, default = 0
+#
+# Environment:
+#
+# This file requires that the TOOLS and PROJECT/OLEPROG environment
+# variables are setup properly.
+#
+# Revision History:
+#
+# [00] 08-Jan-93 bradlo: Created
+# [01] 18-Feb-93 tomteng: Updated for Win32 build
+#
+#################################################################
+
+#################################################################
+#
+# Check TOOLS/PROJECT Variables
+#
+
+!ifdef OLEPROG
+PROJECT = $(OLEPROG)
+!else
+!if !defined(PROJECT)
+!error PROJECT environment variable not set
+!endif
+!endif
+
+
+#################################################################
+#
+# Setup/check default build options
+#
+
+!ifdef dev
+
+!if !("$(dev)" == "win16" || "$(dev)" == "win32" || "$(dev)" == "mac")
+!error Invalid dev option, choose from [win16 | win32 | mac]
+!endif
+
+!if "$(dev)" == "win32"
+!ifndef _NTBINDIR
+!ifndef VBATOOLS
+!ERROR _NTBINDIR or VBATOOLS environment variable not set (required for WIN32 builds)
+!endif
+!endif
+HOST = NT
+TARG = WIN32
+!ifndef UNICODE
+UNICODE = 1
+!endif
+!ifndef TARGCPU
+!if "$(PROCESSOR_ARCHITECTURE)" == "ALPHA"
+TARGCPU = ALPHA
+!endif
+!if "$(PROCESSOR_ARCHITECTURE)" == "x86"
+TARGCPU = i386
+!endif
+!if "$(PROCESSOR_ARCHITECTURE)" == "MIPS"
+TARGCPU = MIPS
+!endif
+!if "$(PROCESSOR_ARCHITECTURE)" == "PPC"
+TARGCPU = PPC
+!endif
+!endif
+!endif
+
+!if "$(dev)" == "win16"
+TOOLS=$(OLEPROG)\tools\win16
+HOST = NT
+TARG = WIN16
+TARGCPU = i386
+!endif
+
+!if "$(dev)" == "mac"
+!ifndef VBATOOLS
+!ERROR VBATOOLS environment variable not set (required for MAC builds)
+!endif
+!ifndef TARGCPU
+TARGCPU = M68K
+!endif
+HOST = NT
+TARG = MAC
+!endif
+!endif
+
+##### default host platform
+!ifndef HOST
+HOST = NT
+!endif
+!if !("$(HOST)" == "DOS" || "$(HOST)" == "OS2" || "$(HOST)" == "NT")
+!ERROR UNSUPPORTED HOST : "$(HOST)"
+!endif
+
+
+##### default targeted OS platform
+!ifndef TARG
+TARG = WIN16
+!endif
+!if !("$(TARG)" == "WIN16" || "$(TARG)" == "WIN32" || "$(TARG)" == "MAC")
+!ERROR UNSUPPORTED TARGETED OS: "$(TARG)"
+!endif
+
+
+##### default targeted OS platform
+!if !("$(TARGCPU)" == "i386" || "$(TARGCPU)" == "M68K" || "$(TARGCPU)" == "MIPS" || "$(TARGCPU)" == "ALPHA" || "$(TARGCPU)" == "PPC")
+!ERROR UNSUPPORTED TARGETED HARDWARE: "$(TARGCPU)"
+!endif
+
+
+##### default kind to debug
+!ifndef KIND
+KIND = D
+!endif
+!if !("$(KIND)" == "D" || "$(KIND)" == "R")
+!ERROR UNSUPPORTED KIND : "$(KIND)"
+!endif
+
+!ifndef DBTYPE
+! if "$(KIND)" == "D"
+DBTYPE = CV
+! else
+DBTYPE = NONE
+! endif
+!endif
+
+##### default use of pre-compiled headers
+!ifndef USEPCH
+! if "$(KIND)" == "D"
+USEPCH = 1
+! else
+USEPCH = 0
+! endif
+!endif
+
+
+#################################################################
+#
+# TARG specific variables
+#
+
+#
+# TARG == WIN16
+#
+!if ("$(TARG)" == "WIN16")
+
+A = asm
+O = obj
+R = rc
+
+AS = ml
+CC = cl
+CCPP = cl
+LD = link
+RC = rc
+LIBRARIAN= lib
+IMPLIB = implib
+MAPSYM = mapsym
+DISPLAY = rem
+
+SYSFLAG = /WIN16
+
+CFLAGS = -nologo -f- -W3 -G2 -H64 -DWIN16 -D_WINDOWS
+LFLAGS = /NOD /NOE /BATCH /ONERROR:NOEXE /ALIGN:16
+RCFLAGS =
+LNOI = /NOI
+
+!if "$(KIND)" == "D"
+COPT = -Od
+LOPT =
+CDEFS = -D_DEBUG
+RCDEFS = -d_DEBUG
+!else
+!if "$(KIND)" == "R"
+COPT = -Oxza -Gs
+LOPT = /FAR
+CDEFS =
+RCDEFS =
+!endif
+!endif
+
+!if "$(DBTYPE)" == "CV"
+DBCFLAGS = -Zi
+DBLFLAGS = /CO
+!else
+DBCFLAGS =
+DBLFLAGS =
+!endif
+
+COMPILER = C800
+
+# OLE2 supplied libs
+OLEDIR = $(PROJECT)\OLE\$(TARG)
+OLELIBDIR = $(OLEDIR)\$(KIND)
+
+TARGBIN = $(TOOLS)\HDOS\$(COMPILER)\BIN
+BINPATHS = $(TOOLS)\HDOS\BIN;$(TARGBIN)
+
+TARGLIB = $(TOOLS)\HDOS\$(COMPILER)\LIB
+LIBPATHS = $(OLELIBDIR);$(TARGLIB)
+
+TARGINC = $(TOOLS)\HDOS\$(COMPILER)\INCLUDE
+INCPATHS = $(OLEDIR);$(DISPINCDIR);$(TARGINC)
+!endif
+
+
+#
+# TARG == WIN32
+#
+!if ("$(TARG)" == "WIN32")
+
+# declarations common to all WIN32 platforms
+
+O = obj
+R = rc
+
+LD = link -Incremental:NO -Pdb:NONE
+LIBRARIAN= link -lib
+IMPLIB = link -lib
+RC = rc
+MAPSYM =
+DISPLAY = echo
+AWK = awk
+
+
+CFLAGS = -nologo -W3
+CFLAGS = $(CFLAGS) -DWIN32 -DINC_OLE2 -D_MT
+RCFLAGS = -DWIN32
+
+
+!if ("$(UNICODE)" != "2")
+CFLAGS = $(CFLAGS) -DUNICODE
+!endif
+!if ("$(_NTBINDIR)" == "")
+#different flags when using VBATOOLS header files
+CFLAGS = $(CFLAGS) -D_NTSDK
+!endif
+
+
+!if "$(TARGCPU)" == "i386"
+
+A = asm
+
+AS = ml
+CC = cl
+CCPP = cl
+
+# -Bbb1 is the magic flag that enables 'lego' information
+CFLAGS = $(CFLAGS) -D_X86_=1 -G3 -Bbb1
+LFLAGS = -subsystem:windows -machine:i386
+DLLENTRY = LibMain@12
+
+SYSFLAG = /WIN32
+!endif
+
+!if "$(TARGCPU)" == "MIPS"
+
+A = s
+
+AS = cl
+CC = cl
+CCPP = cl
+
+CFLAGS = $(CFLAGS) -W3 -D_MIPS_=1
+LFLAGS = -subsystem:windows -machine:mips
+DLLENTRY = LibMain
+
+SYSFLAG = /MIPS
+!endif
+
+!if "$(TARGCPU)" == "ALPHA"
+
+A = s
+
+AS = acc
+CC = claxp
+CCPP = claxp
+
+CFLAGS = $(CFLAGS) -W3 -D_ALPHA_=1 -QAieee1
+LFLAGS = -subsystem:windows -machine:ALPHA
+DLLENTRY = LibMain
+
+SYSFLAG = /ALPHA
+!endif
+
+!if "$(TARGCPU)" == "PPC"
+
+A = s
+
+AS = cl
+CC = cl
+CCPP = cl
+
+CFLAGS = $(CFLAGS) -W3 -D_PPC_=1
+LFLAGS = -subsystem:windows -machine:ppc
+DLLENTRY = LibMain
+
+SYSFLAG = /PPC32
+!endif
+
+!if "$(KIND)" == "D"
+COPT = -Od
+!if "$(TARGCPU)" == "MIPS"
+#UNDONE: TEMPORARY -- invoke.obj gets bad debug info error
+#UNDONE: any way to just turn it off for invoke.obj?
+LOPT = -debug:none
+!else
+LOPT = -debug:full
+!endif
+CDEFS = -D_DEBUG
+RCDEFS = -d_DEBUG
+
+!else
+!if "$(KIND)" == "R"
+!if "$(TARGCPU)" == "ALPHA"
+COPT = -Ox
+!else
+COPT = -Oxa -Gy
+!endif
+LOPT =
+CDEFS =
+RCDEFS =
+!endif
+!endif
+
+!if "$(DBTYPE)" == "CV"
+DBCFLAGS = -Zi -Z7
+DBLFLAGS = -debugtype:cv,coff
+!else
+DBCFLAGS =
+DBLFLAGS =
+!endif
+
+!if "$(_NTBINDIR)" == ""
+# OLE2 supplied libs
+OLELIBDIR = $(OLEPROG)\ole\win32\$(TARGCPU)
+TARGINC = $(VBATOOLS)\win32\win32\inc
+
+!if "$(TARGCPU)" == "i386"
+TARGBIN = $(VBATOOLS)\$(TARG)\BIN
+BINPATHS = $(VBATOOLS)\$(TARG)\$(TARG)\bin;$(TARGBIN)
+TARGLIB = $(VBATOOLS)\$(TARG)\$(TARG)\lib
+!else
+TARGBIN = $(VBATOOLS)\$(TARGCPU)\BIN
+BINPATHS = $(VBATOOLS)\$(TARGCPU)\$(TARGCPU)\bin;$(TARGBIN)
+TARGLIB = $(VBATOOLS)\$(TARGCPU)\$(TARGCPU)\lib
+!endif
+
+LIBPATHS = $(OLELIBDIR);$(TARGLIB)
+
+INCPATHS = $(TARGINC)
+!else #_NTBINDIR
+
+INCPATHS = $(_NTBINDIR)\public\sdk\inc;$(_NTBINDIR)\public\sdk\inc\crt
+LIBPATHS = $(_NTBINDIR)\public\sdk\lib\$(TARGCPU)
+BINPATHS = $(_NTBINDIR)\mstools
+
+!endif #_NTBINDIR
+
+!endif # TARG==WIN32
+
+
+#
+# TARG == MAC
+#
+!if "$(TARG)" == "MAC"
+
+# default the Applet build flag
+!if ("$(APPLET)" == "")
+APPLET = 1
+!endif
+
+O = obj
+R = r
+
+# REVIEW: no pch support in the wings build, for now...
+USEPCH = 0
+
+!if "$(TARGCPU)" == "PPC"
+A = s
+AS = asmppc
+LD = link -Incremental:NO -Pdb:NONE
+LIBRARIAN= link -lib
+!else
+A = a
+AS = asm68
+LD = link
+LIBRARIAN= link -lib
+!endif
+CC = cl
+CCPP = cl
+RC = rc
+DISPLAY = rem
+
+!if ("$(TARGCPU)" == "M68K")
+!if ("$(SWAP)" == "")
+#default to swapping on
+SWAP=1
+!endif
+!if ("$(SWAP)" == "1")
+SWAPFLAG = -Q68s
+!endif
+!if ("$(PCODE)" == "1")
+PCODEFLAG = -Oq
+!endif
+!if ("$(APPLET)" == "1")
+STATICLIBFLAG = $(SWAPFLAG) $(PCODEFLAG)
+!else
+STATICLIBFLAG = $(SWAPFLAG) $(PCODEFLAG) -DSTATIC_LIB
+!endif
+!endif
+
+!if "$(TARGCPU)" == "PPC"
+CFLAGS = -nologo -W3 -Ze -QPb -D_pascal= -D__pascal= /D_PPCMAC=
+LFLAGS = -machine:mppc
+SYSFLAG = /PPC
+!else
+CFLAGS = -nologo -W3 $(STATICLIBFLAG) -Op
+LFLAGS = -machine:$(TARGCPU)
+SYSFLAG = /MAC
+!endif
+RCFLAGS =
+
+!if "$(KIND)" == "D"
+COPT = -Od
+LOPT =
+CDEFS = -D_MAC -D_DEBUG
+RCDEFS = -d_MAC -d_DEBUG
+
+!else
+!if "$(KIND)" == "R"
+COPT = -Oxa -Gy
+LOPT =
+CDEFS = -D_MAC
+RCDEFS = -d_MAC
+!endif
+!endif
+
+!if "$(DBTYPE)" == "CV"
+!if "$(TARGCPU)" == "PPC"
+DBCFLAGS = -Zi
+!else
+DBCFLAGS = -Q68m -Zi
+!endif
+DBLFLAGS = -debugtype:cv
+!else
+DBCFLAGS =
+DBLFLAGS =
+!endif
+
+!if "$(TARGCPU)" == "PPC"
+COMPILER = PPC
+!else
+COMPILER = MAC
+!endif
+
+# OLE2 supplied libs
+OLEDIR = $(PROJECT)\OLE\MAC\$(TARGCPU)
+OLELIBDIR = $(OLEDIR)
+!if "$(TARGCPU)"=="PPC"
+OBLIBDIR = $(PROJECT)\$(KIND)macppc
+!else
+OBLIBDIR = $(PROJECT)\$(KIND)mac
+!endif
+
+BINPATHS = $(VBATOOLS)\win32\$(COMPILER)\bin
+TARGLIB = $(VBATOOLS)\win32\$(COMPILER)\lib
+TARGINC = $(VBATOOLS)\win32\$(COMPILER)\inc
+
+LIBPATHS = $(OLELIBDIR);$(TARGLIB);$(OBLIBDIR)
+
+INCPATHS = $(OLEDIR);$(DISPINCDIR);$(TARGINC);$(TARGINC)\MACOS
+
+!endif
+
+
+#################################################################
+#
+# HOST specific variables
+#
+
+# NOTE: for now, C8 works well enough as the HOSTCC on NT
+!if ("$(HOST)" == "DOS" || "$(HOST)" == "NT")
+
+HOSTBIN = $(TOOLS)\HDOS\BIN
+HOSTLIB = $(TOOLS)\HDOS\C800\LIB
+HOSTCC = $(TOOLS)\HDOS\C800\BIN\cl
+
+!else
+!if ("$(HOST)" == "OS2")
+
+HOSTBIN = $(TOOLS)\HOS2\BIN
+HOSTLIB = $(TOOLS)\HOS2\C700\LIB
+HOSTCC = $(TOOLS)\HOS2\C700\BIN\cl
+
+!else
+!ERROR unrecognigsed HOST variable
+!endif
+!endif
+
+
+#################################################################
+#
+# Default tool & flags
+#
+
+# Default tools
+CD = cd
+COPY = copy
+XCOPY = xcopy
+DEL = del
+
+# global C/C++ compiler flags
+CFLAGS = $(CFLAGS) $(CDEFS) $(COPT) $(DBCFLAGS)
+
+# global linker flags
+LFLAGS = $(LFLAGS) $(LOPT) $(DBLFLAGS)
+
+# global rc flags
+RCFLAGS = $(RCFLAGS) $(RCDEFS)
+
+
+CFLAGS = $(CFLAGS) -DVBA2=1
+RCFLAGS = $(RCFLAGS) -DVBA2=1
+
+
+#################################################################
+#
+# Default directories
+#
+
+# OLE Automation sources
+SRC = $(PROJECT)\SRC
+
+# Test sources
+TESTS = $(PROJECT)\TESTS
+
+# Sample sources
+SAMPLE = $(PROJECT)\SAMPLE
+
+# Generated file directories
+BUILD = $(PROJECT)\BUILD
+
+DISPINCDIR = $(SRC)\INC
+
+# default source directory
+SRCDIR = .
+
+
+#################################################################
+#
+# Default target
+#
+default: all
diff --git a/private/oleauto/tests/sdisptst/cappobj.cpp b/private/oleauto/tests/sdisptst/cappobj.cpp
new file mode 100644
index 000000000..6d4fb6701
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cappobj.cpp
@@ -0,0 +1,201 @@
+/***
+*cappobj.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This module implements the SDispTst application object -- CAppObject
+*
+*
+*Revision History:
+*
+* [00] 03-Mar-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "sdisptst.h"
+
+#include "dispdbug.h"
+
+#include "cappobj.h"
+#include "cdisptst.h"
+#include "cexinfo.h"
+#include "csarray.h"
+
+ASSERTDATA
+
+
+/***
+*HRESULT CAppObject::Create(IUnknown*, IUnknown**)
+*Purpose:
+* Create and initialize an instance of the CAppObject class
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppunk - the newly created instance
+*
+***********************************************************************/
+extern "C" INTERFACEDATA g_idataCAppObject;
+HRESULT
+CAppObject::Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk)
+{
+ HRESULT hresult;
+ CAppObject FAR* pao;
+ ITypeInfo FAR* ptinfo;
+ IUnknown FAR* punkDisp;
+
+ if(punkOuter != NULL)
+ return RESULT(CLASS_E_NOAGGREGATION);
+
+ if((pao = new FAR CAppObject()) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ pao->AddRef();
+
+ IfFailGo(
+ CreateDispTypeInfo(&g_idataCAppObject, LOCALE_SYSTEM_DEFAULT, &ptinfo),
+ LError1);
+
+ if(g_fVerbose)
+ PrTi(ptinfo);
+
+ hresult = CreateStdDispatch(pao, pao, ptinfo, &punkDisp);
+ if(hresult != NOERROR)
+ goto LError2;
+
+ ptinfo->Release();
+
+ pao->m_punkDisp = punkDisp;
+
+ *ppunk = (IUnknown FAR*)pao;
+
+ IncObjectCount();
+
+ return NOERROR;
+
+
+LError2:;
+ ptinfo->Release();
+
+LError1:;
+ pao->Release();
+
+LError0:;
+ return hresult;
+}
+
+
+STDMETHODIMP
+CAppObject::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ if(IsEqualIID(riid, IID_IDispatch)){
+ return m_punkDisp->QueryInterface(riid, ppv);
+ }
+
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CAppObject::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CAppObject::Release()
+{
+ if(--m_refs == 0){
+ if(m_punkDisp != NULL){
+ unsigned long refs = m_punkDisp->Release();
+ ASSERT(refs == 0);
+ }
+ DecObjectCount();
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP
+CAppObject::NewCDispTst(IDispatch FAR* FAR* ppdisp)
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+ DoPrintf("CAppObject::NewCDispTst()\n");
+
+ IfFailGo(CDispTst::Create(NULL, &punk), LError0);
+
+ IfFailGo(
+ punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)ppdisp),
+ LError1);
+
+ hresult = NOERROR;
+
+LError1:;
+ punk->Release();
+
+LError0:;
+ return hresult;
+}
+
+STDMETHODIMP
+CAppObject::NewCExcepinfo(IDispatch FAR* FAR* ppdisp)
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+ DoPrintf("CAppObject::NewCExcepinfo()\n");
+
+ IfFailGo(CExcepinfo::Create(NULL, &punk), LError0);
+
+ IfFailGo(
+ punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)ppdisp),
+ LError1);
+
+ hresult = NOERROR;
+
+LError1:;
+ punk->Release();
+
+LError0:;
+ return hresult;
+}
+
+STDMETHODIMP
+CAppObject::NewCSArray(IDispatch FAR* FAR* ppdisp)
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+ DoPrintf("CAppObject::NewCSArray()\n");
+
+ IfFailGo(CSArray::Create(NULL, &punk), LError0);
+
+ IfFailGo(
+ punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)ppdisp),
+ LError1);
+
+ hresult = NOERROR;
+
+LError1:;
+ punk->Release();
+
+LError0:;
+ return hresult;
+}
+
diff --git a/private/oleauto/tests/sdisptst/cappobj.h b/private/oleauto/tests/sdisptst/cappobj.h
new file mode 100644
index 000000000..3a369bccd
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cappobj.h
@@ -0,0 +1,65 @@
+/***
+*cappobj.h
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the SDispTst application object.
+*
+*Revision History:
+*
+* [00] 03-Mar-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef __cplusplus /* { */
+
+class CAppObject : public IUnknown
+{
+public:
+ static HRESULT CAppObject::Create(
+ IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(NewCDispTst)(IDispatch FAR* FAR* ppdisp);
+ STDMETHOD(NewCExcepinfo)(IDispatch FAR* FAR* ppdisp);
+ STDMETHOD(NewCSArray)(IDispatch FAR* FAR* ppdisp);
+
+ CAppObject() {
+ m_refs = 0;
+ m_punkDisp = NULL;
+ }
+
+private:
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punkDisp;
+};
+
+#endif /* } */
+
+enum IMETH_CAPPOBJECT {
+ // placeholders
+ IMETH_CAPPOBJECT_QUERYINTERFACE,
+ IMETH_CAPPOBJECT_ADDREF,
+ IMETH_CAPPOBJECT_RELEASE,
+
+ // exposed methods
+ IMETH_CAPPOBJECT_NEWCDISPTST,
+ IMETH_CAPPOBJECT_NEWCEXCEPINFO,
+ IMETH_CAPPOBJECT_NEWCSARRAY
+};
+
+enum IDMEMBER_CAPPOBJECT {
+ IDMEMBER_CAPPOBJECT_NEWCDISPTST = DISPID_VALUE,
+ IDMEMBER_CAPPOBJECT_NEWCEXCEPINFO,
+ IDMEMBER_CAPPOBJECT_NEWCSARRAY
+};
+
+
diff --git a/private/oleauto/tests/sdisptst/ccf.cpp b/private/oleauto/tests/sdisptst/ccf.cpp
new file mode 100644
index 000000000..2b8723721
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/ccf.cpp
@@ -0,0 +1,105 @@
+/***
+*ccf.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Implementation of the default class factory.
+*
+*Revision History:
+*
+* [00] 02-Dec-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "sdisptst.h"
+
+ASSERTDATA
+
+
+CClassFactory::CClassFactory()
+{
+ m_refs = 0;
+}
+
+
+HRESULT
+CClassFactory::Create(
+ HRESULT (*pfnCreate)(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk),
+ IClassFactory FAR* FAR* ppcf)
+{
+ CClassFactory FAR* pcf;
+
+ if((pcf = new FAR CClassFactory()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ pcf->AddRef();
+ pcf->m_pfnCreate = pfnCreate;
+ *ppcf = pcf;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CClassFactory::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(!IsEqualIID(riid, IID_IUnknown))
+ if(!IsEqualIID(riid, IID_IClassFactory)) {
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+
+ *ppv = this;
+ ++m_refs;
+ return S_OK;
+}
+
+STDMETHODIMP_(unsigned long)
+CClassFactory::AddRef(void)
+{
+ return (unsigned long)++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CClassFactory::Release(void)
+{
+ --m_refs;
+ ASSERT(m_refs >= 0);
+ if(m_refs == 0){
+ delete this;
+ return 0;
+ }
+ return (unsigned long)m_refs;
+}
+
+STDMETHODIMP
+CClassFactory::CreateInstance(
+ IUnknown FAR* punkOuter,
+ REFIID riid,
+ void FAR* FAR* ppv)
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+
+ *ppv = NULL;
+
+ IfFailRet(m_pfnCreate(punkOuter, &punk));
+
+ hresult = punk->QueryInterface(riid, ppv);
+
+ punk->Release();
+
+ return hresult;
+}
+
+#if OE_MAC
+STDMETHODIMP CClassFactory::LockServer(unsigned long fLock)
+#else
+STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
+#endif
+{
+ UNUSED(fLock);
+
+ return NOERROR;
+}
diff --git a/private/oleauto/tests/sdisptst/cdisptst.cpp b/private/oleauto/tests/sdisptst/cdisptst.cpp
new file mode 100644
index 000000000..8092573bf
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cdisptst.cpp
@@ -0,0 +1,893 @@
+/***
+*cdisptst.cpp - Implementation of the CDispTst IDispatch test object.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This object is used for testing the IDispatch remoting support.
+*
+*Revision History:
+*
+* [00] 21-Sep-92 bradlo: Created.
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "sdisptst.h"
+#include "dispdbug.h"
+#include "cdisptst.h"
+
+ASSERTDATA
+
+
+extern "C" INTERFACEDATA g_idataCDispTst;
+
+HRESULT CDispTst::CreateDisp()
+{
+ HRESULT hresult;
+ IUnknown FAR* punkDisp;
+ ITypeInfo FAR* ptinfo;
+
+ // Create IDispatch Interface component
+ hresult =
+ CreateDispTypeInfo(&g_idataCDispTst, LOCALE_SYSTEM_DEFAULT, &ptinfo);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ hresult = CreateStdDispatch(this, this, ptinfo, &punkDisp);
+ if(hresult != NOERROR)
+ return hresult;
+
+ m_punkDisp = punkDisp;
+ ptinfo->Release();
+
+ return NOERROR;
+}
+
+
+/***
+*CDispTst *CDispTst::Create(void)
+*Purpose:
+* Create and initialize an instance of the CDispTst test object.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = CDispTst*. NULL if the creation failed.
+*
+***********************************************************************/
+HRESULT
+CDispTst::Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk)
+{
+ HRESULT hresult;
+ CDispTst FAR* pcdt;
+
+ if(punkOuter != NULL)
+ return RESULT(CLASS_E_NOAGGREGATION);
+
+ if((pcdt = new FAR CDispTst()) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ pcdt->AddRef();
+
+ hresult = pcdt->CreateDisp();
+ if (hresult != NOERROR)
+ goto LError1;
+
+ *ppunk = (IUnknown FAR*)pcdt;
+
+ IncObjectCount();
+
+ return NOERROR;
+
+LError1:;
+ pcdt->Release();
+
+LError0:;
+ return hresult;
+}
+
+
+CDispTst::CDispTst()
+{
+ m_refs = 0;
+ m_punkDisp = NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CDispTst::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ if(IsEqualIID(riid, IID_IDispatch)){
+ return m_punkDisp->QueryInterface(riid, ppv);
+ }
+
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CDispTst::AddRef(void)
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CDispTst::Release(void)
+{
+ if(--m_refs == 0){
+ if(m_punkDisp != NULL){
+ unsigned long refs = m_punkDisp->Release();
+ ASSERT(refs == 0);
+ }
+ DecObjectCount();
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+//---------------------------------------------------------------------
+// Introduced Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP_(void)
+CDispTst::Hello()
+{
+ DoPrintf("CDispTst::Hello()\n");
+}
+
+ALTMETHODIMP_(void)
+CDispTst::HelloC()
+{
+ DoPrintf("CDispTst::HelloC()\n");
+}
+
+#if VBA2
+STDMETHODIMP_(unsigned char)
+CDispTst::UI1(unsigned char bVal)
+{
+ DoPrintf("CDispTst::UI1(bVal=%d)\n", (unsigned int)bVal);
+ return bVal;
+}
+
+ALTMETHODIMP_(unsigned char)
+CDispTst::UI1C(unsigned char bVal)
+{
+ DoPrintf("CDispTst::UI1C(bVal=%d)\n", (unsigned int)bVal);
+ return bVal;
+}
+
+#endif //VBA2
+
+STDMETHODIMP_(short)
+CDispTst::I2(short sVal)
+{
+ DoPrintf("CDispTst::I2(sVal=%d)\n", (int)sVal);
+ return sVal;
+}
+
+ALTMETHODIMP_(short)
+CDispTst::I2C(short sVal)
+{
+ DoPrintf("CDispTst::I2C(sVal=%d)\n", (int)sVal);
+ return sVal;
+}
+
+STDMETHODIMP_(long)
+CDispTst::I4(long lVal)
+{
+ DoPrintf("CDispTst::I4(lVal=%ld)\n", lVal);
+ return lVal;
+}
+
+ALTMETHODIMP_(long)
+CDispTst::I4C(long lVal)
+{
+ DoPrintf("CDispTst::I4C(lVal=%ld)\n", lVal);
+ return lVal;
+}
+
+STDMETHODIMP_(float)
+CDispTst::R4(float fltVal)
+{
+ DoPrintf("CDispTst::R4(fltVal=%#f)\n", fltVal);
+ return fltVal;
+}
+
+ALTMETHODIMP_(float)
+CDispTst::R4C(float fltVal)
+{
+ DoPrintf("CDispTst::R4C(fltVal=%#f)\n", fltVal);
+ return fltVal;
+}
+
+STDMETHODIMP_(double)
+CDispTst::R8(double dblVal)
+{
+ DoPrintf("CDispTst::R8(dblVal=%#f)\n", dblVal);
+ return dblVal;
+}
+
+ALTMETHODIMP_(double)
+CDispTst::R8C(double dblVal)
+{
+ DoPrintf("CDispTst::R8C(dblVal=%#f)\n", dblVal);
+ return dblVal;
+}
+
+STDMETHODIMP_(CY)
+CDispTst::Cy(CY cyVal)
+{
+ DoPrintf("CDispTst::Cy(cyVal={hi=%ld,lo=%ld})\n", cyVal.Hi, cyVal.Lo);
+ return cyVal;
+}
+
+ALTMETHODIMP_(CY)
+CDispTst::CyC(CY cyVal)
+{
+ DoPrintf("CDispTst::CyC(cyVal={hi=%ld,lo=%ld})\n", cyVal.Hi, cyVal.Lo);
+ return cyVal;
+}
+
+STDMETHODIMP_(DATE)
+CDispTst::Date(DATE date)
+{
+ DoPrintf("CDispTst::Date(date=%#f)\n", date);
+ return date;
+}
+
+ALTMETHODIMP_(DATE)
+CDispTst::DateC(DATE date)
+{
+ DoPrintf("CDispTst::DateC(date=%#f)\n", date);
+ return date;
+}
+
+STDMETHODIMP_(BSTR)
+CDispTst::Bstr(BSTR bstr)
+{
+#if OE_WIN32
+ char buf[256];
+
+ DoPrintf("CDispTst::Bstr(bstr=\"%Fs\")\n", ConvertStrWtoA(bstr, buf));
+#else
+ DoPrintf("CDispTst::Bstr(bstr=\"%Fs\")\n", bstr);
+#endif
+ return SysAllocString(bstr);
+}
+
+ALTMETHODIMP_(BSTR)
+CDispTst::BstrC(BSTR bstr)
+{
+#if OE_WIN32
+ char buf[256];
+
+ DoPrintf("CDispTst::BstrC(bstr=\"%Fs\")\n", ConvertStrWtoA(bstr, buf));
+#else
+ DoPrintf("CDispTst::BstrC(bstr=\"%Fs\")\n", bstr);
+#endif
+ return SysAllocString(bstr);
+}
+
+STDMETHODIMP_(SCODE)
+CDispTst::Scode(SCODE sc)
+{
+ DoPrintf("CDispTst::Scode(sc=0x%lx)\n", sc);
+ return sc;
+}
+
+ALTMETHODIMP_(SCODE)
+CDispTst::ScodeC(SCODE sc)
+{
+ DoPrintf("CDispTst::ScodeC(sc=0x%lx)\n", sc);
+ return sc;
+}
+
+
+STDMETHODIMP_(VARIANT_BOOL)
+CDispTst::Bool(VARIANT_BOOL bool)
+{
+ DoPrintf("CDispTst::Bool(bool=%d)\n", bool);
+ return bool;
+}
+
+ALTMETHODIMP_(VARIANT_BOOL)
+CDispTst::BoolC(VARIANT_BOOL bool)
+{
+ DoPrintf("CDispTst::BoolC(bool=%d)\n", bool);
+ return bool;
+}
+
+
+STDMETHODIMP_(VARIANT)
+CDispTst::Var(VARIANTARG varg)
+{
+ VARIANT var;
+ HRESULT hresult;
+
+ DoPrintf("CDispTst::Var(varg.vt=%d)\n", (int)varg.vt);
+
+ VariantInit(&var);
+ hresult = VariantCopyInd(&var, &varg);
+ ASSERT(!HRESULT_FAILED(hresult));
+ return var;
+}
+
+ALTMETHODIMP_(VARIANT)
+CDispTst::VarC(VARIANTARG varg)
+{
+ VARIANT var;
+ HRESULT hresult;
+
+ DoPrintf("CDispTst::VarC(varg.vt=%d)\n", (int)varg.vt);
+
+ VariantInit(&var);
+ hresult = VariantCopyInd(&var, &varg);
+ ASSERT(!HRESULT_FAILED(hresult));
+ return var;
+}
+
+STDMETHODIMP_(IDispatch FAR*)
+CDispTst::NewCDispTst()
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+ DoPrintf("CDispTst::NewCDispTst()\n");
+
+ if((hresult = CDispTst::Create(NULL, &punk)) != NOERROR)
+ return NULL;
+ hresult = punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp);
+ if(HRESULT_FAILED(hresult))
+ pdisp = NULL;
+ punk->Release();
+ return pdisp;
+}
+
+ALTMETHODIMP_(LPDISPATCH)
+CDispTst::NewCDispTstC()
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+ DoPrintf("CDispTst::NewCDispTstC()\n");
+
+ if((hresult = CDispTst::Create(NULL, &punk)) != NOERROR)
+ return NULL;
+ hresult = punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp);
+ if(HRESULT_FAILED(hresult))
+ pdisp = NULL;
+ punk->Release();
+ return pdisp;
+}
+
+STDMETHODIMP_(IDispatch FAR*)
+CDispTst::NewCDispTst2(IDispatch FAR* foo)
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+ DoPrintf("CDispTst::NewCDispTst()\n");
+
+ if((hresult = CDispTst::Create(NULL, &punk)) != NOERROR)
+ return NULL;
+ hresult = punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp);
+ if(HRESULT_FAILED(hresult))
+ pdisp = NULL;
+ punk->Release();
+ return pdisp;
+}
+
+ALTMETHODIMP_(LPDISPATCH)
+CDispTst::NewCDispTstC2(LPDISPATCH foo)
+{
+ HRESULT hresult;
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+ DoPrintf("CDispTst::NewCDispTstC()\n");
+
+ if((hresult = CDispTst::Create(NULL, &punk)) != NOERROR)
+ return NULL;
+ hresult = punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp);
+ if(HRESULT_FAILED(hresult))
+ pdisp = NULL;
+ punk->Release();
+ return pdisp;
+}
+
+#if VBA2
+STDMETHODIMP
+CDispTst::UI1Ref(unsigned char FAR* pbVal)
+{
+ DoPrintf("CDispTst::UI1Ref(*pbVal=%d)\n", (unsigned int)*pbVal);
+ *pbVal += 1;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::UI1RefC(unsigned char FAR* pbVal)
+{
+ DoPrintf("CDispTst::UI1RefC(*pbVal=%d)\n", (unsigned int)*pbVal);
+ *pbVal += 1;
+ return NOERROR;
+}
+
+#endif //VBA2
+
+STDMETHODIMP
+CDispTst::I2Ref(short FAR* psVal)
+{
+ DoPrintf("CDispTst::I2Ref(*psVal=%d)\n", (int)*psVal);
+ *psVal += 1;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::I2RefC(short FAR* psVal)
+{
+ DoPrintf("CDispTst::I2RefC(*psVal=%d)\n", (int)*psVal);
+ *psVal += 1;
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CDispTst::I4Ref(long FAR *plVal)
+{
+ DoPrintf("CDispTst::I4Ref(*plVal=%ld)\n", *plVal);
+ *plVal += 1;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::I4RefC(long FAR *plVal)
+{
+ DoPrintf("CDispTst::I4RefC(*plVal=%ld)\n", *plVal);
+ *plVal += 1;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTst::R4Ref(float FAR *pfltVal)
+{
+ DoPrintf("CDispTst::R4Ref(*pfltVal=%#f)\n", *pfltVal);
+ *pfltVal += (float)1.0;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::R4RefC(float FAR *pfltVal)
+{
+ DoPrintf("CDispTst::R4RefC(*pfltVal=%#f)\n", *pfltVal);
+ *pfltVal += (float)1.0;
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CDispTst::R8Ref(double FAR *pdblVal)
+{
+ DoPrintf("CDispTst::R8Ref(*pdblVal=%#f)\n", *pdblVal);
+ *pdblVal += 1.0;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::R8RefC(double FAR *pdblVal)
+{
+ DoPrintf("CDispTst::R8RefC(*pdblVal=%#f)\n", *pdblVal);
+ *pdblVal += 1.0;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTst::CyRef(CY FAR* pcyVal)
+{
+ DoPrintf("CDispTst::CyRef(*pcyVal={hi=%ld,lo=%ld})\n", pcyVal->Hi, pcyVal->Lo);
+ ++pcyVal->Hi;
+ ++pcyVal->Lo;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::CyRefC(CY FAR* pcyVal)
+{
+ DoPrintf("CDispTst::CyRefC(*pcyVal={hi=%ld,lo=%ld})\n", pcyVal->Hi, pcyVal->Lo);
+ ++pcyVal->Hi;
+ ++pcyVal->Lo;
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CDispTst::DateRef(DATE FAR* pdate)
+{
+ DoPrintf("CDispTst::DateRef(*pdate=%#f)\n", *pdate);
+ *pdate += 1.0;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::DateRefC(DATE FAR* pdate)
+{
+ DoPrintf("CDispTst::DateRefC(*pdate=%#f)\n", *pdate);
+ *pdate += 1.0;
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(void)
+UcaseBstr(BSTR bstr)
+{
+ unsigned int i, cbLen;
+
+ cbLen = SysStringLen(bstr);
+ for(i = 0; i < cbLen; ++i)
+ bstr[i] = (char)toupper((int)bstr[i]);
+}
+
+STDMETHODIMP
+CDispTst::BstrRef(BSTR FAR *pbstr)
+{
+#if OE_WIN32
+ char buf[256];
+
+ DoPrintf("CDispTst::BstrRef(*pbstr=\"%Fs\")\n", ConvertStrWtoA(*pbstr, buf));
+#else
+ DoPrintf("CDispTst::BstrRef(*pbstr=\"%Fs\")\n", *pbstr);
+#endif
+ UcaseBstr(*pbstr);
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::BstrRefC(BSTR FAR *pbstr)
+{
+#if OE_WIN32
+ char buf[256];
+
+ DoPrintf("CDispTst::BstrRefC(*pbstr=\"%Fs\")\n", ConvertStrWtoA(*pbstr, buf));
+#else
+ DoPrintf("CDispTst::BstrRefC(*pbstr=\"%Fs\")\n", *pbstr);
+#endif
+ UcaseBstr(*pbstr);
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CDispTst::ScodeRef(SCODE FAR* pscode)
+{
+ DoPrintf("CDispTst::ScodeRef(*pscode=%ld)\n", *pscode);
+ *pscode = E_FAIL;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::ScodeRefC(SCODE FAR* pscode)
+{
+ DoPrintf("CDispTst::ScodeRefC(*pscode=%ld)\n", *pscode);
+ *pscode = E_FAIL;
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CDispTst::BoolRef(VARIANT_BOOL FAR* pbool)
+{
+ DoPrintf("CDispTst::BoolRef(*pbool=%d)\n", *pbool);
+ *pbool = 0;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::BoolRefC(VARIANT_BOOL FAR* pbool)
+{
+ DoPrintf("CDispTst::BoolRefC(*pbool=%d)\n", *pbool);
+ *pbool = 0;
+ return NOERROR;
+}
+
+// Takes a byref IDispatch*, and doesnt touch it.
+STDMETHODIMP
+CDispTst::DispRef(IDispatch FAR* FAR* ppdisp)
+{
+ DoPrintf("CDispTst::DispRef(...)\n");
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTst::StdI2I4R4R8(
+#if VBA2
+ unsigned char bVal,
+#endif //VBA2
+ short sVal,
+ long lVal,
+ float fltVal,
+ double dblVal)
+{
+#if VBA2
+ DoPrintf("CDispTst::StdI2I4R4R8(bVal=%d, sVal=%d, lVal=%ld, fltVal=%#f, dblVal=%#f)\n",
+ (unsigned int)bVal,
+#else
+ DoPrintf("CDispTst::StdI2I4R4R8(sVal=%d, lVal=%ld, fltVal=%#f, dblVal=%#f)\n",
+#endif
+ (int)sVal, lVal, fltVal, dblVal);
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::AltI2I4R4R8(
+#if VBA2
+ unsigned char bVal,
+#endif //VBA2
+ short sVal,
+ long lVal,
+ float fltVal,
+ double dblVal)
+{
+#if VBA2
+ DoPrintf("CDispTst::AltI2I4R4R8(bVal=%d, sVal=%d, lVal=%ld, fltVal=%#f, dblVal=%#f)\n",
+ (unsigned int)bVal,
+#else //VBA2
+ DoPrintf("CDispTst::AltI2I4R4R8(sVal=%d, lVal=%ld, fltVal=%#f, dblVal=%#f)\n",
+#endif //VBA2
+ (int)sVal, lVal, fltVal, dblVal);
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTst::StdI2I4R4R8Ref(
+#if VBA2
+ unsigned char FAR* pbVal,
+#endif //VBA2
+ short FAR* psVal,
+ long FAR* plVal,
+ float FAR* pfltVal,
+ double FAR* pdblVal)
+{
+#if VBA2
+ DoPrintf("CDispTst::StdI2I4R4R8Ref(*pbVal=%d, *psVal=%d, *plVal=%ld, *pfltVal=%#f, *pdblVal=%#f)\n", (unsigned int)*pbVal, (int)*psVal, *plVal, *pfltVal, *pdblVal);
+#else //VBA2
+ DoPrintf("CDispTst::StdI2I4R4R8Ref(*psVal=%d, *plVal=%ld, *pfltVal=%#f, *pdblVal=%#f)\n", (int)*psVal, *plVal, *pfltVal, *pdblVal);
+#endif //VBA2
+
+ *psVal += 1;
+ *plVal += 1L;
+ *pfltVal += (float)1.0;
+ *pdblVal += 1.0;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::AltI2I4R4R8Ref(
+#if VBA2
+ unsigned char FAR* pbVal,
+#endif //VBA2
+ short FAR* psVal,
+ long FAR* plVal,
+ float FAR* pfltVal,
+ double FAR* pdblVal)
+{
+#if VBA2
+ DoPrintf("CDispTst::AltI2I4R4R8Ref(*pbVal=%d, *psVal=%d, *plVal=%ld, *pfltVal=%#f, *pdblVal=%#f)\n", (unsigned int)*pbVal, (int)*psVal, *plVal, *pfltVal, *pdblVal);
+#else //VBA2
+ DoPrintf("CDispTst::AltI2I4R4R8Ref(*psVal=%d, *plVal=%ld, *pfltVal=%#f, *pdblVal=%#f)\n", (int)*psVal, *plVal, *pfltVal, *pdblVal);
+#endif //VBA2
+ *psVal += 1;
+ *plVal += 1L;
+ *pfltVal += (float)1.0;
+ *pdblVal += 1.0;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTst::StdAll(
+#if VBA2
+ unsigned char bVal,
+#endif //VBA2
+ short sVal,
+ long lVal,
+ float fltVal,
+ double dblVal,
+ CY cyVal,
+ DATE date,
+ BSTR bstr,
+ SCODE sc,
+ VARIANT_BOOL bool
+)
+{
+ DoPrintf(
+#if VBA2
+ "CDispTst::StdAll(bVal=%d, sVal=%d, lVal=%ld, fltVal=%#f, dblVal=%#f, cyVal={hi=%ld, lo=%ld}, date=%#f, bstr=%Fs, sc=0x%lx, bool=%d)\n",
+ (unsigned int)bVal,
+#else //VBA2
+ "CDispTst::StdAll(sVal=%d, lVal=%ld, fltVal=%#f, dblVal=%#f, cyVal={hi=%ld, lo=%ld}, date=%#f, bstr=%Fs, sc=0x%lx, bool=%d)\n",
+#endif //VBA2
+ (int)sVal,
+ lVal,
+ fltVal,
+ dblVal,
+ cyVal.Hi, cyVal.Lo,
+ date,
+ bstr,
+ sc,
+ (int)bool);
+
+
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::AltAll(
+#if VBA2
+ unsigned char bVal,
+#endif //VBA2
+ short sVal,
+ long lVal,
+ float fltVal,
+ double dblVal,
+ CY cyVal,
+ DATE date,
+ BSTR bstr,
+ SCODE sc,
+ VARIANT_BOOL bool
+)
+{
+ DoPrintf(
+#if VBA2
+ "CDispTst::AltAll(bVal=%d, sVal=%d, lVal=%ld, fltVal=%#f, dblVal=%#f, cyVal={hi=%ld,lo=%ld}, date=%#f, bstr=%Fs, sc=0x%lx, bool=%d)\n",
+ (unsigned int)bVal,
+#else //VBA2
+ "CDispTst::AltAll(sVal=%d, lVal=%ld, fltVal=%#f, dblVal=%#f, cyVal={hi=%ld,lo=%ld}, date=%#f, bstr=%Fs, sc=0x%lx, bool=%d)\n",
+#endif //VBA2
+ (int)sVal,
+ lVal,
+ fltVal,
+ dblVal,
+ cyVal.Hi, cyVal.Lo,
+ date,
+ bstr,
+ sc,
+ (int)bool);
+
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDispTst::StdAllRef(
+#if VBA2
+ unsigned char FAR* pbVal,
+#endif //VBA2
+ short FAR* psVal,
+ long FAR* plVal,
+ float FAR* pfltVal,
+ double FAR* pdblVal,
+ CY FAR* pcyVal,
+ DATE FAR* pdate,
+ BSTR FAR* pbstr,
+ SCODE FAR* psc,
+ VARIANT_BOOL FAR* pbool
+)
+{
+ DoPrintf(
+ "CDispTst::StdAllRef("
+#if VBA2
+ "*pbVal=%d, "
+#endif
+ "*psVal=%d, "
+ "*plVal=%ld, "
+ "*pfltVal=%#f, "
+ "*pdblVal=%#f, "
+ "*pcyVal={hi=%ld,lo=%ld}, "
+ "*pdate=%#f, "
+ "*pbstr=\"%Fs\", "
+ "*psc=0x%lx, "
+ "*pbool=%d)\n",
+#if VBA2
+ (unsigned int)*pbVal,
+#endif
+ (int)*psVal,
+ *plVal,
+ *pfltVal,
+ *pdblVal,
+ pcyVal->Hi, pcyVal->Lo,
+ *pdate,
+ *pbstr,
+ *psc,
+ (int)*pbool);
+
+
+#if VBA2
+ *pbVal += 1;
+#endif
+ *psVal += 1;
+ *plVal += 1L;
+ *pfltVal += (float)1.0;
+ *pdblVal += 1.0;
+ pcyVal->Hi += 1, pcyVal->Lo += 1;
+ *pdate += 1.0;
+ UcaseBstr(*pbstr);
+ *psc = E_FAIL;
+ *pbool = 0;
+ return NOERROR;
+}
+
+ALTMETHODIMP
+CDispTst::AltAllRef(
+#if VBA2
+ unsigned char FAR* pbVal,
+#endif //VBA2
+ short FAR* psVal,
+ long FAR* plVal,
+ float FAR* pfltVal,
+ double FAR* pdblVal,
+ CY FAR* pcyVal,
+ DATE FAR* pdate,
+ BSTR FAR* pbstr,
+ SCODE FAR* psc,
+ VARIANT_BOOL FAR* pbool
+)
+{
+ DoPrintf(
+ "CDispTst::AltAllRef("
+#if VBA2
+ "*pbVal=%d, "
+#endif
+ "*psVal=%d, "
+ "*plVal=%ld, "
+ "*pfltVal=%#f, "
+ "*pdblVal=%#f, "
+ "*pcyVal={hi=%ld,lo=%ld}, "
+ "*pdate=%#f, "
+ "*pbstr=\"%Fs\", "
+ "*psc=0x%lx, "
+ "*pbool=%d)\n",
+#if VBA2
+ (unsigned int)*pbVal,
+#endif
+ (int)*psVal,
+ *plVal,
+ *pfltVal,
+ *pdblVal,
+ pcyVal->Hi, pcyVal->Lo,
+ *pdate,
+ *pbstr,
+ *psc,
+ (int)*pbool);
+
+#if VBA2
+ *pbVal += 1;
+#endif
+ *psVal += 1;
+ *plVal += 1L;
+ *pfltVal += (float)1.0;
+ *pdblVal += 1.0;
+ pcyVal->Hi += 1, pcyVal->Lo += 1;
+ *pdate += 1.0;
+ UcaseBstr(*pbstr);
+ *psc = E_FAIL;
+ *pbool = 0;
+ return NOERROR;
+}
+
diff --git a/private/oleauto/tests/sdisptst/cdisptst.h b/private/oleauto/tests/sdisptst/cdisptst.h
new file mode 100644
index 000000000..6eeb76a0d
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cdisptst.h
@@ -0,0 +1,427 @@
+/***
+*cdisptst.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CDispTst IDispatch test Object.
+*
+*Revision History:
+*
+* [00] 18-Sep-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef __cplusplus /* { */
+
+class CDispTst : public IUnknown
+{
+public:
+ static HRESULT Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk);
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+
+ /* Introduced methods */
+
+ // ByVal methods
+ //
+ STDMETHOD_(void, Hello)(void);
+ ALTMETHOD_(void, HelloC)(void);
+
+#if VBA2
+ STDMETHOD_(unsigned char, UI1)(unsigned char bVal);
+ ALTMETHOD_(unsigned char, UI1C)(unsigned char bVal);
+#endif //VBA2
+
+ STDMETHOD_(short, I2)(short sVal);
+ ALTMETHOD_(short, I2C)(short sVal);
+
+ STDMETHOD_(long, I4)(long lVal);
+ ALTMETHOD_(long, I4C)(long lVal);
+
+
+ STDMETHOD_(float, R4)(float rVal);
+ ALTMETHOD_(float, R4C)(float rVal);
+
+ STDMETHOD_(double, R8)(double dVal);
+ ALTMETHOD_(double, R8C)(double dVal);
+
+ STDMETHOD_(CY, Cy)(CY cyVal);
+ ALTMETHOD_(CY, CyC)(CY cyVal);
+
+ STDMETHOD_(DATE, Date)(DATE date);
+ ALTMETHOD_(DATE, DateC)(DATE date);
+
+ STDMETHOD_(BSTR, Bstr)(BSTR bstr);
+ ALTMETHOD_(BSTR, BstrC)(BSTR bstr);
+
+ STDMETHOD_(SCODE, Scode)(SCODE sc);
+ ALTMETHOD_(SCODE, ScodeC)(SCODE sc);
+
+ STDMETHOD_(VARIANT_BOOL, Bool)(VARIANT_BOOL bool);
+ ALTMETHOD_(VARIANT_BOOL, BoolC)(VARIANT_BOOL bool);
+
+ STDMETHOD_(VARIANT, Var)(VARIANTARG varg);
+ ALTMETHOD_(VARIANT, VarC)(VARIANTARG varg);
+
+ STDMETHOD_(LPDISPATCH, NewCDispTst)(void);
+ ALTMETHOD_(LPDISPATCH, NewCDispTstC)(void);
+
+ STDMETHOD_(LPDISPATCH, NewCDispTst2)(LPDISPATCH);
+ ALTMETHOD_(LPDISPATCH, NewCDispTstC2)(LPDISPATCH);
+
+
+ // ByRef Methods
+ //
+#if VBA2
+ STDMETHOD(UI1Ref)(unsigned char FAR* pbVal);
+ ALTMETHOD(UI1RefC)(unsigned char FAR* pbVal);
+#endif //VBA2
+
+ STDMETHOD(I2Ref)(short FAR* psVal);
+ ALTMETHOD(I2RefC)(short FAR* psVal);
+
+ STDMETHOD(I4Ref)(long FAR* plVal);
+ ALTMETHOD(I4RefC)(long FAR* plVal);
+
+ STDMETHOD(R4Ref)(float FAR* prVal);
+ ALTMETHOD(R4RefC)(float FAR* prVal);
+
+ STDMETHOD(R8Ref)(double FAR* pdVal);
+ ALTMETHOD(R8RefC)(double FAR* pdVal);
+
+ STDMETHOD(CyRef)(CY FAR* pcyVal);
+ ALTMETHOD(CyRefC)(CY FAR* pcyVal);
+
+ STDMETHOD(DateRef)(DATE FAR* pdate);
+ ALTMETHOD(DateRefC)(DATE FAR* pdate);
+
+ STDMETHOD(BstrRef)(BSTR FAR* pbstr);
+ ALTMETHOD(BstrRefC)(BSTR FAR* pbstr);
+
+ STDMETHOD(ScodeRef)(SCODE FAR* pscode);
+ ALTMETHOD(ScodeRefC)(SCODE FAR* pscode);
+
+ STDMETHOD(BoolRef)(VARIANT_BOOL FAR* pbool);
+ ALTMETHOD(BoolRefC)(VARIANT_BOOL FAR* pbool);
+
+ STDMETHOD(DispRef)(IDispatch FAR* FAR* ppdisp);
+
+ // Multi Argument Methods
+
+ STDMETHOD(StdI2I4R4R8)(
+#if VBA2
+ unsigned char bVal,
+#endif //VBA2
+ short sVal,
+ long lVal,
+ float fltVal,
+ double dblVal);
+
+ ALTMETHOD(AltI2I4R4R8)(
+#if VBA2
+ unsigned char bVal,
+#endif //VBA2
+ short sVal,
+ long lVal,
+ float fltVal,
+ double dblVal);
+
+ STDMETHOD(StdI2I4R4R8Ref)(
+#if VBA2
+ unsigned char FAR* pbVal,
+#endif //VBA2
+ short FAR* psVal,
+ long FAR* plVal,
+ float FAR* pfltVal,
+ double FAR* pdblVal);
+
+ ALTMETHOD(AltI2I4R4R8Ref)(
+#if VBA2
+ unsigned char FAR* pbVal,
+#endif //VBA2
+ short FAR* psVal,
+ long FAR* plVal,
+ float FAR* pfltVal,
+ double FAR* pdblVal);
+
+ STDMETHOD(StdAll)(
+#if VBA2
+ unsigned char bVal,
+#endif //VBA2
+ short sVal,
+ long lVal,
+ float fltVal,
+ double dblVal,
+ CY cyVal,
+ DATE date,
+ BSTR bstr,
+ SCODE sc,
+ VARIANT_BOOL bool
+ );
+
+ ALTMETHOD(AltAll)(
+#if VBA2
+ unsigned char bVal,
+#endif //VBA2
+ short sVal,
+ long lVal,
+ float fltVal,
+ double dblVal,
+ CY cyVal,
+ DATE date,
+ BSTR bstr,
+ SCODE sc,
+ VARIANT_BOOL bool
+ );
+
+ STDMETHOD(StdAllRef)(
+#if VBA2
+ unsigned char FAR* pbVal,
+#endif //VBA2
+ short FAR* psVal,
+ long FAR* plVal,
+ float FAR* pfltVal,
+ double FAR* pdblVal,
+ CY FAR* pcyVal,
+ DATE FAR* pdate,
+ BSTR FAR* pbstr,
+ SCODE FAR* psc,
+ VARIANT_BOOL FAR* pbool
+ );
+
+ ALTMETHOD(AltAllRef) (
+#if VBA2
+ unsigned char FAR* pbVal,
+#endif //VBA2
+ short FAR* psVal,
+ long FAR* plVal,
+ float FAR* pfltVal,
+ double FAR* pdblVal,
+ CY FAR* pcyVal,
+ DATE FAR* pdate,
+ BSTR FAR* pbstr,
+ SCODE FAR* psc,
+ VARIANT_BOOL FAR* pbool
+ );
+
+ CDispTst();
+
+protected:
+
+ HRESULT CreateDisp();
+
+private:
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punkDisp;
+};
+
+#endif /* } */
+
+// CDispTst method indices.
+//
+enum CDISPTST_METHODS
+{
+ IMETH_CDISPTST_QUERYINTERFACE = 0,
+ IMETH_CDISPTST_ADDREF,
+ IMETH_CDISPTST_RELEASE,
+
+ IMETH_CDISPTST_HELLO,
+ IMETH_CDISPTST_HELLOC,
+
+#if VBA2
+ IMETH_CDISPTST_UI1,
+ IMETH_CDISPTST_UI1C,
+#endif //VBA2
+
+ IMETH_CDISPTST_I2,
+ IMETH_CDISPTST_I2C,
+
+ IMETH_CDISPTST_I4,
+ IMETH_CDISPTST_I4C,
+
+ IMETH_CDISPTST_R4,
+ IMETH_CDISPTST_R4C,
+
+ IMETH_CDISPTST_R8,
+ IMETH_CDISPTST_R8C,
+
+ IMETH_CDISPTST_CY,
+ IMETH_CDISPTST_CYC,
+
+ IMETH_CDISPTST_DATE,
+ IMETH_CDISPTST_DATEC,
+
+ IMETH_CDISPTST_BSTR,
+ IMETH_CDISPTST_BSTRC,
+
+ IMETH_CDISPTST_SCODE,
+ IMETH_CDISPTST_SCODEC,
+
+ IMETH_CDISPTST_BOOL,
+ IMETH_CDISPTST_BOOLC,
+
+ IMETH_CDISPTST_VAR,
+ IMETH_CDISPTST_VARC,
+
+ IMETH_CDISPTST_NEWCDISPTST,
+ IMETH_CDISPTST_NEWCDISPTSTC,
+
+ IMETH_CDISPTST_NEWCDISPTST2,
+ IMETH_CDISPTST_NEWCDISPTSTC2,
+
+#if VBA2
+ IMETH_CDISPTST_UI1REF,
+ IMETH_CDISPTST_UI1REFC,
+#endif //VBA2
+
+ IMETH_CDISPTST_I2REF,
+ IMETH_CDISPTST_I2REFC,
+
+ IMETH_CDISPTST_I4REF,
+ IMETH_CDISPTST_I4REFC,
+
+ IMETH_CDISPTST_R4REF,
+ IMETH_CDISPTST_R4REFC,
+
+ IMETH_CDISPTST_R8REF,
+ IMETH_CDISPTST_R8REFC,
+
+ IMETH_CDISPTST_CYREF,
+ IMETH_CDISPTST_CYREFC,
+
+ IMETH_CDISPTST_DATEREF,
+ IMETH_CDISPTST_DATEREFC,
+
+ IMETH_CDISPTST_BSTRREF,
+ IMETH_CDISPTST_BSTRREFC,
+
+ IMETH_CDISPTST_SCODEREF,
+ IMETH_CDISPTST_SCODEREFC,
+
+ IMETH_CDISPTST_BOOLREF,
+ IMETH_CDISPTST_BOOLREFC,
+
+ IMETH_CDISPTST_DISPREF,
+
+ IMETH_CDISPTST_STDI2I4R4R8,
+ IMETH_CDISPTST_ALTI2I4R4R8,
+
+ IMETH_CDISPTST_STDI2I4R4R8REF,
+ IMETH_CDISPTST_ALTI2I4R4R8REF,
+
+ IMETH_CDISPTST_STDALL,
+ IMETH_CDISPTST_ALTALL,
+
+ IMETH_CDISPTST_STDALLREF,
+ IMETH_CDISPTST_ALTALLREF,
+
+ IMETH_CDISPTST_MAX
+};
+
+
+// CDispTst member IDs
+//
+enum CDISPTST_MEMBER_IDS
+{
+ IDMEMBER_CDISPTST_HELLO = 1,
+ IDMEMBER_CDISPTST_HELLOC,
+
+#if VBA2
+ IDMEMBER_CDISPTST_UI1,
+ IDMEMBER_CDISPTST_UI1C,
+#endif //VBA2
+
+ IDMEMBER_CDISPTST_I2,
+ IDMEMBER_CDISPTST_I2C,
+
+ IDMEMBER_CDISPTST_I4,
+ IDMEMBER_CDISPTST_I4C,
+
+ IDMEMBER_CDISPTST_R4,
+ IDMEMBER_CDISPTST_R4C,
+
+ IDMEMBER_CDISPTST_R8,
+ IDMEMBER_CDISPTST_R8C,
+
+ IDMEMBER_CDISPTST_CY,
+ IDMEMBER_CDISPTST_CYC,
+
+ IDMEMBER_CDISPTST_DATE,
+ IDMEMBER_CDISPTST_DATEC,
+
+ IDMEMBER_CDISPTST_BSTR,
+ IDMEMBER_CDISPTST_BSTRC,
+
+ IDMEMBER_CDISPTST_SCODE,
+ IDMEMBER_CDISPTST_SCODEC,
+
+ IDMEMBER_CDISPTST_BOOL,
+ IDMEMBER_CDISPTST_BOOLC,
+
+ IDMEMBER_CDISPTST_VAR,
+ IDMEMBER_CDISPTST_VARC,
+
+ IDMEMBER_CDISPTST_NEWCDISPTST,
+ IDMEMBER_CDISPTST_NEWCDISPTSTC,
+
+ IDMEMBER_CDISPTST_NEWCDISPTST2,
+ IDMEMBER_CDISPTST_NEWCDISPTSTC2,
+
+#if VBA2
+ IDMEMBER_CDISPTST_UI1REF,
+ IDMEMBER_CDISPTST_UI1REFC,
+#endif //VBA2
+
+ IDMEMBER_CDISPTST_I2REF,
+ IDMEMBER_CDISPTST_I2REFC,
+
+ IDMEMBER_CDISPTST_I4REF,
+ IDMEMBER_CDISPTST_I4REFC,
+
+ IDMEMBER_CDISPTST_R4REF,
+ IDMEMBER_CDISPTST_R4REFC,
+
+ IDMEMBER_CDISPTST_R8REF,
+ IDMEMBER_CDISPTST_R8REFC,
+
+ IDMEMBER_CDISPTST_CYREF,
+ IDMEMBER_CDISPTST_CYREFC,
+
+ IDMEMBER_CDISPTST_DATEREF,
+ IDMEMBER_CDISPTST_DATEREFC,
+
+ IDMEMBER_CDISPTST_BSTRREF,
+ IDMEMBER_CDISPTST_BSTRREFC,
+
+ IDMEMBER_CDISPTST_SCODEREF,
+ IDMEMBER_CDISPTST_SCODEREFC,
+
+ IDMEMBER_CDISPTST_BOOLREF,
+ IDMEMBER_CDISPTST_BOOLREFC,
+
+ IDMEMBER_CDISPTST_DISPREF,
+
+ IDMEMBER_CDISPTST_STDI2I4R4R8,
+ IDMEMBER_CDISPTST_ALTI2I4R4R8,
+
+ IDMEMBER_CDISPTST_STDI2I4R4R8REF,
+ IDMEMBER_CDISPTST_ALTI2I4R4R8REF,
+
+ IDMEMBER_CDISPTST_STDALL,
+ IDMEMBER_CDISPTST_ALTALL,
+
+ IDMEMBER_CDISPTST_STDALLREF,
+ IDMEMBER_CDISPTST_ALTALLREF,
+
+ IDMEMBER_CDISPTST_MAX
+};
+
diff --git a/private/oleauto/tests/sdisptst/cdualtst.cpp b/private/oleauto/tests/sdisptst/cdualtst.cpp
new file mode 100644
index 000000000..7bd0945cc
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cdualtst.cpp
@@ -0,0 +1,459 @@
+/***
+*cdualtst.cpp
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Implementation of the CDualTst, dual-interface test object.
+*
+*
+*Revision History:
+*
+* [00] 27-Jun-94 Bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "sdisptst.h"
+#include "dispdbug.h"
+#include "cdualtst.h"
+
+ASSERTDATA
+
+CDualTst::CDualTst()
+{
+ m_cRefs = 0;
+ m_ptinfo = NULL;
+
+ m_ui1 = 0;
+ m_i2 = 0;
+ m_i4 = 0;
+ m_r4 = 0.0;
+ m_r8 = 0.0;
+ MEMSET(&m_cy, 0, sizeof(CY));
+ m_date = 0.0;
+ m_bstr = NULL;
+ m_pdisp = NULL;
+ VariantInit(&m_var);
+}
+
+CDualTst::~CDualTst()
+{
+ if(m_ptinfo != NULL)
+ m_ptinfo->Release();
+ SysFreeString(m_bstr);
+ if(m_pdisp != NULL)
+ m_pdisp->Release();
+ VariantClear(&m_var);
+}
+
+HRESULT
+CDualTst::Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk)
+{
+ HRESULT hresult;
+ CDualTst FAR* pdual;
+ ITypeLib FAR* ptlib;
+ ITypeInfo FAR* ptinfo;
+
+ ptlib = NULL;
+ ptinfo = NULL;
+ *ppunk = NULL;
+
+ if(punkOuter != NULL)
+ return RESULT(CLASS_E_NOAGGREGATION);
+
+ if((pdual = new CDualTst()) == NULL)
+ return RESULT(E_OUTOFMEMORY);
+ pdual->AddRef();
+
+ // load & register the type library and the interfaces within the typelib
+ hresult = LoadTypeLib(OLESTR("sdisptst.exe"), &ptlib);
+ if(HRESULT_FAILED(hresult)){
+ // Work around the fact that LoadTypeLib may not leave
+ // ptlib == NULL if it fails...
+ ptlib = NULL;
+ goto Error;
+ }
+
+ IfFailGo(ptlib->GetTypeInfoOfGuid(IID_IDualTst, &ptinfo), Error);
+
+ pdual->m_ptinfo = ptinfo;
+ ptinfo = NULL;
+
+ *ppunk = (IUnknown FAR*)pdual;
+ pdual = NULL;
+
+ IncObjectCount(); // incriment count of global objects
+
+ hresult = NOERROR;
+ // FALLTHROUGH...
+
+Error:;
+ if(ptinfo != NULL)
+ ptinfo->Release();
+ if(ptlib != NULL)
+ ptlib->Release();
+ if(pdual != NULL)
+ delete pdual;
+ return hresult;
+}
+
+STDMETHODIMP
+CDualTst::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if (riid == IID_IUnknown
+ || riid == IID_IDispatch
+ || riid == IID_IDualTst)
+ {
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CDualTst::AddRef(void)
+{
+ return ++m_cRefs;
+}
+
+STDMETHODIMP_(unsigned long)
+CDualTst::Release(void)
+{
+ if(--m_cRefs == 0){
+ DecObjectCount(); // decriment global count of objects
+ delete this;
+ return 0;
+ }
+ return m_cRefs;
+}
+
+STDMETHODIMP
+CDualTst::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = 1;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDualTst::GetTypeInfo(unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ ASSERT(m_ptinfo != NULL);
+ if(itinfo != 0)
+ return RESULT(TYPE_E_ELEMENTNOTFOUND);
+ m_ptinfo->AddRef();
+ *pptinfo = m_ptinfo;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CDualTst::GetIDsOfNames(REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ ASSERT(m_ptinfo != NULL);
+ return m_ptinfo->GetIDsOfNames(rgszNames, cNames, rgdispid);
+}
+
+STDMETHODIMP
+CDualTst::Invoke(DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ ASSERT(m_ptinfo != NULL);
+ return m_ptinfo->Invoke(this,
+ dispidMember,
+ wFlags,
+ pdispparams,
+ pvarResult,
+ pexcepinfo,
+ puArgErr);
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_ui1(unsigned char FAR* pui1)
+{
+ DoPrintf("CDualTst::get_ui1(*ret = %d)\n", (unsigned int)m_ui1);
+ *pui1 = m_ui1;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_ui1(unsigned char ui1)
+{
+ DoPrintf("CDualTst::put_ui1(%d)\n", (unsigned int)ui1);
+ m_ui1 = ui1;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_i2(short FAR* pi2)
+{
+ DoPrintf("CDualTst::get_i2(*ret = %d)\n", (int)m_i2);
+ *pi2 = m_i2;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_i2(short i2)
+{
+ DoPrintf("CDualTst::put_i2(%d)\n", (int)i2);
+ m_i2 = i2;
+ return NOERROR;
+}
+
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_i4(long FAR* pi4)
+{
+ DoPrintf("CDualTst::get_i4(*ret = %ld)\n", m_i4);
+ *pi4 = m_i4;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_i4(long i4)
+{
+ DoPrintf("CDualTst::put_i4(%d)\n", i4);
+ m_i4 = i4;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_r4(float FAR* pr4)
+{
+ DoPrintf("CDualTst::get_r4(*ret = %#f)\n", m_r4);
+ *pr4 = m_r4;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_r4(float r4)
+{
+ DoPrintf("CDualTst::put_r4(%#f)\n", r4);
+ m_r4 = r4;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_r8(double FAR* pr8)
+{
+ DoPrintf("CDualTst::get_r8(*ret = %#f)\n", m_r8);
+ *pr8 = m_r8;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_r8(double r8)
+{
+ DoPrintf("CDualTst::put_r8(%#f)\n", r8);
+ m_r8 = r8;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_cy(CY FAR* pcy)
+{
+ DoPrintf("CDualTst::get_cy(*ret = {hi=%ld,lo=%ld})\n", m_cy.Hi, m_cy.Lo);
+ MEMCPY(pcy, &m_cy, sizeof(CY));
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_cy(CY cy)
+{
+ DoPrintf("CDualTst::put_cy({hi=%ld,lo=%ld})\n", cy.Hi, cy.Lo);
+ MEMCPY(&m_cy, &cy, sizeof(CY));
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_date(DATE FAR* pdate)
+{
+ DoPrintf("CDualTst::get_date(*ret = %#f)\n", m_date);
+ *pdate = m_date;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_date(DATE date)
+{
+ DoPrintf("CDualTst::put_date(%#f)\n", date);
+ m_date = date;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_bstr(BSTR FAR* pbstr)
+{
+ DoPrintf("CDualTst::get_bstr(*ret = %Fs)\n", m_bstr);
+ // REVIEW: the following drops embedded nulls...
+ *pbstr = (m_bstr == NULL) ? NULL : SysAllocString(m_bstr);
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_bstr(BSTR bstr)
+{
+ DoPrintf("CDualTst::put_bstr(%Fs)\n", bstr);
+ SysFreeString(m_bstr);
+ // REVIEW: the following drops embedded nulls...
+ m_bstr = (bstr == NULL) ? NULL : SysAllocString(bstr);
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_disp(IDispatch FAR* FAR* ppdisp)
+{
+ DoPrintf("CDualTst::get_disp(*ret = ...)\n");
+ if(m_pdisp != NULL)
+ m_pdisp->AddRef();
+ *ppdisp = m_pdisp;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_disp(IDispatch FAR* pdisp)
+{
+ DoPrintf("CDualTst::put_disp(...)\n");
+ // UNDONE: need to implement 'Let' of object valued property
+ return RESULT(E_NOTIMPL);
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::putref_disp(IDispatch FAR* pdisp)
+{
+ DoPrintf("CDualTst::putref_disp(...)\n");
+ if(m_pdisp != NULL)
+ m_pdisp->Release();
+ if(pdisp != NULL)
+ pdisp->AddRef();
+ m_pdisp = pdisp;
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::get_var(VARIANT FAR* pvar)
+{
+ DoPrintf("CDualTst::get_var(*ret.vt = %d)\n", m_var.vt);
+ return VariantCopy(pvar, &m_var);
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::put_var(VARIANT var)
+{
+ DoPrintf("CDualTst::put_var(var.vt = %d)\n", var.vt);
+ // UNDONE: the following isn't quite the correct implementation
+ // UNDONE: for 'Let' of a variant valued property...
+ return VariantCopy(&m_var, &var);
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::putref_var(VARIANT var)
+{
+ DoPrintf("CDualTst::putref_var(var.vt = %d)\n", var.vt);
+ return VariantCopy(&m_var, &var);
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::m0(unsigned char ui1,
+ short i2,
+ long i4,
+ float r4,
+ double r8,
+ CY cy,
+ DATE date,
+ BSTR bstr,
+ IDispatch FAR* pdisp,
+ VARIANT var)
+{
+ IfFailRet(put_ui1(ui1));
+ IfFailRet(put_i2(i2));
+ IfFailRet(put_i4(i4));
+ IfFailRet(put_r4(r4));
+ IfFailRet(put_r8(r8));
+ IfFailRet(put_cy(cy));
+ IfFailRet(put_date(date));
+ IfFailRet(put_bstr(bstr));
+ IfFailRet(putref_disp(pdisp));
+ IfFailRet(putref_var(var));
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::m1(unsigned char FAR* pui1,
+ short FAR* pi2,
+ long FAR* pi4,
+ float FAR* pr4,
+ double FAR* pr8,
+ CY FAR* pcy,
+ DATE FAR* pdate,
+ BSTR FAR* pbstr,
+ IDispatch FAR* FAR* ppdisp,
+ VARIANT FAR* pvar)
+{
+ IfFailRet(put_ui1(*pui1));
+ IfFailRet(put_i2(*pi2));
+ IfFailRet(put_i4(*pi4));
+ IfFailRet(put_r4(*pr4));
+ IfFailRet(put_r8(*pr8));
+ IfFailRet(put_cy(*pcy));
+ IfFailRet(put_date(*pdate));
+ IfFailRet(put_bstr(*pbstr));
+ IfFailRet(putref_disp(*ppdisp));
+ IfFailRet(putref_var(*pvar));
+
+ *pui1 = 41;
+ *pi2 = 42;
+ *pi4 = 43;
+ *pr4 = 4.2;
+ *pr8 = 4.3;
+ pcy->Hi = 4; pcy->Lo = 2;
+ *pdate = 4.2;
+ *ppdisp = this;
+ VariantClear(pvar);
+ return NOERROR;
+}
+
+HRESULT STDMETHODCALLTYPE
+CDualTst::raise(long error,
+ BSTR bstrSource,
+ BSTR bstrDescription,
+ long dwHelpContest,
+ BSTR bstrHelpFile)
+{
+ IErrorInfo FAR* perrinfo;
+ ICreateErrorInfo FAR* pcerrinfo;
+
+ perrinfo = NULL;
+ pcerrinfo = NULL;
+
+ IfFailRet(CreateErrorInfo(&pcerrinfo));
+ pcerrinfo->SetSource(bstrSource);
+ pcerrinfo->SetDescription(bstrDescription);
+ pcerrinfo->SetHelpContext(dwHelpContest);
+ pcerrinfo->SetHelpFile(bstrHelpFile);
+
+ if(pcerrinfo->QueryInterface(IID_IErrorInfo, (void FAR* FAR*)&perrinfo) == NOERROR){
+ SetErrorInfo(0L, perrinfo);
+ }
+
+ if(perrinfo != NULL)
+ perrinfo->Release();
+ if(pcerrinfo != NULL)
+ pcerrinfo->Release();
+ return RESULT((SCODE)error);
+}
diff --git a/private/oleauto/tests/sdisptst/cdualtst.h b/private/oleauto/tests/sdisptst/cdualtst.h
new file mode 100644
index 000000000..1d75251ed
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cdualtst.h
@@ -0,0 +1,133 @@
+/***
+*cdualtst.h
+*
+* Copyright (C) 1994, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CDualTst dual-interface test object.
+*
+*Revision History:
+*
+* [00] 27-Jun-94 bradlo: Created.
+*
+*Implementation Notes:
+* <additional documentation, as needed>
+*
+*****************************************************************************/
+
+#include "dualtst.h"
+
+class CDualTst : public IDualTst
+{
+public:
+static HRESULT Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk);
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ /* IDispatch methods */
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo);
+
+ STDMETHOD(GetTypeInfo)(unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+
+ STDMETHOD(GetIDsOfNames)(REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+
+ STDMETHOD(Invoke)(DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ /* Introduced methods */
+ virtual HRESULT STDMETHODCALLTYPE get_ui1(unsigned char FAR* pui1);
+ virtual HRESULT STDMETHODCALLTYPE put_ui1(unsigned char ui1);
+
+ virtual HRESULT STDMETHODCALLTYPE get_i2(short FAR* pi2);
+ virtual HRESULT STDMETHODCALLTYPE put_i2(short i2);
+
+ virtual HRESULT STDMETHODCALLTYPE get_i4(long FAR* pi4);
+ virtual HRESULT STDMETHODCALLTYPE put_i4(long i4);
+
+ virtual HRESULT STDMETHODCALLTYPE get_r4(float FAR* pr4);
+ virtual HRESULT STDMETHODCALLTYPE put_r4(float r4);
+
+ virtual HRESULT STDMETHODCALLTYPE get_r8(double FAR* pr8);
+ virtual HRESULT STDMETHODCALLTYPE put_r8(double r8);
+
+ virtual HRESULT STDMETHODCALLTYPE get_cy(CY FAR* pcy);
+ virtual HRESULT STDMETHODCALLTYPE put_cy(CY cy);
+
+ virtual HRESULT STDMETHODCALLTYPE get_date(DATE FAR* pdate);
+ virtual HRESULT STDMETHODCALLTYPE put_date(DATE date);
+
+ virtual HRESULT STDMETHODCALLTYPE get_bstr(BSTR FAR* pbstr);
+ virtual HRESULT STDMETHODCALLTYPE put_bstr(BSTR bstr);
+
+ virtual HRESULT STDMETHODCALLTYPE get_disp(IDispatch FAR* FAR* ppdisp);
+ virtual HRESULT STDMETHODCALLTYPE put_disp(IDispatch FAR* pdisp);
+ virtual HRESULT STDMETHODCALLTYPE putref_disp(IDispatch FAR* pdisp);
+
+ virtual HRESULT STDMETHODCALLTYPE get_var(VARIANT FAR* pvar);
+ virtual HRESULT STDMETHODCALLTYPE put_var(VARIANT var);
+ virtual HRESULT STDMETHODCALLTYPE putref_var(VARIANT var);
+
+ virtual HRESULT STDMETHODCALLTYPE CDualTst::m0(unsigned char ui1,
+ short i2,
+ long i4,
+ float r4,
+ double r8,
+ CY cy,
+ DATE date,
+ BSTR bstr,
+ IDispatch FAR* pdisp,
+ VARIANT var);
+
+ virtual HRESULT STDMETHODCALLTYPE CDualTst::m1(unsigned char FAR* pui1,
+ short FAR* pi2,
+ long FAR* pi4,
+ float FAR* pr4,
+ double FAR* pr8,
+ CY FAR* pcy,
+ DATE FAR* pdate,
+ BSTR FAR* pbstr,
+ IDispatch FAR* FAR* ppdisp,
+ VARIANT FAR* pvar);
+
+ virtual HRESULT STDMETHODCALLTYPE CDualTst::raise(long error,
+ BSTR bstrSource,
+ BSTR bstrDescription,
+ long dwHelpContest,
+ BSTR bstrHelpFile);
+
+ CDualTst();
+ ~CDualTst();
+
+private:
+ unsigned long m_cRefs;
+ ITypeInfo FAR* m_ptinfo;
+
+ unsigned char m_ui1;
+ short m_i2;
+ long m_i4;
+ float m_r4;
+ double m_r8;
+ CY m_cy;
+ DATE m_date;
+ BSTR m_bstr;
+ IDispatch FAR* m_pdisp;
+ VARIANT m_var;
+
+ // UNDONE: SafeArray?
+};
diff --git a/private/oleauto/tests/sdisptst/cexinfo.cpp b/private/oleauto/tests/sdisptst/cexinfo.cpp
new file mode 100644
index 000000000..7cebcada7
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cexinfo.cpp
@@ -0,0 +1,279 @@
+/***
+*csarray.cpp - Implementation of the CExcepinfo IDispatch test object.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CExcepinfo object, which is used for
+* testing the marshaling support for the EXCEPINFO struct passed to
+* IDispatch::Invoke().
+*
+*Revision History:
+*
+* [00] 02-Dec-92 bradlo: Created.
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+
+#include "sdisptst.h"
+#include "dispdbug.h"
+#include "disphelp.h"
+#include "cexinfo.h"
+
+ASSERTDATA
+
+
+
+STDAPI Excepinfo2DeferredFillIn(EXCEPINFO FAR*);
+
+
+CExcepinfo::CExcepinfo()
+{
+ m_refs = 0;
+ m_ptinfo = NULL;
+}
+
+
+/***
+*HRESULT CExcepinfo::Create(IUnknown*, IUnknown**)
+*Purpose:
+* Create and initialize an instance of the CExcepinfo test object.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = CExcepinfo*. NULL if the creation failed
+*
+***********************************************************************/
+extern "C" INTERFACEDATA g_idataCExcepinfo;
+HRESULT
+CExcepinfo::Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk)
+{
+ HRESULT hresult;
+ CExcepinfo FAR* pcsa;
+ ITypeInfo FAR* ptinfo;
+
+ if(punkOuter != NULL)
+ return RESULT(CLASS_E_NOAGGREGATION);
+
+ pcsa = new FAR CExcepinfo();
+ if(pcsa == NULL)
+ return NULL;
+
+ pcsa->AddRef();
+
+ hresult =
+ CreateDispTypeInfo(&g_idataCExcepinfo, LOCALE_SYSTEM_DEFAULT, &ptinfo);
+ if(HRESULT_FAILED(hresult))
+ goto LError0;
+
+ pcsa->m_ptinfo = ptinfo;
+
+ *ppunk = (IUnknown FAR*)pcsa;
+
+ IncObjectCount();
+
+ return NOERROR;
+
+LError0:;
+ pcsa->Release();
+
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CExcepinfo::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(!IsEqualIID(riid, IID_IUnknown))
+ if(!IsEqualIID(riid, IID_IDispatch)) {
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+ }
+
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CExcepinfo::AddRef(void)
+{
+ return ++m_refs;
+}
+
+
+STDMETHODIMP_(unsigned long)
+CExcepinfo::Release(void)
+{
+ if(--m_refs == 0){
+ if(m_ptinfo != NULL)
+ m_ptinfo->Release();
+ DecObjectCount();
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// IDispatch Methods
+//---------------------------------------------------------------------
+
+
+STDMETHODIMP
+CExcepinfo::GetTypeInfoCount(unsigned int FAR* pctinfo)
+{
+ *pctinfo = 1;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CExcepinfo::GetTypeInfo(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo)
+{
+ if(itinfo != 1)
+ return RESULT(DISP_E_BADINDEX);
+
+ if(lcid != LOCALE_SYSTEM_DEFAULT)
+ return RESULT(DISP_E_UNKNOWNLCID);
+
+ m_ptinfo->AddRef();
+ *pptinfo = m_ptinfo;
+
+ return NOERROR;
+}
+
+
+STDMETHODIMP
+CExcepinfo::GetIDsOfNames(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid)
+{
+ UNUSED(lcid);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return RESULT(DISP_E_UNKNOWNINTERFACE);
+
+ return DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);
+}
+
+
+STDMETHODIMP
+CExcepinfo::Invoke(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr)
+{
+ UNUSED(lcid);
+ UNUSED(wFlags);
+ UNUSED(pdispparams);
+ UNUSED(pvarResult);
+ UNUSED(puArgErr);
+
+ if(!IsEqualIID(riid, IID_NULL))
+ return RESULT(DISP_E_UNKNOWNINTERFACE);
+
+ DoPrintf("CExcepinfo::Invoke(dispidMember=%ld)\n", dispidMember);
+
+ if(pexcepinfo == NULL)
+ return RESULT(E_INVALIDARG);
+
+ switch(dispidMember){
+ case IDMEMBER_CEXCEPINFO_EXCEPINFO0:
+ pexcepinfo->wCode = 0;
+ pexcepinfo->bstrSource = SysAllocString(OLESTR("CExcepinfo::excepinfo0()"));
+ pexcepinfo->bstrDescription = SysAllocString(OLESTR("exception test #0"));
+ pexcepinfo->bstrHelpFile = SysAllocString(OLESTR("<help file name #0>"));
+ pexcepinfo->dwHelpContext = 0L;
+ return RESULT(DISP_E_EXCEPTION);
+
+ case IDMEMBER_CEXCEPINFO_EXCEPINFO1:
+ pexcepinfo->wCode = 1;
+ pexcepinfo->bstrSource = SysAllocString(OLESTR("CExcepinfo::excepinfo1()"));
+ pexcepinfo->bstrDescription = SysAllocString(OLESTR("exception test #1"));
+ pexcepinfo->bstrHelpFile = SysAllocString(OLESTR("<help file name #1>"));
+ pexcepinfo->dwHelpContext = 1L;
+ return RESULT(DISP_E_EXCEPTION);
+
+ case IDMEMBER_CEXCEPINFO_EXCEPINFO2:
+ pexcepinfo->wCode = 2;
+ pexcepinfo->pfnDeferredFillIn = Excepinfo2DeferredFillIn;
+ return RESULT(DISP_E_EXCEPTION);
+
+ default:
+ return RESULT(DISP_E_MEMBERNOTFOUND);
+ }
+
+ ASSERT(UNREACHED);
+ return NOERROR;
+}
+
+
+STDAPI
+Excepinfo2DeferredFillIn(EXCEPINFO FAR* pexcepinfo)
+{
+ pexcepinfo->bstrSource = SysAllocString(OLESTR("CExcepinfo::excepinfo2()"));
+ pexcepinfo->bstrDescription =
+ SysAllocString(OLESTR("exception test #2 : deferred fillin"));
+ pexcepinfo->bstrHelpFile = SysAllocString(OLESTR("<help file name #2>"));
+ pexcepinfo->dwHelpContext = 2L;
+
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// Introduced methods
+//---------------------------------------------------------------------
+
+/*
+ * These are all stubs that should never get called. Nothing happens
+ * here because the testing work is all done within the implementation
+ * of CExcepinfo::Invoke().
+ *
+ */
+
+STDMETHODIMP
+CExcepinfo::excepinfo0()
+{
+ ASSERT(UNREACHED);
+ return RESULT(E_UNEXPECTED);
+}
+
+STDMETHODIMP
+CExcepinfo::excepinfo1()
+{
+ ASSERT(UNREACHED);
+ return RESULT(E_UNEXPECTED);
+}
+
+STDMETHODIMP
+CExcepinfo::excepinfo2()
+{
+ ASSERT(UNREACHED);
+ return RESULT(E_UNEXPECTED);
+}
+
diff --git a/private/oleauto/tests/sdisptst/cexinfo.h b/private/oleauto/tests/sdisptst/cexinfo.h
new file mode 100644
index 000000000..50065633e
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cexinfo.h
@@ -0,0 +1,97 @@
+/***
+*cexinfo.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CExcepinfo IDispatch test Object. This object use
+* used to test SafeArray remoting support.
+*
+*Revision History:
+*
+* [00] 29-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef __cplusplus /* { */
+
+class CExcepinfo : public IDispatch
+{
+public:
+ static HRESULT Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk);
+
+ // IUnknown methods
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // IDispatch methods
+ STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo);
+ STDMETHOD(GetTypeInfo)(
+ unsigned int itinfo,
+ LCID lcid,
+ ITypeInfo FAR* FAR* pptinfo);
+ STDMETHOD(GetIDsOfNames)(
+ REFIID riid,
+ OLECHAR FAR* FAR* rgszNames,
+ unsigned int cNames,
+ LCID lcid,
+ DISPID FAR* rgdispid);
+ STDMETHOD(Invoke)(
+ DISPID dispidMember,
+ REFIID riid,
+ LCID lcid,
+ unsigned short wFlags,
+ DISPPARAMS FAR* pdispparams,
+ VARIANT FAR* pvarResult,
+ EXCEPINFO FAR* pexcepinfo,
+ unsigned int FAR* puArgErr);
+
+ // Introduced methods
+ STDMETHOD(excepinfo0) (void);
+ STDMETHOD(excepinfo1) (void);
+ STDMETHOD(excepinfo2) (void);
+
+private:
+ CExcepinfo();
+
+ ITypeInfo FAR* m_ptinfo;
+
+ unsigned long m_refs;
+};
+
+#endif /* } */
+
+// CExcepinfo method indices.
+//
+enum CEXCEPINFO_METHODS
+{
+ IMETH_CEXCEPINFO_QUERYINTERFACE = 0,
+ IMETH_CEXCEPINFO_ADDREF,
+ IMETH_CEXCEPINFO_RELEASE,
+ IMETH_CEXCEPINFO_GETTYPEINFOCOUNT,
+ IMETH_CEXCEPINFO_GETTYPEINFO,
+ IMETH_CEXCEPINFO_GETIDSOFNAMES,
+ IMETH_CEXCEPINFO_INVOKE,
+
+ IMETH_CEXCEPINFO_EXCEPINFO0,
+ IMETH_CEXCEPINFO_EXCEPINFO1,
+ IMETH_CEXCEPINFO_EXCEPINFO2,
+
+ IMETH_CEXCEPINFO_MAX
+};
+
+
+// CExcepinfo member IDs
+//
+enum CEXCEPINFO_MEMBER_IDS
+{
+ IDMEMBER_CEXCEPINFO_EXCEPINFO0 = 0,
+ IDMEMBER_CEXCEPINFO_EXCEPINFO1,
+ IDMEMBER_CEXCEPINFO_EXCEPINFO2,
+
+ IDMEMBER_CEXCEPINFO_MAX
+};
diff --git a/private/oleauto/tests/sdisptst/clsid.c b/private/oleauto/tests/sdisptst/clsid.c
new file mode 100644
index 000000000..e3f02fcf5
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/clsid.c
@@ -0,0 +1,45 @@
+/***
+*clsid.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates and initializes the CLSIDs.
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# ifdef _MSC_VER
+# include <macos/types.h>
+# include <macos/packages.h>
+# include <macos/resource.h>
+# include <macos/menus.h>
+# include <macos/windows.h>
+# include <macos/osutils.h>
+# include <macos/appleeve.h>
+# else
+# include <types.h>
+# include <packages.h>
+# include <resources.h>
+# include <menus.h>
+# include <windows.h>
+# include <appleevents.h>
+# include <osutils.h>
+# include <AppleEvents.h>
+# endif
+#else
+# include <windows.h>
+#endif
+
+#include <ole2.h>
+
+// this redefines the DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+// due to the previous header, including this causes the DEFINE_GUID
+// definitions in the following header(s) to actually allocate data.
+//
+#include "clsid.h"
+
diff --git a/private/oleauto/tests/sdisptst/clsid.h b/private/oleauto/tests/sdisptst/clsid.h
new file mode 100644
index 000000000..6f2ddf132
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/clsid.h
@@ -0,0 +1,34 @@
+/***
+*clsid.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file defines the CLSIDs
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+// GUID for sdisptst's type library
+DEFINE_OLEGUID(LIBID_SDispTst, 0x00020472, 0, 0);
+
+// exposed classes
+DEFINE_OLEGUID(CLSID_SDispTst_CDispTst, 0x00020460, 0, 0);
+DEFINE_OLEGUID(CLSID_SDispTst_CSArray, 0x00020461, 0, 0);
+DEFINE_OLEGUID(CLSID_SDispTst_CExcepinfo, 0x00020466, 0, 0);
+DEFINE_OLEGUID(CLSID_SDispTst_CProp, 0x00020471, 0, 0);
+
+// the sdisptst application object
+DEFINE_OLEGUID(CLSID_SDispTst_CAppObject, 0x00020468, 0, 0);
+
+#if VBA2
+DEFINE_OLEGUID(IID_IDualTst, 0x00020475, 0, 0);
+DEFINE_OLEGUID(CLSID_SDispTst_CDualTst, 0x00020476, 0, 0);
+#endif
+
+#if OE_WIN32 && 0
+DEFINE_OLEGUID(CLSID_SDispTst_CWExcepinfo, 0x00020474, 0, 0);
+#endif
+
diff --git a/private/oleauto/tests/sdisptst/cprop.cpp b/private/oleauto/tests/sdisptst/cprop.cpp
new file mode 100644
index 000000000..4db10e99b
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cprop.cpp
@@ -0,0 +1,471 @@
+/***
+*cprop.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* UNDONE
+*
+*
+*Revision History:
+*
+* [00] 02-Apr-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include "sdisptst.h"
+#include "dispdbug.h"
+#include "cprop.h"
+
+ASSERTDATA
+
+
+//---------------------------------------------------------------------
+// implementation of CPropIndex1
+//---------------------------------------------------------------------
+
+static PARAMDATA NEARDATA rgpdataPutValue[] = {{OLESTR(""), VT_I2}, {OLESTR(""), VT_I2}};
+static PARAMDATA NEARDATA rgpdataGetValue[] = {{OLESTR(""), VT_I2}};
+
+static METHODDATA NEARDATA g_mdataCPropIndex1[] = {
+ {
+ OLESTR("value"),
+ rgpdataPutValue,
+ DISPID_VALUE,
+ IMETH_CPROPINDEX1_PUTVALUE,
+ CC_CDECL,
+ DIM(rgpdataPutValue),
+ DISPATCH_PROPERTYPUT,
+ VT_EMPTY
+ },
+ { OLESTR("value"),
+ rgpdataGetValue,
+ DISPID_VALUE,
+ IMETH_CPROPINDEX1_GETVALUE,
+ CC_CDECL,
+ DIM(rgpdataGetValue),
+ DISPATCH_PROPERTYGET,
+ VT_VARIANT
+ }
+};
+
+static INTERFACEDATA NEARDATA g_idataCPropIndex1 = {
+ g_mdataCPropIndex1, DIM(g_mdataCPropIndex1)
+};
+
+HRESULT
+CPropIndex1::Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk)
+{
+ HRESULT hresult;
+ CPropIndex1 FAR* pprop;
+ ITypeInfo FAR* ptinfo;
+ IUnknown FAR* punkDisp;
+
+ if(punkOuter != NULL)
+ return RESULT(CLASS_E_NOAGGREGATION);
+
+ if((pprop = new FAR CPropIndex1()) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ pprop->AddRef();
+ IfFailGo(CreateDispTypeInfo(&g_idataCPropIndex1, 0, &ptinfo), LError1);
+ IfFailGo(CreateStdDispatch(pprop, pprop, ptinfo, &punkDisp), LError2);
+ ptinfo->Release();
+ pprop->m_punkDisp = punkDisp;
+ *ppunk = (IUnknown FAR*)pprop;
+ return NOERROR;
+
+LError2:;
+ ptinfo->Release();
+LError1:;
+ pprop->Release();
+LError0:;
+ return hresult;
+}
+
+STDMETHODIMP
+CPropIndex1::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ if(IsEqualIID(riid, IID_IDispatch)){
+ return m_punkDisp->QueryInterface(riid, ppv);
+ }
+
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CPropIndex1::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CPropIndex1::Release()
+{
+ if(--m_refs == 0){
+ if(m_punkDisp != NULL){
+ unsigned long refs = m_punkDisp->Release();
+ ASSERT(refs == 0);
+ }
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP_(void)
+CPropIndex1::put_value(short ix, short sVal)
+{
+ DoPrintf("CPropIndex1::put_value(ix=%d, sVal=%d)\n", (int)ix, (int)sVal);
+
+ if(ix < 0 || ix >= DIM(m_prop))
+ return; // how do we return an error for this?
+
+ m_prop[ix] = sVal;
+}
+
+STDMETHODIMP_(VARIANT)
+CPropIndex1::get_value(short ix)
+{
+ VARIANT var;
+
+ DoPrintf("CPropIndex1::get_value(ix=%d)\n", (int)ix);
+
+ if(ix < 0 || ix >= DIM(m_prop)){
+ V_VT(&var) = VT_ERROR;
+ V_ERROR(&var) = DISP_E_BADINDEX;
+ return var;
+ }
+
+ V_VT(&var) = VT_I2;
+ V_I2(&var) = m_prop[ix];
+ return var;
+}
+
+
+static PARAMDATA NEARDATA rgpdataPutProp0[] = {{OLESTR(""), VT_I2}};
+
+static PARAMDATA NEARDATA rgpdataPutProp1[] = {{OLESTR(""), VT_I2}, {OLESTR(""), VT_I2}};
+static PARAMDATA NEARDATA rgpdataGetProp1[] = {{OLESTR(""), VT_I2}};
+
+static PARAMDATA NEARDATA rgpdataPutProp2[] = {{OLESTR(""), VT_I2}, {OLESTR(""),VT_I2}, {OLESTR(""),VT_I2}};
+static PARAMDATA NEARDATA rgpdataGetProp2[] = {{OLESTR(""), VT_I2}, {OLESTR(""), VT_I2}};
+
+static PARAMDATA NEARDATA rgpdataPutProp3[] = {{OLESTR(""), VT_DISPATCH}};
+
+static METHODDATA NEARDATA g_mdataCProp[] = {
+ { OLESTR("prop0"),
+ rgpdataPutProp0,
+ IDMEMBER_CPROP_PROP0,
+ IMETH_CPROP_PUTPROP0,
+ CC_CDECL,
+ DIM(rgpdataPutProp0),
+ DISPATCH_PROPERTYPUT,
+ VT_EMPTY
+ },
+ { OLESTR("prop0"),
+ NULL,
+ IDMEMBER_CPROP_PROP0,
+ IMETH_CPROP_GETPROP0,
+ CC_CDECL,
+ 0,
+ DISPATCH_PROPERTYGET,
+ VT_I2
+ },
+ { OLESTR("prop1"),
+ rgpdataPutProp1,
+ IDMEMBER_CPROP_PROP1,
+ IMETH_CPROP_PUTPROP1,
+ CC_CDECL,
+ DIM(rgpdataPutProp1),
+ DISPATCH_PROPERTYPUT,
+ VT_EMPTY
+ },
+ { OLESTR("prop1"),
+ rgpdataGetProp1,
+ IDMEMBER_CPROP_PROP1,
+ IMETH_CPROP_GETPROP1,
+ CC_CDECL,
+ DIM(rgpdataGetProp1),
+ DISPATCH_PROPERTYGET,
+ VT_VARIANT
+ },
+ { OLESTR("prop2"),
+ rgpdataPutProp2,
+ IDMEMBER_CPROP_PROP2,
+ IMETH_CPROP_PUTPROP2,
+ CC_CDECL,
+ DIM(rgpdataPutProp2),
+ DISPATCH_PROPERTYPUT,
+ VT_EMPTY
+ },
+ { OLESTR("prop2"),
+ rgpdataGetProp2,
+ IDMEMBER_CPROP_PROP2,
+ IMETH_CPROP_GETPROP2,
+ CC_CDECL,
+ DIM(rgpdataGetProp2),
+ DISPATCH_PROPERTYGET,
+ VT_VARIANT
+ },
+ { OLESTR("prop3"),
+ rgpdataPutProp3,
+ IDMEMBER_CPROP_PROP3,
+ IMETH_CPROP_PUTPROP3,
+ CC_CDECL,
+ DIM(rgpdataPutProp3),
+ DISPATCH_PROPERTYPUT,
+ VT_EMPTY
+ },
+ { OLESTR("prop3"),
+ NULL,
+ IDMEMBER_CPROP_PROP3,
+ IMETH_CPROP_GETPROP3,
+ CC_CDECL,
+ 0,
+ DISPATCH_PROPERTYGET,
+ VT_DISPATCH
+ },
+
+ { OLESTR("prop4"),
+ NULL,
+ IDMEMBER_CPROP_PROP4,
+ IMETH_CPROP_GETPROP4,
+ CC_CDECL,
+ 0,
+ DISPATCH_PROPERTYGET,
+ VT_DISPATCH
+ }
+};
+
+static INTERFACEDATA NEARDATA g_idataCProp = {
+ g_mdataCProp, DIM(g_mdataCProp)
+};
+
+CProp::CProp()
+{
+ m_refs = 0;
+ m_punkDisp = NULL;
+ m_prop0 = 0;
+ MEMSET(m_prop1, 0, sizeof(m_prop1));
+ MEMSET(m_prop2, 0, sizeof(m_prop2));
+ m_pdispProp3 = NULL;
+ m_pdispProp4 = NULL;
+}
+
+/***
+*HRESULT CProp::Create
+*Purpose:
+* Create and initialize an instance of the CAppObject class
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppunk - the newly created instance
+*
+***********************************************************************/
+HRESULT
+CProp::Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk)
+{
+ HRESULT hresult;
+ CProp FAR* pprop;
+ ITypeInfo FAR* ptinfo;
+ IUnknown FAR* punkDisp;
+
+ if(punkOuter != NULL)
+ return RESULT(CLASS_E_NOAGGREGATION);
+
+ if((pprop = new FAR CProp()) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ pprop->AddRef();
+ IfFailGo(CreateDispTypeInfo(&g_idataCProp, 0, &ptinfo), LError1);
+ IfFailGo(CreateStdDispatch(pprop, pprop, ptinfo, &punkDisp), LError2);
+ ptinfo->Release();
+ pprop->m_punkDisp = punkDisp;
+
+ // create and attach the collection property implementations
+
+ IUnknown FAR* punk;
+ IDispatch FAR* pdisp;
+
+ IfFailGo(CPropIndex1::Create(NULL, &punk), LError2);
+ IfFailGo(
+ punk->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp), LError2);
+ pprop->m_pdispProp3 = pdisp;
+ pdisp->AddRef();
+ pprop->m_pdispProp4 = pdisp;
+
+ *ppunk = (IUnknown FAR*)pprop;
+ return NOERROR;
+
+LError2:;
+ ptinfo->Release();
+LError1:;
+ pprop->Release();
+LError0:;
+ return hresult;
+}
+
+STDMETHODIMP
+CProp::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ if(IsEqualIID(riid, IID_IDispatch)){
+ return m_punkDisp->QueryInterface(riid, ppv);
+ }
+
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CProp::AddRef()
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CProp::Release()
+{
+ if(--m_refs == 0){
+ if(m_pdispProp3 != NULL)
+ m_pdispProp3->Release();
+ if(m_pdispProp4 != NULL)
+ m_pdispProp4->Release();
+ if(m_punkDisp != NULL){
+ unsigned long refs = m_punkDisp->Release();
+ ASSERT(refs == 0);
+ }
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+STDMETHODIMP_(void)
+CProp::put_prop0(short sVal)
+{
+ DoPrintf("CProp::put_prop0(sVal=%d)\n", (int)sVal);
+
+ m_prop0 = sVal;
+}
+
+STDMETHODIMP_(short)
+CProp::get_prop0()
+{
+ DoPrintf("CProp::get_prop0()\n");
+
+ return m_prop0;
+}
+
+STDMETHODIMP_(void)
+CProp::put_prop1(short ix, short sVal)
+{
+ DoPrintf("CProp::put_prop1(ix=%d, sVal=%d)\n", (int)ix, (int)sVal);
+
+ if(ix < 0 || ix >= DIM(m_prop1))
+ return; // how do we report the error?
+
+ m_prop1[ix] = sVal;
+}
+
+STDMETHODIMP_(VARIANT)
+CProp::get_prop1(short ix)
+{
+ VARIANT var;
+
+ DoPrintf("CProp::get_prop1(ix=%d)\n", (int)ix);
+
+ if(ix < 0 || ix >= DIM(m_prop1)){
+ V_VT(&var) = VT_ERROR;
+ V_ERROR(&var) = DISP_E_BADINDEX;
+ return var;
+ }
+
+ V_VT(&var) = VT_I2;
+ V_I2(&var) = m_prop1[ix];
+
+ return var;
+}
+
+STDMETHODIMP_(void)
+CProp::put_prop2(short ix1, short ix2, short sVal)
+{
+ DoPrintf("CProp::put_prop2(ix1=%d, ix2=%d, sVal=%d)\n", (int)ix1, (int)ix2, (int)sVal);
+
+ if(ix1 < 0 || ix1 >= 5)
+ return; // how do we report an error here?
+ if(ix2 < 0 || ix2 >= 5)
+ return; // how do we report an error here?
+
+ m_prop2[ix1][ix2] = sVal;
+}
+
+STDMETHODIMP_(VARIANT)
+CProp::get_prop2(short ix1, short ix2)
+{
+ VARIANT var;
+
+ DoPrintf("CProp::get_prop2(ix1=%d, ix2=%d)\n", (int)ix1, (int)ix2);
+
+ if((ix1 < 0 || ix1 >= 5) || (ix2 < 0 || ix2 >= 5)){
+ V_VT(&var) = VT_ERROR;
+ V_ERROR(&var) = DISP_E_BADINDEX;
+ return var;
+ }
+
+ V_VT(&var) = VT_I2;
+ V_I2(&var) = m_prop2[ix1][ix2];
+ return var;
+}
+
+STDMETHODIMP_(void)
+CProp::put_prop3(IDispatch FAR* pdisp)
+{
+ DoPrintf("CProp::put_prop3(pdisp=0x%x)\n", (int)pdisp);
+
+ if(m_pdispProp3 != NULL)
+ m_pdispProp3->Release();
+ m_pdispProp3 = pdisp;
+}
+
+STDMETHODIMP_(IDispatch FAR*)
+CProp::get_prop3()
+{
+ DoPrintf("CProp::get_prop3()\n");
+
+ if(m_pdispProp3 != NULL)
+ m_pdispProp3->AddRef();
+ return m_pdispProp3;
+}
+
+STDMETHODIMP_(IDispatch FAR*)
+CProp::get_prop4()
+{
+ DoPrintf("CProp::get_prop4()\n");
+
+ if(m_pdispProp4 != NULL)
+ m_pdispProp4->AddRef();
+ return m_pdispProp4;
+}
+
+
diff --git a/private/oleauto/tests/sdisptst/cprop.h b/private/oleauto/tests/sdisptst/cprop.h
new file mode 100644
index 000000000..9e38ba817
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/cprop.h
@@ -0,0 +1,127 @@
+/***
+*cprop.h
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+* [00] 02-Apr-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef __cplusplus /* { */
+
+class CPropIndex1 : public IUnknown {
+public:
+ static HRESULT CPropIndex1::Create(
+ IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // indexed value property
+ STDMETHOD_(void, put_value)(short ix, short sVal);
+ STDMETHOD_(VARIANT, get_value)(short ix);
+
+ CPropIndex1() {
+ m_refs = 0;
+ m_punkDisp = NULL;
+ MEMSET(m_prop, 0, sizeof(m_prop));
+ }
+
+private:
+ short m_prop[5];
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punkDisp;
+};
+
+#endif /* } */
+
+enum IMETH_CPROPINDEX1 {
+ IMETH_CPROPINDEX1_QUERYINTERFACE = 0,
+ IMETH_CPROPINDEX1_ADDREF,
+ IMETH_CPROPINDEX1_RELEASE,
+
+ IMETH_CPROPINDEX1_PUTVALUE,
+ IMETH_CPROPINDEX1_GETVALUE
+};
+
+#ifdef __cplusplus
+
+class CProp : public IUnknown {
+public:
+ static HRESULT CProp::Create(
+ IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk);
+
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // simple property
+ STDMETHOD_(void, put_prop0)(short sVal);
+ STDMETHOD_(short, get_prop0)(void);
+
+ // indexed property
+ STDMETHOD_(void, put_prop1)(short ix, short sVal);
+ STDMETHOD_(VARIANT, get_prop1)(short ix);
+
+ // indexed property (more indices)
+ STDMETHOD_(void, put_prop2)(short ix1, short ix2, short sVal);
+ STDMETHOD_(VARIANT, get_prop2)(short ix1, short ix2);
+
+ // collection property, with a put method
+ STDMETHOD_(void, put_prop3)(IDispatch FAR* pdispCollection);
+ STDMETHOD_(IDispatch FAR*, get_prop3)(void);
+
+ // collection property without a put method
+ STDMETHOD_(IDispatch FAR*, get_prop4)(void);
+
+ CProp();
+
+private:
+
+ short m_prop0;
+ short m_prop1[5];
+ short m_prop2[5][5];
+ IDispatch FAR* m_pdispProp3;
+ IDispatch FAR* m_pdispProp4;
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punkDisp;
+};
+
+#endif
+
+enum IMETH_CPROP {
+ // placeholders
+ IMETH_CPROP_QUERYINTERFACE,
+ IMETH_CPROP_ADDREF,
+ IMETH_CPROP_RELEASE,
+
+ // exposed methods
+ IMETH_CPROP_PUTPROP0,
+ IMETH_CPROP_GETPROP0,
+ IMETH_CPROP_PUTPROP1,
+ IMETH_CPROP_GETPROP1,
+ IMETH_CPROP_PUTPROP2,
+ IMETH_CPROP_GETPROP2,
+ IMETH_CPROP_PUTPROP3,
+ IMETH_CPROP_GETPROP3,
+ IMETH_CPROP_GETPROP4
+};
+
+enum IDMEMBER_CPROP {
+ IDMEMBER_CPROP_PROP0 = DISPID_VALUE,
+ IDMEMBER_CPROP_PROP1,
+ IDMEMBER_CPROP_PROP2,
+ IDMEMBER_CPROP_PROP3,
+ IDMEMBER_CPROP_PROP4
+};
+
diff --git a/private/oleauto/tests/sdisptst/csarray.cpp b/private/oleauto/tests/sdisptst/csarray.cpp
new file mode 100644
index 000000000..bd9a70883
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/csarray.cpp
@@ -0,0 +1,831 @@
+/***
+*csarray.cpp - Implementation of the CSArray IDispatch test object.
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file implements the CSArray object, which is used for testing
+* IDispatch SafeArray remoting support.
+*
+*Revision History:
+*
+* [00] 21-Sep-92 bradlo: Created.
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+
+#include "sdisptst.h"
+#include "dispdbug.h"
+#include "csarray.h"
+
+ASSERTDATA
+
+
+CSArray::CSArray()
+{
+ m_refs = 0;
+ m_punkDisp = NULL;
+}
+
+
+//#ifndef WIN32
+
+extern "C" INTERFACEDATA g_idataCSArray;
+
+HRESULT CSArray::CreateDisp()
+{
+ HRESULT hresult;
+ IUnknown FAR* punkDisp;
+ ITypeInfo FAR* ptinfo;
+
+ // Create IDispatch Interface component
+ hresult =
+ CreateDispTypeInfo(&g_idataCSArray, LOCALE_SYSTEM_DEFAULT, &ptinfo);
+
+ if(hresult != NOERROR)
+ return hresult;
+
+ hresult = CreateStdDispatch(this, this, ptinfo, &punkDisp);
+ if(hresult != NOERROR)
+ return hresult;
+
+ m_punkDisp = punkDisp;
+ ptinfo->Release();
+
+ return NOERROR;
+}
+
+#if 0
+//#else /* automatically created by dual CreateStdDispatch implementation */
+
+extern "C" WINTERFACEDATA g_WidataCSArray;
+
+HRESULT CSArray::CreateDispW()
+{
+ HRESULT hresult;
+ IUnknown FAR* punkDisp;
+ ITypeInfoW FAR* ptinfo;
+ WINTERFACEDATA FAR* pidata;
+
+ //UNDONE: until readl InterfaceDataAtoW exists
+ //pidata = InterfaceDataAtoW(&g_WidataCSArray);
+ pidata = &g_WidataCSArray;
+
+ // Create IDispatch Interface component
+ hresult =
+ CreateDispTypeInfoW(pidata, LOCALE_SYSTEM_DEFAULT, &ptinfo);
+ if(hresult != NOERROR)
+ return hresult;
+
+ hresult = CreateStdDispatchW(this, this, ptinfo, &punkDisp);
+ if(hresult != NOERROR)
+ return hresult;
+
+ m_punkDisp = punkDisp;
+ ptinfo->Release();
+
+ return NOERROR;
+}
+#endif
+
+/***
+*HRESULT CSArray::Create(IUnknown*, IUnknown**)
+*Purpose:
+* Create and initialize an instance of the CSArray test object.
+*
+*Entry:
+* None
+*
+*Exit:
+* return value = HRESULT
+*
+* *ppcsa = the newly created CSArray*
+*
+***********************************************************************/
+HRESULT
+CSArray::Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk)
+{
+ HRESULT hresult;
+ CSArray FAR* pcsa;
+
+ if(punkOuter != NULL)
+ return RESULT(CLASS_E_NOAGGREGATION);
+
+ if((pcsa = new FAR CSArray()) == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+ pcsa->AddRef();
+
+//#ifndef WIN32
+ hresult = pcsa->CreateDisp();
+ if (hresult != NOERROR)
+ goto LError1;
+
+#if 0
+//#else /* automatically created by dual CreateStdDispatch implementation */
+ hresult = pcsa->CreateDispW();
+ if (hresult != NOERROR)
+ goto LError1;
+#endif
+
+ *ppunk = (IUnknown FAR*)pcsa;
+
+ IncObjectCount();
+
+ return NOERROR;
+
+LError1:;
+ pcsa->Release();
+
+LError0:;
+ return hresult;
+}
+
+
+//---------------------------------------------------------------------
+// IUnknown Methods
+//---------------------------------------------------------------------
+
+STDMETHODIMP
+CSArray::QueryInterface(REFIID riid, void FAR* FAR* ppv)
+{
+ if(IsEqualIID(riid, IID_IUnknown)){
+ *ppv = this;
+ AddRef();
+ return NOERROR;
+ }
+ if(IsEqualIID(riid, IID_IDispatch)) {
+ return m_punkDisp->QueryInterface(riid, ppv);
+ }
+
+ *ppv = NULL;
+ return RESULT(E_NOINTERFACE);
+}
+
+STDMETHODIMP_(unsigned long)
+CSArray::AddRef(void)
+{
+ return ++m_refs;
+}
+
+STDMETHODIMP_(unsigned long)
+CSArray::Release(void)
+{
+ if(--m_refs == 0){
+ if(m_punkDisp != NULL){
+ unsigned long refs = m_punkDisp->Release();
+ ASSERT(refs == 0);
+ }
+ DecObjectCount();
+ delete this;
+ return 0;
+ }
+ return m_refs;
+}
+
+
+//---------------------------------------------------------------------
+// Introduced Methods
+//---------------------------------------------------------------------
+
+/***
+*PRIVATE HRESULT VariantInc(VARIANT FAR*)
+*Purpose:
+* 'Incriment' the given variant. This operation has different
+* meanings depending on the type tag of the variant.
+*
+*Entry:
+* pvar = pointer to the VARIANT to inc
+*
+*Exit:
+* return value = HRESULT
+*
+* *pvar = pointer to the VARIANT with its data 'incrimented'
+*
+***********************************************************************/
+STDMETHODIMP
+VariantInc(VARIANT FAR* pvar)
+{
+ VARTYPE vt;
+
+ switch(V_VT(pvar)){
+ case VT_BOOL:
+ break; // NOTHING
+
+ case VT_CY:
+ ++V_CY(pvar).Hi;
+ ++V_CY(pvar).Lo;
+ break;
+
+#if VBA2
+ case VT_UI1:
+ ++V_UI1(pvar);
+ break;
+#endif //VBA2
+
+ case VT_I2:
+ ++V_I2(pvar);
+ break;
+
+ case VT_I4:
+ case VT_ERROR:
+ ++V_I4(pvar);
+ break;
+
+ case VT_R4:
+ V_R4(pvar) += (float)1.0;
+ break;
+
+ case VT_R8:
+ case VT_DATE:
+ V_R8(pvar) += 1.0;
+ break;
+
+ default:
+ vt = V_VT(pvar);
+ IfFailRet(VariantChangeType(pvar, pvar, 0, VT_I4));
+ ++V_I4(pvar);
+ IfFailRet(VariantChangeType(pvar, pvar, 0, vt));
+ break;
+
+ case VT_VARIANT:
+ case VT_DISPATCH:
+ return RESULT(E_INVALIDARG);
+ }
+
+ return NOERROR;
+}
+
+/***
+*PRIVATE HRESULT DefSafeArrayTest(SAFEARRAY*, VARTYPE, int)
+*Purpose:
+* The 'default' SafeArray (invoke) test.
+*
+* Verify that each element of the given array, properly coerced,
+* is equal to the sum of that elements indices.
+*
+* If its a ByRef test, then incriment each element by one.
+*
+*Entry:
+* psa = pointer to a SafeArray
+* vt = VARTYPE of the SafeArray in question
+*
+*Exit:
+* return value = HRESULT
+* S_OK
+* E_INVALIDARG
+*
+***********************************************************************/
+STDMETHODIMP
+DefSafeArrayTest(SAFEARRAY FAR* psa, VARTYPE vt, int fByRef)
+{
+ HRESULT hresult;
+
+ DbPrSafeArray(psa, vt);
+
+ if(psa == NULL)
+ return NOERROR;
+
+ IfFailRet(SafeArrayValidateIdentity(vt, psa, 0L));
+
+ if(!fByRef)
+ return NOERROR;
+
+ VARIANT var;
+ void FAR* pv;
+ long FAR* rgIndices;
+
+ rgIndices = new FAR long[psa->cDims];
+ if(rgIndices == NULL){
+ hresult = RESULT(E_OUTOFMEMORY);
+ goto LError0;
+ }
+
+ for(hresult = first_element(psa->cDims, psa->rgsabound, rgIndices);
+ hresult == NOERROR;
+ hresult = next_element(psa->cDims, psa->rgsabound, rgIndices))
+ {
+ if(vt == VT_VARIANT){
+ pv = &var;
+ }else{
+ V_VT(&var) = vt;
+ pv = &V_NONE(&var);
+ }
+
+ IfFailGo(SafeArrayGetElement(psa, rgIndices, pv), LError1);
+
+ hresult = VariantInc(&var);
+ if(HRESULT_FAILED(hresult)){
+ VariantClear(&var);
+ goto LError1;
+ }
+
+ if(vt == VT_BSTR)
+ pv = (void FAR*)V_BSTR(&var);
+
+ // REVIEW: need to do the same for VT_DISPATCH when we add support
+
+ IfFailGo(SafeArrayPutElement(psa, rgIndices, pv), LError1);
+
+ hresult = VariantClear(&var);
+ ASSERT(hresult == NOERROR);
+ }
+
+ hresult = NOERROR;
+
+LError1:;
+ delete rgIndices;
+
+LError0:;
+ return hresult;
+}
+
+
+/*
+ * ByVal SafeArray methods
+ *
+ */
+
+#if VBA2
+STDMETHODIMP
+CSArray::UI1SafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::UI1SafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_UI1, FALSE);
+}
+#endif //VBA2
+
+STDMETHODIMP
+CSArray::I2SafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::I2SafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_I2, FALSE);
+}
+
+STDMETHODIMP
+CSArray::I4SafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::I4SafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_I4, FALSE);
+}
+
+STDMETHODIMP
+CSArray::R4SafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::R4SafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_R4, FALSE);
+}
+
+STDMETHODIMP
+CSArray::R8SafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::R8SafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_R8, FALSE);
+}
+
+STDMETHODIMP
+CSArray::CySafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::CySafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_CY, FALSE);
+}
+
+STDMETHODIMP
+CSArray::DateSafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::DateSafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_DATE, FALSE);
+}
+
+STDMETHODIMP
+CSArray::BstrSafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::BstrSafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_BSTR, FALSE);
+}
+
+#if OE_WIN32 && 0
+STDMETHODIMP
+CSArray::WBstrSafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::WBstrSafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_WBSTR, FALSE);
+}
+#endif
+
+STDMETHODIMP
+CSArray::ScodeSafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::ScodeSafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_ERROR, FALSE);
+}
+
+STDMETHODIMP
+CSArray::BoolSafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::BoolSafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_BOOL, FALSE);
+}
+
+STDMETHODIMP
+CSArray::VarSafeArray(SAFEARRAY FAR* psa)
+{
+ DoPrintf("CSArray::VarSafeArray(psa=0x%lx)\n", (long)psa);
+
+ return DefSafeArrayTest(psa, VT_VARIANT, FALSE);
+}
+
+
+/*
+ * ByRef SafeArray methods
+ *
+ */
+
+#if VBA2
+STDMETHODIMP
+CSArray::UI1SafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::UI1SafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_UI1, TRUE);
+}
+#endif //VBA2
+
+STDMETHODIMP
+CSArray::I2SafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::I2SafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_I2, TRUE);
+}
+
+STDMETHODIMP
+CSArray::I4SafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::I4SafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_I4, TRUE);
+}
+
+STDMETHODIMP
+CSArray::R4SafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::R4SafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_R4, TRUE);
+}
+
+STDMETHODIMP
+CSArray::R8SafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::R8SafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_R8, TRUE);
+}
+
+STDMETHODIMP
+CSArray::CySafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::CySafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_CY, TRUE);
+}
+
+STDMETHODIMP
+CSArray::DateSafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::DateSafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_DATE, TRUE);
+}
+
+STDMETHODIMP
+CSArray::BstrSafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::BstrSafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_BSTR, TRUE);
+}
+
+
+#if OE_WIN32 && 0
+STDMETHODIMP
+CSArray::WBstrSafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::WBstrSafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_WBSTR, TRUE);
+}
+#endif
+
+
+STDMETHODIMP
+CSArray::ScodeSafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::ScodeSafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_ERROR, TRUE);
+}
+
+STDMETHODIMP
+CSArray::BoolSafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::BoolSafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_BOOL, TRUE);
+}
+
+STDMETHODIMP
+CSArray::VarSafeArrayRef(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::VarSafeArrayRef(ppsa=0x%lx)\n", (long)ppsa);
+
+ return DefSafeArrayTest(*ppsa, VT_VARIANT, TRUE);
+}
+
+STDMETHODIMP
+CSArray::SafeArrayRedim(short vt, SAFEARRAY FAR* FAR* ppsa)
+{
+ unsigned short i;
+ SARRAYDESC sadesc;
+
+ DoPrintf("CSArray::SafeArrayRedim(vt=%d, ppsa=0x%lx)\n", (int)vt, (long)ppsa);
+
+ DbPrSafeArray(*ppsa, vt);
+
+ IfFailRet(SafeArrayValidateIdentity(vt, *ppsa, 0L));
+
+ // a SAFEARRAYDESC can only describe an array of up to 5 dims...
+ if((*ppsa)->cDims > 5)
+ return NOERROR;
+
+ sadesc.cDims = (*ppsa)->cDims;
+ for(i = 0; i < (*ppsa)->cDims; ++i){
+ sadesc.rgsabound[i] = (*ppsa)->rgsabound[i];
+ ++sadesc.rgsabound[i].cElements;
+ }
+
+ IfFailRet(SafeArrayDestroy(*ppsa));
+
+ IfFailRet(SafeArrayCreateIdentity(vt, &sadesc, ppsa));
+
+ return NOERROR;
+}
+
+STDMETHODIMP_(SAFEARRAY FAR*)
+CSArray::I2SafeArrayRet(VARIANT var)
+{
+ HRESULT hrTmp;
+ SAFEARRAY FAR* psa;
+
+ ASSERT(V_VT(&var) == (VT_ARRAY | VT_I2));
+
+ hrTmp = SafeArrayCopy(V_ARRAY(&var), &psa);
+ ASSERT(hrTmp == NOERROR);
+
+ return psa;
+}
+
+
+
+//---------------------------------------------------------------------
+// ByRef SafeArary methods where the callee erases the array
+//---------------------------------------------------------------------
+
+#if VBA2
+STDMETHODIMP
+CSArray::UI1SafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::UI1SafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+#endif //VBA2
+
+STDMETHODIMP
+CSArray::I2SafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::I2SafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::I4SafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::I4SafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::R4SafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::R4SafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::R8SafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::R8SafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::CySafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::CySafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::DateSafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::DateSafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::BstrSafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::BstrSafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::ScodeSafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::ScodeSafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::BoolSafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::BoolSafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::VarSafeArrayErase(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::VarSafeArrayErase(ppsa=0x%lx)\n", (long)ppsa);
+ IfFailRet(SafeArrayDestroy(*ppsa));
+ *ppsa = NULL;
+ return NOERROR;
+}
+
+
+//---------------------------------------------------------------------
+// ByRef SafeArray methods where the callee allocates the array
+//---------------------------------------------------------------------
+
+static SARRAYDESC sadescCalleeAlloc = {
+ 4,
+ {{2,0}, {4,2}, {8,4}, {16,8}, {0,0}}
+};
+
+#if VBA2
+STDMETHODIMP
+CSArray::UI1SafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::UI1SafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_UI1, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+#endif //VBA2
+
+STDMETHODIMP
+CSArray::I2SafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::I2SafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_I2, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::I4SafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::I4SafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_I4, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::R4SafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::R4SafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_R4, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::R8SafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::R8SafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_R8, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::CySafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::CySafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_CY, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::DateSafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::DateSafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_DATE, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::BstrSafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::BstrSafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_BSTR, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::ScodeSafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::ScodeSafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_ERROR, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::BoolSafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::BoolSafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_BOOL, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
+STDMETHODIMP
+CSArray::VarSafeArrayAlloc(SAFEARRAY FAR* FAR* ppsa)
+{
+ DoPrintf("CSArray::VarSafeArrayAlloc(ppsa=0x%lx)\n", (long)ppsa);
+ if(*ppsa != NULL)
+ return RESULT(E_FAIL);
+ IfFailRet(SafeArrayCreateIdentity(VT_VARIANT, &sadescCalleeAlloc, ppsa));
+ return NOERROR;
+}
+
diff --git a/private/oleauto/tests/sdisptst/csarray.h b/private/oleauto/tests/sdisptst/csarray.h
new file mode 100644
index 000000000..960bbb387
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/csarray.h
@@ -0,0 +1,259 @@
+/***
+*csarray.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Definition of the CSArray IDispatch test Object. This object use
+* used to test SafeArray remoting support.
+*
+*Revision History:
+*
+* [00] 29-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifdef __cplusplus /* { */
+
+class CSArray : public IUnknown
+{
+public:
+ static HRESULT Create(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk);
+
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ // ByVal SafeArray methods
+#if VBA2
+ STDMETHOD(UI1SafeArray)(SAFEARRAY FAR* psa);
+#endif //VBA2
+ STDMETHOD(I2SafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(I4SafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(R4SafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(R8SafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(CySafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(DateSafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(BstrSafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(ScodeSafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(BoolSafeArray)(SAFEARRAY FAR* psa);
+ STDMETHOD(VarSafeArray)(SAFEARRAY FAR* psa);
+
+ // ByRef SafeArray methods
+#if VBA2
+ STDMETHOD(UI1SafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+#endif //VBA2
+ STDMETHOD(I2SafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(I4SafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(R4SafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(R8SafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(CySafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(DateSafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(BstrSafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(ScodeSafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(BoolSafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(VarSafeArrayRef)(SAFEARRAY FAR* FAR* ppsa);
+
+ // method redims a byref SafeArray
+ STDMETHOD(SafeArrayRedim)(short vt, SAFEARRAY FAR* FAR* ppsa);
+
+ // method that returns a SafeArray
+ STDMETHOD_(SAFEARRAY FAR*, I2SafeArrayRet)(VARIANT var);
+
+ // ByRef SafeArray methods where callee erases the array
+#if VBA2
+ STDMETHOD(UI1SafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+#endif //VBA2
+ STDMETHOD(I2SafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(I4SafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(R4SafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(R8SafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(CySafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(DateSafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(BstrSafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(ScodeSafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(BoolSafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(VarSafeArrayErase)(SAFEARRAY FAR* FAR* ppsa);
+
+ // ByRef SafeArray methods where callee allocates the array
+#if VBA2
+ STDMETHOD(UI1SafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+#endif //VBA2
+ STDMETHOD(I2SafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(I4SafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(R4SafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(R8SafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(CySafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(DateSafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(BstrSafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(ScodeSafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(BoolSafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+ STDMETHOD(VarSafeArrayAlloc)(SAFEARRAY FAR* FAR* ppsa);
+
+protected:
+
+//#ifndef WIN32
+ HRESULT CreateDisp();
+#if 0
+//#else
+ HRESULT CreateDispW();
+#endif
+
+
+private:
+
+ CSArray();
+
+ unsigned long m_refs;
+ IUnknown FAR* m_punkDisp;
+};
+
+#endif /* } */
+
+/* the following enums are used to build the TypeInfo that describes
+ * our IDispatch exposed methods.
+ */
+
+// CSArray method indices.
+//
+enum CSARRAY_METHODS
+{
+ IMETH_CSARRAY_QUERYINTERFACE = 0,
+ IMETH_CSARRAY_ADDREF,
+ IMETH_CSARRAY_RELEASE,
+
+#if VBA2
+ IMETH_CSARRAY_UI1SAFEARRAY,
+#endif //VBA2
+ IMETH_CSARRAY_I2SAFEARRAY,
+ IMETH_CSARRAY_I4SAFEARRAY,
+ IMETH_CSARRAY_R4SAFEARRAY,
+ IMETH_CSARRAY_R8SAFEARRAY,
+ IMETH_CSARRAY_CYSAFEARRAY,
+ IMETH_CSARRAY_DATESAFEARRAY,
+ IMETH_CSARRAY_BSTRSAFEARRAY,
+ IMETH_CSARRAY_SCODESAFEARRAY,
+ IMETH_CSARRAY_BOOLSAFEARRAY,
+ IMETH_CSARRAY_VARSAFEARRAY,
+
+#if VBA2
+ IMETH_CSARRAY_UI1SAFEARRAYREF,
+#endif //VBA2
+ IMETH_CSARRAY_I2SAFEARRAYREF,
+ IMETH_CSARRAY_I4SAFEARRAYREF,
+ IMETH_CSARRAY_R4SAFEARRAYREF,
+ IMETH_CSARRAY_R8SAFEARRAYREF,
+ IMETH_CSARRAY_CYSAFEARRAYREF,
+ IMETH_CSARRAY_DATESAFEARRAYREF,
+ IMETH_CSARRAY_BSTRSAFEARRAYREF,
+ IMETH_CSARRAY_SCODESAFEARRAYREF,
+ IMETH_CSARRAY_BOOLSAFEARRAYREF,
+ IMETH_CSARRAY_VARSAFEARRAYREF,
+
+ IMETH_CSARRAY_SAFEARRAYREDIM,
+ IMETH_CSARRAY_I2SAFEARRAYRET,
+
+#if VBA2
+ IMETH_CSARRAY_UI1SAFEARRAYERASE,
+#endif //VBA2
+ IMETH_CSARRAY_I2SAFEARRAYERASE,
+ IMETH_CSARRAY_I4SAFEARRAYERASE,
+ IMETH_CSARRAY_R4SAFEARRAYERASE,
+ IMETH_CSARRAY_R8SAFEARRAYERASE,
+ IMETH_CSARRAY_CYSAFEARRAYERASE,
+ IMETH_CSARRAY_DATESAFEARRAYERASE,
+ IMETH_CSARRAY_BSTRSAFEARRAYERASE,
+ IMETH_CSARRAY_SCODESAFEARRAYERASE,
+ IMETH_CSARRAY_BOOLSAFEARRAYERASE,
+ IMETH_CSARRAY_VARSAFEARRAYERASE,
+
+#if VBA2
+ IMETH_CSARRAY_UI1SAFEARRAYALLOC,
+#endif //VBA2
+ IMETH_CSARRAY_I2SAFEARRAYALLOC,
+ IMETH_CSARRAY_I4SAFEARRAYALLOC,
+ IMETH_CSARRAY_R4SAFEARRAYALLOC,
+ IMETH_CSARRAY_R8SAFEARRAYALLOC,
+ IMETH_CSARRAY_CYSAFEARRAYALLOC,
+ IMETH_CSARRAY_DATESAFEARRAYALLOC,
+ IMETH_CSARRAY_BSTRSAFEARRAYALLOC,
+ IMETH_CSARRAY_SCODESAFEARRAYALLOC,
+ IMETH_CSARRAY_BOOLSAFEARRAYALLOC,
+ IMETH_CSARRAY_VARSAFEARRAYALLOC,
+
+ IMETH_CSARRAY_MAX
+};
+
+
+// CSArray member IDs
+//
+enum CSARRAY_MEMBER_IDS
+{
+#if VBA2
+ IDMEMBER_CSARRAY_UI1SAFEARRAY = 0,
+ IDMEMBER_CSARRAY_I2SAFEARRAY,
+#else //VBA2
+ IDMEMBER_CSARRAY_I2SAFEARRAY = 0,
+#endif //VBA2
+ IDMEMBER_CSARRAY_I4SAFEARRAY,
+ IDMEMBER_CSARRAY_R4SAFEARRAY,
+ IDMEMBER_CSARRAY_R8SAFEARRAY,
+ IDMEMBER_CSARRAY_CYSAFEARRAY,
+ IDMEMBER_CSARRAY_DATESAFEARRAY,
+ IDMEMBER_CSARRAY_BSTRSAFEARRAY,
+ IDMEMBER_CSARRAY_SCODESAFEARRAY,
+ IDMEMBER_CSARRAY_BOOLSAFEARRAY,
+ IDMEMBER_CSARRAY_VARSAFEARRAY,
+
+#if VBA2
+ IDMEMBER_CSARRAY_UI1SAFEARRAYREF,
+#endif //VBA2
+ IDMEMBER_CSARRAY_I2SAFEARRAYREF,
+ IDMEMBER_CSARRAY_I4SAFEARRAYREF,
+ IDMEMBER_CSARRAY_R4SAFEARRAYREF,
+ IDMEMBER_CSARRAY_R8SAFEARRAYREF,
+ IDMEMBER_CSARRAY_CYSAFEARRAYREF,
+ IDMEMBER_CSARRAY_DATESAFEARRAYREF,
+ IDMEMBER_CSARRAY_BSTRSAFEARRAYREF,
+ IDMEMBER_CSARRAY_SCODESAFEARRAYREF,
+ IDMEMBER_CSARRAY_BOOLSAFEARRAYREF,
+ IDMEMBER_CSARRAY_VARSAFEARRAYREF,
+
+ IDMEMBER_CSARRAY_SAFEARRAYREDIM,
+ IDMEMBER_CSARRAY_I2SAFEARRAYRET,
+
+#if VBA2
+ IDMEMBER_CSARRAY_UI1SAFEARRAYERASE,
+#endif //VBA2
+ IDMEMBER_CSARRAY_I2SAFEARRAYERASE,
+ IDMEMBER_CSARRAY_I4SAFEARRAYERASE,
+ IDMEMBER_CSARRAY_R4SAFEARRAYERASE,
+ IDMEMBER_CSARRAY_R8SAFEARRAYERASE,
+ IDMEMBER_CSARRAY_CYSAFEARRAYERASE,
+ IDMEMBER_CSARRAY_DATESAFEARRAYERASE,
+ IDMEMBER_CSARRAY_BSTRSAFEARRAYERASE,
+ IDMEMBER_CSARRAY_SCODESAFEARRAYERASE,
+ IDMEMBER_CSARRAY_BOOLSAFEARRAYERASE,
+ IDMEMBER_CSARRAY_VARSAFEARRAYERASE,
+
+#if VBA2
+ IDMEMBER_CSARRAY_UI1SAFEARRAYALLOC,
+#endif //VBA2
+ IDMEMBER_CSARRAY_I2SAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_I4SAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_R4SAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_R8SAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_CYSAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_DATESAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_BSTRSAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_SCODESAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_BOOLSAFEARRAYALLOC,
+ IDMEMBER_CSARRAY_VARSAFEARRAYALLOC,
+
+ IDMEMBER_CSARRAY_MAX
+};
+
diff --git a/private/oleauto/tests/sdisptst/macmain.cpp b/private/oleauto/tests/sdisptst/macmain.cpp
new file mode 100644
index 000000000..549ccb265
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/macmain.cpp
@@ -0,0 +1,1542 @@
+/***
+*mcdsptst.cpp
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* UNDONE
+*
+*
+*Revision History:
+*
+* [00] 28-Apr-93 bradlo: Created from TESample.c.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "sdisptst.h"
+#include "macmain.h"
+#include "resource.h"
+
+ASSERTDATA
+
+
+#if HC_MPW
+extern "C" void _DataInit(void);
+#endif
+
+extern "C" CDECL_(void) DbPrintf(char *szFormat, ...);
+
+
+/* A Doc struct contains the WindowRecord for one of our document
+ windows, as well as the TEHandle for the text we are editing. Other
+ document fields can be added to this record as needed. For a similar
+ example, see how the Window Manager and Dialog Manager add fields
+ after the GrafPort. */
+typedef struct {
+ WindowRecord docWindow;
+ TEHandle docTE;
+ ControlHandle docVScroll;
+ ControlHandle docHScroll;
+ ProcPtr docClik;
+} Doc;
+
+
+SysEnvRec g_sysenv;
+Boolean g_fInitOle = false;
+Boolean g_fInBackground = false;
+Boolean g_fLibrariesLoaded = false;
+
+short g_cNumDocs = 0;
+
+
+
+/* Define HIWRD and LOWRD macros for efficiency. */
+#define HIWRD(aLong) (((aLong) >> 16) & 0xFFFF)
+#define LOWRD(aLong) ((aLong) & 0xFFFF)
+
+/* Define TOPLEFT and BOTRIGHT macros for convenience. Notice the implicit
+ dependency on the ordering of fields within a Rect */
+#define TOPLEFT(aRect) (*(Point*)&(aRect).top)
+#define BOTRIGHT(aRect) (*(Point*)&(aRect).bottom)
+
+
+void
+Exit()
+{
+ if(g_fInitOle)
+ UninitOle();
+#ifndef _PPCMAC
+ if(g_fLibrariesLoaded)
+ UninitOleManager(); // clean up applet
+#endif
+ ExitToShell();
+}
+
+/* display fatal error alert, and exit */
+void
+Fatal(char *msg)
+{
+static const unsigned char pnil[2] = {0,0};
+ unsigned char buf[128];
+
+ SetCursor(&qd.arrow);
+
+ buf[0] = (unsigned char)strlen(msg);
+ memcpy(&buf[1], msg, buf[0]+1);
+
+ ParamText(buf, pnil, pnil, pnil);
+ Alert(rUserAlert, nil);
+ Exit();
+}
+
+extern "C" int
+main()
+{
+ Init();
+
+ long l = OleBuildVersion();
+ DbPrintf("OleBuildVersion = %d.%d\n", (int)HIWRD(l), (int)LOWRD(l));
+
+ EventLoop();
+ return 0;
+}
+
+
+/* Get events forever, and handle them by calling DoEvent.
+ Also call AdjustCursor each time through the loop. */
+void
+EventLoop()
+{
+ Point mouse;
+ Boolean gotEvent;
+ EventRecord event;
+ RgnHandle cursorRgn;
+
+ cursorRgn = NewRgn(); /* we'll pass WNE an empty region the 1st time thru */
+ do{
+ GetGlobalMouse(&mouse);
+ AdjustCursor(mouse, cursorRgn);
+ gotEvent = WaitNextEvent(everyEvent, &event, GetSleep(), cursorRgn);
+ if(gotEvent){
+ /* make sure we have the right cursor before handling the event */
+ AdjustCursor(event.where, cursorRgn);
+ DoEvent(&event);
+ }else{
+ DoIdle(); /* perform idle tasks when it's not our event */
+ }
+
+ }while(true);
+}
+
+
+/* Do the right thing for an event. Determine what kind of event it is,
+ and call the appropriate routines. */
+void
+DoEvent(EventRecord *pevent)
+{
+ char key;
+ short part;
+ WindowPtr window;
+
+ switch(pevent->what){
+ case nullEvent:
+ // we idle for null/mouse moved events ands for events which
+ // aren't ours (see EventLoop)
+ DoIdle();
+ break;
+
+ case mouseDown:
+ part = FindWindow(pevent->where, &window);
+ switch(part){
+ case inMenuBar: /* process a mouse menu command (if any) */
+ AdjustMenus(); /* bring 'em up-to-date */
+ DoMenuCommand(MenuSelect(pevent->where));
+ break;
+
+ case inSysWindow: /* let the system handle the mouseDown */
+ SystemClick(pevent, window);
+ break;
+
+ case inContent:
+ if(window != FrontWindow()){
+ SelectWindow(window);
+ }else{
+ DoContentClick(window, pevent);
+ }
+ break;
+
+ case inDrag: /* pass screenBits.bounds to get all gDevices */
+ DragWindow(window, pevent->where, &qd.screenBits.bounds);
+ break;
+
+ case inGoAway:
+ if(TrackGoAway(window, pevent->where))
+ DoCloseWindow(window); /* we don't care if the user cancelled */
+ break;
+
+ case inGrow:
+ DoGrowWindow(window, pevent);
+ break;
+
+ case inZoomIn:
+ case inZoomOut:
+ if(TrackBox(window, pevent->where, part))
+ DoZoomWindow(window, part);
+ break;
+ }
+ break;
+
+ case keyDown:
+ case autoKey: /* check for menukey equivalents */
+ key = (char)(pevent->message & charCodeMask);
+ if(pevent->modifiers & cmdKey){/* Command key down */
+ if(pevent->what == keyDown){
+ AdjustMenus(); /* enable/disable/check menu items properly */
+ DoMenuCommand(MenuKey(key));
+ }
+ }else{
+ DoKeyDown(pevent);
+ }
+ break;
+
+ case activateEvt:
+ DoActivate(
+ (WindowPtr)pevent->message,
+ (Boolean)((pevent->modifiers & activeFlag) != 0));
+ break;
+
+ case updateEvt:
+ DoUpdate((WindowPtr) pevent->message);
+ break;
+
+ case kOSEvent:
+ switch((pevent->message >> 24) & 0x0FF){ /* high byte of message */
+ case kMouseMovedMessage:
+ DoIdle(); /* mouse-moved is also an idle event */
+ break;
+
+ case kSuspendResumeMessage:
+ /* suspend/resume is also an activate/deactivate */
+ g_fInBackground = (pevent->message & kResumeMask) == 0;
+ DoActivate(FrontWindow(), (Boolean)!g_fInBackground);
+ break;
+ }
+ break;
+
+ case kHighLevelEvent:
+ AEProcessAppleEvent(pevent);
+ break;
+ }
+}
+
+/* Change the cursor's shape, depending on its position. */
+void
+AdjustCursor(Point mouse, RgnHandle region)
+{
+ Rect iBeamRect;
+ WindowPtr window;
+ RgnHandle arrowRgn;
+ RgnHandle iBeamRgn;
+
+ /* we only adjust the cursor when we are in front */
+ window = FrontWindow();
+
+ if((!g_fInBackground) && (!IsDAWindow(window))){
+ /* calculate regions for different cursor shapes */
+ arrowRgn = NewRgn();
+ iBeamRgn = NewRgn();
+
+ /* start arrowRgn wide open */
+ SetRectRgn(arrowRgn, kExtremeNeg, kExtremeNeg, kExtremePos, kExtremePos);
+
+ /* calculate iBeamRgn */
+ if(IsAppWindow(window)){
+ iBeamRect = (*((Doc*)window)->docTE)->viewRect;
+ SetPort(window); /* make a global version of the viewRect */
+ LocalToGlobal(&TOPLEFT(iBeamRect));
+ LocalToGlobal(&BOTRIGHT(iBeamRect));
+ RectRgn(iBeamRgn, &iBeamRect);
+ /* we temporarily change the port's origin to "globalfy" the visRgn */
+ SetOrigin(
+ (short)-window->portBits.bounds.left,
+ (short)-window->portBits.bounds.top);
+ SectRgn(iBeamRgn, window->visRgn, iBeamRgn);
+ SetOrigin((short)0, (short)0);
+ }
+
+ /* subtract other regions from arrowRgn */
+ DiffRgn(arrowRgn, iBeamRgn, arrowRgn);
+
+ /* change the cursor and the region parameter */
+ if(PtInRgn(mouse, iBeamRgn)){
+ SetCursor(*GetCursor(iBeamCursor));
+ CopyRgn(iBeamRgn, region);
+ }else{
+ SetCursor(&qd.arrow);
+ CopyRgn(arrowRgn, region);
+ }
+ DisposeRgn(arrowRgn);
+ DisposeRgn(iBeamRgn);
+ }
+}
+
+/* Get the global coordinates of the mouse. When you call OSEventAvail
+ it will return either a pending event or a null event. In either case,
+ the where field of the event record will contain the current position
+ of the mouse in global coordinates and the modifiers field will reflect
+ the current state of the modifiers. Another way to get the global
+ coordinates is to call GetMouse and LocalToGlobal, but that requires
+ being sure that thePort is set to a valid port. */
+void
+GetGlobalMouse(Point *mouse)
+{
+ EventRecord event;
+
+ /* we aren't interested in any events */
+ OSEventAvail(kNoEvents, &event);
+
+ /* just the mouse position */
+ *mouse = event.where;
+}
+
+/* Called when a mouseDown occurs in the grow box of an active window.
+ In order to eliminate any 'flicker', we want to invalidate only what
+ is necessary. Since ResizeWindow invalidates the whole portRect, we
+ save the old TE viewRect, intersect it with the new TE viewRect, and
+ remove the result from the update region. However, we must make sure
+ that any old update region that might have been around gets put back. */
+void
+DoGrowWindow(WindowPtr window, EventRecord *event)
+{
+ Rect tempRect;
+ long growResult;
+ Doc* doc;
+ RgnHandle tempRgn;
+
+ tempRect = qd.screenBits.bounds; /* set up limiting values */
+ tempRect.left = kMinDocDim;
+ tempRect.top = kMinDocDim;
+ growResult = GrowWindow(window, event->where, &tempRect);
+
+ /* see if it really changed size */
+ if(growResult != 0){
+ doc = (Doc*)window;
+ /* save old text box */
+ tempRect = (*doc->docTE)->viewRect;
+ tempRgn = NewRgn();
+ /* get localized update region */
+ GetLocalUpdateRgn(window, tempRgn);
+ SizeWindow(window, (short)LOWRD(growResult), (short)HIWRD(growResult), (Boolean)true);
+ ResizeWindow(window);
+
+ /* calculate & validate the region that hasn't changed so
+ it won't get redrawn */
+ SectRect(&tempRect, &(*doc->docTE)->viewRect, &tempRect);
+ ValidRect(&tempRect); /* take it out of update */
+ InvalRgn(tempRgn); /* put back any prior update */
+ DisposeRgn(tempRgn);
+ }
+}
+
+/* Called when a mouseClick occurs in the zoom box of an active window.
+ Everything has to get re-drawn here, so we don't mind that
+ ResizeWindow invalidates the whole portRect. */
+void DoZoomWindow(WindowPtr window, short part)
+{
+ EraseRect(&window->portRect);
+ ZoomWindow(window, part, (Boolean)(window == FrontWindow()));
+ ResizeWindow(window);
+}
+
+/* Called when the window has been resized to fix up the controls and
+ content. */
+void ResizeWindow(WindowPtr window)
+{
+ AdjustScrollbars(window, true);
+ AdjustTE(window);
+ InvalRect(&window->portRect);
+}
+
+/* Returns the update region in local coordinates */
+void GetLocalUpdateRgn(WindowPtr window, RgnHandle localRgn)
+{
+ /* save old update region */
+ CopyRgn(((WindowPeek) window)->updateRgn, localRgn);
+
+ OffsetRgn(
+ localRgn,
+ window->portBits.bounds.left,
+ window->portBits.bounds.top);
+}
+
+void
+DoUpdate(WindowPtr window)
+{
+ if(IsAppWindow(window)){
+ /* this sets up the visRgn */
+ BeginUpdate(window);
+ /* draw if updating needs to be done */
+ if(!EmptyRgn(window->visRgn))
+ DrawWindow(window);
+ EndUpdate(window);
+ }
+}
+
+/* This is called when a window is activated or deactivated.
+ It calls TextEdit to deal with the selection. */
+void
+DoActivate(WindowPtr window, Boolean becomingActive)
+{
+ Rect growRect;
+ Doc* doc;
+ RgnHandle tempRgn, clipRgn;
+
+ if(IsAppWindow(window)){
+ doc = (Doc*)window;
+ if(becomingActive){
+ /* since we don't want TEActivate to draw a selection in an
+ area where we're going to erase and redraw, we'll clip
+ out the update region before calling it. */
+ tempRgn = NewRgn();
+ clipRgn = NewRgn();
+ /* get localized update region */
+ GetLocalUpdateRgn(window, tempRgn);
+ GetClip(clipRgn);
+ /* subtract updateRgn from clipRgn */
+ DiffRgn(clipRgn, tempRgn, tempRgn);
+ SetClip(tempRgn);
+ TEActivate(doc->docTE);
+ /* restore the full-blown clipRgn */
+ SetClip(clipRgn);
+ DisposeRgn(tempRgn);
+ DisposeRgn(clipRgn);
+
+ /* the controls must be redrawn on activation: */
+ (*doc->docVScroll)->contrlVis = kControlVisible;
+ (*doc->docHScroll)->contrlVis = kControlVisible;
+ InvalRect(&(*doc->docVScroll)->contrlRect);
+ InvalRect(&(*doc->docHScroll)->contrlRect);
+ /* the growbox needs to be redrawn on activation: */
+ growRect = window->portRect;
+ /* adjust for the scrollbars */
+ growRect.top = growRect.bottom - kScrollbarAdjust;
+ growRect.left = growRect.right - kScrollbarAdjust;
+ InvalRect(&growRect);
+ }else{
+ TEDeactivate(doc->docTE);
+ /* the controls must be hidden on deactivation: */
+ HideControl(doc->docVScroll);
+ HideControl(doc->docHScroll);
+ /* the growbox should be changed immediately on deactivation: */
+ DrawGrowIcon(window);
+ }
+ }
+}
+
+/* This is called when a mouseDown occurs in the content of a window. */
+void
+DoContentClick(WindowPtr window, EventRecord *event)
+{
+ Rect teRect;
+ Point mouse;
+ Doc* doc;
+ short part, value;
+ Boolean shiftDown;
+ ControlHandle control;
+
+ if(IsAppWindow(window)){
+ SetPort(window);
+ mouse = event->where; /* get the click position */
+ GlobalToLocal(&mouse);
+ doc = (Doc*)window;
+ /* see if we are in the viewRect. if so, we won't check the controls */
+ GetTERect(window, &teRect);
+ if(PtInRect(mouse, &teRect)){
+ /* see if we need to extend the selection - extend if Shift is down */
+ shiftDown = (event->modifiers & shiftKey) != 0;
+ TEClick(mouse, shiftDown, doc->docTE);
+ PascalClikLoop();
+ }else{
+ part = FindControl(mouse, window, &control);
+ switch(part){
+ case 0: /* do nothing for viewRect case */
+ break;
+ case inThumb:
+ value = GetCtlValue(control);
+ part = TrackControl(control, mouse, nil);
+ if(part != 0){
+ value -= GetCtlValue(control);
+ /* value now has CHANGE in value; if value changed, scroll */
+ if(value != 0){
+ if(control == doc->docVScroll){
+ TEScroll(
+ (short)0,
+ (short)(value * (*doc->docTE)->lineHeight),
+ doc->docTE);
+ }else{
+ TEScroll((short)value, (short)0, doc->docTE);
+ }
+ }
+ }
+ break;
+
+ default: /* they clicked in an arrow, so track & scroll */
+ if(control == doc->docVScroll)
+#ifdef _PPCMAC
+ value = TrackControl(control, mouse, (ControlActionUPP)VActionProc);
+ else
+ value = TrackControl(control, mouse, (ControlActionUPP)HActionProc);
+#else
+ value = TrackControl(control, mouse, (ProcPtr)VActionProc);
+ else
+ value = TrackControl(control, mouse, (ProcPtr)HActionProc);
+#endif
+ break;
+ }
+ }
+ }
+}
+
+/* This is called for any keyDown or autoKey events, except when the
+ Command key is held down. It looks at the frontmost window to decide what
+ to do with the key typed. */
+void
+DoKeyDown(EventRecord *event)
+{
+ char key;
+ TEHandle te;
+ WindowPtr window;
+
+ window = FrontWindow();
+ if(IsAppWindow(window)){
+ te = ((Doc*) window)->docTE;
+ key = (char)(event->message & charCodeMask);
+ /* we have a char. for our window; see if we are still below TextEditÕs
+ limit for the number of characters (but deletes are always rad) */
+ if(key == kDelChar
+ || (*te)->teLength - ((*te)->selEnd - (*te)->selStart)+1 < kMaxTELength)
+ {
+ TEKey(key, te);
+ AdjustScrollbars(window, false);
+ AdjustTE(window);
+ }
+ }
+}
+
+/* Common algorithm for pinning the value of a control. It returns
+ the actual amount the value of the control changed. Note the
+ pinning is done for the sake of returning the amount the control
+ value changed. */
+void
+CommonAction(ControlHandle control, short *amount)
+{
+ short value, max;
+
+ value = GetCtlValue(control); /* get current value */
+ max = GetCtlMax(control); /* and maximum value */
+ *amount = value - *amount;
+ if(*amount < 0)
+ *amount = 0;
+ else if(*amount > max)
+ *amount = max;
+ SetCtlValue(control, *amount);
+ *amount = value - *amount; /* calculate the real change */
+}
+
+/* Determines how much to change the value of the vertical scrollbar
+ by and how much to scroll the TE record. */
+extern "C"
+PASCAL_(void)
+VActionProc(ControlHandle control, short part)
+{
+ TEPtr te;
+ short amount;
+ WindowPtr window;
+
+ if(part != 0){ /* if it was actually in the control */
+ window = (*control)->contrlOwner;
+ te = *((Doc*) window)->docTE;
+ switch(part){
+ case inUpButton:
+ case inDownButton: /* one line */
+ amount = 1;
+ break;
+ case inPageUp: /* one page */
+ case inPageDown:
+ amount = (te->viewRect.bottom - te->viewRect.top) / te->lineHeight;
+ break;
+ }
+ if((part == inDownButton) || (part == inPageDown))
+ amount = -amount; /* reverse direction for a downer */
+ CommonAction(control, &amount);
+ if(amount != 0){
+ TEScroll((short)0,
+ (short)(amount * te->lineHeight),
+ ((Doc*)window)->docTE);
+ }
+ }
+}
+
+/* Determines how much to change the value of the horizontal scrollbar
+ by and how much to scroll the TE record. */
+extern "C"
+PASCAL_(void)
+HActionProc(ControlHandle control, short part)
+{
+ TEPtr te;
+ short amount;
+ WindowPtr window;
+
+ if(part != 0){
+ window = (*control)->contrlOwner;
+ te = *((Doc*) window)->docTE;
+ switch(part){
+ case inUpButton:
+ case inDownButton: /* a few pixels */
+ amount = kButtonScroll;
+ break;
+ case inPageUp: /* a page */
+ case inPageDown:
+ amount = te->viewRect.right - te->viewRect.left;
+ break;
+ }
+ if((part == inDownButton) || (part == inPageDown))
+ amount = -amount; /* reverse direction */
+ CommonAction(control, &amount);
+ if(amount != 0)
+ TEScroll(amount, 0, ((Doc*) window)->docTE);
+ }
+}
+
+/* This is called whenever we get a null event et al. It takes care
+ of necessary periodic actions. For this program, it calls TEIdle. */
+void
+DoIdle()
+{
+ WindowPtr window;
+
+ window = FrontWindow();
+ if(IsAppWindow(window))
+ TEIdle(((Doc*)window)->docTE);
+}
+
+/* Draw the contents of an application window. */
+void DrawWindow(WindowPtr window)
+{
+ SetPort(window);
+ EraseRect(&window->portRect);
+ DrawControls(window);
+ DrawGrowIcon(window);
+ TEUpdate(&window->portRect, ((Doc*)window)->docTE);
+}
+
+/* Enable and disable menus based on the current state. */
+
+void DoEnableItem(MenuHandle hmenu, short sItem) {
+ EnableItem(hmenu, sItem);
+}
+
+void DoDisableItem(MenuHandle hmenu, short sItem) {
+ DisableItem(hmenu, sItem);
+}
+
+/* Enable and disable menus based on the current state. */
+void
+AdjustMenus()
+{
+ long offset;
+ TEHandle hte;
+ MenuHandle menu;
+ WindowPtr window;
+ Boolean undo;
+ Boolean paste;
+ Boolean cutCopyClear;
+ void (*pfnEnable)(MenuHandle, short);
+
+#if 0
+ File
+ New
+ Close
+
+ Edit
+ Undo
+ Cut
+ Copy
+ Clear
+ Paste
+#endif
+
+ window = FrontWindow();
+
+ menu = GetMHandle(mFile);
+
+ pfnEnable = ((g_cNumDocs < kMaxOpenDocs) ? DoEnableItem : DoDisableItem);
+ pfnEnable(menu, iNew);
+
+ pfnEnable = ((window != nil) ? DoEnableItem : DoDisableItem);
+ pfnEnable(menu, iClose);
+
+ menu = GetMHandle(mEdit);
+ undo = false;
+ paste = false;
+ cutCopyClear = false;
+
+ if(IsDAWindow(window)){
+ undo = true; /* all editing is enabled for DA windows */
+ cutCopyClear = true;
+ paste = true;
+ }else if(IsAppWindow(window)){
+ hte = ((Doc*) window)->docTE;
+ if((*hte)->selStart < (*hte)->selEnd){
+ /* Cut, Copy, and Clear is enabled for app. windows with selections */
+ cutCopyClear = true;
+ }
+ if(GetScrap(nil, 'TEXT', &offset) > 0){
+ /* if there's any text in the clipboard, paste is enabled */
+ paste = true;
+ }
+ }
+
+ pfnEnable = (undo) ? DoEnableItem : DoDisableItem;
+ pfnEnable(menu, iUndo);
+
+ pfnEnable = (cutCopyClear) ? DoEnableItem : DoDisableItem;
+ pfnEnable(menu, iCut);
+ pfnEnable(menu, iCopy);
+ pfnEnable(menu, iClear);
+
+ pfnEnable = (paste) ? DoEnableItem : DoDisableItem;
+ pfnEnable(menu, iPaste);
+}
+
+
+/* This is called when an item is chosen from the menu bar (after calling
+ MenuSelect or MenuKey). It does the right thing for each command. */
+void
+DoMenuCommand(long menuResult)
+{
+ TEHandle te;
+ Str255 daName;
+ OSErr saveErr;
+ Handle aHandle;
+ WindowPtr window;
+ long oldSize, newSize, total, contig;
+ short menuID, menuItem, itemHit, daRefNum;
+
+ window = FrontWindow();
+
+ menuID = (short)HIWRD(menuResult);
+ menuItem = (short)LOWRD(menuResult);
+
+ /* get menu item number and menu number */
+ switch(menuID){
+ case mApple:
+ switch(menuItem){
+ case iAbout: /* bring up alert for About */
+ itemHit = Alert(rAboutAlert, nil);
+ break;
+ default: /* all non-About items in this menu are DAs et al */
+ /* type Str255 is an array in MPW 3 */
+ GetMenuItemText(GetMHandle(mApple), menuItem, daName);
+ daRefNum = OpenDeskAcc(daName);
+ break;
+ }
+ break;
+
+ case mFile:
+ switch(menuItem){
+ case iNew:
+ DoNew();
+ break;
+ case iClose:
+ DoCloseWindow(FrontWindow()); /* ignore the result */
+ break;
+ case iQuit:
+ Terminate();
+ break;
+ }
+ break;
+
+ case mEdit: /* call SystemEdit for DA editing & MultiFinder */
+ if(!SystemEdit((short)(menuItem-1))){
+ te = ((Doc*)FrontWindow())->docTE;
+ switch(menuItem){
+ case iCut:
+ if(ZeroScrap() == noErr){
+ PurgeSpace(&total, &contig);
+ if((*te)->selEnd - (*te)->selStart + kTESlop > contig){
+ AlertUser(eNoSpaceCut);
+ }else{
+ TECut(te);
+ if(TEToScrap() != noErr){
+ AlertUser(eNoCut);
+ ZeroScrap();
+ }
+ }
+ }
+ break;
+
+ case iCopy:
+ if(ZeroScrap() == noErr){
+ TECopy(te); /* after copying, export the TE scrap */
+ if(TEToScrap() != noErr){
+ AlertUser(eNoCopy);
+ ZeroScrap();
+ }
+ }
+ break;
+
+ case iPaste: /* import the TE scrap before pasting */
+ if(TEFromScrap() == noErr){
+ if(TEGetScrapLen() + ((*te)->teLength -
+ ((*te)->selEnd - (*te)->selStart)) > kMaxTELength){
+ AlertUser(eExceedPaste);
+ }else{
+ aHandle = (Handle)TEGetText(te);
+ oldSize = GetHandleSize(aHandle);
+ newSize = oldSize + TEGetScrapLen() + kTESlop;
+ SetHandleSize(aHandle, newSize);
+ saveErr = MemError();
+ SetHandleSize(aHandle, oldSize);
+ if(saveErr != noErr)
+ AlertUser(eNoSpacePaste);
+ else
+ TEPaste(te);
+ }
+ }else{
+ AlertUser(eNoPaste);
+ }
+ break;
+
+ case iClear:
+ TEDelete(te);
+ break;
+ }
+ AdjustScrollbars(window, false);
+ AdjustTE(window);
+ }
+ break;
+
+ case mOptions:
+ switch(menuItem){
+ case iClearAll:
+ te = ((Doc*)FrontWindow())->docTE;
+ TESetSelect(0, 32767, te);
+ TEDelete(te);
+ break;
+ }
+ break;
+ }
+ HiliteMenu(0); /* unhighlight what MenuSelect (or MenuKey) hilited */
+}
+
+/* Create a new document and window. */
+void
+DoNew()
+{
+ Ptr storage;
+ Boolean good;
+ Doc* doc;
+ WindowPtr window;
+ Rect destRect, viewRect;
+
+ storage = NewPtr(sizeof(Doc));
+ if(storage != nil){
+ window = GetNewWindow(rDocWindow, storage, (WindowPtr) -1);
+ if(window != nil){
+ /* this will be decremented when we call DoCloseWindow */
+ good = false;
+ g_cNumDocs += 1;
+ SetPort(window);
+
+ short font;
+ GetFNum((const unsigned char*)"\006Monaco", &font);
+ TextFont(font);
+ TextSize(9);
+
+ doc = (Doc*)window;
+ GetTERect(window, &viewRect);
+ destRect = viewRect;
+ destRect.right = destRect.left + kMaxDocWidth;
+ doc->docTE = TENew(&destRect, &viewRect);
+
+ /* if TENew succeeded, we have a good document */
+ good = doc->docTE != nil;
+ if(good){
+ AdjustViewRect(doc->docTE);
+ TEAutoView(true, doc->docTE);
+ }
+
+ if(good){
+ doc->docVScroll = GetNewControl(rVScroll, window);
+ good = (doc->docVScroll != nil);
+ }
+
+ if(good){
+ doc->docHScroll = GetNewControl(rHScroll, window);
+ good = (doc->docHScroll != nil);
+ }
+
+ if(good){ /* good? adjust & draw the controls, draw the window */
+ /* false to AdjustScrollValues means musn't redraw;
+ technically, of course, the window is hidden so
+ it wouldn't matter whether we called ShowControl
+ or not. */
+ AdjustScrollValues(window, false);
+ ShowWindow(window);
+ }else{
+ /* otherwise regret we ever created it... */
+ DoCloseWindow(window);
+ AlertUser(eNoWindow);
+ }
+ }else{
+ /* get rid of the storage if it is never used */
+ DisposPtr(storage);
+ }
+ }
+}
+
+
+/* Close a window. This handles desk accessory and application windows. */
+/* 1.01 - At this point, if there was a document associated with a
+ window, you could do any document saving processing if it is 'dirty'.
+ DoCloseWindow would return true if the window actually closed, i.e.,
+ the user didn't cancel from a save dialog. This result is handy when
+ the user quits an application, but then cancels the save of a document
+ associated with a window. */
+Boolean
+DoCloseWindow(WindowPtr window)
+{
+ TEHandle te;
+
+ if(IsDAWindow(window)){
+ CloseDeskAcc(((WindowPeek) window)->windowKind);
+ }else if(IsAppWindow(window)){
+ te = ((Doc*)window)->docTE;
+ if(te != nil){
+ /* dispose the TEHandle if we got far enough to make one */
+ TEDispose(te);
+ }
+ CloseWindow(window);
+ DisposPtr((Ptr)window);
+ g_cNumDocs -= 1;
+ }
+ return true;
+}
+
+/* Clean up the application and exit. We close all of the windows
+ so that they can update their documents, if any. */
+void
+Terminate()
+{
+ Boolean closed;
+ WindowPtr aWindow;
+
+ closed = true;
+ do{
+ aWindow = FrontWindow(); /* get the current front window */
+ if(aWindow != nil)
+ closed = DoCloseWindow(aWindow); /* close this window */
+ } while (closed && (aWindow != nil));
+
+ if(closed)
+ Exit(); /* exit if no cancellation */
+}
+
+/* Return a rectangle that is inset from the portRect by the
+ size of the scrollbars and a little extra margin. */
+void
+GetTERect(WindowPtr window, Rect *teRect)
+{
+ *teRect = window->portRect;
+ InsetRect(teRect, kTextMargin, kTextMargin);/* adjust for margin */
+ teRect->bottom = teRect->bottom - 15; /* and for the scrollbars */
+ teRect->right = teRect->right - 15;
+}
+
+/* Update the TERec's view rect so that it is the greatest multiple
+ of the lineHeight that still fits in the old viewRect. */
+void
+AdjustViewRect(TEHandle docTE)
+{
+ TEPtr te;
+
+ te = *docTE;
+ te->viewRect.bottom = (((te->viewRect.bottom - te->viewRect.top) / te->lineHeight) * te->lineHeight) + te->viewRect.top;
+}
+
+/* Scroll the TERec around to match up to the potentially updated
+ scrollbar values. This is really useful when the window has been
+ resized such that the scrollbars became inactive but the TERec
+ was already scrolled. */
+void
+AdjustTE(WindowPtr window)
+{
+ TEPtr te;
+
+ te = *((Doc*)window)->docTE;
+
+ TEScroll(
+ (short)((te->viewRect.left - te->destRect.left) -
+ GetCtlValue(((Doc*)window)->docHScroll)),
+ (short)((te->viewRect.top - te->destRect.top) -
+ (GetCtlValue(((Doc*)window)->docVScroll) * te->lineHeight)),
+ ((Doc*)window)->docTE);
+}
+
+
+/* Calculate the new control maximum value and current value, whether
+ it is the horizontal or vertical scrollbar. The vertical max is
+ calculated by comparing the number of lines to the vertical size
+ of the viewRect. The horizontal max is calculated by comparing the
+ maximum document width to the width of the viewRect. The current
+ values are set by comparing the offset between the view and
+ destination rects. If necessary and we canRedraw, have the control
+ be re-drawn by calling ShowControl. */
+void
+AdjustHV(
+ Boolean isVert,
+ ControlHandle control,
+ TEHandle docTE,
+ Boolean canRedraw)
+{
+ TEPtr te;
+ short value, lines, max, oldValue, oldMax;
+
+ oldValue = GetCtlValue(control);
+ oldMax = GetCtlMax(control);
+ te = *docTE; /* point to TERec for convenience */
+
+ if(isVert){
+ lines = te->nLines;
+ /* since nLines isn't right if the last character is a return,
+ check for that case */
+ if(*(*te->hText + te->teLength - 1) == kCrChar)
+ lines += 1;
+ max = lines - ((te->viewRect.bottom - te->viewRect.top) / te->lineHeight);
+ }else{
+ max = kMaxDocWidth - (te->viewRect.right - te->viewRect.left);
+ }
+
+ if ( max < 0 ) max = 0;
+ SetCtlMax(control, max);
+
+ /* Must deref. after SetCtlMax since, technically, it could
+ draw and therefore move memory. This is why we don't just
+ do it once at the beginning. */
+ te = *docTE;
+ if(isVert)
+ value = (te->viewRect.top - te->destRect.top) / te->lineHeight;
+ else
+ value = te->viewRect.left - te->destRect.left;
+
+ if(value < 0)
+ value = 0;
+ else if(value > max)
+ value = max;
+
+ SetCtlValue(control, value);
+ /* now redraw the control if it needs to be and can be */
+ if(canRedraw || (max != oldMax) || (value != oldValue))
+ ShowControl(control);
+}
+
+/* Simply call the common adjust routine for the vertical and
+ horizontal scrollbars. */
+void
+AdjustScrollValues(WindowPtr window, Boolean canRedraw)
+{
+ Doc* doc;
+
+ doc = (Doc*)window;
+ AdjustHV(true, doc->docVScroll, doc->docTE, canRedraw);
+ AdjustHV(false, doc->docHScroll, doc->docTE, canRedraw);
+}
+
+/* Re-calculate the position and size of the viewRect and the
+ scrollbars. kScrollTweek compensates for off-by-one requirements
+ of the scrollbars to have borders coincide with the growbox. */
+void
+AdjustScrollSizes(WindowPtr window)
+{
+ Rect teRect;
+ Doc* doc;
+
+ doc = (Doc*) window;
+ GetTERect(window, &teRect); /* start with TERect */
+ (*doc->docTE)->viewRect = teRect;
+ AdjustViewRect(doc->docTE); /* snap to nearest line */
+
+ MoveControl(
+ doc->docVScroll,
+ (short)(window->portRect.right - kScrollbarAdjust),
+ (short)-1);
+ SizeControl(
+ doc->docVScroll,
+ (short)kScrollbarWidth,
+ (short)((window->portRect.bottom - window->portRect.top) -
+ (kScrollbarAdjust - kScrollTweek)));
+
+ MoveControl(
+ doc->docHScroll,
+ (short)-1,
+ (short)(window->portRect.bottom - kScrollbarAdjust));
+ SizeControl(
+ doc->docHScroll,
+ (short)((window->portRect.right - window->portRect.left) -
+ (kScrollbarAdjust - kScrollTweek)),
+ (short)kScrollbarWidth);
+}
+
+/* Turn off the controls by jamming a zero into their contrlVis
+ fields (HideControl erases them and we don't want that). If the
+ controls are to be resized as well, call the procedure to do that,
+ then call the procedure to adjust the maximum and current values.
+ Finally re-enable the controls by jamming a $FF in their contrlVis
+ fields. */
+void
+AdjustScrollbars(WindowPtr window, Boolean needsResize)
+{
+ Doc* doc;
+
+ doc = (Doc*) window;
+ /* First, turn visibility of scrollbars off so we won't get
+ unwanted redrawing */
+ (*doc->docVScroll)->contrlVis = kControlInvisible; /* turn them off */
+ (*doc->docHScroll)->contrlVis = kControlInvisible;
+ if(needsResize) /* move & size as needed */
+ AdjustScrollSizes(window);
+ /* fool with max and current value */
+ AdjustScrollValues(window, needsResize);
+ /* Now, restore visibility in case we never had to ShowControl
+ during adjustment */
+ (*doc->docVScroll)->contrlVis = kControlVisible; /* turn them on */
+ (*doc->docHScroll)->contrlVis = kControlVisible;
+}
+
+/* Gets called from our assembly language routine, AsmClikLoop,
+ which is in turn called by the TEClick toolbox routine. Saves
+ the windows clip region, sets it to the portRect, adjusts the
+ scrollbar values to match the TE scroll amount, then restores
+ the clip region. */
+PASCAL_(Boolean)
+PascalClikLoop()
+{
+ WindowPtr window;
+ RgnHandle region;
+
+ window = FrontWindow();
+
+ region = NewRgn();
+ GetClip(region); /* save clip */
+ ClipRect(&window->portRect);
+ AdjustScrollValues(window, true); /* pass true for canRedraw */
+ SetClip(region); /* restore clip */
+ DisposeRgn(region);
+
+ return true;
+}
+
+Boolean
+IsAppWindow(WindowPtr window)
+{
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind == userKind);
+}
+
+/* Check to see if a window belongs to a desk accessory. */
+Boolean IsDAWindow(WindowPtr window)
+{
+ /* DA windows have negative windowKinds */
+ return (window == nil)
+ ? false : (((WindowPeek)window)->windowKind < 0);
+}
+
+void
+AlertUser(short error)
+{
+ short itemHit;
+ Str255 message, tmp;
+
+ SetCursor(&qd.arrow);
+ GetIndString(message, kErrStrings, error);
+ tmp[0] = '\0';
+ ParamText(message, tmp, tmp, tmp);
+ itemHit = Alert(rUserAlert, nil);
+}
+
+PASCAL_(OSErr)
+RemoteLowLevelEvt(
+ AppleEvent theAppEvt,
+ AppleEvent reply,
+ long HandlerRefCon)
+{
+ long cb;
+ OSErr err;
+ DescType descType;
+ EventRecord event;
+
+ UNUSED(reply);
+ UNUSED(HandlerRefCon);
+
+ err = AEGetKeyPtr(
+ &theAppEvt,
+ keyDirectObject,
+ typeWildCard,
+ &descType,
+ (Ptr)&event,
+ sizeof(event),
+ &cb);
+
+ if(err != noErr){
+ ASSERT(0);
+ return err;
+ }
+
+ DoEvent(&event);
+
+ return noErr;
+}
+
+void
+InitAppleEvents()
+{
+ OSErr err;
+
+ err = AEInstallEventHandler(
+ 'OLE2', 'EVNT', (EventHandlerProcPtr)RemoteLowLevelEvt, 0, false);
+ ASSERT(err == noErr);
+}
+
+
+void
+Init()
+{
+ short count;
+ Handle menuBar;
+ long total, contig;
+ EventRecord event;
+
+ g_fInBackground = false;
+
+ MoreMasters();
+ MaxApplZone();
+
+ InitGraf((Ptr)&qd.thePort);
+ InitFonts();
+ InitWindows();
+ InitMenus();
+ TEInit();
+ InitDialogs(nil);
+ InitCursor();
+ FlushEvents(everyEvent, 0);
+ InitCursor();
+
+#if HC_MPW
+ UnloadSeg((ProcPtr)_DataInit);
+#endif
+
+ // REVIEW: move this above load of Ole?
+ SysEnvirons(kSysEnvironsVersion, &g_sysenv);
+ if (g_sysenv.machineType < 0
+ || g_sysenv.systemVersion < 0x0600
+ || g_sysenv.hasColorQD == false
+ || TrapExists(_WaitNextEvent) == false)
+ {
+ Fatal("System is too whimpy");
+ }
+
+ /* get MultiFinder started */
+ for(count = 1; count <= 3; count++)
+ EventAvail(everyEvent, &event);
+
+ /* make sure we have enough memory to run */
+ if((long)GetApplLimit() - (long)ApplicZone() < kMinHeap)
+ Fatal("Not enough memory to run");
+ PurgeSpace(&total, &contig);
+ if(total < kMinSpace)
+ Fatal("Not enough memory after purge");
+
+ menuBar = GetNewMBar(rMenuBar); /* read menus into menu bar */
+ if(menuBar == nil)
+ Fatal("Unable to load menu bar");
+ SetMenuBar(menuBar);
+ DisposHandle(menuBar);
+ AddResMenu(GetMHandle(mApple), 'DRVR'); /* add DA names to Apple menu */
+ DrawMenuBar();
+
+ DoNew();
+
+#ifndef _PPCMAC
+ DbPrintf("InitLibraryManager\n");
+ if (InitOleManager(0) != NOERROR)
+ Fatal("Could not initialize LibraryManager");
+ g_fLibrariesLoaded = true;
+#endif
+
+ DbPrintf("OleInitialize\n");
+ if(InitOle() != NOERROR)
+ Fatal("Unable to Initialize Ole");
+ g_fInitOle = true;
+
+ InitAppleEvents();
+}
+
+/* Calculate a sleep value for WaitNextEvent. This takes into
+ account the things that DoIdle does with idle time. */
+unsigned long
+GetSleep()
+{
+ long sleep;
+ TEHandle te;
+ WindowPtr window;
+
+ sleep = MAXLONG; /* default value for sleep */
+ if(!g_fInBackground){
+ window = FrontWindow(); /* and the front window is ours... */
+ if(IsAppWindow(window)){
+ /* and the selection is an insertion point... */
+ te = ((Doc*)window)->docTE;
+ if((*te)->selStart == (*te)->selEnd){
+ /* blink time for the insertion point */
+ sleep = GetCaretTime();
+ }
+ }
+ }
+ return sleep;
+}
+
+/* Check the bits of a trap number to determine its type. If bit 11
+ is set, its a Toolbox trap, otherwise its an OS trap. */
+TrapType
+GetTrapType(short theTrap)
+{
+ return ((theTrap & 0x0800) == 0) ? OSTrap : ToolTrap;
+}
+
+/* Find the size of the Toolbox trap table. This can be either 0x0200
+ or 0x0400 bytes, depending on which Macintosh we are running on. We
+ determine the size by taking advantage of an anomaly of the smaller
+ trap table: any entries that fall beyond the end of the table are
+ mirrored back down into the lower part. For example, on a large table,
+ trap numbers A86E and AA6E correspond to different routines. However,
+ on a small table, they correspond to the same routine. By checking
+ the address of these routines, we can determine the size of the
+ table. */
+short
+NumToolboxTraps()
+{
+ return
+ (NGetTrapAddress((short)0xA86E, ToolTrap) ==
+ NGetTrapAddress((short)0xAA6E, ToolTrap)) ? 0x0200 : 0x0400;
+}
+
+/* Check to see if a given trap is implemented */
+Boolean
+TrapExists(short theTrap)
+{
+ TrapType theTrapType;
+
+ theTrapType = GetTrapType(theTrap);
+ if((theTrapType == ToolTrap)
+ && ((theTrap & 0x07FF) >= NumToolboxTraps()))
+ return false;
+ return (NGetTrapAddress((short)_Unimplemented, ToolTrap) !=
+ NGetTrapAddress(theTrap, theTrapType));
+}
+
+STDAPI_(void)
+OutputDebugString(const char *sz)
+{
+ long len;
+ TEHandle hTE;
+ WindowPtr window;
+
+ len = strlen(sz);
+
+ window = FrontWindow();
+ if(window == nil)
+ return;
+
+ hTE = ((Doc*)window)->docTE;
+ if(hTE == nil || *hTE == nil)
+ return;
+
+ // if this insertion will cause us to overflow the TextEdit
+ // buffer, then delete enough from the beginning of the buffer
+ // to make room
+
+ if(((long)(*hTE)->teLength + len) > 30000){
+ TESetSelect(0, 15000, hTE);
+ TEDelete(hTE);
+ TESetSelect(30000, 30000, hTE);
+ }
+
+ TEInsert(sz, len, hTE);
+ TESelView(hTE);
+}
+
+struct regentry{
+ char *szKey;
+ char *szValue;
+} g_rgregentry[] = {
+
+ { "CLSID\\{00020468-0000-0000-C000-000000000046}\\LocalServer", "SDSP" }
+
+ , { "CLSID\\{00020468-0000-0000-C000-000000000046}\\ProgID",
+ "sdisptst.application" }
+
+ , { "CLSID\\{00020468-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "SDSP", "{00020468-0000-0000-C000-000000000046}" }
+
+ , { "sdisptst.application\\CLSID",
+ "{00020468-0000-0000-C000-000000000046}" }
+
+ // -- CDisptst
+
+ , { "CLSID\\{00020460-0000-0000-C000-000000000046}\\LocalServer", "SDSP" }
+
+ , { "CLSID\\{00020460-0000-0000-C000-000000000046}\\ProgID",
+ "sdisptst.cdisptst" }
+
+ , { "CLSID\\{00020460-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "SDSP", "{00020460-0000-0000-C000-000000000046}" }
+
+ , { "sdisptst.cdisptst\\CLSID",
+ "{00020460-0000-0000-C000-000000000046}" }
+
+ // -- CSarray
+
+ , { "CLSID\\{00020461-0000-0000-C000-000000000046}\\LocalServer", "SDSP" }
+
+ , { "CLSID\\{00020461-0000-0000-C000-000000000046}\\ProgID",
+ "sdisptst.csarray" }
+
+ , { "CLSID\\{00020461-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "SDSP", "{00020461-0000-0000-C000-000000000046}" }
+
+ , { "sdisptst.csarray\\CLSID",
+ "{00020461-0000-0000-C000-000000000046}" }
+
+ // -- CExcepinfo
+
+ , { "CLSID\\{00020466-0000-0000-C000-000000000046}\\LocalServer", "SDSP" }
+
+ , { "CLSID\\{00020466-0000-0000-C000-000000000046}\\ProgID",
+ "sdisptst.cexcepinfo" }
+
+ , { "CLSID\\{00020466-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "SDSP", "{00020466-0000-0000-C000-000000000046}" }
+
+ , { "sdisptst.cexcepinfo\\CLSID",
+ "{00020466-0000-0000-C000-000000000046}" }
+
+ // -- CProp
+
+ , { "CLSID\\{00020471-0000-0000-C000-000000000046}\\LocalServer", "SDSP" }
+
+ , { "CLSID\\{00020471-0000-0000-C000-000000000046}\\ProgID",
+ "sdisptst.cprop" }
+
+ , { "CLSID\\{00020471-0000-0000-C000-000000000046}\\InprocHandler",
+ "OLE2:Def$DefFSet" }
+
+ , { "SDSP", "{00020471-0000-0000-C000-000000000046}" }
+
+ , { "sdisptst.cprop\\CLSID",
+ "{00020471-0000-0000-C000-000000000046}" }
+
+ /*
+ * NOTE: The following is temporary for MacOle Beta 1
+ *
+ */
+
+ , { "Interface\\{00020400-0000-0000-C000-000000000046}",
+ "IDispatch" }
+
+ , { "Interface\\{00020400-0000-0000-C000-000000000046}\\ProxyStubClsid",
+ "{00020420-0000-0000-C000-000000000046}" }
+
+ , { "Interface\\{00020404-0000-0000-C000-000000000046}",
+ "IEnumVARIANT" }
+
+ , { "Interface\\{00020404-0000-0000-C000-000000000046}\\ProxyStubClsid",
+ "{00020421-0000-0000-C000-000000000046}" }
+
+ , { "Interface\\{00020401-0000-0000-C000-000000000046}",
+ "ITypeInfo" }
+
+ , { "Interface\\{00020401-0000-0000-C000-000000000046}\\ProxyStubClsid",
+ "{00020422-0000-0000-C000-000000000046}" }
+
+ , { "Interface\\{00020402-0000-0000-C000-000000000046}",
+ "ITypeLib" }
+
+ , { "Interface\\{00020403-0000-0000-C000-000000000046}",
+ "ITypeComp" }
+
+ , { "Interface\\{00020405-0000-0000-C000-000000000046}",
+ "ICreateTypeInfo" }
+
+ , { "Interface\\{00020406-0000-0000-C000-000000000046}",
+ "ICreateTypeLib" }
+
+ , { "CLSID\\{00020420-0000-0000-C000-000000000046}",
+ "PSDispatch" }
+
+#ifdef _PPCMAC
+#define szAutomationDll "MicrosoftOLE2AutomationLib"
+#else //_PPCMAC
+#define szAutomationDll "OLE2:DISP$DispFSet"
+#endif //_PPCMAC
+
+ , { "CLSID\\{00020420-0000-0000-C000-000000000046}\\InprocServer",
+ szAutomationDll }
+
+ , { "CLSID\\{00020422-0000-0000-C000-000000000046}",
+ "PSTypeInfo" }
+
+ , { "CLSID\\{00020422-0000-0000-C000-000000000046}\\InprocServer",
+ szAutomationDll }
+
+ , { "CLSID\\{00020421-0000-0000-C000-000000000046}",
+ "PSEnumVARIANT" }
+
+ , { "CLSID\\{00020421-0000-0000-C000-000000000046}\\InprocServer",
+ szAutomationDll }
+
+};
+
+HRESULT
+EnsureRegistration()
+{
+ HKEY hkey;
+
+ if(RegOpenKey(HKEY_CLASSES_ROOT, "SDSP", &hkey) == NOERROR){
+ RegCloseKey(hkey);
+ return NOERROR;
+ }
+
+ for(int i = 0; i < DIM(g_rgregentry); ++i){
+ if(RegSetValue(HKEY_CLASSES_ROOT, g_rgregentry[i].szKey, REG_SZ, g_rgregentry[i].szValue, 0) != ERROR_SUCCESS)
+ return ResultFromScode(E_FAIL);
+ }
+
+ return NOERROR;
+}
+
diff --git a/private/oleauto/tests/sdisptst/macmain.h b/private/oleauto/tests/sdisptst/macmain.h
new file mode 100644
index 000000000..e82ee74f4
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/macmain.h
@@ -0,0 +1,176 @@
+
+#ifndef rez // {
+void AlertUser(short error );
+void EventLoop(void );
+void DoEvent( EventRecord *event );
+void AdjustCursor(Point mouse, RgnHandle region );
+void GetGlobalMouse(Point *mouse );
+void DoGrowWindow(WindowPtr window, EventRecord *event );
+void DoZoomWindow(WindowPtr window, short part );
+void ResizeWindow(WindowPtr window );
+void GetLocalUpdateRgn(WindowPtr window, RgnHandle localRgn );
+void DoUpdate(WindowPtr window );
+void DoDeactivate(WindowPtr window );
+void DoActivate(WindowPtr window, Boolean becomingActive);
+void DoContentClick(WindowPtr window, EventRecord *event );
+void DoKeyDown(EventRecord *event );
+void CommonAction(ControlHandle control, short *amount);
+extern "C" PASCAL_(void) VActionProc(ControlHandle control, short part);
+extern "C" PASCAL_(void) HActionProc(ControlHandle control, short part);
+void DoIdle(void );
+void DrawWindow(WindowPtr window );
+void AdjustMenus(void );
+void DoMenuCommand(long menuResult );
+void DoNew(void );
+void Terminate(void );
+void Init(void );
+void BigBadError(short error );
+void GetTERect(WindowPtr window, Rect *teRect );
+void AdjustViewRect(TEHandle docTE );
+void AdjustTE(WindowPtr window );
+void AdjustHV(Boolean isVert, ControlHandle control, TEHandle docTE, Boolean canRedraw );
+void AdjustScrollValues(WindowPtr window, Boolean canRedraw );
+void AdjustScrollSizes(WindowPtr window );
+void AdjustScrollbars(WindowPtr window, Boolean needsResize );
+unsigned long GetSleep(void );
+Boolean DoCloseWindow(WindowPtr window );
+Boolean IsAppWindow(WindowPtr window );
+Boolean IsDAWindow(WindowPtr window );
+Boolean TrapExists(short tNumber);
+PASCAL_(Boolean) PascalClikLoop();
+#endif // }
+
+
+#define kPrefSize 3500
+#define kMinSize 2100
+
+/* The following constants are used to identify menus and their items.
+ The menu IDs have an "m" prefix and the item numbers within each menu
+ have an "i" prefix. */
+#define mApple 128 /* Apple menu */
+#define iAbout 1
+
+#define mFile 129 /* File menu */
+#define iNew 1
+#define iClose 4
+#define iQuit 12
+
+#define mEdit 130 /* Edit menu */
+#define iUndo 1
+#define iCut 3
+#define iCopy 4
+#define iPaste 5
+#define iClear 6
+
+#define mOptions 132
+#define iClearAll 1
+
+#define kDITop 0x0050
+#define kDILeft 0x0070
+
+/* kTextMargin is the number of pixels we leave blank at the edge
+ of the window. */
+#define kTextMargin 2
+
+/* kMaxOpenDocs is used to determine whether a new document can be
+ opened or created. We keep track of the number of open documents, and
+ disable the menu items that create a new document when the maximum is
+ reached. If the number of documents falls below the maximum, the items
+ are enabled again. */
+#define kMaxOpenDocs 1
+
+/* kMaxDocWidth is an arbitrary number used to specify the width of the
+ TERec's destination rectangle so that word wrap and horizontal scrolling
+ can be demonstrated. */
+#define kMaxDocWidth 576
+
+/* kMinDocDim is used to limit the minimum dimension of a window when
+ GrowWindow is called. */
+#define kMinDocDim 64
+
+/* kControlInvisible is used to 'turn off' controls (i.e., cause the
+ control not to be redrawn as a result of some Control Manager call
+ such as SetCtlValue) by being put into the contrlVis field of the
+ record. kControlVisible is used the same way to 'turn on' the control. */
+#define kControlInvisible 0
+#define kControlVisible 0xFF
+
+/* kScrollbarAdjust and kScrollbarWidth are used in calculating
+ values for control positioning and sizing. */
+#define kScrollbarWidth 16
+#define kScrollbarAdjust (kScrollbarWidth - 1)
+
+/* kScrollTweek compensates for off-by-one requirements of the
+ scrollbars to have borders coincide with the growbox. */
+#define kScrollTweek 2
+
+/* kCrChar is used to match with a carriage return when calculating
+ the number of lines in the TextEdit record. kDelChar is used to
+ check for delete in keyDowns. */
+#define kCrChar 13
+#define kDelChar 8
+
+/* kButtonScroll is how many pixels to scroll horizontally when the
+ button part of the horizontal scrollbar is pressed. */
+#define kButtonScroll 4
+
+/* kMaxTELength is an arbitrary number used to limit the length of text
+ in the TERec so that various errors won't occur from too many characters
+ in the text. */
+#define kMaxTELength 32000
+
+/* kSysEnvironsVersion is passed to SysEnvirons to tell it which version of the
+ SysEnvRec we understand. */
+#define kSysEnvironsVersion 1
+
+/* kOSEvent is the event number of the suspend/resume and mouse-moved
+ events sent by MultiFinder. Once we determine that an event is an
+ OSEvent, we look at the high byte of the message sent to determine
+ which kind it is. To differentiate suspend and resume events we check
+ the resumeMask bit. */
+#define kOSEvent app4Evt /* event used by MultiFinder */
+
+/* high byte of suspend/resume event message */
+#define kSuspendResumeMessage 1
+
+/* bit of message field for resume vs. suspend */
+#define kResumeMask 1
+
+/* high byte of mouse-moved event message */
+#define kMouseMovedMessage 0xFA
+
+#define kNoEvents 0 /* no events mask */
+
+
+#define kMinHeap (29 * 1024)
+
+#define kMinSpace (20 * 1024)
+
+/* kExtremeNeg and kExtremePos are used to set up wide open rectangles
+ and regions. */
+#define kExtremeNeg -32768
+#define kExtremePos (32767 - 1) /* required to address an old region bug */
+
+/* kTESlop provides some extra security when pre-flighting edit commands. */
+#define kTESlop 1024
+
+/* The following are indicies into STR# resources. */
+#define eWrongMachine 1
+#define eSmallSize 2
+#define eNoMemory 3
+#define eNoSpaceCut 4
+#define eNoCut 5
+#define eNoCopy 6
+#define eExceedPaste 7
+#define eNoSpacePaste 8
+#define eNoWindow 9
+#define eExceedChar 10
+#define eNoPaste 11
+
+#define rMenuBar 128 /* application's menu bar */
+#define rAboutAlert 128 /* about alert */
+#define rUserAlert 129 /* user error alert */
+#define rDocWindow 128 /* application's window */
+#define rVScroll 128 /* vertical scrollbar control */
+#define rHScroll 129 /* horizontal scrollbar control */
+#define kErrStrings 128 /* error string list */
diff --git a/private/oleauto/tests/sdisptst/makefile b/private/oleauto/tests/sdisptst/makefile
new file mode 100644
index 000000000..78c0d43ee
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/makefile
@@ -0,0 +1,470 @@
+##############################################################################
+#
+# (c) Copyright Microsoft Corp. 1992-1993 All Rights Reserved
+#
+# File:
+#
+# makefile - makefile for sdisptst.exe
+#
+# Purpose:
+#
+# Builds the OLEautomation test apps, sdisptst.exe.
+#
+#
+# Usage:
+#
+# NMAKE ; build with defaults
+# or: NMAKE option ; build with the given option(s)
+# or: NMAKE clean ; erase all compiled files
+#
+# option: dev = [win16 | win32 | dev] ; dev=win16 is the default
+# DEBUG=[0|1] ; DEBUG=1 is the default
+#
+#
+# Notes:
+#
+# This makefile assumes that the PATH, INCLUDE and LIB environment
+# variables are setup properly.
+#
+#
+# Revision History:
+#
+# [00] 21-Sep-92 bradlo: Created
+# [00] 1-Mar-93 tometeng: Update for Win32 build
+# [00] 27-Jun-94 t-marioc : Update for MAC build
+#
+##############################################################################
+
+
+##########################################################################
+#
+# Default Settings
+#
+
+!if !defined(OLEPROG)
+!error OLEPROG environment variable not set
+!endif
+
+TESTS = $(OLEPROG)\TESTS
+!INCLUDE $(OLEPROG)\TESTS\OLEPROG.MAK
+
+
+##########################################################################
+#
+# Common Directories
+#
+
+SRCDIR = $(TESTS)\SDISPTST
+COMDIR = $(TESTS)\COMMON
+
+
+##########################################################################
+#
+# Application Settings
+#
+
+APPS = sdisptst
+
+##########################################################################
+#
+# Application Build (WIN16 Specific)
+#
+
+!if "$(TARG)" == "WIN16"
+
+OLEDISPLIB = $(OLEPROG)\dwin16\ole2disp.lib
+TYPELIBLIB = $(OLEPROG)\dwin16\typelib.lib
+
+OBJDIR = $(SRCDIR)\win16
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+GOAL = $(OBJDIR)\$(APPS).exe
+
+LCFLAGS = -Fo$(OBJDIR)\ -Fd$(OBJDIR)\sdisptst.pdb -AM -GA -GEs -I$(COMDIR)
+
+CLIBS = \
+ $(OLEPROG)\tools\win16\hdos\c800\lib\libw.lib \
+ $(OLEPROG)\tools\win16\hdos\c800\lib\mlibcew.lib
+
+OLELIBS = \
+ $(OLEPROG)\ole\win16\lib\ole2.lib \
+ $(OLEPROG)\ole\win16\lib\compobj.lib \
+ $(OLEPROG)\dwin16\ole2disp.lib \
+ $(OLEPROG)\dwin16\typelib.lib \
+ $(OLEPROG)\dwin16\ole2nls.lib
+
+OBJS = \
+ $(OBJDIR)\assert.obj \
+ $(OBJDIR)\dispdbug.obj \
+ $(OBJDIR)\dballoc.obj \
+ $(OBJDIR)\sdisptst.obj \
+ $(OBJDIR)\cunk.obj \
+ $(OBJDIR)\cdisp.obj \
+ $(OBJDIR)\testhelp.obj \
+ $(OBJDIR)\cappobj.obj \
+ $(OBJDIR)\cdisptst.obj \
+ $(OBJDIR)\cdualtst.obj \
+ $(OBJDIR)\csarray.obj \
+ $(OBJDIR)\cexinfo.obj \
+ $(OBJDIR)\cprop.obj \
+ $(OBJDIR)\misc.obj \
+ $(OBJDIR)\statbar.obj \
+ $(OBJDIR)\tdata.obj \
+ $(OBJDIR)\clsid.obj \
+ $(OBJDIR)\ccf.obj
+
+$(OBJDIR)\$(APPS).exe : \
+#ensure header file is built before attempting to build objects
+ $(OBJDIR)\sdisptst.tlb \
+ $(OBJS) \
+ $(CLIBS) \
+ $(OLELIBS) \
+ $(SRCDIR)\sdisptst.def \
+ $(OBJDIR)\sdisptst.res
+ $(LD) $(LFLAGS) $(LNOI) @<<$(OBJDIR)\sdisptst.lnk
+$(OBJS: = +^
+)
+$(OBJDIR)\sdisptst.exe,
+nul,
+$(CLIBS) +
+$(OLELIBS),
+$(SRCDIR)\sdisptst.def
+<<KEEP
+ cd $(OBJDIR)
+ rc $(RCFLAGS) -k -t sdisptst.res sdisptst.exe
+ cd $(SRCDIR)
+
+!endif
+
+
+##########################################################################
+#
+# Application Build (WIN32 Specific)
+#
+!if "$(TARG)" == "WIN32"
+
+
+OBJDIR = $(SRCDIR)\win32
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+GOAL = $(OBJDIR)\$(APPS).exe
+
+LCFLAGS = -Fo$(OBJDIR)\ -I$(COMDIR)
+
+LIBS = \
+ libcmt.lib \
+ kernel32.lib \
+ user32.lib \
+ gdi32.lib \
+ ole32.lib \
+ $(OLEPROG)\dwin32\oleaut32.lib \
+ uuid.lib
+
+OBJS = \
+ $(OBJDIR)\assert.obj \
+ $(OBJDIR)\dispdbug.obj \
+ $(OBJDIR)\dballoc.obj \
+ $(OBJDIR)\sdisptst.obj \
+ $(OBJDIR)\cunk.obj \
+ $(OBJDIR)\cdisp.obj \
+ $(OBJDIR)\testhelp.obj \
+ $(OBJDIR)\cappobj.obj \
+ $(OBJDIR)\cdisptst.obj \
+ $(OBJDIR)\cdualtst.obj \
+ $(OBJDIR)\csarray.obj \
+ $(OBJDIR)\cexinfo.obj \
+ $(OBJDIR)\cprop.obj \
+ $(OBJDIR)\misc.obj \
+ $(OBJDIR)\statbar.obj \
+ $(OBJDIR)\tdata.obj \
+ $(OBJDIR)\clsid.obj \
+ $(OBJDIR)\ccf.obj
+
+
+$(OBJDIR)\$(APPS).exe : \
+#ensure header file is built before attempting to build objects
+ $(OBJDIR)\sdisptst.tlb \
+ $(OBJS) \
+ $(SRCDIR)\$(APPS).def \
+ $(OBJDIR)\$(APPS).res
+ cvtres -$(CPU) $(OBJDIR)\$(APPS).res -o $(OBJDIR)\$(APPS).rs
+ $(LD) @<<
+ -entry:WinMainCRTStartup
+ -out:$@
+ -map:$*.map
+ -heap:4096
+ $(LFLAGS)
+ $(OBJS)
+ $(OBJDIR)\$(APPS).rs
+ $(LIBS)
+<<
+
+!endif
+
+
+##########################################################################
+#
+# Application Build (Mac Specific)
+#
+!if "$(TARG)" == "MAC"
+
+!if "$(TARGCPU)"=="PPC"
+OBJDIR = $(SRCDIR)\macppc
+!else
+OBJDIR = $(SRCDIR)\mac
+!endif
+
+!if [if not exist $(OBJDIR)\*.* mkdir $(OBJDIR)] != 0
+!endif
+
+MACLIBDIR = $(VBATOOLS)\win32\$(COMPILER)\LIB
+
+!if "$(TARGCPU)"=="PPC"
+LCFLAGS = -Fd$(OBJDIR)\sdisptst.pdb -Fo$(OBJDIR)\ -D _SLM
+!else
+LCFLAGS = -AL -Gt1 -Fd$(OBJDIR)\sdisptst.pdb -Fo$(OBJDIR)\ -D _SLM
+!endif
+
+#LCFLAGS = -Fo$(OBJDIR)\ -I$(COMDIR)
+
+## Add WLM to the include path
+#INCPATHS = $(INCPATHS);$(TOOLS)\H$(HOST)\$(COMPILER)\INCLUDE\WLM
+INCPATHS = $(INCPATHS);$(OLEPROG)\TESTS\COMMON;$(VBATOOLS)\win32\$(COMPILER)\INC\MRC
+
+LIBS = \
+ $(MACLIBDIR)\interfac.lib \
+!if "$(TARGCPU)"=="PPC"
+ ole2auto.lib \
+ ole2.lib \
+ $(MACLIBDIR)\libc.lib
+!else
+ $(MACLIBDIR)\wlm.lib \
+!if ("$(SWAP)" == "1")
+ $(MACLIBDIR)\llibcs.lib \
+ $(MACLIBDIR)\lsanes.lib \
+ $(MACLIBDIR)\swap.lib
+!else
+ $(MACLIBDIR)\llibc.lib \
+ $(MACLIBDIR)\lsane.lib
+!endif
+
+OLEOBJS = \
+!if ("$(SWAP)" == "1")
+ $(OLEDIR)\olelds.obj $(OLEDIR)\oalds.obj
+!else
+ $(OLEDIR)\olendf.obj $(OLEDIR)\oandf.obj
+!endif
+
+!endif # TARGCPU=PPC
+
+
+STATIC_OBJS = \
+ $(OBJDIR)\assert.obj \
+ $(OBJDIR)\cunk.obj \
+ $(OBJDIR)\cdisp.obj \
+ $(OBJDIR)\dispdbug.obj \
+ $(OBJDIR)\dballoc.obj \
+ $(OBJDIR)\testhelp.obj \
+ $(OBJDIR)\oleguids.obj \
+ $(OBJDIR)\cdualtst.obj \
+ $(OBJDIR)\csarray.obj \
+ $(OBJDIR)\misc.obj \
+ $(OBJDIR)\macmain.obj \
+ $(OBJDIR)\util.obj
+
+
+# pchObjs = \
+# {ObjDir}sdisptst.h.o
+
+OBJS = \
+# {pchObjs} \
+ $(STATIC_OBJS) \
+ $(OBJDIR)\clsid.obj \
+ $(OBJDIR)\tdata.obj \
+ $(OBJDIR)\cappobj.obj \
+ $(OBJDIR)\ccf.obj \
+ $(OBJDIR)\cdisptst.obj \
+ $(OBJDIR)\cexinfo.obj \
+ $(OBJDIR)\cprop.obj \
+
+
+$(OBJDIR)\$(APPS).exe : \
+#ensure header file is built before attempting to build objects
+ $(OBJDIR)\sdisptst.tlb \
+ $(OBJS) \
+ $(OLEOBJS) \
+ $(OBJDIR)\$(APPS).x
+ $(LD) @<<
+ $(OBJS)
+ $(OLEOBJS)
+ $(LIBS)
+!if "$(TARGCPU)"=="PPC"
+ -machine:mppc
+!else
+ -machine:m68k
+!endif
+ -entry:mainCRTStartup
+ -debug:full
+ -debugtype:cv
+ -nopack
+ -nodefaultlib
+ -out:$@
+ -map:$*.map
+ $(LFLAGS)
+<<
+ cvpack $(OBJDIR)\$(APPS).exe
+
+
+$(OBJDIR)\$(APPS).x : $(SRCDIR)\$(APPS).r
+!if "$(TARGCPU)" == "PPC"
+ mrc -s$(VBATOOLS)\win32\ppc\lib -D_PPCMAC -o $(OBJDIR)\$(APPS).x $(SRCDIR)\$(APPS).r
+!else
+ mrc -D_MAC -o $(OBJDIR)\$(APPS).x $(SRCDIR)\$(APPS).r
+!endif
+
+!if "$(TARGCPU)" == "PPC"
+GOAL = $(OBJDIR)\$(APPS).pef
+
+$(OBJDIR)\$(APPS).pef : $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).x
+ copy $(OBJDIR)\$(APPS).x $(OBJDIR)\$(APPS)
+ makepef $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).pef
+
+!else
+
+GOAL = $(OBJDIR)\$(APPS)
+
+$(OBJDIR)\$(APPS) : $(OBJDIR)\$(APPS).exe $(OBJDIR)\$(APPS).x
+ copy $(OBJDIR)\$(APPS).x $(OBJDIR)\$(APPS)
+ mrc -e $(OBJDIR)\$(APPS).exe -a -o $(OBJDIR)\$(APPS)
+
+!endif
+
+$(OBJDIR)\oleguids.obj : $(SRCDIR)\oleguids.c $(SRCDIR)\oleguids.h
+ $(CC) -c $(SRCDIR)\oleguids.c
+
+$(OBJDIR)\macmain.obj : $(SRCDIR)\macmain.h $(SRCDIR)\macmain.cpp
+ $(CCPP) -c $(SRCDIR)\macmain.cpp
+
+$(OBJDIR)\util.obj : $(COMDIR)\common.h $(COMDIR)\util.cpp
+ $(CCPP) -c $(COMDIR)\util.cpp
+
+!endif
+
+
+##########################################################################
+#
+# Application Build (Common)
+#
+
+$(OBJDIR)\$(APPS).res : $(SRCDIR)\$(APPS).rc $(SRCDIR)\resource.h $(OBJDIR)\sdisptst.tlb
+ cd $(OBJDIR)
+ rc $(RCFLAGS) -r -i$(COMDIR) -fosdisptst.res $(SRCDIR)\sdisptst.rc
+ cd $(SRCDIR)
+
+
+##########################################################################
+#
+# Default Goal
+#
+
+all : setflags $(GOAL)
+
+setflags :
+ set CL=$(CFLAGS) $(LCFLAGS)
+ set LIB=$(LIBPATHS)
+ set PATH=$(BINPATHS)
+ set INCLUDE=$(INCPATHS)
+
+
+
+##########################################################################
+#
+# Clean (erase) generated files
+#
+clean :
+ if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj
+ if exist $(OBJDIR)\*.lib del $(OBJDIR)\*.lib
+ if exist $(OBJDIR)\*.dll del $(OBJDIR)\*.dll
+ if exist $(OBJDIR)\*.exe del $(OBJDIR)\*.exe
+ if exist $(OBJDIR)\*.map del $(OBJDIR)\*.map
+ if exist $(OBJDIR)\*.res del $(OBJDIR)\*.res
+ if exist $(OBJDIR)\*.rs del $(OBJDIR)\*.rs
+ if exist $(OBJDIR)\*.lnk del $(OBJDIR)\*.lnk
+
+
+##########################################################################
+#
+# Dependencies
+#
+
+$(OBJDIR)\sdisptst.obj : $(SRCDIR)\sdisptst.h $(SRCDIR)\sdisptst.cpp
+ $(CCPP) -c $(SRCDIR)\sdisptst.cpp
+
+$(OBJDIR)\cappobj.obj : $(SRCDIR)\cappobj.h $(SRCDIR)\cappobj.cpp
+ $(CCPP) -c $(SRCDIR)\cappobj.cpp
+
+$(OBJDIR)\cdisptst.obj : $(SRCDIR)\sdisptst.h $(SRCDIR)\cdisptst.cpp
+ $(CCPP) -c $(SRCDIR)\cdisptst.cpp
+
+$(OBJDIR)\cdualtst.obj : $(SRCDIR)\sdisptst.h $(SRCDIR)\cdualtst.h $(SRCDIR)\cdualtst.cpp
+ $(CCPP) -c $(SRCDIR)\cdualtst.cpp
+
+$(OBJDIR)\csarray.obj : $(SRCDIR)\csarray.h $(SRCDIR)\csarray.cpp
+ $(CCPP) -c $(SRCDIR)\csarray.cpp
+
+$(OBJDIR)\cexinfo.obj : $(SRCDIR)\cexinfo.h $(SRCDIR)\cexinfo.cpp
+ $(CCPP) -c $(SRCDIR)\cexinfo.cpp
+
+$(OBJDIR)\cprop.obj : $(SRCDIR)\cprop.h $(SRCDIR)\cprop.cpp
+ $(CCPP) -c $(SRCDIR)\cprop.cpp
+
+$(OBJDIR)\misc.obj : $(SRCDIR)\sdisptst.h $(SRCDIR)\misc.cpp
+ $(CCPP) -c $(SRCDIR)\misc.cpp
+
+$(OBJDIR)\tdata.obj : \
+ $(SRCDIR)\cdisptst.h \
+ $(SRCDIR)\csarray.h \
+ $(SRCDIR)\tdata.c
+ $(CC) -c $(SRCDIR)\tdata.c
+
+$(OBJDIR)\clsid.obj : $(SRCDIR)\clsid.h $(SRCDIR)\clsid.c
+ $(CC) -c $(SRCDIR)\clsid.c
+
+$(OBJDIR)\ccf.obj : $(SRCDIR)\sdisptst.h $(SRCDIR)\ccf.cpp
+ $(CCPP) -c $(SRCDIR)\ccf.cpp
+
+$(OBJDIR)\cunk.obj : $(COMDIR)\cunk.h $(COMDIR)\cunk.cpp
+ $(CCPP) -c $(COMDIR)\cunk.cpp
+
+$(OBJDIR)\cdisp.obj : $(COMDIR)\cdisp.h $(COMDIR)\cdisp.cpp
+ $(CCPP) -c $(COMDIR)\cdisp.cpp
+
+$(OBJDIR)\testhelp.obj : $(COMDIR)\testhelp.h $(COMDIR)\testhelp.cpp
+ $(CCPP) -c $(COMDIR)\testhelp.cpp
+
+$(OBJDIR)\assert.obj : $(COMDIR)\assrtdlg.h $(COMDIR)\assert.cpp
+ $(CCPP) -c $(COMDIR)\assert.cpp
+
+$(OBJDIR)\dispdbug.obj : $(COMDIR)\dispdbug.cpp
+ $(CCPP) -c $(COMDIR)\dispdbug.cpp
+
+$(OBJDIR)\dballoc.obj : $(COMDIR)\dballoc.h $(COMDIR)\dballoc.cpp
+ $(CCPP) -c $(COMDIR)\dballoc.cpp
+
+$(OBJDIR)\statbar.obj : $(COMDIR)\statbar.h $(COMDIR)\statbar.cpp
+ $(CCPP) -c $(COMDIR)\statbar.cpp
+
+$(OBJDIR)\sdisptst.tlb : $(SRCDIR)\sdisptst.odl
+ $(CCPP) -EP $(SRCDIR)\sdisptst.odl >$(OBJDIR)\sdisptst.x
+!if "$(TARG)" == "WIN32"
+ cd $(OLEPROG)\dwin32
+!else
+ cd $(OLEPROG)\dwin16
+!endif
+ mktyplib /NOCPP $(SYSFLAG) /o $(OBJDIR)\s.log $(OBJDIR)\sdisptst.x
+ type $(OBJDIR)\s.log
+ cd $(SRCDIR)
diff --git a/private/oleauto/tests/sdisptst/makefile.mpw b/private/oleauto/tests/sdisptst/makefile.mpw
new file mode 100644
index 000000000..7b78cb903
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/makefile.mpw
@@ -0,0 +1,143 @@
+#***
+#makefile.mpw
+#
+# Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+#
+#Purpose:
+# Makefile for the Ole Automation Test App (Server), Ddisptst
+#
+#
+#Implementation Notes:
+#
+#****************************************************************************/
+
+OleRoot = HD:Ole2:
+
+OleIncDir= {OleRoot}MPW:Interfaces:CIncludes:
+OleLibDir= {OleRoot}MPW:Libraries:CLibraries:
+
+Common = hd:ole2auto:tests:common:
+ObjDir = hd:ole2auto:build:sdisptst:d:
+BinDir = hd:ole2auto:bin:
+
+defs = -d _MAC -d _DEBUG
+incs = -i {CIncludes} -i {OleIncDir} -i {Common}
+
+cflags = -mf -w3 -z6 -model far -sym full -mbg full {defs} {incs}
+cppflags = -mf -w3 -z6 -model far -sym full -mbg full {defs} {incs}
+
+pch = -load {ObjDir}sdisptst.h.dump
+
+AppleLibObjs = \
+ "{Libraries}"Runtime.o \
+ "{Libraries}"Interface.o \
+ "{CLibraries}"CPluslib.o \
+ "{CLibraries}"StdCLib.o
+
+OleLibs = \
+ "{OleLibDir}"Ole2Lib.far.debug.o \
+ "{OleLibDir}"Ole2Auto.far.debug.o
+
+commonObjs = \
+ {ObjDir}assert.cpp.o \
+ {ObjDir}cunk.cpp.o \
+ {ObjDir}cdisp.cpp.o \
+ {ObjDir}dispdbug.cpp.o \
+ {ObjDir}dballoc.cpp.o \
+ {ObjDir}testhelp.cpp.o \
+ {ObjDir}util.cpp.o
+
+pchObjs = \
+ {ObjDir}sdisptst.h.o
+
+Objs = \
+ {pchObjs} \
+ {commonObjs} \
+ {ObjDir}clsid.c.o \
+ {ObjDir}oleguids.c.o \
+ {ObjDir}tdata.c.o \
+ {ObjDir}cappobj.cpp.o \
+ {ObjDir}ccf.cpp.o \
+ {ObjDir}cdisptst.cpp.o \
+ {ObjDir}csarray.cpp.o \
+ {ObjDir}cexinfo.cpp.o \
+ {ObjDir}cprop.cpp.o \
+ {ObjDir}macmain.cpp.o \
+ {ObjDir}misc.cpp.o
+
+
+all ^ {ObjDir}sdisptst
+
+{ObjDir}sdisptst ^^ {Objs} {ObjDir}AppleLib.o {OleLibs} sdisptst.r resource.h
+ Link -model far -d -o {targ} -sym on {Objs} {ObjDir}AppleLib.o {OleLibs}
+ SetFile {targ} -t APPL -c 'SDSP' -a B
+ Rez -d _MAC -rd -append -o {targ} sdisptst.r
+ Duplicate -y {targ} {BinDir}
+ Duplicate -y {targ}.SYM {BinDir}
+
+{ObjDir}AppleLib.o ^ {AppleLibObjs}
+ Lib -o {ObjDir}AppleLib.o {AppleLibObjs}
+
+
+## precompiled header
+
+{ObjDir}sdisptst.h.o ^ sdisptst.h
+ cplus sdisptst.h -o {targ} {cppflags} -dumpc {ObjDir}sdisptst.h.dump
+
+
+{ObjDir}assert.cpp.o ^ {Common}assert.cpp {Common}common.h
+ cplus {Common}assert.cpp -o {targ} {cppflags}
+
+{ObjDir}cunk.cpp.o ^ {Common}cunk.cpp {Common}common.h
+ cplus {Common}cunk.cpp -o {targ} {cppflags}
+
+{ObjDir}cdisp.cpp.o ^ {Common}cdisp.cpp {Common}common.h
+ cplus {Common}cdisp.cpp -o {targ} {cppflags}
+
+{ObjDir}dispdbug.cpp.o ^ {Common}dispdbug.cpp {Common}common.h
+ cplus {Common}dispdbug.cpp -o {targ} {cppflags}
+
+{ObjDir}dballoc.cpp.o ^ {Common}dballoc.cpp {Common}common.h
+ cplus {Common}dballoc.cpp -o {targ} {cppflags}
+
+{ObjDir}testhelp.cpp.o ^ {Common}testhelp.cpp {Common}common.h
+ cplus {Common}testhelp.cpp -o {targ} {cppflags}
+
+{ObjDir}util.cpp.o ^ {Common}util.cpp {Common}common.h
+ cplus {Common}util.cpp -o {targ} {cppflags}
+
+
+{ObjDir}clsid.c.o ^ clsid.c clsid.h
+ c clsid.c -o {targ} {cppflags}
+
+{ObjDir}oleguids.c.o ^ oleguids.c oleguids.h
+ c oleguids.c -o {targ} {cppflags}
+
+{ObjDir}tdata.c.o ^ tdata.c sdisptst.h
+ c tdata.c -o {targ} {cppflags}
+
+
+{ObjDir}cappobj.cpp.o ^ cappobj.cpp sdisptst.h cappobj.h
+ cplus cappobj.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}ccf.cpp.o ^ ccf.cpp sdisptst.h
+ cplus ccf.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cdisptst.cpp.o ^ cdisptst.cpp sdisptst.h cdisptst.h
+ cplus cdisptst.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}csarray.cpp.o ^ csarray.cpp sdisptst.h csarray.h
+ cplus csarray.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cexinfo.cpp.o ^ cexinfo.cpp sdisptst.h cexinfo.h
+ cplus cexinfo.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}cprop.cpp.o ^ cprop.cpp sdisptst.h cprop.h
+ cplus cprop.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}macmain.cpp.o ^ macmain.cpp sdisptst.h macmain.h
+ cplus macmain.cpp -o {targ} {pch} {cppflags}
+
+{ObjDir}misc.cpp.o ^ misc.cpp sdisptst.h
+ cplus misc.cpp -o {targ} {pch} {cppflags}
+
diff --git a/private/oleauto/tests/sdisptst/misc.cpp b/private/oleauto/tests/sdisptst/misc.cpp
new file mode 100644
index 000000000..7d297ff90
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/misc.cpp
@@ -0,0 +1,371 @@
+/***
+*misc.cpp
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+*
+*Revision History:
+*
+* [00] 10-Oct-92 bradlo: Created.
+*
+*****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "sdisptst.h"
+#include "dballoc.h"
+#include "dispdbug.h"
+#include "cappobj.h"
+#include "cdisptst.h"
+#include "csarray.h"
+#include "cexinfo.h"
+#include "cprop.h"
+#if VBA2
+#include "cdualtst.h"
+#endif
+
+#if OE_MAC
+HRESULT EnsureRegistration();
+#endif
+
+#if !OE_MAC
+# include "statbar.h"
+#endif
+
+ASSERTDATA
+
+#if !OE_MAC
+extern CStatBar FAR* g_psb;
+#endif
+
+unsigned int g_cObjects = 0;
+unsigned int g_fVerbose = FALSE;
+unsigned int g_fAutomation = TRUE;
+unsigned int g_fDetectLeaks = FALSE;
+unsigned int g_fExitOnLastRelease = FALSE;
+
+unsigned long g_dwRegisterAppObject = 0;
+unsigned long g_dwRegisterAppObjectCF = 0;
+IUnknown FAR* g_punkAppObject = NULL;
+
+typedef struct tagCLASS_FACTORY_INFO{
+ const CLSID FAR* pclsid;
+ int regcls;
+ HRESULT (*pfnCreate)(IUnknown FAR*, IUnknown FAR* FAR*);
+ unsigned long dwRegister;
+} CLASS_FACTORY_INFO;
+
+CLASS_FACTORY_INFO
+g_rgClassFactoryInfo[] =
+{
+#if 0 /* dont include the app obj here, it is handled specially */
+ {
+ &CLSID_SDispTst_CAppObject,
+ REGCLS_SINGLEUSE,
+ CAppObject::Create,
+ 0
+ },
+#endif
+
+ {
+ &CLSID_SDispTst_CSArray,
+ REGCLS_MULTIPLEUSE,
+ CSArray::Create,
+ 0
+ },
+
+ {
+ &CLSID_SDispTst_CDispTst,
+ REGCLS_MULTIPLEUSE,
+ CDispTst::Create,
+ 0
+ },
+
+#if VBA2
+ {
+ &CLSID_SDispTst_CDualTst,
+ REGCLS_MULTIPLEUSE,
+ CDualTst::Create,
+ 0
+ },
+#endif
+
+ {
+ &CLSID_SDispTst_CExcepinfo,
+ REGCLS_MULTIPLEUSE,
+ CExcepinfo::Create,
+ 0
+ },
+
+#if OE_WIN32 && 0
+ {
+ &CLSID_SDispTst_CWExcepinfo,
+ REGCLS_MULTIPLEUSE,
+ CWExcepinfo::Create,
+ 0
+ },
+#endif
+
+ {
+ &CLSID_SDispTst_CProp,
+ REGCLS_MULTIPLEUSE,
+ CProp::Create,
+ 0
+ }
+};
+
+STDAPI
+UninitOle()
+{
+ int i;
+ HRESULT hresult;
+
+
+ // revoke the application object
+
+ if(g_dwRegisterAppObject != 0){
+ hresult = RevokeActiveObject(g_dwRegisterAppObject, NULL);
+ ASSERT(hresult == NOERROR);
+ }
+
+ // revoke the app objects class factory
+
+ if(g_dwRegisterAppObjectCF != 0){
+ hresult = CoRevokeClassObject(g_dwRegisterAppObjectCF);
+ ASSERT(hresult == NOERROR);
+ }
+
+ // release the application object
+
+ if(g_punkAppObject != NULL){
+ unsigned long refs = g_punkAppObject->Release();
+ ASSERT(refs == 0);
+ }
+
+ // revoke all other class factories
+
+ for(i = 0; i < DIM(g_rgClassFactoryInfo); ++i){
+ if(g_rgClassFactoryInfo[i].dwRegister != 0L){
+ hresult = CoRevokeClassObject(g_rgClassFactoryInfo[i].dwRegister);
+ ASSERT(hresult == NOERROR);
+ }
+ }
+
+ OleUninitialize();
+
+ return NOERROR;
+}
+
+STDAPI
+InitOle()
+{
+ int i;
+ HRESULT hresult;
+ IMalloc FAR* pmalloc;
+ IClassFactory FAR* pcf;
+ CLASS_FACTORY_INFO FAR* pcfi;
+
+ pmalloc = NULL;
+
+#if !OE_WIN32 // latest OLE complains about our allocs not being
+ // properly aligned (it wants 8-byte alignment even
+ // on x86). New OLE debug allocator is pretty good
+ // now, so we'll just use theirs.
+ unsigned long options;
+
+ options = DBALLOC_NONE;
+ if(g_fDetectLeaks)
+ options |= DBALLOC_DETECTLEAKS;
+
+ IfFailGo(CreateDbAlloc(options, NULL, &pmalloc), LError0);
+
+ IfFailGo(OleInitialize(pmalloc), LError0);
+
+ pmalloc->Release();
+ pmalloc = NULL;
+#else //!OE_WIN32
+ IfFailGo(OleInitialize(NULL), LError0);
+#endif //!OE_WIN32
+
+#ifdef _MAC
+ if((hresult = EnsureRegistration()) != NOERROR)
+ goto LError0;
+#endif
+
+ // create and register an instance of the "application object"
+
+ IfFailGo(CAppObject::Create(NULL, &g_punkAppObject), LError1);
+
+ IfFailGo(
+ RegisterActiveObject(
+ g_punkAppObject,
+ CLSID_SDispTst_CAppObject,
+ NULL, &g_dwRegisterAppObject),
+ LError1);
+
+ // if appropriate, register the App object class factory.
+
+ if(g_fAutomation){
+ hresult = CClassFactory::Create(&CAppObject::Create, &pcf);
+ if(hresult != NOERROR)
+ goto LError1;
+
+ hresult = CoRegisterClassObject(
+ CLSID_SDispTst_CAppObject,
+ pcf,
+ CLSCTX_LOCAL_SERVER,
+#if 0
+ REGCLS_SINGLEUSE,
+#else
+ REGCLS_MULTIPLEUSE,
+#endif
+ &g_dwRegisterAppObjectCF);
+
+ pcf->Release();
+
+ if(hresult != NOERROR)
+ goto LError1;
+ }
+
+ // register all other class factories.
+
+ for(i = 0; i < DIM(g_rgClassFactoryInfo); ++i){
+ pcfi = &g_rgClassFactoryInfo[i];
+
+ hresult = CClassFactory::Create(pcfi->pfnCreate, &pcf);
+ if(hresult != NOERROR)
+ goto LError1;
+
+ hresult = CoRegisterClassObject(
+ *pcfi->pclsid,
+ pcf,
+ CLSCTX_LOCAL_SERVER,
+ pcfi->regcls,
+ &pcfi->dwRegister);
+
+ pcf->Release();
+
+ if(hresult != NOERROR)
+ goto LError1;
+ }
+
+ return NOERROR;
+
+LError1:;
+ UninitOle();
+
+LError0:;
+ if(pmalloc != NULL)
+ pmalloc->Release();
+
+ return hresult;
+}
+
+unsigned int
+IncObjectCount()
+{
+ ++g_cObjects;
+ DbPrintf("#objects = %d\n", g_cObjects);
+ return g_cObjects;
+}
+
+unsigned int
+DecObjectCount()
+{
+ --g_cObjects;
+ DbPrintf("#objects = %d\n", g_cObjects);
+#if OE_WIN
+ if(g_cObjects == 0 && g_fExitOnLastRelease)
+ PostQuitMessage(0);
+#endif
+ return g_cObjects;
+}
+
+// printf to debug screen, *and* status bar
+//
+void
+DoPrintf(char *szFmt, ...)
+{
+ int len;
+ va_list args;
+ char *pszFmt;
+static char buf[512];
+
+#if HC_MPW
+
+ // translate all instances of %Fs to %s
+
+ char *pszTmp;
+ char rgTmp[128];
+
+ for(pszFmt=szFmt, pszTmp=rgTmp; *pszFmt != '\0';){
+
+ if(pszFmt[0] == '%' && pszFmt[1] == 'F' && pszFmt[2] == 's'){
+ pszTmp[0] = '%';
+ pszTmp[1] = 's';
+ pszFmt += 3;
+ pszTmp += 2;
+ }else{
+ *pszTmp++ = *pszFmt++;
+ }
+
+ }
+ *pszTmp = '\0';
+
+ pszFmt = rgTmp;
+
+#else
+
+ pszFmt = szFmt;
+
+#endif
+
+ va_start(args, szFmt);
+ vsprintf(buf, pszFmt, args);
+ len = strlen(buf);
+ ASSERT(len < DIM(buf));
+
+ DbPrintf(buf);
+
+#if OE_WIN
+ if(buf[len-1] == '\n')
+ buf[len-1] = '\0';
+ SBprintf(g_psb, buf);
+#endif
+}
+
+#if OE_MAC
+STDAPI_(void) OutputDebugString(const char*);
+#endif
+
+// printf to debug screen
+//
+extern "C" void
+DbPrintf(char FAR* szFormat, ...)
+{
+ va_list args;
+ char *pn, FAR* pf;
+static char rgchFmtBuf[512];
+static char rgchOutputBuf[1024];
+
+ // copy the 'far' format string to a near buffer so we can use
+ // the medium model vsprintf, which only supports near data pointers.
+ //
+ pn = rgchFmtBuf, pf=szFormat;
+ while(*pf != '\0')
+ *pn++ = *pf++;
+ *pn = '\0';
+
+ va_start(args, szFormat);
+ vsprintf(rgchOutputBuf, rgchFmtBuf, args);
+#if OE_WIN32
+ OutputDebugStringA(rgchOutputBuf);
+#else
+ OutputDebugString(rgchOutputBuf);
+#endif
+}
+
diff --git a/private/oleauto/tests/sdisptst/oleguids.c b/private/oleauto/tests/sdisptst/oleguids.c
new file mode 100644
index 000000000..4833df4e5
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/oleguids.c
@@ -0,0 +1,51 @@
+/***
+*oleguids.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file allocates (via Ole macro mania) the Ole GUIDS that are
+* referenced by the OLEDISP dll.
+*
+*Revision History:
+*
+* [00] 21-Jan-93 bradlo: Created.
+*
+*****************************************************************************/
+
+#ifdef _MAC
+# ifdef _MSC_VER
+# include <macos/types.h>
+# include <macos/packages.h>
+# include <macos/resource.h>
+# include <macos/menus.h>
+# include <macos/windows.h>
+# include <macos/osutils.h>
+# include <macos/appleeve.h>
+# else
+# include <types.h>
+# include <packages.h>
+# include <resources.h>
+# include <menus.h>
+# include <windows.h>
+# include <appleevents.h>
+# include <osutils.h>
+# include <AppleEvents.h>
+# endif
+#else
+# include <windows.h>
+#endif
+
+#include <ole2.h>
+
+// this redefines the Ole DEFINE_GUID() macro to do allocation.
+//
+#include <initguid.h>
+
+// due to the previous header, including this causes our DEFINE_GUID
+// definitions in the following headers to actually allocate data.
+
+// instantiate the ole2 guids that we use
+#include "oleguids.h"
+
diff --git a/private/oleauto/tests/sdisptst/oleguids.h b/private/oleauto/tests/sdisptst/oleguids.h
new file mode 100644
index 000000000..286b25485
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/oleguids.h
@@ -0,0 +1,38 @@
+/***
+*oleguids.h
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file is a subset of the Ole2 guid header: coguid.h.
+*
+* This file is used to instantiate the data for the Ole2 IIDs that
+* are used in OLEDISP.DLL, rather than linking with the Ole2 implib,
+* which causes us to pull in way more IID and CLSID definitions than
+* we want.
+*
+* NOTE: the GUIDs below must be *exactly* the same as those assigned
+* by the Ole group - If the Ole group ever changes their numbers, we
+* must change accordingly.
+*
+*Revision History:
+*
+* [00] 03-Jun-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+
+DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0);
+DEFINE_OLEGUID(IID_IClassFactory,0x00000001L, 0, 0);
+DEFINE_OLEGUID(IID_IMalloc, 0x00000002L, 0, 0);
+DEFINE_OLEGUID(IID_IDispatch, 0x00020400L, 0, 0);
+
+DEFINE_GUID(IID_IErrorInfo,
+ 0x1CF2B120L, 0x547D, 0x101B, 0x8E, 0x65, 0x08, 0x00, 0x2B, 0x2B, 0xD1, 0x19);
+
+
diff --git a/private/oleauto/tests/sdisptst/pch.cpp b/private/oleauto/tests/sdisptst/pch.cpp
new file mode 100644
index 000000000..89df869f0
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/pch.cpp
@@ -0,0 +1,9 @@
+
+// this file is used to construct the precompiled header
+
+#include "sdisptst.h"
+#include "cappobj.h"
+#include "cdisptst.h"
+#include "cexinfo.h"
+#include "csarray.h"
+
diff --git a/private/oleauto/tests/sdisptst/resource.h b/private/oleauto/tests/sdisptst/resource.h
new file mode 100644
index 000000000..6ef033d9b
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/resource.h
@@ -0,0 +1,3 @@
+#define IDM_VERBOSE 100
+
+#define IDM_FIRSTCHILD 1000
diff --git a/private/oleauto/tests/sdisptst/sdisptst.cpp b/private/oleauto/tests/sdisptst/sdisptst.cpp
new file mode 100644
index 000000000..be0180eee
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/sdisptst.cpp
@@ -0,0 +1,263 @@
+/***
+*sdisptst.c
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* UNDONE
+*
+*Revision History:
+*
+* [00] 14-Oct-92 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <string.h>
+
+#include "sdisptst.h"
+#include "statbar.h"
+
+
+#if OE_WIN32
+ #undef STRSTR
+ #define STRSTR strstr
+#endif
+
+ASSERTDATA
+
+
+BOOL InitApplication(HINSTANCE hinst);
+BOOL InitInstance(HINSTANCE hinst, int nCmdShow);
+
+extern "C" long FAR PASCAL
+FrameWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
+
+
+extern unsigned int g_fVerbose;
+extern unsigned int g_fAutomation;
+extern unsigned int g_fDetectLeaks;
+extern unsigned int g_fExitOnLastRelease;
+
+// global count of live objects
+// windows junk
+HINSTANCE g_hinst;
+HWND g_hwndFrame = 0;
+HWND g_hwndClient = 0;
+TCHAR g_szAppName[] = TSTR("sdisptst");
+TCHAR g_szFrameWndClass[] = TSTR("SDispTstWndClass");
+CStatBar FAR* g_psb = NULL;
+
+extern "C" int PASCAL
+WinMain(
+ HINSTANCE hinst,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+
+ if(!hPrevInstance){
+ if(!InitApplication(hinst)){
+ MessageBox(NULL, TSTR("unable to initialize app"), g_szAppName, MB_OK);
+ return FALSE;
+ }
+ }
+
+ if(STRSTR(lpCmdLine, "-verbose")){
+ g_fVerbose = TRUE;
+ }
+
+ if(STRSTR(lpCmdLine, "-detectleaks")){
+ g_fDetectLeaks = TRUE;
+ }
+
+ if (STRSTR(lpCmdLine, "/Automation")
+ || STRSTR(lpCmdLine, "-Automation")){
+ g_fAutomation = TRUE;
+ }
+
+ // REVIEW: the following is probably not totally correct
+ if(STRSTR(lpCmdLine, "-Embedding")){
+ g_fExitOnLastRelease = TRUE;
+ }
+
+ if(InitOle() != NOERROR){
+ MessageBox(NULL, TSTR("unable to initialize Ole"), g_szAppName, MB_OK);
+ return FALSE;
+ }
+
+ if(!InitInstance(hinst, nCmdShow)){
+ MessageBox(NULL, TSTR("unable to initialize instance"), g_szAppName, MB_OK);
+ return FALSE;
+ }
+
+ while(GetMessage(&msg, NULL, NULL, NULL)){
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ UninitOle();
+
+ return msg.wParam; /* Returns the value from PostQuitMessage */
+}
+
+BOOL
+InitApplication(HINSTANCE hinst)
+{
+ WNDCLASS wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = FrameWndProc;
+
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wc.lpszMenuName = TSTR("SDispTstMenu");
+ wc.lpszClassName = g_szFrameWndClass;
+
+ return RegisterClass(&wc);
+}
+
+#ifdef WIN32
+#define szAppName TSTR("IDispatch Test Server (32-bit)")
+#else //WIN32
+#define szAppName TSTR("IDispatch Test Server")
+#endif //WIN32
+
+BOOL
+InitInstance(HINSTANCE hinst, int nCmdShow)
+{
+ g_hinst = hinst;
+
+ // Create the main frame window.
+ //
+
+ g_hwndFrame = CreateWindow(
+ g_szFrameWndClass,
+ szAppName,
+ WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ NULL,
+ NULL,
+ hinst,
+ NULL);
+ if(!g_hwndFrame)
+ return FALSE;
+
+ g_hwndClient = GetWindow(g_hwndFrame, GW_CHILD);
+ if(!g_hwndClient)
+ return FALSE;
+
+ // Create the status bar.
+ //
+ g_psb = CStatBar::Create(g_hinst, g_hwndFrame);
+ if(g_psb == NULL)
+ return FALSE;
+
+ // Init and show the status bar.
+ //
+ g_psb->SetHeight(GetSystemMetrics(SM_CYCAPTION) - 1);
+ g_psb->SetFont((HFONT)GetStockObject(SYSTEM_FONT));
+ g_psb->SetText("Hello!");
+ g_psb->Show();
+
+ ShowWindow(g_hwndFrame, nCmdShow);
+
+ UpdateWindow(g_hwndFrame);
+
+ return TRUE;
+}
+
+void
+FrameWndOnCreate(HWND hwnd)
+{
+ CLIENTCREATESTRUCT ccs;
+
+ ccs.hWindowMenu = NULL;
+ ccs.idFirstChild = IDM_FIRSTCHILD;
+
+ g_hwndClient = CreateWindow(
+ TSTR("MDICLIENT"),
+ 0,
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+ 0, 0, 0, 0,
+ hwnd,
+ (HMENU) 1,
+ g_hinst,
+ (LPSTR)&ccs);
+}
+
+void
+FrameWndOnSize(HWND hwnd)
+{
+ RECT rc;
+ int height;
+
+ // Get the client rectangle for the frame window
+ GetClientRect(hwnd, &rc);
+
+ height = g_psb->GetHeight();
+
+ // adjust the client win to make room for the status bar.
+ //
+ MoveWindow(
+ g_hwndClient,
+ rc.left,
+ rc.top,
+ rc.right - rc.left,
+ rc.bottom - rc.top - height,
+ TRUE);
+
+ // move the status bar to the bottom of the newly positioned window.
+ //
+ g_psb->SetX(rc.left);
+ g_psb->SetY(rc.bottom - height),
+ g_psb->SetWidth(rc.right - rc.left);
+ g_psb->Move();
+}
+
+extern "C" long FAR PASCAL
+FrameWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ HMENU hmenu;
+
+ switch(message){
+ case WM_COMMAND:
+ switch(wParam){
+ case IDM_VERBOSE:
+ g_fVerbose = (g_fVerbose) ? FALSE : TRUE;
+ hmenu = GetMenu(hwnd);
+ CheckMenuItem(
+ hmenu, IDM_VERBOSE, g_fVerbose ? MF_CHECKED : MF_UNCHECKED);
+ return 0;
+ }
+ break;
+
+ case WM_CREATE:
+ FrameWndOnCreate(hwnd);
+ break;
+
+ case WM_SIZE:
+ FrameWndOnSize(hwnd);
+ return 0;
+
+ case WM_CLOSE:
+ g_psb->Release(); // release the status bar
+ DestroyWindow(hwnd);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefFrameProc(hwnd, g_hwndClient, message, wParam, lParam);
+}
diff --git a/private/oleauto/tests/sdisptst/sdisptst.def b/private/oleauto/tests/sdisptst/sdisptst.def
new file mode 100644
index 000000000..63fbfb149
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/sdisptst.def
@@ -0,0 +1,8 @@
+NAME SDISPTST
+EXETYPE WINDOWS 3.1
+
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD SINGLE
+
+HEAPSIZE 1024
+STACKSIZE 8096
diff --git a/private/oleauto/tests/sdisptst/sdisptst.h b/private/oleauto/tests/sdisptst/sdisptst.h
new file mode 100644
index 000000000..b02b89dce
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/sdisptst.h
@@ -0,0 +1,120 @@
+/***
+*sdisptst.h
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Master/Global include for the IDispatch test server.
+*
+*Revision History:
+*
+* [00] 29-Oct-92 bradlo: Created (added this nice header).
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#ifndef _SDISPTST_H_ /* { */
+#define _SDISPTST_H_
+
+#include "common.h"
+#include "clsid.h"
+#include "testhelp.h"
+#include "resource.h"
+
+// REVIEW: not sure what the following should be for win32
+#ifndef EXPORT
+#define EXPORT __export
+#endif
+
+// calling convention madness -
+//
+// For both win16 and win32, Ole2 specifies a "standard" method
+// calling convention. On both platforms the c/c++ compiler has
+// at least one other major calling convention that we support
+// in the TypeInfo driven implementation of Invoke, so we have added
+// the notion of an "alternate" calling convention - as defined below.
+//
+
+
+#if OE_WIN32
+# define CC_STDMETH CC_STDCALL
+# define CC_ALTMETH CC_CDECL
+# define ALTMETHODCALLTYPE __cdecl
+#elif OE_MAC68K
+# if HC_MPW
+# define CC_STDMETH CC_MPWCDECL
+# define CC_ALTMETH CC_MPWPASCAL
+# define ALTMETHODCALLTYPE pascal
+# else
+# define CC_STDMETH CC_CDECL
+# define CC_ALTMETH CC_MACPASCAL
+# define ALTMETHODCALLTYPE __pascal
+# endif
+#elif OE_MACPPC
+# define CC_STDMETH CC_CDECL
+# define CC_ALTMETH CC_STDCALL
+# define ALTMETHODCALLTYPE __stdcall
+#else /* OE_WIN16 */
+# define CC_STDMETH CC_CDECL
+# define CC_ALTMETH CC_PASCAL
+# define ALTMETHODCALLTYPE __pascal
+#endif
+
+#define ALTMETHOD_(TYPE, METHOD) virtual TYPE ALTMETHODCALLTYPE EXPORT METHOD
+#define ALTMETHOD(METHOD) ALTMETHOD_(HRESULT, METHOD)
+
+#define ALTMETHODIMP_(TYPE) TYPE ALTMETHODCALLTYPE EXPORT
+#define ALTMETHODIMP ALTMETHODIMP_(HRESULT)
+
+extern unsigned int g_fVerbose;
+
+extern unsigned int IncObjectCount(void);
+extern unsigned int DecObjectCount(void);
+
+EXTERN_C void DoPrintf(char *sz, ...);
+
+STDAPI InitOle(void);
+STDAPI UninitOle(void);
+
+
+
+// the following probably belongs elsewhere, but...
+#ifdef __cplusplus /* { */
+
+// A generic class factory implementation shared by all objects
+// exposed by Sdisptst.
+//
+class CClassFactory : public IClassFactory
+{
+public:
+ static HRESULT Create(
+ HRESULT (*pfnCreate)(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk),
+ IClassFactory FAR* FAR* ppcf);
+
+ // IUnknown methods
+ //
+ STDMETHOD(QueryInterface)(REFIID iid, void FAR* FAR* ppv);
+ STDMETHOD_(unsigned long, AddRef)(void);
+ STDMETHOD_(unsigned long, Release)(void);
+
+ STDMETHOD(CreateInstance)(
+ IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
+#if OE_MAC
+ STDMETHOD(LockServer)(unsigned long fLock);
+#else
+ STDMETHOD(LockServer)(BOOL fLock);
+#endif
+
+protected:
+ CClassFactory();
+
+private:
+ unsigned long m_refs;
+ HRESULT (*m_pfnCreate)(IUnknown FAR* punkOuter, IUnknown FAR* FAR* ppunk);
+};
+
+#endif /* } */
+
+#endif /* } */
diff --git a/private/oleauto/tests/sdisptst/sdisptst.odl b/private/oleauto/tests/sdisptst/sdisptst.odl
new file mode 100644
index 000000000..9ba7519e6
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/sdisptst.odl
@@ -0,0 +1,114 @@
+/***
+*sdisptst.odl
+*
+* Copyright (C) 1992-94, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This file describes the types (at least some of them) that are exposed
+* by sdisptst.exe via Automation.
+*
+*Revision History:
+*
+* [00] 13-Apr-93 bradlo: Created.
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+[
+ uuid(00020472-0000-0000-C000-000000000046),
+ lcid(0),
+ version(1.0),
+ helpstring("SDispTst -- Automation Test Server")
+]
+library sdisptst
+{
+#ifdef WIN32
+ importlib("stdole32.tlb");
+#else
+ importlib("stdole.tlb");
+#endif
+
+ [ dual,
+ uuid(00020475-0000-0000-C000-000000000046)
+ ]
+ interface IDualTst : IDispatch
+ {
+ [propget] HRESULT ui1([retval, out] unsigned char far* pui1);
+ [propput] HRESULT ui1([in] unsigned char ui1);
+
+ [propget] HRESULT i2([retval, out] short far* pi2);
+ [propput] HRESULT i2([in] short i2);
+
+ [propget] HRESULT i4([retval, out] long far* pi4);
+ [propput] HRESULT i4([in] long i4);
+
+ [propget] HRESULT r4([retval, out] float far* pr4);
+ [propput] HRESULT r4([in] float r4);
+
+ [propget] HRESULT r8([retval, out] double far* pr8);
+ [propput] HRESULT r8([in] double r8);
+
+ [propget] HRESULT cy([retval, out] currency far* pcy);
+ [propput] HRESULT cy([in] currency cy);
+
+ [propget] HRESULT date([retval, out] DATE far* pdate);
+ [propput] HRESULT date([in] DATE date);
+
+ [propget] HRESULT bstr([retval, out] BSTR far* pbstr);
+ [propput] HRESULT bstr([in] BSTR bstr);
+
+ [propget] HRESULT disp([retval,out] IDispatch far* far* ppdisp);
+#if 0 // 32bit MktypLib barfs on the following
+ [propput] HRESULT disp([in] IDispatch far* pdisp);
+#else
+ HRESULT nop0(void); // placeholder
+#endif
+ [propputref] HRESULT disp([in] IDispatch far* pdisp);
+
+ [propget] HRESULT var([retval, out] VARIANT far* pvar);
+#if 0 // 32bit MktypLib barfs on the following
+ [propput] HRESULT var([in] VARIANT var);
+#else
+ HRESULT nop1(void); // placeholder
+#endif
+ [propputref] HRESULT var([in] VARIANT var);
+
+ HRESULT m0([in] unsigned char ui1,
+ [in] short i2,
+ [in] long i4,
+ [in] float r4,
+ [in] double r8,
+ [in] currency cy,
+ [in] DATE date,
+ [in] BSTR bstr,
+ [in] IDispatch far* pdisp,
+ [in] VARIANT var);
+
+ HRESULT m1([in,out] unsigned char far* pui1,
+ [in,out] short far* pi2,
+ [in,out] long far* pi4,
+ [in,out] float far* pr4,
+ [in,out] double far* pr8,
+ [in,out] currency far* pcy,
+ [in,out] DATE far* pdate,
+ [in,out] BSTR far* pbstr,
+ [in,out] IDispatch far* far* ppdisp,
+ [in,out] VARIANT far* pvar);
+
+ HRESULT raise([in] long error,
+ [in] BSTR bstrSource,
+ [in] BSTR bstrDescription,
+ [in] long dwHelpContext,
+ [in] BSTR bstrHelpFile);
+ }
+
+ [
+ uuid(00020476-0000-0000-C000-000000000046)
+ ]
+ coclass CDualTst
+ {
+ [default] interface IDualTst;
+ }
+}
diff --git a/private/oleauto/tests/sdisptst/sdisptst.r b/private/oleauto/tests/sdisptst/sdisptst.r
new file mode 100644
index 000000000..ecd48c4c3
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/sdisptst.r
@@ -0,0 +1,295 @@
+#ifdef _PPCMAC
+include "cfrg.rsc";
+#endif
+
+#include "systypes.r"
+#include "types.r"
+#include "macmain.h"
+
+resource 'vers' (1) {
+ 0x02, 0x00, release, 0x00,
+ verUS,
+ "1.02",
+ "1.02, Copyright \251 1993 Microsoft."
+};
+
+/* we use an MBAR resource to conveniently load all the menus */
+
+resource 'MBAR' (rMenuBar, preload) {
+ { mApple, mFile, mEdit, mOptions };
+};
+
+
+resource 'MENU' (mApple, preload) {
+ mApple, textMenuProc,
+ 0b1111111111111111111111111111101,
+ enabled, apple,
+ {
+ "About Sdisptst\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mFile, preload) {
+ mFile, textMenuProc,
+ 0b0000000000000000000100000000000,
+ enabled, "File",
+ {
+ "New",
+ noicon, "N", nomark, plain;
+ "Open",
+ noicon, "O", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Close",
+ noicon, "W", nomark, plain;
+ "Save",
+ noicon, "S", nomark, plain;
+ "Save As\311",
+ noicon, nokey, nomark, plain;
+ "Revert",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Page Setup\311",
+ noicon, nokey, nomark, plain;
+ "Print\311",
+ noicon, nokey, nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Quit",
+ noicon, "Q", nomark, plain
+ }
+};
+
+resource 'MENU' (mEdit, preload) {
+ mEdit, textMenuProc,
+ 0b0000000000000000000000000000000,
+ enabled, "Edit",
+ {
+ "Undo",
+ noicon, "Z", nomark, plain;
+ "-",
+ noicon, nokey, nomark, plain;
+ "Cut",
+ noicon, "X", nomark, plain;
+ "Copy",
+ noicon, "C", nomark, plain;
+ "Paste",
+ noicon, "V", nomark, plain;
+ "Clear",
+ noicon, nokey, nomark, plain
+ }
+};
+
+resource 'MENU' (mOptions, preload) {
+ mOptions, textMenuProc,
+ 0b0000000000000000000000000000001,
+ enabled, "Options",
+ {
+ "Clear",
+ noicon, "C", nomark, plain
+ }
+};
+
+
+/* this ALRT and DITL are used as an About screen */
+
+resource 'ALRT' (rAboutAlert, purgeable) {
+ {40, 20, 160, 296}, rAboutAlert, {
+ OK, visible, silent;
+ OK, visible, silent;
+ OK, visible, silent;
+ OK, visible, silent
+ };
+};
+
+resource 'DITL' (rAboutAlert, purgeable) {
+ { /* array DITLarray: 5 elements */
+ /* [1] */
+ {88, 184, 108, 264},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {8, 8, 24, 274},
+ StaticText {
+ disabled,
+ "IDispatch Test Application"
+ },
+ /* [3] */
+ {32, 8, 48, 237},
+ StaticText {
+ disabled,
+ "Copyright \251 1993 Microsoft"
+ },
+ /* [4] */
+ {56, 8, 72, 136},
+ StaticText {
+ disabled,
+ "Brought to you by:"
+ },
+ /* [5] */
+ {80, 24, 112, 167},
+ StaticText {
+ disabled,
+ "The Ole Automation Team"
+ }
+ }
+};
+
+
+/* this ALRT and DITL are used as an error screen */
+
+resource 'ALRT' (rUserAlert, purgeable) {
+ {40, 20, 150, 260},
+ rUserAlert,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ }
+};
+
+
+resource 'DITL' (rUserAlert, purgeable) {
+ { /* array DITLarray: 3 elements */
+ /* [1] */
+ {80, 150, 100, 230},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 60, 230},
+ StaticText {
+ disabled,
+ "Error. ^0."
+ },
+ /* [3] */
+ {8, 8, 40, 40},
+ Icon {
+ disabled,
+ 2
+ }
+ }
+};
+
+
+resource 'WIND' (rDocWindow, preload, purgeable) {
+ {64, 60, 314, 460},
+ zoomDocProc, invisible, goAway, 0x0, "untitled"
+};
+
+
+resource 'CNTL' (rVScroll, preload, purgeable) {
+ {-1, 385, 236, 401},
+ 0, visible, 0, 0, scrollBarProc, 0, ""
+};
+
+
+resource 'CNTL' (rHScroll, preload, purgeable) {
+ {235, -1, 251, 386},
+ 0, visible, 0, 0, scrollBarProc, 0, ""
+};
+
+resource 'STR#' (kErrStrings, purgeable) {
+ {
+ "You must run on 512Ke or later";
+ "Application Memory Size is too small";
+ "Not enough memory to run Sdisptst";
+ "Not enough memory to do Cut";
+ "Cannot do Cut";
+ "Cannot do Copy";
+ "Cannot exceed 32,000 characters with Paste";
+ "Not enough memory to do Paste";
+ "Cannot create window";
+ "Cannot exceed 32,000 characters";
+ "Cannot do Paste"
+ }
+};
+
+resource 'SIZE' (-1) {
+ dontSaveScreen,
+ acceptSuspendResumeEvents,
+ enableOptionSwitch,
+ canBackground,
+ multiFinderAware,
+ backgroundAndForeground,
+ dontGetFrontClicks,
+ ignoreChildDiedEvents,
+ is32BitCompatible,
+ isHighLevelEventAware,
+ localAndRemoteHLEvents,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ reserved,
+ kPrefSize * 1024,
+ kMinSize * 1024
+};
+
+
+type 'MOOT' as 'STR ';
+
+
+resource 'MOOT' (0) {
+ "MultiFinder-Aware TextEdit Sample Application"
+};
+
+
+resource 'BNDL' (128) {
+ 'MOOT',
+ 0,
+ {
+ 'ICN#',
+ {
+ 0, 128
+ },
+ 'FREF',
+ {
+ 0, 128
+ }
+ }
+};
+
+
+resource 'FREF' (128) {
+ 'APPL',
+ 0,
+ ""
+};
+
+
+resource 'ICN#' (128) {
+ { /* array: 2 elements */
+ /* [1] */
+ $"04 30 40 00 0A 50 A0 00 0B 91 10 02 08 22 08 03"
+ $"12 24 04 05 20 28 02 09 40 10 01 11 80 0C 00 A1"
+ $"80 03 FF C2 7E 00 FF 04 01 00 7F 04 03 00 1E 08"
+ $"04 E0 00 0C 08 E0 00 0A 10 E0 00 09 08 C0 00 06"
+ $"04 87 FE 04 02 88 01 04 01 88 00 84 00 88 00 44"
+ $"00 88 00 44 00 88 00 C4 01 10 01 88 02 28 03 10"
+ $"01 C4 04 E0 00 02 08 00 73 BF FB EE 4C A2 8A 2A"
+ $"40 AA AA EA 52 AA AA 24 5E A2 8A EA 73 BE FB 8E",
+ /* [2] */
+ $"04 30 40 00 0E 70 E0 00 0F F1 F0 02 0F E3 F8 03"
+ $"1F E7 FC 07 3F EF FE 0F 7F FF FF 1F FF FF FF BF"
+ $"FF FF FF FE 7F FF FF FC 01 FF FF FC 03 FF FF F8"
+ $"07 FF FF FC 0F FF FF FE 1F FF FF FF 0F FF FF FE"
+ $"07 FF FF FC 03 FF FF FC 01 FF FF FC 00 FF FF FC"
+ $"00 FF FF FC 00 FF FF FC 01 FF FF F8 03 EF FF F0"
+ $"01 C7 FC E0 00 03 F8 00 73 BF FB EE 7F BE FB EE"
+ $"7F BE FB EE 7F BE FB E4 7F BE FB EE 73 BE FB 8E"
+ }
+};
+
diff --git a/private/oleauto/tests/sdisptst/sdisptst.r32 b/private/oleauto/tests/sdisptst/sdisptst.r32
new file mode 100644
index 000000000..92b0c583f
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/sdisptst.r32
@@ -0,0 +1,52 @@
+REGEDIT
+
+-- registration info for IDispatch tests
+
+-- the SDispTst Application Object
+
+HKEY_CLASSES_ROOT\sdisptst.application = sdisptst.application
+HKEY_CLASSES_ROOT\sdisptst.application\Clsid = {00020468-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020468-0000-0000-C000-000000000046} = IDispatch Test Server
+HKEY_CLASSES_ROOT\CLSID\{00020468-0000-0000-C000-000000000046}\ProgID = sdisptst.application
+HKEY_CLASSES_ROOT\CLSID\{00020468-0000-0000-C000-000000000046}\LocalServer32 = sdisptst.exe /Automation
+
+-- CDispTst
+
+HKEY_CLASSES_ROOT\sdisptst.cdisptst = sdisptst.cdisptst
+HKEY_CLASSES_ROOT\sdisptst.cdisptst\Clsid = {00020460-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020460-0000-0000-C000-000000000046} = IDispatch Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020460-0000-0000-C000-000000000046}\ProgID = sdisptst.cdisptst
+HKEY_CLASSES_ROOT\CLSID\{00020460-0000-0000-C000-000000000046}\LocalServer32 = sdisptst.exe /Automation
+
+-- CSArray
+
+HKEY_CLASSES_ROOT\sdisptst.csarray = sdisptst.csarray
+HKEY_CLASSES_ROOT\sdisptst.csarray\Clsid = {00020461-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020461-0000-0000-C000-000000000046} = SafeArray Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020461-0000-0000-C000-000000000046}\ProgID = sdisptst.csarray
+HKEY_CLASSES_ROOT\CLSID\{00020461-0000-0000-C000-000000000046}\LocalServer32 = sdisptst.exe /Automation
+
+-- CExcepinfo
+
+HKEY_CLASSES_ROOT\sdisptst.cexcepinfo = sdisptst.cexcepinfo
+HKEY_CLASSES_ROOT\sdisptst.cexcepinfo\Clsid = {00020466-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020466-0000-0000-C000-000000000046} = EXCEPINFO Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020466-0000-0000-C000-000000000046}\ProgID = sdisptst.cexcepinfo
+HKEY_CLASSES_ROOT\CLSID\{00020466-0000-0000-C000-000000000046}\LocalServer32 = sdisptst.exe /Automation
+
+-- CProp
+
+HKEY_CLASSES_ROOT\sdisptst.cprop = sdisptst.cprop
+HKEY_CLASSES_ROOT\sdisptst.cprop\Clsid = {00020471-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020471-0000-0000-C000-000000000046} = Property Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020471-0000-0000-C000-000000000046}\ProgID = sdisptst.cprop
+HKEY_CLASSES_ROOT\CLSID\{00020471-0000-0000-C000-000000000046}\LocalServer32 = sdisptst.exe /Automation
+
+-- CDualTst
+
+HKEY_CLASSES_ROOT\sdisptst.cdualtst = sdisptst.ccdualtst
+HKEY_CLASSES_ROOT\sdisptst.cdualtst\Clsid = {00020476-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020476-0000-0000-C000-000000000046} = Dual Interface Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020476-0000-0000-C000-000000000046}\ProgID = sdisptst.cdualtst
+HKEY_CLASSES_ROOT\CLSID\{00020476-0000-0000-C000-000000000046}\LocalServer32 = sdisptst.exe /Automation
+
diff --git a/private/oleauto/tests/sdisptst/sdisptst.rc b/private/oleauto/tests/sdisptst/sdisptst.rc
new file mode 100644
index 000000000..e0334648d
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/sdisptst.rc
@@ -0,0 +1,32 @@
+/***
+*sdisptst.rc
+*
+* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Resource script for sdisptst.exe
+*
+*Revision History:
+*
+* [00] 24-May-93 bradlo: (added header).
+*
+*Implementation Notes:
+*
+*****************************************************************************/
+
+#include <windows.h>
+#include "resource.h"
+#include "assert.dlg"
+
+SDispTstMenu MENU
+BEGIN
+ POPUP "&Options"
+ BEGIN
+ MENUITEM "&Verbose", IDM_VERBOSE
+ END
+END
+
+#if VBA2
+1 TYPELIB sdisptst.tlb
+#endif
diff --git a/private/oleauto/tests/sdisptst/sdisptst.reg b/private/oleauto/tests/sdisptst/sdisptst.reg
new file mode 100644
index 000000000..22b18efed
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/sdisptst.reg
@@ -0,0 +1,53 @@
+REGEDIT
+
+-- Registration info for IDispatch tests
+
+-- the SDispTst Application Object
+
+HKEY_CLASSES_ROOT\sdisptst.application = sdisptst.application
+HKEY_CLASSES_ROOT\sdisptst.application\Clsid = {00020468-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020468-0000-0000-C000-000000000046} = IDispatch Test Server
+HKEY_CLASSES_ROOT\CLSID\{00020468-0000-0000-C000-000000000046}\ProgID = sdisptst.application
+HKEY_CLASSES_ROOT\CLSID\{00020468-0000-0000-C000-000000000046}\LocalServer = sdisptst.exe /Automation
+
+-- CDispTst
+
+HKEY_CLASSES_ROOT\sdisptst.cdisptst = sdisptst.cdisptst
+HKEY_CLASSES_ROOT\sdisptst.cdisptst\Clsid = {00020460-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020460-0000-0000-C000-000000000046} = IDispatch Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020460-0000-0000-C000-000000000046}\ProgID = sdisptst.cdisptst
+HKEY_CLASSES_ROOT\CLSID\{00020460-0000-0000-C000-000000000046}\LocalServer = sdisptst.exe /Automation
+
+-- CSArray
+
+HKEY_CLASSES_ROOT\sdisptst.csarray = sdisptst.csarray
+HKEY_CLASSES_ROOT\sdisptst.csarray\Clsid = {00020461-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020461-0000-0000-C000-000000000046} = SafeArray Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020461-0000-0000-C000-000000000046}\ProgID = sdisptst.csarray
+HKEY_CLASSES_ROOT\CLSID\{00020461-0000-0000-C000-000000000046}\LocalServer = sdisptst.exe /Automation
+
+-- CExcepinfo
+
+HKEY_CLASSES_ROOT\sdisptst.cexcepinfo = sdisptst.cexcepinfo
+HKEY_CLASSES_ROOT\sdisptst.cexcepinfo\Clsid = {00020466-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020466-0000-0000-C000-000000000046} = EXCEPINFO Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020466-0000-0000-C000-000000000046}\ProgID = sdisptst.cexcepinfo
+HKEY_CLASSES_ROOT\CLSID\{00020466-0000-0000-C000-000000000046}\LocalServer = sdisptst.exe /Automation
+
+-- CProp
+
+HKEY_CLASSES_ROOT\sdisptst.cprop = sdisptst.cprop
+HKEY_CLASSES_ROOT\sdisptst.cprop\Clsid = {00020471-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020471-0000-0000-C000-000000000046} = Property Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020471-0000-0000-C000-000000000046}\ProgID = sdisptst.cprop
+HKEY_CLASSES_ROOT\CLSID\{00020471-0000-0000-C000-000000000046}\LocalServer = sdisptst.exe /Automation
+
+
+-- CDualTst
+
+HKEY_CLASSES_ROOT\sdisptst.cdualtst = sdisptst.ccdualtst
+HKEY_CLASSES_ROOT\sdisptst.cdualtst\Clsid = {00020476-0000-0000-C000-000000000046}
+HKEY_CLASSES_ROOT\CLSID\{00020476-0000-0000-C000-000000000046} = Dual Interface Test Object
+HKEY_CLASSES_ROOT\CLSID\{00020476-0000-0000-C000-000000000046}\ProgID = sdisptst.cdualtst
+HKEY_CLASSES_ROOT\CLSID\{00020476-0000-0000-C000-000000000046}\LocalServer = sdisptst.exe /Automation
+
diff --git a/private/oleauto/tests/sdisptst/src2mac.mak b/private/oleauto/tests/sdisptst/src2mac.mak
new file mode 100644
index 000000000..91a80c907
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/src2mac.mak
@@ -0,0 +1,217 @@
+#***
+#src2mac.mak
+#
+# Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
+# Information Contained Herein Is Proprietary and Confidential.
+#
+#Purpose:
+# UNDONE
+#
+#
+#Revision History:
+#
+# [00] 15-Jun-93 bradlo: Created.
+#
+#Implementation Notes:
+#
+#****************************************************************************/
+
+.SUFFIXES: .c .cpp .h
+
+all: setflags files
+
+# source directories
+#
+SRCCOMN = $(OLEPROG)\TESTS\COMMON
+SRCSDSP = $(OLEPROG)\TESTS\SDISPTST
+
+# destination directories
+#
+MACCOMN = :hd:ole2auto:tests:common:
+MACSDSP = :hd:ole2auto:tests:sdisptst:
+
+# timestamp directories
+#
+TMPCOMN = $(TMP)\common
+TMPSDSP = $(TMP)\sdisptst
+
+CP2MAC=ec copy -l -t TEXT -c "MPS "
+
+setflags:
+ set path=%tools%\hnt\wings\bin;%oleprog%\bin
+ if not exist %TMP%\common mkdir %TMP%\common
+ if not exist %TMP%\sdisptst mkdir %TMP%\sdisptst
+
+
+files : common sdisptst
+
+common : \
+ $(TMPCOMN)\cdisp.h \
+ $(TMPCOMN)\common.h \
+ $(TMPCOMN)\cunk.h \
+ $(TMPCOMN)\dballoc.h \
+ $(TMPCOMN)\dispdbug.h \
+ $(TMPCOMN)\testhelp.h \
+ $(TMPCOMN)\assert.cpp \
+ $(TMPCOMN)\cdisp.cpp \
+ $(TMPCOMN)\crempoly.cpp \
+ $(TMPCOMN)\cunk.cpp \
+ $(TMPCOMN)\dispdbug.cpp \
+ $(TMPCOMN)\dballoc.cpp \
+ $(TMPCOMN)\disphelp.cpp \
+ $(TMPCOMN)\testhelp.cpp \
+ $(TMPCOMN)\util.cpp
+
+
+sdisptst : \
+ $(TMPSDSP)\cappobj.h \
+ $(TMPSDSP)\cdisptst.h \
+ $(TMPSDSP)\cexinfo.h \
+ $(TMPSDSP)\clsid.h \
+ $(TMPSDSP)\cprop.h \
+ $(TMPSDSP)\csarray.h \
+ $(TMPSDSP)\macmain.h \
+ $(TMPSDSP)\oleguids.h \
+ $(TMPSDSP)\resource.h \
+ $(TMPSDSP)\sdisptst.h \
+ $(TMPSDSP)\clsid.c \
+ $(TMPSDSP)\oleguids.c \
+ $(TMPSDSP)\tdata.c \
+ $(TMPSDSP)\tinfo.c \
+ $(TMPSDSP)\cappobj.cpp \
+ $(TMPSDSP)\ccf.cpp \
+ $(TMPSDSP)\cdisptst.cpp \
+ $(TMPSDSP)\cexinfo.cpp \
+ $(TMPSDSP)\cprop.cpp \
+ $(TMPSDSP)\csarray.cpp \
+ $(TMPSDSP)\macmain.cpp \
+ $(TMPSDSP)\misc.cpp \
+ $(TMPSDSP)\sdisptst.r \
+ $(TMPSDSP)\makefile.tmp
+
+
+#---------------------------------------------------------------------
+# default rules
+#---------------------------------------------------------------------
+
+##### tests\common
+
+{$(SRCCOMN)}.h{$(TMPCOMN)}.h:
+ $(CP2MAC) $< $(MACCOMN)$(@F)
+ echo $(@F) > $@
+
+{$(SRCCOMN)}.c{$(TMPCOMN)}.c:
+ $(CP2MAC) $< $(MACCOMN)$(@F)
+ echo $(@F) > $@
+
+{$(SRCCOMN)}.cpp{$(TMPCOMN)}.cpp:
+ $(CP2MAC) $< $(MACCOMN)$(@F)
+ echo $(@F) > $@
+
+
+##### tests\disptest
+
+{$(SRCSDSP)}.h{$(TMPSDSP)}.h:
+ $(CP2MAC) $< $(MACSDSP)$(@F)
+ echo $(@F) > $@
+
+{$(SRCSDSP)}.c{$(TMPSDSP)}.c:
+ $(CP2MAC) $< $(MACSDSP)$(@F)
+ echo $(@F) > $@
+
+{$(SRCSDSP)}.cpp{$(TMPSDSP)}.cpp:
+ $(CP2MAC) $< $(MACSDSP)$(@F)
+ echo $(@F) > $@
+
+
+#---------------------------------------------------------------------
+# common test sources
+#---------------------------------------------------------------------
+
+$(TMPCOMN)\cdisp.h : $(SRCCOMN)\cdisp.h
+
+$(TMPCOMN)\common.h : $(SRCCOMN)\common.h
+
+$(TMPCOMN)\cunk.h : $(SRCCOMN)\cunk.h
+
+$(TMPCOMN)\dballoc.h : $(SRCCOMN)\dballoc.h
+
+$(TMPCOMN)\dispdbug.h : $(SRCCOMN)\dispdbug.h
+
+$(TMPCOMN)\testhelp.h : $(SRCCOMN)\testhelp.h
+
+$(TMPCOMN)\assert.cpp : $(SRCCOMN)\assert.cpp
+
+$(TMPCOMN)\cdisp.cpp : $(SRCCOMN)\cdisp.cpp
+
+$(TMPCOMN)\crempoly.cpp : $(SRCCOMN)\crempoly.cpp
+
+$(TMPCOMN)\cunk.cpp : $(SRCCOMN)\cunk.cpp
+
+$(TMPCOMN)\dispdbug.cpp : $(SRCCOMN)\dispdbug.cpp
+
+$(TMPCOMN)\dballoc.cpp : $(SRCCOMN)\dballoc.cpp
+
+$(TMPCOMN)\disphelp.cpp : $(SRCCOMN)\disphelp.cpp
+
+$(TMPCOMN)\testhelp.cpp : $(SRCCOMN)\testhelp.cpp
+
+$(TMPCOMN)\util.cpp : $(SRCCOMN)\util.cpp
+
+
+#---------------------------------------------------------------------
+# sdisptst sources
+#---------------------------------------------------------------------
+
+$(TMPSDSP)\cappobj.h : $(SRCSDSP)\cappobj.h
+
+$(TMPSDSP)\cdisptst.h : $(SRCSDSP)\cdisptst.h
+
+$(TMPSDSP)\cexinfo.h : $(SRCSDSP)\cexinfo.h
+
+$(TMPSDSP)\clsid.h : $(SRCSDSP)\clsid.h
+
+$(TMPSDSP)\cprop.h : $(SRCSDSP)\cprop.h
+
+$(TMPSDSP)\csarray.h : $(SRCSDSP)\csarray.h
+
+$(TMPSDSP)\macmain.h : $(SRCSDSP)\macmain.h
+
+$(TMPSDSP)\oleguids.h : $(SRCSDSP)\oleguids.h
+
+$(TMPSDSP)\resource.h : $(SRCSDSP)\resource.h
+
+$(TMPSDSP)\sdisptst.h : $(SRCSDSP)\sdisptst.h
+
+$(TMPSDSP)\clsid.c : $(SRCSDSP)\clsid.c
+
+$(TMPSDSP)\oleguids.c : $(SRCSDSP)\oleguids.c
+
+$(TMPSDSP)\tdata.c : $(SRCSDSP)\tdata.c
+
+$(TMPSDSP)\tinfo.c : $(SRCSDSP)\tinfo.c
+
+$(TMPSDSP)\cappobj.cpp : $(SRCSDSP)\cappobj.cpp
+
+$(TMPSDSP)\ccf.cpp : $(SRCSDSP)\ccf.cpp
+
+$(TMPSDSP)\cdisptst.cpp : $(SRCSDSP)\cdisptst.cpp
+
+$(TMPSDSP)\cexinfo.cpp : $(SRCSDSP)\cexinfo.cpp
+
+$(TMPSDSP)\cprop.cpp : $(SRCSDSP)\cprop.cpp
+
+$(TMPSDSP)\csarray.cpp : $(SRCSDSP)\csarray.cpp
+
+$(TMPSDSP)\macmain.cpp : $(SRCSDSP)\macmain.cpp
+
+$(TMPSDSP)\misc.cpp : $(SRCSDSP)\misc.cpp
+
+$(TMPSDSP)\sdisptst.r : $(SRCSDSP)\sdisptst.r
+ $(CP2MAC) $(SRCSDSP)\sdisptst.r $(MACSDSP)$(@F)
+ echo $(@F) > $@
+
+$(TMPSDSP)\makefile.tmp : $(SRCSDSP)\makefile.mpw
+ mungemak $(SRCSDSP)\makefile.mpw > $(TMPSDSP)\makefile.tmp
+ $(CP2MAC) $(TMPSDSP)\makefile.tmp $(MACSDSP)makefile
+
diff --git a/private/oleauto/tests/sdisptst/tdata.c b/private/oleauto/tests/sdisptst/tdata.c
new file mode 100644
index 000000000..7bc1dc6d5
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/tdata.c
@@ -0,0 +1,702 @@
+/***
+*tdata.c
+*
+* Copyright (C) 1991, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Type description of the CDispTst and CSarray members exposed
+* for access via IDispatch.
+*
+*Revision History:
+*
+* [00] 21-Sep-92 bradlo: Created.
+*
+*****************************************************************************/
+
+#include "sdisptst.h"
+#include "cappobj.h"
+#include "cdisptst.h"
+#include "csarray.h"
+#include "cexinfo.h"
+
+/* MPW C++ BUGALERT - This used to be a .cpp file, but MPW C++ has a
+ * bug with stringizing macro arguments which we use heavily here.
+ * It appears to put any spaces preceeding the macro argument into
+ * the string. for example:
+ *
+ * #define FOO(X,Y) {X, #Y}
+ *
+ * FOO(1, HELLO)
+ *
+ * would get preprocessed as:
+ *
+ * {1, " HELLO"}
+ *
+ * I worked around this by making this a .c file.
+ *
+ */
+
+#if OE_WIN32
+
+#define PARAM1(METHNAME, PARAMNAME, VT) \
+ static PARAMDATA rgpdata ## METHNAME[1] = {{L#PARAMNAME, VT}}
+
+
+// method with 1-N params
+#define METH_(CLASS, NAME, CC, NPARAMS, VTRETURN) \
+ { \
+ L#NAME, \
+ rgpdata ## NAME, \
+ IDMEMBER_ ## CLASS ## _ ## NAME, \
+ IMETH_ ## CLASS ## _ ## NAME, \
+ CC, NPARAMS, DISPATCH_METHOD, VTRETURN \
+ } /* END */
+
+
+// method with 0 params
+#define METH0(CLASS, NAME, CC, VTRETURN) \
+ { \
+ L#NAME, \
+ NULL, \
+ IDMEMBER_ ## CLASS ## _ ## NAME, \
+ IMETH_ ## CLASS ## _ ## NAME, \
+ CC, 0, DISPATCH_METHOD, VTRETURN \
+ } /* END */
+
+
+#else
+
+#define PARAM1(METHNAME, PARAMNAME, VT) \
+ static PARAMDATA rgpdata ## METHNAME[1] = {{#PARAMNAME, VT}}
+
+
+// method with 1-N params
+#define METH_(CLASS, NAME, CC, NPARAMS, VTRETURN) \
+ { \
+ #NAME, \
+ rgpdata ## NAME, \
+ IDMEMBER_ ## CLASS ## _ ## NAME, \
+ IMETH_ ## CLASS ## _ ## NAME, \
+ CC, NPARAMS, DISPATCH_METHOD, VTRETURN \
+ } /* END */
+
+
+// method with 0 params
+#define METH0(CLASS, NAME, CC, VTRETURN) \
+ { \
+ #NAME, \
+ NULL, \
+ IDMEMBER_ ## CLASS ## _ ## NAME, \
+ IMETH_ ## CLASS ## _ ## NAME, \
+ CC, 0, DISPATCH_METHOD, VTRETURN \
+ } /* END */
+
+#endif
+
+#define ALTMETH0(CLASS, NAME, VTRETURN) \
+ METH0(CLASS, NAME, CC_ALTMETH, VTRETURN)
+
+#define ALTMETH_(CLASS, NAME, VTRETURN) \
+ METH_(CLASS, NAME, CC_ALTMETH, DIM(rgpdata ## NAME), VTRETURN)
+
+#define STDMETH0(CLASS, NAME, VTRETURN) \
+ METH0(CLASS, NAME, CC_STDMETH, VTRETURN)
+#define STDMETH_(CLASS, NAME, VTRETURN) \
+ METH_(CLASS, NAME, CC_STDMETH, DIM(rgpdata ## NAME), VTRETURN)
+
+
+#define INTERFACEDAT(CLASS) \
+ INTERFACEDATA g_idata ## CLASS = { \
+ rgmethdata ## CLASS, DIM(rgmethdata ## CLASS) \
+ } /* END */
+
+
+
+
+//---------------------------------------------------------------------
+// CDispTst INTERFACEDATA
+//---------------------------------------------------------------------
+
+
+// CDispTst PARAMDATA
+
+#if VBA2
+PARAM1(UI1, BVAL, VT_UI1);
+PARAM1(UI1C, BVAL, VT_UI1);
+#endif //VBA2
+PARAM1(I2, SVAL, VT_I2);
+PARAM1(I2C, SVAL, VT_I2);
+PARAM1(I4, LVAL, VT_I4);
+PARAM1(I4C, LVAL, VT_I4);
+PARAM1(R4, FLTVAL, VT_R4);
+PARAM1(R4C, FLTVAL, VT_R4);
+PARAM1(R8, DBLVAL, VT_R8);
+PARAM1(R8C, DBLVAL, VT_R8);
+PARAM1(CY, CYVAL, VT_CY);
+PARAM1(CYC, CYVAL, VT_CY);
+PARAM1(DATE, DATE, VT_DATE);
+PARAM1(DATEC, DATE, VT_DATE);
+PARAM1(BSTR, BSTR, VT_BSTR);
+PARAM1(BSTRC, BSTR, VT_BSTR);
+PARAM1(SCODE, SCODE, VT_ERROR);
+PARAM1(SCODEC, SCODE, VT_ERROR);
+PARAM1(BOOL, BOOL, VT_BOOL);
+PARAM1(BOOLC, BOOL, VT_BOOL);
+PARAM1(VAR, VARG, VT_VARIANT);
+PARAM1(VARC, VARG, VT_VARIANT);
+PARAM1(NEWCDISPTST2, DISPATCH, VT_DISPATCH);
+PARAM1(NEWCDISPTSTC2, DISPATCH, VT_DISPATCH);
+#if VBA2
+PARAM1(UI1REF, PBVAL, VT_BYREF|VT_UI1);
+PARAM1(UI1REFC, PBVAL, VT_BYREF|VT_UI1);
+#endif //VBA2
+PARAM1(I2REF, PSVAL, VT_BYREF|VT_I2);
+PARAM1(I2REFC, PSVAL, VT_BYREF|VT_I2);
+PARAM1(I4REF, PLVAL, VT_BYREF|VT_I4);
+PARAM1(I4REFC, PLVAL, VT_BYREF|VT_I4);
+PARAM1(R4REF, PFLTVAL, VT_BYREF|VT_R4);
+PARAM1(R4REFC, PFLTVAL, VT_BYREF|VT_R4);
+PARAM1(R8REF, PDBLVAL, VT_BYREF|VT_R8);
+PARAM1(R8REFC, PDBLVAL, VT_BYREF|VT_R8);
+PARAM1(CYREF, PCYVAL, VT_BYREF|VT_CY);
+PARAM1(CYREFC, PCYVAL, VT_BYREF|VT_CY);
+PARAM1(DATEREF, PDATE, VT_BYREF|VT_DATE);
+PARAM1(DATEREFC, PDATE, VT_BYREF|VT_DATE);
+PARAM1(BSTRREF, PBSTR, VT_BYREF|VT_BSTR);
+PARAM1(BSTRREFC, PBSTR, VT_BYREF|VT_BSTR);
+PARAM1(SCODEREF, PSCODE, VT_BYREF|VT_ERROR);
+PARAM1(SCODEREFC, PSCODE, VT_BYREF|VT_ERROR);
+PARAM1(BOOLREF, PBOOL, VT_BYREF|VT_BOOL);
+PARAM1(BOOLREFC, PBOOL, VT_BYREF|VT_BOOL);
+PARAM1(DISPREF, PPDISP, VT_BYREF|VT_DISPATCH);
+
+
+static PARAMDATA rgpdataSTDI2I4R4R8[] = {
+#if VBA2
+ {OLESTR("BVAL"), VT_UI1},
+#endif //VBA2
+ {OLESTR("SVAL"), VT_I2}
+ , {OLESTR("LVAL"), VT_I4}
+ , {OLESTR("FLTVAL"), VT_R4}
+ , {OLESTR("DBLVAL"), VT_R8}
+};
+static PARAMDATA rgpdataALTI2I4R4R8[] = {
+#if VBA2
+ {OLESTR("BVAL"), VT_UI1},
+#endif //VBA2
+ {OLESTR("SVAL"), VT_I2}
+ , {OLESTR("LVAL"), VT_I4}
+ , {OLESTR("FLTVAL"), VT_R4}
+ , {OLESTR("DBLVAL"), VT_R8}
+};
+
+static PARAMDATA rgpdataSTDI2I4R4R8REF[] = {
+#if VBA2
+ {OLESTR("PBVAL"), VT_UI1|VT_BYREF},
+#endif //VBA2
+ {OLESTR("PSVAL"), VT_I2|VT_BYREF}
+ , {OLESTR("PLVAL"), VT_I4|VT_BYREF}
+ , {OLESTR("PFLTVAL"), VT_R4|VT_BYREF}
+ , {OLESTR("PDBLVAL"), VT_R8|VT_BYREF}
+};
+static PARAMDATA rgpdataALTI2I4R4R8REF[] = {
+#if VBA2
+ {OLESTR("PBVAL"), VT_UI1|VT_BYREF},
+#endif //VBA2
+ {OLESTR("PSVAL"), VT_I2|VT_BYREF}
+ , {OLESTR("PLVAL"), VT_I4|VT_BYREF}
+ , {OLESTR("PFLTVAL"), VT_R4|VT_BYREF}
+ , {OLESTR("PDBLVAL"), VT_R8|VT_BYREF}
+};
+
+static PARAMDATA rgpdataSTDALL[] = {
+#if VBA2
+ {OLESTR("BVAL"), VT_UI1},
+#endif //VBA2
+ {OLESTR("SVAL"), VT_I2}
+ , {OLESTR("LVAL"), VT_I4}
+ , {OLESTR("FLTVAL"), VT_R4}
+ , {OLESTR("DBLVAL"), VT_R8}
+ , {OLESTR("CYVAL"), VT_CY}
+ , {OLESTR("DATE"), VT_DATE}
+ , {OLESTR("BSTR"), VT_BSTR}
+ , {OLESTR("SC"), VT_I4} /* NOT VT_ERROR, because we want to allow coersions */
+ , {OLESTR("BOOL"), VT_BOOL}
+};
+static PARAMDATA rgpdataALTALL[] = {
+#if VBA2
+ {OLESTR("BVAL"), VT_UI1},
+#endif //VBA2
+ {OLESTR("SVAL"), VT_I2}
+ , {OLESTR("LVAL"), VT_I4}
+ , {OLESTR("FLTVAL"), VT_R4}
+ , {OLESTR("DBLVAL"), VT_R8}
+ , {OLESTR("CYVAL"), VT_CY}
+ , {OLESTR("DATE"), VT_DATE}
+ , {OLESTR("BSTR"), VT_BSTR}
+ , {OLESTR("SC"), VT_I4} /* NOT VT_ERROR, because we want to allow coersions */
+ , {OLESTR("BOOL"), VT_BOOL}
+};
+
+static PARAMDATA rgpdataSTDALLREF[] = {
+#if VBA2
+ {OLESTR("PBVAL"), VT_BYREF|VT_UI1},
+#endif //VBA2
+ {OLESTR("PSVAL"), VT_BYREF|VT_I2}
+ , {OLESTR("PLVAL"), VT_BYREF|VT_I4}
+ , {OLESTR("PFLTVAL"), VT_BYREF|VT_R4}
+ , {OLESTR("PDBLVAL"), VT_BYREF|VT_R8}
+ , {OLESTR("PCYVAL"), VT_BYREF|VT_CY}
+ , {OLESTR("PDATE"), VT_BYREF|VT_DATE}
+ , {OLESTR("PBSTR"), VT_BYREF|VT_BSTR}
+ , {OLESTR("PSC"), VT_BYREF|VT_ERROR}
+ , {OLESTR("PBOOL"), VT_BYREF|VT_BOOL}
+};
+static PARAMDATA rgpdataALTALLREF[] = {
+#if VBA2
+ {OLESTR("PBVAL"), VT_BYREF|VT_UI1},
+#endif //VBA2
+ {OLESTR("PSVAL"), VT_BYREF|VT_I2}
+ , {OLESTR("PLVAL"), VT_BYREF|VT_I4}
+ , {OLESTR("PFLTVAL"), VT_BYREF|VT_R4}
+ , {OLESTR("PDBLVAL"), VT_BYREF|VT_R8}
+ , {OLESTR("PCYVAL"), VT_BYREF|VT_CY}
+ , {OLESTR("PDATE"), VT_BYREF|VT_DATE}
+ , {OLESTR("PBSTR"), VT_BYREF|VT_BSTR}
+ , {OLESTR("PSC"), VT_BYREF|VT_ERROR}
+ , {OLESTR("PBOOL"), VT_BYREF|VT_BOOL}
+};
+
+
+// Method Info
+//
+METHODDATA rgmethdataCDispTst[] =
+{
+ // CDispTst::Hello()
+ STDMETH0(CDISPTST, HELLO, VT_EMPTY),
+ // CDispTst::HelloC()
+ ALTMETH0(CDISPTST, HELLOC, VT_EMPTY),
+
+#if VBA2
+ // CDispTst::UI1()
+ STDMETH_(CDISPTST, UI1, VT_UI1),
+ // CDispTst::UI1C()
+ ALTMETH_(CDISPTST, UI1C, VT_UI1),
+#endif //VBA2
+
+ // CDispTst::I2()
+ STDMETH_(CDISPTST, I2, VT_I2),
+ // CDispTst::I2C()
+ ALTMETH_(CDISPTST, I2C, VT_I2),
+
+ // CDispTst::I4()
+ STDMETH_(CDISPTST, I4, VT_I4),
+ // CDispTst::I4C()
+ ALTMETH_(CDISPTST, I4C, VT_I4),
+
+ // CDispTst::R4()
+#if !OE_WIN16 // STDMETHOD version of R4 not available on Win16
+ STDMETH_(CDISPTST, R4, VT_R4),
+#endif
+ ALTMETH_(CDISPTST, R4C, VT_R4),
+
+
+ // CDispTst::R8()
+#if !OE_WIN16 // STDMETHOD version of R8 not available on Win16
+ STDMETH_(CDISPTST, R8, VT_R8),
+#endif
+ ALTMETH_(CDISPTST, R8C, VT_R8),
+
+ // CDispTst::Cy()
+ STDMETH_(CDISPTST, CY, VT_CY),
+ // CDispTst::CyC()
+ ALTMETH_(CDISPTST, CYC, VT_CY),
+
+
+ // CDispTst::Date()
+#if !OE_WIN16 // STDMETHOD version of DATE not available on Win16
+ STDMETH_(CDISPTST, DATE, VT_DATE),
+#endif
+ ALTMETH_(CDISPTST, DATEC, VT_DATE),
+
+ // CDispTst::Bstr()
+ STDMETH_(CDISPTST, BSTR, VT_BSTR),
+ // CDispTst::BstrC()
+ ALTMETH_(CDISPTST, BSTRC, VT_BSTR),
+
+ // CDispTst::Scode()
+ STDMETH_(CDISPTST, SCODE, VT_ERROR),
+ // CDispTst::ScodeC()
+ ALTMETH_(CDISPTST, SCODEC, VT_ERROR),
+
+ // CDispTst::Bool()
+ STDMETH_(CDISPTST, BOOL, VT_BOOL),
+ // CDispTst::BoolC()
+ ALTMETH_(CDISPTST, BOOLC, VT_BOOL),
+
+ // CDispTst::Var()
+ STDMETH_(CDISPTST, VAR, VT_VARIANT),
+ // CDispTst::VarC()
+ ALTMETH_(CDISPTST, VARC, VT_VARIANT),
+
+ // CDispTst::NewCDispTst()
+ STDMETH0(CDISPTST, NEWCDISPTST, VT_DISPATCH),
+ // CDispTst::NewCDispTstC()
+ ALTMETH0(CDISPTST, NEWCDISPTSTC, VT_DISPATCH),
+
+ // CDispTst::NewCDispTst2()
+ STDMETH_(CDISPTST, NEWCDISPTST2, VT_DISPATCH),
+ // CDispTst::NewCDispTstC2()
+ ALTMETH_(CDISPTST, NEWCDISPTSTC2, VT_DISPATCH),
+
+#if VBA2
+ // CDispTst::UI1Ref()
+ STDMETH_(CDISPTST, UI1REF, VT_ERROR),
+ // CDispTst::UI1RefC()
+ ALTMETH_(CDISPTST, UI1REFC, VT_ERROR),
+#endif //VBA2
+
+ // CDispTst::I2Ref()
+ STDMETH_(CDISPTST, I2REF, VT_ERROR),
+ // CDispTst::I2RefC()
+ ALTMETH_(CDISPTST, I2REFC, VT_ERROR),
+
+ // CDispTst::I4Ref()
+ STDMETH_(CDISPTST, I4REF, VT_ERROR),
+ // CDispTst::I4RefC()
+ ALTMETH_(CDISPTST, I4REFC, VT_ERROR),
+
+ // CDispTst::R4Ref()
+ STDMETH_(CDISPTST, R4REF, VT_ERROR),
+ // CDispTst::R4RefC()
+ ALTMETH_(CDISPTST, R4REFC, VT_ERROR),
+
+ // CDispTst::R8Ref()
+ STDMETH_(CDISPTST, R8REF, VT_ERROR),
+ // CDispTst::R8RefC()
+ ALTMETH_(CDISPTST, R8REFC, VT_ERROR),
+
+ // CDispTst::CyRef()
+ STDMETH_(CDISPTST, CYREF, VT_ERROR),
+ // CDispTst::CyRefC()
+ ALTMETH_(CDISPTST, CYREFC, VT_ERROR),
+
+ // CDispTst::DateRef()
+ STDMETH_(CDISPTST, DATEREF, VT_ERROR),
+ // CDispTst::DateRefC()
+ ALTMETH_(CDISPTST, DATEREFC, VT_ERROR),
+
+ // CDispTst::BstrRef()
+ STDMETH_(CDISPTST, BSTRREF, VT_ERROR),
+ // CDispTst::BstrRefC()
+ ALTMETH_(CDISPTST, BSTRREFC, VT_ERROR),
+
+ // CDispTst::ScodeRef()
+ STDMETH_(CDISPTST, SCODEREF, VT_ERROR),
+ // CDispTst::ScodeRefC()
+ ALTMETH_(CDISPTST, SCODEREFC, VT_ERROR),
+
+ // CDispTst::BoolRef()
+ STDMETH_(CDISPTST, BOOLREF, VT_ERROR),
+ // CDispTst::BoolRefC()
+ ALTMETH_(CDISPTST, BOOLREFC, VT_ERROR),
+
+ // CDispTst::DispRef()
+ STDMETH_(CDISPTST, DISPREF, VT_ERROR),
+
+ // CDispTst::StdI2I4R4R8()
+ STDMETH_(CDISPTST, STDI2I4R4R8, VT_ERROR),
+ // CDispTst::AltI2I4R4R8()
+ ALTMETH_(CDISPTST, ALTI2I4R4R8, VT_ERROR),
+
+ // CDispTst::StdI2I4R4R8Ref()
+ STDMETH_(CDISPTST, STDI2I4R4R8REF, VT_ERROR),
+ // CDispTst::AltI2I4R4R8Ref()
+ ALTMETH_(CDISPTST, ALTI2I4R4R8REF, VT_ERROR),
+
+ // CDispTst::StdAll()
+ STDMETH_(CDISPTST, STDALL, VT_ERROR),
+ // CDispTst::AltAll()
+ ALTMETH_(CDISPTST, ALTALL, VT_ERROR),
+
+ // CDispTst::StdAllRef()
+ STDMETH_(CDISPTST, STDALLREF, VT_ERROR),
+ // CDispTst::AltAllRef()
+ ALTMETH_(CDISPTST, ALTALLREF, VT_ERROR)
+};
+
+INTERFACEDAT(CDispTst);
+
+
+//---------------------------------------------------------------------
+// CSArray INTERFACEDATA
+//---------------------------------------------------------------------
+
+
+// ParamInfo
+//
+#if VBA2
+PARAM1(UI1SAFEARRAY, PSA, VT_ARRAY|VT_UI1);
+#endif //VBA2
+PARAM1(I2SAFEARRAY, PSA, VT_ARRAY|VT_I2);
+PARAM1(I4SAFEARRAY, PSA, VT_ARRAY|VT_I4);
+PARAM1(R4SAFEARRAY, PSA, VT_ARRAY|VT_R4);
+PARAM1(R8SAFEARRAY, PSA, VT_ARRAY|VT_R8);
+PARAM1(CYSAFEARRAY, PSA, VT_ARRAY|VT_CY);
+PARAM1(DATESAFEARRAY, PSA, VT_ARRAY|VT_DATE);
+PARAM1(BSTRSAFEARRAY, PSA, VT_ARRAY|VT_BSTR);
+PARAM1(SCODESAFEARRAY, PSA, VT_ARRAY|VT_ERROR);
+PARAM1(BOOLSAFEARRAY, PSA, VT_ARRAY|VT_BOOL);
+PARAM1(VARSAFEARRAY, PSA, VT_ARRAY|VT_VARIANT);
+#if VBA2
+PARAM1(UI1SAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_UI1);
+#endif //VBA2
+PARAM1(I2SAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_I2);
+PARAM1(I4SAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_I4);
+PARAM1(R4SAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_R4);
+PARAM1(R8SAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_R8);
+PARAM1(CYSAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_CY);
+PARAM1(DATESAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_DATE);
+PARAM1(BSTRSAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_BSTR);
+PARAM1(SCODESAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_ERROR);
+PARAM1(BOOLSAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_BOOL);
+PARAM1(VARSAFEARRAYREF, PSA, VT_BYREF|VT_ARRAY|VT_VARIANT);
+static PARAMDATA
+rgpdataSAFEARRAYREDIM[] = {
+ {OLESTR("vt"), VT_I2}
+ , {OLESTR("ppsa"), VT_BYREF|VT_ARRAY|VT_VARIANT}
+};
+PARAM1(I2SAFEARRAYRET, VAR, VT_VARIANT);
+
+#if VBA2
+PARAM1(UI1SAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_UI1);
+#endif //VBA2
+PARAM1(I2SAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_I2);
+PARAM1(I4SAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_I4);
+PARAM1(R4SAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_R4);
+PARAM1(R8SAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_R8);
+PARAM1(CYSAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_CY);
+PARAM1(DATESAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_DATE);
+PARAM1(BSTRSAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_BSTR);
+PARAM1(SCODESAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_ERROR);
+PARAM1(BOOLSAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_BOOL);
+PARAM1(VARSAFEARRAYERASE, PSA, VT_BYREF|VT_ARRAY|VT_VARIANT);
+
+#if VBA2
+PARAM1(UI1SAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_UI1);
+#endif //VBA2
+PARAM1(I2SAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_I2);
+PARAM1(I4SAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_I4);
+PARAM1(R4SAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_R4);
+PARAM1(R8SAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_R8);
+PARAM1(CYSAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_CY);
+PARAM1(DATESAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_DATE);
+PARAM1(BSTRSAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_BSTR);
+PARAM1(SCODESAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_ERROR);
+PARAM1(BOOLSAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_BOOL);
+PARAM1(VARSAFEARRAYALLOC, PSA, VT_BYREF|VT_ARRAY|VT_VARIANT);
+
+
+// Method Info
+//
+METHODDATA rgmethdataCSArray[] =
+{
+#if VBA2
+ // CSArray::UI1SafeArray()
+ STDMETH_(CSARRAY, UI1SAFEARRAY, VT_ERROR),
+#endif //VBA2
+
+ // CSArray::I2SafeArray()
+ STDMETH_(CSARRAY, I2SAFEARRAY, VT_ERROR)
+
+ // CSArray::I4SafeArray()
+ , STDMETH_(CSARRAY, I4SAFEARRAY, VT_ERROR)
+
+ // CSArray::R4SafeArray()
+ , STDMETH_(CSARRAY, R4SAFEARRAY, VT_ERROR)
+
+ // CSArray::R8SafeArray()
+ , STDMETH_(CSARRAY, R8SAFEARRAY, VT_ERROR)
+
+ // CSArray::CySafeArray()
+ , STDMETH_(CSARRAY, CYSAFEARRAY, VT_ERROR)
+
+ // CSArray::DateSafeArray()
+ , STDMETH_(CSARRAY, DATESAFEARRAY, VT_ERROR)
+
+ // CSArray::BstrSafeArray()
+ , STDMETH_(CSARRAY, BSTRSAFEARRAY, VT_ERROR)
+
+ // CSArray::ScodeSafeArray()
+ , STDMETH_(CSARRAY, SCODESAFEARRAY, VT_ERROR)
+
+ // CSArray::BoolSafeArray()
+ , STDMETH_(CSARRAY, BOOLSAFEARRAY, VT_ERROR)
+
+ // CSArray::VarSafeArray()
+ , STDMETH_(CSARRAY, VARSAFEARRAY, VT_ERROR)
+
+#if VBA2
+ // CSArray::UI1SafeArrayRef()
+ , STDMETH_(CSARRAY, UI1SAFEARRAYREF, VT_ERROR)
+#endif //VBA2
+
+ // CSArray::I2SafeArrayRef()
+ , STDMETH_(CSARRAY, I2SAFEARRAYREF, VT_ERROR)
+
+ // CSArray::I4SafeArrayRef()
+ , STDMETH_(CSARRAY, I4SAFEARRAYREF, VT_ERROR)
+
+ // CSArray::R4SafeArrayRef()
+ , STDMETH_(CSARRAY, R4SAFEARRAYREF, VT_ERROR)
+
+ // CSArray::R8SafeArrayRef()
+ , STDMETH_(CSARRAY, R8SAFEARRAYREF, VT_ERROR)
+
+ // CSArray::CySafeArrayRef()
+ , STDMETH_(CSARRAY, CYSAFEARRAYREF, VT_ERROR)
+
+ // CSArray::DateSafeArrayRef()
+ , STDMETH_(CSARRAY, DATESAFEARRAYREF, VT_ERROR)
+
+ // CSArray::BstrSafeArrayRef()
+ , STDMETH_(CSARRAY, BSTRSAFEARRAYREF, VT_ERROR)
+
+ // CSArray::ScodeSafeArrayRef()
+ , STDMETH_(CSARRAY, SCODESAFEARRAYREF, VT_ERROR)
+
+ // CSArray::BoolSafeArrayRef()
+ , STDMETH_(CSARRAY, BOOLSAFEARRAYREF, VT_ERROR)
+
+ // CSArray::VarSafeArrayRef()
+ , STDMETH_(CSARRAY, VARSAFEARRAYREF, VT_ERROR)
+
+ // CSArray::SafeArrayReDim()
+ , STDMETH_(CSARRAY, SAFEARRAYREDIM, VT_ERROR)
+
+ // CSArray::I2SafeArrayRet()
+ , STDMETH_(CSARRAY, I2SAFEARRAYRET, VT_ARRAY|VT_I2)
+
+
+#if VBA2
+ // CSArray::UI1SafeArrayRef()
+ , STDMETH_(CSARRAY, UI1SAFEARRAYERASE, VT_ERROR)
+#endif //VBA2
+
+ // CSArray::I2SafeArrayRef()
+ , STDMETH_(CSARRAY, I2SAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::I4SafeArrayRef()
+ , STDMETH_(CSARRAY, I4SAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::R4SafeArrayRef()
+ , STDMETH_(CSARRAY, R4SAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::R8SafeArrayRef()
+ , STDMETH_(CSARRAY, R8SAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::CySafeArrayRef()
+ , STDMETH_(CSARRAY, CYSAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::DateSafeArrayRef()
+ , STDMETH_(CSARRAY, DATESAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::BstrSafeArrayRef()
+ , STDMETH_(CSARRAY, BSTRSAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::ScodeSafeArrayRef()
+ , STDMETH_(CSARRAY, SCODESAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::BoolSafeArrayRef()
+ , STDMETH_(CSARRAY, BOOLSAFEARRAYERASE, VT_ERROR)
+
+ // CSArray::VarSafeArrayRef()
+ , STDMETH_(CSARRAY, VARSAFEARRAYERASE, VT_ERROR)
+
+
+#if VBA2
+ // CSArray::UI1SafeArrayRef()
+ , STDMETH_(CSARRAY, UI1SAFEARRAYALLOC, VT_ERROR)
+#endif //VBA2
+
+ // CSArray::I2SafeArrayRef()
+ , STDMETH_(CSARRAY, I2SAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::I4SafeArrayRef()
+ , STDMETH_(CSARRAY, I4SAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::R4SafeArrayRef()
+ , STDMETH_(CSARRAY, R4SAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::R8SafeArrayRef()
+ , STDMETH_(CSARRAY, R8SAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::CySafeArrayRef()
+ , STDMETH_(CSARRAY, CYSAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::DateSafeArrayRef()
+ , STDMETH_(CSARRAY, DATESAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::BstrSafeArrayRef()
+ , STDMETH_(CSARRAY, BSTRSAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::ScodeSafeArrayRef()
+ , STDMETH_(CSARRAY, SCODESAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::BoolSafeArrayRef()
+ , STDMETH_(CSARRAY, BOOLSAFEARRAYALLOC, VT_ERROR)
+
+ // CSArray::VarSafeArrayRef()
+ , STDMETH_(CSARRAY, VARSAFEARRAYALLOC, VT_ERROR)
+
+};
+
+INTERFACEDAT(CSArray);
+
+
+
+//---------------------------------------------------------------------
+// CExcepinfo INTERFACEDATA
+//---------------------------------------------------------------------
+
+
+METHODDATA rgmethdataCExcepinfo[] =
+{
+ // CExcepinfo::Excep0()
+ STDMETH0(CEXCEPINFO, EXCEPINFO0, VT_ERROR),
+
+ // CExcepinfo::Excep1()
+ STDMETH0(CEXCEPINFO, EXCEPINFO1, VT_ERROR),
+
+ // CExcepinfo::Excep2()
+ STDMETH0(CEXCEPINFO, EXCEPINFO2, VT_ERROR),
+};
+
+
+INTERFACEDAT(CExcepinfo);
+
+
+
+//---------------------------------------------------------------------
+// CAppObject INTERFACEDATA
+//---------------------------------------------------------------------
+
+PARAM1(NEWCSARRAY, PPDISP, VT_BYREF|VT_DISPATCH);
+PARAM1(NEWCDISPTST, PPDISP, VT_BYREF|VT_DISPATCH);
+PARAM1(NEWCEXCEPINFO, PPDISP, VT_BYREF|VT_DISPATCH);
+
+METHODDATA rgmethdataCAppObject[] =
+{
+ // CAppObject::NewCDispTest()
+ STDMETH_(CAPPOBJECT, NEWCDISPTST, VT_ERROR),
+
+ // CAppObject::NewCExcepinfo()
+ STDMETH_(CAPPOBJECT, NEWCEXCEPINFO, VT_ERROR),
+
+ // CAppObject::NewCSArray()
+ STDMETH_(CAPPOBJECT, NEWCSARRAY, VT_ERROR),
+};
+
+
+INTERFACEDAT(CAppObject);
diff --git a/private/oleauto/tests/sdisptst/tinfo.c b/private/oleauto/tests/sdisptst/tinfo.c
new file mode 100644
index 000000000..9601c901e
--- /dev/null
+++ b/private/oleauto/tests/sdisptst/tinfo.c
@@ -0,0 +1,13 @@
+//
+// this file exists simply to detect if mktyplib generated a correct header
+//
+// NOTE: we dont actually include this header anywhere real.
+//
+
+#include <windows.h>
+#include <ole2.h>
+#include <dispatch.h>
+
+#define CURRENCY CY
+
+#include "tinfo.h"
diff --git a/private/oleauto/tools/win16/hdos/bin/ml.err b/private/oleauto/tools/win16/hdos/bin/ml.err
new file mode 100644
index 000000000..7b3386fb3
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/bin/ml.err
@@ -0,0 +1,259 @@
+FATAL
+cannot open file
+I/O error closing file
+I/O error writing file
+I/O error reading file
+out of far memory
+assembler limit : macro parameter name table full
+invalid command-line option
+nesting level too deep
+unmatched macro nesting
+line too long
+unmatched block nesting
+directive must be in control block
+error count exceeds 100; stopping assembly
+invalid numerical command-line argument
+too many arguments
+statement too complex
+N/A
+missing source filename
+SEVERE
+memory operand not allowed in context
+immediate operand not allowed
+cannot have more than one ELSE clause per IF block
+extra characters after statement
+symbol type conflict
+symbol redefinition
+undefined symbol
+non-benign record redefinition
+syntax error
+syntax error in expression
+invalid type expression
+distance invalid for word size of current segment
+PROC, MACRO, or macro repeat directive must precede LOCAL
+.MODEL must precede this directive
+cannot define as public or external
+segment attributes cannot change
+expression expected
+operator expected
+invalid use of external symbol
+operand must be RECORD type or field
+identifier not a record
+record constants may not span line breaks
+instruction operands must be the same size
+instruction operand must have size
+invalid operand size for instruction
+operands must be in same segment
+constant expected
+operand must be a memory expression
+expression must be a code address
+multiple base registers not allowed
+multiple index registers not allowed
+must be index or base register
+invalid use of register
+invalid INVOKE argument
+must be in segment block
+DUP too complex
+too many initial values for structure
+statement not allowed inside structure definition
+missing operand for macro operator
+line too long
+segment register not allowed in context
+string or text literal too long
+statement too complex
+identifier too long
+invalid character in file
+missing angle bracket or brace in literal
+missing single or double quotation mark in string
+empty (null) string
+nondigit in number
+syntax error in floating-point constant
+real or BCD number not allowed
+text item required
+forced error
+forced error : value equal to 0
+forced error : value not equal to 0
+forced error : symbol not defined
+forced error : symbol defined
+forced error : string blank
+forced error : string not blank
+forced error : strings equal
+forced error : strings not equal
+[ELSE]IF2/.ERR2 not allowed : single-pass assembler
+expression too complex for .UNTILCXZ
+can ALIGN only to power of 2
+structure alignment must be 1, 2, or 4
+expected
+incompatable CPU mode and segment size
+LOCK must be followed by a memory operation
+instruction prefix not allowed
+no operands allowed for this instruction
+invalid instruction operands
+initializer magnitude too large for specified size
+cannot access symbol in given segment or group
+operands have different frames
+cannot access label through segment registers
+jump destination too far
+jump destination must specify a label
+instruction does not allow NEAR indirect addressing
+instruction does not allow FAR indirect addressing
+instruction does not allow FAR direct addressing
+jump distance not possible in current CPU mode
+missing operand after unary operator
+cannot mix 16- and 32-bit registers
+invalid scale value
+constant value too large
+instruction or register not accepted in current CPU mode
+reserved word expected
+instruction form requires 80386/486
+END directive required at end of file
+too many bits in RECORD
+positive value expected
+index value past end of string
+count must be positive or zero
+count value too large
+operand must be relocatable
+constant or relocatable label expected
+segment, group, or segment register expected
+segment expected
+invalid operand for OFFSET
+invalid use of external absolute
+segment or group not allowed
+cannot add two relocatable labels
+cannot add memory expression and code label
+segment exceeds 64K limit
+invalid type for a data declaration
+HIGH and LOW require immediate operands
+N/A
+cannot have implicit far jump or call to near label
+use of register assumed to ERROR
+only white space or comment can follow backslash
+COMMENT delimiter expected
+conflicting parameter definition
+PROC and prototype calling conventions conflict
+invalid radix tag
+INVOKE argument type mismatch : argument
+invalid coprocessor register
+instructions and initialized data not allowed in AT segments
+/AT switch requires the TINY memory model
+cannot have segment address references with TINY model
+language type must be specified
+PROLOGUE must be macro function
+EPILOGUE must be macro procedure
+alternate identifier not allowed with EXTERNDEF
+text macro nesting level too deep
+N/A
+missing macro argument
+EXITM used inconsistently
+macro function argument list too long
+N/A
+VARARG parameter must be last parameter
+VARARG parameter not allowed with LOCAL
+VARARG parameter requires C calling convention
+ORG needs a constant or local offset
+register value overwritten by INVOKE
+structure too large to pass with INVOKE : argument
+not overriding private proc as public
+too many arguments to INVOKE
+too few arguments to INVOKE
+invalid data initializer
+N/A
+RET operand too large
+too many operands to instruction
+cannot have more than one .ELSE clause per .IF block
+expected data label
+cannot nest procedures
+EXPORT must be FAR
+procedure declared with two visibility attributes
+macro label not defined
+invalid symbol type in expression
+byte register cannot be first operand
+word register cannot be first operand
+special register cannot be first operand
+coprocessor register cannot be first operand
+cannot change size of expression computations
+syntax error in control-flow directive
+cannot use 16-bit register with a 32-bit address
+constant value out of range
+missing right parenthesis
+type is wrong size for register
+structure cannot be instanced
+non-benign structure redefinition: label incorrect
+non-benign structure redefinition: too few labels
+OLDSTRUCTS/NOOLDSTRUCTS state cannot be changed
+non-benign structure redefinition: incorrect initializers
+non-benign structure redefinition: too few initializers
+non-benign structure redefinition: label has incorrect offset
+structure field expected
+unexpected literal found in expression
+N/A
+divide by zero in expression
+directive must appear inside a macro
+cannot expand macro function
+too few bits in RECORD
+macro function cannot redefine itself
+N/A
+invalid qualified type
+floating-point initializer on an integer variable
+nested structure improperly initialized
+invalid use of FLAT
+structure improperly initialized
+improper list initialization
+initializer must be a string or single item
+initializer must be a single item
+initializer must be a single byte
+improper use of list initializer
+improper literal initialization
+extra characters in literal initialization
+must use floating-point initializer
+cannot use .EXIT for OS_OS2 with .8086
+invalid combination with segment alignment
+INVOKE requires prototype for procedure
+cannot include structure in self
+symbol language attribute conflict
+non-benign COMM redefinition
+COMM variable exceeds 64K
+parameter or local cannot have void type
+cannot use TINY model with OS_OS2
+expression size must be 32 bits
+.EXIT does not work with 32-bit segments
+.STARTUP does not work with 32-bit segments
+ORG directive not allowed in unions
+D/T
+illegal use of segment register
+cannot declare scoped code label as PUBLIC
+.MSFLOAT directive is obsolete : .MSFLOAT ignored
+ESC instruction is obsolete : ESC ignored
+missing operator in expression
+missing right parenthesis in expression
+missing left parenthesis in expression
+reference to forward macro definition
+LEVEL 1
+cannot modify READONLY segment
+N/A
+non-unique STRUCT/UNION field used without qualification
+start address on END directive ignored with .STARTUP
+cannot ASSUME CS
+unknown default prologue argument
+too many arguments in macro call
+option untranslated, directive required
+invalid command-line option value, default is used
+insufficent memory for /EP : /EP ignored
+expected '>' on text literal
+multiple .MODEL directives found : .MODEL ignored
+line number information for segment without class 'CODE'
+instructions and initialized data not supported in AT segments
+LEVEL 2
+@@: label defined but not referenced
+expression expected, assume value 0
+EXTERNDEF previously assumed to be external
+length of symbol previously assumed to be different
+symbol previously assumed to not be in a group
+types are different
+LEVEL 3
+N/A
+no return from procedure
+N/A
+conditional jump lengthened
+procedure argument or local not referenced
+expression may be pass-dependent
diff --git a/private/oleauto/tools/win16/hdos/bin/rcpp.err b/private/oleauto/tools/win16/hdos/bin/rcpp.err
new file mode 100644
index 000000000..d26c8494d
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/bin/rcpp.err
@@ -0,0 +1,334 @@
+/* SCCSWHAT( "@(#)c1.err 2.29 88/02/25 18:18:00 " ) */
+ /* fatals */
+
+1001 "Internal Compiler Error\n\t\t(compiler file '%s', line %d)\n\t\tContact Microsoft Technical Support"
+1002 "out of heap space"
+1003 "error count exceeds %d; stopping compilation"
+1004 "unexpected EOF"
+1005 "string too big for buffer"
+1006 "write error on compiler intermediate file"
+1007 "unrecognized flag '%s' in '%s'"
+1008 "no input file specified"
+1009 "compiler limit : macros too deeply nested"
+1010 "compiler limit : macro expansion too big"
+1012 "bad parenthesis nesting - missing '%c'"
+1013 "cannot open source file '%s'"
+1014 "too many include files"
+1015 "cannot open include file '%s'"
+1016 "#if[n]def expected an identifier"
+1017 "invalid integer constant expression"
+1018 "unexpected '#elif'"
+1019 "unexpected '#else'"
+1020 "unexpected '#endif'"
+1021 "bad preprocessor command '%s'"
+1022 "expected '#endif'"
+1023 "no int size specified"
+1024 "no ptr size specified"
+1025 "no function size specified"
+1026 "parser stack overflow, please simplify your program"
+1027 "DGROUP data allocation exceeds 64K" /* QC, c23 */
+1028 "%s segment allocation exceeds 64K" /* QC */
+1031 "compiler limit : function calls too deeply nested" /* QC, c23 */
+1032 "cannot open object listing file '%s'" /* QC, c23 */
+1035 "expression too complex, please simplify" /* QC, c23 */
+1037 "cannot open object file '%s'" /* QC, c23 */
+1041 "cannot open compiler intermediate file - no more files"
+1042 "cannot open compiler intermediate file - no such file or directory"
+1043 "cannot open compiler intermediate file"
+1044 "out of disk space for compiler intermediate file"
+1045 "floating point overflow"
+1047 "too many %s flags, '%s'"
+1048 "unknown option '%c' in '%s'"
+1049 "invalid numerical argument '%s'"
+1052 "too many #if/#ifdef's"
+1053 "compiler limit : struct/union nesting"
+1054 "compiler limit : initializers too deeply nested"
+1055 "compiler limit : out of keys"
+1056 "compiler limit : out of macro expansion space"
+1057 "unexpected EOF in macro expansion (missing ')'?)"
+1059 "out of near heap space"
+1060 "out of far heap space"
+1061 "compiler limit : blocks too deeply nested" /* QC */
+1062 "error writing to preprocessor output file"
+1063 "compiler limit : compiler stack overflow" /* QC */
+1064 "compiler limit : identifier overflowed internal buffer"
+1065 "compiler limit : declarator too complex"
+1000 "UNKNOWN FATAL ERROR\n\t\tContact Microsoft Technical Support"
+
+ /* errors */
+
+2001 "newline in constant"
+2002 "out of macro actual parameter space"
+2003 "expected 'defined id'"
+2004 "expected 'defined(id)'"
+2005 "#line expected a line number, found '%s'"
+2006 "#include expected a file name, found '%s'"
+2007 "#define syntax"
+2008 "'%c' : unexpected in macro definition"
+2009 "reuse of macro formal '%s'"
+2010 "'%c' : unexpected in formal list"
+2011 "'%s' : definition too big"
+2012 "missing name following '<'"
+2013 "missing '>'"
+2014 "preprocessor command must start as first non-whitespace"
+2015 "too many chars in constant"
+2016 "no closing single quote"
+2017 "illegal escape sequence"
+2018 "unknown character '0x%x'"
+2019 "expected preprocessor command, found '%c'"
+2020 "bad octal number '%c'"
+2021 "expected exponent value, not '%c'"
+2022 "'%ld' : too big for char"
+2023 "divide by 0"
+2024 "mod by 0"
+2025 "'%s' : enum/struct/union type redefinition"
+2026 "'%s' : member of enum redefinition"
+2028 "struct/union member needs to be inside a struct/union"
+2029 "'%Fs' : bit-fields only allowed in structs"
+2030 "'%Fs' : struct/union member redefinition"
+2031 "'%Fs' : function cannot be struct/union member"
+2032 "'%Fs' : base type with near/far/huge not allowed"
+2033 "'%Fs' : bit-field cannot have indirection"
+2034 "'%Fs' : bit-field type too small for number of bits"
+2035 "enum/struct/union '%Fs' : unknown size"
+2036 "left of '%s%s' must have a struct/union type"
+2037 "left of '%s' specifies undefined struct/union '%Fs'"
+2038 "'%s' : not struct/union member"
+2039 "'->' requires struct/union pointer"
+2040 "'.' requires struct/union name"
+2042 "signed/unsigned keywords mutually exclusive"
+2043 "illegal break"
+2044 "illegal continue"
+2045 "'%s' : label redefined"
+2046 "illegal case"
+2047 "illegal default"
+2048 "more than one default"
+2050 "non-integral switch expression"
+2051 "case expression not constant"
+2052 "case expression not integral"
+2053 "case value %d already used"
+2054 "expected '(' to follow '%Fs'"
+2055 "expected formal parameter list, not a type list"
+2056 "illegal expression"
+2057 "expected constant expression"
+2058 "constant expression is not integral"
+2059 "syntax error : '%s'"
+2060 "syntax error : EOF"
+2061 "syntax error : identifier '%s'"
+2062 "type '%s' unexpected"
+2063 "'%s' : not a function"
+2064 "term does not evaluate to a function"
+2065 "'%s' : undefined"
+2066 "cast to function returning . . . is illegal"
+2067 "cast to array type is illegal"
+2068 "illegal cast"
+2069 "cast of 'void' term to non-void"
+2070 "illegal sizeof operand"
+2071 "'%Fs' : bad storage class"
+2072 "'%Fs' : initialization of a function"
+2073 "'%Fs' : cannot initialize array in function"
+2074 "'%Fs' : cannot initialize struct/union in function"
+2075 "'%Fs' : array initialization needs curly braces"
+2076 "'%Fs' : struct/union initialization needs curly braces"
+2077 "non-integral field initializer '%Fs'"
+2078 "too many initializers"
+2079 "'%Fs' uses undefined struct/union '%Fs'"
+2082 "redefinition of formal parameter '%Fs'"
+2083 "array '%Fs' already has a size"
+2084 "function '%Fs' already has a body"
+2085 "'%Fs' : not in formal parameter list"
+2086 "'%Fs' : redefinition"
+2087 "'%Fs' : missing subscript"
+2088 "use of undefined enum/struct/union '%s'"
+2089 "typedef specifies a near/far function"
+2090 "function returns array"
+2091 "function returns function"
+2092 "array element type cannot be function"
+2093 "cannot initialize a static or struct with address of automatic vars"
+2094 "label '%Fs' was undefined"
+2095 "'%Fs' : actual has type void : parameter %d"
+2096 "struct/union comparison illegal"
+2097 "illegal initialization"
+2098 "non-address expression"
+2099 "non-constant offset"
+2100 "illegal indirection"
+2101 "'&' on constant"
+2102 "'&' requires lvalue"
+2103 "'&' on register variable"
+2104 "'&' on bit-field ignored"
+2105 "'%s' needs lvalue"
+2106 "'%s' : left operand must be lvalue"
+2107 "illegal index, indirection not allowed"
+2108 "non-integral index"
+2109 "subscript on non-array"
+2110 "'+' : 2 pointers"
+2111 "pointer + non-integral value"
+2112 "illegal pointer subtraction"
+2113 "'-' : right operand pointer"
+2114 "'%s' : pointer on left; needs integral right"
+2115 "'%s' : incompatible types"
+2116 "'%s' : bad %s operand"
+2117 "'%s' : illegal for struct/union"
+2118 "negative subscript"
+2119 "'typedefs' both define indirection"
+2120 "'void' illegal with all types"
+2121 "typedef specifies different enum"
+2122 "typedef specifies different struct"
+2123 "typedef specifies different union"
+2125 "%Fs : allocation exceeds 64K" /* QC, c23 */
+2126 "%Fs : auto allocation exceeds %s" /* QC, c23 */
+2127 "parameter allocation exceeds 32K" /* QC, c23 */
+2130 "#line expected a string containing the file name, found '%s'"
+2131 "attributes specify more than one near/far/huge"
+2132 "syntax error : unexpected identifier"
+2133 "array '%Fs' : unknown size"
+2134 "'%Fs' : struct/union too large"
+2135 "missing ')' in macro expansion"
+2137 "empty character constant"
+2138 "unmatched close comment '*/'"
+2139 "type following '%s' is illegal"
+2140 "argument type cannot be function returning . . ."
+2141 "value out of range for enum constant"
+2142 "ellipsis requires three periods"
+2143 "syntax error : missing '%s' before '%s'"
+2144 "syntax error : missing '%s' before type '%Fs'"
+2145 "syntax error : missing '%s' before identifier"
+2146 "syntax error : missing '%s' before identifier '%s'"
+2147 "unknown size"
+2148 "array too large"
+2149 "'%Fs' : named bit-field cannot have 0 width"
+2150 "'%Fs' : bit-field must have type int, signed int, or unsigned int"
+2151 "more than one cdecl/fortran/pascal attribute specified"
+2152 "'%s' : pointers to functions with different attributes"
+2153 "hex constants must have at least 1 hex digit"
+2154 "'%s' : does not refer to a segment"
+2155 "'%s' : already in a segment"
+2156 "pragma must be at outer level"
+2157 "'%s' : must be declared before use in pragma list"
+2158 "'%s' : is a function"
+2159 "more than one storage class specified"
+2160 "## cannot occur at the beginning of a macro definition"
+2161 "## cannot occur at the end of a macro definition"
+2162 "expected macro formal parameter"
+2163 "'%s' : not available as an intrinsic"
+2164 "'%s' : intrinsic was not declared"
+2165 "'%s' : cannot modify pointers to data"
+2166 "lval specifies 'const' object"
+2167 "'%Fs' : too many actual parameters for intrinsic"
+2168 "'%Fs' : too few actual parameters for intrinsic"
+2169 "'%Fs' : is an intrinsic, it cannot be defined"
+2170 "'%s' : intrinsic not declared as a function"
+2171 "'%s' : bad operand"
+2172 "'%Fs' : actual is not a pointer : parameter %d"
+2173 "'%Fs' : actual is not a pointer : parameter %d, parameter list %d"
+2174 "'%Fs' : actual has type void : parameter %d, parameter list %d"
+2175 "'%Fs' : unresolved external" /* QC */
+2176 "static far data not supported" /* QC */
+2177 "constant too big"
+2178 "'%s' : storage class for same_seg variables must be 'extern'"
+2179 "'%Fs' : was used in same_seg, but storage class is no longer 'extern'"
+2180 "controlling expression has type 'void'"
+2181 "pragma requires command line option '%s'" /* QC */
+2182 "'%Fs' : 'void' on variable"
+2183 "'%Fs' : 'interrupt' function must be 'far'"
+2184 "'%Fs' : '%s' function cannot be 'pascal/fortran'"
+2186 "'%Fs' : 'saveregs/interrupt' modifiers mutually exclusive"
+2187 "cast of near function pointer to far function pointer"
+2188 "#error : %s"
+2190 "'%s' : is a text segment"
+2191 "'%s' : is a data segment"
+2192 "'%s' : function has already been defined"
+2000 "UNKNOWN ERROR\n\t\tContact Microsoft Technical Support"
+
+ /* warnings */
+
+4001 "macro '%s' requires parameters"
+4002 "too many actual parameters for macro '%s'"
+4003 "not enough actual parameters for macro '%s'"
+4004 "missing close parenthesis after 'defined'"
+4005 "'%s' : redefinition"
+4006 "#undef expected an identifier"
+4009 "string too big, trailing chars truncated"
+4011 "identifier truncated to '%s'"
+4012 "float constant in a cross compilation"
+4013 "constant too big"
+4014 "'%Fs' : bit-field type must be unsigned"
+4015 "'%Fs' : bit-field type must be integral"
+4016 "'%s' : no function return type, using 'int' as default"
+4017 "cast of int expression to far pointer"
+4020 "'%Fs' : too many actual parameters"
+4021 "'%Fs' : too few actual parameters"
+4022 "'%Fs' : pointer mismatch : parameter %d"
+4024 "'%Fs' : different types : parameter %d"
+4025 "function declaration specified variable argument list"
+4026 "function was declared with formal argument list"
+4027 "function was declared without formal argument list"
+4028 "parameter %d declaration different"
+4029 "declared parameter list different from definition"
+4030 "first parameter list is longer than the second"
+4031 "second parameter list is longer than the first"
+4032 "unnamed struct/union as parameter"
+4033 "function must return a value"
+4034 "sizeof returns 0"
+4035 "'%Fs' : no return value"
+4036 "unexpected formal parameter list"
+4037 "'%Fs' : formal parameters ignored"
+4038 "'%Fs' : formal parameter has bad storage class"
+4039 "'%Fs' : function used as an argument"
+4040 "near/far/huge on '%Fs' ignored"
+4041 "formal parameter '%s' is redefined"
+4042 "'%Fs' : has bad storage class"
+4044 "huge on '%Fs' ignored, must be an array"
+4045 "'%s' : array bounds overflow"
+4046 "'&' on function/array, ignored"
+4047 "'%s' : different levels of indirection"
+4048 "array's declared subscripts different"
+4049 "'%s' : indirection to different types"
+4051 "data conversion"
+4052 "different enum types"
+4053 "at least one void operand"
+4060 "conversion of long address to short address" /* QC, c23 */
+4061 "long/short mismatch in argument : conversion supplied" /* QC, c23 */
+4062 "near/far mismatch in argument : conversion supplied" /* QC, c23 */
+4067 "unexpected characters following '%s' directive - newline expected"
+4068 "unknown pragma"
+4071 "'%Fs' : no function prototype given"
+4074 "non standard extension used - '%s'"
+4075 "size of switch expression or case constant too large - converted to int"
+4076 "'%s' : may be used on integral types only"
+4077 "unknown check_stack option"
+4079 "unexpected token '%s'"
+4080 "expected 'identifier' for segment name, found '%s'"
+4081 "expected a comma, found '%s'"
+4082 "expected an identifier, found '%s'"
+4083 "expected '(', found '%s'"
+4084 "expected a pragma keyword, found '%s'"
+4085 "expected [on | off]"
+4086 "expected [1 | 2 | 4]"
+4087 "'%Fs' : declared with 'void' parameter list"
+4088 "'%Fs' : pointer mismatch : parameter %d, parameter list %d"
+4089 "'%Fs' : different types : parameter %d, parameter list %d"
+4090 "different 'const' attributes"
+4091 "no symbols were declared"
+4092 "untagged enum/struct/union declared no symbols"
+4093 "unescaped newline in character constant in non-active code"
+4094 "unexpected newline"
+4095 "expected ')', found '%s'"
+4096 "huge treated as far" /* QC */
+4098 "void function returning a value"
+4099 "expected ')', (too many arguments?)"
+4100 "'%Fs' : unreferenced formal parameter"
+4101 "'%Fs' : unreferenced local variable"
+4102 "'%Fs' : unreferenced label"
+4103 "'%Fs' : function definition used as prototype"
+4104 "'%s' : near data in same_seg pragma, ignored"
+4105 "'%Fs' : code modifiers only on function or pointer to function"
+4106 "pragma requires integer between 1 and 127"
+4107 "pragma requires integer between 15 and 255"
+4108 "pragma requires integer between 79 and 132"
+4109 "unexpected identifier '%s'"
+4110 "unexpected token 'int constant'"
+4111 "unexpected token 'string'"
+4112 "macro name '%s' is reserved, %s ignored"
+4113 "function parameter lists differed"
+4000 "UNKNOWN WARNING\n\t\tContact Microsoft Technical Support"
diff --git a/private/oleauto/tools/win16/hdos/c800/bin/c1.err b/private/oleauto/tools/win16/hdos/c800/bin/c1.err
new file mode 100644
index 000000000..fa4b34783
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/bin/c1.err
@@ -0,0 +1,1088 @@
+/* SCCSWHAT( "@(#)c1.err 3.56 89/12/06 13:43:09 " ) */
+ /* warnings */
+
+4001 "nonstandard extension 'single line comment' was used"
+4002 "too many actual parameters for macro '%s'"
+4003 "not enough actual parameters for macro '%s'"
+4004 "incorrect construction after 'defined'"
+4005 "'%Fs' : macro redefinition"
+4006 "#undef expected an identifier"
+4007 "'%Fs' : must be '%Fs'"
+4008 "'%Fs' : '%Fs' attribute ignored"
+4009 "string too big; trailing characters truncated"
+4010 "single-line comment contains line-continuation character"
+4011 "'%Fs' : identifier was truncated to '%d' characters"
+4012 "float constant in a cross compilation" /* XC */
+4013 "'%Fs' undefined; assuming extern returning int"
+4014 "concatenating mismatched wide strings"
+4015 "'%Fs' : type of bit field must be integral"
+4016 "'%s' : no function return type; using 'int' as default" /* C6 */
+4017 "cast of 'int' expression to far pointer"
+4018 "'%Fs' : signed/unsigned mismatch"
+4019 "empty statement at global scope"
+4020 "'%Fs' : too many actual parameters"
+4021 "'%Fs' : too few actual parameters"
+4022 "'%Fs' : pointer mismatch for actual parameter %d"
+4023 "'%Fs' : based pointer passed to unprototyped function : parameter %d"
+4024 "'%Fs' : different types for formal and actual parameter %d"
+4025 "'%Fs' : based pointer passed to function with variable arguments: parameter %d"
+4026 "function declared with formal parameter list"
+4027 "function declared without formal parameter list"
+4028 "formal parameter %d different from declaration"
+4029 "declared formal parameter list different from definition"
+4030 "first formal parameter list longer than the second list"
+4031 "second formal parameter list longer than the first list"
+4032 "formal parameter %d has different type when promoted"
+4033 "'%Fs' must return a value"
+4034 "sizeof returns 0"
+4035 "'%Fs' : no return value"
+4036 "unnamed %Fs as actual parameter"
+4037 "conflicting ambient class modifiers"
+4038 "'%Fs' : illegal ambient class modifier"
+4039 "ambient class modifier on reference ignored"
+4040 "memory attribute on '%Fs' ignored"
+4041 "compiler limit : terminating browser output"
+4042 "'%Fs' : has bad storage class"
+4043 "function specifier used more than once"
+4044 "specifier __huge on '%Fs' ignored; can only be applied to array"
+4045 "'%Fs' : array bounds overflow"
+4046 "'%Fs' : unsized array treated as %Fs"
+4047 "'%Fs' : different levels of indirection"
+4048 "different declared array subscripts"
+4049 "'%Fs' : indirection to different types"
+4050 "'%Fs' : different code attributes"
+4051 "type conversion; possible loss of data"
+4052 "function declarations different; one contains variable arguments"
+4053 "one void operand for '?:'"
+4054 "'%Fs' : from function pointer '%Fs' to data pointer '%Fs'"
+4055 "'%Fs' : from data pointer '%Fs' to function pointer '%Fs'"
+4056 "overflow in floating-point constant arithmetic"
+4057 "'%Fs' : indirection to slightly different base types"
+4058 "unions are now aligned on alignment requirement, not size"
+4059 "pascal string too big, length byte is length % 256"
+
+4060 "switch statement contains no 'case' or 'default' labels"
+4061 "enumerate '%Fs' in switch of enum '%Fs' is not explicitly handled by a case label"
+4062 "enumerate '%Fs' in switch of enum '%Fs' is not handled"
+4063 "case '%ld' is not a valid value for switch of enum '%Fs'"
+4064 "switch of incomplete enum '%Fs'"
+4065 "switch statement contains 'default' but no 'case' labels"
+
+4067 "unexpected characters following '%Fs' directive - newline expected"
+4068 "unknown pragma"
+4069 "long double is the same precision as double"
+4070 "return of a 'void' expression"
+4071 "'%Fs' : no function prototype given"
+4072 "'%Fs' : no function prototype on __fastcall function"
+4073 "initializers put in library initialization area"
+4074 "initializers put in compiler reserved initialization area"
+4075 "initializers put in unrecognized initialization area"
+4076 "'%Fs' : can be used on integral types only"
+4077 "unknown check_stack option"
+4078 "case constant '%ld' too big for the type of the switch expression"
+4079 "unexpected token '%Fs'"
+4080 "expected identifier for segment name; found '%Fs'"
+4081 "expected a comma; found '%Fs'"
+4082 "expected an identifier; found '%Fs'"
+4083 "expected '('; found '%Fs'"
+4084 "expected a pragma directive; found '%Fs'"
+4085 "expected pragma parameter to be 'on' or 'off'"
+4086 "expected pragma parameter to be '1', '2', '4', '8', or '16'"
+4087 "'%Fs' : declared with 'void' parameter list"
+4088 "'%Fs' : pointer mismatch in actual parameter %d, formal parameter %d"
+4089 "'%Fs' : different types in actual parameter %d, formal parameter %d"
+4090 "'%Fs' : different const or volatile qualifiers"
+4091 "no symbols were declared"
+4092 "sizeof returns 'unsigned long'"
+4093 "unescaped newline in character constant in inactive code"
+4094 "untagged '%Fs' declared no symbols"
+4095 "expected ')'; found '%Fs'"
+4096 "'%Fs' must be used with '%Fs'"
+4097 "nonstandard extension : typedef-name '%Fs' used as synonym for class-name '%Fs'"
+4098 "'%Fs' : 'void' function returning a value"
+4099 "'%Fs' : type name first seen using '%Fs' now seen using '%Fs'"
+4100 "'%Fs' : unreferenced formal parameter"
+4101 "'%Fs' : unreferenced local variable"
+4102 "'%Fs' : unreferenced label"
+4103 "'%Fs' : used #pragma pack to change alignment"
+4104 "'%Fs' : near data in same_seg pragma; ignored"
+4105 "'%Fs' : code modifiers only on function or pointer to function"
+4106 "pragma requires an integer between 1 and 127"
+4107 "pragma requires an integer between 15 and 255"
+4108 "pragma requires an integer between 79 and 132"
+4109 "unexpected identifier '%Fs'"
+4110 "unexpected token 'number'"
+4111 "unexpected token 'string'"
+4112 "#line requires an integer between 1 and 32767"
+4113 "function parameter lists differed"
+4114 "same type qualifier used more than once"
+4115 "'%Fs' : named type definition in parentheses"
+4116 "unnamed type definition in parentheses"
+4117 "macro name '%Fs' is reserved, '%Fs' ignored"
+4118 "pragma not supported during fast compile"
+4119 "different bases '%Fs' and '%Fs' specified"
+4120 "based/unbased mismatch"
+4121 "'%Fs' : alignment of a member was sensitive to packing"
+4122 "'%Fs' : alloc_text applicable only to functions with C linkage"
+4123 "different base expressions specified"
+4124 "__fastcall with stack checking is inefficient"
+4125 "decimal digit terminates octal escape sequence"
+4126 "'%c' : unknown memory-model command-line option"
+4127 "conditional expression is constant"
+4128 "storage-class specifier after type"
+4129 "'%c' : unrecognized character escape sequence"
+4130 "'%Fs' : logical operation on address of string constant"
+4131 "'%Fs' : uses old-style declarator"
+4132 "'%Fs' : const object should be initialized"
+4133 "'%Fs' : incompatible types - pointer to 'void' combined with pointer to type"
+4134 "conversion between pointers to members of same class"
+4135 "conversion between different integral types"
+4136 "conversion between different floating-point types"
+4137 "'%Fs' : no return value from floating-point function"
+4138 "'*/' found outside of comment"
+4139 "'0x%lx' : hex escape sequence is out of range"
+4140 "'%Fs' : redefined, preceding references may be invalid" /* QC */
+4141 "'%Fs' : used more than once"
+4142 "benign redefinition of type"
+4143 "pragma 'same_seg' not supported; use __based allocation"
+4144 "'%Fs' : relational expression as switch expression"
+4145 "'%Fs' : relational expression as switch expression; possible confusion with '%Fs'"
+4146 "unary minus operator applied to unsigned type, result still unsigned"
+4147 "'%Fs' : '%Fs' ignored on pointer and reference declarations"
+4148 "'%Fs' : DS != SS for '__near' '%Fs'"
+4149 "'%Fs' : different ambient model than base class '%Fs'"
+4150 "deletion of pointer to incomplete type '%Fs'; no destructor called"
+4151 "'%Fs' : operator should be explicitly '%Fs'"
+4152 "nonstandard extension, function/data pointer conversion in expression"
+4153 "function/data pointer conversion in expression"
+4154 "deletion of an array expression; conversion to pointer supplied"
+4155 "deletion of an array expression without using the array form of 'delete'"
+4156 "deletion of an array expression without using the array form of 'delete'; array form substituted"
+4157 "pragma was ignored by C compiler"
+4158 "assuming #pragma pointers_to_members(full_generality, %Fs_inheritance)"
+
+4184 "near call to thunk for '%Fs' in a different segment"
+
+4200 "nonstandard extension used : zero-sized array in struct/union"
+4201 "nonstandard extension used : nameless struct/union"
+4202 "nonstandard extension used : '...': prototype parameter in name list illegal"
+4203 "nonstandard extension used : union with static member variable"
+4204 "nonstandard extension used : non-constant aggregate initializer"
+4205 "nonstandard extension used : static function declaration in function scope"
+4206 "nonstandard extension used : translation unit is empty"
+4207 "nonstandard extension used : extended initializer form"
+4208 "nonstandard extension used : delete [exp] - exp evaluated but ignored"
+4209 "nonstandard extension used : benign typedef redefinition"
+4210 "nonstandard extension used : function given file scope"
+4211 "nonstandard extension used : redefined extern to static"
+4212 "nonstandard extension used : function declaration used ellipsis"
+4213 "nonstandard extension used : cast on l-value"
+4214 "nonstandard extension used : bit field types other than int"
+4215 "nonstandard extension used : long float"
+4216 "nonstandard extension used : float long"
+4217 "nonstandard extension used : function declaration from a previous block"
+4218 "nonstandard extension used : must specify at least a storage class or a type"
+4219 "nonstandard extension used : trailing ',' used for variable argument list"
+4220 "varargs matches remaining parameters"
+4221 "nonstandard extension used : '%Fs' : cannot be initialized using address of automatic variable '%Fs'"
+4222 "nonstandard extension used : '%Fs' : 'static' should not be used on member functions defined at file scope"
+4223 "nonstandard extension used : non-lvalue array converted to pointer"
+
+4241 "'%Fs' : member access is restricted"
+
+4243 "%Fs conversion from '%Fs' to '%Fs' exists, but is inaccessible"
+
+4245 "'friend' specified for nonexistent function '%Fs'"
+
+4247 "'%Fs' not accessible because '%Fs' uses '%Fs' to inherit from '%Fs'"
+4248 "'%Fs' : cannot access %Fs %Fs declared in class '%Fs'"
+4249 "'%Fs' : no path to %Fs %Fs declared in virtual base '%Fs'"
+4250 "'%Fs' : inherits '%Fs::%Fs' via dominance"
+4251 "'%Fs' : base type '%Fs' should be exported to export %Fs '%Fs'"
+4252 "'%Fs' is not defined; cannot specify CodeView information"
+
+4260 "no override, '%Fs::%Fs' has %Fs 'this' memory model whereas '%Fs::%Fs' has %Fs 'this' memory model"
+4261 "no override, '%Fs::%Fs' has %Fs calling convention whereas '%Fs::%Fs' has %Fs calling convention"
+4262 "no override, '%Fs::%Fs' has %Fs 'this' whereas '%Fs::%Fs' has %Fs 'this'"
+
+4270 "'%Fs' : do not initialize a non-const '%Fs' with a non-lvalue '%Fs' function return"
+
+4300 "conversion of pointer to nonintegral type"
+
+4305 "'%Fs' : truncation from '%Fs' to '%Fs'"
+4306 "'%Fs' : conversion from '%Fs' to '%Fs' of greater size"
+4307 "'%Fs' : integral constant overflow"
+4308 "negative integral constant converted to unsigned type"
+4309 "'%Fs' : truncation of constant value"
+
+4341 "'%Fs' : signed value is out of range for enum constant"
+4342 "precision lost in initialization of enum constant"
+
+4354 "'%Fs' : initialization of reference to member requires a temporary variable"
+4355 "'this' : used in base member initializer list"
+
+4385 "%Fs the '%Fs' in base '%Fs'"
+4386 "%Fs to the '%Fs' in base '%Fs'"
+4387 "'%Fs' : was considered"
+
+4401 "'%Fs' : member is bit field"
+4402 "must use PTR operator"
+4403 "illegal PTR operator"
+4404 "period on directive ignored"
+4405 "'%Fs' : identifier is reserved word"
+4406 "operand on directive ignored"
+
+4409 "illegal instruction size"
+4410 "illegal size for operand"
+4411 "'%Fs' : symbol resolves to displacement register"
+
+4414 "'%Fs' : short jump to function converted to near"
+
+4500 "'%Fs' : class has private/protected data members; user-defined constructor advised"
+4501 "'%Fs' : use of '::' unnecessary here"
+4502 "'linkage' requires use of keyword 'extern'"
+
+4504 "type still ambiguous after parsing %d tokens, assuming declaration"
+4505 "'%Fs' : unreferenced local function has been removed"
+4506 "no definition for inline function '%Fs'"
+4507 "explicit linkage specified after default linkage was used"
+4508 "'%Fs' : function should return a value; 'void' return type assumed"
+
+4510 "'%Fs' : default constructor could not be generated"
+4511 "'%Fs' : copy constructor could not be generated"
+4512 "'%Fs' : assignment operator could not be generated"
+4513 "'%Fs' : destructor could not be generated"
+
+4520 "'%Fs' : multiple default constructors specified"
+4521 "'%Fs' : multiple copy constructors specified"
+4522 "'%Fs' : multiple assignment operators specified"
+4523 "'%Fs' : multiple destructors specified"
+4524 "'%Fs' : redundant use of 'friend' on destructor"
+4525 "'%Fs' : redundant use of 'friend' on constructor"
+
+4527 "instances of %Fs '%Fs' can never be destroyed - user-defined destructor required"
+4528 "illegal 'pure' syntax, must be '= 0'"
+
+4607 "'%Fs' : must be initialized in constructor base/member initializer list"
+
+4610 "%Fs '%Fs' can never be instantiated - user defined constructor required"
+
+4612 "bad #pragma syntax, pragma ignored"
+4613 "'%Fs' : class of segment cannot be changed"
+4614 "'%Fs' : varargs parameters with this type were promoted" /* /NT */
+4615 "#pragma warning : unknown user warning type"
+4616 "#pragma warning : warning number '%d' out of range, must be between '%d' and '%d'"
+4617 "#pragma warning : invalid warning number"
+
+4620 "no postfix form of 'operator ++' found for type '%Fs', using prefix form"
+4621 "no postfix form of 'operator --' found for type '%Fs', using prefix form"
+4622 "overwriting debug information formed during creation of the precompiled header in object file: '%s'"
+
+4630 "'%Fs' : '%Fs' storage-class specifier illegal on member definition"
+
+4650 "debugging information not in precompiled header; only global symbols from the header will be available"
+4651 "'/D%s' specified for precompiled header but not for current compile"
+4652 "command-line option '%Fs' inconsistent with precompiled header; precompiled header option ignored"
+
+4699 "Note: %Fs"
+
+4706 "assignment within conditional expression" /* QC, c23 */
+
+4710 "'%Fs' : function not expanded" /* QC, c23 */
+
+4726 "'%c' : unknown memory model command-line option"
+4727 "conditional expression is constant"
+
+4741 "/Oq option ignored for __fastcall function '%Fs'"
+
+4746 "'%Fs' : unsized array given size %Fs"
+
+4756 "overflow in constant arithmetic" /* QC2, c1, c23 */
+
+4758 "address of automatic (local) variable taken, DS != SS" /* QC, c23 */
+4759 "segment lost in conversion" /* QC, c23 */
+4760 "'%Fs' : segment lost in initialization" /* QC, c23 */
+
+4761 "integral size mismatch in argument : conversion supplied" /* QC, c23 */
+4762 "near/far mismatch in argument : conversion supplied" /* QC, c23 */
+
+4769 "conversion of near pointer to long integer" /* QC, c23 */
+
+4785 "near call to '%Fs' in different segment" /* QC, c23 */
+
+4788 "'%Fs' : identifier was truncated to '%d' characters"
+
+4793 "native code generated for p-code function '%Fs' with inline assembly"
+
+4900 "intermediate language mismatch between '%s' version '%ld' and '%s' version '%ld'"
+
+4000 "UNKNOWN WARNING\n\t\tContact Microsoft Product Support Services"
+ /* errors */
+
+2001 "newline in constant"
+2002 "invalid wide-character constant"
+2003 "expected 'defined id'"
+2004 "expected 'defined(id)'"
+2005 "#line expected a line number, found '%Fs'"
+2006 "#include expected a filename, found '%Fs'"
+2007 "#define syntax"
+2008 "'%c' : unexpected in macro definition"
+2009 "reuse of macro formal '%Fs'"
+2010 "'%c' : unexpected in macro formal parameter list"
+2011 "'%Fs' : '%Fs' type redefinition"
+2012 "missing name following '<'"
+2013 "missing '>'"
+2014 "preprocessor command must start as first nonwhite space"
+2015 "too many characters in constant"
+2016 "no closing single quotation mark"
+2017 "illegal escape sequence"
+2018 "unknown character '0x%x'"
+2019 "expected preprocessor directive, found '%c'"
+2020 "'%Fs' : '%Fs' member redefinition"
+2021 "expected exponent value, not '%c'"
+2022 "'%ld' : too big for character"
+2023 "divide by 0"
+2024 "mod by 0"
+2025 "'%s' : enum/struct/union type redefinition" /* QC 2.5 */
+2026 "string too big, trailing characters truncated"
+2027 "use of undefined type '%Fs'"
+2028 "struct/union member must be inside a struct/union"
+2029 "left of '%s' specifies undefined class/struct/union '%Fs'"
+2030 "'%Fs' : struct/union member redefinition" /* QC 2.5 */
+2031 "'%Fs' : function cannot be struct/union member" /* QC 2.5 */
+2032 "'%Fs' : function cannot be member of %Fs '%Fs'"
+2033 "'%Fs' : bit field cannot have indirection"
+2034 "'%Fs' : type of bit field too small for number of bits"
+2035 "struct/union '%Fs' : unknown size" /* QC 2.5 */
+2036 "'%Fs' : unknown size"
+2037 "left of '%s' specifies undefined struct/union '%Fs'"
+2038 "'%s' : not struct/union member" /* QC 2.5 */
+2039 "'%Fs' : is not a member of '%Fs'"
+2040 "'%Fs' : different levels of indirection"
+2041 "illegal digit '%c' for base '%d'"
+2042 "signed/unsigned keywords mutually exclusive"
+2043 "illegal break"
+2044 "illegal continue"
+2045 "'%Fs' : label redefined"
+2046 "illegal case"
+2047 "illegal default"
+2048 "more than one default"
+2049 "case value '%ld' already used"
+2050 "switch expression not integral"
+2051 "case expression not constant"
+2052 "case expression not integral"
+2053 "'%Fs' : wide string mismatch"
+2054 "expected '(' to follow '%Fs'"
+2055 "expected formal parameter list, not a type list"
+2056 "illegal expression"
+2057 "expected constant expression"
+2058 "constant expression is not integral"
+2059 "syntax error : '%Fs'"
+2060 "syntax error : end of file found"
+2061 "syntax error : identifier '%Fs'"
+2062 "type '%Fs' unexpected"
+2063 "'%Fs' : not a function"
+2064 "term does not evaluate to a function"
+2065 "'%Fs' : undeclared identifier"
+2066 "cast to function type is illegal"
+2067 "cast to array type is illegal"
+2068 "illegal cast from '%Fs' to '%Fs'"
+2069 "cast of 'void' term to non-'void'"
+2070 "illegal sizeof operand"
+2071 "'%Fs' : illegal storage class"
+2072 "'%Fs' : initialization of a function"
+2073 "'%Fs' : partially initialized array requires a default constructor"
+2074 "'%Fs' : '%Fs' initialization needs curly braces"
+2075 "'%Fs' : array initialization needs curly braces"
+2076 "'%Fs' : struct/union initialization needs curly braces" /* QC 2.5 */
+2077 "nonscalar field initializer '%Fs'"
+2078 "too many initializers"
+2079 "'%Fs' uses undefined class/struct/union '%Fs'"
+2080 "illegal __far __fastcall function or __saveregs function"
+2081 "'%Fs' : name in formal parameter list illegal"
+2082 "redefinition of formal parameter '%Fs'"
+2083 "%Fs comparison illegal"
+2084 "function '%Fs' already has a body"
+2085 "'%Fs' : not in formal parameter list"
+2086 "'%Fs' : redefinition"
+2087 "'%Fs' : missing subscript"
+2088 "'%Fs' : illegal for %Fs"
+2089 "'%Fs' : '%Fs' too large"
+2090 "function returns array"
+2091 "function returns function"
+2092 "array element type cannot be function"
+2093 "'%Fs' : cannot be initialized using address of automatic variable '%Fs'"
+2094 "label '%Fs' was undefined"
+2095 "'%Fs' : actual parameter has type 'void' : parameter %d"
+2096 "struct/union comparison illegal" /* QC 2.5 */
+2097 "illegal initialization"
+2098 "expression is not an address"
+2099 "initializer is not a constant"
+2100 "illegal indirection"
+2101 "'%Fs' on constant"
+2102 "'%Fs' requires l-value"
+2103 "'%Fs' on register variable"
+2104 "'%Fs' on bit field ignored"
+2105 "'%Fs' needs l-value"
+2106 "'%Fs' : left operand must be l-value"
+2107 "illegal index, indirection not allowed"
+2108 "subscript is not of integral type"
+2109 "subscript requires array or pointer type"
+2110 "cannot add two pointers"
+2111 "pointer addition requires integral operand"
+2112 "pointer subtraction requires integral or pointer operand"
+2113 "pointer can only be subtracted from another pointer"
+2114 "'%Fs' : pointer on left; needs integral value on right"
+2115 "'%Fs' : incompatible types"
+2116 "function parameter lists differed"
+2117 "'%Fs' : array bounds overflow"
+2118 "negative subscript"
+2119 "typedef types both define indirection"
+2120 "'void' illegal with all types"
+2121 "'%Fs' : bad %Fs operand"
+2122 "'%Fs' : prototype parameter in name list illegal"
+2123 "'%Fs' : cannot call __fastcall function '%Fs' from p-code"
+2124 "divide or mod by zero"
+2125 "'%Fs' : allocation exceeds 64K" /* QC, c23 */
+2126 "'%Fs' : incorrect operand"
+2127 "parameter allocation exceeds 32K" /* QC, c23 */
+2128 "'%Fs' : alloc_text/same_seg applicable only to functions with C linkage"
+2129 "static function '%Fs' declared but not defined"
+2130 "#line expected a string containing the filename, found '%Fs'"
+2131 "more than one memory attribute"
+2132 "syntax error : unexpected identifier"
+2133 "'%Fs' : unknown size"
+2134 "'%Fs' : struct/union too large" /* QC 2.5 */
+2135 "'%Fs' : illegal bit field operation"
+2136 "'%Fs' : prototype must have parameter types"
+2137 "empty character constant"
+2138 "illegal to define an enumeration without any members"
+2139 "type following '%s' is illegal"
+2140 "parameter cannot be function type"
+2141 "value out of range for enum constant"
+2142 "function declarations differ, variable parameters specified only in one of them"
+2143 "syntax error : missing '%Fs' before '%Fs'"
+2144 "syntax error : missing '%Fs' before type '%Fs'"
+2145 "syntax error : missing '%Fs' before identifier"
+2146 "syntax error : missing '%Fs' before identifier '%Fs'"
+2147 "'%Fs' : const array must be fully initialized"
+2148 "array too large"
+2149 "'%Fs' : named bit field cannot have zero width"
+2150 "'%Fs' : bit field must have type 'int', 'signed int', or 'unsigned int'"
+2151 "more than one language attribute"
+2152 "'%Fs' : pointers to functions with different attributes"
+2153 "hex constants must have at least one hex digit"
+2154 "'%Fs' : does not refer to a segment name"
+2155 "'?' : invalid left operand, expected arithmetic or pointer type"
+2156 "pragma must be outside function"
+2157 "'%Fs' : must be declared before use in pragma list"
+2158 "'%Fs' : is a function"
+2159 "more than one storage class specified"
+2160 "'##' cannot occur at the beginning of a macro definition"
+2161 "'##' cannot occur at the end of a macro definition"
+2162 "expected macro formal parameter"
+2163 "'%Fs' : not available as an intrinsic function"
+2164 "'%Fs' : intrinsic function not declared"
+2165 "'%Fs' : cannot modify pointers to data"
+2166 "l-value specifies const object"
+2167 "'%Fs' : too many actual parameters for intrinsic function"
+2168 "'%Fs' : too few actual parameters for intrinsic function"
+2169 "'%Fs' : intrinsic function, cannot be defined"
+2170 "'%Fs' : not declared as a function, cannot be intrinsic"
+2171 "'%Fs' : illegal operand"
+2172 "'%Fs' : actual parameter is not a pointer : parameter %d"
+2173 "'%Fs' : actual parameter is not a pointer : parameter %d, parameter list %d"
+2174 "'%Fs' : actual parameter has type 'void' : parameter %d, parameter list %d"
+2175 "'%Fs' : invalid locale"
+2176 "static huge data not supported by '%Fs'" /* QC & Pcode */
+2177 "constant too big"
+2178 "'%Fs' : storage class for same_seg variables must be extern"
+2179 "'%Fs' : was used in same_seg, but storage class is no longer extern"
+2180 "controlling expression has type 'void'"
+2181 "illegal else without matching if"
+2182 "'%Fs' : has type 'void'"
+2183 "syntax error: translation unit is empty"
+2184 "illegal return of a 'void' value"
+2185 "'%Fs' : illegal based allocation"
+2186 "'%Fs' : illegal operand of type 'void'"
+2187 "cast of near function pointer to far function pointer"
+2188 "'%ld' : too big for wide character"
+2189 "#error : %Fs"
+2190 "first parameter list longer than second"
+2191 "second parameter list longer than first"
+2192 "parameter '%d' declaration different"
+2193 "'%Fs' : already in a segment"
+2194 "'%Fs' : is a text segment"
+2195 "'%Fs' : is a data segment"
+2197 "'%Fs' : too many actual parameters"
+2198 "'%Fs' : too few actual parameters"
+2199 "syntax error : found '%Fs (' at global scope (was a declaration intended?)"
+2200 "'%Fs' : function has already been defined"
+2201 "'%Fs' : cannot export static declarations"
+2202 "'%Fs' : not all control paths return a value"
+2203 "delete operator cannot specify bounds for an array"
+2204 "'%Fs' : type definition found within parentheses"
+2205 "'%Fs' : cannot initialize extern variables with block scope"
+2206 "'%Fs' : typedef cannot be used for function definition"
+2207 "'%Fs' in struct/union '%Fs' has a zero-sized array" /* QC 2.5 */
+2208 "'%Fs' : no members defined using this type"
+2209 "type cast in __based construct must be (__segment)"
+2210 "'%Fs' : must be near/far data pointer"
+2211 "(__segment) applied to function identifier '%Fs'"
+2212 "'%Fs' : __based not available for pointers to functions"
+2213 "'%Fs' : illegal argument to __based"
+2214 "pointers based on 'void' require the use of :>"
+2215 "':>' operator only for objects based on 'void'"
+2216 "'%Fs' cannot be used with '%Fs'"
+2217 "'%Fs' must be used with '%Fs'"
+2218 "type in __based construct must be 'void'"
+2219 "syntax error : type qualifier must be after '*'"
+2220 "warning treated as error - no object file generated"
+2221 "'.' : left operand points to class/struct/union, use '->'" /* QC 2.5 */
+2222 "'->' : left operand has struct/union type, use '.'" /* QC 2.5 */
+2223 "left of '->%Fs' must point to class/struct/union"
+2224 "left of '.%Fs' must have class/struct/union type"
+2225 "'%Fs' : function allocation must be in a named segment"
+2226 "syntax error : unexpected type '%Fs'"
+2227 "left of '->%Fs' must point to class/struct/union"
+2228 "left of '.%Fs' must have class/struct/union type"
+2229 "%Fs '%Fs' has an illegal zero-sized array"
+2230 "'%Fs' : indirection to different types"
+2231 "'.' : left operand points to '%Fs', use '->'"
+2232 "'->' : left operand has '%Fs' type, use '.'"
+2233 "'%Fs' : arrays of objects containing zero-size arrays are illegal"
+2234 "arrays of references are illegal"
+2235 "';' in formal parameter list"
+2236 "unexpected '%Fs' '%Fs'"
+2237 "unexpected %Fs '%Fs'"
+2238 "unexpected token[s] preceding '%s'"
+2239 "unexpected token '%Fs' following declaration of '%Fs'"
+2240 "unexpected '%Fs' following formal list (only modifiers are allowed)"
+2241 "'%Fs' : member access is restricted"
+2242 "typedef name cannot follow class/struct/union"
+2243 "%Fs conversion from '%Fs' to '%Fs' exists, but is inaccessible"
+2244 "'%Fs' : unable to resolve function overload"
+2245 "nonexistent function '%Fs' specified as friend"
+2246 "'%Fs' : illegal static data member in locally defined class"
+2247 "'%Fs' not accessible because '%Fs' uses '%Fs' to inherit from '%Fs'"
+2248 "'%Fs' : cannot access %Fs %Fs declared in class '%Fs'"
+2249 "'%Fs' : no accessible path to %Fs %Fs declared in virtual base '%Fs'"
+2250 "'%Fs' : ambiguous inheritance of '%Fs::%Fs'"
+2251 "'%Fs' : defined but not declared"
+2252 "'%Fs' : pure specifier can only be specified for functions"
+2253 "'%Fs' : pure specifier only applies to virtual function - specifier ignored"
+2254 "'%Fs' : pure specifier not allowed on friend functions"
+2255 "'%Fs' : a friend function can only be declared in a class"
+2256 "illegal use of friend specifier on '%Fs'"
+2257 "p-code generation pragma not allowed without /Oq"
+2258 "illegal pure syntax, must be '= 0'"
+2259 "'%Fs' : illegal attempt to instantiate abstract class"
+2260 "function pointer cast to a data pointer"
+2261 "data pointer cast to a function pointer"
+2262 "'%Fs' : cannot be destroyed"
+2263 "function returns pointer based on __self"
+2264 "'%Fs' : error in function definition or declaration; function not called"
+2265 "'%Fs' : reference to a zero-sized array is illegal"
+2266 "'%Fs' : reference to a nonconstant bounded array is illegal"
+2267 "'%Fs' : static functions with block scope are illegal"
+2268 "'%Fs' : different const or volatile qualifiers"
+2269 "'%Fs' : different ambient model than base class '%Fs'"
+2270 "'%Fs' : modifiers not allowed on nonmember functions"
+2271 "'%Fs' : new/delete cannot have formal list modifiers"
+2272 "'%Fs' : modifiers not allowed on static member functions"
+2273 "'%Fs' : illegal as right side of '->' operator"
+2274 "'%Fs' : illegal as right side of '.' operator"
+2275 "'%Fs' : illegal use of this type as an expression"
+2276 "'%Fs' : illegal operation on bound member function expression"
+2277 "'%Fs' : cannot take the address of a constructor"
+2278 "'%Fs' : no function with C linkage found"
+2279 "cannot use braces to initialize default arguments"
+2280 "missing '{' before identifier '%Fs'?"
+2281 "'%Fs' : is not a function, but contains <function returning>; '%Fs' is unexpected"
+2282 "'%Fs' is followed by '%Fs' (missing ','?)"
+2283 "'%Fs' : pure specifier not allowed on unnamed %Fs"
+2284 "unbalanced parenthesis found while processing a member function"
+2285 "pointers to members representation has already been determined - pragma ignored"
+2286 "pointers to members of '%Fs' representation is already set to %s inheritance - declaration ignored"
+2287 "'%Fs': inheritance representation: '%Fs' is less general than the required '%Fs'"
+2288 "typedef has a trailing __based which cannot be applied to the symbol's indirection"
+2289 "same type qualifier used more than once"
+2290 "C++ '%Fs' syntax is reserved for future use"
+2291 "'%Fs' : illegal modifier '%Fs' for 'this' pointer"
+2292 "'%Fs': best case inheritance representation: '%Fs' declared but '%Fs' required"
+2293 "'%Fs': illegal to have a non-static member variable as a __based specifier"
+
+2300 "'%Fs' : class does not have a destructor called '~%Fs'"
+2301 "left of '->~%Fs' must point to class/struct/union"
+2302 "left of '.~%Fs' must have class/struct/union type"
+
+2350 "'%Fs' is not a static member"
+2351 "obsolete C++ constructor initialization syntax"
+2352 "'%Fs::%Fs' : illegal call of nonstatic member function"
+2353 "'%Fs' : improper use of constructor initializers"
+2354 "'%Fs' : initialization of reference member requires a temporary variable"
+2355 "'this' : can only be referenced inside nonstatic member functions"
+2356 "initialization segment must not change during translation unit"
+
+2360 "initialization of '%Fs' is skipped by 'case' label"
+2361 "initialization of '%Fs' is skipped by 'default' label"
+2362 "initialization of '%Fs' is skipped by 'goto %Fs'"
+
+2369 "'%Fs' : redefinition; different subscripts"
+2370 "'%Fs' : redefinition; different storage class"
+2371 "'%Fs' : redefinition; different basic types"
+2372 "'%Fs' : redefinition; different types of indirection"
+2373 "'%Fs' : redefinition; different type modifiers"
+2374 "'%Fs' : redefinition; multiple initialization"
+2375 "'%Fs' : redefinition; different linkage"
+2376 "'%Fs' : redefinition; different based allocation"
+2377 "'%Fs' : redefinition; typedef cannot be overloaded with any other symbol"
+2378 "'%Fs' : redefinition; symbol cannot be overloaded with a typedef"
+2379 "formal parameter %d has different type when promoted"
+2380 "type[s] preceding '%Fs' (constructor with return type, or illegal redefinition of current class-name?)"
+
+2385 "'%Fs::%Fs' is ambiguous"
+2386 "ambiguous conversion from '%Fs*' to '%Fs*'"
+2387 "ambiguous conversion from '%Fs&' to '%Fs&'"
+
+2390 "'%Fs' : incorrect storage class '%Fs'"
+2391 "'%Fs' : 'friend' cannot be used during type definition"
+
+2400 "inline syntax error in '%Fs'; found '%Fs'"
+2401 "'%Fs' : register must be base in '%Fs'"
+2402 "'%Fs' : register must be index in '%Fs'"
+2403 "'%Fs' : register must be base/index in '%Fs'"
+2404 "'%Fs' : illegal register in '%Fs'"
+2405 "illegal short forward reference with offset"
+2406 "'%Fs' : name undefined in '%Fs'"
+2407 "illegal 'float' register in '%Fs'"
+2408 "illegal type on PTR operator in '%Fs'"
+2409 "illegal type used as operator in '%s'"
+2410 "'%Fs' : ambiguous member name in '%Fs'"
+2411 "'%Fs' : illegal struct/union member in '%Fs'"
+2412 "'%Fs' : case-insensitive label redefined"
+2413 "'%Fs' : illegal align size"
+2414 "illegal number of operands"
+2415 "improper operand type"
+2416 "'%Fs' : illegal opcode for processor"
+2417 "divide by zero in '%Fs'"
+2418 "'%Fs' : not in a register"
+2419 "mod by zero in '%Fs'"
+2420 "'%Fs' : illegal symbol in %Fs"
+2421 "PTR operator used with register in '%Fs'"
+2422 "illegal segment override in '%Fs'"
+2423 "'%ld' : illegal scale"
+2424 "'%Fs' : improper expression in '%Fs'"
+2425 "'%Fs' : nonconstant expression in '%Fs'"
+2426 "'%Fs' : illegal operator in '%Fs'"
+2427 "'%Fs' : jump referencing label is out of range" /* QC */
+
+2429 "'%Fs' : illegal far label reference"
+2430 "more than one index register in '%Fs'"
+2431 "illegal index register in '%Fs'"
+2432 "illegal reference to 16-bit data in '%Fs'"
+2433 "'%Fs' : '%Fs' not permitted on data declarations"
+2434 "'%Fs' : cannot convert default argument from '%Fs' to '%Fs'"
+2435 "'%Fs' : function called before default arguments were resolved"
+2436 "'%Fs' : cannot initialize member functions"
+2437 "'%Fs' : already initialized"
+2438 "'%Fs' : cannot initialize static class data via constructor"
+2439 "'%Fs' : member could not be initialized"
+2440 "'%Fs' : cannot convert from '%Fs' to '%Fs'"
+2441 "function call through pointer before default arguments were resolved"
+2442 "p-code expression too complex for setjmp or Catch"
+2443 "operand size conflict"
+
+2446 "'%Fs' : no conversion from '%Fs' to '%Fs'"
+2447 "missing function header (old-style formal list?)"
+2448 "'%Fs' : function-style initializer appears to be a function definition"
+2449 "found '{' at file scope (missing function header?)"
+2450 "switch expression of type '%Fs' is illegal"
+2451 "conditional expression of type '%Fs' is illegal"
+2452 "array bound expression of type '%Fs' is illegal"
+2453 "array bound expression uses function name"
+
+2458 "'%Fs' : redefinition within definition"
+2459 "'%Fs' : is being defined; cannot add as an anonymous member"
+2460 "'%Fs' : uses '%Fs', which is being defined"
+2461 "'%Fs' : constructor syntax missing formal parameters"
+2462 "'%Fs' : cannot define a type in a 'new-expression'"
+2463 "cannot define an anonymous type in a 'new-expression'"
+2464 "'%Fs' : cannot use 'new' to allocate a reference"
+2465 "cannot define an anonymous type inside parentheses"
+2466 "cannot allocate an array of constant size 0"
+2467 "illegal declaration of anonymous '%Fs'"
+2468 "'new' : cannot allocate 'const'/'volatile' objects (type is '%Fs')"
+2470 "cannot open database '%Fs'"
+2471 "cannot update database '%Fs'"
+
+2500 "'%Fs' : '%Fs' is already a direct base class"
+2501 "'%Fs' : missing decl-specifiers"
+2502 "'%Fs' : too many access modifiers on the base class"
+2503 "'%Fs' : base classes cannot contain zero-sized arrays"
+2504 "'%Fs' : base class undefined"
+2505 "'%Fs' : is not a legal base class"
+2506 "'%Fs' : ambiguous"
+2507 "'%Fs' : too many virtual modifiers on the base class"
+2508 "'%Fs' : access denied"
+2509 "'%Fs' : member function not declared in '%Fs'"
+2510 "'%Fs' : left of '::' must be a class/struct/union"
+2511 "'%Fs' : overloaded member function not found in '%Fs'"
+2512 "'%Fs' : no appropriate default constructor available"
+2513 "'%Fs' : decl-specifier is missing a declarator before '='"
+2514 "'%Fs' : class has no constructors"
+2515 "'%Fs' : not in class '%Fs'"
+
+2517 "'%Fs' : right of '::' is undefined"
+
+2519 "cannot convert '%Fs *' to '%Fs *'"
+
+2523 "'%Fs::~%Fs' : destructor tag mismatch"
+2524 "'%Fs' : destructors must have a 'void' formal parameter list"
+2525 "'%Fs' : explicit destructor is named but not called"
+
+2527 "'%Fs' : array of references must be fully initialized"
+2528 "illegal pointer to reference"
+2529 "illegal reference to a reference"
+2530 "'%Fs' : references must be initialized"
+2531 "'%Fs' : reference to a bit field illegal"
+2532 "'%s' : cannot modify references"
+2533 "'%Fs' : constructors not allowed a return type"
+2534 "'%Fs' : constructor cannot return a value"
+2535 "'%Fs' : member function already defined or declared"
+2536 "'%Fs::%Fs' : cannot specify explicit initializer for arrays"
+2537 "'%Fs' : illegal linkage specification"
+2538 "new : cannot specify initializer for arrays"
+2539 "new : '%Fs' no default constructor to initialize arrays of objects"
+2540 "nonconstant expression as array bound"
+2541 "delete : cannot delete objects that are not pointers"
+2542 "'%Fs' : class object has no constructor for initialization"
+2543 "expected ']' for operator '[]'"
+2544 "expected ')' for operator '()'"
+2545 "'%Fs' : unable to find overloaded operator"
+2546 "'%Fs' : illegal mix of 'void' pointer with pointer to type"
+2547 "illegal cast of overloaded function"
+2548 "'%Fs' : missing default parameter for parameter %s"
+2549 "user-defined conversion cannot specify a return type"
+2550 "'%Fs' : constructor initializer lists are only allowed on constructor definitions"
+2551 "'void *' type needs explicit cast"
+2552 "'%Fs' : nonaggregates cannot be initialized with initializer list"
+2553 "no legal conversion of return value to return type '%Fs'"
+2555 "'%Fs::%Fs' : overriding virtual function differs from '%Fs::%Fs' only by return type"
+2556 "'%Fs' : overloaded functions only differ by return type"
+2557 "'%Fs' : private and protected members cannot be initialized without a constructor"
+2558 "'%Fs' : no copy constructor available"
+2559 "'%Fs' : no match for specified operator"
+2560 "'%Fs' : overloaded function differs only by calling convention/memory model"
+2561 "'%Fs' : function must return a value"
+2562 "'%Fs' : 'void' function returning a value"
+2563 "mismatch in formal parameter list"
+2564 "formal/actual parameters mismatch in call through pointer to function"
+2565 "'::%Fs' was previously declared as a global function"
+2566 "overloaded function in conditional expression"
+2567 "'%Fs' : intrinsic function must have prototypes when using C++"
+2568 "'%Fs' : unable to resolve function overload '%Fs'"
+2569 "'%Fs' : union cannot be used as a base class"
+2570 "'%Fs' : union cannot have base classes"
+2571 "'%Fs' : union cannot have virtual function '%Fs'"
+2572 "'%Fs' : redefinition of default parameter : parameter %s"
+2573 "'%Fs' : simple type cast must have exactly one expression"
+2574 "'%Fs' : illegal static destructor declaration"
+2575 "'%Fs' : only member functions and bases can be virtual"
+2576 "'%Fs' : virtual used for static member function"
+2577 "'%Fs' : destructor cannot return a value"
+
+2579 "'%Fs::%Fs(%s)' : parameter list not sufficiently different to '%Fs::%Fs(%s)'"
+2580 "redefinition of class name '%Fs'"
+2581 "'%Fs' : static 'operator =' function is illegal"
+2582 "'%Fs' : 'operator =' function is unavailable"
+2583 "'%Fs' : illegal const/volatile 'this' pointer used for constructors/destructors"
+2584 "'%Fs' : direct base '%Fs' is inaccessible; already a base of '%Fs'"
+2585 "explicit conversion to '%Fs' is ambiguous"
+2586 "incorrect user-defined conversion syntax : illegal indirections"
+2587 "'%Fs' : illegal use of local variable as default parameter"
+2588 "'::~%Fs' : illegal global destructor"
+2589 "'%Fs' : illegal token on right side of '::'"
+2590 "'%Fs' : ambiguous user-defined conversions in switch expression"
+2591 "'%Fs' : ambiguous user-defined conversions in conditional expression"
+2592 "no legal conversion of initialization expression to type '%Fs'"
+2593 "'operator %Fs' is ambiguous"
+2594 "'%Fs' : ambiguous conversions from '%Fs' to '%Fs'"
+2595 "'%Fs' : qualified name already has a constructor"
+2596 "'%Fs' : qualified name already has a destructor"
+2597 "'%Fs' : does not specify an object"
+2598 "linkage specification must be at global scope"
+2599 "'%Fs' : local functions are not supported"
+2601 "functions cannot be defined in local classes"
+2602 "'%Fs::%Fs' is not a member of a base of '%Fs'"
+2603 "illegal access declaration: '%Fs' is not a direct base of '%Fs'"
+2604 "cannot declare %Fs access to %Fs member '%Fs::%Fs'"
+2605 "overloaded functions '%Fs::%Fs' do not have same access"
+2606 "'%Fs::%Fs': illegal private access declaration"
+2607 "'%Fs' : cannot implicitly convert a '%Fs' to a '%Fs' that is not const"
+2608 "illegal reference cast - operand not an l-value"
+2609 "'%Fs' : cannot implicitly convert a non-lvalue '%Fs' function return to a '%Fs' that is not const"
+2610 "%Fs '%Fs' can never be instantiated; user-defined constructor is required"
+2611 "'%Fs' : illegal following '~' (expected identifier)"
+2612 "trailing '%Fs' illegal in base/member initializer list"
+2613 "trailing '%Fs' illegal in base class list"
+2614 "'%Fs' : illegal member initialization: '%Fs' is not a base or member"
+2615 "memory attribute must appear before class name in pointer to member"
+2617 "'%Fs' : inconsistent return statement"
+2618 "'%Fs' : inconsistent return statement"
+2619 "union '%Fs' : cannot have static member variable '%Fs'"
+2620 "union '%Fs' : member '%Fs' has default constructor"
+2621 "union '%Fs' : member '%Fs' has copy constructor"
+2622 "union '%Fs' : member '%Fs' has assignment operator"
+2623 "union '%Fs' : member '%Fs' has destructor"
+2624 "'%Fs' : references to 'void' are illegal"
+2625 "anonymous union did not declare any data members"
+2626 "anonymous union defines %Fs member '%Fs'"
+2627 "member function defined in unnamed class"
+2628 "'%Fs' followed by '%Fs' is illegal (did you forget a ';'?)"
+2629 "unexpected '%s ('"
+2630 "'%Fs' found in what should be a comma-separated list"
+2631 "'%Fs' : destructors not allowed a return type"
+2632 "'%Fs' followed by '%Fs' is illegal"
+2633 "'%Fs' : 'inline' is the only legal storage class for constructors"
+2634 "'&%Fs::%Fs' : pointer to reference member is illegal"
+2635 "cannot convert a '%Fs*' to a '%Fs*'; conversion from a virtual base class is implied"
+2636 "pointer to reference member is illegal"
+2637 "'%s' : cannot modify pointers to data members"
+2638 "'%Fs' : memory model modifier illegal on pointer to data member"
+2639 "compiler generated %Fs required by unnamed class"
+
+2641 "illegal pointer to member cast across virtual inheritance path"
+2642 "cast to pointer to member must be from related pointer to member"
+2643 "illegal cast from pointer to member"
+2644 "basis class '%Fs' for pointer to member has not been defined"
+2645 "no qualified name for pointer to member (found ':: *')"
+2646 "global anonymous unions must be declared static"
+2647 "'%Fs' : cannot dereference a '%Fs' on a '%Fs'"
+2648 "'%Fs' : use of member as default parameter requires static member"
+2649 "'%Fs' : is not a '%Fs'"
+2650 "'%Fs' : cannot be a virtual function"
+
+2652 "'%Fs' : illegal copy constructor: first parameter must not be a '%Fs'"
+2653 "'%Fs' : is not a class name"
+2654 "'%Fs' : attempt to access member outside a member function"
+2655 "'%Fs' : definition or redeclaration illegal in current scope"
+2656 "'%Fs' : function not allowed as a bit field"
+2657 "'%Fs::*' found at the start of a statement (did you forget to specify a type?)"
+2658 "multiple conversions : %Fs(%Fs) and %Fs::operator %Fs()"
+2659 "'%Fs' : overloaded function as left operand"
+2660 "'%Fs' : function does not take %d parameters"
+2661 "'%Fs' : no overloaded function takes %d parameters"
+2662 "'%Fs' : cannot convert 'this' pointer from '%Fs' to '%Fs'"
+2663 "'%Fs' : %d overloads have no legal conversion for 'this' pointer"
+2664 "'%Fs' : cannot convert parameter %d from '%Fs' to '%Fs'"
+2665 "'%Fs' : %d overloads have no legal conversion for parameter %d"
+2666 "'%Fs' : %d overloads have similar conversions"
+2667 "'%Fs' : none of %d overload have a best conversion"
+2668 "'%Fs' : ambiguous call to overloaded function"
+
+2671 "'%Fs' : static member functions do not have 'this' pointers"
+2672 "'%Fs' : new/delete member functions do not have 'this' pointers"
+2673 "'%Fs' : global functions do not have 'this' pointers"
+2674 "'%Fs' : no acceptable conversions from '%Fs' to '%Fs'"
+2675 "unary '%Fs' : '%Fs' does not define this operator or a conversion to a type acceptable to the predefined operator"
+2676 "binary '%Fs' : '%Fs' does not define this operator or a conversion to a type acceptable to the predefined operator"
+2677 "binary '%Fs' : no global operator defined which takes type '%Fs' (or there is no acceptable conversion)"
+
+2701 "'%Fs' : __oldcall function defined with varargs" /* /NT */
+2702 " __try may not appear in termination block" /* /NT */
+2703 "illegal __leave statement"
+2704 "'%Fs' : __va_start intrinsic only allowed in varargs" /* /NT */
+2705 "'%Fs' : illegal jump into __try scope" /* /NT */
+
+2707 "'%Fs' : bad context for intrinsic function" /* /NT */
+2708 "'%Fs' : actual parameters length in bytes differs from previous call or reference"
+2709 "'%Fs' : formal parameters length in bytes differs from previous declaration"
+2710 "cannot delete a pointer to a const object"
+2711 "cannot delete a pointer to a function"
+
+2720 "'%Fs' : '%Fs' storage-class specifier illegal on members"
+2721 "'%Fs' : storage-class specifier illegal between operator keyword and type"
+2722 "'::%Fs' : illegal following operator command; use 'operator %Fs'"
+2723 "'%Fs' : '%Fs' storage-class specifier illegal on function definition"
+2724 "'%Fs' : 'static' should not be used on member functions defined at file scope"
+
+2730 "'%Fs' : cannot be a base class of itself"
+2731 "'%Fs' : function cannot be overloaded"
+2732 "linkage specification contradicts earlier specification for %Fs"
+2733 "second C linkage of overloaded function '%Fs' not allowed"
+2734 "'%Fs' : const object must be initialized if not extern"
+2735 "'%Fs' keyword is not permitted in formal parameter type specifier"
+2736 "'%Fs' keyword is not permitted in cast"
+2737 "'%Fs' : base class '%Fs' must be exported"
+
+2750 "'%Fs' : 'const T' to 'T' : '%Fs' to '%Fs'"
+2751 "'%Fs' : 'volatile T' to 'T' : '%Fs' to '%Fs'"
+2752 "'%Fs' : 'const T *' to 'T *' : '%Fs' to '%Fs'"
+2753 "'%Fs' : 'volatile T *' to 'T *' : '%Fs' to '%Fs'"
+2754 "'%Fs' : 'const T **' to 'T **' : '%Fs' to '%Fs'"
+2755 "'%Fs' : 'volatile T **' to 'T **' : '%Fs' to '%Fs'"
+2756 "'%Fs' : 'memory model mismatch' : '%Fs' to '%Fs'"
+2757 "'%Fs' : 'language modifier mismatch: '%Fs' to '%Fs'"
+2758 "'%Fs' : must be initialized in constructor base/member initializer list"
+
+2800 "'operator %Fs' cannot be overloaded"
+2801 "'operator %Fs' must be a %Fs member"
+2802 "static member 'operator %Fs' has no formal parameters"
+2803 "'operator %Fs' must have at least one formal parameter of class type"
+2804 "binary 'operator %Fs' has too many parameters"
+2805 "binary 'operator %Fs' has too few parameters"
+2806 "'operator %Fs' has too many formal parameters"
+2807 "the second formal parameter to postfix 'operator %Fs' must be 'int'"
+2808 "unary 'operator %Fs' has too many formal parameters"
+2809 "'operator %Fs' has no formal parameters"
+2810 "second formal parameter for 'operator delete' must be 'unsigned int'"
+2811 "too many formal parameters for based form of 'operator delete'"
+2812 "second formal parameter required for based form of 'operator delete'"
+2813 "too many formal parameters for 'operator delete'"
+2814 "second actual parameter for based form of 'operator delete' must be '__based(void)*'"
+2815 "first actual parameter for based form of 'operator delete' must be '__segment'"
+2816 "alternative form of 'operator delete' must be a member"
+2817 "return type for 'operator delete' must be 'void'"
+2818 "incorrect return type for 'operator ->'"
+2819 "recursive return type for 'operator ->'"
+2820 "second formal parameter required for based form of 'operator new'"
+2821 "first formal parameter to 'operator new' must be 'unsigned int'"
+2822 "second formal parameter for huge form of 'operator new' must be 'unsigned int'"
+2823 "return type for based form of 'operator new' must be 'void __based(void)*'"
+2824 "return type for 'operator new' must be 'void *'"
+2825 "first formal parameter for huge form of 'operator new' must be 'unsigned long'"
+2826 "second formal parameter required for huge form of 'operator new'"
+2827 "'operator %s' cannot be globally overridden with unary form"
+2828 "'operator %s' cannot be globally overridden with binary form"
+2829 "'operator %Fs' cannot have a variable parameter list"
+2830 "only placement parameters to 'operator new' can have default values"
+2831 "'operator %Fs' cannot have default parameters"
+2832 "'%Fs' form of 'operator %Fs' cannot be a member"
+2833 "'operator %Fs' is not a recognized operator or type"
+2834 "'operator %Fs' must be globally qualified"
+2835 "user-defined conversion '%Fs' takes no formal parameters"
+2836 "cannot export '%Fs': a previous declaration did not export it"
+2837 "'%Fs' : illegal local static variable in exported inline function"
+2838 "illegal qualified name in member declaration"
+
+2850 "#pragma hdrstop cannot be nested in a function or definition"
+2851 "#pragma hdrstop required for /Yu command-line option without filename"
+2852 "'%Fs' is not a valid precompiled header file"
+2853 "'%Fs' is not a precompiled header file created with this compiler"
+2854 "syntax error in #pragma hdrstop"
+2855 "command-line option '%Fs' inconsistent with precompiled header"
+2856 "#pragma hdrstop cannot be inside an #if block"
+2857 "'#include' statement specified with the /Yc%Fs command-line option was not found in the source file"
+
+2900 "'%Fs' : huge array cannot be aligned to segment boundary"
+
+2910 "cannot call function from p-code with more than 255 bytes of arguments"
+2911 "cannot define p-code function with more than 255 bytes of parameters"
+
+2000 "UNKNOWN ERROR\n\t\tContact Microsoft Product Support Services"
+
+ /* fatals */
+
+1001 "internal compiler error\n\t\t(compiler file '%s', line %d)"
+
+1003 "error count exceeds %d; stopping compilation"
+1004 "unexpected end of file found"
+1005 "string too big for buffer"
+1006 "write error on compiler-generated file"
+1007 "unrecognized flag '%Fs' in '%Fs'"
+1008 "no input file specified"
+1009 "compiler limit : macros nested too deeply"
+1010 "unexpected end of file while looking for precompiled header directive"
+1011 "compiler limit : '%Fs' : macro definition too big"
+1012 "unmatched parenthesis : missing '%c'"
+1013 "compiler limit : too many open parentheses"
+1014 "too many include files : depth = %d"
+1015 "compiler limit : too many segments"
+1016 "#if[n]def expected an identifier"
+1017 "invalid integer constant expression"
+1018 "unexpected #elif"
+1019 "unexpected #else"
+1020 "unexpected #endif"
+1021 "invalid preprocessor command '%Fs'"
+1022 "expected #endif"
+1023 "cannot open source file '%Fs'"
+1024 "cannot open include file '%Fs'"
+1025 "compiler terminated by user" /* QC */
+1026 "parser stack overflow, program too complex"
+1027 "DGROUP data allocation exceeds 64K" /* QC, c23 */
+1028 "'%s' : segment allocation exceeds 64K" /* QC */
+1029 "there are more than 512 bytes of arguments"
+1030 "there are more than 512 bytes of local variables"
+1031 "compiler limit : function calls nested too deeply" /* QC, c23 */
+1032 "cannot open object code listing file '%s'" /* QC, c23 */
+
+1034 "%Fs: no include path set"
+1035 "expression too complex; simplify expression" /* QC, c23 */
+
+1037 "cannot open object file '%s'" /* QC, c23 */
+1038 "compiler limit : '%Fs' : control flow state too complex; simplify function"
+
+1041 "cannot open compiler intermediate file - no more files"
+1042 "cannot open compiler intermediate file - no such file or directory"
+1043 "cannot open compiler intermediate file"
+1044 "out of disk space for compiler intermediate file"
+1045 "compiler limit : linkage specifications nested too deeply"
+1046 "compiler limit : %Fs nested too deeply"
+1047 "limit of %Fs exceeded at '%Fs'"
+1048 "unknown option '%c' in '%s'"
+1049 "invalid numerical argument '%s'"
+1050 "'%Fs' : code segment too large"
+
+1052 "compiler limit : #if or #ifdef blocks nested too deeply"
+1053 "compiler limit : struct/union nested too deeply" /* QC 2.5 */
+1054 "compiler limit : initializers nested too deeply"
+1055 "compiler limit : out of keys"
+1056 "compiler limit : out of macro expansion space"
+1057 "unexpected end of file in macro expansion"
+1058 "compiler limit : too many formal arguments"
+1059 "compiler is out of near heap space"
+1060 "compiler is out of far heap space"
+1061 "compiler limit : blocks nested too deeply" /* QC */
+1062 "error while writing to preprocessor output file"
+1063 "compiler limit : compiler stack overflow"
+1064 "compiler limit : token overflowed internal buffer"
+1065 "compiler limit : out of tags"
+1066 "compiler limit : decorated name length exceeded"
+
+1068 "cannot open file '%Fs'"
+1069 "write error on file '%s'" /* QC */
+1070 "mismatched #if/#endif pair in file '%Fs'"
+1071 "unexpected end of file found in comment"
+1072 "'%Fs' : cannot read file"
+
+1082 "Cannot close %Fs file: '%Fs': %Fs (%Fs:%ld)"
+1083 "Cannot open %Fs file: '%Fs': %Fs"
+1084 "Cannot read %Fs file: '%Fs': %Fs"
+1085 "Cannot write %Fs file: '%Fs': %Fs (%Fs:%ld)"
+1086 "Cannot seek %Fs file: '%Fs': %Fs (%Fs:%ld)"
+1087 "Cannot tell %Fs file: '%Fs': %Fs (%Fs:%ld)"
+1088 "Cannot flush %Fs file: '%Fs': %Fs (%Fs:%ld)"
+
+1090 "data allocation exceeds 64K" /* QC, c23 */
+
+1126 "'%Fs' : automatic allocation exceeds %s" /* QC, c23 */
+1127 "'%Fs' : segment redefinition"
+
+1500 "'%Fs' : cannot open inline function definition file"
+1501 "compiler limit : too many temporary variables"
+1502 "inline member-function definition missing '}'"
+1503 "default parameter definition missing ',' or ')'"
+1504 "type still ambiguous after parsing %d tokens, unable to recover"
+1505 "unrecoverable parser look-ahead error"
+1506 "unrecoverable block scoping error"
+1507 "previous user errors and subsequent error recovery halt further compilation"
+
+1700 "%Fs compiler is out of far heap space" /* QC, c23 */
+
+1852 "'%Fs' is not a valid precompiled header file"
+1853 "'%Fs' is not a precompiled header file created with this compiler"
+1855 "command-line option '%Fs' inconsistent with precompiled header"
+
+1900 "Il mismatch between '%s' version '%ld' and '%s' version '%ld'"
+1000 "UNKNOWN FATAL ERROR\n\t\tContact Microsoft Product Support Services"
diff --git a/private/oleauto/tools/win16/hdos/c800/bin/c23.err b/private/oleauto/tools/win16/hdos/c800/bin/c23.err
new file mode 100644
index 000000000..f560113bb
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/bin/c23.err
@@ -0,0 +1,99 @@
+ /* fatals */
+
+1001 "internal compiler error\n\t\t(compiler file '%s', line %d)"
+1002 "compiler is out of heap space in pass 2"
+1003 "error count exceeds %d; stopping compilation"
+1004 "unexpected end-of-file found"
+1005 "string too big for buffer"
+1006 "write error on compiler intermediate file"
+1007 "unrecognized flag '%s' in '%s'"
+1013 "cannot open source file '%s'"
+1015 "compiler limit : too many segments"
+1027 "DGROUP data allocation exceeds 64K"
+1029 "there are > 512 bytes of arguments"
+1030 "there are > 512 bytes of local variables"
+1032 "cannot open object listing file '%s'"
+1033 "cannot open assembly language output file '%s'"
+1035 "expression too complex, please simplify"
+1036 "cannot open source listing file '%s'"
+1037 "cannot open object file '%s'"
+1039 "unrecoverable heap overflow in pass 3"
+1040 "unexpected end-of-file in source file '%s'"
+1041 "cannot open compiler intermediate file - no more files"
+1042 "cannot open compiler intermediate file - no such file or directory"
+1043 "cannot open compiler intermediate file"
+1044 "out of disk space for compiler intermediate file"
+1045 "floating-point overflow"
+1048 "unknown option '%c' in '%s'"
+1049 "invalid numerical argument '%s'"
+1050 "'%s' : code segment too large"
+
+1055 "compiler limit : out of keys"
+1067 "intrinsic not implemented"
+1073 "bad '%s' flag, would overwrite '%s' with '%s'"
+1074 "too many '%s' flags, '%s'"
+1083 "Cannot open %Fs file: '%Fs': %Fs"
+1084 "Cannot read %Fs file: '%Fs': %Fs"
+1085 "Cannot write %Fs file: '%Fs': %Fs"
+1090 "'%s' data allocation exceeds 64K"
+1126 "'%s' : automatic allocation exceeds %s"
+1127 "'%s' : segment redefinition"
+1900 "Il mismatch between '%s' version '%ld' and '%s' version '%ld'"
+1000 "UNKNOWN FATAL ERROR\n\t\tContact Microsoft Product Support Services"
+
+ /* errors */
+
+2125 "'%s' : allocation exceeds 64K"
+2127 "parameter allocation exceeds 32K"
+2129 "static function '%s' not found"
+2220 "warning treated as error - no object file generated"
+2374 "'%s' redefinition; multiple initialization"
+2418 "'%s' : not in a register"
+2427 "'%s' : jump referencing label is out of range"
+2900 "'%s' : huge array cannot be aligned to segment boundary"
+2000 "UNKNOWN ERROR\n\t\tContact Microsoft Product Support Services"
+
+ /* warnings */
+
+4700 "local variable '%s' used without having been initialized"
+4701 "local variable '%s' may be used without having been initialized"
+4702 "unreachable code"
+4703 "'%s' : function too large for global optimizations"
+4704 "'%s' : in-line assembler precludes global optimizations"
+4705 "statement has no effect"
+4706 "assignment within conditional expression"
+4707 "'%s' : function too large for global optimizations (%s)" /* internal use */
+4708 "ran out of heap at: %s" /* internal use */
+4709 "comma operator within array index expression"
+4710 "function '%s' not expanded"
+4711 "function '%s' selected for automatic inline expansion"
+4712 "'%s' : used as register - loss of debugging information"
+4713 "%s: internal compiler error; restarting\n\t\t(compiler file '%s', line %d)"
+4723 "potential divide by 0"
+4724 "potential mod by 0"
+4726 "'%c' : unknown memory-model command-line option"
+4727 "conditional expression is constant"
+4746 "'%s' : unsized array treated as '%s'"
+4756 "overflow in constant arithmetic"
+4757 "overflow in constant multiplication"
+4758 "address of automatic (local) variable taken, DS != SS"
+4759 "segment lost in conversion"
+4760 "'%Fs' : segment lost in initialization"
+4761 "integral size mismatch in argument; conversion supplied"
+4762 "near/far mismatch in argument : conversion supplied"
+4763 "'%s' : function too large for post-optimizer"
+4765 "recoverable heap overflow in post-optimizer - some optimizations may be missed"
+4766 "local symbol table overflow - some local symbols may be missing in listings"
+4769 "conversion of near pointer to long integer"
+4772 "'%s' : too many debug entry points, maximum %d"
+4773 "scoping too deep, deepest scoping merged when debugging"
+4785 "near call to '%s' in different segment"
+4786 "string too long - truncated to %d characters"
+4787 "unprototyped function '%s' called in exception"
+4788 "'%Fs' : identifier was truncated to '%d' characters"
+4790 "insufficient memory to process debugging information"
+4791 "loss of debugging information caused by optimization"
+4792 "long double type not supported by alternate math library"
+4900 "Il mismatch between '%s' version '%ld' and '%s' version '%ld'"
+
+4000 "UNKNOWN WARNING\n\t\tContact Microsoft Product Support Services"
diff --git a/private/oleauto/tools/win16/hdos/c800/bin/cl.err b/private/oleauto/tools/win16/hdos/c800/bin/cl.err
new file mode 100644
index 000000000..ff942a472
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/bin/cl.err
@@ -0,0 +1,43 @@
+ /* error messages */
+
+2001 "too many symbols predefined with /D"
+2002 "memory-model conflict"
+2003 "missing source filename"
+2005 "%s requires /vmg"
+2008 "limit of %s exceeded at '%s'"
+2011 "only one floating-point option allowed"
+2012 "too many linker arguments"
+2013 "incomplete model specification"
+2016 "%s and %s command-line options are incompatible"
+2018 "cannot create linker response file"
+2019 "cannot overwrite source or object file '%s'"
+2020 "%s option requires extended keywords to be enabled (/Ze)"
+2021 "invalid numeric argument '%s'"
+2022 "cannot open '%s'"
+2023 "invalid model specification - flat model only"
+2027 "cannot execute '%s'"
+2028 "too many open files; cannot redirect '%s'"
+2030 "internal compiler error in '%s'"
+2031 "too many command-line options"
+2000 "unknown command-line error"
+
+ /* warning messages */
+
+4001 "listing overrides assembly output"
+4002 "ignoring unknown option '%s'"
+4003 "processor-option conflict"
+4004 "/G3 only available in optimizing compiler; assuming /G2"
+4005 "cannot find '%s';\nPlease enter new filename (full path) or CTRL+C to quit: "
+4007 "'%s' requires '%s'; option ignored"
+4009 "threshold only for far or huge data; ignored"
+4011 "preprocessing overrides source listing"
+4012 "function declarations override source listing"
+4013 "combined listing overrides object listing"
+4014 "invalid value '%d' for '%s'; assuming '%d'"
+4018 ".DEF files supported for segmented executable files only"
+4019 "string too long; truncated to %d characters"
+4020 "'%s' : missing argument; option ignored"
+4021 "no action performed"
+4022 "option '%s' invalid for %d-bit target"
+4023 "option '%s' forces use of optimizing compiler"
+4000 "unknown command-line warning"
diff --git a/private/oleauto/tools/win16/hdos/c800/bin/cl.msg b/private/oleauto/tools/win16/hdos/c800/bin/cl.msg
new file mode 100644
index 000000000..e6a82388c
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/bin/cl.msg
@@ -0,0 +1,139 @@
+C COMPILER OPTIONS
+-MEMORY MODEL-
+/AS small model (default)
+/AC compact model
+/AM medium model
+/AL large model
+/AH huge model
+/AT tiny model (.COM files)
+/A<string> (custom memory model)
+-OPTIMIZATION-
+/O enable optimization (same as /Ot)
+/O1 minimize space
+/O2 maximize speed
+/Oa assume no aliasing
+/Ob<n> inline expansion (default n=0)
+/Oc local common subexpression opt.
+/Od disable optimization (default)
+/Oe enable registers allocation
+/Of[-] toggle p-code quoting
+/Og global common subexpression opt.
+/Oi enable intrinsic functions
+/Ol enable loop optimizations
+/On disable "unsafe" optimizations
+/Oo[-] toggle post code-gen. opt.
+/Op[-] improve floating-pt consistency
+/Oq enable maximum p-code optimization
+/Or gen. common exit code (CodeView)
+/Os favor code size
+/Ot favor code speed
+/Ov[-] toggle p-code frame sorting
+/OV<n> control inlining by func. size
+/Ow assume cross-function aliasing
+/Ox maximum opts. (/Ob1cegilnot /Gs)
+/Oz enable "unsafe" optimizations
+-CODE GENERATION-
+/G0 8086 instructions (default)
+/G1 186 instructions
+/G2 286 instructions
+/G3 386 instructions
+/GA protected-mode Win entry/exit code
+/GD protected-mode Win entry/exit code
+/GE<x> customize Windows entry/exit
+/Gq backwards compatibility with v. 6
+/Gc Pascal style calling conventions
+/Gd C style calling conventions
+/Ge use stack-check calls
+/Gf enable string pooling
+/Gs remove stack-check calls
+/Gn remove p-code native entry points
+/Gp<num> specify p-code entry tables
+/Gr _fastcall style calling convention
+/Gt[num] data size threshold
+/GW real-mode Windows entry/exit code
+/Gw real-mode Windows entry/exit code
+/Gx assume that data is near
+/Gx- assume that data is far
+/Gy separate functions for linker
+/Zr check null pointers (/f only)
+-OUTPUT FILES-
+/Fa[file] name assembly listing file
+/Fc[file] name source/object listing
+/Fd[file] name .PDB filename
+/Fe<file> name executable filename
+/Fl[file] name object listing filename
+/Fm[file] name map filename
+/Fo<file> name object filename
+/Fr[file] name .SBR filename
+/Fp<file> name .PCH filename
+/FR[file] name extended .SBR filename
+/Fs[file] name source listing filename
+-PREPROCESSOR-
+/C don't strip comments
+/D<name>[=|#text] define macro
+/E preprocess to stdout
+/EP same as /E but no #line
+/I<directory> add #include path
+/P preprocess to file
+/U<name> remove predefined macro
+/u remove all defined macros
+/X ignore "standard places"
+-LANGUAGE-
+/vd{0|1} disable/enable vtordisp
+/vm<x> type of pointers to members
+/Z7 C 7 style CodeView information
+/Za disable extensions (implies /Op)
+/Zd line number information
+/Ze enable extensions (default)
+/Zg generate function prototypes
+/Zi prepare for debugging (CodeView)
+/Zl omit default library name in .OBJ
+/Zp[n] pack structs on n-byte boundary
+/Zs check syntax only
+-FLOATING POINT-
+/FPa calls with altmath
+/FPc calls with emulator
+/FPc87 calls with 8087 library
+/FPi inline with emulator (default)
+/FPi87 inline with 8087
+-SOURCE LISTING-
+/Sl<columns> set line width
+/Sp<lines> set page length
+/St<string> set title string
+/Ss<string> set subtitle string
+-MISCELLANEOUS-
+/batch specify batch mode compilation
+/Bm<num> set compiler's available mem.
+/c compile only, no link
+/H<num> external name length
+/J default char type is unsigned
+/f select fast compiler (default)
+/f- select optimizing compiler
+/Yc create .PCH file
+/Yd put debug info in .PCH file
+/Yu use .PCH file
+/YX automatic precompiled header
+/nologo suppress copyright message
+/Mq compile for QuickWin
+/ND<name> name data segment
+/NM<name> name code segment
+/NQ<name> combine p-code temp segments
+/NT<name> name code segment
+/NV<name> name far v-table segment
+/Tc<file> compile file without .c
+/Tp<file> compile file without .cpp
+/V<string> set version string
+/W<n> warning level (default n=1)
+/w disable all warnings
+/WX treat all warnings as errors
+/Zn turn off SBRPACK for .SBR files
+-MASM SUPPORT-
+/MA<MASM switch>
+/Ta<file> assemble file without .asm
+-LINKING-
+/F <hex_num> stack size (hex. bytes)
+/Lr append 'r' to default lib in .OBJ
+/link [lib] give lib name to linker
+/Ln do not link CRT.LIB
+/Ld select dynamically-linked library
+/Lw select statically-linked library
diff --git a/private/oleauto/tools/win16/hdos/c800/include/assert.h b/private/oleauto/tools/win16/hdos/c800/include/assert.h
new file mode 100644
index 000000000..b57c7b245
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/assert.h
@@ -0,0 +1,35 @@
+/***
+*assert.h - define the assert macro
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines the assert(exp) macro.
+* [ANSI/System V]
+*
+****/
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#undef assert
+
+#ifdef NDEBUG
+
+#define assert(exp) ((void)0)
+
+#else
+#ifdef __cplusplus
+extern "C" {
+#endif
+void __cdecl _assert(void *, void *, unsigned);
+#ifdef __cplusplus
+}
+#endif
+
+#define assert(exp) \
+ ( (exp) ? (void) 0 : _assert(#exp, __FILE__, __LINE__) )
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/bios.h b/private/oleauto/tools/win16/hdos/c800/include/bios.h
new file mode 100644
index 000000000..c3a7d1276
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/bios.h
@@ -0,0 +1,244 @@
+/***
+*bios.h - declarations for bios interface functions and supporting definitions
+*
+* Copyright (c) 1987-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file declares the constants, structures, and functions
+* used for accessing and using various BIOS interfaces.
+*
+****/
+
+#ifndef _INC_BIOS
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _MT
+
+/* manifest constants for BIOS serial communications (RS-232) support */
+
+/* serial port services */
+
+#define _COM_INIT 0 /* init serial port */
+#define _COM_SEND 1 /* send character */
+#define _COM_RECEIVE 2 /* receive character */
+#define _COM_STATUS 3 /* get serial port status */
+
+/* serial port initializers. One and only one constant from each of the
+ * following four groups - character size, stop bit, parity, and baud rate -
+ * must be specified in the initialization byte.
+ */
+
+/* character size initializers */
+
+#define _COM_CHR7 2 /* 7 bits characters */
+#define _COM_CHR8 3 /* 8 bits characters */
+
+/* stop bit values - on or off */
+
+#define _COM_STOP1 0 /* 1 stop bit */
+#define _COM_STOP2 4 /* 2 stop bits */
+
+/* parity initializers */
+
+#define _COM_NOPARITY 0 /* no parity */
+#define _COM_ODDPARITY 8 /* odd parity */
+#define _COM_EVENPARITY 24 /* even parity */
+
+/* baud rate initializers */
+
+#define _COM_110 0 /* 110 baud */
+#define _COM_150 32 /* 150 baud */
+#define _COM_300 64 /* 300 baud */
+#define _COM_600 96 /* 600 baud */
+#define _COM_1200 128 /* 1200 baud */
+#define _COM_2400 160 /* 2400 baud */
+#define _COM_4800 192 /* 4800 baud */
+#define _COM_9600 224 /* 9600 baud */
+
+
+/* manifest constants for BIOS disk support */
+
+/* disk services */
+
+#define _DISK_RESET 0 /* reset disk controller */
+#define _DISK_STATUS 1 /* get disk status */
+#define _DISK_READ 2 /* read disk sectors */
+#define _DISK_WRITE 3 /* write disk sectors */
+#define _DISK_VERIFY 4 /* verify disk sectors */
+#define _DISK_FORMAT 5 /* format disk track */
+
+/* struct used to send/receive information to/from the BIOS disk services */
+
+#ifndef _DISKINFO_T_DEFINED
+#pragma pack(2)
+
+struct _diskinfo_t {
+ unsigned drive;
+ unsigned head;
+ unsigned track;
+ unsigned sector;
+ unsigned nsectors;
+ void __far *buffer;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+#define diskinfo_t _diskinfo_t
+#endif
+
+#pragma pack()
+#define _DISKINFO_T_DEFINED
+#endif
+
+
+/* manifest constants for BIOS keyboard support */
+
+/* keyboard services */
+
+#define _KEYBRD_READ 0 /* read next character from keyboard */
+#define _KEYBRD_READY 1 /* check for keystroke */
+#define _KEYBRD_SHIFTSTATUS 2 /* get current shift key status */
+
+/* services for enhanced keyboards */
+
+#define _NKEYBRD_READ 0x10 /* read next character from keyboard */
+#define _NKEYBRD_READY 0x11 /* check for keystroke */
+#define _NKEYBRD_SHIFTSTATUS 0x12 /* get current shift key status */
+
+
+/* manifest constants for BIOS printer support */
+
+/* printer services */
+
+#define _PRINTER_WRITE 0 /* write character to printer */
+#define _PRINTER_INIT 1 /* intialize printer */
+#define _PRINTER_STATUS 2 /* get printer status */
+
+
+/* manifest constants for BIOS time of day support */
+
+/* time of day services */
+
+#define _TIME_GETCLOCK 0 /* get current clock count */
+#define _TIME_SETCLOCK 1 /* set current clock count */
+
+
+#ifndef _REGS_DEFINED
+
+/* word registers */
+
+struct _WORDREGS {
+ unsigned int ax;
+ unsigned int bx;
+ unsigned int cx;
+ unsigned int dx;
+ unsigned int si;
+ unsigned int di;
+ unsigned int cflag;
+ };
+
+/* byte registers */
+
+struct _BYTEREGS {
+ unsigned char al, ah;
+ unsigned char bl, bh;
+ unsigned char cl, ch;
+ unsigned char dl, dh;
+ };
+
+/* general purpose registers union -
+ * overlays the corresponding word and byte registers.
+ */
+
+union _REGS {
+ struct _WORDREGS x;
+ struct _BYTEREGS h;
+ };
+
+/* segment registers */
+
+struct _SREGS {
+ unsigned int es;
+ unsigned int cs;
+ unsigned int ss;
+ unsigned int ds;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+struct WORDREGS {
+ unsigned int ax;
+ unsigned int bx;
+ unsigned int cx;
+ unsigned int dx;
+ unsigned int si;
+ unsigned int di;
+ unsigned int cflag;
+ };
+
+struct BYTEREGS {
+ unsigned char al, ah;
+ unsigned char bl, bh;
+ unsigned char cl, ch;
+ unsigned char dl, dh;
+ };
+
+union REGS {
+ struct WORDREGS x;
+ struct BYTEREGS h;
+ };
+
+struct SREGS {
+ unsigned int es;
+ unsigned int cs;
+ unsigned int ss;
+ unsigned int ds;
+ };
+
+#endif
+
+#define _REGS_DEFINED
+#endif
+
+
+/* function prototypes */
+
+#ifndef _WINDOWS
+unsigned __cdecl _bios_disk(unsigned, struct _diskinfo_t *);
+#endif
+unsigned __cdecl _bios_equiplist(void);
+#ifndef _WINDOWS
+unsigned __cdecl _bios_keybrd(unsigned);
+#endif
+unsigned __cdecl _bios_memsize(void);
+#ifndef _WINDOWS
+unsigned __cdecl _bios_printer(unsigned, unsigned, unsigned);
+unsigned __cdecl _bios_serialcom(unsigned, unsigned, unsigned);
+#endif
+unsigned __cdecl _bios_timeofday(unsigned, long *);
+int __cdecl _int86(int, union _REGS *, union _REGS *);
+int __cdecl _int86x(int, union _REGS *, union _REGS *, struct _SREGS *);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+int __cdecl int86(int, union REGS *, union REGS *);
+int __cdecl int86x(int, union REGS *, union REGS *, struct SREGS *);
+#endif
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_BIOS
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/cderr.h b/private/oleauto/tools/win16/hdos/c800/include/cderr.h
new file mode 100644
index 000000000..402ac0956
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/cderr.h
@@ -0,0 +1,58 @@
+/*****************************************************************************\
+* *
+* cderr.h - Common dialog error return codes *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_CDERR
+#define _INC_CDERR
+
+#define CDERR_DIALOGFAILURE 0xFFFF
+
+#define CDERR_GENERALCODES 0x0000
+#define CDERR_STRUCTSIZE 0x0001
+#define CDERR_INITIALIZATION 0x0002
+#define CDERR_NOTEMPLATE 0x0003
+#define CDERR_NOHINSTANCE 0x0004
+#define CDERR_LOADSTRFAILURE 0x0005
+#define CDERR_FINDRESFAILURE 0x0006
+#define CDERR_LOADRESFAILURE 0x0007
+#define CDERR_LOCKRESFAILURE 0x0008
+#define CDERR_MEMALLOCFAILURE 0x0009
+#define CDERR_MEMLOCKFAILURE 0x000A
+#define CDERR_NOHOOK 0x000B
+#define CDERR_REGISTERMSGFAIL 0x000C
+
+#define PDERR_PRINTERCODES 0x1000
+#define PDERR_SETUPFAILURE 0x1001
+#define PDERR_PARSEFAILURE 0x1002
+#define PDERR_RETDEFFAILURE 0x1003
+#define PDERR_LOADDRVFAILURE 0x1004
+#define PDERR_GETDEVMODEFAIL 0x1005
+#define PDERR_INITFAILURE 0x1006
+#define PDERR_NODEVICES 0x1007
+#define PDERR_NODEFAULTPRN 0x1008
+#define PDERR_DNDMMISMATCH 0x1009
+#define PDERR_CREATEICFAILURE 0x100A
+#define PDERR_PRINTERNOTFOUND 0x100B
+#define PDERR_DEFAULTDIFFERENT 0x100C
+
+#define CFERR_CHOOSEFONTCODES 0x2000
+#define CFERR_NOFONTS 0x2001
+#define CFERR_MAXLESSTHANMIN 0x2002
+
+#define FNERR_FILENAMECODES 0x3000
+#define FNERR_SUBCLASSFAILURE 0x3001
+#define FNERR_INVALIDFILENAME 0x3002
+#define FNERR_BUFFERTOOSMALL 0x3003
+
+#define FRERR_FINDREPLACECODES 0x4000
+#define FRERR_BUFFERLENGTHZERO 0x4001
+
+#define CCERR_CHOOSECOLORCODES 0x5000
+
+#endif /* !_INC_CDERR */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/cmacros.inc b/private/oleauto/tools/win16/hdos/c800/include/cmacros.inc
new file mode 100644
index 000000000..eb7dfad7b
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/cmacros.inc
@@ -0,0 +1,1410 @@
+comment $
+cmacros - assembly macros for interfacing to hlls
+(C)Copyright Microsoft Corp. 1984-1988
+$
+.xcref
+.xcref ??_out
+??_out macro t
+ifndef ?QUIET
+%out t
+endif
+endm
+outif macro name,defval,onmsg,offmsg
+ifndef name
+ifb <defval>
+name=0
+else
+name=defval
+endif
+endif
+if name
+name=1
+ifnb <onmsg>
+??_out <! onmsg>
+endif
+else
+ifnb <offmsg>
+??_out <! offmsg>
+endif
+endif
+endm
+.xcref ??error
+??error macro msg
+e r r o r ----- msg
+.err
+endm
+.xcref ASMpass
+.xcref memS,memM,memL,memC,memH,memMOD,sizec,sized
+if1
+ASMpass=1
+ifdef ?SMALL
+memS=1
+endif
+ifdef ?MEDIUM
+memM=1
+endif
+ifdef ?COMPACT
+memC=1
+endif
+ifdef ?LARGE
+memL=1
+endif
+ifdef ?HUGE
+memH=1
+endif
+??_out <cMacros Version 5.20 - Copyright (c) Microsoft Corp. 1984-1988>
+outif memS,0,<Small model>
+outif memM,0,<Medium model>
+outif memL,0,<Large model>
+outif memC,0,<Compact model>
+outif memH,0,<Huge model>
+memMOD= memS + memM + memL + memC + memH
+if memMOD ne 1
+if memMOD eq 0
+memS = 1
+else
+??error <more than 1 memory model selected>
+endif
+endif
+sizec= memM + memL + memH
+sized= memL + memC + (memH*2)
+outif ?DF,0,<No segments or groups will be defined>
+outif ?TF,0,<Epilog sequences assume valid SP>
+outif ?WIN,1,<Windows support>
+ifdef PMODE
+?pmd=1
+??_out <! 286 protect mode>
+else
+?pmd=0
+endif
+ifdef ?386regs
+if ?386regs
+??_out <! 386 registers enabled>
+endif
+else
+?386regs=0
+endif
+if ?WIN eq 1
+outif ?PLM,1,<>
+else
+outif ?PLM,1,<Pascal calling convention>
+endif
+ifndef ?NODATA
+?nodata1=0
+else
+?nodata1=1
+??_out <! NODATA module>
+endif
+ifndef ?CHKSTK
+?chkstk1=0
+else
+?chkstk1=1
+ifdef ?CHKSTKPROC
+??_out <! Private stack checking enabled>
+else
+??_out <! Stack checking enabled>
+endif
+endif
+ifndef DOS5
+?DOS5=0
+else
+?DOS5=1
+??_out <! DOS5 module>
+endif
+ifdef ?PROFILE
+??_out <! Native profiling enabled>
+endif
+else
+ASMpass=2
+endif
+ifdef ?pmd
+.286p
+endif
+if ?386regs
+.xcref ?n,?ax,?eax,?bx,?ebx
+.xcref ?cx,?ecx,?dx,?edx
+.xcref ?si,?esi,?di,?edi,?es,?ds,?fs
+.xcref ?gs
+else
+.xcref ?n,?ax,?ah,?al,?bx,?bh
+.xcref ?bl,?cx,?ch,?cl,?dx,?dh
+.xcref ?dl,?si,?di,?es,?ds,?bp
+.xcref ?sp,?ss,?cs
+endif
+.xcref ?rsl,?cpd,?argl,?argc,?ba
+.xcref ?acb,???,?po
+.xcref ?pas,?pc
+.xcref uconcat,mpush,mpop
+.xcref ?ri,?pp,?pp1,?al1
+.xcref ?ad,?ap,?atal,?dd,?dd1,?dd2
+.xcref ?pg,?pg1,?aloc,?cs1,?cs2
+.xcref ?DF,?TF,?ff,?PLM,?WIN,?ia,?pu,?adj
+.xcref ?uf,?rp,?nx,?nd,?nodata1,?chkstk1,?DOS5,?pmd,?lds,?exp
+.xcref ?wfp,arg,cCall,cProc,assumes,?cs3,?cs2,?cs1
+.xcref defgrp,addseg,createSeg
+.xcref save,outif,errnz,errn$,errnz1
+.xcref ?PLMPrevParm,?gcc
+.xcref ?cCall1,?pcc
+?rsl = 0
+?cpd = 0
+?argl = 0
+?argc = 0
+?ba = 0
+?acb = 0
+??? = 0
+?po = 0
+?pas = 0
+?pc = 0
+?ia = 0
+?pu = 0
+?adj = 0
+?rp = 0
+?uf = 0
+?nd = 0
+?nx = 0
+?wfp = 0
+?lds = 0
+?exp = 0
+?ff = 0
+?dd2 = 0
+?cCall1 = 0
+?pcc = 0
+?PLMPrevParm = 0
+.xcref ?casen
+if1
+?casen = 0
+endif
+if ?386regs
+?n = 0000000000000000b
+?ax = 0000000000000001b
+?eax = 0000000000000010b
+?bx = 0000000000000100b
+?ebx = 0000000000001000b
+?cx = 0000000000010000b
+?ecx = 0000000000100000b
+?dx = 0000000001000000b
+?edx = 0000000010000000b
+?si = 0000000100000000b
+?esi = 0000001000000000b
+?di = 0000010000000000b
+?edi = 0000100000000000b
+?ds = 0001000000000000b
+?es = 0010000000000000b
+?fs = 0100000000000000b
+?gs = 1000000000000000b
+else
+?n = 0000000000000000b
+?ax = 0000000000000011b
+?ah = 0000000000000001b
+?al = 0000000000000010b
+?bx = 0000000000001100b
+?bh = 0000000000000100b
+?bl = 0000000000001000b
+?cx = 0000000000110000b
+?ch = 0000000000010000b
+?cl = 0000000000100000b
+?dx = 0000000011000000b
+?dh = 0000000001000000b
+?dl = 0000000010000000b
+?si = 0000000100000000b
+?di = 0000001000000000b
+?es = 0000010000000000b
+?ds = 0000100000000000b
+?bp = 0001000000000000b
+?sp = 0010000000000000b
+?ss = 0100000000000000b
+?cs = 1000000000000000b
+endif
+.cref
+uconcat macro a,b,c,d,e,f,g
+a&b c&d e&f&g
+endm
+if ?386regs
+mpush macro r
+irp x,<ax,eax,bx,ebx,cx,ecx,dx,edx,si,esi,di,edi,ds,es,fs,gs>
+if (r and ?&&x)
+ push x
+endif
+endm
+endm
+else
+mpush macro r
+irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
+if (r and ?&&x)
+ push x
+endif
+endm
+endm
+endif
+if ?386regs
+mpop macro r
+irp x,<gs,fs,es,ds,edi,di,esi,si,edx,dx,ecx,cx,ebx,bx,eax,ax>
+if (r and ?&&x)
+ pop x
+endif
+endm
+endm
+else
+mpop macro r
+irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
+if (r and ?&&x)
+ pop x
+endif
+endm
+endm
+endif
+save macro r
+?rsl=0
+?ri ?rsl,<r>
+endm
+?ri macro n,r
+irp x,<r>
+.ERRNDEF ?&&x
+n=n or ?&&x
+endm
+endm
+.xcref
+.xcref parmB,parmW,parmD,parmQ,parmT,parmCP,parmDP
+.cref
+parmB macro n
+?pp <n>,<byte>,2,1
+endm
+parmW macro n
+?pp <n>,<word>,2,2
+endm
+parmD macro n
+ife ?PLM
+irp x,<n>
+?pp <&&x>,<dword>,0,4
+?pp <off_&&x>,<word>,2,2
+?pp <seg_&&x>,<word>,2,2
+endm
+else
+irp x,<n>
+?pp <seg_&&x>,<word>,2,2
+?pp <off_&&x>,<word>,2,2
+?pp <&&x>,<dword>,0,4
+endm
+endif
+endm
+parmQ macro n
+?pp <n>,<qword>,8,8
+endm
+parmT macro n
+?pp <n>,<tbyte>,10,10
+endm
+if sizec
+parmCP macro n
+parmD <n>
+endm
+else
+parmCP macro n
+parmW <n>
+endm
+endif
+if sized
+parmDP macro n
+parmD <n>
+endm
+else
+parmDP macro n
+parmW <n>
+endm
+endif
+?pp macro n,t,l,s
+if ?cpd
+.xcref
+irp x,<n>
+.xcref ?t&&x
+?t&&x=s
+ife ?PLM
+?pp1 x,<t>,,,%(?po+?adj)
+?po=?po+l
+else
+?PLMPrevParm=?PLMPrevParm+1
+?po=?po+l
+?pp1 x,<t>,%?po,%?adj,,%?PLMPrevParm,%(?PLMPrevParm-1)
+endif
+endm
+.cref
+else
+??error <parm(s) "&n" declared outside proc def>
+endif
+endm
+?pp1 macro n,t,o,a,b,cpc,ppc
+ife ?PLM
+n equ (t ptr [bp+b])
+else
+.xcref
+.xcref ?PLMParm&cpc
+.cref
+?PLMParm&cpc &macro po
+uconcat <n>,,<equ>,,<(t ptr [bp+>,%(a+po-o),<])>
+?PLMParm&ppc po
+purge ?PLMParm&cpc
+&endm
+endif
+endm
+ifndef ?NOPARMR
+if ?pmd
+parmR macro n,r,r2
+??error <Sorry: ParmR can't be used with PMODE=1>
+endm
+else
+.xcref
+.xcref ?pr,parmR
+.cref
+parmR macro n,r,r2
+?pr n,r,r2,%?rp,%(?ia+2)
+endm
+?pr macro n,r,r2,i,o
+.xcref
+ifnb <r2>
+parmR seg_&n,r
+parmR off_&n,r2
+n equ (dword ptr [bp-o-2])
+.xcref ?t&n
+?t&n=4
+else
+.xcref ?rp&i
+?rp&i=0
+ifdef ?&r
+?rp&i=?&r
+endif
+if ??? or (?cpd eq 0) or (?rp&i eq 0)
+??error <invalid parmR encountered: &n,&r>
+exitm
+endif
+n equ (word ptr [bp-o])
+?t&n=2
+irp x,<bh,ch,dh,bl,cl,dl,ah,al>
+if ?&&x eq ?&r
+n equ (byte ptr [bp-o])
+?t&n=1
+exitm
+endif
+endm
+?ia=?ia+2
+?rp=?rp+1
+endif
+.cref
+endm
+endif
+endif
+.xcref
+.xcref localB,localW,localD,localQ,localT,localCP,localDP,localV
+.cref
+localB macro n
+?aloc <n>,<byte ptr>,1,1,0
+endm
+localW macro n
+?aloc <n>,<word ptr>,2,2,1
+endm
+localD macro n
+irp x,<n>
+?aloc <seg_&&x>,<word ptr>,2,2,1
+?aloc <off_&&x>,<word ptr>,2,2,1
+?aloc <&&x>,<dword ptr>,0,4,1
+endm
+endm
+localQ macro n
+?aloc <n>,<qword ptr>,8,8,1
+endm
+localT macro n
+?aloc <n>,<tbyte ptr>,10,10,1
+endm
+if sizec
+localCP macro n
+localD <n>
+endm
+else
+localCP macro n
+localW <n>
+endm
+endif
+if sized
+localDP macro n
+localD <n>
+endm
+else
+localDP macro n
+localW <n>
+endm
+endif
+localV macro n,a
+?aloc <n>,,%(a),0,1
+endm
+?aloc macro n,t,l,s,a
+if ?cpd
+.xcref
+irp x,<n>
+???=???+l
+if a
+???=((??? + 1) and 0fffeh)
+endif
+?al1 x,<t>,%(???+?ia)
+.xcref ?t&&x
+?t&&x=s
+endm
+.cref
+else
+??error <locals "&n" declared outside procedure def>
+endif
+endm
+?al1 macro n,t,o
+n equ (t [bp-o])
+endm
+?gcc macro s,i,cc
+s = i
+ifnb <cc>
+ifidn <cc>,<C>
+s=0
+endif
+ifidn <cc>,<PLM>
+s=1
+endif
+ifidn <cc>,<PASCAL>
+s=1
+endif
+endif
+endm
+ifndef ?NOGLOBAL
+.xcref
+.xcref globalB,globalW,globalD,globalQ,globalT,globalCP,globalDP
+.cref
+globalB macro n,i,s,c
+?ad <n>,1
+?dd n,1,<byte>,<db>,<i>,<s>,<c>
+endm
+globalW macro n,i,s,c
+?ad <n>,2
+?dd n,1,<word>,<dw>,<i>,<s>,<c>
+endm
+globalD macro n,i,s,c
+?ad <n>,4
+?dd n,1,<dword>,<dd>,<i>,<s>,<c>
+off_&n equ n
+seg_&n equ n[2]
+endm
+globalQ macro n,i,s,c
+?ad <n>,8
+?dd n,1,<qword>,<dq>,<i>,<s>,<c>
+endm
+globalT macro n,i,s,c
+?ad <n>,10
+?dd n,1,<tbyte>,<dt>,<i>,<s>,<c>
+endm
+if sizec
+globalCP macro n,i,s,c
+globalD n,<i>,<s>,<c>
+endm
+else
+globalCP macro n,i,s,c
+globalW n,<i>,<s>,<c>
+endm
+endif
+if sized
+globalDP macro n,i,s,c
+globalD n,<i>,<s>,<c>
+endm
+else
+globalDP macro n,i,s,c
+globalW n,<i>,<s>,<c>
+endm
+endif
+endif
+ifndef ?NOSTATIC
+.xcref
+.xcref staticB,staticW,staticD,staticQ,staticT,staticCP,staticDP
+.cref
+staticB macro n,i,s
+?ad <n>,1
+?dd n,0,<byte>,<db>,<i>,<s>,<PLM>
+endm
+staticW macro n,i,s
+?ad <n>,2
+?dd n,0,<word>,<dw>,<i>,<s>,<PLM>
+endm
+staticD macro n,i,s
+?ad <n>,4
+?dd n,0,<dword>,<dd>,<i>,<s>,<PLM>
+endm
+staticQ macro n,i,s
+?ad <n>,8
+?dd n,0,<qword>,<dq>,<i>,<s>,<PLM>
+endm
+staticT macro n,i,s
+?ad <n>,10
+?dd n,0,<tbyte>,<dt>,<i>,<s>,<PLM>
+endm
+if sizec
+staticCP macro n,i,s
+staticD n,<i>,<s>
+endm
+else
+staticCP macro n,i,s
+staticW n,<i>,<s>
+endm
+endif
+if sized
+staticDP macro n,i,s
+staticD n,<i>,<s>
+endm
+else
+staticDP macro n,i,s
+staticW n,<i>,<s>
+endm
+endif
+endif
+?dd macro n,p,t,d,i,s,c
+?gcc ?dd2,%?PLM,<c>
+ife ?dd2
+n label t
+?dd1 _&n,p,<d>,<i>,<s>
+else
+?dd1 n,p,<d>,<i>,<s>
+endif
+endm
+?dd1 macro n,p,d,i,s
+if p
+public n
+endif
+ifb <s>
+n d i
+else
+ifb <i>
+n d s dup (?)
+else
+n d s dup (i)
+endif
+endif
+endm
+ifndef ?NOEXTERN
+.xcref
+.xcref ?ex1,?ex2,externB,externW,externD,externQ,externT
+.xcref externNP,externFP,externP,externCP,externDP,externA
+.cref
+?ex2 = 0
+externA macro n,c
+?ex1 <n>,40h,<abs>,<c>,<>
+endm
+externB macro n,c
+?ex1 <n>,1,<byte>,<c>,<>
+endm
+externW macro n,c
+?ex1 <n>,2,<word>,<c>,<>
+endm
+externD macro n,c
+?ex1 <n>,4,<dword>,<c>,<>
+endm
+externQ macro n,c
+?ex1 <n>,8,<qword>,<c>,<>
+endm
+externT macro n,c
+?ex1 <n>,10,<tbyte>,<c>,<>
+endm
+externNP macro n,c
+?ex1 <n>,2,<near>,<c>,<cc>
+endm
+externFP macro n,c
+?ex1 <n>,4,<far>,<c>,<cc>
+endm
+if sizec
+externP macro n,c
+?ex1 <n>,4,<far>,<c>,<cc>
+endm
+else
+externP macro n,c
+?ex1 <n>,2,<near>,<c>,<cc>
+endm
+endif
+if sizec
+externCP macro n,c
+?ex1 <n>,4,<dword>,<c>,<>
+endm
+else
+externCP macro n,c
+?ex1 <n>,2,<word>,<c>,<>
+endm
+endif
+if sized
+externDP macro n,c
+?ex1 <n>,4,<dword>,<c>,<>
+endm
+else
+externDP macro n,c
+?ex1 <n>,2,<word>,<c>,<>
+endm
+endif
+?ex1 macro n,s,d,c,scv
+?gcc ?ex2,%?PLM,<c>
+irp x,<n>
+.xcref
+.xcref ?t&&x
+.cref
+?t&&x=s
+ife ?ex2
+extrn _&&x:&d
+x equ _&&x
+else
+extrn x:&d
+endif
+ifidn <scv>,<cc>
+.xcref
+.xcref ?CC&&x
+.cref
+?CC&&x=?ex2
+endif
+endm
+endm
+endif
+ifndef ?NOLABEL
+.xcref
+.xcref ?lb1,?lblpu,?lb2
+.xcref labelB,labelW,labelD,labelQ,labelT
+.xcref labelNP,labelFP,labelP,labelCP,labelDP
+.cref
+?lblpu = 0
+?lb2 = 0
+labelB macro n,c
+?lb1 <n>,1,<byte>,<c>
+endm
+labelW macro n,c
+?lb1 <n>,2,<word>,<c>
+endm
+labelD macro n,c
+?lb1 <n>,4,<dword>,<c>
+endm
+labelQ macro n,c
+?lb1 <n>,8,<qword>,<c>
+endm
+labelT macro n,c
+?lb1 <n>,10,<tbyte>,<c>
+endm
+labelNP macro n,c
+?lb1 <n>,2,<near>,<c>
+endm
+labelFP macro n,c
+?lb1 <n>,4,<far>,<c>
+endm
+if sizec
+labelP macro n,c
+?lb1 <n>,4,<far>,<c>
+endm
+else
+labelP macro n,c
+?lb1 <n>,2,<near>,<c>
+endm
+endif
+if sizec
+labelCP macro n,c
+?lb1 <n>,4,<dword>,<c>
+endm
+else
+labelCP macro n,c
+?lb1 <n>,2,<word>,<c>
+endm
+endif
+if sized
+labelDP macro n,c
+?lb1 <n>,4,<dword>,<c>
+endm
+else
+labelDP macro n,c
+?lb1 <n>,2,<word>,<c>
+endm
+endif
+?lb1 macro n,s,d,c
+?gcc ?lb2,%?PLM,<c>
+?lblpu=0
+irp x,<n>
+ifidn <x>,<PUBLIC>
+?lblpu=1
+else
+.xcref
+.xcref ?t&&x
+.cref
+?t&&x=s
+ife ?lb2
+if ?lblpu
+public _&&x
+endif
+_&&x label &d
+x equ _&&x
+else
+if ?lblpu
+public x
+endif
+x label &d
+endif
+endif
+endm
+endm
+endif
+ifndef ?NODEF
+.xcref
+.xcref defB,defW,defD,defQ,defT,defCP,defDP
+.cref
+defB macro n
+?ad <n>,1
+endm
+defW macro n
+?ad <n>,2
+endm
+defD macro n
+?ad <n>,4
+endm
+defQ macro n
+?ad <n>,8
+endm
+defT macro n
+?ad <n>,10
+endm
+if sizec
+defCP macro n
+defD <n>
+endm
+else
+defCP macro n
+defW <n>
+endm
+endif
+if sized
+defDP macro n
+defD <n>
+endm
+else
+defDP macro n
+defW <n>
+endm
+endif
+endif
+?ad macro n,s
+irp x,<n>
+.xcref
+.xcref ?t&&x
+.cref
+?t&&x=s
+endm
+endm
+ifndef ?NOPTR
+.xcref
+.xcref regPtr,farPtr
+.cref
+regPtr macro n,s,o
+farPtr n,s,o
+endm
+farPtr macro n,s,o
+.xcref
+.xcref ?t&n
+.cref
+n &macro
+ push s
+ push o
+&endm
+?t&n=80h
+endm
+endif
+arg macro a
+irp x,<a>
+?argc=?argc+1
+?atal <x>,%?argc
+endm
+endm
+?atal macro n,i
+.xcref
+.xcref ?ali&i
+.cref
+?ali&i &macro
+?ap n
+&endm
+endm
+?ap macro n
+?argl=?argl+2
+ifdef ?t&n
+ife ?t&n-1
+ push word ptr (n)
+exitm
+endif
+ife ?t&n-2
+ push n
+exitm
+endif
+ife ?t&n-4
+ push word ptr (n)[2]
+ push word ptr (n)
+?argl=?argl+2
+exitm
+endif
+ife ?t&n-8
+ push word ptr (n)[6]
+ push word ptr (n)[4]
+ push word ptr (n)[2]
+ push word ptr (n)
+?argl=?argl+6
+exitm
+endif
+if ?t&n and 80h
+n
+?argl=?argl+2
+exitm
+endif
+ife ?t&n
+ push word ptr (n)
+exitm
+endif
+endif
+ push n
+endm
+cCall macro n,a,c
+ifnb <a>
+arg <a>
+endif
+mpush %?rsl
+ifdef ?CC&n
+?cCall1=?CC&n
+else
+?cCall1=?PLM
+endif
+ifnb <c>
+?gcc ?cCall1,%?cCall1,<c>
+endif
+?argl=0
+ife ?cCall1
+?acb=?argc
+else
+?acb=1
+endif
+rept ?argc
+uconcat <?ali>,%?acb
+uconcat <purge>,,<?ali>,%?acb
+ife ?cCall1
+?acb=?acb-1
+else
+?acb=?acb+1
+endif
+endm
+ call n
+if ((?cCall1 eq 0) and (?argl ne 0))
+ add sp,?argl
+endif
+mpop %?rsl
+?rsl=0
+?argc= 0
+?argl= 0
+endm
+cProc macro n,cf,a
+if ?cpd
+?utpe
+endif
+?cpd=1
+???=0
+?argc=0
+?ba=0
+?po=0
+?pu=0
+?ia=0
+?adj=4
+?rp=0
+?uf=0
+?wfp=?WIN
+?ff=0
+?pas=0
+?pcc=?PLM
+?lds=0
+?exp=0
+ifnb <a>
+?ri ?pas,<a>
+endif
+?pc=sizec
+?nd=?nodata1
+?nx=0
+irp x,<cf>
+ifidn <x>,<FAR>
+?pc=1
+endif
+ifidn <x>,<NEAR>
+?pc=0
+endif
+ifidn <x>,<PUBLIC>
+?pu=1
+endif
+ifidn <x>,<SMALL>
+?uf=1
+endif
+ifidn <x>,<DATA>
+?nd=0
+endif
+ifidn <x>,<NODATA>
+?nd=1
+endif
+ifidn <x>,<ATOMIC>
+?nx=1
+endif
+ifidn <x>,<C>
+?pcc=0
+endif
+ifidn <x>,<PLM>
+?pcc=1
+endif
+ifidn <x>,<PASCAL>
+?pcc=1
+endif
+ifidn <x>,<WIN>
+?wfp=1
+endif
+ifidn <x>,<NONWIN>
+?wfp=0
+endif
+ifidn <x>,<LOADDS>
+?lds=1
+endif
+ifidn <x>,<EXPORTED>
+?exp=1
+endif
+endm
+if ?pcc
+?PLMPrevParm=0
+.xcref
+.xcref ?PLMParm0
+.cref
+?PLMParm0 &macro
+purge ?PLMParm0
+&endm
+endif
+.xcref
+.xcref ?CC&n
+.cref
+?CC&n=?pcc
+if (?nx eq 1) and (?nd eq 0)
+?nx = 0
+??error <ATOMIC specified without NODATA - ATOMIC ignored>
+endif
+if ?pc
+if ?wfp+?exp+?lds
+ife ?nx
+ife ?pmd
+?ia=2
+endif
+?pas = ?pas and (not ?ds)
+endif
+endif
+?adj=?adj+2
+else
+?wfp=0
+endif
+ife ?386regs
+?pas = ?pas and (not (?sp+?cs+?ss))
+endif
+if ?uf
+if ?386regs
+?pas = ?pas and (not (?si+?di))
+else
+?pas = ?pas and (not (?bp+?si+?di))
+endif
+endif
+ife ?pcc
+?pg <_&n>,%?pu,%?pc,%?pas,%?wfp,<n>,%?pcc
+else
+?pg <n>,%?pu,%?pc,%?pas,%?wfp,<n>,%?pcc
+endif
+endm
+?pg macro n,p,c,a,w,nnu,cc
+.xcref
+if ?uf
+if ?nd
+??error <NODATA encountered in &n - user frame ignored>
+?uf=0
+endif
+endif
+.xcref cBegin
+cBegin &macro g
+.xcref
+if cc
+uconcat <?PLMParm>,%?PLMPrevParm,%?po
+endif
+if ?uf
+if ?rp
+??error <parmR encountered in &n - user frame ignored>
+?uf=0
+endif
+endif
+?pg1 <n>,c,a,%?po,w,%?uf,%?nd,%?rp,cc
+?cpd=0
+?argc=0
+?ba=1
+???=(???+1) and 0fffeh
+if p
+public n
+endif
+ife c
+n proc near
+else
+n proc far
+endif
+ife cc
+nnu equ n
+endif
+ifidn <g>,<nogen>
+if ???+?po+a+?rp
+??_out <cBegin - possible invalid use of nogen>
+endif
+else
+if ?uf
+?mf c,%???,%?po
+mpush a
+else
+if w+?exp+?lds
+if ?pmd
+ife ?nd
+if ?lds
+mov ax,_DATA
+else
+if ?exp
+mov ax,ds
+nop
+endif
+endif
+endif
+ife ?nx
+if ???+?po
+if ?chkstk1
+push bp
+mov bp,sp
+else
+if ???
+enter ???,0
+else
+push bp
+mov bp,sp
+endif
+endif
+endif
+push ds
+if ?lds+?exp
+mov ds,ax
+endif
+else
+if ?ff+???+?po+?rp
+ push bp
+ mov bp,sp
+endif
+endif
+else
+ife ?nd
+ mov ax,ds
+ nop
+endif
+ife ?nx
+ife ?DOS5
+ inc bp
+endif
+ push bp
+ mov bp,sp
+ push ds
+else
+if ?ff+???+?po+?rp
+ push bp
+ mov bp,sp
+endif
+endif
+ife ?nd
+ mov ds,ax
+endif
+endif
+else
+if ?pmd
+if ?exp
+mov ax,ds
+nop
+else
+if ?lds
+mov ax,_DATA
+endif
+endif
+if ?ff+???+?po+?rp
+if ?chkstk1
+push bp
+mov bp,sp
+else
+if ???
+enter ???,0
+else
+push bp
+mov bp,sp
+endif
+endif
+endif
+if ?exp+?lds
+push ds
+mov ds,ax
+endif
+else
+if ?ff+???+?po+?rp
+ push bp
+ mov bp,sp
+endif
+endif
+endif
+if ?rp
+?uf=0
+rept ?rp
+uconcat mpush,,?rp,%?uf
+?uf=?uf+1
+endm
+endif
+if ???
+if ?chkstk1
+ifdef ?CHKSTKPROC
+?CHKSTKPROC %???
+else
+ mov ax,???
+ife cc
+ call _chkstk
+else
+ call chkstk
+endif
+endif
+else
+ife ?pmd
+ sub sp,???
+endif
+endif
+endif
+mpush a
+endif
+ifdef ?PROFILE
+if c
+ call StartNMeas
+endif
+endif
+endif
+.cref
+purge cBegin
+&endm
+.xcref ?utpe
+?utpe &macro
+??error <unterminated procedure definition: "&n">
+&endm
+.cref
+endm
+?pg1 macro n,c,a,o,w,f,d,r,cc
+.xcref
+.xcref cEnd
+cEnd &macro g
+.xcref
+?ba=0
+ifidn <g>,<nogen>
+if o+a+r
+??_out <cEnd - possible invalid use of nogen>
+endif
+else
+ifdef ?PROFILE
+if c
+call StopNMeas
+endif
+endif
+mpop a
+if f
+ db 0c3h
+else
+if w+?exp+?lds
+if ?pmd
+ife ?nx
+pop ds
+endif
+ife ?nx
+if ?chkstk1+???+?po
+leave
+endif
+else
+if ?ff+???+?po+?rp
+leave
+endif
+endif
+else
+ife ?nx
+if (?TF eq 0) or (???+?rp)
+ lea sp,-2[bp]
+endif
+ pop ds
+ pop bp
+ife ?DOS5
+ dec bp
+endif
+else
+if (?TF eq 0) or (???+?rp)
+ mov sp,bp
+endif
+if ???+?po+?rp
+ pop bp
+endif
+endif
+endif
+else
+if ?pmd
+if ?ff+???+?po+?rp
+leave
+endif
+else
+if ?ff+???+?po+?rp
+if (?TF eq 0) or (???+?rp)
+ mov sp,bp
+endif
+ pop bp
+endif
+endif
+endif
+ife cc
+ ret
+else
+ ret o
+endif
+endif
+endif
+n endp
+.cref
+purge cEnd
+&endm
+.cref
+endm
+assumes macro s,ln
+ifndef ln&_assumes
+assume s:ln
+else
+ln&_assumes s
+endif
+endm
+createSeg macro n,ln,a,co,cl,grp
+ifnb <grp>
+addseg grp,n
+else
+ln&OFFSET equ offset n:
+ln&BASE equ n
+?cs3 <ln>,<n>
+endif
+ifnb <cl>
+n segment a co '&cl'
+else
+n segment a co
+endif
+n ends
+?cs1 <ln>,<n>
+endm
+addseg macro grp,seg
+.xcref
+.xcref grp&_def
+.cref
+ifndef grp&_def
+grp&_def=0
+endif
+if grp&_def ne ASMpass
+.xcref
+.xcref grp&_add
+.cref
+grp&_add &macro s
+grp&_in <seg>,s
+&endm
+.xcref
+.xcref grp&_in
+.cref
+grp&_in &macro sl,s
+ifb <s>
+grp group sl
+else
+grp&_add &macro ns
+grp&_in <sl,s>,ns
+&endm
+endif
+&endm
+grp&_def=ASMpass
+else
+grp&_add seg
+endif
+endm
+defgrp macro grp,ln
+addseg grp
+ifnb <ln>
+irp x,<ln>
+?cs3 <&x>,<grp>
+x&&OFFSET equ offset grp:
+x&&BASE equ grp
+endm
+endif
+endm
+?cs1 macro ln,n
+.xcref
+.xcref ln&_sbegin
+.cref
+ln&_sbegin &macro
+.xcref
+.xcref ?mf
+.cref
+?mf &&macro c,l,p
+if c
+ extrn n&_FARFRAME:near
+ call n&_FARFRAME
+else
+ extrn n&_NEARFRAME:near
+ call n&_NEARFRAME
+endif
+ db l shr 1
+ db p shr 1
+&&endm
+?cs2 <ln>,<n>
+n segment
+&endm
+endm
+?cs2 macro ln,n
+.xcref
+.xcref sEnd
+.cref
+sEnd &macro
+n ends
+purge ?mf
+purge sEnd
+&endm
+endm
+?cs3 macro ln,n
+.xcref
+.xcref ln&_assumes
+.cref
+ln&_assumes &macro s
+assume s:&n
+&endm
+endm
+.xcref
+.xcref sBegin
+.cref
+sBegin macro ln
+ln&_sbegin
+endm
+ife ?DF
+createSeg _TEXT,Code,word,public,CODE
+ife ?nodata1
+createSeg _DATA,Data,word,public,DATA,DGROUP
+defgrp DGROUP,Data
+endif
+if ?chkstk1
+ifndef ?CHKSTKPROC
+externp <chkstk>
+endif
+endif
+endif
+errnz macro x
+if2
+if x
+errnz1 <x>,%(x)
+endif
+endif
+endm
+errnz1 macro x1,x2
+= *errnz* x1 = x2
+.err
+endm
+errn$ macro l,x
+errnz <offset $ - offset l x>
+endm
+ifdef ?PROFILE
+externFP <StartNMeas,StopNMeas>
+endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/colordlg.h b/private/oleauto/tools/win16/hdos/c800/include/colordlg.h
new file mode 100644
index 000000000..86ae4e9bb
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/colordlg.h
@@ -0,0 +1,49 @@
+/*****************************************************************************\
+* *
+* colordlg.h - Common dialog color dialog's control id numbers *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_COLORDLG
+#define _INC_COLORDLG
+
+#define DLG_COLOR 10
+
+#define COLOR_HUESCROLL 700 /* color dialog */
+#define COLOR_SATSCROLL 701
+#define COLOR_LUMSCROLL 702
+#define COLOR_HUE 703
+#define COLOR_SAT 704
+#define COLOR_LUM 705
+#define COLOR_RED 706
+#define COLOR_GREEN 707
+#define COLOR_BLUE 708
+#define COLOR_CURRENT 709
+#define COLOR_RAINBOW 710
+#define COLOR_SAVE 711
+#define COLOR_ADD 712
+#define COLOR_SOLID 713
+#define COLOR_TUNE 714
+#define COLOR_SCHEMES 715
+#define COLOR_ELEMENT 716
+#define COLOR_SAMPLES 717
+#define COLOR_PALETTE 718
+#define COLOR_MIX 719
+#define COLOR_BOX1 720
+#define COLOR_CUSTOM1 721
+
+#define COLOR_HUEACCEL 723
+#define COLOR_SATACCEL 724
+#define COLOR_LUMACCEL 725
+#define COLOR_REDACCEL 726
+#define COLOR_GREENACCEL 727
+#define COLOR_BLUEACCEL 728
+
+#define NUM_BASIC_COLORS 48
+#define NUM_CUSTOM_COLORS 16
+
+#endif /* !_INC_COLORDLG */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/commdlg.h b/private/oleauto/tools/win16/hdos/c800/include/commdlg.h
new file mode 100644
index 000000000..723f7b4d3
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/commdlg.h
@@ -0,0 +1,318 @@
+/*****************************************************************************\
+* *
+* commdlg.h - Common dialog functions, types, and definitions *
+* *
+* Version 1.0 *
+* *
+* NOTE: windows.h must be #included first *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_COMMDLG
+#define _INC_COMMDLG
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* !RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+#ifndef WINAPI /* If not included with 3.1 headers... */
+#define WINAPI FAR PASCAL
+#define CALLBACK FAR PASCAL
+#define LPCSTR LPSTR
+#define UINT WORD
+#define LPARAM LONG
+#define WPARAM WORD
+#define LRESULT LONG
+#define HMODULE HANDLE
+#define HINSTANCE HANDLE
+#define HLOCAL HANDLE
+#define HGLOBAL HANDLE
+#endif /* _INC_WINDOWS */
+
+typedef struct tagOFN
+{
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ LPCSTR lpstrFilter;
+ LPSTR lpstrCustomFilter;
+ DWORD nMaxCustFilter;
+ DWORD nFilterIndex;
+ LPSTR lpstrFile;
+ DWORD nMaxFile;
+ LPSTR lpstrFileTitle;
+ DWORD nMaxFileTitle;
+ LPCSTR lpstrInitialDir;
+ LPCSTR lpstrTitle;
+ DWORD Flags;
+ UINT nFileOffset;
+ UINT nFileExtension;
+ LPCSTR lpstrDefExt;
+ LPARAM lCustData;
+ UINT (CALLBACK *lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+ LPCSTR lpTemplateName;
+} OPENFILENAME;
+typedef OPENFILENAME FAR* LPOPENFILENAME;
+
+BOOL WINAPI GetOpenFileName(OPENFILENAME FAR*);
+BOOL WINAPI GetSaveFileName(OPENFILENAME FAR*);
+int WINAPI GetFileTitle(LPCSTR, LPSTR, UINT);
+
+#define OFN_READONLY 0x00000001
+#define OFN_OVERWRITEPROMPT 0x00000002
+#define OFN_HIDEREADONLY 0x00000004
+#define OFN_NOCHANGEDIR 0x00000008
+#define OFN_SHOWHELP 0x00000010
+#define OFN_ENABLEHOOK 0x00000020
+#define OFN_ENABLETEMPLATE 0x00000040
+#define OFN_ENABLETEMPLATEHANDLE 0x00000080
+#define OFN_NOVALIDATE 0x00000100
+#define OFN_ALLOWMULTISELECT 0x00000200
+#define OFN_EXTENSIONDIFFERENT 0x00000400
+#define OFN_PATHMUSTEXIST 0x00000800
+#define OFN_FILEMUSTEXIST 0x00001000
+#define OFN_CREATEPROMPT 0x00002000
+#define OFN_SHAREAWARE 0x00004000
+#define OFN_NOREADONLYRETURN 0x00008000
+#define OFN_NOTESTFILECREATE 0x00010000
+
+/* Return values for the registered message sent to the hook function
+ * when a sharing violation occurs. OFN_SHAREFALLTHROUGH allows the
+ * filename to be accepted, OFN_SHARENOWARN rejects the name but puts
+ * up no warning (returned when the app has already put up a warning
+ * message), and OFN_SHAREWARN puts up the default warning message
+ * for sharing violations.
+ *
+ * Note: Undefined return values map to OFN_SHAREWARN, but are
+ * reserved for future use.
+ */
+
+#define OFN_SHAREFALLTHROUGH 2
+#define OFN_SHARENOWARN 1
+#define OFN_SHAREWARN 0
+
+typedef struct tagCHOOSECOLOR
+{
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HWND hInstance;
+ COLORREF rgbResult;
+ COLORREF FAR* lpCustColors;
+ DWORD Flags;
+ LPARAM lCustData;
+ UINT (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+ LPCSTR lpTemplateName;
+} CHOOSECOLOR;
+typedef CHOOSECOLOR FAR *LPCHOOSECOLOR;
+
+BOOL WINAPI ChooseColor(CHOOSECOLOR FAR*);
+
+#define CC_RGBINIT 0x00000001
+#define CC_FULLOPEN 0x00000002
+#define CC_PREVENTFULLOPEN 0x00000004
+#define CC_SHOWHELP 0x00000008
+#define CC_ENABLEHOOK 0x00000010
+#define CC_ENABLETEMPLATE 0x00000020
+#define CC_ENABLETEMPLATEHANDLE 0x00000040
+
+typedef struct tagFINDREPLACE
+{
+ DWORD lStructSize; /* size of this struct 0x20 */
+ HWND hwndOwner; /* handle to owner's window */
+ HINSTANCE hInstance; /* instance handle of.EXE that
+ * contains cust. dlg. template
+ */
+ DWORD Flags; /* one or more of the FR_?? */
+ LPSTR lpstrFindWhat; /* ptr. to search string */
+ LPSTR lpstrReplaceWith; /* ptr. to replace string */
+ UINT wFindWhatLen; /* size of find buffer */
+ UINT wReplaceWithLen; /* size of replace buffer */
+ LPARAM lCustData; /* data passed to hook fn. */
+ UINT (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+ /* ptr. to hook fn. or NULL */
+ LPCSTR lpTemplateName; /* custom template name */
+} FINDREPLACE;
+typedef FINDREPLACE FAR *LPFINDREPLACE;
+
+#define FR_DOWN 0x00000001
+#define FR_WHOLEWORD 0x00000002
+#define FR_MATCHCASE 0x00000004
+#define FR_FINDNEXT 0x00000008
+#define FR_REPLACE 0x00000010
+#define FR_REPLACEALL 0x00000020
+#define FR_DIALOGTERM 0x00000040
+#define FR_SHOWHELP 0x00000080
+#define FR_ENABLEHOOK 0x00000100
+#define FR_ENABLETEMPLATE 0x00000200
+#define FR_NOUPDOWN 0x00000400
+#define FR_NOMATCHCASE 0x00000800
+#define FR_NOWHOLEWORD 0x00001000
+#define FR_ENABLETEMPLATEHANDLE 0x00002000
+#define FR_HIDEUPDOWN 0x00004000
+#define FR_HIDEMATCHCASE 0x00008000
+#define FR_HIDEWHOLEWORD 0x00010000
+
+HWND WINAPI FindText(FINDREPLACE FAR*);
+HWND WINAPI ReplaceText(FINDREPLACE FAR*);
+
+typedef struct tagCHOOSEFONT
+{
+ DWORD lStructSize; /* */
+ HWND hwndOwner; /* caller's window handle */
+ HDC hDC; /* printer DC/IC or NULL */
+ LOGFONT FAR* lpLogFont; /* ptr. to a LOGFONT struct */
+ int iPointSize; /* 10 * size in points of selected font */
+ DWORD Flags; /* enum. type flags */
+ COLORREF rgbColors; /* returned text color */
+ LPARAM lCustData; /* data passed to hook fn. */
+ UINT (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+ /* ptr. to hook function */
+ LPCSTR lpTemplateName; /* custom template name */
+ HINSTANCE hInstance; /* instance handle of.EXE that
+ * contains cust. dlg. template
+ */
+ LPSTR lpszStyle; /* return the style field here
+ * must be LF_FACESIZE or bigger */
+ UINT nFontType; /* same value reported to the EnumFonts
+ * call back with the extra FONTTYPE_
+ * bits added */
+ int nSizeMin; /* minimum pt size allowed & */
+ int nSizeMax; /* max pt size allowed if */
+ /* CF_LIMITSIZE is used */
+} CHOOSEFONT;
+typedef CHOOSEFONT FAR *LPCHOOSEFONT;
+
+BOOL WINAPI ChooseFont(CHOOSEFONT FAR*);
+
+#define CF_SCREENFONTS 0x00000001
+#define CF_PRINTERFONTS 0x00000002
+#define CF_BOTH (CF_SCREENFONTS | CF_PRINTERFONTS)
+#define CF_SHOWHELP 0x00000004L
+#define CF_ENABLEHOOK 0x00000008L
+#define CF_ENABLETEMPLATE 0x00000010L
+#define CF_ENABLETEMPLATEHANDLE 0x00000020L
+#define CF_INITTOLOGFONTSTRUCT 0x00000040L
+#define CF_USESTYLE 0x00000080L
+#define CF_EFFECTS 0x00000100L
+#define CF_APPLY 0x00000200L
+#define CF_ANSIONLY 0x00000400L
+#define CF_NOVECTORFONTS 0x00000800L
+#define CF_NOOEMFONTS CF_NOVECTORFONTS
+#define CF_NOSIMULATIONS 0x00001000L
+#define CF_LIMITSIZE 0x00002000L
+#define CF_FIXEDPITCHONLY 0x00004000L
+#define CF_WYSIWYG 0x00008000L /* must also have CF_SCREENFONTS & CF_PRINTERFONTS */
+#define CF_FORCEFONTEXIST 0x00010000L
+#define CF_SCALABLEONLY 0x00020000L
+#define CF_TTONLY 0x00040000L
+#define CF_NOFACESEL 0x00080000L
+#define CF_NOSTYLESEL 0x00100000L
+#define CF_NOSIZESEL 0x00200000L
+
+/* these are extra nFontType bits that are added to what is returned to the
+ * EnumFonts callback routine */
+
+#define SIMULATED_FONTTYPE 0x8000
+#define PRINTER_FONTTYPE 0x4000
+#define SCREEN_FONTTYPE 0x2000
+#define BOLD_FONTTYPE 0x0100
+#define ITALIC_FONTTYPE 0x0200
+#define REGULAR_FONTTYPE 0x0400
+
+#define WM_CHOOSEFONT_GETLOGFONT (WM_USER + 1)
+
+
+/* strings used to obtain unique window message for communication
+ * between dialog and caller
+ */
+#define LBSELCHSTRING "commdlg_LBSelChangedNotify"
+#define SHAREVISTRING "commdlg_ShareViolation"
+#define FILEOKSTRING "commdlg_FileNameOK"
+#define COLOROKSTRING "commdlg_ColorOK"
+#define SETRGBSTRING "commdlg_SetRGBColor"
+#define FINDMSGSTRING "commdlg_FindReplace"
+#define HELPMSGSTRING "commdlg_help"
+
+/* HIWORD values for lParam of commdlg_LBSelChangeNotify message */
+#define CD_LBSELNOITEMS -1
+#define CD_LBSELCHANGE 0
+#define CD_LBSELSUB 1
+#define CD_LBSELADD 2
+
+typedef struct tagPD
+{
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HGLOBAL hDevMode;
+ HGLOBAL hDevNames;
+ HDC hDC;
+ DWORD Flags;
+ UINT nFromPage;
+ UINT nToPage;
+ UINT nMinPage;
+ UINT nMaxPage;
+ UINT nCopies;
+ HINSTANCE hInstance;
+ LPARAM lCustData;
+ UINT (CALLBACK* lpfnPrintHook)(HWND, UINT, WPARAM, LPARAM);
+ UINT (CALLBACK* lpfnSetupHook)(HWND, UINT, WPARAM, LPARAM);
+ LPCSTR lpPrintTemplateName;
+ LPCSTR lpSetupTemplateName;
+ HGLOBAL hPrintTemplate;
+ HGLOBAL hSetupTemplate;
+} PRINTDLG;
+typedef PRINTDLG FAR* LPPRINTDLG;
+
+BOOL WINAPI PrintDlg(PRINTDLG FAR*);
+
+#define PD_ALLPAGES 0x00000000
+#define PD_SELECTION 0x00000001
+#define PD_PAGENUMS 0x00000002
+#define PD_NOSELECTION 0x00000004
+#define PD_NOPAGENUMS 0x00000008
+#define PD_COLLATE 0x00000010
+#define PD_PRINTTOFILE 0x00000020
+#define PD_PRINTSETUP 0x00000040
+#define PD_NOWARNING 0x00000080
+#define PD_RETURNDC 0x00000100
+#define PD_RETURNIC 0x00000200
+#define PD_RETURNDEFAULT 0x00000400
+#define PD_SHOWHELP 0x00000800
+#define PD_ENABLEPRINTHOOK 0x00001000
+#define PD_ENABLESETUPHOOK 0x00002000
+#define PD_ENABLEPRINTTEMPLATE 0x00004000
+#define PD_ENABLESETUPTEMPLATE 0x00008000
+#define PD_ENABLEPRINTTEMPLATEHANDLE 0x00010000
+#define PD_ENABLESETUPTEMPLATEHANDLE 0x00020000
+#define PD_USEDEVMODECOPIES 0x00040000
+#define PD_DISABLEPRINTTOFILE 0x00080000
+#define PD_HIDEPRINTTOFILE 0x00100000
+
+typedef struct tagDEVNAMES
+{
+ UINT wDriverOffset;
+ UINT wDeviceOffset;
+ UINT wOutputOffset;
+ UINT wDefault;
+} DEVNAMES;
+typedef DEVNAMES FAR* LPDEVNAMES;
+
+#define DN_DEFAULTPRN 0x0001
+
+DWORD WINAPI CommDlgExtendedError(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* !RC_INVOKED */
+
+#endif /* !_INC_COMMDLG */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/conio.h b/private/oleauto/tools/win16/hdos/c800/include/conio.h
new file mode 100644
index 000000000..ba72116f0
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/conio.h
@@ -0,0 +1,73 @@
+/***
+*conio.h - console and port I/O declarations
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file contains the function declarations for
+* the MS C V2.03 compatible console and port I/O routines.
+*
+****/
+
+#ifndef _INC_CONIO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+/* function prototypes */
+
+#ifndef _WINDOWS
+char * __cdecl _cgets(char *);
+int __cdecl _cprintf(const char *, ...);
+int __cdecl _cputs(const char *);
+int __cdecl _cscanf(const char *, ...);
+int __cdecl _getch(void);
+int __cdecl _getche(void);
+#endif
+int __cdecl _inp(unsigned);
+unsigned __cdecl _inpw(unsigned);
+#ifndef _WINDOWS
+int __cdecl _kbhit(void);
+#endif
+int __cdecl _outp(unsigned, int);
+unsigned __cdecl _outpw(unsigned, unsigned);
+#ifndef _WINDOWS
+int __cdecl _putch(int);
+int __cdecl _ungetch(int);
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#ifndef _WINDOWS
+char * __cdecl cgets(char *);
+int __cdecl cprintf(const char *, ...);
+int __cdecl cputs(const char *);
+int __cdecl cscanf(const char *, ...);
+int __cdecl getch(void);
+int __cdecl getche(void);
+#endif
+int __cdecl inp(unsigned);
+unsigned __cdecl inpw(unsigned);
+#ifndef _WINDOWS
+int __cdecl kbhit(void);
+#endif
+int __cdecl outp(unsigned, int);
+unsigned __cdecl outpw(unsigned, unsigned);
+#ifndef _WINDOWS
+int __cdecl putch(int);
+int __cdecl ungetch(int);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_CONIO
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/cpl.h b/private/oleauto/tools/win16/hdos/c800/include/cpl.h
new file mode 100644
index 000000000..bdcfc7f80
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/cpl.h
@@ -0,0 +1,157 @@
+/*****************************************************************************\
+* *
+* cpl.h - Control panel extension DLL definitions *
+* *
+* Version 3.10 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved *
+* *
+******************************************************************************
+* General rules for being installed in the Control Panel:
+*
+* 1) The DLL must export a function named CPlApplet which will handle
+* the messages discussed below.
+* 2) If the applet needs to save information in CONTROL.INI minimize
+* clutter by using the application name [MMCPL.appletname].
+* 2) If the applet is refrenced in CONTROL.INI under [MMCPL] use
+* the following form:
+* ...
+* [MMCPL]
+* uniqueName=c:\mydir\myapplet.dll
+* ...
+*
+*
+* The order applet DLL's are loaded by CONTROL.EXE is:
+*
+* 1) MAIN.CPL is loaded from the windows system directory.
+*
+* 2) Installable drivers that are loaded and export the
+* CplApplet() routine.
+*
+* 3) DLL's specified in the [MMCPL] section of CONTROL.INI.
+*
+* 4) DLL's named *.CPL from windows system directory.
+*
+*/
+#ifndef _INC_CPL
+#define _INC_CPL
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/*
+ * CONTROL.EXE will answer this message and launch an applet
+ *
+ * WM_CPL_LAUNCH
+ *
+ * wParam - window handle of calling app
+ * lParam - LPSTR of name of applet to launch
+ *
+ * WM_CPL_LAUNCHED
+ *
+ * wParam - TRUE/FALSE if applet was launched
+ * lParam - NULL
+ *
+ * CONTROL.EXE will post this message to the caller when the applet returns
+ * (ie., when wParam is a valid window handle)
+ *
+ */
+#define WM_CPL_LAUNCH (WM_USER+1000)
+#define WM_CPL_LAUNCHED (WM_USER+1001)
+
+/* A function prototype for CPlApplet() */
+
+typedef LRESULT (CALLBACK *APPLET_PROC)(HWND hwndCpl, UINT msg, LPARAM lParam1, LPARAM lParam2);
+
+/* The data structure CPlApplet() must fill in. */
+
+typedef struct tagCPLINFO
+{
+ int idIcon; /* icon resource id, provided by CPlApplet() */
+ int idName; /* name string res. id, provided by CPlApplet() */
+ int idInfo; /* info string res. id, provided by CPlApplet() */
+ LONG lData; /* user defined data */
+} CPLINFO, *PCPLINFO, FAR *LPCPLINFO;
+
+typedef struct tagNEWCPLINFO
+{
+ DWORD dwSize; /* similar to the commdlg */
+ DWORD dwFlags;
+ DWORD dwHelpContext; /* help context to use */
+ LONG lData; /* user defined data */
+ HICON hIcon; /* icon to use, this is owned by CONTROL.EXE (may be deleted) */
+ char szName[32]; /* short name */
+ char szInfo[64]; /* long name (status line) */
+ char szHelpFile[128];/* path to help file to use */
+} NEWCPLINFO, *PNEWCPLINFO, FAR *LPNEWCPLINFO;
+
+
+/* The messages CPlApplet() must handle: */
+
+#define CPL_INIT 1
+/* This message is sent to indicate CPlApplet() was found. */
+/* lParam1 and lParam2 are not defined. */
+/* Return TRUE or FALSE indicating whether the control panel should proceed. */
+
+
+#define CPL_GETCOUNT 2
+/* This message is sent to determine the number of applets to be displayed. */
+/* lParam1 and lParam2 are not defined. */
+/* Return the number of applets you wish to display in the control */
+/* panel window. */
+
+
+#define CPL_INQUIRE 3
+/* This message is sent for information about each applet. */
+/* lParam1 is the applet number to register, a value from 0 to */
+/* (CPL_GETCOUNT - 1). lParam2 is a far ptr to a CPLINFO structure. */
+/* Fill in CPL_INFO's idIcon, idName, idInfo and lData fields with */
+/* the resource id for an icon to display, name and description string ids, */
+/* and a long data item associated with applet #lParam1. */
+
+
+#define CPL_SELECT 4
+/* This message is sent when the applet's icon has been clicked upon. */
+/* lParam1 is the applet number which was selected. lParam2 is the */
+/* applet's lData value. */
+
+
+#define CPL_DBLCLK 5
+/* This message is sent when the applet's icon has been double-clicked */
+/* upon. lParam1 is the applet number which was selected. lParam2 is the */
+/* applet's lData value. */
+/* This message should initiate the applet's dialog box. */
+
+
+#define CPL_STOP 6
+/* This message is sent for each applet when the control panel is exiting. */
+/* lParam1 is the applet number. lParam2 is the applet's lData value. */
+/* Do applet specific cleaning up here. */
+
+
+#define CPL_EXIT 7
+/* This message is sent just before the control panel calls FreeLibrary. */
+/* lParam1 and lParam2 are not defined. */
+/* Do non-applet specific cleaning up here. */
+
+
+#define CPL_NEWINQUIRE 8
+/* this is the same as CPL_INQUIRE execpt lParam2 is a pointer to a */
+/* NEWCPLINFO structure. this will be sent before the CPL_INQUIRE */
+/* and if it is responed to (return != 0) CPL_INQUIRE will not be sent */
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* RC_INVOKED */
+
+#endif /* _INC_CPL */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/ctype.h b/private/oleauto/tools/win16/hdos/c800/include/ctype.h
new file mode 100644
index 000000000..a81fd9bdd
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/ctype.h
@@ -0,0 +1,127 @@
+/***
+*ctype.h - character conversion macros and ctype macros
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines macros for character classification/conversion.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_CTYPE
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+/*
+ * This declaration allows the user access to the ctype look-up
+ * array _ctype defined in ctype.obj by simply including ctype.h
+ */
+
+extern unsigned char __near __cdecl _ctype[];
+
+/* set bit masks for the possible character types */
+
+#define _UPPER 0x1 /* upper case letter */
+#define _LOWER 0x2 /* lower case letter */
+#define _DIGIT 0x4 /* digit[0-9] */
+#define _SPACE 0x8 /* tab, carriage return, newline, */
+ /* vertical tab or form feed */
+#define _PUNCT 0x10 /* punctuation character */
+#define _CONTROL 0x20 /* control character */
+#define _BLANK 0x40 /* space char */
+#define _HEX 0x80 /* hexadecimal digit */
+
+/* character classification function prototypes */
+
+#ifndef _CTYPE_DEFINED
+int __cdecl isalpha(int);
+int __cdecl isupper(int);
+int __cdecl islower(int);
+int __cdecl isdigit(int);
+int __cdecl isxdigit(int);
+int __cdecl isspace(int);
+int __cdecl ispunct(int);
+int __cdecl isalnum(int);
+int __cdecl isprint(int);
+int __cdecl isgraph(int);
+int __cdecl iscntrl(int);
+int __cdecl toupper(int);
+int __cdecl tolower(int);
+int __cdecl _tolower(int);
+int __cdecl _toupper(int);
+int __cdecl __isascii(int);
+int __cdecl __toascii(int);
+int __cdecl __iscsymf(int);
+int __cdecl __iscsym(int);
+#define _CTYPE_DEFINED
+#endif
+
+#ifdef _INTL
+int __cdecl __isleadbyte(int);
+#endif
+
+/* the character classification macro definitions */
+
+#define isalpha(_c) ( (_ctype+1)[_c] & (_UPPER|_LOWER) )
+#define isupper(_c) ( (_ctype+1)[_c] & _UPPER )
+#define islower(_c) ( (_ctype+1)[_c] & _LOWER )
+#define isdigit(_c) ( (_ctype+1)[_c] & _DIGIT )
+#define isxdigit(_c) ( (_ctype+1)[_c] & _HEX )
+#define isspace(_c) ( (_ctype+1)[_c] & _SPACE )
+#define ispunct(_c) ( (_ctype+1)[_c] & _PUNCT )
+#define isalnum(_c) ( (_ctype+1)[_c] & (_UPPER|_LOWER|_DIGIT) )
+#define isprint(_c) ( (_ctype+1)[_c] & (_BLANK|_PUNCT|_UPPER|_LOWER|_DIGIT) )
+#define isgraph(_c) ( (_ctype+1)[_c] & (_PUNCT|_UPPER|_LOWER|_DIGIT) )
+#define iscntrl(_c) ( (_ctype+1)[_c] & _CONTROL )
+#ifndef __STDC__
+#define toupper(_c) ( (islower(_c)) ? _toupper(_c) : (_c) )
+#define tolower(_c) ( (isupper(_c)) ? _tolower(_c) : (_c) )
+#endif
+#define _tolower(_c) ( (_c)-'A'+'a' )
+#define _toupper(_c) ( (_c)-'a'+'A' )
+#define __isascii(_c) ( (unsigned)(_c) < 0x80 )
+#define __toascii(_c) ( (_c) & 0x7f )
+
+#ifndef isleadbyte
+#ifdef _INTL
+#define isleadbyte(_c) __isleadbyte(_c)
+#else
+#define isleadbyte(_c) (0)
+#endif
+#endif
+
+/* extended ctype macros */
+
+#define __iscsymf(_c) (isalpha(_c) || ((_c) == '_'))
+#define __iscsym(_c) (isalnum(_c) || ((_c) == '_'))
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#ifndef _CTYPE_DEFINED
+int __cdecl isascii(int);
+int __cdecl toascii(int);
+int __cdecl iscsymf(int);
+int __cdecl iscsym(int);
+#else
+#define isascii __isascii
+#define toascii __toascii
+#define iscsymf __iscsymf
+#define iscsym __iscsym
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_CTYPE
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/custcntl.h b/private/oleauto/tools/win16/hdos/c800/include/custcntl.h
new file mode 100644
index 000000000..be3d02af1
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/custcntl.h
@@ -0,0 +1,105 @@
+/*****************************************************************************\
+* *
+* custcntl.h - Custom Control Library header file *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_CUSTCNTL
+#define _INC_CUSTCNTL
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/*
+ * Every custom control DLL must have three functions present,
+ * and they must be exported by the following ordinals.
+ */
+#define CCINFOORD 2 /* information function ordinal */
+#define CCSTYLEORD 3 /* styles function ordinal */
+#define CCFLAGSORD 4 /* translate flags function ordinal */
+
+/* general size definitions */
+#define CTLTYPES 12 /* max number of control types */
+#define CTLDESCR 22 /* max size of description */
+#define CTLCLASS 20 /* max size of class name */
+#define CTLTITLE 94 /* max size of control text */
+
+/*
+ * CONTROL STYLE DATA STRUCTURE
+ *
+ * This data structure is used by the class style dialog function
+ * to set and/or reset various control attributes.
+ *
+ */
+typedef struct tagCTLSTYLE
+{
+ UINT wX; /* x origin of control */
+ UINT wY; /* y origin of control */
+ UINT wCx; /* width of control */
+ UINT wCy; /* height of control */
+ UINT wId; /* control child id */
+ DWORD dwStyle; /* control style */
+ char szClass[CTLCLASS]; /* name of control class */
+ char szTitle[CTLTITLE]; /* control text */
+} CTLSTYLE;
+typedef CTLSTYLE * PCTLSTYLE;
+typedef CTLSTYLE FAR* LPCTLSTYLE;
+
+/*
+ * CONTROL DATA STRUCTURE
+ *
+ * This data structure is returned by the control options function
+ * when inquiring about the capabilities of a particular control.
+ * Each control may contain various types (with predefined style
+ * bits) under one general class.
+ *
+ * The width and height fields are used to provide the host
+ * application with a suggested size. The values in these fields
+ * are in rc coordinates.
+ *
+ */
+typedef struct tagCTLTYPE
+{
+ UINT wType; /* type style */
+ UINT wWidth; /* suggested width */
+ UINT wHeight; /* suggested height */
+ DWORD dwStyle; /* default style */
+ char szDescr[CTLDESCR]; /* description */
+} CTLTYPE;
+
+typedef struct tagCTLINFO
+{
+ UINT wVersion; /* control version */
+ UINT wCtlTypes; /* control types */
+ char szClass[CTLCLASS]; /* control class name */
+ char szTitle[CTLTITLE]; /* control title */
+ char szReserved[10]; /* reserved for future use */
+ CTLTYPE Type[CTLTYPES]; /* control type list */
+} CTLINFO;
+typedef CTLINFO * PCTLINFO;
+typedef CTLINFO FAR* LPCTLINFO;
+
+/* These two function prototypes are used by the dialog editor */
+#ifdef STRICT
+typedef DWORD (CALLBACK* LPFNSTRTOID)(LPCSTR);
+#else
+typedef DWORD (CALLBACK* LPFNSTRTOID)(LPSTR);
+#endif
+typedef UINT (CALLBACK* LPFNIDTOSTR)(UINT, LPSTR, UINT);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* RC_INVOKED */
+
+#endif /* _INC_CUSTCNTL */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/dde.h b/private/oleauto/tools/win16/hdos/c800/include/dde.h
new file mode 100644
index 000000000..26aa0139b
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/dde.h
@@ -0,0 +1,146 @@
+/*****************************************************************************\
+* *
+* dde.h - Dynamic Data Exchange structures and definitions *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_DDE
+#define _INC_DDE
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/* DDE window messages */
+
+#define WM_DDE_FIRST 0x03E0
+#define WM_DDE_INITIATE (WM_DDE_FIRST)
+#define WM_DDE_TERMINATE (WM_DDE_FIRST+1)
+#define WM_DDE_ADVISE (WM_DDE_FIRST+2)
+#define WM_DDE_UNADVISE (WM_DDE_FIRST+3)
+#define WM_DDE_ACK (WM_DDE_FIRST+4)
+#define WM_DDE_DATA (WM_DDE_FIRST+5)
+#define WM_DDE_REQUEST (WM_DDE_FIRST+6)
+#define WM_DDE_POKE (WM_DDE_FIRST+7)
+#define WM_DDE_EXECUTE (WM_DDE_FIRST+8)
+#define WM_DDE_LAST (WM_DDE_FIRST+8)
+
+/****************************************************************************\
+* DDEACK structure
+*
+* Structure of wStatus (LOWORD(lParam)) in WM_DDE_ACK message
+* sent in response to a WM_DDE_DATA, WM_DDE_REQUEST, WM_DDE_POKE,
+* WM_DDE_ADVISE, or WM_DDE_UNADVISE message.
+*
+\****************************************************************************/
+
+typedef struct tagDDEACK
+{
+ WORD bAppReturnCode:8,
+ reserved:6,
+ fBusy:1,
+ fAck:1;
+} DDEACK;
+
+/****************************************************************************\
+* DDEADVISE structure
+*
+* WM_DDE_ADVISE parameter structure for hOptions (LOWORD(lParam))
+*
+\****************************************************************************/
+
+typedef struct tagDDEADVISE
+{
+ WORD reserved:14,
+ fDeferUpd:1,
+ fAckReq:1;
+ short cfFormat;
+} DDEADVISE;
+
+/****************************************************************************\
+* DDEDATA structure
+*
+* WM_DDE_DATA parameter structure for hData (LOWORD(lParam)).
+* The actual size of this structure depends on the size of
+* the Value array.
+*
+\****************************************************************************/
+
+typedef struct tagDDEDATA
+{
+ WORD unused:12,
+ fResponse:1,
+ fRelease:1,
+ reserved:1,
+ fAckReq:1;
+ short cfFormat;
+ BYTE Value[1];
+} DDEDATA;
+
+
+/****************************************************************************\
+* DDEPOKE structure
+*
+* WM_DDE_POKE parameter structure for hData (LOWORD(lParam)).
+* The actual size of this structure depends on the size of
+* the Value array.
+*
+\****************************************************************************/
+
+typedef struct tagDDEPOKE
+{
+ WORD unused:13, /* Earlier versions of DDE.H incorrectly */
+ /* 12 unused bits. */
+ fRelease:1,
+ fReserved:2;
+ short cfFormat;
+ BYTE Value[1]; /* This member was named rgb[1] in previous */
+ /* versions of DDE.H */
+
+} DDEPOKE;
+
+/****************************************************************************\
+* The following typedef's were used in previous versions of the Windows SDK.
+* They are still valid. The above typedef's define exactly the same structures
+* as those below. The above typedef names are recommended, however, as they
+* are more meaningful.
+*
+* Note that the DDEPOKE structure typedef'ed in earlier versions of DDE.H did
+* not correctly define the bit positions.
+\****************************************************************************/
+
+typedef struct tagDDELN
+{
+ WORD unused:13,
+ fRelease:1,
+ fDeferUpd:1,
+ fAckReq:1;
+ short cfFormat;
+} DDELN;
+
+typedef struct tagDDEUP
+{
+ WORD unused:12,
+ fAck:1,
+ fRelease:1,
+ fReserved:1,
+ fAckReq:1;
+ short cfFormat;
+ BYTE rgb[1];
+} DDEUP;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* RC_INVOKED */
+
+#endif /* _INC_DDE */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/ddeml.h b/private/oleauto/tools/win16/hdos/c800/include/ddeml.h
new file mode 100644
index 000000000..89e17033e
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/ddeml.h
@@ -0,0 +1,457 @@
+/*****************************************************************************\
+* *
+* ddeml.h - DDEML API header file *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+#ifndef _INC_DDEML
+#define _INC_DDEML
+
+#ifndef RC_INVOKED
+#pragma pack(1)
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+#ifndef _INC_WINDOWS /* If not included with 3.1 headers... */
+#define LPCSTR LPSTR
+#define WINAPI FAR PASCAL
+#define CALLBACK FAR PASCAL
+#define UINT WORD
+#define LPARAM LONG
+#define WPARAM WORD
+#define LRESULT LONG
+#define HMODULE HANDLE
+#define HINSTANCE HANDLE
+#define HLOCAL HANDLE
+#define HGLOBAL HANDLE
+#endif /* _INC_WINDOWS */
+
+#ifndef DECLARE_HANDLE32
+#ifdef STRICT
+#define DECLARE_HANDLE32(name) struct name##__ { int unused; }; \
+ typedef const struct name##__ _far* name
+#else /* STRICT */
+#define DECLARE_HANDLE32(name) typedef DWORD name
+#endif /* !STRICT */
+#endif /* !DECLARE_HANDLE32 */
+
+#define EXPENTRY WINAPI
+
+/******** public types ********/
+
+DECLARE_HANDLE32(HCONVLIST);
+DECLARE_HANDLE32(HCONV);
+DECLARE_HANDLE32(HSZ);
+DECLARE_HANDLE32(HDDEDATA);
+
+/* the following structure is for use with XTYP_WILDCONNECT processing. */
+
+typedef struct tagHSZPAIR
+{
+ HSZ hszSvc;
+ HSZ hszTopic;
+} HSZPAIR;
+typedef HSZPAIR FAR *PHSZPAIR;
+
+/* The following structure is used by DdeConnect() and DdeConnectList() and
+ by XTYP_CONNECT and XTYP_WILDCONNECT callbacks. */
+
+typedef struct tagCONVCONTEXT
+{
+ UINT cb; /* set to sizeof(CONVCONTEXT) */
+ UINT wFlags; /* none currently defined. */
+ UINT wCountryID; /* country code for topic/item strings used. */
+ int iCodePage; /* codepage used for topic/item strings. */
+ DWORD dwLangID; /* language ID for topic/item strings. */
+ DWORD dwSecurity; /* Private security code. */
+} CONVCONTEXT;
+typedef CONVCONTEXT FAR *PCONVCONTEXT;
+
+/* The following structure is used by DdeQueryConvInfo(): */
+
+typedef struct tagCONVINFO
+{
+ DWORD cb; /* sizeof(CONVINFO) */
+ DWORD hUser; /* user specified field */
+ HCONV hConvPartner; /* hConv on other end or 0 if non-ddemgr partner */
+ HSZ hszSvcPartner; /* app name of partner if obtainable */
+ HSZ hszServiceReq; /* AppName requested for connection */
+ HSZ hszTopic; /* Topic name for conversation */
+ HSZ hszItem; /* transaction item name or NULL if quiescent */
+ UINT wFmt; /* transaction format or NULL if quiescent */
+ UINT wType; /* XTYP_ for current transaction */
+ UINT wStatus; /* ST_ constant for current conversation */
+ UINT wConvst; /* XST_ constant for current transaction */
+ UINT wLastError; /* last transaction error. */
+ HCONVLIST hConvList; /* parent hConvList if this conversation is in a list */
+ CONVCONTEXT ConvCtxt; /* conversation context */
+} CONVINFO;
+typedef CONVINFO FAR *PCONVINFO;
+
+/***** conversation states (usState) *****/
+
+#define XST_NULL 0 /* quiescent states */
+#define XST_INCOMPLETE 1
+#define XST_CONNECTED 2
+#define XST_INIT1 3 /* mid-initiation states */
+#define XST_INIT2 4
+#define XST_REQSENT 5 /* active conversation states */
+#define XST_DATARCVD 6
+#define XST_POKESENT 7
+#define XST_POKEACKRCVD 8
+#define XST_EXECSENT 9
+#define XST_EXECACKRCVD 10
+#define XST_ADVSENT 11
+#define XST_UNADVSENT 12
+#define XST_ADVACKRCVD 13
+#define XST_UNADVACKRCVD 14
+#define XST_ADVDATASENT 15
+#define XST_ADVDATAACKRCVD 16
+
+/* used in LOWORD(dwData1) of XTYP_ADVREQ callbacks... */
+#define CADV_LATEACK 0xFFFF
+
+/***** conversation status bits (fsStatus) *****/
+
+#define ST_CONNECTED 0x0001
+#define ST_ADVISE 0x0002
+#define ST_ISLOCAL 0x0004
+#define ST_BLOCKED 0x0008
+#define ST_CLIENT 0x0010
+#define ST_TERMINATED 0x0020
+#define ST_INLIST 0x0040
+#define ST_BLOCKNEXT 0x0080
+#define ST_ISSELF 0x0100
+
+/* DDE constants for wStatus field */
+
+#define DDE_FACK 0x8000
+#define DDE_FBUSY 0x4000
+#define DDE_FDEFERUPD 0x4000
+#define DDE_FACKREQ 0x8000
+#define DDE_FRELEASE 0x2000
+#define DDE_FREQUESTED 0x1000
+#define DDE_FACKRESERVED 0x3ff0
+#define DDE_FADVRESERVED 0x3fff
+#define DDE_FDATRESERVED 0x4fff
+#define DDE_FPOKRESERVED 0xdfff
+#define DDE_FAPPSTATUS 0x00ff
+#define DDE_FNOTPROCESSED 0x0000
+
+/***** message filter hook types *****/
+
+#define MSGF_DDEMGR 0x8001
+
+/***** codepage constants ****/
+
+#define CP_WINANSI 1004 /* default codepage for windows & old DDE convs. */
+
+/***** transaction types *****/
+
+#define XTYPF_NOBLOCK 0x0002 /* CBR_BLOCK will not work */
+#define XTYPF_NODATA 0x0004 /* DDE_FDEFERUPD */
+#define XTYPF_ACKREQ 0x0008 /* DDE_FACKREQ */
+
+#define XCLASS_MASK 0xFC00
+#define XCLASS_BOOL 0x1000
+#define XCLASS_DATA 0x2000
+#define XCLASS_FLAGS 0x4000
+#define XCLASS_NOTIFICATION 0x8000
+
+#define XTYP_ERROR (0x0000 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK )
+#define XTYP_ADVDATA (0x0010 | XCLASS_FLAGS )
+#define XTYP_ADVREQ (0x0020 | XCLASS_DATA | XTYPF_NOBLOCK )
+#define XTYP_ADVSTART (0x0030 | XCLASS_BOOL )
+#define XTYP_ADVSTOP (0x0040 | XCLASS_NOTIFICATION)
+#define XTYP_EXECUTE (0x0050 | XCLASS_FLAGS )
+#define XTYP_CONNECT (0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK)
+#define XTYP_CONNECT_CONFIRM (0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)
+#define XTYP_XACT_COMPLETE (0x0080 | XCLASS_NOTIFICATION )
+#define XTYP_POKE (0x0090 | XCLASS_FLAGS )
+#define XTYP_REGISTER (0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)
+#define XTYP_REQUEST (0x00B0 | XCLASS_DATA )
+#define XTYP_DISCONNECT (0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)
+#define XTYP_UNREGISTER (0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)
+#define XTYP_WILDCONNECT (0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK)
+
+#define XTYP_MASK 0x00F0
+#define XTYP_SHIFT 4 /* shift to turn XTYP_ into an index */
+
+/***** Timeout constants *****/
+
+#define TIMEOUT_ASYNC -1L
+
+/***** Transaction ID constants *****/
+
+#define QID_SYNC -1L
+
+/****** public strings used in DDE ******/
+
+#define SZDDESYS_TOPIC "System"
+#define SZDDESYS_ITEM_TOPICS "Topics"
+#define SZDDESYS_ITEM_SYSITEMS "SysItems"
+#define SZDDESYS_ITEM_RTNMSG "ReturnMessage"
+#define SZDDESYS_ITEM_STATUS "Status"
+#define SZDDESYS_ITEM_FORMATS "Formats"
+#define SZDDESYS_ITEM_HELP "Help"
+#define SZDDE_ITEM_ITEMLIST "TopicItemList"
+
+
+/****** API entry points ******/
+
+typedef HDDEDATA CALLBACK FNCALLBACK(UINT wType, UINT wFmt, HCONV hConv,
+ HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2);
+typedef FNCALLBACK *PFNCALLBACK;
+
+#define CBR_BLOCK 0xffffffffL
+
+/* DLL registration functions */
+
+UINT WINAPI DdeInitialize(DWORD FAR* pidInst, PFNCALLBACK pfnCallback,
+ DWORD afCmd, DWORD ulRes);
+
+/*
+ * Callback filter flags for use with standard apps.
+ */
+
+#define CBF_FAIL_SELFCONNECTIONS 0x00001000
+#define CBF_FAIL_CONNECTIONS 0x00002000
+#define CBF_FAIL_ADVISES 0x00004000
+#define CBF_FAIL_EXECUTES 0x00008000
+#define CBF_FAIL_POKES 0x00010000
+#define CBF_FAIL_REQUESTS 0x00020000
+#define CBF_FAIL_ALLSVRXACTIONS 0x0003f000
+
+#define CBF_SKIP_CONNECT_CONFIRMS 0x00040000
+#define CBF_SKIP_REGISTRATIONS 0x00080000
+#define CBF_SKIP_UNREGISTRATIONS 0x00100000
+#define CBF_SKIP_DISCONNECTS 0x00200000
+#define CBF_SKIP_ALLNOTIFICATIONS 0x003c0000
+
+/*
+ * Application command flags
+ */
+#define APPCMD_CLIENTONLY 0x00000010L
+#define APPCMD_FILTERINITS 0x00000020L
+#define APPCMD_MASK 0x00000FF0L
+
+/*
+ * Application classification flags
+ */
+#define APPCLASS_STANDARD 0x00000000L
+#define APPCLASS_MASK 0x0000000FL
+
+
+BOOL WINAPI DdeUninitialize(DWORD idInst);
+
+/* conversation enumeration functions */
+
+HCONVLIST WINAPI DdeConnectList(DWORD idInst, HSZ hszService, HSZ hszTopic,
+ HCONVLIST hConvList, CONVCONTEXT FAR* pCC);
+HCONV WINAPI DdeQueryNextServer(HCONVLIST hConvList, HCONV hConvPrev);
+BOOL WINAPI DdeDisconnectList(HCONVLIST hConvList);
+
+/* conversation control functions */
+
+HCONV WINAPI DdeConnect(DWORD idInst, HSZ hszService, HSZ hszTopic,
+ CONVCONTEXT FAR* pCC);
+BOOL WINAPI DdeDisconnect(HCONV hConv);
+HCONV WINAPI DdeReconnect(HCONV hConv);
+
+UINT WINAPI DdeQueryConvInfo(HCONV hConv, DWORD idTransaction, CONVINFO FAR* pConvInfo);
+BOOL WINAPI DdeSetUserHandle(HCONV hConv, DWORD id, DWORD hUser);
+
+BOOL WINAPI DdeAbandonTransaction(DWORD idInst, HCONV hConv, DWORD idTransaction);
+
+
+/* app server interface functions */
+
+BOOL WINAPI DdePostAdvise(DWORD idInst, HSZ hszTopic, HSZ hszItem);
+BOOL WINAPI DdeEnableCallback(DWORD idInst, HCONV hConv, UINT wCmd);
+
+#define EC_ENABLEALL 0
+#define EC_ENABLEONE ST_BLOCKNEXT
+#define EC_DISABLE ST_BLOCKED
+#define EC_QUERYWAITING 2
+
+HDDEDATA WINAPI DdeNameService(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT afCmd);
+
+#define DNS_REGISTER 0x0001
+#define DNS_UNREGISTER 0x0002
+#define DNS_FILTERON 0x0004
+#define DNS_FILTEROFF 0x0008
+
+/* app client interface functions */
+
+HDDEDATA WINAPI DdeClientTransaction(void FAR* pData, DWORD cbData,
+ HCONV hConv, HSZ hszItem, UINT wFmt, UINT wType,
+ DWORD dwTimeout, DWORD FAR* pdwResult);
+
+/* data transfer functions */
+
+HDDEDATA WINAPI DdeCreateDataHandle(DWORD idInst, void FAR* pSrc, DWORD cb,
+ DWORD cbOff, HSZ hszItem, UINT wFmt, UINT afCmd);
+HDDEDATA WINAPI DdeAddData(HDDEDATA hData, void FAR* pSrc, DWORD cb, DWORD cbOff);
+DWORD WINAPI DdeGetData(HDDEDATA hData, void FAR* pDst, DWORD cbMax, DWORD cbOff);
+BYTE FAR* WINAPI DdeAccessData(HDDEDATA hData, DWORD FAR* pcbDataSize);
+BOOL WINAPI DdeUnaccessData(HDDEDATA hData);
+BOOL WINAPI DdeFreeDataHandle(HDDEDATA hData);
+
+#define HDATA_APPOWNED 0x0001
+
+
+
+UINT WINAPI DdeGetLastError(DWORD idInst);
+
+#define DMLERR_NO_ERROR 0 /* must be 0 */
+
+#define DMLERR_FIRST 0x4000
+
+#define DMLERR_ADVACKTIMEOUT 0x4000
+#define DMLERR_BUSY 0x4001
+#define DMLERR_DATAACKTIMEOUT 0x4002
+#define DMLERR_DLL_NOT_INITIALIZED 0x4003
+#define DMLERR_DLL_USAGE 0x4004
+#define DMLERR_EXECACKTIMEOUT 0x4005
+#define DMLERR_INVALIDPARAMETER 0x4006
+#define DMLERR_LOW_MEMORY 0x4007
+#define DMLERR_MEMORY_ERROR 0x4008
+#define DMLERR_NOTPROCESSED 0x4009
+#define DMLERR_NO_CONV_ESTABLISHED 0x400a
+#define DMLERR_POKEACKTIMEOUT 0x400b
+#define DMLERR_POSTMSG_FAILED 0x400c
+#define DMLERR_REENTRANCY 0x400d
+#define DMLERR_SERVER_DIED 0x400e
+#define DMLERR_SYS_ERROR 0x400f
+#define DMLERR_UNADVACKTIMEOUT 0x4010
+#define DMLERR_UNFOUND_QUEUE_ID 0x4011
+
+#define DMLERR_LAST 0x4011
+
+HSZ WINAPI DdeCreateStringHandle(DWORD idInst, LPCSTR psz, int iCodePage);
+DWORD WINAPI DdeQueryString(DWORD idInst, HSZ hsz, LPSTR psz, DWORD cchMax, int iCodePage);
+BOOL WINAPI DdeFreeStringHandle(DWORD idInst, HSZ hsz);
+BOOL WINAPI DdeKeepStringHandle(DWORD idInst, HSZ hsz);
+int WINAPI DdeCmpStringHandles(HSZ hsz1, HSZ hsz2);
+
+
+#ifndef NODDEMLSPY
+/* */
+/* DDEML public debugging header file info */
+/* */
+
+typedef struct tagMONMSGSTRUCT
+{
+ UINT cb;
+ HWND hwndTo;
+ DWORD dwTime;
+ HANDLE hTask;
+ UINT wMsg;
+ WPARAM wParam;
+ LPARAM lParam;
+} MONMSGSTRUCT;
+
+typedef struct tagMONCBSTRUCT
+{
+ UINT cb;
+ WORD wReserved;
+ DWORD dwTime;
+ HANDLE hTask;
+ DWORD dwRet;
+ UINT wType;
+ UINT wFmt;
+ HCONV hConv;
+ HSZ hsz1;
+ HSZ hsz2;
+ HDDEDATA hData;
+ DWORD dwData1;
+ DWORD dwData2;
+} MONCBSTRUCT;
+
+typedef struct tagMONHSZSTRUCT
+{
+ UINT cb;
+ BOOL fsAction; /* MH_ value */
+ DWORD dwTime;
+ HSZ hsz;
+ HANDLE hTask;
+ WORD wReserved;
+ char str[1];
+} MONHSZSTRUCT;
+
+#define MH_CREATE 1
+#define MH_KEEP 2
+#define MH_DELETE 3
+#define MH_CLEANUP 4
+
+
+typedef struct tagMONERRSTRUCT
+{
+ UINT cb;
+ UINT wLastError;
+ DWORD dwTime;
+ HANDLE hTask;
+} MONERRSTRUCT;
+
+typedef struct tagMONLINKSTRUCT
+{
+ UINT cb;
+ DWORD dwTime;
+ HANDLE hTask;
+ BOOL fEstablished;
+ BOOL fNoData;
+ HSZ hszSvc;
+ HSZ hszTopic;
+ HSZ hszItem;
+ UINT wFmt;
+ BOOL fServer;
+ HCONV hConvServer;
+ HCONV hConvClient;
+} MONLINKSTRUCT;
+
+typedef struct tagMONCONVSTRUCT
+{
+ UINT cb;
+ BOOL fConnect;
+ DWORD dwTime;
+ HANDLE hTask;
+ HSZ hszSvc;
+ HSZ hszTopic;
+ HCONV hConvClient;
+ HCONV hConvServer;
+} MONCONVSTRUCT;
+
+#define MAX_MONITORS 4
+#define APPCLASS_MONITOR 0x00000001L
+#define XTYP_MONITOR (0x00F0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)
+
+/*
+ * Callback filter flags for use with MONITOR apps - 0 implies no monitor
+ * callbacks.
+ */
+#define MF_HSZ_INFO 0x01000000
+#define MF_SENDMSGS 0x02000000
+#define MF_POSTMSGS 0x04000000
+#define MF_CALLBACKS 0x08000000
+#define MF_ERRORS 0x10000000
+#define MF_LINKS 0x20000000
+#define MF_CONV 0x40000000
+
+#define MF_MASK 0xFF000000
+#endif /* NODDEMLSPY */
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* RC_INVOKED */
+
+#endif /* _INC_DDEML */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/direct.h b/private/oleauto/tools/win16/hdos/c800/include/direct.h
new file mode 100644
index 000000000..a3d25b055
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/direct.h
@@ -0,0 +1,51 @@
+/***
+*direct.h - function declarations for directory handling/creation
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file contains the function declarations for the library
+* functions related to directory handling and creation.
+*
+****/
+
+#ifndef _INC_DIRECT
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+/* function prototypes */
+
+int __cdecl _chdir(const char *);
+int __cdecl _chdrive(int);
+char * __cdecl _getcwd(char *, int);
+char * __cdecl _getdcwd(int, char *, int);
+int __cdecl _getdrive(void);
+int __cdecl _mkdir(const char *);
+int __cdecl _rmdir(const char *);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+int __cdecl chdir(const char *);
+char * __cdecl getcwd(char *, int);
+int __cdecl mkdir(const char *);
+int __cdecl rmdir(const char *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_DIRECT
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/dlgs.h b/private/oleauto/tools/win16/hdos/c800/include/dlgs.h
new file mode 100644
index 000000000..d701b0f05
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/dlgs.h
@@ -0,0 +1,192 @@
+/*****************************************************************************\
+* *
+* dlgs.h - Common dialog's dialog element ID numbers *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_DLGS
+#define _INC_DLGS
+
+#define ctlFirst 0x0400
+#define ctlLast 0x04ff
+ /* Push buttons */
+#define psh1 0x0400
+#define psh2 0x0401
+#define psh3 0x0402
+#define psh4 0x0403
+#define psh5 0x0404
+#define psh6 0x0405
+#define psh7 0x0406
+#define psh8 0x0407
+#define psh9 0x0408
+#define psh10 0x0409
+#define psh11 0x040a
+#define psh12 0x040b
+#define psh13 0x040c
+#define psh14 0x040d
+#define psh15 0x040e
+#define pshHelp psh15
+#define psh16 0x040f
+ /* Checkboxes */
+#define chx1 0x0410
+#define chx2 0x0411
+#define chx3 0x0412
+#define chx4 0x0413
+#define chx5 0x0414
+#define chx6 0x0415
+#define chx7 0x0416
+#define chx8 0x0417
+#define chx9 0x0418
+#define chx10 0x0419
+#define chx11 0x041a
+#define chx12 0x041b
+#define chx13 0x041c
+#define chx14 0x041d
+#define chx15 0x041e
+#define chx16 0x041f
+ /* Radio buttons */
+#define rad1 0x0420
+#define rad2 0x0421
+#define rad3 0x0422
+#define rad4 0x0423
+#define rad5 0x0424
+#define rad6 0x0425
+#define rad7 0x0426
+#define rad8 0x0427
+#define rad9 0x0428
+#define rad10 0x0429
+#define rad11 0x042a
+#define rad12 0x042b
+#define rad13 0x042c
+#define rad14 0x042d
+#define rad15 0x042e
+#define rad16 0x042f
+ /* Groups, frames, rectangles, and icons */
+#define grp1 0x0430
+#define grp2 0x0431
+#define grp3 0x0432
+#define grp4 0x0433
+#define frm1 0x0434
+#define frm2 0x0435
+#define frm3 0x0436
+#define frm4 0x0437
+#define rct1 0x0438
+#define rct2 0x0439
+#define rct3 0x043a
+#define rct4 0x043b
+#define ico1 0x043c
+#define ico2 0x043d
+#define ico3 0x043e
+#define ico4 0x043f
+ /* Static text */
+#define stc1 0x0440
+#define stc2 0x0441
+#define stc3 0x0442
+#define stc4 0x0443
+#define stc5 0x0444
+#define stc6 0x0445
+#define stc7 0x0446
+#define stc8 0x0447
+#define stc9 0x0448
+#define stc10 0x0449
+#define stc11 0x044a
+#define stc12 0x044b
+#define stc13 0x044c
+#define stc14 0x044d
+#define stc15 0x044e
+#define stc16 0x044f
+#define stc17 0x0450
+#define stc18 0x0451
+#define stc19 0x0452
+#define stc20 0x0453
+#define stc21 0x0454
+#define stc22 0x0455
+#define stc23 0x0456
+#define stc24 0x0457
+#define stc25 0x0458
+#define stc26 0x0459
+#define stc27 0x045a
+#define stc28 0x045b
+#define stc29 0x045c
+#define stc30 0x045d
+#define stc31 0x045e
+#define stc32 0x045f
+ /* Listboxes */
+#define lst1 0x0460
+#define lst2 0x0461
+#define lst3 0x0462
+#define lst4 0x0463
+#define lst5 0x0464
+#define lst6 0x0465
+#define lst7 0x0466
+#define lst8 0x0467
+#define lst9 0x0468
+#define lst10 0x0469
+#define lst11 0x046a
+#define lst12 0x046b
+#define lst13 0x046c
+#define lst14 0x046d
+#define lst15 0x046e
+#define lst16 0x046f
+ /* Combo boxes */
+#define cmb1 0x0470
+#define cmb2 0x0471
+#define cmb3 0x0472
+#define cmb4 0x0473
+#define cmb5 0x0474
+#define cmb6 0x0475
+#define cmb7 0x0476
+#define cmb8 0x0477
+#define cmb9 0x0478
+#define cmb10 0x0479
+#define cmb11 0x047a
+#define cmb12 0x047b
+#define cmb13 0x047c
+#define cmb14 0x047d
+#define cmb15 0x047e
+#define cmb16 0x047f
+ /* Edit controls */
+#define edt1 0x0480
+#define edt2 0x0481
+#define edt3 0x0482
+#define edt4 0x0483
+#define edt5 0x0484
+#define edt6 0x0485
+#define edt7 0x0486
+#define edt8 0x0487
+#define edt9 0x0488
+#define edt10 0x0489
+#define edt11 0x048a
+#define edt12 0x048b
+#define edt13 0x048c
+#define edt14 0x048d
+#define edt15 0x048e
+#define edt16 0x048f
+ /* Scroll bars */
+#define scr1 0x0490
+#define scr2 0x0491
+#define scr3 0x0492
+#define scr4 0x0493
+#define scr5 0x0494
+#define scr6 0x0495
+#define scr7 0x0496
+#define scr8 0x0497
+
+/* These dialog resource ordinals really start at 0x0600, but the
+ * RC Compiler can't handle hex for resource IDs, hence the decimal.
+ */
+#define FILEOPENORD 1536
+#define MULTIFILEOPENORD 1537
+#define PRINTDLGORD 1538
+#define PRNSETUPDLGORD 1539
+#define FINDDLGORD 1540
+#define REPLACEDLGORD 1541
+#define FONTDLGORD 1542
+#define FORMATDLGORD31 1543
+#define FORMATDLGORD30 1544
+
+#endif /* !_INC_DLGS */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/dos.h b/private/oleauto/tools/win16/hdos/c800/include/dos.h
new file mode 100644
index 000000000..ac7d26535
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/dos.h
@@ -0,0 +1,330 @@
+/***
+*dos.h - definitions for MS-DOS interface routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines the structs and unions used for the direct DOS interface
+* routines; includes macros to access the segment and offset
+* values of far pointers, so that they may be used by the routines; and
+* provides function prototypes for direct DOS interface functions.
+*
+****/
+
+#ifndef _INC_DOS
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __interrupt _interrupt
+#define __near _near
+#endif
+
+#ifndef _REGS_DEFINED
+
+/* word registers */
+
+struct _WORDREGS {
+ unsigned int ax;
+ unsigned int bx;
+ unsigned int cx;
+ unsigned int dx;
+ unsigned int si;
+ unsigned int di;
+ unsigned int cflag;
+ };
+
+/* byte registers */
+
+struct _BYTEREGS {
+ unsigned char al, ah;
+ unsigned char bl, bh;
+ unsigned char cl, ch;
+ unsigned char dl, dh;
+ };
+
+/* general purpose registers union -
+ * overlays the corresponding word and byte registers.
+ */
+
+union _REGS {
+ struct _WORDREGS x;
+ struct _BYTEREGS h;
+ };
+
+/* segment registers */
+
+struct _SREGS {
+ unsigned int es;
+ unsigned int cs;
+ unsigned int ss;
+ unsigned int ds;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+struct WORDREGS {
+ unsigned int ax;
+ unsigned int bx;
+ unsigned int cx;
+ unsigned int dx;
+ unsigned int si;
+ unsigned int di;
+ unsigned int cflag;
+ };
+
+struct BYTEREGS {
+ unsigned char al, ah;
+ unsigned char bl, bh;
+ unsigned char cl, ch;
+ unsigned char dl, dh;
+ };
+
+union REGS {
+ struct WORDREGS x;
+ struct BYTEREGS h;
+ };
+
+struct SREGS {
+ unsigned int es;
+ unsigned int cs;
+ unsigned int ss;
+ unsigned int ds;
+ };
+
+#endif
+
+#define _REGS_DEFINED
+#endif
+
+
+/* dosexterror structure */
+
+#ifndef _DOSERROR_DEFINED
+#pragma pack(2)
+
+struct _DOSERROR {
+ int exterror;
+ char errclass;
+ char action;
+ char locus;
+ };
+
+#if ((!defined (__STDC__)) && (!defined (__cplusplus)))
+/* Non-ANSI name for compatibility */
+struct DOSERROR {
+ int exterror;
+ char class;
+ char action;
+ char locus;
+ };
+#endif
+
+#pragma pack()
+#define _DOSERROR_DEFINED
+#endif
+
+
+/* _dos_findfirst structure */
+
+#ifndef _FIND_T_DEFINED
+#pragma pack(2)
+
+struct _find_t {
+ char reserved[21];
+ char attrib;
+ unsigned wr_time;
+ unsigned wr_date;
+ long size;
+ char name[13];
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+#define find_t _find_t
+#endif
+
+#pragma pack()
+#define _FIND_T_DEFINED
+#endif
+
+
+/* _dos_getdate/_dossetdate and _dos_gettime/_dos_settime structures */
+
+#ifndef _DATETIME_T_DEFINED
+#pragma pack(2)
+
+struct _dosdate_t {
+ unsigned char day; /* 1-31 */
+ unsigned char month; /* 1-12 */
+ unsigned int year; /* 1980-2099 */
+ unsigned char dayofweek; /* 0-6, 0=Sunday */
+ };
+
+struct _dostime_t {
+ unsigned char hour; /* 0-23 */
+ unsigned char minute; /* 0-59 */
+ unsigned char second; /* 0-59 */
+ unsigned char hsecond; /* 0-99 */
+ };
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define dosdate_t _dosdate_t
+#define dostime_t _dostime_t
+#endif
+
+#pragma pack()
+#define _DATETIME_T_DEFINED
+#endif
+
+
+/* _dos_getdiskfree structure */
+
+#ifndef _DISKFREE_T_DEFINED
+
+struct _diskfree_t {
+ unsigned total_clusters;
+ unsigned avail_clusters;
+ unsigned sectors_per_cluster;
+ unsigned bytes_per_sector;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+#define diskfree_t _diskfree_t
+#endif
+
+#define _DISKFREE_T_DEFINED
+#endif
+
+
+/* manifest constants for _hardresume result parameter */
+
+#define _HARDERR_IGNORE 0 /* Ignore the error */
+#define _HARDERR_RETRY 1 /* Retry the operation */
+#define _HARDERR_ABORT 2 /* Abort program issuing Interrupt 23h */
+#define _HARDERR_FAIL 3 /* Fail the system call in progress */
+ /* _HARDERR_FAIL is not supported on DOS 2.x */
+
+/* File attribute constants */
+
+#define _A_NORMAL 0x00 /* Normal file - No read/write restrictions */
+#define _A_RDONLY 0x01 /* Read only file */
+#define _A_HIDDEN 0x02 /* Hidden file */
+#define _A_SYSTEM 0x04 /* System file */
+#define _A_VOLID 0x08 /* Volume ID file */
+#define _A_SUBDIR 0x10 /* Subdirectory */
+#define _A_ARCH 0x20 /* Archive file */
+
+/* macros to break C "far" pointers into their segment and offset components
+ */
+
+#define _FP_SEG(fp) (*((unsigned __far *)&(fp)+1))
+#define _FP_OFF(fp) (*((unsigned __far *)&(fp)))
+
+/* macro to construct a far pointer from segment and offset values
+ */
+
+#define _MK_FP(seg, offset) (void __far *)(((unsigned long)seg << 16) \
+ + (unsigned long)(unsigned)offset)
+
+/* external variable declarations */
+
+extern unsigned int __near __cdecl _osversion;
+
+
+/* function prototypes */
+
+#ifndef _MT
+int __cdecl _bdos(int, unsigned int, unsigned int);
+#ifndef _WINDOWS
+void __cdecl _chain_intr(void (__cdecl __interrupt __far *)());
+#endif
+void __cdecl _disable(void);
+#ifndef _WINDOWS
+unsigned __cdecl _dos_allocmem(unsigned, unsigned *);
+#endif
+unsigned __cdecl _dos_close(int);
+unsigned __cdecl _dos_commit(int);
+unsigned __cdecl _dos_creat(const char *, unsigned, int *);
+unsigned __cdecl _dos_creatnew(const char *, unsigned, int *);
+unsigned __cdecl _dos_findfirst(const char *, unsigned, struct _find_t *);
+unsigned __cdecl _dos_findnext(struct _find_t *);
+#ifndef _WINDOWS
+unsigned __cdecl _dos_freemem(unsigned);
+#endif
+void __cdecl _dos_getdate(struct _dosdate_t *);
+void __cdecl _dos_getdrive(unsigned *);
+unsigned __cdecl _dos_getdiskfree(unsigned, struct _diskfree_t *);
+unsigned __cdecl _dos_getfileattr(const char *, unsigned *);
+unsigned __cdecl _dos_getftime(int, unsigned *, unsigned *);
+void __cdecl _dos_gettime(struct _dostime_t *);
+void (__cdecl __interrupt __far * __cdecl _dos_getvect(unsigned))();
+#ifndef _WINDOWS
+void __cdecl _dos_keep(unsigned, unsigned);
+#endif
+unsigned __cdecl _dos_lock(int, int, unsigned long, unsigned long);
+unsigned __cdecl _dos_open(const char *, unsigned, int *);
+unsigned __cdecl _dos_read(int, void __far *, unsigned, unsigned *);
+unsigned long __cdecl _dos_seek(int, unsigned long, int);
+#ifndef _WINDOWS
+unsigned __cdecl _dos_setblock(unsigned, unsigned, unsigned *);
+#endif
+unsigned __cdecl _dos_setdate(struct _dosdate_t *);
+void __cdecl _dos_setdrive(unsigned, unsigned *);
+unsigned __cdecl _dos_setfileattr(const char *, unsigned);
+unsigned __cdecl _dos_setftime(int, unsigned, unsigned);
+unsigned __cdecl _dos_settime(struct _dostime_t *);
+#ifndef _WINDOWS
+void __cdecl _dos_setvect(unsigned, void (__cdecl __interrupt __far *)());
+#endif
+unsigned __cdecl _dos_write(int, const void __far *, unsigned, unsigned *);
+int __cdecl _dosexterr(struct _DOSERROR *);
+void __cdecl _enable(void);
+#ifndef _WINDOWS
+void __cdecl _harderr(void (__far __cdecl *)(unsigned, unsigned,
+ unsigned __far *));
+void __cdecl _hardresume(int);
+void __cdecl _hardretn(int);
+#endif
+int __cdecl _intdos(union _REGS *, union _REGS *);
+int __cdecl _intdosx(union _REGS *, union _REGS *, struct _SREGS *);
+int __cdecl _int86(int, union _REGS *, union _REGS *);
+int __cdecl _int86x(int, union _REGS *, union _REGS *, struct _SREGS *);
+#endif
+
+void __cdecl _segread(struct _SREGS *);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define FP_SEG _FP_SEG
+#define FP_OFF _FP_OFF
+#define MK_FP _MK_FP
+
+#ifndef _MT
+int __cdecl bdos(int, unsigned int, unsigned int);
+int __cdecl intdos(union REGS *, union REGS *);
+int __cdecl intdosx(union REGS *, union REGS *, struct SREGS *);
+int __cdecl int86(int, union REGS *, union REGS *);
+int __cdecl int86x(int, union REGS *, union REGS *, struct SREGS *);
+#ifndef __cplusplus
+int __cdecl dosexterr(struct DOSERROR *);
+#endif
+#endif
+void __cdecl segread(struct SREGS *);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_DOS
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/drivinit.h b/private/oleauto/tools/win16/hdos/c800/include/drivinit.h
new file mode 100644
index 000000000..9db28db67
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/drivinit.h
@@ -0,0 +1,2 @@
+/* OBSOLETE: Use print.h instead */
+#include <print.h>
diff --git a/private/oleauto/tools/win16/hdos/c800/include/errno.h b/private/oleauto/tools/win16/hdos/c800/include/errno.h
new file mode 100644
index 000000000..765712619
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/errno.h
@@ -0,0 +1,80 @@
+/***
+*errno.h - system wide error numbers (set by system calls)
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the system-wide error numbers (set by
+* system calls). Conforms to the XENIX standard. Extended
+* for compatibility with Uniforum standard.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_ERRNO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+/* declare reference to errno */
+
+#ifdef _MT
+extern int __far * __cdecl __far volatile _errno(void);
+#define errno (*_errno())
+#else
+extern int __near __cdecl volatile errno;
+#endif
+
+/* Error Codes */
+
+#define EZERO 0
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define EUCLEAN 35
+#define EDEADLOCK 36
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_ERRNO
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/fcntl.h b/private/oleauto/tools/win16/hdos/c800/include/fcntl.h
new file mode 100644
index 000000000..2cf377be0
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/fcntl.h
@@ -0,0 +1,54 @@
+/***
+*fcntl.h - file control options used by open()
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines constants for the file control options used
+* by the open() function.
+* [System V]
+*
+****/
+
+#ifndef _INC_FCNTL
+
+#define _O_RDONLY 0x0000 /* open for reading only */
+#define _O_WRONLY 0x0001 /* open for writing only */
+#define _O_RDWR 0x0002 /* open for reading and writing */
+#define _O_APPEND 0x0008 /* writes done at eof */
+
+#define _O_CREAT 0x0100 /* create and open file */
+#define _O_TRUNC 0x0200 /* open and truncate */
+#define _O_EXCL 0x0400 /* open only if file doesn't already exist */
+
+/* _O_TEXT files have <cr><lf> sequences translated to <lf> on read()'s,
+** and <lf> sequences translated to <cr><lf> on write()'s
+*/
+
+#define _O_TEXT 0x4000 /* file mode is text (translated) */
+#define _O_BINARY 0x8000 /* file mode is binary (untranslated) */
+
+/* macro to translate the C 2.0 name used to force binary mode for files */
+
+#define _O_RAW _O_BINARY
+
+/* Open handle inherit bit */
+
+#define _O_NOINHERIT 0x0080 /* child process doesn't inherit file */
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define O_RDONLY _O_RDONLY
+#define O_WRONLY _O_WRONLY
+#define O_RDWR _O_RDWR
+#define O_APPEND _O_APPEND
+#define O_CREAT _O_CREAT
+#define O_TRUNC _O_TRUNC
+#define O_EXCL _O_EXCL
+#define O_TEXT _O_TEXT
+#define O_BINARY _O_BINARY
+#define O_NOINHERIT _O_NOINHERIT
+#endif
+
+#define _INC_FCNTL
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/fgraph.fd b/private/oleauto/tools/win16/hdos/c800/include/fgraph.fd
new file mode 100644
index 000000000..68937c99a
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/fgraph.fd
@@ -0,0 +1,372 @@
+C fgraph.fd - declare constants and functions for graphics library
+C
+C Copyright (c) 1987-1993 Microsoft Corporation. All rights reserved.
+C
+C Purpose:
+C This file declares the graphics library functions and
+C the constants that are used with them.
+C
+C
+
+$NOTRUNCATE ! required for some names to be significant
+$NOTSTRICT ! uses structures which are non-standard conforming
+
+C User-visible declarations for FORTRAN Graphics Library
+
+C Structure for getvideoconfig() as visible to user
+ STRUCTURE/videoconfig/
+ INTEGER*2 numxpixels ! number of pixels on X axis
+ INTEGER*2 numypixels ! number of pixels on Y axis
+ INTEGER*2 numtextcols ! number of text columns available
+ INTEGER*2 numtextrows ! number of text rows available
+ INTEGER*2 numcolors ! number of actual colors
+ INTEGER*2 bitsperpixel ! number of bits per pixel
+ INTEGER*2 numvideopages ! number of available video pages
+ INTEGER*2 mode ! current video mode
+ INTEGER*2 adapter ! active display adapter
+ INTEGER*2 monitor ! active display monitor
+ INTEGER*2 memory ! adapter video memory in K bytes
+ END STRUCTURE
+
+C Return value of getcurrentposition(), etc.
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+
+C Structure for text position
+ STRUCTURE/rccoord/
+ INTEGER*2 row
+ INTEGER*2 col
+ END STRUCTURE
+
+C ERROR HANDLING
+
+C Status info returned by grstatus()
+ INTEGER*2 $GRPARAMETERALTERED,$GRCLIPPED,$GRNOOUTPUT,$GROK,
+ + $GRERROR,$GRMODENOTSUPPORTED,$GRNOTINPROPERMODE,
+ + $GRINVALIDPARAMETER,$GRFONTFILENOTFOUND,
+ + $GRINVALIDFONTFILE,$GRCORRUPTEDFONTFILE,
+ + $GRINSUFFICIENTMEMORY,$GRINVALIDIMAGEBUFFER
+C Successful
+ PARAMETER($GROK = 0) ! success
+C Warnings
+ PARAMETER($GRNOOUTPUT = 1) ! nothing drawn
+ PARAMETER($GRCLIPPED = 2) ! output was partially clipped
+ PARAMETER($GRPARAMETERALTERED = 3) ! input parameters adjusted
+ PARAMETER($GRTEXTNOTSUPPORTED = 4) ! SuperVGA text output may fail
+C Errors
+ PARAMETER($GRERROR = -1) ! generic graphics error
+ PARAMETER($GRMODENOTSUPPORTED = -2) ! video mode not supported
+ PARAMETER($GRNOTINPROPERMODE = -3) ! not supported in current mode
+ PARAMETER($GRINVALIDPARAMETER = -4) ! bad parameter
+ PARAMETER($GRFONTFILENOTFOUND = -5) ! font file not found
+ PARAMETER($GRINVALIDFONTFILE = -6) ! not a font file
+ PARAMETER($GRCORRUPTEDFONTFILE = -7) ! inconsistent font file
+ PARAMETER($GRINSUFFICIENTMEMORY = -8) ! out of memory
+ PARAMETER($GRINVALIDIMAGEBUFFER = -9) ! bad image buffer detected
+
+C SETUP AND CONFIGURATION
+
+C Arguments to setvideomode()
+ INTEGER*2 $MAXRESMODE,$MAXCOLORMODE,$DEFAULTMODE,$TEXTBW40,
+ + $TEXTC40,$TEXTBW80,$TEXTC80,$MRES4COLOR,$MRESNOCOLOR,
+ + $HRESBW,$TEXTMONO,$HERCMONO,$MRES16COLOR,$HRES16COLOR,
+ + $ERESNOCOLOR,$ERESCOLOR,$VRES2COLOR,$VRES16COLOR,
+ + $MRES256COLOR,$ORESCOLOR,$SRES16COLOR,$SRES256COLOR,
+ + $XRES16COLOR,$XRES256COLOR,$ZRES16COLOR,$ZRES256COLOR
+ PARAMETER($MAXRESMODE =-3) ! graphics mode with highest resolution
+ PARAMETER($MAXCOLORMODE =-2) ! graphics mode with most colors
+ PARAMETER($DEFAULTMODE =-1) ! restore screen to original mode
+ PARAMETER($TEXTBW40 =0) ! 40 x 25 text, 16 grey
+ PARAMETER($TEXTC40 =1) ! 40 x 25 text, 16/8 color
+ PARAMETER($TEXTBW80 =2) ! 80 x 25 text, 16 grey
+ PARAMETER($TEXTC80 =3) ! 80 x 25 text, 16/8 color
+ PARAMETER($MRES4COLOR =4) ! 320 x 200, 4 color
+ PARAMETER($MRESNOCOLOR =5) ! 320 x 200, 4 grey
+ PARAMETER($HRESBW =6) ! 640 x 200, BW
+ PARAMETER($TEXTMONO =7) ! 80 x 25 text, BW
+ PARAMETER($HERCMONO =8) ! 720 x 348, BW for HGC
+ PARAMETER($MRES16COLOR =13) ! 320 x 200, 16 color
+ PARAMETER($HRES16COLOR =14) ! 640 x 200, 16 color
+ PARAMETER($ERESNOCOLOR =15) ! 640 x 350, BW
+ PARAMETER($ERESCOLOR =16) ! 640 x 350, 4 or 16 color
+ PARAMETER($VRES2COLOR =17) ! 640 x 480, BW
+ PARAMETER($VRES16COLOR =18) ! 640 x 480, 16 color
+ PARAMETER($MRES256COLOR =19) ! 320 x 200, 256 color
+ PARAMETER($ORESCOLOR =64) ! 640 x 400, 1 of 16 colors (Olivetti)
+
+C The following 8 modes require VESA SuperVGA BIOS extensions
+ PARAMETER($ORES256COLOR =#0100) ! 640 x 400, 256 color
+ PARAMETER($VRES256COLOR =#0101) ! 640 x 480, 256 color
+
+C WARNING: DO NOT attempt to set the following modes without ensuring
+C that your monitor can safely handle that resolution. Otherwise, you
+C may risk damaging your display monitor! Consult your owner's manual
+C for details.
+C Note: _MAXRESMODE and _MAXCOLORMODE never select SRES, XRES, or ZRES
+C modes.
+
+C Requires NEC MultiSync 3D or equivalent, or better
+ PARAMETER($SRES16COLOR =#0102) ! 800 x 600, 16 color
+ PARAMETER($SRES256COLOR =#0103) ! 800 x 600, 256 color
+
+C Requires NEC MultiSync 4D or equivalent, or better
+ PARAMETER($XRES16COLOR =#0104) ! 1024 x 768, 16 color
+ PARAMETER($XRES256COLOR =#0105) ! 1024 x 768, 256 color
+
+C Requires NEC MultiSync 5D or equivalent, or better
+ PARAMETER($ZRES16COLOR =#0106) ! 1280 x 1024, 16 color
+ PARAMETER($ZRES256COLOR =#0107) ! 1280 x 1024, 256 color
+
+C VIDEOCONFIG adapter values
+
+C These constants can be used to determine the type of the active
+C adapter, using either simple comparisons or the bitwise-AND operator.
+ INTEGER*2 $QUICKWIN, $MDPA,$CGA,$EGA,$MCGA,$VGA,$HGC,$OCGA,
+ + $OEGA,$OVGA
+ PARAMETER($QUICKWIN =#0000) ! QuickWin graphics
+ PARAMETER($MDPA =#0001) ! Monochrome Display Adapter (MDPA)
+ PARAMETER($CGA =#0002) ! Color Graphics Adapter (CGA)
+ PARAMETER($EGA =#0004) ! Enhanced Graphics Adapter (EGA)
+ PARAMETER($VGA =#0008) ! Video Graphics Array (VGA)
+ PARAMETER($MCGA =#0010) ! MultiColor Graphics Array (MCGA)
+ PARAMETER($HGC =#0020) ! Hercules Graphics Card (HGC)
+ PARAMETER($OCGA =#0042) ! Olivetti Color Graphics Adapter (OCGA)
+ PARAMETER($OEGA =#0044) ! Olivetti Enhanced Graphics Adapter (OEGA)
+ PARAMETER($OVGA =#0048) ! Olivetti Video Graphics Array (OVGA)
+ PARAMETER($SVGA =#0088) ! Super VGA with VESA BIOS support (SVGA)
+
+C VIDEOCONFIG monitor values
+
+C These constants can be used to determine the type of monitor in
+C use, using either simple comparisons or the bitwise-AND operator
+ INTEGER*2 $MONO,$COLOR,$ENHCOLOR,$ANALOGMONO,
+ + $ANALOGCOLOR,$ANALOG
+ PARAMETER($MONO =#0001) ! Monochrome
+ PARAMETER($COLOR =#0002) ! Color (or Enhanced emulating color)
+ PARAMETER($ENHCOLOR =#0004) ! Enhanced Color
+ PARAMETER($ANALOGMONO =#0008) ! Analog Monochrome only
+ PARAMETER($ANALOGCOLOR=#0010) ! Analog Color only
+ PARAMETER($ANALOG =#0018) ! Analog Color + Analog Monochrome
+
+C COORDINATE SYSTEMS
+
+C OUTPUT ROUTINES
+
+C Control parameters for rectangle(), polygon(), ellipse(), and pie()
+ INTEGER*2 $GBORDER,$GFILLINTERIOR
+ PARAMETER($GBORDER =2) ! draw outline only
+ PARAMETER($GFILLINTERIOR =3) ! fill using current fill mask
+
+C Parameters for clearscreen()
+ INTEGER*2 $GCLEARSCREEN,$GVIEWPORT,$GWINDOW
+ PARAMETER($GCLEARSCREEN =0)
+ PARAMETER($GVIEWPORT =1)
+ PARAMETER($GWINDOW =2)
+
+C TEXT
+
+C Parameters for displaycursor()
+ INTEGER*2 $GCURSOROFF,$GCURSORON
+ PARAMETER($GCURSOROFF =0)
+ PARAMETER($GCURSORON =1)
+
+C Parameters for wrapon()
+ INTEGER*2 $GWRAPOFF,$GWRAPON
+ PARAMETER($GWRAPOFF =0)
+ PARAMETER($GWRAPON =1)
+
+C Parameters for scrolltextwindow()
+ INTEGER*2 $GSCROLLUP,$GSCROLLDOWN
+ PARAMETER($GSCROLLUP =1)
+ PARAMETER($GSCROLLDOWN =-1)
+
+C Request maximum number of rows in _settextrows() and _setvideomoderows()
+ INTEGER*2 $MAXTEXTROWS
+ PARAMETER($MAXTEXTROWS =-1)
+
+C "Action verbs" for putimage(), setwritemode()
+ INTEGER*2 $GPSET,$GPRESET,$GAND,$GOR,$GXOR
+ PARAMETER($GPSET =3)
+ PARAMETER($GPRESET =2)
+ PARAMETER($GAND =1)
+ PARAMETER($GOR =0)
+ PARAMETER($GXOR =4)
+
+C Color values are used with setbkcolor in graphics modes and also by
+C remappalette abd remapallpalette. Also known as palette colors.
+C Not to be confused with color indices (aka. color attributes).
+
+C Universal color values (all color modes):
+ INTEGER*4 $BLACK,$BLUE,$GREEN,$CYAN,$RED,$MAGENTA,$BROWN,
+ + $WHITE,$GRAY,$LIGHTBLUE,$LIGHTGREEN,$LIGHTCYAN,
+ + $LIGHTRED,$LIGHTMAGENTA,$YELLOW,$BRIGHTWHITE
+ PARAMETER($BLACK =#000000)
+ PARAMETER($BLUE =#2a0000)
+ PARAMETER($GREEN =#002a00)
+ PARAMETER($CYAN =#2a2a00)
+ PARAMETER($RED =#00002a)
+ PARAMETER($MAGENTA =#2a002a)
+ PARAMETER($BROWN =#00152a)
+ PARAMETER($WHITE =#2a2a2a)
+ PARAMETER($GRAY =#151515)
+ PARAMETER($LIGHTBLUE =#3F1515)
+ PARAMETER($LIGHTGREEN =#153f15)
+ PARAMETER($LIGHTCYAN =#3f3f15)
+ PARAMETER($LIGHTRED =#15153f)
+ PARAMETER($LIGHTMAGENTA =#3f153f)
+ PARAMETER($YELLOW =#153f3f)
+ PARAMETER($BRIGHTWHITE =#3f3f3f)
+
+C The following is obsolescent and defined only for backwards
+C compatibility.
+ INTEGER*4 $LIGHTYELLOW
+ PARAMETER($LIGHTYELLOW =#153f3f)
+
+C Mono mode F ($ERESNOCOLOR) color values:
+ INTEGER*4 $MODEFOFF,$MODEFOFFTOON,$MODEFOFFTOHI,$MODEFONTOOFF,
+ + $MODEFON,$MODEFONTOHI,$MODEFHITOOFF,$MODEFHITOON,
+ + $MODEFHI
+ PARAMETER($MODEFOFF =0)
+ PARAMETER($MODEFOFFTOON =1)
+ PARAMETER($MODEFOFFTOHI =2)
+ PARAMETER($MODEFONTOOFF =3)
+ PARAMETER($MODEFON =4)
+ PARAMETER($MODEFONTOHI =5)
+ PARAMETER($MODEFHITOOFF =6)
+ PARAMETER($MODEFHITOON =7)
+ PARAMETER($MODEFHI =8)
+
+C Mono mode 7 ($TEXTMONO) color values:
+ INTEGER*4 $MODE7OFF,$MODE7ON,$MODE7HI
+ PARAMETER($MODE7OFF =0)
+ PARAMETER($MODE7ON =1)
+ PARAMETER($MODE7HI =2)
+
+C External function declarations
+
+ INTEGER*2 grstatus[EXTERN]
+ INTEGER*2 setvideomode[EXTERN]
+ INTEGER*2 setvideomoderows[EXTERN]
+ INTEGER*2 setactivepage[EXTERN]
+ INTEGER*2 setvisualpage[EXTERN]
+ INTEGER*2 getactivepage[EXTERN]
+ INTEGER*2 getvisualpage[EXTERN]
+ EXTERNAL getvideoconfig
+ EXTERNAL setvieworg
+ EXTERNAL getviewcoord
+ EXTERNAL getphyscoord
+ EXTERNAL setcliprgn
+ EXTERNAL setviewport
+ EXTERNAL clearscreen
+ EXTERNAL moveto
+ EXTERNAL getcurrentposition
+ INTEGER*2 lineto[EXTERN]
+ INTEGER*2 rectangle[EXTERN]
+ INTEGER*2 polygon[EXTERN]
+ INTEGER*2 ellipse[EXTERN]
+ INTEGER*2 arc[EXTERN]
+ INTEGER*2 pie[EXTERN]
+ INTEGER*2 getarcinfo[EXTERN]
+ INTEGER*2 setpixel[EXTERN]
+ INTEGER*2 getpixel[EXTERN]
+ INTEGER*2 floodfill[EXTERN]
+ INTEGER*2 setcolor[EXTERN]
+ INTEGER*2 getcolor[EXTERN]
+
+ EXTERNAL setlinestyle
+ INTEGER*2 getlinestyle[EXTERN]
+ INTEGER*2 setwritemode[EXTERN]
+ INTEGER*2 getwritemode[EXTERN]
+ EXTERNAL setfillmask
+ EXTERNAL getfillmask
+ INTEGER*4 setbkcolor[EXTERN]
+ INTEGER*4 getbkcolor[EXTERN]
+ INTEGER*4 remappalette[EXTERN]
+ INTEGER*2 remapallpalette[EXTERN]
+ INTEGER*2 selectpalette[EXTERN]
+ INTEGER*2 settextrows[EXTERN]
+ EXTERNAL settextwindow
+ EXTERNAL gettextwindow
+ EXTERNAL scrolltextwindow
+ EXTERNAL outtext
+ INTEGER*2 wrapon[EXTERN]
+ INTEGER*2 displaycursor[EXTERN]
+ INTEGER*2 settextcursor[EXTERN]
+ INTEGER*2 gettextcursor[EXTERN]
+ EXTERNAL settextposition
+ EXTERNAL gettextposition
+ INTEGER*2 settextcolor[EXTERN]
+ INTEGER*2 gettextcolor[EXTERN]
+ EXTERNAL getimage
+ EXTERNAL putimage
+ INTEGER*4 imagesize[EXTERN]
+
+C External function declarations for QuickWin Graphics API's
+ INTEGER*2 INCHARQQ[EXTERN]
+ INTEGER*2 WGOPENQQ[EXTERN]
+ INTEGER*2 WGCLOSEQQ[EXTERN]
+ INTEGER*2 WGSETACTIVEQQ[EXTERN]
+ INTEGER*2 WGGETACTIVEQQ[EXTERN]
+
+C WINDOW COORDINATE SYSTEM
+
+C Structure for window coordinate pair
+ STRUCTURE/wxycoord/
+ DOUBLE PRECISION wx ! window x coordinate
+ DOUBLE PRECISION wy ! window y coordinate
+ END STRUCTURE
+
+ INTEGER*2 setwindow[EXTERN]
+
+ EXTERNAL getwindowcoord
+ EXTERNAL getviewcoord_w
+ EXTERNAL getcurrentposition_w
+
+C Window coordinate entry points for graphics output routines
+
+ INTEGER*2 arc_w[EXTERN]
+ INTEGER*2 ellipse_w[EXTERN]
+ INTEGER*2 floodfill_w[EXTERN]
+ INTEGER*2 getpixel_w[EXTERN]
+ INTEGER*2 lineto_w[EXTERN]
+ EXTERNAL moveto_w
+ INTEGER*2 pie_w[EXTERN]
+ INTEGER*2 rectangle_w[EXTERN]
+ INTEGER*2 polygon_w[EXTERN]
+ INTEGER*2 setpixel_w[EXTERN]
+ EXTERNAL getimage_w
+ INTEGER*4 imagesize_w[EXTERN]
+ EXTERNAL putimage_w
+
+ STRUCTURE/fontinfo/
+ INTEGER*2 type ! b0 set = vector,clear = bit map
+ INTEGER*2 ascent ! pix dist from top to baseline
+ INTEGER*2 pixwidth ! character width in pixels, 0=prop
+ INTEGER*2 pixheight ! character height in pixels
+ INTEGER*2 avgwidth ! average character width in pixels
+ CHARACTER*81 filename ! file name including path
+ CHARACTER*32 facename ! font name
+ END STRUCTURE
+
+C Font parameters
+
+ INTEGER*2 $NO_SPACE,$FIXED_SPACE,$PROP_SPACE
+ PARAMETER ($NO_SPACE = 0)
+ PARAMETER ($FIXED_SPACE = 1)
+ PARAMETER ($PROP_SPACE = 2)
+
+ INTEGER*2 $NO_FONT_MAP,$VECTOR_MAP,$BIT_MAP
+ PARAMETER ($NO_FONT_MAP = 0)
+ PARAMETER ($VECTOR_MAP = 1)
+ PARAMETER ($BIT_MAP = 2)
+
+ INTEGER*2 registerfonts[EXTERN]
+ EXTERNAL unregisterfonts
+ INTEGER*2 setfont[EXTERN]
+ INTEGER*2 getfontinfo[EXTERN]
+ EXTERNAL outgtext
+ INTEGER*2 getgtextextent[EXTERN]
+ EXTERNAL setgtextvector
+ EXTERNAL getgtextvector
diff --git a/private/oleauto/tools/win16/hdos/c800/include/fgraph.fi b/private/oleauto/tools/win16/hdos/c800/include/fgraph.fi
new file mode 100644
index 000000000..e7a34a9a0
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/fgraph.fi
@@ -0,0 +1,506 @@
+C
+C fgraph.fi - declare constants and functions for graphics library
+C
+C Copyright (c) 1987-1993 Microsoft Corporation. All rights reserved.
+C
+C Purpose:
+C This file declares the graphics library functions and
+C the manifest constants that are used with them.
+C
+
+$NOTRUNCATE
+$NOTSTRICT
+
+C User-visible declarations for FORTRAN Graphics Library
+
+ INTERFACE TO FUNCTION arc(x1,y1,x2,y2,x3,y3,x4,y4)
+ INTEGER*2 arc[FAR,C,ALIAS:"__arc"],x1,y1,x2,y2,x3,y3,x4,y4
+ END
+
+ INTERFACE TO FUNCTION arc_w(wx1,wy1,wx2,wy2,wx3,wy3,wx4,wy4)
+ INTEGER*2 arc_w[FAR,C,ALIAS:"__arc_w"]
+ DOUBLE PRECISION wx1,wy1,wx2,wy2,wx3,wy3,wx4,wy4
+ END
+
+ INTERFACE TO FUNCTION getarcinfo(lpstart,lpend,lppaint)
+ INTEGER*2 getarcinfo[FAR,C,ALIAS:"__getarcinfo"]
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+ RECORD/xycoord/lpstart[FAR,REFERENCE]
+ RECORD/xycoord/lpend[FAR,REFERENCE]
+ RECORD/xycoord/lppaint[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + clearscreen[FAR,C,ALIAS:"__clearscreen"](area)
+ INTEGER*2 area
+ END
+
+ INTERFACE TO FUNCTION displaycursor(toggle)
+ INTEGER*2 displaycursor[FAR,C,ALIAS:"__displaycursor"],toggle
+ END
+
+ INTERFACE TO FUNCTION ellipse(control,x1,y1,x2,y2)
+ INTEGER*2 ellipse[FAR,C,ALIAS:"__ellipse"],control,x1,y1,x2,y2
+ END
+
+ INTERFACE TO FUNCTION ellipse_w(control,wx1,wy1,wx2,wy2)
+ INTEGER*2 ellipse_w[FAR,C,ALIAS:"__ellipse_w"],control
+ DOUBLE PRECISION wx1,wy1,wx2,wy2
+ END
+
+ INTERFACE TO FUNCTION floodfill(x,y,boundary)
+ INTEGER*2 floodfill[FAR,C,ALIAS:"__floodfill"],x,y,boundary
+ END
+
+ INTERFACE TO FUNCTION floodfill_w(wx1,wy1,boundary)
+ INTEGER*2 floodfill_w[FAR,C,ALIAS:"__floodfill_w"],boundary
+ DOUBLE PRECISION wx1,wy1
+ END
+
+ INTERFACE TO FUNCTION getactivepage()
+ INTEGER*2 getactivepage[FAR,C,ALIAS:"__getactivepage"]
+ END
+
+ INTERFACE TO FUNCTION getbkcolor()
+ INTEGER*4 getbkcolor[FAR,C,ALIAS:"__getbkcolor"]
+ END
+
+ INTERFACE TO FUNCTION getcolor()
+ INTEGER*2 getcolor[FAR,C,ALIAS:"__getcolor"]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getcurrentposition[FAR,C,ALIAS:"__f_getcurrentposition"](s)
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+ RECORD/xycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getcurrentposition_w[FAR,C,ALIAS:"__f_getcurrentposition_wxy"](s)
+ STRUCTURE/wxycoord/
+ DOUBLE PRECISION wx
+ DOUBLE PRECISION wy
+ END STRUCTURE
+ RECORD/wxycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getfillmask[FAR,C,ALIAS:"__getfillmask"](mask)
+ INTEGER*1 mask[FAR,REFERENCE](8)
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getimage[FAR,C,ALIAS:"__getimage"](x1,y1,x2,y2,image)
+ INTEGER*2 x1,y1,x2,y2
+ INTEGER*1 image[FAR,REFERENCE](*)
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getimage_w[FAR,C,ALIAS:"__getimage_w"](wx1,wy1,wx2,wy2,image)
+ DOUBLE PRECISION wx1,wy1,wx2,wy2
+ INTEGER*1 image[FAR,REFERENCE](*)
+ END
+
+ INTERFACE TO FUNCTION getlinestyle()
+ INTEGER*2 getlinestyle[FAR,C,ALIAS:"__getlinestyle"]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getphyscoord[FAR,C,ALIAS:"__f_getphyscoord"](x,y,s)
+ INTEGER*2 x,y
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+ RECORD/xycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION getpixel(x,y)
+ INTEGER*2 getpixel[FAR,C,ALIAS:"__getpixel"],x,y
+ END
+
+ INTERFACE TO FUNCTION getpixel_w(wx,wy)
+ INTEGER*2 getpixel_w[FAR,C,ALIAS:"__getpixel_w"]
+ DOUBLE PRECISION wx,wy
+ END
+
+ INTERFACE TO FUNCTION gettextcolor()
+ INTEGER*2 gettextcolor[FAR,C,ALIAS:"__gettextcolor"]
+ END
+
+ INTERFACE TO FUNCTION gettextcursor()
+ INTEGER*2 gettextcursor[FAR,C,ALIAS:"__gettextcursor"]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + gettextposition[FAR,C,ALIAS:"__f_gettextposition"](s)
+ STRUCTURE/rccoord/
+ INTEGER*2 row
+ INTEGER*2 col
+ END STRUCTURE
+ RECORD/rccoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + gettextwindow[FAR,C,ALIAS:"__gettextwindow"](r1,c1,r2,c2)
+ INTEGER*2 r1[FAR,REFERENCE],c1[FAR,REFERENCE]
+ INTEGER*2 r2[FAR,REFERENCE],c2[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getvideoconfig[FAR,C,ALIAS:"__getvideoconfig"](s)
+ STRUCTURE/videoconfig/
+ INTEGER*2 numxpixels ! number of pixels on X axis
+ INTEGER*2 numypixels ! number of pixels on Y axis
+ INTEGER*2 numtextcols ! number of text columns available
+ INTEGER*2 numtextrows ! number of text rows available
+ INTEGER*2 numcolors ! number of actual colors
+ INTEGER*2 bitsperpixel ! number of bits per pixel
+ INTEGER*2 numvideopages ! number of available video pages
+ INTEGER*2 mode ! current video mode
+ INTEGER*2 adapter ! active display adapter
+ INTEGER*2 monitor ! active display monitor
+ INTEGER*2 memory ! adapter video memory in K bytes
+ END STRUCTURE
+ RECORD/videoconfig/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getviewcoord[FAR,C,ALIAS:"__f_getviewcoord"](x,y,s)
+ INTEGER*2 x,y
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+ RECORD/xycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getviewcoord_w[FAR,C,ALIAS:"__f_getviewcoord_w"](wx,wy,s)
+ DOUBLE PRECISION wx,wy
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+ RECORD/xycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION getvisualpage()
+ INTEGER*2 getvisualpage[FAR,C,ALIAS:"__getvisualpage"]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getwindowcoord[FAR,C,ALIAS:"__f_getwindowcoord"](x,y,s)
+ INTEGER*2 x,y
+ STRUCTURE/wxycoord/
+ DOUBLE PRECISION wx
+ DOUBLE PRECISION wy
+ END STRUCTURE
+ RECORD/wxycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION getwritemode()
+ INTEGER*2 getwritemode[FAR,C,ALIAS:"__getwritemode"]
+ END
+
+ INTERFACE TO FUNCTION grstatus()
+ INTEGER*2 grstatus[FAR,C,ALIAS:"__grstatus"]
+ END
+
+ INTERFACE TO FUNCTION imagesize(x1,y1,x2,y2)
+ INTEGER*4 imagesize[FAR,C,ALIAS:"__imagesize"]
+ INTEGER*2 x1,y1,x2,y2
+ END
+
+ INTERFACE TO FUNCTION imagesize_w(wx1,wy1,wx2,wy2)
+ INTEGER*4 imagesize_w[FAR,C,ALIAS:"__imagesize_w"]
+ DOUBLE PRECISION wx1,wy1,wx2,wy2
+ END
+
+ INTERFACE TO FUNCTION lineto(x,y)
+ INTEGER*2 lineto[FAR,C,ALIAS:"__lineto"],x,y
+ END
+
+ INTERFACE TO FUNCTION lineto_w(wx,wy)
+ INTEGER*2 lineto_w[FAR,C,ALIAS:"__lineto_w"]
+ DOUBLE PRECISION wx,wy
+ END
+
+ INTERFACE TO SUBROUTINE
+ + moveto[FAR,C,ALIAS:"__f_moveto"](x,y,s)
+ INTEGER*2 x,y
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+ RECORD/xycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + moveto_w[FAR,C,ALIAS:"__f_moveto_w"](wx,wy,s)
+ DOUBLE PRECISION wx,wy
+ STRUCTURE/wxycoord/
+ DOUBLE PRECISION wx
+ DOUBLE PRECISION wy
+ END STRUCTURE
+ RECORD/wxycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + outtext[FAR,C,ALIAS:"__f_outtext"](text)
+ CHARACTER*(*) text[FAR,REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION pie(i,x1,y1,x2,y2,x3,y3,x4,y4)
+ INTEGER*2 pie[FAR,C,ALIAS:"__pie"],i,x1,y1,x2,y2,x3,y3,x4,y4
+ END
+
+ INTERFACE TO FUNCTION pie_w(i,wx1,wy1,wx2,wy2,wx3,wy3,wx4,wy4)
+ INTEGER*2 pie_w[FAR,C,ALIAS:"__pie_w"],i
+ DOUBLE PRECISION wx1,wy1,wx2,wy2,wx3,wy3,wx4,wy4
+ END
+
+ INTERFACE TO FUNCTION polygon(control,lppoints,cpoints)
+ INTEGER*2 polygon[FAR,C,ALIAS:"__polygon"],control,cpoints
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+ RECORD/xycoord/lppoints[FAR,REFERENCE](*)
+ END
+
+ INTERFACE TO FUNCTION polygon_w(control,lppoints,cpoints)
+ INTEGER*2 polygon_w[FAR,C,ALIAS:"__polygon_w"],control,cpoints
+ STRUCTURE/wxycoord/
+ DOUBLE PRECISION wx
+ DOUBLE PRECISION wy
+ END STRUCTURE
+ RECORD/wxycoord/lppoints[FAR,REFERENCE](*)
+ END
+
+ INTERFACE TO SUBROUTINE
+ + putimage[FAR,C,ALIAS:"__putimage"](x,y,image,action)
+ INTEGER*2 x,y,action
+ INTEGER*1 image[FAR,REFERENCE](*)
+ END
+
+ INTERFACE TO SUBROUTINE
+ + putimage_w[FAR,C,ALIAS:"__putimage_w"](wx,wy,image,action)
+ DOUBLE PRECISION wx,wy
+ INTEGER*1 image[FAR,REFERENCE](*)
+ INTEGER*2 action
+ END
+
+ INTERFACE TO FUNCTION rectangle(control,x1,y1,x2,y2)
+ INTEGER*2 rectangle[FAR,C,ALIAS:"__rectangle"]
+ INTEGER*2 control,x1,y1,x2,y2
+ END
+
+ INTERFACE TO FUNCTION rectangle_w(control,wx1,wy1,wx2,wy2)
+ INTEGER*2 rectangle_w[FAR,C,ALIAS:"__rectangle_w"],control
+ DOUBLE PRECISION wx1,wy1,wx2,wy2
+ END
+
+ INTERFACE TO FUNCTION remappalette(index,color)
+ INTEGER*4 remappalette[FAR,C,ALIAS:"__remappalette"],color
+ INTEGER*2 index
+ END
+
+ INTERFACE TO FUNCTION remapallpalette(colors)
+ INTEGER*2 remapallpalette[FAR,C,ALIAS:"__remapallpalette"]
+ INTEGER*4 colors[FAR,REFERENCE](*)
+ END
+
+ INTERFACE TO SUBROUTINE
+ + scrolltextwindow[FAR,C,ALIAS:"__scrolltextwindow"](rows)
+ INTEGER*2 rows
+ END
+
+ INTERFACE TO FUNCTION selectpalette(number)
+ INTEGER*2 selectpalette[FAR,C,ALIAS:"__selectpalette"],number
+ END
+
+ INTERFACE TO FUNCTION setactivepage(page)
+ INTEGER*2 setactivepage[FAR,C,ALIAS:"__setactivepage"],page
+ END
+
+ INTERFACE TO FUNCTION setbkcolor(color)
+ INTEGER*4 setbkcolor[FAR,C,ALIAS:"__setbkcolor"],color
+ END
+
+ INTERFACE TO SUBROUTINE
+ + setcliprgn[FAR,C,ALIAS:"__setcliprgn"](x1,y1,x2,y2)
+ INTEGER*2 x1,y1,x2,y2
+ END
+
+ INTERFACE TO FUNCTION setcolor(color)
+ INTEGER*2 setcolor[FAR,C,ALIAS:"__setcolor"]
+ INTEGER*2 color
+ END
+
+ INTERFACE TO SUBROUTINE
+ + setfillmask[FAR,C,ALIAS:"__setfillmask"](mask)
+ INTEGER*1 mask[FAR,REFERENCE](8)
+ END
+
+ INTERFACE TO SUBROUTINE
+ + setlinestyle[FAR,C,ALIAS:"__setlinestyle"](mask)
+ INTEGER*2 mask
+ END
+
+ INTERFACE TO FUNCTION setpixel(x,y)
+ INTEGER*2 setpixel[FAR,C,ALIAS:"__setpixel"],x,y
+ END
+
+ INTERFACE TO FUNCTION setpixel_w(wx,wy)
+ INTEGER*2 setpixel_w[FAR,C,ALIAS:"__setpixel_w"]
+ DOUBLE PRECISION wx,wy
+ END
+
+ INTERFACE TO FUNCTION settextcolor(index)
+ INTEGER*2 settextcolor[FAR,C,ALIAS:"__settextcolor"],index
+ END
+
+ INTERFACE TO FUNCTION settextcursor(attr)
+ INTEGER*2 settextcursor[FAR,C,ALIAS:"__settextcursor"],attr
+ END
+
+ INTERFACE TO SUBROUTINE
+ + settextposition[FAR,C,ALIAS:"__f_settextposition"](row,col,s)
+ INTEGER*2 row,col
+ STRUCTURE/rccoord/
+ INTEGER*2 row
+ INTEGER*2 col
+ END STRUCTURE
+ RECORD/rccoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION settextrows(rows)
+ INTEGER*2 settextrows[FAR,C,ALIAS:"__settextrows"],rows
+ END
+
+ INTERFACE TO SUBROUTINE
+ + settextwindow[FAR,C,ALIAS:"__settextwindow"](r1,c1,r2,c2)
+ INTEGER*2 r1,c1,r2,c2
+ END
+
+ INTERFACE TO FUNCTION setvideomode(mode)
+ INTEGER*2 setvideomode[FAR,C,ALIAS:"__setvideomode"],mode
+ END
+
+ INTERFACE TO FUNCTION setvideomoderows(mode,rows)
+ INTEGER*2 setvideomoderows[FAR,C,ALIAS:"__setvideomoderows"]
+ INTEGER*2 mode,rows
+ END
+
+ INTERFACE TO SUBROUTINE
+ + setvieworg[FAR,C,ALIAS:"__f_setvieworg"](x,y,s)
+ INTEGER*2 x,y
+ STRUCTURE/xycoord/
+ INTEGER*2 xcoord
+ INTEGER*2 ycoord
+ END STRUCTURE
+ RECORD/xycoord/s[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + setviewport[FAR,C,ALIAS:"__setviewport"](x1,y1,x2,y2)
+ INTEGER*2 x1,y1,x2,y2
+ END
+
+ INTERFACE TO FUNCTION setvisualpage(page)
+ INTEGER*2 setvisualpage[FAR,C,ALIAS:"__setvisualpage"],page
+ END
+
+ INTERFACE TO FUNCTION setwindow(finvert,wx1,wy1,wx2,wy2)
+ INTEGER*2 setwindow[FAR,C,ALIAS:"__setwindow"]
+ LOGICAL*2 finvert
+ DOUBLE PRECISION wx1,wy1,wx2,wy2
+ END
+
+ INTERFACE TO FUNCTION setwritemode(wmode)
+ INTEGER*2 setwritemode[FAR,C,ALIAS:"__setwritemode"],wmode
+ END
+
+ INTERFACE TO FUNCTION wrapon(option)
+ INTEGER*2 wrapon[FAR,C,ALIAS:"__wrapon"],option
+ END
+
+C FONTS
+
+ INTERFACE TO FUNCTION getfontinfo(fi)
+ INTEGER*2 getfontinfo[FAR,C,ALIAS:"__f_getfontinfo"]
+ STRUCTURE/fontinfo/
+ INTEGER*2 type ! b0 set = vector,clear = bit map
+ INTEGER*2 ascent ! pix dist from top to baseline
+ INTEGER*2 pixwidth ! character width in pixels, 0=prop
+ INTEGER*2 pixheight ! character height in pixels
+ INTEGER*2 avgwidth ! average character width in pixels
+ CHARACTER*81 filename ! file name including path
+ CHARACTER*32 facename ! font name
+ END STRUCTURE
+ RECORD/fontinfo/fi[FAR,REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION getgtextextent(text)
+ INTEGER*2 getgtextextent[FAR,C,ALIAS:"__f_getgtextextent"]
+ CHARACTER*(*) text[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + getgtextvector[FAR,C,ALIAS:"__f_getgtextvector"](x,y)
+ INTEGER*2 x[FAR,REFERENCE],y[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + outgtext[FAR,C,ALIAS:"__f_outgtext"](text)
+ CHARACTER*(*) text[FAR,REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION registerfonts(filename)
+ INTEGER*2 registerfonts[FAR,C,ALIAS:"__f_registerfonts"]
+ CHARACTER*(*) filename[FAR,REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION setfont(options)
+ INTEGER*2 setfont[FAR,C,ALIAS:"__f_setfont"]
+ CHARACTER*(*) options[FAR,REFERENCE]
+ END
+
+ INTERFACE TO SUBROUTINE
+ + setgtextvector[FAR,C,ALIAS:"__setgtextvector"](x,y)
+ INTEGER*2 x,y
+ END
+
+ INTERFACE TO SUBROUTINE
+ + unregisterfonts[FAR,C,ALIAS:"__unregisterfonts"]()
+ END
+
+C QuickWin Graphics API's
+
+ INTERFACE TO FUNCTION INCHARQQ()
+ INTEGER*2 INCHARQQ[FAR,C,ALIAS:"__inchar"]
+ END
+
+ INTERFACE TO FUNCTION WGOPENQQ(name)
+ INTEGER*2 WGOPENQQ[FAR,C,ALIAS:"__wgopen"]
+ CHARACTER*(*) name[REFERENCE]
+ END
+
+ INTERFACE TO FUNCTION WGCLOSEQQ(handle)
+ INTEGER*2 WGCLOSEQQ[FAR,C,ALIAS:"__wgclose"], handle
+ END
+
+ INTERFACE TO FUNCTION WGSETACTIVEQQ(handle)
+ INTEGER*2 WGSETACTIVEQQ[FAR,C,ALIAS:"__wgsetactive"], handle
+ END
+
+ INTERFACE TO FUNCTION WGGETACTIVEQQ()
+ INTEGER*2 WGGETACTIVEQQ[FAR,C,ALIAS:"__wggetactive"]
+ END
diff --git a/private/oleauto/tools/win16/hdos/c800/include/float.h b/private/oleauto/tools/win16/hdos/c800/include/float.h
new file mode 100644
index 000000000..2658e94e3
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/float.h
@@ -0,0 +1,213 @@
+/***
+*float.h - constants for floating point values
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains defines for a number of implementation dependent
+* values which are commonly used by sophisticated numerical (floating
+* point) programs.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_FLOAT
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#define DBL_DIG 15 /* # of decimal digits of precision */
+#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
+#define DBL_MANT_DIG 53 /* # of bits in mantissa */
+#define DBL_MAX 1.7976931348623158e+308 /* max value */
+#define DBL_MAX_10_EXP 308 /* max decimal exponent */
+#define DBL_MAX_EXP 1024 /* max binary exponent */
+#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
+#define DBL_MIN_10_EXP (-307) /* min decimal exponent */
+#define DBL_MIN_EXP (-1021) /* min binary exponent */
+#define _DBL_RADIX 2 /* exponent radix */
+#define _DBL_ROUNDS 1 /* addition rounding: near */
+
+#define FLT_DIG 6 /* # of decimal digits of precision */
+#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
+#define FLT_GUARD 0
+#define FLT_MANT_DIG 24 /* # of bits in mantissa */
+#define FLT_MAX 3.402823466e+38F /* max value */
+#define FLT_MAX_10_EXP 38 /* max decimal exponent */
+#define FLT_MAX_EXP 128 /* max binary exponent */
+#define FLT_MIN 1.175494351e-38F /* min positive value */
+#define FLT_MIN_10_EXP (-37) /* min decimal exponent */
+#define FLT_MIN_EXP (-125) /* min binary exponent */
+#define FLT_NORMALIZE 0
+#define FLT_RADIX 2 /* exponent radix */
+#define FLT_ROUNDS 1 /* addition rounding: near */
+
+#define LDBL_DIG 18 /* # of decimal digits of precision */
+#define LDBL_EPSILON 1.084202172485504434e-019L /* smallest such that 1.0+LDBL_EPSILON != 1.0 */
+#define LDBL_MANT_DIG 64 /* # of bits in mantissa */
+#define LDBL_MAX 1.189731495357231765e+4932L /* max value */
+#define LDBL_MAX_10_EXP 4932 /* max decimal exponent */
+#define LDBL_MAX_EXP 16384 /* max binary exponent */
+#define LDBL_MIN 3.3621031431120935063e-4932L /* min positive value */
+#define LDBL_MIN_10_EXP (-4931) /* min decimal exponent */
+#define LDBL_MIN_EXP (-16381) /* min binary exponent */
+#define _LDBL_RADIX 2 /* exponent radix */
+#define _LDBL_ROUNDS 1 /* addition rounding: near */
+
+
+/*
+ * 8087/80287 math control information
+ */
+
+
+/* User Control Word Mask and bit definitions.
+ * These definitions match the 8087/80287
+ */
+
+#define _MCW_EM 0x003f /* interrupt Exception Masks */
+#define _EM_INVALID 0x0001 /* invalid */
+#define _EM_DENORMAL 0x0002 /* denormal */
+#define _EM_ZERODIVIDE 0x0004 /* zero divide */
+#define _EM_OVERFLOW 0x0008 /* overflow */
+#define _EM_UNDERFLOW 0x0010 /* underflow */
+#define _EM_INEXACT 0x0020 /* inexact (precision) */
+
+#define _MCW_IC 0x1000 /* Infinity Control */
+#define _IC_AFFINE 0x1000 /* affine */
+#define _IC_PROJECTIVE 0x0000 /* projective */
+
+#define _MCW_RC 0x0c00 /* Rounding Control */
+#define _RC_CHOP 0x0c00 /* chop */
+#define _RC_UP 0x0800 /* up */
+#define _RC_DOWN 0x0400 /* down */
+#define _RC_NEAR 0x0000 /* near */
+
+#define _MCW_PC 0x0300 /* Precision Control */
+#define _PC_24 0x0000 /* 24 bits */
+#define _PC_53 0x0200 /* 53 bits */
+#define _PC_64 0x0300 /* 64 bits */
+
+
+/* initial Control Word value */
+
+#define _CW_DEFAULT ( _IC_AFFINE + _RC_NEAR + _PC_64 + _EM_DENORMAL + _EM_UNDERFLOW + _EM_INEXACT )
+
+
+/* user Status Word bit definitions */
+
+#define _SW_INVALID 0x0001 /* invalid */
+#define _SW_DENORMAL 0x0002 /* denormal */
+#define _SW_ZERODIVIDE 0x0004 /* zero divide */
+#define _SW_OVERFLOW 0x0008 /* overflow */
+#define _SW_UNDERFLOW 0x0010 /* underflow */
+#define _SW_INEXACT 0x0020 /* inexact (precision) */
+
+
+/* invalid subconditions (_SW_INVALID also set) */
+
+#define _SW_UNEMULATED 0x0040 /* unemulated instruction */
+#define _SW_SQRTNEG 0x0080 /* square root of a neg number */
+#define _SW_STACKOVERFLOW 0x0200 /* FP stack overflow */
+#define _SW_STACKUNDERFLOW 0x0400 /* FP stack underflow */
+
+
+/* Floating point error signals and return codes */
+
+#define _FPE_INVALID 0x81
+#define _FPE_DENORMAL 0x82
+#define _FPE_ZERODIVIDE 0x83
+#define _FPE_OVERFLOW 0x84
+#define _FPE_UNDERFLOW 0x85
+#define _FPE_INEXACT 0x86
+
+#define _FPE_UNEMULATED 0x87
+#define _FPE_SQRTNEG 0x88
+#define _FPE_STACKOVERFLOW 0x8a
+#define _FPE_STACKUNDERFLOW 0x8b
+
+#define _FPE_EXPLICITGEN 0x8c /* raise( SIGFPE ); */
+
+
+/* function prototypes */
+
+unsigned int __cdecl _clear87(void);
+unsigned int __cdecl _control87(unsigned int, unsigned int);
+void __cdecl _fpreset(void);
+unsigned int __cdecl _status87(void);
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define DBL_RADIX _DBL_RADIX
+#define DBL_ROUNDS _DBL_ROUNDS
+
+#define LDBL_RADIX _LDBL_RADIX
+#define LDBL_ROUNDS _LDBL_ROUNDS
+
+#define MCW_EM _MCW_EM
+#define EM_INVALID _EM_INVALID
+#define EM_DENORMAL _EM_DENORMAL
+#define EM_ZERODIVIDE _EM_ZERODIVIDE
+#define EM_OVERFLOW _EM_OVERFLOW
+#define EM_UNDERFLOW _EM_UNDERFLOW
+#define EM_INEXACT _EM_INEXACT
+
+#define MCW_IC _MCW_IC
+#define IC_AFFINE _IC_AFFINE
+#define IC_PROJECTIVE _IC_PROJECTIVE
+
+#define MCW_RC _MCW_RC
+#define RC_CHOP _RC_CHOP
+#define RC_UP _RC_UP
+#define RC_DOWN _RC_DOWN
+#define RC_NEAR _RC_NEAR
+
+#define MCW_PC _MCW_PC
+#define PC_24 _PC_24
+#define PC_53 _PC_53
+#define PC_64 _PC_64
+
+#define CW_DEFAULT _CW_DEFAULT
+
+#define SW_INVALID _SW_INVALID
+#define SW_DENORMAL _SW_DENORMAL
+#define SW_ZERODIVIDE _SW_ZERODIVIDE
+#define SW_OVERFLOW _SW_OVERFLOW
+#define SW_UNDERFLOW _SW_UNDERFLOW
+#define SW_INEXACT _SW_INEXACT
+
+#define SW_UNEMULATED _SW_UNEMULATED
+#define SW_SQRTNEG _SW_SQRTNEG
+#define SW_STACKOVERFLOW _SW_STACKOVERFLOW
+#define SW_STACKUNDERFLOW _SW_STACKUNDERFLOW
+
+#define FPE_INVALID _FPE_INVALID
+#define FPE_DENORMAL _FPE_DENORMAL
+#define FPE_ZERODIVIDE _FPE_ZERODIVIDE
+#define FPE_OVERFLOW _FPE_OVERFLOW
+#define FPE_UNDERFLOW _FPE_UNDERFLOW
+#define FPE_INEXACT _FPE_INEXACT
+
+#define FPE_UNEMULATED _FPE_UNEMULATED
+#define FPE_SQRTNEG _FPE_SQRTNEG
+#define FPE_STACKOVERFLOW _FPE_STACKOVERFLOW
+#define FPE_STACKUNDERFLOW _FPE_STACKUNDERFLOW
+
+#define FPE_EXPLICITGEN _FPE_EXPLICITGEN
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_FLOAT
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/fstream.h b/private/oleauto/tools/win16/hdos/c800/include/fstream.h
new file mode 100644
index 000000000..e7865980b
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/fstream.h
@@ -0,0 +1,141 @@
+/***
+*fstream.h - definitions/declarations for filebuf and fstream classes
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the filebuf and fstream classes.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_FSTREAM
+#define _INC_FSTREAM
+
+#include <iostream.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+#ifdef M_I86HM
+#define _HFAR_ __far
+#else
+#define _HFAR_
+#endif
+
+typedef int filedesc;
+
+class filebuf : public streambuf {
+public:
+static const int openprot; // default share/prot mode for open
+
+// optional share values for 3rd argument (prot) of open or constructor
+static const int sh_compat; // compatibility share mode
+static const int sh_none; // exclusive mode no sharing
+static const int sh_read; // allow read sharing
+static const int sh_write; // allow write sharing
+// use (sh_read | sh_write) to allow both read and write sharing
+
+// options for setmode member function
+static const int binary;
+static const int text;
+
+ filebuf();
+ filebuf(filedesc);
+ filebuf(filedesc, char _HFAR_ *, int);
+ ~filebuf();
+
+ filebuf* attach(filedesc);
+ filedesc fd() const { return (x_fd==-1) ? EOF : x_fd; }
+ int is_open() const { return (x_fd!=-1); }
+ filebuf* open(const char _HFAR_ *, int, int = filebuf::openprot);
+ filebuf* close();
+ int setmode(int = filebuf::text);
+
+virtual int overflow(int=EOF);
+virtual int underflow();
+
+virtual streambuf* setbuf(char _HFAR_ *, int);
+virtual streampos seekoff(streamoff, ios::seek_dir, int);
+// virtual streampos seekpos(streampos, int);
+virtual int sync();
+
+private:
+ filedesc x_fd;
+ int x_fOpened;
+};
+
+class ifstream : public istream {
+public:
+ ifstream();
+ ifstream(const char _HFAR_ *, int =ios::in, int = filebuf::openprot);
+ ifstream(filedesc);
+ ifstream(filedesc, char _HFAR_ *, int);
+ ~ifstream();
+
+ streambuf * setbuf(char _HFAR_ *, int);
+ filebuf* rdbuf() const { return (filebuf*) ios::rdbuf(); }
+
+ void attach(filedesc);
+ filedesc fd() const { return rdbuf()->fd(); }
+
+ int is_open() const { return rdbuf()->is_open(); }
+ void open(const char _HFAR_ *, int =ios::in, int = filebuf::openprot);
+ void close();
+ int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
+};
+
+class ofstream : public ostream {
+public:
+ ofstream();
+ ofstream(const char _HFAR_ *, int =ios::out, int = filebuf::openprot);
+ ofstream(filedesc);
+ ofstream(filedesc, char _HFAR_ *, int);
+ ~ofstream();
+
+ streambuf * setbuf(char _HFAR_ *, int);
+ filebuf* rdbuf() const { return (filebuf*) ios::rdbuf(); }
+
+ void attach(filedesc);
+ filedesc fd() const { return rdbuf()->fd(); }
+
+ int is_open() const { return rdbuf()->is_open(); }
+ void open(const char _HFAR_ *, int =ios::out, int = filebuf::openprot);
+ void close();
+ int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
+};
+
+class fstream : public iostream {
+public:
+ fstream();
+ fstream(const char _HFAR_ *, int, int = filebuf::openprot);
+ fstream(filedesc);
+ fstream(filedesc, char _HFAR_ *, int);
+ ~fstream();
+
+ streambuf * setbuf(char _HFAR_ *, int);
+ filebuf* rdbuf() const { return (filebuf*) ostream::rdbuf(); }
+
+ void attach(filedesc);
+ filedesc fd() const { return rdbuf()->fd(); }
+
+ int is_open() const { return rdbuf()->is_open(); }
+ void open(const char _HFAR_ *, int, int = filebuf::openprot);
+ void close();
+ int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
+};
+
+// manipulators to dynamically change file access mode (filebufs only)
+inline ios& binary(ios& _fstrm) \
+ { ((filebuf*)_fstrm.rdbuf())->setmode(filebuf::binary); return _fstrm; }
+inline ios& text(ios& _fstrm) \
+ { ((filebuf*)_fstrm.rdbuf())->setmode(filebuf::text); return _fstrm; }
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/graph.h b/private/oleauto/tools/win16/hdos/c800/include/graph.h
new file mode 100644
index 000000000..ee2eeb316
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/graph.h
@@ -0,0 +1,485 @@
+/***
+*graph.h - declare constants, functions, and macros for graphics library
+*
+* Copyright (c) 1987 - 1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file declares the graphics library functions and the
+* structures and manifest constants that are used with them.
+*
+***************************************************************************/
+
+#ifndef _WINDOWS
+/* Force graphics.lib to be linked in if graph.h used */
+#pragma comment(lib,"graphics.lib")
+#endif
+
+#ifdef __cplusplus
+extern "C" { /* allow use with C++ */
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __huge _huge
+#endif
+
+/* force word packing to avoid possible -Zp override */
+#pragma pack(2)
+
+
+/* user-visible declarations for Quick-C Graphics Library */
+
+#ifndef _VIDEOCONFIG_DEFINED
+/* structure for _getvideoconfig() as visible to user */
+struct _videoconfig {
+ short numxpixels; /* number of pixels on X axis */
+ short numypixels; /* number of pixels on Y axis */
+ short numtextcols; /* number of text columns available */
+ short numtextrows; /* number of text rows available */
+ short numcolors; /* number of actual colors */
+ short bitsperpixel; /* number of bits per pixel */
+ short numvideopages; /* number of available video pages */
+ short mode; /* current video mode */
+ short adapter; /* active display adapter */
+ short monitor; /* active display monitor */
+ short memory; /* adapter video memory in K bytes */
+};
+#define _VIDEOCONFIG_DEFINED
+#endif
+
+#ifndef _XYCOORD_DEFINED
+/* return value of _setvieworg(), etc. */
+struct _xycoord {
+ short xcoord;
+ short ycoord;
+};
+#define _XYCOORD_DEFINED
+#endif
+
+/* structure for text position */
+#ifndef _RCCOORD_DEFINED
+struct _rccoord {
+ short row;
+ short col;
+};
+#define _RCCOORD_DEFINED
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define videoconfig _videoconfig
+#define xycoord _xycoord
+#define rccoord _rccoord
+#endif
+
+
+/* ERROR HANDLING */
+short __far __cdecl _grstatus(void);
+
+/* Error Status Information returned by _grstatus() */
+
+/* successful */
+#define _GROK 0
+
+/* errors */
+#define _GRERROR (-1)
+#define _GRMODENOTSUPPORTED (-2)
+#define _GRNOTINPROPERMODE (-3)
+#define _GRINVALIDPARAMETER (-4)
+#define _GRFONTFILENOTFOUND (-5)
+#define _GRINVALIDFONTFILE (-6)
+#define _GRCORRUPTEDFONTFILE (-7)
+#define _GRINSUFFICIENTMEMORY (-8)
+#define _GRINVALIDIMAGEBUFFER (-9)
+
+/* warnings */
+#define _GRNOOUTPUT 1
+#define _GRCLIPPED 2
+#define _GRPARAMETERALTERED 3
+#define _GRTEXTNOTSUPPORTED 4
+
+
+/* SETUP AND CONFIGURATION */
+
+short __far __cdecl _setvideomode(short);
+short __far __cdecl _setvideomoderows(short,short); /* return rows; 0 if error */
+
+/* arguments to _setvideomode() */
+#define _MAXRESMODE (-3) /* graphics mode with highest resolution */
+#define _MAXCOLORMODE (-2) /* graphics mode with most colors */
+#define _DEFAULTMODE (-1) /* restore screen to original mode */
+#define _TEXTBW40 0 /* 40-column text, 16 grey */
+#define _TEXTC40 1 /* 40-column text, 16/8 color */
+#define _TEXTBW80 2 /* 80-column text, 16 grey */
+#define _TEXTC80 3 /* 80-column text, 16/8 color */
+#define _MRES4COLOR 4 /* 320 x 200, 4 color */
+#define _MRESNOCOLOR 5 /* 320 x 200, 4 grey */
+#define _HRESBW 6 /* 640 x 200, BW */
+#define _TEXTMONO 7 /* 80-column text, BW */
+#define _HERCMONO 8 /* 720 x 348, BW for HGC */
+#define _MRES16COLOR 13 /* 320 x 200, 16 color */
+#define _HRES16COLOR 14 /* 640 x 200, 16 color */
+#define _ERESNOCOLOR 15 /* 640 x 350, BW */
+#define _ERESCOLOR 16 /* 640 x 350, 4 or 16 color */
+#define _VRES2COLOR 17 /* 640 x 480, BW */
+#define _VRES16COLOR 18 /* 640 x 480, 16 color */
+#define _MRES256COLOR 19 /* 320 x 200, 256 color */
+#define _ORESCOLOR 64 /* 640 x 400, 1 of 16 colors (Olivetti only) */
+
+/* the following 8 modes require VESA SuperVGA BIOS extensions */
+#define _ORES256COLOR 0x0100 /* 640 x 400, 256 color */
+#define _VRES256COLOR 0x0101 /* 640 x 480, 256 color */
+
+/* WARNING: DO NOT attempt to set the following modes without ensuring that
+ your monitor can safely handle that resolution. Otherwise, you may risk
+ damaging your display monitor! Consult your owner's manual for details.
+ Note: _MAXRESMODE and _MAXCOLORMODE never select SRES, XRES, or ZRES modes */
+
+/* requires NEC MultiSync 3D or equivalent, or better */
+#define _SRES16COLOR 0x0102 /* 800 x 600, 16 color */
+#define _SRES256COLOR 0x0103 /* 800 x 600, 256 color */
+
+/* requires NEC MultiSync 4D or equivalent, or better */
+#define _XRES16COLOR 0x0104 /* 1024 x 768, 16 color */
+#define _XRES256COLOR 0x0105 /* 1024 x 768, 256 color */
+
+/* requires NEC MultiSync 5D or equivalent, or better */
+#define _ZRES16COLOR 0x0106 /* 1280 x 1024, 16 color */
+#define _ZRES256COLOR 0x0107 /* 1280 x 1024, 256 color */
+
+
+short __far __cdecl _setactivepage(short);
+short __far __cdecl _setvisualpage(short);
+short __far __cdecl _getactivepage(void);
+short __far __cdecl _getvisualpage(void);
+
+/* _videoconfig adapter values */
+/* these manifest constants can be used to determine the type of the active */
+/* adapter, using either simple comparisons or the bitwise-AND operator (&) */
+#define _MDPA 0x0001 /* Monochrome Display Adapter (MDPA) */
+#define _CGA 0x0002 /* Color Graphics Adapter (CGA) */
+#define _EGA 0x0004 /* Enhanced Graphics Adapter (EGA) */
+#define _VGA 0x0008 /* Video Graphics Array (VGA) */
+#define _MCGA 0x0010 /* MultiColor Graphics Array (MCGA) */
+#define _HGC 0x0020 /* Hercules Graphics Card (HGC) */
+#define _OCGA 0x0042 /* Olivetti Color Graphics Adapter (OCGA) */
+#define _OEGA 0x0044 /* Olivetti Enhanced Graphics Adapter (OEGA) */
+#define _OVGA 0x0048 /* Olivetti Video Graphics Array (OVGA) */
+#define _SVGA 0x0088 /* Super VGA with VESA BIOS support (SVGA) */
+
+/* _videoconfig monitor values */
+/* these manifest constants can be used to determine the type of monitor in */
+/* use, using either simple comparisons or the bitwise-AND operator (&) */
+#define _MONO 0x0001 /* Monochrome */
+#define _COLOR 0x0002 /* Color (or Enhanced emulating color) */
+#define _ENHCOLOR 0x0004 /* Enhanced Color */
+#define _ANALOGMONO 0x0008 /* Analog Monochrome only */
+#define _ANALOGCOLOR 0x0010 /* Analog Color only */
+#define _ANALOG 0x0018 /* Analog Monochrome and Color modes */
+
+struct _videoconfig __far * __far __cdecl _getvideoconfig(struct _videoconfig __far *);
+
+
+/* COORDINATE SYSTEMS */
+
+struct _xycoord __far __cdecl _setvieworg(short, short);
+#define _setlogorg _setvieworg /* obsolescent */
+
+struct _xycoord __far __cdecl _getviewcoord(short, short);
+#define _getlogcoord _getviewcoord /* obsolescent */
+
+struct _xycoord __far __cdecl _getphyscoord(short, short);
+
+void __far __cdecl _setcliprgn(short, short, short, short);
+void __far __cdecl _setviewport(short, short, short, short);
+
+
+/* OUTPUT ROUTINES */
+
+/* control parameters for _ellipse, _rectangle, _pie and _polygon */
+#define _GBORDER 2 /* draw outline only */
+#define _GFILLINTERIOR 3 /* fill using current fill mask */
+
+/* parameters for _clearscreen */
+#define _GCLEARSCREEN 0
+#define _GVIEWPORT 1
+#define _GWINDOW 2
+
+void __far __cdecl _clearscreen(short);
+
+struct _xycoord __far __cdecl _moveto(short, short);
+struct _xycoord __far __cdecl _getcurrentposition(void);
+
+short __far __cdecl _lineto(short, short);
+short __far __cdecl _rectangle(short, short, short, short, short);
+short __far __cdecl _polygon(short, const struct _xycoord __far *, short);
+short __far __cdecl _arc(short, short, short, short, short, short, short, short);
+short __far __cdecl _ellipse(short, short, short, short, short);
+short __far __cdecl _pie(short, short, short, short, short, short, short, short, short);
+
+short __far __cdecl _getarcinfo(struct _xycoord __far *, struct _xycoord __far *, struct _xycoord __far *);
+
+short __far __cdecl _setpixel(short, short);
+short __far __cdecl _getpixel(short, short);
+short __far __cdecl _floodfill(short, short, short);
+
+
+/* PEN COLOR, LINE STYLE, WRITE MODE, FILL PATTERN */
+
+short __far __cdecl _setcolor(short);
+short __far __cdecl _getcolor(void);
+
+void __far __cdecl _setlinestyle(unsigned short);
+unsigned short __far __cdecl _getlinestyle(void);
+
+short __far __cdecl _setwritemode(short);
+short __far __cdecl _getwritemode(void);
+
+void __far __cdecl _setfillmask(const unsigned char __far *);
+unsigned char __far * __far __cdecl _getfillmask(unsigned char __far *);
+
+
+/* COLOR SELECTION */
+
+long __far __cdecl _setbkcolor(long);
+long __far __cdecl _getbkcolor(void);
+
+long __far __cdecl _remappalette(short, long);
+short __far __cdecl _remapallpalette(const long __far *);
+short __far __cdecl _selectpalette(short);
+
+
+/* TEXT */
+/* parameters for _displaycursor */
+#define _GCURSOROFF 0
+#define _GCURSORON 1
+
+/* parameters for _wrapon */
+#define _GWRAPOFF 0
+#define _GWRAPON 1
+
+
+/* direction parameters for _scrolltextwindow */
+#define _GSCROLLUP 1
+#define _GSCROLLDOWN (-1)
+
+/* request maximum number of rows in _settextrows and _setvideomoderows */
+#define _MAXTEXTROWS (-1)
+
+short __far __cdecl _settextrows(short); /* returns # rows set; 0 if error */
+void __far __cdecl _settextwindow(short, short, short, short);
+void __far __cdecl _gettextwindow(short __far *, short __far *, short __far *, short __far *);
+void __far __cdecl _scrolltextwindow(short);
+void __far __cdecl _outmem(const char __far *, short);
+void __far __cdecl _outtext(const char __far *);
+short __far __cdecl _inchar(void);
+short __far __cdecl _wrapon(short);
+
+short __far __cdecl _displaycursor(short);
+short __far __cdecl _settextcursor(short);
+short __far __cdecl _gettextcursor(void);
+
+struct _rccoord __far __cdecl _settextposition(short, short);
+struct _rccoord __far __cdecl _gettextposition(void);
+
+short __far __cdecl _settextcolor(short);
+short __far __cdecl _gettextcolor(void);
+
+
+/* SCREEN IMAGES */
+
+void __far __cdecl _getimage(short, short, short, short, char __huge *);
+void __far __cdecl _putimage(short, short, char __huge *, short);
+long __far __cdecl _imagesize(short, short, short, short);
+
+/* "action verbs" for _putimage() and _setwritemode() */
+#define _GPSET 3
+#define _GPRESET 2
+#define _GAND 1
+#define _GOR 0
+#define _GXOR 4
+
+
+/* Color values are used with _setbkcolor in graphics modes and also by
+ _remappalette and _remapallpalette. Also known as palette colors.
+ Not to be confused with color indices (aka. color attributes). */
+
+/* universal color values (all color modes): */
+#define _BLACK 0x000000L
+#define _BLUE 0x2a0000L
+#define _GREEN 0x002a00L
+#define _CYAN 0x2a2a00L
+#define _RED 0x00002aL
+#define _MAGENTA 0x2a002aL
+#define _BROWN 0x00152aL
+#define _WHITE 0x2a2a2aL
+#define _GRAY 0x151515L
+#define _LIGHTBLUE 0x3F1515L
+#define _LIGHTGREEN 0x153f15L
+#define _LIGHTCYAN 0x3f3f15L
+#define _LIGHTRED 0x15153fL
+#define _LIGHTMAGENTA 0x3f153fL
+#define _YELLOW 0x153f3fL
+#define _BRIGHTWHITE 0x3f3f3fL
+
+/* the following is obsolescent and defined only for backward compatibility */
+#define _LIGHTYELLOW _YELLOW
+
+/* mono mode F (_ERESNOCOLOR) color values: */
+#define _MODEFOFF 0L
+#define _MODEFOFFTOON 1L
+#define _MODEFOFFTOHI 2L
+#define _MODEFONTOOFF 3L
+#define _MODEFON 4L
+#define _MODEFONTOHI 5L
+#define _MODEFHITOOFF 6L
+#define _MODEFHITOON 7L
+#define _MODEFHI 8L
+
+/* mono mode 7 (_TEXTMONO) color values: */
+#define _MODE7OFF 0L
+#define _MODE7ON 1L
+#define _MODE7HI 2L
+
+
+/* Warning: these '_xy' entrypoints are undocumented.
+ They may or may not be supported in future versions. */
+struct _xycoord __far __cdecl _moveto_xy(struct _xycoord);
+short __far __cdecl _lineto_xy(struct _xycoord);
+short __far __cdecl _rectangle_xy(short,struct _xycoord,struct _xycoord);
+short __far __cdecl _arc_xy(struct _xycoord, struct _xycoord, struct _xycoord, struct _xycoord);
+short __far __cdecl _ellipse_xy(short, struct _xycoord, struct _xycoord);
+short __far __cdecl _pie_xy(short, struct _xycoord, struct _xycoord, struct _xycoord, struct _xycoord);
+short __far __cdecl _getpixel_xy(struct _xycoord);
+short __far __cdecl _setpixel_xy(struct _xycoord);
+short __far __cdecl _floodfill_xy(struct _xycoord, short);
+void __far __cdecl _getimage_xy(struct _xycoord,struct _xycoord, char __huge *);
+long __far __cdecl _imagesize_xy(struct _xycoord,struct _xycoord);
+void __far __cdecl _putimage_xy(struct _xycoord, char __huge *, short);
+
+
+/* WINDOW COORDINATE SYSTEM */
+
+#ifndef _WXYCOORD_DEFINED
+/* structure for window coordinate pair */
+struct _wxycoord {
+ double wx; /* window x coordinate */
+ double wy; /* window y coordinate */
+ };
+#define _WXYCOORD_DEFINED
+#endif
+
+
+/* define real coordinate window - returns non-zero if successful */
+short __far __cdecl _setwindow(short,double,double,double,double);
+
+/* convert from view to window coordinates */
+struct _wxycoord __far __cdecl _getwindowcoord(short,short);
+struct _wxycoord __far __cdecl _getwindowcoord_xy(struct _xycoord);
+
+/* convert from window to view coordinates */
+struct _xycoord __far __cdecl _getviewcoord_w(double,double);
+struct _xycoord __far __cdecl _getviewcoord_wxy(const struct _wxycoord __far *);
+
+/* return the window coordinates of the current graphics output
+ position as an _wxycoord structure. no error return. */
+struct _wxycoord __far __cdecl _getcurrentposition_w(void);
+
+
+/* window coordinate entry points for graphics output routines */
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _arc_w(double, double, double, double, double, double, double, double);
+short __far __cdecl _arc_wxy(const struct _wxycoord __far *, const struct _wxycoord __far *, const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _ellipse_w(short, double, double, double, double);
+short __far __cdecl _ellipse_wxy(short, const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _floodfill_w(double, double, short);
+
+/* returns pixel value at given point; -1 if unsuccessful. */
+short __far __cdecl _getpixel_w(double, double);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _lineto_w(double, double);
+
+/* returns the view coordinates of the previous output
+ position as a _wxycoord structure. no error return */
+struct _wxycoord __far __cdecl _moveto_w(double, double);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _pie_w(short, double, double, double, double, double, double, double, double);
+short __far __cdecl _pie_wxy(short, const struct _wxycoord __far *, const struct _wxycoord __far *, const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _rectangle_w(short, double, double, double, double);
+short __far __cdecl _rectangle_wxy(short, const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _polygon_w(short, const double __far *, short);
+short __far __cdecl _polygon_wxy(short, const struct _wxycoord __far *, short);
+
+/* returns previous color; -1 if unsuccessful */
+short __far __cdecl _setpixel_w(double, double);
+
+
+/* window coordinate image routines */
+
+/* no return value */
+void __far __cdecl _getimage_w(double, double, double, double, char __huge *);
+void __far __cdecl _getimage_wxy(const struct _wxycoord __far *, const struct _wxycoord __far *, char __huge *);
+
+/* returns the image's storage size in bytes */
+long __far __cdecl _imagesize_w(double, double, double, double);
+long __far __cdecl _imagesize_wxy(const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* no return value */
+void __far __cdecl _putimage_w(double, double ,char __huge * ,short);
+
+
+/* FONTS */
+
+#ifndef _FONTINFO_DEFINED
+/* structure for _getfontinfo() */
+struct _fontinfo {
+ int type; /* b0 set = vector,clear = bit map */
+ int ascent; /* pix dist from top to baseline */
+ int pixwidth; /* character width in pixels, 0=prop */
+ int pixheight; /* character height in pixels */
+ int avgwidth; /* average character width in pixels */
+ char filename[81]; /* file name including path */
+ char facename[32]; /* font name */
+};
+#define _FONTINFO_DEFINED
+#endif
+
+
+/* font function prototypes */
+short __far __cdecl _registerfonts( const char __far *);
+void __far __cdecl _unregisterfonts( void );
+short __far __cdecl _setfont( const char __far * );
+short __far __cdecl _getfontinfo( struct _fontinfo __far * );
+void __far __cdecl _outgtext( const char __far * );
+short __far __cdecl _getgtextextent( const char __far * );
+struct _xycoord __far __cdecl _setgtextvector( short, short );
+struct _xycoord __far __cdecl _getgtextvector(void);
+
+
+#ifdef _WINDOWS
+/* QuickWin graphics extension prototypes */
+int __far __cdecl _wgclose( int );
+int __far __cdecl _wggetactive( void );
+int __far __cdecl _wgopen( char __far * );
+int __far __cdecl _wgsetactive( int );
+#endif
+
+
+/* restore default packing */
+#pragma pack()
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/io.h b/private/oleauto/tools/win16/hdos/c800/include/io.h
new file mode 100644
index 000000000..d37a8165a
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/io.h
@@ -0,0 +1,162 @@
+/***
+*io.h - declarations for low-level file handling and I/O functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the function declarations for the low-level
+* file handling and I/O functions.
+*
+****/
+
+#ifndef _INC_IO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifdef _WINDOWS
+#ifndef _WINDLL
+#ifndef _WINFO_DEFINED
+/* interface version number */
+#define _QWINVER 0
+
+/* max number of windows */
+#define _WFILE 20
+
+/* values for windows screen buffer size */
+#define _WINBUFINF 0
+#define _WINBUFDEF -1
+
+/* size/move settings */
+#define _WINSIZEMIN 1
+#define _WINSIZEMAX 2
+#define _WINSIZERESTORE 3
+#define _WINSIZECHAR 4
+
+/* size/move query types */
+#define _WINMAXREQ 100
+#define _WINCURRREQ 101
+
+/* values for closing window */
+#define _WINPERSIST 1
+#define _WINNOPERSIST 0
+
+/* pseudo file handle for frame window */
+#define _WINFRAMEHAND -1
+
+/* menu items */
+#define _WINSTATBAR 1
+#define _WINTILE 2
+#define _WINCASCADE 3
+#define _WINARRANGE 4
+
+/* quickwin exit options */
+#define _WINEXITPROMPT 1
+#define _WINEXITNOPERSIST 2
+#define _WINEXITPERSIST 3
+
+/* open structure */
+#pragma pack(2)
+struct _wopeninfo {
+ unsigned int _version;
+ const char __far * _title;
+ long _wbufsize;
+ };
+#pragma pack()
+
+/* size/move structure */
+struct _wsizeinfo {
+ unsigned int _version;
+ unsigned int _type;
+ unsigned int _x;
+ unsigned int _y;
+ unsigned int _h;
+ unsigned int _w;
+ };
+
+#define _WINFO_DEFINED
+#endif
+#endif
+#endif
+
+/* function prototypes */
+
+int __cdecl _access(const char *, int);
+int __cdecl _chmod(const char *, int);
+int __cdecl _chsize(int, long);
+int __cdecl _close(int);
+int __cdecl _commit(int);
+int __cdecl _creat(const char *, int);
+int __cdecl _dup(int);
+int __cdecl _dup2(int, int);
+int __cdecl _eof(int);
+long __cdecl _filelength(int);
+int __cdecl _isatty(int);
+int __cdecl _locking(int, int, long);
+long __cdecl _lseek(int, long, int);
+char * __cdecl _mktemp(char *);
+int __cdecl _open(const char *, int, ...);
+int __cdecl _read(int, void *, unsigned int);
+int __cdecl remove(const char *);
+int __cdecl rename(const char *, const char *);
+int __cdecl _setmode(int, int);
+int __cdecl _sopen(const char *, int, int, ...);
+long __cdecl _tell(int);
+int __cdecl _umask(int);
+int __cdecl _unlink(const char *);
+int __cdecl _write(int, const void *, unsigned int);
+#ifdef _WINDOWS
+#ifndef _WINDLL
+int __cdecl _wabout(char *);
+int __cdecl _wclose(int, int);
+int __cdecl _wgetexit(void);
+int __cdecl _wgetfocus(void);
+long __cdecl _wgetscreenbuf(int);
+int __cdecl _wgetsize(int, int, struct _wsizeinfo *);
+int __cdecl _wmenuclick(int);
+int __cdecl _wopen(struct _wopeninfo *, struct _wsizeinfo *, int);
+int __cdecl _wsetexit(int);
+int __cdecl _wsetfocus(int);
+int __cdecl _wsetscreenbuf(int, long);
+int __cdecl _wsetsize(int, struct _wsizeinfo *);
+void __cdecl _wyield(void);
+#endif
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+int __cdecl access(const char *, int);
+int __cdecl chmod(const char *, int);
+int __cdecl chsize(int, long);
+int __cdecl close(int);
+int __cdecl creat(const char *, int);
+int __cdecl dup(int);
+int __cdecl dup2(int, int);
+int __cdecl eof(int);
+long __cdecl filelength(int);
+int __cdecl isatty(int);
+int __cdecl locking(int, int, long);
+long __cdecl lseek(int, long, int);
+char * __cdecl mktemp(char *);
+int __cdecl open(const char *, int, ...);
+int __cdecl read(int, void *, unsigned int);
+int __cdecl setmode(int, int);
+int __cdecl sopen(const char *, int, int, ...);
+long __cdecl tell(int);
+int __cdecl umask(int);
+int __cdecl unlink(const char *);
+int __cdecl write(int, const void *, unsigned int);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_IO
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/iomanip.h b/private/oleauto/tools/win16/hdos/c800/include/iomanip.h
new file mode 100644
index 000000000..8adc814ec
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/iomanip.h
@@ -0,0 +1,128 @@
+/***
+*iomanip.h - definitions/declarations for iostream's parameterized manipulators
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the iostream classes' paramterized manipulators.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_IOMANIP
+#define _INC_IOMANIP
+#include <iostream.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+// CONSIDER: use macro to define these
+// #define __MKMANIP(X) \#define X##(T) __##X##_ \#\# T
+// __MKMANIP(SMANIP);
+// __MKMANIP(SAPP);
+// __MKMANIP(IMANIP);
+// __MKMANIP(IAPP);
+// __MKMANIP(OMANIP);
+// __MKMANIP(OAPP);
+// __MKMANIP(IOMANIP);
+// __MKMANIP(IOAPP);
+
+#define SMANIP(T) __SMANIP_##T
+#define SAPP(T) __SAPP_##T
+#define IMANIP(T) __IMANIP_##T
+#define IAPP(T) __IAPP_##T
+#define OMANIP(T) __OMANIP_##T
+#define OAPP(T) __OAPP_##T
+#define IOMANIP(T) __IOMANIP_##T
+#define IOAPP(T) __IOAPP_##T
+
+#define IOMANIPdeclare(T) \
+class SMANIP(T) { \
+public: \
+ SMANIP(T)(ios& (*f)(ios&,T), T t) { _fp = f; _tp = t; } \
+ friend istream& operator>>(istream& s, SMANIP(T) & sm) { (*(sm._fp))(s,sm._tp); return s; } \
+ friend ostream& operator<<(ostream& s, SMANIP(T) & sm) { (*(sm._fp))(s,sm._tp); return s; } \
+private: \
+ ios& (* _fp)(ios&,T); \
+ T _tp; \
+}; \
+class SAPP(T) { \
+public: \
+ SAPP(T)( ios& (*f)(ios&,T)) { _fp = f; } \
+ SMANIP(T) operator()(T t) { return SMANIP(T)(_fp,t); } \
+private: \
+ ios& (* _fp)(ios&,T); \
+}; \
+class IMANIP(T) { \
+public: \
+ IMANIP(T)(istream& (*f)(istream&,T), T t) { _fp = f; _tp = t; } \
+ friend istream& operator>>(istream& s, IMANIP(T) & sm) { (*sm._fp)(s,sm._tp); return s; } \
+private: \
+ istream& (* _fp)(istream&,T); \
+ T _tp; \
+}; \
+class IAPP(T) { \
+public: \
+ IAPP(T)( istream& (*f)(istream&,T)) { _fp = f; } \
+ IMANIP(T) operator()(T t) { return IMANIP(T)(_fp,t); } \
+private: \
+ istream& (* _fp)(istream&,T); \
+}; \
+class OMANIP(T) { \
+public: \
+ OMANIP(T)(ostream& (*f)(ostream&,T), T t) { _fp = f; _tp = t; } \
+ friend ostream& operator<<(ostream& s, OMANIP(T) & sm) { (*sm._fp)(s,sm._tp); return s; } \
+private: \
+ ostream& (* _fp)(ostream&,T); \
+ T _tp; \
+}; \
+class OAPP(T) { \
+public: \
+ OAPP(T)(ostream& (*f)(ostream&,T)) { _fp = f; } \
+ OMANIP(T) operator()(T t) { return OMANIP(T)(_fp,t); } \
+private: \
+ ostream& (* _fp)(ostream&,T); \
+}; \
+\
+class IOMANIP(T) { \
+public: \
+ IOMANIP(T)(iostream& (*f)(iostream&,T), T t) { _fp = f; _tp = t; } \
+ friend istream& operator>>(iostream& s, IOMANIP(T) & sm) { (*sm._fp)(s,sm._tp); return s; } \
+ friend ostream& operator<<(iostream& s, IOMANIP(T) & sm) { (*sm._fp)(s,sm._tp); return s; } \
+private: \
+ iostream& (* _fp)(iostream&,T); \
+ T _tp; \
+}; \
+class IOAPP(T) { \
+public: \
+ IOAPP(T)( iostream& (*f)(iostream&,T)) { _fp = f; } \
+ IOMANIP(T) operator()(T t) { return IOMANIP(T)(_fp,t); } \
+private: \
+ iostream& (* _fp)(iostream&,T); \
+}; \
+
+
+IOMANIPdeclare(int)
+
+IOMANIPdeclare(long)
+
+inline ios& __resetiosflags(ios& s, long _flg) { s.setf(0,_flg); return s; }
+inline ios& __setfill(ios& s, int _fc) { s.fill((char)_fc); return s; }
+inline ios& __setiosflags(ios& s, long _flg) { s.setf(_flg); return s; }
+inline ios& __setprecision(ios& s, int _pre) { s.precision(_pre); return s; }
+inline ios& __setw(ios& s, int _wid) { s.width(_wid); return s; }
+
+inline SMANIP(long) resetiosflags(long _l) { return SMANIP(long)(__resetiosflags, _l); }
+inline SMANIP(int) setfill(int _m) {return SMANIP(int)(__setfill, _m); }
+inline SMANIP(long) setiosflags(long _l) {return SMANIP(long)(__setiosflags, _l); }
+inline SMANIP(int) setprecision(int _p) {return SMANIP(int)(__setprecision, _p); }
+inline SMANIP(int) setw(int _w) { return SMANIP(int)(__setw, _w); }
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/ios.h b/private/oleauto/tools/win16/hdos/c800/include/ios.h
new file mode 100644
index 000000000..74aa9d1ff
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/ios.h
@@ -0,0 +1,198 @@
+/***
+*ios.h - definitions/declarations for the ios class.
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the ios class.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_IOS
+#define _INC_IOS
+
+
+#ifdef M_I86HM
+#define _HFAR_ __far
+#else
+#define _HFAR_
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+class streambuf;
+class ostream;
+
+class ios {
+
+public:
+ enum io_state { goodbit = 0x00,
+ eofbit = 0x01,
+ failbit = 0x02,
+ badbit = 0x04 };
+
+ enum open_mode { in = 0x01,
+ out = 0x02,
+ ate = 0x04,
+ app = 0x08,
+ trunc = 0x10,
+ nocreate = 0x20,
+ noreplace = 0x40,
+ binary = 0x80 }; // CONSIDER: not in latest spec.
+
+ enum seek_dir { beg=0, cur=1, end=2 };
+
+ enum { skipws = 0x0001,
+ left = 0x0002,
+ right = 0x0004,
+ internal = 0x0008,
+ dec = 0x0010,
+ oct = 0x0020,
+ hex = 0x0040,
+ showbase = 0x0080,
+ showpoint = 0x0100,
+ uppercase = 0x0200,
+ showpos = 0x0400,
+ scientific = 0x0800,
+ fixed = 0x1000,
+ unitbuf = 0x2000,
+ stdio = 0x4000
+ };
+
+ static const long basefield; // dec | oct | hex
+ static const long adjustfield; // left | right | internal
+ static const long floatfield; // scientific | fixed
+
+ ios(streambuf*); // differs from ANSI
+ virtual ~ios();
+
+ inline long flags() const;
+ inline long flags(long _l);
+
+ inline long setf(long _f,long _m);
+ inline long setf(long _l);
+ inline long unsetf(long _l);
+
+ inline int width() const;
+ inline int width(int _i);
+
+ inline ostream* tie(ostream* _os);
+ inline ostream* tie() const;
+
+ inline char fill() const;
+ inline char fill(char _c);
+
+ inline int precision(int _i);
+ inline int precision() const;
+
+ inline int rdstate() const;
+ inline void clear(int _i = 0);
+
+// inline operator void*() const;
+ operator void *() const { if(state&(badbit|failbit) ) return 0; return (void *)this; }
+ inline int operator!() const;
+
+ inline int good() const;
+ inline int eof() const;
+ inline int fail() const;
+ inline int bad() const;
+
+ inline streambuf* rdbuf() const;
+
+ inline long _HFAR_ & iword(int) const;
+ inline void _HFAR_ * _HFAR_ & pword(int) const;
+
+ static long bitalloc();
+ static int xalloc();
+ static void sync_with_stdio();
+
+protected:
+ ios();
+ ios(const ios&); // treat as private
+ ios& operator=(const ios&);
+ void init(streambuf*);
+
+ enum { skipping, tied };
+ streambuf* bp;
+
+ int state;
+ int ispecial; // not used
+ int ospecial; // not used
+ int isfx_special; // not used
+ int osfx_special; // not used
+ int x_delbuf; // if set, rdbuf() deleted by ~ios
+
+ ostream* x_tie;
+ long x_flags;
+ int x_precision;
+ int x_width;
+ char x_fill;
+
+ static void (*stdioflush)(); // not used
+public:
+ int delbuf() const { return x_delbuf; }
+ void delbuf(int _i) { x_delbuf = _i; }
+
+private:
+ static long x_maxbit;
+ static long _HFAR_ * x_statebuf; // used by xalloc()
+ static int x_curindex;
+// consider: make interal static to ios::sync_with_stdio()
+ static int sunk_with_stdio; // make sure sync_with done only once
+};
+
+inline ios& dec(ios& _strm) { _strm.setf(ios::dec,ios::basefield); return _strm; }
+inline ios& hex(ios& _strm) { _strm.setf(ios::hex,ios::basefield); return _strm; }
+inline ios& oct(ios& _strm) { _strm.setf(ios::oct,ios::basefield); return _strm; }
+
+inline long ios::flags() const { return x_flags; }
+inline long ios::flags(long _l){ long _lO; _lO = x_flags; x_flags = _l; return _lO; }
+
+inline long ios::setf(long _l,long _m){ long _lO; _lO = x_flags; x_flags = (_l&_m) | (x_flags&(~_m)); return _lO; }
+inline long ios::setf(long _l){ long _lO; _lO = x_flags; x_flags |= _l; return _lO; }
+inline long ios::unsetf(long _l){ long _lO; _lO = x_flags; x_flags &= (~_l); return _lO; }
+
+inline int ios::width() const { return x_width; }
+inline int ios::width(int _i){ int _iO; _iO = (int)x_width; x_width = _i; return _iO; }
+
+inline ostream* ios::tie(ostream* _os){ ostream* _osO; _osO = x_tie; x_tie = _os; return _osO; }
+inline ostream* ios::tie() const { return x_tie; }
+inline char ios::fill() const { return x_fill; }
+inline char ios::fill(char _c){ char _cO; _cO = x_fill; x_fill = _c; return _cO; }
+inline int ios::precision(int _i){ int _iO; _iO = (int)x_precision; x_precision = _i; return _iO; }
+inline int ios::precision() const { return x_precision; }
+
+inline int ios::rdstate() const { return state; }
+
+// inline ios::operator void *() const { if(state&(badbit|failbit) ) return 0; return (void *)this; }
+inline int ios::operator!() const { return state&(badbit|failbit); }
+
+inline int ios::bad() const { return state & badbit; }
+inline void ios::clear(int _i){ state = _i; }
+inline int ios::eof() const { return state & eofbit; }
+inline int ios::fail() const { return state & (badbit | failbit); }
+inline int ios::good() const { return state == 0; }
+
+inline streambuf* ios::rdbuf() const { return bp; }
+
+inline long _HFAR_ & ios::iword(int _i) const { return x_statebuf[_i] ; }
+inline void _HFAR_ * _HFAR_ & ios::pword(int _i) const { return (void _HFAR_ * _HFAR_ &)x_statebuf[_i]; }
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/iostream.h b/private/oleauto/tools/win16/hdos/c800/include/iostream.h
new file mode 100644
index 000000000..345c5ae16
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/iostream.h
@@ -0,0 +1,65 @@
+/***
+*iostream.h - definitions/declarations for iostream classes
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the iostream classes.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_IOSTREAM
+#define _INC_IOSTREAM
+
+typedef long streamoff, streampos;
+
+#include <ios.h> // Define ios.
+
+#include <streamb.h> // Define streambuf.
+
+#include <istream.h> // Define istream.
+
+#include <ostream.h> // Define ostream.
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+class iostream : public istream, public ostream {
+public:
+ iostream(streambuf*);
+ virtual ~iostream();
+protected:
+// consider: make private??
+ iostream();
+ iostream(const iostream&);
+inline iostream& operator=(streambuf*);
+inline iostream& operator=(iostream&);
+private:
+ iostream(ios&);
+ iostream(istream&);
+ iostream(ostream&);
+};
+
+inline iostream& iostream::operator=(streambuf* _sb) { istream::operator=(_sb); ostream::operator=(_sb); return *this; }
+
+inline iostream& iostream::operator=(iostream& _strm) { return operator=(_strm.rdbuf()); }
+
+class Iostream_init {
+public:
+ Iostream_init();
+ Iostream_init(ios &, int =0); // treat as private
+ ~Iostream_init();
+};
+
+// used internally
+// static Iostream_init __iostreaminit; // initializes cin/cout/cerr/clog
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/istream.h b/private/oleauto/tools/win16/hdos/c800/include/istream.h
new file mode 100644
index 000000000..b17e769ca
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/istream.h
@@ -0,0 +1,149 @@
+/***
+*istream.h - definitions/declarations for the istream class
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the istream class.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_ISTREAM
+#define _INC_ISTREAM
+
+#include <ios.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+
+#ifdef M_I86HM
+#define _HFAR_ __far
+#else
+#define _HFAR_
+#endif
+
+typedef long streamoff, streampos;
+
+class istream : virtual public ios {
+
+public:
+ istream(streambuf*);
+ virtual ~istream();
+
+ int ipfx(int =0);
+ void isfx() { }
+
+ inline istream& operator>>(istream& (*_f)(istream&));
+ inline istream& operator>>(ios& (*_f)(ios&));
+ istream& operator>>(char _HFAR_ *);
+ inline istream& operator>>(unsigned char _HFAR_ *);
+ inline istream& operator>>(signed char _HFAR_ *);
+ istream& operator>>(char _HFAR_ &);
+ inline istream& operator>>(unsigned char _HFAR_ &);
+ inline istream& operator>>(signed char _HFAR_ &);
+ istream& operator>>(short _HFAR_ &);
+ istream& operator>>(unsigned short _HFAR_ &);
+ istream& operator>>(int _HFAR_ &);
+ istream& operator>>(unsigned int _HFAR_ &);
+ istream& operator>>(long _HFAR_ &);
+ istream& operator>>(unsigned long _HFAR_ &);
+ istream& operator>>(float _HFAR_ &);
+ istream& operator>>(double _HFAR_ &);
+ istream& operator>>(long double _HFAR_ &);
+ istream& operator>>(streambuf*);
+
+ int get();
+ istream& get(char _HFAR_ *,int,char ='\n');
+ inline istream& get(unsigned char _HFAR_ *,int,char ='\n');
+ inline istream& get(signed char _HFAR_ *,int,char ='\n');
+ istream& get(char _HFAR_ &);
+ inline istream& get(unsigned char _HFAR_ &);
+ inline istream& get(signed char _HFAR_ &);
+ istream& get(streambuf&,char ='\n');
+ inline istream& getline(char _HFAR_ *,int,char ='\n');
+ inline istream& getline(unsigned char _HFAR_ *,int,char ='\n');
+ inline istream& getline(signed char _HFAR_ *,int,char ='\n');
+
+ inline istream& ignore(int =1,int =EOF);
+ istream& read(char _HFAR_ *,int);
+ inline istream& read(unsigned char _HFAR_ *,int);
+ inline istream& read(signed char _HFAR_ *,int);
+
+ int gcount() const { return x_gcount; }
+ int peek();
+ istream& putback(char);
+ int sync();
+
+ istream& seekg(streampos);
+ istream& seekg(streamoff,ios::seek_dir);
+ streampos tellg();
+
+ void eatwhite(); // consider: protect and friend with manipulator ws
+protected:
+ istream();
+ istream(const istream&); // treat as private
+ istream& operator=(streambuf* _isb); // treat as private
+ istream& operator=(const istream& _is) { return operator=(_is.rdbuf()); }
+ int do_ipfx(int);
+
+private:
+ istream(ios&);
+ int getint(char _HFAR_ *);
+ int getdouble(char _HFAR_ *, int);
+ int _fGline;
+ int x_gcount;
+};
+
+ inline istream& istream::operator>>(istream& (*_f)(istream&)) { (*_f)(*this); return *this; }
+ inline istream& istream::operator>>(ios& (*_f)(ios&)) { (*_f)(*this); return *this; }
+
+ inline istream& istream::operator>>(unsigned char _HFAR_ * _s) { return operator>>((char _HFAR_ *)_s); }
+ inline istream& istream::operator>>(signed char _HFAR_ * _s) { return operator>>((char _HFAR_ *)_s); }
+
+ inline istream& istream::operator>>(unsigned char _HFAR_ & _c) { return operator>>((char _HFAR_ &) _c); }
+ inline istream& istream::operator>>(signed char _HFAR_ & _c) { return operator>>((char _HFAR_ &) _c); }
+
+ inline istream& istream::get(unsigned char _HFAR_ * b, int lim ,char delim) { return get((char _HFAR_ *)b, lim, delim); }
+ inline istream& istream::get(signed char _HFAR_ * b, int lim, char delim) { return get((char _HFAR_ *)b, lim, delim); }
+
+ inline istream& istream::get(unsigned char _HFAR_ & _c) { return get((char _HFAR_ &)_c); }
+ inline istream& istream::get(signed char _HFAR_ & _c) { return get((char _HFAR_ &)_c); }
+
+ inline istream& istream::getline(char _HFAR_ * _b,int _lim,char _delim) { _fGline++; return get(_b, _lim, _delim); }
+ inline istream& istream::getline(unsigned char _HFAR_ * _b,int _lim,char _delim) { _fGline++; return get((char _HFAR_ *)_b, _lim, _delim); }
+ inline istream& istream::getline(signed char _HFAR_ * _b,int _lim,char _delim) { _fGline++; return get((char _HFAR_ *)_b, _lim, _delim); }
+
+ inline istream& istream::ignore(int _n,int delim) { _fGline++; return get((char _HFAR_ *)0, _n+1, (char)delim); }
+
+ inline istream& istream::read(unsigned char _HFAR_ * _ptr, int _n) { return read((char _HFAR_ *) _ptr, _n); }
+ inline istream& istream::read(signed char _HFAR_ * _ptr, int _n) { return read((char _HFAR_ *) _ptr, _n); }
+
+class istream_withassign : public istream {
+ public:
+ istream_withassign();
+ istream_withassign(streambuf*);
+ ~istream_withassign();
+ istream& operator=(const istream& _is) { return istream::operator=(_is); }
+ istream& operator=(streambuf* _isb) { return istream::operator=(_isb); }
+};
+
+#ifndef _WINDLL
+extern istream_withassign cin;
+#endif
+
+inline istream& ws(istream& _ins) { _ins.eatwhite(); return _ins; }
+
+ios& dec(ios&);
+ios& hex(ios&);
+ios& oct(ios&);
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/limits.h b/private/oleauto/tools/win16/hdos/c800/include/limits.h
new file mode 100644
index 000000000..0a1869e13
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/limits.h
@@ -0,0 +1,44 @@
+/***
+*limits.h - implementation dependent values
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains defines for a number of implementation dependent values
+* which are commonly used in C programs.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_LIMITS
+
+#define CHAR_BIT 8 /* number of bits in a char */
+#define SCHAR_MIN (-127) /* minimum signed char value */
+#define SCHAR_MAX 127 /* maximum signed char value */
+#define UCHAR_MAX 0xff /* maximum unsigned char value */
+#ifndef _CHAR_UNSIGNED
+#define CHAR_MIN SCHAR_MIN /* mimimum char value */
+#define CHAR_MAX SCHAR_MAX /* maximum char value */
+#else
+#define CHAR_MIN 0
+#define CHAR_MAX UCHAR_MAX
+#ifndef __cplusplus
+unsigned int _charmax; /* unsigned CHAR_MAX value */
+#else
+extern "C" unsigned int _charmax; /* unsigned CHAR_MAX value */
+static unsigned int *_char_max = &_charmax;
+#endif
+#endif
+#define MB_LEN_MAX 2 /* max. # bytes in multibyte char */
+#define SHRT_MIN (-32767) /* minimum (signed) short value */
+#define SHRT_MAX 32767 /* maximum (signed) short value */
+#define USHRT_MAX 0xffff /* maximum unsigned short value */
+#define INT_MIN (-32767) /* minimum (signed) int value */
+#define INT_MAX 32767 /* maximum (signed) int value */
+#define UINT_MAX 0xffff /* maximum unsigned int value */
+#define LONG_MIN (-2147483647) /* minimum (signed) long value */
+#define LONG_MAX 2147483647 /* maximum (signed) long value */
+#define ULONG_MAX 0xffffffff /* maximum unsigned long value */
+
+#define _INC_LIMITS
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/locale.h b/private/oleauto/tools/win16/hdos/c800/include/locale.h
new file mode 100644
index 000000000..e81a92dd4
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/locale.h
@@ -0,0 +1,84 @@
+/***
+*locale.h - definitions/declarations for localization routines
+*
+* Copyright (c) 1988-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the structures, values, macros, and functions
+* used by the localization routines.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_LOCALE
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+
+/* Locale categories */
+
+#define LC_ALL 0
+#define LC_COLLATE 1
+#define LC_CTYPE 2
+#define LC_MONETARY 3
+#define LC_NUMERIC 4
+#define LC_TIME 5
+
+#define LC_MIN LC_ALL
+#define LC_MAX LC_TIME
+
+
+/* Locale convention structure */
+
+#ifndef _LCONV_DEFINED
+struct lconv {
+ char *decimal_point;
+ char *thousands_sep;
+ char *grouping;
+ char *int_curr_symbol;
+ char *currency_symbol;
+ char *mon_decimal_point;
+ char *mon_thousands_sep;
+ char *mon_grouping;
+ char *positive_sign;
+ char *negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ };
+#define _LCONV_DEFINED
+#endif
+
+/* function prototypes */
+
+char * __cdecl setlocale(int, const char *);
+struct lconv * __cdecl localeconv(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_LOCALE
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/lzdos.h b/private/oleauto/tools/win16/hdos/c800/include/lzdos.h
new file mode 100644
index 000000000..79b44677d
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/lzdos.h
@@ -0,0 +1,5 @@
+/* OBSOLETE: Replaced by #define LIB/#include <lzexpand.h> */
+#ifndef LIB
+#define LIB
+#endif
+#include <lzexpand.h>
diff --git a/private/oleauto/tools/win16/hdos/c800/include/lzexpand.h b/private/oleauto/tools/win16/hdos/c800/include/lzexpand.h
new file mode 100644
index 000000000..29264d387
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/lzexpand.h
@@ -0,0 +1,95 @@
+/*****************************************************************************\
+* *
+* lzexpand.h Public interfaces for LZEXPAND.DLL. *
+* *
+* Version 3.10 *
+* *
+* NOTE: windows.h must be included first if LIB is NOT #defined *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+*******************************************************************************
+*
+* #define LIB - To be used with LZEXP?.LIB (default is for LZEXPAND.DLL)
+* NOTE: Not compatible with windows.h if LIB is #defined
+*
+\*****************************************************************************/
+
+#ifndef _INC_LZEXPAND
+#define _INC_LZEXPAND
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/*
+ * If .lib version is being used, declare types used in this file.
+ */
+#ifdef LIB
+
+#define LZAPI _pascal
+
+#ifndef WINAPI /* don't declare if they're already declared */
+#define WINAPI _far _pascal
+#define NEAR _near
+#define FAR _far
+#define PASCAL _pascal
+typedef int BOOL;
+#define TRUE 1
+#define FALSE 0
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned int UINT;
+typedef signed long LONG;
+typedef unsigned long DWORD;
+typedef char far* LPSTR;
+typedef const char far* LPCSTR;
+typedef int HFILE;
+#define OFSTRUCT void /* Not used by the .lib version */
+#endif /* WINAPI */
+
+#else /* LIB */
+
+#define LZAPI _far _pascal
+
+/* If .dll version is being used and we're being included with
+ * the 3.0 windows.h, #define compatible type aliases.
+ * If included with the 3.0 windows.h, #define compatible aliases
+ */
+#ifndef _INC_WINDOWS
+#define UINT WORD
+#define LPCSTR LPSTR
+#define HFILE int
+#endif /* !_INC_WINDOWS */
+
+#endif /* !LIB */
+
+/****** Error return codes ***************************************************/
+
+#define LZERROR_BADINHANDLE (-1) /* invalid input handle */
+#define LZERROR_BADOUTHANDLE (-2) /* invalid output handle */
+#define LZERROR_READ (-3) /* corrupt compressed file format */
+#define LZERROR_WRITE (-4) /* out of space for output file */
+#define LZERROR_GLOBALLOC (-5) /* insufficient memory for LZFile struct */
+#define LZERROR_GLOBLOCK (-6) /* bad global handle */
+#define LZERROR_BADVALUE (-7) /* input parameter out of range */
+#define LZERROR_UNKNOWNALG (-8) /* compression algorithm not recognized */
+
+/****** Public functions *****************************************************/
+
+int LZAPI LZStart(void);
+void LZAPI LZDone(void);
+LONG LZAPI CopyLZFile(HFILE, HFILE);
+LONG LZAPI LZCopy(HFILE, HFILE);
+HFILE LZAPI LZInit(HFILE);
+int LZAPI GetExpandedName(LPCSTR, LPSTR);
+HFILE LZAPI LZOpenFile(LPCSTR, OFSTRUCT FAR*, UINT);
+LONG LZAPI LZSeek(HFILE, LONG, int);
+int LZAPI LZRead(HFILE, void FAR*, int);
+void LZAPI LZClose(HFILE);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _INC_LZEXPAND */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/malloc.h b/private/oleauto/tools/win16/hdos/c800/include/malloc.h
new file mode 100644
index 000000000..8e28bb5e0
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/malloc.h
@@ -0,0 +1,155 @@
+/***
+*malloc.h - declarations and definitions for memory allocation functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains the function declarations for memory allocation functions;
+* also defines manifest constants and types used by the heap routines.
+* [System V]
+*
+****/
+
+#ifndef _INC_MALLOC
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __based _based
+#define __cdecl _cdecl
+#define __far _far
+#define __huge _huge
+#define __near _near
+#define __segment _segment
+#endif
+
+/* constants for based heap routines */
+
+#define _NULLSEG ((__segment)0)
+#define _NULLOFF ((void __based(void) *)0xffff)
+
+/* constants for _heapchk/_heapset/_heapwalk routines */
+
+#define _HEAPEMPTY (-1)
+#define _HEAPOK (-2)
+#define _HEAPBADBEGIN (-3)
+#define _HEAPBADNODE (-4)
+#define _HEAPEND (-5)
+#define _HEAPBADPTR (-6)
+#define _FREEENTRY 0
+#define _USEDENTRY 1
+
+/* maximum heap request that can ever be honored */
+
+#ifdef _WINDOWS
+#define _HEAP_MAXREQ 0xFFE6
+#else
+#define _HEAP_MAXREQ 0xFFE8
+#endif
+
+/* types and structures */
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _HEAPINFO_DEFINED
+typedef struct _heapinfo {
+ int __far * _pentry;
+ size_t _size;
+ int _useflag;
+ } _HEAPINFO;
+#define _HEAPINFO_DEFINED
+#endif
+
+
+/* external variable declarations */
+
+extern unsigned int __near __cdecl _amblksiz;
+
+
+/* based heap function prototypes */
+
+void __based(void) * __cdecl _bcalloc(__segment, size_t, size_t);
+void __based(void) * __cdecl _bexpand(__segment,
+ void __based(void) *, size_t);
+void __cdecl _bfree(__segment, void __based(void) *);
+int __cdecl _bfreeseg(__segment);
+int __cdecl _bheapadd(__segment, void __based(void) *, size_t);
+int __cdecl _bheapchk(__segment);
+int __cdecl _bheapmin(__segment);
+__segment __cdecl _bheapseg(size_t);
+int __cdecl _bheapset(__segment, unsigned int);
+int __cdecl _bheapwalk(__segment, _HEAPINFO *);
+void __based(void) * __cdecl _bmalloc(__segment, size_t);
+size_t __cdecl _bmsize(__segment, void __based(void) *);
+void __based(void) * __cdecl _brealloc(__segment,
+ void __based(void) *, size_t);
+
+
+/* function prototypes */
+
+void * __cdecl _alloca(size_t);
+void * __cdecl calloc(size_t, size_t);
+void * __cdecl _expand(void *, size_t);
+void __far * __cdecl _fcalloc(size_t, size_t);
+void __far * __cdecl _fexpand(void __far *, size_t);
+void __cdecl _ffree(void __far *);
+int __cdecl _fheapchk(void);
+int __cdecl _fheapmin(void);
+int __cdecl _fheapset(unsigned int);
+int __cdecl _fheapwalk(_HEAPINFO *);
+void __far * __cdecl _fmalloc(size_t);
+size_t __cdecl _fmsize(void __far *);
+void __far * __cdecl _frealloc(void __far *, size_t);
+unsigned int __cdecl _freect(size_t);
+void __cdecl free(void *);
+void __huge * __cdecl _halloc(long, size_t);
+void __cdecl _hfree(void __huge *);
+#ifndef _WINDOWS
+int __cdecl _heapadd(void __far *, size_t);
+int __cdecl _heapchk(void);
+#endif
+int __cdecl _heapmin(void);
+#ifndef _WINDOWS
+int __cdecl _heapset(unsigned int);
+int __cdecl _heapwalk(_HEAPINFO *);
+#endif
+void * __cdecl malloc(size_t);
+size_t __cdecl _memavl(void);
+size_t __cdecl _memmax(void);
+size_t __cdecl _msize(void *);
+void __near * __cdecl _ncalloc(size_t, size_t);
+void __near * __cdecl _nexpand(void __near *, size_t);
+void __cdecl _nfree(void __near *);
+#ifndef _WINDOWS
+int __cdecl _nheapchk(void);
+#endif
+int __cdecl _nheapmin(void);
+#ifndef _WINDOWS
+int __cdecl _nheapset(unsigned int);
+int __cdecl _nheapwalk(_HEAPINFO *);
+#endif
+void __near * __cdecl _nmalloc(size_t);
+size_t __cdecl _nmsize(void __near *);
+void __near * __cdecl _nrealloc(void __near *, size_t);
+void * __cdecl realloc(void *, size_t);
+size_t __cdecl _stackavail(void);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+void * __cdecl alloca(size_t);
+void __huge * __cdecl halloc(long, size_t);
+void __cdecl hfree(void __huge *);
+size_t __cdecl stackavail(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_MALLOC
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/math.h b/private/oleauto/tools/win16/hdos/c800/include/math.h
new file mode 100644
index 000000000..39a4af3d5
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/math.h
@@ -0,0 +1,303 @@
+/***
+*math.h - definitions and declarations for math library
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains constant definitions and external subroutine
+* declarations for the math subroutine library.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_MATH
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#define __pascal _pascal
+#endif
+
+/* definition of _exception struct - this struct is passed to the _matherr
+ * routine when a floating point exception is detected
+ */
+
+#ifndef _EXCEPTION_DEFINED
+#pragma pack(2)
+
+struct _exception {
+ int type; /* exception type - see below */
+ char *name; /* name of function where error occured */
+ double arg1; /* first argument to function */
+ double arg2; /* second argument (if any) to function */
+ double retval; /* value to be returned by function */
+ } ;
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+#define exception _exception
+#endif
+
+#pragma pack()
+#define _EXCEPTION_DEFINED
+#endif
+
+
+/* definition of a _complex struct to be used by those who use cabs and
+ * want type checking on their argument
+ */
+
+#ifndef _COMPLEX_DEFINED
+
+struct _complex {
+ double x,y; /* real and imaginary parts */
+ } ;
+
+#ifndef __cplusplus
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+struct complex {
+ double x,y; /* real and imaginary parts */
+ } ;
+#endif
+#endif
+
+#define _COMPLEX_DEFINED
+#endif
+
+
+/* Constant definitions for the exception type passed in the _exception struct
+ */
+
+#define _DOMAIN 1 /* argument domain error */
+#define _SING 2 /* argument singularity */
+#define _OVERFLOW 3 /* overflow range error */
+#define _UNDERFLOW 4 /* underflow range error */
+#define _TLOSS 5 /* total loss of precision */
+#define _PLOSS 6 /* partial loss of precision */
+
+#define EDOM 33
+#define ERANGE 34
+
+
+/* definitions of _HUGE (XENIX) and HUGE_VAL (ANSI) error return values used
+ * by several floating point math routines
+ */
+
+extern double __near __cdecl _HUGE;
+#define HUGE_VAL _HUGE
+
+
+/* function prototypes */
+
+#ifdef _MT
+int __cdecl abs(int);
+double __pascal acos(double);
+double __pascal asin(double);
+double __pascal atan(double);
+double __pascal atan2(double, double);
+double __pascal atof(const char *);
+double __pascal _cabs(struct _complex);
+double __pascal ceil(double);
+double __pascal cos(double);
+double __pascal cosh(double);
+int __cdecl _dieeetomsbin(double *, double *);
+int __cdecl _dmsbintoieee(double *, double *);
+double __pascal exp(double);
+double __pascal fabs(double);
+int __cdecl _fieeetomsbin(float *, float *);
+double __pascal floor(double);
+double __pascal fmod(double, double);
+int __cdecl _fmsbintoieee(float *, float *);
+double __pascal frexp(double, int *);
+double __pascal _hypot(double, double);
+double __pascal _j0(double);
+double __pascal _j1(double);
+double __pascal _jn(int, double);
+long __cdecl labs(long);
+double __pascal ldexp(double, int);
+double __pascal log(double);
+double __pascal log10(double);
+int __cdecl _matherr(struct _exception *);
+double __pascal modf(double, double *);
+double __pascal pow(double, double);
+double __pascal sin(double);
+double __pascal sinh(double);
+double __pascal sqrt(double);
+double __pascal tan(double);
+double __pascal tanh(double);
+double __pascal _y0(double);
+double __pascal _y1(double);
+double __pascal _yn(int, double);
+
+#else
+int __cdecl abs(int);
+double __cdecl acos(double);
+double __cdecl asin(double);
+double __cdecl atan(double);
+double __cdecl atan2(double, double);
+double __cdecl atof(const char *);
+double __cdecl _cabs(struct _complex);
+double __cdecl ceil(double);
+double __cdecl cos(double);
+double __cdecl cosh(double);
+int __cdecl _dieeetomsbin(double *, double *);
+int __cdecl _dmsbintoieee(double *, double *);
+double __cdecl exp(double);
+double __cdecl fabs(double);
+int __cdecl _fieeetomsbin(float *, float *);
+double __cdecl floor(double);
+double __cdecl fmod(double, double);
+int __cdecl _fmsbintoieee(float *, float *);
+double __cdecl frexp(double, int *);
+double __cdecl _hypot(double, double);
+double __cdecl _j0(double);
+double __cdecl _j1(double);
+double __cdecl _jn(int, double);
+long __cdecl labs(long);
+double __cdecl ldexp(double, int);
+double __cdecl log(double);
+double __cdecl log10(double);
+int __cdecl _matherr(struct _exception *);
+double __cdecl modf(double, double *);
+double __cdecl pow(double, double);
+double __cdecl sin(double);
+double __cdecl sinh(double);
+double __cdecl sqrt(double);
+double __cdecl tan(double);
+double __cdecl tanh(double);
+double __cdecl _y0(double);
+double __cdecl _y1(double);
+double __cdecl _yn(int, double);
+#endif
+
+
+/* definition of _exceptionl struct - this struct is passed to the _matherrl
+ * routine when a floating point exception is detected in a long double routine
+ */
+
+#ifndef _LD_EXCEPTION_DEFINED
+#pragma pack(2)
+struct _exceptionl {
+ int type; /* exception type - see below */
+ char *name; /* name of function where error occured */
+ long double arg1; /* first argument to function */
+ long double arg2; /* second argument (if any) to function */
+ long double retval; /* value to be returned by function */
+ } ;
+#pragma pack()
+#define _LD_EXCEPTION_DEFINED
+#endif
+
+
+/* definition of a _complexl struct to be used by those who use _cabsl and
+ * want type checking on their argument
+ */
+
+#ifndef _LD_COMPLEX_DEFINED
+#pragma pack(2)
+struct _complexl {
+ long double x,y; /* real and imaginary parts */
+ } ;
+#pragma pack()
+#define _LD_COMPLEX_DEFINED
+#endif
+
+extern long double __near __cdecl _LHUGE;
+#define _LHUGE_VAL _LHUGE
+
+
+long double __cdecl acosl(long double);
+long double __cdecl asinl(long double);
+long double __cdecl atanl(long double);
+long double __cdecl atan2l(long double, long double);
+long double __cdecl _atold(const char *);
+long double __cdecl _cabsl(struct _complexl);
+long double __cdecl ceill(long double);
+long double __cdecl cosl(long double);
+long double __cdecl coshl(long double);
+long double __cdecl expl(long double);
+long double __cdecl fabsl(long double);
+long double __cdecl floorl(long double);
+long double __cdecl fmodl(long double, long double);
+long double __cdecl frexpl(long double, int *);
+long double __cdecl _hypotl(long double, long double);
+long double __cdecl _j0l(long double);
+long double __cdecl _j1l(long double);
+long double __cdecl _jnl(int, long double);
+long double __cdecl ldexpl(long double, int);
+long double __cdecl logl(long double);
+long double __cdecl log10l(long double);
+int __cdecl _matherrl(struct _exceptionl *);
+long double __cdecl modfl(long double, long double *);
+long double __cdecl powl(long double, long double);
+long double __cdecl sinl(long double);
+long double __cdecl sinhl(long double);
+long double __cdecl sqrtl(long double);
+long double __cdecl tanl(long double);
+long double __cdecl tanhl(long double);
+long double __cdecl _y0l(long double);
+long double __cdecl _y1l(long double);
+long double __cdecl _ynl(int, long double);
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define DOMAIN _DOMAIN
+#define SING _SING
+#define OVERFLOW _OVERFLOW
+#define UNDERFLOW _UNDERFLOW
+#define TLOSS _TLOSS
+#define PLOSS _PLOSS
+
+#define matherr _matherr
+
+extern double __near __cdecl HUGE;
+
+#ifdef _MT
+#ifndef __cplusplus
+double __pascal cabs(struct complex);
+#endif
+double __pascal hypot(double, double);
+double __pascal j0(double);
+double __pascal j1(double);
+double __pascal jn(int, double);
+double __pascal y0(double);
+double __pascal y1(double);
+double __pascal yn(int, double);
+#else
+#ifndef __cplusplus
+double __cdecl cabs(struct complex);
+#endif
+double __cdecl hypot(double, double);
+double __cdecl j0(double);
+double __cdecl j1(double);
+double __cdecl jn(int, double);
+double __cdecl y0(double);
+double __cdecl y1(double);
+double __cdecl yn(int, double);
+#endif
+
+int __cdecl dieeetomsbin(double *, double *);
+int __cdecl dmsbintoieee(double *, double *);
+int __cdecl fieeetomsbin(float *, float *);
+int __cdecl fmsbintoieee(float *, float *);
+
+long double __cdecl cabsl(struct _complexl);
+long double __cdecl hypotl(long double, long double);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_MATH
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/memory.h b/private/oleauto/tools/win16/hdos/c800/include/memory.h
new file mode 100644
index 000000000..5ce2f440f
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/memory.h
@@ -0,0 +1,75 @@
+/***
+*memory.h - declarations for buffer (memory) manipulation routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file contains the function declarations for the
+* buffer (memory) manipulation routines.
+* [System V]
+*
+****/
+
+#ifndef _INC_MEMORY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+
+/* function prototypes */
+
+void * __cdecl _memccpy(void *, const void *,
+ int, unsigned int);
+void * __cdecl memchr(const void *, int, size_t);
+int __cdecl memcmp(const void *, const void *,
+ size_t);
+void * __cdecl memcpy(void *, const void *,
+ size_t);
+int __cdecl _memicmp(const void *, const void *,
+ unsigned int);
+void * __cdecl memset(void *, int, size_t);
+void __cdecl _movedata(unsigned int, unsigned int, unsigned int,
+ unsigned int, unsigned int);
+
+
+/* model independent function prototypes */
+
+void __far * __far __cdecl _fmemccpy(void __far *, const void __far *,
+ int, unsigned int);
+void __far * __far __cdecl _fmemchr(const void __far *, int, size_t);
+int __far __cdecl _fmemcmp(const void __far *, const void __far *,
+ size_t);
+void __far * __far __cdecl _fmemcpy(void __far *, const void __far *,
+ size_t);
+int __far __cdecl _fmemicmp(const void __far *, const void __far *,
+ unsigned int);
+void __far * __far __cdecl _fmemset(void __far *, int, size_t);
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+void * __cdecl memccpy(void *, const void *,
+ int, unsigned int);
+int __cdecl memicmp(const void *, const void *,
+ unsigned int);
+void __cdecl movedata(unsigned int, unsigned int, unsigned int,
+ unsigned int, unsigned int);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_MEMORY
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/mmsystem.h b/private/oleauto/tools/win16/hdos/c800/include/mmsystem.h
new file mode 100644
index 000000000..e3bfa4234
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/mmsystem.h
@@ -0,0 +1,1917 @@
+/****************************************************************************/
+/* */
+/* MMSYSTEM.H - Include file for Multimedia APIs */
+/* */
+/* Note: You must include WINDOWS.H before including this file. */
+/* */
+/* Copyright (c) 1990-1992, Microsoft Corp. All rights reserved. */
+/* */
+/****************************************************************************/
+
+
+
+/* If defined, the following flags inhibit inclusion
+ * of the indicated items:
+ *
+ * MMNODRV - Installable driver support
+ * MMNOSOUND - Sound support
+ * MMNOWAVE - Waveform support
+ * MMNOMIDI - MIDI support
+ * MMNOAUX - Auxiliary audio support
+ * MMNOTIMER - Timer support
+ * MMNOJOY - Joystick support
+ * MMNOMCI - MCI support
+ * MMNOMMIO - Multimedia file I/O support
+ * MMNOMMSYSTEM - General MMSYSTEM functions
+ */
+
+#ifndef _INC_MMSYSTEM
+#define _INC_MMSYSTEM /* #defined if mmsystem.h has been included */
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+
+/****************************************************************************
+
+ General constants and data types
+
+****************************************************************************/
+
+/* general constants */
+#define MAXPNAMELEN 32 /* max product name length (including NULL) */
+#define MAXERRORLENGTH 128 /* max error text length (including NULL) */
+
+/* general data types */
+typedef WORD VERSION; /* major (high byte), minor (low byte) */
+
+/* MMTIME data structure */
+typedef struct mmtime_tag {
+ UINT wType; /* indicates the contents of the union */
+ union {
+ DWORD ms; /* milliseconds */
+ DWORD sample; /* samples */
+ DWORD cb; /* byte count */
+ struct { /* SMPTE */
+ BYTE hour; /* hours */
+ BYTE min; /* minutes */
+ BYTE sec; /* seconds */
+ BYTE frame; /* frames */
+ BYTE fps; /* frames per second */
+ BYTE dummy; /* pad */
+ } smpte;
+ struct { /* MIDI */
+ DWORD songptrpos; /* song pointer position */
+ } midi;
+ } u;
+ } MMTIME;
+typedef MMTIME *PMMTIME;
+typedef MMTIME NEAR *NPMMTIME;
+typedef MMTIME FAR *LPMMTIME;
+
+/* types for wType field in MMTIME struct */
+#define TIME_MS 0x0001 /* time in milliseconds */
+#define TIME_SAMPLES 0x0002 /* number of wave samples */
+#define TIME_BYTES 0x0004 /* current byte offset */
+#define TIME_SMPTE 0x0008 /* SMPTE time */
+#define TIME_MIDI 0x0010 /* MIDI time */
+
+
+/****************************************************************************
+
+ Multimedia Extensions Window Messages
+
+****************************************************************************/
+
+#define MM_JOY1MOVE 0x3A0 /* joystick */
+#define MM_JOY2MOVE 0x3A1
+#define MM_JOY1ZMOVE 0x3A2
+#define MM_JOY2ZMOVE 0x3A3
+#define MM_JOY1BUTTONDOWN 0x3B5
+#define MM_JOY2BUTTONDOWN 0x3B6
+#define MM_JOY1BUTTONUP 0x3B7
+#define MM_JOY2BUTTONUP 0x3B8
+
+#define MM_MCINOTIFY 0x3B9 /* MCI */
+
+#define MM_WOM_OPEN 0x3BB /* waveform output */
+#define MM_WOM_CLOSE 0x3BC
+#define MM_WOM_DONE 0x3BD
+
+#define MM_WIM_OPEN 0x3BE /* waveform input */
+#define MM_WIM_CLOSE 0x3BF
+#define MM_WIM_DATA 0x3C0
+
+#define MM_MIM_OPEN 0x3C1 /* MIDI input */
+#define MM_MIM_CLOSE 0x3C2
+#define MM_MIM_DATA 0x3C3
+#define MM_MIM_LONGDATA 0x3C4
+#define MM_MIM_ERROR 0x3C5
+#define MM_MIM_LONGERROR 0x3C6
+
+#define MM_MOM_OPEN 0x3C7 /* MIDI output */
+#define MM_MOM_CLOSE 0x3C8
+#define MM_MOM_DONE 0x3C9
+
+
+/****************************************************************************
+
+ String resource number bases (internal use)
+
+****************************************************************************/
+
+#define MMSYSERR_BASE 0
+#define WAVERR_BASE 32
+#define MIDIERR_BASE 64
+#define TIMERR_BASE 96
+#define JOYERR_BASE 160
+#define MCIERR_BASE 256
+
+#define MCI_STRING_OFFSET 512
+#define MCI_VD_OFFSET 1024
+#define MCI_CD_OFFSET 1088
+#define MCI_WAVE_OFFSET 1152
+#define MCI_SEQ_OFFSET 1216
+
+/****************************************************************************
+
+ General error return values
+
+****************************************************************************/
+
+/* general error return values */
+#define MMSYSERR_NOERROR 0 /* no error */
+#define MMSYSERR_ERROR (MMSYSERR_BASE + 1) /* unspecified error */
+#define MMSYSERR_BADDEVICEID (MMSYSERR_BASE + 2) /* device ID out of range */
+#define MMSYSERR_NOTENABLED (MMSYSERR_BASE + 3) /* driver failed enable */
+#define MMSYSERR_ALLOCATED (MMSYSERR_BASE + 4) /* device already allocated */
+#define MMSYSERR_INVALHANDLE (MMSYSERR_BASE + 5) /* device handle is invalid */
+#define MMSYSERR_NODRIVER (MMSYSERR_BASE + 6) /* no device driver present */
+#define MMSYSERR_NOMEM (MMSYSERR_BASE + 7) /* memory allocation error */
+#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE + 8) /* function isn't supported */
+#define MMSYSERR_BADERRNUM (MMSYSERR_BASE + 9) /* error value out of range */
+#define MMSYSERR_INVALFLAG (MMSYSERR_BASE + 10) /* invalid flag passed */
+#define MMSYSERR_INVALPARAM (MMSYSERR_BASE + 11) /* invalid parameter passed */
+#define MMSYSERR_LASTERROR (MMSYSERR_BASE + 11) /* last error in range */
+
+
+#if (WINVER < 0x030a)
+DECLARE_HANDLE(HDRVR);
+#endif /* ifdef WINVER < 0x030a */
+
+#ifndef MMNODRV
+/****************************************************************************
+
+ Installable driver support
+
+****************************************************************************/
+
+#if (WINVER < 0x030a)
+
+/* return values from DriverProc() function */
+#define DRV_CANCEL 0x0000
+#define DRV_OK 0x0001
+#define DRV_RESTART 0x0002
+
+/* Driver messages */
+#define DRV_LOAD 0x0001
+#define DRV_ENABLE 0x0002
+#define DRV_OPEN 0x0003
+#define DRV_CLOSE 0x0004
+#define DRV_DISABLE 0x0005
+#define DRV_FREE 0x0006
+#define DRV_CONFIGURE 0x0007
+#define DRV_QUERYCONFIGURE 0x0008
+#define DRV_INSTALL 0x0009
+#define DRV_REMOVE 0x000A
+#define DRV_RESERVED 0x0800
+#define DRV_USER 0x4000
+
+/* LPARAM of DRV_CONFIGURE message */
+typedef struct tagDRVCONFIGINFO {
+ DWORD dwDCISize;
+ LPCSTR lpszDCISectionName;
+ LPCSTR lpszDCIAliasName;
+} DRVCONFIGINFO;
+typedef DRVCONFIGINFO *PDRVCONFIGINFO;
+typedef DRVCONFIGINFO NEAR *NPDRVCONFIGINFO;
+typedef DRVCONFIGINFO FAR *LPDRVCONFIGINFO;
+
+/* installable driver function prototypes */
+LRESULT WINAPI DrvClose(HDRVR hDriver, LPARAM lParam1, LPARAM lParam2);
+HDRVR WINAPI DrvOpen(LPCSTR szDriverName, LPCSTR szSectionName,
+ LPARAM lParam2);
+LRESULT WINAPI DrvSendMessage(HDRVR hDriver, UINT uMessage,
+ LPARAM lParam1, LPARAM lParam2);
+HINSTANCE WINAPI DrvGetModuleHandle(HDRVR hDriver);
+
+LRESULT WINAPI DrvDefDriverProc(DWORD dwDriverIdentifier, HDRVR driverID,
+ UINT uMessage, LPARAM lParam1, LPARAM lParam2);
+
+#define DefDriverProc DrvDefDriverProc
+
+#endif /* ifdef WINVER < 0x030a */
+
+#if (WINVER >= 0x030a)
+
+
+/* return values from DriverProc() function */
+#define DRV_CANCEL DRVCNF_CANCEL
+#define DRV_OK DRVCNF_OK
+#define DRV_RESTART DRVCNF_RESTART
+
+#endif /* ifdef WINVER >= 0x030a */
+
+#define DRV_MCI_FIRST DRV_RESERVED
+#define DRV_MCI_LAST (DRV_RESERVED + 0xFFF)
+
+#endif /* ifndef MMNODRV */
+
+
+/****************************************************************************
+
+ Driver callback support
+
+****************************************************************************/
+
+/* flags used with waveOutOpen(), waveInOpen(), midiInOpen(), and */
+/* midiOutOpen() to specify the type of the dwCallback parameter. */
+
+#define CALLBACK_TYPEMASK 0x00070000l /* callback type mask */
+#define CALLBACK_NULL 0x00000000l /* no callback */
+#define CALLBACK_WINDOW 0x00010000l /* dwCallback is a HWND */
+#define CALLBACK_TASK 0x00020000l /* dwCallback is a HTASK */
+#define CALLBACK_FUNCTION 0x00030000l /* dwCallback is a FARPROC */
+
+/* driver callback prototypes */
+typedef void (CALLBACK DRVCALLBACK) (HDRVR h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
+
+typedef DRVCALLBACK FAR *LPDRVCALLBACK;
+
+/****************************************************************************
+
+ Manufacturer and product IDs
+
+ Used with wMid and wPid fields in WAVEOUTCAPS, WAVEINCAPS,
+ MIDIOUTCAPS, MIDIINCAPS, AUXCAPS, JOYCAPS structures.
+
+****************************************************************************/
+
+/* manufacturer IDs */
+#define MM_MICROSOFT 1 /* Microsoft Corp. */
+
+/* product IDs */
+#define MM_MIDI_MAPPER 1 /* MIDI Mapper */
+#define MM_WAVE_MAPPER 2 /* Wave Mapper */
+
+#define MM_SNDBLST_MIDIOUT 3 /* Sound Blaster MIDI output port */
+#define MM_SNDBLST_MIDIIN 4 /* Sound Blaster MIDI input port */
+#define MM_SNDBLST_SYNTH 5 /* Sound Blaster internal synthesizer */
+#define MM_SNDBLST_WAVEOUT 6 /* Sound Blaster waveform output */
+#define MM_SNDBLST_WAVEIN 7 /* Sound Blaster waveform input */
+
+#define MM_ADLIB 9 /* Ad Lib-compatible synthesizer */
+
+#define MM_MPU401_MIDIOUT 10 /* MPU401-compatible MIDI output port */
+#define MM_MPU401_MIDIIN 11 /* MPU401-compatible MIDI input port */
+
+#define MM_PC_JOYSTICK 12 /* Joystick adapter */
+
+
+#ifndef MMNOMMSYSTEM
+/****************************************************************************
+
+ General MMSYSTEM support
+
+****************************************************************************/
+
+WORD WINAPI mmsystemGetVersion(void);
+void WINAPI OutputDebugStr(LPCSTR);
+
+#endif /* ifndef MMNOMMSYSTEM */
+
+
+#ifndef MMNOSOUND
+/****************************************************************************
+
+ Sound support
+
+****************************************************************************/
+
+BOOL WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT uFlags);
+
+/* flag values for wFlags parameter */
+#define SND_SYNC 0x0000 /* play synchronously (default) */
+#define SND_ASYNC 0x0001 /* play asynchronously */
+#define SND_NODEFAULT 0x0002 /* don't use default sound */
+#define SND_MEMORY 0x0004 /* lpszSoundName points to a memory file */
+#define SND_LOOP 0x0008 /* loop the sound until next sndPlaySound */
+#define SND_NOSTOP 0x0010 /* don't stop any currently playing sound */
+
+#endif /* ifndef MMNOSOUND */
+
+
+#ifndef MMNOWAVE
+/****************************************************************************
+
+ Waveform audio support
+
+****************************************************************************/
+
+/* waveform audio error return values */
+#define WAVERR_BADFORMAT (WAVERR_BASE + 0) /* unsupported wave format */
+#define WAVERR_STILLPLAYING (WAVERR_BASE + 1) /* still something playing */
+#define WAVERR_UNPREPARED (WAVERR_BASE + 2) /* header not prepared */
+#define WAVERR_SYNC (WAVERR_BASE + 3) /* device is synchronous */
+#define WAVERR_LASTERROR (WAVERR_BASE + 3) /* last error in range */
+
+/* waveform audio data types */
+DECLARE_HANDLE(HWAVE);
+DECLARE_HANDLE(HWAVEIN);
+DECLARE_HANDLE(HWAVEOUT);
+typedef HWAVEIN FAR *LPHWAVEIN;
+typedef HWAVEOUT FAR *LPHWAVEOUT;
+typedef DRVCALLBACK WAVECALLBACK;
+typedef WAVECALLBACK FAR *LPWAVECALLBACK;
+
+/* wave callback messages */
+#define WOM_OPEN MM_WOM_OPEN
+#define WOM_CLOSE MM_WOM_CLOSE
+#define WOM_DONE MM_WOM_DONE
+#define WIM_OPEN MM_WIM_OPEN
+#define WIM_CLOSE MM_WIM_CLOSE
+#define WIM_DATA MM_WIM_DATA
+
+/* device ID for wave device mapper */
+#define WAVE_MAPPER (-1)
+
+/* flags for dwFlags parameter in waveOutOpen() and waveInOpen() */
+#define WAVE_FORMAT_QUERY 0x0001
+#define WAVE_ALLOWSYNC 0x0002
+
+/* wave data block header */
+typedef struct wavehdr_tag {
+ LPSTR lpData; /* pointer to locked data buffer */
+ DWORD dwBufferLength; /* length of data buffer */
+ DWORD dwBytesRecorded; /* used for input only */
+ DWORD dwUser; /* for client's use */
+ DWORD dwFlags; /* assorted flags (see defines) */
+ DWORD dwLoops; /* loop control counter */
+ struct wavehdr_tag far *lpNext; /* reserved for driver */
+ DWORD reserved; /* reserved for driver */
+} WAVEHDR;
+typedef WAVEHDR *PWAVEHDR;
+typedef WAVEHDR NEAR *NPWAVEHDR;
+typedef WAVEHDR FAR *LPWAVEHDR;
+
+/* flags for dwFlags field of WAVEHDR */
+#define WHDR_DONE 0x00000001 /* done bit */
+#define WHDR_PREPARED 0x00000002 /* set if this header has been prepared */
+#define WHDR_BEGINLOOP 0x00000004 /* loop start block */
+#define WHDR_ENDLOOP 0x00000008 /* loop end block */
+#define WHDR_INQUEUE 0x00000010 /* reserved for driver */
+
+/* waveform output device capabilities structure */
+typedef struct waveoutcaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ DWORD dwFormats; /* formats supported */
+ UINT wChannels; /* number of sources supported */
+ DWORD dwSupport; /* functionality supported by driver */
+} WAVEOUTCAPS;
+typedef WAVEOUTCAPS *PWAVEOUTCAPS;
+typedef WAVEOUTCAPS NEAR *NPWAVEOUTCAPS;
+typedef WAVEOUTCAPS FAR *LPWAVEOUTCAPS;
+
+/* flags for dwSupport field of WAVEOUTCAPS */
+#define WAVECAPS_PITCH 0x0001 /* supports pitch control */
+#define WAVECAPS_PLAYBACKRATE 0x0002 /* supports playback rate control */
+#define WAVECAPS_VOLUME 0x0004 /* supports volume control */
+#define WAVECAPS_LRVOLUME 0x0008 /* separate left-right volume control */
+#define WAVECAPS_SYNC 0x0010
+
+/* waveform input device capabilities structure */
+typedef struct waveincaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ DWORD dwFormats; /* formats supported */
+ UINT wChannels; /* number of channels supported */
+} WAVEINCAPS;
+typedef WAVEINCAPS *PWAVEINCAPS;
+typedef WAVEINCAPS NEAR *NPWAVEINCAPS;
+typedef WAVEINCAPS FAR *LPWAVEINCAPS;
+
+/* defines for dwFormat field of WAVEINCAPS and WAVEOUTCAPS */
+#define WAVE_INVALIDFORMAT 0x00000000 /* invalid format */
+#define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */
+#define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */
+#define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */
+
+/* general waveform format structure (information common to all formats) */
+typedef struct waveformat_tag {
+ WORD wFormatTag; /* format type */
+ WORD nChannels; /* number of channels (i.e. mono, stereo, etc.) */
+ DWORD nSamplesPerSec; /* sample rate */
+ DWORD nAvgBytesPerSec; /* for buffer estimation */
+ WORD nBlockAlign; /* block size of data */
+} WAVEFORMAT;
+typedef WAVEFORMAT *PWAVEFORMAT;
+typedef WAVEFORMAT NEAR *NPWAVEFORMAT;
+typedef WAVEFORMAT FAR *LPWAVEFORMAT;
+
+/* flags for wFormatTag field of WAVEFORMAT */
+#define WAVE_FORMAT_PCM 1
+
+/* specific waveform format structure for PCM data */
+typedef struct pcmwaveformat_tag {
+ WAVEFORMAT wf;
+ WORD wBitsPerSample;
+} PCMWAVEFORMAT;
+typedef PCMWAVEFORMAT *PPCMWAVEFORMAT;
+typedef PCMWAVEFORMAT NEAR *NPPCMWAVEFORMAT;
+typedef PCMWAVEFORMAT FAR *LPPCMWAVEFORMAT;
+
+/* waveform audio function prototypes */
+UINT WINAPI waveOutGetNumDevs(void);
+UINT WINAPI waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS FAR* lpCaps,
+ UINT uSize);
+UINT WINAPI waveOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+UINT WINAPI waveOutSetVolume(UINT uDeviceID, DWORD dwVolume);
+UINT WINAPI waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI waveOutOpen(HWAVEOUT FAR* lphWaveOut, UINT uDeviceID,
+ const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
+UINT WINAPI waveOutClose(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut,
+ WAVEHDR FAR* lpWaveOutHdr, UINT uSize);
+UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut,
+ WAVEHDR FAR* lpWaveOutHdr, UINT uSize);
+UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr,
+ UINT uSize);
+UINT WINAPI waveOutPause(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutRestart(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutReset(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutBreakLoop(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME FAR* lpInfo,
+ UINT uSize);
+UINT WINAPI waveOutGetPitch(HWAVEOUT hWaveOut, DWORD FAR* lpdwPitch);
+UINT WINAPI waveOutSetPitch(HWAVEOUT hWaveOut, DWORD dwPitch);
+UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD FAR* lpdwRate);
+UINT WINAPI waveOutSetPlaybackRate(HWAVEOUT hWaveOut, DWORD dwRate);
+UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT FAR* lpuDeviceID);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+UINT WINAPI waveInGetNumDevs(void);
+UINT WINAPI waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS FAR* lpCaps,
+ UINT uSize);
+UINT WINAPI waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI waveInOpen(HWAVEIN FAR* lphWaveIn, UINT uDeviceID,
+ const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
+UINT WINAPI waveInClose(HWAVEIN hWaveIn);
+UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn,
+ WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn,
+ WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn,
+ WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+UINT WINAPI waveInStart(HWAVEIN hWaveIn);
+UINT WINAPI waveInStop(HWAVEIN hWaveIn);
+UINT WINAPI waveInReset(HWAVEIN hWaveIn);
+UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, MMTIME FAR* lpInfo,
+ UINT uSize);
+UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT FAR* lpuDeviceID);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+#endif /* ifndef MMNOWAVE */
+
+
+#ifndef MMNOMIDI
+/****************************************************************************
+
+ MIDI audio support
+
+****************************************************************************/
+
+/* MIDI error return values */
+#define MIDIERR_UNPREPARED (MIDIERR_BASE + 0) /* header not prepared */
+#define MIDIERR_STILLPLAYING (MIDIERR_BASE + 1) /* still something playing */
+#define MIDIERR_NOMAP (MIDIERR_BASE + 2) /* no current map */
+#define MIDIERR_NOTREADY (MIDIERR_BASE + 3) /* hardware is still busy */
+#define MIDIERR_NODEVICE (MIDIERR_BASE + 4) /* port no longer connected */
+#define MIDIERR_INVALIDSETUP (MIDIERR_BASE + 5) /* invalid setup */
+#define MIDIERR_LASTERROR (MIDIERR_BASE + 5) /* last error in range */
+
+/* MIDI audio data types */
+DECLARE_HANDLE(HMIDI);
+DECLARE_HANDLE(HMIDIIN);
+DECLARE_HANDLE(HMIDIOUT);
+typedef HMIDIIN FAR *LPHMIDIIN;
+typedef HMIDIOUT FAR *LPHMIDIOUT;
+typedef DRVCALLBACK MIDICALLBACK;
+typedef MIDICALLBACK FAR *LPMIDICALLBACK;
+#define MIDIPATCHSIZE 128
+typedef WORD PATCHARRAY[MIDIPATCHSIZE];
+typedef WORD FAR *LPPATCHARRAY;
+typedef WORD KEYARRAY[MIDIPATCHSIZE];
+typedef WORD FAR *LPKEYARRAY;
+
+/* MIDI callback messages */
+#define MIM_OPEN MM_MIM_OPEN
+#define MIM_CLOSE MM_MIM_CLOSE
+#define MIM_DATA MM_MIM_DATA
+#define MIM_LONGDATA MM_MIM_LONGDATA
+#define MIM_ERROR MM_MIM_ERROR
+#define MIM_LONGERROR MM_MIM_LONGERROR
+#define MOM_OPEN MM_MOM_OPEN
+#define MOM_CLOSE MM_MOM_CLOSE
+#define MOM_DONE MM_MOM_DONE
+
+/* device ID for MIDI mapper */
+#define MIDIMAPPER (-1)
+#define MIDI_MAPPER (-1)
+
+/* flags for wFlags parm of midiOutCachePatches(), midiOutCacheDrumPatches() */
+#define MIDI_CACHE_ALL 1
+#define MIDI_CACHE_BESTFIT 2
+#define MIDI_CACHE_QUERY 3
+#define MIDI_UNCACHE 4
+
+/* MIDI output device capabilities structure */
+typedef struct midioutcaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ UINT wTechnology; /* type of device */
+ UINT wVoices; /* # of voices (internal synth only) */
+ UINT wNotes; /* max # of notes (internal synth only) */
+ UINT wChannelMask; /* channels used (internal synth only) */
+ DWORD dwSupport; /* functionality supported by driver */
+} MIDIOUTCAPS;
+typedef MIDIOUTCAPS *PMIDIOUTCAPS;
+typedef MIDIOUTCAPS NEAR *NPMIDIOUTCAPS;
+typedef MIDIOUTCAPS FAR *LPMIDIOUTCAPS;
+
+/* flags for wTechnology field of MIDIOUTCAPS structure */
+#define MOD_MIDIPORT 1 /* output port */
+#define MOD_SYNTH 2 /* generic internal synth */
+#define MOD_SQSYNTH 3 /* square wave internal synth */
+#define MOD_FMSYNTH 4 /* FM internal synth */
+#define MOD_MAPPER 5 /* MIDI mapper */
+
+/* flags for dwSupport field of MIDIOUTCAPS structure */
+#define MIDICAPS_VOLUME 0x0001 /* supports volume control */
+#define MIDICAPS_LRVOLUME 0x0002 /* separate left-right volume control */
+#define MIDICAPS_CACHE 0x0004
+
+/* MIDI output device capabilities structure */
+typedef struct midiincaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+} MIDIINCAPS;
+typedef MIDIINCAPS *PMIDIINCAPS;
+typedef MIDIINCAPS NEAR *NPMIDIINCAPS;
+typedef MIDIINCAPS FAR *LPMIDIINCAPS;
+
+/* MIDI data block header */
+typedef struct midihdr_tag {
+ LPSTR lpData; /* pointer to locked data block */
+ DWORD dwBufferLength; /* length of data in data block */
+ DWORD dwBytesRecorded; /* used for input only */
+ DWORD dwUser; /* for client's use */
+ DWORD dwFlags; /* assorted flags (see defines) */
+ struct midihdr_tag far *lpNext; /* reserved for driver */
+ DWORD reserved; /* reserved for driver */
+} MIDIHDR;
+typedef MIDIHDR *PMIDIHDR;
+typedef MIDIHDR NEAR *NPMIDIHDR;
+typedef MIDIHDR FAR *LPMIDIHDR;
+
+/* flags for dwFlags field of MIDIHDR structure */
+#define MHDR_DONE 0x00000001 /* done bit */
+#define MHDR_PREPARED 0x00000002 /* set if header prepared */
+#define MHDR_INQUEUE 0x00000004 /* reserved for driver */
+
+/* MIDI function prototypes */
+UINT WINAPI midiOutGetNumDevs(void);
+UINT WINAPI midiOutGetDevCaps(UINT uDeviceID,
+ MIDIOUTCAPS FAR* lpCaps, UINT uSize);
+UINT WINAPI midiOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+UINT WINAPI midiOutSetVolume(UINT uDeviceID, DWORD dwVolume);
+UINT WINAPI midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI midiOutOpen(HMIDIOUT FAR* lphMidiOut, UINT uDeviceID,
+ DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
+UINT WINAPI midiOutClose(HMIDIOUT hMidiOut);
+UINT WINAPI midiOutPrepareHeader(HMIDIOUT hMidiOut,
+ MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+UINT WINAPI midiOutUnprepareHeader(HMIDIOUT hMidiOut,
+ MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+UINT WINAPI midiOutShortMsg(HMIDIOUT hMidiOut, DWORD dwMsg);
+UINT WINAPI midiOutLongMsg(HMIDIOUT hMidiOut,
+ MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+UINT WINAPI midiOutReset(HMIDIOUT hMidiOut);
+UINT WINAPI midiOutCachePatches(HMIDIOUT hMidiOut,
+ UINT uBank, WORD FAR* lpwPatchArray, UINT uFlags);
+UINT WINAPI midiOutCacheDrumPatches(HMIDIOUT hMidiOut,
+ UINT uPatch, WORD FAR* lpwKeyArray, UINT uFlags);
+UINT WINAPI midiOutGetID(HMIDIOUT hMidiOut, UINT FAR* lpuDeviceID);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+UINT WINAPI midiInGetNumDevs(void);
+UINT WINAPI midiInGetDevCaps(UINT uDeviceID,
+ LPMIDIINCAPS lpCaps, UINT uSize);
+UINT WINAPI midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI midiInOpen(HMIDIIN FAR* lphMidiIn, UINT uDeviceID,
+ DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
+UINT WINAPI midiInClose(HMIDIIN hMidiIn);
+UINT WINAPI midiInPrepareHeader(HMIDIIN hMidiIn,
+ MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+UINT WINAPI midiInUnprepareHeader(HMIDIIN hMidiIn,
+ MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+UINT WINAPI midiInAddBuffer(HMIDIIN hMidiIn,
+ MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+UINT WINAPI midiInStart(HMIDIIN hMidiIn);
+UINT WINAPI midiInStop(HMIDIIN hMidiIn);
+UINT WINAPI midiInReset(HMIDIIN hMidiIn);
+UINT WINAPI midiInGetID(HMIDIIN hMidiIn, UINT FAR* lpuDeviceID);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+#endif /* ifndef MMNOMIDI */
+
+
+#ifndef MMNOAUX
+/****************************************************************************
+
+ Auxiliary audio support
+
+****************************************************************************/
+
+/* device ID for aux device mapper */
+#define AUX_MAPPER (-1)
+
+/* Auxiliary audio device capabilities structure */
+typedef struct auxcaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ UINT wTechnology; /* type of device */
+ DWORD dwSupport; /* functionality supported by driver */
+} AUXCAPS;
+typedef AUXCAPS *PAUXCAPS;
+typedef AUXCAPS NEAR *NPAUXCAPS;
+typedef AUXCAPS FAR *LPAUXCAPS;
+
+/* flags for wTechnology field in AUXCAPS structure */
+#define AUXCAPS_CDAUDIO 1 /* audio from internal CD-ROM drive */
+#define AUXCAPS_AUXIN 2 /* audio from auxiliary input jacks */
+
+/* flags for dwSupport field in AUXCAPS structure */
+#define AUXCAPS_VOLUME 0x0001 /* supports volume control */
+#define AUXCAPS_LRVOLUME 0x0002 /* separate left-right volume control */
+
+/* auxiliary audio function prototypes */
+UINT WINAPI auxGetNumDevs(void);
+UINT WINAPI auxGetDevCaps(UINT uDeviceID, AUXCAPS FAR* lpCaps, UINT uSize);
+UINT WINAPI auxSetVolume(UINT uDeviceID, DWORD dwVolume);
+UINT WINAPI auxGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+#endif /* ifndef MMNOAUX */
+
+
+#ifndef MMNOTIMER
+/****************************************************************************
+
+ Timer support
+
+****************************************************************************/
+
+/* timer error return values */
+#define TIMERR_NOERROR (0) /* no error */
+#define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */
+#define TIMERR_STRUCT (TIMERR_BASE+33) /* time struct size */
+
+/* timer data types */
+typedef void (CALLBACK TIMECALLBACK) (UINT uTimerID, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
+
+typedef TIMECALLBACK FAR *LPTIMECALLBACK;
+
+/* flags for wFlags parameter of timeSetEvent() function */
+#define TIME_ONESHOT 0 /* program timer for single event */
+#define TIME_PERIODIC 1 /* program for continuous periodic event */
+
+/* timer device capabilities data structure */
+typedef struct timecaps_tag {
+ UINT wPeriodMin; /* minimum period supported */
+ UINT wPeriodMax; /* maximum period supported */
+ } TIMECAPS;
+typedef TIMECAPS *PTIMECAPS;
+typedef TIMECAPS NEAR *NPTIMECAPS;
+typedef TIMECAPS FAR *LPTIMECAPS;
+
+/* timer function prototypes */
+UINT WINAPI timeGetSystemTime(MMTIME FAR* lpTime, UINT uSize);
+DWORD WINAPI timeGetTime(void);
+UINT WINAPI timeSetEvent(UINT uDelay, UINT uResolution,
+ LPTIMECALLBACK lpFunction, DWORD dwUser, UINT uFlags);
+UINT WINAPI timeKillEvent(UINT uTimerID);
+UINT WINAPI timeGetDevCaps(TIMECAPS FAR* lpTimeCaps, UINT uSize);
+UINT WINAPI timeBeginPeriod(UINT uPeriod);
+UINT WINAPI timeEndPeriod(UINT uPeriod);
+
+#endif /* ifndef MMNOTIMER */
+
+
+#ifndef MMNOJOY
+/****************************************************************************
+
+ Joystick support
+
+****************************************************************************/
+
+/* joystick error return values */
+#define JOYERR_NOERROR (0) /* no error */
+#define JOYERR_PARMS (JOYERR_BASE+5) /* bad parameters */
+#define JOYERR_NOCANDO (JOYERR_BASE+6) /* request not completed */
+#define JOYERR_UNPLUGGED (JOYERR_BASE+7) /* joystick is unplugged */
+
+/* constants used with JOYINFO structure and MM_JOY* messages */
+#define JOY_BUTTON1 0x0001
+#define JOY_BUTTON2 0x0002
+#define JOY_BUTTON3 0x0004
+#define JOY_BUTTON4 0x0008
+#define JOY_BUTTON1CHG 0x0100
+#define JOY_BUTTON2CHG 0x0200
+#define JOY_BUTTON3CHG 0x0400
+#define JOY_BUTTON4CHG 0x0800
+
+/* joystick ID constants */
+#define JOYSTICKID1 0
+#define JOYSTICKID2 1
+
+/* joystick device capabilities data structure */
+typedef struct joycaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ UINT wXmin; /* minimum x position value */
+ UINT wXmax; /* maximum x position value */
+ UINT wYmin; /* minimum y position value */
+ UINT wYmax; /* maximum y position value */
+ UINT wZmin; /* minimum z position value */
+ UINT wZmax; /* maximum z position value */
+ UINT wNumButtons; /* number of buttons */
+ UINT wPeriodMin; /* minimum message period when captured */
+ UINT wPeriodMax; /* maximum message period when captured */
+ } JOYCAPS;
+typedef JOYCAPS *PJOYCAPS;
+typedef JOYCAPS NEAR *NPJOYCAPS;
+typedef JOYCAPS FAR *LPJOYCAPS;
+
+/* joystick information data structure */
+typedef struct joyinfo_tag {
+ UINT wXpos; /* x position */
+ UINT wYpos; /* y position */
+ UINT wZpos; /* z position */
+ UINT wButtons; /* button states */
+ } JOYINFO;
+typedef JOYINFO *PJOYINFO;
+typedef JOYINFO NEAR *NPJOYINFO;
+typedef JOYINFO FAR *LPJOYINFO;
+
+/* joystick function prototypes */
+UINT WINAPI joyGetDevCaps(UINT uJoyID, JOYCAPS FAR* lpCaps, UINT uSize);
+UINT WINAPI joyGetNumDevs(void);
+UINT WINAPI joyGetPos(UINT uJoyID, JOYINFO FAR* lpInfo);
+UINT WINAPI joyGetThreshold(UINT uJoyID, UINT FAR* lpuThreshold);
+UINT WINAPI joyReleaseCapture(UINT uJoyID);
+UINT WINAPI joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod,
+ BOOL bChanged);
+UINT WINAPI joySetThreshold(UINT uJoyID, UINT uThreshold);
+
+#endif /* ifndef MMNOJOY */
+
+
+#ifndef MMNOMMIO
+/****************************************************************************
+
+ Multimedia File I/O support
+
+****************************************************************************/
+
+/* MMIO error return values */
+#define MMIOERR_BASE 256
+#define MMIOERR_FILENOTFOUND (MMIOERR_BASE + 1) /* file not found */
+#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE + 2) /* out of memory */
+#define MMIOERR_CANNOTOPEN (MMIOERR_BASE + 3) /* cannot open */
+#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE + 4) /* cannot close */
+#define MMIOERR_CANNOTREAD (MMIOERR_BASE + 5) /* cannot read */
+#define MMIOERR_CANNOTWRITE (MMIOERR_BASE + 6) /* cannot write */
+#define MMIOERR_CANNOTSEEK (MMIOERR_BASE + 7) /* cannot seek */
+#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE + 8) /* cannot expand file */
+#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE + 9) /* chunk not found */
+#define MMIOERR_UNBUFFERED (MMIOERR_BASE + 10) /* file is unbuffered */
+
+/* MMIO constants */
+#define CFSEPCHAR '+' /* compound file name separator char. */
+
+/* MMIO data types */
+typedef DWORD FOURCC; /* a four character code */
+typedef char _huge * HPSTR; /* a huge version of LPSTR */
+DECLARE_HANDLE(HMMIO); /* a handle to an open file */
+typedef LRESULT (CALLBACK MMIOPROC)(LPSTR lpmmioinfo, UINT uMessage,
+ LPARAM lParam1, LPARAM lParam2);
+typedef MMIOPROC FAR *LPMMIOPROC;
+
+/* general MMIO information data structure */
+typedef struct _MMIOINFO
+{
+ /* general fields */
+ DWORD dwFlags; /* general status flags */
+ FOURCC fccIOProc; /* pointer to I/O procedure */
+ LPMMIOPROC pIOProc; /* pointer to I/O procedure */
+ UINT wErrorRet; /* place for error to be returned */
+ HTASK htask; /* alternate local task */
+
+ /* fields maintained by MMIO functions during buffered I/O */
+ LONG cchBuffer; /* size of I/O buffer (or 0L) */
+ HPSTR pchBuffer; /* start of I/O buffer (or NULL) */
+ HPSTR pchNext; /* pointer to next byte to read/write */
+ HPSTR pchEndRead; /* pointer to last valid byte to read */
+ HPSTR pchEndWrite; /* pointer to last byte to write */
+ LONG lBufOffset; /* disk offset of start of buffer */
+
+ /* fields maintained by I/O procedure */
+ LONG lDiskOffset; /* disk offset of next read or write */
+ DWORD adwInfo[3]; /* data specific to type of MMIOPROC */
+
+ /* other fields maintained by MMIO */
+ DWORD dwReserved1; /* reserved for MMIO use */
+ DWORD dwReserved2; /* reserved for MMIO use */
+ HMMIO hmmio; /* handle to open file */
+} MMIOINFO;
+typedef MMIOINFO *PMMIOINFO;
+typedef MMIOINFO NEAR *NPMMIOINFO;
+typedef MMIOINFO FAR *LPMMIOINFO;
+
+/* RIFF chunk information data structure */
+typedef struct _MMCKINFO
+{
+ FOURCC ckid; /* chunk ID */
+ DWORD cksize; /* chunk size */
+ FOURCC fccType; /* form type or list type */
+ DWORD dwDataOffset; /* offset of data portion of chunk */
+ DWORD dwFlags; /* flags used by MMIO functions */
+} MMCKINFO;
+typedef MMCKINFO *PMMCKINFO;
+typedef MMCKINFO NEAR *NPMMCKINFO;
+typedef MMCKINFO FAR *LPMMCKINFO;
+
+/* bit field masks */
+#define MMIO_RWMODE 0x00000003 /* open file for reading/writing/both */
+#define MMIO_SHAREMODE 0x00000070 /* file sharing mode number */
+
+/* constants for dwFlags field of MMIOINFO */
+#define MMIO_CREATE 0x00001000 /* create new file (or truncate file) */
+#define MMIO_PARSE 0x00000100 /* parse new file returning path */
+#define MMIO_DELETE 0x00000200 /* create new file (or truncate file) */
+#define MMIO_EXIST 0x00004000 /* checks for existence of file */
+#define MMIO_ALLOCBUF 0x00010000 /* mmioOpen() should allocate a buffer */
+#define MMIO_GETTEMP 0x00020000 /* mmioOpen() should retrieve temp name */
+
+#define MMIO_DIRTY 0x10000000 /* I/O buffer is dirty */
+
+
+/* read/write mode numbers (bit field MMIO_RWMODE) */
+#define MMIO_READ 0x00000000 /* open file for reading only */
+#define MMIO_WRITE 0x00000001 /* open file for writing only */
+#define MMIO_READWRITE 0x00000002 /* open file for reading and writing */
+
+/* share mode numbers (bit field MMIO_SHAREMODE) */
+#define MMIO_COMPAT 0x00000000 /* compatibility mode */
+#define MMIO_EXCLUSIVE 0x00000010 /* exclusive-access mode */
+#define MMIO_DENYWRITE 0x00000020 /* deny writing to other processes */
+#define MMIO_DENYREAD 0x00000030 /* deny reading to other processes */
+#define MMIO_DENYNONE 0x00000040 /* deny nothing to other processes */
+
+/* various MMIO flags */
+#define MMIO_FHOPEN 0x0010 /* mmioClose: keep file handle open */
+#define MMIO_EMPTYBUF 0x0010 /* mmioFlush: empty the I/O buffer */
+#define MMIO_TOUPPER 0x0010 /* mmioStringToFOURCC: to u-case */
+#define MMIO_INSTALLPROC 0x00010000 /* mmioInstallIOProc: install MMIOProc */
+#define MMIO_GLOBALPROC 0x10000000 /* mmioInstallIOProc: install globally */
+#define MMIO_REMOVEPROC 0x00020000 /* mmioInstallIOProc: remove MMIOProc */
+#define MMIO_FINDPROC 0x00040000 /* mmioInstallIOProc: find an MMIOProc */
+#define MMIO_FINDCHUNK 0x0010 /* mmioDescend: find a chunk by ID */
+#define MMIO_FINDRIFF 0x0020 /* mmioDescend: find a LIST chunk */
+#define MMIO_FINDLIST 0x0040 /* mmioDescend: find a RIFF chunk */
+#define MMIO_CREATERIFF 0x0020 /* mmioCreateChunk: make a LIST chunk */
+#define MMIO_CREATELIST 0x0040 /* mmioCreateChunk: make a RIFF chunk */
+
+
+/* message numbers for MMIOPROC I/O procedure functions */
+#define MMIOM_READ MMIO_READ /* read */
+#define MMIOM_WRITE MMIO_WRITE /* write */
+#define MMIOM_SEEK 2 /* seek to a new position in file */
+#define MMIOM_OPEN 3 /* open file */
+#define MMIOM_CLOSE 4 /* close file */
+#define MMIOM_WRITEFLUSH 5 /* write and flush */
+
+#if (WINVER >= 0x030a)
+#define MMIOM_RENAME 6 /* rename specified file */
+#endif /* ifdef WINVER >= 0x030a */
+
+#define MMIOM_USER 0x8000 /* beginning of user-defined messages */
+
+/* standard four character codes */
+#define FOURCC_RIFF mmioFOURCC('R', 'I', 'F', 'F')
+#define FOURCC_LIST mmioFOURCC('L', 'I', 'S', 'T')
+
+/* four character codes used to identify standard built-in I/O procedures */
+#define FOURCC_DOS mmioFOURCC('D', 'O', 'S', ' ')
+#define FOURCC_MEM mmioFOURCC('M', 'E', 'M', ' ')
+
+/* flags for mmioSeek() */
+#ifndef SEEK_SET
+#define SEEK_SET 0 /* seek to an absolute position */
+#define SEEK_CUR 1 /* seek relative to current position */
+#define SEEK_END 2 /* seek relative to end of file */
+#endif /* ifndef SEEK_SET */
+
+/* other constants */
+#define MMIO_DEFAULTBUFFER 8192 /* default buffer size */
+
+/* MMIO macros */
+#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
+ ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \
+ ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
+
+/* MMIO function prototypes */
+FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT uFlags);
+LPMMIOPROC WINAPI mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc,
+ DWORD dwFlags);
+HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo,
+ DWORD dwOpenFlags);
+
+#if (WINVER >= 0x030a)
+UINT WINAPI mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
+ MMIOINFO FAR* lpmmioinfo, DWORD dwRenameFlags);
+#endif /* ifdef WINVER >= 0x030a */
+
+UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags);
+LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch);
+LONG WINAPI mmioWrite(HMMIO hmmio, const char _huge* pch, LONG cch);
+LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin);
+UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags);
+UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags);
+UINT WINAPI mmioSetBuffer(HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer,
+ UINT uFlags);
+UINT WINAPI mmioFlush(HMMIO hmmio, UINT uFlags);
+UINT WINAPI mmioAdvance(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags);
+LRESULT WINAPI mmioSendMessage(HMMIO hmmio, UINT uMessage,
+ LPARAM lParam1, LPARAM lParam2);
+UINT WINAPI mmioDescend(HMMIO hmmio, MMCKINFO FAR* lpck,
+ const MMCKINFO FAR* lpckParent, UINT uFlags);
+UINT WINAPI mmioAscend(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags);
+UINT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags);
+
+#endif /* ifndef MMNOMMIO */
+
+
+#ifndef MMNOMCI
+/****************************************************************************
+
+ MCI support
+
+****************************************************************************/
+
+typedef UINT (CALLBACK *YIELDPROC) (UINT uDeviceID, DWORD dwYieldData);
+
+/* MCI function prototypes */
+DWORD WINAPI mciSendCommand (UINT uDeviceID, UINT uMessage,
+ DWORD dwParam1, DWORD dwParam2);
+DWORD WINAPI mciSendString (LPCSTR lpstrCommand,
+ LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback);
+UINT WINAPI mciGetDeviceID (LPCSTR lpstrName);
+UINT WINAPI mciGetDeviceIDFromElementID (DWORD dwElementID,
+ LPCSTR lpstrType);
+BOOL WINAPI mciGetErrorString (DWORD wError, LPSTR lpstrBuffer,
+ UINT uLength);
+BOOL WINAPI mciSetYieldProc (UINT uDeviceID, YIELDPROC fpYieldProc,
+ DWORD dwYieldData);
+
+#if (WINVER >= 0x030a)
+HTASK WINAPI mciGetCreatorTask(UINT uDeviceID);
+YIELDPROC WINAPI mciGetYieldProc (UINT uDeviceID, DWORD FAR* lpdwYieldData);
+#endif /* ifdef WINVER >= 0x030a */
+
+#if (WINVER < 0x030a)
+BOOL WINAPI mciExecute (LPCSTR lpstrCommand);
+#endif /* ifdef WINVER < 0x030a */
+
+/* MCI error return values */
+#define MCIERR_INVALID_DEVICE_ID (MCIERR_BASE + 1)
+#define MCIERR_UNRECOGNIZED_KEYWORD (MCIERR_BASE + 3)
+#define MCIERR_UNRECOGNIZED_COMMAND (MCIERR_BASE + 5)
+#define MCIERR_HARDWARE (MCIERR_BASE + 6)
+#define MCIERR_INVALID_DEVICE_NAME (MCIERR_BASE + 7)
+#define MCIERR_OUT_OF_MEMORY (MCIERR_BASE + 8)
+#define MCIERR_DEVICE_OPEN (MCIERR_BASE + 9)
+#define MCIERR_CANNOT_LOAD_DRIVER (MCIERR_BASE + 10)
+#define MCIERR_MISSING_COMMAND_STRING (MCIERR_BASE + 11)
+#define MCIERR_PARAM_OVERFLOW (MCIERR_BASE + 12)
+#define MCIERR_MISSING_STRING_ARGUMENT (MCIERR_BASE + 13)
+#define MCIERR_BAD_INTEGER (MCIERR_BASE + 14)
+#define MCIERR_PARSER_INTERNAL (MCIERR_BASE + 15)
+#define MCIERR_DRIVER_INTERNAL (MCIERR_BASE + 16)
+#define MCIERR_MISSING_PARAMETER (MCIERR_BASE + 17)
+#define MCIERR_UNSUPPORTED_FUNCTION (MCIERR_BASE + 18)
+#define MCIERR_FILE_NOT_FOUND (MCIERR_BASE + 19)
+#define MCIERR_DEVICE_NOT_READY (MCIERR_BASE + 20)
+#define MCIERR_INTERNAL (MCIERR_BASE + 21)
+#define MCIERR_DRIVER (MCIERR_BASE + 22)
+#define MCIERR_CANNOT_USE_ALL (MCIERR_BASE + 23)
+#define MCIERR_MULTIPLE (MCIERR_BASE + 24)
+#define MCIERR_EXTENSION_NOT_FOUND (MCIERR_BASE + 25)
+#define MCIERR_OUTOFRANGE (MCIERR_BASE + 26)
+#define MCIERR_FLAGS_NOT_COMPATIBLE (MCIERR_BASE + 28)
+#define MCIERR_FILE_NOT_SAVED (MCIERR_BASE + 30)
+#define MCIERR_DEVICE_TYPE_REQUIRED (MCIERR_BASE + 31)
+#define MCIERR_DEVICE_LOCKED (MCIERR_BASE + 32)
+#define MCIERR_DUPLICATE_ALIAS (MCIERR_BASE + 33)
+#define MCIERR_BAD_CONSTANT (MCIERR_BASE + 34)
+#define MCIERR_MUST_USE_SHAREABLE (MCIERR_BASE + 35)
+#define MCIERR_MISSING_DEVICE_NAME (MCIERR_BASE + 36)
+#define MCIERR_BAD_TIME_FORMAT (MCIERR_BASE + 37)
+#define MCIERR_NO_CLOSING_QUOTE (MCIERR_BASE + 38)
+#define MCIERR_DUPLICATE_FLAGS (MCIERR_BASE + 39)
+#define MCIERR_INVALID_FILE (MCIERR_BASE + 40)
+#define MCIERR_NULL_PARAMETER_BLOCK (MCIERR_BASE + 41)
+#define MCIERR_UNNAMED_RESOURCE (MCIERR_BASE + 42)
+#define MCIERR_NEW_REQUIRES_ALIAS (MCIERR_BASE + 43)
+#define MCIERR_NOTIFY_ON_AUTO_OPEN (MCIERR_BASE + 44)
+#define MCIERR_NO_ELEMENT_ALLOWED (MCIERR_BASE + 45)
+#define MCIERR_NONAPPLICABLE_FUNCTION (MCIERR_BASE + 46)
+#define MCIERR_ILLEGAL_FOR_AUTO_OPEN (MCIERR_BASE + 47)
+#define MCIERR_FILENAME_REQUIRED (MCIERR_BASE + 48)
+#define MCIERR_EXTRA_CHARACTERS (MCIERR_BASE + 49)
+#define MCIERR_DEVICE_NOT_INSTALLED (MCIERR_BASE + 50)
+#define MCIERR_GET_CD (MCIERR_BASE + 51)
+#define MCIERR_SET_CD (MCIERR_BASE + 52)
+#define MCIERR_SET_DRIVE (MCIERR_BASE + 53)
+#define MCIERR_DEVICE_LENGTH (MCIERR_BASE + 54)
+#define MCIERR_DEVICE_ORD_LENGTH (MCIERR_BASE + 55)
+#define MCIERR_NO_INTEGER (MCIERR_BASE + 56)
+
+#define MCIERR_WAVE_OUTPUTSINUSE (MCIERR_BASE + 64)
+#define MCIERR_WAVE_SETOUTPUTINUSE (MCIERR_BASE + 65)
+#define MCIERR_WAVE_INPUTSINUSE (MCIERR_BASE + 66)
+#define MCIERR_WAVE_SETINPUTINUSE (MCIERR_BASE + 67)
+#define MCIERR_WAVE_OUTPUTUNSPECIFIED (MCIERR_BASE + 68)
+#define MCIERR_WAVE_INPUTUNSPECIFIED (MCIERR_BASE + 69)
+#define MCIERR_WAVE_OUTPUTSUNSUITABLE (MCIERR_BASE + 70)
+#define MCIERR_WAVE_SETOUTPUTUNSUITABLE (MCIERR_BASE + 71)
+#define MCIERR_WAVE_INPUTSUNSUITABLE (MCIERR_BASE + 72)
+#define MCIERR_WAVE_SETINPUTUNSUITABLE (MCIERR_BASE + 73)
+
+#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80)
+#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81)
+#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82)
+#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83)
+#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84)
+#define MCIERR_SEQ_TIMER (MCIERR_BASE + 85)
+#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86)
+#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87)
+
+#define MCIERR_NO_WINDOW (MCIERR_BASE + 90)
+#define MCIERR_CREATEWINDOW (MCIERR_BASE + 91)
+#define MCIERR_FILE_READ (MCIERR_BASE + 92)
+#define MCIERR_FILE_WRITE (MCIERR_BASE + 93)
+
+/* all custom device driver errors must be >= than this value */
+#define MCIERR_CUSTOM_DRIVER_BASE (MCIERR_BASE + 256)
+
+/* MCI command message identifiers */
+#define MCI_OPEN 0x0803
+#define MCI_CLOSE 0x0804
+#define MCI_ESCAPE 0x0805
+#define MCI_PLAY 0x0806
+#define MCI_SEEK 0x0807
+#define MCI_STOP 0x0808
+#define MCI_PAUSE 0x0809
+#define MCI_INFO 0x080A
+#define MCI_GETDEVCAPS 0x080B
+#define MCI_SPIN 0x080C
+#define MCI_SET 0x080D
+#define MCI_STEP 0x080E
+#define MCI_RECORD 0x080F
+#define MCI_SYSINFO 0x0810
+#define MCI_BREAK 0x0811
+#define MCI_SOUND 0x0812
+#define MCI_SAVE 0x0813
+#define MCI_STATUS 0x0814
+#define MCI_CUE 0x0830
+#define MCI_REALIZE 0x0840
+#define MCI_WINDOW 0x0841
+#define MCI_PUT 0x0842
+#define MCI_WHERE 0x0843
+#define MCI_FREEZE 0x0844
+#define MCI_UNFREEZE 0x0845
+#define MCI_LOAD 0x0850
+#define MCI_CUT 0x0851
+#define MCI_COPY 0x0852
+#define MCI_PASTE 0x0853
+#define MCI_UPDATE 0x0854
+#define MCI_RESUME 0x0855
+#define MCI_DELETE 0x0856
+
+/* all custom MCI command messages must be >= than this value */
+#define MCI_USER_MESSAGES (0x400 + DRV_MCI_FIRST)
+
+
+/* device ID for "all devices" */
+#define MCI_ALL_DEVICE_ID 0xFFFF
+
+/* constants for predefined MCI device types */
+#define MCI_DEVTYPE_VCR (MCI_STRING_OFFSET + 1)
+#define MCI_DEVTYPE_VIDEODISC (MCI_STRING_OFFSET + 2)
+#define MCI_DEVTYPE_OVERLAY (MCI_STRING_OFFSET + 3)
+#define MCI_DEVTYPE_CD_AUDIO (MCI_STRING_OFFSET + 4)
+#define MCI_DEVTYPE_DAT (MCI_STRING_OFFSET + 5)
+#define MCI_DEVTYPE_SCANNER (MCI_STRING_OFFSET + 6)
+#define MCI_DEVTYPE_ANIMATION (MCI_STRING_OFFSET + 7)
+#define MCI_DEVTYPE_DIGITAL_VIDEO (MCI_STRING_OFFSET + 8)
+#define MCI_DEVTYPE_OTHER (MCI_STRING_OFFSET + 9)
+#define MCI_DEVTYPE_WAVEFORM_AUDIO (MCI_STRING_OFFSET + 10)
+#define MCI_DEVTYPE_SEQUENCER (MCI_STRING_OFFSET + 11)
+
+#define MCI_DEVTYPE_FIRST MCI_DEVTYPE_VCR
+#define MCI_DEVTYPE_LAST MCI_DEVTYPE_SEQUENCER
+
+/* return values for 'status mode' command */
+#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET + 12)
+#define MCI_MODE_STOP (MCI_STRING_OFFSET + 13)
+#define MCI_MODE_PLAY (MCI_STRING_OFFSET + 14)
+#define MCI_MODE_RECORD (MCI_STRING_OFFSET + 15)
+#define MCI_MODE_SEEK (MCI_STRING_OFFSET + 16)
+#define MCI_MODE_PAUSE (MCI_STRING_OFFSET + 17)
+#define MCI_MODE_OPEN (MCI_STRING_OFFSET + 18)
+
+/* constants used in 'set time format' and 'status time format' commands */
+#define MCI_FORMAT_MILLISECONDS 0
+#define MCI_FORMAT_HMS 1
+#define MCI_FORMAT_MSF 2
+#define MCI_FORMAT_FRAMES 3
+#define MCI_FORMAT_SMPTE_24 4
+#define MCI_FORMAT_SMPTE_25 5
+#define MCI_FORMAT_SMPTE_30 6
+#define MCI_FORMAT_SMPTE_30DROP 7
+#define MCI_FORMAT_BYTES 8
+#define MCI_FORMAT_SAMPLES 9
+#define MCI_FORMAT_TMSF 10
+
+/* MCI time format conversion macros */
+#define MCI_MSF_MINUTE(msf) ((BYTE)(msf))
+#define MCI_MSF_SECOND(msf) ((BYTE)(((WORD)(msf)) >> 8))
+#define MCI_MSF_FRAME(msf) ((BYTE)((msf)>>16))
+
+#define MCI_MAKE_MSF(m, s, f) ((DWORD)(((BYTE)(m) | \
+ ((WORD)(s)<<8)) | \
+ (((DWORD)(BYTE)(f))<<16)))
+
+#define MCI_TMSF_TRACK(tmsf) ((BYTE)(tmsf))
+#define MCI_TMSF_MINUTE(tmsf) ((BYTE)(((WORD)(tmsf)) >> 8))
+#define MCI_TMSF_SECOND(tmsf) ((BYTE)((tmsf)>>16))
+#define MCI_TMSF_FRAME(tmsf) ((BYTE)((tmsf)>>24))
+
+#define MCI_MAKE_TMSF(t, m, s, f) ((DWORD)(((BYTE)(t) | \
+ ((WORD)(m)<<8)) | \
+ (((DWORD)(BYTE)(s) | \
+ ((WORD)(f)<<8))<<16)))
+
+#define MCI_HMS_HOUR(hms) ((BYTE)(hms))
+#define MCI_HMS_MINUTE(hms) ((BYTE)(((WORD)(hms)) >> 8))
+#define MCI_HMS_SECOND(hms) ((BYTE)((hms)>>16))
+
+#define MCI_MAKE_HMS(h, m, s) ((DWORD)(((BYTE)(h) | \
+ ((WORD)(m)<<8)) | \
+ (((DWORD)(BYTE)(s))<<16)))
+
+
+/* flags for wParam of MM_MCINOTIFY message */
+#define MCI_NOTIFY_SUCCESSFUL 0x0001
+#define MCI_NOTIFY_SUPERSEDED 0x0002
+#define MCI_NOTIFY_ABORTED 0x0004
+#define MCI_NOTIFY_FAILURE 0x0008
+
+
+/* common flags for dwFlags parameter of MCI command messages */
+#define MCI_NOTIFY 0x00000001L
+#define MCI_WAIT 0x00000002L
+#define MCI_FROM 0x00000004L
+#define MCI_TO 0x00000008L
+#define MCI_TRACK 0x00000010L
+
+/* flags for dwFlags parameter of MCI_OPEN command message */
+#define MCI_OPEN_SHAREABLE 0x00000100L
+#define MCI_OPEN_ELEMENT 0x00000200L
+#define MCI_OPEN_ALIAS 0x00000400L
+#define MCI_OPEN_ELEMENT_ID 0x00000800L
+#define MCI_OPEN_TYPE_ID 0x00001000L
+#define MCI_OPEN_TYPE 0x00002000L
+
+/* flags for dwFlags parameter of MCI_SEEK command message */
+#define MCI_SEEK_TO_START 0x00000100L
+#define MCI_SEEK_TO_END 0x00000200L
+
+/* flags for dwFlags parameter of MCI_STATUS command message */
+#define MCI_STATUS_ITEM 0x00000100L
+#define MCI_STATUS_START 0x00000200L
+
+/* flags for dwItem field of the MCI_STATUS_PARMS parameter block */
+#define MCI_STATUS_LENGTH 0x00000001L
+#define MCI_STATUS_POSITION 0x00000002L
+#define MCI_STATUS_NUMBER_OF_TRACKS 0x00000003L
+#define MCI_STATUS_MODE 0x00000004L
+#define MCI_STATUS_MEDIA_PRESENT 0x00000005L
+#define MCI_STATUS_TIME_FORMAT 0x00000006L
+#define MCI_STATUS_READY 0x00000007L
+#define MCI_STATUS_CURRENT_TRACK 0x00000008L
+
+/* flags for dwFlags parameter of MCI_INFO command message */
+#define MCI_INFO_PRODUCT 0x00000100L
+#define MCI_INFO_FILE 0x00000200L
+
+/* flags for dwFlags parameter of MCI_GETDEVCAPS command message */
+#define MCI_GETDEVCAPS_ITEM 0x00000100L
+
+/* flags for dwItem field of the MCI_GETDEVCAPS_PARMS parameter block */
+#define MCI_GETDEVCAPS_CAN_RECORD 0x00000001L
+#define MCI_GETDEVCAPS_HAS_AUDIO 0x00000002L
+#define MCI_GETDEVCAPS_HAS_VIDEO 0x00000003L
+#define MCI_GETDEVCAPS_DEVICE_TYPE 0x00000004L
+#define MCI_GETDEVCAPS_USES_FILES 0x00000005L
+#define MCI_GETDEVCAPS_COMPOUND_DEVICE 0x00000006L
+#define MCI_GETDEVCAPS_CAN_EJECT 0x00000007L
+#define MCI_GETDEVCAPS_CAN_PLAY 0x00000008L
+#define MCI_GETDEVCAPS_CAN_SAVE 0x00000009L
+
+/* flags for dwFlags parameter of MCI_SYSINFO command message */
+#define MCI_SYSINFO_QUANTITY 0x00000100L
+#define MCI_SYSINFO_OPEN 0x00000200L
+#define MCI_SYSINFO_NAME 0x00000400L
+#define MCI_SYSINFO_INSTALLNAME 0x00000800L
+
+/* flags for dwFlags parameter of MCI_SET command message */
+#define MCI_SET_DOOR_OPEN 0x00000100L
+#define MCI_SET_DOOR_CLOSED 0x00000200L
+#define MCI_SET_TIME_FORMAT 0x00000400L
+#define MCI_SET_AUDIO 0x00000800L
+#define MCI_SET_VIDEO 0x00001000L
+#define MCI_SET_ON 0x00002000L
+#define MCI_SET_OFF 0x00004000L
+
+/* flags for dwAudio field of MCI_SET_PARMS or MCI_SEQ_SET_PARMS */
+#define MCI_SET_AUDIO_ALL 0x00000000L
+#define MCI_SET_AUDIO_LEFT 0x00000001L
+#define MCI_SET_AUDIO_RIGHT 0x00000002L
+
+/* flags for dwFlags parameter of MCI_BREAK command message */
+#define MCI_BREAK_KEY 0x00000100L
+#define MCI_BREAK_HWND 0x00000200L
+#define MCI_BREAK_OFF 0x00000400L
+
+/* flags for dwFlags parameter of MCI_RECORD command message */
+#define MCI_RECORD_INSERT 0x00000100L
+#define MCI_RECORD_OVERWRITE 0x00000200L
+
+/* flags for dwFlags parameter of MCI_SOUND command message */
+#define MCI_SOUND_NAME 0x00000100L
+
+/* flags for dwFlags parameter of MCI_SAVE command message */
+#define MCI_SAVE_FILE 0x00000100L
+
+/* flags for dwFlags parameter of MCI_LOAD command message */
+#define MCI_LOAD_FILE 0x00000100L
+
+/* generic parameter block for MCI command messages with no special parameters */
+typedef struct tagMCI_GENERIC_PARMS {
+ DWORD dwCallback;
+} MCI_GENERIC_PARMS;
+typedef MCI_GENERIC_PARMS FAR *LPMCI_GENERIC_PARMS;
+
+/* parameter block for MCI_OPEN command message */
+typedef struct tagMCI_OPEN_PARMS {
+ DWORD dwCallback;
+ UINT wDeviceID;
+ UINT wReserved0;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+} MCI_OPEN_PARMS;
+typedef MCI_OPEN_PARMS FAR *LPMCI_OPEN_PARMS;
+
+/* parameter block for MCI_PLAY command message */
+typedef struct tagMCI_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_PLAY_PARMS;
+typedef MCI_PLAY_PARMS FAR *LPMCI_PLAY_PARMS;
+
+/* parameter block for MCI_SEEK command message */
+typedef struct tagMCI_SEEK_PARMS {
+ DWORD dwCallback;
+ DWORD dwTo;
+} MCI_SEEK_PARMS;
+typedef MCI_SEEK_PARMS FAR *LPMCI_SEEK_PARMS;
+
+/* parameter block for MCI_STATUS command message */
+typedef struct tagMCI_STATUS_PARMS {
+ DWORD dwCallback;
+ DWORD dwReturn;
+ DWORD dwItem;
+ DWORD dwTrack;
+} MCI_STATUS_PARMS;
+typedef MCI_STATUS_PARMS FAR * LPMCI_STATUS_PARMS;
+
+/* parameter block for MCI_INFO command message */
+typedef struct tagMCI_INFO_PARMS {
+ DWORD dwCallback;
+ LPSTR lpstrReturn;
+ DWORD dwRetSize;
+} MCI_INFO_PARMS;
+typedef MCI_INFO_PARMS FAR * LPMCI_INFO_PARMS;
+
+/* parameter block for MCI_GETDEVCAPS command message */
+typedef struct tagMCI_GETDEVCAPS_PARMS {
+ DWORD dwCallback;
+ DWORD dwReturn;
+ DWORD dwItem;
+} MCI_GETDEVCAPS_PARMS;
+typedef MCI_GETDEVCAPS_PARMS FAR * LPMCI_GETDEVCAPS_PARMS;
+
+/* parameter block for MCI_SYSINFO command message */
+typedef struct tagMCI_SYSINFO_PARMS {
+ DWORD dwCallback;
+ LPSTR lpstrReturn;
+ DWORD dwRetSize;
+ DWORD dwNumber;
+ UINT wDeviceType;
+ UINT wReserved0;
+} MCI_SYSINFO_PARMS;
+typedef MCI_SYSINFO_PARMS FAR * LPMCI_SYSINFO_PARMS;
+
+/* parameter block for MCI_SET command message */
+typedef struct tagMCI_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+} MCI_SET_PARMS;
+typedef MCI_SET_PARMS FAR *LPMCI_SET_PARMS;
+
+/* parameter block for MCI_BREAK command message */
+typedef struct tagMCI_BREAK_PARMS {
+ DWORD dwCallback;
+ int nVirtKey;
+ UINT wReserved0;
+ HWND hwndBreak;
+ UINT wReserved1;
+} MCI_BREAK_PARMS;
+typedef MCI_BREAK_PARMS FAR * LPMCI_BREAK_PARMS;
+
+/* parameter block for MCI_SOUND command message */
+typedef struct tagMCI_SOUND_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpstrSoundName;
+} MCI_SOUND_PARMS;
+typedef MCI_SOUND_PARMS FAR * LPMCI_SOUND_PARMS;
+
+/* parameter block for MCI_SAVE command message */
+typedef struct tagMCI_SAVE_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+} MCI_SAVE_PARMS;
+typedef MCI_SAVE_PARMS FAR * LPMCI_SAVE_PARMS;
+
+/* parameter block for MCI_LOAD command message */
+typedef struct tagMCI_LOAD_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+} MCI_LOAD_PARMS;
+typedef MCI_LOAD_PARMS FAR * LPMCI_LOAD_PARMS;
+
+/* parameter block for MCI_RECORD command message */
+typedef struct tagMCI_RECORD_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_RECORD_PARMS;
+typedef MCI_RECORD_PARMS FAR *LPMCI_RECORD_PARMS;
+
+
+/* MCI extensions for videodisc devices */
+
+/* flag for dwReturn field of MCI_STATUS_PARMS */
+/* MCI_STATUS command, (dwItem == MCI_STATUS_MODE) */
+#define MCI_VD_MODE_PARK (MCI_VD_OFFSET + 1)
+
+/* flag for dwReturn field of MCI_STATUS_PARMS */
+/* MCI_STATUS command, (dwItem == MCI_VD_STATUS_MEDIA_TYPE) */
+#define MCI_VD_MEDIA_CLV (MCI_VD_OFFSET + 2)
+#define MCI_VD_MEDIA_CAV (MCI_VD_OFFSET + 3)
+#define MCI_VD_MEDIA_OTHER (MCI_VD_OFFSET + 4)
+
+#define MCI_VD_FORMAT_TRACK 0x4001
+
+/* flags for dwFlags parameter of MCI_PLAY command message */
+#define MCI_VD_PLAY_REVERSE 0x00010000L
+#define MCI_VD_PLAY_FAST 0x00020000L
+#define MCI_VD_PLAY_SPEED 0x00040000L
+#define MCI_VD_PLAY_SCAN 0x00080000L
+#define MCI_VD_PLAY_SLOW 0x00100000L
+
+/* flag for dwFlags parameter of MCI_SEEK command message */
+#define MCI_VD_SEEK_REVERSE 0x00010000L
+
+/* flags for dwItem field of MCI_STATUS_PARMS parameter block */
+#define MCI_VD_STATUS_SPEED 0x00004002L
+#define MCI_VD_STATUS_FORWARD 0x00004003L
+#define MCI_VD_STATUS_MEDIA_TYPE 0x00004004L
+#define MCI_VD_STATUS_SIDE 0x00004005L
+#define MCI_VD_STATUS_DISC_SIZE 0x00004006L
+
+/* flags for dwFlags parameter of MCI_GETDEVCAPS command message */
+#define MCI_VD_GETDEVCAPS_CLV 0x00010000L
+#define MCI_VD_GETDEVCAPS_CAV 0x00020000L
+
+#define MCI_VD_SPIN_UP 0x00010000L
+#define MCI_VD_SPIN_DOWN 0x00020000L
+
+/* flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block */
+#define MCI_VD_GETDEVCAPS_CAN_REVERSE 0x00004002L
+#define MCI_VD_GETDEVCAPS_FAST_RATE 0x00004003L
+#define MCI_VD_GETDEVCAPS_SLOW_RATE 0x00004004L
+#define MCI_VD_GETDEVCAPS_NORMAL_RATE 0x00004005L
+
+/* flags for the dwFlags parameter of MCI_STEP command message */
+#define MCI_VD_STEP_FRAMES 0x00010000L
+#define MCI_VD_STEP_REVERSE 0x00020000L
+
+/* flag for the MCI_ESCAPE command message */
+#define MCI_VD_ESCAPE_STRING 0x00000100L
+
+/* parameter block for MCI_PLAY command message */
+typedef struct tagMCI_VD_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+ DWORD dwSpeed;
+ } MCI_VD_PLAY_PARMS;
+typedef MCI_VD_PLAY_PARMS FAR *LPMCI_VD_PLAY_PARMS;
+
+/* parameter block for MCI_STEP command message */
+typedef struct tagMCI_VD_STEP_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrames;
+} MCI_VD_STEP_PARMS;
+typedef MCI_VD_STEP_PARMS FAR *LPMCI_VD_STEP_PARMS;
+
+/* parameter block for MCI_ESCAPE command message */
+typedef struct tagMCI_VD_ESCAPE_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpstrCommand;
+} MCI_VD_ESCAPE_PARMS;
+typedef MCI_VD_ESCAPE_PARMS FAR *LPMCI_VD_ESCAPE_PARMS;
+
+
+/* MCI extensions for waveform audio devices */
+
+/* flags for the dwFlags parameter of MCI_OPEN command message */
+#define MCI_WAVE_OPEN_BUFFER 0x00010000L
+
+/* flags for the dwFlags parameter of MCI_SET command message */
+#define MCI_WAVE_SET_FORMATTAG 0x00010000L
+#define MCI_WAVE_SET_CHANNELS 0x00020000L
+#define MCI_WAVE_SET_SAMPLESPERSEC 0x00040000L
+#define MCI_WAVE_SET_AVGBYTESPERSEC 0x00080000L
+#define MCI_WAVE_SET_BLOCKALIGN 0x00100000L
+#define MCI_WAVE_SET_BITSPERSAMPLE 0x00200000L
+
+/* flags for the dwFlags parameter of MCI_STATUS, MCI_SET command messages */
+#define MCI_WAVE_INPUT 0x00400000L
+#define MCI_WAVE_OUTPUT 0x00800000L
+
+/* flags for the dwItem field of MCI_STATUS_PARMS parameter block */
+#define MCI_WAVE_STATUS_FORMATTAG 0x00004001L
+#define MCI_WAVE_STATUS_CHANNELS 0x00004002L
+#define MCI_WAVE_STATUS_SAMPLESPERSEC 0x00004003L
+#define MCI_WAVE_STATUS_AVGBYTESPERSEC 0x00004004L
+#define MCI_WAVE_STATUS_BLOCKALIGN 0x00004005L
+#define MCI_WAVE_STATUS_BITSPERSAMPLE 0x00004006L
+#define MCI_WAVE_STATUS_LEVEL 0x00004007L
+
+/* flags for the dwFlags parameter of MCI_SET command message */
+#define MCI_WAVE_SET_ANYINPUT 0x04000000L
+#define MCI_WAVE_SET_ANYOUTPUT 0x08000000L
+
+/* flags for the dwFlags parameter of MCI_GETDEVCAPS command message */
+#define MCI_WAVE_GETDEVCAPS_INPUTS 0x00004001L
+#define MCI_WAVE_GETDEVCAPS_OUTPUTS 0x00004002L
+
+/* parameter block for MCI_OPEN command message */
+typedef struct tagMCI_WAVE_OPEN_PARMS {
+ DWORD dwCallback;
+ UINT wDeviceID;
+ UINT wReserved0;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwBufferSeconds;
+} MCI_WAVE_OPEN_PARMS;
+typedef MCI_WAVE_OPEN_PARMS FAR *LPMCI_WAVE_OPEN_PARMS;
+
+/* parameter block for MCI_DELETE command message */
+typedef struct tagMCI_WAVE_DELETE_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_WAVE_DELETE_PARMS;
+typedef MCI_WAVE_DELETE_PARMS FAR *LPMCI_WAVE_DELETE_PARMS;
+
+/* parameter block for MCI_SET command message */
+typedef struct tagMCI_WAVE_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+ UINT wInput;
+ UINT wReserved0;
+ UINT wOutput;
+ UINT wReserved1;
+ UINT wFormatTag;
+ UINT wReserved2;
+ UINT nChannels;
+ UINT wReserved3;
+ DWORD nSamplesPerSec;
+ DWORD nAvgBytesPerSec;
+ UINT nBlockAlign;
+ UINT wReserved4;
+ UINT wBitsPerSample;
+ UINT wReserved5;
+} MCI_WAVE_SET_PARMS;
+typedef MCI_WAVE_SET_PARMS FAR * LPMCI_WAVE_SET_PARMS;
+
+
+/* MCI extensions for MIDI sequencer devices */
+
+/* flags for the dwReturn field of MCI_STATUS_PARMS parameter block */
+/* MCI_STATUS command, (dwItem == MCI_SEQ_STATUS_DIVTYPE) */
+#define MCI_SEQ_DIV_PPQN (0 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_24 (1 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_25 (2 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_30DROP (3 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_30 (4 + MCI_SEQ_OFFSET)
+
+/* flags for the dwMaster field of MCI_SEQ_SET_PARMS parameter block */
+/* MCI_SET command, (dwFlags == MCI_SEQ_SET_MASTER) */
+#define MCI_SEQ_FORMAT_SONGPTR 0x4001
+#define MCI_SEQ_FILE 0x4002
+#define MCI_SEQ_MIDI 0x4003
+#define MCI_SEQ_SMPTE 0x4004
+#define MCI_SEQ_NONE 65533
+
+/* flags for the dwItem field of MCI_STATUS_PARMS parameter block */
+#define MCI_SEQ_STATUS_TEMPO 0x00004002L
+#define MCI_SEQ_STATUS_PORT 0x00004003L
+#define MCI_SEQ_STATUS_SLAVE 0x00004007L
+#define MCI_SEQ_STATUS_MASTER 0x00004008L
+#define MCI_SEQ_STATUS_OFFSET 0x00004009L
+#define MCI_SEQ_STATUS_DIVTYPE 0x0000400AL
+
+/* flags for the dwFlags parameter of MCI_SET command message */
+#define MCI_SEQ_SET_TEMPO 0x00010000L
+#define MCI_SEQ_SET_PORT 0x00020000L
+#define MCI_SEQ_SET_SLAVE 0x00040000L
+#define MCI_SEQ_SET_MASTER 0x00080000L
+#define MCI_SEQ_SET_OFFSET 0x01000000L
+
+/* parameter block for MCI_SET command message */
+typedef struct tagMCI_SEQ_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+ DWORD dwTempo;
+ DWORD dwPort;
+ DWORD dwSlave;
+ DWORD dwMaster;
+ DWORD dwOffset;
+} MCI_SEQ_SET_PARMS;
+typedef MCI_SEQ_SET_PARMS FAR * LPMCI_SEQ_SET_PARMS;
+
+
+/* MCI extensions for animation devices */
+
+/* flags for dwFlags parameter of MCI_OPEN command message */
+#define MCI_ANIM_OPEN_WS 0x00010000L
+#define MCI_ANIM_OPEN_PARENT 0x00020000L
+#define MCI_ANIM_OPEN_NOSTATIC 0x00040000L
+
+/* flags for dwFlags parameter of MCI_PLAY command message */
+#define MCI_ANIM_PLAY_SPEED 0x00010000L
+#define MCI_ANIM_PLAY_REVERSE 0x00020000L
+#define MCI_ANIM_PLAY_FAST 0x00040000L
+#define MCI_ANIM_PLAY_SLOW 0x00080000L
+#define MCI_ANIM_PLAY_SCAN 0x00100000L
+
+/* flags for dwFlags parameter of MCI_STEP command message */
+#define MCI_ANIM_STEP_REVERSE 0x00010000L
+#define MCI_ANIM_STEP_FRAMES 0x00020000L
+
+/* flags for dwItem field of MCI_STATUS_PARMS parameter block */
+#define MCI_ANIM_STATUS_SPEED 0x00004001L
+#define MCI_ANIM_STATUS_FORWARD 0x00004002L
+#define MCI_ANIM_STATUS_HWND 0x00004003L
+#define MCI_ANIM_STATUS_HPAL 0x00004004L
+#define MCI_ANIM_STATUS_STRETCH 0x00004005L
+
+/* flags for the dwFlags parameter of MCI_INFO command message */
+#define MCI_ANIM_INFO_TEXT 0x00010000L
+
+/* flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block */
+#define MCI_ANIM_GETDEVCAPS_CAN_REVERSE 0x00004001L
+#define MCI_ANIM_GETDEVCAPS_FAST_RATE 0x00004002L
+#define MCI_ANIM_GETDEVCAPS_SLOW_RATE 0x00004003L
+#define MCI_ANIM_GETDEVCAPS_NORMAL_RATE 0x00004004L
+#define MCI_ANIM_GETDEVCAPS_PALETTES 0x00004006L
+#define MCI_ANIM_GETDEVCAPS_CAN_STRETCH 0x00004007L
+#define MCI_ANIM_GETDEVCAPS_MAX_WINDOWS 0x00004008L
+
+/* flags for the MCI_REALIZE command message */
+#define MCI_ANIM_REALIZE_NORM 0x00010000L
+#define MCI_ANIM_REALIZE_BKGD 0x00020000L
+
+/* flags for dwFlags parameter of MCI_WINDOW command message */
+#define MCI_ANIM_WINDOW_HWND 0x00010000L
+#define MCI_ANIM_WINDOW_STATE 0x00040000L
+#define MCI_ANIM_WINDOW_TEXT 0x00080000L
+#define MCI_ANIM_WINDOW_ENABLE_STRETCH 0x00100000L
+#define MCI_ANIM_WINDOW_DISABLE_STRETCH 0x00200000L
+
+/* flags for hWnd field of MCI_ANIM_WINDOW_PARMS parameter block */
+/* MCI_WINDOW command message, (dwFlags == MCI_ANIM_WINDOW_HWND) */
+#define MCI_ANIM_WINDOW_DEFAULT 0x00000000L
+
+/* flags for dwFlags parameter of MCI_PUT command message */
+#define MCI_ANIM_RECT 0x00010000L
+#define MCI_ANIM_PUT_SOURCE 0x00020000L
+#define MCI_ANIM_PUT_DESTINATION 0x00040000L
+
+/* flags for dwFlags parameter of MCI_WHERE command message */
+#define MCI_ANIM_WHERE_SOURCE 0x00020000L
+#define MCI_ANIM_WHERE_DESTINATION 0x00040000L
+
+/* flags for dwFlags parameter of MCI_UPDATE command message */
+#define MCI_ANIM_UPDATE_HDC 0x00020000L
+
+/* parameter block for MCI_OPEN command message */
+typedef struct tagMCI_ANIM_OPEN_PARMS {
+ DWORD dwCallback;
+ UINT wDeviceID;
+ UINT wReserved0;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwStyle;
+ HWND hWndParent;
+ UINT wReserved1;
+} MCI_ANIM_OPEN_PARMS;
+typedef MCI_ANIM_OPEN_PARMS FAR *LPMCI_ANIM_OPEN_PARMS;
+
+/* parameter block for MCI_PLAY command message */
+typedef struct tagMCI_ANIM_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+ DWORD dwSpeed;
+} MCI_ANIM_PLAY_PARMS;
+typedef MCI_ANIM_PLAY_PARMS FAR *LPMCI_ANIM_PLAY_PARMS;
+
+/* parameter block for MCI_STEP command message */
+typedef struct tagMCI_ANIM_STEP_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrames;
+} MCI_ANIM_STEP_PARMS;
+typedef MCI_ANIM_STEP_PARMS FAR *LPMCI_ANIM_STEP_PARMS;
+
+/* parameter block for MCI_WINDOW command message */
+typedef struct tagMCI_ANIM_WINDOW_PARMS {
+ DWORD dwCallback;
+ HWND hWnd;
+ UINT wReserved1;
+ UINT nCmdShow;
+ UINT wReserved2;
+ LPCSTR lpstrText;
+} MCI_ANIM_WINDOW_PARMS;
+typedef MCI_ANIM_WINDOW_PARMS FAR * LPMCI_ANIM_WINDOW_PARMS;
+
+/* parameter block for MCI_PUT, MCI_UPDATE, MCI_WHERE command messages */
+typedef struct tagMCI_ANIM_RECT_PARMS {
+ DWORD dwCallback;
+#ifdef MCI_USE_OFFEXT
+ POINT ptOffset;
+ POINT ptExtent;
+#else /* ifdef MCI_USE_OFFEXT */
+ RECT rc;
+#endif /* ifdef MCI_USE_OFFEXT */
+} MCI_ANIM_RECT_PARMS;
+typedef MCI_ANIM_RECT_PARMS FAR * LPMCI_ANIM_RECT_PARMS;
+
+/* parameter block for MCI_UPDATE PARMS */
+typedef struct tagMCI_ANIM_UPDATE_PARMS {
+ DWORD dwCallback;
+ RECT rc;
+ HDC hDC;
+} MCI_ANIM_UPDATE_PARMS;
+typedef MCI_ANIM_UPDATE_PARMS FAR * LPMCI_ANIM_UPDATE_PARMS;
+
+
+/* MCI extensions for video overlay devices */
+
+/* flags for dwFlags parameter of MCI_OPEN command message */
+#define MCI_OVLY_OPEN_WS 0x00010000L
+#define MCI_OVLY_OPEN_PARENT 0x00020000L
+
+/* flags for dwFlags parameter of MCI_STATUS command message */
+#define MCI_OVLY_STATUS_HWND 0x00004001L
+#define MCI_OVLY_STATUS_STRETCH 0x00004002L
+
+/* flags for dwFlags parameter of MCI_INFO command message */
+#define MCI_OVLY_INFO_TEXT 0x00010000L
+
+/* flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block */
+#define MCI_OVLY_GETDEVCAPS_CAN_STRETCH 0x00004001L
+#define MCI_OVLY_GETDEVCAPS_CAN_FREEZE 0x00004002L
+#define MCI_OVLY_GETDEVCAPS_MAX_WINDOWS 0x00004003L
+
+/* flags for dwFlags parameter of MCI_WINDOW command message */
+#define MCI_OVLY_WINDOW_HWND 0x00010000L
+#define MCI_OVLY_WINDOW_STATE 0x00040000L
+#define MCI_OVLY_WINDOW_TEXT 0x00080000L
+#define MCI_OVLY_WINDOW_ENABLE_STRETCH 0x00100000L
+#define MCI_OVLY_WINDOW_DISABLE_STRETCH 0x00200000L
+
+/* flags for hWnd parameter of MCI_OVLY_WINDOW_PARMS parameter block */
+#define MCI_OVLY_WINDOW_DEFAULT 0x00000000L
+
+/* flags for dwFlags parameter of MCI_PUT command message */
+#define MCI_OVLY_RECT 0x00010000L
+#define MCI_OVLY_PUT_SOURCE 0x00020000L
+#define MCI_OVLY_PUT_DESTINATION 0x00040000L
+#define MCI_OVLY_PUT_FRAME 0x00080000L
+#define MCI_OVLY_PUT_VIDEO 0x00100000L
+
+/* flags for dwFlags parameter of MCI_WHERE command message */
+#define MCI_OVLY_WHERE_SOURCE 0x00020000L
+#define MCI_OVLY_WHERE_DESTINATION 0x00040000L
+#define MCI_OVLY_WHERE_FRAME 0x00080000L
+#define MCI_OVLY_WHERE_VIDEO 0x00100000L
+
+/* parameter block for MCI_OPEN command message */
+typedef struct tagMCI_OVLY_OPEN_PARMS {
+ DWORD dwCallback;
+ UINT wDeviceID;
+ UINT wReserved0;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwStyle;
+ HWND hWndParent;
+ UINT wReserved1;
+ } MCI_OVLY_OPEN_PARMS;
+typedef MCI_OVLY_OPEN_PARMS FAR *LPMCI_OVLY_OPEN_PARMS;
+
+/* parameter block for MCI_WINDOW command message */
+typedef struct tagMCI_OVLY_WINDOW_PARMS {
+ DWORD dwCallback;
+ HWND hWnd;
+ UINT wReserved1;
+ UINT nCmdShow;
+ UINT wReserved2;
+ LPCSTR lpstrText;
+} MCI_OVLY_WINDOW_PARMS;
+typedef MCI_OVLY_WINDOW_PARMS FAR * LPMCI_OVLY_WINDOW_PARMS;
+
+/* parameter block for MCI_PUT, MCI_UPDATE, and MCI_WHERE command messages */
+typedef struct tagMCI_OVLY_RECT_PARMS {
+ DWORD dwCallback;
+#ifdef MCI_USE_OFFEXT
+ POINT ptOffset;
+ POINT ptExtent;
+#else /* ifdef MCI_USE_OFFEXT */
+ RECT rc;
+#endif /* ifdef MCI_USE_OFFEXT */
+} MCI_OVLY_RECT_PARMS;
+typedef MCI_OVLY_RECT_PARMS FAR * LPMCI_OVLY_RECT_PARMS;
+
+/* parameter block for MCI_SAVE command message */
+typedef struct tagMCI_OVLY_SAVE_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+ RECT rc;
+} MCI_OVLY_SAVE_PARMS;
+typedef MCI_OVLY_SAVE_PARMS FAR * LPMCI_OVLY_SAVE_PARMS;
+
+/* parameter block for MCI_LOAD command message */
+typedef struct tagMCI_OVLY_LOAD_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+ RECT rc;
+} MCI_OVLY_LOAD_PARMS;
+typedef MCI_OVLY_LOAD_PARMS FAR * LPMCI_OVLY_LOAD_PARMS;
+
+#endif /* ifndef MMNOMCI */
+
+/****************************************************************************
+
+ DISPLAY Driver extensions
+
+****************************************************************************/
+
+#ifndef C1_TRANSPARENT
+ #define CAPS1 94 /* other caps */
+ #define C1_TRANSPARENT 0x0001 /* new raster cap */
+ #define NEWTRANSPARENT 3 /* use with SetBkMode() */
+
+ #define QUERYROPSUPPORT 40 /* use to determine ROP support */
+#endif /* ifndef C1_TRANSPARENT */
+
+/****************************************************************************
+
+ DIB Driver extensions
+
+****************************************************************************/
+
+#define SELECTDIB 41 /* DIB.DRV select dib escape */
+#define DIBINDEX(n) MAKELONG((n),0x10FF)
+
+
+/****************************************************************************
+
+ ScreenSaver support
+
+ The current application will receive a syscommand of SC_SCREENSAVE just
+ before the screen saver is invoked. If the app wishes to prevent a
+ screen save, return non-zero value, otherwise call DefWindowProc().
+
+****************************************************************************/
+
+#ifndef SC_SCREENSAVE
+
+ #define SC_SCREENSAVE 0xF140
+
+#endif /* ifndef SC_SCREENSAVE */
+
+#ifdef __cplusplus
+} /* End of extern "C" { */
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif
+
+#endif /* _INC_MMSYSTEM */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/mmsystem.inc b/private/oleauto/tools/win16/hdos/c800/include/mmsystem.inc
new file mode 100644
index 000000000..7bef08693
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/mmsystem.inc
@@ -0,0 +1,1484 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; MMSYSTEM.INC - Multimedia assembly language structures & constants
+;
+; Copyright (c) 1990-1992, Microsoft Corp. All rights reserved.
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+
+; If defined, the following flags inhibit inclusion
+; of the indicated items:
+;
+; MMNODRV - Installable driver support
+; MMNOSOUND - Sound support
+; MMNOWAVE - Waveform support
+; MMNOMIDI - MIDI support
+; MMNOAUX - Auxiliary audio support
+; MMNOTIMER - Timer support
+; MMNOJOY - Joystick support
+; MMNOMCI - MCI support
+; MMNOMMIO - Multimedia file I/O support
+;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; General constants and data types
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; general constants
+MAXPNAMELEN equ 32 ; max product name length (including NULL)
+MAXERRORLENGTH equ 128 ; max error text length (including NULL)
+
+; MMTIME data structure
+MMTIME struc
+ mmt_wType dw ? ; indicates the contents of the union
+ mmt_TimeUnion dd ? ; union
+MMTIME ends
+
+SMPTE struc
+ smpte_hour db ? ; hours
+ smpte_min db ? ; minutes
+ smpte_sec db ? ; seconds
+ smpte_frame db ? ; frames
+ smpte_fps db ? ; frames per second
+ smpte_reserved db ? ; pad
+SMPTE ends
+
+; types for wType field in MMTIME struct
+TIME_MS equ 0001h ; time in milliseconds
+TIME_SAMPLES equ 0002h ; number of wave samples
+TIME_BYTES equ 0004h ; current byte offset
+TIME_SMPTE equ 0008h ; SMPTE time
+TIME_MIDI equ 0010h ; MIDI time
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Multimedia Extensions Window Messages
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+MM_JOY1MOVE equ 3A0h ; joystick
+MM_JOY2MOVE equ 3A1h
+MM_JOY1ZMOVE equ 3A2h
+MM_JOY2ZMOVE equ 3A3h
+MM_JOY1BUTTONDOWN equ 3B5h
+MM_JOY2BUTTONDOWN equ 3B6h
+MM_JOY1BUTTONUP equ 3B7h
+MM_JOY2BUTTONUP equ 3B8h
+
+MM_MCINOTIFY equ 3B9h ; MCI
+MM_MCISYSTEM_STRING equ 3CAh
+
+MM_WOM_OPEN equ 3BBh ; waveform output
+MM_WOM_CLOSE equ 3BCh
+MM_WOM_DONE equ 3BDh
+
+MM_WIM_OPEN equ 3BEh ; waveform input
+MM_WIM_CLOSE equ 3BFh
+MM_WIM_DATA equ 3C0h
+
+MM_MIM_OPEN equ 3C1h ; MIDI input
+MM_MIM_CLOSE equ 3C2h
+MM_MIM_DATA equ 3C3h
+MM_MIM_LONGDATA equ 3C4h
+MM_MIM_ERROR equ 3C5h
+MM_MIM_LONGERROR equ 3C6h
+
+MM_MOM_OPEN equ 3C7h ; MIDI output
+MM_MOM_CLOSE equ 3C8h
+MM_MOM_DONE equ 3C9h
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; String resource number bases (internal use)
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+MMSYSERR_BASE equ 0
+WAVERR_BASE equ 32
+MIDIERR_BASE equ 64
+TIMERR_BASE equ 96
+JOYERR_BASE equ 160
+MCIERR_BASE equ 256
+
+MCI_STRING_OFFSET equ 512
+MCI_VD_OFFSET equ 1024
+MCI_CD_OFFSET equ 1088
+MCI_WAVE_OFFSET equ 1152
+MCI_SEQ_OFFSET equ 1216
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; General error return values
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; general error return values
+MMSYSERR_NOERROR equ 0 ; no error
+MMSYSERR_ERROR equ (MMSYSERR_BASE + 1) ; unspecified error
+MMSYSERR_BADDEVICEID equ (MMSYSERR_BASE + 2) ; device ID out of range
+MMSYSERR_NOTENABLED equ (MMSYSERR_BASE + 3) ; driver failed enable
+MMSYSERR_ALLOCATED equ (MMSYSERR_BASE + 4) ; device already allocated
+MMSYSERR_INVALHANDLE equ (MMSYSERR_BASE + 5) ; device handle is invalid
+MMSYSERR_NODRIVER equ (MMSYSERR_BASE + 6) ; no device driver present
+MMSYSERR_NOMEM equ (MMSYSERR_BASE + 7) ; memory allocation error
+MMSYSERR_NOTSUPPORTED equ (MMSYSERR_BASE + 8) ; function isn't supported
+MMSYSERR_BADERRNUM equ (MMSYSERR_BASE + 9) ; error value out of range
+MMSYSERR_INVALFLAG equ (MMSYSERR_BASE + 10) ; invalid flags passed
+MMSYSERR_INVALPARAM equ (MMSYSERR_BASE + 11) ; invalid parameter passed
+MMSYSERR_LASTERROR equ (MMSYSERR_BASE + 11) ; last error in range
+
+
+ifndef MMNODRV
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Installable driver support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+DRV_MCI_FIRST equ DRV_RESERVED
+DRV_MCI_LAST equ (DRV_RESERVED + 0FFFh)
+
+endif ;ifndef MMNODRV
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Driver callback support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; flags used with waveOutOpen(), waveInOpen(), midiInOpen(), and
+; midiOutOpen() to specify the type of the dwCallback parameter.
+CALLBACK_TYPEMASK equ 00070000h ; callback type mask
+CALLBACK_NULL equ 00000000h ; no callback
+CALLBACK_WINDOW equ 00010000h ; dwCallback is a HWND
+CALLBACK_TASK equ 00020000h ; dwCallback is a HTASK
+CALLBACK_FUNCTION equ 00030000h ; dwCallback is a FARPROC
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Manufacturer and product IDs
+;
+; Used with wMid and wPid fields in WAVEOUTCAPS, WAVEINCAPS,
+; MIDIOUTCAPS, MIDIINCAPS, AUXCAPS, JOYCAPS structures.
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; manufacturer IDs
+MM_MICROSOFT equ 1 ; Microsoft Corp.
+
+; product IDs
+MM_MIDI_MAPPER equ 1 ; MIDI Mapper
+MM_WAVE_MAPPER equ 2 ; Wave Mapper
+
+MM_SNDBLST_MIDIOUT equ 3 ; Sound Blaster MIDI output port
+MM_SNDBLST_MIDIIN equ 4 ; Sound Blaster MIDI input port
+MM_SNDBLST_SYNTH equ 5 ; Sound Blaster internal synthesizer
+MM_SNDBLST_WAVEOUT equ 6 ; Sound Blaster waveform output
+MM_SNDBLST_WAVEIN equ 7 ; Sound Blaster waveform input
+
+MM_ADLIB equ 9 ; Ad Lib-compatible synthesizer
+
+MM_MPU401_MIDIOUT equ 10 ; MPU401-compatible MIDI output port
+MM_MPU401_MIDIIN equ 11 ; MPU401-compatible MIDI input port
+
+MM_PC_JOYSTICK equ 12 ; Joystick adapter
+
+
+ifndef MMNOSOUND
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Sound support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; flag values for wFlags parameter
+SND_SYNC equ 0000h ; play synchronously (default)
+SND_ASYNC equ 0001h ; play asynchronously
+SND_NODEFAULT equ 0002h ; don't use default sound
+SND_MEMORY equ 0004h ; lpszSoundName points to a memory file
+SND_LOOP equ 0008h ; loop the sound until next sndPlaySound
+SND_NOSTOP equ 0010h ; don't stop any currently playing sound
+
+endif ;ifndef MMNOSOUND
+
+
+ifndef MMNOWAVE
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Waveform audio support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; waveform audio error return values
+WAVERR_BADFORMAT equ (WAVERR_BASE + 0) ; unsupported wave format
+WAVERR_STILLPLAYING equ (WAVERR_BASE + 1) ; still something playing
+WAVERR_UNPREPARED equ (WAVERR_BASE + 2) ; header not prepared
+WAVERR_SYNC equ (WAVERR_BASE + 3) ; device is synchronous
+WAVERR_LASTERROR equ (WAVERR_BASE + 3) ; last error in range
+
+; wave callback messages
+WOM_OPEN equ MM_WOM_OPEN
+WOM_CLOSE equ MM_WOM_CLOSE
+WOM_DONE equ MM_WOM_DONE
+WIM_OPEN equ MM_WIM_OPEN
+WIM_CLOSE equ MM_WIM_CLOSE
+WIM_DATA equ MM_WIM_DATA
+
+; device ID for wave device mapper
+WAVE_MAPPER equ (-1)
+
+; flags for dwFlags parameter in waveOutOpen() and waveInOpen()
+WAVE_FORMAT_QUERY equ 0001h
+WAVE_ALLOWSYNC equ 0002h
+
+; wave data block header
+WAVEHDR struc
+ lpWaveData dd ? ; pointer to locked data buffer
+ dwWaveBufferLength dd ? ; length of data buffer
+ dwWaveBytesRecorded dd ? ; used for input only
+ dwWaveUser dd ? ; for client's use
+ dwWaveFlags dd ? ; assorted flags (see defines)
+ dwWaveLoops dd ? ; loop control counter
+ lpWaveNext dd ? ; reserved for driver
+ Wavereserved dd ? ; reserved for driver
+WAVEHDR ends
+
+; flags for dwFlags field of WAVEHDR
+WHDR_DONE equ 00000001h ; done bit
+WHDR_PREPARED equ 00000002h ; set if this header has been prepared
+WHDR_BEGINLOOP equ 00000004h ; loop start block
+WHDR_ENDLOOP equ 00000008h ; loop end block
+WHDR_INQUEUE equ 00000010h ; reserved for driver
+
+; waveform output device capabilities structure
+WAVEOUTCAPS struc
+ woc_wMid dw ? ; manufacturer ID
+ woc_wPid dw ? ; product ID
+ woc_vDriverVersion dw ? ; version of the driver
+ woc_szPname db MAXPNAMELEN dup (?) ; product name (NULL terminated string)
+ woc_dwFormats dd ? ; formats supported
+ woc_wChannels dw ? ; number of sources supported
+ woc_dwSupport dd ? ; functionality supported by driver
+WAVEOUTCAPS ends
+
+; flags for dwSupport field of WAVEOUTCAPS
+WAVECAPS_PITCH equ 0001h ; supports pitch control
+WAVECAPS_PLAYBACKRATE equ 0002h ; supports playback rate control
+WAVECAPS_VOLUME equ 0004h ; supports volume control
+WAVECAPS_LRVOLUME equ 0008h ; separate left-right volume control
+WAVECAPS_SYNC equ 0010h
+
+; waveform input device capabilities structure
+WAVEINCAPS struc
+ wic_wMid dw ? ; manufacturer ID
+ wic_wPid dw ? ; product ID
+ wic_vDriverVersion dw ? ; version of the driver
+ wic_szPname db MAXPNAMELEN dup (?) ; product name (NULL terminated string)
+ wic_dwFormats dd ? ; formats supported
+ wic_wChannels dw ? ; number of channels supported
+WAVEINCAPS ends
+
+; defines for dwFormat field of WAVEINCAPS and WAVEOUTCAPS
+WAVE_INVALIDFORMAT equ 00000000h ; invalid format
+WAVE_FORMAT_1M08 equ 00000001h ; 11.025 kHz, Mono, 8-bit
+WAVE_FORMAT_1S08 equ 00000002h ; 11.025 kHz, Stereo, 8-bit
+WAVE_FORMAT_1M16 equ 00000004h ; 11.025 kHz, Mono, 16-bit
+WAVE_FORMAT_1S16 equ 00000008h ; 11.025 kHz, Stereo, 16-bit
+WAVE_FORMAT_2M08 equ 00000010h ; 22.05 kHz, Mono, 8-bit
+WAVE_FORMAT_2S08 equ 00000020h ; 22.05 kHz, Stereo, 8-bit
+WAVE_FORMAT_2M16 equ 00000040h ; 22.05 kHz, Mono, 16-bit
+WAVE_FORMAT_2S16 equ 00000080h ; 22.05 kHz, Stereo, 16-bit
+WAVE_FORMAT_4M08 equ 00000100h ; 44.1 kHz, Mono, 8-bit
+WAVE_FORMAT_4S08 equ 00000200h ; 44.1 kHz, Stereo, 8-bit
+WAVE_FORMAT_4M16 equ 00000400h ; 44.1 kHz, Mono, 16-bit
+WAVE_FORMAT_4S16 equ 00000800h ; 44.1 kHz, Stereo, 16-bit
+
+; general waveform format structure (information common to all formats)
+WAVEFORMAT struc
+ wfmt_wFormatTag dw ? ; format type
+ wfmt_nChannels dw ? ; number of channels (i.e. mono, stereo, etc.)
+ wfmt_nSamplesPerSec dd ? ; sample rate
+ wfmt_nAvgBytesPerSec dd ? ; for buffer estimation
+ wfmt_nBlockAlign dw ? ; block size of data
+WAVEFORMAT ends
+
+; flags for wFormatTag field of WAVEFORMAT
+WAVE_FORMAT_PCM equ 1
+
+; specific waveform format structure for PCM data
+PCMWAVEFORMAT struc
+ pcm_wf db (SIZE WAVEFORMAT) dup (?)
+ pcm_wBitsPerSample dw ?
+PCMWAVEFORMAT ends
+
+endif ;ifndef MMNOWAVE
+
+
+ifndef MMNOMIDI
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; MIDI audio support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; MIDI error return values
+MIDIERR_UNPREPARED equ (MIDIERR_BASE + 0) ; header not prepared
+MIDIERR_STILLPLAYING equ (MIDIERR_BASE + 1) ; still something playing
+MIDIERR_NOMAP equ (MIDIERR_BASE + 2) ; no current map
+MIDIERR_NOTREADY equ (MIDIERR_BASE + 3) ; hardware is still busy
+MIDIERR_NODEVICE equ (MIDIERR_BASE + 4) ; port no longer connected
+MIDIERR_INVALIDSETUP equ (MIDIERR_BASE + 5) ; invalid setup
+MIDIERR_LASTERROR equ (MIDIERR_BASE + 5) ; last error in range
+
+; MIDI audio data types
+MIDIPATCHSIZE equ 128
+
+; MIDI callback messages
+MIM_OPEN equ MM_MIM_OPEN
+MIM_CLOSE equ MM_MIM_CLOSE
+MIM_DATA equ MM_MIM_DATA
+MIM_LONGDATA equ MM_MIM_LONGDATA
+MIM_ERROR equ MM_MIM_ERROR
+MIM_LONGERROR equ MM_MIM_LONGERROR
+MOM_OPEN equ MM_MOM_OPEN
+MOM_CLOSE equ MM_MOM_CLOSE
+MOM_DONE equ MM_MOM_DONE
+
+; device ID for MIDI mapper
+MIDIMAPPER equ (-1)
+MIDI_MAPPER equ (-1)
+
+; flags for wFlags parm of midiOutCachePatches(),
+; midiOutCacheDrumPatches()
+MIDI_CACHE_ALL equ 1
+MIDI_CACHE_BESTFIT equ 2
+MIDI_CACHE_QUERY equ 3
+MIDI_UNCACHE equ 4
+
+; MIDI output device capabilities structure
+MIDIOUTCAPS struc
+ moc_wMid dw ? ; manufacturer ID
+ moc_wPid dw ? ; product ID
+ moc_vDriverVersion dw ? ; version of the driver
+ moc_szPname db MAXPNAMELEN dup (?) ; product name (NULL terminated string)
+ moc_wTechnology dw ? ; type of device
+ moc_wVoices dw ? ; # of voices (internal synth only)
+ moc_wNotes dw ? ; max # of notes (internal synth only)
+ moc_wChannelMask dw ? ; channels used (internal synth only)
+ moc_dwSupport dd ? ; functionality supported by driver
+MIDIOUTCAPS ends
+
+; flags for wTechnology field of MIDIOUTCAPS structure
+MOD_MIDIPORT equ 1 ; output port
+MOD_SYNTH equ 2 ; generic internal synth
+MOD_SQSYNTH equ 3 ; square wave internal synth
+MOD_FMSYNTH equ 4 ; FM internal synth
+MOD_MAPPER equ 5 ; MIDI mapper
+
+; flags for dwSupport field of MIDIOUTCAPS structure
+MIDICAPS_VOLUME equ 0001h ; supports volume control
+MIDICAPS_LRVOLUME equ 0002h ; separate left-right volume control
+MIDICAPS_CACHE equ 0004h
+
+; MIDI output device capabilities structure
+MIDIINCAPS struc
+ mic_wMid dw ? ; manufacturer ID
+ mic_wPid dw ? ; product ID
+ mic_vDriverVersion dw ? ; version of the driver
+ mic_szPname db MAXPNAMELEN dup (?) ; product name (NULL terminated string)
+MIDIINCAPS ends
+
+; MIDI data block header
+MIDIHDR struc
+ lpMidiData dd ? ; pointer to locked data block
+ dwMidiBufferLength dd ? ; length of data in data block
+ dwMidiBytesRecorded dd ? ; used for input only
+ dwMidiUser dd ? ; for client's use
+ dwMidiFlags dd ? ; assorted flags (see defines)
+ lpMidiNext dd ? ; reserved for driver
+ Midireserved dd ? ; reserved for driver
+MIDIHDR ends
+
+; flags for dwFlags field of MIDIHDR structure
+MHDR_DONE equ 00000001h ; done bit
+MHDR_PREPARED equ 00000002h ; set if header prepared
+MHDR_INQUEUE equ 00000004h ; reserved for driver
+
+endif ;ifndef MMNOMIDI
+
+
+ifndef MMNOAUX
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Auxiliary audio support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; device ID for aux device mapper
+AUX_MAPPER equ (-1)
+
+; Auxiliary audio device capabilities structure
+AUXCAPS struc
+ acaps_wMid dw ? ; manufacturer ID
+ acaps_wPid dw ? ; product ID
+ acaps_vDriverVersion dw ? ; version of the driver
+ acaps_szPname db MAXPNAMELEN dup (?) ; product name (NULL terminated string)
+ acaps_wTechnology dw ? ; type of device
+ acaps_dwSupport dd ? ; functionality supported by driver
+AUXCAPS ends
+
+; flags for wTechnology field in AUXCAPS structure
+AUXCAPS_CDAUDIO equ 1 ; audio from internal CD-ROM drive
+AUXCAPS_AUXIN equ 2 ; audio from auxiliary input jacks
+
+; flags for dwSupport field in AUXCAPS structure
+AUXCAPS_VOLUME equ 0001h ; supports volume control
+AUXCAPS_LRVOLUME equ 0002h ; separate left-right volume control
+
+endif ;ifndef MMNOAUX
+
+
+ifndef MMNOTIMER
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Timer support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; timer error return values
+TIMERR_NOERROR equ (0) ; no error
+TIMERR_NOCANDO equ (TIMERR_BASE+1) ; request not completed
+TIMERR_STRUCT equ (TIMERR_BASE+33) ; time struct size
+
+; flags for wFlags parameter of timeSetEvent() function
+TIME_ONESHOT equ 0 ; program timer for single event
+TIME_PERIODIC equ 1 ; program for continuous periodic event
+
+; timer device capabilities data structure
+TIMECAPS struc
+ tc_wPeriodMin dw ? ; minimum period supported
+ tc_wPeriodMax dw ? ; maximum period supported
+TIMECAPS ends
+
+endif ;ifndef MMNOTIMER
+
+
+ifndef MMNOJOY
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Joystick support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; joystick error return values
+JOYERR_NOERROR equ (0) ; no error
+JOYERR_PARMS equ (JOYERR_BASE+5) ; bad parameters
+JOYERR_NOCANDO equ (JOYERR_BASE+6) ; request not completed
+JOYERR_UNPLUGGED equ (JOYERR_BASE+7) ; joystick is unplugged
+
+; constants used with JOYINFO structure and MM_JOY* messages
+JOY_BUTTON1 equ 0001h
+JOY_BUTTON2 equ 0002h
+JOY_BUTTON3 equ 0004h
+JOY_BUTTON4 equ 0008h
+JOY_BUTTON1CHG equ 0100h
+JOY_BUTTON2CHG equ 0200h
+JOY_BUTTON3CHG equ 0400h
+JOY_BUTTON4CHG equ 0800h
+
+; joystick ID constants
+JOYSTICKID1 equ 0
+JOYSTICKID2 equ 1
+
+; joystick device capabilities data structure
+JOYCAPS struc
+ jcaps_wMid dw ? ; manufacturer ID
+ jcaps_wPid dw ? ; product ID
+ jcaps_szPname db MAXPNAMELEN dup (?) ; product name (NULL terminated string)
+ jcaps_wXmin dw ? ; minimum x position value
+ jcaps_wXmax dw ? ; maximum x position value
+ jcaps_wYmin dw ? ; minimum y position value
+ jcaps_wYmax dw ? ; maximum y position value
+ jcaps_wZmin dw ? ; minimum z position value
+ jcaps_wZmax dw ? ; maximum z position value
+ jcaps_wNumButtons dw ? ; number of buttons
+ jcaps_wPeriodMin dw ? ; minimum message period when captured
+ jcaps_wPeriodMax dw ? ; maximum message period when captured
+JOYCAPS ends
+
+; joystick information data structure
+JOYINFO struc
+ jinfo_wXpos dw ? ; x position
+ jinfo_wYpos dw ? ; y position
+ jinfo_wZpos dw ? ; z position
+ jinfo_wButtons dw ? ; button states
+JOYINFO ends
+
+endif ;ifndef MMNOJOY
+
+ifndef MMNOMMIO
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Multimedia File I/O support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; MMIO error return values
+MMIOERR_BASE equ 256
+MMIOERR_FILENOTFOUND equ (MMIOERR_BASE + 1) ; file not found
+MMIOERR_OUTOFMEMORY equ (MMIOERR_BASE + 2) ; out of memory
+MMIOERR_CANNOTOPEN equ (MMIOERR_BASE + 3) ; cannot open
+MMIOERR_CANNOTCLOSE equ (MMIOERR_BASE + 4) ; cannot close
+MMIOERR_CANNOTREAD equ (MMIOERR_BASE + 5) ; cannot read
+MMIOERR_CANNOTWRITE equ (MMIOERR_BASE + 6) ; cannot write
+MMIOERR_CANNOTSEEK equ (MMIOERR_BASE + 7) ; cannot seek
+MMIOERR_CANNOTEXPAND equ (MMIOERR_BASE + 8) ; cannot expand file
+MMIOERR_CHUNKNOTFOUND equ (MMIOERR_BASE + 9) ; chunk not found
+MMIOERR_UNBUFFERED equ (MMIOERR_BASE + 10) ; file is unbuffered
+
+; MMIO constants
+CFSEPCHAR equ '+' ; compound file name separator char.
+
+; general MMIO information data structure
+MMIOINFO struc
+ ; general fields
+ mmio_dwFlags dd ? ; general status flags
+ mmio_fccIOProc dd ? ; pointer to I/O procedure
+ mmio_pIOProc dd ? ; pointer to I/O procedure
+ mmio_wErrorRet dw ? ; place for error to be returned
+ mmio_htask dw ? ; alternate local task
+
+ ; fields maintained by MMIO functions during buffered I/O
+ mmio_cchBuffer dd ? ; size of I/O buffer (or 0L)
+ mmio_pchBuffer dd ? ; start of I/O buffer (or NULL)
+ mmio_pchNext dd ? ; pointer to next byte to read/write
+ mmio_pchEndRead dd ? ; pointer to last valid byte to read
+ mmio_pchEndWrite dd ? ; pointer to last byte to write
+ mmio_lBufOffset dd ? ; disk offset of start of buffer
+
+ ; fields maintained by I/O procedure
+ mmio_lDiskOffset dd ? ; disk offset of next read or write
+ mmio_adwInfo dd 3 dup (?) ; data specific to type of MMIOPROC
+
+ ; other fields maintained by MMIO
+ mmio_dwReserved1 dd ? ; reserved for MMIO use
+ mmio_dwReserved2 dd ? ; reserved for MMIO use
+ mmio_hmmio dw ? ; handle to open file
+MMIOINFO ends
+
+; RIFF chunk information data structure
+MMCKINFO struc
+ mmck_ckid dd ? ; chunk ID
+ mmck_cksize dd ? ; chunk size
+ mmck_fccType dd ? ; form type or list type
+ mmck_dwDataOffset dd ? ; offset of data portion of chunk
+ mmck_dwFlags dd ? ; flags used by MMIO functions
+MMCKINFO ends
+
+; bit field masks
+MMIO_RWMODE equ 00000003h ; open file for reading/writing/both
+MMIO_SHAREMODE equ 00000070h ; file sharing mode number
+
+; constants for dwFlags field of MMIOINFO
+MMIO_CREATE equ 00001000h ; create new file (or truncate file)
+MMIO_PARSE equ 00000100h ; parse new file returning path
+MMIO_DELETE equ 00000200h ; create new file (or truncate file)
+MMIO_EXIST equ 00004000h ; checks for existence of file
+MMIO_ALLOCBUF equ 00010000h ; mmioOpen() should allocate a buffer
+MMIO_GETTEMP equ 00020000h ; mmioOpen() should retrieve temp name
+
+MMIO_DIRTY equ 10000000h ; I/O buffer is dirty
+
+
+; read/write mode numbers (bit field MMIO_RWMODE)
+MMIO_READ equ 00000000h ; open file for reading only
+MMIO_WRITE equ 00000001h ; open file for writing only
+MMIO_READWRITE equ 00000002h ; open file for reading and writing
+
+; share mode numbers (bit field MMIO_SHAREMODE)
+MMIO_COMPAT equ 00000000h ; compatibility mode
+MMIO_EXCLUSIVE equ 00000010h ; exclusive-access mode
+MMIO_DENYWRITE equ 00000020h ; deny writing to other processes
+MMIO_DENYREAD equ 00000030h ; deny reading to other processes
+MMIO_DENYNONE equ 00000040h ; deny nothing to other processes
+
+; various MMIO flags
+MMIO_FHOPEN equ 0010h ; mmioClose: keep file handle open
+MMIO_EMPTYBUF equ 0010h ; mmioFlush: empty the I/O buffer
+MMIO_TOUPPER equ 0010h ; mmioStringToFOURCC: to u-case
+MMIO_INSTALLPROC equ 00010000h ; mmioInstallIOProc: install MMIOProc
+MMIO_GLOBALPROC equ 10000000h ; mmioInstallIOProc: install globally
+MMIO_REMOVEPROC equ 00020000h ; mmioInstallIOProc: remove MMIOProc
+MMIO_FINDPROC equ 00040000h ; mmioInstallIOProc: find an MMIOProc
+MMIO_FINDCHUNK equ 0010h ; mmioDescend: find a chunk by ID
+MMIO_FINDRIFF equ 0020h ; mmioDescend: find a LIST chunk
+MMIO_FINDLIST equ 0040h ; mmioDescend: find a RIFF chunk
+MMIO_CREATERIFF equ 0020h ; mmioCreateChunk: make a LIST chunk
+MMIO_CREATELIST equ 0040h ; mmioCreateChunk: make a RIFF chunk
+
+
+; message numbers for MMIOPROC I/O procedure functions
+MMIOM_READ equ MMIO_READ ; read
+MMIOM_WRITE equ MMIO_WRITE ; write
+MMIOM_SEEK equ 2 ; seek to a new position in file
+MMIOM_OPEN equ 3 ; open file
+MMIOM_CLOSE equ 4 ; close file
+MMIOM_WRITEFLUSH equ 5 ; write and flush
+MMIOM_RENAME equ 6 ; rename specified file
+MMIOM_USER equ 8000h ; beginning of user-defined messages
+
+mmioFOURCC MACRO ch0,ch1,ch2,ch3
+ mov al,ch0
+ mov ah,ch1
+ mov dl,ch2
+ mov dh,ch3
+ ENDM
+
+; standard four character codes
+FOURCC_RIFF equ mmioFOURCC('R', 'I', 'F', 'F')
+FOURCC_LIST equ mmioFOURCC('L', 'I', 'S', 'T')
+
+; four character codes used to identify standard built-in I/O procedures
+FOURCC_DOS equ mmioFOURCC('D', 'O', 'S', ' ')
+FOURCC_MEM equ mmioFOURCC('M', 'E', 'M', ' ')
+
+; flags for mmioSeek()
+ifndef SEEK_SET
+SEEK_SET equ 0 ; seek to an absolute position
+SEEK_CUR equ 1 ; seek relative to current position
+SEEK_END equ 2 ; seek relative to end of file
+endif ;ifndef SEEK_SET
+
+; other constants
+MMIO_DEFAULTBUFFER equ 8192 ; default buffer size
+
+endif ;ifndef MMNOMMIO
+
+ifndef MMNOMCI
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; MCI support
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; MCI error return values
+MCIERR_INVALID_DEVICE_ID equ (MCIERR_BASE + 1)
+MCIERR_UNRECOGNIZED_KEYWORD equ (MCIERR_BASE + 3)
+MCIERR_UNRECOGNIZED_COMMAND equ (MCIERR_BASE + 5)
+MCIERR_HARDWARE equ (MCIERR_BASE + 6)
+MCIERR_INVALID_DEVICE_NAME equ (MCIERR_BASE + 7)
+MCIERR_OUT_OF_MEMORY equ (MCIERR_BASE + 8)
+MCIERR_DEVICE_OPEN equ (MCIERR_BASE + 9)
+MCIERR_CANNOT_LOAD_DRIVER equ (MCIERR_BASE + 10)
+MCIERR_MISSING_COMMAND_STRING equ (MCIERR_BASE + 11)
+MCIERR_PARAM_OVERFLOW equ (MCIERR_BASE + 12)
+MCIERR_MISSING_STRING_ARGUMENT equ (MCIERR_BASE + 13)
+MCIERR_BAD_INTEGER equ (MCIERR_BASE + 14)
+MCIERR_PARSER_INTERNAL equ (MCIERR_BASE + 15)
+MCIERR_DRIVER_INTERNAL equ (MCIERR_BASE + 16)
+MCIERR_MISSING_PARAMETER equ (MCIERR_BASE + 17)
+MCIERR_UNSUPPORTED_FUNCTION equ (MCIERR_BASE + 18)
+MCIERR_FILE_NOT_FOUND equ (MCIERR_BASE + 19)
+MCIERR_DEVICE_NOT_READY equ (MCIERR_BASE + 20)
+MCIERR_INTERNAL equ (MCIERR_BASE + 21)
+MCIERR_DRIVER equ (MCIERR_BASE + 22)
+MCIERR_CANNOT_USE_ALL equ (MCIERR_BASE + 23)
+MCIERR_MULTIPLE equ (MCIERR_BASE + 24)
+MCIERR_EXTENSION_NOT_FOUND equ (MCIERR_BASE + 25)
+MCIERR_OUTOFRANGE equ (MCIERR_BASE + 26)
+MCIERR_FLAGS_NOT_COMPATIBLE equ (MCIERR_BASE + 28)
+MCIERR_FILE_NOT_SAVED equ (MCIERR_BASE + 30)
+MCIERR_DEVICE_TYPE_REQUIRED equ (MCIERR_BASE + 31)
+MCIERR_DEVICE_LOCKED equ (MCIERR_BASE + 32)
+MCIERR_DUPLICATE_ALIAS equ (MCIERR_BASE + 33)
+MCIERR_BAD_CONSTANT equ (MCIERR_BASE + 34)
+MCIERR_MUST_USE_SHAREABLE equ (MCIERR_BASE + 35)
+MCIERR_MISSING_DEVICE_NAME equ (MCIERR_BASE + 36)
+MCIERR_BAD_TIME_FORMAT equ (MCIERR_BASE + 37)
+MCIERR_NO_CLOSING_QUOTE equ (MCIERR_BASE + 38)
+MCIERR_DUPLICATE_FLAGS equ (MCIERR_BASE + 39)
+MCIERR_INVALID_FILE equ (MCIERR_BASE + 40)
+MCIERR_NULL_PARAMETER_BLOCK equ (MCIERR_BASE + 41)
+MCIERR_UNNAMED_RESOURCE equ (MCIERR_BASE + 42)
+MCIERR_NEW_REQUIRES_ALIAS equ (MCIERR_BASE + 43)
+MCIERR_NOTIFY_ON_AUTO_OPEN equ (MCIERR_BASE + 44)
+MCIERR_NO_ELEMENT_ALLOWED equ (MCIERR_BASE + 45)
+MCIERR_NONAPPLICABLE_FUNCTION equ (MCIERR_BASE + 46)
+MCIERR_ILLEGAL_FOR_AUTO_OPEN equ (MCIERR_BASE + 47)
+MCIERR_FILENAME_REQUIRED equ (MCIERR_BASE + 48)
+MCIERR_EXTRA_CHARACTERS equ (MCIERR_BASE + 49)
+MCIERR_DEVICE_NOT_INSTALLED equ (MCIERR_BASE + 50)
+MCIERR_GET_CD equ (MCIERR_BASE + 51)
+MCIERR_SET_CD equ (MCIERR_BASE + 52)
+MCIERR_SET_DRIVE equ (MCIERR_BASE + 53)
+MCIERR_DEVICE_LENGTH equ (MCIERR_BASE + 54)
+MCIERR_DEVICE_ORD_LENGTH equ (MCIERR_BASE + 55)
+MCIERR_NO_INTEGER equ (MCIERR_BASE + 56)
+
+MCIERR_WAVE_OUTPUTSINUSE equ (MCIERR_BASE + 64)
+MCIERR_WAVE_SETOUTPUTINUSE equ (MCIERR_BASE + 65)
+MCIERR_WAVE_INPUTSINUSE equ (MCIERR_BASE + 66)
+MCIERR_WAVE_SETINPUTINUSE equ (MCIERR_BASE + 67)
+MCIERR_WAVE_OUTPUTUNSPECIFIED equ (MCIERR_BASE + 68)
+MCIERR_WAVE_INPUTUNSPECIFIED equ (MCIERR_BASE + 69)
+MCIERR_WAVE_OUTPUTSUNSUITABLE equ (MCIERR_BASE + 70)
+MCIERR_WAVE_SETOUTPUTUNSUITABLE equ (MCIERR_BASE + 71)
+MCIERR_WAVE_INPUTSUNSUITABLE equ (MCIERR_BASE + 72)
+MCIERR_WAVE_SETINPUTUNSUITABLE equ (MCIERR_BASE + 73)
+
+MCIERR_SEQ_DIV_INCOMPATIBLE equ (MCIERR_BASE + 80)
+MCIERR_SEQ_PORT_INUSE equ (MCIERR_BASE + 81)
+MCIERR_SEQ_PORT_NONEXISTENT equ (MCIERR_BASE + 82)
+MCIERR_SEQ_PORT_MAPNODEVICE equ (MCIERR_BASE + 83)
+MCIERR_SEQ_PORT_MISCERROR equ (MCIERR_BASE + 84)
+MCIERR_SEQ_TIMER equ (MCIERR_BASE + 85)
+MCIERR_SEQ_PORTUNSPECIFIED equ (MCIERR_BASE + 86)
+MCIERR_SEQ_NOMIDIPRESENT equ (MCIERR_BASE + 87)
+
+MCIERR_NO_WINDOW equ (MCIERR_BASE + 90)
+MCIERR_CREATEWINDOW equ (MCIERR_BASE + 91)
+MCIERR_FILE_READ equ (MCIERR_BASE + 92)
+MCIERR_FILE_WRITE equ (MCIERR_BASE + 93)
+
+; all custom device driver errors must be >= than this value
+MCIERR_CUSTOM_DRIVER_BASE equ (MCIERR_BASE + 256)
+
+; MCI command message identifiers
+MCI_OPEN equ 0803h
+MCI_CLOSE equ 0804h
+MCI_ESCAPE equ 0805h
+MCI_PLAY equ 0806h
+MCI_SEEK equ 0807h
+MCI_STOP equ 0808h
+MCI_PAUSE equ 0809h
+MCI_INFO equ 080Ah
+MCI_GETDEVCAPS equ 080Bh
+MCI_SPIN equ 080Ch
+MCI_SET equ 080Dh
+MCI_STEP equ 080Eh
+MCI_RECORD equ 080Fh
+MCI_SYSINFO equ 0810h
+MCI_BREAK equ 0811h
+MCI_SOUND equ 0812h
+MCI_SAVE equ 0813h
+MCI_STATUS equ 0814h
+MCI_CUE equ 0830h
+MCI_REALIZE equ 0840h
+MCI_WINDOW equ 0841h
+MCI_PUT equ 0842h
+MCI_WHERE equ 0843h
+MCI_FREEZE equ 0844h
+MCI_UNFREEZE equ 0845h
+MCI_LOAD equ 0850h
+MCI_CUT equ 0851h
+MCI_COPY equ 0852h
+MCI_PASTE equ 0853h
+MCI_UPDATE equ 0854h
+MCI_RESUME equ 0855h
+MCI_DELETE equ 0856h
+
+; all custom MCI command messages must be >= than this value
+MCI_USER_MESSAGES equ (400h + DRV_MCI_FIRST)
+
+
+; device ID for "all devices"
+MCI_ALL_DEVICE_ID equ 0FFFFh
+
+; constants for predefined MCI device types
+MCI_DEVTYPE_VCR equ (MCI_STRING_OFFSET + 1)
+MCI_DEVTYPE_VIDEODISC equ (MCI_STRING_OFFSET + 2)
+MCI_DEVTYPE_OVERLAY equ (MCI_STRING_OFFSET + 3)
+MCI_DEVTYPE_CD_AUDIO equ (MCI_STRING_OFFSET + 4)
+MCI_DEVTYPE_DAT equ (MCI_STRING_OFFSET + 5)
+MCI_DEVTYPE_SCANNER equ (MCI_STRING_OFFSET + 6)
+MCI_DEVTYPE_ANIMATION equ (MCI_STRING_OFFSET + 7)
+MCI_DEVTYPE_DIGITAL_VIDEO equ (MCI_STRING_OFFSET + 8)
+MCI_DEVTYPE_OTHER equ (MCI_STRING_OFFSET + 9)
+MCI_DEVTYPE_WAVEFORM_AUDIO equ (MCI_STRING_OFFSET + 10)
+MCI_DEVTYPE_SEQUENCER equ (MCI_STRING_OFFSET + 11)
+
+MCI_DEVTYPE_FIRST equ MCI_DEVTYPE_VCR
+MCI_DEVTYPE_LAST equ MCI_DEVTYPE_SEQUENCER
+
+; return values for 'status mode' command
+MCI_MODE_NOT_READY equ (MCI_STRING_OFFSET + 12)
+MCI_MODE_STOP equ (MCI_STRING_OFFSET + 13)
+MCI_MODE_PLAY equ (MCI_STRING_OFFSET + 14)
+MCI_MODE_RECORD equ (MCI_STRING_OFFSET + 15)
+MCI_MODE_SEEK equ (MCI_STRING_OFFSET + 16)
+MCI_MODE_PAUSE equ (MCI_STRING_OFFSET + 17)
+MCI_MODE_OPEN equ (MCI_STRING_OFFSET + 18)
+
+; constants used in 'set time format' and 'status time format' commands
+MCI_FORMAT_MILLISECONDS equ 0
+MCI_FORMAT_HMS equ 1
+MCI_FORMAT_MSF equ 2
+MCI_FORMAT_FRAMES equ 3
+MCI_FORMAT_SMPTE_24 equ 4
+MCI_FORMAT_SMPTE_25 equ 5
+MCI_FORMAT_SMPTE_30 equ 6
+MCI_FORMAT_SMPTE_30DROP equ 7
+MCI_FORMAT_BYTES equ 8
+MCI_FORMAT_SAMPLES equ 9
+MCI_FORMAT_TMSF equ 10
+
+; flags for wParam of MM_MCINOTIFY message
+MCI_NOTIFY_SUCCESSFUL equ 0001h
+MCI_NOTIFY_SUPERSEDED equ 0002h
+MCI_NOTIFY_ABORTED equ 0004h
+MCI_NOTIFY_FAILURE equ 0008h
+
+
+; common flags for dwFlags parameter of MCI command messages
+MCI_NOTIFY equ 00000001h
+MCI_WAIT equ 00000002h
+MCI_FROM equ 00000004h
+MCI_TO equ 00000008h
+MCI_TRACK equ 00000010h
+
+; flags for dwFlags parameter of MCI_OPEN command message
+MCI_OPEN_SHAREABLE equ 00000100h
+MCI_OPEN_ELEMENT equ 00000200h
+MCI_OPEN_ALIAS equ 00000400h
+MCI_OPEN_ELEMENT_ID equ 00000800h
+MCI_OPEN_TYPE_ID equ 00001000h
+MCI_OPEN_TYPE equ 00002000h
+
+; flags for dwFlags parameter of MCI_SEEK command message
+MCI_SEEK_TO_START equ 00000100h
+MCI_SEEK_TO_END equ 00000200h
+
+; flags for dwFlags parameter of MCI_STATUS command message
+MCI_STATUS_ITEM equ 00000100h
+MCI_STATUS_START equ 00000200h
+
+; flags for dwItem field of the MCI_STATUS_PARMS parameter block
+MCI_STATUS_LENGTH equ 00000001h
+MCI_STATUS_POSITION equ 00000002h
+MCI_STATUS_NUMBER_OF_TRACKS equ 00000003h
+MCI_STATUS_MODE equ 00000004h
+MCI_STATUS_MEDIA_PRESENT equ 00000005h
+MCI_STATUS_TIME_FORMAT equ 00000006h
+MCI_STATUS_READY equ 00000007h
+MCI_STATUS_CURRENT_TRACK equ 00000008h
+
+; flags for dwFlags parameter of MCI_INFO command message
+MCI_INFO_PRODUCT equ 00000100h
+MCI_INFO_FILE equ 00000200h
+
+; flags for dwFlags parameter of MCI_GETDEVCAPS command message
+MCI_GETDEVCAPS_ITEM equ 00000100h
+
+; flags for dwItem field of the MCI_GETDEVCAPS_PARMS parameter block
+MCI_GETDEVCAPS_CAN_RECORD equ 00000001h
+MCI_GETDEVCAPS_HAS_AUDIO equ 00000002h
+MCI_GETDEVCAPS_HAS_VIDEO equ 00000003h
+MCI_GETDEVCAPS_DEVICE_TYPE equ 00000004h
+MCI_GETDEVCAPS_USES_FILES equ 00000005h
+MCI_GETDEVCAPS_COMPOUND_DEVICE equ 00000006h
+MCI_GETDEVCAPS_CAN_EJECT equ 00000007h
+MCI_GETDEVCAPS_CAN_PLAY equ 00000008h
+MCI_GETDEVCAPS_CAN_SAVE equ 00000009h
+
+; flags for dwFlags parameter of MCI_SYSINFO command message
+MCI_SYSINFO_QUANTITY equ 00000100h
+MCI_SYSINFO_OPEN equ 00000200h
+MCI_SYSINFO_NAME equ 00000400h
+MCI_SYSINFO_INSTALLNAME equ 00000800h
+
+; flags for dwFlags parameter of MCI_SET command message
+MCI_SET_DOOR_OPEN equ 00000100h
+MCI_SET_DOOR_CLOSED equ 00000200h
+MCI_SET_TIME_FORMAT equ 00000400h
+MCI_SET_AUDIO equ 00000800h
+MCI_SET_VIDEO equ 00001000h
+MCI_SET_ON equ 00002000h
+MCI_SET_OFF equ 00004000h
+
+; flags for dwAudio field of MCI_SET_PARMS or MCI_SEQ_SET_PARMS
+MCI_SET_AUDIO_ALL equ 00000000h
+MCI_SET_AUDIO_LEFT equ 00000001h
+MCI_SET_AUDIO_RIGHT equ 00000002h
+
+; flags for dwFlags parameter of MCI_BREAK command message
+MCI_BREAK_KEY equ 00000100h
+MCI_BREAK_HWND equ 00000200h
+MCI_BREAK_OFF equ 00000400h
+
+; flags for dwFlags parameter of MCI_RECORD command message
+MCI_RECORD_INSERT equ 00000100h
+MCI_RECORD_OVERWRITE equ 00000200h
+
+; flags for dwFlags parameter of MCI_SOUND command message
+MCI_SOUND_NAME equ 00000100h
+
+; flags for dwFlags parameter of MCI_SAVE command message
+MCI_SAVE_FILE equ 00000100h
+
+; flags for dwFlags parameter of MCI_LOAD command message
+MCI_LOAD_FILE equ 00000100h
+
+; generic parameter block for MCI command messages with no special parameters
+MCI_GENERIC_PARMS struc
+ mcigen_dwCallback dd ?
+MCI_GENERIC_PARMS ends
+
+; parameter block for MCI_OPEN command message
+MCI_OPEN_PARMS struc
+ mciopen_dwCallback dd ?
+ mciopen_wDeviceID dw ?
+ mciopen_wReserved0 dw ?
+ mciopen_lpstrDeviceType dd ?
+ mciopen_lpstrElementName dd ?
+ mciopen_lpstrAlias dd ?
+MCI_OPEN_PARMS ends
+
+; parameter block for MCI_PLAY command message
+MCI_PLAY_PARMS struc
+ mciplay_dwCallback dd ?
+ mciplay_dwFrom dd ?
+ mciplay_dwTo dd ?
+MCI_PLAY_PARMS ends
+
+; parameter block for MCI_SEEK command message
+MCI_SEEK_PARMS struc
+ mciseek_dwCallback dd ?
+ mciseek_dwTo dd ?
+MCI_SEEK_PARMS ends
+
+; parameter block for MCI_STATUS command message
+MCI_STATUS_PARMS struc
+ mcistat_dwCallback dd ?
+ mcistat_dwReturn dd ?
+ mcistat_dwItem dd ?
+ mcistat_dwTrack dd ?
+MCI_STATUS_PARMS ends
+
+; parameter block for MCI_INFO command message
+MCI_INFO_PARMS struc
+ mciinfo_dwCallback dd ?
+ mciinfo_lpstrReturn dd ?
+ mciinfo_dwRetSize dd ?
+MCI_INFO_PARMS ends
+
+; parameter block for MCI_GETDEVCAPS command message
+MCI_GETDEVCAPS_PARMS struc
+ mcigdc_dwCallback dd ?
+ mcigdc_dwReturn dd ?
+ mcigdc_dwItem dd ?
+MCI_GETDEVCAPS_PARMS ends
+
+; parameter block for MCI_SYSINFO command message
+MCI_SYSINFO_PARMS struc
+ mcisi_dwCallback dd ?
+ mcisi_lpstrReturn dd ?
+ mcisi_dwRetSize dd ?
+ mcisi_dwNumber dd ?
+ mcisi_wDeviceType dw ?
+ mcisi_wReserved0 dw ?
+MCI_SYSINFO_PARMS ends
+
+; parameter block for MCI_SET command message
+MCI_SET_PARMS struc
+ mciset_dwCallback dd ?
+ mciset_dwTimeFormat dd ?
+ mciset_dwAudio dd ?
+MCI_SET_PARMS ends
+
+; parameter block for MCI_BREAK command message
+MCI_BREAK_PARMS struc
+ mcibreak_dwCallback dd ?
+ mcibreak_nVirtKey dw ?
+ mcibreak_wReserved0 dw ?
+ mcibreak_hwndBreak dw ?
+ mcibreak_wReserved1 dw ?
+MCI_BREAK_PARMS ends
+
+; parameter block for MCI_SOUND command message
+MCI_SOUND_PARMS struc
+ mcisnd_dwCallback dd ?
+ mcisnd_lpstrSoundName dd ?
+MCI_SOUND_PARMS ends
+
+; parameter block for MCI_SAVE command message
+MCI_SAVE_PARMS struc
+ mcisave_dwCallback dd ?
+ mcisave_lpfilename dd ?
+MCI_SAVE_PARMS ends
+
+; parameter block for MCI_LOAD command message
+MCI_LOAD_PARMS struc
+ mciload_dwCallback dd ?
+ mciload_lpfilename dd ?
+MCI_LOAD_PARMS ends
+
+; parameter block for MCI_RECORD command message
+MCI_RECORD_PARMS struc
+ mcirec_dwCallback dd ?
+ mcirec_dwFrom dd ?
+ mcirec_dwTo dd ?
+MCI_RECORD_PARMS ends
+
+
+;
+; MCI extensions for videodisc devices
+;
+
+; flag for dwReturn field of MCI_STATUS_PARMS
+; MCI_STATUS command, (dwItem == MCI_STATUS_MODE)
+MCI_VD_MODE_PARK equ (MCI_VD_OFFSET + 1)
+
+; flag for dwReturn field of MCI_STATUS_PARMS
+; MCI_STATUS command, (dwItem == MCI_VD_STATUS_MEDIA_TYPE)
+MCI_VD_MEDIA_CLV equ (MCI_VD_OFFSET + 2)
+MCI_VD_MEDIA_CAV equ (MCI_VD_OFFSET + 3)
+MCI_VD_MEDIA_OTHER equ (MCI_VD_OFFSET + 4)
+
+MCI_VD_FORMAT_TRACK equ 4001h
+
+; flags for dwFlags parameter of MCI_PLAY command message
+MCI_VD_PLAY_REVERSE equ 00010000h
+MCI_VD_PLAY_FAST equ 00020000h
+MCI_VD_PLAY_SPEED equ 00040000h
+MCI_VD_PLAY_SCAN equ 00080000h
+MCI_VD_PLAY_SLOW equ 00100000h
+
+; flag for dwFlags parameter of MCI_SEEK command message
+MCI_VD_SEEK_REVERSE equ 00010000h
+
+; flags for dwItem field of MCI_STATUS_PARMS parameter block
+MCI_VD_STATUS_SPEED equ 00004002h
+MCI_VD_STATUS_FORWARD equ 00004003h
+MCI_VD_STATUS_MEDIA_TYPE equ 00004004h
+MCI_VD_STATUS_SIDE equ 00004005h
+MCI_VD_STATUS_DISC_SIZE equ 00004006h
+
+; flags for dwFlags parameter of MCI_GETDEVCAPS command message
+MCI_VD_GETDEVCAPS_CLV equ 00010000h
+MCI_VD_GETDEVCAPS_CAV equ 00020000h
+
+MCI_VD_SPIN_UP equ 0001h
+MCI_VD_SPIN_DOWN equ 0002h
+
+; flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block
+MCI_VD_GETDEVCAPS_CAN_REVERSE equ 00004002h
+MCI_VD_GETDEVCAPS_FAST_RATE equ 00004003h
+MCI_VD_GETDEVCAPS_SLOW_RATE equ 00004004h
+MCI_VD_GETDEVCAPS_NORMAL_RATE equ 00004005h
+
+; flags for the dwFlags parameter of MCI_STEP command message
+MCI_VD_STEP_FRAMES equ 00010000h
+MCI_VD_STEP_REVERSE equ 00020000h
+
+; flag for the MCI_ESCAPE command message
+MCI_VD_ESCAPE_STRING equ 00000100h
+
+; parameter block for MCI_PLAY command message
+MCI_VD_PLAY_PARMS struc
+ mcivdplay_dwCallback dd ?
+ mcivdplay_dwFrom dd ?
+ mcivdplay_dwTo dd ?
+ mcivdplay_dwSpeed dd ?
+MCI_VD_PLAY_PARMS ends
+
+; parameter block for MCI_STEP command message
+MCI_VD_STEP_PARMS struc
+ mcivdstep_dwCallback dd ?
+ mcivdstep_dwFrames dd ?
+MCI_VD_STEP_PARMS ends
+
+; parameter block for MCI_ESCAPE command message
+MCI_VD_ESCAPE_PARMS struc
+ mcivcesc_dwCallback dd ?
+ mcivcesc_lpstrCommand dd ?
+MCI_VD_ESCAPE_PARMS ends
+
+
+;
+; MCI extensions for waveform audio devices
+;
+
+; flags for the dwFlags parameter of MCI_OPEN command message
+MCI_WAVE_OPEN_BUFFER equ 00010000h
+
+; flags for the dwFlags parameter of MCI_SET command message
+MCI_WAVE_SET_FORMATTAG equ 00010000h
+MCI_WAVE_SET_CHANNELS equ 00020000h
+MCI_WAVE_SET_SAMPLESPERSEC equ 00040000h
+MCI_WAVE_SET_AVGBYTESPERSEC equ 00080000h
+MCI_WAVE_SET_BLOCKALIGN equ 00100000h
+MCI_WAVE_SET_BITSPERSAMPLE equ 00200000h
+
+; flags for the dwFlags parameter of MCI_STATUS, MCI_SET command messages
+MCI_WAVE_INPUT equ 00400000h
+MCI_WAVE_OUTPUT equ 00800000h
+
+; flags for the dwItem field of MCI_STATUS_PARMS parameter block
+MCI_WAVE_STATUS_FORMATTAG equ 00004001h
+MCI_WAVE_STATUS_CHANNELS equ 00004002h
+MCI_WAVE_STATUS_SAMPLESPERSEC equ 00004003h
+MCI_WAVE_STATUS_AVGBYTESPERSEC equ 00004004h
+MCI_WAVE_STATUS_BLOCKALIGN equ 00004005h
+MCI_WAVE_STATUS_BITSPERSAMPLE equ 00004006h
+MCI_WAVE_STATUS_LEVEL equ 00004007h
+
+; flags for the dwFlags parameter of MCI_SET command message
+MCI_WAVE_SET_ANYINPUT equ 04000000h
+MCI_WAVE_SET_ANYOUTPUT equ 08000000h
+
+; flags for the dwFlags parameter of MCI_GETDEVCAPS command message
+MCI_WAVE_GETDEVCAPS_INPUTS equ 00004001h
+MCI_WAVE_GETDEVCAPS_OUTPUTS equ 00004002h
+
+; parameter block for MCI_OPEN command message
+MCI_WAVE_OPEN_PARMS struc
+ mciwopen_dwCallback dd ?
+ mciwopen_wDeviceID dw ?
+ mciwopen_wReserved0 dw ?
+ mciwopen_lpstrDeviceType dd ?
+ mciwopen_lpstrElementName dd ?
+ mciwopen_lpstrAlias dd ?
+ mciwopen_dwBufferSeconds dd ?
+MCI_WAVE_OPEN_PARMS ends
+
+; parameter block for MCI_DELETE command message
+MCI_WAVE_DELETE_PARMS struc
+ mciwdel_dwCallback dd ?
+ mciwdel_dwFrom dd ?
+ mciwdel_dwTo dd ?
+MCI_WAVE_DELETE_PARMS ends
+
+; parameter block for MCI_SET command message
+MCI_WAVE_SET_PARMS struc
+ mciwset_dwCallback dd ?
+ mciwset_dwTimeFormat dd ?
+ mciwset_dwAudio dd ?
+ mciwset_wInput dw ?
+ mciwset_wReserved0 dw ?
+ mciwset_wOutput dw ?
+ mciwset_wReserved1 dw ?
+ mciwset_wFormatTag dw ?
+ mciwset_wReserved2 dw ?
+ mciwset_nChannels dw ?
+ mciwset_wReserved3 dw ?
+ mciwset_nSamplesPerSec dw ?
+ mciwset_nAvgBytesPerSec dw ?
+ mciwset_nBlockAlign dw ?
+ mciwset_wReserved4 dw ?
+ mciwset_wBitsPerSample dw ?
+ mciwset_wReserved5 dw ?
+MCI_WAVE_SET_PARMS ends
+
+
+;
+; MCI extensions for MIDI sequencer devices
+;
+
+; flags for the dwReturn field of MCI_STATUS_PARMS parameter block
+; MCI_STATUS command, (dwItem == MCI_SEQ_STATUS_DIVTYPE)
+MCI_SEQ_DIV_PPQN equ (0 + MCI_SEQ_OFFSET)
+MCI_SEQ_DIV_SMPTE_24 equ (1 + MCI_SEQ_OFFSET)
+MCI_SEQ_DIV_SMPTE_25 equ (2 + MCI_SEQ_OFFSET)
+MCI_SEQ_DIV_SMPTE_30DROP equ (3 + MCI_SEQ_OFFSET)
+MCI_SEQ_DIV_SMPTE_30 equ (4 + MCI_SEQ_OFFSET)
+
+; flags for the dwMaster field of MCI_SEQ_SET_PARMS parameter block
+; MCI_SET command, (dwFlags == MCI_SEQ_SET_MASTER)
+MCI_SEQ_FORMAT_SONGPTR equ 4001h
+MCI_SEQ_FILE equ 4002h
+MCI_SEQ_MIDI equ 4003h
+MCI_SEQ_SMPTE equ 4004h
+MCI_SEQ_NONE equ 65533
+
+; flags for the dwItem field of MCI_STATUS_PARMS parameter block
+MCI_SEQ_STATUS_TEMPO equ 00004002h
+MCI_SEQ_STATUS_PORT equ 00004003h
+MCI_SEQ_STATUS_SLAVE equ 00004007h
+MCI_SEQ_STATUS_MASTER equ 00004008h
+MCI_SEQ_STATUS_OFFSET equ 00004009h
+MCI_SEQ_STATUS_DIVTYPE equ 0000400Ah
+
+; flags for the dwFlags parameter of MCI_SET command message
+MCI_SEQ_SET_TEMPO equ 00010000h
+MCI_SEQ_SET_PORT equ 00020000h
+MCI_SEQ_SET_SLAVE equ 00040000h
+MCI_SEQ_SET_MASTER equ 00080000h
+MCI_SEQ_SET_OFFSET equ 01000000h
+
+; parameter block for MCI_SET command message
+MCI_SEQ_SET_PARMS struc
+ mcisset_dwCallback dd ?
+ mcisset_dwTimeFormat dd ?
+ mcisset_dwAudio dd ?
+ mcisset_dwTempo dd ?
+ mcisset_dwPort dd ?
+ mcisset_dwSlave dd ?
+ mcisset_dwMaster dd ?
+ mcisset_dwOffset dd ?
+MCI_SEQ_SET_PARMS ends
+
+
+;
+; MCI extensions for animation devices
+;
+
+; flags for dwFlags parameter of MCI_OPEN command message
+MCI_ANIM_OPEN_WS equ 00010000h
+MCI_ANIM_OPEN_PARENT equ 00020000h
+MCI_ANIM_OPEN_NOSTATIC equ 00040000h
+
+; flags for dwFlags parameter of MCI_PLAY command message
+MCI_ANIM_PLAY_SPEED equ 00010000h
+MCI_ANIM_PLAY_REVERSE equ 00020000h
+MCI_ANIM_PLAY_FAST equ 00040000h
+MCI_ANIM_PLAY_SLOW equ 00080000h
+MCI_ANIM_PLAY_SCAN equ 00100000h
+
+; flags for dwFlags parameter of MCI_STEP command message
+MCI_ANIM_STEP_REVERSE equ 00010000h
+MCI_ANIM_STEP_FRAMES equ 00020000h
+
+; flags for dwItem field of MCI_STATUS_PARMS parameter block
+MCI_ANIM_STATUS_SPEED equ 00004001h
+MCI_ANIM_STATUS_FORWARD equ 00004002h
+MCI_ANIM_STATUS_HWND equ 00004003h
+MCI_ANIM_STATUS_HPAL equ 00004004h
+MCI_ANIM_STATUS_STRETCH equ 00004005h
+
+; flags for the dwFlags parameter of MCI_INFO command message
+MCI_ANIM_INFO_TEXT equ 00010000h
+
+; flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block
+MCI_ANIM_GETDEVCAPS_CAN_REVERSE equ 00004001h
+MCI_ANIM_GETDEVCAPS_FAST_RATE equ 00004002h
+MCI_ANIM_GETDEVCAPS_SLOW_RATE equ 00004003h
+MCI_ANIM_GETDEVCAPS_NORMAL_RATE equ 00004004h
+MCI_ANIM_GETDEVCAPS_PALETTES equ 00004006h
+MCI_ANIM_GETDEVCAPS_CAN_STRETCH equ 00004007h
+MCI_ANIM_GETDEVCAPS_MAX_WINDOWS equ 00004008h
+
+; flags for the MCI_REALIZE command message
+MCI_ANIM_REALIZE_NORM equ 00010000h
+MCI_ANIM_REALIZE_BKGD equ 00020000h
+
+; flags for dwFlags parameter of MCI_WINDOW command message
+MCI_ANIM_WINDOW_HWND equ 00010000h
+MCI_ANIM_WINDOW_STATE equ 00040000h
+MCI_ANIM_WINDOW_TEXT equ 00080000h
+MCI_ANIM_WINDOW_ENABLE_STRETCH equ 00100000h
+MCI_ANIM_WINDOW_DISABLE_STRETCH equ 00200000h
+
+; flags for hWnd field of MCI_ANIM_WINDOW_PARMS parameter block
+; MCI_WINDOW command message, (dwFlags == MCI_ANIM_WINDOW_HWND)
+MCI_ANIM_WINDOW_DEFAULT equ 00000000h
+
+; flags for dwFlags parameter of MCI_PUT command message
+MCI_ANIM_RECT equ 00010000h
+MCI_ANIM_PUT_SOURCE equ 00020000h
+MCI_ANIM_PUT_DESTINATION equ 00040000h
+
+; flags for dwFlags parameter of MCI_WHERE command message
+MCI_ANIM_WHERE_SOURCE equ 00020000h
+MCI_ANIM_WHERE_DESTINATION equ 00040000h
+
+; flags for dwFlags parameter of MCI_UPDATE command message
+MCI_ANIM_UPDATE_HDC equ 00020000h
+
+; parameter block for MCI_OPEN command message
+MCI_ANIM_OPEN_PARMS struc
+ mciaopen_dwCallback dd ?
+ mciaopen_wDeviceID dw ?
+ mciaopen_wReserved0 dw ?
+ mciaopen_lpstrDeviceType dd ?
+ mciaopen_lpstrElementName dd ?
+ mciaopen_lpstrAlias dd ?
+ mciaopen_dwStyle dd ?
+ mciaopen_hWndParent dw ?
+ mciaopen_wReserved1 dw ?
+MCI_ANIM_OPEN_PARMS ends
+
+; parameter block for MCI_PLAY command message
+MCI_ANIM_PLAY_PARMS struc
+ mciaplay_dwCallback dd ?
+ mciaplay_dwFrom dd ?
+ mciaplay_dwTo dd ?
+ mciaplay_dwSpeed dd ?
+MCI_ANIM_PLAY_PARMS ends
+
+; parameter block for MCI_STEP command message
+MCI_ANIM_STEP_PARMS struc
+ mciastep_dwCallback dd ?
+ mciastep_dwFrames dd ?
+MCI_ANIM_STEP_PARMS ends
+
+; parameter block for MCI_WINDOW command message
+MCI_ANIM_WINDOW_PARMS struc
+ mciawin_dwCallback dd ?
+ mciawin_hWnd dw ?
+ mciawin_wReserved1 dw ?
+ mciawin_nCmdShow dw ?
+ mciawin_wReserved2 dw ?
+ mciawin_lpstrText dd ?
+MCI_ANIM_WINDOW_PARMS ends
+
+; parameter block for MCI_PUT, MCI_UPDATE, MCI_WHERE command messages
+MCI_ANIM_RECT_PARMS struc
+ mciarect_dwCallback dd ?
+ifdef MCI_USE_OFFEXT
+ mciarect_ptOffset db (SIZE POINT) dup (?)
+ mciarect_ptExtent db (SIZE POINT) dup (?)
+else ;ifdef MCI_USE_OFFEXT
+ mciarect_rc db (SIZE RECT) dup (?)
+endif ;ifdef MCI_USE_OFFEXT
+MCI_ANIM_RECT_PARMS ends
+
+; parameter block for MCI_UPDATE PARMS
+MCI_ANIM_UPDATE_PARMS struc
+ mciaupd_dwCallback dd ?
+ mciaupd_rc db (SIZE RECT) dup (?)
+ mciaupd_hDC dw ?
+MCI_ANIM_UPDATE_PARMS ends
+
+
+;
+; MCI extensions for video overlay devices
+;
+
+; flags for dwFlags parameter of MCI_OPEN command message
+MCI_OVLY_OPEN_WS equ 00010000h
+MCI_OVLY_OPEN_PARENT equ 00020000h
+
+; flags for dwFlags parameter of MCI_STATUS command message
+MCI_OVLY_STATUS_HWND equ 00004001h
+MCI_OVLY_STATUS_STRETCH equ 00004002h
+
+; flags for dwFlags parameter of MCI_INFO command message
+MCI_OVLY_INFO_TEXT equ 00010000h
+
+; flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block
+MCI_OVLY_GETDEVCAPS_CAN_STRETCH equ 00004001h
+MCI_OVLY_GETDEVCAPS_CAN_FREEZE equ 00004002h
+MCI_OVLY_GETDEVCAPS_MAX_WINDOWS equ 00004003h
+
+; flags for dwFlags parameter of MCI_WINDOW command message
+MCI_OVLY_WINDOW_HWND equ 00010000h
+MCI_OVLY_WINDOW_STATE equ 00040000h
+MCI_OVLY_WINDOW_TEXT equ 00080000h
+MCI_OVLY_WINDOW_ENABLE_STRETCH equ 00100000h
+MCI_OVLY_WINDOW_DISABLE_STRETCH equ 00200000h
+
+; flags for hWnd parameter of MCI_OVLY_WINDOW_PARMS parameter block
+MCI_OVLY_WINDOW_DEFAULT equ 00000000h
+
+; flags for dwFlags parameter of MCI_PUT command message
+MCI_OVLY_RECT equ 00010000h
+MCI_OVLY_PUT_SOURCE equ 00020000h
+MCI_OVLY_PUT_DESTINATION equ 00040000h
+MCI_OVLY_PUT_FRAME equ 00080000h
+MCI_OVLY_PUT_VIDEO equ 00100000h
+
+; flags for dwFlags parameter of MCI_WHERE command message
+MCI_OVLY_WHERE_SOURCE equ 00020000h
+MCI_OVLY_WHERE_DESTINATION equ 00040000h
+MCI_OVLY_WHERE_FRAME equ 00080000h
+MCI_OVLY_WHERE_VIDEO equ 00100000h
+
+; parameter block for MCI_OPEN command message
+MCI_OVLY_OPEN_PARMS struc
+ mcioopen_dwCallback dd ?
+ mcioopen_wDeviceID dw ?
+ mcioopen_wReserved0 dw ?
+ mcioopen_lpstrDeviceType dd ?
+ mcioopen_lpstrElementName dd ?
+ mcioopen_lpstrAlias dd ?
+ mcioopen_dwStyle dd ?
+ mcioopen_hWndParent dw ?
+ mcioopen_wReserved1 dw ?
+MCI_OVLY_OPEN_PARMS ends
+
+; parameter block for MCI_WINDOW command message
+MCI_OVLY_WINDOW_PARMS struc
+ mciowin_dwCallback dd ?
+ mciowin_hWnd dw ?
+ mciowin_wReserved1 dw ?
+ mciowin_nCmdShow dw ?
+ mciowin_wReserved2 dw ?
+ mciowin_lpstrText dd ?
+MCI_OVLY_WINDOW_PARMS ends
+
+; parameter block for MCI_PUT, MCI_UPDATE, and MCI_WHERE command messages
+MCI_OVLY_RECT_PARMS struc
+ mciorect_dwCallback dd ?
+ifdef MCI_USE_OFFEXT
+ mciorect_ptOffset db (SIZE POINT) dup (?)
+ mciorect_ptExtent db (SIZE POINT) dup (?)
+else ;ifdef MCI_USE_OFFEXT
+ mciorect_rc db (SIZE RECT) dup (?)
+endif ;ifdef MCI_USE_OFFEXT
+MCI_OVLY_RECT_PARMS ends
+
+; parameter block for MCI_SAVE command message
+MCI_OVLY_SAVE_PARMS struc
+ mciosave_dwCallback dd ?
+ mciosave_lpfilename dd ?
+ mciosave_rc db (SIZE RECT) dup (?)
+MCI_OVLY_SAVE_PARMS ends
+
+; parameter block for MCI_LOAD command message
+MCI_OVLY_LOAD_PARMS struc
+ mcioload_dwCallback dd ?
+ mcioload_lpfilename dd ?
+ mcioload_rc db (SIZE RECT) dup (?)
+MCI_OVLY_LOAD_PARMS ends
+
+endif ;ifndef MMNOMCI
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; DISPLAY Driver extensions
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ifndef C1_TRANSPARENT
+ CAPS1 equ 94 ; other caps
+ C1_TRANSPARENT equ 0001h ; new raster cap
+ NEWTRANSPARENT equ 3 ; use with SetBkMode()
+
+ QUERYROPSUPPORT equ 40 ; use to determine ROP support
+endif ;ifndef C1_TRANSPARENT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; DIB Driver extensions
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+SELECTDIB equ 41 ; DIB.DRV select dib escape
+DIBINDEX MACRO a
+ mov ax,a
+ mov dx,10ffh
+ ENDM
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; ScreenSaver support
+;
+; The current application will receive a syscommand of SC_SCREENSAVE just
+; before the screen saver is invoked. If the app wishes to prevent a
+; screen save, return non-zero value, otherwise call DefWindowProc().
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ifndef SC_SCREENSAVE
+
+ SC_SCREENSAVE equ 0F140h
+
+endif ;ifndef SC_SCREENSAVE
diff --git a/private/oleauto/tools/win16/hdos/c800/include/new.h b/private/oleauto/tools/win16/hdos/c800/include/new.h
new file mode 100644
index 000000000..408e34a0b
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/new.h
@@ -0,0 +1,48 @@
+/***
+*new.h - declarations and definitions for C++ memory allocation functions
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains the function declarations for C++ memory allocation functions.
+*
+****/
+
+#ifndef _INC_NEW
+
+#ifdef __cplusplus
+
+
+/* constants for based heap routines */
+
+#define _NULLSEG ((__segment)0)
+#define _NULLOFF ((void __based(void) *)0xffff)
+
+/* types and structures */
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+typedef int (__cdecl * _PNH)( size_t );
+typedef int (__cdecl * _PNHH)( unsigned long, size_t );
+typedef int (__cdecl * _PNHB)( __segment, size_t );
+
+/* function prototypes */
+
+_PNH __cdecl _set_new_handler( _PNH );
+_PNH __cdecl _set_nnew_handler( _PNH );
+_PNH __cdecl _set_fnew_handler( _PNH );
+_PNHH __cdecl _set_hnew_handler( _PNHH );
+_PNHB __cdecl _set_bnew_handler( _PNHB );
+
+#else
+
+/* handler functions only supported in C++, emit appropriate error */
+#error Functions declared in new.h can only be used in C++ source
+
+#endif
+
+#define _INC_NEW
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/ole.h b/private/oleauto/tools/win16/hdos/c800/include/ole.h
new file mode 100644
index 000000000..37bcf9cad
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/ole.h
@@ -0,0 +1,504 @@
+/*****************************************************************************\
+* *
+* ole.h - Object Linking and Embedding functions, types, and definitions*
+* *
+* Version 1.0 *
+* *
+* NOTE: windows.h must be #included first *
+* *
+* Copyright (c) 1990-1992, Microsoft Corp. All rights reserved.*
+* *
+\*****************************************************************************/
+
+#ifndef _INC_OLE
+#define _INC_OLE
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* !RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+#ifndef WINAPI /* If not included with 3.1 headers... */
+#define WINAPI FAR PASCAL
+#define CALLBACK FAR PASCAL
+#define LPCSTR LPSTR
+#define UINT WORD
+#define LPARAM LONG
+#define WPARAM WORD
+#define LRESULT LONG
+#define HMODULE HANDLE
+#define HINSTANCE HANDLE
+#define HLOCAL HANDLE
+#define HGLOBAL HANDLE
+#endif /* _INC_WINDOWS */
+
+#ifdef STRICT
+#define OLE_LPCSTR LPCSTR
+#define OLE_CONST const
+#else /* STRICT */
+#define OLE_LPCSTR LPSTR
+#define OLE_CONST
+#endif /* !STRICT */
+
+
+/* Object types */
+#define OT_LINK 1L
+#define OT_EMBEDDED 2L
+#define OT_STATIC 3L
+
+/* activate verbs */
+#define OLEVERB_PRIMARY 0
+
+/* target device info structure */
+typedef struct _OLETARGETDEVICE
+{
+ UINT otdDeviceNameOffset;
+ UINT otdDriverNameOffset;
+ UINT otdPortNameOffset;
+ UINT otdExtDevmodeOffset;
+ UINT otdExtDevmodeSize;
+ UINT otdEnvironmentOffset;
+ UINT otdEnvironmentSize;
+ BYTE otdData[1];
+} OLETARGETDEVICE;
+typedef OLETARGETDEVICE FAR* LPOLETARGETDEVICE;
+
+/* flags used in some methods */
+#define OF_SET 0x0001
+#define OF_GET 0x0002
+#define OF_HANDLER 0x0004
+
+/* return codes for OLE functions */
+typedef enum
+{
+ OLE_OK, /* 0 Function operated correctly */
+
+ OLE_WAIT_FOR_RELEASE, /* 1 Command has been initiated, client */
+ /* must wait for release. keep dispatching */
+ /* messages till OLE_RELESE in callback */
+
+ OLE_BUSY, /* 2 Tried to execute a method while another */
+ /* method is in progress. */
+
+ OLE_ERROR_PROTECT_ONLY, /* 3 Ole APIs are called in real mode */
+ OLE_ERROR_MEMORY, /* 4 Could not alloc or lock memory */
+ OLE_ERROR_STREAM, /* 5 (OLESTREAM) stream error */
+ OLE_ERROR_STATIC, /* 6 Non static object expected */
+ OLE_ERROR_BLANK, /* 7 Critical data missing */
+ OLE_ERROR_DRAW, /* 8 Error while drawing */
+ OLE_ERROR_METAFILE, /* 9 Invalid metafile */
+ OLE_ERROR_ABORT, /* 10 Client chose to abort metafile drawing */
+ OLE_ERROR_CLIPBOARD, /* 11 Failed to get/set clipboard data */
+ OLE_ERROR_FORMAT, /* 12 Requested format is not available */
+ OLE_ERROR_OBJECT, /* 13 Not a valid object */
+ OLE_ERROR_OPTION, /* 14 Invalid option(link update / render) */
+ OLE_ERROR_PROTOCOL, /* 15 Invalid protocol */
+ OLE_ERROR_ADDRESS, /* 16 One of the pointers is invalid */
+ OLE_ERROR_NOT_EQUAL, /* 17 Objects are not equal */
+ OLE_ERROR_HANDLE, /* 18 Invalid handle encountered */
+ OLE_ERROR_GENERIC, /* 19 Some general error */
+ OLE_ERROR_CLASS, /* 20 Invalid class */
+ OLE_ERROR_SYNTAX, /* 21 Command syntax is invalid */
+ OLE_ERROR_DATATYPE, /* 22 Data format is not supported */
+ OLE_ERROR_PALETTE, /* 23 Invalid color palette */
+ OLE_ERROR_NOT_LINK, /* 24 Not a linked object */
+ OLE_ERROR_NOT_EMPTY, /* 25 Client doc contains objects. */
+ OLE_ERROR_SIZE, /* 26 Incorrect buffer size passed to the api */
+ /* that places some string in caller's */
+ /* buffer */
+
+ OLE_ERROR_DRIVE, /* 27 Drive letter in doc name is invalid */
+ OLE_ERROR_NETWORK, /* 28 Failed to establish connection to a */
+ /* network share on which the document */
+ /* is located */
+
+ OLE_ERROR_NAME, /* 29 Invalid name(doc name, object name), */
+ /* etc.. passed to the APIs */
+
+ OLE_ERROR_TEMPLATE, /* 30 Server failed to load template */
+ OLE_ERROR_NEW, /* 31 Server failed to create new doc */
+ OLE_ERROR_EDIT, /* 32 Server failed to create embedded */
+ /* instance */
+ OLE_ERROR_OPEN, /* 33 Server failed to open document, */
+ /* possible invalid link */
+
+ OLE_ERROR_NOT_OPEN, /* 34 Object is not open for editing */
+ OLE_ERROR_LAUNCH, /* 35 Failed to launch server */
+ OLE_ERROR_COMM, /* 36 Failed to communicate with server */
+ OLE_ERROR_TERMINATE, /* 37 Error in termination */
+ OLE_ERROR_COMMAND, /* 38 Error in execute */
+ OLE_ERROR_SHOW, /* 39 Error in show */
+ OLE_ERROR_DOVERB, /* 40 Error in sending do verb, or invalid */
+ /* verb */
+ OLE_ERROR_ADVISE_NATIVE, /* 41 Item could be missing */
+ OLE_ERROR_ADVISE_PICT, /* 42 Item could be missing or server doesn't */
+ /* this format. */
+
+ OLE_ERROR_ADVISE_RENAME, /* 43 Server doesn't support rename */
+ OLE_ERROR_POKE_NATIVE, /* 44 Failure of poking native data to server */
+ OLE_ERROR_REQUEST_NATIVE, /* 45 Server failed to render native data */
+ OLE_ERROR_REQUEST_PICT, /* 46 Server failed to render presentation */
+ /* data */
+ OLE_ERROR_SERVER_BLOCKED, /* 47 Trying to block a blocked server or */
+ /* trying to revoke a blocked server */
+ /* or document */
+
+ OLE_ERROR_REGISTRATION, /* 48 Server is not registered in regestation */
+ /* data base */
+ OLE_ERROR_ALREADY_REGISTERED,/*49 Trying to register same doc multiple */
+ /* times */
+ OLE_ERROR_TASK, /* 50 Server or client task is invalid */
+ OLE_ERROR_OUTOFDATE, /* 51 Object is out of date */
+ OLE_ERROR_CANT_UPDATE_CLIENT,/* 52 Embed doc's client doesn't accept */
+ /* updates */
+ OLE_ERROR_UPDATE, /* 53 erorr while trying to update */
+ OLE_ERROR_SETDATA_FORMAT, /* 54 Server app doesn't understand the */
+ /* format given to its SetData method */
+ OLE_ERROR_STATIC_FROM_OTHER_OS,/* 55 trying to load a static object created */
+ /* on another Operating System */
+
+ /* Following are warnings */
+ OLE_WARN_DELETE_DATA = 1000 /* Caller must delete the data when he is */
+ /* done with it. */
+} OLESTATUS;
+
+
+
+/* Codes for CallBack events */
+typedef enum
+{
+ OLE_CHANGED, /* 0 */
+ OLE_SAVED, /* 1 */
+ OLE_CLOSED, /* 2 */
+ OLE_RENAMED, /* 3 */
+ OLE_QUERY_PAINT, /* 4 Interruptible paint support */
+ OLE_RELEASE, /* 5 Object is released(asynchronous operation */
+ /* is completed) */
+ OLE_QUERY_RETRY /* 6 Query for retry when server sends busy ACK */
+} OLE_NOTIFICATION;
+
+typedef enum
+{
+ OLE_NONE, /* 0 no method active */
+ OLE_DELETE, /* 1 object delete */
+ OLE_LNKPASTE, /* 2 PasteLink(auto reconnect) */
+ OLE_EMBPASTE, /* 3 paste(and update) */
+ OLE_SHOW, /* 4 Show */
+ OLE_RUN, /* 5 Run */
+ OLE_ACTIVATE, /* 6 Activate */
+ OLE_UPDATE, /* 7 Update */
+ OLE_CLOSE, /* 8 Close */
+ OLE_RECONNECT, /* 9 Reconnect */
+ OLE_SETUPDATEOPTIONS, /* 10 setting update options */
+ OLE_SERVERUNLAUNCH, /* 11 server is being unlaunched */
+ OLE_LOADFROMSTREAM, /* 12 LoadFromStream(auto reconnect) */
+ OLE_SETDATA, /* 13 OleSetData */
+ OLE_REQUESTDATA, /* 14 OleRequestData */
+ OLE_OTHER, /* 15 other misc async operations */
+ OLE_CREATE, /* 16 create */
+ OLE_CREATEFROMTEMPLATE, /* 17 CreatefromTemplate */
+ OLE_CREATELINKFROMFILE, /* 18 CreateLinkFromFile */
+ OLE_COPYFROMLNK, /* 19 CopyFromLink(auto reconnect) */
+ OLE_CREATEFROMFILE, /* 20 CreateFromFile */
+ OLE_CREATEINVISIBLE /* 21 CreateInvisible */
+} OLE_RELEASE_METHOD;
+
+/* rendering options */
+typedef enum
+{
+ olerender_none,
+ olerender_draw,
+ olerender_format
+} OLEOPT_RENDER;
+
+/* standard clipboard format type */
+typedef WORD OLECLIPFORMAT;
+
+/* Link update options */
+typedef enum
+{
+ oleupdate_always,
+ oleupdate_onsave,
+#ifndef OLE_INTERNAL
+ oleupdate_oncall
+#else
+ oleupdate_oncall,
+ oleupdate_onclose
+#endif /* OLE_INTERNAL */
+} OLEOPT_UPDATE;
+
+typedef HANDLE HOBJECT;
+typedef LONG LHSERVER;
+typedef LONG LHCLIENTDOC;
+typedef LONG LHSERVERDOC;
+
+typedef struct _OLEOBJECT FAR* LPOLEOBJECT;
+typedef struct _OLESTREAM FAR* LPOLESTREAM;
+typedef struct _OLECLIENT FAR* LPOLECLIENT;
+
+
+#ifndef OLE_INTERNAL
+/* object method table definitions. */
+typedef struct _OLEOBJECTVTBL
+{
+ void FAR* (CALLBACK* QueryProtocol) (LPOLEOBJECT, OLE_LPCSTR);
+ OLESTATUS (CALLBACK* Release) (LPOLEOBJECT);
+ OLESTATUS (CALLBACK* Show) (LPOLEOBJECT, BOOL);
+ OLESTATUS (CALLBACK* DoVerb) (LPOLEOBJECT, UINT, BOOL, BOOL);
+ OLESTATUS (CALLBACK* GetData) (LPOLEOBJECT, OLECLIPFORMAT, HANDLE FAR*);
+ OLESTATUS (CALLBACK* SetData) (LPOLEOBJECT, OLECLIPFORMAT, HANDLE);
+ OLESTATUS (CALLBACK* SetTargetDevice) (LPOLEOBJECT, HGLOBAL);
+ OLESTATUS (CALLBACK* SetBounds) (LPOLEOBJECT, OLE_CONST RECT FAR*);
+ OLECLIPFORMAT (CALLBACK* EnumFormats) (LPOLEOBJECT, OLECLIPFORMAT);
+ OLESTATUS (CALLBACK* SetColorScheme) (LPOLEOBJECT, OLE_CONST LOGPALETTE FAR*);
+ /* Server has to implement only the above methods. */
+
+#ifndef SERVERONLY
+ /* Extra methods required for client. */
+ OLESTATUS (CALLBACK* Delete) (LPOLEOBJECT);
+ OLESTATUS (CALLBACK* SetHostNames) (LPOLEOBJECT, OLE_LPCSTR, OLE_LPCSTR);
+ OLESTATUS (CALLBACK* SaveToStream) (LPOLEOBJECT, LPOLESTREAM);
+ OLESTATUS (CALLBACK* Clone) (LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, OLE_LPCSTR, LPOLEOBJECT FAR*);
+ OLESTATUS (CALLBACK* CopyFromLink) (LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, OLE_LPCSTR, LPOLEOBJECT FAR*);
+ OLESTATUS (CALLBACK* Equal) (LPOLEOBJECT, LPOLEOBJECT);
+ OLESTATUS (CALLBACK* CopyToClipboard) (LPOLEOBJECT);
+ OLESTATUS (CALLBACK* Draw) (LPOLEOBJECT, HDC, OLE_CONST RECT FAR*, OLE_CONST RECT FAR*, HDC);
+ OLESTATUS (CALLBACK* Activate) (LPOLEOBJECT, UINT, BOOL, BOOL, HWND, OLE_CONST RECT FAR*);
+ OLESTATUS (CALLBACK* Execute) (LPOLEOBJECT, HGLOBAL, UINT);
+ OLESTATUS (CALLBACK* Close) (LPOLEOBJECT);
+ OLESTATUS (CALLBACK* Update) (LPOLEOBJECT);
+ OLESTATUS (CALLBACK* Reconnect) (LPOLEOBJECT);
+
+ OLESTATUS (CALLBACK* ObjectConvert) (LPOLEOBJECT, OLE_LPCSTR, LPOLECLIENT, LHCLIENTDOC, OLE_LPCSTR, LPOLEOBJECT FAR*);
+ OLESTATUS (CALLBACK* GetLinkUpdateOptions) (LPOLEOBJECT, OLEOPT_UPDATE FAR*);
+ OLESTATUS (CALLBACK* SetLinkUpdateOptions) (LPOLEOBJECT, OLEOPT_UPDATE);
+
+ OLESTATUS (CALLBACK* Rename) (LPOLEOBJECT, OLE_LPCSTR);
+ OLESTATUS (CALLBACK* QueryName) (LPOLEOBJECT, LPSTR, UINT FAR*);
+
+ OLESTATUS (CALLBACK* QueryType) (LPOLEOBJECT, LONG FAR*);
+ OLESTATUS (CALLBACK* QueryBounds) (LPOLEOBJECT, RECT FAR*);
+ OLESTATUS (CALLBACK* QuerySize) (LPOLEOBJECT, DWORD FAR*);
+ OLESTATUS (CALLBACK* QueryOpen) (LPOLEOBJECT);
+ OLESTATUS (CALLBACK* QueryOutOfDate) (LPOLEOBJECT);
+
+ OLESTATUS (CALLBACK* QueryReleaseStatus) (LPOLEOBJECT);
+ OLESTATUS (CALLBACK* QueryReleaseError) (LPOLEOBJECT);
+ OLE_RELEASE_METHOD (CALLBACK* QueryReleaseMethod)(LPOLEOBJECT);
+
+ OLESTATUS (CALLBACK* RequestData) (LPOLEOBJECT, OLECLIPFORMAT);
+ OLESTATUS (CALLBACK* ObjectLong) (LPOLEOBJECT, UINT, LONG FAR*);
+
+/* This method is internal only */
+ OLESTATUS (CALLBACK* ChangeData) (LPOLEOBJECT, HANDLE, LPOLECLIENT, BOOL);
+#endif /* !SERVERONLY */
+} OLEOBJECTVTBL;
+typedef OLEOBJECTVTBL FAR* LPOLEOBJECTVTBL;
+
+typedef struct _OLEOBJECT
+{
+ LPOLEOBJECTVTBL lpvtbl;
+} OLEOBJECT;
+#endif /* !OLE_NTERNAL */
+
+/* ole client definitions */
+typedef struct _OLECLIENTVTBL
+{
+ int (CALLBACK* CallBack)(LPOLECLIENT, OLE_NOTIFICATION, LPOLEOBJECT);
+} OLECLIENTVTBL;
+
+typedef OLECLIENTVTBL FAR* LPOLECLIENTVTBL;
+
+typedef struct _OLECLIENT
+{
+ LPOLECLIENTVTBL lpvtbl;
+} OLECLIENT;
+
+/* Stream definitions */
+typedef struct _OLESTREAMVTBL
+{
+ DWORD (CALLBACK* Get)(LPOLESTREAM, void FAR*, DWORD);
+ DWORD (CALLBACK* Put)(LPOLESTREAM, OLE_CONST void FAR*, DWORD);
+} OLESTREAMVTBL;
+typedef OLESTREAMVTBL FAR* LPOLESTREAMVTBL;
+
+typedef struct _OLESTREAM
+{
+ LPOLESTREAMVTBL lpstbl;
+} OLESTREAM;
+
+/* Public Function Prototypes */
+OLESTATUS WINAPI OleDelete(LPOLEOBJECT);
+OLESTATUS WINAPI OleRelease(LPOLEOBJECT);
+OLESTATUS WINAPI OleSaveToStream(LPOLEOBJECT, LPOLESTREAM);
+OLESTATUS WINAPI OleEqual(LPOLEOBJECT, LPOLEOBJECT );
+OLESTATUS WINAPI OleCopyToClipboard(LPOLEOBJECT);
+OLESTATUS WINAPI OleSetHostNames(LPOLEOBJECT, LPCSTR, LPCSTR);
+OLESTATUS WINAPI OleSetTargetDevice(LPOLEOBJECT, HGLOBAL);
+OLESTATUS WINAPI OleSetBounds(LPOLEOBJECT, const RECT FAR*);
+OLESTATUS WINAPI OleSetColorScheme(LPOLEOBJECT, const LOGPALETTE FAR*);
+OLESTATUS WINAPI OleQueryBounds(LPOLEOBJECT, RECT FAR*);
+OLESTATUS WINAPI OleQuerySize(LPOLEOBJECT, DWORD FAR*);
+OLESTATUS WINAPI OleDraw(LPOLEOBJECT, HDC, const RECT FAR*, const RECT FAR*, HDC);
+OLESTATUS WINAPI OleQueryOpen(LPOLEOBJECT);
+OLESTATUS WINAPI OleActivate(LPOLEOBJECT, UINT, BOOL, BOOL, HWND, const RECT FAR*);
+OLESTATUS WINAPI OleExecute(LPOLEOBJECT, HGLOBAL, UINT);
+OLESTATUS WINAPI OleClose(LPOLEOBJECT);
+OLESTATUS WINAPI OleUpdate(LPOLEOBJECT);
+OLESTATUS WINAPI OleReconnect(LPOLEOBJECT);
+OLESTATUS WINAPI OleGetLinkUpdateOptions(LPOLEOBJECT, OLEOPT_UPDATE FAR*);
+OLESTATUS WINAPI OleSetLinkUpdateOptions(LPOLEOBJECT, OLEOPT_UPDATE);
+void FAR* WINAPI OleQueryProtocol(LPOLEOBJECT, LPCSTR);
+
+/* Routines related to asynchronous operations. */
+OLESTATUS WINAPI OleQueryReleaseStatus(LPOLEOBJECT);
+OLESTATUS WINAPI OleQueryReleaseError(LPOLEOBJECT);
+OLE_RELEASE_METHOD WINAPI OleQueryReleaseMethod(LPOLEOBJECT);
+
+OLESTATUS WINAPI OleQueryType(LPOLEOBJECT, LONG FAR*);
+
+/* LOWORD is major version, HIWORD is minor version */
+DWORD WINAPI OleQueryClientVersion(void);
+DWORD WINAPI OleQueryServerVersion(void);
+
+/* Converting to format (as in clipboard): */
+OLECLIPFORMAT WINAPI OleEnumFormats(LPOLEOBJECT, OLECLIPFORMAT);
+OLESTATUS WINAPI OleGetData(LPOLEOBJECT, OLECLIPFORMAT, HANDLE FAR*);
+OLESTATUS WINAPI OleSetData(LPOLEOBJECT, OLECLIPFORMAT, HANDLE);
+OLESTATUS WINAPI OleQueryOutOfDate(LPOLEOBJECT);
+OLESTATUS WINAPI OleRequestData(LPOLEOBJECT, OLECLIPFORMAT);
+
+/* Query apis for creation from clipboard */
+OLESTATUS WINAPI OleQueryLinkFromClip(LPCSTR, OLEOPT_RENDER, OLECLIPFORMAT);
+OLESTATUS WINAPI OleQueryCreateFromClip(LPCSTR, OLEOPT_RENDER, OLECLIPFORMAT);
+
+/* Object creation functions */
+OLESTATUS WINAPI OleCreateFromClip(LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateLinkFromClip(LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateFromFile(LPCSTR, LPOLECLIENT, LPCSTR, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateLinkFromFile(LPCSTR, LPOLECLIENT, LPCSTR, LPCSTR, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
+OLESTATUS WINAPI OleLoadFromStream(LPOLESTREAM, LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*);
+OLESTATUS WINAPI OleCreate(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
+OLESTATUS WINAPI OleCreateInvisible(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT, BOOL);
+OLESTATUS WINAPI OleCreateFromTemplate(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
+OLESTATUS WINAPI OleClone(LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*);
+OLESTATUS WINAPI OleCopyFromLink(LPOLEOBJECT, LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*);
+OLESTATUS WINAPI OleObjectConvert(LPOLEOBJECT, LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*);
+OLESTATUS WINAPI OleRename(LPOLEOBJECT, LPCSTR);
+OLESTATUS WINAPI OleQueryName(LPOLEOBJECT, LPSTR, UINT FAR*);
+OLESTATUS WINAPI OleRevokeObject(LPOLECLIENT);
+BOOL WINAPI OleIsDcMeta(HDC);
+
+/* client document API */
+OLESTATUS WINAPI OleRegisterClientDoc(LPCSTR, LPCSTR, LONG, LHCLIENTDOC FAR*);
+OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC);
+OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC, LPCSTR);
+OLESTATUS WINAPI OleRevertClientDoc(LHCLIENTDOC);
+OLESTATUS WINAPI OleSavedClientDoc(LHCLIENTDOC);
+OLESTATUS WINAPI OleEnumObjects(LHCLIENTDOC, LPOLEOBJECT FAR*);
+
+/* server usage definitions */
+typedef enum {
+ OLE_SERVER_MULTI, /* multiple instances */
+ OLE_SERVER_SINGLE /* single instance(multiple document) */
+} OLE_SERVER_USE;
+
+/* Server API */
+typedef struct _OLESERVER FAR* LPOLESERVER;
+
+OLESTATUS WINAPI OleRegisterServer(LPCSTR, LPOLESERVER, LHSERVER FAR*, HINSTANCE, OLE_SERVER_USE);
+OLESTATUS WINAPI OleRevokeServer(LHSERVER);
+OLESTATUS WINAPI OleBlockServer(LHSERVER);
+OLESTATUS WINAPI OleUnblockServer(LHSERVER, BOOL FAR*);
+
+/* APIs to keep server open */
+OLESTATUS WINAPI OleLockServer(LPOLEOBJECT, LHSERVER FAR*);
+OLESTATUS WINAPI OleUnlockServer(LHSERVER);
+
+/* Server document API */
+
+typedef struct _OLESERVERDOC FAR* LPOLESERVERDOC;
+
+OLESTATUS WINAPI OleRegisterServerDoc(LHSERVER, LPCSTR, LPOLESERVERDOC, LHSERVERDOC FAR*);
+OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC);
+OLESTATUS WINAPI OleRenameServerDoc(LHSERVERDOC, LPCSTR);
+OLESTATUS WINAPI OleRevertServerDoc(LHSERVERDOC);
+OLESTATUS WINAPI OleSavedServerDoc(LHSERVERDOC);
+
+typedef struct _OLESERVERVTBL
+{
+ OLESTATUS (CALLBACK* Open) (LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, LPOLESERVERDOC FAR*);
+ /* long handle to doc(privtate to DLL) */
+ /* lp to OLESERVER */
+ /* document name */
+ /* place holder for returning oledoc. */
+
+ OLESTATUS (CALLBACK* Create)(LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR, LPOLESERVERDOC FAR*);
+ /* long handle to doc(privtate to DLL) */
+ /* lp to OLESERVER */
+ /* lp class name */
+ /* lp doc name */
+ /* place holder for returning oledoc. */
+
+ OLESTATUS (CALLBACK* CreateFromTemplate)(LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR, OLE_LPCSTR, LPOLESERVERDOC FAR*);
+ /* long handle to doc(privtate to DLL) */
+ /* lp to OLESERVER */
+ /* lp class name */
+ /* lp doc name */
+ /* lp template name */
+ /* place holder for returning oledoc. */
+
+ OLESTATUS (CALLBACK* Edit) (LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR, LPOLESERVERDOC FAR*);
+ /* long handle to doc(privtate to DLL) */
+ /* lp to OLESERVER */
+ /* lp class name */
+ /* lp doc name */
+ /* place holder for returning oledoc. */
+
+ OLESTATUS (CALLBACK* Exit) (LPOLESERVER);
+ /* lp OLESERVER */
+
+ OLESTATUS (CALLBACK* Release) (LPOLESERVER);
+ /* lp OLESERVER */
+
+ OLESTATUS (CALLBACK* Execute)(LPOLESERVER, HGLOBAL);
+ /* lp OLESERVER */
+ /* handle to command strings */
+} OLESERVERVTBL;
+typedef OLESERVERVTBL FAR* LPOLESERVERVTBL;
+
+typedef struct _OLESERVER
+{
+ LPOLESERVERVTBL lpvtbl;
+} OLESERVER;
+
+typedef struct _OLESERVERDOCVTBL
+{
+ OLESTATUS (CALLBACK* Save) (LPOLESERVERDOC);
+ OLESTATUS (CALLBACK* Close) (LPOLESERVERDOC);
+ OLESTATUS (CALLBACK* SetHostNames)(LPOLESERVERDOC, OLE_LPCSTR, OLE_LPCSTR);
+ OLESTATUS (CALLBACK* SetDocDimensions)(LPOLESERVERDOC, OLE_CONST RECT FAR*);
+ OLESTATUS (CALLBACK* GetObject) (LPOLESERVERDOC, OLE_LPCSTR, LPOLEOBJECT FAR*, LPOLECLIENT);
+ OLESTATUS (CALLBACK* Release) (LPOLESERVERDOC);
+ OLESTATUS (CALLBACK* SetColorScheme)(LPOLESERVERDOC, OLE_CONST LOGPALETTE FAR*);
+ OLESTATUS (CALLBACK* Execute) (LPOLESERVERDOC, HGLOBAL);
+} OLESERVERDOCVTBL;
+typedef OLESERVERDOCVTBL FAR* LPOLESERVERDOCVTBL;
+
+typedef struct _OLESERVERDOC
+{
+ LPOLESERVERDOCVTBL lpvtbl;
+} OLESERVERDOC;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* !RC_INVOKED */
+
+#endif /* !_INC_OLE */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/ostream.h b/private/oleauto/tools/win16/hdos/c800/include/ostream.h
new file mode 100644
index 000000000..799885115
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/ostream.h
@@ -0,0 +1,129 @@
+/***
+*ostream.h - definitions/declarations for the ostream class
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the ostream class.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_OSTREAM
+#define _INC_OSTREAM
+
+#include <ios.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+#ifdef M_I86HM
+#define _HFAR_ __far
+#else
+#define _HFAR_
+#endif
+
+typedef long streamoff, streampos;
+
+class ostream : virtual public ios {
+
+public:
+ ostream(streambuf*);
+ virtual ~ostream();
+
+ ostream& flush();
+ int opfx();
+ void osfx();
+
+inline ostream& operator<<(ostream& (*f)(ostream&));
+inline ostream& operator<<(ios& (*f)(ios&));
+ ostream& operator<<(const char _HFAR_ *);
+inline ostream& operator<<(const unsigned char _HFAR_ *);
+inline ostream& operator<<(const signed char _HFAR_ *);
+inline ostream& operator<<(char);
+ ostream& operator<<(unsigned char);
+inline ostream& operator<<(signed char);
+ ostream& operator<<(short);
+ ostream& operator<<(unsigned short);
+ ostream& operator<<(int);
+ ostream& operator<<(unsigned int);
+ ostream& operator<<(long);
+ ostream& operator<<(unsigned long);
+inline ostream& operator<<(float);
+ ostream& operator<<(double);
+ ostream& operator<<(long double);
+ ostream& operator<<(const void _HFAR_ *);
+ ostream& operator<<(streambuf*);
+inline ostream& put(char);
+ ostream& put(unsigned char);
+inline ostream& put(signed char);
+ ostream& write(const char _HFAR_ *,int);
+inline ostream& write(const unsigned char _HFAR_ *,int);
+inline ostream& write(const signed char _HFAR_ *,int);
+ ostream& seekp(streampos);
+ ostream& seekp(streamoff,ios::seek_dir);
+ streampos tellp();
+
+protected:
+ ostream();
+ ostream(const ostream&); // treat as private
+ ostream& operator=(streambuf*); // treat as private
+ ostream& operator=(const ostream& _os) {return operator=(_os.rdbuf()); }
+ int do_opfx(int); // not used
+ void do_osfx(); // not used
+
+private:
+ ostream(ios&);
+ ostream& writepad(const char _HFAR_ *, const char _HFAR_ *);
+ int x_floatused;
+};
+
+inline ostream& ostream::operator<<(ostream& (*f)(ostream&)) { (*f)(*this); return *this; }
+inline ostream& ostream::operator<<(ios& (*f)(ios& )) { (*f)(*this); return *this; }
+
+inline ostream& ostream::operator<<(char c) { return operator<<((unsigned char) c); }
+inline ostream& ostream::operator<<(signed char c) { return operator<<((unsigned char) c); }
+
+inline ostream& ostream::operator<<(const unsigned char _HFAR_ * s) { return operator<<((const char _HFAR_ *) s); }
+inline ostream& ostream::operator<<(const signed char _HFAR_ * s) { return operator<<((const char _HFAR_ *) s); }
+
+inline ostream& ostream::operator<<(float f) { x_floatused = 1; return operator<<((double) f); }
+
+inline ostream& ostream::put(char c) { return put((unsigned char) c); }
+inline ostream& ostream::put(signed char c) { return put((unsigned char) c); }
+
+inline ostream& ostream::write(const unsigned char _HFAR_ * s, int n) { return write((char _HFAR_ *) s, n); }
+inline ostream& ostream::write(const signed char _HFAR_ * s, int n) { return write((char _HFAR_ *) s, n); }
+
+
+class ostream_withassign : public ostream {
+ public:
+ ostream_withassign();
+ ostream_withassign(streambuf* _is);
+ ~ostream_withassign();
+ ostream& operator=(const ostream& _os) { return ostream::operator=(_os.rdbuf()); }
+ ostream& operator=(streambuf* _sb) { return ostream::operator=(_sb); }
+};
+
+#ifndef _WINDLL
+extern ostream_withassign cout;
+extern ostream_withassign cerr;
+extern ostream_withassign clog;
+#endif
+
+inline ostream& flush(ostream& _outs) { return _outs.flush(); }
+inline ostream& endl(ostream& _outs) { return _outs << '\n' << flush; }
+inline ostream& ends(ostream& _outs) { return _outs << char('\0'); }
+
+ios& dec(ios&);
+ios& hex(ios&);
+ios& oct(ios&);
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/penwin.h b/private/oleauto/tools/win16/hdos/c800/include/penwin.h
new file mode 100644
index 000000000..fbe2d112e
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/penwin.h
@@ -0,0 +1,818 @@
+/*****************************************************************************\
+* *
+* penwin.h - Pen Windows functions, types, and definitions *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_WINDOWS
+#include <windows.h> /* <windows.h> must be pre-included */
+#endif /* _INC_WINDOWS */
+
+#ifndef _INC_PENWIN /* prevent multiple includes */
+#define _INC_PENWIN
+
+#ifndef RC_INVOKED
+#pragma pack(1)
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/****** General Pen Windows Definitions *************************************/
+
+typedef int REC;
+typedef LONG SYV;
+typedef SYV FAR *LPSYV;
+typedef HANDLE HREC;
+typedef int CL;
+typedef LONG ALC;
+typedef UINT HKP;
+typedef int (CALLBACK * LPDF)(int, LPVOID, LPVOID, int, DWORD, DWORD);
+
+#define BITPENUP 0x8000
+#define FPenUpX(x) (((x) & BITPENUP)!=0)
+
+/* Default pen cursor to indicate writing, points northwest */
+#define IDC_PEN MAKEINTRESOURCE(32631)
+
+/* alternate select cursor: upsidedown standard arrow, points southeast */
+#define IDC_ALTSELECT MAKEINTRESOURCE(32501)
+
+#define RC_WDEFAULT (0xFFFF)
+#define RC_LDEFAULT (0xFFFFFFFFL)
+#define RC_WDEFAULTFLAGS (0x8000)
+#define RC_LDEFAULTFLAGS (0x80000000L)
+
+/* HIWORD(SYV) defines and detection macros */
+
+#define SYVHI_SPECIAL 0
+#define FIsSpecial(syv) (HIWORD((syv))==SYVHI_SPECIAL)
+#define SYVHI_ANSI 1
+#define FIsAnsi(syv) (HIWORD((syv))==SYVHI_ANSI)
+#define SYVHI_GESTURE 2
+#define FIsGesture(syv) (HIWORD((syv))==SYVHI_GESTURE)
+#define SYVHI_KANJI 3
+#define FIsKanji(syv) (HIWORD((syv))==SYVHI_KANJI)
+#define SYVHI_SHAPE 4
+#define FIsShape(syv) (HIWORD((syv))==SYVHI_SHAPE)
+#define SYVHI_UNICODE 5
+#define FIsUniCode(syv) (HIWORD((syv))==SYVHI_UNICODE)
+#define SYVHI_VKEY 6
+#define FIsVKey(syv) (HIWORD((syv))==SYVHI_VKEY)
+
+/* Macros to convert between SYV and ANSI */
+
+#define ChSyvToAnsi(syv) ((BYTE) (LOBYTE(LOWORD((syv)))))
+#define SyvCharacterToSymbol(c) ((LONG)(unsigned char)(c) | 0x00010000)
+#define SyvKanjiToSymbol(c) ((LONG)(WORD)(c) | 0x00030000)
+
+/* SYV values with special meanings to Pen Windows */
+
+#define SYV_NULL 0x00000000L
+#define SYV_UNKNOWN 0x00000001L
+#define SYV_EMPTY 0x00000003L
+#define SYV_BEGINOR 0x00000010L
+#define SYV_ENDOR 0x00000011L
+#define SYV_OR 0x00000012L
+#define SYV_SOFTNEWLINE 0x00000020L
+#define SYV_SPACENULL SyvCharacterToSymbol('\0')
+
+/* SYV values for gestures (map into UNICODE space) */
+
+#define SYV_KKCONVERT 0x0002FFD4L
+#define SYV_CLEAR 0x0002FFD5L
+#define SYV_EXTENDSELECT 0x0002FFD8L
+#define SYV_UNDO 0x0002FFD9L
+#define SYV_COPY 0x0002FFDAL
+#define SYV_CUT 0x0002FFDBL
+#define SYV_PASTE 0x0002FFDCL
+#define SYV_CLEARWORD 0x0002FFDDL
+#define SYV_USER 0x0002FFDEL /* ;Reserved */
+#define SYV_CORRECT 0x0002FFDFL
+
+#define SYV_BACKSPACE 0x00020008L
+#define SYV_TAB 0x00020009L
+#define SYV_RETURN 0x0002000DL
+#define SYV_SPACE 0x00020020L
+
+#define FIsStdGesture(syv) \
+ ((syv) == SYV_CLEAR \
+ || (syv) == SYV_EXTENDSELECT\
+ || (syv) == SYV_UNDO \
+ || (syv) == SYV_COPY \
+ || (syv) == SYV_CUT \
+ || (syv) == SYV_PASTE \
+ || (syv) == SYV_CLEARWORD \
+ || (syv) == SYV_KKCONVERT \
+ || (syv) == SYV_USER \
+ || (syv) == SYV_CORRECT)
+
+#define FIsAnsiGesture(syv) \
+ ((syv) == SYV_BACKSPACE \
+ || (syv) == SYV_TAB \
+ || (syv) == SYV_RETURN \
+ || (syv) == SYV_SPACE)
+
+/* Application specific gestures, Circle a-z and Circle A-Z */
+
+#define SYV_APPGESTUREMASK 0x00020000L
+#define SYV_CIRCLEUPA 0x000224B6L
+#define SYV_CIRCLEUPZ 0x000224CFL
+#define SYV_CIRCLELOA 0x000224D0L
+#define SYV_CIRCLELOZ 0x000224E9L
+
+/* Gesture Macros */
+
+#define FIsLoAppGesture(syv) (syv >= SYV_CIRCLELOA && syv <= SYV_CIRCLELOZ)
+#define FIsUpAppGesture(syv) (syv >= SYV_CIRCLEUPA && syv <= SYV_CIRCLEUPZ)
+#define FIsAppGesture(syv) (syv>=SYV_CIRCLEUPA && syv<=SYV_CIRCLELOZ)
+
+#define SyvAppGestureFromLoAnsi(ansi) ((DWORD)(BYTE)ansi- 'a' + SYV_CIRCLELOA)
+#define SyvAppGestureFromUpAnsi(ansi) ((DWORD)(BYTE)ansi- 'A' + SYV_CIRCLEUPA)
+#define AnsiFromSyvAppGesture(syv) ChSyvToAnsi( \
+ syv-(FIsUpAppGesture(syv)? SYV_CIRCLEUPA-(SYV)'A': SYV_CIRCLELOA-(SYV)'a'))
+
+/* SYV definitions for shapes */
+
+#define SYV_SHAPELINE 0x00040001L
+#define SYV_SHAPEELLIPSE 0x00040002L
+#define SYV_SHAPERECT 0x00040003L
+#define SYV_SHAPEMIN SYV_SHAPELINE
+#define SYV_SHAPEMAX SYV_SHAPERECT
+
+/****** Recognition Error Codes *********************************************/
+
+#define REC_OEM (-1024)
+#define REC_LANGUAGE (-48)
+#define REC_GUIDE (-47)
+#define REC_PARAMERROR (-46)
+#define REC_INVALIDREF (-45)
+#define REC_RECTEXCLUDE (-44)
+#define REC_RECTBOUND (-43)
+#define REC_PCM (-42)
+#define REC_RESULTMODE (-41)
+#define REC_HWND (-40)
+#define REC_ALC (-39)
+#define REC_ERRORLEVEL (-38)
+#define REC_CLVERIFY (-37)
+#define REC_DICT (-36)
+#define REC_HREC (-35)
+#define REC_BADEVENTREF (-33)
+#define REC_NOCOLLECTION (-32)
+
+#define REC_DEBUG (-32)
+
+#define REC_POINTEREVENT (-31)
+#define REC_BADHPENDATA (-9)
+#define REC_OOM (-8)
+#define REC_NOINPUT (-7)
+#define REC_NOTABLET (-6)
+#define REC_BUSY (-5)
+#define REC_BUFFERTOOSMALL (-4)
+#define REC_ABORT (-3)
+
+#define REC_OVERFLOW (-1)
+
+#define REC_OK 0
+#define REC_TERMBOUND 1
+#define REC_TERMEX 2
+#define REC_TERMPENUP 3
+#define REC_TERMRANGE 4
+#define REC_TERMTIMEOUT 5
+#define REC_DONE 6
+#define REC_TERMOEM 512
+
+/****** Pen Driver Structures and Entry points ******************************/
+
+typedef struct tagOEMPENINFO
+ {
+ UINT wPdt;
+ UINT wValueMax;
+ UINT wDistinct;
+ }
+ OEMPENINFO, FAR *LPOEMPENINFO;
+
+#define PDT_NULL 0
+#define PDT_PRESSURE 1
+#define PDT_HEIGHT 2
+#define PDT_ANGLEXY 3
+#define PDT_ANGLEZ 4
+#define PDT_BARRELROTATION 5
+#define PDT_OEMSPECIFIC 16
+
+#define MAXOEMDATAWORDS 6
+
+typedef struct tagPENPACKET
+ {
+ UINT wTabletX;
+ UINT wTabletY;
+ UINT wPDK;
+ UINT rgwOemData[MAXOEMDATAWORDS];
+ }
+ PENPACKET, FAR *LPPENPACKET;
+
+typedef BOOL (CALLBACK * LPFNRAWHOOK)(LPPENPACKET);
+
+typedef struct tagPENINFO
+ {
+ UINT cxRawWidth;
+ UINT cyRawHeight;
+ UINT wDistinctWidth;
+ UINT wDistinctHeight;
+ int nSamplingRate;
+ int nSamplingDist;
+ LONG lPdc;
+ int cPens;
+ int cbOemData;
+ OEMPENINFO rgoempeninfo[MAXOEMDATAWORDS];
+ UINT rgwReserved[8];
+ }
+ PENINFO, FAR *LPPENINFO;
+
+#define PDC_INTEGRATED 0x00000001L
+#define PDC_PROXIMITY 0x00000002L
+#define PDC_RANGE 0x00000004L
+#define PDC_INVERT 0x00000008L
+#define PDC_RELATIVE 0x00000010L
+#define PDC_BARREL1 0x00000020L
+#define PDC_BARREL2 0x00000040L
+#define PDC_BARREL3 0x00000080L
+
+typedef struct tagSTROKEINFO
+ {
+ UINT cPnt;
+ UINT cbPnts;
+ UINT wPdk;
+ DWORD dwTick;
+ }
+ STROKEINFO, FAR *LPSTROKEINFO;
+
+typedef struct tagCALBSTRUCT
+ {
+ int wOffsetX;
+ int wOffsetY;
+ int wDistinctWidth;
+ int wDistinctHeight;
+ }
+ CALBSTRUCT, FAR *LPCALBSTRUCT;
+
+/****** DRV_ values for pen driver specific messages ************************/
+
+#define DRV_SetPenDriverEntryPoints DRV_RESERVED+1
+#define DRV_RemovePenDriverEntryPoints DRV_RESERVED+2
+#define DRV_SetPenSamplingRate DRV_RESERVED+3
+#define DRV_SetPenSamplingDist DRV_RESERVED+4
+#define DRV_GetName DRV_RESERVED+5
+#define DRV_GetVersion DRV_RESERVED+6
+#define DRV_GetPenInfo DRV_RESERVED+7
+#define DRV_GetCalibration DRV_RESERVED+11
+#define DRV_SetCalibration DRV_RESERVED+12
+
+VOID WINAPI UpdatePenInfo(LPPENINFO);
+BOOL WINAPI EndPenCollection(REC);
+REC WINAPI GetPenHwData(LPPOINT, LPVOID, int, UINT, LPSTROKEINFO);
+REC WINAPI GetPenHwEventData(UINT, UINT, LPPOINT, LPVOID, int, LPSTROKEINFO);
+VOID WINAPI PenPacket(VOID);
+BOOL WINAPI SetPenHook(HKP, LPFNRAWHOOK);
+
+/****** Pen Hardware Constants **********************************************/
+
+#define PDK_UP 0x0000
+#define PDK_DOWN 0x0001
+#define PDK_BARREL1 0x0002
+#define PDK_BARREL2 0x0004
+#define PDK_BARREL3 0x0008
+#define PDK_TRANSITION 0x0010
+#define PDK_INVERTED 0x0080
+#define PDK_OUTOFRANGE 0x4000
+#define PDK_DRIVER 0x8000
+#define PDK_TIPMASK 0x0001
+#define PDK_SWITCHES (PDK_DOWN|PDK_BARREL1|PDK_BARREL2|PDK_BARREL3)
+
+#define PCM_PENUP 0x00000001L
+#define PCM_RANGE 0x00000002L
+#define PCM_INVERT 0x00000020L
+#define PCM_RECTEXCLUDE 0x00002000L
+#define PCM_RECTBOUND 0x00004000L
+#define PCM_TIMEOUT 0x00008000L
+#define PCM_ADDDEFAULTS RC_LDEFAULTFLAGS /* 0x80000000L */
+
+/****** Virtual Event Layer *************************************************/
+
+VOID WINAPI PostVirtualKeyEvent(UINT, BOOL);
+VOID WINAPI PostVirtualMouseEvent(UINT, int, int);
+VOID WINAPI AtomicVirtualEvent(BOOL);
+
+#define VWM_MOUSEMOVE 0x0001
+#define VWM_MOUSELEFTDOWN 0x0002
+#define VWM_MOUSELEFTUP 0x0004
+#define VWM_MOUSERIGHTDOWN 0x0008
+#define VWM_MOUSERIGHTUP 0x0010
+
+/****** RC Definition *************************************************************/
+
+#define CL_NULL 0
+#define CL_MINIMUM 1
+#define CL_MAXIMUM 100
+#define INKWIDTH_MINIMUM 0
+#define INKWIDTH_MAXIMUM 15
+#define ENUM_MINIMUM 1
+#define ENUM_MAXIMUM 4096
+#define MAXDICTIONARIES 16
+
+typedef struct tagGUIDE
+ {
+ int xOrigin;
+ int yOrigin;
+ int cxBox;
+ int cyBox;
+ int cxBase;
+ int cyBase;
+ int cHorzBox;
+ int cVertBox;
+ int cyMid;
+ }
+ GUIDE, FAR *LPGUIDE;
+
+typedef BOOL (CALLBACK * RCYIELDPROC)(VOID);
+
+#define cbRcLanguageMax 44
+#define cbRcUserMax 32
+#define cbRcrgbfAlcMax 32
+#define cwRcReservedMax 8
+
+typedef struct tagRC
+ {
+ HREC hrec;
+ HWND hwnd;
+ UINT wEventRef;
+ UINT wRcPreferences;
+ LONG lRcOptions;
+ RCYIELDPROC lpfnYield;
+ BYTE lpUser[cbRcUserMax];
+ UINT wCountry;
+ UINT wIntlPreferences;
+ char lpLanguage[cbRcLanguageMax];
+ LPDF rglpdf[MAXDICTIONARIES];
+ UINT wTryDictionary;
+ CL clErrorLevel;
+ ALC alc;
+ ALC alcPriority;
+ BYTE rgbfAlc[cbRcrgbfAlcMax];
+ UINT wResultMode;
+ UINT wTimeOut;
+ LONG lPcm;
+ RECT rectBound;
+ RECT rectExclude;
+ GUIDE guide;
+ UINT wRcOrient;
+ UINT wRcDirect;
+ int nInkWidth;
+ COLORREF rgbInk;
+ DWORD dwAppParam;
+ DWORD dwDictParam;
+ DWORD dwRecognizer;
+ UINT rgwReserved[cwRcReservedMax];
+ }
+ RC, FAR *LPRC;
+
+typedef HANDLE HPENDATA;
+
+typedef struct tagSYC
+ {
+ UINT wStrokeFirst;
+ UINT wPntFirst;
+ UINT wStrokeLast;
+ UINT wPntLast;
+ BOOL fLastSyc;
+ }
+ SYC, FAR *LPSYC;
+
+#define wPntAll (UINT)0xFFFF
+#define iSycNull (-1)
+
+typedef struct tagSYE
+ {
+ SYV syv;
+ LONG lRecogVal;
+ CL cl;
+ int iSyc;
+ }
+ SYE, FAR *LPSYE;
+
+#define MAXHOTSPOT 8
+
+typedef struct tagSYG
+ {
+ POINT rgpntHotSpots[MAXHOTSPOT];
+ int cHotSpot;
+ int nFirstBox;
+ LONG lRecogVal;
+ LPSYE lpsye;
+ int cSye;
+ LPSYC lpsyc;
+ int cSyc;
+ }
+ SYG, FAR *LPSYG;
+
+typedef int (CALLBACK *ENUMPROC)(LPSYV, int, VOID FAR *);
+
+typedef struct tagRCRESULT
+ {
+ SYG syg;
+ UINT wResultsType;
+ int cSyv;
+ LPSYV lpsyv;
+ HANDLE hSyv;
+ int nBaseLine;
+ int nMidLine;
+ HPENDATA hpendata;
+ RECT rectBoundInk;
+ POINT pntEnd;
+ LPRC lprc;
+ }
+ RCRESULT, FAR *LPRCRESULT;
+
+#define RCRT_DEFAULT 0x0000
+#define RCRT_UNIDENTIFIED 0x0001
+#define RCRT_GESTURE 0x0002
+#define RCRT_NOSYMBOLMATCH 0x0004
+#define RCRT_PRIVATE 0x4000
+#define RCRT_NORECOG 0x8000
+#define RCRT_ALREADYPROCESSED 0x0008
+#define RCRT_GESTURETRANSLATED 0x0010
+#define RCRT_GESTURETOKEYS 0x0020
+
+#define HKP_SETHOOK 0
+#define HKP_UNHOOK 0xFFFF
+#define HWR_RESULTS 0
+#define HWR_APPWIDE 1
+
+#define PEN_NOINKWIDTH 0
+#define LPDFNULL ((LPDF)NULL)
+
+#define RPA_DEFAULT 1
+
+/* GetGlobalRC return codes */
+#define GGRC_OK 0
+#define GGRC_DICTBUFTOOSMALL 1
+#define GGRC_PARAMERROR 2
+
+/* SetGlobalRC return code flags */
+#define SGRC_OK 0x0000
+#define SGRC_USER 0x0001
+#define SGRC_PARAMERROR 0x0002
+#define SGRC_RC 0x0004
+#define SGRC_RECOGNIZER 0x0008
+#define SGRC_DICTIONARY 0x0010
+#define SGRC_INIFILE 0x0020
+
+#define GetWEventRef() (LOWORD(GetMessageExtraInfo()))
+
+HREC WINAPI InstallRecognizer(LPSTR);
+VOID WINAPI UninstallRecognizer(HREC);
+UINT WINAPI GetGlobalRC(LPRC, LPSTR, LPSTR, int);
+UINT WINAPI SetGlobalRC(LPRC, LPSTR, LPSTR);
+VOID WINAPI RegisterPenApp(UINT, BOOL);
+UINT WINAPI IsPenAware(VOID);
+BOOL WINAPI SetRecogHook(UINT, UINT, HWND);
+VOID WINAPI InitRC(HWND, LPRC);
+REC WINAPI Recognize(LPRC);
+REC WINAPI RecognizeData(LPRC, HPENDATA);
+BOOL WINAPI TrainInk(LPRC, HPENDATA, LPSYV);
+BOOL WINAPI TrainContext(LPRCRESULT, LPSYE, int, LPSYC, int);
+REC WINAPI ProcessWriting(HWND, LPRC);
+BOOL WINAPI CorrectWriting(HWND, LPSTR, UINT, LPRC, DWORD, DWORD);
+VOID WINAPI EmulatePen(BOOL);
+int WINAPI GetSymbolMaxLength(LPSYG);
+int WINAPI GetSymbolCount(LPSYG);
+VOID WINAPI FirstSymbolFromGraph(LPSYG, LPSYV, int, int FAR *);
+UINT WINAPI EnumSymbols(LPSYG, WORD, ENUMPROC, LPVOID);
+
+/****** Miscellaneous Functions *********************************************/
+
+BOOL WINAPI TPtoDP(LPPOINT, int);
+BOOL WINAPI DPtoTP(LPPOINT, int);
+VOID WINAPI BoundingRectFromPoints(LPPOINT, int, LPRECT);
+BOOL WINAPI SymbolToCharacter(LPSYV, int, LPSTR, LPINT);
+int WINAPI CharacterToSymbol(LPSTR, int, LPSYV);
+UINT WINAPI GetVersionPenWin(VOID);
+BOOL WINAPI ExecuteGesture(HWND, SYV, LPRCRESULT);
+
+/****** RC Options and Flags ***********************************************/
+
+#define ALC_ALL 0x000043FFL
+#define ALC_DEFAULT 0x00000000L
+#define ALC_LCALPHA 0x00000001L
+#define ALC_UCALPHA 0x00000002L
+#define ALC_ALPHA 0x00000003L
+#define ALC_NUMERIC 0x00000004L
+#define ALC_ALPHANUMERIC 0x00000007L
+#define ALC_PUNC 0x00000008L
+#define ALC_MATH 0x00000010L
+#define ALC_MONETARY 0x00000020L
+#define ALC_OTHER 0x00000040L
+#define ALC_WHITE 0x00000100L
+#define ALC_NONPRINT 0x00000200L
+#define ALC_GESTURE 0x00004000L
+#define ALC_USEBITMAP 0x00008000L
+#define ALC_DBCS 0x00000400L
+#define ALC_HIRAGANA 0x00010000L
+#define ALC_KATAKANA 0x00020000L
+#define ALC_KANJI 0x00040000L
+#define ALC_OEM 0x0FF80000L
+#define ALC_RESERVED 0xF0003800L
+#define ALC_NOPRIORITY 0x00000000L
+#define ALC_SYSMINIMUM (ALC_ALPHANUMERIC | ALC_PUNC | ALC_WHITE | ALC_GESTURE)
+
+#define MpAlcB(lprc,i) ((lprc)->rgbfAlc[((i) & 0xff) >> 3])
+#define MpIbf(i) ((BYTE)(1 << ((i) & 7)))
+
+#define SetAlcBitAnsi(lprc,i) do {MpAlcB(lprc,i) |= MpIbf(i);} while (0)
+#define ResetAlcBitAnsi(lprc,i) do {MpAlcB(lprc,i) &= ~MpIbf(i);} while (0)
+#define IsAlcBitAnsi(lprc, i) ((MpAlcB(lprc,i) & MpIbf(i)) != 0)
+
+#define RCD_DEFAULT 0
+#define RCD_LR 1
+#define RCD_RL 2
+#define RCD_TB 3
+#define RCD_BT 4
+
+#define RCO_NOPOINTEREVENT 0x00000001L
+#define RCO_SAVEALLDATA 0x00000002L
+#define RCO_SAVEHPENDATA 0x00000004L
+#define RCO_NOFLASHUNKNOWN 0x00000008L
+#define RCO_TABLETCOORD 0x00000010L
+#define RCO_NOSPACEBREAK 0x00000020L
+#define RCO_NOHIDECURSOR 0x00000040L
+#define RCO_NOHOOK 0x00000080L
+#define RCO_BOXED 0x00000100L
+#define RCO_SUGGEST 0x00000200L
+#define RCO_DISABLEGESMAP 0x00000400L
+#define RCO_NOFLASHCURSOR 0x00000800L
+#define RCO_COLDRECOG 0x00008000L
+
+#define RCP_LEFTHAND 0x0001
+#define RCP_MAPCHAR 0x0004
+
+#define RCOR_NORMAL 1
+#define RCOR_RIGHT 2
+#define RCOR_UPSIDEDOWN 3
+#define RCOR_LEFT 4
+
+#define RRM_STROKE 0
+#define RRM_SYMBOL 1
+#define RRM_WORD 2
+#define RRM_NEWLINE 3
+#define RRM_COMPLETE 16
+
+#define RCIP_ALLANSICHAR 0x0001
+#define RCIP_MASK 0x0001
+
+#define CWR_STRIPCR 0x00000001L
+#define CWR_STRIPLF 0x00000002L
+#define CWR_STRIPTAB 0x00000004L
+#define CWR_SINGLELINEEDIT 0x00000007L
+#define CWR_TITLE 0x00000010L
+#define CWR_KKCONVERT 0x00000020L
+
+#define MAP_GESTOGES (RCRT_GESTURE|RCRT_GESTURETRANSLATED)
+#define MAP_GESTOVKEYS (RCRT_GESTURETOKEYS|RCRT_ALREADYPROCESSED)
+
+#define IsGestureToGesture(lprcresult) (((lprcresult)->wResultstype & MAP_GESTOGES \
+ ) == MAP_GESTOGES)
+
+#define IsGestureToVkeys(lprcresult) (((lprcresult)->wResultstype & MAP_GESTOVKEYS \
+ ) == MAP_GESTOVKEYS)
+
+#define SetAlreadyProcessed(lprcresult) ((lprcresult)->wResultsType = ((lprcresult)->wResultsType \
+ & ~RCRT_GESTURETOKEYS) | RCRT_ALREADYPROCESSED)
+
+/****** Pen Data Type *******************************************************/
+
+typedef struct tagPENDATAHEADER
+ {
+ UINT wVersion;
+ UINT cbSizeUsed;
+ UINT cStrokes;
+ UINT cPnt;
+ UINT cPntStrokeMax;
+ RECT rectBound;
+ UINT wPndts;
+ int nInkWidth;
+ DWORD rgbInk;
+ }
+ PENDATAHEADER, FAR *LPPENDATAHEADER, FAR *LPPENDATA;
+
+#define PDTS_LOMETRIC 0x0000
+#define PDTS_HIMETRIC 0x0001
+#define PDTS_HIENGLISH 0x0002
+#define PDTS_SCALEMAX 0x0003
+#define PDTS_DISPLAY 0x0003
+#define PDTS_ARBITRARY 0x0004
+#define PDTS_SCALEMASK 0x000F
+#define PDTS_STANDARDSCALE PDTS_HIENGLISH
+
+#define PDTS_NOPENINFO 0x0100
+#define PDTS_NOUPPOINTS 0x0200
+#define PDTS_NOOEMDATA 0x0400
+#define PDTS_NOCOLINEAR 0x0800
+#define PDTS_COMPRESSED 0x8000
+#define PDTS_COMPRESSMETHOD 0x00F0
+#define PDTS_COMPRESS2NDDERIV 0x0010
+
+#define PDTT_DEFAULT 0x0000
+#define PDTT_PENINFO PDTS_NOPENINFO
+#define PDTT_UPPOINTS PDTS_NOUPPOINTS
+#define PDTT_OEMDATA PDTS_NOOEMDATA
+#define PDTT_COLINEAR PDTS_NOCOLINEAR
+#define PDTT_COMPRESS PDTS_COMPRESSED
+#define PDTT_DECOMPRESS 0x4000
+#define PDTT_ALL (PDTT_PENINFO|PDTT_UPPOINTS|PDTT_OEMDATA|PDTT_COLINEAR)
+
+#define DestroyPenData(hpendata) (GlobalFree(hpendata)==NULL)
+#define EndEnumStrokes(hpendata) GlobalUnlock(hpendata)
+
+BOOL WINAPI IsPenEvent(UINT, LONG);
+BOOL WINAPI GetPenAsyncState(UINT);
+
+BOOL WINAPI GetPenDataInfo(HPENDATA, LPPENDATAHEADER, LPPENINFO, DWORD);
+BOOL WINAPI GetPenDataStroke(LPPENDATA, UINT, LPPOINT FAR *, LPVOID FAR *, LPSTROKEINFO );
+BOOL WINAPI GetPointsFromPenData(HPENDATA, UINT, UINT, UINT, LPPOINT);
+VOID WINAPI DrawPenData(HDC, LPRECT, HPENDATA);
+BOOL WINAPI MetricScalePenData(HPENDATA, UINT);
+BOOL WINAPI ResizePenData(HPENDATA, LPRECT);
+BOOL WINAPI OffsetPenData(HPENDATA, int, int);
+BOOL WINAPI RedisplayPenData(HDC, HPENDATA, LPPOINT, LPPOINT, int, DWORD);
+HPENDATA WINAPI CompactPenData(HPENDATA, UINT );
+HPENDATA WINAPI DuplicatePenData(HPENDATA, UINT);
+HPENDATA WINAPI CreatePenData(LPPENINFO, int, UINT, UINT);
+HPENDATA WINAPI AddPointsPenData(HPENDATA, LPPOINT, LPVOID, LPSTROKEINFO);
+LPPENDATA WINAPI BeginEnumStrokes(HPENDATA );
+
+/****** New Windows Messages ************************************************/
+
+#define WM_RCRESULT (WM_PENWINFIRST+1)
+#define WM_HOOKRCRESULT (WM_PENWINFIRST+2)
+#define WM_GLOBALRCCHANGE (WM_PENWINFIRST+3)
+#define WM_SKB (WM_PENWINFIRST+4)
+#define WM_HEDITCTL (WM_PENWINFIRST+5)
+
+/****** Dictionary **********************************************************/
+
+#define cbDictPathMax 255
+#define DIRQ_QUERY 1
+#define DIRQ_DESCRIPTION 2
+#define DIRQ_CONFIGURE 3
+#define DIRQ_OPEN 4
+#define DIRQ_CLOSE 5
+#define DIRQ_SETWORDLISTS 6
+#define DIRQ_STRING 7
+#define DIRQ_SUGGEST 8
+#define DIRQ_ADD 9
+#define DIRQ_DELETE 10
+#define DIRQ_FLUSH 11
+#define DIRQ_RCCHANGE 12
+#define DIRQ_SYMBOLGRAPH 13
+#define DIRQ_INIT 14
+#define DIRQ_CLEANUP 15
+#define DIRQ_COPYRIGHT 16
+
+
+#define DIRQ_USER 4096
+
+BOOL WINAPI DictionarySearch(LPRC, LPSYE, int, LPSYV, int);
+
+/****** Handwriting Edit Control ********************************************/
+
+#define HE_GETRC 3
+#define HE_SETRC 4
+#define HE_GETINFLATE 5
+#define HE_SETINFLATE 6
+#define HE_GETUNDERLINE 7
+#define HE_SETUNDERLINE 8
+#define HE_GETINKHANDLE 9
+#define HE_SETINKMODE 10
+#define HE_STOPINKMODE 11
+#define HE_GETRCRESULTCODE 12
+#define HE_DEFAULTFONT 13
+#define HE_CHARPOSITION 14
+#define HE_CHAROFFSET 15
+
+#define HE_GETRCRESULT 22
+
+#define HE_KKCONVERT 30
+#define HE_GETKKCONVERT 31
+#define HE_CANCELKKCONVERT 32
+#define HE_FIXKKCONVERT 33
+
+#define HEKK_DEFAULT 0
+#define HEKK_CONVERT 1
+#define HEKK_CANDIDATE 2
+
+#define HEP_NORECOG 0
+#define HEP_RECOG 1
+#define HEP_WAITFORTAP 2
+
+#define HN_ENDREC 4
+#define HN_DELAYEDRECOGFAIL 5
+
+#define HN_RCRESULT 20
+
+#define HN_ENDKKCONVERT 30
+
+typedef struct tagRECTOFS
+ {
+ int dLeft;
+ int dTop;
+ int dRight;
+ int dBottom;
+ }
+ RECTOFS, FAR *LPRECTOFS;
+
+/****** Boxed Edit Control **************************************************/
+
+typedef struct tagBOXLAYOUT
+ {
+ int cyCusp;
+ int cyEndCusp;
+ UINT style;
+ DWORD rgbText;
+ DWORD rgbBox;
+ DWORD rgbSelect;
+ }
+ BOXLAYOUT, FAR *LPBOXLAYOUT;
+
+#define BXS_NONE 0U
+#define BXS_RECT 1U
+#define BXS_ENDTEXTMARK 2U
+#define BXS_MASK 3U
+
+#define HE_GETBOXLAYOUT 20
+#define HE_SETBOXLAYOUT 21
+
+#define BXD_CELLWIDTH 12
+#define BXD_CELLHEIGHT 16
+#define BXD_BASEHEIGHT 13
+#define BXD_BASEHORZ 0
+#define BXD_CUSPHEIGHT 2
+#define BXD_ENDCUSPHEIGHT 4
+
+/****** Screen Keyboard *****************************************************/
+
+typedef struct tagSKBINFO
+ {
+ HWND hwnd;
+ UINT nPad;
+ BOOL fVisible;
+ BOOL fMinimized;
+ RECT rect;
+ DWORD dwReserved;
+ }
+ SKBINFO, FAR *LPSKBINFO;
+
+#define SKB_QUERY 0x0000
+#define SKB_SHOW 0x0001
+#define SKB_HIDE 0x0002
+#define SKB_CENTER 0x0010
+#define SKB_MOVE 0x0020
+#define SKB_MINIMIZE 0x0040
+#define SKB_FULL 0x0100
+#define SKB_BASIC 0x0200
+#define SKB_NUMPAD 0x0400
+
+#define OBM_SKBBTNUP 32767
+#define OBM_SKBBTNDOWN 32766
+#define OBM_SKBBTNDISABLED 32765
+
+#define SKN_CHANGED 1
+
+#define SKN_POSCHANGED 1
+#define SKN_PADCHANGED 2
+#define SKN_MINCHANGED 4
+#define SKN_VISCHANGED 8
+#define SKN_TERMINATED 0xffff
+
+BOOL WINAPI ShowKeyboard(HWND, UINT, LPPOINT, LPSKBINFO);
+
+/****** New ComboBox Notifications *****************************************/
+
+#define CBN_ENDREC 16
+#define CBN_DELAYEDRECOGFAIL 17
+#define CBN_RCRESULT 18
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* RC_INVOKED */
+
+#endif /* #define _INC_PENWIN */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/penwoem.h b/private/oleauto/tools/win16/hdos/c800/include/penwoem.h
new file mode 100644
index 000000000..b9c96d68c
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/penwoem.h
@@ -0,0 +1,75 @@
+/*****************************************************************************\
+* *
+* penwoem.h - Pen Windows APIs into recognizer layer. *
+* Assumes windows.h and penwin.h have been previously included. *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_PENWOEM /* prevent multiple includes */
+#define _INC_PENWOEM
+
+#ifndef RC_INVOKED
+#pragma pack(1)
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+typedef int (CALLBACK *LPFUNCRESULTS) (LPRCRESULT, REC);
+
+/* Initialization Functions */
+
+#define WCR_RECOGNAME 0
+#define WCR_QUERY 1
+#define WCR_CONFIGDIALOG 2
+#define WCR_DEFAULT 3
+#define WCR_RCCHANGE 4
+#define WCR_VERSION 5
+#define WCR_TRAIN 6
+#define WCR_TRAINSAVE 7
+#define WCR_TRAINMAX 8
+#define WCR_TRAINDIRTY 9
+#define WCR_TRAINCUSTOM 10
+#define WCR_QUERYLANGUAGE 11
+#define WCR_USERCHANGE 12
+#define WCR_PRIVATE 1024
+
+/* sub-function of WCR_USERCHANGE */
+#define CRUC_REMOVE 1
+
+/* Return values for WCR_TRAIN Function */
+#define TRAIN_NONE 0x0000
+#define TRAIN_DEFAULT 0x0001
+#define TRAIN_CUSTOM 0x0002
+#define TRAIN_BOTH (TRAIN_DEFAULT | TRAIN_CUSTOM)
+
+/* Control values for TRAINSAVE */
+#define TRAIN_SAVE 0 /* Save changes that have been made */
+#define TRAIN_REVERT 1 /* Discard changes that have been made */
+
+UINT WINAPI ConfigRecognizer(UINT, WPARAM, LPARAM);
+BOOL WINAPI InitRecognizer(LPRC);
+VOID WINAPI CloseRecognizer(VOID);
+
+/* Recognition Functions */
+REC WINAPI RecognizeInternal(LPRC, LPFUNCRESULTS);
+REC WINAPI RecognizeDataInternal(LPRC, HPENDATA, LPFUNCRESULTS);
+
+/* Training Functions */
+BOOL WINAPI TrainInkInternal(LPRC, HPENDATA, LPSYV);
+BOOL WINAPI TrainContextInternal(LPRCRESULT, LPSYE, int, LPSYC, int);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* RC_INVOKED */
+
+#endif /* #define _INC_PENWOEM */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/pgchart.h b/private/oleauto/tools/win16/hdos/c800/include/pgchart.h
new file mode 100644
index 000000000..5be26e358
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/pgchart.h
@@ -0,0 +1,256 @@
+/***
+*pgchart.h - Declare constants, functions and macros for charting library.
+*
+* Copyright (c) 1988-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file declares the presentation graphics library functions and
+* the structures and manifest constants that are used with them.
+*
+***************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" { /* allow use with C++ */
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+/* Force word alignment to avoid possible -Zp override */
+#pragma pack(2)
+
+
+/* Required for the missing value definition */
+#ifndef FLT_MAX
+#define FLT_MAX 3.402823466e+38F /* max value */
+#endif
+
+#define _PG_PALETTELEN 16 /* Number of entries in internal palette */
+#define _PG_MAXCHARTTYPE 5 /* Maximum available chart type */
+#define _PG_MAXCHARTSTYLE 2 /* Maximum chart style */
+#define _PG_TITLELEN 70 /* Maximum title text length */
+
+#define _PG_LEFT 1 /* Positions used for titles and legends */
+#define _PG_CENTER 2
+#define _PG_RIGHT 3
+#define _PG_BOTTOM 4
+#define _PG_OVERLAY 5
+
+#define _PG_LINEARAXIS 1 /* Used to specify axis types */
+#define _PG_LOGAXIS 2
+
+#define _PG_DECFORMAT 1 /* Used to specify tic mark label format */
+#define _PG_EXPFORMAT 2
+
+#define _PG_BARCHART 1 /* Charttype for a bar chart */
+#define _PG_COLUMNCHART 2 /* Charttype for a column chart */
+#define _PG_PLAINBARS 1 /* Styles for bar and column charts */
+#define _PG_STACKEDBARS 2
+
+#define _PG_LINECHART 3 /* Charttype for a line chart */
+#define _PG_SCATTERCHART 4 /* Charttype for a scatter chart */
+#define _PG_POINTANDLINE 1 /* Styles for line and scatter charts */
+#define _PG_POINTONLY 2
+
+#define _PG_PIECHART 5 /* Charttype for pie chart */
+#define _PG_PERCENT 1 /* Styles for pie charts */
+#define _PG_NOPERCENT 2
+
+#define _PG_MISSINGVALUE (-FLT_MAX) /* Indicates missing data values */
+
+
+/* Error codes */
+
+/* Numbers greater than 100 will terminate chart routine, others will cause
+ * default values to be used
+ */
+#define _PG_NOTINITIALIZED 102 /* If library not initialized */
+#define _PG_BADSCREENMODE 103 /* Graphics mode not set before charting */
+#define _PG_BADCHARTSTYLE 04 /* Chart style invalid */
+#define _PG_BADCHARTTYPE 104 /* Chart type invalid */
+#define _PG_BADLEGENDWINDOW 105 /* Invalid legend window specified */
+#define _PG_BADCHARTWINDOW 07 /* x1=x2 or y1=y2 in chart window spec. */
+#define _PG_BADDATAWINDOW 107 /* If chart window is too small */
+#define _PG_NOMEMORY 108 /* Not enough memory for data arrays */
+#define _PG_BADLOGBASE 05 /* Log base <= 0 */
+#define _PG_BADSCALEFACTOR 06 /* Scale factor = 0 */
+#define _PG_TOOSMALLN 109 /* Number of data points <= 0 */
+#define _PG_TOOFEWSERIES 110 /* Number of series <= 0 */
+
+
+/* Typedefs */
+
+/* Typedef for chart title */
+#ifndef _TITLETYPE_DEFINED
+typedef struct {
+ char title[_PG_TITLELEN]; /* Title text */
+ short titlecolor; /* Internal palette color for title text */
+ short justify; /* _PG_LEFT, _PG_CENTER, _PG_RIGHT */
+} _titletype;
+#define _TITLETYPE_DEFINED
+#endif
+
+/* Typedef for chart axes */
+#ifndef _AXISTYPE_DEFINED
+typedef struct {
+ short grid; /* TRUE=grid lines drawn; FALSE no lines */
+ short gridstyle; /* Style number from style pool for grid lines */
+ _titletype axistitle; /* Title definition for axis */
+ short axiscolor; /* Color for axis */
+ short labeled; /* TRUE=tic marks and titles drawn */
+ short rangetype; /* _PG_LINEARAXIS, _PG_LOGAXIS */
+ float logbase; /* Base used if log axis */
+ short autoscale; /* TRUE=next 7 values calculated by system */
+ float scalemin; /* Minimum value of scale */
+ float scalemax; /* Maximum value of scale */
+ float scalefactor; /* Scale factor for data on this axis */
+ _titletype scaletitle; /* Title definition for scaling factor */
+ float ticinterval; /* Distance between tic marks (world coord.) */
+ short ticformat; /* _PG_EXPFORMAT or _PG_DECFORMAT for tic labels */
+ short ticdecimals; /* Number of decimals for tic labels (max=9)*/
+} _axistype;
+#define _AXISTYPE_DEFINED
+#endif
+
+/* Typedef used for defining chart and data windows */
+#ifndef _WINDOWTYPE_DEFINED
+typedef struct {
+ short x1; /* Left edge of window in pixels */
+ short y1; /* Top edge of window in pixels */
+ short x2; /* Right edge of window in pixels */
+ short y2; /* Bottom edge of window in pixels */
+ short border; /* TRUE for border, FALSE otherwise */
+ short background; /* Internal palette color for window bgnd */
+ short borderstyle; /* Style bytes for window border */
+ short bordercolor; /* Internal palette color for window border */
+} _windowtype;
+#define _WINDOWTYPE_DEFINED
+#endif
+
+/* Typedef for legend definition */
+#ifndef _LEGENDTYPE_DEFINED
+typedef struct {
+ short legend; /* TRUE=draw legend; FALSE=no legend */
+ short place; /* _PG_RIGHT, _PG_BOTTOM, _PG_OVERLAY */
+ short textcolor; /* Internal palette color for text */
+ short autosize; /* TRUE=system calculates size */
+ _windowtype legendwindow; /* Window definition for legend */
+} _legendtype;
+#define _LEGENDTYPE_DEFINED
+#endif
+
+/* Typedef for legend definition */
+#ifndef _CHARTENV_DEFINED
+typedef struct {
+ short charttype; /* _PG_BARCHART, _PG_COLUMNCHART,
+ _PG_LINECHART, _PG_SCATTERCHART,
+ _PG_PIECHART */
+ short chartstyle; /* Style for selected chart type */
+ _windowtype chartwindow; /* Window definition for overall chart */
+ _windowtype datawindow; /* Window definition for data part of chart */
+ _titletype maintitle; /* Main chart title */
+ _titletype subtitle; /* Chart sub-title */
+ _axistype xaxis; /* Definition for X-axis */
+ _axistype yaxis; /* Definition for Y-axis */
+ _legendtype legend; /* Definition for legend */
+} _chartenv;
+#define _CHARTENV_DEFINED
+#endif
+
+/* Typedef for character bitmap */
+#ifndef _CHARMAP_DEFINED
+typedef unsigned char _charmap[8];
+#define _CHARMAP_DEFINED
+#endif
+
+/* Typedef for pattern bitmap */
+#ifndef _FILLMAP_DEFINED
+typedef unsigned char _fillmap[8];
+#define _FILLMAP_DEFINED
+#endif
+
+/* Typedef for palette entry definition */
+#ifndef _PALETTEENTRY_DEFINED
+typedef struct {
+ unsigned short color;
+ unsigned short style;
+ _fillmap fill;
+ char plotchar;
+} _paletteentry;
+#define _PALETTEENTRY_DEFINED
+#endif
+
+/* Typedef for palette definition */
+#ifndef _PALETTETYPE_DEFINED
+typedef _paletteentry _palettetype[_PG_PALETTELEN];
+#define _PALETTETYPE_DEFINED
+#endif
+
+/* Typedef for style sets */
+#ifndef _STYLESET_DEFINED
+typedef unsigned short _styleset[_PG_PALETTELEN];
+#define _STYLESET_DEFINED
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define titletype _titletype
+#define axistype _axistype
+#define windowtype _windowtype
+#define legendtype _legendtype
+#define chartenv _chartenv
+#define charmap _charmap
+#define fillmap _fillmap
+#define paletteentry _paletteentry
+#define palettetype _palettetype
+#define styleset _styleset
+#endif
+
+
+/* Function prototypes for charting routines */
+
+short __far __cdecl _pg_initchart(void);
+short __far __cdecl _pg_defaultchart(_chartenv __far *, short, short);
+
+short __far __cdecl _pg_chart(_chartenv __far *, const char __far * const __far *, const float __far *, short);
+short __far __cdecl _pg_chartms(_chartenv __far *, const char __far * const __far *, const float __far *, short, short, short, const char __far * const __far *);
+
+short __far __cdecl _pg_chartscatter(_chartenv __far *, const float __far *, const float __far *, short);
+short __far __cdecl _pg_chartscatterms(_chartenv __far *, const float __far *, const float __far *, short, short, short, const char __far * const __far *);
+
+short __far __cdecl _pg_chartpie(_chartenv __far *, const char __far * const __far *, const float __far *, const short __far *, short);
+
+/* Function prototypes for support routines */
+
+short __far __cdecl _pg_hlabelchart(_chartenv __far *, short, short, short, const char __far *);
+short __far __cdecl _pg_vlabelchart(_chartenv __far *, short, short, short, const char __far *);
+
+short __far __cdecl _pg_analyzechart(_chartenv __far *, const char __far * const __far *, const float __far *, short);
+short __far __cdecl _pg_analyzechartms(_chartenv __far *, const char __far * const __far *, const float __far *, short, short, short, const char __far * const __far *);
+
+short __far __cdecl _pg_analyzescatter(_chartenv __far *, const float __far *, const float __far *, short);
+short __far __cdecl _pg_analyzescatterms(_chartenv __far *, const float __far *, const float __far *, short, short, short, const char __far * const __far *);
+
+short __far __cdecl _pg_analyzepie(_chartenv __far *, const char __far * const __far *, const float __far *, const short __far *, short);
+
+short __far __cdecl _pg_getpalette(_paletteentry __far *);
+short __far __cdecl _pg_setpalette(const _paletteentry __far *);
+short __far __cdecl _pg_resetpalette(void);
+
+void __far __cdecl _pg_getstyleset(unsigned short __far *);
+void __far __cdecl _pg_setstyleset(const unsigned short __far *);
+void __far __cdecl _pg_resetstyleset(void);
+
+short __far __cdecl _pg_getchardef(short, unsigned char __far *);
+short __far __cdecl _pg_setchardef(short, const unsigned char __far *);
+
+
+/* Restore default packing */
+#pragma pack()
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/print.h b/private/oleauto/tools/win16/hdos/c800/include/print.h
new file mode 100644
index 000000000..263dff97d
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/print.h
@@ -0,0 +1,302 @@
+/*****************************************************************************\
+* *
+* print.h - Printing helper functions, types, and definitions *
+* *
+* Copyright (c) 1985-1992. Microsoft Corp. All rights reserved.*
+* *
+*******************************************************************************
+*
+* PRINTDRIVER - For inclusion with a printer driver
+* NOPQ - Prevent inclusion of priority queue APIs
+*
+\*****************************************************************************/
+
+#ifndef _INC_PRINT
+#define _INC_PRINT
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* !RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+#ifdef PRINTDRIVER
+
+#define NORASTEROPS
+#define NOTEXTMETRICS
+#define NOGDICAPMASKS
+#define NOGDIOBJ
+#define NOBITMAP
+#define NOSOUND
+#define NOTEXTMETRIC
+#define NOCOMM
+#define NOKANJI
+
+#include <windows.h>
+
+#undef NORASTEROPS
+#undef NOTEXTMETRICS
+#undef NOGDICAPMASKS
+#undef NOGDICAPMASKS
+#undef NOGDIOBJ
+#undef NOBITMAP
+#undef NOSOUND
+#undef NOTEXTMETRIC
+#undef NOCOMM
+#undef NOKANJI
+
+#define NOPTRC /* don't allow gdidefs.inc to redef these */
+#define PTTYPE POINT
+
+#define PQERROR (-1)
+
+#ifndef NOPQ
+
+DECLARE_HANDLE(HPQ);
+
+HPQ WINAPI CreatePQ(int);
+int WINAPI MinPQ(HPQ);
+int WINAPI ExtractPQ(HPQ);
+int WINAPI InsertPQ(HPQ, int, int);
+int WINAPI SizePQ(HPQ, int);
+void WINAPI DeletePQ(HPQ);
+#endif /* !NOPQ */
+
+/* Spool routines for use by printer drivers */
+
+DECLARE_HANDLE(HPJOB);
+
+HPJOB WINAPI OpenJob(LPSTR, LPSTR, HPJOB);
+int WINAPI StartSpoolPage(HPJOB);
+int WINAPI EndSpoolPage(HPJOB);
+int WINAPI WriteSpool(HPJOB, LPSTR, int);
+int WINAPI CloseJob(HPJOB);
+int WINAPI DeleteJob(HPJOB, int);
+int WINAPI WriteDialog(HPJOB, LPSTR, int);
+int WINAPI DeleteSpoolPage(HPJOB);
+
+#endif /* !PRINTDRIVER */
+
+typedef struct tagBANDINFOSTRUCT
+{
+ BOOL fGraphics;
+ BOOL fText;
+ RECT rcGraphics;
+} BANDINFOSTRUCT, FAR* LPBI;
+
+#define USA_COUNTRYCODE 1
+
+/*
+ * Printer driver initialization using ExtDeviceMode()
+ * and DeviceCapabilities().
+ * This replaces Drivinit.h
+ */
+
+/* size of a device name string */
+#define CCHDEVICENAME 32
+#define CCHPAPERNAME 64
+
+/* current version of specification */
+#define DM_SPECVERSION 0x30A
+
+/* field selection bits */
+#define DM_ORIENTATION 0x0000001L
+#define DM_PAPERSIZE 0x0000002L
+#define DM_PAPERLENGTH 0x0000004L
+#define DM_PAPERWIDTH 0x0000008L
+#define DM_SCALE 0x0000010L
+#define DM_COPIES 0x0000100L
+#define DM_DEFAULTSOURCE 0x0000200L
+#define DM_PRINTQUALITY 0x0000400L
+#define DM_COLOR 0x0000800L
+#define DM_DUPLEX 0x0001000L
+#define DM_YRESOLUTION 0x0002000L
+#define DM_TTOPTION 0x0004000L
+
+/* orientation selections */
+#define DMORIENT_PORTRAIT 1
+#define DMORIENT_LANDSCAPE 2
+
+/* paper selections */
+/* Warning: The PostScript driver mistakingly uses DMPAPER_ values between
+ * 50 and 56. Don't use this range when defining new paper sizes.
+ */
+#define DMPAPER_FIRST DMPAPER_LETTER
+#define DMPAPER_LETTER 1 /* Letter 8 1/2 x 11 in */
+#define DMPAPER_LETTERSMALL 2 /* Letter Small 8 1/2 x 11 in */
+#define DMPAPER_TABLOID 3 /* Tabloid 11 x 17 in */
+#define DMPAPER_LEDGER 4 /* Ledger 17 x 11 in */
+#define DMPAPER_LEGAL 5 /* Legal 8 1/2 x 14 in */
+#define DMPAPER_STATEMENT 6 /* Statement 5 1/2 x 8 1/2 in */
+#define DMPAPER_EXECUTIVE 7 /* Executive 7 1/4 x 10 1/2 in */
+#define DMPAPER_A3 8 /* A3 297 x 420 mm */
+#define DMPAPER_A4 9 /* A4 210 x 297 mm */
+#define DMPAPER_A4SMALL 10 /* A4 Small 210 x 297 mm */
+#define DMPAPER_A5 11 /* A5 148 x 210 mm */
+#define DMPAPER_B4 12 /* B4 250 x 354 */
+#define DMPAPER_B5 13 /* B5 182 x 257 mm */
+#define DMPAPER_FOLIO 14 /* Folio 8 1/2 x 13 in */
+#define DMPAPER_QUARTO 15 /* Quarto 215 x 275 mm */
+#define DMPAPER_10X14 16 /* 10x14 in */
+#define DMPAPER_11X17 17 /* 11x17 in */
+#define DMPAPER_NOTE 18 /* Note 8 1/2 x 11 in */
+#define DMPAPER_ENV_9 19 /* Envelope #9 3 7/8 x 8 7/8 */
+#define DMPAPER_ENV_10 20 /* Envelope #10 4 1/8 x 9 1/2 */
+#define DMPAPER_ENV_11 21 /* Envelope #11 4 1/2 x 10 3/8 */
+#define DMPAPER_ENV_12 22 /* Envelope #12 4 \276 x 11 */
+#define DMPAPER_ENV_14 23 /* Envelope #14 5 x 11 1/2 */
+#define DMPAPER_CSHEET 24 /* C size sheet */
+#define DMPAPER_DSHEET 25 /* D size sheet */
+#define DMPAPER_ESHEET 26 /* E size sheet */
+#define DMPAPER_ENV_DL 27 /* Envelope DL 110 x 220mm */
+#define DMPAPER_ENV_C5 28 /* Envelope C5 162 x 229 mm */
+#define DMPAPER_ENV_C3 29 /* Envelope C3 324 x 458 mm */
+#define DMPAPER_ENV_C4 30 /* Envelope C4 229 x 324 mm */
+#define DMPAPER_ENV_C6 31 /* Envelope C6 114 x 162 mm */
+#define DMPAPER_ENV_C65 32 /* Envelope C65 114 x 229 mm */
+#define DMPAPER_ENV_B4 33 /* Envelope B4 250 x 353 mm */
+#define DMPAPER_ENV_B5 34 /* Envelope B5 176 x 250 mm */
+#define DMPAPER_ENV_B6 35 /* Envelope B6 176 x 125 mm */
+#define DMPAPER_ENV_ITALY 36 /* Envelope 110 x 230 mm */
+#define DMPAPER_ENV_MONARCH 37 /* Envelope Monarch 3.875 x 7.5 in */
+#define DMPAPER_ENV_PERSONAL 38 /* 6 3/4 Envelope 3 5/8 x 6 1/2 in */
+#define DMPAPER_FANFOLD_US 39 /* US Std Fanfold 14 7/8 x 11 in */
+#define DMPAPER_FANFOLD_STD_GERMAN 40 /* German Std Fanfold 8 1/2 x 12 in */
+#define DMPAPER_FANFOLD_LGL_GERMAN 41 /* German Legal Fanfold 8 1/2 x 13 in */
+
+#define DMPAPER_LAST DMPAPER_FANFOLD_LGL_GERMAN
+
+#define DMPAPER_USER 256
+
+/* bin selections */
+#define DMBIN_FIRST DMBIN_UPPER
+#define DMBIN_UPPER 1
+#define DMBIN_ONLYONE 1
+#define DMBIN_LOWER 2
+#define DMBIN_MIDDLE 3
+#define DMBIN_MANUAL 4
+#define DMBIN_ENVELOPE 5
+#define DMBIN_ENVMANUAL 6
+#define DMBIN_AUTO 7
+#define DMBIN_TRACTOR 8
+#define DMBIN_SMALLFMT 9
+#define DMBIN_LARGEFMT 10
+#define DMBIN_LARGECAPACITY 11
+#define DMBIN_CASSETTE 14
+#define DMBIN_LAST DMBIN_CASSETTE
+
+#define DMBIN_USER 256 /* device specific bins start here */
+
+/* print qualities */
+#define DMRES_DRAFT (-1)
+#define DMRES_LOW (-2)
+#define DMRES_MEDIUM (-3)
+#define DMRES_HIGH (-4)
+
+/* color enable/disable for color printers */
+#define DMCOLOR_MONOCHROME 1
+#define DMCOLOR_COLOR 2
+
+/* duplex enable */
+#define DMDUP_SIMPLEX 1
+#define DMDUP_VERTICAL 2
+#define DMDUP_HORIZONTAL 3
+
+/* TrueType options */
+#define DMTT_BITMAP 1 /* print TT fonts as graphics */
+#define DMTT_DOWNLOAD 2 /* download TT fonts as soft fonts */
+#define DMTT_SUBDEV 3 /* substitute device fonts for TT fonts */
+
+typedef struct tagDEVMODE
+{
+ char dmDeviceName[CCHDEVICENAME];
+ UINT dmSpecVersion;
+ UINT dmDriverVersion;
+ UINT dmSize;
+ UINT dmDriverExtra;
+ DWORD dmFields;
+ int dmOrientation;
+ int dmPaperSize;
+ int dmPaperLength;
+ int dmPaperWidth;
+ int dmScale;
+ int dmCopies;
+ int dmDefaultSource;
+ int dmPrintQuality;
+ int dmColor;
+ int dmDuplex;
+ int dmYResolution;
+ int dmTTOption;
+} DEVMODE;
+
+typedef DEVMODE* PDEVMODE, NEAR* NPDEVMODE, FAR* LPDEVMODE;
+
+/* mode selections for the device mode function */
+#define DM_UPDATE 1
+#define DM_COPY 2
+#define DM_PROMPT 4
+#define DM_MODIFY 8
+
+#define DM_IN_BUFFER DM_MODIFY
+#define DM_IN_PROMPT DM_PROMPT
+#define DM_OUT_BUFFER DM_COPY
+#define DM_OUT_DEFAULT DM_UPDATE
+
+/* device capabilities indices */
+#define DC_FIELDS 1
+#define DC_PAPERS 2
+#define DC_PAPERSIZE 3
+#define DC_MINEXTENT 4
+#define DC_MAXEXTENT 5
+#define DC_BINS 6
+#define DC_DUPLEX 7
+#define DC_SIZE 8
+#define DC_EXTRA 9
+#define DC_VERSION 10
+#define DC_DRIVER 11
+#define DC_BINNAMES 12
+#define DC_ENUMRESOLUTIONS 13
+#define DC_FILEDEPENDENCIES 14
+#define DC_TRUETYPE 15
+#define DC_PAPERNAMES 16
+#define DC_ORIENTATION 17
+#define DC_COPIES 18
+
+/* bit fields of the return value (DWORD) for DC_TRUETYPE */
+#define DCTT_BITMAP 0x0000001L
+#define DCTT_DOWNLOAD 0x0000002L
+#define DCTT_SUBDEV 0x0000004L
+
+/* export ordinal definitions */
+#define PROC_EXTDEVICEMODE MAKEINTRESOURCE(90)
+#define PROC_DEVICECAPABILITIES MAKEINTRESOURCE(91)
+#define PROC_OLDDEVICEMODE MAKEINTRESOURCE(13)
+
+/* define types of pointers to ExtDeviceMode() and DeviceCapabilities()
+ * functions
+ */
+typedef UINT (CALLBACK* LPFNDEVMODE)(HWND, HMODULE, DEVMODE FAR*,
+ LPSTR, LPSTR, DEVMODE FAR*, LPSTR, UINT);
+
+typedef DWORD (CALLBACK* LPFNDEVCAPS)(LPSTR, LPSTR, UINT, LPSTR, DEVMODE FAR*);
+
+HDC WINAPI ResetDC(HDC, const DEVMODE FAR*);
+
+/* this structure is used by the GETSETSCREENPARAMS escape */
+typedef struct tagSCREENPARAMS
+{
+ int angle;
+ int frequency;
+} SCREENPARAMS;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* !RC_INVOKED */
+
+#endif /* !_INC_PRINT */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/process.h b/private/oleauto/tools/win16/hdos/c800/include/process.h
new file mode 100644
index 000000000..56e67d8c2
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/process.h
@@ -0,0 +1,144 @@
+/***
+*process.h - definition and declarations for process control functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the declarations and definitions for the
+* spawnxx, execxx, and various other process control routines.
+*
+****/
+
+#ifndef _INC_PROCESS
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+/* mode values for spawnxx routines
+ * (only P_WAIT and P_OVERLAY are supported on MS-DOS)
+ */
+
+#ifndef _MT
+extern int __near __cdecl _p_overlay;
+#endif
+
+#define _P_WAIT 0
+#define _P_NOWAIT 1
+#ifdef _MT
+#define _P_OVERLAY 2
+#else
+#define _P_OVERLAY _p_overlay
+#endif
+#define _OLD_P_OVERLAY 2
+#define _P_NOWAITO 3
+#define _P_DETACH 4
+
+
+/* function prototypes */
+
+#ifdef _MT
+int __cdecl _beginthread(void(__cdecl *)(void *),
+ void *, unsigned, void *);
+void __cdecl _endthread(void);
+#endif
+void __cdecl abort(void);
+void __cdecl _cexit(void);
+void __cdecl _c_exit(void);
+#ifndef _WINDOWS
+int __cdecl _execl(const char *, const char *, ...);
+int __cdecl _execle(const char *, const char *, ...);
+int __cdecl _execlp(const char *, const char *, ...);
+int __cdecl _execlpe(const char *, const char *, ...);
+int __cdecl _execv(const char *,
+ const char * const *);
+int __cdecl _execve(const char *,
+ const char * const *, const char * const *);
+int __cdecl _execvp(const char *,
+ const char * const *);
+int __cdecl _execvpe(const char *,
+ const char * const *, const char * const *);
+#endif
+#ifndef _WINDLL
+void __cdecl exit(int);
+void __cdecl _exit(int);
+#endif
+int __cdecl _getpid(void);
+#ifndef _WINDOWS
+int __cdecl _spawnl(int, const char *, const char *,
+ ...);
+int __cdecl _spawnle(int, const char *, const char *,
+ ...);
+int __cdecl _spawnlp(int, const char *, const char *,
+ ...);
+int __cdecl _spawnlpe(int, const char *, const char *,
+ ...);
+int __cdecl _spawnv(int, const char *,
+ const char * const *);
+int __cdecl _spawnve(int, const char *,
+ const char * const *, const char * const *);
+int __cdecl _spawnvp(int, const char *,
+ const char * const *);
+int __cdecl _spawnvpe(int, const char *,
+ const char * const *, const char * const *);
+int __cdecl system(const char *);
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define P_WAIT _P_WAIT
+#define P_NOWAIT _P_NOWAIT
+#define P_OVERLAY _P_OVERLAY
+#define OLD_P_OVERLAY _OLD_P_OVERLAY
+#define P_NOWAITO _P_NOWAITO
+#define P_DETACH _P_DETACH
+
+#ifndef _WINDOWS
+int __cdecl execl(const char *, const char *, ...);
+int __cdecl execle(const char *, const char *, ...);
+int __cdecl execlp(const char *, const char *, ...);
+int __cdecl execlpe(const char *, const char *, ...);
+int __cdecl execv(const char *,
+ const char * const *);
+int __cdecl execve(const char *,
+ const char * const *, const char * const *);
+int __cdecl execvp(const char *,
+ const char * const *);
+int __cdecl execvpe(const char *,
+ const char * const *, const char * const *);
+#endif
+int __cdecl getpid(void);
+#ifndef _WINDOWS
+int __cdecl spawnl(int, const char *, const char *,
+ ...);
+int __cdecl spawnle(int, const char *, const char *,
+ ...);
+int __cdecl spawnlp(int, const char *, const char *,
+ ...);
+int __cdecl spawnlpe(int, const char *, const char *,
+ ...);
+int __cdecl spawnv(int, const char *,
+ const char * const *);
+int __cdecl spawnve(int, const char *,
+ const char * const *, const char * const *);
+int __cdecl spawnvp(int, const char *,
+ const char * const *);
+int __cdecl spawnvpe(int, const char *,
+ const char * const *, const char * const *);
+#endif
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_PROCESS
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/scrnsave.h b/private/oleauto/tools/win16/hdos/c800/include/scrnsave.h
new file mode 100644
index 000000000..337f02311
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/scrnsave.h
@@ -0,0 +1,168 @@
+/*****************************************************************************\
+* *
+* scrnsave.h Windows 3.1 screensaver defines and definitions.
+* *
+* Version 1.0 *
+* *
+* NOTE: windows.h must be #included first *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_SCRNSAVE
+#define _INC_SCRNSAVE
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* !RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+#ifndef _INC_WINDOWS /* If not included with 3.1 headers... */
+#define LPCSTR LPSTR
+#define WINAPI FAR PASCAL
+#define CALLBACK FAR PASCAL
+#define UINT WORD
+#define LPARAM LONG
+#define WPARAM WORD
+#define LRESULT LONG
+#define HMODULE HANDLE
+#define HINSTANCE HANDLE
+#define HLOCAL HANDLE
+#define HGLOBAL HANDLE
+#endif /* _INC_WINDOWS */
+
+
+/* Icon resource ID.
+ *
+ * This should be the first icon used and must have this resource number.
+ * This is needed as the first icon in the file will be grabbed
+ */
+#define ID_APP 100
+#define DLG_CHANGEPASSWORD 2000
+#define DLG_ENTERPASSWORD 2001
+#define DLG_INVALIDPASSWORD 2002
+#define DLG_SCRNSAVECONFIGURE 2003
+
+#define idsIsPassword 1000
+#define idsIniFile 1001
+#define idsScreenSaver 1002
+#define idsPassword 1003
+#define idsDifferentPW 1004
+#define idsChangePW 1005
+#define idsBadOldPW 1006
+#define idsAppName 1007
+#define idsNoHelpMemory 1008
+#define idsHelpFile 1009
+
+/* This function is the Window Procedure for the screen saver. It is
+ * up to the programmer to handle any of the messages that wish to be
+ * interpretted. Any unused messages are then passed back to
+ * DefScreenSaverProc if desired which will take default action on any
+ * unprocessed message...
+ */
+LRESULT WINAPI ScreenSaverProc(HWND, unsigned, UINT, LPARAM);
+
+/* This function performs default message processing. Currently handles
+ * the following messages:
+ *
+ * WM_SYSCOMMAND: return FALSE if wParam is SC_SCREENSAVE or SC_CLOSE
+ *
+ * WM_DESTROY: PostQuitMessage(0)
+ *
+ * WM_SETCURSOR: By default, this will set the cursor to a null cursor,
+ * thereby removing it from the screen.
+ *
+ * WM_LBUTTONDOWN:
+ * WM_MBUTTONDOWN:
+ * WM_RBUTTONDOWN:
+ * WM_KEYDOWN:
+ * WM_KEYUP:
+ * WM_MOUSEMOVE: By default, these will cause the program to terminate.
+ * Unless the password option is enabled. In that case
+ * the DlgGetPassword() dialog box is brought up.
+ *
+ * WM_NCACTIVATE:
+ * WM_ACTIVATEAPP:
+ * WM_ACTIVATE: By default, if the wParam parameter is FALSE (signifying
+ * that transfer is being taken away from the application),
+ * then the program will terminate. Termination is
+ * accomplished by generating a WM_CLOSE message. This way,
+ * if the user sets something up in the WM_CREATE, a
+ * WM_DESTROY will be generated and it can be destroyed
+ * properly.
+ * This message is ignored, however is the password option
+ * is enabled.
+ */
+LRESULT WINAPI DefScreenSaverProc(HWND, UINT, WPARAM, LPARAM);
+
+/* A function is also needed for configuring the screen saver. The function
+ * should be exactly like it is below and must be exported such that the
+ * program can use MAKEPROCINSTANCE on it and call up a dialog box. Further-
+ * more, the template used for the dialog must be called
+ * ScreenSaverConfigure to allow the main function to access it...
+ */
+BOOL WINAPI ScreenSaverConfigureDialog(HWND, UINT, WPARAM, LPARAM);
+
+/* This function is called from the ScreenSaveConfigureDialog() to change
+ * the Screen Saver's password. Note: passwords are GLOBAL to all
+ * screen savers using this model. Whether or not the password is enabled
+ * is LOCAL to a particular screen saver.
+ */
+BOOL WINAPI DlgChangePassword(HWND, UINT, WPARAM, LPARAM);
+
+/* To allow the programmer the ability to register child control windows, this
+ * function is called prior to the creation of the dialog box. Any
+ * registering that is required should be done here, or return TRUE if none
+ * is needed...
+ */
+BOOL _cdecl RegisterDialogClasses(HINSTANCE);
+
+/* The following three functions are called by DefScreenSaverProc and must
+ * be exported by all screensavers using this model.
+ */
+BOOL WINAPI DlgGetPassword(HWND, UINT, WPARAM, LPARAM);
+BOOL WINAPI DlgInvalidPassword(HWND, UINT, WPARAM, LPARAM);
+DWORD WINAPI HelpMessageFilterHookFunction(int, WORD, LPMSG);
+
+/*
+ * There are only three other points that should be of notice:
+ * 1) The screen saver must have a string declared as 'szAppName' contaning the
+ * name of the screen saver, and it must be declared as a global.
+ * 2) The screen saver EXE file should be renamed to a file with a SCR
+ * extension so that the screen saver dialog form the control panel can
+ * find it when is searches for screen savers.
+ */
+#define WS_GT (WS_GROUP | WS_TABSTOP)
+#define MAXFILELEN 13
+#define TITLEBARNAMELEN 40
+#define BUFFLEN 255
+
+/* The following globals are defined in scrnsave.lib */
+extern HINSTANCE _cdecl hMainInstance;
+extern HWND _cdecl hMainWindow;
+extern char _cdecl szName[TITLEBARNAMELEN];
+extern char _cdecl szIsPassword[22];
+extern char _cdecl szIniFile[MAXFILELEN];
+extern char _cdecl szScreenSaver[22];
+extern char _cdecl szPassword[16];
+extern char _cdecl szDifferentPW[BUFFLEN];
+extern char _cdecl szChangePW[30];
+extern char _cdecl szBadOldPW[BUFFLEN];
+extern char _cdecl szHelpFile[MAXFILELEN];
+extern char _cdecl szNoHelpMemory[BUFFLEN];
+extern UINT _cdecl MyHelpMessage;
+extern HOOKPROC _cdecl fpMessageFilter;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* !RC_INVOKED */
+
+#endif /* !_INC_SCRNSAVE */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/search.h b/private/oleauto/tools/win16/hdos/c800/include/search.h
new file mode 100644
index 000000000..5418887c6
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/search.h
@@ -0,0 +1,59 @@
+/***
+*search.h - declarations for searcing/sorting routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the declarations for the sorting and
+* searching routines.
+* [System V]
+*
+****/
+
+#ifndef _INC_SEARCH
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+
+/* function prototypes */
+
+void * __cdecl bsearch(const void *, const void *,
+ size_t, size_t, int (__cdecl *)(const void *,
+ const void *));
+void * __cdecl _lfind(const void *, const void *,
+ unsigned int *, unsigned int, int (__cdecl *)
+ (const void *, const void *));
+void * __cdecl _lsearch(const void *, void *,
+ unsigned int *, unsigned int, int (__cdecl *)
+ (const void *, const void *));
+void __cdecl qsort(void *, size_t, size_t, int (__cdecl *)
+ (const void *, const void *));
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+void * __cdecl lfind(const void *, const void *,
+ unsigned int *, unsigned int, int (__cdecl *)
+ (const void *, const void *));
+void * __cdecl lsearch(const void *, void *,
+ unsigned int *, unsigned int, int (__cdecl *)
+ (const void *, const void *));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_SEARCH
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/setjmp.h b/private/oleauto/tools/win16/hdos/c800/include/setjmp.h
new file mode 100644
index 000000000..4f96d20c6
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/setjmp.h
@@ -0,0 +1,44 @@
+/***
+*setjmp.h - definitions/declarations for setjmp/longjmp routines
+*
+* Copyright (c) 1985-1993, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the machine-dependent buffer used by
+* setjmp/longjmp to save and restore the program state, and
+* declarations for those routines.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_SETJMP
+
+#ifndef __cplusplus
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+/* define the buffer type for holding the state information */
+
+#define _JBLEN 9 /* bp, di, si, sp, ret addr, ds */
+
+#ifndef _JMP_BUF_DEFINED
+typedef int jmp_buf[_JBLEN];
+#define _JMP_BUF_DEFINED
+#endif
+
+/* ANSI requires setjmp be a macro */
+
+#define setjmp _setjmp
+
+/* function prototypes */
+
+int __cdecl _setjmp(jmp_buf);
+void __cdecl longjmp(jmp_buf, int);
+
+#endif
+
+#define _INC_SETJMP
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/share.h b/private/oleauto/tools/win16/hdos/c800/include/share.h
new file mode 100644
index 000000000..bc5398db4
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/share.h
@@ -0,0 +1,29 @@
+/***
+*share.h - defines file sharing modes for sopen
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the file sharing modes for sopen().
+*
+****/
+
+#ifndef _INC_SHARE
+
+#define _SH_COMPAT 0x00 /* compatibility mode */
+#define _SH_DENYRW 0x10 /* deny read/write mode */
+#define _SH_DENYWR 0x20 /* deny write mode */
+#define _SH_DENYRD 0x30 /* deny read mode */
+#define _SH_DENYNO 0x40 /* deny none mode */
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define SH_COMPAT _SH_COMPAT
+#define SH_DENYRW _SH_DENYRW
+#define SH_DENYWR _SH_DENYWR
+#define SH_DENYRD _SH_DENYRD
+#define SH_DENYNO _SH_DENYNO
+#endif
+
+#define _INC_SHARE
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/shellapi.h b/private/oleauto/tools/win16/hdos/c800/include/shellapi.h
new file mode 100644
index 000000000..af978b924
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/shellapi.h
@@ -0,0 +1,88 @@
+/*****************************************************************************\
+* *
+* shellapi.h - SHELL.DLL functions, types, and definitions *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_SHELLAPI
+#define _INC_SHELLAPI
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/* If included with Windows 3.0 windows.h: define 3.1-compatible types */
+
+#ifndef _INC_WINDOWS
+
+#define HDROP HANDLE
+#define WINAPI FAR PASCAL
+#define LPCSTR LPSTR
+#define UINT WORD
+
+#else
+
+DECLARE_HANDLE(HDROP);
+
+#endif
+
+/* return codes from Registration functions */
+#define ERROR_SUCCESS 0L
+#define ERROR_BADDB 1L
+#define ERROR_BADKEY 2L
+#define ERROR_CANTOPEN 3L
+#define ERROR_CANTREAD 4L
+#define ERROR_CANTWRITE 5L
+#define ERROR_OUTOFMEMORY 6L
+#define ERROR_INVALID_PARAMETER 7L
+#define ERROR_ACCESS_DENIED 8L
+
+#define REG_SZ 1 /* string type */
+
+#define HKEY_CLASSES_ROOT 1
+
+typedef DWORD HKEY;
+typedef HKEY FAR* PHKEY;
+
+LONG WINAPI RegOpenKey(HKEY, LPCSTR, HKEY FAR*);
+LONG WINAPI RegCreateKey(HKEY, LPCSTR, HKEY FAR*);
+LONG WINAPI RegCloseKey(HKEY);
+LONG WINAPI RegDeleteKey(HKEY, LPCSTR);
+LONG WINAPI RegSetValue(HKEY, LPCSTR, DWORD, LPCSTR, DWORD);
+LONG WINAPI RegQueryValue(HKEY, LPCSTR, LPSTR, LONG FAR*);
+LONG WINAPI RegEnumKey(HKEY, DWORD, LPSTR, DWORD);
+
+UINT WINAPI DragQueryFile(HDROP, UINT, LPSTR, UINT);
+BOOL WINAPI DragQueryPoint(HDROP, POINT FAR*);
+void WINAPI DragFinish(HDROP);
+void WINAPI DragAcceptFiles(HWND, BOOL);
+
+HICON WINAPI ExtractIcon(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex);
+
+/* error values for ShellExecute() beyond the regular WinExec() codes */
+#define SE_ERR_SHARE 26
+#define SE_ERR_ASSOCINCOMPLETE 27
+#define SE_ERR_DDETIMEOUT 28
+#define SE_ERR_DDEFAIL 29
+#define SE_ERR_DDEBUSY 30
+#define SE_ERR_NOASSOC 31
+
+HINSTANCE WINAPI ShellExecute(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, int iShowCmd);
+HINSTANCE WINAPI FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* RC_INVOKED */
+
+#endif /* _INC_SHELLAPI */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/signal.h b/private/oleauto/tools/win16/hdos/c800/include/signal.h
new file mode 100644
index 000000000..c8894ef02
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/signal.h
@@ -0,0 +1,70 @@
+/***
+*signal.h - defines signal values and routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the signal values and declares the signal functions.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_SIGNAL
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _SIG_ATOMIC_T_DEFINED
+typedef int sig_atomic_t;
+#define _SIG_ATOMIC_T_DEFINED
+#endif
+
+#define NSIG 23 /* maximum signal number + 1 */
+
+
+/* signal types */
+
+#ifndef _WINDOWS
+#define SIGINT 2 /* Ctrl-C sequence */
+#define SIGILL 4 /* illegal instruction - invalid function image */
+#endif
+#define SIGFPE 8 /* floating point exception */
+#ifndef _WINDOWS
+#define SIGSEGV 11 /* segment violation */
+#define SIGTERM 15 /* Software termination signal from kill */
+#define SIGABRT 22 /* abnormal termination triggered by abort call */
+#endif
+
+
+/* signal action codes */
+
+/* default signal action */
+#define SIG_DFL (void (__cdecl *)(int))0
+
+/* ignore */
+#define SIG_IGN (void (__cdecl *)(int))1
+
+/* signal error value (returned by signal call on error) */
+#define SIG_ERR (void (__cdecl *)(int))-1
+
+
+/* function prototypes */
+
+void (__cdecl * __cdecl signal(int,
+ void (__cdecl *)(int)))(int);
+#ifndef _MT
+int __cdecl raise(int);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_SIGNAL
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/stdarg.h b/private/oleauto/tools/win16/hdos/c800/include/stdarg.h
new file mode 100644
index 000000000..f1d6f7ef7
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/stdarg.h
@@ -0,0 +1,52 @@
+/***
+*stdarg.h - defines ANSI-style macros for variable argument functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines ANSI-style macros for accessing arguments
+* of functions which take a variable number of arguments.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_STDARG
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _WINDLL
+#define _FARARG_ __far
+#else
+#define _FARARG_
+#endif
+
+#if (_MSC_VER <= 600)
+#define __far _far
+#endif
+
+#ifndef _VA_LIST_DEFINED
+typedef char _FARARG_ *va_list;
+#define _VA_LIST_DEFINED
+#endif
+
+/*
+ * define a macro to compute the size of a type, variable or expression,
+ * rounded up to the nearest multiple of sizeof(int). This number is its
+ * size as function argument (Intel architecture). Note that the macro
+ * depends on sizeof(int) being a power of 2!
+ */
+
+#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
+
+#define va_start(ap,v) ap = (va_list)&v + _INTSIZEOF(v)
+#define va_arg(ap,t) ( *(t _FARARG_ *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
+#define va_end(ap) ap = (va_list)0
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STDARG
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/stddef.h b/private/oleauto/tools/win16/hdos/c800/include/stddef.h
new file mode 100644
index 000000000..2423b1229
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/stddef.h
@@ -0,0 +1,80 @@
+/***
+*stddef.h - definitions/declarations for common constants, types, variables
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains definitions and declarations for some commonly
+* used constants, types, and variables.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_STDDEF
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+/* define the NULL pointer value and the offsetof() macro */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+
+/* offset of field m in a struct s */
+
+#define offsetof(s,m) (size_t)( (char *)&(((s *)0)->m) - (char *)0 )
+
+
+/* errno declaration */
+
+#ifdef _MT
+extern int __far * __cdecl __far volatile _errno(void);
+#define errno (*_errno())
+#else
+extern int __near __cdecl volatile errno;
+#endif
+
+
+/* define the implementation dependent size types */
+
+#ifndef _PTRDIFF_T_DEFINED
+typedef int ptrdiff_t;
+#define _PTRDIFF_T_DEFINED
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+
+
+#ifdef _MT
+/* define pointer to thread id value */
+
+extern int __far *_threadid;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STDDEF
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/stdio.h b/private/oleauto/tools/win16/hdos/c800/include/stdio.h
new file mode 100644
index 000000000..b968e041c
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/stdio.h
@@ -0,0 +1,352 @@
+/***
+*stdio.h - definitions/declarations for standard I/O routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the structures, values, macros, and functions
+* used by the level 2 I/O ("standard I/O") routines.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_STDIO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _VA_LIST_DEFINED
+typedef char *va_list;
+#define _VA_LIST_DEFINED
+#endif
+
+/* buffered I/O macros */
+
+#define BUFSIZ 512
+#ifdef _MT
+#define _NFILE 40
+#else
+#define _NFILE 20
+#endif
+#define EOF (-1)
+
+#ifndef _FILE_DEFINED
+#pragma pack(2)
+struct _iobuf {
+ char *_ptr;
+ int _cnt;
+ char *_base;
+ char _flag;
+ char _file;
+ };
+typedef struct _iobuf FILE;
+#pragma pack()
+#define _FILE_DEFINED
+#endif
+
+
+/* _P_tmpnam: Directory where temporary files may be created.
+ * L_tmpnam size = size of _P_tmpdir
+ * + 1 (in case _P_tmpdir does not end in "\\")
+ * + 6 (for the temp number string)
+ * + 1 (for the null terminator)
+ */
+
+#define _P_tmpdir "\\"
+#define L_tmpnam sizeof(_P_tmpdir)+8
+
+
+/* fseek constants */
+
+#define SEEK_CUR 1
+#define SEEK_END 2
+#define SEEK_SET 0
+
+
+/* minimum guaranteed filename length, open file count, and unique
+ * tmpnam filenames.
+ */
+
+#define FILENAME_MAX 128
+#define FOPEN_MAX 18
+#define TMP_MAX 32767
+#define _SYS_OPEN 20
+
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+
+/* declare _iob[] array */
+
+#ifndef _STDIO_DEFINED
+extern FILE __near __cdecl _iob[];
+#endif
+
+
+/* define file position type */
+
+#ifndef _FPOS_T_DEFINED
+typedef long fpos_t;
+#define _FPOS_T_DEFINED
+#endif
+
+
+/* standard file pointers */
+
+#ifndef _WINDLL
+#define stdin (&_iob[0])
+#define stdout (&_iob[1])
+#define stderr (&_iob[2])
+#endif
+#ifndef _WINDOWS
+#define _stdaux (&_iob[3])
+#define _stdprn (&_iob[4])
+#endif
+
+
+#define _IOREAD 0x01
+#define _IOWRT 0x02
+
+#define _IOFBF 0x0
+#define _IOLBF 0x40
+#define _IONBF 0x04
+
+#define _IOMYBUF 0x08
+#define _IOEOF 0x10
+#define _IOERR 0x20
+#define _IOSTRG 0x40
+#define _IORW 0x80
+
+
+#ifdef _WINDOWS
+#ifndef _WINDLL
+#ifndef _WINFO_DEFINED
+/* interface version number */
+#define _QWINVER 0
+
+/* max number of windows */
+#define _WFILE 20
+
+/* values for windows screen buffer size */
+#define _WINBUFINF 0
+#define _WINBUFDEF -1
+
+/* size/move settings */
+#define _WINSIZEMIN 1
+#define _WINSIZEMAX 2
+#define _WINSIZERESTORE 3
+#define _WINSIZECHAR 4
+
+/* size/move query types */
+#define _WINMAXREQ 100
+#define _WINCURRREQ 101
+
+/* values for closing window */
+#define _WINPERSIST 1
+#define _WINNOPERSIST 0
+
+/* pseudo file handle for frame window */
+#define _WINFRAMEHAND -1
+
+/* menu items */
+#define _WINSTATBAR 1
+#define _WINTILE 2
+#define _WINCASCADE 3
+#define _WINARRANGE 4
+
+/* quickwin exit options */
+#define _WINEXITPROMPT 1
+#define _WINEXITNOPERSIST 2
+#define _WINEXITPERSIST 3
+
+/* open structure */
+#pragma pack(2)
+struct _wopeninfo {
+ unsigned int _version;
+ const char __far * _title;
+ long _wbufsize;
+ };
+#pragma pack()
+
+/* size/move structure */
+struct _wsizeinfo {
+ unsigned int _version;
+ unsigned int _type;
+ unsigned int _x;
+ unsigned int _y;
+ unsigned int _h;
+ unsigned int _w;
+ };
+#define _WINFO_DEFINED
+#endif
+#endif
+#endif
+
+/* function prototypes */
+
+#ifndef _STDIO_DEFINED
+int __cdecl _filbuf(FILE *);
+int __cdecl _flsbuf(int, FILE *);
+FILE * __cdecl _fsopen(const char *,
+ const char *, int);
+void __cdecl clearerr(FILE *);
+int __cdecl fclose(FILE *);
+int __cdecl _fcloseall(void);
+FILE * __cdecl _fdopen(int, const char *);
+int __cdecl feof(FILE *);
+int __cdecl ferror(FILE *);
+int __cdecl fflush(FILE *);
+int __cdecl fgetc(FILE *);
+#ifndef _WINDLL
+int __cdecl _fgetchar(void);
+#endif
+int __cdecl fgetpos(FILE *, fpos_t *);
+char * __cdecl fgets(char *, int, FILE *);
+int __cdecl _fileno(FILE *);
+int __cdecl _flushall(void);
+FILE * __cdecl fopen(const char *,
+ const char *);
+int __cdecl fprintf(FILE *, const char *, ...);
+int __cdecl fputc(int, FILE *);
+#ifndef _WINDLL
+int __cdecl _fputchar(int);
+#endif
+int __cdecl fputs(const char *, FILE *);
+size_t __cdecl fread(void *, size_t, size_t, FILE *);
+FILE * __cdecl freopen(const char *,
+ const char *, FILE *);
+#ifndef _WINDLL
+int __cdecl fscanf(FILE *, const char *, ...);
+#endif
+int __cdecl fsetpos(FILE *, const fpos_t *);
+int __cdecl fseek(FILE *, long, int);
+long __cdecl ftell(FILE *);
+#ifdef _WINDOWS
+#ifndef _WINDLL
+FILE * __cdecl _fwopen(struct _wopeninfo *, struct _wsizeinfo *, const char *);
+#endif
+#endif
+size_t __cdecl fwrite(const void *, size_t, size_t,
+ FILE *);
+int __cdecl getc(FILE *);
+#ifndef _WINDLL
+int __cdecl getchar(void);
+char * __cdecl gets(char *);
+#endif
+int __cdecl _getw(FILE *);
+#ifndef _WINDLL
+void __cdecl perror(const char *);
+#endif
+#ifndef _WINDLL
+int __cdecl printf(const char *, ...);
+#endif
+int __cdecl putc(int, FILE *);
+#ifndef _WINDLL
+int __cdecl putchar(int);
+int __cdecl puts(const char *);
+#endif
+int __cdecl _putw(int, FILE *);
+int __cdecl remove(const char *);
+int __cdecl rename(const char *, const char *);
+void __cdecl rewind(FILE *);
+int __cdecl _rmtmp(void);
+#ifndef _WINDLL
+int __cdecl scanf(const char *, ...);
+#endif
+void __cdecl setbuf(FILE *, char *);
+int __cdecl setvbuf(FILE *, char *, int, size_t);
+int __cdecl _snprintf(char *, size_t, const char *, ...);
+int __cdecl sprintf(char *, const char *, ...);
+#ifndef _WINDLL
+int __cdecl sscanf(const char *, const char *, ...);
+#endif
+char * __cdecl _tempnam(char *, char *);
+FILE * __cdecl tmpfile(void);
+char * __cdecl tmpnam(char *);
+int __cdecl ungetc(int, FILE *);
+int __cdecl _unlink(const char *);
+int __cdecl vfprintf(FILE *, const char *, va_list);
+#ifndef _WINDLL
+int __cdecl vprintf(const char *, va_list);
+#endif
+int __cdecl _vsnprintf(char *, size_t, const char *, va_list);
+int __cdecl vsprintf(char *, const char *, va_list);
+#define _STDIO_DEFINED
+#endif
+
+/* macro definitions */
+
+#define feof(_stream) ((_stream)->_flag & _IOEOF)
+#define ferror(_stream) ((_stream)->_flag & _IOERR)
+#define _fileno(_stream) ((int)(unsigned char)(_stream)->_file)
+#define getc(_stream) (--(_stream)->_cnt >= 0 ? 0xff & *(_stream)->_ptr++ \
+ : _filbuf(_stream))
+#define putc(_c,_stream) (--(_stream)->_cnt >= 0 \
+ ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) : _flsbuf((_c),(_stream)))
+#ifndef _WINDLL
+#define getchar() getc(stdin)
+#define putchar(_c) putc((_c),stdout)
+#endif
+
+#ifdef _MT
+#undef getc
+#undef putc
+#undef getchar
+#undef putchar
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define P_tmpdir _P_tmpdir
+#define SYS_OPEN _SYS_OPEN
+
+#ifndef _WINDOWS
+#define stdaux _stdaux
+#define stdprn _stdprn
+#endif
+
+int __cdecl fcloseall(void);
+FILE * __cdecl fdopen(int, const char *);
+#ifndef _WINDLL
+int __cdecl fgetchar(void);
+#endif
+int __cdecl fileno(FILE *);
+int __cdecl flushall(void);
+#ifndef _WINDLL
+int __cdecl fputchar(int);
+#endif
+int __cdecl getw(FILE *);
+int __cdecl putw(int, FILE *);
+int __cdecl rmtmp(void);
+char * __cdecl tempnam(char *, char *);
+int __cdecl unlink(const char *);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STDIO
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/stdiostr.h b/private/oleauto/tools/win16/hdos/c800/include/stdiostr.h
new file mode 100644
index 000000000..ac8d3e744
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/stdiostr.h
@@ -0,0 +1,55 @@
+/***
+*stdiostr.h - definitions/declarations for stdiobuf, stdiostream
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the stdiostream and stdiobuf classes.
+* [AT&T C++]
+*
+****/
+
+#include <iostream.h>
+#include <stdio.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+#ifndef _INC_STDIOSTREAM
+#define _INC_STDIOSTREAM
+class stdiobuf : public streambuf {
+public:
+ stdiobuf(FILE* f);
+FILE * stdiofile() { return _str; }
+
+virtual int pbackfail(int c);
+virtual int overflow(int c = EOF);
+virtual int underflow();
+virtual streampos seekoff( streamoff, ios::seek_dir, int =ios::in|ios::out);
+virtual int sync();
+ ~stdiobuf();
+ int setrwbuf(int _rsize, int _wsize); // CONSIDER: move to ios::
+// protected:
+// virtual int doallocate();
+private:
+ FILE * _str;
+};
+
+// obsolescent
+class stdiostream : public iostream { // note: spec.'d as : public IOS...
+public:
+ stdiostream(FILE *);
+ ~stdiostream();
+ stdiobuf* rdbuf() const { return (stdiobuf*) ostream::rdbuf(); }
+
+private:
+};
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/stdlib.h b/private/oleauto/tools/win16/hdos/c800/include/stdlib.h
new file mode 100644
index 000000000..d32171a05
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/stdlib.h
@@ -0,0 +1,282 @@
+/***
+*stdlib.h - declarations/definitions for commonly used library functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file contains the function declarations for
+* commonly used library functions which either don't fit somewhere
+* else, or, like toupper/tolower, can't be declared in the normal
+* place for other reasons.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_STDLIB
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#define __pascal _pascal
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+/* exit() arg values */
+
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+
+#ifndef _ONEXIT_T_DEFINED
+typedef int (__cdecl * _onexit_t)();
+typedef int (__far __cdecl * _fonexit_t)();
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+typedef int (__cdecl * onexit_t)();
+#endif
+#define _ONEXIT_T_DEFINED
+#endif
+
+
+/* data structure definitions for div and ldiv runtimes. */
+
+#ifndef _DIV_T_DEFINED
+
+typedef struct _div_t {
+ int quot;
+ int rem;
+} div_t;
+
+typedef struct _ldiv_t {
+ long quot;
+ long rem;
+} ldiv_t;
+
+#define _DIV_T_DEFINED
+#endif
+
+/* maximum value that can be returned by the rand function. */
+
+#define RAND_MAX 0x7fff
+
+extern unsigned short __mb_cur_max; /* mb-len for curr. locale */
+#define MB_CUR_MAX __mb_cur_max
+
+
+/* min and max macros */
+
+#define __max(a,b) (((a) > (b)) ? (a) : (b))
+#define __min(a,b) (((a) < (b)) ? (a) : (b))
+
+
+/* sizes for buffers used by the _makepath() and _splitpath() functions.
+ * note that the sizes include space for 0-terminator
+ */
+
+#define _MAX_PATH 260 /* max. length of full pathname */
+#define _MAX_DRIVE 3 /* max. length of drive component */
+#define _MAX_DIR 256 /* max. length of path component */
+#define _MAX_FNAME 256 /* max. length of file name component */
+#define _MAX_EXT 256 /* max. length of extension component */
+
+/* external variable declarations */
+
+#ifdef _MT
+extern int __far * __cdecl __far volatile _errno(void);
+extern int __far * __cdecl __far __doserrno(void);
+#define errno (*_errno())
+#define _doserrno (*__doserrno())
+#else
+extern int __near __cdecl volatile errno; /* error value */
+extern int __near __cdecl _doserrno; /* OS system error value */
+#endif
+
+extern char * __near __cdecl _sys_errlist[]; /* perror error message table */
+extern int __near __cdecl _sys_nerr; /* # of entries in sys_errlist table */
+extern char ** __near __cdecl _environ; /* pointer to environment table */
+extern int __near __cdecl _fmode; /* default file translation mode */
+#ifndef _WINDOWS
+extern int __near __cdecl _fileinfo; /* open file info mode (for spawn) */
+#endif
+
+extern unsigned int __near __cdecl _psp; /* Program Segment Prefix */
+
+extern char __far * __near __cdecl _pgmptr; /* Pointer to Program name */
+
+/* DOS and Windows major/minor version numbers */
+
+extern unsigned int __near __cdecl _osver;
+extern unsigned char __near __cdecl _osmajor;
+extern unsigned char __near __cdecl _osminor;
+extern unsigned int __near __cdecl _winver;
+extern unsigned char __near __cdecl _winmajor;
+extern unsigned char __near __cdecl _winminor;
+
+/* OS mode */
+
+#define _DOS_MODE 0 /* DOS */
+#define _OS2_MODE 1 /* OS/2 */
+#define _WIN_MODE 2 /* Windows */
+
+extern unsigned char __near __cdecl _osmode;
+
+/* CPU mode */
+
+#define _REAL_MODE 0 /* real mode */
+#define _PROT_MODE 1 /* protect mode */
+
+extern unsigned char __near __cdecl _cpumode;
+
+/* function prototypes */
+
+#ifdef _MT
+double __pascal atof(const char *);
+double __pascal strtod(const char *, char * *);
+ldiv_t __pascal ldiv(long, long);
+#else
+double __cdecl atof(const char *);
+double __cdecl strtod(const char *, char * *);
+ldiv_t __cdecl ldiv(long, long);
+#endif
+
+void __cdecl abort(void);
+int __cdecl abs(int);
+int __cdecl atexit(void (__cdecl *)(void));
+int __cdecl atoi(const char *);
+long __cdecl atol(const char *);
+long double __cdecl _atold(const char *);
+void * __cdecl bsearch(const void *, const void *,
+ size_t, size_t, int (__cdecl *)(const void *,
+ const void *));
+void * __cdecl calloc(size_t, size_t);
+div_t __cdecl div(int, int);
+char * __cdecl _ecvt(double, int, int *, int *);
+#ifndef _WINDLL
+void __cdecl exit(int);
+void __cdecl _exit(int);
+#endif
+int __far __cdecl _fatexit(void (__cdecl __far *)(void));
+char * __cdecl _fcvt(double, int, int *, int *);
+_fonexit_t __far __cdecl _fonexit(_fonexit_t);
+void __cdecl free(void *);
+char * __cdecl _fullpath(char *, const char *,
+ size_t);
+char * __cdecl _gcvt(double, int, char *);
+char * __cdecl getenv(const char *);
+char * __cdecl _itoa(int, char *, int);
+long __cdecl labs(long);
+unsigned long __cdecl _lrotl(unsigned long, int);
+unsigned long __cdecl _lrotr(unsigned long, int);
+char * __cdecl _ltoa(long, char *, int);
+void __cdecl _makepath(char *, const char *,
+ const char *, const char *, const char *);
+void * __cdecl malloc(size_t);
+_onexit_t __cdecl _onexit(_onexit_t);
+#ifndef _WINDLL
+void __cdecl perror(const char *);
+#endif
+int __cdecl _putenv(const char *);
+void __cdecl qsort(void *, size_t, size_t, int (__cdecl *)
+ (const void *, const void *));
+unsigned int __cdecl _rotl(unsigned int, int);
+unsigned int __cdecl _rotr(unsigned int, int);
+int __cdecl rand(void);
+void * __cdecl realloc(void *, size_t);
+void __cdecl _searchenv(const char *, const char *,
+ char *);
+void __cdecl _splitpath(const char *, char *,
+ char *, char *, char *);
+void __cdecl srand(unsigned int);
+long __cdecl strtol(const char *, char * *,
+ int);
+long double __cdecl _strtold(const char *,
+ char * *);
+unsigned long __cdecl strtoul(const char *,
+ char * *, int);
+void __cdecl _swab(char *, char *, int);
+#ifndef _WINDOWS
+int __cdecl system(const char *);
+#endif
+char * __cdecl _ultoa(unsigned long, char *, int);
+
+int __cdecl mblen(const char *, size_t);
+int __cdecl mbtowc(wchar_t *, const char *, size_t);
+int __cdecl wctomb(char *, wchar_t);
+size_t __cdecl mbstowcs(wchar_t *, const char *, size_t);
+size_t __cdecl wcstombs(char *, const wchar_t *, size_t);
+
+/* model-independent function prototypes */
+
+int __far __cdecl _fmblen(const char __far *, size_t);
+int __far __cdecl _fmbtowc(wchar_t __far *, const char __far *,
+ size_t);
+int __far __cdecl _fwctomb(char __far *, wchar_t);
+size_t __far __cdecl _fmbstowcs(wchar_t __far *, const char __far *,
+ size_t);
+size_t __far __cdecl _fwcstombs(char __far *, const wchar_t __far *,
+ size_t);
+
+#ifndef tolower
+int __cdecl tolower(int);
+#endif
+
+#ifndef toupper
+int __cdecl toupper(int);
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#ifndef __cplusplus
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+extern char * __near __cdecl sys_errlist[];
+extern int __near __cdecl sys_nerr;
+extern char ** __near __cdecl environ;
+
+#define DOS_MODE _DOS_MODE
+#define OS2_MODE _OS2_MODE
+
+char * __cdecl ecvt(double, int, int *, int *);
+char * __cdecl fcvt(double, int, int *, int *);
+char * __cdecl gcvt(double, int, char *);
+char * __cdecl itoa(int, char *, int);
+char * __cdecl ltoa(long, char *, int);
+onexit_t __cdecl onexit(onexit_t);
+int __cdecl putenv(const char *);
+void __cdecl swab(char *, char *, int);
+char * __cdecl ultoa(unsigned long, char *, int);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STDLIB
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/streamb.h b/private/oleauto/tools/win16/hdos/c800/include/streamb.h
new file mode 100644
index 000000000..5ac1b51ce
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/streamb.h
@@ -0,0 +1,142 @@
+/***
+*streamb.h - definitions/declarations for the streambuf class
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the streambuf class.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_STREAMB
+#define _INC_STREAMB
+
+
+#ifdef M_I86HM
+#define _HFAR_ __far
+#else
+#define _HFAR_
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+typedef long streampos, streamoff;
+
+class streambuf {
+public:
+
+ virtual ~streambuf();
+
+ inline int in_avail() const;
+ inline int out_waiting() const;
+ int sgetc();
+ int snextc();
+ int sbumpc();
+ void stossc();
+
+ inline int sputbackc(char);
+
+ inline int sputc(int);
+ inline int sputn(const char _HFAR_ *,int);
+ inline int sgetn(char _HFAR_ *,int);
+
+ virtual int sync();
+
+// enum seek_dir { beg=0, cur=1, end=2 }; // CONSIDER: needed ???
+
+ virtual streambuf* setbuf(char _HFAR_ *, int);
+ virtual streampos seekoff(streamoff,ios::seek_dir,int =ios::in|ios::out);
+ virtual streampos seekpos(streampos,int =ios::in|ios::out);
+
+ virtual int xsputn(const char _HFAR_ *,int);
+ virtual int xsgetn(char _HFAR_ *,int);
+
+ virtual int overflow(int =EOF) = 0; // pure virtual function
+ virtual int underflow() = 0; // pure virtual function
+
+ virtual int pbackfail(int);
+
+ void dbp();
+
+protected:
+ streambuf();
+ streambuf(char _HFAR_ *,int);
+
+ inline char _HFAR_ * base() const;
+ inline char _HFAR_ * ebuf() const;
+ inline char _HFAR_ * pbase() const;
+ inline char _HFAR_ * pptr() const;
+ inline char _HFAR_ * epptr() const;
+ inline char _HFAR_ * eback() const;
+ inline char _HFAR_ * gptr() const;
+ inline char _HFAR_ * egptr() const;
+ inline int blen() const;
+ inline void setp(char _HFAR_ *,char _HFAR_ *);
+ inline void setg(char _HFAR_ *,char _HFAR_ *,char _HFAR_ *);
+ inline void pbump(int);
+ inline void gbump(int);
+
+ void setb(char _HFAR_ *,char _HFAR_ *,int =0);
+ inline int unbuffered() const;
+ inline void unbuffered(int);
+ int allocate();
+ virtual int doallocate();
+
+private:
+ int _fAlloc;
+ int _fUnbuf;
+ int x_lastc;
+ char _HFAR_ * _base;
+ char _HFAR_ * _ebuf;
+ char _HFAR_ * _pbase;
+ char _HFAR_ * _pptr;
+ char _HFAR_ * _epptr;
+ char _HFAR_ * _eback;
+ char _HFAR_ * _gptr;
+ char _HFAR_ * _egptr;
+};
+
+inline int streambuf::in_avail() const { return (gptr()<_egptr) ? (_egptr-gptr()) : 0; }
+inline int streambuf::out_waiting() const { return (_pptr>=_pbase) ? (_pptr-_pbase) : 0; }
+
+inline int streambuf::sputbackc(char _c){ return (_eback<gptr()) ? *(--_gptr)=_c : pbackfail(_c); }
+
+inline int streambuf::sputc(int _i){ return (_pptr<_epptr) ? (unsigned char)(*(_pptr++)=(char)_i) : overflow(_i); }
+
+inline int streambuf::sputn(const char _HFAR_ * _str,int _n) { return xsputn(_str, _n); }
+inline int streambuf::sgetn(char _HFAR_ * _str,int _n) { return xsgetn(_str, _n); }
+
+inline char _HFAR_ * streambuf::base() const { return _base; }
+inline char _HFAR_ * streambuf::ebuf() const { return _ebuf; }
+inline int streambuf::blen() const {return ((_ebuf > _base) ? (_ebuf-_base) : 0); }
+inline char _HFAR_ * streambuf::pbase() const { return _pbase; }
+inline char _HFAR_ * streambuf::pptr() const { return _pptr; }
+inline char _HFAR_ * streambuf::epptr() const { return _epptr; }
+inline char _HFAR_ * streambuf::eback() const { return _eback; }
+inline char _HFAR_ * streambuf::gptr() const { return _gptr; }
+inline char _HFAR_ * streambuf::egptr() const { return _egptr; }
+inline void streambuf::gbump(int n) { if (_egptr) _gptr += n; }
+inline void streambuf::pbump(int n) { if (_epptr) _pptr += n; }
+inline void streambuf::setg(char _HFAR_ * eb, char _HFAR_ * g, char _HFAR_ * eg) {_eback=eb; _gptr=g; _egptr=eg; x_lastc=EOF; }
+inline void streambuf::setp(char _HFAR_ * p, char _HFAR_ * ep) {_pptr=_pbase=p; _epptr=ep; }
+inline int streambuf::unbuffered() const { return _fUnbuf; }
+inline void streambuf::unbuffered(int fUnbuf) { _fUnbuf = fUnbuf; }
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/stress.h b/private/oleauto/tools/win16/hdos/c800/include/stress.h
new file mode 100644
index 000000000..388683e78
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/stress.h
@@ -0,0 +1,56 @@
+/*****************************************************************************\
+* *
+* stress.h - Stress functions definitions *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+*******************************************************************************/
+
+#ifndef _INC_STRESS
+#define _INC_STRESS
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/****** Simple types & common helper macros *********************************/
+
+#ifndef _INC_WINDOWS /* If included with 3.0 headers... */
+#define UINT WORD
+#define WINAPI FAR PASCAL
+#endif /* _INC_WINDOWS */
+
+/* stuff for AllocDiskSpace() */
+#define EDS_WIN 1
+#define EDS_CUR 2
+#define EDS_TEMP 3
+
+
+/* function prototypes */
+BOOL WINAPI AllocMem(DWORD);
+void WINAPI FreeAllMem(void);
+int WINAPI AllocFileHandles(int);
+void WINAPI UnAllocFileHandles(void);
+int WINAPI GetFreeFileHandles(void);
+int WINAPI AllocDiskSpace(long,UINT);
+void WINAPI UnAllocDiskSpace(UINT);
+BOOL WINAPI AllocUserMem(UINT);
+void WINAPI FreeAllUserMem(void);
+BOOL WINAPI AllocGDIMem(UINT);
+void WINAPI FreeAllGDIMem(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* RC_INVOKED */
+
+#endif /* _INC_STRESS */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/string.h b/private/oleauto/tools/win16/hdos/c800/include/string.h
new file mode 100644
index 000000000..961417a72
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/string.h
@@ -0,0 +1,167 @@
+/***
+*string.h - declarations for string manipulation functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the function declarations for the string
+* manipulation functions.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_STRING
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+/* function prototypes */
+
+void * __cdecl _memccpy(void *, const void *,
+ int, unsigned int);
+void * __cdecl memchr(const void *, int, size_t);
+int __cdecl memcmp(const void *, const void *,
+ size_t);
+int __cdecl _memicmp(const void *, const void *,
+ unsigned int);
+void * __cdecl memcpy(void *, const void *,
+ size_t);
+void * __cdecl memmove(void *, const void *,
+ size_t);
+void * __cdecl memset(void *, int, size_t);
+void __cdecl _movedata(unsigned int, unsigned int, unsigned int,
+ unsigned int, unsigned int);
+char * __cdecl strcat(char *, const char *);
+char * __cdecl strchr(const char *, int);
+int __cdecl strcmp(const char *, const char *);
+int __cdecl _strcmpi(const char *, const char *);
+int __cdecl strcoll(const char *, const char *);
+int __cdecl _stricmp(const char *, const char *);
+char * __cdecl strcpy(char *, const char *);
+size_t __cdecl strcspn(const char *, const char *);
+char * __cdecl _strdup(const char *);
+char * __cdecl _strerror(const char *);
+char * __cdecl strerror(int);
+size_t __cdecl strlen(const char *);
+char * __cdecl _strlwr(char *);
+char * __cdecl strncat(char *, const char *,
+ size_t);
+int __cdecl strncmp(const char *, const char *,
+ size_t);
+int __cdecl _strnicmp(const char *, const char *,
+ size_t);
+char * __cdecl strncpy(char *, const char *,
+ size_t);
+char * __cdecl _strnset(char *, int, size_t);
+char * __cdecl strpbrk(const char *,
+ const char *);
+char * __cdecl strrchr(const char *, int);
+char * __cdecl _strrev(char *);
+char * __cdecl _strset(char *, int);
+size_t __cdecl strspn(const char *, const char *);
+char * __cdecl strstr(const char *,
+ const char *);
+char * __cdecl strtok(char *, const char *);
+char * __cdecl _strupr(char *);
+size_t __cdecl strxfrm (char *, const char *,
+ size_t);
+
+
+/* model independent function prototypes */
+
+void __far * __far __cdecl _fmemccpy(void __far *, const void __far *,
+ int, unsigned int);
+void __far * __far __cdecl _fmemchr(const void __far *, int, size_t);
+int __far __cdecl _fmemcmp(const void __far *, const void __far *,
+ size_t);
+void __far * __far __cdecl _fmemcpy(void __far *, const void __far *,
+ size_t);
+int __far __cdecl _fmemicmp(const void __far *, const void __far *,
+ unsigned int);
+void __far * __far __cdecl _fmemmove(void __far *, const void __far *,
+ size_t);
+void __far * __far __cdecl _fmemset(void __far *, int, size_t);
+char __far * __far __cdecl _fstrcat(char __far *, const char __far *);
+char __far * __far __cdecl _fstrchr(const char __far *, int);
+int __far __cdecl _fstrcmp(const char __far *, const char __far *);
+int __far __cdecl _fstricmp(const char __far *, const char __far *);
+char __far * __far __cdecl _fstrcpy(char __far *, const char __far *);
+size_t __far __cdecl _fstrcspn(const char __far *, const char __far *);
+char __far * __far __cdecl _fstrdup(const char __far *);
+char __near * __far __cdecl _nstrdup(const char __far *);
+size_t __far __cdecl _fstrlen(const char __far *);
+char __far * __far __cdecl _fstrlwr(char __far *);
+char __far * __far __cdecl _fstrncat(char __far *, const char __far *,
+ size_t);
+int __far __cdecl _fstrncmp(const char __far *, const char __far *,
+ size_t);
+int __far __cdecl _fstrnicmp(const char __far *, const char __far *,
+ size_t);
+char __far * __far __cdecl _fstrncpy(char __far *, const char __far *,
+ size_t);
+char __far * __far __cdecl _fstrnset(char __far *, int, size_t);
+char __far * __far __cdecl _fstrpbrk(const char __far *,
+ const char __far *);
+char __far * __far __cdecl _fstrrchr(const char __far *, int);
+char __far * __far __cdecl _fstrrev(char __far *);
+char __far * __far __cdecl _fstrset(char __far *, int);
+size_t __far __cdecl _fstrspn(const char __far *, const char __far *);
+char __far * __far __cdecl _fstrstr(const char __far *,
+ const char __far *);
+char __far * __far __cdecl _fstrtok(char __far *, const char __far *);
+char __far * __far __cdecl _fstrupr(char __far *);
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+void * __cdecl memccpy(void *, const void *,
+ int, unsigned int);
+int __cdecl memicmp(const void *, const void *,
+ unsigned int);
+void __cdecl movedata(unsigned int, unsigned int, unsigned int,
+ unsigned int, unsigned int);
+int __cdecl strcmpi(const char *, const char *);
+int __cdecl stricmp(const char *, const char *);
+char * __cdecl strdup(const char *);
+char * __cdecl strlwr(char *);
+int __cdecl strnicmp(const char *, const char *,
+ size_t);
+char * __cdecl strnset(char *, int, size_t);
+char * __cdecl strrev(char *);
+char * __cdecl strset(char *, int);
+char * __cdecl strupr(char *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STRING
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/strstrea.h b/private/oleauto/tools/win16/hdos/c800/include/strstrea.h
new file mode 100644
index 000000000..640fc06eb
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/strstrea.h
@@ -0,0 +1,95 @@
+/***
+*strstream.h - definitions/declarations for strstreambuf, strstream
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the strstream and strstreambuf classes.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_STRSTREAM
+#define _INC_STRSTREAM
+
+#include <iostream.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#pragma warning(disable:4505) // disable unwanted /W4 warning
+// #pragma warning(default:4505) // use this to reenable, if necessary
+
+#ifdef M_I86HM
+#define _HFAR_ __far
+#else
+#define _HFAR_
+#endif
+
+class strstreambuf : public streambuf {
+public:
+ strstreambuf();
+ strstreambuf(int);
+ strstreambuf(char _HFAR_ *, int, char _HFAR_ * = 0);
+ strstreambuf(unsigned char _HFAR_ *, int, unsigned char _HFAR_ * = 0);
+ strstreambuf(signed char _HFAR_ _HFAR_ *, int, signed char _HFAR_ * = 0);
+ strstreambuf(void _HFAR_ * (*a)(long), void (*f) (void _HFAR_ *));
+ ~strstreambuf();
+
+ void freeze(int =1);
+ char _HFAR_ * str();
+
+virtual int overflow(int);
+virtual int underflow();
+virtual streambuf* setbuf(char _HFAR_ *, int);
+virtual streampos seekoff(streamoff, ios::seek_dir, int);
+virtual int sync(); // not in spec.
+
+protected:
+virtual int doallocate();
+private:
+ int x_dynamic;
+ int x_bufmin;
+ int _fAlloc;
+ int x_static;
+ void _HFAR_ * (* x_alloc)(long);
+ void (* x_free)(void _HFAR_ *);
+};
+
+class istrstream : public istream {
+public:
+ istrstream(char _HFAR_ *);
+ istrstream(char _HFAR_ *, int);
+ ~istrstream();
+
+inline strstreambuf* rdbuf() const { return (strstreambuf*) ios::rdbuf(); }
+inline char _HFAR_ * str() { return rdbuf()->str(); }
+};
+
+class ostrstream : public ostream {
+public:
+ ostrstream();
+ ostrstream(char _HFAR_ *, int, int = ios::out);
+ ~ostrstream();
+
+inline int pcount() const { return rdbuf()->out_waiting(); }
+inline strstreambuf* rdbuf() const { return (strstreambuf*) ios::rdbuf(); }
+inline char _HFAR_ * str() { return rdbuf()->str(); }
+};
+
+class strstream : public iostream { // strstreambase ???
+public:
+ strstream();
+ strstream(char _HFAR_ *, int, int);
+ ~strstream();
+
+inline int pcount() const { return rdbuf()->out_waiting(); } // not in spec.
+inline strstreambuf* rdbuf() const { return (strstreambuf*) ostream::rdbuf(); }
+inline char _HFAR_ * str() { return rdbuf()->str(); }
+};
+
+// Restore default packing
+#pragma pack()
+
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/time.h b/private/oleauto/tools/win16/hdos/c800/include/time.h
new file mode 100644
index 000000000..edbb46b06
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/time.h
@@ -0,0 +1,129 @@
+/***
+*time.h - definitions/declarations for time routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the various declarations and definitions
+* for the time routines.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_TIME
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#define __pascal _pascal
+#endif
+
+/* implementation defined time types */
+
+#ifndef _TIME_T_DEFINED
+typedef long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+#ifndef _CLOCK_T_DEFINED
+typedef long clock_t;
+#define _CLOCK_T_DEFINED
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+/* structure for use with localtime(), gmtime(), etc. */
+
+#ifndef _TM_DEFINED
+struct tm {
+ int tm_sec; /* seconds after the minute - [0,59] */
+ int tm_min; /* minutes after the hour - [0,59] */
+ int tm_hour; /* hours since midnight - [0,23] */
+ int tm_mday; /* day of the month - [1,31] */
+ int tm_mon; /* months since January - [0,11] */
+ int tm_year; /* years since 1900 */
+ int tm_wday; /* days since Sunday - [0,6] */
+ int tm_yday; /* days since January 1 - [0,365] */
+ int tm_isdst; /* daylight savings time flag */
+ };
+#define _TM_DEFINED
+#endif
+
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+
+/* clock ticks macro - ANSI version */
+
+#define CLOCKS_PER_SEC 1000
+
+
+/* extern declarations for the global variables used by the ctime family of
+ * routines.
+ */
+
+extern int __near __cdecl _daylight; /* non-zero if daylight savings time is used */
+extern long __near __cdecl _timezone; /* difference in seconds between GMT and local time */
+extern char * __near __cdecl _tzname[2];/* standard/daylight savings time zone names */
+
+
+/* function prototypes */
+
+#ifdef _MT
+double __pascal difftime(time_t, time_t);
+#else
+double __cdecl difftime(time_t, time_t);
+#endif
+
+char * __cdecl asctime(const struct tm *);
+char * __cdecl ctime(const time_t *);
+#ifndef _WINDLL
+clock_t __cdecl clock(void);
+#endif
+struct tm * __cdecl gmtime(const time_t *);
+struct tm * __cdecl localtime(const time_t *);
+time_t __cdecl mktime(struct tm *);
+#ifndef _WINDLL
+size_t __cdecl strftime(char *, size_t, const char *,
+ const struct tm *);
+#endif
+char * __cdecl _strdate(char *);
+char * __cdecl _strtime(char *);
+time_t __cdecl time(time_t *);
+void __cdecl _tzset(void);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define CLK_TCK CLOCKS_PER_SEC
+
+extern int __near __cdecl daylight;
+extern long __near __cdecl timezone;
+extern char * __near __cdecl tzname[2];
+
+void __cdecl tzset(void);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_TIME
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/toolhelp.h b/private/oleauto/tools/win16/hdos/c800/include/toolhelp.h
new file mode 100644
index 000000000..25b918f80
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/toolhelp.h
@@ -0,0 +1,469 @@
+/*****************************************************************************\
+* *
+* toolhelp.h - toolhelp.dll functions, types, and definitions *
+* *
+* Version 1.0 *
+* *
+* NOTE: windows.h must be #included first *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_TOOLHELP
+#define _INC_TOOLHELP
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+#ifndef _INC_WINDOWS /* If included with 3.0 headers... */
+#define LPCSTR LPSTR
+#define WINAPI FAR PASCAL
+#define CALLBACK FAR PASCAL
+#define UINT WORD
+#define HMODULE HANDLE
+#define HINSTANCE HANDLE
+#define HLOCAL HANDLE
+#define HGLOBAL HANDLE
+#define HTASK HANDLE
+#endif /* _INC_WINDOWS */
+
+/****** General symbols ******************************************************/
+#define MAX_DATA 11
+#define MAX_PATH 255
+#define MAX_MODULE_NAME 8 + 1
+#define MAX_CLASSNAME 255
+
+/****** Global heap walking ***************************************************/
+typedef struct tagGLOBALINFO
+{
+ DWORD dwSize;
+ WORD wcItems;
+ WORD wcItemsFree;
+ WORD wcItemsLRU;
+} GLOBALINFO;
+
+typedef struct tagGLOBALENTRY
+{
+ DWORD dwSize;
+ DWORD dwAddress;
+ DWORD dwBlockSize;
+ HGLOBAL hBlock;
+ WORD wcLock;
+ WORD wcPageLock;
+ WORD wFlags;
+ BOOL wHeapPresent;
+ HGLOBAL hOwner;
+ WORD wType;
+ WORD wData;
+ DWORD dwNext;
+ DWORD dwNextAlt;
+} GLOBALENTRY;
+
+/* GlobalFirst()/GlobalNext() flags */
+#define GLOBAL_ALL 0
+#define GLOBAL_LRU 1
+#define GLOBAL_FREE 2
+
+/* GLOBALENTRY.wType entries */
+#define GT_UNKNOWN 0
+#define GT_DGROUP 1
+#define GT_DATA 2
+#define GT_CODE 3
+#define GT_TASK 4
+#define GT_RESOURCE 5
+#define GT_MODULE 6
+#define GT_FREE 7
+#define GT_INTERNAL 8
+#define GT_SENTINEL 9
+#define GT_BURGERMASTER 10
+
+/* If GLOBALENTRY.wType==GT_RESOURCE, the following is GLOBALENTRY.wData: */
+#define GD_USERDEFINED 0
+#define GD_CURSORCOMPONENT 1
+#define GD_BITMAP 2
+#define GD_ICONCOMPONENT 3
+#define GD_MENU 4
+#define GD_DIALOG 5
+#define GD_STRING 6
+#define GD_FONTDIR 7
+#define GD_FONT 8
+#define GD_ACCELERATORS 9
+#define GD_RCDATA 10
+#define GD_ERRTABLE 11
+#define GD_CURSOR 12
+#define GD_ICON 14
+#define GD_NAMETABLE 15
+#define GD_MAX_RESOURCE 15
+
+/* GLOBALENTRY.wFlags */
+#define GF_PDB_OWNER 0x0100 /* Low byte is KERNEL flags */
+
+BOOL WINAPI GlobalInfo(GLOBALINFO FAR* lpGlobalInfo);
+BOOL WINAPI GlobalFirst(GLOBALENTRY FAR* lpGlobal, WORD wFlags);
+BOOL WINAPI GlobalNext(GLOBALENTRY FAR* lpGlobal, WORD wFlags);
+BOOL WINAPI GlobalEntryHandle(GLOBALENTRY FAR* lpGlobal, HGLOBAL hItem);
+BOOL WINAPI GlobalEntryModule(GLOBALENTRY FAR* lpGlobal, HMODULE hModule, WORD wSeg);
+WORD WINAPI GlobalHandleToSel(HGLOBAL hMem);
+
+/****** Local heap walking ***************************************************/
+
+typedef struct tagLOCALINFO
+{
+ DWORD dwSize;
+ WORD wcItems;
+} LOCALINFO;
+
+typedef struct tagLOCALENTRY
+{
+ DWORD dwSize;
+ HLOCAL hHandle;
+ WORD wAddress;
+ WORD wSize;
+ WORD wFlags;
+ WORD wcLock;
+ WORD wType;
+ WORD hHeap;
+ WORD wHeapType;
+ WORD wNext;
+} LOCALENTRY;
+
+/* LOCALENTRY.wHeapType flags */
+#define NORMAL_HEAP 0
+#define USER_HEAP 1
+#define GDI_HEAP 2
+
+/* LOCALENTRY.wFlags */
+#define LF_FIXED 1
+#define LF_FREE 2
+#define LF_MOVEABLE 4
+
+/* LOCALENTRY.wType */
+#define LT_NORMAL 0
+#define LT_FREE 0xff
+#define LT_GDI_PEN 1 /* LT_GDI_* is for GDI's heap */
+#define LT_GDI_BRUSH 2
+#define LT_GDI_FONT 3
+#define LT_GDI_PALETTE 4
+#define LT_GDI_BITMAP 5
+#define LT_GDI_RGN 6
+#define LT_GDI_DC 7
+#define LT_GDI_DISABLED_DC 8
+#define LT_GDI_METADC 9
+#define LT_GDI_METAFILE 10
+#define LT_GDI_MAX LT_GDI_METAFILE
+#define LT_USER_CLASS 1 /* LT_USER_* is for USER's heap */
+#define LT_USER_WND 2
+#define LT_USER_STRING 3
+#define LT_USER_MENU 4
+#define LT_USER_CLIP 5
+#define LT_USER_CBOX 6
+#define LT_USER_PALETTE 7
+#define LT_USER_ED 8
+#define LT_USER_BWL 9
+#define LT_USER_OWNERDRAW 10
+#define LT_USER_SPB 11
+#define LT_USER_CHECKPOINT 12
+#define LT_USER_DCE 13
+#define LT_USER_MWP 14
+#define LT_USER_PROP 15
+#define LT_USER_LBIV 16
+#define LT_USER_MISC 17
+#define LT_USER_ATOMS 18
+#define LT_USER_LOCKINPUTSTATE 19
+#define LT_USER_HOOKLIST 20
+#define LT_USER_USERSEEUSERDOALLOC 21
+#define LT_USER_HOTKEYLIST 22
+#define LT_USER_POPUPMENU 23
+#define LT_USER_HANDLETABLE 32
+#define LT_USER_MAX LT_USER_HANDLETABLE
+
+BOOL WINAPI LocalInfo(LOCALINFO FAR* lpLocal, HGLOBAL hHeap);
+BOOL WINAPI LocalFirst(LOCALENTRY FAR* lpLocal, HGLOBAL hHeap);
+BOOL WINAPI LocalNext(LOCALENTRY FAR* lpLocal);
+
+/****** Stack Tracing ********************************************************/
+
+typedef struct tagSTACKTRACEENTRY
+{
+ DWORD dwSize;
+ HTASK hTask;
+ WORD wSS;
+ WORD wBP;
+ WORD wCS;
+ WORD wIP;
+ HMODULE hModule;
+ WORD wSegment;
+ WORD wFlags;
+} STACKTRACEENTRY;
+
+/* STACKTRACEENTRY.wFlags values */
+#define FRAME_FAR 0
+#define FRAME_NEAR 1
+
+BOOL WINAPI StackTraceFirst(STACKTRACEENTRY FAR* lpStackTrace, HTASK hTask);
+BOOL WINAPI StackTraceCSIPFirst(STACKTRACEENTRY FAR* lpStackTrace,
+ WORD wSS, WORD wCS, WORD wIP, WORD wBP);
+BOOL WINAPI StackTraceNext(STACKTRACEENTRY FAR* lpStackTrace);
+
+/****** Module list walking **************************************************/
+
+typedef struct tagMODULEENTRY
+{
+ DWORD dwSize;
+ char szModule[MAX_MODULE_NAME + 1];
+ HMODULE hModule;
+ WORD wcUsage;
+ char szExePath[MAX_PATH + 1];
+ WORD wNext;
+} MODULEENTRY;
+
+BOOL WINAPI ModuleFirst(MODULEENTRY FAR* lpModule);
+BOOL WINAPI ModuleNext(MODULEENTRY FAR* lpModule);
+HMODULE WINAPI ModuleFindName(MODULEENTRY FAR* lpModule, LPCSTR lpstrName);
+HMODULE WINAPI ModuleFindHandle(MODULEENTRY FAR* lpModule, HMODULE hModule);
+
+/****** Task list walking *****************************************************/
+
+typedef struct tagTASKENTRY
+{
+ DWORD dwSize;
+ HTASK hTask;
+ HTASK hTaskParent;
+ HINSTANCE hInst;
+ HMODULE hModule;
+ WORD wSS;
+ WORD wSP;
+ WORD wStackTop;
+ WORD wStackMinimum;
+ WORD wStackBottom;
+ WORD wcEvents;
+ HGLOBAL hQueue;
+ char szModule[MAX_MODULE_NAME + 1];
+ WORD wPSPOffset;
+ HANDLE hNext;
+} TASKENTRY;
+
+BOOL WINAPI TaskFirst(TASKENTRY FAR* lpTask);
+BOOL WINAPI TaskNext(TASKENTRY FAR* lpTask);
+BOOL WINAPI TaskFindHandle(TASKENTRY FAR* lpTask, HTASK hTask);
+DWORD WINAPI TaskSetCSIP(HTASK hTask, WORD wCS, WORD wIP);
+DWORD WINAPI TaskGetCSIP(HTASK hTask);
+BOOL WINAPI TaskSwitch(HTASK hTask, DWORD dwNewCSIP);
+
+/****** Window Class enumeration **********************************************/
+
+typedef struct tagCLASSENTRY
+{
+ DWORD dwSize;
+ HMODULE hInst; /* This is really an hModule */
+ char szClassName[MAX_CLASSNAME + 1];
+ WORD wNext;
+} CLASSENTRY;
+
+BOOL WINAPI ClassFirst(CLASSENTRY FAR* lpClass);
+BOOL WINAPI ClassNext(CLASSENTRY FAR* lpClass);
+
+/****** Information functions *************************************************/
+
+typedef struct tagMEMMANINFO
+{
+ DWORD dwSize;
+ DWORD dwLargestFreeBlock;
+ DWORD dwMaxPagesAvailable;
+ DWORD dwMaxPagesLockable;
+ DWORD dwTotalLinearSpace;
+ DWORD dwTotalUnlockedPages;
+ DWORD dwFreePages;
+ DWORD dwTotalPages;
+ DWORD dwFreeLinearSpace;
+ DWORD dwSwapFilePages;
+ WORD wPageSize;
+} MEMMANINFO;
+
+BOOL WINAPI MemManInfo(MEMMANINFO FAR* lpEnhMode);
+
+typedef struct tagSYSHEAPINFO
+{
+ DWORD dwSize;
+ WORD wUserFreePercent;
+ WORD wGDIFreePercent;
+ HGLOBAL hUserSegment;
+ HGLOBAL hGDISegment;
+} SYSHEAPINFO;
+
+BOOL WINAPI SystemHeapInfo(SYSHEAPINFO FAR* lpSysHeap);
+
+/****** Interrupt Handling ****************************************************/
+
+/* Hooked interrupts */
+#define INT_DIV0 0
+#define INT_1 1
+#define INT_3 3
+#define INT_UDINSTR 6
+#define INT_STKFAULT 12
+#define INT_GPFAULT 13
+#define INT_BADPAGEFAULT 14
+#define INT_CTLALTSYSRQ 256
+
+/* TOOLHELP Interrupt callbacks registered with InterruptRegister should
+ * always be written in assembly language. The stack frame is not
+ * compatible with high level language conventions.
+ *
+ * This stack frame looks as follows to the callback. All registers
+ * should be preserved across this callback to allow restarting fault.
+ * ------------
+ * | Flags | [SP + 0Eh]
+ * | CS | [SP + 0Ch]
+ * | IP | [SP + 0Ah]
+ * | Handle | [SP + 08h]
+ * |Exception#| [SP + 06h]
+ * | AX | [SP + 04h] AX Saved to allow MakeProcInstance
+ * | Ret CS | [SP + 02h]
+ * SP---> | Ret IP | [SP + 00h]
+ * ------------
+ */
+BOOL WINAPI InterruptRegister(HTASK hTask, FARPROC lpfnIntCallback);
+BOOL WINAPI InterruptUnRegister(HTASK hTask);
+
+/* Notifications:
+ * When a notification callback is called, two parameters are passed
+ * in: a WORD, wID, and another DWORD, dwData. wID is one of
+ * the values NFY_* below. Callback routines should ignore unrecog-
+ * nized values to preserve future compatibility. Callback routines
+ * are also passed a dwData value. This may contain data or may be
+ * a FAR pointer to a structure, or may not be used depending on
+ * which notification is being received.
+ *
+ * In all cases, if the return value of the callback is TRUE, the
+ * notification will NOT be passed on to other callbacks. It has
+ * been handled. This should be used sparingly and only with certain
+ * notifications. Callbacks almost always return FALSE.
+ */
+
+/* NFY_UNKNOWN: An unknown notification has been returned from KERNEL. Apps
+ * should ignore these.
+ */
+#define NFY_UNKNOWN 0
+
+/* NFY_LOADSEG: dwData points to a NFYLOADSEG structure */
+#define NFY_LOADSEG 1
+typedef struct tagNFYLOADSEG
+{
+ DWORD dwSize;
+ WORD wSelector;
+ WORD wSegNum;
+ WORD wType; /* Low bit set if data seg, clear if code seg */
+ WORD wcInstance; /* Instance count ONLY VALID FOR DATA SEG */
+ LPCSTR lpstrModuleName;
+} NFYLOADSEG;
+
+/* NFY_FREESEG: LOWORD(dwData) is the selector of the segment being freed */
+#define NFY_FREESEG 2
+
+/* NFY_STARTDLL: dwData points to a NFYLOADSEG structure */
+#define NFY_STARTDLL 3
+typedef struct tagNFYSTARTDLL
+{
+ DWORD dwSize;
+ HMODULE hModule;
+ WORD wCS;
+ WORD wIP;
+} NFYSTARTDLL;
+
+/* NFY_STARTTASK: dwData is the CS:IP of the start address of the task */
+#define NFY_STARTTASK 4
+
+/* NFY_EXITTASK: The low byte of dwData contains the program exit code */
+#define NFY_EXITTASK 5
+
+/* NFY_DELMODULE: LOWORD(dwData) is the handle of the module to be freed */
+#define NFY_DELMODULE 6
+
+/* NFY_RIP: dwData points to a NFYRIP structure */
+#define NFY_RIP 7
+typedef struct tagNFYRIP
+{
+ DWORD dwSize;
+ WORD wIP;
+ WORD wCS;
+ WORD wSS;
+ WORD wBP;
+ WORD wExitCode;
+} NFYRIP;
+
+/* NFY_TASKIN: No data. Callback should do GetCurrentTask() */
+#define NFY_TASKIN 8
+
+/* NFY_TASKOUT: No data. Callback should do GetCurrentTask() */
+#define NFY_TASKOUT 9
+
+/* NFY_INCHAR: Return value from callback is used. If NULL, mapped to 'i' */
+#define NFY_INCHAR 10
+
+/* NFY_OUTSTR: dwData points to the string to be displayed */
+#define NFY_OUTSTR 11
+
+/* NFY_LOGERROR: dwData points to a NFYLOGERROR struct */
+#define NFY_LOGERROR 12
+typedef struct tagNFYLOGERROR
+{
+ DWORD dwSize;
+ UINT wErrCode;
+ void FAR* lpInfo; /* Error code-dependent */
+} NFYLOGERROR;
+
+/* NFY_LOGPARAMERROR: dwData points to a NFYLOGPARAMERROR struct */
+#define NFY_LOGPARAMERROR 13
+typedef struct tagNFYLOGPARAMERROR
+{
+ DWORD dwSize;
+ UINT wErrCode;
+ FARPROC lpfnErrorAddr;
+ void FAR* FAR* lpBadParam;
+} NFYLOGPARAMERROR;
+
+/* NotifyRegister() flags */
+#define NF_NORMAL 0
+#define NF_TASKSWITCH 1
+#define NF_RIP 2
+
+typedef BOOL (CALLBACK* LPFNNOTIFYCALLBACK)(WORD wID, DWORD dwData);
+
+BOOL WINAPI NotifyRegister(HTASK hTask, LPFNNOTIFYCALLBACK lpfn, WORD wFlags);
+BOOL WINAPI NotifyUnRegister(HTASK hTask);
+
+/****** Miscellaneous *********************************************************/
+
+void WINAPI TerminateApp(HTASK hTask, WORD wFlags);
+
+/* TerminateApp() flag values */
+#define UAE_BOX 0
+#define NO_UAE_BOX 1
+
+DWORD WINAPI MemoryRead(WORD wSel, DWORD dwOffset, void FAR* lpBuffer, DWORD dwcb);
+DWORD WINAPI MemoryWrite(WORD wSel, DWORD dwOffset, void FAR* lpBuffer, DWORD dwcb);
+
+typedef struct tagTIMERINFO
+{
+ DWORD dwSize;
+ DWORD dwmsSinceStart;
+ DWORD dwmsThisVM;
+} TIMERINFO;
+
+BOOL WINAPI TimerCount(TIMERINFO FAR* lpTimer);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif
+
+#endif /* !_INC_TOOLHELP */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/toolhelp.inc b/private/oleauto/tools/win16/hdos/c800/include/toolhelp.inc
new file mode 100644
index 000000000..37537623b
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/toolhelp.inc
@@ -0,0 +1,292 @@
+;**************************************************************************
+;* TOOLHELP.INC
+;*
+;* Assembly-language public include file for TOOLHELP.DLL
+;*
+;**************************************************************************
+
+;** General symbol values
+MAX_DATA EQU 11
+MAX_PATH EQU 255
+MAX_MODULE_NAME EQU 8 + 1 ;Leave room for the zero and padding
+MAX_CLASSNAME EQU 255
+
+; ----- Global heap walking -----
+
+GLOBALENTRY STRUC
+ge_dwSize DD ? ;Structure version
+ge_dwAddress DD ? ;This block's address
+ge_dwBlockSize DD ? ;This block's size
+ge_hBlock DW ? ;This block's handle
+ge_wcLock DW ? ;Lock count
+ge_wcPageLock DW ? ;Page lock count
+ge_wFlags DW ? ;Block flags
+ge_wHeapPresent DW ? ;Size of available local heap
+ge_hOwner DW ? ;Owner handle
+ge_wType DW ? ;Block type
+ge_wData DW ? ;Type-specific data
+ge_dwNext DD ? ;Pointer to next block
+ge_dwNextAlt DD ? ;Next free/LRU block in chain
+GLOBALENTRY ENDS
+
+; ** GlobalFirst()/GlobalNext() flags
+GLOBAL_ALL EQU 0
+GLOBAL_LRU EQU 1
+GLOBAL_FREE EQU 2
+
+; ** GLOBALENTRY.ge_wType entries
+GT_UNKNOWN EQU 0
+GT_DGROUP EQU 1
+GT_DATA EQU 2
+GT_CODE EQU 3
+GT_TASK EQU 4
+GT_RESOURCE EQU 5
+GT_MODULE EQU 6
+GT_FREE EQU 7
+GT_INTERNAL EQU 8
+GT_SENTINEL EQU 9
+GT_BURGERMASTER EQU 10
+
+; ** if GLOBALENTRY.wType==GT_RESOURCE, the following is GLOBALENTRY.wData:
+GD_USERDEFINED EQU 0
+GD_CURSORCOMPONENT EQU 1
+GD_BITMAP EQU 2
+GD_ICONCOMPONENT EQU 3
+GD_MENU EQU 4
+GD_DIALOG EQU 5
+GD_STRING EQU 6
+GD_FONTDIR EQU 7
+GD_FONT EQU 8
+GD_ACCELERATORS EQU 9
+GD_RCDATA EQU 10
+GD_ERRTABLE EQU 11
+GD_CURSOR EQU 12
+GD_ICON EQU 14
+GD_NAMETABLE EQU 15
+GD_MAX_RESOURCE EQU 15
+
+;** GLOBALENTRY.wFlags
+GF_PDB_OWNER EQU 100h ;Low byte is KERNEL flags
+
+; ----- Local heap walking -----
+
+LOCALENTRY STRUC
+le_dwSize DD ?
+le_hHandle DW ?
+le_wAddress DW ?
+le_wSize DW ?
+le_wFlags DW ?
+le_wcLock DW ?
+le_wType DW ?
+le_hHeap DW ?
+le_wHeapType DW ?
+le_wNext DW ?
+LOCALENTRY ENDS
+
+; ** LOCALENTRY.wHeapType flags
+NORMAL_HEAP EQU 0
+USER_HEAP EQU 1
+GDI_HEAP EQU 2
+
+;** LOCALENTRY.wFlags
+LF_FIXED EQU 1
+LF_FREE EQU 2
+LF_MOVEABLE EQU 4
+
+;** LOCALENTRY.wType
+LT_NORMAL EQU 0
+LT_GDI_PEN EQU 1
+LT_GDI_BRUSH EQU 2
+LT_GDI_FONT EQU 3
+LT_GDI_PALETTE EQU 4
+LT_GDI_BITMAP EQU 5
+LT_GDI_RGN EQU 6
+LT_GDI_DC EQU 7
+LT_GDI_DISABLED_DC EQU 8
+LT_GDI_METADC EQU 9
+LT_GDI_METAFILE EQU 10
+LT_GDI_MAX EQU LT_GDI_METAFILE
+LT_FREE EQU 0ffh
+
+; ----- Stack tracing -----
+
+STACKTRACEENTRY STRUC
+st_dwSize DD ?
+st_hTask DW ?
+st_wSS DW ?
+st_wBP DW ?
+st_wCS DW ?
+st_wIP DW ?
+st_hModule DW ?
+st_wSegment DW ?
+st_wFlags DW ?
+STACKTRACEENTRY ENDS
+
+;** STACKTRACEENTRY.wFlags values
+FRAME_FAR EQU 0
+FRAME_NEAR EQU 1
+
+; ----- Module list walking -----
+
+MODULEENTRY STRUC
+me_dwSize DD ?
+me_szModule DB MAX_MODULE_NAME + 1 DUP(?)
+me_hModule DW ?
+me_wcUsage DW ?
+me_szExePath DB MAX_PATH + 1 + 1 DUP(?)
+me_wNext DW ?
+MODULEENTRY ENDS
+
+; ----- Task list walking -----
+
+TASKENTRY STRUC
+te_dwSize DD ?
+te_hTask DW ?
+te_hTaskParent DW ?
+te_hInst DW ?
+te_hModule DW ?
+te_wSS DW ?
+te_wSP DW ?
+te_wStackTop DW ?
+te_wStackMinimum DW ?
+te_wStackBottom DW ?
+te_wcEvents DW ?
+te_hQueue DW ?
+te_szModule DB MAX_MODULE_NAME + 1 DUP(?)
+te_wPSPOffset DW ?
+te_hNext DW ?
+TASKENTRY ENDS
+
+;** TaskSwitch() return values
+TS_ERROR EQU 0
+TS_NEW EQU 1
+TS_OLD EQU 2
+
+; ----- Window Class enumeration -----
+
+CLASSENTRY STRUC
+ce_dwSize DD ?
+ce_hInst DW ?
+ce_szClassName DB MAX_CLASSNAME + 1 DUP(?)
+ce_wNext DW ?
+CLASSENTRY ENDS
+
+; ----- Information functions -----
+
+VMEMMANINFO STRUC
+vmm_dwSize DD ?
+vmm_dwLargestFreeBlock DD ?
+vmm_dwMaxPagesAvailable DD ?
+vmm_dwMaxPagesLockable DD ?
+vmm_dwTotalLinearSpace DD ?
+vmm_dwTotalUnlockedPages DD ?
+vmm_dwFreePages DD ?
+vmm_dwTotalPages DD ?
+vmm_dwFreeLinearSpace DD ?
+vmm_dwSwapFilePages DD ?
+vmm_wPageSize DW ?
+VMEMMANINFO ENDS
+
+SYSHEAPINFO STRUC
+si_dwSize DD ?
+si_wUserFreePercent DW ?
+si_wGDIFreePercent DW ?
+si_hUserSegment DW ?
+si_hGDISegment DW ?
+SYSHEAPINFO ENDS
+
+; ----- Notifications -----
+
+;* NFY_UNKNOWN: An unknown notification has been returned from KERNEL. Apps
+;* should ignore these.
+;*
+NFY_UNKNOWN EQU 0
+
+;** NFY_LOADSEG: dwData points to a NFYLOADSEG structure
+NFY_LOADSEG EQU 1
+NFYLOADSEG STRUC
+nls_dwSize DD ?
+nls_wSelector DW ?
+nls_wSegNum DW ?
+nls_wType DW ? ;Low bit set for DATA, clear for CODE
+nls_wcInstance DW ? ;Instance count ONLY VALID FOR DATA!
+nls_lpstrModuleName DD ?
+NFYLOADSEG ENDS
+
+;** NFY_FREESEG: LOWORD(dwData) is the selector of the segment being freed
+NFY_FREESEG EQU 2
+
+;** NFY_STARTDLL: dwData points to a NFYSTARTDLL structure
+NFY_STARTDLL EQU 3
+NFYSTARTDLL STRUC
+nsd_dwSize DD ?
+nsd_hModule DW ?
+nsd_wCS DW ?
+nsd_wIP DW ?
+NFYSTARTDLL ENDS
+
+;** NFY_STARTTASK: dwData is the CS:IP of the task start address
+NFY_STARTTASK EQU 4
+
+;** NFY_EXITTASK: The low byte of dwData contains the program exit code
+NFY_EXITTASK EQU 5
+
+;** NFY_DELMODULE: LOWORD(dwData) is the handle of the module to be freed
+NFY_DELMODULE EQU 6
+
+;** NFY_RIP: LOWORD(dwData) is the fatal exit code
+;** NFY_RIP: dwData points to a NFYRIP structure
+NFY_RIP EQU 7
+NFYRIP STRUC
+nrp_dwSize DD ?
+nrp_wIP DW ?
+nrp_wCS DW ?
+nrp_wSS DW ?
+nrp_wBP DW ?
+nrp_wExitCode DW ?
+NFYRIP ENDS
+
+;** NFY_TASKIN: No data. Callback should do GetCurrentTask()
+NFY_TASKIN EQU 8
+
+;** NFY_TASKOUT: No data. Callback should do GetCurrentTask()
+NFY_TASKOUT EQU 9
+
+;** NFY_INCHAR: Return value of callback is used. If FALSE, mapped to 'i'
+NFY_INCHAR EQU 10
+
+;** NFY_OUTSTR: dwData points to the string to be displayed
+NFY_OUTSTR EQU 11
+
+;** NFY_LOGERROR: dwData points to a NFYLOGERROR struct
+NFY_LOGERROR EQU 12
+NFYLOGERROR STRUC
+nle_dwSize DD ?
+nle_wErrCode DW ?
+nle_lpInfo DD ? ;Error-code dependent
+NFYLOGERROR ENDS
+
+;** NFY_LOGPARAMERROR: dwData points to a NFYLOGPARAMERROR struct
+NFY_LOGPARAMERROR EQU 13
+NFYLOGPARAMERROR STRUC
+nlp_dwSize DD ?
+nlp_wErrCode DW ?
+nlp_lpfnErrorAddr DD ?
+nlp_lpBadParam DD ?
+NFYLOGPARAMERROR ENDS
+
+;** NotifyRegister() flags
+NF_NORMAL EQU 0
+NF_TASKSWITCH EQU 1
+NF_RIP EQU 2
+
+;** TerminateApp() flag values
+UAE_BOX EQU 0
+NO_UAE_BOX EQU 1
+
+TIMERINFO STRUC
+ti_dwSize DD ?
+ti_dwmsSinceStart DD ?
+ti_dwmsThisVM DD ?
+TIMERINFO ENDS
+
diff --git a/private/oleauto/tools/win16/hdos/c800/include/varargs.h b/private/oleauto/tools/win16/hdos/c800/include/varargs.h
new file mode 100644
index 000000000..0692f60f6
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/varargs.h
@@ -0,0 +1,52 @@
+/***
+*varargs.h - XENIX style macros for variable argument functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines XENIX style macros for accessing arguments of a
+* function which takes a variable number of arguments.
+* [System V]
+*
+****/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _WINDLL
+#define _FARARG_ __far
+#else
+#define _FARARG_
+#endif
+
+#if (_MSC_VER <= 600)
+#define __far _far
+#endif
+
+#ifdef __STDC__
+#error varargs.h incompatible with ANSI (use stdarg.h)
+#endif
+
+#ifndef _VA_LIST_DEFINED
+typedef char _FARARG_ *va_list;
+#define _VA_LIST_DEFINED
+#endif
+
+/*
+ * define a macro to compute the size of a type, variable or expression,
+ * rounded up to the nearest multiple of sizeof(int). This number is its
+ * size as function argument (Intel architecture). Note that the macro
+ * depends on sizeof(int) being a power of 2!
+ */
+
+#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
+
+#define va_dcl va_list va_alist;
+#define va_start(ap) ap = (va_list)&va_alist
+#define va_arg(ap,t) ( *(t _FARARG_ *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
+#define va_end(ap) ap = (va_list)0
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/hdos/c800/include/ver.h b/private/oleauto/tools/win16/hdos/c800/include/ver.h
new file mode 100644
index 000000000..cc8f0501e
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/ver.h
@@ -0,0 +1,255 @@
+/*****************************************************************************\
+* *
+* ver.h - Version management functions, types, and definitions *
+* *
+* Include file for VER.DLL and VER.LIB. These libraries are *
+* designed to allow version stamping of Windows executable files*
+* and of special .VER files for DOS executable files. *
+* *
+* The API is unchanged for LIB and DLL versions. *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved *
+* *
+*******************************************************************************
+*
+* #define LIB - To be used with VER.LIB (default is for VER.DLL)
+*
+\*****************************************************************************/
+
+#ifndef _INC_VER
+#define _INC_VER
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/*
+ * If .lib version is being used, declare types used in this file.
+ */
+#ifdef LIB
+
+#ifndef WINAPI /* don't declare if they're already declared */
+#define WINAPI _far _pascal
+#define NEAR _near
+#define FAR _far
+#define PASCAL _pascal
+typedef int BOOL;
+#define TRUE 1
+#define FALSE 0
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned int UINT;
+typedef signed long LONG;
+typedef unsigned long DWORD;
+typedef char far* LPSTR;
+typedef const char far* LPCSTR;
+typedef int HFILE;
+#define OFSTRUCT void /* Not used by the .lib version */
+#define LOWORD(l) ((WORD)(l))
+#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
+#define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))
+#endif /* WINAPI */
+
+#else /* LIB */
+
+/* If .dll version is being used and we're being included with
+ * the 3.0 windows.h, #define compatible type aliases.
+ * If included with the 3.0 windows.h, #define compatible aliases
+ */
+#ifndef _INC_WINDOWS
+#define UINT WORD
+#define LPCSTR LPSTR
+#define HFILE int
+#endif /* !_INC_WINDOWS */
+
+#endif /* !LIB */
+
+/* ----- RC defines ----- */
+#ifdef RC_INVOKED
+#define ID(id) id
+#else
+#define ID(id) MAKEINTRESOURCE(id)
+#endif
+
+/* ----- Symbols ----- */
+#define VS_FILE_INFO ID(16) /* Version stamp res type */
+#define VS_VERSION_INFO ID(1) /* Version stamp res ID */
+#define VS_USER_DEFINED ID(100) /* User-defined res IDs */
+
+/* ----- VS_VERSION.dwFileFlags ----- */
+#define VS_FFI_SIGNATURE 0xFEEF04BDL
+#define VS_FFI_STRUCVERSION 0x00010000L
+#define VS_FFI_FILEFLAGSMASK 0x0000003FL
+
+/* ----- VS_VERSION.dwFileFlags ----- */
+#define VS_FF_DEBUG 0x00000001L
+#define VS_FF_PRERELEASE 0x00000002L
+#define VS_FF_PATCHED 0x00000004L
+#define VS_FF_PRIVATEBUILD 0x00000008L
+#define VS_FF_INFOINFERRED 0x00000010L
+#define VS_FF_SPECIALBUILD 0x00000020L
+
+/* ----- VS_VERSION.dwFileOS ----- */
+#define VOS_UNKNOWN 0x00000000L
+#define VOS_DOS 0x00010000L
+#define VOS_OS216 0x00020000L
+#define VOS_OS232 0x00030000L
+#define VOS_NT 0x00040000L
+
+#define VOS__BASE 0x00000000L
+#define VOS__WINDOWS16 0x00000001L
+#define VOS__PM16 0x00000002L
+#define VOS__PM32 0x00000003L
+#define VOS__WINDOWS32 0x00000004L
+
+#define VOS_DOS_WINDOWS16 0x00010001L
+#define VOS_DOS_WINDOWS32 0x00010004L
+#define VOS_OS216_PM16 0x00020002L
+#define VOS_OS232_PM32 0x00030003L
+#define VOS_NT_WINDOWS32 0x00040004L
+
+/* ----- VS_VERSION.dwFileType ----- */
+#define VFT_UNKNOWN 0x00000000L
+#define VFT_APP 0x00000001L
+#define VFT_DLL 0x00000002L
+#define VFT_DRV 0x00000003L
+#define VFT_FONT 0x00000004L
+#define VFT_VXD 0x00000005L
+#define VFT_STATIC_LIB 0x00000007L
+
+/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV ----- */
+#define VFT2_UNKNOWN 0x00000000L
+#define VFT2_DRV_PRINTER 0x00000001L
+#define VFT2_DRV_KEYBOARD 0x00000002L
+#define VFT2_DRV_LANGUAGE 0x00000003L
+#define VFT2_DRV_DISPLAY 0x00000004L
+#define VFT2_DRV_MOUSE 0x00000005L
+#define VFT2_DRV_NETWORK 0x00000006L
+#define VFT2_DRV_SYSTEM 0x00000007L
+#define VFT2_DRV_INSTALLABLE 0x00000008L
+#define VFT2_DRV_SOUND 0x00000009L
+#define VFT2_DRV_COMM 0x0000000AL
+
+/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_FONT ----- */
+#define VFT2_FONT_RASTER 0x00000001L
+#define VFT2_FONT_VECTOR 0x00000002L
+#define VFT2_FONT_TRUETYPE 0x00000003L
+
+/* ----- VerFindFile() flags ----- */
+#define VFFF_ISSHAREDFILE 0x0001
+
+#define VFF_CURNEDEST 0x0001
+#define VFF_FILEINUSE 0x0002
+#define VFF_BUFFTOOSMALL 0x0004
+
+/* ----- VerInstallFile() flags ----- */
+#define VIFF_FORCEINSTALL 0x0001
+#define VIFF_DONTDELETEOLD 0x0002
+
+#define VIF_TEMPFILE 0x00000001L
+#define VIF_MISMATCH 0x00000002L
+#define VIF_SRCOLD 0x00000004L
+
+#define VIF_DIFFLANG 0x00000008L
+#define VIF_DIFFCODEPG 0x00000010L
+#define VIF_DIFFTYPE 0x00000020L
+
+#define VIF_WRITEPROT 0x00000040L
+#define VIF_FILEINUSE 0x00000080L
+#define VIF_OUTOFSPACE 0x00000100L
+#define VIF_ACCESSVIOLATION 0x00000200L
+#define VIF_SHARINGVIOLATION 0x00000400L
+#define VIF_CANNOTCREATE 0x00000800L
+#define VIF_CANNOTDELETE 0x00001000L
+#define VIF_CANNOTRENAME 0x00002000L
+#define VIF_CANNOTDELETECUR 0x00004000L
+#define VIF_OUTOFMEMORY 0x00008000L
+
+#define VIF_CANNOTREADSRC 0x00010000L
+#define VIF_CANNOTREADDST 0x00020000L
+
+#define VIF_BUFFTOOSMALL 0x00040000L
+
+#ifndef RC_INVOKED /* RC doesn't need to see the rest of this */
+
+/* ----- Types and structures ----- */
+
+typedef signed short int SHORT;
+
+typedef struct tagVS_FIXEDFILEINFO
+{
+ DWORD dwSignature; /* e.g. 0xfeef04bd */
+ DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */
+ DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */
+ DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */
+ DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */
+ DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */
+ DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */
+ DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */
+ DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */
+ DWORD dwFileType; /* e.g. VFT_DRIVER */
+ DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */
+ DWORD dwFileDateMS; /* e.g. 0 */
+ DWORD dwFileDateLS; /* e.g. 0 */
+} VS_FIXEDFILEINFO;
+
+/* ----- Function prototypes ----- */
+
+UINT WINAPI VerFindFile(UINT uFlags, LPCSTR szFileName,
+ LPCSTR szWinDir, LPCSTR szAppDir,
+ LPSTR szCurDir, UINT FAR* lpuCurDirLen,
+ LPSTR szDestDir, UINT FAR* lpuDestDirLen);
+
+DWORD WINAPI VerInstallFile(UINT uFlags,
+ LPCSTR szSrcFileName, LPCSTR szDestFileName, LPCSTR szSrcDir,
+ LPCSTR szDestDir, LPCSTR szCurDir, LPSTR szTmpFile, UINT FAR* lpuTmpFileLen);
+
+/* Returns size of version info in bytes */
+DWORD WINAPI GetFileVersionInfoSize(
+ LPCSTR lpstrFilename, /* Filename of version stamped file */
+ DWORD FAR *lpdwHandle); /* Information for use by GetFileVersionInfo */
+
+/* Read version info into buffer */
+BOOL WINAPI GetFileVersionInfo(
+ LPCSTR lpstrFilename, /* Filename of version stamped file */
+ DWORD dwHandle, /* Information from GetFileVersionSize */
+ DWORD dwLen, /* Length of buffer for info */
+ void FAR* lpData); /* Buffer to place the data structure */
+
+/* Returns size of resource in bytes */
+DWORD WINAPI GetFileResourceSize(
+ LPCSTR lpstrFilename, /* Filename of version stamped file */
+ LPCSTR lpstrResType, /* Type: normally VS_FILE_INFO */
+ LPCSTR lpstrResID, /* ID: normally VS_VERSION_INFO */
+ DWORD FAR *lpdwFileOffset); /* Returns file offset of resource */
+
+/* Reads file resource into buffer */
+BOOL WINAPI GetFileResource(
+ LPCSTR lpstrFilename, /* Filename of version stamped file */
+ LPCSTR lpstrResType, /* Type: normally VS_FILE_INFO */
+ LPCSTR lpstrResID, /* ID: normally VS_VERSION_INFO */
+ DWORD dwFileOffset, /* File offset or NULL */
+ DWORD dwResLen, /* Length of resource to read or NULL */
+ void FAR* lpData); /* Pointer to data buffer */
+
+UINT WINAPI VerLanguageName(UINT wLang, LPSTR szLang, UINT nSize);
+
+UINT WINAPI GetWindowsDir(LPCSTR szAppDir, LPSTR lpBuffer, int nSize);
+
+UINT WINAPI GetSystemDir(LPCSTR szAppDir, LPSTR lpBuffer, int nSize);
+
+BOOL WINAPI VerQueryValue(const void FAR* pBlock, LPCSTR lpSubBlock,
+ void FAR* FAR* lplpBuffer, UINT FAR* lpuLen);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#pragma pack()
+
+#endif /* !RC_INVOKED */
+#endif /* !_INC_VER */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/vmemory.h b/private/oleauto/tools/win16/hdos/c800/include/vmemory.h
new file mode 100644
index 000000000..4a57e93ec
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/vmemory.h
@@ -0,0 +1,60 @@
+/***
+* vmemory.h - Virtual Memory (VM) Management Routines
+*
+* Copyright (c) 1989-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file provides prototypes and definitions for
+* the virtual memory management routines.
+*
+*******************************************************************************/
+
+#ifndef _INC_VMEMORY
+
+#if (_MSC_VER <= 600)
+#define __far _far
+#define __pascal _pascal
+#endif
+
+/* virtual memory handle type */
+typedef unsigned long _vmhnd_t;
+
+/* null handle value */
+#define _VM_NULL ((_vmhnd_t) 0)
+
+/* use all available DOS memory for virtual heap */
+#define _VM_ALLDOS 0
+
+/* swap areas */
+#define _VM_EMS 1
+#define _VM_XMS 2
+#define _VM_DISK 4
+#define _VM_ALLSWAP (_VM_EMS | _VM_XMS | _VM_DISK)
+
+/* clean/dirty flags */
+#define _VM_CLEAN 0
+#define _VM_DIRTY 1
+
+/* function prototypes */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void __far __pascal _vfree(_vmhnd_t);
+int __far __pascal _vheapinit(unsigned int, unsigned int, unsigned int);
+void __far __pascal _vheapterm(void);
+void __far * __far __pascal _vload(_vmhnd_t, int);
+void __far * __far __pascal _vlock(_vmhnd_t);
+unsigned int __far __pascal _vlockcnt(_vmhnd_t);
+_vmhnd_t __far __pascal _vmalloc(unsigned long);
+unsigned long __far __pascal _vmsize(_vmhnd_t);
+_vmhnd_t __far __pascal _vrealloc(_vmhnd_t , unsigned long);
+void __far __pascal _vunlock(_vmhnd_t, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_VMEMORY
+#endif /* _INC_VMEMORY */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/wfext.h b/private/oleauto/tools/win16/hdos/c800/include/wfext.h
new file mode 100644
index 000000000..0cadd0499
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/wfext.h
@@ -0,0 +1,85 @@
+/*****************************************************************************\
+* *
+* wfext.h - Windows File Manager Extensions definitions *
+* *
+* Version 3.10 * *
+* *
+* Copyright (c) 1991-1992, Microsoft Corp. All rights reserved. *
+* *
+*******************************************************************************/
+
+#ifndef _INC_WFEXT
+#define _INC_WFEXT /* #defined if wfext.h has been included */
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+#define MENU_TEXT_LEN 40
+
+#define FMMENU_FIRST 1
+#define FMMENU_LAST 99
+
+#define FMEVENT_LOAD 100
+#define FMEVENT_UNLOAD 101
+#define FMEVENT_INITMENU 102
+#define FMEVENT_USER_REFRESH 103
+#define FMEVENT_SELCHANGE 104
+
+#define FMFOCUS_DIR 1
+#define FMFOCUS_TREE 2
+#define FMFOCUS_DRIVES 3
+#define FMFOCUS_SEARCH 4
+
+#define FM_GETFOCUS (WM_USER + 0x0200)
+#define FM_GETDRIVEINFO (WM_USER + 0x0201)
+#define FM_GETSELCOUNT (WM_USER + 0x0202)
+#define FM_GETSELCOUNTLFN (WM_USER + 0x0203) /* LFN versions are odd */
+#define FM_GETFILESEL (WM_USER + 0x0204)
+#define FM_GETFILESELLFN (WM_USER + 0x0205) /* LFN versions are odd */
+#define FM_REFRESH_WINDOWS (WM_USER + 0x0206)
+#define FM_RELOAD_EXTENSIONS (WM_USER + 0x0207)
+
+typedef struct tagFMS_GETFILESEL
+{
+ UINT wTime;
+ UINT wDate;
+ DWORD dwSize;
+ BYTE bAttr;
+ char szName[260]; /* always fully qualified */
+} FMS_GETFILESEL, FAR *LPFMS_GETFILESEL;
+
+typedef struct tagFMS_GETDRIVEINFO /* for drive */
+{
+ DWORD dwTotalSpace;
+ DWORD dwFreeSpace;
+ char szPath[260]; /* current directory */
+ char szVolume[14]; /* volume label */
+ char szShare[128]; /* if this is a net drive */
+} FMS_GETDRIVEINFO, FAR *LPFMS_GETDRIVEINFO;
+
+typedef struct tagFMS_LOAD
+{
+ DWORD dwSize; /* for version checks */
+ char szMenuName[MENU_TEXT_LEN]; /* output */
+ HMENU hMenu; /* output */
+ UINT wMenuDelta; /* input */
+} FMS_LOAD, FAR *LPFMS_LOAD;
+
+typedef DWORD (CALLBACK *FM_EXT_PROC)(HWND, UINT, LONG);
+typedef DWORD (CALLBACK *FM_UNDELETE_PROC)(HWND, LPSTR);
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+} /* End of extern "C" { */
+#endif /* __cplusplus */
+
+#endif /* _INC_WFEXT */
+
diff --git a/private/oleauto/tools/win16/hdos/c800/include/windows.h b/private/oleauto/tools/win16/hdos/c800/include/windows.h
new file mode 100644
index 000000000..ab1c8ba04
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/windows.h
@@ -0,0 +1,5373 @@
+/*****************************************************************************\
+* *
+* windows.h - Windows functions, types, and definitions *
+* *
+* Version 3.10 *
+* *
+* Copyright (c) 1985-1992, Microsoft Corp. All rights reserved. *
+* *
+*******************************************************************************
+*
+* The following symbols control inclusion of various parts of this file:
+*
+* WINVER Windows version number (0x030a). To exclude
+* definitions introduced in version 3.1 (or above)
+* #define WINVER 0x0300 before #including <windows.h>
+*
+* #define: To prevent inclusion of:
+*
+* NOKERNEL KERNEL APIs and definitions
+* NOGDI GDI APIs and definitions
+* NOUSER USER APIs and definitions
+* NOSOUND Sound APIs and definitions
+* NOCOMM Comm driver APIs and definitions
+* NODRIVERS Installable driver APIs and definitions
+*
+* NOMINMAX min() and max() macros
+* NOLOGERROR LogError() and related definitions
+* NOPROFILER Profiler APIs
+* NOMEMMGR Local and global memory management
+* NOLFILEIO _l* file I/O routines
+* NOOPENFILE OpenFile and related definitions
+* NORESOURCE Resource management
+* NOATOM Atom management
+* NOLANGUAGE Character test routines
+* NOLSTRING lstr* string management routines
+* NODBCS Double-byte character set routines
+* NOKEYBOARDINFO Keyboard driver routines
+* NOGDICAPMASKS GDI device capability constants
+* NOCOLOR COLOR_* color values
+* NOGDIOBJ GDI pens, brushes, fonts
+* NODRAWTEXT DrawText() and related definitions
+* NOTEXTMETRIC TEXTMETRIC and related APIs
+* NOSCALABLEFONT Truetype scalable font support
+* NOBITMAP Bitmap support
+* NORASTEROPS GDI Raster operation definitions
+* NOMETAFILE Metafile support
+* NOSYSMETRICS GetSystemMetrics() and related SM_* definitions
+* NOSYSTEMPARAMSINFO SystemParametersInfo() and SPI_* definitions
+* NOMSG APIs and definitions that use MSG structure
+* NOWINSTYLES Window style definitions
+* NOWINOFFSETS Get/SetWindowWord/Long offset definitions
+* NOSHOWWINDOW ShowWindow and related definitions
+* NODEFERWINDOWPOS DeferWindowPos and related definitions
+* NOVIRTUALKEYCODES VK_* virtual key codes
+* NOKEYSTATES MK_* message key state flags
+* NOWH SetWindowsHook and related WH_* definitions
+* NOMENUS Menu APIs
+* NOSCROLL Scrolling APIs and scroll bar control
+* NOCLIPBOARD Clipboard APIs and definitions
+* NOICONS IDI_* icon IDs
+* NOMB MessageBox and related definitions
+* NOSYSCOMMANDS WM_SYSCOMMAND SC_* definitions
+* NOMDI MDI support
+* NOCTLMGR Control management and controls
+* NOWINMESSAGES WM_* window messages
+* NOHELP Help support
+*
+\****************************************************************************/
+
+#ifndef _INC_WINDOWS
+#define _INC_WINDOWS /* #defined if windows.h has been included */
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/* If WINVER is not defined, assume version 3.1 */
+#ifndef WINVER
+#define WINVER 0x030a
+#endif
+
+#ifdef RC_INVOKED
+/* Don't include definitions that RC.EXE can't parse */
+#define NOATOM
+#define NOGDI
+#define NOGDICAPMASKS
+#define NOMETAFILE
+#define NOMINMAX
+#define NOMSG
+#define NOOPENFILE
+#define NORASTEROPS
+#define NOSCROLL
+#define NOSOUND
+#define NOSYSMETRICS
+#define NOTEXTMETRIC
+#define NOWH
+#define NODBCS
+#define NOSYSTEMPARAMSINFO
+#define NOCOMM
+#define NOOEMRESOURCE
+#endif /* RC_INVOKED */
+
+/* Handle OEMRESOURCE for 3.0 compatibility */
+#if (WINVER < 0x030a)
+#define NOOEMRESOURCE
+#ifdef OEMRESOURCE
+#undef NOOEMRESOURCE
+#endif
+#endif
+
+/******* Common definitions and typedefs ***********************************/
+
+#define VOID void
+
+#define FAR _far
+#define NEAR _near
+#define PASCAL _pascal
+#define CDECL _cdecl
+
+#define WINAPI _far _pascal
+#define CALLBACK _far _pascal
+
+/****** Simple types & common helper macros *********************************/
+
+typedef int BOOL;
+#define FALSE 0
+#define TRUE 1
+
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned long DWORD;
+
+typedef unsigned int UINT;
+
+#ifdef STRICT
+typedef signed long LONG;
+#else
+#define LONG long
+#endif
+
+#define LOBYTE(w) ((BYTE)(w))
+#define HIBYTE(w) ((BYTE)(((UINT)(w) >> 8) & 0xFF))
+
+#define LOWORD(l) ((WORD)(DWORD)(l))
+#define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xFFFF))
+
+#define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
+
+#ifndef NOMINMAX
+#ifndef max
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+#endif /* NOMINMAX */
+
+/* Types use for passing & returning polymorphic values */
+typedef UINT WPARAM;
+typedef LONG LPARAM;
+typedef LONG LRESULT;
+
+#define MAKELPARAM(low, high) ((LPARAM)MAKELONG(low, high))
+#define MAKELRESULT(low, high) ((LRESULT)MAKELONG(low, high))
+
+/****** Common pointer types ************************************************/
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+typedef char NEAR* PSTR;
+typedef char NEAR* NPSTR;
+
+
+typedef char FAR* LPSTR;
+typedef const char FAR* LPCSTR;
+
+typedef BYTE NEAR* PBYTE;
+typedef BYTE FAR* LPBYTE;
+
+typedef int NEAR* PINT;
+typedef int FAR* LPINT;
+
+typedef WORD NEAR* PWORD;
+typedef WORD FAR* LPWORD;
+
+typedef long NEAR* PLONG;
+typedef long FAR* LPLONG;
+
+typedef DWORD NEAR* PDWORD;
+typedef DWORD FAR* LPDWORD;
+
+typedef void FAR* LPVOID;
+
+#define MAKELP(sel, off) ((void FAR*)MAKELONG((off), (sel)))
+#define SELECTOROF(lp) HIWORD(lp)
+#define OFFSETOF(lp) LOWORD(lp)
+
+#define FIELDOFFSET(type, field) ((int)(&((type NEAR*)1)->field)-1)
+
+/****** Common handle types *************************************************/
+
+#ifdef STRICT
+typedef const void NEAR* HANDLE;
+#define DECLARE_HANDLE(name) struct name##__ { int unused; }; \
+ typedef const struct name##__ NEAR* name
+#define DECLARE_HANDLE32(name) struct name##__ { int unused; }; \
+ typedef const struct name##__ FAR* name
+#else /* STRICT */
+typedef UINT HANDLE;
+#define DECLARE_HANDLE(name) typedef UINT name
+#define DECLARE_HANDLE32(name) typedef DWORD name
+#endif /* !STRICT */
+
+typedef HANDLE* PHANDLE;
+typedef HANDLE NEAR* SPHANDLE;
+typedef HANDLE FAR* LPHANDLE;
+
+typedef HANDLE HGLOBAL;
+typedef HANDLE HLOCAL;
+
+typedef HANDLE GLOBALHANDLE;
+typedef HANDLE LOCALHANDLE;
+
+typedef UINT ATOM;
+
+#ifdef STRICT
+typedef void (CALLBACK* FARPROC)(void);
+typedef void (NEAR PASCAL* NEARPROC)(void);
+#else
+typedef int (CALLBACK* FARPROC)();
+typedef int (NEAR PASCAL* NEARPROC)();
+#endif
+
+DECLARE_HANDLE(HSTR);
+
+/****** KERNEL typedefs, structures, and functions **************************/
+
+DECLARE_HANDLE(HINSTANCE);
+typedef HINSTANCE HMODULE; /* HMODULEs can be used in place of HINSTANCEs */
+
+#ifndef NOKERNEL
+
+/****** Application entry point function ************************************/
+
+#ifdef STRICT
+int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+#endif
+
+/****** System Information **************************************************/
+
+DWORD WINAPI GetVersion(void);
+
+DWORD WINAPI GetFreeSpace(UINT);
+UINT WINAPI GetCurrentPDB(void);
+
+UINT WINAPI GetWindowsDirectory(LPSTR, UINT);
+UINT WINAPI GetSystemDirectory(LPSTR, UINT);
+
+#if (WINVER >= 0x030a)
+UINT WINAPI GetFreeSystemResources(UINT);
+#define GFSR_SYSTEMRESOURCES 0x0000
+#define GFSR_GDIRESOURCES 0x0001
+#define GFSR_USERRESOURCES 0x0002
+#endif /* WINVER >= 0x030a */
+
+DWORD WINAPI GetWinFlags(void);
+
+#define WF_PMODE 0x0001
+#define WF_CPU286 0x0002
+#define WF_CPU386 0x0004
+#define WF_CPU486 0x0008
+#define WF_STANDARD 0x0010
+#define WF_WIN286 0x0010
+#define WF_ENHANCED 0x0020
+#define WF_WIN386 0x0020
+#define WF_CPU086 0x0040
+#define WF_CPU186 0x0080
+#define WF_LARGEFRAME 0x0100
+#define WF_SMALLFRAME 0x0200
+#define WF_80x87 0x0400
+#define WF_PAGING 0x0800
+#define WF_WLO 0x8000
+
+LPSTR WINAPI GetDOSEnvironment(void);
+
+DWORD WINAPI GetCurrentTime(void);
+DWORD WINAPI GetTickCount(void);
+DWORD WINAPI GetTimerResolution(void);
+
+/****** Error handling ******************************************************/
+
+#if (WINVER >= 0x030a)
+#ifndef NOLOGERROR
+
+void WINAPI LogError(UINT err, void FAR* lpInfo);
+void WINAPI LogParamError(UINT err, FARPROC lpfn, void FAR* param);
+
+/****** LogParamError/LogError values */
+
+/* Error modifier bits */
+
+#define ERR_WARNING 0x8000
+#define ERR_PARAM 0x4000
+
+#define ERR_SIZE_MASK 0x3000
+#define ERR_BYTE 0x1000
+#define ERR_WORD 0x2000
+#define ERR_DWORD 0x3000
+
+/****** LogParamError() values */
+
+/* Generic parameter values */
+#define ERR_BAD_VALUE 0x6001
+#define ERR_BAD_FLAGS 0x6002
+#define ERR_BAD_INDEX 0x6003
+#define ERR_BAD_DVALUE 0x7004
+#define ERR_BAD_DFLAGS 0x7005
+#define ERR_BAD_DINDEX 0x7006
+#define ERR_BAD_PTR 0x7007
+#define ERR_BAD_FUNC_PTR 0x7008
+#define ERR_BAD_SELECTOR 0x6009
+#define ERR_BAD_STRING_PTR 0x700a
+#define ERR_BAD_HANDLE 0x600b
+
+/* KERNEL parameter errors */
+#define ERR_BAD_HINSTANCE 0x6020
+#define ERR_BAD_HMODULE 0x6021
+#define ERR_BAD_GLOBAL_HANDLE 0x6022
+#define ERR_BAD_LOCAL_HANDLE 0x6023
+#define ERR_BAD_ATOM 0x6024
+#define ERR_BAD_HFILE 0x6025
+
+/* USER parameter errors */
+#define ERR_BAD_HWND 0x6040
+#define ERR_BAD_HMENU 0x6041
+#define ERR_BAD_HCURSOR 0x6042
+#define ERR_BAD_HICON 0x6043
+#define ERR_BAD_HDWP 0x6044
+#define ERR_BAD_CID 0x6045
+#define ERR_BAD_HDRVR 0x6046
+
+/* GDI parameter errors */
+#define ERR_BAD_COORDS 0x7060
+#define ERR_BAD_GDI_OBJECT 0x6061
+#define ERR_BAD_HDC 0x6062
+#define ERR_BAD_HPEN 0x6063
+#define ERR_BAD_HFONT 0x6064
+#define ERR_BAD_HBRUSH 0x6065
+#define ERR_BAD_HBITMAP 0x6066
+#define ERR_BAD_HRGN 0x6067
+#define ERR_BAD_HPALETTE 0x6068
+#define ERR_BAD_HMETAFILE 0x6069
+
+
+/**** LogError() values */
+
+/* KERNEL errors */
+#define ERR_GALLOC 0x0001
+#define ERR_GREALLOC 0x0002
+#define ERR_GLOCK 0x0003
+#define ERR_LALLOC 0x0004
+#define ERR_LREALLOC 0x0005
+#define ERR_LLOCK 0x0006
+#define ERR_ALLOCRES 0x0007
+#define ERR_LOCKRES 0x0008
+#define ERR_LOADMODULE 0x0009
+
+/* USER errors */
+#define ERR_CREATEDLG 0x0040
+#define ERR_CREATEDLG2 0x0041
+#define ERR_REGISTERCLASS 0x0042
+#define ERR_DCBUSY 0x0043
+#define ERR_CREATEWND 0x0044
+#define ERR_STRUCEXTRA 0x0045
+#define ERR_LOADSTR 0x0046
+#define ERR_LOADMENU 0x0047
+#define ERR_NESTEDBEGINPAINT 0x0048
+#define ERR_BADINDEX 0x0049
+#define ERR_CREATEMENU 0x004a
+
+/* GDI errors */
+#define ERR_CREATEDC 0x0080
+#define ERR_CREATEMETA 0x0081
+#define ERR_DELOBJSELECTED 0x0082
+#define ERR_SELBITMAP 0x0083
+
+/* Debugging support (DEBUG SYSTEM ONLY) */
+typedef struct tagWINDEBUGINFO
+{
+ UINT flags;
+ DWORD dwOptions;
+ DWORD dwFilter;
+ char achAllocModule[8];
+ DWORD dwAllocBreak;
+ DWORD dwAllocCount;
+} WINDEBUGINFO;
+
+BOOL WINAPI GetWinDebugInfo(WINDEBUGINFO FAR* lpwdi, UINT flags);
+BOOL WINAPI SetWinDebugInfo(const WINDEBUGINFO FAR* lpwdi);
+
+void FAR _cdecl DebugOutput(UINT flags, LPCSTR lpsz, ...);
+
+/* WINDEBUGINFO flags values */
+#define WDI_OPTIONS 0x0001
+#define WDI_FILTER 0x0002
+#define WDI_ALLOCBREAK 0x0004
+
+/* dwOptions values */
+#define DBO_CHECKHEAP 0x0001
+#define DBO_BUFFERFILL 0x0004
+#define DBO_DISABLEGPTRAPPING 0x0010
+#define DBO_CHECKFREE 0x0020
+
+#define DBO_SILENT 0x8000
+
+#define DBO_TRACEBREAK 0x2000
+#define DBO_WARNINGBREAK 0x1000
+#define DBO_NOERRORBREAK 0x0800
+#define DBO_NOFATALBREAK 0x0400
+#define DBO_INT3BREAK 0x0100
+
+/* DebugOutput flags values */
+#define DBF_TRACE 0x0000
+#define DBF_WARNING 0x4000
+#define DBF_ERROR 0x8000
+#define DBF_FATAL 0xc000
+
+/* dwFilter values */
+#define DBF_KERNEL 0x1000
+#define DBF_KRN_MEMMAN 0x0001
+#define DBF_KRN_LOADMODULE 0x0002
+#define DBF_KRN_SEGMENTLOAD 0x0004
+#define DBF_USER 0x0800
+#define DBF_GDI 0x0400
+#define DBF_MMSYSTEM 0x0040
+#define DBF_PENWIN 0x0020
+#define DBF_APPLICATION 0x0008
+#define DBF_DRIVER 0x0010
+
+#endif /* NOLOGERROR */
+#endif /* WINVER >= 0x030a */
+
+void WINAPI FatalExit(int);
+void WINAPI FatalAppExit(UINT, LPCSTR);
+
+BOOL WINAPI ExitWindows(DWORD dwReturnCode, UINT wReserved);
+
+#define EW_RESTARTWINDOWS 0x42
+#if (WINVER >= 0x030a)
+#define EW_REBOOTSYSTEM 0x43
+
+BOOL WINAPI ExitWindowsExec(LPCSTR, LPCSTR);
+#endif /* WINVER >= 0x030a */
+
+void WINAPI DebugBreak(void);
+void WINAPI OutputDebugString(LPCSTR);
+
+/* SetErrorMode() constants */
+#define SEM_FAILCRITICALERRORS 0x0001
+#define SEM_NOGPFAULTERRORBOX 0x0002
+#define SEM_NOOPENFILEERRORBOX 0x8000
+
+UINT WINAPI SetErrorMode(UINT);
+
+/****** Pointer validation **************************************************/
+
+#if (WINVER >= 0x030a)
+
+BOOL WINAPI IsBadReadPtr(const void FAR* lp, UINT cb);
+BOOL WINAPI IsBadWritePtr(void FAR* lp, UINT cb);
+BOOL WINAPI IsBadHugeReadPtr(const void _huge* lp, DWORD cb);
+BOOL WINAPI IsBadHugeWritePtr(void _huge* lp, DWORD cb);
+BOOL WINAPI IsBadCodePtr(FARPROC lpfn);
+BOOL WINAPI IsBadStringPtr(const void FAR* lpsz, UINT cchMax);
+#endif /* WINVER >= 0x030a */
+
+/****** Profiling support ***************************************************/
+
+#ifndef NOPROFILER
+
+int WINAPI ProfInsChk(void);
+void WINAPI ProfSetup(int,int);
+void WINAPI ProfSampRate(int,int);
+void WINAPI ProfStart(void);
+void WINAPI ProfStop(void);
+void WINAPI ProfClear(void);
+void WINAPI ProfFlush(void);
+void WINAPI ProfFinish(void);
+#endif /* NOPROFILER */
+
+/****** Catch/Throw and stack management ************************************/
+
+typedef int CATCHBUF[9];
+typedef int FAR* LPCATCHBUF;
+
+int WINAPI Catch(int FAR*);
+void WINAPI Throw(const int FAR*, int);
+
+void WINAPI SwitchStackBack(void);
+void WINAPI SwitchStackTo(UINT, UINT, UINT);
+
+/****** Module Management ***************************************************/
+
+#define HINSTANCE_ERROR ((HINSTANCE)32)
+
+
+HINSTANCE WINAPI LoadModule(LPCSTR, LPVOID);
+BOOL WINAPI FreeModule(HINSTANCE);
+
+HINSTANCE WINAPI LoadLibrary(LPCSTR);
+void WINAPI FreeLibrary(HINSTANCE);
+
+UINT WINAPI WinExec(LPCSTR, UINT);
+
+HMODULE WINAPI GetModuleHandle(LPCSTR);
+
+int WINAPI GetModuleUsage(HINSTANCE);
+int WINAPI GetModuleFileName(HINSTANCE, LPSTR, int);
+
+FARPROC WINAPI GetProcAddress(HINSTANCE, LPCSTR);
+
+int WINAPI GetInstanceData(HINSTANCE, BYTE*, int);
+
+HGLOBAL WINAPI GetCodeHandle(FARPROC);
+
+typedef struct tagSEGINFO
+{
+ UINT offSegment;
+ UINT cbSegment;
+ UINT flags;
+ UINT cbAlloc;
+ HGLOBAL h;
+ UINT alignShift;
+ UINT reserved[2];
+} SEGINFO;
+typedef SEGINFO FAR* LPSEGINFO;
+
+void WINAPI GetCodeInfo(FARPROC lpProc, SEGINFO FAR* lpSegInfo);
+
+FARPROC WINAPI MakeProcInstance(FARPROC, HINSTANCE);
+void WINAPI FreeProcInstance(FARPROC);
+
+LONG WINAPI SetSwapAreaSize(UINT);
+void WINAPI SwapRecording(UINT);
+void WINAPI ValidateCodeSegments(void);
+
+/* Windows Exit Procedure flag values */
+#define WEP_SYSTEM_EXIT 1
+#define WEP_FREE_DLL 0
+
+/****** Task Management *****************************************************/
+
+#endif /* NOKERNEL */
+
+DECLARE_HANDLE(HTASK);
+
+#ifndef NOKERNEL
+
+UINT WINAPI GetNumTasks(void);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI IsTask(HTASK);
+#endif /* WINVER >= 0x030a */
+
+HTASK WINAPI GetCurrentTask(void);
+
+void WINAPI Yield(void);
+void WINAPI DirectedYield(HTASK);
+
+
+/****** Global memory management ********************************************/
+
+#ifndef NOMEMMGR
+
+/* Global Memory Flags */
+
+#define GMEM_FIXED 0x0000
+#define GMEM_MOVEABLE 0x0002
+#define GMEM_NOCOMPACT 0x0010
+#define GMEM_NODISCARD 0x0020
+#define GMEM_ZEROINIT 0x0040
+#define GMEM_MODIFY 0x0080
+#define GMEM_DISCARDABLE 0x0100
+#define GMEM_NOT_BANKED 0x1000
+#define GMEM_SHARE 0x2000
+#define GMEM_DDESHARE 0x2000
+#define GMEM_NOTIFY 0x4000
+#define GMEM_LOWER GMEM_NOT_BANKED
+
+#define GHND (GMEM_MOVEABLE | GMEM_ZEROINIT)
+#define GPTR (GMEM_FIXED | GMEM_ZEROINIT)
+
+#define GlobalDiscard(h) GlobalReAlloc(h, 0L, GMEM_MOVEABLE)
+
+HGLOBAL WINAPI GlobalAlloc(UINT, DWORD);
+HGLOBAL WINAPI GlobalReAlloc(HGLOBAL, DWORD, UINT);
+HGLOBAL WINAPI GlobalFree(HGLOBAL);
+
+DWORD WINAPI GlobalDosAlloc(DWORD);
+UINT WINAPI GlobalDosFree(UINT);
+
+#ifdef STRICT
+void FAR* WINAPI GlobalLock(HGLOBAL);
+#else
+char FAR* WINAPI GlobalLock(HGLOBAL);
+#endif
+
+BOOL WINAPI GlobalUnlock(HGLOBAL);
+
+DWORD WINAPI GlobalSize(HGLOBAL);
+DWORD WINAPI GlobalHandle(UINT);
+
+/* GlobalFlags return flags (in addition to GMEM_DISCARDABLE) */
+#define GMEM_DISCARDED 0x4000
+#define GMEM_LOCKCOUNT 0x00FF
+UINT WINAPI GlobalFlags(HGLOBAL);
+
+#ifdef STRICT
+void FAR* WINAPI GlobalWire(HGLOBAL);
+#else
+char FAR* WINAPI GlobalWire(HGLOBAL);
+#endif
+
+BOOL WINAPI GlobalUnWire(HGLOBAL);
+
+UINT WINAPI GlobalPageLock(HGLOBAL);
+UINT WINAPI GlobalPageUnlock(HGLOBAL);
+
+void WINAPI GlobalFix(HGLOBAL);
+void WINAPI GlobalUnfix(HGLOBAL);
+
+HGLOBAL WINAPI GlobalLRUNewest(HGLOBAL);
+HGLOBAL WINAPI GlobalLRUOldest(HGLOBAL);
+
+DWORD WINAPI GlobalCompact(DWORD);
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* GNOTIFYPROC)(HGLOBAL);
+#else
+typedef FARPROC GNOTIFYPROC;
+#endif
+
+void WINAPI GlobalNotify(GNOTIFYPROC);
+
+HGLOBAL WINAPI LockSegment(UINT);
+void WINAPI UnlockSegment(UINT);
+
+#define LockData(dummy) LockSegment((UINT)-1)
+#define UnlockData(dummy) UnlockSegment((UINT)-1)
+
+UINT WINAPI AllocSelector(UINT);
+UINT WINAPI FreeSelector(UINT);
+UINT WINAPI AllocDStoCSAlias(UINT);
+UINT WINAPI PrestoChangoSelector(UINT sourceSel, UINT destSel);
+DWORD WINAPI GetSelectorBase(UINT);
+UINT WINAPI SetSelectorBase(UINT, DWORD);
+DWORD WINAPI GetSelectorLimit(UINT);
+UINT WINAPI SetSelectorLimit(UINT, DWORD);
+
+void WINAPI LimitEmsPages(DWORD);
+
+void WINAPI ValidateFreeSpaces(void);
+
+/* Low system memory notification message */
+#define WM_COMPACTING 0x0041
+
+/***** Local Memory Management */
+
+/* Local Memory Flags */
+#define LMEM_FIXED 0x0000
+#define LMEM_MOVEABLE 0x0002
+#define LMEM_NOCOMPACT 0x0010
+#define LMEM_NODISCARD 0x0020
+#define LMEM_ZEROINIT 0x0040
+#define LMEM_MODIFY 0x0080
+#define LMEM_DISCARDABLE 0x0F00
+
+#define LHND (LMEM_MOVEABLE | LMEM_ZEROINIT)
+#define LPTR (LMEM_FIXED | LMEM_ZEROINIT)
+
+#define NONZEROLHND (LMEM_MOVEABLE)
+#define NONZEROLPTR (LMEM_FIXED)
+
+
+#define LocalDiscard(h) LocalReAlloc(h, 0, LMEM_MOVEABLE)
+
+
+HLOCAL WINAPI LocalAlloc(UINT, UINT);
+HLOCAL WINAPI LocalReAlloc(HLOCAL, UINT, UINT);
+HLOCAL WINAPI LocalFree(HLOCAL);
+
+#ifdef STRICT
+void NEAR* WINAPI LocalLock(HLOCAL);
+#else
+char NEAR* WINAPI LocalLock(HLOCAL);
+#endif
+
+BOOL WINAPI LocalUnlock(HLOCAL);
+
+UINT WINAPI LocalSize(HLOCAL);
+#ifdef STRICT
+HLOCAL WINAPI LocalHandle(void NEAR*);
+#else
+HLOCAL WINAPI LocalHandle(UINT);
+#endif
+
+/* LocalFlags return flags (in addition to LMEM_DISCARDABLE) */
+#define LMEM_DISCARDED 0x4000
+#define LMEM_LOCKCOUNT 0x00FF
+
+UINT WINAPI LocalFlags(HLOCAL);
+
+BOOL WINAPI LocalInit(UINT, UINT, UINT);
+UINT WINAPI LocalCompact(UINT);
+UINT WINAPI LocalShrink(HLOCAL, UINT);
+
+#endif /* NOMEMMGR */
+
+/****** File I/O ************************************************************/
+
+#ifndef NOLFILEIO
+
+typedef int HFILE; /* Polymorphic with C runtime file handle type */
+
+#define HFILE_ERROR ((HFILE)-1)
+
+#ifndef NOOPENFILE
+
+/* OpenFile() Structure */
+typedef struct tagOFSTRUCT
+{
+ BYTE cBytes;
+ BYTE fFixedDisk;
+ UINT nErrCode;
+ BYTE reserved[4];
+ char szPathName[128];
+} OFSTRUCT;
+typedef OFSTRUCT* POFSTRUCT;
+typedef OFSTRUCT NEAR* NPOFSTRUCT;
+typedef OFSTRUCT FAR* LPOFSTRUCT;
+
+/* OpenFile() Flags */
+#define OF_READ 0x0000
+#define OF_WRITE 0x0001
+#define OF_READWRITE 0x0002
+#define OF_SHARE_COMPAT 0x0000
+#define OF_SHARE_EXCLUSIVE 0x0010
+#define OF_SHARE_DENY_WRITE 0x0020
+#define OF_SHARE_DENY_READ 0x0030
+#define OF_SHARE_DENY_NONE 0x0040
+#define OF_PARSE 0x0100
+#define OF_DELETE 0x0200
+#define OF_VERIFY 0x0400 /* Used with OF_REOPEN */
+#define OF_SEARCH 0x0400 /* Used without OF_REOPEN */
+#define OF_CANCEL 0x0800
+#define OF_CREATE 0x1000
+#define OF_PROMPT 0x2000
+#define OF_EXIST 0x4000
+#define OF_REOPEN 0x8000
+
+HFILE WINAPI OpenFile(LPCSTR, OFSTRUCT FAR*, UINT);
+
+#endif /* NOOPENFILE */
+
+/* _lopen() flags */
+#define READ 0
+#define WRITE 1
+#define READ_WRITE 2
+
+HFILE WINAPI _lopen(LPCSTR, int);
+HFILE WINAPI _lcreat(LPCSTR, int);
+
+HFILE WINAPI _lclose(HFILE);
+
+LONG WINAPI _llseek(HFILE, LONG, int);
+
+/* _llseek origin values */
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+
+UINT WINAPI _lread(HFILE, void _huge*, UINT);
+UINT WINAPI _lwrite(HFILE, const void _huge*, UINT);
+
+#if (WINVER >= 0x030a)
+long WINAPI _hread(HFILE, void _huge*, long);
+long WINAPI _hwrite(HFILE, const void _huge*, long);
+#endif /* WINVER >= 0x030a */
+
+
+#endif /* NOLFILEIO */
+
+/* GetTempFileName() Flags */
+#define TF_FORCEDRIVE (BYTE)0x80
+
+int WINAPI GetTempFileName(BYTE, LPCSTR, UINT, LPSTR);
+BYTE WINAPI GetTempDrive(char);
+
+/* GetDriveType return values */
+#define DRIVE_REMOVABLE 2
+#define DRIVE_FIXED 3
+#define DRIVE_REMOTE 4
+UINT WINAPI GetDriveType(int);
+
+UINT WINAPI SetHandleCount(UINT);
+
+/****** Network support *****************************************************/
+UINT WINAPI WNetAddConnection(LPSTR, LPSTR, LPSTR);
+UINT WINAPI WNetGetConnection(LPSTR, LPSTR, UINT FAR*);
+UINT WINAPI WNetCancelConnection(LPSTR, BOOL);
+/* Errors */
+#define WN_SUCCESS 0x0000
+#define WN_NOT_SUPPORTED 0x0001
+#define WN_NET_ERROR 0x0002
+#define WN_MORE_DATA 0x0003
+#define WN_BAD_POINTER 0x0004
+#define WN_BAD_VALUE 0x0005
+#define WN_BAD_PASSWORD 0x0006
+#define WN_ACCESS_DENIED 0x0007
+#define WN_FUNCTION_BUSY 0x0008
+#define WN_WINDOWS_ERROR 0x0009
+#define WN_BAD_USER 0x000A
+#define WN_OUT_OF_MEMORY 0x000B
+#define WN_CANCEL 0x000C
+#define WN_CONTINUE 0x000D
+
+/* Connection errors */
+#define WN_NOT_CONNECTED 0x0030
+#define WN_OPEN_FILES 0x0031
+#define WN_BAD_NETNAME 0x0032
+#define WN_BAD_LOCALNAME 0x0033
+#define WN_ALREADY_CONNECTED 0x0034
+#define WN_DEVICE_ERROR 0x0035
+#define WN_CONNECTION_CLOSED 0x0036
+
+/****** Resource Management *************************************************/
+
+DECLARE_HANDLE(HRSRC);
+
+HRSRC WINAPI FindResource(HINSTANCE, LPCSTR, LPCSTR);
+HGLOBAL WINAPI LoadResource(HINSTANCE, HRSRC);
+BOOL WINAPI FreeResource(HGLOBAL);
+
+#ifdef STRICT
+void FAR* WINAPI LockResource(HGLOBAL);
+#else
+char FAR* WINAPI LockResource(HGLOBAL);
+#endif
+
+#define UnlockResource(h) GlobalUnlock(h)
+
+DWORD WINAPI SizeofResource(HINSTANCE, HRSRC);
+
+int WINAPI AccessResource(HINSTANCE, HRSRC);
+
+HGLOBAL WINAPI AllocResource(HINSTANCE, HRSRC, DWORD);
+
+#ifdef STRICT
+typedef HGLOBAL (CALLBACK* RSRCHDLRPROC)(HGLOBAL, HINSTANCE, HRSRC);
+#else
+typedef FARPROC RSRCHDLRPROC;
+#endif
+
+RSRCHDLRPROC WINAPI SetResourceHandler(HINSTANCE, LPCSTR, RSRCHDLRPROC);
+
+#define MAKEINTRESOURCE(i) ((LPCSTR)MAKELP(0, (i)))
+
+#ifndef NORESOURCE
+
+/* Predefined Resource Types */
+#define RT_CURSOR MAKEINTRESOURCE(1)
+#define RT_BITMAP MAKEINTRESOURCE(2)
+#define RT_ICON MAKEINTRESOURCE(3)
+#define RT_MENU MAKEINTRESOURCE(4)
+#define RT_DIALOG MAKEINTRESOURCE(5)
+#define RT_STRING MAKEINTRESOURCE(6)
+#define RT_FONTDIR MAKEINTRESOURCE(7)
+#define RT_FONT MAKEINTRESOURCE(8)
+#define RT_ACCELERATOR MAKEINTRESOURCE(9)
+#define RT_RCDATA MAKEINTRESOURCE(10)
+
+#define RT_GROUP_CURSOR MAKEINTRESOURCE(12)
+#define RT_GROUP_ICON MAKEINTRESOURCE(14)
+
+#endif /* NORESOURCE */
+
+#ifdef OEMRESOURCE
+
+/* OEM Resource Ordinal Numbers */
+#define OBM_CLOSE 32754
+#define OBM_UPARROW 32753
+#define OBM_DNARROW 32752
+#define OBM_RGARROW 32751
+#define OBM_LFARROW 32750
+#define OBM_REDUCE 32749
+#define OBM_ZOOM 32748
+#define OBM_RESTORE 32747
+#define OBM_REDUCED 32746
+#define OBM_ZOOMD 32745
+#define OBM_RESTORED 32744
+#define OBM_UPARROWD 32743
+#define OBM_DNARROWD 32742
+#define OBM_RGARROWD 32741
+#define OBM_LFARROWD 32740
+#define OBM_MNARROW 32739
+#define OBM_COMBO 32738
+#if (WINVER >= 0x030a)
+#define OBM_UPARROWI 32737
+#define OBM_DNARROWI 32736
+#define OBM_RGARROWI 32735
+#define OBM_LFARROWI 32734
+#endif /* WINVER >= 0x030a */
+
+#define OBM_OLD_CLOSE 32767
+#define OBM_SIZE 32766
+#define OBM_OLD_UPARROW 32765
+#define OBM_OLD_DNARROW 32764
+#define OBM_OLD_RGARROW 32763
+#define OBM_OLD_LFARROW 32762
+#define OBM_BTSIZE 32761
+#define OBM_CHECK 32760
+#define OBM_CHECKBOXES 32759
+#define OBM_BTNCORNERS 32758
+#define OBM_OLD_REDUCE 32757
+#define OBM_OLD_ZOOM 32756
+#define OBM_OLD_RESTORE 32755
+
+#define OCR_NORMAL 32512
+#define OCR_IBEAM 32513
+#define OCR_WAIT 32514
+#define OCR_CROSS 32515
+#define OCR_UP 32516
+#define OCR_SIZE 32640
+#define OCR_ICON 32641
+#define OCR_SIZENWSE 32642
+#define OCR_SIZENESW 32643
+#define OCR_SIZEWE 32644
+#define OCR_SIZENS 32645
+#define OCR_SIZEALL 32646
+#define OCR_ICOCUR 32647
+
+#define OIC_SAMPLE 32512
+#define OIC_HAND 32513
+#define OIC_QUES 32514
+#define OIC_BANG 32515
+#define OIC_NOTE 32516
+
+#endif /* OEMRESOURCE */
+
+/****** Atom Management *****************************************************/
+
+#define MAKEINTATOM(i) ((LPCSTR)MAKELP(0, (i)))
+
+#ifndef NOATOM
+
+BOOL WINAPI InitAtomTable(int);
+ATOM WINAPI AddAtom(LPCSTR);
+ATOM WINAPI DeleteAtom(ATOM);
+ATOM WINAPI FindAtom(LPCSTR);
+UINT WINAPI GetAtomName(ATOM, LPSTR, int);
+ATOM WINAPI GlobalAddAtom(LPCSTR);
+ATOM WINAPI GlobalDeleteAtom(ATOM);
+ATOM WINAPI GlobalFindAtom(LPCSTR);
+UINT WINAPI GlobalGetAtomName(ATOM, LPSTR, int);
+HLOCAL WINAPI GetAtomHandle(ATOM);
+
+#endif /* NOATOM */
+
+/****** WIN.INI Support *****************************************************/
+
+/* User Profile Routines */
+UINT WINAPI GetProfileInt(LPCSTR, LPCSTR, int);
+int WINAPI GetProfileString(LPCSTR, LPCSTR, LPCSTR, LPSTR, int);
+BOOL WINAPI WriteProfileString(LPCSTR, LPCSTR, LPCSTR);
+
+UINT WINAPI GetPrivateProfileInt(LPCSTR, LPCSTR, int, LPCSTR);
+int WINAPI GetPrivateProfileString(LPCSTR, LPCSTR, LPCSTR, LPSTR, int, LPCSTR);
+BOOL WINAPI WritePrivateProfileString(LPCSTR, LPCSTR, LPCSTR, LPCSTR);
+
+#define WM_WININICHANGE 0x001A
+
+/****** International & Char Translation Support ****************************/
+
+void WINAPI AnsiToOem(const char _huge*, char _huge*);
+void WINAPI OemToAnsi(const char _huge*, char _huge*);
+
+void WINAPI AnsiToOemBuff(LPCSTR, LPSTR, UINT);
+void WINAPI OemToAnsiBuff(LPCSTR, LPSTR, UINT);
+
+LPSTR WINAPI AnsiNext(LPCSTR);
+LPSTR WINAPI AnsiPrev(LPCSTR, LPCSTR);
+
+LPSTR WINAPI AnsiUpper(LPSTR);
+LPSTR WINAPI AnsiLower(LPSTR);
+
+UINT WINAPI AnsiUpperBuff(LPSTR, UINT);
+UINT WINAPI AnsiLowerBuff(LPSTR, UINT);
+
+
+#ifndef NOLANGUAGE
+BOOL WINAPI IsCharAlpha(char);
+BOOL WINAPI IsCharAlphaNumeric(char);
+BOOL WINAPI IsCharUpper(char);
+BOOL WINAPI IsCharLower(char);
+#endif
+
+#ifndef NOLSTRING
+int WINAPI lstrcmp(LPCSTR, LPCSTR);
+int WINAPI lstrcmpi(LPCSTR, LPCSTR);
+LPSTR WINAPI lstrcpy(LPSTR, LPCSTR);
+LPSTR WINAPI lstrcat(LPSTR, LPCSTR);
+int WINAPI lstrlen(LPCSTR);
+#if (WINVER >= 0x030a)
+LPSTR WINAPI lstrcpyn(LPSTR, LPCSTR, int);
+void WINAPI hmemcpy(void _huge*, const void _huge*, long);
+#endif /* WINVER >= 0x030a */
+#endif /* NOLSTRING */
+
+#if (WINVER >= 0x030a)
+#ifndef NODBCS
+BOOL WINAPI IsDBCSLeadByte(BYTE);
+#endif /* NODBCS */
+#endif /* WINVER >= 0x030a */
+
+int WINAPI LoadString(HINSTANCE, UINT, LPSTR, int);
+
+/****** Keyboard Driver Functions *******************************************/
+
+#ifndef NOKEYBOARDINFO
+
+DWORD WINAPI OemKeyScan(UINT);
+UINT WINAPI VkKeyScan(UINT);
+int WINAPI GetKeyboardType(int);
+UINT WINAPI MapVirtualKey(UINT, UINT);
+int WINAPI GetKBCodePage(void);
+int WINAPI GetKeyNameText(LONG, LPSTR, int);
+int WINAPI ToAscii(UINT wVirtKey, UINT wScanCode, BYTE FAR* lpKeyState, DWORD FAR* lpChar, UINT wFlags);
+
+#endif
+
+#endif /* NOKERNEL */
+
+/****** GDI typedefs, structures, and functions *****************************/
+
+DECLARE_HANDLE(HDC);
+
+#ifndef NOGDI
+
+#ifdef STRICT
+typedef const void NEAR* HGDIOBJ;
+#else
+DECLARE_HANDLE(HGDIOBJ);
+#endif
+
+#endif /* NOGDI */
+
+DECLARE_HANDLE(HBITMAP);
+DECLARE_HANDLE(HPEN);
+DECLARE_HANDLE(HBRUSH);
+DECLARE_HANDLE(HRGN);
+DECLARE_HANDLE(HPALETTE);
+DECLARE_HANDLE(HFONT);
+
+typedef struct tagRECT
+{
+ int left;
+ int top;
+ int right;
+ int bottom;
+} RECT;
+typedef RECT* PRECT;
+typedef RECT NEAR* NPRECT;
+typedef RECT FAR* LPRECT;
+
+typedef struct tagPOINT
+{
+ int x;
+ int y;
+} POINT;
+typedef POINT* PPOINT;
+typedef POINT NEAR* NPPOINT;
+typedef POINT FAR* LPPOINT;
+
+#if (WINVER >= 0x030a)
+typedef struct tagSIZE
+{
+ int cx;
+ int cy;
+} SIZE;
+typedef SIZE* PSIZE;
+typedef SIZE NEAR* NPSIZE;
+typedef SIZE FAR* LPSIZE;
+#endif /* WINVER >= 0x030a */
+
+#define MAKEPOINT(l) (*((POINT FAR*)&(l)))
+
+#ifndef NOGDI
+
+/****** DC Management *******************************************************/
+
+HDC WINAPI CreateDC(LPCSTR, LPCSTR, LPCSTR, const void FAR*);
+HDC WINAPI CreateIC(LPCSTR, LPCSTR, LPCSTR, const void FAR*);
+HDC WINAPI CreateCompatibleDC(HDC);
+
+BOOL WINAPI DeleteDC(HDC);
+
+DWORD WINAPI GetDCOrg(HDC);
+
+int WINAPI SaveDC(HDC);
+BOOL WINAPI RestoreDC(HDC, int);
+
+int WINAPI SetEnvironment(LPCSTR, const void FAR*, UINT);
+int WINAPI GetEnvironment(LPCSTR, void FAR*, UINT);
+
+int WINAPI MulDiv(int, int, int);
+
+#if (WINVER >= 0x030a)
+/* Drawing bounds accumulation APIs */
+UINT WINAPI SetBoundsRect(HDC hDC, const RECT FAR* lprcBounds, UINT flags);
+UINT WINAPI GetBoundsRect(HDC hDC, RECT FAR* lprcBounds, UINT flags);
+
+#define DCB_RESET 0x0001
+#define DCB_ACCUMULATE 0x0002
+#define DCB_DIRTY DCB_ACCUMULATE
+#define DCB_SET (DCB_RESET | DCB_ACCUMULATE)
+#define DCB_ENABLE 0x0004
+#define DCB_DISABLE 0x0008
+#endif /* WINVER >= 0x030a */
+
+/****** Device Capabilities *************************************************/
+
+int WINAPI GetDeviceCaps(HDC, int);
+
+/* Device Parameters for GetDeviceCaps() */
+#define DRIVERVERSION 0
+#define TECHNOLOGY 2
+#define HORZSIZE 4
+#define VERTSIZE 6
+#define HORZRES 8
+#define VERTRES 10
+#define BITSPIXEL 12
+#define PLANES 14
+#define NUMBRUSHES 16
+#define NUMPENS 18
+#define NUMMARKERS 20
+#define NUMFONTS 22
+#define NUMCOLORS 24
+#define PDEVICESIZE 26
+#define CURVECAPS 28
+#define LINECAPS 30
+#define POLYGONALCAPS 32
+#define TEXTCAPS 34
+#define CLIPCAPS 36
+#define RASTERCAPS 38
+#define ASPECTX 40
+#define ASPECTY 42
+#define ASPECTXY 44
+
+#define LOGPIXELSX 88
+#define LOGPIXELSY 90
+
+#define SIZEPALETTE 104
+#define NUMRESERVED 106
+#define COLORRES 108
+
+#ifndef NOGDICAPMASKS
+
+/* GetDeviceCaps() return value masks */
+
+/* TECHNOLOGY */
+#define DT_PLOTTER 0
+#define DT_RASDISPLAY 1
+#define DT_RASPRINTER 2
+#define DT_RASCAMERA 3
+#define DT_CHARSTREAM 4
+#define DT_METAFILE 5
+#define DT_DISPFILE 6
+
+/* CURVECAPS */
+#define CC_NONE 0x0000
+#define CC_CIRCLES 0x0001
+#define CC_PIE 0x0002
+#define CC_CHORD 0x0004
+#define CC_ELLIPSES 0x0008
+#define CC_WIDE 0x0010
+#define CC_STYLED 0x0020
+#define CC_WIDESTYLED 0x0040
+#define CC_INTERIORS 0x0080
+#define CC_ROUNDRECT 0x0100
+
+/* LINECAPS */
+#define LC_NONE 0x0000
+#define LC_POLYLINE 0x0002
+#define LC_MARKER 0x0004
+#define LC_POLYMARKER 0x0008
+#define LC_WIDE 0x0010
+#define LC_STYLED 0x0020
+#define LC_WIDESTYLED 0x0040
+#define LC_INTERIORS 0x0080
+
+/* POLYGONALCAPS */
+#define PC_NONE 0x0000
+#define PC_POLYGON 0x0001
+#define PC_RECTANGLE 0x0002
+#define PC_WINDPOLYGON 0x0004
+#define PC_SCANLINE 0x0008
+#define PC_WIDE 0x0010
+#define PC_STYLED 0x0020
+#define PC_WIDESTYLED 0x0040
+#define PC_INTERIORS 0x0080
+
+/* TEXTCAPS */
+#define TC_OP_CHARACTER 0x0001
+#define TC_OP_STROKE 0x0002
+#define TC_CP_STROKE 0x0004
+#define TC_CR_90 0x0008
+#define TC_CR_ANY 0x0010
+#define TC_SF_X_YINDEP 0x0020
+#define TC_SA_DOUBLE 0x0040
+#define TC_SA_INTEGER 0x0080
+#define TC_SA_CONTIN 0x0100
+#define TC_EA_DOUBLE 0x0200
+#define TC_IA_ABLE 0x0400
+#define TC_UA_ABLE 0x0800
+#define TC_SO_ABLE 0x1000
+#define TC_RA_ABLE 0x2000
+#define TC_VA_ABLE 0x4000
+#define TC_RESERVED 0x8000
+
+/* CLIPCAPS */
+#define CP_NONE 0x0000
+#define CP_RECTANGLE 0x0001
+#define CP_REGION 0x0002
+
+/* RASTERCAPS */
+#define RC_NONE
+#define RC_BITBLT 0x0001
+#define RC_BANDING 0x0002
+#define RC_SCALING 0x0004
+#define RC_BITMAP64 0x0008
+#define RC_GDI20_OUTPUT 0x0010
+#define RC_GDI20_STATE 0x0020
+#define RC_SAVEBITMAP 0x0040
+#define RC_DI_BITMAP 0x0080
+#define RC_PALETTE 0x0100
+#define RC_DIBTODEV 0x0200
+#define RC_BIGFONT 0x0400
+#define RC_STRETCHBLT 0x0800
+#define RC_FLOODFILL 0x1000
+#define RC_STRETCHDIB 0x2000
+#define RC_OP_DX_OUTPUT 0x4000
+#define RC_DEVBITS 0x8000
+
+#endif /* NOGDICAPMASKS */
+
+/****** Coordinate transformation support ***********************************/
+
+int WINAPI SetMapMode(HDC, int);
+int WINAPI GetMapMode(HDC);
+
+/* Map modes */
+#define MM_TEXT 1
+#define MM_LOMETRIC 2
+#define MM_HIMETRIC 3
+#define MM_LOENGLISH 4
+#define MM_HIENGLISH 5
+#define MM_TWIPS 6
+#define MM_ISOTROPIC 7
+#define MM_ANISOTROPIC 8
+
+DWORD WINAPI SetWindowOrg(HDC, int, int);
+DWORD WINAPI GetWindowOrg(HDC);
+
+DWORD WINAPI SetWindowExt(HDC, int, int);
+DWORD WINAPI GetWindowExt(HDC);
+
+DWORD WINAPI OffsetWindowOrg(HDC, int, int);
+DWORD WINAPI ScaleWindowExt(HDC, int, int, int, int);
+
+DWORD WINAPI SetViewportOrg(HDC, int, int);
+DWORD WINAPI GetViewportOrg(HDC);
+
+DWORD WINAPI SetViewportExt(HDC, int, int);
+DWORD WINAPI GetViewportExt(HDC);
+
+DWORD WINAPI OffsetViewportOrg(HDC, int, int);
+DWORD WINAPI ScaleViewportExt(HDC, int, int, int, int);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI SetWindowOrgEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI GetWindowOrgEx(HDC, POINT FAR*);
+
+BOOL WINAPI SetWindowExtEx(HDC, int, int, SIZE FAR*);
+BOOL WINAPI GetWindowExtEx(HDC, SIZE FAR*);
+
+BOOL WINAPI OffsetWindowOrgEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI ScaleWindowExtEx(HDC, int, int, int, int, SIZE FAR*);
+
+BOOL WINAPI SetViewportExtEx(HDC, int, int, SIZE FAR*);
+BOOL WINAPI GetViewportExtEx(HDC, SIZE FAR*);
+
+BOOL WINAPI SetViewportOrgEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI GetViewportOrgEx(HDC, POINT FAR*);
+
+BOOL WINAPI OffsetViewportOrgEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI ScaleViewportExtEx(HDC, int, int, int, int, SIZE FAR*);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI DPtoLP(HDC, POINT FAR*, int);
+BOOL WINAPI LPtoDP(HDC, POINT FAR*, int);
+
+
+/* Coordinate Modes */
+#define ABSOLUTE 1
+#define RELATIVE 2
+
+/****** Color support *******************************************************/
+
+typedef DWORD COLORREF;
+
+#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16)))
+
+#define GetRValue(rgb) ((BYTE)(rgb))
+#define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
+#define GetBValue(rgb) ((BYTE)((rgb)>>16))
+
+COLORREF WINAPI GetNearestColor(HDC, COLORREF);
+
+#ifndef NOCOLOR
+
+COLORREF WINAPI GetSysColor(int);
+void WINAPI SetSysColors(int, const int FAR*, const COLORREF FAR*);
+
+#define COLOR_SCROLLBAR 0
+#define COLOR_BACKGROUND 1
+#define COLOR_ACTIVECAPTION 2
+#define COLOR_INACTIVECAPTION 3
+#define COLOR_MENU 4
+#define COLOR_WINDOW 5
+#define COLOR_WINDOWFRAME 6
+#define COLOR_MENUTEXT 7
+#define COLOR_WINDOWTEXT 8
+#define COLOR_CAPTIONTEXT 9
+#define COLOR_ACTIVEBORDER 10
+#define COLOR_INACTIVEBORDER 11
+#define COLOR_APPWORKSPACE 12
+#define COLOR_HIGHLIGHT 13
+#define COLOR_HIGHLIGHTTEXT 14
+#define COLOR_BTNFACE 15
+#define COLOR_BTNSHADOW 16
+#define COLOR_GRAYTEXT 17
+#define COLOR_BTNTEXT 18
+#if (WINVER >= 0x030a)
+#define COLOR_INACTIVECAPTIONTEXT 19
+#define COLOR_BTNHIGHLIGHT 20
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOCOLOR */
+
+#define WM_SYSCOLORCHANGE 0x0015
+
+/****** GDI Object Support **************************************************/
+
+#ifndef NOGDIOBJ
+
+HGDIOBJ WINAPI GetStockObject(int);
+
+BOOL WINAPI IsGDIObject(HGDIOBJ);
+
+BOOL WINAPI DeleteObject(HGDIOBJ);
+HGDIOBJ WINAPI SelectObject(HDC, HGDIOBJ);
+int WINAPI GetObject(HGDIOBJ, int, void FAR*);
+BOOL WINAPI UnrealizeObject(HGDIOBJ);
+
+#ifdef STRICT
+typedef (CALLBACK* GOBJENUMPROC)(void FAR*, LPARAM);
+#else
+typedef FARPROC GOBJENUMPROC;
+#endif
+
+#ifdef STRICT
+int WINAPI EnumObjects(HDC, int, GOBJENUMPROC, LPARAM);
+#else
+int WINAPI EnumObjects(HDC, int, GOBJENUMPROC, LPSTR);
+#endif
+
+/* Object types for EnumObjects() */
+#define OBJ_PEN 1
+#define OBJ_BRUSH 2
+
+/****** Pen support *********************************************************/
+
+/* Logical Pen */
+typedef struct tagLOGPEN
+{
+ UINT lopnStyle;
+ POINT lopnWidth;
+ COLORREF lopnColor;
+} LOGPEN;
+typedef LOGPEN* PLOGPEN;
+typedef LOGPEN NEAR* NPLOGPEN;
+typedef LOGPEN FAR* LPLOGPEN;
+
+/* Pen Styles */
+#define PS_SOLID 0
+#define PS_DASH 1
+#define PS_DOT 2
+#define PS_DASHDOT 3
+#define PS_DASHDOTDOT 4
+#define PS_NULL 5
+#define PS_INSIDEFRAME 6
+
+HPEN WINAPI CreatePen(int, int, COLORREF);
+HPEN WINAPI CreatePenIndirect(LOGPEN FAR*);
+
+/* Stock pens for use with GetStockObject(); */
+#define WHITE_PEN 6
+#define BLACK_PEN 7
+#define NULL_PEN 8
+
+/****** Brush support *******************************************************/
+
+/* Brush Styles */
+#define BS_SOLID 0
+#define BS_NULL 1
+#define BS_HOLLOW BS_NULL
+#define BS_HATCHED 2
+#define BS_PATTERN 3
+#define BS_INDEXED 4
+#define BS_DIBPATTERN 5
+
+/* Hatch Styles */
+#define HS_HORIZONTAL 0
+#define HS_VERTICAL 1
+#define HS_FDIAGONAL 2
+#define HS_BDIAGONAL 3
+#define HS_CROSS 4
+#define HS_DIAGCROSS 5
+
+/* Logical Brush (or Pattern) */
+typedef struct tagLOGBRUSH
+{
+ UINT lbStyle;
+ COLORREF lbColor;
+ int lbHatch;
+} LOGBRUSH;
+typedef LOGBRUSH* PLOGBRUSH;
+typedef LOGBRUSH NEAR* NPLOGBRUSH;
+typedef LOGBRUSH FAR* LPLOGBRUSH;
+
+typedef LOGBRUSH PATTERN;
+typedef PATTERN* PPATTERN;
+typedef PATTERN NEAR* NPPATTERN;
+typedef PATTERN FAR* LPPATTERN;
+
+HBRUSH WINAPI CreateSolidBrush(COLORREF);
+HBRUSH WINAPI CreateHatchBrush(int, COLORREF);
+HBRUSH WINAPI CreatePatternBrush(HBITMAP);
+HBRUSH WINAPI CreateDIBPatternBrush(HGLOBAL, UINT);
+HBRUSH WINAPI CreateBrushIndirect(LOGBRUSH FAR*);
+
+/* Stock brushes for use with GetStockObject() */
+#define WHITE_BRUSH 0
+#define LTGRAY_BRUSH 1
+#define GRAY_BRUSH 2
+#define DKGRAY_BRUSH 3
+#define BLACK_BRUSH 4
+#define NULL_BRUSH 5
+#define HOLLOW_BRUSH NULL_BRUSH
+
+DWORD WINAPI SetBrushOrg(HDC, int, int);
+DWORD WINAPI GetBrushOrg(HDC);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI GetBrushOrgEx(HDC, POINT FAR*);
+#endif /* WINVER >= 0x030a */
+#endif /* NOGDIOBJ */
+
+/****** Region support ******************************************************/
+
+HRGN WINAPI CreateRectRgn(int, int, int, int);
+HRGN WINAPI CreateRectRgnIndirect(const RECT FAR*);
+HRGN WINAPI CreateEllipticRgnIndirect(const RECT FAR*);
+HRGN WINAPI CreateEllipticRgn(int, int, int, int);
+HRGN WINAPI CreatePolygonRgn(const POINT FAR*, int, int);
+HRGN WINAPI CreatePolyPolygonRgn(const POINT FAR*, const int FAR*, int, int);
+HRGN WINAPI CreateRoundRectRgn(int, int, int, int, int, int);
+
+/* Region type flags */
+#define ERROR 0
+#define NULLREGION 1
+#define SIMPLEREGION 2
+#define COMPLEXREGION 3
+
+void WINAPI SetRectRgn(HRGN, int, int, int, int);
+
+int WINAPI CombineRgn(HRGN, HRGN, HRGN, int);
+
+/* CombineRgn() command values */
+#define RGN_AND 1
+#define RGN_OR 2
+#define RGN_XOR 3
+#define RGN_DIFF 4
+#define RGN_COPY 5
+
+BOOL WINAPI EqualRgn(HRGN, HRGN);
+int WINAPI OffsetRgn(HRGN, int, int);
+
+int WINAPI GetRgnBox(HRGN, RECT FAR*);
+
+BOOL WINAPI RectInRegion(HRGN, const RECT FAR*);
+BOOL WINAPI PtInRegion(HRGN, int, int);
+
+/****** Color palette Support ************************************************/
+
+#define PALETTERGB(r,g,b) (0x02000000L | RGB(r,g,b))
+#define PALETTEINDEX(i) ((COLORREF)(0x01000000L | (DWORD)(WORD)(i)))
+
+typedef struct tagPALETTEENTRY
+{
+ BYTE peRed;
+ BYTE peGreen;
+ BYTE peBlue;
+ BYTE peFlags;
+} PALETTEENTRY;
+typedef PALETTEENTRY FAR* LPPALETTEENTRY;
+
+/* Palette entry flags */
+#define PC_RESERVED 0x01 /* palette index used for animation */
+#define PC_EXPLICIT 0x02 /* palette index is explicit to device */
+#define PC_NOCOLLAPSE 0x04 /* do not match color to system palette */
+
+/* Logical Palette */
+typedef struct tagLOGPALETTE
+{
+ WORD palVersion;
+ WORD palNumEntries;
+ PALETTEENTRY palPalEntry[1];
+} LOGPALETTE;
+typedef LOGPALETTE* PLOGPALETTE;
+typedef LOGPALETTE NEAR* NPLOGPALETTE;
+typedef LOGPALETTE FAR* LPLOGPALETTE;
+
+HPALETTE WINAPI CreatePalette(const LOGPALETTE FAR*);
+
+HPALETTE WINAPI SelectPalette(HDC, HPALETTE, BOOL);
+
+UINT WINAPI RealizePalette(HDC);
+
+int WINAPI UpdateColors(HDC);
+void WINAPI AnimatePalette(HPALETTE, UINT, UINT, const PALETTEENTRY FAR*);
+
+UINT WINAPI SetPaletteEntries(HPALETTE, UINT, UINT, const PALETTEENTRY FAR*);
+UINT WINAPI GetPaletteEntries(HPALETTE, UINT, UINT, PALETTEENTRY FAR*);
+
+UINT WINAPI GetNearestPaletteIndex(HPALETTE, COLORREF);
+
+BOOL WINAPI ResizePalette(HPALETTE, UINT);
+
+UINT WINAPI GetSystemPaletteEntries(HDC, UINT, UINT, PALETTEENTRY FAR*);
+
+UINT WINAPI GetSystemPaletteUse(HDC);
+UINT WINAPI SetSystemPaletteUse(HDC, UINT);
+
+/* Get/SetSystemPaletteUse() values */
+#define SYSPAL_STATIC 1
+#define SYSPAL_NOSTATIC 2
+
+/* Palette window messages */
+#define WM_QUERYNEWPALETTE 0x030F
+#define WM_PALETTEISCHANGING 0x0310
+#define WM_PALETTECHANGED 0x0311
+
+/****** Clipping support *****************************************************/
+
+int WINAPI SelectClipRgn(HDC, HRGN);
+int WINAPI GetClipBox(HDC, RECT FAR*);
+
+int WINAPI IntersectClipRect(HDC, int, int, int, int);
+int WINAPI OffsetClipRgn(HDC, int, int);
+int WINAPI ExcludeClipRect(HDC, int, int, int, int);
+
+BOOL WINAPI PtVisible(HDC, int, int);
+BOOL WINAPI RectVisible(HDC, const RECT FAR*);
+
+
+/****** General drawing support ********************************************/
+
+DWORD WINAPI MoveTo(HDC, int, int);
+DWORD WINAPI GetCurrentPosition(HDC);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI MoveToEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI GetCurrentPositionEx(HDC, POINT FAR*);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI LineTo(HDC, int, int);
+BOOL WINAPI Polyline(HDC, const POINT FAR*, int);
+
+#ifdef STRICT
+typedef void (CALLBACK* LINEDDAPROC)(int, int, LPARAM);
+#else
+typedef FARPROC LINEDDAPROC;
+#endif
+
+void WINAPI LineDDA(int, int, int, int, LINEDDAPROC, LPARAM);
+
+BOOL WINAPI Rectangle(HDC, int, int, int, int);
+BOOL WINAPI RoundRect(HDC, int, int, int, int, int, int);
+
+BOOL WINAPI Ellipse(HDC, int, int, int, int);
+BOOL WINAPI Arc(HDC, int, int, int, int, int, int, int, int);
+BOOL WINAPI Chord(HDC, int, int, int, int, int, int, int, int);
+BOOL WINAPI Pie(HDC, int, int, int, int, int, int, int, int);
+
+BOOL WINAPI Polygon(HDC, const POINT FAR*, int);
+BOOL WINAPI PolyPolygon(HDC, const POINT FAR*, int FAR*, int);
+
+/* PolyFill Modes */
+#define ALTERNATE 1
+#define WINDING 2
+
+int WINAPI SetPolyFillMode(HDC, int);
+int WINAPI GetPolyFillMode(HDC);
+
+BOOL WINAPI FloodFill(HDC, int, int, COLORREF);
+BOOL WINAPI ExtFloodFill(HDC, int, int, COLORREF, UINT);
+
+/* ExtFloodFill style flags */
+#define FLOODFILLBORDER 0
+#define FLOODFILLSURFACE 1
+
+BOOL WINAPI FillRgn(HDC, HRGN, HBRUSH);
+BOOL WINAPI FrameRgn(HDC, HRGN, HBRUSH, int, int);
+BOOL WINAPI InvertRgn(HDC, HRGN);
+BOOL WINAPI PaintRgn(HDC, HRGN);
+
+/* Rectangle output routines */
+int WINAPI FillRect(HDC, const RECT FAR*, HBRUSH);
+int WINAPI FrameRect(HDC, const RECT FAR*, HBRUSH);
+void WINAPI InvertRect(HDC, const RECT FAR*);
+
+void WINAPI DrawFocusRect(HDC, const RECT FAR*);
+
+
+/****** Text support ********************************************************/
+
+BOOL WINAPI TextOut(HDC, int, int, LPCSTR, int);
+LONG WINAPI TabbedTextOut(HDC, int, int, LPCSTR, int, int, int FAR*, int);
+BOOL WINAPI ExtTextOut(HDC, int, int, UINT, const RECT FAR*, LPCSTR, UINT, int FAR*);
+
+#define ETO_GRAYED 0x0001
+#define ETO_OPAQUE 0x0002
+#define ETO_CLIPPED 0x0004
+
+DWORD WINAPI GetTextExtent(HDC, LPCSTR, int);
+DWORD WINAPI GetTabbedTextExtent(HDC, LPCSTR, int, int, int FAR*);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI GetTextExtentPoint(HDC, LPCSTR, int, SIZE FAR*);
+#endif /* WINVER >= 0x030a */
+
+/* DrawText() Format Flags */
+#ifndef NODRAWTEXT
+#define DT_TOP 0x0000
+#define DT_LEFT 0x0000
+#define DT_CENTER 0x0001
+#define DT_RIGHT 0x0002
+#define DT_VCENTER 0x0004
+#define DT_BOTTOM 0x0008
+#define DT_WORDBREAK 0x0010
+#define DT_SINGLELINE 0x0020
+#define DT_EXPANDTABS 0x0040
+#define DT_TABSTOP 0x0080
+#define DT_NOCLIP 0x0100
+#define DT_EXTERNALLEADING 0x0200
+#define DT_CALCRECT 0x0400
+#define DT_NOPREFIX 0x0800
+#define DT_INTERNAL 0x1000
+
+int WINAPI DrawText(HDC, LPCSTR, int, RECT FAR*, UINT);
+#endif /* NODRAWTEXT */
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* GRAYSTRINGPROC)(HDC, LPARAM, int);
+#else
+typedef FARPROC GRAYSTRINGPROC;
+#endif
+
+BOOL WINAPI GrayString(HDC, HBRUSH, GRAYSTRINGPROC, LPARAM, int, int, int, int, int);
+
+BOOL WINAPI GetCharWidth(HDC, UINT, UINT, int FAR*);
+
+COLORREF WINAPI SetTextColor(HDC, COLORREF);
+COLORREF WINAPI GetTextColor(HDC);
+
+COLORREF WINAPI SetBkColor(HDC, COLORREF);
+COLORREF WINAPI GetBkColor(HDC);
+
+int WINAPI SetBkMode(HDC, int);
+int WINAPI GetBkMode(HDC);
+
+/* Background Modes */
+#define TRANSPARENT 1
+#define OPAQUE 2
+
+UINT WINAPI SetTextAlign(HDC, UINT);
+UINT WINAPI GetTextAlign(HDC);
+
+/* Text Alignment Options */
+#define TA_NOUPDATECP 0x0000
+#define TA_UPDATECP 0x0001
+#define TA_LEFT 0x0000
+#define TA_RIGHT 0x0002
+#define TA_CENTER 0x0006
+#define TA_TOP 0x0000
+#define TA_BOTTOM 0x0008
+#define TA_BASELINE 0x0018
+
+int WINAPI SetTextCharacterExtra(HDC, int);
+int WINAPI GetTextCharacterExtra(HDC);
+
+int WINAPI SetTextJustification(HDC, int, int);
+
+/****** Font support ********************************************************/
+
+#ifndef NOGDIOBJ
+/* Logical Font */
+#define LF_FACESIZE 32
+typedef struct tagLOGFONT
+{
+ int lfHeight;
+ int lfWidth;
+ int lfEscapement;
+ int lfOrientation;
+ int lfWeight;
+ BYTE lfItalic;
+ BYTE lfUnderline;
+ BYTE lfStrikeOut;
+ BYTE lfCharSet;
+ BYTE lfOutPrecision;
+ BYTE lfClipPrecision;
+ BYTE lfQuality;
+ BYTE lfPitchAndFamily;
+ char lfFaceName[LF_FACESIZE];
+} LOGFONT;
+typedef LOGFONT* PLOGFONT;
+typedef LOGFONT NEAR* NPLOGFONT;
+typedef LOGFONT FAR* LPLOGFONT;
+
+/* weight values */
+#define FW_DONTCARE 0
+#define FW_THIN 100
+#define FW_EXTRALIGHT 200
+#define FW_LIGHT 300
+#define FW_NORMAL 400
+#define FW_MEDIUM 500
+#define FW_SEMIBOLD 600
+#define FW_BOLD 700
+#define FW_EXTRABOLD 800
+#define FW_HEAVY 900
+
+#define FW_ULTRALIGHT FW_EXTRALIGHT
+#define FW_REGULAR FW_NORMAL
+#define FW_DEMIBOLD FW_SEMIBOLD
+#define FW_ULTRABOLD FW_EXTRABOLD
+#define FW_BLACK FW_HEAVY
+
+/* CharSet values */
+#define ANSI_CHARSET 0
+#define DEFAULT_CHARSET 1
+#define SYMBOL_CHARSET 2
+#define SHIFTJIS_CHARSET 128
+#define HANGEUL_CHARSET 129
+#define CHINESEBIG5_CHARSET 136
+#define OEM_CHARSET 255
+
+/* OutPrecision values */
+#define OUT_DEFAULT_PRECIS 0
+#define OUT_STRING_PRECIS 1
+#define OUT_CHARACTER_PRECIS 2
+#define OUT_STROKE_PRECIS 3
+#if (WINVER >= 0x030a)
+#define OUT_TT_PRECIS 4
+#define OUT_DEVICE_PRECIS 5
+#define OUT_RASTER_PRECIS 6
+#define OUT_TT_ONLY_PRECIS 7
+#endif /* WINVER >= 0x030a */
+
+/* ClipPrecision values */
+#define CLIP_DEFAULT_PRECIS 0x00
+#define CLIP_CHARACTER_PRECIS 0x01
+#define CLIP_STROKE_PRECIS 0x02
+#define CLIP_MASK 0x0F
+#if (WINVER >= 0x030a)
+#define CLIP_LH_ANGLES 0x10
+#define CLIP_TT_ALWAYS 0x20
+#define CLIP_EMBEDDED 0x80
+#endif /* WINVER >= 0x030a */
+
+/* Quality values */
+#define DEFAULT_QUALITY 0
+#define DRAFT_QUALITY 1
+#define PROOF_QUALITY 2
+
+/* PitchAndFamily pitch values (low 4 bits) */
+#define DEFAULT_PITCH 0x00
+#define FIXED_PITCH 0x01
+#define VARIABLE_PITCH 0x02
+
+/* PitchAndFamily family values (high 4 bits) */
+#define FF_DONTCARE 0x00
+#define FF_ROMAN 0x10
+#define FF_SWISS 0x20
+#define FF_MODERN 0x30
+#define FF_SCRIPT 0x40
+#define FF_DECORATIVE 0x50
+
+HFONT WINAPI CreateFont(int, int, int, int, int, BYTE, BYTE, BYTE, BYTE, BYTE, BYTE, BYTE, BYTE, LPCSTR);
+HFONT WINAPI CreateFontIndirect(const LOGFONT FAR*);
+
+/* Stock fonts for use with GetStockObject() */
+#define OEM_FIXED_FONT 10
+#define ANSI_FIXED_FONT 11
+#define ANSI_VAR_FONT 12
+#define SYSTEM_FONT 13
+#define DEVICE_DEFAULT_FONT 14
+#define DEFAULT_PALETTE 15
+#define SYSTEM_FIXED_FONT 16
+
+
+DWORD WINAPI SetMapperFlags(HDC, DWORD);
+#define ASPECT_FILTERING 0x00000001L
+
+int WINAPI AddFontResource(LPCSTR);
+BOOL WINAPI RemoveFontResource(LPCSTR);
+
+#define WM_FONTCHANGE 0x001D
+
+int WINAPI GetTextFace(HDC, int, LPSTR);
+
+DWORD WINAPI GetAspectRatioFilter(HDC);
+#if (WINVER >= 0x030a)
+BOOL WINAPI GetAspectRatioFilterEx(HDC, SIZE FAR*);
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOGDIOBJ */
+
+#ifndef NOTEXTMETRIC
+
+typedef struct tagTEXTMETRIC
+{
+ int tmHeight;
+ int tmAscent;
+ int tmDescent;
+ int tmInternalLeading;
+ int tmExternalLeading;
+ int tmAveCharWidth;
+ int tmMaxCharWidth;
+ int tmWeight;
+ BYTE tmItalic;
+ BYTE tmUnderlined;
+ BYTE tmStruckOut;
+ BYTE tmFirstChar;
+ BYTE tmLastChar;
+ BYTE tmDefaultChar;
+ BYTE tmBreakChar;
+ BYTE tmPitchAndFamily;
+ BYTE tmCharSet;
+ int tmOverhang;
+ int tmDigitizedAspectX;
+ int tmDigitizedAspectY;
+} TEXTMETRIC;
+typedef TEXTMETRIC* PTEXTMETRIC;
+typedef TEXTMETRIC NEAR* NPTEXTMETRIC;
+typedef TEXTMETRIC FAR* LPTEXTMETRIC;
+
+/* tmPitchAndFamily values */
+#define TMPF_FIXED_PITCH 0x01
+#define TMPF_VECTOR 0x02
+#define TMPF_DEVICE 0x08
+#if (WINVER >= 0x030a)
+#define TMPF_TRUETYPE 0x04
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI GetTextMetrics(HDC, TEXTMETRIC FAR*);
+
+#if (WINVER >= 0x030a)
+#ifndef NOSCALABLEFONT
+
+typedef struct tagPANOSE
+{
+ BYTE bFamilyType;
+ BYTE bSerifStyle;
+ BYTE bWeight;
+ BYTE bProportion;
+ BYTE bContrast;
+ BYTE bStrokeVariation;
+ BYTE bArmStyle;
+ BYTE bLetterform;
+ BYTE bMidline;
+ BYTE bXHeight;
+} PANOSE, FAR* LPPANOSE;
+
+typedef struct tagOUTLINETEXTMETRIC
+{
+ UINT otmSize;
+ TEXTMETRIC otmTextMetrics;
+ BYTE otmFiller;
+ PANOSE otmPanoseNumber;
+ UINT otmfsSelection;
+ UINT otmfsType;
+ int otmsCharSlopeRise;
+ int otmsCharSlopeRun;
+ int otmItalicAngle;
+ UINT otmEMSquare;
+ int otmAscent;
+ int otmDescent;
+ UINT otmLineGap;
+ UINT otmsCapEmHeight;
+ UINT otmsXHeight;
+ RECT otmrcFontBox;
+ int otmMacAscent;
+ int otmMacDescent;
+ UINT otmMacLineGap;
+ UINT otmusMinimumPPEM;
+ POINT otmptSubscriptSize;
+ POINT otmptSubscriptOffset;
+ POINT otmptSuperscriptSize;
+ POINT otmptSuperscriptOffset;
+ UINT otmsStrikeoutSize;
+ int otmsStrikeoutPosition;
+ int otmsUnderscorePosition;
+ int otmsUnderscoreSize;
+ PSTR otmpFamilyName;
+ PSTR otmpFaceName;
+ PSTR otmpStyleName;
+ PSTR otmpFullName;
+} OUTLINETEXTMETRIC, FAR* LPOUTLINETEXTMETRIC;
+
+WORD WINAPI GetOutlineTextMetrics(HDC, UINT, OUTLINETEXTMETRIC FAR*);
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOSCALABLEFONT */
+
+#ifndef NOGDIOBJ
+#if (WINVER >= 0x030a)
+
+/* Structure passed to FONTENUMPROC */
+/* NOTE: NEWTEXTMETRIC is the same as TEXTMETRIC plus 4 new fields */
+typedef struct tagNEWTEXTMETRIC
+{
+ int tmHeight;
+ int tmAscent;
+ int tmDescent;
+ int tmInternalLeading;
+ int tmExternalLeading;
+ int tmAveCharWidth;
+ int tmMaxCharWidth;
+ int tmWeight;
+ BYTE tmItalic;
+ BYTE tmUnderlined;
+ BYTE tmStruckOut;
+ BYTE tmFirstChar;
+ BYTE tmLastChar;
+ BYTE tmDefaultChar;
+ BYTE tmBreakChar;
+ BYTE tmPitchAndFamily;
+ BYTE tmCharSet;
+ int tmOverhang;
+ int tmDigitizedAspectX;
+ int tmDigitizedAspectY;
+ DWORD ntmFlags;
+ UINT ntmSizeEM;
+ UINT ntmCellHeight;
+ UINT ntmAvgWidth;
+} NEWTEXTMETRIC;
+typedef NEWTEXTMETRIC* PNEWTEXTMETRIC;
+typedef NEWTEXTMETRIC NEAR* NPNEWTEXTMETRIC;
+typedef NEWTEXTMETRIC FAR* LPNEWTEXTMETRIC;
+
+/* ntmFlags field flags */
+#define NTM_REGULAR 0x00000040L
+#define NTM_BOLD 0x00000020L
+#define NTM_ITALIC 0x00000001L
+
+#define LF_FULLFACESIZE 64
+
+/* Structure passed to FONTENUMPROC */
+typedef struct tagENUMLOGFONT
+{
+ LOGFONT elfLogFont;
+ char elfFullName[LF_FULLFACESIZE];
+ char elfStyle[LF_FACESIZE];
+} ENUMLOGFONT, FAR* LPENUMLOGFONT;
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOGDIOBJ */
+
+#ifdef STRICT
+#ifndef NOGDIOBJ
+
+typedef int (CALLBACK* OLDFONTENUMPROC)(const LOGFONT FAR*, const TEXTMETRIC FAR*, int, LPARAM);
+
+#if (WINVER >= 0x030a)
+typedef int (CALLBACK* FONTENUMPROC)(const ENUMLOGFONT FAR*, const NEWTEXTMETRIC FAR*, int, LPARAM);
+
+int WINAPI EnumFontFamilies(HDC, LPCSTR, FONTENUMPROC, LPARAM);
+
+#else /* WINVER >= 0x030a */
+typedef OLDFONTENUMPROC FONTENUMPROC;
+#endif /* WINVER >= 0x030a) */
+
+int WINAPI EnumFonts(HDC, LPCSTR, OLDFONTENUMPROC, LPARAM);
+#endif /* NOGDIOBJ */
+
+#else /* STRICT */
+
+typedef FARPROC OLDFONTENUMPROC;
+typedef FARPROC FONTENUMPROC;
+
+int WINAPI EnumFonts(HDC, LPCSTR, OLDFONTENUMPROC, LPSTR);
+
+#if (WINVER >= 0x030a)
+int WINAPI EnumFontFamilies(HDC, LPCSTR, FONTENUMPROC, LPSTR);
+#endif /* WINVER >= 0x030a */
+
+#endif /* !STRICT */
+
+/* EnumFonts font type values */
+#define RASTER_FONTTYPE 0x0001
+#define DEVICE_FONTTYPE 0X0002
+#if (WINVER >= 0x030a)
+#define TRUETYPE_FONTTYPE 0x0004
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOTEXTMETRIC */
+
+#ifndef NOSCALABLEFONT
+#if (WINVER >= 0x030a)
+
+DWORD WINAPI GetFontData(HDC, DWORD, DWORD, void FAR*, DWORD);
+BOOL WINAPI CreateScalableFontResource(UINT, LPCSTR, LPCSTR, LPCSTR);
+
+typedef struct tagGLYPHMETRICS
+{
+ UINT gmBlackBoxX;
+ UINT gmBlackBoxY;
+ POINT gmptGlyphOrigin;
+ int gmCellIncX;
+ int gmCellIncY;
+} GLYPHMETRICS, FAR* LPGLYPHMETRICS;
+
+typedef struct tagFIXED
+{
+ UINT fract;
+ int value;
+} FIXED, FAR* LPFIXED;
+
+typedef struct tagMAT2
+{
+ FIXED eM11;
+ FIXED eM12;
+ FIXED eM21;
+ FIXED eM22;
+} MAT2, FAR* LPMAT2;
+
+DWORD WINAPI GetGlyphOutline(HDC, UINT, UINT, GLYPHMETRICS FAR*, DWORD, void FAR*, const MAT2 FAR*);
+
+/* GetGlyphOutline constants */
+#define GGO_METRICS 0
+#define GGO_BITMAP 1
+#define GGO_NATIVE 2
+
+#define TT_POLYGON_TYPE 24
+
+#define TT_PRIM_LINE 1
+#define TT_PRIM_QSPLINE 2
+
+typedef struct tagPOINTFX
+{
+ FIXED x;
+ FIXED y;
+} POINTFX, FAR* LPPOINTFX;
+
+typedef struct tagTTPOLYCURVE
+{
+ UINT wType;
+ UINT cpfx;
+ POINTFX apfx[1];
+} TTPOLYCURVE, FAR* LPTTPOLYCURVE;
+
+typedef struct tagTTPOLYGONHEADER
+{
+ DWORD cb;
+ DWORD dwType;
+ POINTFX pfxStart;
+} TTPOLYGONHEADER, FAR* LPTTPOLYGONHEADER;
+
+typedef struct tagABC
+{
+ int abcA;
+ UINT abcB;
+ int abcC;
+} ABC;
+typedef ABC FAR* LPABC;
+
+BOOL WINAPI GetCharABCWidths(HDC, UINT, UINT, ABC FAR*);
+
+typedef struct tagKERNINGPAIR
+{
+ WORD wFirst;
+ WORD wSecond;
+ int iKernAmount;
+} KERNINGPAIR, FAR* LPKERNINGPAIR;
+
+int WINAPI GetKerningPairs(HDC, int, KERNINGPAIR FAR*);
+
+typedef struct tagRASTERIZER_STATUS
+{
+ int nSize;
+ int wFlags;
+ int nLanguageID;
+} RASTERIZER_STATUS;
+typedef RASTERIZER_STATUS FAR* LPRASTERIZER_STATUS;
+
+/* bits defined in wFlags of RASTERIZER_STATUS */
+#define TT_AVAILABLE 0x0001
+#define TT_ENABLED 0x0002
+
+BOOL WINAPI GetRasterizerCaps(RASTERIZER_STATUS FAR*, int);
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOSCALABLEFONT */
+
+/****** Bitmap support ******************************************************/
+
+#ifndef NOBITMAP
+typedef struct tagBITMAP
+{
+ int bmType;
+ int bmWidth;
+ int bmHeight;
+ int bmWidthBytes;
+ BYTE bmPlanes;
+ BYTE bmBitsPixel;
+ void FAR* bmBits;
+} BITMAP;
+typedef BITMAP* PBITMAP;
+typedef BITMAP NEAR* NPBITMAP;
+typedef BITMAP FAR* LPBITMAP;
+
+/* Bitmap Header structures */
+typedef struct tagRGBTRIPLE
+{
+ BYTE rgbtBlue;
+ BYTE rgbtGreen;
+ BYTE rgbtRed;
+} RGBTRIPLE;
+typedef RGBTRIPLE FAR* LPRGBTRIPLE;
+
+typedef struct tagRGBQUAD
+{
+ BYTE rgbBlue;
+ BYTE rgbGreen;
+ BYTE rgbRed;
+ BYTE rgbReserved;
+} RGBQUAD;
+typedef RGBQUAD FAR* LPRGBQUAD;
+
+/* structures for defining DIBs */
+typedef struct tagBITMAPCOREHEADER
+{
+ DWORD bcSize;
+ short bcWidth;
+ short bcHeight;
+ WORD bcPlanes;
+ WORD bcBitCount;
+} BITMAPCOREHEADER;
+typedef BITMAPCOREHEADER* PBITMAPCOREHEADER;
+typedef BITMAPCOREHEADER FAR* LPBITMAPCOREHEADER;
+
+typedef struct tagBITMAPINFOHEADER
+{
+ DWORD biSize;
+ LONG biWidth;
+ LONG biHeight;
+ WORD biPlanes;
+ WORD biBitCount;
+ DWORD biCompression;
+ DWORD biSizeImage;
+ LONG biXPelsPerMeter;
+ LONG biYPelsPerMeter;
+ DWORD biClrUsed;
+ DWORD biClrImportant;
+} BITMAPINFOHEADER;
+typedef BITMAPINFOHEADER* PBITMAPINFOHEADER;
+typedef BITMAPINFOHEADER FAR* LPBITMAPINFOHEADER;
+
+/* constants for the biCompression field */
+#define BI_RGB 0L
+#define BI_RLE8 1L
+#define BI_RLE4 2L
+
+typedef struct tagBITMAPINFO
+{
+ BITMAPINFOHEADER bmiHeader;
+ RGBQUAD bmiColors[1];
+} BITMAPINFO;
+typedef BITMAPINFO* PBITMAPINFO;
+typedef BITMAPINFO FAR* LPBITMAPINFO;
+
+typedef struct tagBITMAPCOREINFO
+{
+ BITMAPCOREHEADER bmciHeader;
+ RGBTRIPLE bmciColors[1];
+} BITMAPCOREINFO;
+typedef BITMAPCOREINFO* PBITMAPCOREINFO;
+typedef BITMAPCOREINFO FAR* LPBITMAPCOREINFO;
+
+typedef struct tagBITMAPFILEHEADER
+{
+ UINT bfType;
+ DWORD bfSize;
+ UINT bfReserved1;
+ UINT bfReserved2;
+ DWORD bfOffBits;
+} BITMAPFILEHEADER;
+typedef BITMAPFILEHEADER* PBITMAPFILEHEADER;
+typedef BITMAPFILEHEADER FAR* LPBITMAPFILEHEADER;
+
+
+HBITMAP WINAPI CreateBitmap(int, int, UINT, UINT, const void FAR*);
+HBITMAP WINAPI CreateBitmapIndirect(BITMAP FAR* );
+HBITMAP WINAPI CreateCompatibleBitmap(HDC, int, int);
+HBITMAP WINAPI CreateDiscardableBitmap(HDC, int, int);
+HBITMAP WINAPI CreateDIBitmap(HDC, BITMAPINFOHEADER FAR*, DWORD, const void FAR*, BITMAPINFO FAR*, UINT);
+
+HBITMAP WINAPI LoadBitmap(HINSTANCE, LPCSTR);
+
+/* DIB color table identifiers */
+#define DIB_RGB_COLORS 0
+#define DIB_PAL_COLORS 1
+
+/* constants for CreateDIBitmap */
+#define CBM_INIT 0x00000004L
+#endif /* NOBITMAP */
+
+#ifndef NORASTEROPS
+
+/* Binary raster ops */
+#define R2_BLACK 1
+#define R2_NOTMERGEPEN 2
+#define R2_MASKNOTPEN 3
+#define R2_NOTCOPYPEN 4
+#define R2_MASKPENNOT 5
+#define R2_NOT 6
+#define R2_XORPEN 7
+#define R2_NOTMASKPEN 8
+#define R2_MASKPEN 9
+#define R2_NOTXORPEN 10
+#define R2_NOP 11
+#define R2_MERGENOTPEN 12
+#define R2_COPYPEN 13
+#define R2_MERGEPENNOT 14
+#define R2_MERGEPEN 15
+#define R2_WHITE 16
+
+/* Ternary raster operations */
+#define SRCCOPY 0x00CC0020L
+#define SRCPAINT 0x00EE0086L
+#define SRCAND 0x008800C6L
+#define SRCINVERT 0x00660046L
+#define SRCERASE 0x00440328L
+#define NOTSRCCOPY 0x00330008L
+#define NOTSRCERASE 0x001100A6L
+#define MERGECOPY 0x00C000CAL
+#define MERGEPAINT 0x00BB0226L
+#define PATCOPY 0x00F00021L
+#define PATPAINT 0x00FB0A09L
+#define PATINVERT 0x005A0049L
+#define DSTINVERT 0x00550009L
+#define BLACKNESS 0x00000042L
+#define WHITENESS 0x00FF0062L
+
+#endif /* NORASTEROPS */
+
+#ifndef NOBITMAP
+BOOL WINAPI BitBlt(HDC, int, int, int, int, HDC, int, int, DWORD);
+
+BOOL WINAPI PatBlt(HDC, int, int, int, int, DWORD);
+
+BOOL WINAPI StretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
+int WINAPI StretchDIBits(HDC, int, int, int, int, int,
+ int, int, int, const void FAR*, LPBITMAPINFO, UINT, DWORD);
+
+COLORREF WINAPI SetPixel(HDC, int, int, COLORREF);
+COLORREF WINAPI GetPixel(HDC, int, int);
+
+/* StretchBlt() Modes */
+#define BLACKONWHITE 1
+#define WHITEONBLACK 2
+#define COLORONCOLOR 3
+
+/* new StretchBlt() Modes (simpler names) */
+#define STRETCH_ANDSCANS 1
+#define STRETCH_ORSCANS 2
+#define STRETCH_DELETESCANS 3
+
+int WINAPI SetStretchBltMode(HDC, int);
+int WINAPI GetStretchBltMode(HDC);
+
+DWORD WINAPI SetBitmapDimension(HBITMAP, int, int);
+DWORD WINAPI GetBitmapDimension(HBITMAP);
+#if (WINVER >= 0x030a)
+BOOL WINAPI SetBitmapDimensionEx(HBITMAP, int, int, SIZE FAR*);
+BOOL WINAPI GetBitmapDimensionEx(HBITMAP, SIZE FAR*);
+#endif /* WINVER >= 0x030a */
+int WINAPI SetROP2(HDC, int);
+int WINAPI GetROP2(HDC);
+
+LONG WINAPI SetBitmapBits(HBITMAP, DWORD, const void FAR*);
+LONG WINAPI GetBitmapBits(HBITMAP, LONG, void FAR*);
+
+int WINAPI SetDIBits(HDC, HBITMAP, UINT, UINT, const void FAR*, BITMAPINFO FAR*, UINT);
+int WINAPI GetDIBits(HDC, HBITMAP, UINT, UINT, void FAR*, BITMAPINFO FAR*, UINT);
+
+int WINAPI SetDIBitsToDevice(HDC, int, int, int, int, int, int, UINT, UINT,
+ void FAR*, BITMAPINFO FAR*, UINT);
+#endif /* NOBITMAP */
+
+/****** Metafile support ****************************************************/
+
+#ifndef NOMETAFILE
+
+DECLARE_HANDLE(HMETAFILE);
+
+HDC WINAPI CreateMetaFile(LPCSTR);
+HMETAFILE WINAPI CloseMetaFile(HDC);
+
+HMETAFILE WINAPI GetMetaFile(LPCSTR);
+BOOL WINAPI DeleteMetaFile(HMETAFILE);
+HMETAFILE WINAPI CopyMetaFile(HMETAFILE, LPCSTR);
+
+BOOL WINAPI PlayMetaFile(HDC, HMETAFILE);
+
+HGLOBAL WINAPI GetMetaFileBits(HMETAFILE);
+HMETAFILE WINAPI SetMetaFileBits(HGLOBAL);
+#if (WINVER >= 0x030a)
+HMETAFILE WINAPI SetMetaFileBitsBetter(HGLOBAL);
+#endif /* WINVER >= 0x030a */
+
+/* Clipboard Metafile Picture Structure */
+typedef struct tagMETAFILEPICT
+{
+ int mm;
+ int xExt;
+ int yExt;
+ HMETAFILE hMF;
+} METAFILEPICT;
+typedef METAFILEPICT FAR* LPMETAFILEPICT;
+
+typedef struct tagMETAHEADER
+{
+ UINT mtType;
+ UINT mtHeaderSize;
+ UINT mtVersion;
+ DWORD mtSize;
+ UINT mtNoObjects;
+ DWORD mtMaxRecord;
+ UINT mtNoParameters;
+} METAHEADER;
+
+typedef struct tagHANDLETABLE
+{
+ HGDIOBJ objectHandle[1];
+} HANDLETABLE;
+typedef HANDLETABLE* PHANDLETABLE;
+typedef HANDLETABLE FAR* LPHANDLETABLE;
+
+typedef struct tagMETARECORD
+{
+ DWORD rdSize;
+ UINT rdFunction;
+ UINT rdParm[1];
+} METARECORD;
+typedef METARECORD* PMETARECORD;
+typedef METARECORD FAR* LPMETARECORD;
+
+/* Metafile Functions */
+#define META_SETBKCOLOR 0x0201
+#define META_SETBKMODE 0x0102
+#define META_SETMAPMODE 0x0103
+#define META_SETROP2 0x0104
+#define META_SETRELABS 0x0105
+#define META_SETPOLYFILLMODE 0x0106
+#define META_SETSTRETCHBLTMODE 0x0107
+#define META_SETTEXTCHAREXTRA 0x0108
+#define META_SETTEXTCOLOR 0x0209
+#define META_SETTEXTJUSTIFICATION 0x020A
+#define META_SETWINDOWORG 0x020B
+#define META_SETWINDOWEXT 0x020C
+#define META_SETVIEWPORTORG 0x020D
+#define META_SETVIEWPORTEXT 0x020E
+#define META_OFFSETWINDOWORG 0x020F
+#define META_SCALEWINDOWEXT 0x0410
+#define META_OFFSETVIEWPORTORG 0x0211
+#define META_SCALEVIEWPORTEXT 0x0412
+#define META_LINETO 0x0213
+#define META_MOVETO 0x0214
+#define META_EXCLUDECLIPRECT 0x0415
+#define META_INTERSECTCLIPRECT 0x0416
+#define META_ARC 0x0817
+#define META_ELLIPSE 0x0418
+#define META_FLOODFILL 0x0419
+#define META_PIE 0x081A
+#define META_RECTANGLE 0x041B
+#define META_ROUNDRECT 0x061C
+#define META_PATBLT 0x061D
+#define META_SAVEDC 0x001E
+#define META_SETPIXEL 0x041F
+#define META_OFFSETCLIPRGN 0x0220
+#define META_TEXTOUT 0x0521
+#define META_BITBLT 0x0922
+#define META_STRETCHBLT 0x0B23
+#define META_POLYGON 0x0324
+#define META_POLYLINE 0x0325
+#define META_ESCAPE 0x0626
+#define META_RESTOREDC 0x0127
+#define META_FILLREGION 0x0228
+#define META_FRAMEREGION 0x0429
+#define META_INVERTREGION 0x012A
+#define META_PAINTREGION 0x012B
+#define META_SELECTCLIPREGION 0x012C
+#define META_SELECTOBJECT 0x012D
+#define META_SETTEXTALIGN 0x012E
+#define META_DRAWTEXT 0x062F
+
+#define META_CHORD 0x0830
+#define META_SETMAPPERFLAGS 0x0231
+#define META_EXTTEXTOUT 0x0a32
+#define META_SETDIBTODEV 0x0d33
+#define META_SELECTPALETTE 0x0234
+#define META_REALIZEPALETTE 0x0035
+#define META_ANIMATEPALETTE 0x0436
+#define META_SETPALENTRIES 0x0037
+#define META_POLYPOLYGON 0x0538
+#define META_RESIZEPALETTE 0x0139
+
+#define META_DIBBITBLT 0x0940
+#define META_DIBSTRETCHBLT 0x0b41
+#define META_DIBCREATEPATTERNBRUSH 0x0142
+#define META_STRETCHDIB 0x0f43
+
+#define META_EXTFLOODFILL 0x0548
+
+#define META_RESETDC 0x014C
+#define META_STARTDOC 0x014D
+#define META_STARTPAGE 0x004F
+#define META_ENDPAGE 0x0050
+#define META_ABORTDOC 0x0052
+#define META_ENDDOC 0x005E
+
+#define META_DELETEOBJECT 0x01f0
+
+#define META_CREATEPALETTE 0x00f7
+#define META_CREATEBRUSH 0x00F8
+#define META_CREATEPATTERNBRUSH 0x01F9
+#define META_CREATEPENINDIRECT 0x02FA
+#define META_CREATEFONTINDIRECT 0x02FB
+#define META_CREATEBRUSHINDIRECT 0x02FC
+#define META_CREATEBITMAPINDIRECT 0x02FD
+#define META_CREATEBITMAP 0x06FE
+#define META_CREATEREGION 0x06FF
+
+void WINAPI PlayMetaFileRecord(HDC, HANDLETABLE FAR*, METARECORD FAR*, UINT);
+
+#ifdef STRICT
+typedef int (CALLBACK* MFENUMPROC)(HDC, HANDLETABLE FAR*, METARECORD FAR*, int, LPARAM);
+#else
+typedef FARPROC MFENUMPROC;
+#endif
+
+BOOL WINAPI EnumMetaFile(HDC, HMETAFILE, MFENUMPROC, LPARAM);
+
+#endif /* NOMETAFILE */
+
+/****** Printing support ****************************************************/
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* ABORTPROC)(HDC, int);
+#else
+typedef FARPROC ABORTPROC;
+#endif
+
+#if (WINVER >= 0x030a)
+
+typedef struct
+{
+ int cbSize;
+ LPCSTR lpszDocName;
+ LPCSTR lpszOutput;
+} DOCINFO;
+typedef DOCINFO FAR* LPDOCINFO;
+
+int WINAPI StartDoc(HDC, DOCINFO FAR*);
+int WINAPI StartPage(HDC);
+int WINAPI EndPage(HDC);
+int WINAPI EndDoc(HDC);
+int WINAPI AbortDoc(HDC);
+
+int WINAPI SetAbortProc(HDC, ABORTPROC);
+HANDLE WINAPI SpoolFile(LPSTR, LPSTR, LPSTR, LPSTR);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI QueryAbort(HDC, int);
+
+/* Spooler Error Codes */
+#define SP_NOTREPORTED 0x4000
+#define SP_ERROR (-1)
+#define SP_APPABORT (-2)
+#define SP_USERABORT (-3)
+#define SP_OUTOFDISK (-4)
+#define SP_OUTOFMEMORY (-5)
+
+#define PR_JOBSTATUS 0x0000
+
+#endif /* NOGDI */
+
+/* Spooler status notification message */
+#define WM_SPOOLERSTATUS 0x002A
+
+#ifndef NOGDI
+
+/******* GDI Escape support *************************************************/
+
+int WINAPI Escape(HDC, int, int, LPCSTR, void FAR*);
+
+/* GDI Escapes */
+#define NEWFRAME 1
+#define ABORTDOC 2
+#define NEXTBAND 3
+#define SETCOLORTABLE 4
+#define GETCOLORTABLE 5
+#define FLUSHOUTPUT 6
+#define DRAFTMODE 7
+#define QUERYESCSUPPORT 8
+#define SETABORTPROC 9
+#define STARTDOC 10
+#define ENDDOC 11
+#define GETPHYSPAGESIZE 12
+#define GETPRINTINGOFFSET 13
+#define GETSCALINGFACTOR 14
+#define MFCOMMENT 15
+#define GETPENWIDTH 16
+#define SETCOPYCOUNT 17
+#define SELECTPAPERSOURCE 18
+#define DEVICEDATA 19
+#define PASSTHROUGH 19
+#define GETTECHNOLGY 20
+#define GETTECHNOLOGY 20
+#define SETLINECAP 21
+#define SETLINEJOIN 22
+#define SETMITERLIMIT 23
+#define BANDINFO 24
+#define DRAWPATTERNRECT 25
+#define GETVECTORPENSIZE 26
+#define GETVECTORBRUSHSIZE 27
+#define ENABLEDUPLEX 28
+#define GETSETPAPERBINS 29
+#define GETSETPRINTORIENT 30
+#define ENUMPAPERBINS 31
+#define SETDIBSCALING 32
+#define EPSPRINTING 33
+#define ENUMPAPERMETRICS 34
+#define GETSETPAPERMETRICS 35
+#define POSTSCRIPT_DATA 37
+#define POSTSCRIPT_IGNORE 38
+#define MOUSETRAILS 39
+
+#define GETEXTENDEDTEXTMETRICS 256
+#define GETEXTENTTABLE 257
+#define GETPAIRKERNTABLE 258
+#define GETTRACKKERNTABLE 259
+#define EXTTEXTOUT 512
+#define GETFACENAME 513
+#define ENABLERELATIVEWIDTHS 768
+#define ENABLEPAIRKERNING 769
+#define SETKERNTRACK 770
+#define SETALLJUSTVALUES 771
+#define SETCHARSET 772
+
+#define STRETCHBLT 2048
+
+#define GETSETSCREENPARAMS 3072
+
+#define BEGIN_PATH 4096
+#define CLIP_TO_PATH 4097
+#define END_PATH 4098
+#define EXT_DEVICE_CAPS 4099
+#define RESTORE_CTM 4100
+#define SAVE_CTM 4101
+#define SET_ARC_DIRECTION 4102
+#define SET_BACKGROUND_COLOR 4103
+#define SET_POLY_MODE 4104
+#define SET_SCREEN_ANGLE 4105
+#define SET_SPREAD 4106
+#define TRANSFORM_CTM 4107
+#define SET_CLIP_BOX 4108
+#define SET_BOUNDS 4109
+
+#endif /* NOGDI */
+
+/****** USER typedefs, structures, and functions *****************************/
+
+DECLARE_HANDLE(HWND);
+
+#ifndef NOUSER
+
+DECLARE_HANDLE(HMENU);
+
+DECLARE_HANDLE(HICON);
+typedef HICON HCURSOR; /* HICONs & HCURSORs are polymorphic */
+
+/****** System Metrics *******************************************************/
+
+#ifndef NOSYSMETRICS
+
+int WINAPI GetSystemMetrics(int);
+
+/* GetSystemMetrics() codes */
+#define SM_CXSCREEN 0
+#define SM_CYSCREEN 1
+#define SM_CXVSCROLL 2
+#define SM_CYHSCROLL 3
+#define SM_CYCAPTION 4
+#define SM_CXBORDER 5
+#define SM_CYBORDER 6
+#define SM_CXDLGFRAME 7
+#define SM_CYDLGFRAME 8
+#define SM_CYVTHUMB 9
+#define SM_CXHTHUMB 10
+#define SM_CXICON 11
+#define SM_CYICON 12
+#define SM_CXCURSOR 13
+#define SM_CYCURSOR 14
+#define SM_CYMENU 15
+#define SM_CXFULLSCREEN 16
+#define SM_CYFULLSCREEN 17
+#define SM_CYKANJIWINDOW 18
+#define SM_MOUSEPRESENT 19
+#define SM_CYVSCROLL 20
+#define SM_CXHSCROLL 21
+#define SM_DEBUG 22
+#define SM_SWAPBUTTON 23
+#define SM_RESERVED1 24
+#define SM_RESERVED2 25
+#define SM_RESERVED3 26
+#define SM_RESERVED4 27
+#define SM_CXMIN 28
+#define SM_CYMIN 29
+#define SM_CXSIZE 30
+#define SM_CYSIZE 31
+#define SM_CXFRAME 32
+#define SM_CYFRAME 33
+#define SM_CXMINTRACK 34
+#define SM_CYMINTRACK 35
+
+#if (WINVER >= 0x030a)
+#define SM_CXDOUBLECLK 36
+#define SM_CYDOUBLECLK 37
+#define SM_CXICONSPACING 38
+#define SM_CYICONSPACING 39
+#define SM_MENUDROPALIGNMENT 40
+#define SM_PENWINDOWS 41
+#define SM_DBCSENABLED 42
+#endif /* WINVER >= 0x030a */
+
+#define SM_CMETRICS 43
+
+#endif /* NOSYSMETRICS */
+
+UINT WINAPI GetDoubleClickTime(void);
+void WINAPI SetDoubleClickTime(UINT);
+
+#define WM_DEVMODECHANGE 0x001B
+#define WM_TIMECHANGE 0x001E
+
+/****** System Parameters support ********************************************/
+
+#if (WINVER >= 0x030a)
+#ifndef NOSYSTEMPARAMSINFO
+
+BOOL WINAPI SystemParametersInfo(UINT, UINT, VOID FAR*, UINT);
+
+#define SPI_GETBEEP 1
+#define SPI_SETBEEP 2
+#define SPI_GETMOUSE 3
+#define SPI_SETMOUSE 4
+#define SPI_GETBORDER 5
+#define SPI_SETBORDER 6
+#define SPI_GETKEYBOARDSPEED 10
+#define SPI_SETKEYBOARDSPEED 11
+#define SPI_LANGDRIVER 12
+#define SPI_ICONHORIZONTALSPACING 13
+#define SPI_GETSCREENSAVETIMEOUT 14
+#define SPI_SETSCREENSAVETIMEOUT 15
+#define SPI_GETSCREENSAVEACTIVE 16
+#define SPI_SETSCREENSAVEACTIVE 17
+#define SPI_GETGRIDGRANULARITY 18
+#define SPI_SETGRIDGRANULARITY 19
+#define SPI_SETDESKWALLPAPER 20
+#define SPI_SETDESKPATTERN 21
+#define SPI_GETKEYBOARDDELAY 22
+#define SPI_SETKEYBOARDDELAY 23
+#define SPI_ICONVERTICALSPACING 24
+#define SPI_GETICONTITLEWRAP 25
+#define SPI_SETICONTITLEWRAP 26
+#define SPI_GETMENUDROPALIGNMENT 27
+#define SPI_SETMENUDROPALIGNMENT 28
+#define SPI_SETDOUBLECLKWIDTH 29
+#define SPI_SETDOUBLECLKHEIGHT 30
+#define SPI_GETICONTITLELOGFONT 31
+#define SPI_SETDOUBLECLICKTIME 32
+#define SPI_SETMOUSEBUTTONSWAP 33
+#define SPI_SETICONTITLELOGFONT 34
+#define SPI_GETFASTTASKSWITCH 35
+#define SPI_SETFASTTASKSWITCH 36
+
+/* SystemParametersInfo flags */
+#define SPIF_UPDATEINIFILE 0x0001
+#define SPIF_SENDWININICHANGE 0x0002
+
+#endif /* NOSYSTEMPARAMSINFO */
+#endif /* WINVER >= 0x030a */
+
+/****** Rectangle support ****************************************************/
+
+void WINAPI SetRect(RECT FAR*, int, int, int, int);
+void WINAPI SetRectEmpty(RECT FAR*);
+
+void WINAPI CopyRect(RECT FAR*, const RECT FAR*);
+
+BOOL WINAPI IsRectEmpty(const RECT FAR*);
+
+BOOL WINAPI EqualRect(const RECT FAR*, const RECT FAR*);
+
+BOOL WINAPI IntersectRect(RECT FAR*, const RECT FAR*, const RECT FAR*);
+BOOL WINAPI UnionRect(RECT FAR*, const RECT FAR*, const RECT FAR*);
+BOOL WINAPI SubtractRect(RECT FAR*, const RECT FAR*, const RECT FAR*);
+
+void WINAPI OffsetRect(RECT FAR*, int, int);
+void WINAPI InflateRect(RECT FAR*, int, int);
+
+BOOL WINAPI PtInRect(const RECT FAR*, POINT);
+
+/****** Window message support ***********************************************/
+
+UINT WINAPI RegisterWindowMessage(LPCSTR);
+
+#define WM_NULL 0x0000
+
+/* NOTE: All messages below 0x0400 are RESERVED by Windows */
+#define WM_USER 0x0400
+
+#ifndef NOMSG
+
+/* Queued message structure */
+typedef struct tagMSG
+{
+ HWND hwnd;
+ UINT message;
+ WPARAM wParam;
+ LPARAM lParam;
+ DWORD time;
+ POINT pt;
+} MSG;
+typedef MSG* PMSG;
+typedef MSG NEAR* NPMSG;
+typedef MSG FAR* LPMSG;
+
+BOOL WINAPI GetMessage(MSG FAR*, HWND, UINT, UINT);
+BOOL WINAPI PeekMessage(MSG FAR*, HWND, UINT, UINT, UINT);
+
+/* PeekMessage() options */
+#define PM_NOREMOVE 0x0000
+#define PM_REMOVE 0x0001
+#define PM_NOYIELD 0x0002
+
+void WINAPI WaitMessage(void);
+
+DWORD WINAPI GetMessagePos(void);
+LONG WINAPI GetMessageTime(void);
+#if (WINVER >= 0x030a)
+LPARAM WINAPI GetMessageExtraInfo(void);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI TranslateMessage(const MSG FAR*);
+LONG WINAPI DispatchMessage(const MSG FAR*);
+
+BOOL WINAPI SetMessageQueue(int);
+
+BOOL WINAPI GetInputState(void);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI GetQueueStatus(UINT flags);
+
+/* GetQueueStatus flags */
+#define QS_KEY 0x0001
+#define QS_MOUSEMOVE 0x0002
+#define QS_MOUSEBUTTON 0x0004
+#define QS_MOUSE (QS_MOUSEMOVE | QS_MOUSEBUTTON)
+#define QS_POSTMESSAGE 0x0008
+#define QS_TIMER 0x0010
+#define QS_PAINT 0x0020
+#define QS_SENDMESSAGE 0x0040
+
+#define QS_ALLINPUT 0x007f
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOMSG */
+
+BOOL WINAPI PostMessage(HWND, UINT, WPARAM, LPARAM);
+LRESULT WINAPI SendMessage(HWND, UINT, WPARAM, LPARAM);
+
+#ifndef NOMSG
+
+BOOL WINAPI PostAppMessage(HTASK, UINT, WPARAM, LPARAM);
+
+void WINAPI ReplyMessage(LRESULT);
+BOOL WINAPI InSendMessage(void);
+
+/* Special HWND value for use with PostMessage() and SendMessage() */
+#define HWND_BROADCAST ((HWND)0xffff)
+
+BOOL WINAPI CallMsgFilter(MSG FAR*, int);
+
+#define WH_GETMESSAGE 3
+
+#define WH_CALLWNDPROC 4
+
+#define WH_MSGFILTER (-1)
+#define WH_SYSMSGFILTER 6
+
+/* CallMsgFilter() and WH_SYS/MSGFILTER context codes */
+#define MSGF_DIALOGBOX 0
+#define MSGF_MENU 2
+#define MSGF_MOVE 3
+#define MSGF_SIZE 4
+#define MSGF_SCROLLBAR 5
+#define MSGF_NEXTWINDOW 6
+#define MSGF_MAINLOOP 8
+#define MSGF_USER 4096
+#endif /* NOMSG */
+
+/* Standard window messages */
+/* PenWindows specific messages */
+#define WM_PENWINFIRST 0x0380
+#define WM_PENWINLAST 0x038F
+
+/* Coalescing messages */
+#define WM_COALESCE_FIRST 0x0390
+#define WM_COALESCE_LAST 0x039F
+
+
+#if (WINVER >= 0x030a)
+/****** Power management ****************************************************/
+#define WM_POWER 0x0048
+
+/* wParam for WM_POWER window message and DRV_POWER driver notification */
+#define PWR_OK 1
+#define PWR_FAIL (-1)
+#define PWR_SUSPENDREQUEST 1
+#define PWR_SUSPENDRESUME 2
+#define PWR_CRITICALRESUME 3
+#endif /* WINVER >= 0x030a */
+
+/****** Application termination *********************************************/
+
+#define WM_QUERYENDSESSION 0x0011
+#define WM_ENDSESSION 0x0016
+
+#define WM_QUIT 0x0012
+
+void WINAPI PostQuitMessage(int);
+
+#define WM_SYSTEMERROR 0x0017
+
+/****** Window class management *********************************************/
+
+typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
+
+typedef struct tagWNDCLASS
+{
+ UINT style;
+ WNDPROC lpfnWndProc;
+ int cbClsExtra;
+ int cbWndExtra;
+ HINSTANCE hInstance;
+ HICON hIcon;
+ HCURSOR hCursor;
+ HBRUSH hbrBackground;
+ LPCSTR lpszMenuName;
+ LPCSTR lpszClassName;
+} WNDCLASS;
+typedef WNDCLASS* PWNDCLASS;
+typedef WNDCLASS NEAR* NPWNDCLASS;
+typedef WNDCLASS FAR* LPWNDCLASS;
+
+ATOM WINAPI RegisterClass(const WNDCLASS FAR*);
+BOOL WINAPI UnregisterClass(LPCSTR, HINSTANCE);
+
+BOOL WINAPI GetClassInfo(HINSTANCE, LPCSTR, WNDCLASS FAR*);
+int WINAPI GetClassName(HWND, LPSTR, int);
+
+#ifndef NOWINSTYLES
+
+/* Class styles */
+#define CS_VREDRAW 0x0001
+#define CS_HREDRAW 0x0002
+
+#define CS_OWNDC 0x0020
+#define CS_CLASSDC 0x0040
+#define CS_PARENTDC 0x0080
+
+#define CS_SAVEBITS 0x0800
+
+#define CS_DBLCLKS 0x0008
+
+#define CS_BYTEALIGNCLIENT 0x1000
+#define CS_BYTEALIGNWINDOW 0x2000
+
+#define CS_NOCLOSE 0x0200
+
+#define CS_KEYCVTWINDOW 0x0004
+#define CS_NOKEYCVT 0x0100
+
+#define CS_GLOBALCLASS 0x4000
+#endif /* NOWINSTYLES */
+
+#ifndef NOWINOFFSETS
+
+WORD WINAPI GetClassWord(HWND, int);
+WORD WINAPI SetClassWord(HWND, int, WORD);
+LONG WINAPI GetClassLong(HWND, int);
+LONG WINAPI SetClassLong(HWND, int, LONG);
+
+/* Class field offsets for GetClassLong() and GetClassWord() */
+#define GCL_MENUNAME (-8)
+#define GCW_HBRBACKGROUND (-10)
+#define GCW_HCURSOR (-12)
+#define GCW_HICON (-14)
+#define GCW_HMODULE (-16)
+#define GCW_CBWNDEXTRA (-18)
+#define GCW_CBCLSEXTRA (-20)
+#define GCL_WNDPROC (-24)
+#define GCW_STYLE (-26)
+
+#if (WINVER >= 0x030a)
+#define GCW_ATOM (-32)
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOWINOFFSETS */
+
+/****** Window creation/destroy *********************************************/
+
+/* Window Styles */
+#ifndef NOWINSTYLES
+
+/* Basic window types */
+#define WS_OVERLAPPED 0x00000000L
+#define WS_POPUP 0x80000000L
+#define WS_CHILD 0x40000000L
+
+/* Clipping styles */
+#define WS_CLIPSIBLINGS 0x04000000L
+#define WS_CLIPCHILDREN 0x02000000L
+
+/* Generic window states */
+#define WS_VISIBLE 0x10000000L
+#define WS_DISABLED 0x08000000L
+
+/* Main window states */
+#define WS_MINIMIZE 0x20000000L
+#define WS_MAXIMIZE 0x01000000L
+
+/* Main window styles */
+#define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */
+#define WS_BORDER 0x00800000L
+#define WS_DLGFRAME 0x00400000L
+#define WS_VSCROLL 0x00200000L
+#define WS_HSCROLL 0x00100000L
+#define WS_SYSMENU 0x00080000L
+#define WS_THICKFRAME 0x00040000L
+#define WS_MINIMIZEBOX 0x00020000L
+#define WS_MAXIMIZEBOX 0x00010000L
+
+/* Control window styles */
+#define WS_GROUP 0x00020000L
+#define WS_TABSTOP 0x00010000L
+
+/* Common Window Styles */
+#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
+#define WS_POPUPWINDOW (WS_POPUP | WS_BORDER | WS_SYSMENU)
+#define WS_CHILDWINDOW (WS_CHILD)
+
+/* Extended Window Styles */
+#define WS_EX_DLGMODALFRAME 0x00000001L
+#define WS_EX_NOPARENTNOTIFY 0x00000004L
+
+#if (WINVER >= 0x030a)
+#define WS_EX_TOPMOST 0x00000008L
+#define WS_EX_ACCEPTFILES 0x00000010L
+#define WS_EX_TRANSPARENT 0x00000020L
+#endif /* WINVER >= 0x030a */
+
+/* Obsolete style names */
+#define WS_TILED WS_OVERLAPPED
+#define WS_ICONIC WS_MINIMIZE
+#define WS_SIZEBOX WS_THICKFRAME
+#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW
+
+
+#endif /* NOWINSTYLES */
+
+/* Special value for CreateWindow, et al. */
+#define HWND_DESKTOP ((HWND)0)
+
+BOOL WINAPI IsWindow(HWND);
+
+HWND WINAPI CreateWindowEx(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, void FAR*);
+HWND WINAPI CreateWindow(LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, void FAR*);
+
+#define WM_CREATE 0x0001
+#define WM_NCCREATE 0x0081
+
+/* WM_CREATE/WM_NCCREATE lParam struct */
+typedef struct tagCREATESTRUCT
+{
+ void FAR* lpCreateParams;
+ HINSTANCE hInstance;
+ HMENU hMenu;
+ HWND hwndParent;
+ int cy;
+ int cx;
+ int y;
+ int x;
+ LONG style;
+ LPCSTR lpszName;
+ LPCSTR lpszClass;
+ DWORD dwExStyle;
+} CREATESTRUCT;
+typedef CREATESTRUCT FAR* LPCREATESTRUCT;
+
+BOOL WINAPI DestroyWindow(HWND);
+
+#define WM_DESTROY 0x0002
+#define WM_NCDESTROY 0x0082
+
+/* Basic window attributes */
+
+HTASK WINAPI GetWindowTask(HWND);
+
+BOOL WINAPI IsChild(HWND, HWND);
+
+HWND WINAPI GetParent(HWND);
+HWND WINAPI SetParent(HWND, HWND);
+
+BOOL WINAPI IsWindowVisible(HWND);
+
+BOOL WINAPI ShowWindow(HWND, int);
+
+
+#ifndef NOSHOWWINDOW
+
+#define SW_HIDE 0
+#define SW_SHOWNORMAL 1
+#define SW_NORMAL 1
+#define SW_SHOWMINIMIZED 2
+#define SW_SHOWMAXIMIZED 3
+#define SW_MAXIMIZE 3
+#define SW_SHOWNOACTIVATE 4
+#define SW_SHOW 5
+#define SW_MINIMIZE 6
+#define SW_SHOWMINNOACTIVE 7
+#define SW_SHOWNA 8
+#define SW_RESTORE 9
+
+/* Obsolete ShowWindow() command names */
+#define HIDE_WINDOW 0
+#define SHOW_OPENWINDOW 1
+#define SHOW_ICONWINDOW 2
+#define SHOW_FULLSCREEN 3
+#define SHOW_OPENNOACTIVATE 4
+
+#define WM_SHOWWINDOW 0x0018
+
+/* WM_SHOWWINDOW wParam codes */
+#define SW_PARENTCLOSING 1
+#define SW_OTHERMAXIMIZED 2
+#define SW_PARENTOPENING 3
+#define SW_OTHERRESTORED 4
+
+/* Obsolete constant names */
+#define SW_OTHERZOOM SW_OTHERMAXIMIZED
+#define SW_OTHERUNZOOM SW_OTHERRESTORED
+#endif /* NOSHOWWINDOW */
+
+#define WM_SETREDRAW 0x000B
+
+/* Enabled state */
+BOOL WINAPI EnableWindow(HWND,BOOL);
+BOOL WINAPI IsWindowEnabled(HWND);
+
+#define WM_ENABLE 0x000A
+
+/* Window text */
+void WINAPI SetWindowText(HWND, LPCSTR);
+int WINAPI GetWindowText(HWND, LPSTR, int);
+int WINAPI GetWindowTextLength(HWND);
+
+#define WM_SETTEXT 0x000C
+#define WM_GETTEXT 0x000D
+#define WM_GETTEXTLENGTH 0x000E
+
+/* Window words */
+WORD WINAPI GetWindowWord(HWND, int);
+WORD WINAPI SetWindowWord(HWND, int, WORD);
+LONG WINAPI GetWindowLong(HWND, int);
+LONG WINAPI SetWindowLong(HWND, int, LONG);
+
+/* Window field offsets for GetWindowLong() and GetWindowWord() */
+#ifndef NOWINOFFSETS
+#define GWL_WNDPROC (-4)
+#define GWW_HINSTANCE (-6)
+#define GWW_HWNDPARENT (-8)
+#define GWW_ID (-12)
+#define GWL_STYLE (-16)
+#define GWL_EXSTYLE (-20)
+#endif /* NOWINOFFSETS */
+
+/****** Window size, position, Z-order, and visibility **********************/
+
+#define CW_USEDEFAULT ((int)0x8000)
+
+void WINAPI GetClientRect(HWND, RECT FAR*);
+void WINAPI GetWindowRect(HWND, RECT FAR*);
+
+
+#if (WINVER >= 0x030a)
+typedef struct tagWINDOWPLACEMENT
+{
+ UINT length;
+ UINT flags;
+ UINT showCmd;
+ POINT ptMinPosition;
+ POINT ptMaxPosition;
+ RECT rcNormalPosition;
+} WINDOWPLACEMENT;
+typedef WINDOWPLACEMENT *PWINDOWPLACEMENT;
+typedef WINDOWPLACEMENT FAR* LPWINDOWPLACEMENT;
+
+#define WPF_SETMINPOSITION 0x0001
+#define WPF_RESTORETOMAXIMIZED 0x0002
+
+BOOL WINAPI GetWindowPlacement(HWND, WINDOWPLACEMENT FAR*);
+BOOL WINAPI SetWindowPlacement(HWND, const WINDOWPLACEMENT FAR*);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI SetWindowPos(HWND, HWND, int, int, int, int, UINT);
+
+/* SetWindowPos() and WINDOWPOS flags */
+#define SWP_NOSIZE 0x0001
+#define SWP_NOMOVE 0x0002
+#define SWP_NOZORDER 0x0004
+#define SWP_NOREDRAW 0x0008
+#define SWP_NOACTIVATE 0x0010
+#define SWP_FRAMECHANGED 0x0020 /* The frame changed: send WM_NCCALCSIZE */
+#define SWP_SHOWWINDOW 0x0040
+#define SWP_HIDEWINDOW 0x0080
+#define SWP_NOCOPYBITS 0x0100
+#define SWP_NOOWNERZORDER 0x0200 /* Don't do owner Z ordering */
+
+#define SWP_DRAWFRAME SWP_FRAMECHANGED
+#define SWP_NOREPOSITION SWP_NOOWNERZORDER
+
+#define SWP_NOSENDCHANGING 0x0400
+#define SWP_DEFERERASE 0x2000
+
+/* SetWindowPos() hwndInsertAfter field values */
+#define HWND_TOP ((HWND)0)
+#define HWND_BOTTOM ((HWND)1)
+#define HWND_TOPMOST ((HWND)-1)
+#define HWND_NOTOPMOST ((HWND)-2)
+
+#ifndef NODEFERWINDOWPOS
+
+DECLARE_HANDLE(HDWP);
+
+HDWP WINAPI BeginDeferWindowPos(int);
+HDWP WINAPI DeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT);
+BOOL WINAPI EndDeferWindowPos(HDWP);
+
+#endif /* NODEFERWINDOWPOS */
+
+BOOL WINAPI MoveWindow(HWND, int, int, int, int, BOOL);
+BOOL WINAPI BringWindowToTop(HWND);
+
+#if (WINVER >= 0x030a)
+
+#define WM_WINDOWPOSCHANGING 0x0046
+#define WM_WINDOWPOSCHANGED 0x0047
+
+/* WM_WINDOWPOSCHANGING/CHANGED struct pointed to by lParam */
+typedef struct tagWINDOWPOS
+{
+ HWND hwnd;
+ HWND hwndInsertAfter;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ UINT flags;
+} WINDOWPOS;
+typedef WINDOWPOS FAR* LPWINDOWPOS;
+#endif /* WINVER >= 0x030a */
+
+#define WM_MOVE 0x0003
+#define WM_SIZE 0x0005
+
+/* WM_SIZE message wParam values */
+#define SIZE_RESTORED 0
+#define SIZE_MINIMIZED 1
+#define SIZE_MAXIMIZED 2
+#define SIZE_MAXSHOW 3
+#define SIZE_MAXHIDE 4
+
+/* Obsolete constant names */
+#define SIZENORMAL SIZE_RESTORED
+#define SIZEICONIC SIZE_MINIMIZED
+#define SIZEFULLSCREEN SIZE_MAXIMIZED
+#define SIZEZOOMSHOW SIZE_MAXSHOW
+#define SIZEZOOMHIDE SIZE_MAXHIDE
+
+/****** Window proc implementation & subclassing support *********************/
+
+LRESULT WINAPI DefWindowProc(HWND, UINT, WPARAM, LPARAM);
+
+#ifdef STRICT
+LRESULT WINAPI CallWindowProc(WNDPROC, HWND, UINT, WPARAM, LPARAM);
+#else
+LRESULT WINAPI CallWindowProc(FARPROC, HWND, UINT, WPARAM, LPARAM);
+#endif
+
+/****** Main window support **************************************************/
+
+void WINAPI AdjustWindowRect(RECT FAR*, DWORD, BOOL);
+void WINAPI AdjustWindowRectEx(RECT FAR*, DWORD, BOOL, DWORD);
+
+#define WM_QUERYOPEN 0x0013
+#define WM_CLOSE 0x0010
+
+/* Struct pointed to by WM_GETMINMAXINFO lParam */
+typedef struct tagMINMAXINFO
+{
+ POINT ptReserved;
+ POINT ptMaxSize;
+ POINT ptMaxPosition;
+ POINT ptMinTrackSize;
+ POINT ptMaxTrackSize;
+} MINMAXINFO;
+#define WM_GETMINMAXINFO 0x0024
+
+
+BOOL WINAPI FlashWindow(HWND, BOOL);
+
+void WINAPI ShowOwnedPopups(HWND, BOOL);
+
+/* Obsolete functions */
+BOOL WINAPI OpenIcon(HWND);
+void WINAPI CloseWindow(HWND);
+BOOL WINAPI AnyPopup(void);
+BOOL WINAPI IsIconic(HWND);
+BOOL WINAPI IsZoomed(HWND);
+
+/****** Window coordinate mapping and hit-testing ***************************/
+
+void WINAPI ClientToScreen(HWND, POINT FAR*);
+void WINAPI ScreenToClient(HWND, POINT FAR*);
+
+#if (WINVER >= 0x030a)
+void WINAPI MapWindowPoints(HWND hwndFrom, HWND hwndTo, POINT FAR* lppt, UINT cpt);
+#endif /* WINVER >= 0x030a */
+
+HWND WINAPI WindowFromPoint(POINT);
+HWND WINAPI ChildWindowFromPoint(HWND, POINT);
+
+/****** Window query and enumeration ****************************************/
+
+HWND WINAPI GetDesktopWindow(void);
+
+HWND WINAPI FindWindow(LPCSTR, LPCSTR);
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
+#else
+typedef FARPROC WNDENUMPROC;
+#endif
+
+BOOL WINAPI EnumWindows(WNDENUMPROC, LPARAM);
+BOOL WINAPI EnumChildWindows(HWND, WNDENUMPROC, LPARAM);
+BOOL WINAPI EnumTaskWindows(HTASK, WNDENUMPROC, LPARAM);
+
+HWND WINAPI GetTopWindow(HWND);
+
+HWND WINAPI GetWindow(HWND, UINT);
+HWND WINAPI GetNextWindow(HWND, UINT);
+
+/* GetWindow() constants */
+#define GW_HWNDFIRST 0
+#define GW_HWNDLAST 1
+#define GW_HWNDNEXT 2
+#define GW_HWNDPREV 3
+#define GW_OWNER 4
+#define GW_CHILD 5
+
+
+/****** Window property support *********************************************/
+
+BOOL WINAPI SetProp(HWND, LPCSTR, HANDLE);
+HANDLE WINAPI GetProp(HWND, LPCSTR);
+HANDLE WINAPI RemoveProp(HWND, LPCSTR);
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* PROPENUMPROC)(HWND, LPCSTR, HANDLE);
+#else
+typedef FARPROC PROPENUMPROC;
+#endif
+
+int WINAPI EnumProps(HWND, PROPENUMPROC);
+
+/****** Window drawing support **********************************************/
+
+HDC WINAPI GetDC(HWND);
+int WINAPI ReleaseDC(HWND, HDC);
+
+HDC WINAPI GetWindowDC(HWND);
+
+#if (WINVER >= 0x030a)
+HDC WINAPI GetDCEx(register HWND hwnd, HRGN hrgnClip, DWORD flags);
+
+#define DCX_WINDOW 0x00000001L
+#define DCX_CACHE 0x00000002L
+#define DCX_CLIPCHILDREN 0x00000008L
+#define DCX_CLIPSIBLINGS 0x00000010L
+#define DCX_PARENTCLIP 0x00000020L
+
+#define DCX_EXCLUDERGN 0x00000040L
+#define DCX_INTERSECTRGN 0x00000080L
+
+
+#define DCX_LOCKWINDOWUPDATE 0x00000400L
+
+
+#define DCX_USESTYLE 0x00010000L
+
+#endif /* WINVER >= 0x030a */
+
+/****** Window repainting ***************************************************/
+
+#define WM_PAINT 0x000F
+#define WM_ERASEBKGND 0x0014
+#define WM_ICONERASEBKGND 0x0027
+
+/* BeginPaint() return structure */
+typedef struct tagPAINTSTRUCT
+{
+ HDC hdc;
+ BOOL fErase;
+ RECT rcPaint;
+ BOOL fRestore;
+ BOOL fIncUpdate;
+ BYTE rgbReserved[16];
+} PAINTSTRUCT;
+typedef PAINTSTRUCT* PPAINTSTRUCT;
+typedef PAINTSTRUCT NEAR* NPPAINTSTRUCT;
+typedef PAINTSTRUCT FAR* LPPAINTSTRUCT;
+
+HDC WINAPI BeginPaint(HWND, PAINTSTRUCT FAR*);
+void WINAPI EndPaint(HWND, const PAINTSTRUCT FAR*);
+
+void WINAPI UpdateWindow(HWND);
+
+int WINAPI ExcludeUpdateRgn(HDC, HWND);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI LockWindowUpdate(HWND hwndLock);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI GetUpdateRect(HWND, RECT FAR*, BOOL);
+int WINAPI GetUpdateRgn(HWND, HRGN, BOOL);
+
+void WINAPI InvalidateRect(HWND, const RECT FAR*, BOOL);
+void WINAPI ValidateRect(HWND, const RECT FAR*);
+
+void WINAPI InvalidateRgn(HWND, HRGN, BOOL);
+void WINAPI ValidateRgn(HWND, HRGN);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI RedrawWindow(HWND hwnd, const RECT FAR* lprcUpdate, HRGN hrgnUpdate, UINT flags);
+
+#define RDW_INVALIDATE 0x0001
+#define RDW_INTERNALPAINT 0x0002
+#define RDW_ERASE 0x0004
+
+#define RDW_VALIDATE 0x0008
+#define RDW_NOINTERNALPAINT 0x0010
+#define RDW_NOERASE 0x0020
+
+#define RDW_NOCHILDREN 0x0040
+#define RDW_ALLCHILDREN 0x0080
+
+#define RDW_UPDATENOW 0x0100
+#define RDW_ERASENOW 0x0200
+
+#define RDW_FRAME 0x0400
+#define RDW_NOFRAME 0x0800
+
+#endif /* WINVER >= 0x030a */
+
+/****** Window scrolling ****************************************************/
+
+void WINAPI ScrollWindow(HWND, int, int, const RECT FAR*, const RECT FAR*);
+BOOL WINAPI ScrollDC(HDC, int, int, const RECT FAR*, const RECT FAR*, HRGN, RECT FAR*);
+
+#if (WINVER >= 0x030a)
+
+int WINAPI ScrollWindowEx(HWND hwnd, int dx, int dy,
+ const RECT FAR* prcScroll, const RECT FAR* prcClip,
+ HRGN hrgnUpdate, RECT FAR* prcUpdate, UINT flags);
+
+#define SW_SCROLLCHILDREN 0x0001
+#define SW_INVALIDATE 0x0002
+#define SW_ERASE 0x0004
+
+
+#endif /* WINVER >= 0x030a */
+
+/****** Non-client window area management ************************************/
+
+#define WM_NCPAINT 0x0085
+
+#define WM_NCCALCSIZE 0x0083
+
+#if (WINVER >= 0x030a)
+/* WM_NCCALCSIZE return flags */
+#define WVR_ALIGNTOP 0x0010
+#define WVR_ALIGNLEFT 0x0020
+#define WVR_ALIGNBOTTOM 0x0040
+#define WVR_ALIGNRIGHT 0x0080
+#define WVR_HREDRAW 0x0100
+#define WVR_VREDRAW 0x0200
+#define WVR_REDRAW (WVR_HREDRAW | WVR_VREDRAW)
+#define WVR_VALIDRECTS 0x0400
+
+
+/* WM_NCCALCSIZE parameter structure */
+typedef struct tagNCCALCSIZE_PARAMS
+{
+ RECT rgrc[3];
+ WINDOWPOS FAR* lppos;
+} NCCALCSIZE_PARAMS;
+#else /* WINVER >= 0x030a */
+typedef struct tagNCCALCSIZE_PARAMS
+{
+ RECT rgrc[2];
+} NCCALCSIZE_PARAMS;
+#endif /* WINVER >= 0x030a */
+typedef NCCALCSIZE_PARAMS FAR* LPNCCALCSIZE_PARAMS;
+
+#define WM_NCHITTEST 0x0084
+
+/* WM_NCHITTEST return codes */
+#define HTERROR (-2)
+#define HTTRANSPARENT (-1)
+#define HTNOWHERE 0
+#define HTCLIENT 1
+#define HTCAPTION 2
+#define HTSYSMENU 3
+#define HTSIZE 4
+#define HTMENU 5
+#define HTHSCROLL 6
+#define HTVSCROLL 7
+#define HTMINBUTTON 8
+#define HTMAXBUTTON 9
+#define HTLEFT 10
+#define HTRIGHT 11
+#define HTTOP 12
+#define HTTOPLEFT 13
+#define HTTOPRIGHT 14
+#define HTBOTTOM 15
+#define HTBOTTOMLEFT 16
+#define HTBOTTOMRIGHT 17
+#define HTBORDER 18
+#define HTGROWBOX HTSIZE
+#define HTREDUCE HTMINBUTTON
+#define HTZOOM HTMAXBUTTON
+
+/****** Drag-and-drop support ***********************************************/
+
+#define WM_QUERYDRAGICON 0x0037
+#define WM_DROPFILES 0x0233
+
+/****** Window activation ***************************************************/
+
+HWND WINAPI SetActiveWindow(HWND);
+HWND WINAPI GetActiveWindow(void);
+
+HWND WINAPI GetLastActivePopup(HWND);
+
+/* WM_ACTIVATE state values */
+#define WA_INACTIVE 0
+#define WA_ACTIVE 1
+#define WA_CLICKACTIVE 2
+
+#define WM_ACTIVATE 0x0006
+#define WM_ACTIVATEAPP 0x001C
+#define WM_NCACTIVATE 0x0086
+
+/****** Keyboard input support **********************************************/
+
+HWND WINAPI SetFocus(HWND);
+HWND WINAPI GetFocus(void);
+
+int WINAPI GetKeyState(int);
+int WINAPI GetAsyncKeyState(int);
+
+void WINAPI GetKeyboardState(BYTE FAR* );
+void WINAPI SetKeyboardState(BYTE FAR* );
+
+#define WM_SETFOCUS 0x0007
+#define WM_KILLFOCUS 0x0008
+
+#define WM_KEYDOWN 0x0100
+#define WM_KEYUP 0x0101
+
+#define WM_CHAR 0x0102
+#define WM_DEADCHAR 0x0103
+
+#define WM_SYSKEYDOWN 0x0104
+#define WM_SYSKEYUP 0x0105
+
+#define WM_SYSCHAR 0x0106
+#define WM_SYSDEADCHAR 0x0107
+
+
+/* Keyboard message range */
+#define WM_KEYFIRST 0x0100
+#define WM_KEYLAST 0x0108
+
+/* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags */
+#define KF_EXTENDED 0x0100
+#define KF_DLGMODE 0x0800
+#define KF_MENUMODE 0x1000
+#define KF_ALTDOWN 0x2000
+#define KF_REPEAT 0x4000
+#define KF_UP 0x8000
+
+/* Virtual key codes */
+#ifndef NOVIRTUALKEYCODES
+#define VK_LBUTTON 0x01
+#define VK_RBUTTON 0x02
+#define VK_CANCEL 0x03
+#define VK_MBUTTON 0x04
+#define VK_BACK 0x08
+#define VK_TAB 0x09
+#define VK_CLEAR 0x0C
+#define VK_RETURN 0x0D
+#define VK_SHIFT 0x10
+#define VK_CONTROL 0x11
+#define VK_MENU 0x12
+#define VK_PAUSE 0x13
+#define VK_CAPITAL 0x14
+#define VK_ESCAPE 0x1B
+#define VK_SPACE 0x20
+#define VK_PRIOR 0x21
+#define VK_NEXT 0x22
+#define VK_END 0x23
+#define VK_HOME 0x24
+#define VK_LEFT 0x25
+#define VK_UP 0x26
+#define VK_RIGHT 0x27
+#define VK_DOWN 0x28
+#define VK_SELECT 0x29
+#define VK_PRINT 0x2A
+#define VK_EXECUTE 0x2B
+#define VK_SNAPSHOT 0x2C
+#define VK_INSERT 0x2D
+#define VK_DELETE 0x2E
+#define VK_HELP 0x2F
+#define VK_NUMPAD0 0x60
+#define VK_NUMPAD1 0x61
+#define VK_NUMPAD2 0x62
+#define VK_NUMPAD3 0x63
+#define VK_NUMPAD4 0x64
+#define VK_NUMPAD5 0x65
+#define VK_NUMPAD6 0x66
+#define VK_NUMPAD7 0x67
+#define VK_NUMPAD8 0x68
+#define VK_NUMPAD9 0x69
+#define VK_MULTIPLY 0x6A
+#define VK_ADD 0x6B
+#define VK_SEPARATOR 0x6C
+#define VK_SUBTRACT 0x6D
+#define VK_DECIMAL 0x6E
+#define VK_DIVIDE 0x6F
+#define VK_F1 0x70
+#define VK_F2 0x71
+#define VK_F3 0x72
+#define VK_F4 0x73
+#define VK_F5 0x74
+#define VK_F6 0x75
+#define VK_F7 0x76
+#define VK_F8 0x77
+#define VK_F9 0x78
+#define VK_F10 0x79
+#define VK_F11 0x7A
+#define VK_F12 0x7B
+#define VK_F13 0x7C
+#define VK_F14 0x7D
+#define VK_F15 0x7E
+#define VK_F16 0x7F
+#define VK_F17 0x80
+#define VK_F18 0x81
+#define VK_F19 0x82
+#define VK_F20 0x83
+#define VK_F21 0x84
+#define VK_F22 0x85
+#define VK_F23 0x86
+#define VK_F24 0x87
+#define VK_NUMLOCK 0x90
+#define VK_SCROLL 0x91
+
+/* VK_A thru VK_Z are the same as their ASCII equivalents: 'A' thru 'Z' */
+/* VK_0 thru VK_9 are the same as their ASCII equivalents: '0' thru '0' */
+
+#endif /* NOVIRTUALKEYCODES */
+
+
+/* SetWindowsHook() keyboard hook */
+#define WH_KEYBOARD 2
+
+/****** Mouse input support *************************************************/
+
+HWND WINAPI SetCapture(HWND);
+void WINAPI ReleaseCapture(void);
+HWND WINAPI GetCapture(void);
+
+BOOL WINAPI SwapMouseButton(BOOL);
+
+/* Mouse input messages */
+#define WM_MOUSEMOVE 0x0200
+#define WM_LBUTTONDOWN 0x0201
+#define WM_LBUTTONUP 0x0202
+#define WM_LBUTTONDBLCLK 0x0203
+#define WM_RBUTTONDOWN 0x0204
+#define WM_RBUTTONUP 0x0205
+#define WM_RBUTTONDBLCLK 0x0206
+#define WM_MBUTTONDOWN 0x0207
+#define WM_MBUTTONUP 0x0208
+#define WM_MBUTTONDBLCLK 0x0209
+
+/* Mouse input message range */
+#define WM_MOUSEFIRST 0x0200
+#define WM_MOUSELAST 0x0209
+
+/* Mouse message wParam key states */
+#ifndef NOKEYSTATES
+#define MK_LBUTTON 0x0001
+#define MK_RBUTTON 0x0002
+#define MK_SHIFT 0x0004
+#define MK_CONTROL 0x0008
+#define MK_MBUTTON 0x0010
+#endif /* NOKEYSTATES */
+
+/* Non-client mouse messages */
+#define WM_NCMOUSEMOVE 0x00A0
+#define WM_NCLBUTTONDOWN 0x00A1
+#define WM_NCLBUTTONUP 0x00A2
+#define WM_NCLBUTTONDBLCLK 0x00A3
+#define WM_NCRBUTTONDOWN 0x00A4
+#define WM_NCRBUTTONUP 0x00A5
+#define WM_NCRBUTTONDBLCLK 0x00A6
+#define WM_NCMBUTTONDOWN 0x00A7
+#define WM_NCMBUTTONUP 0x00A8
+#define WM_NCMBUTTONDBLCLK 0x00A9
+
+/* Mouse click activation support */
+#define WM_MOUSEACTIVATE 0x0021
+
+/* WM_MOUSEACTIVATE return codes */
+#define MA_ACTIVATE 1
+#define MA_ACTIVATEANDEAT 2
+#define MA_NOACTIVATE 3
+#if (WINVER >= 0x030a)
+#define MA_NOACTIVATEANDEAT 4
+#endif /* WINVER >= 0x030a */
+
+/* SetWindowsHook() mouse hook */
+#ifndef NOWH
+#define WH_MOUSE 7
+
+typedef struct tagMOUSEHOOKSTRUCT
+{
+ POINT pt;
+ HWND hwnd;
+ UINT wHitTestCode;
+ DWORD dwExtraInfo;
+} MOUSEHOOKSTRUCT;
+typedef MOUSEHOOKSTRUCT FAR* LPMOUSEHOOKSTRUCT;
+#endif /* NOWH */
+
+/****** Mode control ********************************************************/
+
+#define WM_CANCELMODE 0x001F
+
+/****** System modal window support *****************************************/
+
+HWND WINAPI GetSysModalWindow(void);
+HWND WINAPI SetSysModalWindow(HWND);
+
+/****** Timer support *******************************************************/
+
+#ifdef STRICT
+typedef void (CALLBACK* TIMERPROC)(HWND, UINT, UINT, DWORD);
+#else
+typedef FARPROC TIMERPROC;
+#endif
+
+UINT WINAPI SetTimer(HWND, UINT, UINT, TIMERPROC);
+
+BOOL WINAPI KillTimer(HWND, UINT);
+
+#define WM_TIMER 0x0113
+
+/****** Accelerator support *************************************************/
+
+DECLARE_HANDLE(HACCEL);
+
+HACCEL WINAPI LoadAccelerators(HINSTANCE, LPCSTR);
+
+#ifndef NOMSG
+int WINAPI TranslateAccelerator(HWND, HACCEL, MSG FAR*);
+#endif
+
+/****** Menu support ********************************************************/
+
+#ifndef NOMENUS
+
+/* Menu template header */
+typedef struct
+{
+ UINT versionNumber;
+ UINT offset;
+} MENUITEMTEMPLATEHEADER;
+
+/* Menu template item struct */
+typedef struct
+{
+ UINT mtOption;
+ UINT mtID;
+ char mtString[1];
+} MENUITEMTEMPLATE;
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI IsMenu(HMENU);
+#endif /* WINVER >= 0x030a */
+
+HMENU WINAPI CreateMenu(void);
+HMENU WINAPI CreatePopupMenu(void);
+HMENU WINAPI LoadMenu(HINSTANCE, LPCSTR);
+HMENU WINAPI LoadMenuIndirect(const void FAR*);
+
+BOOL WINAPI DestroyMenu(HMENU);
+
+HMENU WINAPI GetMenu(HWND);
+BOOL WINAPI SetMenu(HWND, HMENU);
+
+HMENU WINAPI GetSystemMenu(HWND, BOOL);
+
+void WINAPI DrawMenuBar(HWND);
+
+BOOL WINAPI HiliteMenuItem(HWND, HMENU, UINT, UINT);
+
+BOOL WINAPI InsertMenu(HMENU, UINT, UINT, UINT, LPCSTR);
+BOOL WINAPI AppendMenu(HMENU, UINT, UINT, LPCSTR);
+BOOL WINAPI ModifyMenu(HMENU, UINT, UINT, UINT, LPCSTR);
+BOOL WINAPI RemoveMenu(HMENU, UINT, UINT);
+BOOL WINAPI DeleteMenu(HMENU, UINT, UINT);
+
+BOOL WINAPI ChangeMenu(HMENU, UINT, LPCSTR, UINT, UINT);
+
+#define MF_INSERT 0x0000
+#define MF_CHANGE 0x0080
+#define MF_APPEND 0x0100
+#define MF_DELETE 0x0200
+#define MF_REMOVE 0x1000
+
+/* Menu flags for Add/Check/EnableMenuItem() */
+#define MF_BYCOMMAND 0x0000
+#define MF_BYPOSITION 0x0400
+
+#define MF_SEPARATOR 0x0800
+
+#define MF_ENABLED 0x0000
+#define MF_GRAYED 0x0001
+#define MF_DISABLED 0x0002
+
+#define MF_UNCHECKED 0x0000
+#define MF_CHECKED 0x0008
+#define MF_USECHECKBITMAPS 0x0200
+
+#define MF_STRING 0x0000
+#define MF_BITMAP 0x0004
+#define MF_OWNERDRAW 0x0100
+
+#define MF_POPUP 0x0010
+#define MF_MENUBARBREAK 0x0020
+#define MF_MENUBREAK 0x0040
+
+#define MF_UNHILITE 0x0000
+#define MF_HILITE 0x0080
+
+#define MF_SYSMENU 0x2000
+#define MF_HELP 0x4000
+#define MF_MOUSESELECT 0x8000
+
+
+#define MF_END 0x0080 /* Only valid in menu resource templates */
+
+BOOL WINAPI EnableMenuItem(HMENU, UINT, UINT);
+BOOL WINAPI CheckMenuItem(HMENU, UINT, UINT);
+
+HMENU WINAPI GetSubMenu(HMENU, int);
+
+int WINAPI GetMenuItemCount(HMENU);
+UINT WINAPI GetMenuItemID(HMENU, int);
+
+int WINAPI GetMenuString(HMENU, UINT, LPSTR, int, UINT);
+UINT WINAPI GetMenuState(HMENU, UINT, UINT);
+
+BOOL WINAPI SetMenuItemBitmaps(HMENU, UINT, UINT, HBITMAP, HBITMAP);
+DWORD WINAPI GetMenuCheckMarkDimensions(void);
+
+BOOL WINAPI TrackPopupMenu(HMENU, UINT, int, int, int, HWND, const RECT FAR*);
+
+/* Flags for TrackPopupMenu */
+#define TPM_LEFTBUTTON 0x0000
+#if (WINVER >= 0x030a)
+#define TPM_RIGHTBUTTON 0x0002
+#define TPM_LEFTALIGN 0x0000
+#define TPM_CENTERALIGN 0x0004
+#define TPM_RIGHTALIGN 0x0008
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOMENUS */
+
+/* Menu messages */
+#define WM_INITMENU 0x0116
+#define WM_INITMENUPOPUP 0x0117
+
+#ifndef NOMENUS
+
+#define WM_MENUSELECT 0x011F
+#define WM_MENUCHAR 0x0120
+
+#endif /* NOMENUS */
+
+/* Menu and control command messages */
+#define WM_COMMAND 0x0111
+
+/****** Scroll bar support **************************************************/
+
+#ifndef NOSCROLL
+
+#define WM_HSCROLL 0x0114
+#define WM_VSCROLL 0x0115
+
+/* WM_H/VSCROLL commands */
+#define SB_LINEUP 0
+#define SB_LINELEFT 0
+#define SB_LINEDOWN 1
+#define SB_LINERIGHT 1
+#define SB_PAGEUP 2
+#define SB_PAGELEFT 2
+#define SB_PAGEDOWN 3
+#define SB_PAGERIGHT 3
+#define SB_THUMBPOSITION 4
+#define SB_THUMBTRACK 5
+#define SB_TOP 6
+#define SB_LEFT 6
+#define SB_BOTTOM 7
+#define SB_RIGHT 7
+#define SB_ENDSCROLL 8
+
+/* Scroll bar selection constants */
+#define SB_HORZ 0
+#define SB_VERT 1
+#define SB_CTL 2
+#define SB_BOTH 3
+
+int WINAPI SetScrollPos(HWND, int, int, BOOL);
+int WINAPI GetScrollPos(HWND, int);
+void WINAPI SetScrollRange(HWND, int, int, int, BOOL);
+void WINAPI GetScrollRange(HWND, int, int FAR*, int FAR*);
+void WINAPI ShowScrollBar(HWND, int, BOOL);
+BOOL WINAPI EnableScrollBar(HWND, int, UINT);
+
+/* EnableScrollBar() flags */
+#define ESB_ENABLE_BOTH 0x0000
+#define ESB_DISABLE_BOTH 0x0003
+
+#define ESB_DISABLE_LEFT 0x0001
+#define ESB_DISABLE_RIGHT 0x0002
+
+#define ESB_DISABLE_UP 0x0001
+#define ESB_DISABLE_DOWN 0x0002
+
+#define ESB_DISABLE_LTUP ESB_DISABLE_LEFT
+#define ESB_DISABLE_RTDN ESB_DISABLE_RIGHT
+
+#endif /* NOSCROLL */
+
+/******* Clipboard manager **************************************************/
+
+#ifndef NOCLIPBOARD
+
+/* Predefined Clipboard Formats */
+#define CF_TEXT 1
+#define CF_BITMAP 2
+#define CF_METAFILEPICT 3
+#define CF_SYLK 4
+#define CF_DIF 5
+#define CF_TIFF 6
+#define CF_OEMTEXT 7
+#define CF_DIB 8
+#define CF_PALETTE 9
+#define CF_PENDATA 10
+#define CF_RIFF 11
+#define CF_WAVE 12
+
+#define CF_OWNERDISPLAY 0x0080
+#define CF_DSPTEXT 0x0081
+#define CF_DSPBITMAP 0x0082
+#define CF_DSPMETAFILEPICT 0x0083
+
+/* "Private" formats don't get GlobalFree()'d */
+#define CF_PRIVATEFIRST 0x0200
+#define CF_PRIVATELAST 0x02FF
+
+/* "GDIOBJ" formats do get DeleteObject()'d */
+#define CF_GDIOBJFIRST 0x0300
+#define CF_GDIOBJLAST 0x03FF
+
+/* Clipboard Manager Functions */
+BOOL WINAPI OpenClipboard(HWND);
+BOOL WINAPI CloseClipboard(void);
+BOOL WINAPI EmptyClipboard(void);
+
+#if (WINVER >= 0x030a)
+HWND WINAPI GetOpenClipboardWindow(void);
+#endif /* WINVER >= 0x030a */
+
+HWND WINAPI GetClipboardOwner(void);
+
+HWND WINAPI SetClipboardViewer(HWND);
+HWND WINAPI GetClipboardViewer(void);
+
+HANDLE WINAPI SetClipboardData(UINT, HANDLE);
+HANDLE WINAPI GetClipboardData(UINT);
+
+BOOL WINAPI IsClipboardFormatAvailable(UINT);
+int WINAPI GetPriorityClipboardFormat(UINT FAR*, int);
+
+UINT WINAPI RegisterClipboardFormat(LPCSTR);
+int WINAPI CountClipboardFormats(void);
+UINT WINAPI EnumClipboardFormats(UINT);
+int WINAPI GetClipboardFormatName(UINT, LPSTR, int);
+
+BOOL WINAPI ChangeClipboardChain(HWND, HWND);
+
+/* Clipboard command messages */
+#define WM_CUT 0x0300
+#define WM_COPY 0x0301
+#define WM_PASTE 0x0302
+#define WM_CLEAR 0x0303
+#define WM_UNDO 0x0304
+
+/* Clipboard owner messages */
+#define WM_RENDERFORMAT 0x0305
+#define WM_RENDERALLFORMATS 0x0306
+#define WM_DESTROYCLIPBOARD 0x0307
+
+/* Clipboard viewer messages */
+#define WM_DRAWCLIPBOARD 0x0308
+#define WM_PAINTCLIPBOARD 0x0309
+#define WM_SIZECLIPBOARD 0x030B
+#define WM_VSCROLLCLIPBOARD 0x030A
+#define WM_HSCROLLCLIPBOARD 0x030E
+#define WM_ASKCBFORMATNAME 0x030C
+#define WM_CHANGECBCHAIN 0x030D
+
+#endif /* NOCLIPBOARD */
+
+/****** Mouse cursor support *************************************************/
+
+HCURSOR WINAPI LoadCursor(HINSTANCE, LPCSTR);
+HCURSOR WINAPI CreateCursor(HINSTANCE, int, int, int, int, const void FAR*, const void FAR*);
+BOOL WINAPI DestroyCursor(HCURSOR);
+
+#if (WINVER >= 0x030a)
+HCURSOR WINAPI CopyCursor(HINSTANCE, HCURSOR);
+#endif /* WINVER >= 0x030a */
+
+int WINAPI ShowCursor(BOOL);
+
+void WINAPI SetCursorPos(int, int);
+void WINAPI GetCursorPos(POINT FAR*);
+
+HCURSOR WINAPI SetCursor(HCURSOR);
+
+#if (WINVER >= 0x030a)
+HCURSOR WINAPI GetCursor(void);
+#endif /* WINVER >= 0x030a */
+
+void WINAPI ClipCursor(const RECT FAR*);
+#if (WINVER >= 0x030a)
+void WINAPI GetClipCursor(RECT FAR*);
+#endif /* WINVER >= 0x030a */
+
+/* Standard cursor resource IDs */
+#define IDC_ARROW MAKEINTRESOURCE(32512)
+#define IDC_IBEAM MAKEINTRESOURCE(32513)
+#define IDC_WAIT MAKEINTRESOURCE(32514)
+#define IDC_CROSS MAKEINTRESOURCE(32515)
+#define IDC_UPARROW MAKEINTRESOURCE(32516)
+#define IDC_SIZE MAKEINTRESOURCE(32640)
+#define IDC_ICON MAKEINTRESOURCE(32641)
+#define IDC_SIZENWSE MAKEINTRESOURCE(32642)
+#define IDC_SIZENESW MAKEINTRESOURCE(32643)
+#define IDC_SIZEWE MAKEINTRESOURCE(32644)
+#define IDC_SIZENS MAKEINTRESOURCE(32645)
+
+#define WM_SETCURSOR 0x0020
+
+/****** Icon support *********************************************************/
+
+HICON WINAPI LoadIcon(HINSTANCE, LPCSTR);
+HICON WINAPI CreateIcon(HINSTANCE, int, int, BYTE, BYTE, const void FAR*, const void FAR*);
+BOOL WINAPI DestroyIcon(HICON);
+
+#if (WINVER >= 0x030a)
+HICON WINAPI CopyIcon(HINSTANCE, HICON);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI DrawIcon(HDC, int, int, HICON);
+
+#ifndef NOICONS
+
+/* Standard icon resource IDs */
+#define IDI_APPLICATION MAKEINTRESOURCE(32512)
+#define IDI_HAND MAKEINTRESOURCE(32513)
+#define IDI_QUESTION MAKEINTRESOURCE(32514)
+#define IDI_EXCLAMATION MAKEINTRESOURCE(32515)
+#define IDI_ASTERISK MAKEINTRESOURCE(32516)
+
+#endif /* NOICONS */
+
+/****** Message Box support *************************************************/
+
+#ifndef NOMB
+
+int WINAPI MessageBox(HWND, LPCSTR, LPCSTR, UINT);
+void WINAPI MessageBeep(UINT);
+
+#define MB_OK 0x0000
+#define MB_OKCANCEL 0x0001
+#define MB_ABORTRETRYIGNORE 0x0002
+#define MB_YESNOCANCEL 0x0003
+#define MB_YESNO 0x0004
+#define MB_RETRYCANCEL 0x0005
+#define MB_TYPEMASK 0x000F
+
+#define MB_ICONHAND 0x0010
+#define MB_ICONQUESTION 0x0020
+#define MB_ICONEXCLAMATION 0x0030
+#define MB_ICONASTERISK 0x0040
+#define MB_ICONMASK 0x00F0
+
+#define MB_ICONINFORMATION MB_ICONASTERISK
+#define MB_ICONSTOP MB_ICONHAND
+
+#define MB_DEFBUTTON1 0x0000
+#define MB_DEFBUTTON2 0x0100
+#define MB_DEFBUTTON3 0x0200
+#define MB_DEFMASK 0x0F00
+
+#define MB_APPLMODAL 0x0000
+#define MB_SYSTEMMODAL 0x1000
+#define MB_TASKMODAL 0x2000
+
+#define MB_NOFOCUS 0x8000
+
+
+
+#endif /* NOMB */
+
+/****** Caret support ********************************************************/
+
+void WINAPI CreateCaret(HWND, HBITMAP, int, int);
+void WINAPI DestroyCaret(void);
+
+void WINAPI SetCaretPos(int, int);
+void WINAPI GetCaretPos(POINT FAR*);
+
+void WINAPI HideCaret(HWND);
+void WINAPI ShowCaret(HWND);
+
+UINT WINAPI GetCaretBlinkTime(void);
+void WINAPI SetCaretBlinkTime(UINT);
+
+/****** WM_SYSCOMMAND support ***********************************************/
+
+#define WM_SYSCOMMAND 0x0112
+
+#ifndef NOSYSCOMMANDS
+
+/* System Menu Command Values */
+#define SC_SIZE 0xF000
+#define SC_MOVE 0xF010
+#define SC_MINIMIZE 0xF020
+#define SC_MAXIMIZE 0xF030
+#define SC_NEXTWINDOW 0xF040
+#define SC_PREVWINDOW 0xF050
+#define SC_CLOSE 0xF060
+#define SC_VSCROLL 0xF070
+#define SC_HSCROLL 0xF080
+#define SC_MOUSEMENU 0xF090
+#define SC_KEYMENU 0xF100
+#define SC_ARRANGE 0xF110
+#define SC_RESTORE 0xF120
+#define SC_TASKLIST 0xF130
+#define SC_SCREENSAVE 0xF140
+#define SC_HOTKEY 0xF150
+
+/* Obsolete names */
+#define SC_ICON SC_MINIMIZE
+#define SC_ZOOM SC_MAXIMIZE
+
+
+#endif /* NOSYSCOMMANDS */
+
+/****** MDI Support *********************************************************/
+
+#ifndef NOMDI
+
+/* CreateWindow lpParams structure for creating MDI client */
+typedef struct tagCLIENTCREATESTRUCT
+{
+ HMENU hWindowMenu;
+ UINT idFirstChild;
+} CLIENTCREATESTRUCT;
+typedef CLIENTCREATESTRUCT FAR* LPCLIENTCREATESTRUCT;
+
+/* MDI client style bits */
+#if (WINVER >= 0x030a)
+#define MDIS_ALLCHILDSTYLES 0x0001
+#endif /* WINVER >= 0x030a */
+
+/* MDI messages */
+#define WM_MDICREATE 0x0220
+#define WM_MDIDESTROY 0x0221
+#define WM_MDIACTIVATE 0x0222
+#define WM_MDIRESTORE 0x0223
+#define WM_MDINEXT 0x0224
+#define WM_MDIMAXIMIZE 0x0225
+#define WM_MDITILE 0x0226
+#define WM_MDICASCADE 0x0227
+#define WM_MDIICONARRANGE 0x0228
+#define WM_MDIGETACTIVE 0x0229
+#define WM_MDISETMENU 0x0230
+
+/* WM_MDICREATE message structure */
+typedef struct tagMDICREATESTRUCT
+{
+ LPCSTR szClass;
+ LPCSTR szTitle;
+ HINSTANCE hOwner;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ DWORD style;
+ LPARAM lParam;
+} MDICREATESTRUCT;
+typedef MDICREATESTRUCT FAR* LPMDICREATESTRUCT;
+
+#if (WINVER >= 0x030a)
+/* wParam values for WM_MDITILE and WM_MDICASCADE messages. */
+#define MDITILE_VERTICAL 0x0000
+#define MDITILE_HORIZONTAL 0x0001
+#define MDITILE_SKIPDISABLED 0x0002
+#endif /* WINVER >= 0x030a */
+
+#define WM_CHILDACTIVATE 0x0022
+
+LRESULT WINAPI DefFrameProc(HWND, HWND, UINT, WPARAM, LPARAM);
+LRESULT WINAPI DefMDIChildProc(HWND, UINT, WPARAM, LPARAM);
+
+#ifndef NOMSG
+BOOL WINAPI TranslateMDISysAccel(HWND, MSG FAR*);
+#endif
+
+UINT WINAPI ArrangeIconicWindows(HWND);
+
+#endif /* NOMDI */
+
+/****** Dialog and Control Management ***************************************/
+
+#ifndef NOCTLMGR
+
+/* Dialog window class */
+#define WC_DIALOG (MAKEINTATOM(0x8002))
+
+/* cbWndExtra bytes needed by dialog manager for dialog classes */
+#define DLGWINDOWEXTRA 30
+
+/* Dialog styles */
+#define DS_ABSALIGN 0x01L
+#define DS_SYSMODAL 0x02L
+#define DS_LOCALEDIT 0x20L
+#define DS_SETFONT 0x40L
+#define DS_MODALFRAME 0x80L
+#define DS_NOIDLEMSG 0x100L
+
+/* Dialog messages */
+#define DM_GETDEFID (WM_USER+0)
+#define DM_SETDEFID (WM_USER+1)
+
+/* Returned in HIWORD() of DM_GETDEFID result if msg is supported */
+#define DC_HASDEFID 0x534B
+
+#endif /* NOCTLMGR */
+
+/* Dialog notification messages */
+#define WM_INITDIALOG 0x0110
+#define WM_NEXTDLGCTL 0x0028
+
+#define WM_PARENTNOTIFY 0x0210
+
+#define WM_ENTERIDLE 0x0121
+
+
+#ifndef NOCTLMGR
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
+#else
+typedef FARPROC DLGPROC;
+#endif
+
+/* Get/SetWindowWord/Long offsets for use with WC_DIALOG windows */
+#define DWL_MSGRESULT 0
+#define DWL_DLGPROC 4
+#define DWL_USER 8
+
+#ifndef NOMSG
+BOOL WINAPI IsDialogMessage(HWND, MSG FAR*);
+#endif
+
+LRESULT WINAPI DefDlgProc(HWND, UINT, WPARAM, LPARAM);
+
+HWND WINAPI CreateDialog(HINSTANCE, LPCSTR, HWND, DLGPROC);
+HWND WINAPI CreateDialogIndirect(HINSTANCE, const void FAR*, HWND, DLGPROC);
+HWND WINAPI CreateDialogParam(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM);
+HWND WINAPI CreateDialogIndirectParam(HINSTANCE, const void FAR*, HWND, DLGPROC, LPARAM);
+
+int WINAPI DialogBox(HINSTANCE, LPCSTR, HWND, DLGPROC);
+int WINAPI DialogBoxIndirect(HINSTANCE, HGLOBAL, HWND, DLGPROC);
+int WINAPI DialogBoxParam(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM);
+int WINAPI DialogBoxIndirectParam(HINSTANCE, HGLOBAL, HWND, DLGPROC, LPARAM);
+
+void WINAPI EndDialog(HWND, int);
+
+int WINAPI GetDlgCtrlID(HWND);
+HWND WINAPI GetDlgItem(HWND, int);
+LRESULT WINAPI SendDlgItemMessage(HWND, int, UINT, WPARAM, LPARAM);
+
+void WINAPI SetDlgItemInt(HWND, int, UINT, BOOL);
+UINT WINAPI GetDlgItemInt(HWND, int, BOOL FAR* , BOOL);
+
+void WINAPI SetDlgItemText(HWND, int, LPCSTR);
+int WINAPI GetDlgItemText(HWND, int, LPSTR, int);
+
+void WINAPI CheckDlgButton(HWND, int, UINT);
+void WINAPI CheckRadioButton(HWND, int, int, int);
+UINT WINAPI IsDlgButtonChecked(HWND, int);
+
+HWND WINAPI GetNextDlgGroupItem(HWND, HWND, BOOL);
+HWND WINAPI GetNextDlgTabItem(HWND, HWND, BOOL);
+
+void WINAPI MapDialogRect(HWND, RECT FAR*);
+DWORD WINAPI GetDialogBaseUnits(void);
+
+#define WM_GETDLGCODE 0x0087
+
+/* dialog codes */
+#define DLGC_WANTARROWS 0x0001
+#define DLGC_WANTTAB 0x0002
+#define DLGC_WANTALLKEYS 0x0004
+#define DLGC_WANTMESSAGE 0x0004
+#define DLGC_HASSETSEL 0x0008
+#define DLGC_DEFPUSHBUTTON 0x0010
+#define DLGC_UNDEFPUSHBUTTON 0x0020
+#define DLGC_RADIOBUTTON 0x0040
+#define DLGC_WANTCHARS 0x0080
+#define DLGC_STATIC 0x0100
+#define DLGC_BUTTON 0x2000
+
+#define WM_CTLCOLOR 0x0019
+
+/* WM_CTLCOLOR control IDs */
+#define CTLCOLOR_MSGBOX 0
+#define CTLCOLOR_EDIT 1
+#define CTLCOLOR_LISTBOX 2
+#define CTLCOLOR_BTN 3
+#define CTLCOLOR_DLG 4
+#define CTLCOLOR_SCROLLBAR 5
+#define CTLCOLOR_STATIC 6
+
+#define WM_SETFONT 0x0030
+#define WM_GETFONT 0x0031
+
+#endif /* NOCTLMGR */
+
+/* Standard dialog button IDs */
+#define IDOK 1
+#define IDCANCEL 2
+#define IDABORT 3
+#define IDRETRY 4
+#define IDIGNORE 5
+#define IDYES 6
+#define IDNO 7
+
+/****** Owner draw control support ******************************************/
+
+/* Owner draw control types */
+#define ODT_MENU 1
+#define ODT_LISTBOX 2
+#define ODT_COMBOBOX 3
+#define ODT_BUTTON 4
+
+/* Owner draw actions */
+#define ODA_DRAWENTIRE 0x0001
+#define ODA_SELECT 0x0002
+#define ODA_FOCUS 0x0004
+
+/* Owner draw state */
+#define ODS_SELECTED 0x0001
+#define ODS_GRAYED 0x0002
+#define ODS_DISABLED 0x0004
+#define ODS_CHECKED 0x0008
+#define ODS_FOCUS 0x0010
+
+#define WM_DRAWITEM 0x002B
+
+typedef struct tagDRAWITEMSTRUCT
+{
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ UINT itemAction;
+ UINT itemState;
+ HWND hwndItem;
+ HDC hDC;
+ RECT rcItem;
+ DWORD itemData;
+} DRAWITEMSTRUCT;
+typedef DRAWITEMSTRUCT NEAR* PDRAWITEMSTRUCT;
+typedef DRAWITEMSTRUCT FAR* LPDRAWITEMSTRUCT;
+
+#define WM_MEASUREITEM 0x002C
+
+typedef struct tagMEASUREITEMSTRUCT
+{
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ UINT itemWidth;
+ UINT itemHeight;
+ DWORD itemData;
+} MEASUREITEMSTRUCT;
+typedef MEASUREITEMSTRUCT NEAR* PMEASUREITEMSTRUCT;
+typedef MEASUREITEMSTRUCT FAR* LPMEASUREITEMSTRUCT;
+
+#define WM_DELETEITEM 0x002D
+
+typedef struct tagDELETEITEMSTRUCT
+{
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ HWND hwndItem;
+ DWORD itemData;
+} DELETEITEMSTRUCT;
+typedef DELETEITEMSTRUCT NEAR* PDELETEITEMSTRUCT;
+typedef DELETEITEMSTRUCT FAR* LPDELETEITEMSTRUCT;
+
+#define WM_COMPAREITEM 0x0039
+
+typedef struct tagCOMPAREITEMSTRUCT
+{
+ UINT CtlType;
+ UINT CtlID;
+ HWND hwndItem;
+ UINT itemID1;
+ DWORD itemData1;
+ UINT itemID2;
+ DWORD itemData2;
+} COMPAREITEMSTRUCT;
+typedef COMPAREITEMSTRUCT NEAR* PCOMPAREITEMSTRUCT;
+typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT;
+
+/****** Static control ******************************************************/
+
+#ifndef NOCTLMGR
+
+/* Static Control Styles */
+#define SS_LEFT 0x00000000L
+#define SS_CENTER 0x00000001L
+#define SS_RIGHT 0x00000002L
+#define SS_ICON 0x00000003L
+#define SS_BLACKRECT 0x00000004L
+#define SS_GRAYRECT 0x00000005L
+#define SS_WHITERECT 0x00000006L
+#define SS_BLACKFRAME 0x00000007L
+#define SS_GRAYFRAME 0x00000008L
+#define SS_WHITEFRAME 0x00000009L
+#define SS_SIMPLE 0x0000000BL
+#define SS_LEFTNOWORDWRAP 0x0000000CL
+#define SS_NOPREFIX 0x00000080L
+
+#if (WINVER >= 0x030a)
+#ifndef NOWINMESSAGES
+/* Static Control Mesages */
+#define STM_SETICON (WM_USER+0)
+#define STM_GETICON (WM_USER+1)
+#endif /* NOWINMESSAGES */
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOCTLMGR */
+
+/****** Button control *****************************************************/
+
+#ifndef NOCTLMGR
+
+/* Button Control Styles */
+#define BS_PUSHBUTTON 0x00000000L
+#define BS_DEFPUSHBUTTON 0x00000001L
+#define BS_CHECKBOX 0x00000002L
+#define BS_AUTOCHECKBOX 0x00000003L
+#define BS_RADIOBUTTON 0x00000004L
+#define BS_3STATE 0x00000005L
+#define BS_AUTO3STATE 0x00000006L
+#define BS_GROUPBOX 0x00000007L
+#define BS_USERBUTTON 0x00000008L
+#define BS_AUTORADIOBUTTON 0x00000009L
+#define BS_OWNERDRAW 0x0000000BL
+#define BS_LEFTTEXT 0x00000020L
+
+/* Button Control Messages */
+#define BM_GETCHECK (WM_USER+0)
+#define BM_SETCHECK (WM_USER+1)
+#define BM_GETSTATE (WM_USER+2)
+#define BM_SETSTATE (WM_USER+3)
+#define BM_SETSTYLE (WM_USER+4)
+
+/* User Button Notification Codes */
+#define BN_CLICKED 0
+#define BN_PAINT 1
+#define BN_HILITE 2
+#define BN_UNHILITE 3
+#define BN_DISABLE 4
+#define BN_DOUBLECLICKED 5
+
+#endif /* NOCTLMGR */
+
+/****** Edit control *******************************************************/
+
+#ifndef NOCTLMGR
+
+/* Edit control styles */
+#ifndef NOWINSTYLES
+#define ES_LEFT 0x00000000L
+#define ES_CENTER 0x00000001L
+#define ES_RIGHT 0x00000002L
+#define ES_MULTILINE 0x00000004L
+#define ES_UPPERCASE 0x00000008L
+#define ES_LOWERCASE 0x00000010L
+#define ES_PASSWORD 0x00000020L
+#define ES_AUTOVSCROLL 0x00000040L
+#define ES_AUTOHSCROLL 0x00000080L
+#define ES_NOHIDESEL 0x00000100L
+#define ES_OEMCONVERT 0x00000400L
+#if (WINVER >= 0x030a)
+#define ES_READONLY 0x00000800L
+#define ES_WANTRETURN 0x00001000L
+#endif /* WINVER >= 0x030a */
+#endif /* NOWINSTYLES */
+
+/* Edit control messages */
+#ifndef NOWINMESSAGES
+#define EM_GETSEL (WM_USER+0)
+#define EM_SETSEL (WM_USER+1)
+#define EM_GETRECT (WM_USER+2)
+#define EM_SETRECT (WM_USER+3)
+#define EM_SETRECTNP (WM_USER+4)
+#define EM_LINESCROLL (WM_USER+6)
+#define EM_GETMODIFY (WM_USER+8)
+#define EM_SETMODIFY (WM_USER+9)
+#define EM_GETLINECOUNT (WM_USER+10)
+#define EM_LINEINDEX (WM_USER+11)
+#define EM_SETHANDLE (WM_USER+12)
+#define EM_GETHANDLE (WM_USER+13)
+#define EM_LINELENGTH (WM_USER+17)
+#define EM_REPLACESEL (WM_USER+18)
+#define EM_SETFONT (WM_USER+19) /* NOT IMPLEMENTED: use WM_SETFONT */
+#define EM_GETLINE (WM_USER+20)
+#define EM_LIMITTEXT (WM_USER+21)
+#define EM_CANUNDO (WM_USER+22)
+#define EM_UNDO (WM_USER+23)
+#define EM_FMTLINES (WM_USER+24)
+#define EM_LINEFROMCHAR (WM_USER+25)
+#define EM_SETWORDBREAK (WM_USER+26) /* NOT IMPLEMENTED: use EM_SETWORDBREAK */
+#define EM_SETTABSTOPS (WM_USER+27)
+#define EM_SETPASSWORDCHAR (WM_USER+28)
+#define EM_EMPTYUNDOBUFFER (WM_USER+29)
+#if (WINVER >= 0x030a)
+#define EM_GETFIRSTVISIBLELINE (WM_USER+30)
+#define EM_SETREADONLY (WM_USER+31)
+#define EM_SETWORDBREAKPROC (WM_USER+32)
+#define EM_GETWORDBREAKPROC (WM_USER+33)
+#define EM_GETPASSWORDCHAR (WM_USER+34)
+#endif /* WINVER >= 0x030a */
+#endif /* NOWINMESSAGES */
+
+#if (WINVER >= 0x030a)
+typedef int (CALLBACK* EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, int cch, int code);
+
+/* EDITWORDBREAKPROC code values */
+#define WB_LEFT 0
+#define WB_RIGHT 1
+#define WB_ISDELIMITER 2
+#endif /* WINVER >= 0x030a */
+
+/* Edit control notification codes */
+#define EN_SETFOCUS 0x0100
+#define EN_KILLFOCUS 0x0200
+#define EN_CHANGE 0x0300
+#define EN_UPDATE 0x0400
+#define EN_ERRSPACE 0x0500
+#define EN_MAXTEXT 0x0501
+#define EN_HSCROLL 0x0601
+#define EN_VSCROLL 0x0602
+
+#endif /* NOCTLMGR */
+
+/****** Scroll bar control *************************************************/
+/* Also see scrolling support */
+
+#ifndef NOCTLMGR
+
+#ifndef NOWINSTYLES
+
+/* Scroll bar styles */
+#define SBS_HORZ 0x0000L
+#define SBS_VERT 0x0001L
+#define SBS_TOPALIGN 0x0002L
+#define SBS_LEFTALIGN 0x0002L
+#define SBS_BOTTOMALIGN 0x0004L
+#define SBS_RIGHTALIGN 0x0004L
+#define SBS_SIZEBOXTOPLEFTALIGN 0x0002L
+#define SBS_SIZEBOXBOTTOMRIGHTALIGN 0x0004L
+#define SBS_SIZEBOX 0x0008L
+
+#endif /* NOWINSTYLES */
+
+#endif /* NOCTLMGR */
+
+/****** Listbox control ****************************************************/
+
+#ifndef NOCTLMGR
+
+/* Listbox styles */
+#ifndef NOWINSTYLES
+#define LBS_NOTIFY 0x0001L
+#define LBS_SORT 0x0002L
+#define LBS_NOREDRAW 0x0004L
+#define LBS_MULTIPLESEL 0x0008L
+#define LBS_OWNERDRAWFIXED 0x0010L
+#define LBS_OWNERDRAWVARIABLE 0x0020L
+#define LBS_HASSTRINGS 0x0040L
+#define LBS_USETABSTOPS 0x0080L
+#define LBS_NOINTEGRALHEIGHT 0x0100L
+#define LBS_MULTICOLUMN 0x0200L
+#define LBS_WANTKEYBOARDINPUT 0x0400L
+#define LBS_EXTENDEDSEL 0x0800L
+#if (WINVER >= 0x030a)
+#define LBS_DISABLENOSCROLL 0x1000L
+#endif /* WINVER >= 0x030a */
+#define LBS_STANDARD (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)
+#endif /* NOWINSTYLES */
+
+/* Listbox messages */
+#ifndef NOWINMESSAGES
+#define LB_ADDSTRING (WM_USER+1)
+#define LB_INSERTSTRING (WM_USER+2)
+#define LB_DELETESTRING (WM_USER+3)
+#define LB_RESETCONTENT (WM_USER+5)
+#define LB_SETSEL (WM_USER+6)
+#define LB_SETCURSEL (WM_USER+7)
+#define LB_GETSEL (WM_USER+8)
+#define LB_GETCURSEL (WM_USER+9)
+#define LB_GETTEXT (WM_USER+10)
+#define LB_GETTEXTLEN (WM_USER+11)
+#define LB_GETCOUNT (WM_USER+12)
+#define LB_SELECTSTRING (WM_USER+13)
+#define LB_DIR (WM_USER+14)
+#define LB_GETTOPINDEX (WM_USER+15)
+#define LB_FINDSTRING (WM_USER+16)
+#define LB_GETSELCOUNT (WM_USER+17)
+#define LB_GETSELITEMS (WM_USER+18)
+#define LB_SETTABSTOPS (WM_USER+19)
+#define LB_GETHORIZONTALEXTENT (WM_USER+20)
+#define LB_SETHORIZONTALEXTENT (WM_USER+21)
+#define LB_SETCOLUMNWIDTH (WM_USER+22)
+#define LB_SETTOPINDEX (WM_USER+24)
+#define LB_GETITEMRECT (WM_USER+25)
+#define LB_GETITEMDATA (WM_USER+26)
+#define LB_SETITEMDATA (WM_USER+27)
+#define LB_SELITEMRANGE (WM_USER+28)
+#define LB_SETCARETINDEX (WM_USER+31)
+#define LB_GETCARETINDEX (WM_USER+32)
+
+#if (WINVER >= 0x030a)
+#define LB_SETITEMHEIGHT (WM_USER+33)
+#define LB_GETITEMHEIGHT (WM_USER+34)
+#define LB_FINDSTRINGEXACT (WM_USER+35)
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOWINMESSAGES */
+
+/* Listbox notification codes */
+#define LBN_ERRSPACE (-2)
+#define LBN_SELCHANGE 1
+#define LBN_DBLCLK 2
+#define LBN_SELCANCEL 3
+#define LBN_SETFOCUS 4
+#define LBN_KILLFOCUS 5
+
+/* Listbox notification messages */
+#define WM_VKEYTOITEM 0x002E
+#define WM_CHARTOITEM 0x002F
+
+/* Listbox message return values */
+#define LB_OKAY 0
+#define LB_ERR (-1)
+#define LB_ERRSPACE (-2)
+
+#define LB_CTLCODE 0L
+
+/****** Dialog directory support ********************************************/
+
+int WINAPI DlgDirList(HWND, LPSTR, int, int, UINT);
+BOOL WINAPI DlgDirSelect(HWND, LPSTR, int);
+
+int WINAPI DlgDirListComboBox(HWND, LPSTR, int, int, UINT);
+BOOL WINAPI DlgDirSelectComboBox(HWND, LPSTR, int);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI DlgDirSelectEx(HWND, LPSTR, int, int);
+BOOL WINAPI DlgDirSelectComboBoxEx(HWND, LPSTR, int, int);
+#endif /* WINVER >= 0x030a */
+
+
+/* DlgDirList, DlgDirListComboBox flags values */
+#define DDL_READWRITE 0x0000
+#define DDL_READONLY 0x0001
+#define DDL_HIDDEN 0x0002
+#define DDL_SYSTEM 0x0004
+#define DDL_DIRECTORY 0x0010
+#define DDL_ARCHIVE 0x0020
+
+#define DDL_POSTMSGS 0x2000
+#define DDL_DRIVES 0x4000
+#define DDL_EXCLUSIVE 0x8000
+
+#endif /* NOCTLMGR */
+
+/****** Combo box control **************************************************/
+
+#ifndef NOCTLMGR
+
+/* Combo box styles */
+#ifndef NOWINSTYLES
+#define CBS_SIMPLE 0x0001L
+#define CBS_DROPDOWN 0x0002L
+#define CBS_DROPDOWNLIST 0x0003L
+#define CBS_OWNERDRAWFIXED 0x0010L
+#define CBS_OWNERDRAWVARIABLE 0x0020L
+#define CBS_AUTOHSCROLL 0x0040L
+#define CBS_OEMCONVERT 0x0080L
+#define CBS_SORT 0x0100L
+#define CBS_HASSTRINGS 0x0200L
+#define CBS_NOINTEGRALHEIGHT 0x0400L
+#if (WINVER >= 0x030a)
+#define CBS_DISABLENOSCROLL 0x0800L
+#endif /* WINVER >= 0x030a */
+#endif /* NOWINSTYLES */
+
+/* Combo box messages */
+#ifndef NOWINMESSAGES
+#define CB_GETEDITSEL (WM_USER+0)
+#define CB_LIMITTEXT (WM_USER+1)
+#define CB_SETEDITSEL (WM_USER+2)
+#define CB_ADDSTRING (WM_USER+3)
+#define CB_DELETESTRING (WM_USER+4)
+#define CB_DIR (WM_USER+5)
+#define CB_GETCOUNT (WM_USER+6)
+#define CB_GETCURSEL (WM_USER+7)
+#define CB_GETLBTEXT (WM_USER+8)
+#define CB_GETLBTEXTLEN (WM_USER+9)
+#define CB_INSERTSTRING (WM_USER+10)
+#define CB_RESETCONTENT (WM_USER+11)
+#define CB_FINDSTRING (WM_USER+12)
+#define CB_SELECTSTRING (WM_USER+13)
+#define CB_SETCURSEL (WM_USER+14)
+#define CB_SHOWDROPDOWN (WM_USER+15)
+#define CB_GETITEMDATA (WM_USER+16)
+#define CB_SETITEMDATA (WM_USER+17)
+#if (WINVER >= 0x030a)
+#define CB_GETDROPPEDCONTROLRECT (WM_USER+18)
+#define CB_SETITEMHEIGHT (WM_USER+19)
+#define CB_GETITEMHEIGHT (WM_USER+20)
+#define CB_SETEXTENDEDUI (WM_USER+21)
+#define CB_GETEXTENDEDUI (WM_USER+22)
+#define CB_GETDROPPEDSTATE (WM_USER+23)
+#define CB_FINDSTRINGEXACT (WM_USER+24)
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOWINMESSAGES */
+
+/* Combo box notification codes */
+#define CBN_ERRSPACE (-1)
+#define CBN_SELCHANGE 1
+#define CBN_DBLCLK 2
+#define CBN_SETFOCUS 3
+#define CBN_KILLFOCUS 4
+#define CBN_EDITCHANGE 5
+#define CBN_EDITUPDATE 6
+#define CBN_DROPDOWN 7
+#if (WINVER >= 0x030a)
+#define CBN_CLOSEUP 8
+#define CBN_SELENDOK 9
+#define CBN_SELENDCANCEL 10
+#endif /* WINVER >= 0x030a */
+
+/* Combo box message return values */
+#define CB_OKAY 0
+#define CB_ERR (-1)
+#define CB_ERRSPACE (-2)
+
+#endif /* NOCTLMGR */
+
+/******* Windows hook support **********************************************/
+
+#ifndef NOWH
+
+DECLARE_HANDLE32(HHOOK);
+
+#ifdef STRICT
+typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
+#else
+typedef FARPROC HOOKPROC;
+#endif
+
+#ifdef STRICT
+HHOOK WINAPI SetWindowsHook(int, HOOKPROC);
+LRESULT WINAPI DefHookProc(int, WPARAM, LPARAM, HHOOK FAR*);
+#else
+HOOKPROC WINAPI SetWindowsHook(int, HOOKPROC);
+LRESULT WINAPI DefHookProc(int, WPARAM, LPARAM, HOOKPROC FAR*);
+#endif
+BOOL WINAPI UnhookWindowsHook(int, HOOKPROC);
+
+#if (WINVER >= 0x030a)
+
+HHOOK WINAPI SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hInstance, HTASK hTask);
+BOOL WINAPI UnhookWindowsHookEx(HHOOK hHook);
+LRESULT WINAPI CallNextHookEx(HHOOK hHook, int code, WPARAM wParam, LPARAM lParam);
+
+#endif /* WINVER >= 0x030a */
+
+
+/* Standard hook code */
+#define HC_ACTION 0
+
+/* Obsolete hook codes (NO LONGER SUPPORTED) */
+#define HC_GETLPLPFN (-3)
+#define HC_LPLPFNNEXT (-2)
+#define HC_LPFNNEXT (-1)
+
+#endif /* NOWH */
+
+/****** Computer-based-training (CBT) support *******************************/
+
+#define WM_QUEUESYNC 0x0023
+
+#ifndef NOWH
+
+/* SetWindowsHook() code */
+#define WH_CBT 5
+
+#define HCBT_MOVESIZE 0
+#define HCBT_MINMAX 1
+#define HCBT_QS 2
+#define HCBT_CREATEWND 3
+#define HCBT_DESTROYWND 4
+#define HCBT_ACTIVATE 5
+#define HCBT_CLICKSKIPPED 6
+#define HCBT_KEYSKIPPED 7
+#define HCBT_SYSCOMMAND 8
+#define HCBT_SETFOCUS 9
+
+#if (WINVER >= 0x030a)
+/* HCBT_CREATEWND parameters pointed to by lParam */
+typedef struct tagCBT_CREATEWND
+{
+ CREATESTRUCT FAR* lpcs;
+ HWND hwndInsertAfter;
+} CBT_CREATEWND;
+typedef CBT_CREATEWND FAR* LPCBT_CREATEWND;
+
+/* HCBT_ACTIVATE structure pointed to by lParam */
+typedef struct tagCBTACTIVATESTRUCT
+{
+ BOOL fMouse;
+ HWND hWndActive;
+} CBTACTIVATESTRUCT;
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOWH */
+
+/****** Hardware hook support ***********************************************/
+
+#ifndef NOWH
+#if (WINVER >= 0x030a)
+#define WH_HARDWARE 8
+
+typedef struct tagHARDWAREHOOKSTRUCT
+{
+ HWND hWnd;
+ UINT wMessage;
+ WPARAM wParam;
+ LPARAM lParam;
+} HARDWAREHOOKSTRUCT;
+#endif /* WINVER >= 0x030a */
+#endif /* NOWH */
+
+/****** Shell support *******************************************************/
+
+#ifndef NOWH
+#if (WINVER >= 0x030a)
+/* SetWindowsHook() Shell hook code */
+#define WH_SHELL 10
+
+#define HSHELL_WINDOWCREATED 1
+#define HSHELL_WINDOWDESTROYED 2
+#define HSHELL_ACTIVATESHELLWINDOW 3
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOWH */
+
+/****** Journalling support *************************************************/
+
+#ifndef NOWH
+#define WH_JOURNALRECORD 0
+#define WH_JOURNALPLAYBACK 1
+
+/* Journalling hook codes */
+#define HC_GETNEXT 1
+#define HC_SKIP 2
+#define HC_NOREMOVE 3
+#define HC_NOREM HC_NOREMOVE
+#define HC_SYSMODALON 4
+#define HC_SYSMODALOFF 5
+
+/* Journalling message structure */
+typedef struct tagEVENTMSG
+{
+ UINT message;
+ UINT paramL;
+ UINT paramH;
+ DWORD time;
+} EVENTMSG;
+typedef EVENTMSG *PEVENTMSG;
+typedef EVENTMSG NEAR* NPEVENTMSG;
+typedef EVENTMSG FAR* LPEVENTMSG;
+
+BOOL WINAPI EnableHardwareInput(BOOL);
+
+#endif /* NOWH */
+
+
+/****** Debugger support ****************************************************/
+
+#if (WINVER >= 0x030a)
+/* SetWindowsHook debug hook support */
+#define WH_DEBUG 9
+
+typedef struct tagDEBUGHOOKINFO
+{
+ HMODULE hModuleHook;
+ LPARAM reserved;
+ LPARAM lParam;
+ WPARAM wParam;
+ int code;
+} DEBUGHOOKINFO;
+typedef DEBUGHOOKINFO FAR* LPDEBUGHOOKINFO;
+
+#ifndef NOMSG
+BOOL WINAPI QuerySendMessage(HANDLE h1, HANDLE h2, HANDLE h3, LPMSG lpmsg);
+#endif /* NOMSG */
+
+BOOL WINAPI LockInput(HANDLE h1, HWND hwndInput, BOOL fLock);
+
+LONG WINAPI GetSystemDebugState(void);
+/* Flags returned by GetSystemDebugState.
+ */
+#define SDS_MENU 0x0001
+#define SDS_SYSMODAL 0x0002
+#define SDS_NOTASKQUEUE 0x0004
+#define SDS_DIALOG 0x0008
+#define SDS_TASKLOCKED 0x0010
+#endif /* WINVER >= 0x030a */
+
+/****** Help support ********************************************************/
+
+#ifndef NOHELP
+
+BOOL WINAPI WinHelp(HWND hwndMain, LPCSTR lpszHelp, UINT usCommand, DWORD ulData);
+
+/* WinHelp() commands */
+#define HELP_CONTEXT 0x0001
+#define HELP_QUIT 0x0002
+#define HELP_INDEX 0x0003
+#define HELP_CONTENTS 0x0003
+#define HELP_HELPONHELP 0x0004
+#define HELP_SETINDEX 0x0005
+#define HELP_SETCONTENTS 0x0005
+#define HELP_CONTEXTPOPUP 0x0008
+#define HELP_FORCEFILE 0x0009
+#define HELP_KEY 0x0101
+#define HELP_COMMAND 0x0102
+#define HELP_PARTIALKEY 0x0105
+#define HELP_MULTIKEY 0x0201
+#define HELP_SETWINPOS 0x0203
+
+typedef struct tagMULTIKEYHELP
+{
+ UINT mkSize;
+ BYTE mkKeylist;
+ BYTE szKeyphrase[1];
+} MULTIKEYHELP;
+
+
+typedef struct
+{
+ int wStructSize;
+ int x;
+ int y;
+ int dx;
+ int dy;
+ int wMax;
+ char rgchMember[2];
+} HELPWININFO;
+typedef HELPWININFO NEAR* PHELPWININFO;
+typedef HELPWININFO FAR* LPHELPWININFO;
+
+#endif /* NOHELP */
+
+/****** Sound support ******************************************************/
+
+#ifndef NOSOUND
+
+int WINAPI OpenSound(void);
+void WINAPI CloseSound(void);
+
+int WINAPI StartSound(void);
+int WINAPI StopSound(void);
+
+int WINAPI SetVoiceQueueSize(int, int);
+int WINAPI SetVoiceNote(int, int, int, int);
+int WINAPI SetVoiceAccent(int, int, int, int, int);
+int WINAPI SetVoiceEnvelope(int, int, int);
+int WINAPI SetVoiceSound(int, DWORD, int);
+
+int WINAPI SetVoiceThreshold(int, int);
+int FAR* WINAPI GetThresholdEvent(void);
+int WINAPI GetThresholdStatus(void);
+
+int WINAPI SetSoundNoise(int, int);
+
+/* SetSoundNoise() Sources */
+#define S_PERIOD512 0
+#define S_PERIOD1024 1
+#define S_PERIOD2048 2
+#define S_PERIODVOICE 3
+#define S_WHITE512 4
+#define S_WHITE1024 5
+#define S_WHITE2048 6
+#define S_WHITEVOICE 7
+
+int WINAPI WaitSoundState(int);
+
+/* WaitSoundState() constants */
+#define S_QUEUEEMPTY 0
+#define S_THRESHOLD 1
+#define S_ALLTHRESHOLD 2
+
+int WINAPI SyncAllVoices(void);
+int WINAPI CountVoiceNotes(int);
+
+/* Accent Modes */
+#define S_NORMAL 0
+#define S_LEGATO 1
+#define S_STACCATO 2
+
+/* Error return values */
+#define S_SERDVNA (-1)
+#define S_SEROFM (-2)
+#define S_SERMACT (-3)
+#define S_SERQFUL (-4)
+#define S_SERBDNT (-5)
+#define S_SERDLN (-6)
+#define S_SERDCC (-7)
+#define S_SERDTP (-8)
+#define S_SERDVL (-9)
+#define S_SERDMD (-10)
+#define S_SERDSH (-11)
+#define S_SERDPT (-12)
+#define S_SERDFQ (-13)
+#define S_SERDDR (-14)
+#define S_SERDSR (-15)
+#define S_SERDST (-16)
+
+#endif /* NOSOUND */
+
+/****** Comm support ******************************************************/
+
+#ifndef NOCOMM
+
+#define NOPARITY 0
+#define ODDPARITY 1
+#define EVENPARITY 2
+#define MARKPARITY 3
+#define SPACEPARITY 4
+
+#define ONESTOPBIT 0
+#define ONE5STOPBITS 1
+#define TWOSTOPBITS 2
+
+#define IGNORE 0
+#define INFINITE 0xFFFF
+
+/* Error Flags */
+#define CE_RXOVER 0x0001
+#define CE_OVERRUN 0x0002
+#define CE_RXPARITY 0x0004
+#define CE_FRAME 0x0008
+#define CE_BREAK 0x0010
+#define CE_CTSTO 0x0020
+#define CE_DSRTO 0x0040
+#define CE_RLSDTO 0x0080
+#define CE_TXFULL 0x0100
+#define CE_PTO 0x0200
+#define CE_IOE 0x0400
+#define CE_DNS 0x0800
+#define CE_OOP 0x1000
+#define CE_MODE 0x8000
+
+#define IE_BADID (-1)
+#define IE_OPEN (-2)
+#define IE_NOPEN (-3)
+#define IE_MEMORY (-4)
+#define IE_DEFAULT (-5)
+#define IE_HARDWARE (-10)
+#define IE_BYTESIZE (-11)
+#define IE_BAUDRATE (-12)
+
+/* Events */
+#define EV_RXCHAR 0x0001
+#define EV_RXFLAG 0x0002
+#define EV_TXEMPTY 0x0004
+#define EV_CTS 0x0008
+#define EV_DSR 0x0010
+#define EV_RLSD 0x0020
+#define EV_BREAK 0x0040
+#define EV_ERR 0x0080
+#define EV_RING 0x0100
+#define EV_PERR 0x0200
+#define EV_CTSS 0x0400
+#define EV_DSRS 0x0800
+#define EV_RLSDS 0x1000
+#define EV_RingTe 0x2000
+#define EV_RINGTE EV_RingTe
+
+/* Escape Functions */
+#define SETXOFF 1
+#define SETXON 2
+#define SETRTS 3
+#define CLRRTS 4
+#define SETDTR 5
+#define CLRDTR 6
+#define RESETDEV 7
+
+#define LPTx 0x80
+
+#if (WINVER >= 0x030a)
+
+/* new escape functions */
+#define GETMAXLPT 8
+#define GETMAXCOM 9
+#define GETBASEIRQ 10
+
+/* Comm Baud Rate indices */
+#define CBR_110 0xFF10
+#define CBR_300 0xFF11
+#define CBR_600 0xFF12
+#define CBR_1200 0xFF13
+#define CBR_2400 0xFF14
+#define CBR_4800 0xFF15
+#define CBR_9600 0xFF16
+#define CBR_14400 0xFF17
+#define CBR_19200 0xFF18
+#define CBR_38400 0xFF1B
+#define CBR_56000 0xFF1F
+#define CBR_128000 0xFF23
+#define CBR_256000 0xFF27
+
+/* notifications passed in low word of lParam on WM_COMMNOTIFY messages */
+#define CN_RECEIVE 0x0001
+#define CN_TRANSMIT 0x0002
+#define CN_EVENT 0x0004
+
+#endif /* WINVER >= 0x030a */
+
+typedef struct tagDCB
+{
+ BYTE Id;
+ UINT BaudRate;
+ BYTE ByteSize;
+ BYTE Parity;
+ BYTE StopBits;
+ UINT RlsTimeout;
+ UINT CtsTimeout;
+ UINT DsrTimeout;
+
+ UINT fBinary :1;
+ UINT fRtsDisable :1;
+ UINT fParity :1;
+ UINT fOutxCtsFlow :1;
+ UINT fOutxDsrFlow :1;
+ UINT fDummy :2;
+ UINT fDtrDisable :1;
+
+ UINT fOutX :1;
+ UINT fInX :1;
+ UINT fPeChar :1;
+ UINT fNull :1;
+ UINT fChEvt :1;
+ UINT fDtrflow :1;
+ UINT fRtsflow :1;
+ UINT fDummy2 :1;
+
+ char XonChar;
+ char XoffChar;
+ UINT XonLim;
+ UINT XoffLim;
+ char PeChar;
+ char EofChar;
+ char EvtChar;
+ UINT TxDelay;
+} DCB;
+typedef DCB FAR* LPDCB;
+
+#if (defined(STRICT) | (WINVER >= 0x030a))
+
+typedef struct tagCOMSTAT
+{
+ BYTE status;
+ UINT cbInQue;
+ UINT cbOutQue;
+} COMSTAT;
+
+#define CSTF_CTSHOLD 0x01
+#define CSTF_DSRHOLD 0x02
+#define CSTF_RLSDHOLD 0x04
+#define CSTF_XOFFHOLD 0x08
+#define CSTF_XOFFSENT 0x10
+#define CSTF_EOF 0x20
+#define CSTF_TXIM 0x40
+
+#else /* (STRICT | WINVER >= 0x030a) */
+
+/* NOTE: This structure declaration is not ANSI compatible! */
+typedef struct tagCOMSTAT
+{
+ BYTE fCtsHold :1;
+ BYTE fDsrHold :1;
+ BYTE fRlsdHold :1;
+ BYTE fXoffHold :1;
+ BYTE fXoffSent :1;
+ BYTE fEof :1;
+ BYTE fTxim :1;
+ UINT cbInQue;
+ UINT cbOutQue;
+} COMSTAT;
+
+#endif /* !(STRICT | WINVER >= 0x030a */
+
+int WINAPI BuildCommDCB(LPCSTR, DCB FAR*);
+
+int WINAPI OpenComm(LPCSTR, UINT, UINT);
+int WINAPI CloseComm(int);
+
+int WINAPI ReadComm(int, void FAR*, int);
+int WINAPI WriteComm(int, const void FAR*, int);
+int WINAPI UngetCommChar(int, char);
+int WINAPI FlushComm(int, int);
+int WINAPI TransmitCommChar(int, char);
+
+int WINAPI SetCommState(const DCB FAR*);
+int WINAPI GetCommState(int, DCB FAR*);
+int WINAPI GetCommError(int, COMSTAT FAR* );
+
+int WINAPI SetCommBreak(int);
+int WINAPI ClearCommBreak(int);
+
+UINT FAR* WINAPI SetCommEventMask(int, UINT);
+UINT WINAPI GetCommEventMask(int, int);
+
+LONG WINAPI EscapeCommFunction(int, int);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI EnableCommNotification(int, HWND, int, int);
+
+#define WM_COMMNOTIFY 0x0044
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOCOMM */
+
+/****** String formatting support *******************************************/
+
+int WINAPI wvsprintf(LPSTR lpszOut, LPCSTR lpszFmt, const void FAR* lpParams);
+
+int FAR CDECL wsprintf(LPSTR lpszOut, LPCSTR lpszFmt, ...);
+
+
+/****** Driver support ******************************************************/
+
+#if (WINVER >= 0x030a)
+
+#ifndef NODRIVERS
+
+DECLARE_HANDLE(HDRVR);
+
+typedef LRESULT (CALLBACK* DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM);
+
+/* Driver messages */
+#define DRV_LOAD 0x0001
+#define DRV_ENABLE 0x0002
+#define DRV_OPEN 0x0003
+#define DRV_CLOSE 0x0004
+#define DRV_DISABLE 0x0005
+#define DRV_FREE 0x0006
+#define DRV_CONFIGURE 0x0007
+#define DRV_QUERYCONFIGURE 0x0008
+#define DRV_INSTALL 0x0009
+#define DRV_REMOVE 0x000A
+#define DRV_EXITSESSION 0x000B
+#define DRV_EXITAPPLICATION 0x000C
+#define DRV_POWER 0x000F
+
+#define DRV_RESERVED 0x0800
+#define DRV_USER 0x4000
+
+/* LPARAM of DRV_CONFIGURE message */
+typedef struct tagDRVCONFIGINFO
+{
+ DWORD dwDCISize;
+ LPCSTR lpszDCISectionName;
+ LPCSTR lpszDCIAliasName;
+} DRVCONFIGINFO;
+typedef DRVCONFIGINFO NEAR* PDRVCONFIGINFO;
+typedef DRVCONFIGINFO FAR* LPDRVCONFIGINFO;
+
+/* Supported return values for DRV_CONFIGURE message */
+#define DRVCNF_CANCEL 0x0000
+#define DRVCNF_OK 0x0001
+#define DRVCNF_RESTART 0x0002
+
+/* Supported lParam1 of DRV_EXITAPPLICATION notification */
+#define DRVEA_NORMALEXIT 0x0001
+#define DRVEA_ABNORMALEXIT 0x0002
+
+LRESULT WINAPI DefDriverProc(DWORD dwDriverIdentifier, HDRVR driverID, UINT message, LPARAM lParam1, LPARAM lParam2);
+
+HDRVR WINAPI OpenDriver(LPCSTR szDriverName, LPCSTR szSectionName, LPARAM lParam2);
+LRESULT WINAPI CloseDriver(HDRVR hDriver, LPARAM lParam1, LPARAM lParam2);
+
+LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2);
+
+HINSTANCE WINAPI GetDriverModuleHandle(HDRVR hDriver);
+
+HDRVR WINAPI GetNextDriver(HDRVR, DWORD);
+
+/* GetNextDriver flags */
+#define GND_FIRSTINSTANCEONLY 0x00000001
+
+#define GND_FORWARD 0x00000000
+#define GND_REVERSE 0x00000002
+
+typedef struct tagDRIVERINFOSTRUCT
+{
+ UINT length;
+ HDRVR hDriver;
+ HINSTANCE hModule;
+ char szAliasName[128];
+} DRIVERINFOSTRUCT;
+typedef DRIVERINFOSTRUCT FAR* LPDRIVERINFOSTRUCT;
+
+BOOL WINAPI GetDriverInfo(HDRVR, DRIVERINFOSTRUCT FAR*);
+
+#endif /* !NODRIVERS */
+#endif /* WINVER >= 0x030a */
+#endif /* NOUSER */
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+} /* End of extern "C" { */
+#endif /* __cplusplus */
+
+#endif /* _INC_WINDOWS */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/windows.inc b/private/oleauto/tools/win16/hdos/c800/include/windows.inc
new file mode 100644
index 000000000..76f76eb62
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/windows.inc
@@ -0,0 +1,2343 @@
+;*************************************************************************
+;
+; WINDOWS.INC - Windows assembly language structures & constants
+;
+;*************************************************************************
+;
+; Conditional Block includes: (True states)
+; NOTEXT - don't include TextMetric struc & text drawing modes & stock objs.
+; NORASTOPS - don't include binary and ternary raster ops.
+; NOVK - don't include virtual key definitions
+; NOMB - don't include message box definitions
+; NOWM - don't include window messages
+;
+;
+FALSE = 0
+TRUE = 1
+NULL = 0
+
+;*******************************************************************
+;
+; Rectangle
+;
+;*******************************************************************
+
+RECT struc
+ rcLeft dw ?
+ rcTop dw ?
+ rcRight dw ?
+ rcBottom dw ?
+RECT ends
+
+;*******************************************************************
+;
+; Window Class structure
+;
+;*******************************************************************
+
+WNDCLASS struc
+ clsStyle dw ? ; class style
+ clsLpfnWndProc dd ?
+ clsCbClsExtra dw ?
+ clsCbWndExtra dw ?
+ clsHInstance dw ? ; instance handle
+ clsHIcon dw ? ; class icon handle
+ clsHCursor dw ? ; class cursor handle
+ clsHbrBackground dw ? ; class background brush
+ clsLpszMenuName dd ? ; menu name
+ clsLpszClassName dd ? ; far ptr to class name
+WNDCLASS ends
+
+IFNDEF NOTEXT
+TEXTMETRIC struc
+ tmHeight dw ?
+ tmAscent dw ?
+ tmDescent dw ?
+ tmIntLeading dw ?
+ tmExtLeading dw ?
+ tmAveCharWidth dw ?
+ tmMaxCharWidth dw ?
+ tmWeight dw ?
+ tmItalic db ?
+ tmUnderlined db ?
+ tmStruckOut db ?
+ tmFirstChar db ?
+ tmLastChar db ?
+ tmDefaultChar db ?
+ tmBreakChar db ?
+ tmPitch db ?
+ tmCharSet db ?
+ tmOverhang dw ?
+ tmAspectX dw ?
+ tmAspectY dw ?
+TEXTMETRIC ends
+
+LF_FACESIZE EQU 32
+
+LOGFONT struc
+ lfHeight dw ?
+ lfWidth dw ?
+ lfEscapement dw ?
+ lfOrientation dw ?
+ lfWeight dw ?
+ lfItalic db ?
+ lfUnderline db ?
+ lfStrikeOut db ?
+ lfCharSet db ?
+ lfOutPrecision db ?
+ lfClipPrecision db ?
+ lfQuality db ?
+ lfPitchAndFamily db ?
+ lfFaceName db LF_FACESIZE dup(?)
+LOGFONT ends
+
+LOGBRUSH struc
+ lbStyle dw ?
+ lbColor dd ?
+ lbHatch dw ?
+LOGBRUSH ends
+
+;
+; Text Drawing modes
+;
+TRANSPARENT = 1
+OPAQUE = 2
+;
+; Mapping Modes
+;
+MM_TEXT = 1
+MM_LOMETRIC = 2
+MM_HIMETRIC = 3
+MM_LOENGLISH = 4
+MM_HIENGLISH = 5
+MM_TWIPS = 6
+MM_ISOTROPIC = 7
+MM_ANISOTROPIC = 8
+;
+; Coordinate Modes
+;
+ABSOLUTE = 1
+RELATIVE = 2
+;
+; Stock Logical Objects
+;
+WHITE_BRUSH = 0
+LTGRAY_BRUSH = 1
+GRAY_BRUSH = 2
+DKGRAY_BRUSH = 3
+BLACK_BRUSH = 4
+NULL_BRUSH = 5
+HOLLOW_BRUSH = 5
+WHITE_PEN = 6
+BLACK_PEN = 7
+NULL_PEN = 8
+DOT_MARKER = 9
+OEM_FIXED_FONT = 10
+ANSI_FIXED_FONT = 11
+ANSI_VAR_FONT = 12
+SYSTEM_FONT = 13
+DEVICE_DEFAULT_FONT = 14
+DEFAULT_PALETTE = 15
+SYSTEM_FIXED_FONT = 16
+ENDIF
+;
+; Brush Styles
+;
+BS_SOLID = 0
+BS_NULL = 1
+BS_HOLLOW = BS_NULL
+BS_HATCHED = 2
+BS_PATTERN = 3
+BS_INDEXED = 4
+BS_DIBPATTERN = 5
+;
+; Hatch Styles
+;
+HS_HORIZONTAL = 0 ; -----
+HS_VERTICAL = 1 ; |||||
+HS_FDIAGONAL = 2 ; \\\\\
+HS_BDIAGONAL = 3 ; /////
+HS_CROSS = 4 ; +++++
+HS_DIAGCROSS = 5 ; xxxxx
+;
+; Pen Styles
+;
+PS_SOLID = 0
+PS_DASH = 1 ; -------
+PS_DOT = 2 ; .......
+PS_DASHDOT = 3 ; _._._._
+PS_DASHDOTDOT = 4 ; _.._.._
+PS_NULL = 5
+PS_INSIDEFRAME = 6
+;
+; Device Parameters for GetDeviceCaps()
+;
+DRIVERVERSION =0 ; Device driver version
+TECHNOLOGY =2 ; Device classification
+HORZSIZE =4 ; Horizontal size in millimeters
+VERTSIZE =6 ; Vertical size in millimeters
+HORZRES =8 ; Horizontal width in pixels
+VERTRES =10 ; Vertical width in pixels
+BITSPIXEL =12 ; Number of bits per pixel
+PLANES =14 ; Number of planes
+NUMBRUSHES =16 ; Number of brushes the device has
+NUMPENS =18 ; Number of pens the device has
+NUMMARKERS =20 ; Number of markers the device has
+NUMFONTS =22 ; Number of fonts the device has
+NUMCOLORS =24 ; Number of colors the device supports
+PDEVICESIZE =26 ; Size required for device descriptor
+CURVECAPS =28 ; Curve capabilities
+LINECAPS =30 ; Line capabilities
+POLYGONALCAPS =32 ; Polygonal capabilities
+TEXTCAPS =34 ; Text capabilities
+CLIPCAPS =36 ; Clipping capabilities
+RASTERCAPS =38 ; Bitblt capabilities
+ASPECTX =40 ; Length of the X leg
+ASPECTY =42 ; Length of the Y leg
+ASPECTXY =44 ; Length of the hypotenuse
+
+LOGPIXELSX =88 ; Logical pixels/inch in X
+LOGPIXELSY =90 ; Logical pixels/inch in Y
+
+SIZEPALETTE =104 ; Number of entries in physical palette
+NUMRESERVED =106 ; Number of reserved entries in palette
+COLORRES =108 ; Actual color resolution
+;
+ifndef NOGDICAPMASKS
+;
+; Device Capability Masks:
+;
+; Device Technologies
+DT_PLOTTER = 0 ; /* Vector plotter */
+DT_RASDISPLAY = 1 ; /* Raster display */
+DT_RASPRINTER = 2 ; /* Raster printer */
+DT_RASCAMERA = 3 ; /* Raster camera */
+DT_CHARSTREAM = 4 ; /* Character-stream, PLP */
+DT_METAFILE = 5 ; /* Metafile, VDM */
+DT_DISPFILE = 6 ; /* Display-file */
+;
+; Curve Capabilities
+CC_NONE = 0 ; /* Curves not supported */
+CC_CIRCLES = 1 ; /* Can do circles */
+CC_PIE = 2 ; /* Can do pie wedges */
+CC_CHORD = 4 ; /* Can do chord arcs */
+CC_ELLIPSES = 8 ; /* Can do ellipese */
+CC_WIDE = 16 ; /* Can do wide lines */
+CC_STYLED = 32 ; /* Can do styled lines */
+CC_WIDESTYLED = 64 ; /* Can do wide styled lines */
+CC_INTERIORS = 128; /* Can do interiors */
+;
+; Line Capabilities
+LC_NONE = 0 ; /* Lines not supported */
+LC_POLYLINE = 2 ; /* Can do polylines */
+LC_MARKER = 4 ; /* Can do markers */
+LC_POLYMARKER = 8 ; /* Can do polymarkers */
+LC_WIDE = 16 ; /* Can do wide lines */
+LC_STYLED = 32 ; /* Can do styled lines */
+LC_WIDESTYLED = 64 ; /* Can do wide styled lines */
+LC_INTERIORS = 128; /* Can do interiors */
+;
+; Polygonal Capabilities
+PC_NONE = 0 ; /* Polygonals not supported */
+PC_POLYGON = 1 ; /* Can do polygons */
+PC_RECTANGLE = 2 ; /* Can do rectangles */
+PC_WINDPOLYGON = 4 ; /* Can do winding polygons */
+PC_TRAPEZOID = 4 ; /* Can do trapezoids */
+PC_SCANLINE = 8 ; /* Can do scanlines */
+PC_WIDE = 16 ; /* Can do wide borders */
+PC_STYLED = 32 ; /* Can do styled borders */
+PC_WIDESTYLED = 64 ; /* Can do wide styled borders */
+PC_INTERIORS = 128; /* Can do interiors */
+;
+; Polygonal Capabilities */
+CP_NONE = 0 ; /* No clipping of output */
+CP_RECTANGLE = 1 ; /* Output clipped to rects */
+;
+; Text Capabilities
+TC_OP_CHARACTER = 0001h ; /* Can do OutputPrecision CHARACTER */
+TC_OP_STROKE = 0002h ; /* Can do OutputPrecision STROKE */
+TC_CP_STROKE = 0004h ; /* Can do ClipPrecision STROKE */
+TC_CR_90 = 0008h ; /* Can do CharRotAbility 90 */
+TC_CR_ANY = 0010h ; /* Can do CharRotAbility ANY */
+TC_SF_X_YINDEP = 0020h ; /* Can do ScaleFreedom X_YINDEPENDENT */
+TC_SA_DOUBLE = 0040h ; /* Can do ScaleAbility DOUBLE */
+TC_SA_INTEGER = 0080h ; /* Can do ScaleAbility INTEGER */
+TC_SA_CONTIN = 0100h ; /* Can do ScaleAbility CONTINUOUS */
+TC_EA_DOUBLE = 0200h ; /* Can do EmboldenAbility DOUBLE */
+TC_IA_ABLE = 0400h ; /* Can do ItalisizeAbility ABLE */
+TC_UA_ABLE = 0800h ; /* Can do UnderlineAbility ABLE */
+TC_SO_ABLE = 1000h ; /* Can do StrikeOutAbility ABLE */
+TC_RA_ABLE = 2000h ; /* Can do RasterFontAble ABLE */
+TC_VA_ABLE = 4000h ; /* Can do VectorFontAble ABLE */
+TC_RESERVED = 8000h
+;
+; Raster Capabilities
+RC_BITBLT = 1 ; /* Can do standard BLT. */
+RC_BANDING = 2 ; /* Device requires banding support */
+RC_SCALING = 4 ; /* Device requires scaling support */
+RC_BITMAP64 = 8 ; /* Device can support >64K bitmap */
+RC_GDI20_OUTPUT = 0010h ; /* has 2.0 output calls */
+RC_DI_BITMAP = 0080h ; /* supports DIB to memory */
+RC_PALETTE = 0100h ; /* supports a palette */
+RC_DIBTODEV = 0200h ; /* supports DIBitsToDevice */
+RC_BIGFONT = 0400h ; /* supports >64K fonts */
+RC_STRETCHBLT = 0800h ; /* supports StretchBlt */
+RC_FLOODFILL = 1000h ; /* supports FloodFill */
+RC_STRETCHDIB = 2000h ; /* supports StretchDIBits */
+
+endif ;NOGDICAPMASKS
+
+; palette entry flags
+;
+PC_RESERVED = 1 ;/* palette index used for animation */
+PC_EXPLICIT = 2 ;/* palette index is explicit to device */
+PC_NOCOLLAPSE = 4 ;/* do not match color to system palette */
+
+; DIB color table identifiers
+;
+DIB_RGB_COLORS = 0 ;/* color table in RGBTriples */
+DIB_PAL_COLORS = 1 ;/* color table in palette indices */
+;
+
+;constants for Get/SetSystemPaletteUse()
+;
+SYSPAL_STATIC = 1
+SYSPAL_NOSTATIC = 2
+
+; constants for CreateDIBitmap
+CBM_INIT = 4 ;/* initialize bitmap */
+;
+; Bitmap format constants
+BI_RGB = 0
+BI_RLE8 = 1
+BI_RLE4 = 2
+;
+;
+ANSI_CHARSET = 0
+SYMBOL_CHARSET = 2
+OEM_CHARSET = 255
+;
+; styles for CombineRgn
+;
+RGN_AND = 1
+RGN_OR = 2
+RGN_XOR = 3
+RGN_DIFF = 4
+RGN_COPY = 5
+;
+; Predefined cursor & icon IDs
+;
+IDC_ARROW = 32512
+IDC_IBEAM = 32513
+IDC_WAIT = 32514
+IDC_CROSS = 32515
+IDC_UPARROW = 32516
+IDC_SIZE = 32640
+IDC_ICON = 32641
+IDC_SIZENWSE = 32642
+IDC_SIZENESW = 32643
+IDC_SIZEWE = 32644
+IDC_SIZENS = 32645
+
+IDI_APPLICATION = 32512
+IDI_HAND = 32513
+IDI_QUESTION = 32514
+IDI_EXCLAMATION = 32515
+IDI_ASTERISK = 32516
+
+;
+; OEM Resource Ordinal Numbers */
+;
+OBM_CLOSE = 32754
+OBM_UPARROW = 32753
+OBM_DNARROW = 32752
+OBM_RGARROW = 32751
+OBM_LFARROW = 32750
+OBM_REDUCE = 32749
+OBM_ZOOM = 32748
+OBM_RESTORE = 32747
+OBM_REDUCED = 32746
+OBM_ZOOMD = 32745
+OBM_RESTORED = 32744
+OBM_UPARROWD = 32743
+OBM_DNARROWD = 32742
+OBM_RGARROWD = 32741
+OBM_LFARROWD = 32740
+OBM_MNARROW = 32739
+OBM_COMBO = 32738
+OBM_UPARROWI = 32737
+OBM_DNARROWI = 32736
+OBM_RGARROWI = 32735
+OBM_LFARROWI = 32734
+
+OBM_OLD_CLOSE = 32767
+OBM_SIZE = 32766
+OBM_OLD_UPARROW = 32765
+OBM_OLD_DNARROW = 32764
+OBM_OLD_RGARROW = 32763
+OBM_OLD_LFARROW = 32762
+OBM_BTSIZE = 32761
+OBM_CHECK = 32760
+OBM_CHECKBOXES = 32759
+OBM_BTNCORNERS = 32758
+OBM_OLD_REDUCE = 32757
+OBM_OLD_ZOOM = 32756
+OBM_OLD_RESTORE = 32755
+
+OCR_NORMAL = 32512
+OCR_IBEAM = 32513
+OCR_WAIT = 32514
+OCR_CROSS = 32515
+OCR_UP = 32516
+OCR_SIZE = 32640
+OCR_ICON = 32641
+OCR_SIZENWSE = 32642
+OCR_SIZENESW = 32643
+OCR_SIZEWE = 32644
+OCR_SIZENS = 32645
+OCR_SIZEALL = 32646
+OCR_ICOCUR = 32647
+
+OIC_SAMPLE = 32512
+OIC_HAND = 32513
+OIC_QUES = 32514
+OIC_BANG = 32515
+OIC_NOTE = 32516
+
+;
+; Scroll bar constants
+;
+SB_HORZ = 0
+SB_VERT = 1
+SB_CTL = 2
+SB_BOTH = 3
+;
+; Scroll Commands
+;
+SB_LINEUP = 0
+SB_LINEDOWN = 1
+SB_PAGEUP = 2
+SB_PAGEDOWN = 3
+SB_THUMBPOSITION = 4
+SB_THUMBTRACK = 5
+SB_TOP = 6
+SB_BOTTOM = 7
+SB_ENDSCROLL = 8
+;
+; MessageBox type flags
+;
+IFNDEF NOMB
+MB_OK = 0000H
+MB_OKCANCEL = 0001H
+MB_ABORTRETRYIGNORE = 0002H
+MB_YESNOCANCEL = 0003H
+MB_YESNO = 0004H
+MB_RETRYCANCEL = 0005H
+
+MB_ICONHAND = 0010H
+MB_ICONQUESTION = 0020H
+MB_ICONEXCLAMATION = 0030H
+MB_ICONASTERISK = 0040H
+
+MB_DEFBUTTON1 = 0000H
+MB_DEFBUTTON2 = 0100H
+MB_DEFBUTTON3 = 0200H
+
+MB_APPLMODAL = 0000H
+MB_SYSTEMMODAL = 1000H
+MB_TASKMODAL = 2000H
+
+MB_NOFOCUS = 8000H
+
+;
+; Conventional dialog box and message box command IDs
+;
+IDOK = 1
+IDCANCEL = 2
+IDABORT = 3
+IDRETRY = 4
+IDIGNORE = 5
+IDYES = 6
+IDNO = 7
+;
+; Flags for OpenFile
+;
+OF_READ = 0000H
+OF_WRITE = 0001H
+OF_READWRITE = 0002H
+OF_SHARE_COMPAT = 0000H
+OF_SHARE_EXCLUSIVE = 0010H
+OF_SHARE_DENY_WRITE = 0020H
+OF_SHARE_DENY_READ = 0030H
+OF_SHARE_DENY_NONE = 0040H
+OF_PARSE = 0100H
+OF_DELETE = 0200H
+OF_VERIFY = 0400H ; Used with OF_REOPEN
+OF_SEARCH = 0400H ; Used without OF_REOPEN
+OF_CANCEL = 0800H
+OF_CREATE = 1000H
+OF_PROMPT = 2000H
+OF_EXIST = 4000H
+OF_REOPEN = 8000H
+
+TF_FORCEDRIVE = 80H
+
+OPENSTRUC STRUC
+opLen db ?
+opDisk db ?
+opXtra dw ?
+opDate dw ?
+opTime dw ?
+opFile db 120 dup (?)
+OPENSTRUC ENDS
+;
+; DrawText format flags
+;
+DT_LEFT = 00H
+DT_CENTER = 01H
+DT_RIGHT = 02H
+DT_TOP = 00H
+DT_VCENTER = 04H
+DT_BOTTOM = 08H
+DT_WORDBREAK = 10H
+DT_SINGLELINE = 20H
+DT_EXPANDTABS = 40H
+DT_TABSTOP = 80H
+DT_NOCLIP = 0100H
+DT_EXTERNALLEADING = 0200H
+DT_CALCRECT = 0400H
+DT_NOPREFIX = 0800H
+DT_INTERNAL = 1000H
+ENDIF
+
+;
+; ExtFloodFill style flags
+;
+FLOODFILLBORDER = 0
+FLOODFILLSURFACE = 1
+
+;
+; Memory manager flags
+;
+LMEM_FIXED = 0000h
+LMEM_MOVEABLE = 0002h
+LMEM_NOCOMPACT = 0010H
+LMEM_NODISCARD = 0020H
+LMEM_ZEROINIT = 0040h
+LMEM_MODIFY = 0080H
+LMEM_DISCARDABLE= 0F00h
+LHND = LMEM_MOVEABLE+LMEM_ZEROINIT
+LPTR = LMEM_FIXED+LMEM_ZEROINIT
+; Flags returned by LocalFlags (in addition to LMEM_DISCARDABLE)
+LMEM_DISCARDED = 4000H
+LMEM_LOCKCOUNT = 00FFH
+
+NONZEROLHND = LMEM_MOVEABLE
+NONZEROLPTR = LMEM_FIXED
+
+
+
+GMEM_FIXED = 0000h
+GMEM_MOVEABLE = 0002h
+GMEM_NOCOMPACT = 0010h
+GMEM_NODISCARD = 0020h
+GMEM_ZEROINIT = 0040h
+GMEM_MODIFY = 0080h
+GMEM_DISCARDABLE= 0100h
+GMEM_NOT_BANKED = 1000h
+GMEM_DDESHARE = 2000h
+GMEM_SHARE = 2000h
+GMEM_NOTIFY = 4000h
+GMEM_LOWER = GMEM_NOT_BANKED
+GHND = GMEM_MOVEABLE+GMEM_ZEROINIT
+GPTR = GMEM_FIXED+GMEM_ZEROINIT
+
+; Flags returned by GlobalFlags (in addition to GMEM_DISCARDABLE)
+GMEM_DISCARDED = 4000h
+GMEM_LOCKCOUNT = 00FFh
+
+; Flags returned by GetWinFlags
+
+WF_PMODE = 0001h
+WF_CPU286 = 0002h
+WF_CPU386 = 0004h
+WF_CPU486 = 0008h
+WF_STANDARD = 0010h
+WF_WIN286 = 0010h
+WF_ENHANCED = 0020h
+WF_WIN386 = 0020h
+WF_CPU086 = 0040h
+WF_CPU186 = 0080h
+WF_LARGEFRAME = 0100h
+WF_SMALLFRAME = 0200h
+WF_80x87 = 0400h
+WF_PAGING = 0800h
+WF_WLO = 8000h
+
+; WEP fSystemExit flag values
+WEP_SYSTEM_EXIT = 1
+WEP_FREE_DLL = 0
+
+
+; Virtual Keys, Standard Set
+
+IFNDEF NOVK
+VK_LBUTTON = 01H
+VK_RBUTTON = 02H
+VK_CANCEL = 03H
+VK_BACK = 08H
+VK_TAB = 09H
+VK_CLEAR = 0cH
+VK_RETURN = 0dH
+VK_SHIFT = 10H
+VK_CONTROL = 11H
+VK_MENU = 12H
+VK_PAUSE = 13H
+VK_CAPITAL = 14H
+VK_ESCAPE = 1bH
+VK_SPACE = 20H
+
+VK_PRIOR = 21H
+VK_NEXT = 22H
+VK_END = 23H
+VK_HOME = 24H
+VK_LEFT = 25H
+VK_UP = 26H
+VK_RIGHT = 27H
+VK_DOWN = 28H
+
+; VK_A thru VK_Z are the same as their ASCII equivalents: 'A' thru 'Z'
+; VK_0 thru VK_9 are the same as their ASCII equivalents: '0' thru '0'
+
+VK_PRINT = 2aH
+VK_EXECUTE = 2bH
+VK_SNAPSHOT = 2ch ; Printscreen key..
+VK_INSERT = 2dH
+VK_DELETE = 2eH
+VK_HELP = 2fH
+
+VK_NUMPAD0 = 60H
+VK_NUMPAD1 = 61H
+VK_NUMPAD2 = 62H
+VK_NUMPAD3 = 63H
+VK_NUMPAD4 = 64H
+VK_NUMPAD5 = 65H
+VK_NUMPAD6 = 66H
+VK_NUMPAD7 = 67H
+VK_NUMPAD8 = 68H
+VK_NUMPAD9 = 69H
+VK_MULTIPLY = 6AH
+VK_ADD = 6BH
+VK_SEPARATER = 6CH
+VK_SUBTRACT = 6DH
+VK_DECIMAL = 6EH
+VK_DIVIDE = 6FH
+
+VK_F1 = 70H
+VK_F2 = 71H
+VK_F3 = 72H
+VK_F4 = 73H
+VK_F5 = 74H
+VK_F6 = 75H
+VK_F7 = 76H
+VK_F8 = 77H
+VK_F9 = 78H
+VK_F10 = 79H
+VK_F11 = 7aH
+VK_F12 = 7bH
+VK_F13 = 7cH
+VK_F14 = 7dH
+VK_F15 = 7eH
+VK_F16 = 7fH
+VK_F17 = 80H
+VK_F18 = 81H
+VK_F19 = 82H
+VK_F20 = 83H
+VK_F21 = 84H
+VK_F22 = 85H
+VK_F23 = 86H
+VK_F24 = 87H
+
+VK_NUMLOCK = 90H
+VK_SCROLL = 91H
+ENDIF
+
+IFNDEF NOWH
+
+; SetWindowsHook() codes
+WH_MSGFILTER = (-1)
+WH_JOURNALRECORD = 0
+WH_JOURNALPLAYBACK = 1
+WH_KEYBOARD = 2
+WH_GETMESSAGE = 3
+WH_CALLWNDPROC = 4
+IFNDEF NOWIN31
+WH_CBT = 5
+WH_SYSMSGFILTER = 6
+WH_MOUSE = 7
+WH_HARDWARE = 8
+WH_DEBUG = 9
+ENDIF
+;
+; Hook Codes
+HC_GETLPLPFN = (-3)
+HC_LPLPFNNEXT = (-2)
+HC_LPFNNEXT = (-1)
+HC_ACTION = 0
+HC_GETNEXT = 1
+HC_SKIP = 2
+HC_NOREM = 3
+HC_NOREMOVE = 3
+HC_SYSMODALON = 4
+HC_SYSMODALOFF = 5
+;
+; CBT Hook Codes
+HCBT_MOVESIZE = 0
+HCBT_MINMAX = 1
+HCBT_QS = 2
+HCBT_CREATEWND = 3
+HCBT_DESTROYWND = 4
+HCBT_ACTIVATE = 5
+HCBT_CLICKSKIPPED = 6
+HCBT_KEYSKIPPED = 7
+HCBT_SYSCOMMAND = 8
+HCBT_SETFOCUS = 9
+
+;
+; WH_MSGFILTER Filter Proc Codes
+MSGF_DIALOGBOX = 0
+MSGF_MENU = 2
+MSGF_MOVE = 3
+MSGF_SIZE = 4
+MSGF_SCROLLBAR = 5
+MSGF_NEXTWINDOW = 6
+;
+; Window Manager Hook Codes
+WC_INIT = 1
+WC_SWP = 2
+WC_DEFWINDOWPROC = 3
+WC_MINMAX = 4
+WC_MOVE = 5
+WC_SIZE = 6
+WC_DRAWCAPTION = 7
+;
+
+; Message Structure used in Journaling
+EVENTMSG struc
+ message dw ?
+ paramL dw ?
+ paramH dw ?
+ time dd ?
+EVENTMSG ends
+
+ENDIF ;NOWH
+
+; Window field offsets for GetWindowLong() and GetWindowWord()
+GWL_WNDPROC = (-4)
+GWW_HINSTANCE = (-6)
+GWW_HWNDPARENT = (-8)
+GWW_ID = (-12)
+GWL_STYLE = (-16)
+GWL_EXSTYLE = (-20)
+
+; GetWindow() Constants
+GW_HWNDFIRST = 0
+GW_HWNDLAST = 1
+GW_HWNDNEXT = 2
+GW_HWNDPREV = 3
+GW_OWNER = 4
+GW_CHILD = 5
+
+; Class field offsets for GetClassLong() and GetClassWord()
+GCL_MENUNAME = (-8)
+GCW_HBRBACKGROUND = (-10)
+GCW_HCURSOR = (-12)
+GCW_HICON = (-14)
+GCW_HMODULE = (-16)
+GCW_CBWNDEXTRA = (-18)
+GCW_CBCLSEXTRA = (-20)
+GCL_WNDPROC = (-24)
+GCW_STYLE = (-26)
+
+; WinWhere() Area Codes
+HTERROR = (-2)
+HTTRANSPARENT = (-1)
+HTNOWHERE = 0
+HTCLIENT = 1
+HTCAPTION = 2
+HTSYSMENU = 3
+HTGROWBOX = 4
+HTSIZE = HTGROWBOX
+HTMENU = 5
+HTHSCROLL = 6
+HTVSCROLL = 7
+HTREDUCE = 8
+HTZOOM = 9
+HTLEFT = 10
+HTRIGHT = 11
+HTTOP = 12
+HTTOPLEFT = 13
+HTTOPRIGHT = 14
+HTBOTTOM = 15
+HTBOTTOMLEFT = 16
+HTBOTTOMRIGHT = 17
+HTSIZEFIRST = HTLEFT
+HTSIZELAST = HTBOTTOMRIGHT
+
+
+
+;*************************************************************************
+;
+; Misc structures & constants
+;
+;*************************************************************************
+
+IFNDEF NOMST
+POINT struc
+ ptX dw ?
+ ptY dw ?
+POINT ends
+
+LOGPEN struc
+ lopnStyle dw ?
+ lopnWidth db (SIZE POINT) DUP(?)
+ lopnColor dd ?
+LOGPEN ends
+
+
+BITMAP STRUC
+ bmType DW ?
+ bmWidth DW ?
+ bmHeight DW ?
+ bmWidthBytes DW ?
+ bmPlanes DB ?
+ bmBitsPixel DB ?
+ bmBits DD ?
+BITMAP ENDS
+
+RGBTRIPLE struc
+ rgbBlue db ?
+ rgbGreen db ?
+ rgbRed db ?
+RGBTRIPLE ends
+
+RGBQUAD struc
+ rgbqBlue db ?
+ rgbqGreen db ?
+ rgbqRed db ?
+ rgbqReserved db ?
+RGBQUAD ends
+
+; structures for defining DIBs
+BITMAPCOREHEADER struc
+ bcSize dd ?
+ bcWidth dw ?
+ bcHeight dw ?
+ bcPlanes dw ?
+ bcBitCount dw ?
+BITMAPCOREHEADER ends
+
+BITMAPINFOHEADER struc
+ biSize dd ?
+ biWidth dd ?
+ biHeight dd ?
+ biPlanes dw ?
+ biBitCount dw ?
+
+ biCompression dd ?
+ biSizeImage dd ?
+ biXPelsPerMeter dd ?
+ biYPelsPerMeter dd ?
+ biClrUsed dd ?
+ biClrImportant dd ?
+BITMAPINFOHEADER ends
+
+BITMAPINFO struc
+ bmiHeader db (SIZE BITMAPINFOHEADER) DUP (?)
+ bmiColors db ? ; array of RGBQUADs
+BITMAPINFO ends
+
+BITMAPCOREINFO struc
+ bmciHeader db (SIZE BITMAPCOREHEADER) DUP (?)
+ bmciColors db ? ; array of RGBTRIPLEs
+BITMAPCOREINFO ends
+
+BITMAPFILEHEADER struc
+ bfType dw ?
+ bfSize dd ?
+ bfReserved1 dw ?
+ bfReserved2 dw ?
+ bfOffBits dd ?
+BITMAPFILEHEADER ends
+
+
+WNDSTRUC struc
+ WSwndStyle dd ?
+ WSwndID dw ?
+ WSwndText dw ?
+ WSwndParent dw ?
+ WSwndInstance dw ?
+ WSwndClassProc dd ?
+WNDSTRUC ends
+;
+; Message structure
+;
+MSGSTRUCT struc
+msHWND dw ?
+msMESSAGE dw ?
+msWPARAM dw ?
+msLPARAM dd ?
+msTIME dd ?
+msPT dd ?
+MSGSTRUCT ends
+
+NEWPARMS struc
+ nprmHwnd dw ?
+ nprmCmd db ?
+NEWPARMS ends
+ENDIF
+
+PAINTSTRUCT STRUC
+ PShdc DW ?
+ PSfErase DW ?
+ PSrcPaint DB size RECT dup(?)
+ PSfRestore DW ?
+ PSfIncUpdate DW ?
+ PSrgbReserved DB 16 dup(?)
+PAINTSTRUCT ENDS
+
+
+CREATESTRUCT struc
+ cs_lpCreateParams dd ?
+ cs_hInstance dw ?
+ cs_hMenu dw ?
+ cs_hwndParent dw ?
+ cs_cy dw ?
+ cs_cx dw ?
+ cs_y dw ?
+ cs_x dw ?
+ cs_style dd ?
+ cs_lpszName dd ?
+ cs_lpszClass dd ?
+ cs_dwExStyle dd ?
+CREATESTRUCT ends
+;
+; PostError constants
+;
+WARNING = 0 ; command codes
+MINOR_ERROR = 1
+FATAL_ERROR = 2
+
+IGNORE = 0 ; response codes
+RETRY = 1
+ABORT = 2
+;
+; GDI-related constants & commands
+;
+ERRORREGION = 0
+NULLREGION = 1
+SIMPLEREGION = 2
+COMPLEXREGION = 3
+
+IFNDEF NORASTOPS
+;
+; Binary raster ops
+;
+R2_BLACK = 1
+R2_NOTMERGEPEN = 2
+R2_MASKNOTPEN = 3
+R2_NOTCOPYPEN = 4
+R2_MASKPENNOT = 5
+R2_NOT = 6
+R2_XORPEN = 7
+R2_NOTMASKPEN = 8
+R2_MASKPEN = 9
+R2_NOTXORPEN = 10
+R2_NOP = 11
+R2_MERGENOTPEN = 12
+R2_COPYPEN = 13
+R2_MERGEPENNOT = 14
+R2_MERGEPEN = 15
+R2_WHITE = 16
+;
+; Ternary raster ops
+;
+SRCCOPY_L = 0020h ;dest=source
+SRCCOPY_H = 00CCh
+SRCPAINT_L = 0086h ;dest=source OR dest
+SRCPAINT_H = 00EEh
+SRCAND_L = 00C6h ;dest=source AND dest
+SRCAND_H = 0088h
+SRCINVERT_L = 0046h ;dest= source XOR dest
+SRCINVERT_H = 0066h
+SRCERASE_L = 0328h ;dest= source AND (not dest )
+SRCERASE_H = 0044h
+NOTSRCCOPY_L = 0008h ;dest= (not source)
+NOTSRCCOPY_H = 0033h
+NOTSRCERASE_L = 00A6h ;dest= (not source) AND (not dest)
+NOTSRCERASE_H = 0011h
+MERGECOPY_L = 00CAh ;dest= (source AND pattern)
+MERGECOPY_H = 00C0h
+MERGEPAINT_L = 0226h ;dest= (source AND pattern) OR dest
+MERGEPAINT_H = 00BBh
+PATCOPY_L = 0021h ;dest= pattern
+PATCOPY_H = 00F0h
+PATPAINT_L = 0A09h ;DPSnoo
+PATPAINT_H = 00FBh
+PATINVERT_L = 0049h ;dest= pattern XOR dest
+PATINVERT_H = 005Ah
+DSTINVERT_L = 0009h ;dest= (not dest)
+DSTINVERT_H = 0055h
+BLACKNESS_L = 0042h ;dest= BLACK
+BLACKNESS_H = 0000h
+WHITENESS_L = 0062h ;dest= WHITE
+WHITENESS_H = 00FFh
+;
+; StretchBlt modes
+;
+BLACKONWHITE = 1
+WHITEONBLACK = 2
+COLORONCOLOR = 3
+;
+; New StretchBlt modes
+;
+STRETCH_ANDSCANS = 1
+STRETCH_ORSCANS = 2
+STRETCH_DELETESCANS = 3
+;
+; PolyFill modes
+;
+ALTERNATE = 1
+WINDING = 2
+ENDIF
+;
+; Text Alignment Options
+;
+TA_NOUPDATECP = 0
+TA_UPDATECP = 1
+
+TA_LEFT = 0
+TA_RIGHT = 2
+TA_CENTER = 6
+
+TA_TOP = 0
+TA_BOTTOM = 8
+TA_BASELINE = 24
+
+ETO_GRAYED = 1
+ETO_OPAQUE = 2
+ETO_CLIPPED = 4
+
+ASPECT_FILTERING = 1
+
+ifndef NOMETAFILE
+
+; Metafile Functions */
+META_SETBKCOLOR = 0201h
+META_SETBKMODE = 0102h
+META_SETMAPMODE = 0103h
+META_SETROP2 = 0104h
+META_SETRELABS = 0105h
+META_SETPOLYFILLMODE = 0106h
+META_SETSTRETCHBLTMODE = 0107h
+META_SETTEXTCHAREXTRA = 0108h
+META_SETTEXTCOLOR = 0209h
+META_SETTEXTJUSTIFICATION = 020Ah
+META_SETWINDOWORG = 020Bh
+META_SETWINDOWEXT = 020Ch
+META_SETVIEWPORTORG = 020Dh
+META_SETVIEWPORTEXT = 020Eh
+META_OFFSETWINDOWORG = 020Fh
+META_SCALEWINDOWEXT = 0400h
+META_OFFSETVIEWPORTORG = 0211h
+META_SCALEVIEWPORTEXT = 0412h
+META_LINETO = 0213h
+META_MOVETO = 0214h
+META_EXCLUDECLIPRECT = 0415h
+META_INTERSECTCLIPRECT = 0416h
+META_ARC = 0817h
+META_ELLIPSE = 0418h
+META_FLOODFILL = 0419h
+META_PIE = 081Ah
+META_RECTANGLE = 041Bh
+META_ROUNDRECT = 061Ch
+META_PATBLT = 061Dh
+META_SAVEDC = 001Eh
+META_SETPIXEL = 041Fh
+META_OFFSETCLIPRGN = 0220h
+META_TEXTOUT = 0521h
+META_BITBLT = 0922h
+META_STRETCHBLT = 0B23h
+META_POLYGON = 0324h
+META_POLYLINE = 0325h
+META_ESCAPE = 0626h
+META_RESTOREDC = 0127h
+META_FILLREGION = 0228h
+META_FRAMEREGION = 0429h
+META_INVERTREGION = 012Ah
+META_PAINTREGION = 012Bh
+META_SELECTCLIPREGION = 012Ch
+META_SELECTOBJECT = 012Dh
+META_SETTEXTALIGN = 012Eh
+META_DRAWTEXT = 062Fh
+
+META_CHORD = 0830h
+META_SETMAPPERFLAGS = 0231h
+META_EXTTEXTOUT = 0a32h
+META_SETDIBTODEV = 0d33h
+META_SELECTPALETTE = 0234h
+META_REALIZEPALETTE = 0035h
+META_ANIMATEPALETTE = 0436h
+META_SETPALENTRIES = 0037h
+META_POLYPOLYGON = 0538h
+META_RESIZEPALETTE = 0139h
+
+META_DIBBITBLT = 0940h
+META_DIBSTRETCHBLT = 0b41h
+META_DIBCREATEPATTERNBRUSH = 0142h
+META_STRETCHDIB = 0f43h
+
+META_DELETEOBJECT = 01f0h
+
+META_CREATEPALETTE = 00f7h
+META_CREATEBRUSH = 00F8h
+META_CREATEPATTERNBRUSH = 01F9h
+META_CREATEPENINDIRECT = 02FAh
+META_CREATEFONTINDIRECT = 02FBh
+META_CREATEBRUSHINDIRECT = 02FCh
+META_CREATEBITMAPINDIRECT = 02FDh
+META_CREATEBITMAP = 06FEh
+META_CREATEREGION = 06FFh
+
+; /* Clipboard Metafile Picture Structure */
+HANDLETABLE struc
+ ht_objectHandle dw ?
+HANDLETABLE ends
+
+METARECORD struc
+ mr_rdSize dd ?
+ mr_rdFunction dw ?
+ mr_rdParm dw ?
+METARECORD ends
+
+METAFILEPICT struc
+ mfp_mm dw ?
+ mfp_xExt dw ?
+ mfp_yExt dw ?
+ mfp_hMF dw ?
+METAFILEPICT ends
+
+METAHEADER struc
+ mtType dw ?
+ mtHeaderSize dw ?
+ mtVersion dw ?
+ mtSize dd ?
+ mtNoObjects dw ?
+ mtMaxRecord dd ?
+ mtNoParameters dw ?
+METAHEADER ends
+
+endif ; NOMETAFILE
+
+; GDI Escapes
+NEWFRAME = 1
+ABORTDOC = 2
+NEXTBAND = 3
+SETCOLORTABLE = 4
+GETCOLORTABLE = 5
+FLUSHOUTPUT = 6
+DRAFTMODE = 7
+QUERYESCSUPPORT = 8
+SETABORTPROC = 9
+STARTDOC = 10
+;; This value conflicts with a std WIN386 MACRO definition
+;;ENDDOC = 11
+GETPHYSPAGESIZE = 12
+GETPRINTINGOFFSET = 13
+GETSCALINGFACTOR = 14
+MFCOMMENT = 15
+GETPENWIDTH = 16
+SETCOPYCOUNT = 17
+SELECTPAPERSOURCE = 18
+DEVICEDATA = 19
+PASSTHROUGH = 19
+GETTECHNOLGY = 20
+GETTECHNOLOGY = 20
+SETENDCAP = 21
+SETLINEJOIN = 22
+SETMITERLIMIT = 23
+BANDINFO = 24
+DRAWPATTERNRECT = 25
+GETVECTORPENSIZE = 26
+GETVECTORBRUSHSIZE = 27
+ENABLEDUPLEX = 28
+ENABLEMANUALFEED = 29
+GETSETPAPERBINS = 29
+GETSETPRINTORIENT = 30
+ENUMPAPERBINS = 31
+
+GETEXTENDEDTEXTMETRICS = 256
+GETEXTENTTABLE = 257
+GETPAIRKERNTABLE = 258
+GETTRACKKERNTABLE = 259
+
+EXTTEXTOUT = 512
+
+ENABLERELATIVEWIDTHS = 768
+ENABLEPAIRKERNING = 769
+SETKERNTRACK = 770
+SETALLJUSTVALUES = 771
+SETCHARSET = 772
+
+GETSETSCREENPARAMS = 3072
+
+STRETCHBLT = 2048
+
+
+; Spooler Error Codes
+SP_NOTREPORTED = 4000h
+SP_ERROR = (-1)
+SP_APPABORT = (-2)
+SP_USERABORT = (-3)
+SP_OUTOFDISK = (-4)
+SP_OUTOFMEMORY = (-5)
+
+PR_JOBSTATUS = 0000
+
+; Object Definitions for EnumObjects()
+OBJ_PEN = 1
+OBJ_BRUSH = 2
+
+;
+; Menu flags for Change/Check/Enable MenuItem
+;
+MF_INSERT = 0000h
+MF_CHANGE = 0080h
+MF_APPEND = 0100h
+MF_DELETE = 0200h
+MF_REMOVE = 1000h
+
+MF_BYCOMMAND = 0000h
+MF_BYPOSITION = 0400h
+
+MF_SEPARATOR = 0800h
+
+MF_ENABLED = 0000h
+MF_GRAYED = 0001h
+MF_DISABLED = 0002h
+
+MF_UNCHECKED = 0000h
+MF_CHECKED = 0008h
+MF_USECHECKBITMAPS= 0200h
+
+MF_STRING = 0000h
+MF_BITMAP = 0004h
+MF_OWNERDRAW = 0100h
+
+MF_POPUP = 0010h
+MF_MENUBARBREAK = 0020h
+MF_MENUBREAK = 0040h
+
+MF_UNHILITE = 0000h
+MF_HILITE = 0080h
+
+MF_SYSMENU = 2000h
+MF_HELP = 4000h
+MF_MOUSESELECT = 8000h
+
+
+;
+; System Menu Command Values
+;
+SC_SIZE = 0F000h
+SC_MOVE = 0F010h
+SC_MINIMIZE = 0F020h
+SC_MAXIMIZE = 0F030h
+SC_NEXTWINDOW = 0F040h
+SC_PREVWINDOW = 0F050h
+SC_CLOSE = 0F060h
+SC_VSCROLL = 0F070h
+SC_HSCROLL = 0F080h
+SC_MOUSEMENU = 0F090h
+SC_KEYMENU = 0F100h
+SC_ARRANGE = 0F110h
+SC_RESTORE = 0F120h
+SC_TASKLIST = 0F130h
+SC_SCREENSAVE = 0F140h
+SC_HOTKEY = 0F150h
+
+SC_ICON = SC_MINIMIZE
+SC_ZOOM = SC_MAXIMIZE
+
+;
+; Window State Messages
+;
+IFNDEF NOWM
+WM_STATE = 0000H
+
+WM_NULL = 0000h
+WM_CREATE = 0001h
+WM_DESTROY = 0002h
+WM_MOVE = 0003h
+WM_SIZE = 0005h
+WM_ACTIVATE = 0006h
+WM_SETFOCUS = 0007h
+WM_KILLFOCUS = 0008h
+WM_ENABLE = 000Ah
+WM_SETREDRAW = 000Bh
+WM_SETTEXT = 000Ch
+WM_GETTEXT = 000Dh
+WM_GETTEXTLENGTH = 000Eh
+WM_PAINT = 000Fh
+WM_CLOSE = 0010h
+WM_QUERYENDSESSION = 0011h
+WM_QUIT = 0012h
+WM_QUERYOPEN = 0013h
+WM_ERASEBKGND = 0014h
+WM_SYSCOLORCHANGE = 0015h
+WM_ENDSESSION = 0016h
+WM_SYSTEMERROR = 0017h
+WM_SHOWWINDOW = 0018h
+WM_CTLCOLOR = 0019h
+WM_WININICHANGE = 001Ah
+WM_DEVMODECHANGE = 001Bh
+WM_ACTIVATEAPP = 001Ch
+WM_FONTCHANGE = 001Dh
+WM_TIMECHANGE = 001Eh
+WM_CANCELMODE = 001Fh
+WM_SETCURSOR = 0020h
+WM_MOUSEACTIVATE = 0021h
+WM_CHILDACTIVATE = 0022h
+WM_QUEUESYNC = 0023h
+WM_GETMINMAXINFO = 0024h
+WM_PAINTICON = 0026h
+WM_ICONERASEBKGND = 0027h
+WM_NEXTDLGCTL = 0028h
+WM_SPOOLERSTATUS = 002Ah
+WM_DRAWITEM = 002Bh
+WM_MEASUREITEM = 002Ch
+WM_DELETEITEM = 002Dh
+WM_VKEYTOITEM = 002Eh
+WM_CHARTOITEM = 002Fh
+WM_SETFONT = 0030h
+WM_GETFONT = 0031h
+WM_QUERYDRAGICON = 0037h
+WM_COMPAREITEM = 0039h
+WM_COMPACTING = 0041h
+IFNDEF NOWIN31
+WM_COMMNOTIFY = 0044h
+WM_WINDOWPOSCHANGING= 0046h
+WM_WINDOWPOSCHANGED = 0047h
+WM_POWER = 0048h
+ENDIF
+
+
+WM_NCCREATE = 0081h
+WM_NCDESTROY = 0082h
+WM_NCCALCSIZE = 0083h
+WM_NCHITTEST = 0084h
+WM_NCPAINT = 0085h
+WM_NCACTIVATE = 0086h
+WM_GETDLGCODE = 0087h
+WM_NCMOUSEMOVE = 00A0h
+WM_NCLBUTTONDOWN = 00A1h
+WM_NCLBUTTONUP = 00A2h
+WM_NCLBUTTONDBLCLK = 00A3h
+WM_NCRBUTTONDOWN = 00A4h
+WM_NCRBUTTONUP = 00A5h
+WM_NCRBUTTONDBLCLK = 00A6h
+WM_NCMBUTTONDOWN = 00A7h
+WM_NCMBUTTONUP = 00A8h
+WM_NCMBUTTONDBLCLK = 00A9h
+
+WM_KEYFIRST = 0100h
+WM_KEYDOWN = 0100h
+WM_KEYUP = 0101h
+WM_CHAR = 0102h
+WM_DEADCHAR = 0103h
+WM_SYSKEYDOWN = 0104h
+WM_SYSKEYUP = 0105h
+WM_SYSCHAR = 0106h
+WM_SYSDEADCHAR = 0107h
+WM_KEYLAST = 0108h
+
+WM_INITDIALOG = 0110h
+WM_COMMAND = 0111h
+WM_SYSCOMMAND = 0112h
+WM_TIMER = 0113h
+WM_HSCROLL = 0114h
+WM_VSCROLL = 0115h
+WM_INITMENU = 0116h
+WM_INITMENUPOPUP = 0117h
+WM_MENUSELECT = 011Fh
+WM_MENUCHAR = 0120h
+WM_ENTERIDLE = 0121h
+
+
+WM_MOUSEFIRST = 0200h
+WM_MOUSEMOVE = 0200h
+WM_LBUTTONDOWN = 0201h
+WM_LBUTTONUP = 0202h
+WM_LBUTTONDBLCLK = 0203h
+WM_RBUTTONDOWN = 0204h
+WM_RBUTTONUP = 0205h
+WM_RBUTTONDBLCLK = 0206h
+WM_MBUTTONDOWN = 0207h
+WM_MBUTTONUP = 0208h
+WM_MBUTTONDBLCLK = 0209h
+WM_MOUSELAST = 0209h
+
+WM_PARENTNOTIFY = 0210h
+WM_MDICREATE = 0220h
+WM_MDIDESTROY = 0221h
+WM_MDIACTIVATE = 0222h
+WM_MDIRESTORE = 0223h
+WM_MDINEXT = 0224h
+WM_MDIMAXIMIZE = 0225h
+WM_MDITILE = 0226h
+WM_MDICASCADE = 0227h
+WM_MDIICONARRANGE = 0228h
+WM_MDIGETACTIVE = 0229h
+WM_MDISETMENU = 0230h
+WM_DROPFILES = 0233h
+
+
+WM_CUT = 0300h
+WM_COPY = 0301h
+WM_PASTE = 0302h
+WM_CLEAR = 0303h
+WM_UNDO = 0304h
+WM_RENDERFORMAT = 0305h
+WM_RENDERALLFORMATS = 0306h
+WM_DESTROYCLIPBOARD = 0307h
+WM_DRAWCLIPBOARD = 0308h
+WM_PAINTCLIPBOARD = 0309h
+WM_VSCROLLCLIPBOARD = 030Ah
+WM_SIZECLIPBOARD = 030Bh
+WM_ASKCBFORMATNAME = 030Ch
+WM_CHANGECBCHAIN = 030Dh
+WM_HSCROLLCLIPBOARD = 030Eh
+WM_QUERYNEWPALETTE = 030Fh
+WM_PALETTEISCHANGING = 0310h
+WM_PALETTECHANGED = 0311h
+
+IFNDEF NOWIN31
+WM_PENWINFIRST equ 0380h
+WM_PENWINLAST equ 038Fh
+
+
+WM_COALESCE_FIRST equ 0390h
+WM_COALESCE_LAST equ 039Fh
+
+
+
+
+ENDIF
+
+
+
+; private window messages start here
+WM_USER = 0400H
+ENDIF ; NOWM
+
+; WM_MOUSEACTIVATE Return Codes
+MA_ACTIVATE = 1
+MA_ACTIVATEANDEAT = 2
+MA_NOACTIVATE = 3
+
+; Size message commands
+SIZENORMAL = 0
+SIZEICONIC = 1
+SIZEFULLSCREEN = 2
+SIZEZOOMSHOW = 3
+SIZEZOOMHIDE = 4
+
+; ShowWindow() Commands
+SW_HIDE = 0
+SW_SHOWNORMAL = 1
+SW_NORMAL = 1
+SW_SHOWMINIMIZED = 2
+SW_SHOWMAXIMIZED = 3
+SW_MAXIMIZE = 3
+SW_SHOWNOACTIVATE = 4
+SW_SHOW = 5
+SW_MINIMIZE = 6
+SW_SHOWMINNOACTIVE = 7
+SW_SHOWNA = 8
+SW_RESTORE = 9
+
+; Old ShowWindow() Commands
+HIDE_WINDOW = 0
+SHOW_OPENWINDOW = 1
+SHOW_ICONWINDOW = 2
+SHOW_FULLSCREEN = 3
+SHOW_OPENNOACTIVATE= 4
+
+; identifiers for the WM_SHOWWINDOW message
+SW_PARENTCLOSING = 1
+SW_OTHERZOOM = 2
+SW_PARENTOPENING = 3
+SW_OTHERUNZOOM = 4
+;
+; Key state masks for mouse messages
+;
+MK_LBUTTON = 0001h
+MK_RBUTTON = 0002h
+MK_SHIFT = 0004h
+MK_CONTROL = 0008h
+MK_MBUTTON = 0010h
+;
+; Class styles
+;
+CS_VREDRAW = 0001h
+CS_HREDRAW = 0002h
+CS_KEYCVTWINDOW = 0004H
+CS_DBLCLKS = 0008h
+; 0010h reserved
+CS_OWNDC = 0020h
+CS_CLASSDC = 0040h
+CS_PARENTDC = 0080h
+CS_NOKEYCVT = 0100h
+CS_SAVEBITS = 0800h
+CS_NOCLOSE = 0200h
+CS_BYTEALIGNCLIENT = 1000h
+CS_BYTEALIGNWINDOW = 2000h
+CS_GLOBALCLASS = 4000h ; Global window class
+
+;
+; Special CreateWindow position value
+;
+CW_USEDEFAULT EQU 8000h
+
+;
+; Windows styles (the high words)
+;
+WS_OVERLAPPED = 00000h
+WS_ICONICPOPUP = 0C000h
+WS_POPUP = 08000h
+WS_CHILD = 04000h
+WS_MINIMIZE = 02000h
+WS_VISIBLE = 01000h
+WS_DISABLED = 00800h
+WS_CLIPSIBLINGS = 00400h
+WS_CLIPCHILDREN = 00200h
+WS_MAXIMIZE = 00100h
+WS_CAPTION = 000C0h ; WS_BORDER | WS_DLGFRAME
+WS_BORDER = 00080h
+WS_DLGFRAME = 00040h
+WS_VSCROLL = 00020h
+WS_HSCROLL = 00010h
+WS_SYSMENU = 00008h
+WS_THICKFRAME = 00004h
+WS_HREDRAW = 00002h
+WS_VREDRAW = 00001h
+WS_GROUP = 00002h
+WS_TABSTOP = 00001h
+WS_MINIMIZEBOX = 00002h
+WS_MAXIMIZEBOX = 00001h
+
+; Common Window Styles
+
+WS_OVERLAPPEDWINDOW = WS_OVERLAPPED + WS_CAPTION + WS_SYSMENU + WS_THICKFRAME + WS_MINIMIZEBOX + WS_MAXIMIZEBOX
+WS_POPUPWINDOW = WS_POPUP + WS_BORDER + WS_SYSMENU
+WS_CHILDWINDOW = WS_CHILD
+WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
+
+WS_TILED = WS_OVERLAPPED
+WS_ICONIC = WS_MINIMIZE
+WS_SIZEBOX = WS_THICKFRAME
+
+; Extended Window Styles (low words)
+WS_EX_DLGMODALFRAME = 0001
+WS_EX_DRAGOBJECT = 0002
+WS_EX_NOPARENTNOTIFY = 0004
+WS_EX_TOPMOST = 0008
+
+;
+; predefined clipboard formats
+;
+CF_TEXT = 1
+CF_BITMAP = 2
+CF_METAFILEPICT = 3
+CF_SYLK = 4
+CF_DIF = 5
+CF_TIFF = 6
+CF_OEMTEXT = 7
+CF_DIB = 8
+CF_PALETTE = 9
+CF_PENDATA = 10
+CF_RIFF = 11
+CF_WAVE = 12
+
+CF_OWNERDISPLAY = 80h ; owner display
+CF_DSPTEXT = 81h ; display text
+CF_DSPBITMAP = 82h ; display bitmap
+CF_DSPMETAFILEPICT = 83h ; display metafile
+;
+; Private clipboard format range
+;
+CF_PRIVATEFIRST = 200h ; Anything in this range doesn't
+CF_PRIVATELAST = 2ffh ; get GlobalFree'd
+CF_GDIOBJFIRST = 300h ; Anything in this range gets
+CF_GDIOBJLAST = 3ffh ; DeleteObject'ed
+
+
+MAKEINTRESOURCE MACRO a
+ mov ax,a
+ xor dx,dx
+ ENDM
+;
+; Predefined resource types
+;
+RT_CURSOR = 1 ; must be passed through MAKEINTRESOURCE
+RT_BITMAP = 2
+RT_ICON = 3
+RT_MENU = 4
+RT_DIALOG = 5
+RT_STRING = 6
+RT_FONTDIR = 7
+RT_FONT = 8
+RT_ACCELERATOR = 9
+RT_RCDATA = 10
+
+;** NOTE: if any new resource types are introduced above this point, then the
+;** value of DIFFERENCE must be changed.
+;** (RT_GROUP_CURSOR - RT_CURSOR) must always be equal to DIFFERENCE
+;** (RT_GROUP_ICON - RT_ICON) must always be equal to DIFFERENCE
+
+DIFFERENCE = 11
+
+RT_GROUP_CURSOR = RT_CURSOR + DIFFERENCE
+RT_GROUP_ICON = RT_ICON + DIFFERENCE
+
+
+
+IFNDEF NOMDI
+MDICREATESTRUCT struc
+ szClass dd ?
+ szTitle dd ?
+ hOwner dw ?
+ x dw ?
+ y dw ?
+ cxc dw ?
+ cyc dw ?
+ style dd ?
+MDICREATESTRUCT ends
+
+CLIENTCREATESTRUCT struc
+ hWindowMenu dw ?
+ idFirstChild dw ?
+CLIENTCREATESTRUCT ends
+ENDIF
+
+; NOMDI
+
+
+PALETTEENTRY struc
+ peRed db ?
+ peGreen db ?
+ peBlue db ?
+ peFlags db ?
+PALETTEENTRY ends
+
+; Logical Palette
+LOGPALETTE struc
+ palVersion dw ?
+ palNumEntries dw ?
+ palPalEntry db ? ; array of PALETTEENTRY
+LOGPALETTE ends
+
+; DRAWITEMSTRUCT for ownerdraw
+DRAWITEMSTRUCT struc
+ drCtlType dw ?
+ drCtlID dw ?
+ dritemID dw ?
+ dritemAction dw ?
+ dritemState dw ?
+ drhwndItem dw ?
+ drhDC dw ?
+ drrcItem DB size RECT dup(?)
+ dritemData dd ?
+DRAWITEMSTRUCT ends
+
+; DELETEITEMSTRUCT for ownerdraw
+DELETEITEMSTRUCT struc
+ deCtlType dw ?
+ deCtlID dw ?
+ deitemID dw ?
+ dehwndItem dw ?
+ deitemData dd ?
+DELETEITEMSTRUCT ends
+
+; MEASUREITEMSTRUCT for ownerdraw
+MEASUREITEMSTRUCT struc
+ meCtlType dw ?
+ meCtlID dw ?
+ meitemID dw ?
+ meitemWidth dw ?
+ meitemHeight dw ?
+ meitemData dd ?
+MEASUREITEMSTRUCT ends
+
+; COMPAREITEMSTUCT for ownerdraw sorting
+COMPAREITEMSTRUCT struc
+ coCtlType dw ?
+ coCtlID dw ?
+ cohwndItem dw ?
+ coitemID1 dw ?
+ coitemData1 dd ?
+ coitemID2 dw ?
+ coitemData2 dd ?
+COMPAREITEMSTRUCT ends
+
+; Owner draw control types
+ODT_MENU = 1
+ODT_LISTBOX = 2
+ODT_COMBOBOX = 3
+ODT_BUTTON = 4
+
+; Owner draw actions
+ODA_DRAWENTIRE = 1
+ODA_SELECT = 2
+ODA_FOCUS = 4
+
+; Owner draw state
+ODS_SELECTED = 0001h
+ODS_GRAYED = 0002h
+ODS_DISABLED = 0004h
+ODS_CHECKED = 0008h
+ODS_FOCUS = 0010h
+
+; PeekMessage() Options
+PM_NOREMOVE = 0000h
+PM_REMOVE = 0001h
+PM_NOYIELD = 0002h
+
+; SetWindowPos Flags
+SWP_NOSIZE = 0001h
+SWP_NOMOVE = 0002h
+SWP_NOZORDER = 0004h
+SWP_NOREDRAW = 0008h
+SWP_NOACTIVATE = 0010h
+SWP_DRAWFRAME = 0020h
+SWP_SHOWWINDOW = 0040h
+SWP_HIDEWINDOW = 0080h
+SWP_NOCOPYBITS = 0100h
+SWP_NOREPOSITION = 0200h
+
+
+IFNDEF NOWINMESSAGES
+
+; Listbox messages
+LB_ADDSTRING = (WM_USER+1)
+LB_INSERTSTRING = (WM_USER+2)
+LB_DELETESTRING = (WM_USER+3)
+LB_RESETCONTENT = (WM_USER+5)
+LB_SETSEL = (WM_USER+6)
+LB_SETCURSEL = (WM_USER+7)
+LB_GETSEL = (WM_USER+8)
+LB_GETCURSEL = (WM_USER+9)
+LB_GETTEXT = (WM_USER+10)
+LB_GETTEXTLEN = (WM_USER+11)
+LB_GETCOUNT = (WM_USER+12)
+LB_SELECTSTRING = (WM_USER+13)
+LB_DIR = (WM_USER+14)
+LB_GETTOPINDEX = (WM_USER+15)
+LB_FINDSTRING = (WM_USER+16)
+LB_GETSELCOUNT = (WM_USER+17)
+LB_GETSELITEMS = (WM_USER+18)
+LB_SETTABSTOPS = (WM_USER+19)
+LB_GETHORIZONTALEXTENT = (WM_USER+20)
+LB_SETHORIZONTALEXTENT = (WM_USER+21)
+LB_SETTOPINDEX = (WM_USER+24)
+LB_GETITEMRECT = (WM_USER+25)
+LB_GETITEMDATA = (WM_USER+26)
+LB_SETITEMDATA = (WM_USER+27)
+LB_SELITEMRANGE = (WM_USER+28)
+LB_SETCARETINDEX = (WM_USER+31)
+LB_GETCARETINDEX = (WM_USER+32)
+IFNDEF NOWIN31
+LB_SETITEMHEIGHT = (WM_USER+33)
+LB_GETITEMHEIGHT = (WM_USER+34)
+LB_FINDSTRINGEXACT = (WM_USER+35)
+ENDIF
+
+ENDIF
+; NOWINMESSAGES
+
+; Listbox Styles
+LBS_NOTIFY = 0001h
+LBS_SORT = 0002h
+LBS_NOREDRAW = 0004h
+LBS_MULTIPLESEL = 0008h
+LBS_OWNERDRAWFIXED = 0010h
+LBS_OWNERDRAWVARIABLE = 0020h
+LBS_HASSTRINGS = 0040h
+LBS_USETABSTOPS = 0080h
+LBS_NOINTEGRALHEIGHT = 0100h
+LBS_MULTICOLUMN = 0200h
+LBS_WANTKEYBOARDINPUT = 0400h
+LBS_EXTENDEDSEL = 0800h
+LBS_STANDARD = LBS_NOTIFY + LBS_SORT + WS_VSCROLL + WS_BORDER
+LBS_DISABLENOSCROLL = 1000h
+
+; Listbox Notification Codes
+LBN_ERRSPACE = (-2)
+LBN_SELCHANGE = 1
+LBN_DBLCLK = 2
+LBN_SELCANCEL = 3
+LBN_SETFOCUS = 4
+LBN_KILLFOCUS = 5
+
+IFNDEF NOWINMESSAGES
+
+; Edit Control Messages
+EM_GETSEL = (WM_USER+0)
+EM_SETSEL = (WM_USER+1)
+EM_GETRECT = (WM_USER+2)
+EM_SETRECT = (WM_USER+3)
+EM_SETRECTNP = (WM_USER+4)
+EM_SCROLL = (WM_USER+5)
+EM_LINESCROLL = (WM_USER+6)
+EM_GETMODIFY = (WM_USER+8)
+EM_SETMODIFY = (WM_USER+9)
+EM_GETLINECOUNT = (WM_USER+10)
+EM_LINEINDEX = (WM_USER+11)
+EM_SETHANDLE = (WM_USER+12)
+EM_GETHANDLE = (WM_USER+13)
+EM_LINELENGTH = (WM_USER+17)
+EM_REPLACESEL = (WM_USER+18)
+EM_SETFONT = (WM_USER+19)
+EM_GETLINE = (WM_USER+20)
+EM_LIMITTEXT = (WM_USER+21)
+EM_CANUNDO = (WM_USER+22)
+EM_UNDO = (WM_USER+23)
+EM_FMTLINES = (WM_USER+24)
+EM_LINEFROMCHAR = (WM_USER+25)
+EM_SETWORDBREAK = (WM_USER+26)
+EM_SETTABSTOPS = (WM_USER+27)
+EM_SETPASSWORDCHAR = (WM_USER+28)
+EM_EMPTYUNDOBUFFER = (WM_USER+29)
+IFNDEF NOWIN31
+EM_GETFIRSTVISIBLELINE = (WM_USER+30)
+EM_SETREADONLY = (WM_USER+31)
+EM_SETWORDBREAKPROC = (WM_USER+32)
+EM_GETWORDBREAKPROC = (WM_USER+33)
+EM_GETPASSWORDCHAR = (WM_USER+34)
+ENDIF
+
+ENDIF
+; NOWINMESSAGES
+
+
+; Edit Control Styles (low word)
+ES_LEFT = 0000h
+ES_CENTER = 0001h
+ES_RIGHT = 0002h
+ES_MULTILINE = 0004h
+ES_UPPERCASE = 0008h
+ES_LOWERCASE = 0010h
+ES_PASSWORD = 0020h
+ES_AUTOVSCROLL = 0040h
+ES_AUTOHSCROLL = 0080h
+ES_NOHIDESEL = 0100h
+ES_OEMCONVERT = 0400h
+IFNDEF NOWIN31
+ES_READONLY = 0800h
+ES_WANTRETURN = 1000h
+ENDIF
+
+
+; Edit Control Notification Codes
+EN_SETFOCUS = 0100h
+EN_KILLFOCUS = 0200h
+EN_CHANGE = 0300h
+EN_UPDATE = 0400h
+EN_ERRSPACE = 0500h
+EN_MAXTEXT = 0501h
+EN_HSCROLL = 0601h
+EN_VSCROLL = 0602h
+
+IFNDEF NOWINMESSAGES
+
+; Button Control Messages
+BM_GETCHECK = (WM_USER+0)
+BM_SETCHECK = (WM_USER+1)
+BM_GETSTATE = (WM_USER+2)
+BM_SETSTATE = (WM_USER+3)
+BM_SETSTYLE = (WM_USER+4)
+
+ENDIF
+; NOWINMESSAGES
+
+; Button Control Styles (low word)
+BS_PUSHBUTTON = 00h
+BS_DEFPUSHBUTTON = 01h
+BS_CHECKBOX = 02h
+BS_AUTOCHECKBOX = 03h
+BS_RADIOBUTTON = 04h
+BS_3STATE = 05h
+BS_AUTO3STATE = 06h
+BS_GROUPBOX = 07h
+BS_USERBUTTON = 08h
+BS_AUTORADIOBUTTON = 09h
+BS_OWNERDRAW = 0Bh
+BS_LEFTTEXT = 20h
+
+; User Button Notification Codes
+BN_CLICKED = 0
+BN_PAINT = 1
+BN_HILITE = 2
+BN_UNHILITE = 3
+BN_DISABLE = 4
+BN_DOUBLECLICKED = 5
+
+; Dialog Styles (low words)
+DS_ABSALIGN = 01h
+DS_SYSMODAL = 02h
+DS_LOCALEDIT = 20h ;/* Edit items get Local storage. */
+DS_SETFONT = 40h ;/* User specified font for Dlg controls */
+DS_MODALFRAME = 80h ;/* Can be combined with WS_CAPTION */
+DS_NOIDLEMSG = 100h ;/* WM_ENTERIDLE message will not be sent */
+
+IFNDEF NOWINMESSAGES
+
+; Dialog box messages
+DM_GETDEFID = (WM_USER+0)
+DM_SETDEFID = (WM_USER+1)
+
+ENDIF ;NOWINMESSAGES
+
+; Dialog Codes
+DLGC_WANTARROWS = 0001h ; /* Control wants arrow keys */
+DLGC_WANTTAB = 0002h ; /* Control wants tab keys */
+DLGC_WANTALLKEYS = 0004h ; /* Control wants all keys */
+DLGC_WANTMESSAGE = 0004h ; /* Pass message to control */
+DLGC_HASSETSEL = 0008h ; /* Understands EM_SETSEL message */
+DLGC_DEFPUSHBUTTON = 0010h ; /* Default pushbutton */
+DLGC_UNDEFPUSHBUTTON= 0020h ; /* Non-default pushbutton */
+DLGC_RADIOBUTTON = 0040h ; /* Radio button */
+DLGC_WANTCHARS = 0080h ; /* Want WM_CHAR messages */
+DLGC_STATIC = 0100h ; /* Static item: don't include */
+DLGC_BUTTON = 2000h ; /* Button item: can be checked */
+
+; Combo Box return Values
+CB_OKAY = 0
+CB_ERR = (-1)
+CB_ERRSPACE = (-2)
+
+; Combo Box Notification Codes
+CBN_ERRSPACE = (-1)
+CBN_SELCHANGE = 1
+CBN_DBLCLK = 2
+CBN_SETFOCUS = 3
+CBN_KILLFOCUS = 4
+CBN_EDITCHANGE = 5
+CBN_EDITUPDATE = 6
+CBN_DROPDOWN = 7
+
+; Combo Box styles (low words)
+CBS_SIMPLE = 0001h
+CBS_DROPDOWN = 0002h
+CBS_DROPDOWNLIST = 0003h
+CBS_OWNERDRAWFIXED = 0010h
+CBS_OWNERDRAWVARIABLE= 0020h
+CBS_AUTOHSCROLL = 0040h
+CBS_OEMCONVERT = 0080h
+CBS_SORT = 0100h
+CBS_HASSTRINGS = 0200h
+CBS_NOINTEGRALHEIGHT = 0400h
+
+IFNDEF NOWINMESSAGES
+
+; Combo Box messages
+CB_GETEDITSEL = (WM_USER+0)
+CB_LIMITTEXT = (WM_USER+1)
+CB_SETEDITSEL = (WM_USER+2)
+CB_ADDSTRING = (WM_USER+3)
+CB_DELETESTRING = (WM_USER+4)
+CB_DIR = (WM_USER+5)
+CB_GETCOUNT = (WM_USER+6)
+CB_GETCURSEL = (WM_USER+7)
+CB_GETLBTEXT = (WM_USER+8)
+CB_GETLBTEXTLEN = (WM_USER+9)
+CB_INSERTSTRING = (WM_USER+10)
+CB_RESETCONTENT = (WM_USER+11)
+CB_FINDSTRING = (WM_USER+12)
+CB_SELECTSTRING = (WM_USER+13)
+CB_SETCURSEL = (WM_USER+14)
+CB_SHOWDROPDOWN = (WM_USER+15)
+CB_GETITEMDATA = (WM_USER+16)
+CB_SETITEMDATA = (WM_USER+17)
+IFNDEF NOWIN31
+CB_GETDROPPEDCONTROLRECT = (WM_USER+18)
+CB_SETITEMHEIGHT = (WM_USER+19)
+CB_GETITEMHEIGHT = (WM_USER+20)
+CB_SETEXTENDEDUI = (WM_USER+21)
+CB_GETEXTENDEDUI = (WM_USER+22)
+CB_GETDROPPEDSTATE = (WM_USER+23)
+CB_FINDSTRINGEXACT = (WM_USER+24)
+ENDIF
+
+ENDIF ; NOWINMESSAGES
+
+; Static Control styles (low word)
+SS_LEFT = 00h
+SS_CENTER = 01h
+SS_RIGHT = 02h
+SS_ICON = 03h
+SS_BLACKRECT = 04h
+SS_GRAYRECT = 05h
+SS_WHITERECT = 06h
+SS_BLACKFRAME = 07h
+SS_GRAYFRAME = 08h
+SS_WHITEFRAME = 09h
+SS_SIMPLE = 0Bh
+SS_LEFTNOWORDWRAP = 0Ch
+SS_NOPREFIX = 80h ; Don't do "&" character translation
+
+IFNDEF NOWIN31
+IFNDEF NOWINMESSAGES
+
+;Static Control Messages
+STM_SETICON = (WM_USER+0)
+STM_GETICON = (WM_USER+1)
+ENDIF
+ENDIF
+
+; Scroll Bar Styles (low word)
+SBS_HORZ = 0000h
+SBS_VERT = 0001h
+SBS_TOPALIGN = 0002h
+SBS_LEFTALIGN = 0002h
+SBS_BOTTOMALIGN = 0004h
+SBS_RIGHTALIGN = 0004h
+SBS_SIZEBOXTOPLEFTALIGN = 0002h
+SBS_SIZEBOXBOTTOMRIGHTALIGN = 0004h
+SBS_SIZEBOX = 0008h
+
+IFNDEF NOSYSMETRICS
+
+; GetSystemMetrics() codes
+SM_CXSCREEN = 0
+SM_CYSCREEN = 1
+SM_CXVSCROLL = 2
+SM_CYHSCROLL = 3
+SM_CYCAPTION = 4
+SM_CXBORDER = 5
+SM_CYBORDER = 6
+SM_CXDLGFRAME = 7
+SM_CYDLGFRAME = 8
+SM_CYVTHUMB = 9
+SM_CXHTHUMB = 10
+SM_CXICON = 11
+SM_CYICON = 12
+SM_CXCURSOR = 13
+SM_CYCURSOR = 14
+SM_CYMENU = 15
+SM_CXFULLSCREEN = 16
+SM_CYFULLSCREEN = 17
+SM_CYKANJIWINDOW = 18
+SM_MOUSEPRESENT = 19
+SM_CYVSCROLL = 20
+SM_CXHSCROLL = 21
+SM_DEBUG = 22
+SM_SWAPBUTTON = 23
+SM_RESERVED1 = 24
+SM_RESERVED2 = 25
+SM_RESERVED3 = 26
+SM_RESERVED4 = 27
+SM_CXMIN = 28
+SM_CYMIN = 29
+SM_CXSIZE = 30
+SM_CYSIZE = 31
+SM_CXFRAME = 32
+SM_CYFRAME = 33
+SM_CXMINTRACK = 34
+SM_CYMINTRACK = 35
+IFNDEF NOWIN31
+SM_CXDOUBLECLK = 36
+SM_CYDOUBLECLK = 37
+SM_CXICONSPACING = 38
+SM_CYICONSPACING = 39
+SM_MENUDROPALIGNMENT = 40
+SM_PENWINDOWS = 41
+SM_DBCSENABLED = 42
+ENDIF
+SM_CMETRICSMAX = 43
+
+ENDIF ;NOSYSMETRICS
+
+IFNDEF NOCOLOR
+
+COLOR_SCROLLBAR = 0
+COLOR_BACKGROUND = 1
+COLOR_ACTIVECAPTION = 2
+COLOR_INACTIVECAPTION = 3
+COLOR_MENU = 4
+COLOR_WINDOW = 5
+COLOR_WINDOWFRAME = 6
+COLOR_MENUTEXT = 7
+COLOR_WINDOWTEXT = 8
+COLOR_CAPTIONTEXT = 9
+COLOR_ACTIVEBORDER = 10
+COLOR_INACTIVEBORDER = 11
+COLOR_APPWORKSPACE = 12
+COLOR_HIGHLIGHT = 13
+COLOR_HIGHLIGHTTEXT = 14
+COLOR_BTNFACE = 15
+COLOR_BTNSHADOW = 16
+COLOR_GRAYTEXT = 17
+COLOR_BTNTEXT = 18
+IFNDEF NOWIN31
+COLOR_INACTIVECAPTIONTEXT = 19
+COLOR_BTNHILIGHT = 20
+ENDIF
+ENDIF ;NOCOLOR
+
+; Commands to pass WinHelp()
+HELP_CONTEXT =0001h ;/* Display topic in ulTopic */
+HELP_QUIT =0002h ;/* Terminate help */
+HELP_INDEX =0003h ;/* Display index */
+HELP_HELPONHELP =0004h ;/* Display help on using help */
+HELP_SETINDEX =0005h ;/* Set the current Index for multi index help */
+HELP_KEY =0101h ;/* Display topic for keyword in offabData */
+
+IFNDEF NOCOMM
+
+NOPARITY = 0
+ODDPARITY = 1
+EVENPARITY = 2
+MARKPARITY = 3
+SPACEPARITY = 4
+
+ONESTOPBIT = 0
+ONE5STOPBITS = 1
+TWOSTOPBITS = 2
+
+IGNORE = 0 ; /* Ignore signal */
+INFINITE = 0FFFFh ; /* Infinite timeout */
+
+; Error Flags
+CE_RXOVER = 0001h ; /* Receive Queue overflow */
+CE_OVERRUN = 0002h ; /* Receive Overrun Error */
+CE_RXPARITY = 0004h ; /* Receive Parity Error */
+CE_FRAME = 0008h ; /* Receive Framing error */
+CE_BREAK = 0010h ; /* Break Detected */
+CE_CTSTO = 0020h ; /* CTS Timeout */
+CE_DSRTO = 0040h ; /* DSR Timeout */
+CE_RLSDTO = 0080h ; /* RLSD Timeout */
+CE_TXFULL = 0100h ; /* TX Queue is full */
+CE_PTO = 0200h ; /* LPTx Timeout */
+CE_IOE = 0400h ; /* LPTx I/O Error */
+CE_DNS = 0800h ; /* LPTx Device not selected */
+CE_OOP = 1000h ; /* LPTx Out-Of-Paper */
+CE_MODE = 8000h ; /* Requested mode unsupported */
+
+IE_BADID = (-1) ; /* Invalid or unsupported id */
+IE_OPEN = (-2) ; /* Device Already Open */
+IE_NOPEN = (-3) ; /* Device Not Open */
+IE_MEMORY = (-4) ; /* Unable to allocate queues */
+IE_DEFAULT = (-5) ; /* Error in default parameters */
+IE_HARDWARE = (-10) ; /* Hardware Not Present */
+IE_BYTESIZE = (-11) ; /* Illegal Byte Size */
+IE_BAUDRATE = (-12) ; /* Unsupported BaudRate */
+
+; Events
+EV_RXCHAR = 0001h ; /* Any Character received */
+EV_RXFLAG = 0002h ; /* Received certain character */
+EV_TXEMPTY = 0004h ; /* Transmitt Queue Empty */
+EV_CTS = 0008h ; /* CTS changed state */
+EV_DSR = 0010h ; /* DSR changed state */
+EV_RLSD = 0020h ; /* RLSD changed state */
+EV_BREAK = 0040h ; /* BREAK received */
+EV_ERR = 0080h ; /* Line status error occurred */
+EV_RING = 0100h ; /* Ring signal detected */
+EV_PERR = 0200h ; /* Printer error occured */
+EV_CTSS = 0400h ; /* CTS state */
+EV_DSRS = 0800h ; /* DSR state */
+EV_RLSDS = 1000h ; /* RLSD state */
+EV_RingTe = 2000h ; /* Ring Trailing Edge Indicator */
+
+
+; Escape Functions
+SETXOFF = 1 ; /* Simulate XOFF received */
+SETXON = 2 ; /* Simulate XON received */
+SETRTS = 3 ; /* Set RTS high */
+CLRRTS = 4 ; /* Set RTS low */
+SETDTR = 5 ; /* Set DTR high */
+CLRDTR = 6 ; /* Set DTR low */
+RESETDEV = 7 ; /* Reset device if possible */
+
+LPTx = 80h ; /* Set if ID is for LPT device */
+
+IFNDEF NOWIN31
+; new escape functions
+GETMAXLPT equ 8 ; Max supported LPT id
+GETMAXCOM equ 9 ; Max supported COM id
+GETBASEIRQ equ 10 ; Get port base & irq for a port
+
+; Comm Baud Rate indices
+CBR_110 equ 0FF10h
+CBR_300 equ 0FF11h
+CBR_600 equ 0FF12h
+CBR_1200 equ 0FF13h
+CBR_2400 equ 0FF14h
+CBR_4800 equ 0FF15h
+CBR_9600 equ 0FF16h
+CBR_14400 equ 0FF17h
+CBR_19200 equ 0FF18h
+; 0FF19h (reserved)
+; 0FF1Ah (reserved)
+CBR_38400 equ 0FF1Bh
+; 0FF1Ch (reserved)
+; 0FF1Dh (reserved)
+; 0FF1Eh (reserved)
+CBR_56000 equ 0FF1Fh
+; 0FF20h (reserved)
+; 0FF21h (reserved)
+; 0FF22h (reserved)
+CBR_128000 equ 0FF23h
+; 0FF24h (reserved)
+; 0FF25h (reserved)
+; 0FF26h (reserved)
+CBR_256000 equ 0FF27h
+
+; notifications passed in low word of lParam on WM_COMMNOTIFY messages
+CN_RECEIVE equ 1 ; bytes are available in the input queue
+CN_TRANSMIT equ 2 ; fewer than wOutTrigger bytes still
+ ; remain in the output queue waiting
+ ; to be transmitted.
+CN_EVENT equ 4 ; an enabled event has occurred
+
+ENDIF
+
+
+DCB struc
+ DCB_Id db ? ; /* Internal Device ID */
+ DCB_BaudRate dw ? ; /* Baudrate at which runing */
+ DCB_ByteSize db ? ; /* Number of bits/byte, 4-8 */
+ DCB_Parity db ? ; /* 0-4=None,Odd,Even,Mark,Space */
+ DCB_StopBits db ? ; /* 0,1,2 = 1, 1.5, 2 */
+ DCB_RlsTimeout dw ? ; /* Timeout for RLSD to be set */
+ DCB_CtsTimeout dw ? ; /* Timeout for CTS to be set */
+ DCB_DsrTimeout dw ? ; /* Timeout for DSR to be set */
+
+ DCB_BitMask1 db ?
+
+ ; BYTE fBinary: 1; /* Binary Mode (skip EOF check */
+ ; BYTE fRtsDisable:1; /* Don't assert RTS at init time */
+ ; BYTE fParity: 1; /* Enable parity checking */
+ ; BYTE fOutxCtsFlow:1; /* CTS handshaking on output */
+ ; BYTE fOutxDsrFlow:1; /* DSR handshaking on output */
+ ; BYTE fDummy: 2; /* Reserved */
+ ; BYTE fDtrDisable:1; /* Don't assert DTR at init time */
+
+ DCB_BitMask2 db ?
+
+ ; BYTE fOutX: 1; /* Enable output X-ON/X-OFF */
+ ; BYTE fInX: 1; /* Enable input X-ON/X-OFF */
+ ; BYTE fPeChar: 1; /* Enable Parity Err Replacement */
+ ; BYTE fNull: 1; /* Enable Null stripping */
+ ; BYTE fChEvt: 1; /* Enable Rx character event. */
+ ; BYTE fDtrflow: 1; /* DTR handshake on input */
+ ; BYTE fRtsflow: 1; /* RTS handshake on input */
+ ; BYTE fDummy2: 1;
+
+ DCB_XonChar db ? ; /* Tx and Rx X-ON character */
+ DCB_XoffChar db ? ; /* Tx and Rx X-OFF character */
+ DCB_XonLim dw ? ; /* Transmit X-ON threshold */
+ DCB_XoffLim dw ? ; /* Transmit X-OFF threshold */
+ DCB_PeChar db ? ; /* Parity error replacement char */
+ DCB_EofChar db ? ; /* End of Input character */
+ DCB_EvtChar db ? ; /* Recieved Event character */
+ DCB_TxDelay dw ? ; /* Amount of time between chars */
+DCB ends
+
+COMSTAT struc
+ COMS_BitMask1 db ?
+
+; BYTE fCtsHold: 1; /* Transmit is on CTS hold */
+; BYTE fDsrHold: 1; /* Transmit is on DSR hold */
+; BYTE fRlsdHold: 1; /* Transmit is on RLSD hold */
+; BYTE fXoffHold: 1; /* Received handshake */
+; BYTE fXoffSent: 1; /* Issued handshake */
+; BYTE fEof: 1; /* End of file character found */
+; BYTE fTxim: 1; /* Character being transmitted */
+
+
+ COMS_cbInQue dw ? ; /* count of characters in Rx Queue */
+ COMS_cbOutQue dw ? ; /* count of characters in Tx Queue */
+COMSTAT ends
+
+ENDIF ;NOCOM
+
+;
+; Installable Driver Support
+;
+; Driver Messages
+DRV_LOAD = 0001h
+DRV_ENABLE = 0002h
+DRV_OPEN = 0003h
+DRV_CLOSE = 0004h
+DRV_DISABLE = 0005h
+DRV_FREE = 0006h
+DRV_CONFIGURE = 0007h
+DRV_QUERYCONFIGURE = 0008h
+DRV_INSTALL = 0009h
+DRV_REMOVE = 000Ah
+DRV_EXITSESSION = 000Bh
+DRV_POWER = 000Fh
+DRV_RESERVED = 0800h
+DRV_USER = 4000h
+
+;LPARAM of DRV_CONFIGURE message and return values
+DRVCONFIGINFO struc
+ DRVCNF_dwDCISize dw ?
+ DRVCNF_lpszDCISectionName dd ?
+ DRVCNF_lpszDCIAliasName dd ?
+DRVCONFIGINFO ends
+
+DRVCNF_CANCEL = 0000h
+DRVCNF_OK = 0001h
+DRVCNF_RESTART = 0002h
+
+
+IFNDEF NOKERNEL
+;
+; Common Kernel errors
+;
+ERR_GALLOC = 01030h ; GlobalAlloc Failed
+ERR_GREALLOC = 01031h ; GlobalReAlloc Failed
+ERR_GLOCK = 01032h ; GlobalLock Failed
+ERR_LALLOC = 01033h ; LocalAlloc Failed
+ERR_LREALLOC = 01034h ; LocalReAlloc Failed
+ERR_LLOCK = 01035h ; LocalLock Failed
+ERR_ALLOCRES = 01036h ; AllocResource Failed
+ERR_LOCKRES = 01037h ; LockResource Failed
+ERR_LOADMODULE = 01038h ; LoadModule failed
+
+;
+; Common User Errors
+;
+ERR_CREATEDLG = 01045h ; /* Create Dlg failure due to LoadMenu failure */
+ERR_CREATEDLG2 = 01046h ; /* Create Dlg failure due to CreateWindow Failure */
+ERR_REGISTERCLASS = 01047h ; /* RegisterClass failure due to Class already registered */
+ERR_DCBUSY = 01048h ; /* DC Cache is full */
+ERR_CREATEWND = 01049h ; /* Create Wnd failed due to class not found */
+ERR_STRUCEXTRA = 01050h ; /* Unallocated Extra space is used */
+ERR_LOADSTR = 01051h ; /* LoadString() failed */
+ERR_LOADMENU = 01052h ; /* LoadMenu Failed */
+ERR_NESTEDBEGINPAINT = 01053h ; /* Nested BeginPaint() calls */
+ERR_BADINDEX = 01054h ; /* Bad index to Get/Set Class/Window Word/Long */
+ERR_CREATEMENU = 01055h ; /* Error creating menu */
+
+;
+; Common GDI Errors
+;
+ERR_CREATEDC = 01070h ; /* CreateDC/CreateIC etc., failure */
+ERR_CREATEMETA = 01071h ; /* CreateMetafile failure */
+ERR_DELOBJSELECTED = 01072h ; /* Bitmap being deleted is selected into DC */
+ERR_SELBITMAP = 01073h ; /* Bitmap being selected is already selected elsewhere */
+
+ENDIF ;NOKERNEL
diff --git a/private/oleauto/tools/win16/hdos/c800/include/windowsx.h b/private/oleauto/tools/win16/hdos/c800/include/windowsx.h
new file mode 100644
index 000000000..d86138ad6
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/windowsx.h
@@ -0,0 +1,1109 @@
+/*****************************************************************************\
+* *
+* windowsx.h - Macro APIs, window message crackers, and control APIs *
+* *
+* Version 3.10 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_WINDOWSX
+#define _INC_WINDOWSX
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/****** KERNEL Macro APIs ****************************************************/
+
+#define GetInstanceModule(hInstance) \
+ GetModuleHandle((LPCSTR)MAKELP(0, hInstance))
+
+#define GlobalPtrHandle(lp) \
+ ((HGLOBAL)LOWORD(GlobalHandle(SELECTOROF(lp))))
+
+#define GlobalLockPtr(lp) \
+ ((BOOL)SELECTOROF(GlobalLock(GlobalPtrHandle(lp))))
+#define GlobalUnlockPtr(lp) \
+ GlobalUnlock(GlobalPtrHandle(lp))
+
+#define GlobalAllocPtr(flags, cb) \
+ (GlobalLock(GlobalAlloc((flags), (cb))))
+#define GlobalReAllocPtr(lp, cbNew, flags) \
+ (GlobalUnlockPtr(lp), GlobalLock(GlobalReAlloc(GlobalPtrHandle(lp) , (cbNew), (flags))))
+#define GlobalFreePtr(lp) \
+ (GlobalUnlockPtr(lp), (BOOL)GlobalFree(GlobalPtrHandle(lp)))
+
+/****** GDI Macro APIs *******************************************************/
+
+#define DeletePen(hpen) DeleteObject((HGDIOBJ)(HPEN)(hpen))
+#define SelectPen(hdc, hpen) ((HPEN)SelectObject((hdc), (HGDIOBJ)(HPEN)(hpen)))
+#define GetStockPen(i) ((HPEN)GetStockObject(i))
+
+#define DeleteBrush(hbr) DeleteObject((HGDIOBJ)(HBRUSH)(hbr))
+#define SelectBrush(hdc, hbr) ((HBRUSH)SelectObject((hdc), (HGDIOBJ)(HBRUSH)(hbr)))
+#define GetStockBrush(i) ((HBRUSH)GetStockObject(i))
+
+#define DeleteRgn(hrgn) DeleteObject((HGDIOBJ)(HRGN)(hrgn))
+
+#define CopyRgn(hrgnDst, hrgnSrc) CombineRgn(hrgnDst, hrgnSrc, 0, RGN_COPY)
+#define IntersectRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_AND)
+#define SubtractRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_DIFF)
+#define UnionRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_OR)
+#define XorRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_XOR)
+
+#define DeletePalette(hpal) DeleteObject((HGDIOBJ)(HPALETTE)(hpal))
+
+#define DeleteFont(hfont) DeleteObject((HGDIOBJ)(HFONT)(hfont))
+#define SelectFont(hdc, hfont) ((HFONT)SelectObject((hdc), (HGDIOBJ)(HFONT)(hfont)))
+#define GetStockFont(i) ((HFONT)GetStockObject(i))
+
+#define DeleteBitmap(hbm) DeleteObject((HGDIOBJ)(HBITMAP)(hbm))
+#define SelectBitmap(hdc, hbm) ((HBITMAP)SelectObject((hdc), (HGDIOBJ)(HBITMAP)(hbm)))
+
+#define InsetRect(lprc, dx, dy) InflateRect((lprc), -(dx), -(dy))
+
+/****** USER Macro APIs ******************************************************/
+
+#define GetWindowInstance(hwnd) ((HINSTANCE)GetWindowWord(hwnd, GWW_HINSTANCE))
+
+#define GetWindowStyle(hwnd) ((DWORD)GetWindowLong(hwnd, GWL_STYLE))
+#define GetWindowExStyle(hwnd) ((DWORD)GetWindowLong(hwnd, GWL_EXSTYLE))
+
+#define GetWindowOwner(hwnd) GetWindow(hwnd, GW_OWNER)
+
+#define GetFirstChild(hwnd) GetTopWindow(hwnd)
+#define GetFirstSibling(hwnd) GetWindow(hwnd, GW_HWNDFIRST)
+#define GetLastSibling(hwnd) GetWindow(hwnd, GW_HWNDLAST)
+#define GetNextSibling(hwnd) GetWindow(hwnd, GW_HWNDNEXT)
+#define GetPrevSibling(hwnd) GetWindow(hwnd, GW_HWNDPREV)
+
+#define GetWindowID(hwnd) GetDlgCtrlID(hwnd)
+
+#define SetWindowRedraw(hwnd, fRedraw) \
+ ((void)SendMessage(hwnd, WM_SETREDRAW, (WPARAM)(BOOL)(fRedraw), 0L))
+
+#define SubclassWindow(hwnd, lpfn) \
+ ((WNDPROC)SetWindowLong((hwnd), GWL_WNDPROC, (LPARAM)(WNDPROC)(lpfn)))
+
+#define IsMinimized(hwnd) IsIconic(hwnd)
+#define IsMaximized(hwnd) IsZoomed(hwnd)
+#define IsRestored(hwnd) ((GetWindowStyle(hwnd) & (WS_MINIMIZE | WS_MAXIMIZE)) == 0L)
+
+#define SetWindowFont(hwnd, hfont, fRedraw) FORWARD_WM_SETFONT((hwnd), (hfont), (fRedraw), SendMessage)
+
+#define GetWindowFont(hwnd) FORWARD_WM_GETFONT((hwnd), SendMessage)
+
+#if (WINVER >= 0x030a)
+#define MapWindowRect(hwndFrom, hwndTo, lprc) \
+ MapWindowPoints((hwndFrom), (hwndTo), (POINT FAR*)(lprc), 2)
+#endif /* WINVER >= 0x030a */
+
+#define IsLButtonDown() (GetKeyState(VK_LBUTTON) < 0)
+#define IsRButtonDown() (GetKeyState(VK_RBUTTON) < 0)
+#define IsMButtonDown() (GetKeyState(VK_MBUTTON) < 0)
+
+#define SubclassDialog(hwndDlg, lpfn) \
+ ((DLGPROC)SetWindowLong(hwndDlg, DWL_DLGPROC, (LPARAM)(DLGPROC)(lpfn)))
+
+#define SetDlgMsgResult(hwnd, msg, result) \
+ (((msg) == WM_CTLCOLOR || (msg) == WM_COMPAREITEM || (msg) == WM_VKEYTOITEM || \
+ (msg) == WM_CHARTOITEM || (msg) == WM_QUERYDRAGICON || (msg) == WM_INITDIALOG) \
+ ? (BOOL)LOWORD(result) : (SetWindowLong((hwnd), DWL_MSGRESULT, (LPARAM)(LRESULT)(result)), TRUE))
+
+#define DefDlgProcEx(hwnd, msg, wParam, lParam, pfRecursion) \
+ (*(pfRecursion) = TRUE, DefDlgProc(hwnd, msg, wParam, lParam))
+
+#define CheckDefDlgRecursion(pfRecursion) \
+ if (*(pfRecursion)) { *(pfRecursion) = FALSE; return FALSE; }
+
+/****** Message crackers ****************************************************/
+
+#define HANDLE_MSG(hwnd, message, fn) \
+ case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
+
+/* void Cls_OnCompacting(HWND hwnd, UINT compactRatio); */
+#define HANDLE_WM_COMPACTING(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam)), 0L)
+#define FORWARD_WM_COMPACTING(hwnd, compactRatio, fn) \
+ (void)(fn)((hwnd), WM_COMPACTING, (WPARAM)(UINT)(compactRatio), 0L)
+
+/* void Cls_OnWinIniChange(HWND hwnd, LPCSTR lpszSectionName); */
+#define HANDLE_WM_WININICHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_WININICHANGE(hwnd, lpszSectionName, fn) \
+ (void)(fn)((hwnd), WM_WININICHANGE, 0, (LPARAM)(LPCSTR)(lpszSectionName))
+
+/* void Cls_OnSysColorChange(HWND hwnd); */
+#define HANDLE_WM_SYSCOLORCHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_SYSCOLORCHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_SYSCOLORCHANGE, 0, 0L)
+
+/* BOOL Cls_OnQueryNewPalette(HWND hwnd); */
+#define HANDLE_WM_QUERYNEWPALETTE(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYNEWPALETTE(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYNEWPALETTE, 0, 0L)
+
+/* void Cls_OnPaletteIsChanging(HWND hwnd, HWND hwndPaletteChange); */
+#define HANDLE_WM_PALETTEISCHANGING(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_PALETTEISCHANGING(hwnd, hwndPaletteChange, fn) \
+ (void)(fn)((hwnd), WM_PALETTEISCHANGING, (WPARAM)(HWND)(hwndPaletteChange), 0L)
+
+/* void Cls_OnPaletteChanged(HWND hwnd, HWND hwndPaletteChange); */
+#define HANDLE_WM_PALETTECHANGED(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_PALETTECHANGED(hwnd, hwndPaletteChange, fn) \
+ (void)(fn)((hwnd), WM_PALETTECHANGED, (WPARAM)(HWND)(hwndPaletteChange), 0L)
+
+/* void Cls_OnFontChange(HWND hwnd); */
+#define HANDLE_WM_FONTCHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_FONTCHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_FONTCHANGE, 0, 0L)
+
+/* void Cls_OnSpoolerStatus(HWND hwnd, UINT status, int cJobInQueue); */
+#define HANDLE_WM_SPOOLERSTATUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SPOOLERSTATUS(hwnd, status, cJobInQueue, fn) \
+ (void)(fn)((hwnd), WM_SPOOLERSTATUS, (WPARAM)(status), MAKELPARAM((UINT)(cJobInQueue), 0))
+
+/* void Cls_OnDevModeChange(HWND hwnd, LPCSTR lpszDeviceName); */
+#define HANDLE_WM_DEVMODECHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_DEVMODECHANGE(hwnd, lpszDeviceName, fn) \
+ (void)(fn)((hwnd), WM_DEVMODECHANGE, 0,(LPARAM)(LPCSTR)(lpszDeviceName))
+
+/* void Cls_OnTimeChange(HWND hwnd); */
+#define HANDLE_WM_TIMECHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_TIMECHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_TIMECHANGE, 0, 0L)
+
+/* void Cls_OnPower(HWND hwnd, int code); */
+#define HANDLE_WM_POWER(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_POWER(hwnd, code, fn) \
+ (void)(fn)((hwnd), WM_POWER, (WPARAM)(code), 0L)
+
+/* BOOL Cls_OnQueryEndSession(HWND hwnd); */
+#define HANDLE_WM_QUERYENDSESSION(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYENDSESSION(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYENDSESSION, 0, 0L)
+
+/* void Cls_OnEndSession(HWND hwnd, BOOL fEnding); */
+#define HANDLE_WM_ENDSESSION(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_ENDSESSION(hwnd, fEnding, fn) \
+ (void)(fn)((hwnd), WM_ENDSESSION, (WPARAM)(BOOL)(fEnding), 0L)
+
+/* void Cls_OnQuit(HWND hwnd, int exitCode); */
+#define HANDLE_WM_QUIT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_QUIT(hwnd, exitCode, fn) \
+ (void)(fn)((hwnd), WM_QUIT, (WPARAM)(exitCode), 0L)
+
+/* void Cls_OnSystemError(HWND hwnd, int errCode); */
+#define HANDLE_WM_SYSTEMERROR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_SYSTEMERROR(hwnd, errCode, fn) \
+ (void)(fn)((hwnd), WM_SYSTEMERROR, (WPARAM)(errCode), 0L)
+
+/* BOOL Cls_OnCreate(HWND hwnd, CREATESTRUCT FAR* lpCreateStruct) */
+#define HANDLE_WM_CREATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (CREATESTRUCT FAR*)(lParam)) ? 0L : (LRESULT)-1L)
+#define FORWARD_WM_CREATE(hwnd, lpCreateStruct, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_CREATE, 0, (LPARAM)(CREATESTRUCT FAR*)(lpCreateStruct))
+
+/* BOOL Cls_OnNCCreate(HWND hwnd, CREATESTRUCT FAR* lpCreateStruct) */
+#define HANDLE_WM_NCCREATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (CREATESTRUCT FAR*)(lParam))
+#define FORWARD_WM_NCCREATE(hwnd, lpCreateStruct, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_NCCREATE, 0, (LPARAM)(CREATESTRUCT FAR*)(lpCreateStruct))
+
+/* void Cls_OnDestroy(HWND hwnd); */
+#define HANDLE_WM_DESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DESTROY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DESTROY, 0, 0L)
+
+/* void Cls_OnNCDestroy(HWND hwnd); */
+#define HANDLE_WM_NCDESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_NCDESTROY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_NCDESTROY, 0, 0L)
+
+/* void Cls_OnShowWindow(HWND hwnd, BOOL fShow, UINT status); */
+#define HANDLE_WM_SHOWWINDOW(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), LOWORD(lParam)), 0L)
+#define FORWARD_WM_SHOWWINDOW(hwnd, fShow, status, fn) \
+ (void)(fn)((hwnd), WM_SHOWWINDOW, (WPARAM)(BOOL)(fShow), MAKELPARAM((UINT)(status), 0))
+
+/* void Cls_OnSetRedraw(HWND hwnd, BOOL fRedraw); */
+#define HANDLE_WM_SETREDRAW(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_SETREDRAW(hwnd, fRedraw, fn) \
+ (void)(fn)((hwnd), WM_SETREDRAW, (WPARAM)(fRedraw), 0L)
+
+/* void Cls_OnEnable(HWND hwnd, BOOL fEnable); */
+#define HANDLE_WM_ENABLE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_ENABLE(hwnd, fEnable, fn) \
+ (void)(fn)((hwnd), WM_ENABLE, (WPARAM)(BOOL)(fEnable), 0L)
+
+/* void Cls_OnSetText(HWND hwnd, LPCSTR lpszText); */
+#define HANDLE_WM_SETTEXT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_SETTEXT(hwnd, lpszText, fn) \
+ (void)(fn)((hwnd), WM_SETTEXT, 0, (LPARAM)(LPCSTR)(lpszText))
+
+/* INT Cls_OnGetText(HWND hwnd, int cchTextMax, LPSTR lpszText) */
+#define HANDLE_WM_GETTEXT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (int)(wParam), (LPSTR)(lParam))
+#define FORWARD_WM_GETTEXT(hwnd, cchTextMax, lpszText, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_GETTEXT, (WPARAM)(int)(cchTextMax), (LPARAM)(LPSTR)(lpszText))
+
+/* INT Cls_OnGetTextLength(HWND hwnd); */
+#define HANDLE_WM_GETTEXTLENGTH(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)(hwnd)
+#define FORWARD_WM_GETTEXTLENGTH(hwnd, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_GETTEXTLENGTH, 0, 0L)
+
+/* BOOL Cls_OnWindowPosChanging(HWND hwnd, WINDOWPOS FAR* lpwpos); */
+#define HANDLE_WM_WINDOWPOSCHANGING(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (WINDOWPOS FAR*)(lParam))
+#define FORWARD_WM_WINDOWPOSCHANGING(hwnd, lpwpos, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_WINDOWPOSCHANGING, 0, (LPARAM)(WINDOWPOS FAR*)(lpwpos))
+
+/* void Cls_OnWindowPosChanged(HWND hwnd, const WINDOWPOS FAR* lpwpos); */
+#define HANDLE_WM_WINDOWPOSCHANGED(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const WINDOWPOS FAR*)(lParam)), 0L)
+#define FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, fn) \
+ (void)(fn)((hwnd), WM_WINDOWPOSCHANGED, 0, (LPARAM)(const WINDOWPOS FAR*)(lpwpos))
+
+/* void Cls_OnMove(HWND hwnd, int x, int y); */
+#define HANDLE_WM_MOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_MOVE(hwnd, x, y, fn) \
+ (void)(fn)((hwnd), WM_MOVE, 0, MAKELPARAM((int)(x), (int)(y)))
+
+/* void Cls_OnSize(HWND hwnd, UINT state, int cx, int cy); */
+#define HANDLE_WM_SIZE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SIZE(hwnd, state, cx, cy, fn) \
+ (void)(fn)((hwnd), WM_SIZE, (WPARAM)(UINT)(state), MAKELPARAM((int)(cx), (int)(cy)))
+
+/* void Cls_OnClose(HWND hwnd); */
+#define HANDLE_WM_CLOSE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CLOSE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CLOSE, 0, 0L)
+
+/* BOOL Cls_OnQueryOpen(HWND hwnd); */
+#define HANDLE_WM_QUERYOPEN(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYOPEN(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYOPEN, 0, 0L)
+
+/* void Cls_OnGetMinMaxInfo(HWND hwnd, MINMAXINFO FAR* lpMinMaxInfo); */
+#define HANDLE_WM_GETMINMAXINFO(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (MINMAXINFO FAR*)(lParam)), 0L)
+#define FORWARD_WM_GETMINMAXINFO(hwnd, lpMinMaxInfo, fn) \
+ (void)(fn)((hwnd), WM_GETMINMAXINFO, 0, (LPARAM)(MINMAXINFO FAR*)(lpMinMaxInfo))
+
+/* void Cls_OnPaint(HWND hwnd); */
+#define HANDLE_WM_PAINT(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_PAINT(hwnd, fn) \
+ (void)(fn)((hwnd), WM_PAINT, 0, 0L)
+
+/* BOOL Cls_OnEraseBkgnd(HWND hwnd, HDC hdc); */
+#define HANDLE_WM_ERASEBKGND(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HDC)(wParam))
+#define FORWARD_WM_ERASEBKGND(hwnd, hdc, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_ERASEBKGND, (WPARAM)(HDC)(hdc), 0L)
+
+/* BOOL Cls_OnIconEraseBkgnd(HWND hwnd, HDC hdc); */
+#define HANDLE_WM_ICONERASEBKGND(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HDC)(wParam))
+#define FORWARD_WM_ICONERASEBKGND(hwnd, hdc, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_ICONERASEBKGND, (WPARAM)(HDC)(hdc), 0L)
+
+/* void Cls_OnNCPaint(HWND hwnd, HRGN hrgn); */
+#define HANDLE_WM_NCPAINT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HRGN)(wParam)), 0L)
+#define FORWARD_WM_NCPAINT(hwnd, hrgn, fn) \
+ (void)(fn)((hwnd), WM_NCPAINT, (WPARAM)(HRGN)(hrgn), 0L)
+
+/* UINT Cls_OnNCCalcSize(HWND hwnd, BOOL fCalcValidRects, NCCALCSIZE_PARAMS FAR* lpcsp) */
+#define HANDLE_WM_NCCALCSIZE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (BOOL)(wParam), (NCCALCSIZE_PARAMS FAR*)(lParam))
+#define FORWARD_WM_NCCALCSIZE(hwnd, fCalcValidRects, lpcsp, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_NCCALCSIZE, (WPARAM)(fCalcValidRects), (LPARAM)(NCCALCSIZE_PARAMS FAR*)(lpcsp))
+
+/* UINT Cls_OnNCHitTest(HWND hwnd, int x, int y); */
+#define HANDLE_WM_NCHITTEST(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_NCHITTEST(hwnd, x, y, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_NCHITTEST, 0, MAKELPARAM((int)(x), (int)(y)))
+
+/* HICON Cls_OnQueryDragIcon(HWND hwnd); */
+#define HANDLE_WM_QUERYDRAGICON(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd)
+#define FORWARD_WM_QUERYDRAGICON(hwnd, fn) \
+ (HICON)(UINT)(DWORD)(fn)((hwnd), WM_QUERYDRAGICON, 0, 0L)
+
+#ifdef _INC_SHELLAPI
+/* void Cls_OnDropFiles(HWND hwnd, HDROP hdrop); */
+#define HANDLE_WM_DROPFILES(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HDROP)(wParam)), 0L)
+#define FORWARD_WM_DROPFILES(hwnd, hdrop, fn) \
+ (void)(fn)((hwnd), WM_DROPFILES, (WPARAM)(hdrop), 0L)
+#endif /* _INC_SHELLAPI */
+
+/* void Cls_OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized); */
+#define HANDLE_WM_ACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (BOOL)HIWORD(lParam)), 0L)
+#define FORWARD_WM_ACTIVATE(hwnd, state, hwndActDeact, fMinimized, fn) \
+ (void)(fn)((hwnd), WM_ACTIVATE, (WPARAM)(UINT)(state), MAKELPARAM((UINT)(HWND)(hwndActDeact), (UINT)(BOOL)(fMinimized)))
+
+/* void Cls_OnActivateApp(HWND hwnd, BOOL fActivate, HTASK htaskActDeact); */
+#define HANDLE_WM_ACTIVATEAPP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), (HTASK)LOWORD(lParam)), 0L)
+#define FORWARD_WM_ACTIVATEAPP(hwnd, fActivate, htaskActDeact, fn) \
+ (void)(fn)((hwnd), WM_ACTIVATEAPP, (WPARAM)(BOOL)(fActivate), MAKELPARAM((htaskActDeact),0))
+
+/* BOOL Cls_OnNCActivate(HWND hwnd, BOOL fActive, HWND hwndActDeact, BOOL fMinimized); */
+#define HANDLE_WM_NCACTIVATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (BOOL)(wParam), (HWND)LOWORD(lParam), (BOOL)HIWORD(lParam))
+#define FORWARD_WM_NCACTIVATE(hwnd, fActive, hwndActDeact, fMinimized, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_NCACTIVATE, (WPARAM)(BOOL)(fActive), MAKELPARAM((UINT)(HWND)(hwndActDeact), (UINT)(BOOL)(fMinimized)))
+
+/* void Cls_OnSetFocus(HWND hwnd, HWND hwndOldFocus) */
+#define HANDLE_WM_SETFOCUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_SETFOCUS(hwnd, hwndOldFocus, fn) \
+ (void)(fn)((hwnd), WM_SETFOCUS, (WPARAM)(HWND)(hwndOldFocus), 0L)
+
+/* void Cls_OnKillFocus(HWND hwnd, HWND hwndNewFocus); */
+#define HANDLE_WM_KILLFOCUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_KILLFOCUS(hwnd, hwndNewFocus, fn) \
+ (void)(fn)((hwnd), WM_KILLFOCUS, (WPARAM)(HWND)(hwndNewFocus), 0L)
+
+/* void Cls_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_KEYDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), TRUE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_KEYDOWN(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_KEYDOWN, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_KEYUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), FALSE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_KEYUP(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_KEYUP, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_CHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_CHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_CHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat),0))
+
+/* void Cls_OnDeadChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_DEADCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_DEADCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_DEADCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat),0))
+
+/* void Cls_OnSysKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_SYSKEYDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), TRUE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSKEYDOWN(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_SYSKEYDOWN, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnSysKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_SYSKEYUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), FALSE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSKEYUP(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_SYSKEYUP, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnSysChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_SYSCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SYSCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_SYSCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat), 0))
+
+/* void Cls_OnSysDeadChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_SYSDEADCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SYSDEADCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_SYSDEADCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat), 0))
+
+/* void Cls_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MOUSEMOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MOUSEMOVE(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_MOUSEMOVE, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_LBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_LBUTTONDBLCLK : WM_LBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_LBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_LBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_RBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_RBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_RBUTTONDBLCLK : WM_RBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_RBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnRButtonUp(HWND hwnd, int x, int y, UINT flags); */
+#define HANDLE_WM_RBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_RBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_RBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_MBUTTONDBLCLK : WM_MBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnMButtonUp(HWND hwnd, int x, int y, UINT flags); */
+#define HANDLE_WM_MBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_MBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCMouseMove(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMOUSEMOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMOUSEMOVE(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCMOUSEMOVE, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCLBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCLBUTTONDBLCLK : WM_NCLBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCLButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCLBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCLBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCRBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCRBUTTONDBLCLK : WM_NCRBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCRButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCRBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCRBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCMBUTTONDBLCLK : WM_NCMBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCMButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCMBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* int Cls_OnMouseActivate(HWND hwnd, HWND hwndTopLevel, UINT codeHitTest, UINT msg); */
+#define HANDLE_WM_MOUSEACTIVATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (HWND)(wParam), (UINT)LOWORD(lParam), (UINT)HIWORD(lParam))
+#define FORWARD_WM_MOUSEACTIVATE(hwnd, hwndTopLevel, codeHitTest, msg, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_MOUSEACTIVATE, (WPARAM)(HWND)(hwndTopLevel), MAKELPARAM((codeHitTest), (msg)))
+
+/* void Cls_OnCancelMode(HWND hwnd); */
+#define HANDLE_WM_CANCELMODE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CANCELMODE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CANCELMODE, 0, 0L)
+
+/* void Cls_OnTimer(HWND hwnd, UINT id); */
+#define HANDLE_WM_TIMER(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam)), 0L)
+#define FORWARD_WM_TIMER(hwnd, id, fn) \
+ (void)(fn)((hwnd), WM_TIMER, (WPARAM)(UINT)(id), 0L)
+
+/* void Cls_OnInitMenu(HWND hwnd, HMENU hMenu); */
+#define HANDLE_WM_INITMENU(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)(wParam)), 0L)
+#define FORWARD_WM_INITMENU(hwnd, hMenu, fn) \
+ (void)(fn)((hwnd), WM_INITMENU, (WPARAM)(HMENU)(hMenu), 0L)
+
+/* void Cls_OnInitMenuPopup(HWND hwnd, HMENU hMenu, int item, BOOL fSystemMenu); */
+#define HANDLE_WM_INITMENUPOPUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)(wParam), (int)LOWORD(lParam), (BOOL)HIWORD(lParam)), 0L)
+#define FORWARD_WM_INITMENUPOPUP(hwnd, hMenu, item, fSystemMenu, fn) \
+ (void)(fn)((hwnd), WM_INITMENUPOPUP, (WPARAM)(HMENU)(hMenu), MAKELPARAM((item),(fSystemMenu)))
+
+/* void Cls_OnMenuSelect(HWND hwnd, HMENU hmenu, int item, HMENU hmenuPopup, UINT flags); */
+#define HANDLE_WM_MENUSELECT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)HIWORD(lParam), (LOWORD(lParam) & MF_POPUP) ? 0 : (int)(wParam), \
+ (LOWORD(lParam) & MF_POPUP) ? (HMENU)(wParam) : 0, LOWORD(lParam)), 0L)
+#define FORWARD_WM_MENUSELECT(hwnd, hmenu, item, hmenuPopup, flags, fn) \
+ (void)(fn)((hwnd), WM_MENUSELECT, ((flags) & MF_POPUP) ? (WPARAM)(HMENU)(hmenuPopup) : (WPARAM)(int)(item), MAKELPARAM((flags), (hmenu)))
+
+/* DWORD Cls_OnMenuChar(HWND hwnd, UINT ch, UINT flags, HMENU hmenu); */
+#define HANDLE_WM_MENUCHAR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam), LOWORD(lParam), (HMENU)HIWORD(lParam));
+#define FORWARD_WM_MENUCHAR(hwnd, ch, flags, hmenu, fn) \
+ (DWORD)(fn)((hwnd), WM_MENUCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((flags), (UINT)(hmenu)))
+
+/* void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); */
+#define HANDLE_WM_COMMAND(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), (HWND)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \
+ (void)(fn)((hwnd), WM_COMMAND, (WPARAM)(int)(id), MAKELPARAM((UINT)(hwndCtl), (codeNotify)))
+
+/* void Cls_OnHScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos); */
+#define HANDLE_WM_HSCROLL(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)HIWORD(lParam), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_HSCROLL(hwnd, hwndCtl, code, pos, fn) \
+ (void)(fn)((hwnd), WM_HSCROLL, (WPARAM)(UINT)(code), MAKELPARAM((pos), (UINT)(hwndCtl)))
+
+/* void Cls_OnVScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos); */
+#define HANDLE_WM_VSCROLL(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)HIWORD(lParam), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_VSCROLL(hwnd, hwndCtl, code, pos, fn) \
+ (void)(fn)((hwnd), WM_VSCROLL, (WPARAM)(UINT)(code), MAKELPARAM((pos), (UINT)(hwndCtl)))
+
+/* void Cls_OnCut(HWND hwnd); */
+#define HANDLE_WM_CUT(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CUT(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CUT, 0, 0L)
+
+/* void Cls_OnCopy(HWND hwnd); */
+#define HANDLE_WM_COPY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_COPY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_COPY, 0, 0L)
+
+/* void Cls_OnPaste(HWND hwnd); */
+#define HANDLE_WM_PASTE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_PASTE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_PASTE, 0, 0L)
+
+/* void Cls_OnClear(HWND hwnd); */
+#define HANDLE_WM_CLEAR(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CLEAR(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CLEAR, 0, 0L)
+
+/* void Cls_OnUndo(HWND hwnd); */
+#define HANDLE_WM_UNDO(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_UNDO(hwnd, fn) \
+ (void)(fn)((hwnd), WM_UNDO, 0, 0L)
+
+/* HANDLE Cls_OnRenderFormat(HWND hwnd, UINT fmt); */
+#define HANDLE_WM_RENDERFORMAT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HANDLE)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_RENDERFORMAT(hwnd, fmt, fn) \
+ (HANDLE)(UINT)(DWORD)(fn)((hwnd), WM_RENDERFORMAT, (WPARAM)(UINT)(fmt), 0L)
+
+/* void Cls_OnRenderAllFormats(HWND hwnd); */
+#define HANDLE_WM_RENDERALLFORMATS(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_RENDERALLFORMATS(hwnd, fn) \
+ (void)(fn)((hwnd), WM_RENDERALLFORMATS, 0, 0L)
+
+/* void Cls_OnDestroyClipboard(HWND hwnd); */
+#define HANDLE_WM_DESTROYCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DESTROYCLIPBOARD(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DESTROYCLIPBOARD, 0, 0L)
+
+/* void Cls_OnDrawClipboard(HWND hwnd); */
+#define HANDLE_WM_DRAWCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DRAWCLIPBOARD(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DRAWCLIPBOARD, 0, 0L)
+
+/* void Cls_OnPaintClipboard(HWND hwnd, HWND hwndCBViewer, const PAINTSTRUCT FAR* lpPaintStruct) */
+#define HANDLE_WM_PAINTCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (const PAINTSTRUCT FAR*)GlobalLock((HGLOBAL)LOWORD(lParam))), GlobalUnlock((HGLOBAL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_PAINTCLIPBOARD(hwnd, hwndCBViewer, lpPaintStruct, fn) \
+ (void)(fn)((hwnd), WM_PAINTCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), (LPARAM)(lpPaintStruct))
+
+/* void Cls_OnSizeClipboard(HWND hwnd, HWND hwndCBViewer, const RECT FAR* lprc); */
+#define HANDLE_WM_SIZECLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (const RECT FAR*)GlobalLock((HGLOBAL)LOWORD(lParam))), GlobalUnlock((HGLOBAL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SIZECLIPBOARD(hwnd, hwndCBViewer, lprc, fn) \
+ (void)(fn)((hwnd), WM_SIZECLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), (LPARAM)(lprc))
+
+/* void Cls_OnVScrollClipboard(HWND hwnd, HWND hwndCBViewer, UINT code, int pos); */
+#define HANDLE_WM_VSCROLLCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_VSCROLLCLIPBOARD(hwnd, hwndCBViewer, code, pos, fn) \
+ (void)(fn)((hwnd), WM_VSCROLLCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), MAKELPARAM((code), (pos)))
+
+/* void Cls_OnHScrollClipboard(HWND hwnd, HWND hwndCBViewer, UINT code, int pos); */
+#define HANDLE_WM_HSCROLLCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_HSCROLLCLIPBOARD(hwnd, hwndCBViewer, code, pos, fn) \
+ (void)(fn)((hwnd), WM_HSCROLLCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), MAKELPARAM((code), (pos)))
+
+/* void Cls_OnAskCBFormatName(HWND hwnd, int cchMax, LPSTR rgchName); */
+#define HANDLE_WM_ASKCBFORMATNAME(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), (LPSTR)(lParam)), 0L)
+#define FORWARD_WM_ASKCBFORMATNAME(hwnd, cchMax, rgchName, fn) \
+ (void)(fn)((hwnd), WM_ASKCBFORMATNAME, (WPARAM)(int)(cchMax), (LPARAM)(rgchName))
+
+/* void Cls_OnChangeCBChain(HWND hwnd, HWND hwndRemove, HWND hwndNext); */
+#define HANDLE_WM_CHANGECBCHAIN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (HWND)LOWORD(lParam)), 0L)
+#define FORWARD_WM_CHANGECBCHAIN(hwnd, hwndRemove, hwndNext, fn) \
+ (void)(fn)((hwnd), WM_CHANGECBCHAIN, (WPARAM)(HWND)(hwndRemove), MAKELPARAM((UINT)(hwndNext), 0))
+
+/* BOOL Cls_OnSetCursor(HWND hwnd, HWND hwndCursor, UINT codeHitTest, UINT msg); */
+#define HANDLE_WM_SETCURSOR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HWND)(wParam), (UINT)LOWORD(lParam), (UINT)HIWORD(lParam));
+#define FORWARD_WM_SETCURSOR(hwnd, hwndCursor, codeHitTest, msg, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_SETCURSOR, (WPARAM)(HWND)(hwndCursor), MAKELPARAM((codeHitTest), (msg)))
+
+/* void Cls_OnSysCommand(HWND hwnd, UINT cmd, int x, int y); */
+#define HANDLE_WM_SYSCOMMAND(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSCOMMAND(hwnd, cmd, x, y, fn) \
+ (void)(fn)((hwnd), WM_SYSCOMMAND, (WPARAM)(UINT)(cmd), MAKELPARAM((x), (y)))
+
+/* HWND Cls_MDICreate(HWND hwnd, const MDICREATESTRUCT FAR* lpmcs); */
+#define HANDLE_WM_MDICREATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (MDICREATESTRUCT FAR*)(lParam))
+#define FORWARD_WM_MDICREATE(hwnd, lpmcs, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDICREATE, 0, (LPARAM)(lpmcs))
+
+/* void Cls_MDIDestroy(HWND hwnd, HWND hwndDestroy); */
+#define HANDLE_WM_MDIDESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIDESTROY(hwnd, hwndDestroy, fn) \
+ (void)(fn)((hwnd), WM_MDIDESTROY, (WPARAM)(hwndDestroy), 0L)
+
+/* NOTE: Usable only by MDI client windows */
+/* void Cls_MDIActivate(HWND hwnd, BOOL fActive, HWND hwndActivate, HWND hwndDeactivate); */
+#define HANDLE_WM_MDIACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), (HWND)LOWORD(lParam), (HWND)HIWORD(lParam)), 0L)
+#define FORWARD_WM_MDIACTIVATE(hwnd, fActive, hwndActivate, hwndDeactivate, fn) \
+ (void)(fn)(hwnd, WM_MDIACTIVATE, (WPARAM)(fActive), MAKELPARAM((hwndActivate), (hwndDeactivate)))
+
+/* void Cls_MDIRestore(HWND hwnd, HWND hwndRestore); */
+#define HANDLE_WM_MDIRESTORE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIRESTORE(hwnd, hwndRestore, fn) \
+ (void)(fn)((hwnd), WM_MDIRESTORE, (WPARAM)(hwndRestore), 0L)
+
+/* HWND Cls_MDINext(HWND hwnd, HWND hwndCur, BOOL fPrev); */
+#define HANDLE_WM_MDINEXT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (BOOL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_MDINEXT(hwnd, hwndCur, fPrev, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDINEXT, (WPARAM)(hwndCur), MAKELPARAM((fPrev), 0))
+
+/* void Cls_MDIMaximize(HWND hwnd, HWND hwndMaximize); */
+#define HANDLE_WM_MDIMAXIMIZE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIMAXIMIZE(hwnd, hwndMaximize, fn) \
+ (void)(fn)((hwnd), WM_MDIMAXIMIZE, (WPARAM)(hwndMaximize), 0L)
+
+/* BOOL Cls_MDITile(HWND hwnd, UINT cmd); */
+#define HANDLE_WM_MDITILE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_MDITILE(hwnd, cmd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_MDITILE, (WPARAM)(cmd), 0L)
+
+/* BOOL Cls_MDICascade(HWND hwnd, UINT cmd); */
+#define HANDLE_WM_MDICASCADE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_MDICASCADE(hwnd, cmd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_MDICASCADE, (WPARAM)(cmd), 0L)
+
+/* void Cls_MDIIconArrange(HWND hwnd); */
+#define HANDLE_WM_MDIICONARRANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_MDIICONARRANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_MDIICONARRANGE, 0, 0L)
+
+/* HWND Cls_MDIGetActive(HWND hwnd); */
+#define HANDLE_WM_MDIGETACTIVE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd)
+#define FORWARD_WM_MDIGETACTIVE(hwnd, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDIGETACTIVE, 0, 0L)
+
+/* HMENU Cls_MDISetMenu(HWND hwnd, BOOL fRefresh, HMENU hmenuFrame, HMENU hmenuWindow); */
+#define HANDLE_WM_MDISETMENU(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (BOOL)(wParam), (HMENU)LOWORD(lParam), (HMENU)HIWORD(lParam))
+#define FORWARD_WM_MDISETMENU(hwnd, fRefresh, hmenuFrame, hmenuWindow, fn) \
+ (HMENU)(UINT)(DWORD)(fn)((hwnd), WM_MDISETMENU, (WPARAM)(fRefresh), MAKELPARAM((hmenuFrame), (hmenuWindow)))
+
+/* void Cls_OnChildActivate(HWND hwnd); */
+#define HANDLE_WM_CHILDACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CHILDACTIVATE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CHILDACTIVATE, 0, 0L)
+
+/* BOOL Cls_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam); */
+#define HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd), (HWND)(wParam), lParam);
+#define FORWARD_WM_INITDIALOG(hwnd, hwndFocus, lParam, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_INITDIALOG, (WPARAM)(HWND)(hwndFocus), (lParam))
+
+/* HWND Cls_OnNextDlgCtl(HWND hwnd, HWND hwndSetFocus, BOOL fNext) */
+#define HANDLE_WM_NEXTDLGCTL(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HWND)(fn)((hwnd), (HWND)(wParam), (BOOL)LOWORD(lParam))
+#define FORWARD_WM_NEXTDLGCTL(hwnd, hwndSetFocus, fNext, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_NEXTDLGCTL, (WPARAM)(HWND)(hwndSetFocus), MAKELPARAM((fNext), 0))
+
+/* void Cls_OnParentNotify(HWND hwnd, UINT msg, HWND hwndChild, int idChild); */
+#define HANDLE_WM_PARENTNOTIFY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_PARENTNOTIFY(hwnd, msg, hwndChild, idChild, fn) \
+ (void)(fn)((hwnd), WM_PARENTNOTIFY, (WPARAM)(UINT)(msg), MAKELPARAM((UINT)(HWND)(hwndChild), (UINT)(idChild)))
+
+/* void Cls_OnEnterIdle(HWND hwnd, UINT source, HWND hwndSource); */
+#define HANDLE_WM_ENTERIDLE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam)), 0L)
+#define FORWARD_WM_ENTERIDLE(hwnd, source, hwndSource, fn) \
+ (void)(fn)((hwnd), WM_ENTERIDLE, (WPARAM)(UINT)(source), MAKELPARAM((UINT)(HWND)(hwndSource), 0))
+
+/* UINT Cls_OnGetDlgCode(HWND hwnd, MSG FAR* lpmsg); */
+#define HANDLE_WM_GETDLGCODE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd, (MSG FAR*)(lParam))
+#define FORWARD_WM_GETDLGCODE(hwnd, lpmsg, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_GETDLGCODE, (SELECTOROF(lpmsg) ? lpmsg->wParam : 0), (LPARAM)(lpmsg))
+
+/* HBRUSH Cls_OnCtlColor(HWND hwnd, HDC hdc, HWND hwndChild, int type); */
+#define HANDLE_WM_CTLCOLOR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd), (HDC)(wParam), (HWND)LOWORD(lParam), (int)(HIWORD(lParam)))
+#define FORWARD_WM_CTLCOLOR(hwnd, hdc, hwndChild, type, fn) \
+ (HBRUSH)(UINT)(DWORD)(fn)((hwnd), WM_CTLCOLOR, (WPARAM)(HDC)(hdc), MAKELPARAM((UINT)(HWND)(hwndChild), (UINT)(int)(type)))
+
+/* void Cls_OnSetFont(HWND hwndCtl, HFONT hfont, BOOL fRedraw); */
+#define HANDLE_WM_SETFONT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HFONT)(wParam), (BOOL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SETFONT(hwnd, hfont, fRedraw, fn) \
+ (void)(fn)((hwnd), WM_SETFONT, (WPARAM)(HFONT)(hfont), MAKELPARAM((UINT)(BOOL)(fRedraw), 0))
+
+/* HFONT Cls_OnGetFont(HWND hwnd); */
+#define HANDLE_WM_GETFONT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HFONT)(fn)(hwnd)
+#define FORWARD_WM_GETFONT(hwnd, fn) \
+ (HFONT)(UINT)(DWORD)(fn)((hwnd), WM_GETFONT, 0, 0L)
+
+/* void Cls_OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT FAR* lpDrawItem); */
+#define HANDLE_WM_DRAWITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const DRAWITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_DRAWITEM(hwnd, lpDrawItem, fn) \
+ (void)(fn)((hwnd), WM_DRAWITEM, 0, (LPARAM)(const DRAWITEMSTRUCT FAR*)(lpDrawItem))
+
+/* void Cls_OnMeasureItem(HWND hwnd, MEASUREITEMSTRUCT FAR* lpMeasureItem); */
+#define HANDLE_WM_MEASUREITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (MEASUREITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_MEASUREITEM(hwnd, lpMeasureItem, fn) \
+ (void)(fn)((hwnd), WM_MEASUREITEM, 0, (LPARAM)(MEASUREITEMSTRUCT FAR*)(lpMeasureItem))
+
+/* void Cls_OnDeleteItem(HWND hwnd, const DELETEITEMSTRUCT FAR* lpDeleteItem) */
+#define HANDLE_WM_DELETEITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const DELETEITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_DELETEITEM(hwnd, lpDeleteItem, fn) \
+ (void)(fn)((hwnd), WM_DELETEITEM, 0, (LPARAM)(const DELETEITEMSTRUCT FAR*)(lpDeleteItem))
+
+/* int Cls_OnCompareItem(HWND hwnd, const COMPAREITEMSTRUCT FAR* lpCompareItem); */
+#define HANDLE_WM_COMPAREITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (const COMPAREITEMSTRUCT FAR*)(lParam))
+#define FORWARD_WM_COMPAREITEM(hwnd, lpCompareItem, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_COMPAREITEM, 0, (LPARAM)(const COMPAREITEMSTRUCT FAR*)(lpCompareItem))
+
+/* int Cls_OnVkeyToItem(HWND hwnd, UINT vk, HWND hwndListbox, int iCaret); */
+#define HANDLE_WM_VKEYTOITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_VKEYTOITEM(hwnd, vk, hwndListBox, iCaret, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_VKEYTOITEM, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(hwndListBox), (UINT)(iCaret)))
+
+/* int Cls_OnCharToItem(HWND hwnd, UINT ch, HWND hwndListbox, int iCaret); */
+#define HANDLE_WM_CHARTOITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_CHARTOITEM(hwnd, ch, hwndListBox, iCaret, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_CHARTOITEM, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(hwndListBox), (UINT)(iCaret)))
+
+/* void Cls_OnQueueSync(HWND hwnd); */
+#define HANDLE_WM_QUEUESYNC(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_QUEUESYNC(hwnd, fn) \
+ (void)(fn)((hwnd), WM_QUEUESYNC, 0, 0L)
+
+/* void Cls_OnCommNotify(HWND hwnd, int cid, UINT flags); */
+#define HANDLE_WM_COMMNOTIFY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), LOWORD(lParam)), 0L)
+#define FORWARD_WM_COMMNOTIFY(hwnd, cid, flags, fn) \
+ (void)(fn)((hwnd), WM_COMMNOTIFY, (WPARAM)(cid), MAKELPARAM((flags), 0))
+
+/****** Static control message APIs ******************************************/
+
+#define Static_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Static_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Static_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Static_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Static_SetIcon(hwndCtl, hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl), STM_SETICON, (WPARAM)(HICON)(hIcon), 0L))
+#define Static_GetIcon(hwndCtl, hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl), STM_GETICON, 0, 0L))
+
+/****** Button control message APIs ******************************************/
+
+#define Button_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Button_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Button_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Button_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Button_GetCheck(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), BM_GETCHECK, 0, 0L))
+#define Button_SetCheck(hwndCtl, check) ((void)SendMessage((hwndCtl), BM_SETCHECK, (WPARAM)(int)(check), 0L))
+
+#define Button_GetState(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), BM_GETSTATE, 0, 0L))
+#define Button_SetState(hwndCtl, state) ((UINT)(DWORD)SendMessage((hwndCtl), BM_SETSTATE, (WPARAM)(int)(state), 0L))
+
+#define Button_SetStyle(hwndCtl, style, fRedraw) ((void)SendMessage((hwndCtl), BM_SETSTYLE, (WPARAM)LOWORD(style), MAKELPARAM(((fRedraw) ? TRUE : FALSE), 0)))
+
+/****** Edit control message APIs ********************************************/
+
+#define Edit_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Edit_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Edit_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Edit_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Edit_LimitText(hwndCtl, cchMax) ((void)SendMessage((hwndCtl), EM_LIMITTEXT, (WPARAM)(cchMax), 0L))
+
+#define Edit_GetLineCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), EM_GETLINECOUNT, 0, 0L))
+#define Edit_GetLine(hwndCtl, line, lpch, cchMax) ((*((int FAR*)(lpch)) = (cchMax)), ((int)(DWORD)SendMessage((hwndCtl), EM_GETLINE, (WPARAM)(int)(line), (LPARAM)(LPSTR)(lpch))))
+
+#define Edit_GetRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_GETRECT, 0, (LPARAM)(RECT FAR*)(lprc)))
+#define Edit_SetRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_SETRECT, 0, (LPARAM)(const RECT FAR*)(lprc)))
+#define Edit_SetRectNoPaint(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_SETRECTNP, 0, (LPARAM)(const RECT FAR*)(lprc)))
+
+#define Edit_GetSel(hwndCtl) ((DWORD)SendMessage((hwndCtl), EM_GETSEL, 0, 0L))
+#define Edit_SetSel(hwndCtl, ichStart, ichEnd) ((void)SendMessage((hwndCtl), EM_SETSEL, 0, MAKELPARAM((ichStart), (ichEnd))))
+#define Edit_ReplaceSel(hwndCtl, lpszReplace) ((void)SendMessage((hwndCtl), EM_REPLACESEL, 0, (LPARAM)(LPCSTR)(lpszReplace)))
+
+#define Edit_GetModify(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_GETMODIFY, 0, 0L))
+#define Edit_SetModify(hwndCtl, fModified) ((void)SendMessage((hwndCtl), EM_SETMODIFY, (WPARAM)(UINT)(fModified), 0L))
+
+#define Edit_LineFromChar(hwndCtl, ich) ((int)(DWORD)SendMessage((hwndCtl), EM_LINEFROMCHAR, (WPARAM)(int)(ich), 0L))
+#define Edit_LineIndex(hwndCtl, line) ((int)(DWORD)SendMessage((hwndCtl), EM_LINEINDEX, (WPARAM)(int)(line), 0L))
+#define Edit_LineLength(hwndCtl, line) ((int)(DWORD)SendMessage((hwndCtl), EM_LINELENGTH, (WPARAM)(int)(line), 0L))
+
+#define Edit_Scroll(hwndCtl, dv, dh) ((void)SendMessage((hwndCtl), EM_LINESCROLL, 0, MAKELPARAM((dv), (dh))))
+
+#define Edit_CanUndo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_CANUNDO, 0, 0L))
+#define Edit_Undo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_UNDO, 0, 0L))
+#define Edit_EmptyUndoBuffer(hwndCtl) ((void)SendMessage((hwndCtl), EM_EMPTYUNDOBUFFER, 0, 0L))
+
+#define Edit_SetPasswordChar(hwndCtl, ch) ((void)SendMessage((hwndCtl), EM_SETPASSWORDCHAR, (WPARAM)(UINT)(ch), 0L))
+
+#define Edit_SetTabStops(hwndCtl, cTabs, lpTabs) ((void)SendMessage((hwndCtl), EM_SETTABSTOPS, (WPARAM)(int)(cTabs), (LPARAM)(const int FAR*)(lpTabs)))
+
+#define Edit_FmtLines(hwndCtl, fAddEOL) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_FMTLINES, (WPARAM)(BOOL)(fAddEOL), 0L))
+
+#define Edit_GetHandle(hwndCtl) ((HLOCAL)(UINT)(DWORD)SendMessage((hwndCtl), EM_GETHANDLE, 0, 0L))
+#define Edit_SetHandle(hwndCtl, h) ((void)SendMessage((hwndCtl), EM_SETHANDLE, (WPARAM)(UINT)(HLOCAL)(h), 0L))
+
+#if (WINVER >= 0x030a)
+#define Edit_GetFirstVisibleLine(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), EM_GETFIRSTVISIBLELINE, 0, 0L))
+
+#define Edit_SetReadOnly(hwndCtl, fReadOnly) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_SETREADONLY, (WPARAM)(BOOL)(fReadOnly), 0L))
+
+#define Edit_GetPasswordChar(hwndCtl) ((char)(DWORD)SendMessage((hwndCtl), EM_GETPASSWORDCHAR, 0, 0L))
+
+#define Edit_SetWordBreakProc(hwndCtl, lpfnWordBreak) ((void)SendMessage((hwndCtl), EM_SETWORDBREAKPROC, 0, (LPARAM)(EDITWORDBREAKPROC)(lpfnWordBreak)))
+#define Edit_GetWordBreakProc(hwndCtl) ((EDITWORDBREAKPROC)SendMessage((hwndCtl), EM_GETWORDBREAKPROC, 0, 0L))
+#endif /* WINVER >= 0x030a */
+
+/****** ScrollBar control message APIs ***************************************/
+
+/* NOTE: flags parameter is a collection of ESB_* values, NOT a boolean! */
+#define ScrollBar_Enable(hwndCtl, flags) EnableScrollBar((hwndCtl), SB_CTL, (flags))
+
+#define ScrollBar_Show(hwndCtl, fShow) ShowWindow((hwndCtl), (fShow) ? SW_SHOWNORMAL : SW_HIDE)
+
+#define ScrollBar_SetPos(hwndCtl, pos, fRedraw) SetScrollPos((hwndCtl), SB_CTL, (pos), (fRedraw))
+#define ScrollBar_GetPos(hwndCtl) GetScrollPos((hwndCtl), SB_CTL)
+
+#define ScrollBar_SetRange(hwndCtl, posMin, posMax, fRedraw) SetScrollRange((hwndCtl), SB_CTL, (posMin), (posMax), (fRedraw))
+#define ScrollBar_GetRange(hwndCtl, lpposMin, lpposMax) GetScrollRange((hwndCtl), SB_CTL, (lpposMin), (lpposMax))
+
+/****** ListBox control message APIs *****************************************/
+
+#define ListBox_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define ListBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCOUNT, 0, 0L))
+#define ListBox_ResetContent(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), LB_RESETCONTENT, 0, 0L))
+
+#define ListBox_AddString(hwndCtl, lpsz) ((int)(DWORD)SendMessage((hwndCtl), LB_ADDSTRING, 0, (LPARAM)(LPCSTR)(lpsz)))
+#define ListBox_InsertString(hwndCtl, index, lpsz) ((int)(DWORD)SendMessage((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpsz)))
+
+#define ListBox_AddItemData(hwndCtl, data) ((int)(DWORD)SendMessage((hwndCtl), LB_ADDSTRING, 0, (LPARAM)(data)))
+#define ListBox_InsertItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ListBox_DeleteString(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_DELETESTRING, (WPARAM)(int)(index), 0L))
+
+#define ListBox_GetTextLen(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTEXTLEN, (WPARAM)(int)(index), 0L))
+#define ListBox_GetText(hwndCtl, index, lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTEXT, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpszBuffer)))
+
+#define ListBox_GetItemData(hwndCtl, index) ((LRESULT)(DWORD)SendMessage((hwndCtl), LB_GETITEMDATA, (WPARAM)(int)(index), 0L))
+#define ListBox_SetItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), LB_SETITEMDATA, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ListBox_FindString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ListBox_FindItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ListBox_SetSel(hwndCtl, fSelect, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETSEL, (WPARAM)(BOOL)(fSelect), MAKELPARAM((index), 0)))
+#define ListBox_SelItemRange(hwndCtl, fSelect, first, last) ((int)(DWORD)SendMessage((hwndCtl), LB_SELITEMRANGE, (WPARAM)(BOOL)(fSelect), MAKELPARAM((first), (last))))
+
+#define ListBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCURSEL, 0, 0L))
+#define ListBox_SetCurSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETCURSEL, (WPARAM)(int)(index), 0L))
+
+#define ListBox_SelectString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ListBox_SelectItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), LB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ListBox_GetSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSEL, (WPARAM)(int)(index), 0L))
+#define ListBox_GetSelCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSELCOUNT, 0, 0L))
+#define ListBox_GetTopIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTOPINDEX, 0, 0L))
+#define ListBox_GetSelItems(hwndCtl, cItems, lpItems) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSELITEMS, (WPARAM)(int)(cItems), (LPARAM)(int FAR*)(lpItems)))
+
+#define ListBox_SetTopIndex(hwndCtl, indexTop) ((int)(DWORD)SendMessage((hwndCtl), LB_SETTOPINDEX, (WPARAM)(int)(indexTop), 0L))
+
+#define ListBox_SetColumnWidth(hwndCtl, cxColumn) ((void)SendMessage((hwndCtl), LB_SETCOLUMNWIDTH, (WPARAM)(int)(cxColumn), 0L))
+#define ListBox_GetHorizontalExtent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETHORIZONTALEXTENT, 0, 0L))
+#define ListBox_SetHorizontalExtent(hwndCtl, cxExtent) ((void)SendMessage((hwndCtl), LB_SETHORIZONTALEXTENT, (WPARAM)(int)(cxExtent), 0L))
+
+#define ListBox_SetTabStops(hwndCtl, cTabs, lpTabs) ((BOOL)(DWORD)SendMessage((hwndCtl), LB_SETTABSTOPS, (WPARAM)(int)(cTabs), (LPARAM)(int FAR*)(lpTabs)))
+
+#define ListBox_GetItemRect(hwndCtl, index, lprc) ((int)(DWORD)SendMessage((hwndCtl), LB_GETITEMRECT, (WPARAM)(int)(index), (LPARAM)(RECT FAR*)(lprc)))
+
+#define ListBox_SetCaretIndex(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETCARETINDEX, (WPARAM)(int)(index), 0L))
+#define ListBox_GetCaretIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCARETINDEX, 0, 0L))
+
+
+#if (WINVER >= 0x030a)
+#define ListBox_FindStringExact(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRINGEXACT, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+
+#define ListBox_SetItemHeight(hwndCtl, index, cy) ((int)(DWORD)SendMessage((hwndCtl), LB_SETITEMHEIGHT, (WPARAM)(int)(index), MAKELPARAM((cy), 0)))
+#define ListBox_GetItemHeight(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETITEMHEIGHT, (WPARAM)(int)(index), 0L))
+#endif /* WINVER >= 0x030a */
+
+#define ListBox_Dir(hwndCtl, attrs, lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl), LB_DIR, (WPARAM)(UINT)(attrs), (LPARAM)(LPCSTR)(lpszFileSpec)))
+
+/****** ComboBox control message APIs ****************************************/
+
+#define ComboBox_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define ComboBox_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define ComboBox_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define ComboBox_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define ComboBox_LimitText(hwndCtl, cchLimit) ((int)(DWORD)SendMessage((hwndCtl), CB_LIMITTEXT, (WPARAM)(int)(cchLimit), 0L))
+
+#define ComboBox_GetEditSel(hwndCtl) ((DWORD)SendMessage((hwndCtl), CB_GETEDITSEL, 0, 0L))
+#define ComboBox_SetEditSel(hwndCtl, ichStart, ichEnd) ((int)(DWORD)SendMessage((hwndCtl), CB_SETEDITSEL, 0, MAKELPARAM((ichStart), (ichEnd))))
+
+#define ComboBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETCOUNT, 0, 0L))
+#define ComboBox_ResetContent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_RESETCONTENT, 0, 0L))
+
+#define ComboBox_AddString(hwndCtl, lpsz) ((int)(DWORD)SendMessage((hwndCtl), CB_ADDSTRING, 0, (LPARAM)(LPCSTR)(lpsz)))
+#define ComboBox_InsertString(hwndCtl, index, lpsz) ((int)(DWORD)SendMessage((hwndCtl), CB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpsz)))
+
+#define ComboBox_AddItemData(hwndCtl, data) ((int)(DWORD)SendMessage((hwndCtl), CB_ADDSTRING, 0, (LPARAM)(data)))
+#define ComboBox_InsertItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), CB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ComboBox_DeleteString(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_DELETESTRING, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_GetLBTextLen(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_GETLBTEXTLEN, (WPARAM)(int)(index), 0L))
+#define ComboBox_GetLBText(hwndCtl, index, lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl), CB_GETLBTEXT, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpszBuffer)))
+
+#define ComboBox_GetItemData(hwndCtl, index) ((LRESULT)(DWORD)SendMessage((hwndCtl), CB_GETITEMDATA, (WPARAM)(int)(index), 0L))
+#define ComboBox_SetItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), CB_SETITEMDATA, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ComboBox_FindString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ComboBox_FindItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ComboBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETCURSEL, 0, 0L))
+#define ComboBox_SetCurSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_SETCURSEL, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_SelectString(hwndCtl, indexStart, lpszSelect) ((int)(DWORD)SendMessage((hwndCtl), CB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszSelect)))
+#define ComboBox_SelectItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), CB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ComboBox_Dir(hwndCtl, attrs, lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl), CB_DIR, (WPARAM)(UINT)(attrs), (LPARAM)(LPCSTR)(lpszFileSpec)))
+
+#define ComboBox_ShowDropdown(hwndCtl, fShow) ((BOOL)(DWORD)SendMessage((hwndCtl), CB_SHOWDROPDOWN, (WPARAM)(BOOL)(fShow), 0L))
+
+#if (WINVER >= 0x030a)
+#define ComboBox_FindStringExact(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRINGEXACT, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+
+#define ComboBox_GetDroppedState(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), CB_GETDROPPEDSTATE, 0, 0L))
+#define ComboBox_GetDroppedControlRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)(RECT FAR*)(lprc)))
+
+#define ComboBox_GetItemHeight(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETITEMHEIGHT, 0, 0L))
+#define ComboBox_SetItemHeight(hwndCtl, cyItem) ((int)(DWORD)SendMessage((hwndCtl), CB_SETITEMHEIGHT, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_GetExtendedUI(hwndCtl) ((UINT)(DWORD)SendMessage((hwndCtl), CB_GETEXTENDEDUI, 0, 0L))
+#define ComboBox_SetExtendedUI(hwndCtl, flags) ((int)(DWORD)SendMessage((hwndCtl), CB_SETEXTENDEDUI, (WPARAM)(UINT)(flags), 0L))
+#endif /* WINVER >= 0x030a */
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+} /* End of extern "C" { */
+#endif /* __cplusplus */
+
+#endif /* !_INC_WINDOWSX */
diff --git a/private/oleauto/tools/win16/hdos/c800/include/winmem32.h b/private/oleauto/tools/win16/hdos/c800/include/winmem32.h
new file mode 100644
index 000000000..f07941c7a
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/include/winmem32.h
@@ -0,0 +1,32 @@
+/*
+ * Function protypes and general defines for WINMEM32 DLL
+ * Version 1.00
+ *
+ * NOTE that WINDOWS.H must be included before this file.
+ *
+ */
+
+/*
+ *
+ * The functions
+ *
+ */
+WORD FAR PASCAL GetWinMem32Version(void);
+WORD FAR PASCAL Global32Alloc(DWORD, LPWORD, DWORD, WORD);
+WORD FAR PASCAL Global32Realloc(WORD, DWORD, WORD);
+WORD FAR PASCAL Global32Free(WORD, WORD);
+WORD FAR PASCAL Global16PointerAlloc(WORD, DWORD, LPDWORD, DWORD, WORD);
+WORD FAR PASCAL Global16PointerFree(WORD, DWORD, WORD);
+WORD FAR PASCAL Global32CodeAlias(WORD, LPWORD, WORD);
+WORD FAR PASCAL Global32CodeAliasFree(WORD, WORD, WORD);
+
+/*
+ *
+ * Error Codes
+ *
+ */
+#define WM32_Invalid_Func 0001
+#define WM32_Invalid_Flags 0002
+#define WM32_Invalid_Arg 0003
+#define WM32_Insufficient_Sels 0004
+#define WM32_Insufficient_Mem 0005
diff --git a/private/oleauto/tools/win16/hdos/c800/lib/libentry.asm b/private/oleauto/tools/win16/hdos/c800/lib/libentry.asm
new file mode 100644
index 000000000..67db1564e
--- /dev/null
+++ b/private/oleauto/tools/win16/hdos/c800/lib/libentry.asm
@@ -0,0 +1,91 @@
+ page ,132
+ title libentry - Windows dynamic link library entry routine
+;***
+;libentry.asm - Windows dynamic link library entry routine
+;
+; Copyright (c) 1988-1992, Microsoft Corporation. All rights reserved.
+;
+;Purpose:
+;
+; This module generates a code segment called INIT_TEXT.
+; It initialises the local heap if one exists and then calls
+; the C routine LibMain() which should have the form:
+;
+; BOOL FAR PASCAL LibMain(HANDLE hModule,
+; WORD wDataSeg,
+; WORD cbHeap,
+; LPSTR lpszCmdLine);
+;
+; The result of the call to LibMain is returned to Windows.
+; LibMain should return TRUE if it completes initialisation
+; successfully, FALSE if some error occurs.
+;
+; NOTES:
+;
+; (1) This module is not needed if you use the C 7.0 Win 3.x
+; libraries; they perform this operation automatically. You may,
+; however, need this module when using the "No C Runtime" build
+; option.
+;
+; (2) The last parameter to LibMain is included for compatibility
+; reasons. Applications that wish to modify this file and remove the
+; parameter from LibMain may do so by simply removing the two
+; "push" instructions below marked with "****".
+;
+;*******************************************************************************
+
+ extrn LibMain:far ; the C routine to be called
+ extrn LocalInit:far ; Windows heap init routine
+ extrn __acrtused:abs ; Force in C segment definitions, etc.
+
+ public LibEntry ; entry point for the DLL
+
+;INIT_TEXT segment byte public 'CODE'
+; assume cs:INIT_TEXT
+_TEXT segment byte public 'CODE'
+ assume cs:_TEXT
+
+LibEntry proc far
+
+ifndef _NOTWLO
+ ; Include the special startup code that makes WIN DLLs
+ ; compatible with WLO. This code MUST be the first sequence
+ ; in the DLL startup.
+
+; include convdll.inc
+endif
+
+ push di ; handle of the module instance
+ push ds ; library data segment
+ push cx ; heap size
+ push es ; **** command line ptr (always NULL)
+ push si ; ****
+
+ ; if we have some heap then initialise it
+ jcxz callc ; jump if no heap specified
+
+ ; call the Windows function LocalInit() to set up the heap
+ ; LocalInit((LPSTR)start, WORD cbHeap);
+
+ push ds ; Heap segment
+ xor ax,ax
+ push ax ; Heap start offset in segment
+ push cx ; Heap end offset in segment
+ call LocalInit ; try to initialise it
+ or ax,ax ; did it do it ok ?
+ jz exit ; quit if it failed
+
+ ; invoke the C routine to do any special initialisation
+
+callc:
+ call LibMain ; invoke the 'C' routine (result in AX)
+
+exit:
+ ret ; return the result
+
+LibEntry endp
+
+;INIT_TEXT ends
+_TEXT ends
+
+ end LibEntry
diff --git a/private/oleauto/tools/win16/os2/bin/c1.err b/private/oleauto/tools/win16/os2/bin/c1.err
new file mode 100644
index 000000000..27d7b71e0
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/bin/c1.err
@@ -0,0 +1,1029 @@
+
+
+
+
+4001 "nonstandard extension '%Fs' was used"
+4002 "too many actual parameters for macro '%s'"
+4003 "not enough actual parameters for macro '%s'"
+4004 "incorrect construction after 'defined'"
+4005 "'%Fs' : macro redefinition"
+4006 "#undef expected an identifier"
+4007 "'%Fs' : must be '%Fs'"
+4008 "'%Fs' : '%Fs' attribute ignored"
+4009 "string too big; trailing characters truncated"
+4010 "single-line comment contains line-continuation character"
+4011 "'%Fs' : identifier was truncated to '%d' characters"
+4012 "float constant in a cross compilation"
+4013 "'%Fs' undefined; assuming extern returning int"
+4014 "concatenating mismatched wide strings"
+4015 "'%Fs' : type of bit field must be integral"
+4016 "'%s' : no function return type; using 'int' as default"
+4017 "cast of 'int' expression to far pointer"
+4018 "'%Fs' : signed/unsigned mismatch"
+4019 "empty statement at global scope"
+4020 "'%Fs' : too many actual parameters"
+4021 "'%Fs' : too few actual parameters"
+4022 "'%Fs' : pointer mismatch for actual parameter %d"
+4023 "'%Fs' : based pointer passed to unprototyped function : parameter %d"
+4024 "'%Fs' : different types for formal and actual parameter %d"
+4025 "'%Fs' : based pointer passed to function with variable arguments: parameter %d"
+4026 "function declared with formal parameter list"
+4027 "function declared without formal parameter list"
+4028 "formal parameter %d different from declaration"
+4029 "declared formal parameter list different from definition"
+4030 "first formal parameter list longer than the second list"
+4031 "second formal parameter list longer than the first list"
+4032 "formal parameter %d has different type when promoted"
+4033 "'%Fs' must return a value"
+4034 "sizeof returns 0"
+4035 "'%Fs' : no return value"
+4036 "unnamed %Fs as actual parameter"
+4037 "conflicting ambient class modifiers"
+4038 "'%Fs' : illegal ambient class modifier"
+4039 "ambient class modifier on reference ignored"
+4040 "memory attribute on '%Fs' ignored"
+4041 "illegal modifier for 'this' pointer"
+4042 "'%Fs' : has bad storage class"
+4043 "function specifier used more than once"
+4044 "specifier __huge on '%Fs' ignored; can only be applied to array"
+4045 "'%Fs' : array bounds overflow"
+4046 "'%Fs' : unsized array treated as %Fs"
+4047 "'%Fs' : different levels of indirection"
+4048 "different declared array subscripts"
+4049 "'%Fs' : indirection to different types"
+4050 "'%Fs' : different code attributes"
+4051 "type conversion; possible loss of data"
+4052 "function declarations different; one contains variable arguments"
+4053 "one void operand for '?:'"
+4054 "function pointer cast to a data pointer"
+4055 "data pointer cast to a function pointer"
+4056 "overflow in floating point constant arithmetic"
+4057 "'%Fs' : indirection to slightly different base types"
+4058 "unions are now aligned on alignment requirement, not size"
+
+4067 "unexpected characters following '%Fs' directive - newline expected"
+4068 "unknown pragma"
+
+4070 "return of a 'void' expression"
+4071 "'%Fs' : no function prototype given"
+4072 "'%Fs' : no function prototype on __fastcall function"
+4073 "initializers put in library initialization area"
+4074 "initializers put in compiler reserved initialization area"
+4075 "initializers put in unrecognized initialization area"
+4076 "'%Fs' : may be used on integral types only"
+4077 "unknown check_stack option"
+4078 "case constant '%ld' too big for the type of the switch expression"
+4079 "unexpected token '%Fs'"
+4080 "expected identifier for segment name; found '%Fs'"
+4081 "expected a comma; found '%Fs'"
+4082 "expected an identifier; found '%Fs'"
+4083 "expected '('; found '%Fs'"
+4084 "expected a pragma directive; found '%Fs'"
+4085 "expected 'on' or 'off'"
+4086 "expected '1', '2', '4', or '8'"
+4087 "'%Fs' : declared with 'void' parameter list"
+4088 "'%Fs' : pointer mismatch in actual parameter %d, formal parameter %d"
+4089 "'%Fs' : different types in actual parameter %d, formal parameter %d"
+4090 "'%Fs' : different const or volatile qualifiers"
+4091 "no symbols were declared"
+4092 "sizeof returns 'unsigned long'"
+4093 "unescaped newline in character constant in inactive code"
+4094 "untagged '%Fs' declared no symbols"
+4095 "expected ')'; found '%Fs'"
+4096 "'%Fs' must be used with '%Fs'"
+4097 "nonstandard extension : typedef-name '%Fs' used as synonym for class-name '%Fs'"
+4098 "'%Fs' : 'void' function returning a value"
+4099 "type declared with '%Fs' is defined with '%Fs'"
+4100 "'%Fs' : unreferenced formal parameter"
+4101 "'%Fs' : unreferenced local variable"
+4102 "'%Fs' : unreferenced label"
+4103 "'%Fs' : used #pragma pack to change alignment"
+4104 "'%Fs' : near data in same_seg pragma; ignored"
+4105 "'%Fs' : code modifiers only on function or pointer to function"
+4106 "pragma requires an integer between 1 and 127"
+4107 "pragma requires an integer between 15 and 255"
+4108 "pragma requires an integer between 79 and 132"
+4109 "unexpected identifier '%Fs'"
+4110 "unexpected token 'number'"
+4111 "unexpected token 'string'"
+4112 "#line requires an integer between 1 and 32767"
+4113 "function parameter lists differed"
+4114 "same type qualifier used more than once"
+4115 "'%Fs' : named type definition in parentheses"
+4116 "unnamed type definition in parentheses"
+4117 "macro name '%Fs' is reserved, '%Fs' ignored"
+4118 "pragma not supported"
+4119 "different bases '%Fs' and '%Fs' specified"
+4120 "based/unbased mismatch"
+4121 "'%Fs' : alignment of a member was sensitive to packing"
+4122 "'%Fs' : alloc_text applicable only to functions with C linkage"
+4123 "different base expressions specified"
+4124 "__fastcall with stack checking is inefficient"
+4125 "decimal digit terminates octal escape sequence"
+4126 "'%c' : unknown memory-model command-line option"
+4127 "conditional expression is constant"
+4128 "storage-class specifier after type"
+4129 "'%c' : unrecognized character escape sequence"
+4130 "'%Fs' : logical operation on address of string constant"
+4131 "'%Fs' : uses old-style declarator"
+4132 "'%Fs' : const object should be initialized"
+4133 "'%Fs' : incompatible types - 'void' pointer combined with non-'void' pointer"
+4134 "conversion between pointers to members of same class"
+4135 "conversion between different integral types"
+4136 "conversion between different floating-point types"
+4137 "'%Fs' : no return value from floating-point function"
+4138 "'*/' found outside of comment"
+4139 "'0x%lx' : hex escape sequence is out of range"
+4140 "'%Fs' : redefined, preceding references may be invalid"
+4141 "'%Fs' : used more than once"
+4142 "benign redefinition of type"
+4143 "pragma 'same_seg' not supported; use __based allocation"
+4144 "'%Fs' : relational expression as switch expression"
+4145 "'%Fs' : relational expression as switch expression; possible confusion with '%Fs'"
+
+4146 "unary minus operator applied to unsigned type, result still unsigned"
+4147 "'%Fs' : '%Fs' ignored on pointer and reference declarations"
+4148 "'%Fs' : DS != SS for '__near' '%Fs'"
+4149 "'%Fs' : different ambient model than base class '%Fs'"
+4150 "deletion of pointer to incomplete type '%Fs'; no destructor called"
+4151 "'%Fs' : operator should be explicitly '%Fs'"
+4152 "non standard extension, function/data ptr conversion in expression"
+4153 "function/data ptr conversion in expression"
+4154 "deletion of an array expression; conversion to pointer supplied"
+4155 "deletion of an array expression without using the array form of 'delete'"
+4156 "deletion of an array expression without using the array form of 'delete'; array form substituted"
+
+4184 "near call to thunk for '%Fs' in a different segment"
+
+4241 "'%Fs' : member access is restricted"
+
+4245 "'friend' specified for nonexistent function '%Fs'"
+
+4247 "'%Fs' not accessible because '%Fs' uses '%Fs' to inherit from '%Fs'"
+4248 "'%Fs' : cannot access '%Fs' member declared in class '%Fs'"
+4249 "'%Fs' : no path to '%Fs' member declared in virtual base '%Fs'"
+4250 "'%Fs' : inherits '%Fs::%Fs' via dominance"
+4251 "'%Fs' : base type '%Fs' should be exported to export %Fs '%Fs'"
+4252 "'%Fs' is not defined; cannot specify CV information."
+
+4260 "no override, '%Fs::%Fs' has %Fs 'this' memory model whereas '%Fs::%Fs' has %Fs 'this' memory model"
+4261 "no override, '%Fs::%Fs' has %Fs calling convention whereas '%Fs::%Fs' has %Fs calling convention"
+
+4300 "conversion of pointer to nonintegral type"
+4301 "truncation during conversion of pointer to integral type"
+4302 "truncation during conversion of pointer to function"
+4303 "truncation during conversion of pointer to function to pointer to object"
+4304 "truncation during pointer conversion"
+4305 "truncation during conversion of integral type to pointer"
+4306 "conversion of integral type to pointer of greater size"
+4307 "'%Fs' : integral constant overflow; result truncated"
+4308 "negative integral constant converted to unsigned type"
+4309 "'%Fs' : truncation of constant value"
+
+4341 "signed value out of range for enum constant"
+4342 "precision lost in initialization of enum constant"
+
+4354 "'%Fs' : initialization of reference to member requires a temporary variable"
+4355 "'this' : used in base member initializer list"
+
+4385 "%Fs the '%Fs' in base '%Fs'"
+4386 "%Fs to the '%Fs' in base '%Fs'"
+
+4401 "'%Fs' : member is bit field"
+4402 "must use PTR operator"
+4403 "illegal PTR operator"
+4404 "period on directive ignored"
+4405 "'%Fs' : identifier is reserved word"
+4406 "operand on directive ignored"
+
+4409 "illegal instruction size"
+4410 "illegal size for operand"
+4411 "'%Fs' : symbol resolves to displacement register"
+
+4414 "'%Fs' : short jump to function converted to near"
+
+4500 "'%Fs' : class has private/protected data members; user-defined constructor advised"
+4501 "'%Fs' : use of '::' unnecessary here"
+4502 "'linkage' requires use of keyword 'extern'"
+
+4505 "'%Fs' : unreferenced local function has been removed"
+4506 "no definition for inline function '%Fs'"
+4507 "explicit linkage specified after default linkage was used"
+4508 "'%Fs' : function should return a value; 'void' return type assumed"
+
+4510 "'%Fs' : default constructor could not be generated"
+4511 "'%Fs' : copy constructor could not be generated"
+4512 "'%Fs' : assignment operator could not be generated"
+4513 "'%Fs' : destructor could not be generated"
+
+4520 "'%Fs' : multiple default constructors specified"
+4521 "'%Fs' : multiple copy constructors specified"
+4522 "'%Fs' : multiple assignment operators specified"
+4523 "'%Fs' : multiple destructors specified"
+4524 "'%Fs' : redundant use of 'friend' on destructor"
+4525 "'%Fs' : redundant use of 'friend' on constructor"
+
+4527 "instances of %Fs '%Fs' can never be destroyed - user-defined destructor required"
+4528 "illegal 'pure' syntax, must be '= 0'"
+
+4607 "'%Fs' : must be initialized in constructor base/member initializer list"
+
+4610 "%Fs '%Fs' can never be instantiated - user defined constructor required"
+
+4612 "bad #pragma syntax, pragma ignored"
+4613 "'%Fs' : class of segment cannot be changed"
+4614 "'%Fs' : varargs parameters with this type were promoted"
+4615 "#pragma warning : unknown user warning type"
+4616 "#pragma warning : warning number '%d' out of range, must be between '%d' and '%d'"
+4617 "#pragma warning : invalid warning number"
+
+4620 "no postfix form of 'operator ++' found for type '%Fs', using prefix form"
+4621 "no postfix form of 'operator --' found for type '%Fs', using prefix form"
+4622 "Overwriting debug information formed during creation of the precompiled header in object file: '%s'"
+
+4630 "'%Fs' : '%Fs' storage class specifier illegal on member definition"
+
+4650 "debugging information not in precompiled header; only global symbols from the header will be available"
+4651 "'/D%s' specified for precompiled header but not for current compile"
+4652 "command-line option '%Fs' inconsistant with precompiled header; PCH option ignored"
+
+4706 "assignment within conditional expression"
+
+4710 "'%Fs' : function not expanded"
+
+4726 "'%c' : unknown memory model command-line option"
+4727 "conditional expression is constant"
+
+4741 "/Oq option ignored for __fastcall function '%Fs'"
+
+4746 "'%Fs' : unsized array given size %Fs"
+
+4756 "overflow in constant arithmetic"
+
+4758 "address of automatic (local) variable taken, DS != SS"
+4759 "segment lost in conversion"
+
+4761 "integral size mismatch in argument : conversion supplied"
+4762 "near/far mismatch in argument : conversion supplied"
+
+4769 "conversion of near pointer to long integer"
+
+4785 "near call to '%Fs' in different segment"
+
+4788 "'%Fs' : identifier was truncated to '%d' characters"
+
+4793 "native code generated for p-code function '%Fs' with inline assembly"
+
+4900 "Il mismatch between '%s' version '%ld' and '%s' version '%ld'"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4000 "UNKNOWN WARNING\n\t\tContact Microsoft Product Support Services"
+
+
+2001 "newline in constant"
+2002 "invalid wide-character constant"
+2003 "expected 'defined id'"
+2004 "expected 'defined(id)'"
+2005 "#line expected a line number, found '%Fs'"
+2006 "#include expected a file name, found '%Fs'"
+2007 "#define syntax"
+2008 "'%c' : unexpected in macro definition"
+2009 "reuse of macro formal '%Fs'"
+2010 "'%c' : unexpected in macro formal parameter list"
+2011 "'%Fs' : '%Fs' type redefinition"
+2012 "missing name following '<'"
+2013 "missing '>'"
+2014 "preprocessor command must start as first nonwhite space"
+2015 "too many characters in constant"
+2016 "no closing single quotation mark"
+2017 "illegal escape sequence"
+2018 "unknown character '0x%x'"
+2019 "expected preprocessor directive, found '%c'"
+2020 "'%Fs' : '%Fs' member redefinition"
+2021 "expected exponent value, not '%c'"
+2022 "'%ld' : too big for character"
+2023 "divide by 0"
+2024 "mod by 0"
+2025 "'%s' : enum/struct/union type redefinition"
+2026 "string too big, trailing characters truncated"
+2027 "use of undefined type '%Fs'"
+2028 "struct/union member must be inside a struct/union"
+2029 "left of '%s' specifies undefined class/struct/union '%Fs'"
+2030 "'%Fs' : struct/union member redefinition"
+2031 "'%Fs' : function cannot be struct/union member"
+2032 "'%Fs' : function cannot be member of %Fs '%Fs'"
+2033 "'%Fs' : bit field cannot have indirection"
+2034 "'%Fs' : type of bit field too small for number of bits"
+2035 "struct/union '%Fs' : unknown size"
+2036 "'%Fs' : unknown size"
+2037 "left of '%s' specifies undefined struct/union '%Fs'"
+2038 "'%s' : not struct/union member"
+2039 "'%Fs' : is not a member of '%Fs'"
+2040 "'%Fs' : different levels of indirection"
+2041 "illegal digit '%c' for base '%d'"
+2042 "signed/unsigned keywords mutually exclusive"
+2043 "illegal break"
+2044 "illegal continue"
+2045 "'%Fs' : label redefined"
+2046 "illegal case"
+2047 "illegal default"
+2048 "more than one default"
+2049 "case value '%ld' already used"
+2050 "nonintegral switch expression"
+2051 "case expression not constant"
+2052 "case expression not integral"
+2053 "'%Fs' : wide string mismatch"
+2054 "expected '(' to follow '%Fs'"
+2055 "expected formal parameter list, not a type list"
+2056 "illegal expression"
+2057 "expected constant expression"
+2058 "constant expression is not integral"
+2059 "syntax error : '%Fs'"
+2060 "syntax error : end-of-file found"
+2061 "syntax error : identifier '%Fs'"
+2062 "type '%Fs' unexpected"
+2063 "'%Fs' : not a function"
+2064 "term does not evaluate to a function"
+2065 "'%Fs' : undeclared identifier"
+2066 "cast to function type is illegal"
+2067 "cast to array type is illegal"
+2068 "illegal cast"
+2069 "cast of 'void' term to non-'void'"
+2070 "illegal sizeof operand"
+2071 "'%Fs' : illegal storage class"
+2072 "'%Fs' : initialization of a function"
+2073 "'%Fs' : partially initialized array requires a default constructor"
+2074 "'%Fs' : '%Fs' initialization needs curly braces"
+2075 "'%Fs' : array initialization needs curly braces"
+2076 "'%Fs' : struct/union initialization needs curly braces"
+2077 "nonscalar field initializer '%Fs'"
+2078 "too many initializers"
+2079 "'%Fs' uses undefined class/struct/union '%Fs'"
+2080 "illegal __far __fastcall function or __saveregs function"
+2081 "'%Fs' : name in formal parameter list illegal"
+2082 "redefinition of formal parameter '%Fs'"
+2083 "%Fs comparison illegal"
+2084 "function '%Fs' already has a body"
+2085 "'%Fs' : not in formal parameter list"
+2086 "'%Fs' : redefinition"
+2087 "'%Fs' : missing subscript"
+2088 "'%Fs' : illegal for %Fs"
+2089 "'%Fs' : '%Fs' too large"
+2090 "function returns array"
+2091 "function returns function"
+2092 "array element type cannot be function"
+2093 "cannot use address of automatic variable as static initializer"
+2094 "label '%Fs' was undefined"
+2095 "'%Fs' : actual has type 'void' : parameter %d"
+2096 "struct/union comparison illegal"
+2097 "illegal initialization"
+2098 "nonaddress expression"
+2099 "nonconstant initializer"
+2100 "illegal indirection"
+2101 "'%Fs' on constant"
+2102 "'%Fs' requires lvalue"
+2103 "'%Fs' on register variable"
+2104 "'%Fs' on bit field ignored"
+2105 "'%Fs' needs lvalue"
+2106 "'%Fs' : left operand must be lvalue"
+2107 "illegal index, indirection not allowed"
+2108 "nonintegral index"
+2109 "subscript on nonarray"
+2110 "pointer + pointer"
+2111 "pointer + nonintegral value"
+2112 "illegal pointer subtraction"
+2113 "pointer subtracted from nonpointer"
+2114 "'%Fs' : pointer on left; needs integral value on right"
+2115 "'%Fs' : incompatible types"
+2116 "function parameter lists differed"
+2117 "'%Fs' : array bounds overflow"
+2118 "negative subscript"
+2119 "typedef types both define indirection"
+2120 "'void' illegal with all types"
+2121 "'%Fs' : bad %Fs operand"
+2122 "'%Fs' : prototype parameter in name list illegal"
+2123 "'%Fs' : cannot call __fastcall function '%Fs' from p-code"
+2124 "divide or mod by zero"
+2125 "'%Fs' : allocation exceeds 64K"
+2126 "'%Fs' : incorrect operand"
+2127 "parameter allocation exceeds 32K"
+2128 "'%Fs' : alloc_text/same_seg applicable only to functions with C linkage"
+2129 "static function '%Fs' declared but not defined"
+2130 "#line expected a string containing the file name, found '%Fs'"
+2131 "more than one memory attribute"
+2132 "syntax error : unexpected identifier"
+2133 "'%Fs' : unknown size"
+2134 "'%Fs' : struct/union too large"
+2135 "'%Fs' : illegal bit field operation"
+2136 "'%Fs' : prototype must have parameter types"
+2137 "empty character constant"
+2138 "illegal to define an enumeration without any members"
+2139 "type following '%s' is illegal"
+2140 "parameter cannot be function type"
+2141 "value out of range for enum constant"
+2142 "function declarations differ, variable parameters specified only in one of them"
+2143 "syntax error : missing '%Fs' before '%Fs'"
+2144 "syntax error : missing '%Fs' before type '%Fs'"
+2145 "syntax error : missing '%Fs' before identifier"
+2146 "syntax error : missing '%Fs' before identifier '%Fs'"
+2147 "'%Fs' : const array must be fully initialized"
+2148 "array too large"
+2149 "'%Fs' : named bit field cannot have zero width"
+2150 "'%Fs' : bit field must have type 'int', 'signed int', or 'unsigned int'"
+2151 "more than one language attribute"
+2152 "'%Fs' : pointers to functions with different attributes"
+2153 "hex constants must have at least one hex digit"
+2154 "'%Fs' : does not refer to a segment name"
+
+2156 "pragma must be outside function"
+2157 "'%Fs' : must be declared before use in pragma list"
+2158 "'%Fs' : is a function"
+2159 "more than one storage class specified"
+2160 "## cannot occur at the beginning of a macro definition"
+2161 "## cannot occur at the end of a macro definition"
+2162 "expected macro formal parameter"
+2163 "'%Fs' : not available as an intrinsic function"
+2164 "'%Fs' : intrinsic function not declared"
+2165 "'%Fs' : cannot modify pointers to data"
+2166 "lvalue specifies const object"
+2167 "'%Fs' : too many actual parameters for intrinsic function"
+2168 "'%Fs' : too few actual parameters for intrinsic function"
+2169 "'%Fs' : intrinsic function, cannot be defined"
+2170 "'%Fs' : not declared as a function, cannot be intrinsic"
+2171 "'%Fs' : illegal operand"
+2172 "'%Fs' : actual parameter is not a pointer : parameter %d"
+2173 "'%Fs' : actual parameter is not a pointer : parameter %d, parameter list %d"
+2174 "'%Fs' : actual parameter has type 'void' : parameter %d, parameter list %d"
+
+2176 "static huge data not supported by '%Fs'"
+2177 "constant too big"
+2178 "'%Fs' : storage class for same_seg variables must be extern"
+2179 "'%Fs' : was used in same_seg, but storage class is no longer extern"
+2180 "controlling expression has type 'void'"
+
+2182 "'%Fs' : has type 'void'"
+
+2184 "illegal return of a 'void' value"
+2185 "'%Fs' : illegal based allocation"
+2186 "'%Fs' : illegal operand of type 'void'"
+2187 "cast of near function pointer to far function pointer"
+2188 "'%ld' : too big for wide character"
+2189 "#error : %Fs"
+2190 "first parameter list longer than second"
+2191 "second parameter list longer than first"
+2192 "parameter '%d' declaration different"
+2193 "'%Fs' : already in a segment"
+2194 "'%Fs' : is a text segment"
+2195 "'%Fs' : is a data segment"
+2197 "'%Fs' : too many actual parameters"
+2198 "'%Fs' : too few actual parameters"
+2199 "syntax error : found '%Fs (' at global scope. (was a declaration intended?)"
+2200 "'%Fs' : function has already been defined"
+2201 "'%Fs' : cannot export static declarations"
+2202 "'%Fs' : not all control paths return a value"
+2203 "delete operator cannot specify bounds for an array"
+2204 "'%Fs' : parenthesized type definition"
+2205 "'%Fs' : cannot initialize extern block scoped variables"
+2206 "'%Fs' : typedef cannot be used for function definition"
+2207 "'%Fs' in struct/union '%Fs' has a zero-sized array"
+2208 "'%Fs' : no members defined using this type"
+2209 "type cast in __based construct must be (__segment)"
+2210 "'%Fs' : must be near/far data pointer"
+2211 "(__segment) applied to function identifier '%Fs'"
+2212 "'%Fs' : __based not available for pointers to functions"
+2213 "'%Fs' : illegal argument to __based"
+2214 "pointers based on 'void' require the use of :>"
+2215 ":> operator only for objects based on 'void'"
+2216 "'%Fs' cannot be used with '%Fs'"
+2217 "'%Fs' must be used with '%Fs'"
+2218 "type in __based construct must be 'void'"
+2219 "syntax error : type qualifier must be after '*'"
+2220 "warning treated as error - no object file generated"
+2221 "'.' : left operand points to class/struct/union, use '->'"
+2222 "'->' : left operand has struct/union type, use '.'"
+2223 "left of '->%Fs' must point to class/struct/union"
+2224 "left of '.%Fs' must have class/struct/union type"
+2225 "'%Fs' : function allocation must be in a named segment"
+2226 "syntax error : unexpected type '%Fs'"
+2227 "left of '->%Fs' must point to class/struct/union"
+2228 "left of '.%Fs' must have class/struct/union type"
+2229 "%Fs '%Fs' has an illegal zero-sized array"
+2230 "'%Fs' : indirection to different types"
+2231 "'.' : left operand points to '%Fs', use '->'"
+2232 "'->' : left operand has '%Fs' type, use '.'"
+
+2234 "arrays of references are illegal"
+2235 "';' in formal parameter list"
+2236 "unexpected '%Fs' '%Fs'"
+2237 "unexpected %Fs '%Fs'"
+2238 "unexpected token[s] preceding '%s'"
+2239 "unexpected token '%Fs' following declaration of '%Fs'"
+2240 "unexpected '%Fs' following formal list. (only modifiers are allowed.)"
+2241 "'%Fs' : member access is restricted"
+
+2244 "'%Fs' : unable to resolve function overload"
+2245 "nonexistent function '%Fs' specified as friend"
+2246 "'%Fs' : illegal static data member in locally defined class"
+2247 "'%Fs' not accessible because '%Fs' uses '%Fs' to inherit from '%Fs'"
+2248 "'%Fs' : cannot access '%Fs' member declared in class '%Fs'"
+2249 "'%Fs' : no accessible path to '%Fs' member declared in virtual base '%Fs'"
+2250 "'%Fs' : ambiguous inheritance of '%Fs::%Fs'"
+
+2252 "'%Fs' : pure specifier can only be specified for functions"
+2253 "'%Fs' : pure specifier only applies to virtual function -- specifier ignored"
+2254 "'%Fs' : pure specifier not allowed on friend functions"
+2255 "'%Fs' : a friend function can only be declared in a class"
+2256 "illegal use of friend specifier on '%Fs'"
+2257 "p-code generation pragma not allowed without /Oq"
+2258 "illegal pure syntax, must be '= 0'"
+2259 "'%Fs' : illegal attempt to instantiate abstract class"
+2260 "function pointer cast to a data pointer "
+2261 "data pointer cast to a function pointer"
+2262 "'%Fs' : cannot be destroyed"
+2263 "function returns pointer based on __self"
+2264 "'%Fs' : error in function definition or declaration; function not called"
+2265 "'%Fs' : reference to a zero sized array is illegal"
+2266 "'%Fs' : reference to a nonconstant bounded array is illegal"
+2267 "'%Fs' : block scoped static functions are illegal"
+2268 "'%Fs' : different const or volatile qualifiers"
+2269 "'%Fs' : different ambient model than base class '%Fs'"
+2270 "'%Fs' : modifiers not allowed on nonmember functions"
+2271 "'%Fs' : new/delete cannot have formal list modifiers"
+2272 "'%Fs' : modifiers not allowed on static member functions"
+2273 "'%Fs' : illegal as right side of '->' operator"
+2274 "'%Fs' : illegal as right side of '.' operator"
+2275 "'%Fs' : illegal use of this type as an expression"
+2276 "illegal address of bound member function expression"
+2277 "'%Fs' : cannot take the address of a constructor"
+2278 "'%Fs' : no function with C linkage found"
+2279 "cannot use braces to initialize default arguments"
+2280 "missing '{' before identifier '%Fs'?"
+2281 "'%Fs' : is not a function, but contains <function returning>. '%Fs' is unexpected."
+2282 "'%Fs' is followed by '%Fs'. (missing ','?)"
+2283 "'%Fs' : pure specifier not allowed on un-named %Fs"
+
+2290 "C++ '%Fs' syntax is reserved for future use"
+
+2350 "'%Fs' is not a static member"
+2351 "obsolete C++ constructor initialization syntax"
+2352 "'%Fs::%Fs' : illegal call of non-static member function"
+2353 "'%Fs' : improper use of constructor initializers"
+2354 "'%Fs' : initialization of reference member requires a temporary variable"
+2355 "'this' : can only be referenced inside non-static member functions"
+2356 "initialization segment must not change during translation unit"
+
+2360 "Initialization of '%Fs' is skipped by 'case' label"
+2361 "Initialization of '%Fs' is skipped by 'default' label"
+2362 "Initialization of '%Fs' is skipped by 'goto %Fs'"
+
+2370 "'%Fs' : redefinition; different storage class"
+2371 "'%Fs' : redefinition; different basic types"
+2372 "'%Fs' : redefinition; different types of indirection"
+2373 "'%Fs' : redefinition; different type modifiers"
+2374 "'%Fs' : redefinition; multiple initialization"
+2375 "'%Fs' : redefinition; different linkage"
+
+2377 "'%Fs' : redefinition; typedef cannot be overloaded with any other symbol"
+2378 "'%Fs' : redefinition; symbol cannot be overloaded with a typedef"
+2379 "formal parameter %d has different type when promoted"
+2380 "type[s] preceding '%Fs'. (constructor with return type, or illegal redefinition of current class-name?)"
+
+2385 "'%Fs::%Fs' is ambiguous"
+2386 "ambiguous conversion from '%Fs*' to '%Fs*'"
+2387 "ambiguous conversion from '%Fs&' to '%Fs&'"
+
+2390 "'%Fs' : incorrect storage class '%Fs'"
+
+2400 "inline syntax error in '%Fs'; found '%Fs'"
+2401 "'%Fs' : register must be base in '%Fs'"
+2402 "'%Fs' : register must be index in '%Fs'"
+2403 "'%Fs' : register must be base/index in '%Fs'"
+2404 "'%Fs' : illegal register in '%Fs'"
+2405 "illegal short forward reference with offset"
+2406 "'%Fs' : name undefined in '%Fs'"
+2407 "illegal 'float' register in '%Fs'"
+2408 "illegal type on PTR operator in '%Fs'"
+2409 "illegal type used as operator in '%s'"
+2410 "'%Fs' : ambiguous member name in '%Fs'"
+2411 "'%Fs' : illegal struct/union member in '%Fs'"
+2412 "'%Fs' : case-insensitive label redefined"
+2413 "'%Fs' : illegal align size"
+2414 "illegal number of operands"
+2415 "improper operand type"
+2416 "'%Fs' : illegal opcode for processor"
+2417 "divide by zero in '%Fs'"
+2418 "'%Fs' : not in a register"
+2419 "mod by zero in '%Fs'"
+2420 "'%Fs' : illegal symbol in %Fs"
+2421 "PTR operator used with register in '%Fs'"
+2422 "illegal segment override in '%Fs'"
+2423 "'%ld' : illegal scale"
+2424 "'%Fs' : improper expression in '%Fs'"
+2425 "'%Fs' : nonconstant expression in '%Fs'"
+2426 "'%Fs' : illegal operator in '%Fs'"
+2427 "'%Fs' : jump referencing label is out of range"
+
+2429 "'%Fs' : illegal far label reference"
+2430 "more than one index register in '%Fs'"
+2431 "illegal index register in '%Fs'"
+2432 "illegal reference to 16-bit data in '%Fs'"
+2433 "'%Fs' : '%Fs' not permitted on data declarations"
+2434 "'%Fs' : cannot convert default argument from '%Fs' to '%Fs'"
+
+2436 "'%Fs' : cannot initialize member functions"
+2437 "'%Fs' : already initialized"
+2438 "'%Fs' : cannot initialize static class data via constructor"
+2439 "'%Fs' : member could not be initialized"
+2440 "'%Fs' : cannot convert from '%Fs' to '%Fs'"
+
+2442 "p-code expression too complex for setjmp or Catch"
+2443 "operand size conflict"
+
+2446 "'%Fs' : no conversion between '%Fs' and '%Fs'"
+2447 "missing function header (old-style formal list?)"
+2448 "'%Fs' : function-style initializer appears to be a function definition"
+
+2450 "switch expression of type '%Fs' is illegal"
+2451 "conditional expression of type '%Fs' is illegal"
+
+2458 "'%Fs' : redefinition within definition"
+2459 "'%Fs' : is being defined; cannot add as an anonymous member"
+2460 "'%Fs' : uses '%Fs', which is being defined"
+2461 "'%Fs' : constructor syntax missing formal parameters"
+2462 "'%Fs' : cannot define a type in a 'new-expression'"
+2463 "cannot define an anonymous type in a 'new-expression'"
+2464 "'%Fs' : cannot use 'new' to allocate a reference"
+2465 "cannot define an anonymous type inside parentheses"
+2466 "cannot allocate an array of constant size 0"
+2467 "illegal declaration of anonymous '%Fs'"
+
+2500 "'%Fs' : '%Fs' is already a direct base class"
+2501 "'%Fs' : missing decl-specifiers"
+2502 "'%Fs' : too many access modifiers on the base class"
+2503 "'%Fs' : base classes cannot contain zero-sized arrays"
+2504 "'%Fs' : base class undefined"
+2505 "'%Fs' : is not a legal base class"
+2506 "'%Fs::%Fs' : ambiguous"
+2507 "'%Fs' : too many virtual modifiers on the base class"
+2508 "'%Fs' : access denied"
+2509 "'%Fs' : member function not declared in '%Fs'"
+2510 "'%Fs' : left of '::' must be a class/struct/union"
+2511 "'%Fs' : overloaded member function not found in '%Fs'"
+2512 "'%Fs' : no appropriate default constructor available"
+2513 "'%Fs' : decl-specifier is missing a declarator before '='"
+2514 "'%Fs' : class has no constructors"
+2515 "'%Fs' : not in class '%Fs'"
+
+2517 "'%Fs' : right of '::' is undefined"
+
+2519 "cannot convert '%Fs *' to '%Fs *'"
+
+2523 "'%Fs::~%Fs' : destructor tag mismatch"
+2524 "'%Fs' : destructors must have a 'void' formal parameter list"
+
+2527 "'%Fs' : array of references must be fully initialized"
+2528 "illegal pointer to reference"
+2529 "illegal reference to a reference"
+2530 "'%Fs' : references must be initialized"
+2531 "'%Fs' : reference to a bit field illegal"
+2532 "'%s' : cannot modify references"
+2533 "'%Fs' : constructors not allowed a return type"
+2534 "'%Fs' : constructor cannot return a value"
+2535 "'%Fs' : member function already defined or declared"
+2536 "'%Fs::%Fs' : cannot specify explicit initializer for arrays"
+2537 "'%Fs' : illegal linkage specification"
+2538 "new : cannot specify initializer for arrays"
+2539 "new : '%Fs' no default constructor to initialize arrays of objects"
+2540 "nonconstant expression as array bound"
+2541 "delete : cannot delete nonpointer objects"
+2542 "'%Fs' : class object has no constructor for initialization"
+2543 "expected ']' for operator '[]'"
+2544 "expected ')' for operator '()'"
+2545 "'%Fs' : unable to find overloaded operator"
+2546 "'%Fs' : illegal mix of 'void' pointer with non-'void' pointer"
+2547 "illegal cast of overloaded function"
+2548 "'%Fs::%Fs' : missing default parameter for parameter %s"
+2549 "user-defined conversion cannot specify a return type"
+
+2551 "'void *' type needs explicit cast to non-'void' pointer type"
+2552 "'%Fs' : non-aggregates cannot be initialized with initializer list"
+2553 "no legal conversion of return value to return type '%Fs'"
+2555 "'%Fs::%Fs' : overriding virtual function differs from '%Fs::%Fs' only by return type"
+2556 "'%Fs' : overloaded functions only differ by return type"
+2557 "'%Fs' : non-public members cannot be initialized without a constructor"
+2558 "'%Fs' : no copy constructor available"
+2559 "'%Fs' : no match for specified operator"
+2560 "'%Fs' : overloaded function differs only by calling convention/memory model"
+2561 "'%Fs' : function must return a value"
+2562 "'%Fs' : 'void' function returning a value"
+2563 "mismatch in formal parameter list"
+2564 "formal/actual parameters mismatch in call through pointer to function"
+2565 "'::%Fs' was previously declared as a global function"
+2566 "overloaded function in conditional expression"
+
+2568 "'%Fs' : unable to resolve function overload '%Fs'"
+2569 "'%Fs' : union cannot be used as a base class"
+2570 "'%Fs' : union cannot have base classes"
+2571 "'%Fs' : union cannot have virtual function '%Fs'"
+2572 "'%Fs::%Fs' : redefinition of default parameter : parameter %s"
+2573 "'%Fs' : simple type cast must have exactly one expression"
+2574 "'%Fs' : illegal static destructor declaration"
+2575 "'%Fs' : only member functions and bases can be virtual"
+2576 "'%Fs' : virtual used for static member function"
+2577 "'%Fs' : destructor cannot return a value"
+
+2579 "'%Fs::%Fs(%s)' : parameter list not sufficiently different to '%Fs::%Fs(%s)'"
+2580 "redefinition of class name '%Fs'"
+2581 "'%Fs' : static 'operator =' function is illegal"
+2582 "'%Fs' : 'operator =' function is unavailable"
+2583 "'%Fs' : illegal const/volatile 'this' pointer used for constructors/destructors"
+2584 "'%Fs' : direct base '%Fs' is inaccessible; already a base of '%Fs'"
+2585 "explicit conversion to '%Fs' is ambiguous"
+2586 "incorrect user-defined conversion syntax : illegal indirections"
+2587 "'%Fs' : illegal use of local variable as default parameter"
+2588 "'::~%Fs' : illegal global destructor"
+2589 "'%Fs' : illegal token on right side of '::'"
+2590 "'%Fs' : ambiguous user-defined conversions in switch expression"
+2591 "'%Fs' : ambiguous user-defined conversions in conditional expression"
+2592 "no legal conversion of initialization expression to type '%Fs'"
+2593 "'operator %Fs' is ambiguous"
+2594 "'%Fs' : ambiguous conversions from '%Fs' to '%Fs'"
+2595 "'%Fs' : qualified name already has a constructor"
+2596 "'%Fs' : qualified name already has a destructor"
+2597 "'%Fs' : does not specify an object"
+2598 "linkage specification must be at global scope"
+2599 "'%Fs' : local functions are not supported"
+2601 "functions cannot be defined in local classes"
+2602 "'%Fs::%Fs' is not a member of a base of '%Fs'"
+2603 "illegal access declaration: '%Fs' is not a direct base of '%Fs'"
+2604 "cannot declare %Fs access to %Fs member '%Fs::%Fs'"
+2605 "overloaded functions '%Fs::%Fs' do not have same access"
+2606 "'%Fs::%Fs': illegal private access declaration"
+2607 "'%Fs' : cannot implicitly convert a '%Fs' to a non-const '%Fs'"
+2608 "illegal reference cast - operand not an lvalue"
+
+2610 "%Fs '%Fs' can never be instantiated; user defined constructor is required"
+2611 "'%Fs' : illegal following '~' (expected identifier)"
+2612 "trailing '%Fs' illegal in base/member initializer list"
+2613 "trailing '%Fs' illegal in base class list"
+2614 "'%Fs' : illegal member initialization: '%Fs' is not a base or member"
+2615 "memory attribute must appear before class name in pointer to member"
+2617 "'%Fs' : inconsistent return statement"
+2618 "'%Fs' : inconsistent return statement"
+2619 "union '%Fs' : can not have static member variable '%Fs'"
+2620 "union '%Fs' : member '%Fs' has default constructor"
+2621 "union '%Fs' : member '%Fs' has copy constructor"
+2622 "union '%Fs' : member '%Fs' has assignment operator"
+2623 "union '%Fs' : member '%Fs' has destructor"
+2624 "'%Fs' : references to 'void' are illegal"
+2625 "anonymous union did not declare any non-static data members"
+2626 "anonymous union defines %Fs member '%Fs'"
+2627 "member function defined in unnamed class"
+2628 "'%Fs' followed by '%Fs' is illegal. (did you forget a ';'?)"
+2629 "unexpected '%s ('"
+2630 "'%Fs' found in what should be a comma separated list"
+2631 "'%Fs' : destructors not allowed a return type"
+2632 "'%Fs' followed by '%Fs' is illegal"
+2633 "'%Fs' : 'inline' is the only legal storage class for constructors"
+2634 "'&%Fs::%Fs' : pointer to reference member is illegal"
+2635 "cannot convert a '%Fs*' to a '%Fs*'; conversion from a virtual base class is implied"
+2636 "pointer to reference member is illegal"
+2637 "'%s' : cannot modify pointers to data members"
+2638 "'%Fs' : memory model modifier illegal on pointer to data member"
+2639 "cannot use pointer to member expression &%Fs::%Fs - base '%Fs' is inherited as virtual"
+2640 "cannot convert a pointer to member across a virtual inheritance path"
+2641 "illegal pointer to member cast across virtual inheritance path"
+2642 "cast to pointer to member must be from related pointer to member"
+2643 "illegal cast from pointer to member"
+2644 "basis class '%Fs' for pointer to member has not been defined"
+2645 "no qualified name for pointer to member (found ':: *')"
+2646 "global anonymous unions must be declared static"
+2647 "'%Fs' : cannot dereference a '%Fs' on a '%Fs'"
+2648 "'%Fs' : use of non-static member as default parameter"
+2649 "'%Fs' : is not a '%Fs'"
+2650 "'%Fs' : cannot be a virtual function"
+
+2652 "'%Fs' : illegal copy constructor: first parameter must not be a '%Fs'"
+2653 "'%Fs' : is not a class name"
+2654 "'%Fs' : attempt to access member outside a member function"
+2655 "'%Fs' : definition or redeclaration illegal in current scope"
+2656 "'%Fs' : function not allowed as a bit field"
+2657 "'%Fs::*' found a the start of a statement. (did you forget to specify a type?)"
+2658 "multiple conversions : %Fs(%Fs) and %Fs::operator %Fs()"
+2659 "'%Fs' : overloaded function as left operand"
+2660 "'%Fs' : function does not take %d parameters"
+2661 "'%Fs' : no overloaded function takes %d parameters"
+2662 "'%Fs' : cannot convert 'this' pointer from '%Fs' to '%Fs'"
+2663 "'%Fs' : %d overloads have no legal conversion for 'this' pointer"
+2664 "'%Fs' : cannot convert parameter %d from '%Fs' to '%Fs'"
+2665 "'%Fs' : %d overloads have no legal conversion for parameter %d"
+2666 "'%Fs' : %d overloads have similar conversions"
+2667 "'%Fs' : none of %d overload have a best conversion"
+2668 "'%Fs' : ambiguous call to overloaded function"
+
+2671 "'%Fs' : static member functions do not have 'this' pointers"
+2672 "'%Fs' : new/delete member functions do not have 'this' pointers"
+2673 "'%Fs' : global functions do not have 'this' pointers"
+2674 "'%Fs' : no acceptable conversions from '%Fs' to '%Fs'"
+2675 "unary '%Fs' : '%Fs' does not define this operator or a conversion to a type acceptable to the builtin operator"
+2676 "binary '%Fs' : '%Fs' does not define this operator or a conversion to a type acceptable to the builtin operator"
+2677 "binary '%Fs' : no global operator defined which takes type '%Fs' (or there is no acceptable conversion)"
+
+2701 "'%Fs' : __oldcall function defined with varargs"
+2702 "'%Fs' : __try may not appear in termination block"
+
+2704 "'%Fs' : __va_start intrinsic only allowed in varargs"
+2705 "'%Fs' : illegal jump into __try scope"
+
+2707 "'%Fs' : bad context for intrinsic function"
+
+2710 "cannot delete a pointer to a const object"
+2711 "cannot delete a pointer to a function"
+
+2720 "'%Fs' : '%Fs' storage class specifier illegal on members"
+2721 "'%Fs' : storage class specifier illegal between operator keyword and type"
+2722 "'::%Fs' : illegal following operator command; use 'operator %Fs'"
+2723 "'%Fs' : '%Fs' storage class specifier illegal on function definition"
+
+2730 "'%Fs' : cannot be a base class of itself"
+
+2732 "linkage specification contradicts earlier specification for %Fs"
+2733 "second C linkage of overloaded function '%Fs' not allowed"
+2734 "'%Fs' : non-extern const object must be initialized"
+2735 "'%Fs' keyword is not permitted in formal parameter type specifier"
+2736 "'%Fs' keyword is not permitted in cast"
+2737 "'%Fs' : base class '%Fs' must be exported"
+
+2750 "'%Fs' : 'const T' to 'T' : '%Fs' to '%Fs'"
+2751 "'%Fs' : 'volatile T' to 'T' : '%Fs' to '%Fs'"
+2752 "'%Fs' : 'const T *' to 'T *' : '%Fs' to '%Fs'"
+2753 "'%Fs' : 'volatile T *' to 'T *' : '%Fs' to '%Fs'"
+2754 "'%Fs' : 'const T **' to 'T **' : '%Fs' to '%Fs'"
+2755 "'%Fs' : 'volatile T **' to 'T **' : '%Fs' to '%Fs'"
+2756 "'%Fs' : 'memory model mismatch' : '%Fs' to '%Fs'"
+2757 "'%Fs' : 'language modifier mismatch: '%Fs' to '%Fs'"
+2758 "'%Fs' : must be initialized in constructor base/member initializer list"
+
+2800 "'operator %Fs' cannot be overloaded"
+2801 "'operator %Fs' must be a%Fs member"
+2802 "static member 'operator %Fs' has no formal parameters"
+2803 "'operator %Fs' must have at least one formal parameter of class type"
+2804 "binary 'operator %Fs' has too many parameters"
+2805 "binary 'operator %Fs' has too few parameters"
+2806 "'operator %Fs' has too many formal parameters"
+2807 "the second formal parameter to postfix 'operator %Fs' must be 'int'"
+2808 "unary 'operator %Fs' has too many formal parameters"
+2809 "'operator %Fs' has no formal parameters"
+2810 "second formal parameter for 'operator delete' must be 'unsigned int'"
+2811 "too many formal parameters for based form of 'operator delete'"
+2812 "second formal parameter required for based form of 'operator delete'"
+2813 "too many formal parameters for non-based 'operator delete'"
+2814 "second actual parameter for based form of 'operator delete' must be '__based(void)*'"
+2815 "first actual parameter for based form of 'operator delete' must be '__segment'"
+2816 "alternative form of 'operator delete' must be a member"
+2817 "return type for 'operator delete' must be 'void'"
+2818 "incorrect return type for 'operator ->'"
+2819 "recursive return type for 'operator ->'"
+2820 "second formal parameter required for based form of 'operator new'"
+2821 "first formal parameter to 'operator new' must be 'unsigned int'"
+2822 "second formal parameter for __huge form of 'operator new' must be 'unsigned int'"
+2823 "return type for based form of 'operator new' must be 'void __based(void)*'"
+2824 "return type for 'operator new' must be 'void *'"
+2825 "first formal parameter for huge form of 'operator new' must be 'unsigned long'"
+2826 "second formal parameter required for __huge form of 'operator new'"
+2827 "'operator %s' cannot be globally overridden with unary form"
+2828 "'operator %s' cannot be globally overridden with binary form"
+2829 "'operator %Fs' cannot have a variable parameter list"
+2830 "only placement parameters to 'operator new' can have default values"
+2831 "'operator %Fs' may not have default parameters"
+
+2833 "'operator %Fs' is not a recognized operator or type"
+2834 "'operator %Fs' must be globally qualified"
+2835 "user-defined conversion '%Fs' takes no formal parameters"
+2836 "cannot export '%Fs': a previous declaration did not export it"
+2837 "'%Fs' : illegal local static variable in exported inline function"
+2838 "illegal qualified name in member declaration"
+
+2850 "#pragma hdrstop cannot be nested in a function or definition"
+2851 "#pragma hdrstop required for /Yu command-line option without filename"
+2852 "'%Fs' is not a valid precompiled header file"
+2853 "'%Fs' is not a precompiled header file created with this compiler"
+2854 "syntax error in #pragma hdrstop"
+2855 "command-line option '%Fs' inconsistant with precompiled header"
+2856 "#pragma hdrstop cannot be inside an #if block"
+2857 "'#include' statement specified with the /Yc%Fs command-line option was not found in the source file"
+
+2000 "UNKNOWN ERROR\n\t\tContact Microsoft Product Support Services"
+
+
+
+1001 "INTERNAL COMPILER ERROR\n\t\t(compiler file '%s', line %d)\n\t\tContact Microsoft Product Support Services"
+
+1003 "error count exceeds %d; stopping compilation"
+1004 "unexpected end of file found"
+1005 "string too big for buffer"
+1006 "write error on compiler-generated file"
+1007 "unrecognized flag '%Fs' in '%Fs'"
+1008 "no input file specified"
+1009 "compiler limit : macros nested too deeply"
+1010 "unexpected end of file while looking for precompiled header directive"
+1011 "compiler limit : '%Fs' : macro definition too big"
+1012 "unmatched parenthesis : missing '%c'"
+1013 "compiler limit : too many open parentheses"
+1014 "too many include files : depth = %d"
+1015 "compiler limit : too many segments"
+1016 "#if[n]def expected an identifier"
+1017 "invalid integer constant expression"
+1018 "unexpected #elif"
+1019 "unexpected #else"
+1020 "unexpected #endif"
+1021 "invalid preprocessor command '%Fs'"
+1022 "expected #endif"
+1023 "cannot open source file '%Fs'"
+1024 "cannot open include file '%Fs'"
+1025 "compiler terminated by user"
+1026 "parser stack overflow, program too complex"
+1027 "DGROUP data allocation exceeds 64K"
+1028 "'%s' : segment allocation exceeds 64K"
+1029 "there are > 512 bytes of arguments"
+1030 "there are > 512 bytes of local variables"
+1031 "compiler limit : function calls nested too deeply"
+1032 "cannot open object code listing file '%s'"
+
+1035 "expression too complex; simplify expression"
+
+1037 "cannot open object file '%s'"
+1038 "compiler limit : '%Fs' : control flow state too complex; simplify function"
+
+1041 "cannot open compiler intermediate file - no more files"
+1042 "cannot open compiler intermediate file - no such file or directory"
+1043 "cannot open compiler intermediate file"
+1044 "out of disk space for compiler intermediate file"
+1045 "compiler limit : linkage specifications nested too deeply"
+1046 "compiler limit : %Fs nested too deeply"
+1047 "limit of %Fs exceeded at '%Fs'"
+1048 "unknown option '%c' in '%s'"
+1049 "invalid numerical argument '%s'"
+1050 "'%s' : code segment too large"
+
+1052 "compiler limit : #if or #ifdef blocks nested too deeply"
+1053 "compiler limit : struct/union nested too deeply"
+1054 "compiler limit : initializers nested too deeply"
+1055 "compiler limit : out of keys"
+1056 "compiler limit : out of macro expansion space"
+1057 "unexpected end of file in macro expansion"
+1058 "compiler limit : too many formal arguments"
+1059 "compiler is out of near heap space"
+1060 "compiler is out of far heap space"
+1061 "compiler limit : blocks nested too deeply"
+1062 "error while writing to preprocessor output file"
+1063 "compiler limit : compiler stack overflow"
+1064 "compiler limit : token overflowed internal buffer"
+1065 "compiler limit : out of tags"
+1066 "compiler limit : decorated name length exceeded"
+
+1068 "cannot open file '%Fs'"
+1069 "write error on file '%s'"
+1070 "mismatched #if/#endif pair in file '%Fs'"
+1071 "unexpected end of file found in comment"
+1072 "'%Fs' : cannot read file"
+
+1090 "data allocation exceeds 64K"
+
+1126 "'%Fs' : automatic allocation exceeds %s"
+1127 "'%Fs' : segment redefinition"
+
+1500 "'%Fs' : cannot open inline function definition file"
+1501 "compiler limit : too many temporary variables"
+1502 "inline member-function definition missing '}'"
+1503 "default parameter definition missing ',' or ')'"
+1504 "type still ambiguous after parsing %d tokens"
+1505 "unrecoverable parser lookahead error"
+1506 "unrecoverable block scoping error"
+1507 "previous user errors and subsequent error recovery halt further compilation"
+
+1852 "'%Fs' is not a valid precompiled header file (C2852)"
+1853 "'%Fs' is not a precompiled header file created with this compiler (C2853)"
+1855 "command-line option '%Fs' inconsistent with precompiled header (C2855)"
+
+1000 "UNKNOWN FATAL ERROR\n\t\tContact Microsoft Product Support Services"
diff --git a/private/oleauto/tools/win16/os2/bin/c23.err b/private/oleauto/tools/win16/os2/bin/c23.err
new file mode 100644
index 000000000..1797efc7e
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/bin/c23.err
@@ -0,0 +1,95 @@
+
+
+
+1001 "INTERNAL COMPILER ERROR\n\t\t(compiler file '%s', line %d)\n\t\tContact Microsoft Product Support Services"
+1002 "compiler is out of heap space in pass 2"
+1003 "error count exceeds %d; stopping compilation"
+1004 "unexpected end of file found"
+1005 "string too big for buffer"
+1006 "write error on compiler intermediate file"
+1007 "unrecognized flag '%s' in '%s'"
+1015 "compiler limit : too many segments"
+1023 "cannot open source file '%s'"
+1027 "DGROUP data allocation exceeds 64K"
+1029 "there are > 512 bytes of arguments"
+1030 "there are > 512 bytes of local variables"
+1032 "cannot open object code listing file '%s'"
+1033 "cannot open assembly language output file '%s'"
+1035 "expression too complex; simplify expression"
+1036 "cannot open source listing file '%s'"
+1037 "cannot open object file '%s'"
+1039 "unrecoverable heap overflow in pass 3"
+1040 "unexpected end-of-file condition in source file '%s'"
+1041 "cannot open compiler intermediate file - no more files"
+1042 "cannot open compiler intermediate file - no such file or directory"
+1043 "cannot open compiler intermediate file"
+1044 "out of disk space for compiler intermediate file"
+1048 "unknown option '%c' in '%s'"
+1049 "invalid numerical argument '%s'"
+1050 "'%s' : code segment too large"
+
+1055 "compiler limit : out of keys"
+1067 "intrinsic not implemented"
+1073 "bad '%s' flag, would overwrite '%s' with '%s'"
+1074 "too many '%s' flags, '%s'"
+
+1090 "'%s' data allocation exceeds 64K"
+1126 "'%s' : automatic allocation exceeds %s"
+1127 "'%s' : segment redefinition"
+1000 "UNKNOWN FATAL ERROR\n\t\tContact Microsoft Product Support Services"
+
+
+
+2125 "'%s' : allocation exceeds 64K"
+2127 "parameter allocation exceeds 32K"
+2128 "'%s' : huge array cannot be aligned to segment boundary"
+2129 "static function '%s' not found"
+2220 "warning treated as error - no object file generated"
+2418 "'%s' : not in a register"
+2427 "'%s' : jump referencing label is out of range"
+2000 "UNKNOWN ERROR\n\t\tContact Microsoft Product Support Services"
+
+
+
+4700 "local variable '%s' used without having been initialized"
+4701 "local variable '%s' may be used without having been initialized"
+4702 "unreachable code"
+4703 "'%s' : function too large for global optimizations"
+4704 "'%s' : inline assembler precludes global optimizations"
+4705 "statement has no effect"
+4706 "assignment within conditional expression"
+4707 "'%s' : function too large for global optimizations (%s)"
+4708 "ran out of heap at: %s"
+4709 "comma operator within array index expression"
+4710 "function '%s' not expanded"
+4711 "function '%s' selected for inline expansion"
+4712 "'%s' : used as register - loss of debugging information"
+4713 "%s: INTERNAL COMPILER ERROR; restarting\n\t\t(compiler file '%s', line %d)\n\t\tContact Microsoft Product Support Services"
+4723 "potential divide by 0"
+4724 "potential mod by 0"
+4726 "'%c' : unknown memory-model command-line option"
+4727 "conditional expression is constant"
+4741 "/Oq option ignored for __fastcall or __saveregs function '%Fs'"
+4746 "'%s' : unsized array treated as '%s'"
+4756 "overflow in constant arithmetic"
+4758 "address of automatic (local) variable taken; DS != SS"
+4759 "segment lost in conversion"
+4761 "integral size mismatch in argument; conversion supplied"
+4762 "near/far mismatch in argument; conversion supplied"
+4763 "'%s' : function too large for postoptimizer"
+4765 "recoverable heap overflow in postoptimizer"
+4766 "local symbol-table overflow"
+4769 "conversion of near pointer to long integer"
+4772 "'%s' : too many debug entry points, maximum %d"
+4773 "scoping too deep; symbolic debugging information lost for this module."
+4785 "near call to '%s' in different segment"
+4786 "string too long - truncated to %d characters"
+4787 "unprototyped function '%s' called in exception"
+4788 "'%Fs' : identifier was truncated to '%d' characters"
+4790 "insufficient memory to process debugging information"
+4791 "loss of debugging information caused by optimization"
+4792 "long double type not supported by alternate math library"
+
+4900 "Il mismatch between '%s' version '%ld' and '%s' version '%ld'"
+
+4000 "UNKNOWN WARNING\n\t\tContact Microsoft Product Support Services"
diff --git a/private/oleauto/tools/win16/os2/bin/cl.err b/private/oleauto/tools/win16/os2/bin/cl.err
new file mode 100644
index 000000000..3d828316a
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/bin/cl.err
@@ -0,0 +1,41 @@
+ /* error messages */
+
+2001 "too many symbols predefined with /D"
+2002 "memory-model conflict"
+2003 "missing source filename"
+2008 "limit of %s exceeded at '%s'"
+2011 "only one floating-point option allowed"
+2012 "too many linker arguments"
+2013 "incomplete model specification"
+2016 "%s and %s command-line options are incompatible"
+2018 "cannot create linker response file"
+2019 "cannot overwrite source or object file '%s'"
+2020 "%s option requires extended keywords to be enabled (/Ze)"
+2021 "invalid numeric argument '%s'"
+2022 "cannot open '%s'"
+2023 "invalid model specification - flat model only"
+2027 "cannot execute '%s'"
+2028 "too many open files; cannot redirect '%s'"
+2030 "INTERNAL COMPILER ERROR in '%s'\n\t\tContact Microsoft Product Support Services"
+2031 "too many command-line options"
+2000 "UNKNOWN COMMAND-LINE ERROR\n\t\tContact Microsoft Product Support Services"
+
+ /* warning messages */
+
+4001 "listing overrides assembly output"
+4002 "ignoring unknown option '%s'"
+4003 "processor-option conflict"
+4005 "cannot find '%s';\nPlease enter new filename (full path) or CTRL+C to quit: "
+4007 "'%s' requires '%s'; option ignored"
+4009 "threshold only for far or huge data; ignored"
+4011 "preprocessing overrides source listing"
+4012 "function declarations override source listing"
+4013 "combined listing overrides object listing"
+4014 "invalid value '%d' for '%s'; assuming '%d'"
+4018 ".DEF files supported for segmented executable files only"
+4019 "string too long; truncated to %d characters"
+4020 "'%s' : missing argument; option ignored"
+4021 "no action performed"
+4022 "option '%s' invalid for %d-bit target"
+4023 "option '%s' forces use of optimizing compiler"
+4000 "UNKNOWN COMMAND-LINE WARNING\n\t\tContact Microsoft Product Support Services"
diff --git a/private/oleauto/tools/win16/os2/bin/cl.msg b/private/oleauto/tools/win16/os2/bin/cl.msg
new file mode 100644
index 000000000..db6e641ee
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/bin/cl.msg
@@ -0,0 +1,126 @@
+C COMPILER OPTIONS
+-MEMORY MODEL-
+/AS small model (default)
+/AC compact model
+/AM medium model
+/AL large model
+/AH huge model
+/AT tiny model (.COM files)
+/A<string> (custom memory model)
+-OPTIMIZATION-
+/O enable optimization (same as /Ot)
+/Oa assume no aliasing
+/Ob<n> inline expansion
+/Oc local common subexpression opt.
+/Od disable optimization (default)
+/Oe enable registers allocation
+/Of[-] toggle p-code quoting
+/Og global common subexpression opt.
+/Oi enable intrinsic functions
+/Ol enable loop optimizations
+/On disable "unsafe" optimizations
+/Oo[-] toggle post code-gen. opt.
+/Op[-] improve floating-pt consistency
+/Oq enable maximum p-code optimization
+/Or gen. common exit code (CodeView)
+/Os optimize for space
+/Ot optimize for speed
+/Ov[-] toggle p-code frame sorting
+/Ow assume cross-function aliasing
+/Ox maximum opts. (/Ob1cegilnot /Gs)
+/Oz enable "unsafe" optimizations
+-CODE GENERATION-
+/G0 8086 instructions (default)
+/G1 186 instructions
+/G2 286 instructions
+/GA protected-mode Win entry/exit code
+/GD protected-mode Win entry/exit code
+/GE<x> customize Windows entry/exit
+/Gq backwards compatibility with v. 6
+/Gc Pascal style calling conventions
+/Gd C style calling conventions
+/Ge use stack-check calls
+/Gs remove stack-check calls
+/Gn remove p-code native entry points
+/Gp<num> specify p-code entry tables
+/Gr _fastcall style calling convention
+/Gt[num] data size threshold
+/GW real-mode Windows entry/exit code
+/Gw real-mode Windows entry/exit code
+/Gx assume that data is near
+/Gy separate functions for linker
+/Zr check null pointers (/f only)
+-OUTPUT FILES-
+/Fa[file] name assembly listing file
+/Fc[file] name source/object listing
+/Fe<file> name executable filename
+/Fl[file] name object listing filename
+/Fm[file] name map filename
+/Fo<file> name object filename
+/Fr[file] name .SBR filename
+/Fp<file> name .PCH filename
+/FR[file] name extended .SBR filename
+/Fs[file] name source listing filename
+-PREPROCESSOR-
+/C don't strip comments
+/D<name>[=|#text] define macro
+/E preprocess to stdout
+/EP same as /E but no #line
+/I<directory> add #include path
+/P preprocess to file
+/U<name> remove predefined macro
+/u remove all defined macros
+/X ignore "standard places"
+-LANGUAGE-
+/Za disable extensions (implies /Op)
+/Zd line number information
+/Ze enable extensions (default)
+/Zg generate function prototypes
+/Zi prepare for debugging (CodeView)
+/Zl omit default library name in .OBJ
+/Zp[n] pack structs on n-byte boundary
+/Zs check syntax only
+-FLOATING POINT-
+/FPa calls with altmath
+/FPc calls with emulator
+/FPc87 calls with 8087 library
+/FPi inline with emulator (default)
+/FPi87 inline with 8087
+-SOURCE LISTING-
+/Sl<columns> set line width
+/Sp<lines> set page length
+/St<string> set title string
+/Ss<string> set subtitle string
+-MISCELLANEOUS-
+/batch specify batch mode compilation
+/Bm<num> set compiler's available mem.
+/c compile only, no link
+/H<num> external name length
+/J default char type is unsigned
+/f select fast compiler
+/f- select optimizing compiler
+/Yc create .PCH file
+/Yd put debug info in .PCH file
+/Yu use .PCH file
+/nologo suppress copyright message
+/Mq compile for QuickWin
+/ND<name> name data segment
+/NM<name> name code segment
+/NQ<name> combine p-code temp segments
+/NT<name> name code segment
+/NV<name> name far v-table segment
+/Tc<file> compile file without .c
+/Tp<file> compile file without .cpp
+/V<string> set version string
+/W<num> warning level (0..4,X)
+/Zn turn off SBRPACK for .SBR files
+-MASM SUPPORT-
+/MA<MASM switch>
+/Ta<file> assemble file without .asm
+-LINKING-
+/F <hex_num> stack size (hex. bytes)
+/Lr append 'r' to default lib in .OBJ
+/link [lib] give lib name to linker
+/Ln do not link CRT.LIB
+/Ld select dynamically-linked library
+/Lw select statically-linked library
diff --git a/private/oleauto/tools/win16/os2/bin/ml.err b/private/oleauto/tools/win16/os2/bin/ml.err
new file mode 100644
index 000000000..f64e14cbd
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/bin/ml.err
@@ -0,0 +1,277 @@
+FATAL
+cannot open file
+I/O error closing file
+I/O error writing file
+I/O error reading file
+out of memory
+assembler limit : macro parameter name table full
+invalid command-line option
+nesting level too deep
+unmatched macro nesting
+line too long
+unmatched block nesting
+directive must be in control block
+error count exceeds 100; stopping assembly
+invalid numerical command-line argument
+too many arguments
+statement too complex
+N/A
+missing source filename
+COFF error writing file
+invalid debug and browser data; file exceeds line limit
+cannot find link.exe
+cannot find cvpack.exe
+SEVERE
+memory operand not allowed in context
+immediate operand not allowed
+cannot have more than one ELSE clause per IF block
+extra characters after statement
+symbol type conflict
+symbol redefinition
+undefined symbol
+non-benign record redefinition
+syntax error
+syntax error in expression
+invalid type expression
+distance invalid for word size of current segment
+PROC, MACRO, or macro repeat directive must precede LOCAL
+.MODEL must precede this directive
+cannot define as public or external
+segment attributes cannot change
+expression expected
+operator expected
+invalid use of external symbol
+operand must be RECORD type or field
+identifier not a record
+record constants may not span line breaks
+instruction operands must be the same size
+instruction operand must have size
+invalid operand size for instruction
+operands must be in same segment
+constant expected
+operand must be a memory expression
+expression must be a code address
+multiple base registers not allowed
+multiple index registers not allowed
+must be index or base register
+invalid use of register
+invalid INVOKE argument
+must be in segment block
+DUP too complex
+too many initial values for structure
+statement not allowed inside structure definition
+missing operand for macro operator
+line too long
+segment register not allowed in context
+string or text literal too long
+statement too complex
+identifier too long
+invalid character in file
+missing angle bracket or brace in literal
+missing single or double quotation mark in string
+empty (null) string
+nondigit in number
+syntax error in floating-point constant
+real or BCD number not allowed
+text item required
+forced error
+forced error : value equal to 0
+forced error : value not equal to 0
+forced error : symbol not defined
+forced error : symbol defined
+forced error : string blank
+forced error : string not blank
+forced error : strings equal
+forced error : strings not equal
+[ELSE]IF2/.ERR2 not allowed : single-pass assembler
+expression too complex for .UNTILCXZ
+can ALIGN only to power of 2
+structure alignment must be 1, 2, or 4
+expected
+incompatible CPU mode and segment size
+LOCK must be followed by a memory operation
+instruction prefix not allowed
+no operands allowed for this instruction
+invalid instruction operands
+initializer magnitude too large for specified size
+cannot access symbol in given segment or group
+operands have different frames
+cannot access label through segment registers
+jump destination too far
+jump destination must specify a label
+instruction does not allow NEAR indirect addressing
+instruction does not allow FAR indirect addressing
+instruction does not allow FAR direct addressing
+jump distance not possible in current CPU mode
+missing operand after unary operator
+cannot mix 16- and 32-bit registers
+invalid scale value
+constant value too large
+instruction or register not accepted in current CPU mode
+reserved word expected
+instruction form requires 80386/486
+END directive required at end of file
+too many bits in RECORD
+positive value expected
+index value past end of string
+count must be positive or zero
+count value too large
+operand must be relocatable
+constant or relocatable label expected
+segment, group, or segment register expected
+segment expected
+invalid operand for OFFSET
+invalid use of external absolute
+segment or group not allowed
+cannot add two relocatable labels
+cannot add memory expression and code label
+segment exceeds 64K limit
+invalid type for a data declaration
+HIGH and LOW require immediate operands
+N/A
+cannot have implicit far jump or call to near label
+use of register assumed to ERROR
+only white space or comment can follow backslash
+COMMENT delimiter expected
+conflicting parameter definition
+PROC and prototype calling conventions conflict
+invalid radix tag
+INVOKE argument type mismatch : argument
+invalid coprocessor register
+instructions and initialized data not allowed in AT segments
+/AT switch requires the TINY memory model
+cannot have segment address references with TINY model
+language type must be specified
+PROLOGUE must be macro function
+EPILOGUE must be macro procedure
+alternate identifier not allowed with EXTERNDEF
+text macro nesting level too deep
+N/A
+missing macro argument
+EXITM used inconsistently
+macro function argument list too long
+N/A
+VARARG parameter must be last parameter
+VARARG parameter not allowed with LOCAL
+VARARG parameter requires C calling convention
+ORG needs a constant or local offset
+register value overwritten by INVOKE
+structure too large to pass with INVOKE : argument
+not overriding private proc as public
+too many arguments to INVOKE
+too few arguments to INVOKE
+invalid data initializer
+N/A
+RET operand too large
+too many operands to instruction
+cannot have more than one .ELSE clause per .IF block
+expected data label
+cannot nest procedures
+EXPORT must be FAR
+procedure declared with two visibility attributes
+macro label not defined
+invalid symbol type in expression
+byte register cannot be first operand
+word register cannot be first operand
+special register cannot be first operand
+coprocessor register cannot be first operand
+cannot change size of expression computations
+syntax error in control-flow directive
+cannot use 16-bit register with a 32-bit address
+constant value out of range
+missing right parenthesis
+type is wrong size for register
+structure cannot be instanced
+non-benign structure redefinition: label incorrect
+non-benign structure redefinition: too few labels
+OLDSTRUCTS/NOOLDSTRUCTS state cannot be changed
+non-benign structure redefinition: incorrect initializers
+non-benign structure redefinition: too few initializers
+non-benign structure redefinition: label has incorrect offset
+structure field expected
+unexpected literal found in expression
+N/A
+divide by zero in expression
+directive must appear inside a macro
+cannot expand macro function
+too few bits in RECORD
+macro function cannot redefine itself
+N/A
+invalid qualified type
+floating-point initializer on an integer variable
+nested structure improperly initialized
+invalid use of FLAT
+structure improperly initialized
+improper list initialization
+initializer must be a string or single item
+initializer must be a single item
+initializer must be a single byte
+improper use of list initializer
+improper literal initialization
+extra characters in literal initialization
+must use floating-point initializer
+cannot use .EXIT for OS_OS2 with .8086
+invalid combination with segment alignment
+INVOKE requires prototype for procedure
+cannot include structure in self
+symbol language attribute conflict
+non-benign COMM redefinition
+COMM variable exceeds 64K
+parameter or local cannot have void type
+cannot use TINY model with OS_OS2
+expression size must be 32 bits
+.EXIT does not work with 32-bit segments
+.STARTUP does not work with 32-bit segments
+ORG directive not allowed in unions
+D/T
+illegal use of segment register
+cannot declare scoped code label as PUBLIC
+.MSFLOAT directive is obsolete : .MSFLOAT ignored
+ESC instruction is obsolete : ESC ignored
+missing operator in expression
+missing right parenthesis in expression
+missing left parenthesis in expression
+reference to forward macro definition
+16 bit segments not allowed with /coff option
+FAR not allowed in flat model comm variables
+invalid .model parameter for flat model
+ALIAS name is empty
+GROUP directive not allowed with /coff option
+.FPO is not compatible with nested procedures
+LEVEL 1
+cannot modify READONLY segment
+N/A
+non-unique STRUCT/UNION field used without qualification
+start address on END directive ignored with .STARTUP
+cannot ASSUME CS
+unknown default prologue argument
+too many arguments in macro call
+option untranslated, directive required
+invalid command-line option value, default is used
+insufficent memory for /EP : /EP ignored
+expected '>' on text literal
+multiple .MODEL directives found : .MODEL ignored
+line number information for segment without class 'CODE'
+instructions and initialized data not supported in AT segments
+directive ignored with /coff switch
+/Gc switch incompatible with flat model
+/AT switch incompatible with flat model
+invalid command-line option
+directive ignored without /coff switch
+directive ignored outside a procedure
+LOADDS ignored in flat model
+LEVEL 2
+@@: label defined but not referenced
+expression expected, assume value 0
+EXTERNDEF previously assumed to be external
+length of symbol previously assumed to be different
+symbol previously assumed to not be in a group
+types are different
+calling convention not supported in flat model
+LEVEL 3
+N/A
+no return from procedure
+N/A
+conditional jump lengthened
+procedure argument or local not referenced
+expression may be pass-dependent
diff --git a/private/oleauto/tools/win16/os2/bin/rcpp.err b/private/oleauto/tools/win16/os2/bin/rcpp.err
new file mode 100644
index 000000000..d26c8494d
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/bin/rcpp.err
@@ -0,0 +1,334 @@
+/* SCCSWHAT( "@(#)c1.err 2.29 88/02/25 18:18:00 " ) */
+ /* fatals */
+
+1001 "Internal Compiler Error\n\t\t(compiler file '%s', line %d)\n\t\tContact Microsoft Technical Support"
+1002 "out of heap space"
+1003 "error count exceeds %d; stopping compilation"
+1004 "unexpected EOF"
+1005 "string too big for buffer"
+1006 "write error on compiler intermediate file"
+1007 "unrecognized flag '%s' in '%s'"
+1008 "no input file specified"
+1009 "compiler limit : macros too deeply nested"
+1010 "compiler limit : macro expansion too big"
+1012 "bad parenthesis nesting - missing '%c'"
+1013 "cannot open source file '%s'"
+1014 "too many include files"
+1015 "cannot open include file '%s'"
+1016 "#if[n]def expected an identifier"
+1017 "invalid integer constant expression"
+1018 "unexpected '#elif'"
+1019 "unexpected '#else'"
+1020 "unexpected '#endif'"
+1021 "bad preprocessor command '%s'"
+1022 "expected '#endif'"
+1023 "no int size specified"
+1024 "no ptr size specified"
+1025 "no function size specified"
+1026 "parser stack overflow, please simplify your program"
+1027 "DGROUP data allocation exceeds 64K" /* QC, c23 */
+1028 "%s segment allocation exceeds 64K" /* QC */
+1031 "compiler limit : function calls too deeply nested" /* QC, c23 */
+1032 "cannot open object listing file '%s'" /* QC, c23 */
+1035 "expression too complex, please simplify" /* QC, c23 */
+1037 "cannot open object file '%s'" /* QC, c23 */
+1041 "cannot open compiler intermediate file - no more files"
+1042 "cannot open compiler intermediate file - no such file or directory"
+1043 "cannot open compiler intermediate file"
+1044 "out of disk space for compiler intermediate file"
+1045 "floating point overflow"
+1047 "too many %s flags, '%s'"
+1048 "unknown option '%c' in '%s'"
+1049 "invalid numerical argument '%s'"
+1052 "too many #if/#ifdef's"
+1053 "compiler limit : struct/union nesting"
+1054 "compiler limit : initializers too deeply nested"
+1055 "compiler limit : out of keys"
+1056 "compiler limit : out of macro expansion space"
+1057 "unexpected EOF in macro expansion (missing ')'?)"
+1059 "out of near heap space"
+1060 "out of far heap space"
+1061 "compiler limit : blocks too deeply nested" /* QC */
+1062 "error writing to preprocessor output file"
+1063 "compiler limit : compiler stack overflow" /* QC */
+1064 "compiler limit : identifier overflowed internal buffer"
+1065 "compiler limit : declarator too complex"
+1000 "UNKNOWN FATAL ERROR\n\t\tContact Microsoft Technical Support"
+
+ /* errors */
+
+2001 "newline in constant"
+2002 "out of macro actual parameter space"
+2003 "expected 'defined id'"
+2004 "expected 'defined(id)'"
+2005 "#line expected a line number, found '%s'"
+2006 "#include expected a file name, found '%s'"
+2007 "#define syntax"
+2008 "'%c' : unexpected in macro definition"
+2009 "reuse of macro formal '%s'"
+2010 "'%c' : unexpected in formal list"
+2011 "'%s' : definition too big"
+2012 "missing name following '<'"
+2013 "missing '>'"
+2014 "preprocessor command must start as first non-whitespace"
+2015 "too many chars in constant"
+2016 "no closing single quote"
+2017 "illegal escape sequence"
+2018 "unknown character '0x%x'"
+2019 "expected preprocessor command, found '%c'"
+2020 "bad octal number '%c'"
+2021 "expected exponent value, not '%c'"
+2022 "'%ld' : too big for char"
+2023 "divide by 0"
+2024 "mod by 0"
+2025 "'%s' : enum/struct/union type redefinition"
+2026 "'%s' : member of enum redefinition"
+2028 "struct/union member needs to be inside a struct/union"
+2029 "'%Fs' : bit-fields only allowed in structs"
+2030 "'%Fs' : struct/union member redefinition"
+2031 "'%Fs' : function cannot be struct/union member"
+2032 "'%Fs' : base type with near/far/huge not allowed"
+2033 "'%Fs' : bit-field cannot have indirection"
+2034 "'%Fs' : bit-field type too small for number of bits"
+2035 "enum/struct/union '%Fs' : unknown size"
+2036 "left of '%s%s' must have a struct/union type"
+2037 "left of '%s' specifies undefined struct/union '%Fs'"
+2038 "'%s' : not struct/union member"
+2039 "'->' requires struct/union pointer"
+2040 "'.' requires struct/union name"
+2042 "signed/unsigned keywords mutually exclusive"
+2043 "illegal break"
+2044 "illegal continue"
+2045 "'%s' : label redefined"
+2046 "illegal case"
+2047 "illegal default"
+2048 "more than one default"
+2050 "non-integral switch expression"
+2051 "case expression not constant"
+2052 "case expression not integral"
+2053 "case value %d already used"
+2054 "expected '(' to follow '%Fs'"
+2055 "expected formal parameter list, not a type list"
+2056 "illegal expression"
+2057 "expected constant expression"
+2058 "constant expression is not integral"
+2059 "syntax error : '%s'"
+2060 "syntax error : EOF"
+2061 "syntax error : identifier '%s'"
+2062 "type '%s' unexpected"
+2063 "'%s' : not a function"
+2064 "term does not evaluate to a function"
+2065 "'%s' : undefined"
+2066 "cast to function returning . . . is illegal"
+2067 "cast to array type is illegal"
+2068 "illegal cast"
+2069 "cast of 'void' term to non-void"
+2070 "illegal sizeof operand"
+2071 "'%Fs' : bad storage class"
+2072 "'%Fs' : initialization of a function"
+2073 "'%Fs' : cannot initialize array in function"
+2074 "'%Fs' : cannot initialize struct/union in function"
+2075 "'%Fs' : array initialization needs curly braces"
+2076 "'%Fs' : struct/union initialization needs curly braces"
+2077 "non-integral field initializer '%Fs'"
+2078 "too many initializers"
+2079 "'%Fs' uses undefined struct/union '%Fs'"
+2082 "redefinition of formal parameter '%Fs'"
+2083 "array '%Fs' already has a size"
+2084 "function '%Fs' already has a body"
+2085 "'%Fs' : not in formal parameter list"
+2086 "'%Fs' : redefinition"
+2087 "'%Fs' : missing subscript"
+2088 "use of undefined enum/struct/union '%s'"
+2089 "typedef specifies a near/far function"
+2090 "function returns array"
+2091 "function returns function"
+2092 "array element type cannot be function"
+2093 "cannot initialize a static or struct with address of automatic vars"
+2094 "label '%Fs' was undefined"
+2095 "'%Fs' : actual has type void : parameter %d"
+2096 "struct/union comparison illegal"
+2097 "illegal initialization"
+2098 "non-address expression"
+2099 "non-constant offset"
+2100 "illegal indirection"
+2101 "'&' on constant"
+2102 "'&' requires lvalue"
+2103 "'&' on register variable"
+2104 "'&' on bit-field ignored"
+2105 "'%s' needs lvalue"
+2106 "'%s' : left operand must be lvalue"
+2107 "illegal index, indirection not allowed"
+2108 "non-integral index"
+2109 "subscript on non-array"
+2110 "'+' : 2 pointers"
+2111 "pointer + non-integral value"
+2112 "illegal pointer subtraction"
+2113 "'-' : right operand pointer"
+2114 "'%s' : pointer on left; needs integral right"
+2115 "'%s' : incompatible types"
+2116 "'%s' : bad %s operand"
+2117 "'%s' : illegal for struct/union"
+2118 "negative subscript"
+2119 "'typedefs' both define indirection"
+2120 "'void' illegal with all types"
+2121 "typedef specifies different enum"
+2122 "typedef specifies different struct"
+2123 "typedef specifies different union"
+2125 "%Fs : allocation exceeds 64K" /* QC, c23 */
+2126 "%Fs : auto allocation exceeds %s" /* QC, c23 */
+2127 "parameter allocation exceeds 32K" /* QC, c23 */
+2130 "#line expected a string containing the file name, found '%s'"
+2131 "attributes specify more than one near/far/huge"
+2132 "syntax error : unexpected identifier"
+2133 "array '%Fs' : unknown size"
+2134 "'%Fs' : struct/union too large"
+2135 "missing ')' in macro expansion"
+2137 "empty character constant"
+2138 "unmatched close comment '*/'"
+2139 "type following '%s' is illegal"
+2140 "argument type cannot be function returning . . ."
+2141 "value out of range for enum constant"
+2142 "ellipsis requires three periods"
+2143 "syntax error : missing '%s' before '%s'"
+2144 "syntax error : missing '%s' before type '%Fs'"
+2145 "syntax error : missing '%s' before identifier"
+2146 "syntax error : missing '%s' before identifier '%s'"
+2147 "unknown size"
+2148 "array too large"
+2149 "'%Fs' : named bit-field cannot have 0 width"
+2150 "'%Fs' : bit-field must have type int, signed int, or unsigned int"
+2151 "more than one cdecl/fortran/pascal attribute specified"
+2152 "'%s' : pointers to functions with different attributes"
+2153 "hex constants must have at least 1 hex digit"
+2154 "'%s' : does not refer to a segment"
+2155 "'%s' : already in a segment"
+2156 "pragma must be at outer level"
+2157 "'%s' : must be declared before use in pragma list"
+2158 "'%s' : is a function"
+2159 "more than one storage class specified"
+2160 "## cannot occur at the beginning of a macro definition"
+2161 "## cannot occur at the end of a macro definition"
+2162 "expected macro formal parameter"
+2163 "'%s' : not available as an intrinsic"
+2164 "'%s' : intrinsic was not declared"
+2165 "'%s' : cannot modify pointers to data"
+2166 "lval specifies 'const' object"
+2167 "'%Fs' : too many actual parameters for intrinsic"
+2168 "'%Fs' : too few actual parameters for intrinsic"
+2169 "'%Fs' : is an intrinsic, it cannot be defined"
+2170 "'%s' : intrinsic not declared as a function"
+2171 "'%s' : bad operand"
+2172 "'%Fs' : actual is not a pointer : parameter %d"
+2173 "'%Fs' : actual is not a pointer : parameter %d, parameter list %d"
+2174 "'%Fs' : actual has type void : parameter %d, parameter list %d"
+2175 "'%Fs' : unresolved external" /* QC */
+2176 "static far data not supported" /* QC */
+2177 "constant too big"
+2178 "'%s' : storage class for same_seg variables must be 'extern'"
+2179 "'%Fs' : was used in same_seg, but storage class is no longer 'extern'"
+2180 "controlling expression has type 'void'"
+2181 "pragma requires command line option '%s'" /* QC */
+2182 "'%Fs' : 'void' on variable"
+2183 "'%Fs' : 'interrupt' function must be 'far'"
+2184 "'%Fs' : '%s' function cannot be 'pascal/fortran'"
+2186 "'%Fs' : 'saveregs/interrupt' modifiers mutually exclusive"
+2187 "cast of near function pointer to far function pointer"
+2188 "#error : %s"
+2190 "'%s' : is a text segment"
+2191 "'%s' : is a data segment"
+2192 "'%s' : function has already been defined"
+2000 "UNKNOWN ERROR\n\t\tContact Microsoft Technical Support"
+
+ /* warnings */
+
+4001 "macro '%s' requires parameters"
+4002 "too many actual parameters for macro '%s'"
+4003 "not enough actual parameters for macro '%s'"
+4004 "missing close parenthesis after 'defined'"
+4005 "'%s' : redefinition"
+4006 "#undef expected an identifier"
+4009 "string too big, trailing chars truncated"
+4011 "identifier truncated to '%s'"
+4012 "float constant in a cross compilation"
+4013 "constant too big"
+4014 "'%Fs' : bit-field type must be unsigned"
+4015 "'%Fs' : bit-field type must be integral"
+4016 "'%s' : no function return type, using 'int' as default"
+4017 "cast of int expression to far pointer"
+4020 "'%Fs' : too many actual parameters"
+4021 "'%Fs' : too few actual parameters"
+4022 "'%Fs' : pointer mismatch : parameter %d"
+4024 "'%Fs' : different types : parameter %d"
+4025 "function declaration specified variable argument list"
+4026 "function was declared with formal argument list"
+4027 "function was declared without formal argument list"
+4028 "parameter %d declaration different"
+4029 "declared parameter list different from definition"
+4030 "first parameter list is longer than the second"
+4031 "second parameter list is longer than the first"
+4032 "unnamed struct/union as parameter"
+4033 "function must return a value"
+4034 "sizeof returns 0"
+4035 "'%Fs' : no return value"
+4036 "unexpected formal parameter list"
+4037 "'%Fs' : formal parameters ignored"
+4038 "'%Fs' : formal parameter has bad storage class"
+4039 "'%Fs' : function used as an argument"
+4040 "near/far/huge on '%Fs' ignored"
+4041 "formal parameter '%s' is redefined"
+4042 "'%Fs' : has bad storage class"
+4044 "huge on '%Fs' ignored, must be an array"
+4045 "'%s' : array bounds overflow"
+4046 "'&' on function/array, ignored"
+4047 "'%s' : different levels of indirection"
+4048 "array's declared subscripts different"
+4049 "'%s' : indirection to different types"
+4051 "data conversion"
+4052 "different enum types"
+4053 "at least one void operand"
+4060 "conversion of long address to short address" /* QC, c23 */
+4061 "long/short mismatch in argument : conversion supplied" /* QC, c23 */
+4062 "near/far mismatch in argument : conversion supplied" /* QC, c23 */
+4067 "unexpected characters following '%s' directive - newline expected"
+4068 "unknown pragma"
+4071 "'%Fs' : no function prototype given"
+4074 "non standard extension used - '%s'"
+4075 "size of switch expression or case constant too large - converted to int"
+4076 "'%s' : may be used on integral types only"
+4077 "unknown check_stack option"
+4079 "unexpected token '%s'"
+4080 "expected 'identifier' for segment name, found '%s'"
+4081 "expected a comma, found '%s'"
+4082 "expected an identifier, found '%s'"
+4083 "expected '(', found '%s'"
+4084 "expected a pragma keyword, found '%s'"
+4085 "expected [on | off]"
+4086 "expected [1 | 2 | 4]"
+4087 "'%Fs' : declared with 'void' parameter list"
+4088 "'%Fs' : pointer mismatch : parameter %d, parameter list %d"
+4089 "'%Fs' : different types : parameter %d, parameter list %d"
+4090 "different 'const' attributes"
+4091 "no symbols were declared"
+4092 "untagged enum/struct/union declared no symbols"
+4093 "unescaped newline in character constant in non-active code"
+4094 "unexpected newline"
+4095 "expected ')', found '%s'"
+4096 "huge treated as far" /* QC */
+4098 "void function returning a value"
+4099 "expected ')', (too many arguments?)"
+4100 "'%Fs' : unreferenced formal parameter"
+4101 "'%Fs' : unreferenced local variable"
+4102 "'%Fs' : unreferenced label"
+4103 "'%Fs' : function definition used as prototype"
+4104 "'%s' : near data in same_seg pragma, ignored"
+4105 "'%Fs' : code modifiers only on function or pointer to function"
+4106 "pragma requires integer between 1 and 127"
+4107 "pragma requires integer between 15 and 255"
+4108 "pragma requires integer between 79 and 132"
+4109 "unexpected identifier '%s'"
+4110 "unexpected token 'int constant'"
+4111 "unexpected token 'string'"
+4112 "macro name '%s' is reserved, %s ignored"
+4113 "function parameter lists differed"
+4000 "UNKNOWN WARNING\n\t\tContact Microsoft Technical Support"
diff --git a/private/oleauto/tools/win16/os2/inc/assert.h b/private/oleauto/tools/win16/os2/inc/assert.h
new file mode 100644
index 000000000..b091186f3
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/assert.h
@@ -0,0 +1,35 @@
+/***
+*assert.h - define the assert macro
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines the assert(exp) macro.
+* [ANSI/System V]
+*
+****/
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#undef assert
+
+#ifdef NDEBUG
+
+#define assert(exp) ((void)0)
+
+#else
+#ifdef __cplusplus
+extern "C" {
+#endif
+void __cdecl _assert(void *, void *, unsigned);
+#ifdef __cplusplus
+}
+#endif
+
+#define assert(exp) \
+ ( (exp) ? (void) 0 : _assert(#exp, __FILE__, __LINE__) )
+
+#endif /* NDEBUG */
diff --git a/private/oleauto/tools/win16/os2/inc/bios.h b/private/oleauto/tools/win16/os2/inc/bios.h
new file mode 100644
index 000000000..a681fbd4b
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/bios.h
@@ -0,0 +1,242 @@
+/***
+*bios.h - declarations for bios interface functions and supporting definitions
+*
+* Copyright (c) 1987-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file declares the constants, structures, and functions
+* used for accessing and using various BIOS interfaces.
+*
+****/
+
+#ifndef _INC_BIOS
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+
+/* manifest constants for BIOS serial communications (RS-232) support */
+
+/* serial port services */
+
+#define _COM_INIT 0 /* init serial port */
+#define _COM_SEND 1 /* send character */
+#define _COM_RECEIVE 2 /* receive character */
+#define _COM_STATUS 3 /* get serial port status */
+
+/* serial port initializers. One and only one constant from each of the
+ * following four groups - character size, stop bit, parity, and baud rate -
+ * must be specified in the initialization byte.
+ */
+
+/* character size initializers */
+
+#define _COM_CHR7 2 /* 7 bits characters */
+#define _COM_CHR8 3 /* 8 bits characters */
+
+/* stop bit values - on or off */
+
+#define _COM_STOP1 0 /* 1 stop bit */
+#define _COM_STOP2 4 /* 2 stop bits */
+
+/* parity initializers */
+
+#define _COM_NOPARITY 0 /* no parity */
+#define _COM_ODDPARITY 8 /* odd parity */
+#define _COM_EVENPARITY 24 /* even parity */
+
+/* baud rate initializers */
+
+#define _COM_110 0 /* 110 baud */
+#define _COM_150 32 /* 150 baud */
+#define _COM_300 64 /* 300 baud */
+#define _COM_600 96 /* 600 baud */
+#define _COM_1200 128 /* 1200 baud */
+#define _COM_2400 160 /* 2400 baud */
+#define _COM_4800 192 /* 4800 baud */
+#define _COM_9600 224 /* 9600 baud */
+
+
+/* manifest constants for BIOS disk support */
+
+/* disk services */
+
+#define _DISK_RESET 0 /* reset disk controller */
+#define _DISK_STATUS 1 /* get disk status */
+#define _DISK_READ 2 /* read disk sectors */
+#define _DISK_WRITE 3 /* write disk sectors */
+#define _DISK_VERIFY 4 /* verify disk sectors */
+#define _DISK_FORMAT 5 /* format disk track */
+
+/* struct used to send/receive information to/from the BIOS disk services */
+
+#ifndef _DISKINFO_T_DEFINED
+#pragma pack(2)
+
+struct _diskinfo_t {
+ unsigned drive;
+ unsigned head;
+ unsigned track;
+ unsigned sector;
+ unsigned nsectors;
+ void __far *buffer;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+#define diskinfo_t _diskinfo_t
+#endif
+
+#pragma pack()
+#define _DISKINFO_T_DEFINED
+#endif
+
+
+/* manifest constants for BIOS keyboard support */
+
+/* keyboard services */
+
+#define _KEYBRD_READ 0 /* read next character from keyboard */
+#define _KEYBRD_READY 1 /* check for keystroke */
+#define _KEYBRD_SHIFTSTATUS 2 /* get current shift key status */
+
+/* services for enhanced keyboards */
+
+#define _NKEYBRD_READ 0x10 /* read next character from keyboard */
+#define _NKEYBRD_READY 0x11 /* check for keystroke */
+#define _NKEYBRD_SHIFTSTATUS 0x12 /* get current shift key status */
+
+
+/* manifest constants for BIOS printer support */
+
+/* printer services */
+
+#define _PRINTER_WRITE 0 /* write character to printer */
+#define _PRINTER_INIT 1 /* intialize printer */
+#define _PRINTER_STATUS 2 /* get printer status */
+
+
+/* manifest constants for BIOS time of day support */
+
+/* time of day services */
+
+#define _TIME_GETCLOCK 0 /* get current clock count */
+#define _TIME_SETCLOCK 1 /* set current clock count */
+
+
+#ifndef _REGS_DEFINED
+
+/* word registers */
+
+struct _WORDREGS {
+ unsigned int ax;
+ unsigned int bx;
+ unsigned int cx;
+ unsigned int dx;
+ unsigned int si;
+ unsigned int di;
+ unsigned int cflag;
+ };
+
+/* byte registers */
+
+struct _BYTEREGS {
+ unsigned char al, ah;
+ unsigned char bl, bh;
+ unsigned char cl, ch;
+ unsigned char dl, dh;
+ };
+
+/* general purpose registers union -
+ * overlays the corresponding word and byte registers.
+ */
+
+union _REGS {
+ struct _WORDREGS x;
+ struct _BYTEREGS h;
+ };
+
+/* segment registers */
+
+struct _SREGS {
+ unsigned int es;
+ unsigned int cs;
+ unsigned int ss;
+ unsigned int ds;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+struct WORDREGS {
+ unsigned int ax;
+ unsigned int bx;
+ unsigned int cx;
+ unsigned int dx;
+ unsigned int si;
+ unsigned int di;
+ unsigned int cflag;
+ };
+
+struct BYTEREGS {
+ unsigned char al, ah;
+ unsigned char bl, bh;
+ unsigned char cl, ch;
+ unsigned char dl, dh;
+ };
+
+union REGS {
+ struct WORDREGS x;
+ struct BYTEREGS h;
+ };
+
+struct SREGS {
+ unsigned int es;
+ unsigned int cs;
+ unsigned int ss;
+ unsigned int ds;
+ };
+
+#endif /* __STDC__ */
+
+#define _REGS_DEFINED
+#endif /* _REGS_DEFINED */
+
+
+/* function prototypes */
+
+#ifndef _WINDOWS
+unsigned __cdecl _bios_disk(unsigned, struct _diskinfo_t *);
+#endif
+unsigned __cdecl _bios_equiplist(void);
+#ifndef _WINDOWS
+unsigned __cdecl _bios_keybrd(unsigned);
+#endif
+unsigned __cdecl _bios_memsize(void);
+#ifndef _WINDOWS
+unsigned __cdecl _bios_printer(unsigned, unsigned, unsigned);
+unsigned __cdecl _bios_serialcom(unsigned, unsigned, unsigned);
+#endif
+unsigned __cdecl _bios_timeofday(unsigned, long *);
+int __cdecl _int86(int, union _REGS *, union _REGS *);
+int __cdecl _int86x(int, union _REGS *, union _REGS *, struct _SREGS *);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+int __cdecl int86(int, union REGS *, union REGS *);
+int __cdecl int86x(int, union REGS *, union REGS *, struct SREGS *);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_BIOS
+#endif /* _INC_BIOS */
diff --git a/private/oleauto/tools/win16/os2/inc/bse.h b/private/oleauto/tools/win16/os2/inc/bse.h
new file mode 100644
index 000000000..5887590d8
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/bse.h
@@ -0,0 +1,47 @@
+/***************************************************************************\
+*
+* Module Name: BSE.H
+*
+* This file includes the definitions necessary for writing Base OS/2
+* applications.
+*
+* Copyright (c) 1987-1991, Microsoft Corporation. All rights reserved.
+*
+* ===========================================================================
+*
+* The following symbols are used in this file for conditional sections.
+*
+* INCL_BASE - ALL of OS/2 Base
+* INCL_DOS - OS/2 DOS Kernel
+* INCL_SUB - OS/2 VIO/KBD/MOU
+* INCL_DOSERRORS - OS/2 Errors - only included if symbol defined
+* INCL_DOSDEVIOCTL - Structures and constants for DosDevIOCtl
+*
+\***************************************************************************/
+
+#define INCL_BASEINCLUDED
+
+/* if INCL_BASE defined then define all the symbols */
+#ifdef INCL_BASE
+ #define INCL_DOS
+ #define INCL_SUB
+ #define INCL_DOSERRORS
+ #define INCL_DOSDEVICES
+ #define INCL_DOSDEVIOCTL
+#endif /* INCL_BASE */
+
+#include <bsedos.h> /* Base definitions */
+
+#ifndef BSESUB_INCLUDED /* Only include it once */
+#include <bsesub.h> /* VIO/KBD/MOU definitions */
+#endif
+
+#ifndef BSEERR_INCLUDED /* Only include it once */
+#include <bseerr.h> /* Base error code definitions */
+#endif
+
+#if (defined(INCL_DOSDEVICES) || defined(INCL_DOSDEVIOCTL))
+#ifndef BSEDEV_INCLUDED /* Only include it once */
+#include <bsedev.h> /* IOCtls */
+#endif
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/bsedev.h b/private/oleauto/tools/win16/os2/inc/bsedev.h
new file mode 100644
index 000000000..10d80ccfe
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/bsedev.h
@@ -0,0 +1,520 @@
+/**************************************************************************\
+*
+* Module Name: BSEDEV.H
+*
+* OS/2 Structures and constants for use with DosDevIOCtl
+*
+* Copyright (c) 1989-1990, Microsoft Corporation. All rights reserved.
+*
+\**************************************************************************/
+
+#define BSEDEV_INCLUDED
+
+/* Input and Output Control Categories */
+
+#define IOCTL_ASYNC 0x0001
+#define IOCTL_SCR_AND_PTRDRAW 0x0003
+#define IOCTL_KEYBOARD 0x0004
+#define IOCTL_PRINTER 0x0005
+#define IOCTL_LIGHTPEN 0x0006
+#define IOCTL_POINTINGDEVICE 0x0007
+#define IOCTL_DISK 0x0008
+#define IOCTL_PHYSICALDISK 0x0009
+#define IOCTL_MONITOR 0x000A
+#define IOCTL_GENERAL 0x000B
+
+/* Serial-Device Control */
+
+#define ASYNC_SETBAUDRATE 0x0041
+#define ASYNC_SETLINECTRL 0x0042
+#define ASYNC_TRANSMITIMM 0x0044
+#define ASYNC_SETBREAKOFF 0x0045
+#define ASYNC_SETMODEMCTRL 0x0046
+#define ASYNC_SETBREAKON 0x004B
+#define ASYNC_STOPTRANSMIT 0x0047
+#define ASYNC_STARTTRANSMIT 0x0048
+#define ASYNC_SETDCBINFO 0x0053
+#define ASYNC_GETBAUDRATE 0x0061
+#define ASYNC_GETLINECTRL 0x0062
+#define ASYNC_GETCOMMSTATUS 0x0064
+#define ASYNC_GETLINESTATUS 0x0065
+#define ASYNC_GETMODEMOUTPUT 0x0066
+#define ASYNC_GETMODEMINPUT 0x0067
+#define ASYNC_GETINQUECOUNT 0x0068
+#define ASYNC_GETOUTQUECOUNT 0x0069
+#define ASYNC_GETCOMMERROR 0x006D
+#define ASYNC_GETCOMMEVENT 0x0072
+#define ASYNC_GETDCBINFO 0x0073
+
+/* Screen/Pointer-Draw Control */
+
+#define SCR_ALLOCLDT 0x0070
+#define SCR_DEALLOCLDT 0x0071
+#define PTR_GETPTRDRAWADDRESS 0x0072
+#define SCR_ALLOCLDTOFF 0x0075
+
+/* Keyboard Control */
+
+#define KBD_SETTRANSTABLE 0x0050
+#define KBD_SETINPUTMODE 0x0051
+#define KBD_SETINTERIMFLAG 0x0052
+#define KBD_SETSHIFTSTATE 0x0053
+#define KBD_SETTYPAMATICRATE 0x0054
+#define KBD_SETFGNDSCREENGRP 0x0055
+#define KBD_SETSESMGRHOTKEY 0x0056
+#define KBD_SETFOCUS 0x0057
+#define KBD_SETKCB 0x0058
+#define KBD_SETNLS 0x005C
+#define KBD_CREATE 0x005D
+#define KBD_DESTROY 0x005E
+#define KBD_GETINPUTMODE 0x0071
+#define KBD_GETINTERIMFLAG 0x0072
+#define KBD_GETSHIFTSTATE 0x0073
+#define KBD_READCHAR 0x0074
+#define KBD_PEEKCHAR 0x0075
+#define KBD_GETSESMGRHOTKEY 0x0076
+#define KBD_GETKEYBDTYPE 0x0077
+#define KBD_GETCODEPAGEID 0x0078
+#define KBD_XLATESCAN 0x0079
+
+/* Printer Control */
+
+#define PRT_SETFRAMECTL 0x0042
+#define PRT_SETINFINITERETRY 0x0044
+#define PRT_INITPRINTER 0x0046
+#define PRT_ACTIVATEFONT 0x0048
+#define PRT_GETFRAMECTL 0x0062
+#define PRT_GETINFINITERETRY 0x0064
+#define PRT_GETPRINTERSTATUS 0x0066
+#define PRT_QUERYACTIVEFONT 0x0069
+#define PRT_VERIFYFONT 0x006A
+
+/* Pointing-Device (Mouse) Control */
+
+#define MOU_ALLOWPTRDRAW 0x0050
+#define MOU_UPDATEDISPLAYMODE 0x0051
+#define MOU_SCREENSWITCH 0x0052
+#define MOU_SETSCALEFACTORS 0x0053
+#define MOU_SETEVENTMASK 0x0054
+#define MOU_SETHOTKEYBUTTON 0x0055
+#define MOU_SETPTRSHAPE 0x0056
+#define MOU_DRAWPTR 0x0057
+#define MOU_REMOVEPTR 0x0058
+#define MOU_SETPTRPOS 0x0059
+#define MOU_SETPROTDRAWADDRESS 0x005A
+#define MOU_SETREALDRAWADDRESS 0x005B
+#define MOU_SETMOUSTATUS 0x005C
+#define MOU_DISPLAYMODECHANGE 0x005D
+#define MOU_GETBUTTONCOUNT 0x0060
+#define MOU_GETMICKEYCOUNT 0x0061
+#define MOU_GETMOUSTATUS 0x0062
+#define MOU_READEVENTQUE 0x0063
+#define MOU_GETQUESTATUS 0x0064
+#define MOU_GETEVENTMASK 0x0065
+#define MOU_GETSCALEFACTORS 0x0066
+#define MOU_GETPTRPOS 0x0067
+#define MOU_GETPTRSHAPE 0x0068
+#define MOU_GETHOTKEYBUTTON 0x0069
+#define MOU_VER 0x006A
+
+/* Disk/Diskette Control */
+
+#define DSK_LOCKDRIVE 0x0000
+#define DSK_UNLOCKDRIVE 0x0001
+#define DSK_REDETERMINEMEDIA 0x0002
+#define DSK_SETLOGICALMAP 0x0003
+#define DSK_BLOCKREMOVABLE 0x0020
+#define DSK_GETLOGICALMAP 0x0021
+#define DSK_SETDEVICEPARAMS 0x0043
+#define DSK_WRITETRACK 0x0044
+#define DSK_FORMATVERIFY 0x0045
+#define DSK_GETDEVICEPARAMS 0x0063
+#define DSK_READTRACK 0x0064
+#define DSK_VERIFYTRACK 0x0065
+
+/* Physical-Disk Control */
+
+#define PDSK_LOCKPHYSDRIVE 0x0000
+#define PDSK_UNLOCKPHYSDRIVE 0x0001
+#define PDSK_WRITEPHYSTRACK 0x0044
+#define PDSK_GETPHYSDEVICEPARAMS 0x0063
+#define PDSK_READPHYSTRACK 0x0064
+#define PDSK_VERIFYPHYSTRACK 0x0065
+
+/* Character-Monitor Control */
+
+#define MON_REGISTERMONITOR 0x0040
+
+/* General Device Control */
+
+#define DEV_FLUSHINPUT 0x0001
+#define DEV_FLUSHOUTPUT 0x0002
+#define DEV_QUERYMONSUPPORT 0x0060
+
+
+/* ASYNC_GETCOMMERROR, ASYNC_SETBREAKOFF, ASYNC_SETBREAKON,
+ * ASYNC_SETMODEMCTRL
+ */
+
+#define RX_QUE_OVERRUN 0x0001
+#define RX_HARDWARE_OVERRUN 0x0002
+#define PARITY_ERROR 0x0004
+#define FRAMING_ERROR 0x0008
+
+/* ASYNC_GETCOMMEVENT */
+
+#define CHAR_RECEIVED 0x0001
+#define LAST_CHAR_SENT 0x0004
+#define CTS_CHANGED 0x0008
+#define DSR_CHANGED 0x0010
+#define DCD_CHANGED 0x0020
+#define BREAK_DETECTED 0x0040
+#define ERROR_OCCURRED 0x0080
+#define RI_DETECTED 0x0100
+
+/* ASYNC_GETCOMMSTATUS */
+
+#define TX_WAITING_FOR_CTS 0x0001
+#define TX_WAITING_FOR_DSR 0x0002
+#define TX_WAITING_FOR_DCD 0x0004
+#define TX_WAITING_FOR_XON 0x0008
+#define TX_WAITING_TO_SEND_XON 0x0010
+#define TX_WAITING_WHILE_BREAK_ON 0x0020
+#define TX_WAITING_TO_SEND_IMM 0x0040
+#define RX_WAITING_FOR_DSR 0x0080
+
+/* ASYNC_GETLINESTATUS */
+
+#define WRITE_REQUEST_QUEUED 0x0001
+#define DATA_IN_TX_QUE 0x0002
+#define HARDWARE_TRANSMITTING 0x0004
+#define CHAR_READY_TO_SEND_IMM 0x0008
+#define WAITING_TO_SEND_XON 0x0010
+#define WAITING_TO_SEND_XOFF 0x0020
+
+/* ASYNC_GETMODEMINPUT */
+
+#define CTS_ON 0x10
+#define DSR_ON 0x20
+#define RI_ON 0x40
+#define DCD_ON 0x80
+
+/* DSK_SETDEVICEPARAMS */
+
+#define BUILD_BPB_FROM_MEDIUM 0x00
+#define REPLACE_BPB_FOR_DEVICE 0x01
+#define REPLACE_BPB_FOR_MEDIUM 0x02
+
+/* KBD_GETINPUTMODE, KBD_PEEKCHAR, KBD_SETINPUTMODE*/
+
+#define ASCII_MODE 0x00
+#define BINARY_MODE 0x80
+
+/* KBD_GETINTERIMFLAG */
+
+#define CONVERSION_REQUEST 0x20
+#define INTERIM_CHAR 0x80
+
+/* KBD_GETSESMGRHOTKEY */
+
+#define HOTKEY_MAX_COUNT 0x0000
+#define HOTKEY_CURRENT_COUNT 0x0001
+
+/* KBD_PEEKCHAR */
+
+#define KBD_DATA_RECEIVED 0x0001
+#define KBD_DATA_BINARY 0x8000
+
+/* KBD_READCHAR */
+
+#define KBD_READ_WAIT 0x0000
+#define KBD_READ_NOWAIT 0x8000
+
+/* KBD_SETINPUTMODE */
+
+#define SHIFT_REPORT_MODE 0x01
+
+#ifndef INCL_MOU
+
+#define MOUSE_MOTION 0x0001
+#define MOUSE_MOTION_WITH_BN1_DOWN 0x0002
+#define MOUSE_BN1_DOWN 0x0004
+#define MOUSE_MOTION_WITH_BN2_DOWN 0x0008
+#define MOUSE_BN2_DOWN 0x0010
+#define MOUSE_MOTION_WITH_BN3_DOWN 0x0020
+#define MOUSE_BN3_DOWN 0x0040
+
+#define MHK_BUTTON1 0x0001
+#define MHK_BUTTON2 0x0002
+#define MHK_BUTTON3 0x0004
+
+#define MOU_NOWAIT 0x0000
+#define MOU_WAIT 0x0001
+
+#endif /* #ifndef INCL_MOU */
+
+/* MOU_GETHOTKEYBUTTON, MOU_SETHOTKEYBUTTON */
+
+#define MHK_NO_HOTKEY 0x0000
+
+/* MOU_GETMOUSTATUS */
+
+#define MOUSE_QUEUEBUSY 0x0001
+#define MOUSE_BLOCKREAD 0x0002
+#define MOUSE_FLUSH 0x0004
+#define MOUSE_UNSUPPORTED_MODE 0x0008
+#define MOUSE_DISABLED 0x0100
+#define MOUSE_MICKEYS 0x0200
+
+/* PRT_GETPRINTERSTATUS */
+
+#define PRINTER_TIMEOUT 0x0001
+#define PRINTER_IO_ERROR 0x0008
+#define PRINTER_SELECTED 0x0010
+#define PRINTER_OUT_OF_PAPER 0x0020
+#define PRINTER_ACKNOWLEDGED 0x0040
+#define PRINTER_NOT_BUSY 0x0080
+
+/* fbCtlHndShake */
+
+#define MODE_DTR_CONTROL 0x01
+#define MODE_DTR_HANDSHAKE 0x02
+#define MODE_CTS_HANDSHAKE 0x08
+#define MODE_DSR_HANDSHAKE 0x10
+#define MODE_DCD_HANDSHAKE 0x20
+#define MODE_DSR_SENSITIVITY 0x40
+
+/* fbFlowReplace */
+
+#define MODE_AUTO_TRANSMIT 0x01
+#define MODE_AUTO_RECEIVE 0x02
+#define MODE_ERROR_CHAR 0x04
+#define MODE_NULL_STRIPPING 0x08
+#define MODE_BREAK_CHAR 0x10
+#define MODE_RTS_CONTROL 0x40
+#define MODE_RTS_HANDSHAKE 0x80
+#define MODE_TRANSMIT_TOGGLE 0xC0
+
+/* fbTimeout */
+
+#define MODE_NO_WRITE_TIMEOUT 0x01
+#define MODE_READ_TIMEOUT 0x02
+#define MODE_WAIT_READ_TIMEOUT 0x04
+#define MODE_NOWAIT_READ_TIMEOUT 0x06
+
+typedef struct _DCBINFO { /* dcbinf */
+ USHORT usWriteTimeout;
+ USHORT usReadTimeout;
+ BYTE fbCtlHndShake;
+ BYTE fbFlowReplace;
+ BYTE fbTimeout;
+ BYTE bErrorReplacementChar;
+ BYTE bBreakReplacementChar;
+ BYTE bXONChar;
+ BYTE bXOFFChar;
+} DCBINFO;
+typedef DCBINFO FAR *PDCBINFO;
+
+typedef struct _TRACKLAYOUT { /* trckl */
+ BYTE bCommand;
+ USHORT usHead;
+ USHORT usCylinder;
+ USHORT usFirstSector;
+ USHORT cSectors;
+ struct {
+ USHORT usSectorNumber;
+ USHORT usSectorSize;
+ } TrackTable[1];
+} TRACKLAYOUT;
+typedef TRACKLAYOUT FAR *PTRACKLAYOUT;
+
+#define DEVTYPE_48TPI 0x0000
+#define DEVTYPE_96TPI 0x0001
+#define DEVTYPE_35 0x0002
+#define DEVTYPE_8SD 0x0003
+#define DEVTYPE_8DD 0x0004
+#define DEVTYPE_FIXED 0x0005
+#define DEVTYPE_TAPE 0x0006
+#define DEVTYPE_UNKNOWN 0x0007
+
+typedef struct _BIOSPARAMETERBLOCK { /* bspblk */
+ USHORT usBytesPerSector;
+ BYTE bSectorsPerCluster;
+ USHORT usReservedSectors;
+ BYTE cFATs;
+ USHORT cRootEntries;
+ USHORT cSectors;
+ BYTE bMedia;
+ USHORT usSectorsPerFAT;
+ USHORT usSectorsPerTrack;
+ USHORT cHeads;
+ ULONG cHiddenSectors;
+ ULONG cLargeSectors;
+ BYTE abReserved[6];
+ USHORT cCylinders;
+ BYTE bDeviceType;
+ USHORT fsDeviceAttr;
+} BIOSPARAMETERBLOCK;
+typedef BIOSPARAMETERBLOCK FAR *PBIOSPARAMETERBLOCK;
+
+typedef struct _SCREENGROUP { /* scrgrp */
+ USHORT idScreenGrp;
+ USHORT fTerminate;
+} SCREENGROUP;
+typedef SCREENGROUP FAR *PSCREENGROUP;
+
+typedef struct _FRAME { /* frm */
+ BYTE bCharsPerLine;
+ BYTE bLinesPerInch;
+} FRAME;
+typedef FRAME FAR *PFRAME;
+
+typedef struct _KBDTYPE { /* kbdtyp */
+ USHORT usType;
+ USHORT reserved1;
+ USHORT reserved2;
+} KBDTYPE;
+typedef KBDTYPE FAR *PKBDTYPE;
+
+typedef struct _LINECONTROL { /* lnctl */
+ BYTE bDataBits;
+ BYTE bParity;
+ BYTE bStopBits;
+ BYTE fTransBreak;
+} LINECONTROL;
+typedef LINECONTROL FAR *PLINECONTROL;
+
+/* MODEMSTATUS.fbModemOn, ASYNC_GETMODEMOUTPUT */
+
+#define DTR_ON 0x01
+#define RTS_ON 0x02
+
+/* MODEMSTATUS.fbModemOff */
+
+#define DTR_OFF 0xFE
+#define RTS_OFF 0xFD
+
+typedef struct _MODEMSTATUS { /* mdmst */
+ BYTE fbModemOn;
+ BYTE fbModemOff;
+} MODEMSTATUS;
+typedef MODEMSTATUS FAR *PMODEMSTATUS;
+
+typedef struct _TRACKFORMAT { /* trckfmt */
+ BYTE bCommand;
+ USHORT usHead;
+ USHORT usCylinder;
+ USHORT usReserved;
+ USHORT cSectors;
+ struct {
+ BYTE bCylinder;
+ BYTE bHead;
+ BYTE idSector;
+ BYTE bBytesSector;
+ } FormatTable[1];
+} TRACKFORMAT;
+typedef TRACKFORMAT FAR *PTRACKFORMAT;
+
+typedef struct _RXQUEUE { /* rxq */
+ USHORT cch;
+ USHORT cb;
+} RXQUEUE;
+typedef RXQUEUE FAR *PRXQUEUE;
+
+typedef struct _DEVICEPARAMETERBLOCK { /* dvpblck */
+ USHORT reserved1;
+ USHORT cCylinders;
+ USHORT cHeads;
+ USHORT cSectorsPerTrack;
+ USHORT reserved2;
+ USHORT reserved3;
+ USHORT reserved4;
+ USHORT reserved5;
+} DEVICEPARAMETERBLOCK;
+typedef DEVICEPARAMETERBLOCK FAR *PDEVICEPARAMETERBLOCK;
+
+typedef struct _PTRDRAWFUNCTION { /* ptrdfnc */
+ USHORT usReturnCode;
+ PFN pfnDraw;
+ PCH pchDataSeg;
+} PTRDRAWFUNCTION;
+typedef PTRDRAWFUNCTION FAR *PPTRDRAWFUNCTION;
+
+typedef struct _PTRDRAWADDRESS { /* ptrdaddr */
+ USHORT reserved;
+ PTRDRAWFUNCTION ptrdfnc;
+} PTRDRAWADDRESS;
+typedef PTRDRAWADDRESS FAR *PPTRDRAWADDRESS;
+
+typedef struct _SHIFTSTATE { /* shftst */
+ USHORT fsState;
+ BYTE fNLS;
+} SHIFTSTATE;
+typedef SHIFTSTATE FAR *PSHIFTSTATE;
+
+/* HOTKEY.fsHotKey/SHIFTSTATE.fsState */
+
+#define RIGHTSHIFT 0x0001
+#define LEFTSHIFT 0x0002
+#define CONTROL 0x0004
+#define ALT 0x0008
+#define SCROLLLOCK_ON 0x0010
+#define NUMLOCK_ON 0x0020
+#define CAPSLOCK_ON 0x0040
+#define INSERT_ON 0x0080
+#define LEFTCONTROL 0x0100
+#define LEFTALT 0x0200
+#define RIGHTCONTROL 0x0400
+#define RIGHTALT 0x0800
+#define SCROLLLOCK 0x1000
+#define NUMLOCK 0x2000
+#define CAPSLOCK 0x4000
+#define SYSREQ 0x8000
+
+typedef struct _HOTKEY { /* htky */
+ USHORT fsHotKey;
+ UCHAR uchScancodeMake;
+ UCHAR uchScancodeBreak;
+ USHORT idHotKey;
+} HOTKEY;
+typedef HOTKEY FAR *PHOTKEY;
+
+typedef struct _MONITORPOSITION { /* mnpos */
+ USHORT fPosition;
+ USHORT index;
+ ULONG pbInBuf;
+ USHORT offOutBuf;
+} MONITORPOSITION;
+typedef MONITORPOSITION FAR *PMONITORPOSITION;
+
+typedef struct _RATEDELAY { /* rtdly */
+ USHORT usDelay;
+ USHORT usRate;
+} RATEDELAY;
+typedef RATEDELAY FAR *PRATEDELAY;
+
+typedef struct _CODEPAGEINFO { /* cpi */
+ PBYTE pbTransTable;
+ USHORT idCodePage;
+ USHORT idTable;
+} CODEPAGEINFO;
+typedef FAR *PCODEPAGEINFO;
+
+typedef struct _CPID { /* cpid */
+ USHORT idCodePage;
+ USHORT Reserved;
+} CPID;
+typedef FAR *PCPID;
+
+typedef struct _LDTADDRINFO { /* ldtaddr */
+ PULONG pulPhysAddr;
+ USHORT cb;
+} LDTADDRINFO;
+typedef FAR *PLDTADDRINFO;
+
+typedef struct _PTRDRAWDATA { /* ptrdd */
+ USHORT cb;
+ USHORT usConfig;
+ USHORT usFlag;
+} PTRDRAWDATA;
+typedef FAR *PPTRDRAWDATA;
diff --git a/private/oleauto/tools/win16/os2/inc/bsedos.h b/private/oleauto/tools/win16/os2/inc/bsedos.h
new file mode 100644
index 000000000..3bf9ace73
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/bsedos.h
@@ -0,0 +1,1425 @@
+/***************************************************************************\
+*
+* Module Name: BSEDOS.H
+*
+* OS/2 Base Include File
+*
+* Copyright (c) International Business Machines Corporation 1987
+* Copyright (c) Microsoft Corporation 1987
+*
+* =======================================================================
+*
+* Subcomponents marked with "+" are partially included by default
+*
+* #define: To include:
+*
+* + INCL_DOSPROCESS Process and thread support
+* INCL_DOSINFOSEG InfoSeg support
+* + INCL_DOSFILEMGR File Management
+* + INCL_DOSMEMMGR Memory Management
+* + INCL_DOSSEMAPHORES Semaphore support
+* + INCL_DOSDATETIME Date/Time and Timer support
+* INCL_DOSMODULEMGR Module manager
+* + INCL_DOSRESOURCES Resource support
+* INCL_DOSNLS National Language Support
+* INCL_DOSSIGNALS Signals
+* INCL_DOSMISC Miscellaneous
+* INCL_DOSMONITORS Monitors
+* INCL_DOSQUEUES Queues
+* INCL_DOSSESMGR Session Manager Support
+* INCL_DOSDEVICES Device specific, ring 2 support
+* INCL_DOSNMPIPES Named Pipes Support
+* INCL_DOSPROFILE DosProfile API
+*
+\***************************************************************************/
+
+#define INCL_DOSINCLUDED
+
+#ifdef INCL_DOS
+
+#define INCL_DOSPROCESS
+#define INCL_DOSINFOSEG
+#define INCL_DOSFILEMGR
+#define INCL_DOSMEMMGR
+#define INCL_DOSSEMAPHORES
+#define INCL_DOSDATETIME
+#define INCL_DOSMODULEMGR
+#define INCL_DOSRESOURCES
+#define INCL_DOSNLS
+#define INCL_DOSSIGNALS
+#define INCL_DOSMISC
+#define INCL_DOSMONITORS
+#define INCL_DOSQUEUES
+#define INCL_DOSSESMGR
+#define INCL_DOSDEVICES
+#define INCL_DOSNMPIPES
+#define INCL_DOSPROFILE
+
+#endif /* INCL_DOS */
+
+#ifdef INCL_ERRORS
+#define INCL_DOSERRORS
+#endif /* INCL_ERRORS */
+
+#if (defined(INCL_DOSPROCESS) || !defined(INCL_NOCOMMON))
+
+/*** General services */
+
+USHORT APIENTRY DosBeep(USHORT usFrequency, USHORT usDuration);
+
+/*** Process and Thread support */
+
+VOID APIENTRY DosExit(USHORT fTerminate, USHORT usExitCode);
+
+/* DosExit codes */
+#define EXIT_THREAD 0
+#define EXIT_PROCESS 1
+
+#endif /* common INCL_DOSPROCESS definitions */
+
+#ifdef INCL_DOSPROCESS
+
+typedef struct _PIDINFO { /* pidi */
+ PID pid;
+ TID tid;
+ PID pidParent;
+} PIDINFO;
+typedef PIDINFO FAR *PPIDINFO;
+
+typedef VOID (FAR *PFNTHREAD)(VOID);
+
+USHORT APIENTRY DosCreateThread(PFNTHREAD pfnFun, PTID pTid, PBYTE pbStack);
+USHORT APIENTRY DosResumeThread(TID tid);
+USHORT APIENTRY DosSuspendThread(TID tid);
+
+/* Action code values */
+#define DCWA_PROCESS 0
+#define DCWA_PROCESSTREE 1
+
+/* Wait option values */
+#define DCWW_WAIT 0
+#define DCWW_NOWAIT 1
+
+typedef struct _RESULTCODES { /* resc */
+ USHORT codeTerminate;
+ USHORT codeResult;
+} RESULTCODES;
+typedef RESULTCODES FAR *PRESULTCODES;
+
+USHORT APIENTRY DosCwait(USHORT fScope, USHORT fWait, PRESULTCODES prescResults,
+ PPID ppidProcess, PID pidWaitProcess);
+USHORT APIENTRY DosSleep(ULONG ulTime);
+
+/* codeTerminate values (also passed to ExitList routines) */
+#define TC_EXIT 0
+#define TC_HARDERROR 1
+#define TC_TRAP 2
+#define TC_KILLPROCESS 3
+
+typedef VOID (PASCAL FAR *PFNEXITLIST)(USHORT);
+
+USHORT APIENTRY DosEnterCritSec(VOID);
+USHORT APIENTRY DosExitCritSec(VOID);
+USHORT APIENTRY DosExitList(USHORT fFnCode, PFNEXITLIST pfnFunction);
+
+/* DosExitList functions */
+#define EXLST_ADD 1
+#define EXLST_REMOVE 2
+#define EXLST_EXIT 3
+
+USHORT APIENTRY DosExecPgm(PCHAR pchFailName, SHORT cbFailName,
+ USHORT fExecFlags, PSZ pszArgs, PSZ pszEnv,
+ PRESULTCODES prescResults, PSZ pszPgmName);
+
+/* DosExecPgm functions */
+#define EXEC_SYNC 0
+#define EXEC_ASYNC 1
+#define EXEC_ASYNCRESULT 2
+#define EXEC_TRACE 3
+#define EXEC_BACKGROUND 4
+#define EXEC_LOAD 5
+
+USHORT APIENTRY DosGetPID(PPIDINFO ppidInfo);
+USHORT APIENTRY DosGetPPID(USHORT pidChild, PUSHORT ppidParent);
+
+USHORT APIENTRY DosGetPrty(USHORT usScope, PUSHORT pusPriority, USHORT pid);
+USHORT APIENTRY DosSetPrty(USHORT usScope, USHORT fPrtyClass, SHORT sChange,
+ USHORT id);
+
+/* Priority scopes */
+#define PRTYS_PROCESS 0
+#define PRTYS_PROCESSTREE 1
+#define PRTYS_THREAD 2
+
+/* Priority classes */
+#define PRTYC_NOCHANGE 0
+#define PRTYC_IDLETIME 1
+#define PRTYC_REGULAR 2
+#define PRTYC_TIMECRITICAL 3
+#define PRTYC_FOREGROUNDSERVER 4
+
+/* Priority deltas */
+#define PRTYD_MINIMUM -31
+#define PRTYD_MAXIMUM 31
+
+USHORT APIENTRY DosKillProcess(USHORT usScope, PID pidProcess);
+
+#define DKP_PROCESSTREE 0
+#define DKP_PROCESS 1
+
+#endif /* INCL_DOSPROCESS */
+
+
+/*** InfoSeg support */
+
+#ifdef INCL_DOSINFOSEG
+
+/* Global Information Segment */
+
+typedef struct _GINFOSEG { /* gis */
+ ULONG time;
+ ULONG msecs;
+ UCHAR hour;
+ UCHAR minutes;
+ UCHAR seconds;
+ UCHAR hundredths;
+ USHORT timezone;
+ USHORT cusecTimerInterval;
+ UCHAR day;
+ UCHAR month;
+ USHORT year;
+ UCHAR weekday;
+ UCHAR uchMajorVersion;
+ UCHAR uchMinorVersion;
+ UCHAR chRevisionLetter;
+ UCHAR sgCurrent;
+ UCHAR sgMax;
+ UCHAR cHugeShift;
+ UCHAR fProtectModeOnly;
+ USHORT pidForeground;
+ UCHAR fDynamicSched;
+ UCHAR csecMaxWait;
+ USHORT cmsecMinSlice;
+ USHORT cmsecMaxSlice;
+ USHORT bootdrive;
+ UCHAR amecRAS[32];
+ UCHAR csgWindowableVioMax;
+ UCHAR csgPMMax;
+} GINFOSEG;
+typedef GINFOSEG FAR *PGINFOSEG;
+
+/* Local Information Segment */
+
+typedef struct _LINFOSEG { /* lis */
+ PID pidCurrent;
+ PID pidParent;
+ USHORT prtyCurrent;
+ TID tidCurrent;
+ USHORT sgCurrent;
+ UCHAR rfProcStatus;
+ UCHAR dummy1;
+ BOOL fForeground;
+ UCHAR typeProcess;
+ UCHAR dummy2;
+ SEL selEnvironment;
+ USHORT offCmdLine;
+ USHORT cbDataSegment;
+ USHORT cbStack;
+ USHORT cbHeap;
+ HMODULE hmod;
+ SEL selDS;
+} LINFOSEG;
+typedef LINFOSEG FAR *PLINFOSEG;
+
+/* Process Type codes (local information segment typeProcess field) */
+
+#define PT_FULLSCREEN 0 /* Full screen application */
+#define PT_REALMODE 1 /* Real mode process */
+#define PT_WINDOWABLEVIO 2 /* VIO windowable application */
+#define PT_PM 3 /* Presentation Manager application */
+#define PT_DETACHED 4 /* Detached application */
+
+/* Process Status Flag definitions (local info seg rfProcStatus field) */
+
+#define PS_EXITLIST 1 /* Thread is in exitlist routine */
+
+
+USHORT APIENTRY DosGetInfoSeg(PSEL pselGlobal, PSEL pselLocal);
+
+/* Helper macros used to convert selector to PINFOSEG or LINFOSEG */
+
+#define MAKEPGINFOSEG(sel) ((PGINFOSEG)MAKEP(sel, 0))
+#define MAKEPLINFOSEG(sel) ((PLINFOSEG)MAKEP(sel, 0))
+
+#endif /* INCL_DOSINFOSEG */
+
+#ifndef INCL_SAADEFS
+
+/*
+ * CCHMAXPATH is the maximum fully qualified path name length including
+ * the drive letter, colon, backslashes and terminating NULL.
+ */
+#define CCHMAXPATH 260
+
+/*
+ * CCHMAXPATHCOMP is the maximum individual path component name length
+ * including a terminating NULL.
+ */
+#define CCHMAXPATHCOMP 256
+
+#endif /* !INCL_SAADEFS */
+
+#if (defined(INCL_DOSFILEMGR) || !defined(INCL_NOCOMMON))
+
+/*** File manager */
+
+/* DosSetFilePtr() file position codes */
+
+#define FILE_BEGIN 0x0000 /* relative to beginning of file */
+#define FILE_CURRENT 0x0001 /* relative to current fptr position*/
+#define FILE_END 0x0002 /* relative to end of file */
+
+/* DosFindFirst/Next Directory handle types */
+
+#define HDIR_SYSTEM 0x0001 /* Use system handle (1) */
+#define HDIR_CREATE 0xFFFF /* Allocate a new, unused handle */
+
+/* DosCopy control bits - may be or'ed together */
+#define DCPY_EXISTING 0x00001 /* Copy even if target exists */
+#define DCPY_APPEND 0x00002 /* Append to existing file, don't replace*/
+
+/* Dosopen/DosQFHandState/DosQueryFileInfo et al file attributes; also */
+/* known as Dso File Mode bits... */
+#define FILE_NORMAL 0x0000
+#define FILE_READONLY 0x0001
+#define FILE_HIDDEN 0x0002
+#define FILE_SYSTEM 0x0004
+#define FILE_DIRECTORY 0x0010
+#define FILE_ARCHIVED 0x0020
+
+/* DosOpen() actions */
+#define FILE_EXISTED 0x0001
+#define FILE_CREATED 0x0002
+#define FILE_TRUNCATED 0x0003
+
+/* DosOpen() open flags */
+#define FILE_OPEN 0x0001
+#define FILE_TRUNCATE 0x0002
+#define FILE_CREATE 0x0010
+
+/* applies if file already exists */
+
+#define OPEN_ACTION_FAIL_IF_EXISTS 0x0000 /* ---- ---- ---- 0000 */
+#define OPEN_ACTION_OPEN_IF_EXISTS 0x0001 /* ---- ---- ---- 0001 */
+#define OPEN_ACTION_REPLACE_IF_EXISTS 0x0002 /* ---- ---- ---- 0010 */
+
+/* applies if file does not exist */
+
+#define OPEN_ACTION_FAIL_IF_NEW 0x0000 /* ---- ---- 0000 ---- */
+#define OPEN_ACTION_CREATE_IF_NEW 0x0010 /* ---- ---- 0001 ---- */
+
+/* DosOpen/DosSetFHandState flags */
+
+#define OPEN_ACCESS_READONLY 0x0000 /* ---- ---- ---- -000 */
+#define OPEN_ACCESS_WRITEONLY 0x0001 /* ---- ---- ---- -001 */
+#define OPEN_ACCESS_READWRITE 0x0002 /* ---- ---- ---- -010 */
+#define OPEN_SHARE_DENYREADWRITE 0x0010 /* ---- ---- -001 ---- */
+#define OPEN_SHARE_DENYWRITE 0x0020 /* ---- ---- -010 ---- */
+#define OPEN_SHARE_DENYREAD 0x0030 /* ---- ---- -011 ---- */
+#define OPEN_SHARE_DENYNONE 0x0040 /* ---- ---- -100 ---- */
+#define OPEN_FLAGS_NOINHERIT 0x0080 /* ---- ---- 1--- ---- */
+#define OPEN_FLAGS_NO_LOCALITY 0x0000 /* ---- -000 ---- ---- */
+#define OPEN_FLAGS_SEQUENTIAL 0x0100 /* ---- -001 ---- ---- */
+#define OPEN_FLAGS_RANDOM 0x0200 /* ---- -010 ---- ---- */
+#define OPEN_FLAGS_RANDOMSEQUENTIAL 0x0300 /* ---- -011 ---- ---- */
+#define OPEN_FLAGS_NO_CACHE 0x1000 /* ---1 ---- ---- ---- */
+#define OPEN_FLAGS_FAIL_ON_ERROR 0x2000 /* --1- ---- ---- ---- */
+#define OPEN_FLAGS_WRITE_THROUGH 0x4000 /* -1-- ---- ---- ---- */
+#define OPEN_FLAGS_DASD 0x8000 /* 1--- ---- ---- ---- */
+
+
+/* DosSearchPath() constants */
+
+#define SEARCH_PATH 0x0000
+#define SEARCH_CUR_DIRECTORY 0x0001
+#define SEARCH_ENVIRONMENT 0x0002
+#define SEARCH_IGNORENETERRS 0x0004
+
+/*
+ * DosFileIO
+ */
+/* File IO command words */
+#define FIO_LOCK 0 /* Lock Files */
+#define FIO_UNLOCK 1 /* Unlock Files */
+#define FIO_SEEK 2 /* Seek (set file ptr) */
+#define FIO_READ 3 /* File Read */
+#define FIO_WRITE 4 /* File Write */
+
+/* Lock Sharing Modes */
+#define FIO_NOSHARE 0 /* None */
+#define FIO_SHAREREAD 1 /* Read-Only */
+
+typedef struct _FIOLOCKCMD { /* FLC FileLockCmd prefix */
+ USHORT usCmd; /* Cmd = FIO_LOCK */
+ USHORT cLockCnt; /* Lock records that follow */
+ ULONG cTimeOut; /* in Msec */
+} FIOLOCKCMD;
+typedef FIOLOCKCMD FAR *PFIOLOCKCMD;
+
+
+typedef struct _FIOLOCKREC { /* FLR FileLockRecord */
+ USHORT fShare; /* FIO_NOSHARE or FIO_SHAREREAD */
+ ULONG cbStart; /* Starting offset for lock region */
+ ULONG cbLength; /* Length of lock region */
+} FIOLOCKREC;
+typedef FIOLOCKREC FAR *PFIOLOCKREC;
+
+
+typedef struct _FIOUNLOCKCMD { /* FUC FileUnlockCmd prefix */
+ USHORT usCmd; /* Cmd = FIO_UNLOCK */
+ USHORT cUnlockCnt; /* Unlock records that follow */
+} FIOUNLOCKCMD;
+typedef FIOUNLOCKCMD FAR *PFIOUNLOCKCMD;
+
+
+typedef struct _FIOUNLOCKREC { /* FUR FileUnlockRecord */
+ ULONG cbStart; /* Starting offset for unlock region */
+ ULONG cbLength; /* Length of unlock region */
+} FIOUNLOCKREC;
+typedef FIOUNLOCKREC FAR *PFIOUNLOCKREC;
+
+
+typedef struct _FIOSEEKCMD { /* Seek command structure */
+ USHORT usCmd; /* Cmd = FIO_SEEK */
+ USHORT fsMethod; /* One of&gml FPM_BEGINNING, FPM_CURRENT, */
+ /* or FPM_END */
+ ULONG cbDistance; /* Byte offset for seek */
+ ULONG cbNewPosition; /* Bytes from start of file after seek */
+} FIOSEEKCMD;
+typedef FIOSEEKCMD FAR *PFIOSEEKCMD;
+
+
+typedef struct _FIOREADWRITE { /* RWC Read&Write command structure */
+ USHORT usCmd; /* Cmd = FIO_READ or FIO_WRITE */
+ PVOID pbBuffer; /* Pointer to data buffer */
+ USHORT cbBufferLen; /* Bytes in buffer or max size */
+ USHORT cbActualLen; /* Bytes actually read/written */
+} FIOREADWRITE;
+typedef FIOREADWRITE FAR *PFIOREADWRITE;
+
+
+/***
+ * EA Info Levels & Find First/Next
+ * API's: DosFindFirst, DosQueryFileInfo, DosQueryPathInfo, DosSetFileInfo,
+ * DosSetPathInfo
+ */
+
+/* File info levels : All listed API's */
+#define FIL_STANDARD 1 /* Info level 1, standard file info */
+#define FIL_QUERYEASIZE 2 /* Level 2, return Full EA size */
+#define FIL_QUERYEASFROMLIST 3 /* Level 3, return requested EA's */
+
+/* File info levels: Dos...PathInfo only */
+#define FIL_QUERYFULLNAME 5 /* Level 5, return fully qualified */
+ /* name of file */
+#define FIL_NAMEISVALID 6 /* Level 6, check validity of */
+ /* file/path name for this FSD */
+
+/* DosFindNotifyFirst() */
+#define FNOTIL_STANDARD 1 /* Find-Notify Info level 1&gml Return */
+ /* standard directory change info */
+
+/* DosFsAttach() */
+/* Attact or detach */
+#define FSATTACH 0 /* Attach file server */
+#define FSDETACH 1 /* Detach file server */
+
+/* DosFsCtl() */
+/* Routing type */
+#define FSCTL_HANDLE 1 /* File Handle directs req routing */
+#define FSCTL_PATHNAME 2 /* Path Name directs req routing */
+#define FSCTL_FSDNAME 3 /* FSD Name directs req routing */
+
+/* DosQueryFSAttach() */
+/* Information level types (defines method of query) */
+#define FSAIL_QUERYNAME 1 /* Return data for a Drive or Device */
+#define FSAIL_DEVNUMBER 2 /* Return data for Ordinal Device # */
+#define FSAIL_DRVNUMBER 3 /* Return data for Ordinal Drive # */
+
+/* Item types (from data structure item "iType") */
+#define FSAT_CHARDEV 1 /* Resident character device */
+#define FSAT_PSEUDODEV 2 /* Pusedu-character device */
+#define FSAT_LOCALDRV 3 /* Local drive */
+#define FSAT_REMOTEDRV 4 /* Remote drive attached to FSD */
+
+typedef struct _FSQBUFFER { /* Data structure for QFSAttach */
+ USHORT iType; /* Item type */
+ USHORT cbName; /* Length of item name, sans NULL */
+ UCHAR szName[1]; /* ASCIIZ item name */
+ USHORT cbFSDName; /* Length of FSD name, sans NULL */
+ UCHAR szFSDName[1]; /* ASCIIZ FSD name */
+ USHORT cbFSAData; /* Length of FSD Attach data returned */
+ UCHAR rgFSAData[1]; /* FSD Attach data from FSD */
+} FSQBUFFER;
+typedef FSQBUFFER FAR *PFSQBUFFER;
+
+/*
+ * File System Drive Information&gml DosQueryFSInfo DosSetFSInfo
+ */
+
+/* FS Drive Info Levels */
+#define FSIL_ALLOC 1 /* Drive allocation info (Query only) */
+#define FSIL_VOLSER 2 /* Drive Volume/Serial information */
+
+/* DosQueryFHType() */
+/* Handle classes (low 8 bits of Handle Type) */
+#define FHT_DISKFILE 0x0000 /* Disk file handle */
+#define FHT_CHRDEV 0x0001 /* Character device handle */
+#define FHT_PIPE 0x0002 /* Pipe handle */
+
+/* Handle bits (high 8 bits of Handle Type) */
+#define FHB_DSKREMOTE 0x8000 /* Remote disk */
+#define FHB_CHRDEVREMOTE 0x8000 /* Remote character device */
+#define FHB_PIPEREMOTE 0x8000 /* Remote pipe */
+
+
+typedef SHANDLE HFILE; /* hf */
+typedef HFILE FAR *PHFILE;
+
+#ifndef INCL_SAADEFS
+
+/* File time and date types */
+
+typedef struct _FTIME { /* ftime */
+ unsigned twosecs : 5;
+ unsigned minutes : 6;
+ unsigned hours : 5;
+} FTIME;
+typedef FTIME FAR *PFTIME;
+
+typedef struct _FDATE { /* fdate */
+ unsigned day : 5;
+ unsigned month : 4;
+ unsigned year : 7;
+} FDATE;
+typedef FDATE FAR *PFDATE;
+
+typedef struct _FILEFINDBUF { /* findbuf */
+ FDATE fdateCreation;
+ FTIME ftimeCreation;
+ FDATE fdateLastAccess;
+ FTIME ftimeLastAccess;
+ FDATE fdateLastWrite;
+ FTIME ftimeLastWrite;
+ ULONG cbFile;
+ ULONG cbFileAlloc;
+ USHORT attrFile;
+ UCHAR cchName;
+ CHAR achName[CCHMAXPATHCOMP];
+} FILEFINDBUF;
+typedef FILEFINDBUF FAR *PFILEFINDBUF;
+
+typedef struct _FILEFINDBUF2 { /* findbuf2 */
+ FDATE fdateCreation;
+ FTIME ftimeCreation;
+ FDATE fdateLastAccess;
+ FTIME ftimeLastAccess;
+ FDATE fdateLastWrite;
+ FTIME ftimeLastWrite;
+ ULONG cbFile;
+ ULONG cbFileAlloc;
+ USHORT attrFile;
+ ULONG cbList;
+ UCHAR cchName;
+ CHAR achName[CCHMAXPATHCOMP];
+} FILEFINDBUF2;
+typedef FILEFINDBUF2 FAR *PFILEFINDBUF2;
+
+/* extended attribute structures */
+typedef struct _GEA { /* gea */
+ BYTE cbName; /* name length not including NULL */
+ CHAR szName[1]; /* attribute name */
+} GEA;
+typedef GEA far *PGEA;
+
+typedef struct _GEALIST { /* geal */
+ ULONG cbList; /* total bytes of structure inc full list */
+ GEA list[1]; /* variable length GEA structures */
+} GEALIST;
+typedef GEALIST far * PGEALIST;
+
+typedef struct _FEA { /* fea */
+ BYTE fEA; /* flags */
+ BYTE cbName; /* name length not including NULL */
+ USHORT cbValue; /* value length */
+} FEA;
+typedef FEA far *PFEA;
+
+/* flags for _FEA.fEA */
+
+#define FEA_NEEDEA 0x80 /* need EA bit */
+
+typedef struct _FEALIST { /* feal */
+ ULONG cbList; /* total bytes of structure inc full list */
+ FEA list[1]; /* variable length FEA structures */
+} FEALIST;
+typedef FEALIST far * PFEALIST;
+
+typedef struct _EAOP { /* eaop */
+ PGEALIST fpGEAList; /* general EA list */
+ PFEALIST fpFEAList; /* full EA list */
+ ULONG oError;
+} EAOP;
+typedef EAOP far * PEAOP;
+
+
+/*
+ * Equates for EA types
+ *
+ * Values 0xFFFE thru 0x8000 are reserved.
+ * Values 0x0000 thru 0x7fff are user definable.
+ * Value 0xFFFC is not used
+ */
+
+#define EAT_BINARY 0xFFFE /* length preceeded binary */
+#define EAT_ASCII 0xFFFD /* length preceeded ASCII */
+#define EAT_BITMAP 0xFFFB /* length preceeded bitmap */
+#define EAT_METAFILE 0xFFFA /* length preceeded metafile */
+#define EAT_ICON 0xFFF9 /* length preceeded icon */
+#define EAT_EA 0xFFEE /* length preceeded ASCII extended attribute */
+ /* name of associated data (#include)*/
+#define EAT_MVMT 0xFFDF /* multi-valued, multi-typed field */
+#define EAT_MVST 0xFFDE /* multi-valued, single-typed field */
+#define EAT_ASN1 0xFFDD /* ASN.1 field */
+
+
+#endif /* !INCL_SAADEFS */
+
+USHORT APIENTRY DosOpen(PSZ pszFname, PHFILE phfOpen, PUSHORT pusAction,
+ ULONG ulFSize, USHORT usAttr, USHORT fsOpenFlags,
+ USHORT fsOpenMode, ULONG ulReserved);
+USHORT APIENTRY DosOpen2(PSZ pszFname, PHFILE phf, PUSHORT pusAction,
+ ULONG ulFSize, USHORT usAttr, USHORT usOpenFlags,
+ ULONG usOpenMode, PEAOP pvEABuf, ULONG ulReserved);
+USHORT APIENTRY DosClose(HFILE hf);
+USHORT APIENTRY DosRead(HFILE hf, PVOID pBuf, USHORT cbBuf,
+ PUSHORT pcbBytesRead);
+USHORT APIENTRY DosWrite(HFILE hf, PVOID bBuf, USHORT cbBuf,
+ PUSHORT pcbBytesWritten);
+USHORT APIENTRY DosOplockRelease(ULONG cookie, USHORT procBlkKey);
+USHORT APIENTRY DosOplockWait(PULONG pcookie, PULONG procBlkKey);
+
+/* File system shutdown */
+
+USHORT APIENTRY DosShutdown(ULONG ulReserved);
+
+/* File time and date types */
+
+typedef struct _FILESTATUS { /* fsts */
+ FDATE fdateCreation;
+ FTIME ftimeCreation;
+ FDATE fdateLastAccess;
+ FTIME ftimeLastAccess;
+ FDATE fdateLastWrite;
+ FTIME ftimeLastWrite;
+ ULONG cbFile;
+ ULONG cbFileAlloc;
+ USHORT attrFile;
+} FILESTATUS;
+typedef FILESTATUS FAR *PFILESTATUS;
+
+typedef struct _FILESTATUS2 { /* fsts2 */
+ FDATE fdateCreation;
+ FTIME ftimeCreation;
+ FDATE fdateLastAccess;
+ FTIME ftimeLastAccess;
+ FDATE fdateLastWrite;
+ FTIME ftimeLastWrite;
+ ULONG cbFile;
+ ULONG cbFileAlloc;
+ USHORT attrFile;
+ ULONG cbList;
+} FILESTATUS2;
+typedef FILESTATUS2 FAR *PFILESTATUS2;
+
+typedef struct _FSALLOCATE { /* fsalloc */
+ ULONG idFileSystem;
+ ULONG cSectorUnit;
+ ULONG cUnit;
+ ULONG cUnitAvail;
+ USHORT cbSector;
+} FSALLOCATE;
+typedef FSALLOCATE FAR *PFSALLOCATE;
+
+typedef struct _VOLUMELABEL { /* vol */
+ BYTE cch;
+ CHAR szVolLabel[12];
+} VOLUMELABEL;
+typedef VOLUMELABEL FAR *PVOLUMELABEL;
+
+typedef struct _FSINFO { /* fsinf */
+ FDATE fdateCreation;
+ FTIME ftimeCreation;
+ VOLUMELABEL vol;
+} FSINFO;
+typedef FSINFO FAR *PFSINFO;
+
+/* HANDTYPE values */
+
+#define HANDTYPE_FILE 0x0000
+#define HANDTYPE_DEVICE 0x0001
+#define HANDTYPE_PIPE 0x0002
+#define HANDTYPE_NETWORK 0x8000
+
+typedef struct _FILELOCK { /* flock */
+ LONG lOffset;
+ LONG lRange;
+} FILELOCK;
+typedef FILELOCK FAR *PFILELOCK;
+
+typedef SHANDLE HDIR; /* hdir */
+typedef HDIR FAR *PHDIR;
+
+USHORT APIENTRY DosDelete(PSZ pszFName, ULONG ulReserverd);
+USHORT APIENTRY DosDupHandle(HFILE hfOld, PHFILE phfNew);
+
+USHORT APIENTRY DosQFHandState(HFILE hf, PUSHORT pfsOpenMode);
+USHORT APIENTRY DosSetFHandState(HFILE hf, USHORT fsState);
+USHORT APIENTRY DosQHandType(HFILE hf, PUSHORT pfsType, PUSHORT pusDevAttr);
+
+USHORT APIENTRY DosReadAsync (HFILE hf, PULONG hsemRam, PUSHORT pusErrCode,
+ PVOID pBuf, USHORT cbBuf, PUSHORT pcbBytesRead);
+USHORT APIENTRY DosWriteAsync(HFILE hf, PULONG hsemRam, PUSHORT pusErrCode,
+ PVOID pBuf, USHORT cbBuf, PUSHORT pcbBytesWritten);
+
+USHORT APIENTRY DosFindFirst(PSZ pszFSpec, PHDIR phdir, USHORT usAttr,
+ PFILEFINDBUF pffb, USHORT cbBuf, PUSHORT pcSearch,
+ ULONG ulReserved);
+USHORT APIENTRY DosFindFirst2(PSZ pszFSpec, PHDIR phdir, USHORT usAttr,
+ PVOID pBuf, USHORT cbBuf, PUSHORT pcSearch,
+ USHORT usInfoLevel, ULONG ulReserved);
+USHORT APIENTRY DosFindNext(HDIR hdir, PFILEFINDBUF pffb, USHORT cbBuf,
+ PUSHORT pcSearch);
+USHORT APIENTRY DosFindClose(HDIR hdir);
+USHORT APIENTRY DosFindNotifyFirst(PSZ pszPath, PHDIR hdir, USHORT usAttr,
+ PBYTE pBuf, USHORT cbBuf, PUSHORT pcChg,
+ USHORT usInfoLevel, ULONG ulTimeOut,
+ ULONG ulReserved);
+USHORT APIENTRY DosFindNotifyNext(HDIR hDir, PVOID pBuf, USHORT cbBuf,
+ PUSHORT pcChg, ULONG ulTimeOut);
+USHORT APIENTRY DosFindNotifyClose(HDIR hDir);
+
+USHORT APIENTRY DosFSAttach(PSZ pszDevName, PSZ pszFSD, PBYTE pData,
+ USHORT cbData, USHORT fsOp, ULONG ulReserved);
+USHORT APIENTRY DosQFSAttach(PSZ pszDev, USHORT usOrdinal, USHORT usInfoLevel,
+ PBYTE pFSAttBuf, PUSHORT cbBuf, ULONG ulReserved);
+USHORT APIENTRY DosFSCtl(PBYTE pData, USHORT cbData, PUSHORT pcbData,
+ PBYTE pParms, USHORT cbParms, PUSHORT pcbParms,
+ USHORT usFunCode, PSZ pszRoute, HFILE hf,
+ USHORT usRouteMethod, ULONG ulReserved);
+
+USHORT APIENTRY DosNewSize(HFILE hf, ULONG ulNewSize);
+USHORT APIENTRY DosBufReset(HFILE hf);
+
+USHORT APIENTRY DosChgFilePtr(HFILE hf, LONG lOffset, USHORT fsMethod,
+ PULONG pulNewOffset);
+
+USHORT APIENTRY DosSetFilePtr(HFILE hf, LONG lOffset, USHORT fsMethod,
+ PULONG pulNewOffset);
+
+USHORT APIENTRY DosFileLocks(HFILE hf, PFILELOCK pUnlock, PFILELOCK pLock);
+
+USHORT APIENTRY DosMove(PSZ pszOld, PSZ pszNew, ULONG ulReserved);
+USHORT APIENTRY DosCopy(PSZ pszSrc, PSZ pszDst, USHORT usOpt, ULONG ulReserved);
+USHORT APIENTRY DosEditName(USHORT usEditLevel, PSZ pszSrc, PSZ pszEdit,
+ PBYTE pszDst, USHORT cbDst);
+
+USHORT APIENTRY DosFileIO(HFILE hf, PBYTE pbCmd, USHORT cbCmd, PUSHORT pulErr);
+USHORT APIENTRY DosMkDir(PSZ pszDirName, ULONG usReserved);
+USHORT APIENTRY DosMkDir2(PSZ pszDir, PEAOP pBuf, ULONG ulReserved);
+USHORT APIENTRY DosRmDir(PSZ pszDir, ULONG ulReserved);
+USHORT APIENTRY DosSelectDisk(USHORT usDrvNum);
+USHORT APIENTRY DosQCurDisk(PUSHORT pusDrvNum, PULONG pulLogDrvMap);
+
+USHORT APIENTRY DosChDir(PSZ pszDir, ULONG ulReserved);
+USHORT APIENTRY DosQCurDir(USHORT usDrvNum, PBYTE pszPathBuf,
+ PUSHORT pcbPathBuf);
+
+USHORT APIENTRY DosQFSInfo(USHORT usDrvNum, USHORT usInfoLevel, PBYTE pbInfo,
+ USHORT cbInfo);
+USHORT APIENTRY DosSetFSInfo(USHORT usDrvNum, USHORT usInfoLevel, PBYTE pBuf,
+ USHORT cbBuf);
+USHORT APIENTRY DosQVerify(PUSHORT pfVerifyOn);
+USHORT APIENTRY DosSetVerify(USHORT fVerify);
+USHORT APIENTRY DosSetMaxFH(USHORT usHandles);
+
+USHORT APIENTRY DosQFileInfo(HFILE hf, USHORT usInfoLevel, PBYTE pInfoBuf,
+ USHORT cbInfoBuf);
+USHORT APIENTRY DosSetFileInfo(HFILE hf, USHORT usInfoLevel, PBYTE pInfoBuf,
+ USHORT cbInfoBuf);
+USHORT APIENTRY DosQPathInfo(PSZ pszPath, USHORT usInfoLevel, PBYTE pInfoBuf,
+ USHORT cbInfoBuf, ULONG ulReserved);
+USHORT APIENTRY DosSetPathInfo(PSZ pszPath, USHORT usInfoLevel, PBYTE pInfoBuf,
+ USHORT cbInfoBuf, USHORT usFlags,
+ ULONG ulReserved);
+
+/* defines for dossetpathinfo -pathinfo flag */
+#define DSPI_WRTTHRU 0x10 /* write through */
+
+USHORT APIENTRY DosQFileMode(PSZ pszFName, PUSHORT pusAttr, ULONG ulReserved);
+USHORT APIENTRY DosSetFileMode(PSZ pszFName, USHORT usAttr, ULONG ulReserved);
+
+USHORT APIENTRY DosEnumAttribute(USHORT, PVOID, ULONG, PVOID, ULONG, PULONG,
+ ULONG, ULONG);
+
+typedef struct _DENA1 { /* level 1 info returned from DosEnumAttribute */
+ UCHAR reserved; /* 0 */
+ UCHAR cbName; /* length of name exculding NULL */
+ USHORT cbValue; /* length of value */
+ UCHAR szName[1]; /* variable length asciiz name */
+} DENA1;
+typedef DENA1 FAR *PDENA1;
+
+#endif /* common INCL_DOSFILEMGR */
+
+#if (defined(INCL_DOSMEMMGR) || !defined(INCL_NOCOMMON))
+/*** Memory management */
+
+USHORT APIENTRY DosAllocSeg(USHORT cbSize, PSEL pSel, USHORT fsAlloc);
+USHORT APIENTRY DosReallocSeg(USHORT cbNewSize, SEL sel);
+USHORT APIENTRY DosFreeSeg(SEL sel);
+USHORT APIENTRY DosGiveSeg(SEL sel, PID pid, PSEL pSelRecipient);
+USHORT APIENTRY DosGetSeg(SEL sel);
+USHORT APIENTRY DosSizeSeg(SEL sel, PULONG pcbSize);
+
+/* Segment attribute flags (used with DosAllocSeg) */
+
+#define SEG_NONSHARED 0x0000
+#define SEG_GIVEABLE 0x0001
+#define SEG_GETTABLE 0x0002
+#define SEG_DISCARDABLE 0x0004
+
+#endif /* common INCL_DOSMEMMGR */
+
+#ifdef INCL_DOSMEMMGR
+
+USHORT APIENTRY DosAllocHuge(USHORT cSegs, USHORT cbPartialSeg, PSEL psel,
+ USHORT cMaxSegs, USHORT fsAlloc);
+USHORT APIENTRY DosReallocHuge(USHORT cSegs, USHORT cbPartialSeg, SEL sel);
+USHORT APIENTRY DosGetHugeShift(PUSHORT pusShiftCount);
+
+USHORT APIENTRY DosAllocShrSeg(USHORT cbSeg, PSZ pszSegName, PSEL psel);
+
+USHORT APIENTRY DosLockSeg(SEL sel);
+USHORT APIENTRY DosUnlockSeg(SEL sel);
+
+USHORT APIENTRY DosGetShrSeg(PSZ pszSegName, PSEL psel);
+
+USHORT APIENTRY DosMemAvail(PULONG pcbFree);
+USHORT APIENTRY DosCreateCSAlias(SEL selDS, PSEL pselCS);
+
+USHORT APIENTRY DosSubAlloc(SEL sel, PUSHORT pusOffset, USHORT cb);
+USHORT APIENTRY DosSubFree(SEL sel, USHORT offBlock, USHORT cb);
+USHORT APIENTRY DosSubSet(SEL sel, USHORT fFlags, USHORT cbNew);
+
+#endif /* INCL_DOSMEMMGR */
+
+#if (defined(INCL_DOSSEMAPHORES) || !defined(INCL_NOCOMMON))
+
+/*** Semaphore support */
+
+#define SEM_INDEFINITE_WAIT -1L
+#define SEM_IMMEDIATE_RETURN 0L
+
+USHORT APIENTRY DosSemClear(HSEM hsem);
+USHORT APIENTRY DosSemSet(HSEM hsem);
+USHORT APIENTRY DosSemWait(HSEM hsem, LONG lTimeOut);
+USHORT APIENTRY DosSemSetWait(HSEM hsem, LONG lTimeOut);
+USHORT APIENTRY DosSemRequest(HSEM hsem, LONG lTimeOut);
+
+#endif /* common INCL_DOSSEMAPHORES */
+
+#ifdef INCL_DOSSEMAPHORES
+
+typedef LHANDLE HSYSSEM; /* hssm */
+typedef HSYSSEM FAR *PHSYSSEM;
+
+USHORT APIENTRY DosCreateSem(USHORT fExclusive, PHSYSSEM phsem, PSZ pszSemName);
+
+#define CSEM_PRIVATE 0
+#define CSEM_PUBLIC 1
+
+USHORT APIENTRY DosOpenSem(PHSEM phsem, PSZ pszSemName);
+USHORT APIENTRY DosCloseSem(HSEM hsem);
+
+typedef struct _MUXSEM { /* mxs */
+ USHORT zero;
+ HSEM hsem;
+} MUXSEM;
+typedef MUXSEM FAR *PMUXSEM;
+
+typedef struct _MUXSEMLIST { /* mxsl */
+ USHORT cmxs;
+ MUXSEM amxs[16];
+} MUXSEMLIST;
+typedef MUXSEMLIST FAR *PMUXSEMLIST;
+
+/*
+ * Since a MUXSEMLIST structure is actually a variable length
+ * structure, the following macro may be used to define a MUXSEMLIST
+ * structure having size elements, named "name".
+ */
+#define DEFINEMUXSEMLIST(name, size) \
+ struct { \
+ USHORT cmxs; \
+ MUXSEM amxs[size]; \
+ } name;
+
+/*
+ * This function actually takes a far pointer to a MUXSEMLIST structure
+ * as its second parameter, but in order to allow its use with the
+ * DEFINEMUXSEMLIST macro, it is declared here as PVOID.
+ */
+USHORT APIENTRY DosMuxSemWait(PUSHORT pisemCleared, PVOID pmsxl, LONG lTimeOut);
+
+
+/*** Fast safe ram semaphores */
+
+typedef struct _DOSFSRSEM { /* dosfsrs */
+ USHORT cb;
+ PID pid;
+ TID tid;
+ USHORT cUsage;
+ USHORT client;
+ ULONG sem;
+} DOSFSRSEM;
+typedef DOSFSRSEM FAR *PDOSFSRSEM;
+
+USHORT APIENTRY DosFSRamSemRequest(PDOSFSRSEM pdosfsrs, LONG lTimeOut);
+USHORT APIENTRY DosFSRamSemClear(PDOSFSRSEM pdosfsrs);
+
+#endif /* INCL_DOSSEMAPHORES */
+
+#if (defined(INCL_DOSDATETIME) || !defined(INCL_NOCOMMON))
+
+/*** Time support */
+
+typedef struct _DATETIME { /* date */
+ UCHAR hours;
+ UCHAR minutes;
+ UCHAR seconds;
+ UCHAR hundredths;
+ UCHAR day;
+ UCHAR month;
+ USHORT year;
+ SHORT timezone;
+ UCHAR weekday;
+} DATETIME;
+typedef DATETIME FAR *PDATETIME;
+
+USHORT APIENTRY DosGetDateTime(PDATETIME pdatetime);
+USHORT APIENTRY DosSetDateTime(PDATETIME pdatetime);
+
+#endif /* common INCL_DOSDATETIME */
+
+#ifdef INCL_DOSDATETIME
+
+typedef SHANDLE HTIMER;
+typedef HTIMER FAR *PHTIMER;
+
+USHORT APIENTRY DosTimerAsync(ULONG ulTime, HSEM hsem, PHTIMER phtimer);
+USHORT APIENTRY DosTimerStart(ULONG ulTime, HSEM hsem, PHTIMER phtimer);
+USHORT APIENTRY DosTimerStop(HTIMER htimer);
+
+#endif /* INCL_DOSDATETIME */
+
+
+/*** Module manager */
+
+#ifdef INCL_DOSMODULEMGR
+
+USHORT APIENTRY DosLoadModule(PSZ pszFailName, USHORT cbFileName,
+ PSZ pszModName, PHMODULE phmod);
+USHORT APIENTRY DosFreeModule(HMODULE hmod);
+USHORT APIENTRY DosGetProcAddr(HMODULE hmod, PSZ pszProcName,
+ PFN FAR * ppfnProcAddr);
+USHORT APIENTRY DosGetModHandle(PSZ pszModName, PHMODULE phMod);
+USHORT APIENTRY DosGetModName(HMODULE hmod, USHORT cbBuf, PCHAR pchBuf);
+
+#endif /* INCL_DOSMODULEMGR */
+
+#if (defined(INCL_DOSRESOURCES) || !defined(INCL_NOCOMMON))
+
+/*** Resource support */
+
+/* Predefined resource types */
+
+#define RT_POINTER 1 /* mouse pointer shape */
+#define RT_BITMAP 2 /* bitmap */
+#define RT_MENU 3 /* menu template */
+#define RT_DIALOG 4 /* dialog template */
+#define RT_STRING 5 /* string tables */
+#define RT_FONTDIR 6 /* font directory */
+#define RT_FONT 7 /* font */
+#define RT_ACCELTABLE 8 /* accelerator tables */
+#define RT_RCDATA 9 /* binary data */
+#define RT_MESSAGE 10 /* error mesage tables */
+#define RT_DLGINCLUDE 11 /* dialog include file name */
+#define RT_VKEYTBL 12 /* key to vkey tables */
+#define RT_KEYTBL 13 /* key to UGL tables */
+#define RT_CHARTBL 14
+#define RT_DISPLAYINFO 15 /* screen display information */
+
+#define RT_FKASHORT 16 /* function key area short form */
+#define RT_FKALONG 17 /* function key area long form */
+
+#define RT_HELPTABLE 18
+#define RT_HELPSUBTABLE 19
+
+#define RT_FDDIR 20
+#define RT_FD 21
+
+#define RT_MAX 22 /* 1st unused Resource Type */
+
+
+#endif /* common INCL_DOSRESOURCES */
+
+#ifdef INCL_DOSRESOURCES
+
+USHORT APIENTRY DosGetResource(HMODULE hmod, USHORT idType, USHORT idName,
+ PSEL psel);
+USHORT APIENTRY DosGetResource2(HMODULE hmod, USHORT idType, USHORT idName,
+ PVOID FAR * ppData);
+USHORT APIENTRY DosFreeResource(PVOID pData);
+
+#endif /* INCL_DOSRESOURCES */
+
+
+/*** NLS Support */
+
+#ifdef INCL_DOSNLS
+
+typedef struct _COUNTRYCODE { /* ctryc */
+ USHORT country;
+ USHORT codepage;
+} COUNTRYCODE;
+typedef COUNTRYCODE FAR *PCOUNTRYCODE;
+
+typedef struct _COUNTRYINFO { /* ctryi */
+ USHORT country;
+ USHORT codepage;
+ USHORT fsDateFmt;
+ CHAR szCurrency[5];
+ CHAR szThousandsSeparator[2];
+ CHAR szDecimal[2];
+ CHAR szDateSeparator[2];
+ CHAR szTimeSeparator[2];
+ UCHAR fsCurrencyFmt;
+ UCHAR cDecimalPlace;
+ UCHAR fsTimeFmt;
+ USHORT abReserved1[2];
+ CHAR szDataSeparator[2];
+ USHORT abReserved2[5];
+} COUNTRYINFO;
+typedef COUNTRYINFO FAR *PCOUNTRYINFO;
+
+USHORT APIENTRY DosGetCtryInfo(USHORT cbBuf, PCOUNTRYCODE pctryc,
+ PCOUNTRYINFO pctryi, PUSHORT pcbCtryInfo);
+USHORT APIENTRY DosGetDBCSEv(USHORT cbBuf, PCOUNTRYCODE pctryc, PCHAR pchBuf);
+USHORT APIENTRY DosCaseMap(USHORT usLen, PCOUNTRYCODE pctryc, PCHAR pchStr);
+USHORT APIENTRY DosGetCollate(USHORT cbBuf, PCOUNTRYCODE pctryc, PCHAR pchBuf,
+ PUSHORT pcbTable);
+USHORT APIENTRY DosGetCp(USHORT cbBuf, PUSHORT pBuf, PUSHORT pcbCodePgLst);
+USHORT APIENTRY DosSetCp(USHORT usCodePage, USHORT usReserved);
+USHORT APIENTRY DosSetProcCp(USHORT usCodePage, USHORT usReserved);
+
+#endif /* INCL_DOSNLS */
+
+
+/*** Signal support */
+
+#ifdef INCL_DOSSIGNALS
+
+/* Signal Numbers for DosSetSigHandler */
+
+#define SIG_CTRLC 1 /* Control C */
+#define SIG_BROKENPIPE 2 /* Broken Pipe */
+#define SIG_KILLPROCESS 3 /* Program Termination */
+#define SIG_CTRLBREAK 4 /* Control Break */
+#define SIG_PFLG_A 5 /* Process Flag A */
+#define SIG_PFLG_B 6 /* Process Flag B */
+#define SIG_PFLG_C 7 /* Process Flag C */
+#define SIG_CSIGNALS 8 /* number of signals plus one */
+
+/* Flag Numbers for DosFlagProcess */
+
+#define PFLG_A 0 /* Process Flag A */
+#define PFLG_B 1 /* Process Flag B */
+#define PFLG_C 2 /* Process Flag C */
+
+/* Signal actions */
+
+#define SIGA_KILL 0
+#define SIGA_IGNORE 1
+#define SIGA_ACCEPT 2
+#define SIGA_ERROR 3
+#define SIGA_ACKNOWLEDGE 4
+
+/* DosHoldSignal constants */
+
+#define HLDSIG_ENABLE 0
+#define HLDSIG_DISABLE 1
+
+/* DosFlagProcess codes */
+
+#define FLGP_SUBTREE 0
+#define FLGP_PID 1
+
+typedef VOID (PASCAL FAR *PFNSIGHANDLER)(USHORT, USHORT);
+
+USHORT APIENTRY DosSetSigHandler(PFNSIGHANDLER pfnSigHandler,
+ PFNSIGHANDLER FAR * ppfnPrev, PUSHORT pfAction,
+ USHORT fAction, USHORT usSigNum);
+USHORT APIENTRY DosFlagProcess(PID pid, USHORT fScope, USHORT usFlagNum,
+ USHORT usFlagArg);
+USHORT APIENTRY DosHoldSignal(USHORT fDisable);
+USHORT APIENTRY DosSendSignal(USHORT idProcess, USHORT usSigNumber);
+
+#endif /* INCL_DOSSIGNALS */
+
+
+/*** Monitor support */
+
+#ifdef INCL_DOSMONITORS
+
+typedef SHANDLE HMONITOR; /* hmon */
+typedef HMONITOR FAR *PHMONITOR;
+
+USHORT APIENTRY DosMonOpen(PSZ pszDevName, PHMONITOR phmon);
+USHORT APIENTRY DosMonClose(HMONITOR hmon);
+USHORT APIENTRY DosMonReg(HMONITOR hmon, PBYTE pbInBuf, PBYTE pbOutBuf,
+ USHORT fPosition, USHORT usIndex);
+USHORT APIENTRY DosMonRead(PBYTE pbInBuf, USHORT fWait, PBYTE pbDataBuf,
+ PUSHORT pcbData);
+USHORT APIENTRY DosMonWrite(PBYTE pbOutBuf, PBYTE pbDataBuf, USHORT cbData);
+
+#endif /* INCL_DOSMONITORS */
+
+
+/*** Pipe and queue support */
+
+#ifdef INCL_DOSQUEUES
+#if (defined(INCL_DOSFILEMGR) || !defined(INCL_NOCOMMON))
+
+typedef SHANDLE HQUEUE; /* hq */
+typedef HQUEUE FAR *PHQUEUE;
+
+USHORT APIENTRY DosMakePipe(PHFILE phfRead, PHFILE phfWrite, USHORT cb);
+USHORT APIENTRY DosCloseQueue(HQUEUE hqueue);
+USHORT APIENTRY DosCreateQueue(PHQUEUE phqueue, USHORT fQueueOrder,
+ PSZ pszQueueName);
+USHORT APIENTRY DosOpenQueue(PUSHORT ppidOwner, PHQUEUE phqueue,
+ PSZ pszQueueName);
+USHORT APIENTRY DosPeekQueue(HQUEUE hqueue, PULONG pqresc, PUSHORT pcbElement,
+ PULONG ppBuf, PUSHORT pElemCode, UCHAR fWait,
+ PBYTE pbElemPrty, ULONG hsem);
+USHORT APIENTRY DosPurgeQueue(HQUEUE hqueue);
+USHORT APIENTRY DosQueryQueue(HQUEUE hqueue, PUSHORT pcElem);
+USHORT APIENTRY DosReadQueue(HQUEUE hqueue, PULONG pqresc, PUSHORT pcbElem,
+ PULONG ppBuf, USHORT usElem, UCHAR fWait,
+ PBYTE pbElemPrty, HSEM hsem);
+USHORT APIENTRY DosWriteQueue(HQUEUE hqueue, USHORT usRequest, USHORT cbBuf,
+ PBYTE pBuf, UCHAR fPriority);
+
+#else /* INCL_DOSFILEMGR || !INCL_NOCOMMON */
+#error PHFILE not defined - define INCL_DOSFILEMGR or undefine INCL_NOCOMMON
+#endif /* INCL_DOSFILEMGR || !INCL_NOCOMMON */
+#endif /* INCL_DOSQUEUES */
+
+#ifdef INCL_DOSMISC
+
+/* definitions for DOSSEARCHPATH control word */
+#define DSP_IMPLIEDCUR 1 /* current dir will be searched first */
+#define DSP_PATHREF 2 /* from envirnoment variable */
+#define DSP_IGNORENETERR 4 /* ignore net errs & continue search */
+
+/* definition for DOSQSYSINFO */
+#define Q_MAX_PATH_LENGTH (0) /* index for query max path length */
+
+USHORT APIENTRY DosError(USHORT fEnable);
+USHORT APIENTRY DosSetVec(USHORT usVecNum, PFN pfnFun, PFN ppfnPrev);
+USHORT APIENTRY DosGetMessage(PCHAR FAR * ppchVTable, USHORT usVCount,
+ PCHAR pchBuf, USHORT cbBuf, USHORT usMsgNum,
+ PSZ pszFileName, PUSHORT pcbMsg);
+USHORT APIENTRY DosErrClass(USHORT usErrCode, PUSHORT pusClass,
+ PUSHORT pfsAction, PUSHORT pusLocus);
+USHORT APIENTRY DosInsMessage(PCHAR FAR * ppchVTable, USHORT usVCount,
+ PSZ pszMsg, USHORT cbMsg, PCHAR pchBuf,
+ USHORT cbBuf, PUSHORT pcbMsg);
+USHORT APIENTRY DosPutMessage(USHORT hf, USHORT cbMsg, PCHAR pchMsg);
+USHORT APIENTRY DosSysTrace(USHORT, USHORT, USHORT, PCHAR);
+USHORT APIENTRY DosDynamicTrace(USHORT, PBYTE, PBYTE);
+USHORT APIENTRY DosPTrace(PBYTE pPtraceBuf);
+USHORT APIENTRY DosQSysInfo(USHORT index, PBYTE pBuf, USHORT cbBuf);
+USHORT APIENTRY DosGetEnv(PUSHORT pselEnv, PUSHORT pOffsetCmd);
+USHORT APIENTRY DosScanEnv(PSZ pszVarName, PSZ FAR * ppszResult);
+USHORT APIENTRY DosSearchPath(USHORT fsSearch, PSZ pszPath, PSZ pszFName,
+ PBYTE pBuf, USHORT cbBuf);
+USHORT APIENTRY DosGetVersion(PUSHORT pVer);
+USHORT APIENTRY DosGetMachineMode(PBYTE pMachMode);
+
+#endif /* INCL_DOSMISC */
+
+
+/*** Session manager support */
+
+#ifdef INCL_DOSSESMGR
+
+typedef struct _STARTDATA { /* stdata */
+ USHORT Length;
+ USHORT Related;
+ USHORT FgBg;
+ USHORT TraceOpt;
+ PSZ PgmTitle;
+ PSZ PgmName;
+ PBYTE PgmInputs;
+ PBYTE TermQ;
+ PBYTE Environment;
+ USHORT InheritOpt;
+ USHORT SessionType;
+ PSZ IconFile;
+ ULONG PgmHandle;
+ USHORT PgmControl;
+ USHORT InitXPos;
+ USHORT InitYPos;
+ USHORT InitXSize;
+ USHORT InitYSize;
+} STARTDATA;
+typedef STARTDATA FAR *PSTARTDATA;
+
+typedef struct _STATUSDATA { /* stsdata */
+ USHORT Length;
+ USHORT SelectInd;
+ USHORT BondInd;
+} STATUSDATA;
+typedef STATUSDATA FAR *PSTATUSDATA;
+
+USHORT APIENTRY DosStartSession(PSTARTDATA pstdata, PUSHORT pidSession,
+ PUSHORT ppid);
+USHORT APIENTRY DosSetSession(USHORT idSession, PSTATUSDATA pstsdata);
+USHORT APIENTRY DosSelectSession(USHORT idSession, ULONG ulReserved);
+USHORT APIENTRY DosStopSession(USHORT fScope, USHORT idSession,
+ ULONG ulReserved);
+USHORT APIENTRY DosQAppType(PSZ pszPrgName, PUSHORT pusType);
+
+#endif /* INCL_DOSSESMGR */
+
+
+/*** Device support */
+
+#ifdef INCL_DOSDEVICES
+
+USHORT APIENTRY DosDevConfig(PVOID pDevInfo, USHORT usItem, USHORT usReserved);
+USHORT APIENTRY DosDevIOCtl(PVOID pData, PVOID pParms, USHORT usFun,
+ USHORT usCategory, HFILE hDev);
+USHORT APIENTRY DosDevIOCtl2(PVOID pData, USHORT cbData, PVOID pParm,
+ USHORT cbParm, USHORT usFun, USHORT usCategory,
+ HFILE hDev);
+USHORT APIENTRY DosSystemService(USHORT usCategory, PVOID pRequest,
+ PVOID pResponse);
+
+USHORT APIENTRY DosCLIAccess(VOID);
+USHORT APIENTRY DosPortAccess(USHORT usReserved, USHORT fRelease,
+ USHORT usFirstPort, USHORT usLastPort);
+USHORT APIENTRY DosPhysicalDisk(USHORT usFun, PBYTE pOut, USHORT cbOut,
+ PBYTE pParm, USHORT cbParm);
+
+USHORT APIENTRY DosR2StackRealloc(USHORT cbStack);
+VOID APIENTRY DosCallback(PFN pfn);
+
+#endif /* INCL_DOSDEVICES */
+
+
+/*** DosNamedPipes API Support */
+
+#ifdef INCL_DOSNMPIPES
+
+typedef SHANDLE HPIPE; /* hp */
+typedef HPIPE FAR *PHPIPE;
+
+typedef struct _AVAILDATA { /* PeekNMPipe Bytes Available record */
+ USHORT cbpipe; /* bytes left in the pipe */
+ USHORT cbmessage; /* bytes left in current message */
+} AVAILDATA;
+typedef AVAILDATA FAR *PAVAILDATA;
+
+USHORT APIENTRY DosCallNmPipe(PSZ pszName, PBYTE pInBuf, USHORT cbInBuf,
+ PBYTE pbOutBuf, USHORT cbOutBuf, PUSHORT pcbRead,
+ ULONG ulTimeOut);
+USHORT APIENTRY DosConnectNmPipe(HPIPE hp);
+USHORT APIENTRY DosDisConnectNmPipe(HPIPE hp);
+USHORT APIENTRY DosMakeNmPipe(PSZ pszName, PHPIPE php, USHORT fsOpenMode,
+ USHORT fsPipeMode, USHORT cbOutBuf,
+ USHORT cbInBuf, ULONG ulTimeOut);
+USHORT APIENTRY DosPeekNmPipe(HPIPE hp, PBYTE pBuf, USHORT cbBuf,
+ PUSHORT pcbRead, PAVAILDATA pAvail,
+ PUSHORT pfsState);
+USHORT APIENTRY DosQNmPHandState(HPIPE hp, PUSHORT pfsState);
+USHORT APIENTRY DosQNmPipeInfo(HPIPE hp, USHORT usInfoLevel, PBYTE pBuf,
+ USHORT cb);
+USHORT APIENTRY DosQNmPipeSemState(HSEM hsem, PBYTE pBuf, USHORT cb);
+USHORT APIENTRY DosSetNmPHandState(HPIPE hp, USHORT fsState);
+USHORT APIENTRY DosSetNmPipeSem(HPIPE hp, HSEM hsem, USHORT usKeyVal);
+USHORT APIENTRY DosTransactNmPipe(HPIPE hp, PBYTE bOutBuf, USHORT cbOut,
+ PBYTE pInBuf, USHORT cbIn, PUSHORT pcbRead);
+USHORT APIENTRY DosWaitNmPipe(PSZ pszName, ULONG ulTimeOut);
+
+/*** Data structures and equates used with named pipes ***/
+
+struct npi_data1 { /* PipeInfo data block (returned, level 1) */
+ unsigned short npi_obuflen; /* length of outgoing I/O buffer */
+ unsigned short npi_ibuflen; /* length of incoming I/O buffer */
+ unsigned char npi_maxicnt; /* maximum number of instances */
+ unsigned char npi_curicnt; /* current number of instances */
+ unsigned char npi_namlen; /* length of pipe name */
+ char npi_name[1]; /* start of name */
+}; /* npi_data1 */
+
+struct npss { /* QNmPipeSemState information record */
+ unsigned char npss_status; /* type of record, 0 = EOI, 1 = read ok, */
+ /* 2 = write ok, 3 = pipe closed */
+ unsigned char npss_flag; /* additional info, 01 = waiting thread */
+ unsigned short npss_key; /* user's key value */
+ unsigned short npss_avail; /* available data/space if status = 1/2 */
+}; /* npss */
+
+/* values in npss_status */
+#define NPSS_EOI 0 /* End Of Information */
+#define NPSS_RDATA 1 /* read data available */
+#define NPSS_WSPACE 2 /* write space available */
+#define NPSS_CLOSE 3 /* pipe in CLOSING state */
+
+/* values in npss_flag */
+#define NPSS_WAIT 0x01 /* waiting thread on end of pipe */
+
+/* defined bits in pipe mode */
+#define NP_NBLK 0x8000 /* non-blocking read/write */
+#define NP_SERVER 0x4000 /* set if server end */
+#define NP_WMESG 0x0400 /* write messages */
+#define NP_RMESG 0x0100 /* read as messages */
+#define NP_ICOUNT 0x00FF /* instance count field */
+
+
+/* Named pipes may be in one of several states depending on the actions
+ * that have been taken on it by the server end and client end. The
+ * following state/action table summarizes the valid state transitions:
+ *
+ * Current state Action Next state
+ *
+ * <none> server DosMakeNmPipe DISCONNECTED
+ * DISCONNECTED server connect LISTENING
+ * LISTENING client open CONNECTED
+ * CONNECTED server disconn DISCONNECTED
+ * CONNECTED client close CLOSING
+ * CLOSING server disconn DISCONNECTED
+ * CONNECTED server close CLOSING
+ * <any other> server close <pipe deallocated>
+ *
+ * If a server disconnects his end of the pipe, the client end will enter a
+ * special state in which any future operations (except close) on the file
+ * descriptor associated with the pipe will return an error.
+ */
+
+/*
+ * Values for named pipe state
+ */
+
+#define NP_DISCONNECTED 1 /* after pipe creation or Disconnect */
+#define NP_LISTENING 2 /* after DosNmPipeConnect */
+#define NP_CONNECTED 3 /* after Client open */
+#define NP_CLOSING 4 /* after Client or Server close */
+
+
+#endif /* INCL_DOSNMPIPES */
+
+/*** DosProfile API support */
+
+#ifdef INCL_DOSPROFILE
+
+/* DosProfile ordinal number */
+
+#define PROF_ORDINAL 133
+
+/* DosProfile usType */
+
+#define PROF_SYSTEM 0
+#define PROF_USER 1
+#define PROF_USEDD 2
+#define PROF_KERNEL 4
+#define PROF_VERBOSE 8
+#define PROF_ENABLE 16
+
+/* DosProfile usFunc */
+
+#define PROF_ALLOC 0
+#define PROF_CLEAR 1
+#define PROF_ON 2
+#define PROF_OFF 3
+#define PROF_DUMP 4
+#define PROF_FREE 5
+
+/* DosProfile tic count granularity (DWORD) */
+
+#define PROF_SHIFT 2
+
+/* DosProfile module name string length */
+
+#define PROF_MOD_NAME_SIZE 10
+
+/* DosProfile error code for end of data */
+
+#define PROF_END_OF_DATA 13
+
+#endif /* INCL_DOSPROFILE */
+
+#ifdef INCL_DOSMISC
+
+/*** Miscelanious functions ***/
+
+/* DosError() error-handling types */
+
+#define HARDERROR_ENABLE 0x0001
+#define HARDERROR_DISABLE 0x0000
+#define EXCEPTION_ENABLE 0x0000
+#define EXCEPTION_DISABLE 0x0002
+
+/* DosGetMachineMode() machine modes */
+
+#define MODE_REAL 0x0000
+#define MODE_PROTECTED 0x0001
+
+/* DosSetVec vectors */
+
+#define VECTOR_DIVIDE_BY_ZERO 0x0000
+#define VECTOR_OVERFLOW 0x0004
+#define VECTOR_OUTOFBOUNDS 0x0005
+#define VECTOR_INVALIDOPCODE 0x0006
+#define VECTOR_NO_EXTENSION 0x0007
+#define VECTOR_EXTENSION_ERROR 0x0010
+
+
+USHORT APIENTRY DosError(USHORT);
+USHORT APIENTRY DosErrClass(USHORT, PUSHORT, PUSHORT, PUSHORT);
+USHORT APIENTRY DosQSysInfo(USHORT, PBYTE, USHORT);
+USHORT APIENTRY DosGetEnv(PUSHORT, PUSHORT);
+USHORT APIENTRY DosScanEnv(PSZ, PSZ FAR *);
+USHORT APIENTRY DosGetVersion(PUSHORT);
+USHORT APIENTRY DosGetMachineMode(PBYTE);
+
+USHORT APIENTRY DosGetMessage(PCHAR FAR *, USHORT, PCHAR, USHORT, USHORT,
+ PSZ, PUSHORT);
+USHORT APIENTRY DosInsMessage(PCHAR FAR *, USHORT, PSZ, USHORT, PCHAR,
+ USHORT, PUSHORT);
+USHORT APIENTRY DosPutMessage(HFILE, USHORT, PCHAR);
+
+#endif /* INCL_DOSMISC */
diff --git a/private/oleauto/tools/win16/os2/inc/bseerr.h b/private/oleauto/tools/win16/os2/inc/bseerr.h
new file mode 100644
index 000000000..4c41c49a8
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/bseerr.h
@@ -0,0 +1,637 @@
+/****************************** Module Header ******************************\
+*
+* Module Name: BSEERR.H
+*
+* This file includes the error codes for Base OS/2 applications.
+*
+* Copyright (c) International Business Machines Corporation 1987
+* Copyright (c) Microsoft Corporation 1987
+*
+* ===========================================================================
+*
+* The following symbols are used in this file for conditional sections.
+*
+* INCL_DOSERRORS - OS/2 Errors - only included if symbol defined
+*
+\***************************************************************************/
+/*** Error codes */
+
+#ifdef INCL_ERRORS
+
+#define INCL_DOSERRORS
+
+#endif /* INCL_ERRORS */
+
+#ifdef INCL_DOSERRORS
+
+#define NO_ERROR 0
+
+#define ERROR_INVALID_FUNCTION 1
+#define ERROR_FILE_NOT_FOUND 2
+#define ERROR_PATH_NOT_FOUND 3
+#define ERROR_TOO_MANY_OPEN_FILES 4
+#define ERROR_ACCESS_DENIED 5
+#define ERROR_INVALID_HANDLE 6
+#define ERROR_ARENA_TRASHED 7
+#define ERROR_NOT_ENOUGH_MEMORY 8
+#define ERROR_INVALID_BLOCK 9
+#define ERROR_BAD_ENVIRONMENT 10
+#define ERROR_BAD_FORMAT 11
+#define ERROR_INVALID_ACCESS 12
+#define ERROR_INVALID_DATA 13
+/* 14 is reserved */
+#define ERROR_INVALID_DRIVE 15
+#define ERROR_CURRENT_DIRECTORY 16
+#define ERROR_NOT_SAME_DEVICE 17
+#define ERROR_NO_MORE_FILES 18
+#define ERROR_WRITE_PROTECT 19
+#define ERROR_BAD_UNIT 20
+#define ERROR_NOT_READY 21
+#define ERROR_BAD_COMMAND 22
+#define ERROR_CRC 23
+#define ERROR_BAD_LENGTH 24
+#define ERROR_SEEK 25
+#define ERROR_NOT_DOS_DISK 26
+#define ERROR_SECTOR_NOT_FOUND 27
+#define ERROR_OUT_OF_PAPER 28
+#define ERROR_WRITE_FAULT 29
+#define ERROR_READ_FAULT 30
+#define ERROR_GEN_FAILURE 31
+#define ERROR_SHARING_VIOLATION 32
+#define ERROR_LOCK_VIOLATION 33
+#define ERROR_WRONG_DISK 34
+#define ERROR_FCB_UNAVAILABLE 35
+#define ERROR_SHARING_BUFFER_EXCEEDED 36
+#define ERROR_NOT_SUPPORTED 50
+#define ERROR_REM_NOT_LIST 51 /* Remote computer not listening */
+#define ERROR_DUP_NAME 52 /* Duplicate name on network */
+#define ERROR_BAD_NETPATH 53 /* Network path not found */
+#define ERROR_NETWORK_BUSY 54 /* Network busy */
+#define ERROR_DEV_NOT_EXIST 55 /* Network device no longer exists */
+#define ERROR_TOO_MANY_CMDS 56 /* Net BIOS command limit exceeded */
+#define ERROR_ADAP_HDW_ERR 57 /* Network adapter hardware error */
+#define ERROR_BAD_NET_RESP 58 /* Incorrect response from network */
+#define ERROR_UNEXP_NET_ERR 59 /* Unexpected network error */
+#define ERROR_BAD_REM_ADAP 60 /* Incompatible remote adapter */
+#define ERROR_PRINTQ_FULL 61 /* Print queue full */
+#define ERROR_NO_SPOOL_SPACE 62 /* Not enough space for print file */
+#define ERROR_PRINT_CANCELLED 63 /* Print file was cancelled */
+#define ERROR_NETNAME_DELETED 64 /* Network name was deleted */
+#define ERROR_NETWORK_ACCESS_DENIED 65 /* Access denied */
+#define ERROR_BAD_DEV_TYPE 66 /* Network device type incorrect */
+#define ERROR_BAD_NET_NAME 67 /* Network name not found */
+#define ERROR_TOO_MANY_NAMES 68 /* Network name limit exceeded */
+#define ERROR_TOO_MANY_SESS 69 /* Net BIOS session limit exceeded */
+#define ERROR_SHARING_PAUSED 70 /* Sharing temporarily paused */
+#define ERROR_REQ_NOT_ACCEP 71 /* Network request not accepted */
+#define ERROR_REDIR_PAUSED 72 /* Print|disk redirection is paused*/
+#define ERROR_FILE_EXISTS 80
+#define ERROR_DUP_FCB 81
+#define ERROR_CANNOT_MAKE 82
+#define ERROR_FAIL_I24 83
+#define ERROR_OUT_OF_STRUCTURES 84
+#define ERROR_ALREADY_ASSIGNED 85
+#define ERROR_INVALID_PASSWORD 86
+#define ERROR_INVALID_PARAMETER 87
+#define ERROR_NET_WRITE_FAULT 88
+#define ERROR_NO_PROC_SLOTS 89 /* no process slots available */
+#define ERROR_NOT_FROZEN 90
+#define ERR_TSTOVFL 91 /* timer service table overflow */
+#define ERR_TSTDUP 92 /* timer service table duplicate */
+#define ERROR_NO_ITEMS 93 /* no items to operate upon */
+#define ERROR_INTERRUPT 95 /* interrupted system call */
+#define ERROR_DEVICE_IN_USE 99 /* Device in use by another thread */
+#define ERROR_TOO_MANY_SEMAPHORES 100
+#define ERROR_EXCL_SEM_ALREADY_OWNED 101
+#define ERROR_SEM_IS_SET 102
+#define ERROR_TOO_MANY_SEM_REQUESTS 103
+#define ERROR_INVALID_AT_INTERRUPT_TIME 104
+#define ERROR_SEM_OWNER_DIED 105 /* waitsem found owner died */
+#define ERROR_SEM_USER_LIMIT 106 /* too many procs have this sem */
+#define ERROR_DISK_CHANGE 107
+#define ERROR_DRIVE_LOCKED 108 /* drive locked by another process*/
+#define ERROR_BROKEN_PIPE 109 /* write on pipe with no reader */
+#define ERROR_OPEN_FAILED 110 /* open/created failed due to */
+ /* explicit fail command */
+#define ERROR_BUFFER_OVERFLOW 111 /* buffer passed to system call */
+ /* is too small to hold return */
+ /* data. */
+#define ERROR_DISK_FULL 112 /* not enough space on the disk */
+ /* (DOSNEWSIZE/w_NewSize) */
+#define ERROR_NO_MORE_SEARCH_HANDLES 113 /* can't allocate another search */
+ /* structure and handle. */
+ /* (DOSFINDFIRST/w_FindFirst) */
+#define ERROR_INVALID_TARGET_HANDLE 114 /* Target handle in DOSDUPHANDLE */
+ /* is invalid */
+#define ERROR_PROTECTION_VIOLATION 115 /* Bad user virtual address */
+#define ERROR_VIOKBD_REQUEST 116
+#define ERROR_INVALID_CATEGORY 117 /* Category for DEVIOCTL in not */
+ /* defined */
+#define ERROR_INVALID_VERIFY_SWITCH 118 /* invalid value passed for */
+ /* verify flag */
+#define ERROR_BAD_DRIVER_LEVEL 119 /* DosDevIOCTL looks for a level */
+ /* four driver. If the driver */
+ /* is not level four we return */
+ /* this code */
+#define ERROR_CALL_NOT_IMPLEMENTED 120 /* returned from stub api calls. */
+ /* This call will disappear when */
+ /* all the api's are implemented. */
+#define ERROR_SEM_TIMEOUT 121 /* Time out happened from the */
+ /* semaphore api functions. */
+#define ERROR_INSUFFICIENT_BUFFER 122 /* Some calls require the */
+ /* application to pass in a buffer */
+ /* filled with data. This error is */
+ /* returned if the data buffer is too */
+ /* small. For example: DosSetFileInfo */
+ /* requires 4 bytes of data. If a */
+ /* two byte buffer is passed in then */
+ /* this error is returned. */
+ /* error_buffer_overflow is used when */
+ /* the output buffer in not big enough.*/
+#define ERROR_INVALID_NAME 123 /* illegal character or malformed */
+ /* file system name */
+#define ERROR_INVALID_LEVEL 124 /* unimplemented level for info */
+ /* retrieval or setting */
+#define ERROR_NO_VOLUME_LABEL 125 /* no volume label found with */
+ /* DosQFSInfo command */
+#define ERROR_MOD_NOT_FOUND 126 /* w_getprocaddr,w_getmodhandle */
+#define ERROR_PROC_NOT_FOUND 127 /* w_getprocaddr */
+#define ERROR_WAIT_NO_CHILDREN 128 /* CWait finds to children */
+#define ERROR_CHILD_NOT_COMPLETE 129 /* CWait children not dead yet */
+#define ERROR_DIRECT_ACCESS_HANDLE 130 /* handle operation is invalid */
+ /* for direct disk access */
+ /* handles */
+#define ERROR_NEGATIVE_SEEK 131 /* application tried to seek */
+ /* with negitive offset */
+#define ERROR_SEEK_ON_DEVICE 132 /* application tried to seek */
+ /* on device or pipe */
+#define ERROR_IS_JOIN_TARGET 133
+#define ERROR_IS_JOINED 134
+#define ERROR_IS_SUBSTED 135
+#define ERROR_NOT_JOINED 136
+#define ERROR_NOT_SUBSTED 137
+#define ERROR_JOIN_TO_JOIN 138
+#define ERROR_SUBST_TO_SUBST 139
+#define ERROR_JOIN_TO_SUBST 140
+#define ERROR_SUBST_TO_JOIN 141
+#define ERROR_BUSY_DRIVE 142
+#define ERROR_SAME_DRIVE 143
+#define ERROR_DIR_NOT_ROOT 144
+#define ERROR_DIR_NOT_EMPTY 145
+#define ERROR_IS_SUBST_PATH 146
+#define ERROR_IS_JOIN_PATH 147
+#define ERROR_PATH_BUSY 148
+#define ERROR_IS_SUBST_TARGET 149
+#define ERROR_SYSTEM_TRACE 150 /* system trace error */
+#define ERROR_INVALID_EVENT_COUNT 151 /* DosMuxSemWait errors */
+#define ERROR_TOO_MANY_MUXWAITERS 152
+#define ERROR_INVALID_LIST_FORMAT 153
+#define ERROR_LABEL_TOO_LONG 154
+#define ERROR_TOO_MANY_TCBS 155
+#define ERROR_SIGNAL_REFUSED 156
+#define ERROR_DISCARDED 157
+#define ERROR_NOT_LOCKED 158
+#define ERROR_BAD_THREADID_ADDR 159
+#define ERROR_BAD_ARGUMENTS 160
+#define ERROR_BAD_PATHNAME 161
+#define ERROR_SIGNAL_PENDING 162
+#define ERROR_UNCERTAIN_MEDIA 163
+#define ERROR_MAX_THRDS_REACHED 164
+#define ERROR_MONITORS_NOT_SUPPORTED 165
+#define ERROR_UNC_DRIVER_NOT_INSTALLED 166
+
+/* The following error codes refer to demand loading segments */
+#define ERROR_LOCK_FAILED 167
+#define ERROR_SWAPIO_FAILED 168
+#define ERROR_SWAPIN_FAILED 169
+#define ERROR_BUSY 170
+
+#define ERROR_INVALID_SEGMENT_NUMBER 180
+#define ERROR_INVALID_CALLGATE 181
+#define ERROR_INVALID_ORDINAL 182
+#define ERROR_ALREADY_EXISTS 183
+#define ERROR_NO_CHILD_PROCESS 184
+#define ERROR_CHILD_ALIVE_NOWAIT 185
+#define ERROR_INVALID_FLAG_NUMBER 186
+#define ERROR_SEM_NOT_FOUND 187
+
+/* following error codes make loader error messages distinct */
+#define ERROR_INVALID_STARTING_CODESEG 188
+#define ERROR_INVALID_STACKSEG 189
+#define ERROR_INVALID_MODULETYPE 190
+#define ERROR_INVALID_EXE_SIGNATURE 191
+#define ERROR_EXE_MARKED_INVALID 192
+#define ERROR_BAD_EXE_FORMAT 193
+#define ERROR_ITERATED_DATA_EXCEEDS_64K 194
+#define ERROR_INVALID_MINALLOCSIZE 195
+#define ERROR_DYNLINK_FROM_INVALID_RING 196
+#define ERROR_IOPL_NOT_ENABLED 197
+#define ERROR_INVALID_SEGDPL 198
+#define ERROR_AUTODATASEG_EXCEEDS_64k 199
+#define ERROR_RING2SEG_MUST_BE_MOVABLE 200
+#define ERROR_RELOC_CHAIN_XEEDS_SEGLIM 201
+#define ERROR_INFLOOP_IN_RELOC_CHAIN 202
+#define ERROR_ENVVAR_NOT_FOUND 203
+#define ERROR_NOT_CURRENT_CTRY 204
+#define ERROR_NO_SIGNAL_SENT 205
+#define ERROR_FILENAME_EXCED_RANGE 206 /* if filename > 8.3 */
+#define ERROR_RING2_STACK_IN_USE 207 /* for FAPI */
+#define ERROR_META_EXPANSION_TOO_LONG 208 /* if "*a" > 8.3 */
+#define ERROR_INVALID_SIGNAL_NUMBER 209
+#define ERROR_THREAD_1_INACTIVE 210
+#define ERROR_INFO_NOT_AVAIL 211
+#define ERROR_LOCKED 212
+#define ERROR_BAD_DYNALINK 213
+#define ERROR_TOO_MANY_MODULES 214
+#define ERROR_NESTING_NOT_ALLOWED 215
+#define ERROR_CANNOT_SHRINK 216 /* attempt to shrink ring 2 stack */
+#define ERROR_ZOMBIE_PROCESS 217
+#define ERROR_STACK_IN_HIGH_MEMORY 218
+#define ERROR_INVALID_EXITROUTINE_RING 219
+#define ERROR_GETBUF_FAILED 220
+#define ERROR_FLUSHBUF_FAILED 221
+#define ERROR_TRANSFER_TOO_LONG 222
+#define ERROR_SMG_NO_TARGET_WINDOW 224
+#define ERROR_NO_CHILDREN 228
+#define ERROR_INVALID_SCREEN_GROUP 229
+/*
+ * Error codes 230 - 249 are reserved
+ */
+#define ERROR_BAD_PIPE 230 /* Non-existant pipe or bad operation */
+#define ERROR_PIPE_BUSY 231 /* Pipe is busy */
+#define ERROR_NO_DATA 232 /* No data on non-blocking read */
+#define ERROR_PIPE_NOT_CONNECTED 233 /* Pipe was disconnected by server*/
+#define ERROR_MORE_DATA 234 /* More data is available */
+
+#define ERROR_VC_DISCONNECTED 240
+#define ERROR_CIRCULARITY_REQUESTED 250 /* When renaming a dir which */
+ /* would cause a circularity */
+#define ERROR_DIRECTORY_IN_CDS 251 /* When renaming a dir */
+ /* which is "in use" */
+#define ERROR_INVALID_FSD_NAME 252 /* when trying to access */
+ /* nonexistent FSD */
+#define ERROR_INVALID_PATH 253 /* bad pseudo device */
+#define ERROR_INVALID_EA_NAME 254 /* Illegal chars in name */
+#define ERROR_EA_LIST_INCONSISTENT 255 /* Size or some field bad */
+#define ERROR_EA_LIST_TOO_LONG 256 /* FEAlist > 64K-1 bytes */
+#define ERROR_NO_META_MATCH 257 /* string doesn't match expression*/
+#define ERROR_FINDNOTIFY_TIMEOUT 258 /* FindNotify request timeout */
+#define ERROR_NO_MORE_ITEMS 259 /* QFSAttach ordinal query */
+#define ERROR_SEARCH_STRUC_REUSED 260 /* 3xbox findfirst/next
+ search structure reused */
+#define ERROR_CHAR_NOT_FOUND 261 /* can not find character */
+#define ERROR_TOO_MUCH_STACK 262 /* Stack request exceeds sys limit*/
+#define ERROR_INVALID_ATTR 263 /* invalid FS_ATTRIBUTE */
+#define ERROR_INVALID_STARTING_RING 264
+#define ERROR_INVALID_DLL_INIT_RING 265
+#define ERROR_CANNOT_COPY 266 /* doscopy */
+#define ERROR_DIRECTORY 267 /* doscopy */
+#define ERROR_OPLOCKED_FILE 268
+#define ERROR_OPLOCK_THREAD_EXISTS 269
+
+/* error codes for DosFindNotify */
+#define ERROR_VOLUME_CHANGED 270
+#define ERROR_FINDNOTIFY_HANDLE_IN_USE 271
+#define ERROR_FINDNOTIFY_HANDLE_CLOSED 272
+#define ERROR_NOTIFY_OBJECT_REMOVED 273
+
+/* Error to indicate that ShutDown already done */
+#define ERROR_ALREADY_SHUTDOWN 274
+
+/* error code for DOSFINDFIRST2/NEXT */
+#define ERROR_EAS_DIDNT_FIT 275
+
+/* error codes for EA file format change */
+#define ERROR_EA_FILE_CORRUPT 276
+#define ERROR_EA_TABLE_FULL 277
+#define ERROR_INVALID_EA_HANDLE 278
+#define ERROR_NO_CLUSTER 279
+#define ERROR_CREATE_EA_FILE 280
+#define ERROR_CANNOT_OPEN_EA_FILE 281
+
+/* error codes for FSDs which do not support EAs */
+#define ERROR_EAS_NOT_SUPPORTED 282
+#define ERROR_NEED_EAS_FOUND 283
+
+#define ERROR_INVALID_PROCID 303
+#define ERROR_INVALID_PDELTA 304
+#define ERROR_NOT_DESCENDANT 305
+#define ERROR_NOT_SESSION_MANAGER 306
+#define ERROR_INVALID_PCLASS 307
+#define ERROR_INVALID_SCOPE 308
+#define ERROR_INVALID_THREADID 309
+#define ERROR_DOSSUB_SHRINK 310
+#define ERROR_DOSSUB_NOMEM 311
+#define ERROR_DOSSUB_OVERLAP 312
+#define ERROR_DOSSUB_BADSIZE 313
+#define ERROR_DOSSUB_BADFLAG 314
+#define ERROR_DOSSUB_BADSELECTOR 315
+#define ERROR_MR_MSG_TOO_LONG 316
+#define ERROR_MR_MID_NOT_FOUND 317
+#define ERROR_MR_UN_ACC_MSGF 318
+#define ERROR_MR_INV_MSGF_FORMAT 319
+#define ERROR_MR_INV_IVCOUNT 320
+#define ERROR_MR_UN_PERFORM 321
+#define ERROR_TS_WAKEUP 322
+#define ERROR_TS_SEMHANDLE 323
+#define ERROR_TS_NOTIMER 324
+#define ERROR_TS_HANDLE 326
+#define ERROR_TS_DATETIME 327
+#define ERROR_SYS_INTERNAL 328
+#define ERROR_QUE_CURRENT_NAME 329
+#define ERROR_QUE_PROC_NOT_OWNED 330
+#define ERROR_QUE_PROC_OWNED 331
+#define ERROR_QUE_DUPLICATE 332
+#define ERROR_QUE_ELEMENT_NOT_EXIST 333
+#define ERROR_QUE_NO_MEMORY 334
+#define ERROR_QUE_INVALID_NAME 335
+#define ERROR_QUE_INVALID_PRIORITY 336
+#define ERROR_QUE_INVALID_HANDLE 337
+#define ERROR_QUE_LINK_NOT_FOUND 338
+#define ERROR_QUE_MEMORY_ERROR 339
+#define ERROR_QUE_PREV_AT_END 340
+#define ERROR_QUE_PROC_NO_ACCESS 341
+#define ERROR_QUE_EMPTY 342
+#define ERROR_QUE_NAME_NOT_EXIST 343
+#define ERROR_QUE_NOT_INITIALIZED 344
+#define ERROR_QUE_UNABLE_TO_ACCESS 345
+#define ERROR_QUE_UNABLE_TO_ADD 346
+#define ERROR_QUE_UNABLE_TO_INIT 347
+#define ERROR_VIO_INVALID_MASK 349
+#define ERROR_VIO_PTR 350
+#define ERROR_VIO_APTR 351
+#define ERROR_VIO_RPTR 352
+#define ERROR_VIO_CPTR 353
+#define ERROR_VIO_LPTR 354
+#define ERROR_VIO_MODE 355
+#define ERROR_VIO_WIDTH 356
+#define ERROR_VIO_ATTR 357
+#define ERROR_VIO_ROW 358
+#define ERROR_VIO_COL 359
+#define ERROR_VIO_TOPROW 360
+#define ERROR_VIO_BOTROW 361
+#define ERROR_VIO_RIGHTCOL 362
+#define ERROR_VIO_LEFTCOL 363
+#define ERROR_SCS_CALL 364
+#define ERROR_SCS_VALUE 365
+#define ERROR_VIO_WAIT_FLAG 366
+#define ERROR_VIO_UNLOCK 367
+#define ERROR_SGS_NOT_SESSION_MGR 368
+#define ERROR_SMG_INVALID_SGID 369
+#define ERROR_SMG_INVALID_SESSION_ID 369
+#define ERROR_SMG_NOSG 370
+#define ERROR_SMG_NO_SESSIONS 370
+#define ERROR_SMG_GRP_NOT_FOUND 371
+#define ERROR_SMG_SESSION_NOT_FOUND 371
+#define ERROR_SMG_SET_TITLE 372
+#define ERROR_KBD_PARAMETER 373
+#define ERROR_KBD_NO_DEVICE 374
+#define ERROR_KBD_INVALID_IOWAIT 375
+#define ERROR_KBD_INVALID_LENGTH 376
+#define ERROR_KBD_INVALID_ECHO_MASK 377
+#define ERROR_KBD_INVALID_INPUT_MASK 378
+#define ERROR_MON_INVALID_PARMS 379
+#define ERROR_MON_INVALID_DEVNAME 380
+#define ERROR_MON_INVALID_HANDLE 381
+#define ERROR_MON_BUFFER_TOO_SMALL 382
+#define ERROR_MON_BUFFER_EMPTY 383
+#define ERROR_MON_DATA_TOO_LARGE 384
+#define ERROR_MOUSE_NO_DEVICE 385
+#define ERROR_MOUSE_INV_HANDLE 386
+#define ERROR_MOUSE_INV_PARMS 387
+#define ERROR_MOUSE_CANT_RESET 388
+#define ERROR_MOUSE_DISPLAY_PARMS 389
+#define ERROR_MOUSE_INV_MODULE 390
+#define ERROR_MOUSE_INV_ENTRY_PT 391
+#define ERROR_MOUSE_INV_MASK 392
+#define NO_ERROR_MOUSE_NO_DATA 393
+#define NO_ERROR_MOUSE_PTR_DRAWN 394
+#define ERROR_INVALID_FREQUENCY 395
+#define ERROR_NLS_NO_COUNTRY_FILE 396
+#define ERROR_NLS_OPEN_FAILED 397
+#define ERROR_NLS_NO_CTRY_CODE 398
+#define ERROR_NO_COUNTRY_OR_CODEPAGE 398
+#define ERROR_NLS_TABLE_TRUNCATED 399
+#define ERROR_NLS_BAD_TYPE 400
+#define ERROR_NLS_TYPE_NOT_FOUND 401
+#define ERROR_VIO_SMG_ONLY 402
+#define ERROR_VIO_INVALID_ASCIIZ 403
+#define ERROR_VIO_DEREGISTER 404
+#define ERROR_VIO_NO_POPUP 405
+#define ERROR_VIO_EXISTING_POPUP 406
+#define ERROR_KBD_SMG_ONLY 407
+#define ERROR_KBD_INVALID_ASCIIZ 408
+#define ERROR_KBD_INVALID_MASK 409
+#define ERROR_KBD_REGISTER 410
+#define ERROR_KBD_DEREGISTER 411
+#define ERROR_MOUSE_SMG_ONLY 412
+#define ERROR_MOUSE_INVALID_ASCIIZ 413
+#define ERROR_MOUSE_INVALID_MASK 414
+#define ERROR_MOUSE_REGISTER 415
+#define ERROR_MOUSE_DEREGISTER 416
+#define ERROR_SMG_BAD_ACTION 417
+#define ERROR_SMG_INVALID_CALL 418
+#define ERROR_SCS_SG_NOTFOUND 419
+#define ERROR_SCS_NOT_SHELL 420
+#define ERROR_VIO_INVALID_PARMS 421
+#define ERROR_VIO_FUNCTION_OWNED 422
+#define ERROR_VIO_RETURN 423
+#define ERROR_SCS_INVALID_FUNCTION 424
+#define ERROR_SCS_NOT_SESSION_MGR 425
+#define ERROR_VIO_REGISTER 426
+#define ERROR_VIO_NO_MODE_THREAD 427
+#define ERROR_VIO_NO_SAVE_RESTORE_THD 428
+#define ERROR_VIO_IN_BG 429
+#define ERROR_VIO_ILLEGAL_DURING_POPUP 430
+#define ERROR_SMG_NOT_BASESHELL 431
+#define ERROR_SMG_BAD_STATUSREQ 432
+#define ERROR_QUE_INVALID_WAIT 433
+#define ERROR_VIO_LOCK 434
+#define ERROR_MOUSE_INVALID_IOWAIT 435
+#define ERROR_VIO_INVALID_HANDLE 436
+#define ERROR_VIO_ILLEGAL_DURING_LOCK 437
+#define ERROR_VIO_INVALID_LENGTH 438
+#define ERROR_KBD_INVALID_HANDLE 439
+#define ERROR_KBD_NO_MORE_HANDLE 440
+#define ERROR_KBD_CANNOT_CREATE_KCB 441
+#define ERROR_KBD_CODEPAGE_LOAD_INCOMPL 442
+#define ERROR_KBD_INVALID_CODEPAGE_ID 443
+#define ERROR_KBD_NO_CODEPAGE_SUPPORT 444
+#define ERROR_KBD_FOCUS_REQUIRED 445
+#define ERROR_KBD_FOCUS_ALREADY_ACTIVE 446
+#define ERROR_KBD_KEYBOARD_BUSY 447
+#define ERROR_KBD_INVALID_CODEPAGE 448
+#define ERROR_KBD_UNABLE_TO_FOCUS 449
+#define ERROR_SMG_SESSION_NON_SELECT 450
+#define ERROR_SMG_SESSION_NOT_FOREGRND 451
+#define ERROR_SMG_SESSION_NOT_PARENT 452
+#define ERROR_SMG_INVALID_START_MODE 453
+#define ERROR_SMG_INVALID_RELATED_OPT 454
+#define ERROR_SMG_INVALID_BOND_OPTION 455
+#define ERROR_SMG_INVALID_SELECT_OPT 456
+#define ERROR_SMG_START_IN_BACKGROUND 457
+#define ERROR_SMG_INVALID_STOP_OPTION 458
+#define ERROR_SMG_BAD_RESERVE 459
+#define ERROR_SMG_PROCESS_NOT_PARENT 460
+#define ERROR_SMG_INVALID_DATA_LENGTH 461
+#define ERROR_SMG_NOT_BOUND 462
+#define ERROR_SMG_RETRY_SUB_ALLOC 463
+#define ERROR_KBD_DETACHED 464
+#define ERROR_VIO_DETACHED 465
+#define ERROR_MOU_DETACHED 466
+#define ERROR_VIO_FONT 467
+#define ERROR_VIO_USER_FONT 468
+#define ERROR_VIO_BAD_CP 469
+#define ERROR_VIO_NO_CP 470
+#define ERROR_VIO_NA_CP 471
+#define ERROR_INVALID_CODE_PAGE 472
+#define ERROR_CPLIST_TOO_SMALL 473
+#define ERROR_CP_NOT_MOVED 474
+#define ERROR_MODE_SWITCH_INIT 475
+#define ERROR_CODE_PAGE_NOT_FOUND 476
+#define ERROR_UNEXPECTED_SLOT_RETURNED 477
+#define ERROR_SMG_INVALID_TRACE_OPTION 478
+#define ERROR_VIO_INTERNAL_RESOURCE 479
+#define ERROR_VIO_SHELL_INIT 480
+#define ERROR_SMG_NO_HARD_ERRORS 481
+#define ERROR_CP_SWITCH_INCOMPLETE 482
+#define ERROR_VIO_TRANSPARENT_POPUP 483
+#define ERROR_CRITSEC_OVERFLOW 484
+#define ERROR_CRITSEC_UNDERFLOW 485
+#define ERROR_VIO_BAD_RESERVE 486
+#define ERROR_INVALID_ADDRESS 487
+#define ERROR_ZERO_SELECTORS_REQUESTED 488
+#define ERROR_NOT_ENOUGH_SELECTORS_AVA 489
+#define ERROR_INVALID_SELECTOR 490
+#define ERROR_SMG_INVALID_PROGRAM_TYPE 491
+#define ERROR_SMG_INVALID_PGM_CONTROL 492
+#define ERROR_SMG_INVALID_INHERIT_OPT 493
+#define ERROR_VIO_EXTENDED_SG 494
+#define ERROR_VIO_NOT_PRES_MGR_SG 495
+#define ERROR_VIO_SHIELD_OWNED 496
+#define ERROR_VIO_NO_MORE_HANDLES 497
+#define ERROR_VIO_SEE_ERROR_LOG 498
+#define ERROR_VIO_ASSOCIATED_DC 499
+#define ERROR_KBD_NO_CONSOLE 500
+#define ERROR_MOUSE_NO_CONSOLE 501
+#define ERROR_MOUSE_INVALID_HANDLE 502
+#define ERROR_SMG_INVALID_DEBUG_PARMS 503
+#define ERROR_KBD_EXTENDED_SG 504
+#define ERROR_MOU_EXTENDED_SG 505
+#define ERROR_SMG_INVALID_ICON_FILE 506
+
+
+#define ERROR_USER_DEFINED_BASE 0xFF00
+
+#define ERROR_I24_WRITE_PROTECT 0
+#define ERROR_I24_BAD_UNIT 1
+#define ERROR_I24_NOT_READY 2
+#define ERROR_I24_BAD_COMMAND 3
+#define ERROR_I24_CRC 4
+#define ERROR_I24_BAD_LENGTH 5
+#define ERROR_I24_SEEK 6
+#define ERROR_I24_NOT_DOS_DISK 7
+#define ERROR_I24_SECTOR_NOT_FOUND 8
+#define ERROR_I24_OUT_OF_PAPER 9
+#define ERROR_I24_WRITE_FAULT 10
+#define ERROR_I24_READ_FAULT 11
+#define ERROR_I24_GEN_FAILURE 12
+#define ERROR_I24_DISK_CHANGE 13
+#define ERROR_I24_WRONG_DISK 15
+#define ERROR_I24_UNCERTAIN_MEDIA 16
+#define ERROR_I24_CHAR_CALL_INTERRUPTED 17
+#define ERROR_I24_NO_MONITOR_SUPPORT 18
+#define ERROR_I24_INVALID_PARAMETER 19
+#define ERROR_I24_DEVICE_IN_USE 20
+
+#define ALLOWED_FAIL 0x0001
+#define ALLOWED_ABORT 0x0002
+#define ALLOWED_RETRY 0x0004
+#define ALLOWED_IGNORE 0x0008
+#define ALLOWED_ACKNOWLEDGE 0x0010
+#define ALLOWED_DISPATCH 0x8000
+
+#define I24_OPERATION 0x01
+#define I24_AREA 0x06
+#define I24_CLASS 0x80
+
+/* Values for error CLASS */
+#define ERRCLASS_OUTRES 1 /* Out of Resource */
+#define ERRCLASS_TEMPSIT 2 /* Temporary Situation */
+#define ERRCLASS_AUTH 3 /* Permission problem */
+#define ERRCLASS_INTRN 4 /* Internal System Error */
+#define ERRCLASS_HRDFAIL 5 /* Hardware Failure */
+#define ERRCLASS_SYSFAIL 6 /* System Failure */
+#define ERRCLASS_APPERR 7 /* Application Error */
+#define ERRCLASS_NOTFND 8 /* Not Found */
+#define ERRCLASS_BADFMT 9 /* Bad Format */
+#define ERRCLASS_LOCKED 10 /* Locked */
+#define ERRCLASS_MEDIA 11 /* Media Failure */
+#define ERRCLASS_ALREADY 12 /* Collision with Existing Item */
+#define ERRCLASS_UNK 13 /* Unknown/other */
+#define ERRCLASS_CANT 14
+#define ERRCLASS_TIME 15
+
+/* Values for error ACTION */
+#define ERRACT_RETRY 1 /* Retry */
+#define ERRACT_DLYRET 2 /* Delay Retry, retry after pause */
+#define ERRACT_USER 3 /* Ask user to regive information */
+#define ERRACT_ABORT 4 /* abort with clean up */
+#define ERRACT_PANIC 5 /* abort immediately */
+#define ERRACT_IGNORE 6 /* ignore */
+#define ERRACT_INTRET 7 /* Retry after User Intervention */
+
+/* Values for error LOCUS */
+#define ERRLOC_UNK 1 /* No appropriate value */
+#define ERRLOC_DISK 2 /* Random Access Mass Storage */
+#define ERRLOC_NET 3 /* Network */
+#define ERRLOC_SERDEV 4 /* Serial Device */
+#define ERRLOC_MEM 5 /* Memory */
+
+/* Abnormal termination codes */
+#define TC_NORMAL 0
+#define TC_HARDERR 1
+#define TC_GP_TRAP 2
+#define TC_SIGNAL 3
+
+#define ERROR_SWAPPER_NOT_ACTIVE 32768
+#define ERROR_INVALID_SWAPID 32769
+#define ERROR_IOERR_SWAP_FILE 32770
+#define ERROR_SWAP_TABLE_FULL 32771
+#define ERROR_SWAP_FILE_FULL 32772
+#define ERROR_CANT_INIT_SWAPPER 32773
+#define ERROR_SWAPPER_ALREADY_INIT 32774
+#define ERROR_PMM_INSUFFICIENT_MEMORY 32775
+#define ERROR_PMM_INVALID_FLAGS 32776
+#define ERROR_PMM_INVALID_ADDRESS 32777
+#define ERROR_PMM_LOCK_FAILED 32778
+#define ERROR_PMM_UNLOCK_FAILED 32779
+#define ERROR_PMM_MOVE_INCOMPLETE 32780
+#define ERROR_UCOM_DRIVE_RENAMED 32781
+#define ERROR_UCOM_FILENAME_TRUNCATED 32782
+#define ERROR_UCOM_BUFFER_LENGTH 32783
+#define ERROR_MON_CHAIN_HANDLE 32784
+#define ERROR_MON_NOT_REGISTERED 32785
+#define ERROR_SMG_ALREADY_TOP 32786
+#define ERROR_PMM_ARENA_MODIFIED 32787
+#define ERROR_SMG_PRINTER_OPEN 32788
+#define ERROR_PMM_SET_FLAGS_FAILED 32789
+#define ERROR_INVALID_DOS_DD 32790
+#define ERROR_CPSIO_CODE_PAGE_INVALID 65026
+#define ERROR_CPSIO_NO_SPOOLER 65027
+#define ERROR_CPSIO_FONT_ID_INVALID 65028
+#define ERROR_CPSIO_INTERNAL_ERROR 65033
+#define ERROR_CPSIO_INVALID_PTR_NAME 65034
+#define ERROR_CPSIO_NOT_ACTIVE 65037
+#define ERROR_CPSIO_PID_FULL 65039
+#define ERROR_CPSIO_PID_NOT_FOUND 65040
+#define ERROR_CPSIO_READ_CTL_SEQ 65043
+#define ERROR_CPSIO_READ_FNT_DEF 65045
+#define ERROR_CPSIO_WRITE_ERROR 65047
+#define ERROR_CPSIO_WRITE_FULL_ERROR 65048
+#define ERROR_CPSIO_WRITE_HANDLE_BAD 65049
+#define ERROR_CPSIO_SWIT_LOAD 65074
+#define ERROR_CPSIO_INV_COMMAND 65077
+#define ERROR_CPSIO_NO_FONT_SWIT 65078
+
+#endif /* INCL_DOSERRORS */
diff --git a/private/oleauto/tools/win16/os2/inc/bsesub.h b/private/oleauto/tools/win16/os2/inc/bsesub.h
new file mode 100644
index 000000000..2b1f91dfd
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/bsesub.h
@@ -0,0 +1,565 @@
+/*static char *SCCSID = "@(#)bsesub.h 13.1 91/02/12";*/
+/***************************************************************************\
+*
+* Module Name: BSESUB.H
+*
+* OS/2 Base Include File
+*
+* Copyright (c) International Business Machines Corporation 1987
+* Copyright (c) Microsoft Corporation 1987
+*
+*****************************************************************************
+*
+* Subcomponents marked with "+" are partially included by default
+* #define: To include:
+*
+* INCL_KBD KBD
+* INCL_VIO VIO
+* INCL_MOU MOU
+\***************************************************************************/
+
+#ifdef INCL_SUB
+
+#define INCL_KBD
+#define INCL_VIO
+#define INCL_MOU
+
+#endif /* INCL_SUB */
+
+#ifdef INCL_KBD
+
+typedef SHANDLE HKBD;
+typedef HKBD far * PHKBD;
+
+USHORT APIENTRY KbdRegister (PSZ pszModName, PSZ pszEntryPt, ULONG FunMask);
+
+#define KR_KBDCHARIN 0x00000001L
+#define KR_KBDPEEK 0x00000002L
+#define KR_KBDFLUSHBUFFER 0x00000004L
+#define KR_KBDGETSTATUS 0x00000008L
+#define KR_KBDSETSTATUS 0x00000010L
+#define KR_KBDSTRINGIN 0x00000020L
+#define KR_KBDOPEN 0x00000040L
+#define KR_KBDCLOSE 0x00000080L
+#define KR_KBDGETFOCUS 0x00000100L
+#define KR_KBDFREEFOCUS 0x00000200L
+#define KR_KBDGETCP 0x00000400L
+#define KR_KBDSETCP 0x00000800L
+#define KR_KBDXLATE 0x00001000L
+#define KR_KBDSETCUSTXT 0x00002000L
+
+#define IO_WAIT 0
+#define IO_NOWAIT 1
+
+USHORT APIENTRY KbdDeRegister (void);
+
+/* KBDKEYINFO structure, for KbdCharIn and KbdPeek */
+
+typedef struct _KBDKEYINFO { /* kbci */
+ UCHAR chChar;
+ UCHAR chScan;
+ UCHAR fbStatus;
+ UCHAR bNlsShift;
+ USHORT fsState;
+ ULONG time;
+ }KBDKEYINFO;
+typedef KBDKEYINFO far *PKBDKEYINFO;
+
+USHORT APIENTRY KbdCharIn (PKBDKEYINFO pkbci, USHORT fWait, HKBD hkbd);
+USHORT APIENTRY KbdPeek (PKBDKEYINFO pkbci, HKBD hkbd);
+
+/* structure for KbdStringIn() */
+
+typedef struct _STRINGINBUF { /* kbsi */
+ USHORT cb;
+ USHORT cchIn;
+ } STRINGINBUF;
+typedef STRINGINBUF far *PSTRINGINBUF;
+
+USHORT APIENTRY KbdStringIn (PCH pch, PSTRINGINBUF pchIn, USHORT fsWait,
+ HKBD hkbd);
+
+USHORT APIENTRY KbdFlushBuffer (HKBD hkbd);
+
+/* KBDINFO structure, for KbdSet/GetStatus */
+typedef struct _KBDINFO { /* kbst */
+ USHORT cb;
+ USHORT fsMask;
+ USHORT chTurnAround;
+ USHORT fsInterim;
+ USHORT fsState;
+ }KBDINFO;
+typedef KBDINFO far *PKBDINFO;
+
+USHORT APIENTRY KbdSetStatus (PKBDINFO pkbdinfo, HKBD hkbd);
+USHORT APIENTRY KbdGetStatus (PKBDINFO pkbdinfo, HKBD hdbd);
+
+USHORT APIENTRY KbdSetCp (USHORT usReserved, USHORT pidCP, HKBD hdbd);
+USHORT APIENTRY KbdGetCp (ULONG ulReserved, PUSHORT pidCP, HKBD hkbd);
+
+USHORT APIENTRY KbdOpen (PHKBD phkbd);
+USHORT APIENTRY KbdClose (HKBD hkbd);
+
+USHORT APIENTRY KbdGetFocus (USHORT fWait, HKBD hkbd);
+USHORT APIENTRY KbdFreeFocus (HKBD hkbd);
+
+USHORT APIENTRY KbdSynch (USHORT fsWait);
+
+USHORT APIENTRY KbdSetFgnd(VOID);
+
+/* structure for KbdGetHWID() */
+typedef struct _KBDHWID { /* kbhw */
+ USHORT cb;
+ USHORT idKbd;
+ USHORT usReserved1;
+ USHORT usReserved2;
+ } KBDHWID;
+typedef KBDHWID far *PKBDHWID;
+
+USHORT APIENTRY KbdGetHWID (PKBDHWID pkbdhwid, HKBD hkbd);
+
+/* structure for KbdXlate() */
+typedef struct _KBDTRANS { /* kbxl */
+ UCHAR chChar;
+ UCHAR chScan;
+ UCHAR fbStatus;
+ UCHAR bNlsShift;
+ USHORT fsState;
+ ULONG time;
+ USHORT fsDD;
+ USHORT fsXlate;
+ USHORT fsShift;
+ USHORT sZero;
+ } KBDTRANS;
+typedef KBDTRANS far *PKBDTRANS;
+
+USHORT APIENTRY KbdXlate (PKBDTRANS pkbdtrans, HKBD hkbd);
+USHORT APIENTRY KbdSetCustXt (PUSHORT usCodePage, HKBD hkbd);
+
+#endif /* INCL_KBD */
+
+#ifdef INCL_VIO
+
+typedef SHANDLE HVIO;
+typedef HVIO far * PHVIO;
+
+USHORT APIENTRY VioRegister (PSZ pszModName, PSZ pszEntryName, ULONG flFun1,
+ ULONG flFun2);
+
+/* first parameter registration constants */
+#define VR_VIOGETCURPOS 0x00000001L
+#define VR_VIOGETCURTYPE 0x00000002L
+#define VR_VIOGETMODE 0x00000004L
+#define VR_VIOGETBUF 0x00000008L
+#define VR_VIOGETPHYSBUF 0x00000010L
+#define VR_VIOSETCURPOS 0x00000020L
+#define VR_VIOSETCURTYPE 0x00000040L
+#define VR_VIOSETMODE 0x00000080L
+#define VR_VIOSHOWBUF 0x00000100L
+#define VR_VIOREADCHARSTR 0x00000200L
+#define VR_VIOREADCELLSTR 0x00000400L
+#define VR_VIOWRTNCHAR 0x00000800L
+#define VR_VIOWRTNATTR 0x00001000L
+#define VR_VIOWRTNCELL 0x00002000L
+#define VR_VIOWRTTTY 0x00004000L
+#define VR_VIOWRTCHARSTR 0x00008000L
+
+#define VR_VIOWRTCHARSTRATT 0x00010000L
+#define VR_VIOWRTCELLSTR 0x00020000L
+#define VR_VIOSCROLLUP 0x00040000L
+#define VR_VIOSCROLLDN 0x00080000L
+#define VR_VIOSCROLLLF 0x00100000L
+#define VR_VIOSCROLLRT 0x00200000L
+#define VR_VIOSETANSI 0x00400000L
+#define VR_VIOGETANSI 0x00800000L
+#define VR_VIOPRTSC 0x01000000L
+#define VR_VIOSCRLOCK 0x02000000L
+#define VR_VIOSCRUNLOCK 0x04000000L
+#define VR_VIOSAVREDRAWWAIT 0x08000000L
+#define VR_VIOSAVREDRAWUNDO 0x10000000L
+#define VR_VIOPOPUP 0x20000000L
+#define VR_VIOENDPOPUP 0x40000000L
+#define VR_VIOPRTSCTOGGLE 0x80000000L
+
+/* second parameter registration constants */
+#define VR_VIOMODEWAIT 0x00000001L
+#define VR_VIOMODEUNDO 0x00000002L
+#define VR_VIOGETFONT 0x00000004L
+#define VR_VIOGETCONFIG 0x00000008L
+#define VR_VIOSETCP 0x00000010L
+#define VR_VIOGETCP 0x00000020L
+#define VR_VIOSETFONT 0x00000040L
+#define VR_VIOGETSTATE 0x00000080L
+#define VR_VIOSETSTATE 0x00000100L
+
+USHORT APIENTRY VioDeRegister (void);
+
+USHORT APIENTRY VioGetBuf (PULONG pLVB, PUSHORT pcbLVB, HVIO hvio);
+
+USHORT APIENTRY VioGetCurPos (PUSHORT pusRow, PUSHORT pusColumn, HVIO hvio);
+USHORT APIENTRY VioSetCurPos (USHORT usRow, USHORT usColumn, HVIO hvio);
+
+/* structure for VioSet/GetCurType() */
+typedef struct _VIOCURSORINFO { /* vioci */
+ USHORT yStart;
+ USHORT cEnd;
+ USHORT cx;
+ USHORT attr;
+ } VIOCURSORINFO;
+typedef VIOCURSORINFO FAR *PVIOCURSORINFO;
+
+USHORT APIENTRY VioGetCurType (PVIOCURSORINFO pvioCursorInfo, HVIO hvio);
+USHORT APIENTRY VioSetCurType (PVIOCURSORINFO pvioCursorInfo, HVIO hvio);
+
+/* structure for VioSet/GetMode() */
+typedef struct _VIOMODEINFO { /* viomi */
+ USHORT cb;
+ UCHAR fbType;
+ UCHAR color;
+ USHORT col;
+ USHORT row;
+ USHORT hres;
+ USHORT vres;
+ UCHAR fmt_ID;
+ UCHAR attrib;
+ ULONG buf_addr;
+ ULONG buf_length;
+ ULONG full_length;
+ ULONG partial_length;
+ PCH ext_data_addr;
+ } VIOMODEINFO;
+typedef VIOMODEINFO FAR *PVIOMODEINFO;
+
+#define VGMT_OTHER 0x01
+#define VGMT_GRAPHICS 0x02
+#define VGMT_DISABLEBURST 0x04
+
+USHORT APIENTRY VioGetMode (PVIOMODEINFO pvioModeInfo, HVIO hvio);
+USHORT APIENTRY VioSetMode (PVIOMODEINFO pvioModeInfo, HVIO hvio);
+
+/* structure for VioGetPhysBuf() */
+
+typedef struct _VIOPHYSBUF { /* viopb */
+ PBYTE pBuf;
+ ULONG cb;
+ SEL asel[1];
+ } VIOPHYSBUF;
+typedef VIOPHYSBUF far *PVIOPHYSBUF;
+
+USHORT APIENTRY VioGetPhysBuf (PVIOPHYSBUF pvioPhysBuf, USHORT usReserved);
+
+USHORT APIENTRY VioReadCellStr (PCH pchCellStr, PUSHORT pcb, USHORT usRow,
+ USHORT usColumn, HVIO hvio);
+USHORT APIENTRY VioReadCharStr (PCH pchCellStr, PUSHORT pcb, USHORT usRow,
+ USHORT usColumn, HVIO hvio);
+USHORT APIENTRY VioWrtCellStr (PCH pchCellStr, USHORT cb, USHORT usRow,
+ USHORT usColumn, HVIO hvio);
+USHORT APIENTRY VioWrtCharStr (PCH pchStr, USHORT cb, USHORT usRow,
+ USHORT usColumn, HVIO hvio);
+
+USHORT APIENTRY VioScrollDn (USHORT usTopRow, USHORT usLeftCol,
+ USHORT usBotRow, USHORT usRightCol,
+ USHORT cbLines, PBYTE pCell, HVIO hvio);
+USHORT APIENTRY VioScrollUp (USHORT usTopRow, USHORT usLeftCol,
+ USHORT usBotRow, USHORT usRightCol,
+ USHORT cbLines, PBYTE pCell, HVIO hvio);
+USHORT APIENTRY VioScrollLf (USHORT usTopRow, USHORT usLeftCol,
+ USHORT usBotRow, USHORT usRightCol,
+ USHORT cbCol, PBYTE pCell, HVIO hvio);
+USHORT APIENTRY VioScrollRt (USHORT usTopRow, USHORT usLeftCol,
+ USHORT usBotRow, USHORT usRightCol,
+ USHORT cbCol, PBYTE pCell, HVIO hvio);
+
+USHORT APIENTRY VioWrtNAttr (PBYTE pAttr, USHORT cb, USHORT usRow,
+ USHORT usColumn, HVIO hvio);
+USHORT APIENTRY VioWrtNCell (PBYTE pCell, USHORT cb, USHORT usRow,
+ USHORT usColumn, HVIO hvio);
+USHORT APIENTRY VioWrtNChar (PCH pchChar, USHORT cb, USHORT usRow,
+ USHORT usColumn, HVIO hvio);
+USHORT APIENTRY VioWrtTTY (PCH pch, USHORT cb, HVIO hvio);
+USHORT APIENTRY VioWrtCharStrAtt (PCH pch, USHORT cb, USHORT usRow,
+ USHORT usColumn, PBYTE pAttr, HVIO hvio);
+
+USHORT APIENTRY VioShowBuf (USHORT offLVB, USHORT cb, HVIO hvio);
+
+
+#define ANSI_ON 1
+#define ANSI_OFF 0
+
+USHORT APIENTRY VioSetAnsi (USHORT fAnsi, HVIO hvio);
+USHORT APIENTRY VioGetAnsi (PUSHORT pfAnsi, HVIO hvio);
+
+USHORT APIENTRY VioPrtSc (HVIO hvio);
+USHORT APIENTRY VioPrtScToggle (HVIO hvio);
+
+#define VSRWI_SAVEANDREDRAW 0
+#define VSRWI_REDRAW 1
+
+#define VSRWN_SAVE 0
+#define VSRWN_REDRAW 1
+
+#define UNDOI_GETOWNER 0
+#define UNDOI_RELEASEOWNER 1
+
+#define UNDOK_ERRORCODE 0
+#define UNDOK_TERMINATE 1
+
+USHORT APIENTRY VioRedrawSize (PULONG pcbRedraw);
+USHORT APIENTRY VioSavRedrawWait (USHORT usRedrawInd, PUSHORT pNotifyType,
+ USHORT usReserved);
+USHORT APIENTRY VioSavRedrawUndo (USHORT usOwnerInd, USHORT usKillInd,
+ USHORT usReserved);
+
+#define VMWR_POPUP 0
+#define VMWN_POPUP 0
+
+USHORT APIENTRY VioModeWait (USHORT usReqType, PUSHORT pNotifyType,
+ USHORT usReserved);
+USHORT APIENTRY VioModeUndo (USHORT usOwnerInd, USHORT usKillInd,
+ USHORT usReserved);
+
+#define LOCKIO_NOWAIT 0
+#define LOCKIO_WAIT 1
+
+#define LOCK_SUCCESS 0
+#define LOCK_FAIL 1
+
+USHORT APIENTRY VioScrLock (USHORT fWait, PUCHAR pfNotLocked, HVIO hvio);
+USHORT APIENTRY VioScrUnLock (HVIO hvio);
+
+#define VP_NOWAIT 0x0000
+#define VP_WAIT 0x0001
+#define VP_OPAQUE 0x0000
+#define VP_TRANSPARENT 0x0002
+
+USHORT APIENTRY VioPopUp (PUSHORT pfWait, HVIO hvio);
+USHORT APIENTRY VioEndPopUp (HVIO hvio);
+
+/* structure for VioGetConfig() */
+
+typedef struct _VIOCONFIGINFO { /* vioin */
+ USHORT cb;
+ USHORT adapter;
+ USHORT display;
+ ULONG cbMemory;
+ USHORT Configuration;
+ USHORT VDHVersion;
+ USHORT Flags;
+ ULONG HWBufferSize;
+ ULONG FullSaveSize;
+ ULONG PartSaveSize;
+ USHORT EMAdaptersOFF;
+ USHORT EMDisplaysOFF;
+ } VIOCONFIGINFO;
+typedef VIOCONFIGINFO far *PVIOCONFIGINFO;
+
+USHORT APIENTRY VioGetConfig (USHORT usConfigId, PVIOCONFIGINFO pvioin,
+ HVIO hvio);
+
+/* structure for VioGet/SetFont() */
+typedef struct _VIOFONTINFO { /* viofi */
+ USHORT cb;
+ USHORT type;
+ USHORT cxCell;
+ USHORT cyCell;
+ PVOID pbData;
+ USHORT cbData;
+ } VIOFONTINFO;
+typedef VIOFONTINFO far *PVIOFONTINFO;
+
+#define VGFI_GETCURFONT 0
+#define VGFI_GETROMFONT 1
+
+USHORT APIENTRY VioGetFont (PVIOFONTINFO pviofi, HVIO hvio);
+USHORT APIENTRY VioSetFont (PVIOFONTINFO pviofi, HVIO hvio);
+
+USHORT APIENTRY VioGetCp (USHORT usReserved, PUSHORT pIdCodePage, HVIO hvio);
+USHORT APIENTRY VioSetCp (USHORT usReserved, USHORT idCodePage, HVIO hvio);
+
+typedef struct _VIOPALSTATE { /* viopal */
+ USHORT cb;
+ USHORT type;
+ USHORT iFirst;
+ USHORT acolor[1];
+ }VIOPALSTATE;
+typedef VIOPALSTATE far *PVIOPALSTATE;
+
+typedef struct _VIOOVERSCAN { /* vioos */
+ USHORT cb;
+ USHORT type;
+ USHORT color;
+ }VIOOVERSCAN;
+typedef VIOOVERSCAN far *PVIOOVERSCAN;
+
+typedef struct _VIOINTENSITY { /* vioint */
+ USHORT cb;
+ USHORT type;
+ USHORT fs;
+ }VIOINTENSITY;
+typedef VIOINTENSITY far *PVIOINTENSITY;
+
+typedef struct _VIOCOLORREG { /* viocreg */
+ USHORT cb;
+ USHORT type;
+ USHORT firstcolorreg;
+ USHORT numcolorregs;
+ PCH colorregaddr;
+ }VIOCOLORREG;
+typedef VIOCOLORREG far *PVIOCOLORREG;
+
+typedef struct _VIOSETULINELOC { /* viouline */
+ USHORT cb;
+ USHORT type;
+ USHORT scanline;
+ }VIOSETULINELOC;
+typedef VIOSETULINELOC far *PVIOSETULINELOC;
+
+typedef struct _VIOSETTARGET { /* viosett */
+ USHORT cb;
+ USHORT type;
+ USHORT defaultalgorithm;
+ }VIOSETTARGET;
+typedef VIOSETTARGET far *PVIOSETTARGET;
+
+USHORT APIENTRY VioGetState (PVOID pState, HVIO hvio);
+USHORT APIENTRY VioSetState (PVOID pState, HVIO hvio);
+
+/*** VioCheckCharType - Check character type
+ *
+ * Returns the chracter type
+ *
+ */
+
+USHORT APIENTRY VioCheckCharType(
+ PUSHORT pCharType, /* character type, DBCS 1st, 2nd or SBCS*/
+ USHORT usRow, /* row location */
+ USHORT usColumn, /* column location */
+ HVIO hvio ); /* video handle */
+
+#endif /* INCL_VIO */
+
+#ifdef INCL_MOU
+
+typedef SHANDLE HMOU;
+typedef HMOU far * PHMOU;
+
+USHORT APIENTRY MouRegister (PSZ pszModName, PSZ pszEntryName, ULONG flFuns);
+
+#define MR_MOUGETNUMBUTTONS 0x00000001L
+#define MR_MOUGETNUMMICKEYS 0x00000002L
+#define MR_MOUGETDEVSTATUS 0x00000004L
+#define MR_MOUGETNUMQUEEL 0x00000008L
+#define MR_MOUREADEVENTQUE 0x00000010L
+#define MR_MOUGETSCALEFACT 0x00000020L
+#define MR_MOUGETEVENTMASK 0x00000040L
+#define MR_MOUSETSCALEFACT 0x00000080L
+#define MR_MOUSETEVENTMASK 0x00000100L
+#define MR_MOUOPEN 0x00000800L
+#define MR_MOUCLOSE 0x00001000L
+#define MR_MOUGETPTRSHAPE 0x00002000L
+#define MR_MOUSETPTRSHAPE 0x00004000L
+#define MR_MOUDRAWPTR 0x00008000L
+#define MR_MOUREMOVEPTR 0x00010000L
+#define MR_MOUGETPTRPOS 0x00020000L
+#define MR_MOUSETPTRPOS 0x00040000L
+#define MR_MOUINITREAL 0x00080000L
+#define MR_MOUFLUSHQUE 0x00100000L
+#define MR_MOUSETDEVSTATUS 0x00200000L
+
+USHORT APIENTRY MouDeRegister (void);
+
+USHORT APIENTRY MouFlushQue (HMOU hmou);
+
+#define MHK_BUTTON1 0x0001
+#define MHK_BUTTON2 0x0002
+#define MHK_BUTTON3 0x0004
+
+/* structure for MouGet/SetPtrPos() */
+typedef struct _PTRLOC { /* moupl */
+ USHORT row;
+ USHORT col;
+ } PTRLOC;
+typedef PTRLOC far *PPTRLOC;
+
+USHORT APIENTRY MouGetPtrPos (PPTRLOC pmouLoc, HMOU hmou);
+USHORT APIENTRY MouSetPtrPos (PPTRLOC pmouLoc, HMOU hmou);
+
+/* structure for MouGet/SetPtrShape() */
+typedef struct _PTRSHAPE { /* moups */
+ USHORT cb;
+ USHORT col;
+ USHORT row;
+ USHORT colHot;
+ USHORT rowHot;
+ } PTRSHAPE;
+typedef PTRSHAPE far *PPTRSHAPE;
+
+USHORT APIENTRY MouSetPtrShape (PBYTE pBuf, PPTRSHAPE pmoupsInfo, HMOU hmou);
+USHORT APIENTRY MouGetPtrShape (PBYTE pBuf, PPTRSHAPE pmoupsInfo, HMOU hmou);
+
+USHORT APIENTRY MouGetDevStatus (PUSHORT pfsDevStatus, HMOU hmou);
+
+USHORT APIENTRY MouGetNumButtons (PUSHORT pcButtons, HMOU hmou);
+USHORT APIENTRY MouGetNumMickeys (PUSHORT pcMickeys, HMOU hmou);
+
+/* structure for MouReadEventQue() */
+typedef struct _MOUEVENTINFO { /* mouev */
+ USHORT fs;
+ ULONG time;
+ USHORT row;
+ USHORT col;
+ }MOUEVENTINFO;
+typedef MOUEVENTINFO far *PMOUEVENTINFO;
+
+USHORT APIENTRY MouReadEventQue (PMOUEVENTINFO pmouevEvent, PUSHORT pfWait,
+ HMOU hmou);
+
+/* structure for MouGetNumQueEl() */
+typedef struct _MOUQUEINFO { /* mouqi */
+ USHORT cEvents;
+ USHORT cmaxEvents;
+ } MOUQUEINFO;
+typedef MOUQUEINFO far *PMOUQUEINFO;
+
+USHORT APIENTRY MouGetNumQueEl (PMOUQUEINFO qmouqi, HMOU hmou);
+
+USHORT APIENTRY MouGetEventMask (PUSHORT pfsEvents, HMOU hmou);
+USHORT APIENTRY MouSetEventMask (PUSHORT pfsEvents, HMOU hmou);
+
+/* structure for MouGet/SetScaleFact() */
+typedef struct _SCALEFACT { /* mousc */
+ USHORT rowScale;
+ USHORT colScale;
+ } SCALEFACT;
+typedef SCALEFACT far *PSCALEFACT;
+
+USHORT APIENTRY MouGetScaleFact (PSCALEFACT pmouscFactors, HMOU hmou);
+USHORT APIENTRY MouSetScaleFact (PSCALEFACT pmouscFactors, HMOU hmou);
+
+USHORT APIENTRY MouOpen (PSZ pszDvrName, PHMOU phmou);
+USHORT APIENTRY MouClose (HMOU hmou);
+
+/* structure for MouRemovePtr() */
+typedef struct _NOPTRRECT { /* mourt */
+ USHORT row;
+ USHORT col;
+ USHORT cRow;
+ USHORT cCol;
+ } NOPTRRECT;
+typedef NOPTRRECT far *PNOPTRRECT;
+
+USHORT APIENTRY MouRemovePtr (PNOPTRRECT pmourtRect, HMOU hmou);
+
+USHORT APIENTRY MouDrawPtr (HMOU hmou);
+
+#define MOU_NODRAW 0x0001
+#define MOU_DRAW 0x0000
+#define MOU_MICKEYS 0x0002
+#define MOU_PELS 0x0000
+
+USHORT APIENTRY MouSetDevStatus (PUSHORT pfsDevStatus, HMOU hmou);
+USHORT APIENTRY MouInitReal (PSZ);
+
+USHORT APIENTRY MouSynch(USHORT pszDvrName);
+
+#endif /* INCL_MOU */
diff --git a/private/oleauto/tools/win16/os2/inc/cmacros.inc b/private/oleauto/tools/win16/os2/inc/cmacros.inc
new file mode 100644
index 000000000..b1e219627
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/cmacros.inc
@@ -0,0 +1,1236 @@
+comment $
+cmacros - assembly macros for interfacing to hhls
+(C)Copyright Microsoft Corp. 1984-1988
+$
+.xcref
+.xcref ??_out
+??_out macro t
+ifndef ?QUIET
+%out t
+endif
+endm
+outif macro name,defval,onmsg,offmsg
+ifndef name
+ifb <defval>
+name=0
+else
+name=defval
+endif
+endif
+if name
+name=1
+ifnb <onmsg>
+??_out <! onmsg>
+endif
+else
+ifnb <offmsg>
+??_out <! offmsg>
+endif
+endif
+endm
+.xcref ??error
+??error macro msg
+e r r o r ----- msg
+.err
+endm
+.xcref ASMpass
+.xcref memS,memM,memL,memC,memH,memMOD,sizec,sized
+if1
+ASMpass=1
+ifdef ?SMALL
+memS=1
+endif
+ifdef ?MEDIUM
+memM=1
+endif
+ifdef ?COMPACT
+memC=1
+endif
+ifdef ?LARGE
+memL=1
+endif
+ifdef ?HUGE
+memH=1
+endif
+??_out <cMacros Version 5.20 - Copyright (c) Microsoft Corp. 1984-1988>
+outif memS,0,<Small model>
+outif memM,0,<Medium model>
+outif memL,0,<Large model>
+outif memC,0,<Compact model>
+outif memH,0,<Huge model>
+memMOD= memS + memM + memL + memC + memH
+if memMOD ne 1
+if memMOD eq 0
+memS = 1
+else
+??error <more than 1 memory model selected>
+endif
+endif
+sizec= memM + memL + memH
+sized= memL + memC + (memH*2)
+outif ?DF,0,<No segments or groups will be defined>
+outif ?TF,0,<Epilog sequences assume valid SP>
+outif ?WIN,1,<Windows support>
+if ?WIN eq 1
+outif ?PLM,1,<>
+else
+outif ?PLM,1,<PL/M calling convention>
+endif
+ifndef ?NODATA
+?nodata1=0
+else
+?nodata1=1
+??_out <! NODATA module>
+endif
+ifndef ?CHKSTK
+?chkstk1=0
+else
+?chkstk1=1
+ifdef ?CHKSTKPROC
+??_out <! Private stack checking enabled>
+else
+??_out <! Stack checking enabled>
+endif
+endif
+ifndef DOS5
+?DOS5=0
+else
+?DOS5=1
+??_out <! DOS5 module>
+endif
+ifdef ?PROFILE
+??_out <! Native profiling enabled>
+endif
+else
+ASMpass=2
+endif
+.xcref ?n,?ax,?ah,?al,?bx,?bh
+.xcref ?bl,?cx,?ch,?cl,?dx,?dh
+.xcref ?dl,?si,?di,?es,?ds,?bp
+.xcref ?sp,?ss,?cs
+.xcref ?rsl,?cpd,?argl,?argc,?ba
+.xcref ?acb,???,?po
+.xcref ?pas,?pc
+.xcref uconcat,mpush,mpop
+.xcref ?ri,?pp,?pp1,?al1
+.xcref ?ad,?ap,?atal,?dd,?dd1,?dd2
+.xcref ?pg,?pg1,?aloc,?cs1,?cs2
+.xcref ?DF,?TF,?ff,?PLM,?WIN,?ia,?pu,?adj
+.xcref ?uf,?rp,?nx,?nd,?nodata1,?chkstk1,?DOS5
+.xcref ?wfp,arg,cCall,cProc,assumes,?cs3,?cs2,?cs1
+.xcref defgrp,addseg,createSeg
+.xcref save,outif,errnz,errn$,errnz1
+.xcref ?PLMPrevParm,?gcc
+.xcref ?cCall1,?pcc
+?rsl = 0
+?cpd = 0
+?argl = 0
+?argc = 0
+?ba = 0
+?acb = 0
+??? = 0
+?po = 0
+?pas = 0
+?pc = 0
+?ia = 0
+?pu = 0
+?adj = 0
+?rp = 0
+?uf = 0
+?nd = 0
+?nx = 0
+?wfp = 0
+?ff = 0
+?dd2 = 0
+?cCall1 = 0
+?pcc = 0
+?PLMPrevParm = 0
+.xcref ?casen
+if1
+?casen = 0
+endif
+?n = 0000000000000000b
+?ax = 0000000000000011b
+?ah = 0000000000000001b
+?al = 0000000000000010b
+?bx = 0000000000001100b
+?bh = 0000000000000100b
+?bl = 0000000000001000b
+?cx = 0000000000110000b
+?ch = 0000000000010000b
+?cl = 0000000000100000b
+?dx = 0000000011000000b
+?dh = 0000000001000000b
+?dl = 0000000010000000b
+?si = 0000000100000000b
+?di = 0000001000000000b
+?es = 0000010000000000b
+?ds = 0000100000000000b
+?bp = 0001000000000000b
+?sp = 0010000000000000b
+?ss = 0100000000000000b
+?cs = 1000000000000000b
+.cref
+uconcat macro a,b,c,d,e,f,g
+a&b c&d e&f&g
+endm
+mpush macro r
+irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
+if (r and ?&&x)
+ push x
+endif
+endm
+endm
+mpop macro r
+irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
+if (r and ?&&x)
+ pop x
+endif
+endm
+endm
+save macro r
+?rsl=0
+?ri ?rsl,<r>
+endm
+?ri macro n,r
+irp x,<r>
+ifdef ?&&x
+n=n or ?&&x
+endif
+endm
+endm
+.xcref
+.xcref parmB,parmW,parmD,parmQ,parmT,parmCP,parmDP
+.cref
+parmB macro n
+?pp <n>,<byte>,2,1
+endm
+parmW macro n
+?pp <n>,<word>,2,2
+endm
+parmD macro n
+ife ?PLM
+irp x,<n>
+?pp <&&x>,<dword>,0,4
+?pp <off_&&x>,<word>,2,2
+?pp <seg_&&x>,<word>,2,2
+endm
+else
+irp x,<n>
+?pp <seg_&&x>,<word>,2,2
+?pp <off_&&x>,<word>,2,2
+?pp <&&x>,<dword>,0,4
+endm
+endif
+endm
+parmQ macro n
+?pp <n>,<qword>,8,8
+endm
+parmT macro n
+?pp <n>,<tbyte>,10,10
+endm
+if sizec
+parmCP macro n
+parmD <n>
+endm
+else
+parmCP macro n
+parmW <n>
+endm
+endif
+if sized
+parmDP macro n
+parmD <n>
+endm
+else
+parmDP macro n
+parmW <n>
+endm
+endif
+?pp macro n,t,l,s
+if ?cpd
+.xcref
+irp x,<n>
+.xcref ?t&&x
+?t&&x=s
+ife ?PLM
+?pp1 x,<t>,,,%(?po+?adj)
+?po=?po+l
+else
+?PLMPrevParm=?PLMPrevParm+1
+?po=?po+l
+?pp1 x,<t>,%?po,%?adj,,%?PLMPrevParm,%(?PLMPrevParm-1)
+endif
+endm
+.cref
+else
+??error <parm(s) "&n" declared outside proc def>
+endif
+endm
+?pp1 macro n,t,o,a,b,cpc,ppc
+ife ?PLM
+n equ (t ptr [bp+b])
+else
+.xcref
+.xcref ?PLMParm&cpc
+.cref
+?PLMParm&cpc &macro po
+uconcat <n>,,<equ>,,<(t ptr [bp+>,%(a+po-o),<])>
+?PLMParm&ppc po
+purge ?PLMParm&cpc
+&endm
+endif
+endm
+ifndef ?NOPARMR
+.xcref
+.xcref ?pr,parmR
+.cref
+parmR macro n,r,r2
+?pr n,r,r2,%?rp,%(?ia+2)
+endm
+?pr macro n,r,r2,i,o
+.xcref
+ifnb <r2>
+parmR seg_&n,r
+parmR off_&n,r2
+n equ (dword ptr [bp-o-2])
+.xcref ?t&n
+?t&n=4
+else
+.xcref ?rp&i
+?rp&i=0
+ifdef ?&r
+?rp&i=?&r
+endif
+if ??? or (?cpd eq 0) or (?rp&i eq 0)
+??error <invalid parmR encountered: &n,&r>
+exitm
+endif
+n equ (word ptr [bp-o])
+?t&n=2
+irp x,<bh,ch,dh,bl,cl,dl,ah,al>
+if ?&&x eq ?&r
+n equ (byte ptr [bp-o])
+?t&n=1
+exitm
+endif
+endm
+?ia=?ia+2
+?rp=?rp+1
+endif
+.cref
+endm
+endif
+.xcref
+.xcref localB,localW,localD,localQ,localT,localCP,localDP,localV
+.cref
+localB macro n
+?aloc <n>,<byte ptr>,1,1,0
+endm
+localW macro n
+?aloc <n>,<word ptr>,2,2,1
+endm
+localD macro n
+irp x,<n>
+?aloc <seg_&&x>,<word ptr>,2,2,1
+?aloc <off_&&x>,<word ptr>,2,2,1
+?aloc <&&x>,<dword ptr>,0,4,1
+endm
+endm
+localQ macro n
+?aloc <n>,<qword ptr>,8,8,1
+endm
+localT macro n
+?aloc <n>,<tbyte ptr>,10,10,1
+endm
+if sizec
+localCP macro n
+localD <n>
+endm
+else
+localCP macro n
+localW <n>
+endm
+endif
+if sized
+localDP macro n
+localD <n>
+endm
+else
+localDP macro n
+localW <n>
+endm
+endif
+localV macro n,a
+?aloc <n>,,%(a),0,1
+endm
+?aloc macro n,t,l,s,a
+if ?cpd
+.xcref
+irp x,<n>
+???=???+l
+if a
+???=((??? + 1) and 0fffeh)
+endif
+?al1 x,<t>,%(???+?ia)
+.xcref ?t&&x
+?t&&x=s
+endm
+.cref
+else
+??error <locals "&n" declared outside procedure def>
+endif
+endm
+?al1 macro n,t,o
+n equ (t [bp-o])
+endm
+?gcc macro s,i,cc
+s = i
+ifnb <cc>
+ifidn <cc>,<C>
+s=0
+endif
+ifidn <cc>,<PLM>
+s=1
+endif
+ifidn <cc>,<PASCAL>
+s=1
+endif
+endif
+endm
+ifndef ?NOGLOBAL
+.xcref
+.xcref globalB,globalW,globalD,globalQ,globalT,globalCP,globalDP
+.cref
+globalB macro n,i,s,c
+?ad <n>,1
+?dd n,1,<byte>,<db>,<i>,<s>,<c>
+endm
+globalW macro n,i,s,c
+?ad <n>,2
+?dd n,1,<word>,<dw>,<i>,<s>,<c>
+endm
+globalD macro n,i,s,c
+?ad <n>,4
+?dd n,1,<dword>,<dd>,<i>,<s>,<c>
+off_&n equ n
+seg_&n equ n[2]
+endm
+globalQ macro n,i,s,c
+?ad <n>,8
+?dd n,1,<qword>,<dq>,<i>,<s>,<c>
+endm
+globalT macro n,i,s,c
+?ad <n>,10
+?dd n,1,<tbyte>,<dt>,<i>,<s>,<c>
+endm
+if sizec
+globalCP macro n,i,s,c
+globalD n,<i>,<s>,<c>
+endm
+else
+globalCP macro n,i,s,c
+globalW n,<i>,<s>,<c>
+endm
+endif
+if sized
+globalDP macro n,i,s,c
+globalD n,<i>,<s>,<c>
+endm
+else
+globalDP macro n,i,s,c
+globalW n,<i>,<s>,<c>
+endm
+endif
+endif
+ifndef ?NOSTATIC
+.xcref
+.xcref staticB,staticW,staticD,staticQ,staticT,staticCP,staticDP
+.cref
+staticB macro n,i,s
+?ad <n>,1
+?dd n,0,<byte>,<db>,<i>,<s>,<PLM>
+endm
+staticW macro n,i,s
+?ad <n>,2
+?dd n,0,<word>,<dw>,<i>,<s>,<PLM>
+endm
+staticD macro n,i,s
+?ad <n>,4
+?dd n,0,<dword>,<dd>,<i>,<s>,<PLM>
+endm
+staticQ macro n,i,s
+?ad <n>,8
+?dd n,0,<qword>,<dq>,<i>,<s>,<PLM>
+endm
+staticT macro n,i,s
+?ad <n>,10
+?dd n,0,<tbyte>,<dt>,<i>,<s>,<PLM>
+endm
+if sizec
+staticCP macro n,i,s
+staticD n,<i>,<s>
+endm
+else
+staticCP macro n,i,s
+staticW n,<i>,<s>
+endm
+endif
+if sized
+staticDP macro n,i,s
+staticD n,<i>,<s>
+endm
+else
+staticDP macro n,i,s
+staticW n,<i>,<s>
+endm
+endif
+endif
+?dd macro n,p,t,d,i,s,c
+?gcc ?dd2,%?PLM,<c>
+ife ?dd2
+n label t
+?dd1 _&n,p,<d>,<i>,<s>
+else
+?dd1 n,p,<d>,<i>,<s>
+endif
+endm
+?dd1 macro n,p,d,i,s
+if p
+public n
+endif
+ifb <s>
+n d i
+else
+ifb <i>
+n d s dup (?)
+else
+n d s dup (i)
+endif
+endif
+endm
+ifndef ?NOEXTERN
+.xcref
+.xcref ?ex1,?ex2,externB,externW,externD,externQ,externT
+.xcref externNP,externFP,externP,externCP,externDP,externA
+.cref
+?ex2 = 0
+externA macro n,c
+?ex1 <n>,40h,<abs>,<c>,<>
+endm
+externB macro n,c
+?ex1 <n>,1,<byte>,<c>,<>
+endm
+externW macro n,c
+?ex1 <n>,2,<word>,<c>,<>
+endm
+externD macro n,c
+?ex1 <n>,4,<dword>,<c>,<>
+endm
+externQ macro n,c
+?ex1 <n>,8,<qword>,<c>,<>
+endm
+externT macro n,c
+?ex1 <n>,10,<tbyte>,<c>,<>
+endm
+externNP macro n,c
+?ex1 <n>,2,<near>,<c>,<cc>
+endm
+externFP macro n,c
+?ex1 <n>,4,<far>,<c>,<cc>
+endm
+if sizec
+externP macro n,c
+?ex1 <n>,4,<far>,<c>,<cc>
+endm
+else
+externP macro n,c
+?ex1 <n>,2,<near>,<c>,<cc>
+endm
+endif
+if sizec
+externCP macro n,c
+?ex1 <n>,4,<dword>,<c>,<>
+endm
+else
+externCP macro n,c
+?ex1 <n>,2,<word>,<c>,<>
+endm
+endif
+if sized
+externDP macro n,c
+?ex1 <n>,4,<dword>,<c>,<>
+endm
+else
+externDP macro n,c
+?ex1 <n>,2,<word>,<c>,<>
+endm
+endif
+?ex1 macro n,s,d,c,scv
+?gcc ?ex2,%?PLM,<c>
+irp x,<n>
+.xcref
+.xcref ?t&&x
+.cref
+?t&&x=s
+ife ?ex2
+extrn _&&x:&d
+x equ _&&x
+else
+extrn x:&d
+endif
+ifidn <scv>,<cc>
+.xcref
+.xcref ?CC&&x
+.cref
+?CC&&x=?ex2
+endif
+endm
+endm
+endif
+ifndef ?NOLABEL
+.xcref
+.xcref ?lb1,?lblpu,?lb2
+.xcref labelB,labelW,labelD,labelQ,labelT
+.xcref labelNP,labelFP,labelP,labelCP,labelDP
+.cref
+?lblpu = 0
+?lb2 = 0
+labelB macro n,c
+?lb1 <n>,1,<byte>,<c>
+endm
+labelW macro n,c
+?lb1 <n>,2,<word>,<c>
+endm
+labelD macro n,c
+?lb1 <n>,4,<dword>,<c>
+endm
+labelQ macro n,c
+?lb1 <n>,8,<qword>,<c>
+endm
+labelT macro n,c
+?lb1 <n>,10,<tbyte>,<c>
+endm
+labelNP macro n,c
+?lb1 <n>,2,<near>,<c>
+endm
+labelFP macro n,c
+?lb1 <n>,4,<far>,<c>
+endm
+if sizec
+labelP macro n,c
+?lb1 <n>,4,<far>,<c>
+endm
+else
+labelP macro n,c
+?lb1 <n>,2,<near>,<c>
+endm
+endif
+if sizec
+labelCP macro n,c
+?lb1 <n>,4,<dword>,<c>
+endm
+else
+labelCP macro n,c
+?lb1 <n>,2,<word>,<c>
+endm
+endif
+if sized
+labelDP macro n,c
+?lb1 <n>,4,<dword>,<c>
+endm
+else
+labelDP macro n,c
+?lb1 <n>,2,<word>,<c>
+endm
+endif
+?lb1 macro n,s,d,c
+?gcc ?lb2,%?PLM,<c>
+?lblpu=0
+irp x,<n>
+ifidn <x>,<PUBLIC>
+?lblpu=1
+else
+.xcref
+.xcref ?t&&x
+.cref
+?t&&x=s
+ife ?lb2
+if ?lblpu
+public _&&x
+endif
+_&&x label &d
+x equ _&&x
+else
+if ?lblpu
+public x
+endif
+x label &d
+endif
+endif
+endm
+endm
+endif
+ifndef ?NODEF
+.xcref
+.xcref defB,defW,defD,defQ,defT,defCP,defDP
+.cref
+defB macro n
+?ad <n>,1
+endm
+defW macro n
+?ad <n>,2
+endm
+defD macro n
+?ad <n>,4
+endm
+defQ macro n
+?ad <n>,8
+endm
+defT macro n
+?ad <n>,10
+endm
+if sizec
+defCP macro n
+defD <n>
+endm
+else
+defCP macro n
+defW <n>
+endm
+endif
+if sized
+defDP macro n
+defD <n>
+endm
+else
+defDP macro n
+defW <n>
+endm
+endif
+endif
+?ad macro n,s
+irp x,<n>
+.xcref
+.xcref ?t&&x
+.cref
+?t&&x=s
+endm
+endm
+ifndef ?NOPTR
+.xcref
+.xcref regPtr,farPtr
+.cref
+regPtr macro n,s,o
+farPtr n,s,o
+endm
+farPtr macro n,s,o
+.xcref
+.xcref ?t&n
+.cref
+n &macro
+ push s
+ push o
+&endm
+?t&n=80h
+endm
+endif
+arg macro a
+irp x,<a>
+?argc=?argc+1
+?atal <x>,%?argc
+endm
+endm
+?atal macro n,i
+.xcref
+.xcref ?ali&i
+.cref
+?ali&i &macro
+?ap n
+&endm
+endm
+?ap macro n
+?argl=?argl+2
+ifdef ?t&n
+ife ?t&n-1
+ push word ptr (n)
+exitm
+endif
+ife ?t&n-2
+ push n
+exitm
+endif
+ife ?t&n-4
+ push word ptr (n)[2]
+ push word ptr (n)
+?argl=?argl+2
+exitm
+endif
+ife ?t&n-8
+ push word ptr (n)[6]
+ push word ptr (n)[4]
+ push word ptr (n)[2]
+ push word ptr (n)
+?argl=?argl+6
+exitm
+endif
+if ?t&n and 80h
+n
+?argl=?argl+2
+exitm
+endif
+ife ?t&n
+ push word ptr (n)
+exitm
+endif
+endif
+ push n
+endm
+cCall macro n,a,c
+ifnb <a>
+arg <a>
+endif
+mpush %?rsl
+ifdef ?CC&n
+?cCall1=?CC&n
+else
+?cCall1=?PLM
+endif
+ifnb <c>
+?gcc ?cCall1,%?cCall1,<c>
+endif
+?argl=0
+ife ?cCall1
+?acb=?argc
+else
+?acb=1
+endif
+rept ?argc
+uconcat <?ali>,%?acb
+uconcat <purge>,,<?ali>,%?acb
+ife ?cCall1
+?acb=?acb-1
+else
+?acb=?acb+1
+endif
+endm
+ call n
+if ((?cCall1 eq 0) and (?argl ne 0))
+ add sp,?argl
+endif
+mpop %?rsl
+?rsl=0
+?argc= 0
+?argl= 0
+endm
+cProc macro n,cf,a
+if ?cpd
+?utpe
+endif
+?cpd=1
+???=0
+?argc=0
+?ba=0
+?po=0
+?pu=0
+?ia=0
+?adj=4
+?rp=0
+?uf=0
+?wfp=?WIN
+?ff=0
+?pas=0
+?pcc=?PLM
+ifnb <a>
+?ri ?pas,<a>
+endif
+?pc=sizec
+?nd=?nodata1
+?nx=0
+irp x,<cf>
+ifidn <x>,<FAR>
+?pc=1
+endif
+ifidn <x>,<NEAR>
+?pc=0
+endif
+ifidn <x>,<PUBLIC>
+?pu=1
+endif
+ifidn <x>,<SMALL>
+?uf=1
+endif
+ifidn <x>,<DATA>
+?nd=0
+endif
+ifidn <x>,<NODATA>
+?nd=1
+endif
+ifidn <x>,<ATOMIC>
+?nx=1
+endif
+ifidn <x>,<C>
+?pcc=0
+endif
+ifidn <x>,<PLM>
+?pcc=1
+endif
+ifidn <x>,<PASCAL>
+?pcc=1
+endif
+ifidn <x>,<WIN>
+?wfp=1
+endif
+ifidn <x>,<NONWIN>
+?wfp=0
+endif
+endm
+if ?pcc
+?PLMPrevParm=0
+.xcref
+.xcref ?PLMParm0
+.cref
+?PLMParm0 &macro
+purge ?PLMParm0
+&endm
+endif
+.xcref
+.xcref ?CC&n
+.cref
+?CC&n=?pcc
+if (?nx eq 1) and (?nd eq 0)
+?nx = 0
+??error <ATOMIC specified without NODATA - ATOMIC ignored>
+endif
+if ?pc
+if ?wfp
+ife ?nx
+?ia=2
+?pas = ?pas and (not ?ds)
+endif
+endif
+?adj=?adj+2
+else
+?wfp=0
+endif
+?pas = ?pas and (not (?sp+?cs+?ss))
+if ?uf
+?pas = ?pas and (not (?bp+?si+?di))
+endif
+ife ?pcc
+?pg <_&n>,%?pu,%?pc,%?pas,%?wfp,<n>,%?pcc
+else
+?pg <n>,%?pu,%?pc,%?pas,%?wfp,<n>,%?pcc
+endif
+endm
+?pg macro n,p,c,a,w,nnu,cc
+.xcref
+if ?uf
+if ?nd
+??error <NODATA encountered in &n - user frame ignored>
+?uf=0
+endif
+endif
+.xcref cBegin
+cBegin &macro g
+.xcref
+if cc
+uconcat <?PLMParm>,%?PLMPrevParm,%?po
+endif
+if ?uf
+if ?rp
+??error <parmR encountered in &n - user frame ignored>
+?uf=0
+endif
+endif
+?pg1 <n>,c,a,%?po,w,%?uf,%?nd,%?rp,cc
+?cpd=0
+?argc=0
+?ba=1
+???=(???+1) and 0fffeh
+if p
+public n
+endif
+ife c
+n proc near
+else
+n proc far
+endif
+ife cc
+nnu equ n
+endif
+ifidn <g>,<nogen>
+if ???+?po+a+?rp
+??_out <cBegin - possible invalid use of nogen>
+endif
+else
+if ?uf
+?mf c,%???,%?po
+mpush a
+else
+if w
+ife ?nd
+ mov ax,ds
+ nop
+endif
+ife ?nx
+ife ?DOS5
+ inc bp
+endif
+ push bp
+ mov bp,sp
+ push ds
+else
+if ?ff+???+?po+?rp
+ push bp
+ mov bp,sp
+endif
+endif
+ife ?nd
+ mov ds,ax
+endif
+else
+if ?ff+???+?po+?rp
+ push bp
+ mov bp,sp
+endif
+endif
+if ?rp
+?uf=0
+rept ?rp
+uconcat mpush,,?rp,%?uf
+?uf=?uf+1
+endm
+endif
+if ???
+if ?chkstk1
+ifdef ?CHKSTKPROC
+?CHKSTKPROC %???
+else
+ mov ax,???
+ife cc
+ call _chkstk
+else
+ call chkstk
+endif
+endif
+else
+ sub sp,???
+endif
+endif
+mpush a
+endif
+ifdef ?PROFILE
+if c
+ call StartNMeas
+endif
+endif
+endif
+.cref
+purge cBegin
+&endm
+.xcref ?utpe
+?utpe &macro
+??error <unterminated procedure definition: "&n">
+&endm
+.cref
+endm
+?pg1 macro n,c,a,o,w,f,d,r,cc
+.xcref
+.xcref cEnd
+cEnd &macro g
+.xcref
+?ba=0
+ifidn <g>,<nogen>
+if o+a+r
+??_out <cEnd - possible invalid use of nogen>
+endif
+else
+ifdef ?PROFILE
+if c
+call StopNMeas
+endif
+endif
+mpop a
+if f
+ db 0c3h
+else
+if w
+ife ?nx
+if (?TF eq 0) or (???+?rp)
+ lea sp,-2[bp]
+endif
+ pop ds
+ pop bp
+ife ?DOS5
+ dec bp
+endif
+else
+if (?TF eq 0) or (???+?rp)
+ mov sp,bp
+endif
+if ???+?po+?rp
+ pop bp
+endif
+endif
+else
+if ?ff+???+?po+?rp
+if (?TF eq 0) or (???+?rp)
+ mov sp,bp
+endif
+ pop bp
+endif
+endif
+ife cc
+ ret
+else
+ ret o
+endif
+endif
+endif
+n endp
+.cref
+purge cEnd
+&endm
+.cref
+endm
+assumes macro s,ln
+ifndef ln&_assumes
+assume s:ln
+else
+ln&_assumes s
+endif
+endm
+createSeg macro n,ln,a,co,cl,grp
+ifnb <grp>
+addseg grp,n
+else
+ln&OFFSET equ offset n:
+ln&BASE equ n
+?cs3 <ln>,<n>
+endif
+ifnb <cl>
+n segment a co '&cl'
+else
+n segment a co
+endif
+n ends
+?cs1 <ln>,<n>
+endm
+addseg macro grp,seg
+.xcref
+.xcref grp&_def
+.cref
+ifndef grp&_def
+grp&_def=0
+endif
+if grp&_def ne ASMpass
+.xcref
+.xcref grp&_add
+.cref
+grp&_add &macro s
+grp&_in <seg>,s
+&endm
+.xcref
+.xcref grp&_in
+.cref
+grp&_in &macro sl,s
+ifb <s>
+grp group sl
+else
+grp&_add &macro ns
+grp&_in <sl,s>,ns
+&endm
+endif
+&endm
+grp&_def=ASMpass
+else
+grp&_add seg
+endif
+endm
+defgrp macro grp,ln
+addseg grp
+ifnb <ln>
+irp x,<ln>
+?cs3 <&x>,<grp>
+x&&OFFSET equ offset grp:
+x&&BASE equ grp
+endm
+endif
+endm
+?cs1 macro ln,n
+.xcref
+.xcref ln&_sbegin
+.cref
+ln&_sbegin &macro
+.xcref
+.xcref ?mf
+.cref
+?mf &&macro c,l,p
+if c
+ extrn n&_FARFRAME:near
+ call n&_FARFRAME
+else
+ extrn n&_NEARFRAME:near
+ call n&_NEARFRAME
+endif
+ db l shr 1
+ db p shr 1
+&&endm
+?cs2 <ln>,<n>
+n segment
+&endm
+endm
+?cs2 macro ln,n
+.xcref
+.xcref sEnd
+.cref
+sEnd &macro
+n ends
+purge ?mf
+purge sEnd
+&endm
+endm
+?cs3 macro ln,n
+.xcref
+.xcref ln&_assumes
+.cref
+ln&_assumes &macro s
+assume s:&n
+&endm
+endm
+.xcref
+.xcref sBegin
+.cref
+sBegin macro ln
+ln&_sbegin
+endm
+ife ?DF
+createSeg _TEXT,Code,word,public,CODE
+ife ?nodata1
+createSeg _DATA,Data,word,public,DATA,DGROUP
+defgrp DGROUP,Data
+endif
+if ?chkstk1
+ifndef ?CHKSTKPROC
+externp <chkstk>
+endif
+endif
+endif
+errnz macro x
+if2
+if x
+errnz1 <x>,%(x)
+endif
+endif
+endm
+errnz1 macro x1,x2
+= *errnz* x1 = x2
+.err
+endm
+errn$ macro l,x
+errnz <offset $ - offset l x>
+endm
+ifdef ?PROFILE
+externFP <StartNMeas,StopNMeas>
+endif
diff --git a/private/oleauto/tools/win16/os2/inc/commdlg.h b/private/oleauto/tools/win16/os2/inc/commdlg.h
new file mode 100644
index 000000000..4246cc838
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/commdlg.h
@@ -0,0 +1,286 @@
+
+
+#ifndef COMMDLG_H_INCLUDED
+#define COMMDLG_H_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+ /*---------------------------------------------------------------------------
+ * commdlg.h -- Common dialog definitions. Windows.h must be included first.
+ *---------------------------------------------------------------------------
+ */
+
+typedef struct tagOFN
+ {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HANDLE hInstance;
+ LPSTR lpstrFilter;
+ LPSTR lpstrCustomFilter;
+ DWORD nMaxCustFilter;
+ DWORD nFilterIndex;
+ LPSTR lpstrFile;
+ DWORD nMaxFile;
+ LPSTR lpstrFileTitle;
+ DWORD nMaxFileTitle;
+ LPSTR lpstrInitialDir;
+ LPSTR lpstrTitle;
+ DWORD Flags;
+ WORD nFileOffset;
+ WORD nFileExtension;
+ LPSTR lpstrDefExt;
+ DWORD lCustData;
+ BOOL (FAR PASCAL *lpfnHook)(HWND, unsigned, WORD, LONG);
+ LPSTR lpTemplateName;
+ } OPENFILENAME;
+typedef OPENFILENAME FAR * LPOPENFILENAME;
+
+BOOL FAR PASCAL GetOpenFileName(LPOPENFILENAME);
+BOOL FAR PASCAL GetSaveFileName(LPOPENFILENAME);
+short FAR PASCAL GetFileTitle(LPSTR, LPSTR, WORD);
+
+#define OFN_READONLY 0x00000001
+#define OFN_OVERWRITEPROMPT 0x00000002
+#define OFN_HIDEREADONLY 0x00000004
+#define OFN_NOCHANGEDIR 0x00000008
+#define OFN_SHOWHELP 0x00000010
+#define OFN_ENABLEHOOK 0x00000020
+#define OFN_ENABLETEMPLATE 0x00000040
+#define OFN_ENABLETEMPLATEHANDLE 0x00000080
+#define OFN_NOVALIDATE 0x00000100
+#define OFN_ALLOWMULTISELECT 0x00000200
+#define OFN_EXTENTIONDIFFERENT 0x00000400
+#define OFN_PATHMUSTEXIST 0x00000800
+#define OFN_FILEMUSTEXIST 0x00001000
+#define OFN_CREATEPROMPT 0x00002000
+#define OFN_SHAREAWARE 0x00004000
+#define OFN_NOREADONLYRETURN 0x00008000
+
+/* Return values for the registered message sent to the hook function
+ * when a sharing violation occurs. OFN_SHAREFALLTHROUGH allows the
+ * filename to be accepted, OFN_SHARENOWARN rejects the name but puts
+ * up no warning (returned when the app has already put up a warning
+ * message), and OFN_SHAREWARN puts up the default warning message
+ * for sharing violations.
+ *
+ * Note: Undefined return values map to OFN_SHAREWARN.
+ */
+
+#define OFN_SHAREFALLTHROUGH 2
+#define OFN_SHARENOWARN 1
+#define OFN_SHAREWARN 0
+
+/* Avoids sharing violations. Defined 21 Jan 1991 clarkc */
+#define SHARE_EXIST (OF_EXIST | OF_SHARE_DENY_NONE)
+
+typedef struct
+ {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HWND hInstance;
+ DWORD rgbResult;
+ LPDWORD lpCustColors;
+ DWORD Flags;
+ DWORD lCustData;
+ WORD (FAR PASCAL *lpfnHook)(HWND, unsigned, WORD, LONG);
+ LPSTR lpTemplateName;
+ } CHOOSECOLOR;
+typedef CHOOSECOLOR FAR *LPCHOOSECOLOR;
+
+BOOL FAR PASCAL ChooseColor(LPCHOOSECOLOR);
+
+#define CC_RGBINIT 0x00000001
+#define CC_FULLOPEN 0x00000002
+#define CC_PREVENTFULLOPEN 0x00000004
+#define CC_SHOWHELP 0x00000008
+#define CC_ENABLEHOOK 0x00000010
+#define CC_ENABLETEMPLATE 0x00000020
+#define CC_ENABLETEMPLATEHANDLE 0x00000040
+
+typedef struct
+ {
+ DWORD lStructSize; /* size of this struct 0x20 */
+ HWND hwndOwner; /* handle to owner's window */
+ HANDLE hInstance; /* instance handle of.EXE that
+ * contains cust. dlg. template
+ */
+ DWORD Flags; /* one or more of the FR_?? */
+ LPSTR lpstrFindWhat; /* ptr. to search string */
+ LPSTR lpstrReplaceWith; /* ptr. to replace string */
+ WORD wFindWhatLen; /* size of find buffer */
+ WORD wReplaceWithLen; /* size of replace buffer */
+ DWORD lCustData; /* data passed to hook fn. */
+ BOOL (FAR PASCAL *lpfnHook)(HWND, unsigned, WORD, LONG);
+ /* ptr. to hook fn. or NULL */
+ LPSTR lpTemplateName; /* custom template name */
+ } FINDREPLACE;
+
+typedef FINDREPLACE FAR *LPFINDREPLACE;
+
+#define FR_DOWN 0x00000001
+#define FR_WHOLEWORD 0x00000002
+#define FR_MATCHCASE 0x00000004
+#define FR_FINDNEXT 0x00000008
+#define FR_REPLACE 0x00000010
+#define FR_REPLACEALL 0x00000020
+#define FR_DIALOGTERM 0x00000040
+#define FR_SHOWHELP 0x00000080
+#define FR_ENABLEHOOK 0x00000100
+#define FR_ENABLETEMPLATE 0x00000200
+#define FR_NOUPDOWN 0x00000400
+#define FR_NOMATCHCASE 0x00000800
+#define FR_NOWHOLEWORD 0x00001000
+#define FR_ENABLETEMPLATEHANDLE 0x00002000
+#define FR_HIDEUPDOWN 0x00004000
+#define FR_HIDEMATCHCASE 0x00008000
+#define FR_HIDEWHOLEWORD 0x00010000
+
+HWND FAR PASCAL FindText(LPFINDREPLACE);
+HWND FAR PASCAL ReplaceText(LPFINDREPLACE);
+
+typedef struct
+ {
+ DWORD lStructSize; /* */
+ HWND hwndOwner; /* caller's window handle */
+ HDC hDC; /* printer DC/IC or NULL */
+ LPLOGFONT lpLogFont; /* ptr. to a LOGFONT struct */
+ int iPointSize; /* 10 * size in points of selected font */
+ DWORD Flags; /* enum. type flags */
+ DWORD rgbColors; /* returned text color */
+ DWORD lCustData; /* data passed to hook fn. */
+ BOOL (FAR PASCAL *lpfnHook)(HWND, unsigned, WORD, LONG);
+ /* ptr. to hook function */
+ LPSTR lpTemplateName; /* custom template name */
+ HANDLE hInstance; /* instance handle of.EXE that
+ * contains cust. dlg. template
+ */
+ LPSTR lpszStyle; /* return the style field here
+ * must be LF_FACESIZE or bigger */
+ WORD nFontType; /* same value reported to the EnumFonts
+ * call back with the extra FONTTYPE_
+ * bits added */
+ int nSizeMin; /* minimum pt size allowed & */
+ int nSizeMax; /* max pt size allowed if */
+ /* CF_LIMITSIZE is used */
+ } CHOOSEFONT;
+ typedef CHOOSEFONT FAR *LPCHOOSEFONT;
+
+BOOL FAR PASCAL ChooseFont(LPCHOOSEFONT);
+
+#define CF_SCREENFONTS 0x00000001
+#define CF_PRINTERFONTS 0x00000002
+#define CF_BOTH (CF_SCREENFONTS | CF_PRINTERFONTS)
+#define CF_SHOWHELP 0x00000004L
+#define CF_ENABLEHOOK 0x00000008L
+#define CF_ENABLETEMPLATE 0x00000010L
+#define CF_ENABLETEMPLATEHANDLE 0x00000020L
+#define CF_INITTOLOGFONTSTRUCT 0x00000040L
+#define CF_USESTYLE 0x00000080L
+#define CF_EFFECTS 0x00000100L
+#define CF_APPLY 0x00000200L
+#define CF_ANSIONLY 0x00000400L
+#define CF_NOVECTORFONTS 0x00000800L
+#define CF_NOSIMULATIONS 0x00001000L
+#define CF_LIMITSIZE 0x00002000L
+#define CF_FIXEDPITCHONLY 0x00004000L
+#define CF_WYSIWYG 0x00008000L /* must also have CF_SCREENFONTS & CF_PRINTERFONTS */
+#define CF_FORCEFONTEXIST 0x00010000L
+#define CF_SCALABLEONLY 0x00020000L
+#define CF_TTONLY 0x00040000L
+#define CF_NOFACESEL 0x00080000L
+#define CF_NOSTYLESEL 0x00100000L
+#define CF_NOSIZESEL 0x00200000L
+
+/* these are extra nFontType bits that are added to what is returned to the
+ * EnumFonts callback routine */
+
+#define SIMULATED_FONTTYPE 0x8000
+#define PRINTER_FONTTYPE 0x4000
+#define SCREEN_FONTTYPE 0x2000
+#define BOLD_FONTTYPE 0x0100
+#define ITALIC_FONTTYPE 0x0200
+#define REGULAR_FONTTYPE 0x0400
+
+#define WM_CHOOSEFONT_GETLOGFONT (WM_USER + 1)
+
+
+/* strings used to obtain unique window message for communication
+ * between dialog and caller
+ */
+#define LBSELCHSTRING "commdlg_LBSelChangedNotify"
+#define SHAREVISTRING "commdlg_ShareViolation"
+#define FINDMSGSTRING "commdlg_FindReplace"
+#define HELPMSGSTRING "commdlg_help"
+
+
+typedef struct tagPD
+ {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HANDLE hDevMode;
+ HANDLE hDevNames;
+ HDC hDC;
+ DWORD Flags;
+ WORD nFromPage;
+ WORD nToPage;
+ WORD nMinPage;
+ WORD nMaxPage;
+ WORD nCopies;
+ HANDLE hInstance;
+ DWORD lCustData;
+ int (FAR PASCAL *lpfnPrintHook)(HWND, WORD, WORD, LONG);
+ int (FAR PASCAL *lpfnSetupHook)(HWND, WORD, WORD, LONG);
+ LPSTR lpPrintTemplateName;
+ LPSTR lpSetupTemplateName;
+ HANDLE hPrintTemplate;
+ HANDLE hSetupTemplate;
+ } PRINTDLG;
+typedef PRINTDLG FAR * LPPRINTDLG;
+
+BOOL FAR PASCAL PrintDlg(LPPRINTDLG);
+
+#define PD_ALLPAGES 0x00000000
+#define PD_SELECTION 0x00000001
+#define PD_PAGENUMS 0x00000002
+#define PD_NOSELECTION 0x00000004
+#define PD_NOPAGENUMS 0x00000008
+#define PD_COLLATE 0x00000010
+#define PD_PRINTTOFILE 0x00000020
+#define PD_PRINTSETUP 0x00000040
+#define PD_NOWARNING 0x00000080
+#define PD_RETURNDC 0x00000100
+#define PD_RETURNIC 0x00000200
+#define PD_RETURNDEFAULT 0x00000400
+#define PD_SHOWHELP 0x00000800
+#define PD_ENABLEPRINTHOOK 0x00001000
+#define PD_ENABLESETUPHOOK 0x00002000
+#define PD_ENABLEPRINTTEMPLATE 0x00004000
+#define PD_ENABLESETUPTEMPLATE 0x00008000
+#define PD_ENABLEPRINTTEMPLATEHANDLE 0x00010000
+#define PD_ENABLESETUPTEMPLATEHANDLE 0x00020000
+#define PD_USEDEVMODECOPIES 0x00040000
+#define PD_DISABLEPRINTTOFILE 0x00080000
+#define PD_HIDEPRINTTOFILE 0x00100000
+
+typedef struct tagDEVNAMES
+ {
+ WORD wDriverOffset;
+ WORD wDeviceOffset;
+ WORD wOutputOffset;
+ WORD wDefault;
+ } DEVNAMES;
+typedef DEVNAMES FAR * LPDEVNAMES;
+
+#define DN_DEFAULTPRN 0x0001
+
+
+DWORD FAR PASCAL CommDlgExtendedError(VOID);
+
+#ifdef __cplusplus
+} // extern "C" {
+#endif
+
+#endif // COMMDLG_H_INCLUDED
diff --git a/private/oleauto/tools/win16/os2/inc/conio.h b/private/oleauto/tools/win16/os2/inc/conio.h
new file mode 100644
index 000000000..7c42cd9a4
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/conio.h
@@ -0,0 +1,73 @@
+/***
+*conio.h - console and port I/O declarations
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file contains the function declarations for
+* the MS C V2.03 compatible console and port I/O routines.
+*
+****/
+
+#ifndef _INC_CONIO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+/* function prototypes */
+
+#ifndef _WINDOWS
+char * __cdecl _cgets(char *);
+int __cdecl _cprintf(const char *, ...);
+int __cdecl _cputs(const char *);
+int __cdecl _cscanf(const char *, ...);
+int __cdecl _getch(void);
+int __cdecl _getche(void);
+#endif
+int __cdecl _inp(unsigned);
+unsigned __cdecl _inpw(unsigned);
+#ifndef _WINDOWS
+int __cdecl _kbhit(void);
+#endif
+int __cdecl _outp(unsigned, int);
+unsigned __cdecl _outpw(unsigned, unsigned);
+#ifndef _WINDOWS
+int __cdecl _putch(int);
+int __cdecl _ungetch(int);
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#ifndef _WINDOWS
+char * __cdecl cgets(char *);
+int __cdecl cprintf(const char *, ...);
+int __cdecl cputs(const char *);
+int __cdecl cscanf(const char *, ...);
+int __cdecl getch(void);
+int __cdecl getche(void);
+#endif
+int __cdecl inp(unsigned);
+unsigned __cdecl inpw(unsigned);
+#ifndef _WINDOWS
+int __cdecl kbhit(void);
+#endif
+int __cdecl outp(unsigned, int);
+unsigned __cdecl outpw(unsigned, unsigned);
+#ifndef _WINDOWS
+int __cdecl putch(int);
+int __cdecl ungetch(int);
+#endif
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_CONIO
+#endif /* _INC_CONIO */
diff --git a/private/oleauto/tools/win16/os2/inc/ctype.h b/private/oleauto/tools/win16/os2/inc/ctype.h
new file mode 100644
index 000000000..46749e148
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ctype.h
@@ -0,0 +1,116 @@
+/***
+*ctype.h - character conversion macros and ctype macros
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines macros for character classification/conversion.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_CTYPE
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+/*
+ * This declaration allows the user access to the ctype look-up
+ * array _ctype defined in ctype.obj by simply including ctype.h
+ */
+
+extern unsigned char __near __cdecl _ctype[];
+
+/* set bit masks for the possible character types */
+
+#define _UPPER 0x1 /* upper case letter */
+#define _LOWER 0x2 /* lower case letter */
+#define _DIGIT 0x4 /* digit[0-9] */
+#define _SPACE 0x8 /* tab, carriage return, newline, */
+ /* vertical tab or form feed */
+#define _PUNCT 0x10 /* punctuation character */
+#define _CONTROL 0x20 /* control character */
+#define _BLANK 0x40 /* space char */
+#define _HEX 0x80 /* hexadecimal digit */
+
+/* character classification function prototypes */
+
+#ifndef _CTYPE_DEFINED
+int __cdecl isalpha(int);
+int __cdecl isupper(int);
+int __cdecl islower(int);
+int __cdecl isdigit(int);
+int __cdecl isxdigit(int);
+int __cdecl isspace(int);
+int __cdecl ispunct(int);
+int __cdecl isalnum(int);
+int __cdecl isprint(int);
+int __cdecl isgraph(int);
+int __cdecl iscntrl(int);
+int __cdecl toupper(int);
+int __cdecl tolower(int);
+int __cdecl _tolower(int);
+int __cdecl _toupper(int);
+int __cdecl __isascii(int);
+int __cdecl __toascii(int);
+int __cdecl __iscsymf(int);
+int __cdecl __iscsym(int);
+#define _CTYPE_DEFINED
+#endif
+
+
+/* the character classification macro definitions */
+
+#define isalpha(_c) ( (_ctype+1)[_c] & (_UPPER|_LOWER) )
+#define isupper(_c) ( (_ctype+1)[_c] & _UPPER )
+#define islower(_c) ( (_ctype+1)[_c] & _LOWER )
+#define isdigit(_c) ( (_ctype+1)[_c] & _DIGIT )
+#define isxdigit(_c) ( (_ctype+1)[_c] & _HEX )
+#define isspace(_c) ( (_ctype+1)[_c] & _SPACE )
+#define ispunct(_c) ( (_ctype+1)[_c] & _PUNCT )
+#define isalnum(_c) ( (_ctype+1)[_c] & (_UPPER|_LOWER|_DIGIT) )
+#define isprint(_c) ( (_ctype+1)[_c] & (_BLANK|_PUNCT|_UPPER|_LOWER|_DIGIT) )
+#define isgraph(_c) ( (_ctype+1)[_c] & (_PUNCT|_UPPER|_LOWER|_DIGIT) )
+#define iscntrl(_c) ( (_ctype+1)[_c] & _CONTROL )
+#ifndef __STDC__
+#define toupper(_c) ( (islower(_c)) ? _toupper(_c) : (_c) )
+#define tolower(_c) ( (isupper(_c)) ? _tolower(_c) : (_c) )
+#endif
+#define _tolower(_c) ( (_c)-'A'+'a' )
+#define _toupper(_c) ( (_c)-'a'+'A' )
+#define __isascii(_c) ( (unsigned)(_c) < 0x80 )
+#define __toascii(_c) ( (_c) & 0x7f )
+
+/* extended ctype macros */
+
+#define __iscsymf(_c) (isalpha(_c) || ((_c) == '_'))
+#define __iscsym(_c) (isalnum(_c) || ((_c) == '_'))
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#ifndef _CTYPE_DEFINED
+int __cdecl isascii(int);
+int __cdecl toascii(int);
+int __cdecl iscsymf(int);
+int __cdecl iscsym(int);
+#else
+#define isascii __isascii
+#define toascii __toascii
+#define iscsymf __iscsymf
+#define iscsym __iscsym
+#endif
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_CTYPE
+#endif /* _INC_CTYPE */
diff --git a/private/oleauto/tools/win16/os2/inc/custcntl.h b/private/oleauto/tools/win16/os2/inc/custcntl.h
new file mode 100644
index 000000000..ee0ee0cf9
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/custcntl.h
@@ -0,0 +1,82 @@
+/*
+ * CUSTOM CONTROL LIBRARY - HEADER FILE
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* general size definitions */
+#define CTLTYPES 12 /* number of control types */
+#define CTLDESCR 22 /* size of control menu name */
+#define CTLCLASS 20 /* max size of class name */
+#define CTLTITLE 94 /* max size of control text */
+
+/*
+ * CONTROL STYLE DATA STRUCTURE
+ *
+ * This data structure is used by the class style dialog function
+ * to set and/or reset various control attributes.
+ */
+
+typedef struct {
+ WORD wX; /* x origin of control */
+ WORD wY; /* y origin of control */
+ WORD wCx; /* width of control */
+ WORD wCy; /* height of control */
+ WORD wId; /* control child id */
+ DWORD dwStyle; /* control style */
+ char szClass[CTLCLASS]; /* name of control class */
+ char szTitle[CTLTITLE]; /* control text */
+} CTLSTYLE;
+
+typedef CTLSTYLE *PCTLSTYLE;
+typedef CTLSTYLE FAR *LPCTLSTYLE;
+
+/*
+ * CONTROL DATA STRUCTURE
+ *
+ * This data structure is returned by the control options function
+ * when enquiring about the capabilities of a particular control.
+ * Each control may contain various types (with predefined style
+ * bits) under one general class.
+ *
+ * The width and height fields are used to provide the host
+ * application with a suggested size. The values in these fields
+ * could be either in pixels or in rc coordinates. If it is in pixel,
+ * the most sigificant bit(MSB) is on. If the MSB is off, it is in rc
+ * coordinates.
+ *
+ * The cursor and bitmap handles reference objects which can be
+ * used by the dialog editor in the placement and definition of
+ * new, user-defined control classes. However, dialog editor in win30
+ * does not use these fields.
+ */
+
+typedef struct {
+ WORD wType; /* type style */
+ WORD wWidth; /* suggested width */
+ WORD wHeight; /* suggested height */
+ DWORD dwStyle; /* default style */
+ char szDescr[CTLDESCR]; /* menu name */
+} CTLTYPE;
+
+typedef struct {
+ WORD wVersion; /* control version */
+ WORD wCtlTypes; /* control types */
+ char szClass[CTLCLASS]; /* control class name */
+ char szTitle[CTLTITLE]; /* control title */
+ char szReserved[10]; /* reserved for future use */
+ CTLTYPE Type[CTLTYPES]; /* control type list */
+} CTLINFO;
+
+typedef CTLINFO *PCTLINFO;
+typedef CTLINFO FAR *LPCTLINFO;
+
+/* These two function prototypes are used by dialog editor */
+typedef DWORD (FAR PASCAL *LPFNSTRTOID)( LPSTR );
+typedef WORD (FAR PASCAL *LPFNIDTOSTR)( WORD, LPSTR, WORD );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/dde.h b/private/oleauto/tools/win16/os2/inc/dde.h
new file mode 100644
index 000000000..d8cff9820
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/dde.h
@@ -0,0 +1,118 @@
+/* DDE window messages */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define WM_DDE_FIRST 0x03E0
+#define WM_DDE_INITIATE (WM_DDE_FIRST)
+#define WM_DDE_TERMINATE (WM_DDE_FIRST+1)
+#define WM_DDE_ADVISE (WM_DDE_FIRST+2)
+#define WM_DDE_UNADVISE (WM_DDE_FIRST+3)
+#define WM_DDE_ACK (WM_DDE_FIRST+4)
+#define WM_DDE_DATA (WM_DDE_FIRST+5)
+#define WM_DDE_REQUEST (WM_DDE_FIRST+6)
+#define WM_DDE_POKE (WM_DDE_FIRST+7)
+#define WM_DDE_EXECUTE (WM_DDE_FIRST+8)
+#define WM_DDE_LAST (WM_DDE_FIRST+8)
+
+/*--------------------------------------------------------------------------*/
+/* DDEACK structure */
+/* */
+/* Structure of wStatus (LOWORD(lParam)) in WM_DDE_ACK message */
+/* sent in response to a WM_DDE_DATA, WM_DDE_REQUEST, WM_DDE_POKE, */
+/* WM_DDE_ADVISE, or WM_DDE_UNADVISE message. */
+/* */
+/*--------------------------------------------------------------------------*/
+
+typedef struct {
+ unsigned bAppReturnCode:8,
+ reserved:6,
+ fBusy:1,
+ fAck:1;
+} DDEACK;
+
+/*--------------------------------------------------------------------------*/
+/* DDEADVISE structure */
+/* */
+/* WM_DDE_ADVISE parameter structure for hOptions (LOWORD(lParam)) */
+/* */
+/*--------------------------------------------------------------------------*/
+
+typedef struct {
+ unsigned reserved:14,
+ fDeferUpd:1,
+ fAckReq:1;
+ int cfFormat;
+} DDEADVISE;
+
+/*--------------------------------------------------------------------------*/
+/* DDEDATA structure */
+/* */
+/* WM_DDE_DATA parameter structure for hData (LOWORD(lParam)). */
+/* The actual size of this structure depends on the size of */
+/* the Value array. */
+/* */
+/*--------------------------------------------------------------------------*/
+
+typedef struct {
+ unsigned unused:12,
+ fResponse:1,
+ fRelease:1,
+ reserved:1,
+ fAckReq:1;
+ int cfFormat;
+ BYTE Value[1];
+} DDEDATA;
+
+/*-------------------------------------------------------------------------*/
+/* DDEPOKE structure */
+/* */
+/* WM_DDE_POKE parameter structure for hData (LOWORD(lParam)). */
+/* The actual size of this structure depends on the size of */
+/* the Value array. */
+/* */
+/*-------------------------------------------------------------------------*/
+
+typedef struct {
+ unsigned unused:13, /* Earlier versions of DDE.H incorrectly */
+ /* 12 unused bits. */
+ fRelease:1,
+ fReserved:2;
+ int cfFormat;
+ BYTE Value[1]; /* This member was named rgb[1] in previous */
+ /* versions of DDE.H */
+
+} DDEPOKE;
+
+/*----------------------------------------------------------------------------
+The following typedef's were used in previous versions of the Windows SDK.
+They are still valid. The above typedef's define exactly the same structures
+as those below. The above typedef names are recommended, however, as they
+are more meaningful.
+
+Note that the DDEPOKE structure typedef'ed in earlier versions of DDE.H did
+not correctly define the bit positions.
+----------------------------------------------------------------------------*/
+
+typedef struct {
+ unsigned unused:13,
+ fRelease:1,
+ fDeferUpd:1,
+ fAckReq:1;
+ int cfFormat;
+} DDELN;
+
+typedef struct {
+ unsigned unused:12,
+ fAck:1,
+ fRelease:1,
+ fReserved:1,
+ fAckReq:1;
+ int cfFormat;
+ BYTE rgb[1];
+} DDEUP;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/direct.h b/private/oleauto/tools/win16/os2/inc/direct.h
new file mode 100644
index 000000000..3593c87e9
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/direct.h
@@ -0,0 +1,51 @@
+/***
+*direct.h - function declarations for directory handling/creation
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file contains the function declarations for the library
+* functions related to directory handling and creation.
+*
+****/
+
+#ifndef _INC_DIRECT
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+/* function prototypes */
+
+int __cdecl _chdir(const char *);
+int __cdecl _chdrive(int);
+char * __cdecl _getcwd(char *, int);
+char * __cdecl _getdcwd(int, char *, int);
+int __cdecl _getdrive(void);
+int __cdecl _mkdir(const char *);
+int __cdecl _rmdir(const char *);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+int __cdecl chdir(const char *);
+char * __cdecl getcwd(char *, int);
+int __cdecl mkdir(const char *);
+int __cdecl rmdir(const char *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_DIRECT
+#endif /* _INC_DIRECT */
diff --git a/private/oleauto/tools/win16/os2/inc/dos.h b/private/oleauto/tools/win16/os2/inc/dos.h
new file mode 100644
index 000000000..398ee8e9e
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/dos.h
@@ -0,0 +1,317 @@
+/***
+*dos.h - definitions for MS-DOS interface routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines the structs and unions used for the direct DOS interface
+* routines; includes macros to access the segment and offset
+* values of far pointers, so that they may be used by the routines; and
+* provides function prototypes for direct DOS interface functions.
+*
+****/
+
+#ifndef _INC_DOS
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __interrupt _interrupt
+#define __near _near
+#endif
+
+#ifndef _REGS_DEFINED
+
+/* word registers */
+
+struct _WORDREGS {
+ unsigned int ax;
+ unsigned int bx;
+ unsigned int cx;
+ unsigned int dx;
+ unsigned int si;
+ unsigned int di;
+ unsigned int cflag;
+ };
+
+/* byte registers */
+
+struct _BYTEREGS {
+ unsigned char al, ah;
+ unsigned char bl, bh;
+ unsigned char cl, ch;
+ unsigned char dl, dh;
+ };
+
+/* general purpose registers union -
+ * overlays the corresponding word and byte registers.
+ */
+
+union _REGS {
+ struct _WORDREGS x;
+ struct _BYTEREGS h;
+ };
+
+/* segment registers */
+
+struct _SREGS {
+ unsigned int es;
+ unsigned int cs;
+ unsigned int ss;
+ unsigned int ds;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+struct WORDREGS {
+ unsigned int ax;
+ unsigned int bx;
+ unsigned int cx;
+ unsigned int dx;
+ unsigned int si;
+ unsigned int di;
+ unsigned int cflag;
+ };
+
+struct BYTEREGS {
+ unsigned char al, ah;
+ unsigned char bl, bh;
+ unsigned char cl, ch;
+ unsigned char dl, dh;
+ };
+
+union REGS {
+ struct WORDREGS x;
+ struct BYTEREGS h;
+ };
+
+struct SREGS {
+ unsigned int es;
+ unsigned int cs;
+ unsigned int ss;
+ unsigned int ds;
+ };
+
+#endif /* __STDC__ */
+
+#define _REGS_DEFINED
+#endif /* _REGS_DEFINED */
+
+
+/* dosexterror structure */
+
+#ifndef _DOSERROR_DEFINED
+#pragma pack(2)
+
+struct _DOSERROR {
+ int exterror;
+ char errclass;
+ char action;
+ char locus;
+ };
+
+#if ((!defined(__STDC__)) && (!defined(__cplusplus)))
+/* Non-ANSI name for compatibility */
+struct DOSERROR {
+ int exterror;
+ char class;
+ char action;
+ char locus;
+ };
+#endif
+
+#pragma pack()
+#define _DOSERROR_DEFINED
+#endif
+
+
+/* _dos_findfirst structure */
+
+#ifndef _FIND_T_DEFINED
+#pragma pack(2)
+
+struct _find_t {
+ char reserved[21];
+ char attrib;
+ unsigned wr_time;
+ unsigned wr_date;
+ long size;
+ char name[13];
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+#define find_t _find_t
+#endif
+
+#pragma pack()
+#define _FIND_T_DEFINED
+#endif
+
+
+/* _dos_getdate/_dossetdate and _dos_gettime/_dos_settime structures */
+
+#ifndef _DATETIME_T_DEFINED
+#pragma pack(2)
+
+struct _dosdate_t {
+ unsigned char day; /* 1-31 */
+ unsigned char month; /* 1-12 */
+ unsigned int year; /* 1980-2099 */
+ unsigned char dayofweek; /* 0-6, 0=Sunday */
+ };
+
+struct _dostime_t {
+ unsigned char hour; /* 0-23 */
+ unsigned char minute; /* 0-59 */
+ unsigned char second; /* 0-59 */
+ unsigned char hsecond; /* 0-99 */
+ };
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define dosdate_t _dosdate_t
+#define dostime_t _dostime_t
+#endif
+
+#pragma pack()
+#define _DATETIME_T_DEFINED
+#endif
+
+
+/* _dos_getdiskfree structure */
+
+#ifndef _DISKFREE_T_DEFINED
+
+struct _diskfree_t {
+ unsigned total_clusters;
+ unsigned avail_clusters;
+ unsigned sectors_per_cluster;
+ unsigned bytes_per_sector;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+#define diskfree_t _diskfree_t
+#endif
+
+#define _DISKFREE_T_DEFINED
+#endif
+
+
+/* manifest constants for _hardresume result parameter */
+
+#define _HARDERR_IGNORE 0 /* Ignore the error */
+#define _HARDERR_RETRY 1 /* Retry the operation */
+#define _HARDERR_ABORT 2 /* Abort program issuing Interrupt 23h */
+#define _HARDERR_FAIL 3 /* Fail the system call in progress */
+ /* _HARDERR_FAIL is not supported on DOS 2.x */
+
+/* File attribute constants */
+
+#define _A_NORMAL 0x00 /* Normal file - No read/write restrictions */
+#define _A_RDONLY 0x01 /* Read only file */
+#define _A_HIDDEN 0x02 /* Hidden file */
+#define _A_SYSTEM 0x04 /* System file */
+#define _A_VOLID 0x08 /* Volume ID file */
+#define _A_SUBDIR 0x10 /* Subdirectory */
+#define _A_ARCH 0x20 /* Archive file */
+
+/* macros to break C "far" pointers into their segment and offset components
+ */
+
+#define _FP_SEG(fp) (*((unsigned __far *)&(fp)+1))
+#define _FP_OFF(fp) (*((unsigned __far *)&(fp)))
+
+
+/* external variable declarations */
+
+extern unsigned int __near __cdecl _osversion;
+
+
+/* function prototypes */
+
+int __cdecl _bdos(int, unsigned int, unsigned int);
+#ifndef _WINDOWS
+void __cdecl _chain_intr(void (__cdecl __interrupt __far *)());
+#endif
+void __cdecl _disable(void);
+#ifndef _WINDOWS
+unsigned __cdecl _dos_allocmem(unsigned, unsigned *);
+#endif
+unsigned __cdecl _dos_close(int);
+unsigned __cdecl _dos_commit(int);
+unsigned __cdecl _dos_creat(const char *, unsigned, int *);
+unsigned __cdecl _dos_creatnew(const char *, unsigned, int *);
+unsigned __cdecl _dos_findfirst(const char *, unsigned, struct _find_t *);
+unsigned __cdecl _dos_findnext(struct _find_t *);
+#ifndef _WINDOWS
+unsigned __cdecl _dos_freemem(unsigned);
+#endif
+void __cdecl _dos_getdate(struct _dosdate_t *);
+void __cdecl _dos_getdrive(unsigned *);
+unsigned __cdecl _dos_getdiskfree(unsigned, struct _diskfree_t *);
+unsigned __cdecl _dos_getfileattr(const char *, unsigned *);
+unsigned __cdecl _dos_getftime(int, unsigned *, unsigned *);
+void __cdecl _dos_gettime(struct _dostime_t *);
+void (__cdecl __interrupt __far * __cdecl _dos_getvect(unsigned))();
+#ifndef _WINDOWS
+void __cdecl _dos_keep(unsigned, unsigned);
+#endif
+unsigned __cdecl _dos_open(const char *, unsigned, int *);
+unsigned __cdecl _dos_read(int, void __far *, unsigned, unsigned *);
+#ifndef _WINDOWS
+unsigned __cdecl _dos_setblock(unsigned, unsigned, unsigned *);
+#endif
+unsigned __cdecl _dos_setdate(struct _dosdate_t *);
+void __cdecl _dos_setdrive(unsigned, unsigned *);
+unsigned __cdecl _dos_setfileattr(const char *, unsigned);
+unsigned __cdecl _dos_setftime(int, unsigned, unsigned);
+unsigned __cdecl _dos_settime(struct _dostime_t *);
+#ifndef _WINDOWS
+void __cdecl _dos_setvect(unsigned, void (__cdecl __interrupt __far *)());
+#endif
+unsigned __cdecl _dos_write(int, const void __far *, unsigned, unsigned *);
+int __cdecl _dosexterr(struct _DOSERROR *);
+void __cdecl _enable(void);
+#ifndef _WINDOWS
+void __cdecl _harderr(void (__far __cdecl *)());
+void __cdecl _hardresume(int);
+void __cdecl _hardretn(int);
+#endif
+int __cdecl _intdos(union _REGS *, union _REGS *);
+int __cdecl _intdosx(union _REGS *, union _REGS *, struct _SREGS *);
+int __cdecl _int86(int, union _REGS *, union _REGS *);
+int __cdecl _int86x(int, union _REGS *, union _REGS *, struct _SREGS *);
+
+void __cdecl _segread(struct _SREGS *);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define FP_SEG _FP_SEG
+#define FP_OFF _FP_OFF
+
+int __cdecl bdos(int, unsigned int, unsigned int);
+int __cdecl intdos(union REGS *, union REGS *);
+int __cdecl intdosx(union REGS *, union REGS *, struct SREGS *);
+int __cdecl int86(int, union REGS *, union REGS *);
+int __cdecl int86x(int, union REGS *, union REGS *, struct SREGS *);
+#ifndef __cplusplus
+int __cdecl dosexterr(struct DOSERROR *);
+#endif
+void __cdecl segread(struct SREGS *);
+
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_DOS
+#endif /* _INC_DOS */
diff --git a/private/oleauto/tools/win16/os2/inc/drivinit.h b/private/oleauto/tools/win16/os2/inc/drivinit.h
new file mode 100644
index 000000000..d92421cf9
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/drivinit.h
@@ -0,0 +1,164 @@
+/*
+ * drivinit.h
+ *
+ * Header file for printer driver initialization using ExtDeviceMode()
+ * and DeviceCapabilities().
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* size of a device name string */
+#define CCHDEVICENAME 32
+
+/* current version of specification */
+#define DM_SPECVERSION 0x300
+
+/* field selection bits */
+#define DM_ORIENTATION 0x0000001L
+#define DM_PAPERSIZE 0x0000002L
+#define DM_PAPERLENGTH 0x0000004L
+#define DM_PAPERWIDTH 0x0000008L
+#define DM_SCALE 0x0000010L
+#define DM_COPIES 0x0000100L
+#define DM_DEFAULTSOURCE 0x0000200L
+#define DM_PRINTQUALITY 0x0000400L
+#define DM_COLOR 0x0000800L
+#define DM_DUPLEX 0x0001000L
+
+/* orientation selections */
+#define DMORIENT_PORTRAIT 1
+#define DMORIENT_LANDSCAPE 2
+
+/* paper selections */
+#define DMPAPER_FIRST DMPAPER_LETTER
+#define DMPAPER_LETTER 1 // Letter 8 1/2 x 11 in
+#define DMPAPER_LETTERSMALL 2 // Letter Small 8 1/2 x 11 in
+#define DMPAPER_TABLOID 3 // Tabloid 11 x 17 in
+#define DMPAPER_LEDGER 4 // Ledger 17 x 11 in
+#define DMPAPER_LEGAL 5 // Legal 8 1/2 x 14 in
+#define DMPAPER_STATEMENT 6 // Statement 5 1/2 x 8 1/2 in
+#define DMPAPER_EXECUTIVE 7 // Executive"7 1/2 x 10 in
+#define DMPAPER_A3 8 // A3 297 x 420 mm
+#define DMPAPER_A4 9 // A4 210 x 297 mm
+#define DMPAPER_A4SMALL 10 // A4 Small 210 x 297 mm
+#define DMPAPER_A5 11 // A5 148 x 210 mm
+#define DMPAPER_B4 12 // B4 250 x 354
+#define DMPAPER_B5 13 // B5 182 x 257 mm
+#define DMPAPER_FOLIO 14 // Folio 8 1/2 x 13 in
+#define DMPAPER_QUARTO 15 // Quarto 215 x 275 mm
+#define DMPAPER_10X14 16 // 10x14 in
+#define DMPAPER_11X17 17 // 11x17 in
+#define DMPAPER_NOTE 18 // Note 8 1/2 x 11 in
+#define DMPAPER_ENV_9 19 // Envelope #9 3 7/8 x 8 7/8
+#define DMPAPER_ENV_10 20 // Envelope #10 4 1/8 x 9 1/2
+#define DMPAPER_ENV_11 21 // Envelope #11 4 1/2 x 10 3/8
+#define DMPAPER_ENV_12 22 // Envelope #12 4 \276 x 11
+#define DMPAPER_ENV_14 23 // Envelope #14 5 x 11 1/2
+#define DMPAPER_CSHEET 24 // C size sheet
+#define DMPAPER_DSHEET 25 // D size sheet
+#define DMPAPER_ESHEET 26 // E size sheet
+#define DMPAPER_LAST DMPAPER_ESHEET
+
+#define DMPAPER_USER 256
+
+/* bin selections */
+#define DMBIN_FIRST DMBIN_UPPER
+#define DMBIN_UPPER 1
+#define DMBIN_ONLYONE 1
+#define DMBIN_LOWER 2
+#define DMBIN_MIDDLE 3
+#define DMBIN_MANUAL 4
+#define DMBIN_ENVELOPE 5
+#define DMBIN_ENVMANUAL 6
+#define DMBIN_AUTO 7
+#define DMBIN_TRACTOR 8
+#define DMBIN_SMALLFMT 9
+#define DMBIN_LARGEFMT 10
+#define DMBIN_LARGECAPACITY 11
+#define DMBIN_CASSETTE 14
+#define DMBIN_LAST DMBIN_CASSETTE
+
+#define DMBIN_USER 256 /* device specific bins start here */
+
+/* print qualities */
+#define DMRES_DRAFT (-1)
+#define DMRES_LOW (-2)
+#define DMRES_MEDIUM (-3)
+#define DMRES_HIGH (-4)
+
+/* color enable/disable for color printers */
+#define DMCOLOR_MONOCHROME 1
+#define DMCOLOR_COLOR 2
+
+/* duplex enable */
+#define DMDUP_SIMPLEX 1
+#define DMDUP_VERTICAL 2
+#define DMDUP_HORIZONTAL 3
+
+typedef struct _devicemode {
+ char dmDeviceName[CCHDEVICENAME];
+ WORD dmSpecVersion;
+ WORD dmDriverVersion;
+ WORD dmSize;
+ WORD dmDriverExtra;
+ DWORD dmFields;
+ short dmOrientation;
+ short dmPaperSize;
+ short dmPaperLength;
+ short dmPaperWidth;
+ short dmScale;
+ short dmCopies;
+ short dmDefaultSource;
+ short dmPrintQuality;
+ short dmColor;
+ short dmDuplex;
+} DEVMODE;
+
+typedef DEVMODE * PDEVMODE, NEAR * NPDEVMODE, FAR * LPDEVMODE;
+
+/* mode selections for the device mode function */
+#define DM_UPDATE 1
+#define DM_COPY 2
+#define DM_PROMPT 4
+#define DM_MODIFY 8
+
+#define DM_IN_BUFFER DM_MODIFY
+#define DM_IN_PROMPT DM_PROMPT
+#define DM_OUT_BUFFER DM_COPY
+#define DM_OUT_DEFAULT DM_UPDATE
+
+/* device capabilities indices */
+#define DC_FIELDS 1
+#define DC_PAPERS 2
+#define DC_PAPERSIZE 3
+#define DC_MINEXTENT 4
+#define DC_MAXEXTENT 5
+#define DC_BINS 6
+#define DC_DUPLEX 7
+#define DC_SIZE 8
+#define DC_EXTRA 9
+#define DC_VERSION 10
+#define DC_DRIVER 11
+
+/* export ordinal definitions */
+#define PROC_EXTDEVICEMODE MAKEINTRESOURCE(90)
+#define PROC_DEVICECAPABILITIES MAKEINTRESOURCE(91)
+#define PROC_OLDDEVICEMODE MAKEINTRESOURCE(13)
+
+/* define types of pointers to ExtDeviceMode() and DeviceCapabilities()
+ * functions
+ */
+typedef WORD FAR PASCAL FNDEVMODE(HWND, HANDLE, LPDEVMODE, LPSTR, LPSTR,
+ LPDEVMODE, LPSTR, WORD);
+
+typedef FNDEVMODE FAR * LPFNDEVMODE;
+
+typedef DWORD FAR PASCAL FNDEVCAPS(LPSTR, LPSTR, WORD, LPSTR, LPDEVMODE);
+
+typedef FNDEVCAPS FAR * LPFNDEVCAPS;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/errno.h b/private/oleauto/tools/win16/os2/inc/errno.h
new file mode 100644
index 000000000..0e7fa7e8a
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/errno.h
@@ -0,0 +1,75 @@
+/***
+*errno.h - system wide error numbers (set by system calls)
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the system-wide error numbers (set by
+* system calls). Conforms to the XENIX standard. Extended
+* for compatibility with Uniforum standard.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_ERRNO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+/* declare reference to errno */
+
+extern int __near __cdecl volatile errno;
+
+/* Error Codes */
+
+#define EZERO 0
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define EUCLEAN 35
+#define EDEADLOCK 36
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_ERRNO
+#endif /* _INC_ERRNO */
diff --git a/private/oleauto/tools/win16/os2/inc/ext.h b/private/oleauto/tools/win16/os2/inc/ext.h
new file mode 100644
index 000000000..932c35ee7
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ext.h
@@ -0,0 +1,722 @@
+/*** ext.h - extension definitions
+*
+* Copyright <C> 1988-1990, Microsoft Corporation
+*
+*
+*************************************************************************/
+
+/*************************************************************************
+ *
+ * Macro Definitions
+ */
+
+/* Common Definitions
+ */
+
+#include <stddef.h> /* get definition of NULL */
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+/* PNULL - NULL PFILE
+ */
+#define PNULL ((PFILE) NULL)
+
+/* BUFLEN is the maximum line length that can be passed or will be returned
+ * by the editor. MAX_PATH is the maximum path length supported.
+ */
+#define BUFLEN 251
+#define MAX_PATH 200
+
+/* EXPORT defines the attributes required for extension functions. _loadds
+ * is used such that extensions can be compiled /Aw as well as /Au.
+ */
+#define EXPORT _loadds far
+#define EXTERNAL _loadds far
+
+/* PWBFUNC defines the return value and characteristics of extension defined
+ * editing functions.
+ */
+#define PWBFUNC flagType pascal _loadds far
+
+/* RQ_... are various request types supported for Get/Set EditorObject
+ */
+#define RQ_FILE 0x1000 /* GetEditorObject: File request */
+#define RQ_FILE_HANDLE 0x1000 /* File Handle */
+#define RQ_FILE_NAME 0x1100 /* ASCIIZ filename */
+#define RQ_FILE_FLAGS 0x1200 /* flags */
+#define RQ_FILE_REFCNT 0x1300 /* reference count */
+#define RQ_FILE_FREEZE 0x1400 /* freeze count */
+#define RQ_WIN 0x2000 /* Window request */
+#define RQ_WIN_HANDLE 0x2000 /* Window Handle */
+#define RQ_WIN_CONTENTS 0x2100 /* Window Contents */
+#define RQ_WIN_CUR 0x2200 /* Current Window */
+#define RQ_WIN_MAXED 0x2300 /* Zoomed flag */
+#define RQ_WIN_PWBHANDLE 0x2400 /* PWB Window Handle */
+#define RQ_WIN_ARC 0x2500 /* */
+#define RQ_WIN_COLOR 0x2600 /* text/border colors */
+#define RQ_MISC 0x3000 /* Misc requests */
+#define RQ_SCREENSIZE 0x3100 /* screen size */
+#define RQ_SEARCHINFO 0x3200 /* search state information */
+#define RQ_ALLFILE 0x4000 /* GetEditorObject: All file request */
+#define RQ_ALLFILE_HANDLE 0x4000 /* File Handle */
+#define RQ_ALLFILE_NAME 0x4100 /* ASCIIZ filename */
+#define RQ_ALLFILE_FLAGS 0x4200 /* flags */
+#define RQ_ALLFILE_REFCNT 0x4300 /* reference count */
+#define RQ_ALLFILE_FREEZE 0x4400 /* freeze count */
+
+#define RQ_COLOR 0x9000 /* Color request */
+
+#define RQ_NAME 0xd000 /* editor name */
+#define RQ_TOOLSINI 0xe000 /* tools.ini PFILE */
+#define RQ_CLIP 0xf000 /* clipboard type */
+
+
+/* toPif is used when placing numeric or boolean switches in the swiDesc
+ * table to eliminate C 5.X compiler warnings.
+ *
+ * For example: { "Switchname", toPIF(switchvar), SWI_BOOLEAN },
+ */
+#define toPIF(x) (PIF)(long)(void far *)&x
+
+/* Editor color table indicies. (Colors USERCOLORMIN - USERCOLORMAX are
+ * unassigned and available for extension use).
+ */
+#define Background 0 /* all backgrounds (unused in PWB) */
+#define Hilite 1 /* Hilited items */
+#define Greyed 2 /* greyed items */
+#define Enabled 3 /* enabled items */
+#define Disabled 4 /* disabled items */
+#define Alert 5 /* for MessageBox alerts */
+#define DialogBox 6 /* background for dialogs */
+#define PushButton 7 /* push button color */
+#define ButtonDown 8 /* pushed button color */
+#define ListBox 9 /* listbox background */
+#define Scrollbar 10 /* scroll bar Background & arrows */
+#define Elevator 11 /* scroll bar elevator */
+#define MenuBox 12 /* background for menus */
+#define Menu 13 /* menu bar color */
+#define MenuSelected 14 /* Selected menus */
+#define MenuHilite 15 /* for single character */
+#define MenuHiliteSel 16 /* for single character (under selection) */
+#define ItemHiliteSel 17 /* for single character (under selection) */
+#define DialogAccel 18 /* dialog accelerators */
+#define DialogAccelBor 19 /* dialog accelerator border */
+#define Shadow 20 /* shadows */
+#define FGCOLOR 21 /* Normal text in non-PWB edit windows */
+#define HGCOLOR 22 /* Highlighted text */
+#define INFCOLOR 23 /* Noise */
+#define SELCOLOR 24 /* Text Selections */
+#define WDCOLOR 25 /* Non-PWB edit Window Borders */
+#define STACOLOR 26 /* Status Letters on bottom line */
+/* 27 internal: used by PWB */
+#define BECOLOR 28 /* Build Error Window */
+#define DTCOLOR 29 /* Desktop */
+#define PWBTCOLOR 30 /* PWB Window Text */
+#define PWBBCOLOR 31 /* PWB Window Border */
+#define MSGCOLOR 32 /* Message line */
+#define LOCCOLOR 33 /* Cursor position indicator */
+
+#define USERCOLORMIN 34 /* beginning of extension colors */
+#define USERCOLORMAX 56 /* end of extension colors */
+
+/* Attributes for ForFile
+ */
+#define FORFILE_RO 1 /* read only */
+#define FORFILE_H 2 /* hidden */
+#define FORFILE_S 4 /* system */
+#define FORFILE_V 8 /* volume id */
+#define FORFILE_D 16 /* directory */
+#define FORFILE_A 32 /* archive */
+
+/* changeable attributes
+ */
+#define FORFILE_MOD (FORFILE_RO|FORFILE_H|FORFILE_S|FORFILE_A)
+#define FORFILE_ALL (FORFILE_RO|FORFILE_H|FORFILE_S|FORFILE_V|FORFILE_D|FORFILE_A)
+
+/*************************************************************************
+ *
+ * General type Definitions
+ */
+typedef char flagType; /* Boolean value */
+typedef int COL; /* column or position with line */
+typedef long LINE; /* line number within file */
+typedef unsigned PFILE; /* editor file handle */
+typedef unsigned PINS;
+#ifndef EXTINT
+typedef unsigned PWND; /* editor window handle */
+#endif
+
+
+typedef char buffer[BUFLEN]; /* miscellaneous buffer */
+typedef char linebuf[BUFLEN]; /* line buffer */
+typedef char pathbuf[BUFLEN]; /* Pathname buffer */
+
+typedef struct { /* file location */
+ LINE lin; /* - line number */
+ COL col; /* - column */
+ } fl, *pfl;
+
+typedef struct { /* screen location */
+ int lin; /* - line number */
+ int col; /* - column */
+ } sl, *psl;
+
+typedef struct { /* file range */
+ fl flFirst; /* - Lower line, or leftmost col */
+ fl flLast; /* - Higher, or rightmost */
+ } rn, *prn;
+
+typedef struct lineAttr { /* Line color attribute info */
+ unsigned char attr; /* - Attribute of piece */
+ unsigned char len; /* - Bytes in colored piece */
+ } la, *pla;
+
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef WORD ISA;
+typedef struct _arc
+ {
+ BYTE axLeft;
+ BYTE ayTop;
+ BYTE axRight;
+ BYTE ayBottom;
+ } ARC;
+
+/*************************************************************************
+ *
+ * Argument definition structures.
+ *
+ * We define a structure for each of the argument types that may be passed
+ * to an extension function. Then, we define the structure argType which is
+ * used to pass these arguments around in a union.
+ */
+struct noargType { /* no argument specified */
+ LINE y; /* - cursor line */
+ COL x; /* - cursor column */
+ };
+
+struct textargType { /* text argument specified */
+ int cArg; /* - count of <arg>s pressed */
+ LINE y; /* - cursor line */
+ COL x; /* - cursor column */
+ char far *pText; /* - ptr to text of arg */
+ };
+
+struct nullargType { /* null argument specified */
+ int cArg; /* - count of <arg>s pressed */
+ LINE y; /* - cursor line */
+ COL x; /* - cursor column */
+ };
+
+struct lineargType { /* line argument specified */
+ int cArg; /* - count of <arg>s pressed */
+ LINE yStart; /* - starting line of range */
+ LINE yEnd; /* - ending line of range */
+ };
+
+struct streamargType { /* stream argument specified */
+ int cArg; /* - count of <arg>s pressed */
+ LINE yStart; /* - starting line of region */
+ COL xStart; /* - starting column of region */
+ LINE yEnd; /* - ending line of region */
+ COL xEnd; /* - ending column of region */
+ };
+
+struct boxargType { /* box argument specified */
+ int cArg; /* - count of <arg>s pressed */
+ LINE yTop; /* - top line of box */
+ LINE yBottom; /* - bottom line of bix */
+ COL xLeft; /* - left column of box */
+ COL xRight; /* - right column of box */
+ };
+
+struct argType {
+ int argType;
+ union {
+ struct noargType noarg;
+ struct textargType textarg;
+ struct nullargType nullarg;
+ struct lineargType linearg;
+ struct streamargType streamarg;
+ struct boxargType boxarg;
+ } arg;
+ PWND pwnd;
+ PINS pins;
+ PFILE pfile;
+ };
+typedef struct argType ARG;
+
+/*************************************************************************
+ *
+ * Function definition table definitions
+ */
+typedef unsigned CMDDATA;
+
+struct cmdDesc { /* function definition entry */
+ char far *name; /* - pointer to name of fcn */
+ flagType (pascal EXTERNAL *func)(CMDDATA,
+ ARG far *,
+ flagType); /* - pointer to function */
+ CMDDATA arg; /* - used internally by editor*/
+ unsigned long argType; /* - user args allowed */
+ };
+typedef struct cmdDesc far *PCMD;
+
+typedef struct KeyData { /* Key information */
+ unsigned ascii; /* ASCII code, or .vkey if none */
+ unsigned scan; /* scan code */
+ unsigned vkey; /* virtual key code */
+ unsigned shift; /* Shift state 0 - 3 */
+ PCMD pFunc; /* command key will invoke */
+ char name[30]; /* full name for key */
+ } KeyData;
+
+typedef unsigned KeyHandle;
+
+#define NOARG 0x00000001 /* no argument specified */
+#define TEXTARG 0x00000002 /* text specified */
+#define NULLARG 0x00000004 /* arg + no cursor movement */
+#define NULLEOL 0x00000008 /* null arg => text from arg->eol */
+#define NULLEOW 0x00000010 /* null arg => text from arg->end word */
+#define LINEARG 0x00000020 /* range of entire lines */
+#define STREAMARG 0x00000040 /* from low-to-high, viewed 1-D */
+#define BOXARG 0x00000080 /* box delimited by arg, cursor */
+
+#define NUMARG 0x00000100 /* text => delta to y position */
+#define MARKARG 0x00000200 /* text => mark at end of arg */
+
+#define BOXSTR 0x00000400 /* single-line box => text */
+
+#define FASTKEY 0x00000800 /* Fast repeat function */
+#define MODIFIES 0x00001000 /* modifies file */
+#define KEEPMETA 0x00002000 /* do not eat meta flag */
+#define WINDOWFUNC 0x00004000 /* moves window */
+#define CURSORFUNC 0x00008000 /* moves cursor */
+
+#define NOWINDOWS 0x00010000 /* cmd works when no windows are open */
+#define ICONFOCUS 0x00020000 /* cmd works when an icon has focus */
+#define BEEPERROR 0x00040000 /* PWB beeps when cmd is not allowed */
+#define POPUP 0x00080000 /* cmd works when PopUp window is present */
+
+/*************************************************************************
+ *
+ * Switch definition table definitions
+ *
+ * SWI_NUMERIC: hex or decimal switch.
+ * SWI_BOOLEAN: boolean switch.
+ * SWI_EXTTEXT: extension text switch.
+ * function is provided whose second argument (fQuery)
+ * specifies the mode:
+ * 1) If fQuery is FALSE, set the switch to the text
+ * specified by the first argument.
+ * Return NULL if successful, else return error
+ * string.
+ * 2) If fQuery is TRUE, return the current value of
+ * switch. The first argument is ignored (should
+ * be NULL).
+ *
+ * 1.x Compatibility Switches: (DO NOT USE)
+ *
+ * SWI_SPECIAL old-style special text switch.
+ * Provided for compatibility with PWB 1.x versions only.
+ * function is provided which takes a text value and
+ * returns a boolean indicator of success/failure.
+ * SWI_SPECIAL2 old-style special text switch.
+ * Provided for compatability with PWB 1.x versions only.
+ * function is provided which takes a text value and
+ * returns NULL for success, error string otherwise.
+ *
+ */
+typedef char far * (pascal EXTERNAL *PIF)(char far *, flagType);
+typedef flagType (pascal EXTERNAL *PIF_S)(char far *);
+typedef char far * (pascal EXTERNAL *PIF_S2)(char far *);
+
+
+union swiAct { /* switch location or routine */
+ PIF pExtFunc; /* SWI_EXTTEXT function */
+ PIF_S pFunc; /* SWI_SPECIAL function */
+ PIF_S2 pFunc2; /* SWI_SPECIAL2 function */
+ int far *ival; /* SWI_NUMERIC integer value */
+ flagType far *fval; /* SWI_BOOLEAN flag */
+ };
+
+struct swiDesc { /* switch definition entry */
+ char far *name; /* - pointer to name of switch */
+ union swiAct act; /* - pointer to value or fcn */
+ int type; /* - flags defining switch type */
+ };
+typedef struct swiDesc far *PSWI;
+
+#define SWI_BOOLEAN 0 /* Boolean switch */
+#define SWI_NUMERIC 1 /* hex or decimal switch */
+#define SWI_EXTTEXT 2 /* text switch w/fQuery arg */
+#define SWI_SPECIAL 5 /* textual switch */
+#define SWI_SPECIAL2 6 /* #5, returning an error string */
+#define RADIX10 (0x0A << 8) /* numeric switch is decimal */
+#define RADIX16 (0x10 << 8) /* numeric switch is hex */
+
+/************************************************************************
+ *
+ * Get/Set EditorObject data structures
+ */
+typedef struct {
+ ISA text; /* - default text color */
+ ISA border; /* - default border color */
+ } winColors;
+
+typedef struct { /* define window contents */
+ PFILE pFile; /* - handle of file displayed */
+ ARC arcWin; /* - location of window */
+ fl flPos; /* - upper left corner wrt file */
+ fl flCursor; /* - Cursor position */
+ WORD id; /* - window number */
+ WORD flags; /* - window flags */
+ winColors colors; /* - default window colors */
+ } winContents;
+
+/************************************************************************
+ *
+ * Values for .flags field in struct winContents
+ */
+#define WF_PWB 1
+#define WF_ICONIC 2
+#define WF_ZOOMED 4
+#define WF_OPEN 0x10
+#define WF_CURRENT 0x80
+#define WF_POPUP 0x100
+
+
+
+
+/************************************************************************
+ *
+ * Values for flag (BYTE) argument to NewWindow
+ */
+
+#define NEWWND_ICON 2
+#define NEWWND_ZOOMED 4
+#define NEWWND_CLOSED 8
+#define NEWWND_PWB 0x80
+
+
+/************************************************************************
+ *
+ * Values for flag (last) argument to GenEditSubWindow
+ */
+
+#define SWF_CURSOR 1
+#define SWF_TOP 2
+
+
+typedef struct { /* search/replace state information */
+ struct { /* TOOLS.INI switch info */
+ flagType fUnixRE; /* TRUE => Use UNIX RE's (unixre: switch) */
+ flagType fSrchCase; /* TRUE => case is significant (case: switch)*/
+ flagType fSrchWrap; /* TRUE => searches wrap (wrap: switch) */
+ } swit;
+ struct { /* state of previous activity */
+ flagType fSrchAll; /* TRUE => previously searched for all */
+ flagType fSrchCase; /* TRUE => case was significant */
+ flagType fSrchDir; /* TRUE => previously searched forward */
+ flagType fSrchRe; /* TRUE => search previously used RE's */
+ flagType fSrchWrap; /* TRUE => previously did wrap */
+ flagType fReplRe; /* TRUE => replace previously used RE's */
+ buffer szSrch; /* search buffer */
+ buffer szReplsrc; /* source string for replace */
+ buffer szReplrpl; /* destination string for replace */
+ } prev;
+ } SearchInfo;
+
+/* FILE flags values
+ *
+ *
+ * DIRTY file had been modified, and has not yet been written to disk.
+ *
+ * FAKE file is a pseudo file. It cannot be saved to disk under it's
+ * current name, and may also be otherwise treated specially.
+ *
+ * REAL file has been read from disk. If reset, the file needs to be
+ * read if any operations are to be performed on it. (May also
+ * be set for FAKE files, even though they are not really on
+ * disk.)
+ *
+ * DOSFILE file has CR-LF. If not set, lines are terminated by LF only
+ * in unix-style. The setting is determined by the file reader
+ * having seen CRLF or not. Should default on for all files we
+ * create.
+ *
+ * TEMP file is a temp file, and is not saved in the status file.
+ * These are the files specified by /t on the command line.
+ *
+ * NEW file has been created by editor. This is set when we create
+ * the file (after asking the user), and causes us to avoid
+ * trying to back-up a non-existant previous version.
+ *
+ * REFRESH file needs to be refreshed every time it is viewed. This is
+ * set for pseudo files which need to be regenerated each time
+ * they are viewed, such as <information-file>, the file history
+ * list.
+ *
+ * READONLY file may not be edited. For example, this bit is set by the
+ * help extension on it's pseudo file to prevent users from
+ * editing the contents. All commands with the MODIFIES bit are
+ * disabled if a file with this bit is current.
+ *
+ * DISKRO file on disk is read only.
+ *
+ * MODE1 Meaning depends on the file
+ *
+ * VALMARKS file has valid marks defined
+ *
+ * READING file is currently being read. This means that the idle time
+ * reader may be operating on this file.
+ *
+ * MARKSDIRTY file's marks need to be written
+ *
+ * HYBRID file is FAKE, but gets saved
+ *
+ * NORENAME file should never be renamed
+ *
+ * NOREMOVE file should never be removed or expunged
+ */
+#define DIRTY 0x01
+#define FAKE 0x02
+#define REAL 0x04
+#define DOSFILE 0x08
+#define TEMP 0x10
+#define NEW 0x20
+#define REFRESH 0x40
+#define READONLY 0x80
+
+#define DISKRO 0x0100
+#define MODE1 0x0200
+#define VALMARKS 0x0400
+#define READING 0x0800
+
+#define MARKSDIRTY 0x1000
+#define HYBRID 0x2000
+#define NORENAME 0x4000
+#define NOREMOVE 0x8000
+
+
+/****************************************************************************
+ * PWB100 2404
+ *
+ * Flags for dealing with instance lists when splitting a window...
+ * Use these when calling SplitWnd() to specify how to handle the instance
+ * lists.
+ *
+ */
+#define INF_NODUP 0 /* don't duplicate instance list, don't move */
+#define INF_NODUPMV 2 /* don't duplicate instance list, move it */
+#define INF_DUP 4 /* duplicate instance list */
+
+/****************************************************************************
+ *
+ * Values for third parameter to GetPfileFromName. The values control the
+ * behaviour i nthe case that the specified file doe not exist on disk.
+ * The options are: Fail silently, ask the user to create the file, create
+ * the file silently.
+ *
+ */
+#define PFN_FAIL 0
+#define PFN_ASK 1
+#define PFN_CREATE 2
+
+/*************************************************************************
+ *
+ * Menu, window and dialog definitions
+ *
+ * action constants for ChangeMenu
+ */
+#define MNU_DISABLE 1 /* disable (grey) menu item */
+#define MNU_ENABLE 2 /* enable menu item */
+#define MNU_CHECK 3 /* check menu item */
+#define MNU_UNCHECK 4 /* uncheck menu item */
+#define MNU_RENAME 5 /* rename menu item */
+#define MNU_COMMAND 6 /* define menu item command */
+
+/* Message box types.
+ */
+#define MBOX_OK 1 /* <OK> */
+#define MBOX_YESNOCANCEL 2 /* <YES> <NO> <CANCEL> */
+#define MBOX_RETRYCANCEL 3 /* <RETRY> <CANCEL> */
+#define MBOX_OKCANCEL 4 /* <OK> <CANCEL> */
+#define MBOX_ABORT 5 /* <ABORT> */
+#define MBOX_YESNO 6 /* <YES> <NO> */
+#define MBOX_RETRY 7 /* <RETRY> */
+#define MBOX_TYPE 0x0f /* message type */
+#define MBOX_BEEP 0x10 /* beep when displayed */
+#define MBOX_CAPTION 0x20 /* 1st param is caption */
+#define MBOX_NOHELP 0x8000 /* don't add a help button */
+
+/* Message Box Return types
+ */
+#define MBOX_IDOK 1 /* <OK> button */
+#define MBOX_IDCANCEL 2 /* <CANCEL> button */
+#define MBOX_IDABORT 3 /* <ABORT> button */
+#define MBOX_IDRETRY 4 /* <RETRY> button */
+#define MBOX_IDIGNORE 5 /* <IGNORE> button */
+#define MBOX_IDYES 6 /* <YES> button */
+#define MBOX_IDNO 7 /* <NO> button */
+
+/* Flags in flags parameter to DoExtCmd
+ */
+#define EXTCMD_NONE 0x0000
+#define EXTCMD_NOEVENT 0x0001 // do not emit EVT_SHELL
+#define EXTCMD_NOSAVE 0x0002 // do not autosave before spawn
+#define EXTCMD_NOSYNC 0x0004 // do not sync cur file on return
+#define EXTCMD_REDIR 0x0008 // redirect output to file
+#define EXTCMD_APPEND 0x0010 // append to output file (don't rewrite)
+#define EXTCMD_BACK 0x0010 // OS/2 background execution
+#define EXTCMD_ECHO 0x0020 // DOS: echo command output in Build Results
+#define EXTCMD_ASK 0x0040 // prompt for return
+#define EXTCMD_ASKERR 0x0080 // prompt for return if error
+#define EXTCMD_GLOBAL 0x0100 // prompt for return if global is set
+
+/* Flags in flags parameter to IdAddPwbMenuItem
+ */
+#define TM_CHECKED 0x00
+#define TM_UNCHECKED 0x01
+
+#define TM_ENABLED 0x00
+#define TM_DISABLED 0x02
+
+#define TM_RECORD 0x00
+#define TM_NORECORD 0x04
+
+#define TM_TYPE 0x70
+
+#define TM_COMMAND 0x10
+#define TM_SUBMENU 0x20
+#define TM_SEPARATOR 0x40
+
+
+/*************************************************************************
+ *
+ * Editor lowlevel function prototypes.
+
+ *
+ * This list defines the routines within the editor which may be called
+ * by extension functions.
+ */
+int pascal EXPORT AddAColor (char far *, char far *);
+PFILE pascal EXPORT AddFile (char far *);
+int pascal EXPORT AddMenu (char far *, char far *, char far *, flagType);
+int pascal EXPORT AddMenuItem (int, char far *, char far *, char far *, char far *);
+void pascal EXPORT AddStrToList (PCMD, char far *, flagType);
+unsigned pascal EXPORT atou (const char far *);
+flagType pascal EXPORT BadArg (void);
+void pascal EXPORT bell (void);
+flagType pascal EXPORT ChangeMenu (int, int, char far *);
+void pascal EXPORT CheckPwbMenuItem (WORD, unsigned short);
+void pascal EXPORT ClearList (PCMD);
+flagType pascal EXPORT CloseWnd (PWND);
+void pascal EXPORT CopyBox (PFILE, PFILE, COL, LINE, COL, LINE, COL, LINE);
+void pascal EXPORT CopyLine (PFILE, PFILE, LINE, LINE, LINE);
+void pascal EXPORT CopyStream (PFILE, PFILE, COL, LINE, COL, LINE, COL, LINE);
+void pascal EXPORT DelBox (PFILE, COL, LINE, COL, LINE);
+void pascal EXPORT DelFile (PFILE);
+void pascal EXPORT DelLine (PFILE, LINE, LINE);
+void pascal EXPORT DelStream (PFILE, COL, LINE, COL, LINE);
+void pascal EXPORT Display (void);
+void pascal EXPORT DoMessage (char far *);
+int pascal EXPORT DoMessageBox (char far *, char far *, char far *, int, int);
+int pascal EXPORT DoMessageBoxHelp (char far *, char far *, char far *, int, int, char far *);
+void pascal EXPORT DoDrawWindow (PWND);
+void pascal EXPORT DoStatusBox (char far *, char far *);
+void pascal EXPORT DrawEditWindowBorder(PWND);
+void pascal EXPORT EnablePwbMenuItem (WORD, unsigned short);
+char far * pascal EXPORT Falloc (long);
+char far * _cdecl EXPORT farstrncpy (char far *, const char far *, int);
+char far * _cdecl EXPORT farstrcpy (char far *, const char far *);
+char far * _cdecl EXPORT farstrcat (char far *, const char far *);
+char far * _cdecl EXPORT farstrstr (const char far *, const char far *);
+int _cdecl EXPORT farstrlen (const char far *);
+int _cdecl EXPORT farstrnicmp (const char far *, const char far *, int);
+int _cdecl EXPORT farstrncmp (const char far *, const char far *, int);
+int _cdecl EXPORT farstrcmp (const char far *, const char far *);
+void far * _cdecl EXPORT farmemset (void far *, int, size_t);
+int _cdecl EXPORT farstricmp (char far *, char far *);
+char far * _cdecl EXPORT farstrchr (char far *, int);
+char far * _cdecl EXPORT farstrlwr (char far *);
+char far * pascal EXPORT farstradd (char far *, const char far *);
+char far * pascal EXPORT farstrstrip (char far *);
+flagType pascal EXPORT fChangeFile (flagType, char far *);
+void pascal EXPORT Fdalloc (char far *);
+flagType pascal EXPORT fEnsureValidWindow (flagType);
+flagType pascal EXPORT fExecute (char far *);
+LINE pascal EXPORT FileLength (PFILE);
+PFILE pascal EXPORT FileNameToHandle (char far *, char far *);
+flagType pascal EXPORT FileRead (char far *, PFILE);
+flagType pascal EXPORT FileWrite (char far *, PFILE);
+PSWI pascal EXPORT FindSwitch (char far *);
+int pascal EXPORT ForFile (char far *,int ,void (pascal EXPORT *)(char far *));
+flagType pascal EXPORT fSetWindowWithFile (char far *);
+PWND pascal EXPORT GenEditSubWindow (PWND, WORD, ISA, WORD, WORD);
+flagType pascal EXPORT GetColor (LINE, struct lineAttr far *, PFILE);
+void pascal EXPORT GetCursor (COL far *, LINE far *);
+flagType pascal EXPORT GetEditorObject (unsigned, unsigned, void far *);
+PWND pascal EXPORT GetEditSubWindow (PWND, WORD);
+int pascal EXPORT GetLine (LINE, char far *, PFILE);
+char far * pascal EXPORT GetListEntry (PCMD, int, flagType);
+PCMD pascal EXPORT GetListHandle (char far *, flagType);
+PFILE pascal EXPORT GetPfileFromName (char far *, char far *, flagType);
+flagType pascal EXPORT GetString (char far *, char far *, flagType);
+WORD pascal EXPORT IdAddPwbMenuItem (unsigned, unsigned, unsigned, char far *, char far *, char far *, char far *);
+WORD pascal EXPORT IdFindPwbMenuItem (char far *, unsigned, unsigned);
+void pascal EXPORT LockFile (PFILE);
+char far * pascal EXPORT mgetenv (char far *);
+void pascal EXPORT MoveCur (COL, LINE);
+char far * pascal EXPORT NameToKeys (char far *, char far *);
+PCMD pascal EXPORT NameToFunc (char far *);
+PWND pascal EXPORT NewWindow (PFILE, BYTE, int, int, int, int, int, int);
+PCMD pascal EXPORT pCmdPrompt (char far *, char far *, char far *);
+flagType pascal EXPORT pFileToBottom (PFILE);
+flagType pascal EXPORT pFileToTop (PFILE);
+void pascal EXPORT PopUpBox (PFILE, char far *, int, fl);
+void pascal EXPORT PopUpBoxColor (PFILE, char far *, int, fl, ISA);
+void pascal EXPORT PutColor (LINE, struct lineAttr far *, PFILE);
+void pascal EXPORT PutLine (LINE, char far *, PFILE);
+long pascal EXPORT ReadChar (void);
+PCMD pascal EXPORT ReadCmd (void);
+void pascal EXPORT RecordPwbMenuItem (WORD, unsigned short);
+void pascal EXPORT DoRedrawDamagedRegions(void);
+flagType pascal EXPORT RemoveFile (PFILE);
+flagType pascal EXPORT Replace (char, COL, LINE, PFILE, flagType);
+int pascal EXPORT REsearch (PFILE, flagType, flagType, flagType, flagType, char far *, fl far *);
+flagType pascal EXPORT Resize (PWND, ARC);
+char far * pascal EXPORT ScanList (PCMD, flagType);
+int pascal EXPORT search (PFILE, flagType, flagType, flagType, flagType, char far *, fl far *);
+flagType pascal EXPORT SelectFiles (PCMD, char far *, char far *, char far *, flagType, int);
+flagType pascal EXPORT SelectFile (char far *, int, char far *, char far *, int);
+void pascal EXPORT SetColor (PFILE, LINE, COL, COL, int);
+void pascal EXPORT SetHiLite (PFILE, rn, int);
+flagType pascal EXPORT SetEditorObject (unsigned, unsigned, void far *);
+flagType pascal EXPORT SetKey (char far *, char far *);
+flagType pascal EXPORT SetPwbMenuItemTitle (WORD, char far *);
+flagType pascal EXPORT SetPwbMenuItemCommand (WORD, char far *);
+void pascal EXPORT SetPWBWindowMenuTitle (PWND, char far *);
+flagType pascal EXPORT SetSubWinHeight (PWND, WORD);
+void pascal EXPORT SetSubWinPFile (PWND, PFILE);
+void pascal EXPORT SetSubWinView (PWND, LINE, COL);
+void pascal EXPORT SetWindowColors (PWND, ISA, ISA);
+PWND pascal EXPORT SplitWnd (PWND, flagType, int, int);
+void pascal EXPORT UnLockFile (PFILE);
+long pascal EXPORT VMAlloc (long);
+void pascal EXPORT VMFree (long);
+void pascal EXPORT fpbToVM (char far *, long, unsigned);
+void pascal EXPORT VMTofpb (long, char far *, unsigned);
+long pascal EXPORT VMSize (long);
+flagType pascal EXPORT DoSpawn (char far *, char far *,
+ unsigned, unsigned far *);
+
+
+void _cdecl EXTERNAL WhenLoaded (void);
+
diff --git a/private/oleauto/tools/win16/os2/inc/fasttest.inc b/private/oleauto/tools/win16/os2/inc/fasttest.inc
new file mode 100644
index 000000000..e885af83a
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/fasttest.inc
@@ -0,0 +1,270 @@
+'FastTest.inc - definitions/declarations for Fast Test routines
+'
+' Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+'
+'Purpose:
+' This file declares the functions, constants and variables
+' used by the Fast Test routines.
+'
+
+'$DEFINE TESTCTRL
+'$DEFINE TESTEVNT
+'$INCLUDE 'MSTEST.inc'
+'$INCLUDE 'WNAPIDEC.INC'
+
+' XLog constants to determine where to log information to
+CONST LOG_DISK = 2 'log to disk
+CONST LOG_SCREEN = 4 'log to screen (viewport in testdrvr)
+CONST LOG_COM1 = 8 'log to COM1 port
+CONST LOG_COM2 = 16 'log to COM2 port
+CONST LOG_MSGBOX = 32 'log the string in a msgbox (Pause in testdrvr)
+
+'Global to be used to describe Log Options by ORing above Const's
+GLOBAL gfLogOptions%
+'Global to be used to save above flag when logging is temporarily turned off.
+GLOBAL gfTmpLogOptions%
+
+gfLogOptions = LOG_SCREEN 'default to showing in viewport
+gfTmpLogOptions = LOG_SCREEN 'default to showing in viewport
+
+GLOBAL gsCurrentDir$
+gsCurrentDir$ = curdir$ ' get current directory that started execution
+
+' Global variable to hold log file name
+GLOBAL gsLogFileName$
+gsLogFileName$ = sCurrentDir$ + "\FASTTEST.LOG"
+
+' Global variable to hold string to use as the keystrokes necessary
+' to close the app in the case of errors
+GLOBAL gsCleanup$
+gsCleanup$ = "{esc 5}%( )c"
+
+' Global variable to hold class name of app
+GLOBAL gsAppClassname$
+gsAppClassname$ = ""
+
+' Global variable to hold state of whether to terminate on XLogFailure
+GLOBAL gfTerminate%
+gfTerminate% = TRUE ' default to terminate at first failure
+
+' Global variable that indicates if failure occured
+GLOBAL gfFailure%
+gfFailure% = FALSE
+
+'Global variable that indicates an ON ERROR occurred
+GLOBAL gfError%
+gfError% = FALSE
+
+'Global variable that is the string value for the dialog window class
+GLOBAL gsDialogClass$
+gsDialogClass$ = "#32770"
+
+
+
+' Error Type constants (don't use 0)
+CONST ET_NOTHING = 1 ' no handling, log unexpected runtime error
+CONST ET_NEXT = 2 ' flag error, continue next statement
+CONST ET_LOG = 3 ' error happened in log routines, inform user elsewise
+
+'Global variable that shows what type of error to handle
+GLOBAL gErrorType%
+gErrorType% = ET_NOTHING
+
+
+'Prototypes from FTestLog.mst
+DECLARE SUB XSetLogFilename(sFilename$)
+DECLARE SUB XSetTerminate(fTerminate%)
+DECLARE SUB XLog (stLog$)
+DECLARE SUB XLogBanner(lpszInput$)
+DECLARE SUB XLogWarning(lpszInput$)
+DECLARE SUB XLogFailure(stFailure$)
+DECLARE SUB XFailureCheck
+DECLARE SUB XSetLogOptions (wLogOptions%)
+DECLARE SUB XLogOff ()
+DECLARE SUB XLogOn ()
+DECLARE SUB XDialogBoxExists(s$)
+DECLARE SUB XDialogBoxNotExists(s$)
+DECLARE SUB XWaitDialogBox(s$, WaitTime%)
+DECLARE SUB XButtonExists(stButton$)
+DECLARE SUB XButtonNotExists(stButton$)
+DECLARE SUB XButtonEnabled(stButton$)
+DECLARE SUB XButtonNotEnabled(stButton$)
+DECLARE SUB XClickButton(stButtonName$)
+DECLARE SUB XListBoxExists(stListbox$)
+DECLARE SUB XListBoxNotExists(stListbox$)
+DECLARE SUB XFocusListbox(stListbox$)
+DECLARE SUB XListBoxItemExists (stListbox$, stListboxItem$)
+DECLARE SUB XListBoxItemNotExists (stListbox$, stListboxItem$)
+DECLARE SUB XClickListboxItem (stListbox$, stListboxItem$)
+DECLARE SUB XDblClickListboxItem (stListbox$, stListboxItem$)
+DECLARE SUB XComboBoxExists(stComboBox$)
+DECLARE SUB XComboBoxNotExists(stComboBox$)
+DECLARE SUB XFocusComboBox(stComboBox$)
+DECLARE SUB XComboBoxItemExists (stComboBox$, stComboBoxItem$)
+DECLARE SUB XComboBoxItemNotExists (stComboBox$, stComboBoxItem$)
+DECLARE SUB XClickComboBoxItem (stComboBox$, stComboBoxItem$)
+DECLARE SUB XDblClickComboBoxItem (stComboBox$, stComboBoxItem$)
+DECLARE SUB XCheckboxExists(stCheckbox$)
+DECLARE SUB XCheckboxNotExists(stCheckbox$)
+DECLARE SUB XCheckboxChecked(stCheckbox$)
+DECLARE SUB XCheckboxNotChecked(stCheckbox$)
+DECLARE SUB XCheckboxEnabled(stCheckbox$)
+DECLARE SUB XCheckboxNotEnabled(stCheckbox$)
+DECLARE SUB XClickCheckbox(stCheckbox$)
+DECLARE SUB XEditTextExists(stEditText$)
+DECLARE SUB XEditTextNotExists(stEditTextNot$)
+DECLARE SUB XSetEditText (stEditCaption$, stEditText$)
+DECLARE SUB XRadiobuttonExists(stRadiobutton$)
+DECLARE SUB XRadiobuttonNotExists(stRadiobutton$)
+DECLARE SUB XRadiobuttonEnabled(stRadiobutton$)
+DECLARE SUB XRadiobuttonNotEnabled(stRadiobutton$)
+DECLARE SUB XRadiobuttonChecked(stRadiobutton$)
+DECLARE SUB XRadiobuttonNotChecked(stRadiobutton$)
+DECLARE SUB XClickRadiobutton(stRadiobutton$)
+DECLARE FUNCTION BDialogBoxExists%(s$)
+DECLARE FUNCTION BButtonExists%(stButtonName$)
+DECLARE FUNCTION BButtonEnabled%(stButtonName$)
+DECLARE FUNCTION BListboxExists%(stListbox$)
+DECLARE FUNCTION WGetListboxItemCount%(stListbox$)
+DECLARE FUNCTION BListboxItemExists%(stListbox$, stListboxItem$)
+DECLARE FUNCTION SGetListboxItemText$(stListbox$)
+DECLARE FUNCTION BComboBoxExists%(stComboBox$)
+DECLARE FUNCTION WGetComboBoxItemCount%(stComboBox$)
+DECLARE FUNCTION BComboBoxItemExists%(stComboBox$, stComboBoxItem$)
+DECLARE FUNCTION SGetComboBoxItemText$(stComboBox$)
+DECLARE FUNCTION BCheckboxExists%(stCheckbox$)
+DECLARE FUNCTION BCheckboxChecked%(stCheckbox$)
+DECLARE FUNCTION BCheckboxEnabled%(stCheckbox$)
+DECLARE FUNCTION BEditTextExists%(stEditText$)
+DECLARE FUNCTION SGetEditText$(stEditCaption$)
+DECLARE FUNCTION BRadiobuttonExists%(stRadiobutton$)
+DECLARE FUNCTION BRadiobuttonEnabled%(stRadiobutton$)
+DECLARE FUNCTION BRadiobuttonChecked%(stRadiobutton$)
+
+'Prototypes from FTestKey.mst
+DECLARE SUB XKey (s$)
+DECLARE SUB XAlt (s$)
+DECLARE SUB XCtrl (s$)
+DECLARE SUB XShift (s$)
+DECLARE SUB XCtrlAlt (s$)
+DECLARE SUB XAltShift (s$)
+DECLARE SUB XCtrlShift (s$)
+DECLARE SUB XCtrlAltShift (s$)
+DECLARE SUB XText(s$)
+DECLARE SUB XEnter(s$)
+DECLARE SUB XSelectMenuItem(stMenu$,stMenuItem$,stHMenuItem$)
+DECLARE SUB XMenuItemExists(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE SUB XMenuItemNotExists(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE SUB XMenuItemGrayed(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE SUB XMenuItemNotGrayed(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE SUB XMenuItemChecked(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE SUB XMenuItemNotChecked(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE SUB XMenuItemEnabled(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE SUB XMenuItemNotEnabled(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE SUB XCaptionExists(stCaption$)
+DECLARE SUB XCaptionNotExists(stCaption$)
+DECLARE SUB XZoomWindow
+DECLARE SUB XMaxWindow
+DECLARE SUB XWindowMaximized
+DECLARE SUB XWindowNotMaximized
+DECLARE SUB XMinWindow
+DECLARE SUB XWindowMinimized
+DECLARE SUB XWindowNotMinimized
+DECLARE SUB XRestoreWindow
+DECLARE SUB XSizeActiveWindow (iXPixels%, iYPixels%, fAbsOrRel%)
+DECLARE SUB XMoveActiveWindow (iXPixels%, iYPixels%, fAbsOrRel%)
+DECLARE FUNCTION SKeyString$(s$)
+DECLARE FUNCTION SHideKeys$(s$)
+DECLARE FUNCTION BMenuItemExists%(stMenu$,stMenuItem$,stHMenuItem$)
+DECLARE FUNCTION IGetMenuCount%(stMenu$, stMenuItem$)
+DECLARE FUNCTION SGetMenuItemText$(stMenu$,stMenuItem$, iIndex%)
+DECLARE FUNCTION BMenuItemGrayed%(stMenu$, stMenuItem$, stHMenuItem$)
+DECLARE FUNCTION BMenuItemChecked%(stMenu$, stMenuItem$, stHMenuItem$)
+DECLARE FUNCTION BMenuItemEnabled%(stMenu$,stMenuItem$, stHMenuItem$)
+DECLARE FUNCTION SGetCaption$()
+DECLARE FUNCTION BWindowMaximized%
+DECLARE FUNCTION BWindowMinimized%
+
+'Prototypes from FTestUtl.mst
+DECLARE SUB XFileExist(stFileSpec$)
+DECLARE SUB XFileNotExist(stFileSpec$)
+DECLARE SUB XFileCmp(stFileSpec1$,stFileSpec2$)
+DECLARE SUB XFileNotCmp(stFileSpec1$,stFileSpec2$)
+DECLARE SUB XDeleteFile(stFileSpec$)
+DECLARE SUB XDeleteFileIfExist(stFileSpec$)
+DECLARE SUB XCreateFile(stFileSpec$,s$)
+DECLARE SUB XAppendFile(stFileSpec$,s$)
+DECLARE SUB XWaitMessageFile(s$,Message$, WaitTime%)
+DECLARE SUB XCWDCmp(s$)
+DECLARE SUB XCWDNotCmp(s$)
+DECLARE SUB XDriveCmp(s$)
+DECLARE SUB XDriveNotCmp(s$)
+DECLARE SUB XChangeCWD(s$)
+DECLARE SUB XChangeDrive(s$)
+DECLARE SUB XStartApp(stAppName$, stClassname$)
+DECLARE SUB XSetCleanup (sCleanup$)
+DECLARE SUB XDoCleanup
+DECLARE SUB XMoveMouse (x%, y%)
+DECLARE SUB XClick(button%, x%, y%)
+DECLARE SUB XDblClick (button%, x%, y%)
+DECLARE SUB XDragMouse (button%, x%, y%)
+DECLARE SUB XClipBoardCmp (s$)
+DECLARE FUNCTION BFileExist%(stFileSpec$)
+DECLARE FUNCTION BFileCmp%(stFileSpec1$,stFileSpec2$)
+DECLARE FUNCTION BCWDCmp%(s$)
+DECLARE FUNCTION BDriveCmp%(s$)
+DECLARE FUNCTION HStartApp%(stAppName$)
+DECLARE FUNCTION HFindApplication%(stCaption$)
+DECLARE FUNCTION SStripNull$(target$)
+
+
+'$INCLUDE 'FTestLog.mst'
+'$INCLUDE 'FTestKey.mst'
+'$INCLUDE 'FTestUtl.mst'
+
+
+' These routines have to be after the above includes so that
+' the functions used are declared
+
+ON END XDoCleanup
+
+' Set a UAE trap and log failure if one occurs
+
+TRAP UAETrap FROM "TESTDRVR.EXE"
+ XSetTerminate TRUE
+ XLogFailure "Application UAEed"
+END TRAP
+
+' in the FastTest code, gErrorType will be set to one of the following
+' CASE items to be handled and set back to EC_NOTHING when the particular
+' place where an error could occur is past.
+ON ERROR GOTO XErrorHandler
+
+GOTO UsersCode
+
+XErrorHandler:
+
+ SELECT CASE gErrorType
+ CASE 0
+ XSetTerminate TRUE
+ XLogFailure "Internal FastTest Error" ' catch undeclared ET vars
+ CASE ET_NOTHING
+ XSetTerminate TRUE
+ XLogFailure "Unexpected RunTime error;" + ERF + ":" + STR$(ERR) + " " + ERROR$(ERR)
+ CASE ET_NEXT
+ ' Code that uses this will check the global error variable
+ ' and log an appropriate error if one occurred
+ gfError = TRUE
+ RESUME NEXT
+ CASE ET_LOG
+ Print "****** A Log error occurred ******"
+ Pause "****** A Log error occurred ******"
+
+ END
+
+ END SELECT
+ XSetTerminate TRUE
+ XLogFailure "Internal FastTest error"
+
+
+UsersCode:
diff --git a/private/oleauto/tools/win16/os2/inc/fcntl.h b/private/oleauto/tools/win16/os2/inc/fcntl.h
new file mode 100644
index 000000000..15aeb9b31
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/fcntl.h
@@ -0,0 +1,54 @@
+/***
+*fcntl.h - file control options used by open()
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines constants for the file control options used
+* by the open() function.
+* [System V]
+*
+****/
+
+#ifndef _INC_FCNTL
+
+#define _O_RDONLY 0x0000 /* open for reading only */
+#define _O_WRONLY 0x0001 /* open for writing only */
+#define _O_RDWR 0x0002 /* open for reading and writing */
+#define _O_APPEND 0x0008 /* writes done at eof */
+
+#define _O_CREAT 0x0100 /* create and open file */
+#define _O_TRUNC 0x0200 /* open and truncate */
+#define _O_EXCL 0x0400 /* open only if file doesn't already exist */
+
+/* _O_TEXT files have <cr><lf> sequences translated to <lf> on read()'s,
+** and <lf> sequences translated to <cr><lf> on write()'s
+*/
+
+#define _O_TEXT 0x4000 /* file mode is text (translated) */
+#define _O_BINARY 0x8000 /* file mode is binary (untranslated) */
+
+/* macro to translate the C 2.0 name used to force binary mode for files */
+
+#define _O_RAW _O_BINARY
+
+/* Open handle inherit bit */
+
+#define _O_NOINHERIT 0x0080 /* child process doesn't inherit file */
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define O_RDONLY _O_RDONLY
+#define O_WRONLY _O_WRONLY
+#define O_RDWR _O_RDWR
+#define O_APPEND _O_APPEND
+#define O_CREAT _O_CREAT
+#define O_TRUNC _O_TRUNC
+#define O_EXCL _O_EXCL
+#define O_TEXT _O_TEXT
+#define O_BINARY _O_BINARY
+#define O_NOINHERIT _O_NOINHERIT
+#endif
+
+#define _INC_FCNTL
+#endif /* _INC_FCNTL */
diff --git a/private/oleauto/tools/win16/os2/inc/file.lst b/private/oleauto/tools/win16/os2/inc/file.lst
new file mode 100644
index 000000000..0cc293a0e
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/file.lst
@@ -0,0 +1,34 @@
+assert
+bios
+conio
+ctype
+direct
+dos
+errno
+fcntl
+float
+graph
+io
+limits
+locale
+malloc
+math
+memory
+pgchart
+process
+search
+setjmp
+share
+signal
+stdarg
+stddef
+stdio
+stdlib
+string
+time
+varargs
+sys\locking
+sys\stat
+sys\timeb
+sys\types
+sys\utime
diff --git a/private/oleauto/tools/win16/os2/inc/float.h b/private/oleauto/tools/win16/os2/inc/float.h
new file mode 100644
index 000000000..cada3a485
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/float.h
@@ -0,0 +1,213 @@
+/***
+*float.h - constants for floating point values
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains defines for a number of implementation dependent
+* values which are commonly used by sophisticated numerical (floating
+* point) programs.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_FLOAT
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#define DBL_DIG 15 /* # of decimal digits of precision */
+#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
+#define DBL_MANT_DIG 53 /* # of bits in mantissa */
+#define DBL_MAX 1.7976931348623158e+308 /* max value */
+#define DBL_MAX_10_EXP 308 /* max decimal exponent */
+#define DBL_MAX_EXP 1024 /* max binary exponent */
+#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
+#define DBL_MIN_10_EXP (-307) /* min decimal exponent */
+#define DBL_MIN_EXP (-1021) /* min binary exponent */
+#define _DBL_RADIX 2 /* exponent radix */
+#define _DBL_ROUNDS 1 /* addition rounding: near */
+
+#define FLT_DIG 6 /* # of decimal digits of precision */
+#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
+#define FLT_GUARD 0
+#define FLT_MANT_DIG 24 /* # of bits in mantissa */
+#define FLT_MAX 3.402823466e+38F /* max value */
+#define FLT_MAX_10_EXP 38 /* max decimal exponent */
+#define FLT_MAX_EXP 128 /* max binary exponent */
+#define FLT_MIN 1.175494351e-38F /* min positive value */
+#define FLT_MIN_10_EXP (-37) /* min decimal exponent */
+#define FLT_MIN_EXP (-125) /* min binary exponent */
+#define FLT_NORMALIZE 0
+#define FLT_RADIX 2 /* exponent radix */
+#define FLT_ROUNDS 1 /* addition rounding: near */
+
+#define LDBL_DIG 18 /* # of decimal digits of precision */
+#define LDBL_EPSILON 1.084202172485504434e-019L /* smallest such that 1.0+LDBL_EPSILON != 1.0 */
+#define LDBL_MANT_DIG 64 /* # of bits in mantissa */
+#define LDBL_MAX 1.189731495357231765e+4932L /* max value */
+#define LDBL_MAX_10_EXP 4932 /* max decimal exponent */
+#define LDBL_MAX_EXP 16384 /* max binary exponent */
+#define LDBL_MIN 3.3621031431120935063e-4932L /* min positive value */
+#define LDBL_MIN_10_EXP (-4931) /* min decimal exponent */
+#define LDBL_MIN_EXP (-16381) /* min binary exponent */
+#define _LDBL_RADIX 2 /* exponent radix */
+#define _LDBL_ROUNDS 1 /* addition rounding: near */
+
+
+/*
+ * 8087/80287 math control information
+ */
+
+
+/* User Control Word Mask and bit definitions.
+ * These definitions match the 8087/80287
+ */
+
+#define _MCW_EM 0x003f /* interrupt Exception Masks */
+#define _EM_INVALID 0x0001 /* invalid */
+#define _EM_DENORMAL 0x0002 /* denormal */
+#define _EM_ZERODIVIDE 0x0004 /* zero divide */
+#define _EM_OVERFLOW 0x0008 /* overflow */
+#define _EM_UNDERFLOW 0x0010 /* underflow */
+#define _EM_INEXACT 0x0020 /* inexact (precision) */
+
+#define _MCW_IC 0x1000 /* Infinity Control */
+#define _IC_AFFINE 0x1000 /* affine */
+#define _IC_PROJECTIVE 0x0000 /* projective */
+
+#define _MCW_RC 0x0c00 /* Rounding Control */
+#define _RC_CHOP 0x0c00 /* chop */
+#define _RC_UP 0x0800 /* up */
+#define _RC_DOWN 0x0400 /* down */
+#define _RC_NEAR 0x0000 /* near */
+
+#define _MCW_PC 0x0300 /* Precision Control */
+#define _PC_24 0x0000 /* 24 bits */
+#define _PC_53 0x0200 /* 53 bits */
+#define _PC_64 0x0300 /* 64 bits */
+
+
+/* initial Control Word value */
+
+#define _CW_DEFAULT ( _IC_AFFINE + _RC_NEAR + _PC_64 + _EM_DENORMAL + _EM_UNDERFLOW + _EM_INEXACT )
+
+
+/* user Status Word bit definitions */
+
+#define _SW_INVALID 0x0001 /* invalid */
+#define _SW_DENORMAL 0x0002 /* denormal */
+#define _SW_ZERODIVIDE 0x0004 /* zero divide */
+#define _SW_OVERFLOW 0x0008 /* overflow */
+#define _SW_UNDERFLOW 0x0010 /* underflow */
+#define _SW_INEXACT 0x0020 /* inexact (precision) */
+
+
+/* invalid subconditions (_SW_INVALID also set) */
+
+#define _SW_UNEMULATED 0x0040 /* unemulated instruction */
+#define _SW_SQRTNEG 0x0080 /* square root of a neg number */
+#define _SW_STACKOVERFLOW 0x0200 /* FP stack overflow */
+#define _SW_STACKUNDERFLOW 0x0400 /* FP stack underflow */
+
+
+/* Floating point error signals and return codes */
+
+#define _FPE_INVALID 0x81
+#define _FPE_DENORMAL 0x82
+#define _FPE_ZERODIVIDE 0x83
+#define _FPE_OVERFLOW 0x84
+#define _FPE_UNDERFLOW 0x85
+#define _FPE_INEXACT 0x86
+
+#define _FPE_UNEMULATED 0x87
+#define _FPE_SQRTNEG 0x88
+#define _FPE_STACKOVERFLOW 0x8a
+#define _FPE_STACKUNDERFLOW 0x8b
+
+#define _FPE_EXPLICITGEN 0x8c /* raise( SIGFPE ); */
+
+
+/* function prototypes */
+
+unsigned int __cdecl _clear87(void);
+unsigned int __cdecl _control87(unsigned int, unsigned int);
+void __cdecl _fpreset(void);
+unsigned int __cdecl _status87(void);
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define DBL_RADIX _DBL_RADIX
+#define DBL_ROUNDS _DBL_ROUNDS
+
+#define LDBL_RADIX _LDBL_RADIX
+#define LDBL_ROUNDS _LDBL_ROUNDS
+
+#define MCW_EM _MCW_EM
+#define EM_INVALID _EM_INVALID
+#define EM_DENORMAL _EM_DENORMAL
+#define EM_ZERODIVIDE _EM_ZERODIVIDE
+#define EM_OVERFLOW _EM_OVERFLOW
+#define EM_UNDERFLOW _EM_UNDERFLOW
+#define EM_INEXACT _EM_INEXACT
+
+#define MCW_IC _MCW_IC
+#define IC_AFFINE _IC_AFFINE
+#define IC_PROJECTIVE _IC_PROJECTIVE
+
+#define MCW_RC _MCW_RC
+#define RC_CHOP _RC_CHOP
+#define RC_UP _RC_UP
+#define RC_DOWN _RC_DOWN
+#define RC_NEAR _RC_NEAR
+
+#define MCW_PC _MCW_PC
+#define PC_24 _PC_24
+#define PC_53 _PC_53
+#define PC_64 _PC_64
+
+#define CW_DEFAULT _CW_DEFAULT
+
+#define SW_INVALID _SW_INVALID
+#define SW_DENORMAL _SW_DENORMAL
+#define SW_ZERODIVIDE _SW_ZERODIVIDE
+#define SW_OVERFLOW _SW_OVERFLOW
+#define SW_UNDERFLOW _SW_UNDERFLOW
+#define SW_INEXACT _SW_INEXACT
+
+#define SW_UNEMULATED _SW_UNEMULATED
+#define SW_SQRTNEG _SW_SQRTNEG
+#define SW_STACKOVERFLOW _SW_STACKOVERFLOW
+#define SW_STACKUNDERFLOW _SW_STACKUNDERFLOW
+
+#define FPE_INVALID _FPE_INVALID
+#define FPE_DENORMAL _FPE_DENORMAL
+#define FPE_ZERODIVIDE _FPE_ZERODIVIDE
+#define FPE_OVERFLOW _FPE_OVERFLOW
+#define FPE_UNDERFLOW _FPE_UNDERFLOW
+#define FPE_INEXACT _FPE_INEXACT
+
+#define FPE_UNEMULATED _FPE_UNEMULATED
+#define FPE_SQRTNEG _FPE_SQRTNEG
+#define FPE_STACKOVERFLOW _FPE_STACKOVERFLOW
+#define FPE_STACKUNDERFLOW _FPE_STACKUNDERFLOW
+
+#define FPE_EXPLICITGEN _FPE_EXPLICITGEN
+
+#endif /* __STDC__ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_FLOAT
+#endif /* _INC_FLOAT */
diff --git a/private/oleauto/tools/win16/os2/inc/fstream.h b/private/oleauto/tools/win16/os2/inc/fstream.h
new file mode 100644
index 000000000..c8f78fc39
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/fstream.h
@@ -0,0 +1,132 @@
+/***
+*fstream.h - definitions/declarations for filebuf and fstream classes
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the filebuf and fstream classes.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_FSTREAM
+#define _INC_FSTREAM
+
+#include <iostream.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+typedef int filedesc;
+
+class filebuf : public streambuf {
+public:
+static const int openprot; /* default share/prot mode for open */
+
+// optional share values for 3rd argument (prot) of open or constructor
+static const int sh_compat; /* compatibility share mode */
+static const int sh_none; /* exclusive mode no sharing */
+static const int sh_read; /* allow read sharing */
+static const int sh_write; /* allow write sharing */
+// use (sh_read | sh_write) to allow both read and write sharing
+
+// options for setmode member function
+static const int binary;
+static const int text;
+
+ filebuf();
+ filebuf(filedesc);
+ filebuf(filedesc, char *, int);
+ ~filebuf();
+
+ filebuf* attach(filedesc);
+ filedesc fd() const { return (x_fd==-1) ? EOF : x_fd; }
+ int is_open() const { return (x_fd!=-1); }
+ filebuf* open(const char *, int, int = filebuf::openprot);
+ filebuf* close();
+ int setmode(int = filebuf::text);
+
+virtual int overflow(int=EOF);
+virtual int underflow();
+
+virtual streambuf* setbuf(char*, int);
+virtual streampos seekoff(streamoff, ios::seek_dir, int);
+// virtual streampos seekpos(streampos, int);
+virtual int sync();
+
+private:
+ filedesc x_fd;
+ int x_fOpened;
+};
+
+class ifstream : public istream {
+public:
+ ifstream();
+ ifstream(const char *, int =ios::in, int = filebuf::openprot);
+ ifstream(filedesc);
+ ifstream(filedesc, char *, int);
+ ~ifstream();
+
+ streambuf * setbuf(char *, int);
+ filebuf* rdbuf() const { return (filebuf*) ios::rdbuf(); }
+
+ void attach(filedesc);
+ filedesc fd() const { return rdbuf()->fd(); }
+
+ int is_open() const { return rdbuf()->is_open(); }
+ void open(const char *, int =ios::in, int = filebuf::openprot);
+ void close();
+ int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
+};
+
+class ofstream : public ostream {
+public:
+ ofstream();
+ ofstream(const char *, int =ios::out, int = filebuf::openprot);
+ ofstream(filedesc);
+ ofstream(filedesc, char *, int);
+ ~ofstream();
+
+ streambuf * setbuf(char *, int);
+ filebuf* rdbuf() const { return (filebuf*) ios::rdbuf(); }
+
+ void attach(filedesc);
+ filedesc fd() const { return rdbuf()->fd(); }
+
+ int is_open() const { return rdbuf()->is_open(); }
+ void open(const char *, int =ios::out, int = filebuf::openprot);
+ void close();
+ int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
+};
+
+class fstream : public iostream {
+public:
+ fstream();
+ fstream(const char *, int, int = filebuf::openprot);
+ fstream(filedesc);
+ fstream(filedesc, char *, int);
+ ~fstream();
+
+ streambuf * setbuf(char *, int);
+ filebuf* rdbuf() const { return (filebuf*) ostream::rdbuf(); }
+
+ void attach(filedesc);
+ filedesc fd() const { return rdbuf()->fd(); }
+
+ int is_open() const { return rdbuf()->is_open(); }
+ void open(const char *, int, int = filebuf::openprot);
+ void close();
+ int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
+};
+
+// manipulators to dynamically change file access mode (filebufs only)
+inline ios& binary(ios& _fstrm) \
+ { ((filebuf*)_fstrm.rdbuf())->setmode(filebuf::binary); return _fstrm; }
+inline ios& text(ios& _fstrm) \
+ { ((filebuf*)_fstrm.rdbuf())->setmode(filebuf::text); return _fstrm; }
+
+// Restore default packing
+#pragma pack()
+
+#endif // !_INC_FSTREAM
diff --git a/private/oleauto/tools/win16/os2/inc/ftestkey.mst b/private/oleauto/tools/win16/os2/inc/ftestkey.mst
new file mode 100644
index 000000000..ab089a3e3
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ftestkey.mst
@@ -0,0 +1,1061 @@
+'FTestKey.inc - definitions for Fast Test Key, Menu and Window routines
+'
+' Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+'
+'Purpose:
+' This file defines the Key, Menu and Window functions of the Fast Test
+' functionality
+'
+
+
+'**********************************************************
+'***************** Keystroke Subroutines ******************
+'**********************************************************
+
+' support routine for other subroutines, not meant to be called
+' except by fasttest routines
+'
+FUNCTION SKeyString$(s$)
+ DIM sTemp$
+
+ IF LEN(s$) = 0 THEN
+ XLogFailure "zero length string passed to SKeyString$"
+ END IF
+
+ IF LEN(s$) = 1 THEN
+ SELECT CASE ASC(s$)
+
+ ' alphanumerics, pass along as given
+ CASE ASC("a") to ASC("z"), ASC("A") to ASC("Z"), ASC("0") to ASC("9")
+ sTemp$ = s$
+
+ ' special characters to Dokeys, surround with braces
+ CASE ASC("+"),ASC("^"),ASC("%"), ASC("{"),ASC("}"),ASC("("),ASC(")"),ASC("["),ASC("]")
+ sTemp$ = "{" + s$ + "}"
+
+ ' normal printable non-alphanumerics, pass along
+ CASE ASC("~"),ASC("!"),ASC("@"),ASC("#"),ASC("$"),ASC("&")
+ sTemp$ = s$
+
+ CASE ASC("*"),ASC("_"),ASC("|"),ASC(""""),ASC("<"),ASC(">")
+ sTemp$ = s$
+
+ CASE ASC("-"),ASC("="),ASC("\"),ASC(";"),ASC("'"),ASC(":")
+ sTemp$ =s$
+
+ CASE ASC(","),ASC("."),ASC("/"),ASC(" "),ASC("?"),ASC("`")
+ sTemp$ =s$
+
+ ' non-printable other character
+ CASE ELSE
+ XLogFailure "Bad character passed to SKeyString$"
+
+ END SELECT
+
+ ELSE
+ ' the string is greater than 1 character in length, put braces
+ ' around it and send it to Dokeys and let it parse it
+ sTemp$ = "{" + s$ + "}"
+ END IF
+ SKeyString$ = "(" + sTemp$ + ")"
+END FUNCTION
+
+' support routine for other subroutines, not meant to be called
+' except by fasttest routines
+'
+FUNCTION SHideKeys$(s$)
+ DIM check$
+ DIM i%
+ DIM stRet$
+ ' this code must hide each character that is special to DoKeys
+
+ stRet$ = "" ' start empty
+ FOR i% = 1 to LEN(s$)
+ ' special characters to DoKeys, surround with braces
+ check$ = mid$(s$,i%,1)
+ IF check$ = "+" OR check$ = "^" OR check$ = "%" OR check$ = "{" OR check$ = "}" OR check$ = "(" OR check$ = ")" OR check$ = "[" OR check$ = "]" THEN
+ stRet$ = stRet$ + "{" + check$ + "}"
+ ELSE
+ stRet$ = stRet$ + check$
+ END IF
+ NEXT i%
+ SHideKeys$ = stRet$
+END FUNCTION
+
+' XKey(string)
+' Send Keystroke to active application
+' This uses DoKeys, so DoKeys syntax is allowed
+' ex XKey "F" uppercase character f
+' XKey "f" lowercase character f
+' XKey "enter" see DoKeys document for list of special word translations
+
+SUB XKey (s$)
+ DoKeys SKeyString$(s$)
+
+END SUB
+
+
+' XAlt(string)
+' send keystroke as IF alt key pressed at same time
+' ex XAlt "a"
+' XAlt "f"
+
+SUB XAlt (s$)
+ DoKeys "%" + SKeyString$(s$)
+
+END SUB
+
+' XCtrl(string)
+' send keystroke as IF Ctrl key pressed at same time
+' ex XCtrl "a"
+
+SUB XCtrl (s$)
+ DoKeys "^" + SKeyString$(s$)
+END SUB
+
+' XShift(string)
+' send keystroke as IF Shift key pressed at same time
+' ex XShift "a"
+' XShift "f" same as XShift "f"
+
+SUB XShift (s$)
+ DoKeys "+" + SKeyString$(s$)
+
+END SUB
+
+
+' XCtrlAlt(string)
+' send keystroke as IF Ctrl and XAlt key pressed at same time
+' ex XCtrlAlt "a"
+' XCtrlAlt "f"
+
+SUB XCtrlAlt (s$)
+ DoKeys "^%" + SKeyString$(s$)
+END SUB
+
+' XAltShift(string)
+' send keystroke as IF XAlt and Shift key pressed at same time
+' ex XAltShift "a"
+' XAltShift "f" same as XAltShift "f"
+
+SUB XAltShift (s$)
+ DoKeys "%+" + SKeyString$(s$)
+END SUB
+
+' XCtrlShift(string)
+' send keystroke as IF Ctrl and Shift key pressed at same time
+' ex XCtrlShift "a"
+' XCtrlShift "f" same as XCtrlShift "f"
+
+SUB XCtrlShift (s$)
+ DoKeys "^+" + SKeyString$(s$)
+END SUB
+
+' XCtrlAltShift(string)
+' send keystroke as IF XCtrlAlt, XAlt and Shift key pressed at same time
+' ex XCtrlAltShift "a"
+' XCtrlAltShift "f" same as XCtrlAltShift "f"
+
+SUB XCtrlAltShift (s$)
+ DoKeys "^%+" + SKeyString$(s$)
+
+END SUB
+
+
+'XText(string)
+' send multiple characters to app
+' ex XText "hello world"
+
+SUB XText(s$)
+ DoKeys SHideKeys$(s$)
+END SUB
+
+
+'XEnter(string)
+' send multiple characters to app followed by enter
+' ex XEnter "hello world"
+
+SUB XEnter(s$)
+ DoKeys SHideKeys$(s$) + "{enter}"
+END SUB
+
+
+
+
+
+'**********************************************************
+'***************** Menu Subroutines ***********************
+'**********************************************************
+
+
+
+'
+' XSelectMenuItem(stMenu, stMenuItem, stHMenuItem)
+'
+' Description: This procedure selects (equivalent to a mouse
+' click or keyboard access) the specified menu item
+' name. fMouseOrKey specifies the access method.
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+' fMouseOrKey = access method, default is true(fgMouse).
+' Returns: Nothing.
+' Example: XSelectMenuItem "Edit", "Copy",""
+'
+'
+SUB XSelectMenuItem(stMenu$,stMenuItem$,stHMenuItem$)
+ XMenuItemExists stMenu$,stMenuItem$,stHMenuItem$
+
+ WMenu(stMenu$)
+ IF stMenuItem$ <> "" THEN
+ WMenu(stMenuItem$)
+ END IF
+ IF stHMenuItem$ <> "" THEN 'If popup menu is to be selected
+ WMenu(stHMenuItem$) 'Select menu item under popup menu.
+ END IF
+
+END SUB
+
+
+
+'
+' BMenuItemExists(stMenu, stMenuItem, stHMenuItem)
+'
+' Description: This procedure checks for the specified menu item
+' and returns true IF found, false IF not found.
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to check or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+' Returns: -1(true): Found menu item.
+' 0(false): Couldn't find menu item.
+' Example: FSuccess% = BMenuItemExists("File", "", "")
+' fSuccess% = BMenuItemExists("FIle","Edit", "")
+'
+'
+FUNCTION BMenuItemExists%(stMenu$,stMenuItem$,stHMenuItem$)
+
+ IF stHMenuItem$ = "" THEN
+ IF stMenuItem$ = "" THEN
+ BMenuItemExists = WMenuExists(stMenu$) <> 0
+ ELSE
+ WMenu(stMenu$)
+ BMenuItemExists = WMenuExists(stMenuItem$) <> 0
+ END IF
+ ELSE
+ WMenu(stMenu$)
+ WMenu(stMenuItem$)
+ BMenuItemExists = WMenuExists(stHMenuItem$) <> 0
+ END IF
+ DoKeys "{esc 3}" 'Make sure you close menu.
+
+END FUNCTION
+
+
+'
+' XMenuItemExists (stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description:
+' Reports error IF menu item does not exist.
+'
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+'
+' Returns: nothing
+'
+' Example: XMenuItemExists "File", "Close", ""
+'
+'
+'
+SUB XMenuItemExists(stMenu$,stMenuItem$, stHMenuItem$)
+ IF BMenuItemExists(stMenu$,stMenuItem$, stHMenuItem$) = 0 THEN
+ XLogFailure stMenu$ + " " + stMenuItem$ + " " + stHMenuItem$ + " does not Exist"
+ END IF
+END SUB
+
+
+'
+' XMenuItemNotExists (stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description:
+' Reports error IF menu item exist.
+'
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+'
+' Returns: nothing
+'
+' Example: XMenuItemNotExists "File", "Close", ""
+'
+'
+'
+
+SUB XMenuItemNotExists(stMenu$,stMenuItem$, stHMenuItem$)
+ IF BMenuItemExists(stMenu$,stMenuItem$, stHMenuItem$) THEN
+ XLogFailure stMenu$ + " " + stMenuItem$ + " " + stHMenuItem$ + " Exists"
+ END IF
+END SUB
+
+
+
+'
+' IGetMenuCount(stMenu, stMenuItem)
+'
+' Description: This procedure returns the number of menu items
+' in the specified menu.
+' Parameters: stMenu = top level menu to count menu items in.
+' IF stMenu = "", THEN counts items in the menu bar(counts the
+' number of top level menus).
+' stMenuItem = secondary menu to count menu items in; counts hierarchial
+' menu items.
+' Returns: An integer; the number of menu items found.
+' Example: iHowMany% = IGetMenuCount("","") returns how many top level menus.
+' iHowMany% = IGetMenuCount("Utilities", "") returns the number of menu items
+' in the "Utilities" menu.
+' iHowMany% = IGetMenuCount("Utilities", "Info") returns how many menu items
+' in the popup menu "Info".
+'
+'
+FUNCTION IGetMenuCount%(stMenu$, stMenuItem$)
+
+ IF stMenuItem$ <> "" THEN 'Count in menu items in hierarchial menu.
+ WMenu(stMenu$)
+ WMenu(stMenuItem$)
+ IGetMenuCount = WMenuCount() 'Count the number of menus items in the popup
+ 'menu.
+ ELSE
+ IF stMenu$ <> "" THEN 'Count menus in stMenu$.
+ WMenu(stMenu$)
+ IGetMenuCount = WMenuCount() 'Count the number of menus items in the menu.
+ ELSE
+ IGetMenuCount = WMenuCount() 'Count the number of menus in the menu bar if.
+ 'the above "IF" statements are skipped.
+ END IF
+ END IF
+ DoKeys "{esc 3}" 'Make sure you close menu.
+
+END FUNCTION
+
+
+
+'
+' SGetMenuItemText(stMenu, stMenuItem, iIndex)
+'
+' Description: This procedure returns the text of menu item, iIndex
+' (base 1) in stMenu. Length of the buffer to store
+' the menu item text is passed in.
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to check or secondary menu, IF Hierarchial menu
+' exists.
+' iIndex = index of menu item in stMenu.
+' iLength = length of buffer to store text
+' Returns: a string, the menu item text(name).
+' Example: Print SGetMenuItemText("","","", 3) gets name of 3rd menu.
+' Print SGetMenuItemText("Utilities","","",3) gets name of 3rd menu item
+' in the "Utilities" menu.
+' Print SGetMenuItemText("Utilities","Info",3) gets name of 3rd menu item
+' in the popup menu "Info".
+'
+'
+FUNCTION SGetMenuItemText$(stMenu$,stMenuItem$, iIndex%)
+ DIM buffer$
+
+ buffer$ = String$(128,32) 'initialize with spaces.
+ IF stMenuItem$ <> "" THEN 'get menu text from hierarchial menu.
+ WMenu(stMenu$)
+ WMenu(stMenuItem$)
+ ELSE
+ IF stMenu$ <> "" THEN 'get menu text from stMenu$.
+ WMenu(stMenu$)
+ END IF
+ END IF
+ WMenuText iIndex%, buffer$ 'get menu text. IF above "IF" condition
+ 'is skipped, this gets text in menu bar.
+ buffer$ = SStripNull(buffer$) 'remove null character.
+ SGetMenuItemText = buffer$ 'return buffer$
+ buffer$ = ""
+ DoKeys "{esc 3}" 'Make sure you close menu.
+
+END FUNCTION
+
+
+
+'
+' FIsMenuItemGrayed(stMenu$, stMenuItem$,stHMenuItem$)
+'
+' Description: This procedure checks to see IF the specified menu or
+' menu item is grayed out or not.
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+' Returns: -1(true): IF grayed.
+' 0(false): IF not grayed.
+' Example:
+' fIsGrayed% = BMenuItemGrayed("Edit", "Copy", "")
+' fIsGrayed% = BMenuItemGrayed("Edit", "", "")
+'
+'
+FUNCTION BMenuItemGrayed%(stMenu$, stMenuItem$, stHMenuItem$)
+
+ IF stHMenuItem$ = "" THEN
+ IF stMenuItem$ = "" THEN
+ BMenuItemGrayed = WMenuGrayed(stMenu$) <> 0 'Check main menu bar menu items.
+ ELSE
+ WMenu(stMenu$) 'Check menu item within stMenuItem$.
+ BMenuItemGrayed = WMenuGrayed(stMenuItem$) <> 0
+ END IF
+ ELSE
+ WMenu(stMenu$) 'Check popup menu items.
+ WMenu(stMenuItem$)
+ BMenuItemGrayed = WMenuGrayed(stHMenuItem$) <> 0
+ END IF
+ DoKeys "{esc 3}" 'Make sure you close menu.
+
+END FUNCTION
+
+
+'
+' XMenuItemGrayed (stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description:
+' Reports error IF menu item is not Grayed.
+'
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+'
+' Returns: nothing
+'
+' Example: XMenuItemGrayed "File", "Close", ""
+'
+'
+'
+
+SUB XMenuItemGrayed(stMenu$,stMenuItem$, stHMenuItem$)
+ IF BMenuItemGrayed(stMenu$,stMenuItem$, stHMenuItem$) = 0 THEN
+ XLogFailure stMenu$ + " " + stMenuItem$ + " " + stHMenuItem$ + " is not Grayed"
+ END IF
+END SUB
+
+'
+' XMenuItemNotGrayed (stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description:
+' Reports error IF menu item is Grayed.
+'
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+'
+' Returns: nothing
+'
+' Example: XMenuItemNotGrayed "File", "Close", ""
+'
+'
+'
+
+SUB XMenuItemNotGrayed(stMenu$,stMenuItem$, stHMenuItem$)
+ IF BMenuItemGrayed(stMenu$,stMenuItem$, stHMenuItem$) THEN
+ XLogFailure stMenu$ + " " + stMenuItem$ + " " + stHMenuItem$ + " is Grayed"
+ END IF
+END SUB
+
+
+
+'
+' BMenuItemChecked(stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description: This procedure checks to see IF the specified menu
+' item is checked or not.
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+' Returns: -1(true): IF checked.
+' 0(false): IF not checked.
+' Example: fIsChecked% = BMenuItemChecked("Format","Style","Bold")
+' fIsChecked% = BMenuItemchecked("Edit", "Copy", "")
+'
+'
+FUNCTION BMenuItemChecked%(stMenu$, stMenuItem$, stHMenuItem$)
+
+ IF stHMenuItem$ = "" THEN
+ WMenu(stMenu$) 'Check menu item within stMenu$.
+ BMenuItemChecked = WMenuChecked(stMenuItem$) <> 0
+ ELSE
+ WMenu(stMenu$) 'Check menu item under popup menu.
+ WMenu(stMenuItem$)
+ BMenuItemChecked = WMenuChecked(stHMenuItem$) <> 0
+ END IF
+ DoKeys "{esc 3}" 'Make sure you close menu.
+
+END FUNCTION
+
+
+
+'
+' XMenuItemChecked (stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description:
+' Reports error IF menu item is not Checked.
+'
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+'
+' Returns: nothing
+'
+' Example: XMenuItemChecked "Options", "Read Only", ""
+'
+'
+'
+SUB XMenuItemChecked(stMenu$,stMenuItem$, stHMenuItem$)
+ IF BMenuItemChecked(stMenu$,stMenuItem$, stHMenuItem$) = 0 THEN
+ XLogFailure stMenu$ + " " + stMenuItem$ + " " + stHMenuItem$ + " is not Checked"
+ END IF
+END SUB
+
+'
+' XMenuItemNotChecked (stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description:
+' Reports error IF menu item is Checked.
+'
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+'
+' Returns: nothing
+'
+' Example: XMenuItemNotChecked "Options", "Read Only", ""
+'
+'
+'
+SUB XMenuItemNotChecked(stMenu$,stMenuItem$, stHMenuItem$)
+ IF BMenuItemChecked(stMenu$,stMenuItem$, stHMenuItem$) THEN
+ XLogFailure stMenu$ + " " + stMenuItem$ + " " + stHMenuItem$ + " is Checked"
+ END IF
+END SUB
+
+
+
+'
+' BMenuItemEnabled(stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description: This procedure checks to see IF the specified menu or
+' menu item is enabled or not.
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+' Returns: -1(true): IF enabled.
+' 0(false): IF not enabled.
+' Example: fIsEnabled% = BMenuItemEnabled("File", "", "")
+' fIsEnabled% = BMenuItemEnabled("File", "Close", "")
+'
+'
+FUNCTION BMenuItemEnabled%(stMenu$,stMenuItem$, stHMenuItem$)
+
+ IF stHMenuItem$ = "" THEN
+ IF stMenuItem$ = "" THEN
+ BMenuItemEnabled = WMenuEnabled(stMenu$) <> 0 'Check main menu bar menu items.
+ ELSE
+ WMenu(stMenu$) 'Check menu item within stMenu$.
+ BMenuItemEnabled = WMenuEnabled(stMenuItem$) <> 0
+ END IF
+ ELSE
+ WMenu(stMenu$) 'Check menu item under popup menu.
+ WMenu(stMenuItem$)
+ BMenuItemEnabled = WMenuEnabled(stHMenuItem$) <> 0
+ END IF
+ DoKeys "{esc 3}" 'Make sure you close menu.
+
+END FUNCTION
+
+
+'
+' XMenuItemEnabled (stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description:
+' Reports error IF menu item is not Enabled.
+'
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+'
+' Returns: nothing
+'
+' Example: XMenuItemEnabled "Options", "Read Only", ""
+'
+'
+'
+SUB XMenuItemEnabled(stMenu$,stMenuItem$, stHMenuItem$)
+ IF BMenuItemEnabled(stMenu$,stMenuItem$, stHMenuItem$) = 0 THEN
+ XLogFailure stMenu$ + " " + stMenuItem$ + " " + stHMenuItem$ + " is not Enabled"
+ END IF
+END SUB
+
+
+'
+' XMenuItemNotEnabled (stMenu$,stMenuItem$, stHMenuItem$)
+'
+' Description:
+' Reports error IF menu item is Enabled.
+'
+' Parameters: stMenu = menu where stMenuItem is found.
+' stMenuItem = menu item to select or secondary menu, IF Hierarchial menu
+' exists.
+' stHMenuItem = hierarchial(popup) menu item.
+'
+' Returns: nothing
+'
+' Example: XMenuItemNotEnabled "Options", "Read Only", ""
+'
+'
+'
+SUB XMenuItemNotEnabled(stMenu$,stMenuItem$, stHMenuItem$)
+ IF BMenuItemEnabled(stMenu$,stMenuItem$, stHMenuItem$) THEN
+ XLogFailure stMenu$ + " " + stMenuItem$ + " " + stHMenuItem$ + " is Enabled"
+ END IF
+END SUB
+
+
+
+'**********************************************************
+'***************** Window Subroutines *********************
+'**********************************************************
+
+
+
+
+'
+' XCaptionExists(stCaption$)
+'
+' Description:
+' Will report error IF caption does not Exist.
+'
+' Parameters: stCaption$ - expected caption of current window
+'
+' Returns: nothing
+'
+' Example: XCaptionExists "Winword"
+'
+'
+'
+SUB XCaptionExists(stCaption$)
+ IF Instr(SGetCaption(), stCaption$) = 0 THEN
+ XLogFailure stCaption$ + " caption does not exist in active window."
+ END IF
+END SUB
+
+
+'
+' XCaptionNotExists(stCaption$)
+'
+' Description:
+' Will report error IF caption Exist.
+'
+' Parameters: stCaption$ - NOT expected caption of current window
+'
+' Returns: nothing
+'
+' Example: XCaptionNotExists "Winword"
+'
+'
+SUB XCaptionNotExists(stCaption$)
+ IF Instr(SGetCaption(), stCaption$) <> 0 THEN
+ XLogFailure stCaption$ + " caption Exists in active window."
+ END IF
+END SUB
+
+
+
+'
+' SGetCaption()
+'
+' Description:
+' Returns the caption of the Active window
+' Parameters:
+' none
+' Return:
+' Caption of the Active window
+' Example:
+' stCaption$ = SGetCaption()
+'
+'
+FUNCTION SGetCaption$()
+ DIM x%
+ DIM stCaption$
+
+ stCaption$ = String$(100, 32)
+ x% = GetWindowText (GetActiveWindow(), stCaption$, LEN(stCaption$))
+ SGetCaption = mid$(stCaption$,1,x%)
+ stCaption$ = ""
+END FUNCTION
+
+
+
+'
+' XZoomWindow
+'
+' Description: Toggles the state of the window between normalized
+' and maximized.
+' Parameters: None
+'
+' Returns: none
+'
+' Example: XZoomWindow
+'
+'
+'
+SUB XZoomWindow
+ DIM bogus%
+ DIM lhwndTemp%
+
+ lhwndTemp% = GetActiveWindow()
+
+ ' IF the window is maximized, normalize.
+
+ IF (IsZoomed(lhwndTemp%)) THEN
+ ' window is maximized, we must normalize it
+ bogus% = ShowWindow(lhwndTemp%, SW_SHOWNORMAL)
+ ELSE
+ bogus% = ShowWindow(lhwndTemp%, SW_MAXIMIZE)
+ END IF
+
+END SUB
+
+
+'
+' XMaxWindow
+'
+' Description: Maximize the current active window
+' Parameters: None
+' Returns: None
+' Example: XMaxWinow
+'
+'
+'
+
+
+SUB XMaxWindow
+ DIM bogus%
+ DIM lhwndTemp%
+ DIM lWndStyle&
+
+ lhwndTemp% = GetActiveWindow ()
+
+ ' Get the window's style attributes
+ lWndStyle& = GetWindowLong(lhwndTemp%, GWL_STYLE)
+
+ IF ((lWndStyle& And WS_MAXIMIZE) <> 0) THEN
+ XLogFailure "Could not maximize active window, already maximized"
+ ELSE
+ bogus% = ShowWindow(lhwndTemp%, SW_SHOWMAXIMIZED)
+ END IF
+
+END SUB
+
+'
+' XWindowMaximized
+'
+' Description: check IF the current active window is Maximized
+' Parameters: None
+' Returns: None
+' Example: XWindowMaximized
+'
+'
+'
+
+
+SUB XWindowMaximized
+ IF BWindowMaximized = 0 THEN
+ XLogFailure "Active Window not maximized"
+ END IF
+
+END SUB
+
+'
+' XWindowNotMaximized
+'
+' Description: Check that the current window is not maximized
+' Parameters: None
+' Returns: None
+' Example: XWindowNotMaximized
+'
+'
+'
+
+
+SUB XWindowNotMaximized
+
+ IF BWindowMaximized THEN
+ XLogFailure "Active Window is maximized"
+ END IF
+
+END SUB
+
+'
+' BWindowMaximized
+'
+' Description: detect IF current window is maximized
+' Parameters: None
+' Returns: None
+' Example: BWindowMaximized
+'
+'
+'
+
+
+FUNCTION BWindowMaximized%
+ DIM bogus%
+ DIM lhwndTemp%
+ DIM lWndStyle&
+
+ lhwndTemp% = GetActiveWindow ()
+
+ ' Get the window's style attributes
+ lWndStyle& = GetWindowLong(lhwndTemp%, GWL_STYLE)
+
+ BWindowMaximized = (lWndStyle& AND WS_MAXIMIZE) <> 0
+
+END FUNCTION
+
+
+'
+' XMinWindow
+'
+' Description: Minimize the current active window
+' Parameters: None
+' Returns: None
+' Example: XMinWindow
+'
+'
+'
+
+
+SUB XMinWindow
+ DIM bogus%
+ DIM lhwndTemp%
+ DIM lWndStyle&
+
+ lhwndTemp% = GetActiveWindow ()
+
+ ' Get the window's style attributes
+ lWndStyle& = GetWindowLong(lhwndTemp%, GWL_STYLE)
+
+ ' IF maximized, XLog the descrepancy
+ IF ((lWndStyle& And WS_MINIMIZE) <> 0) THEN
+ XLogFailure "Could not minimize active window, already minimized"
+ ELSE
+ bogus% = ShowWindow(lhwndTemp%, SW_SHOWMINIMIZED)
+ END IF
+
+END SUB
+
+' XWindowMinimized
+'
+' Description: Check that current window is minimized
+' Parameters: None
+' Returns: None
+' Example: XWindowMinized
+'
+'
+'
+
+
+SUB XWindowMinimized
+
+ IF BWindowMinimized = 0 THEN
+ XLogFailure "Active Window not Minimized"
+ END IF
+
+END SUB
+
+'
+' XWindowNotMinimized
+'
+' Description: Check that current window is not minimized
+' Parameters: None
+' Returns: None
+' Example: XWindowNotMinimized
+'
+'
+'
+
+
+SUB XWindowNotMinimized
+ IF BWindowMinimized THEN
+ XLogFailure "Active Window is Minimized"
+ END IF
+
+END SUB
+
+'
+' BWindowMinimized
+'
+' Description: Detect IF active window minimized
+' Parameters: None
+' Returns: None
+' Example: fMin% = BWindowMinimized
+'
+'
+'
+
+
+FUNCTION BWindowMinimized%
+ DIM bogus%
+ DIM lhwndTemp%
+ DIM lWndStyle&
+
+ lhwndTemp% = GetActiveWindow ()
+
+ ' Get the window's style attributes
+ lWndStyle& = GetWindowLong(lhwndTemp%, GWL_STYLE)
+
+ BWindowMinimized = (lWndStyle& AND WS_MINIMIZE) <> 0
+
+END FUNCTION
+
+'
+' XRestoreWindow
+'
+' Description: Restore the current active window. NOTE: You must make
+' the icon the active window before calling XRestoreWin!
+' Parameters: None
+' Returns: None
+' Example: XRestoreWindow
+'
+'
+'
+
+
+SUB XRestoreWindow
+ DIM bogus%
+ DIM lhwndTemp%
+ DIM lWndStyle&
+
+ lhwndTemp% = GetActiveWindow ()
+
+ ' Get the window's style attributes
+ lWndStyle& = GetWindowLong(lhwndTemp%, GWL_STYLE)
+
+ ' IF maximized, XLog the descrepancy
+ IF ((lWndStyle& And WS_MINIMIZE) = 0) AND ((lWndStyle& And WS_MAXIMIZE) = 0) THEN
+ XLogFailure "Active window is not minimized or maximized."
+ ELSE
+ bogus% = ShowWindow(lhwndTemp%, SW_RESTORE)
+ END IF
+
+END SUB
+
+
+
+'
+' XSizeActiveWindow(iXPixels, iYPixels, fAbsOrRel)
+'
+' Description: Moves the bottom-right corner of the active window
+' to new coordiates iXPixels, iYPixels. IF fAbsOrRel
+' is TRUE, the coordiates are absolute. IF fAbsOrRel
+' is FALSE, the coordiates are relative to the current
+' position.
+' Parameters:
+' iXPixels - X coordinate
+' iYPixels - Y coordinate
+' IF !fAbsOrRel FALSE, the X,Y coordinates are relative to the
+' current mouse coordianates.
+'
+' Returns: none
+'
+' Example: XSizeActiveWindow(iXLocate, iYLocate, fAbsolue)
+'
+'
+'
+
+SUB XSizeActiveWindow (iXPixels%, iYPixels%, fAbsOrRel%)
+
+ DIM xyTempRect As rect
+ DIM iTempX%
+ DIM iTempY%
+ DIM temphWnd%
+
+ IF fAbsOrRel% THEN
+ WSetWndSiz GetActiveWindow(), iXPixels%, iYPixels%
+ ELSE
+ ' Find the active window
+ temphWnd% = GetActiveWindow
+
+ ' Get the Rect of the active window
+ GetWindowRect temphWnd%, xyTempRect
+ ' Determine new X coordinate
+ iTempX% = ((xyTempRect.right - 1) - (xyTempRect.left)) + iXPixels%
+
+ ' Determine new Y coordinate
+ iTempY% = ((xyTempRect.bottom - 1) - (xyTempRect.top)) + iYPixels%
+
+ ' size the window
+ WSetWndSiz GetActiveWindow(), iXPixels%, iYPixels%
+
+ END IF
+END SUB
+
+
+'
+' XMoveActiveWindow(iXPixels, iYPixels, fAbsOrRel, fMouseOrKey)
+'
+' Description: Moves the top-left corner of the active window
+' to new coordiates iXPixels, iYPixels. IF fAbsOrRel
+' is TRUE, the coordiates are absolute. IF fAbsOrRel
+' is FALSE, the coordiates are relative to the current
+' position.
+' Parameters:
+' iXPixels - X coordinate
+' iYPixels - Y coordinate
+' IF !fAbsOrRel FALSE, the X,Y coordinates are relative to the
+' current mouse coordianates.
+'
+' Returns: none
+'
+' Example: XMoveActiveWindow(iXLocate, iYLocate, fAbsolue)
+'
+'
+'
+'
+SUB XMoveActiveWindow (iXPixels%, iYPixels%, fAbsOrRel%)
+
+ DIM xyTempRect As Rect
+ DIM iTempX%
+ DIM iTempY%
+ DIM temphWnd%
+
+
+ IF fAbsOrRel% THEN
+ WSetWndPos GetActiveWindow(), iXPixels%, iYPixels%
+ ELSE
+ ' Find the active window
+ temphWnd% = GetActiveWindow
+
+ ' Get the Rect of the active window
+ GetWindowRect temphWnd%, xyTempRect
+
+ ' Determine new X coordinate
+ iTempX% = xyTempRect.left + iXPixels%
+
+ ' Determine new Y coordinate
+ iTempY% = xyTempRect.top + iYPixels%
+
+ ' move the window
+ WSetWndPos GetActiveWindow(), iXPixels%, iYPixels%
+ END IF
+END SUB
diff --git a/private/oleauto/tools/win16/os2/inc/ftestlog.mst b/private/oleauto/tools/win16/os2/inc/ftestlog.mst
new file mode 100644
index 000000000..8cedfb3c4
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ftestlog.mst
@@ -0,0 +1,1468 @@
+'XTestLog.inc - definitions for Fast Test Utility routines
+'
+' Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+'
+'Purpose:
+' This file defines the Log and Dialog functions of the Fast Test
+' functionality
+'
+
+
+'**********************************************************
+'***************** Log Subroutines ************************
+'**********************************************************
+
+' XSetLogFileName(stFilename$)
+' Description: Sets global variable for use as the log name
+' The global variable gsCurrentDir$ can be used to build
+' the log name (it is the current directory for when the
+' script is started). The default log name if this function
+' is not called, is gsCurrentDir$ + "\TESTLOG.LOG"
+'
+' Example: XSetLogFileName "c:\test\app.log"
+' XSetLogFileName gsCurrentDir$ + "\app.log"
+
+SUB XSetLogFilename(sFilename$)
+
+ gsLogFileName = sFilename$
+
+END SUB
+
+' XSetTerminate(fTerminate%)
+' Description:
+' Sets the terminate state to argument. If terminate is FALSE
+' the XLogfailure will log the failure but execution will
+' continue. This can lead to many failures in the log do to
+' one early failure. It can also give many valid failures in
+' a single run (checking all menu states for instance).
+
+SUB XSetTerminate(fTerminate%)
+ gfTerminate% = fTerminate%
+END SUB
+
+
+'
+' XLog(stString$)
+'
+' Description: Logs string to one or several destinations
+' 1. Disk 2. Screen 3. COM1 port 4. MsgBox
+' based on a OR'd Global flag gfLogOptions. The CONST's to
+' work with are LOG_DISK, LOG_SCREEN, LOG_COM, and
+' LOG_MSGBOX respectively. These are definded in GLOBAL.WTD
+'
+' Parameters: stString$ - string to Log
+'
+' Returns: nothing
+'
+' Example: XSetLogOptions LOG_DISK + LOG_SCREEN
+' XLog "Something to Log" 'this will be logged to disk and viewport
+'
+'
+SUB XLog (stLog$)
+ DIM fh%
+
+ fh% = FREEFILE
+
+ IF gfLogOptions THEN
+ gErrorType = EC_LOG
+
+
+ IF (LOG_DISK AND gfLogOptions) THEN
+ Open gsLogFileName$ For Append As #fh%
+ Print #fh%, stLog$
+ Close #fh%
+
+ END IF
+
+ IF (LOG_SCREEN AND gfLogOptions) THEN
+ 'Print the string to the Viewport
+ Print stLog$
+ END IF
+
+ IF (LOG_COM1 AND gfLogOptions) THEN
+ 'log to comport COM1
+
+ OPEN "COM1" For Append as #fh%
+ Print #fh%, stLog$
+ Close #fh%
+ END IF
+
+ IF (LOG_COM2 AND gfLogOptions) THEN
+ 'log to comport COM2
+
+ OPEN "COM2" For Append as #fh%
+ Print #fh%, stLog$
+ Close #fh%
+ END IF
+
+ IF (LOG_MSGBOX AND gfLogOptions) THEN
+ 'Put the string in a MsgBox
+ IF stLog$ <> "" THEN
+ Pause stLog$
+ END IF
+ END IF
+ gErrorType = EC_NOTHING
+
+ END IF 'gfLogOptions
+END SUB
+
+
+
+'
+' XLogBanner(stString$)
+'
+' Description: Logs string with a blank line before and after,
+' and adds five *'s before and after the string.
+'
+' Parameters: stString$ - string to Log
+'
+' Returns: nothing
+'
+' Example: XLogBanner "Starting FOO Test"
+'
+'
+
+
+SUB XLogBanner(lpszInput$)
+
+ XLog ""
+ XLog "***** " + lpszInput$ + " *****"
+ XLog ""
+
+END SUB
+
+
+
+'
+' XLogWarning(stString$)
+'
+' Description: Adds Warning banner to string
+'
+' Parameters: stString$ - string to Log
+'
+' Returns: nothing
+'
+' Example: XLogWarning "Too many menu items??"
+'
+'
+
+SUB XLogWarning(lpszInput$)
+
+ XLog ""
+ XLog "!!! =====> WARNING <===== !!!"
+ XLog "***** " + lpszInput$ + " *****"
+ XLog ""
+
+END SUB
+
+
+
+' XLogFailure (stFailure$)
+'
+' Description:
+' Logs failure with banner and ends the script
+' Parameters:
+' stFailure - Error string to logged
+' Return:
+' nothing
+' Example:
+' XLogFailure "Button does not exist"
+'
+'
+
+SUB XLogFailure(stFailure$)
+ XLog ""
+ XLog "***************** FAILURE ******************"
+ XLog stFailure$
+ XLog "********************************************"
+ XLog ""
+ IF gfTerminate THEN
+ End
+ ELSE
+ gfFailure = TRUE
+ END IF
+END SUB
+
+' XFailureCheck
+' Description: this routine checks to see IF any failures
+' have occured. IF so, the script is stopped. This would
+' be used IF XSetTerminate has been used to disable the stopping
+' of the script on failures.
+'
+SUB XFailureCheck
+ IF gfFailure THEN
+ XSetTerminate TRUE
+ XLogFailure "Ending script; failures have occurred"
+ END IF
+END SUB
+
+
+
+
+
+'
+' XSetLogOptions (wLogOptions%)
+'
+' Description:
+' Sets the global log options flag to the passed options
+' Parameters:
+' wOptions - a set of bits OR'ed together.
+' currently we have LOG_COM1 LOG_COM2 LOG_SCREEN LOG_DISK
+' Return:
+' nothing
+' Example:
+' XSetLogOptions LOG_COM1+LOG_SCREEN 'enable logging to screen and com1
+'
+SUB XSetLogOptions (wLogOptions%)
+ 'set the global log flag
+ gfLogOptions = wLogOptions
+ gfTmpLogOptions = gfLogOptions ' allows XLogOn after XSetLogOptions
+END SUB
+
+
+'
+' XLogOff ()
+'
+' Description:
+' Turn off logging
+' Parameters:
+' none
+' Return:
+' nothing
+' Example:
+' XLogOff
+'
+'
+SUB XLogOff ()
+ 'save the global log flag to a temporary and set options to zero
+ gfTmpLogOptions = gfLogOptions
+ gfLogOptions = 0
+END SUB
+
+
+
+'
+' XLogOn ()
+'
+' Description:
+' Turn on logging
+' Parameters:
+' none
+' Return:
+' nothing
+' Example:
+' XLogOn
+'
+'
+SUB XLogOn ()
+ 'restore log options saved in temporary
+ gfLogOptions = gfTmpLogOptions
+END SUB
+
+
+
+'**********************************************************
+'***************** Dialog Subroutines *********************
+'**********************************************************
+
+
+
+' XDialogBoxExists(string)
+'wait for dialog box with string argument for caption and
+'log error IF it doesn't exist
+SUB XDialogBoxExists(s$)
+ ' won't work IF app creates special class for its dialogs
+
+ IF FindWindow(gsDialogClass$,s$) = 0 THEN
+ XLogFailure "dialog box " + s$ + " doesn't exist"
+ END IF
+
+END SUB
+
+' XDialogBoxNotExists(string)
+'look for dialog box with string argument for caption and
+'log error IF it exists
+'
+SUB XDialogBoxNotExists(s$)
+
+ ' won't work IF app creates special class for its dialogs
+
+ IF FindWindow(gsDialogClass$,s$) <> 0 THEN
+ XLogFailure "dialog box " + s$ + " exists"
+ END IF
+
+END SUB
+
+' BDialogBoxExists(string)
+'look for dialog box with string argument for caption and
+'return whether it exists or not
+'
+FUNCTION BDialogBoxExists%(s$)
+
+ ' won't work IF app creates special class for its dialogs
+
+ BDialogBoxExists = FindWindow(gsDialogClass$,s$) <> 0
+
+END FUNCTION
+
+' XWaitDialogBox(string,integer)
+'wait for dialog box with string argument for caption and
+'integer argument as estimate of time to keep trying before
+'logging a failure
+SUB XWaitDialogBox(s$, WaitTime%)
+
+ DIM hWnd%
+ DIM fDone%
+ DIM fFound%
+ DIM ret%
+
+ fDone = FALSE
+ fFound = FALSE
+
+
+ WHILE NOT fDone%
+
+ ' class for dialogs created by windows is gsDialogClass$
+ ' won't work IF app creates special class for its dialogs
+ hWnd% = FindWindow(gsDialogClass$,s$)
+ IF hWnd% <> 0 THEN
+ fFound = TRUE
+ fDone = TRUE
+ ELSE
+ SLEEP 1
+ WaitTime% = WaitTime% - 1
+ IF WaitTime% <= 0 THEN
+ fDone = TRUE
+ END IF
+ END IF
+
+ WEND
+ IF NOT fFound% THEN
+ XLogFailure "FAIL """ + s$ + """ dialogbox not found"
+ END IF
+END SUB
+
+
+
+
+
+' **********************************************************
+' ***************** Dialog: Button Subroutines *************
+' **********************************************************
+
+
+'
+' BButtonExists(stButtonName$)
+'
+' Description: This procedure checks to see IF the specified button
+' exists or not.
+' Parameters: stButtonName$ = button to be checked.
+' Returns: -1(true): button exists.
+' 0(false): button does not exist.
+' Example: fExists% = BButtonExists("OK")
+'
+FUNCTION BButtonExists%(stButtonName$)
+
+ BButtonExists = WButtonExists(stButtonName$) <> 0
+
+END FUNCTION
+
+
+'
+' XButtonExists (stButtonName$)
+'
+' Description:
+' Reports error IF button does not exist in active window.
+'
+' Parameters: stButtonName$ - button to be found.
+'
+' Returns: nothing
+'
+' Example: XButtonExists "Cancel"
+'
+'
+'
+SUB XButtonExists(stButton$)
+ IF BButtonExists(stButton$) = 0 THEN
+ XLogFailure stButton$ + " does not Exist"
+ END IF
+END SUB
+
+
+'
+' XButtonNotExists (stButtonName$)
+'
+' Description:
+' Reports error IF button Exists in active window.
+'
+' Parameters: stButtonName$ - button to not be found.
+'
+' Returns: nothing
+'
+' Example: XButtonNotExists "Cancel"
+'
+'
+'
+SUB XButtonNotExists(stButton$)
+ IF BButtonExists(stButton$) THEN
+ XLogFailure stButton$ + " Exists"
+ END IF
+END SUB
+
+
+'
+' BButtonEnabled(stButtonName$)
+'
+' Description: This procedure checks to see IF the specified button
+' is enabled or not.
+' Parameters: stButtonName$ = button to be checked.
+' Returns: -1(true): button enabled.
+' 0(false): button not enabled.
+' Example: fEnabled% = BButtonEnabled("OK")
+'
+FUNCTION BButtonEnabled%(stButtonName$)
+
+ BButtonEnabled = WButtonEnabled(stButtonName$) <> 0
+
+END FUNCTION
+
+
+'
+' XButtonEnabled (stButtonName$)
+'
+' Description:
+' Reports error IF button is not Enabled.
+'
+' Parameters: stButtonName$ - button to be checked.
+'
+' Returns: nothing
+'
+' Example: XButtonEnabled "Cancel"
+'
+'
+SUB XButtonEnabled(stButton$)
+ XButtonExists stButton$
+ IF BButtonEnabled(stButton$) = 0 THEN
+ XLogFailure stButton$ + " is not Enabled"
+ END IF
+END SUB
+
+
+'
+' XButtonNotEnabled (stButtonName$)
+'
+' Description:
+' Reports error IF button is Enabled.
+'
+' Parameters: stButtonName$ - button to be checked.
+'
+' Returns: nothing
+'
+' Example: XButtonNotEnabled "Cancel"
+'
+'
+SUB XButtonNotEnabled(stButton$)
+ XButtonExists stButton$
+ IF BButtonEnabled(stButton$) THEN
+ XLogFailure stButton$ + " Enabled"
+ END IF
+END SUB
+
+
+'
+' XClickButton(stButtonName$)
+'
+' Description: This procedure clicks the specified button in the
+' currently active window.
+' Parameters: stButtonName$ = button to be clicked.
+' Returns: Nothing.
+' Example: XClickButton "OK"
+'
+'
+SUB XClickButton(stButtonName$)
+ XButtonExists stButtonName$
+ WButtonClick stButtonName$
+
+END SUB
+
+
+
+' **********************************************************
+' ************* Dialog: List Box Subroutines ***************
+' **********************************************************
+
+
+
+'
+' BListboxExists(stListbox$)
+'
+' Description: This procedure checks to see IF the specified Listbox
+' exists or not.
+' Parameters: stListbox$ = Listbox to be checked.
+' Returns: -1(true): Listbox exists.
+' 0(false): Listbox does not exist.
+' Example: fExists% = BListboxExists("OK")
+'
+FUNCTION BListboxExists%(stListbox$)
+
+ BListboxExists = WListExists(stListbox$) <> 0
+
+END FUNCTION
+
+
+'
+' XListBoxExists (stListbox$)
+'
+' Description:
+' Reports error IF Listbox does not exist in active window.
+'
+' Parameters: stListbox$ - Listbox to be found.
+'
+' Returns: nothing
+'
+' Example: XListBoxExists "Cancel"
+'
+'
+SUB XListBoxExists(stListbox$)
+
+ IF WListExists(stListbox$) = 0 THEN
+ XLogFailure "Listbox " + stListbox$ + " does not Exist"
+ END IF
+
+END SUB
+
+'
+' XListBoxNotExists (stListbox$)
+'
+' Description:
+' Reports error IF Listbox exists in active window.
+'
+' Parameters: stListbox$ - Listbox not to be found.
+'
+' Returns: nothing
+'
+' Example: XListBoxNotExists "Cancel"
+'
+SUB XListBoxNotExists(stListbox$)
+
+ IF WListExists(stListbox$) THEN
+ XLogFailure "Listbox " + stListbox$ + " exists"
+ END IF
+
+END SUB
+
+
+
+
+
+'
+' XFocusListbox(stListbox$)
+'
+' Description: This procedure puts focus to the specified Listbox in the
+' currently active window.
+' Parameters: stListbox$ = Listbox to be given focus.
+' Returns: Nothing.
+' Example: XFocusListbox "&Files:"
+'
+SUB XFocusListbox(stListbox$)
+
+ IF WListExists(stListbox$) THEN
+ 'it now has focus
+ ELSE
+ XLogFailure "Could not put focus on " + stListbox$ + " Listbox"
+ END IF
+
+END SUB
+
+
+
+
+'
+' WGetListboxItemCount%(stListbox$)
+'
+' Description: Returns the number of items in listbox stListbox$.
+'
+' Parameters: stListbox$ - Listbox to get item count from
+'
+' Returns: Int - List box item count
+'
+' Example: num% = WListboxItemCount ()
+'
+'
+FUNCTION WGetListboxItemCount%(stListbox$)
+ XListBoxExists stListbox$
+ WGetListboxItemCount = WListCount(stListbox$)
+
+END FUNCTION
+
+
+
+'
+' BListboxItemExists%(stListbox$, stListboxItem$)
+'
+' Description: Returns true IF list box item exists, false otherwise.
+'
+' Parameters: stListbox$- Listbox to look in
+' stListboxItem$ - Item to look for
+'
+' Returns: Int - 0 IF item does not exist, positive val otherwise
+'
+' Example: flag% = BListboxItemExists ("&Files:","FOO.C")
+'
+'
+FUNCTION BListboxItemExists%(stListbox$, stListboxItem$)
+
+ BListboxItemExists = WListItemExists (stListbox$, stListboxItem$) <> 0
+
+END FUNCTION
+
+
+
+
+'
+' XListBoxItemExists(stListbox$, stListboxItem$)
+'
+' Description: Logs failure IF list box item does not exist
+'
+' Parameters: stListbox$- Listbox to look in
+' stListboxItem$ - Item to look for
+'
+' Returns: Nothing
+'
+' Example: XListBoxItemExists "&Files:","FOO.C"
+'
+'
+SUB XListBoxItemExists (stListbox$, stListboxItem$)
+
+ XListBoxExists stListbox$
+ IF WListItemExists (stListbox$, stListboxItem$) = 0 THEN
+ XLogFailure "ListboxItem " + stListboxItem$ + " does not exist"
+ END IF
+
+END SUB
+
+
+'
+' XListBoxItemNotExists(stListbox$, stListboxItem$)
+'
+' Description: Logs failure IF list box item exists
+'
+' Parameters: stListbox$ - Listbox to look in
+' stListboxItem$ - Item to look for
+'
+' Returns: Nothing
+'
+' Example: XListBoxItemNotExists "&Files:","FOO.C"
+'
+'
+SUB XListBoxItemNotExists (stListbox$, stListboxItem$)
+
+ XListBoxExists stListbox$
+ IF WListItemExists (stListbox$, stListboxItem$) <> 0 THEN
+ XLogFailure "ListboxItem " + stListboxItem$ + " exists"
+ END IF
+
+END SUB
+
+
+
+
+'
+' XClickListboxItem(stListbox$, stListboxItem$)
+'
+' Description: Clicks on list box item
+'
+' Parameters: stListbox$ - Listbox to look in
+' stListboxItem$ - Item to click on
+'
+' Returns: Nothing
+'
+' Example: XClickListboxItem "&Files:","FOO.C"
+'
+'
+SUB XClickListboxItem (stListbox$, stListboxItem$)
+
+ XListBoxExists stListbox$
+ XListBoxItemExists stListbox$, stListboxItem$
+ WListItemClkT stListbox$, stListboxItem$
+
+END SUB
+
+
+
+
+'
+' XDblClickListboxItem% (stListbox$, stListboxItem$)
+'
+' Description: Clicks on list box item
+'
+' Parameters: stListbox$ - Listbox to look in
+' stListboxItem$ - Item to click on
+'
+' Returns: Nothing
+'
+' Example: XDblClickListboxItem "&Files:","FOO.C"
+'
+'
+SUB XDblClickListboxItem (stListbox$, stListboxItem$)
+
+ XListBoxExists stListbox$
+ XListBoxItemExists stListbox$, stListboxItem$
+ WListItemDblClkT stListbox$, stListboxItem$
+
+END SUB
+
+
+
+
+'
+' SGetListboxItemText (stListbox$)
+'
+' Description: Returns currently selected list box item
+'
+' Parameters: stListbox$ is the listbox to get item from
+'
+' Returns: Listbox Item string
+'
+' Example: a$ = StGetListboxItemText ("&User List:")
+'
+'
+FUNCTION SGetListboxItemText$(stListbox$)
+
+ XListBoxExists stListbox$
+ SGetListboxItemText = ListText(stListbox$)
+
+END FUNCTION
+
+
+
+' **********************************************************
+' ************* Dialog: Combo Box Subroutines **************
+' **********************************************************
+
+
+
+'
+' BComboBoxExists%(stComboBox$)
+'
+' Description: This procedure checks to see IF the specified ComboBox
+' exists or not.
+' Parameters: stComboBox$ = ComboBox to be checked.
+' Returns: -1(true): ComboBox exists.
+' 0(false): ComboBox does not exist.
+' Example: fExists% = BComboBoxExists("&File")
+'
+FUNCTION BComboBoxExists%(stComboBox$)
+
+ BComboBoxExists = WComboExists(stComboBox$) <> 0
+
+END FUNCTION
+
+
+'
+' XComboBoxExists (stComboBox$)
+'
+' Description:
+' Reports error IF ComboBox does not exist in active window.
+'
+' Parameters: stComboBox$ - ComboBox to be found.
+'
+' Returns: nothing
+'
+' Example: XComboBoxExists "&File"
+'
+'
+SUB XComboBoxExists(stComboBox$)
+
+ IF WComboExists(stComboBox$) = 0 THEN
+ XLogFailure "ComboBox " + stComboBox$ + " does not Exist"
+ END IF
+
+END SUB
+
+'
+' XComboBoxNotExists (stComboBox$)
+'
+' Description:
+' Reports error IF ComboBox exists in active window.
+'
+' Parameters: stComboBox$ - ComboBox not to be found.
+'
+' Returns: nothing
+'
+' Example: XComboBoxNotExists "&File"
+'
+SUB XComboBoxNotExists(stComboBox$)
+
+ IF WComboExists(stComboBox$) THEN
+ XLogFailure "ComboBox " + stComboBox$ + " exists"
+ END IF
+
+END SUB
+
+
+
+
+
+'
+' XFocusComboBox(stComboBox$)
+'
+' Description: This procedure puts focus to the specified ComboBox in the
+' currently active window.
+' Parameters: stComboBox$ = ComboBox to be given focus.
+' Returns: Nothing.
+' Example: XFocusComboBox("&Files:")
+'
+SUB XFocusComboBox(stComboBox$)
+
+ IF WComboExists(stComboBox$) THEN
+ 'it now has focus
+ ELSE
+ XLogFailure "Could not put focus on " + stComboBox$ + " ComboBox"
+ END IF
+
+END SUB
+
+
+
+
+'
+' WGetComboBoxItemCount%(stComboBox$)
+'
+' Description: Returns the number of items in ComboBox stComboBox$.
+'
+' Parameters: stComboBox$ - ComboBox to get item count from
+'
+' Returns: Int - Combo box item count
+'
+' Example: num% = WComboBoxItemCount ()
+'
+'
+FUNCTION WGetComboBoxItemCount%(stComboBox$)
+ XComboboxExists stComboBox$
+ WGetComboBoxItemCount = WComboCount(stComboBox$)
+
+END FUNCTION
+
+
+
+'
+' BComboBoxItemExists%(stComboBox$, stComboBoxItem$)
+'
+' Description: Returns true IF Combo box item exists, false otherwise.
+'
+' Parameters: stComboBox$ - ComboBox to look in
+' stComboBoxItem$ - Item to look for
+'
+' Returns: Int - 0 IF item does not exist, positive val otherwise
+'
+' Example: flag% = BComboBoxItemExists("&Files","FOO.C")
+'
+FUNCTION BComboBoxItemExists%(stComboBox$, stComboBoxItem$)
+
+ BComboBoxItemExists = WComboItemExists (stComboBox$, stComboBoxItem$) <> 0
+
+END FUNCTION
+
+
+
+
+'
+' XComboBoxItemExists(stComboBox$, stComboBoxItem$)
+'
+' Description: Logs failure IF combo box item does not exist
+'
+' Parameters: stComboBox$ - ComboBox to look in
+' stComboBoxItem$ - Item to look for
+'
+' Returns: Nothing
+'
+' Example: XComboBoxItemExists "&Files","FOO.C"
+'
+'
+SUB XComboBoxItemExists (stComboBox$, stComboBoxItem$)
+ XComboBoxExists stComboBox$
+ IF WComboItemExists (stComboBox$, stComboBoxItem$) = 0 THEN
+ XLogFailure "ComboBoxItem " + stComboBoxItem$ + " does not exist"
+ END IF
+
+END SUB
+
+
+'
+' XComboBoxItemNotExists(stComboBox$, stComboBoxItem$)
+'
+' Description: Logs failure IF combo box item exists
+'
+' Parameters: stComboBox$ - ComboBox to look in
+' stComboBoxItem$ - Item to look for
+'
+' Returns: Nothing
+'
+' Example: XComboBoxItemNotExists "&Files","FOO.C"
+'
+'
+SUB XComboBoxItemNotExists (stComboBox$, stComboBoxItem$)
+
+ XComboBoxExists stComboBox$
+ IF WComboItemExists (stComboBox$, stComboBoxItem$) THEN
+ XLogFailure "ComboBoxItem " + stComboBoxItem$ + " exists"
+ END IF
+
+END SUB
+
+
+
+
+'
+' XClickComboBoxItem(stComboBox$, stComboBoxItem$)
+'
+' Description: Clicks on Combo box item
+'
+' Parameters: stComboBox$ - ComboBox to look in
+' stComboBoxItem$ - Item to click on
+'
+' Returns: Nothing
+'
+' Example: XClickComboBoxItem "&Files","FOO.C"
+'
+'
+SUB XClickComboBoxItem (stComboBox$, stComboBoxItem$)
+
+ XComboBoxExists stComboBox$
+ XComboBoxItemExists stComboBox$,stComboBoxItem$
+ WComboItemClkT stComboBox$, stComboBoxItem$
+
+END SUB
+
+
+
+
+'
+' XDblClickComboBoxItem% (stComboBox$, stComboBoxItem$)
+'
+' Description: Clicks on combo box item
+'
+' Parameters: stComboBox$ - ComboBox to look in
+' stComboBoxItem$ - Item to click on
+'
+' Returns: Nothing
+'
+' Example: XDblClickComboBoxItem "&Files","FOO.C"
+'
+'
+SUB XDblClickComboBoxItem (stComboBox$, stComboBoxItem$)
+
+ XComboBoxExists stComboBox$
+ XComboBoxItemExists stComboBox$,stComboBoxItem$
+ WComboItemDblClkT stComboBox$, stComboBoxItem$
+
+END SUB
+
+
+
+
+'
+' StGetComboBoxItemText (stComboBox$)
+'
+' Description: Returns currently selected Combo box item
+'
+' Parameters: stComboBox$ is the ComboBox to get item from
+'
+' Returns: ComboBox Item string
+'
+' Example: a$ = StGetComboBoxItemText ("&User List:")
+'
+FUNCTION SGetComboBoxItemText$(stComboBox$)
+
+ XComboBoxExists stComboBox$
+ XComboBoxItemExists stComboBox$,stComboBoxItem$
+ SGetComboBoxItemText = ComboText(stComboBox$)
+
+END FUNCTION
+
+
+
+' **********************************************************
+' ************* Dialog: Check Box Subroutines **************
+' **********************************************************
+
+
+
+'
+' BCheckboxExists(stCheckbox$)
+'
+' Description: This procedure checks to see IF the specified Checkbox
+' exists or not.
+' Parameters: stCheckbox$ = Checkbox to be checked.
+' Returns: -1(true): Checkbox exists.
+' 0(false): Checkbox does not exist.
+' Example: fExists% = BCheckboxExists("&Delete")
+'
+FUNCTION BCheckboxExists%(stCheckbox$)
+
+ BCheckboxExists = WCheckExists(stCheckbox$) <> 0
+
+END FUNCTION
+
+
+'
+' XCheckboxExists (stCheckbox$)
+'
+' Description:
+' Reports error IF Checkbox does not exist in active window.
+'
+' Parameters: stCheckbox$ - Checkbox to be found.
+'
+' Returns: nothing
+'
+' Example: XCheckboxExists "&Delete"
+'
+SUB XCheckboxExists(stCheckbox$)
+ IF BCheckboxExists(stCheckbox$) = 0 THEN
+ XLogFailure "Checkbox " + stCheckbox$ + " does not Exist"
+ END IF
+END SUB
+
+
+'
+' XCheckboxNotExists (stCheckbox$)
+'
+' Description:
+' Reports error IF Checkbox Exists in active window.
+'
+' Parameters: stCheckbox$ - Checkbox to not be found.
+'
+' Returns: nothing
+'
+' Example: XCheckboxNotExists "&Delete"
+'
+'
+SUB XCheckboxNotExists(stCheckbox$)
+ IF BCheckboxExists(stCheckbox$) THEN
+ XLogFailure "Checkbox " + stCheckbox$ + " Exists"
+ END IF
+END SUB
+
+'
+' BCheckboxChecked(stCheckbox$)
+'
+' Description: This procedure checks the state of checkbox
+' Parameters: stCheckbox$ = Checkbox to check state of.
+' Returns: -1(true) IF the check box is checked.
+' 0(false) IF the check box is not checked.
+' Example: state% = BCheckboxChecked("Special")
+'
+FUNCTION BCheckboxChecked%(stCheckbox$)
+ BCheckboxChecked = WCheckState(stCheckbox$) <> 0
+END FUNCTION
+
+
+'
+' XCheckboxChecked(stCheckbox$)
+'
+' Description: This procedure checks the state of checkbox
+' Parameters: stCheckbox$ = Checkbox to check state of.
+' Returns: -1(true) IF the check box is checked.
+' 0(false) IF the check box is not checked.
+' Example: XCheckboxChecked "Special"
+'
+SUB XCheckboxChecked(stCheckbox$)
+ XCheckBoxExists stCheckbox$
+ IF BCheckboxChecked(stCheckbox$) = 0 THEN
+ XLogFailure "Checkbox " + stCheckbox$ + " is not checked"
+ END IF
+
+END SUB
+
+'
+' XCheckboxNotChecked(stCheckbox$)
+'
+' Description: This procedure checks the state of checkbox
+' Parameters: stCheckbox$ = Checkbox to check state of.
+' Returns: -1(true) IF the check box is checked.
+' 0(false) IF the check box is not checked.
+' Example: XCheckboxNotChecked "Special"
+'
+SUB XCheckboxNotChecked(stCheckbox$)
+ XCheckBoxExists stCheckbox$
+ IF BCheckboxChecked(stCheckbox$) THEN
+ XLogFailure "Checkbox " + stCheckbox$ + " is checked"
+ END IF
+
+END SUB
+
+
+'
+' BCheckboxEnabled(stCheckbox$)
+'
+' Description: This procedure checks to see IF the specified Checkbox
+' is enabled or not.
+' Parameters: stCheckbox$ = Checkbox to be checked.
+' Returns: -1(true): Checkbox enabled.
+' 0(false): Checkbox not enabled.
+' Example: fEnabled% = BCheckboxEnabled("&Delete")
+'
+FUNCTION BCheckboxEnabled%(stCheckbox$)
+
+ BCheckboxEnabled = WCheckEnabled(stCheckbox$) <> 0
+
+END FUNCTION
+
+
+'
+' XCheckboxEnabled (stCheckbox$)
+'
+' Description:
+' Reports error IF Checkbox is not Enabled.
+'
+' Parameters: stCheckbox$ - Checkbox to be checked.
+'
+' Returns: nothing
+'
+' Example: XCheckboxEnabled "&Delete"
+'
+'
+SUB XCheckboxEnabled(stCheckbox$)
+ XCheckBoxExists(stCheckbox$)
+ IF BCheckboxEnabled(stCheckbox$) = 0 THEN
+ XLogFailure "Checkbox " + stCheckbox$ + " is not Enabled"
+ END IF
+END SUB
+
+
+'
+' XCheckboxNotEnabled (stCheckbox$)
+'
+' Description:
+' Reports error IF Checkbox is Enabled.
+'
+' Parameters: stCheckbox$ - Checkbox to be checked.
+'
+' Returns: nothing
+'
+' Example: XCheckboxNotEnabled "&Delete"
+'
+SUB XCheckboxNotEnabled(stCheckbox$)
+ XCheckBoxExists(stCheckbox$)
+ IF BCheckboxEnabled(stCheckbox$) THEN
+ XLogFailure "Checkbox " + stCheckbox$ + " is Enabled"
+ END IF
+
+END SUB
+
+
+'
+' XClickCheckbox(stCheckbox$)
+'
+' Description: This procedure clicks the specified Checkbox in the
+' currently active window.
+' Parameters: stCheckbox$ = Checkbox to be clicked.
+' Returns: Nothing.
+' Example: XClickCheckbox "&Delete"
+'
+SUB XClickCheckbox(stCheckbox$)
+ XCheckBoxExists stCheckbox$
+ WCheckClick stCheckbox$
+
+END SUB
+
+
+
+' **********************************************************
+' ************* Dialog: Edit Control Subroutines ***********
+' **********************************************************
+
+
+'
+' XEditTextExists(stEditText$)
+'
+' Description: This procedure checks to see IF the specified EditText
+' exists or not.
+' Parameters: stEditText$ = EditText to be checked.
+' Returns: -1(true): EditText exists.
+' 0(false): EditText does not exist.
+' Example: XEditTextExists "File"
+'
+SUB XEditTextExists(stEditText$)
+
+ IF BEditTextExists(stEditText$) = 0 THEN
+ XLogFailure "Edit Text control " + stEditText$ + " does not exist"
+ END IF
+
+END SUB
+
+'
+' XEditTextNotExists(stEditTextNot$)
+'
+' Description: This procedure checks to see that the specified EditText
+' doesn't exist
+' Parameters: stEditTextNot$ = EditText to be checked.
+' Example: XEditTextNotExists "File"
+'
+SUB XEditTextNotExists(stEditTextNot$)
+
+ IF BEditTextExists(stEditTextNot$) THEN
+ XLogFailure "Edit Text control " + stEditTextNot$ + " exists"
+ END IF
+
+END SUB
+
+'
+' BEditTextExists(stEditText$)
+'
+' Description: This procedure checks to see IF the specified EditText
+' exists or not.
+' Parameters: stEditText$ = EditText to be checked.
+' Returns: -1(true): EditText exists.
+' 0(false): EditText does not exist.
+' Example: fExists% = BEditTextExists("File")
+'
+FUNCTION BEditTextExists%(stEditText$)
+
+ BEditTextExists = WEditExists(stEditText$) <> 0
+
+END FUNCTION
+
+'
+' StGetEditText (stEditCaption$)
+'
+' Description:
+' Returns string in Edit box with caption stEditCaption$
+' Logs error IF stEditCaption$ is not found, or IF Edit control
+' is not found following stEditCaption$ in the tabbing order.
+'
+' Parameters: stEditCaption$ - Caption that is associated with edit control
+'
+' Returns: String that is in the Edit control
+'
+' Example: a$ = StGetEditText("&FileName:")
+'
+'
+FUNCTION SGetEditText$(stEditCaption$)
+ XEditTextExists stEditCaption$
+ SGetEditText = EditText(stEditCaption$)
+
+END FUNCTION
+
+
+
+
+
+'
+' XSetEditText (stEditCaption$, stEditText$)
+'
+' Description:
+' Puts string stEditText$ in Edit box with caption stEditCaption$
+' Logs error IF stEditCaption$ is not found, or IF Edit control
+' is not found following stEditCaption$ in the tabbing order.
+'
+' Parameters: stEditCaption$ - Caption that is associated with edit control
+' stEditText$ - Text to put in the Edit control
+'
+' Returns: nothing
+'
+' Example: XSetEditText "&FileName:", "calc.exe"
+'
+'
+
+SUB XSetEditText (stEditCaption$, stEditText$)
+
+ XEditTextExists stEditCaption$
+ WEditSetText stEditCaption$, stEditText$
+
+END SUB
+
+
+
+
+
+' **********************************************************
+' ************* Dialog: Radio Button Subroutines ***********
+' **********************************************************
+
+
+
+'
+' BRadiobuttonExists(stRadiobutton$)
+'
+' Description: This procedure checks to see IF the specified Radiobutton
+' exists or not.
+' Parameters: stRadiobutton$ = Radiobutton to be checked.
+' Returns: -1(true): Radiobutton exists.
+' 0(false): Radiobutton does not exist.
+' Example: fExists% = BRadiobuttonExists("Blue")
+'
+FUNCTION BRadiobuttonExists%(stRadiobutton$)
+
+ BRadiobuttonExists = WOptionExists(stRadiobutton$) <> 0
+
+END FUNCTION
+
+
+'
+' XRadiobuttonExists (stRadiobutton$)
+'
+' Description:
+' Reports error IF Radiobutton does not exist in active window.
+'
+' Parameters: stRadiobutton$ - Radiobutton to be found.
+'
+' Returns: nothing
+'
+' Example: XRadiobuttonExists "Blue"
+'
+SUB XRadiobuttonExists(stRadiobutton$)
+ IF BRadiobuttonExists(stRadiobutton$) = 0 THEN
+ XLogFailure "Radiobutton " + stRadiobutton$ + " does not Exist"
+ END IF
+END SUB
+
+
+'
+' XRadiobuttonNotExists (stRadiobutton$)
+'
+' Description:
+' Reports error IF Radiobutton Exists in active window.
+'
+' Parameters: stRadiobutton$ - Radiobutton to not be found.
+'
+' Returns: nothing
+'
+' Example: XRadiobuttonNotExists "Blue"
+'
+SUB XRadiobuttonNotExists(stRadiobutton$)
+ IF BRadiobuttonExists(stRadiobutton$) THEN
+ XLogFailure "Radiobutton " + stRadiobutton$ + " Exists"
+ END IF
+END SUB
+
+
+'
+' BRadiobuttonEnabled(stRadiobutton$)
+'
+' Description: This procedure checks to see IF the specified Radiobutton
+' is enabled or not.
+' Parameters: stRadiobutton$ = Radiobutton to be checked.
+' Returns: -1(true): Radiobutton enabled.
+' 0(false): Radiobutton not enabled.
+' Example: fEnabled% = BRadiobuttonEnabled("Blue")
+'
+FUNCTION BRadiobuttonEnabled%(stRadiobutton$)
+ BRadiobuttonEnabled = WOptionEnabled(stRadiobutton$) <> 0
+END FUNCTION
+
+
+'
+' XRadiobuttonEnabled (stRadiobutton$)
+'
+' Description:
+' Reports error IF Radiobutton is not Enabled.
+'
+' Parameters: stRadiobutton$ - Radiobutton to be checked.
+'
+' Returns: nothing
+'
+' Example: XRadiobuttonEnabled "Blue"
+'
+SUB XRadiobuttonEnabled(stRadiobutton$)
+ XRadiobuttonExists stRadiobutton$
+ IF BRadiobuttonEnabled(stRadiobutton$) = 0 THEN
+ XLogFailure "Radiobutton " + stRadiobutton$ + " is not Enabled"
+ END IF
+END SUB
+
+
+'
+' XRadiobuttonNotEnabled (stRadiobutton$)
+'
+' Description:
+' Reports error IF Radiobutton is Enabled.
+'
+' Parameters: stRadiobutton$ - Radiobutton to be checked.
+'
+' Returns: nothing
+'
+' Example: XRadiobuttonNotEnabled "Blue"
+'
+'
+SUB XRadiobuttonNotEnabled(stRadiobutton$)
+ XRadiobuttonExists stRadiobutton$
+ IF BRadiobuttonEnabled(stRadiobutton$) THEN
+ XLogFailure "Radiobutton " + stRadiobutton$ + " Enabled"
+ END IF
+END SUB
+
+'
+' BRadiobuttonChecked(stRadiobutton$)
+'
+' Description: This procedure checks to see IF the specified Radiobutton
+' is Checked or not.
+' Parameters: stRadiobutton$ = Radiobutton to be checked.
+' Returns: -1(true): Radiobutton Checked.
+' 0(false): Radiobutton not Checked.
+' Example: fChecked% = BRadiobuttonChecked("Blue")
+'
+FUNCTION BRadiobuttonChecked%(stRadiobutton$)
+
+ BRadiobuttonChecked = WOptionState(stRadiobutton$) <> 0
+
+END FUNCTION
+
+
+'
+' XRadiobuttonChecked (stRadiobutton$)
+'
+' Description:
+' Reports error IF Radiobutton is not Checked.
+'
+' Parameters: stRadiobutton$ - Radiobutton to be checked.
+'
+' Returns: nothing
+'
+' Example: XRadiobuttonChecked "Blue"
+'
+SUB XRadiobuttonChecked(stRadiobutton$)
+ XRadiobuttonExists stRadiobutton$
+ IF BRadiobuttonChecked(stRadiobutton$) = 0 THEN
+ XLogFailure "Radiobutton " + stRadiobutton$ + " is not Checked"
+ END IF
+END SUB
+
+
+'
+' XRadiobuttonNotChecked (stRadiobutton$)
+'
+' Description:
+' Reports error IF Radiobutton is Checked.
+'
+' Parameters: stRadiobutton$ - Radiobutton to be checked.
+'
+' Returns: nothing
+'
+' Example: XRadiobuttonNotChecked "Blue"
+'
+'
+SUB XRadiobuttonNotChecked(stRadiobutton$)
+ XRadiobuttonExists stRadiobutton$
+ IF BRadiobuttonChecked(stRadiobutton$) THEN
+ XLogFailure "Radiobutton " + stRadiobutton$ + " Checked"
+ END IF
+END SUB
+
+
+'
+' XClickRadiobutton(stRadiobutton$)
+'
+' Description: This procedure clicks the specified Radiobutton in the
+' currently active window.
+' Parameters: stRadiobutton$ = Radiobutton to be clicked.
+' Returns: Nothing.
+' Example: XClickRadiobutton "Blue"
+'
+SUB XClickRadiobutton(stRadiobutton$)
+ XRadioButtonExists stRadiobutton$
+ WOptionClick stRadiobutton$
+
+END SUB
+
diff --git a/private/oleauto/tools/win16/os2/inc/ftestutl.mst b/private/oleauto/tools/win16/os2/inc/ftestutl.mst
new file mode 100644
index 000000000..211143b45
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ftestutl.mst
@@ -0,0 +1,954 @@
+'FTESTUtl.inc - definitions for Fast Test Utility routines
+'
+' Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+'
+'Purpose:
+' This file defines the utility functions of the Fast Test functionality
+'
+
+
+'**********************************************************
+'***************** File Subroutines ***********************
+'**********************************************************
+
+
+'
+' XFileExist(stFileSpec$)
+'
+' Description:
+' Will check IF stFileSpec$ exists.
+' logs a failure IF it can't find it (them)
+'
+' Parameters: stFileSpec$ - file specification
+'
+' Returns: nothing
+'
+' Example: XFileExist SGetWinDir() + "\*.bak"
+' 'checks for any .bak files in windows directory
+'
+'
+SUB XFileExist(stFileSpec$)
+ IF NOT EXISTS(stFileSpec$) THEN
+ XLogFailure stFileSpec$ + " doesn't exist"
+ END IF
+END SUB
+
+'
+' XFileNotExist(stFileSpec$)
+'
+' Description:
+' Will check IF stFileSpec$ exists.
+' logs a failure IF it can't find it (them)
+'
+' Parameters: stFileSpec$ - file specification
+'
+' Returns: nothing
+'
+' Example: XFileNotExist SGetWinDir() + "\*.bak"
+' 'checks for any .bak files in windows directory
+'
+'
+SUB XFileNotExist(stFileSpec$)
+ IF EXISTS(stFileSpec$) THEN
+ XLogFailure stFileSpec$ + " exists"
+ END IF
+END SUB
+
+'
+' BFileExist(stFileSpec$)
+'
+' Description:
+' Will check IF stFileSpec$ exists.
+' logs a failure IF it can't find it (them)
+'
+' Parameters: stFileSpec$ - file specification
+'
+' Returns: nothing
+'
+'
+'
+FUNCTION BFileExist%(stFileSpec$)
+ BFileExist = EXISTS(stFileSpec$)
+END FUNCTION
+
+
+'
+' XFileCmp(stFileSpec1$,stFileSpec2$)
+'
+' Description:
+' Compares two files, line by line
+'
+' Parameters: stFileSpec1$,stFileSpec2 - file specifications
+'
+' Returns: nothing
+'
+' Example: XFileCmp "Foo.dat","foo.bsl"
+'
+'
+'
+SUB XFileCmp(stFileSpec1$,stFileSpec2$)
+ DIM fh1%
+ DIM fh2%
+ DIM line1$
+ DIM line2$
+ DIM done
+ DIM diff
+
+ gfErrorType = ET_NEXT
+ fh1% = FREEFILE
+ OPEN stFileSpec1$ FOR INPUT AS #fh1%
+ fh2% = FREEFILE
+ OPEN stFileSpec2$ FOR INPUT AS #fh2%
+
+ IF gfError THEN
+ XLogFailure "Could not open files for XFileCmp"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+
+
+ done = FALSE
+ diff = FALSE
+
+ IF EOF(fh1%) AND EOF(fh2%) THEN
+ done = TRUE
+ END IF
+
+ IF NOT done AND (EOF(fh1%) OR EOF(fh2%)) THEN
+ diff = TRUE
+ done = TRUE
+ END IF
+
+
+ WHILE NOT done
+
+ INPUT #fh1%,line1$
+ INPUT #fh2%,line2$
+
+ IF gfError THEN
+ XLogFailure "XFileCmp INPUT or EOF errors"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+
+
+ IF line1$ <> line2$ THEN
+ done = TRUE
+ diff = TRUE
+ END IF
+
+ IF NOT done AND EOF(fh1%) AND EOF(fh2%) THEN
+ done = TRUE
+ END IF
+
+ IF NOT done AND (EOF(fh1%) OR EOF(fh2%)) THEN
+ diff = TRUE
+ done = TRUE
+ END IF
+
+ WEND
+
+ CLOSE #fh1%
+ CLOSE #fh2%
+
+ IF gfError THEN
+ XLogFailure "XFileCmp CLOSE errors"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+
+ gfErrorType = ET_NOTHING
+
+ IF diff THEN
+ XLogFailure "Files " + stFileSpec1$ + "," + stFileSpec2$ + " don't compare"
+ END IF
+
+END SUB
+
+'
+' XFileNotCmp(stFileSpec1$,stFileSpec2$)
+'
+' Description:
+' Compares two files, line by line
+'
+' Parameters: stFileSpec1$,stFileSpec2 - file specifications
+'
+' Returns: nothing
+'
+' Example: XFileNotCmp "Foo.dat","foo.bsl"
+'
+'
+'
+SUB XFileNotCmp(stFileSpec1$,stFileSpec2$)
+ DIM fh1%
+ DIM fh2%
+ DIM line1$
+ DIM line2$
+ DIM done
+ DIM diff
+
+ gfErrorType = ET_NEXT
+
+ fh1% = FREEFILE
+ OPEN stFileSpec1$ FOR INPUT AS #fh1%
+ fh2% = FREEFILE
+ OPEN stFileSpec2$ FOR INPUT AS #fh2%
+
+ IF gfError THEN
+ XLogFailure "Could not open files for XFileNotCmp"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+
+ done = FALSE
+ diff = FALSE
+
+ IF EOF(fh1%) AND EOF(fh2%) THEN
+ done = TRUE
+ END IF
+
+ IF NOT done AND (EOF(fh1%) OR EOF(fh2%)) THEN
+ diff = TRUE
+ done = TRUE
+ END IF
+
+ WHILE NOT done
+
+ INPUT #fh1%,line1$
+ INPUT #fh2%,line2$
+
+ IF gfError THEN
+ XLogFailure "XFileNotCmp INPUT or EOF errors"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+
+ IF line1$ <> line2$ THEN
+ done = TRUE
+ diff = TRUE
+ END IF
+
+ IF NOT done AND EOF(fh1%) AND EOF(fh2%) THEN
+ done = TRUE
+ END IF
+
+ IF NOT done AND (EOF(fh1%) OR EOF(fh2%)) THEN
+ diff = TRUE
+ done = TRUE
+ END IF
+
+ WEND
+
+ CLOSE #fh1%
+ CLOSE #fh2%
+
+ IF gfError THEN
+ XLogFailure "XFileNotCmp CLOSE errors"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+
+ gfErrorType = ET_NOTHING
+
+ IF NOT diff THEN
+ XLogFailure "Files " + stFileSpec1$ + "," + stFileSpec2$ + " do compare"
+ END IF
+END SUB
+
+'
+' BFileCmp%(stFileSpec1$,stFileSpec2$)
+'
+' Description:
+' Compares two files, line by line
+'
+' Parameters: stFileSpec1$,stFileSpec2 - file specifications
+'
+' Returns: FALSE IF XFileCmp would detect an error
+'
+' Example: x% = BFileCmp "Foo.dat","foo.bsl"
+'
+'
+'
+FUNCTION BFileCmp%(stFileSpec1$,stFileSpec2$)
+ DIM fh1%
+ DIM fh2%
+ DIM line1$
+ DIM line2$
+ DIM done
+ DIM diff
+
+ gfErrorType = ET_NEXT
+ fh1% = FREEFILE
+ OPEN stFileSpec1$ FOR INPUT AS #fh1%
+ fh2% = FREEFILE
+ OPEN stFileSpec2$ FOR INPUT AS #fh2%
+
+ IF gfError THEN
+ BFileCmp = FALSE
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT FUNCTION
+ END IF
+
+ done = FALSE
+ diff = FALSE
+
+ IF EOF(fh1%) AND EOF(fh2%) THEN
+ done = TRUE
+ END IF
+
+ IF NOT done AND (EOF(fh1%) OR EOF(fh2%)) THEN
+ diff = TRUE
+ done = TRUE
+ END IF
+
+ WHILE NOT done
+
+ INPUT #fh1%,line1$
+ INPUT #fh2%,line2$
+
+ IF gfError THEN
+ BFileCmp = FALSE
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT FUNCTION
+ END IF
+
+ IF line1$ <> line2$ THEN
+ done = TRUE
+ diff = TRUE
+ END IF
+
+ IF NOT done AND EOF(fh1%) AND EOF(fh2%) THEN
+ done = TRUE
+ END IF
+
+ IF NOT done AND (EOF(fh1%) OR EOF(fh2%)) THEN
+ diff = TRUE
+ done = TRUE
+ END IF
+
+ WEND
+
+ CLOSE #fh1%
+ CLOSE #fh2%
+
+ IF gfError THEN
+ BFileCmp = FALSE
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT FUNCTION
+ END IF
+
+ BFileCmp = NOT diff ' IF different a log failure would normally happen
+
+END FUNCTION
+
+
+'
+' XDeleteFile(stFileSpec$)
+'
+' Description:
+' Will delete stFileSpec$ IF it, they, exists.
+' logs a failure IF it can't delete them or IF the file(s)
+' doesn't exist
+'
+' Parameters: stFileSpec$ - file specification
+'
+' Returns: nothing
+'
+' Example: XDeleteFile SGetWinDir() + "\*.bak"
+' 'deletes all .bak files in windows directory
+'
+'
+SUB XDeleteFile(stFileSpec$)
+ IF EXISTS(stFileSpec$) THEN
+ gfErrorType = ET_NEXT
+ KILL stFileSpec$
+ IF gfError THEN
+ XLogFailure "XDeleteFile " + stFileSpec$ + " could NOT be deleted"
+ gfError = FALSE
+ END IF
+ gfErrorType = ET_NOTHING
+ ELSE
+ XLogFailure "XDeleteFile " + stFileSpec$ + " NOT deleted (doesn't exist)."
+ END IF
+END SUB
+
+'
+' XDeleteFileIfExist(stFileSpec$)
+'
+' Description:
+' Will delete stFileSpec$ IF it, they, exists.
+' logs a failure IF it can't delete them but doesn't IF the file(s)
+' doesn't exist
+'
+' Parameters: stFileSpec$ - file specification
+'
+' Returns: nothing
+'
+' Example: XDeleteFileIfExist SGetWinDir() + "\*.bak"
+' 'deletes all .bak files in windows directory
+'
+'
+SUB XDeleteFileIfExist(stFileSpec$)
+ IF EXISTS(stFileSpec$) THEN
+ gfErrorType = ET_NEXT
+ KILL stFileSpec$
+ IF gfError THEN
+ XLogFailure "XDeleteFileIfExists " + stFileSpec$ + " could NOT be deleted"
+ gfError = FALSE
+ END IF
+ gfErrorType = ET_NOTHING
+ END IF
+END SUB
+
+'
+' XCreateFile(stFileSpec$,s$)
+'
+' Description:
+' Will Create stFileSpec$ and put string in it
+' logs a failure IF it can't Create it
+'
+' Parameters: stFileSpec$ - file specification
+'
+' Returns: nothing
+'
+' Example: XCreateFile "foo.dat","Hello world"
+'
+'
+'
+
+SUB XCreateFile(stFileSpec$,s$)
+ DIM fh%
+ gfErrorType = ET_NEXT
+ fh% = FREEFILE
+
+ OPEN stFileSpec$ FOR OUTPUT AS #fh%
+
+ PRINT #fh%,s$
+
+ CLOSE #fh%
+
+ IF gfError THEN
+ XLogFailure "XCreateFile encountered runtime errors"
+ gfError = FALSE
+ END IF
+ gfErrorType = ET_NOTHING
+
+END SUB
+
+'
+' XAppendFile(stFileSpec$,s$)
+'
+' Description:
+' Will Append stFileSpec$ and put string in it
+' logs a failure IF it can't Append it
+'
+' Parameters: stFileSpec$ - file specification
+'
+' Returns: nothing
+'
+' Example: XAppendFile "foo.dat","Hello world"
+'
+'
+'
+
+SUB XAppendFile(stFileSpec$,s$)
+ DIM fh%
+
+ gfErrorType = ET_NEXT
+
+ fh% = FREEFILE
+
+ OPEN stFileSpec$ FOR APPEND AS #fh%
+
+ PRINT #fh%,s$
+
+ CLOSE #fh%
+
+ IF gfError THEN
+ XLogFailure "XCreateFile encountered runtime errors"
+ gfError = FALSE
+ END IF
+ gfErrorType = ET_NOTHING
+
+END SUB
+
+
+
+' XWaitMessageFile(string,string,integer)
+' Wait for a file to exist, check IF string argument is in file anywhere
+' log failures
+
+SUB XWaitMessageFile(s$,Message$, WaitTime%)
+
+ DIM fDone%
+ DIM fFound%
+ DIM ret%
+ DIM line$
+ DIM inret%
+ DIM fh%
+
+ fh% = FREEFILE
+
+ fDone = FALSE
+ fFound = FALSE
+
+ WHILE NOT fDone
+
+ IF EXISTS(s$) THEN
+ fDone = TRUE
+ fFound = TRUE
+ ELSE
+ SLEEP 1
+
+ WaitTime% = WaitTime% - 1
+ IF WaitTime% <= 0 THEN
+ fDone = TRUE
+ END IF
+ END IF
+ WEND
+
+ IF NOT fFound% THEN
+ XLogFailure "FAIL """ + s$ + """ Message File not found"
+ ELSE
+
+ fDone = FALSE
+ fFOUND = FALSE
+
+ gfErrorType = ET_NEXT
+
+ OPEN s$ FOR INPUT AS # fh%
+
+ IF EOF(fh%) THEN
+ fDone% = TRUE
+ END IF
+
+ IF gfError THEN
+ XLogFailure "XWaitMessageFile encountered runtime error during OPEN"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+
+ WHILE NOT fDone%
+
+ INPUT # fh%, line$
+
+ IF gfError THEN
+ XLogFailure "XWaitMessageFile encountered runtime error during INPUT"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+
+ inret% = INSTR(line$,Message$)
+
+ IF inret% <> 0 THEN
+ fFound% = TRUE
+ fDone = TRUE
+ END IF
+
+ IF EOF(fh%) THEN
+ fDone% = TRUE
+ END IF
+ WEND
+
+ CLOSE # fh%
+
+ IF gfError THEN
+ XLogFailure "XWaitMessageFile encountered runtime error during CLOSE"
+ gfErrorType = ET_NOTHING
+ gfError = FALSE
+ EXIT SUB
+ END IF
+ gfErrorType = ET_NOTHING
+
+ IF NOT fFound% THEN
+ XLogFailure "FAIL, found """ + s$ + """ Message File, """ + Message$ + """ not in it"
+ END IF
+ END IF
+END SUB
+
+'**********************************************************
+'***************** Directory Subroutines ******************
+'**********************************************************
+
+' XCWDCmp(s$)
+' Cmp the current working directory to given string
+' and log a failure IF they don't match
+
+SUB XCWDCmp(s$)
+
+ IF BCWDCmp(s$) THEN
+ XLogFailure "Current working directory (" + UCASE$(CURDIR$) + ") doesn't match " + UCASE$(s$)
+ END IF
+END SUB
+
+' XCWDNotCmp(s$)
+' Cmp the current working directory to given string
+' and log a failure IF they match
+
+SUB XCWDNotCmp(s$)
+
+ IF UCASE$(CURDIR$) = UCASE$(s$) THEN
+ XLogFailure "Current working directory (" + UCASE$(CURDIR$) + ") matches " + UCASE$(s$)
+ END IF
+END SUB
+
+' BCWDCmp(s$)
+' Cmp the current working directory to given string
+' and return result (FALSE if normally a failure would be logged)
+
+FUNCTION BCWDCmp%(s$)
+
+ BCWDCmp = UCASE$(CURDIR$) = UCASE$(s$)
+
+END FUNCTION
+
+' XDriveCmp(s$)
+' Cmp the current working Drive to given string
+' and log a failure IF they don't match
+
+SUB XDriveCmp(s$)
+
+ IF BDriveCmp%(s$) THEN
+ XLogFailure "Current working Drive (" + MID$(UCASE$(CURDIR$),1,2) + ") doesn't match " + UCASE$(s$)
+ END IF
+END SUB
+
+' XDriveNotCmp(s$)
+' Cmp the current working Drive to given string
+' and log a failure IF they match
+
+SUB XDriveNotCmp(s$)
+
+ IF MID$(UCASE$(CURDIR$),1,2) = UCASE$(s$) THEN
+ XLogFailure "Current working Drive (" + MID$(UCASE$(CURDIR$),1,2) + ") matches " + s$
+ END IF
+END SUB
+
+' BDriveCmp(s$)
+' Cmp the current working Drive to given string
+' and return result
+
+FUNCTION BDriveCmp%(s$)
+
+ BDriveCmp = MID$(UCASE$(CURDIR$),1,2) = UCASE$(s$)
+
+END FUNCTION
+
+' XChangeCWD(s$)
+' change to given working directory, log failure IF doesn't succeed
+'
+SUB XChangeCWD(s$)
+ gfErrorType = EC_NEXT
+ CHDIR s$
+ IF gfError THEN
+ XLogFailure "XChangeCWD could not change directory"
+ gfError = FALSE
+ END IF
+ gfErrorType = EC_NOTHING
+END SUB
+
+' XChangeDrive(s$)
+' change to given working drive, log failure IF doesn't succeed
+'
+SUB XChangeDrive(s$)
+ gfErrorType = EC_NEXT
+ CHDRIVE s$
+ IF gfError THEN
+ XLogFailure "XChangeDrive could not change drive"
+ gfError = FALSE
+ END IF
+ gfErrorType = EC_NOTHING
+END SUB
+
+'**********************************************************
+'***************** Program Subroutines ********************
+'**********************************************************
+
+
+
+'
+' HStartApp%(stAppName$)
+'
+' Description: Starts app AppName and returns the handle to the App
+'
+' Parameters: stAppName$ - name of app to WinExec and get handle to
+'
+' Returns: handle to application started
+'
+' Example: hWinHelp% = HStartApp("winhelp.exe")
+'
+'
+FUNCTION HStartApp%(stAppName$)
+ DIM Bogus%
+ DIM lpszTemp$
+ Bogus% = WinExec (stAppName$, SW_SHOWNORMAL)
+ lpszTemp$ = "WinExec error with " + stAppName$ + " :"
+
+ ' WinExec defines SOME of the values between 0 and 32
+ ' as errors... any return value greater than 32
+ ' should be considered a success!
+ SELECT CASE Bogus%
+ CASE 0
+ XLogFailure lpszTemp$ + "Out of memory - exiting"
+
+ CASE 2
+ XLogFailure lpszTemp$ + "File not found"
+ End
+ CASE 3
+ XLogFailure lpszTemp$ + "Path not found"
+
+ CASE 5
+ XLogFailure lpszTemp$ + "Attempt to dynamically link to a task"
+
+ CASE 6
+ XLogFailure lpszTemp$ + "Library requires separate data segments"
+
+ CASE 10
+ XLogFailure lpszTemp$ + "Incorrect Windows version"
+
+ CASE 11
+ XLogFailure lpszTemp$ + "Invalid EXE file"
+
+ CASE 12
+ XLogFailure lpszTemp$ + "OS/2 application"
+
+ CASE 13
+ XLogFailure lpszTemp$ + "DOS 4.0 application"
+
+ CASE 14
+ XLogFailure lpszTemp$ + "Unknown EXE type"
+
+ CASE 15
+ XLogFailure lpszTemp$ + "Must run in real mode Windows"
+
+ CASE 16
+ XLogFailure lpszTemp$ + "Cannot run more than one instance"
+
+ CASE 17
+ XLogFailure lpszTemp$ + "Large-frame EMS allows only one instance"
+
+ CASE 18
+ XLogFailure lpszTemp$ + "Must run in standard or enhanced mode Windows"
+
+ CASE 0 TO 32
+ XLogFailure lpszTemp$ + "Unknown Error in WinExec"
+
+ END SELECT
+
+ HStartApp = GetActiveWindow ()
+END FUNCTION
+
+'
+' XStartApp(stAppName$)
+'
+' Description: Starts app AppName and sets handle to ghAppHwnd.
+' IF we get a null handle, THEN we end the script here.
+'
+' Parameters: stAppName$ - name of app to WinExec
+'
+' Returns: nothing
+'
+' Example: XStartApp "winhelp.exe"
+'
+'
+SUB XStartApp(stAppName$, stClassname$)
+ 'ghAppHwnd is a global
+ ghAppHwnd = HStartApp(stAppName$)
+ IF (ghAppHwnd = 0) THEN
+ 'we didn't get a handle
+ XLogFailure "Unable to start app " + stAppName$
+ END IF
+ IF stClassname$ <> "" THEN
+ gsAppClassname = stClassname$ ' remember it for later
+ IF FindWindow(stClassname$,NULL) = 0 THEN
+ ' The app isn't around
+ XLog "The app " + stAppName$ + " started but didn't stay OR..."
+ XLogFailure "the given class name (" + stClassname$ + ") is incorrect"
+ END IF
+ END IF
+END SUB
+
+' XSetCleanup sCleanup$
+' Description: gets the users cleanup string to be sent to
+' an application to get it to quit IF a failure in a test suite
+' occurs. The string is a DoKeys formatted string
+SUB XSetCleanup (sCleanup$)
+ gsCleanup$ = sCleanup$
+END SUB
+
+' This routine is executed when the script finishes with an END
+' statement. Its purpose is to find the application started with
+' XStartapp using the classname supplied there. IF it exists,
+' and the gsCleanup string is nonempty, the gsCleanup string will
+' be played. This may still not get rid of the app for various
+' reasons: maybe it is prompting to save a file, or it won't exit
+' a dialog...
+
+SUB XDoCleanup
+ IF gsCleanup$ <> "" AND gsAppClassname$ <> "" THEN
+ DoKeys gsCleanup$
+ END IF
+ IF FindWindow(gsAppClassname$,NULL) <> 0 THEN
+ XLog "The app with class name " + gsAppClassname$ + " was not"
+ XLogFailure "halted by the cleanup string " + gsCleanup$
+ END IF
+
+END SUB
+
+'$ifdef DOFINDAPP
+'
+' HFindApplication (Caption$)
+'
+' Description: Returns the handle to window with caption Caption$
+'
+' Parameters: Caption$ - a string representing a substring of
+' caption to find
+'
+' Returns: Handle to window IF window with caption Caption$ exists
+' IF no such caption is found THEN 0 (zero) is returned
+'
+' Example: HFindApplication ("Excel")
+'
+'
+'
+'
+FUNCTION HFindApplication%(stCaption$)
+ DIM stTitle$
+ DIM x%
+
+ stTitle$ = String$(100,32)
+
+ hwnd1% = GetDesktopWindow ()
+ hwnd1% = GetWindow (hwnd1%, GWCHILD)
+
+ WHILE(hwnd1%)
+ x% = GetWindowText (hwnd1%, stTitle$, len(stTitle$)-1)
+ IF InStr(1, stTitle$, stCaption$) THEN
+ 'window was found
+ HFindApplication = hwnd1%
+ Exit Function
+ END IF
+ hwnd1% = GetWindow (hwnd1%, GWHWNDNEXT)
+ WEND
+
+ 'no such window was found, so return 0
+ HFindApplication = 0
+
+END FUNCTION
+'$endif
+
+
+
+'**********************************************************
+'***************** Mouse Subroutines **********************
+'**********************************************************
+
+' The mouse routines use the VK_LBUTTON, VK_RBUTTON, VK_MBUTTON
+' constants to determine which button to use
+
+
+SUB XMoveMouse (x%, y%)
+
+ QueMouseMove x%,y%
+ QueFlush FALSE
+END SUB
+
+
+' XClick(integer,integer,integer)
+'NOTE: the x and y optional WIT version can't be done with mouseevent call
+' Click the given mouse button at the current location
+' the three predefined CONST values for button are LEFT%,MIDDLE% and RIGHT%
+
+SUB XClick(button%, x%, y%)
+
+ QueMouseDn button%,x%,y%
+ QueMouseUp button%,x%,y%
+ QueFlush FALSE
+
+END SUB
+
+' XDblClick(integer,integer,integer)
+'NOTE: the x and y optional WIT version can't be done with mouseevent call
+' Double Click the given mouse button at the current location
+' the three predefined CONST values for button are LEFT%,MIDDLE% and RIGHT%
+
+SUB XDblClick (button%, x%, y%)
+
+ QueMouseDblClk button%,x%,y%
+ QueFlush FALSE
+
+END SUB
+
+' XDragMouse(integer,integer,integer)
+'NOTE: the x and y optional WIT version can't be done with mouseevent call
+' Drag the given mouse button from the current location to x,y coordinates
+' the three predefined CONST values for button are LEFT%,MIDDLE% and RIGHT%
+
+SUB XDragMouse (button%, x%, y%)
+
+ QueMouseDn button%,x%,y%
+ QueMouseMove x%,y%
+ QueMouseUp button%,x%,y%
+ QueFlush FALSE
+END SUB
+
+
+
+
+'**********************************************************
+'***************** ClipBoard Subroutines ******************
+'**********************************************************
+
+
+
+' XClipBoardCmp(string)
+' compare information in clipboard against passed argument
+' log results to logfile and return TRUE IF compared, FALSE IF not
+SUB XClipBoardCmp (s$)
+
+ DIM cs$
+
+ cs$ = ClipBoard$
+
+ IF s$ <> cs$ THEN
+ XLogFailure "String does not match clipboard"
+ END IF
+END SUB
+
+
+'**********************************************************
+'***************** Misc Subroutines ***********************
+'**********************************************************
+
+
+'
+' STStripNull(target$)
+'
+' Description: This routine removes the Null character from a null terminated string
+' Parameters: target$ = string to remove Null from.
+' Returns: a string without Null character.
+' Example: Print SStripNull$("aaa"+chr$(0)) 'output is 'aaa' without chr$(0).
+'
+FUNCTION SStripNull$(target$)
+ DIM pos%
+
+ pos% = InStr(1, target$, Chr$(0)) 'find the null terminator
+ IF pos% > 1 THEN
+ target$ = Mid$(target$, 1, pos% - 1) 'save only chars up to null
+ SStripNull = target$ 'return target$
+ ELSE
+ SStripNull = ""
+ END IF
+END FUNCTION
+
diff --git a/private/oleauto/tools/win16/os2/inc/graph.h b/private/oleauto/tools/win16/os2/inc/graph.h
new file mode 100644
index 000000000..f9c374d11
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/graph.h
@@ -0,0 +1,471 @@
+/***
+*graph.h - declare constants, functions, and macros for graphics library
+*
+* Copyright (c) 1987 - 1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file declares the graphics library functions and the
+* structures and manifest constants that are used with them.
+*
+***************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" { /* allow use with C++ */
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __huge _huge
+#endif
+
+/* force word packing to avoid possible -Zp override */
+#pragma pack(2)
+
+
+/* user-visible declarations for Quick-C Graphics Library */
+
+#ifndef _VIDEOCONFIG_DEFINED
+/* structure for _getvideoconfig() as visible to user */
+struct _videoconfig {
+ short numxpixels; /* number of pixels on X axis */
+ short numypixels; /* number of pixels on Y axis */
+ short numtextcols; /* number of text columns available */
+ short numtextrows; /* number of text rows available */
+ short numcolors; /* number of actual colors */
+ short bitsperpixel; /* number of bits per pixel */
+ short numvideopages; /* number of available video pages */
+ short mode; /* current video mode */
+ short adapter; /* active display adapter */
+ short monitor; /* active display monitor */
+ short memory; /* adapter video memory in K bytes */
+};
+#define _VIDEOCONFIG_DEFINED
+#endif
+
+#ifndef _XYCOORD_DEFINED
+/* return value of _setvieworg(), etc. */
+struct _xycoord {
+ short xcoord;
+ short ycoord;
+};
+#define _XYCOORD_DEFINED
+#endif
+
+/* structure for text position */
+#ifndef _RCCOORD_DEFINED
+struct _rccoord {
+ short row;
+ short col;
+};
+#define _RCCOORD_DEFINED
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define videoconfig _videoconfig
+#define xycoord _xycoord
+#define rccoord _rccoord
+#endif
+
+
+/* ERROR HANDLING */
+short __far __cdecl _grstatus(void);
+
+/* Error Status Information returned by _grstatus() */
+
+/* successful */
+#define _GROK 0
+
+/* errors */
+#define _GRERROR (-1)
+#define _GRMODENOTSUPPORTED (-2)
+#define _GRNOTINPROPERMODE (-3)
+#define _GRINVALIDPARAMETER (-4)
+#define _GRFONTFILENOTFOUND (-5)
+#define _GRINVALIDFONTFILE (-6)
+#define _GRCORRUPTEDFONTFILE (-7)
+#define _GRINSUFFICIENTMEMORY (-8)
+#define _GRINVALIDIMAGEBUFFER (-9)
+
+/* warnings */
+#define _GRNOOUTPUT 1
+#define _GRCLIPPED 2
+#define _GRPARAMETERALTERED 3
+
+
+/* SETUP AND CONFIGURATION */
+
+short __far __cdecl _setvideomode(short);
+short __far __cdecl _setvideomoderows(short,short); /* return rows; 0 if error */
+
+/* arguments to _setvideomode() */
+#define _MAXRESMODE (-3) /* graphics mode with highest resolution */
+#define _MAXCOLORMODE (-2) /* graphics mode with most colors */
+#define _DEFAULTMODE (-1) /* restore screen to original mode */
+#define _TEXTBW40 0 /* 40-column text, 16 grey */
+#define _TEXTC40 1 /* 40-column text, 16/8 color */
+#define _TEXTBW80 2 /* 80-column text, 16 grey */
+#define _TEXTC80 3 /* 80-column text, 16/8 color */
+#define _MRES4COLOR 4 /* 320 x 200, 4 color */
+#define _MRESNOCOLOR 5 /* 320 x 200, 4 grey */
+#define _HRESBW 6 /* 640 x 200, BW */
+#define _TEXTMONO 7 /* 80-column text, BW */
+#define _HERCMONO 8 /* 720 x 348, BW for HGC */
+#define _MRES16COLOR 13 /* 320 x 200, 16 color */
+#define _HRES16COLOR 14 /* 640 x 200, 16 color */
+#define _ERESNOCOLOR 15 /* 640 x 350, BW */
+#define _ERESCOLOR 16 /* 640 x 350, 4 or 16 color */
+#define _VRES2COLOR 17 /* 640 x 480, BW */
+#define _VRES16COLOR 18 /* 640 x 480, 16 color */
+#define _MRES256COLOR 19 /* 320 x 200, 256 color */
+#define _ORESCOLOR 64 /* 640 x 400, 1 of 16 colors (Olivetti only) */
+
+/* the following 8 modes require VESA SuperVGA BIOS extensions */
+#define _ORES256COLOR 0x0100 /* 640 x 400, 256 color */
+#define _VRES256COLOR 0x0101 /* 640 x 480, 256 color */
+
+/* WARNING: DO NOT attempt to set the following modes without ensuring that
+ your monitor can safely handle that resolution. Otherwise, you may risk
+ damaging your display monitor! Consult your owner's manual for details.
+ Note: _MAXRESMODE and _MAXCOLORMODE never select SRES, XRES, or ZRES modes */
+
+/* requires NEC MultiSync 3D or equivalent, or better */
+#define _SRES16COLOR 0x0102 /* 800 x 600, 16 color */
+#define _SRES256COLOR 0x0103 /* 800 x 600, 256 color */
+
+/* requires NEC MultiSync 4D or equivalent, or better */
+#define _XRES16COLOR 0x0104 /* 1024 x 768, 16 color */
+#define _XRES256COLOR 0x0105 /* 1024 x 768, 256 color */
+
+/* requires NEC MultiSync 5D or equivalent, or better */
+#define _ZRES16COLOR 0x0106 /* 1280 x 1024, 16 color */
+#define _ZRES256COLOR 0x0107 /* 1280 x 1024, 256 color */
+
+
+short __far __cdecl _setactivepage(short);
+short __far __cdecl _setvisualpage(short);
+short __far __cdecl _getactivepage(void);
+short __far __cdecl _getvisualpage(void);
+
+/* _videoconfig adapter values */
+/* these manifest constants can be used to determine the type of the active */
+/* adapter, using either simple comparisons or the bitwise-AND operator (&) */
+#define _MDPA 0x0001 /* Monochrome Display Adapter (MDPA) */
+#define _CGA 0x0002 /* Color Graphics Adapter (CGA) */
+#define _EGA 0x0004 /* Enhanced Graphics Adapter (EGA) */
+#define _VGA 0x0008 /* Video Graphics Array (VGA) */
+#define _MCGA 0x0010 /* MultiColor Graphics Array (MCGA) */
+#define _HGC 0x0020 /* Hercules Graphics Card (HGC) */
+#define _OCGA 0x0042 /* Olivetti Color Graphics Adapter (OCGA) */
+#define _OEGA 0x0044 /* Olivetti Enhanced Graphics Adapter (OEGA) */
+#define _OVGA 0x0048 /* Olivetti Video Graphics Array (OVGA) */
+#define _SVGA 0x0088 /* Super VGA with VESA BIOS support (SVGA) */
+
+/* _videoconfig monitor values */
+/* these manifest constants can be used to determine the type of monitor in */
+/* use, using either simple comparisons or the bitwise-AND operator (&) */
+#define _MONO 0x0001 /* Monochrome */
+#define _COLOR 0x0002 /* Color (or Enhanced emulating color) */
+#define _ENHCOLOR 0x0004 /* Enhanced Color */
+#define _ANALOGMONO 0x0008 /* Analog Monochrome only */
+#define _ANALOGCOLOR 0x0010 /* Analog Color only */
+#define _ANALOG 0x0018 /* Analog Monochrome and Color modes */
+
+struct _videoconfig __far * __far __cdecl _getvideoconfig(struct _videoconfig __far *);
+
+
+/* COORDINATE SYSTEMS */
+
+struct _xycoord __far __cdecl _setvieworg(short, short);
+#define _setlogorg _setvieworg /* obsolescent */
+
+struct _xycoord __far __cdecl _getviewcoord(short, short);
+#define _getlogcoord _getviewcoord /* obsolescent */
+
+struct _xycoord __far __cdecl _getphyscoord(short, short);
+
+void __far __cdecl _setcliprgn(short, short, short, short);
+void __far __cdecl _setviewport(short, short, short, short);
+
+
+/* OUTPUT ROUTINES */
+
+/* control parameters for _ellipse, _rectangle, _pie and _polygon */
+#define _GBORDER 2 /* draw outline only */
+#define _GFILLINTERIOR 3 /* fill using current fill mask */
+
+/* parameters for _clearscreen */
+#define _GCLEARSCREEN 0
+#define _GVIEWPORT 1
+#define _GWINDOW 2
+
+void __far __cdecl _clearscreen(short);
+
+struct _xycoord __far __cdecl _moveto(short, short);
+struct _xycoord __far __cdecl _getcurrentposition(void);
+
+short __far __cdecl _lineto(short, short);
+short __far __cdecl _rectangle(short, short, short, short, short);
+short __far __cdecl _polygon(short, const struct _xycoord __far *, short);
+short __far __cdecl _arc(short, short, short, short, short, short, short, short);
+short __far __cdecl _ellipse(short, short, short, short, short);
+short __far __cdecl _pie(short, short, short, short, short, short, short, short, short);
+
+short __far __cdecl _getarcinfo(struct _xycoord __far *, struct _xycoord __far *, struct _xycoord __far *);
+
+short __far __cdecl _setpixel(short, short);
+short __far __cdecl _getpixel(short, short);
+short __far __cdecl _floodfill(short, short, short);
+
+
+/* PEN COLOR, LINE STYLE, WRITE MODE, FILL PATTERN */
+
+short __far __cdecl _setcolor(short);
+short __far __cdecl _getcolor(void);
+
+void __far __cdecl _setlinestyle(unsigned short);
+unsigned short __far __cdecl _getlinestyle(void);
+
+short __far __cdecl _setwritemode(short);
+short __far __cdecl _getwritemode(void);
+
+void __far __cdecl _setfillmask(const unsigned char __far *);
+unsigned char __far * __far __cdecl _getfillmask(unsigned char __far *);
+
+
+/* COLOR SELECTION */
+
+long __far __cdecl _setbkcolor(long);
+long __far __cdecl _getbkcolor(void);
+
+long __far __cdecl _remappalette(short, long);
+short __far __cdecl _remapallpalette(const long __far *);
+short __far __cdecl _selectpalette(short);
+
+
+/* TEXT */
+/* parameters for _displaycursor */
+#define _GCURSOROFF 0
+#define _GCURSORON 1
+
+/* parameters for _wrapon */
+#define _GWRAPOFF 0
+#define _GWRAPON 1
+
+
+/* direction parameters for _scrolltextwindow */
+#define _GSCROLLUP 1
+#define _GSCROLLDOWN (-1)
+
+/* request maximum number of rows in _settextrows and _setvideomoderows */
+#define _MAXTEXTROWS (-1)
+
+short __far __cdecl _settextrows(short); /* returns # rows set; 0 if error */
+void __far __cdecl _settextwindow(short, short, short, short);
+void __far __cdecl _gettextwindow(short __far *, short __far *, short __far *, short __far *);
+void __far __cdecl _scrolltextwindow(short);
+void __far __cdecl _outmem(const char __far *, short);
+void __far __cdecl _outtext(const char __far *);
+short __far __cdecl _inchar(void);
+short __far __cdecl _wrapon(short);
+
+short __far __cdecl _displaycursor(short);
+short __far __cdecl _settextcursor(short);
+short __far __cdecl _gettextcursor(void);
+
+struct _rccoord __far __cdecl _settextposition(short, short);
+struct _rccoord __far __cdecl _gettextposition(void);
+
+short __far __cdecl _settextcolor(short);
+short __far __cdecl _gettextcolor(void);
+
+
+/* SCREEN IMAGES */
+
+void __far __cdecl _getimage(short, short, short, short, char __huge *);
+void __far __cdecl _putimage(short, short, char __huge *, short);
+long __far __cdecl _imagesize(short, short, short, short);
+
+/* "action verbs" for _putimage() and _setwritemode() */
+#define _GPSET 3
+#define _GPRESET 2
+#define _GAND 1
+#define _GOR 0
+#define _GXOR 4
+
+
+/* Color values are used with _setbkcolor in graphics modes and also by
+ _remappalette and _remapallpalette. Also known as palette colors.
+ Not to be confused with color indices (aka. color attributes). */
+
+/* universal color values (all color modes): */
+#define _BLACK 0x000000L
+#define _BLUE 0x2a0000L
+#define _GREEN 0x002a00L
+#define _CYAN 0x2a2a00L
+#define _RED 0x00002aL
+#define _MAGENTA 0x2a002aL
+#define _BROWN 0x00152aL
+#define _WHITE 0x2a2a2aL
+#define _GRAY 0x151515L
+#define _LIGHTBLUE 0x3F1515L
+#define _LIGHTGREEN 0x153f15L
+#define _LIGHTCYAN 0x3f3f15L
+#define _LIGHTRED 0x15153fL
+#define _LIGHTMAGENTA 0x3f153fL
+#define _YELLOW 0x153f3fL
+#define _BRIGHTWHITE 0x3f3f3fL
+
+/* the following is obsolescent and defined only for backward compatibility */
+#define _LIGHTYELLOW _YELLOW
+
+/* mono mode F (_ERESNOCOLOR) color values: */
+#define _MODEFOFF 0L
+#define _MODEFOFFTOON 1L
+#define _MODEFOFFTOHI 2L
+#define _MODEFONTOOFF 3L
+#define _MODEFON 4L
+#define _MODEFONTOHI 5L
+#define _MODEFHITOOFF 6L
+#define _MODEFHITOON 7L
+#define _MODEFHI 8L
+
+/* mono mode 7 (_TEXTMONO) color values: */
+#define _MODE7OFF 0L
+#define _MODE7ON 1L
+#define _MODE7HI 2L
+
+
+/* Warning: these '_xy' entrypoints are undocumented.
+ They may or may not be supported in future versions. */
+struct _xycoord __far __cdecl _moveto_xy(struct _xycoord);
+short __far __cdecl _lineto_xy(struct _xycoord);
+short __far __cdecl _rectangle_xy(short,struct _xycoord,struct _xycoord);
+short __far __cdecl _arc_xy(struct _xycoord, struct _xycoord, struct _xycoord, struct _xycoord);
+short __far __cdecl _ellipse_xy(short, struct _xycoord, struct _xycoord);
+short __far __cdecl _pie_xy(short, struct _xycoord, struct _xycoord, struct _xycoord, struct _xycoord);
+short __far __cdecl _getpixel_xy(struct _xycoord);
+short __far __cdecl _setpixel_xy(struct _xycoord);
+short __far __cdecl _floodfill_xy(struct _xycoord, short);
+void __far __cdecl _getimage_xy(struct _xycoord,struct _xycoord, char __huge *);
+long __far __cdecl _imagesize_xy(struct _xycoord,struct _xycoord);
+void __far __cdecl _putimage_xy(struct _xycoord, char __huge *, short);
+
+
+/* WINDOW COORDINATE SYSTEM */
+
+#ifndef _WXYCOORD_DEFINED
+/* structure for window coordinate pair */
+struct _wxycoord {
+ double wx; /* window x coordinate */
+ double wy; /* window y coordinate */
+ };
+#define _WXYCOORD_DEFINED
+#endif
+
+
+/* define real coordinate window - returns non-zero if successful */
+short __far __cdecl _setwindow(short,double,double,double,double);
+
+/* convert from view to window coordinates */
+struct _wxycoord __far __cdecl _getwindowcoord(short,short);
+struct _wxycoord __far __cdecl _getwindowcoord_xy(struct _xycoord);
+
+/* convert from window to view coordinates */
+struct _xycoord __far __cdecl _getviewcoord_w(double,double);
+struct _xycoord __far __cdecl _getviewcoord_wxy(const struct _wxycoord __far *);
+
+/* return the window coordinates of the current graphics output
+ position as an _wxycoord structure. no error return. */
+struct _wxycoord __far __cdecl _getcurrentposition_w(void);
+
+
+/* window coordinate entry points for graphics output routines */
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _arc_w(double, double, double, double, double, double, double, double);
+short __far __cdecl _arc_wxy(const struct _wxycoord __far *, const struct _wxycoord __far *, const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _ellipse_w(short, double, double, double, double);
+short __far __cdecl _ellipse_wxy(short, const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _floodfill_w(double, double, short);
+
+/* returns pixel value at given point; -1 if unsuccessful. */
+short __far __cdecl _getpixel_w(double, double);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _lineto_w(double, double);
+
+/* returns the view coordinates of the previous output
+ position as a _wxycoord structure. no error return */
+struct _wxycoord __far __cdecl _moveto_w(double, double);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _pie_w(short, double, double, double, double, double, double, double, double);
+short __far __cdecl _pie_wxy(short, const struct _wxycoord __far *, const struct _wxycoord __far *, const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _rectangle_w(short, double, double, double, double);
+short __far __cdecl _rectangle_wxy(short, const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* returns nonzero if successful; otherwise 0 */
+short __far __cdecl _polygon_w(short, const double __far *, short);
+short __far __cdecl _polygon_wxy(short, const struct _wxycoord __far *, short);
+
+/* returns previous color; -1 if unsuccessful */
+short __far __cdecl _setpixel_w(double, double);
+
+
+/* window coordinate image routines */
+
+/* no return value */
+void __far __cdecl _getimage_w(double, double, double, double, char __huge *);
+void __far __cdecl _getimage_wxy(const struct _wxycoord __far *, const struct _wxycoord __far *, char __huge *);
+
+/* returns the image's storage size in bytes */
+long __far __cdecl _imagesize_w(double, double, double, double);
+long __far __cdecl _imagesize_wxy(const struct _wxycoord __far *, const struct _wxycoord __far *);
+
+/* no return value */
+void __far __cdecl _putimage_w(double, double ,char __huge * ,short);
+
+
+/* FONTS */
+
+#ifndef _FONTINFO_DEFINED
+/* structure for _getfontinfo() */
+struct _fontinfo {
+ int type; /* b0 set = vector,clear = bit map */
+ int ascent; /* pix dist from top to baseline */
+ int pixwidth; /* character width in pixels, 0=prop */
+ int pixheight; /* character height in pixels */
+ int avgwidth; /* average character width in pixels */
+ char filename[81]; /* file name including path */
+ char facename[32]; /* font name */
+};
+#define _FONTINFO_DEFINED
+#endif
+
+
+/* font function prototypes */
+short __far __cdecl _registerfonts( const char __far *);
+void __far __cdecl _unregisterfonts( void );
+short __far __cdecl _setfont( const char __far * );
+short __far __cdecl _getfontinfo( struct _fontinfo __far * );
+void __far __cdecl _outgtext( const char __far * );
+short __far __cdecl _getgtextextent( const char __far * );
+struct _xycoord __far __cdecl _setgtextvector( short, short );
+struct _xycoord __far __cdecl _getgtextvector(void);
+
+
+/* restore default packing */
+#pragma pack()
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/ime.h b/private/oleauto/tools/win16/os2/inc/ime.h
new file mode 100644
index 000000000..bb7bb334a
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ime.h
@@ -0,0 +1,333 @@
+/***
+*ime.h - declarations for the Input Method Editor (IME)
+*
+* Copyright (C) 1993, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* Defines the interface constants and types for communicating with the IME.
+*
+*Notes:
+* Constants commented with 'FKorea' are only valid when FKorea is TRUE.
+* Constants commented with 'FJapan' are only valid when FJapan is TRUE.
+* Constants commented with 'FKorea || FJapan' are valid for both.
+*
+* Some constants are not really constants - they are switched at runtime
+* based on the country.
+*
+*Revision History:
+*
+* [] ??-???-?? JinWoo/Mattsh Created from Korean Windows ime.h
+* [01] ??-???-?? w-BarryB Added some constants for Japan
+* [02] 17-Aug-93 w-BarryB Merge Japanese and Korean ime.h together
+* [03] 28-Oct-93 MakotoM Added IMEPRO structure
+*
+*****************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* (FKorea) */
+#define CP_HWND 0
+#define CP_OPEN 1
+#define CP_DIRECT 2
+#define CP_LEVEL 3
+
+/* (FKorea) */
+#define lpSource(lpks) (LPSTR)((LPSTR)lpks+lpks->dchSource)
+#define lpDest(lpks) (LPSTR)((LPSTR)lpks+lpks->dchDest)
+
+/* virtual key */
+#define VK_FINAL 0x18 //FKorea:dummy VK to make final on mouse down
+#define VK_CONVERT 0x1C //FKorea
+#define VK_NONCONVERT 0x1D //FKorea
+#define VK_ACCEPT 0x1E //FKorea
+#define VK_MODECHANGE 0x1F //FKorea
+#define VK_HANGEUL 0x15 //FKorea
+#define VK_JUNJA 0x17 //FKorea
+#define VK_HANJA 0x19 //FKorea
+#define VK_KANA 0x15 //FJapan
+#define VK_KANJI 0x19 //FJapan
+#define VK_DBE_ALPHANUMERIC 0x0f0 //FJapan
+#define VK_DBE_KATAKANA 0x0f1 //FJapan
+#define VK_DBE_HIRAGANA 0x0f2 //FJapan
+#define VK_DBE_SBCSCHAR 0x0f3 //FJapan
+#define VK_DBE_DBCSCHAR 0x0f4 //FJapan
+#define VK_DBE_ROMAN 0x0f5 //FJapan
+#define VK_DBE_NOROMAN 0x0f6 //FJapan
+#define VK_DBE_IME_WORDREGISTER 0x0f7 //FJapan
+#define VK_DBE_IME_DIALOG 0x0f8 //FJapan
+#define VK_DBE_FLUSH 0x0f9 //FJapan
+#define VK_DBE_CODEINPUT 0x0fa //FJapan
+#define VK_DBE_NOCODEINPUT 0x0fb //FJapan
+
+
+
+/* switch for wParam of IME_MOVECONVERTWINDOW (IME_SETCONVERSIONWINDOW) */
+#define MCW_DEFAULT 0x00 //FKorea || FJapan
+#define MCW_RECT 0x01 //FKorea || FJapan
+#define MCW_WINDOW 0x02 //FKorea || FJapan
+#define MCW_SCREEN 0x04 //FKorea || FJapan
+#define MCW_VERTICAL 0x08 //FKorea || FJapan
+#define MCW_HIDDEN 0x10 //FKorea
+//#define MCW_CMD 0x16 //FKorea: Conflict with FJapan
+//#define MCW_CMD 0x06 //FJapan: Conflict with FKorea
+#define MCW_CMD ((FKorea) ? 0x16 : 0x06) // command mask FKorea||FJapan
+
+/* switch for wParam of IME_SETCONVERSIONMODE(IME_SET_MODE) and
+** IME_GETCONVERSIONMODE(IME_GET_MODE)
+*/
+
+#define IME_MODE_ALPHANUMERIC 0x0001 //FKorea || FJapan
+//#define IME_MODE_SBCSCHAR 0x0002 //FKorea: Conflict with FJapan
+//#define IME_MODE_SBCSCHAR 0x0008 //FJapan: Conflict with FKorea
+#define IME_MODE_SBCSCHAR ( (FKorea) ? 0x0002 : 0x0008 ) //FKorea||FJapan
+#define IME_MODE_HANJACONVERT 0x0004 //FKorea
+#define IME_MODE_KATAKANA 0x0002 //FJapan
+#define IME_MODE_HIRAGANA 0x0004 //FJapan
+#define IME_MODE_DBCSCHAR 0x0010 //FJapan
+#define IME_MODE_ROMAN 0x0020 //FJapan
+#define IME_MODE_NOROMAN 0x0040 //FJapan
+#define IME_MODE_CODEINPUT 0x0080 //FJapan
+#define IME_MODE_NOCODEINPUT 0x0100 //FJapan
+
+/* functions */
+#define IME_GETIMECAPS 0x03 /* 3.1 */
+#define IME_QUERY IME_GETIMECAPS /* for 3.0 */
+#define IME_SETOPEN 0x04
+#define IME_GETOPEN 0x05
+#define IME_ENABLEDOSIME 0x06 /* 3.1 */ /* ;Internal-ISV */
+#define IME_ENABLE IME_ENABLEDOSIME /* for 3.0 */ /* ;Internal-ISV */
+#define IME_GETVERSION 0x07 /* 3.1 */
+#define IME_SETCONVERSIONWINDOW 0x08 /* 3.1 */
+#define IME_MOVEIMEWINDOW IME_SETCONVERSIONWINDOW /* for 3.0 */
+#define IME_MOVECONVERTWINDOW 0x08 // FJapan
+#define IME_SETCONVERSIONMODE 0x10 /* 3.1 */
+//#define IME_SET_MODE 0x12 //FKorea
+//#define IME_SET_MODE 0x10 //FJapan
+#define IME_SET_MODE ( (FKorea) ? 0x12 : 0x10 ) //FKorea||FJapan
+#define IME_GETCONVERSIONMODE 0x11 /* 3.1 */
+#define IME_GET_MODE IME_GETCONVERSIONMODE /* for 3.0 */
+#define IME_SETCONVERSIONFONT 0x12 /* 3.1 */
+#define IME_SETFONT IME_SETCONVERSIONFONT /* for 3.0 */
+#define IME_SENDVKEY 0x13 /* 3.1 */
+#define IME_SENDKEY IME_SENDVKEY /* for 3.0 */
+#define IME_DESTROYIME 0x14 /* ;Internal-ISV */
+#define IME_DESTROY IME_DESTROYIME /* ;Internal-ISV */
+#define IME_PRIVATE 0x15
+#define IME_WINDOWUPDATE 0x16
+#define IME_SELECT 0x17 /* ;Internal-ISV */
+#define IME_ENTERWORDREGISTERMODE 0x18 /* 3.1 */
+#define IME_WORDREGISTER IME_ENTERWORDREGISTERMODE /* for 3.0 */
+#define IME_SETCONVERSIONFONTEX 0x19 /* New for 3.1 */
+#define IME_DBCSNAME 0x1A /* reserved for CWIN */ /* ;Internal */
+#define IME_MAXKEY 0x1B /* reserved for CWIN */ /* ;Internal */
+#define IME_CODECONVERT 0x20 /* reserved for HWIN */ /* ;Internal */
+#define IME_SETUSRFONT 0x20 /* reserved for CWIN */ /* ;Internal */
+#define IME_CONVERTLIST 0x21 /* reserved for HWIN */ /* ;Internal */
+#define IME_QUERYUSRFONT 0x21 /* reserved for CWIN */ /* ;Internal */
+#define IME_INPUTKEYTOSEQUENCE 0x22 /* reserved for CWIN */ /* ;Internal */
+#define IME_SEQUENCETOINTERNAL 0x23 /* reserved for CWIN */ /* ;Internal */
+#define IME_QUERYIMEINFO 0x24 /* reserved for CWIN */ /* ;Internal */
+#define IME_DIALOG 0x25 /* reserved for CWIN */ /* ;Internal */
+#define IME_AUTOMATA 0x30 /* reserved for HWIN */ /* ;Internal */
+#define IME_HANJAMODE 0x31 /* reserved for HWIN */ /* ;Internal */
+#define IME_GETLEVEL 0x40 /* reserved for HWIN */ /* ;Internal */
+#define IME_SETLEVEL 0x41 /* reserved for HWIN */ /* ;Internal */
+#define IME_GETMNTABLE 0x42 /* reserved for HWIN */ /* ;Internal */
+
+//#ifdef PEN /* ;Internal */
+#define IME_SETUNDETERMINESTRING 0x50 /* New for 3.1 (PENWIN) */
+#define IME_SETCAPTURE 0x51 /* New for 3.1 (PENWIN) */
+//#endif /* ;Internal */
+
+#define IME_PRIVATEFIRST 0x0100 /* New for 3.1 */
+#define IME_PRIVATELAST 0x04FF /* New for 3.1 */
+
+/* IME_CODECONVERT subfunctions (FKorea) */
+#define IME_BANJAtoJUNJA 0x13
+#define IME_JUNJAtoBANJA 0x14
+#define IME_JOHABtoKS 0x15
+#define IME_KStoJOHAB 0x16
+
+/* IME_AUTOMATA subfunctions (FKorea) */
+#define IMEA_INIT 0x01
+#define IMEA_NEXT 0x02
+#define IMEA_PREV 0x03
+
+/* IME_HANJAMODE subfunctions (FKorea) */
+#define IME_REQUEST_CONVERT 0x01
+#define IME_ENABLE_CONVERT 0x02
+
+/* IME_MOVEIMEWINDOW subfunctions (FKorea) */
+#define INTERIM_WINDOW 0x00
+#define MODE_WINDOW 0x01
+#define HANJA_WINDOW 0x02
+
+/* (FKorea) */
+#define IMEPROC_SWITCH 0x0001 /* ;Internal */
+/* the IMEPROC_SK is from 0x0010 ~ 0x001F */ /* ;Internal */
+#define IMEPROC_SK 0x0010 /* ;Internal */
+#define IMEPROC_SK0 0x0010 /* ;Internal */
+#define IMEPROC_SK1 0x0011 /* ;Internal */
+#define IMEPROC_SK2 0x0012 /* ;Internal */
+
+/* (FKorea) */
+#define PROC_INFO 0x0001 /* ;Internal */
+#define PROC_SHOW 0x0002 /* ;Internal */
+#define PROC_HIDE 0x0004 /* ;Internal */
+
+/* (FKorea) */
+#define BY_IME_HWND 0x0000 /* ;Internal */
+#define BY_IME_NAME 0x0001 /* ;Internal */
+#define BY_IME_DESCRIPTION 0x0002 /* ;Internal */
+#define BY_IME_DEFAULT 0x000F /* ;Internal */
+
+/* (FKorea) */
+/* Those bits are used by ControlIMEMessage() */ /* ;Internal */
+/* 0x0030 - the two bits are for post/send messages control */ /* ;Internal */
+#define CTRL_MSG_MASK 0x0030 /* ;Internal */
+/* CTRL_SEND is default one, because it is usually used */ /* ;Internal */
+#define CTRL_SEND 0x0000 /* ;Internal */
+#define CTRL_POST 0x0010 /* ;Internal */
+/* CTRL_NONE - don't send and post */ /* ;Internal */
+#define CTRL_NONE 0x0030 /* ;Internal */
+
+#define CTRL_USER_ALLOC 0x0040 /* ;Internal */
+
+/* CTRL_MODIFY_??? - modify imepro of specified IME */ /* ;Internal */
+#define CTRL_MODIFY_USR_DIC 0x0080 /* ;Internal */
+// CTRL_MODIFY is "or" all modify bits, but now only one
+#define CTRL_MODIFY CTRL_MODIFY_USR_DIC /* ;Internal */
+
+/* error code */
+#define IME_RS_ERROR 0x01 /* general error */
+#define IME_RS_NOIME 0x02 /* IME is not installed */
+#define IME_RS_TOOLONG 0x05 /* given string is too long */
+#define IME_RS_ILLEGAL 0x06 /* illegal charactor(s) is string */
+#define IME_RS_NOTFOUND 0x07 /* no (more) candidate */
+#define IME_RS_NOROOM 0x0a /* no disk/memory space */
+#define IME_RS_DISKERROR 0x0e /* disk I/O error */
+#define IME_RS_CAPTURED 0x10 /* IME is captured (PENWIN) */
+#define IME_RS_INVALID 0x11 /* invalid sub-function was specified */
+#define IME_RS_NEST 0x12 /* called nested */
+#define IME_RS_SYSTEMMODAL 0x13 /* called when system mode */
+
+/* messge ids */
+#define WM_IME_REPORT 0x0280
+#define IR_STRINGSTART 0x100
+#define IR_STRINGEND 0x101
+#define IR_MOREROOM 0x110 /* reserved for CWIN */ /* ;Internal */
+#define IR_OPENCONVERT 0x120
+#define IR_CHANGECONVERT 0x121
+#define IR_CLOSECONVERT 0x122
+#define IR_FULLCONVERT 0x123
+#define IR_IMESELECT 0x130
+#define IR_STRING 0x140
+#define IR_IMERELEASED 0x150 /* reserved for PENWIN */ /* ;Internal */
+#define IR_DBCSCHAR 0x160 /* New for 3.1 */
+#define IR_UNDETERMINE 0x170 /* New for 3.1 */
+#define IR_STRINGEX 0x180 /* New for 3.1 */
+
+#define WM_IMEKEYDOWN 0x290
+#define WM_IMEKEYUP 0x291
+
+/* return value for IME_VERSION (Internal) */ /* ;Internal */
+#define IMEVER_31 0x0a03 /* ;Internal */
+
+WORD WINAPI SendIMEMessage( HWND, LPARAM );
+LRESULT WINAPI SendIMEMessageEx( HWND, LPARAM ); /* New for 3.1 */
+
+
+typedef struct tagIMESTRUCT {
+ UINT fnc; /* function code */
+ WPARAM wParam; /* word parameter */
+ UINT wCount; /* word counter */
+ UINT dchSource;/* offset to Source from top of memory object */
+ UINT dchDest; /* offset to Desrination from top of memory object */
+ LPARAM lParam1;
+ LPARAM lParam2;
+ LPARAM lParam3;
+
+} IMESTRUCT;
+typedef IMESTRUCT *PIMESTRUCT;
+typedef IMESTRUCT NEAR *NPIMESTRUCT;
+typedef IMESTRUCT FAR *LPIMESTRUCT;
+
+typedef struct tagDATETIME {
+ WORD year;
+ WORD month;
+ WORD day;
+ WORD hour;
+ WORD min;
+ WORD sec;
+} DATETIME;
+
+// This is the Taiwanese version of struct IMEPRO. This is identical
+// to Japanese and Korean versions, except it has two extra members
+// at the end (szUsrFontName and fEnable).
+typedef struct _tagIMEPRO {
+ HWND hWnd;
+ DATETIME InstDate;
+ UINT wVersion;
+ BYTE szDescription[50];
+ BYTE szName[80];
+ BYTE szOptions[30];
+ BYTE szUsrFontName[80];
+ BOOL fEnable;
+} IMEPRO;
+typedef IMEPRO far *LPIMEPRO;
+
+/* (FKorea) */
+typedef struct tagOLDUNDETERMINESTRUCT {
+ UINT uSize;
+ UINT uDefIMESize;
+ UINT uLength;
+ UINT uDeltaStart;
+ UINT uCursorPos;
+ BYTE cbColor[16];
+/* -- These members will have variable length. --
+ BYTE cbAttrib[];
+ BYTE cbText[];
+ BYTE cbIMEDef[];
+*/
+} OLDUNDETERMINESTRUCT,
+ NEAR *NPOLDUNDETERMINESTRUCT,
+ FAR *LPOLDUNDETERMINESTRUCT;
+
+/* (FKorea) */
+typedef struct tagUNDETERMINESTRUCT {
+ DWORD dwSize;
+ UINT uDefIMESize;
+ UINT uDefIMEPos;
+ UINT uUndetTextLen;
+ UINT uUndetTextPos;
+ UINT uUndetAttrPos;
+ UINT uCursorPos;
+ UINT uDeltaStart;
+ UINT uDetermineTextLen;
+ UINT uDetermineTextPos;
+ UINT uDetermineDelimPos;
+ UINT uYomiTextLen;
+ UINT uYomiTextPos;
+ UINT uYomiDelimPos;
+} UNDETERMINESTRUCT,
+ NEAR *NPUNDETERMINESTRUCT,
+ FAR *LPUNDETERMINESTRUCT;
+
+/* (FKorea) */
+typedef struct tagSTRINGEXSTRUCT {
+ DWORD dwSize;
+ UINT uDeterminePos;
+ UINT uDetermineDelimPos;
+ UINT uYomiPos;
+ UINT uYomiDelimPos;
+} STRINGEXSTRUCT,
+ NEAR *NPSTRINGEXSTRUCT,
+ FAR *LPSTRINGEXSTRUCT;
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/private/oleauto/tools/win16/os2/inc/io.h b/private/oleauto/tools/win16/os2/inc/io.h
new file mode 100644
index 000000000..f4ecdad7f
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/io.h
@@ -0,0 +1,162 @@
+/***
+*io.h - declarations for low-level file handling and I/O functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the function declarations for the low-level
+* file handling and I/O functions.
+*
+****/
+
+#ifndef _INC_IO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifdef _WINDOWS
+#ifndef _WINDLL
+#ifndef _WINFO_DEFINED
+/* interface version number */
+#define _WINVER 0
+
+/* max number of windows */
+#define _WFILE 20
+
+/* values for windows screen buffer size */
+#define _WINBUFINF 0
+#define _WINBUFDEF -1
+
+/* size/move settings */
+#define _WINSIZEMIN 1
+#define _WINSIZEMAX 2
+#define _WINSIZERESTORE 3
+#define _WINSIZECHAR 4
+
+/* size/move query types */
+#define _WINMAXREQ 100
+#define _WINCURRREQ 101
+
+/* values for closing window */
+#define _WINPERSIST 1
+#define _WINNOPERSIST 0
+
+/* pseudo file handle for frame window */
+#define _WINFRAMEHAND -1
+
+/* menu items */
+#define _WINSTATBAR 1
+#define _WINTILE 2
+#define _WINCASCADE 3
+#define _WINARRANGE 4
+
+/* quickwin exit options */
+#define _WINEXITPROMPT 1
+#define _WINEXITNOPERSIST 2
+#define _WINEXITPERSIST 3
+
+/* open structure */
+#pragma pack(2)
+struct _wopeninfo {
+ unsigned int _version;
+ const char __far * _title;
+ long _wbufsize;
+ };
+#pragma pack()
+
+/* size/move structure */
+struct _wsizeinfo {
+ unsigned int _version;
+ unsigned int _type;
+ unsigned int _x;
+ unsigned int _y;
+ unsigned int _h;
+ unsigned int _w;
+ };
+
+#define _WINFO_DEFINED
+#endif
+#endif
+#endif
+
+/* function prototypes */
+
+int __cdecl _access(const char *, int);
+int __cdecl _chmod(const char *, int);
+int __cdecl _chsize(int, long);
+int __cdecl _close(int);
+int __cdecl _commit(int);
+int __cdecl _creat(const char *, int);
+int __cdecl _dup(int);
+int __cdecl _dup2(int, int);
+int __cdecl _eof(int);
+long __cdecl _filelength(int);
+int __cdecl _isatty(int);
+int __cdecl _locking(int, int, long);
+long __cdecl _lseek(int, long, int);
+char * __cdecl _mktemp(char *);
+int __cdecl _open(const char *, int, ...);
+int __cdecl _read(int, void *, unsigned int);
+int __cdecl remove(const char *);
+int __cdecl rename(const char *, const char *);
+int __cdecl _setmode(int, int);
+int __cdecl _sopen(const char *, int, int, ...);
+long __cdecl _tell(int);
+int __cdecl _umask(int);
+int __cdecl _unlink(const char *);
+int __cdecl _write(int, const void *, unsigned int);
+#ifdef _WINDOWS
+#ifndef _WINDLL
+int __cdecl _wabout(char *);
+int __cdecl _wclose(int, int);
+int __cdecl _wgetexit(void);
+int __cdecl _wgetfocus(void);
+long __cdecl _wgetscreenbuf(int);
+int __cdecl _wgetsize(int, int, struct _wsizeinfo *);
+int __cdecl _wmenuclick(int);
+int __cdecl _wopen(struct _wopeninfo *, struct _wsizeinfo *, int);
+int __cdecl _wsetexit(int);
+int __cdecl _wsetfocus(int);
+int __cdecl _wsetscreenbuf(int, long);
+int __cdecl _wsetsize(int, struct _wsizeinfo *);
+void __cdecl _wyield(void);
+#endif
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+int __cdecl access(const char *, int);
+int __cdecl chmod(const char *, int);
+int __cdecl chsize(int, long);
+int __cdecl close(int);
+int __cdecl creat(const char *, int);
+int __cdecl dup(int);
+int __cdecl dup2(int, int);
+int __cdecl eof(int);
+long __cdecl filelength(int);
+int __cdecl isatty(int);
+int __cdecl locking(int, int, long);
+long __cdecl lseek(int, long, int);
+char * __cdecl mktemp(char *);
+int __cdecl open(const char *, int, ...);
+int __cdecl read(int, void *, unsigned int);
+int __cdecl setmode(int, int);
+int __cdecl sopen(const char *, int, int, ...);
+long __cdecl tell(int);
+int __cdecl umask(int);
+int __cdecl unlink(const char *);
+int __cdecl write(int, const void *, unsigned int);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_IO
+#endif /* _INC_IO */
diff --git a/private/oleauto/tools/win16/os2/inc/iomanip.h b/private/oleauto/tools/win16/os2/inc/iomanip.h
new file mode 100644
index 000000000..8004be153
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/iomanip.h
@@ -0,0 +1,125 @@
+/***
+*iomanip.h - definitions/declarations for iostream's parameterized manipulators
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the iostream classes' paramterized manipulators.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_IOMANIP
+#define _INC_IOMANIP
+#include <iostream.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+// CONSIDER: use macro to define these
+// #define __MKMANIP(X) \#define X##(T) __##X##_ \#\# T
+// __MKMANIP(SMANIP);
+// __MKMANIP(SAPP);
+// __MKMANIP(IMANIP);
+// __MKMANIP(IAPP);
+// __MKMANIP(OMANIP);
+// __MKMANIP(OAPP);
+// __MKMANIP(IOMANIP);
+// __MKMANIP(IOAPP);
+
+#define SMANIP(T) __SMANIP_##T
+#define SAPP(T) __SAPP_##T
+#define IMANIP(T) __IMANIP_##T
+#define IAPP(T) __IAPP_##T
+#define OMANIP(T) __OMANIP_##T
+#define OAPP(T) __OAPP_##T
+#define IOMANIP(T) __IOMANIP_##T
+#define IOAPP(T) __IOAPP_##T
+
+#define IOMANIPdeclare(T) \
+class SMANIP(T) { \
+public: \
+ SMANIP(T)(ios& (*f)(ios&,T), T t) { _fp = f; _tp = t; } \
+ friend istream& operator>>(istream& s, SMANIP(T) & sm) { (*(sm._fp))(s,sm._tp); return s; } \
+ friend ostream& operator<<(ostream& s, SMANIP(T) & sm) { (*(sm._fp))(s,sm._tp); return s; } \
+private: \
+ ios& (* _fp)(ios&,T); \
+ T _tp; \
+}; \
+class SAPP(T) { \
+public: \
+ SAPP(T)( ios& (*f)(ios&,T)) { _fp = f; } \
+ SMANIP(T) operator()(T t) { return SMANIP(T)(_fp,t); } \
+private: \
+ ios& (* _fp)(ios&,T); \
+}; \
+class IMANIP(T) { \
+public: \
+ IMANIP(T)(istream& (*f)(istream&,T), T t) { _fp = f; _tp = t; } \
+ friend istream& operator>>(istream& s, IMANIP(T) & sm) { (*sm._fp)(s,sm._tp); return s; } \
+private: \
+ istream& (* _fp)(istream&,T); \
+ T _tp; \
+}; \
+class IAPP(T) { \
+public: \
+ IAPP(T)( istream& (*f)(istream&,T)) { _fp = f; } \
+ IMANIP(T) operator()(T t) { return IMANIP(T)(_fp,t); } \
+private: \
+ istream& (* _fp)(istream&,T); \
+}; \
+class OMANIP(T) { \
+public: \
+ OMANIP(T)(ostream& (*f)(ostream&,T), T t) { _fp = f; _tp = t; } \
+ friend ostream& operator<<(ostream& s, OMANIP(T) & sm) { (*sm._fp)(s,sm._tp); return s; } \
+private: \
+ ostream& (* _fp)(ostream&,T); \
+ T _tp; \
+}; \
+class OAPP(T) { \
+public: \
+ OAPP(T)(ostream& (*f)(ostream&,T)) { _fp = f; } \
+ OMANIP(T) operator()(T t) { return OMANIP(T)(_fp,t); } \
+private: \
+ ostream& (* _fp)(ostream&,T); \
+}; \
+\
+class IOMANIP(T) { \
+public: \
+ IOMANIP(T)(iostream& (*f)(iostream&,T), T t) { _fp = f; _tp = t; } \
+ friend istream& operator>>(iostream& s, IOMANIP(T) & sm) { (*sm._fp)(s,sm._tp); return s; } \
+ friend ostream& operator<<(iostream& s, IOMANIP(T) & sm) { (*sm._fp)(s,sm._tp); return s; } \
+private: \
+ iostream& (* _fp)(iostream&,T); \
+ T _tp; \
+}; \
+class IOAPP(T) { \
+public: \
+ IOAPP(T)( iostream& (*f)(iostream&,T)) { _fp = f; } \
+ IOMANIP(T) operator()(T t) { return IOMANIP(T)(_fp,t); } \
+private: \
+ iostream& (* _fp)(iostream&,T); \
+}; \
+
+
+IOMANIPdeclare(int)
+
+IOMANIPdeclare(long)
+
+inline ios& __resetiosflags(ios& s, long _flg) { s.setf(0,_flg); return s; }
+inline ios& __setfill(ios& s, int _fc) { s.fill((char)_fc); return s; }
+inline ios& __setiosflags(ios& s, long _flg) { s.setf(_flg); return s; }
+inline ios& __setprecision(ios& s, int _pre) { s.precision(_pre); return s; }
+inline ios& __setw(ios& s, int _wid) { s.width(_wid); return s; }
+
+inline SMANIP(long) resetiosflags(long _l) { return SMANIP(long)(__resetiosflags, _l); }
+inline SMANIP(int) setfill(int _m) {return SMANIP(int)(__setfill, _m); }
+inline SMANIP(long) setiosflags(long _l) {return SMANIP(long)(__setiosflags, _l); }
+inline SMANIP(int) setprecision(int _p) {return SMANIP(int)(__setprecision, _p); }
+inline SMANIP(int) setw(int _w) { return SMANIP(int)(__setw, _w); }
+
+// Restore default packing
+#pragma pack()
+
+#endif // !_INC_IOMANIP
diff --git a/private/oleauto/tools/win16/os2/inc/ios.h b/private/oleauto/tools/win16/os2/inc/ios.h
new file mode 100644
index 000000000..6cd1f1341
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ios.h
@@ -0,0 +1,191 @@
+/***
+*ios.h - definitions/declarations for the ios class.
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the ios class.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_IOS
+#define _INC_IOS
+
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+class streambuf;
+class ostream;
+
+class ios {
+
+public:
+ enum io_state { goodbit = 0x00,
+ eofbit = 0x01,
+ failbit = 0x02,
+ badbit = 0x04 };
+
+ enum open_mode { in = 0x01,
+ out = 0x02,
+ ate = 0x04,
+ app = 0x08,
+ trunc = 0x10,
+ nocreate = 0x20,
+ noreplace = 0x40,
+ binary = 0x80 }; // CONSIDER: not in latest spec.
+
+ enum seek_dir { beg=0, cur=1, end=2 };
+
+ enum { skipws = 0x0001,
+ left = 0x0002,
+ right = 0x0004,
+ internal = 0x0008,
+ dec = 0x0010,
+ oct = 0x0020,
+ hex = 0x0040,
+ showbase = 0x0080,
+ showpoint = 0x0100,
+ uppercase = 0x0200,
+ showpos = 0x0400,
+ scientific = 0x0800,
+ fixed = 0x1000,
+ unitbuf = 0x2000,
+ stdio = 0x4000
+ };
+
+ static const long basefield; // dec | oct | hex
+ static const long adjustfield; // left | right | internal
+ static const long floatfield; // scientific | fixed
+
+ ios(streambuf*); // differs from ANSI
+ virtual ~ios();
+
+ inline long flags() const;
+ inline long flags(long _l);
+
+ inline long setf(long _f,long _m);
+ inline long setf(long _l);
+ inline long unsetf(long _l);
+
+ inline int width() const;
+ inline int width(int _i);
+
+ inline ostream* tie(ostream* _os);
+ inline ostream* tie() const;
+
+ inline char fill() const;
+ inline char fill(char _c);
+
+ inline int precision(int _i);
+ inline int precision() const;
+
+ inline int rdstate() const;
+ inline void clear(int _i = 0);
+
+// inline operator void*() const;
+ operator void*() const { if(state&(badbit|failbit) ) return 0; return (void*)this; }
+ inline int operator!() const;
+
+ inline int good() const;
+ inline int eof() const;
+ inline int fail() const;
+ inline int bad() const;
+
+ inline streambuf* rdbuf() const;
+
+ inline long & iword(int) const;
+ inline void*& pword(int) const;
+
+ static long bitalloc();
+ static int xalloc();
+ static void sync_with_stdio();
+
+protected:
+ ios(); // CONSIDER: not in current spec.
+ void init(streambuf*);
+
+ enum { skipping, tied };
+ streambuf* bp;
+
+ int state;
+ int ispecial;
+ int ospecial;
+ int isfx_special;
+ int osfx_special;
+ int x_delbuf; // if set, rdbuf() deleted by ~ios
+
+ ostream* x_tie;
+ long x_flags;
+ short x_precision;
+ char x_fill;
+ short x_width;
+
+ static void (*stdioflush)();
+public:
+ int delbuf() const { return x_delbuf; }
+ void delbuf(int _i) { x_delbuf = _i; }
+
+private:
+ ios(const ios&);
+ void operator=(const ios&);
+ static const int x_maxindex;
+ static long x_maxbit;
+ static long x_statebuf[]; // used by xalloc()
+ static int x_curindex;
+// consider: make interal static to ios::sync_with_stdio()
+ static int sunk_with_stdio; // make sure sync_with done only once
+};
+
+/* inline ios& dec(ios& _strm) { _strm.setf(ios::dec,ios::basefield); return _strm; }
+inline ios& hex(ios& _strm) { _strm.setf(ios::hex,ios::basefield); return _strm; }
+inline ios& oct(ios& _strm) { _strm.setf(ios::oct,ios::basefield); return _strm; }
+UNDONE: c3 /Fa bug */
+
+inline ios& dec(ios& _strm) { _strm.setf(ios::dec,ios::dec|ios::hex|ios::oct); return _strm; }
+inline ios& hex(ios& _strm) { _strm.setf(ios::hex,ios::dec|ios::hex|ios::oct); return _strm; }
+inline ios& oct(ios& _strm) { _strm.setf(ios::oct,ios::dec|ios::hex|ios::oct); return _strm; }
+
+inline long ios::flags() const { return x_flags; }
+inline long ios::flags(long _l){ long _lO; _lO = x_flags; x_flags = _l; return _lO; }
+
+inline long ios::setf(long _l,long _m){ long _lO; _lO = x_flags; x_flags = (_l&_m) | (x_flags&(~_m)); return _lO; }
+inline long ios::setf(long _l){ long _lO; _lO = x_flags; x_flags |= _l; return _lO; }
+inline long ios::unsetf(long _l){ long _lO; _lO = x_flags; x_flags &= (~_l); return _lO; }
+
+inline int ios::width() const { return x_width; }
+inline int ios::width(int _i){ int _iO; _iO = x_width; x_width = _i; return _iO; }
+
+inline ostream* ios::tie(ostream* _os){ ostream* _osO; _osO = x_tie; x_tie = _os; return _osO; }
+inline ostream* ios::tie() const { return x_tie; }
+inline char ios::fill() const { return x_fill; }
+inline char ios::fill(char _c){ char _cO; _cO = x_fill; x_fill = _c; return _cO; }
+inline int ios::precision(int _i){ int _iO; _iO = x_precision; x_precision = _i; return _iO; }
+inline int ios::precision() const { return x_precision; }
+
+inline int ios::rdstate() const { return state; }
+
+// inline ios::operator void*() const { if(state&(badbit|failbit) ) return 0; return (void*)this; }
+inline int ios::operator!() const { return state&(badbit|failbit); }
+
+inline int ios::bad() const { return state & badbit; }
+inline void ios::clear(int _i){ state = _i; }
+inline int ios::eof() const { return state & eofbit; }
+inline int ios::fail() const { return state & (badbit | failbit); }
+inline int ios::good() const { return state == 0; }
+
+inline streambuf* ios::rdbuf() const { return bp; }
+
+inline long & ios::iword(int _i) const { return x_statebuf[_i] ; }
+inline void * & ios::pword(int _i) const { return (void * &)x_statebuf[_i]; }
+
+// Restore default packing
+#pragma pack()
+
+#endif // !_INC_IOS
diff --git a/private/oleauto/tools/win16/os2/inc/iostream.h b/private/oleauto/tools/win16/os2/inc/iostream.h
new file mode 100644
index 000000000..14f54e10a
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/iostream.h
@@ -0,0 +1,58 @@
+/***
+*iostream.h - definitions/declarations for iostream classes
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the iostream classes.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_IOSTREAM
+#define _INC_IOSTREAM
+
+typedef long streamoff, streampos;
+
+#include <ios.h> // Define ios.
+
+#include <streamb.h> // Define streambuf.
+
+#include <istream.h> // Define istream.
+
+#include <ostream.h> // Define ostream.
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+class iostream : public istream, public ostream {
+public:
+ iostream(streambuf*);
+ virtual ~iostream();
+protected:
+// consider: make private??
+ iostream();
+private:
+ iostream(ios&);
+ iostream(istream&);
+ iostream(ostream&);
+ iostream(iostream&);
+void operator=(iostream&);
+};
+
+class Iostream_init {
+public: // UNDONE: public?
+ Iostream_init();
+ ~Iostream_init();
+private:
+ static int x_fIsInit;
+};
+
+// used internally
+// static Iostream_init __iostreaminit; // initializes cin/cout/cerr/clog
+
+// Restore default packing
+#pragma pack()
+
+#endif /* !_INC_IOSTREAM */
diff --git a/private/oleauto/tools/win16/os2/inc/istream.h b/private/oleauto/tools/win16/os2/inc/istream.h
new file mode 100644
index 000000000..50a7c73b8
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/istream.h
@@ -0,0 +1,139 @@
+/***
+*istream.h - definitions/declarations for the istream class
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the istream class.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_ISTREAM
+#define _INC_ISTREAM
+
+#include <ios.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+typedef long streamoff, streampos;
+
+class istream: /* virtual */ public ios {
+
+public:
+ istream(streambuf*);
+ virtual ~istream();
+
+ int ipfx(int =0);
+ void isfx() { }
+
+ inline istream& operator>>(istream& (*_f)(istream&));
+ inline istream& operator>>(ios& (*_f)(ios&));
+ istream& operator>>(char*);
+ inline istream& operator>>(unsigned char*);
+ inline istream& operator>>(signed char*);
+ istream& operator>>(char&);
+ inline istream& operator>>(unsigned char&);
+ inline istream& operator>>(signed char&);
+ istream& operator>>(short&);
+ istream& operator>>(unsigned short&);
+ istream& operator>>(int&);
+ istream& operator>>(unsigned int&);
+ istream& operator>>(long&);
+ istream& operator>>(unsigned long&);
+ istream& operator>>(float&);
+ istream& operator>>(double&);
+ istream& operator>>(long double&);
+ istream& operator>>(streambuf*);
+
+ int get();
+ istream& get(char*,int,char ='\n');
+ inline istream& get(unsigned char*,int,char ='\n');
+ inline istream& get(signed char*,int,char ='\n');
+ istream& get(char&);
+ inline istream& get(unsigned char&);
+ inline istream& get(signed char&);
+ istream& get(streambuf&,char ='\n');
+ inline istream& getline(char*,int,char ='\n');
+ inline istream& getline(unsigned char*,int,char ='\n');
+ inline istream& getline(signed char*,int,char ='\n');
+
+ inline istream& ignore(int =1,int =EOF);
+ istream& read(char *,int);
+ inline istream& read(unsigned char *,int);
+ inline istream& read(signed char *,int);
+
+ int gcount() const { return x_gcount; }
+ int peek() const;
+ istream& putback(char);
+ int sync();
+
+ istream& seekg(streampos);
+ istream& seekg(streamoff,ios::seek_dir);
+ streampos tellg();
+
+ void eatwhite(); // consider: protect and friend with manipulator ws
+protected:
+ istream();
+ int do_ipfx(int);
+
+private:
+ istream(istream&);
+ istream(ios&);
+ void operator=(istream&);
+ int getint(char *, int);
+ int getdouble(char *, int);
+ int _fGline;
+ int x_gcount;
+};
+
+ inline istream& istream::operator>>(istream& (*_f)(istream&)) { (*_f)(*this); return *this; }
+ inline istream& istream::operator>>(ios& (*_f)(ios&)) { (*_f)(*this); return *this; }
+
+ inline istream& istream::operator>>(unsigned char* _s) { return operator>>((char *)_s); }
+ inline istream& istream::operator>>(signed char* _s) { return operator>>((char *)_s); }
+
+ inline istream& istream::operator>>(unsigned char& _c) { return operator>>((char&) _c); }
+ inline istream& istream::operator>>(signed char& _c) { return operator>>((char&) _c); }
+
+ inline istream& istream::get(unsigned char* b, int lim ,char delim) { return get((char *)b, lim, delim); }
+ inline istream& istream::get(signed char* b, int lim, char delim) { return get((char *)b, lim, delim); }
+
+ inline istream& istream::get(unsigned char& _c) { return get((char&)_c); }
+ inline istream& istream::get(signed char& _c) { return get((char&)_c); }
+
+ inline istream& istream::getline(char* _b,int _lim,char _delim) { _fGline++; return get(_b, _lim, _delim); }
+ inline istream& istream::getline(unsigned char* _b,int _lim,char _delim) { _fGline++; return get((char *)_b, _lim, _delim); }
+ inline istream& istream::getline(signed char* _b,int _lim,char _delim) { return get((char *)_b, _lim, _delim); }
+
+ inline istream& istream::ignore(int _n,int delim) { _fGline++; return get((char *)0, _n+1, delim); }
+
+ inline istream& istream::read(unsigned char * _ptr, int _n) { return read((char *) _ptr, _n); }
+ inline istream& istream::read(signed char * _ptr, int _n) { return read((char *) _ptr, _n); }
+
+class istream_withassign : public istream {
+ public: // not in spec.
+ istream_withassign();
+// CONSIDER: is this necessary?
+ istream_withassign(streambuf*);
+ ~istream_withassign();
+ istream& operator=(const istream&);
+ istream& operator=(streambuf*);
+};
+
+#if ((!defined(_WINDOWS)) || defined(_QWIN))
+extern istream_withassign cin;
+#endif
+
+inline istream& ws(istream& _ins) { _ins.eatwhite(); return _ins; }
+
+ios& dec(ios&);
+ios& hex(ios&);
+ios& oct(ios&);
+
+// Restore default packing
+#pragma pack()
+
+#endif // !_INC_ISTREAM
diff --git a/private/oleauto/tools/win16/os2/inc/limits.h b/private/oleauto/tools/win16/os2/inc/limits.h
new file mode 100644
index 000000000..f05133e65
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/limits.h
@@ -0,0 +1,44 @@
+/***
+*limits.h - implementation dependent values
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains defines for a number of implementation dependent values
+* which are commonly used in C programs.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_LIMITS
+
+#define CHAR_BIT 8 /* number of bits in a char */
+#define SCHAR_MIN (-127) /* minimum signed char value */
+#define SCHAR_MAX 127 /* maximum signed char value */
+#define UCHAR_MAX 0xff /* maximum unsigned char value */
+#ifndef _CHAR_UNSIGNED
+#define CHAR_MIN SCHAR_MIN /* mimimum char value */
+#define CHAR_MAX SCHAR_MAX /* maximum char value */
+#else
+#define CHAR_MIN 0
+#define CHAR_MAX UCHAR_MAX
+#ifndef __cplusplus
+unsigned int _charmax; /* unsigned CHAR_MAX value */
+#else
+extern unsigned int _charmax; /* unsigned CHAR_MAX value */
+static unsigned int *_char_max = &_charmax;
+#endif
+#endif
+#define MB_LEN_MAX 2 /* max. # bytes in multibyte char */
+#define SHRT_MIN (-32767) /* minimum (signed) short value */
+#define SHRT_MAX 32767 /* maximum (signed) short value */
+#define USHRT_MAX 0xffff /* maximum unsigned short value */
+#define INT_MIN (-32767) /* minimum (signed) int value */
+#define INT_MAX 32767 /* maximum (signed) int value */
+#define UINT_MAX 0xffff /* maximum unsigned int value */
+#define LONG_MIN (-2147483647) /* minimum (signed) long value */
+#define LONG_MAX 2147483647 /* maximum (signed) long value */
+#define ULONG_MAX 0xffffffff /* maximum unsigned long value */
+
+#define _INC_LIMITS
+#endif /* _INC_LIMITS */
diff --git a/private/oleauto/tools/win16/os2/inc/locale.h b/private/oleauto/tools/win16/os2/inc/locale.h
new file mode 100644
index 000000000..cdfa0c371
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/locale.h
@@ -0,0 +1,84 @@
+/***
+*locale.h - definitions/declarations for localization routines
+*
+* Copyright (c) 1988-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the structures, values, macros, and functions
+* used by the localization routines.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_LOCALE
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+
+/* Locale categories */
+
+#define LC_ALL 0
+#define LC_COLLATE 1
+#define LC_CTYPE 2
+#define LC_MONETARY 3
+#define LC_NUMERIC 4
+#define LC_TIME 5
+
+#define LC_MIN LC_ALL
+#define LC_MAX LC_TIME
+
+
+/* Locale convention structure */
+
+#ifndef _LCONV_DEFINED
+struct lconv {
+ char *decimal_point;
+ char *thousands_sep;
+ char *grouping;
+ char *int_curr_symbol;
+ char *currency_symbol;
+ char *mon_decimal_point;
+ char *mon_thousands_sep;
+ char *mon_grouping;
+ char *positive_sign;
+ char *negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ };
+#define _LCONV_DEFINED
+#endif
+
+/* function prototypes */
+
+char * __cdecl setlocale(int, const char *);
+struct lconv * __cdecl localeconv(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_LOCALE
+#endif /* _INC_LOCALE */
diff --git a/private/oleauto/tools/win16/os2/inc/malloc.h b/private/oleauto/tools/win16/os2/inc/malloc.h
new file mode 100644
index 000000000..f26210834
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/malloc.h
@@ -0,0 +1,159 @@
+/***
+*malloc.h - declarations and definitions for memory allocation functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains the function declarations for memory allocation functions;
+* also defines manifest constants and types used by the heap routines.
+* [System V]
+*
+****/
+
+#ifndef _INC_MALLOC
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __based _based
+#define __cdecl _cdecl
+#define __far _far
+#define __huge _huge
+#define __near _near
+#define __segment _segment
+#endif
+
+/* constants for based heap routines */
+
+#define _NULLSEG ((__segment)0)
+#define _NULLOFF ((void __based(void) *)0xffff)
+
+/* constants for _heapchk/_heapset/_heapwalk routines */
+
+#define _HEAPEMPTY (-1)
+#define _HEAPOK (-2)
+#define _HEAPBADBEGIN (-3)
+#define _HEAPBADNODE (-4)
+#define _HEAPEND (-5)
+#define _HEAPBADPTR (-6)
+#define _FREEENTRY 0
+#define _USEDENTRY 1
+
+/* maximum heap request that can ever be honored */
+
+#ifdef _WINDOWS
+#define _HEAP_MAXREQ 0xFFE6
+#else
+#define _HEAP_MAXREQ 0xFFE8
+#endif
+
+/* types and structures */
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _HEAPINFO_DEFINED
+typedef struct _heapinfo {
+ int __far * _pentry;
+ size_t _size;
+ int _useflag;
+ } _HEAPINFO;
+#define _HEAPINFO_DEFINED
+#endif
+
+
+/* external variable declarations */
+
+extern unsigned int __near __cdecl _amblksiz;
+
+
+/* based heap function prototypes */
+
+void __based(void) * __cdecl _bcalloc(__segment, size_t, size_t);
+void __based(void) * __cdecl _bexpand(__segment,
+ void __based(void) *, size_t);
+void __cdecl _bfree(__segment, void __based(void) *);
+int __cdecl _bfreeseg(__segment);
+int __cdecl _bheapadd(__segment, void __based(void) *, size_t);
+int __cdecl _bheapchk(__segment);
+int __cdecl _bheapmin(__segment);
+__segment __cdecl _bheapseg(size_t);
+int __cdecl _bheapset(__segment, unsigned int);
+int __cdecl _bheapwalk(__segment, _HEAPINFO *);
+void __based(void) * __cdecl _bmalloc(__segment, size_t);
+size_t __cdecl _bmsize(__segment, void __based(void) *);
+void __based(void) * __cdecl _brealloc(__segment,
+ void __based(void) *, size_t);
+
+
+/* function prototypes */
+
+#ifndef _WINDOWS
+void * __cdecl _alloca(size_t);
+#endif
+void * __cdecl calloc(size_t, size_t);
+void * __cdecl _expand(void *, size_t);
+void __far * __cdecl _fcalloc(size_t, size_t);
+void __far * __cdecl _fexpand(void __far *, size_t);
+void __cdecl _ffree(void __far *);
+int __cdecl _fheapchk(void);
+int __cdecl _fheapmin(void);
+int __cdecl _fheapset(unsigned int);
+int __cdecl _fheapwalk(_HEAPINFO *);
+void __far * __cdecl _fmalloc(size_t);
+size_t __cdecl _fmsize(void __far *);
+void __far * __cdecl _frealloc(void __far *, size_t);
+unsigned int __cdecl _freect(size_t);
+void __cdecl free(void *);
+void __huge * __cdecl _halloc(long, size_t);
+void __cdecl _hfree(void __huge *);
+#ifndef _WINDOWS
+int __cdecl _heapadd(void __far *, size_t);
+int __cdecl _heapchk(void);
+#endif
+int __cdecl _heapmin(void);
+#ifndef _WINDOWS
+int __cdecl _heapset(unsigned int);
+int __cdecl _heapwalk(_HEAPINFO *);
+#endif
+void * __cdecl malloc(size_t);
+size_t __cdecl _memavl(void);
+size_t __cdecl _memmax(void);
+size_t __cdecl _msize(void *);
+void __near * __cdecl _ncalloc(size_t, size_t);
+void __near * __cdecl _nexpand(void __near *, size_t);
+void __cdecl _nfree(void __near *);
+#ifndef _WINDOWS
+int __cdecl _nheapchk(void);
+#endif
+int __cdecl _nheapmin(void);
+#ifndef _WINDOWS
+int __cdecl _nheapset(unsigned int);
+int __cdecl _nheapwalk(_HEAPINFO *);
+#endif
+void __near * __cdecl _nmalloc(size_t);
+size_t __cdecl _nmsize(void __near *);
+void __near * __cdecl _nrealloc(void __near *, size_t);
+void * __cdecl realloc(void *, size_t);
+size_t __cdecl _stackavail(void);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#ifndef _WINDOWS
+void * __cdecl alloca(size_t);
+#endif
+void __huge * __cdecl halloc(long, size_t);
+void __cdecl hfree(void __huge *);
+size_t __cdecl stackavail(void);
+#endif /* __STDC__*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_MALLOC
+#endif /* _INC_MALLOC */
diff --git a/private/oleauto/tools/win16/os2/inc/math.h b/private/oleauto/tools/win16/os2/inc/math.h
new file mode 100644
index 000000000..a1d97f7c1
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/math.h
@@ -0,0 +1,252 @@
+/***
+*math.h - definitions and declarations for math library
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains constant definitions and external subroutine
+* declarations for the math subroutine library.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_MATH
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#define __pascal _pascal
+#endif
+
+/* definition of _exception struct - this struct is passed to the _matherr
+ * routine when a floating point exception is detected
+ */
+
+#ifndef _EXCEPTION_DEFINED
+#pragma pack(2)
+
+struct _exception {
+ int type; /* exception type - see below */
+ char *name; /* name of function where error occured */
+ double arg1; /* first argument to function */
+ double arg2; /* second argument (if any) to function */
+ double retval; /* value to be returned by function */
+ } ;
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+#define exception _exception
+#endif
+
+#pragma pack()
+#define _EXCEPTION_DEFINED
+#endif
+
+
+/* definition of a _complex struct to be used by those who use cabs and
+ * want type checking on their argument
+ */
+
+#ifndef _COMPLEX_DEFINED
+
+struct _complex {
+ double x,y; /* real and imaginary parts */
+ } ;
+
+#ifndef __cplusplus /* avoid "complex" name collision */
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+struct complex {
+ double x,y; /* real and imaginary parts */
+ } ;
+#endif
+#endif
+
+#define _COMPLEX_DEFINED
+#endif
+
+
+/* Constant definitions for the exception type passed in the _exception struct
+ */
+
+#define _DOMAIN 1 /* argument domain error */
+#define _SING 2 /* argument singularity */
+#define _OVERFLOW 3 /* overflow range error */
+#define _UNDERFLOW 4 /* underflow range error */
+#define _TLOSS 5 /* total loss of precision */
+#define _PLOSS 6 /* partial loss of precision */
+
+#define EDOM 33
+#define ERANGE 34
+
+
+/* definitions of _HUGE (XENIX) and HUGE_VAL (ANSI) error return values used
+ * by several floating point math routines
+ */
+
+extern double __near __cdecl _HUGE;
+#define HUGE_VAL _HUGE
+
+
+/* function prototypes */
+
+int __cdecl abs(int);
+double __cdecl acos(double);
+double __cdecl asin(double);
+double __cdecl atan(double);
+double __cdecl atan2(double, double);
+double __cdecl atof(const char *);
+double __cdecl _cabs(struct _complex);
+double __cdecl ceil(double);
+double __cdecl cos(double);
+double __cdecl cosh(double);
+int __cdecl _dieeetomsbin(double *, double *);
+int __cdecl _dmsbintoieee(double *, double *);
+double __cdecl exp(double);
+double __cdecl fabs(double);
+int __cdecl _fieeetomsbin(float *, float *);
+double __cdecl floor(double);
+double __cdecl fmod(double, double);
+int __cdecl _fmsbintoieee(float *, float *);
+double __cdecl frexp(double, int *);
+double __cdecl _hypot(double, double);
+double __cdecl _j0(double);
+double __cdecl _j1(double);
+double __cdecl _jn(int, double);
+long __cdecl labs(long);
+double __cdecl ldexp(double, int);
+double __cdecl log(double);
+double __cdecl log10(double);
+int __cdecl _matherr(struct _exception *);
+double __cdecl modf(double, double *);
+double __cdecl pow(double, double);
+double __cdecl sin(double);
+double __cdecl sinh(double);
+double __cdecl sqrt(double);
+double __cdecl tan(double);
+double __cdecl tanh(double);
+double __cdecl _y0(double);
+double __cdecl _y1(double);
+double __cdecl _yn(int, double);
+
+
+/* definition of _exceptionl struct - this struct is passed to the _matherrl
+ * routine when a floating point exception is detected in a long double routine
+ */
+
+#ifndef _LD_EXCEPTION_DEFINED
+#pragma pack(2)
+struct _exceptionl {
+ int type; /* exception type - see below */
+ char *name; /* name of function where error occured */
+ long double arg1; /* first argument to function */
+ long double arg2; /* second argument (if any) to function */
+ long double retval; /* value to be returned by function */
+ } ;
+#pragma pack()
+#define _LD_EXCEPTION_DEFINED
+#endif
+
+
+/* definition of a _complexl struct to be used by those who use _cabsl and
+ * want type checking on their argument
+ */
+
+#ifndef _LD_COMPLEX_DEFINED
+#pragma pack(2)
+struct _complexl {
+ long double x,y; /* real and imaginary parts */
+ } ;
+#pragma pack()
+#define _LD_COMPLEX_DEFINED
+#endif
+
+extern long double __near __cdecl _LHUGE;
+#define _LHUGE_VAL _LHUGE
+
+
+long double __cdecl acosl(long double);
+long double __cdecl asinl(long double);
+long double __cdecl atanl(long double);
+long double __cdecl atan2l(long double, long double);
+long double __cdecl _atold(const char *);
+long double __cdecl _cabsl(struct _complexl);
+long double __cdecl ceill(long double);
+long double __cdecl cosl(long double);
+long double __cdecl coshl(long double);
+long double __cdecl expl(long double);
+long double __cdecl fabsl(long double);
+long double __cdecl floorl(long double);
+long double __cdecl fmodl(long double, long double);
+long double __cdecl frexpl(long double, int *);
+long double __cdecl _hypotl(long double, long double);
+long double __cdecl _j0l(long double);
+long double __cdecl _j1l(long double);
+long double __cdecl _jnl(int, long double);
+long double __cdecl ldexpl(long double, int);
+long double __cdecl logl(long double);
+long double __cdecl log10l(long double);
+int __cdecl _matherrl(struct _exceptionl *);
+long double __cdecl modfl(long double, long double *);
+long double __cdecl powl(long double, long double);
+long double __cdecl sinl(long double);
+long double __cdecl sinhl(long double);
+long double __cdecl sqrtl(long double);
+long double __cdecl tanl(long double);
+long double __cdecl tanhl(long double);
+long double __cdecl _y0l(long double);
+long double __cdecl _y1l(long double);
+long double __cdecl _ynl(int, long double);
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define DOMAIN _DOMAIN
+#define SING _SING
+#define OVERFLOW _OVERFLOW
+#define UNDERFLOW _UNDERFLOW
+#define TLOSS _TLOSS
+#define PLOSS _PLOSS
+
+#define matherr _matherr
+
+#if 0
+/* NOTE: the following conflicts w/may other definitions of HUGE,
+ including those in our current Ole2 headers. -bradlo */
+extern double __near __cdecl HUGE;
+#endif
+
+#ifndef __cplusplus /* avoid "complex" name collision */
+double __cdecl cabs(struct complex);
+#endif
+double __cdecl hypot(double, double);
+double __cdecl j0(double);
+double __cdecl j1(double);
+double __cdecl jn(int, double);
+double __cdecl y0(double);
+double __cdecl y1(double);
+double __cdecl yn(int, double);
+
+int __cdecl dieeetomsbin(double *, double *);
+int __cdecl dmsbintoieee(double *, double *);
+int __cdecl fieeetomsbin(float *, float *);
+int __cdecl fmsbintoieee(float *, float *);
+
+long double __cdecl cabsl(struct _complexl);
+long double __cdecl hypotl(long double, long double);
+
+#endif /* __STDC__ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_MATH
+#endif /* _INC_MATH */
diff --git a/private/oleauto/tools/win16/os2/inc/memory.h b/private/oleauto/tools/win16/os2/inc/memory.h
new file mode 100644
index 000000000..c43f796aa
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/memory.h
@@ -0,0 +1,75 @@
+/***
+*memory.h - declarations for buffer (memory) manipulation routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file contains the function declarations for the
+* buffer (memory) manipulation routines.
+* [System V]
+*
+****/
+
+#ifndef _INC_MEMORY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+
+/* function prototypes */
+
+void * __cdecl _memccpy(void *, const void *,
+ int, unsigned int);
+void * __cdecl memchr(const void *, int, size_t);
+int __cdecl memcmp(const void *, const void *,
+ size_t);
+void * __cdecl memcpy(void *, const void *,
+ size_t);
+int __cdecl _memicmp(const void *, const void *,
+ unsigned int);
+void * __cdecl memset(void *, int, size_t);
+void __cdecl _movedata(unsigned int, unsigned int, unsigned int,
+ unsigned int, unsigned int);
+
+
+/* model independent function prototypes */
+
+void __far * __far __cdecl _fmemccpy(void __far *, const void __far *,
+ int, unsigned int);
+void __far * __far __cdecl _fmemchr(const void __far *, int, size_t);
+int __far __cdecl _fmemcmp(const void __far *, const void __far *,
+ size_t);
+void __far * __far __cdecl _fmemcpy(void __far *, const void __far *,
+ size_t);
+int __far __cdecl _fmemicmp(const void __far *, const void __far *,
+ unsigned int);
+void __far * __far __cdecl _fmemset(void __far *, int, size_t);
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+void * __cdecl memccpy(void *, const void *,
+ int, unsigned int);
+int __cdecl memicmp(const void *, const void *,
+ unsigned int);
+void __cdecl movedata(unsigned int, unsigned int, unsigned int,
+ unsigned int, unsigned int);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_MEMORY
+#endif /* _INC_MEMORY */
diff --git a/private/oleauto/tools/win16/os2/inc/mmsystem.h b/private/oleauto/tools/win16/os2/inc/mmsystem.h
new file mode 100644
index 000000000..e3bfa4234
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/mmsystem.h
@@ -0,0 +1,1917 @@
+/****************************************************************************/
+/* */
+/* MMSYSTEM.H - Include file for Multimedia APIs */
+/* */
+/* Note: You must include WINDOWS.H before including this file. */
+/* */
+/* Copyright (c) 1990-1992, Microsoft Corp. All rights reserved. */
+/* */
+/****************************************************************************/
+
+
+
+/* If defined, the following flags inhibit inclusion
+ * of the indicated items:
+ *
+ * MMNODRV - Installable driver support
+ * MMNOSOUND - Sound support
+ * MMNOWAVE - Waveform support
+ * MMNOMIDI - MIDI support
+ * MMNOAUX - Auxiliary audio support
+ * MMNOTIMER - Timer support
+ * MMNOJOY - Joystick support
+ * MMNOMCI - MCI support
+ * MMNOMMIO - Multimedia file I/O support
+ * MMNOMMSYSTEM - General MMSYSTEM functions
+ */
+
+#ifndef _INC_MMSYSTEM
+#define _INC_MMSYSTEM /* #defined if mmsystem.h has been included */
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+
+/****************************************************************************
+
+ General constants and data types
+
+****************************************************************************/
+
+/* general constants */
+#define MAXPNAMELEN 32 /* max product name length (including NULL) */
+#define MAXERRORLENGTH 128 /* max error text length (including NULL) */
+
+/* general data types */
+typedef WORD VERSION; /* major (high byte), minor (low byte) */
+
+/* MMTIME data structure */
+typedef struct mmtime_tag {
+ UINT wType; /* indicates the contents of the union */
+ union {
+ DWORD ms; /* milliseconds */
+ DWORD sample; /* samples */
+ DWORD cb; /* byte count */
+ struct { /* SMPTE */
+ BYTE hour; /* hours */
+ BYTE min; /* minutes */
+ BYTE sec; /* seconds */
+ BYTE frame; /* frames */
+ BYTE fps; /* frames per second */
+ BYTE dummy; /* pad */
+ } smpte;
+ struct { /* MIDI */
+ DWORD songptrpos; /* song pointer position */
+ } midi;
+ } u;
+ } MMTIME;
+typedef MMTIME *PMMTIME;
+typedef MMTIME NEAR *NPMMTIME;
+typedef MMTIME FAR *LPMMTIME;
+
+/* types for wType field in MMTIME struct */
+#define TIME_MS 0x0001 /* time in milliseconds */
+#define TIME_SAMPLES 0x0002 /* number of wave samples */
+#define TIME_BYTES 0x0004 /* current byte offset */
+#define TIME_SMPTE 0x0008 /* SMPTE time */
+#define TIME_MIDI 0x0010 /* MIDI time */
+
+
+/****************************************************************************
+
+ Multimedia Extensions Window Messages
+
+****************************************************************************/
+
+#define MM_JOY1MOVE 0x3A0 /* joystick */
+#define MM_JOY2MOVE 0x3A1
+#define MM_JOY1ZMOVE 0x3A2
+#define MM_JOY2ZMOVE 0x3A3
+#define MM_JOY1BUTTONDOWN 0x3B5
+#define MM_JOY2BUTTONDOWN 0x3B6
+#define MM_JOY1BUTTONUP 0x3B7
+#define MM_JOY2BUTTONUP 0x3B8
+
+#define MM_MCINOTIFY 0x3B9 /* MCI */
+
+#define MM_WOM_OPEN 0x3BB /* waveform output */
+#define MM_WOM_CLOSE 0x3BC
+#define MM_WOM_DONE 0x3BD
+
+#define MM_WIM_OPEN 0x3BE /* waveform input */
+#define MM_WIM_CLOSE 0x3BF
+#define MM_WIM_DATA 0x3C0
+
+#define MM_MIM_OPEN 0x3C1 /* MIDI input */
+#define MM_MIM_CLOSE 0x3C2
+#define MM_MIM_DATA 0x3C3
+#define MM_MIM_LONGDATA 0x3C4
+#define MM_MIM_ERROR 0x3C5
+#define MM_MIM_LONGERROR 0x3C6
+
+#define MM_MOM_OPEN 0x3C7 /* MIDI output */
+#define MM_MOM_CLOSE 0x3C8
+#define MM_MOM_DONE 0x3C9
+
+
+/****************************************************************************
+
+ String resource number bases (internal use)
+
+****************************************************************************/
+
+#define MMSYSERR_BASE 0
+#define WAVERR_BASE 32
+#define MIDIERR_BASE 64
+#define TIMERR_BASE 96
+#define JOYERR_BASE 160
+#define MCIERR_BASE 256
+
+#define MCI_STRING_OFFSET 512
+#define MCI_VD_OFFSET 1024
+#define MCI_CD_OFFSET 1088
+#define MCI_WAVE_OFFSET 1152
+#define MCI_SEQ_OFFSET 1216
+
+/****************************************************************************
+
+ General error return values
+
+****************************************************************************/
+
+/* general error return values */
+#define MMSYSERR_NOERROR 0 /* no error */
+#define MMSYSERR_ERROR (MMSYSERR_BASE + 1) /* unspecified error */
+#define MMSYSERR_BADDEVICEID (MMSYSERR_BASE + 2) /* device ID out of range */
+#define MMSYSERR_NOTENABLED (MMSYSERR_BASE + 3) /* driver failed enable */
+#define MMSYSERR_ALLOCATED (MMSYSERR_BASE + 4) /* device already allocated */
+#define MMSYSERR_INVALHANDLE (MMSYSERR_BASE + 5) /* device handle is invalid */
+#define MMSYSERR_NODRIVER (MMSYSERR_BASE + 6) /* no device driver present */
+#define MMSYSERR_NOMEM (MMSYSERR_BASE + 7) /* memory allocation error */
+#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE + 8) /* function isn't supported */
+#define MMSYSERR_BADERRNUM (MMSYSERR_BASE + 9) /* error value out of range */
+#define MMSYSERR_INVALFLAG (MMSYSERR_BASE + 10) /* invalid flag passed */
+#define MMSYSERR_INVALPARAM (MMSYSERR_BASE + 11) /* invalid parameter passed */
+#define MMSYSERR_LASTERROR (MMSYSERR_BASE + 11) /* last error in range */
+
+
+#if (WINVER < 0x030a)
+DECLARE_HANDLE(HDRVR);
+#endif /* ifdef WINVER < 0x030a */
+
+#ifndef MMNODRV
+/****************************************************************************
+
+ Installable driver support
+
+****************************************************************************/
+
+#if (WINVER < 0x030a)
+
+/* return values from DriverProc() function */
+#define DRV_CANCEL 0x0000
+#define DRV_OK 0x0001
+#define DRV_RESTART 0x0002
+
+/* Driver messages */
+#define DRV_LOAD 0x0001
+#define DRV_ENABLE 0x0002
+#define DRV_OPEN 0x0003
+#define DRV_CLOSE 0x0004
+#define DRV_DISABLE 0x0005
+#define DRV_FREE 0x0006
+#define DRV_CONFIGURE 0x0007
+#define DRV_QUERYCONFIGURE 0x0008
+#define DRV_INSTALL 0x0009
+#define DRV_REMOVE 0x000A
+#define DRV_RESERVED 0x0800
+#define DRV_USER 0x4000
+
+/* LPARAM of DRV_CONFIGURE message */
+typedef struct tagDRVCONFIGINFO {
+ DWORD dwDCISize;
+ LPCSTR lpszDCISectionName;
+ LPCSTR lpszDCIAliasName;
+} DRVCONFIGINFO;
+typedef DRVCONFIGINFO *PDRVCONFIGINFO;
+typedef DRVCONFIGINFO NEAR *NPDRVCONFIGINFO;
+typedef DRVCONFIGINFO FAR *LPDRVCONFIGINFO;
+
+/* installable driver function prototypes */
+LRESULT WINAPI DrvClose(HDRVR hDriver, LPARAM lParam1, LPARAM lParam2);
+HDRVR WINAPI DrvOpen(LPCSTR szDriverName, LPCSTR szSectionName,
+ LPARAM lParam2);
+LRESULT WINAPI DrvSendMessage(HDRVR hDriver, UINT uMessage,
+ LPARAM lParam1, LPARAM lParam2);
+HINSTANCE WINAPI DrvGetModuleHandle(HDRVR hDriver);
+
+LRESULT WINAPI DrvDefDriverProc(DWORD dwDriverIdentifier, HDRVR driverID,
+ UINT uMessage, LPARAM lParam1, LPARAM lParam2);
+
+#define DefDriverProc DrvDefDriverProc
+
+#endif /* ifdef WINVER < 0x030a */
+
+#if (WINVER >= 0x030a)
+
+
+/* return values from DriverProc() function */
+#define DRV_CANCEL DRVCNF_CANCEL
+#define DRV_OK DRVCNF_OK
+#define DRV_RESTART DRVCNF_RESTART
+
+#endif /* ifdef WINVER >= 0x030a */
+
+#define DRV_MCI_FIRST DRV_RESERVED
+#define DRV_MCI_LAST (DRV_RESERVED + 0xFFF)
+
+#endif /* ifndef MMNODRV */
+
+
+/****************************************************************************
+
+ Driver callback support
+
+****************************************************************************/
+
+/* flags used with waveOutOpen(), waveInOpen(), midiInOpen(), and */
+/* midiOutOpen() to specify the type of the dwCallback parameter. */
+
+#define CALLBACK_TYPEMASK 0x00070000l /* callback type mask */
+#define CALLBACK_NULL 0x00000000l /* no callback */
+#define CALLBACK_WINDOW 0x00010000l /* dwCallback is a HWND */
+#define CALLBACK_TASK 0x00020000l /* dwCallback is a HTASK */
+#define CALLBACK_FUNCTION 0x00030000l /* dwCallback is a FARPROC */
+
+/* driver callback prototypes */
+typedef void (CALLBACK DRVCALLBACK) (HDRVR h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
+
+typedef DRVCALLBACK FAR *LPDRVCALLBACK;
+
+/****************************************************************************
+
+ Manufacturer and product IDs
+
+ Used with wMid and wPid fields in WAVEOUTCAPS, WAVEINCAPS,
+ MIDIOUTCAPS, MIDIINCAPS, AUXCAPS, JOYCAPS structures.
+
+****************************************************************************/
+
+/* manufacturer IDs */
+#define MM_MICROSOFT 1 /* Microsoft Corp. */
+
+/* product IDs */
+#define MM_MIDI_MAPPER 1 /* MIDI Mapper */
+#define MM_WAVE_MAPPER 2 /* Wave Mapper */
+
+#define MM_SNDBLST_MIDIOUT 3 /* Sound Blaster MIDI output port */
+#define MM_SNDBLST_MIDIIN 4 /* Sound Blaster MIDI input port */
+#define MM_SNDBLST_SYNTH 5 /* Sound Blaster internal synthesizer */
+#define MM_SNDBLST_WAVEOUT 6 /* Sound Blaster waveform output */
+#define MM_SNDBLST_WAVEIN 7 /* Sound Blaster waveform input */
+
+#define MM_ADLIB 9 /* Ad Lib-compatible synthesizer */
+
+#define MM_MPU401_MIDIOUT 10 /* MPU401-compatible MIDI output port */
+#define MM_MPU401_MIDIIN 11 /* MPU401-compatible MIDI input port */
+
+#define MM_PC_JOYSTICK 12 /* Joystick adapter */
+
+
+#ifndef MMNOMMSYSTEM
+/****************************************************************************
+
+ General MMSYSTEM support
+
+****************************************************************************/
+
+WORD WINAPI mmsystemGetVersion(void);
+void WINAPI OutputDebugStr(LPCSTR);
+
+#endif /* ifndef MMNOMMSYSTEM */
+
+
+#ifndef MMNOSOUND
+/****************************************************************************
+
+ Sound support
+
+****************************************************************************/
+
+BOOL WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT uFlags);
+
+/* flag values for wFlags parameter */
+#define SND_SYNC 0x0000 /* play synchronously (default) */
+#define SND_ASYNC 0x0001 /* play asynchronously */
+#define SND_NODEFAULT 0x0002 /* don't use default sound */
+#define SND_MEMORY 0x0004 /* lpszSoundName points to a memory file */
+#define SND_LOOP 0x0008 /* loop the sound until next sndPlaySound */
+#define SND_NOSTOP 0x0010 /* don't stop any currently playing sound */
+
+#endif /* ifndef MMNOSOUND */
+
+
+#ifndef MMNOWAVE
+/****************************************************************************
+
+ Waveform audio support
+
+****************************************************************************/
+
+/* waveform audio error return values */
+#define WAVERR_BADFORMAT (WAVERR_BASE + 0) /* unsupported wave format */
+#define WAVERR_STILLPLAYING (WAVERR_BASE + 1) /* still something playing */
+#define WAVERR_UNPREPARED (WAVERR_BASE + 2) /* header not prepared */
+#define WAVERR_SYNC (WAVERR_BASE + 3) /* device is synchronous */
+#define WAVERR_LASTERROR (WAVERR_BASE + 3) /* last error in range */
+
+/* waveform audio data types */
+DECLARE_HANDLE(HWAVE);
+DECLARE_HANDLE(HWAVEIN);
+DECLARE_HANDLE(HWAVEOUT);
+typedef HWAVEIN FAR *LPHWAVEIN;
+typedef HWAVEOUT FAR *LPHWAVEOUT;
+typedef DRVCALLBACK WAVECALLBACK;
+typedef WAVECALLBACK FAR *LPWAVECALLBACK;
+
+/* wave callback messages */
+#define WOM_OPEN MM_WOM_OPEN
+#define WOM_CLOSE MM_WOM_CLOSE
+#define WOM_DONE MM_WOM_DONE
+#define WIM_OPEN MM_WIM_OPEN
+#define WIM_CLOSE MM_WIM_CLOSE
+#define WIM_DATA MM_WIM_DATA
+
+/* device ID for wave device mapper */
+#define WAVE_MAPPER (-1)
+
+/* flags for dwFlags parameter in waveOutOpen() and waveInOpen() */
+#define WAVE_FORMAT_QUERY 0x0001
+#define WAVE_ALLOWSYNC 0x0002
+
+/* wave data block header */
+typedef struct wavehdr_tag {
+ LPSTR lpData; /* pointer to locked data buffer */
+ DWORD dwBufferLength; /* length of data buffer */
+ DWORD dwBytesRecorded; /* used for input only */
+ DWORD dwUser; /* for client's use */
+ DWORD dwFlags; /* assorted flags (see defines) */
+ DWORD dwLoops; /* loop control counter */
+ struct wavehdr_tag far *lpNext; /* reserved for driver */
+ DWORD reserved; /* reserved for driver */
+} WAVEHDR;
+typedef WAVEHDR *PWAVEHDR;
+typedef WAVEHDR NEAR *NPWAVEHDR;
+typedef WAVEHDR FAR *LPWAVEHDR;
+
+/* flags for dwFlags field of WAVEHDR */
+#define WHDR_DONE 0x00000001 /* done bit */
+#define WHDR_PREPARED 0x00000002 /* set if this header has been prepared */
+#define WHDR_BEGINLOOP 0x00000004 /* loop start block */
+#define WHDR_ENDLOOP 0x00000008 /* loop end block */
+#define WHDR_INQUEUE 0x00000010 /* reserved for driver */
+
+/* waveform output device capabilities structure */
+typedef struct waveoutcaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ DWORD dwFormats; /* formats supported */
+ UINT wChannels; /* number of sources supported */
+ DWORD dwSupport; /* functionality supported by driver */
+} WAVEOUTCAPS;
+typedef WAVEOUTCAPS *PWAVEOUTCAPS;
+typedef WAVEOUTCAPS NEAR *NPWAVEOUTCAPS;
+typedef WAVEOUTCAPS FAR *LPWAVEOUTCAPS;
+
+/* flags for dwSupport field of WAVEOUTCAPS */
+#define WAVECAPS_PITCH 0x0001 /* supports pitch control */
+#define WAVECAPS_PLAYBACKRATE 0x0002 /* supports playback rate control */
+#define WAVECAPS_VOLUME 0x0004 /* supports volume control */
+#define WAVECAPS_LRVOLUME 0x0008 /* separate left-right volume control */
+#define WAVECAPS_SYNC 0x0010
+
+/* waveform input device capabilities structure */
+typedef struct waveincaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ DWORD dwFormats; /* formats supported */
+ UINT wChannels; /* number of channels supported */
+} WAVEINCAPS;
+typedef WAVEINCAPS *PWAVEINCAPS;
+typedef WAVEINCAPS NEAR *NPWAVEINCAPS;
+typedef WAVEINCAPS FAR *LPWAVEINCAPS;
+
+/* defines for dwFormat field of WAVEINCAPS and WAVEOUTCAPS */
+#define WAVE_INVALIDFORMAT 0x00000000 /* invalid format */
+#define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */
+#define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */
+#define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */
+
+/* general waveform format structure (information common to all formats) */
+typedef struct waveformat_tag {
+ WORD wFormatTag; /* format type */
+ WORD nChannels; /* number of channels (i.e. mono, stereo, etc.) */
+ DWORD nSamplesPerSec; /* sample rate */
+ DWORD nAvgBytesPerSec; /* for buffer estimation */
+ WORD nBlockAlign; /* block size of data */
+} WAVEFORMAT;
+typedef WAVEFORMAT *PWAVEFORMAT;
+typedef WAVEFORMAT NEAR *NPWAVEFORMAT;
+typedef WAVEFORMAT FAR *LPWAVEFORMAT;
+
+/* flags for wFormatTag field of WAVEFORMAT */
+#define WAVE_FORMAT_PCM 1
+
+/* specific waveform format structure for PCM data */
+typedef struct pcmwaveformat_tag {
+ WAVEFORMAT wf;
+ WORD wBitsPerSample;
+} PCMWAVEFORMAT;
+typedef PCMWAVEFORMAT *PPCMWAVEFORMAT;
+typedef PCMWAVEFORMAT NEAR *NPPCMWAVEFORMAT;
+typedef PCMWAVEFORMAT FAR *LPPCMWAVEFORMAT;
+
+/* waveform audio function prototypes */
+UINT WINAPI waveOutGetNumDevs(void);
+UINT WINAPI waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS FAR* lpCaps,
+ UINT uSize);
+UINT WINAPI waveOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+UINT WINAPI waveOutSetVolume(UINT uDeviceID, DWORD dwVolume);
+UINT WINAPI waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI waveOutOpen(HWAVEOUT FAR* lphWaveOut, UINT uDeviceID,
+ const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
+UINT WINAPI waveOutClose(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut,
+ WAVEHDR FAR* lpWaveOutHdr, UINT uSize);
+UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut,
+ WAVEHDR FAR* lpWaveOutHdr, UINT uSize);
+UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr,
+ UINT uSize);
+UINT WINAPI waveOutPause(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutRestart(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutReset(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutBreakLoop(HWAVEOUT hWaveOut);
+UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME FAR* lpInfo,
+ UINT uSize);
+UINT WINAPI waveOutGetPitch(HWAVEOUT hWaveOut, DWORD FAR* lpdwPitch);
+UINT WINAPI waveOutSetPitch(HWAVEOUT hWaveOut, DWORD dwPitch);
+UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD FAR* lpdwRate);
+UINT WINAPI waveOutSetPlaybackRate(HWAVEOUT hWaveOut, DWORD dwRate);
+UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT FAR* lpuDeviceID);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+UINT WINAPI waveInGetNumDevs(void);
+UINT WINAPI waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS FAR* lpCaps,
+ UINT uSize);
+UINT WINAPI waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI waveInOpen(HWAVEIN FAR* lphWaveIn, UINT uDeviceID,
+ const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
+UINT WINAPI waveInClose(HWAVEIN hWaveIn);
+UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn,
+ WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn,
+ WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn,
+ WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+UINT WINAPI waveInStart(HWAVEIN hWaveIn);
+UINT WINAPI waveInStop(HWAVEIN hWaveIn);
+UINT WINAPI waveInReset(HWAVEIN hWaveIn);
+UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, MMTIME FAR* lpInfo,
+ UINT uSize);
+UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT FAR* lpuDeviceID);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+#endif /* ifndef MMNOWAVE */
+
+
+#ifndef MMNOMIDI
+/****************************************************************************
+
+ MIDI audio support
+
+****************************************************************************/
+
+/* MIDI error return values */
+#define MIDIERR_UNPREPARED (MIDIERR_BASE + 0) /* header not prepared */
+#define MIDIERR_STILLPLAYING (MIDIERR_BASE + 1) /* still something playing */
+#define MIDIERR_NOMAP (MIDIERR_BASE + 2) /* no current map */
+#define MIDIERR_NOTREADY (MIDIERR_BASE + 3) /* hardware is still busy */
+#define MIDIERR_NODEVICE (MIDIERR_BASE + 4) /* port no longer connected */
+#define MIDIERR_INVALIDSETUP (MIDIERR_BASE + 5) /* invalid setup */
+#define MIDIERR_LASTERROR (MIDIERR_BASE + 5) /* last error in range */
+
+/* MIDI audio data types */
+DECLARE_HANDLE(HMIDI);
+DECLARE_HANDLE(HMIDIIN);
+DECLARE_HANDLE(HMIDIOUT);
+typedef HMIDIIN FAR *LPHMIDIIN;
+typedef HMIDIOUT FAR *LPHMIDIOUT;
+typedef DRVCALLBACK MIDICALLBACK;
+typedef MIDICALLBACK FAR *LPMIDICALLBACK;
+#define MIDIPATCHSIZE 128
+typedef WORD PATCHARRAY[MIDIPATCHSIZE];
+typedef WORD FAR *LPPATCHARRAY;
+typedef WORD KEYARRAY[MIDIPATCHSIZE];
+typedef WORD FAR *LPKEYARRAY;
+
+/* MIDI callback messages */
+#define MIM_OPEN MM_MIM_OPEN
+#define MIM_CLOSE MM_MIM_CLOSE
+#define MIM_DATA MM_MIM_DATA
+#define MIM_LONGDATA MM_MIM_LONGDATA
+#define MIM_ERROR MM_MIM_ERROR
+#define MIM_LONGERROR MM_MIM_LONGERROR
+#define MOM_OPEN MM_MOM_OPEN
+#define MOM_CLOSE MM_MOM_CLOSE
+#define MOM_DONE MM_MOM_DONE
+
+/* device ID for MIDI mapper */
+#define MIDIMAPPER (-1)
+#define MIDI_MAPPER (-1)
+
+/* flags for wFlags parm of midiOutCachePatches(), midiOutCacheDrumPatches() */
+#define MIDI_CACHE_ALL 1
+#define MIDI_CACHE_BESTFIT 2
+#define MIDI_CACHE_QUERY 3
+#define MIDI_UNCACHE 4
+
+/* MIDI output device capabilities structure */
+typedef struct midioutcaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ UINT wTechnology; /* type of device */
+ UINT wVoices; /* # of voices (internal synth only) */
+ UINT wNotes; /* max # of notes (internal synth only) */
+ UINT wChannelMask; /* channels used (internal synth only) */
+ DWORD dwSupport; /* functionality supported by driver */
+} MIDIOUTCAPS;
+typedef MIDIOUTCAPS *PMIDIOUTCAPS;
+typedef MIDIOUTCAPS NEAR *NPMIDIOUTCAPS;
+typedef MIDIOUTCAPS FAR *LPMIDIOUTCAPS;
+
+/* flags for wTechnology field of MIDIOUTCAPS structure */
+#define MOD_MIDIPORT 1 /* output port */
+#define MOD_SYNTH 2 /* generic internal synth */
+#define MOD_SQSYNTH 3 /* square wave internal synth */
+#define MOD_FMSYNTH 4 /* FM internal synth */
+#define MOD_MAPPER 5 /* MIDI mapper */
+
+/* flags for dwSupport field of MIDIOUTCAPS structure */
+#define MIDICAPS_VOLUME 0x0001 /* supports volume control */
+#define MIDICAPS_LRVOLUME 0x0002 /* separate left-right volume control */
+#define MIDICAPS_CACHE 0x0004
+
+/* MIDI output device capabilities structure */
+typedef struct midiincaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+} MIDIINCAPS;
+typedef MIDIINCAPS *PMIDIINCAPS;
+typedef MIDIINCAPS NEAR *NPMIDIINCAPS;
+typedef MIDIINCAPS FAR *LPMIDIINCAPS;
+
+/* MIDI data block header */
+typedef struct midihdr_tag {
+ LPSTR lpData; /* pointer to locked data block */
+ DWORD dwBufferLength; /* length of data in data block */
+ DWORD dwBytesRecorded; /* used for input only */
+ DWORD dwUser; /* for client's use */
+ DWORD dwFlags; /* assorted flags (see defines) */
+ struct midihdr_tag far *lpNext; /* reserved for driver */
+ DWORD reserved; /* reserved for driver */
+} MIDIHDR;
+typedef MIDIHDR *PMIDIHDR;
+typedef MIDIHDR NEAR *NPMIDIHDR;
+typedef MIDIHDR FAR *LPMIDIHDR;
+
+/* flags for dwFlags field of MIDIHDR structure */
+#define MHDR_DONE 0x00000001 /* done bit */
+#define MHDR_PREPARED 0x00000002 /* set if header prepared */
+#define MHDR_INQUEUE 0x00000004 /* reserved for driver */
+
+/* MIDI function prototypes */
+UINT WINAPI midiOutGetNumDevs(void);
+UINT WINAPI midiOutGetDevCaps(UINT uDeviceID,
+ MIDIOUTCAPS FAR* lpCaps, UINT uSize);
+UINT WINAPI midiOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+UINT WINAPI midiOutSetVolume(UINT uDeviceID, DWORD dwVolume);
+UINT WINAPI midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI midiOutOpen(HMIDIOUT FAR* lphMidiOut, UINT uDeviceID,
+ DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
+UINT WINAPI midiOutClose(HMIDIOUT hMidiOut);
+UINT WINAPI midiOutPrepareHeader(HMIDIOUT hMidiOut,
+ MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+UINT WINAPI midiOutUnprepareHeader(HMIDIOUT hMidiOut,
+ MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+UINT WINAPI midiOutShortMsg(HMIDIOUT hMidiOut, DWORD dwMsg);
+UINT WINAPI midiOutLongMsg(HMIDIOUT hMidiOut,
+ MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+UINT WINAPI midiOutReset(HMIDIOUT hMidiOut);
+UINT WINAPI midiOutCachePatches(HMIDIOUT hMidiOut,
+ UINT uBank, WORD FAR* lpwPatchArray, UINT uFlags);
+UINT WINAPI midiOutCacheDrumPatches(HMIDIOUT hMidiOut,
+ UINT uPatch, WORD FAR* lpwKeyArray, UINT uFlags);
+UINT WINAPI midiOutGetID(HMIDIOUT hMidiOut, UINT FAR* lpuDeviceID);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+UINT WINAPI midiInGetNumDevs(void);
+UINT WINAPI midiInGetDevCaps(UINT uDeviceID,
+ LPMIDIINCAPS lpCaps, UINT uSize);
+UINT WINAPI midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI midiInOpen(HMIDIIN FAR* lphMidiIn, UINT uDeviceID,
+ DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
+UINT WINAPI midiInClose(HMIDIIN hMidiIn);
+UINT WINAPI midiInPrepareHeader(HMIDIIN hMidiIn,
+ MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+UINT WINAPI midiInUnprepareHeader(HMIDIIN hMidiIn,
+ MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+UINT WINAPI midiInAddBuffer(HMIDIIN hMidiIn,
+ MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+UINT WINAPI midiInStart(HMIDIIN hMidiIn);
+UINT WINAPI midiInStop(HMIDIIN hMidiIn);
+UINT WINAPI midiInReset(HMIDIIN hMidiIn);
+UINT WINAPI midiInGetID(HMIDIIN hMidiIn, UINT FAR* lpuDeviceID);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+#endif /* ifndef MMNOMIDI */
+
+
+#ifndef MMNOAUX
+/****************************************************************************
+
+ Auxiliary audio support
+
+****************************************************************************/
+
+/* device ID for aux device mapper */
+#define AUX_MAPPER (-1)
+
+/* Auxiliary audio device capabilities structure */
+typedef struct auxcaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ VERSION vDriverVersion; /* version of the driver */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ UINT wTechnology; /* type of device */
+ DWORD dwSupport; /* functionality supported by driver */
+} AUXCAPS;
+typedef AUXCAPS *PAUXCAPS;
+typedef AUXCAPS NEAR *NPAUXCAPS;
+typedef AUXCAPS FAR *LPAUXCAPS;
+
+/* flags for wTechnology field in AUXCAPS structure */
+#define AUXCAPS_CDAUDIO 1 /* audio from internal CD-ROM drive */
+#define AUXCAPS_AUXIN 2 /* audio from auxiliary input jacks */
+
+/* flags for dwSupport field in AUXCAPS structure */
+#define AUXCAPS_VOLUME 0x0001 /* supports volume control */
+#define AUXCAPS_LRVOLUME 0x0002 /* separate left-right volume control */
+
+/* auxiliary audio function prototypes */
+UINT WINAPI auxGetNumDevs(void);
+UINT WINAPI auxGetDevCaps(UINT uDeviceID, AUXCAPS FAR* lpCaps, UINT uSize);
+UINT WINAPI auxSetVolume(UINT uDeviceID, DWORD dwVolume);
+UINT WINAPI auxGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2);
+#endif /* ifdef WINVER >= 0x030a */
+
+#endif /* ifndef MMNOAUX */
+
+
+#ifndef MMNOTIMER
+/****************************************************************************
+
+ Timer support
+
+****************************************************************************/
+
+/* timer error return values */
+#define TIMERR_NOERROR (0) /* no error */
+#define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */
+#define TIMERR_STRUCT (TIMERR_BASE+33) /* time struct size */
+
+/* timer data types */
+typedef void (CALLBACK TIMECALLBACK) (UINT uTimerID, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
+
+typedef TIMECALLBACK FAR *LPTIMECALLBACK;
+
+/* flags for wFlags parameter of timeSetEvent() function */
+#define TIME_ONESHOT 0 /* program timer for single event */
+#define TIME_PERIODIC 1 /* program for continuous periodic event */
+
+/* timer device capabilities data structure */
+typedef struct timecaps_tag {
+ UINT wPeriodMin; /* minimum period supported */
+ UINT wPeriodMax; /* maximum period supported */
+ } TIMECAPS;
+typedef TIMECAPS *PTIMECAPS;
+typedef TIMECAPS NEAR *NPTIMECAPS;
+typedef TIMECAPS FAR *LPTIMECAPS;
+
+/* timer function prototypes */
+UINT WINAPI timeGetSystemTime(MMTIME FAR* lpTime, UINT uSize);
+DWORD WINAPI timeGetTime(void);
+UINT WINAPI timeSetEvent(UINT uDelay, UINT uResolution,
+ LPTIMECALLBACK lpFunction, DWORD dwUser, UINT uFlags);
+UINT WINAPI timeKillEvent(UINT uTimerID);
+UINT WINAPI timeGetDevCaps(TIMECAPS FAR* lpTimeCaps, UINT uSize);
+UINT WINAPI timeBeginPeriod(UINT uPeriod);
+UINT WINAPI timeEndPeriod(UINT uPeriod);
+
+#endif /* ifndef MMNOTIMER */
+
+
+#ifndef MMNOJOY
+/****************************************************************************
+
+ Joystick support
+
+****************************************************************************/
+
+/* joystick error return values */
+#define JOYERR_NOERROR (0) /* no error */
+#define JOYERR_PARMS (JOYERR_BASE+5) /* bad parameters */
+#define JOYERR_NOCANDO (JOYERR_BASE+6) /* request not completed */
+#define JOYERR_UNPLUGGED (JOYERR_BASE+7) /* joystick is unplugged */
+
+/* constants used with JOYINFO structure and MM_JOY* messages */
+#define JOY_BUTTON1 0x0001
+#define JOY_BUTTON2 0x0002
+#define JOY_BUTTON3 0x0004
+#define JOY_BUTTON4 0x0008
+#define JOY_BUTTON1CHG 0x0100
+#define JOY_BUTTON2CHG 0x0200
+#define JOY_BUTTON3CHG 0x0400
+#define JOY_BUTTON4CHG 0x0800
+
+/* joystick ID constants */
+#define JOYSTICKID1 0
+#define JOYSTICKID2 1
+
+/* joystick device capabilities data structure */
+typedef struct joycaps_tag {
+ UINT wMid; /* manufacturer ID */
+ UINT wPid; /* product ID */
+ char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
+ UINT wXmin; /* minimum x position value */
+ UINT wXmax; /* maximum x position value */
+ UINT wYmin; /* minimum y position value */
+ UINT wYmax; /* maximum y position value */
+ UINT wZmin; /* minimum z position value */
+ UINT wZmax; /* maximum z position value */
+ UINT wNumButtons; /* number of buttons */
+ UINT wPeriodMin; /* minimum message period when captured */
+ UINT wPeriodMax; /* maximum message period when captured */
+ } JOYCAPS;
+typedef JOYCAPS *PJOYCAPS;
+typedef JOYCAPS NEAR *NPJOYCAPS;
+typedef JOYCAPS FAR *LPJOYCAPS;
+
+/* joystick information data structure */
+typedef struct joyinfo_tag {
+ UINT wXpos; /* x position */
+ UINT wYpos; /* y position */
+ UINT wZpos; /* z position */
+ UINT wButtons; /* button states */
+ } JOYINFO;
+typedef JOYINFO *PJOYINFO;
+typedef JOYINFO NEAR *NPJOYINFO;
+typedef JOYINFO FAR *LPJOYINFO;
+
+/* joystick function prototypes */
+UINT WINAPI joyGetDevCaps(UINT uJoyID, JOYCAPS FAR* lpCaps, UINT uSize);
+UINT WINAPI joyGetNumDevs(void);
+UINT WINAPI joyGetPos(UINT uJoyID, JOYINFO FAR* lpInfo);
+UINT WINAPI joyGetThreshold(UINT uJoyID, UINT FAR* lpuThreshold);
+UINT WINAPI joyReleaseCapture(UINT uJoyID);
+UINT WINAPI joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod,
+ BOOL bChanged);
+UINT WINAPI joySetThreshold(UINT uJoyID, UINT uThreshold);
+
+#endif /* ifndef MMNOJOY */
+
+
+#ifndef MMNOMMIO
+/****************************************************************************
+
+ Multimedia File I/O support
+
+****************************************************************************/
+
+/* MMIO error return values */
+#define MMIOERR_BASE 256
+#define MMIOERR_FILENOTFOUND (MMIOERR_BASE + 1) /* file not found */
+#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE + 2) /* out of memory */
+#define MMIOERR_CANNOTOPEN (MMIOERR_BASE + 3) /* cannot open */
+#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE + 4) /* cannot close */
+#define MMIOERR_CANNOTREAD (MMIOERR_BASE + 5) /* cannot read */
+#define MMIOERR_CANNOTWRITE (MMIOERR_BASE + 6) /* cannot write */
+#define MMIOERR_CANNOTSEEK (MMIOERR_BASE + 7) /* cannot seek */
+#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE + 8) /* cannot expand file */
+#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE + 9) /* chunk not found */
+#define MMIOERR_UNBUFFERED (MMIOERR_BASE + 10) /* file is unbuffered */
+
+/* MMIO constants */
+#define CFSEPCHAR '+' /* compound file name separator char. */
+
+/* MMIO data types */
+typedef DWORD FOURCC; /* a four character code */
+typedef char _huge * HPSTR; /* a huge version of LPSTR */
+DECLARE_HANDLE(HMMIO); /* a handle to an open file */
+typedef LRESULT (CALLBACK MMIOPROC)(LPSTR lpmmioinfo, UINT uMessage,
+ LPARAM lParam1, LPARAM lParam2);
+typedef MMIOPROC FAR *LPMMIOPROC;
+
+/* general MMIO information data structure */
+typedef struct _MMIOINFO
+{
+ /* general fields */
+ DWORD dwFlags; /* general status flags */
+ FOURCC fccIOProc; /* pointer to I/O procedure */
+ LPMMIOPROC pIOProc; /* pointer to I/O procedure */
+ UINT wErrorRet; /* place for error to be returned */
+ HTASK htask; /* alternate local task */
+
+ /* fields maintained by MMIO functions during buffered I/O */
+ LONG cchBuffer; /* size of I/O buffer (or 0L) */
+ HPSTR pchBuffer; /* start of I/O buffer (or NULL) */
+ HPSTR pchNext; /* pointer to next byte to read/write */
+ HPSTR pchEndRead; /* pointer to last valid byte to read */
+ HPSTR pchEndWrite; /* pointer to last byte to write */
+ LONG lBufOffset; /* disk offset of start of buffer */
+
+ /* fields maintained by I/O procedure */
+ LONG lDiskOffset; /* disk offset of next read or write */
+ DWORD adwInfo[3]; /* data specific to type of MMIOPROC */
+
+ /* other fields maintained by MMIO */
+ DWORD dwReserved1; /* reserved for MMIO use */
+ DWORD dwReserved2; /* reserved for MMIO use */
+ HMMIO hmmio; /* handle to open file */
+} MMIOINFO;
+typedef MMIOINFO *PMMIOINFO;
+typedef MMIOINFO NEAR *NPMMIOINFO;
+typedef MMIOINFO FAR *LPMMIOINFO;
+
+/* RIFF chunk information data structure */
+typedef struct _MMCKINFO
+{
+ FOURCC ckid; /* chunk ID */
+ DWORD cksize; /* chunk size */
+ FOURCC fccType; /* form type or list type */
+ DWORD dwDataOffset; /* offset of data portion of chunk */
+ DWORD dwFlags; /* flags used by MMIO functions */
+} MMCKINFO;
+typedef MMCKINFO *PMMCKINFO;
+typedef MMCKINFO NEAR *NPMMCKINFO;
+typedef MMCKINFO FAR *LPMMCKINFO;
+
+/* bit field masks */
+#define MMIO_RWMODE 0x00000003 /* open file for reading/writing/both */
+#define MMIO_SHAREMODE 0x00000070 /* file sharing mode number */
+
+/* constants for dwFlags field of MMIOINFO */
+#define MMIO_CREATE 0x00001000 /* create new file (or truncate file) */
+#define MMIO_PARSE 0x00000100 /* parse new file returning path */
+#define MMIO_DELETE 0x00000200 /* create new file (or truncate file) */
+#define MMIO_EXIST 0x00004000 /* checks for existence of file */
+#define MMIO_ALLOCBUF 0x00010000 /* mmioOpen() should allocate a buffer */
+#define MMIO_GETTEMP 0x00020000 /* mmioOpen() should retrieve temp name */
+
+#define MMIO_DIRTY 0x10000000 /* I/O buffer is dirty */
+
+
+/* read/write mode numbers (bit field MMIO_RWMODE) */
+#define MMIO_READ 0x00000000 /* open file for reading only */
+#define MMIO_WRITE 0x00000001 /* open file for writing only */
+#define MMIO_READWRITE 0x00000002 /* open file for reading and writing */
+
+/* share mode numbers (bit field MMIO_SHAREMODE) */
+#define MMIO_COMPAT 0x00000000 /* compatibility mode */
+#define MMIO_EXCLUSIVE 0x00000010 /* exclusive-access mode */
+#define MMIO_DENYWRITE 0x00000020 /* deny writing to other processes */
+#define MMIO_DENYREAD 0x00000030 /* deny reading to other processes */
+#define MMIO_DENYNONE 0x00000040 /* deny nothing to other processes */
+
+/* various MMIO flags */
+#define MMIO_FHOPEN 0x0010 /* mmioClose: keep file handle open */
+#define MMIO_EMPTYBUF 0x0010 /* mmioFlush: empty the I/O buffer */
+#define MMIO_TOUPPER 0x0010 /* mmioStringToFOURCC: to u-case */
+#define MMIO_INSTALLPROC 0x00010000 /* mmioInstallIOProc: install MMIOProc */
+#define MMIO_GLOBALPROC 0x10000000 /* mmioInstallIOProc: install globally */
+#define MMIO_REMOVEPROC 0x00020000 /* mmioInstallIOProc: remove MMIOProc */
+#define MMIO_FINDPROC 0x00040000 /* mmioInstallIOProc: find an MMIOProc */
+#define MMIO_FINDCHUNK 0x0010 /* mmioDescend: find a chunk by ID */
+#define MMIO_FINDRIFF 0x0020 /* mmioDescend: find a LIST chunk */
+#define MMIO_FINDLIST 0x0040 /* mmioDescend: find a RIFF chunk */
+#define MMIO_CREATERIFF 0x0020 /* mmioCreateChunk: make a LIST chunk */
+#define MMIO_CREATELIST 0x0040 /* mmioCreateChunk: make a RIFF chunk */
+
+
+/* message numbers for MMIOPROC I/O procedure functions */
+#define MMIOM_READ MMIO_READ /* read */
+#define MMIOM_WRITE MMIO_WRITE /* write */
+#define MMIOM_SEEK 2 /* seek to a new position in file */
+#define MMIOM_OPEN 3 /* open file */
+#define MMIOM_CLOSE 4 /* close file */
+#define MMIOM_WRITEFLUSH 5 /* write and flush */
+
+#if (WINVER >= 0x030a)
+#define MMIOM_RENAME 6 /* rename specified file */
+#endif /* ifdef WINVER >= 0x030a */
+
+#define MMIOM_USER 0x8000 /* beginning of user-defined messages */
+
+/* standard four character codes */
+#define FOURCC_RIFF mmioFOURCC('R', 'I', 'F', 'F')
+#define FOURCC_LIST mmioFOURCC('L', 'I', 'S', 'T')
+
+/* four character codes used to identify standard built-in I/O procedures */
+#define FOURCC_DOS mmioFOURCC('D', 'O', 'S', ' ')
+#define FOURCC_MEM mmioFOURCC('M', 'E', 'M', ' ')
+
+/* flags for mmioSeek() */
+#ifndef SEEK_SET
+#define SEEK_SET 0 /* seek to an absolute position */
+#define SEEK_CUR 1 /* seek relative to current position */
+#define SEEK_END 2 /* seek relative to end of file */
+#endif /* ifndef SEEK_SET */
+
+/* other constants */
+#define MMIO_DEFAULTBUFFER 8192 /* default buffer size */
+
+/* MMIO macros */
+#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
+ ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \
+ ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
+
+/* MMIO function prototypes */
+FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT uFlags);
+LPMMIOPROC WINAPI mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc,
+ DWORD dwFlags);
+HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo,
+ DWORD dwOpenFlags);
+
+#if (WINVER >= 0x030a)
+UINT WINAPI mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
+ MMIOINFO FAR* lpmmioinfo, DWORD dwRenameFlags);
+#endif /* ifdef WINVER >= 0x030a */
+
+UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags);
+LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch);
+LONG WINAPI mmioWrite(HMMIO hmmio, const char _huge* pch, LONG cch);
+LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin);
+UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags);
+UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags);
+UINT WINAPI mmioSetBuffer(HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer,
+ UINT uFlags);
+UINT WINAPI mmioFlush(HMMIO hmmio, UINT uFlags);
+UINT WINAPI mmioAdvance(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags);
+LRESULT WINAPI mmioSendMessage(HMMIO hmmio, UINT uMessage,
+ LPARAM lParam1, LPARAM lParam2);
+UINT WINAPI mmioDescend(HMMIO hmmio, MMCKINFO FAR* lpck,
+ const MMCKINFO FAR* lpckParent, UINT uFlags);
+UINT WINAPI mmioAscend(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags);
+UINT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags);
+
+#endif /* ifndef MMNOMMIO */
+
+
+#ifndef MMNOMCI
+/****************************************************************************
+
+ MCI support
+
+****************************************************************************/
+
+typedef UINT (CALLBACK *YIELDPROC) (UINT uDeviceID, DWORD dwYieldData);
+
+/* MCI function prototypes */
+DWORD WINAPI mciSendCommand (UINT uDeviceID, UINT uMessage,
+ DWORD dwParam1, DWORD dwParam2);
+DWORD WINAPI mciSendString (LPCSTR lpstrCommand,
+ LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback);
+UINT WINAPI mciGetDeviceID (LPCSTR lpstrName);
+UINT WINAPI mciGetDeviceIDFromElementID (DWORD dwElementID,
+ LPCSTR lpstrType);
+BOOL WINAPI mciGetErrorString (DWORD wError, LPSTR lpstrBuffer,
+ UINT uLength);
+BOOL WINAPI mciSetYieldProc (UINT uDeviceID, YIELDPROC fpYieldProc,
+ DWORD dwYieldData);
+
+#if (WINVER >= 0x030a)
+HTASK WINAPI mciGetCreatorTask(UINT uDeviceID);
+YIELDPROC WINAPI mciGetYieldProc (UINT uDeviceID, DWORD FAR* lpdwYieldData);
+#endif /* ifdef WINVER >= 0x030a */
+
+#if (WINVER < 0x030a)
+BOOL WINAPI mciExecute (LPCSTR lpstrCommand);
+#endif /* ifdef WINVER < 0x030a */
+
+/* MCI error return values */
+#define MCIERR_INVALID_DEVICE_ID (MCIERR_BASE + 1)
+#define MCIERR_UNRECOGNIZED_KEYWORD (MCIERR_BASE + 3)
+#define MCIERR_UNRECOGNIZED_COMMAND (MCIERR_BASE + 5)
+#define MCIERR_HARDWARE (MCIERR_BASE + 6)
+#define MCIERR_INVALID_DEVICE_NAME (MCIERR_BASE + 7)
+#define MCIERR_OUT_OF_MEMORY (MCIERR_BASE + 8)
+#define MCIERR_DEVICE_OPEN (MCIERR_BASE + 9)
+#define MCIERR_CANNOT_LOAD_DRIVER (MCIERR_BASE + 10)
+#define MCIERR_MISSING_COMMAND_STRING (MCIERR_BASE + 11)
+#define MCIERR_PARAM_OVERFLOW (MCIERR_BASE + 12)
+#define MCIERR_MISSING_STRING_ARGUMENT (MCIERR_BASE + 13)
+#define MCIERR_BAD_INTEGER (MCIERR_BASE + 14)
+#define MCIERR_PARSER_INTERNAL (MCIERR_BASE + 15)
+#define MCIERR_DRIVER_INTERNAL (MCIERR_BASE + 16)
+#define MCIERR_MISSING_PARAMETER (MCIERR_BASE + 17)
+#define MCIERR_UNSUPPORTED_FUNCTION (MCIERR_BASE + 18)
+#define MCIERR_FILE_NOT_FOUND (MCIERR_BASE + 19)
+#define MCIERR_DEVICE_NOT_READY (MCIERR_BASE + 20)
+#define MCIERR_INTERNAL (MCIERR_BASE + 21)
+#define MCIERR_DRIVER (MCIERR_BASE + 22)
+#define MCIERR_CANNOT_USE_ALL (MCIERR_BASE + 23)
+#define MCIERR_MULTIPLE (MCIERR_BASE + 24)
+#define MCIERR_EXTENSION_NOT_FOUND (MCIERR_BASE + 25)
+#define MCIERR_OUTOFRANGE (MCIERR_BASE + 26)
+#define MCIERR_FLAGS_NOT_COMPATIBLE (MCIERR_BASE + 28)
+#define MCIERR_FILE_NOT_SAVED (MCIERR_BASE + 30)
+#define MCIERR_DEVICE_TYPE_REQUIRED (MCIERR_BASE + 31)
+#define MCIERR_DEVICE_LOCKED (MCIERR_BASE + 32)
+#define MCIERR_DUPLICATE_ALIAS (MCIERR_BASE + 33)
+#define MCIERR_BAD_CONSTANT (MCIERR_BASE + 34)
+#define MCIERR_MUST_USE_SHAREABLE (MCIERR_BASE + 35)
+#define MCIERR_MISSING_DEVICE_NAME (MCIERR_BASE + 36)
+#define MCIERR_BAD_TIME_FORMAT (MCIERR_BASE + 37)
+#define MCIERR_NO_CLOSING_QUOTE (MCIERR_BASE + 38)
+#define MCIERR_DUPLICATE_FLAGS (MCIERR_BASE + 39)
+#define MCIERR_INVALID_FILE (MCIERR_BASE + 40)
+#define MCIERR_NULL_PARAMETER_BLOCK (MCIERR_BASE + 41)
+#define MCIERR_UNNAMED_RESOURCE (MCIERR_BASE + 42)
+#define MCIERR_NEW_REQUIRES_ALIAS (MCIERR_BASE + 43)
+#define MCIERR_NOTIFY_ON_AUTO_OPEN (MCIERR_BASE + 44)
+#define MCIERR_NO_ELEMENT_ALLOWED (MCIERR_BASE + 45)
+#define MCIERR_NONAPPLICABLE_FUNCTION (MCIERR_BASE + 46)
+#define MCIERR_ILLEGAL_FOR_AUTO_OPEN (MCIERR_BASE + 47)
+#define MCIERR_FILENAME_REQUIRED (MCIERR_BASE + 48)
+#define MCIERR_EXTRA_CHARACTERS (MCIERR_BASE + 49)
+#define MCIERR_DEVICE_NOT_INSTALLED (MCIERR_BASE + 50)
+#define MCIERR_GET_CD (MCIERR_BASE + 51)
+#define MCIERR_SET_CD (MCIERR_BASE + 52)
+#define MCIERR_SET_DRIVE (MCIERR_BASE + 53)
+#define MCIERR_DEVICE_LENGTH (MCIERR_BASE + 54)
+#define MCIERR_DEVICE_ORD_LENGTH (MCIERR_BASE + 55)
+#define MCIERR_NO_INTEGER (MCIERR_BASE + 56)
+
+#define MCIERR_WAVE_OUTPUTSINUSE (MCIERR_BASE + 64)
+#define MCIERR_WAVE_SETOUTPUTINUSE (MCIERR_BASE + 65)
+#define MCIERR_WAVE_INPUTSINUSE (MCIERR_BASE + 66)
+#define MCIERR_WAVE_SETINPUTINUSE (MCIERR_BASE + 67)
+#define MCIERR_WAVE_OUTPUTUNSPECIFIED (MCIERR_BASE + 68)
+#define MCIERR_WAVE_INPUTUNSPECIFIED (MCIERR_BASE + 69)
+#define MCIERR_WAVE_OUTPUTSUNSUITABLE (MCIERR_BASE + 70)
+#define MCIERR_WAVE_SETOUTPUTUNSUITABLE (MCIERR_BASE + 71)
+#define MCIERR_WAVE_INPUTSUNSUITABLE (MCIERR_BASE + 72)
+#define MCIERR_WAVE_SETINPUTUNSUITABLE (MCIERR_BASE + 73)
+
+#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80)
+#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81)
+#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82)
+#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83)
+#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84)
+#define MCIERR_SEQ_TIMER (MCIERR_BASE + 85)
+#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86)
+#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87)
+
+#define MCIERR_NO_WINDOW (MCIERR_BASE + 90)
+#define MCIERR_CREATEWINDOW (MCIERR_BASE + 91)
+#define MCIERR_FILE_READ (MCIERR_BASE + 92)
+#define MCIERR_FILE_WRITE (MCIERR_BASE + 93)
+
+/* all custom device driver errors must be >= than this value */
+#define MCIERR_CUSTOM_DRIVER_BASE (MCIERR_BASE + 256)
+
+/* MCI command message identifiers */
+#define MCI_OPEN 0x0803
+#define MCI_CLOSE 0x0804
+#define MCI_ESCAPE 0x0805
+#define MCI_PLAY 0x0806
+#define MCI_SEEK 0x0807
+#define MCI_STOP 0x0808
+#define MCI_PAUSE 0x0809
+#define MCI_INFO 0x080A
+#define MCI_GETDEVCAPS 0x080B
+#define MCI_SPIN 0x080C
+#define MCI_SET 0x080D
+#define MCI_STEP 0x080E
+#define MCI_RECORD 0x080F
+#define MCI_SYSINFO 0x0810
+#define MCI_BREAK 0x0811
+#define MCI_SOUND 0x0812
+#define MCI_SAVE 0x0813
+#define MCI_STATUS 0x0814
+#define MCI_CUE 0x0830
+#define MCI_REALIZE 0x0840
+#define MCI_WINDOW 0x0841
+#define MCI_PUT 0x0842
+#define MCI_WHERE 0x0843
+#define MCI_FREEZE 0x0844
+#define MCI_UNFREEZE 0x0845
+#define MCI_LOAD 0x0850
+#define MCI_CUT 0x0851
+#define MCI_COPY 0x0852
+#define MCI_PASTE 0x0853
+#define MCI_UPDATE 0x0854
+#define MCI_RESUME 0x0855
+#define MCI_DELETE 0x0856
+
+/* all custom MCI command messages must be >= than this value */
+#define MCI_USER_MESSAGES (0x400 + DRV_MCI_FIRST)
+
+
+/* device ID for "all devices" */
+#define MCI_ALL_DEVICE_ID 0xFFFF
+
+/* constants for predefined MCI device types */
+#define MCI_DEVTYPE_VCR (MCI_STRING_OFFSET + 1)
+#define MCI_DEVTYPE_VIDEODISC (MCI_STRING_OFFSET + 2)
+#define MCI_DEVTYPE_OVERLAY (MCI_STRING_OFFSET + 3)
+#define MCI_DEVTYPE_CD_AUDIO (MCI_STRING_OFFSET + 4)
+#define MCI_DEVTYPE_DAT (MCI_STRING_OFFSET + 5)
+#define MCI_DEVTYPE_SCANNER (MCI_STRING_OFFSET + 6)
+#define MCI_DEVTYPE_ANIMATION (MCI_STRING_OFFSET + 7)
+#define MCI_DEVTYPE_DIGITAL_VIDEO (MCI_STRING_OFFSET + 8)
+#define MCI_DEVTYPE_OTHER (MCI_STRING_OFFSET + 9)
+#define MCI_DEVTYPE_WAVEFORM_AUDIO (MCI_STRING_OFFSET + 10)
+#define MCI_DEVTYPE_SEQUENCER (MCI_STRING_OFFSET + 11)
+
+#define MCI_DEVTYPE_FIRST MCI_DEVTYPE_VCR
+#define MCI_DEVTYPE_LAST MCI_DEVTYPE_SEQUENCER
+
+/* return values for 'status mode' command */
+#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET + 12)
+#define MCI_MODE_STOP (MCI_STRING_OFFSET + 13)
+#define MCI_MODE_PLAY (MCI_STRING_OFFSET + 14)
+#define MCI_MODE_RECORD (MCI_STRING_OFFSET + 15)
+#define MCI_MODE_SEEK (MCI_STRING_OFFSET + 16)
+#define MCI_MODE_PAUSE (MCI_STRING_OFFSET + 17)
+#define MCI_MODE_OPEN (MCI_STRING_OFFSET + 18)
+
+/* constants used in 'set time format' and 'status time format' commands */
+#define MCI_FORMAT_MILLISECONDS 0
+#define MCI_FORMAT_HMS 1
+#define MCI_FORMAT_MSF 2
+#define MCI_FORMAT_FRAMES 3
+#define MCI_FORMAT_SMPTE_24 4
+#define MCI_FORMAT_SMPTE_25 5
+#define MCI_FORMAT_SMPTE_30 6
+#define MCI_FORMAT_SMPTE_30DROP 7
+#define MCI_FORMAT_BYTES 8
+#define MCI_FORMAT_SAMPLES 9
+#define MCI_FORMAT_TMSF 10
+
+/* MCI time format conversion macros */
+#define MCI_MSF_MINUTE(msf) ((BYTE)(msf))
+#define MCI_MSF_SECOND(msf) ((BYTE)(((WORD)(msf)) >> 8))
+#define MCI_MSF_FRAME(msf) ((BYTE)((msf)>>16))
+
+#define MCI_MAKE_MSF(m, s, f) ((DWORD)(((BYTE)(m) | \
+ ((WORD)(s)<<8)) | \
+ (((DWORD)(BYTE)(f))<<16)))
+
+#define MCI_TMSF_TRACK(tmsf) ((BYTE)(tmsf))
+#define MCI_TMSF_MINUTE(tmsf) ((BYTE)(((WORD)(tmsf)) >> 8))
+#define MCI_TMSF_SECOND(tmsf) ((BYTE)((tmsf)>>16))
+#define MCI_TMSF_FRAME(tmsf) ((BYTE)((tmsf)>>24))
+
+#define MCI_MAKE_TMSF(t, m, s, f) ((DWORD)(((BYTE)(t) | \
+ ((WORD)(m)<<8)) | \
+ (((DWORD)(BYTE)(s) | \
+ ((WORD)(f)<<8))<<16)))
+
+#define MCI_HMS_HOUR(hms) ((BYTE)(hms))
+#define MCI_HMS_MINUTE(hms) ((BYTE)(((WORD)(hms)) >> 8))
+#define MCI_HMS_SECOND(hms) ((BYTE)((hms)>>16))
+
+#define MCI_MAKE_HMS(h, m, s) ((DWORD)(((BYTE)(h) | \
+ ((WORD)(m)<<8)) | \
+ (((DWORD)(BYTE)(s))<<16)))
+
+
+/* flags for wParam of MM_MCINOTIFY message */
+#define MCI_NOTIFY_SUCCESSFUL 0x0001
+#define MCI_NOTIFY_SUPERSEDED 0x0002
+#define MCI_NOTIFY_ABORTED 0x0004
+#define MCI_NOTIFY_FAILURE 0x0008
+
+
+/* common flags for dwFlags parameter of MCI command messages */
+#define MCI_NOTIFY 0x00000001L
+#define MCI_WAIT 0x00000002L
+#define MCI_FROM 0x00000004L
+#define MCI_TO 0x00000008L
+#define MCI_TRACK 0x00000010L
+
+/* flags for dwFlags parameter of MCI_OPEN command message */
+#define MCI_OPEN_SHAREABLE 0x00000100L
+#define MCI_OPEN_ELEMENT 0x00000200L
+#define MCI_OPEN_ALIAS 0x00000400L
+#define MCI_OPEN_ELEMENT_ID 0x00000800L
+#define MCI_OPEN_TYPE_ID 0x00001000L
+#define MCI_OPEN_TYPE 0x00002000L
+
+/* flags for dwFlags parameter of MCI_SEEK command message */
+#define MCI_SEEK_TO_START 0x00000100L
+#define MCI_SEEK_TO_END 0x00000200L
+
+/* flags for dwFlags parameter of MCI_STATUS command message */
+#define MCI_STATUS_ITEM 0x00000100L
+#define MCI_STATUS_START 0x00000200L
+
+/* flags for dwItem field of the MCI_STATUS_PARMS parameter block */
+#define MCI_STATUS_LENGTH 0x00000001L
+#define MCI_STATUS_POSITION 0x00000002L
+#define MCI_STATUS_NUMBER_OF_TRACKS 0x00000003L
+#define MCI_STATUS_MODE 0x00000004L
+#define MCI_STATUS_MEDIA_PRESENT 0x00000005L
+#define MCI_STATUS_TIME_FORMAT 0x00000006L
+#define MCI_STATUS_READY 0x00000007L
+#define MCI_STATUS_CURRENT_TRACK 0x00000008L
+
+/* flags for dwFlags parameter of MCI_INFO command message */
+#define MCI_INFO_PRODUCT 0x00000100L
+#define MCI_INFO_FILE 0x00000200L
+
+/* flags for dwFlags parameter of MCI_GETDEVCAPS command message */
+#define MCI_GETDEVCAPS_ITEM 0x00000100L
+
+/* flags for dwItem field of the MCI_GETDEVCAPS_PARMS parameter block */
+#define MCI_GETDEVCAPS_CAN_RECORD 0x00000001L
+#define MCI_GETDEVCAPS_HAS_AUDIO 0x00000002L
+#define MCI_GETDEVCAPS_HAS_VIDEO 0x00000003L
+#define MCI_GETDEVCAPS_DEVICE_TYPE 0x00000004L
+#define MCI_GETDEVCAPS_USES_FILES 0x00000005L
+#define MCI_GETDEVCAPS_COMPOUND_DEVICE 0x00000006L
+#define MCI_GETDEVCAPS_CAN_EJECT 0x00000007L
+#define MCI_GETDEVCAPS_CAN_PLAY 0x00000008L
+#define MCI_GETDEVCAPS_CAN_SAVE 0x00000009L
+
+/* flags for dwFlags parameter of MCI_SYSINFO command message */
+#define MCI_SYSINFO_QUANTITY 0x00000100L
+#define MCI_SYSINFO_OPEN 0x00000200L
+#define MCI_SYSINFO_NAME 0x00000400L
+#define MCI_SYSINFO_INSTALLNAME 0x00000800L
+
+/* flags for dwFlags parameter of MCI_SET command message */
+#define MCI_SET_DOOR_OPEN 0x00000100L
+#define MCI_SET_DOOR_CLOSED 0x00000200L
+#define MCI_SET_TIME_FORMAT 0x00000400L
+#define MCI_SET_AUDIO 0x00000800L
+#define MCI_SET_VIDEO 0x00001000L
+#define MCI_SET_ON 0x00002000L
+#define MCI_SET_OFF 0x00004000L
+
+/* flags for dwAudio field of MCI_SET_PARMS or MCI_SEQ_SET_PARMS */
+#define MCI_SET_AUDIO_ALL 0x00000000L
+#define MCI_SET_AUDIO_LEFT 0x00000001L
+#define MCI_SET_AUDIO_RIGHT 0x00000002L
+
+/* flags for dwFlags parameter of MCI_BREAK command message */
+#define MCI_BREAK_KEY 0x00000100L
+#define MCI_BREAK_HWND 0x00000200L
+#define MCI_BREAK_OFF 0x00000400L
+
+/* flags for dwFlags parameter of MCI_RECORD command message */
+#define MCI_RECORD_INSERT 0x00000100L
+#define MCI_RECORD_OVERWRITE 0x00000200L
+
+/* flags for dwFlags parameter of MCI_SOUND command message */
+#define MCI_SOUND_NAME 0x00000100L
+
+/* flags for dwFlags parameter of MCI_SAVE command message */
+#define MCI_SAVE_FILE 0x00000100L
+
+/* flags for dwFlags parameter of MCI_LOAD command message */
+#define MCI_LOAD_FILE 0x00000100L
+
+/* generic parameter block for MCI command messages with no special parameters */
+typedef struct tagMCI_GENERIC_PARMS {
+ DWORD dwCallback;
+} MCI_GENERIC_PARMS;
+typedef MCI_GENERIC_PARMS FAR *LPMCI_GENERIC_PARMS;
+
+/* parameter block for MCI_OPEN command message */
+typedef struct tagMCI_OPEN_PARMS {
+ DWORD dwCallback;
+ UINT wDeviceID;
+ UINT wReserved0;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+} MCI_OPEN_PARMS;
+typedef MCI_OPEN_PARMS FAR *LPMCI_OPEN_PARMS;
+
+/* parameter block for MCI_PLAY command message */
+typedef struct tagMCI_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_PLAY_PARMS;
+typedef MCI_PLAY_PARMS FAR *LPMCI_PLAY_PARMS;
+
+/* parameter block for MCI_SEEK command message */
+typedef struct tagMCI_SEEK_PARMS {
+ DWORD dwCallback;
+ DWORD dwTo;
+} MCI_SEEK_PARMS;
+typedef MCI_SEEK_PARMS FAR *LPMCI_SEEK_PARMS;
+
+/* parameter block for MCI_STATUS command message */
+typedef struct tagMCI_STATUS_PARMS {
+ DWORD dwCallback;
+ DWORD dwReturn;
+ DWORD dwItem;
+ DWORD dwTrack;
+} MCI_STATUS_PARMS;
+typedef MCI_STATUS_PARMS FAR * LPMCI_STATUS_PARMS;
+
+/* parameter block for MCI_INFO command message */
+typedef struct tagMCI_INFO_PARMS {
+ DWORD dwCallback;
+ LPSTR lpstrReturn;
+ DWORD dwRetSize;
+} MCI_INFO_PARMS;
+typedef MCI_INFO_PARMS FAR * LPMCI_INFO_PARMS;
+
+/* parameter block for MCI_GETDEVCAPS command message */
+typedef struct tagMCI_GETDEVCAPS_PARMS {
+ DWORD dwCallback;
+ DWORD dwReturn;
+ DWORD dwItem;
+} MCI_GETDEVCAPS_PARMS;
+typedef MCI_GETDEVCAPS_PARMS FAR * LPMCI_GETDEVCAPS_PARMS;
+
+/* parameter block for MCI_SYSINFO command message */
+typedef struct tagMCI_SYSINFO_PARMS {
+ DWORD dwCallback;
+ LPSTR lpstrReturn;
+ DWORD dwRetSize;
+ DWORD dwNumber;
+ UINT wDeviceType;
+ UINT wReserved0;
+} MCI_SYSINFO_PARMS;
+typedef MCI_SYSINFO_PARMS FAR * LPMCI_SYSINFO_PARMS;
+
+/* parameter block for MCI_SET command message */
+typedef struct tagMCI_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+} MCI_SET_PARMS;
+typedef MCI_SET_PARMS FAR *LPMCI_SET_PARMS;
+
+/* parameter block for MCI_BREAK command message */
+typedef struct tagMCI_BREAK_PARMS {
+ DWORD dwCallback;
+ int nVirtKey;
+ UINT wReserved0;
+ HWND hwndBreak;
+ UINT wReserved1;
+} MCI_BREAK_PARMS;
+typedef MCI_BREAK_PARMS FAR * LPMCI_BREAK_PARMS;
+
+/* parameter block for MCI_SOUND command message */
+typedef struct tagMCI_SOUND_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpstrSoundName;
+} MCI_SOUND_PARMS;
+typedef MCI_SOUND_PARMS FAR * LPMCI_SOUND_PARMS;
+
+/* parameter block for MCI_SAVE command message */
+typedef struct tagMCI_SAVE_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+} MCI_SAVE_PARMS;
+typedef MCI_SAVE_PARMS FAR * LPMCI_SAVE_PARMS;
+
+/* parameter block for MCI_LOAD command message */
+typedef struct tagMCI_LOAD_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+} MCI_LOAD_PARMS;
+typedef MCI_LOAD_PARMS FAR * LPMCI_LOAD_PARMS;
+
+/* parameter block for MCI_RECORD command message */
+typedef struct tagMCI_RECORD_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_RECORD_PARMS;
+typedef MCI_RECORD_PARMS FAR *LPMCI_RECORD_PARMS;
+
+
+/* MCI extensions for videodisc devices */
+
+/* flag for dwReturn field of MCI_STATUS_PARMS */
+/* MCI_STATUS command, (dwItem == MCI_STATUS_MODE) */
+#define MCI_VD_MODE_PARK (MCI_VD_OFFSET + 1)
+
+/* flag for dwReturn field of MCI_STATUS_PARMS */
+/* MCI_STATUS command, (dwItem == MCI_VD_STATUS_MEDIA_TYPE) */
+#define MCI_VD_MEDIA_CLV (MCI_VD_OFFSET + 2)
+#define MCI_VD_MEDIA_CAV (MCI_VD_OFFSET + 3)
+#define MCI_VD_MEDIA_OTHER (MCI_VD_OFFSET + 4)
+
+#define MCI_VD_FORMAT_TRACK 0x4001
+
+/* flags for dwFlags parameter of MCI_PLAY command message */
+#define MCI_VD_PLAY_REVERSE 0x00010000L
+#define MCI_VD_PLAY_FAST 0x00020000L
+#define MCI_VD_PLAY_SPEED 0x00040000L
+#define MCI_VD_PLAY_SCAN 0x00080000L
+#define MCI_VD_PLAY_SLOW 0x00100000L
+
+/* flag for dwFlags parameter of MCI_SEEK command message */
+#define MCI_VD_SEEK_REVERSE 0x00010000L
+
+/* flags for dwItem field of MCI_STATUS_PARMS parameter block */
+#define MCI_VD_STATUS_SPEED 0x00004002L
+#define MCI_VD_STATUS_FORWARD 0x00004003L
+#define MCI_VD_STATUS_MEDIA_TYPE 0x00004004L
+#define MCI_VD_STATUS_SIDE 0x00004005L
+#define MCI_VD_STATUS_DISC_SIZE 0x00004006L
+
+/* flags for dwFlags parameter of MCI_GETDEVCAPS command message */
+#define MCI_VD_GETDEVCAPS_CLV 0x00010000L
+#define MCI_VD_GETDEVCAPS_CAV 0x00020000L
+
+#define MCI_VD_SPIN_UP 0x00010000L
+#define MCI_VD_SPIN_DOWN 0x00020000L
+
+/* flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block */
+#define MCI_VD_GETDEVCAPS_CAN_REVERSE 0x00004002L
+#define MCI_VD_GETDEVCAPS_FAST_RATE 0x00004003L
+#define MCI_VD_GETDEVCAPS_SLOW_RATE 0x00004004L
+#define MCI_VD_GETDEVCAPS_NORMAL_RATE 0x00004005L
+
+/* flags for the dwFlags parameter of MCI_STEP command message */
+#define MCI_VD_STEP_FRAMES 0x00010000L
+#define MCI_VD_STEP_REVERSE 0x00020000L
+
+/* flag for the MCI_ESCAPE command message */
+#define MCI_VD_ESCAPE_STRING 0x00000100L
+
+/* parameter block for MCI_PLAY command message */
+typedef struct tagMCI_VD_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+ DWORD dwSpeed;
+ } MCI_VD_PLAY_PARMS;
+typedef MCI_VD_PLAY_PARMS FAR *LPMCI_VD_PLAY_PARMS;
+
+/* parameter block for MCI_STEP command message */
+typedef struct tagMCI_VD_STEP_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrames;
+} MCI_VD_STEP_PARMS;
+typedef MCI_VD_STEP_PARMS FAR *LPMCI_VD_STEP_PARMS;
+
+/* parameter block for MCI_ESCAPE command message */
+typedef struct tagMCI_VD_ESCAPE_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpstrCommand;
+} MCI_VD_ESCAPE_PARMS;
+typedef MCI_VD_ESCAPE_PARMS FAR *LPMCI_VD_ESCAPE_PARMS;
+
+
+/* MCI extensions for waveform audio devices */
+
+/* flags for the dwFlags parameter of MCI_OPEN command message */
+#define MCI_WAVE_OPEN_BUFFER 0x00010000L
+
+/* flags for the dwFlags parameter of MCI_SET command message */
+#define MCI_WAVE_SET_FORMATTAG 0x00010000L
+#define MCI_WAVE_SET_CHANNELS 0x00020000L
+#define MCI_WAVE_SET_SAMPLESPERSEC 0x00040000L
+#define MCI_WAVE_SET_AVGBYTESPERSEC 0x00080000L
+#define MCI_WAVE_SET_BLOCKALIGN 0x00100000L
+#define MCI_WAVE_SET_BITSPERSAMPLE 0x00200000L
+
+/* flags for the dwFlags parameter of MCI_STATUS, MCI_SET command messages */
+#define MCI_WAVE_INPUT 0x00400000L
+#define MCI_WAVE_OUTPUT 0x00800000L
+
+/* flags for the dwItem field of MCI_STATUS_PARMS parameter block */
+#define MCI_WAVE_STATUS_FORMATTAG 0x00004001L
+#define MCI_WAVE_STATUS_CHANNELS 0x00004002L
+#define MCI_WAVE_STATUS_SAMPLESPERSEC 0x00004003L
+#define MCI_WAVE_STATUS_AVGBYTESPERSEC 0x00004004L
+#define MCI_WAVE_STATUS_BLOCKALIGN 0x00004005L
+#define MCI_WAVE_STATUS_BITSPERSAMPLE 0x00004006L
+#define MCI_WAVE_STATUS_LEVEL 0x00004007L
+
+/* flags for the dwFlags parameter of MCI_SET command message */
+#define MCI_WAVE_SET_ANYINPUT 0x04000000L
+#define MCI_WAVE_SET_ANYOUTPUT 0x08000000L
+
+/* flags for the dwFlags parameter of MCI_GETDEVCAPS command message */
+#define MCI_WAVE_GETDEVCAPS_INPUTS 0x00004001L
+#define MCI_WAVE_GETDEVCAPS_OUTPUTS 0x00004002L
+
+/* parameter block for MCI_OPEN command message */
+typedef struct tagMCI_WAVE_OPEN_PARMS {
+ DWORD dwCallback;
+ UINT wDeviceID;
+ UINT wReserved0;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwBufferSeconds;
+} MCI_WAVE_OPEN_PARMS;
+typedef MCI_WAVE_OPEN_PARMS FAR *LPMCI_WAVE_OPEN_PARMS;
+
+/* parameter block for MCI_DELETE command message */
+typedef struct tagMCI_WAVE_DELETE_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_WAVE_DELETE_PARMS;
+typedef MCI_WAVE_DELETE_PARMS FAR *LPMCI_WAVE_DELETE_PARMS;
+
+/* parameter block for MCI_SET command message */
+typedef struct tagMCI_WAVE_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+ UINT wInput;
+ UINT wReserved0;
+ UINT wOutput;
+ UINT wReserved1;
+ UINT wFormatTag;
+ UINT wReserved2;
+ UINT nChannels;
+ UINT wReserved3;
+ DWORD nSamplesPerSec;
+ DWORD nAvgBytesPerSec;
+ UINT nBlockAlign;
+ UINT wReserved4;
+ UINT wBitsPerSample;
+ UINT wReserved5;
+} MCI_WAVE_SET_PARMS;
+typedef MCI_WAVE_SET_PARMS FAR * LPMCI_WAVE_SET_PARMS;
+
+
+/* MCI extensions for MIDI sequencer devices */
+
+/* flags for the dwReturn field of MCI_STATUS_PARMS parameter block */
+/* MCI_STATUS command, (dwItem == MCI_SEQ_STATUS_DIVTYPE) */
+#define MCI_SEQ_DIV_PPQN (0 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_24 (1 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_25 (2 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_30DROP (3 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_30 (4 + MCI_SEQ_OFFSET)
+
+/* flags for the dwMaster field of MCI_SEQ_SET_PARMS parameter block */
+/* MCI_SET command, (dwFlags == MCI_SEQ_SET_MASTER) */
+#define MCI_SEQ_FORMAT_SONGPTR 0x4001
+#define MCI_SEQ_FILE 0x4002
+#define MCI_SEQ_MIDI 0x4003
+#define MCI_SEQ_SMPTE 0x4004
+#define MCI_SEQ_NONE 65533
+
+/* flags for the dwItem field of MCI_STATUS_PARMS parameter block */
+#define MCI_SEQ_STATUS_TEMPO 0x00004002L
+#define MCI_SEQ_STATUS_PORT 0x00004003L
+#define MCI_SEQ_STATUS_SLAVE 0x00004007L
+#define MCI_SEQ_STATUS_MASTER 0x00004008L
+#define MCI_SEQ_STATUS_OFFSET 0x00004009L
+#define MCI_SEQ_STATUS_DIVTYPE 0x0000400AL
+
+/* flags for the dwFlags parameter of MCI_SET command message */
+#define MCI_SEQ_SET_TEMPO 0x00010000L
+#define MCI_SEQ_SET_PORT 0x00020000L
+#define MCI_SEQ_SET_SLAVE 0x00040000L
+#define MCI_SEQ_SET_MASTER 0x00080000L
+#define MCI_SEQ_SET_OFFSET 0x01000000L
+
+/* parameter block for MCI_SET command message */
+typedef struct tagMCI_SEQ_SET_PARMS {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+ DWORD dwTempo;
+ DWORD dwPort;
+ DWORD dwSlave;
+ DWORD dwMaster;
+ DWORD dwOffset;
+} MCI_SEQ_SET_PARMS;
+typedef MCI_SEQ_SET_PARMS FAR * LPMCI_SEQ_SET_PARMS;
+
+
+/* MCI extensions for animation devices */
+
+/* flags for dwFlags parameter of MCI_OPEN command message */
+#define MCI_ANIM_OPEN_WS 0x00010000L
+#define MCI_ANIM_OPEN_PARENT 0x00020000L
+#define MCI_ANIM_OPEN_NOSTATIC 0x00040000L
+
+/* flags for dwFlags parameter of MCI_PLAY command message */
+#define MCI_ANIM_PLAY_SPEED 0x00010000L
+#define MCI_ANIM_PLAY_REVERSE 0x00020000L
+#define MCI_ANIM_PLAY_FAST 0x00040000L
+#define MCI_ANIM_PLAY_SLOW 0x00080000L
+#define MCI_ANIM_PLAY_SCAN 0x00100000L
+
+/* flags for dwFlags parameter of MCI_STEP command message */
+#define MCI_ANIM_STEP_REVERSE 0x00010000L
+#define MCI_ANIM_STEP_FRAMES 0x00020000L
+
+/* flags for dwItem field of MCI_STATUS_PARMS parameter block */
+#define MCI_ANIM_STATUS_SPEED 0x00004001L
+#define MCI_ANIM_STATUS_FORWARD 0x00004002L
+#define MCI_ANIM_STATUS_HWND 0x00004003L
+#define MCI_ANIM_STATUS_HPAL 0x00004004L
+#define MCI_ANIM_STATUS_STRETCH 0x00004005L
+
+/* flags for the dwFlags parameter of MCI_INFO command message */
+#define MCI_ANIM_INFO_TEXT 0x00010000L
+
+/* flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block */
+#define MCI_ANIM_GETDEVCAPS_CAN_REVERSE 0x00004001L
+#define MCI_ANIM_GETDEVCAPS_FAST_RATE 0x00004002L
+#define MCI_ANIM_GETDEVCAPS_SLOW_RATE 0x00004003L
+#define MCI_ANIM_GETDEVCAPS_NORMAL_RATE 0x00004004L
+#define MCI_ANIM_GETDEVCAPS_PALETTES 0x00004006L
+#define MCI_ANIM_GETDEVCAPS_CAN_STRETCH 0x00004007L
+#define MCI_ANIM_GETDEVCAPS_MAX_WINDOWS 0x00004008L
+
+/* flags for the MCI_REALIZE command message */
+#define MCI_ANIM_REALIZE_NORM 0x00010000L
+#define MCI_ANIM_REALIZE_BKGD 0x00020000L
+
+/* flags for dwFlags parameter of MCI_WINDOW command message */
+#define MCI_ANIM_WINDOW_HWND 0x00010000L
+#define MCI_ANIM_WINDOW_STATE 0x00040000L
+#define MCI_ANIM_WINDOW_TEXT 0x00080000L
+#define MCI_ANIM_WINDOW_ENABLE_STRETCH 0x00100000L
+#define MCI_ANIM_WINDOW_DISABLE_STRETCH 0x00200000L
+
+/* flags for hWnd field of MCI_ANIM_WINDOW_PARMS parameter block */
+/* MCI_WINDOW command message, (dwFlags == MCI_ANIM_WINDOW_HWND) */
+#define MCI_ANIM_WINDOW_DEFAULT 0x00000000L
+
+/* flags for dwFlags parameter of MCI_PUT command message */
+#define MCI_ANIM_RECT 0x00010000L
+#define MCI_ANIM_PUT_SOURCE 0x00020000L
+#define MCI_ANIM_PUT_DESTINATION 0x00040000L
+
+/* flags for dwFlags parameter of MCI_WHERE command message */
+#define MCI_ANIM_WHERE_SOURCE 0x00020000L
+#define MCI_ANIM_WHERE_DESTINATION 0x00040000L
+
+/* flags for dwFlags parameter of MCI_UPDATE command message */
+#define MCI_ANIM_UPDATE_HDC 0x00020000L
+
+/* parameter block for MCI_OPEN command message */
+typedef struct tagMCI_ANIM_OPEN_PARMS {
+ DWORD dwCallback;
+ UINT wDeviceID;
+ UINT wReserved0;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwStyle;
+ HWND hWndParent;
+ UINT wReserved1;
+} MCI_ANIM_OPEN_PARMS;
+typedef MCI_ANIM_OPEN_PARMS FAR *LPMCI_ANIM_OPEN_PARMS;
+
+/* parameter block for MCI_PLAY command message */
+typedef struct tagMCI_ANIM_PLAY_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+ DWORD dwSpeed;
+} MCI_ANIM_PLAY_PARMS;
+typedef MCI_ANIM_PLAY_PARMS FAR *LPMCI_ANIM_PLAY_PARMS;
+
+/* parameter block for MCI_STEP command message */
+typedef struct tagMCI_ANIM_STEP_PARMS {
+ DWORD dwCallback;
+ DWORD dwFrames;
+} MCI_ANIM_STEP_PARMS;
+typedef MCI_ANIM_STEP_PARMS FAR *LPMCI_ANIM_STEP_PARMS;
+
+/* parameter block for MCI_WINDOW command message */
+typedef struct tagMCI_ANIM_WINDOW_PARMS {
+ DWORD dwCallback;
+ HWND hWnd;
+ UINT wReserved1;
+ UINT nCmdShow;
+ UINT wReserved2;
+ LPCSTR lpstrText;
+} MCI_ANIM_WINDOW_PARMS;
+typedef MCI_ANIM_WINDOW_PARMS FAR * LPMCI_ANIM_WINDOW_PARMS;
+
+/* parameter block for MCI_PUT, MCI_UPDATE, MCI_WHERE command messages */
+typedef struct tagMCI_ANIM_RECT_PARMS {
+ DWORD dwCallback;
+#ifdef MCI_USE_OFFEXT
+ POINT ptOffset;
+ POINT ptExtent;
+#else /* ifdef MCI_USE_OFFEXT */
+ RECT rc;
+#endif /* ifdef MCI_USE_OFFEXT */
+} MCI_ANIM_RECT_PARMS;
+typedef MCI_ANIM_RECT_PARMS FAR * LPMCI_ANIM_RECT_PARMS;
+
+/* parameter block for MCI_UPDATE PARMS */
+typedef struct tagMCI_ANIM_UPDATE_PARMS {
+ DWORD dwCallback;
+ RECT rc;
+ HDC hDC;
+} MCI_ANIM_UPDATE_PARMS;
+typedef MCI_ANIM_UPDATE_PARMS FAR * LPMCI_ANIM_UPDATE_PARMS;
+
+
+/* MCI extensions for video overlay devices */
+
+/* flags for dwFlags parameter of MCI_OPEN command message */
+#define MCI_OVLY_OPEN_WS 0x00010000L
+#define MCI_OVLY_OPEN_PARENT 0x00020000L
+
+/* flags for dwFlags parameter of MCI_STATUS command message */
+#define MCI_OVLY_STATUS_HWND 0x00004001L
+#define MCI_OVLY_STATUS_STRETCH 0x00004002L
+
+/* flags for dwFlags parameter of MCI_INFO command message */
+#define MCI_OVLY_INFO_TEXT 0x00010000L
+
+/* flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block */
+#define MCI_OVLY_GETDEVCAPS_CAN_STRETCH 0x00004001L
+#define MCI_OVLY_GETDEVCAPS_CAN_FREEZE 0x00004002L
+#define MCI_OVLY_GETDEVCAPS_MAX_WINDOWS 0x00004003L
+
+/* flags for dwFlags parameter of MCI_WINDOW command message */
+#define MCI_OVLY_WINDOW_HWND 0x00010000L
+#define MCI_OVLY_WINDOW_STATE 0x00040000L
+#define MCI_OVLY_WINDOW_TEXT 0x00080000L
+#define MCI_OVLY_WINDOW_ENABLE_STRETCH 0x00100000L
+#define MCI_OVLY_WINDOW_DISABLE_STRETCH 0x00200000L
+
+/* flags for hWnd parameter of MCI_OVLY_WINDOW_PARMS parameter block */
+#define MCI_OVLY_WINDOW_DEFAULT 0x00000000L
+
+/* flags for dwFlags parameter of MCI_PUT command message */
+#define MCI_OVLY_RECT 0x00010000L
+#define MCI_OVLY_PUT_SOURCE 0x00020000L
+#define MCI_OVLY_PUT_DESTINATION 0x00040000L
+#define MCI_OVLY_PUT_FRAME 0x00080000L
+#define MCI_OVLY_PUT_VIDEO 0x00100000L
+
+/* flags for dwFlags parameter of MCI_WHERE command message */
+#define MCI_OVLY_WHERE_SOURCE 0x00020000L
+#define MCI_OVLY_WHERE_DESTINATION 0x00040000L
+#define MCI_OVLY_WHERE_FRAME 0x00080000L
+#define MCI_OVLY_WHERE_VIDEO 0x00100000L
+
+/* parameter block for MCI_OPEN command message */
+typedef struct tagMCI_OVLY_OPEN_PARMS {
+ DWORD dwCallback;
+ UINT wDeviceID;
+ UINT wReserved0;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+ DWORD dwStyle;
+ HWND hWndParent;
+ UINT wReserved1;
+ } MCI_OVLY_OPEN_PARMS;
+typedef MCI_OVLY_OPEN_PARMS FAR *LPMCI_OVLY_OPEN_PARMS;
+
+/* parameter block for MCI_WINDOW command message */
+typedef struct tagMCI_OVLY_WINDOW_PARMS {
+ DWORD dwCallback;
+ HWND hWnd;
+ UINT wReserved1;
+ UINT nCmdShow;
+ UINT wReserved2;
+ LPCSTR lpstrText;
+} MCI_OVLY_WINDOW_PARMS;
+typedef MCI_OVLY_WINDOW_PARMS FAR * LPMCI_OVLY_WINDOW_PARMS;
+
+/* parameter block for MCI_PUT, MCI_UPDATE, and MCI_WHERE command messages */
+typedef struct tagMCI_OVLY_RECT_PARMS {
+ DWORD dwCallback;
+#ifdef MCI_USE_OFFEXT
+ POINT ptOffset;
+ POINT ptExtent;
+#else /* ifdef MCI_USE_OFFEXT */
+ RECT rc;
+#endif /* ifdef MCI_USE_OFFEXT */
+} MCI_OVLY_RECT_PARMS;
+typedef MCI_OVLY_RECT_PARMS FAR * LPMCI_OVLY_RECT_PARMS;
+
+/* parameter block for MCI_SAVE command message */
+typedef struct tagMCI_OVLY_SAVE_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+ RECT rc;
+} MCI_OVLY_SAVE_PARMS;
+typedef MCI_OVLY_SAVE_PARMS FAR * LPMCI_OVLY_SAVE_PARMS;
+
+/* parameter block for MCI_LOAD command message */
+typedef struct tagMCI_OVLY_LOAD_PARMS {
+ DWORD dwCallback;
+ LPCSTR lpfilename;
+ RECT rc;
+} MCI_OVLY_LOAD_PARMS;
+typedef MCI_OVLY_LOAD_PARMS FAR * LPMCI_OVLY_LOAD_PARMS;
+
+#endif /* ifndef MMNOMCI */
+
+/****************************************************************************
+
+ DISPLAY Driver extensions
+
+****************************************************************************/
+
+#ifndef C1_TRANSPARENT
+ #define CAPS1 94 /* other caps */
+ #define C1_TRANSPARENT 0x0001 /* new raster cap */
+ #define NEWTRANSPARENT 3 /* use with SetBkMode() */
+
+ #define QUERYROPSUPPORT 40 /* use to determine ROP support */
+#endif /* ifndef C1_TRANSPARENT */
+
+/****************************************************************************
+
+ DIB Driver extensions
+
+****************************************************************************/
+
+#define SELECTDIB 41 /* DIB.DRV select dib escape */
+#define DIBINDEX(n) MAKELONG((n),0x10FF)
+
+
+/****************************************************************************
+
+ ScreenSaver support
+
+ The current application will receive a syscommand of SC_SCREENSAVE just
+ before the screen saver is invoked. If the app wishes to prevent a
+ screen save, return non-zero value, otherwise call DefWindowProc().
+
+****************************************************************************/
+
+#ifndef SC_SCREENSAVE
+
+ #define SC_SCREENSAVE 0xF140
+
+#endif /* ifndef SC_SCREENSAVE */
+
+#ifdef __cplusplus
+} /* End of extern "C" { */
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif
+
+#endif /* _INC_MMSYSTEM */
diff --git a/private/oleauto/tools/win16/os2/inc/mstest.inc b/private/oleauto/tools/win16/os2/inc/mstest.inc
new file mode 100644
index 000000000..88a383fe4
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/mstest.inc
@@ -0,0 +1,896 @@
+'----------------------------------------------------------------------------
+'
+' MSTEST.INC -- API Declarations for TEST Tools
+'
+' To include the various portions of this file, any combination of the
+' following $DEFINE's must be used in your script prior to $INCLUDEing
+' MSTEST.INC:
+'
+' MSTEST: includes all of MSTEST.INC
+'
+' TESTCTRL: includes all of TESTCTRL
+' W_WINDOW
+' W_MENU
+' W_ERROR
+' W_CONTROL: includes all of the control declares & routines
+' W_BUTTON
+' W_CHECK
+' W_OPTION
+' W_EDIT
+' W_LIST
+' W_COMBO
+'
+' TESTSCRN: includes all of TESTSCRN, Declares & Error codes
+' TESTSCRN_DECL: includes all SCR Declares
+' TESTSCRN_ERRS: includes all SCR Error codes
+'
+' TESTDLGS: includes all of TESTDLGS, Declares & Error codes
+' TESTDLGS_DECL: includes all DLGS Declares
+' TESTDLGS_ERRS: includes all DLGS Error codes
+'
+' TESTEVNT: includes all TESTEVNT Declares
+'
+'
+' NOTE: Including MSTEST.INC without out using any of the above $DEFINE's will
+' include only TESTDRVR.EXE trappable and untrappable error codes,
+' and declares for CRLF, TRUE (-1), FALSE(0), Key values for
+' DoKeys() from TESTEVNT and few routines from TESTCtrl.
+'
+'----------------------------------------------------------------------------
+'
+' Copyright (C) 1991 Microsoft Corporation
+'
+' You have a royalty-free right to use, modify, reproduce and distribute
+' this file (and/or any modified version) in any way you find useful,
+' provided that you agree that Microsoft has no warranty, obligation or
+' liability for its contents. Refer to the Microsoft Windows Programmer's
+' Reference for further information.
+'
+' This file is not garanteed by Microsoft to be error free. Every effort
+' has been made to ensure proper data-types and declarations etc., but no
+' testing has been performed using this include file. Additionally, some
+' API's, though listed, may not be compatible with the TESTDrvr language.
+'
+'----------------------------------------------------------------------------
+'
+' Copyright Microsoft Corporation 1990-1991
+'
+'----------------------------------------------------------------------------
+
+' *********************
+'$IFNDEF MSTEST_INCLUDED
+'$DEFINE MSTEST_INCLUDED
+' *********************
+
+'----------------------------------------------------------------------------
+' Generic Global Variables
+'----------------------------------------------------------------------------
+Global CRLF As String
+CRLF = Chr$(13) + Chr$(10)
+
+Const TRUE = -1
+Const FALSE = 0
+
+
+'----------------------------------------------------------------------------
+' Unrecoverable TESTDRVR error codes
+'----------------------------------------------------------------------------
+Const ERR_STACK_OVERFLOW = 0
+Const ERR_STACK_UNDERFLOW = 1
+Const ERR_OUT_OF_STRING_SPACE = 2
+Const ERR_CANT_LOAD_TESTVIEW_DLL = 3
+Const ERR_OUT_OF_MEMORY = 4
+
+
+'----------------------------------------------------------------------------
+' Recoverable TESTDRVR error codes
+'----------------------------------------------------------------------------
+Const ERR_GOSUB_STACK_OVERFLOW = 5
+Const ERR_RETURN_WITHOUT_GOSUB = 6
+Const ERR_BAD_FILE_NUMBER = 7
+Const ERR_FILE_IO = 8
+Const ERR_RUN_CMD_TOO_LONG = 9
+Const ERR_SHELL_CMD_TOO_LONG = 10
+Const ERR_SETFILE = 11
+Const ERR_FILE_NUMBER_IN_USE = 12
+Const ERR_CANT_OPEN_FILE = 13
+Const ERR_ILLEGAL_FUNCTION_CALL = 14
+Const ERR_INVALID_PATH = 15
+Const ERR_INVALID_DRIVE = 16
+Const ERR_NO_CURRENT_WORKING_DIR = 17
+Const ERR_BAD_RUN_CMD = 18
+Const ERR_DIVISION_BY_ZERO = 19
+Const ERR_CANT_LOAD_DLL = 20
+Const ERR_PROC_NOT_FOUND_IN_DLL = 21
+Const ERR_CANNOT_RESUME = 22
+Const ERR_MEM_ALLOC = 23
+Const ERR_INVALID_POINTER = 24
+Const ERR_INVALID_ALLOC_SIZE = 25
+Const ERR_NULL_PIONTER_REF = 26
+Const ERR_SUBSCRIPT_RANGE = 27
+Const ERR_INPUT_PAST_EOF = 28
+
+'----------------------------------------------------------------------------
+' Key contants used with WKey, PlayKeys, & PlayKeyshWnd
+'----------------------------------------------------------------------------
+Const K_ENTER = "{ENTER}"
+Const K_ESC = "{ESC}"
+Const K_UP = "{UP}"
+Const K_DOWN = "{DOWN}"
+Const K_LEFT = "{LEFT}"
+Const K_RIGHT = "{RIGHT}"
+Const K_END = "{END}"
+Const K_PGUP = "{PGUP}"
+Const K_PGDN = "{PGDN}"
+Const K_INSERT = "{INSERT}"
+Const K_DELETE = "{DELETE}"
+Const K_HOME = "{HOME}"
+Const K_TAB = "{TAB}"
+Const K_BS = "{BS}"
+Const K_F1 = "{F1}"
+Const K_F2 = "{F2}"
+Const K_F3 = "{F3}"
+Const K_F4 = "{F4}"
+Const K_F5 = "{F5}"
+Const K_F6 = "{F6}"
+Const K_F7 = "{F7}"
+Const K_F8 = "{F8}"
+Const K_F9 = "{F9}"
+Const K_F10 = "{F10}"
+Const K_F11 = "{F11}"
+Const K_F12 = "{F12}"
+Const K_F13 = "{F13}"
+Const K_F14 = "{F14}"
+Const K_F15 = "{F15}"
+Const K_F16 = "{F16}"
+Const K_SHIFT = "+"
+Const K_CTRL = "^"
+Const K_ALT = "%"
+
+
+'----------------------------------------------------------------------------
+' Routines, types and Constants from TESTCTRL.DLL that are always included.
+'----------------------------------------------------------------------------
+Const MAX_CAPTION = 128
+
+Type INFO
+ hWnd As Integer
+ hWndParent As Integer
+ szClass As String * MAX_CAPTION
+ szCaption As String * MAX_CAPTION
+ szParentClass As String * MAX_CAPTION
+ szParentCaption As String * MAX_CAPTION
+ szModuleName As String * MAX_CAPTION
+ lStyle As Long
+ fChild As Integer
+ wID As Integer
+ left As Integer
+ top As Integer
+ right As Integer
+ bottom As Integer
+ width As Integer
+ height As Integer
+End Type
+
+Declare Function WGetActWnd Lib "TESTCtrl.dll" (hWnd%) As Integer
+Declare Function WFndWnd Lib "TESTCtrl.dll" (lpszCaption$, wFlags%) As Integer
+Declare Function WFndWndC Lib "TESTCtrl.dll" (lpszText$, lpszClass$, wFlags%) As Integer
+Declare Sub WDisplayInfo Lib "TESTCtrl.dll" (hWnd%, wDisplay%)
+Declare Sub WGetInfo Lib "TESTCtrl.dll" (hWnd%, lpInfo As INFO)
+
+Const FW_DEFAULT = &h0000
+Const FW_ACTIVE = &h0008
+Const FW_ALL = &h0000
+Const FW_CASE = &h0004
+Const FW_NOCASE = &h0000
+Const FW_PART = &h0002
+Const FW_FULL = &h0000
+Const FW_FOCUS = &h0001
+Const FW_NOFOCUS = &h0000
+
+Const DI_DIALOG = 1
+Const DI_DEBUG = 2
+Const DI_BOTH = 3
+
+
+Declare Sub DoKeys Lib "TESTEvnt.Dll" (lpStr$)
+
+' *********************
+'$ENDIF
+' *********************
+
+'----------------------------------------------------------------------------
+' DEFINE's that control the inclusion of the remainder of MSTEST.INC
+'----------------------------------------------------------------------------
+'$IFDEF MSTEST
+ '$DEFINE TESTCTRL
+ '$DEFINE TESTSCRN
+ '$DEFINE TESTDLGS
+ '$DEFINE TESTEVNT
+'$ENDIF
+
+'$IFDEF TESTCTRL
+ '$DEFINE W_WINDOW
+ '$DEFINE W_MENU
+ '$DEFINE W_ERROR
+ '$DEFINE W_CONTROL
+'$ENDIF
+
+'$IFDEF W_CONTROL
+ '$DEFINE W_BUTTON
+ '$DEFINE W_CHECK
+ '$DEFINE W_OPTION
+ '$DEFINE W_EDIT
+ '$DEFINE W_LIST
+ '$DEFINE W_COMBO
+'$ENDIF
+
+'$IFDEF TESTSCRN
+ '$DEFINE TESTSCRN_DECL
+ '$DEFINE TESTSCRN_ERRS
+'$ENDIF
+
+'$IFDEF TESTDLGS
+ '$DEFINE TESTDLGS_DECL
+ '$DEFINE TESTDLGS_ERRS
+'$ENDIF
+
+'$IFDEF W_BUTTON OR W_CHECK OR W_OPTION OR W_EDIT OR W_LIST OR W_COMBO
+ '$DEFINE W_A_CONTROL
+'$ENDIF
+
+
+' *********************
+'$IFDEF TESTEVNT AND NOT TESTEVNT_INCLUDED
+' *********************
+
+'----------------------------------------------------------------------------
+' TESTEvnt.DLL:
+' Function declarations for use with TESTEvnt
+'----------------------------------------------------------------------------
+'Declare Sub DoKeys Lib "TESTEvnt.Dll" (lpStr$)
+Declare Sub QueKeys Lib "TESTEvnt.Dll" (lpStr$)
+Declare Sub QueKeyDn Lib "TESTEvnt.Dll" (lpStr$)
+Declare Sub QueKeyUp Lib "TESTEvnt.Dll" (lpStr$)
+Declare Sub QueSetSpeed Lib "TESTEvnt.Dll" (ms%)
+Declare Sub QueFlush Lib "TESTEvnt.Dll" (fRestoreKeyState%)
+Declare Sub QueEmpty Lib "TESTEvnt.Dll" ()
+Declare Sub QueMouseMove Lib "TESTEvnt.Dll" (x%, y%)
+Declare Sub QueMouseDn Lib "TESTEvnt.Dll" (iBtn%, x%, y%)
+Declare Sub QueMouseUp Lib "TESTEvnt.Dll" (iBtn%, x%, y%)
+Declare Sub QueMouseClick Lib "TESTEvnt.Dll" (iBtn%, x%, y%)
+Declare Sub QueMouseDblClk Lib "TESTEvnt.Dll" (iBtn%, x%, y%)
+Declare Sub QueMouseDblDn Lib "TESTEvnt.Dll" (iBtn%, x%, y%)
+Declare Sub QueSetFocus Lib "TESTEvnt.Dll" (hwnd%)
+Declare Sub QueSetRelativeWindow Lib "TESTEvnt.Dll" (hwnd%)
+
+Const VK_LBUTTON = 1
+Const VK_RBUTTON = 2
+Const VK_MBUTTON = 4
+
+' *********************
+'$DEFINE TESTEVNT_INCLUDED
+'$ENDIF
+'$IFDEF TESTSCRN_DECL AND NOT TESTSCRN_DECL_INCLUDED
+' *********************
+
+
+'----------------------------------------------------------------------------
+' TESTScrn.DLL:
+' Type, Const, and Function declarations for use with TESTScrn
+'----------------------------------------------------------------------------
+Type wRect
+ x1 As Integer
+ y1 As Integer
+ x2 As Integer
+ y2 As Integer
+End Type
+
+Const SCRNAPPEND = 0
+Const SCRNREPLACE = 1
+Const SCRNINSERT = 2
+
+'*** TESTSCRN.DLL Routines
+'
+Declare Function fCompFiles Lib "TESTScrn.DLL" (lpszFileName1$, Scr1%, lpszFileName2$, Scr2%, CompareType%) As Integer
+Declare Function fCompScreen Lib "TESTScrn.DLL" (lpszFileName$, lpRect As wRect, Scr1%, Hide%, Flag%) As Integer
+Declare Function fCompWindow Lib "TESTScrn.DLL" (lpszFileName$, hWnd%, Scr1%, Hide%, Flag%) As Integer
+Declare Function fDelScreen Lib "TESTScrn.DLL" (lpszFileName$, Scr%) As Integer
+Declare Function fDumpFileToClip Lib "TESTScrn.DLL" (lpszFileName$, Scr%) As Integer
+Declare Function fDumpScreen Lib "TESTScrn.DLL" (lpszFileName$, lpRect As wRect, Action%, Scr1%, Flag%) As Integer
+Declare Function fDumpSrnToClip Lib "TESTScrn.DLL" (lpRect As wRect, Hide%) As Integer
+Declare Function fDumpWindow Lib "TESTScrn.DLL" (lpszFileName$, wHnd%, Action%, Scr1%, Flag%) As Integer
+Declare Function fDumpWndToClip Lib "TESTScrn.DLL" (hWnd%, Hide%) As Integer
+Declare Function fFileInfo Lib "TESTScrn.DLL" (lpszFileName$, Rectangle&, VideoMode%, ScreenNum%) As Integer
+Declare Function fGetDLLVersion Lib "TESTScrn.DLL" (lpszFileName$) As Integer
+Declare Function fGetMaxScreen Lib "TESTScrn.DLL" (lpszFileName$) As Integer
+Declare Function fGetOS Lib "TESTScrn.DLL" (lpszFileName$) As Integer
+Declare Function fSaveFileToDIB Lib "TESTScrn.DLL" (lpszFileName1$, Scr%, lpszFileName2$) As Integer
+Declare Function fSaveSrnToDIB Lib "TESTScrn.DLL" (lpszFileName$, lpRect As wRect, Hide%) As Integer
+Declare Function fSaveWndToDIB Lib "TESTScrn.DLL" (lpszFileName$, hWnd%, Hide%) As Integer
+Declare Function fViewScreen Lib "TESTScrn.DLL" (lpszFileName$, hWnd%, Scr1%, Action%) As Integer
+
+
+' *********************
+'$DEFINE TESTSCRN_DECL_INCLUDED
+'$ENDIF
+'$IFDEF TESTSCRN_ERRS AND NOT TESTSCRN_ERRS_INCLUDED
+' *********************
+
+
+'*** TESTScrn.DLL Error Codes
+'
+Const ERR_SCR_NOERROR = 0
+Const ERR_SCR_FILEACCESS = 301
+Const ERR_SCR_INVALIDFIL = 302
+Const ERR_SCR_INVALSRNID = 303
+Const ERR_SCR_INVALSRNMD = 304
+Const ERR_SCR_OUTOMEMORY = 305
+Const ERR_SCR_READSRNFIL = 306
+Const ERR_SCR_RELMEMORY = 307
+Const ERR_SCR_CREATEDDB = 308
+Const ERR_SCR_RWSRNTABLE = 309
+Const ERR_SCR_RWCOLTABLE = 310
+Const ERR_SCR_WSRNIMAGE = 311
+Const ERR_SCR_WFILEHEAD = 312
+Const ERR_SCR_CREATEDIB = 313
+Const ERR_SCR_SCREENSIZE = 314
+Const ERR_SCR_DISPSCREEN = 315
+Const ERR_SCR_INVALIDACT = 316
+Const ERR_SCR_IMAGEDIFF = 317
+Const ERR_SCR_SRNSIZEDIF = 318
+Const ERR_SCR_FILEEXIST = 319
+Const ERR_SCR_CTEMPFILE = 320
+Const ERR_SCR_HIDEWIN = 321
+Const ERR_SCR_INVALWHAND = 322
+Const ERR_SCR_OFILEFORM = 323
+Const ERR_SCR_SRNFILEFUL = 324
+Const ERR_SCR_INVALSCALE = 325
+Const ERR_SCR_OPENCB = 326
+Const ERR_SCR_EMPTYCB = 327
+Const ERR_SCR_COPYTOCB = 328
+Const ERR_SCR_CLOSECB = 329
+Const ERR_SCR_CREATEPAL = 330
+
+
+' *********************
+'$DEFINE TESTSCRN_ERRS_INCLUDED
+'$ENDIF
+'$IFDEF TESTDLGS_DECL AND NOT TESTDLGS_DECL_INCLUDED
+' *********************
+
+
+'----------------------------------------------------------------------------
+' TESTDlgs.DLL:
+' Type, Const, and Function declarations for use with TESTDlgs
+'----------------------------------------------------------------------------
+Const cchCLASSMAC = 32
+Const cchTEXTMAC = 256
+Const wVEREB = 1
+
+Type DCR
+ xLeft As Integer
+ yMin As Integer
+ xRight As Integer
+ yLast As Integer
+End Type
+
+Type CtlDef
+ rgText As String * cchTEXTMAC
+ rgClass As String * cchCLASSMAC
+ nState As Integer
+ fFlags As String * 1
+ dcrect As DCR
+End Type
+
+Declare Function AwaitSaveCompletion Lib "TESTDlgs.DLL" () As Integer
+Declare Function ComparisonResults Lib "TESTDlgs.DLL" () As Integer
+Declare Function CmpWindow Lib "TESTDlgs.DLL" (hWnd%, nDialog%, fIncludeParent%) As Integer
+Declare Function CmpWindowActivate Lib "TESTDlgs.DLL" (lpszOpenKeys$, lpszCloseKey$, nDialog%, fIncludeParent%) As Integer
+Declare Function CmpWindowCaption Lib "TESTDlgs.DLL" (lpszCap$, nDialog%, fIncludeParent%) As Integer
+Declare Function CmpWindowDelayed Lib "TESTDlgs.DLL" (nDelay%, nDialog%, fIncludeParent%, lpszCloseKeys$) As Integer
+Declare Function DynAdd Lib "TESTDlgs.DLL" (lpCtl As CtlDef) As Integer
+Declare Function DynCreate Lib "TESTDlgs.DLL" () As Integer
+Declare Function DynDelete Lib "TESTDlgs.DLL" (nCtlNum%) As Integer
+Declare Sub DynDestroy Lib "TESTDlgs.DLL" ()
+Declare Function DynFullDialog Lib "TESTDlgs.DLL" (fFull%) As Integer
+Declare Function DynReplace Lib "TESTDlgs.DLL" (lpCtl As CtlDef, nCtlNum%) As Integer
+Declare Function FindWindowCaption Lib "TESTDlgs.DLL" (lpszCap$, hWndStart%) As Integer
+Declare Function MaxDialogs Lib "TESTDlgs.DLL" () As Integer
+Declare Function SaveMenu Lib "TESTDlgs.DLL" (hWnd%, nDialog%, lpszDesc$, fReplace%) As Integer
+Declare Function SaveMenuActivate Lib "TESTDlgs.DLL" (lpszOpenKeys$, lpszCloseKeys$, nDialog%, lpszDesc$, fReplace%) As Integer
+Declare Function SaveMenuCaption Lib "TESTDlgs.DLL" (lpszCap$, nDialog%, lpszDesc$, fReplace%) As Integer
+Declare Function SaveMenuDelayed Lib "TESTDlgs.DLL" (nDelay%, nDialog%, lpszDesc$, fReplace%, CloseKeys$) As Integer
+Declare Function SaveWindow Lib "TESTDlgs.DLL" (hWnd%, nDialog%, lpszDesc$, fReplace%, fIncludeParent%) As Integer
+Declare Function SaveWindowActivate Lib "TESTDlgs.DLL" (lpszOpenKeys$, lpszCloseKeys$, nDialog%, lpszDesc$, fReplace%, fIncludeParent%) As Integer
+Declare Function SaveWindowCaption Lib "TESTDlgs.DLL" (lpszCap%, nDialog%, lpszDesc$, fReplace%, fIncludeParent%) As Integer
+Declare Function SaveWindowDelayed Lib "TESTDlgs.DLL" (nDelay%, nDialog%, lpszDesc$, fReplace%, fIncludeParent%, lpszCloseKeys$) As Integer
+Declare Function SetDialogFile Lib "TESTDlgs.DLL" (lpszDialogName$) As Integer
+Declare Function SetLogFile Lib "TESTDlgs.DLL" (lpszLogName$) As Integer
+Declare Function TESTDlgsInit Lib "TESTDlgs.DLL" () As Integer
+
+
+' *********************
+'$DEFINE TESTDLGS_DECL_INCLUDED
+'$ENDIF
+'$IFDEF TESTDLGS_ERRS AND NOT TESTDLGS_ERRS_INCLUDED
+' *********************
+
+
+'*** Function return codes
+'
+Const ERR_DLGS_NOERR = 0
+Const ERR_DLGS_FUZZY = -1
+Const ERR_DLGS_EXCESS = -2
+Const ERR_DLGS_CTLNOTFOUND = -3
+Const ERR_DLGS_NODLGFILE = -10
+Const ERR_DLGS_FILENOTFOUND = -11
+Const ERR_DLGS_BADWDLFILE = -12
+Const ERR_DLGS_LIBLOADERR = -13
+Const ERR_DLGS_SAVEERR = -14
+Const ERR_DLGS_DLGFILEERR = -15
+Const ERR_DLGS_TMPFILEERR = -16
+Const ERR_DLGS_VERSIONERR = -17
+Const ERR_DLGS_DLGFILEFULL = -18
+Const ERR_DLGS_OUTOFMEMORY = -20
+Const ERR_DLGS_BUFFERERR = -21
+Const ERR_DLGS_NOTIMER = -22
+Const ERR_DLGS_NODYNDIALOG = -30
+Const ERR_DLGS_INVALIDHWND = -31
+Const ERR_DLGS_BADCAPTION = -32
+Const ERR_DLGS_BADDLGNUM = -33
+Const ERR_DLGS_BADCTLINDEX = -34
+Const ERR_DLGS_BADCTLTYPE = -35
+Const ERR_DLGS_BADSAVEACTION = -36
+Const ERR_DLGS_APPSPECIFIC = -37
+
+
+' *********************
+'$DEFINE TESTDLGS_ERRS_INCLUDED
+'$ENDIF
+'$IFDEF W_WINDOW AND NOT W_WINDOW_INCLUDED
+' *********************
+
+'----------------------------------------------------------------------------
+' TESTCtrl.dll routines, types, & constants
+'----------------------------------------------------------------------------
+
+'*** Window size and position types
+'
+Type WNDPOS
+ left As Integer
+ top As Integer
+End Type
+
+Type WNDSIZ
+ width As Integer
+ height As Integer
+End Type
+
+Type WNDPOSSIZ
+ left As Integer
+ top As Integer
+ width As Integer
+ height As Integer
+End Type
+
+'*** Window Positioning and Sizing routines & contants
+'
+Declare Sub WMinWnd Lib "TESTCtrl.dll" (hWnd%)
+Declare Sub WMaxWnd Lib "TESTCtrl.dll" (hWnd%)
+Declare Sub WResWnd Lib "TESTCtrl.dll" (hWnd%)
+Declare Sub WSetWndPos Lib "TESTCtrl.dll" (hWnd%, left%, top%)
+Declare Sub WSetWndSiz Lib "TESTCtrl.dll" (hWnd%, width%, height%)
+Declare Sub WSetWndPosSiz Lib "TESTCtrl.dll" (hWnd%, left%, top%, width%, height%)
+Declare Sub WAdjWndPos Lib "TESTCtrl.dll" (hWnd%, deltaLeft%, deltaTop%)
+Declare Sub WAdjWndSiz Lib "TESTCtrl.dll" (hWnd%, deltaWidth%, deltaHeight%)
+Declare Sub WAdjWndPosSiz Lib "TESTCtrl.dll" (hWnd%, deltaLeft%, deltaTop%, deltaWidth%, deltaHeight%)
+Declare Sub WGetWndPos Lib "TESTCtrl.dll" (hWnd%, lpWndPos As WNDPOS, fRelative%)
+Declare Sub WGetWndSiz Lib "TESTCtrl.dll" (hWnd%, lpWndSiz As WNDSIZ)
+Declare Sub WGetWndPosSiz Lib "TESTCtrl.dll" (hWnd%, lpWndPosSiz As WNDPOSSIZ, fRelative%)
+
+Const RELATIVE = TRUE
+Const ABSOLUTE = FALSE
+
+
+' *********************
+'$DEFINE W_WINDOW_INCLUDED
+'$ENDIF
+'$IFDEF W_MENU AND NOT W_MENU_INCLUDED
+' *********************
+
+
+'*** Menu routines & constants
+'
+Declare Sub WMenu Lib "TESTCtrl.dll" (lpszName$)
+Declare Function WMenuExists Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WMenuGrayed Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WMenuChecked Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WMenuEnabled Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WMenuCount Lib "TESTCtrl.dll" () As Integer
+Declare Sub WMenuText Lib "TESTCtrl.dll" (sIndex%, lpszBuffer$)
+Declare Function MenuText (sIndex%) As String
+Declare Function WMenuLen Lib "TESTCtrl.dll" (sIndex%) As Integer
+Declare Sub WMenuFullText Lib "TESTCtrl.dll" (sIndex%, lpszBuffer$)
+Declare Function MenuFullText (sIndex%) As String
+Declare Function WMenuFullLen Lib "TESTCtrl.dll" (sIndex%) As Integer
+
+'----------------------------------------------------------------------------
+' MenuText: Layered routine for WMenuText()
+'----------------------------------------------------------------------------
+Function MenuText(sIndex%) As String
+Dim lpszBuffer As String
+ menuLength = WMenuLen(sIndex)
+ If menuLength >= 0 Then
+ lpszBuffer = String$(menuLength+1, " ")
+ WMenuText sIndex, lpszBuffer
+ MenuText = lpszBuffer
+ lpszBuffer = ""
+ End if
+End Function
+
+'----------------------------------------------------------------------------
+' MenuFullText: Layered routine for WMenuFullText()
+'----------------------------------------------------------------------------
+Function MenuFullText(sIndex%) As String
+Dim lpszBuffer As String
+ menuLength = WMenuFullLen(sIndex)
+ If menuLength >= 0 Then
+ lpszBuffer = String$(menuLength+1, " ")
+ WMenuFullText sIndex, lpszBuffer
+ MenuFullText = lpszBuffer
+ lpszBuffer = ""
+ End If
+End Function
+
+
+' *********************
+'$DEFINE W_MENU_INCLUDED
+'$ENDIF
+'$IFDEF W_A_CONTROL AND NOT W_A_CONTROL_INCLUDED
+' *********************
+
+
+'*** Global routine & constants used by all controls
+'
+Declare Sub WStaticSetClass Lib "TESTCtrl.dll" (lpszClassName$)
+Declare Sub WResetClasses Lib "TESTCtrl.dll" ()
+
+
+' *********************
+'$DEFINE W_A_CONTROL_INCLUDED
+'$ENDIF
+'$IFDEF W_BUTTON AND NOT W_BUTTON_INCLUDED
+' *********************
+
+
+'*** Button routines
+'
+Declare Sub WButtonSetClass Lib "TESTCtrl.dll" (lpszClassName$)
+Declare Function WButtonExists Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WButtonEnabled Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WButtonFocus Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WButtonClick Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WButtonHide Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WButtonShow Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WButtonEnable Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WButtonDisable Lib "TESTCtrl.dll" (lpszName$)
+
+
+' *********************
+'$DEFINE W_BUTTON_INCLUDED
+'$ENDIF
+'$IFDEF W_CHECK AND NOT W_CHECK_INCLUDED
+' *********************
+
+
+' CheckBox routines
+'
+Declare Sub WCheckSetClass Lib "TESTCtrl.dll" (lpszClassName$)
+Declare Function WCheckExists Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WCheckEnabled Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WCheckFocus Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WCheckState Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WCheckClick Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WCheckHide Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WCheckShow Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WCheckEnable Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WCheckDisable Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WCheckCheck Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WCheckUnCheck Lib "TESTCtrl.dll" (lpszName$)
+
+Const UNCHECKED = 0
+Const CHECKED = 1
+Const GRAYED = 2
+
+
+' *********************
+'$DEFINE W_CHECK_INCLUDED
+'$ENDIF
+'$IFDEF W_OPTION AND NOT W_OPTION_INCLUDED
+' *********************
+
+
+'*** Option Button routines
+'
+Declare Sub WOptionSetClass Lib "TESTCtrl.dll" (lpszClassName$)
+Declare Function WOptionExists Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WOptionEnabled Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WOptionFocus Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WOptionState Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WOptionClick Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WOptionHide Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WOptionShow Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WOptionEnable Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WOptionDisable Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WOptionSelect Lib "TESTCtrl.dll" (lpszName$)
+
+
+' *********************
+'$DEFINE W_OPTION_INCLUDED
+'$ENDIF
+'$IFDEF W_LIST AND NOT W_LIST_INCLUDED
+' *********************
+
+
+'*** Listbox routines
+'
+Declare Sub WListSetClass Lib "TESTCtrl.dll" (lpszClass$)
+Declare Function WListExists Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WListCount Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WListText Lib "TESTCtrl.dll" (lpszName$, lpszBuffer$)
+Declare Function ListText (lpszName$) As String
+Declare Function WListLen Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WListIndex Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WListTopIndex Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WListItemText Lib "TESTCtrl.dll" (lpszName$, sItem%, lpszBuffer$)
+Declare Function ListItemText (lpszName$, sItem%) As String
+Declare Function WListItemLen Lib "TESTCtrl.dll" (lpszName$, sItem%) As Integer
+Declare Function WListItemExists Lib "TESTCtrl.dll" (lpszName$, lpszItem$) As Integer
+Declare Sub WListItemClk Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WListItemCtrlClk Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WListItemShftClk Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WListItemDblClk Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WListItemClkT Lib "TESTCtrl.dll" (lpszName$, lpszItem$)
+Declare Sub WListItemCtrlClkT Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WListItemShftClkT Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WListItemDblClkT Lib "TESTCtrl.dll" (lpszName$, lpszItem$)
+Declare Function WListSelCount Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WListSelItems Lib "TESTCtrl.dll" (lpszName$, lpIntArray As Pointer To Integer)
+Declare Sub WListClear Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WListAddItem Lib "TESTCtrl.dll" (lpszName$, lpszItem$)
+Declare Sub WListDelItem Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WListDelItemT Lib "TESTCtrl.dll" (lpszName$, lpszItem$)
+
+'----------------------------------------------------------------------------
+' ListText: Layered routine for WListText()
+'----------------------------------------------------------------------------
+Function ListText(lpszName$) As String
+Dim lpszBuffer As String
+ itemLength = WListLen(lpszName)
+ If itemLength >= 0 Then
+ lpszBuffer = String$(itemLength+1, " ")
+ WListText lpszName, lpszBuffer
+ ListText = lpszBuffer
+ lpszBuffer = ""
+ End If
+End Function
+
+'----------------------------------------------------------------------------
+' ListItemText: Layered routine for WListItemText()
+'----------------------------------------------------------------------------
+Function ListItemText(lpszName$, sItem%) As String
+Dim lpszBuffer As String
+ itemLength = WListItemLen(lpszName, sItem)
+ If itemLength >= 0 Then
+ lpszBuffer = String$(itemLength+1, " ")
+ WListItemText lpszName, sItem, lpszBuffer
+ ListItemText = lpszBuffer
+ lpszBuffer = ""
+ End If
+End Function
+
+
+' *********************
+'$DEFINE W_LIST_INCLUDED
+'$ENDIF
+'$IFDEF W_COMBO AND NOT W_COMBO_INCLUDED
+' *********************
+
+
+'*** Combobox routines
+'
+Declare Sub WComboSetClass Lib "TESTCtrl.dll" (lpszClass$)
+Declare Sub WComboSetLBClass Lib "TESTCtrl.dll" (lpszClass$)
+Declare Function WComboExists Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WComboCount Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WComboSetText Lib "TESTCtrl.dll" (lpszName$, lpszText$)
+Declare Sub WComboText Lib "TESTCtrl.dll" (lpszName$, lpszBuffer$)
+Declare Function ComboText (lpszName$) As String
+Declare Function WComboLen Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WComboSelText Lib "TESTCtrl.dll" (lpszName$, lpszBuffer$)
+Declare Function ComboSelText (lpszName$) As String
+Declare Function WComboSelLen Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WComboIndex Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WComboItemText Lib "TESTCtrl.dll" (lpszName$, sItem%, lpszBuffer$)
+Declare Function ComboItemText (lpszName$, sItem%) As String
+Declare Function WComboItemLen Lib "TESTCtrl.dll" (lpszName$, sItem%) As Integer
+Declare Function WComboItemExists Lib "TESTCtrl.dll" (lpszName$, lpszItem$) As Integer
+Declare Sub WComboItemClk Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WComboItemDblClk Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WComboItemClkT Lib "TESTCtrl.dll" (lpszName$, lpszItem$)
+Declare Sub WComboItemDblClkT Lib "TESTCtrl.dll" (lpszName$, lpszItem$)
+Declare Sub WComboClear Lib "TESTCtrl.dll" (lpszName$)
+Declare Sub WComboAddItem Lib "TESTCtrl.dll" (lpszName$, lpszItem$)
+Declare Sub WComboDelItem Lib "TESTCtrl.dll" (lpszName$, sItem%)
+Declare Sub WComboDelItemT Lib "TESTCtrl.dll" (lpszName$, lpszItem$)
+
+'----------------------------------------------------------------------------
+' ComboText: Layered routine for WComboText()
+'----------------------------------------------------------------------------
+Function ComboText(lpszName$) As String
+Dim lpszBuffer As String
+ itemLength = WComboLen(lpszName$)
+ If itemLength >= 0 Then
+ lpszBuffer = String$(itemLength+1, " ")
+ WComboText lpszName, lpszBuffer
+ ComboText = lpszBuffer
+ lpszBuffer = ""
+ End If
+End Function
+
+'----------------------------------------------------------------------------
+' ComboSelText: Layered routine for WComboSelText()
+'----------------------------------------------------------------------------
+Function ComboSelText(lpszName$) As String
+Dim lpszBuffer As String
+ itemLength = WComboSelLen(lpszName$)
+ If itemLength >= 0 Then
+ lpszBuffer = String$(itemLength+1, " ")
+ WComboSelText lpszName, lpszBuffer
+ ComboSelText = lpszBuffer
+ lpszBuffer = ""
+ End If
+End Function
+
+'----------------------------------------------------------------------------
+' ComboItemText: Layered routine for WComboItemText()
+'----------------------------------------------------------------------------
+Function ComboItemText(lpszName$, sItem%) As String
+Dim lpszBuffer As String
+ itemLength = WComboItemLen(lpszName, sItem)
+ If itemLength >= 0 Then
+ lpszBuffer = String$(itemLength+1, " ")
+ WComboItemText lpszName, sItem, lpszBuffer
+ ComboItemText = lpszBuffer
+ lpszBuffer = ""
+ End If
+End Function
+
+
+' *********************
+'$DEFINE W_COMBO_INCLUDED
+'$ENDIF
+'$IFDEF W_EDIT AND NOT W_EDIT_INCLUDED
+' *********************
+
+
+'*** Edit box routines
+'
+Declare Sub WEditSetClass Lib "TESTCtrl.dll" (lpszClass$)
+Declare Function WEditExists Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WEditLen Lib "TESTCtrl.dll" (lpszName$) As Long
+Declare Sub WEditText Lib "TESTCtrl.dll" (lpszName$, lpszBuffer$)
+Declare Function EditText (lpszName$) As String
+Declare Sub WEditSetText Lib "TESTCtrl.dll" (lpszName$, lpszBuffer$)
+Declare Sub WEditSelText Lib "TESTCtrl.dll" (lpszName$, lpszBuffer$)
+Declare Function EditSelText (lpszName$) As String
+Declare Function WEditSelLen Lib "TESTCtrl.dll" (lpszName$) As Long
+Declare Sub WEditLineText Lib "TESTCtrl.dll" (lpszName$, Index%, lpszBuffer$)
+Declare Function EditLineText (lpszName$, Index%) As String
+Declare Function WEditLineLen Lib "TESTCtrl.dll" (lpszName$, Index%) As Long
+Declare Function WEditPos Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WEditLine Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WEditChar Lib "TESTCtrl.dll" (lpszName$) As Long
+Declare Function WEditFirst Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Function WEditLines Lib "TESTCtrl.dll" (lpszName$) As Integer
+Declare Sub WEditClick Lib "TESTCtrl.dll" (lpszName$)
+
+'----------------------------------------------------------------------------
+' EditText: Layered routine for WEditText()
+'----------------------------------------------------------------------------
+Function EditText(lpszName$) As String
+Dim lpszBuffer As String
+ textLength = WEditLen(lpszName)
+ If textLength >=0 Then
+ lpszBuffer = String$(textLength+1, " ")
+ WEditText lpszName, lpszBuffer
+ EditText = lpszBuffer
+ lpszBuffer = ""
+ End If
+End Function
+
+'----------------------------------------------------------------------------
+' EditSelText: Layered routine for WEditSelText()
+'----------------------------------------------------------------------------
+Function EditSelText(lpszName$) As String
+Dim lpszBuffer As String
+ selLength = WEditSelLen(lpszName)
+ If selLength >= 0 Then
+ lpszBuffer = String$(selLength+1, " ")
+ WEditSelText lpszName, lpszBuffer
+ EditSelText = lpszBuffer
+ lpszBuffer = ""
+ End If
+End Function
+
+'----------------------------------------------------------------------------
+' EditLineText: Layered routine for WEditLineText()
+'----------------------------------------------------------------------------
+Function EditLineText(lpszName$, sIndex%) As String
+Dim lpszBuffer As String
+ lineLength = WEditLineLen(lpszName, sIndex)
+ If lineLength >= 0 Then
+ lpszBuffer = String$(lineLength+1, " ")
+ WEditLineText lpszName, sIndex, lpszBuffer
+ EditLineText = lpszBuffer
+ lpszBuffer = ""
+ End if
+End Function
+
+
+' *********************
+'$DEFINE W_EDIT_INCLUDED
+'$ENDIF
+'$IFDEF W_ERROR AND NOT W_ERROR_INCLUDED
+' *********************
+
+
+Declare Function WError Lib "TESTCtrl.dll" () As Integer
+Declare Sub WErrorSet Lib "TESTCtrl.dll" (sErrorNum%)
+Declare Sub WErrorText Lib "TESTCtrl.dll" (lpszBuffer$)
+Declare Function ErrorText () As String
+Declare Function WErrorLen Lib "TESTCtrl.dll" () As Integer
+
+Const NO_ERROR = 0
+Const ERR_MENU_NOT_FOUND = 1
+Const ERR_MENU_ITEM_NOT_FOUND = 2
+Const ERR_NOT_A_LISTBOX = 3
+Const ERR_LISTBOX_NOT_FOUND = 4
+Const ERR_ITEM_NOT_IN_LISTBOX = 5
+Const ERR_INVALID_LISTBOX_INDEX = 6
+Const ERR_LISTBOX_HAS_NO_STRINGS = 7
+Const ERR_NOT_A_COMBOBOX = 8
+Const ERR_COMBOBOX_NOT_FOUND = 9
+Const ERR_ITEM_NOT_IN_COMBOBOX = 10
+Const ERR_INVALID_COMBOBOX_INDEX = 11
+Const ERR_COMBOBOX_HAS_NO_EDITBOX = 12
+Const ERR_COMBOBOX_HAS_NO_STRINGS = 13
+Const ERR_NOT_AN_EDITBOX = 14
+Const ERR_EDITBOX_NOT_FOUND = 15
+Const ERR_BUTTON_NOT_FOUND = 16
+Const ERR_OPTION_BUTTON_NOT_FOUND = 17
+Const ERR_CHECKBOX_NOT_FOUND = 18
+Const ERR_INVALID_WINDOW_HANDLE = 19
+Const MAX_ERROR = 20
+
+'----------------------------------------------------------------------------
+' ErrorText: Layered routine for WErrorText() of TESTCtrl.DLL.
+' Simulates a DLL String Function.
+'----------------------------------------------------------------------------
+Function ErrorText() As String
+Dim lpszBuffer As String
+ errorLength= WErrorLen
+ lpszBuffer = String$(errorLength+1, " ")
+ WErrorText lpszBuffer
+ ErrorText = lpszBuffer
+ lpszBuffer = ""
+End Function
+
+
+' *********************
+'$DEFINE W_ERROR_INCLUDED
+'$ENDIF
+' *********************
+
+
diff --git a/private/oleauto/tools/win16/os2/inc/new.h b/private/oleauto/tools/win16/os2/inc/new.h
new file mode 100644
index 000000000..3fd2a911f
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/new.h
@@ -0,0 +1,40 @@
+/***
+*new.h - declarations and definitions for C++ memory allocation functions
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains the function declarations for C++ memory allocation functions.
+* [System V]
+*
+****/
+
+#ifndef __INC_NEW
+#define __INC_NEW
+
+
+/* constants for based heap routines */
+
+#define _NULLSEG ((__segment)0)
+#define _NULLOFF ((void __based(void) *)0xffff)
+
+/* types and structures */
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+typedef int (__cdecl * _PNH)( size_t );
+typedef int (__cdecl * _PNHH)( unsigned long, size_t );
+typedef int (__cdecl * _PNHB)( __segment, size_t );
+
+/* function prototypes */
+
+_PNH _set_new_handler( _PNH );
+_PNH _set_nnew_handler( _PNH );
+_PNH _set_fnew_handler( _PNH );
+_PNHH _set_hnew_handler( _PNHH );
+_PNHB _set_bnew_handler( _PNHB );
+
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/new.hxx b/private/oleauto/tools/win16/os2/inc/new.hxx
new file mode 100644
index 000000000..a703e14dc
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/new.hxx
@@ -0,0 +1,51 @@
+/***
+*new.hxx - declarations and definitions for C++ memory allocation functions
+*
+* Copyright (c) 1990-1991, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains the function declarations for C++ memory allocation functions.
+* [System V]
+*
+****/
+
+#ifndef __INC_NEW
+#define __INC_NEW
+
+#if defined(_DLL) && !defined(_MT)
+#error Cannot define _DLL without _MT
+#endif
+
+#ifdef _MT
+#define _FAR_ __far
+#else
+#define _FAR_
+#endif
+
+
+/* constants for based heap routines */
+
+#define _NULLSEG ((__segment)0)
+#define _NULLOFF ((void __based(void) *)0xffff)
+
+/* types and structures */
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+typedef int (__cdecl * PNH)( size_t );
+typedef int (__cdecl * PNHH)( unsigned long, size_t );
+typedef int (__cdecl * PNHB)( __segment, size_t );
+
+/* function prototypes */
+
+PNH _set_new_handler( PNH );
+PNH setNewHandler( PNH );
+PNH setNearNewHandler( PNH );
+PNH setFarNewHandler( PNH );
+PNHH setHugeNewHandler( PNHH );
+PNHB setBasedNewHandler( PNHB );
+
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/nlsapi.h b/private/oleauto/tools/win16/os2/inc/nlsapi.h
new file mode 100644
index 000000000..f34b12b3b
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/nlsapi.h
@@ -0,0 +1,428 @@
+/***
+*nlsapi.h - National language support functions.
+*
+* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
+* Information Contained Herein Is Proprietary and Confidential.
+*
+*Purpose:
+* This describes the NLSAPI functions for Win16. This is a subset
+* of Win32 NLSAPI, and is a non-Unicode version.
+*
+*Implementation Notes:
+* This files is largely ported from the Win32 header winnls.h.
+*
+*****************************************************************************/
+
+#ifndef _NLSAPI_
+#define _NLSAPI_
+
+#ifndef NONLS
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cpluscplus
+
+/***************************************************************************\
+* Constants
+*
+* Define all constants for the NLS component here.
+\***************************************************************************/
+
+/*
+ * Character Type Flags.
+ */
+#define CT_CTYPE1 0x00000001 /* ctype 1 information */
+#define CT_CTYPE2 0x00000002 /* ctype 2 information */
+#define CT_CTYPE3 0x00000004 /* ctype 3 information */
+
+/*
+ * CType 1 Flag Bits.
+ */
+#define C1_UPPER 0x0001 /* upper case */
+#define C1_LOWER 0x0002 /* lower case */
+#define C1_DIGIT 0x0004 /* decimal digits */
+#define C1_SPACE 0x0008 /* spacing characters */
+#define C1_PUNCT 0x0010 /* punctuation characters */
+#define C1_CNTRL 0x0020 /* control characters */
+#define C1_BLANK 0x0040 /* blank characters */
+#define C1_XDIGIT 0x0080 /* other digits */
+#define C1_ALPHA 0x0100 /* any letter */
+
+/*
+ * CType 2 Flag Bits.
+ */
+#define C2_LEFTTORIGHT 0x1 /* left to right */
+#define C2_RIGHTTOLEFT 0x2 /* right to left */
+
+#define C2_EUROPENUMBER 0x3 /* European number, digit */
+#define C2_EUROPESEPARATOR 0x4 /* European numeric separator */
+#define C2_EUROPETERMINATOR 0x5 /* European numeric terminator */
+#define C2_ARABICNUMBER 0x6 /* Arabic number */
+#define C2_COMMONSEPARATOR 0x7 /* common numeric separator */
+
+#define C2_BLOCKSEPARATOR 0x8 /* block separator */
+#define C2_SEGMENTSEPARATOR 0x9 /* segment separator */
+#define C2_WHITESPACE 0xA /* white space */
+#define C2_OTHERNEUTRAL 0xB /* other neutrals */
+
+#define C2_NOTAPPLICABLE 0x0 /* no implicit directionality */
+
+/*
+ * CType 3 Flag Bits.
+ */
+#define C3_NONSPACING 0x0001 /* nonspacing character */
+#define C3_DIACRITIC 0x0002 /* diacritic mark */
+#define C3_VOWELMARK 0x0004 /* vowel mark */
+#define C3_SYMBOL 0x0008 /* symbols */
+
+#define C3_NOTAPPLICABLE 0x0 /* ctype 3 is not applicable */
+
+
+/*
+ * String Flags.
+ */
+#define NORM_IGNORECASE 0x00000001 /* ignore case */
+#define NORM_IGNORENONSPACE 0x00000002 /* ignore nonspacing chars */
+#define NORM_IGNORESYMBOLS 0x00000004 /* ignore symbols */
+
+
+/*
+ * Locale Dependent Mapping Flags.
+ */
+#define LCMAP_LOWERCASE 0x00000100 /* lower case letters */
+#define LCMAP_UPPERCASE 0x00000200 /* upper case letters */
+#define LCMAP_SORTKEY 0x00000400 /* WC sort key (normalize) */
+
+
+
+/*
+ * Language IDs.
+ *
+ * The following two combinations of primary language ID and
+ * sublanguage ID have special semantics:
+ *
+ * Primary Language ID Sublanguage ID Result
+ * ------------------- --------------- ------------------------
+ * LANG_NEUTRAL SUBLANG_NEUTRAL Language neutral
+ * LANG_NEUTRAL SUBLANG_DEFAULT Process default language
+ */
+
+/*
+ * Primary language IDs.
+ */
+#define LANG_NEUTRAL 0x00
+
+#define LANG_ALBANIAN 0x1c
+#define LANG_ARABIC 0x01
+#define LANG_BAHASA 0x21
+#define LANG_BULGARIAN 0x02
+#define LANG_CATALAN 0x03
+#define LANG_CHINESE 0x04
+#define LANG_CZECH 0x05
+#define LANG_DANISH 0x06
+#define LANG_DUTCH 0x13
+#define LANG_ENGLISH 0x09
+#define LANG_FINNISH 0x0b
+#define LANG_FRENCH 0x0c
+#define LANG_GERMAN 0x07
+#define LANG_GREEK 0x08
+#define LANG_HEBREW 0x0d
+#define LANG_HUNGARIAN 0x0e
+#define LANG_ICELANDIC 0x0f
+#define LANG_ITALIAN 0x10
+#define LANG_JAPANESE 0x11
+#define LANG_KOREAN 0x12
+#define LANG_NORWEGIAN 0x14
+#define LANG_POLISH 0x15
+#define LANG_PORTUGUESE 0x16
+#define LANG_RHAETO_ROMAN 0x17
+#define LANG_ROMANIAN 0x18
+#define LANG_RUSSIAN 0x19
+#define LANG_SERBO_CROATIAN 0x1a
+#define LANG_SLOVAK 0x1b
+#define LANG_SPANISH 0x0a
+#define LANG_SWEDISH 0x1d
+#define LANG_THAI 0x1e
+#define LANG_TURKISH 0x1f
+#define LANG_URDU 0x20
+
+/*
+ * Sublanguage IDs.
+ *
+ * The name immediately following SUBLANG_ dictates which primary
+ * language ID that sublanguage ID can be combined with to form a
+ * valid language ID.
+ */
+#define SUBLANG_NEUTRAL 0x00 /* language neutral */
+#define SUBLANG_DEFAULT 0x01 /* user default */
+#define SUBLANG_SYS_DEFAULT 0x02 /* system default */
+
+#define SUBLANG_CHINESE_SIMPLIFIED 0x02 /* Chinese (Simplified) */
+#define SUBLANG_CHINESE_TRADITIONAL 0x01 /* Chinese (Traditional) */
+#define SUBLANG_DUTCH 0x01 /* Dutch */
+#define SUBLANG_DUTCH_BELGIAN 0x02 /* Dutch (Belgian) */
+#define SUBLANG_ENGLISH_US 0x01 /* English (USA) */
+#define SUBLANG_ENGLISH_UK 0x02 /* English (UK) */
+#define SUBLANG_ENGLISH_AUS 0x03 /* English (Australian) */
+#define SUBLANG_ENGLISH_CAN 0x04 /* English (Canadian) */
+#define SUBLANG_ENGLISH_NZ 0x05 /* English (New Zealand) */
+#define SUBLANG_FRENCH 0x01 /* French */
+#define SUBLANG_FRENCH_BELGIAN 0x02 /* French (Belgian) */
+#define SUBLANG_FRENCH_CANADIAN 0x03 /* French (Canadian) */
+#define SUBLANG_FRENCH_SWISS 0x04 /* French (Swiss) */
+#define SUBLANG_GERMAN 0x01 /* German */
+#define SUBLANG_GERMAN_SWISS 0x02 /* German (Swiss) */
+#define SUBLANG_GERMAN_AUSTRIAN 0x03 /* German (Austrian) */
+#define SUBLANG_ITALIAN 0x01 /* Italian */
+#define SUBLANG_ITALIAN_SWISS 0x02 /* Italian (Swiss) */
+#define SUBLANG_NORWEGIAN_BOKMAL 0x01 /* Norwegian (Bokmal) */
+#define SUBLANG_NORWEGIAN_NYNORSK 0x02 /* Norwegian (Nynorsk) */
+#define SUBLANG_PORTUGUESE 0x02 /* Portuguese */
+#define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 /* Portuguese (Brazilian) */
+#define SUBLANG_SERBO_CROATIAN_CYRILLIC 0x02 /* Serbo-Croatian (Cyrillic) */
+#define SUBLANG_SERBO_CROATIAN_LATIN 0x01 /* Croato-Serbian (Latin) */
+#define SUBLANG_SPANISH 0x01 /* Spanish */
+#define SUBLANG_SPANISH_MEXICAN 0x02 /* Spanish (Mexican) */
+#define SUBLANG_SPANISH_MODERN 0x03 /* Spanish (Modern) */
+
+
+/*
+ * Country Codes.
+ */
+#define CTRY_DEFAULT 0
+
+#define CTRY_AUSTRALIA 61 /* Australia */
+#define CTRY_AUSTRIA 43 /* Austria */
+#define CTRY_BELGIUM 32 /* Belgium */
+#define CTRY_BRAZIL 55 /* Brazil */
+#define CTRY_CANADA 2 /* Canada */
+#define CTRY_DENMARK 45 /* Denmark */
+#define CTRY_FINLAND 358 /* Finland */
+#define CTRY_FRANCE 33 /* France */
+#define CTRY_GERMANY 49 /* Germany */
+#define CTRY_ICELAND 354 /* Iceland */
+#define CTRY_IRELAND 353 /* Ireland */
+#define CTRY_ITALY 39 /* Italy */
+#define CTRY_JAPAN 81 /* Japan */
+#define CTRY_MEXICO 52 /* Mexico */
+#define CTRY_NETHERLANDS 31 /* Netherlands */
+#define CTRY_NEW_ZEALAND 64 /* New Zealand */
+#define CTRY_NORWAY 47 /* Norway */
+#define CTRY_PORTUGAL 351 /* Portugal */
+#define CTRY_PRCHINA 86 /* PR China */
+#define CTRY_SOUTH_KOREA 82 /* South Korea */
+#define CTRY_SPAIN 34 /* Spain */
+#define CTRY_SWEDEN 46 /* Sweden */
+#define CTRY_SWITZERLAND 41 /* Switzerland */
+#define CTRY_TAIWAN 886 /* Taiwan */
+#define CTRY_UNITED_KINGDOM 44 /* United Kingdom */
+#define CTRY_UNITED_STATES 1 /* United States */
+
+
+/*
+ * Locale Types.
+ *
+ * These types are used for the GetLocaleInfoA NLS API routine.
+ */
+#define LOCALE_ILANGUAGE 0x0001 /* language id */
+#define LOCALE_SLANGUAGE 0x0002 /* localized name of language */
+#define LOCALE_SENGLANGUAGE 0x1001 /* English name of language */
+#define LOCALE_SABBREVLANGNAME 0x0003 /* abbreviated language name */
+#define LOCALE_SNATIVELANGNAME 0x0004 /* native name of language */
+#define LOCALE_ICOUNTRY 0x0005 /* country code */
+#define LOCALE_SCOUNTRY 0x0006 /* localized name of country */
+#define LOCALE_SENGCOUNTRY 0x1002 /* English name of country */
+#define LOCALE_SABBREVCTRYNAME 0x0007 /* abbreviated country name */
+#define LOCALE_SNATIVECTRYNAME 0x0008 /* native name of country */
+#define LOCALE_IDEFAULTLANGUAGE 0x0009 /* default language id */
+#define LOCALE_IDEFAULTCOUNTRY 0x000A /* default country code */
+#define LOCALE_IDEFAULTCODEPAGE 0x000B /* default code page */
+
+#define LOCALE_SLIST 0x000C /* list item separator */
+#define LOCALE_IMEASURE 0x000D /* 0 = metric, 1 = US */
+
+#define LOCALE_SDECIMAL 0x000E /* decimal separator */
+#define LOCALE_STHOUSAND 0x000F /* thousand separator */
+#define LOCALE_SGROUPING 0x0010 /* digit grouping */
+#define LOCALE_IDIGITS 0x0011 /* number of fractional digits */
+#define LOCALE_ILZERO 0x0012 /* leading zeros for decimal */
+#define LOCALE_SNATIVEDIGITS 0x0013 /* native ascii 0-9 */
+
+#define LOCALE_SCURRENCY 0x0014 /* local monetary symbol */
+#define LOCALE_SINTLSYMBOL 0x0015 /* intl monetary symbol */
+#define LOCALE_SMONDECIMALSEP 0x0016 /* monetary decimal separator */
+#define LOCALE_SMONTHOUSANDSEP 0x0017 /* monetary thousand separator */
+#define LOCALE_SMONGROUPING 0x0018 /* monetary grouping */
+#define LOCALE_ICURRDIGITS 0x0019 /* # local monetary digits */
+#define LOCALE_IINTLCURRDIGITS 0x001A /* # intl monetary digits */
+#define LOCALE_ICURRENCY 0x001B /* positive currency mode */
+#define LOCALE_INEGCURR 0x001C /* negative currency mode */
+
+#define LOCALE_SDATE 0x001D /* date separator */
+#define LOCALE_STIME 0x001E /* time separator */
+#define LOCALE_SSHORTDATE 0x001F /* short date-time separator */
+#define LOCALE_SLONGDATE 0x0020 /* long date-time separator */
+#define LOCALE_IDATE 0x0021 /* short date format ordering */
+#define LOCALE_ILDATE 0x0022 /* long date format ordering */
+#define LOCALE_ITIME 0x0023 /* time format specifier */
+#define LOCALE_ICENTURY 0x0024 /* century format specifier */
+#define LOCALE_ITLZERO 0x0025 /* leading zeros in time field */
+#define LOCALE_IDAYLZERO 0x0026 /* leading zeros in day field */
+#define LOCALE_IMONLZERO 0x0027 /* leading zeros in month field */
+#define LOCALE_S1159 0x0028 /* AM designator */
+#define LOCALE_S2359 0x0029 /* PM designator */
+
+#define LOCALE_SDAYNAME1 0x002A /* long name for Monday */
+#define LOCALE_SDAYNAME2 0x002B /* long name for Tuesday */
+#define LOCALE_SDAYNAME3 0x002C /* long name for Wednesday */
+#define LOCALE_SDAYNAME4 0x002D /* long name for Thursday */
+#define LOCALE_SDAYNAME5 0x002E /* long name for Friday */
+#define LOCALE_SDAYNAME6 0x002F /* long name for Saturday */
+#define LOCALE_SDAYNAME7 0x0030 /* long name for Sunday */
+#define LOCALE_SABBREVDAYNAME1 0x0031 /* abbreviated name for Monday */
+#define LOCALE_SABBREVDAYNAME2 0x0032 /* abbreviated name for Tuesday */
+#define LOCALE_SABBREVDAYNAME3 0x0033 /* abbreviated name for Wednesday */
+#define LOCALE_SABBREVDAYNAME4 0x0034 /* abbreviated name for Thursday */
+#define LOCALE_SABBREVDAYNAME5 0x0035 /* abbreviated name for Friday */
+#define LOCALE_SABBREVDAYNAME6 0x0036 /* abbreviated name for Saturday */
+#define LOCALE_SABBREVDAYNAME7 0x0037 /* abbreviated name for Sunday */
+#define LOCALE_SMONTHNAME1 0x0038 /* long name for January */
+#define LOCALE_SMONTHNAME2 0x0039 /* long name for February */
+#define LOCALE_SMONTHNAME3 0x003A /* long name for March */
+#define LOCALE_SMONTHNAME4 0x003B /* long name for April */
+#define LOCALE_SMONTHNAME5 0x003C /* long name for May */
+#define LOCALE_SMONTHNAME6 0x003D /* long name for June */
+#define LOCALE_SMONTHNAME7 0x003E /* long name for July */
+#define LOCALE_SMONTHNAME8 0x003F /* long name for August */
+#define LOCALE_SMONTHNAME9 0x0040 /* long name for September */
+#define LOCALE_SMONTHNAME10 0x0041 /* long name for October */
+#define LOCALE_SMONTHNAME11 0x0042 /* long name for November */
+#define LOCALE_SMONTHNAME12 0x0043 /* long name for December */
+#define LOCALE_SABBREVMONTHNAME1 0x0044 /* abbreviated name for January */
+#define LOCALE_SABBREVMONTHNAME2 0x0045 /* abbreviated name for February */
+#define LOCALE_SABBREVMONTHNAME3 0x0046 /* abbreviated name for March */
+#define LOCALE_SABBREVMONTHNAME4 0x0047 /* abbreviated name for April */
+#define LOCALE_SABBREVMONTHNAME5 0x0048 /* abbreviated name for May */
+#define LOCALE_SABBREVMONTHNAME6 0x0049 /* abbreviated name for June */
+#define LOCALE_SABBREVMONTHNAME7 0x004A /* abbreviated name for July */
+#define LOCALE_SABBREVMONTHNAME8 0x004B /* abbreviated name for August */
+#define LOCALE_SABBREVMONTHNAME9 0x004C /* abbreviated name for September */
+#define LOCALE_SABBREVMONTHNAME10 0x004D /* abbreviated name for October */
+#define LOCALE_SABBREVMONTHNAME11 0x004E /* abbreviated name for November */
+#define LOCALE_SABBREVMONTHNAME12 0x004F /* abbreviated name for December */
+
+#define LOCALE_SPOSITIVESIGN 0x0050 /* positive sign */
+#define LOCALE_SNEGATIVESIGN 0x0051 /* negative sign */
+#define LOCALE_IPOSSIGNPOSN 0x0052 /* positive sign position */
+#define LOCALE_INEGSIGNPOSN 0x0053 /* negative sign position */
+#define LOCALE_IPOSSYMPRECEDES 0x0054 /* mon sym precedes pos amt */
+#define LOCALE_IPOSSEPBYSPACE 0x0055 /* mon sym sep by space from pos */
+#define LOCALE_INEGSYMPRECEDES 0x0056 /* mon sym precedes neg amt */
+#define LOCALE_INEGSEPBYSPACE 0x0057 /* mon sym sep by space from neg */
+
+#define LOCALE_NOUSEROVERRIDE 0x80000000 /* OR in to avoid user override */
+
+/***************************************************************************\
+* Typedefs
+*
+* Define all types for the NLS component here.
+\***************************************************************************/
+
+/*
+ * IDs.
+ */
+typedef DWORD LCID; /* locale ID */
+typedef WORD LANGID; /* language ID */
+typedef DWORD LCTYPE; /* locale type constant */
+
+
+
+
+/***************************************************************************\
+* Macros
+*
+* Define all macros for the NLS component here.
+\***************************************************************************/
+
+/*
+ * A language ID is a 16 bit value which is the combination of a
+ * primary language ID and a secondary language ID. The bits are
+ * allocated as follows:
+ *
+ * +-----------------------+-------------------------+
+ * | Sublanguage ID | Primary Language ID |
+ * +-----------------------+-------------------------+
+ * 15 10 9 0 bit
+ *
+ *
+ * Language ID creation/extraction macros:
+ *
+ * MAKELANGID - construct language id from primary language id and
+ * sublanguage id.
+ * PRIMARYLANGID - extract primary language id from a language id.
+ * SUBLANGID - extract sublanguage id from a language id.
+ */
+#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD)(p))
+#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff)
+#define SUBLANGID(lgid) ((WORD)(lgid) >> 10)
+
+
+/*
+ * A locale ID is a 32 bit value which is the combination of a
+ * language ID and a reserved area. The bits are allocated as follows:
+ *
+ * +-----------------------+-------------------------+
+ * | Reserved | Language ID |
+ * +-----------------------+-------------------------+
+ * 31 16 15 0 bit
+ *
+ *
+ * Locale ID creation macro:
+ *
+ * MAKELCID - construct locale id from a language id.
+ */
+#define MAKELCID(lgid) ((DWORD)(((WORD)(lgid)) | (((DWORD)((WORD)(0))) << 16)))
+
+
+/*
+ * Get the language id from a locale id.
+ */
+#define LANGIDFROMLCID(lcid) ((WORD)(lcid))
+
+
+/*
+ * Default System and User IDs for language and locale.
+ */
+#define LANG_SYSTEM_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
+#define LANG_USER_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
+
+#define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT))
+#define LOCALE_USER_DEFAULT (MAKELCID(LANG_USER_DEFAULT))
+
+
+
+/***************************************************************************\
+* Function Prototypes
+*
+* Only prototypes for the NLS APIs should go here.
+\***************************************************************************/
+
+
+int WINAPI CompareStringA(LCID, DWORD, LPCSTR, int, LPCSTR, int);
+int WINAPI LCMapStringA(LCID, DWORD, LPCSTR, int, LPSTR, int);
+int WINAPI GetLocaleInfoA(LCID, LCTYPE, LPSTR, int);
+BOOL WINAPI GetStringTypeA(LCID, DWORD, LPCSTR, int, LPWORD);
+
+LANGID WINAPI GetSystemDefaultLangID(void);
+LANGID WINAPI GetUserDefaultLangID(void);
+LCID WINAPI GetSystemDefaultLCID(void);
+LCID WINAPI GetUserDefaultLCID(void);
+
+#ifdef __cplusplus
+}
+#endif // __cpluscplus
+
+
+#endif // NONLS
+
+#endif // _NLSAPI_
diff --git a/private/oleauto/tools/win16/os2/inc/ole.h b/private/oleauto/tools/win16/os2/inc/ole.h
new file mode 100644
index 000000000..6b64c8bfb
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ole.h
@@ -0,0 +1,464 @@
+
+
+/****************************************************************/
+/* */
+/* OLE header */
+/* (c) Copyright Microsoft Corp. 1990 - All Rights Reserved */
+/* */
+/****************************************************************/
+
+// Object types
+
+#define OT_LINK 1L
+#define OT_EMBEDDED 2L
+#define OT_STATIC 3L
+
+
+// activate verbs
+
+#define OLEVERB_PRIMARY 0
+
+
+// flags used in some methods
+
+#define OF_SET 0x0001
+#define OF_GET 0x0002
+#define OF_HANDLER 0x0004
+
+
+
+// return codes for OLE functions
+typedef enum {
+ OLE_OK, // 0 Function operated correctly
+
+ OLE_WAIT_FOR_RELEASE, // 1 Command has been initiated, client
+ // must wait for release. keep dispatching
+ // messages till OLE_RELESE in callback
+
+ OLE_BUSY, // 2 Tried to execute a method while another
+ // method is in progress.
+
+ OLE_ERROR_PROTECT_ONLY, // 3 Ole APIs are called in real mode
+ OLE_ERROR_MEMORY, // 4 Could not alloc or lock memory
+ OLE_ERROR_STREAM, // 5 (OLESTREAM) stream error
+ OLE_ERROR_STATIC, // 6 Non static object expected
+ OLE_ERROR_BLANK, // 7 Critical data missing
+ OLE_ERROR_DRAW, // 8 Error while drawing
+ OLE_ERROR_METAFILE, // 9 Invalid metafile
+ OLE_ERROR_ABORT, // 10 Client chose to abort metafile drawing
+ OLE_ERROR_CLIPBOARD, // 11 Failed to get/set clipboard data
+ OLE_ERROR_FORMAT, // 12 Requested format is not available
+ OLE_ERROR_OBJECT, // 13 Not a valid object
+ OLE_ERROR_OPTION, // 14 Invalid option (link update / render)
+ OLE_ERROR_PROTOCOL, // 15 Invalid protocol
+ OLE_ERROR_ADDRESS, // 16 One of the pointers is invalid
+ OLE_ERROR_NOT_EQUAL, // 17 Objects are not equal
+ OLE_ERROR_HANDLE, // 18 Invalid handle encountered
+ OLE_ERROR_GENERIC, // 19 Some general error
+ OLE_ERROR_CLASS, // 20 Invalid class
+ OLE_ERROR_SYNTAX, // 21 Command syntax is invalid
+ OLE_ERROR_DATATYPE, // 22 Data format is not supported
+ OLE_ERROR_PALETTE, // 23 Invalid color palette
+ OLE_ERROR_NOT_LINK, // 24 Not a linked object
+ OLE_ERROR_NOT_EMPTY, // 25 Client doc contains objects.
+ OLE_ERROR_SIZE, // 26 Incorrect buffer size passed to the api
+ // that places some string in caller's
+ // buffer
+
+ OLE_ERROR_DRIVE, // 27 Drive letter in doc name is invalid
+ OLE_ERROR_NETWORK, // 28 Failed to establish connection to a
+ // network share on which the document
+ // is located
+
+ OLE_ERROR_NAME, // 29 Invalid name (doc name, object name),
+ // etc.. passed to the APIs
+
+ OLE_ERROR_TEMPLATE, // 30 Server failed to load template
+ OLE_ERROR_NEW, // 31 Server failed to create new doc
+ OLE_ERROR_EDIT, // 32 Server failed to create embedded
+ // instance
+ OLE_ERROR_OPEN, // 33 Server failed to open document,
+ // possible invalid link
+
+ OLE_ERROR_NOT_OPEN, // 34 Object is not open for editing
+ OLE_ERROR_LAUNCH, // 35 Failed to launch server
+ OLE_ERROR_COMM, // 36 Failed to communicate with server
+ OLE_ERROR_TERMINATE, // 37 Error in termination
+ OLE_ERROR_COMMAND, // 38 Error in execute
+ OLE_ERROR_SHOW, // 39 Error in show
+ OLE_ERROR_DOVERB, // 40 Error in sending do verb, or invalid
+ // verb
+ OLE_ERROR_ADVISE_NATIVE, // 41 Item could be missing
+ OLE_ERROR_ADVISE_PICT, // 42 Item could be missing or server doesn't
+ // this format.
+
+ OLE_ERROR_ADVISE_RENAME, // 43 Server doesn't support rename
+ OLE_ERROR_POKE_NATIVE, // 44 Failure of poking native data to server
+ OLE_ERROR_REQUEST_NATIVE, // 45 Server failed to render native data
+ OLE_ERROR_REQUEST_PICT, // 46 Server failed to render presentation
+ // data
+ OLE_ERROR_SERVER_BLOCKED, // 47 Trying to block a blocked server or
+ // trying to revoke a blocked server
+ // or document
+
+ OLE_ERROR_REGISTRATION, // 48 Server is not registered in regestation
+ // data base
+ OLE_ERROR_ALREADY_REGISTERED,//49 Trying to register same doc multiple
+ // times
+ OLE_ERROR_TASK, // 50 Server or client task is invalid
+ OLE_ERROR_OUTOFDATE, // 51 Object is out of date
+ OLE_ERROR_CANT_UPDATE_CLIENT,// 52 embed doc's client doesn't accept
+ // updates
+ OLE_ERROR_UPDATE, // 53 erorr while trying to update
+
+ // Following are warnings
+ OLE_WARN_DELETE_DATA = 1000 // Caller must delete the data when he is
+ // done with it.
+} OLESTATUS;
+
+
+
+// Codes for CallBack events
+typedef enum {
+ OLE_CHANGED, // 0
+ OLE_SAVED, // 1
+ OLE_CLOSED, // 2
+ OLE_RENAMED, // 3
+ OLE_QUERY_PAINT, // 4 Interruptible paint support
+ OLE_RELEASE, // 5 Object is released (asynchronous operation
+ // is completed)
+ OLE_QUERY_RETRY, // 6 Query for retry when server sends busy ACK
+} OLE_NOTIFICATION;
+
+
+typedef enum {
+ OLE_NONE, // 0 no method active
+ OLE_DELETE, // 1 object delete
+ OLE_LNKPASTE, // 2 PasteLink (auto reconnect)
+ OLE_EMBPASTE, // 3 paste (and update)
+ OLE_SHOW, // 4 Show
+ OLE_RUN, // 5 Run
+ OLE_ACTIVATE, // 6 Activate
+ OLE_UPDATE, // 7 Update
+ OLE_CLOSE, // 8 Close
+ OLE_RECONNECT, // 9 Reconnect
+ OLE_SETUPDATEOPTIONS, // 10 setting update options
+ OLE_SERVERUNLAUNCH, // 11 server is being unlaunched
+ OLE_LOADFROMSTREAM, // 12 LoadFromStream (auto reconnect)
+ OLE_SETDATA, // 13 OleSetData
+ OLE_REQUESTDATA, // 14 OleRequestData
+ OLE_OTHER, // 15 other misc async operations
+ OLE_CREATE, // 16 create
+ OLE_CREATEFROMTEMPLATE, // 17 CreatefromTemplate
+ OLE_CREATELINKFROMFILE, // 18 CreateLinkFromFile
+ OLE_COPYFROMLNK, // 19 CopyFromLink (auto reconnect)
+ OLE_CREATEFROMFILE, // 20 CreateFromFile
+} OLE_RELEASE_METHOD;
+
+// rendering options
+typedef enum { olerender_none, olerender_draw, olerender_format } OLEOPT_RENDER;
+
+typedef UINT OLECLIPFORMAT; // standard clipboard format type
+
+
+// Link update options
+typedef enum { oleupdate_always,
+ oleupdate_onsave,
+ oleupdate_oncall,
+#ifdef OLE_INTERNAL
+ oleupdate_onclose
+#endif
+} OLEOPT_UPDATE;
+
+typedef HANDLE HOBJECT;
+typedef LONG LHSERVER;
+typedef LONG LHCLIENTDOC;
+typedef LONG LHSERVERDOC;
+
+typedef struct _OLEOBJECT FAR * LPOLEOBJECT;
+typedef struct _OLESTREAM FAR * LPOLESTREAM;
+typedef struct _OLECLIENT FAR * LPOLECLIENT;
+
+#ifndef OLE_INTERNAL
+// object method table definitions.
+typedef struct _OLEOBJECTVTBL{
+ LPVOID (FAR PASCAL *QueryProtocol) (LPOLEOBJECT, LPSTR);
+ OLESTATUS (FAR PASCAL *Release) (LPOLEOBJECT);
+ OLESTATUS (FAR PASCAL *Show) (LPOLEOBJECT, BOOL);
+ OLESTATUS (FAR PASCAL *DoVerb) (LPOLEOBJECT, UINT, BOOL, BOOL);
+ OLESTATUS (FAR PASCAL *GetData) (LPOLEOBJECT, OLECLIPFORMAT, LPHANDLE);
+ OLESTATUS (FAR PASCAL *SetData) (LPOLEOBJECT, OLECLIPFORMAT, HANDLE);
+ OLESTATUS (FAR PASCAL *SetTargetDevice) (LPOLEOBJECT, HANDLE);
+ OLESTATUS (FAR PASCAL *SetBounds) (LPOLEOBJECT, LPRECT);
+ OLECLIPFORMAT (FAR PASCAL *EnumFormats) (LPOLEOBJECT, OLECLIPFORMAT);
+ OLESTATUS (FAR PASCAL *SetColorScheme) (LPOLEOBJECT, LPLOGPALETTE);
+
+ // Server has to implement only the above methods.
+
+#ifndef SERVERONLY
+ // Extra methods required for client.
+ OLESTATUS (FAR PASCAL *Delete) (LPOLEOBJECT);
+ OLESTATUS (FAR PASCAL *SetHostNames) (LPOLEOBJECT, LPSTR, LPSTR);
+ OLESTATUS (FAR PASCAL *SaveToStream) (LPOLEOBJECT, LPOLESTREAM);
+ OLESTATUS (FAR PASCAL *Clone) (LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *);
+ OLESTATUS (FAR PASCAL *CopyFromLink) (LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *);
+ OLESTATUS (FAR PASCAL *Equal) (LPOLEOBJECT, LPOLEOBJECT);
+ OLESTATUS (FAR PASCAL *CopyToClipboard) (LPOLEOBJECT);
+ OLESTATUS (FAR PASCAL *Draw) (LPOLEOBJECT, HDC, LPRECT, LPRECT, HDC);
+ OLESTATUS (FAR PASCAL *Activate) (LPOLEOBJECT, UINT, BOOL, BOOL, HWND, LPRECT);
+ OLESTATUS (FAR PASCAL *Execute) (LPOLEOBJECT, HANDLE, UINT);
+ OLESTATUS (FAR PASCAL *Close) (LPOLEOBJECT);
+ OLESTATUS (FAR PASCAL *Update) (LPOLEOBJECT);
+ OLESTATUS (FAR PASCAL *Reconnect) (LPOLEOBJECT);
+
+ OLESTATUS (FAR PASCAL *ObjectConvert) (LPOLEOBJECT, LPSTR, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *);
+ OLESTATUS (FAR PASCAL *GetLinkUpdateOptions) (LPOLEOBJECT, OLEOPT_UPDATE FAR *);
+ OLESTATUS (FAR PASCAL *SetLinkUpdateOptions) (LPOLEOBJECT, OLEOPT_UPDATE);
+
+ OLESTATUS (FAR PASCAL *Rename) (LPOLEOBJECT, LPSTR);
+ OLESTATUS (FAR PASCAL *QueryName) (LPOLEOBJECT, LPSTR, UINT FAR *);
+
+ OLESTATUS (FAR PASCAL *QueryType) (LPOLEOBJECT, LPLONG);
+ OLESTATUS (FAR PASCAL *QueryBounds) (LPOLEOBJECT, LPRECT);
+ OLESTATUS (FAR PASCAL *QuerySize) (LPOLEOBJECT, DWORD FAR *);
+ OLESTATUS (FAR PASCAL *QueryOpen) (LPOLEOBJECT);
+ OLESTATUS (FAR PASCAL *QueryOutOfDate) (LPOLEOBJECT);
+
+ OLESTATUS (FAR PASCAL *QueryReleaseStatus) (LPOLEOBJECT);
+ OLESTATUS (FAR PASCAL *QueryReleaseError) (LPOLEOBJECT);
+ OLE_RELEASE_METHOD (FAR PASCAL *QueryReleaseMethod)(LPOLEOBJECT);
+
+ OLESTATUS (FAR PASCAL *RequestData) (LPOLEOBJECT, OLECLIPFORMAT);
+ OLESTATUS (FAR PASCAL *ObjectLong) (LPOLEOBJECT, UINT, LPLONG);
+
+// This method is internal only
+ OLESTATUS (FAR PASCAL *ChangeData) (LPOLEOBJECT, HANDLE, LPOLECLIENT, BOOL);
+#endif
+} OLEOBJECTVTBL;
+typedef OLEOBJECTVTBL FAR *LPOLEOBJECTVTBL;
+
+typedef struct _OLEOBJECT {
+ LPOLEOBJECTVTBL lpvtbl;
+} OLEOBJECT;
+#endif
+
+
+// ole client definitions
+
+typedef struct _OLECLIENTVTBL{
+ int (pascal far *CallBack) (LPOLECLIENT, OLE_NOTIFICATION, LPOLEOBJECT);
+} OLECLIENTVTBL;
+typedef OLECLIENTVTBL FAR *LPOLECLIENTVTBL;
+
+
+typedef struct _OLECLIENT {
+ LPOLECLIENTVTBL lpvtbl;
+} OLECLIENT;
+
+
+
+// Stream definitions
+typedef struct _OLESTREAMVTBL{
+ DWORD (pascal far *Get) (LPOLESTREAM, LPSTR, DWORD);
+ DWORD (pascal far *Put) (LPOLESTREAM, LPSTR, DWORD);
+} OLESTREAMVTBL;
+
+typedef OLESTREAMVTBL FAR *LPOLESTREAMVTBL;
+
+typedef struct _OLESTREAM {
+ LPOLESTREAMVTBL lpstbl;
+} OLESTREAM;
+
+
+// Public Function Prototypes
+OLESTATUS FAR PASCAL OleDelete (LPOLEOBJECT);
+OLESTATUS FAR PASCAL OleRelease (LPOLEOBJECT);
+OLESTATUS FAR PASCAL OleSaveToStream (LPOLEOBJECT, LPOLESTREAM);
+OLESTATUS FAR PASCAL OleEqual (LPOLEOBJECT, LPOLEOBJECT );
+OLESTATUS FAR PASCAL OleCopyToClipboard (LPOLEOBJECT);
+OLESTATUS FAR PASCAL OleSetHostNames (LPOLEOBJECT, LPSTR, LPSTR);
+OLESTATUS FAR PASCAL OleSetTargetDevice (LPOLEOBJECT, HANDLE);
+OLESTATUS FAR PASCAL OleSetBounds (LPOLEOBJECT, LPRECT);
+OLESTATUS FAR PASCAL OleSetColorScheme (LPOLEOBJECT, LPLOGPALETTE);
+OLESTATUS FAR PASCAL OleQueryBounds (LPOLEOBJECT, LPRECT);
+OLESTATUS FAR PASCAL OleQuerySize (LPOLEOBJECT, DWORD FAR *);
+OLESTATUS FAR PASCAL OleDraw (LPOLEOBJECT, HDC, LPRECT, LPRECT, HDC);
+OLESTATUS FAR PASCAL OleQueryOpen (LPOLEOBJECT);
+OLESTATUS FAR PASCAL OleActivate (LPOLEOBJECT, UINT, BOOL, BOOL, HWND, LPRECT);
+OLESTATUS FAR PASCAL OleExecute (LPOLEOBJECT, HANDLE, UINT);
+OLESTATUS FAR PASCAL OleClose (LPOLEOBJECT);
+OLESTATUS FAR PASCAL OleUpdate (LPOLEOBJECT);
+OLESTATUS FAR PASCAL OleReconnect (LPOLEOBJECT);
+
+OLESTATUS FAR PASCAL OleGetLinkUpdateOptions (LPOLEOBJECT, OLEOPT_UPDATE FAR *);
+OLESTATUS FAR PASCAL OleSetLinkUpdateOptions(LPOLEOBJECT, OLEOPT_UPDATE);
+
+
+LPVOID FAR PASCAL OleQueryProtocol (LPOLEOBJECT, LPSTR);
+
+
+// Routines related to asynchronous operations.
+OLESTATUS FAR PASCAL OleQueryReleaseStatus (LPOLEOBJECT);
+OLESTATUS FAR PASCAL OleQueryReleaseError (LPOLEOBJECT);
+OLE_RELEASE_METHOD FAR PASCAL OleQueryReleaseMethod (LPOLEOBJECT);
+
+OLESTATUS FAR PASCAL OleQueryType (LPOLEOBJECT, LPLONG);
+
+// LOW WORD is major version, HIWORD is minor version
+DWORD FAR PASCAL OleQueryClientVersion (void);
+DWORD FAR PASCAL OleQueryServerVersion (void);
+
+// Converting to format (as in clipboard):
+OLECLIPFORMAT FAR PASCAL OleEnumFormats (LPOLEOBJECT, OLECLIPFORMAT);
+
+OLESTATUS FAR PASCAL OleGetData (LPOLEOBJECT, OLECLIPFORMAT, HANDLE FAR *);
+OLESTATUS FAR PASCAL OleSetData (LPOLEOBJECT, OLECLIPFORMAT, HANDLE );
+OLESTATUS FAR PASCAL OleQueryOutOfDate (LPOLEOBJECT);
+OLESTATUS FAR PASCAL OleRequestData (LPOLEOBJECT, OLECLIPFORMAT);
+
+
+// Query apis for creation from clipboard
+OLESTATUS FAR PASCAL OleQueryLinkFromClip (LPSTR, OLEOPT_RENDER, OLECLIPFORMAT);
+OLESTATUS FAR PASCAL OleQueryCreateFromClip (LPSTR, OLEOPT_RENDER, OLECLIPFORMAT);
+
+// Object creation functions
+
+OLESTATUS FAR PASCAL OleCreateFromClip (LPSTR, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *, OLEOPT_RENDER, OLECLIPFORMAT);
+
+OLESTATUS FAR PASCAL OleCreateLinkFromClip (LPSTR, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *, OLEOPT_RENDER, OLECLIPFORMAT);
+
+OLESTATUS FAR PASCAL OleCreateFromFile (LPSTR, LPOLECLIENT, LPSTR, LPSTR, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *, OLEOPT_RENDER, OLECLIPFORMAT);
+
+OLESTATUS FAR PASCAL OleCreateLinkFromFile (LPSTR, LPOLECLIENT, LPSTR, LPSTR, LPSTR, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *, OLEOPT_RENDER, OLECLIPFORMAT);
+
+OLESTATUS FAR PASCAL OleLoadFromStream (LPOLESTREAM, LPSTR, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *);
+
+OLESTATUS FAR PASCAL OleCreate (LPSTR, LPOLECLIENT, LPSTR, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *, OLEOPT_RENDER, OLECLIPFORMAT);
+
+OLESTATUS FAR PASCAL OleCreateFromTemplate (LPSTR, LPOLECLIENT, LPSTR, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *, OLEOPT_RENDER, OLECLIPFORMAT);
+
+OLESTATUS FAR PASCAL OleClone (LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *);
+OLESTATUS FAR PASCAL OleCopyFromLink (LPOLEOBJECT, LPSTR, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *);
+
+OLESTATUS FAR PASCAL OleObjectConvert (LPOLEOBJECT, LPSTR, LPOLECLIENT, LHCLIENTDOC, LPSTR, LPOLEOBJECT FAR *);
+
+OLESTATUS FAR PASCAL OleRename (LPOLEOBJECT, LPSTR);
+OLESTATUS FAR PASCAL OleQueryName (LPOLEOBJECT, LPSTR, UINT FAR *);
+
+
+OLESTATUS FAR PASCAL OleRevokeObject (LPOLECLIENT);
+BOOL FAR PASCAL OleIsDcMeta (HDC);
+
+// client document API
+
+OLESTATUS FAR PASCAL OleRegisterClientDoc (LPSTR, LPSTR, LONG, LHCLIENTDOC FAR *);
+OLESTATUS FAR PASCAL OleRevokeClientDoc (LHCLIENTDOC);
+OLESTATUS FAR PASCAL OleRenameClientDoc (LHCLIENTDOC, LPSTR);
+OLESTATUS FAR PASCAL OleRevertClientDoc (LHCLIENTDOC);
+OLESTATUS FAR PASCAL OleSavedClientDoc (LHCLIENTDOC);
+OLESTATUS FAR PASCAL OleEnumObjects (LHCLIENTDOC, LPOLEOBJECT FAR *);
+
+// server usage definitions
+
+typedef enum {
+ OLE_SERVER_MULTI, // multiple instances
+ OLE_SERVER_SINGLE // single instance (multiple document)
+} OLE_SERVER_USE;
+
+
+// Server API
+
+typedef struct _OLESERVER FAR * LPOLESERVER;
+
+OLESTATUS FAR PASCAL OleRegisterServer (LPSTR, LPOLESERVER, LHSERVER FAR *, HANDLE, OLE_SERVER_USE);
+OLESTATUS FAR PASCAL OleRevokeServer (LHSERVER);
+OLESTATUS FAR PASCAL OleBlockServer (LHSERVER);
+OLESTATUS FAR PASCAL OleUnblockServer (LHSERVER, BOOL FAR *);
+
+
+// APIs to keep server open
+OLESTATUS FAR PASCAL OleLockServer (LPOLEOBJECT, LHSERVER FAR *);
+OLESTATUS FAR PASCAL OleUnlockServer (LHSERVER);
+
+
+// Server document API
+
+typedef struct _OLESERVERDOC FAR * LPOLESERVERDOC;
+
+OLESTATUS FAR PASCAL OleRegisterServerDoc (LHSERVER, LPSTR, LPOLESERVERDOC, LHSERVERDOC FAR *);
+OLESTATUS FAR PASCAL OleRevokeServerDoc (LHSERVERDOC);
+OLESTATUS FAR PASCAL OleRenameServerDoc (LHSERVERDOC, LPSTR);
+OLESTATUS FAR PASCAL OleRevertServerDoc (LHSERVERDOC);
+OLESTATUS FAR PASCAL OleSavedServerDoc (LHSERVERDOC);
+
+
+typedef struct _OLESERVERVTBL{
+ OLESTATUS (FAR PASCAL *Open) (LPOLESERVER, LHSERVERDOC, LPSTR, LPOLESERVERDOC FAR *);
+ // long handle to doc (privtate to DLL)
+ // lp to OLESERVER
+ // document name
+ // place holder for returning oledoc.
+
+
+ OLESTATUS (FAR PASCAL *Create) (LPOLESERVER, LHSERVERDOC, LPSTR, LPSTR, LPOLESERVERDOC FAR *);
+ // long handle to doc (privtate to DLL)
+ // lp to OLESERVER
+ // lp class name
+ // lp doc name
+ // place holder for returning oledoc.
+
+
+ OLESTATUS (FAR PASCAL *CreateFromTemplate) (LPOLESERVER, LHSERVERDOC, LPSTR, LPSTR, LPSTR, LPOLESERVERDOC FAR *);
+
+ // long handle to doc (privtate to DLL)
+ // lp to OLESERVER
+ // lp class name
+ // lp doc name
+ // lp template name
+ // place holder for returning oledoc.
+
+
+ OLESTATUS (FAR PASCAL *Edit) (LPOLESERVER, LHSERVERDOC, LPSTR, LPSTR, LPOLESERVERDOC FAR *);
+
+ // long handle to doc (privtate to DLL)
+ // lp to OLESERVER
+ // lp class name
+ // lp doc name
+ // place holder for returning oledoc.
+
+ OLESTATUS (FAR PASCAL *Exit) (LPOLESERVER);
+
+ // lp OLESERVER
+
+
+ OLESTATUS (FAR PASCAL *Release) (LPOLESERVER);
+ // lp OLESERVER
+
+ OLESTATUS (FAR PASCAL *Execute) (LPOLESERVER, HANDLE);
+ // lp OLESERVER
+ // handle to command strings
+
+} OLESERVERVTBL;
+
+typedef OLESERVERVTBL FAR *LPOLESERVERVTBL;
+typedef struct _OLESERVER {
+ LPOLESERVERVTBL lpvtbl;
+} OLESERVER;
+
+
+typedef struct _OLEDOCMENTVTBL{
+ OLESTATUS (FAR PASCAL *Save) (LPOLESERVERDOC);
+ OLESTATUS (FAR PASCAL *Close) (LPOLESERVERDOC);
+ OLESTATUS (FAR PASCAL *SetHostNames) (LPOLESERVERDOC, LPSTR, LPSTR);
+ OLESTATUS (FAR PASCAL *SetDocDimensions) (LPOLESERVERDOC, LPRECT);
+ OLESTATUS (FAR PASCAL *GetObject) (LPOLESERVERDOC, LPSTR, LPOLEOBJECT FAR *, LPOLECLIENT);
+ OLESTATUS (FAR PASCAL *Release) (LPOLESERVERDOC);
+ OLESTATUS (FAR PASCAL *SetColorScheme) (LPOLESERVERDOC, LPLOGPALETTE);
+ OLESTATUS (FAR PASCAL *Execute) (LPOLESERVERDOC, HANDLE);
+} OLESERVERDOCVTBL;
+
+
+typedef OLESERVERDOCVTBL FAR *LPOLESERVERDOCVTBL;
+typedef struct _OLESERVERDOC {
+ LPOLESERVERDOCVTBL lpvtbl;
+} OLESERVERDOC;
diff --git a/private/oleauto/tools/win16/os2/inc/os2.h b/private/oleauto/tools/win16/os2/inc/os2.h
new file mode 100644
index 000000000..b17b4d3fe
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/os2.h
@@ -0,0 +1,28 @@
+/****************************** Module Header ******************************\
+*
+* Module Name: OS2.H
+*
+* This is the top level include file that includes all the files necessary
+* for writing an OS/2 application.
+*
+* Copyright (c) 1987-1991, Microsoft Corporation. All rights reserved.
+*
+\***************************************************************************/
+
+#define OS2_INCLUDED
+
+/* Common definitions */
+
+#ifndef OS2DEF_INCLUDED /* Only include it once */
+#include <os2def.h>
+#endif
+
+/* OS/2 Base Include File */
+
+#include <bse.h>
+
+/* OS/2 Presentation Manager Include File */
+
+#ifndef INCL_NOPM
+#include <pm.h>
+#endif /* !INCL_NOPM */
diff --git a/private/oleauto/tools/win16/os2/inc/os2def.h b/private/oleauto/tools/win16/os2/inc/os2def.h
new file mode 100644
index 000000000..01ea3b391
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/os2def.h
@@ -0,0 +1,405 @@
+/***************************************************************************\
+*
+* Module Name: OS2DEF.H
+*
+* OS/2 Common Definitions file
+*
+* Copyright (c) 1987-1991, Microsoft Corporation. All rights reserved.
+*
+\***************************************************************************/
+
+/* XLATOFF */
+#define PASCAL pascal
+#define FAR far
+#define NEAR near
+#define VOID void
+/* XLATON */
+
+typedef unsigned short SHANDLE;
+typedef void far *LHANDLE;
+
+/* XLATOFF */
+#define EXPENTRY pascal far _loadds
+#define APIENTRY pascal far
+
+/* Backwards compatability with 1.1 */
+#define CALLBACK pascal far _loadds
+
+#define CHAR char /* ch */
+#define SHORT short /* s */
+#define LONG long /* l */
+#ifndef INCL_SAADEFS
+#define INT int /* i */
+#endif /* !INCL_SAADEFS */
+/* XLATON */
+
+typedef unsigned char UCHAR; /* uch */
+typedef unsigned short USHORT; /* us */
+typedef unsigned long ULONG; /* ul */
+#ifndef INCL_SAADEFS
+typedef unsigned int UINT; /* ui */
+#endif /* !INCL_SAADEFS */
+
+typedef unsigned char BYTE; /* b */
+
+/* define NULL pointer value (must match stdlib.h definition) */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+typedef unsigned char far *PSZ;
+typedef unsigned char near *NPSZ;
+
+typedef unsigned char far *PCH;
+typedef unsigned char near *NPCH;
+
+typedef int (pascal far *PFN)();
+typedef int (pascal near *NPFN)();
+typedef PFN far *PPFN;
+
+typedef BYTE FAR *PBYTE;
+typedef BYTE near *NPBYTE;
+
+typedef CHAR FAR *PCHAR;
+typedef SHORT FAR *PSHORT;
+typedef LONG FAR *PLONG;
+#ifndef INCL_SAADEFS
+typedef INT FAR *PINT;
+#endif /* !INCL_SAADEFS */
+
+typedef UCHAR FAR *PUCHAR;
+typedef USHORT FAR *PUSHORT;
+typedef ULONG FAR *PULONG;
+#ifndef INCL_SAADEFS
+typedef UINT FAR *PUINT;
+#endif /* !INCL_SAADEFS */
+
+typedef VOID FAR *PVOID;
+
+typedef unsigned short BOOL; /* f */
+typedef BOOL FAR *PBOOL;
+
+#define FALSE 0
+#define TRUE 1
+
+#ifndef INCL_SAADEFS
+typedef unsigned short SEL; /* sel */
+typedef SEL FAR *PSEL;
+
+/*** Useful Helper Macros */
+
+/* Create untyped far pointer from selector and offset */
+#define MAKEP(sel, off) ((PVOID)MAKEULONG(off, sel))
+
+/* Extract selector or offset from far pointer */
+#define SELECTOROF(p) (((PUSHORT)&(p))[1])
+#define OFFSETOF(p) (((PUSHORT)&(p))[0])
+#endif /* !INCL_SAADEFS */
+
+/* Cast any variable to an instance of the specified type. */
+#define MAKETYPE(v, type) (*((type far *)&v))
+
+/* Calculate the byte offset of a field in a structure of type type. */
+#define FIELDOFFSET(type, field) ((SHORT)&(((type *)0)->field))
+
+/* Combine l & h to form a 32 bit quantity. */
+#define MAKEULONG(l, h) ((ULONG)(((USHORT)(l)) | ((ULONG)((USHORT)(h))) << 16))
+#define MAKELONG(l, h) ((LONG)MAKEULONG(l, h))
+
+/* Combine l & h to form a 16 bit quantity. */
+#define MAKEUSHORT(l, h) (((USHORT)(l)) | ((USHORT)(h)) << 8)
+#define MAKESHORT(l, h) ((SHORT)MAKEUSHORT(l, h))
+
+/* Extract high and low order parts of 16 and 32 bit quantity */
+#define LOBYTE(w) LOUCHAR(w)
+#define HIBYTE(w) HIUCHAR(w)
+#define LOUCHAR(w) ((UCHAR)(w))
+#define HIUCHAR(w) ((UCHAR)(((USHORT)(w) >> 8) & 0xff))
+#define LOUSHORT(l) ((USHORT)(l))
+#define HIUSHORT(l) ((USHORT)(((ULONG)(l) >> 16) & 0xffff))
+
+/*** Common Error definitions ****/
+
+typedef ULONG ERRORID; /* errid */
+typedef ERRORID FAR *PERRORID;
+
+/* Combine severity and error code to produce ERRORID */
+#define MAKEERRORID(sev, error) (ERRORID)(MAKEULONG((error), (sev)))
+/* Extract error number from an errorid */
+#define ERRORIDERROR(errid) (LOUSHORT(errid))
+/* Extract severity from an errorid */
+#define ERRORIDSEV(errid) (HIUSHORT(errid))
+
+/* Severity codes */
+#define SEVERITY_NOERROR 0x0000
+#define SEVERITY_WARNING 0x0004
+#define SEVERITY_ERROR 0x0008
+#define SEVERITY_SEVERE 0x000C
+#define SEVERITY_UNRECOVERABLE 0x0010
+
+/* Base component error values */
+
+#define WINERR_BASE 0x1000 /* Window Manager */
+#define GPIERR_BASE 0x2000 /* Graphics Presentation Interface */
+#define DEVERR_BASE 0x3000 /* Device Manager */
+#define SPLERR_BASE 0x4000 /* Spooler */
+
+/*** Common types used across components */
+
+/*** Common DOS types */
+
+typedef USHORT HMODULE; /* hmod */
+typedef HMODULE FAR *PHMODULE;
+
+#ifndef INCL_SAADEFS
+typedef USHORT PID; /* pid */
+typedef PID FAR *PPID;
+
+typedef USHORT TID; /* tid */
+typedef TID FAR *PTID;
+
+typedef VOID FAR *HSEM; /* hsem */
+typedef HSEM FAR *PHSEM;
+#endif /* !INCL_SAADEFS */
+
+/*** Common SUP types */
+
+typedef LHANDLE HAB; /* hab */
+typedef HAB FAR *PHAB;
+
+/*** Common GPI/DEV types */
+
+typedef LHANDLE HPS; /* hps */
+typedef HPS FAR *PHPS;
+
+typedef LHANDLE HDC; /* hdc */
+typedef HDC FAR *PHDC;
+
+typedef LHANDLE HRGN; /* hrgn */
+typedef HRGN FAR *PHRGN;
+
+typedef LHANDLE HBITMAP; /* hbm */
+typedef HBITMAP FAR *PHBITMAP;
+
+typedef LHANDLE HMF; /* hmf */
+typedef HMF FAR *PHMF;
+
+typedef LONG COLOR; /* clr */
+typedef COLOR FAR *PCOLOR;
+
+typedef struct _POINTL { /* ptl */
+ LONG x;
+ LONG y;
+} POINTL;
+typedef POINTL FAR *PPOINTL;
+typedef POINTL near *NPPOINTL;
+
+typedef struct _POINTS { /* pts */
+ SHORT x;
+ SHORT y;
+} POINTS;
+typedef POINTS FAR *PPOINTS;
+
+typedef struct _RECTL { /* rcl */
+ LONG xLeft;
+ LONG yBottom;
+ LONG xRight;
+ LONG yTop;
+} RECTL;
+typedef RECTL FAR *PRECTL;
+typedef RECTL near *NPRECTL;
+
+typedef CHAR STR8[8]; /* str8 */
+typedef STR8 FAR *PSTR8;
+
+/*** common DEV/SPL types */
+
+/* structure for Device Driver data */
+
+typedef struct _DRIVDATA { /* driv */
+ LONG cb;
+ LONG lVersion;
+ CHAR szDeviceName[32];
+ CHAR abGeneralData[1];
+} DRIVDATA;
+typedef DRIVDATA far *PDRIVDATA;
+
+/* array indices for array parameter for DevOpenDC, SplQmOpen or SplQpOpen */
+
+#define ADDRESS 0
+#ifndef INCL_SAADEFS
+#define DRIVER_NAME 1
+#define DRIVER_DATA 2
+#define DATA_TYPE 3
+#define COMMENT 4
+#define PROC_NAME 5
+#define PROC_PARAMS 6
+#define SPL_PARAMS 7
+#define NETWORK_PARAMS 8
+#endif /* !INCL_SAADEFS */
+
+/* structure definition as an alternative of the array parameter */
+
+typedef struct _DEVOPENSTRUC { /* dop */
+ PSZ pszLogAddress;
+ PSZ pszDriverName;
+ PDRIVDATA pdriv;
+ PSZ pszDataType;
+ PSZ pszComment;
+ PSZ pszQueueProcName;
+ PSZ pszQueueProcParams;
+ PSZ pszSpoolerParams;
+ PSZ pszNetworkParams;
+} DEVOPENSTRUC;
+typedef DEVOPENSTRUC FAR *PDEVOPENSTRUC;
+
+/*** common AVIO/GPI types */
+
+/* values of fsSelection field of FATTRS structure */
+#define FATTR_SEL_ITALIC 0x0001
+#define FATTR_SEL_UNDERSCORE 0x0002
+#define FATTR_SEL_OUTLINE 0x0008 /* Hollow Outline Font */
+#define FATTR_SEL_STRIKEOUT 0x0010
+#define FATTR_SEL_BOLD 0x0020
+
+/* values of fsType field of FATTRS structure */
+#define FATTR_TYPE_KERNING 0x0004
+#define FATTR_TYPE_MBCS 0x0008
+#define FATTR_TYPE_DBCS 0x0010
+#define FATTR_TYPE_ANTIALIASED 0x0020
+
+/* values of fsFontUse field of FATTRS structure */
+#define FATTR_FONTUSE_NOMIX 0x0002
+#define FATTR_FONTUSE_OUTLINE 0x0004
+#define FATTR_FONTUSE_TRANSFORMABLE 0x0008
+
+
+/* size for fields in the font structures */
+
+#define FACESIZE 32
+
+/* font struct for Vio/GpiCreateLogFont */
+
+typedef struct _FATTRS { /* fat */
+ USHORT usRecordLength;
+ USHORT fsSelection;
+ LONG lMatch;
+ CHAR szFacename[FACESIZE];
+ USHORT idRegistry;
+ USHORT usCodePage;
+ LONG lMaxBaselineExt;
+ LONG lAveCharWidth;
+ USHORT fsType;
+ USHORT fsFontUse;
+} FATTRS;
+typedef FATTRS far *PFATTRS;
+
+/* values of fsType field of FONTMETRICS structure */
+#define FM_TYPE_FIXED 0x0001
+#define FM_TYPE_LICENSED 0x0002
+#define FM_TYPE_KERNING 0x0004
+#define FM_TYPE_DBCS 0x0010
+#define FM_TYPE_MBCS 0x0018
+#define FM_TYPE_64K 0x8000
+
+/* values of fsDefn field of FONTMETRICS structure */
+#define FM_DEFN_OUTLINE 0x0001
+#define FM_DEFN_GENERIC 0x8000
+
+/* values of fsSelection field of FONTMETRICS structure */
+#define FM_SEL_ITALIC 0x0001
+#define FM_SEL_UNDERSCORE 0x0002
+#define FM_SEL_NEGATIVE 0x0004
+#define FM_SEL_OUTLINE 0x0008 /* Hollow Outline Font */
+#define FM_SEL_STRIKEOUT 0x0010
+#define FM_SEL_BOLD 0x0020
+
+/* values of fsCapabilities field of FONTMETRICS structure */
+#define FM_CAP_NOMIX 0x0001
+
+/* font metrics returned by GpiQueryFonts and others */
+
+typedef struct _FONTMETRICS { /* fm */
+ CHAR szFamilyname[FACESIZE];
+ CHAR szFacename[FACESIZE];
+ USHORT idRegistry;
+ USHORT usCodePage;
+ LONG lEmHeight;
+ LONG lXHeight;
+ LONG lMaxAscender;
+ LONG lMaxDescender;
+ LONG lLowerCaseAscent;
+ LONG lLowerCaseDescent;
+ LONG lInternalLeading;
+ LONG lExternalLeading;
+ LONG lAveCharWidth;
+ LONG lMaxCharInc;
+ LONG lEmInc;
+ LONG lMaxBaselineExt;
+ SHORT sCharSlope;
+ SHORT sInlineDir;
+ SHORT sCharRot;
+ USHORT usWeightClass;
+ USHORT usWidthClass;
+ SHORT sXDeviceRes;
+ SHORT sYDeviceRes;
+ SHORT sFirstChar;
+ SHORT sLastChar;
+ SHORT sDefaultChar;
+ SHORT sBreakChar;
+ SHORT sNominalPointSize;
+ SHORT sMinimumPointSize;
+ SHORT sMaximumPointSize;
+ USHORT fsType;
+ USHORT fsDefn;
+ USHORT fsSelection;
+ USHORT fsCapabilities;
+ LONG lSubscriptXSize;
+ LONG lSubscriptYSize;
+ LONG lSubscriptXOffset;
+ LONG lSubscriptYOffset;
+ LONG lSuperscriptXSize;
+ LONG lSuperscriptYSize;
+ LONG lSuperscriptXOffset;
+ LONG lSuperscriptYOffset;
+ LONG lUnderscoreSize;
+ LONG lUnderscorePosition;
+ LONG lStrikeoutSize;
+ LONG lStrikeoutPosition;
+ SHORT sKerningPairs;
+ SHORT sFamilyClass;
+ LONG lMatch;
+} FONTMETRICS;
+typedef FONTMETRICS far *PFONTMETRICS;
+
+/*** Common WIN types */
+
+typedef LHANDLE HWND; /* hwnd */
+typedef HWND FAR *PHWND;
+
+typedef struct _WRECT { /* wrc */
+ SHORT xLeft;
+ SHORT dummy1;
+ SHORT yBottom;
+ SHORT dummy2;
+ SHORT xRight;
+ SHORT dummy3;
+ SHORT yTop;
+ SHORT dummy4;
+} WRECT;
+typedef WRECT FAR *PWRECT;
+typedef WRECT near *NPWRECT;
+
+typedef struct _WPOINT { /* wpt */
+ SHORT x;
+ SHORT dummy1;
+ SHORT y;
+ SHORT dummy2;
+} WPOINT;
+typedef WPOINT FAR *PWPOINT;
+typedef WPOINT near *NPWPOINT;
diff --git a/private/oleauto/tools/win16/os2/inc/ostream.h b/private/oleauto/tools/win16/os2/inc/ostream.h
new file mode 100644
index 000000000..cc431f06f
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ostream.h
@@ -0,0 +1,119 @@
+/***
+*ostream.h - definitions/declarations for the ostream class
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the ostream class.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_OSTREAM
+#define _INC_OSTREAM
+
+#include <ios.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+typedef long streamoff, streampos;
+
+class ostream: /* virtual */ public ios {
+
+public:
+ ostream(streambuf*);
+ virtual ~ostream();
+
+ ostream& flush();
+ int opfx();
+ void osfx();
+
+inline ostream& operator<<(ostream& (*f)(ostream&));
+inline ostream& operator<<(ios& (*f)(ios&));
+ ostream& operator<<(const char*);
+inline ostream& operator<<(const unsigned char*);
+inline ostream& operator<<(const signed char*);
+inline ostream& operator<<(char);
+ ostream& operator<<(unsigned char);
+inline ostream& operator<<(signed char);
+ ostream& operator<<(short);
+ ostream& operator<<(unsigned short);
+ ostream& operator<<(int);
+ ostream& operator<<(unsigned int);
+ ostream& operator<<(long);
+ ostream& operator<<(unsigned long);
+inline ostream& operator<<(float);
+ ostream& operator<<(double);
+ ostream& operator<<(long double);
+ ostream& operator<<(void*);
+ ostream& operator<<(streambuf*);
+inline ostream& put(char);
+ ostream& put(unsigned char);
+inline ostream& put(signed char);
+ ostream& write(const char *,int);
+inline ostream& write(const unsigned char *,int);
+inline ostream& write(const signed char *,int);
+ ostream& seekp(streampos);
+ ostream& seekp(streamoff,ios::seek_dir);
+ streampos tellp();
+
+protected:
+ ostream();
+ int do_opfx(int); // not used
+ void do_osfx(); // not used
+
+private:
+ ostream(ostream&);
+ ostream(ios&);
+ void operator=(ostream&);
+ ostream& writepad(const char *, const char *);
+ int x_floatused;
+};
+
+inline ostream& ostream::operator<<(ostream& (*f)(ostream&)) { (*f)(*this); return *this; }
+inline ostream& ostream::operator<<(ios& (*f)(ios& )) { (*f)(*this); return *this; }
+
+inline ostream& ostream::operator<<(char c) { return operator<<((unsigned char) c); }
+inline ostream& ostream::operator<<(signed char c) { return operator<<((unsigned char) c); }
+
+inline ostream& ostream::operator<<(const unsigned char* s) { return operator<<((const char*) s); }
+inline ostream& ostream::operator<<(const signed char* s) { return operator<<((const char*) s); }
+
+inline ostream& ostream::operator<<(float f) { x_floatused = 1; return operator<<((double) f); }
+
+inline ostream& ostream::put(char c) { return put((unsigned char) c); }
+inline ostream& ostream::put(signed char c) { return put((unsigned char) c); }
+
+inline ostream& ostream::write(const unsigned char * s, int n) { return write((char*) s, n); }
+inline ostream& ostream::write(const signed char * s, int n) { return write((char*) s, n); }
+
+
+class ostream_withassign : public ostream {
+ public: // not in spec.
+ ostream_withassign();
+ ostream_withassign(streambuf* _is);
+ ~ostream_withassign(); // not in spec.
+ ostream& operator=(const ostream&);
+ ostream& operator=(streambuf*);
+};
+
+#if ((!defined(_WINDOWS)) || defined(_QWIN))
+extern ostream_withassign cout;
+extern ostream_withassign cerr;
+extern ostream_withassign clog;
+#endif
+
+inline ostream& flush(ostream& _outs) { return _outs.flush(); }
+inline ostream& endl(ostream& _outs) { return _outs << '\n' << flush; }
+inline ostream& ends(ostream& _outs) { return _outs << char('\0'); }
+
+ios& dec(ios&);
+ios& hex(ios&);
+ios& oct(ios&);
+
+// Restore default packing
+#pragma pack()
+
+#endif // !_INC_OSTREAM
diff --git a/private/oleauto/tools/win16/os2/inc/pgchart.h b/private/oleauto/tools/win16/os2/inc/pgchart.h
new file mode 100644
index 000000000..5be26e358
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pgchart.h
@@ -0,0 +1,256 @@
+/***
+*pgchart.h - Declare constants, functions and macros for charting library.
+*
+* Copyright (c) 1988-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file declares the presentation graphics library functions and
+* the structures and manifest constants that are used with them.
+*
+***************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" { /* allow use with C++ */
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+/* Force word alignment to avoid possible -Zp override */
+#pragma pack(2)
+
+
+/* Required for the missing value definition */
+#ifndef FLT_MAX
+#define FLT_MAX 3.402823466e+38F /* max value */
+#endif
+
+#define _PG_PALETTELEN 16 /* Number of entries in internal palette */
+#define _PG_MAXCHARTTYPE 5 /* Maximum available chart type */
+#define _PG_MAXCHARTSTYLE 2 /* Maximum chart style */
+#define _PG_TITLELEN 70 /* Maximum title text length */
+
+#define _PG_LEFT 1 /* Positions used for titles and legends */
+#define _PG_CENTER 2
+#define _PG_RIGHT 3
+#define _PG_BOTTOM 4
+#define _PG_OVERLAY 5
+
+#define _PG_LINEARAXIS 1 /* Used to specify axis types */
+#define _PG_LOGAXIS 2
+
+#define _PG_DECFORMAT 1 /* Used to specify tic mark label format */
+#define _PG_EXPFORMAT 2
+
+#define _PG_BARCHART 1 /* Charttype for a bar chart */
+#define _PG_COLUMNCHART 2 /* Charttype for a column chart */
+#define _PG_PLAINBARS 1 /* Styles for bar and column charts */
+#define _PG_STACKEDBARS 2
+
+#define _PG_LINECHART 3 /* Charttype for a line chart */
+#define _PG_SCATTERCHART 4 /* Charttype for a scatter chart */
+#define _PG_POINTANDLINE 1 /* Styles for line and scatter charts */
+#define _PG_POINTONLY 2
+
+#define _PG_PIECHART 5 /* Charttype for pie chart */
+#define _PG_PERCENT 1 /* Styles for pie charts */
+#define _PG_NOPERCENT 2
+
+#define _PG_MISSINGVALUE (-FLT_MAX) /* Indicates missing data values */
+
+
+/* Error codes */
+
+/* Numbers greater than 100 will terminate chart routine, others will cause
+ * default values to be used
+ */
+#define _PG_NOTINITIALIZED 102 /* If library not initialized */
+#define _PG_BADSCREENMODE 103 /* Graphics mode not set before charting */
+#define _PG_BADCHARTSTYLE 04 /* Chart style invalid */
+#define _PG_BADCHARTTYPE 104 /* Chart type invalid */
+#define _PG_BADLEGENDWINDOW 105 /* Invalid legend window specified */
+#define _PG_BADCHARTWINDOW 07 /* x1=x2 or y1=y2 in chart window spec. */
+#define _PG_BADDATAWINDOW 107 /* If chart window is too small */
+#define _PG_NOMEMORY 108 /* Not enough memory for data arrays */
+#define _PG_BADLOGBASE 05 /* Log base <= 0 */
+#define _PG_BADSCALEFACTOR 06 /* Scale factor = 0 */
+#define _PG_TOOSMALLN 109 /* Number of data points <= 0 */
+#define _PG_TOOFEWSERIES 110 /* Number of series <= 0 */
+
+
+/* Typedefs */
+
+/* Typedef for chart title */
+#ifndef _TITLETYPE_DEFINED
+typedef struct {
+ char title[_PG_TITLELEN]; /* Title text */
+ short titlecolor; /* Internal palette color for title text */
+ short justify; /* _PG_LEFT, _PG_CENTER, _PG_RIGHT */
+} _titletype;
+#define _TITLETYPE_DEFINED
+#endif
+
+/* Typedef for chart axes */
+#ifndef _AXISTYPE_DEFINED
+typedef struct {
+ short grid; /* TRUE=grid lines drawn; FALSE no lines */
+ short gridstyle; /* Style number from style pool for grid lines */
+ _titletype axistitle; /* Title definition for axis */
+ short axiscolor; /* Color for axis */
+ short labeled; /* TRUE=tic marks and titles drawn */
+ short rangetype; /* _PG_LINEARAXIS, _PG_LOGAXIS */
+ float logbase; /* Base used if log axis */
+ short autoscale; /* TRUE=next 7 values calculated by system */
+ float scalemin; /* Minimum value of scale */
+ float scalemax; /* Maximum value of scale */
+ float scalefactor; /* Scale factor for data on this axis */
+ _titletype scaletitle; /* Title definition for scaling factor */
+ float ticinterval; /* Distance between tic marks (world coord.) */
+ short ticformat; /* _PG_EXPFORMAT or _PG_DECFORMAT for tic labels */
+ short ticdecimals; /* Number of decimals for tic labels (max=9)*/
+} _axistype;
+#define _AXISTYPE_DEFINED
+#endif
+
+/* Typedef used for defining chart and data windows */
+#ifndef _WINDOWTYPE_DEFINED
+typedef struct {
+ short x1; /* Left edge of window in pixels */
+ short y1; /* Top edge of window in pixels */
+ short x2; /* Right edge of window in pixels */
+ short y2; /* Bottom edge of window in pixels */
+ short border; /* TRUE for border, FALSE otherwise */
+ short background; /* Internal palette color for window bgnd */
+ short borderstyle; /* Style bytes for window border */
+ short bordercolor; /* Internal palette color for window border */
+} _windowtype;
+#define _WINDOWTYPE_DEFINED
+#endif
+
+/* Typedef for legend definition */
+#ifndef _LEGENDTYPE_DEFINED
+typedef struct {
+ short legend; /* TRUE=draw legend; FALSE=no legend */
+ short place; /* _PG_RIGHT, _PG_BOTTOM, _PG_OVERLAY */
+ short textcolor; /* Internal palette color for text */
+ short autosize; /* TRUE=system calculates size */
+ _windowtype legendwindow; /* Window definition for legend */
+} _legendtype;
+#define _LEGENDTYPE_DEFINED
+#endif
+
+/* Typedef for legend definition */
+#ifndef _CHARTENV_DEFINED
+typedef struct {
+ short charttype; /* _PG_BARCHART, _PG_COLUMNCHART,
+ _PG_LINECHART, _PG_SCATTERCHART,
+ _PG_PIECHART */
+ short chartstyle; /* Style for selected chart type */
+ _windowtype chartwindow; /* Window definition for overall chart */
+ _windowtype datawindow; /* Window definition for data part of chart */
+ _titletype maintitle; /* Main chart title */
+ _titletype subtitle; /* Chart sub-title */
+ _axistype xaxis; /* Definition for X-axis */
+ _axistype yaxis; /* Definition for Y-axis */
+ _legendtype legend; /* Definition for legend */
+} _chartenv;
+#define _CHARTENV_DEFINED
+#endif
+
+/* Typedef for character bitmap */
+#ifndef _CHARMAP_DEFINED
+typedef unsigned char _charmap[8];
+#define _CHARMAP_DEFINED
+#endif
+
+/* Typedef for pattern bitmap */
+#ifndef _FILLMAP_DEFINED
+typedef unsigned char _fillmap[8];
+#define _FILLMAP_DEFINED
+#endif
+
+/* Typedef for palette entry definition */
+#ifndef _PALETTEENTRY_DEFINED
+typedef struct {
+ unsigned short color;
+ unsigned short style;
+ _fillmap fill;
+ char plotchar;
+} _paletteentry;
+#define _PALETTEENTRY_DEFINED
+#endif
+
+/* Typedef for palette definition */
+#ifndef _PALETTETYPE_DEFINED
+typedef _paletteentry _palettetype[_PG_PALETTELEN];
+#define _PALETTETYPE_DEFINED
+#endif
+
+/* Typedef for style sets */
+#ifndef _STYLESET_DEFINED
+typedef unsigned short _styleset[_PG_PALETTELEN];
+#define _STYLESET_DEFINED
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define titletype _titletype
+#define axistype _axistype
+#define windowtype _windowtype
+#define legendtype _legendtype
+#define chartenv _chartenv
+#define charmap _charmap
+#define fillmap _fillmap
+#define paletteentry _paletteentry
+#define palettetype _palettetype
+#define styleset _styleset
+#endif
+
+
+/* Function prototypes for charting routines */
+
+short __far __cdecl _pg_initchart(void);
+short __far __cdecl _pg_defaultchart(_chartenv __far *, short, short);
+
+short __far __cdecl _pg_chart(_chartenv __far *, const char __far * const __far *, const float __far *, short);
+short __far __cdecl _pg_chartms(_chartenv __far *, const char __far * const __far *, const float __far *, short, short, short, const char __far * const __far *);
+
+short __far __cdecl _pg_chartscatter(_chartenv __far *, const float __far *, const float __far *, short);
+short __far __cdecl _pg_chartscatterms(_chartenv __far *, const float __far *, const float __far *, short, short, short, const char __far * const __far *);
+
+short __far __cdecl _pg_chartpie(_chartenv __far *, const char __far * const __far *, const float __far *, const short __far *, short);
+
+/* Function prototypes for support routines */
+
+short __far __cdecl _pg_hlabelchart(_chartenv __far *, short, short, short, const char __far *);
+short __far __cdecl _pg_vlabelchart(_chartenv __far *, short, short, short, const char __far *);
+
+short __far __cdecl _pg_analyzechart(_chartenv __far *, const char __far * const __far *, const float __far *, short);
+short __far __cdecl _pg_analyzechartms(_chartenv __far *, const char __far * const __far *, const float __far *, short, short, short, const char __far * const __far *);
+
+short __far __cdecl _pg_analyzescatter(_chartenv __far *, const float __far *, const float __far *, short);
+short __far __cdecl _pg_analyzescatterms(_chartenv __far *, const float __far *, const float __far *, short, short, short, const char __far * const __far *);
+
+short __far __cdecl _pg_analyzepie(_chartenv __far *, const char __far * const __far *, const float __far *, const short __far *, short);
+
+short __far __cdecl _pg_getpalette(_paletteentry __far *);
+short __far __cdecl _pg_setpalette(const _paletteentry __far *);
+short __far __cdecl _pg_resetpalette(void);
+
+void __far __cdecl _pg_getstyleset(unsigned short __far *);
+void __far __cdecl _pg_setstyleset(const unsigned short __far *);
+void __far __cdecl _pg_resetstyleset(void);
+
+short __far __cdecl _pg_getchardef(short, unsigned char __far *);
+short __far __cdecl _pg_setchardef(short, const unsigned char __far *);
+
+
+/* Restore default packing */
+#pragma pack()
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/pm.h b/private/oleauto/tools/win16/os2/inc/pm.h
new file mode 100644
index 000000000..236ac482b
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pm.h
@@ -0,0 +1,82 @@
+/****************************** Module Header ******************************\
+*
+* Module Name: PM.H
+*
+* This is the top level include file for Presentation Manager
+*
+* Copyright (c) 1989-1991, Microsoft Corporation. All rights reserved.
+*
+* =======================================================================
+* The following symbols are used in this file for conditional sections.
+*
+* INCL_PM - ALL of OS/2 Presentation Manager
+* INCL_WIN - OS/2 Window Manager
+* INCL_GPI - OS/2 GPI
+* INCL_DEV - OS/2 Device Support
+* INCL_AVIO - OS/2 Advanced VIO
+* INCL_SPL - OS/2 Spooler
+* INCL_PIC - OS/2 Picture utilities
+* INCL_ORDERS - OS/2 Graphical Order Formats
+* INCL_BITMAPFILEFORMAT - OS/2 Bitmap File Format
+* INCL_FONTFILEFORMAT - OS/2 Font File Format
+* INCL_ERRORS - OS/2 Errors
+*
+\***************************************************************************/
+
+/* if INCL_PM defined then define all the symbols */
+#ifdef INCL_PM
+ #define INCL_WIN
+ #define INCL_GPI
+ #define INCL_DEV
+ #define INCL_AVIO
+ #define INCL_SPL
+ #define INCL_PIC
+ #define INCL_ORDERS
+ #define INCL_BITMAPFILEFORMAT
+ #define INCL_FONTFILEFORMAT
+ #define INCL_WINSTDSPIN
+ #define INCL_WINSTDDRAG
+ #define INCL_ERRORS
+#endif /* INCL_PM */
+
+#include <pmwin.h> /* OS/2 Window Manager definitions */
+#include <pmgpi.h> /* OS/2 GPI definitions */
+#include <pmdev.h> /* OS/2 Device Context definitions */
+
+#ifdef INCL_AVIO
+#ifndef PMAVIO_INCLUDED /* Only include it once */
+#include <pmavio.h> /* OS/2 AVIO definitions */
+#endif
+#endif
+
+#ifdef INCL_SPL
+#include <pmspl.h> /* OS/2 Spooler definitions */
+#endif
+
+#ifdef INCL_PIC
+#ifndef PMPIC_INCLUDED /* Only include it once */
+#include <pmpic.h> /* OS/2 Picture Utilities definitions */
+#endif
+#endif
+
+#ifdef INCL_ORDERS
+#ifndef PMORD_INCLUDED /* Only include it once */
+#include <pmord.h> /* OS/2 Graphical Order Formats */
+#endif
+#endif
+
+#ifdef INCL_BITMAPFILEFORMAT
+#ifndef PMBITMAP_INCLUDED /* Only include it once */
+#include <pmbitmap.h> /* OS/2 Bitmap File Format definition */
+#endif
+#endif
+
+#ifdef INCL_FONTFILEFORMAT
+#ifndef PMFONT_INCLUDED /* Only include it once */
+#include <pmfont.h> /* OS/2 Font File Format definition */
+#endif
+#endif
+
+#if (defined(INCL_WINSTDSPIN)||defined(INCL_WINSTDDRAG))
+#include <pmstddlg.h> /* OS/2 Standard Dialog definitions */
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/pmavio.h b/private/oleauto/tools/win16/os2/inc/pmavio.h
new file mode 100644
index 000000000..e7fd146ee
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmavio.h
@@ -0,0 +1,39 @@
+/***************************************************************************\
+*
+* Module Name: PMAVIO.H
+*
+* OS/2 Presentation Manager AVIO constants, types and function declarations
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+\***************************************************************************/
+
+/* common types, constants and function declarations */
+
+typedef USHORT HVPS; /* hpvs */
+typedef HVPS far *PHVPS; /* phpvs */
+
+
+USHORT APIENTRY VioAssociate(HDC hdc, HVPS hvps);
+USHORT APIENTRY VioCreateLogFont(PFATTRS pfatattrs, LONG llcid, PSTR8 pName, HVPS hvps);
+USHORT APIENTRY VioCreatePS(PHVPS phvps, SHORT sdepth, SHORT swidth
+ , SHORT sFormat, SHORT sAttrs, HVPS hvpsReserved);
+USHORT APIENTRY VioDeleteSetId(LONG llcid, HVPS hvps);
+USHORT APIENTRY VioDestroyPS(HVPS hvps);
+USHORT APIENTRY VioGetDeviceCellSize(PSHORT psHeight, PSHORT psWidth, HVPS hvps);
+USHORT APIENTRY VioGetOrg(PSHORT psRow, PSHORT psColumn, HVPS hvps);
+USHORT APIENTRY VioQueryFonts(PLONG plRemfonts, PFONTMETRICS afmMetrics
+ , LONG lMetricsLength, PLONG plFonts
+ , PSZ pszFacename, ULONG flOptions, HVPS hvps);
+USHORT APIENTRY VioQuerySetIds(PLONG allcids, PSTR8 pNames
+ , PLONG alTypes, LONG lcount, HVPS hvps);
+USHORT APIENTRY VioSetDeviceCellSize(SHORT sHeight, SHORT sWidth, HVPS hvps);
+USHORT APIENTRY VioSetOrg(SHORT sRow, SHORT sColumn, HVPS hvps);
+USHORT APIENTRY VioShowPS(SHORT sDepth, SHORT sWidth, SHORT soffCell, HVPS hvps);
+
+/************************ Public Function ******************************\
+ * WinDefAVioWindowProc -- Default message processing for AVio PS's
+\***********************************************************************/
+
+MRESULT EXPENTRY WinDefAVioWindowProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
diff --git a/private/oleauto/tools/win16/os2/inc/pmbitmap.h b/private/oleauto/tools/win16/os2/inc/pmbitmap.h
new file mode 100644
index 000000000..aeabf0520
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmbitmap.h
@@ -0,0 +1,55 @@
+/***************************************************************************\
+*
+* Module Name: PMBITMAP.H
+*
+* OS/2 Presentation Manager Bit Map, Icon and Pointer type declarations.
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+\***************************************************************************/
+
+/*
+ * This is the file format structure for Bit Maps, Pointers and Icons
+ * as stored in the resource file of a PM application.
+ *
+ * Notes on file format:
+ * Each BITMAPFILEHEADER entry is immediately followed by the color table
+ * for the bit map bits it references.
+ * Icons and Pointers contain two BITMAPFILEHEADERs for each ARRAYHEADER
+ * item. The first one is for the ANDXOR mask, the second is for the
+ * COLOR mask. All offsets are absolute based on the start of the FILE.
+ */
+typedef struct _BITMAPFILEHEADER { /* bfh */
+ USHORT usType;
+ ULONG cbSize;
+ SHORT xHotspot;
+ SHORT yHotspot;
+ ULONG offBits;
+ BITMAPINFOHEADER bmp;
+} BITMAPFILEHEADER;
+typedef BITMAPFILEHEADER FAR *PBITMAPFILEHEADER;
+
+/*
+ * This is the 1.2 device independent format header
+ */
+typedef struct _BITMAPARRAYFILEHEADER { /* bafh */
+ USHORT usType;
+ ULONG cbSize;
+ ULONG offNext;
+ USHORT cxDisplay;
+ USHORT cyDisplay;
+ BITMAPFILEHEADER bfh;
+} BITMAPARRAYFILEHEADER;
+typedef BITMAPARRAYFILEHEADER FAR *PBITMAPARRAYFILEHEADER;
+
+/*
+ * These are the identifying values that go in the usType field of the
+ * BITMAPFILEHEADER and BITMAPARRAYFILEHEADER. (BFT_ => Bit map File Type)
+ */
+#define BFT_ICON 0x4349 /* 'IC' */
+#define BFT_BMAP 0x4d42 /* 'BM' */
+#define BFT_POINTER 0x5450 /* 'PT' */
+#define BFT_COLORICON 0x4943 /* 'CI' */
+#define BFT_COLORPOINTER 0x5043 /* 'CP' */
+#define BFT_BITMAPARRAY 0x4142 /* 'BA' */
diff --git a/private/oleauto/tools/win16/os2/inc/pmdev.h b/private/oleauto/tools/win16/os2/inc/pmdev.h
new file mode 100644
index 000000000..bf96439e4
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmdev.h
@@ -0,0 +1,293 @@
+/***************************************************************************\
+*
+* Module Name: PMDEV.H
+*
+* OS/2 Presentation Manager Device Context constants, types and
+* function declarations
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+* =======================================================================
+*
+* The folowing symbols are used in this file for conditional sections.
+*
+* INCL_DEVERRORS - defined if INCL_ERRORS defined
+*
+* There is a symbol used in this file called INCL_DDIDEFS. This is used to
+* include only the definitions for the DDI. The programmer using the GPI
+* can ignore this symbol
+*
+* There is a symbol used in this file called INCL_SAADEFS. This is used to
+* include only the definitions for the SAA. The programmer using the GPI
+* can ignore this symbol
+*
+\***************************************************************************/
+
+#ifdef INCL_ERRORS /* if errors are required then allow DEV errors */
+ #define INCL_DEVERRORS
+#endif /* INCL_ERRORS */
+
+#ifdef INCL_DDIDEFS /* if only DDI required then enable all of DEV */
+ #define INCL_DEV
+#endif /* INCL_DDIDEFS */
+
+#ifdef INCL_SAADEFS /* if only SAA required then enable all of DEV */
+ #define INCL_DEV
+#endif /* INCL_SAADEFS */
+
+#if (defined(INCL_DEV) || !defined(INCL_NOCOMMON))
+
+/* General DEV return values */
+#define DEV_ERROR 0L
+#define DEV_OK 1L
+
+/* pointer data for DevOpenDC */
+typedef PSZ FAR *PDEVOPENDATA;
+
+/* DC type for DevOpenDC */
+#define OD_QUEUED 2L
+#define OD_DIRECT 5L
+#define OD_INFO 6L
+#define OD_METAFILE 7L
+#define OD_MEMORY 8L
+#define OD_METAFILE_NOQUERY 9L
+
+/* codes for DevQueryCaps */
+#define CAPS_FAMILY 0L
+#define CAPS_IO_CAPS 1L
+#define CAPS_TECHNOLOGY 2L
+#define CAPS_DRIVER_VERSION 3L
+#define CAPS_WIDTH 4L /* pels */
+#define CAPS_HEIGHT 5L /* pels */
+#define CAPS_WIDTH_IN_CHARS 6L
+#define CAPS_HEIGHT_IN_CHARS 7L
+#define CAPS_HORIZONTAL_RESOLUTION 8L /* pels per meter */
+#define CAPS_VERTICAL_RESOLUTION 9L /* pels per meter */
+#define CAPS_CHAR_WIDTH 10L /* pels */
+#define CAPS_CHAR_HEIGHT 11L /* pels */
+#define CAPS_SMALL_CHAR_WIDTH 12L /* pels */
+#define CAPS_SMALL_CHAR_HEIGHT 13L /* pels */
+#define CAPS_COLORS 14L
+#define CAPS_COLOR_PLANES 15L
+#define CAPS_COLOR_BITCOUNT 16L
+#define CAPS_COLOR_TABLE_SUPPORT 17L
+#define CAPS_MOUSE_BUTTONS 18L
+#define CAPS_FOREGROUND_MIX_SUPPORT 19L
+#define CAPS_BACKGROUND_MIX_SUPPORT 20L
+#define CAPS_DEVICE_WINDOWING 31L
+#define CAPS_ADDITIONAL_GRAPHICS 32L
+#define CAPS_VIO_LOADABLE_FONTS 21L
+#define CAPS_WINDOW_BYTE_ALIGNMENT 22L
+#define CAPS_BITMAP_FORMATS 23L
+#define CAPS_RASTER_CAPS 24L
+#define CAPS_MARKER_HEIGHT 25L /* pels */
+#define CAPS_MARKER_WIDTH 26L /* pels */
+#define CAPS_DEVICE_FONTS 27L
+#define CAPS_GRAPHICS_SUBSET 28L
+#define CAPS_GRAPHICS_VERSION 29L
+#define CAPS_GRAPHICS_VECTOR_SUBSET 30L
+#define CAPS_PHYS_COLORS 33L
+#define CAPS_COLOR_INDEX 34L
+#define CAPS_GRAPHICS_CHAR_WIDTH 35L
+#define CAPS_GRAPHICS_CHAR_HEIGHT 36L
+#define CAPS_HORIZONTAL_FONT_RES 37L
+#define CAPS_VERTICAL_FONT_RES 38L
+#define CAPS_DEVICE_FONT_SIM 39L
+
+/* Constants for CAPS_IO_CAPS */
+#define CAPS_IO_DUMMY 1L
+#define CAPS_IO_SUPPORTS_OP 2L
+#define CAPS_IO_SUPPORTS_IP 3L
+#define CAPS_IO_SUPPORTS_IO 4L
+
+/* Constants for CAPS_TECHNOLOGY */
+#define CAPS_TECH_UNKNOWN 0L
+#define CAPS_TECH_VECTOR_PLOTTER 1L
+#define CAPS_TECH_RASTER_DISPLAY 2L
+#define CAPS_TECH_RASTER_PRINTER 3L
+#define CAPS_TECH_RASTER_CAMERA 4L
+#define CAPS_TECH_POSTSCRIPT 5L
+
+/* Constants for CAPS_COLOR_TABLE_SUPPORT */
+#define CAPS_COLTABL_RGB_8 1L
+#define CAPS_COLTABL_RGB_8_PLUS 2L
+#define CAPS_COLTABL_TRUE_MIX 4L
+#define CAPS_COLTABL_REALIZE 8L
+
+/* Constants for CAPS_FOREGROUND_MIX_SUPPORT */
+#define CAPS_FM_OR 1L
+#define CAPS_FM_OVERPAINT 2L
+#define CAPS_FM_XOR 8L
+#define CAPS_FM_LEAVEALONE 16L
+#define CAPS_FM_AND 32L
+#define CAPS_FM_GENERAL_BOOLEAN 64L
+
+/* Constants for CAPS_BACKGROUND_MIX_SUPPORT */
+#define CAPS_BM_OR 1L
+#define CAPS_BM_OVERPAINT 2L
+#define CAPS_BM_XOR 8L
+#define CAPS_BM_LEAVEALONE 16L
+
+/* Constants for CAPS_DEVICE_WINDOWING */
+#define CAPS_DEV_WINDOWING_SUPPORT 1L
+
+/* Constants for CAPS_ADDITIONAL_GRAPHICS */
+#define CAPS_GRAPHICS_KERNING_SUPPORT 2L
+#define CAPS_FONT_OUTLINE_DEFAULT 4L
+#define CAPS_FONT_IMAGE_DEFAULT 8L
+/* bits represented by values 16L and 32L are reserved */
+#define CAPS_SCALED_DEFAULT_MARKERS 64L
+#ifndef INCL_SAADEFS
+
+/* Constants for CAPS_WINDOW_BYTE_ALIGNMENT */
+#define CAPS_BYTE_ALIGN_REQUIRED 0L
+#define CAPS_BYTE_ALIGN_RECOMMENDED 1L
+#define CAPS_BYTE_ALIGN_NOT_REQUIRED 2L
+#endif /* no INCL_SAADEFS */
+
+/* Constants for CAPS_RASTER_CAPS */
+#define CAPS_RASTER_BITBLT 1L
+#define CAPS_RASTER_BANDING 2L
+#define CAPS_RASTER_BITBLT_SCALING 4L
+#define CAPS_RASTER_SET_PEL 16L
+#define CAPS_RASTER_FONTS 32L
+
+#ifndef INCL_DDIDEFS
+HDC APIENTRY DevOpenDC( HAB hab, LONG lType, PSZ pszToken
+ , LONG lCount, PDEVOPENDATA pdopData, HDC hdcComp );
+HMF APIENTRY DevCloseDC( HDC hdc );
+BOOL APIENTRY DevQueryCaps( HDC hdc, LONG lStart, LONG lCount, PLONG alArray );
+#endif /* no INCL_DDIDEFS */
+
+#endif /* common DEV */
+#ifdef INCL_DEV
+
+#ifndef INCL_SAADEFS
+/* structures for DEVESC_QUERYVIOCELLSIZES */
+typedef struct _VIOSIZECOUNT { /* vios */
+ LONG maxcount;
+ LONG count;
+ } VIOSIZECOUNT;
+typedef VIOSIZECOUNT FAR * PVIOSIZECOUNT;
+
+typedef struct _VIOFONTCELLSIZE { /* viof */
+ LONG cx;
+ LONG cy;
+ } VIOFONTCELLSIZE;
+typedef VIOFONTCELLSIZE FAR * PVIOFONTCELLSIZE;
+
+/* structure for DEVESC_GETSCALINGFACTOR */
+typedef struct _SFACTORS { /* sfactors */
+ LONG x;
+ LONG y;
+} SFACTORS;
+typedef SFACTORS FAR * PSFACTORS;
+
+/* structure for DEVESC_NEXTBAND */
+typedef struct _BANDRECT { /* bandrect */
+ LONG xleft;
+ LONG ybottom;
+ LONG xright;
+ LONG ytop;
+} BANDRECT;
+typedef BANDRECT FAR * PBANDRECT;
+
+/* return codes for DevEscape */
+#define DEVESC_ERROR (-1L)
+#define DEVESC_NOTIMPLEMENTED 0L
+
+/* codes for DevEscape */
+#define DEVESC_QUERYESCSUPPORT 0L
+#define DEVESC_GETSCALINGFACTOR 1L
+#define DEVESC_QUERYVIOCELLSIZES 2L
+
+#define DEVESC_STARTDOC 8150L
+#define DEVESC_ENDDOC 8151L
+#define DEVESC_NEXTBAND 8152L
+#define DEVESC_ABORTDOC 8153L
+
+#define DEVESC_NEWFRAME 16300L
+#define DEVESC_DRAFTMODE 16301L
+#define DEVESC_FLUSHOUTPUT 16302L
+#define DEVESC_RAWDATA 16303L
+#define DEVESC_SETMODE 16304L
+#define DEVESC_DBE_FIRST 24450L
+#define DEVESC_DBE_LAST 24455L
+
+/* DevEscape codes for adding extra space to character strings */
+#define DEVESC_CHAR_EXTRA 16998L
+#define DEVESC_BREAK_EXTRA 16999L
+
+/* codes for DevEscape PM_Q_ESC spool files */
+#define DEVESC_STD_JOURNAL 32600L
+
+/* return codes for DevPostDeviceModes */
+#define DPDM_ERROR (-1L)
+#define DPDM_NONE 0L
+
+/* codes for DevPostDeviceModes */
+#define DPDM_POSTJOBPROP 0L
+#define DPDM_CHANGEPROP 1L
+#define DPDM_QUERYJOBPROP 2L
+
+/* string types for DevQueryDeviceNames */
+typedef CHAR STR16[16]; /* str16 */
+typedef STR16 FAR *PSTR16;
+typedef CHAR STR32[32]; /* str32 */
+typedef STR32 FAR *PSTR32;
+typedef CHAR STR64[64]; /* str64 */
+typedef STR64 FAR *PSTR64;
+
+/* return code for DevQueryHardcopyCaps */
+#define DQHC_ERROR (-1L)
+/* codes for DevQueryHardcopyCaps */
+#define HCAPS_CURRENT 1L
+#define HCAPS_SELECTABLE 2L
+
+/* structure for DevQueryHardcopyCaps */
+typedef struct _HCINFO { /* hci */
+ CHAR szFormname[32];
+ LONG cx;
+ LONG cy;
+ LONG xLeftClip;
+ LONG yBottomClip;
+ LONG xRightClip;
+ LONG yTopClip;
+ LONG xPels;
+ LONG yPels;
+ LONG flAttributes;
+} HCINFO;
+typedef HCINFO FAR *PHCINFO;
+
+/* structure for DEVESC_SETMODE */
+typedef struct _ESCSETMODE { /* escsm */
+ ULONG mode;
+ USHORT codepage;
+} ESCSETMODE;
+typedef ESCSETMODE FAR * PESCSETMODE;
+
+/* Device Context Functions */
+#ifndef INCL_DDIDEFS
+
+LONG APIENTRY DevEscape( HDC hdc, LONG lCode, LONG lInCount, PBYTE pbInData
+ , PLONG plOutCount, PBYTE pbOutData );
+BOOL APIENTRY DevQueryDeviceNames( HAB hab, PSZ pszDriverName, PLONG pldn
+ , PSTR32 aDeviceName, PSTR64 aDeviceDesc
+ , PLONG pldt, PSTR16 aDataType );
+LONG APIENTRY DevQueryHardcopyCaps( HDC hdc, LONG lStartForm
+ , LONG lForms, PHCINFO phciHcInfo );
+LONG APIENTRY DevPostDeviceModes( HAB hab, PDRIVDATA pdrivDriverData
+ , PSZ pszDriverName, PSZ pszDeviceName
+ , PSZ pszName, ULONG flOptions );
+
+#endif /* no INCL_DDIDEFS */
+#endif /* no INCL_SAADEFS */
+
+#endif /* non-common DEV */
+
+#ifdef INCL_DEVERRORS
+
+/* AAB error codes for the DEV - same as GPI errors at present */
+
+#endif /* INCL_DEVERRORS */
diff --git a/private/oleauto/tools/win16/os2/inc/pmerr.h b/private/oleauto/tools/win16/os2/inc/pmerr.h
new file mode 100644
index 000000000..bf2d465fa
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmerr.h
@@ -0,0 +1,799 @@
+/******************************************************************************\
+*
+* Module Name: PMERR.H
+*
+* OS/2 Presentation Manager public error codes.
+*
+* They all have a definition commencing PMERR_
+*
+* This file has been constructed to bring together all the error codes
+* into one place. It has been made up of error codes formerly held in
+* PMGPI.H, PMWIN.H, PMSPL.H AND PMSHL.H.
+*
+* Also, some error codes that were put into a private spooler header
+* file have been made public here.
+*
+* Where the error codes in each public file were defined they have
+* been replaced with a "#include <pmerr.h>" to pick up the error codes.
+*
+* Note ! It could have been possible for an application to use the
+* following sort of header :-
+* #define INCL_ERROR
+* #include <os2.h> - pick up GPI, WIN and SHL errors
+* #include <pmspl.h> - pick up spooler errors
+*
+* With this new file, error codes from PMWIN, for example, would be
+* doubly defined. Hence each error code section is protected by a
+* conditional include to prevent this.
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+\******************************************************************************/
+
+/**********************************************************************\
+*
+* Window Manager error codes
+*
+* 1.) PMWIN error codes
+*
+\**********************************************************************/
+
+#ifdef INCL_WINERRORS
+
+#ifndef INCL_WINERRORS_INCL
+/* XLATOFF */
+#define INCL_WINERRORS_INCL
+/* XLATON */
+
+#define PMERR_INVALID_HWND 0x1001
+#define PMERR_INVALID_HMQ 0x1002
+#define PMERR_PARAMETER_OUT_OF_RANGE 0x1003
+#define PMERR_WINDOW_LOCK_UNDERFLOW 0x1004
+#define PMERR_WINDOW_LOCK_OVERFLOW 0x1005
+#define PMERR_BAD_WINDOW_LOCK_COUNT 0x1006
+#define PMERR_WINDOW_NOT_LOCKED 0x1007
+#define PMERR_INVALID_SELECTOR 0x1008
+#define PMERR_CALL_FROM_WRONG_THREAD 0x1009
+#define PMERR_RESOURCE_NOT_FOUND 0x100A
+#define PMERR_INVALID_STRING_PARM 0x100B
+#define PMERR_INVALID_HHEAP 0x100C
+#define PMERR_INVALID_HEAP_POINTER 0x100D
+#define PMERR_INVALID_HEAP_SIZE_PARM 0x100E
+#define PMERR_INVALID_HEAP_SIZE 0x100F
+#define PMERR_INVALID_HEAP_SIZE_WORD 0x1010
+#define PMERR_HEAP_OUT_OF_MEMORY 0x1011
+#define PMERR_HEAP_MAX_SIZE_REACHED 0x1012
+#define PMERR_INVALID_HATOMTBL 0x1013
+#define PMERR_INVALID_ATOM 0x1014
+#define PMERR_INVALID_ATOM_NAME 0x1015
+#define PMERR_INVALID_INTEGER_ATOM 0x1016
+#define PMERR_ATOM_NAME_NOT_FOUND 0x1017
+#define PMERR_QUEUE_TOO_LARGE 0x1018
+#define PMERR_INVALID_FLAG 0x1019
+#define PMERR_INVALID_HACCEL 0x101A
+#define PMERR_INVALID_HPTR 0x101B
+#define PMERR_INVALID_HENUM 0x101C
+#define PMERR_INVALID_SRC_CODEPAGE 0x101D
+#define PMERR_INVALID_DST_CODEPAGE 0x101E
+
+/* These are not real error codes, but just used to access special */
+/* error message strings used by WinGetErrorInfo to format an error */
+/* message. */
+
+#define PMERR_UNKNOWN_COMPONENT_ID 0x101f
+#define PMERR_UNKNOWN_ERROR_CODE 0x1020
+#define PMERR_SEVERITY_LEVELS 0x1021
+
+/* 0x1022 - 0x1033, 0x1035, 0x104B - 0x104C used elsewhere */
+#define PMERR_INVALID_RESOURCE_FORMAT 0x1034
+#define PMERR_NO_MSG_QUEUE 0x1036
+#define PMERR_WIN_DEBUGMSG 0x1037
+#define PMERR_QUEUE_FULL 0x1038
+
+#define PMERR_LIBRARY_LOAD_FAILED 0x1039
+#define PMERR_PROCEDURE_LOAD_FAILED 0x103A
+#define PMERR_LIBRARY_DELETE_FAILED 0x103B
+#define PMERR_PROCEDURE_DELETE_FAILED 0x103C
+
+#define PMERR_ARRAY_TOO_LARGE 0x103D
+#define PMERR_ARRAY_TOO_SMALL 0x103E
+#define PMERR_DATATYPE_ENTRY_BAD_INDEX 0x103F
+#define PMERR_DATATYPE_ENTRY_CTL_BAD 0x1040
+#define PMERR_DATATYPE_ENTRY_CTL_MISS 0x1041
+#define PMERR_DATATYPE_ENTRY_INVALID 0x1042
+#define PMERR_DATATYPE_ENTRY_NOT_NUM 0x1043
+#define PMERR_DATATYPE_ENTRY_NOT_OFF 0x1044
+#define PMERR_DATATYPE_INVALID 0x1045
+#define PMERR_DATATYPE_NOT_UNIQUE 0x1046
+#define PMERR_DATATYPE_TOO_LONG 0x1047
+#define PMERR_DATATYPE_TOO_SMALL 0x1048
+#define PMERR_DIRECTION_INVALID 0x1049
+#define PMERR_INVALID_HAB 0x104A
+#define PMERR_INVALID_HSTRUCT 0x104D
+#define PMERR_LENGTH_TOO_SMALL 0x104E
+#define PMERR_MSGID_TOO_SMALL 0x104F
+#define PMERR_NO_HANDLE_ALLOC 0x1050
+#define PMERR_NOT_IN_A_PM_SESSION 0x1051
+#define PMERR_MSG_QUEUE_ALREADY_EXISTS 0x1052
+
+#endif /* error codes already included */
+#endif /* include error codes */
+
+/**********************************************************************\
+*
+* Window Manager error codes
+*
+* 2.) PMSHL error codes
+*
+\**********************************************************************/
+
+#ifdef INCL_SHLERRORS
+
+#ifndef INCL_SHLERRORS_INCL
+/* XLATOFF */
+#define INCL_SHLERRORS_INCL
+/* XLATON */
+
+#define PMERR_INVALID_PIB 0x1101
+#define PMERR_INSUFF_SPACE_TO_ADD 0x1102
+#define PMERR_INVALID_GROUP_HANDLE 0x1103
+#define PMERR_DUPLICATE_TITLE 0x1104
+#define PMERR_INVALID_TITLE 0x1105
+#define PMERR_HANDLE_NOT_IN_GROUP 0x1107
+#define PMERR_INVALID_TARGET_HANDLE 0x1106
+#define PMERR_INVALID_PATH_STATEMENT 0x1108
+#define PMERR_NO_PROGRAM_FOUND 0x1109
+#define PMERR_INVALID_BUFFER_SIZE 0x110A
+#define PMERR_BUFFER_TOO_SMALL 0x110B
+#define PMERR_PL_INITIALISATION_FAIL 0x110C
+#define PMERR_CANT_DESTROY_SYS_GROUP 0x110D
+#define PMERR_INVALID_TYPE_CHANGE 0x110E
+#define PMERR_INVALID_PROGRAM_HANDLE 0x110F
+
+#define PMERR_NOT_CURRENT_PL_VERSION 0x1110
+#define PMERR_INVALID_CIRCULAR_REF 0x1111
+#define PMERR_MEMORY_ALLOCATION_ERR 0x1112
+#define PMERR_MEMORY_DEALLOCATION_ERR 0x1113
+#define PMERR_TASK_HEADER_TOO_BIG 0x1114
+
+#define PMERR_INVALID_INI_FILE_HANDLE 0x1115
+#define PMERR_MEMORY_SHARE 0x1116
+#define PMERR_OPEN_QUEUE 0x1117
+#define PMERR_CREATE_QUEUE 0x1118
+#define PMERR_WRITE_QUEUE 0x1119
+#define PMERR_READ_QUEUE 0x111A
+#define PMERR_CALL_NOT_EXECUTED 0x111B
+#define PMERR_UNKNOWN_APIPKT 0x111C
+#define PMERR_INITHREAD_EXISTS 0x111D
+#define PMERR_CREATE_THREAD 0x111E
+#define PMERR_NO_HK_PROFILE_INSTALLED 0x111F
+#define PMERR_INVALID_DIRECTORY 0x1120
+#define PMERR_WILDCARD_IN_FILENAME 0x1121
+#define PMERR_FILENAME_BUFFER_FULL 0x1122
+#define PMERR_FILENAME_TOO_LONG 0x1123
+#define PMERR_INI_FILE_IS_SYS_OR_USER 0x1124
+#define PMERR_BROADCAST_PLMSG 0x1125
+#define PMERR_190_INIT_DONE 0x1126
+#define PMERR_HMOD_FOR_PMSHAPI 0x1127
+#define PMERR_SET_HK_PROFILE 0x1128
+#define PMERR_API_NOT_ALLOWED 0x1129
+#define PMERR_INI_STILL_OPEN 0x112A
+
+#define PMERR_PROGDETAILS_NOT_IN_INI 0x112B
+#define PMERR_PIBSTRUCT_NOT_IN_INI 0x112C
+#define PMERR_INVALID_DISKPROGDETAILS 0x112D
+#define PMERR_PROGDETAILS_READ_FAILURE 0x112E
+#define PMERR_PROGDETAILS_WRITE_FAILURE 0x112F
+#define PMERR_PROGDETAILS_QSIZE_FAILURE 0x1130
+#define PMERR_INVALID_PROGDETAILS 0x1131
+#define PMERR_SHEPROFILEHOOK_NOT_FOUND 0x1132
+#define PMERR_190PLCONVERTED 0x1133
+#define PMERR_FAILED_TO_CONVERT_INI_PL 0x1134
+#define PMERR_PMSHAPI_NOT_INITIALISED 0x1135
+#define PMERR_INVALID_SHELL_API_HOOK_ID 0x1136
+
+#define PMERR_DOS_ERROR 0x1200
+
+#define PMERR_NO_SPACE 0x1201
+#define PMERR_INVALID_SWITCH_HANDLE 0x1202
+#define PMERR_NO_HANDLE 0x1203
+#define PMERR_INVALID_PROCESS_ID 0x1204
+#define PMERR_NOT_SHELL 0x1205
+#define PMERR_INVALID_WINDOW 0x1206
+#define PMERR_INVALID_POST_MSG 0x1207
+#define PMERR_INVALID_PARAMETERS 0x1208
+#define PMERR_INVALID_PROGRAM_TYPE 0x1209
+#define PMERR_NOT_EXTENDED_FOCUS 0x120A
+#define PMERR_INVALID_SESSION_ID 0x120B
+#define PMERR_SMG_INVALID_ICON_FILE 0x120C
+#define PMERR_SMG_ICON_NOT_CREATED 0x120D
+#define PMERR_SHL_DEBUG 0x120E
+
+#define PMERR_OPENING_INI_FILE 0x1301
+#define PMERR_INI_FILE_CORRUPT 0x1302
+#define PMERR_INVALID_PARM 0x1303
+#define PMERR_NOT_IN_IDX 0x1304
+#define PMERR_NO_ENTRIES_IN_GROUP 0x1305
+
+#define PMERR_INI_WRITE_FAIL 0x1306
+#define PMERR_IDX_FULL 0x1307
+#define PMERR_INI_PROTECTED 0x1308
+#define PMERR_MEMORY_ALLOC 0x1309
+#define PMERR_INI_INIT_ALREADY_DONE 0x130A
+#define PMERR_INVALID_INTEGER 0x130B
+#define PMERR_INVALID_ASCIIZ 0x130C
+#define PMERR_CAN_NOT_CALL_SPOOLER 0x130D
+#define PMERR_VALIDATION_REJECTED PMERR_CAN_NOT_CALL_SPOOLER
+
+#define PMERR_WARNING_WINDOW_NOT_KILLED 0x1401
+#define PMERR_ERROR_INVALID_WINDOW 0x1402
+#define PMERR_ALREADY_INITIALIZED 0x1403
+#define PMERR_MSG_PROG_NO_MOU 0x1405
+#define PMERR_MSG_PROG_NON_RECOV 0x1406
+#define PMERR_WINCONV_INVALID_PATH 0x1407
+#define PMERR_PI_NOT_INITIALISED 0x1408
+#define PMERR_PL_NOT_INITIALISED 0x1409
+#define PMERR_NO_TASK_MANAGER 0x140A
+#define PMERR_SAVE_NOT_IN_PROGRESS 0x140B
+#define PMERR_NO_STACK_SPACE 0x140C
+#define PMERR_INVALID_COLR_FIELD 0x140d
+#define PMERR_INVALID_COLR_VALUE 0x140e
+#define PMERR_COLR_WRITE 0x140f
+
+#define PMERR_TARGET_FILE_EXISTS 0x1501
+#define PMERR_SOURCE_SAME_AS_TARGET 0x1502
+#define PMERR_SOURCE_FILE_NOT_FOUND 0x1503
+#define PMERR_INVALID_NEW_PATH 0x1504
+#define PMERR_TARGET_FILE_NOT_FOUND 0x1505
+#define PMERR_INVALID_DRIVE_NUMBER 0x1506
+#define PMERR_NAME_TOO_LONG 0x1507
+#define PMERR_NOT_ENOUGH_ROOM_ON_DISK 0x1508
+#define PMERR_NOT_ENOUGH_MEM 0x1509
+
+#define PMERR_LOG_DRV_DOES_NOT_EXIST 0x150B
+#define PMERR_INVALID_DRIVE 0x150C
+#define PMERR_ACCESS_DENIED 0x150D
+#define PMERR_NO_FIRST_SLASH 0x150E
+#define PMERR_READ_ONLY_FILE 0x150F
+#define PMERR_GROUP_PROTECTED 0x151F
+#define PMERR_INVALID_PROGRAM_CATEGORY 0x152F
+#define PMERR_INVALID_APPL 0x1530
+#define PMERR_CANNOT_START 0x1531
+#define PMERR_STARTED_IN_BACKGROUND 0x1532
+#define PMERR_INVALID_HAPP 0x1533
+#define PMERR_CANNOT_STOP 0x1534
+
+/* */
+/* Errors generated by Language Bindings layer. */
+/* */
+/* (Range 0x1600 - 0x16FF reserved for Bindings) */
+/* */
+
+/* SEVERITY_UNRECOVERABLE: */
+
+#define PMERR_INTERNAL_ERROR_1 0x1601
+#define PMERR_INTERNAL_ERROR_2 0x1602
+#define PMERR_INTERNAL_ERROR_3 0x1603
+#define PMERR_INTERNAL_ERROR_4 0x1604
+#define PMERR_INTERNAL_ERROR_5 0x1605
+#define PMERR_INTERNAL_ERROR_6 0x1606
+#define PMERR_INTERNAL_ERROR_7 0x1607
+#define PMERR_INTERNAL_ERROR_8 0x1608
+#define PMERR_INTERNAL_ERROR_9 0x1609
+#define PMERR_INTERNAL_ERROR_10 0x160A
+#define PMERR_INTERNAL_ERROR_11 0x160B
+#define PMERR_INTERNAL_ERROR_12 0x160C
+#define PMERR_INTERNAL_ERROR_13 0x160D
+#define PMERR_INTERNAL_ERROR_14 0x160E
+#define PMERR_INTERNAL_ERROR_15 0x160F
+#define PMERR_INTERNAL_ERROR_16 0x1610
+#define PMERR_INTERNAL_ERROR_17 0x1611
+#define PMERR_INTERNAL_ERROR_18 0x1612
+#define PMERR_INTERNAL_ERROR_19 0x1613
+#define PMERR_INTERNAL_ERROR_20 0x1614
+#define PMERR_INTERNAL_ERROR_21 0x1615
+#define PMERR_INTERNAL_ERROR_22 0x1616
+#define PMERR_INTERNAL_ERROR_23 0x1617
+#define PMERR_INTERNAL_ERROR_24 0x1618
+#define PMERR_INTERNAL_ERROR_25 0x1619
+#define PMERR_INTERNAL_ERROR_26 0x161A
+#define PMERR_INTERNAL_ERROR_27 0x161B
+#define PMERR_INTERNAL_ERROR_28 0x161C
+#define PMERR_INTERNAL_ERROR_29 0x161D
+
+/* SEVERITY_WARNING: */
+
+#define PMERR_INVALID_FREE_MESSAGE_ID 0x1630
+
+/* SEVERITY_ERROR: */
+
+#define PMERR_FUNCTION_NOT_SUPPORTED 0x1641
+#define PMERR_INVALID_ARRAY_COUNT 0x1642
+#define PMERR_INVALID_LENGTH 0x1643
+#define PMERR_INVALID_BUNDLE_TYPE 0x1644
+#define PMERR_INVALID_PARAMETER 0x1645
+#define PMERR_INVALID_NUMBER_OF_PARMS 0x1646
+#define PMERR_GREATER_THAN_64K 0x1647
+#define PMERR_INVALID_PARAMETER_TYPE 0x1648
+#define PMERR_NEGATIVE_STRCOND_DIM 0x1649
+#define PMERR_INVALID_NUMBER_OF_TYPES 0x164A
+#define PMERR_INCORRECT_HSTRUCT 0x164B
+#define PMERR_INVALID_ARRAY_SIZE 0x164C
+#define PMERR_INVALID_CONTROL_DATATYPE 0x164D
+#define PMERR_INCOMPLETE_CONTROL_SEQU 0x164E
+#define PMERR_INVALID_DATATYPE 0x164F
+#define PMERR_INCORRECT_DATATYPE 0x1650
+#define PMERR_NOT_SELF_DESCRIBING_DTYP 0x1651
+#define PMERR_INVALID_CTRL_SEQ_INDEX 0x1652
+#define PMERR_INVALID_TYPE_FOR_LENGTH 0x1653
+#define PMERR_INVALID_TYPE_FOR_OFFSET 0x1654
+#define PMERR_INVALID_TYPE_FOR_MPARAM 0x1655
+#define PMERR_INVALID_MESSAGE_ID 0x1656
+#define PMERR_C_LENGTH_TOO_SMALL 0x1657
+#define PMERR_APPL_STRUCTURE_TOO_SMALL 0x1658
+#define PMERR_INVALID_ERRORINFO_HANDLE 0x1659
+#define PMERR_INVALID_CHARACTER_INDEX 0x165A
+
+/* */
+/* End of Errors generated by Language Bindings layer. */
+/* */
+/* (Range 0x1600 - 0x16FF reserved for Bindings) */
+/* */
+
+#endif /* error codes already included */
+#endif /* include error codes */
+
+/*******************************************************************\
+*
+* GPI error codes
+*
+\*******************************************************************/
+
+#ifdef INCL_GPIERRORS
+
+#ifndef INCL_GPIERRORS_INCL
+/* XLATOFF */
+#define INCL_GPIERRORS_INCL
+/* XLATON */
+
+/* AAB error codes for the GPI */
+#define PMERR_OK 0x0000
+#define PMERR_ALREADY_IN_AREA 0x2001
+#define PMERR_ALREADY_IN_ELEMENT 0x2002
+#define PMERR_ALREADY_IN_PATH 0x2003
+#define PMERR_ALREADY_IN_SEG 0x2004
+#define PMERR_AREA_INCOMPLETE 0x2005
+#define PMERR_BASE_ERROR 0x2006
+#define PMERR_BITBLT_LENGTH_EXCEEDED 0x2007
+#define PMERR_BITMAP_IN_USE 0x2008
+#define PMERR_BITMAP_IS_SELECTED 0x2009
+#define PMERR_BITMAP_NOT_FOUND 0x200A
+#define PMERR_BITMAP_NOT_SELECTED 0x200B
+#define PMERR_BOUNDS_OVERFLOW 0x200C
+#define PMERR_CALLED_SEG_IS_CHAINED 0x200D
+#define PMERR_CALLED_SEG_IS_CURRENT 0x200E
+#define PMERR_CALLED_SEG_NOT_FOUND 0x200F
+#define PMERR_CANNOT_DELETE_ALL_DATA 0x2010
+#define PMERR_CANNOT_REPLACE_ELEMENT_0 0x2011
+#define PMERR_COL_TABLE_NOT_REALIZABLE 0x2012
+#define PMERR_COL_TABLE_NOT_REALIZED 0x2013
+#define PMERR_COORDINATE_OVERFLOW 0x2014
+#define PMERR_CORR_FORMAT_MISMATCH 0x2015
+#define PMERR_DATA_TOO_LONG 0x2016
+#define PMERR_DC_IS_ASSOCIATED 0x2017
+#define PMERR_DESC_STRING_TRUNCATED 0x2018
+#define PMERR_DEVICE_DRIVER_ERROR_1 0x2019
+#define PMERR_DEVICE_DRIVER_ERROR_2 0x201A
+#define PMERR_DEVICE_DRIVER_ERROR_3 0x201B
+#define PMERR_DEVICE_DRIVER_ERROR_4 0x201C
+#define PMERR_DEVICE_DRIVER_ERROR_5 0x201D
+#define PMERR_DEVICE_DRIVER_ERROR_6 0x201E
+#define PMERR_DEVICE_DRIVER_ERROR_7 0x201F
+#define PMERR_DEVICE_DRIVER_ERROR_8 0x2020
+#define PMERR_DEVICE_DRIVER_ERROR_9 0x2021
+#define PMERR_DEVICE_DRIVER_ERROR_10 0x2022
+#define PMERR_DEV_FUNC_NOT_INSTALLED 0x2023
+#define PMERR_DOSOPEN_FAILURE 0x2024
+#define PMERR_DOSREAD_FAILURE 0x2025
+#define PMERR_DRIVER_NOT_FOUND 0x2026
+#define PMERR_DUP_SEG 0x2027
+#define PMERR_DYNAMIC_SEG_SEQ_ERROR 0x2028
+#define PMERR_DYNAMIC_SEG_ZERO_INV 0x2029
+#define PMERR_ELEMENT_INCOMPLETE 0x202A
+#define PMERR_ESC_CODE_NOT_SUPPORTED 0x202B
+#define PMERR_EXCEEDS_MAX_SEG_LENGTH 0x202C
+#define PMERR_FONT_AND_MODE_MISMATCH 0x202D
+#define PMERR_FONT_FILE_NOT_LOADED 0x202E
+#define PMERR_FONT_NOT_LOADED 0x202F
+#define PMERR_FONT_TOO_BIG 0x2030
+#define PMERR_HARDWARE_INIT_FAILURE 0x2031
+#define PMERR_HBITMAP_BUSY 0x2032
+#define PMERR_HDC_BUSY 0x2033
+#define PMERR_HRGN_BUSY 0x2034
+#define PMERR_HUGE_FONTS_NOT_SUPPORTED 0x2035
+#define PMERR_ID_HAS_NO_BITMAP 0x2036
+#define PMERR_IMAGE_INCOMPLETE 0x2037
+#define PMERR_INCOMPAT_COLOR_FORMAT 0x2038
+#define PMERR_INCOMPAT_COLOR_OPTIONS 0x2039
+#define PMERR_INCOMPATIBLE_BITMAP 0x203A
+#define PMERR_INCOMPATIBLE_METAFILE 0x203B
+#define PMERR_INCORRECT_DC_TYPE 0x203C
+#define PMERR_INSUFFICIENT_DISK_SPACE 0x203D
+#define PMERR_INSUFFICIENT_MEMORY 0x203E
+#define PMERR_INV_ANGLE_PARM 0x203F
+#define PMERR_INV_ARC_CONTROL 0x2040
+#define PMERR_INV_AREA_CONTROL 0x2041
+#define PMERR_INV_ARC_POINTS 0x2042
+#define PMERR_INV_ATTR_MODE 0x2043
+#define PMERR_INV_BACKGROUND_COL_ATTR 0x2044
+#define PMERR_INV_BACKGROUND_MIX_ATTR 0x2045
+#define PMERR_INV_BITBLT_MIX 0x2046
+#define PMERR_INV_BITBLT_STYLE 0x2047
+#define PMERR_INV_BITMAP_DIMENSION 0x2048
+#define PMERR_INV_BOX_CONTROL 0x2049
+#define PMERR_INV_BOX_ROUNDING_PARM 0x204A
+#define PMERR_INV_CHAR_ANGLE_ATTR 0x204B
+#define PMERR_INV_CHAR_DIRECTION_ATTR 0x204C
+#define PMERR_INV_CHAR_MODE_ATTR 0x204D
+#define PMERR_INV_CHAR_POS_OPTIONS 0x204E
+#define PMERR_INV_CHAR_SET_ATTR 0x204F
+#define PMERR_INV_CHAR_SHEAR_ATTR 0x2050
+#define PMERR_INV_CLIP_PATH_OPTIONS 0x2051
+#define PMERR_INV_CODEPAGE 0x2052
+#define PMERR_INV_COLOR_ATTR 0x2053
+#define PMERR_INV_COLOR_DATA 0x2054
+#define PMERR_INV_COLOR_FORMAT 0x2055
+#define PMERR_INV_COLOR_INDEX 0x2056
+#define PMERR_INV_COLOR_OPTIONS 0x2057
+#define PMERR_INV_COLOR_START_INDEX 0x2058
+#define PMERR_INV_COORD_OFFSET 0x2059
+#define PMERR_INV_COORD_SPACE 0x205A
+#define PMERR_INV_COORDINATE 0x205B
+#define PMERR_INV_CORRELATE_DEPTH 0x205C
+#define PMERR_INV_CORRELATE_TYPE 0x205D
+#define PMERR_INV_CURSOR_BITMAP 0x205E
+#define PMERR_INV_DC_DATA 0x205F
+#define PMERR_INV_DC_TYPE 0x2060
+#define PMERR_INV_DEVICE_NAME 0x2061
+#define PMERR_INV_DEV_MODES_OPTIONS 0x2062
+#define PMERR_INV_DRAW_CONTROL 0x2063
+#define PMERR_INV_DRAW_VALUE 0x2064
+#define PMERR_INV_DRAWING_MODE 0x2065
+#define PMERR_INV_DRIVER_DATA 0x2066
+#define PMERR_INV_DRIVER_NAME 0x2067
+#define PMERR_INV_DRAW_BORDER_OPTION 0x2068
+#define PMERR_INV_EDIT_MODE 0x2069
+#define PMERR_INV_ELEMENT_OFFSET 0x206A
+#define PMERR_INV_ELEMENT_POINTER 0x206B
+#define PMERR_INV_END_PATH_OPTIONS 0x206C
+#define PMERR_INV_ESC_CODE 0x206D
+#define PMERR_INV_ESCAPE_DATA 0x206E
+#define PMERR_INV_EXTENDED_LCID 0x206F
+#define PMERR_INV_FILL_PATH_OPTIONS 0x2070
+#define PMERR_INV_FIRST_CHAR 0x2071
+#define PMERR_INV_FONT_ATTRS 0x2072
+#define PMERR_INV_FONT_FILE_DATA 0x2073
+#define PMERR_INV_FOR_THIS_DC_TYPE 0x2074
+#define PMERR_INV_FORMAT_CONTROL 0x2075
+#define PMERR_INV_FORMS_CODE 0x2076
+#define PMERR_INV_FONTDEF 0x2077
+#define PMERR_INV_GEOM_LINE_WIDTH_ATTR 0x2078
+#define PMERR_INV_GETDATA_CONTROL 0x2079
+#define PMERR_INV_GRAPHICS_FIELD 0x207A
+#define PMERR_INV_HBITMAP 0x207B
+#define PMERR_INV_HDC 0x207C
+#define PMERR_INV_HJOURNAL 0x207D
+#define PMERR_INV_HMF 0x207E
+#define PMERR_INV_HPS 0x207F
+#define PMERR_INV_HRGN 0x2080
+#define PMERR_INV_ID 0x2081
+#define PMERR_INV_IMAGE_DATA_LENGTH 0x2082
+#define PMERR_INV_IMAGE_DIMENSION 0x2083
+#define PMERR_INV_IMAGE_FORMAT 0x2084
+#define PMERR_INV_IN_AREA 0x2085
+#define PMERR_INV_IN_CALLED_SEG 0x2086
+#define PMERR_INV_IN_CURRENT_EDIT_MODE 0x2087
+#define PMERR_INV_IN_DRAW_MODE 0x2088
+#define PMERR_INV_IN_ELEMENT 0x2089
+#define PMERR_INV_IN_IMAGE 0x208A
+#define PMERR_INV_IN_PATH 0x208B
+#define PMERR_INV_IN_RETAIN_MODE 0x208C
+#define PMERR_INV_IN_SEG 0x208D
+#define PMERR_INV_IN_VECTOR_SYMBOL 0x208E
+#define PMERR_INV_INFO_TABLE 0x208F
+#define PMERR_INV_JOURNAL_OPTION 0x2090
+#define PMERR_INV_KERNING_FLAGS 0x2091
+#define PMERR_INV_LENGTH_OR_COUNT 0x2092
+#define PMERR_INV_LINE_END_ATTR 0x2093
+#define PMERR_INV_LINE_JOIN_ATTR 0x2094
+#define PMERR_INV_LINE_TYPE_ATTR 0x2095
+#define PMERR_INV_LINE_WIDTH_ATTR 0x2096
+#define PMERR_INV_LOGICAL_ADDRESS 0x2097
+#define PMERR_INV_MARKER_BOX_ATTR 0x2098
+#define PMERR_INV_MARKER_SET_ATTR 0x2099
+#define PMERR_INV_MARKER_SYMBOL_ATTR 0x209A
+#define PMERR_INV_MATRIX_ELEMENT 0x209B
+#define PMERR_INV_MAX_HITS 0x209C
+#define PMERR_INV_METAFILE 0x209D
+#define PMERR_INV_METAFILE_LENGTH 0x209E
+#define PMERR_INV_METAFILE_OFFSET 0x209F
+#define PMERR_INV_MICROPS_DRAW_CONTROL 0x20A0
+#define PMERR_INV_MICROPS_FUNCTION 0x20A1
+#define PMERR_INV_MICROPS_ORDER 0x20A2
+#define PMERR_INV_MIX_ATTR 0x20A3
+#define PMERR_INV_MODE_FOR_OPEN_DYN 0x20A4
+#define PMERR_INV_MODE_FOR_REOPEN_SEG 0x20A5
+#define PMERR_INV_MODIFY_PATH_MODE 0x20A6
+#define PMERR_INV_MULTIPLIER 0x20A7
+#define PMERR_INV_NESTED_FIGURES 0x20A8
+#define PMERR_INV_OR_INCOMPAT_OPTIONS 0x20A9
+#define PMERR_INV_ORDER_LENGTH 0x20AA
+#define PMERR_INV_ORDERING_PARM 0x20AB
+#define PMERR_INV_OUTSIDE_DRAW_MODE 0x20AC
+#define PMERR_INV_PAGE_VIEWPORT 0x20AD
+#define PMERR_INV_PATH_ID 0x20AE
+#define PMERR_INV_PATH_MODE 0x20AF
+#define PMERR_INV_PATTERN_ATTR 0x20B0
+#define PMERR_INV_PATTERN_REF_PT_ATTR 0x20B1
+#define PMERR_INV_PATTERN_SET_ATTR 0x20B2
+#define PMERR_INV_PATTERN_SET_FONT 0x20B3
+#define PMERR_INV_PICK_APERTURE_OPTION 0x20B4
+#define PMERR_INV_PICK_APERTURE_POSN 0x20B5
+#define PMERR_INV_PICK_APERTURE_SIZE 0x20B6
+#define PMERR_INV_PICK_NUMBER 0x20B7
+#define PMERR_INV_PLAY_METAFILE_OPTION 0x20B8
+#define PMERR_INV_PRIMITIVE_TYPE 0x20B9
+#define PMERR_INV_PS_SIZE 0x20BA
+#define PMERR_INV_PUTDATA_FORMAT 0x20BB
+#define PMERR_INV_QUERY_ELEMENT_NO 0x20BC
+#define PMERR_INV_RECT 0x20BD
+#define PMERR_INV_REGION_CONTROL 0x20BE
+#define PMERR_INV_REGION_MIX_MODE 0x20BF
+#define PMERR_INV_REPLACE_MODE_FUNC 0x20C0
+#define PMERR_INV_RESERVED_FIELD 0x20C1
+#define PMERR_INV_RESET_OPTIONS 0x20C2
+#define PMERR_INV_RGBCOLOR 0x20C3
+#define PMERR_INV_SCAN_START 0x20C4
+#define PMERR_INV_SEG_ATTR 0x20C5
+#define PMERR_INV_SEG_ATTR_VALUE 0x20C6
+#define PMERR_INV_SEG_CH_LENGTH 0x20C7
+#define PMERR_INV_SEG_NAME 0x20C8
+#define PMERR_INV_SEG_OFFSET 0x20C9
+#define PMERR_INV_SETID 0x20CA
+#define PMERR_INV_SETID_TYPE 0x20CB
+#define PMERR_INV_SET_VIEWPORT_OPTION 0x20CC
+#define PMERR_INV_SHARPNESS_PARM 0x20CD
+#define PMERR_INV_SOURCE_OFFSET 0x20CE
+#define PMERR_INV_STOP_DRAW_VALUE 0x20CF
+#define PMERR_INV_TRANSFORM_TYPE 0x20D0
+#define PMERR_INV_USAGE_PARM 0x20D1
+#define PMERR_INV_VIEWING_LIMITS 0x20D2
+#define PMERR_JFILE_BUSY 0x20D3
+#define PMERR_JNL_FUNC_DATA_TOO_LONG 0x20D4
+#define PMERR_KERNING_NOT_SUPPORTED 0x20D5
+#define PMERR_LABEL_NOT_FOUND 0x20D6
+#define PMERR_MATRIX_OVERFLOW 0x20D7
+#define PMERR_METAFILE_INTERNAL_ERROR 0x20D8
+#define PMERR_METAFILE_IN_USE 0x20D9
+#define PMERR_METAFILE_LIMIT_EXCEEDED 0x20DA
+#define PMERR_NAME_STACK_FULL 0x20DB
+#define PMERR_NOT_CREATED_BY_DEVOPENDC 0x20DC
+#define PMERR_NOT_IN_AREA 0x20DD
+#define PMERR_NOT_IN_DRAW_MODE 0x20DE
+#define PMERR_NOT_IN_ELEMENT 0x20DF
+#define PMERR_NOT_IN_IMAGE 0x20E0
+#define PMERR_NOT_IN_PATH 0x20E1
+#define PMERR_NOT_IN_RETAIN_MODE 0x20E2
+#define PMERR_NOT_IN_SEG 0x20E3
+#define PMERR_NO_BITMAP_SELECTED 0x20E4
+#define PMERR_NO_CURRENT_ELEMENT 0x20E5
+#define PMERR_NO_CURRENT_SEG 0x20E6
+#define PMERR_NO_METAFILE_RECORD_HANDLE 0x20E7
+#define PMERR_ORDER_TOO_BIG 0x20E8
+#define PMERR_OTHER_SET_ID_REFS 0x20E9
+#define PMERR_OVERRAN_SEG 0x20EA
+#define PMERR_OWN_SET_ID_REFS 0x20EB
+#define PMERR_PATH_INCOMPLETE 0x20EC
+#define PMERR_PATH_LIMIT_EXCEEDED 0x20ED
+#define PMERR_PATH_UNKNOWN 0x20EE
+#define PMERR_PEL_IS_CLIPPED 0x20EF
+#define PMERR_PEL_NOT_AVAILABLE 0x20F0
+#define PMERR_PRIMITIVE_STACK_EMPTY 0x20F1
+#define PMERR_PROLOG_ERROR 0x20F2
+#define PMERR_PROLOG_SEG_ATTR_NOT_SET 0x20F3
+#define PMERR_PS_BUSY 0x20F4
+#define PMERR_PS_IS_ASSOCIATED 0x20F5
+#define PMERR_RAM_JNL_FILE_TOO_SMALL 0x20F6
+#define PMERR_REALIZE_NOT_SUPPORTED 0x20F7
+#define PMERR_REGION_IS_CLIP_REGION 0x20F8
+#define PMERR_RESOURCE_DEPLETION 0x20F9
+#define PMERR_SEG_AND_REFSEG_ARE_SAME 0x20FA
+#define PMERR_SEG_CALL_RECURSIVE 0x20FB
+#define PMERR_SEG_CALL_STACK_EMPTY 0x20FC
+#define PMERR_SEG_CALL_STACK_FULL 0x20FD
+#define PMERR_SEG_IS_CURRENT 0x20FE
+#define PMERR_SEG_NOT_CHAINED 0x20FF
+#define PMERR_SEG_NOT_FOUND 0x2100
+#define PMERR_SEG_STORE_LIMIT_EXCEEDED 0x2101
+#define PMERR_SETID_IN_USE 0x2102
+#define PMERR_SETID_NOT_FOUND 0x2103
+#define PMERR_STARTDOC_NOT_ISSUED 0x2104
+#define PMERR_STOP_DRAW_OCCURRED 0x2105
+#define PMERR_TOO_MANY_METAFILES_IN_USE 0x2106
+#define PMERR_TRUNCATED_ORDER 0x2107
+#define PMERR_UNCHAINED_SEG_ZERO_INV 0x2108
+#define PMERR_UNSUPPORTED_ATTR 0x2109
+#define PMERR_UNSUPPORTED_ATTR_VALUE 0x210A
+#define PMERR_ENDDOC_NOT_ISSUED 0x210B
+
+#endif /* error codes already included */
+#endif /* include error codes */
+
+/*********************************************************\
+*
+* Spooler error codes
+*
+\*********************************************************/
+
+#ifdef INCL_SPLERRORS
+
+#ifndef INCL_SPLERRORS_INCL
+/* XLATOFF */
+#define INCL_SPLERRORS_INCL
+/* XLATON */
+
+#define PMERR_SPL_DRIVER_ERROR 0x4001
+#define PMERR_SPL_DEVICE_ERROR 0x4002
+#define PMERR_SPL_DEVICE_NOT_INSTALLED 0x4003
+#define PMERR_SPL_QUEUE_ERROR 0x4004
+#define PMERR_SPL_INV_HSPL 0x4005
+#define PMERR_SPL_NO_DISK_SPACE 0x4006
+#define PMERR_SPL_NO_MEMORY 0x4007
+#define PMERR_SPL_PRINT_ABORT 0x4008
+#define PMERR_SPL_SPOOLER_NOT_INSTALLED 0x4009
+#define PMERR_SPL_INV_FORMS_CODE 0x400A
+#define PMERR_SPL_INV_PRIORITY 0x400B
+#define PMERR_SPL_NO_FREE_JOB_ID 0x400C
+#define PMERR_SPL_NO_DATA 0x400D
+#define PMERR_SPL_INV_TOKEN 0x400E
+#define PMERR_SPL_INV_DATATYPE 0x400F
+#define PMERR_SPL_PROCESSOR_ERROR 0x4010
+#define PMERR_SPL_INV_JOB_ID 0x4011
+#define PMERR_SPL_JOB_NOT_PRINTING 0x4012
+#define PMERR_SPL_JOB_PRINTING 0x4013
+#define PMERR_SPL_QUEUE_ALREADY_EXISTS 0x4014
+#define PMERR_SPL_INV_QUEUE_NAME 0x4015
+#define PMERR_SPL_QUEUE_NOT_EMPTY 0x4016
+#define PMERR_SPL_DEVICE_ALREADY_EXISTS 0x4017
+#define PMERR_SPL_DEVICE_LIMIT_REACHED 0x4018
+#define PMERR_SPL_STATUS_STRING_TRUNC 0x4019
+#define PMERR_SPL_INV_LENGTH_OR_COUNT 0x401A
+#define PMERR_SPL_FILE_NOT_FOUND 0x401B
+#define PMERR_SPL_CANNOT_OPEN_FILE 0x401C
+#define PMERR_SPL_DRIVER_NOT_INSTALLED 0x401D
+#define PMERR_SPL_INV_PROCESSOR_DATTYPE 0x401E
+#define PMERR_SPL_INV_DRIVER_DATATYPE 0x401F
+#define PMERR_SPL_PROCESSOR_NOT_INST 0x4020
+#define PMERR_SPL_NO_SUCH_LOG_ADDRESS 0x4021
+#define PMERR_SPL_PRINTER_NOT_FOUND 0x4022
+#define PMERR_SPL_DD_NOT_FOUND 0x4023
+#define PMERR_SPL_QUEUE_NOT_FOUND 0x4024
+#define PMERR_SPL_MANY_QUEUES_ASSOC 0x4025
+#define PMERR_SPL_NO_QUEUES_ASSOCIATED 0x4026
+#define PMERR_SPL_INI_FILE_ERROR 0x4027
+#define PMERR_SPL_NO_DEFAULT_QUEUE 0x4028
+#define PMERR_SPL_NO_CURRENT_FORMS_CODE 0x4029
+#define PMERR_SPL_NOT_AUTHORISED 0x402A
+#define PMERR_SPL_TEMP_NETWORK_ERROR 0x402B
+#define PMERR_SPL_HARD_NETWORK_ERROR 0x402C
+#define PMERR_DEL_NOT_ALLOWED 0x402D
+#define PMERR_CANNOT_DEL_QP_REF 0x402E
+#define PMERR_CANNOT_DEL_QNAME_REF 0x402F
+#define PMERR_CANNOT_DEL_PRINTER_DD_REF 0x4030
+#define PMERR_CANNOT_DEL_PRN_NAME_REF 0x4031
+#define PMERR_CANNOT_DEL_PRN_ADDR_REF 0x4032
+#define PMERR_SPOOLER_QP_NOT_DEFINED 0x4033
+#define PMERR_PRN_NAME_NOT_DEFINED 0x4034
+#define PMERR_PRN_ADDR_NOT_DEFINED 0x4035
+#define PMERR_PRINTER_DD_NOT_DEFINED 0x4036
+#define PMERR_PRINTER_QUEUE_NOT_DEFINED 0x4037
+#define PMERR_PRN_ADDR_IN_USE 0x4038
+#define PMERR_SPL_TOO_MANY_OPEN_FILES 0x4039
+#define PMERR_SPL_CP_NOT_REQD 0x403A
+#define PMERR_UNABLE_TO_CLOSE_DEVICE 0x4040
+
+#define PMERR_SPL_ERROR_1 ( SPLERR_BASE + 4001 )
+#define PMERR_SPL_ERROR_2 ( SPLERR_BASE + 4002 )
+#define PMERR_SPL_ERROR_3 ( SPLERR_BASE + 4003 )
+#define PMERR_SPL_ERROR_4 ( SPLERR_BASE + 4004 )
+#define PMERR_SPL_ERROR_5 ( SPLERR_BASE + 4005 )
+#define PMERR_SPL_ERROR_6 ( SPLERR_BASE + 4006 )
+#define PMERR_SPL_ERROR_7 ( SPLERR_BASE + 4007 )
+#define PMERR_SPL_ERROR_8 ( SPLERR_BASE + 4008 )
+#define PMERR_SPL_ERROR_9 ( SPLERR_BASE + 4009 )
+#define PMERR_SPL_ERROR_10 ( SPLERR_BASE + 4010 )
+#define PMERR_SPL_ERROR_11 ( SPLERR_BASE + 4011 )
+#define PMERR_SPL_ERROR_12 ( SPLERR_BASE + 4012 )
+#define PMERR_SPL_ERROR_13 ( SPLERR_BASE + 4013 )
+#define PMERR_SPL_ERROR_14 ( SPLERR_BASE + 4014 )
+#define PMERR_SPL_ERROR_15 ( SPLERR_BASE + 4015 )
+#define PMERR_SPL_ERROR_16 ( SPLERR_BASE + 4016 )
+#define PMERR_SPL_ERROR_17 ( SPLERR_BASE + 4017 )
+#define PMERR_SPL_ERROR_18 ( SPLERR_BASE + 4018 )
+#define PMERR_SPL_ERROR_19 ( SPLERR_BASE + 4019 )
+#define PMERR_SPL_ERROR_20 ( SPLERR_BASE + 4020 )
+#define PMERR_SPL_ERROR_21 ( SPLERR_BASE + 4021 )
+#define PMERR_SPL_ERROR_22 ( SPLERR_BASE + 4022 )
+#define PMERR_SPL_ERROR_23 ( SPLERR_BASE + 4023 )
+#define PMERR_SPL_ERROR_24 ( SPLERR_BASE + 4024 )
+#define PMERR_SPL_ERROR_25 ( SPLERR_BASE + 4025 )
+#define PMERR_SPL_ERROR_26 ( SPLERR_BASE + 4026 )
+/* next free spooler error is below */
+#define PMERR_SPL_ERROR_27 ( SPLERR_BASE + 4027 )
+#define PMERR_SPL_ERROR_28 ( SPLERR_BASE + 4028 )
+#define PMERR_SPL_ERROR_29 ( SPLERR_BASE + 4029 )
+#define PMERR_SPL_ERROR_30 ( SPLERR_BASE + 4030 )
+#define PMERR_SPL_ERROR_31 ( SPLERR_BASE + 4031 )
+#define PMERR_SPL_ERROR_32 ( SPLERR_BASE + 4032 )
+#define PMERR_SPL_ERROR_33 ( SPLERR_BASE + 4033 )
+#define PMERR_SPL_ERROR_34 ( SPLERR_BASE + 4034 )
+#define PMERR_SPL_ERROR_35 ( SPLERR_BASE + 4035 )
+#define PMERR_SPL_ERROR_36 ( SPLERR_BASE + 4036 )
+#define PMERR_SPL_ERROR_37 ( SPLERR_BASE + 4037 )
+#define PMERR_SPL_ERROR_38 ( SPLERR_BASE + 4038 )
+#define PMERR_SPL_ERROR_39 ( SPLERR_BASE + 4039 )
+#define PMERR_SPL_ERROR_40 ( SPLERR_BASE + 4040 )
+
+#define PMERR_SPLMSGBOX_INFO_CAPTION ( SPLERR_BASE + 4041 )
+#define PMERR_SPLMSGBOX_WARNING_CAPTION ( SPLERR_BASE + 4042 )
+#define PMERR_SPLMSGBOX_ERROR_CAPTION ( SPLERR_BASE + 4043 )
+#define PMERR_SPLMSGBOX_SEVERE_CAPTION ( SPLERR_BASE + 4044 )
+
+#define PMERR_SPLMSGBOX_JOB_DETAILS ( SPLERR_BASE + 4045 )
+
+#define PMERR_SPLMSGBOX_ERROR_ACTION ( SPLERR_BASE + 4046 )
+#define PMERR_SPLMSGBOX_SEVERE_ACTION ( SPLERR_BASE + 4047 )
+
+#define PMERR_SPLMSGBOX_BIT_0_TEXT ( SPLERR_BASE + 4048 )
+#define PMERR_SPLMSGBOX_BIT_1_TEXT ( SPLERR_BASE + 4049 )
+#define PMERR_SPLMSGBOX_BIT_2_TEXT ( SPLERR_BASE + 4050 )
+#define PMERR_SPLMSGBOX_BIT_3_TEXT ( SPLERR_BASE + 4051 )
+#define PMERR_SPLMSGBOX_BIT_4_TEXT ( SPLERR_BASE + 4052 )
+#define PMERR_SPLMSGBOX_BIT_5_TEXT ( SPLERR_BASE + 4053 )
+#define PMERR_SPLMSGBOX_BIT_15_TEXT ( SPLERR_BASE + 4054 )
+#define PMERR_SPL_NOPATHBUFFER ( SPLERR_BASE + 4055 )
+
+#define PMERR_SPL_ALREADY_INITIALISED ( SPLERR_BASE + 4093 )
+#define PMERR_SPL_ERROR ( SPLERR_BASE + 4095 )
+
+#endif /* error codes already included */
+#endif /* include error codes */
+
+/*********************************************************\
+*
+* Picture Utilities error codes
+*
+\*********************************************************/
+
+#ifdef INCL_PICERRORS
+
+#ifndef INCL_PICERRORS_INCL
+/* XLATOFF */
+#define INCL_PICERRORS_INCL
+/* XLATON */
+
+#define PMERR_INV_TYPE 0x5001
+#define PMERR_INV_CONV 0x5002
+#define PMERR_INV_SEGLEN 0x5003
+#define PMERR_DUP_SEGNAME 0x5004
+#define PMERR_INV_XFORM 0x5005
+#define PMERR_INV_VIEWLIM 0x5006
+#define PMERR_INV_3DCOORD 0x5007
+#define PMERR_SMB_OVFLOW 0x5008
+#define PMERR_SEG_OVFLOW 0x5009
+#define PMERR_PIC_DUP_FILENAME 0x5010
+
+
+#endif /* error codes already included */
+#endif /* include error codes */
diff --git a/private/oleauto/tools/win16/os2/inc/pmfont.h b/private/oleauto/tools/win16/os2/inc/pmfont.h
new file mode 100644
index 000000000..29c9ab8df
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmfont.h
@@ -0,0 +1,120 @@
+/***************************************************************************\
+*
+* Module Name: PMFONT.H
+*
+* OS/2 Presentation Manager type declarations for Fonts.
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+\***************************************************************************/
+
+typedef struct _FOCAMETRICS { /* foca */
+ ULONG ulIdentity;
+ ULONG ulSize;
+ CHAR szFamilyname[32];
+ CHAR szFacename[32];
+ SHORT usRegistryId;
+ SHORT usCodePage;
+ SHORT yEmHeight;
+ SHORT yXHeight;
+ SHORT yMaxAscender;
+ SHORT yMaxDescender;
+ SHORT yLowerCaseAscent;
+ SHORT yLowerCaseDescent;
+ SHORT yInternalLeading;
+ SHORT yExternalLeading;
+ SHORT xAveCharWidth;
+ SHORT xMaxCharInc;
+ SHORT xEmInc;
+ SHORT yMaxBaselineExt;
+ SHORT sCharSlope;
+ SHORT sInlineDir;
+ SHORT sCharRot;
+ USHORT usWeightClass;
+ USHORT usWidthClass;
+ SHORT xDeviceRes;
+ SHORT yDeviceRes;
+ SHORT usFirstChar;
+ SHORT usLastChar;
+ SHORT usDefaultChar;
+ SHORT usBreakChar;
+ SHORT usNominalPointSize;
+ SHORT usMinimumPointSize;
+ SHORT usMaximumPointSize;
+ SHORT fsTypeFlags;
+ SHORT fsDefn;
+ SHORT fsSelectionFlags;
+ SHORT fsCapabilities;
+ SHORT ySubscriptXSize;
+ SHORT ySubscriptYSize;
+ SHORT ySubscriptXOffset;
+ SHORT ySubscriptYOffset;
+ SHORT ySuperscriptXSize;
+ SHORT ySuperscriptYSize;
+ SHORT ySuperscriptXOffset;
+ SHORT ySuperscriptYOffset;
+ SHORT yUnderscoreSize;
+ SHORT yUnderscorePosition;
+ SHORT yStrikeoutSize;
+ SHORT yStrikeoutPosition;
+ SHORT usKerningPairs;
+ SHORT sFamilyClass;
+ PSZ pszDeviceNameOffset;
+} FOCAMETRICS;
+typedef FOCAMETRICS FAR *PFOCAMETRICS;
+
+typedef struct _FONTDEFINITIONHEADER { /* fdh */
+ ULONG ulIdentity;
+ ULONG ulSize;
+ SHORT fsFontdef;
+ SHORT fsChardef;
+ SHORT usCellSize;
+ SHORT xCellWidth;
+ SHORT yCellHeight;
+ SHORT xCellIncrement;
+ SHORT xCellA;
+ SHORT xCellB;
+ SHORT xCellC;
+ SHORT pCellBaseOffset;
+} FONTDEFINITIONHEADER;
+typedef FONTDEFINITIONHEADER FAR *PFONTDEFINITIONHEADER;
+
+#define FONTDEFFONT1 0x0047 /* set width, height, inc. & base offset */
+#define FONTDEFFONT2 0x0042 /* set height & base offset */
+#define FONTDEFFONT3 0x0042 /* set height & base offset */
+#define FONTDEFCHAR1 0x0081 /* set char offset and width */
+#define FONTDEFCHAR2 0x0081 /* set char offset and width */
+#define FONTDEFCHAR3 0x00b8 /* set char offset, A, B, and C space */
+#define SPACE_UNDEF 0x8000 /* space undefined = take default */
+
+typedef struct _FONTSIGNATURE { /* fs */
+ ULONG ulIdentity;
+ ULONG ulSize;
+ CHAR achSignature[12];
+} FONTSIGNATURE;
+typedef FONTSIGNATURE FAR *PFONTSIGNATURE;
+
+typedef struct _FOCAFONT { /* ff */
+ FONTSIGNATURE fsSignature;
+ FOCAMETRICS fmMetrics;
+ FONTDEFINITIONHEADER fdDefinitions;
+} FOCAFONT;
+typedef FOCAFONT FAR *PFOCAFONT;
+
+#define FONT_SIGNATURE 0xfffffffe /* Identity header start */
+#define FONT_METRICS 0x00000001 /* Identity metrics */
+#define FONT_DEFINITION 0x00000002 /* Identity definition */
+#define FONT_ENDRECORD 0xffffffff /* Identity record end */
+
+/* Options for QueryFonts */
+
+#define QUERY_PUBLIC_FONTS 0x0001
+#define QUERY_PRIVATE_FONTS 0x0002
+
+#define CDEF_GENERIC 0x0001
+#define CDEF_BOLD 0x0002
+#define CDEF_ITALIC 0x0004
+#define CDEF_UNDERSCORE 0x0008
+#define CDEF_STRIKEOUT 0x0010
+#define CDEF_OUTLINE 0x0020
diff --git a/private/oleauto/tools/win16/os2/inc/pmgpi.h b/private/oleauto/tools/win16/os2/inc/pmgpi.h
new file mode 100644
index 000000000..4f427dc9f
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmgpi.h
@@ -0,0 +1,1388 @@
+/***************************************************************************\
+*
+* Module Name: PMGPI.H
+*
+* OS/2 Presentation Manager GPI constants, types and function declarations
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+* =============================================================================
+*
+* The following symbols are used in this file for conditional sections.
+*
+* INCL_GPI Include all of the GPI
+* INCL_GPICONTROL Basic PS control
+* INCL_GPICORRELATION Picking, Boundary and Correlation
+* INCL_GPISEGMENTS Segment Control and Drawing
+* INCL_GPISEGEDITING Segment Editing via Elements
+* INCL_GPITRANSFORMS Transform and Transform Conversion
+* INCL_GPIPATHS Paths and Clipping with Paths
+* INCL_GPILOGCOLORTABLE Logical Color Tables
+* INCL_GPIPRIMITIVES Drawing Primitives and Primitive Attributes
+* INCL_GPILCIDS Phyical and Logical Fonts with Lcids
+* INCL_GPIBITMAPS Bitmaps and Pel Operations
+* INCL_GPIREGIONS Regions and Clipping with Regions
+* INCL_GPIMETAFILES Metafiles
+* INCL_GPIDEFAULTS Default Primitive Attributes
+* INCL_GPIERRORS defined if INCL_ERRORS defined
+*
+* There is a symbol used in this file called INCL_DDIDEFS. This is used to
+* include only the definitions for the DDI. The programmer using the GPI
+* can ignore this symbol
+*
+* There is a symbol used in this file called INCL_SAADEFS. This is used to
+* include only the definitions for the SAA. The programmer using the GPI
+* can ignore this symbol
+*
+\***************************************************************************/
+
+#ifdef INCL_GPI /* include whole of the GPI */
+ #define INCL_GPICONTROL
+ #define INCL_GPICORRELATION
+ #define INCL_GPISEGMENTS
+ #define INCL_GPISEGEDITING
+ #define INCL_GPITRANSFORMS
+ #define INCL_GPIPATHS
+ #define INCL_GPILOGCOLORTABLE
+ #define INCL_GPIPRIMITIVES
+ #define INCL_GPILCIDS
+ #define INCL_GPIBITMAPS
+ #define INCL_GPIREGIONS
+ #define INCL_GPIMETAFILES
+ #define INCL_GPIDEFAULTS
+#endif /* INCL_GPI */
+
+#ifdef INCL_ERRORS /* if errors are required then allow GPI errors */
+ #define INCL_GPIERRORS
+#endif /* INCL_ERRORS */
+
+#ifdef INCL_DDIDEFS /* if only DDI required then enable DDI part of GPI */
+ #define INCL_GPITRANSFORMS
+ #define INCL_GPIPATHS
+ #define INCL_GPILOGCOLORTABLE
+ #define INCL_GPIPRIMITIVES
+ #define INCL_GPILCIDS
+ #define INCL_GPIBITMAPS
+ #define INCL_GPIREGIONS
+ #define INCL_GPIERRORS
+#endif /* INCL_DDIDEFS */
+
+#ifdef INCL_SAADEFS /* if only SAA required then enable SAA part of GPI */
+ #define INCL_GPICONTROL
+ #define INCL_GPICORRELATION
+ #define INCL_GPISEGMENTS
+ #define INCL_GPISEGEDITING
+ #define INCL_GPITRANSFORMS
+ #define INCL_GPIPATHS
+ #define INCL_GPILOGCOLORTABLE
+ #define INCL_GPIPRIMITIVES
+ #define INCL_GPILCIDS
+ #define INCL_GPIBITMAPS
+ #define INCL_GPIREGIONS
+ #define INCL_GPIMETAFILES
+ #define INCL_GPIERRORS
+#endif /* INCL_SAADEFS */
+
+/* General GPI return values */
+#define GPI_ERROR 0L
+#define GPI_OK 1L
+#define GPI_ALTERROR (-1L)
+
+/* fixed point number - implicit binary point between 2 and 3 hex digits */
+typedef LONG FIXED; /* fx */
+typedef FIXED FAR *PFIXED;
+
+/* fixed point number - implicit binary point between 1st and 2nd hex digits */
+typedef USHORT FIXED88; /* fx88 */
+
+/* fixed point signed number - implicit binary point between bits 14 and 13. */
+/* Bit 15 is the sign bit. */
+/* Thus 1.0 is represented by 16384 (0x4000) */
+/* and -1.0 is represented by -16384 (0xc000) */
+typedef USHORT FIXED114; /* fx114 */
+
+/* make FIXED number from SHORT integer part and USHORT fractional part */
+#define MAKEFIXED(intpart,fractpart) MAKELONG(fractpart,intpart)
+/* extract fractional part from a fixed quantity */
+#define FIXEDFRAC(fx) (LOUSHORT(fx))
+/* extract integer part from a fixed quantity */
+#define FIXEDINT(fx) ((SHORT)HIUSHORT(fx))
+
+/* structure for size parameters e.g. for GpiCreatePS */
+typedef struct _SIZEL { /* sizl */
+ LONG cx;
+ LONG cy;
+} SIZEL;
+typedef SIZEL FAR *PSIZEL;
+
+/* return code on GpiQueryLogColorTable,GpiQueryRealColors and GpiQueryPel */
+#define CLR_NOINDEX (-254L)
+
+#if (defined(INCL_GPICONTROL) || !defined(INCL_NOCOMMON))
+
+/* units for GpiCreatePS and others */
+#define PU_ARBITRARY 0x0004L
+#define PU_PELS 0x0008L
+#define PU_LOMETRIC 0x000CL
+#define PU_HIMETRIC 0x0010L
+#define PU_LOENGLISH 0x0014L
+#define PU_HIENGLISH 0x0018L
+#define PU_TWIPS 0x001CL
+
+/* format for GpiCreatePS */
+#define GPIF_DEFAULT 0L
+#define GPIF_SHORT 0x0100L
+#define GPIF_LONG 0x0200L
+
+
+/* PS type for GpiCreatePS */
+#define GPIT_NORMAL 0L
+#define GPIT_MICRO 0x1000L
+
+
+/* implicit associate flag for GpiCreatePS */
+#define GPIA_NOASSOC 0L
+#define GPIA_ASSOC 0x4000L
+
+#ifndef INCL_SAADEFS
+/* return error for GpiQueryDevice */
+#define HDC_ERROR ((HDC)-1L)
+#endif /* no INCL_SAADEFS */
+
+/* common GPICONTROL functions */
+HPS APIENTRY GpiCreatePS( HAB hab, HDC hdc, PSIZEL psizlSize, ULONG flOptions );
+BOOL APIENTRY GpiDestroyPS( HPS hps );
+BOOL APIENTRY GpiAssociate( HPS hps, HDC hdc );
+BOOL APIENTRY GpiRestorePS( HPS hps, LONG lPSid );
+LONG APIENTRY GpiSavePS( HPS hps );
+BOOL APIENTRY GpiErase( HPS hps );
+
+#ifndef INCL_SAADEFS
+HDC APIENTRY GpiQueryDevice( HPS );
+#endif /* no INCL_SAADEFS */
+
+#endif /* common GPICONTROL */
+#ifdef INCL_GPICONTROL
+
+/* options for GpiResetPS */
+#define GRES_ATTRS 0x0001L
+#define GRES_SEGMENTS 0x0002L
+#define GRES_ALL 0x0004L
+
+/* option masks for PS options used by GpiQueryPs */
+#define PS_UNITS 0x00FCL
+#define PS_FORMAT 0x0F00L
+#define PS_TYPE 0x1000L
+#define PS_MODE 0x2000L
+#define PS_ASSOCIATE 0x4000L
+#define PS_NORESET 0x8000L
+
+
+/* error context returned by GpiErrorSegmentData */
+#define GPIE_SEGMENT 0L
+#define GPIE_ELEMENT 1L
+#define GPIE_DATA 2L
+
+#ifndef INCL_SAADEFS
+
+/* control parameter for GpiSetDrawControl */
+#define DCTL_ERASE 1L
+#define DCTL_DISPLAY 2L
+#define DCTL_BOUNDARY 3L
+#define DCTL_DYNAMIC 4L
+#define DCTL_CORRELATE 5L
+
+/* constants for GpiSet/QueryDrawControl */
+#define DCTL_ERROR -1L
+#define DCTL_OFF 0L
+#define DCTL_ON 1L
+
+/* constants for GpiSet/QueryStopDraw */
+#define SDW_ERROR -1L
+#define SDW_OFF 0L
+#define SDW_ON 1L
+
+#endif /* no INCL_SAADEFS */
+
+/* drawing for GpiSet/QueryDrawingMode */
+#define DM_ERROR 0L
+#define DM_DRAW 1L
+#define DM_RETAIN 2L
+#define DM_DRAWANDRETAIN 3L
+
+/*** other GPICONTROL functions */
+BOOL APIENTRY GpiResetPS( HPS hps, ULONG flOptions );
+
+#ifndef INCL_SAADEFS
+
+BOOL APIENTRY GpiSetPS( HPS hps, PSIZEL psizlsize, ULONG flOptions );
+
+#endif /* no INCL_SAADEFS */
+
+ULONG APIENTRY GpiQueryPS( HPS hps, PSIZEL psizlSize );
+LONG APIENTRY GpiErrorSegmentData( HPS hps, PLONG plSegment, PLONG plContext );
+
+#ifndef INCL_SAADEFS
+
+LONG APIENTRY GpiQueryDrawControl( HPS hps, LONG lControl );
+BOOL APIENTRY GpiSetDrawControl( HPS hps, LONG lControl, LONG lValue );
+
+#endif /* no INCL_SAADEFS */
+
+LONG APIENTRY GpiQueryDrawingMode( HPS hps );
+BOOL APIENTRY GpiSetDrawingMode( HPS hps, LONG lMode );
+
+#ifndef INCL_SAADEFS
+
+LONG APIENTRY GpiQueryStopDraw( HPS hps );
+BOOL APIENTRY GpiSetStopDraw( HPS hps, LONG lValue );
+
+#endif /* no INCL_SAADEFS */
+
+#endif /* non-common GPICONTROL */
+#ifdef INCL_GPICORRELATION
+
+/* options for GpiSetPickApertureSize */
+#define PICKAP_DEFAULT 0L
+#define PICKAP_REC 2L
+
+/* type of correlation for GpiCorrelateChain */
+#define PICKSEL_VISIBLE 0L
+#define PICKSEL_ALL 1L
+
+/* return code to indicate correlate hit(s) */
+#define GPI_HITS 2L
+
+/*** picking, correlation and boundary functions */
+LONG APIENTRY GpiCorrelateChain( HPS hps, LONG lType, PPOINTL pptlPick
+ , LONG lMaxHits, LONG lMaxDepth, PLONG pl2 );
+BOOL APIENTRY GpiQueryTag( HPS hps, PLONG plTag );
+BOOL APIENTRY GpiSetTag( HPS hps, LONG lTag );
+BOOL APIENTRY GpiQueryPickApertureSize( HPS hps, PSIZEL psizlSize );
+BOOL APIENTRY GpiSetPickApertureSize( HPS hps, LONG lOptions, PSIZEL psizlSize );
+
+#ifndef INCL_SAADEFS
+
+BOOL APIENTRY GpiQueryPickAperturePosition( HPS hps, PPOINTL pptlPoint );
+BOOL APIENTRY GpiSetPickAperturePosition( HPS hps, PPOINTL pptlPick );
+BOOL APIENTRY GpiQueryBoundaryData( HPS hps, PRECTL prclBoundary );
+BOOL APIENTRY GpiResetBoundaryData( HPS hps );
+
+#endif /* no INCL_SAADEFS */
+
+LONG APIENTRY GpiCorrelateFrom( HPS hps, LONG lFirstSegment, LONG lLastSegment
+ , LONG lType, PPOINTL pptlPick, LONG lMaxHits
+ , LONG lMaxDepth, PLONG plSegTag );
+LONG APIENTRY GpiCorrelateSegment( HPS hps, LONG lSegment, LONG lType
+ , PPOINTL pptlPick, LONG lMaxHits
+ , LONG lMaxDepth, PLONG alSegTag );
+
+#endif /* non-common_GPICORRELATION */
+#ifdef INCL_GPISEGMENTS
+
+/* data formats for GpiPutData and GpiGetData */
+#define DFORM_NOCONV 0L
+
+#ifndef INCL_SAADEFS
+
+#define DFORM_S370SHORT 1L
+#define DFORM_PCSHORT 2L
+#define DFORM_PCLONG 4L
+
+#endif /* no INCL_SAADEFS */
+
+/* segment attributes used by GpiSet/QuerySegmentAttrs and others */
+#define ATTR_ERROR (-1L)
+#define ATTR_DETECTABLE 1L
+#define ATTR_VISIBLE 2L
+#define ATTR_CHAINED 6L
+
+#ifndef INCL_SAADEFS
+
+#define ATTR_DYNAMIC 8L
+
+#endif /* no INCL_SAADEFS */
+
+#define ATTR_FASTCHAIN 9L
+#define ATTR_PROP_DETECTABLE 10L
+#define ATTR_PROP_VISIBLE 11L
+
+/* attribute on/off values */
+#define ATTR_OFF 0L
+#define ATTR_ON 1L
+
+/* segment priority used by GpiSetSegmentPriority and others */
+#define LOWER_PRI (-1L)
+#define HIGHER_PRI 1L
+
+/*** segment control functions */
+BOOL APIENTRY GpiOpenSegment( HPS hps, LONG lSegment );
+BOOL APIENTRY GpiCloseSegment( HPS hps );
+BOOL APIENTRY GpiDeleteSegment( HPS hps, LONG lSegid );
+LONG APIENTRY GpiQueryInitialSegmentAttrs( HPS hps, LONG lAttribute );
+BOOL APIENTRY GpiSetInitialSegmentAttrs( HPS hps, LONG lAttribute, LONG lValue );
+LONG APIENTRY GpiQuerySegmentAttrs( HPS hps, LONG lSegid, LONG lAttribute );
+BOOL APIENTRY GpiSetSegmentAttrs( HPS hps, LONG lSegid, LONG lAttribute
+ , LONG lValue );
+LONG APIENTRY GpiQuerySegmentPriority( HPS hps, LONG lRefSegid, LONG lOrder );
+BOOL APIENTRY GpiSetSegmentPriority( HPS hps, LONG lSegid, LONG lRefSegid
+ , LONG lOrder );
+BOOL APIENTRY GpiDeleteSegments( HPS hps, LONG lFirstSegment, LONG lLastSegment );
+LONG APIENTRY GpiQuerySegmentNames( HPS hps, LONG lFirstSegid, LONG lLastSegid
+ , LONG lMax, PLONG alSegids );
+
+/*** draw functions for segments */
+LONG APIENTRY GpiGetData( HPS hps, LONG lSegid, PLONG plOffset
+ , LONG lFormat, LONG lLength, PBYTE pbData );
+LONG APIENTRY GpiPutData( HPS hps, LONG lFormat, PLONG plCount, PBYTE pbData );
+BOOL APIENTRY GpiDrawChain( HPS hps );
+BOOL APIENTRY GpiDrawFrom( HPS hps, LONG lFirstSegment, LONG lLastSegment );
+BOOL APIENTRY GpiDrawSegment( HPS hps, LONG lSegment );
+
+#ifndef INCL_SAADEFS
+
+BOOL APIENTRY GpiDrawDynamics( HPS hps );
+BOOL APIENTRY GpiRemoveDynamics( HPS hps, LONG lFirstSegid, LONG lLastSegid );
+
+#endif /* no INCL_SAADEFS */
+
+#endif /* non-common GPISEGMENTS */
+#ifdef INCL_GPISEGEDITING
+
+/* edit modes used by GpiSet/QueryEditMode */
+#define SEGEM_ERROR 0L
+#define SEGEM_INSERT 1L
+#define SEGEM_REPLACE 2L
+
+/*** segment editing by element functions */
+BOOL APIENTRY GpiBeginElement( HPS hps, LONG lType, PSZ pszDesc );
+BOOL APIENTRY GpiEndElement( HPS hps );
+BOOL APIENTRY GpiLabel( HPS hps, LONG lLabel );
+LONG APIENTRY GpiElement( HPS hps, LONG lType, PSZ pszDesc
+ , LONG lLength, PBYTE pbData );
+LONG APIENTRY GpiQueryElement( HPS hps, LONG lOff, LONG lMaxLength
+ , PBYTE pbData );
+BOOL APIENTRY GpiDeleteElement( HPS hps );
+BOOL APIENTRY GpiDeleteElementRange( HPS hps, LONG lFirstElement
+ , LONG lLastElement );
+BOOL APIENTRY GpiDeleteElementsBetweenLabels( HPS hps, LONG lFirstLabel
+ , LONG lLastLabel );
+LONG APIENTRY GpiQueryEditMode( HPS hps );
+BOOL APIENTRY GpiSetEditMode( HPS hps, LONG lMode );
+LONG APIENTRY GpiQueryElementPointer( HPS hps );
+BOOL APIENTRY GpiSetElementPointer( HPS hps, LONG lElement );
+BOOL APIENTRY GpiOffsetElementPointer( HPS hps, LONG loffset );
+LONG APIENTRY GpiQueryElementType( HPS hps, PLONG plType, LONG lLength
+ , PSZ pszData );
+BOOL APIENTRY GpiSetElementPointerAtLabel( HPS hps, LONG lLabel );
+
+#endif /* non-common GPISEGEDITING */
+#ifdef INCL_GPITRANSFORMS
+
+/* co-ordinates space for GpiConvert */
+#define CVTC_WORLD 1L
+#define CVTC_MODEL 2L
+#define CVTC_DEFAULTPAGE 3L
+#define CVTC_PAGE 4L
+#define CVTC_DEVICE 5L
+
+/* type of transformation for GpiSetSegmentTransformMatrix */
+#define TRANSFORM_REPLACE 0L
+#define TRANSFORM_ADD 1L
+#define TRANSFORM_PREEMPT 2L
+
+/* transform matrix */
+typedef struct _MATRIXLF { /* matlf */
+ FIXED fxM11;
+ FIXED fxM12;
+ LONG lM13;
+ FIXED fxM21;
+ FIXED fxM22;
+ LONG lM23;
+ LONG lM31;
+ LONG lM32;
+ LONG lM33;
+} MATRIXLF;
+typedef MATRIXLF FAR *PMATRIXLF;
+
+#ifndef INCL_DDIDEFS
+
+/*** transform and transform conversion functions */
+BOOL APIENTRY GpiQuerySegmentTransformMatrix( HPS hps, LONG lSegid, LONG lCount
+ , PMATRIXLF pmatlfArray );
+BOOL APIENTRY GpiSetSegmentTransformMatrix( HPS hps, LONG lSegid, LONG lCount
+ , PMATRIXLF pmatlfarray
+ , LONG lOptions );
+BOOL APIENTRY GpiConvert( HPS hps, LONG lSrc, LONG lTarg, LONG lCount
+ , PPOINTL aptlPoints );
+BOOL APIENTRY GpiQueryModelTransformMatrix( HPS hps, LONG lCount
+ , PMATRIXLF pmatlfArray );
+BOOL APIENTRY GpiSetModelTransformMatrix( HPS hps, LONG lCount
+ , PMATRIXLF pmatlfArray, LONG lOptions );
+LONG APIENTRY GpiCallSegmentMatrix( HPS hps, LONG lSegment, LONG lCount
+ , PMATRIXLF pmatlfArray, LONG lOptions );
+BOOL APIENTRY GpiQueryDefaultViewMatrix( HPS hps, LONG lCount
+ , PMATRIXLF pmatlfArray );
+BOOL APIENTRY GpiSetDefaultViewMatrix( HPS hps, LONG lCount
+ , PMATRIXLF pmatlfarray, LONG lOptions );
+BOOL APIENTRY GpiQueryPageViewport( HPS hps, PRECTL prclViewport );
+BOOL APIENTRY GpiSetPageViewport( HPS hps, PRECTL prclViewport );
+BOOL APIENTRY GpiQueryViewingTransformMatrix( HPS hps, LONG lCount
+ , PMATRIXLF pmatlfArray );
+BOOL APIENTRY GpiSetViewingTransformMatrix( HPS hps, LONG lCount
+ , PMATRIXLF pmatlfArray
+ , LONG lOptions );
+
+/*** transform helper routines */
+BOOL APIENTRY GpiTranslate( HPS, PMATRIXLF, LONG, PPOINTL );
+BOOL APIENTRY GpiScale( HPS, PMATRIXLF, LONG, PFIXED, PPOINTL );
+BOOL APIENTRY GpiRotate( HPS, PMATRIXLF, LONG, FIXED, PPOINTL );
+
+/*** general clipping functions */
+BOOL APIENTRY GpiSetGraphicsField( HPS hps, PRECTL prclField );
+BOOL APIENTRY GpiQueryGraphicsField( HPS hps, PRECTL prclField );
+BOOL APIENTRY GpiSetViewingLimits( HPS hps, PRECTL prclLimits );
+BOOL APIENTRY GpiQueryViewingLimits( HPS hps, PRECTL prclLimits );
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* non-common GPITRANSFORMS */
+#ifdef INCL_GPIPATHS
+
+/* modes for GpiModifyPath */
+#define MPATH_STROKE 6L
+
+/* modes for GpiFillPath */
+#define FPATH_ALTERNATE 0L
+#define FPATH_WINDING 2L
+
+/* modes for GpiSetClipPath */
+#define SCP_ALTERNATE 0L
+#define SCP_WINDING 2L
+#define SCP_AND 4L
+#define SCP_RESET 0L
+
+#ifndef INCL_DDIDEFS
+
+/*** Path and Clip Path functions */
+BOOL APIENTRY GpiBeginPath( HPS hps, LONG lPath );
+BOOL APIENTRY GpiEndPath( HPS hps );
+BOOL APIENTRY GpiCloseFigure( HPS hps );
+BOOL APIENTRY GpiModifyPath( HPS hps, LONG lPath, LONG lMode );
+LONG APIENTRY GpiFillPath( HPS hps, LONG lPath, LONG lOptions );
+BOOL APIENTRY GpiSetClipPath( HPS hps, LONG lPath, LONG lOptions );
+LONG APIENTRY GpiOutlinePath( HPS hps, LONG lPath, LONG lOptions );
+
+#ifndef INCL_SAADEFS
+
+LONG APIENTRY GpiStrokePath( HPS hps, LONG lPath, ULONG flOptions );
+
+#endif /* no INCL_SAADEFS */
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* non-common GPIPATHS */
+#ifdef INCL_GPILOGCOLORTABLE
+
+/* options for GpiCreateLogColorTable and others */
+#define LCOL_RESET 0x0001L
+#define LCOL_REALIZABLE 0x0002L
+#define LCOL_PURECOLOR 0x0004L
+
+/* format of logical lColor table for GpiCreateLogColorTable and others */
+#define LCOLF_DEFAULT 0L
+#define LCOLF_INDRGB 1L
+#define LCOLF_CONSECRGB 2L
+#define LCOLF_RGB 3L
+
+/* options for GpiQueryRealColors and others */
+#define LCOLOPT_REALIZED 0x0001L
+#define LCOLOPT_INDEX 0x0002L
+
+#ifndef INCL_SAADEFS
+
+/* return codes from GpiQueryLogColorTable to indicate it is in RGB mode */
+#define QLCT_ERROR (-1L)
+#define QLCT_RGB (-2L)
+
+/* GpiQueryLogColorTable index returned for colors not explicitly loaded */
+#define QLCT_NOTLOADED (-1L)
+
+#endif /* no INCL_SAADEFS */
+
+/* return codes for GpiQueryColorData */
+#define QCD_LCT_FORMAT 0L
+#define QCD_LCT_LOINDEX 1L
+#define QCD_LCT_HIINDEX 2L
+
+#ifndef INCL_DDIDEFS
+
+/*** logical lColor table functions */
+BOOL APIENTRY GpiCreateLogColorTable( HPS hps, ULONG flOptions, LONG lFormat
+ , LONG lStart, LONG lCount, PLONG alTable );
+BOOL APIENTRY GpiRealizeColorTable( HPS hps );
+BOOL APIENTRY GpiUnrealizeColorTable( HPS hps );
+BOOL APIENTRY GpiQueryColorData( HPS hps, LONG lCount, PLONG alArray );
+
+#ifndef INCL_SAADEFS
+
+LONG APIENTRY GpiQueryLogColorTable( HPS hps, ULONG flOptions, LONG lStart
+ , LONG lCount, PLONG alArray );
+
+#endif /* no INCL_SAADEFS */
+
+LONG APIENTRY GpiQueryRealColors( HPS hps, ULONG flOptions, LONG lStart
+ , LONG lCount, PLONG alColors );
+LONG APIENTRY GpiQueryNearestColor( HPS hps, ULONG flOptions, LONG lRgbIn );
+LONG APIENTRY GpiQueryColorIndex( HPS hps, ULONG flOptions, LONG lRgbColor );
+LONG APIENTRY GpiQueryRGBColor( HPS hps, ULONG flOptions, LONG lColorIndex );
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* non-common GPILOGCOLORTABLE */
+#if (defined(INCL_GPIPRIMITIVES) || !defined(INCL_NOCOMMON))
+
+/* default color table indices */
+
+#define CLR_FALSE (-5L)
+#define CLR_TRUE (-4L)
+
+#define CLR_ERROR (-255L)
+#define CLR_DEFAULT (-3L)
+#define CLR_WHITE (-2L)
+#define CLR_BLACK (-1L)
+#define CLR_BACKGROUND 0L
+#define CLR_BLUE 1L
+#define CLR_RED 2L
+#define CLR_PINK 3L
+#define CLR_GREEN 4L
+#define CLR_CYAN 5L
+#define CLR_YELLOW 6L
+#define CLR_NEUTRAL 7L
+
+#define CLR_DARKGRAY 8L
+#define CLR_DARKBLUE 9L
+#define CLR_DARKRED 10L
+#define CLR_DARKPINK 11L
+#define CLR_DARKGREEN 12L
+#define CLR_DARKCYAN 13L
+#define CLR_BROWN 14L
+#define CLR_PALEGRAY 15L
+
+/* rgb colors */
+#define RGB_ERROR (-255L)
+#define RGB_BLACK 0x00000000L
+#define RGB_BLUE 0x000000FFL
+#define RGB_GREEN 0x0000FF00L
+#define RGB_CYAN 0x0000FFFFL
+#define RGB_RED 0x00FF0000L
+#define RGB_PINK 0x00FF00FFL
+#define RGB_YELLOW 0x00FFFF00L
+#define RGB_WHITE 0x00FFFFFFL
+
+/* control flags used by GpiBeginArea */
+#define BA_NOBOUNDARY 0L
+#define BA_BOUNDARY 0x0001L
+
+
+#define BA_ALTERNATE 0L
+#define BA_WINDING 0x0002L
+
+
+/* fill options for GpiBox/GpiFullArc */
+#define DRO_FILL 1L
+#define DRO_OUTLINE 2L
+#define DRO_OUTLINEFILL 3L
+
+/* basic pattern symbols */
+#define PATSYM_ERROR (-1L)
+#define PATSYM_DEFAULT 0L
+#define PATSYM_DENSE1 1L
+#define PATSYM_DENSE2 2L
+#define PATSYM_DENSE3 3L
+#define PATSYM_DENSE4 4L
+#define PATSYM_DENSE5 5L
+#define PATSYM_DENSE6 6L
+#define PATSYM_DENSE7 7L
+#define PATSYM_DENSE8 8L
+#define PATSYM_VERT 9L
+#define PATSYM_HORIZ 10L
+#define PATSYM_DIAG1 11L
+#define PATSYM_DIAG2 12L
+#define PATSYM_DIAG3 13L
+#define PATSYM_DIAG4 14L
+#define PATSYM_NOSHADE 15L
+#define PATSYM_SOLID 16L
+#define PATSYM_BLANK 64L
+#ifndef INCL_SAADEFS
+#define PATSYM_HALFTONE 17L
+#endif /* no INCL_SAADEFS */
+
+/* lcid values for GpiSet/QueryPattern and others */
+#define LCID_ERROR (-1L)
+#define LCID_DEFAULT 0L
+
+#ifndef INCL_DDIDEFS
+
+/*** global primitive functions */
+BOOL APIENTRY GpiSetColor( HPS hps, LONG lColor );
+LONG APIENTRY GpiQueryColor( HPS hps );
+
+/*** line primitive functions */
+LONG APIENTRY GpiBox( HPS hps, LONG lControl, PPOINTL pptlPoint
+ , LONG lHRound, LONG lVRound );
+
+BOOL APIENTRY GpiMove( HPS hps, PPOINTL pptlPoint );
+LONG APIENTRY GpiLine( HPS hps, PPOINTL pptlEndPoint );
+LONG APIENTRY GpiPolyLine( HPS hps, LONG lCount, PPOINTL aptlPoints );
+
+/*** area primitive functions */
+BOOL APIENTRY GpiSetPattern( HPS hps, LONG lPatternSymbol );
+LONG APIENTRY GpiQueryPattern( HPS hps );
+BOOL APIENTRY GpiBeginArea( HPS hps, ULONG flOptions );
+LONG APIENTRY GpiEndArea( HPS hps );
+
+/*** character primitive functions */
+LONG APIENTRY GpiCharString( HPS hps, LONG lCount, PCH pchString );
+LONG APIENTRY GpiCharStringAt( HPS hps, PPOINTL pptlPoint
+ , LONG lCount, PCH pchString );
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* common GPIPRIMTIVES */
+#ifdef INCL_GPIPRIMITIVES
+
+/* mode for GpiSetAttrMode */
+#define AM_ERROR (-1L)
+#define AM_PRESERVE 0L
+#define AM_NOPRESERVE 1L
+
+/* foreground mixes */
+#define FM_ERROR (-1L)
+#define FM_DEFAULT 0L
+#define FM_OR 1L
+#define FM_OVERPAINT 2L
+#define FM_LEAVEALONE 5L
+
+
+#define FM_XOR 4L
+#define FM_AND 6L
+#define FM_SUBTRACT 7L
+#define FM_MASKSRCNOT 8L
+#define FM_ZERO 9L
+#define FM_NOTMERGESRC 10L
+#define FM_NOTXORSRC 11L
+#define FM_INVERT 12L
+#define FM_MERGESRCNOT 13L
+#define FM_NOTCOPYSRC 14L
+#define FM_MERGENOTSRC 15L
+#define FM_NOTMASKSRC 16L
+#define FM_ONE 17L
+
+
+/* background mixes */
+#define BM_ERROR (-1L)
+#define BM_DEFAULT 0L
+#define BM_OVERPAINT 2L
+#define BM_LEAVEALONE 5L
+
+
+#define BM_OR 1L
+#define BM_XOR 4L
+
+
+/* basic line type styles */
+#define LINETYPE_ERROR (-1L)
+#define LINETYPE_DEFAULT 0L
+#define LINETYPE_DOT 1L
+#define LINETYPE_SHORTDASH 2L
+#define LINETYPE_DASHDOT 3L
+#define LINETYPE_DOUBLEDOT 4L
+#define LINETYPE_LONGDASH 5L
+#define LINETYPE_DASHDOUBLEDOT 6L
+#define LINETYPE_SOLID 7L
+#define LINETYPE_INVISIBLE 8L
+#ifndef INCL_SAADEFS
+#define LINETYPE_ALTERNATE 9L
+#endif /* no INCL_SAADEFS */
+
+/* cosmetic line widths */
+#define LINEWIDTH_ERROR (-1L)
+#define LINEWIDTH_DEFAULT 0L
+#define LINEWIDTH_NORMAL 0x00010000L /* MAKEFIXED(1,0) */
+
+/* actual line widths */
+#define LINEWIDTHGEOM_ERROR (-1L)
+
+/* line end styles */
+#define LINEEND_ERROR (-1L)
+#define LINEEND_DEFAULT 0L
+#define LINEEND_FLAT 1L
+#define LINEEND_SQUARE 2L
+#define LINEEND_ROUND 3L
+
+/* line join styles */
+#define LINEJOIN_ERROR (-1L)
+#define LINEJOIN_DEFAULT 0L
+#define LINEJOIN_BEVEL 1L
+#define LINEJOIN_ROUND 2L
+#define LINEJOIN_MITRE 3L
+
+/* character directions */
+#define CHDIRN_ERROR (-1L)
+#define CHDIRN_DEFAULT 0L
+#define CHDIRN_LEFTRIGHT 1L
+#define CHDIRN_TOPBOTTOM 2L
+#define CHDIRN_RIGHTLEFT 3L
+#define CHDIRN_BOTTOMTOP 4L
+
+/* character modes */
+#define CM_ERROR (-1L)
+#define CM_DEFAULT 0L
+#define CM_MODE1 1L
+#define CM_MODE2 2L
+#define CM_MODE3 3L
+
+/* basic marker symbols */
+#define MARKSYM_ERROR (-1L)
+#define MARKSYM_DEFAULT 0L
+#define MARKSYM_CROSS 1L
+#define MARKSYM_PLUS 2L
+#define MARKSYM_DIAMOND 3L
+#define MARKSYM_SQUARE 4L
+#define MARKSYM_SIXPOINTSTAR 5L
+#define MARKSYM_EIGHTPOINTSTAR 6L
+#define MARKSYM_SOLIDDIAMOND 7L
+#define MARKSYM_SOLIDSQUARE 8L
+#define MARKSYM_DOT 9L
+#define MARKSYM_SMALLCIRCLE 10L
+#define MARKSYM_BLANK 64L
+
+/* formatting options for GpiCharStringPosAt */
+#define CHS_OPAQUE 0x0001L
+#define CHS_VECTOR 0x0002L
+#define CHS_LEAVEPOS 0x0008L
+#define CHS_CLIP 0x0010L
+
+/* bundle codes for GpiSetAttributes and GpiQueryAttributes */
+#define PRIM_LINE 1L
+#define PRIM_CHAR 2L
+#define PRIM_MARKER 3L
+#define PRIM_AREA 4L
+#define PRIM_IMAGE 5L
+
+/* line bundle mask bits */
+#define LBB_COLOR 0x0001L
+#define LBB_MIX_MODE 0x0004L
+#define LBB_WIDTH 0x0010L
+#define LBB_GEOM_WIDTH 0x0020L
+#define LBB_TYPE 0x0040L
+#define LBB_END 0x0080L
+#define LBB_JOIN 0x0100L
+
+/* character bundle mask bits */
+#define CBB_COLOR 0x0001L
+#define CBB_BACK_COLOR 0x0002L
+#define CBB_MIX_MODE 0x0004L
+#define CBB_BACK_MIX_MODE 0x0008L
+#define CBB_SET 0x0010L
+#define CBB_MODE 0x0020L
+#define CBB_BOX 0x0040L
+#define CBB_ANGLE 0x0080L
+#define CBB_SHEAR 0x0100L
+#define CBB_DIRECTION 0x0200L
+
+/* marker bundle mask bits */
+#define MBB_COLOR 0x0001L
+#define MBB_BACK_COLOR 0x0002L
+#define MBB_MIX_MODE 0x0004L
+#define MBB_BACK_MIX_MODE 0x0008L
+#define MBB_SET 0x0010L
+#define MBB_SYMBOL 0x0020L
+#define MBB_BOX 0x0040L
+
+/* pattern bundle mask bits */
+#define ABB_COLOR 0x0001L
+#define ABB_BACK_COLOR 0x0002L
+#define ABB_MIX_MODE 0x0004L
+#define ABB_BACK_MIX_MODE 0x0008L
+#define ABB_SET 0x0010L
+#define ABB_SYMBOL 0x0020L
+#define ABB_REF_POINT 0x0040L
+
+/* image bundle mask bits */
+#define IBB_COLOR 0x0001L
+#define IBB_BACK_COLOR 0x0002L
+#define IBB_MIX_MODE 0x0004L
+#define IBB_BACK_MIX_MODE 0x0008L
+
+/* structure for GpiSetArcParams and GpiQueryArcParams */
+typedef struct _ARCPARAMS { /* arcp */
+ LONG lP;
+ LONG lQ;
+ LONG lR;
+ LONG lS;
+} ARCPARAMS;
+typedef ARCPARAMS FAR *PARCPARAMS;
+
+/* variation of SIZE used for FIXEDs */
+typedef struct _SIZEF { /* sizfx */
+ FIXED cx;
+ FIXED cy;
+} SIZEF;
+typedef SIZEF FAR *PSIZEF;
+
+/* structure for gradient parameters e.g. for GpiSetCharAngle */
+typedef struct _GRADIENTL { /* gradl */
+ LONG x;
+ LONG y;
+} GRADIENTL;
+typedef GRADIENTL FAR *PGRADIENTL;
+
+/* line bundle for GpiSetAttributes and GpiQueryAttributes */
+typedef struct _LINEBUNDLE { /* lbnd */
+ LONG lColor;
+ LONG lReserved;
+ USHORT usMixMode;
+ USHORT usReserved;
+ FIXED fxWidth;
+ LONG lGeomWidth;
+ USHORT usType;
+ USHORT usEnd;
+ USHORT usJoin;
+} LINEBUNDLE;
+
+/* character bundle for GpiSetAttributes and GpiQueryAttributes */
+typedef struct _CHARBUNDLE { /* cbnd */
+ LONG lColor;
+ LONG lBackColor;
+ USHORT usMixMode;
+ USHORT usBackMixMode;
+ USHORT usSet;
+ USHORT usPrecision;
+ SIZEF sizfxCell;
+ POINTL ptlAngle;
+ POINTL ptlShear;
+ USHORT usDirection;
+} CHARBUNDLE;
+
+/* marker bundle for GpiSetAttributes and GpiQueryAttributes */
+typedef struct _MARKERBUNDLE { /* mbnd */
+ LONG lColor;
+ LONG lBackColor;
+ USHORT usMixMode;
+ USHORT usBackMixMode;
+ USHORT usSet;
+ USHORT usSymbol;
+ SIZEF sizfxCell;
+} MARKERBUNDLE;
+
+/* pattern bundle for GpiSetAttributes and GpiQueryAttributes */
+typedef struct _AREABUNDLE { /* pbnd */
+ LONG lColor;
+ LONG lBackColor;
+ USHORT usMixMode;
+ USHORT usBackMixMode;
+ USHORT usSet;
+ USHORT usSymbol;
+ POINTL ptlRefPoint ;
+} AREABUNDLE;
+
+/* image bundle for GpiSetAttributes and GpiQueryAttributes */
+typedef struct _IMAGEBUNDLE { /* ibmd */
+ LONG lColor;
+ LONG lBackColor;
+ USHORT usMixMode;
+ USHORT usBackMixMode;
+} IMAGEBUNDLE;
+
+/* pointer to any bundle used by GpiSet/QueryAttrs */
+typedef PVOID PBUNDLE;
+
+/* array indices for GpiQueryTextBox */
+#define TXTBOX_TOPLEFT 0L
+#define TXTBOX_BOTTOMLEFT 1L
+#define TXTBOX_TOPRIGHT 2L
+#define TXTBOX_BOTTOMRIGHT 3L
+#define TXTBOX_CONCAT 4L
+/* array count for GpiQueryTextBox */
+#define TXTBOX_COUNT 5L
+
+/* return codes for GpiPtVisible */
+#define PVIS_ERROR 0L
+#define PVIS_INVISIBLE 1L
+#define PVIS_VISIBLE 2L
+
+/* return codes for GpiRectVisible */
+#define RVIS_ERROR 0L
+#define RVIS_INVISIBLE 1L
+#define RVIS_PARTIAL 2L
+#define RVIS_VISIBLE 3L
+
+#ifndef INCL_DDIDEFS
+
+/*** attribute mode functions */
+BOOL APIENTRY GpiSetAttrMode( HPS hps, LONG lMode );
+LONG APIENTRY GpiQueryAttrMode( HPS hps );
+/*** bundle primitive functions */
+BOOL APIENTRY GpiSetAttrs( HPS hps, LONG lPrimType, ULONG flAttrMask
+ , ULONG flDefMask, PBUNDLE ppbunAttrs );
+#ifndef INCL_SAADEFS
+
+LONG APIENTRY GpiQueryAttrs( HPS hps, LONG lPrimType
+ , ULONG flAttrMask, PBUNDLE ppbunAttrs );
+
+#endif /* no INCL_SAADEFS */
+
+/*** global primitive functions */
+BOOL APIENTRY GpiSetBackColor( HPS hps, LONG lColor );
+LONG APIENTRY GpiQueryBackColor( HPS hps );
+BOOL APIENTRY GpiSetMix( HPS hps, LONG lMixMode );
+LONG APIENTRY GpiQueryMix( HPS hps );
+BOOL APIENTRY GpiSetBackMix( HPS hps, LONG lMixMode );
+LONG APIENTRY GpiQueryBackMix( HPS hps );
+
+/*** line primitive functions */
+BOOL APIENTRY GpiSetLineType( HPS hps, LONG lLineType );
+LONG APIENTRY GpiQueryLineType( HPS hps );
+BOOL APIENTRY GpiSetLineWidth( HPS hps, FIXED fxLineWidth );
+FIXED APIENTRY GpiQueryLineWidth( HPS hps );
+
+BOOL APIENTRY GpiSetLineWidthGeom( HPS hps, LONG lLineWidth );
+LONG APIENTRY GpiQueryLineWidthGeom( HPS hps );
+BOOL APIENTRY GpiSetLineEnd( HPS hps, LONG lLineEnd );
+LONG APIENTRY GpiQueryLineEnd( HPS hps );
+BOOL APIENTRY GpiSetLineJoin( HPS hps, LONG lLineJoin );
+LONG APIENTRY GpiQueryLineJoin( HPS hps );
+
+BOOL APIENTRY GpiSetCurrentPosition( HPS hps, PPOINTL pptlPoint );
+BOOL APIENTRY GpiQueryCurrentPosition( HPS hps, PPOINTL pptlPoint );
+
+/*** arc primitive functions */
+BOOL APIENTRY GpiSetArcParams( HPS hps, PARCPARAMS parcpArcParams );
+BOOL APIENTRY GpiQueryArcParams( HPS hps, PARCPARAMS parcpArcParams );
+
+LONG APIENTRY GpiPointArc( HPS hps, PPOINTL pptl2 );
+
+LONG APIENTRY GpiFullArc( HPS hps, LONG lControl, FIXED fxMultiplier );
+LONG APIENTRY GpiPartialArc( HPS hps, PPOINTL pptlCenter, FIXED fxMultiplier
+ , FIXED fxStartAngle, FIXED fxSweepAngle );
+LONG APIENTRY GpiPolyFillet( HPS hps, LONG lCount, PPOINTL aptlPoints );
+LONG APIENTRY GpiPolySpline( HPS hps, LONG lCount, PPOINTL aptlPoints );
+LONG APIENTRY GpiPolyFilletSharp( HPS hps, LONG lCount, PPOINTL aptlPoints
+ , PFIXED afxPoints );
+
+/*** area primitive functions */
+BOOL APIENTRY GpiSetPatternSet( HPS hps, LONG lSet );
+LONG APIENTRY GpiQueryPatternSet( HPS hps );
+BOOL APIENTRY GpiSetPatternRefPoint( HPS hps, PPOINTL pptlRefPoint );
+BOOL APIENTRY GpiQueryPatternRefPoint( HPS hps, PPOINTL pptlRefPoint );
+
+/*** character primitive functions */
+
+BOOL APIENTRY GpiQueryCharStringPos( HPS hps, ULONG flOptions, LONG lCount
+ , PCH pchString, PLONG alXincrements
+ , PPOINTL aptlPositions );
+BOOL APIENTRY GpiQueryCharStringPosAt( HPS hps, PPOINTL pptlStart
+ , ULONG flOptions, LONG lCount
+ , PCH pchString, PLONG alXincrements
+ , PPOINTL aptlPositions );
+BOOL APIENTRY GpiQueryTextBox( HPS hps, LONG lCount1, PCH pchString
+ , LONG lCount2, PPOINTL aptlPoints );
+BOOL APIENTRY GpiQueryDefCharBox( HPS hps, PSIZEL psizlSize );
+BOOL APIENTRY GpiSetCharSet( HPS hps, LONG llcid );
+LONG APIENTRY GpiQueryCharSet( HPS hps );
+BOOL APIENTRY GpiSetCharBox( HPS hps, PSIZEF psizfxBox );
+BOOL APIENTRY GpiQueryCharBox( HPS hps, PSIZEF psizfxSize );
+BOOL APIENTRY GpiSetCharAngle( HPS hps, PGRADIENTL pgradlAngle );
+BOOL APIENTRY GpiQueryCharAngle( HPS hps, PGRADIENTL pgradlAngle );
+BOOL APIENTRY GpiSetCharShear( HPS hps, PPOINTL pptlAngle );
+BOOL APIENTRY GpiQueryCharShear( HPS hps, PPOINTL pptlShear );
+BOOL APIENTRY GpiSetCharDirection( HPS hps, LONG lDirection );
+LONG APIENTRY GpiQueryCharDirection( HPS hps );
+BOOL APIENTRY GpiSetCharMode( HPS hps, LONG lMode );
+LONG APIENTRY GpiQueryCharMode( HPS hps );
+
+LONG APIENTRY GpiCharStringPos( HPS hps, PRECTL prclRect, ULONG flOptions
+ , LONG lCount, PCH pchString, PLONG alAdx );
+LONG APIENTRY GpiCharStringPosAt( HPS hps, PPOINTL pptlStart, PRECTL prclRect
+ , ULONG flOptions, LONG lCount, PCH pchString
+ , PLONG alAdx );
+
+/*** marker primitive functions */
+LONG APIENTRY GpiMarker( HPS hps, PPOINTL pptlPoint );
+LONG APIENTRY GpiPolyMarker( HPS hps, LONG lCount, PPOINTL aptlPoints );
+BOOL APIENTRY GpiSetMarker( HPS hps, LONG lSymbol );
+BOOL APIENTRY GpiSetMarkerBox( HPS hps, PSIZEF psizfxSize );
+BOOL APIENTRY GpiSetMarkerSet( HPS hps, LONG lSet );
+LONG APIENTRY GpiQueryMarker( HPS hps );
+BOOL APIENTRY GpiQueryMarkerBox( HPS hps, PSIZEF psizfxSize );
+LONG APIENTRY GpiQueryMarkerSet( HPS hps );
+
+/*** image primitive functions */
+LONG APIENTRY GpiImage( HPS hps, LONG lFormat, PSIZEL psizlImageSize
+ , LONG lLength, PBYTE pbData );
+
+/*** miscellaneous primitive functions */
+BOOL APIENTRY GpiPop( HPS hps, LONG lCount );
+LONG APIENTRY GpiPtVisible( HPS hps, PPOINTL pptlPoint );
+LONG APIENTRY GpiRectVisible( HPS hps, PRECTL prclRectangle );
+BOOL APIENTRY GpiComment( HPS hps, LONG lLength, PBYTE pbData );
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* non-common GPIPRIMITIVES */
+#ifdef INCL_GPILCIDS
+
+/* return codes from GpiCreateLogFont */
+#define FONT_DEFAULT 1L
+#define FONT_MATCH 2L
+
+/* lcid type for GpiQuerySetIds */
+#define LCIDT_FONT 6L
+
+#define LCIDT_BITMAP 7L
+
+/* constant used to delete all lcids by GpiDeleteSetId */
+#define LCID_ALL (-1L)
+
+/* kerning data returned by GpiQueryKerningPairs */
+typedef struct _KERNINGPAIRS { /* krnpr */
+ SHORT sFirstChar;
+ SHORT sSecondChar;
+ SHORT sKerningAmount;
+} KERNINGPAIRS;
+typedef KERNINGPAIRS FAR *PKERNINGPAIRS;
+
+/* options for GpiQueryFonts */
+#define QF_PUBLIC 0x0001L
+#define QF_PRIVATE 0x0002L
+
+#ifndef INCL_SAADEFS
+
+/* font file descriptions for GpiQueryFontFileDescriptions */
+typedef CHAR FFDESCS[2][FACESIZE]; /* ffdescs */
+typedef FFDESCS FAR *PFFDESCS;
+
+#endif /* no INCL_SAADEFS */
+
+#ifndef INCL_DDIDEFS
+
+/*** physical and logical font functions */
+LONG APIENTRY GpiCreateLogFont( HPS hps, PSTR8 pName, LONG lLcid
+ , PFATTRS pfatAttrs );
+BOOL APIENTRY GpiDeleteSetId( HPS hps, LONG lLcid );
+BOOL APIENTRY GpiLoadFonts( HAB hab, PSZ pszFilename );
+BOOL APIENTRY GpiUnloadFonts( HAB hab, PSZ pszFilename );
+LONG APIENTRY GpiQueryFonts( HPS hps, ULONG flOptions, PSZ pszFacename
+ , PLONG plReqFonts, LONG lMetricsLength
+ , PFONTMETRICS afmMetrics );
+BOOL APIENTRY GpiQueryFontMetrics( HPS hps, LONG lMetricsLength
+ , PFONTMETRICS pfmMetrics );
+LONG APIENTRY GpiQueryKerningPairs( HPS hps, LONG lCount
+ , PKERNINGPAIRS akrnprData );
+BOOL APIENTRY GpiQueryWidthTable( HPS hps, LONG lFirstChar, LONG lCount
+ , PLONG alData );
+LONG APIENTRY GpiQueryNumberSetIds( HPS hps );
+BOOL APIENTRY GpiQuerySetIds( HPS hps, LONG lCount, PLONG alTypes
+ , PSTR8 aNames, PLONG allcids );
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY GpiSetCp( HPS hps, USHORT usCodePage );
+USHORT APIENTRY GpiQueryCp( HPS hps );
+LONG APIENTRY GpiQueryFontFileDescriptions( HAB hab, PSZ pszFilename
+ , PLONG plCount
+ , PFFDESCS affdescsNames );
+#endif /* no INCL_SAADEFS */
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* non-common GPILCIDS */
+#if (defined(INCL_GPIBITMAPS) || !defined(INCL_NOCOMMON))
+
+/* rastor operations defined for GpiBitBlt */
+#define ROP_SRCCOPY 0x00CCL
+#define ROP_SRCPAINT 0x00EEL
+#define ROP_SRCAND 0x0088L
+#define ROP_SRCINVERT 0x0066L
+#define ROP_SRCERASE 0x0044L
+#define ROP_NOTSRCCOPY 0x0033L
+#define ROP_NOTSRCERASE 0x0011L
+#define ROP_MERGECOPY 0x00C0L
+#define ROP_MERGEPAINT 0x00BBL
+#define ROP_PATCOPY 0x00F0L
+#define ROP_PATPAINT 0x00FBL
+#define ROP_PATINVERT 0x005AL
+#define ROP_DSTINVERT 0x0055L
+#define ROP_ZERO 0x0000L
+#define ROP_ONE 0x00FFL
+
+/* Blt options for GpiBitBlt */
+#define BBO_OR 0L
+#define BBO_AND 1L
+#define BBO_IGNORE 2L
+
+/* error return for GpiSetBitmap */
+#define HBM_ERROR ((HBITMAP)-1L)
+
+#ifndef INCL_DDIDEFS
+
+/*** bitmap and pel functions */
+LONG APIENTRY GpiBitBlt( HPS hpsTarget, HPS hpsSource, LONG lCount
+ , PPOINTL aptlPoints, LONG lRop, ULONG flOptions );
+BOOL APIENTRY GpiDeleteBitmap( HBITMAP hbm );
+HBITMAP APIENTRY GpiLoadBitmap( HPS hps, HMODULE Resource, USHORT idBitmap
+ , LONG lWidth, LONG lHeight );
+HBITMAP APIENTRY GpiSetBitmap(HPS hps, HBITMAP hbm );
+LONG APIENTRY GpiWCBitBlt( HPS hpsTarget, HBITMAP hbmSource, LONG lCount
+ , PPOINTL aptlPoints, LONG lRop, ULONG flOptions );
+
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* common GPIBITMAPS */
+#ifdef INCL_GPIBITMAPS
+
+/* usage flags for GpiCreateBitmap */
+#define CBM_INIT 0x0004L
+
+/* bitmap parameterization used by GpiCreateBitmap and others */
+typedef struct _BITMAPINFOHEADER { /* bmp */
+ ULONG cbFix;
+ USHORT cx;
+ USHORT cy;
+ USHORT cPlanes;
+ USHORT cBitCount;
+} BITMAPINFOHEADER;
+typedef BITMAPINFOHEADER FAR *PBITMAPINFOHEADER;
+
+/* RGB data for _BITMAPINFO struct */
+typedef struct _RGB { /* rgb */
+ BYTE bBlue;
+ BYTE bGreen;
+ BYTE bRed;
+} RGB;
+
+/* bitmap data used by GpiSetBitmapBits and others */
+typedef struct _BITMAPINFO { /* bmi */
+ ULONG cbFix;
+ USHORT cx;
+ USHORT cy;
+ USHORT cPlanes;
+ USHORT cBitCount;
+ RGB argbColor[1];
+} BITMAPINFO;
+typedef BITMAPINFO FAR *PBITMAPINFO;
+
+/* error return code for GpiSet/QueryBitmapBits */
+#define BMB_ERROR (-1L)
+
+#ifndef INCL_DDIDEFS
+
+/*** bitmap and pel functions */
+HBITMAP APIENTRY GpiCreateBitmap( HPS hps, PBITMAPINFOHEADER pbmpNew
+ , ULONG flOptions, PBYTE pbInitData
+ , PBITMAPINFO pbmiInfoTable );
+LONG APIENTRY GpiSetBitmapBits( HPS hps, LONG lScanStart, LONG lScans
+ , PBYTE pbBuffer, PBITMAPINFO pbmiInfoTable );
+BOOL APIENTRY GpiSetBitmapDimension( HBITMAP hbm, PSIZEL psizlBitmapDimension );
+BOOL APIENTRY GpiSetBitmapId( HPS hps, HBITMAP hbm, LONG lLcid );
+LONG APIENTRY GpiQueryBitmapBits( HPS hps, LONG lScanStart, LONG lScans
+ , PBYTE pbBuffer, PBITMAPINFO pbmiInfoTable );
+BOOL APIENTRY GpiQueryBitmapDimension( HBITMAP hbm, PSIZEL psizlBitmapDimension );
+HBITMAP APIENTRY GpiQueryBitmapHandle( HPS hps, LONG lLcid );
+BOOL APIENTRY GpiQueryBitmapParameters( HBITMAP hbm
+ , PBITMAPINFOHEADER pbmpData );
+BOOL APIENTRY GpiQueryDeviceBitmapFormats( HPS hps, LONG lCount
+ , PLONG alArray );
+
+LONG APIENTRY GpiSetPel( HPS hps, PPOINTL pptlPoint );
+LONG APIENTRY GpiQueryPel( HPS hps, PPOINTL pptlPoint );
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* non-common GPIBITMAPS */
+#ifdef INCL_GPIREGIONS
+
+/* options for GpiCombineRegion */
+#define CRGN_OR 1L
+#define CRGN_COPY 2L
+#define CRGN_XOR 4L
+#define CRGN_AND 6L
+#define CRGN_DIFF 7L
+
+/* usDirection of returned region data for GpiQueryRegionRects */
+#define RECTDIR_LFRT_TOPBOT 1L
+#define RECTDIR_RTLF_TOPBOT 2L
+#define RECTDIR_LFRT_BOTTOP 3L
+#define RECTDIR_RTLF_BOTTOP 4L
+
+/* control data for GpiQueryRegionRects */
+typedef struct _RGNRECT { /* rgnrc */
+ USHORT ircStart;
+ USHORT crc;
+ USHORT crcReturned;
+ USHORT usDirection;
+} RGNRECT;
+typedef RGNRECT FAR *PRGNRECT;
+
+/* return code to indicate type of region for GpiCombineRegion and others */
+#define RGN_ERROR 0L
+#define RGN_NULL 1L
+#define RGN_RECT 2L
+#define RGN_COMPLEX 3L
+
+/* return codes for GpiPtInRegion */
+#define PRGN_ERROR 0L
+#define PRGN_OUTSIDE 1L
+#define PRGN_INSIDE 2L
+
+/* return codes for GpiRectInRegion */
+#define RRGN_ERROR 0L
+#define RRGN_OUTSIDE 1L
+#define RRGN_PARTIAL 2L
+#define RRGN_INSIDE 3L
+
+/* return codes for GpiEqualRegion */
+#define EQRGN_ERROR 0L
+#define EQRGN_NOTEQUAL 1L
+#define EQRGN_EQUAL 2L
+
+/* error return code for GpiSetRegion */
+#define HRGN_ERROR ((HRGN)-1L)
+
+#ifndef INCL_DDIDEFS
+
+/*** main region functions */
+LONG APIENTRY GpiCombineRegion( HPS hps, HRGN hrgnDest, HRGN hrgnSrc1
+ , HRGN hrgnSrc2, LONG lMode );
+HRGN APIENTRY GpiCreateRegion( HPS hps, LONG lCount, PRECTL arclRectangles );
+BOOL APIENTRY GpiDestroyRegion( HPS hps, HRGN hrgn );
+LONG APIENTRY GpiEqualRegion( HPS hps, HRGN hrgnSrc1, HRGN hrgnSrc2 );
+BOOL APIENTRY GpiOffsetRegion( HPS hps, HRGN Hrgn, PPOINTL pptlOffset );
+LONG APIENTRY GpiPaintRegion( HPS hps, HRGN hrgn );
+LONG APIENTRY GpiPtInRegion( HPS hps, HRGN hrgn, PPOINTL pptlPoint );
+LONG APIENTRY GpiQueryRegionBox( HPS hps, HRGN hrgn, PRECTL prclBound );
+BOOL APIENTRY GpiQueryRegionRects( HPS hps, HRGN hrgn, PRECTL prclBound
+ , PRGNRECT prgnrcControl, PRECTL prclRect );
+LONG APIENTRY GpiRectInRegion( HPS hps, HRGN hrgn, PRECTL prclRect );
+BOOL APIENTRY GpiSetRegion( HPS hps, HRGN hrgn, LONG lcount
+ , PRECTL arclRectangles );
+
+/*** clip region functions */
+LONG APIENTRY GpiSetClipRegion( HPS hps, HRGN hrgn, PHRGN phrgnOld );
+
+#ifndef INCL_SAADEFS
+
+HRGN APIENTRY GpiQueryClipRegion( HPS hps );
+LONG APIENTRY GpiQueryClipBox( HPS hps, PRECTL prclBound );
+
+#endif /* no INCL_SAADEFS */
+
+LONG APIENTRY GpiExcludeClipRectangle( HPS hps, PRECTL prclRectangle );
+LONG APIENTRY GpiIntersectClipRectangle( HPS hps, PRECTL prclRectangle );
+
+#ifndef INCL_SAADEFS
+
+LONG APIENTRY GpiOffsetClipRegion( HPS hps, PPOINTL pptlPoint );
+
+#endif /* no INCL_SAADEFS */
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* non-common GPIREGIONS */
+#ifdef INCL_GPIMETAFILES
+
+#ifndef INCL_DDIDEFS
+
+/* constants for index values of options array for GpiPlayMetafile */
+#define PMF_SEGBASE 0
+#define PMF_LOADTYPE 1
+#define PMF_RESOLVE 2
+#define PMF_LCIDS 3
+#define PMF_RESET 4
+#define PMF_SUPPRESS 5
+#define PMF_COLORTABLES 6
+#define PMF_COLORREALIZABLE 7
+#define PMF_DEFAULTS 8
+
+/* options for GpiPlayMetafile */
+#define RS_DEFAULT 0L
+#define RS_NODISCARD 1L
+#define LC_DEFAULT 0L
+#define LC_NOLOAD 1L
+#define LC_LOADDISC 3L
+#define LT_DEFAULT 0L
+#define LT_NOMODIFY 1L
+#define LT_ORIGINALVIEW 4L
+#define RES_DEFAULT 0L
+#define RES_NORESET 1L
+#define RES_RESET 2L
+#define SUP_DEFAULT 0L
+#define SUP_NOSUPPRESS 1L
+#define SUP_SUPPRESS 2L
+#define CTAB_DEFAULT 0L
+#define CTAB_NOMODIFY 1L
+#define CTAB_REPLACE 3L
+#define CREA_DEFAULT 0L
+#define CREA_REALIZE 1L
+#define CREA_NOREALIZE 2L
+
+#ifndef INCL_SAADEFS
+
+#define DDEF_DEFAULT 0L
+#define DDEF_IGNORE 1L
+#define DDEF_LOADDISC 3L
+#define RSP_DEFAULT 0L
+#define RSP_NODISCARD 1L
+
+#endif /* no INCL_SAADEFS */
+
+/*** metafile functions */
+HMF APIENTRY GpiCopyMetaFile( HMF hmf );
+BOOL APIENTRY GpiDeleteMetaFile( HMF hmf );
+HMF APIENTRY GpiLoadMetaFile( HAB hab, PSZ pszFilename );
+LONG APIENTRY GpiPlayMetaFile( HPS hps, HMF hmf, LONG lCount1
+ , PLONG alOptarray, PLONG plSegCount
+ , LONG lCount2, PSZ pszDesc );
+BOOL APIENTRY GpiQueryMetaFileBits( HMF hmf, LONG lOffset, LONG lLength
+ , PBYTE pbData );
+LONG APIENTRY GpiQueryMetaFileLength( HMF hmf );
+BOOL APIENTRY GpiSaveMetaFile( HMF hmf, PSZ pszFilename );
+
+
+#ifndef INCL_SAADEFS
+
+BOOL APIENTRY GpiSetMetaFileBits( HMF hmf, LONG lOffset, LONG lLength
+ , PBYTE pbBuffer );
+
+#endif /* no INCL_SAADEFS */
+
+#endif /* no INCL_DDIDEFS */
+
+#endif /* non-common GPIMETAFILES */
+
+#ifdef INCL_GPIDEFAULTS
+
+/*** default functions */
+BOOL APIENTRY GpiQueryDefArcParams( HPS hps, PARCPARAMS parcpArcParams );
+BOOL APIENTRY GpiQueryDefAttrs( HPS hps, LONG lPrimType, ULONG flAttrMask
+ , PBUNDLE ppbunAttrs );
+BOOL APIENTRY GpiQueryDefTag( HPS hps, PLONG plTag );
+BOOL APIENTRY GpiQueryDefViewingLimits( HPS hps, PRECTL prclLimits );
+
+BOOL APIENTRY GpiSetDefArcParams( HPS hps, PARCPARAMS parcpArcParams );
+BOOL APIENTRY GpiSetDefAttrs( HPS hps, LONG lPrimType, ULONG flAttrMask
+ , PBUNDLE ppbunAttrs );
+BOOL APIENTRY GpiSetDefTag( HPS hps, LONG lTag );
+BOOL APIENTRY GpiSetDefViewingLimits( HPS hps, PRECTL prclLimits );
+
+
+#endif /* GPIDEFAULTS */
+
+#ifdef INCL_GPIERRORS
+
+#include <pmerr.h>
+
+#endif /* non-common GPIERRORS */
diff --git a/private/oleauto/tools/win16/os2/inc/pmhelp.h b/private/oleauto/tools/win16/os2/inc/pmhelp.h
new file mode 100644
index 000000000..f52e39f80
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmhelp.h
@@ -0,0 +1,268 @@
+/***************************************************************************\
+*
+* Module Name: PMHELP.H
+*
+* OS/2 Information Presentation Facility (IPF) for providing Help
+*
+* Copyright (c) International Business Machines Corporation 1989
+* Copyright (c) Microsoft Corporation 1989
+*
+*****************************************************************************
+* Define INCL_WINHELP before OS2.H to include this file
+\***************************************************************************/
+
+#ifndef PMHELP_H
+#define PMHELP_H
+
+/******************************************************************************/
+/* HelpSubTable entry structure */
+/******************************************************************************/
+
+typedef int HELPSUBTABLE;
+typedef int far *PHELPSUBTABLE;
+
+/******************************************************************************/
+/* HelpTable entry structure */
+/******************************************************************************/
+
+typedef struct _HELPTABLE { /* ht */
+ USHORT idAppWindow;
+ PHELPSUBTABLE phstHelpSubTable;
+ USHORT idExtPanel;
+} HELPTABLE;
+typedef HELPTABLE FAR *PHELPTABLE;
+
+/******************************************************************************/
+/* IPF Initialization Structure used on the */
+/* WinCreateHelpInstance() call. */
+/******************************************************************************/
+
+typedef struct _HELPINIT { /* hinit */
+ USHORT cb;
+ ULONG ulReturnCode;
+ PSZ pszTutorialName;
+ PHELPTABLE phtHelpTable;
+ HMODULE hmodHelpTableModule;
+ HMODULE hmodAccelActionBarModule;
+ USHORT idAccelTable;
+ USHORT idActionBar;
+ PSZ pszHelpWindowTitle;
+ USHORT usShowPanelId;
+ PSZ pszHelpLibraryName;
+} HELPINIT;
+typedef HELPINIT FAR *PHELPINIT;
+
+
+/******************************************************************************/
+/* Search parent chain indicator for HM_SET_ACTIVE_WINDOW message. */
+/******************************************************************************/
+
+#define HWND_PARENT (HWND)NULL
+
+/******************************************************************************/
+/* Constants used to define whether user wants to display panel using */
+/* panel number or panel name. */
+/******************************************************************************/
+
+#define HM_RESOURCEID 0
+#define HM_PANELNAME 1
+
+#define HMPANELTYPE_NUMBER 0
+#define HMPANELTYPE_NAME 1
+
+/******************************************************************************/
+/* Constants used to define how the panel IDs are displayed on */
+/* help panels. */
+/******************************************************************************/
+
+#define CMIC_HIDE_PANEL_ID 0x0000
+#define CMIC_SHOW_PANEL_ID 0x0001
+#define CMIC_TOGGLE_PANEL_ID 0x0002
+
+/******************************************************************************/
+/* Window Help function declarations. */
+/******************************************************************************/
+
+BOOL APIENTRY WinDestroyHelpInstance( HWND hwndHelpInstance);
+HWND APIENTRY WinCreateHelpInstance( HAB hab, PHELPINIT phinitHMInitStructure);
+BOOL APIENTRY WinAssociateHelpInstance( HWND hwndHelpInstance, HWND hwndApp);
+HWND APIENTRY WinQueryHelpInstance( HWND hwndApp);
+BOOL APIENTRY WinLoadHelpTable (HWND hwndHelpInstance, USHORT idHelpTable,
+ HMODULE Module);
+BOOL APIENTRY WinCreateHelpTable (HWND hwndHelpInstance,
+ PHELPTABLE phtHelpTable);
+
+/******************************************************************************/
+/* IPF message base. */
+/******************************************************************************/
+
+#define HM_MSG_BASE 0x0220
+
+/******************************************************************************/
+/* Messages applications can send to the IPF. */
+/******************************************************************************/
+
+#define HM_DISMISS_WINDOW HM_MSG_BASE+0x0001
+#define HM_DISPLAY_HELP HM_MSG_BASE+0x0002
+#define HM_EXT_HELP HM_MSG_BASE+0x0003
+#define HM_SET_ACTIVE_WINDOW HM_MSG_BASE+0x0004
+#define HM_LOAD_HELP_TABLE HM_MSG_BASE+0x0005
+#define HM_CREATE_HELP_TABLE HM_MSG_BASE+0x0006
+#define HM_SET_HELP_WINDOW_TITLE HM_MSG_BASE+0x0007
+#define HM_SET_SHOW_PANEL_ID HM_MSG_BASE+0x0008
+#define HM_REPLACE_HELP_FOR_HELP HM_MSG_BASE+0x0009
+#define HM_HELP_INDEX HM_MSG_BASE+0x000a
+#define HM_HELP_CONTENTS HM_MSG_BASE+0x000b
+#define HM_KEYS_HELP HM_MSG_BASE+0x000c
+#define HM_SET_HELP_LIBRARY_NAME HM_MSG_BASE+0x000d
+
+/******************************************************************************/
+/* Messages the IPF sends to the applications active window */
+/* as defined by the IPF. */
+/******************************************************************************/
+
+#define HM_ERROR HM_MSG_BASE+0x000e
+#define HM_HELPSUBITEM_NOT_FOUND HM_MSG_BASE+0x000f
+#define HM_QUERY_KEYS_HELP HM_MSG_BASE+0x0010
+#define HM_TUTORIAL HM_MSG_BASE+0x0011
+#define HM_EXT_HELP_UNDEFINED HM_MSG_BASE+0x0012
+#define HM_ACTIONBAR_COMMAND HM_MSG_BASE+0x0013
+#define HM_INFORM HM_MSG_BASE+0x0014
+
+/******************************************************************************/
+/* HMERR_NO_FRAME_WND_IN_CHAIN - There is no frame window in the */
+/* window chain from which to find or set the associated help */
+/* instance. */
+/******************************************************************************/
+
+#define HMERR_NO_FRAME_WND_IN_CHAIN 0x00001001L
+
+/******************************************************************************/
+/* HMERR_INVALID_ASSOC_APP_WND - The application window handle */
+/* specified on the WinAssociateHelpInstance() call is not a valid */
+/* window handle. */
+/******************************************************************************/
+
+#define HMERR_INVALID_ASSOC_APP_WND 0x00001002L
+
+/******************************************************************************/
+/* HMERR_INVALID_ASSOC_HELP_INST - The help instance handle specified */
+/* on the WinAssociateHelpInstance() call is not a valid */
+/* window handle. */
+/******************************************************************************/
+
+#define HMERR_INVALID_ASSOC_HELP_INST 0x00001003L
+
+/******************************************************************************/
+/* HMERR_INVALID_DESTROY_HELP_INST - The window handle specified */
+/* as the help instance to destroy is not of the help instance class. */
+/******************************************************************************/
+
+#define HMERR_INVALID_DESTROY_HELP_INST 0x00001004L
+
+/******************************************************************************/
+/* HMERR_NO_HELP_INST_IN_CHAIN - The parent or owner chain of the */
+/* application window specified does not have a help instance */
+/* associated with it. */
+/******************************************************************************/
+
+#define HMERR_NO_HELP_INST_IN_CHAIN 0x00001005L
+
+/******************************************************************************/
+/* HMERR_INVALID_HELP_INSTANCE_HDL - The handle specified to be a */
+/* help instance does not have the class name of a IPF */
+/* help instance. */
+/******************************************************************************/
+
+#define HMERR_INVALID_HELP_INSTANCE_HDL 0x00001006L
+
+/******************************************************************************/
+/* HMERR_INVALID_QUERY_APP_WND - The application window specified on */
+/* a WinQueryHelpInstance() call is not a valid window handle. */
+/******************************************************************************/
+
+#define HMERR_INVALID_QUERY_APP_WND 0x00001007L
+
+/******************************************************************************/
+/* HMERR_HELP_INST_CALLED_INVALID - The handle of the help instance */
+/* specified on an API call to the IPF does not have the */
+/* class name of an IPF help instance. */
+/******************************************************************************/
+
+#define HMERR_HELP_INST_CALLED_INVALID 0x00001008L
+#define HMERR_HELPTABLE_UNDEFINE 0x00001009L
+#define HMERR_HELP_INSTANCE_UNDEFINE 0x0000100aL
+#define HMERR_HELPITEM_NOT_FOUND 0x0000100bL
+#define HMERR_INVALID_HELPSUBITEM_SIZE 0x0000100cL
+#define HMERR_HELPSUBITEM_NOT_FOUND 0x0000100dL
+
+/******************************************************************************/
+/* HMERR_INDEX_NOT_FOUND - No index in library file. */
+/******************************************************************************/
+
+#define HMERR_INDEX_NOT_FOUND 0x00002001L
+
+/******************************************************************************/
+/* HMERR_CONTENT_NOT_FOUND - Library file does not have any contents. */
+/******************************************************************************/
+
+#define HMERR_CONTENT_NOT_FOUND 0x00002002L
+
+/******************************************************************************/
+/* HMERR_OPEN_LIB_FILE - Cannot open library file. */
+/******************************************************************************/
+
+#define HMERR_OPEN_LIB_FILE 0x00002003L
+
+/******************************************************************************/
+/* HMERR_READ_LIB_FILE - Cannot read library file. */
+/******************************************************************************/
+
+#define HMERR_READ_LIB_FILE 0x00002004L
+
+/******************************************************************************/
+/* HMERR_CLOSE_LIB_FILE - Cannot close library file. */
+/******************************************************************************/
+
+#define HMERR_CLOSE_LIB_FILE 0x00002005L
+
+/******************************************************************************/
+/* HMERR_INVALID_LIB_FILE - Improper library file provided. */
+/******************************************************************************/
+
+#define HMERR_INVALID_LIB_FILE 0x00002006L
+
+/******************************************************************************/
+/* HMERR_NO_MEMORY - Unable to allocate the requested amount of memory. */
+/******************************************************************************/
+
+#define HMERR_NO_MEMORY 0x00002007L
+
+/******************************************************************************/
+/* HMERR_ALLOCATE_SEGMENT - Unable */
+/* to allocate a segment of memory for memory allocation requested */
+/* from the IPF. */
+/******************************************************************************/
+
+#define HMERR_ALLOCATE_SEGMENT 0x00002008L
+
+/******************************************************************************/
+/* HMERR_FREE_MEMORY - Unable to free allocated memory. */
+/******************************************************************************/
+
+#define HMERR_FREE_MEMORY 0x00002009L
+
+/******************************************************************************/
+/* HMERR_PANEL_NOT_FOUND - Unable */
+/* to find a help panel requested to IPF. */
+/******************************************************************************/
+
+#define HMERR_PANEL_NOT_FOUND 0x00002010L
+
+/******************************************************************************/
+/* HMERR_DATABASE_NOT_OPEN - Unable to read the unopened database. */
+/******************************************************************************/
+
+#define HMERR_DATABASE_NOT_OPEN 0x00002011L
+
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/pmmle.h b/private/oleauto/tools/win16/os2/inc/pmmle.h
new file mode 100644
index 000000000..9ff1bc2d1
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmmle.h
@@ -0,0 +1,232 @@
+/***************************************************************************\
+*
+* Module Name: PMMLE.H
+*
+* OS/2 Presentation Manager MultiLine Edit Control - Version 1.0
+*
+* Copyright (c) International Business Machines Corporation 1989
+* Copyright (c) Microsoft Corporation 1989
+*
+\***************************************************************************/
+
+/***************************************************************************\
+* MLE Class and dialog code
+\***************************************************************************/
+/* in pmwin.h */
+
+/***************************************************************************\
+* MLE Window styles ( in addition to WS_* )
+\***************************************************************************/
+#define MLS_WORDWRAP 0x00000001L
+#define MLS_BORDER 0x00000002L
+#define MLS_VSCROLL 0x00000004L
+#define MLS_HSCROLL 0x00000008L
+#define MLS_READONLY 0x00000010L
+#define MLS_IGNORETAB 0x00000020L
+#define MLS_DISABLEUNDO 0x00000040L
+
+/***************************************************************************\
+* MLE External Data Types
+\***************************************************************************/
+typedef LONG IPT; /* insertion point */
+typedef PLONG PIPT; /* insertion point */
+typedef LONG PIX; /* pixel */
+typedef ULONG LINE; /* Line number */
+
+typedef struct _FORMATRECT { /* MLEFRD format rectangle data */
+ LONG cxFormat; /* format rectangle width */
+ LONG cyFormat; /* format rectangle height */
+} MLEFORMATRECT;
+typedef MLEFORMATRECT FAR *PFORMATRECT;
+
+typedef struct _MLECTLDATA { /* MLECTL control data */
+ USHORT cbCtlData; /* Length of the MLECTLDATA structure */
+ USHORT afIEFormat; /* import/export format */
+ ULONG cchText; /* text limit */
+ IPT iptAnchor; /* beginning of selection */
+ IPT iptCursor; /* ending of selection */
+ LONG cxFormat; /* format rectangle width */
+ LONG cyFormat; /* format rectangle height */
+ ULONG afFormatFlags; /* formatting rectangle flags - see mask below */
+} MLECTLDATA;
+typedef MLECTLDATA FAR *PMLECTLDATA;
+
+/***************************************************************************\
+* afFormatFlags mask
+\***************************************************************************/
+#define MLFFMTRECT_LIMITHORZ 0x00000001L
+#define MLFFMTRECT_LIMITVERT 0x00000002L
+#define MLFFMTRECT_MATCHWINDOW 0x00000004L
+#define MLFFMTRECT_FORMATRECT 0x00000007L
+/***************************************************************************\
+* afIEFormat - Import/Export Format flags
+\***************************************************************************/
+#define MLFIE_CFTEXT 0
+#define MLFIE_NOTRANS 1
+#define MLFIE_WINFMT 2
+#define MLFIE_RTF 3
+
+/***************************************************************************\
+* MLN_OVERFLOW structure
+\***************************************************************************/
+typedef struct _MLEOVERFLOW { /* overflow structure */
+ ULONG afErrInd; /* see mask below */
+ LONG nBytesOver; /* number of bytes overflowed */
+ LONG pixHorzOver; /* number of pixels horizontally overflowed */
+ LONG pixVertOver; /* number of pixels vertically overflowed */
+} MLEOVERFLOW;
+typedef MLEOVERFLOW FAR *POVERFLOW;
+
+/***************************************************************************\
+* afErrInd - error format rectangle flags
+\***************************************************************************/
+#define MLFEFR_RESIZE 0x00000001L
+#define MLFEFR_TABSTOP 0x00000002L
+#define MLFEFR_FONT 0x00000004L
+#define MLFEFR_TEXT 0x00000008L
+#define MLFEFR_WORDWRAP 0x00000010L
+#define MLFETL_TEXTBYTES 0x00000020L
+
+/***************************************************************************\
+* MLN_MARGIN structure
+\***************************************************************************/
+typedef struct _MLEMARGSTRUCT { /* margin structure */
+ USHORT afMargins; /* margin indicator */
+ USHORT usMouMsg; /* mouse message */
+ IPT iptNear; /* the geometrically nearest insertion point */
+} MLEMARGSTRUCT;
+typedef MLEMARGSTRUCT FAR *PMARGSTRUCT;
+
+/***************************************************************************\
+* afFlags - margin notification indicators
+\***************************************************************************/
+#define MLFMARGIN_LEFT 0x0001
+#define MLFMARGIN_BOTTOM 0x0002
+#define MLFMARGIN_RIGHT 0x0003
+#define MLFMARGIN_TOP 0x0004
+
+/***************************************************************************\
+* MLM_QUERYSELECTION flags
+\***************************************************************************/
+#define MLFQS_MINMAXSEL 0
+#define MLFQS_MINSEL 1
+#define MLFQS_MAXSEL 2
+#define MLFQS_ANCHORSEL 3
+#define MLFQS_CURSORSEL 4
+
+/***************************************************************************\
+* MLN_CLPBDFAIL flags
+\***************************************************************************/
+#define MLFCLPBD_TOOMUCHTEXT 0x00000001L
+#define MLFCLPBD_ERROR 0x00000002L
+
+/***************************************************************************\
+* MLM_SEARCH structure
+\***************************************************************************/
+typedef struct _SEARCH { /* search structure */
+ USHORT cb; /* size of search spec structure */
+ PCHAR pchFind; /* string to search for */
+ PCHAR pchReplace; /* string to replace with */
+ SHORT cchFind; /* length of pchFindString */
+ SHORT cchReplace; /* length of replace string */
+ IPT iptStart; /* point at which to start search */
+ /* (negative indicates cursor pt) */
+ /* becomes pt where string found */
+ IPT iptStop; /* point at which to stop search */
+ /* (negative indicates EOT) */
+ USHORT cchFound; /* Length of found string at iptStart */
+} MLE_SEARCHDATA;
+typedef MLE_SEARCHDATA FAR *PMLE_SEARCHDATA;
+
+/***************************************************************************\
+* MLM_SEARCH style flags
+\***************************************************************************/
+#define MLFSEARCH_CASESENSITIVE 0x00000001L
+#define MLFSEARCH_SELECTMATCH 0x00000002L
+#define MLFSEARCH_CHANGEALL 0x00000004L
+
+/***************************************************************************\
+* MLE messages - MLM from 0x01b0 to 0x01de; MLN from 0x0001 to 0x000f
+\***************************************************************************/
+/* formatting messages */
+#define MLM_SETTEXTLIMIT 0x01b0
+#define MLM_QUERYTEXTLIMIT 0x01b1
+#define MLM_SETFORMATRECT 0x01b2
+#define MLM_QUERYFORMATRECT 0x01b3
+#define MLM_SETWRAP 0x01b4
+#define MLM_QUERYWRAP 0x01b5
+#define MLM_SETTABSTOP 0x01b6
+#define MLM_QUERYTABSTOP 0x01b7
+#define MLM_SETREADONLY 0x01b8
+#define MLM_QUERYREADONLY 0x01b9
+
+/* text content manipulation and queries messages */
+#define MLM_QUERYCHANGED 0x01ba
+#define MLM_SETCHANGED 0x01bb
+#define MLM_QUERYLINECOUNT 0x01bc
+#define MLM_CHARFROMLINE 0x01bd
+#define MLM_LINEFROMCHAR 0x01be
+#define MLM_QUERYLINELENGTH 0x01bf
+#define MLM_QUERYTEXTLENGTH 0x01c0
+
+/* text import and export messages */
+#define MLM_FORMAT 0x01c1
+#define MLM_SETIMPORTEXPORT 0x01c2
+#define MLM_IMPORT 0x01c3
+#define MLM_EXPORT 0x01c4
+#define MLM_DELETE 0x01c6
+#define MLM_QUERYFORMATLINELENGTH 0x01c7
+#define MLM_QUERYFORMATTEXTLENGTH 0x01c8
+#define MLM_INSERT 0x01c9
+
+/* selection messages */
+#define MLM_SETSEL 0x01ca
+#define MLM_QUERYSEL 0x01cb
+#define MLM_QUERYSELTEXT 0x01cc
+
+/* undo and redo messages */
+#define MLM_QUERYUNDO 0x01cd
+#define MLM_UNDO 0x01ce
+#define MLM_RESETUNDO 0x01cf
+
+/* text attributes messages */
+#define MLM_QUERYFONT 0x01d0
+#define MLM_SETFONT 0x01d1
+#define MLM_SETTEXTCOLOR 0x01d2
+#define MLM_QUERYTEXTCOLOR 0x01d3
+#define MLM_SETBACKCOLOR 0x01d4
+#define MLM_QUERYBACKCOLOR 0x01d5
+
+/* scrolling messages */
+#define MLM_QUERYFIRSTCHAR 0x01d6
+#define MLM_SETFIRSTCHAR 0x01d7
+
+/* clipboard messages */
+#define MLM_CUT 0x01d8
+#define MLM_COPY 0x01d9
+#define MLM_PASTE 0x01da
+#define MLM_CLEAR 0x01db
+
+/* display manipulation messages */
+#define MLM_ENABLEREFRESH 0x01dc
+#define MLM_DISABLEREFRESH 0x01dd
+
+/* search message */
+#define MLM_SEARCH 0x01de
+#define MLM_QUERYIMPORTEXPORT 0x01df
+
+/* notification messages */
+#define MLN_OVERFLOW 0x0001
+#define MLN_PIXHORZOVERFLOW 0x0002
+#define MLN_PIXVERTOVERFLOW 0x0003
+#define MLN_TEXTOVERFLOW 0x0004
+#define MLN_VSCROLL 0x0005
+#define MLN_HSCROLL 0x0006
+#define MLN_CHANGE 0x0007
+#define MLN_SETFOCUS 0x0008
+#define MLN_KILLFOCUS 0x0009
+#define MLN_MARGIN 0x000a
+#define MLN_SEARCHPAUSE 0x000b
+#define MLN_MEMERROR 0x000c
+#define MLN_UNDOOVERFLOW 0x000d
+#define MLN_CLPBDFAIL 0x000f
diff --git a/private/oleauto/tools/win16/os2/inc/pmord.h b/private/oleauto/tools/win16/os2/inc/pmord.h
new file mode 100644
index 000000000..7859198eb
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmord.h
@@ -0,0 +1,793 @@
+/****************************** Module Header ******************************\
+*
+* Module Name: PMORD.H
+*
+* This is the include file which defines all the structures and constants
+* that can be used to build or intepret GOCA orders for the GPI
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+* ==========================================================================
+*
+* The orders fall into 4 categories :-
+*
+* 1) 1-byte orders
+*
+* 2) 2-byte orders - second byte contains the value
+*
+* 3) Long orders - second byte gives the order length, subsequent bytes
+* contain the values (up to 256 bytes long)
+*
+* 4) Very long orders - third and fourth bytes gives the order length,
+* subsequent bytes contain the values (up to 64K long)
+*
+\***************************************************************************/
+
+/***************************************************************************\
+*
+* Miscellaneous structures used in this file
+*
+\***************************************************************************/
+
+/* form of RECTL with shorts instead of longs */
+typedef struct _RECT1S { /* rcs */
+ SHORT xLeft;
+ SHORT yBottom;
+ SHORT xRight;
+ SHORT yTop;
+} RECT1S;
+
+/* form of POINTL with 1 byte offsets instead of longs */
+typedef struct _ODPOINT { /* odpt */
+ CHAR dx;
+ CHAR dy;
+} ODPOINT;
+
+/* form of SIZEL with shorts instead of longs */
+typedef struct _SIZES { /* sizs */
+ SHORT cx;
+ SHORT cy;
+} SIZES;
+
+/* unsigned two-byte swapped integer */
+typedef struct _SWPUSHORT { /* swpus */
+ UCHAR HiByte;
+ UCHAR LoByte;
+} SWPUSHORT;
+
+/***************************************************************************\
+*
+* 1-byte orders
+*
+\***************************************************************************/
+
+/* macro to tell whether this is a 1-byte order */
+#define BYTE_ORDER(oc) ((oc)==OCODE_GNOP1 || (oc)==OCODE_GESD)
+
+/* 1-byte order codes */
+#define OCODE_GNOP1 0x00 /* No-operation */
+#define OCODE_GESD 0xFF /* End symbol definition */
+
+/***************************************************************************\
+*
+* 2-byte orders
+*
+\***************************************************************************/
+
+/* definitions to help determine whether an order code is a 2-byte order */
+#define OCODE2_1 0x80
+#define OCODE2_2 0x88
+
+#define SHORT_ORDER(oc) ((((oc)^OCODE2_1)&OCODE2_2)==OCODE2_2)
+
+/* General 2-byte order structure */
+typedef struct _ORDER { /* ord */
+ UCHAR idCode;
+ UCHAR uchData;
+} ORDER;
+
+/* 2-byte order codes */
+#define OCODE_GBAR 0x68 /* Begin area */
+#define OCODE_GCFIG 0x7D /* Close figure */
+#define OCODE_GEEL 0x49 /* End element */
+#define OCODE_GEPTH 0x7F /* End path */
+#define OCODE_GEPROL 0x3E /* End prologue */
+#define OCODE_GPOP 0x3F /* Pop */
+#define OCODE_GSBMX 0x0D /* Set background mix */
+#define OCODE_GPSBMX 0x4D /* Push & set b/g mix */
+#define OCODE_GSCD 0x3A /* Set char direction */
+#define OCODE_GPSCD 0x7A /* Push & set char direction */
+#define OCODE_GSCR 0x39 /* Set char precision */
+#define OCODE_GPSCR 0x79 /* Push & set char precision */
+#define OCODE_GSCS 0x38 /* Set char set */
+#define OCODE_GPSCS 0x78 /* Push & set char set */
+#define OCODE_GSCOL 0x0A /* Set color */
+#define OCODE_GPSCOL 0x4A /* Push & set color */
+#define OCODE_GSLE 0x1A /* Set line end */
+#define OCODE_GPSLE 0x5A /* Push & set line end */
+#define OCODE_GSLJ 0x1B /* Set line join */
+#define OCODE_GPSLJ 0x5B /* Push & set line join */
+#define OCODE_GSLT 0x18 /* Set line type */
+#define OCODE_GPSLT 0x58 /* Push & set line type */
+#define OCODE_GSLW 0x19 /* Set line width */
+#define OCODE_GPSLW 0x59 /* Push & set line width */
+#define OCODE_GSMP 0x3B /* Set marker precision */
+#define OCODE_GPSMP 0x7B /* Push & set marker precision */
+#define OCODE_GSMS 0x3C /* Set marker set */
+#define OCODE_GPSMS 0x7C /* Push & set marker set */
+#define OCODE_GSMT 0x29 /* Set marker symbol */
+#define OCODE_GPSMT 0x69 /* Push & set marker symbol */
+#define OCODE_GSMX 0x0C /* Set mix */
+#define OCODE_GPSMX 0x4C /* Push & set mix */
+#define OCODE_GSPS 0x08 /* Set pattern set */
+#define OCODE_GPSPS 0x48 /* Push & set pattern set */
+#define OCODE_GSPT 0x28 /* Set pattern symbol */
+#define OCODE_GPSPT 0x09 /* Push & set pattern symbol */
+
+/* constants for 2-byte orders */
+
+/* Begin area */
+#define GBAR_RESERVED 0x80
+#define GBAR_BOUNDARY 0xC0
+#define GBAR_NOBOUNDARY 0x80
+#define GBAR_WINDING 0xA0
+#define GBAR_ALTERNATE 0x80
+
+/* Set Character Precision */
+#define GSCR_PRECISION 0x0F
+
+/***************************************************************************\
+*
+* Long orders
+*
+\***************************************************************************/
+
+/* definitions to help determine whether an order code is a long order */
+
+#define OCODE_VLONG 0xFE
+
+#define LONG_ORDER(oc) (!((oc)==OCODE_VLONG||BYTE_ORDER(oc)||SHORT_ORDER(oc)))
+
+/* long order structure */
+#define LORDER_ML 253
+typedef struct _LORDER { /* lord */
+ UCHAR idCode;
+ UCHAR uchLength;
+ UCHAR uchData[LORDER_ML];
+} LORDER;
+
+/* Long orders for which the length of data is normally zero */
+#define OCODE_GEAR 0x60 /* End Area */
+#define OCODE_GEIMG 0x93 /* End Image */
+
+/* Long orders for which the data is contained in a type already defined */
+
+/* Character String */
+#define OCODE_GCCHST 0x83 /* char string at curr posn */
+#define GCCHST_MC 255 /* Max len of string in bytes */
+
+#define OCODE_GCHST 0xC3 /* char string at given pos */
+#define GCHST_SMC 251 /* Max len of string (S) */
+#define GCHST_LMC 247 /* Max len of string (L) */
+
+/* Character String Move */
+#define OCODE_GCCHSTM 0xB1 /* char string move at c.p. */
+#define GCCHSTM_MC 255 /* Max len of string in byte */
+
+#define OCODE_GCHSTM 0xF1 /* char string move at g.p. */
+#define GCHSTM_SMC 251 /* Max len of string (S) */
+#define GCHSTM_LMC 247 /* Max len of string (L) */
+
+/* Comment */
+#define OCODE_GCOMT 0x01 /* Comment */
+#define GCOMT_ML 255 /* Maximum len of comment data */
+
+/* Image */
+#define OCODE_GIMD 0x92 /* Image data */
+#define GIMD_ML 255 /* Maximum len of image data */
+
+/* Full Arc */
+#define OCODE_GCFARC 0x87 /* full arc at current posn */
+#define OCODE_GFARC 0xC7 /* full arc at given posn */
+
+/* Label */
+#define OCODE_GLABL 0xD3 /* Label */
+
+/* Set Current Position */
+#define OCODE_GSCP 0x21 /* Set current position */
+#define OCODE_GPSCP 0x61 /* Push and set curr posn */
+
+/* Bezier spline */
+#define OCODE_GCBEZ 0xA5 /* Bezier spline at curr pos */
+#define GCBEZ_SMB 21 /* Max number of splines (S) */
+#define GCBEZ_LMB 10 /* Max number of splines (L) */
+
+#define OCODE_GBEZ 0xE5 /* Bezier spline at given pos */
+#define GBEZ_SMB 20 /* Max number of splines (S) */
+#define GBEZ_LMB 10 /* Max number of splines (L) */
+
+/* Fillet */
+#define OCODE_GCFLT 0x85 /* fillet at current posn */
+#define GCFLT_SMP 63 /* Max number of points (S) */
+#define GCFLT_LMP 31 /* Max number of points (L) */
+
+#define OCODE_GFLT 0xC5 /* fillet at given position */
+#define GFLT_SMP 62 /* Max number of points (S) */
+#define GFLT_LMP 30 /* Max number of points (L) */
+
+/* Polyline */
+#define OCODE_GCLINE 0x81 /* polyline at current posn */
+#define GCLINE_SMP 63 /* Max number of points (S) */
+#define GCLINE_LMP 31 /* Max number of points (L) */
+
+#define OCODE_GLINE 0xC1 /* polyline at given posn */
+#define GLINE_SMP 62 /* Max number of points (S) */
+#define GLINE_LMP 30 /* Max number of points (L) */
+
+/* Polymarker */
+#define OCODE_GCMRK 0x82 /* marker at current posn */
+#define GCMRK_SMP 63 /* Max number of points (S) */
+#define GCMRK_LMP 31 /* Max number of points (L) */
+
+#define OCODE_GMRK 0xC2 /* marker at given posn */
+#define GMRK_SMP 62 /* Max number of points (S) */
+#define GMRK_LMP 30 /* Max number of points (L) */
+
+/* Relative Line */
+#define OCODE_GCRLINE 0xA1 /* Relative line at curr pos */
+#define GCRLINE_MP 127 /* Max number of points */
+
+#define OCODE_GRLINE 0xE1 /* Relative line at givn pos */
+#define GRLINE_SMP 125 /* Max number of points (S) */
+#define GRLINE_LMP 123 /* Max number of points (L) */
+
+/* Set Background Color */
+#define OCODE_GSBCOL 0x25 /* Set background color */
+#define OCODE_GPSBCOL 0x65 /* Push and set b/g color */
+
+/* Set Extended Color */
+#define OCODE_GSECOL 0x26 /* Set extended color */
+#define OCODE_GPSECOL 0x66 /* Push and set ext color */
+
+/* Extended Color values */
+#define SECOL_DEFAULT0 0x0000
+#define SECOL_DEFAULT1 0xFF00
+#define SECOL_NEUTRAL 0xFF07
+#define SECOL_RESET 0xFF08
+
+/* Set Character Angle */
+#define OCODE_GSCA 0x34 /* Set character angle */
+#define OCODE_GPSCA 0x74 /* Push and set char angle */
+
+/* Set Character Shear */
+#define OCODE_GSCH 0x35 /* Set character shear */
+#define OCODE_GPSCH 0x75 /* Push and set char shear */
+
+/* Set Fractional Line Width */
+#define OCODE_GSFLW 0x11 /* Set fractional line width */
+#define OCODE_GPSFLW 0x51 /* Push and set frac l width */
+
+/* Set Pick Identifier */
+#define OCODE_GSPIK 0x43 /* Set pick identifier */
+#define OCODE_GPSPIK 0x23 /* Push and set pick id */
+
+
+/* Long Orders for which a structure can be defined for the data */
+
+/* Arc */
+#define OCODE_GCARC 0x86 /* Arc at Current Position */
+#define OCODE_GARC 0xC6 /* Arc at Given Position */
+
+typedef struct _ORDERS_GCARC { /* osgcarc */
+ POINTS ptInter;
+ POINTS ptEnd;
+} ORDERS_GCARC;
+
+typedef struct _ORDERL_GCARC { /* olgcarc */
+ POINTL ptInter;
+ POINTL ptEnd;
+} ORDERL_GCARC;
+
+/* Begin Element */
+#define OCODE_GBEL 0xD2 /* Begin Element */
+
+#define GBEL_DL 251
+typedef struct _ORDER_GBEL { /* ogbel */
+ LONG lElementType;
+ CHAR achDesc[GBEL_DL];
+} ORDER_GBEL;
+
+/* Begin Image */
+#define OCODE_GCBIMG 0x91 /* Begin Image at curr posn */
+#define OCODE_GBIMG 0xD1 /* Begin Image at given posn */
+
+typedef struct _ORDER_GCBIMG { /* ogbimg */
+ UCHAR uchFormat;
+ UCHAR uchReserved;
+ SWPUSHORT cx;
+ SWPUSHORT cy;
+} ORDER_GCBIMG;
+
+/* Begin Path */
+#define OCODE_GBPTH 0xD0 /* Begin Path */
+
+typedef struct _ORDER_GBPTH { /* ogbpth */
+ USHORT usReserved;
+ LONG idPath;
+} ORDER_GBPTH;
+
+/* Box */
+#define OCODE_GCBOX 0x80 /* Box at current position */
+#define OCODE_GBOX 0xC0 /* Box at given position */
+
+typedef struct _ORDERS_GCBOX { /* osgcbox */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ POINTS ptCorner;
+ SHORT hAxis;
+ SHORT vAxis;
+} ORDERS_GCBOX;
+
+typedef struct _ORDERL_GCBOX { /* olgcbox */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ POINTL ptCorner;
+ LONG hAxis;
+ LONG vAxis;
+} ORDERL_GCBOX;
+
+#define GCBOX_FILL 0x40
+#define GCBOX_BOUNDARY 0x20
+
+/* Call Segment */
+#define OCODE_GCALLS 0x07 /* call segment */
+
+typedef struct _ORDER_GCALLS { /* ogcalls */
+ USHORT sReserved;
+ LONG idSegment;
+} ORDER_GCALLS;
+
+/* Fill Path */
+#define OCODE_GFPTH 0xD7 /* Fill path */
+typedef struct _ORDER_GFPTH { /* ogfpth */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ LONG idPath;
+} ORDER_GFPTH;
+
+#define GFPTH_ALTERNATE 0x00
+#define GFPTH_WINDING 0x40
+#define GFPTH_MODIFY 0x20
+
+/* Outline Path */
+#define OCODE_GOPTH 0xD4 /* Outline Path */
+typedef struct _ORDER_GOPTH { /* ogopth */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ LONG idPath;
+} ORDER_GOPTH;
+
+/* Modify Path */
+#define OCODE_GMPTH 0xD8 /* modify path */
+
+typedef struct _ORDER_GMPTH { /* ogmpth */
+ UCHAR uchMode;
+ UCHAR uchReserved;
+ LONG idPath;
+} ORDER_GMPTH;
+
+#define GMPTH_STROKE 0x06
+
+/* Partial Arc */
+#define OCODE_GCPARC 0xA3 /* Partial arc at curr posn */
+#define OCODE_GPARC 0xE3 /* Partial arc at given posn */
+
+typedef struct _ORDERS_GCPARC { /* osgcparc */
+ POINTS ptCenter;
+ FIXED88 ufx88Multiplier;
+ LONG usStartAngle;
+ LONG usSweepAngle;
+} ORDERS_GCPARC;
+
+typedef struct _ORDERL_GCPARC { /* olgcparc */
+ POINTL ptCenter;
+ FIXED ufxMultiplier;
+ LONG usStartAngle;
+ LONG usSweepAngle;
+} ORDERL_GCPARC;
+
+/* Set Clip Path */
+#define OCODE_GSCPTH 0xB4 /* Set clip path */
+
+typedef struct _ORDER_GSCPTH { /* ogscpth */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ LONG idPath;
+} ORDER_GSCPTH;
+
+#define GSCPTH_ALTERNATE 0x00
+#define GSCPTH_WINDING 0x40
+#define GSCPTH_RESET 0x00
+#define GSCPTH_INTERSECT 0x20
+
+/* Set Arc Parameters */
+#define OCODE_GSAP 0x22 /* Set arc parameters */
+#define OCODE_GPSAP 0x62 /* Push and set arc params */
+
+typedef struct _ORDERS_GSAP { /* osgsap */
+ SHORT p;
+ SHORT q;
+ SHORT r;
+ SHORT s;
+} ORDERS_GSAP;
+
+typedef struct _ORDERL_GSAP { /* olgsap */
+ LONG p;
+ LONG q;
+ LONG r;
+ LONG s;
+} ORDERL_GSAP;
+
+/* Set Background Indexed Color */
+#define OCODE_GSBICOL 0xA7 /* Set b/g indexed color */
+#define OCODE_GPSBICOL 0xE7 /* Push and set b/g ind color */
+#define OCODE_GSICOL 0xA6 /* Set indexed color */
+#define OCODE_GPSICOL 0xE6 /* Push and set indexd color */
+
+typedef struct _ORDER_GSBICOL { /* ogbicol */
+ UCHAR fbFlags;
+ UCHAR auchColor[3];
+} ORDER_GSBICOL;
+
+#define SICOL_SPECIFY 0x00
+#define SICOL_SPECIAL 0x40
+#define SICOL_DEFAULT 0x80
+#define SICOL_BLACK 1
+#define SICOL_WHITE 2
+#define SICOL_ONES 4
+#define SICOL_ZEROES 5
+
+/* Set Character Cell */
+#define OCODE_GSCC 0x33 /* Set character cell */
+#define OCODE_GPSCC 0x03 /* Push and set char cell */
+
+typedef struct _ORDERS_GSCC { /* osgscc */
+ SHORT cxInt;
+ SHORT cyInt;
+ USHORT cxFract;
+ USHORT cyFract;
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+} ORDERS_GSCC;
+
+typedef struct _ORDERL_GSCC { /* olgscc */
+ LONG cxInt;
+ LONG cyInt;
+ USHORT cxFract;
+ USHORT cyFract;
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+} ORDERL_GSCC;
+
+#define GSCC_ZERODEF 0x00
+#define GSCC_ZEROZERO 0x80
+
+/* Set Marker Cell */
+#define OCODE_GSMC 0x37 /* Set marker cell */
+#define OCODE_GPSMC 0x77 /* Push and set marker cell */
+
+typedef struct _ORDERS_GSMC { /* osgsmc */
+ SHORT cx;
+ SHORT cy;
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+} ORDERS_GSMC;
+
+typedef struct _ORDERL_GSMC { /* olgsmc */
+ LONG cx;
+ LONG cy;
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+} ORDERL_GSMC;
+
+#define GSMC_ZERODEF 0x00
+#define GSMC_ZEROZERO 0x80
+
+/* Set Pattern Reference Point */
+#define OCODE_GSPRP 0xA0 /* Set pattern ref point */
+#define OCODE_GPSPRP 0xE0 /* Push and set patt ref pt */
+
+typedef struct _ORDERS_GSPRP { /* osgsprp */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ POINTS ptPos;
+} ORDERS_GSPRP;
+
+typedef struct _ORDERL_GSPRP { /* olgsprp */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ POINTL ptPos;
+} ORDERL_GSPRP;
+
+#define GSPRP_DEFAULT 0x80
+#define GSPRP_SPECIFY 0x00
+
+
+/* Set Individual Attribute */
+#define OCODE_GSIA 0x14 /* Set individual attribute */
+#define OCODE_GPSIA 0x54 /* Push and set ind attr */
+
+#define GSIA_VL 3
+typedef struct _ORDER_GSIA { /* ogsia */
+ UCHAR uchAttrType;
+ UCHAR uchPrimType;
+ UCHAR fbFlags;
+ UCHAR auchValue[GSIA_VL];
+} ORDER_GSIA;
+
+#define GSIA_COLOR 0x01
+#define GSIA_BCOLOR 0x02
+#define GSIA_MIX 0x03
+#define GSIA_BMIX 0x04
+#define GSIA_LINE 0x01
+#define GSIA_CHAR 0x02
+#define GSIA_MARKER 0x03
+#define GSIA_PATTERN 0x04
+#define GSIA_IMAGE 0x05
+#define GSIA_SPECIFY 0x00
+#define GSIA_SPECIAL 0x40
+#define GSIA_DEFAULT 0x80
+#define GSIA_BLACK 1
+#define GSIA_WHITE 2
+#define GSIA_ONES 4
+#define GSIA_ZEROES 5
+
+
+/* Set Model /Viewing Transform */
+#define OCODE_GSTM 0x24 /* Set model transform */
+#define OCODE_GPSTM 0x64 /* Push and set model tfm */
+
+#define OCODE_GSTV 0x31 /* Set Viewing Transform */
+
+#define GSTM_ML 16
+typedef struct _ORDERS_GSTM { /* osgstm */
+ UCHAR uchReserved;
+ UCHAR fbFlags;
+ USHORT fsMask;
+ SHORT asMatrix[GSTM_ML];
+} ORDERS_GSTM;
+
+typedef struct _ORDERL_GSTM { /* olgstm */
+ UCHAR uchReserved;
+ UCHAR fbFlags;
+ USHORT fsMask;
+ LONG alMatrix[GSTM_ML];
+} ORDERL_GSTM;
+
+#define GSTM_M11 0x8000
+#define GSTM_M12 0x4000
+#define GSTM_M13 0x2000
+#define GSTM_M14 0x1000
+#define GSTM_M21 0x0800
+#define GSTM_M22 0x0400
+#define GSTM_M23 0x0200
+#define GSTM_M24 0x0100
+#define GSTM_M31 0x0080
+#define GSTM_M32 0x0040
+#define GSTM_M33 0x0020
+#define GSTM_M34 0x0010
+#define GSTM_M41 0x0008
+#define GSTM_M42 0x0004
+#define GSTM_M43 0x0002
+#define GSTM_M44 0x0001
+
+#define GSTM_UNITY 0x00
+#define GSTM_AFTER 0x01
+#define GSTM_BEFORE 0x02
+#define GSTM_OVERWRITE 0x03
+
+#define GSTV_OVERWRITE 0x00
+#define GSTV_AFTER 0x04
+
+/* Set Segment Boundary, Viewing Window */
+
+#define OCODE_GSSB 0x32 /* Set segment boundary */
+#define OCODE_GSVW 0x27 /* Set viewing window */
+#define OCODE_GPSVW 0x67 /* Push and set view window */
+
+#define GSSB_ML 4
+typedef struct _ORDERS_GSSB { /* osgssb */
+ UCHAR fbFlags;
+ UCHAR fbMask;
+ SHORT alMatrix[GSSB_ML];
+} ORDERS_GSSB;
+
+typedef struct _ORDERL_GSSB { /* olgssb */
+ UCHAR fbFLags;
+ UCHAR fbMask;
+ LONG alMatrix[GSSB_ML];
+} ORDERL_GSSB;
+
+#define GSSB_XLEFT 0x20
+#define GSSB_XRIGHT 0x10
+#define GSSB_YBOTTOM 0x08
+#define GSSB_YTOP 0x04
+
+#define GSVW_INTERSECT 0x00
+#define GSVW_REPLACE 0x80
+
+/* Set Segment Characteristics */
+#define OCODE_GSGCH 0x04 /* Set segment characteristics */
+
+#define GSGCH_ML 254
+typedef struct _ORDER_GSGCH { /* ogsgch */
+ UCHAR uchIdent;
+ UCHAR auchData[GSGCH_ML];
+} ORDER_GSGCH;
+
+/* Set Stroke Line Width */
+#define OCODE_GSSLW 0x15 /* Set stroke line width */
+#define OCODE_GPSSLW 0x55 /* Push and set strk l width */
+
+typedef struct _ORDERS_GSSLW { /* osgsslw */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ SHORT LineWidth;
+} ORDERS_GSSLW;
+
+typedef struct _ORDERL_GSSLW { /* olgsslw */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ LONG LineWidth;
+} ORDERL_GSSLW;
+
+#define GSSLW_DEFAULT 0x80
+#define GSSLW_SPECIFY 0x00
+
+/* Sharp Fillet at Current Position */
+#define OCODE_GCSFLT 0xA4 /* Sharp fillet at curr pos */
+#define OCODE_GSFLT 0xE4 /* Sharp fillet at given pos */
+
+#define GCSFLT_SMF 21
+#define GSFLT_SMF 20
+
+typedef struct _ORDERS_GCSFLT { /* osgcsflt */
+ POINTS apt[2*GCSFLT_SMF];
+ FIXED afxSharpness[GCSFLT_SMF];
+} ORDERS_GCSFLT;
+
+#define GCSFLT_LMF 12
+#define GSFLT_LMF 12
+
+typedef struct _ORDERL_GCSFLT { /* olgcsflt */
+ POINTL apt[2*GCSFLT_SMF];
+ FIXED afxSharpness[GCSFLT_SMF];
+} ORDERL_GCSFLT;
+
+/* Bitblt */
+#define OCODE_GBBLT 0xD6 /* Bitblt */
+
+typedef struct _ORDERS_GBBLT { /* osgbblt */
+ USHORT fsFlags;
+ USHORT usMix;
+ HBITMAP hbmSrc;
+ LONG lOptions;
+ RECT1S rcsTargetRect;
+ RECTL rclSourceRect;
+} ORDERS_GBBLT;
+
+typedef struct _ORDERL_GBBLT { /* olgbblt */
+ USHORT fsFlags;
+ USHORT usMix;
+ HBITMAP hbmSrc;
+ LONG lOptions;
+ RECTL rclTargetRect;
+ RECTL rclSourceRect;
+} ORDERL_GBBLT;
+
+/* Escape */
+#define OCODE_GESCP 0xD5 /* Escape */
+
+/*
+ * type describes type of escape order, identifier gives the escape
+ * order if the type is registered
+ */
+#define GESCP_ML 253
+typedef struct _ORDER_GESCP { /* ogescp */
+ UCHAR uchType;
+ UCHAR uchIdent;
+ UCHAR auchData[GESCP_ML]; /* Escape data */
+} ORDER_GESCP;
+
+#define GESCP_REG 0x80 /* identifier is registered */
+
+/* Escape (Bitblt) */
+#define GEBB_REGID 0x02 /* uchIdent - Bitblt */
+
+#define ETYPE_GEBB 0x800200D5L
+
+#define GEBB_LMP 29
+typedef struct _ORDERL_GEBB { /* olgebb */
+ UCHAR fbFlags;
+ USHORT usMix;
+ UCHAR cPoints;
+ HBITMAP hbmSrc;
+ LONG lReserved;
+ LONG lOptions;
+ POINTL aptPoints[GEBB_LMP];
+} ORDERL_GEBB;
+
+/* Escape (Set Pel) */
+#define GEPEL_REGID 0x01 /* uchIdent - Set Pel */
+
+#define ETYPE_GEPEL 0x800100D5L
+
+/* Element Types for attribute bundles */
+#define ETYPE_LINEBUNDLE 0x0000FD01L
+#define ETYPE_CHARBUNDLE 0x0000FD02L
+#define ETYPE_MARKERBUNDLE 0x0000FD03L
+#define ETYPE_AREABUNDLE 0x0000FD04L
+#define ETYPE_IMAGEBUNDLE 0x0000FD05L
+
+/***************************************************************************\
+*
+* Very long orders
+*
+\***************************************************************************/
+
+/* macro to tell whether this is a very long order */
+#define VLONG_ORDER(oc) ((oc)==OCODE_VLONG)
+
+/* Very long order structure */
+#define VORDER_ML 65531
+typedef struct _VORDER { /* vord */
+ UCHAR idCode;
+ UCHAR uchQualifier;
+ SWPUSHORT uchLength;
+ UCHAR uchData[VORDER_ML];
+} VORDER;
+
+/* Character String Extended */
+#define OCODEQ_GCCHSTE 0xB0 /* Qualifier - current posn */
+#define OCODEQ_GCHSTE 0xF0 /* Qualifier - given position */
+
+#define ETYPE_GCCHSTE 0x0000FEB0L
+#define ETYPE_GCHSTE 0x0000FEF0L
+
+typedef struct _ORDERS_GCCHSTE { /* osgcchste */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ POINTS ptRect[2];
+ SWPUSHORT cchString;
+ CHAR achString[1];
+ SHORT adx[1];
+} ORDERS_GCCHSTE;
+
+typedef struct _ORDERL_GCCHSTE { /* olgcchste */
+ UCHAR fbFlags;
+ UCHAR uchReserved;
+ POINTL ptRect[2];
+ SWPUSHORT cchString;
+ CHAR achString[1];
+ LONG adx[1];
+} ORDERL_GCCHSTE;
+
+#define GCCHSTE_DRAWRECT 0x80
+#define GCCHSTE_NORECT 0x00
+#define GCCHSTE_CLIP 0x40
+#define GCCHSTE_NOCLIP 0x00
+#define GCCHSTE_DEEMPHASIZE 0x20
+#define GCCHSTE_NODEEMPHASIZE 0x00
+#define GCCHSTE_LEAVEPOS 0x10
+#define GCCHSTE_MOVEPOS 0x00
+
+/* Extended Escape */
+#define OCODEQ_GEESCP 0xD5 /* Qualifier - extended escape */
+
+#define GEESCP_ML 65533
+typedef struct _ORDER_GEESCP { /* ogeescp */
+ UCHAR uchType;
+ UCHAR uchIdent;
+ UCHAR auchData[GEESCP_ML];
+} ORDER_GEESCP;
diff --git a/private/oleauto/tools/win16/os2/inc/pmpic.h b/private/oleauto/tools/win16/os2/inc/pmpic.h
new file mode 100644
index 000000000..dd7650d10
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmpic.h
@@ -0,0 +1,24 @@
+/***************************************************************************\
+*
+* Module Name: PMPIC.H
+*
+* OS/2 Presentation Manager Picture function declarations
+*
+* Copyright (c) International Business Machines Corporation 1989
+* Copyright (c) Microsoft Corporation 1989
+*
+\***************************************************************************/
+
+/* type of picture to print */
+
+#define PIP_MF 1L
+#define PIP_PIF 2L
+
+BOOL APIENTRY PicPrint(HAB hab, PSZ pszFilename, LONG lType, PSZ pszParams);
+
+/* type of conversion required */
+
+#define PIC_PIFTOMET 0L
+#define PIC_SSTOFONT 2L
+
+BOOL APIENTRY PicIchg(HAB hab, PSZ pszFilename1, PSZ pszFilename2, LONG lType);
diff --git a/private/oleauto/tools/win16/os2/inc/pmsei.h b/private/oleauto/tools/win16/os2/inc/pmsei.h
new file mode 100644
index 000000000..17c38e311
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmsei.h
@@ -0,0 +1,44 @@
+/***************************************************************************\
+*
+* Module Name: PMSEI.H
+*
+* OS/2 Presentation Manager SetErrorInfo constants and function declaration
+*
+* This is included from PMWIN.H when appropriate INCL symbols are defined
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+* =======================================================================
+
+/* SetErrorInfo API */
+
+/* XLATOFF */
+#define WinSetErrorInfo WINSETERRORINFO
+/* XLATON */
+ERRORID cdecl FAR WINSETERRORINFO(ERRORID, USHORT, ...);
+
+#define SEI_BREAKPOINT 0x8000 /* Always enter an INT 3 breakpt */
+#define SEI_NOBEEP 0x4000 /* Do not call DosBeep */
+#define SEI_NOPROMPT 0x2000 /* Do not prompt the user */
+#define SEI_DBGRSRVD 0x1000 /* Reserved for debug use */
+#define SEI_DEBUGONLY (SEI_BREAKPOINT | SEI_NOBEEP | SEI_NOPROMPT | SEI_RESERVED)
+
+#define SEI_STACKTRACE 0x0001 /* save the stack trace */
+#define SEI_REGISTERS 0x0002 /* save the registers */
+#define SEI_ARGCOUNT 0x0004 /* first USHORT in args is arg count */
+#define SEI_DOSERROR 0x0008 /* first USHORT in args is OS2 error code */
+#define SEI_MSGSTR 0x0010 /* first PSZ in arg -> msg string */
+#define SEI_RESERVED 0x0FE0 /* Reserved for future use */
+
+/* Note that when SEI_ARGCOUNT, SEI_DOSERROR and DOS_MSGSTR are specified */
+/* together, then the implied order of the parameters is: */
+/* */
+/* */
+/* WinSetErrorInfo( MAKEERRORID( .... ), */
+/* SEI_ARGCOUNT | SEI_DOSERROR | SEI_MSGSTR, */
+/* argCount, */
+/* dosErrorCode, */
+/* "This is the error msg string: %s\n", */
+/* "This is an insert for the %s format specifier" ); */
+/* */
diff --git a/private/oleauto/tools/win16/os2/inc/pmshl.h b/private/oleauto/tools/win16/os2/inc/pmshl.h
new file mode 100644
index 000000000..4821edb4e
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmshl.h
@@ -0,0 +1,402 @@
+/******************************************************************************\
+*
+* Module Name: PMSHL.H
+*
+* OS/2 Presentation Manager Shell constants, types, messages and
+* function declarations
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+* =============================================================================
+*
+* The following symbols are used in this file for conditional sections.
+*
+* INCL_WINSHELLDATA Include Presentation Manager profile calls
+* INCL_SHLERRORS defined if INCL_ERRORS is defined
+* INCL_WINSWITCHLIST Include Switch List Calls
+* INCL_WINPROGRAMLIST Include Program List Calls
+*
+\******************************************************************************/
+
+
+/* common types, constants and function declarations */
+
+/* maximum title length */
+#define MAXNAMEL 60
+
+/* window size structure */
+typedef struct _XYWINSIZE { /* xywin */
+ SHORT x;
+ SHORT y;
+ SHORT cx;
+ SHORT cy;
+ USHORT fsWindow;
+} XYWINSIZE;
+typedef XYWINSIZE FAR *PXYWINSIZE;
+
+/* Definitions for fsWindow */
+#define XYF_NOAUTOCLOSE 0x0008
+#define XYF_MINIMIZED 0x0004 /* D23914 */
+#define XYF_MAXIMIZED 0x0002 /* D23914 */
+#define XYF_INVISIBLE 0x0001
+#define XYF_NORMAL 0X0000
+
+/* program handle */
+typedef LHANDLE HPROGRAM; /* hprog */
+typedef HPROGRAM FAR * PHPROGRAM;
+
+/* ini file handle */
+typedef LHANDLE HINI; /* hini */
+typedef HINI FAR * PHINI;
+
+
+#define HINI_PROFILE (HINI) NULL
+#define HINI_USERPROFILE (HINI) -1L
+#define HINI_SYSTEMPROFILE (HINI) -2L
+
+#define HINI_USER HINI_USERPROFILE
+#define HINI_SYSTEM HINI_SYSTEMPROFILE
+
+
+typedef struct _PRFPROFILE { /* prfpro */
+ ULONG cchUserName;
+ PSZ pszUserName;
+ ULONG cchSysName;
+ PSZ pszSysName;
+} PRFPROFILE;
+
+typedef PRFPROFILE FAR *PPRFPROFILE;
+
+#ifdef INCL_WINPROGRAMLIST
+/* maximum path length */
+#define MAXPATHL 128
+
+/* root group handle */
+#define SGH_ROOT (HPROGRAM) -1L
+
+typedef struct _HPROGARRAY { /* hpga */
+ HPROGRAM ahprog[1];
+} HPROGARRAY;
+typedef HPROGARRAY FAR *PHPROGARRAY;
+
+typedef CHAR PROGCATEGORY; /* progc */
+typedef PROGCATEGORY FAR *PPROGCATEGORY;
+
+/* values acceptable for PROGCATEGORY for PM groups */
+#define PROG_DEFAULT (PROGCATEGORY)0
+#define PROG_FULLSCREEN (PROGCATEGORY)1
+#define PROG_WINDOWABLEVIO (PROGCATEGORY)2
+#define PROG_PM (PROGCATEGORY)3
+#define PROG_GROUP (PROGCATEGORY)5
+#define PROG_REAL (PROGCATEGORY)4 /* was 7 */
+#define PROG_DLL (PROGCATEGORY)6
+#define PROG_RESERVED (PROGCATEGORY)255
+
+/* visibility flag for PROGTYPE structure */
+#define SHE_VISIBLE (BYTE)0x00
+#define SHE_INVISIBLE (BYTE)0x01
+#define SHE_RESERVED (BYTE)0xFF
+
+/* Protected group flag for PROGTYPE structure */
+#define SHE_UNPROTECTED (BYTE)0x00
+#define SHE_PROTECTED (BYTE)0x02
+
+typedef struct _PROGTYPE { /* progt */
+ PROGCATEGORY progc;
+ UCHAR fbVisible;
+} PROGTYPE;
+typedef PROGTYPE FAR *PPROGTYPE;
+
+typedef struct _PROGRAMENTRY { /* proge */
+ HPROGRAM hprog;
+ PROGTYPE progt;
+ CHAR szTitle[MAXNAMEL+1];
+} PROGRAMENTRY;
+typedef PROGRAMENTRY FAR *PPROGRAMENTRY;
+
+typedef struct _PIBSTRUCT { /* pib */
+ PROGTYPE progt;
+ CHAR szTitle[MAXNAMEL+1];
+ CHAR szIconFileName[MAXPATHL+1];
+ CHAR szExecutable[MAXPATHL+1];
+ CHAR szStartupDir[MAXPATHL+1];
+ XYWINSIZE xywinInitial;
+ USHORT res1;
+ LHANDLE res2;
+ USHORT cchEnvironmentVars;
+ PCH pchEnvironmentVars;
+ USHORT cchProgramParameter;
+ PCH pchProgramParameter;
+} PIBSTRUCT;
+typedef PIBSTRUCT FAR *PPIBSTRUCT;
+
+/******************************************************************************/
+/* */
+/* Structures associated with 'Prf' calls */
+/* */
+/******************************************************************************/
+
+typedef struct _PROGDETAILS { /* progde */
+ ULONG Length; /* set this to sizeof(PROGDETAILS) */
+ PROGTYPE progt;
+ USHORT pad1[3]; /* ready for 32-bit PROGTYPE */
+ PSZ pszTitle; /* any of the pointers can be NULL */
+ PSZ pszExecutable;
+ PSZ pszParameters;
+ PSZ pszStartupDir;
+ PSZ pszIcon;
+ PSZ pszEnvironment; /* this is terminated by /0/0 */
+ SWP swpInitial; /* this replaces XYWINSIZE */
+ USHORT pad2[5]; /* ready for 32-bit SWP */
+} PROGDETAILS;
+
+typedef PROGDETAILS FAR *PPROGDETAILS;
+
+typedef struct _PROGTITLE { /* progti */
+ HPROGRAM hprog;
+ PROGTYPE progt;
+ USHORT pad1[3]; /* padding ready for 32-bit PROGTYPE */
+ PSZ pszTitle;
+} PROGTITLE;
+
+typedef PROGTITLE FAR *PPROGTITLE;
+
+typedef struct _QFEOUTBLK { /* qfeout */
+ USHORT Total;
+ USHORT Count;
+ HPROGRAM ProgramArr[1];
+} QFEOUTBLK;
+typedef QFEOUTBLK far *PQFEOUTBLK;
+
+/* Program List API Function Definitions */
+
+/*** Program Use */
+
+BOOL APIENTRY WinQueryProgramTitles(HAB hab, HPROGRAM hprogGroup
+ , PPROGRAMENTRY aprogeBuffer
+ , USHORT usBufferLen, PUSHORT pusTotal);
+
+/*** Single Program Manipulation */
+HPROGRAM APIENTRY WinAddProgram(HAB hab, PPIBSTRUCT ppibProgramInfo
+ , HPROGRAM hprogGroupHandle);
+
+USHORT APIENTRY WinQueryDefinition(HAB hab, HPROGRAM hprogProgHandle
+ , PPIBSTRUCT ppibProgramInfo
+ , USHORT usMaxLength);
+
+/*** Group Manipulation */
+HPROGRAM APIENTRY WinCreateGroup(HAB hab, PSZ pszTitle , UCHAR ucVisibility
+ , ULONG flres1, ULONG flres2);
+/******************************************************************************/
+/* */
+/* Program List API available 'Prf' calls */
+/* */
+/******************************************************************************/
+
+ULONG APIENTRY PrfQueryProgramTitles(HINI hini, HPROGRAM hprogGroup
+ , PPROGTITLE pTitles, ULONG cchBufferMax, PULONG pulCount);
+
+/*****************************************************************************/
+/* */
+/* NOTE: string information is concatanated after the array of PROGTITLE */
+/* structures so you need to allocate storage greater than */
+/* sizeof(PROGTITLE)*cPrograms to query programs in a group */
+/* */
+/* PrfQueryProgramTitles recommended usage to obtain titles of all progams */
+/* in a group (Hgroup=SGH_ROOT is for all groups): */
+/* */
+/* BufLen = PrfQueryProgramTitles( Hini, Hgroup */
+/* , (PPROGTITLE)NULL, 0, &Count); */
+/* */
+/* Alocate buffer of Buflen */
+/* */
+/* Len = PrfQueryProgramTitles( Hini, Hgroup, (PPROGTITLE)pBuffer, BufLen */
+/* , pCount); */
+/* */
+/*****************************************************************************/
+
+HPROGRAM APIENTRY PrfAddProgram
+ (HINI hini, PPROGDETAILS pDetails, HPROGRAM hprogGroup);
+BOOL APIENTRY PrfChangeProgram
+ (HINI hini, HPROGRAM hprog, PPROGDETAILS pDetails);
+
+/***************************************************************************/
+/* when adding/changing programs the PROGDETAILS Length field should be */
+/* set to sizeof(PROGDETAILS) */
+/***************************************************************************/
+
+ULONG APIENTRY PrfQueryDefinition
+ (HINI hini, HPROGRAM hprog, PPROGDETAILS pDetails, ULONG cchBufferMax);
+
+/*****************************************************************************/
+/* */
+/* NOTE: string information is concatanated after the PROGDETAILS field */
+/* structure so you need to allocate storage greater than */
+/* sizeof(PROGDETAILS) to query programs */
+/* */
+/* PrfQueryDefinition recomended usage: */
+/* */
+/* bufferlen = PrfQueryDefinition( Hini, Hprog, (PPROGDETAILS)NULL, 0) */
+/* */
+/* Alocate buffer of bufferlen bytes */
+/* set Length field (0 will be supported) */
+/* */
+/* (PPROGDETAILS)pBuffer->Length=sizeof(PPROGDETAILS) */
+/* */
+/* len = PrfQueryDefinition(Hini, Hprog, (PPROGDETAILS)pBuffer, bufferlen) */
+/* */
+/*****************************************************************************/
+
+BOOL APIENTRY PrfRemoveProgram(HINI hini,HPROGRAM hprog);
+ULONG APIENTRY PrfQueryProgramHandle (HINI hini,PSZ pszExe
+ ,PHPROGARRAY phprogArray, ULONG cchBufferMax,PULONG pulCount);
+HPROGRAM APIENTRY PrfCreateGroup
+ (HINI hini, PSZ pszTitle, UCHAR chVisibility);
+BOOL APIENTRY PrfDestroyGroup(HINI hini,HPROGRAM hprogGroup);
+PROGCATEGORY APIENTRY PrfQueryProgramCategory(HINI hini, PSZ pszExe);
+
+#endif /* INCL_WINPROGRAMLIST */
+
+#if (defined(INCL_WINSWITCHLIST) || !defined(INCL_NOCOMMON))
+
+typedef LHANDLE HSWITCH; /* hsw */
+typedef HSWITCH FAR *PHSWITCH;
+
+/* visibility flag for SWCNTRL structure */
+#define SWL_VISIBLE (BYTE)0x04
+#define SWL_INVISIBLE (BYTE)0x01
+#define SWL_GRAYED (BYTE)0x02
+
+/* visibility flag for SWCNTRL structure */
+#define SWL_JUMPABLE (BYTE)0x02
+#define SWL_NOTJUMPABLE (BYTE)0x01
+
+typedef struct _SWCNTRL { /* swctl */
+ HWND hwnd;
+ HWND hwndIcon;
+ HPROGRAM hprog;
+ USHORT idProcess;
+ USHORT idSession;
+ UCHAR uchVisibility;
+ UCHAR fbJump;
+ CHAR szSwtitle[MAXNAMEL+1];
+ BYTE fReserved; /* To align on word boundary */
+} SWCNTRL;
+typedef SWCNTRL FAR *PSWCNTRL;
+
+/*** Switching Program functions */
+HSWITCH EXPENTRY WinAddSwitchEntry( PSWCNTRL );
+USHORT EXPENTRY WinRemoveSwitchEntry( HSWITCH );
+
+#endif /* not INCL_NOCOMMON */
+
+#ifdef INCL_WINSWITCHLIST
+
+typedef struct _SWENTRY { /* swent */
+ HSWITCH hswitch;
+ SWCNTRL swctl;
+} SWENTRY;
+typedef SWENTRY FAR *PSWENTRY;
+
+typedef struct _SWBLOCK { /* swblk */
+ USHORT cswentry;
+ SWENTRY aswentry[1];
+} SWBLOCK;
+typedef SWBLOCK FAR *PSWBLOCK;
+
+USHORT EXPENTRY WinChangeSwitchEntry( HSWITCH hswitchSwitch
+ , PSWCNTRL pswctlSwitchData);
+HSWITCH EXPENTRY WinCreateSwitchEntry( HAB, PSWCNTRL );
+USHORT EXPENTRY WinQuerySessionTitle( HAB hab, USHORT usSession
+ , PSZ pszTitle, USHORT usTitlelen);
+USHORT EXPENTRY WinQuerySwitchEntry( HSWITCH hswitchSwitch
+ , PSWCNTRL pswctlSwitchData);
+HSWITCH EXPENTRY WinQuerySwitchHandle( HWND hwnd, PID usProcess);
+USHORT EXPENTRY WinQuerySwitchList( HAB hab, PSWBLOCK pswblkSwitchEntries
+ , USHORT usDataLength);
+USHORT EXPENTRY WinQueryTaskSizePos( HAB hab, USHORT usScreenGroup
+ , PSWP pswpPositionData);
+USHORT EXPENTRY WinQueryTaskTitle( USHORT usSession, PSZ pszTitle
+ , USHORT usTitlelen);
+USHORT EXPENTRY WinSwitchToProgram( HSWITCH hswitchSwHandle);
+
+#endif
+
+/* if error definitions are required then allow Shell errors */
+#ifdef INCL_ERRORS
+ #define INCL_SHLERRORS
+#endif /* INCL_ERRORS */
+
+#ifdef INCL_WINSHELLDATA
+
+
+/*** OS2.INI Access functions */
+SHORT APIENTRY WinQueryProfileInt( HAB hab, PSZ pszAppName
+ , PSZ pszKeyName, SHORT sDefault);
+USHORT APIENTRY WinQueryProfileString( HAB hab, PSZ pszAppName, PSZ pszKeyName
+ , PSZ pszDefault, PVOID pProfileString
+ , USHORT usMaxPstring);
+BOOL APIENTRY WinWriteProfileString( HAB hab, PSZ pszAppName, PSZ pszKeyName
+ , PSZ pszValue);
+USHORT APIENTRY WinQueryProfileSize( HAB hab, PSZ pszAppName, PSZ pszKeyName
+ , PUSHORT pusValue);
+BOOL APIENTRY WinQueryProfileData( HAB hab, PSZ pszAppName, PSZ pszKeyName
+ , PVOID pValue, PUSHORT pusSize);
+BOOL APIENTRY WinWriteProfileData( HAB hab, PSZ pszAppName, PSZ pszKeyName
+ , PVOID pValue, USHORT usSize);
+
+/******************************************************************************/
+/* */
+/* INI file access API available calls 'Prf' */
+/* */
+/******************************************************************************/
+
+SHORT APIENTRY PrfQueryProfileInt(HINI hini,PSZ pszApp,PSZ pszKey
+ ,SHORT sDefault);
+ULONG APIENTRY PrfQueryProfileString(HINI hini,PSZ pszApp, PSZ pszKey
+ ,PSZ pszDefault, PVOID pBuffer, ULONG cchBufferMax);
+BOOL APIENTRY PrfWriteProfileString
+ (HINI hini,PSZ pszApp, PSZ pszKey , PSZ pszData);
+BOOL APIENTRY PrfQueryProfileSize
+ (HINI hini,PSZ pszApp, PSZ pszKey ,PULONG pulReqLen);
+BOOL APIENTRY PrfQueryProfileData
+ (HINI hini, PSZ pszApp, PSZ pszKey, PVOID pBuffer, PULONG pulBuffLen);
+
+BOOL APIENTRY PrfWriteProfileData
+ (HINI hini, PSZ pszApp,PSZ pszKey,PVOID pData, ULONG cchDataLen);
+
+HINI APIENTRY PrfOpenProfile(HAB hab, PSZ pszFileName);
+BOOL APIENTRY PrfCloseProfile(HINI hini);
+BOOL APIENTRY PrfReset(HAB hab, PPRFPROFILE pPrfProfile);
+BOOL APIENTRY PrfQueryProfile(HAB hab, PPRFPROFILE pPrfProfile);
+
+/* new public message, broadcast on WinReset */
+#define PL_ALTERED 0x008E /* WM_SHELLFIRST + 0E */
+
+
+#endif /* INCL_WINSHELLDATA */
+
+#ifdef INCL_SHLERRORS
+
+#include <pmerr.h>
+
+#endif /* INCL_SHLERRORS */
+
+typedef LHANDLE HAPP;
+
+HAPP EXPENTRY WinInstStartApp( HINI hini, HWND hwndNotifyWindow,
+ USHORT cCount, PSZ far * aszApplication,
+ PSZ pszCmdLine, PVOID pData, USHORT fsOptions );
+
+BOOL EXPENTRY WinTerminateApp( HAPP happ );
+
+/* bit values for Options parameter of WinInstStartAppl */
+#define SAF_VALIDFLAGS 0x001F
+
+#define SAF_INSTALLEDCMDLINE 0x0001 /* use installed parameters */
+#define SAF_STARTCHILDAPP 0x0002 /* related application */
+#define SAF_MAXIMIZED 0x0004 /* Start App maximized */
+#define SAF_MINIMIZED 0x0008 /* Start App minimized, if !SAF_MAXIMIZED */
+#define SAF_BACKGROUND 0x0010 /* Start app in the background */
+
diff --git a/private/oleauto/tools/win16/os2/inc/pmspl.h b/private/oleauto/tools/win16/os2/inc/pmspl.h
new file mode 100644
index 000000000..728b79fe6
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmspl.h
@@ -0,0 +1,647 @@
+/***************************************************************************\
+*
+* Module Name: PMSPL.H
+*
+* OS/2 Presentation Manager Spooler constants, types and function declarations
+*
+* Copyright(c) IBM Corporation 1987-1990
+* Copyright(c) Microsoft Corp., 1987-1990
+*
+* =============================================================================
+*
+* The following symbols are used in this file for conditional sections.
+*
+* INCL_SPLERRORS - defined if INCL_ERRORS defined
+* INCL_SPLFSE - file system emulation calls
+*
+\***************************************************************************/
+
+/* if error definitions are required then allow Spooler errors */
+#ifdef INCL_ERRORS
+ #define INCL_SPLERRORS
+#endif /* INCL_ERRORS */
+
+/* Names of various OS2SYS.INI spooler variables */
+
+#define SPL_INI_SPOOLER "PM_SPOOLER"
+#define SPL_INI_QUEUE "PM_SPOOLER_QUEUE"
+#define SPL_INI_PRINTER "PM_SPOOLER_PRINTER"
+#define SPL_INI_PRINTERDESCR "PM_SPOOLER_PRINTER_DESCR"
+#define SPL_INI_QUEUEDESCR "PM_SPOOLER_QUEUE_DESCR"
+#define SPL_INI_QUEUEDD "PM_SPOOLER_QUEUE_DD"
+#define SPL_INI_QUEUEDDDATA "PM_SPOOLER_QUEUE_DDDATA"
+
+/* General SPL return values */
+#define SPL_ERROR 0L
+#define SPL_OK 1L
+
+/* handle to a spool file */
+typedef LHANDLE HSPL; /* hspl */
+/* Used in recording of PM_Q_STD data via SplStdxxx calls */
+typedef LHANDLE HSTD; /* hstd */
+typedef HSTD far *PHSTD;
+/* spooler manager open data */
+typedef PSZ FAR *PQMOPENDATA; /* pqmdop */
+
+/*** Spooler Queue manager Interface */
+HSPL EXPENTRY SplQmOpen( PSZ, LONG, PQMOPENDATA );
+BOOL EXPENTRY SplQmStartDoc( HSPL, PSZ );
+BOOL EXPENTRY SplQmWrite( HSPL, LONG, PBYTE );
+BOOL EXPENTRY SplQmEndDoc( HSPL );
+BOOL EXPENTRY SplQmClose( HSPL );
+BOOL EXPENTRY SplQmAbort( HSPL );
+BOOL EXPENTRY SplQmAbortDoc( HSPL );
+
+#ifdef INCL_SPLFSE
+/*** Direct Device File System Interface */
+
+USHORT EXPENTRY PrtOpen( PSZ, PUSHORT, PUSHORT, ULONG,
+ USHORT, USHORT, USHORT, ULONG );
+USHORT EXPENTRY PrtClose( HFILE );
+USHORT EXPENTRY PrtWrite( HFILE, PCH, USHORT, PUSHORT );
+USHORT EXPENTRY PrtDevIOCtl( PVOID, PVOID, USHORT, USHORT, HFILE );
+void EXPENTRY PrtAbort ( HFILE hFile );
+#endif /* include File System Emulation functions */
+
+/*** Spooler Queue Processor interface */
+
+BOOL EXPENTRY SplQpQueryDt( PLONG, PSZ FAR * );
+BOOL EXPENTRY SplQpInstall( HWND );
+
+/* Style for SplMessageBox */
+/* Same as for WinMsgBox see PMWIN.H for details */
+
+/*** Spooler message interface */
+USHORT EXPENTRY SplMessageBox( PSZ, USHORT, USHORT,
+ PSZ, PSZ, USHORT, USHORT );
+
+/*** PM_Q_STD datatype functions */
+BOOL EXPENTRY SplStdOpen( HDC );
+BOOL EXPENTRY SplStdClose( HDC );
+BOOL EXPENTRY SplStdStart( HDC );
+HSTD EXPENTRY SplStdStop( HDC );
+BOOL EXPENTRY SplStdDelete( HSTD );
+BOOL EXPENTRY SplStdGetBits( HSTD, LONG, LONG, PCH );
+LONG EXPENTRY SplStdQueryLength( HSTD );
+
+/* Error information and return codes
+** ==================================
+*/
+/* Error information for SplMessageBox */
+#define SPLINFO_QPERROR 0x0001
+#define SPLINFO_DDERROR 0x0002
+#define SPLINFO_SPLERROR 0x0004
+#define SPLINFO_OTHERERROR 0x0080
+#define SPLINFO_INFORMATION 0x0100 /* @P3C */
+#define SPLINFO_WARNING 0x0200 /* @P3C */
+#define SPLINFO_ERROR 0x0400 /* @P3C */
+#define SPLINFO_SEVERE 0x0800 /* @P3C */
+#define SPLINFO_USERINTREQD 0x1000
+
+/* Error Data for SplMessageBox */
+#define SPLDATA_PRINTERJAM 0x0001
+#define SPLDATA_FORMCHGREQD 0x0002
+#define SPLDATA_CARTCHGREQD 0x0004
+#define SPLDATA_PENCHGREQD 0x0008
+#define SPLDATA_DATAERROR 0x0010
+#define SPLDATA_UNEXPECTERROR 0x0020
+#define SPLDATA_OTHER 0x8000
+
+/* return code for SplStdQueryLength */
+#define SSQL_ERROR (-1L)
+
+#ifdef INCL_SPLERRORS
+
+#include <pmerr.h>
+
+#endif /* INCL_SPLERRORS */
+
+
+
+
+/* length for character arrays in structures (excluding zero terminator) */
+#define CNLEN 15 /* Computer name length */
+#define UNLEN 20 /* Maximum user name length */
+#define QNLEN 12 /* Queue name maximum length */
+#define PDLEN 8 /* Print destination length */
+#define DTLEN 9 /* Spool file data type */
+ /* e.g. PM_Q_STD,PM_Q_RAW */
+#define QP_DATATYPE_SIZE 15 /* returned by SplQpQueryDt */
+#define DRIV_DEVICENAME_SIZE 31 /* see DRIVDATA struc */
+#define DRIV_NAME_SIZE 8 /* name of device driver */
+#define PRINTERNAME_SIZE 32 /* max printer name length */
+#define FORMNAME_SIZE 31 /* max form name length */
+#define MAXCOMMENTSZ 48 /* queue comment length */
+
+#define DEFAULT_LM_PROC "LMPRINT"
+
+/**INTERNAL_ONLY**/
+/* IOctl for DosPrintJobGetId */
+#define SPOOL_LMCAT 83
+#define SPOOL_LMGetPrintId 0x60
+
+/**END_INTERNAL**/
+
+
+typedef unsigned SPLERR; /* err */
+
+typedef struct _PRJINFO { /* prj1 */
+ USHORT uJobId;
+ CHAR szUserName[UNLEN+1];
+ CHAR pad_1;
+ CHAR szNotifyName[CNLEN+1];
+ CHAR szDataType[DTLEN+1];
+ PSZ pszParms;
+ USHORT uPosition;
+ USHORT fsStatus;
+ PSZ pszStatus;
+ ULONG ulSubmitted;
+ ULONG ulSize;
+ PSZ pszComment;
+} PRJINFO;
+typedef PRJINFO far *PPRJINFO;
+typedef PRJINFO near *NPPRJINFO;
+
+typedef struct _PRJINFO2 { /* prj2 */
+ USHORT uJobId;
+ USHORT uPriority;
+ PSZ pszUserName;
+ USHORT uPosition;
+ USHORT fsStatus;
+ ULONG ulSubmitted;
+ ULONG ulSize;
+ PSZ pszComment;
+ PSZ pszDocument;
+} PRJINFO2;
+typedef PRJINFO2 far *PPRJINFO2;
+typedef PRJINFO2 near *NPPRJINFO2;
+
+typedef struct _PRJINFO3 { /* prj */
+ USHORT uJobId;
+ USHORT uPriority;
+ PSZ pszUserName;
+ USHORT uPosition;
+ USHORT fsStatus;
+ ULONG ulSubmitted;
+ ULONG ulSize;
+ PSZ pszComment;
+ PSZ pszDocument;
+ PSZ pszNotifyName;
+ PSZ pszDataType;
+ PSZ pszParms;
+ PSZ pszStatus;
+ PSZ pszQueue;
+ PSZ pszQProcName;
+ PSZ pszQProcParms;
+ PSZ pszDriverName;
+ PDRIVDATA pDriverData;
+ PSZ pszPrinterName;
+} PRJINFO3;
+typedef PRJINFO3 far *PPRJINFO3;
+typedef PRJINFO3 near *NPPRJINFO3;
+
+
+typedef struct _PRDINFO { /* prd1 */
+ CHAR szName[PDLEN+1];
+ CHAR szUserName[UNLEN+1];
+ USHORT uJobId;
+ USHORT fsStatus;
+ PSZ pszStatus;
+ USHORT time;
+} PRDINFO;
+typedef PRDINFO far *PPRDINFO;
+typedef PRDINFO near *NPPRDINFO;
+
+
+typedef struct _PRDINFO3 { /* prd */
+ PSZ pszPrinterName;
+ PSZ pszUserName;
+ PSZ pszLogAddr;
+ USHORT uJobId;
+ USHORT fsStatus;
+ PSZ pszStatus;
+ PSZ pszComment;
+ PSZ pszDrivers;
+ USHORT time;
+ USHORT usTimeOut;
+} PRDINFO3;
+typedef PRDINFO3 far *PPRDINFO3;
+typedef PRDINFO3 near *NPPRDINFO3;
+
+
+typedef struct _PRQINFO { /* prq1 */
+ CHAR szName[QNLEN+1];
+ CHAR pad_1;
+ USHORT uPriority;
+ USHORT uStartTime;
+ USHORT uUntilTime;
+ PSZ pszSepFile;
+ PSZ pszPrProc;
+ PSZ pszDestinations;
+ PSZ pszParms;
+ PSZ pszComment;
+ USHORT fsStatus;
+ USHORT cJobs;
+} PRQINFO;
+typedef PRQINFO far *PPRQINFO;
+typedef PRQINFO near *NPPRQINFO;
+
+
+typedef struct _PRQINFO3 { /* prq */
+ PSZ pszName;
+ USHORT uPriority;
+ USHORT uStartTime;
+ USHORT uUntilTime;
+ USHORT pad1;
+ PSZ pszSepFile;
+ PSZ pszPrProc;
+ PSZ pszParms;
+ PSZ pszComment;
+ USHORT fsStatus;
+ USHORT cJobs;
+ PSZ pszPrinters;
+ PSZ pszDriverName;
+ PDRIVDATA pDriverData;
+} PRQINFO3;
+typedef PRQINFO3 far *PPRQINFO3;
+typedef PRQINFO3 near *NPPRQINFO3;
+
+
+/*
+ * structure for DosPrintJobGetId
+ */
+typedef struct _PRIDINFO { /* prjid */
+ USHORT uJobId;
+ CHAR szServer[CNLEN + 1];
+ CHAR szQName[QNLEN+1];
+ CHAR pad_1;
+} PRIDINFO;
+typedef PRIDINFO far *PPRIDINFO;
+typedef PRIDINFO near *NPPRIDINFO;
+
+/*
+ * structure for DosPrintDriverEnum
+ */
+typedef struct _PRDRIVINFO { /* prdid */
+ CHAR szDrivName[DRIV_NAME_SIZE+1+DRIV_DEVICENAME_SIZE+1];
+} PRDRIVINFO;
+typedef PRDRIVINFO far *PPRDRIVINFO;
+typedef PRDRIVINFO near *NPPRDRIVINFO;
+
+
+/*
+ * structure for DosPrintQProcessorEnum
+ */
+typedef struct _PRQPROCINFO { /* prqp */
+ CHAR szQProcName[QNLEN+1];
+} PRQPROCINFO;
+typedef PRQPROCINFO far *PPRQPROCINFO;
+typedef PRQPROCINFO near *NPPRQPROCINFO;
+
+/*
+ * structure for DosPrintPortEnum
+ */
+typedef struct _PRPORTINFO { /* prpo */
+ CHAR szPortName[PDLEN+1];
+} PRPORTINFO;
+typedef PRPORTINFO far *PPRPORTINFO;
+typedef PRPORTINFO near *NPPRPORTINFO;
+
+
+/****************************************************************
+ * *
+ * Function prototypes *
+ * *
+ ****************************************************************/
+
+SPLERR EXPENTRY DosPrintDestEnum(
+ PSZ pszServer,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ PUSHORT pcReturned,
+ PUSHORT pcTotal
+ );
+
+SPLERR EXPENTRY DosPrintDestControl(
+ PSZ pszServer,
+ PSZ pszDevName,
+ USHORT uControl
+ );
+
+SPLERR EXPENTRY DosPrintDestGetInfo(
+ PSZ pszServer,
+ PSZ pszName,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ PUSHORT pcbNeeded
+ );
+
+SPLERR EXPENTRY DosPrintDestAdd(
+ PSZ pszServer,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf
+ );
+
+SPLERR EXPENTRY DosPrintDestSetInfo(
+ PSZ pszServer,
+ PSZ pszName,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ USHORT uParmNum
+ );
+
+SPLERR EXPENTRY DosPrintDestDel(
+ PSZ pszServer,
+ PSZ pszPrinterName
+ );
+
+SPLERR EXPENTRY DosPrintQEnum(
+ PSZ pszServer,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ PUSHORT pcReturned,
+ PUSHORT pcTotal
+ );
+
+SPLERR EXPENTRY DosPrintQGetInfo(
+ PSZ pszServer,
+ PSZ pszQueueName,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ PUSHORT pcbNeeded
+ );
+
+SPLERR EXPENTRY DosPrintQSetInfo(
+ PSZ pszServer,
+ PSZ pszQueueName,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ USHORT uParmNum
+ );
+
+SPLERR EXPENTRY DosPrintQPause(
+ PSZ pszServer,
+ PSZ pszQueueName
+ );
+
+SPLERR EXPENTRY DosPrintQContinue(
+ PSZ pszServer,
+ PSZ pszQueueName
+ );
+
+SPLERR EXPENTRY DosPrintQPurge(
+ PSZ pszServer,
+ PSZ pszQueueName
+ );
+
+SPLERR EXPENTRY DosPrintQAdd(
+ PSZ pszServer,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf
+ );
+
+SPLERR EXPENTRY DosPrintQDel(
+ PSZ pszServer,
+ PSZ pszQueueName
+ );
+
+SPLERR EXPENTRY DosPrintJobGetInfo(
+ PSZ pszServer,
+ USHORT uJobId,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ PUSHORT pcbNeeded
+ );
+
+SPLERR EXPENTRY DosPrintJobSetInfo(
+ PSZ pszServer,
+ USHORT uJobId,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ USHORT uParmNum
+ );
+
+SPLERR EXPENTRY DosPrintJobPause(
+ PSZ pszServer,
+ USHORT uJobId
+ );
+
+SPLERR EXPENTRY DosPrintJobContinue(
+ PSZ pszServer,
+ USHORT uJobId
+ );
+
+SPLERR EXPENTRY DosPrintJobDel(
+ PSZ pszServer,
+ USHORT uJobId
+ );
+
+SPLERR EXPENTRY DosPrintJobEnum(
+ PSZ pszServer,
+ PSZ pszQueueName,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ PUSHORT pcReturned,
+ PUSHORT pcTotal
+ );
+
+SPLERR EXPENTRY DosPrintJobGetId(
+ HFILE hFile,
+ PPRIDINFO pInfo,
+ USHORT cbInfo
+ );
+
+/**INTERNAL_ONLY**/
+
+SPLERR EXPENTRY DosPrintJobAdd2(
+ PSZ pszServer,
+ PSZ pszQueueName,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ PSZ pszFileName,
+ PUSHORT puJobId
+ );
+
+SPLERR EXPENTRY DosPrintJobSchedule(
+ PSZ pszServer,
+ USHORT uJobId
+ );
+
+SPLERR APIENTRY CorePrintJobEnum(
+ PSZ pszServer,
+ PSZ pszQueueName,
+ USHORT uLevel,
+ PBYTE pbBuf,
+ USHORT cbBuf,
+ PUSHORT pcReturned,
+ PUSHORT pcTotal);
+
+SPLERR EXPENTRY DosPrintDriverEnum(
+ PSZ pszHostName,
+ USHORT sLevel,
+ PBYTE pbBuf,
+ USHORT usBuflen,
+ PUSHORT pusRead,
+ PUSHORT pusTotal
+ );
+
+SPLERR EXPENTRY DosPrintQProcessorEnum(
+ PSZ pszHostName,
+ USHORT sLevel,
+ PBYTE pbBuf,
+ USHORT usBuflen,
+ PUSHORT pusRead,
+ PUSHORT pusTotal
+ );
+
+SPLERR EXPENTRY DosPrintPortEnum(
+ PSZ pszHostName,
+ USHORT sLevel,
+ PBYTE pbBuf,
+ USHORT usBuflen,
+ PUSHORT pusRead,
+ PUSHORT pusTotal
+ );
+
+/**END_INTERNAL**/
+
+/*
+ * Values for parmnum in DosPrintQSetInfo.
+ */
+
+#define PRQ_PRIORITY_PARMNUM 2
+#define PRQ_STARTTIME_PARMNUM 3
+#define PRQ_UNTILTIME_PARMNUM 4
+#define PRQ_SEPARATOR_PARMNUM 5
+#define PRQ_PROCESSOR_PARMNUM 6
+#define PRQ_DESTINATIONS_PARMNUM 7
+#define PRQ_PARMS_PARMNUM 8
+#define PRQ_COMMENT_PARMNUM 9
+#define PRQ_PRINTERS_PARMNUM 12
+#define PRQ_DRIVERNAME_PARMNUM 13
+#define PRQ_DRIVERDATA_PARMNUM 14
+#define PRQ_MAXPARMNUM 14
+
+/*
+ * Print Queue Priority
+ */
+
+#define PRQ_MAX_PRIORITY 1 /* highest priority */
+#define PRQ_DEF_PRIORITY 5
+#define PRQ_MIN_PRIORITY 9 /* lowest priority */
+#define PRQ_NO_PRIORITY 0
+
+/*
+ * Print queue status bitmask and values for level 1
+ */
+
+#define PRQ_STATUS_MASK 3
+#define PRQ_ACTIVE 0
+#define PRQ_PAUSED 1
+#define PRQ_ERROR 2
+#define PRQ_PENDING 3
+
+/*
+ * Print queue status bits for level 3
+ */
+
+#define PRQ3_PAUSED 0x1
+#define PRQ3_PENDING 0x2
+
+/*
+ * Values for parmnum in DosPrintJobSetInfo.
+ */
+
+#define PRJ_NOTIFYNAME_PARMNUM 3
+#define PRJ_DATATYPE_PARMNUM 4
+#define PRJ_PARMS_PARMNUM 5
+#define PRJ_POSITION_PARMNUM 6
+#define PRJ_COMMENT_PARMNUM 11
+#define PRJ_DOCUMENT_PARMNUM 12
+#define PRJ_PRIORITY_PARMNUM 14
+#define PRJ_PROCPARMS_PARMNUM 16
+#define PRJ_DRIVERDATA_PARMNUM 18
+#define PRJ_MAXPARMNUM 18
+
+/*
+ * Bitmap masks for status field of PRJINFO.
+ */
+
+/* 2-7 bits also used in device status */
+
+#define PRJ_QSTATUS 0x0003 /* Bits 0,1 */
+#define PRJ_DEVSTATUS 0x0ffc /* 2-11 bits */
+#define PRJ_COMPLETE 0x0004 /* Bit 2 */
+#define PRJ_INTERV 0x0008 /* Bit 3 */
+#define PRJ_ERROR 0x0010 /* Bit 4 */
+#define PRJ_DESTOFFLINE 0x0020 /* Bit 5 */
+#define PRJ_DESTPAUSED 0x0040 /* Bit 6 */
+#define PRJ_NOTIFY 0x0080 /* Bit 7 */
+#define PRJ_DESTNOPAPER 0x0100 /* Bit 8 */
+#define PRJ_DESTFORMCHG 0x0200 /* BIT 9 */
+#define PRJ_DESTCRTCHG 0x0400 /* BIT 10 */
+#define PRJ_DESTPENCHG 0x0800 /* BIT 11 */
+#define PRJ_DELETED 0x8000 /* Bit 15 */
+
+/*
+ * Values of PRJ_QSTATUS bits in fsStatus field of PRJINFO.
+ */
+
+#define PRJ_QS_QUEUED 0
+#define PRJ_QS_PAUSED 1
+#define PRJ_QS_SPOOLING 2
+#define PRJ_QS_PRINTING 3
+
+/*
+ * Print Job Priority
+ */
+
+#define PRJ_MAX_PRIORITY 99 /* lowest priority */
+#define PRJ_MIN_PRIORITY 1 /* highest priority */
+#define PRJ_NO_PRIORITY 0
+
+
+/*
+ * Bitmap masks for status field of PRDINFO.
+ * see PRJ_... for bits 2-11
+ */
+
+#define PRD_STATUS_MASK 0x0003 /* Bits 0,1 */
+#define PRD_DEVSTATUS 0x0ffc /* 2-11 bits */
+
+/*
+ * Values of PRD_STATUS_MASK bits in fsStatus field of PRDINFO.
+ */
+
+#define PRD_ACTIVE 0
+#define PRD_PAUSED 1
+
+/*
+ * Control codes used in DosPrintDestControl.
+ */
+
+#define PRD_DELETE 0
+#define PRD_PAUSE 1
+#define PRD_CONT 2
+#define PRD_RESTART 3
+
+/*
+ * Values for parmnum in DosPrintDestSetInfo.
+ */
+
+#define PRD_LOGADDR_PARMNUM 3
+#define PRD_COMMENT_PARMNUM 7
+#define PRD_DRIVERS_PARMNUM 8
+#define PRD_TIMEOUT_PARMNUM 10
diff --git a/private/oleauto/tools/win16/os2/inc/pmstddlg.h b/private/oleauto/tools/win16/os2/inc/pmstddlg.h
new file mode 100644
index 000000000..890239b18
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmstddlg.h
@@ -0,0 +1,335 @@
+/**********************************************************************/
+/* */
+/* Module Name: PMSTDDLG.H */
+/* */
+/* OS/2 Presentation Manager Standard Dialog Declarations */
+/* */
+/* ===================================================================*/
+/* The following symbols are used in this file for conditional */
+/* sections: */
+/* */
+/* INCL_WINSTDSPIN - spin button control class */
+/* INCL_WINSTDDRAG - standard drag dll */
+/* */
+/**********************************************************************/
+
+#ifdef INCL_WINSTDDLGS /* enable everything */
+ #define INCL_WINSTDSPIN
+ #define INCL_WINSTDDRAG
+#endif /* INCL_WINSTDDLGS */
+
+
+#ifdef INCL_WINSTDSPIN
+/**********************************************************************/
+/* */
+/* S P I N B U T T O N */
+/* */
+/**********************************************************************/
+
+/**********************************************************************/
+/* SPINBUTTON Creation Flags */
+/**********************************************************************/
+
+/**********************************************************************/
+/* Character Acceptance */
+/**********************************************************************/
+#define SPBS_ALLCHARACTERS 0x00000000L /* Default: All chars accepted */
+#define SPBS_NUMERICONLY 0x00000001L /* Only 0 - 9 accepted & VKeys */
+#define SPBS_READONLY 0x00000002L /* No chars allowed in entryfld*/
+
+/**********************************************************************/
+/* Type of Component */
+/**********************************************************************/
+#define SPBS_MASTER 0x00000010L
+#define SPBS_SERVANT 0x00000000L /* Default: Servant */
+
+/**********************************************************************/
+/* Type of Justification */
+/**********************************************************************/
+#define SPBS_JUSTDEFAULT 0x00000000L /* Default: Same as Left */
+#define SPBS_JUSTLEFT 0x00000008L
+#define SPBS_JUSTRIGHT 0x00000004L
+#define SPBS_JUSTCENTER 0x0000000CL
+
+/**********************************************************************/
+/* Border or not */
+/**********************************************************************/
+#define SPBS_NOBORDER 0x00000020L /* Borderless SpinField */
+ /* Default is to have a border. */
+
+/**********************************************************************/
+/* Fast spin or not */
+/**********************************************************************/
+#define SPBS_FASTSPIN 0x00000100L /* Allow fast spinning. Fast */
+ /* spinning is performed by */
+ /* skipping over numbers */
+
+/**********************************************************************/
+/* Pad numbers on front with 0's */
+/**********************************************************************/
+#define SPBS_PADWITHZEROS 0x00000080L /* Pad the number with zeroes */
+
+/**********************************************************************/
+/* SPINBUTTON Messages */
+/**********************************************************************/
+
+/**********************************************************************/
+/* Notification from Spinbutton to the application is sent in a */
+/* WM_CONTROL message. */
+/**********************************************************************/
+#define SPBN_UPARROW 0x20A /* up arrow button was pressed */
+#define SPBN_DOWNARROW 0x20B /* down arrow button was pressed*/
+#define SPBN_ENDSPIN 0x20C /* mouse button was released */
+#define SPBN_CHANGE 0x20D /* spinfield text has changed */
+#define SPBN_SETFOCUS 0x20E /* spinfield received focus */
+#define SPBN_KILLFOCUS 0x20F /* spinfield lost focus */
+
+/**********************************************************************/
+/* Messages from application to Spinbutton */
+/**********************************************************************/
+#define SPBM_OVERRIDESETLIMITS 0x200 /* Set spinbutton limits without*/
+ /* resetting the current value */
+#define SPBM_QUERYLIMITS 0x201 /* Query limits set by */
+ /* SPBM_SETLIMITS */
+#define SPBM_SETTEXTLIMIT 0x202 /* Max entryfield characters */
+#define SPBM_SPINUP 0x203 /* Tell entry field to spin up */
+#define SPBM_SPINDOWN 0x204 /* Tell entry field to spin down*/
+#define SPBM_QUERYVALUE 0x205 /* Tell entry field to send */
+ /* current value */
+
+/**********************************************************************/
+/* Query Flags */
+/**********************************************************************/
+#define SPBQ_UPDATEIFVALID 0 /* Default */
+#define SPBQ_ALWAYSUPDATE 1
+#define SPBQ_DONOTUPDATE 3
+
+/**********************************************************************/
+/* Return value for Empty Field. */
+/* If ptr too long, variable sent in query msg */
+/**********************************************************************/
+#define SPBM_SETARRAY 0x206 /* Change the data to spin */
+#define SPBM_SETLIMITS 0x207 /* Change the numeric Limits */
+#define SPBM_SETCURRENTVALUE 0x208 /* Change the current value */
+#define SPBM_SETMASTER 0x209 /* Tell entryfield who master is*/
+
+/**********************************************************************/
+/* SPINBUTTON Window Class Definition */
+/**********************************************************************/
+#define WC_SPINBUTTON ((PSZ)0xffff0020L)
+
+#endif /* INCL_WINSTDSPIN */
+
+
+#ifdef INCL_WINSTDDRAG
+/**********************************************************************/
+/* */
+/* D I R E C T M A N I P U L A T I O N */
+/* */
+/**********************************************************************/
+
+#define PMERR_NOT_DRAGGING 0x1f00 /* move to pmerr.h */
+#define PMERR_ALREADY_DRAGGING 0x1f01
+
+#define MSGF_DRAG 0x0010 /* message filter identifier */
+
+#define WM_DRAGFIRST 0x0310
+#define WM_DRAGLAST (WM_DRAGFIRST + 0x001F)
+
+#define DM_DROP (WM_DRAGLAST - 0x0)
+#define DM_DRAGOVER (WM_DRAGLAST - 0x1)
+#define DM_DRAGLEAVE (WM_DRAGLAST - 0x2)
+#define DM_DROPHELP (WM_DRAGLAST - 0x3)
+#define DM_ENDCONVERSATION (WM_DRAGLAST - 0x4)
+#define DM_PRINT (WM_DRAGLAST - 0x5)
+#define DM_RENDER (WM_DRAGLAST - 0x6)
+#define DM_RENDERCOMPLETE (WM_DRAGLAST - 0x7)
+#define DM_RENDERPREPARE (WM_DRAGLAST - 0x8)
+#define DM_DRAGFILECOMPLETE (WM_DRAGLAST - 0x9)
+#define DM_EMPHASIZETARGET (WM_DRAGLAST - 0xA)
+#define DM_DRAGERROR (WM_DRAGLAST - 0xB)
+#define DM_FILERENDERED (WM_DRAGLAST - 0xC)
+#define DM_RENDERFILE (WM_DRAGLAST - 0xD)
+
+#define DRT_ASM "Assembler Code" /* drag type constants */
+#define DRT_BASIC "BASIC Code"
+#define DRT_BINDATA "Binary Data"
+#define DRT_BITMAP "Bitmap"
+#define DRT_C "C Code"
+#define DRT_COBOL "COBOL Code"
+#define DRT_DLL "Dynamic Link Library"
+#define DRT_DOSCMD "DOS Command File"
+#define DRT_EXE "Executable"
+#define DRT_FORTRAN "FORTRAN Code"
+#define DRT_ICON "Icon"
+#define DRT_LIB "Library"
+#define DRT_METAFILE "Metafile"
+#define DRT_OS2CMD "OS/2 Command File"
+#define DRT_PASCAL "Pascal Code"
+#define DRT_RESOURCE "Resource File"
+#define DRT_TEXT "Plain Text"
+#define DRT_UNKNOWN "Unknown"
+
+#define DOR_NODROP 0x0000 /* DM_DRAGOVER response codes */
+#define DOR_DROP 0x0001
+#define DOR_NODROPOP 0x0002
+#define DOR_NEVERDROP 0x0003
+
+#define DO_COPYABLE 0x0001 /* supported operation flags */
+#define DO_MOVEABLE 0x0002
+
+#define DC_OPEN 0x0001 /* source control flags */
+#define DC_REF 0x0002
+#define DC_GROUP 0x0004
+#define DC_CONTAINER 0x0008
+#define DC_PREPARE 0x0010
+#define DC_REMOVEABLEMEDIA 0x0020
+
+#define DO_DEFAULT 0xBFFE /* Default operation */
+#define DO_UNKNOWN 0xBFFF /* Unknown operation */
+#define DO_COPY KC_CTRL
+#define DO_MOVE KC_ALT
+
+#define DMFL_TARGETSUCCESSFUL 0x0001 /* transfer reply flags */
+#define DMFL_TARGETFAIL 0x0002
+#define DMFL_NATIVERENDER 0x0004
+#define DMFL_RENDERRETRY 0x0008
+#define DMFL_RENDEROK 0x0010
+#define DMFL_RENDERFAIL 0x0020
+
+#define DRG_ICON 0x00000001L /* drag image manipulation */
+#define DRG_BITMAP 0x00000002L /* flags */
+#define DRG_POLYGON 0x00000004L
+#define DRG_STRETCH 0x00000008L
+#define DRG_TRANSPARENT 0x00000010L
+#define DRG_CLOSED 0x00000020L
+
+#define DME_IGNOREABORT 1 /* DM_DRAGERROR return values */
+#define DME_IGNORECONTINUE 2
+#define DME_REPLACE 3
+#define DME_RETRY 4
+
+#define DF_MOVE 0x0001 /* DM_DRAGFILECOMPLETE flags */
+#define DF_SOURCE 0x0002
+#define DF_SUCCESSFUL 0x0004
+
+#define DFF_MOVE 1 /* DM_DRAGERROR operation IDs */
+#define DFF_COPY 2
+#define DFF_DELETE 3
+
+
+typedef LHANDLE HSTR; /* hstr */
+
+typedef struct _DRAGITEM { /* ditem */
+ HWND hwndItem; /* conversation partner */
+ ULONG ulItemID; /* identifies item being dragged */
+ HSTR hstrType; /* type of item */
+ HSTR hstrRMF; /* rendering mechanism and format*/
+ HSTR hstrContainerName; /* name of source container */
+ HSTR hstrSourceName; /* name of item at source */
+ HSTR hstrTargetName; /* suggested name of item at dest*/
+ SHORT cxOffset; /* x offset of the origin of the */
+ /* image from the mouse hotspot*/
+ SHORT cyOffset; /* y offset of the origin of the */
+ /* image from the mouse hotspot*/
+ USHORT fsControl; /* source item control flags */
+ USHORT fsSupportedOps; /* ops supported by source */
+} DRAGITEM;
+typedef DRAGITEM FAR *PDRAGITEM;
+
+typedef struct _DRAGINFO { /* dinfo */
+ ULONG cbDraginfo; /* Size of DRAGINFO and DRAGITEMs*/
+ USHORT cbDragitem; /* size of DRAGITEM */
+ USHORT usOperation; /* current drag operation */
+ HWND hwndSource; /* window handle of source */
+ SHORT xDrop; /* x coordinate of drop position */
+ SHORT yDrop; /* y coordinate of drop position */
+ USHORT cditem; /* count of DRAGITEMs */
+ USHORT usReserved; /* reserved for future use */
+} DRAGINFO;
+typedef DRAGINFO FAR *PDRAGINFO;
+
+typedef struct _DRAGIMAGE { /* dimg */
+ USHORT cb; /* size control block */
+ USHORT cptl; /* count of pts, if DRG_POLYGON */
+ LHANDLE hImage; /* image handle passed to DrgDrag*/
+ SIZEL sizlStretch; /* size to strecth ico or bmp to */
+ ULONG fl; /* flags passed to DrgDrag */
+ SHORT cxOffset; /* x offset of the origin of the */
+ /* image from the mouse hotspot*/
+ SHORT cyOffset; /* y offset of the origin of the */
+ /* image from the mouse hotspot*/
+} DRAGIMAGE;
+typedef DRAGIMAGE FAR *PDRAGIMAGE;
+
+typedef struct _DRAGTRANSFER { /* dxfer */
+ ULONG cb; /* size of control block */
+ HWND hwndClient; /* handle of target */
+ PDRAGITEM pditem; /* DRAGITEM being transferred */
+ HSTR hstrSelectedRMF; /* rendering mech & fmt of choice*/
+ HSTR hstrRenderToName; /* name source will use */
+ ULONG ulTargetInfo; /* reserved for target's use */
+ USHORT usOperation; /* operation being performed */
+ USHORT fsReply; /* reply flags */
+} DRAGTRANSFER;
+typedef DRAGTRANSFER FAR *PDRAGTRANSFER;
+
+typedef struct _RENDERFILE { /* rndf */
+ HWND hwndDragFiles; /* conversation window */
+ HSTR hstrSource; /* handle to source file name */
+ HSTR hstrTarget; /* handle to target file name */
+ BOOL fMove; /* TRUE - move, FALSE - copy */
+ USHORT usRsvd; /* reserved */
+} RENDERFILE;
+typedef RENDERFILE FAR *PRENDERFILE;
+
+
+BOOL EXPENTRY DrgAcceptDroppedFiles (HWND hwnd, PSZ pszPath, PSZ pszTypes,
+ USHORT usDefaultOp, USHORT usRsvd);
+BOOL EXPENTRY DrgAccessDraginfo (PDRAGINFO pdinfo);
+HSTR EXPENTRY DrgAddStrHandle (PSZ psz);
+PDRAGINFO EXPENTRY DrgAllocDraginfo (USHORT cditem);
+PDRAGTRANSFER EXPENTRY DrgAllocDragtransfer (USHORT cdxfer);
+BOOL EXPENTRY DrgDeleteDraginfoStrHandles (PDRAGINFO pdinfo);
+BOOL EXPENTRY DrgDeleteStrHandle (HSTR hstr);
+HWND EXPENTRY DrgDrag (HWND hwndSource, PDRAGINFO pdinfo, PDRAGIMAGE pdimg,
+ USHORT cdimg, SHORT vkTerminate, PVOID pRsvd);
+BOOL EXPENTRY DrgDragFiles (HWND hwnd, PSZ FAR *apszFiles, PSZ FAR *apszTypes,
+ PSZ FAR *apszTargets, USHORT cFiles,
+ HPOINTER hptrDrag, USHORT vkTerm,
+ BOOL fSourceRender, ULONG ulRsvd);
+BOOL EXPENTRY DrgFreeDraginfo (PDRAGINFO pdinfo);
+BOOL EXPENTRY DrgFreeDragtransfer (PDRAGTRANSFER pdxfer);
+HPS EXPENTRY DrgGetPS (HWND hwnd);
+BOOL EXPENTRY DrgPostTransferMsg (HWND hwnd, USHORT msg, PDRAGTRANSFER pdxfer,
+ USHORT fs, USHORT usRsvd, BOOL fRetry);
+BOOL EXPENTRY DrgPushDraginfo (PDRAGINFO pdinfo, HWND hwndDest);
+BOOL EXPENTRY DrgQueryDragitem (PDRAGINFO pdinfo, USHORT cbBuffer,
+ PDRAGITEM pditem, USHORT iItem);
+USHORT EXPENTRY DrgQueryDragitemCount (PDRAGINFO pdinfo);
+PDRAGITEM EXPENTRY DrgQueryDragitemPtr (PDRAGINFO pdinfo, USHORT i);
+BOOL EXPENTRY DrgQueryNativeRMF (PDRAGITEM pditem,
+ USHORT cbBuffer, PCHAR pBuffer);
+USHORT EXPENTRY DrgQueryNativeRMFLen (PDRAGITEM pditem);
+USHORT EXPENTRY DrgQueryStrName (HSTR hstr, USHORT cbBuffer, PSZ pBuffer);
+USHORT EXPENTRY DrgQueryStrNameLen (HSTR hstr);
+BOOL EXPENTRY DrgQueryTrueType (PDRAGITEM pditem, USHORT cbBuffer, PSZ pBuffer);
+USHORT EXPENTRY DrgQueryTrueTypeLen (PDRAGITEM pditem);
+BOOL EXPENTRY DrgReleasePS (HPS hps);
+MRESULT EXPENTRY DrgSendTransferMsg (HWND hwnd, USHORT msg,
+ MPARAM mp1, MPARAM mp2);
+BOOL EXPENTRY DrgSetDragitem (PDRAGINFO pdinfo, PDRAGITEM pditem,
+ USHORT cbBuffer, USHORT iItem);
+BOOL EXPENTRY DrgSetDragPointer (PDRAGINFO pdinfo, HPOINTER hptr);
+BOOL EXPENTRY DrgSetDragImage (PDRAGINFO pdinfo, PDRAGIMAGE pdimg,
+ USHORT cdimg, PVOID pRsvd);
+BOOL EXPENTRY DrgVerifyNativeRMF (PDRAGITEM pditem, PSZ pszRMF);
+BOOL EXPENTRY DrgVerifyRMF (PDRAGITEM pditem, PSZ pszMech, PSZ pszFmt);
+BOOL EXPENTRY DrgVerifyTrueType (PDRAGITEM pditem, PSZ pszType);
+BOOL EXPENTRY DrgVerifyType (PDRAGITEM pditem, PSZ pszType);
+BOOL EXPENTRY DrgVerifyTypeSet (PDRAGITEM pditem, PSZ pszType, USHORT cbMatch,
+ PSZ pszMatch);
+
+#endif /* INCL_WINSTDDRAG */
+
+
diff --git a/private/oleauto/tools/win16/os2/inc/pmtypes.h b/private/oleauto/tools/win16/os2/inc/pmtypes.h
new file mode 100644
index 000000000..7278c6e88
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmtypes.h
@@ -0,0 +1,264 @@
+/***************************************************************************\
+*
+* Module Name: PMTYPES.H
+*
+* OS/2 Presentation Manager Datatypes include file
+*
+* This is conditionally included from PMWIN.H
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+*****************************************************************************/
+
+#define DTYP_USER ((SHORT)16384)
+
+#define DTYP_CTL_ARRAY ((SHORT)1)
+#define DTYP_CTL_PARRAY ((SHORT)(-1))
+#define DTYP_CTL_OFFSET ((SHORT)2)
+#define DTYP_CTL_LENGTH ((SHORT)3)
+
+
+/**********************************************************************/
+/* Ordinary datatypes */
+/**********************************************************************/
+
+#define DTYP_ACCEL ((SHORT)28)
+#define DTYP_ACCELTABLE ((SHORT)29)
+#define DTYP_ARCPARAMS ((SHORT)38)
+#define DTYP_AREABUNDLE ((SHORT)139)
+#define DTYP_ATOM ((SHORT)90)
+#define DTYP_BITMAPINFO ((SHORT)60)
+#define DTYP_BITMAPINFOHEADER ((SHORT)61)
+#define DTYP_BIT16 ((SHORT)20)
+#define DTYP_BIT32 ((SHORT)21)
+#define DTYP_BIT8 ((SHORT)19)
+#define DTYP_BOOL ((SHORT)18)
+#define DTYP_BTNCDATA ((SHORT)35)
+#define DTYP_BYTE ((SHORT)13)
+#define DTYP_CATCHBUF ((SHORT)141)
+#define DTYP_CHAR ((SHORT)15)
+#define DTYP_CHARBUNDLE ((SHORT)135)
+#define DTYP_CLASSINFO ((SHORT)95)
+#define DTYP_COUNT2 ((SHORT)93)
+#define DTYP_COUNT2B ((SHORT)70)
+#define DTYP_COUNT2CH ((SHORT)82)
+#define DTYP_COUNT4 ((SHORT)152)
+#define DTYP_COUNT4B ((SHORT)42)
+#define DTYP_CPID ((SHORT)57)
+#define DTYP_CREATESTRUCT ((SHORT)98)
+#define DTYP_CURSORINFO ((SHORT)34)
+#define DTYP_DEVOPENSTRUC ((SHORT)124)
+#define DTYP_DLGTEMPLATE ((SHORT)96)
+#define DTYP_DLGTITEM ((SHORT)97)
+#define DTYP_ENTRYFDATA ((SHORT)127)
+#define DTYP_ERRORID ((SHORT)45)
+#define DTYP_FATTRS ((SHORT)75)
+#define DTYP_FFDESCS ((SHORT)142)
+#define DTYP_FIXED ((SHORT)99)
+#define DTYP_FONTMETRICS ((SHORT)74)
+#define DTYP_FRAMECDATA ((SHORT)144)
+#define DTYP_GRADIENTL ((SHORT)48)
+#define DTYP_HAB ((SHORT)10)
+#define DTYP_HACCEL ((SHORT)30)
+#define DTYP_HAPP ((SHORT)146)
+#define DTYP_HATOMTBL ((SHORT)91)
+#define DTYP_HBITMAP ((SHORT)62)
+#define DTYP_HCINFO ((SHORT)46)
+#define DTYP_HDC ((SHORT)132)
+#define DTYP_HENUM ((SHORT)117)
+#define DTYP_HHEAP ((SHORT)109)
+#define DTYP_HINI ((SHORT)53)
+#define DTYP_HLIB ((SHORT)147)
+#define DTYP_HMF ((SHORT)85)
+#define DTYP_HMQ ((SHORT)86)
+#define DTYP_HPOINTER ((SHORT)106)
+#define DTYP_HPROGRAM ((SHORT)131)
+#define DTYP_HPS ((SHORT)12)
+#define DTYP_HRGN ((SHORT)116)
+#define DTYP_HSEM ((SHORT)140)
+#define DTYP_HSPL ((SHORT)32)
+#define DTYP_HSWITCH ((SHORT)66)
+#define DTYP_HVPS ((SHORT)58)
+#define DTYP_HWND ((SHORT)11)
+#define DTYP_IDENTITY ((SHORT)133)
+#define DTYP_IDENTITY4 ((SHORT)169)
+#define DTYP_IMAGEBUNDLE ((SHORT)136)
+#define DTYP_INDEX2 ((SHORT)81)
+#define DTYP_IPT ((SHORT)155)
+#define DTYP_KERNINGPAIRS ((SHORT)118)
+#define DTYP_LENGTH2 ((SHORT)68)
+#define DTYP_LENGTH4 ((SHORT)69)
+#define DTYP_LINEBUNDLE ((SHORT)137)
+#define DTYP_LONG ((SHORT)25)
+#define DTYP_MARKERBUNDLE ((SHORT)138)
+#define DTYP_MATRIXLF ((SHORT)113)
+#define DTYP_MLECTLDATA ((SHORT)161)
+#define DTYP_MLEMARGSTRUCT ((SHORT)157)
+#define DTYP_MLEOVERFLOW ((SHORT)158)
+#define DTYP_OFFSET2B ((SHORT)112)
+#define DTYP_OWNERITEM ((SHORT)154)
+#define DTYP_PID ((SHORT)92)
+#define DTYP_PIX ((SHORT)156)
+#define DTYP_POINTERINFO ((SHORT)105)
+#define DTYP_POINTL ((SHORT)77)
+#define DTYP_PROGCATEGORY ((SHORT)129)
+#define DTYP_PROGRAMENTRY ((SHORT)128)
+#define DTYP_PROGTYPE ((SHORT)130)
+#define DTYP_PROPERTY2 ((SHORT)88)
+#define DTYP_PROPERTY4 ((SHORT)89)
+#define DTYP_QMSG ((SHORT)87)
+#define DTYP_RECTL ((SHORT)121)
+#define DTYP_RESID ((SHORT)125)
+#define DTYP_RGB ((SHORT)111)
+#define DTYP_RGNRECT ((SHORT)115)
+#define DTYP_SBCDATA ((SHORT)159)
+#define DTYP_SEGOFF ((SHORT)126)
+#define DTYP_SHORT ((SHORT)23)
+#define DTYP_SIZEF ((SHORT)101)
+#define DTYP_SIZEL ((SHORT)102)
+#define DTYP_STRL ((SHORT)17)
+#define DTYP_STR16 ((SHORT)40)
+#define DTYP_STR32 ((SHORT)37)
+#define DTYP_STR64 ((SHORT)47)
+#define DTYP_STR8 ((SHORT)33)
+#define DTYP_SWBLOCK ((SHORT)63)
+#define DTYP_SWCNTRL ((SHORT)64)
+#define DTYP_SWENTRY ((SHORT)65)
+#define DTYP_SWP ((SHORT)31)
+#define DTYP_TID ((SHORT)104)
+#define DTYP_TIME ((SHORT)107)
+#define DTYP_TRACKINFO ((SHORT)73)
+#define DTYP_UCHAR ((SHORT)22)
+#define DTYP_ULONG ((SHORT)26)
+#define DTYP_USERBUTTON ((SHORT)36)
+#define DTYP_USHORT ((SHORT)24)
+#define DTYP_WIDTH4 ((SHORT)108)
+#define DTYP_WNDPARAMS ((SHORT)83)
+#define DTYP_WNDPROC ((SHORT)84)
+#define DTYP_WPOINT ((SHORT)59)
+#define DTYP_WRECT ((SHORT)55)
+#define DTYP_XYWINSIZE ((SHORT)52)
+
+
+/**********************************************************************/
+/* Pointer datatypes */
+/**********************************************************************/
+
+#define DTYP_PACCEL ((SHORT)(-28))
+#define DTYP_PACCELTABLE ((SHORT)(-29))
+#define DTYP_PARCPARAMS ((SHORT)(-38))
+#define DTYP_PAREABUNDLE ((SHORT)(-139))
+#define DTYP_PATOM ((SHORT)(-90))
+#define DTYP_PBITMAPINFO ((SHORT)(-60))
+#define DTYP_PBITMAPINFOHEADER ((SHORT)(-61))
+#define DTYP_PBIT16 ((SHORT)(-20))
+#define DTYP_PBIT32 ((SHORT)(-21))
+#define DTYP_PBIT8 ((SHORT)(-19))
+#define DTYP_PBOOL ((SHORT)(-18))
+#define DTYP_PBTNCDATA ((SHORT)(-35))
+#define DTYP_PBYTE ((SHORT)(-13))
+#define DTYP_PCATCHBUF ((SHORT)(-141))
+#define DTYP_PCHAR ((SHORT)(-15))
+#define DTYP_PCHARBUNDLE ((SHORT)(-135))
+#define DTYP_PCLASSINFO ((SHORT)(-95))
+#define DTYP_PCOUNT2 ((SHORT)(-93))
+#define DTYP_PCOUNT2B ((SHORT)(-70))
+#define DTYP_PCOUNT2CH ((SHORT)(-82))
+#define DTYP_PCOUNT4 ((SHORT)(-152))
+#define DTYP_PCOUNT4B ((SHORT)(-42))
+#define DTYP_PCPID ((SHORT)(-57))
+#define DTYP_PCREATESTRUCT ((SHORT)(-98))
+#define DTYP_PCURSORINFO ((SHORT)(-34))
+#define DTYP_PDEVOPENSTRUC ((SHORT)(-124))
+#define DTYP_PDLGTEMPLATE ((SHORT)(-96))
+#define DTYP_PDLGTITEM ((SHORT)(-97))
+#define DTYP_PENTRYFDATA ((SHORT)(-127))
+#define DTYP_PERRORID ((SHORT)(-45))
+#define DTYP_PFATTRS ((SHORT)(-75))
+#define DTYP_PFFDESCS ((SHORT)(-142))
+#define DTYP_PFIXED ((SHORT)(-99))
+#define DTYP_PFONTMETRICS ((SHORT)(-74))
+#define DTYP_PFRAMECDATA ((SHORT)(-144))
+#define DTYP_PGRADIENTL ((SHORT)(-48))
+#define DTYP_PHAB ((SHORT)(-10))
+#define DTYP_PHACCEL ((SHORT)(-30))
+#define DTYP_PHAPP ((SHORT)(-146))
+#define DTYP_PHATOMTBL ((SHORT)(-91))
+#define DTYP_PHBITMAP ((SHORT)(-62))
+#define DTYP_PHCINFO ((SHORT)(-46))
+#define DTYP_PHDC ((SHORT)(-132))
+#define DTYP_PHENUM ((SHORT)(-117))
+#define DTYP_PHHEAP ((SHORT)(-109))
+#define DTYP_PHINI ((SHORT)(-53))
+#define DTYP_PHLIB ((SHORT)(-147))
+#define DTYP_PHMF ((SHORT)(-85))
+#define DTYP_PHMQ ((SHORT)(-86))
+#define DTYP_PHPOINTER ((SHORT)(-106))
+#define DTYP_PHPROGRAM ((SHORT)(-131))
+#define DTYP_PHPS ((SHORT)(-12))
+#define DTYP_PHRGN ((SHORT)(-116))
+#define DTYP_PHSEM ((SHORT)(-140))
+#define DTYP_PHSPL ((SHORT)(-32))
+#define DTYP_PHSWITCH ((SHORT)(-66))
+#define DTYP_PHVPS ((SHORT)(-58))
+#define DTYP_PHWND ((SHORT)(-11))
+#define DTYP_PIDENTITY ((SHORT)(-133))
+#define DTYP_PIDENTITY4 ((SHORT)(-169))
+#define DTYP_PIMAGEBUNDLE ((SHORT)(-136))
+#define DTYP_PINDEX2 ((SHORT)(-81))
+#define DTYP_PIPT ((SHORT)(-155))
+#define DTYP_PKERNINGPAIRS ((SHORT)(-118))
+#define DTYP_PLENGTH2 ((SHORT)(-68))
+#define DTYP_PLENGTH4 ((SHORT)(-69))
+#define DTYP_PLINEBUNDLE ((SHORT)(-137))
+#define DTYP_PLONG ((SHORT)(-25))
+#define DTYP_PMARKERBUNDLE ((SHORT)(-138))
+#define DTYP_PMATRIXLF ((SHORT)(-113))
+#define DTYP_PMLECTLDATA ((SHORT)(-161))
+#define DTYP_PMLEMARGSTRUCT ((SHORT)(-157))
+#define DTYP_PMLEOVERFLOW ((SHORT)(-158))
+#define DTYP_POFFSET2B ((SHORT)(-112))
+#define DTYP_POWNERITEM ((SHORT)(-154))
+#define DTYP_PPID ((SHORT)(-92))
+#define DTYP_PPIX ((SHORT)(-156))
+#define DTYP_PPOINTERINFO ((SHORT)(-105))
+#define DTYP_PPOINTL ((SHORT)(-77))
+#define DTYP_PPROGCATEGORY ((SHORT)(-129))
+#define DTYP_PPROGRAMENTRY ((SHORT)(-128))
+#define DTYP_PPROGTYPE ((SHORT)(-130))
+#define DTYP_PPROPERTY2 ((SHORT)(-88))
+#define DTYP_PPROPERTY4 ((SHORT)(-89))
+#define DTYP_PQMSG ((SHORT)(-87))
+#define DTYP_PRECTL ((SHORT)(-121))
+#define DTYP_PRESID ((SHORT)(-125))
+#define DTYP_PRGB ((SHORT)(-111))
+#define DTYP_PRGNRECT ((SHORT)(-115))
+#define DTYP_PSBCDATA ((SHORT)(-159))
+#define DTYP_PSEGOFF ((SHORT)(-126))
+#define DTYP_PSHORT ((SHORT)(-23))
+#define DTYP_PSIZEF ((SHORT)(-101))
+#define DTYP_PSIZEL ((SHORT)(-102))
+#define DTYP_PSTRL ((SHORT)(-17))
+#define DTYP_PSTR16 ((SHORT)(-40))
+#define DTYP_PSTR32 ((SHORT)(-37))
+#define DTYP_PSTR64 ((SHORT)(-47))
+#define DTYP_PSTR8 ((SHORT)(-33))
+#define DTYP_PSWBLOCK ((SHORT)(-63))
+#define DTYP_PSWCNTRL ((SHORT)(-64))
+#define DTYP_PSWENTRY ((SHORT)(-65))
+#define DTYP_PSWP ((SHORT)(-31))
+#define DTYP_PTID ((SHORT)(-104))
+#define DTYP_PTIME ((SHORT)(-107))
+#define DTYP_PTRACKINFO ((SHORT)(-73))
+#define DTYP_PUCHAR ((SHORT)(-22))
+#define DTYP_PULONG ((SHORT)(-26))
+#define DTYP_PUSERBUTTON ((SHORT)(-36))
+#define DTYP_PUSHORT ((SHORT)(-24))
+#define DTYP_PWIDTH4 ((SHORT)(-108))
+#define DTYP_PWNDPARAMS ((SHORT)(-83))
+#define DTYP_PWNDPROC ((SHORT)(-84))
+#define DTYP_PWPOINT ((SHORT)(-59))
+#define DTYP_PWRECT ((SHORT)(-55))
+#define DTYP_PXYWINSIZE ((SHORT)(-52))
+
diff --git a/private/oleauto/tools/win16/os2/inc/pmwin.h b/private/oleauto/tools/win16/os2/inc/pmwin.h
new file mode 100644
index 000000000..b7b1365b3
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/pmwin.h
@@ -0,0 +1,2980 @@
+/*static char *SCCSID = "@(#)pmwin.h 13.1 91/01/16";*/
+/***************************************************************************\
+*
+* Module Name: PMWIN.H
+*
+* OS/2 Presentation Manager Window Manager include file
+*
+* Copyright (c) International Business Machines Corporation 1981, 1988, 1989
+* Copyright (c) Microsoft Corporation 1981, 1988, 1989
+*
+* =======================================================================
+*
+* The folowing symbols are used in this file for conditional sections.
+*
+* If INCL_WIN is defined, all subcomponents are included.
+*
+* Subcomponents marked with "+" are partially included by default:
+*
+* #define: To include:
+*
+* + INCL_WINWINDOWMGR General window management
+* + INCL_WINMESSAGEMGR Message management
+* + INCL_WININPUT Mouse and keyboard input
+* + INCL_WINDIALOGS Dialog boxes
+* + INCL_WINSTATICS Static controls
+* + INCL_WINBUTTONS Button controls
+* + INCL_WINENTRYFIELDS Entry Fields
+* INCL_WINMLE Multiple Line Entry Fields
+* + INCL_WINLISTBOXES List box controls
+* + INCL_WINMENUS Menu controls
+* + INCL_WINSCROLLBARS Scroll bar controls
+* + INCL_WINFRAMEMGR Frame manager
+* INCL_WINFRAMECTLS Frame controls (title bars & size border)
+* INCL_WINRECTANGLES Rectangle routines
+* INCL_WINSYS System values (and colors)
+* INCL_WINTIMER Timer routines
+* + INCL_WINACCELERATORS Keyboard accelerators
+* INCL_WINTRACKRECT WinTrackRect() function
+* INCL_WINCLIPBOARD Clipboard manager
+* + INCL_WINCURSORS Text cursors
+* + INCL_WINPOINTERS Mouse pointers
+* INCL_WINHOOKS Hook manager
+* + INCL_WINSWITCHLIST Shell Switch List API
+* INCL_WINPROGRAMLIST Shell Program List API
+* INCL_WINSHELLDATA Shell Data (?)
+* INCL_WINCOUNTRY Country support
+* INCL_WINHEAP Heap Manager
+* INCL_WINATOM Atom Manager
+* INCL_WINCATCHTHROW WinCatch/WinThrow support
+* INCL_WINERRORS Error code definitions
+* INCL_NLS DBCS window manager definition
+* + INCL_WINHELP Help Manager definitions
+* INCL_WINSEI Set Error Info API
+* INCL_WINLOAD Load/Delete Library/Procedure
+* INCL_WINTYPES Definitions for Datatypes
+*
+\***************************************************************************/
+
+#define INCL_WININCLUDED
+
+
+#ifdef INCL_WIN
+
+#define INCL_WINWINDOWMGR
+#define INCL_WINMESSAGEMGR
+#define INCL_WININPUT
+#define INCL_WINDIALOGS
+#define INCL_WINSTATICS
+#define INCL_WINBUTTONS
+#define INCL_WINENTRYFIELDS
+#define INCL_WINMLE
+#define INCL_WINLISTBOXES
+#define INCL_WINMENUS
+#define INCL_WINSCROLLBARS
+#define INCL_WINFRAMEMGR
+#define INCL_WINFRAMECTLS
+#define INCL_WINRECTANGLES
+#define INCL_WINSYS
+#define INCL_WINTIMER
+#define INCL_WINACCELERATORS
+#define INCL_WINTRACKRECT
+#define INCL_WINCLIPBOARD
+#define INCL_WINCURSORS
+#define INCL_WINPOINTERS
+#define INCL_WINHOOKS
+#define INCL_WINSWITCHLIST
+#define INCL_WINPROGRAMLIST
+#define INCL_WINSHELLDATA
+#define INCL_WINCOUNTRY
+#define INCL_WINHEAP
+#define INCL_WINATOM
+#define INCL_WINCATCHTHROW
+#define INCL_WINERRORS
+#define INCL_WINDDE
+#define INCL_WINHELP
+#define INCL_WINSEI
+#define INCL_WINLOAD
+#define INCL_WINTYPES
+
+#else /* INCL_WIN */
+
+#ifdef RC_INVOKED
+#define INCL_WININPUT
+#define INCL_WINDIALOGS
+#define INCL_WINSTATICS
+#define INCL_WINBUTTONS
+#define INCL_WINENTRYFIELDS
+#define INCL_WINLISTBOXES
+#define INCL_WINMENUS
+#define INCL_WINSCROLLBARS
+#define INCL_WINFRAMEMGR
+#define INCL_WINFRAMECTLS
+#define INCL_WINACCELERATORS
+#define INCL_WINPOINTERS
+#define INCL_WINMESSAGEMGR
+#define INCL_WINMLE
+#define INCL_WINHELP
+#endif /* RC_INVOKED */
+
+#endif /* INCL_WIN */
+
+/* ensure standard entry field defintions if MLE is defined */
+#ifdef INCL_WINMLE
+#ifndef INCL_WINENTRYFIELDS
+#define INCL_WINENTRYFIELDS
+#endif /* INCL_WINENTRYFIELDS */
+#endif /* INCL_WINMLE */
+
+/* INCL_WINCOMMON compatability */
+#ifdef INCL_WINCOMMON
+#define INCL_WINWINDOWMGR
+#endif /* INCL_WINCOMMON */
+
+#ifdef INCL_ERRORS
+#define INCL_WINERRORS
+#endif /* INCL_ERRORS */
+
+/***************************************************************************/
+/*** General Window Management types, constants and macros ***/
+
+typedef VOID FAR *MPARAM; /* mp */
+typedef MPARAM FAR *PMPARAM; /* pmp */
+typedef VOID FAR *MRESULT; /* mres */
+typedef MRESULT FAR *PMRESULT; /* pmres */
+
+/* Macros to make an MPARAM from standard types. */
+#define MPFROMP(p) ((MPARAM)(VOID FAR *)(p))
+#define MPFROMHWND(hwnd) ((MPARAM)(HWND)(hwnd))
+#define MPFROMCHAR(ch) ((MPARAM)(USHORT)(ch))
+#define MPFROMSHORT(s) ((MPARAM)(USHORT)(s))
+#define MPFROM2SHORT(s1, s2) ((MPARAM)MAKELONG(s1, s2))
+#define MPFROMSH2CH(s, uch1, uch2) ((MPARAM)MAKELONG(s, MAKESHORT(uch1, uch2)))
+#define MPFROMLONG(l) ((MPARAM)(ULONG)(l))
+
+/* Macros to extract standard types from an MPARAM */
+#define PVOIDFROMMP(mp) ((VOID FAR *)(mp))
+#define HWNDFROMMP(mp) ((HWND)(mp))
+#define CHAR1FROMMP(mp) ((UCHAR)(mp))
+#define CHAR2FROMMP(mp) ((UCHAR)((ULONG)mp >> 8))
+#define CHAR3FROMMP(mp) ((UCHAR)((ULONG)mp >> 16))
+#define CHAR4FROMMP(mp) ((UCHAR)((ULONG)mp >> 24))
+#define SHORT1FROMMP(mp) ((USHORT)(ULONG)(mp))
+#define SHORT2FROMMP(mp) ((USHORT)((ULONG)mp >> 16))
+#define LONGFROMMP(mp) ((ULONG)(mp))
+
+/* Macros to make an MRESULT from standard types. */
+#define MRFROMP(p) ((MRESULT)(VOID FAR *)(p))
+#define MRFROMSHORT(s) ((MRESULT)(USHORT)(s))
+#define MRFROM2SHORT(s1, s2) ((MRESULT)MAKELONG(s1, s2))
+#define MRFROMLONG(l) ((MRESULT)(ULONG)(l))
+
+/* Macros to extract standard types from an MRESULT */
+#define PVOIDFROMMR(mr) ((VOID FAR *)(mr))
+#define SHORT1FROMMR(mr) ((USHORT)((ULONG)mr))
+#define SHORT2FROMMR(mr) ((USHORT)((ULONG)mr >> 16))
+#define LONGFROMMR(mr) ((ULONG)(mr))
+
+typedef MRESULT (PASCAL FAR *PFNWP)(HWND, USHORT, MPARAM, MPARAM);
+
+#ifndef INCL_SAADEFS
+#define HWND_DESKTOP (HWND)1
+#define HWND_OBJECT (HWND)2
+#endif /* !INCL_SAADEFS */
+
+#define HWND_TOP (HWND)3
+#define HWND_BOTTOM (HWND)4
+
+#ifndef INCL_SAADEFS
+#define HWND_THREADCAPTURE (HWND)5
+#endif /* !INCL_SAADEFS */
+
+
+/* Standard Window Styles */
+
+#define WS_VISIBLE 0x80000000L
+#define WS_DISABLED 0x40000000L
+#define WS_CLIPCHILDREN 0x20000000L
+#define WS_CLIPSIBLINGS 0x10000000L
+#define WS_PARENTCLIP 0x08000000L
+#define WS_SAVEBITS 0x04000000L
+#define WS_SYNCPAINT 0x02000000L
+#define WS_MINIMIZED 0x01000000L
+#define WS_MAXIMIZED 0x00800000L
+
+/* Dialog manager styles */
+
+#define WS_GROUP 0x00010000L
+#define WS_TABSTOP 0x00020000L
+#define WS_MULTISELECT 0x00040000L
+
+
+/* Class styles */
+
+#define CS_MOVENOTIFY 0x00000001L
+#define CS_SIZEREDRAW 0x00000004L
+#define CS_HITTEST 0x00000008L
+#define CS_PUBLIC 0x00000010L
+#define CS_FRAME 0x00000020L
+#define CS_CLIPCHILDREN 0x20000000L
+#define CS_CLIPSIBLINGS 0x10000000L
+#define CS_PARENTCLIP 0x08000000L
+#define CS_SAVEBITS 0x04000000L
+#define CS_SYNCPAINT 0x02000000L
+
+/***************************************************************************/
+/**** Window Manager Subsection part 1 ****/
+#if (defined(INCL_WINWINDOWMGR) || !defined(INCL_NOCOMMON))
+
+BOOL APIENTRY WinRegisterClass(HAB hab, PSZ pszClassName, PFNWP pfnWndProc,
+ ULONG flStyle, USHORT cbWindowData);
+
+MRESULT APIENTRY WinDefWindowProc(HWND hwnd, USHORT msg, MPARAM mp1,
+ MPARAM mp2);
+BOOL APIENTRY WinDestroyWindow(HWND hwnd);
+BOOL APIENTRY WinShowWindow(HWND hwnd, BOOL fShow);
+BOOL APIENTRY WinQueryWindowRect(HWND hwnd, PRECTL prclDest);
+
+HPS APIENTRY WinGetPS(HWND hwnd);
+BOOL APIENTRY WinReleasePS(HPS hps);
+BOOL APIENTRY WinEndPaint(HPS hps);
+#ifndef INCL_SAADEFS
+HPS APIENTRY WinGetClipPS(HWND hwnd, HWND hwndClip, USHORT fs);
+BOOL APIENTRY WinIsWindowShowing(HWND hwnd);
+#endif /* !INCL_SAADEFS */
+
+HPS APIENTRY WinBeginPaint(HWND hwnd, HPS hps, PRECTL prclPaint);
+HDC APIENTRY WinOpenWindowDC(HWND hwnd);
+
+SHORT APIENTRY WinScrollWindow(HWND hwnd, SHORT dx, SHORT dy,
+ PRECTL prclScroll, PRECTL prclClip,
+ HRGN hrgnUpdate, PRECTL prclUpdate,
+ USHORT rgfsw);
+
+/* WinGetClipPS() flags */
+
+#ifndef INCL_SAADEFS
+#define PSF_LOCKWINDOWUPDATE 0x0001
+#define PSF_CLIPUPWARDS 0x0002
+#define PSF_CLIPDOWNWARDS 0x0004
+#define PSF_CLIPSIBLINGS 0x0008
+#define PSF_CLIPCHILDREN 0x0010
+#define PSF_PARENTCLIP 0x0020
+
+#endif /* !INCL_SAADEFS */
+
+/* WinScrollWindow() flags */
+
+#define SW_SCROLLCHILDREN 0x0001
+#define SW_INVALIDATERGN 0x0002
+
+BOOL APIENTRY WinFillRect(HPS hps, PRECTL prcl, LONG lColor);
+
+/* WinInitialize/WinTerminate Interface declarations */
+
+typedef struct _QVERSDATA { /* qver */
+ USHORT environment;
+ USHORT version;
+} QVERSDATA;
+typedef QVERSDATA FAR *PQVERSDATA;
+
+#define QV_OS2 0x0000
+#define QV_CMS 0x0001
+#define QV_TSO 0x0002
+#define QV_TSOBATCH 0x0003
+#define QV_OS400 0x0004
+
+
+ULONG APIENTRY WinQueryVersion(HAB hab);
+HAB APIENTRY WinInitialize(USHORT);
+BOOL APIENTRY WinTerminate(HAB hab);
+
+HAB APIENTRY WinQueryAnchorBlock(HWND hwnd);
+
+#endif /* INCL_WINWINDOWMGR | !INCL_NOCOMMON */
+/****************** End of Window Manager COMMON section ******************/
+
+
+HWND APIENTRY WinCreateWindow(HWND hwndParent, PSZ pszClass, PSZ pszName,
+ ULONG flStyle, SHORT x, SHORT y, SHORT cx,
+ SHORT cy, HWND hwndOwner,
+ HWND hwndInsertBehind, USHORT id,
+ PVOID pCtlData, PVOID pPresParams);
+BOOL APIENTRY WinEnableWindow(HWND hwnd, BOOL fEnable);
+BOOL APIENTRY WinIsWindowEnabled(HWND hwnd);
+BOOL APIENTRY WinEnableWindowUpdate(HWND hwnd, BOOL fEnable);
+BOOL APIENTRY WinIsWindowVisible(HWND hwnd);
+SHORT APIENTRY WinQueryWindowText(HWND hwnd, SHORT cchBufferMax,
+ PCH pchBuffer);
+BOOL APIENTRY WinSetWindowText(HWND hwnd, PSZ pszText);
+SHORT APIENTRY WinQueryWindowTextLength(HWND hwnd);
+HWND APIENTRY WinWindowFromID(HWND hwndParent, USHORT id);
+
+BOOL APIENTRY WinIsWindow(HAB hab, HWND hwnd);
+HWND APIENTRY WinQueryWindow(HWND hwnd, SHORT cmd, BOOL fLock);
+SHORT APIENTRY WinMultWindowFromIDs(HWND hwndParent, PHWND prghwnd,
+ USHORT idFirst, USHORT idLast);
+
+/* WinQueryWindow() codes */
+
+#define QW_NEXT 0
+#define QW_PREV 1
+#define QW_TOP 2
+#define QW_BOTTOM 3
+#define QW_OWNER 4
+#define QW_PARENT 5
+#define QW_NEXTTOP 6
+#define QW_PREVTOP 7
+#define QW_FRAMEOWNER 8
+
+
+BOOL APIENTRY WinSetParent(HWND hwnd, HWND hwndNewParent, BOOL fRedraw);
+
+BOOL APIENTRY WinIsChild(HWND hwnd, HWND hwndParent);
+BOOL APIENTRY WinSetOwner(HWND hwnd, HWND hwndNewOwner);
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinQueryWindowProcess(HWND hwnd, PPID ppid, PTID ptid);
+#endif /* !INCL_SAADEFS */
+
+HWND APIENTRY WinQueryObjectWindow(HWND hwndDesktop);
+HWND APIENTRY WinQueryDesktopWindow(HAB hab, HDC hdc);
+
+/*** Window positioning functions */
+
+/* WinSetMultWindowPos() structure */
+
+typedef struct _SWP { /* swp */
+ USHORT fs;
+ SHORT cy;
+ SHORT cx;
+ SHORT y;
+ SHORT x;
+ HWND hwndInsertBehind;
+ HWND hwnd;
+} SWP;
+typedef SWP FAR *PSWP;
+
+BOOL APIENTRY WinSetWindowPos(HWND hwnd, HWND hwndInsertBehind, SHORT x,
+ SHORT y, SHORT cx, SHORT cy, USHORT fs);
+BOOL APIENTRY WinQueryWindowPos(HWND hwnd, PSWP pswp);
+BOOL APIENTRY WinSetMultWindowPos(HAB hab, PSWP pswp, USHORT cswp);
+
+/* Values returned from WM_ADJUSTWINDOWPOS and passed to WM_WINDOWPOSCHANGED */
+
+#define AWP_MINIMIZED 0x00010000L
+#define AWP_MAXIMIZED 0x00020000L
+#define AWP_RESTORED 0x00040000L
+#define AWP_ACTIVATE 0x00080000L
+#define AWP_DEACTIVATE 0x00100000L
+
+/* WinSetWindowPos() flags */
+
+#define SWP_SIZE 0x0001
+#define SWP_MOVE 0x0002
+#define SWP_ZORDER 0x0004
+#define SWP_SHOW 0x0008
+#define SWP_HIDE 0x0010
+#define SWP_NOREDRAW 0x0020
+#define SWP_NOADJUST 0x0040
+#define SWP_ACTIVATE 0x0080
+#define SWP_DEACTIVATE 0x0100
+#define SWP_EXTSTATECHANGE 0x0200
+#define SWP_MINIMIZE 0x0400
+#define SWP_MAXIMIZE 0x0800
+#define SWP_RESTORE 0x1000
+#define SWP_FOCUSACTIVATE 0x2000
+#define SWP_FOCUSDEACTIVATE 0x4000
+
+/* Window painting */
+
+BOOL APIENTRY WinUpdateWindow(HWND hwnd);
+
+BOOL APIENTRY WinInvalidateRect(HWND hwnd, PRECTL pwrc, BOOL fIncludeChildren);
+BOOL APIENTRY WinInvalidateRegion(HWND hwnd, HRGN hrgn,
+ BOOL fIncludeChildren);
+
+
+/* Drawing helpers */
+
+BOOL APIENTRY WinInvertRect(HPS hps, PRECTL prcl);
+BOOL APIENTRY WinDrawBitmap(HPS hpsDst, HBITMAP hbm, PRECTL pwrcSrc,
+ PPOINTL pptlDst, LONG clrFore, LONG clrBack,
+ USHORT fs);
+
+/* WinDrawBitmap() flags */
+
+#define DBM_NORMAL 0x0000
+#define DBM_INVERT 0x0001
+#define DBM_HALFTONE 0x0002
+#define DBM_STRETCH 0x0004
+#define DBM_IMAGEATTRS 0x0008
+
+
+SHORT APIENTRY WinDrawText(HPS hps, SHORT cchText, PCH lpchText, PRECTL prcl,
+ LONG clrFore, LONG clrBack, USHORT rgfCmd);
+/*
+ * WinDrawText() codes:
+ * From DT_LEFT to DT_EXTERNALLEADING, the codes are designed to be OR'ed with
+ * SS_TEXT to create variations of the basic text static item.
+ */
+#define DT_LEFT 0x0000
+#define DT_EXTERNALLEADING 0x0080
+#define DT_CENTER 0x0100
+#define DT_RIGHT 0x0200
+#define DT_TOP 0x0000
+#define DT_VCENTER 0x0400
+#define DT_BOTTOM 0x0800
+#define DT_HALFTONE 0x1000
+#define DT_MNEMONIC 0x2000
+#define DT_WORDBREAK 0x4000
+#define DT_ERASERECT 0x8000
+#define DT_QUERYEXTENT 0x0002
+#define DT_TEXTATTRS 0x0040
+
+
+BOOL APIENTRY WinDrawBorder(HPS hps, PRECTL prcl, SHORT cx, SHORT cy,
+ LONG clrFore, LONG clrBack, USHORT rgfCmd);
+
+/* WinDrawBorder() flags */
+
+#define DB_PATCOPY 0x0000
+#define DB_PATINVERT 0x0001
+#define DB_DESTINVERT 0x0002
+#define DB_AREAMIXMODE 0x0003
+
+#define DB_ROP 0x0007
+#define DB_INTERIOR 0x0008
+#define DB_AREAATTRS 0x0010
+#define DB_STANDARD 0x0100
+#define DB_DLGBORDER 0x0200
+
+
+
+/** Resource loading functions */
+
+SHORT APIENTRY WinLoadString(HAB hab, HMODULE hmod, USHORT id, SHORT cchMax,
+ PSZ pchBuffer);
+#ifndef INCL_SAADEFS
+SHORT APIENTRY WinLoadMessage(HAB hab, HMODULE hmod, USHORT id, SHORT cchMax,
+ PSZ pchBuffer);
+
+
+#endif /* !INCL_SAADEFS */
+
+/***************************************************************************/
+/**** Window Manager Subsection part 2 ****/
+#if (defined(INCL_WINWINDOWMGR) || !defined(INCL_NOCOMMON))
+
+BOOL APIENTRY WinSetActiveWindow(HWND hwndDesktop, HWND hwnd);
+
+#endif /* Window Manager COMMON subsection */
+
+#ifdef INCL_WINWINDOWMGR
+/* WM_CREATE structure */
+
+typedef struct _CREATESTRUCT { /* crst */
+ PVOID pPresParams;
+ PVOID pCtlData;
+ USHORT id;
+ HWND hwndInsertBehind;
+ HWND hwndOwner;
+ SHORT cy;
+ SHORT cx;
+ SHORT y;
+ SHORT x;
+ ULONG flStyle;
+ PSZ pszText;
+ PSZ pszClass;
+ HWND hwndParent;
+} CREATESTRUCT;
+typedef CREATESTRUCT FAR *PCREATESTRUCT;
+
+/* WinQueryClassInfo() structure */
+
+typedef struct _CLASSINFO { /* clsi */
+ ULONG flClassStyle;
+ PFNWP pfnWindowProc;
+ USHORT cbWindowData;
+} CLASSINFO;
+typedef CLASSINFO FAR *PCLASSINFO;
+
+#ifndef INCL_SAADEFS
+PFNWP APIENTRY WinSubclassWindow(HWND hwnd, PFNWP pfnwp);
+#endif /* !INCL_SAADEFS */
+
+SHORT APIENTRY WinQueryClassName(HWND hwnd, SHORT cchMax, PCH pch);
+BOOL APIENTRY WinQueryClassInfo(HAB hab, PSZ pszClassName,
+ PCLASSINFO pClassInfo);
+
+HWND APIENTRY WinQueryActiveWindow(HWND hwndDesktop, BOOL fLock);
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinIsThreadActive(HAB hab);
+#endif /* !INCL_SAADEFS */
+HWND APIENTRY WinQuerySysModalWindow(HWND hwndDesktop, BOOL fLock);
+
+HWND APIENTRY WinLockWindow(HWND hwnd, BOOL fLock);
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinRegisterWindowDestroy(HWND hwnd, BOOL fRegister);
+#endif /* !INCL_SAADEFS */
+BOOL APIENTRY WinSetSysModalWindow(HWND hwndDesktop, HWND hwnd);
+
+SHORT APIENTRY WinQueryWindowLockCount(HWND hwnd);
+
+#ifndef INCL_SAADEFS
+USHORT APIENTRY WinQueryWindowUShort(HWND hwnd, SHORT index);
+BOOL APIENTRY WinSetWindowUShort(HWND hwnd, SHORT index, USHORT us);
+ULONG APIENTRY WinQueryWindowULong(HWND hwnd, SHORT index);
+BOOL APIENTRY WinSetWindowULong(HWND hwnd, SHORT index, ULONG ul);
+PVOID APIENTRY WinQueryWindowPtr(HWND hwnd, SHORT index);
+BOOL APIENTRY WinSetWindowPtr(HWND hwnd, SHORT index, PVOID p);
+BOOL APIENTRY WinSetWindowBits(HWND hwnd, SHORT index, ULONG flData,
+ ULONG flMask);
+
+/* Standard WinQueryWindowUShort/ULong() indices */
+
+#define QWS_USER 0
+#define QWS_ID (-1)
+#define QWS_MIN (-1)
+
+#define QWL_USER 0
+#define QWL_STYLE (-2)
+#define QWP_PFNWP (-3)
+#define QWL_HMQ (-4)
+#define QWL_MIN (-4)
+
+/* WC_FRAME WinQueryWindowUShort/ULong() indices */
+
+#define QWL_HHEAP 0x0004
+#define QWL_HWNDFOCUSSAVE 0x0018
+
+#define QWS_FLAGS 0x0008
+#define QWS_RESULT 0x000a
+#define QWS_XRESTORE 0x000c
+#define QWS_YRESTORE 0x000e
+#define QWS_CXRESTORE 0x0010
+#define QWS_CYRESTORE 0x0012
+#define QWS_XMINIMIZE 0x0014
+#define QWS_YMINIMIZE 0x0016
+
+
+/* Window enumeration */
+
+typedef LHANDLE HENUM; /* henum */
+
+HENUM APIENTRY WinBeginEnumWindows(HWND hwnd);
+HWND APIENTRY WinGetNextWindow(HENUM henum);
+BOOL APIENTRY WinEndEnumWindows(HENUM henum);
+
+#endif /* !INCL_SAADEFS */
+
+HWND APIENTRY WinWindowFromPoint(HWND hwnd, PPOINTL pptl, BOOL fChildren,
+ BOOL fLock);
+BOOL APIENTRY WinMapWindowPoints(HWND hwndFrom, HWND hwndTo, PPOINTL prgptl,
+ SHORT cwpt);
+
+/* More window painting functions */
+
+BOOL APIENTRY WinValidateRect(HWND hwnd, PRECTL prcl, BOOL fIncludeChildren);
+BOOL APIENTRY WinValidateRegion(HWND hwnd, HRGN hrgn, BOOL fIncludeChildren);
+#ifndef INCL_SAADEFS
+HWND APIENTRY WinWindowFromDC(HDC hdc);
+HDC APIENTRY WinQueryWindowDC(HWND hwnd);
+HPS APIENTRY WinGetScreenPS(HWND hwndDesktop);
+BOOL APIENTRY WinLockWindowUpdate(HWND hwndDesktop, HWND hwndLockUpdate);
+BOOL APIENTRY WinLockVisRegions(HWND hwndDesktop, BOOL fLock);
+#endif /* !INCL_SAADEFS */
+BOOL APIENTRY WinQueryUpdateRect(HWND hwnd, PRECTL prcl);
+SHORT APIENTRY WinQueryUpdateRegion(HWND hwnd, HRGN hrgn);
+SHORT APIENTRY WinExcludeUpdateRegion(HPS hps, HWND hwnd);
+
+#endif /* INCL_WINWINDOWMGR */
+
+#if (defined(INCL_WINMESSAGEMGR) || !defined(INCL_NOCOMMON))
+
+/* QMSG structure */
+
+typedef struct _QMSG { /* qmsg */
+ HWND hwnd;
+ USHORT msg;
+ MPARAM mp1;
+ MPARAM mp2;
+ ULONG time;
+ POINTL ptl;
+} QMSG;
+typedef QMSG FAR *PQMSG;
+
+typedef LHANDLE HMQ; /* hmq */
+
+/*
+** This is the standard function definition for window procedures.
+** Typically they are names like "XxxxxxxxWndProc", where the prefix
+** "Xxxxxxxxx" is replaced by some name descriptive of the window procedure
+** being declared. Window procedures must be EXPORTED in the definitions
+** file used by the linker.
+**
+** MRESULT EXPENTRY MyclassWndProc(HWND hwnd, ** window handle **
+** USHORT msg, ** message number **
+** MPARAM mp1, ** 1st (packed) parms **
+** MPARAM mp2); ** 2nd (packed) parms **
+*/
+
+/* Standard Window Messages */
+
+#define WM_NULL 0x0000
+#define WM_CREATE 0x0001
+#define WM_DESTROY 0x0002
+
+#ifndef INCL_SAADEFS
+#define WM_OTHERWINDOWDESTROYED 0x0003
+#endif /* !INCL_SAADEFS */
+
+#define WM_ENABLE 0x0004
+#define WM_SHOW 0x0005
+#define WM_MOVE 0x0006
+#define WM_SIZE 0x0007
+#define WM_ADJUSTWINDOWPOS 0x0008
+
+#define WM_CALCVALIDRECTS 0x0009
+
+#define WM_SETWINDOWPARAMS 0x000a
+#define WM_QUERYWINDOWPARAMS 0x000b
+#define WM_HITTEST 0x000c
+#define WM_ACTIVATE 0x000d
+#define WM_SETFOCUS 0x000f
+#define WM_SETSELECTION 0x0010
+
+/* language support Winproc */
+#define WM_PPAINT 0x0011
+#define WM_PSETFOCUS 0x0012
+#define WM_PSYSCOLORCHANGE 0x0013
+#define WM_PSIZE 0x0014
+#define WM_PACTIVATE 0x0015
+#define WM_PCONTROL 0x0016
+
+
+#define WM_COMMAND 0x0020
+#define WM_SYSCOMMAND 0x0021
+#define WM_HELP 0x0022
+#define WM_PAINT 0x0023
+
+#ifndef INCL_SAADEFS
+#define WM_TIMER 0x0024
+#define WM_SEM1 0x0025
+#define WM_SEM2 0x0026
+#define WM_SEM3 0x0027
+#define WM_SEM4 0x0028
+#endif /* !INCL_SAADEFS */
+
+#define WM_CLOSE 0x0029
+#define WM_QUIT 0x002a
+#define WM_SYSCOLORCHANGE 0x002b
+#define WM_SYSVALUECHANGED 0x002d
+#define WM_APPTERMINATENOTIFY 0x002e
+#define WM_PRESPARAMCHANGED 0x002f
+
+/* Control notification messages */
+
+#define WM_CONTROL 0x0030
+#define WM_VSCROLL 0x0031
+#define WM_HSCROLL 0x0032
+#define WM_INITMENU 0x0033
+#define WM_MENUSELECT 0x0034
+#define WM_MENUEND 0x0035
+#define WM_DRAWITEM 0x0036
+#define WM_MEASUREITEM 0x0037
+#define WM_CONTROLPOINTER 0x0038
+#define WM_CONTROLHEAP 0x0039
+#define WM_QUERYDLGCODE 0x003a
+#define WM_INITDLG 0x003b
+#define WM_SUBSTITUTESTRING 0x003c
+#define WM_MATCHMNEMONIC 0x003d
+#define WM_SAVEAPPLICATION 0x003e
+
+/* Reserve a range of messages for help manager. This range includes */
+/* public messages, defined below, and private ones, which need to be */
+/* reserved here to prevent clashing with application messages */
+
+#define WM_HELPBASE 0x0F00 /* Start of msgs for help manager */
+#define WM_HELPTOP 0x0FFF /* End of msgs for help manager */
+
+#define WM_USER 0x1000
+
+/* WM_COMMAND msg source codes */
+
+#define CMDSRC_PUSHBUTTON 1
+#define CMDSRC_MENU 2
+#define CMDSRC_ACCELERATOR 3
+#define CMDSRC_OTHER 0
+
+/*
+ * The following structure and macro are used to access the
+ * WM_COMMAND, WM_HELP, and WM_SYSCOMMAND message parameters:
+ */
+typedef struct _COMMANDMSG { /* commandmsg */
+ USHORT source; /* mp2 */
+ BOOL fMouse;
+ USHORT cmd; /* mp1 */
+ USHORT unused;
+} CMDMSG;
+
+#define COMMANDMSG(pmsg) \
+ ((struct _COMMANDMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))
+
+/*
+ * The following structure is used by the WinQueryQueueInfo() routine
+ */
+typedef struct _MQINFO { /* mqi */
+ USHORT cb;
+ PID pid;
+ TID tid;
+ USHORT cmsgs;
+ PVOID pReserved;
+} MQINFO;
+typedef MQINFO FAR *PMQINFO;
+
+
+MRESULT APIENTRY WinSendMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
+HMQ APIENTRY WinCreateMsgQueue(HAB hab, SHORT cmsg);
+BOOL APIENTRY WinDestroyMsgQueue(HMQ hmq);
+BOOL APIENTRY WinQueryQueueInfo(HMQ hmq, PMQINFO pmqi, USHORT cbCopy);
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinCancelShutdown(HMQ hmq, BOOL fCancelAlways);
+#endif /* INCL_SAADEFS */
+
+BOOL APIENTRY WinGetMsg(HAB hab, PQMSG pqmsg, HWND hwndFilter,
+ USHORT msgFilterFirst, USHORT msgFilterLast);
+BOOL APIENTRY WinPeekMsg(HAB hab, PQMSG pqmsg, HWND hwndFilter,
+ USHORT msgFilterFirst, USHORT msgFilterLast,
+ USHORT fs);
+
+MRESULT APIENTRY WinDispatchMsg(HAB hab, PQMSG pqmsg);
+
+BOOL APIENTRY WinPostMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
+BOOL APIENTRY WinRegisterUserMsg(HAB hab, USHORT msgid, SHORT datatype1,
+ SHORT dir1, SHORT datatype2, SHORT dir2,
+ SHORT datatyper);
+BOOL APIENTRY WinRegisterUserDatatype(HAB hab, SHORT datatype,
+ SHORT count, PSHORT types);
+BOOL APIENTRY WinSetMsgMode(HAB hab, PSZ classname,
+ SHORT control);
+BOOL APIENTRY WinSetSynchroMode(HAB hab, SHORT mode);
+
+/* WinPeekMsg() constants */
+
+#define PM_REMOVE 0x0001
+#define PM_NOREMOVE 0x0000
+
+/* WinRegisterUserDatatype datatypes defined in separate file */
+#ifdef INCL_WINTYPES
+ #include <pmtypes.h>
+#endif /*INCL_WINTYPES*/
+
+/* WinRegisterUserMsg direction codes */
+
+#define RUM_IN 1
+#define RUM_OUT 2
+#define RUM_INOUT 3
+
+/* WinSetMsgMode constants */
+
+#define SMD_DELAYED 0x0001
+#define SMD_IMMEDIATE 0x0002
+
+/* WinSetSynchroMode constants */
+
+#define SSM_SYNCHRONOUS 0x0001
+#define SSM_ASYNCHRONOUS 0x0002
+#define SSM_MIXED 0x0003
+
+#endif /* WINMESSAGEMGR || !INCL_NOCOMMON */
+
+#ifdef INCL_WINMESSAGEMGR
+
+/* WM_CALCVALIDRECTS return flags */
+
+#define CVR_ALIGNLEFT 0x0001
+#define CVR_ALIGNBOTTOM 0x0002
+#define CVR_ALIGNRIGHT 0x0004
+#define CVR_ALIGNTOP 0x0008
+#define CVR_REDRAW 0x0010
+
+
+/* WM_HITTEST return codes */
+
+#define HT_NORMAL 0
+#define HT_TRANSPARENT (-1)
+#define HT_DISCARD (-2)
+#define HT_ERROR (-3)
+
+
+/* WM_SET/QUERYWINDOWPARAMS structures and flags */
+
+typedef struct _WNDPARAMS { /* wprm */
+ USHORT fsStatus;
+ USHORT cchText;
+ PSZ pszText;
+ USHORT cbPresParams;
+ PVOID pPresParams;
+ USHORT cbCtlData;
+ PVOID pCtlData;
+} WNDPARAMS;
+typedef WNDPARAMS FAR *PWNDPARAMS;
+
+/* Flags used by WM_SET/QUERYWINDOWPARAMS */
+
+#define WPM_TEXT 0x0001
+#define WPM_CTLDATA 0x0002
+#define WPM_PRESPARAMS 0x0004
+#define WPM_CCHTEXT 0x0008
+#define WPM_CBCTLDATA 0x0010
+#define WPM_CBPRESPARAMS 0x0020
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinInSendMsg(HAB hab);
+
+#endif /* INCL_SAADEFS */
+
+BOOL APIENTRY WinBroadcastMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2,
+ USHORT rgf);
+
+/* WinBroadcastMsg codes */
+
+#define BMSG_POST 0x0000
+#define BMSG_SEND 0x0001
+#define BMSG_POSTQUEUE 0x0002
+#define BMSG_DESCENDANTS 0x0004
+#define BMSG_FRAMEONLY 0x0008
+
+
+
+BOOL APIENTRY WinWaitMsg(HAB hab, USHORT msgFirst, USHORT msgLast);
+
+#ifndef INCL_SAADEFS
+ULONG APIENTRY WinQueryQueueStatus(HWND hwndDesktop);
+
+/* WinQueryQueueStatus() constants */
+
+#define QS_KEY 0x0001
+#define QS_MOUSEBUTTON 0x0002
+#define QS_MOUSEMOVE 0x0004
+#define QS_MOUSE 0x0006 /* QS_MOUSEMOVE|QS_MOUSEBUTTON */
+#define QS_TIMER 0x0008
+#define QS_PAINT 0x0010
+#define QS_POSTMSG 0x0020
+#define QS_SEM1 0x0040
+#define QS_SEM2 0x0080
+#define QS_SEM3 0x0100
+#define QS_SEM4 0x0200
+#define QS_SENDMSG 0x0400
+
+
+BOOL APIENTRY WinQueryMsgPos(HAB hab, PPOINTL pptl);
+ULONG APIENTRY WinQueryMsgTime(HAB hab);
+
+USHORT APIENTRY WinMsgSemWait(HSEM hsem, LONG dtTimeout);
+USHORT APIENTRY WinMsgMuxSemWait(PUSHORT pisemCleared, PVOID pmxsl,
+ LONG dtTimeout);
+#endif /* !INCL_SAADEFS */
+BOOL APIENTRY WinPostQueueMsg(HMQ hmq, USHORT msg, MPARAM mp1, MPARAM mp2);
+
+
+/* WinSetMsgInterest()/WinSetClassMsgInterest() constants */
+#define SMIM_ALL 0x0EFF
+#define SMI_NOINTEREST 0x0001
+#define SMI_INTEREST 0x0002
+#define SMI_RESET 0x0004
+#define SMI_AUTODISPATCH 0x0008
+
+BOOL APIENTRY WinSetMsgInterest(HWND hwnd, USHORT msg_class, SHORT control);
+BOOL APIENTRY WinSetClassMsgInterest(HAB hab, PSZ pszClassName,
+ USHORT msg_class, SHORT control);
+
+#endif /* INCL_WINMESSAGEMGR */
+
+/*** Keyboard and mouse */
+
+#if (defined(INCL_WININPUT) || !defined(INCL_NOCOMMON))
+
+/*** Keyboard and mouse input COMMON subsection */
+BOOL APIENTRY WinSetFocus(HWND hwndDesktop, HWND hwndSetFocus);
+BOOL APIENTRY WinFocusChange(HWND hwndDesktop, HWND hwndSetFocus,
+ USHORT fsFocusChange);
+
+#define FC_NOSETFOCUS 0x0001
+#define FC_NOBRINGTOTOP FC_NOSETFOCUS
+#define FC_NOLOSEFOCUS 0x0002
+#define FC_NOBRINGTOPFIRSTWINDOW FC_NOLOSEFOCUS
+#define FC_NOSETACTIVEFOCUS 0x0003
+#define FC_NOSETACTIVE 0x0004
+#define FC_NOLOSEACTIVE 0x0008
+#define FC_NOSETSELECTION 0x0010
+#define FC_NOLOSESELECTION 0x0020
+
+#define QFC_NEXTINCHAIN 0x0001
+#define QFC_ACTIVE 0x0002
+#define QFC_FRAME 0x0003
+#define QFC_SELECTACTIVE 0x0004
+
+#endif /* Keyboard and mouse input COMMON subsection */
+
+#ifdef INCL_WININPUT
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinSetCapture(HWND hwndDesktop, HWND hwnd);
+#endif /* !INCL_SAADEFS */
+HWND APIENTRY WinQueryCapture(HWND hwndDesktop, BOOL fLock);
+
+/* Mouse input messages */
+
+#ifndef INCL_SAADEFS
+#define WM_MOUSEFIRST 0x0070
+#define WM_MOUSELAST 0x0079
+#define WM_BUTTONCLICKFIRST 0x0071
+#define WM_BUTTONCLICKLAST 0x0079
+#endif /* !INCL_SAADEFS */
+#define WM_MOUSEMOVE 0x0070
+
+#define WM_BUTTON1DOWN 0x0071
+
+#define WM_BUTTON1UP 0x0072
+#define WM_BUTTON1DBLCLK 0x0073
+#define WM_BUTTON2DOWN 0x0074
+#define WM_BUTTON2UP 0x0075
+#define WM_BUTTON2DBLCLK 0x0076
+#ifndef INCL_SAADEFS
+#define WM_BUTTON3DOWN 0x0077
+#define WM_BUTTON3UP 0x0078
+#define WM_BUTTON3DBLCLK 0x0079
+#endif /* !INCL_SAADEFS */
+
+HWND APIENTRY WinQueryFocus(HWND hwndDesktop, BOOL fLock);
+
+
+/* Key/Character input messages */
+
+#define WM_CHAR 0x007a
+#define WM_VIOCHAR 0x007b
+
+/* WM_CHAR fs field bits */
+
+#define KC_CHAR 0x0001
+#define KC_VIRTUALKEY 0x0002
+#define KC_SCANCODE 0x0004
+
+#define KC_SHIFT 0x0008
+#define KC_CTRL 0x0010
+#define KC_ALT 0x0020
+#define KC_KEYUP 0x0040
+#define KC_PREVDOWN 0x0080
+#define KC_LONEKEY 0x0100
+#define KC_DEADKEY 0x0200
+#define KC_COMPOSITE 0x0400
+#define KC_INVALIDCOMP 0x0800
+
+#ifndef INCL_SAADEFS
+#define KC_TOGGLE 0x1000
+#define KC_INVALIDCHAR 0x2000
+#define KC_DBCSRSRVD1 0x4000
+#define KC_DBCSRSRVD2 0x8000
+#endif /* !INCL_SAADEFS */
+
+/*
+ * The following structure and macro are used to access the
+ * WM_MOUSEMOVE, and WM_BUTTON message parameters
+ */
+typedef struct _MOUSEMSG { /* mousemsg */
+ USHORT codeHitTest; /* mp2 */
+ USHORT unused;
+ SHORT x; /* mp1 */
+ SHORT y;
+} MSEMSG;
+
+#define MOUSEMSG(pmsg) \
+ ((struct _MOUSEMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))
+
+/*
+ * The following structure and macro are used to access the
+ * WM_CHAR message parameters.
+ */
+typedef struct _CHARMSG { /* charmsg */
+ USHORT chr; /* mp2 */
+ USHORT vkey;
+ USHORT fs; /* mp1 */
+ UCHAR cRepeat;
+ UCHAR scancode;
+} CHRMSG;
+
+#define CHARMSG(pmsg) \
+ ((struct _CHARMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))
+
+/*** Virtual key values */
+
+#define VK_BUTTON1 0x01
+#define VK_BUTTON2 0x02
+#define VK_BUTTON3 0x03
+#define VK_BREAK 0x04
+#define VK_BACKSPACE 0x05
+#define VK_TAB 0x06
+#define VK_BACKTAB 0x07
+#define VK_NEWLINE 0x08
+#define VK_SHIFT 0x09
+#define VK_CTRL 0x0A
+#define VK_ALT 0x0B
+#define VK_ALTGRAF 0x0C
+#define VK_PAUSE 0x0D
+#define VK_CAPSLOCK 0x0E
+#define VK_ESC 0x0F
+#define VK_SPACE 0x10
+#define VK_PAGEUP 0x11
+#define VK_PAGEDOWN 0x12
+#define VK_END 0x13
+#define VK_HOME 0x14
+#define VK_LEFT 0x15
+#define VK_UP 0x16
+#define VK_RIGHT 0x17
+#define VK_DOWN 0x18
+#define VK_PRINTSCRN 0x19
+#define VK_INSERT 0x1A
+#define VK_DELETE 0x1B
+#define VK_SCRLLOCK 0x1C
+#define VK_NUMLOCK 0x1D
+#define VK_ENTER 0x1E
+#define VK_SYSRQ 0x1F
+#define VK_F1 0x20
+#define VK_F2 0x21
+#define VK_F3 0x22
+#define VK_F4 0x23
+#define VK_F5 0x24
+#define VK_F6 0x25
+#define VK_F7 0x26
+#define VK_F8 0x27
+#define VK_F9 0x28
+#define VK_F10 0x29
+#define VK_F11 0x2A
+#define VK_F12 0x2B
+#define VK_F13 0x2C
+#define VK_F14 0x2D
+#define VK_F15 0x2E
+#define VK_F16 0x2F
+#define VK_F17 0x30
+#define VK_F18 0x31
+#define VK_F19 0x32
+#define VK_F20 0x33
+#define VK_F21 0x34
+#define VK_F22 0x35
+#define VK_F23 0x36
+#define VK_F24 0x37
+
+
+#define VK_MENU VK_F10
+#ifdef INCL_NLS
+#define VK_DBCSFIRST 0x0080
+#define VK_DBCSLAST 0x00ff
+#endif /* INCL_NLS */
+
+#define VK_USERFIRST 0x0100
+#define VK_USERLAST 0x01ff
+
+#ifndef INCL_SAADEFS
+
+SHORT APIENTRY WinGetKeyState(HWND hwndDesktop, SHORT vkey);
+SHORT APIENTRY WinGetPhysKeyState(HWND hwndDesktop, SHORT sc);
+BOOL APIENTRY WinEnablePhysInput(HWND hwndDesktop, BOOL fEnable);
+BOOL APIENTRY WinIsPhysInputEnabled(HWND hwndDesktop);
+BOOL APIENTRY WinSetKeyboardStateTable(HWND hwndDesktop,
+ PBYTE pKeyStateTable, BOOL fSet);
+
+
+/* Journal Notification messages */
+#define WM_JOURNALNOTIFY 0x007c
+
+/*** Define the valid commands (lParm1) for journal notify message */
+#define JRN_QUEUESTATUS 0x00000001L
+#define JRN_PHYSKEYSTATE 0x00000002L
+
+#endif /* !INCL_SAADEFS */
+#endif /* INCL_WININPUT */
+
+
+/**** Dialog Manager */
+
+#if (defined(INCL_WINDIALOGS) || !defined(INCL_NOCOMMON))
+/**** Dialog Manager COMMON subsection */
+
+/*
+** This is the standard function definition for dialog procedures.
+** Typically they are names like "XxxxxxxxDlgProc", where the prefix
+** "Xxxxxxxxx" is replaced by some name descriptive of the dialog procedure
+** being declared. Dialog procedures must be EXPORTED in the definitions
+** file used by the linker. The dialog procedure declaration is identical
+** to that for window procedures.
+**
+** MRESULT EXPENTRY MydialogDlgProc(HWND hwnd, ** window handle **
+** USHORT msg, ** message number **
+** MPARAM mp1, ** 1st (packed) parms **
+** MPARAM mp2); ** 2nd (packed) parms **
+*/
+
+BOOL APIENTRY WinGetDlgMsg(HWND hwndDlg, PQMSG pqmsg);
+
+
+HWND APIENTRY WinLoadDlg(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
+ HMODULE hmod, USHORT idDlg, PVOID pCreateParams);
+USHORT APIENTRY WinDlgBox(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
+ HMODULE hmod, USHORT idDlg, PVOID pCreateParams);
+
+BOOL APIENTRY WinDismissDlg(HWND hwndDlg, USHORT usResult);
+
+BOOL APIENTRY WinQueryDlgItemShort(HWND hwndDlg, USHORT idItem,
+ PSHORT pResult, BOOL fSigned);
+BOOL APIENTRY WinSetDlgItemShort(HWND hwndDlg, USHORT idItem,
+ USHORT usValue, BOOL fSigned);
+BOOL APIENTRY WinSetDlgItemText(HWND hwndDlg, USHORT idItem, PSZ pszText);
+USHORT APIENTRY WinQueryDlgItemText(HWND hwndDlg, USHORT idItem,
+ SHORT cchBufferMax, PSZ pchBuffer);
+SHORT APIENTRY WinQueryDlgItemTextLength(HWND hwndDlg, USHORT idItem);
+
+MRESULT APIENTRY WinDefDlgProc(HWND hwndDlg, USHORT msg, MPARAM mp1,
+ MPARAM mp2);
+
+/* Special item IDs */
+
+#ifndef INCL_SAADEFS
+#define DID_OK 1
+#define DID_CANCEL 2
+#define DID_ERROR 0xffff
+#endif /* !INCL_SAADEFS */
+
+BOOL APIENTRY WinAlarm(HWND hwndDesktop, USHORT rgfType);
+
+/* WinAlarm Codes */
+
+#define WA_WARNING 0
+#define WA_NOTE 1
+#define WA_ERROR 2
+#define WA_CWINALARMS 3
+
+USHORT APIENTRY WinMessageBox(HWND hwndParent, HWND hwndOwner, PSZ pszText,
+ PSZ pszCaption, USHORT idWindow, USHORT flStyle);
+
+/* Message box types */
+
+#define MB_OK 0x0000
+#define MB_OKCANCEL 0x0001
+#define MB_RETRYCANCEL 0x0002
+#define MB_ABORTRETRYIGNORE 0x0003
+#define MB_YESNO 0x0004
+#define MB_YESNOCANCEL 0x0005
+#define MB_CANCEL 0x0006
+#define MB_ENTER 0x0007
+#define MB_ENTERCANCEL 0x0008
+
+#define MB_NOICON 0x0000
+#define MB_CUANOTIFICATION 0x0000
+#define MB_ICONQUESTION 0x0010
+#define MB_ICONEXCLAMATION 0x0020
+#define MB_CUAWARNING 0x0020
+#define MB_ICONASTERISK 0x0030
+#define MB_ICONHAND 0x0040
+#define MB_CUACRITICAL 0x0040
+#define MB_QUERY MB_ICONQUESTION
+#define MB_WARNING MB_CUAWARNING
+#define MB_INFORMATION MB_ICONASTERISK
+#define MB_CRITICAL MB_CUACRITICAL
+#define MB_ERROR MB_CRITICAL
+
+#define MB_DEFBUTTON1 0x0000
+#define MB_DEFBUTTON2 0x0100
+#define MB_DEFBUTTON3 0x0200
+
+#define MB_APPLMODAL 0x0000
+#define MB_SYSTEMMODAL 0x1000
+#define MB_HELP 0x2000
+#define MB_MOVEABLE 0x4000
+
+
+/* Message box return codes */
+
+#define MBID_OK 1
+#define MBID_CANCEL 2
+#define MBID_ABORT 3
+#define MBID_RETRY 4
+#define MBID_IGNORE 5
+#define MBID_YES 6
+#define MBID_NO 7
+#define MBID_HELP 8
+#define MBID_ENTER 9
+#define MBID_ERROR 0xffff
+
+#endif /* Dialog Manager COMMON subsection */
+
+
+#ifdef INCL_WINDIALOGS
+
+/* Dialog codes: returned by WM_QUERYDLGCODE msg */
+
+#define DLGC_ENTRYFIELD 0x0001 /* Entry field item understands EM_SETSEL) */
+#define DLGC_BUTTON 0x0002 /* Button item */
+#define DLGC_RADIOBUTTON 0x0004 /* Radio button */
+#define DLGC_STATIC 0x0008 /* Static item */
+#define DLGC_DEFAULT 0x0010 /* Default push button */
+#define DLGC_PUSHBUTTON 0x0020 /* Normal (Non-default) push button */
+#define DLGC_CHECKBOX 0x0040 /* Check box button control */
+#define DLGC_SCROLLBAR 0x0080 /* Scroll bar */
+#define DLGC_MENU 0x0100 /* Menu */
+#define DLGC_TABONCLICK 0x0200
+#define DLGC_MLE 0x0400 /* Multiple Line Entry */
+
+
+USHORT APIENTRY WinProcessDlg(HWND hwndDlg);
+USHORT APIENTRY WinStartDlg(HWND hwndDlg);
+MRESULT APIENTRY WinSendDlgItemMsg(HWND hwndDlg, USHORT idItem, USHORT msg,
+ MPARAM mp1, MPARAM mp2);
+BOOL APIENTRY WinMapDlgPoints(HWND hwndDlg, PPOINTL prgwptl, USHORT cwpt,
+ BOOL fCalcWindowCoords);
+HWND APIENTRY WinEnumDlgItem(HWND hwndDlg, HWND hwnd, USHORT code,
+ BOOL fLock);
+SHORT APIENTRY WinSubstituteStrings(HWND hwnd, PSZ pszSrc, SHORT cchDstMax,
+ PSZ pszDst);
+
+/* WinEnumDlgItem() constants
+ *
+ * In OS/2 1.2, WinEnumDlgItem() can enumerate a window such that the
+ * selection cursor may be moved according to CUA (Common User Access)
+ * rules.
+ */
+
+#define EDI_FIRSTTABITEM 0
+#define EDI_LASTTABITEM 1
+#define EDI_NEXTTABITEM 2
+#define EDI_PREVTABITEM 3
+#define EDI_FIRSTGROUPITEM 4
+#define EDI_LASTGROUPITEM 5
+#define EDI_NEXTGROUPITEM 6
+#define EDI_PREVGROUPITEM 7
+
+/*** Dialog template definitions */
+
+/* Variable-sized dialog template items: */
+
+typedef struct _DLGTITEM { /* dlgti */
+ USHORT fsItemStatus;
+ USHORT cChildren;
+ USHORT cchClassName;
+ USHORT offClassName;
+ USHORT cchText;
+ USHORT offText;
+ ULONG flStyle;
+ SHORT x;
+ SHORT y;
+ SHORT cx;
+ SHORT cy;
+ USHORT id;
+ USHORT offPresParams;
+ USHORT offCtlData;
+} DLGTITEM;
+typedef DLGTITEM FAR *PDLGTITEM;
+
+/* Dialog Template structure */
+
+typedef struct _DLGTEMPLATE { /* dlgt */
+ USHORT cbTemplate;
+ USHORT type;
+ USHORT codepage;
+ USHORT offadlgti;
+ USHORT fsTemplateStatus;
+ USHORT iItemFocus;
+ USHORT coffPresParams;
+ DLGTITEM adlgti[1];
+} DLGTEMPLATE;
+typedef DLGTEMPLATE FAR *PDLGTEMPLATE;
+
+HWND APIENTRY WinCreateDlg(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
+ PDLGTEMPLATE pdlgt, PVOID pCreateParams);
+
+
+#endif /* INCL_WINDIALOGS */
+
+
+#ifdef INCL_WINSTATICS
+
+/*** Static Control Manager */
+
+/* Static control styles:
+ *
+ * NOTE: the top 9 bits of the LOWORD of the window flStyle are used for
+ * DT_* flags. The lower 7 bits are for SS_* styles. This gives us up
+ * to 128 distinct static control types (we currently use 11 of them).
+ */
+#define SS_TEXT 0x0001L
+#define SS_GROUPBOX 0x0002L
+
+#ifndef INCL_SAADEFS
+#define SS_ICON 0x0003L
+#define SS_BITMAP 0x0004L
+#endif /* !INCL_SAADEFS */
+#define SS_FGNDRECT 0x0005L
+#ifndef INCL_SAADEFS
+#define SS_HALFTONERECT 0x0006L
+#endif /* !INCL_SAADEFS */
+#define SS_BKGNDRECT 0x0007L
+#define SS_FGNDFRAME 0x0008L
+#ifndef INCL_SAADEFS
+#define SS_HALFTONEFRAME 0x0009L
+#endif /* !INCL_SAADEFS */
+#define SS_BKGNDFRAME 0x000aL
+#define SS_SYSICON 0x000bL
+
+/* Static control class name */
+
+#define WC_STATIC ((PSZ)0xffff0005L)
+
+/* Static control messages */
+
+#define SM_SETHANDLE 0x0100
+#define SM_QUERYHANDLE 0x0101
+
+#endif /* INCL_WINSTATICS */
+
+
+#ifdef INCL_WINBUTTONS
+/**** Button Controls Subsection */
+
+/* Button control styles */
+
+#define BS_PUSHBUTTON 0L
+#define BS_CHECKBOX 1L
+#define BS_AUTOCHECKBOX 2L
+#define BS_RADIOBUTTON 3L
+#define BS_AUTORADIOBUTTON 4L
+#define BS_3STATE 5L
+#define BS_AUTO3STATE 6L
+
+#ifndef INCL_SAADEFS
+#define BS_USERBUTTON 7L
+#endif /* !INCL_SAADEFS */
+
+#define BS_HELP 0x0100L
+#define BS_SYSCOMMAND 0x0200L
+#define BS_DEFAULT 0x0400L
+#define BS_NOPOINTERFOCUS 0x0800L
+#define BS_NOBORDER 0x1000L
+#define BS_NOCURSORSELECT 0x2000L
+
+
+/* Button class name */
+
+#define WC_BUTTON ((PSZ)0xffff0003L)
+
+
+#ifndef INCL_SAADEFS
+typedef struct _BTNCDATA { /* btncd */
+ USHORT cb;
+ USHORT fsCheckState;
+ USHORT fsHiliteState;
+} BTNCDATA;
+typedef BTNCDATA FAR *PBTNCDATA;
+#endif /* !INCL_SAADEFS */
+
+/* User button structure (passed in WM_CONTROL msg) */
+
+#ifndef INCL_SAADEFS
+typedef struct _USERBUTTON { /* ubtn */
+ HWND hwnd;
+ HPS hps;
+ USHORT fsState;
+ USHORT fsStateOld;
+} USERBUTTON;
+typedef USERBUTTON FAR *PUSERBUTTON;
+#endif /* !INCL_SAADEFS */
+
+/* Button control messages */
+
+#define BM_CLICK 0x0120
+#define BM_QUERYCHECKINDEX 0x0121
+#define BM_QUERYHILITE 0x0122
+#define BM_SETHILITE 0x0123
+#define BM_QUERYCHECK 0x0124
+#define BM_SETCHECK 0x0125
+#define BM_SETDEFAULT 0x0126
+
+/* Button notification codes */
+
+#define BN_CLICKED 1
+#define BN_DBLCLICKED 2
+#define BN_PAINT 3
+
+/* BN_PAINT button draw state codes (must be in high byte) */
+
+#ifndef INCL_SAADEFS
+#define BDS_HILITED 0x0100
+#define BDS_DISABLED 0x0200
+#define BDS_DEFAULT 0x0400
+
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINBUTTONS */
+
+
+#ifdef INCL_WINENTRYFIELDS
+/**** Entryfield controls Subsection */
+
+/* Entry field styles */
+
+#define ES_LEFT 0x00000000L
+#define ES_CENTER 0x00000001L
+#define ES_RIGHT 0x00000002L
+
+#ifndef INCL_SAADEFS
+#define ES_AUTOSCROLL 0x00000004L
+#endif /* !INCL_SAADEFS */
+
+#define ES_MARGIN 0x00000008L
+#define ES_AUTOTAB 0x00000010L
+#define ES_READONLY 0x00000020L
+#define ES_COMMAND 0x00000040L
+#define ES_UNREADABLE 0x00000080L
+#define ES_PICTUREMASK 0x00000100L
+
+#ifdef INCL_NLS
+#define ES_ANY 0x00000000L
+#define ES_SBCS 0x00001000L
+#define ES_DBCS 0x00002000L
+#define ES_MIXED 0x00003000L /* ES_SBCS | ES_DBCS */
+#endif /* INCL_NLS */
+
+#define WC_COMBOBOX ((PSZ)0xffff0002L)
+
+/*
+ * combo box styles
+ */
+#define CBS_SIMPLE 0x0001L
+#define CBS_DROPDOWN 0x0002L
+#define CBS_DROPDOWNLIST 0x0004L
+
+/*
+ *IDs of combobox entry field and listbox.
+ */
+#define CBID_LIST 0x029A
+#define CBID_EDIT 0x029B
+
+#define CBM_SHOWLIST 0x0170
+#define CBM_HILITE 0x0171
+#define CBM_ISLISTSHOWING 0x0172
+
+#define CBN_EFCHANGE 1
+#define CBN_EFSCROLL 2
+#define CBN_MEMERROR 3
+#define CBN_LBSELECT 4
+#define CBN_LBSCROLL 5
+#define CBN_SHOWLIST 6
+#define CBN_ENTER 7
+
+#define WC_ENTRYFIELD ((PSZ)0xffff0006L)
+
+#ifndef INCL_SAADEFS
+typedef struct _ENTRYFDATA { /* efd */
+ USHORT cb;
+ USHORT cchEditLimit;
+ USHORT ichMinSel;
+ USHORT ichMaxSel;
+} ENTRYFDATA;
+typedef ENTRYFDATA FAR *PENTRYFDATA;
+
+#endif /* !INCL_SAADEFS */
+
+/* Entry Field messages */
+
+#define EM_QUERYCHANGED 0x0140
+#define EM_QUERYSEL 0x0141
+#define EM_SETSEL 0x0142
+#define EM_SETTEXTLIMIT 0x0143
+
+#ifndef INCL_SAADEFS
+#define EM_CUT 0x0144
+#define EM_COPY 0x0145
+#endif /* !INCL_SAADEFS */
+#define EM_CLEAR 0x0146
+#ifndef INCL_SAADEFS
+#define EM_PASTE 0x0147
+#endif /* !INCL_SAADEFS */
+#define EM_QUERYFIRSTCHAR 0x0148
+#define EM_SETFIRSTCHAR 0x0149
+#ifndef INCL_SAADEFS
+#define EM_QUERYREADONLY 0x014a
+#define EM_SETREADONLY 0x014b
+#define EM_SETINSERTMODE 0x014c
+#endif /* !INCL_SAADEFS */
+
+/* Entry Field notification messages */
+
+#define EN_SETFOCUS 0x0001
+#define EN_KILLFOCUS 0x0002
+#define EN_CHANGE 0x0004
+#define EN_SCROLL 0x0008
+#ifndef INCL_SAADEFS
+#define EN_MEMERROR 0x0010
+#define EN_OVERFLOW 0x0020
+#define EN_INSERTMODETOGGLE 0x0040
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINENTRYFIELDS */
+
+
+/* Multiple Line Entrys */
+#ifdef INCL_WINMLE
+#define WC_MLE ((PSZ)0xffff000aL)
+#include <pmmle.h>
+#endif /* !INCL_WINMLE */
+
+
+#ifdef INCL_WINLISTBOXES
+
+/**** Listboxes */
+
+/* List box styles */
+
+#define LS_MULTIPLESEL 0x00000001L
+
+#ifndef INCL_SAADEFS
+#define LS_OWNERDRAW 0x00000002L
+#endif /* !INCL_SAADEFS */
+
+#define LS_NOADJUSTPOS 0x00000004L
+#define LS_HORZSCROLL 0x00000008L
+
+
+/* Listbox class name */
+
+#define WC_LISTBOX ((PSZ)0xffff0007L)
+
+/* List box notification messages */
+
+#define LN_SELECT 1
+#define LN_SETFOCUS 2
+#define LN_KILLFOCUS 3
+#define LN_SCROLL 4
+#define LN_ENTER 5
+
+/* List box messages */
+
+#define LM_QUERYITEMCOUNT 0x0160
+#define LM_INSERTITEM 0x0161
+#define LM_SETTOPINDEX 0x0162
+#define LM_DELETEITEM 0x0163
+#define LM_SELECTITEM 0x0164
+#define LM_QUERYSELECTION 0x0165
+#define LM_SETITEMTEXT 0x0166
+#define LM_QUERYITEMTEXTLENGTH 0x0167
+#define LM_QUERYITEMTEXT 0x0168
+
+#define LM_SETITEMHANDLE 0x0169
+#define LM_QUERYITEMHANDLE 0x016a
+#define LM_SEARCHSTRING 0x016b
+#define LM_SETITEMHEIGHT 0x016c
+#define LM_QUERYTOPINDEX 0x016d
+#define LM_DELETEALL 0x016e
+
+/* List box constants */
+
+#define LIT_ERROR (-3)
+#define LIT_MEMERROR (-2)
+#define LIT_NONE (-1)
+#define LIT_FIRST (-1)
+
+/* For LM_INSERTITEM msg */
+
+#define LIT_END (-1)
+#define LIT_SORTASCENDING (-2)
+#define LIT_SORTDESCENDING (-3)
+
+/* For LM_SEARCHSTRING msg */
+
+#define LSS_SUBSTRING 0x0001
+#define LSS_PREFIX 0x0002
+#define LSS_CASESENSITIVE 0x0004
+
+
+#endif /* INCL_WINLISTBOXES */
+
+
+#ifdef INCL_WINMENUS
+
+/**** Menu Manager Subsection */
+
+/* Menu control styles */
+
+#define MS_ACTIONBAR 0x00000001L
+#define MS_TITLEBUTTON 0x00000002L
+#define MS_VERTICALFLIP 0x00000004L
+
+HWND APIENTRY WinLoadMenu(HWND hwndFrame, HMODULE hmod, USHORT idMenu);
+
+/* Menu class name */
+
+#define WC_MENU ((PSZ)0xffff0004L)
+
+/* Menu control messages */
+
+#define MM_INSERTITEM 0x0180
+#define MM_DELETEITEM 0x0181
+#define MM_QUERYITEM 0x0182
+#define MM_SETITEM 0x0183
+#define MM_QUERYITEMCOUNT 0x0184
+#define MM_STARTMENUMODE 0x0185
+#define MM_ENDMENUMODE 0x0186
+#define MM_DISMISSMENU 0x0187
+#define MM_REMOVEITEM 0x0188
+#define MM_SELECTITEM 0x0189
+#define MM_QUERYSELITEMID 0x018a
+#define MM_QUERYITEMTEXT 0x018b
+#define MM_QUERYITEMTEXTLENGTH 0x018c
+#define MM_SETITEMHANDLE 0x018d
+#define MM_SETITEMTEXT 0x018e
+#define MM_ITEMPOSITIONFROMID 0x018f
+#define MM_ITEMIDFROMPOSITION 0x0190
+#define MM_QUERYITEMATTR 0x0191
+#define MM_SETITEMATTR 0x0192
+#define MM_ISITEMVALID 0x0193
+
+HWND APIENTRY WinCreateMenu(HWND hwndParent, PVOID lpmt);
+
+/* Owner Item Structure (Also used for listboxes) */
+
+#ifndef INCL_SAADEFS
+typedef struct _OWNERITEM { /* oi */
+ HWND hwnd;
+ HPS hps;
+ USHORT fsState;
+ USHORT fsAttribute;
+ USHORT fsStateOld;
+ USHORT fsAttributeOld;
+ RECTL rclItem;
+ SHORT idItem; /* This field contains idItem for menus, iItem for lb. */
+ ULONG hItem;
+} OWNERITEM;
+typedef OWNERITEM FAR *POWNERITEM;
+#endif /* !INCL_SAADEFS */
+
+/* Menu item */
+
+typedef struct _MENUITEM { /* mi */
+ SHORT iPosition;
+ USHORT afStyle;
+ USHORT afAttribute;
+ USHORT id;
+ HWND hwndSubMenu;
+ ULONG hItem;
+} MENUITEM;
+typedef MENUITEM FAR *PMENUITEM;
+
+#define MIT_END (-1)
+#define MIT_NONE (-1)
+#define MIT_MEMERROR (-1)
+#define MIT_ERROR (-1)
+#define MID_NONE MIT_NONE
+#define MID_ERROR (-1)
+
+/* Menu item styles & attributes */
+
+#define MIS_TEXT 0x0001
+
+#ifndef INCL_SAADEFS
+#define MIS_BITMAP 0x0002
+#endif /* !INCL_SAADEFS */
+#define MIS_SEPARATOR 0x0004
+
+#ifndef INCL_SAADEFS
+#define MIS_OWNERDRAW 0x0008
+#endif /* !INCL_SAADEFS */
+
+#define MIS_SUBMENU 0x0010
+#define MIS_MULTMENU 0x0020 /* multiple choice submenu */
+#define MIS_SYSCOMMAND 0x0040
+#define MIS_HELP 0x0080
+#define MIS_STATIC 0x0100
+#define MIS_BUTTONSEPARATOR 0x0200
+#define MIS_BREAK 0x0400
+#define MIS_BREAKSEPARATOR 0x0800
+#define MIS_GROUP 0x1000 /* multiple choice group start */
+/* In multiple choice submenus a style of 'single' denotes the item is a
+** radiobutton. Absence of this style defaults the item to a checkbox. */
+#define MIS_SINGLE 0x2000
+
+#define MIA_NODISMISS 0x0020
+#define MIA_FRAMED 0x1000
+#define MIA_CHECKED 0x2000
+#define MIA_DISABLED 0x4000
+#define MIA_HILITED 0x8000
+
+#endif /* INCL_WINMENUS */
+
+
+#ifdef INCL_WINSCROLLBARS
+
+/*** Scroll Bar controls Subsection */
+
+/* Scroll Bar styles */
+
+#define SBS_HORZ 0L
+#define SBS_VERT 1L
+#define SBS_THUMBSIZE 2L
+#define SBS_AUTOTRACK 4L
+
+/* Scroll bar class name */
+
+
+#define WC_SCROLLBAR ((PSZ)0xffff0008L)
+
+/* Scroll Bar messages */
+
+#define SBM_SETSCROLLBAR 0x01a0
+#define SBM_SETPOS 0x01a1
+#define SBM_QUERYPOS 0x01a2
+#define SBM_QUERYRANGE 0x01a3
+#define SBM_SETTHUMBSIZE 0x01a6
+
+/* Scroll Bar Commands */
+
+#define SB_LINEUP 1
+#define SB_LINEDOWN 2
+#define SB_LINELEFT 1
+#define SB_LINERIGHT 2
+#define SB_PAGEUP 3
+#define SB_PAGEDOWN 4
+#define SB_PAGELEFT 3
+#define SB_PAGERIGHT 4
+#define SB_SLIDERTRACK 5
+#define SB_SLIDERPOSITION 6
+#define SB_ENDSCROLL 7
+
+
+#ifndef INCL_SAADEFS
+typedef struct _SBCDATA { /* sbcd */
+ USHORT cb;
+ USHORT sHilite; /* reserved, should be set to zero */
+ SHORT posFirst;
+ SHORT posLast;
+ SHORT posThumb;
+ SHORT cVisible;
+ SHORT cTotal;
+} SBCDATA;
+typedef SBCDATA FAR *PSBCDATA;
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINSCROLLBARS */
+
+
+#if (defined(INCL_WINFRAMEMGR) || !defined(INCL_NOCOMMON))
+/*** Frame Manager Common subsection */
+
+typedef struct _FRAMECDATA { /* fcdata */
+ USHORT cb;
+ ULONG flCreateFlags;
+ HMODULE hmodResources;
+ USHORT idResources;
+} FRAMECDATA;
+typedef FRAMECDATA FAR *PFRAMECDATA;
+
+/* Frame window styles */
+
+#define FCF_TITLEBAR 0x00000001L
+#define FCF_SYSMENU 0x00000002L
+#define FCF_MENU 0x00000004L
+#define FCF_SIZEBORDER 0x00000008L
+#define FCF_MINBUTTON 0x00000010L
+#define FCF_MAXBUTTON 0x00000020L
+#define FCF_MINMAX 0x00000030L /* minmax means BOTH buttons */
+#define FCF_VERTSCROLL 0x00000040L
+#define FCF_HORZSCROLL 0x00000080L
+#define FCF_DLGBORDER 0x00000100L
+#define FCF_BORDER 0x00000200L
+#define FCF_SHELLPOSITION 0x00000400L
+#define FCF_TASKLIST 0x00000800L
+#define FCF_NOBYTEALIGN 0x00001000L
+#define FCF_NOMOVEWITHOWNER 0x00002000L
+#define FCF_ICON 0x00004000L
+#define FCF_ACCELTABLE 0x00008000L
+#define FCF_SYSMODAL 0x00010000L
+#define FCF_SCREENALIGN 0x00020000L
+#define FCF_MOUSEALIGN 0x00040000L
+/* New values to enable multiple palettes. Note that if none of the four */
+/* styles specified below are used then we default to the 'system' palette */
+#define FCF_PALETTE_NORMAL 0x00080000L /* normal palette */
+#define FCF_PALETTE_HELP 0x00100000L /* help palette */
+#define FCF_PALETTE_POPUPODD 0x00200000L /* odd level popup palette */
+#define FCF_PALETTE_POPUPEVEN 0x00400000L /* even level popup palette */
+/* FCF_ 0x00800000L is reserved */
+#ifdef INCL_NLS
+#define FCF_DBE_APPSTAT 0x80000000L
+#endif /* INCL_NLS */
+
+/* FCF_TITLEBAR | FCF_SYSMENU | FCF_MENU | FCF_SIZEBORDER | FCF_MINMAX |
+ FCF_ICON | FCF_ACCELTABLE | FCF_SHELLPOSITION | FCF_TASKLIST | FCF_PALETTE_NORMAL */
+#define FCF_STANDARD 0x0008CC3FL
+
+
+#define FS_ICON 0x00000001L
+#define FS_ACCELTABLE 0x00000002L
+
+#ifndef INCL_SAADEFS
+#define FS_SHELLPOSITION 0x00000004L
+#endif /* !INCL_SAADEFS */
+
+#define FS_TASKLIST 0x00000008L
+#define FS_NOBYTEALIGN 0x00000010L
+#define FS_NOMOVEWITHOWNER 0x00000020L
+#define FS_SYSMODAL 0x00000040L
+#define FS_DLGBORDER 0x00000080L
+#define FS_BORDER 0x00000100L
+#define FS_SCREENALIGN 0x00000200L
+#define FS_MOUSEALIGN 0x00000400L
+#define FS_SIZEBORDER 0x00000800L
+#ifdef INCL_NLS
+#define FS_DBE_APPSTAT 0x00008000L
+#endif /* INCL_NLS */
+
+/* FS_ICON | FS_ACCELTABLE | FS_SHELLPOSITION | FS_TASKLIST */
+#define FS_STANDARD 0x0000000FL
+
+
+/* Frame Window Flags accessed via WinSet/QueryWindowUShort(QWS_FLAGS) */
+
+#ifndef INCL_SAADEFS
+#define FF_FLASHWINDOW 0x0001
+#define FF_ACTIVE 0x0002
+#define FF_FLASHHILITE 0x0004
+#define FF_OWNERHIDDEN 0x0008
+#define FF_DLGDISMISSED 0x0010
+#define FF_OWNERDISABLED 0x0020
+#define FF_SELECTED 0x0040
+#define FF_NOACTIVATESWP 0x0080
+#endif /* !INCL_SAADEFS */
+
+
+HWND APIENTRY WinCreateStdWindow(HWND hwndParent, ULONG flStyle,
+ PULONG pflCreateFlags, PSZ pszClientClass,
+ PSZ pszTitle, ULONG styleClient, HMODULE hmod,
+ USHORT idResources, PHWND phwndClient);
+
+
+#endif /* Frame Manager Common subsection */
+
+
+#ifdef INCL_WINFRAMEMGR
+
+BOOL APIENTRY WinFlashWindow(HWND hwndFrame, BOOL fFlash);
+
+/* Frame window related messages */
+
+#define WM_FLASHWINDOW 0x0040
+#define WM_FORMATFRAME 0x0041
+#define WM_UPDATEFRAME 0x0042
+#define WM_FOCUSCHANGE 0x0043
+
+#define WM_SETBORDERSIZE 0x0044
+#define WM_TRACKFRAME 0x0045
+#define WM_MINMAXFRAME 0x0046
+#define WM_SETICON 0x0047
+#define WM_QUERYICON 0x0048
+#define WM_SETACCELTABLE 0x0049
+#define WM_QUERYACCELTABLE 0x004a
+#define WM_TRANSLATEACCEL 0x004b
+#define WM_QUERYTRACKINFO 0x004c
+#define WM_QUERYBORDERSIZE 0x004d
+#define WM_NEXTMENU 0x004e
+#define WM_ERASEBACKGROUND 0x004f
+#define WM_QUERYFRAMEINFO 0x0050
+/* Note 0x0051/5 are reserved */
+#define WM_QUERYFOCUSCHAIN 0x0051
+#define WM_CALCFRAMERECT 0x0053
+#define WM_WINDOWPOSCHANGED 0x0055
+#define WM_QUERYFRAMECTLCOUNT 0x0059
+#ifndef INCL_SAADEFS
+/* Note 0x005A is reserved */
+#define WM_QUERYHELPINFO 0x005B
+#define WM_SETHELPINFO 0x005C
+#define WM_ERROR 0x005D
+
+
+/* WM_QUERYFRAMEINFO constants */
+
+#define FI_FRAME 0x00000001L
+#define FI_OWNERHIDE 0x00000002L
+#define FI_ACTIVATEOK 0x00000004L
+#define FI_NOMOVEWITHOWNER 0x00000008L
+
+
+#endif /* !INCL_SAADEFS */
+
+/* Frame class name */
+
+#define WC_FRAME ((PSZ)0xffff0001L)
+
+BOOL APIENTRY WinCreateFrameControls(HWND hwndFrame, PFRAMECDATA pfcdata,
+ PSZ pszTitle);
+
+BOOL APIENTRY WinCalcFrameRect(HWND hwndFrame, PRECTL prcl, BOOL fClient);
+
+BOOL APIENTRY WinGetMinPosition(HWND hwnd, PSWP pswp, PPOINTL pptl);
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinGetMaxPosition(HWND hwnd, PSWP pswp);
+#endif /* !INCL_SAADEFS */
+
+/* Frame control IDs */
+
+#define FID_SYSMENU 0x8002
+#define FID_TITLEBAR 0x8003
+#define FID_MINMAX 0x8004
+#define FID_MENU 0x8005
+#define FID_VERTSCROLL 0x8006
+#define FID_HORZSCROLL 0x8007
+#define FID_CLIENT 0x8008
+/* Note 0x8009 is reserved */
+#define FID_DBE_APPSTAT 0x8010
+#define FID_DBE_KBDSTAT 0x8011
+#define FID_DBE_PECIC 0x8012
+#define FID_DBE_KKPOPUP 0x8013
+
+/* Standard WM_SYSCOMMAND command values */
+
+#define SC_SIZE 0x8000
+#define SC_MOVE 0x8001
+#define SC_MINIMIZE 0x8002
+#define SC_MAXIMIZE 0x8003
+#define SC_CLOSE 0x8004
+#define SC_NEXT 0x8005
+#define SC_APPMENU 0x8006
+#define SC_SYSMENU 0x8007
+#define SC_RESTORE 0x8008
+#define SC_NEXTFRAME 0x8009
+#define SC_NEXTWINDOW 0x8010
+#ifndef INCL_SAADEFS
+#define SC_TASKMANAGER 0x8011
+#define SC_HELPKEYS 0x8012
+#define SC_HELPINDEX 0x8013
+#define SC_HELPEXTENDED 0x8014
+#define SC_SWITCHPANELIDS 0x8015
+#define SC_DBE_FIRST 0x8018
+#define SC_DBE_LAST 0x801F
+
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINFRAMEMGR */
+
+/*** Frame controls */
+
+#ifdef INCL_WINFRAMECTLS
+
+/** Title bar controls */
+
+/* Title bar control class name */
+
+#define WC_TITLEBAR ((PSZ)0xffff0009L)
+
+/* Title bar control messages */
+
+#define TBM_SETHILITE 0x01e3
+#define TBM_QUERYHILITE 0x01e4
+#define TBM_TRACKMOVE 0x01e5
+
+#endif /* INCL_WINFRAMECTLS */
+
+#ifdef INCL_WINRECTANGLES
+/*** Rectangle routines */
+
+BOOL APIENTRY WinCopyRect(HAB hab, PRECTL prclDst, PRECTL prclSrc);
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinSetRect(HAB hab, PRECTL prcl, SHORT xLeft, SHORT yBottom,
+ SHORT xRight, SHORT yTop);
+BOOL APIENTRY WinIsRectEmpty(HAB hab, PRECTL prcl);
+BOOL APIENTRY WinEqualRect(HAB hab, PRECTL prcl1, PRECTL prcl2);
+BOOL APIENTRY WinSetRectEmpty(HAB hab, PRECTL prcl);
+BOOL APIENTRY WinOffsetRect(HAB hab, PRECTL prcl, SHORT cx, SHORT cy);
+BOOL APIENTRY WinInflateRect(HAB hab, PRECTL prcl, SHORT cx, SHORT cy);
+BOOL APIENTRY WinPtInRect(HAB hab, PRECTL prcl, PPOINTL pptl);
+BOOL APIENTRY WinIntersectRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
+ PRECTL prclSrc2);
+BOOL APIENTRY WinUnionRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
+ PRECTL prclSrc2);
+BOOL APIENTRY WinSubtractRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
+ PRECTL prclSrc2);
+BOOL APIENTRY WinMakeRect(HAB hab, PWRECT pwrc);
+BOOL APIENTRY WinMakePoints(HAB hab, PWPOINT pwpt, USHORT cwpt);
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINRECTANGLES */
+
+
+#ifdef INCL_WINSYS
+
+/*** System values */
+
+LONG APIENTRY WinQuerySysValue(HWND hwndDesktop, SHORT iSysValue);
+BOOL APIENTRY WinSetSysValue(HWND hwndDesktop, SHORT iSysValue, LONG lValue);
+
+#define SV_SWAPBUTTON 0
+#define SV_DBLCLKTIME 1
+#define SV_CXDBLCLK 2
+#define SV_CYDBLCLK 3
+#define SV_CXSIZEBORDER 4
+#define SV_CYSIZEBORDER 5
+#define SV_ALARM 6
+
+#ifndef INCL_SAADEFS
+#define SV_RESERVEDFIRST1 7
+#define SV_RESERVEDLAST1 8
+#endif /* !INCL_SAADEFS */
+
+#define SV_CURSORRATE 9
+#define SV_FIRSTSCROLLRATE 10
+#define SV_SCROLLRATE 11
+#define SV_NUMBEREDLISTS 12
+#define SV_WARNINGFREQ 13
+#define SV_NOTEFREQ 14
+#define SV_ERRORFREQ 15
+#define SV_WARNINGDURATION 16
+#define SV_NOTEDURATION 17
+#define SV_ERRORDURATION 18
+
+#ifndef INCL_SAADEFS
+#define SV_RESERVEDFIRST 19
+#define SV_RESERVEDLAST 19
+#endif /* !INCL_SAADEFS */
+
+#define SV_CXSCREEN 20
+#define SV_CYSCREEN 21
+#define SV_CXVSCROLL 22
+#define SV_CYHSCROLL 23
+#define SV_CYVSCROLLARROW 24
+#define SV_CXHSCROLLARROW 25
+#define SV_CXBORDER 26
+#define SV_CYBORDER 27
+#define SV_CXDLGFRAME 28
+#define SV_CYDLGFRAME 29
+#define SV_CYTITLEBAR 30
+#define SV_CYVSLIDER 31
+#define SV_CXHSLIDER 32
+#define SV_CXMINMAXBUTTON 33
+#define SV_CYMINMAXBUTTON 34
+#define SV_CYMENU 35
+#define SV_CXFULLSCREEN 36
+#define SV_CYFULLSCREEN 37
+#define SV_CXICON 38
+#define SV_CYICON 39
+#define SV_CXPOINTER 40
+#define SV_CYPOINTER 41
+
+#define SV_DEBUG 42
+#define SV_CMOUSEBUTTONS 43
+#define SV_POINTERLEVEL 44
+#define SV_CURSORLEVEL 45
+#define SV_TRACKRECTLEVEL 46
+
+#ifndef INCL_SAADEFS
+#define SV_CTIMERS 47
+#endif /* !INCL_SAADEFS */
+
+#define SV_MOUSEPRESENT 48
+
+#define SV_CXBYTEALIGN 49
+#define SV_CYBYTEALIGN 50
+
+/* The following value enables any greater value to be set by WinSetSysVlaue. */
+/* Values of 51-55 are spare for extra non-settable system values */
+/* This is to enable the setting of SV_EXTRAKEYBEEP by applications. */
+
+#define SV_NOTRESERVED 56
+#define SV_EXTRAKEYBEEP 57
+
+/* The following system value controls whether PM controls the keyboard */
+/* lights for light key keystrokes (else applications will) */
+#define SV_SETLIGHTS 58
+#define SV_INSERTMODE 59
+
+
+#define SV_MENUROLLDOWNDELAY 64
+#define SV_MENUROLLUPDELAY 65
+#define SV_ALTMNEMONIC 66
+#define SV_TASKLISTMOUSEACCESS 67
+/* The following is the total number of system values */
+#define SV_CSYSVALUES 68
+
+#define SV_CPOINTERBUTTONS 69
+#define SV_CXALIGN 70
+#define SV_CYALIGN 71
+#define SV_MNEMONICSENABLED 72
+
+/*
+ * Presentation parameter structures.
+ */
+typedef struct _PARAM { /* param */
+ ULONG id;
+ ULONG cb;
+ BYTE ab[1];
+} PARAM;
+typedef PARAM NEAR *NPPARAM;
+typedef PARAM FAR *PPARAM;
+
+typedef struct _PRESPARAMS { /* pres */
+ ULONG cb;
+ PARAM aparam[1];
+} PRESPARAMS;
+typedef PRESPARAMS NEAR *NPPRESPARAMS;
+typedef PRESPARAMS FAR *PPRESPARAMS;
+
+
+/*
+ * Presentation parameter APIs
+ */
+BOOL APIENTRY WinSetPresParam(HWND hwnd, ULONG id, ULONG cbParam, PVOID pbParam);
+ULONG APIENTRY WinQueryPresParam(HWND hwnd, ULONG id1, ULONG id2, PULONG pulId,
+ ULONG cbBuf, PVOID pbBuf, USHORT fs);
+BOOL APIENTRY WinRemovePresParam(HWND hwnd, ULONG id);
+
+/*
+ * Presentation parameter types.
+ */
+
+#define PP_FOREGROUNDCOLOR 1L
+#define PP_FOREGROUNDCOLORINDEX 2L
+#define PP_BACKGROUNDCOLOR 3L
+#define PP_BACKGROUNDCOLORINDEX 4L
+#define PP_HILITEFOREGROUNDCOLOR 5L
+#define PP_HILITEFOREGROUNDCOLORINDEX 6L
+#define PP_HILITEBACKGROUNDCOLOR 7L
+#define PP_HILITEBACKGROUNDCOLORINDEX 8L
+#define PP_DISABLEDFOREGROUNDCOLOR 9L
+#define PP_DISABLEDFOREGROUNDCOLORINDEX 10L
+#define PP_DISABLEDBACKGROUNDCOLOR 11L
+#define PP_DISABLEDBACKGROUNDCOLORINDEX 12L
+#define PP_BORDERCOLOR 13L
+#define PP_BORDERCOLORINDEX 14L
+#define PP_FONTNAMESIZE 15L
+#define PP_FONTHANDLE 16L
+
+/*
+ * Flags for WinQueryPresParams()
+ */
+#define QPF_NOINHERIT 0x0001 /* Don't inherit */
+#define QPF_ID1COLORINDEX 0x0002 /* Convert id1 color index into RGB */
+#define QPF_ID2COLORINDEX 0x0004 /* Convert id2 color index into RGB */
+#define QPF_PURERGBCOLOR 0x0008 /* Return pure RGB colors */
+#define QPF_VALIDFLAGS 0x000F /* Valid WinQueryPresParams() flags. */
+
+/*** System color functions */
+
+LONG APIENTRY WinQuerySysColor(HWND hwndDesktop, LONG clr, LONG lReserved);
+BOOL APIENTRY WinSetSysColors(HWND hwndDesktop, ULONG flOptions,
+ ULONG flFormat, LONG clrFirst, ULONG cclr,
+ PLONG pclr);
+#define SYSCLR_BUTTONLIGHT (-41L)
+#define SYSCLR_BUTTONMIDDLE (-40L)
+#define SYSCLR_BUTTONDARK (-39L)
+#define SYSCLR_BUTTONDEFAULT (-38L)
+#define SYSCLR_TITLEBOTTOM (-37L)
+#define SYSCLR_SHADOW (-36L)
+#define SYSCLR_ICONTEXT (-35L)
+#define SYSCLR_DIALOGBACKGROUND (-34L)
+#define SYSCLR_HILITEFOREGROUND (-33L)
+#define SYSCLR_HILITEBACKGROUND (-32L)
+#define SYSCLR_INACTIVETITLETEXTBGND (-31L)
+#define SYSCLR_ACTIVETITLETEXTBGND (-30L)
+#define SYSCLR_INACTIVETITLETEXT (-29L)
+#define SYSCLR_ACTIVETITLETEXT (-28L)
+#define SYSCLR_OUTPUTTEXT (-27L)
+#define SYSCLR_WINDOWSTATICTEXT (-26L)
+#define SYSCLR_SCROLLBAR (-25L)
+#define SYSCLR_BACKGROUND (-24L)
+#define SYSCLR_ACTIVETITLE (-23L)
+#define SYSCLR_INACTIVETITLE (-22L)
+#define SYSCLR_MENU (-21L)
+#define SYSCLR_WINDOW (-20L)
+#define SYSCLR_WINDOWFRAME (-19L)
+#define SYSCLR_MENUTEXT (-18L)
+#define SYSCLR_WINDOWTEXT (-17L)
+#define SYSCLR_TITLETEXT (-16L)
+#define SYSCLR_ACTIVEBORDER (-15L)
+#define SYSCLR_INACTIVEBORDER (-14L)
+#define SYSCLR_APPWORKSPACE (-13L)
+#define SYSCLR_HELPBACKGROUND (-12L)
+#define SYSCLR_HELPTEXT (-11L)
+#define SYSCLR_HELPHILITE (-10L)
+
+#define SYSCLR_CSYSCOLORS 32L
+
+#endif /* INCL_WINSYS */
+
+
+#ifdef INCL_WINTIMER
+/**** Timer manager */
+
+#ifndef INCL_SAADEFS
+USHORT APIENTRY WinStartTimer(HAB hab, HWND hwnd, USHORT idTimer,
+ USHORT dtTimeout);
+BOOL APIENTRY WinStopTimer(HAB hab, HWND hwnd, USHORT idTimer);
+ULONG APIENTRY WinGetCurrentTime(HAB hab);
+
+#define TID_CURSOR 0xffff /* Reserved cursor timer ID */
+#define TID_SCROLL 0xfffe /* Reserved scrolling timer ID */
+#define TID_FLASHWINDOW 0xfffd /* Reserved for window flashing timer ID */
+#define TID_USERMAX 0x7fff /* Maximum user timer ID */
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINTIMER */
+
+
+#ifdef INCL_WINACCELERATORS
+/**** Accelerator functions */
+
+/* ACCEL fs bits
+ *
+ * NOTE: the first six AF_ code bits have the same value
+ * as their KC_ counterparts
+ */
+#ifndef INCL_SAADEFS
+#define AF_CHAR 0x0001
+#define AF_VIRTUALKEY 0x0002
+#define AF_SCANCODE 0x0004
+#define AF_SHIFT 0x0008
+#define AF_CONTROL 0x0010
+#define AF_ALT 0x0020
+#define AF_LONEKEY 0x0040
+#define AF_SYSCOMMAND 0x0100
+#define AF_HELP 0x0200
+#endif /* !INCL_SAADEFS */
+
+typedef LHANDLE HACCEL; /* haccel */
+
+typedef struct _ACCEL { /* acc */
+ USHORT fs;
+ USHORT key;
+ USHORT cmd;
+} ACCEL;
+typedef ACCEL FAR *PACCEL;
+
+typedef struct _ACCELTABLE { /* acct */
+ USHORT cAccel;
+ USHORT codepage;
+ ACCEL aaccel[1];
+} ACCELTABLE;
+typedef ACCELTABLE FAR *PACCELTABLE;
+
+HACCEL APIENTRY WinLoadAccelTable(HAB hab, HMODULE hmod, USHORT idAccelTable);
+HACCEL APIENTRY WinCreateAccelTable(HAB hab, PACCELTABLE pAccelTable);
+BOOL APIENTRY WinDestroyAccelTable(HACCEL haccel);
+USHORT APIENTRY WinCopyAccelTable(HACCEL haccel, PACCELTABLE pAccelTable,
+ USHORT cbCopyMax);
+BOOL APIENTRY WinTranslateAccel(HAB hab, HWND hwnd, HACCEL haccel,
+ PQMSG pqmsg);
+BOOL APIENTRY WinSetAccelTable(HAB hab, HACCEL haccel, HWND hwndFrame);
+HACCEL APIENTRY WinQueryAccelTable(HAB hab, HWND hwndFrame);
+
+#endif /* INCL_WINACCELERATORS */
+
+/**** Extended Attribute Flags (Association Table) */
+
+#define EAF_DEFAULTOWNER 0x0001
+#define EAF_UNCHANGEABLE 0x0002
+#define EAF_REUSEICON 0x0004
+
+/*** WinTrackRect() information */
+
+#ifdef INCL_WINTRACKRECT
+
+/* WinTrackRect() tracking information structure */
+
+typedef struct _TRACKINFO { /* ti */
+ SHORT cxBorder;
+ SHORT cyBorder;
+ SHORT cxGrid;
+ SHORT cyGrid;
+ SHORT cxKeyboard;
+ SHORT cyKeyboard;
+ RECTL rclTrack;
+ RECTL rclBoundary;
+ POINTL ptlMinTrackSize;
+ POINTL ptlMaxTrackSize;
+ USHORT fs;
+} TRACKINFO;
+typedef TRACKINFO FAR *PTRACKINFO;
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinTrackRect(HWND hwnd, HPS hps, PTRACKINFO pti);
+BOOL APIENTRY WinShowTrackRect(HWND hwnd, BOOL fShow);
+
+/* WinTrackRect() flags */
+
+#define TF_LEFT 0x0001
+#define TF_TOP 0x0002
+#define TF_RIGHT 0x0004
+#define TF_BOTTOM 0x0008
+/* TF_MOVE = TF_LEFT | TF_TOP | TF_RIGHT | TF_BOTTOM */
+#define TF_MOVE 0x000F
+
+#define TF_SETPOINTERPOS 0x0010
+#define TF_GRID 0x0020
+#define TF_STANDARD 0x0040
+#define TF_ALLINBOUNDARY 0x0080
+#define TF_VALIDATETRACKRECT 0x0100
+#define TF_PARTINBOUNDARY 0x0200
+
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINTRACKRECT */
+
+
+/**** Clipboard Manager */
+
+#ifdef INCL_WINCLIPBOARD
+
+/* Clipboard messages */
+
+#ifndef INCL_SAADEFS
+#define WM_RENDERFMT 0x0060
+#define WM_RENDERALLFMTS 0x0061
+#define WM_DESTROYCLIPBOARD 0x0062
+#define WM_PAINTCLIPBOARD 0x0063
+#define WM_SIZECLIPBOARD 0x0064
+#define WM_HSCROLLCLIPBOARD 0x0065
+#define WM_VSCROLLCLIPBOARD 0x0066
+#define WM_DRAWCLIPBOARD 0x0067
+
+/* Standard Clipboard formats */
+
+#define CF_TEXT 1
+#define CF_BITMAP 2
+#define CF_DSPTEXT 3
+#define CF_DSPBITMAP 4
+#define CF_METAFILE 5
+#define CF_DSPMETAFILE 6
+
+BOOL APIENTRY WinSetClipbrdOwner(HAB hab, HWND hwnd);
+BOOL APIENTRY WinSetClipbrdData(HAB hab, ULONG ulData, USHORT fmt, USHORT rgfFmtInfo);
+ULONG APIENTRY WinQueryClipbrdData(HAB hab, USHORT fmt);
+BOOL APIENTRY WinQueryClipbrdFmtInfo(HAB hab, USHORT fmt,
+ PUSHORT prgfFmtInfo);
+BOOL APIENTRY WinSetClipbrdViewer(HAB hab, HWND hwndNewClipViewer);
+
+/* WinSetClipbrdData() flags */
+
+#define CFI_OWNERFREE 0x0001
+#define CFI_OWNERDISPLAY 0x0002
+#define CFI_SELECTOR 0x0100
+#define CFI_HANDLE 0x0200
+
+#endif /* !INCL_SAADEFS */
+
+USHORT APIENTRY WinEnumClipbrdFmts(HAB hab, USHORT fmt);
+BOOL APIENTRY WinEmptyClipbrd(HAB hab);
+BOOL APIENTRY WinOpenClipbrd(HAB hab);
+BOOL APIENTRY WinCloseClipbrd(HAB hab);
+HWND APIENTRY WinQueryClipbrdOwner(HAB hab, BOOL fLock);
+HWND APIENTRY WinQueryClipbrdViewer(HAB hab, BOOL fLock);
+
+#endif /* INCL_WINCLIPBOARD */
+
+
+#if (defined(INCL_WINCURSORS) || !defined(INCL_NOCOMMON))
+/**** Cursor manager common subsection */
+
+BOOL APIENTRY WinDestroyCursor(HWND hwnd);
+BOOL APIENTRY WinShowCursor(HWND hwnd, BOOL fShow);
+BOOL APIENTRY WinCreateCursor(HWND hwnd, SHORT x, SHORT y, SHORT cx, SHORT cy,
+ USHORT fs, PRECTL prclClip);
+
+/* WinCreateCursor() flags */
+
+#define CURSOR_SOLID 0x0000
+#define CURSOR_HALFTONE 0x0001
+#define CURSOR_FRAME 0x0002
+#define CURSOR_FLASH 0x0004
+#define CURSOR_SETPOS 0x8000
+
+
+#endif /* Cursor manager common subsection */
+
+#ifdef INCL_WINCURSORS
+
+typedef struct _CURSORINFO { /* csri */
+ HWND hwnd;
+ SHORT x;
+ SHORT y;
+ SHORT cx;
+ SHORT cy;
+ USHORT fs;
+ RECTL rclClip;
+} CURSORINFO;
+typedef CURSORINFO FAR *PCURSORINFO;
+
+BOOL APIENTRY WinQueryCursorInfo(HWND hwndDesktop, PCURSORINFO pCursorInfo);
+
+#endif /* INCL_WINCURSORS */
+
+typedef LHANDLE HPOINTER; /* hptr */
+
+#ifdef INCL_WINPOINTERS
+/**** Pointer manager */
+
+BOOL APIENTRY WinSetPointer(HWND hwndDesktop, HPOINTER hptrNew);
+BOOL APIENTRY WinShowPointer(HWND hwndDesktop, BOOL fShow);
+HPOINTER APIENTRY WinQuerySysPointer(HWND hwndDesktop, SHORT iptr, BOOL fLoad);
+
+
+/* System pointers (NOTE: these are 1-based) */
+
+#ifdef LATER
+
+#define SPTR_ARROW 1
+#define SPTR_TEXT 2
+#define SPTR_WAIT 3
+#define SPTR_MOVE 4
+#define SPTR_SIZENWSE 5
+#define SPTR_SIZENESW 6
+#define SPTR_SIZEWE 7
+#define SPTR_SIZENS 8
+#define SPTR_APPICON 9
+
+#define SPTR_ICONINFORMATION 10
+#define SPTR_ICONQUESTION 11
+#define SPTR_ICONERROR 12
+#define SPTR_ICONWARNING 13
+
+#define SPTR_CPTR 13 /* Count of pointers loaded by PMWIN */
+
+#define SPTR_ILLEGAL 14
+#define SPTR_FILE 15
+#define SPTR_FOLDER 16
+#define SPTR_MULTFILE 17
+#define SPTR_PROGRAM 18
+
+#else
+
+#define SPTR_ARROW 1
+#define SPTR_TEXT 2
+#define SPTR_WAIT 3
+#define SPTR_SIZE 4
+#define SPTR_MOVE 5
+#define SPTR_SIZENWSE 6
+#define SPTR_SIZENESW 7
+#define SPTR_SIZEWE 8
+#define SPTR_SIZENS 9
+#define SPTR_APPICON 10
+#define SPTR_ICONINFORMATION 11
+#define SPTR_ICONQUESTION 12
+#define SPTR_ICONERROR 13
+#define SPTR_ICONWARNING 14
+#define SPTR_CPTR 14 /* count loaded by pmwin */
+
+#define SPTR_ILLEGAL 18
+#define SPTR_FILE 19
+#define SPTR_FOLDER 20
+#define SPTR_MULTFILE 21
+#define SPTR_PROGRAM 22
+
+/* backward compatibility */
+#define SPTR_HANDICON SPTR_ICONERROR
+#define SPTR_QUESICON SPTR_ICONQUESTION
+#define SPTR_BANGICON SPTR_ICONWARNING
+#define SPTR_NOTEICON SPTR_ICONINFORMATION
+
+#endif /* LATER */
+
+
+
+HPOINTER APIENTRY WinLoadPointer(HWND hwndDesktop, HMODULE hmod, USHORT idres);
+BOOL APIENTRY WinDestroyPointer(HPOINTER hptr);
+HPOINTER APIENTRY WinCreatePointer(HWND hwndDesktop, HBITMAP hbmPointer,
+ BOOL fPointer, SHORT xHotspot,
+ SHORT yHotspot);
+
+HPOINTER APIENTRY WinQueryPointer(HWND hwndDesktop);
+BOOL APIENTRY WinSetPointerPos(HWND hwndDesktop, SHORT x, SHORT y);
+BOOL APIENTRY WinQueryPointerPos(HWND hwndDesktop, PPOINTL pptl);
+
+typedef struct _POINTERINFO { /* ptri */
+ BOOL fPointer;
+ SHORT xHotspot;
+ SHORT yHotspot;
+ HBITMAP hbmPointer;
+ HBITMAP hbmColor;
+} POINTERINFO;
+typedef POINTERINFO FAR *PPOINTERINFO;
+
+HPOINTER APIENTRY WinCreatePointerIndirect(HWND hwndDesktop, PPOINTERINFO pptri);
+BOOL APIENTRY WinQueryPointerInfo(HPOINTER hptr,
+ PPOINTERINFO pPointerInfo);
+BOOL APIENTRY WinDrawPointer(HPS hps, SHORT x, SHORT y, HPOINTER hptr,
+ USHORT fs);
+
+
+
+/* WinDrawPointer() constants */
+
+#define DP_NORMAL 0x0000
+#define DP_HALFTONED 0x0001
+#define DP_INVERTED 0x0002
+
+
+HBITMAP APIENTRY WinGetSysBitmap(HWND hwndDesktop, USHORT ibm);
+
+/* System bitmaps (NOTE: these are 1-based) */
+
+#define SBMP_OLD_SYSMENU 1
+#define SBMP_OLD_SBUPARROW 2
+#define SBMP_OLD_SBDNARROW 3
+#define SBMP_OLD_SBRGARROW 4
+#define SBMP_OLD_SBLFARROW 5
+#define SBMP_MENUCHECK 6
+#define SBMP_CHECKBOXES 7
+#define SBMP_BTNCORNERS 8
+#define SBMP_OLD_MINBUTTON 9
+#define SBMP_OLD_MAXBUTTON 10
+#define SBMP_OLD_RESTOREBUTTON 11
+#define SBMP_OLD_CHILDSYSMENU 12
+#define SBMP_DRIVE 15
+#define SBMP_FILE 16
+#define SBMP_FOLDER 17
+#define SBMP_TREEPLUS 18
+#define SBMP_TREEMINUS 19
+#define SBMP_PROGRAM 22
+#define SBMP_MENUATTACHED 23
+#define SBMP_SIZEBOX 24
+
+#define SBMP_SYSMENU 25
+#define SBMP_MINBUTTON 26
+#define SBMP_MAXBUTTON 27
+#define SBMP_RESTOREBUTTON 28
+#define SBMP_CHILDSYSMENU 29
+#define SBMP_SYSMENUDEP 30
+#define SBMP_MINBUTTONDEP 31
+#define SBMP_MAXBUTTONDEP 32
+#define SBMP_RESTOREBUTTONDEP 33
+#define SBMP_CHILDSYSMENUDEP 34
+#define SBMP_SBUPARROW 35
+#define SBMP_SBDNARROW 36
+#define SBMP_SBLFARROW 37
+#define SBMP_SBRGARROW 38
+#define SBMP_SBUPARROWDEP 39
+#define SBMP_SBDNARROWDEP 40
+#define SBMP_SBLFARROWDEP 41
+#define SBMP_SBRGARROWDEP 42
+#define SBMP_SBUPARROWDIS 43
+#define SBMP_SBDNARROWDIS 44
+#define SBMP_SBLFARROWDIS 45
+#define SBMP_SBRGARROWDIS 46
+#define SBMP_COMBODOWN 47
+
+#endif /* INCL_WINPOINTERS */
+
+
+/**** Hook manager */
+
+#ifdef INCL_WINHOOKS
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinSetHook(HAB hab, HMQ hmq, SHORT iHook, PFN pfnHook,
+ HMODULE hmod);
+BOOL APIENTRY WinReleaseHook(HAB hab, HMQ hmq, SHORT iHook, PFN pfnHook,
+ HMODULE hmod);
+BOOL APIENTRY WinCallMsgFilter(HAB hab, PQMSG pqmsg, USHORT msgf);
+
+
+/* Hook codes */
+
+#define HK_SENDMSG 0
+ /* VOID EXPENTRY SendMsgHook(HAB hab, ** installer's hab **
+ PSMHSTRUCT psmh, ** p send msg struct **
+ BOOL fInterTask); ** between threads */
+#define HK_INPUT 1
+ /* BOOL EXPENTRY InputHook(HAB hab, ** installer's hab **
+ PQMSG pQmsg, ** p qmsg **
+ USHORT fs); ** remove/noremove */
+#define HK_MSGFILTER 2
+ /* BOOL EXPENTRY MsgFilterHook(HAB hab, ** installer's hab **
+ PQMSG pQmsg, ** p qmsg **
+ USHORT msgf); ** filter flag */
+#define HK_JOURNALRECORD 3
+ /* VOID EXPENTRY JournalRecordHook(HAB hab, ** installer's hab **
+ PQMSG pQmsg); ** p qmsg */
+#define HK_JOURNALPLAYBACK 4
+ /* ULONG EXPENTRY JournalPlaybackHook(HAB hab, **installer's hab **
+ BOOL fSkip, ** skip messages **
+ PQMSG pQmsg); ** p qmsg */
+#define HK_HELP 5
+ /* BOOL EXPENTRY HelpHook(HAB hab, ** installer's hab **
+ USHORT usMode, ** mode **
+ USHORT idTopic, ** main topic **
+ USHORT idSubTopic, ** sub topic **
+ PRECTL prcPosition); ** associated position */
+
+#define HK_LOADER 6
+ /* BOOL EXPENTRY LoaderHook(HAB hab, ** installer's hab **
+ SHORT idContext, ** who called hook **
+ PSZ pszLibname, ** lib name string **
+ PHLIB hlib, ** p to lib handle **
+ PSZ pszProcname, ** procedure name **
+ PFNWP wndProc); ** window procedure */
+#define HK_REGISTERUSERMSG 7
+ /* BOOL EXPENTRY RegisterUserHook(HAB hab, ** installer's hab **
+ ULONG cUshort, ** entries in arRMP **
+ PUSHORT arRMP, ** RMP array **
+ PBOOL fRegistered); ** msg parms already reg*/
+#define HK_MSGCONTROL 8
+ /* BOOL EXPENTRY MsgControlHook(HAB hab, ** installer's hab **
+ SHORT idContext, ** who called hook **
+ HWND hwnd, ** SEI window handle **
+ PSZ pszClassname, ** window class name **
+ USHORT usMsgclass, ** interested msg class **
+ SHORT idControl, ** SMI_* **
+ PBOOL fSuccess); ** mode already set */
+#define HK_PLIST_ENTRY 9
+ /* BOOL EXPENTRY ProgramListEntryHook(HAB hab, ** installer's hab **
+ PPRFHOOKPARMS pProfileHookParams,** data **
+ PBOOL fNoExecute); ** cease hook processing*/
+#define HK_PLIST_EXIT 10
+ /* BOOL EXPENTRY ProgramListExitHook(HAB hab, ** installer's hab **
+ PPRFHOOKPARMS pProfileHookParams); ** data */
+#define HK_FINDWORD 11
+ /* BOOL EXPENTRY FindWordHook(usCodepage, ** code page to use **
+ PSZ pszText, ** text to break **
+ ULONG cb, ** maximum text size **
+ ULONG ich, ** break 'near' here **
+ PULONG pichStart, ** where break began **
+ PULONG pichEnd, ** where break ended **
+ PULONG pichNext); ** where next word begin*/
+#define HK_CODEPAGECHANGED 12
+ /* VOID EXPENTRY CodePageChangedHook(HMQ hmq, ** msg q handle **
+ USHORT usOldCodepage, ** old code page **
+ USHORT usNewCodepage);** new code page */
+#define HK_WINDOWDC 15
+ /* BOOL EXPENTRY WindowDCHook(HAB hab, ** installer's hab **
+ HDC hdc, ** current hdc **
+ HWND hwnd, ** current hwnd **
+ BOOL); ** association flag */
+
+#define HMQ_CURRENT ((HMQ)1)
+
+/* WH_MSGFILTER context codes */
+
+#define MSGF_DIALOGBOX 1
+#define MSGF_MESSAGEBOX 2
+#define MSGF_TRACK 8
+
+/* HK_HELP Help modes */
+
+#define HLPM_FRAME (-1)
+#define HLPM_WINDOW (-2)
+#define HLPM_MENU (-3)
+
+/* HK_SENDMSG structure */
+
+typedef struct _SMHSTRUCT { /* smhs */
+ MPARAM mp2;
+ MPARAM mp1;
+ USHORT msg;
+ HWND hwnd;
+} SMHSTRUCT;
+typedef SMHSTRUCT FAR *PSMHSTRUCT;
+
+/*HK_LOADER context codes */
+
+#define LHK_DELETEPROC 1
+#define LHK_DELETELIB 2
+#define LHK_LOADPROC 3
+#define LHK_LOADLIB 4
+
+/*HK_MSGCONTROL context codes */
+
+#define MCHK_MSGINTEREST 1
+#define MCHK_CLASSMSGINTEREST 2
+#define MCHK_SYNCHRONISATION 3
+#define MCHK_MSGMODE 4
+
+/*HK_REGISTERUSERMSG conext codes */
+
+#define RUMHK_DATATYPE 1
+#define RUMHK_MSG 2
+
+#endif /* INCL_SAADEFS */
+
+#endif /* INCL_WINHOOKS */
+
+/*
+ * Include Shell API
+ */
+#ifndef INCL_SAADEFS
+#include <pmshl.h> /* OS/2 Shell definitions */
+#endif /* !INCL_SAADEFS */
+
+#ifdef INCL_WINCOUNTRY
+
+USHORT APIENTRY WinQueryCp(HMQ hmq);
+
+#ifndef INCL_SAADEFS
+BOOL APIENTRY WinSetCp(HMQ hmq, USHORT idCodePage);
+USHORT APIENTRY WinQueryCpList(HAB hab, USHORT ccpMax, PUSHORT prgcp);
+BOOL APIENTRY WinCpTranslateString(HAB hab, USHORT cpSrc, PSZ pszSrc,
+ USHORT cpDst, USHORT cchDestMax,
+ PSZ pchDest);
+UCHAR APIENTRY WinCpTranslateChar(HAB hab, USHORT cpSrc, UCHAR chSrc,
+ USHORT cpDst);
+
+USHORT APIENTRY WinUpper(HAB hab, USHORT idcp, USHORT idcc, PSZ psz);
+USHORT APIENTRY WinUpperChar(HAB hab, USHORT idcp, USHORT idcc, USHORT c);
+PSZ APIENTRY WinNextChar(HAB hab, USHORT idcp, USHORT idcc, PSZ psz);
+PSZ APIENTRY WinPrevChar(HAB hab, USHORT idcp, USHORT idcc, PSZ pszStart,
+ PSZ psz);
+USHORT APIENTRY WinCompareStrings(HAB hab, USHORT idcp, USHORT idcc, PSZ psz1,
+ PSZ psz2, USHORT reserved);
+#define WCS_ERROR 0
+#define WCS_EQ 1
+#define WCS_LT 2
+#define WCS_GT 3
+
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINCOUNTRY */
+
+
+
+/* Heap Manager Interface declarations */
+
+#ifdef INCL_WINHEAP
+
+#ifndef INCL_SAADEFS
+typedef LHANDLE HHEAP;
+
+HHEAP APIENTRY WinCreateHeap(USHORT selHeapBase, USHORT cbHeap,
+ USHORT cbGrow, USHORT chMinDed,
+ USHORT cbMaxDed, USHORT fOptions);
+HHEAP APIENTRY WinDestroyHeap(HHEAP hHeap);
+USHORT APIENTRY WinAvailMem(HHEAP hHeap, BOOL fCompact, USHORT cbMinFree);
+NPBYTE APIENTRY WinAllocMem(HHEAP hHeap, USHORT cb);
+NPBYTE APIENTRY WinReallocMem(HHEAP hHeap, NPBYTE npMem,
+ USHORT cbOld, USHORT cbNew);
+NPBYTE APIENTRY WinFreeMem(HHEAP hHeap, NPBYTE npMem, USHORT cbMem);
+PVOID APIENTRY WinLockHeap(HHEAP hHeap);
+
+#define HM_MOVEABLE 0x0001 /* Parameters to WinCreateHeap */
+#define HM_VALIDSIZE 0x0002
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINHEAP */
+
+
+/*** Atom Manager Interface declarations */
+
+#ifdef INCL_WINATOM
+
+#ifndef INCL_SAADEFS
+typedef LHANDLE HATOMTBL;
+typedef USHORT ATOM;
+
+HATOMTBL APIENTRY WinQuerySystemAtomTable(VOID);
+HATOMTBL APIENTRY WinCreateAtomTable(USHORT cbInitial, USHORT cBuckets);
+HATOMTBL APIENTRY WinDestroyAtomTable(HATOMTBL hAtomTbl);
+ATOM APIENTRY WinAddAtom(HATOMTBL hAtomTbl, PSZ pszAtomName);
+ATOM APIENTRY WinFindAtom(HATOMTBL hAtomTbl, PSZ pszAtomName);
+ATOM APIENTRY WinDeleteAtom(HATOMTBL hAtomTbl, ATOM atom);
+USHORT APIENTRY WinQueryAtomUsage(HATOMTBL hAtomTbl, ATOM atom);
+USHORT APIENTRY WinQueryAtomLength(HATOMTBL hAtomTbl, ATOM atom);
+USHORT APIENTRY WinQueryAtomName(HATOMTBL hAtomTbl, ATOM atom, PSZ pchBuffer,
+ USHORT cchBufferMax);
+
+#define MAKEINTATOM(a) ((PCH)MAKEULONG(a, 0xffff))
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINATOM */
+
+
+/*** Catch/Throw Interface declarations */
+
+#ifdef INCL_WINCATCHTHROW
+
+#ifndef INCL_SAADEFS
+typedef struct _CATCHBUF { /* ctchbf */
+ ULONG reserved[ 4 ];
+} CATCHBUF;
+typedef CATCHBUF FAR *PCATCHBUF;
+
+SHORT APIENTRY WinCatch(PCATCHBUF pcatchbuf);
+VOID APIENTRY WinThrow(PCATCHBUF pcatchbuf, SHORT nThrowBack);
+#endif /* !INCL_SAADEFS */
+
+#endif /* INCL_WINCATCHTHROW */
+
+
+
+#ifdef INCL_WINERRORS
+
+#include <pmerr.h>
+
+/* Error codes for debugging support */
+/* 0x1001 - 0x1021, 0x1034, 0x1036 - 0x1060 are reserved */
+
+#define WINDBG_HWND_NOT_DESTROYED 0x1022
+#define WINDBG_HPTR_NOT_DESTROYED 0x1023
+#define WINDBG_HACCEL_NOT_DESTROYED 0x1024
+#define WINDBG_HENUM_NOT_DESTROYED 0x1025
+#define WINDBG_VISRGN_SEM_BUSY 0x1026
+#define WINDBG_USER_SEM_BUSY 0x1027
+#define WINDBG_DC_CACHE_BUSY 0x1028
+#define WINDBG_HOOK_STILL_INSTALLED 0x1029
+#define WINDBG_WINDOW_STILL_LOCKED 0x102a
+#define WINDBG_UPDATEPS_ASSERTION_FAIL 0x102b
+#define WINDBG_SENDMSG_WITHIN_USER_SEM 0x102c
+#define WINDBG_USER_SEM_NOT_ENTERED 0x102d
+#define WINDBG_PROC_NOT_EXPORTED 0x102e
+#define WINDBG_BAD_SENDMSG_HWND 0x102f
+#define WINDBG_ABNORMAL_EXIT 0x1030
+#define WINDBG_INTERNAL_REVISION 0x1031
+#define WINDBG_INITSYSTEM_FAILED 0x1032
+#define WINDBG_HATOMTBL_NOT_DESTROYED 0x1033
+#define WINDBG_WINDOW_UNLOCK_WAIT 0x1035
+
+/* Get/Set Error Information Interface declarations */
+
+typedef struct _ERRINFO { /* erri */
+ USHORT cbFixedErrInfo;
+ ERRORID idError;
+ USHORT cDetailLevel;
+ USHORT offaoffszMsg;
+ USHORT offBinaryData;
+} ERRINFO;
+typedef ERRINFO FAR *PERRINFO;
+
+ERRORID APIENTRY WinGetLastError(HAB hab);
+PERRINFO APIENTRY WinGetErrorInfo(HAB hab);
+BOOL APIENTRY WinFreeErrorInfo(PERRINFO perrinfo);
+
+#endif /* INCL_WINERRORS */
+
+#ifndef INCL_SAADEFS
+/* include SetErrorInfo */
+#ifdef INCL_WINSEI
+ #ifndef SEI_PMWINP
+ #define SEI_PMWIN
+ #include <pmsei.h>
+ #endif /* SEI_PMWINP */
+#endif /* INCL_WINSEI */
+#endif /* INCL_SAADEFS */
+
+#ifndef INCL_SAADEFS
+#ifdef INCL_WINDDE
+
+/* Dynamic Data Exchange (DDE) Structure Declaration */
+
+typedef struct _DDEINIT { /* ddei */
+ USHORT cb;
+ PSZ pszAppName;
+ PSZ pszTopic;
+} DDEINIT;
+typedef DDEINIT FAR *PDDEINIT;
+
+typedef struct _DDESTRUCT { /* dde */
+ ULONG cbData;
+ USHORT fsStatus;
+ USHORT usFormat;
+ USHORT offszItemName;
+ USHORT offabData;
+} DDESTRUCT;
+typedef DDESTRUCT FAR *PDDESTRUCT;
+
+/* DDE constants for wStatus field */
+#define DDE_FACK 0x0001
+#define DDE_FBUSY 0x0002
+#define DDE_FNODATA 0x0004
+#define DDE_FACKREQ 0x0008
+#define DDE_FRESPONSE 0x0010
+#define DDE_NOTPROCESSED 0x0020
+#define DDE_FRESERVED 0x00C0
+#define DDE_FAPPSTATUS 0xFF00
+
+/* DDE public formats */
+
+#define DDEFMT_TEXT 0x0001
+
+/* Dynamic Data Exchange (DDE) Routines */
+
+BOOL APIENTRY WinDdeInitiate(HWND hwndClient, PSZ pszAppName,
+ PSZ pszTopicName);
+MRESULT APIENTRY WinDdeRespond(HWND hwndClient, HWND hwndServer,
+ PSZ pszAppName, PSZ pszTopicName);
+BOOL APIENTRY WinDdePostMsg(HWND hwndTo, HWND hwndFrom, USHORT wm,
+ PDDESTRUCT pddeSt, BOOL fRetry);
+
+/* Dynamic Data Exchange (DDE) Messages */
+
+#define WM_DDE_FIRST 0x00A0
+#define WM_DDE_INITIATE 0x00A0
+#define WM_DDE_REQUEST 0x00A1
+#define WM_DDE_ACK 0x00A2
+#define WM_DDE_DATA 0x00A3
+#define WM_DDE_ADVISE 0x00A4
+#define WM_DDE_UNADVISE 0x00A5
+#define WM_DDE_POKE 0x00A6
+#define WM_DDE_EXECUTE 0x00A7
+#define WM_DDE_TERMINATE 0x00A8
+#define WM_DDE_INITIATEACK 0x00A9
+#define WM_DDE_LAST 0x00AF
+
+/* DDE helper macros */
+
+#define DDES_PSZITEMNAME(pddes) \
+ (((PSZ)pddes) + ((PDDESTRUCT)pddes)->offszItemName)
+
+#define DDES_PABDATA(pddes) \
+ (((PBYTE)pddes) + ((PDDESTRUCT)pddes)->offabData)
+
+#define SELTOPDDES(sel) ((PDDESTRUCT)MAKEP(sel, 0))
+#define PDDESTOSEL(pddes) (SELECTOROF(pddes))
+#define PDDEITOSEL(pddei) (SELECTOROF(pddei))
+
+#endif /* INCL_WINDDE */
+#endif /* !INCL_SAADEFS */
+
+#ifdef INCL_WINWINDOWMGR
+#define WM_QUERYCONVERTPOS 0x00b0
+
+/* Return values for WM_QUERYCONVERTPOS */
+#define QCP_CONVERT 0x0001
+#define QCP_NOCONVERT 0x0000
+
+#endif /* INCL_WINWINDOWMGR */
+
+
+#ifdef INCL_WINHELP
+ #include <pmhelp.h>
+#endif /* INCL_WINHELP */
+
+/*Load/Delete Library/Procedure */
+
+typedef HMODULE HLIB;
+typedef PHMODULE PHLIB;
+
+#ifdef INCL_WINLOAD
+BOOL APIENTRY WinDeleteProcedure(HAB hab, PFNWP wndproc);
+BOOL APIENTRY WinDeleteLibrary(HAB hab, HLIB libhandle);
+PFNWP APIENTRY WinLoadProcedure(HAB hab, HLIB libhandle, PSZ procname);
+HLIB APIENTRY WinLoadLibrary(HAB hab, PSZ libname);
+#endif /* INCL_WINLOAD */
+
+
+#ifdef INCL_REMAPDLL
+#define STR_DLLNAME "keyremap"
+#endif /*INCL_REMAPDLL*/
+
+#ifdef INCL_NLS
+
+#define WM_DBCSFIRST 0x00b0
+#define WM_DBCSLAST 0x00cf
+#define WC_APPSTAT ((PSZ)0xffff0010L)
+#define WC_KBDSTAT ((PSZ)0xffff0011L)
+#define WC_PECIC ((PSZ)0xffff0012L)
+#define WC_DBE_KKPOPUP ((PSZ)0xffff0013L)
+
+#endif /* INCL_NLS */
diff --git a/private/oleauto/tools/win16/os2/inc/process.h b/private/oleauto/tools/win16/os2/inc/process.h
new file mode 100644
index 000000000..462946ef2
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/process.h
@@ -0,0 +1,133 @@
+/***
+*process.h - definition and declarations for process control functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the declarations and definitions for the
+* spawnxx, execxx, and various other process control routines.
+*
+****/
+
+#ifndef _INC_PROCESS
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+/* mode values for spawnxx routines
+ * (only P_WAIT and P_OVERLAY are supported on MS-DOS)
+ */
+
+extern int __near __cdecl _p_overlay;
+
+#define _P_WAIT 0
+#define _P_NOWAIT 1
+#define _P_OVERLAY _p_overlay
+#define _OLD_P_OVERLAY 2
+#define _P_NOWAITO 3
+#define _P_DETACH 4
+
+
+/* function prototypes */
+
+void __cdecl abort(void);
+void __cdecl _cexit(void);
+void __cdecl _c_exit(void);
+#ifndef _WINDOWS
+int __cdecl _execl(const char *, const char *, ...);
+int __cdecl _execle(const char *, const char *, ...);
+int __cdecl _execlp(const char *, const char *, ...);
+int __cdecl _execlpe(const char *, const char *, ...);
+int __cdecl _execv(const char *,
+ const char * const *);
+int __cdecl _execve(const char *,
+ const char * const *, const char * const *);
+int __cdecl _execvp(const char *,
+ const char * const *);
+int __cdecl _execvpe(const char *,
+ const char * const *, const char * const *);
+#endif
+#ifndef _WINDLL
+void __cdecl exit(int);
+void __cdecl _exit(int);
+#endif
+int __cdecl _getpid(void);
+#ifndef _WINDOWS
+int __cdecl _spawnl(int, const char *, const char *,
+ ...);
+int __cdecl _spawnle(int, const char *, const char *,
+ ...);
+int __cdecl _spawnlp(int, const char *, const char *,
+ ...);
+int __cdecl _spawnlpe(int, const char *, const char *,
+ ...);
+int __cdecl _spawnv(int, const char *,
+ const char * const *);
+int __cdecl _spawnve(int, const char *,
+ const char * const *, const char * const *);
+int __cdecl _spawnvp(int, const char *,
+ const char * const *);
+int __cdecl _spawnvpe(int, const char *,
+ const char * const *, const char * const *);
+int __cdecl system(const char *);
+#endif
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define P_WAIT _P_WAIT
+#define P_NOWAIT _P_NOWAIT
+#define P_OVERLAY _P_OVERLAY
+#define OLD_P_OVERLAY _OLD_P_OVERLAY
+#define P_NOWAITO _P_NOWAITO
+#define P_DETACH _P_DETACH
+
+#ifndef _WINDOWS
+int __cdecl execl(const char *, const char *, ...);
+int __cdecl execle(const char *, const char *, ...);
+int __cdecl execlp(const char *, const char *, ...);
+int __cdecl execlpe(const char *, const char *, ...);
+int __cdecl execv(const char *,
+ const char * const *);
+int __cdecl execve(const char *,
+ const char * const *, const char * const *);
+int __cdecl execvp(const char *,
+ const char * const *);
+int __cdecl execvpe(const char *,
+ const char * const *, const char * const *);
+#endif
+int __cdecl getpid(void);
+#ifndef _WINDOWS
+int __cdecl spawnl(int, const char *, const char *,
+ ...);
+int __cdecl spawnle(int, const char *, const char *,
+ ...);
+int __cdecl spawnlp(int, const char *, const char *,
+ ...);
+int __cdecl spawnlpe(int, const char *, const char *,
+ ...);
+int __cdecl spawnv(int, const char *,
+ const char * const *);
+int __cdecl spawnve(int, const char *,
+ const char * const *, const char * const *);
+int __cdecl spawnvp(int, const char *,
+ const char * const *);
+int __cdecl spawnvpe(int, const char *,
+ const char * const *, const char * const *);
+#endif
+
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_PROCESS
+#endif /* _INC_PROCESS */
diff --git a/private/oleauto/tools/win16/os2/inc/search.h b/private/oleauto/tools/win16/os2/inc/search.h
new file mode 100644
index 000000000..ddf2d90f5
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/search.h
@@ -0,0 +1,59 @@
+/***
+*search.h - declarations for searcing/sorting routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the declarations for the sorting and
+* searching routines.
+* [System V]
+*
+****/
+
+#ifndef _INC_SEARCH
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+
+/* function prototypes */
+
+void * __cdecl bsearch(const void *, const void *,
+ size_t, size_t, int (__cdecl *)(const void *,
+ const void *));
+void * __cdecl _lfind(const void *, const void *,
+ unsigned int *, unsigned int, int (__cdecl *)
+ (const void *, const void *));
+void * __cdecl _lsearch(const void *, void *,
+ unsigned int *, unsigned int, int (__cdecl *)
+ (const void *, const void *));
+void __cdecl qsort(void *, size_t, size_t, int (__cdecl *)
+ (const void *, const void *));
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+void * __cdecl lfind(const void *, const void *,
+ unsigned int *, unsigned int, int (__cdecl *)
+ (const void *, const void *));
+void * __cdecl lsearch(const void *, void *,
+ unsigned int *, unsigned int, int (__cdecl *)
+ (const void *, const void *));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_SEARCH
+#endif /* _INC_SEARCH */
diff --git a/private/oleauto/tools/win16/os2/inc/setjmp.h b/private/oleauto/tools/win16/os2/inc/setjmp.h
new file mode 100644
index 000000000..afb2950c5
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/setjmp.h
@@ -0,0 +1,41 @@
+/***
+*setjmp.h - definitions/declarations for setjmp/longjmp routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the machine-dependent buffer used by
+* setjmp/longjmp to save and restore the program state, and
+* declarations for those routines.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_SETJMP
+
+#ifndef __cplusplus
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+/* define the buffer type for holding the state information */
+
+#define _JBLEN 9 /* bp, di, si, sp, ret addr, ds */
+
+#ifndef _JMP_BUF_DEFINED
+typedef int jmp_buf[_JBLEN];
+#define _JMP_BUF_DEFINED
+#endif
+
+
+/* function prototypes */
+
+int __cdecl setjmp(jmp_buf);
+void __cdecl longjmp(jmp_buf, int);
+
+#endif /* _cplusplus */
+
+#define _INC_SETJMP
+#endif /* _INC_SETJMP */
diff --git a/private/oleauto/tools/win16/os2/inc/share.h b/private/oleauto/tools/win16/os2/inc/share.h
new file mode 100644
index 000000000..e3f8607fb
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/share.h
@@ -0,0 +1,29 @@
+/***
+*share.h - defines file sharing modes for sopen
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the file sharing modes for sopen().
+*
+****/
+
+#ifndef _INC_SHARE
+
+#define _SH_COMPAT 0x00 /* compatibility mode */
+#define _SH_DENYRW 0x10 /* deny read/write mode */
+#define _SH_DENYWR 0x20 /* deny write mode */
+#define _SH_DENYRD 0x30 /* deny read mode */
+#define _SH_DENYNO 0x40 /* deny none mode */
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define SH_COMPAT _SH_COMPAT
+#define SH_DENYRW _SH_DENYRW
+#define SH_DENYWR _SH_DENYWR
+#define SH_DENYRD _SH_DENYRD
+#define SH_DENYNO _SH_DENYNO
+#endif
+
+#define _INC_SHARE
+#endif /* _INC_SHARE */
diff --git a/private/oleauto/tools/win16/os2/inc/shellapi.h b/private/oleauto/tools/win16/os2/inc/shellapi.h
new file mode 100644
index 000000000..8c7016e85
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/shellapi.h
@@ -0,0 +1,67 @@
+/*
+ * shell.h
+ *
+ * Header file for shell association database management functions
+ */
+
+
+//****************************************************************************
+// THIS INFORMATION IS PUBLIC
+
+/* return codes from Registration functions
+ */
+
+#define ERROR_SUCCESS 0
+#define ERROR_BADDB 1
+#define ERROR_BADKEY 2
+#define ERROR_CANTOPEN 3
+#define ERROR_CANTREAD 4
+#define ERROR_CANTWRITE 5
+#define ERROR_OUTOFMEMORY 6
+#define ERROR_INVALID_PARAMETER 7
+
+#define REG_SZ 1 // string type
+
+#define HKEY_CLASSES_ROOT 1
+
+/* necessary typedef's. Everything in this API is 32-bit.
+ */
+
+typedef DWORD HKEY;
+typedef HKEY FAR * PHKEY;
+
+/* API exports from the library
+ */
+
+LONG FAR PASCAL RegOpenKey(HKEY,LPSTR,PHKEY);
+LONG FAR PASCAL RegCreateKey(HKEY,LPSTR,PHKEY);
+LONG FAR PASCAL RegCloseKey(HKEY);
+LONG FAR PASCAL RegDeleteKey(HKEY,LPSTR);
+LONG FAR PASCAL RegSetValue(HKEY,LPSTR,DWORD,LPSTR,DWORD);
+LONG FAR PASCAL RegQueryValue(HKEY,LPSTR,LPSTR,LONG FAR *);
+LONG FAR PASCAL RegEnumKey(HKEY,DWORD,LPSTR,DWORD);
+
+WORD FAR PASCAL DragQueryFile(HANDLE,WORD,LPSTR,WORD);
+BOOL FAR PASCAL DragQueryPoint(HANDLE,LPPOINT);
+void FAR PASCAL DragFinish(HANDLE);
+void FAR PASCAL DragAcceptFiles(HWND,BOOL);
+
+HANDLE FAR PASCAL ShellExecute( /* ;Internal */
+ LPSTR lpOperation, /* ;Internal */
+ LPSTR lpFile, /* ;Internal */
+ LPSTR lpParameters, /* ;Internal */
+ LPSTR lpDirectory, /* ;Internal */
+ BOOL fMinimize); /* ;Internal */
+ /* ;Internal */
+HANDLE FAR PASCAL FindExecutable( /* ;Internal */
+ LPSTR lpFile, /* ;Internal */
+ LPSTR lpDirectory, /* ;Internal */
+ LPSTR lpResult); /* ;Internal */
+ /* ;Internal */
+ /* ;Internal */
+int FAR PASCAL ShellAbout(HWND hWnd, LPSTR szApp, LPSTR szOtherStuff, HICON hIcon); /* ;Internal */
+
+HICON FAR PASCAL DuplicateIcon(HANDLE hInst, HICON hIcon); /* ;Internal */
+HICON FAR PASCAL ExtractAssociatedIcon(HANDLE hInst, LPSTR lpIconPath, LPWORD lpiIcon); /* ;Internal */
+HICON FAR PASCAL ExtractIcon(HANDLE hInst, LPSTR lpszExeFileName, WORD nIconIndex); /* ;Internal */
+
diff --git a/private/oleauto/tools/win16/os2/inc/signal.h b/private/oleauto/tools/win16/os2/inc/signal.h
new file mode 100644
index 000000000..609f9d9f8
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/signal.h
@@ -0,0 +1,68 @@
+/***
+*signal.h - defines signal values and routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the signal values and declares the signal functions.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_SIGNAL
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _SIG_ATOMIC_T_DEFINED
+typedef int sig_atomic_t;
+#define _SIG_ATOMIC_T_DEFINED
+#endif
+
+#define NSIG 23 /* maximum signal number + 1 */
+
+
+/* signal types */
+
+#ifndef _WINDOWS
+#define SIGINT 2 /* Ctrl-C sequence */
+#define SIGILL 4 /* illegal instruction - invalid function image */
+#endif
+#define SIGFPE 8 /* floating point exception */
+#ifndef _WINDOWS
+#define SIGSEGV 11 /* segment violation */
+#define SIGTERM 15 /* Software termination signal from kill */
+#define SIGABRT 22 /* abnormal termination triggered by abort call */
+#endif
+
+
+/* signal action codes */
+
+/* default signal action */
+#define SIG_DFL (void (__cdecl *)(int))0
+
+/* ignore */
+#define SIG_IGN (void (__cdecl *)(int))1
+
+/* signal error value (returned by signal call on error) */
+#define SIG_ERR (void (__cdecl *)(int))-1
+
+
+/* function prototypes */
+
+void (__cdecl * __cdecl signal(int,
+ void (__cdecl *)(int)))(int);
+int __cdecl raise(int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_SIGNAL
+#endif /* _INC_SIGNAL */
diff --git a/private/oleauto/tools/win16/os2/inc/stdarg.h b/private/oleauto/tools/win16/os2/inc/stdarg.h
new file mode 100644
index 000000000..7a06e7dca
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/stdarg.h
@@ -0,0 +1,52 @@
+/***
+*stdarg.h - defines ANSI-style macros for variable argument functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines ANSI-style macros for accessing arguments
+* of functions which take a variable number of arguments.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_STDARG
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _WINDLL
+#define _FARARG_ __far
+#else
+#define _FARARG_
+#endif
+
+#if (_MSC_VER <= 600)
+#define __far _far
+#endif
+
+#ifndef _VA_LIST_DEFINED
+typedef char _FARARG_ *va_list;
+#define _VA_LIST_DEFINED
+#endif
+
+/*
+ * define a macro to compute the size of a type, variable or expression,
+ * rounded up to the nearest multiple of sizeof(int). This number is its
+ * size as function argument (Intel architecture). Note that the macro
+ * depends on sizeof(int) being a power of 2!
+ */
+
+#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
+
+#define va_start(ap,v) ap = (va_list)&v + _INTSIZEOF(v)
+#define va_arg(ap,t) ( *(t _FARARG_ *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
+#define va_end(ap) ap = (va_list)0
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STDARG
+#endif /* _INC_STDARG */
diff --git a/private/oleauto/tools/win16/os2/inc/stddef.h b/private/oleauto/tools/win16/os2/inc/stddef.h
new file mode 100644
index 000000000..19f5089ba
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/stddef.h
@@ -0,0 +1,70 @@
+/***
+*stddef.h - definitions/declarations for common constants, types, variables
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains definitions and declarations for some commonly
+* used constants, types, and variables.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_STDDEF
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+/* define the NULL pointer value and the offsetof() macro */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+
+/* offset of field m in a struct s */
+
+#define offsetof(s,m) (size_t)(unsigned long)&(((s *)0)->m)
+
+
+/* errno declaration */
+
+extern int __near __cdecl volatile errno;
+
+
+/* define the implementation dependent size types */
+
+#ifndef _PTRDIFF_T_DEFINED
+typedef int ptrdiff_t;
+#define _PTRDIFF_T_DEFINED
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STDDEF
+#endif /* _INC_STDDEF */
diff --git a/private/oleauto/tools/win16/os2/inc/stdio.h b/private/oleauto/tools/win16/os2/inc/stdio.h
new file mode 100644
index 000000000..aa0ebc166
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/stdio.h
@@ -0,0 +1,338 @@
+/***
+*stdio.h - definitions/declarations for standard I/O routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the structures, values, macros, and functions
+* used by the level 2 I/O ("standard I/O") routines.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_STDIO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _VA_LIST_DEFINED
+typedef char *va_list;
+#define _VA_LIST_DEFINED
+#endif
+
+/* buffered I/O macros */
+
+#define BUFSIZ 512
+#define _NFILE 20
+#define EOF (-1)
+
+#ifndef _FILE_DEFINED
+#pragma pack(2)
+struct _iobuf {
+ char *_ptr;
+ int _cnt;
+ char *_base;
+ char _flag;
+ char _file;
+ };
+typedef struct _iobuf FILE;
+#pragma pack()
+#define _FILE_DEFINED
+#endif
+
+
+/* _P_tmpnam: Directory where temporary files may be created.
+ * L_tmpnam size = size of _P_tmpdir
+ * + 1 (in case _P_tmpdir does not end in "\\")
+ * + 6 (for the temp number string)
+ * + 1 (for the null terminator)
+ */
+
+#define _P_tmpdir "\\"
+#define L_tmpnam sizeof(_P_tmpdir)+8
+
+
+/* fseek constants */
+
+#define SEEK_CUR 1
+#define SEEK_END 2
+#define SEEK_SET 0
+
+
+/* minimum guaranteed filename length, open file count, and unique
+ * tmpnam filenames.
+ */
+
+#define FILENAME_MAX 63
+#define FOPEN_MAX 18
+#define TMP_MAX 32767
+#define _SYS_OPEN 20
+
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+
+/* declare _iob[] array */
+
+#ifndef _STDIO_DEFINED
+extern FILE __near __cdecl _iob[];
+#endif
+
+
+/* define file position type */
+
+#ifndef _FPOS_T_DEFINED
+typedef long fpos_t;
+#define _FPOS_T_DEFINED
+#endif
+
+
+/* standard file pointers */
+
+#ifndef _WINDLL
+#define stdin (&_iob[0])
+#define stdout (&_iob[1])
+#define stderr (&_iob[2])
+#endif
+#ifndef _WINDOWS
+#define _stdaux (&_iob[3])
+#define _stdprn (&_iob[4])
+#endif
+
+
+#define _IOREAD 0x01
+#define _IOWRT 0x02
+
+#define _IOFBF 0x0
+#define _IOLBF 0x40
+#define _IONBF 0x04
+
+#define _IOMYBUF 0x08
+#define _IOEOF 0x10
+#define _IOERR 0x20
+#define _IOSTRG 0x40
+#define _IORW 0x80
+
+
+#ifdef _WINDOWS
+#ifndef _WINDLL
+#ifndef _WINFO_DEFINED
+/* interface version number */
+#define _WINVER 0
+
+/* max number of windows */
+#define _WFILE 20
+
+/* values for windows screen buffer size */
+#define _WINBUFINF 0
+#define _WINBUFDEF -1
+
+/* size/move settings */
+#define _WINSIZEMIN 1
+#define _WINSIZEMAX 2
+#define _WINSIZERESTORE 3
+#define _WINSIZECHAR 4
+
+/* size/move query types */
+#define _WINMAXREQ 100
+#define _WINCURRREQ 101
+
+/* values for closing window */
+#define _WINPERSIST 1
+#define _WINNOPERSIST 0
+
+/* pseudo file handle for frame window */
+#define _WINFRAMEHAND -1
+
+/* menu items */
+#define _WINSTATBAR 1
+#define _WINTILE 2
+#define _WINCASCADE 3
+#define _WINARRANGE 4
+
+/* quickwin exit options */
+#define _WINEXITPROMPT 1
+#define _WINEXITNOPERSIST 2
+#define _WINEXITPERSIST 3
+
+/* open structure */
+#pragma pack(2)
+struct _wopeninfo {
+ unsigned int _version;
+ const char __far * _title;
+ long _wbufsize;
+ };
+#pragma pack()
+
+/* size/move structure */
+struct _wsizeinfo {
+ unsigned int _version;
+ unsigned int _type;
+ unsigned int _x;
+ unsigned int _y;
+ unsigned int _h;
+ unsigned int _w;
+ };
+#define _WINFO_DEFINED
+#endif
+#endif
+#endif
+
+/* function prototypes */
+
+#ifndef _STDIO_DEFINED
+int __cdecl _filbuf(FILE *);
+int __cdecl _flsbuf(int, FILE *);
+FILE * __cdecl _fsopen(const char *,
+ const char *, int);
+void __cdecl clearerr(FILE *);
+int __cdecl fclose(FILE *);
+int __cdecl _fcloseall(void);
+FILE * __cdecl _fdopen(int, const char *);
+int __cdecl feof(FILE *);
+int __cdecl ferror(FILE *);
+int __cdecl fflush(FILE *);
+int __cdecl fgetc(FILE *);
+#ifndef _WINDLL
+int __cdecl _fgetchar(void);
+#endif
+int __cdecl fgetpos(FILE *, fpos_t *);
+char * __cdecl fgets(char *, int, FILE *);
+int __cdecl _fileno(FILE *);
+int __cdecl _flushall(void);
+FILE * __cdecl fopen(const char *,
+ const char *);
+int __cdecl fprintf(FILE *, const char *, ...);
+int __cdecl fputc(int, FILE *);
+#ifndef _WINDLL
+int __cdecl _fputchar(int);
+#endif
+int __cdecl fputs(const char *, FILE *);
+size_t __cdecl fread(void *, size_t, size_t, FILE *);
+FILE * __cdecl freopen(const char *,
+ const char *, FILE *);
+#ifndef _WINDLL
+int __cdecl fscanf(FILE *, const char *, ...);
+#endif
+int __cdecl fsetpos(FILE *, const fpos_t *);
+int __cdecl fseek(FILE *, long, int);
+long __cdecl ftell(FILE *);
+#ifdef _WINDOWS
+#ifndef _WINDLL
+FILE * __cdecl _fwopen(struct _wopeninfo *, struct _wsizeinfo *, const char *);
+#endif
+#endif
+size_t __cdecl fwrite(const void *, size_t, size_t,
+ FILE *);
+int __cdecl getc(FILE *);
+#ifndef _WINDLL
+int __cdecl getchar(void);
+char * __cdecl gets(char *);
+#endif
+int __cdecl _getw(FILE *);
+#ifndef _WINDLL
+void __cdecl perror(const char *);
+#endif
+int __cdecl printf(const char *, ...);
+int __cdecl putc(int, FILE *);
+#ifndef _WINDLL
+int __cdecl putchar(int);
+int __cdecl puts(const char *);
+#endif
+int __cdecl _putw(int, FILE *);
+int __cdecl remove(const char *);
+int __cdecl rename(const char *, const char *);
+void __cdecl rewind(FILE *);
+int __cdecl _rmtmp(void);
+#ifndef _WINDLL
+int __cdecl scanf(const char *, ...);
+#endif
+void __cdecl setbuf(FILE *, char *);
+int __cdecl setvbuf(FILE *, char *, int, size_t);
+int __cdecl _snprintf(char *, size_t, const char *, ...);
+int __cdecl sprintf(char *, const char *, ...);
+#ifndef _WINDLL
+int __cdecl sscanf(const char *, const char *, ...);
+#endif
+char * __cdecl _tempnam(char *, char *);
+FILE * __cdecl tmpfile(void);
+char * __cdecl tmpnam(char *);
+int __cdecl ungetc(int, FILE *);
+int __cdecl _unlink(const char *);
+int __cdecl vfprintf(FILE *, const char *, va_list);
+int __cdecl vprintf(const char *, va_list);
+int __cdecl _vsnprintf(char *, size_t, const char *, va_list);
+int __cdecl vsprintf(char *, const char *, va_list);
+#define _STDIO_DEFINED
+#endif
+
+/* macro definitions */
+
+#define feof(_stream) ((_stream)->_flag & _IOEOF)
+#define ferror(_stream) ((_stream)->_flag & _IOERR)
+#define _fileno(_stream) ((int)(unsigned char)(_stream)->_file)
+#define getc(_stream) (--(_stream)->_cnt >= 0 ? 0xff & *(_stream)->_ptr++ \
+ : _filbuf(_stream))
+#define putc(_c,_stream) (--(_stream)->_cnt >= 0 \
+ ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) : _flsbuf((_c),(_stream)))
+#ifndef _WINDLL
+#define getchar() getc(stdin)
+#define putchar(_c) putc((_c),stdout)
+#endif
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define P_tmpdir _P_tmpdir
+#define SYS_OPEN _SYS_OPEN
+
+#ifndef _WINDOWS
+#define stdaux _stdaux
+#define stdprn _stdprn
+#endif
+
+int __cdecl fcloseall(void);
+FILE * __cdecl fdopen(int, const char *);
+#ifndef _WINDLL
+int __cdecl fgetchar(void);
+#endif
+int __cdecl fileno(FILE *);
+int __cdecl flushall(void);
+#ifndef _WINDLL
+int __cdecl fputchar(int);
+#endif
+int __cdecl getw(FILE *);
+int __cdecl putw(int, FILE *);
+int __cdecl rmtmp(void);
+char * __cdecl tempnam(char *, char *);
+int __cdecl unlink(const char *);
+
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STDIO
+#endif /* _INC_STDIO */
diff --git a/private/oleauto/tools/win16/os2/inc/stdiostr.h b/private/oleauto/tools/win16/os2/inc/stdiostr.h
new file mode 100644
index 000000000..838735140
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/stdiostr.h
@@ -0,0 +1,52 @@
+/***
+*stdiostr.h - definitions/declarations for stdiobuf, stdiostream
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the stdiostream and stdiobuf classes.
+* [AT&T C++]
+*
+****/
+
+#include <iostream.h>
+#include <stdio.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+#ifndef _INC_STDIOSTREAM
+#define _INC_STDIOSTREAM
+class stdiobuf : public streambuf {
+public:
+ stdiobuf(FILE* f);
+FILE * stdiofile() { return _str; }
+
+virtual int pbackfail(int c);
+virtual int overflow(int c = EOF);
+virtual int underflow();
+virtual streampos seekoff( streamoff, ios::seek_dir, int =ios::in|ios::out);
+virtual int sync();
+ ~stdiobuf();
+ int setrwbuf(int _rsize, int _wsize); // CONSIDER: move to ios::
+// protected:
+// virtual int doallocate();
+private:
+ FILE * _str;
+};
+
+// obsolescent
+class stdiostream : public iostream { // note: spec.'d as : public IOS...
+public:
+ stdiostream(FILE *);
+ ~stdiostream();
+ stdiobuf* rdbuf() const { return (stdiobuf*) ostream::rdbuf(); }
+
+private:
+};
+
+// Restore default packing
+#pragma pack()
+
+#endif // !_INC_STDIOSTREAM
diff --git a/private/oleauto/tools/win16/os2/inc/stdlib.h b/private/oleauto/tools/win16/os2/inc/stdlib.h
new file mode 100644
index 000000000..bd65d33bb
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/stdlib.h
@@ -0,0 +1,263 @@
+/***
+*stdlib.h - declarations/definitions for commonly used library functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file contains the function declarations for
+* commonly used library functions which either don't fit somewhere
+* else, or, like toupper/tolower, can't be declared in the normal
+* place for other reasons.
+* [ANSI]
+*
+****/
+
+#ifndef _INC_STDLIB
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#define __pascal _pascal
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+/* definition of the return type for the onexit() function */
+
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+
+#ifndef _ONEXIT_T_DEFINED
+typedef int (__cdecl * _onexit_t)();
+typedef int (__far __cdecl * _fonexit_t)();
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+typedef int (__cdecl * onexit_t)();
+#endif
+#define _ONEXIT_T_DEFINED
+#endif
+
+
+/* data structure definitions for div and ldiv runtimes. */
+
+#ifndef _DIV_T_DEFINED
+
+typedef struct _div_t {
+ int quot;
+ int rem;
+} div_t;
+
+typedef struct _ldiv_t {
+ long quot;
+ long rem;
+} ldiv_t;
+
+#define _DIV_T_DEFINED
+#endif
+
+/* maximum value that can be returned by the rand function. */
+
+#define RAND_MAX 0x7fff
+
+extern unsigned short __mb_cur_max; /* mb-len for curr. locale */
+#define MB_CUR_MAX __mb_cur_max
+
+
+/* min and max macros */
+
+#define __max(a,b) (((a) > (b)) ? (a) : (b))
+#define __min(a,b) (((a) < (b)) ? (a) : (b))
+
+
+/* sizes for buffers used by the _makepath() and _splitpath() functions.
+ * note that the sizes include space for 0-terminator
+ */
+
+#define _MAX_PATH 260 /* max. length of full pathname */
+#define _MAX_DRIVE 3 /* max. length of drive component */
+#define _MAX_DIR 256 /* max. length of path component */
+#define _MAX_FNAME 256 /* max. length of file name component */
+#define _MAX_EXT 256 /* max. length of extension component */
+
+/* external variable declarations */
+
+extern int __near __cdecl volatile errno; /* error value */
+extern int __near __cdecl _doserrno; /* OS system error value */
+
+extern char * __near __cdecl _sys_errlist[]; /* perror error message table */
+extern int __near __cdecl _sys_nerr; /* # of entries in sys_errlist table */
+extern char ** __near __cdecl _environ; /* pointer to environment table */
+extern int __near __cdecl _fmode; /* default file translation mode */
+#ifndef _WINDOWS
+extern int __near __cdecl _fileinfo; /* open file info mode (for spawn) */
+#endif
+
+extern unsigned int __near __cdecl _psp; /* Program Segment Prefix */
+
+/* OS major/minor version numbers */
+
+extern unsigned char __near __cdecl _osmajor;
+extern unsigned char __near __cdecl _osminor;
+
+/* OS mode */
+
+#define _DOS_MODE 0 /* DOS */
+#define _OS2_MODE 1 /* OS/2 */
+#define _WIN_MODE 2 /* Windows */
+
+extern unsigned char __near __cdecl _osmode;
+
+/* CPU mode */
+
+#define _REAL_MODE 0 /* real mode */
+#define _PROT_MODE 1 /* protect mode */
+
+extern unsigned char __near __cdecl _cpumode;
+
+/* function prototypes */
+
+double __cdecl atof(const char *);
+double __cdecl strtod(const char *, char * *);
+ldiv_t __cdecl ldiv(long, long);
+
+void __cdecl abort(void);
+int __cdecl abs(int);
+int __cdecl atexit(void (__cdecl *)(void));
+int __cdecl atoi(const char *);
+long __cdecl atol(const char *);
+long double __cdecl _atold(const char *);
+void * __cdecl bsearch(const void *, const void *,
+ size_t, size_t, int (__cdecl *)(const void *,
+ const void *));
+void * __cdecl calloc(size_t, size_t);
+div_t __cdecl div(int, int);
+char * __cdecl _ecvt(double, int, int *, int *);
+#ifndef _WINDLL
+void __cdecl exit(int);
+void __cdecl _exit(int);
+#endif
+int __far __cdecl _fatexit(void (__cdecl __far *)(void));
+char * __cdecl _fcvt(double, int, int *, int *);
+_fonexit_t __far __cdecl _fonexit(_fonexit_t);
+void __cdecl free(void *);
+char * __cdecl _fullpath(char *, const char *,
+ size_t);
+char * __cdecl _gcvt(double, int, char *);
+char * __cdecl getenv(const char *);
+char * __cdecl _itoa(int, char *, int);
+long __cdecl labs(long);
+unsigned long __cdecl _lrotl(unsigned long, int);
+unsigned long __cdecl _lrotr(unsigned long, int);
+char * __cdecl _ltoa(long, char *, int);
+void __cdecl _makepath(char *, const char *,
+ const char *, const char *, const char *);
+void * __cdecl malloc(size_t);
+_onexit_t __cdecl _onexit(_onexit_t);
+#ifndef _WINDLL
+void __cdecl perror(const char *);
+#endif
+int __cdecl _putenv(const char *);
+void __cdecl qsort(void *, size_t, size_t, int (__cdecl *)
+ (const void *, const void *));
+unsigned int __cdecl _rotl(unsigned int, int);
+unsigned int __cdecl _rotr(unsigned int, int);
+int __cdecl rand(void);
+void * __cdecl realloc(void *, size_t);
+void __cdecl _searchenv(const char *, const char *,
+ char *);
+void __cdecl _splitpath(const char *, char *,
+ char *, char *, char *);
+void __cdecl srand(unsigned int);
+long __cdecl strtol(const char *, char * *,
+ int);
+long double __cdecl _strtold(const char *,
+ char * *);
+unsigned long __cdecl strtoul(const char *,
+ char * *, int);
+void __cdecl _swab(char *, char *, int);
+#ifndef _WINDOWS
+int __cdecl system(const char *);
+#endif
+char * __cdecl _ultoa(unsigned long, char *, int);
+
+int __cdecl mblen(const char *, size_t);
+int __cdecl mbtowc(wchar_t *, const char *, size_t);
+int __cdecl wctomb(char *, wchar_t);
+size_t __cdecl mbstowcs(wchar_t *, const char *, size_t);
+size_t __cdecl wcstombs(char *, const wchar_t *, size_t);
+
+/* model-independent function prototypes */
+
+int __far __cdecl _fmblen(const char __far *, size_t);
+int __far __cdecl _fmbtowc(wchar_t __far *, const char __far *,
+ size_t);
+int __far __cdecl _fwctomb(char __far *, wchar_t);
+size_t __far __cdecl _fmbstowcs(wchar_t __far *, const char __far *,
+ size_t);
+size_t __far __cdecl _fwcstombs(char __far *, const wchar_t __far *,
+ size_t);
+
+#ifndef tolower /* tolower has been undefined - use function */
+int __cdecl tolower(int);
+#endif /* tolower */
+
+#ifndef toupper /* toupper has been undefined - use function */
+int __cdecl toupper(int);
+#endif /* toupper */
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#ifndef __cplusplus
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+extern char * __near __cdecl sys_errlist[];
+extern int __near __cdecl sys_nerr;
+extern char ** __near __cdecl environ;
+
+#define DOS_MODE _DOS_MODE
+#define OS2_MODE _OS2_MODE
+
+char * __cdecl ecvt(double, int, int *, int *);
+char * __cdecl fcvt(double, int, int *, int *);
+char * __cdecl gcvt(double, int, char *);
+char * __cdecl itoa(int, char *, int);
+char * __cdecl ltoa(long, char *, int);
+onexit_t __cdecl onexit(onexit_t);
+int __cdecl putenv(const char *);
+void __cdecl swab(char *, char *, int);
+char * __cdecl ultoa(unsigned long, char *, int);
+
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STDLIB
+#endif /* _INC_STDLIB */
diff --git a/private/oleauto/tools/win16/os2/inc/stream.hxx b/private/oleauto/tools/win16/os2/inc/stream.hxx
new file mode 100644
index 000000000..a87ec63d7
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/stream.hxx
@@ -0,0 +1,61 @@
+#ifndef _STREAM_XXX
+#define _STREAM_XXX 1
+
+struct Wsp { };
+
+char* oct(long n, int l =0);
+char* hex(long n, int l =0);
+char* dec(long n, int l =0);
+char* chr(int n, int l =0); // chr(0) is the empty string ""
+char* str(const char* n, int l =0);
+char* form(const char* format, ...);
+
+class ostream {
+ void* bp;
+ short state;
+public:
+ int operator!();
+ ostream& operator<<(char* n);
+ ostream& operator<<(int a);
+ ostream& operator<<(long n); // beware: << 'a' writes 97
+ ostream& operator<<(double n);
+ ostream& operator<<(const Wsp&); // I can't see a use for this
+ ostream& put(char n); // put('a') writes a
+ int eof();
+ int fail();
+ int bad();
+ int good();
+};
+
+class istream {
+ void* bp;
+ ostream* tied_to;
+ char skipws; // if non-null, automaticly skip whitespace
+ short state;
+public:
+ int skip(int i);
+ int operator!();
+
+ // formatted input: >> skip whitespace
+ istream& operator>>(char* n);
+ istream& operator>>(char& n);
+ istream& operator>>(int& n);
+ istream& operator>>(long& n);
+ istream& operator>>(float& n);
+ istream& operator>>(double& n);
+
+ // raw input: get's do not skip whitespace
+ istream& get(char& c); // single character
+ int eof();
+ int fail();
+ int bad();
+ int good();
+};
+extern istream cin; // standard input predefined
+extern ostream cout; // standard output
+extern ostream cerr; // error output
+
+extern Wsp WS; // predefined white space
+#endif
+
+
diff --git a/private/oleauto/tools/win16/os2/inc/streamb.h b/private/oleauto/tools/win16/os2/inc/streamb.h
new file mode 100644
index 000000000..7668fa22f
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/streamb.h
@@ -0,0 +1,124 @@
+/***
+*streamb.h - definitions/declarations for the streambuf class
+*
+* Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the streambuf class.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_STREAMB
+#define _INC_STREAMB
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+typedef long streampos, streamoff;
+
+class streambuf {
+public:
+
+ inline int in_avail() const;
+ inline int out_waiting() const;
+ int sgetc();
+ int snextc();
+ int sbumpc();
+ void stossc();
+
+ inline int sputbackc(char);
+
+ inline int sputc(int);
+ int sputn(const char*,int);
+ int sgetn(char*,int);
+
+ virtual int sync();
+
+// enum seek_dir { beg=0, cur=1, end=2 }; // CONSIDER: needed ???
+
+ virtual streambuf* setbuf(char *, int);
+ virtual streampos seekoff(streamoff,ios::seek_dir,int =ios::in|ios::out);
+ virtual streampos seekpos(streampos,int =ios::in|ios::out);
+
+ virtual int xsputn(const char*,int);
+ virtual int xsgetn(char*,int);
+
+ virtual int overflow(int =EOF) = 0; // pure virtual function
+ virtual int underflow() = 0; // pure virtual function
+
+ virtual int pbackfail(int);
+
+ void dbp();
+
+protected:
+ streambuf();
+ streambuf(char*,int);
+ virtual ~streambuf();
+
+ inline char* base() const;
+ inline char* ebuf() const;
+ inline char* pbase() const;
+ inline char* pptr() const;
+ inline char* epptr() const;
+ inline char* eback() const;
+ inline char* gptr() const;
+ inline char* egptr() const;
+ inline int blen() const;
+ inline void setp(char*,char*);
+ inline void setg(char*,char*,char*);
+ inline void pbump(int);
+ inline void gbump(int);
+
+ void setb(char*,char*,int =0);
+ inline int unbuffered() const;
+ void unbuffered(int);
+ int allocate();
+ virtual int doallocate();
+
+private:
+ int _fAlloc;
+ int _fUnbuf;
+ int x_lastc;
+ char* _base;
+ char* _ebuf;
+ char* _pbase;
+ char* _pptr;
+ char* _epptr;
+ char* _eback;
+ char* _gptr;
+ char* _egptr;
+};
+
+inline int streambuf::in_avail() const { return (gptr()<_egptr) ? (_egptr-gptr()) : 0; }
+inline int streambuf::out_waiting() const { return (_pptr>=_pbase) ? (_pptr-_pbase) : 0; }
+
+inline int streambuf::sputbackc(char _c){ return (_eback<gptr()) ? *(--_gptr)=_c : pbackfail(_c); }
+
+inline int streambuf::sputc(int _i){ return (_pptr<_epptr) ? (unsigned char)(*(_pptr++)=(char)_i) : overflow(_i); }
+
+inline char* streambuf::base() const { return _base; }
+inline char* streambuf::ebuf() const { return _ebuf; }
+inline int streambuf::blen() const {return ((_ebuf > _base) ? (_ebuf-_base) : 0); }
+inline char* streambuf::pbase() const { return _pbase; }
+inline char* streambuf::pptr() const { return _pptr; }
+inline char* streambuf::epptr() const { return _epptr; }
+inline char* streambuf::eback() const { return _eback; }
+inline char* streambuf::gptr() const { return _gptr; }
+inline char* streambuf::egptr() const { return _egptr; }
+inline void streambuf::gbump(int n) { if (_egptr) _gptr += n; }
+inline void streambuf::pbump(int n) { if (_epptr) _pptr += n; }
+inline void streambuf::setg(char * eb, char * g, char * eg) {_eback=eb; _gptr=g; _egptr=eg; x_lastc=EOF; }
+inline void streambuf::setp(char * p, char * ep) {_pptr=_pbase=p; _epptr=ep; }
+inline int streambuf::unbuffered() const { return _fUnbuf; }
+inline void streambuf::unbuffered(int fUnbuf) { _fUnbuf = fUnbuf; }
+
+// Restore default packing
+#pragma pack()
+
+#endif /* !_INC_STREAMB */
diff --git a/private/oleauto/tools/win16/os2/inc/string.h b/private/oleauto/tools/win16/os2/inc/string.h
new file mode 100644
index 000000000..97aafb672
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/string.h
@@ -0,0 +1,167 @@
+/***
+*string.h - declarations for string manipulation functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the function declarations for the string
+* manipulation functions.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_STRING
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+/* function prototypes */
+
+void * __cdecl _memccpy(void *, const void *,
+ int, unsigned int);
+void * __cdecl memchr(const void *, int, size_t);
+int __cdecl memcmp(const void *, const void *,
+ size_t);
+int __cdecl _memicmp(const void *, const void *,
+ unsigned int);
+void * __cdecl memcpy(void *, const void *,
+ size_t);
+void * __cdecl memmove(void *, const void *,
+ size_t);
+void * __cdecl memset(void *, int, size_t);
+void __cdecl _movedata(unsigned int, unsigned int, unsigned int,
+ unsigned int, unsigned int);
+char * __cdecl strcat(char *, const char *);
+char * __cdecl strchr(const char *, int);
+int __cdecl strcmp(const char *, const char *);
+int __cdecl _strcmpi(const char *, const char *);
+int __cdecl strcoll(const char *, const char *);
+int __cdecl _stricmp(const char *, const char *);
+char * __cdecl strcpy(char *, const char *);
+size_t __cdecl strcspn(const char *, const char *);
+char * __cdecl _strdup(const char *);
+char * __cdecl _strerror(const char *);
+char * __cdecl strerror(int);
+size_t __cdecl strlen(const char *);
+char * __cdecl _strlwr(char *);
+char * __cdecl strncat(char *, const char *,
+ size_t);
+int __cdecl strncmp(const char *, const char *,
+ size_t);
+int __cdecl _strnicmp(const char *, const char *,
+ size_t);
+char * __cdecl strncpy(char *, const char *,
+ size_t);
+char * __cdecl _strnset(char *, int, size_t);
+char * __cdecl strpbrk(const char *,
+ const char *);
+char * __cdecl strrchr(const char *, int);
+char * __cdecl _strrev(char *);
+char * __cdecl _strset(char *, int);
+size_t __cdecl strspn(const char *, const char *);
+char * __cdecl strstr(const char *,
+ const char *);
+char * __cdecl strtok(char *, const char *);
+char * __cdecl _strupr(char *);
+size_t __cdecl strxfrm (char *, const char *,
+ size_t);
+
+
+/* model independent function prototypes */
+
+void __far * __far __cdecl _fmemccpy(void __far *, const void __far *,
+ int, unsigned int);
+void __far * __far __cdecl _fmemchr(const void __far *, int, size_t);
+int __far __cdecl _fmemcmp(const void __far *, const void __far *,
+ size_t);
+void __far * __far __cdecl _fmemcpy(void __far *, const void __far *,
+ size_t);
+int __far __cdecl _fmemicmp(const void __far *, const void __far *,
+ unsigned int);
+void __far * __far __cdecl _fmemmove(void __far *, const void __far *,
+ size_t);
+void __far * __far __cdecl _fmemset(void __far *, int, size_t);
+char __far * __far __cdecl _fstrcat(char __far *, const char __far *);
+char __far * __far __cdecl _fstrchr(const char __far *, int);
+int __far __cdecl _fstrcmp(const char __far *, const char __far *);
+int __far __cdecl _fstricmp(const char __far *, const char __far *);
+char __far * __far __cdecl _fstrcpy(char __far *, const char __far *);
+size_t __far __cdecl _fstrcspn(const char __far *, const char __far *);
+char __far * __far __cdecl _fstrdup(const char __far *);
+char __near * __far __cdecl _nstrdup(const char __far *);
+size_t __far __cdecl _fstrlen(const char __far *);
+char __far * __far __cdecl _fstrlwr(char __far *);
+char __far * __far __cdecl _fstrncat(char __far *, const char __far *,
+ size_t);
+int __far __cdecl _fstrncmp(const char __far *, const char __far *,
+ size_t);
+int __far __cdecl _fstrnicmp(const char __far *, const char __far *,
+ size_t);
+char __far * __far __cdecl _fstrncpy(char __far *, const char __far *,
+ size_t);
+char __far * __far __cdecl _fstrnset(char __far *, int, size_t);
+char __far * __far __cdecl _fstrpbrk(const char __far *,
+ const char __far *);
+char __far * __far __cdecl _fstrrchr(const char __far *, int);
+char __far * __far __cdecl _fstrrev(char __far *);
+char __far * __far __cdecl _fstrset(char __far *, int);
+size_t __far __cdecl _fstrspn(const char __far *, const char __far *);
+char __far * __far __cdecl _fstrstr(const char __far *,
+ const char __far *);
+char __far * __far __cdecl _fstrtok(char __far *, const char __far *);
+char __far * __far __cdecl _fstrupr(char __far *);
+
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+void * __cdecl memccpy(void *, const void *,
+ int, unsigned int);
+int __cdecl memicmp(const void *, const void *,
+ unsigned int);
+void __cdecl movedata(unsigned int, unsigned int, unsigned int,
+ unsigned int, unsigned int);
+int __cdecl strcmpi(const char *, const char *);
+int __cdecl stricmp(const char *, const char *);
+char * __cdecl strdup(const char *);
+char * __cdecl strlwr(char *);
+int __cdecl strnicmp(const char *, const char *,
+ size_t);
+char * __cdecl strnset(char *, int, size_t);
+char * __cdecl strrev(char *);
+char * __cdecl strset(char *, int);
+char * __cdecl strupr(char *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STRING
+#endif /* _INC_STRING */
diff --git a/private/oleauto/tools/win16/os2/inc/strstrea.h b/private/oleauto/tools/win16/os2/inc/strstrea.h
new file mode 100644
index 000000000..f79af25e6
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/strstrea.h
@@ -0,0 +1,86 @@
+/***
+*strstream.h - definitions/declarations for strstreambuf, strstream
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the classes, values, macros, and functions
+* used by the strstream and strstreambuf classes.
+* [AT&T C++]
+*
+****/
+
+#ifndef _INC_STRSTREAM
+#define _INC_STRSTREAM
+
+#include <iostream.h>
+
+// Force word packing to avoid possible -Zp override
+#pragma pack(2)
+
+class strstreambuf : public streambuf {
+public:
+ strstreambuf();
+ strstreambuf(int);
+ strstreambuf(char *, int, char * = 0);
+ strstreambuf(unsigned char *, int, unsigned char * = 0);
+ strstreambuf(signed char *, int, signed char * = 0);
+ strstreambuf(void * (*a)(long), void (*f) (void*));
+ ~strstreambuf();
+
+ void freeze(int =1);
+ char* str();
+
+virtual int overflow(int);
+virtual int underflow();
+virtual streambuf* setbuf(char *, int);
+virtual streampos seekoff(streamoff, ios::seek_dir, int);
+virtual int sync(); // not in spec.
+
+protected:
+virtual int doallocate();
+private:
+ int x_dynamic;
+ int x_bufmin;
+ int _fAlloc;
+ int x_static;
+ void * (* x_alloc)(long);
+ void (* x_free)(void *);
+};
+
+class istrstream : public istream {
+public:
+ istrstream(char*);
+ istrstream(char*, int);
+ ~istrstream();
+
+inline strstreambuf* rdbuf() const { return (strstreambuf*) ios::rdbuf(); }
+inline char* str() { return rdbuf()->str(); }
+};
+
+class ostrstream : public ostream {
+public:
+ ostrstream();
+ ostrstream(char*, int, int = ios::out);
+ ~ostrstream();
+
+inline int pcount() const { return rdbuf()->out_waiting(); }
+inline strstreambuf* rdbuf() const { return (strstreambuf*) ios::rdbuf(); }
+inline char* str() { return rdbuf()->str(); }
+};
+
+class strstream : public iostream { // strstreambase ???
+public:
+ strstream();
+ strstream(char *, int, int);
+ ~strstream();
+
+inline int pcount() const { return rdbuf()->out_waiting(); } // not in spec.
+inline strstreambuf* rdbuf() const { return (strstreambuf*) ostream::rdbuf(); }
+inline char* str() { return rdbuf()->str(); }
+};
+
+// Restore default packing
+#pragma pack()
+
+#endif // !_INC_STRSTREAM
diff --git a/private/oleauto/tools/win16/os2/inc/sys/locking.h b/private/oleauto/tools/win16/os2/inc/sys/locking.h
new file mode 100644
index 000000000..f3c24c2d8
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/sys/locking.h
@@ -0,0 +1,30 @@
+/***
+*sys\locking.h - flags for locking() function
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the flags for the locking() function.
+* [System V]
+*
+****/
+
+#ifndef _INC_LOCKING
+
+#define _LK_UNLCK 0 /* unlock the file region */
+#define _LK_LOCK 1 /* lock the file region */
+#define _LK_NBLCK 2 /* non-blocking lock */
+#define _LK_RLCK 3 /* lock for writing */
+#define _LK_NBRLCK 4 /* non-blocking lock for writing */
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+#define LK_UNLCK _LK_UNLCK
+#define LK_LOCK _LK_LOCK
+#define LK_NBLCK _LK_NBLCK
+#define LK_RLCK _LK_RLCK
+#define LK_NBRLCK _LK_NBRLCK
+#endif
+
+#define _INC_LOCKING
+#endif /* _INC_LOCKING */
diff --git a/private/oleauto/tools/win16/os2/inc/sys/stat.h b/private/oleauto/tools/win16/os2/inc/sys/stat.h
new file mode 100644
index 000000000..55c4a72f2
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/sys/stat.h
@@ -0,0 +1,104 @@
+/***
+*sys\stat.h - defines structure used by stat() and fstat()
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the structure used by the stat() and fstat()
+* routines.
+* [System V]
+*
+****/
+
+#ifndef _INC_STAT
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _TIME_T_DEFINED
+typedef unsigned long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+/* define structure for returning status information */
+
+#ifndef _STAT_DEFINED
+#pragma pack(2)
+
+struct _stat {
+ _dev_t st_dev;
+ _ino_t st_ino;
+ unsigned short st_mode;
+ short st_nlink;
+ short st_uid;
+ short st_gid;
+ _dev_t st_rdev;
+ _off_t st_size;
+ time_t st_atime;
+ time_t st_mtime;
+ time_t st_ctime;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+struct stat {
+ _dev_t st_dev;
+ _ino_t st_ino;
+ unsigned short st_mode;
+ short st_nlink;
+ short st_uid;
+ short st_gid;
+ _dev_t st_rdev;
+ _off_t st_size;
+ time_t st_atime;
+ time_t st_mtime;
+ time_t st_ctime;
+ };
+#endif
+
+#pragma pack()
+#define _STAT_DEFINED
+#endif
+
+#define _S_IFMT 0170000 /* file type mask */
+#define _S_IFDIR 0040000 /* directory */
+#define _S_IFCHR 0020000 /* character special */
+#define _S_IFREG 0100000 /* regular */
+#define _S_IREAD 0000400 /* read permission, owner */
+#define _S_IWRITE 0000200 /* write permission, owner */
+#define _S_IEXEC 0000100 /* execute/search permission, owner */
+
+
+/* function prototypes */
+
+int __cdecl _fstat(int, struct _stat *);
+int __cdecl _stat(char *, struct _stat *);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define S_IFMT _S_IFMT
+#define S_IFDIR _S_IFDIR
+#define S_IFCHR _S_IFCHR
+#define S_IFREG _S_IFREG
+#define S_IREAD _S_IREAD
+#define S_IWRITE _S_IWRITE
+#define S_IEXEC _S_IEXEC
+
+int __cdecl fstat(int, struct stat *);
+int __cdecl stat(char *, struct stat *);
+
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_STAT
+#endif /* _INC_STAT */
diff --git a/private/oleauto/tools/win16/os2/inc/sys/timeb.h b/private/oleauto/tools/win16/os2/inc/sys/timeb.h
new file mode 100644
index 000000000..498ee0938
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/sys/timeb.h
@@ -0,0 +1,69 @@
+/***
+*sys\timeb.h - definition/declarations for ftime()
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file define the ftime() function and the types it uses.
+* [System V]
+*
+****/
+
+#ifndef _INC_TIMEB
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _TIME_T_DEFINED
+typedef unsigned long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+/* structure returned by ftime system call */
+
+#ifndef _TIMEB_DEFINED
+#pragma pack(2)
+
+struct _timeb {
+ time_t time;
+ unsigned short millitm;
+ short timezone;
+ short dstflag;
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+struct timeb {
+ time_t time;
+ unsigned short millitm;
+ short timezone;
+ short dstflag;
+ };
+#endif
+
+#pragma pack()
+#define _TIMEB_DEFINED
+#endif
+
+
+/* function prototypes */
+
+void __cdecl _ftime(struct _timeb *);
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+void __cdecl ftime(struct timeb *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_TIMEB
+#endif /* _INC_TIMEB */
diff --git a/private/oleauto/tools/win16/os2/inc/sys/types.h b/private/oleauto/tools/win16/os2/inc/sys/types.h
new file mode 100644
index 000000000..e9d99cf77
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/sys/types.h
@@ -0,0 +1,48 @@
+/***
+*sys\types.h - types returned by system level calls for file and time info
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines types used in defining values returned by system
+* level calls for file status and time information.
+* [System V]
+*
+****/
+
+#ifndef _INC_TYPES
+
+#ifndef _TIME_T_DEFINED
+typedef unsigned long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+#ifndef _INO_T_DEFINED
+typedef unsigned short _ino_t; /* i-node number (not used on DOS) */
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+typedef unsigned short ino_t;
+#endif
+#define _INO_T_DEFINED
+#endif
+
+#ifndef _DEV_T_DEFINED
+typedef short _dev_t; /* device code */
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+typedef short dev_t;
+#endif
+#define _DEV_T_DEFINED
+#endif
+
+#ifndef _OFF_T_DEFINED
+typedef long _off_t; /* file offset value */
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+typedef long off_t;
+#endif
+#define _OFF_T_DEFINED
+#endif
+
+#define _INC_TYPES
+#endif /* _INC_TYPES */
diff --git a/private/oleauto/tools/win16/os2/inc/sys/utime.h b/private/oleauto/tools/win16/os2/inc/sys/utime.h
new file mode 100644
index 000000000..81a7b2c96
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/sys/utime.h
@@ -0,0 +1,66 @@
+/***
+*sys\utime.h - definitions/declarations for utime()
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines the structure used by the utime routine to set
+* new file access and modification times. NOTE - MS-DOS
+* does not recognize access time, so this field will
+* always be ignored and the modification time field will be
+* used to set the new time.
+*
+****/
+
+#ifndef _INC_UTIME
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#endif
+
+#ifndef _TIME_T_DEFINED
+typedef unsigned long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+/* define struct used by utime() function */
+
+#ifndef _UTIMBUF_DEFINED
+
+struct _utimbuf {
+ time_t actime; /* access time */
+ time_t modtime; /* modification time */
+ };
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+struct utimbuf {
+ time_t actime; /* access time */
+ time_t modtime; /* modification time */
+ };
+#endif
+
+#define _UTIMBUF_DEFINED
+#endif
+
+
+/* function prototypes */
+
+int __cdecl _utime(char *, struct _utimbuf *);
+
+#ifndef __STDC__
+/* Non-ANSI name for compatibility */
+int __cdecl utime(char *, struct utimbuf *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_UTIME
+#endif /* _INC_UTIME */
diff --git a/private/oleauto/tools/win16/os2/inc/test.h b/private/oleauto/tools/win16/os2/inc/test.h
new file mode 100644
index 000000000..232fe6cd1
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/test.h
@@ -0,0 +1,248 @@
+/* Test.h -- testing include file.
+ *
+ * This include file contains macros and functions for reporting
+ * test failures.
+ *
+ * Required constants:
+ *
+ * test -- char array, name of test.
+ * perfect -- int, test success/failure flag, == 0 -> fail
+ *
+ *
+ * Macros/functions defined are:
+ *
+ * check( e ) -- confirm that expression e is zero.
+ * checke( e1, e2 ) -- confirm that expressions e1 and e2 are equal.
+ * checkne( e1, e2 ) -- confirm that expressions e1 and e2 are NOT equal.
+ * fail( n ) -- report failure, test number specified.
+ * faill( ) -- report failure, no test number specified.
+ * finish() -- summarize test pass/fail status.
+ *
+ *
+ * Modifications
+ * M000 22-Mar-89 waltcr
+ * - added #includes for stdio, and stdlib. removed defines of cdecl and near.
+ * M001 06-Apr-89 waltcr
+ * - doscalls doesn't exist anymore. now use os2.h. change DOSSLEEP to DosSleep
+ * M001 06-Apr-89 waltcr
+ * - define REGVARS macro to help find more optimization bugs.
+ * M002 20-May-89 waltcr
+ * - convert function declerations to new style function declerations.
+ * M003 06-Jun-89 waltcr
+ * - define INCL_NOPM so when os2.h is included, pm headers are not included.
+ * M004 27-Mar-90 mattheww
+ * - define far etc. to nothing if using c386 compiler
+ * M005 29-Mar-90 waltcr
+ * - merge in CXX test.h - change finish() to macro, define TEST_H.
+ * M006 02-Apr-90 mrw
+ * - remove MTHREAD if's and put them into seperate THREAD.H
+ * M007 10-Apr-90 chauv
+ * - changed most "int" variables to "unsigned long" variables.
+ * - changed those "%d" associated with "int" variables to "%lu" in printf().
+ * M008 12-Apr-90 mattheww
+ * - move c386 specific defines to a seperate include file c386.h (undo M004)
+ * - put printf back in check_func (mistakenly deleted before)
+ * M009 31-May-90 brucemc
+ * - added CALLCONV as macro for _cdecl vs _stdcall prototypes.
+ * M010 06-Jun-90 chauv
+ * - changed all "unsigned long" back to "int" and duplicate these
+ * - functions for unsigned long adding "32" to function name.
+ * M011 20-Jun-90 mattheww
+ * - fixed format spec for printing line number in faill_func()
+ * M012 28-Dec-90 alans
+ * - undefined fail() when __IOSTREAM_H is defined due to conflict with
+ * - ios::fail() member function.
+ * M013 16-May-91 tomca
+ * - c7/386 defines _M_I386 only (not M_I386)
+ * M014 01-Aug-91 bos
+ * - Modified printf statements for Failure output to confirm with
+ * - standard C error output. This allows PWB and M to track a test's
+ * - runtime errors in the build results window.
+ * M015 01-Aug-91 xiangjun
+ * - remove "#include <callcon.h>" because of the usage change of "stdcall"
+ * - and "#define CALLCONV" to make the tests still valid.
+ * M016 23-Aug-91 georgech
+ * - remove _threadid duplicated in thread.h as far
+ *
+ */
+
+
+#include <stdio.h> /* M000 */
+#include <stdlib.h>
+/* M009 */
+/* M015
+#include <callcon.h>
+*/
+#define CALLCONV
+
+
+/* M005*/
+#ifndef TEST_H
+#define TEST_H
+
+/* M005*/
+#if defined( __cplusplus )
+extern "C" {
+#endif
+
+/* M008 */
+#if defined(M_I386) || defined(_M_I386)
+ #include <c386.h>
+#endif
+
+#define REGVARS register int _r1 = 1; register int _r2 = 2 /* M002 */
+
+
+#define T(x) x
+#define V(x) x
+#define PDV(x) x
+#define starthread() perfect = 0
+#define startest() perfect = 0
+
+extern char Result[ 64 ] ;
+extern unsigned Synchronize ;
+extern char test[];
+extern int T(perfect);
+// extern int * _threadid ; /* M016 */
+
+/* the use of "far pascal" was conflicting with use of -Za switch, so */
+/* replaced prototype of DOSSLEEP with following three lines, 7-6-88 */
+
+void check_func(int a,int l);
+void checke_func(int a,int b,int l);
+void checkne_func(int a,int b,int l);
+void fail_func(int n,int l);
+void faill_func(int l);
+
+/* M010 */
+void check_func32(unsigned long a,unsigned long l);
+void checke_func32(unsigned long a,unsigned long b,unsigned long l);
+void checkne_func32(unsigned long a,unsigned long b,unsigned long l);
+void fail_func32(unsigned long n,unsigned long l);
+void faill_func32(unsigned long l);
+
+
+/* This macro is used to confirm its argument is zero.
+*/
+#define check( a ) check_func( (int)(a), __LINE__ )
+#define check32( a ) check_func32( (unsigned long)(a), __LINE__ ) /* M010 */
+
+void check_func( int a, int l )
+{
+ if( !a ) return;
+ printf("%s(%d): Failure: --- %d != 0\n",test, l, a );
+ V(perfect) = 1;
+}
+
+/* M010 */
+void check_func32( unsigned long a, unsigned long l )
+{
+ if( !a ) return;
+ printf("%s(%lu): Failure: --- %lu != 0\n",test, l, a );
+ V(perfect) = 1;
+}
+
+
+/* This macro is used to confirm its arguments are equal.
+*/
+#define checke( a, b ) checke_func( (int)(a), (int)(b), __LINE__ )
+#define checke32( a, b ) checke_func32( (unsigned long)(a), (unsigned long)(b), __LINE__ ) /* M010 */
+
+void checke_func(int a, int b, int l )
+{
+ if( a == b ) return;
+ printf("%s(%d): Failure: --- %d != %d\n",test, l, a, b );
+ V(perfect) = 1;
+}
+
+/* M010 */
+void checke_func32(unsigned long a, unsigned long b, unsigned long l )
+{
+ if( a == b ) return;
+ printf("%s(%lu): Failure: --- %lu != %lu\n",test, l, a, b );
+ V(perfect) = 1;
+}
+
+
+/* This macro is used to confirm its arguments are NOT equal.
+*/
+#define checkne( a, b ) checkne_func( (int)(a), (int)(b), __LINE__ )
+#define checkne32( a, b ) checkne_func32( (int)(a), (int)(b), __LINE__ ) /* M010 */
+
+void checkne_func( int a, int b, int l )
+{
+ if( a != b ) return;
+ printf("%s(%d): Failure: --- %d == %d\n",test, l, a, b );
+ V(perfect) = 1;
+}
+
+/* M010 */
+void checkne_func32( unsigned long a, unsigned long b, unsigned long l )
+{
+ if( a != b ) return;
+ printf("%s(%lu): Failure: --- %lu == %lu\n",test, l, a, b );
+ V(perfect) = 1;
+}
+
+
+/* This macro is used to report failures of tests that are explicitely
+ * numbered.
+*/
+#define fail( n ) fail_func( (n), __LINE__ )
+#define fail32( n ) fail_func32( (n), __LINE__ ) /* M010 */
+
+void fail_func( int n, int l )
+{
+ printf("%s(%d): Failure: --- test %d\n",test, l, n );
+ V(perfect) = 1;
+}
+
+/* M010 */
+void fail_func32( unsigned long n, unsigned long l )
+{
+ printf("%s(%lu): Failure: --- test %lu\n",test, l, n );
+ V(perfect) = 1;
+}
+
+
+/* This macro is used to report failures of tests that are NOT explicitely
+ * numbered.
+*/
+#define faill( ) faill_func( __LINE__ )
+#define faill32( ) faill_func32( __LINE__ ) /* M010 */
+
+void faill_func( int l )
+{
+ printf("%s(%d): Failure:\n",test, l); /* M011 */
+ V(perfect) = 1;
+}
+
+/* M010 */
+void faill_func32( unsigned long l )
+{
+ printf("%s(%lu): Failure:\n",test, l);
+ V(perfect) = 1;
+}
+
+
+/* Report test results
+**
+*/
+
+
+#define finish() \
+ if( !V(perfect) ) printf("%s: ***** PASSED *****\n",test); \
+ else printf("%s: ----- FAILED -----\n",test); \
+ return (int)( V(perfect) ? 1 : 0 )
+
+/* M012 */
+#if defined(__IOSTREAM_H)
+ #undef fail
+#endif
+
+#if defined( __cplusplus )
+};
+#endif
+
+
+#endif /* #ifndef TEST_H */
diff --git a/private/oleauto/tools/win16/os2/inc/time.h b/private/oleauto/tools/win16/os2/inc/time.h
new file mode 100644
index 000000000..934df5a3c
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/time.h
@@ -0,0 +1,125 @@
+/***
+*time.h - definitions/declarations for time routines
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file contains the various declarations and definitions
+* for the time routines.
+* [ANSI/System V]
+*
+****/
+
+#ifndef _INC_TIME
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (_MSC_VER <= 600)
+#define __cdecl _cdecl
+#define __far _far
+#define __near _near
+#define __pascal _pascal
+#endif
+
+/* implementation defined time types */
+
+#ifndef _TIME_T_DEFINED
+typedef unsigned long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+#ifndef _CLOCK_T_DEFINED
+typedef long clock_t;
+#define _CLOCK_T_DEFINED
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+/* structure for use with localtime(), gmtime(), etc. */
+
+#ifndef _TM_DEFINED
+struct tm {
+ int tm_sec; /* seconds after the minute - [0,59] */
+ int tm_min; /* minutes after the hour - [0,59] */
+ int tm_hour; /* hours since midnight - [0,23] */
+ int tm_mday; /* day of the month - [1,31] */
+ int tm_mon; /* months since January - [0,11] */
+ int tm_year; /* years since 1900 */
+ int tm_wday; /* days since Sunday - [0,6] */
+ int tm_yday; /* days since January 1 - [0,365] */
+ int tm_isdst; /* daylight savings time flag */
+ };
+#define _TM_DEFINED
+#endif
+
+
+/* define NULL pointer value */
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+
+/* clock ticks macro - ANSI version */
+
+#define CLOCKS_PER_SEC 1000
+
+
+/* extern declarations for the global variables used by the ctime family of
+ * routines.
+ */
+
+extern int __near __cdecl _daylight; /* non-zero if daylight savings time is used */
+extern long __near __cdecl _timezone; /* difference in seconds between GMT and local time */
+extern char * __near __cdecl _tzname[2];/* standard/daylight savings time zone names */
+
+
+/* function prototypes */
+
+double __cdecl difftime(time_t, time_t);
+
+char * __cdecl asctime(const struct tm *);
+char * __cdecl ctime(const time_t *);
+#ifndef _WINDLL
+clock_t __cdecl clock(void);
+#endif
+struct tm * __cdecl gmtime(const time_t *);
+struct tm * __cdecl localtime(const time_t *);
+time_t __cdecl mktime(struct tm *);
+#ifndef _WINDLL
+size_t __cdecl strftime(char *, size_t, const char *,
+ const struct tm *);
+#endif
+char * __cdecl _strdate(char *);
+char * __cdecl _strtime(char *);
+time_t __cdecl time(time_t *);
+void __cdecl _tzset(void);
+
+#ifndef __STDC__
+/* Non-ANSI names for compatibility */
+
+#define CLK_TCK CLOCKS_PER_SEC
+
+extern int __near __cdecl daylight;
+extern long __near __cdecl timezone;
+extern char * __near __cdecl tzname[2];
+
+void __cdecl tzset(void);
+
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_TIME
+#endif /* _INC_TIME */
diff --git a/private/oleauto/tools/win16/os2/inc/toolhelp.h b/private/oleauto/tools/win16/os2/inc/toolhelp.h
new file mode 100644
index 000000000..42cc6e1df
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/toolhelp.h
@@ -0,0 +1,505 @@
+/**************************************************************************
+ * TOOLHELP.H
+ *
+ * Header file for applications using the TOOLHELP.DLL
+ *
+ **************************************************************************/
+
+#ifndef TOOLHELP_H
+#define TOOLHELP_H
+
+/* ----- General symbols ----- */
+#define MAX_DATA 11
+#define MAX_PATH 255
+#define MAX_MODULE_NAME 8 + 1
+#define MAX_CLASSNAME 255
+
+/* ----- Global heap walking ----- */
+
+typedef struct tagGLOBALINFO
+{
+ DWORD dwSize;
+ WORD wcItems;
+ WORD wcItemsFree;
+ WORD wcItemsLRU;
+} GLOBALINFO;
+
+typedef struct tagGLOBALENTRY
+{
+ DWORD dwSize;
+ DWORD dwAddress;
+ DWORD dwBlockSize;
+ HANDLE hBlock;
+ WORD wcLock;
+ WORD wcPageLock;
+ WORD wFlags;
+ BOOL wHeapPresent;
+ HANDLE hOwner;
+ WORD wType;
+ WORD wData;
+ DWORD dwNext;
+ DWORD dwNextAlt;
+} GLOBALENTRY;
+
+ BOOL FAR PASCAL GlobalInfo(
+ GLOBALINFO FAR *lpGlobalInfo);
+
+ BOOL FAR PASCAL GlobalFirst(
+ GLOBALENTRY FAR *lpGlobal,
+ WORD wFlags);
+
+ BOOL FAR PASCAL GlobalNext(
+ GLOBALENTRY FAR *lpGlobal,
+ WORD wFlags);
+
+ BOOL FAR PASCAL GlobalEntryHandle(
+ GLOBALENTRY FAR *lpGlobal,
+ HANDLE hItem);
+
+ BOOL FAR PASCAL GlobalEntryModule(
+ GLOBALENTRY FAR *lpGlobal,
+ HANDLE hModule,
+ WORD wSeg);
+
+/* GlobalFirst()/GlobalNext() flags */
+#define GLOBAL_ALL 0
+#define GLOBAL_LRU 1
+#define GLOBAL_FREE 2
+
+/* GLOBALENTRY.wType entries */
+#define GT_UNKNOWN 0
+#define GT_DGROUP 1
+#define GT_DATA 2
+#define GT_CODE 3
+#define GT_TASK 4
+#define GT_RESOURCE 5
+#define GT_MODULE 6
+#define GT_FREE 7
+#define GT_INTERNAL 8
+#define GT_SENTINEL 9
+#define GT_BURGERMASTER 10
+
+/* If GLOBALENTRY.wType==GT_RESOURCE, the following is GLOBALENTRY.wData: */
+#define GD_USERDEFINED 0
+#define GD_CURSORCOMPONENT 1
+#define GD_BITMAP 2
+#define GD_ICONCOMPONENT 3
+#define GD_MENU 4
+#define GD_DIALOG 5
+#define GD_STRING 6
+#define GD_FONTDIR 7
+#define GD_FONT 8
+#define GD_ACCELERATORS 9
+#define GD_RCDATA 10
+#define GD_ERRTABLE 11
+#define GD_CURSOR 12
+#define GD_ICON 14
+#define GD_NAMETABLE 15
+#define GD_MAX_RESOURCE 15
+
+/* GLOBALENTRY.wFlags */
+#define GF_PDB_OWNER 0x0100 /* Low byte is KERNEL flags */
+
+/* ----- Local heap walking ----- */
+
+typedef struct tagLOCALINFO
+{
+ DWORD dwSize;
+ WORD wcItems;
+} LOCALINFO;
+
+typedef struct tagLOCALENTRY
+{
+ DWORD dwSize;
+ HANDLE hHandle;
+ WORD wAddress;
+ WORD wSize;
+ WORD wFlags;
+ WORD wcLock;
+ WORD wType;
+ WORD hHeap;
+ WORD wHeapType;
+ WORD wNext;
+} LOCALENTRY;
+
+ BOOL FAR PASCAL LocalInfo(
+ LOCALINFO FAR *lpLocal,
+ HANDLE hHeap);
+
+ BOOL FAR PASCAL LocalFirst(
+ LOCALENTRY FAR *lpLocal,
+ HANDLE hHeap);
+
+ BOOL FAR PASCAL LocalNext(
+ LOCALENTRY FAR *lpLocal);
+
+/* LOCALENTRY.wHeapType flags */
+#define NORMAL_HEAP 0
+#define USER_HEAP 1
+#define GDI_HEAP 2
+
+/* LOCALENTRY.wFlags */
+#define LF_FIXED 1
+#define LF_FREE 2
+#define LF_MOVEABLE 4
+
+/* LOCALENTRY.wType */
+#define LT_NORMAL 0
+#define LT_FREE 0xff
+#define LT_GDI_PEN 1 /* LT_GDI_* is for GDI's heap */
+#define LT_GDI_BRUSH 2
+#define LT_GDI_FONT 3
+#define LT_GDI_PALETTE 4
+#define LT_GDI_BITMAP 5
+#define LT_GDI_RGN 6
+#define LT_GDI_DC 7
+#define LT_GDI_DISABLED_DC 8
+#define LT_GDI_METADC 9
+#define LT_GDI_METAFILE 10
+#define LT_GDI_MAX LT_GDI_METAFILE
+#define LT_USER_CLASS 1 /* LT_USER_* is for USER's heap */
+#define LT_USER_WND 2
+#define LT_USER_STRING 3
+#define LT_USER_MENU 4
+#define LT_USER_CLIP 5
+#define LT_USER_CBOX 6
+#define LT_USER_PALETTE 7
+#define LT_USER_ED 8
+#define LT_USER_BWL 9
+#define LT_USER_OWNERDRAW 10
+#define LT_USER_SPB 11
+#define LT_USER_CHECKPOINT 12
+#define LT_USER_DCE 13
+#define LT_USER_MWP 14
+#define LT_USER_PROP 15
+#define LT_USER_LBIV 16
+#define LT_USER_MISC 17
+#define LT_USER_ATOMS 18
+#define LT_USER_LOCKINPUTSTATE 19
+#define LT_USER_HOOKLIST 20
+#define LT_USER_USERSEEUSERDOALLOC 21
+#define LT_USER_HOTKEYLIST 22
+#define LT_USER_POPUPMENU 23
+#define LT_USER_HANDLETABLE 32
+#define LT_USER_MAX LT_USER_HANDLETABLE
+
+/* ----- Stack Tracing ----- */
+
+typedef struct tagSTACKTRACEENTRY
+{
+ DWORD dwSize;
+ HANDLE hTask;
+ WORD wSS;
+ WORD wBP;
+ WORD wCS;
+ WORD wIP;
+ HANDLE hModule;
+ WORD wSegment;
+ WORD wFlags;
+} STACKTRACEENTRY;
+
+ BOOL FAR PASCAL StackTraceFirst(
+ STACKTRACEENTRY FAR *lpStackTrace,
+ HANDLE hTask);
+
+ BOOL FAR PASCAL StackTraceCSIPFirst(
+ STACKTRACEENTRY FAR *lpStackTrace,
+ WORD wSS,
+ WORD wCS,
+ WORD wIP,
+ WORD wBP);
+
+ BOOL FAR PASCAL StackTraceNext(
+ STACKTRACEENTRY FAR *lpStackTrace);
+
+/* STACKTRACEENTRY.wFlags values */
+#define FRAME_FAR 0
+#define FRAME_NEAR 1
+
+/* ----- Module list walking ----- */
+
+typedef struct tagMODULEENTRY
+{
+ DWORD dwSize;
+ char szModule[MAX_MODULE_NAME + 1];
+ HANDLE hModule;
+ WORD wUsageFlags;
+ char szExePath[MAX_PATH + 1];
+ WORD wNext;
+} MODULEENTRY;
+
+ BOOL FAR PASCAL ModuleFirst(
+ MODULEENTRY FAR *lpModule);
+
+ BOOL FAR PASCAL ModuleNext(
+ MODULEENTRY FAR *lpModule);
+
+ HANDLE FAR PASCAL ModuleFindName(
+ MODULEENTRY FAR *lpModule,
+ LPSTR lpstrName);
+
+ HANDLE FAR PASCAL ModuleFindHandle(
+ MODULEENTRY FAR *lpModule,
+ HANDLE hModule);
+
+/* ----- Task list walking ----- */
+
+typedef struct tagTASKENTRY
+{
+ DWORD dwSize;
+ HANDLE hTask;
+ HANDLE hTaskParent;
+ HANDLE hInst;
+ HANDLE hModule;
+ WORD wSS;
+ WORD wSP;
+ WORD wStackTop;
+ WORD wStackMinimum;
+ WORD wStackBottom;
+ WORD wcEvents;
+ HANDLE hQueue;
+ char szModule[MAX_MODULE_NAME + 1];
+ WORD wPSPOffset;
+ HANDLE hNext;
+} TASKENTRY;
+
+ BOOL FAR PASCAL TaskFirst(
+ TASKENTRY FAR *lpTask);
+
+ BOOL FAR PASCAL TaskNext(
+ TASKENTRY FAR *lpTask);
+
+ BOOL FAR PASCAL TaskFindHandle(
+ TASKENTRY FAR *lpTask,
+ HANDLE hTask);
+
+ DWORD FAR PASCAL TaskSetCSIP(
+ HANDLE hTask,
+ WORD wCS,
+ WORD wIP);
+
+ DWORD FAR PASCAL TaskGetCSIP(
+ HANDLE hTask,
+ WORD wCS,
+ WORD wIP);
+
+ BOOL FAR PASCAL TaskSwitch(
+ HANDLE hTask,
+ DWORD dwNewCSIP);
+
+/* ----- Window Class enumeration ----- */
+
+typedef struct tagCLASSENTRY
+{
+ DWORD dwSize;
+ HANDLE hInst;
+ char szClassName[MAX_CLASSNAME + 1];
+ WORD wNext;
+} CLASSENTRY;
+
+ BOOL FAR PASCAL ClassFirst(
+ CLASSENTRY FAR *lpClass);
+
+ BOOL FAR PASCAL ClassNext(
+ CLASSENTRY FAR *lpClass);
+
+/* ----- Information functions ----- */
+
+typedef struct tagMEMMANINFO
+{
+ DWORD dwSize;
+ DWORD dwLargestFreeBlock;
+ DWORD dwMaxPagesAvailable;
+ DWORD dwMaxPagesLockable;
+ DWORD dwTotalLinearSpace;
+ DWORD dwTotalUnlockedPages;
+ DWORD dwFreePages;
+ DWORD dwTotalPages;
+ DWORD dwFreeLinearSpace;
+ DWORD dwSwapFilePages;
+ WORD wPageSize;
+} MEMMANINFO;
+
+ BOOL FAR PASCAL MemManInfo(
+ MEMMANINFO FAR *lpEnhMode);
+
+typedef struct tagUSERHEAPINFO
+{
+ DWORD dwSize;
+ WORD wHeapFree;
+ WORD wMaxHeapSize;
+ WORD wPercentFree;
+ HANDLE hSegment;
+} USERHEAPINFO;
+
+ BOOL FAR PASCAL UserHeapInfo(
+ USERHEAPINFO FAR *lpUser);
+
+typedef struct tagGDIHEAPINFO
+{
+ DWORD dwSize;
+ WORD wHeapFree;
+ WORD wMaxHeapSize;
+ WORD wPercentFree;
+ HANDLE hSegment;
+} GDIHEAPINFO;
+
+ BOOL FAR PASCAL GDIHeapInfo(
+ GDIHEAPINFO FAR *lpGDI);
+
+/* ----- Interrupt Handling ----- */
+
+typedef void (FAR PASCAL *LPFNINTCALLBACK)(void);
+
+ BOOL FAR PASCAL InterruptRegister(
+ HANDLE hTask,
+ LPFNINTCALLBACK lpfnIntCallback);
+
+ BOOL FAR PASCAL InterruptUnRegister(
+ HANDLE hTask);
+
+/* Hooked interrupts */
+#define INT_DIV0 0
+#define INT_1 1
+#define INT_2 2
+#define INT_3 3
+#define INT_UDINSTR 6
+#define INT_GPFAULT 13
+#define INT_CTLALTSYSRQ 256
+
+/* Notifications:
+ * When a notification callback is called, two parameters are passed
+ * in: a WORD, wID, and another DWORD, dwData. wID is one of
+ * the values NFY_* below. Callback routines should ignore unrecog-
+ * nized values to preserve future compatibility. Callback routines
+ * are also passed a dwData value. This may contain data or may be
+ * a FAR pointer to a structure, or may not be used depending on
+ * which notification is being received.
+ *
+ * In all cases, if the return value of the callback is TRUE, the
+ * notification will NOT be passed on to other callbacks. It has
+ * been handled. This should be used sparingly and only with certain
+ * notifications. Callbacks almost always return FALSE.
+ */
+
+/* NFY_UNKNOWN: An unknown notification has been returned from KERNEL. Apps
+ * should ignore these.
+ */
+#define NFY_UNKNOWN 0
+
+/* NFY_LOADSEG: dwData points to a NFYLOADSEG structure */
+#define NFY_LOADSEG 1
+typedef struct tagNFYLOADSEG
+{
+ DWORD dwSize;
+ WORD wSelector;
+ WORD wSegNum;
+ WORD wType;
+ HANDLE hInstance;
+ LPSTR lpstrModuleName;
+} NFYLOADSEG;
+
+/* NFY_FREESEG: LOWORD(dwData) is the selector of the segment being freed */
+#define NFY_FREESEG 2
+
+/* NFY_STARTTASK: dwData points to a NFYSTARTTASK structure */
+#define NFY_STARTTASK 3
+typedef struct tagNFYSTARTTASK
+{
+ DWORD dwSize;
+ HANDLE hInstance;
+ WORD wCS;
+ WORD wIP;
+} NFYSTARTTASK;
+
+/* NFY_EXITTASK: The low byte of dwData contains the program exit code */
+#define NFY_EXITTASK 4
+
+/* NFY_LOADDLL: dwData points to a NFYLOADDLL structure */
+#define NFY_LOADDLL 5
+typedef struct tagNFYLOADDLL
+{
+ DWORD dwSize;
+ HANDLE hModule;
+ WORD wCS;
+ WORD wIP;
+} NFYLOADDLL;
+
+/* NFY_DELMODULE: LOWORD(dwData) is the handle of the module to be freed */
+#define NFY_DELMODULE 6
+
+/* NFY_DEBUGSTR: dwData points to the string to be output */
+#define NFY_DEBUGSTR 7
+
+/* NFY_RIP: dwData points to a NFYRIP structure */
+#define NFY_RIP 8
+typedef struct tagNFYRIP
+{
+ WORD wExitCode;
+ WORD wCS;
+ WORD wIP;
+} NFYRIP;
+
+/* NFY_TASKIN: LOWORD(dwData) is the hTask for the entering task */
+#define NFY_TASKIN 9
+
+/* NFY_TASKOUT: LOWORD(dwData) is the hTask for the task being left */
+#define NFY_TASKOUT 10
+
+/* NFY_INCHAR: Return value from callback is used. If NULL, mapped to 'i' */
+#define NFY_INCHAR 11
+
+/* NFY_OUTSTR: dwData points to the string to be displayed */
+#define NFY_OUTSTR 12
+
+typedef BOOL (FAR PASCAL *LPFNNOTIFYCALLBACK)(
+ WORD wID,
+ DWORD dwData);
+
+ BOOL FAR PASCAL NotifyRegister(
+ HANDLE hTask,
+ LPFNNOTIFYCALLBACK lpfn,
+ WORD wFlags);
+
+ BOOL FAR PASCAL NotifyUnRegister(
+ HANDLE hTask);
+
+/* NotifyRegister() flags */
+#define NF_NORMAL 0
+#define NF_TASKSWITCH 1
+#define NF_RIP 2
+#define NF_DEBUGSTR 4
+
+/* ----- Miscellaneous ----- */
+
+ void FAR PASCAL TerminateApp(
+ HANDLE hTask,
+ WORD wFlags);
+
+/* TerminateApp() flag values */
+#define UAE_BOX 0
+#define NO_UAE_BOX 1
+
+ DWORD FAR PASCAL MemoryRead(
+ WORD wSel,
+ DWORD dwOffset,
+ LPSTR lpBuffer,
+ DWORD dwcb);
+
+ DWORD FAR PASCAL MemoryWrite(
+ WORD wSel,
+ DWORD dwOffset,
+ LPSTR lpBuffer,
+ DWORD dwcb);
+
+typedef struct tagTIMERINFO
+{
+ DWORD dwSize;
+ DWORD dwmsSinceStart;
+ DWORD dwmsThisVM;
+} TIMERINFO;
+
+ BOOL FAR PASCAL TimerCount(
+ TIMERINFO FAR *lpTimer);
+
+#endif /* ifndef TOOLHELP_H */
diff --git a/private/oleauto/tools/win16/os2/inc/varargs.h b/private/oleauto/tools/win16/os2/inc/varargs.h
new file mode 100644
index 000000000..4d15cec14
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/varargs.h
@@ -0,0 +1,52 @@
+/***
+*varargs.h - XENIX style macros for variable argument functions
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This file defines XENIX style macros for accessing arguments of a
+* function which takes a variable number of arguments.
+* [System V]
+*
+****/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _WINDLL
+#define _FARARG_ __far
+#else
+#define _FARARG_
+#endif
+
+#if (_MSC_VER <= 600)
+#define __far _far
+#endif
+
+#ifdef __STDC__
+#error varargs.h incompatible with ANSI (use stdarg.h)
+#endif
+
+#ifndef _VA_LIST_DEFINED
+typedef char _FARARG_ *va_list;
+#define _VA_LIST_DEFINED
+#endif
+
+/*
+ * define a macro to compute the size of a type, variable or expression,
+ * rounded up to the nearest multiple of sizeof(int). This number is its
+ * size as function argument (Intel architecture). Note that the macro
+ * depends on sizeof(int) being a power of 2!
+ */
+
+#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
+
+#define va_dcl va_list va_alist;
+#define va_start(ap) ap = (va_list)&va_alist
+#define va_arg(ap,t) ( *(t _FARARG_ *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
+#define va_end(ap) ap = (va_list)0
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/private/oleauto/tools/win16/os2/inc/ver.h b/private/oleauto/tools/win16/os2/inc/ver.h
new file mode 100644
index 000000000..cc8f0501e
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/ver.h
@@ -0,0 +1,255 @@
+/*****************************************************************************\
+* *
+* ver.h - Version management functions, types, and definitions *
+* *
+* Include file for VER.DLL and VER.LIB. These libraries are *
+* designed to allow version stamping of Windows executable files*
+* and of special .VER files for DOS executable files. *
+* *
+* The API is unchanged for LIB and DLL versions. *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved *
+* *
+*******************************************************************************
+*
+* #define LIB - To be used with VER.LIB (default is for VER.DLL)
+*
+\*****************************************************************************/
+
+#ifndef _INC_VER
+#define _INC_VER
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/*
+ * If .lib version is being used, declare types used in this file.
+ */
+#ifdef LIB
+
+#ifndef WINAPI /* don't declare if they're already declared */
+#define WINAPI _far _pascal
+#define NEAR _near
+#define FAR _far
+#define PASCAL _pascal
+typedef int BOOL;
+#define TRUE 1
+#define FALSE 0
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned int UINT;
+typedef signed long LONG;
+typedef unsigned long DWORD;
+typedef char far* LPSTR;
+typedef const char far* LPCSTR;
+typedef int HFILE;
+#define OFSTRUCT void /* Not used by the .lib version */
+#define LOWORD(l) ((WORD)(l))
+#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
+#define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))
+#endif /* WINAPI */
+
+#else /* LIB */
+
+/* If .dll version is being used and we're being included with
+ * the 3.0 windows.h, #define compatible type aliases.
+ * If included with the 3.0 windows.h, #define compatible aliases
+ */
+#ifndef _INC_WINDOWS
+#define UINT WORD
+#define LPCSTR LPSTR
+#define HFILE int
+#endif /* !_INC_WINDOWS */
+
+#endif /* !LIB */
+
+/* ----- RC defines ----- */
+#ifdef RC_INVOKED
+#define ID(id) id
+#else
+#define ID(id) MAKEINTRESOURCE(id)
+#endif
+
+/* ----- Symbols ----- */
+#define VS_FILE_INFO ID(16) /* Version stamp res type */
+#define VS_VERSION_INFO ID(1) /* Version stamp res ID */
+#define VS_USER_DEFINED ID(100) /* User-defined res IDs */
+
+/* ----- VS_VERSION.dwFileFlags ----- */
+#define VS_FFI_SIGNATURE 0xFEEF04BDL
+#define VS_FFI_STRUCVERSION 0x00010000L
+#define VS_FFI_FILEFLAGSMASK 0x0000003FL
+
+/* ----- VS_VERSION.dwFileFlags ----- */
+#define VS_FF_DEBUG 0x00000001L
+#define VS_FF_PRERELEASE 0x00000002L
+#define VS_FF_PATCHED 0x00000004L
+#define VS_FF_PRIVATEBUILD 0x00000008L
+#define VS_FF_INFOINFERRED 0x00000010L
+#define VS_FF_SPECIALBUILD 0x00000020L
+
+/* ----- VS_VERSION.dwFileOS ----- */
+#define VOS_UNKNOWN 0x00000000L
+#define VOS_DOS 0x00010000L
+#define VOS_OS216 0x00020000L
+#define VOS_OS232 0x00030000L
+#define VOS_NT 0x00040000L
+
+#define VOS__BASE 0x00000000L
+#define VOS__WINDOWS16 0x00000001L
+#define VOS__PM16 0x00000002L
+#define VOS__PM32 0x00000003L
+#define VOS__WINDOWS32 0x00000004L
+
+#define VOS_DOS_WINDOWS16 0x00010001L
+#define VOS_DOS_WINDOWS32 0x00010004L
+#define VOS_OS216_PM16 0x00020002L
+#define VOS_OS232_PM32 0x00030003L
+#define VOS_NT_WINDOWS32 0x00040004L
+
+/* ----- VS_VERSION.dwFileType ----- */
+#define VFT_UNKNOWN 0x00000000L
+#define VFT_APP 0x00000001L
+#define VFT_DLL 0x00000002L
+#define VFT_DRV 0x00000003L
+#define VFT_FONT 0x00000004L
+#define VFT_VXD 0x00000005L
+#define VFT_STATIC_LIB 0x00000007L
+
+/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV ----- */
+#define VFT2_UNKNOWN 0x00000000L
+#define VFT2_DRV_PRINTER 0x00000001L
+#define VFT2_DRV_KEYBOARD 0x00000002L
+#define VFT2_DRV_LANGUAGE 0x00000003L
+#define VFT2_DRV_DISPLAY 0x00000004L
+#define VFT2_DRV_MOUSE 0x00000005L
+#define VFT2_DRV_NETWORK 0x00000006L
+#define VFT2_DRV_SYSTEM 0x00000007L
+#define VFT2_DRV_INSTALLABLE 0x00000008L
+#define VFT2_DRV_SOUND 0x00000009L
+#define VFT2_DRV_COMM 0x0000000AL
+
+/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_FONT ----- */
+#define VFT2_FONT_RASTER 0x00000001L
+#define VFT2_FONT_VECTOR 0x00000002L
+#define VFT2_FONT_TRUETYPE 0x00000003L
+
+/* ----- VerFindFile() flags ----- */
+#define VFFF_ISSHAREDFILE 0x0001
+
+#define VFF_CURNEDEST 0x0001
+#define VFF_FILEINUSE 0x0002
+#define VFF_BUFFTOOSMALL 0x0004
+
+/* ----- VerInstallFile() flags ----- */
+#define VIFF_FORCEINSTALL 0x0001
+#define VIFF_DONTDELETEOLD 0x0002
+
+#define VIF_TEMPFILE 0x00000001L
+#define VIF_MISMATCH 0x00000002L
+#define VIF_SRCOLD 0x00000004L
+
+#define VIF_DIFFLANG 0x00000008L
+#define VIF_DIFFCODEPG 0x00000010L
+#define VIF_DIFFTYPE 0x00000020L
+
+#define VIF_WRITEPROT 0x00000040L
+#define VIF_FILEINUSE 0x00000080L
+#define VIF_OUTOFSPACE 0x00000100L
+#define VIF_ACCESSVIOLATION 0x00000200L
+#define VIF_SHARINGVIOLATION 0x00000400L
+#define VIF_CANNOTCREATE 0x00000800L
+#define VIF_CANNOTDELETE 0x00001000L
+#define VIF_CANNOTRENAME 0x00002000L
+#define VIF_CANNOTDELETECUR 0x00004000L
+#define VIF_OUTOFMEMORY 0x00008000L
+
+#define VIF_CANNOTREADSRC 0x00010000L
+#define VIF_CANNOTREADDST 0x00020000L
+
+#define VIF_BUFFTOOSMALL 0x00040000L
+
+#ifndef RC_INVOKED /* RC doesn't need to see the rest of this */
+
+/* ----- Types and structures ----- */
+
+typedef signed short int SHORT;
+
+typedef struct tagVS_FIXEDFILEINFO
+{
+ DWORD dwSignature; /* e.g. 0xfeef04bd */
+ DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */
+ DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */
+ DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */
+ DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */
+ DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */
+ DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */
+ DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */
+ DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */
+ DWORD dwFileType; /* e.g. VFT_DRIVER */
+ DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */
+ DWORD dwFileDateMS; /* e.g. 0 */
+ DWORD dwFileDateLS; /* e.g. 0 */
+} VS_FIXEDFILEINFO;
+
+/* ----- Function prototypes ----- */
+
+UINT WINAPI VerFindFile(UINT uFlags, LPCSTR szFileName,
+ LPCSTR szWinDir, LPCSTR szAppDir,
+ LPSTR szCurDir, UINT FAR* lpuCurDirLen,
+ LPSTR szDestDir, UINT FAR* lpuDestDirLen);
+
+DWORD WINAPI VerInstallFile(UINT uFlags,
+ LPCSTR szSrcFileName, LPCSTR szDestFileName, LPCSTR szSrcDir,
+ LPCSTR szDestDir, LPCSTR szCurDir, LPSTR szTmpFile, UINT FAR* lpuTmpFileLen);
+
+/* Returns size of version info in bytes */
+DWORD WINAPI GetFileVersionInfoSize(
+ LPCSTR lpstrFilename, /* Filename of version stamped file */
+ DWORD FAR *lpdwHandle); /* Information for use by GetFileVersionInfo */
+
+/* Read version info into buffer */
+BOOL WINAPI GetFileVersionInfo(
+ LPCSTR lpstrFilename, /* Filename of version stamped file */
+ DWORD dwHandle, /* Information from GetFileVersionSize */
+ DWORD dwLen, /* Length of buffer for info */
+ void FAR* lpData); /* Buffer to place the data structure */
+
+/* Returns size of resource in bytes */
+DWORD WINAPI GetFileResourceSize(
+ LPCSTR lpstrFilename, /* Filename of version stamped file */
+ LPCSTR lpstrResType, /* Type: normally VS_FILE_INFO */
+ LPCSTR lpstrResID, /* ID: normally VS_VERSION_INFO */
+ DWORD FAR *lpdwFileOffset); /* Returns file offset of resource */
+
+/* Reads file resource into buffer */
+BOOL WINAPI GetFileResource(
+ LPCSTR lpstrFilename, /* Filename of version stamped file */
+ LPCSTR lpstrResType, /* Type: normally VS_FILE_INFO */
+ LPCSTR lpstrResID, /* ID: normally VS_VERSION_INFO */
+ DWORD dwFileOffset, /* File offset or NULL */
+ DWORD dwResLen, /* Length of resource to read or NULL */
+ void FAR* lpData); /* Pointer to data buffer */
+
+UINT WINAPI VerLanguageName(UINT wLang, LPSTR szLang, UINT nSize);
+
+UINT WINAPI GetWindowsDir(LPCSTR szAppDir, LPSTR lpBuffer, int nSize);
+
+UINT WINAPI GetSystemDir(LPCSTR szAppDir, LPSTR lpBuffer, int nSize);
+
+BOOL WINAPI VerQueryValue(const void FAR* pBlock, LPCSTR lpSubBlock,
+ void FAR* FAR* lplpBuffer, UINT FAR* lpuLen);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#pragma pack()
+
+#endif /* !RC_INVOKED */
+#endif /* !_INC_VER */
diff --git a/private/oleauto/tools/win16/os2/inc/vmemory.h b/private/oleauto/tools/win16/os2/inc/vmemory.h
new file mode 100644
index 000000000..4a57e93ec
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/vmemory.h
@@ -0,0 +1,60 @@
+/***
+* vmemory.h - Virtual Memory (VM) Management Routines
+*
+* Copyright (c) 1989-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This include file provides prototypes and definitions for
+* the virtual memory management routines.
+*
+*******************************************************************************/
+
+#ifndef _INC_VMEMORY
+
+#if (_MSC_VER <= 600)
+#define __far _far
+#define __pascal _pascal
+#endif
+
+/* virtual memory handle type */
+typedef unsigned long _vmhnd_t;
+
+/* null handle value */
+#define _VM_NULL ((_vmhnd_t) 0)
+
+/* use all available DOS memory for virtual heap */
+#define _VM_ALLDOS 0
+
+/* swap areas */
+#define _VM_EMS 1
+#define _VM_XMS 2
+#define _VM_DISK 4
+#define _VM_ALLSWAP (_VM_EMS | _VM_XMS | _VM_DISK)
+
+/* clean/dirty flags */
+#define _VM_CLEAN 0
+#define _VM_DIRTY 1
+
+/* function prototypes */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void __far __pascal _vfree(_vmhnd_t);
+int __far __pascal _vheapinit(unsigned int, unsigned int, unsigned int);
+void __far __pascal _vheapterm(void);
+void __far * __far __pascal _vload(_vmhnd_t, int);
+void __far * __far __pascal _vlock(_vmhnd_t);
+unsigned int __far __pascal _vlockcnt(_vmhnd_t);
+_vmhnd_t __far __pascal _vmalloc(unsigned long);
+unsigned long __far __pascal _vmsize(_vmhnd_t);
+_vmhnd_t __far __pascal _vrealloc(_vmhnd_t , unsigned long);
+void __far __pascal _vunlock(_vmhnd_t, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _INC_VMEMORY
+#endif /* _INC_VMEMORY */
diff --git a/private/oleauto/tools/win16/os2/inc/windows.h b/private/oleauto/tools/win16/os2/inc/windows.h
new file mode 100644
index 000000000..ab1c8ba04
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/windows.h
@@ -0,0 +1,5373 @@
+/*****************************************************************************\
+* *
+* windows.h - Windows functions, types, and definitions *
+* *
+* Version 3.10 *
+* *
+* Copyright (c) 1985-1992, Microsoft Corp. All rights reserved. *
+* *
+*******************************************************************************
+*
+* The following symbols control inclusion of various parts of this file:
+*
+* WINVER Windows version number (0x030a). To exclude
+* definitions introduced in version 3.1 (or above)
+* #define WINVER 0x0300 before #including <windows.h>
+*
+* #define: To prevent inclusion of:
+*
+* NOKERNEL KERNEL APIs and definitions
+* NOGDI GDI APIs and definitions
+* NOUSER USER APIs and definitions
+* NOSOUND Sound APIs and definitions
+* NOCOMM Comm driver APIs and definitions
+* NODRIVERS Installable driver APIs and definitions
+*
+* NOMINMAX min() and max() macros
+* NOLOGERROR LogError() and related definitions
+* NOPROFILER Profiler APIs
+* NOMEMMGR Local and global memory management
+* NOLFILEIO _l* file I/O routines
+* NOOPENFILE OpenFile and related definitions
+* NORESOURCE Resource management
+* NOATOM Atom management
+* NOLANGUAGE Character test routines
+* NOLSTRING lstr* string management routines
+* NODBCS Double-byte character set routines
+* NOKEYBOARDINFO Keyboard driver routines
+* NOGDICAPMASKS GDI device capability constants
+* NOCOLOR COLOR_* color values
+* NOGDIOBJ GDI pens, brushes, fonts
+* NODRAWTEXT DrawText() and related definitions
+* NOTEXTMETRIC TEXTMETRIC and related APIs
+* NOSCALABLEFONT Truetype scalable font support
+* NOBITMAP Bitmap support
+* NORASTEROPS GDI Raster operation definitions
+* NOMETAFILE Metafile support
+* NOSYSMETRICS GetSystemMetrics() and related SM_* definitions
+* NOSYSTEMPARAMSINFO SystemParametersInfo() and SPI_* definitions
+* NOMSG APIs and definitions that use MSG structure
+* NOWINSTYLES Window style definitions
+* NOWINOFFSETS Get/SetWindowWord/Long offset definitions
+* NOSHOWWINDOW ShowWindow and related definitions
+* NODEFERWINDOWPOS DeferWindowPos and related definitions
+* NOVIRTUALKEYCODES VK_* virtual key codes
+* NOKEYSTATES MK_* message key state flags
+* NOWH SetWindowsHook and related WH_* definitions
+* NOMENUS Menu APIs
+* NOSCROLL Scrolling APIs and scroll bar control
+* NOCLIPBOARD Clipboard APIs and definitions
+* NOICONS IDI_* icon IDs
+* NOMB MessageBox and related definitions
+* NOSYSCOMMANDS WM_SYSCOMMAND SC_* definitions
+* NOMDI MDI support
+* NOCTLMGR Control management and controls
+* NOWINMESSAGES WM_* window messages
+* NOHELP Help support
+*
+\****************************************************************************/
+
+#ifndef _INC_WINDOWS
+#define _INC_WINDOWS /* #defined if windows.h has been included */
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/* If WINVER is not defined, assume version 3.1 */
+#ifndef WINVER
+#define WINVER 0x030a
+#endif
+
+#ifdef RC_INVOKED
+/* Don't include definitions that RC.EXE can't parse */
+#define NOATOM
+#define NOGDI
+#define NOGDICAPMASKS
+#define NOMETAFILE
+#define NOMINMAX
+#define NOMSG
+#define NOOPENFILE
+#define NORASTEROPS
+#define NOSCROLL
+#define NOSOUND
+#define NOSYSMETRICS
+#define NOTEXTMETRIC
+#define NOWH
+#define NODBCS
+#define NOSYSTEMPARAMSINFO
+#define NOCOMM
+#define NOOEMRESOURCE
+#endif /* RC_INVOKED */
+
+/* Handle OEMRESOURCE for 3.0 compatibility */
+#if (WINVER < 0x030a)
+#define NOOEMRESOURCE
+#ifdef OEMRESOURCE
+#undef NOOEMRESOURCE
+#endif
+#endif
+
+/******* Common definitions and typedefs ***********************************/
+
+#define VOID void
+
+#define FAR _far
+#define NEAR _near
+#define PASCAL _pascal
+#define CDECL _cdecl
+
+#define WINAPI _far _pascal
+#define CALLBACK _far _pascal
+
+/****** Simple types & common helper macros *********************************/
+
+typedef int BOOL;
+#define FALSE 0
+#define TRUE 1
+
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned long DWORD;
+
+typedef unsigned int UINT;
+
+#ifdef STRICT
+typedef signed long LONG;
+#else
+#define LONG long
+#endif
+
+#define LOBYTE(w) ((BYTE)(w))
+#define HIBYTE(w) ((BYTE)(((UINT)(w) >> 8) & 0xFF))
+
+#define LOWORD(l) ((WORD)(DWORD)(l))
+#define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xFFFF))
+
+#define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
+
+#ifndef NOMINMAX
+#ifndef max
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+#endif /* NOMINMAX */
+
+/* Types use for passing & returning polymorphic values */
+typedef UINT WPARAM;
+typedef LONG LPARAM;
+typedef LONG LRESULT;
+
+#define MAKELPARAM(low, high) ((LPARAM)MAKELONG(low, high))
+#define MAKELRESULT(low, high) ((LRESULT)MAKELONG(low, high))
+
+/****** Common pointer types ************************************************/
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+typedef char NEAR* PSTR;
+typedef char NEAR* NPSTR;
+
+
+typedef char FAR* LPSTR;
+typedef const char FAR* LPCSTR;
+
+typedef BYTE NEAR* PBYTE;
+typedef BYTE FAR* LPBYTE;
+
+typedef int NEAR* PINT;
+typedef int FAR* LPINT;
+
+typedef WORD NEAR* PWORD;
+typedef WORD FAR* LPWORD;
+
+typedef long NEAR* PLONG;
+typedef long FAR* LPLONG;
+
+typedef DWORD NEAR* PDWORD;
+typedef DWORD FAR* LPDWORD;
+
+typedef void FAR* LPVOID;
+
+#define MAKELP(sel, off) ((void FAR*)MAKELONG((off), (sel)))
+#define SELECTOROF(lp) HIWORD(lp)
+#define OFFSETOF(lp) LOWORD(lp)
+
+#define FIELDOFFSET(type, field) ((int)(&((type NEAR*)1)->field)-1)
+
+/****** Common handle types *************************************************/
+
+#ifdef STRICT
+typedef const void NEAR* HANDLE;
+#define DECLARE_HANDLE(name) struct name##__ { int unused; }; \
+ typedef const struct name##__ NEAR* name
+#define DECLARE_HANDLE32(name) struct name##__ { int unused; }; \
+ typedef const struct name##__ FAR* name
+#else /* STRICT */
+typedef UINT HANDLE;
+#define DECLARE_HANDLE(name) typedef UINT name
+#define DECLARE_HANDLE32(name) typedef DWORD name
+#endif /* !STRICT */
+
+typedef HANDLE* PHANDLE;
+typedef HANDLE NEAR* SPHANDLE;
+typedef HANDLE FAR* LPHANDLE;
+
+typedef HANDLE HGLOBAL;
+typedef HANDLE HLOCAL;
+
+typedef HANDLE GLOBALHANDLE;
+typedef HANDLE LOCALHANDLE;
+
+typedef UINT ATOM;
+
+#ifdef STRICT
+typedef void (CALLBACK* FARPROC)(void);
+typedef void (NEAR PASCAL* NEARPROC)(void);
+#else
+typedef int (CALLBACK* FARPROC)();
+typedef int (NEAR PASCAL* NEARPROC)();
+#endif
+
+DECLARE_HANDLE(HSTR);
+
+/****** KERNEL typedefs, structures, and functions **************************/
+
+DECLARE_HANDLE(HINSTANCE);
+typedef HINSTANCE HMODULE; /* HMODULEs can be used in place of HINSTANCEs */
+
+#ifndef NOKERNEL
+
+/****** Application entry point function ************************************/
+
+#ifdef STRICT
+int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+#endif
+
+/****** System Information **************************************************/
+
+DWORD WINAPI GetVersion(void);
+
+DWORD WINAPI GetFreeSpace(UINT);
+UINT WINAPI GetCurrentPDB(void);
+
+UINT WINAPI GetWindowsDirectory(LPSTR, UINT);
+UINT WINAPI GetSystemDirectory(LPSTR, UINT);
+
+#if (WINVER >= 0x030a)
+UINT WINAPI GetFreeSystemResources(UINT);
+#define GFSR_SYSTEMRESOURCES 0x0000
+#define GFSR_GDIRESOURCES 0x0001
+#define GFSR_USERRESOURCES 0x0002
+#endif /* WINVER >= 0x030a */
+
+DWORD WINAPI GetWinFlags(void);
+
+#define WF_PMODE 0x0001
+#define WF_CPU286 0x0002
+#define WF_CPU386 0x0004
+#define WF_CPU486 0x0008
+#define WF_STANDARD 0x0010
+#define WF_WIN286 0x0010
+#define WF_ENHANCED 0x0020
+#define WF_WIN386 0x0020
+#define WF_CPU086 0x0040
+#define WF_CPU186 0x0080
+#define WF_LARGEFRAME 0x0100
+#define WF_SMALLFRAME 0x0200
+#define WF_80x87 0x0400
+#define WF_PAGING 0x0800
+#define WF_WLO 0x8000
+
+LPSTR WINAPI GetDOSEnvironment(void);
+
+DWORD WINAPI GetCurrentTime(void);
+DWORD WINAPI GetTickCount(void);
+DWORD WINAPI GetTimerResolution(void);
+
+/****** Error handling ******************************************************/
+
+#if (WINVER >= 0x030a)
+#ifndef NOLOGERROR
+
+void WINAPI LogError(UINT err, void FAR* lpInfo);
+void WINAPI LogParamError(UINT err, FARPROC lpfn, void FAR* param);
+
+/****** LogParamError/LogError values */
+
+/* Error modifier bits */
+
+#define ERR_WARNING 0x8000
+#define ERR_PARAM 0x4000
+
+#define ERR_SIZE_MASK 0x3000
+#define ERR_BYTE 0x1000
+#define ERR_WORD 0x2000
+#define ERR_DWORD 0x3000
+
+/****** LogParamError() values */
+
+/* Generic parameter values */
+#define ERR_BAD_VALUE 0x6001
+#define ERR_BAD_FLAGS 0x6002
+#define ERR_BAD_INDEX 0x6003
+#define ERR_BAD_DVALUE 0x7004
+#define ERR_BAD_DFLAGS 0x7005
+#define ERR_BAD_DINDEX 0x7006
+#define ERR_BAD_PTR 0x7007
+#define ERR_BAD_FUNC_PTR 0x7008
+#define ERR_BAD_SELECTOR 0x6009
+#define ERR_BAD_STRING_PTR 0x700a
+#define ERR_BAD_HANDLE 0x600b
+
+/* KERNEL parameter errors */
+#define ERR_BAD_HINSTANCE 0x6020
+#define ERR_BAD_HMODULE 0x6021
+#define ERR_BAD_GLOBAL_HANDLE 0x6022
+#define ERR_BAD_LOCAL_HANDLE 0x6023
+#define ERR_BAD_ATOM 0x6024
+#define ERR_BAD_HFILE 0x6025
+
+/* USER parameter errors */
+#define ERR_BAD_HWND 0x6040
+#define ERR_BAD_HMENU 0x6041
+#define ERR_BAD_HCURSOR 0x6042
+#define ERR_BAD_HICON 0x6043
+#define ERR_BAD_HDWP 0x6044
+#define ERR_BAD_CID 0x6045
+#define ERR_BAD_HDRVR 0x6046
+
+/* GDI parameter errors */
+#define ERR_BAD_COORDS 0x7060
+#define ERR_BAD_GDI_OBJECT 0x6061
+#define ERR_BAD_HDC 0x6062
+#define ERR_BAD_HPEN 0x6063
+#define ERR_BAD_HFONT 0x6064
+#define ERR_BAD_HBRUSH 0x6065
+#define ERR_BAD_HBITMAP 0x6066
+#define ERR_BAD_HRGN 0x6067
+#define ERR_BAD_HPALETTE 0x6068
+#define ERR_BAD_HMETAFILE 0x6069
+
+
+/**** LogError() values */
+
+/* KERNEL errors */
+#define ERR_GALLOC 0x0001
+#define ERR_GREALLOC 0x0002
+#define ERR_GLOCK 0x0003
+#define ERR_LALLOC 0x0004
+#define ERR_LREALLOC 0x0005
+#define ERR_LLOCK 0x0006
+#define ERR_ALLOCRES 0x0007
+#define ERR_LOCKRES 0x0008
+#define ERR_LOADMODULE 0x0009
+
+/* USER errors */
+#define ERR_CREATEDLG 0x0040
+#define ERR_CREATEDLG2 0x0041
+#define ERR_REGISTERCLASS 0x0042
+#define ERR_DCBUSY 0x0043
+#define ERR_CREATEWND 0x0044
+#define ERR_STRUCEXTRA 0x0045
+#define ERR_LOADSTR 0x0046
+#define ERR_LOADMENU 0x0047
+#define ERR_NESTEDBEGINPAINT 0x0048
+#define ERR_BADINDEX 0x0049
+#define ERR_CREATEMENU 0x004a
+
+/* GDI errors */
+#define ERR_CREATEDC 0x0080
+#define ERR_CREATEMETA 0x0081
+#define ERR_DELOBJSELECTED 0x0082
+#define ERR_SELBITMAP 0x0083
+
+/* Debugging support (DEBUG SYSTEM ONLY) */
+typedef struct tagWINDEBUGINFO
+{
+ UINT flags;
+ DWORD dwOptions;
+ DWORD dwFilter;
+ char achAllocModule[8];
+ DWORD dwAllocBreak;
+ DWORD dwAllocCount;
+} WINDEBUGINFO;
+
+BOOL WINAPI GetWinDebugInfo(WINDEBUGINFO FAR* lpwdi, UINT flags);
+BOOL WINAPI SetWinDebugInfo(const WINDEBUGINFO FAR* lpwdi);
+
+void FAR _cdecl DebugOutput(UINT flags, LPCSTR lpsz, ...);
+
+/* WINDEBUGINFO flags values */
+#define WDI_OPTIONS 0x0001
+#define WDI_FILTER 0x0002
+#define WDI_ALLOCBREAK 0x0004
+
+/* dwOptions values */
+#define DBO_CHECKHEAP 0x0001
+#define DBO_BUFFERFILL 0x0004
+#define DBO_DISABLEGPTRAPPING 0x0010
+#define DBO_CHECKFREE 0x0020
+
+#define DBO_SILENT 0x8000
+
+#define DBO_TRACEBREAK 0x2000
+#define DBO_WARNINGBREAK 0x1000
+#define DBO_NOERRORBREAK 0x0800
+#define DBO_NOFATALBREAK 0x0400
+#define DBO_INT3BREAK 0x0100
+
+/* DebugOutput flags values */
+#define DBF_TRACE 0x0000
+#define DBF_WARNING 0x4000
+#define DBF_ERROR 0x8000
+#define DBF_FATAL 0xc000
+
+/* dwFilter values */
+#define DBF_KERNEL 0x1000
+#define DBF_KRN_MEMMAN 0x0001
+#define DBF_KRN_LOADMODULE 0x0002
+#define DBF_KRN_SEGMENTLOAD 0x0004
+#define DBF_USER 0x0800
+#define DBF_GDI 0x0400
+#define DBF_MMSYSTEM 0x0040
+#define DBF_PENWIN 0x0020
+#define DBF_APPLICATION 0x0008
+#define DBF_DRIVER 0x0010
+
+#endif /* NOLOGERROR */
+#endif /* WINVER >= 0x030a */
+
+void WINAPI FatalExit(int);
+void WINAPI FatalAppExit(UINT, LPCSTR);
+
+BOOL WINAPI ExitWindows(DWORD dwReturnCode, UINT wReserved);
+
+#define EW_RESTARTWINDOWS 0x42
+#if (WINVER >= 0x030a)
+#define EW_REBOOTSYSTEM 0x43
+
+BOOL WINAPI ExitWindowsExec(LPCSTR, LPCSTR);
+#endif /* WINVER >= 0x030a */
+
+void WINAPI DebugBreak(void);
+void WINAPI OutputDebugString(LPCSTR);
+
+/* SetErrorMode() constants */
+#define SEM_FAILCRITICALERRORS 0x0001
+#define SEM_NOGPFAULTERRORBOX 0x0002
+#define SEM_NOOPENFILEERRORBOX 0x8000
+
+UINT WINAPI SetErrorMode(UINT);
+
+/****** Pointer validation **************************************************/
+
+#if (WINVER >= 0x030a)
+
+BOOL WINAPI IsBadReadPtr(const void FAR* lp, UINT cb);
+BOOL WINAPI IsBadWritePtr(void FAR* lp, UINT cb);
+BOOL WINAPI IsBadHugeReadPtr(const void _huge* lp, DWORD cb);
+BOOL WINAPI IsBadHugeWritePtr(void _huge* lp, DWORD cb);
+BOOL WINAPI IsBadCodePtr(FARPROC lpfn);
+BOOL WINAPI IsBadStringPtr(const void FAR* lpsz, UINT cchMax);
+#endif /* WINVER >= 0x030a */
+
+/****** Profiling support ***************************************************/
+
+#ifndef NOPROFILER
+
+int WINAPI ProfInsChk(void);
+void WINAPI ProfSetup(int,int);
+void WINAPI ProfSampRate(int,int);
+void WINAPI ProfStart(void);
+void WINAPI ProfStop(void);
+void WINAPI ProfClear(void);
+void WINAPI ProfFlush(void);
+void WINAPI ProfFinish(void);
+#endif /* NOPROFILER */
+
+/****** Catch/Throw and stack management ************************************/
+
+typedef int CATCHBUF[9];
+typedef int FAR* LPCATCHBUF;
+
+int WINAPI Catch(int FAR*);
+void WINAPI Throw(const int FAR*, int);
+
+void WINAPI SwitchStackBack(void);
+void WINAPI SwitchStackTo(UINT, UINT, UINT);
+
+/****** Module Management ***************************************************/
+
+#define HINSTANCE_ERROR ((HINSTANCE)32)
+
+
+HINSTANCE WINAPI LoadModule(LPCSTR, LPVOID);
+BOOL WINAPI FreeModule(HINSTANCE);
+
+HINSTANCE WINAPI LoadLibrary(LPCSTR);
+void WINAPI FreeLibrary(HINSTANCE);
+
+UINT WINAPI WinExec(LPCSTR, UINT);
+
+HMODULE WINAPI GetModuleHandle(LPCSTR);
+
+int WINAPI GetModuleUsage(HINSTANCE);
+int WINAPI GetModuleFileName(HINSTANCE, LPSTR, int);
+
+FARPROC WINAPI GetProcAddress(HINSTANCE, LPCSTR);
+
+int WINAPI GetInstanceData(HINSTANCE, BYTE*, int);
+
+HGLOBAL WINAPI GetCodeHandle(FARPROC);
+
+typedef struct tagSEGINFO
+{
+ UINT offSegment;
+ UINT cbSegment;
+ UINT flags;
+ UINT cbAlloc;
+ HGLOBAL h;
+ UINT alignShift;
+ UINT reserved[2];
+} SEGINFO;
+typedef SEGINFO FAR* LPSEGINFO;
+
+void WINAPI GetCodeInfo(FARPROC lpProc, SEGINFO FAR* lpSegInfo);
+
+FARPROC WINAPI MakeProcInstance(FARPROC, HINSTANCE);
+void WINAPI FreeProcInstance(FARPROC);
+
+LONG WINAPI SetSwapAreaSize(UINT);
+void WINAPI SwapRecording(UINT);
+void WINAPI ValidateCodeSegments(void);
+
+/* Windows Exit Procedure flag values */
+#define WEP_SYSTEM_EXIT 1
+#define WEP_FREE_DLL 0
+
+/****** Task Management *****************************************************/
+
+#endif /* NOKERNEL */
+
+DECLARE_HANDLE(HTASK);
+
+#ifndef NOKERNEL
+
+UINT WINAPI GetNumTasks(void);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI IsTask(HTASK);
+#endif /* WINVER >= 0x030a */
+
+HTASK WINAPI GetCurrentTask(void);
+
+void WINAPI Yield(void);
+void WINAPI DirectedYield(HTASK);
+
+
+/****** Global memory management ********************************************/
+
+#ifndef NOMEMMGR
+
+/* Global Memory Flags */
+
+#define GMEM_FIXED 0x0000
+#define GMEM_MOVEABLE 0x0002
+#define GMEM_NOCOMPACT 0x0010
+#define GMEM_NODISCARD 0x0020
+#define GMEM_ZEROINIT 0x0040
+#define GMEM_MODIFY 0x0080
+#define GMEM_DISCARDABLE 0x0100
+#define GMEM_NOT_BANKED 0x1000
+#define GMEM_SHARE 0x2000
+#define GMEM_DDESHARE 0x2000
+#define GMEM_NOTIFY 0x4000
+#define GMEM_LOWER GMEM_NOT_BANKED
+
+#define GHND (GMEM_MOVEABLE | GMEM_ZEROINIT)
+#define GPTR (GMEM_FIXED | GMEM_ZEROINIT)
+
+#define GlobalDiscard(h) GlobalReAlloc(h, 0L, GMEM_MOVEABLE)
+
+HGLOBAL WINAPI GlobalAlloc(UINT, DWORD);
+HGLOBAL WINAPI GlobalReAlloc(HGLOBAL, DWORD, UINT);
+HGLOBAL WINAPI GlobalFree(HGLOBAL);
+
+DWORD WINAPI GlobalDosAlloc(DWORD);
+UINT WINAPI GlobalDosFree(UINT);
+
+#ifdef STRICT
+void FAR* WINAPI GlobalLock(HGLOBAL);
+#else
+char FAR* WINAPI GlobalLock(HGLOBAL);
+#endif
+
+BOOL WINAPI GlobalUnlock(HGLOBAL);
+
+DWORD WINAPI GlobalSize(HGLOBAL);
+DWORD WINAPI GlobalHandle(UINT);
+
+/* GlobalFlags return flags (in addition to GMEM_DISCARDABLE) */
+#define GMEM_DISCARDED 0x4000
+#define GMEM_LOCKCOUNT 0x00FF
+UINT WINAPI GlobalFlags(HGLOBAL);
+
+#ifdef STRICT
+void FAR* WINAPI GlobalWire(HGLOBAL);
+#else
+char FAR* WINAPI GlobalWire(HGLOBAL);
+#endif
+
+BOOL WINAPI GlobalUnWire(HGLOBAL);
+
+UINT WINAPI GlobalPageLock(HGLOBAL);
+UINT WINAPI GlobalPageUnlock(HGLOBAL);
+
+void WINAPI GlobalFix(HGLOBAL);
+void WINAPI GlobalUnfix(HGLOBAL);
+
+HGLOBAL WINAPI GlobalLRUNewest(HGLOBAL);
+HGLOBAL WINAPI GlobalLRUOldest(HGLOBAL);
+
+DWORD WINAPI GlobalCompact(DWORD);
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* GNOTIFYPROC)(HGLOBAL);
+#else
+typedef FARPROC GNOTIFYPROC;
+#endif
+
+void WINAPI GlobalNotify(GNOTIFYPROC);
+
+HGLOBAL WINAPI LockSegment(UINT);
+void WINAPI UnlockSegment(UINT);
+
+#define LockData(dummy) LockSegment((UINT)-1)
+#define UnlockData(dummy) UnlockSegment((UINT)-1)
+
+UINT WINAPI AllocSelector(UINT);
+UINT WINAPI FreeSelector(UINT);
+UINT WINAPI AllocDStoCSAlias(UINT);
+UINT WINAPI PrestoChangoSelector(UINT sourceSel, UINT destSel);
+DWORD WINAPI GetSelectorBase(UINT);
+UINT WINAPI SetSelectorBase(UINT, DWORD);
+DWORD WINAPI GetSelectorLimit(UINT);
+UINT WINAPI SetSelectorLimit(UINT, DWORD);
+
+void WINAPI LimitEmsPages(DWORD);
+
+void WINAPI ValidateFreeSpaces(void);
+
+/* Low system memory notification message */
+#define WM_COMPACTING 0x0041
+
+/***** Local Memory Management */
+
+/* Local Memory Flags */
+#define LMEM_FIXED 0x0000
+#define LMEM_MOVEABLE 0x0002
+#define LMEM_NOCOMPACT 0x0010
+#define LMEM_NODISCARD 0x0020
+#define LMEM_ZEROINIT 0x0040
+#define LMEM_MODIFY 0x0080
+#define LMEM_DISCARDABLE 0x0F00
+
+#define LHND (LMEM_MOVEABLE | LMEM_ZEROINIT)
+#define LPTR (LMEM_FIXED | LMEM_ZEROINIT)
+
+#define NONZEROLHND (LMEM_MOVEABLE)
+#define NONZEROLPTR (LMEM_FIXED)
+
+
+#define LocalDiscard(h) LocalReAlloc(h, 0, LMEM_MOVEABLE)
+
+
+HLOCAL WINAPI LocalAlloc(UINT, UINT);
+HLOCAL WINAPI LocalReAlloc(HLOCAL, UINT, UINT);
+HLOCAL WINAPI LocalFree(HLOCAL);
+
+#ifdef STRICT
+void NEAR* WINAPI LocalLock(HLOCAL);
+#else
+char NEAR* WINAPI LocalLock(HLOCAL);
+#endif
+
+BOOL WINAPI LocalUnlock(HLOCAL);
+
+UINT WINAPI LocalSize(HLOCAL);
+#ifdef STRICT
+HLOCAL WINAPI LocalHandle(void NEAR*);
+#else
+HLOCAL WINAPI LocalHandle(UINT);
+#endif
+
+/* LocalFlags return flags (in addition to LMEM_DISCARDABLE) */
+#define LMEM_DISCARDED 0x4000
+#define LMEM_LOCKCOUNT 0x00FF
+
+UINT WINAPI LocalFlags(HLOCAL);
+
+BOOL WINAPI LocalInit(UINT, UINT, UINT);
+UINT WINAPI LocalCompact(UINT);
+UINT WINAPI LocalShrink(HLOCAL, UINT);
+
+#endif /* NOMEMMGR */
+
+/****** File I/O ************************************************************/
+
+#ifndef NOLFILEIO
+
+typedef int HFILE; /* Polymorphic with C runtime file handle type */
+
+#define HFILE_ERROR ((HFILE)-1)
+
+#ifndef NOOPENFILE
+
+/* OpenFile() Structure */
+typedef struct tagOFSTRUCT
+{
+ BYTE cBytes;
+ BYTE fFixedDisk;
+ UINT nErrCode;
+ BYTE reserved[4];
+ char szPathName[128];
+} OFSTRUCT;
+typedef OFSTRUCT* POFSTRUCT;
+typedef OFSTRUCT NEAR* NPOFSTRUCT;
+typedef OFSTRUCT FAR* LPOFSTRUCT;
+
+/* OpenFile() Flags */
+#define OF_READ 0x0000
+#define OF_WRITE 0x0001
+#define OF_READWRITE 0x0002
+#define OF_SHARE_COMPAT 0x0000
+#define OF_SHARE_EXCLUSIVE 0x0010
+#define OF_SHARE_DENY_WRITE 0x0020
+#define OF_SHARE_DENY_READ 0x0030
+#define OF_SHARE_DENY_NONE 0x0040
+#define OF_PARSE 0x0100
+#define OF_DELETE 0x0200
+#define OF_VERIFY 0x0400 /* Used with OF_REOPEN */
+#define OF_SEARCH 0x0400 /* Used without OF_REOPEN */
+#define OF_CANCEL 0x0800
+#define OF_CREATE 0x1000
+#define OF_PROMPT 0x2000
+#define OF_EXIST 0x4000
+#define OF_REOPEN 0x8000
+
+HFILE WINAPI OpenFile(LPCSTR, OFSTRUCT FAR*, UINT);
+
+#endif /* NOOPENFILE */
+
+/* _lopen() flags */
+#define READ 0
+#define WRITE 1
+#define READ_WRITE 2
+
+HFILE WINAPI _lopen(LPCSTR, int);
+HFILE WINAPI _lcreat(LPCSTR, int);
+
+HFILE WINAPI _lclose(HFILE);
+
+LONG WINAPI _llseek(HFILE, LONG, int);
+
+/* _llseek origin values */
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+
+UINT WINAPI _lread(HFILE, void _huge*, UINT);
+UINT WINAPI _lwrite(HFILE, const void _huge*, UINT);
+
+#if (WINVER >= 0x030a)
+long WINAPI _hread(HFILE, void _huge*, long);
+long WINAPI _hwrite(HFILE, const void _huge*, long);
+#endif /* WINVER >= 0x030a */
+
+
+#endif /* NOLFILEIO */
+
+/* GetTempFileName() Flags */
+#define TF_FORCEDRIVE (BYTE)0x80
+
+int WINAPI GetTempFileName(BYTE, LPCSTR, UINT, LPSTR);
+BYTE WINAPI GetTempDrive(char);
+
+/* GetDriveType return values */
+#define DRIVE_REMOVABLE 2
+#define DRIVE_FIXED 3
+#define DRIVE_REMOTE 4
+UINT WINAPI GetDriveType(int);
+
+UINT WINAPI SetHandleCount(UINT);
+
+/****** Network support *****************************************************/
+UINT WINAPI WNetAddConnection(LPSTR, LPSTR, LPSTR);
+UINT WINAPI WNetGetConnection(LPSTR, LPSTR, UINT FAR*);
+UINT WINAPI WNetCancelConnection(LPSTR, BOOL);
+/* Errors */
+#define WN_SUCCESS 0x0000
+#define WN_NOT_SUPPORTED 0x0001
+#define WN_NET_ERROR 0x0002
+#define WN_MORE_DATA 0x0003
+#define WN_BAD_POINTER 0x0004
+#define WN_BAD_VALUE 0x0005
+#define WN_BAD_PASSWORD 0x0006
+#define WN_ACCESS_DENIED 0x0007
+#define WN_FUNCTION_BUSY 0x0008
+#define WN_WINDOWS_ERROR 0x0009
+#define WN_BAD_USER 0x000A
+#define WN_OUT_OF_MEMORY 0x000B
+#define WN_CANCEL 0x000C
+#define WN_CONTINUE 0x000D
+
+/* Connection errors */
+#define WN_NOT_CONNECTED 0x0030
+#define WN_OPEN_FILES 0x0031
+#define WN_BAD_NETNAME 0x0032
+#define WN_BAD_LOCALNAME 0x0033
+#define WN_ALREADY_CONNECTED 0x0034
+#define WN_DEVICE_ERROR 0x0035
+#define WN_CONNECTION_CLOSED 0x0036
+
+/****** Resource Management *************************************************/
+
+DECLARE_HANDLE(HRSRC);
+
+HRSRC WINAPI FindResource(HINSTANCE, LPCSTR, LPCSTR);
+HGLOBAL WINAPI LoadResource(HINSTANCE, HRSRC);
+BOOL WINAPI FreeResource(HGLOBAL);
+
+#ifdef STRICT
+void FAR* WINAPI LockResource(HGLOBAL);
+#else
+char FAR* WINAPI LockResource(HGLOBAL);
+#endif
+
+#define UnlockResource(h) GlobalUnlock(h)
+
+DWORD WINAPI SizeofResource(HINSTANCE, HRSRC);
+
+int WINAPI AccessResource(HINSTANCE, HRSRC);
+
+HGLOBAL WINAPI AllocResource(HINSTANCE, HRSRC, DWORD);
+
+#ifdef STRICT
+typedef HGLOBAL (CALLBACK* RSRCHDLRPROC)(HGLOBAL, HINSTANCE, HRSRC);
+#else
+typedef FARPROC RSRCHDLRPROC;
+#endif
+
+RSRCHDLRPROC WINAPI SetResourceHandler(HINSTANCE, LPCSTR, RSRCHDLRPROC);
+
+#define MAKEINTRESOURCE(i) ((LPCSTR)MAKELP(0, (i)))
+
+#ifndef NORESOURCE
+
+/* Predefined Resource Types */
+#define RT_CURSOR MAKEINTRESOURCE(1)
+#define RT_BITMAP MAKEINTRESOURCE(2)
+#define RT_ICON MAKEINTRESOURCE(3)
+#define RT_MENU MAKEINTRESOURCE(4)
+#define RT_DIALOG MAKEINTRESOURCE(5)
+#define RT_STRING MAKEINTRESOURCE(6)
+#define RT_FONTDIR MAKEINTRESOURCE(7)
+#define RT_FONT MAKEINTRESOURCE(8)
+#define RT_ACCELERATOR MAKEINTRESOURCE(9)
+#define RT_RCDATA MAKEINTRESOURCE(10)
+
+#define RT_GROUP_CURSOR MAKEINTRESOURCE(12)
+#define RT_GROUP_ICON MAKEINTRESOURCE(14)
+
+#endif /* NORESOURCE */
+
+#ifdef OEMRESOURCE
+
+/* OEM Resource Ordinal Numbers */
+#define OBM_CLOSE 32754
+#define OBM_UPARROW 32753
+#define OBM_DNARROW 32752
+#define OBM_RGARROW 32751
+#define OBM_LFARROW 32750
+#define OBM_REDUCE 32749
+#define OBM_ZOOM 32748
+#define OBM_RESTORE 32747
+#define OBM_REDUCED 32746
+#define OBM_ZOOMD 32745
+#define OBM_RESTORED 32744
+#define OBM_UPARROWD 32743
+#define OBM_DNARROWD 32742
+#define OBM_RGARROWD 32741
+#define OBM_LFARROWD 32740
+#define OBM_MNARROW 32739
+#define OBM_COMBO 32738
+#if (WINVER >= 0x030a)
+#define OBM_UPARROWI 32737
+#define OBM_DNARROWI 32736
+#define OBM_RGARROWI 32735
+#define OBM_LFARROWI 32734
+#endif /* WINVER >= 0x030a */
+
+#define OBM_OLD_CLOSE 32767
+#define OBM_SIZE 32766
+#define OBM_OLD_UPARROW 32765
+#define OBM_OLD_DNARROW 32764
+#define OBM_OLD_RGARROW 32763
+#define OBM_OLD_LFARROW 32762
+#define OBM_BTSIZE 32761
+#define OBM_CHECK 32760
+#define OBM_CHECKBOXES 32759
+#define OBM_BTNCORNERS 32758
+#define OBM_OLD_REDUCE 32757
+#define OBM_OLD_ZOOM 32756
+#define OBM_OLD_RESTORE 32755
+
+#define OCR_NORMAL 32512
+#define OCR_IBEAM 32513
+#define OCR_WAIT 32514
+#define OCR_CROSS 32515
+#define OCR_UP 32516
+#define OCR_SIZE 32640
+#define OCR_ICON 32641
+#define OCR_SIZENWSE 32642
+#define OCR_SIZENESW 32643
+#define OCR_SIZEWE 32644
+#define OCR_SIZENS 32645
+#define OCR_SIZEALL 32646
+#define OCR_ICOCUR 32647
+
+#define OIC_SAMPLE 32512
+#define OIC_HAND 32513
+#define OIC_QUES 32514
+#define OIC_BANG 32515
+#define OIC_NOTE 32516
+
+#endif /* OEMRESOURCE */
+
+/****** Atom Management *****************************************************/
+
+#define MAKEINTATOM(i) ((LPCSTR)MAKELP(0, (i)))
+
+#ifndef NOATOM
+
+BOOL WINAPI InitAtomTable(int);
+ATOM WINAPI AddAtom(LPCSTR);
+ATOM WINAPI DeleteAtom(ATOM);
+ATOM WINAPI FindAtom(LPCSTR);
+UINT WINAPI GetAtomName(ATOM, LPSTR, int);
+ATOM WINAPI GlobalAddAtom(LPCSTR);
+ATOM WINAPI GlobalDeleteAtom(ATOM);
+ATOM WINAPI GlobalFindAtom(LPCSTR);
+UINT WINAPI GlobalGetAtomName(ATOM, LPSTR, int);
+HLOCAL WINAPI GetAtomHandle(ATOM);
+
+#endif /* NOATOM */
+
+/****** WIN.INI Support *****************************************************/
+
+/* User Profile Routines */
+UINT WINAPI GetProfileInt(LPCSTR, LPCSTR, int);
+int WINAPI GetProfileString(LPCSTR, LPCSTR, LPCSTR, LPSTR, int);
+BOOL WINAPI WriteProfileString(LPCSTR, LPCSTR, LPCSTR);
+
+UINT WINAPI GetPrivateProfileInt(LPCSTR, LPCSTR, int, LPCSTR);
+int WINAPI GetPrivateProfileString(LPCSTR, LPCSTR, LPCSTR, LPSTR, int, LPCSTR);
+BOOL WINAPI WritePrivateProfileString(LPCSTR, LPCSTR, LPCSTR, LPCSTR);
+
+#define WM_WININICHANGE 0x001A
+
+/****** International & Char Translation Support ****************************/
+
+void WINAPI AnsiToOem(const char _huge*, char _huge*);
+void WINAPI OemToAnsi(const char _huge*, char _huge*);
+
+void WINAPI AnsiToOemBuff(LPCSTR, LPSTR, UINT);
+void WINAPI OemToAnsiBuff(LPCSTR, LPSTR, UINT);
+
+LPSTR WINAPI AnsiNext(LPCSTR);
+LPSTR WINAPI AnsiPrev(LPCSTR, LPCSTR);
+
+LPSTR WINAPI AnsiUpper(LPSTR);
+LPSTR WINAPI AnsiLower(LPSTR);
+
+UINT WINAPI AnsiUpperBuff(LPSTR, UINT);
+UINT WINAPI AnsiLowerBuff(LPSTR, UINT);
+
+
+#ifndef NOLANGUAGE
+BOOL WINAPI IsCharAlpha(char);
+BOOL WINAPI IsCharAlphaNumeric(char);
+BOOL WINAPI IsCharUpper(char);
+BOOL WINAPI IsCharLower(char);
+#endif
+
+#ifndef NOLSTRING
+int WINAPI lstrcmp(LPCSTR, LPCSTR);
+int WINAPI lstrcmpi(LPCSTR, LPCSTR);
+LPSTR WINAPI lstrcpy(LPSTR, LPCSTR);
+LPSTR WINAPI lstrcat(LPSTR, LPCSTR);
+int WINAPI lstrlen(LPCSTR);
+#if (WINVER >= 0x030a)
+LPSTR WINAPI lstrcpyn(LPSTR, LPCSTR, int);
+void WINAPI hmemcpy(void _huge*, const void _huge*, long);
+#endif /* WINVER >= 0x030a */
+#endif /* NOLSTRING */
+
+#if (WINVER >= 0x030a)
+#ifndef NODBCS
+BOOL WINAPI IsDBCSLeadByte(BYTE);
+#endif /* NODBCS */
+#endif /* WINVER >= 0x030a */
+
+int WINAPI LoadString(HINSTANCE, UINT, LPSTR, int);
+
+/****** Keyboard Driver Functions *******************************************/
+
+#ifndef NOKEYBOARDINFO
+
+DWORD WINAPI OemKeyScan(UINT);
+UINT WINAPI VkKeyScan(UINT);
+int WINAPI GetKeyboardType(int);
+UINT WINAPI MapVirtualKey(UINT, UINT);
+int WINAPI GetKBCodePage(void);
+int WINAPI GetKeyNameText(LONG, LPSTR, int);
+int WINAPI ToAscii(UINT wVirtKey, UINT wScanCode, BYTE FAR* lpKeyState, DWORD FAR* lpChar, UINT wFlags);
+
+#endif
+
+#endif /* NOKERNEL */
+
+/****** GDI typedefs, structures, and functions *****************************/
+
+DECLARE_HANDLE(HDC);
+
+#ifndef NOGDI
+
+#ifdef STRICT
+typedef const void NEAR* HGDIOBJ;
+#else
+DECLARE_HANDLE(HGDIOBJ);
+#endif
+
+#endif /* NOGDI */
+
+DECLARE_HANDLE(HBITMAP);
+DECLARE_HANDLE(HPEN);
+DECLARE_HANDLE(HBRUSH);
+DECLARE_HANDLE(HRGN);
+DECLARE_HANDLE(HPALETTE);
+DECLARE_HANDLE(HFONT);
+
+typedef struct tagRECT
+{
+ int left;
+ int top;
+ int right;
+ int bottom;
+} RECT;
+typedef RECT* PRECT;
+typedef RECT NEAR* NPRECT;
+typedef RECT FAR* LPRECT;
+
+typedef struct tagPOINT
+{
+ int x;
+ int y;
+} POINT;
+typedef POINT* PPOINT;
+typedef POINT NEAR* NPPOINT;
+typedef POINT FAR* LPPOINT;
+
+#if (WINVER >= 0x030a)
+typedef struct tagSIZE
+{
+ int cx;
+ int cy;
+} SIZE;
+typedef SIZE* PSIZE;
+typedef SIZE NEAR* NPSIZE;
+typedef SIZE FAR* LPSIZE;
+#endif /* WINVER >= 0x030a */
+
+#define MAKEPOINT(l) (*((POINT FAR*)&(l)))
+
+#ifndef NOGDI
+
+/****** DC Management *******************************************************/
+
+HDC WINAPI CreateDC(LPCSTR, LPCSTR, LPCSTR, const void FAR*);
+HDC WINAPI CreateIC(LPCSTR, LPCSTR, LPCSTR, const void FAR*);
+HDC WINAPI CreateCompatibleDC(HDC);
+
+BOOL WINAPI DeleteDC(HDC);
+
+DWORD WINAPI GetDCOrg(HDC);
+
+int WINAPI SaveDC(HDC);
+BOOL WINAPI RestoreDC(HDC, int);
+
+int WINAPI SetEnvironment(LPCSTR, const void FAR*, UINT);
+int WINAPI GetEnvironment(LPCSTR, void FAR*, UINT);
+
+int WINAPI MulDiv(int, int, int);
+
+#if (WINVER >= 0x030a)
+/* Drawing bounds accumulation APIs */
+UINT WINAPI SetBoundsRect(HDC hDC, const RECT FAR* lprcBounds, UINT flags);
+UINT WINAPI GetBoundsRect(HDC hDC, RECT FAR* lprcBounds, UINT flags);
+
+#define DCB_RESET 0x0001
+#define DCB_ACCUMULATE 0x0002
+#define DCB_DIRTY DCB_ACCUMULATE
+#define DCB_SET (DCB_RESET | DCB_ACCUMULATE)
+#define DCB_ENABLE 0x0004
+#define DCB_DISABLE 0x0008
+#endif /* WINVER >= 0x030a */
+
+/****** Device Capabilities *************************************************/
+
+int WINAPI GetDeviceCaps(HDC, int);
+
+/* Device Parameters for GetDeviceCaps() */
+#define DRIVERVERSION 0
+#define TECHNOLOGY 2
+#define HORZSIZE 4
+#define VERTSIZE 6
+#define HORZRES 8
+#define VERTRES 10
+#define BITSPIXEL 12
+#define PLANES 14
+#define NUMBRUSHES 16
+#define NUMPENS 18
+#define NUMMARKERS 20
+#define NUMFONTS 22
+#define NUMCOLORS 24
+#define PDEVICESIZE 26
+#define CURVECAPS 28
+#define LINECAPS 30
+#define POLYGONALCAPS 32
+#define TEXTCAPS 34
+#define CLIPCAPS 36
+#define RASTERCAPS 38
+#define ASPECTX 40
+#define ASPECTY 42
+#define ASPECTXY 44
+
+#define LOGPIXELSX 88
+#define LOGPIXELSY 90
+
+#define SIZEPALETTE 104
+#define NUMRESERVED 106
+#define COLORRES 108
+
+#ifndef NOGDICAPMASKS
+
+/* GetDeviceCaps() return value masks */
+
+/* TECHNOLOGY */
+#define DT_PLOTTER 0
+#define DT_RASDISPLAY 1
+#define DT_RASPRINTER 2
+#define DT_RASCAMERA 3
+#define DT_CHARSTREAM 4
+#define DT_METAFILE 5
+#define DT_DISPFILE 6
+
+/* CURVECAPS */
+#define CC_NONE 0x0000
+#define CC_CIRCLES 0x0001
+#define CC_PIE 0x0002
+#define CC_CHORD 0x0004
+#define CC_ELLIPSES 0x0008
+#define CC_WIDE 0x0010
+#define CC_STYLED 0x0020
+#define CC_WIDESTYLED 0x0040
+#define CC_INTERIORS 0x0080
+#define CC_ROUNDRECT 0x0100
+
+/* LINECAPS */
+#define LC_NONE 0x0000
+#define LC_POLYLINE 0x0002
+#define LC_MARKER 0x0004
+#define LC_POLYMARKER 0x0008
+#define LC_WIDE 0x0010
+#define LC_STYLED 0x0020
+#define LC_WIDESTYLED 0x0040
+#define LC_INTERIORS 0x0080
+
+/* POLYGONALCAPS */
+#define PC_NONE 0x0000
+#define PC_POLYGON 0x0001
+#define PC_RECTANGLE 0x0002
+#define PC_WINDPOLYGON 0x0004
+#define PC_SCANLINE 0x0008
+#define PC_WIDE 0x0010
+#define PC_STYLED 0x0020
+#define PC_WIDESTYLED 0x0040
+#define PC_INTERIORS 0x0080
+
+/* TEXTCAPS */
+#define TC_OP_CHARACTER 0x0001
+#define TC_OP_STROKE 0x0002
+#define TC_CP_STROKE 0x0004
+#define TC_CR_90 0x0008
+#define TC_CR_ANY 0x0010
+#define TC_SF_X_YINDEP 0x0020
+#define TC_SA_DOUBLE 0x0040
+#define TC_SA_INTEGER 0x0080
+#define TC_SA_CONTIN 0x0100
+#define TC_EA_DOUBLE 0x0200
+#define TC_IA_ABLE 0x0400
+#define TC_UA_ABLE 0x0800
+#define TC_SO_ABLE 0x1000
+#define TC_RA_ABLE 0x2000
+#define TC_VA_ABLE 0x4000
+#define TC_RESERVED 0x8000
+
+/* CLIPCAPS */
+#define CP_NONE 0x0000
+#define CP_RECTANGLE 0x0001
+#define CP_REGION 0x0002
+
+/* RASTERCAPS */
+#define RC_NONE
+#define RC_BITBLT 0x0001
+#define RC_BANDING 0x0002
+#define RC_SCALING 0x0004
+#define RC_BITMAP64 0x0008
+#define RC_GDI20_OUTPUT 0x0010
+#define RC_GDI20_STATE 0x0020
+#define RC_SAVEBITMAP 0x0040
+#define RC_DI_BITMAP 0x0080
+#define RC_PALETTE 0x0100
+#define RC_DIBTODEV 0x0200
+#define RC_BIGFONT 0x0400
+#define RC_STRETCHBLT 0x0800
+#define RC_FLOODFILL 0x1000
+#define RC_STRETCHDIB 0x2000
+#define RC_OP_DX_OUTPUT 0x4000
+#define RC_DEVBITS 0x8000
+
+#endif /* NOGDICAPMASKS */
+
+/****** Coordinate transformation support ***********************************/
+
+int WINAPI SetMapMode(HDC, int);
+int WINAPI GetMapMode(HDC);
+
+/* Map modes */
+#define MM_TEXT 1
+#define MM_LOMETRIC 2
+#define MM_HIMETRIC 3
+#define MM_LOENGLISH 4
+#define MM_HIENGLISH 5
+#define MM_TWIPS 6
+#define MM_ISOTROPIC 7
+#define MM_ANISOTROPIC 8
+
+DWORD WINAPI SetWindowOrg(HDC, int, int);
+DWORD WINAPI GetWindowOrg(HDC);
+
+DWORD WINAPI SetWindowExt(HDC, int, int);
+DWORD WINAPI GetWindowExt(HDC);
+
+DWORD WINAPI OffsetWindowOrg(HDC, int, int);
+DWORD WINAPI ScaleWindowExt(HDC, int, int, int, int);
+
+DWORD WINAPI SetViewportOrg(HDC, int, int);
+DWORD WINAPI GetViewportOrg(HDC);
+
+DWORD WINAPI SetViewportExt(HDC, int, int);
+DWORD WINAPI GetViewportExt(HDC);
+
+DWORD WINAPI OffsetViewportOrg(HDC, int, int);
+DWORD WINAPI ScaleViewportExt(HDC, int, int, int, int);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI SetWindowOrgEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI GetWindowOrgEx(HDC, POINT FAR*);
+
+BOOL WINAPI SetWindowExtEx(HDC, int, int, SIZE FAR*);
+BOOL WINAPI GetWindowExtEx(HDC, SIZE FAR*);
+
+BOOL WINAPI OffsetWindowOrgEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI ScaleWindowExtEx(HDC, int, int, int, int, SIZE FAR*);
+
+BOOL WINAPI SetViewportExtEx(HDC, int, int, SIZE FAR*);
+BOOL WINAPI GetViewportExtEx(HDC, SIZE FAR*);
+
+BOOL WINAPI SetViewportOrgEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI GetViewportOrgEx(HDC, POINT FAR*);
+
+BOOL WINAPI OffsetViewportOrgEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI ScaleViewportExtEx(HDC, int, int, int, int, SIZE FAR*);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI DPtoLP(HDC, POINT FAR*, int);
+BOOL WINAPI LPtoDP(HDC, POINT FAR*, int);
+
+
+/* Coordinate Modes */
+#define ABSOLUTE 1
+#define RELATIVE 2
+
+/****** Color support *******************************************************/
+
+typedef DWORD COLORREF;
+
+#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16)))
+
+#define GetRValue(rgb) ((BYTE)(rgb))
+#define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
+#define GetBValue(rgb) ((BYTE)((rgb)>>16))
+
+COLORREF WINAPI GetNearestColor(HDC, COLORREF);
+
+#ifndef NOCOLOR
+
+COLORREF WINAPI GetSysColor(int);
+void WINAPI SetSysColors(int, const int FAR*, const COLORREF FAR*);
+
+#define COLOR_SCROLLBAR 0
+#define COLOR_BACKGROUND 1
+#define COLOR_ACTIVECAPTION 2
+#define COLOR_INACTIVECAPTION 3
+#define COLOR_MENU 4
+#define COLOR_WINDOW 5
+#define COLOR_WINDOWFRAME 6
+#define COLOR_MENUTEXT 7
+#define COLOR_WINDOWTEXT 8
+#define COLOR_CAPTIONTEXT 9
+#define COLOR_ACTIVEBORDER 10
+#define COLOR_INACTIVEBORDER 11
+#define COLOR_APPWORKSPACE 12
+#define COLOR_HIGHLIGHT 13
+#define COLOR_HIGHLIGHTTEXT 14
+#define COLOR_BTNFACE 15
+#define COLOR_BTNSHADOW 16
+#define COLOR_GRAYTEXT 17
+#define COLOR_BTNTEXT 18
+#if (WINVER >= 0x030a)
+#define COLOR_INACTIVECAPTIONTEXT 19
+#define COLOR_BTNHIGHLIGHT 20
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOCOLOR */
+
+#define WM_SYSCOLORCHANGE 0x0015
+
+/****** GDI Object Support **************************************************/
+
+#ifndef NOGDIOBJ
+
+HGDIOBJ WINAPI GetStockObject(int);
+
+BOOL WINAPI IsGDIObject(HGDIOBJ);
+
+BOOL WINAPI DeleteObject(HGDIOBJ);
+HGDIOBJ WINAPI SelectObject(HDC, HGDIOBJ);
+int WINAPI GetObject(HGDIOBJ, int, void FAR*);
+BOOL WINAPI UnrealizeObject(HGDIOBJ);
+
+#ifdef STRICT
+typedef (CALLBACK* GOBJENUMPROC)(void FAR*, LPARAM);
+#else
+typedef FARPROC GOBJENUMPROC;
+#endif
+
+#ifdef STRICT
+int WINAPI EnumObjects(HDC, int, GOBJENUMPROC, LPARAM);
+#else
+int WINAPI EnumObjects(HDC, int, GOBJENUMPROC, LPSTR);
+#endif
+
+/* Object types for EnumObjects() */
+#define OBJ_PEN 1
+#define OBJ_BRUSH 2
+
+/****** Pen support *********************************************************/
+
+/* Logical Pen */
+typedef struct tagLOGPEN
+{
+ UINT lopnStyle;
+ POINT lopnWidth;
+ COLORREF lopnColor;
+} LOGPEN;
+typedef LOGPEN* PLOGPEN;
+typedef LOGPEN NEAR* NPLOGPEN;
+typedef LOGPEN FAR* LPLOGPEN;
+
+/* Pen Styles */
+#define PS_SOLID 0
+#define PS_DASH 1
+#define PS_DOT 2
+#define PS_DASHDOT 3
+#define PS_DASHDOTDOT 4
+#define PS_NULL 5
+#define PS_INSIDEFRAME 6
+
+HPEN WINAPI CreatePen(int, int, COLORREF);
+HPEN WINAPI CreatePenIndirect(LOGPEN FAR*);
+
+/* Stock pens for use with GetStockObject(); */
+#define WHITE_PEN 6
+#define BLACK_PEN 7
+#define NULL_PEN 8
+
+/****** Brush support *******************************************************/
+
+/* Brush Styles */
+#define BS_SOLID 0
+#define BS_NULL 1
+#define BS_HOLLOW BS_NULL
+#define BS_HATCHED 2
+#define BS_PATTERN 3
+#define BS_INDEXED 4
+#define BS_DIBPATTERN 5
+
+/* Hatch Styles */
+#define HS_HORIZONTAL 0
+#define HS_VERTICAL 1
+#define HS_FDIAGONAL 2
+#define HS_BDIAGONAL 3
+#define HS_CROSS 4
+#define HS_DIAGCROSS 5
+
+/* Logical Brush (or Pattern) */
+typedef struct tagLOGBRUSH
+{
+ UINT lbStyle;
+ COLORREF lbColor;
+ int lbHatch;
+} LOGBRUSH;
+typedef LOGBRUSH* PLOGBRUSH;
+typedef LOGBRUSH NEAR* NPLOGBRUSH;
+typedef LOGBRUSH FAR* LPLOGBRUSH;
+
+typedef LOGBRUSH PATTERN;
+typedef PATTERN* PPATTERN;
+typedef PATTERN NEAR* NPPATTERN;
+typedef PATTERN FAR* LPPATTERN;
+
+HBRUSH WINAPI CreateSolidBrush(COLORREF);
+HBRUSH WINAPI CreateHatchBrush(int, COLORREF);
+HBRUSH WINAPI CreatePatternBrush(HBITMAP);
+HBRUSH WINAPI CreateDIBPatternBrush(HGLOBAL, UINT);
+HBRUSH WINAPI CreateBrushIndirect(LOGBRUSH FAR*);
+
+/* Stock brushes for use with GetStockObject() */
+#define WHITE_BRUSH 0
+#define LTGRAY_BRUSH 1
+#define GRAY_BRUSH 2
+#define DKGRAY_BRUSH 3
+#define BLACK_BRUSH 4
+#define NULL_BRUSH 5
+#define HOLLOW_BRUSH NULL_BRUSH
+
+DWORD WINAPI SetBrushOrg(HDC, int, int);
+DWORD WINAPI GetBrushOrg(HDC);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI GetBrushOrgEx(HDC, POINT FAR*);
+#endif /* WINVER >= 0x030a */
+#endif /* NOGDIOBJ */
+
+/****** Region support ******************************************************/
+
+HRGN WINAPI CreateRectRgn(int, int, int, int);
+HRGN WINAPI CreateRectRgnIndirect(const RECT FAR*);
+HRGN WINAPI CreateEllipticRgnIndirect(const RECT FAR*);
+HRGN WINAPI CreateEllipticRgn(int, int, int, int);
+HRGN WINAPI CreatePolygonRgn(const POINT FAR*, int, int);
+HRGN WINAPI CreatePolyPolygonRgn(const POINT FAR*, const int FAR*, int, int);
+HRGN WINAPI CreateRoundRectRgn(int, int, int, int, int, int);
+
+/* Region type flags */
+#define ERROR 0
+#define NULLREGION 1
+#define SIMPLEREGION 2
+#define COMPLEXREGION 3
+
+void WINAPI SetRectRgn(HRGN, int, int, int, int);
+
+int WINAPI CombineRgn(HRGN, HRGN, HRGN, int);
+
+/* CombineRgn() command values */
+#define RGN_AND 1
+#define RGN_OR 2
+#define RGN_XOR 3
+#define RGN_DIFF 4
+#define RGN_COPY 5
+
+BOOL WINAPI EqualRgn(HRGN, HRGN);
+int WINAPI OffsetRgn(HRGN, int, int);
+
+int WINAPI GetRgnBox(HRGN, RECT FAR*);
+
+BOOL WINAPI RectInRegion(HRGN, const RECT FAR*);
+BOOL WINAPI PtInRegion(HRGN, int, int);
+
+/****** Color palette Support ************************************************/
+
+#define PALETTERGB(r,g,b) (0x02000000L | RGB(r,g,b))
+#define PALETTEINDEX(i) ((COLORREF)(0x01000000L | (DWORD)(WORD)(i)))
+
+typedef struct tagPALETTEENTRY
+{
+ BYTE peRed;
+ BYTE peGreen;
+ BYTE peBlue;
+ BYTE peFlags;
+} PALETTEENTRY;
+typedef PALETTEENTRY FAR* LPPALETTEENTRY;
+
+/* Palette entry flags */
+#define PC_RESERVED 0x01 /* palette index used for animation */
+#define PC_EXPLICIT 0x02 /* palette index is explicit to device */
+#define PC_NOCOLLAPSE 0x04 /* do not match color to system palette */
+
+/* Logical Palette */
+typedef struct tagLOGPALETTE
+{
+ WORD palVersion;
+ WORD palNumEntries;
+ PALETTEENTRY palPalEntry[1];
+} LOGPALETTE;
+typedef LOGPALETTE* PLOGPALETTE;
+typedef LOGPALETTE NEAR* NPLOGPALETTE;
+typedef LOGPALETTE FAR* LPLOGPALETTE;
+
+HPALETTE WINAPI CreatePalette(const LOGPALETTE FAR*);
+
+HPALETTE WINAPI SelectPalette(HDC, HPALETTE, BOOL);
+
+UINT WINAPI RealizePalette(HDC);
+
+int WINAPI UpdateColors(HDC);
+void WINAPI AnimatePalette(HPALETTE, UINT, UINT, const PALETTEENTRY FAR*);
+
+UINT WINAPI SetPaletteEntries(HPALETTE, UINT, UINT, const PALETTEENTRY FAR*);
+UINT WINAPI GetPaletteEntries(HPALETTE, UINT, UINT, PALETTEENTRY FAR*);
+
+UINT WINAPI GetNearestPaletteIndex(HPALETTE, COLORREF);
+
+BOOL WINAPI ResizePalette(HPALETTE, UINT);
+
+UINT WINAPI GetSystemPaletteEntries(HDC, UINT, UINT, PALETTEENTRY FAR*);
+
+UINT WINAPI GetSystemPaletteUse(HDC);
+UINT WINAPI SetSystemPaletteUse(HDC, UINT);
+
+/* Get/SetSystemPaletteUse() values */
+#define SYSPAL_STATIC 1
+#define SYSPAL_NOSTATIC 2
+
+/* Palette window messages */
+#define WM_QUERYNEWPALETTE 0x030F
+#define WM_PALETTEISCHANGING 0x0310
+#define WM_PALETTECHANGED 0x0311
+
+/****** Clipping support *****************************************************/
+
+int WINAPI SelectClipRgn(HDC, HRGN);
+int WINAPI GetClipBox(HDC, RECT FAR*);
+
+int WINAPI IntersectClipRect(HDC, int, int, int, int);
+int WINAPI OffsetClipRgn(HDC, int, int);
+int WINAPI ExcludeClipRect(HDC, int, int, int, int);
+
+BOOL WINAPI PtVisible(HDC, int, int);
+BOOL WINAPI RectVisible(HDC, const RECT FAR*);
+
+
+/****** General drawing support ********************************************/
+
+DWORD WINAPI MoveTo(HDC, int, int);
+DWORD WINAPI GetCurrentPosition(HDC);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI MoveToEx(HDC, int, int, POINT FAR*);
+BOOL WINAPI GetCurrentPositionEx(HDC, POINT FAR*);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI LineTo(HDC, int, int);
+BOOL WINAPI Polyline(HDC, const POINT FAR*, int);
+
+#ifdef STRICT
+typedef void (CALLBACK* LINEDDAPROC)(int, int, LPARAM);
+#else
+typedef FARPROC LINEDDAPROC;
+#endif
+
+void WINAPI LineDDA(int, int, int, int, LINEDDAPROC, LPARAM);
+
+BOOL WINAPI Rectangle(HDC, int, int, int, int);
+BOOL WINAPI RoundRect(HDC, int, int, int, int, int, int);
+
+BOOL WINAPI Ellipse(HDC, int, int, int, int);
+BOOL WINAPI Arc(HDC, int, int, int, int, int, int, int, int);
+BOOL WINAPI Chord(HDC, int, int, int, int, int, int, int, int);
+BOOL WINAPI Pie(HDC, int, int, int, int, int, int, int, int);
+
+BOOL WINAPI Polygon(HDC, const POINT FAR*, int);
+BOOL WINAPI PolyPolygon(HDC, const POINT FAR*, int FAR*, int);
+
+/* PolyFill Modes */
+#define ALTERNATE 1
+#define WINDING 2
+
+int WINAPI SetPolyFillMode(HDC, int);
+int WINAPI GetPolyFillMode(HDC);
+
+BOOL WINAPI FloodFill(HDC, int, int, COLORREF);
+BOOL WINAPI ExtFloodFill(HDC, int, int, COLORREF, UINT);
+
+/* ExtFloodFill style flags */
+#define FLOODFILLBORDER 0
+#define FLOODFILLSURFACE 1
+
+BOOL WINAPI FillRgn(HDC, HRGN, HBRUSH);
+BOOL WINAPI FrameRgn(HDC, HRGN, HBRUSH, int, int);
+BOOL WINAPI InvertRgn(HDC, HRGN);
+BOOL WINAPI PaintRgn(HDC, HRGN);
+
+/* Rectangle output routines */
+int WINAPI FillRect(HDC, const RECT FAR*, HBRUSH);
+int WINAPI FrameRect(HDC, const RECT FAR*, HBRUSH);
+void WINAPI InvertRect(HDC, const RECT FAR*);
+
+void WINAPI DrawFocusRect(HDC, const RECT FAR*);
+
+
+/****** Text support ********************************************************/
+
+BOOL WINAPI TextOut(HDC, int, int, LPCSTR, int);
+LONG WINAPI TabbedTextOut(HDC, int, int, LPCSTR, int, int, int FAR*, int);
+BOOL WINAPI ExtTextOut(HDC, int, int, UINT, const RECT FAR*, LPCSTR, UINT, int FAR*);
+
+#define ETO_GRAYED 0x0001
+#define ETO_OPAQUE 0x0002
+#define ETO_CLIPPED 0x0004
+
+DWORD WINAPI GetTextExtent(HDC, LPCSTR, int);
+DWORD WINAPI GetTabbedTextExtent(HDC, LPCSTR, int, int, int FAR*);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI GetTextExtentPoint(HDC, LPCSTR, int, SIZE FAR*);
+#endif /* WINVER >= 0x030a */
+
+/* DrawText() Format Flags */
+#ifndef NODRAWTEXT
+#define DT_TOP 0x0000
+#define DT_LEFT 0x0000
+#define DT_CENTER 0x0001
+#define DT_RIGHT 0x0002
+#define DT_VCENTER 0x0004
+#define DT_BOTTOM 0x0008
+#define DT_WORDBREAK 0x0010
+#define DT_SINGLELINE 0x0020
+#define DT_EXPANDTABS 0x0040
+#define DT_TABSTOP 0x0080
+#define DT_NOCLIP 0x0100
+#define DT_EXTERNALLEADING 0x0200
+#define DT_CALCRECT 0x0400
+#define DT_NOPREFIX 0x0800
+#define DT_INTERNAL 0x1000
+
+int WINAPI DrawText(HDC, LPCSTR, int, RECT FAR*, UINT);
+#endif /* NODRAWTEXT */
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* GRAYSTRINGPROC)(HDC, LPARAM, int);
+#else
+typedef FARPROC GRAYSTRINGPROC;
+#endif
+
+BOOL WINAPI GrayString(HDC, HBRUSH, GRAYSTRINGPROC, LPARAM, int, int, int, int, int);
+
+BOOL WINAPI GetCharWidth(HDC, UINT, UINT, int FAR*);
+
+COLORREF WINAPI SetTextColor(HDC, COLORREF);
+COLORREF WINAPI GetTextColor(HDC);
+
+COLORREF WINAPI SetBkColor(HDC, COLORREF);
+COLORREF WINAPI GetBkColor(HDC);
+
+int WINAPI SetBkMode(HDC, int);
+int WINAPI GetBkMode(HDC);
+
+/* Background Modes */
+#define TRANSPARENT 1
+#define OPAQUE 2
+
+UINT WINAPI SetTextAlign(HDC, UINT);
+UINT WINAPI GetTextAlign(HDC);
+
+/* Text Alignment Options */
+#define TA_NOUPDATECP 0x0000
+#define TA_UPDATECP 0x0001
+#define TA_LEFT 0x0000
+#define TA_RIGHT 0x0002
+#define TA_CENTER 0x0006
+#define TA_TOP 0x0000
+#define TA_BOTTOM 0x0008
+#define TA_BASELINE 0x0018
+
+int WINAPI SetTextCharacterExtra(HDC, int);
+int WINAPI GetTextCharacterExtra(HDC);
+
+int WINAPI SetTextJustification(HDC, int, int);
+
+/****** Font support ********************************************************/
+
+#ifndef NOGDIOBJ
+/* Logical Font */
+#define LF_FACESIZE 32
+typedef struct tagLOGFONT
+{
+ int lfHeight;
+ int lfWidth;
+ int lfEscapement;
+ int lfOrientation;
+ int lfWeight;
+ BYTE lfItalic;
+ BYTE lfUnderline;
+ BYTE lfStrikeOut;
+ BYTE lfCharSet;
+ BYTE lfOutPrecision;
+ BYTE lfClipPrecision;
+ BYTE lfQuality;
+ BYTE lfPitchAndFamily;
+ char lfFaceName[LF_FACESIZE];
+} LOGFONT;
+typedef LOGFONT* PLOGFONT;
+typedef LOGFONT NEAR* NPLOGFONT;
+typedef LOGFONT FAR* LPLOGFONT;
+
+/* weight values */
+#define FW_DONTCARE 0
+#define FW_THIN 100
+#define FW_EXTRALIGHT 200
+#define FW_LIGHT 300
+#define FW_NORMAL 400
+#define FW_MEDIUM 500
+#define FW_SEMIBOLD 600
+#define FW_BOLD 700
+#define FW_EXTRABOLD 800
+#define FW_HEAVY 900
+
+#define FW_ULTRALIGHT FW_EXTRALIGHT
+#define FW_REGULAR FW_NORMAL
+#define FW_DEMIBOLD FW_SEMIBOLD
+#define FW_ULTRABOLD FW_EXTRABOLD
+#define FW_BLACK FW_HEAVY
+
+/* CharSet values */
+#define ANSI_CHARSET 0
+#define DEFAULT_CHARSET 1
+#define SYMBOL_CHARSET 2
+#define SHIFTJIS_CHARSET 128
+#define HANGEUL_CHARSET 129
+#define CHINESEBIG5_CHARSET 136
+#define OEM_CHARSET 255
+
+/* OutPrecision values */
+#define OUT_DEFAULT_PRECIS 0
+#define OUT_STRING_PRECIS 1
+#define OUT_CHARACTER_PRECIS 2
+#define OUT_STROKE_PRECIS 3
+#if (WINVER >= 0x030a)
+#define OUT_TT_PRECIS 4
+#define OUT_DEVICE_PRECIS 5
+#define OUT_RASTER_PRECIS 6
+#define OUT_TT_ONLY_PRECIS 7
+#endif /* WINVER >= 0x030a */
+
+/* ClipPrecision values */
+#define CLIP_DEFAULT_PRECIS 0x00
+#define CLIP_CHARACTER_PRECIS 0x01
+#define CLIP_STROKE_PRECIS 0x02
+#define CLIP_MASK 0x0F
+#if (WINVER >= 0x030a)
+#define CLIP_LH_ANGLES 0x10
+#define CLIP_TT_ALWAYS 0x20
+#define CLIP_EMBEDDED 0x80
+#endif /* WINVER >= 0x030a */
+
+/* Quality values */
+#define DEFAULT_QUALITY 0
+#define DRAFT_QUALITY 1
+#define PROOF_QUALITY 2
+
+/* PitchAndFamily pitch values (low 4 bits) */
+#define DEFAULT_PITCH 0x00
+#define FIXED_PITCH 0x01
+#define VARIABLE_PITCH 0x02
+
+/* PitchAndFamily family values (high 4 bits) */
+#define FF_DONTCARE 0x00
+#define FF_ROMAN 0x10
+#define FF_SWISS 0x20
+#define FF_MODERN 0x30
+#define FF_SCRIPT 0x40
+#define FF_DECORATIVE 0x50
+
+HFONT WINAPI CreateFont(int, int, int, int, int, BYTE, BYTE, BYTE, BYTE, BYTE, BYTE, BYTE, BYTE, LPCSTR);
+HFONT WINAPI CreateFontIndirect(const LOGFONT FAR*);
+
+/* Stock fonts for use with GetStockObject() */
+#define OEM_FIXED_FONT 10
+#define ANSI_FIXED_FONT 11
+#define ANSI_VAR_FONT 12
+#define SYSTEM_FONT 13
+#define DEVICE_DEFAULT_FONT 14
+#define DEFAULT_PALETTE 15
+#define SYSTEM_FIXED_FONT 16
+
+
+DWORD WINAPI SetMapperFlags(HDC, DWORD);
+#define ASPECT_FILTERING 0x00000001L
+
+int WINAPI AddFontResource(LPCSTR);
+BOOL WINAPI RemoveFontResource(LPCSTR);
+
+#define WM_FONTCHANGE 0x001D
+
+int WINAPI GetTextFace(HDC, int, LPSTR);
+
+DWORD WINAPI GetAspectRatioFilter(HDC);
+#if (WINVER >= 0x030a)
+BOOL WINAPI GetAspectRatioFilterEx(HDC, SIZE FAR*);
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOGDIOBJ */
+
+#ifndef NOTEXTMETRIC
+
+typedef struct tagTEXTMETRIC
+{
+ int tmHeight;
+ int tmAscent;
+ int tmDescent;
+ int tmInternalLeading;
+ int tmExternalLeading;
+ int tmAveCharWidth;
+ int tmMaxCharWidth;
+ int tmWeight;
+ BYTE tmItalic;
+ BYTE tmUnderlined;
+ BYTE tmStruckOut;
+ BYTE tmFirstChar;
+ BYTE tmLastChar;
+ BYTE tmDefaultChar;
+ BYTE tmBreakChar;
+ BYTE tmPitchAndFamily;
+ BYTE tmCharSet;
+ int tmOverhang;
+ int tmDigitizedAspectX;
+ int tmDigitizedAspectY;
+} TEXTMETRIC;
+typedef TEXTMETRIC* PTEXTMETRIC;
+typedef TEXTMETRIC NEAR* NPTEXTMETRIC;
+typedef TEXTMETRIC FAR* LPTEXTMETRIC;
+
+/* tmPitchAndFamily values */
+#define TMPF_FIXED_PITCH 0x01
+#define TMPF_VECTOR 0x02
+#define TMPF_DEVICE 0x08
+#if (WINVER >= 0x030a)
+#define TMPF_TRUETYPE 0x04
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI GetTextMetrics(HDC, TEXTMETRIC FAR*);
+
+#if (WINVER >= 0x030a)
+#ifndef NOSCALABLEFONT
+
+typedef struct tagPANOSE
+{
+ BYTE bFamilyType;
+ BYTE bSerifStyle;
+ BYTE bWeight;
+ BYTE bProportion;
+ BYTE bContrast;
+ BYTE bStrokeVariation;
+ BYTE bArmStyle;
+ BYTE bLetterform;
+ BYTE bMidline;
+ BYTE bXHeight;
+} PANOSE, FAR* LPPANOSE;
+
+typedef struct tagOUTLINETEXTMETRIC
+{
+ UINT otmSize;
+ TEXTMETRIC otmTextMetrics;
+ BYTE otmFiller;
+ PANOSE otmPanoseNumber;
+ UINT otmfsSelection;
+ UINT otmfsType;
+ int otmsCharSlopeRise;
+ int otmsCharSlopeRun;
+ int otmItalicAngle;
+ UINT otmEMSquare;
+ int otmAscent;
+ int otmDescent;
+ UINT otmLineGap;
+ UINT otmsCapEmHeight;
+ UINT otmsXHeight;
+ RECT otmrcFontBox;
+ int otmMacAscent;
+ int otmMacDescent;
+ UINT otmMacLineGap;
+ UINT otmusMinimumPPEM;
+ POINT otmptSubscriptSize;
+ POINT otmptSubscriptOffset;
+ POINT otmptSuperscriptSize;
+ POINT otmptSuperscriptOffset;
+ UINT otmsStrikeoutSize;
+ int otmsStrikeoutPosition;
+ int otmsUnderscorePosition;
+ int otmsUnderscoreSize;
+ PSTR otmpFamilyName;
+ PSTR otmpFaceName;
+ PSTR otmpStyleName;
+ PSTR otmpFullName;
+} OUTLINETEXTMETRIC, FAR* LPOUTLINETEXTMETRIC;
+
+WORD WINAPI GetOutlineTextMetrics(HDC, UINT, OUTLINETEXTMETRIC FAR*);
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOSCALABLEFONT */
+
+#ifndef NOGDIOBJ
+#if (WINVER >= 0x030a)
+
+/* Structure passed to FONTENUMPROC */
+/* NOTE: NEWTEXTMETRIC is the same as TEXTMETRIC plus 4 new fields */
+typedef struct tagNEWTEXTMETRIC
+{
+ int tmHeight;
+ int tmAscent;
+ int tmDescent;
+ int tmInternalLeading;
+ int tmExternalLeading;
+ int tmAveCharWidth;
+ int tmMaxCharWidth;
+ int tmWeight;
+ BYTE tmItalic;
+ BYTE tmUnderlined;
+ BYTE tmStruckOut;
+ BYTE tmFirstChar;
+ BYTE tmLastChar;
+ BYTE tmDefaultChar;
+ BYTE tmBreakChar;
+ BYTE tmPitchAndFamily;
+ BYTE tmCharSet;
+ int tmOverhang;
+ int tmDigitizedAspectX;
+ int tmDigitizedAspectY;
+ DWORD ntmFlags;
+ UINT ntmSizeEM;
+ UINT ntmCellHeight;
+ UINT ntmAvgWidth;
+} NEWTEXTMETRIC;
+typedef NEWTEXTMETRIC* PNEWTEXTMETRIC;
+typedef NEWTEXTMETRIC NEAR* NPNEWTEXTMETRIC;
+typedef NEWTEXTMETRIC FAR* LPNEWTEXTMETRIC;
+
+/* ntmFlags field flags */
+#define NTM_REGULAR 0x00000040L
+#define NTM_BOLD 0x00000020L
+#define NTM_ITALIC 0x00000001L
+
+#define LF_FULLFACESIZE 64
+
+/* Structure passed to FONTENUMPROC */
+typedef struct tagENUMLOGFONT
+{
+ LOGFONT elfLogFont;
+ char elfFullName[LF_FULLFACESIZE];
+ char elfStyle[LF_FACESIZE];
+} ENUMLOGFONT, FAR* LPENUMLOGFONT;
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOGDIOBJ */
+
+#ifdef STRICT
+#ifndef NOGDIOBJ
+
+typedef int (CALLBACK* OLDFONTENUMPROC)(const LOGFONT FAR*, const TEXTMETRIC FAR*, int, LPARAM);
+
+#if (WINVER >= 0x030a)
+typedef int (CALLBACK* FONTENUMPROC)(const ENUMLOGFONT FAR*, const NEWTEXTMETRIC FAR*, int, LPARAM);
+
+int WINAPI EnumFontFamilies(HDC, LPCSTR, FONTENUMPROC, LPARAM);
+
+#else /* WINVER >= 0x030a */
+typedef OLDFONTENUMPROC FONTENUMPROC;
+#endif /* WINVER >= 0x030a) */
+
+int WINAPI EnumFonts(HDC, LPCSTR, OLDFONTENUMPROC, LPARAM);
+#endif /* NOGDIOBJ */
+
+#else /* STRICT */
+
+typedef FARPROC OLDFONTENUMPROC;
+typedef FARPROC FONTENUMPROC;
+
+int WINAPI EnumFonts(HDC, LPCSTR, OLDFONTENUMPROC, LPSTR);
+
+#if (WINVER >= 0x030a)
+int WINAPI EnumFontFamilies(HDC, LPCSTR, FONTENUMPROC, LPSTR);
+#endif /* WINVER >= 0x030a */
+
+#endif /* !STRICT */
+
+/* EnumFonts font type values */
+#define RASTER_FONTTYPE 0x0001
+#define DEVICE_FONTTYPE 0X0002
+#if (WINVER >= 0x030a)
+#define TRUETYPE_FONTTYPE 0x0004
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOTEXTMETRIC */
+
+#ifndef NOSCALABLEFONT
+#if (WINVER >= 0x030a)
+
+DWORD WINAPI GetFontData(HDC, DWORD, DWORD, void FAR*, DWORD);
+BOOL WINAPI CreateScalableFontResource(UINT, LPCSTR, LPCSTR, LPCSTR);
+
+typedef struct tagGLYPHMETRICS
+{
+ UINT gmBlackBoxX;
+ UINT gmBlackBoxY;
+ POINT gmptGlyphOrigin;
+ int gmCellIncX;
+ int gmCellIncY;
+} GLYPHMETRICS, FAR* LPGLYPHMETRICS;
+
+typedef struct tagFIXED
+{
+ UINT fract;
+ int value;
+} FIXED, FAR* LPFIXED;
+
+typedef struct tagMAT2
+{
+ FIXED eM11;
+ FIXED eM12;
+ FIXED eM21;
+ FIXED eM22;
+} MAT2, FAR* LPMAT2;
+
+DWORD WINAPI GetGlyphOutline(HDC, UINT, UINT, GLYPHMETRICS FAR*, DWORD, void FAR*, const MAT2 FAR*);
+
+/* GetGlyphOutline constants */
+#define GGO_METRICS 0
+#define GGO_BITMAP 1
+#define GGO_NATIVE 2
+
+#define TT_POLYGON_TYPE 24
+
+#define TT_PRIM_LINE 1
+#define TT_PRIM_QSPLINE 2
+
+typedef struct tagPOINTFX
+{
+ FIXED x;
+ FIXED y;
+} POINTFX, FAR* LPPOINTFX;
+
+typedef struct tagTTPOLYCURVE
+{
+ UINT wType;
+ UINT cpfx;
+ POINTFX apfx[1];
+} TTPOLYCURVE, FAR* LPTTPOLYCURVE;
+
+typedef struct tagTTPOLYGONHEADER
+{
+ DWORD cb;
+ DWORD dwType;
+ POINTFX pfxStart;
+} TTPOLYGONHEADER, FAR* LPTTPOLYGONHEADER;
+
+typedef struct tagABC
+{
+ int abcA;
+ UINT abcB;
+ int abcC;
+} ABC;
+typedef ABC FAR* LPABC;
+
+BOOL WINAPI GetCharABCWidths(HDC, UINT, UINT, ABC FAR*);
+
+typedef struct tagKERNINGPAIR
+{
+ WORD wFirst;
+ WORD wSecond;
+ int iKernAmount;
+} KERNINGPAIR, FAR* LPKERNINGPAIR;
+
+int WINAPI GetKerningPairs(HDC, int, KERNINGPAIR FAR*);
+
+typedef struct tagRASTERIZER_STATUS
+{
+ int nSize;
+ int wFlags;
+ int nLanguageID;
+} RASTERIZER_STATUS;
+typedef RASTERIZER_STATUS FAR* LPRASTERIZER_STATUS;
+
+/* bits defined in wFlags of RASTERIZER_STATUS */
+#define TT_AVAILABLE 0x0001
+#define TT_ENABLED 0x0002
+
+BOOL WINAPI GetRasterizerCaps(RASTERIZER_STATUS FAR*, int);
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOSCALABLEFONT */
+
+/****** Bitmap support ******************************************************/
+
+#ifndef NOBITMAP
+typedef struct tagBITMAP
+{
+ int bmType;
+ int bmWidth;
+ int bmHeight;
+ int bmWidthBytes;
+ BYTE bmPlanes;
+ BYTE bmBitsPixel;
+ void FAR* bmBits;
+} BITMAP;
+typedef BITMAP* PBITMAP;
+typedef BITMAP NEAR* NPBITMAP;
+typedef BITMAP FAR* LPBITMAP;
+
+/* Bitmap Header structures */
+typedef struct tagRGBTRIPLE
+{
+ BYTE rgbtBlue;
+ BYTE rgbtGreen;
+ BYTE rgbtRed;
+} RGBTRIPLE;
+typedef RGBTRIPLE FAR* LPRGBTRIPLE;
+
+typedef struct tagRGBQUAD
+{
+ BYTE rgbBlue;
+ BYTE rgbGreen;
+ BYTE rgbRed;
+ BYTE rgbReserved;
+} RGBQUAD;
+typedef RGBQUAD FAR* LPRGBQUAD;
+
+/* structures for defining DIBs */
+typedef struct tagBITMAPCOREHEADER
+{
+ DWORD bcSize;
+ short bcWidth;
+ short bcHeight;
+ WORD bcPlanes;
+ WORD bcBitCount;
+} BITMAPCOREHEADER;
+typedef BITMAPCOREHEADER* PBITMAPCOREHEADER;
+typedef BITMAPCOREHEADER FAR* LPBITMAPCOREHEADER;
+
+typedef struct tagBITMAPINFOHEADER
+{
+ DWORD biSize;
+ LONG biWidth;
+ LONG biHeight;
+ WORD biPlanes;
+ WORD biBitCount;
+ DWORD biCompression;
+ DWORD biSizeImage;
+ LONG biXPelsPerMeter;
+ LONG biYPelsPerMeter;
+ DWORD biClrUsed;
+ DWORD biClrImportant;
+} BITMAPINFOHEADER;
+typedef BITMAPINFOHEADER* PBITMAPINFOHEADER;
+typedef BITMAPINFOHEADER FAR* LPBITMAPINFOHEADER;
+
+/* constants for the biCompression field */
+#define BI_RGB 0L
+#define BI_RLE8 1L
+#define BI_RLE4 2L
+
+typedef struct tagBITMAPINFO
+{
+ BITMAPINFOHEADER bmiHeader;
+ RGBQUAD bmiColors[1];
+} BITMAPINFO;
+typedef BITMAPINFO* PBITMAPINFO;
+typedef BITMAPINFO FAR* LPBITMAPINFO;
+
+typedef struct tagBITMAPCOREINFO
+{
+ BITMAPCOREHEADER bmciHeader;
+ RGBTRIPLE bmciColors[1];
+} BITMAPCOREINFO;
+typedef BITMAPCOREINFO* PBITMAPCOREINFO;
+typedef BITMAPCOREINFO FAR* LPBITMAPCOREINFO;
+
+typedef struct tagBITMAPFILEHEADER
+{
+ UINT bfType;
+ DWORD bfSize;
+ UINT bfReserved1;
+ UINT bfReserved2;
+ DWORD bfOffBits;
+} BITMAPFILEHEADER;
+typedef BITMAPFILEHEADER* PBITMAPFILEHEADER;
+typedef BITMAPFILEHEADER FAR* LPBITMAPFILEHEADER;
+
+
+HBITMAP WINAPI CreateBitmap(int, int, UINT, UINT, const void FAR*);
+HBITMAP WINAPI CreateBitmapIndirect(BITMAP FAR* );
+HBITMAP WINAPI CreateCompatibleBitmap(HDC, int, int);
+HBITMAP WINAPI CreateDiscardableBitmap(HDC, int, int);
+HBITMAP WINAPI CreateDIBitmap(HDC, BITMAPINFOHEADER FAR*, DWORD, const void FAR*, BITMAPINFO FAR*, UINT);
+
+HBITMAP WINAPI LoadBitmap(HINSTANCE, LPCSTR);
+
+/* DIB color table identifiers */
+#define DIB_RGB_COLORS 0
+#define DIB_PAL_COLORS 1
+
+/* constants for CreateDIBitmap */
+#define CBM_INIT 0x00000004L
+#endif /* NOBITMAP */
+
+#ifndef NORASTEROPS
+
+/* Binary raster ops */
+#define R2_BLACK 1
+#define R2_NOTMERGEPEN 2
+#define R2_MASKNOTPEN 3
+#define R2_NOTCOPYPEN 4
+#define R2_MASKPENNOT 5
+#define R2_NOT 6
+#define R2_XORPEN 7
+#define R2_NOTMASKPEN 8
+#define R2_MASKPEN 9
+#define R2_NOTXORPEN 10
+#define R2_NOP 11
+#define R2_MERGENOTPEN 12
+#define R2_COPYPEN 13
+#define R2_MERGEPENNOT 14
+#define R2_MERGEPEN 15
+#define R2_WHITE 16
+
+/* Ternary raster operations */
+#define SRCCOPY 0x00CC0020L
+#define SRCPAINT 0x00EE0086L
+#define SRCAND 0x008800C6L
+#define SRCINVERT 0x00660046L
+#define SRCERASE 0x00440328L
+#define NOTSRCCOPY 0x00330008L
+#define NOTSRCERASE 0x001100A6L
+#define MERGECOPY 0x00C000CAL
+#define MERGEPAINT 0x00BB0226L
+#define PATCOPY 0x00F00021L
+#define PATPAINT 0x00FB0A09L
+#define PATINVERT 0x005A0049L
+#define DSTINVERT 0x00550009L
+#define BLACKNESS 0x00000042L
+#define WHITENESS 0x00FF0062L
+
+#endif /* NORASTEROPS */
+
+#ifndef NOBITMAP
+BOOL WINAPI BitBlt(HDC, int, int, int, int, HDC, int, int, DWORD);
+
+BOOL WINAPI PatBlt(HDC, int, int, int, int, DWORD);
+
+BOOL WINAPI StretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
+int WINAPI StretchDIBits(HDC, int, int, int, int, int,
+ int, int, int, const void FAR*, LPBITMAPINFO, UINT, DWORD);
+
+COLORREF WINAPI SetPixel(HDC, int, int, COLORREF);
+COLORREF WINAPI GetPixel(HDC, int, int);
+
+/* StretchBlt() Modes */
+#define BLACKONWHITE 1
+#define WHITEONBLACK 2
+#define COLORONCOLOR 3
+
+/* new StretchBlt() Modes (simpler names) */
+#define STRETCH_ANDSCANS 1
+#define STRETCH_ORSCANS 2
+#define STRETCH_DELETESCANS 3
+
+int WINAPI SetStretchBltMode(HDC, int);
+int WINAPI GetStretchBltMode(HDC);
+
+DWORD WINAPI SetBitmapDimension(HBITMAP, int, int);
+DWORD WINAPI GetBitmapDimension(HBITMAP);
+#if (WINVER >= 0x030a)
+BOOL WINAPI SetBitmapDimensionEx(HBITMAP, int, int, SIZE FAR*);
+BOOL WINAPI GetBitmapDimensionEx(HBITMAP, SIZE FAR*);
+#endif /* WINVER >= 0x030a */
+int WINAPI SetROP2(HDC, int);
+int WINAPI GetROP2(HDC);
+
+LONG WINAPI SetBitmapBits(HBITMAP, DWORD, const void FAR*);
+LONG WINAPI GetBitmapBits(HBITMAP, LONG, void FAR*);
+
+int WINAPI SetDIBits(HDC, HBITMAP, UINT, UINT, const void FAR*, BITMAPINFO FAR*, UINT);
+int WINAPI GetDIBits(HDC, HBITMAP, UINT, UINT, void FAR*, BITMAPINFO FAR*, UINT);
+
+int WINAPI SetDIBitsToDevice(HDC, int, int, int, int, int, int, UINT, UINT,
+ void FAR*, BITMAPINFO FAR*, UINT);
+#endif /* NOBITMAP */
+
+/****** Metafile support ****************************************************/
+
+#ifndef NOMETAFILE
+
+DECLARE_HANDLE(HMETAFILE);
+
+HDC WINAPI CreateMetaFile(LPCSTR);
+HMETAFILE WINAPI CloseMetaFile(HDC);
+
+HMETAFILE WINAPI GetMetaFile(LPCSTR);
+BOOL WINAPI DeleteMetaFile(HMETAFILE);
+HMETAFILE WINAPI CopyMetaFile(HMETAFILE, LPCSTR);
+
+BOOL WINAPI PlayMetaFile(HDC, HMETAFILE);
+
+HGLOBAL WINAPI GetMetaFileBits(HMETAFILE);
+HMETAFILE WINAPI SetMetaFileBits(HGLOBAL);
+#if (WINVER >= 0x030a)
+HMETAFILE WINAPI SetMetaFileBitsBetter(HGLOBAL);
+#endif /* WINVER >= 0x030a */
+
+/* Clipboard Metafile Picture Structure */
+typedef struct tagMETAFILEPICT
+{
+ int mm;
+ int xExt;
+ int yExt;
+ HMETAFILE hMF;
+} METAFILEPICT;
+typedef METAFILEPICT FAR* LPMETAFILEPICT;
+
+typedef struct tagMETAHEADER
+{
+ UINT mtType;
+ UINT mtHeaderSize;
+ UINT mtVersion;
+ DWORD mtSize;
+ UINT mtNoObjects;
+ DWORD mtMaxRecord;
+ UINT mtNoParameters;
+} METAHEADER;
+
+typedef struct tagHANDLETABLE
+{
+ HGDIOBJ objectHandle[1];
+} HANDLETABLE;
+typedef HANDLETABLE* PHANDLETABLE;
+typedef HANDLETABLE FAR* LPHANDLETABLE;
+
+typedef struct tagMETARECORD
+{
+ DWORD rdSize;
+ UINT rdFunction;
+ UINT rdParm[1];
+} METARECORD;
+typedef METARECORD* PMETARECORD;
+typedef METARECORD FAR* LPMETARECORD;
+
+/* Metafile Functions */
+#define META_SETBKCOLOR 0x0201
+#define META_SETBKMODE 0x0102
+#define META_SETMAPMODE 0x0103
+#define META_SETROP2 0x0104
+#define META_SETRELABS 0x0105
+#define META_SETPOLYFILLMODE 0x0106
+#define META_SETSTRETCHBLTMODE 0x0107
+#define META_SETTEXTCHAREXTRA 0x0108
+#define META_SETTEXTCOLOR 0x0209
+#define META_SETTEXTJUSTIFICATION 0x020A
+#define META_SETWINDOWORG 0x020B
+#define META_SETWINDOWEXT 0x020C
+#define META_SETVIEWPORTORG 0x020D
+#define META_SETVIEWPORTEXT 0x020E
+#define META_OFFSETWINDOWORG 0x020F
+#define META_SCALEWINDOWEXT 0x0410
+#define META_OFFSETVIEWPORTORG 0x0211
+#define META_SCALEVIEWPORTEXT 0x0412
+#define META_LINETO 0x0213
+#define META_MOVETO 0x0214
+#define META_EXCLUDECLIPRECT 0x0415
+#define META_INTERSECTCLIPRECT 0x0416
+#define META_ARC 0x0817
+#define META_ELLIPSE 0x0418
+#define META_FLOODFILL 0x0419
+#define META_PIE 0x081A
+#define META_RECTANGLE 0x041B
+#define META_ROUNDRECT 0x061C
+#define META_PATBLT 0x061D
+#define META_SAVEDC 0x001E
+#define META_SETPIXEL 0x041F
+#define META_OFFSETCLIPRGN 0x0220
+#define META_TEXTOUT 0x0521
+#define META_BITBLT 0x0922
+#define META_STRETCHBLT 0x0B23
+#define META_POLYGON 0x0324
+#define META_POLYLINE 0x0325
+#define META_ESCAPE 0x0626
+#define META_RESTOREDC 0x0127
+#define META_FILLREGION 0x0228
+#define META_FRAMEREGION 0x0429
+#define META_INVERTREGION 0x012A
+#define META_PAINTREGION 0x012B
+#define META_SELECTCLIPREGION 0x012C
+#define META_SELECTOBJECT 0x012D
+#define META_SETTEXTALIGN 0x012E
+#define META_DRAWTEXT 0x062F
+
+#define META_CHORD 0x0830
+#define META_SETMAPPERFLAGS 0x0231
+#define META_EXTTEXTOUT 0x0a32
+#define META_SETDIBTODEV 0x0d33
+#define META_SELECTPALETTE 0x0234
+#define META_REALIZEPALETTE 0x0035
+#define META_ANIMATEPALETTE 0x0436
+#define META_SETPALENTRIES 0x0037
+#define META_POLYPOLYGON 0x0538
+#define META_RESIZEPALETTE 0x0139
+
+#define META_DIBBITBLT 0x0940
+#define META_DIBSTRETCHBLT 0x0b41
+#define META_DIBCREATEPATTERNBRUSH 0x0142
+#define META_STRETCHDIB 0x0f43
+
+#define META_EXTFLOODFILL 0x0548
+
+#define META_RESETDC 0x014C
+#define META_STARTDOC 0x014D
+#define META_STARTPAGE 0x004F
+#define META_ENDPAGE 0x0050
+#define META_ABORTDOC 0x0052
+#define META_ENDDOC 0x005E
+
+#define META_DELETEOBJECT 0x01f0
+
+#define META_CREATEPALETTE 0x00f7
+#define META_CREATEBRUSH 0x00F8
+#define META_CREATEPATTERNBRUSH 0x01F9
+#define META_CREATEPENINDIRECT 0x02FA
+#define META_CREATEFONTINDIRECT 0x02FB
+#define META_CREATEBRUSHINDIRECT 0x02FC
+#define META_CREATEBITMAPINDIRECT 0x02FD
+#define META_CREATEBITMAP 0x06FE
+#define META_CREATEREGION 0x06FF
+
+void WINAPI PlayMetaFileRecord(HDC, HANDLETABLE FAR*, METARECORD FAR*, UINT);
+
+#ifdef STRICT
+typedef int (CALLBACK* MFENUMPROC)(HDC, HANDLETABLE FAR*, METARECORD FAR*, int, LPARAM);
+#else
+typedef FARPROC MFENUMPROC;
+#endif
+
+BOOL WINAPI EnumMetaFile(HDC, HMETAFILE, MFENUMPROC, LPARAM);
+
+#endif /* NOMETAFILE */
+
+/****** Printing support ****************************************************/
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* ABORTPROC)(HDC, int);
+#else
+typedef FARPROC ABORTPROC;
+#endif
+
+#if (WINVER >= 0x030a)
+
+typedef struct
+{
+ int cbSize;
+ LPCSTR lpszDocName;
+ LPCSTR lpszOutput;
+} DOCINFO;
+typedef DOCINFO FAR* LPDOCINFO;
+
+int WINAPI StartDoc(HDC, DOCINFO FAR*);
+int WINAPI StartPage(HDC);
+int WINAPI EndPage(HDC);
+int WINAPI EndDoc(HDC);
+int WINAPI AbortDoc(HDC);
+
+int WINAPI SetAbortProc(HDC, ABORTPROC);
+HANDLE WINAPI SpoolFile(LPSTR, LPSTR, LPSTR, LPSTR);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI QueryAbort(HDC, int);
+
+/* Spooler Error Codes */
+#define SP_NOTREPORTED 0x4000
+#define SP_ERROR (-1)
+#define SP_APPABORT (-2)
+#define SP_USERABORT (-3)
+#define SP_OUTOFDISK (-4)
+#define SP_OUTOFMEMORY (-5)
+
+#define PR_JOBSTATUS 0x0000
+
+#endif /* NOGDI */
+
+/* Spooler status notification message */
+#define WM_SPOOLERSTATUS 0x002A
+
+#ifndef NOGDI
+
+/******* GDI Escape support *************************************************/
+
+int WINAPI Escape(HDC, int, int, LPCSTR, void FAR*);
+
+/* GDI Escapes */
+#define NEWFRAME 1
+#define ABORTDOC 2
+#define NEXTBAND 3
+#define SETCOLORTABLE 4
+#define GETCOLORTABLE 5
+#define FLUSHOUTPUT 6
+#define DRAFTMODE 7
+#define QUERYESCSUPPORT 8
+#define SETABORTPROC 9
+#define STARTDOC 10
+#define ENDDOC 11
+#define GETPHYSPAGESIZE 12
+#define GETPRINTINGOFFSET 13
+#define GETSCALINGFACTOR 14
+#define MFCOMMENT 15
+#define GETPENWIDTH 16
+#define SETCOPYCOUNT 17
+#define SELECTPAPERSOURCE 18
+#define DEVICEDATA 19
+#define PASSTHROUGH 19
+#define GETTECHNOLGY 20
+#define GETTECHNOLOGY 20
+#define SETLINECAP 21
+#define SETLINEJOIN 22
+#define SETMITERLIMIT 23
+#define BANDINFO 24
+#define DRAWPATTERNRECT 25
+#define GETVECTORPENSIZE 26
+#define GETVECTORBRUSHSIZE 27
+#define ENABLEDUPLEX 28
+#define GETSETPAPERBINS 29
+#define GETSETPRINTORIENT 30
+#define ENUMPAPERBINS 31
+#define SETDIBSCALING 32
+#define EPSPRINTING 33
+#define ENUMPAPERMETRICS 34
+#define GETSETPAPERMETRICS 35
+#define POSTSCRIPT_DATA 37
+#define POSTSCRIPT_IGNORE 38
+#define MOUSETRAILS 39
+
+#define GETEXTENDEDTEXTMETRICS 256
+#define GETEXTENTTABLE 257
+#define GETPAIRKERNTABLE 258
+#define GETTRACKKERNTABLE 259
+#define EXTTEXTOUT 512
+#define GETFACENAME 513
+#define ENABLERELATIVEWIDTHS 768
+#define ENABLEPAIRKERNING 769
+#define SETKERNTRACK 770
+#define SETALLJUSTVALUES 771
+#define SETCHARSET 772
+
+#define STRETCHBLT 2048
+
+#define GETSETSCREENPARAMS 3072
+
+#define BEGIN_PATH 4096
+#define CLIP_TO_PATH 4097
+#define END_PATH 4098
+#define EXT_DEVICE_CAPS 4099
+#define RESTORE_CTM 4100
+#define SAVE_CTM 4101
+#define SET_ARC_DIRECTION 4102
+#define SET_BACKGROUND_COLOR 4103
+#define SET_POLY_MODE 4104
+#define SET_SCREEN_ANGLE 4105
+#define SET_SPREAD 4106
+#define TRANSFORM_CTM 4107
+#define SET_CLIP_BOX 4108
+#define SET_BOUNDS 4109
+
+#endif /* NOGDI */
+
+/****** USER typedefs, structures, and functions *****************************/
+
+DECLARE_HANDLE(HWND);
+
+#ifndef NOUSER
+
+DECLARE_HANDLE(HMENU);
+
+DECLARE_HANDLE(HICON);
+typedef HICON HCURSOR; /* HICONs & HCURSORs are polymorphic */
+
+/****** System Metrics *******************************************************/
+
+#ifndef NOSYSMETRICS
+
+int WINAPI GetSystemMetrics(int);
+
+/* GetSystemMetrics() codes */
+#define SM_CXSCREEN 0
+#define SM_CYSCREEN 1
+#define SM_CXVSCROLL 2
+#define SM_CYHSCROLL 3
+#define SM_CYCAPTION 4
+#define SM_CXBORDER 5
+#define SM_CYBORDER 6
+#define SM_CXDLGFRAME 7
+#define SM_CYDLGFRAME 8
+#define SM_CYVTHUMB 9
+#define SM_CXHTHUMB 10
+#define SM_CXICON 11
+#define SM_CYICON 12
+#define SM_CXCURSOR 13
+#define SM_CYCURSOR 14
+#define SM_CYMENU 15
+#define SM_CXFULLSCREEN 16
+#define SM_CYFULLSCREEN 17
+#define SM_CYKANJIWINDOW 18
+#define SM_MOUSEPRESENT 19
+#define SM_CYVSCROLL 20
+#define SM_CXHSCROLL 21
+#define SM_DEBUG 22
+#define SM_SWAPBUTTON 23
+#define SM_RESERVED1 24
+#define SM_RESERVED2 25
+#define SM_RESERVED3 26
+#define SM_RESERVED4 27
+#define SM_CXMIN 28
+#define SM_CYMIN 29
+#define SM_CXSIZE 30
+#define SM_CYSIZE 31
+#define SM_CXFRAME 32
+#define SM_CYFRAME 33
+#define SM_CXMINTRACK 34
+#define SM_CYMINTRACK 35
+
+#if (WINVER >= 0x030a)
+#define SM_CXDOUBLECLK 36
+#define SM_CYDOUBLECLK 37
+#define SM_CXICONSPACING 38
+#define SM_CYICONSPACING 39
+#define SM_MENUDROPALIGNMENT 40
+#define SM_PENWINDOWS 41
+#define SM_DBCSENABLED 42
+#endif /* WINVER >= 0x030a */
+
+#define SM_CMETRICS 43
+
+#endif /* NOSYSMETRICS */
+
+UINT WINAPI GetDoubleClickTime(void);
+void WINAPI SetDoubleClickTime(UINT);
+
+#define WM_DEVMODECHANGE 0x001B
+#define WM_TIMECHANGE 0x001E
+
+/****** System Parameters support ********************************************/
+
+#if (WINVER >= 0x030a)
+#ifndef NOSYSTEMPARAMSINFO
+
+BOOL WINAPI SystemParametersInfo(UINT, UINT, VOID FAR*, UINT);
+
+#define SPI_GETBEEP 1
+#define SPI_SETBEEP 2
+#define SPI_GETMOUSE 3
+#define SPI_SETMOUSE 4
+#define SPI_GETBORDER 5
+#define SPI_SETBORDER 6
+#define SPI_GETKEYBOARDSPEED 10
+#define SPI_SETKEYBOARDSPEED 11
+#define SPI_LANGDRIVER 12
+#define SPI_ICONHORIZONTALSPACING 13
+#define SPI_GETSCREENSAVETIMEOUT 14
+#define SPI_SETSCREENSAVETIMEOUT 15
+#define SPI_GETSCREENSAVEACTIVE 16
+#define SPI_SETSCREENSAVEACTIVE 17
+#define SPI_GETGRIDGRANULARITY 18
+#define SPI_SETGRIDGRANULARITY 19
+#define SPI_SETDESKWALLPAPER 20
+#define SPI_SETDESKPATTERN 21
+#define SPI_GETKEYBOARDDELAY 22
+#define SPI_SETKEYBOARDDELAY 23
+#define SPI_ICONVERTICALSPACING 24
+#define SPI_GETICONTITLEWRAP 25
+#define SPI_SETICONTITLEWRAP 26
+#define SPI_GETMENUDROPALIGNMENT 27
+#define SPI_SETMENUDROPALIGNMENT 28
+#define SPI_SETDOUBLECLKWIDTH 29
+#define SPI_SETDOUBLECLKHEIGHT 30
+#define SPI_GETICONTITLELOGFONT 31
+#define SPI_SETDOUBLECLICKTIME 32
+#define SPI_SETMOUSEBUTTONSWAP 33
+#define SPI_SETICONTITLELOGFONT 34
+#define SPI_GETFASTTASKSWITCH 35
+#define SPI_SETFASTTASKSWITCH 36
+
+/* SystemParametersInfo flags */
+#define SPIF_UPDATEINIFILE 0x0001
+#define SPIF_SENDWININICHANGE 0x0002
+
+#endif /* NOSYSTEMPARAMSINFO */
+#endif /* WINVER >= 0x030a */
+
+/****** Rectangle support ****************************************************/
+
+void WINAPI SetRect(RECT FAR*, int, int, int, int);
+void WINAPI SetRectEmpty(RECT FAR*);
+
+void WINAPI CopyRect(RECT FAR*, const RECT FAR*);
+
+BOOL WINAPI IsRectEmpty(const RECT FAR*);
+
+BOOL WINAPI EqualRect(const RECT FAR*, const RECT FAR*);
+
+BOOL WINAPI IntersectRect(RECT FAR*, const RECT FAR*, const RECT FAR*);
+BOOL WINAPI UnionRect(RECT FAR*, const RECT FAR*, const RECT FAR*);
+BOOL WINAPI SubtractRect(RECT FAR*, const RECT FAR*, const RECT FAR*);
+
+void WINAPI OffsetRect(RECT FAR*, int, int);
+void WINAPI InflateRect(RECT FAR*, int, int);
+
+BOOL WINAPI PtInRect(const RECT FAR*, POINT);
+
+/****** Window message support ***********************************************/
+
+UINT WINAPI RegisterWindowMessage(LPCSTR);
+
+#define WM_NULL 0x0000
+
+/* NOTE: All messages below 0x0400 are RESERVED by Windows */
+#define WM_USER 0x0400
+
+#ifndef NOMSG
+
+/* Queued message structure */
+typedef struct tagMSG
+{
+ HWND hwnd;
+ UINT message;
+ WPARAM wParam;
+ LPARAM lParam;
+ DWORD time;
+ POINT pt;
+} MSG;
+typedef MSG* PMSG;
+typedef MSG NEAR* NPMSG;
+typedef MSG FAR* LPMSG;
+
+BOOL WINAPI GetMessage(MSG FAR*, HWND, UINT, UINT);
+BOOL WINAPI PeekMessage(MSG FAR*, HWND, UINT, UINT, UINT);
+
+/* PeekMessage() options */
+#define PM_NOREMOVE 0x0000
+#define PM_REMOVE 0x0001
+#define PM_NOYIELD 0x0002
+
+void WINAPI WaitMessage(void);
+
+DWORD WINAPI GetMessagePos(void);
+LONG WINAPI GetMessageTime(void);
+#if (WINVER >= 0x030a)
+LPARAM WINAPI GetMessageExtraInfo(void);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI TranslateMessage(const MSG FAR*);
+LONG WINAPI DispatchMessage(const MSG FAR*);
+
+BOOL WINAPI SetMessageQueue(int);
+
+BOOL WINAPI GetInputState(void);
+
+#if (WINVER >= 0x030a)
+DWORD WINAPI GetQueueStatus(UINT flags);
+
+/* GetQueueStatus flags */
+#define QS_KEY 0x0001
+#define QS_MOUSEMOVE 0x0002
+#define QS_MOUSEBUTTON 0x0004
+#define QS_MOUSE (QS_MOUSEMOVE | QS_MOUSEBUTTON)
+#define QS_POSTMESSAGE 0x0008
+#define QS_TIMER 0x0010
+#define QS_PAINT 0x0020
+#define QS_SENDMESSAGE 0x0040
+
+#define QS_ALLINPUT 0x007f
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOMSG */
+
+BOOL WINAPI PostMessage(HWND, UINT, WPARAM, LPARAM);
+LRESULT WINAPI SendMessage(HWND, UINT, WPARAM, LPARAM);
+
+#ifndef NOMSG
+
+BOOL WINAPI PostAppMessage(HTASK, UINT, WPARAM, LPARAM);
+
+void WINAPI ReplyMessage(LRESULT);
+BOOL WINAPI InSendMessage(void);
+
+/* Special HWND value for use with PostMessage() and SendMessage() */
+#define HWND_BROADCAST ((HWND)0xffff)
+
+BOOL WINAPI CallMsgFilter(MSG FAR*, int);
+
+#define WH_GETMESSAGE 3
+
+#define WH_CALLWNDPROC 4
+
+#define WH_MSGFILTER (-1)
+#define WH_SYSMSGFILTER 6
+
+/* CallMsgFilter() and WH_SYS/MSGFILTER context codes */
+#define MSGF_DIALOGBOX 0
+#define MSGF_MENU 2
+#define MSGF_MOVE 3
+#define MSGF_SIZE 4
+#define MSGF_SCROLLBAR 5
+#define MSGF_NEXTWINDOW 6
+#define MSGF_MAINLOOP 8
+#define MSGF_USER 4096
+#endif /* NOMSG */
+
+/* Standard window messages */
+/* PenWindows specific messages */
+#define WM_PENWINFIRST 0x0380
+#define WM_PENWINLAST 0x038F
+
+/* Coalescing messages */
+#define WM_COALESCE_FIRST 0x0390
+#define WM_COALESCE_LAST 0x039F
+
+
+#if (WINVER >= 0x030a)
+/****** Power management ****************************************************/
+#define WM_POWER 0x0048
+
+/* wParam for WM_POWER window message and DRV_POWER driver notification */
+#define PWR_OK 1
+#define PWR_FAIL (-1)
+#define PWR_SUSPENDREQUEST 1
+#define PWR_SUSPENDRESUME 2
+#define PWR_CRITICALRESUME 3
+#endif /* WINVER >= 0x030a */
+
+/****** Application termination *********************************************/
+
+#define WM_QUERYENDSESSION 0x0011
+#define WM_ENDSESSION 0x0016
+
+#define WM_QUIT 0x0012
+
+void WINAPI PostQuitMessage(int);
+
+#define WM_SYSTEMERROR 0x0017
+
+/****** Window class management *********************************************/
+
+typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
+
+typedef struct tagWNDCLASS
+{
+ UINT style;
+ WNDPROC lpfnWndProc;
+ int cbClsExtra;
+ int cbWndExtra;
+ HINSTANCE hInstance;
+ HICON hIcon;
+ HCURSOR hCursor;
+ HBRUSH hbrBackground;
+ LPCSTR lpszMenuName;
+ LPCSTR lpszClassName;
+} WNDCLASS;
+typedef WNDCLASS* PWNDCLASS;
+typedef WNDCLASS NEAR* NPWNDCLASS;
+typedef WNDCLASS FAR* LPWNDCLASS;
+
+ATOM WINAPI RegisterClass(const WNDCLASS FAR*);
+BOOL WINAPI UnregisterClass(LPCSTR, HINSTANCE);
+
+BOOL WINAPI GetClassInfo(HINSTANCE, LPCSTR, WNDCLASS FAR*);
+int WINAPI GetClassName(HWND, LPSTR, int);
+
+#ifndef NOWINSTYLES
+
+/* Class styles */
+#define CS_VREDRAW 0x0001
+#define CS_HREDRAW 0x0002
+
+#define CS_OWNDC 0x0020
+#define CS_CLASSDC 0x0040
+#define CS_PARENTDC 0x0080
+
+#define CS_SAVEBITS 0x0800
+
+#define CS_DBLCLKS 0x0008
+
+#define CS_BYTEALIGNCLIENT 0x1000
+#define CS_BYTEALIGNWINDOW 0x2000
+
+#define CS_NOCLOSE 0x0200
+
+#define CS_KEYCVTWINDOW 0x0004
+#define CS_NOKEYCVT 0x0100
+
+#define CS_GLOBALCLASS 0x4000
+#endif /* NOWINSTYLES */
+
+#ifndef NOWINOFFSETS
+
+WORD WINAPI GetClassWord(HWND, int);
+WORD WINAPI SetClassWord(HWND, int, WORD);
+LONG WINAPI GetClassLong(HWND, int);
+LONG WINAPI SetClassLong(HWND, int, LONG);
+
+/* Class field offsets for GetClassLong() and GetClassWord() */
+#define GCL_MENUNAME (-8)
+#define GCW_HBRBACKGROUND (-10)
+#define GCW_HCURSOR (-12)
+#define GCW_HICON (-14)
+#define GCW_HMODULE (-16)
+#define GCW_CBWNDEXTRA (-18)
+#define GCW_CBCLSEXTRA (-20)
+#define GCL_WNDPROC (-24)
+#define GCW_STYLE (-26)
+
+#if (WINVER >= 0x030a)
+#define GCW_ATOM (-32)
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOWINOFFSETS */
+
+/****** Window creation/destroy *********************************************/
+
+/* Window Styles */
+#ifndef NOWINSTYLES
+
+/* Basic window types */
+#define WS_OVERLAPPED 0x00000000L
+#define WS_POPUP 0x80000000L
+#define WS_CHILD 0x40000000L
+
+/* Clipping styles */
+#define WS_CLIPSIBLINGS 0x04000000L
+#define WS_CLIPCHILDREN 0x02000000L
+
+/* Generic window states */
+#define WS_VISIBLE 0x10000000L
+#define WS_DISABLED 0x08000000L
+
+/* Main window states */
+#define WS_MINIMIZE 0x20000000L
+#define WS_MAXIMIZE 0x01000000L
+
+/* Main window styles */
+#define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */
+#define WS_BORDER 0x00800000L
+#define WS_DLGFRAME 0x00400000L
+#define WS_VSCROLL 0x00200000L
+#define WS_HSCROLL 0x00100000L
+#define WS_SYSMENU 0x00080000L
+#define WS_THICKFRAME 0x00040000L
+#define WS_MINIMIZEBOX 0x00020000L
+#define WS_MAXIMIZEBOX 0x00010000L
+
+/* Control window styles */
+#define WS_GROUP 0x00020000L
+#define WS_TABSTOP 0x00010000L
+
+/* Common Window Styles */
+#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
+#define WS_POPUPWINDOW (WS_POPUP | WS_BORDER | WS_SYSMENU)
+#define WS_CHILDWINDOW (WS_CHILD)
+
+/* Extended Window Styles */
+#define WS_EX_DLGMODALFRAME 0x00000001L
+#define WS_EX_NOPARENTNOTIFY 0x00000004L
+
+#if (WINVER >= 0x030a)
+#define WS_EX_TOPMOST 0x00000008L
+#define WS_EX_ACCEPTFILES 0x00000010L
+#define WS_EX_TRANSPARENT 0x00000020L
+#endif /* WINVER >= 0x030a */
+
+/* Obsolete style names */
+#define WS_TILED WS_OVERLAPPED
+#define WS_ICONIC WS_MINIMIZE
+#define WS_SIZEBOX WS_THICKFRAME
+#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW
+
+
+#endif /* NOWINSTYLES */
+
+/* Special value for CreateWindow, et al. */
+#define HWND_DESKTOP ((HWND)0)
+
+BOOL WINAPI IsWindow(HWND);
+
+HWND WINAPI CreateWindowEx(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, void FAR*);
+HWND WINAPI CreateWindow(LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, void FAR*);
+
+#define WM_CREATE 0x0001
+#define WM_NCCREATE 0x0081
+
+/* WM_CREATE/WM_NCCREATE lParam struct */
+typedef struct tagCREATESTRUCT
+{
+ void FAR* lpCreateParams;
+ HINSTANCE hInstance;
+ HMENU hMenu;
+ HWND hwndParent;
+ int cy;
+ int cx;
+ int y;
+ int x;
+ LONG style;
+ LPCSTR lpszName;
+ LPCSTR lpszClass;
+ DWORD dwExStyle;
+} CREATESTRUCT;
+typedef CREATESTRUCT FAR* LPCREATESTRUCT;
+
+BOOL WINAPI DestroyWindow(HWND);
+
+#define WM_DESTROY 0x0002
+#define WM_NCDESTROY 0x0082
+
+/* Basic window attributes */
+
+HTASK WINAPI GetWindowTask(HWND);
+
+BOOL WINAPI IsChild(HWND, HWND);
+
+HWND WINAPI GetParent(HWND);
+HWND WINAPI SetParent(HWND, HWND);
+
+BOOL WINAPI IsWindowVisible(HWND);
+
+BOOL WINAPI ShowWindow(HWND, int);
+
+
+#ifndef NOSHOWWINDOW
+
+#define SW_HIDE 0
+#define SW_SHOWNORMAL 1
+#define SW_NORMAL 1
+#define SW_SHOWMINIMIZED 2
+#define SW_SHOWMAXIMIZED 3
+#define SW_MAXIMIZE 3
+#define SW_SHOWNOACTIVATE 4
+#define SW_SHOW 5
+#define SW_MINIMIZE 6
+#define SW_SHOWMINNOACTIVE 7
+#define SW_SHOWNA 8
+#define SW_RESTORE 9
+
+/* Obsolete ShowWindow() command names */
+#define HIDE_WINDOW 0
+#define SHOW_OPENWINDOW 1
+#define SHOW_ICONWINDOW 2
+#define SHOW_FULLSCREEN 3
+#define SHOW_OPENNOACTIVATE 4
+
+#define WM_SHOWWINDOW 0x0018
+
+/* WM_SHOWWINDOW wParam codes */
+#define SW_PARENTCLOSING 1
+#define SW_OTHERMAXIMIZED 2
+#define SW_PARENTOPENING 3
+#define SW_OTHERRESTORED 4
+
+/* Obsolete constant names */
+#define SW_OTHERZOOM SW_OTHERMAXIMIZED
+#define SW_OTHERUNZOOM SW_OTHERRESTORED
+#endif /* NOSHOWWINDOW */
+
+#define WM_SETREDRAW 0x000B
+
+/* Enabled state */
+BOOL WINAPI EnableWindow(HWND,BOOL);
+BOOL WINAPI IsWindowEnabled(HWND);
+
+#define WM_ENABLE 0x000A
+
+/* Window text */
+void WINAPI SetWindowText(HWND, LPCSTR);
+int WINAPI GetWindowText(HWND, LPSTR, int);
+int WINAPI GetWindowTextLength(HWND);
+
+#define WM_SETTEXT 0x000C
+#define WM_GETTEXT 0x000D
+#define WM_GETTEXTLENGTH 0x000E
+
+/* Window words */
+WORD WINAPI GetWindowWord(HWND, int);
+WORD WINAPI SetWindowWord(HWND, int, WORD);
+LONG WINAPI GetWindowLong(HWND, int);
+LONG WINAPI SetWindowLong(HWND, int, LONG);
+
+/* Window field offsets for GetWindowLong() and GetWindowWord() */
+#ifndef NOWINOFFSETS
+#define GWL_WNDPROC (-4)
+#define GWW_HINSTANCE (-6)
+#define GWW_HWNDPARENT (-8)
+#define GWW_ID (-12)
+#define GWL_STYLE (-16)
+#define GWL_EXSTYLE (-20)
+#endif /* NOWINOFFSETS */
+
+/****** Window size, position, Z-order, and visibility **********************/
+
+#define CW_USEDEFAULT ((int)0x8000)
+
+void WINAPI GetClientRect(HWND, RECT FAR*);
+void WINAPI GetWindowRect(HWND, RECT FAR*);
+
+
+#if (WINVER >= 0x030a)
+typedef struct tagWINDOWPLACEMENT
+{
+ UINT length;
+ UINT flags;
+ UINT showCmd;
+ POINT ptMinPosition;
+ POINT ptMaxPosition;
+ RECT rcNormalPosition;
+} WINDOWPLACEMENT;
+typedef WINDOWPLACEMENT *PWINDOWPLACEMENT;
+typedef WINDOWPLACEMENT FAR* LPWINDOWPLACEMENT;
+
+#define WPF_SETMINPOSITION 0x0001
+#define WPF_RESTORETOMAXIMIZED 0x0002
+
+BOOL WINAPI GetWindowPlacement(HWND, WINDOWPLACEMENT FAR*);
+BOOL WINAPI SetWindowPlacement(HWND, const WINDOWPLACEMENT FAR*);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI SetWindowPos(HWND, HWND, int, int, int, int, UINT);
+
+/* SetWindowPos() and WINDOWPOS flags */
+#define SWP_NOSIZE 0x0001
+#define SWP_NOMOVE 0x0002
+#define SWP_NOZORDER 0x0004
+#define SWP_NOREDRAW 0x0008
+#define SWP_NOACTIVATE 0x0010
+#define SWP_FRAMECHANGED 0x0020 /* The frame changed: send WM_NCCALCSIZE */
+#define SWP_SHOWWINDOW 0x0040
+#define SWP_HIDEWINDOW 0x0080
+#define SWP_NOCOPYBITS 0x0100
+#define SWP_NOOWNERZORDER 0x0200 /* Don't do owner Z ordering */
+
+#define SWP_DRAWFRAME SWP_FRAMECHANGED
+#define SWP_NOREPOSITION SWP_NOOWNERZORDER
+
+#define SWP_NOSENDCHANGING 0x0400
+#define SWP_DEFERERASE 0x2000
+
+/* SetWindowPos() hwndInsertAfter field values */
+#define HWND_TOP ((HWND)0)
+#define HWND_BOTTOM ((HWND)1)
+#define HWND_TOPMOST ((HWND)-1)
+#define HWND_NOTOPMOST ((HWND)-2)
+
+#ifndef NODEFERWINDOWPOS
+
+DECLARE_HANDLE(HDWP);
+
+HDWP WINAPI BeginDeferWindowPos(int);
+HDWP WINAPI DeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT);
+BOOL WINAPI EndDeferWindowPos(HDWP);
+
+#endif /* NODEFERWINDOWPOS */
+
+BOOL WINAPI MoveWindow(HWND, int, int, int, int, BOOL);
+BOOL WINAPI BringWindowToTop(HWND);
+
+#if (WINVER >= 0x030a)
+
+#define WM_WINDOWPOSCHANGING 0x0046
+#define WM_WINDOWPOSCHANGED 0x0047
+
+/* WM_WINDOWPOSCHANGING/CHANGED struct pointed to by lParam */
+typedef struct tagWINDOWPOS
+{
+ HWND hwnd;
+ HWND hwndInsertAfter;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ UINT flags;
+} WINDOWPOS;
+typedef WINDOWPOS FAR* LPWINDOWPOS;
+#endif /* WINVER >= 0x030a */
+
+#define WM_MOVE 0x0003
+#define WM_SIZE 0x0005
+
+/* WM_SIZE message wParam values */
+#define SIZE_RESTORED 0
+#define SIZE_MINIMIZED 1
+#define SIZE_MAXIMIZED 2
+#define SIZE_MAXSHOW 3
+#define SIZE_MAXHIDE 4
+
+/* Obsolete constant names */
+#define SIZENORMAL SIZE_RESTORED
+#define SIZEICONIC SIZE_MINIMIZED
+#define SIZEFULLSCREEN SIZE_MAXIMIZED
+#define SIZEZOOMSHOW SIZE_MAXSHOW
+#define SIZEZOOMHIDE SIZE_MAXHIDE
+
+/****** Window proc implementation & subclassing support *********************/
+
+LRESULT WINAPI DefWindowProc(HWND, UINT, WPARAM, LPARAM);
+
+#ifdef STRICT
+LRESULT WINAPI CallWindowProc(WNDPROC, HWND, UINT, WPARAM, LPARAM);
+#else
+LRESULT WINAPI CallWindowProc(FARPROC, HWND, UINT, WPARAM, LPARAM);
+#endif
+
+/****** Main window support **************************************************/
+
+void WINAPI AdjustWindowRect(RECT FAR*, DWORD, BOOL);
+void WINAPI AdjustWindowRectEx(RECT FAR*, DWORD, BOOL, DWORD);
+
+#define WM_QUERYOPEN 0x0013
+#define WM_CLOSE 0x0010
+
+/* Struct pointed to by WM_GETMINMAXINFO lParam */
+typedef struct tagMINMAXINFO
+{
+ POINT ptReserved;
+ POINT ptMaxSize;
+ POINT ptMaxPosition;
+ POINT ptMinTrackSize;
+ POINT ptMaxTrackSize;
+} MINMAXINFO;
+#define WM_GETMINMAXINFO 0x0024
+
+
+BOOL WINAPI FlashWindow(HWND, BOOL);
+
+void WINAPI ShowOwnedPopups(HWND, BOOL);
+
+/* Obsolete functions */
+BOOL WINAPI OpenIcon(HWND);
+void WINAPI CloseWindow(HWND);
+BOOL WINAPI AnyPopup(void);
+BOOL WINAPI IsIconic(HWND);
+BOOL WINAPI IsZoomed(HWND);
+
+/****** Window coordinate mapping and hit-testing ***************************/
+
+void WINAPI ClientToScreen(HWND, POINT FAR*);
+void WINAPI ScreenToClient(HWND, POINT FAR*);
+
+#if (WINVER >= 0x030a)
+void WINAPI MapWindowPoints(HWND hwndFrom, HWND hwndTo, POINT FAR* lppt, UINT cpt);
+#endif /* WINVER >= 0x030a */
+
+HWND WINAPI WindowFromPoint(POINT);
+HWND WINAPI ChildWindowFromPoint(HWND, POINT);
+
+/****** Window query and enumeration ****************************************/
+
+HWND WINAPI GetDesktopWindow(void);
+
+HWND WINAPI FindWindow(LPCSTR, LPCSTR);
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
+#else
+typedef FARPROC WNDENUMPROC;
+#endif
+
+BOOL WINAPI EnumWindows(WNDENUMPROC, LPARAM);
+BOOL WINAPI EnumChildWindows(HWND, WNDENUMPROC, LPARAM);
+BOOL WINAPI EnumTaskWindows(HTASK, WNDENUMPROC, LPARAM);
+
+HWND WINAPI GetTopWindow(HWND);
+
+HWND WINAPI GetWindow(HWND, UINT);
+HWND WINAPI GetNextWindow(HWND, UINT);
+
+/* GetWindow() constants */
+#define GW_HWNDFIRST 0
+#define GW_HWNDLAST 1
+#define GW_HWNDNEXT 2
+#define GW_HWNDPREV 3
+#define GW_OWNER 4
+#define GW_CHILD 5
+
+
+/****** Window property support *********************************************/
+
+BOOL WINAPI SetProp(HWND, LPCSTR, HANDLE);
+HANDLE WINAPI GetProp(HWND, LPCSTR);
+HANDLE WINAPI RemoveProp(HWND, LPCSTR);
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* PROPENUMPROC)(HWND, LPCSTR, HANDLE);
+#else
+typedef FARPROC PROPENUMPROC;
+#endif
+
+int WINAPI EnumProps(HWND, PROPENUMPROC);
+
+/****** Window drawing support **********************************************/
+
+HDC WINAPI GetDC(HWND);
+int WINAPI ReleaseDC(HWND, HDC);
+
+HDC WINAPI GetWindowDC(HWND);
+
+#if (WINVER >= 0x030a)
+HDC WINAPI GetDCEx(register HWND hwnd, HRGN hrgnClip, DWORD flags);
+
+#define DCX_WINDOW 0x00000001L
+#define DCX_CACHE 0x00000002L
+#define DCX_CLIPCHILDREN 0x00000008L
+#define DCX_CLIPSIBLINGS 0x00000010L
+#define DCX_PARENTCLIP 0x00000020L
+
+#define DCX_EXCLUDERGN 0x00000040L
+#define DCX_INTERSECTRGN 0x00000080L
+
+
+#define DCX_LOCKWINDOWUPDATE 0x00000400L
+
+
+#define DCX_USESTYLE 0x00010000L
+
+#endif /* WINVER >= 0x030a */
+
+/****** Window repainting ***************************************************/
+
+#define WM_PAINT 0x000F
+#define WM_ERASEBKGND 0x0014
+#define WM_ICONERASEBKGND 0x0027
+
+/* BeginPaint() return structure */
+typedef struct tagPAINTSTRUCT
+{
+ HDC hdc;
+ BOOL fErase;
+ RECT rcPaint;
+ BOOL fRestore;
+ BOOL fIncUpdate;
+ BYTE rgbReserved[16];
+} PAINTSTRUCT;
+typedef PAINTSTRUCT* PPAINTSTRUCT;
+typedef PAINTSTRUCT NEAR* NPPAINTSTRUCT;
+typedef PAINTSTRUCT FAR* LPPAINTSTRUCT;
+
+HDC WINAPI BeginPaint(HWND, PAINTSTRUCT FAR*);
+void WINAPI EndPaint(HWND, const PAINTSTRUCT FAR*);
+
+void WINAPI UpdateWindow(HWND);
+
+int WINAPI ExcludeUpdateRgn(HDC, HWND);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI LockWindowUpdate(HWND hwndLock);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI GetUpdateRect(HWND, RECT FAR*, BOOL);
+int WINAPI GetUpdateRgn(HWND, HRGN, BOOL);
+
+void WINAPI InvalidateRect(HWND, const RECT FAR*, BOOL);
+void WINAPI ValidateRect(HWND, const RECT FAR*);
+
+void WINAPI InvalidateRgn(HWND, HRGN, BOOL);
+void WINAPI ValidateRgn(HWND, HRGN);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI RedrawWindow(HWND hwnd, const RECT FAR* lprcUpdate, HRGN hrgnUpdate, UINT flags);
+
+#define RDW_INVALIDATE 0x0001
+#define RDW_INTERNALPAINT 0x0002
+#define RDW_ERASE 0x0004
+
+#define RDW_VALIDATE 0x0008
+#define RDW_NOINTERNALPAINT 0x0010
+#define RDW_NOERASE 0x0020
+
+#define RDW_NOCHILDREN 0x0040
+#define RDW_ALLCHILDREN 0x0080
+
+#define RDW_UPDATENOW 0x0100
+#define RDW_ERASENOW 0x0200
+
+#define RDW_FRAME 0x0400
+#define RDW_NOFRAME 0x0800
+
+#endif /* WINVER >= 0x030a */
+
+/****** Window scrolling ****************************************************/
+
+void WINAPI ScrollWindow(HWND, int, int, const RECT FAR*, const RECT FAR*);
+BOOL WINAPI ScrollDC(HDC, int, int, const RECT FAR*, const RECT FAR*, HRGN, RECT FAR*);
+
+#if (WINVER >= 0x030a)
+
+int WINAPI ScrollWindowEx(HWND hwnd, int dx, int dy,
+ const RECT FAR* prcScroll, const RECT FAR* prcClip,
+ HRGN hrgnUpdate, RECT FAR* prcUpdate, UINT flags);
+
+#define SW_SCROLLCHILDREN 0x0001
+#define SW_INVALIDATE 0x0002
+#define SW_ERASE 0x0004
+
+
+#endif /* WINVER >= 0x030a */
+
+/****** Non-client window area management ************************************/
+
+#define WM_NCPAINT 0x0085
+
+#define WM_NCCALCSIZE 0x0083
+
+#if (WINVER >= 0x030a)
+/* WM_NCCALCSIZE return flags */
+#define WVR_ALIGNTOP 0x0010
+#define WVR_ALIGNLEFT 0x0020
+#define WVR_ALIGNBOTTOM 0x0040
+#define WVR_ALIGNRIGHT 0x0080
+#define WVR_HREDRAW 0x0100
+#define WVR_VREDRAW 0x0200
+#define WVR_REDRAW (WVR_HREDRAW | WVR_VREDRAW)
+#define WVR_VALIDRECTS 0x0400
+
+
+/* WM_NCCALCSIZE parameter structure */
+typedef struct tagNCCALCSIZE_PARAMS
+{
+ RECT rgrc[3];
+ WINDOWPOS FAR* lppos;
+} NCCALCSIZE_PARAMS;
+#else /* WINVER >= 0x030a */
+typedef struct tagNCCALCSIZE_PARAMS
+{
+ RECT rgrc[2];
+} NCCALCSIZE_PARAMS;
+#endif /* WINVER >= 0x030a */
+typedef NCCALCSIZE_PARAMS FAR* LPNCCALCSIZE_PARAMS;
+
+#define WM_NCHITTEST 0x0084
+
+/* WM_NCHITTEST return codes */
+#define HTERROR (-2)
+#define HTTRANSPARENT (-1)
+#define HTNOWHERE 0
+#define HTCLIENT 1
+#define HTCAPTION 2
+#define HTSYSMENU 3
+#define HTSIZE 4
+#define HTMENU 5
+#define HTHSCROLL 6
+#define HTVSCROLL 7
+#define HTMINBUTTON 8
+#define HTMAXBUTTON 9
+#define HTLEFT 10
+#define HTRIGHT 11
+#define HTTOP 12
+#define HTTOPLEFT 13
+#define HTTOPRIGHT 14
+#define HTBOTTOM 15
+#define HTBOTTOMLEFT 16
+#define HTBOTTOMRIGHT 17
+#define HTBORDER 18
+#define HTGROWBOX HTSIZE
+#define HTREDUCE HTMINBUTTON
+#define HTZOOM HTMAXBUTTON
+
+/****** Drag-and-drop support ***********************************************/
+
+#define WM_QUERYDRAGICON 0x0037
+#define WM_DROPFILES 0x0233
+
+/****** Window activation ***************************************************/
+
+HWND WINAPI SetActiveWindow(HWND);
+HWND WINAPI GetActiveWindow(void);
+
+HWND WINAPI GetLastActivePopup(HWND);
+
+/* WM_ACTIVATE state values */
+#define WA_INACTIVE 0
+#define WA_ACTIVE 1
+#define WA_CLICKACTIVE 2
+
+#define WM_ACTIVATE 0x0006
+#define WM_ACTIVATEAPP 0x001C
+#define WM_NCACTIVATE 0x0086
+
+/****** Keyboard input support **********************************************/
+
+HWND WINAPI SetFocus(HWND);
+HWND WINAPI GetFocus(void);
+
+int WINAPI GetKeyState(int);
+int WINAPI GetAsyncKeyState(int);
+
+void WINAPI GetKeyboardState(BYTE FAR* );
+void WINAPI SetKeyboardState(BYTE FAR* );
+
+#define WM_SETFOCUS 0x0007
+#define WM_KILLFOCUS 0x0008
+
+#define WM_KEYDOWN 0x0100
+#define WM_KEYUP 0x0101
+
+#define WM_CHAR 0x0102
+#define WM_DEADCHAR 0x0103
+
+#define WM_SYSKEYDOWN 0x0104
+#define WM_SYSKEYUP 0x0105
+
+#define WM_SYSCHAR 0x0106
+#define WM_SYSDEADCHAR 0x0107
+
+
+/* Keyboard message range */
+#define WM_KEYFIRST 0x0100
+#define WM_KEYLAST 0x0108
+
+/* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags */
+#define KF_EXTENDED 0x0100
+#define KF_DLGMODE 0x0800
+#define KF_MENUMODE 0x1000
+#define KF_ALTDOWN 0x2000
+#define KF_REPEAT 0x4000
+#define KF_UP 0x8000
+
+/* Virtual key codes */
+#ifndef NOVIRTUALKEYCODES
+#define VK_LBUTTON 0x01
+#define VK_RBUTTON 0x02
+#define VK_CANCEL 0x03
+#define VK_MBUTTON 0x04
+#define VK_BACK 0x08
+#define VK_TAB 0x09
+#define VK_CLEAR 0x0C
+#define VK_RETURN 0x0D
+#define VK_SHIFT 0x10
+#define VK_CONTROL 0x11
+#define VK_MENU 0x12
+#define VK_PAUSE 0x13
+#define VK_CAPITAL 0x14
+#define VK_ESCAPE 0x1B
+#define VK_SPACE 0x20
+#define VK_PRIOR 0x21
+#define VK_NEXT 0x22
+#define VK_END 0x23
+#define VK_HOME 0x24
+#define VK_LEFT 0x25
+#define VK_UP 0x26
+#define VK_RIGHT 0x27
+#define VK_DOWN 0x28
+#define VK_SELECT 0x29
+#define VK_PRINT 0x2A
+#define VK_EXECUTE 0x2B
+#define VK_SNAPSHOT 0x2C
+#define VK_INSERT 0x2D
+#define VK_DELETE 0x2E
+#define VK_HELP 0x2F
+#define VK_NUMPAD0 0x60
+#define VK_NUMPAD1 0x61
+#define VK_NUMPAD2 0x62
+#define VK_NUMPAD3 0x63
+#define VK_NUMPAD4 0x64
+#define VK_NUMPAD5 0x65
+#define VK_NUMPAD6 0x66
+#define VK_NUMPAD7 0x67
+#define VK_NUMPAD8 0x68
+#define VK_NUMPAD9 0x69
+#define VK_MULTIPLY 0x6A
+#define VK_ADD 0x6B
+#define VK_SEPARATOR 0x6C
+#define VK_SUBTRACT 0x6D
+#define VK_DECIMAL 0x6E
+#define VK_DIVIDE 0x6F
+#define VK_F1 0x70
+#define VK_F2 0x71
+#define VK_F3 0x72
+#define VK_F4 0x73
+#define VK_F5 0x74
+#define VK_F6 0x75
+#define VK_F7 0x76
+#define VK_F8 0x77
+#define VK_F9 0x78
+#define VK_F10 0x79
+#define VK_F11 0x7A
+#define VK_F12 0x7B
+#define VK_F13 0x7C
+#define VK_F14 0x7D
+#define VK_F15 0x7E
+#define VK_F16 0x7F
+#define VK_F17 0x80
+#define VK_F18 0x81
+#define VK_F19 0x82
+#define VK_F20 0x83
+#define VK_F21 0x84
+#define VK_F22 0x85
+#define VK_F23 0x86
+#define VK_F24 0x87
+#define VK_NUMLOCK 0x90
+#define VK_SCROLL 0x91
+
+/* VK_A thru VK_Z are the same as their ASCII equivalents: 'A' thru 'Z' */
+/* VK_0 thru VK_9 are the same as their ASCII equivalents: '0' thru '0' */
+
+#endif /* NOVIRTUALKEYCODES */
+
+
+/* SetWindowsHook() keyboard hook */
+#define WH_KEYBOARD 2
+
+/****** Mouse input support *************************************************/
+
+HWND WINAPI SetCapture(HWND);
+void WINAPI ReleaseCapture(void);
+HWND WINAPI GetCapture(void);
+
+BOOL WINAPI SwapMouseButton(BOOL);
+
+/* Mouse input messages */
+#define WM_MOUSEMOVE 0x0200
+#define WM_LBUTTONDOWN 0x0201
+#define WM_LBUTTONUP 0x0202
+#define WM_LBUTTONDBLCLK 0x0203
+#define WM_RBUTTONDOWN 0x0204
+#define WM_RBUTTONUP 0x0205
+#define WM_RBUTTONDBLCLK 0x0206
+#define WM_MBUTTONDOWN 0x0207
+#define WM_MBUTTONUP 0x0208
+#define WM_MBUTTONDBLCLK 0x0209
+
+/* Mouse input message range */
+#define WM_MOUSEFIRST 0x0200
+#define WM_MOUSELAST 0x0209
+
+/* Mouse message wParam key states */
+#ifndef NOKEYSTATES
+#define MK_LBUTTON 0x0001
+#define MK_RBUTTON 0x0002
+#define MK_SHIFT 0x0004
+#define MK_CONTROL 0x0008
+#define MK_MBUTTON 0x0010
+#endif /* NOKEYSTATES */
+
+/* Non-client mouse messages */
+#define WM_NCMOUSEMOVE 0x00A0
+#define WM_NCLBUTTONDOWN 0x00A1
+#define WM_NCLBUTTONUP 0x00A2
+#define WM_NCLBUTTONDBLCLK 0x00A3
+#define WM_NCRBUTTONDOWN 0x00A4
+#define WM_NCRBUTTONUP 0x00A5
+#define WM_NCRBUTTONDBLCLK 0x00A6
+#define WM_NCMBUTTONDOWN 0x00A7
+#define WM_NCMBUTTONUP 0x00A8
+#define WM_NCMBUTTONDBLCLK 0x00A9
+
+/* Mouse click activation support */
+#define WM_MOUSEACTIVATE 0x0021
+
+/* WM_MOUSEACTIVATE return codes */
+#define MA_ACTIVATE 1
+#define MA_ACTIVATEANDEAT 2
+#define MA_NOACTIVATE 3
+#if (WINVER >= 0x030a)
+#define MA_NOACTIVATEANDEAT 4
+#endif /* WINVER >= 0x030a */
+
+/* SetWindowsHook() mouse hook */
+#ifndef NOWH
+#define WH_MOUSE 7
+
+typedef struct tagMOUSEHOOKSTRUCT
+{
+ POINT pt;
+ HWND hwnd;
+ UINT wHitTestCode;
+ DWORD dwExtraInfo;
+} MOUSEHOOKSTRUCT;
+typedef MOUSEHOOKSTRUCT FAR* LPMOUSEHOOKSTRUCT;
+#endif /* NOWH */
+
+/****** Mode control ********************************************************/
+
+#define WM_CANCELMODE 0x001F
+
+/****** System modal window support *****************************************/
+
+HWND WINAPI GetSysModalWindow(void);
+HWND WINAPI SetSysModalWindow(HWND);
+
+/****** Timer support *******************************************************/
+
+#ifdef STRICT
+typedef void (CALLBACK* TIMERPROC)(HWND, UINT, UINT, DWORD);
+#else
+typedef FARPROC TIMERPROC;
+#endif
+
+UINT WINAPI SetTimer(HWND, UINT, UINT, TIMERPROC);
+
+BOOL WINAPI KillTimer(HWND, UINT);
+
+#define WM_TIMER 0x0113
+
+/****** Accelerator support *************************************************/
+
+DECLARE_HANDLE(HACCEL);
+
+HACCEL WINAPI LoadAccelerators(HINSTANCE, LPCSTR);
+
+#ifndef NOMSG
+int WINAPI TranslateAccelerator(HWND, HACCEL, MSG FAR*);
+#endif
+
+/****** Menu support ********************************************************/
+
+#ifndef NOMENUS
+
+/* Menu template header */
+typedef struct
+{
+ UINT versionNumber;
+ UINT offset;
+} MENUITEMTEMPLATEHEADER;
+
+/* Menu template item struct */
+typedef struct
+{
+ UINT mtOption;
+ UINT mtID;
+ char mtString[1];
+} MENUITEMTEMPLATE;
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI IsMenu(HMENU);
+#endif /* WINVER >= 0x030a */
+
+HMENU WINAPI CreateMenu(void);
+HMENU WINAPI CreatePopupMenu(void);
+HMENU WINAPI LoadMenu(HINSTANCE, LPCSTR);
+HMENU WINAPI LoadMenuIndirect(const void FAR*);
+
+BOOL WINAPI DestroyMenu(HMENU);
+
+HMENU WINAPI GetMenu(HWND);
+BOOL WINAPI SetMenu(HWND, HMENU);
+
+HMENU WINAPI GetSystemMenu(HWND, BOOL);
+
+void WINAPI DrawMenuBar(HWND);
+
+BOOL WINAPI HiliteMenuItem(HWND, HMENU, UINT, UINT);
+
+BOOL WINAPI InsertMenu(HMENU, UINT, UINT, UINT, LPCSTR);
+BOOL WINAPI AppendMenu(HMENU, UINT, UINT, LPCSTR);
+BOOL WINAPI ModifyMenu(HMENU, UINT, UINT, UINT, LPCSTR);
+BOOL WINAPI RemoveMenu(HMENU, UINT, UINT);
+BOOL WINAPI DeleteMenu(HMENU, UINT, UINT);
+
+BOOL WINAPI ChangeMenu(HMENU, UINT, LPCSTR, UINT, UINT);
+
+#define MF_INSERT 0x0000
+#define MF_CHANGE 0x0080
+#define MF_APPEND 0x0100
+#define MF_DELETE 0x0200
+#define MF_REMOVE 0x1000
+
+/* Menu flags for Add/Check/EnableMenuItem() */
+#define MF_BYCOMMAND 0x0000
+#define MF_BYPOSITION 0x0400
+
+#define MF_SEPARATOR 0x0800
+
+#define MF_ENABLED 0x0000
+#define MF_GRAYED 0x0001
+#define MF_DISABLED 0x0002
+
+#define MF_UNCHECKED 0x0000
+#define MF_CHECKED 0x0008
+#define MF_USECHECKBITMAPS 0x0200
+
+#define MF_STRING 0x0000
+#define MF_BITMAP 0x0004
+#define MF_OWNERDRAW 0x0100
+
+#define MF_POPUP 0x0010
+#define MF_MENUBARBREAK 0x0020
+#define MF_MENUBREAK 0x0040
+
+#define MF_UNHILITE 0x0000
+#define MF_HILITE 0x0080
+
+#define MF_SYSMENU 0x2000
+#define MF_HELP 0x4000
+#define MF_MOUSESELECT 0x8000
+
+
+#define MF_END 0x0080 /* Only valid in menu resource templates */
+
+BOOL WINAPI EnableMenuItem(HMENU, UINT, UINT);
+BOOL WINAPI CheckMenuItem(HMENU, UINT, UINT);
+
+HMENU WINAPI GetSubMenu(HMENU, int);
+
+int WINAPI GetMenuItemCount(HMENU);
+UINT WINAPI GetMenuItemID(HMENU, int);
+
+int WINAPI GetMenuString(HMENU, UINT, LPSTR, int, UINT);
+UINT WINAPI GetMenuState(HMENU, UINT, UINT);
+
+BOOL WINAPI SetMenuItemBitmaps(HMENU, UINT, UINT, HBITMAP, HBITMAP);
+DWORD WINAPI GetMenuCheckMarkDimensions(void);
+
+BOOL WINAPI TrackPopupMenu(HMENU, UINT, int, int, int, HWND, const RECT FAR*);
+
+/* Flags for TrackPopupMenu */
+#define TPM_LEFTBUTTON 0x0000
+#if (WINVER >= 0x030a)
+#define TPM_RIGHTBUTTON 0x0002
+#define TPM_LEFTALIGN 0x0000
+#define TPM_CENTERALIGN 0x0004
+#define TPM_RIGHTALIGN 0x0008
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOMENUS */
+
+/* Menu messages */
+#define WM_INITMENU 0x0116
+#define WM_INITMENUPOPUP 0x0117
+
+#ifndef NOMENUS
+
+#define WM_MENUSELECT 0x011F
+#define WM_MENUCHAR 0x0120
+
+#endif /* NOMENUS */
+
+/* Menu and control command messages */
+#define WM_COMMAND 0x0111
+
+/****** Scroll bar support **************************************************/
+
+#ifndef NOSCROLL
+
+#define WM_HSCROLL 0x0114
+#define WM_VSCROLL 0x0115
+
+/* WM_H/VSCROLL commands */
+#define SB_LINEUP 0
+#define SB_LINELEFT 0
+#define SB_LINEDOWN 1
+#define SB_LINERIGHT 1
+#define SB_PAGEUP 2
+#define SB_PAGELEFT 2
+#define SB_PAGEDOWN 3
+#define SB_PAGERIGHT 3
+#define SB_THUMBPOSITION 4
+#define SB_THUMBTRACK 5
+#define SB_TOP 6
+#define SB_LEFT 6
+#define SB_BOTTOM 7
+#define SB_RIGHT 7
+#define SB_ENDSCROLL 8
+
+/* Scroll bar selection constants */
+#define SB_HORZ 0
+#define SB_VERT 1
+#define SB_CTL 2
+#define SB_BOTH 3
+
+int WINAPI SetScrollPos(HWND, int, int, BOOL);
+int WINAPI GetScrollPos(HWND, int);
+void WINAPI SetScrollRange(HWND, int, int, int, BOOL);
+void WINAPI GetScrollRange(HWND, int, int FAR*, int FAR*);
+void WINAPI ShowScrollBar(HWND, int, BOOL);
+BOOL WINAPI EnableScrollBar(HWND, int, UINT);
+
+/* EnableScrollBar() flags */
+#define ESB_ENABLE_BOTH 0x0000
+#define ESB_DISABLE_BOTH 0x0003
+
+#define ESB_DISABLE_LEFT 0x0001
+#define ESB_DISABLE_RIGHT 0x0002
+
+#define ESB_DISABLE_UP 0x0001
+#define ESB_DISABLE_DOWN 0x0002
+
+#define ESB_DISABLE_LTUP ESB_DISABLE_LEFT
+#define ESB_DISABLE_RTDN ESB_DISABLE_RIGHT
+
+#endif /* NOSCROLL */
+
+/******* Clipboard manager **************************************************/
+
+#ifndef NOCLIPBOARD
+
+/* Predefined Clipboard Formats */
+#define CF_TEXT 1
+#define CF_BITMAP 2
+#define CF_METAFILEPICT 3
+#define CF_SYLK 4
+#define CF_DIF 5
+#define CF_TIFF 6
+#define CF_OEMTEXT 7
+#define CF_DIB 8
+#define CF_PALETTE 9
+#define CF_PENDATA 10
+#define CF_RIFF 11
+#define CF_WAVE 12
+
+#define CF_OWNERDISPLAY 0x0080
+#define CF_DSPTEXT 0x0081
+#define CF_DSPBITMAP 0x0082
+#define CF_DSPMETAFILEPICT 0x0083
+
+/* "Private" formats don't get GlobalFree()'d */
+#define CF_PRIVATEFIRST 0x0200
+#define CF_PRIVATELAST 0x02FF
+
+/* "GDIOBJ" formats do get DeleteObject()'d */
+#define CF_GDIOBJFIRST 0x0300
+#define CF_GDIOBJLAST 0x03FF
+
+/* Clipboard Manager Functions */
+BOOL WINAPI OpenClipboard(HWND);
+BOOL WINAPI CloseClipboard(void);
+BOOL WINAPI EmptyClipboard(void);
+
+#if (WINVER >= 0x030a)
+HWND WINAPI GetOpenClipboardWindow(void);
+#endif /* WINVER >= 0x030a */
+
+HWND WINAPI GetClipboardOwner(void);
+
+HWND WINAPI SetClipboardViewer(HWND);
+HWND WINAPI GetClipboardViewer(void);
+
+HANDLE WINAPI SetClipboardData(UINT, HANDLE);
+HANDLE WINAPI GetClipboardData(UINT);
+
+BOOL WINAPI IsClipboardFormatAvailable(UINT);
+int WINAPI GetPriorityClipboardFormat(UINT FAR*, int);
+
+UINT WINAPI RegisterClipboardFormat(LPCSTR);
+int WINAPI CountClipboardFormats(void);
+UINT WINAPI EnumClipboardFormats(UINT);
+int WINAPI GetClipboardFormatName(UINT, LPSTR, int);
+
+BOOL WINAPI ChangeClipboardChain(HWND, HWND);
+
+/* Clipboard command messages */
+#define WM_CUT 0x0300
+#define WM_COPY 0x0301
+#define WM_PASTE 0x0302
+#define WM_CLEAR 0x0303
+#define WM_UNDO 0x0304
+
+/* Clipboard owner messages */
+#define WM_RENDERFORMAT 0x0305
+#define WM_RENDERALLFORMATS 0x0306
+#define WM_DESTROYCLIPBOARD 0x0307
+
+/* Clipboard viewer messages */
+#define WM_DRAWCLIPBOARD 0x0308
+#define WM_PAINTCLIPBOARD 0x0309
+#define WM_SIZECLIPBOARD 0x030B
+#define WM_VSCROLLCLIPBOARD 0x030A
+#define WM_HSCROLLCLIPBOARD 0x030E
+#define WM_ASKCBFORMATNAME 0x030C
+#define WM_CHANGECBCHAIN 0x030D
+
+#endif /* NOCLIPBOARD */
+
+/****** Mouse cursor support *************************************************/
+
+HCURSOR WINAPI LoadCursor(HINSTANCE, LPCSTR);
+HCURSOR WINAPI CreateCursor(HINSTANCE, int, int, int, int, const void FAR*, const void FAR*);
+BOOL WINAPI DestroyCursor(HCURSOR);
+
+#if (WINVER >= 0x030a)
+HCURSOR WINAPI CopyCursor(HINSTANCE, HCURSOR);
+#endif /* WINVER >= 0x030a */
+
+int WINAPI ShowCursor(BOOL);
+
+void WINAPI SetCursorPos(int, int);
+void WINAPI GetCursorPos(POINT FAR*);
+
+HCURSOR WINAPI SetCursor(HCURSOR);
+
+#if (WINVER >= 0x030a)
+HCURSOR WINAPI GetCursor(void);
+#endif /* WINVER >= 0x030a */
+
+void WINAPI ClipCursor(const RECT FAR*);
+#if (WINVER >= 0x030a)
+void WINAPI GetClipCursor(RECT FAR*);
+#endif /* WINVER >= 0x030a */
+
+/* Standard cursor resource IDs */
+#define IDC_ARROW MAKEINTRESOURCE(32512)
+#define IDC_IBEAM MAKEINTRESOURCE(32513)
+#define IDC_WAIT MAKEINTRESOURCE(32514)
+#define IDC_CROSS MAKEINTRESOURCE(32515)
+#define IDC_UPARROW MAKEINTRESOURCE(32516)
+#define IDC_SIZE MAKEINTRESOURCE(32640)
+#define IDC_ICON MAKEINTRESOURCE(32641)
+#define IDC_SIZENWSE MAKEINTRESOURCE(32642)
+#define IDC_SIZENESW MAKEINTRESOURCE(32643)
+#define IDC_SIZEWE MAKEINTRESOURCE(32644)
+#define IDC_SIZENS MAKEINTRESOURCE(32645)
+
+#define WM_SETCURSOR 0x0020
+
+/****** Icon support *********************************************************/
+
+HICON WINAPI LoadIcon(HINSTANCE, LPCSTR);
+HICON WINAPI CreateIcon(HINSTANCE, int, int, BYTE, BYTE, const void FAR*, const void FAR*);
+BOOL WINAPI DestroyIcon(HICON);
+
+#if (WINVER >= 0x030a)
+HICON WINAPI CopyIcon(HINSTANCE, HICON);
+#endif /* WINVER >= 0x030a */
+
+BOOL WINAPI DrawIcon(HDC, int, int, HICON);
+
+#ifndef NOICONS
+
+/* Standard icon resource IDs */
+#define IDI_APPLICATION MAKEINTRESOURCE(32512)
+#define IDI_HAND MAKEINTRESOURCE(32513)
+#define IDI_QUESTION MAKEINTRESOURCE(32514)
+#define IDI_EXCLAMATION MAKEINTRESOURCE(32515)
+#define IDI_ASTERISK MAKEINTRESOURCE(32516)
+
+#endif /* NOICONS */
+
+/****** Message Box support *************************************************/
+
+#ifndef NOMB
+
+int WINAPI MessageBox(HWND, LPCSTR, LPCSTR, UINT);
+void WINAPI MessageBeep(UINT);
+
+#define MB_OK 0x0000
+#define MB_OKCANCEL 0x0001
+#define MB_ABORTRETRYIGNORE 0x0002
+#define MB_YESNOCANCEL 0x0003
+#define MB_YESNO 0x0004
+#define MB_RETRYCANCEL 0x0005
+#define MB_TYPEMASK 0x000F
+
+#define MB_ICONHAND 0x0010
+#define MB_ICONQUESTION 0x0020
+#define MB_ICONEXCLAMATION 0x0030
+#define MB_ICONASTERISK 0x0040
+#define MB_ICONMASK 0x00F0
+
+#define MB_ICONINFORMATION MB_ICONASTERISK
+#define MB_ICONSTOP MB_ICONHAND
+
+#define MB_DEFBUTTON1 0x0000
+#define MB_DEFBUTTON2 0x0100
+#define MB_DEFBUTTON3 0x0200
+#define MB_DEFMASK 0x0F00
+
+#define MB_APPLMODAL 0x0000
+#define MB_SYSTEMMODAL 0x1000
+#define MB_TASKMODAL 0x2000
+
+#define MB_NOFOCUS 0x8000
+
+
+
+#endif /* NOMB */
+
+/****** Caret support ********************************************************/
+
+void WINAPI CreateCaret(HWND, HBITMAP, int, int);
+void WINAPI DestroyCaret(void);
+
+void WINAPI SetCaretPos(int, int);
+void WINAPI GetCaretPos(POINT FAR*);
+
+void WINAPI HideCaret(HWND);
+void WINAPI ShowCaret(HWND);
+
+UINT WINAPI GetCaretBlinkTime(void);
+void WINAPI SetCaretBlinkTime(UINT);
+
+/****** WM_SYSCOMMAND support ***********************************************/
+
+#define WM_SYSCOMMAND 0x0112
+
+#ifndef NOSYSCOMMANDS
+
+/* System Menu Command Values */
+#define SC_SIZE 0xF000
+#define SC_MOVE 0xF010
+#define SC_MINIMIZE 0xF020
+#define SC_MAXIMIZE 0xF030
+#define SC_NEXTWINDOW 0xF040
+#define SC_PREVWINDOW 0xF050
+#define SC_CLOSE 0xF060
+#define SC_VSCROLL 0xF070
+#define SC_HSCROLL 0xF080
+#define SC_MOUSEMENU 0xF090
+#define SC_KEYMENU 0xF100
+#define SC_ARRANGE 0xF110
+#define SC_RESTORE 0xF120
+#define SC_TASKLIST 0xF130
+#define SC_SCREENSAVE 0xF140
+#define SC_HOTKEY 0xF150
+
+/* Obsolete names */
+#define SC_ICON SC_MINIMIZE
+#define SC_ZOOM SC_MAXIMIZE
+
+
+#endif /* NOSYSCOMMANDS */
+
+/****** MDI Support *********************************************************/
+
+#ifndef NOMDI
+
+/* CreateWindow lpParams structure for creating MDI client */
+typedef struct tagCLIENTCREATESTRUCT
+{
+ HMENU hWindowMenu;
+ UINT idFirstChild;
+} CLIENTCREATESTRUCT;
+typedef CLIENTCREATESTRUCT FAR* LPCLIENTCREATESTRUCT;
+
+/* MDI client style bits */
+#if (WINVER >= 0x030a)
+#define MDIS_ALLCHILDSTYLES 0x0001
+#endif /* WINVER >= 0x030a */
+
+/* MDI messages */
+#define WM_MDICREATE 0x0220
+#define WM_MDIDESTROY 0x0221
+#define WM_MDIACTIVATE 0x0222
+#define WM_MDIRESTORE 0x0223
+#define WM_MDINEXT 0x0224
+#define WM_MDIMAXIMIZE 0x0225
+#define WM_MDITILE 0x0226
+#define WM_MDICASCADE 0x0227
+#define WM_MDIICONARRANGE 0x0228
+#define WM_MDIGETACTIVE 0x0229
+#define WM_MDISETMENU 0x0230
+
+/* WM_MDICREATE message structure */
+typedef struct tagMDICREATESTRUCT
+{
+ LPCSTR szClass;
+ LPCSTR szTitle;
+ HINSTANCE hOwner;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ DWORD style;
+ LPARAM lParam;
+} MDICREATESTRUCT;
+typedef MDICREATESTRUCT FAR* LPMDICREATESTRUCT;
+
+#if (WINVER >= 0x030a)
+/* wParam values for WM_MDITILE and WM_MDICASCADE messages. */
+#define MDITILE_VERTICAL 0x0000
+#define MDITILE_HORIZONTAL 0x0001
+#define MDITILE_SKIPDISABLED 0x0002
+#endif /* WINVER >= 0x030a */
+
+#define WM_CHILDACTIVATE 0x0022
+
+LRESULT WINAPI DefFrameProc(HWND, HWND, UINT, WPARAM, LPARAM);
+LRESULT WINAPI DefMDIChildProc(HWND, UINT, WPARAM, LPARAM);
+
+#ifndef NOMSG
+BOOL WINAPI TranslateMDISysAccel(HWND, MSG FAR*);
+#endif
+
+UINT WINAPI ArrangeIconicWindows(HWND);
+
+#endif /* NOMDI */
+
+/****** Dialog and Control Management ***************************************/
+
+#ifndef NOCTLMGR
+
+/* Dialog window class */
+#define WC_DIALOG (MAKEINTATOM(0x8002))
+
+/* cbWndExtra bytes needed by dialog manager for dialog classes */
+#define DLGWINDOWEXTRA 30
+
+/* Dialog styles */
+#define DS_ABSALIGN 0x01L
+#define DS_SYSMODAL 0x02L
+#define DS_LOCALEDIT 0x20L
+#define DS_SETFONT 0x40L
+#define DS_MODALFRAME 0x80L
+#define DS_NOIDLEMSG 0x100L
+
+/* Dialog messages */
+#define DM_GETDEFID (WM_USER+0)
+#define DM_SETDEFID (WM_USER+1)
+
+/* Returned in HIWORD() of DM_GETDEFID result if msg is supported */
+#define DC_HASDEFID 0x534B
+
+#endif /* NOCTLMGR */
+
+/* Dialog notification messages */
+#define WM_INITDIALOG 0x0110
+#define WM_NEXTDLGCTL 0x0028
+
+#define WM_PARENTNOTIFY 0x0210
+
+#define WM_ENTERIDLE 0x0121
+
+
+#ifndef NOCTLMGR
+
+#ifdef STRICT
+typedef BOOL (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
+#else
+typedef FARPROC DLGPROC;
+#endif
+
+/* Get/SetWindowWord/Long offsets for use with WC_DIALOG windows */
+#define DWL_MSGRESULT 0
+#define DWL_DLGPROC 4
+#define DWL_USER 8
+
+#ifndef NOMSG
+BOOL WINAPI IsDialogMessage(HWND, MSG FAR*);
+#endif
+
+LRESULT WINAPI DefDlgProc(HWND, UINT, WPARAM, LPARAM);
+
+HWND WINAPI CreateDialog(HINSTANCE, LPCSTR, HWND, DLGPROC);
+HWND WINAPI CreateDialogIndirect(HINSTANCE, const void FAR*, HWND, DLGPROC);
+HWND WINAPI CreateDialogParam(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM);
+HWND WINAPI CreateDialogIndirectParam(HINSTANCE, const void FAR*, HWND, DLGPROC, LPARAM);
+
+int WINAPI DialogBox(HINSTANCE, LPCSTR, HWND, DLGPROC);
+int WINAPI DialogBoxIndirect(HINSTANCE, HGLOBAL, HWND, DLGPROC);
+int WINAPI DialogBoxParam(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM);
+int WINAPI DialogBoxIndirectParam(HINSTANCE, HGLOBAL, HWND, DLGPROC, LPARAM);
+
+void WINAPI EndDialog(HWND, int);
+
+int WINAPI GetDlgCtrlID(HWND);
+HWND WINAPI GetDlgItem(HWND, int);
+LRESULT WINAPI SendDlgItemMessage(HWND, int, UINT, WPARAM, LPARAM);
+
+void WINAPI SetDlgItemInt(HWND, int, UINT, BOOL);
+UINT WINAPI GetDlgItemInt(HWND, int, BOOL FAR* , BOOL);
+
+void WINAPI SetDlgItemText(HWND, int, LPCSTR);
+int WINAPI GetDlgItemText(HWND, int, LPSTR, int);
+
+void WINAPI CheckDlgButton(HWND, int, UINT);
+void WINAPI CheckRadioButton(HWND, int, int, int);
+UINT WINAPI IsDlgButtonChecked(HWND, int);
+
+HWND WINAPI GetNextDlgGroupItem(HWND, HWND, BOOL);
+HWND WINAPI GetNextDlgTabItem(HWND, HWND, BOOL);
+
+void WINAPI MapDialogRect(HWND, RECT FAR*);
+DWORD WINAPI GetDialogBaseUnits(void);
+
+#define WM_GETDLGCODE 0x0087
+
+/* dialog codes */
+#define DLGC_WANTARROWS 0x0001
+#define DLGC_WANTTAB 0x0002
+#define DLGC_WANTALLKEYS 0x0004
+#define DLGC_WANTMESSAGE 0x0004
+#define DLGC_HASSETSEL 0x0008
+#define DLGC_DEFPUSHBUTTON 0x0010
+#define DLGC_UNDEFPUSHBUTTON 0x0020
+#define DLGC_RADIOBUTTON 0x0040
+#define DLGC_WANTCHARS 0x0080
+#define DLGC_STATIC 0x0100
+#define DLGC_BUTTON 0x2000
+
+#define WM_CTLCOLOR 0x0019
+
+/* WM_CTLCOLOR control IDs */
+#define CTLCOLOR_MSGBOX 0
+#define CTLCOLOR_EDIT 1
+#define CTLCOLOR_LISTBOX 2
+#define CTLCOLOR_BTN 3
+#define CTLCOLOR_DLG 4
+#define CTLCOLOR_SCROLLBAR 5
+#define CTLCOLOR_STATIC 6
+
+#define WM_SETFONT 0x0030
+#define WM_GETFONT 0x0031
+
+#endif /* NOCTLMGR */
+
+/* Standard dialog button IDs */
+#define IDOK 1
+#define IDCANCEL 2
+#define IDABORT 3
+#define IDRETRY 4
+#define IDIGNORE 5
+#define IDYES 6
+#define IDNO 7
+
+/****** Owner draw control support ******************************************/
+
+/* Owner draw control types */
+#define ODT_MENU 1
+#define ODT_LISTBOX 2
+#define ODT_COMBOBOX 3
+#define ODT_BUTTON 4
+
+/* Owner draw actions */
+#define ODA_DRAWENTIRE 0x0001
+#define ODA_SELECT 0x0002
+#define ODA_FOCUS 0x0004
+
+/* Owner draw state */
+#define ODS_SELECTED 0x0001
+#define ODS_GRAYED 0x0002
+#define ODS_DISABLED 0x0004
+#define ODS_CHECKED 0x0008
+#define ODS_FOCUS 0x0010
+
+#define WM_DRAWITEM 0x002B
+
+typedef struct tagDRAWITEMSTRUCT
+{
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ UINT itemAction;
+ UINT itemState;
+ HWND hwndItem;
+ HDC hDC;
+ RECT rcItem;
+ DWORD itemData;
+} DRAWITEMSTRUCT;
+typedef DRAWITEMSTRUCT NEAR* PDRAWITEMSTRUCT;
+typedef DRAWITEMSTRUCT FAR* LPDRAWITEMSTRUCT;
+
+#define WM_MEASUREITEM 0x002C
+
+typedef struct tagMEASUREITEMSTRUCT
+{
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ UINT itemWidth;
+ UINT itemHeight;
+ DWORD itemData;
+} MEASUREITEMSTRUCT;
+typedef MEASUREITEMSTRUCT NEAR* PMEASUREITEMSTRUCT;
+typedef MEASUREITEMSTRUCT FAR* LPMEASUREITEMSTRUCT;
+
+#define WM_DELETEITEM 0x002D
+
+typedef struct tagDELETEITEMSTRUCT
+{
+ UINT CtlType;
+ UINT CtlID;
+ UINT itemID;
+ HWND hwndItem;
+ DWORD itemData;
+} DELETEITEMSTRUCT;
+typedef DELETEITEMSTRUCT NEAR* PDELETEITEMSTRUCT;
+typedef DELETEITEMSTRUCT FAR* LPDELETEITEMSTRUCT;
+
+#define WM_COMPAREITEM 0x0039
+
+typedef struct tagCOMPAREITEMSTRUCT
+{
+ UINT CtlType;
+ UINT CtlID;
+ HWND hwndItem;
+ UINT itemID1;
+ DWORD itemData1;
+ UINT itemID2;
+ DWORD itemData2;
+} COMPAREITEMSTRUCT;
+typedef COMPAREITEMSTRUCT NEAR* PCOMPAREITEMSTRUCT;
+typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT;
+
+/****** Static control ******************************************************/
+
+#ifndef NOCTLMGR
+
+/* Static Control Styles */
+#define SS_LEFT 0x00000000L
+#define SS_CENTER 0x00000001L
+#define SS_RIGHT 0x00000002L
+#define SS_ICON 0x00000003L
+#define SS_BLACKRECT 0x00000004L
+#define SS_GRAYRECT 0x00000005L
+#define SS_WHITERECT 0x00000006L
+#define SS_BLACKFRAME 0x00000007L
+#define SS_GRAYFRAME 0x00000008L
+#define SS_WHITEFRAME 0x00000009L
+#define SS_SIMPLE 0x0000000BL
+#define SS_LEFTNOWORDWRAP 0x0000000CL
+#define SS_NOPREFIX 0x00000080L
+
+#if (WINVER >= 0x030a)
+#ifndef NOWINMESSAGES
+/* Static Control Mesages */
+#define STM_SETICON (WM_USER+0)
+#define STM_GETICON (WM_USER+1)
+#endif /* NOWINMESSAGES */
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOCTLMGR */
+
+/****** Button control *****************************************************/
+
+#ifndef NOCTLMGR
+
+/* Button Control Styles */
+#define BS_PUSHBUTTON 0x00000000L
+#define BS_DEFPUSHBUTTON 0x00000001L
+#define BS_CHECKBOX 0x00000002L
+#define BS_AUTOCHECKBOX 0x00000003L
+#define BS_RADIOBUTTON 0x00000004L
+#define BS_3STATE 0x00000005L
+#define BS_AUTO3STATE 0x00000006L
+#define BS_GROUPBOX 0x00000007L
+#define BS_USERBUTTON 0x00000008L
+#define BS_AUTORADIOBUTTON 0x00000009L
+#define BS_OWNERDRAW 0x0000000BL
+#define BS_LEFTTEXT 0x00000020L
+
+/* Button Control Messages */
+#define BM_GETCHECK (WM_USER+0)
+#define BM_SETCHECK (WM_USER+1)
+#define BM_GETSTATE (WM_USER+2)
+#define BM_SETSTATE (WM_USER+3)
+#define BM_SETSTYLE (WM_USER+4)
+
+/* User Button Notification Codes */
+#define BN_CLICKED 0
+#define BN_PAINT 1
+#define BN_HILITE 2
+#define BN_UNHILITE 3
+#define BN_DISABLE 4
+#define BN_DOUBLECLICKED 5
+
+#endif /* NOCTLMGR */
+
+/****** Edit control *******************************************************/
+
+#ifndef NOCTLMGR
+
+/* Edit control styles */
+#ifndef NOWINSTYLES
+#define ES_LEFT 0x00000000L
+#define ES_CENTER 0x00000001L
+#define ES_RIGHT 0x00000002L
+#define ES_MULTILINE 0x00000004L
+#define ES_UPPERCASE 0x00000008L
+#define ES_LOWERCASE 0x00000010L
+#define ES_PASSWORD 0x00000020L
+#define ES_AUTOVSCROLL 0x00000040L
+#define ES_AUTOHSCROLL 0x00000080L
+#define ES_NOHIDESEL 0x00000100L
+#define ES_OEMCONVERT 0x00000400L
+#if (WINVER >= 0x030a)
+#define ES_READONLY 0x00000800L
+#define ES_WANTRETURN 0x00001000L
+#endif /* WINVER >= 0x030a */
+#endif /* NOWINSTYLES */
+
+/* Edit control messages */
+#ifndef NOWINMESSAGES
+#define EM_GETSEL (WM_USER+0)
+#define EM_SETSEL (WM_USER+1)
+#define EM_GETRECT (WM_USER+2)
+#define EM_SETRECT (WM_USER+3)
+#define EM_SETRECTNP (WM_USER+4)
+#define EM_LINESCROLL (WM_USER+6)
+#define EM_GETMODIFY (WM_USER+8)
+#define EM_SETMODIFY (WM_USER+9)
+#define EM_GETLINECOUNT (WM_USER+10)
+#define EM_LINEINDEX (WM_USER+11)
+#define EM_SETHANDLE (WM_USER+12)
+#define EM_GETHANDLE (WM_USER+13)
+#define EM_LINELENGTH (WM_USER+17)
+#define EM_REPLACESEL (WM_USER+18)
+#define EM_SETFONT (WM_USER+19) /* NOT IMPLEMENTED: use WM_SETFONT */
+#define EM_GETLINE (WM_USER+20)
+#define EM_LIMITTEXT (WM_USER+21)
+#define EM_CANUNDO (WM_USER+22)
+#define EM_UNDO (WM_USER+23)
+#define EM_FMTLINES (WM_USER+24)
+#define EM_LINEFROMCHAR (WM_USER+25)
+#define EM_SETWORDBREAK (WM_USER+26) /* NOT IMPLEMENTED: use EM_SETWORDBREAK */
+#define EM_SETTABSTOPS (WM_USER+27)
+#define EM_SETPASSWORDCHAR (WM_USER+28)
+#define EM_EMPTYUNDOBUFFER (WM_USER+29)
+#if (WINVER >= 0x030a)
+#define EM_GETFIRSTVISIBLELINE (WM_USER+30)
+#define EM_SETREADONLY (WM_USER+31)
+#define EM_SETWORDBREAKPROC (WM_USER+32)
+#define EM_GETWORDBREAKPROC (WM_USER+33)
+#define EM_GETPASSWORDCHAR (WM_USER+34)
+#endif /* WINVER >= 0x030a */
+#endif /* NOWINMESSAGES */
+
+#if (WINVER >= 0x030a)
+typedef int (CALLBACK* EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, int cch, int code);
+
+/* EDITWORDBREAKPROC code values */
+#define WB_LEFT 0
+#define WB_RIGHT 1
+#define WB_ISDELIMITER 2
+#endif /* WINVER >= 0x030a */
+
+/* Edit control notification codes */
+#define EN_SETFOCUS 0x0100
+#define EN_KILLFOCUS 0x0200
+#define EN_CHANGE 0x0300
+#define EN_UPDATE 0x0400
+#define EN_ERRSPACE 0x0500
+#define EN_MAXTEXT 0x0501
+#define EN_HSCROLL 0x0601
+#define EN_VSCROLL 0x0602
+
+#endif /* NOCTLMGR */
+
+/****** Scroll bar control *************************************************/
+/* Also see scrolling support */
+
+#ifndef NOCTLMGR
+
+#ifndef NOWINSTYLES
+
+/* Scroll bar styles */
+#define SBS_HORZ 0x0000L
+#define SBS_VERT 0x0001L
+#define SBS_TOPALIGN 0x0002L
+#define SBS_LEFTALIGN 0x0002L
+#define SBS_BOTTOMALIGN 0x0004L
+#define SBS_RIGHTALIGN 0x0004L
+#define SBS_SIZEBOXTOPLEFTALIGN 0x0002L
+#define SBS_SIZEBOXBOTTOMRIGHTALIGN 0x0004L
+#define SBS_SIZEBOX 0x0008L
+
+#endif /* NOWINSTYLES */
+
+#endif /* NOCTLMGR */
+
+/****** Listbox control ****************************************************/
+
+#ifndef NOCTLMGR
+
+/* Listbox styles */
+#ifndef NOWINSTYLES
+#define LBS_NOTIFY 0x0001L
+#define LBS_SORT 0x0002L
+#define LBS_NOREDRAW 0x0004L
+#define LBS_MULTIPLESEL 0x0008L
+#define LBS_OWNERDRAWFIXED 0x0010L
+#define LBS_OWNERDRAWVARIABLE 0x0020L
+#define LBS_HASSTRINGS 0x0040L
+#define LBS_USETABSTOPS 0x0080L
+#define LBS_NOINTEGRALHEIGHT 0x0100L
+#define LBS_MULTICOLUMN 0x0200L
+#define LBS_WANTKEYBOARDINPUT 0x0400L
+#define LBS_EXTENDEDSEL 0x0800L
+#if (WINVER >= 0x030a)
+#define LBS_DISABLENOSCROLL 0x1000L
+#endif /* WINVER >= 0x030a */
+#define LBS_STANDARD (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)
+#endif /* NOWINSTYLES */
+
+/* Listbox messages */
+#ifndef NOWINMESSAGES
+#define LB_ADDSTRING (WM_USER+1)
+#define LB_INSERTSTRING (WM_USER+2)
+#define LB_DELETESTRING (WM_USER+3)
+#define LB_RESETCONTENT (WM_USER+5)
+#define LB_SETSEL (WM_USER+6)
+#define LB_SETCURSEL (WM_USER+7)
+#define LB_GETSEL (WM_USER+8)
+#define LB_GETCURSEL (WM_USER+9)
+#define LB_GETTEXT (WM_USER+10)
+#define LB_GETTEXTLEN (WM_USER+11)
+#define LB_GETCOUNT (WM_USER+12)
+#define LB_SELECTSTRING (WM_USER+13)
+#define LB_DIR (WM_USER+14)
+#define LB_GETTOPINDEX (WM_USER+15)
+#define LB_FINDSTRING (WM_USER+16)
+#define LB_GETSELCOUNT (WM_USER+17)
+#define LB_GETSELITEMS (WM_USER+18)
+#define LB_SETTABSTOPS (WM_USER+19)
+#define LB_GETHORIZONTALEXTENT (WM_USER+20)
+#define LB_SETHORIZONTALEXTENT (WM_USER+21)
+#define LB_SETCOLUMNWIDTH (WM_USER+22)
+#define LB_SETTOPINDEX (WM_USER+24)
+#define LB_GETITEMRECT (WM_USER+25)
+#define LB_GETITEMDATA (WM_USER+26)
+#define LB_SETITEMDATA (WM_USER+27)
+#define LB_SELITEMRANGE (WM_USER+28)
+#define LB_SETCARETINDEX (WM_USER+31)
+#define LB_GETCARETINDEX (WM_USER+32)
+
+#if (WINVER >= 0x030a)
+#define LB_SETITEMHEIGHT (WM_USER+33)
+#define LB_GETITEMHEIGHT (WM_USER+34)
+#define LB_FINDSTRINGEXACT (WM_USER+35)
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOWINMESSAGES */
+
+/* Listbox notification codes */
+#define LBN_ERRSPACE (-2)
+#define LBN_SELCHANGE 1
+#define LBN_DBLCLK 2
+#define LBN_SELCANCEL 3
+#define LBN_SETFOCUS 4
+#define LBN_KILLFOCUS 5
+
+/* Listbox notification messages */
+#define WM_VKEYTOITEM 0x002E
+#define WM_CHARTOITEM 0x002F
+
+/* Listbox message return values */
+#define LB_OKAY 0
+#define LB_ERR (-1)
+#define LB_ERRSPACE (-2)
+
+#define LB_CTLCODE 0L
+
+/****** Dialog directory support ********************************************/
+
+int WINAPI DlgDirList(HWND, LPSTR, int, int, UINT);
+BOOL WINAPI DlgDirSelect(HWND, LPSTR, int);
+
+int WINAPI DlgDirListComboBox(HWND, LPSTR, int, int, UINT);
+BOOL WINAPI DlgDirSelectComboBox(HWND, LPSTR, int);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI DlgDirSelectEx(HWND, LPSTR, int, int);
+BOOL WINAPI DlgDirSelectComboBoxEx(HWND, LPSTR, int, int);
+#endif /* WINVER >= 0x030a */
+
+
+/* DlgDirList, DlgDirListComboBox flags values */
+#define DDL_READWRITE 0x0000
+#define DDL_READONLY 0x0001
+#define DDL_HIDDEN 0x0002
+#define DDL_SYSTEM 0x0004
+#define DDL_DIRECTORY 0x0010
+#define DDL_ARCHIVE 0x0020
+
+#define DDL_POSTMSGS 0x2000
+#define DDL_DRIVES 0x4000
+#define DDL_EXCLUSIVE 0x8000
+
+#endif /* NOCTLMGR */
+
+/****** Combo box control **************************************************/
+
+#ifndef NOCTLMGR
+
+/* Combo box styles */
+#ifndef NOWINSTYLES
+#define CBS_SIMPLE 0x0001L
+#define CBS_DROPDOWN 0x0002L
+#define CBS_DROPDOWNLIST 0x0003L
+#define CBS_OWNERDRAWFIXED 0x0010L
+#define CBS_OWNERDRAWVARIABLE 0x0020L
+#define CBS_AUTOHSCROLL 0x0040L
+#define CBS_OEMCONVERT 0x0080L
+#define CBS_SORT 0x0100L
+#define CBS_HASSTRINGS 0x0200L
+#define CBS_NOINTEGRALHEIGHT 0x0400L
+#if (WINVER >= 0x030a)
+#define CBS_DISABLENOSCROLL 0x0800L
+#endif /* WINVER >= 0x030a */
+#endif /* NOWINSTYLES */
+
+/* Combo box messages */
+#ifndef NOWINMESSAGES
+#define CB_GETEDITSEL (WM_USER+0)
+#define CB_LIMITTEXT (WM_USER+1)
+#define CB_SETEDITSEL (WM_USER+2)
+#define CB_ADDSTRING (WM_USER+3)
+#define CB_DELETESTRING (WM_USER+4)
+#define CB_DIR (WM_USER+5)
+#define CB_GETCOUNT (WM_USER+6)
+#define CB_GETCURSEL (WM_USER+7)
+#define CB_GETLBTEXT (WM_USER+8)
+#define CB_GETLBTEXTLEN (WM_USER+9)
+#define CB_INSERTSTRING (WM_USER+10)
+#define CB_RESETCONTENT (WM_USER+11)
+#define CB_FINDSTRING (WM_USER+12)
+#define CB_SELECTSTRING (WM_USER+13)
+#define CB_SETCURSEL (WM_USER+14)
+#define CB_SHOWDROPDOWN (WM_USER+15)
+#define CB_GETITEMDATA (WM_USER+16)
+#define CB_SETITEMDATA (WM_USER+17)
+#if (WINVER >= 0x030a)
+#define CB_GETDROPPEDCONTROLRECT (WM_USER+18)
+#define CB_SETITEMHEIGHT (WM_USER+19)
+#define CB_GETITEMHEIGHT (WM_USER+20)
+#define CB_SETEXTENDEDUI (WM_USER+21)
+#define CB_GETEXTENDEDUI (WM_USER+22)
+#define CB_GETDROPPEDSTATE (WM_USER+23)
+#define CB_FINDSTRINGEXACT (WM_USER+24)
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOWINMESSAGES */
+
+/* Combo box notification codes */
+#define CBN_ERRSPACE (-1)
+#define CBN_SELCHANGE 1
+#define CBN_DBLCLK 2
+#define CBN_SETFOCUS 3
+#define CBN_KILLFOCUS 4
+#define CBN_EDITCHANGE 5
+#define CBN_EDITUPDATE 6
+#define CBN_DROPDOWN 7
+#if (WINVER >= 0x030a)
+#define CBN_CLOSEUP 8
+#define CBN_SELENDOK 9
+#define CBN_SELENDCANCEL 10
+#endif /* WINVER >= 0x030a */
+
+/* Combo box message return values */
+#define CB_OKAY 0
+#define CB_ERR (-1)
+#define CB_ERRSPACE (-2)
+
+#endif /* NOCTLMGR */
+
+/******* Windows hook support **********************************************/
+
+#ifndef NOWH
+
+DECLARE_HANDLE32(HHOOK);
+
+#ifdef STRICT
+typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
+#else
+typedef FARPROC HOOKPROC;
+#endif
+
+#ifdef STRICT
+HHOOK WINAPI SetWindowsHook(int, HOOKPROC);
+LRESULT WINAPI DefHookProc(int, WPARAM, LPARAM, HHOOK FAR*);
+#else
+HOOKPROC WINAPI SetWindowsHook(int, HOOKPROC);
+LRESULT WINAPI DefHookProc(int, WPARAM, LPARAM, HOOKPROC FAR*);
+#endif
+BOOL WINAPI UnhookWindowsHook(int, HOOKPROC);
+
+#if (WINVER >= 0x030a)
+
+HHOOK WINAPI SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hInstance, HTASK hTask);
+BOOL WINAPI UnhookWindowsHookEx(HHOOK hHook);
+LRESULT WINAPI CallNextHookEx(HHOOK hHook, int code, WPARAM wParam, LPARAM lParam);
+
+#endif /* WINVER >= 0x030a */
+
+
+/* Standard hook code */
+#define HC_ACTION 0
+
+/* Obsolete hook codes (NO LONGER SUPPORTED) */
+#define HC_GETLPLPFN (-3)
+#define HC_LPLPFNNEXT (-2)
+#define HC_LPFNNEXT (-1)
+
+#endif /* NOWH */
+
+/****** Computer-based-training (CBT) support *******************************/
+
+#define WM_QUEUESYNC 0x0023
+
+#ifndef NOWH
+
+/* SetWindowsHook() code */
+#define WH_CBT 5
+
+#define HCBT_MOVESIZE 0
+#define HCBT_MINMAX 1
+#define HCBT_QS 2
+#define HCBT_CREATEWND 3
+#define HCBT_DESTROYWND 4
+#define HCBT_ACTIVATE 5
+#define HCBT_CLICKSKIPPED 6
+#define HCBT_KEYSKIPPED 7
+#define HCBT_SYSCOMMAND 8
+#define HCBT_SETFOCUS 9
+
+#if (WINVER >= 0x030a)
+/* HCBT_CREATEWND parameters pointed to by lParam */
+typedef struct tagCBT_CREATEWND
+{
+ CREATESTRUCT FAR* lpcs;
+ HWND hwndInsertAfter;
+} CBT_CREATEWND;
+typedef CBT_CREATEWND FAR* LPCBT_CREATEWND;
+
+/* HCBT_ACTIVATE structure pointed to by lParam */
+typedef struct tagCBTACTIVATESTRUCT
+{
+ BOOL fMouse;
+ HWND hWndActive;
+} CBTACTIVATESTRUCT;
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOWH */
+
+/****** Hardware hook support ***********************************************/
+
+#ifndef NOWH
+#if (WINVER >= 0x030a)
+#define WH_HARDWARE 8
+
+typedef struct tagHARDWAREHOOKSTRUCT
+{
+ HWND hWnd;
+ UINT wMessage;
+ WPARAM wParam;
+ LPARAM lParam;
+} HARDWAREHOOKSTRUCT;
+#endif /* WINVER >= 0x030a */
+#endif /* NOWH */
+
+/****** Shell support *******************************************************/
+
+#ifndef NOWH
+#if (WINVER >= 0x030a)
+/* SetWindowsHook() Shell hook code */
+#define WH_SHELL 10
+
+#define HSHELL_WINDOWCREATED 1
+#define HSHELL_WINDOWDESTROYED 2
+#define HSHELL_ACTIVATESHELLWINDOW 3
+
+#endif /* WINVER >= 0x030a */
+#endif /* NOWH */
+
+/****** Journalling support *************************************************/
+
+#ifndef NOWH
+#define WH_JOURNALRECORD 0
+#define WH_JOURNALPLAYBACK 1
+
+/* Journalling hook codes */
+#define HC_GETNEXT 1
+#define HC_SKIP 2
+#define HC_NOREMOVE 3
+#define HC_NOREM HC_NOREMOVE
+#define HC_SYSMODALON 4
+#define HC_SYSMODALOFF 5
+
+/* Journalling message structure */
+typedef struct tagEVENTMSG
+{
+ UINT message;
+ UINT paramL;
+ UINT paramH;
+ DWORD time;
+} EVENTMSG;
+typedef EVENTMSG *PEVENTMSG;
+typedef EVENTMSG NEAR* NPEVENTMSG;
+typedef EVENTMSG FAR* LPEVENTMSG;
+
+BOOL WINAPI EnableHardwareInput(BOOL);
+
+#endif /* NOWH */
+
+
+/****** Debugger support ****************************************************/
+
+#if (WINVER >= 0x030a)
+/* SetWindowsHook debug hook support */
+#define WH_DEBUG 9
+
+typedef struct tagDEBUGHOOKINFO
+{
+ HMODULE hModuleHook;
+ LPARAM reserved;
+ LPARAM lParam;
+ WPARAM wParam;
+ int code;
+} DEBUGHOOKINFO;
+typedef DEBUGHOOKINFO FAR* LPDEBUGHOOKINFO;
+
+#ifndef NOMSG
+BOOL WINAPI QuerySendMessage(HANDLE h1, HANDLE h2, HANDLE h3, LPMSG lpmsg);
+#endif /* NOMSG */
+
+BOOL WINAPI LockInput(HANDLE h1, HWND hwndInput, BOOL fLock);
+
+LONG WINAPI GetSystemDebugState(void);
+/* Flags returned by GetSystemDebugState.
+ */
+#define SDS_MENU 0x0001
+#define SDS_SYSMODAL 0x0002
+#define SDS_NOTASKQUEUE 0x0004
+#define SDS_DIALOG 0x0008
+#define SDS_TASKLOCKED 0x0010
+#endif /* WINVER >= 0x030a */
+
+/****** Help support ********************************************************/
+
+#ifndef NOHELP
+
+BOOL WINAPI WinHelp(HWND hwndMain, LPCSTR lpszHelp, UINT usCommand, DWORD ulData);
+
+/* WinHelp() commands */
+#define HELP_CONTEXT 0x0001
+#define HELP_QUIT 0x0002
+#define HELP_INDEX 0x0003
+#define HELP_CONTENTS 0x0003
+#define HELP_HELPONHELP 0x0004
+#define HELP_SETINDEX 0x0005
+#define HELP_SETCONTENTS 0x0005
+#define HELP_CONTEXTPOPUP 0x0008
+#define HELP_FORCEFILE 0x0009
+#define HELP_KEY 0x0101
+#define HELP_COMMAND 0x0102
+#define HELP_PARTIALKEY 0x0105
+#define HELP_MULTIKEY 0x0201
+#define HELP_SETWINPOS 0x0203
+
+typedef struct tagMULTIKEYHELP
+{
+ UINT mkSize;
+ BYTE mkKeylist;
+ BYTE szKeyphrase[1];
+} MULTIKEYHELP;
+
+
+typedef struct
+{
+ int wStructSize;
+ int x;
+ int y;
+ int dx;
+ int dy;
+ int wMax;
+ char rgchMember[2];
+} HELPWININFO;
+typedef HELPWININFO NEAR* PHELPWININFO;
+typedef HELPWININFO FAR* LPHELPWININFO;
+
+#endif /* NOHELP */
+
+/****** Sound support ******************************************************/
+
+#ifndef NOSOUND
+
+int WINAPI OpenSound(void);
+void WINAPI CloseSound(void);
+
+int WINAPI StartSound(void);
+int WINAPI StopSound(void);
+
+int WINAPI SetVoiceQueueSize(int, int);
+int WINAPI SetVoiceNote(int, int, int, int);
+int WINAPI SetVoiceAccent(int, int, int, int, int);
+int WINAPI SetVoiceEnvelope(int, int, int);
+int WINAPI SetVoiceSound(int, DWORD, int);
+
+int WINAPI SetVoiceThreshold(int, int);
+int FAR* WINAPI GetThresholdEvent(void);
+int WINAPI GetThresholdStatus(void);
+
+int WINAPI SetSoundNoise(int, int);
+
+/* SetSoundNoise() Sources */
+#define S_PERIOD512 0
+#define S_PERIOD1024 1
+#define S_PERIOD2048 2
+#define S_PERIODVOICE 3
+#define S_WHITE512 4
+#define S_WHITE1024 5
+#define S_WHITE2048 6
+#define S_WHITEVOICE 7
+
+int WINAPI WaitSoundState(int);
+
+/* WaitSoundState() constants */
+#define S_QUEUEEMPTY 0
+#define S_THRESHOLD 1
+#define S_ALLTHRESHOLD 2
+
+int WINAPI SyncAllVoices(void);
+int WINAPI CountVoiceNotes(int);
+
+/* Accent Modes */
+#define S_NORMAL 0
+#define S_LEGATO 1
+#define S_STACCATO 2
+
+/* Error return values */
+#define S_SERDVNA (-1)
+#define S_SEROFM (-2)
+#define S_SERMACT (-3)
+#define S_SERQFUL (-4)
+#define S_SERBDNT (-5)
+#define S_SERDLN (-6)
+#define S_SERDCC (-7)
+#define S_SERDTP (-8)
+#define S_SERDVL (-9)
+#define S_SERDMD (-10)
+#define S_SERDSH (-11)
+#define S_SERDPT (-12)
+#define S_SERDFQ (-13)
+#define S_SERDDR (-14)
+#define S_SERDSR (-15)
+#define S_SERDST (-16)
+
+#endif /* NOSOUND */
+
+/****** Comm support ******************************************************/
+
+#ifndef NOCOMM
+
+#define NOPARITY 0
+#define ODDPARITY 1
+#define EVENPARITY 2
+#define MARKPARITY 3
+#define SPACEPARITY 4
+
+#define ONESTOPBIT 0
+#define ONE5STOPBITS 1
+#define TWOSTOPBITS 2
+
+#define IGNORE 0
+#define INFINITE 0xFFFF
+
+/* Error Flags */
+#define CE_RXOVER 0x0001
+#define CE_OVERRUN 0x0002
+#define CE_RXPARITY 0x0004
+#define CE_FRAME 0x0008
+#define CE_BREAK 0x0010
+#define CE_CTSTO 0x0020
+#define CE_DSRTO 0x0040
+#define CE_RLSDTO 0x0080
+#define CE_TXFULL 0x0100
+#define CE_PTO 0x0200
+#define CE_IOE 0x0400
+#define CE_DNS 0x0800
+#define CE_OOP 0x1000
+#define CE_MODE 0x8000
+
+#define IE_BADID (-1)
+#define IE_OPEN (-2)
+#define IE_NOPEN (-3)
+#define IE_MEMORY (-4)
+#define IE_DEFAULT (-5)
+#define IE_HARDWARE (-10)
+#define IE_BYTESIZE (-11)
+#define IE_BAUDRATE (-12)
+
+/* Events */
+#define EV_RXCHAR 0x0001
+#define EV_RXFLAG 0x0002
+#define EV_TXEMPTY 0x0004
+#define EV_CTS 0x0008
+#define EV_DSR 0x0010
+#define EV_RLSD 0x0020
+#define EV_BREAK 0x0040
+#define EV_ERR 0x0080
+#define EV_RING 0x0100
+#define EV_PERR 0x0200
+#define EV_CTSS 0x0400
+#define EV_DSRS 0x0800
+#define EV_RLSDS 0x1000
+#define EV_RingTe 0x2000
+#define EV_RINGTE EV_RingTe
+
+/* Escape Functions */
+#define SETXOFF 1
+#define SETXON 2
+#define SETRTS 3
+#define CLRRTS 4
+#define SETDTR 5
+#define CLRDTR 6
+#define RESETDEV 7
+
+#define LPTx 0x80
+
+#if (WINVER >= 0x030a)
+
+/* new escape functions */
+#define GETMAXLPT 8
+#define GETMAXCOM 9
+#define GETBASEIRQ 10
+
+/* Comm Baud Rate indices */
+#define CBR_110 0xFF10
+#define CBR_300 0xFF11
+#define CBR_600 0xFF12
+#define CBR_1200 0xFF13
+#define CBR_2400 0xFF14
+#define CBR_4800 0xFF15
+#define CBR_9600 0xFF16
+#define CBR_14400 0xFF17
+#define CBR_19200 0xFF18
+#define CBR_38400 0xFF1B
+#define CBR_56000 0xFF1F
+#define CBR_128000 0xFF23
+#define CBR_256000 0xFF27
+
+/* notifications passed in low word of lParam on WM_COMMNOTIFY messages */
+#define CN_RECEIVE 0x0001
+#define CN_TRANSMIT 0x0002
+#define CN_EVENT 0x0004
+
+#endif /* WINVER >= 0x030a */
+
+typedef struct tagDCB
+{
+ BYTE Id;
+ UINT BaudRate;
+ BYTE ByteSize;
+ BYTE Parity;
+ BYTE StopBits;
+ UINT RlsTimeout;
+ UINT CtsTimeout;
+ UINT DsrTimeout;
+
+ UINT fBinary :1;
+ UINT fRtsDisable :1;
+ UINT fParity :1;
+ UINT fOutxCtsFlow :1;
+ UINT fOutxDsrFlow :1;
+ UINT fDummy :2;
+ UINT fDtrDisable :1;
+
+ UINT fOutX :1;
+ UINT fInX :1;
+ UINT fPeChar :1;
+ UINT fNull :1;
+ UINT fChEvt :1;
+ UINT fDtrflow :1;
+ UINT fRtsflow :1;
+ UINT fDummy2 :1;
+
+ char XonChar;
+ char XoffChar;
+ UINT XonLim;
+ UINT XoffLim;
+ char PeChar;
+ char EofChar;
+ char EvtChar;
+ UINT TxDelay;
+} DCB;
+typedef DCB FAR* LPDCB;
+
+#if (defined(STRICT) | (WINVER >= 0x030a))
+
+typedef struct tagCOMSTAT
+{
+ BYTE status;
+ UINT cbInQue;
+ UINT cbOutQue;
+} COMSTAT;
+
+#define CSTF_CTSHOLD 0x01
+#define CSTF_DSRHOLD 0x02
+#define CSTF_RLSDHOLD 0x04
+#define CSTF_XOFFHOLD 0x08
+#define CSTF_XOFFSENT 0x10
+#define CSTF_EOF 0x20
+#define CSTF_TXIM 0x40
+
+#else /* (STRICT | WINVER >= 0x030a) */
+
+/* NOTE: This structure declaration is not ANSI compatible! */
+typedef struct tagCOMSTAT
+{
+ BYTE fCtsHold :1;
+ BYTE fDsrHold :1;
+ BYTE fRlsdHold :1;
+ BYTE fXoffHold :1;
+ BYTE fXoffSent :1;
+ BYTE fEof :1;
+ BYTE fTxim :1;
+ UINT cbInQue;
+ UINT cbOutQue;
+} COMSTAT;
+
+#endif /* !(STRICT | WINVER >= 0x030a */
+
+int WINAPI BuildCommDCB(LPCSTR, DCB FAR*);
+
+int WINAPI OpenComm(LPCSTR, UINT, UINT);
+int WINAPI CloseComm(int);
+
+int WINAPI ReadComm(int, void FAR*, int);
+int WINAPI WriteComm(int, const void FAR*, int);
+int WINAPI UngetCommChar(int, char);
+int WINAPI FlushComm(int, int);
+int WINAPI TransmitCommChar(int, char);
+
+int WINAPI SetCommState(const DCB FAR*);
+int WINAPI GetCommState(int, DCB FAR*);
+int WINAPI GetCommError(int, COMSTAT FAR* );
+
+int WINAPI SetCommBreak(int);
+int WINAPI ClearCommBreak(int);
+
+UINT FAR* WINAPI SetCommEventMask(int, UINT);
+UINT WINAPI GetCommEventMask(int, int);
+
+LONG WINAPI EscapeCommFunction(int, int);
+
+#if (WINVER >= 0x030a)
+BOOL WINAPI EnableCommNotification(int, HWND, int, int);
+
+#define WM_COMMNOTIFY 0x0044
+#endif /* WINVER >= 0x030a */
+
+#endif /* NOCOMM */
+
+/****** String formatting support *******************************************/
+
+int WINAPI wvsprintf(LPSTR lpszOut, LPCSTR lpszFmt, const void FAR* lpParams);
+
+int FAR CDECL wsprintf(LPSTR lpszOut, LPCSTR lpszFmt, ...);
+
+
+/****** Driver support ******************************************************/
+
+#if (WINVER >= 0x030a)
+
+#ifndef NODRIVERS
+
+DECLARE_HANDLE(HDRVR);
+
+typedef LRESULT (CALLBACK* DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM);
+
+/* Driver messages */
+#define DRV_LOAD 0x0001
+#define DRV_ENABLE 0x0002
+#define DRV_OPEN 0x0003
+#define DRV_CLOSE 0x0004
+#define DRV_DISABLE 0x0005
+#define DRV_FREE 0x0006
+#define DRV_CONFIGURE 0x0007
+#define DRV_QUERYCONFIGURE 0x0008
+#define DRV_INSTALL 0x0009
+#define DRV_REMOVE 0x000A
+#define DRV_EXITSESSION 0x000B
+#define DRV_EXITAPPLICATION 0x000C
+#define DRV_POWER 0x000F
+
+#define DRV_RESERVED 0x0800
+#define DRV_USER 0x4000
+
+/* LPARAM of DRV_CONFIGURE message */
+typedef struct tagDRVCONFIGINFO
+{
+ DWORD dwDCISize;
+ LPCSTR lpszDCISectionName;
+ LPCSTR lpszDCIAliasName;
+} DRVCONFIGINFO;
+typedef DRVCONFIGINFO NEAR* PDRVCONFIGINFO;
+typedef DRVCONFIGINFO FAR* LPDRVCONFIGINFO;
+
+/* Supported return values for DRV_CONFIGURE message */
+#define DRVCNF_CANCEL 0x0000
+#define DRVCNF_OK 0x0001
+#define DRVCNF_RESTART 0x0002
+
+/* Supported lParam1 of DRV_EXITAPPLICATION notification */
+#define DRVEA_NORMALEXIT 0x0001
+#define DRVEA_ABNORMALEXIT 0x0002
+
+LRESULT WINAPI DefDriverProc(DWORD dwDriverIdentifier, HDRVR driverID, UINT message, LPARAM lParam1, LPARAM lParam2);
+
+HDRVR WINAPI OpenDriver(LPCSTR szDriverName, LPCSTR szSectionName, LPARAM lParam2);
+LRESULT WINAPI CloseDriver(HDRVR hDriver, LPARAM lParam1, LPARAM lParam2);
+
+LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2);
+
+HINSTANCE WINAPI GetDriverModuleHandle(HDRVR hDriver);
+
+HDRVR WINAPI GetNextDriver(HDRVR, DWORD);
+
+/* GetNextDriver flags */
+#define GND_FIRSTINSTANCEONLY 0x00000001
+
+#define GND_FORWARD 0x00000000
+#define GND_REVERSE 0x00000002
+
+typedef struct tagDRIVERINFOSTRUCT
+{
+ UINT length;
+ HDRVR hDriver;
+ HINSTANCE hModule;
+ char szAliasName[128];
+} DRIVERINFOSTRUCT;
+typedef DRIVERINFOSTRUCT FAR* LPDRIVERINFOSTRUCT;
+
+BOOL WINAPI GetDriverInfo(HDRVR, DRIVERINFOSTRUCT FAR*);
+
+#endif /* !NODRIVERS */
+#endif /* WINVER >= 0x030a */
+#endif /* NOUSER */
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+} /* End of extern "C" { */
+#endif /* __cplusplus */
+
+#endif /* _INC_WINDOWS */
diff --git a/private/oleauto/tools/win16/os2/inc/windows.inc b/private/oleauto/tools/win16/os2/inc/windows.inc
new file mode 100644
index 000000000..9d2860e1c
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/windows.inc
@@ -0,0 +1,2108 @@
+;*************************************************************************
+;
+; WINDOWS.INC - Windows assembly language structures & constants
+;
+;*************************************************************************
+;
+; Conditional Block includes: (True states)
+; NOTEXT - don't include TextMetric struc & text drawing modes & stock objs.
+; NORASTOPS - don't include binary and ternary raster ops.
+; NOVK - don't include virtual key definitions
+; NOMB - don't include message box definitions
+; NOWM - don't include window messages
+;
+;
+FALSE = 0
+TRUE = 1
+NULL = 0
+
+;*******************************************************************
+;
+; Rectangle
+;
+;*******************************************************************
+
+RECT struc
+ rcLeft dw ?
+ rcTop dw ?
+ rcRight dw ?
+ rcBottom dw ?
+RECT ends
+
+;*******************************************************************
+;
+; Window Class structure
+;
+;*******************************************************************
+
+WNDCLASS struc
+ clsStyle dw ? ; class style
+ clsLpfnWndProc dd ?
+ clsCbClsExtra dw ?
+ clsCbWndExtra dw ?
+ clsHInstance dw ? ; instance handle
+ clsHIcon dw ? ; class icon handle
+ clsHCursor dw ? ; class cursor handle
+ clsHbrBackground dw ? ; class background brush
+ clsLpszMenuName dd ? ; menu name
+ clsLpszClassName dd ? ; far ptr to class name
+WNDCLASS ends
+
+IFNDEF NOTEXT
+TEXTMETRIC struc
+ tmHeight dw ?
+ tmAscent dw ?
+ tmDescent dw ?
+ tmIntLeading dw ?
+ tmExtLeading dw ?
+ tmAveCharWidth dw ?
+ tmMaxCharWidth dw ?
+ tmWeight dw ?
+ tmItalic db ?
+ tmUnderlined db ?
+ tmStruckOut db ?
+ tmFirstChar db ?
+ tmLastChar db ?
+ tmDefaultChar db ?
+ tmBreakChar db ?
+ tmPitch db ?
+ tmCharSet db ?
+ tmOverhang dw ?
+ tmAspectX dw ?
+ tmAspectY dw ?
+TEXTMETRIC ends
+
+LF_FACESIZE EQU 32
+
+LOGFONT struc
+ lfHeight dw ?
+ lfWidth dw ?
+ lfEscapement dw ?
+ lfOrientation dw ?
+ lfWeight dw ?
+ lfItalic db ?
+ lfUnderline db ?
+ lfStrikeOut db ?
+ lfCharSet db ?
+ lfOutPrecision db ?
+ lfClipPrecision db ?
+ lfQuality db ?
+ lfPitchAndFamily db ?
+ lfFaceName db LF_FACESIZE dup(?)
+LOGFONT ends
+
+LOGBRUSH struc
+ lbStyle dw ?
+ lbColor dd ?
+ lbHatch dw ?
+LOGBRUSH ends
+
+;
+; Text Drawing modes
+;
+TRANSPARENT = 1
+OPAQUE = 2
+;
+; Mapping Modes
+;
+MM_TEXT = 1
+MM_LOMETRIC = 2
+MM_HIMETRIC = 3
+MM_LOENGLISH = 4
+MM_HIENGLISH = 5
+MM_TWIPS = 6
+MM_ISOTROPIC = 7
+MM_ANISOTROPIC = 8
+;
+; Coordinate Modes
+;
+ABSOLUTE = 1
+RELATIVE = 2
+;
+; Stock Logical Objects
+;
+WHITE_BRUSH = 0
+LTGRAY_BRUSH = 1
+GRAY_BRUSH = 2
+DKGRAY_BRUSH = 3
+BLACK_BRUSH = 4
+NULL_BRUSH = 5
+HOLLOW_BRUSH = 5
+WHITE_PEN = 6
+BLACK_PEN = 7
+NULL_PEN = 8
+DOT_MARKER = 9
+OEM_FIXED_FONT = 10
+ANSI_FIXED_FONT = 11
+ANSI_VAR_FONT = 12
+SYSTEM_FONT = 13
+DEVICE_DEFAULT_FONT = 14
+DEFAULT_PALETTE = 15
+SYSTEM_FIXED_FONT = 16
+ENDIF
+;
+; Brush Styles
+;
+BS_SOLID = 0
+BS_NULL = 1
+BS_HOLLOW = BS_NULL
+BS_HATCHED = 2
+BS_PATTERN = 3
+BS_INDEXED = 4
+BS_DIBPATTERN = 5
+;
+; Hatch Styles
+;
+HS_HORIZONTAL = 0 ; -----
+HS_VERTICAL = 1 ; |||||
+HS_FDIAGONAL = 2 ; \\\\\
+HS_BDIAGONAL = 3 ; /////
+HS_CROSS = 4 ; +++++
+HS_DIAGCROSS = 5 ; xxxxx
+;
+; Pen Styles
+;
+PS_SOLID = 0
+PS_DASH = 1 ; -------
+PS_DOT = 2 ; .......
+PS_DASHDOT = 3 ; _._._._
+PS_DASHDOTDOT = 4 ; _.._.._
+PS_NULL = 5
+PS_INSIDEFRAME = 6
+;
+; Device Parameters for GetDeviceCaps()
+;
+DRIVERVERSION =0 ; Device driver version
+TECHNOLOGY =2 ; Device classification
+HORZSIZE =4 ; Horizontal size in millimeters
+VERTSIZE =6 ; Vertical size in millimeters
+HORZRES =8 ; Horizontal width in pixels
+VERTRES =10 ; Vertical width in pixels
+BITSPIXEL =12 ; Number of bits per pixel
+PLANES =14 ; Number of planes
+NUMBRUSHES =16 ; Number of brushes the device has
+NUMPENS =18 ; Number of pens the device has
+NUMMARKERS =20 ; Number of markers the device has
+NUMFONTS =22 ; Number of fonts the device has
+NUMCOLORS =24 ; Number of colors the device supports
+PDEVICESIZE =26 ; Size required for device descriptor
+CURVECAPS =28 ; Curve capabilities
+LINECAPS =30 ; Line capabilities
+POLYGONALCAPS =32 ; Polygonal capabilities
+TEXTCAPS =34 ; Text capabilities
+CLIPCAPS =36 ; Clipping capabilities
+RASTERCAPS =38 ; Bitblt capabilities
+ASPECTX =40 ; Length of the X leg
+ASPECTY =42 ; Length of the Y leg
+ASPECTXY =44 ; Length of the hypotenuse
+
+LOGPIXELSX =88 ; Logical pixels/inch in X
+LOGPIXELSY =90 ; Logical pixels/inch in Y
+
+SIZEPALETTE =104 ; Number of entries in physical palette
+NUMRESERVED =106 ; Number of reserved entries in palette
+COLORRES =108 ; Actual color resolution
+;
+ifndef NOGDICAPMASKS
+;
+; Device Capability Masks:
+;
+; Device Technologies
+DT_PLOTTER = 0 ; /* Vector plotter */
+DT_RASDISPLAY = 1 ; /* Raster display */
+DT_RASPRINTER = 2 ; /* Raster printer */
+DT_RASCAMERA = 3 ; /* Raster camera */
+DT_CHARSTREAM = 4 ; /* Character-stream, PLP */
+DT_METAFILE = 5 ; /* Metafile, VDM */
+DT_DISPFILE = 6 ; /* Display-file */
+;
+; Curve Capabilities
+CC_NONE = 0 ; /* Curves not supported */
+CC_CIRCLES = 1 ; /* Can do circles */
+CC_PIE = 2 ; /* Can do pie wedges */
+CC_CHORD = 4 ; /* Can do chord arcs */
+CC_ELLIPSES = 8 ; /* Can do ellipese */
+CC_WIDE = 16 ; /* Can do wide lines */
+CC_STYLED = 32 ; /* Can do styled lines */
+CC_WIDESTYLED = 64 ; /* Can do wide styled lines */
+CC_INTERIORS = 128; /* Can do interiors */
+;
+; Line Capabilities
+LC_NONE = 0 ; /* Lines not supported */
+LC_POLYLINE = 2 ; /* Can do polylines */
+LC_MARKER = 4 ; /* Can do markers */
+LC_POLYMARKER = 8 ; /* Can do polymarkers */
+LC_WIDE = 16 ; /* Can do wide lines */
+LC_STYLED = 32 ; /* Can do styled lines */
+LC_WIDESTYLED = 64 ; /* Can do wide styled lines */
+LC_INTERIORS = 128; /* Can do interiors */
+;
+; Polygonal Capabilities
+PC_NONE = 0 ; /* Polygonals not supported */
+PC_POLYGON = 1 ; /* Can do polygons */
+PC_RECTANGLE = 2 ; /* Can do rectangles */
+PC_WINDPOLYGON = 4 ; /* Can do winding polygons */
+PC_TRAPEZOID = 4 ; /* Can do trapezoids */
+PC_SCANLINE = 8 ; /* Can do scanlines */
+PC_WIDE = 16 ; /* Can do wide borders */
+PC_STYLED = 32 ; /* Can do styled borders */
+PC_WIDESTYLED = 64 ; /* Can do wide styled borders */
+PC_INTERIORS = 128; /* Can do interiors */
+;
+; Polygonal Capabilities */
+CP_NONE = 0 ; /* No clipping of output */
+CP_RECTANGLE = 1 ; /* Output clipped to rects */
+;
+; Text Capabilities
+TC_OP_CHARACTER = 0001h ; /* Can do OutputPrecision CHARACTER */
+TC_OP_STROKE = 0002h ; /* Can do OutputPrecision STROKE */
+TC_CP_STROKE = 0004h ; /* Can do ClipPrecision STROKE */
+TC_CR_90 = 0008h ; /* Can do CharRotAbility 90 */
+TC_CR_ANY = 0010h ; /* Can do CharRotAbility ANY */
+TC_SF_X_YINDEP = 0020h ; /* Can do ScaleFreedom X_YINDEPENDENT */
+TC_SA_DOUBLE = 0040h ; /* Can do ScaleAbility DOUBLE */
+TC_SA_INTEGER = 0080h ; /* Can do ScaleAbility INTEGER */
+TC_SA_CONTIN = 0100h ; /* Can do ScaleAbility CONTINUOUS */
+TC_EA_DOUBLE = 0200h ; /* Can do EmboldenAbility DOUBLE */
+TC_IA_ABLE = 0400h ; /* Can do ItalisizeAbility ABLE */
+TC_UA_ABLE = 0800h ; /* Can do UnderlineAbility ABLE */
+TC_SO_ABLE = 1000h ; /* Can do StrikeOutAbility ABLE */
+TC_RA_ABLE = 2000h ; /* Can do RasterFontAble ABLE */
+TC_VA_ABLE = 4000h ; /* Can do VectorFontAble ABLE */
+TC_RESERVED = 8000h
+;
+; Raster Capabilities
+RC_BITBLT = 1 ; /* Can do standard BLT. */
+RC_BANDING = 2 ; /* Device requires banding support */
+RC_SCALING = 4 ; /* Device requires scaling support */
+RC_BITMAP64 = 8 ; /* Device can support >64K bitmap */
+RC_GDI20_OUTPUT = 0010h ; /* has 2.0 output calls */
+RC_DI_BITMAP = 0080h ; /* supports DIB to memory */
+RC_PALETTE = 0100h ; /* supports a palette */
+RC_DIBTODEV = 0200h ; /* supports DIBitsToDevice */
+RC_BIGFONT = 0400h ; /* supports >64K fonts */
+RC_STRETCHBLT = 0800h ; /* supports StretchBlt */
+RC_FLOODFILL = 1000h ; /* supports FloodFill */
+RC_STRETCHDIB = 2000h ; /* supports StretchDIBits */
+
+endif ;NOGDICAPMASKS
+
+; palette entry flags
+;
+PC_RESERVED = 1 ;/* palette index used for animation */
+PC_EXPLICIT = 2 ;/* palette index is explicit to device */
+PC_NOCOLLAPSE = 4 ;/* do not match color to system palette */
+
+; DIB color table identifiers
+;
+DIB_RGB_COLORS = 0 ;/* color table in RGBTriples */
+DIB_PAL_COLORS = 1 ;/* color table in palette indices */
+;
+
+;constants for Get/SetSystemPaletteUse()
+;
+SYSPAL_STATIC = 1
+SYSPAL_NOSTATIC = 2
+
+; constants for CreateDIBitmap
+CBM_INIT = 4 ;/* initialize bitmap */
+;
+; Bitmap format constants
+BI_RGB = 0
+BI_RLE8 = 1
+BI_RLE4 = 2
+;
+;
+ANSI_CHARSET = 0
+SYMBOL_CHARSET = 2
+OEM_CHARSET = 255
+;
+; styles for CombineRgn
+;
+RGN_AND = 1
+RGN_OR = 2
+RGN_XOR = 3
+RGN_DIFF = 4
+RGN_COPY = 5
+;
+; Predefined cursor & icon IDs
+;
+IDC_ARROW = 32512
+IDC_IBEAM = 32513
+IDC_WAIT = 32514
+IDC_CROSS = 32515
+IDC_UPARROW = 32516
+IDC_SIZE = 32640
+IDC_ICON = 32641
+IDC_SIZENWSE = 32642
+IDC_SIZENESW = 32643
+IDC_SIZEWE = 32644
+IDC_SIZENS = 32645
+
+IDI_APPLICATION = 32512
+IDI_HAND = 32513
+IDI_QUESTION = 32514
+IDI_EXCLAMATION = 32515
+IDI_ASTERISK = 32516
+
+;
+; OEM Resource Ordinal Numbers */
+;
+OBM_CLOSE = 32754
+OBM_UPARROW = 32753
+OBM_DNARROW = 32752
+OBM_RGARROW = 32751
+OBM_LFARROW = 32750
+OBM_REDUCE = 32749
+OBM_ZOOM = 32748
+OBM_RESTORE = 32747
+OBM_REDUCED = 32746
+OBM_ZOOMD = 32745
+OBM_RESTORED = 32744
+OBM_UPARROWD = 32743
+OBM_DNARROWD = 32742
+OBM_RGARROWD = 32741
+OBM_LFARROWD = 32740
+OBM_MNARROW = 32739
+OBM_COMBO = 32738
+
+OBM_OLD_CLOSE = 32767
+OBM_SIZE = 32766
+OBM_OLD_UPARROW = 32765
+OBM_OLD_DNARROW = 32764
+OBM_OLD_RGARROW = 32763
+OBM_OLD_LFARROW = 32762
+OBM_BTSIZE = 32761
+OBM_CHECK = 32760
+OBM_CHECKBOXES = 32759
+OBM_BTNCORNERS = 32758
+OBM_OLD_REDUCE = 32757
+OBM_OLD_ZOOM = 32756
+OBM_OLD_RESTORE = 32755
+
+OCR_NORMAL = 32512
+OCR_IBEAM = 32513
+OCR_WAIT = 32514
+OCR_CROSS = 32515
+OCR_UP = 32516
+OCR_SIZE = 32640
+OCR_ICON = 32641
+OCR_SIZENWSE = 32642
+OCR_SIZENESW = 32643
+OCR_SIZEWE = 32644
+OCR_SIZENS = 32645
+OCR_SIZEALL = 32646
+OCR_ICOCUR = 32647
+
+OIC_SAMPLE = 32512
+OIC_HAND = 32513
+OIC_QUES = 32514
+OIC_BANG = 32515
+OIC_NOTE = 32516
+
+;
+; Scroll bar constants
+;
+SB_HORZ = 0
+SB_VERT = 1
+SB_CTL = 2
+SB_BOTH = 3
+;
+; Scroll Commands
+;
+SB_LINEUP = 0
+SB_LINEDOWN = 1
+SB_PAGEUP = 2
+SB_PAGEDOWN = 3
+SB_THUMBPOSITION = 4
+SB_THUMBTRACK = 5
+SB_TOP = 6
+SB_BOTTOM = 7
+SB_ENDSCROLL = 8
+;
+; MessageBox type flags
+;
+IFNDEF NOMB
+MB_OK = 0000H
+MB_OKCANCEL = 0001H
+MB_ABORTRETRYIGNORE = 0002H
+MB_YESNOCANCEL = 0003H
+MB_YESNO = 0004H
+MB_RETRYCANCEL = 0005H
+
+MB_ICONHAND = 0010H
+MB_ICONQUESTION = 0020H
+MB_ICONEXCLAMATION = 0030H
+MB_ICONASTERISK = 0040H
+
+MB_DEFBUTTON1 = 0000H
+MB_DEFBUTTON2 = 0100H
+MB_DEFBUTTON3 = 0200H
+
+MB_APPLMODAL = 0000H
+MB_SYSTEMMODAL = 1000H
+MB_TASKMODAL = 2000H
+
+MB_NOFOCUS = 8000H
+
+;
+; Conventional dialog box and message box command IDs
+;
+IDOK = 1
+IDCANCEL = 2
+IDABORT = 3
+IDRETRY = 4
+IDIGNORE = 5
+IDYES = 6
+IDNO = 7
+;
+; Flags for OpenFile
+;
+OF_READ = 0000H
+OF_WRITE = 0001H
+OF_READWRITE = 0002H
+OF_SHARE_COMPAT = 0000H
+OF_SHARE_EXCLUSIVE = 0010H
+OF_SHARE_DENY_WRITE = 0020H
+OF_SHARE_DENY_READ = 0030H
+OF_SHARE_DENY_NONE = 0040H
+OF_PARSE = 0100H
+OF_DELETE = 0200H
+OF_VERIFY = 0400H
+OF_CANCEL = 0800H
+OF_CREATE = 1000H
+OF_PROMPT = 2000H
+OF_EXIST = 4000H
+OF_REOPEN = 8000H
+
+TF_FORCEDRIVE = 80H
+
+OPENSTRUC STRUC
+opLen db ?
+opDisk db ?
+opXtra dw ?
+opDate dw ?
+opTime dw ?
+opFile db 120 dup (?)
+OPENSTRUC ENDS
+;
+; DrawText format flags
+;
+DT_LEFT = 00H
+DT_CENTER = 01H
+DT_RIGHT = 02H
+DT_TOP = 00H
+DT_VCENTER = 04H
+DT_BOTTOM = 08H
+DT_WORDBREAK = 10H
+DT_SINGLELINE = 20H
+DT_EXPANDTABS = 40H
+DT_TABSTOP = 80H
+DT_NOCLIP = 0100H
+DT_EXTERNALLEADING = 0200H
+DT_CALCRECT = 0400H
+DT_NOPREFIX = 0800H
+DT_INTERNAL = 1000H
+ENDIF
+
+;
+; ExtFloodFill style flags
+;
+FLOODFILLBORDER = 0
+FLOODFILLSURFACE = 1
+
+;
+; Memory manager flags
+;
+LMEM_FIXED = 0000h
+LMEM_MOVEABLE = 0002h
+LMEM_NOCOMPACT = 0010H
+LMEM_NODISCARD = 0020H
+LMEM_ZEROINIT = 0040h
+LMEM_MODIFY = 0080H
+LMEM_DISCARDABLE= 0F00h
+LHND = LMEM_MOVEABLE+LMEM_ZEROINIT
+LPTR = LMEM_FIXED+LMEM_ZEROINIT
+; Flags returned by LocalFlags (in addition to LMEM_DISCARDABLE)
+LMEM_DISCARDED = 4000H
+LMEM_LOCKCOUNT = 00FFH
+
+NONZEROLHND = LMEM_MOVEABLE
+NONZEROLPTR = LMEM_FIXED
+
+LNOTIFY_OUTOFMEM = 0
+LNOTIFY_MOVE = 1
+LNOTIFY_DISCARD = 2
+
+
+GMEM_FIXED = 0000h
+GMEM_MOVEABLE = 0002h
+GMEM_NOCOMPACT = 0010h
+GMEM_NODISCARD = 0020h
+GMEM_ZEROINIT = 0040h
+GMEM_MODIFY = 0080h
+GMEM_DISCARDABLE= 0100h
+GMEM_NOT_BANKED = 1000h
+GMEM_DDESHARE = 2000h
+GMEM_SHARE = 2000h
+GMEM_NOTIFY = 4000h
+GMEM_LOWER = GMEM_NOT_BANKED
+GHND = GMEM_MOVEABLE+GMEM_ZEROINIT
+GPTR = GMEM_FIXED+GMEM_ZEROINIT
+
+; Flags returned by GlobalFlags (in addition to GMEM_DISCARDABLE)
+GMEM_DISCARDED = 4000h
+GMEM_LOCKCOUNT = 00FFh
+
+; Flags returned by GetWinFlags
+
+WF_PMODE = 0001h
+WF_CPU286 = 0002h
+WF_CPU386 = 0004h
+WF_CPU486 = 0008h
+WF_STANDARD = 0010h
+WF_WIN286 = 0010h
+WF_ENHANCED = 0020h
+WF_WIN386 = 0020h
+WF_CPU086 = 0040h
+WF_CPU186 = 0080h
+WF_LARGEFRAME = 0100h
+WF_SMALLFRAME = 0200h
+WF_80x87 = 0400h
+
+; WEP fSystemExit flag values
+WEP_SYSTEM_EXIT = 1
+WEP_FREE_DLL = 0
+
+; Virtual Keys, Standard Set
+
+IFNDEF NOVK
+VK_LBUTTON = 01H
+VK_RBUTTON = 02H
+VK_CANCEL = 03H
+VK_BACK = 08H
+VK_TAB = 09H
+VK_CLEAR = 0cH
+VK_RETURN = 0dH
+VK_SHIFT = 10H
+VK_CONTROL = 11H
+VK_MENU = 12H
+VK_PAUSE = 13H
+VK_CAPITAL = 14H
+VK_ESCAPE = 1bH
+VK_SPACE = 20H
+
+VK_PRIOR = 21H
+VK_NEXT = 22H
+VK_END = 23H
+VK_HOME = 24H
+VK_LEFT = 25H
+VK_UP = 26H
+VK_RIGHT = 27H
+VK_DOWN = 28H
+
+; VK_A thru VK_Z are the same as their ASCII equivalents: 'A' thru 'Z'
+; VK_0 thru VK_9 are the same as their ASCII equivalents: '0' thru '0'
+
+VK_PRINT = 2aH
+VK_EXECUTE = 2bH
+VK_SNAPSHOT = 2ch ; Printscreen key..
+VK_INSERT = 2dH
+VK_DELETE = 2eH
+VK_HELP = 2fH
+
+VK_NUMPAD0 = 60H
+VK_NUMPAD1 = 61H
+VK_NUMPAD2 = 62H
+VK_NUMPAD3 = 63H
+VK_NUMPAD4 = 64H
+VK_NUMPAD5 = 65H
+VK_NUMPAD6 = 66H
+VK_NUMPAD7 = 67H
+VK_NUMPAD8 = 68H
+VK_NUMPAD9 = 69H
+VK_MULTIPLY = 6AH
+VK_ADD = 6BH
+VK_SEPARATER = 6CH
+VK_SUBTRACT = 6DH
+VK_DECIMAL = 6EH
+VK_DIVIDE = 6FH
+
+VK_F1 = 70H
+VK_F2 = 71H
+VK_F3 = 72H
+VK_F4 = 73H
+VK_F5 = 74H
+VK_F6 = 75H
+VK_F7 = 76H
+VK_F8 = 77H
+VK_F9 = 78H
+VK_F10 = 79H
+VK_F11 = 7aH
+VK_F12 = 7bH
+VK_F13 = 7cH
+VK_F14 = 7dH
+VK_F15 = 7eH
+VK_F16 = 7fH
+ENDIF
+
+IFNDEF NOWH
+
+; SetWindowsHook() codes
+WH_MSGFILTER = (-1)
+WH_JOURNALRECORD = 0
+WH_JOURNALPLAYBACK = 1
+WH_KEYBOARD = 2
+WH_GETMESSAGE = 3
+WH_CALLWNDPROC = 4
+WH_CBT = 5
+WH_SYSMSGFILTER = 6
+WH_WINDOWMGR = 7
+;
+; Hook Codes
+HC_LPLPFNNEXT = (-2)
+HC_LPFNNEXT = (-1)
+HC_ACTION = 0
+HC_GETNEXT = 1
+HC_SKIP = 2
+HC_NOREM = 3
+HC_NOREMOVE = 3
+HC_SYSMODALON = 4
+HC_SYSMODALOFF = 5
+;
+; CBT Hook Codes
+HCBT_MOVESIZE = 0
+HCBT_MINMAX = 1
+HCBT_QS = 2
+;
+; WH_MSGFILTER Filter Proc Codes
+MSGF_DIALOGBOX = 0
+MSGF_MESSAGEBOX = 1
+MSGF_MENU = 2
+MSGF_MOVE = 3
+MSGF_SIZE = 4
+MSGF_SCROLLBAR = 5
+MSGF_NEXTWINDOW = 6
+;
+; Window Manager Hook Codes
+WC_INIT = 1
+WC_SWP = 2
+WC_DEFWINDOWPROC = 3
+WC_MINMAX = 4
+WC_MOVE = 5
+WC_SIZE = 6
+WC_DRAWCAPTION = 7
+;
+; Message Structure used in Journaling
+EVENTMSG struc
+ message dw ?
+ paramL dw ?
+ paramH dw ?
+ time dd ?
+EVENTMSG ends
+
+ENDIF ;NOWH
+
+; Window field offsets for GetWindowLong() and GetWindowWord()
+GWL_WNDPROC = (-4)
+GWW_HINSTANCE = (-6)
+GWW_HWNDPARENT = (-8)
+GWW_ID = (-12)
+GWL_STYLE = (-16)
+GWL_EXSTYLE = (-20)
+
+; GetWindow() Constants
+GW_HWNDFIRST = 0
+GW_HWNDLAST = 1
+GW_HWNDNEXT = 2
+GW_HWNDPREV = 3
+GW_OWNER = 4
+GW_CHILD = 5
+
+; Class field offsets for GetClassLong() and GetClassWord()
+GCL_MENUNAME = (-8)
+GCW_HBRBACKGROUND = (-10)
+GCW_HCURSOR = (-12)
+GCW_HICON = (-14)
+GCW_HMODULE = (-16)
+GCW_CBWNDEXTRA = (-18)
+GCW_CBCLSEXTRA = (-20)
+GCL_WNDPROC = (-24)
+GCW_STYLE = (-26)
+
+; WinWhere() Area Codes
+HTERROR = (-2)
+HTTRANSPARENT = (-1)
+HTNOWHERE = 0
+HTCLIENT = 1
+HTCAPTION = 2
+HTSYSMENU = 3
+HTGROWBOX = 4
+HTSIZE = HTGROWBOX
+HTMENU = 5
+HTHSCROLL = 6
+HTVSCROLL = 7
+HTREDUCE = 8
+HTZOOM = 9
+HTLEFT = 10
+HTRIGHT = 11
+HTTOP = 12
+HTTOPLEFT = 13
+HTTOPRIGHT = 14
+HTBOTTOM = 15
+HTBOTTOMLEFT = 16
+HTBOTTOMRIGHT = 17
+HTSIZEFIRST = HTLEFT
+HTSIZELAST = HTBOTTOMRIGHT
+
+
+
+;*************************************************************************
+;
+; Misc structures & constants
+;
+;*************************************************************************
+
+IFNDEF NOMST
+POINT struc
+ ptX dw ?
+ ptY dw ?
+POINT ends
+
+LOGPEN struc
+ lopnStyle dw ?
+ lopnWidth db (SIZE POINT) DUP(?)
+ lopnColor dd ?
+LOGPEN ends
+
+
+BITMAP STRUC
+ bmType DW ?
+ bmWidth DW ?
+ bmHeight DW ?
+ bmWidthBytes DW ?
+ bmPlanes DB ?
+ bmBitsPixel DB ?
+ bmBits DD ?
+BITMAP ENDS
+
+RGBTRIPLE struc
+ rgbBlue db ?
+ rgbGreen db ?
+ rgbRed db ?
+RGBTRIPLE ends
+
+RGBQUAD struc
+ rgbqBlue db ?
+ rgbqGreen db ?
+ rgbqRed db ?
+ rgbqReserved db ?
+RGBQUAD ends
+
+; structures for defining DIBs
+BITMAPCOREHEADER struc
+ bcSize dd ?
+ bcWidth dw ?
+ bcHeight dw ?
+ bcPlanes dw ?
+ bcBitCount dw ?
+BITMAPCOREHEADER ends
+
+BITMAPINFOHEADER struc
+ biSize dd ?
+ biWidth dd ?
+ biHeight dd ?
+ biPlanes dw ?
+ biBitCount dw ?
+
+ biCompression dd ?
+ biSizeImage dd ?
+ biXPelsPerMeter dd ?
+ biYPelsPerMeter dd ?
+ biClrUsed dd ?
+ biClrImportant dd ?
+BITMAPINFOHEADER ends
+
+BITMAPINFO struc
+ bmiHeader db (SIZE BITMAPINFOHEADER) DUP (?)
+ bmiColors db ? ; array of RGBQUADs
+BITMAPINFO ends
+
+BITMAPCOREINFO struc
+ bmciHeader db (SIZE BITMAPCOREHEADER) DUP (?)
+ bmciColors db ? ; array of RGBTRIPLEs
+BITMAPCOREINFO ends
+
+BITMAPFILEHEADER struc
+ bfType dw ?
+ bfSize dd ?
+ bfReserved1 dw ?
+ bfReserved2 dw ?
+ bfOffBits dd ?
+BITMAPFILEHEADER ends
+
+
+WNDSTRUC struc
+ WSwndStyle dd ?
+ WSwndID dw ?
+ WSwndText dw ?
+ WSwndParent dw ?
+ WSwndInstance dw ?
+ WSwndClassProc dd ?
+WNDSTRUC ends
+;
+; Message structure
+;
+MSGSTRUCT struc
+msHWND dw ?
+msMESSAGE dw ?
+msWPARAM dw ?
+msLPARAM dd ?
+msTIME dd ?
+msPT dd ?
+MSGSTRUCT ends
+
+NEWPARMS struc
+ nprmHwnd dw ?
+ nprmCmd db ?
+NEWPARMS ends
+ENDIF
+
+PAINTSTRUCT STRUC
+ PShdc DW ?
+ PSfErase DW ?
+ PSrcPaint DB size RECT dup(?)
+ PSfRestore DW ?
+ PSfIncUpdate DW ?
+ PSrgbReserved DB 16 dup(?)
+PAINTSTRUCT ENDS
+
+
+CREATESTRUCT struc
+ cs_lpCreateParams dd ?
+ cs_hInstance dw ?
+ cs_hMenu dw ?
+ cs_hwndParent dw ?
+ cs_cy dw ?
+ cs_cx dw ?
+ cs_y dw ?
+ cs_x dw ?
+ cs_style dd ?
+ cs_lpszName dd ?
+ cs_lpszClass dd ?
+ cs_dwExStyle dd ?
+CREATESTRUCT ends
+;
+; PostError constants
+;
+WARNING = 0 ; command codes
+MINOR_ERROR = 1
+FATAL_ERROR = 2
+
+IGNORE = 0 ; response codes
+RETRY = 1
+ABORT = 2
+;
+; GDI-related constants & commands
+;
+ERRORREGION = 0
+NULLREGION = 1
+SIMPLEREGION = 2
+COMPLEXREGION = 3
+
+IFNDEF NORASTOPS
+;
+; Binary raster ops
+;
+R2_BLACK = 1
+R2_NOTMERGEPEN = 2
+R2_MASKNOTPEN = 3
+R2_NOTCOPYPEN = 4
+R2_MASKPENNOT = 5
+R2_NOT = 6
+R2_XORPEN = 7
+R2_NOTMASKPEN = 8
+R2_MASKPEN = 9
+R2_NOTXORPEN = 10
+R2_NOP = 11
+R2_MERGENOTPEN = 12
+R2_COPYPEN = 13
+R2_MERGEPENNOT = 14
+R2_MERGEPEN = 15
+R2_WHITE = 16
+;
+; Ternary raster ops
+;
+SRCCOPY_L = 0020h ;dest=source
+SRCCOPY_H = 00CCh
+SRCPAINT_L = 0086h ;dest=source OR dest
+SRCPAINT_H = 00EEh
+SRCAND_L = 00C6h ;dest=source AND dest
+SRCAND_H = 0088h
+SRCINVERT_L = 0046h ;dest= source XOR dest
+SRCINVERT_H = 0066h
+SRCERASE_L = 0328h ;dest= source AND (not dest )
+SRCERASE_H = 0044h
+NOTSRCCOPY_L = 0008h ;dest= (not source)
+NOTSRCCOPY_H = 0033h
+NOTSRCERASE_L = 00A6h ;dest= (not source) AND (not dest)
+NOTSRCERASE_H = 0011h
+MERGECOPY_L = 00CAh ;dest= (source AND pattern)
+MERGECOPY_H = 00C0h
+MERGEPAINT_L = 0226h ;dest= (source AND pattern) OR dest
+MERGEPAINT_H = 00BBh
+PATCOPY_L = 0021h ;dest= pattern
+PATCOPY_H = 00F0h
+PATPAINT_L = 0A09h ;DPSnoo
+PATPAINT_H = 00FBh
+PATINVERT_L = 0049h ;dest= pattern XOR dest
+PATINVERT_H = 005Ah
+DSTINVERT_L = 0009h ;dest= (not dest)
+DSTINVERT_H = 0055h
+BLACKNESS_L = 0042h ;dest= BLACK
+BLACKNESS_H = 0000h
+WHITENESS_L = 0062h ;dest= WHITE
+WHITENESS_H = 00FFh
+;
+; StretchBlt modes
+;
+BLACKONWHITE = 1
+WHITEONBLACK = 2
+COLORONCOLOR = 3
+;
+; PolyFill modes
+;
+ALTERNATE = 1
+WINDING = 2
+ENDIF
+;
+; Text Alignment Options
+;
+TA_NOUPDATECP = 0
+TA_UPDATECP = 1
+
+TA_LEFT = 0
+TA_RIGHT = 2
+TA_CENTER = 6
+
+TA_TOP = 0
+TA_BOTTOM = 8
+TA_BASELINE = 24
+
+ETO_GRAYED = 1
+ETO_OPAQUE = 2
+ETO_CLIPPED = 4
+
+ASPECT_FILTERING = 1
+
+ifndef NOMETAFILE
+
+; Metafile Functions */
+META_SETBKCOLOR = 0201h
+META_SETBKMODE = 0102h
+META_SETMAPMODE = 0103h
+META_SETROP2 = 0104h
+META_SETRELABS = 0105h
+META_SETPOLYFILLMODE = 0106h
+META_SETSTRETCHBLTMODE = 0107h
+META_SETTEXTCHAREXTRA = 0108h
+META_SETTEXTCOLOR = 0209h
+META_SETTEXTJUSTIFICATION = 020Ah
+META_SETWINDOWORG = 020Bh
+META_SETWINDOWEXT = 020Ch
+META_SETVIEWPORTORG = 020Dh
+META_SETVIEWPORTEXT = 020Eh
+META_OFFSETWINDOWORG = 020Fh
+META_SCALEWINDOWEXT = 0400h
+META_OFFSETVIEWPORTORG = 0211h
+META_SCALEVIEWPORTEXT = 0412h
+META_LINETO = 0213h
+META_MOVETO = 0214h
+META_EXCLUDECLIPRECT = 0415h
+META_INTERSECTCLIPRECT = 0416h
+META_ARC = 0817h
+META_ELLIPSE = 0418h
+META_FLOODFILL = 0419h
+META_PIE = 081Ah
+META_RECTANGLE = 041Bh
+META_ROUNDRECT = 061Ch
+META_PATBLT = 061Dh
+META_SAVEDC = 001Eh
+META_SETPIXEL = 041Fh
+META_OFFSETCLIPRGN = 0220h
+META_TEXTOUT = 0521h
+META_BITBLT = 0922h
+META_STRETCHBLT = 0B23h
+META_POLYGON = 0324h
+META_POLYLINE = 0325h
+META_ESCAPE = 0626h
+META_RESTOREDC = 0127h
+META_FILLREGION = 0228h
+META_FRAMEREGION = 0429h
+META_INVERTREGION = 012Ah
+META_PAINTREGION = 012Bh
+META_SELECTCLIPREGION = 012Ch
+META_SELECTOBJECT = 012Dh
+META_SETTEXTALIGN = 012Eh
+META_DRAWTEXT = 062Fh
+
+META_CHORD = 0830h
+META_SETMAPPERFLAGS = 0231h
+META_EXTTEXTOUT = 0a32h
+META_SETDIBTODEV = 0d33h
+META_SELECTPALETTE = 0234h
+META_REALIZEPALETTE = 0035h
+META_ANIMATEPALETTE = 0436h
+META_SETPALENTRIES = 0037h
+META_POLYPOLYGON = 0538h
+META_RESIZEPALETTE = 0139h
+
+META_DIBBITBLT = 0940h
+META_DIBSTRETCHBLT = 0b41h
+META_DIBCREATEPATTERNBRUSH = 0142h
+META_STRETCHDIB = 0f43h
+
+META_DELETEOBJECT = 01f0h
+
+META_CREATEPALETTE = 00f7h
+META_CREATEBRUSH = 00F8h
+META_CREATEPATTERNBRUSH = 01F9h
+META_CREATEPENINDIRECT = 02FAh
+META_CREATEFONTINDIRECT = 02FBh
+META_CREATEBRUSHINDIRECT = 02FCh
+META_CREATEBITMAPINDIRECT = 02FDh
+META_CREATEBITMAP = 06FEh
+META_CREATEREGION = 06FFh
+
+; /* Clipboard Metafile Picture Structure */
+HANDLETABLE struc
+ ht_objectHandle dw ?
+HANDLETABLE ends
+
+METARECORD struc
+ mr_rdSize dd ?
+ mr_rdFunction dw ?
+ mr_rdParm dw ?
+METARECORD ends
+
+METAFILEPICT struc
+ mfp_mm dw ?
+ mfp_xExt dw ?
+ mfp_yExt dw ?
+ mfp_hMF dw ?
+METAFILEPICT ends
+
+METAHEADER struc
+ mtType dw ?
+ mtHeaderSize dw ?
+ mtVersion dw ?
+ mtSize dd ?
+ mtNoObjects dw ?
+ mtMaxRecord dd ?
+ mtNoParameters dw ?
+METAHEADER ends
+
+endif ; NOMETAFILE
+
+; GDI Escapes
+NEWFRAME = 1
+ABORTDOC = 2
+NEXTBAND = 3
+SETCOLORTABLE = 4
+GETCOLORTABLE = 5
+FLUSHOUTPUT = 6
+DRAFTMODE = 7
+QUERYESCSUPPORT = 8
+SETABORTPROC = 9
+STARTDOC = 10
+;; This value conflicts with a std WIN386 MACRO definition
+;;ENDDOC = 11
+GETPHYSPAGESIZE = 12
+GETPRINTINGOFFSET = 13
+GETSCALINGFACTOR = 14
+MFCOMMENT = 15
+GETPENWIDTH = 16
+SETCOPYCOUNT = 17
+SELECTPAPERSOURCE = 18
+DEVICEDATA = 19
+PASSTHROUGH = 19
+GETTECHNOLGY = 20
+GETTECHNOLOGY = 20
+SETENDCAP = 21
+SETLINEJOIN = 22
+SETMITERLIMIT = 23
+BANDINFO = 24
+DRAWPATTERNRECT = 25
+GETVECTORPENSIZE = 26
+GETVECTORBRUSHSIZE = 27
+ENABLEDUPLEX = 28
+ENABLEMANUALFEED = 29
+GETSETPAPERBINS = 29
+GETSETPRINTORIENT = 30
+ENUMPAPERBINS = 31
+
+GETEXTENDEDTEXTMETRICS = 256
+GETEXTENTTABLE = 257
+GETPAIRKERNTABLE = 258
+GETTRACKKERNTABLE = 259
+
+EXTTEXTOUT = 512
+
+ENABLERELATIVEWIDTHS = 768
+ENABLEPAIRKERNING = 769
+SETKERNTRACK = 770
+SETALLJUSTVALUES = 771
+SETCHARSET = 772
+
+STRETCHBLT = 2048
+
+
+; Spooler Error Codes
+SP_NOTREPORTED = 4000h
+SP_ERROR = (-1)
+SP_APPABORT = (-2)
+SP_USERABORT = (-3)
+SP_OUTOFDISK = (-4)
+SP_OUTOFMEMORY = (-5)
+
+PR_JOBSTATUS = 0000
+
+; Object Definitions for EnumObjects()
+OBJ_PEN = 1
+OBJ_BRUSH = 2
+
+;
+; Menu flags for Change/Check/Enable MenuItem
+;
+MF_INSERT = 0000h
+MF_CHANGE = 0080h
+MF_APPEND = 0100h
+MF_DELETE = 0200h
+MF_REMOVE = 1000h
+
+MF_BYCOMMAND = 0000h
+MF_BYPOSITION = 0400h
+
+MF_SEPARATOR = 0800h
+
+MF_ENABLED = 0000h
+MF_GRAYED = 0001h
+MF_DISABLED = 0002h
+
+MF_UNCHECKED = 0000h
+MF_CHECKED = 0008h
+MF_USECHECKBITMAPS= 0200h
+
+MF_STRING = 0000h
+MF_BITMAP = 0004h
+MF_OWNERDRAW = 0100h
+
+MF_POPUP = 0010h
+MF_MENUBARBREAK = 0020h
+MF_MENUBREAK = 0040h
+
+MF_UNHILITE = 0000h
+MF_HILITE = 0080h
+
+MF_SYSMENU = 2000h
+MF_HELP = 4000h
+MF_MOUSESELECT = 8000h
+
+
+;
+; System Menu Command Values
+;
+SC_SIZE = 0F000h
+SC_MOVE = 0F010h
+SC_MINIMIZE = 0F020h
+SC_MAXIMIZE = 0F030h
+SC_NEXTWINDOW = 0F040h
+SC_PREVWINDOW = 0F050h
+SC_CLOSE = 0F060h
+SC_VSCROLL = 0F070h
+SC_HSCROLL = 0F080h
+SC_MOUSEMENU = 0F090h
+SC_KEYMENU = 0F100h
+SC_ARRANGE = 0F110h
+SC_RESTORE = 0F120h
+SC_TASKLIST = 0F130h
+
+SC_ICON = SC_MINIMIZE
+SC_ZOOM = SC_MAXIMIZE
+
+;
+; Window State Messages
+;
+IFNDEF NOWM
+WM_STATE = 0000H
+
+WM_NULL = 0000h
+WM_CREATE = 0001h
+WM_DESTROY = 0002h
+WM_MOVE = 0003h
+WM_SIZE = 0005h
+WM_ACTIVATE = 0006h
+WM_SETFOCUS = 0007h
+WM_KILLFOCUS = 0008h
+WM_ENABLE = 000Ah
+WM_SETREDRAW = 000Bh
+WM_SETTEXT = 000Ch
+WM_GETTEXT = 000Dh
+WM_GETTEXTLENGTH = 000Eh
+WM_PAINT = 000Fh
+WM_CLOSE = 0010h
+WM_QUERYENDSESSION = 0011h
+WM_QUIT = 0012h
+WM_QUERYOPEN = 0013h
+WM_ERASEBKGND = 0014h
+WM_SYSCOLORCHANGE = 0015h
+WM_ENDSESSION = 0016h
+WM_SHOWWINDOW = 0018h
+WM_CTLCOLOR = 0019h
+WM_WININICHANGE = 001Ah
+WM_DEVMODECHANGE = 001Bh
+WM_ACTIVATEAPP = 001Ch
+WM_FONTCHANGE = 001Dh
+WM_TIMECHANGE = 001Eh
+WM_CANCELMODE = 001Fh
+WM_SETCURSOR = 0020h
+WM_MOUSEACTIVATE = 0021h
+WM_CHILDACTIVATE = 0022h
+WM_QUEUESYNC = 0023h
+WM_GETMINMAXINFO = 0024h
+WM_PAINTICON = 0026h
+WM_ICONERASEBKGND = 0027h
+WM_NEXTDLGCTL = 0028h
+WM_SPOOLERSTATUS = 002Ah
+WM_DRAWITEM = 002Bh
+WM_MEASUREITEM = 002Ch
+WM_DELETEITEM = 002Dh
+WM_VKEYTOITEM = 002Eh
+WM_CHARTOITEM = 002Fh
+WM_SETFONT = 0030h
+WM_GETFONT = 0031h
+WM_QUERYDRAGICON = 0037h
+WM_COMPAREITEM = 0039h
+WM_COMPACTING = 0041h
+
+WM_NCCREATE = 0081h
+WM_NCDESTROY = 0082h
+WM_NCCALCSIZE = 0083h
+WM_NCHITTEST = 0084h
+WM_NCPAINT = 0085h
+WM_NCACTIVATE = 0086h
+WM_GETDLGCODE = 0087h
+WM_NCMOUSEMOVE = 00A0h
+WM_NCLBUTTONDOWN = 00A1h
+WM_NCLBUTTONUP = 00A2h
+WM_NCLBUTTONDBLCLK = 00A3h
+WM_NCRBUTTONDOWN = 00A4h
+WM_NCRBUTTONUP = 00A5h
+WM_NCRBUTTONDBLCLK = 00A6h
+WM_NCMBUTTONDOWN = 00A7h
+WM_NCMBUTTONUP = 00A8h
+WM_NCMBUTTONDBLCLK = 00A9h
+
+WM_KEYFIRST = 0100h
+WM_KEYDOWN = 0100h
+WM_KEYUP = 0101h
+WM_CHAR = 0102h
+WM_DEADCHAR = 0103h
+WM_SYSKEYDOWN = 0104h
+WM_SYSKEYUP = 0105h
+WM_SYSCHAR = 0106h
+WM_SYSDEADCHAR = 0107h
+WM_KEYLAST = 0108h
+
+WM_INITDIALOG = 0110h
+WM_COMMAND = 0111h
+WM_SYSCOMMAND = 0112h
+WM_TIMER = 0113h
+WM_HSCROLL = 0114h
+WM_VSCROLL = 0115h
+WM_INITMENU = 0116h
+WM_INITMENUPOPUP = 0117h
+WM_MENUSELECT = 011Fh
+WM_MENUCHAR = 0120h
+WM_ENTERIDLE = 0121h
+
+
+WM_MOUSEFIRST = 0200h
+WM_MOUSEMOVE = 0200h
+WM_LBUTTONDOWN = 0201h
+WM_LBUTTONUP = 0202h
+WM_LBUTTONDBLCLK = 0203h
+WM_RBUTTONDOWN = 0204h
+WM_RBUTTONUP = 0205h
+WM_RBUTTONDBLCLK = 0206h
+WM_MBUTTONDOWN = 0207h
+WM_MBUTTONUP = 0208h
+WM_MBUTTONDBLCLK = 0209h
+WM_MOUSELAST = 0209h
+
+WM_PARENTNOTIFY = 0210h
+WM_MDICREATE = 0220h
+WM_MDIDESTROY = 0221h
+WM_MDIACTIVATE = 0222h
+WM_MDIRESTORE = 0223h
+WM_MDINEXT = 0224h
+WM_MDIMAXIMIZE = 0225h
+WM_MDITILE = 0226h
+WM_MDICASCADE = 0227h
+WM_MDIICONARRANGE = 0228h
+WM_MDIGETACTIVE = 0229h
+WM_MDISETMENU = 0230h
+
+
+WM_CUT = 0300h
+WM_COPY = 0301h
+WM_PASTE = 0302h
+WM_CLEAR = 0303h
+WM_UNDO = 0304h
+WM_RENDERFORMAT = 0305h
+WM_RENDERALLFORMATS = 0306h
+WM_DESTROYCLIPBOARD = 0307h
+WM_DRAWCLIPBOARD = 0308h
+WM_PAINTCLIPBOARD = 0309h
+WM_VSCROLLCLIPBOARD = 030Ah
+WM_SIZECLIPBOARD = 030Bh
+WM_ASKCBFORMATNAME = 030Ch
+WM_CHANGECBCHAIN = 030Dh
+WM_HSCROLLCLIPBOARD = 030Eh
+WM_QUERYNEWPALETTE = 030Fh
+WM_PALETTEISCHANGING = 0310h
+WM_PALETTECHANGED = 0311h
+
+
+; private window messages start here
+WM_USER = 0400H
+ENDIF ; NOWM
+
+; WM_MOUSEACTIVATE Return Codes
+MA_ACTIVATE = 1
+MA_ACTIVATEANDEAT = 2
+MA_NOACTIVATE = 3
+
+; Size message commands
+SIZENORMAL = 0
+SIZEICONIC = 1
+SIZEFULLSCREEN = 2
+SIZEZOOMSHOW = 3
+SIZEZOOMHIDE = 4
+
+; ShowWindow() Commands
+SW_HIDE = 0
+SW_SHOWNORMAL = 1
+SW_NORMAL = 1
+SW_SHOWMINIMIZED = 2
+SW_SHOWMAXIMIZED = 3
+SW_MAXIMIZE = 3
+SW_SHOWNOACTIVATE = 4
+SW_SHOW = 5
+SW_MINIMIZE = 6
+SW_SHOWMINNOACTIVE = 7
+SW_SHOWNA = 8
+SW_RESTORE = 9
+
+; Old ShowWindow() Commands
+HIDE_WINDOW = 0
+SHOW_OPENWINDOW = 1
+SHOW_ICONWINDOW = 2
+SHOW_FULLSCREEN = 3
+SHOW_OPENNOACTIVATE= 4
+
+; identifiers for the WM_SHOWWINDOW message
+SW_PARENTCLOSING = 1
+SW_OTHERZOOM = 2
+SW_PARENTOPENING = 3
+SW_OTHERUNZOOM = 4
+;
+; Key state masks for mouse messages
+;
+MK_LBUTTON = 0001h
+MK_RBUTTON = 0002h
+MK_SHIFT = 0004h
+MK_CONTROL = 0008h
+MK_MBUTTON = 0010h
+;
+; Class styles
+;
+CS_VREDRAW = 0001h
+CS_HREDRAW = 0002h
+CS_KEYCVTWINDOW = 0004H
+CS_DBLCLKS = 0008h
+; 0010h reserved
+CS_OWNDC = 0020h
+CS_CLASSDC = 0040h
+CS_PARENTDC = 0080h
+CS_NOKEYCVT = 0100h
+CS_SAVEBITS = 0800h
+CS_NOCLOSE = 0200h
+CS_BYTEALIGNCLIENT = 1000h
+CS_BYTEALIGNWINDOW = 2000h
+CS_GLOBALCLASS = 4000h ; Global window class
+
+;
+; Special CreateWindow position value
+;
+CW_USEDEFAULT EQU 8000h
+
+;
+; Windows styles (the high words)
+;
+WS_OVERLAPPED = 00000h
+WS_ICONICPOPUP = 0C000h
+WS_POPUP = 08000h
+WS_CHILD = 04000h
+WS_MINIMIZE = 02000h
+WS_VISIBLE = 01000h
+WS_DISABLED = 00800h
+WS_CLIPSIBLINGS = 00400h
+WS_CLIPCHILDREN = 00200h
+WS_MAXIMIZE = 00100h
+WS_CAPTION = 000C0h ; WS_BORDER | WS_DLGFRAME
+WS_BORDER = 00080h
+WS_DLGFRAME = 00040h
+WS_VSCROLL = 00020h
+WS_HSCROLL = 00010h
+WS_SYSMENU = 00008h
+WS_THICKFRAME = 00004h
+WS_HREDRAW = 00002h
+WS_VREDRAW = 00001h
+WS_GROUP = 00002h
+WS_TABSTOP = 00001h
+WS_MINIMIZEBOX = 00002h
+WS_MAXIMIZEBOX = 00001h
+
+; Common Window Styles
+
+WS_OVERLAPPEDWINDOW = WS_OVERLAPPED + WS_CAPTION + WS_SYSMENU + WS_THICKFRAME + WS_MINIMIZEBOX + WS_MAXIMIZEBOX
+WS_POPUPWINDOW = WS_POPUP + WS_BORDER + WS_SYSMENU
+WS_CHILDWINDOW = WS_CHILD
+WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
+
+WS_TILED = WS_OVERLAPPED
+WS_ICONIC = WS_MINIMIZE
+WS_SIZEBOX = WS_THICKFRAME
+
+; Extended Window Styles (low words)
+WS_EX_DLGMODALFRAME = 0001
+WS_EX_DRAGOBJECT = 0002
+WS_EX_NOPARENTNOTIFY = 0004
+
+;
+; predefined clipboard formats
+;
+CF_TEXT = 1
+CF_BITMAP = 2
+CF_METAFILEPICT = 3
+CF_SYLK = 4
+CF_DIF = 5
+CF_TIFF = 6
+CF_OEMTEXT = 7
+CF_DIB = 8
+CF_PALETTE = 9
+
+CF_OWNERDISPLAY = 80h ; owner display
+CF_DSPTEXT = 81h ; display text
+CF_DSPBITMAP = 82h ; display bitmap
+CF_DSPMETAFILEPICT = 83h ; display metafile
+;
+; Private clipboard format range
+;
+CF_PRIVATEFIRST = 200h ; Anything in this range doesn't
+CF_PRIVATELAST = 2ffh ; get GlobalFree'd
+CF_GDIOBJFIRST = 300h ; Anything in this range gets
+CF_GDIOBJLAST = 3ffh ; DeleteObject'ed
+
+
+MAKEINTRESOURCE MACRO a
+ mov ax,a
+ xor dx,dx
+ ENDM
+;
+; Predefined resource types
+;
+RT_CURSOR = 1 ; must be passed through MAKEINTRESOURCE
+RT_BITMAP = 2
+RT_ICON = 3
+RT_MENU = 4
+RT_DIALOG = 5
+RT_STRING = 6
+RT_FONTDIR = 7
+RT_FONT = 8
+RT_ACCELERATOR = 9
+RT_RCDATA = 10
+
+
+
+
+IFNDEF NOMDI
+MDICREATESTRUCT struc
+ szClass dd ?
+ szTitle dd ?
+ hOwner dw ?
+ x dw ?
+ y dw ?
+ cxc dw ?
+ cyc dw ?
+ style dd ?
+MDICREATESTRUCT ends
+
+CLIENTCREATESTRUCT struc
+ hWindowMenu dw ?
+ idFirstChild dw ?
+CLIENTCREATESTRUCT ends
+ENDIF
+
+; NOMDI
+
+
+PALETTEENTRY struc
+ peRed db ?
+ peGreen db ?
+ peBlue db ?
+ peFlags db ?
+PALETTEENTRY ends
+
+; Logical Palette
+LOGPALETTE struc
+ palVersion dw ?
+ palNumEntries dw ?
+ palPalEntry db ? ; array of PALETTEENTRY
+LOGPALETTE ends
+
+; DRAWITEMSTRUCT for ownerdraw
+DRAWITEMSTRUCT struc
+ drCtlType dw ?
+ drCtlID dw ?
+ dritemID dw ?
+ dritemAction dw ?
+ dritemState dw ?
+ drhwndItem dw ?
+ drhDC dw ?
+ drrcItem DB size RECT dup(?)
+ dritemData dd ?
+DRAWITEMSTRUCT ends
+
+; DELETEITEMSTRUCT for ownerdraw
+DELETEITEMSTRUCT struc
+ deCtlType dw ?
+ deCtlID dw ?
+ deitemID dw ?
+ dehwndItem dw ?
+ deitemData dd ?
+DELETEITEMSTRUCT ends
+
+; MEASUREITEMSTRUCT for ownerdraw
+MEASUREITEMSTRUCT struc
+ meCtlType dw ?
+ meCtlID dw ?
+ meitemID dw ?
+ meitemWidth dw ?
+ meitemHeight dw ?
+ meitemData dd ?
+MEASUREITEMSTRUCT ends
+
+; COMPAREITEMSTUCT for ownerdraw sorting
+COMPAREITEMSTRUCT struc
+ coCtlType dw ?
+ coCtlID dw ?
+ cohwndItem dw ?
+ coitemID1 dw ?
+ coitemData1 dd ?
+ coitemID2 dw ?
+ coitemData2 dd ?
+COMPAREITEMSTRUCT ends
+
+; Owner draw control types
+ODT_MENU = 1
+ODT_LISTBOX = 2
+ODT_COMBOBOX = 3
+ODT_BUTTON = 4
+
+; Owner draw actions
+ODA_DRAWENTIRE = 1
+ODA_SELECT = 2
+ODA_FOCUS = 4
+
+; Owner draw state
+ODS_SELECTED = 0001h
+ODS_GRAYED = 0002h
+ODS_DISABLED = 0004h
+ODS_CHECKED = 0008h
+ODS_FOCUS = 0010h
+
+; PeekMessage() Options
+PM_NOREMOVE = 0000h
+PM_REMOVE = 0001h
+PM_NOYIELD = 0002h
+
+; SetWindowPos Flags
+SWP_NOSIZE = 0001h
+SWP_NOMOVE = 0002h
+SWP_NOZORDER = 0004h
+SWP_NOREDRAW = 0008h
+SWP_NOACTIVATE = 0010h
+SWP_DRAWFRAME = 0020h
+SWP_SHOWWINDOW = 0040h
+SWP_HIDEWINDOW = 0080h
+SWP_NOCOPYBITS = 0100h
+SWP_NOREPOSITION = 0200h
+
+
+IFNDEF NOWINMESSAGES
+
+; Listbox messages
+LB_ADDSTRING = (WM_USER+1)
+LB_INSERTSTRING = (WM_USER+2)
+LB_DELETESTRING = (WM_USER+3)
+LB_RESETCONTENT = (WM_USER+5)
+LB_SETSEL = (WM_USER+6)
+LB_SETCURSEL = (WM_USER+7)
+LB_GETSEL = (WM_USER+8)
+LB_GETCURSEL = (WM_USER+9)
+LB_GETTEXT = (WM_USER+10)
+LB_GETTEXTLEN = (WM_USER+11)
+LB_GETCOUNT = (WM_USER+12)
+LB_SELECTSTRING = (WM_USER+13)
+LB_DIR = (WM_USER+14)
+LB_GETTOPINDEX = (WM_USER+15)
+LB_FINDSTRING = (WM_USER+16)
+LB_GETSELCOUNT = (WM_USER+17)
+LB_GETSELITEMS = (WM_USER+18)
+LB_SETTABSTOPS = (WM_USER+19)
+LB_GETHORIZONTALEXTENT = (WM_USER+20)
+LB_SETHORIZONTALEXTENT = (WM_USER+21)
+LB_SETTOPINDEX = (WM_USER+24)
+LB_GETITEMRECT = (WM_USER+25)
+LB_GETITEMDATA = (WM_USER+26)
+LB_SETITEMDATA = (WM_USER+27)
+LB_SELITEMRANGE = (WM_USER+28)
+LB_MSGMAX = (WM_USER+33)
+
+ENDIF
+; NOWINMESSAGES
+
+; Listbox Styles
+LBS_NOTIFY = 0001h
+LBS_SORT = 0002h
+LBS_NOREDRAW = 0004h
+LBS_MULTIPLESEL = 0008h
+LBS_OWNERDRAWFIXED = 0010h
+LBS_OWNERDRAWVARIABLE = 0020h
+LBS_HASSTRINGS = 0040h
+LBS_USETABSTOPS = 0080h
+LBS_NOINTEGRALHEIGHT = 0100h
+LBS_MULTICOLUMN = 0200h
+LBS_WANTKEYBOARDINPUT = 0400h
+LBS_EXTENDEDSEL = 0800h
+LBS_STANDARD = LBS_NOTIFY + LBS_SORT + WS_VSCROLL + WS_BORDER
+
+; Listbox Notification Codes
+LBN_ERRSPACE = (-2)
+LBN_SELCHANGE = 1
+LBN_DBLCLK = 2
+LBN_SELCANCEL = 3
+LBN_SETFOCUS = 4
+LBN_KILLFOCUS = 5
+
+IFNDEF NOWINMESSAGES
+
+; Edit Control Messages
+EM_GETSEL = (WM_USER+0)
+EM_SETSEL = (WM_USER+1)
+EM_GETRECT = (WM_USER+2)
+EM_SETRECT = (WM_USER+3)
+EM_SETRECTNP = (WM_USER+4)
+EM_SCROLL = (WM_USER+5)
+EM_LINESCROLL = (WM_USER+6)
+EM_GETMODIFY = (WM_USER+8)
+EM_SETMODIFY = (WM_USER+9)
+EM_GETLINECOUNT = (WM_USER+10)
+EM_LINEINDEX = (WM_USER+11)
+EM_SETHANDLE = (WM_USER+12)
+EM_GETHANDLE = (WM_USER+13)
+EM_GETTHUMB = (WM_USER+14)
+EM_LINELENGTH = (WM_USER+17)
+EM_REPLACESEL = (WM_USER+18)
+EM_SETFONT = (WM_USER+19)
+EM_GETLINE = (WM_USER+20)
+EM_LIMITTEXT = (WM_USER+21)
+EM_CANUNDO = (WM_USER+22)
+EM_UNDO = (WM_USER+23)
+EM_FMTLINES = (WM_USER+24)
+EM_LINEFROMCHAR = (WM_USER+25)
+EM_SETWORDBREAK = (WM_USER+26)
+EM_SETTABSTOPS = (WM_USER+27)
+EM_SETPASSWORDCHAR = (WM_USER+28)
+EM_EMPTYUNDOBUFFER = (WM_USER+29)
+EM_MSGMAX = (WM_USER+30)
+
+ENDIF
+; NOWINMESSAGES
+
+
+; Edit Control Styles (low word)
+ES_LEFT = 0000h
+ES_CENTER = 0001h
+ES_RIGHT = 0002h
+ES_MULTILINE = 0004h
+ES_UPPERCASE = 0008h
+ES_LOWERCASE = 0010h
+ES_PASSWORD = 0020h
+ES_AUTOVSCROLL = 0040h
+ES_AUTOHSCROLL = 0080h
+ES_NOHIDESEL = 0100h
+ES_OEMCONVERT = 0400h
+
+; Edit Control Notification Codes
+EN_SETFOCUS = 0100
+EN_KILLFOCUS = 0200
+EN_CHANGE = 0300
+EN_UPDATE = 0400
+EN_ERRSPACE = 0500
+EN_MAXTEXT = 0501
+EN_HSCROLL = 0601
+EN_VSCROLL = 0602
+
+IFNDEF NOWINMESSAGES
+
+; Button Control Messages
+BM_GETCHECK = (WM_USER+0)
+BM_SETCHECK = (WM_USER+1)
+BM_GETSTATE = (WM_USER+2)
+BM_SETSTATE = (WM_USER+3)
+BM_SETSTYLE = (WM_USER+4)
+
+ENDIF
+; NOWINMESSAGES
+
+; Button Control Styles (low word)
+BS_PUSHBUTTON = 00h
+BS_DEFPUSHBUTTON = 01h
+BS_CHECKBOX = 02h
+BS_AUTOCHECKBOX = 03h
+BS_RADIOBUTTON = 04h
+BS_3STATE = 05h
+BS_AUTO3STATE = 06h
+BS_GROUPBOX = 07h
+BS_USERBUTTON = 08h
+BS_AUTORADIOBUTTON = 09h
+BS_PUSHBOX = 0Ah
+BS_OWNERDRAW = 0Bh
+BS_LEFTTEXT = 20h
+
+; User Button Notification Codes
+BN_CLICKED = 0
+BN_PAINT = 1
+BN_HILITE = 2
+BN_UNHILITE = 3
+BN_DISABLE = 4
+BN_DOUBLECLICKED = 5
+
+; Dialog Styles (low words)
+DS_ABSALIGN = 01h
+DS_SYSMODAL = 02h
+DS_LOCALEDIT = 20h ;/* Edit items get Local storage. */
+DS_SETFONT = 40h ;/* User specified font for Dlg controls */
+DS_MODALFRAME = 80h ;/* Can be combined with WS_CAPTION */
+DS_NOIDLEMSG = 100h ;/* WM_ENTERIDLE message will not be sent */
+
+IFNDEF NOWINMESSAGES
+
+; Dialog box messages
+DM_GETDEFID = (WM_USER+0)
+DM_SETDEFID = (WM_USER+1)
+
+ENDIF ;NOWINMESSAGES
+
+; Dialog Codes
+DLGC_WANTARROWS = 0001h ; /* Control wants arrow keys */
+DLGC_WANTTAB = 0002h ; /* Control wants tab keys */
+DLGC_WANTALLKEYS = 0004h ; /* Control wants all keys */
+DLGC_WANTMESSAGE = 0004h ; /* Pass message to control */
+DLGC_HASSETSEL = 0008h ; /* Understands EM_SETSEL message */
+DLGC_DEFPUSHBUTTON = 0010h ; /* Default pushbutton */
+DLGC_UNDEFPUSHBUTTON= 0020h ; /* Non-default pushbutton */
+DLGC_RADIOBUTTON = 0040h ; /* Radio button */
+DLGC_WANTCHARS = 0080h ; /* Want WM_CHAR messages */
+DLGC_STATIC = 0100h ; /* Static item: don't include */
+DLGC_BUTTON = 2000h ; /* Button item: can be checked */
+
+; Combo Box return Values
+CB_OKAY = 0
+CB_ERR = (-1)
+CB_ERRSPACE = (-2)
+
+; Combo Box Notification Codes
+CBN_ERRSPACE = (-1)
+CBN_SELCHANGE = 1
+CBN_DBLCLK = 2
+CBN_SETFOCUS = 3
+CBN_KILLFOCUS = 4
+CBN_EDITCHANGE = 5
+CBN_EDITUPDATE = 6
+CBN_DROPDOWN = 7
+
+; Combo Box styles (low words)
+CBS_SIMPLE = 0001h
+CBS_DROPDOWN = 0002h
+CBS_DROPDOWNLIST = 0003h
+CBS_OWNERDRAWFIXED = 0010h
+CBS_OWNERDRAWVARIABLE= 0020h
+CBS_AUTOHSCROLL = 0040h
+CBS_OEMCONVERT = 0080h
+CBS_SORT = 0100h
+CBS_HASSTRINGS = 0200h
+CBS_NOINTEGRALHEIGHT = 0400h
+
+IFNDEF NOWINMESSAGES
+
+; Combo Box messages
+CB_GETEDITSEL = (WM_USER+0)
+CB_LIMITTEXT = (WM_USER+1)
+CB_SETEDITSEL = (WM_USER+2)
+CB_ADDSTRING = (WM_USER+3)
+CB_DELETESTRING = (WM_USER+4)
+CB_DIR = (WM_USER+5)
+CB_GETCOUNT = (WM_USER+6)
+CB_GETCURSEL = (WM_USER+7)
+CB_GETLBTEXT = (WM_USER+8)
+CB_GETLBTEXTLEN = (WM_USER+9)
+CB_INSERTSTRING = (WM_USER+10)
+CB_RESETCONTENT = (WM_USER+11)
+CB_FINDSTRING = (WM_USER+12)
+CB_SELECTSTRING = (WM_USER+13)
+CB_SETCURSEL = (WM_USER+14)
+CB_SHOWDROPDOWN = (WM_USER+15)
+CB_GETITEMDATA = (WM_USER+16)
+CB_SETITEMDATA = (WM_USER+17)
+CB_GETDROPPEDCONTROLRECT = (WM_USER+18)
+CB_MSGMAX = (WM_USER+19)
+
+ENDIF ; NOWINMESSAGES
+
+; Static Control styles (low word)
+SS_LEFT = 00h
+SS_CENTER = 01h
+SS_RIGHT = 02h
+SS_ICON = 03h
+SS_BLACKRECT = 04h
+SS_GRAYRECT = 05h
+SS_WHITERECT = 06h
+SS_BLACKFRAME = 07h
+SS_GRAYFRAME = 08h
+SS_WHITEFRAME = 09h
+SS_USERITEM = 0Ah
+SS_SIMPLE = 0Bh
+SS_LEFTNOWORDWRAP = 0Ch
+SS_NOPREFIX = 80h ; Don't do "&" character translation
+
+; Scroll Bar Styles (low word)
+SBS_HORZ = 0000h
+SBS_VERT = 0001h
+SBS_TOPALIGN = 0002h
+SBS_LEFTALIGN = 0002h
+SBS_BOTTOMALIGN = 0004h
+SBS_RIGHTALIGN = 0004h
+SBS_SIZEBOXTOPLEFTALIGN = 0002h
+SBS_SIZEBOXBOTTOMRIGHTALIGN = 0004h
+SBS_SIZEBOX = 0008h
+
+IFNDEF NOSYSMETRICS
+
+; GetSystemMetrics() codes
+SM_CXSCREEN = 0
+SM_CYSCREEN = 1
+SM_CXVSCROLL = 2
+SM_CYHSCROLL = 3
+SM_CYCAPTION = 4
+SM_CXBORDER = 5
+SM_CYBORDER = 6
+SM_CXDLGFRAME = 7
+SM_CYDLGFRAME = 8
+SM_CYVTHUMB = 9
+SM_CXHTHUMB = 10
+SM_CXICON = 11
+SM_CYICON = 12
+SM_CXCURSOR = 13
+SM_CYCURSOR = 14
+SM_CYMENU = 15
+SM_CXFULLSCREEN = 16
+SM_CYFULLSCREEN = 17
+SM_CYKANJIWINDOW = 18
+SM_MOUSEPRESENT = 19
+SM_CYVSCROLL = 20
+SM_CXHSCROLL = 21
+SM_DEBUG = 22
+SM_SWAPBUTTON = 23
+SM_RESERVED1 = 24
+SM_RESERVED2 = 25
+SM_RESERVED3 = 26
+SM_RESERVED4 = 27
+SM_CXMIN = 28
+SM_CYMIN = 29
+SM_CXSIZE = 30
+SM_CYSIZE = 31
+SM_CXFRAME = 32
+SM_CYFRAME = 33
+SM_CXMINTRACK = 34
+SM_CYMINTRACK = 35
+SM_CMETRICS = 36
+
+ENDIF ;NOSYSMETRICS
+
+IFNDEF NOCOLOR
+
+COLOR_SCROLLBAR = 0
+COLOR_BACKGROUND = 1
+COLOR_ACTIVECAPTION = 2
+COLOR_INACTIVECAPTION = 3
+COLOR_MENU = 4
+COLOR_WINDOW = 5
+COLOR_WINDOWFRAME = 6
+COLOR_MENUTEXT = 7
+COLOR_WINDOWTEXT = 8
+COLOR_CAPTIONTEXT = 9
+COLOR_ACTIVEBORDER = 10
+COLOR_INACTIVEBORDER = 11
+COLOR_APPWORKSPACE = 12
+COLOR_HIGHLIGHT = 13
+COLOR_HIGHLIGHTTEXT = 14
+COLOR_BTNFACE = 15
+COLOR_BTNSHADOW = 16
+COLOR_GRAYTEXT = 17
+COLOR_BTNTEXT = 18
+
+ENDIF ;NOCOLOR
+
+; Commands to pass WinHelp()
+HELP_CONTEXT =0001h ;/* Display topic in ulTopic */
+HELP_QUIT =0002h ;/* Terminate help */
+HELP_INDEX =0003h ;/* Display index */
+HELP_HELPONHELP =0004h ;/* Display help on using help */
+HELP_SETINDEX =0005h ;/* Set the current Index for multi index help */
+HELP_KEY =0101h ;/* Display topic for keyword in offabData */
+
+IFNDEF NOCOMM
+
+NOPARITY = 0
+ODDPARITY = 1
+EVENPARITY = 2
+MARKPARITY = 3
+SPACEPARITY = 4
+
+ONESTOPBIT = 0
+ONE5STOPBITS = 1
+TWOSTOPBITS = 2
+
+IGNORE = 0 ; /* Ignore signal */
+INFINITE = 0FFFFh ; /* Infinite timeout */
+
+; Error Flags
+CE_RXOVER = 0001h ; /* Receive Queue overflow */
+CE_OVERRUN = 0002h ; /* Receive Overrun Error */
+CE_RXPARITY = 0004h ; /* Receive Parity Error */
+CE_FRAME = 0008h ; /* Receive Framing error */
+CE_BREAK = 0010h ; /* Break Detected */
+CE_CTSTO = 0020h ; /* CTS Timeout */
+CE_DSRTO = 0040h ; /* DSR Timeout */
+CE_RLSDTO = 0080h ; /* RLSD Timeout */
+CE_TXFULL = 0100h ; /* TX Queue is full */
+CE_PTO = 0200h ; /* LPTx Timeout */
+CE_IOE = 0400h ; /* LPTx I/O Error */
+CE_DNS = 0800h ; /* LPTx Device not selected */
+CE_OOP = 1000h ; /* LPTx Out-Of-Paper */
+CE_MODE = 8000h ; /* Requested mode unsupported */
+
+IE_BADID = (-1) ; /* Invalid or unsupported id */
+IE_OPEN = (-2) ; /* Device Already Open */
+IE_NOPEN = (-3) ; /* Device Not Open */
+IE_MEMORY = (-4) ; /* Unable to allocate queues */
+IE_DEFAULT = (-5) ; /* Error in default parameters */
+IE_HARDWARE = (-10) ; /* Hardware Not Present */
+IE_BYTESIZE = (-11) ; /* Illegal Byte Size */
+IE_BAUDRATE = (-12) ; /* Unsupported BaudRate */
+
+; Events
+EV_RXCHAR = 0001h ; /* Any Character received */
+EV_RXFLAG = 0002h ; /* Received certain character */
+EV_TXEMPTY = 0004h ; /* Transmitt Queue Empty */
+EV_CTS = 0008h ; /* CTS changed state */
+EV_DSR = 0010h ; /* DSR changed state */
+EV_RLSD = 0020h ; /* RLSD changed state */
+EV_BREAK = 0040h ; /* BREAK received */
+EV_ERR = 0080h ; /* Line status error occurred */
+EV_RING = 0100h ; /* Ring signal detected */
+EV_PERR = 0200h ; /* Printer error occured */
+
+; Escape Functions
+SETXOFF = 1 ; /* Simulate XOFF received */
+SETXON = 2 ; /* Simulate XON received */
+SETRTS = 3 ; /* Set RTS high */
+CLRRTS = 4 ; /* Set RTS low */
+SETDTR = 5 ; /* Set DTR high */
+CLRDTR = 6 ; /* Set DTR low */
+RESETDEV = 7 ; /* Reset device if possible */
+
+LPTx = 80h ; /* Set if ID is for LPT device */
+
+DCB struc
+ DCB_Id db ? ; /* Internal Device ID */
+ DCB_BaudRate dw ? ; /* Baudrate at which runing */
+ DCB_ByteSize db ? ; /* Number of bits/byte, 4-8 */
+ DCB_Parity db ? ; /* 0-4=None,Odd,Even,Mark,Space */
+ DCB_StopBits db ? ; /* 0,1,2 = 1, 1.5, 2 */
+ DCB_RlsTimeout dw ? ; /* Timeout for RLSD to be set */
+ DCB_CtsTimeout dw ? ; /* Timeout for CTS to be set */
+ DCB_DsrTimeout dw ? ; /* Timeout for DSR to be set */
+
+ DCB_BitMask1 db ?
+
+ ; BYTE fBinary: 1; /* Binary Mode (skip EOF check */
+ ; BYTE fRtsDisable:1; /* Don't assert RTS at init time */
+ ; BYTE fParity: 1; /* Enable parity checking */
+ ; BYTE fOutxCtsFlow:1; /* CTS handshaking on output */
+ ; BYTE fOutxDsrFlow:1; /* DSR handshaking on output */
+ ; BYTE fDummy: 2; /* Reserved */
+ ; BYTE fDtrDisable:1; /* Don't assert DTR at init time */
+
+ DCB_BitMask2 db ?
+
+ ; BYTE fOutX: 1; /* Enable output X-ON/X-OFF */
+ ; BYTE fInX: 1; /* Enable input X-ON/X-OFF */
+ ; BYTE fPeChar: 1; /* Enable Parity Err Replacement */
+ ; BYTE fNull: 1; /* Enable Null stripping */
+ ; BYTE fChEvt: 1; /* Enable Rx character event. */
+ ; BYTE fDtrflow: 1; /* DTR handshake on input */
+ ; BYTE fRtsflow: 1; /* RTS handshake on input */
+ ; BYTE fDummy2: 1;
+
+ DCB_XonChar db ? ; /* Tx and Rx X-ON character */
+ DCB_XoffChar db ? ; /* Tx and Rx X-OFF character */
+ DCB_XonLim dw ? ; /* Transmit X-ON threshold */
+ DCB_XoffLim dw ? ; /* Transmit X-OFF threshold */
+ DCB_PeChar db ? ; /* Parity error replacement char */
+ DCB_EofChar db ? ; /* End of Input character */
+ DCB_EvtChar db ? ; /* Recieved Event character */
+ DCB_TxDelay dw ? ; /* Amount of time between chars */
+DCB ends
+
+COMSTAT struc
+ COMS_BitMask1 db ?
+
+; BYTE fCtsHold: 1; /* Transmit is on CTS hold */
+; BYTE fDsrHold: 1; /* Transmit is on DSR hold */
+; BYTE fRlsdHold: 1; /* Transmit is on RLSD hold */
+; BYTE fXoffHold: 1; /* Received handshake */
+; BYTE fXoffSent: 1; /* Issued handshake */
+; BYTE fEof: 1; /* End of file character found */
+; BYTE fTxim: 1; /* Character being transmitted */
+
+
+ COMS_cbInQue dw ? ; /* count of characters in Rx Queue */
+ COMS_cbOutQue dw ? ; /* count of characters in Tx Queue */
+COMSTAT ends
+
+ENDIF ;NOCOM
diff --git a/private/oleauto/tools/win16/os2/inc/windowsx.h b/private/oleauto/tools/win16/os2/inc/windowsx.h
new file mode 100644
index 000000000..ddbd5f393
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/windowsx.h
@@ -0,0 +1,1212 @@
+/*****************************************************************************\
+* *
+* windowsx.h - Macro APIs, window message crackers, and control APIs *
+* *
+* Version 3.10 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_WINDOWSX
+#define _INC_WINDOWSX
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/****** KERNEL Macro APIs ****************************************************/
+
+#define GetInstanceModule(hInstance) \
+ GetModuleHandle((LPCSTR)MAKELP(0, hInstance))
+
+#define GlobalPtrHandle(lp) \
+ ((HGLOBAL)LOWORD(GlobalHandle(SELECTOROF(lp))))
+
+#define GlobalLockPtr(lp) \
+ ((BOOL)SELECTOROF(GlobalLock(GlobalPtrHandle(lp))))
+#define GlobalUnlockPtr(lp) \
+ GlobalUnlock(GlobalPtrHandle(lp))
+
+#define GlobalAllocPtr(flags, cb) \
+ (GlobalLock(GlobalAlloc((flags), (cb))))
+#define GlobalReAllocPtr(lp, cbNew, flags) \
+ (GlobalUnlockPtr(lp), GlobalLock(GlobalReAlloc(GlobalPtrHandle(lp) , (cbNew), (flags))))
+#define GlobalFreePtr(lp) \
+ (GlobalUnlockPtr(lp), (BOOL)GlobalFree(GlobalPtrHandle(lp)))
+
+/****** GDI Macro APIs *******************************************************/
+
+#define DeletePen(hpen) DeleteObject((HGDIOBJ)(HPEN)(hpen))
+#define SelectPen(hdc, hpen) ((HPEN)SelectObject((hdc), (HGDIOBJ)(HPEN)(hpen)))
+#define GetStockPen(i) ((HPEN)GetStockObject(i))
+
+#define DeleteBrush(hbr) DeleteObject((HGDIOBJ)(HBRUSH)(hbr))
+#define SelectBrush(hdc, hbr) ((HBRUSH)SelectObject((hdc), (HGDIOBJ)(HBRUSH)(hbr)))
+#define GetStockBrush(i) ((HBRUSH)GetStockObject(i))
+
+#define DeleteRgn(hrgn) DeleteObject((HGDIOBJ)(HRGN)(hrgn))
+
+#define CopyRgn(hrgnDst, hrgnSrc) CombineRgn(hrgnDst, hrgnSrc, 0, RGN_COPY)
+#define IntersectRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_AND)
+#define SubtractRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_DIFF)
+#define UnionRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_OR)
+#define XorRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_XOR)
+
+#define DeletePalette(hpal) DeleteObject((HGDIOBJ)(HPALETTE)(hpal))
+
+#define DeleteFont(hfont) DeleteObject((HGDIOBJ)(HFONT)(hfont))
+#define SelectFont(hdc, hfont) ((HFONT)SelectObject((hdc), (HGDIOBJ)(HFONT)(hfont)))
+#define GetStockFont(i) ((HFONT)GetStockObject(i))
+
+#define DeleteBitmap(hbm) DeleteObject((HGDIOBJ)(HBITMAP)(hbm))
+#define SelectBitmap(hdc, hbm) ((HBITMAP)SelectObject((hdc), (HGDIOBJ)(HBITMAP)(hbm)))
+
+#define InsetRect(lprc, dx, dy) InflateRect((lprc), -(dx), -(dy))
+
+/****** USER Macro APIs ******************************************************/
+
+#define GetWindowInstance(hwnd) ((HINSTANCE)GetWindowWord(hwnd, GWW_HINSTANCE))
+
+#define GetWindowStyle(hwnd) ((DWORD)GetWindowLong(hwnd, GWL_STYLE))
+#define GetWindowExStyle(hwnd) ((DWORD)GetWindowLong(hwnd, GWL_EXSTYLE))
+
+#define GetWindowOwner(hwnd) GetWindow(hwnd, GW_OWNER)
+
+#define GetFirstChild(hwnd) GetTopWindow(hwnd)
+#define GetFirstSibling(hwnd) GetWindow(hwnd, GW_HWNDFIRST)
+#define GetLastSibling(hwnd) GetWindow(hwnd, GW_HWNDLAST)
+#define GetNextSibling(hwnd) GetWindow(hwnd, GW_HWNDNEXT)
+#define GetPrevSibling(hwnd) GetWindow(hwnd, GW_HWNDPREV)
+
+#define GetWindowID(hwnd) GetDlgCtrlID(hwnd)
+
+#define SetWindowRedraw(hwnd, fRedraw) \
+ ((void)SendMessage(hwnd, WM_SETREDRAW, (WPARAM)(BOOL)(fRedraw), 0L))
+
+#define SubclassWindow(hwnd, lpfn) \
+ ((WNDPROC)SetWindowLong((hwnd), GWL_WNDPROC, (LPARAM)(WNDPROC)(lpfn)))
+
+#define IsMinimized(hwnd) IsIconic(hwnd)
+#define IsMaximized(hwnd) IsZoomed(hwnd)
+#define IsRestored(hwnd) ((GetWindowStyle(hwnd) & (WS_MINIMIZE | WS_MAXIMIZE)) == 0L)
+
+#define SetWindowFont(hwnd, hfont, fRedraw) FORWARD_WM_SETFONT((hwnd), (hfont), (fRedraw), SendMessage)
+
+#define GetWindowFont(hwnd) FORWARD_WM_GETFONT((hwnd), SendMessage)
+
+#if (WINVER >= 0x030a)
+#define MapWindowRect(hwndFrom, hwndTo, lprc) \
+ MapWindowPoints((hwndFrom), (hwndTo), (POINT FAR*)(lprc), 2)
+#endif /* WINVER >= 0x030a */
+
+#define IsLButtonDown() (GetKeyState(VK_LBUTTON) < 0)
+#define IsRButtonDown() (GetKeyState(VK_RBUTTON) < 0)
+#define IsMButtonDown() (GetKeyState(VK_MBUTTON) < 0)
+
+#define SubclassDialog(hwndDlg, lpfn) \
+ ((DLGPROC)SetWindowLong(hwndDlg, DWL_DLGPROC, (LPARAM)(DLGPROC)(lpfn)))
+
+#define SetDlgMsgResult(hwnd, msg, result) \
+ (((msg) == WM_CTLCOLOR || (msg) == WM_COMPAREITEM || (msg) == WM_VKEYTOITEM || \
+ (msg) == WM_CHARTOITEM || (msg) == WM_QUERYDRAGICON || (msg) == WM_INITDIALOG) \
+ ? (BOOL)LOWORD(result) : (SetWindowLong((hwnd), DWL_MSGRESULT, (LPARAM)(LRESULT)(result)), TRUE))
+
+#define DefDlgProcEx(hwnd, msg, wParam, lParam, pfRecursion) \
+ (*(pfRecursion) = TRUE, DefDlgProc(hwnd, msg, wParam, lParam))
+
+#define CheckDefDlgRecursion(pfRecursion) \
+ if (*(pfRecursion)) { *(pfRecursion) = FALSE; return FALSE; }
+
+/****** Message crackers ****************************************************/
+
+#define HANDLE_MSG(hwnd, message, fn) \
+ case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
+
+/* void Cls_OnCompacting(HWND hwnd, UINT compactRatio); */
+#define HANDLE_WM_COMPACTING(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam)), 0L)
+#define FORWARD_WM_COMPACTING(hwnd, compactRatio, fn) \
+ (void)(fn)((hwnd), WM_COMPACTING, (WPARAM)(UINT)(compactRatio), 0L)
+
+/* void Cls_OnWinIniChange(HWND hwnd, LPCSTR lpszSectionName); */
+#define HANDLE_WM_WININICHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_WININICHANGE(hwnd, lpszSectionName, fn) \
+ (void)(fn)((hwnd), WM_WININICHANGE, 0, (LPARAM)(LPCSTR)(lpszSectionName))
+
+/* void Cls_OnSysColorChange(HWND hwnd); */
+#define HANDLE_WM_SYSCOLORCHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_SYSCOLORCHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_SYSCOLORCHANGE, 0, 0L)
+
+/* BOOL Cls_OnQueryNewPalette(HWND hwnd); */
+#define HANDLE_WM_QUERYNEWPALETTE(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYNEWPALETTE(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYNEWPALETTE, 0, 0L)
+
+/* void Cls_OnPaletteIsChanging(HWND hwnd, HWND hwndPaletteChange); */
+#define HANDLE_WM_PALETTEISCHANGING(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_PALETTEISCHANGING(hwnd, hwndPaletteChange, fn) \
+ (void)(fn)((hwnd), WM_PALETTEISCHANGING, (WPARAM)(HWND)(hwndPaletteChange), 0L)
+
+/* void Cls_OnPaletteChanged(HWND hwnd, HWND hwndPaletteChange); */
+#define HANDLE_WM_PALETTECHANGED(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_PALETTECHANGED(hwnd, hwndPaletteChange, fn) \
+ (void)(fn)((hwnd), WM_PALETTECHANGED, (WPARAM)(HWND)(hwndPaletteChange), 0L)
+
+/* void Cls_OnFontChange(HWND hwnd); */
+#define HANDLE_WM_FONTCHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_FONTCHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_FONTCHANGE, 0, 0L)
+
+/* void Cls_OnSpoolerStatus(HWND hwnd, UINT status, int cJobInQueue); */
+#define HANDLE_WM_SPOOLERSTATUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SPOOLERSTATUS(hwnd, status, cJobInQueue, fn) \
+ (void)(fn)((hwnd), WM_SPOOLERSTATUS, (WPARAM)(status), MAKELPARAM((UINT)(cJobInQueue), 0))
+
+/* void Cls_OnDevModeChange(HWND hwnd, LPCSTR lpszDeviceName); */
+#define HANDLE_WM_DEVMODECHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_DEVMODECHANGE(hwnd, lpszDeviceName, fn) \
+ (void)(fn)((hwnd), WM_DEVMODECHANGE, 0,(LPARAM)(LPCSTR)(lpszDeviceName))
+
+/* void Cls_OnTimeChange(HWND hwnd); */
+#define HANDLE_WM_TIMECHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_TIMECHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_TIMECHANGE, 0, 0L)
+
+/* void Cls_OnPower(HWND hwnd, int code); */
+#define HANDLE_WM_POWER(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_POWER(hwnd, code, fn) \
+ (void)(fn)((hwnd), WM_POWER, (WPARAM)(code), 0L)
+
+/* BOOL Cls_OnQueryEndSession(HWND hwnd); */
+#define HANDLE_WM_QUERYENDSESSION(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYENDSESSION(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYENDSESSION, 0, 0L)
+
+/* void Cls_OnEndSession(HWND hwnd, BOOL fEnding); */
+#define HANDLE_WM_ENDSESSION(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_ENDSESSION(hwnd, fEnding, fn) \
+ (void)(fn)((hwnd), WM_ENDSESSION, (WPARAM)(BOOL)(fEnding), 0L)
+
+/* void Cls_OnQuit(HWND hwnd, int exitCode); */
+#define HANDLE_WM_QUIT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_QUIT(hwnd, exitCode, fn) \
+ (void)(fn)((hwnd), WM_QUIT, (WPARAM)(exitCode), 0L)
+
+/* void Cls_OnSystemError(HWND hwnd, int errCode); */
+#define HANDLE_WM_SYSTEMERROR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_SYSTEMERROR(hwnd, errCode, fn) \
+ (void)(fn)((hwnd), WM_SYSTEMERROR, (WPARAM)(errCode), 0L)
+
+/* BOOL Cls_OnCreate(HWND hwnd, CREATESTRUCT FAR* lpCreateStruct) */
+#define HANDLE_WM_CREATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (CREATESTRUCT FAR*)(lParam)) ? 0L : (LRESULT)-1L)
+#define FORWARD_WM_CREATE(hwnd, lpCreateStruct, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_CREATE, 0, (LPARAM)(CREATESTRUCT FAR*)(lpCreateStruct))
+
+/* BOOL Cls_OnNCCreate(HWND hwnd, CREATESTRUCT FAR* lpCreateStruct) */
+#define HANDLE_WM_NCCREATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (CREATESTRUCT FAR*)(lParam))
+#define FORWARD_WM_NCCREATE(hwnd, lpCreateStruct, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_NCCREATE, 0, (LPARAM)(CREATESTRUCT FAR*)(lpCreateStruct))
+
+/* void Cls_OnDestroy(HWND hwnd); */
+#define HANDLE_WM_DESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DESTROY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DESTROY, 0, 0L)
+
+/* void Cls_OnNCDestroy(HWND hwnd); */
+#define HANDLE_WM_NCDESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_NCDESTROY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_NCDESTROY, 0, 0L)
+
+/* void Cls_OnShowWindow(HWND hwnd, BOOL fShow, UINT status); */
+#define HANDLE_WM_SHOWWINDOW(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), LOWORD(lParam)), 0L)
+#define FORWARD_WM_SHOWWINDOW(hwnd, fShow, status, fn) \
+ (void)(fn)((hwnd), WM_SHOWWINDOW, (WPARAM)(BOOL)(fShow), MAKELPARAM((UINT)(status), 0))
+
+/* void Cls_OnSetRedraw(HWND hwnd, BOOL fRedraw); */
+#define HANDLE_WM_SETREDRAW(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_SETREDRAW(hwnd, fRedraw, fn) \
+ (void)(fn)((hwnd), WM_SETREDRAW, (WPARAM)(fRedraw), 0L)
+
+/* void Cls_OnEnable(HWND hwnd, BOOL fEnable); */
+#define HANDLE_WM_ENABLE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_ENABLE(hwnd, fEnable, fn) \
+ (void)(fn)((hwnd), WM_ENABLE, (WPARAM)(BOOL)(fEnable), 0L)
+
+/* void Cls_OnSetText(HWND hwnd, LPCSTR lpszText); */
+#define HANDLE_WM_SETTEXT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_SETTEXT(hwnd, lpszText, fn) \
+ (void)(fn)((hwnd), WM_SETTEXT, 0, (LPARAM)(LPCSTR)(lpszText))
+
+/* INT Cls_OnGetText(HWND hwnd, int cchTextMax, LPSTR lpszText) */
+#define HANDLE_WM_GETTEXT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (int)(wParam), (LPSTR)(lParam))
+#define FORWARD_WM_GETTEXT(hwnd, cchTextMax, lpszText, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_GETTEXT, (WPARAM)(int)(cchTextMax), (LPARAM)(LPSTR)(lpszText))
+
+/* INT Cls_OnGetTextLength(HWND hwnd); */
+#define HANDLE_WM_GETTEXTLENGTH(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)(hwnd)
+#define FORWARD_WM_GETTEXTLENGTH(hwnd, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_GETTEXTLENGTH, 0, 0L)
+
+/* BOOL Cls_OnWindowPosChanging(HWND hwnd, WINDOWPOS FAR* lpwpos); */
+#define HANDLE_WM_WINDOWPOSCHANGING(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (WINDOWPOS FAR*)(lParam))
+#define FORWARD_WM_WINDOWPOSCHANGING(hwnd, lpwpos, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_WINDOWPOSCHANGING, 0, (LPARAM)(WINDOWPOS FAR*)(lpwpos))
+
+/* void Cls_OnWindowPosChanged(HWND hwnd, const WINDOWPOS FAR* lpwpos); */
+#define HANDLE_WM_WINDOWPOSCHANGED(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const WINDOWPOS FAR*)(lParam)), 0L)
+#define FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, fn) \
+ (void)(fn)((hwnd), WM_WINDOWPOSCHANGED, 0, (LPARAM)(const WINDOWPOS FAR*)(lpwpos))
+
+/* void Cls_OnMove(HWND hwnd, int x, int y); */
+#define HANDLE_WM_MOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_MOVE(hwnd, x, y, fn) \
+ (void)(fn)((hwnd), WM_MOVE, 0, MAKELPARAM((int)(x), (int)(y)))
+
+/* void Cls_OnSize(HWND hwnd, UINT state, int cx, int cy); */
+#define HANDLE_WM_SIZE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SIZE(hwnd, state, cx, cy, fn) \
+ (void)(fn)((hwnd), WM_SIZE, (WPARAM)(UINT)(state), MAKELPARAM((int)(cx), (int)(cy)))
+
+/* void Cls_OnClose(HWND hwnd); */
+#define HANDLE_WM_CLOSE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CLOSE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CLOSE, 0, 0L)
+
+/* BOOL Cls_OnQueryOpen(HWND hwnd); */
+#define HANDLE_WM_QUERYOPEN(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYOPEN(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYOPEN, 0, 0L)
+
+/* void Cls_OnGetMinMaxInfo(HWND hwnd, MINMAXINFO FAR* lpMinMaxInfo); */
+#define HANDLE_WM_GETMINMAXINFO(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (MINMAXINFO FAR*)(lParam)), 0L)
+#define FORWARD_WM_GETMINMAXINFO(hwnd, lpMinMaxInfo, fn) \
+ (void)(fn)((hwnd), WM_GETMINMAXINFO, 0, (LPARAM)(MINMAXINFO FAR*)(lpMinMaxInfo))
+
+/* void Cls_OnPaint(HWND hwnd); */
+#define HANDLE_WM_PAINT(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_PAINT(hwnd, fn) \
+ (void)(fn)((hwnd), WM_PAINT, 0, 0L)
+
+/* BOOL Cls_OnEraseBkgnd(HWND hwnd, HDC hdc); */
+#define HANDLE_WM_ERASEBKGND(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HDC)(wParam))
+#define FORWARD_WM_ERASEBKGND(hwnd, hdc, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_ERASEBKGND, (WPARAM)(HDC)(hdc), 0L)
+
+/* BOOL Cls_OnIconEraseBkgnd(HWND hwnd, HDC hdc); */
+#define HANDLE_WM_ICONERASEBKGND(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HDC)(wParam))
+#define FORWARD_WM_ICONERASEBKGND(hwnd, hdc, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_ICONERASEBKGND, (WPARAM)(HDC)(hdc), 0L)
+
+/* void Cls_OnNCPaint(HWND hwnd, HRGN hrgn); */
+#define HANDLE_WM_NCPAINT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HRGN)(wParam)), 0L)
+#define FORWARD_WM_NCPAINT(hwnd, hrgn, fn) \
+ (void)(fn)((hwnd), WM_NCPAINT, (WPARAM)(HRGN)(hrgn), 0L)
+
+/* UINT Cls_OnNCCalcSize(HWND hwnd, BOOL fCalcValidRects, NCCALCSIZE_PARAMS FAR* lpcsp) */
+#define HANDLE_WM_NCCALCSIZE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (BOOL)(wParam), (NCCALCSIZE_PARAMS FAR*)(lParam))
+#define FORWARD_WM_NCCALCSIZE(hwnd, fCalcValidRects, lpcsp, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_NCCALCSIZE, (WPARAM)(fCalcValidRects), (LPARAM)(NCCALCSIZE_PARAMS FAR*)(lpcsp))
+
+/* UINT Cls_OnNCHitTest(HWND hwnd, int x, int y); */
+#define HANDLE_WM_NCHITTEST(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_NCHITTEST(hwnd, x, y, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_NCHITTEST, 0, MAKELPARAM((int)(x), (int)(y)))
+
+/* HICON Cls_OnQueryDragIcon(HWND hwnd); */
+#define HANDLE_WM_QUERYDRAGICON(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd)
+#define FORWARD_WM_QUERYDRAGICON(hwnd, fn) \
+ (HICON)(UINT)(DWORD)(fn)((hwnd), WM_QUERYDRAGICON, 0, 0L)
+
+#ifdef _INC_SHELLAPI
+/* void Cls_OnDropFiles(HWND hwnd, HDROP hdrop); */
+#define HANDLE_WM_DROPFILES(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HDROP)(wParam)), 0L)
+#define FORWARD_WM_DROPFILES(hwnd, hdrop, fn) \
+ (void)(fn)((hwnd), WM_DROPFILES, (WPARAM)(hdrop), 0L)
+#endif /* _INC_SHELLAPI */
+
+/* void Cls_OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized); */
+#define HANDLE_WM_ACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (BOOL)HIWORD(lParam)), 0L)
+#define FORWARD_WM_ACTIVATE(hwnd, state, hwndActDeact, fMinimized, fn) \
+ (void)(fn)((hwnd), WM_ACTIVATE, (WPARAM)(UINT)(state), MAKELPARAM((UINT)(HWND)(hwndActDeact), (UINT)(BOOL)(fMinimized)))
+
+/* void Cls_OnActivateApp(HWND hwnd, BOOL fActivate, HTASK htaskActDeact); */
+#define HANDLE_WM_ACTIVATEAPP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), (HTASK)LOWORD(lParam)), 0L)
+#define FORWARD_WM_ACTIVATEAPP(hwnd, fActivate, htaskActDeact, fn) \
+ (void)(fn)((hwnd), WM_ACTIVATEAPP, (WPARAM)(BOOL)(fActivate), MAKELPARAM((htaskActDeact),0))
+
+/* BOOL Cls_OnNCActivate(HWND hwnd, BOOL fActive, HWND hwndActDeact, BOOL fMinimized); */
+#define HANDLE_WM_NCACTIVATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (BOOL)(wParam), (HWND)LOWORD(lParam), (BOOL)HIWORD(lParam))
+#define FORWARD_WM_NCACTIVATE(hwnd, fActive, hwndActDeact, fMinimized, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_NCACTIVATE, (WPARAM)(BOOL)(fActive), MAKELPARAM((UINT)(HWND)(hwndActDeact), (UINT)(BOOL)(fMinimized)))
+
+/* void Cls_OnSetFocus(HWND hwnd, HWND hwndOldFocus) */
+#define HANDLE_WM_SETFOCUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_SETFOCUS(hwnd, hwndOldFocus, fn) \
+ (void)(fn)((hwnd), WM_SETFOCUS, (WPARAM)(HWND)(hwndOldFocus), 0L)
+
+/* void Cls_OnKillFocus(HWND hwnd, HWND hwndNewFocus); */
+#define HANDLE_WM_KILLFOCUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_KILLFOCUS(hwnd, hwndNewFocus, fn) \
+ (void)(fn)((hwnd), WM_KILLFOCUS, (WPARAM)(HWND)(hwndNewFocus), 0L)
+
+/* void Cls_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_KEYDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), TRUE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_KEYDOWN(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_KEYDOWN, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_KEYUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), FALSE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_KEYUP(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_KEYUP, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_CHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_CHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_CHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat),0))
+
+/* void Cls_OnDeadChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_DEADCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_DEADCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_DEADCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat),0))
+
+/* void Cls_OnSysKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_SYSKEYDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), TRUE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSKEYDOWN(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_SYSKEYDOWN, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnSysKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_SYSKEYUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), FALSE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSKEYUP(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_SYSKEYUP, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnSysChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_SYSCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SYSCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_SYSCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat), 0))
+
+/* void Cls_OnSysDeadChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_SYSDEADCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SYSDEADCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_SYSDEADCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat), 0))
+
+/* void Cls_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MOUSEMOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MOUSEMOVE(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_MOUSEMOVE, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_LBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_LBUTTONDBLCLK : WM_LBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_LBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_LBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_RBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_RBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_RBUTTONDBLCLK : WM_RBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_RBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnRButtonUp(HWND hwnd, int x, int y, UINT flags); */
+#define HANDLE_WM_RBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_RBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_RBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_MBUTTONDBLCLK : WM_MBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnMButtonUp(HWND hwnd, int x, int y, UINT flags); */
+#define HANDLE_WM_MBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_MBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCMouseMove(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMOUSEMOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMOUSEMOVE(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCMOUSEMOVE, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCLBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCLBUTTONDBLCLK : WM_NCLBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCLButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCLBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCLBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCRBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCRBUTTONDBLCLK : WM_NCRBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCRButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCRBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCRBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCMBUTTONDBLCLK : WM_NCMBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCMButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCMBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* int Cls_OnMouseActivate(HWND hwnd, HWND hwndTopLevel, UINT codeHitTest, UINT msg); */
+#define HANDLE_WM_MOUSEACTIVATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (HWND)(wParam), (UINT)LOWORD(lParam), (UINT)HIWORD(lParam))
+#define FORWARD_WM_MOUSEACTIVATE(hwnd, hwndTopLevel, codeHitTest, msg, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_MOUSEACTIVATE, (WPARAM)(HWND)(hwndTopLevel), MAKELPARAM((codeHitTest), (msg)))
+
+/* void Cls_OnCancelMode(HWND hwnd); */
+#define HANDLE_WM_CANCELMODE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CANCELMODE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CANCELMODE, 0, 0L)
+
+/* void Cls_OnTimer(HWND hwnd, UINT id); */
+#define HANDLE_WM_TIMER(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam)), 0L)
+#define FORWARD_WM_TIMER(hwnd, id, fn) \
+ (void)(fn)((hwnd), WM_TIMER, (WPARAM)(UINT)(id), 0L)
+
+/* void Cls_OnInitMenu(HWND hwnd, HMENU hMenu); */
+#define HANDLE_WM_INITMENU(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)(wParam)), 0L)
+#define FORWARD_WM_INITMENU(hwnd, hMenu, fn) \
+ (void)(fn)((hwnd), WM_INITMENU, (WPARAM)(HMENU)(hMenu), 0L)
+
+/* void Cls_OnInitMenuPopup(HWND hwnd, HMENU hMenu, int item, BOOL fSystemMenu); */
+#define HANDLE_WM_INITMENUPOPUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)(wParam), (int)LOWORD(lParam), (BOOL)HIWORD(lParam)), 0L)
+#define FORWARD_WM_INITMENUPOPUP(hwnd, hMenu, item, fSystemMenu, fn) \
+ (void)(fn)((hwnd), WM_INITMENUPOPUP, (WPARAM)(HMENU)(hMenu), MAKELPARAM((item),(fSystemMenu)))
+
+/* void Cls_OnMenuSelect(HWND hwnd, HMENU hmenu, int item, HMENU hmenuPopup, UINT flags); */
+#define HANDLE_WM_MENUSELECT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)HIWORD(lParam), (LOWORD(lParam) & MF_POPUP) ? 0 : (int)(wParam), \
+ (LOWORD(lParam) & MF_POPUP) ? (HMENU)(wParam) : 0, LOWORD(lParam)), 0L)
+#define FORWARD_WM_MENUSELECT(hwnd, hmenu, item, hmenuPopup, flags, fn) \
+ (void)(fn)((hwnd), WM_MENUSELECT, ((flags) & MF_POPUP) ? (WPARAM)(HMENU)(hmenuPopup) : (WPARAM)(int)(item), MAKELPARAM((flags), (hmenu)))
+
+/* DWORD Cls_OnMenuChar(HWND hwnd, UINT ch, UINT flags, HMENU hmenu); */
+#define HANDLE_WM_MENUCHAR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam), LOWORD(lParam), (HMENU)HIWORD(lParam));
+#define FORWARD_WM_MENUCHAR(hwnd, ch, flags, hmenu, fn) \
+ (DWORD)(fn)((hwnd), WM_MENUCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((flags), (UINT)(hmenu)))
+
+/* void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); */
+#define HANDLE_WM_COMMAND(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), (HWND)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \
+ (void)(fn)((hwnd), WM_COMMAND, (WPARAM)(int)(id), MAKELPARAM((UINT)(hwndCtl), (codeNotify)))
+
+/* void Cls_OnHScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos); */
+#define HANDLE_WM_HSCROLL(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)HIWORD(lParam), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_HSCROLL(hwnd, hwndCtl, code, pos, fn) \
+ (void)(fn)((hwnd), WM_HSCROLL, (WPARAM)(UINT)(code), MAKELPARAM((pos), (UINT)(hwndCtl)))
+
+/* void Cls_OnVScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos); */
+#define HANDLE_WM_VSCROLL(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)HIWORD(lParam), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_VSCROLL(hwnd, hwndCtl, code, pos, fn) \
+ (void)(fn)((hwnd), WM_VSCROLL, (WPARAM)(UINT)(code), MAKELPARAM((pos), (UINT)(hwndCtl)))
+
+/* void Cls_OnCut(HWND hwnd); */
+#define HANDLE_WM_CUT(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CUT(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CUT, 0, 0L)
+
+/* void Cls_OnCopy(HWND hwnd); */
+#define HANDLE_WM_COPY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_COPY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_COPY, 0, 0L)
+
+/* void Cls_OnPaste(HWND hwnd); */
+#define HANDLE_WM_PASTE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_PASTE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_PASTE, 0, 0L)
+
+/* void Cls_OnClear(HWND hwnd); */
+#define HANDLE_WM_CLEAR(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CLEAR(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CLEAR, 0, 0L)
+
+/* void Cls_OnUndo(HWND hwnd); */
+#define HANDLE_WM_UNDO(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_UNDO(hwnd, fn) \
+ (void)(fn)((hwnd), WM_UNDO, 0, 0L)
+
+/* HANDLE Cls_OnRenderFormat(HWND hwnd, UINT fmt); */
+#define HANDLE_WM_RENDERFORMAT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HANDLE)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_RENDERFORMAT(hwnd, fmt, fn) \
+ (HANDLE)(UINT)(DWORD)(fn)((hwnd), WM_RENDERFORMAT, (WPARAM)(UINT)(fmt), 0L)
+
+/* void Cls_OnRenderAllFormats(HWND hwnd); */
+#define HANDLE_WM_RENDERALLFORMATS(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_RENDERALLFORMATS(hwnd, fn) \
+ (void)(fn)((hwnd), WM_RENDERALLFORMATS, 0, 0L)
+
+/* void Cls_OnDestroyClipboard(HWND hwnd); */
+#define HANDLE_WM_DESTROYCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DESTROYCLIPBOARD(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DESTROYCLIPBOARD, 0, 0L)
+
+/* void Cls_OnDrawClipboard(HWND hwnd); */
+#define HANDLE_WM_DRAWCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DRAWCLIPBOARD(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DRAWCLIPBOARD, 0, 0L)
+
+/* void Cls_OnPaintClipboard(HWND hwnd, HWND hwndCBViewer, const PAINTSTRUCT FAR* lpPaintStruct) */
+#define HANDLE_WM_PAINTCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (const PAINTSTRUCT FAR*)GlobalLock((HGLOBAL)LOWORD(lParam))), GlobalUnlock((HGLOBAL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_PAINTCLIPBOARD(hwnd, hwndCBViewer, lpPaintStruct, fn) \
+ (void)(fn)((hwnd), WM_PAINTCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), (LPARAM)(lpPaintStruct))
+
+/* void Cls_OnSizeClipboard(HWND hwnd, HWND hwndCBViewer, const RECT FAR* lprc); */
+#define HANDLE_WM_SIZECLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (const RECT FAR*)GlobalLock((HGLOBAL)LOWORD(lParam))), GlobalUnlock((HGLOBAL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SIZECLIPBOARD(hwnd, hwndCBViewer, lprc, fn) \
+ (void)(fn)((hwnd), WM_SIZECLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), (LPARAM)(lprc))
+
+/* void Cls_OnVScrollClipboard(HWND hwnd, HWND hwndCBViewer, UINT code, int pos); */
+#define HANDLE_WM_VSCROLLCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_VSCROLLCLIPBOARD(hwnd, hwndCBViewer, code, pos, fn) \
+ (void)(fn)((hwnd), WM_VSCROLLCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), MAKELPARAM((code), (pos)))
+
+/* void Cls_OnHScrollClipboard(HWND hwnd, HWND hwndCBViewer, UINT code, int pos); */
+#define HANDLE_WM_HSCROLLCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_HSCROLLCLIPBOARD(hwnd, hwndCBViewer, code, pos, fn) \
+ (void)(fn)((hwnd), WM_HSCROLLCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), MAKELPARAM((code), (pos)))
+
+/* void Cls_OnAskCBFormatName(HWND hwnd, int cchMax, LPSTR rgchName); */
+#define HANDLE_WM_ASKCBFORMATNAME(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), (LPSTR)(lParam)), 0L)
+#define FORWARD_WM_ASKCBFORMATNAME(hwnd, cchMax, rgchName, fn) \
+ (void)(fn)((hwnd), WM_ASKCBFORMATNAME, (WPARAM)(int)(cchMax), (LPARAM)(rgchName))
+
+/* void Cls_OnChangeCBChain(HWND hwnd, HWND hwndRemove, HWND hwndNext); */
+#define HANDLE_WM_CHANGECBCHAIN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (HWND)LOWORD(lParam)), 0L)
+#define FORWARD_WM_CHANGECBCHAIN(hwnd, hwndRemove, hwndNext, fn) \
+ (void)(fn)((hwnd), WM_CHANGECBCHAIN, (WPARAM)(HWND)(hwndRemove), MAKELPARAM((UINT)(hwndNext), 0))
+
+/* BOOL Cls_OnSetCursor(HWND hwnd, HWND hwndCursor, UINT codeHitTest, UINT msg); */
+#define HANDLE_WM_SETCURSOR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HWND)(wParam), (UINT)LOWORD(lParam), (UINT)HIWORD(lParam));
+#define FORWARD_WM_SETCURSOR(hwnd, hwndCursor, codeHitTest, msg, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_SETCURSOR, (WPARAM)(HWND)(hwndCursor), MAKELPARAM((codeHitTest), (msg)))
+
+/* void Cls_OnSysCommand(HWND hwnd, UINT cmd, int x, int y); */
+#define HANDLE_WM_SYSCOMMAND(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSCOMMAND(hwnd, cmd, x, y, fn) \
+ (void)(fn)((hwnd), WM_SYSCOMMAND, (WPARAM)(UINT)(cmd), MAKELPARAM((x), (y)))
+
+/* HWND Cls_MDICreate(HWND hwnd, const MDICREATESTRUCT FAR* lpmcs); */
+#define HANDLE_WM_MDICREATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (MDICREATESTRUCT FAR*)(lParam))
+#define FORWARD_WM_MDICREATE(hwnd, lpmcs, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDICREATE, 0, (LPARAM)(lpmcs))
+
+/* void Cls_MDIDestroy(HWND hwnd, HWND hwndDestroy); */
+#define HANDLE_WM_MDIDESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIDESTROY(hwnd, hwndDestroy, fn) \
+ (void)(fn)((hwnd), WM_MDIDESTROY, (WPARAM)(hwndDestroy), 0L)
+
+/* NOTE: Usable only by MDI client windows */
+/* void Cls_MDIActivate(HWND hwnd, BOOL fActive, HWND hwndActivate, HWND hwndDeactivate); */
+#define HANDLE_WM_MDIACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), (HWND)LOWORD(lParam), (HWND)HIWORD(lParam)), 0L)
+#define FORWARD_WM_MDIACTIVATE(hwnd, fActive, hwndActivate, hwndDeactivate, fn) \
+ (void)(fn)(hwnd, WM_MDIACTIVATE, (WPARAM)(fActive), MAKELPARAM((hwndActivate), (hwndDeactivate)))
+
+/* void Cls_MDIRestore(HWND hwnd, HWND hwndRestore); */
+#define HANDLE_WM_MDIRESTORE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIRESTORE(hwnd, hwndRestore, fn) \
+ (void)(fn)((hwnd), WM_MDIRESTORE, (WPARAM)(hwndRestore), 0L)
+
+/* HWND Cls_MDINext(HWND hwnd, HWND hwndCur, BOOL fPrev); */
+#define HANDLE_WM_MDINEXT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (BOOL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_MDINEXT(hwnd, hwndCur, fPrev, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDINEXT, (WPARAM)(hwndCur), MAKELPARAM((fPrev), 0))
+
+/* void Cls_MDIMaximize(HWND hwnd, HWND hwndMaximize); */
+#define HANDLE_WM_MDIMAXIMIZE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIMAXIMIZE(hwnd, hwndMaximize, fn) \
+ (void)(fn)((hwnd), WM_MDIMAXIMIZE, (WPARAM)(hwndMaximize), 0L)
+
+/* BOOL Cls_MDITile(HWND hwnd, UINT cmd); */
+#define HANDLE_WM_MDITILE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_MDITILE(hwnd, cmd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_MDITILE, (WPARAM)(cmd), 0L)
+
+/* BOOL Cls_MDICascade(HWND hwnd, UINT cmd); */
+#define HANDLE_WM_MDICASCADE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_MDICASCADE(hwnd, cmd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_MDICASCADE, (WPARAM)(cmd), 0L)
+
+/* void Cls_MDIIconArrange(HWND hwnd); */
+#define HANDLE_WM_MDIICONARRANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_MDIICONARRANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_MDIICONARRANGE, 0, 0L)
+
+/* HWND Cls_MDIGetActive(HWND hwnd); */
+#define HANDLE_WM_MDIGETACTIVE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd)
+#define FORWARD_WM_MDIGETACTIVE(hwnd, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDIGETACTIVE, 0, 0L)
+
+/* HMENU Cls_MDISetMenu(HWND hwnd, BOOL fRefresh, HMENU hmenuFrame, HMENU hmenuWindow); */
+#define HANDLE_WM_MDISETMENU(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (BOOL)(wParam), (HMENU)LOWORD(lParam), (HMENU)HIWORD(lParam))
+#define FORWARD_WM_MDISETMENU(hwnd, fRefresh, hmenuFrame, hmenuWindow, fn) \
+ (HMENU)(UINT)(DWORD)(fn)((hwnd), WM_MDISETMENU, (WPARAM)(fRefresh), MAKELPARAM((hmenuFrame), (hmenuWindow)))
+
+/* void Cls_OnChildActivate(HWND hwnd); */
+#define HANDLE_WM_CHILDACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CHILDACTIVATE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CHILDACTIVATE, 0, 0L)
+
+/* BOOL Cls_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam); */
+#define HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd), (HWND)(wParam), lParam);
+#define FORWARD_WM_INITDIALOG(hwnd, hwndFocus, lParam, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_INITDIALOG, (WPARAM)(HWND)(hwndFocus), (lParam))
+
+/* HWND Cls_OnNextDlgCtl(HWND hwnd, HWND hwndSetFocus, BOOL fNext) */
+#define HANDLE_WM_NEXTDLGCTL(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HWND)(fn)((hwnd), (HWND)(wParam), (BOOL)LOWORD(lParam))
+#define FORWARD_WM_NEXTDLGCTL(hwnd, hwndSetFocus, fNext, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_NEXTDLGCTL, (WPARAM)(HWND)(hwndSetFocus), MAKELPARAM((fNext), 0))
+
+/* void Cls_OnParentNotify(HWND hwnd, UINT msg, HWND hwndChild, int idChild); */
+#define HANDLE_WM_PARENTNOTIFY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_PARENTNOTIFY(hwnd, msg, hwndChild, idChild, fn) \
+ (void)(fn)((hwnd), WM_PARENTNOTIFY, (WPARAM)(UINT)(msg), MAKELPARAM((UINT)(HWND)(hwndChild), (UINT)(idChild)))
+
+/* void Cls_OnEnterIdle(HWND hwnd, UINT source, HWND hwndSource); */
+#define HANDLE_WM_ENTERIDLE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam)), 0L)
+#define FORWARD_WM_ENTERIDLE(hwnd, source, hwndSource, fn) \
+ (void)(fn)((hwnd), WM_ENTERIDLE, (WPARAM)(UINT)(source), MAKELPARAM((UINT)(HWND)(hwndSource), 0))
+
+/* UINT Cls_OnGetDlgCode(HWND hwnd, MSG FAR* lpmsg); */
+#define HANDLE_WM_GETDLGCODE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd, (MSG FAR*)(lParam))
+#define FORWARD_WM_GETDLGCODE(hwnd, lpmsg, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_GETDLGCODE, (SELECTOROF(lpmsg) ? lpmsg->wParam : 0), (LPARAM)(lpmsg))
+
+/* HBRUSH Cls_OnCtlColor(HWND hwnd, HDC hdc, HWND hwndChild, int type); */
+#define HANDLE_WM_CTLCOLOR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd), (HDC)(wParam), (HWND)LOWORD(lParam), (int)(HIWORD(lParam)))
+#define FORWARD_WM_CTLCOLOR(hwnd, hdc, hwndChild, type, fn) \
+ (HBRUSH)(UINT)(DWORD)(fn)((hwnd), WM_CTLCOLOR, (WPARAM)(HDC)(hdc), MAKELPARAM((UINT)(HWND)(hwndChild), (UINT)(int)(type)))
+
+/* void Cls_OnSetFont(HWND hwndCtl, HFONT hfont, BOOL fRedraw); */
+#define HANDLE_WM_SETFONT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HFONT)(wParam), (BOOL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SETFONT(hwnd, hfont, fRedraw, fn) \
+ (void)(fn)((hwnd), WM_SETFONT, (WPARAM)(HFONT)(hfont), MAKELPARAM((UINT)(BOOL)(fRedraw), 0))
+
+/* HFONT Cls_OnGetFont(HWND hwnd); */
+#define HANDLE_WM_GETFONT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HFONT)(fn)(hwnd)
+#define FORWARD_WM_GETFONT(hwnd, fn) \
+ (HFONT)(UINT)(DWORD)(fn)((hwnd), WM_GETFONT, 0, 0L)
+
+/* void Cls_OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT FAR* lpDrawItem); */
+#define HANDLE_WM_DRAWITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const DRAWITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_DRAWITEM(hwnd, lpDrawItem, fn) \
+ (void)(fn)((hwnd), WM_DRAWITEM, 0, (LPARAM)(const DRAWITEMSTRUCT FAR*)(lpDrawItem))
+
+/* void Cls_OnMeasureItem(HWND hwnd, MEASUREITEMSTRUCT FAR* lpMeasureItem); */
+#define HANDLE_WM_MEASUREITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (MEASUREITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_MEASUREITEM(hwnd, lpMeasureItem, fn) \
+ (void)(fn)((hwnd), WM_MEASUREITEM, 0, (LPARAM)(MEASUREITEMSTRUCT FAR*)(lpMeasureItem))
+
+/* void Cls_OnDeleteItem(HWND hwnd, const DELETEITEMSTRUCT FAR* lpDeleteItem) */
+#define HANDLE_WM_DELETEITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const DELETEITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_DELETEITEM(hwnd, lpDeleteItem, fn) \
+ (void)(fn)((hwnd), WM_DELETEITEM, 0, (LPARAM)(const DELETEITEMSTRUCT FAR*)(lpDeleteItem))
+
+/* int Cls_OnCompareItem(HWND hwnd, const COMPAREITEMSTRUCT FAR* lpCompareItem); */
+#define HANDLE_WM_COMPAREITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (const COMPAREITEMSTRUCT FAR*)(lParam))
+#define FORWARD_WM_COMPAREITEM(hwnd, lpCompareItem, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_COMPAREITEM, 0, (LPARAM)(const COMPAREITEMSTRUCT FAR*)(lpCompareItem))
+
+/* int Cls_OnVkeyToItem(HWND hwnd, UINT vk, HWND hwndListbox, int iCaret); */
+#define HANDLE_WM_VKEYTOITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_VKEYTOITEM(hwnd, vk, hwndListBox, iCaret, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_VKEYTOITEM, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(hwndListBox), (UINT)(iCaret)))
+
+/* int Cls_OnCharToItem(HWND hwnd, UINT ch, HWND hwndListbox, int iCaret); */
+#define HANDLE_WM_CHARTOITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_CHARTOITEM(hwnd, ch, hwndListBox, iCaret, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_CHARTOITEM, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(hwndListBox), (UINT)(iCaret)))
+
+/* void Cls_OnQueueSync(HWND hwnd); */
+#define HANDLE_WM_QUEUESYNC(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_QUEUESYNC(hwnd, fn) \
+ (void)(fn)((hwnd), WM_QUEUESYNC, 0, 0L)
+
+/* void Cls_OnCommNotify(HWND hwnd, int cid, UINT flags); */
+#define HANDLE_WM_COMMNOTIFY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), LOWORD(lParam)), 0L)
+#define FORWARD_WM_COMMNOTIFY(hwnd, cid, flags, fn) \
+ (void)(fn)((hwnd), WM_COMMNOTIFY, (WPARAM)(cid), MAKELPARAM((flags), 0))
+
+/****** Static control message APIs ******************************************/
+
+#define Static_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Static_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Static_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Static_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Static_SetIcon(hwndCtl, hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl), STM_SETICON, (WPARAM)(HICON)(hIcon), 0L))
+#define Static_GetIcon(hwndCtl, hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl), STM_GETICON, 0, 0L))
+
+/****** Button control message APIs ******************************************/
+
+#define Button_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Button_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Button_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Button_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Button_GetCheck(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), BM_GETCHECK, 0, 0L))
+#define Button_SetCheck(hwndCtl, check) ((void)SendMessage((hwndCtl), BM_SETCHECK, (WPARAM)(int)(check), 0L))
+
+#define Button_GetState(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), BM_GETSTATE, 0, 0L))
+#define Button_SetState(hwndCtl, state) ((UINT)(DWORD)SendMessage((hwndCtl), BM_SETSTATE, (WPARAM)(int)(state), 0L))
+
+#define Button_SetStyle(hwndCtl, style, fRedraw) ((void)SendMessage((hwndCtl), BM_SETSTYLE, (WPARAM)LOWORD(style), MAKELPARAM(((fRedraw) ? TRUE : FALSE), 0)))
+
+/****** Edit control message APIs ********************************************/
+
+#define Edit_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Edit_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Edit_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Edit_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Edit_LimitText(hwndCtl, cchMax) ((void)SendMessage((hwndCtl), EM_LIMITTEXT, (WPARAM)(cchMax), 0L))
+
+#define Edit_GetLineCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), EM_GETLINECOUNT, 0, 0L))
+#define Edit_GetLine(hwndCtl, line, lpch, cchMax) ((*((int FAR*)(lpch)) = (cchMax)), ((int)(DWORD)SendMessage((hwndCtl), EM_GETLINE, (WPARAM)(int)(line), (LPARAM)(LPSTR)(lpch))))
+
+#define Edit_GetRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_GETRECT, 0, (LPARAM)(RECT FAR*)(lprc)))
+#define Edit_SetRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_SETRECT, 0, (LPARAM)(const RECT FAR*)(lprc)))
+#define Edit_SetRectNoPaint(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_SETRECTNP, 0, (LPARAM)(const RECT FAR*)(lprc)))
+
+#define Edit_GetSel(hwndCtl) ((DWORD)SendMessage((hwndCtl), EM_GETSEL, 0, 0L))
+#define Edit_SetSel(hwndCtl, ichStart, ichEnd) ((void)SendMessage((hwndCtl), EM_SETSEL, 0, MAKELPARAM((ichStart), (ichEnd))))
+#define Edit_ReplaceSel(hwndCtl, lpszReplace) ((void)SendMessage((hwndCtl), EM_REPLACESEL, 0, (LPARAM)(LPCSTR)(lpszReplace)))
+
+#define Edit_GetModify(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_GETMODIFY, 0, 0L))
+#define Edit_SetModify(hwndCtl, fModified) ((void)SendMessage((hwndCtl), EM_SETMODIFY, (WPARAM)(UINT)(fModified), 0L))
+
+#define Edit_LineFromChar(hwndCtl, ich) ((int)(DWORD)SendMessage((hwndCtl), EM_LINEFROMCHAR, (WPARAM)(int)(ich), 0L))
+#define Edit_LineIndex(hwndCtl, line) ((int)(DWORD)SendMessage((hwndCtl), EM_LINEINDEX, (WPARAM)(int)(line), 0L))
+#define Edit_LineLength(hwndCtl, line) ((int)(DWORD)SendMessage((hwndCtl), EM_LINELENGTH, (WPARAM)(int)(line), 0L))
+
+#define Edit_Scroll(hwndCtl, dv, dh) ((void)SendMessage((hwndCtl), EM_LINESCROLL, 0, MAKELPARAM((dv), (dh))))
+
+#define Edit_CanUndo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_CANUNDO, 0, 0L))
+#define Edit_Undo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_UNDO, 0, 0L))
+#define Edit_EmptyUndoBuffer(hwndCtl) ((void)SendMessage((hwndCtl), EM_EMPTYUNDOBUFFER, 0, 0L))
+
+#define Edit_SetPasswordChar(hwndCtl, ch) ((void)SendMessage((hwndCtl), EM_SETPASSWORDCHAR, (WPARAM)(UINT)(ch), 0L))
+
+#define Edit_SetTabStops(hwndCtl, cTabs, lpTabs) ((void)SendMessage((hwndCtl), EM_SETTABSTOPS, (WPARAM)(int)(cTabs), (LPARAM)(const int FAR*)(lpTabs)))
+
+#define Edit_FmtLines(hwndCtl, fAddEOL) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_FMTLINES, (WPARAM)(BOOL)(fAddEOL), 0L))
+
+#define Edit_GetHandle(hwndCtl) ((HLOCAL)(UINT)(DWORD)SendMessage((hwndCtl), EM_GETHANDLE, 0, 0L))
+#define Edit_SetHandle(hwndCtl, h) ((void)SendMessage((hwndCtl), EM_SETHANDLE, (WPARAM)(UINT)(HLOCAL)(h), 0L))
+
+#if (WINVER >= 0x030a)
+#define Edit_GetFirstVisibleLine(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), EM_GETFIRSTVISIBLELINE, 0, 0L))
+
+#define Edit_SetReadOnly(hwndCtl, fReadOnly) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_SETREADONLY, (WPARAM)(BOOL)(fReadOnly), 0L))
+
+#define Edit_GetPasswordChar(hwndCtl) ((char)(DWORD)SendMessage((hwndCtl), EM_GETPASSWORDCHAR, 0, 0L))
+
+#define Edit_SetWordBreakProc(hwndCtl, lpfnWordBreak) ((void)SendMessage((hwndCtl), EM_SETWORDBREAKPROC, 0, (LPARAM)(EDITWORDBREAKPROC)(lpfnWordBreak)))
+#define Edit_GetWordBreakProc(hwndCtl) ((EDITWORDBREAKPROC)SendMessage((hwndCtl), EM_GETWORDBREAKPROC, 0, 0L))
+#endif /* WINVER >= 0x030a */
+
+/****** ScrollBar control message APIs ***************************************/
+
+/* NOTE: flags parameter is a collection of ESB_* values, NOT a boolean! */
+#define ScrollBar_Enable(hwndCtl, flags) EnableScrollBar((hwndCtl), SB_CTL, (flags))
+
+#define ScrollBar_Show(hwndCtl, fShow) ShowWindow((hwndCtl), (fShow) ? SW_SHOWNORMAL : SW_HIDE)
+
+#define ScrollBar_SetPos(hwndCtl, pos, fRedraw) SetScrollPos((hwndCtl), SB_CTL, (pos), (fRedraw))
+#define ScrollBar_GetPos(hwndCtl) GetScrollPos((hwndCtl), SB_CTL)
+
+#define ScrollBar_SetRange(hwndCtl, posMin, posMax, fRedraw) SetScrollRange((hwndCtl), SB_CTL, (posMin), (posMax), (fRedraw))
+#define ScrollBar_GetRange(hwndCtl, lpposMin, lpposMax) GetScrollRange((hwndCtl), SB_CTL, (lpposMin), (lpposMax))
+
+/****** ListBox control message APIs *****************************************/
+
+#define ListBox_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define ListBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCOUNT, 0, 0L))
+#define ListBox_ResetContent(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), LB_RESETCONTENT, 0, 0L))
+
+#define ListBox_AddString(hwndCtl, lpsz) ((int)(DWORD)SendMessage((hwndCtl), LB_ADDSTRING, 0, (LPARAM)(LPCSTR)(lpsz)))
+#define ListBox_InsertString(hwndCtl, index, lpsz) ((int)(DWORD)SendMessage((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpsz)))
+
+#define ListBox_AddItemData(hwndCtl, data) ((int)(DWORD)SendMessage((hwndCtl), LB_ADDSTRING, 0, (LPARAM)(data)))
+#define ListBox_InsertItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ListBox_DeleteString(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_DELETESTRING, (WPARAM)(int)(index), 0L))
+
+#define ListBox_GetTextLen(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTEXTLEN, (WPARAM)(int)(index), 0L))
+#define ListBox_GetText(hwndCtl, index, lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTEXT, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpszBuffer)))
+
+#define ListBox_GetItemData(hwndCtl, index) ((LRESULT)(DWORD)SendMessage((hwndCtl), LB_GETITEMDATA, (WPARAM)(int)(index), 0L))
+#define ListBox_SetItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), LB_SETITEMDATA, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ListBox_FindString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ListBox_FindItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ListBox_SetSel(hwndCtl, fSelect, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETSEL, (WPARAM)(BOOL)(fSelect), MAKELPARAM((index), 0)))
+#define ListBox_SelItemRange(hwndCtl, fSelect, first, last) ((int)(DWORD)SendMessage((hwndCtl), LB_SELITEMRANGE, (WPARAM)(BOOL)(fSelect), MAKELPARAM((first), (last))))
+
+#define ListBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCURSEL, 0, 0L))
+#define ListBox_SetCurSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETCURSEL, (WPARAM)(int)(index), 0L))
+
+#define ListBox_SelectString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ListBox_SelectItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), LB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ListBox_GetSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSEL, (WPARAM)(int)(index), 0L))
+#define ListBox_GetSelCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSELCOUNT, 0, 0L))
+#define ListBox_GetTopIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTOPINDEX, 0, 0L))
+#define ListBox_GetSelItems(hwndCtl, cItems, lpItems) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSELITEMS, (WPARAM)(int)(cItems), (LPARAM)(int FAR*)(lpItems)))
+
+#define ListBox_SetTopIndex(hwndCtl, indexTop) ((int)(DWORD)SendMessage((hwndCtl), LB_SETTOPINDEX, (WPARAM)(int)(indexTop), 0L))
+
+#define ListBox_SetColumnWidth(hwndCtl, cxColumn) ((void)SendMessage((hwndCtl), LB_SETCOLUMNWIDTH, (WPARAM)(int)(cxColumn), 0L))
+#define ListBox_GetHorizontalExtent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETHORIZONTALEXTENT, 0, 0L))
+#define ListBox_SetHorizontalExtent(hwndCtl, cxExtent) ((void)SendMessage((hwndCtl), LB_SETHORIZONTALEXTENT, (WPARAM)(int)(cxExtent), 0L))
+
+#define ListBox_SetTabStops(hwndCtl, cTabs, lpTabs) ((BOOL)(DWORD)SendMessage((hwndCtl), LB_SETTABSTOPS, (WPARAM)(int)(cTabs), (LPARAM)(int FAR*)(lpTabs)))
+
+#define ListBox_GetItemRect(hwndCtl, index, lprc) ((int)(DWORD)SendMessage((hwndCtl), LB_GETITEMRECT, (WPARAM)(int)(index), (LPARAM)(RECT FAR*)(lprc)))
+
+#define ListBox_SetCaretIndex(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETCARETINDEX, (WPARAM)(int)(index), 0L))
+#define ListBox_GetCaretIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCARETINDEX, 0, 0L))
+
+#define ListBox_SetAnchorIndex(hwndCtl, index) ((void)SendMessage((hwndCtl), LB_SETANCHORINDEX, (WPARAM)(int)(index), 0L)) /* ;Internal */
+#define ListBox_GetAnchorIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETANCHORINDEX, 0, 0L)) /* ;Internal */
+
+#if (WINVER >= 0x030a)
+#define ListBox_FindStringExact(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRINGEXACT, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+
+#define ListBox_SetItemHeight(hwndCtl, index, cy) ((int)(DWORD)SendMessage((hwndCtl), LB_SETITEMHEIGHT, (WPARAM)(int)(index), MAKELPARAM((cy), 0)))
+#define ListBox_GetItemHeight(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETITEMHEIGHT, (WPARAM)(int)(index), 0L))
+#endif /* WINVER >= 0x030a */
+
+#define ListBox_Dir(hwndCtl, attrs, lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl), LB_DIR, (WPARAM)(UINT)(attrs), (LPARAM)(LPCSTR)(lpszFileSpec)))
+#define ListBox_AddFile(hwndCtl, lpszFilename) ((int)(DWORD)SendMessage((hwndCtl), LB_ADDFILE, 0, (LPARAM)(LPCSTR)(lpszFilename))) /* ;Internal */
+
+/****** ComboBox control message APIs ****************************************/
+
+#define ComboBox_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define ComboBox_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define ComboBox_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define ComboBox_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define ComboBox_LimitText(hwndCtl, cchLimit) ((int)(DWORD)SendMessage((hwndCtl), CB_LIMITTEXT, (WPARAM)(int)(cchLimit), 0L))
+
+#define ComboBox_GetEditSel(hwndCtl) ((DWORD)SendMessage((hwndCtl), CB_GETEDITSEL, 0, 0L))
+#define ComboBox_SetEditSel(hwndCtl, ichStart, ichEnd) ((int)(DWORD)SendMessage((hwndCtl), CB_SETEDITSEL, 0, MAKELPARAM((ichStart), (ichEnd))))
+
+#define ComboBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETCOUNT, 0, 0L))
+#define ComboBox_ResetContent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_RESETCONTENT, 0, 0L))
+
+#define ComboBox_AddString(hwndCtl, lpsz) ((int)(DWORD)SendMessage((hwndCtl), CB_ADDSTRING, 0, (LPARAM)(LPCSTR)(lpsz)))
+#define ComboBox_InsertString(hwndCtl, index, lpsz) ((int)(DWORD)SendMessage((hwndCtl), CB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpsz)))
+
+#define ComboBox_AddItemData(hwndCtl, data) ((int)(DWORD)SendMessage((hwndCtl), CB_ADDSTRING, 0, (LPARAM)(data)))
+#define ComboBox_InsertItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), CB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ComboBox_DeleteString(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_DELETESTRING, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_GetLBTextLen(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_GETLBTEXTLEN, (WPARAM)(int)(index), 0L))
+#define ComboBox_GetLBText(hwndCtl, index, lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl), CB_GETLBTEXT, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpszBuffer)))
+
+#define ComboBox_GetItemData(hwndCtl, index) ((LRESULT)(DWORD)SendMessage((hwndCtl), CB_GETITEMDATA, (WPARAM)(int)(index), 0L))
+#define ComboBox_SetItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), CB_SETITEMDATA, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ComboBox_FindString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ComboBox_FindItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ComboBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETCURSEL, 0, 0L))
+#define ComboBox_SetCurSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_SETCURSEL, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_SelectString(hwndCtl, indexStart, lpszSelect) ((int)(DWORD)SendMessage((hwndCtl), CB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszSelect)))
+#define ComboBox_SelectItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), CB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ComboBox_Dir(hwndCtl, attrs, lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl), CB_DIR, (WPARAM)(UINT)(attrs), (LPARAM)(LPCSTR)(lpszFileSpec)))
+
+#define ComboBox_ShowDropdown(hwndCtl, fShow) ((BOOL)(DWORD)SendMessage((hwndCtl), CB_SHOWDROPDOWN, (WPARAM)(BOOL)(fShow), 0L))
+
+#if (WINVER >= 0x030a)
+#define ComboBox_FindStringExact(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRINGEXACT, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+
+#define ComboBox_GetDroppedState(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), CB_GETDROPPEDSTATE, 0, 0L))
+#define ComboBox_GetDroppedControlRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)(RECT FAR*)(lprc)))
+
+#define ComboBox_GetItemHeight(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETITEMHEIGHT, 0, 0L))
+#define ComboBox_SetItemHeight(hwndCtl, cyItem) ((int)(DWORD)SendMessage((hwndCtl), CB_SETITEMHEIGHT, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_GetExtendedUI(hwndCtl) ((UINT)(DWORD)SendMessage((hwndCtl), CB_GETEXTENDEDUI, 0, 0L))
+#define ComboBox_SetExtendedUI(hwndCtl, flags) ((int)(DWORD)SendMessage((hwndCtl), CB_SETEXTENDEDUI, (WPARAM)(UINT)(flags), 0L))
+#endif /* WINVER >= 0x030a */
+
+/****** Alternate porting layer macros ****************************************/
+
+/* USER MESSAGES: */
+
+#define GET_WPARAM(wp, lp) (wp)
+#define GET_LPARAM(wp, lp) (lp)
+
+#define GET_WM_ACTIVATE_STATE(wp, lp) (wp)
+#define GET_WM_ACTIVATE_FMINIMIZED(wp, lp) (BOOL)HIWORD(lp)
+#define GET_WM_ACTIVATE_HWND(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_ACTIVATE_MPS(s, fmin, hwnd) \
+ (WPARAM)(s), MAKELONG(hwnd, fmin)
+
+#define GET_WM_CHARTOITEM_CHAR(wp, lp) (CHAR)(wp)
+#define GET_WM_CHARTOITEM_POS(wp, lp) HIWORD(lp)
+#define GET_WM_CHARTOITEM_HWND(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_CHARTOITEM_MPS(ch, pos, hwnd) \
+ (WPARAM)(ch), MAKELONG(hwnd, pos)
+
+#define GET_WM_COMMAND_ID(wp, lp) (wp)
+#define GET_WM_COMMAND_HWND(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(lp)
+#define GET_WM_COMMAND_MPS(id, hwnd, cmd) \
+ (WPARAM)(id), MAKELONG(hwnd, cmd)
+
+#define WM_CTLCOLORMSGBOX 0x0132
+#define WM_CTLCOLOREDIT 0x0133
+#define WM_CTLCOLORLISTBOX 0x0134
+#define WM_CTLCOLORBTN 0x0135
+#define WM_CTLCOLORDLG 0x0136
+#define WM_CTLCOLORSCROLLBAR 0x0137
+#define WM_CTLCOLORSTATIC 0x0138
+
+#define GET_WM_CTLCOLOR_HDC(wp, lp, msg) (HDC)(wp)
+#define GET_WM_CTLCOLOR_HWND(wp, lp, msg) (HWND)LOWORD(lp)
+#define GET_WM_CTLCOLOR_TYPE(wp, lp, msg) HIWORD(lp)
+#define GET_WM_CTLCOLOR_MPS(hdc, hwnd, type) \
+ (WPARAM)(hdc), MAKELONG(hwnd, type)
+
+
+#define GET_WM_MENUSELECT_CMD(wp, lp) (wp)
+#define GET_WM_MENUSELECT_FLAGS(wp, lp) LOWORD(lp)
+#define GET_WM_MENUSELECT_HMENU(wp, lp) (HMENU)HIWORD(lp)
+#define GET_WM_MENUSELECT_MPS(cmd, f, hmenu) \
+ (WPARAM)(cmd), MAKELONG(f, hmenu)
+
+// Note: the following are for interpreting MDIclient to MDI child messages.
+#define GET_WM_MDIACTIVATE_FACTIVATE(hwnd, wp, lp) (BOOL)(wp)
+#define GET_WM_MDIACTIVATE_HWNDDEACT(wp, lp) (HWND)HIWORD(lp)
+#define GET_WM_MDIACTIVATE_HWNDACTIVATE(wp, lp) (HWND)LOWORD(lp)
+// Note: the following is for sending to the MDI client window.
+#define GET_WM_MDIACTIVATE_MPS(f, hwndD, hwndA)\
+ (WPARAM)(hwndA), 0
+
+#define GET_WM_MDISETMENU_MPS(hmenuF, hmenuW) 0, MAKELONG(hmenuF, hmenuW)
+
+#define GET_WM_MENUCHAR_CHAR(wp, lp) (CHAR)(wp)
+#define GET_WM_MENUCHAR_HMENU(wp, lp) (HMENU)LOWORD(lp)
+#define GET_WM_MENUCHAR_FMENU(wp, lp) (BOOL)HIWORD(lp)
+#define GET_WM_MENUCHAR_MPS(ch, hmenu, f) \
+ (WPARAM)(ch), MAKELONG(hmenu, f)
+
+#define GET_WM_PARENTNOTIFY_MSG(wp, lp) (wp)
+#define GET_WM_PARENTNOTIFY_ID(wp, lp) HIWORD(lp)
+#define GET_WM_PARENTNOTIFY_HWNDCHILD(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_PARENTNOTIFY_X(wp, lp) (INT)LOWORD(lp)
+#define GET_WM_PARENTNOTIFY_Y(wp, lp) (INT)HIWORD(lp)
+#define GET_WM_PARENTNOTIFY_MPS(msg, id, hwnd) \
+ (WPARAM)(msg), MAKELONG(hwnd, id)
+#define GET_WM_PARENTNOTIFY2_MPS(msg, x, y) \
+ (WPARAM)(msg), MAKELONG(x, y)
+
+#define GET_WM_VKEYTOITEM_CODE(wp, lp) (wp)
+#define GET_WM_VKEYTOITEM_ITEM(wp, lp) (INT)HIWORD(lp)
+#define GET_WM_VKEYTOITEM_HWND(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_VKEYTOITEM_MPS(code, item, hwnd) \
+ (WPARAM)(code), MAKELONG(hwnd, item)
+
+#define GET_EM_SETSEL_START(wp, lp) LOWORD(lp)
+#define GET_EM_SETSEL_END(wp, lp) HIWORD(lp)
+#define GET_EM_SETSEL_MPS(iStart, iEnd) \
+ 0, MAKELONG(iStart, iEnd)
+
+#define GET_EM_LINESCROLL_MPS(vert, horz) \
+ 0, MAKELONG(vert, horz)
+
+#define GET_WM_CHANGECBCHAIN_HWNDNEXT(wp, lp) (HWND)LOWORD(lp)
+
+#define GET_WM_HSCROLL_CODE(wp, lp) (wp)
+#define GET_WM_HSCROLL_POS(wp, lp) LOWORD(lp)
+#define GET_WM_HSCROLL_HWND(wp, lp) (HWND)HIWORD(lp)
+#define GET_WM_HSCROLL_MPS(code, pos, hwnd) \
+ (WPARAM)(code), MAKELONG(pos, hwnd)
+
+#define GET_WM_VSCROLL_CODE(wp, lp) (wp)
+#define GET_WM_VSCROLL_POS(wp, lp) LOWORD(lp)
+#define GET_WM_VSCROLL_HWND(wp, lp) (HWND)HIWORD(lp)
+#define GET_WM_VSCROLL_MPS(code, pos, hwnd) \
+ (WPARAM)(code), MAKELONG(pos, hwnd)
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+} /* End of extern "C" { */
+#endif /* __cplusplus */
+
+#endif /* !_INC_WINDOWSX */
diff --git a/private/oleauto/tools/win16/os2/inc/windowsx.h16 b/private/oleauto/tools/win16/os2/inc/windowsx.h16
new file mode 100644
index 000000000..90d57bc48
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/windowsx.h16
@@ -0,0 +1,1213 @@
+/*****************************************************************************\
+* *
+* windowsx.h - Macro APIs, window message crackers, and control APIs *
+* *
+* Version 3.10 *
+* *
+* Copyright (c) 1992, Microsoft Corp. All rights reserved. *
+* *
+\*****************************************************************************/
+
+#ifndef _INC_WINDOWSX
+#define _INC_WINDOWSX
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+/****** KERNEL Macro APIs ****************************************************/
+
+#define GetInstanceModule(hInstance) \
+ GetModuleHandle((LPCSTR)MAKELP(0, hInstance))
+
+#define GlobalPtrHandle(lp) \
+ ((HGLOBAL)LOWORD(GlobalHandle(SELECTOROF(lp))))
+
+#define GlobalLockPtr(lp) \
+ ((BOOL)SELECTOROF(GlobalLock(GlobalPtrHandle(lp))))
+#define GlobalUnlockPtr(lp) \
+ GlobalUnlock(GlobalPtrHandle(lp))
+
+#define GlobalAllocPtr(flags, cb) \
+ (GlobalLock(GlobalAlloc((flags), (cb))))
+#define GlobalReAllocPtr(lp, cbNew, flags) \
+ (GlobalUnlockPtr(lp), GlobalLock(GlobalReAlloc(GlobalPtrHandle(lp) , (cbNew), (flags))))
+#define GlobalFreePtr(lp) \
+ (GlobalUnlockPtr(lp), (BOOL)GlobalFree(GlobalPtrHandle(lp)))
+
+/****** GDI Macro APIs *******************************************************/
+
+#define DeletePen(hpen) DeleteObject((HGDIOBJ)(HPEN)(hpen))
+#define SelectPen(hdc, hpen) ((HPEN)SelectObject((hdc), (HGDIOBJ)(HPEN)(hpen)))
+#define GetStockPen(i) ((HPEN)GetStockObject(i))
+
+#define DeleteBrush(hbr) DeleteObject((HGDIOBJ)(HBRUSH)(hbr))
+#define SelectBrush(hdc, hbr) ((HBRUSH)SelectObject((hdc), (HGDIOBJ)(HBRUSH)(hbr)))
+#define GetStockBrush(i) ((HBRUSH)GetStockObject(i))
+
+#define DeleteRgn(hrgn) DeleteObject((HGDIOBJ)(HRGN)(hrgn))
+
+#define CopyRgn(hrgnDst, hrgnSrc) CombineRgn(hrgnDst, hrgnSrc, 0, RGN_COPY)
+#define IntersectRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_AND)
+#define SubtractRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_DIFF)
+#define UnionRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_OR)
+#define XorRgn(hrgnResult, hrgnA, hrgnB) CombineRgn(hrgnResult, hrgnA, hrgnB, RGN_XOR)
+
+#define DeletePalette(hpal) DeleteObject((HGDIOBJ)(HPALETTE)(hpal))
+
+#define DeleteFont(hfont) DeleteObject((HGDIOBJ)(HFONT)(hfont))
+#define SelectFont(hdc, hfont) ((HFONT)SelectObject((hdc), (HGDIOBJ)(HFONT)(hfont)))
+#define GetStockFont(i) ((HFONT)GetStockObject(i))
+
+#define DeleteBitmap(hbm) DeleteObject((HGDIOBJ)(HBITMAP)(hbm))
+#define SelectBitmap(hdc, hbm) ((HBITMAP)SelectObject((hdc), (HGDIOBJ)(HBITMAP)(hbm)))
+
+#define InsetRect(lprc, dx, dy) InflateRect((lprc), -(dx), -(dy))
+
+/****** USER Macro APIs ******************************************************/
+
+#define GetWindowInstance(hwnd) ((HINSTANCE)GetWindowWord(hwnd, GWW_HINSTANCE))
+
+#define GetWindowStyle(hwnd) ((DWORD)GetWindowLong(hwnd, GWL_STYLE))
+#define GetWindowExStyle(hwnd) ((DWORD)GetWindowLong(hwnd, GWL_EXSTYLE))
+
+#define GetWindowOwner(hwnd) GetWindow(hwnd, GW_OWNER)
+
+#define GetFirstChild(hwnd) GetTopWindow(hwnd)
+#define GetFirstSibling(hwnd) GetWindow(hwnd, GW_HWNDFIRST)
+#define GetLastSibling(hwnd) GetWindow(hwnd, GW_HWNDLAST)
+#define GetNextSibling(hwnd) GetWindow(hwnd, GW_HWNDNEXT)
+#define GetPrevSibling(hwnd) GetWindow(hwnd, GW_HWNDPREV)
+
+#define GetWindowID(hwnd) GetDlgCtrlID(hwnd)
+
+#define SetWindowRedraw(hwnd, fRedraw) \
+ ((void)SendMessage(hwnd, WM_SETREDRAW, (WPARAM)(BOOL)(fRedraw), 0L))
+
+#define SubclassWindow(hwnd, lpfn) \
+ ((WNDPROC)SetWindowLong((hwnd), GWL_WNDPROC, (LPARAM)(WNDPROC)(lpfn)))
+
+#define IsMinimized(hwnd) IsIconic(hwnd)
+#define IsMaximized(hwnd) IsZoomed(hwnd)
+#define IsRestored(hwnd) ((GetWindowStyle(hwnd) & (WS_MINIMIZE | WS_MAXIMIZE)) == 0L)
+
+#define SetWindowFont(hwnd, hfont, fRedraw) FORWARD_WM_SETFONT((hwnd), (hfont), (fRedraw), SendMessage)
+
+#define GetWindowFont(hwnd) FORWARD_WM_GETFONT((hwnd), SendMessage)
+
+#if (WINVER >= 0x030a)
+#define MapWindowRect(hwndFrom, hwndTo, lprc) \
+ MapWindowPoints((hwndFrom), (hwndTo), (POINT FAR*)(lprc), 2)
+#endif /* WINVER >= 0x030a */
+
+#define IsLButtonDown() (GetKeyState(VK_LBUTTON) < 0)
+#define IsRButtonDown() (GetKeyState(VK_RBUTTON) < 0)
+#define IsMButtonDown() (GetKeyState(VK_MBUTTON) < 0)
+
+#define SubclassDialog(hwndDlg, lpfn) \
+ ((DLGPROC)SetWindowLong(hwndDlg, DWL_DLGPROC, (LPARAM)(DLGPROC)(lpfn)))
+
+#define SetDlgMsgResult(hwnd, msg, result) \
+ (((msg) == WM_CTLCOLOR || (msg) == WM_COMPAREITEM || (msg) == WM_VKEYTOITEM || \
+ (msg) == WM_CHARTOITEM || (msg) == WM_QUERYDRAGICON || (msg) == WM_INITDIALOG) \
+ ? (BOOL)LOWORD(result) : (SetWindowLong((hwnd), DWL_MSGRESULT, (LPARAM)(LRESULT)(result)), TRUE))
+
+#define DefDlgProcEx(hwnd, msg, wParam, lParam, pfRecursion) \
+ (*(pfRecursion) = TRUE, DefDlgProc(hwnd, msg, wParam, lParam))
+
+#define CheckDefDlgRecursion(pfRecursion) \
+ if (*(pfRecursion)) { *(pfRecursion) = FALSE; return FALSE; }
+
+/****** Message crackers ****************************************************/
+
+#define HANDLE_MSG(hwnd, message, fn) \
+ case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
+
+/* void Cls_OnCompacting(HWND hwnd, UINT compactRatio); */
+#define HANDLE_WM_COMPACTING(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam)), 0L)
+#define FORWARD_WM_COMPACTING(hwnd, compactRatio, fn) \
+ (void)(fn)((hwnd), WM_COMPACTING, (WPARAM)(UINT)(compactRatio), 0L)
+
+/* void Cls_OnWinIniChange(HWND hwnd, LPCSTR lpszSectionName); */
+#define HANDLE_WM_WININICHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_WININICHANGE(hwnd, lpszSectionName, fn) \
+ (void)(fn)((hwnd), WM_WININICHANGE, 0, (LPARAM)(LPCSTR)(lpszSectionName))
+
+/* void Cls_OnSysColorChange(HWND hwnd); */
+#define HANDLE_WM_SYSCOLORCHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_SYSCOLORCHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_SYSCOLORCHANGE, 0, 0L)
+
+/* BOOL Cls_OnQueryNewPalette(HWND hwnd); */
+#define HANDLE_WM_QUERYNEWPALETTE(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYNEWPALETTE(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYNEWPALETTE, 0, 0L)
+
+/* void Cls_OnPaletteIsChanging(HWND hwnd, HWND hwndPaletteChange); */
+#define HANDLE_WM_PALETTEISCHANGING(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_PALETTEISCHANGING(hwnd, hwndPaletteChange, fn) \
+ (void)(fn)((hwnd), WM_PALETTEISCHANGING, (WPARAM)(HWND)(hwndPaletteChange), 0L)
+
+/* void Cls_OnPaletteChanged(HWND hwnd, HWND hwndPaletteChange); */
+#define HANDLE_WM_PALETTECHANGED(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_PALETTECHANGED(hwnd, hwndPaletteChange, fn) \
+ (void)(fn)((hwnd), WM_PALETTECHANGED, (WPARAM)(HWND)(hwndPaletteChange), 0L)
+
+/* void Cls_OnFontChange(HWND hwnd); */
+#define HANDLE_WM_FONTCHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_FONTCHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_FONTCHANGE, 0, 0L)
+
+/* void Cls_OnSpoolerStatus(HWND hwnd, UINT status, int cJobInQueue); */
+#define HANDLE_WM_SPOOLERSTATUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SPOOLERSTATUS(hwnd, status, cJobInQueue, fn) \
+ (void)(fn)((hwnd), WM_SPOOLERSTATUS, (WPARAM)(status), MAKELPARAM((UINT)(cJobInQueue), 0))
+
+/* void Cls_OnDevModeChange(HWND hwnd, LPCSTR lpszDeviceName); */
+#define HANDLE_WM_DEVMODECHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_DEVMODECHANGE(hwnd, lpszDeviceName, fn) \
+ (void)(fn)((hwnd), WM_DEVMODECHANGE, 0,(LPARAM)(LPCSTR)(lpszDeviceName))
+
+/* void Cls_OnTimeChange(HWND hwnd); */
+#define HANDLE_WM_TIMECHANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_TIMECHANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_TIMECHANGE, 0, 0L)
+
+/* void Cls_OnPower(HWND hwnd, int code); */
+#define HANDLE_WM_POWER(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_POWER(hwnd, code, fn) \
+ (void)(fn)((hwnd), WM_POWER, (WPARAM)(code), 0L)
+
+/* BOOL Cls_OnQueryEndSession(HWND hwnd); */
+#define HANDLE_WM_QUERYENDSESSION(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYENDSESSION(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYENDSESSION, 0, 0L)
+
+/* void Cls_OnEndSession(HWND hwnd, BOOL fEnding); */
+#define HANDLE_WM_ENDSESSION(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_ENDSESSION(hwnd, fEnding, fn) \
+ (void)(fn)((hwnd), WM_ENDSESSION, (WPARAM)(BOOL)(fEnding), 0L)
+
+/* void Cls_OnQuit(HWND hwnd, int exitCode); */
+#define HANDLE_WM_QUIT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_QUIT(hwnd, exitCode, fn) \
+ (void)(fn)((hwnd), WM_QUIT, (WPARAM)(exitCode), 0L)
+
+/* void Cls_OnSystemError(HWND hwnd, int errCode); */
+#define HANDLE_WM_SYSTEMERROR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam)), 0L)
+#define FORWARD_WM_SYSTEMERROR(hwnd, errCode, fn) \
+ (void)(fn)((hwnd), WM_SYSTEMERROR, (WPARAM)(errCode), 0L)
+
+/* BOOL Cls_OnCreate(HWND hwnd, CREATESTRUCT FAR* lpCreateStruct) */
+#define HANDLE_WM_CREATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (CREATESTRUCT FAR*)(lParam)) ? 0L : (LRESULT)-1L)
+#define FORWARD_WM_CREATE(hwnd, lpCreateStruct, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_CREATE, 0, (LPARAM)(CREATESTRUCT FAR*)(lpCreateStruct))
+
+/* BOOL Cls_OnNCCreate(HWND hwnd, CREATESTRUCT FAR* lpCreateStruct) */
+#define HANDLE_WM_NCCREATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (CREATESTRUCT FAR*)(lParam))
+#define FORWARD_WM_NCCREATE(hwnd, lpCreateStruct, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_NCCREATE, 0, (LPARAM)(CREATESTRUCT FAR*)(lpCreateStruct))
+
+/* void Cls_OnDestroy(HWND hwnd); */
+#define HANDLE_WM_DESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DESTROY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DESTROY, 0, 0L)
+
+/* void Cls_OnNCDestroy(HWND hwnd); */
+#define HANDLE_WM_NCDESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_NCDESTROY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_NCDESTROY, 0, 0L)
+
+/* void Cls_OnShowWindow(HWND hwnd, BOOL fShow, UINT status); */
+#define HANDLE_WM_SHOWWINDOW(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), LOWORD(lParam)), 0L)
+#define FORWARD_WM_SHOWWINDOW(hwnd, fShow, status, fn) \
+ (void)(fn)((hwnd), WM_SHOWWINDOW, (WPARAM)(BOOL)(fShow), MAKELPARAM((UINT)(status), 0))
+
+/* void Cls_OnSetRedraw(HWND hwnd, BOOL fRedraw); */
+#define HANDLE_WM_SETREDRAW(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_SETREDRAW(hwnd, fRedraw, fn) \
+ (void)(fn)((hwnd), WM_SETREDRAW, (WPARAM)(fRedraw), 0L)
+
+/* void Cls_OnEnable(HWND hwnd, BOOL fEnable); */
+#define HANDLE_WM_ENABLE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam)), 0L)
+#define FORWARD_WM_ENABLE(hwnd, fEnable, fn) \
+ (void)(fn)((hwnd), WM_ENABLE, (WPARAM)(BOOL)(fEnable), 0L)
+
+/* void Cls_OnSetText(HWND hwnd, LPCSTR lpszText); */
+#define HANDLE_WM_SETTEXT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (LPCSTR)(lParam)), 0L)
+#define FORWARD_WM_SETTEXT(hwnd, lpszText, fn) \
+ (void)(fn)((hwnd), WM_SETTEXT, 0, (LPARAM)(LPCSTR)(lpszText))
+
+/* INT Cls_OnGetText(HWND hwnd, int cchTextMax, LPSTR lpszText) */
+#define HANDLE_WM_GETTEXT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (int)(wParam), (LPSTR)(lParam))
+#define FORWARD_WM_GETTEXT(hwnd, cchTextMax, lpszText, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_GETTEXT, (WPARAM)(int)(cchTextMax), (LPARAM)(LPSTR)(lpszText))
+
+/* INT Cls_OnGetTextLength(HWND hwnd); */
+#define HANDLE_WM_GETTEXTLENGTH(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)(hwnd)
+#define FORWARD_WM_GETTEXTLENGTH(hwnd, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_GETTEXTLENGTH, 0, 0L)
+
+/* BOOL Cls_OnWindowPosChanging(HWND hwnd, WINDOWPOS FAR* lpwpos); */
+#define HANDLE_WM_WINDOWPOSCHANGING(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (WINDOWPOS FAR*)(lParam))
+#define FORWARD_WM_WINDOWPOSCHANGING(hwnd, lpwpos, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_WINDOWPOSCHANGING, 0, (LPARAM)(WINDOWPOS FAR*)(lpwpos))
+
+/* void Cls_OnWindowPosChanged(HWND hwnd, const WINDOWPOS FAR* lpwpos); */
+#define HANDLE_WM_WINDOWPOSCHANGED(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const WINDOWPOS FAR*)(lParam)), 0L)
+#define FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, fn) \
+ (void)(fn)((hwnd), WM_WINDOWPOSCHANGED, 0, (LPARAM)(const WINDOWPOS FAR*)(lpwpos))
+
+/* void Cls_OnMove(HWND hwnd, int x, int y); */
+#define HANDLE_WM_MOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_MOVE(hwnd, x, y, fn) \
+ (void)(fn)((hwnd), WM_MOVE, 0, MAKELPARAM((int)(x), (int)(y)))
+
+/* void Cls_OnSize(HWND hwnd, UINT state, int cx, int cy); */
+#define HANDLE_WM_SIZE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SIZE(hwnd, state, cx, cy, fn) \
+ (void)(fn)((hwnd), WM_SIZE, (WPARAM)(UINT)(state), MAKELPARAM((int)(cx), (int)(cy)))
+
+/* void Cls_OnClose(HWND hwnd); */
+#define HANDLE_WM_CLOSE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CLOSE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CLOSE, 0, 0L)
+
+/* BOOL Cls_OnQueryOpen(HWND hwnd); */
+#define HANDLE_WM_QUERYOPEN(hwnd, wParam, lParam, fn) \
+ MAKELRESULT((BOOL)(fn)(hwnd), 0)
+#define FORWARD_WM_QUERYOPEN(hwnd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_QUERYOPEN, 0, 0L)
+
+/* void Cls_OnGetMinMaxInfo(HWND hwnd, MINMAXINFO FAR* lpMinMaxInfo); */
+#define HANDLE_WM_GETMINMAXINFO(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (MINMAXINFO FAR*)(lParam)), 0L)
+#define FORWARD_WM_GETMINMAXINFO(hwnd, lpMinMaxInfo, fn) \
+ (void)(fn)((hwnd), WM_GETMINMAXINFO, 0, (LPARAM)(MINMAXINFO FAR*)(lpMinMaxInfo))
+
+/* void Cls_OnPaint(HWND hwnd); */
+#define HANDLE_WM_PAINT(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_PAINT(hwnd, fn) \
+ (void)(fn)((hwnd), WM_PAINT, 0, 0L)
+
+/* BOOL Cls_OnEraseBkgnd(HWND hwnd, HDC hdc); */
+#define HANDLE_WM_ERASEBKGND(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HDC)(wParam))
+#define FORWARD_WM_ERASEBKGND(hwnd, hdc, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_ERASEBKGND, (WPARAM)(HDC)(hdc), 0L)
+
+/* BOOL Cls_OnIconEraseBkgnd(HWND hwnd, HDC hdc); */
+#define HANDLE_WM_ICONERASEBKGND(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HDC)(wParam))
+#define FORWARD_WM_ICONERASEBKGND(hwnd, hdc, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_ICONERASEBKGND, (WPARAM)(HDC)(hdc), 0L)
+
+/* void Cls_OnNCPaint(HWND hwnd, HRGN hrgn); */
+#define HANDLE_WM_NCPAINT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HRGN)(wParam)), 0L)
+#define FORWARD_WM_NCPAINT(hwnd, hrgn, fn) \
+ (void)(fn)((hwnd), WM_NCPAINT, (WPARAM)(HRGN)(hrgn), 0L)
+
+/* UINT Cls_OnNCCalcSize(HWND hwnd, BOOL fCalcValidRects, NCCALCSIZE_PARAMS FAR* lpcsp) */
+#define HANDLE_WM_NCCALCSIZE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (BOOL)(wParam), (NCCALCSIZE_PARAMS FAR*)(lParam))
+#define FORWARD_WM_NCCALCSIZE(hwnd, fCalcValidRects, lpcsp, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_NCCALCSIZE, (WPARAM)(fCalcValidRects), (LPARAM)(NCCALCSIZE_PARAMS FAR*)(lpcsp))
+
+/* UINT Cls_OnNCHitTest(HWND hwnd, int x, int y); */
+#define HANDLE_WM_NCHITTEST(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_NCHITTEST(hwnd, x, y, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_NCHITTEST, 0, MAKELPARAM((int)(x), (int)(y)))
+
+/* HICON Cls_OnQueryDragIcon(HWND hwnd); */
+#define HANDLE_WM_QUERYDRAGICON(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd)
+#define FORWARD_WM_QUERYDRAGICON(hwnd, fn) \
+ (HICON)(UINT)(DWORD)(fn)((hwnd), WM_QUERYDRAGICON, 0, 0L)
+
+#ifdef _INC_SHELLAPI
+/* void Cls_OnDropFiles(HWND hwnd, HDROP hdrop); */
+#define HANDLE_WM_DROPFILES(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HDROP)(wParam)), 0L)
+#define FORWARD_WM_DROPFILES(hwnd, hdrop, fn) \
+ (void)(fn)((hwnd), WM_DROPFILES, (WPARAM)(hdrop), 0L)
+#endif /* _INC_SHELLAPI */
+
+/* void Cls_OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized); */
+#define HANDLE_WM_ACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (BOOL)HIWORD(lParam)), 0L)
+#define FORWARD_WM_ACTIVATE(hwnd, state, hwndActDeact, fMinimized, fn) \
+ (void)(fn)((hwnd), WM_ACTIVATE, (WPARAM)(UINT)(state), MAKELPARAM((UINT)(HWND)(hwndActDeact), (UINT)(BOOL)(fMinimized)))
+
+/* void Cls_OnActivateApp(HWND hwnd, BOOL fActivate, HTASK htaskActDeact); */
+#define HANDLE_WM_ACTIVATEAPP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), (HTASK)LOWORD(lParam)), 0L)
+#define FORWARD_WM_ACTIVATEAPP(hwnd, fActivate, htaskActDeact, fn) \
+ (void)(fn)((hwnd), WM_ACTIVATEAPP, (WPARAM)(BOOL)(fActivate), MAKELPARAM((htaskActDeact),0))
+
+/* BOOL Cls_OnNCActivate(HWND hwnd, BOOL fActive, HWND hwndActDeact, BOOL fMinimized); */
+#define HANDLE_WM_NCACTIVATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (BOOL)(wParam), (HWND)LOWORD(lParam), (BOOL)HIWORD(lParam))
+#define FORWARD_WM_NCACTIVATE(hwnd, fActive, hwndActDeact, fMinimized, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_NCACTIVATE, (WPARAM)(BOOL)(fActive), MAKELPARAM((UINT)(HWND)(hwndActDeact), (UINT)(BOOL)(fMinimized)))
+
+/* void Cls_OnSetFocus(HWND hwnd, HWND hwndOldFocus) */
+#define HANDLE_WM_SETFOCUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_SETFOCUS(hwnd, hwndOldFocus, fn) \
+ (void)(fn)((hwnd), WM_SETFOCUS, (WPARAM)(HWND)(hwndOldFocus), 0L)
+
+/* void Cls_OnKillFocus(HWND hwnd, HWND hwndNewFocus); */
+#define HANDLE_WM_KILLFOCUS(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_KILLFOCUS(hwnd, hwndNewFocus, fn) \
+ (void)(fn)((hwnd), WM_KILLFOCUS, (WPARAM)(HWND)(hwndNewFocus), 0L)
+
+/* void Cls_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_KEYDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), TRUE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_KEYDOWN(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_KEYDOWN, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_KEYUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), FALSE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_KEYUP(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_KEYUP, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_CHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_CHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_CHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat),0))
+
+/* void Cls_OnDeadChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_DEADCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_DEADCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_DEADCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat),0))
+
+/* void Cls_OnSysKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_SYSKEYDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), TRUE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSKEYDOWN(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_SYSKEYDOWN, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnSysKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags); */
+#define HANDLE_WM_SYSKEYUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), FALSE, (int)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSKEYUP(hwnd, vk, cRepeat, flags, fn) \
+ (void)(fn)((hwnd), WM_SYSKEYUP, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(cRepeat), (UINT)(flags)))
+
+/* void Cls_OnSysChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_SYSCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SYSCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_SYSCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat), 0))
+
+/* void Cls_OnSysDeadChar(HWND hwnd, UINT ch, int cRepeat); */
+#define HANDLE_WM_SYSDEADCHAR(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SYSDEADCHAR(hwnd, ch, cRepeat, fn) \
+ (void)(fn)((hwnd), WM_SYSDEADCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(cRepeat), 0))
+
+/* void Cls_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MOUSEMOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MOUSEMOVE(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_MOUSEMOVE, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_LBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_LBUTTONDBLCLK : WM_LBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_LBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_LBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_LBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_RBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_RBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_RBUTTONDBLCLK : WM_RBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_RBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnRButtonUp(HWND hwnd, int x, int y, UINT flags); */
+#define HANDLE_WM_RBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_RBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_RBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_MBUTTONDBLCLK : WM_MBUTTONDOWN, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); */
+#define HANDLE_WM_MBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnMButtonUp(HWND hwnd, int x, int y, UINT flags); */
+#define HANDLE_WM_MBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_MBUTTONUP(hwnd, x, y, keyFlags, fn) \
+ (void)(fn)((hwnd), WM_MBUTTONUP, (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCMouseMove(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMOUSEMOVE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMOUSEMOVE(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCMOUSEMOVE, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCLBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCLBUTTONDBLCLK : WM_NCLBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)))
+
+/* void Cls_OnNCLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCLButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCLBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCLBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCLBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCRBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCRBUTTONDBLCLK : WM_NCRBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCRButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCRBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCRBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCRBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONDOWN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), FALSE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMBUTTONDOWN(hwnd, fDoubleClick, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), (fDoubleClick) ? WM_NCMBUTTONDBLCLK : WM_NCMBUTTONDOWN, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* void Cls_OnNCMButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), TRUE, (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+
+/* void Cls_OnNCMButtonUp(HWND hwnd, int x, int y, UINT codeHitTest); */
+#define HANDLE_WM_NCMBUTTONUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)LOWORD(lParam), (int)HIWORD(lParam), (UINT)(wParam)), 0L)
+#define FORWARD_WM_NCMBUTTONUP(hwnd, x, y, codeHitTest, fn) \
+ (void)(fn)((hwnd), WM_NCMBUTTONUP, (WPARAM)(UINT)(codeHitTest), MAKELPARAM((x), (y)) )
+
+/* int Cls_OnMouseActivate(HWND hwnd, HWND hwndTopLevel, UINT codeHitTest, UINT msg); */
+#define HANDLE_WM_MOUSEACTIVATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (HWND)(wParam), (UINT)LOWORD(lParam), (UINT)HIWORD(lParam))
+#define FORWARD_WM_MOUSEACTIVATE(hwnd, hwndTopLevel, codeHitTest, msg, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_MOUSEACTIVATE, (WPARAM)(HWND)(hwndTopLevel), MAKELPARAM((codeHitTest), (msg)))
+
+/* void Cls_OnCancelMode(HWND hwnd); */
+#define HANDLE_WM_CANCELMODE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CANCELMODE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CANCELMODE, 0, 0L)
+
+/* void Cls_OnTimer(HWND hwnd, UINT id); */
+#define HANDLE_WM_TIMER(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam)), 0L)
+#define FORWARD_WM_TIMER(hwnd, id, fn) \
+ (void)(fn)((hwnd), WM_TIMER, (WPARAM)(UINT)(id), 0L)
+
+/* void Cls_OnInitMenu(HWND hwnd, HMENU hMenu); */
+#define HANDLE_WM_INITMENU(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)(wParam)), 0L)
+#define FORWARD_WM_INITMENU(hwnd, hMenu, fn) \
+ (void)(fn)((hwnd), WM_INITMENU, (WPARAM)(HMENU)(hMenu), 0L)
+
+/* void Cls_OnInitMenuPopup(HWND hwnd, HMENU hMenu, int item, BOOL fSystemMenu); */
+#define HANDLE_WM_INITMENUPOPUP(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)(wParam), (int)LOWORD(lParam), (BOOL)HIWORD(lParam)), 0L)
+#define FORWARD_WM_INITMENUPOPUP(hwnd, hMenu, item, fSystemMenu, fn) \
+ (void)(fn)((hwnd), WM_INITMENUPOPUP, (WPARAM)(HMENU)(hMenu), MAKELPARAM((item),(fSystemMenu)))
+
+/* void Cls_OnMenuSelect(HWND hwnd, HMENU hmenu, int item, HMENU hmenuPopup, UINT flags); */
+#define HANDLE_WM_MENUSELECT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HMENU)HIWORD(lParam), (LOWORD(lParam) & MF_POPUP) ? 0 : (int)(wParam), \
+ (LOWORD(lParam) & MF_POPUP) ? (HMENU)(wParam) : 0, LOWORD(lParam)), 0L)
+#define FORWARD_WM_MENUSELECT(hwnd, hmenu, item, hmenuPopup, flags, fn) \
+ (void)(fn)((hwnd), WM_MENUSELECT, ((flags) & MF_POPUP) ? (WPARAM)(HMENU)(hmenuPopup) : (WPARAM)(int)(item), MAKELPARAM((flags), (hmenu)))
+
+/* DWORD Cls_OnMenuChar(HWND hwnd, UINT ch, UINT flags, HMENU hmenu); */
+#define HANDLE_WM_MENUCHAR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam), LOWORD(lParam), (HMENU)HIWORD(lParam));
+#define FORWARD_WM_MENUCHAR(hwnd, ch, flags, hmenu, fn) \
+ (DWORD)(fn)((hwnd), WM_MENUCHAR, (WPARAM)(UINT)(ch), MAKELPARAM((flags), (UINT)(hmenu)))
+
+/* void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); */
+#define HANDLE_WM_COMMAND(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), (HWND)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \
+ (void)(fn)((hwnd), WM_COMMAND, (WPARAM)(int)(id), MAKELPARAM((UINT)(hwndCtl), (codeNotify)))
+
+/* void Cls_OnHScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos); */
+#define HANDLE_WM_HSCROLL(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)HIWORD(lParam), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_HSCROLL(hwnd, hwndCtl, code, pos, fn) \
+ (void)(fn)((hwnd), WM_HSCROLL, (WPARAM)(UINT)(code), MAKELPARAM((pos), (UINT)(hwndCtl)))
+
+/* void Cls_OnVScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos); */
+#define HANDLE_WM_VSCROLL(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)HIWORD(lParam), (UINT)(wParam), (int)LOWORD(lParam)), 0L)
+#define FORWARD_WM_VSCROLL(hwnd, hwndCtl, code, pos, fn) \
+ (void)(fn)((hwnd), WM_VSCROLL, (WPARAM)(UINT)(code), MAKELPARAM((pos), (UINT)(hwndCtl)))
+
+/* void Cls_OnCut(HWND hwnd); */
+#define HANDLE_WM_CUT(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CUT(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CUT, 0, 0L)
+
+/* void Cls_OnCopy(HWND hwnd); */
+#define HANDLE_WM_COPY(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_COPY(hwnd, fn) \
+ (void)(fn)((hwnd), WM_COPY, 0, 0L)
+
+/* void Cls_OnPaste(HWND hwnd); */
+#define HANDLE_WM_PASTE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_PASTE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_PASTE, 0, 0L)
+
+/* void Cls_OnClear(HWND hwnd); */
+#define HANDLE_WM_CLEAR(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CLEAR(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CLEAR, 0, 0L)
+
+/* void Cls_OnUndo(HWND hwnd); */
+#define HANDLE_WM_UNDO(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_UNDO(hwnd, fn) \
+ (void)(fn)((hwnd), WM_UNDO, 0, 0L)
+
+/* HANDLE Cls_OnRenderFormat(HWND hwnd, UINT fmt); */
+#define HANDLE_WM_RENDERFORMAT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HANDLE)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_RENDERFORMAT(hwnd, fmt, fn) \
+ (HANDLE)(UINT)(DWORD)(fn)((hwnd), WM_RENDERFORMAT, (WPARAM)(UINT)(fmt), 0L)
+
+/* void Cls_OnRenderAllFormats(HWND hwnd); */
+#define HANDLE_WM_RENDERALLFORMATS(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_RENDERALLFORMATS(hwnd, fn) \
+ (void)(fn)((hwnd), WM_RENDERALLFORMATS, 0, 0L)
+
+/* void Cls_OnDestroyClipboard(HWND hwnd); */
+#define HANDLE_WM_DESTROYCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DESTROYCLIPBOARD(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DESTROYCLIPBOARD, 0, 0L)
+
+/* void Cls_OnDrawClipboard(HWND hwnd); */
+#define HANDLE_WM_DRAWCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_DRAWCLIPBOARD(hwnd, fn) \
+ (void)(fn)((hwnd), WM_DRAWCLIPBOARD, 0, 0L)
+
+/* void Cls_OnPaintClipboard(HWND hwnd, HWND hwndCBViewer, const PAINTSTRUCT FAR* lpPaintStruct) */
+#define HANDLE_WM_PAINTCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (const PAINTSTRUCT FAR*)GlobalLock((HGLOBAL)LOWORD(lParam))), GlobalUnlock((HGLOBAL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_PAINTCLIPBOARD(hwnd, hwndCBViewer, lpPaintStruct, fn) \
+ (void)(fn)((hwnd), WM_PAINTCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), (LPARAM)(lpPaintStruct))
+
+/* void Cls_OnSizeClipboard(HWND hwnd, HWND hwndCBViewer, const RECT FAR* lprc); */
+#define HANDLE_WM_SIZECLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (const RECT FAR*)GlobalLock((HGLOBAL)LOWORD(lParam))), GlobalUnlock((HGLOBAL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SIZECLIPBOARD(hwnd, hwndCBViewer, lprc, fn) \
+ (void)(fn)((hwnd), WM_SIZECLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), (LPARAM)(lprc))
+
+/* void Cls_OnVScrollClipboard(HWND hwnd, HWND hwndCBViewer, UINT code, int pos); */
+#define HANDLE_WM_VSCROLLCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_VSCROLLCLIPBOARD(hwnd, hwndCBViewer, code, pos, fn) \
+ (void)(fn)((hwnd), WM_VSCROLLCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), MAKELPARAM((code), (pos)))
+
+/* void Cls_OnHScrollClipboard(HWND hwnd, HWND hwndCBViewer, UINT code, int pos); */
+#define HANDLE_WM_HSCROLLCLIPBOARD(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_HSCROLLCLIPBOARD(hwnd, hwndCBViewer, code, pos, fn) \
+ (void)(fn)((hwnd), WM_HSCROLLCLIPBOARD, (WPARAM)(HWND)(hwndCBViewer), MAKELPARAM((code), (pos)))
+
+/* void Cls_OnAskCBFormatName(HWND hwnd, int cchMax, LPSTR rgchName); */
+#define HANDLE_WM_ASKCBFORMATNAME(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), (LPSTR)(lParam)), 0L)
+#define FORWARD_WM_ASKCBFORMATNAME(hwnd, cchMax, rgchName, fn) \
+ (void)(fn)((hwnd), WM_ASKCBFORMATNAME, (WPARAM)(int)(cchMax), (LPARAM)(rgchName))
+
+/* void Cls_OnChangeCBChain(HWND hwnd, HWND hwndRemove, HWND hwndNext); */
+#define HANDLE_WM_CHANGECBCHAIN(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (HWND)LOWORD(lParam)), 0L)
+#define FORWARD_WM_CHANGECBCHAIN(hwnd, hwndRemove, hwndNext, fn) \
+ (void)(fn)((hwnd), WM_CHANGECBCHAIN, (WPARAM)(HWND)(hwndRemove), MAKELPARAM((UINT)(hwndNext), 0))
+
+/* BOOL Cls_OnSetCursor(HWND hwnd, HWND hwndCursor, UINT codeHitTest, UINT msg); */
+#define HANDLE_WM_SETCURSOR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(BOOL)(fn)((hwnd), (HWND)(wParam), (UINT)LOWORD(lParam), (UINT)HIWORD(lParam));
+#define FORWARD_WM_SETCURSOR(hwnd, hwndCursor, codeHitTest, msg, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_SETCURSOR, (WPARAM)(HWND)(hwndCursor), MAKELPARAM((codeHitTest), (msg)))
+
+/* void Cls_OnSysCommand(HWND hwnd, UINT cmd, int x, int y); */
+#define HANDLE_WM_SYSCOMMAND(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (int)LOWORD(lParam), (int)HIWORD(lParam)), 0L)
+#define FORWARD_WM_SYSCOMMAND(hwnd, cmd, x, y, fn) \
+ (void)(fn)((hwnd), WM_SYSCOMMAND, (WPARAM)(UINT)(cmd), MAKELPARAM((x), (y)))
+
+/* HWND Cls_MDICreate(HWND hwnd, const MDICREATESTRUCT FAR* lpmcs); */
+#define HANDLE_WM_MDICREATE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (MDICREATESTRUCT FAR*)(lParam))
+#define FORWARD_WM_MDICREATE(hwnd, lpmcs, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDICREATE, 0, (LPARAM)(lpmcs))
+
+/* void Cls_MDIDestroy(HWND hwnd, HWND hwndDestroy); */
+#define HANDLE_WM_MDIDESTROY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIDESTROY(hwnd, hwndDestroy, fn) \
+ (void)(fn)((hwnd), WM_MDIDESTROY, (WPARAM)(hwndDestroy), 0L)
+
+/* NOTE: Usable only by MDI client windows */
+/* void Cls_MDIActivate(HWND hwnd, BOOL fActive, HWND hwndActivate, HWND hwndDeactivate); */
+#define HANDLE_WM_MDIACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (BOOL)(wParam), (HWND)LOWORD(lParam), (HWND)HIWORD(lParam)), 0L)
+#define FORWARD_WM_MDIACTIVATE(hwnd, fActive, hwndActivate, hwndDeactivate, fn) \
+ (void)(fn)(hwnd, WM_MDIACTIVATE, (WPARAM)(fActive), MAKELPARAM((hwndActivate), (hwndDeactivate)))
+
+/* void Cls_MDIRestore(HWND hwnd, HWND hwndRestore); */
+#define HANDLE_WM_MDIRESTORE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIRESTORE(hwnd, hwndRestore, fn) \
+ (void)(fn)((hwnd), WM_MDIRESTORE, (WPARAM)(hwndRestore), 0L)
+
+/* HWND Cls_MDINext(HWND hwnd, HWND hwndCur, BOOL fPrev); */
+#define HANDLE_WM_MDINEXT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam), (BOOL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_MDINEXT(hwnd, hwndCur, fPrev, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDINEXT, (WPARAM)(hwndCur), MAKELPARAM((fPrev), 0))
+
+/* void Cls_MDIMaximize(HWND hwnd, HWND hwndMaximize); */
+#define HANDLE_WM_MDIMAXIMIZE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HWND)(wParam)), 0L)
+#define FORWARD_WM_MDIMAXIMIZE(hwnd, hwndMaximize, fn) \
+ (void)(fn)((hwnd), WM_MDIMAXIMIZE, (WPARAM)(hwndMaximize), 0L)
+
+/* BOOL Cls_MDITile(HWND hwnd, UINT cmd); */
+#define HANDLE_WM_MDITILE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_MDITILE(hwnd, cmd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_MDITILE, (WPARAM)(cmd), 0L)
+
+/* BOOL Cls_MDICascade(HWND hwnd, UINT cmd); */
+#define HANDLE_WM_MDICASCADE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(fn)((hwnd), (UINT)(wParam))
+#define FORWARD_WM_MDICASCADE(hwnd, cmd, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_MDICASCADE, (WPARAM)(cmd), 0L)
+
+/* void Cls_MDIIconArrange(HWND hwnd); */
+#define HANDLE_WM_MDIICONARRANGE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_MDIICONARRANGE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_MDIICONARRANGE, 0, 0L)
+
+/* HWND Cls_MDIGetActive(HWND hwnd); */
+#define HANDLE_WM_MDIGETACTIVE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd)
+#define FORWARD_WM_MDIGETACTIVE(hwnd, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_MDIGETACTIVE, 0, 0L)
+
+/* HMENU Cls_MDISetMenu(HWND hwnd, BOOL fRefresh, HMENU hmenuFrame, HMENU hmenuWindow); */
+#define HANDLE_WM_MDISETMENU(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)((hwnd), (BOOL)(wParam), (HMENU)LOWORD(lParam), (HMENU)HIWORD(lParam))
+#define FORWARD_WM_MDISETMENU(hwnd, fRefresh, hmenuFrame, hmenuWindow, fn) \
+ (HMENU)(UINT)(DWORD)(fn)((hwnd), WM_MDISETMENU, (WPARAM)(fRefresh), MAKELPARAM((hmenuFrame), (hmenuWindow)))
+
+/* void Cls_OnChildActivate(HWND hwnd); */
+#define HANDLE_WM_CHILDACTIVATE(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_CHILDACTIVATE(hwnd, fn) \
+ (void)(fn)((hwnd), WM_CHILDACTIVATE, 0, 0L)
+
+/* BOOL Cls_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam); */
+#define HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd), (HWND)(wParam), lParam);
+#define FORWARD_WM_INITDIALOG(hwnd, hwndFocus, lParam, fn) \
+ (BOOL)(DWORD)(fn)((hwnd), WM_INITDIALOG, (WPARAM)(HWND)(hwndFocus), (lParam))
+
+/* HWND Cls_OnNextDlgCtl(HWND hwnd, HWND hwndSetFocus, BOOL fNext) */
+#define HANDLE_WM_NEXTDLGCTL(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HWND)(fn)((hwnd), (HWND)(wParam), (BOOL)LOWORD(lParam))
+#define FORWARD_WM_NEXTDLGCTL(hwnd, hwndSetFocus, fNext, fn) \
+ (HWND)(UINT)(DWORD)(fn)((hwnd), WM_NEXTDLGCTL, (WPARAM)(HWND)(hwndSetFocus), MAKELPARAM((fNext), 0))
+
+/* void Cls_OnParentNotify(HWND hwnd, UINT msg, HWND hwndChild, int idChild); */
+#define HANDLE_WM_PARENTNOTIFY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L)
+#define FORWARD_WM_PARENTNOTIFY(hwnd, msg, hwndChild, idChild, fn) \
+ (void)(fn)((hwnd), WM_PARENTNOTIFY, (WPARAM)(UINT)(msg), MAKELPARAM((UINT)(HWND)(hwndChild), (UINT)(idChild)))
+
+/* void Cls_OnEnterIdle(HWND hwnd, UINT source, HWND hwndSource); */
+#define HANDLE_WM_ENTERIDLE(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam)), 0L)
+#define FORWARD_WM_ENTERIDLE(hwnd, source, hwndSource, fn) \
+ (void)(fn)((hwnd), WM_ENTERIDLE, (WPARAM)(UINT)(source), MAKELPARAM((UINT)(HWND)(hwndSource), 0))
+
+/* UINT Cls_OnGetDlgCode(HWND hwnd, MSG FAR* lpmsg); */
+#define HANDLE_WM_GETDLGCODE(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(fn)(hwnd, (MSG FAR*)(lParam))
+#define FORWARD_WM_GETDLGCODE(hwnd, lpmsg, fn) \
+ (UINT)(DWORD)(fn)((hwnd), WM_GETDLGCODE, (SELECTOROF(lpmsg) ? lpmsg->wParam : 0), (LPARAM)(lpmsg))
+
+/* HBRUSH Cls_OnCtlColor(HWND hwnd, HDC hdc, HWND hwndChild, int type); */
+#define HANDLE_WM_CTLCOLOR(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd), (HDC)(wParam), (HWND)LOWORD(lParam), (int)(HIWORD(lParam)))
+#define FORWARD_WM_CTLCOLOR(hwnd, hdc, hwndChild, type, fn) \
+ (HBRUSH)(UINT)(DWORD)(fn)((hwnd), WM_CTLCOLOR, (WPARAM)(HDC)(hdc), MAKELPARAM((UINT)(HWND)(hwndChild), (UINT)(int)(type)))
+
+/* void Cls_OnSetFont(HWND hwndCtl, HFONT hfont, BOOL fRedraw); */
+#define HANDLE_WM_SETFONT(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (HFONT)(wParam), (BOOL)LOWORD(lParam)), 0L)
+#define FORWARD_WM_SETFONT(hwnd, hfont, fRedraw, fn) \
+ (void)(fn)((hwnd), WM_SETFONT, (WPARAM)(HFONT)(hfont), MAKELPARAM((UINT)(BOOL)(fRedraw), 0))
+
+/* HFONT Cls_OnGetFont(HWND hwnd); */
+#define HANDLE_WM_GETFONT(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(UINT)(HFONT)(fn)(hwnd)
+#define FORWARD_WM_GETFONT(hwnd, fn) \
+ (HFONT)(UINT)(DWORD)(fn)((hwnd), WM_GETFONT, 0, 0L)
+
+/* void Cls_OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT FAR* lpDrawItem); */
+#define HANDLE_WM_DRAWITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const DRAWITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_DRAWITEM(hwnd, lpDrawItem, fn) \
+ (void)(fn)((hwnd), WM_DRAWITEM, 0, (LPARAM)(const DRAWITEMSTRUCT FAR*)(lpDrawItem))
+
+/* void Cls_OnMeasureItem(HWND hwnd, MEASUREITEMSTRUCT FAR* lpMeasureItem); */
+#define HANDLE_WM_MEASUREITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (MEASUREITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_MEASUREITEM(hwnd, lpMeasureItem, fn) \
+ (void)(fn)((hwnd), WM_MEASUREITEM, 0, (LPARAM)(MEASUREITEMSTRUCT FAR*)(lpMeasureItem))
+
+/* void Cls_OnDeleteItem(HWND hwnd, const DELETEITEMSTRUCT FAR* lpDeleteItem) */
+#define HANDLE_WM_DELETEITEM(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (const DELETEITEMSTRUCT FAR*)(lParam)), 0L)
+#define FORWARD_WM_DELETEITEM(hwnd, lpDeleteItem, fn) \
+ (void)(fn)((hwnd), WM_DELETEITEM, 0, (LPARAM)(const DELETEITEMSTRUCT FAR*)(lpDeleteItem))
+
+/* int Cls_OnCompareItem(HWND hwnd, const COMPAREITEMSTRUCT FAR* lpCompareItem); */
+#define HANDLE_WM_COMPAREITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (const COMPAREITEMSTRUCT FAR*)(lParam))
+#define FORWARD_WM_COMPAREITEM(hwnd, lpCompareItem, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_COMPAREITEM, 0, (LPARAM)(const COMPAREITEMSTRUCT FAR*)(lpCompareItem))
+
+/* int Cls_OnVkeyToItem(HWND hwnd, UINT vk, HWND hwndListbox, int iCaret); */
+#define HANDLE_WM_VKEYTOITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_VKEYTOITEM(hwnd, vk, hwndListBox, iCaret, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_VKEYTOITEM, (WPARAM)(UINT)(vk), MAKELPARAM((UINT)(hwndListBox), (UINT)(iCaret)))
+
+/* int Cls_OnCharToItem(HWND hwnd, UINT ch, HWND hwndListbox, int iCaret); */
+#define HANDLE_WM_CHARTOITEM(hwnd, wParam, lParam, fn) \
+ (LRESULT)(DWORD)(int)(fn)((hwnd), (UINT)(wParam), (HWND)LOWORD(lParam), (int)HIWORD(lParam))
+#define FORWARD_WM_CHARTOITEM(hwnd, ch, hwndListBox, iCaret, fn) \
+ (int)(DWORD)(fn)((hwnd), WM_CHARTOITEM, (WPARAM)(UINT)(ch), MAKELPARAM((UINT)(hwndListBox), (UINT)(iCaret)))
+
+/* void Cls_OnQueueSync(HWND hwnd); */
+#define HANDLE_WM_QUEUESYNC(hwnd, wParam, lParam, fn) \
+ ((fn)(hwnd), 0L)
+#define FORWARD_WM_QUEUESYNC(hwnd, fn) \
+ (void)(fn)((hwnd), WM_QUEUESYNC, 0, 0L)
+
+/* void Cls_OnCommNotify(HWND hwnd, int cid, UINT flags); */
+#define HANDLE_WM_COMMNOTIFY(hwnd, wParam, lParam, fn) \
+ ((fn)((hwnd), (int)(wParam), LOWORD(lParam)), 0L)
+#define FORWARD_WM_COMMNOTIFY(hwnd, cid, flags, fn) \
+ (void)(fn)((hwnd), WM_COMMNOTIFY, (WPARAM)(cid), MAKELPARAM((flags), 0))
+
+/****** Static control message APIs ******************************************/
+
+#define Static_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Static_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Static_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Static_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Static_SetIcon(hwndCtl, hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl), STM_SETICON, (WPARAM)(HICON)(hIcon), 0L))
+#define Static_GetIcon(hwndCtl, hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl), STM_GETICON, 0, 0L))
+
+/****** Button control message APIs ******************************************/
+
+#define Button_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Button_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Button_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Button_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Button_GetCheck(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), BM_GETCHECK, 0, 0L))
+#define Button_SetCheck(hwndCtl, check) ((void)SendMessage((hwndCtl), BM_SETCHECK, (WPARAM)(int)(check), 0L))
+
+#define Button_GetState(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), BM_GETSTATE, 0, 0L))
+#define Button_SetState(hwndCtl, state) ((UINT)(DWORD)SendMessage((hwndCtl), BM_SETSTATE, (WPARAM)(int)(state), 0L))
+
+#define Button_SetStyle(hwndCtl, style, fRedraw) ((void)SendMessage((hwndCtl), BM_SETSTYLE, (WPARAM)LOWORD(style), MAKELPARAM(((fRedraw) ? TRUE : FALSE), 0)))
+
+/****** Edit control message APIs ********************************************/
+
+#define Edit_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define Edit_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define Edit_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define Edit_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define Edit_LimitText(hwndCtl, cchMax) ((void)SendMessage((hwndCtl), EM_LIMITTEXT, (WPARAM)(cchMax), 0L))
+
+#define Edit_GetLineCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), EM_GETLINECOUNT, 0, 0L))
+#define Edit_GetLine(hwndCtl, line, lpch, cchMax) ((*((int FAR*)(lpch)) = (cchMax)), ((int)(DWORD)SendMessage((hwndCtl), EM_GETLINE, (WPARAM)(int)(line), (LPARAM)(LPSTR)(lpch))))
+
+#define Edit_GetRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_GETRECT, 0, (LPARAM)(RECT FAR*)(lprc)))
+#define Edit_SetRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_SETRECT, 0, (LPARAM)(const RECT FAR*)(lprc)))
+#define Edit_SetRectNoPaint(hwndCtl, lprc) ((void)SendMessage((hwndCtl), EM_SETRECTNP, 0, (LPARAM)(const RECT FAR*)(lprc)))
+
+#define Edit_GetSel(hwndCtl) ((DWORD)SendMessage((hwndCtl), EM_GETSEL, 0, 0L))
+#define Edit_SetSel(hwndCtl, ichStart, ichEnd) ((void)SendMessage((hwndCtl), EM_SETSEL, 0, MAKELPARAM((ichStart), (ichEnd))))
+#define Edit_ReplaceSel(hwndCtl, lpszReplace) ((void)SendMessage((hwndCtl), EM_REPLACESEL, 0, (LPARAM)(LPCSTR)(lpszReplace)))
+
+#define Edit_GetModify(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_GETMODIFY, 0, 0L))
+#define Edit_SetModify(hwndCtl, fModified) ((void)SendMessage((hwndCtl), EM_SETMODIFY, (WPARAM)(UINT)(fModified), 0L))
+
+#define Edit_LineFromChar(hwndCtl, ich) ((int)(DWORD)SendMessage((hwndCtl), EM_LINEFROMCHAR, (WPARAM)(int)(ich), 0L))
+#define Edit_LineIndex(hwndCtl, line) ((int)(DWORD)SendMessage((hwndCtl), EM_LINEINDEX, (WPARAM)(int)(line), 0L))
+#define Edit_LineLength(hwndCtl, line) ((int)(DWORD)SendMessage((hwndCtl), EM_LINELENGTH, (WPARAM)(int)(line), 0L))
+
+#define Edit_Scroll(hwndCtl, dv, dh) ((void)SendMessage((hwndCtl), EM_LINESCROLL, 0, MAKELPARAM((dv), (dh))))
+
+#define Edit_CanUndo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_CANUNDO, 0, 0L))
+#define Edit_Undo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_UNDO, 0, 0L))
+#define Edit_EmptyUndoBuffer(hwndCtl) ((void)SendMessage((hwndCtl), EM_EMPTYUNDOBUFFER, 0, 0L))
+
+#define Edit_SetPasswordChar(hwndCtl, ch) ((void)SendMessage((hwndCtl), EM_SETPASSWORDCHAR, (WPARAM)(UINT)(ch), 0L))
+
+#define Edit_SetTabStops(hwndCtl, cTabs, lpTabs) ((void)SendMessage((hwndCtl), EM_SETTABSTOPS, (WPARAM)(int)(cTabs), (LPARAM)(const int FAR*)(lpTabs)))
+
+#define Edit_FmtLines(hwndCtl, fAddEOL) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_FMTLINES, (WPARAM)(BOOL)(fAddEOL), 0L))
+
+#define Edit_GetHandle(hwndCtl) ((HLOCAL)(UINT)(DWORD)SendMessage((hwndCtl), EM_GETHANDLE, 0, 0L))
+#define Edit_SetHandle(hwndCtl, h) ((void)SendMessage((hwndCtl), EM_SETHANDLE, (WPARAM)(UINT)(HLOCAL)(h), 0L))
+
+#if (WINVER >= 0x030a)
+#define Edit_GetFirstVisibleLine(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), EM_GETFIRSTVISIBLELINE, 0, 0L))
+
+#define Edit_SetReadOnly(hwndCtl, fReadOnly) ((BOOL)(DWORD)SendMessage((hwndCtl), EM_SETREADONLY, (WPARAM)(BOOL)(fReadOnly), 0L))
+
+#define Edit_GetPasswordChar(hwndCtl) ((char)(DWORD)SendMessage((hwndCtl), EM_GETPASSWORDCHAR, 0, 0L))
+
+#define Edit_SetWordBreakProc(hwndCtl, lpfnWordBreak) ((void)SendMessage((hwndCtl), EM_SETWORDBREAKPROC, 0, (LPARAM)(EDITWORDBREAKPROC)(lpfnWordBreak)))
+#define Edit_GetWordBreakProc(hwndCtl) ((EDITWORDBREAKPROC)SendMessage((hwndCtl), EM_GETWORDBREAKPROC, 0, 0L))
+#endif /* WINVER >= 0x030a */
+
+/****** ScrollBar control message APIs ***************************************/
+
+/* NOTE: flags parameter is a collection of ESB_* values, NOT a boolean! */
+#define ScrollBar_Enable(hwndCtl, flags) EnableScrollBar((hwndCtl), SB_CTL, (flags))
+
+#define ScrollBar_Show(hwndCtl, fShow) ShowWindow((hwndCtl), (fShow) ? SW_SHOWNORMAL : SW_HIDE)
+
+#define ScrollBar_SetPos(hwndCtl, pos, fRedraw) SetScrollPos((hwndCtl), SB_CTL, (pos), (fRedraw))
+#define ScrollBar_GetPos(hwndCtl) GetScrollPos((hwndCtl), SB_CTL)
+
+#define ScrollBar_SetRange(hwndCtl, posMin, posMax, fRedraw) SetScrollRange((hwndCtl), SB_CTL, (posMin), (posMax), (fRedraw))
+#define ScrollBar_GetRange(hwndCtl, lpposMin, lpposMax) GetScrollRange((hwndCtl), SB_CTL, (lpposMin), (lpposMax))
+
+/****** ListBox control message APIs *****************************************/
+
+#define ListBox_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define ListBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCOUNT, 0, 0L))
+#define ListBox_ResetContent(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), LB_RESETCONTENT, 0, 0L))
+
+#define ListBox_AddString(hwndCtl, lpsz) ((int)(DWORD)SendMessage((hwndCtl), LB_ADDSTRING, 0, (LPARAM)(LPCSTR)(lpsz)))
+#define ListBox_InsertString(hwndCtl, index, lpsz) ((int)(DWORD)SendMessage((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpsz)))
+
+#define ListBox_AddItemData(hwndCtl, data) ((int)(DWORD)SendMessage((hwndCtl), LB_ADDSTRING, 0, (LPARAM)(data)))
+#define ListBox_InsertItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ListBox_DeleteString(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_DELETESTRING, (WPARAM)(int)(index), 0L))
+
+#define ListBox_GetTextLen(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTEXTLEN, (WPARAM)(int)(index), 0L))
+#define ListBox_GetText(hwndCtl, index, lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTEXT, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpszBuffer)))
+
+#define ListBox_GetItemData(hwndCtl, index) ((LRESULT)(DWORD)SendMessage((hwndCtl), LB_GETITEMDATA, (WPARAM)(int)(index), 0L))
+#define ListBox_SetItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), LB_SETITEMDATA, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ListBox_FindString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ListBox_FindItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ListBox_SetSel(hwndCtl, fSelect, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETSEL, (WPARAM)(BOOL)(fSelect), MAKELPARAM((index), 0)))
+#define ListBox_SelItemRange(hwndCtl, fSelect, first, last) ((int)(DWORD)SendMessage((hwndCtl), LB_SELITEMRANGE, (WPARAM)(BOOL)(fSelect), MAKELPARAM((first), (last))))
+
+#define ListBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCURSEL, 0, 0L))
+#define ListBox_SetCurSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETCURSEL, (WPARAM)(int)(index), 0L))
+
+#define ListBox_SelectString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ListBox_SelectItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), LB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ListBox_GetSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSEL, (WPARAM)(int)(index), 0L))
+#define ListBox_GetSelCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSELCOUNT, 0, 0L))
+#define ListBox_GetTopIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETTOPINDEX, 0, 0L))
+#define ListBox_GetSelItems(hwndCtl, cItems, lpItems) ((int)(DWORD)SendMessage((hwndCtl), LB_GETSELITEMS, (WPARAM)(int)(cItems), (LPARAM)(int FAR*)(lpItems)))
+
+#define ListBox_SetTopIndex(hwndCtl, indexTop) ((int)(DWORD)SendMessage((hwndCtl), LB_SETTOPINDEX, (WPARAM)(int)(indexTop), 0L))
+
+#define ListBox_SetColumnWidth(hwndCtl, cxColumn) ((void)SendMessage((hwndCtl), LB_SETCOLUMNWIDTH, (WPARAM)(int)(cxColumn), 0L))
+#define ListBox_GetHorizontalExtent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETHORIZONTALEXTENT, 0, 0L))
+#define ListBox_SetHorizontalExtent(hwndCtl, cxExtent) ((void)SendMessage((hwndCtl), LB_SETHORIZONTALEXTENT, (WPARAM)(int)(cxExtent), 0L))
+
+#define ListBox_SetTabStops(hwndCtl, cTabs, lpTabs) ((BOOL)(DWORD)SendMessage((hwndCtl), LB_SETTABSTOPS, (WPARAM)(int)(cTabs), (LPARAM)(int FAR*)(lpTabs)))
+
+#define ListBox_GetItemRect(hwndCtl, index, lprc) ((int)(DWORD)SendMessage((hwndCtl), LB_GETITEMRECT, (WPARAM)(int)(index), (LPARAM)(RECT FAR*)(lprc)))
+
+#define ListBox_SetCaretIndex(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_SETCARETINDEX, (WPARAM)(int)(index), 0L))
+#define ListBox_GetCaretIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETCARETINDEX, 0, 0L))
+
+#define ListBox_SetAnchorIndex(hwndCtl, index) ((void)SendMessage((hwndCtl), LB_SETANCHORINDEX, (WPARAM)(int)(index), 0L)) /* ;Internal */
+#define ListBox_GetAnchorIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), LB_GETANCHORINDEX, 0, 0L)) /* ;Internal */
+
+#if (WINVER >= 0x030a)
+#define ListBox_FindStringExact(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), LB_FINDSTRINGEXACT, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+
+#define ListBox_SetItemHeight(hwndCtl, index, cy) ((int)(DWORD)SendMessage((hwndCtl), LB_SETITEMHEIGHT, (WPARAM)(int)(index), MAKELPARAM((cy), 0)))
+#define ListBox_GetItemHeight(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), LB_GETITEMHEIGHT, (WPARAM)(int)(index), 0L))
+#endif /* WINVER >= 0x030a */
+
+#define ListBox_Dir(hwndCtl, attrs, lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl), LB_DIR, (WPARAM)(UINT)(attrs), (LPARAM)(LPCSTR)(lpszFileSpec)))
+#define ListBox_AddFile(hwndCtl, lpszFilename) ((int)(DWORD)SendMessage((hwndCtl), LB_ADDFILE, 0, (LPARAM)(LPCSTR)(lpszFilename))) /* ;Internal */
+
+/****** ComboBox control message APIs ****************************************/
+
+#define ComboBox_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
+
+#define ComboBox_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
+#define ComboBox_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl)
+#define ComboBox_SetText(hwndCtl, lpsz) SetWindowText((hwndCtl), (lpsz))
+
+#define ComboBox_LimitText(hwndCtl, cchLimit) ((int)(DWORD)SendMessage((hwndCtl), CB_LIMITTEXT, (WPARAM)(int)(cchLimit), 0L))
+
+#define ComboBox_GetEditSel(hwndCtl) ((DWORD)SendMessage((hwndCtl), CB_GETEDITSEL, 0, 0L))
+#define ComboBox_SetEditSel(hwndCtl, ichStart, ichEnd) ((int)(DWORD)SendMessage((hwndCtl), CB_SETEDITSEL, 0, MAKELPARAM((ichStart), (ichEnd))))
+
+#define ComboBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETCOUNT, 0, 0L))
+#define ComboBox_ResetContent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_RESETCONTENT, 0, 0L))
+
+#define ComboBox_AddString(hwndCtl, lpsz) ((int)(DWORD)SendMessage((hwndCtl), CB_ADDSTRING, 0, (LPARAM)(LPCSTR)(lpsz)))
+#define ComboBox_InsertString(hwndCtl, index, lpsz) ((int)(DWORD)SendMessage((hwndCtl), CB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpsz)))
+
+#define ComboBox_AddItemData(hwndCtl, data) ((int)(DWORD)SendMessage((hwndCtl), CB_ADDSTRING, 0, (LPARAM)(data)))
+#define ComboBox_InsertItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), CB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ComboBox_DeleteString(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_DELETESTRING, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_GetLBTextLen(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_GETLBTEXTLEN, (WPARAM)(int)(index), 0L))
+#define ComboBox_GetLBText(hwndCtl, index, lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl), CB_GETLBTEXT, (WPARAM)(int)(index), (LPARAM)(LPCSTR)(lpszBuffer)))
+
+#define ComboBox_GetItemData(hwndCtl, index) ((LRESULT)(DWORD)SendMessage((hwndCtl), CB_GETITEMDATA, (WPARAM)(int)(index), 0L))
+#define ComboBox_SetItemData(hwndCtl, index, data) ((int)(DWORD)SendMessage((hwndCtl), CB_SETITEMDATA, (WPARAM)(int)(index), (LPARAM)(data)))
+
+#define ComboBox_FindString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+#define ComboBox_FindItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ComboBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETCURSEL, 0, 0L))
+#define ComboBox_SetCurSel(hwndCtl, index) ((int)(DWORD)SendMessage((hwndCtl), CB_SETCURSEL, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_SelectString(hwndCtl, indexStart, lpszSelect) ((int)(DWORD)SendMessage((hwndCtl), CB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszSelect)))
+#define ComboBox_SelectItemData(hwndCtl, indexStart, data) ((int)(DWORD)SendMessage((hwndCtl), CB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
+
+#define ComboBox_Dir(hwndCtl, attrs, lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl), CB_DIR, (WPARAM)(UINT)(attrs), (LPARAM)(LPCSTR)(lpszFileSpec)))
+
+#define ComboBox_ShowDropdown(hwndCtl, fShow) ((BOOL)(DWORD)SendMessage((hwndCtl), CB_SHOWDROPDOWN, (WPARAM)(BOOL)(fShow), 0L))
+
+#if (WINVER >= 0x030a)
+#define ComboBox_FindStringExact(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SendMessage((hwndCtl), CB_FINDSTRINGEXACT, (WPARAM)(int)(indexStart), (LPARAM)(LPCSTR)(lpszFind)))
+
+#define ComboBox_GetDroppedState(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl), CB_GETDROPPEDSTATE, 0, 0L))
+#define ComboBox_GetDroppedControlRect(hwndCtl, lprc) ((void)SendMessage((hwndCtl), CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)(RECT FAR*)(lprc)))
+
+#define ComboBox_GetItemHeight(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl), CB_GETITEMHEIGHT, 0, 0L))
+#define ComboBox_SetItemHeight(hwndCtl, cyItem) ((int)(DWORD)SendMessage((hwndCtl), CB_SETITEMHEIGHT, (WPARAM)(int)(index), 0L))
+
+#define ComboBox_GetExtendedUI(hwndCtl) ((UINT)(DWORD)SendMessage((hwndCtl), CB_GETEXTENDEDUI, 0, 0L))
+#define ComboBox_SetExtendedUI(hwndCtl, flags) ((int)(DWORD)SendMessage((hwndCtl), CB_SETEXTENDEDUI, (WPARAM)(UINT)(flags), 0L))
+#endif /* WINVER >= 0x030a */
+
+/****** Alternate porting layer macros ****************************************/
+
+/* USER MESSAGES: */
+
+#define GET_WPARAM(wp, lp) (wp)
+#define GET_LPARAM(wp, lp) (lp)
+
+#define GET_WM_ACTIVATE_STATE(wp, lp) (wp)
+#define GET_WM_ACTIVATE_FMINIMIZED(wp, lp) (BOOL)HIWORD(lp)
+#define GET_WM_ACTIVATE_HWND(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_ACTIVATE_MPS(s, fmin, hwnd) \
+ (WPARAM)(s), MAKELONG(hwnd, fmin)
+
+#define GET_WM_CHARTOITEM_CHAR(wp, lp) (CHAR)(wp)
+#define GET_WM_CHARTOITEM_POS(wp, lp) HIWORD(lp)
+#define GET_WM_CHARTOITEM_HWND(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_CHARTOITEM_MPS(ch, pos, hwnd) \
+ (WPARAM)(ch), MAKELONG(hwnd, pos)
+
+#define GET_WM_COMMAND_ID(wp, lp) (wp)
+#define GET_WM_COMMAND_HWND(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(lp)
+#define GET_WM_COMMAND_MPS(id, hwnd, cmd) \
+ (WPARAM)(id), MAKELONG(hwnd, cmd)
+
+#define WM_CTLCOLORMSGBOX 0x0132
+#define WM_CTLCOLOREDIT 0x0133
+#define WM_CTLCOLORLISTBOX 0x0134
+#define WM_CTLCOLORBTN 0x0135
+#define WM_CTLCOLORDLG 0x0136
+#define WM_CTLCOLORSCROLLBAR 0x0137
+#define WM_CTLCOLORSTATIC 0x0138
+
+#define GET_WM_CTLCOLOR_HDC(wp, lp, msg) (HDC)(wp)
+#define GET_WM_CTLCOLOR_HWND(wp, lp, msg) (HWND)LOWORD(lp)
+#define GET_WM_CTLCOLOR_TYPE(wp, lp, msg) HIWORD(lp)
+#define GET_WM_CTLCOLOR_MPS(hdc, hwnd, type) \
+ (WPARAM)(hdc), MAKELONG(hwnd, type)
+
+
+#define GET_WM_MENUSELECT_CMD(wp, lp) (wp)
+#define GET_WM_MENUSELECT_FLAGS(wp, lp) LOWORD(lp)
+#define GET_WM_MENUSELECT_HMENU(wp, lp) (HMENU)HIWORD(lp)
+#define GET_WM_MENUSELECT_MPS(cmd, f, hmenu) \
+ (WPARAM)(cmd), MAKELONG(f, hmenu)
+
+// Note: the following are for interpreting MDIclient to MDI child messages.
+#define GET_WM_MDIACTIVATE_FACTIVATE(hwnd, wp, lp) (BOOL)(wp)
+#define GET_WM_MDIACTIVATE_HWNDDEACT(wp, lp) (HWND)HIWORD(lp)
+#define GET_WM_MDIACTIVATE_HWNDACTIVATE(wp, lp) (HWND)LOWORD(lp)
+// Note: the following is for sending to the MDI client window.
+#define GET_WM_MDIACTIVATE_MPS(f, hwndD, hwndA)\
+ (WPARAM)(hwndA), 0
+
+#define GET_WM_MDISETMENU_MPS(hmenuF, hmenuW) 0, MAKELONG(hmenuF, hmenuW)
+
+#define GET_WM_MENUCHAR_CHAR(wp, lp) (CHAR)(wp)
+#define GET_WM_MENUCHAR_HMENU(wp, lp) (HMENU)LOWORD(lp)
+#define GET_WM_MENUCHAR_FMENU(wp, lp) (BOOL)HIWORD(lp)
+#define GET_WM_MENUCHAR_MPS(ch, hmenu, f) \
+ (WPARAM)(ch), MAKELONG(hmenu, f)
+
+#define GET_WM_PARENTNOTIFY_MSG(wp, lp) (wp)
+#define GET_WM_PARENTNOTIFY_ID(wp, lp) HIWORD(lp)
+#define GET_WM_PARENTNOTIFY_HWNDCHILD(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_PARENTNOTIFY_X(wp, lp) (INT)LOWORD(lp)
+#define GET_WM_PARENTNOTIFY_Y(wp, lp) (INT)HIWORD(lp)
+#define GET_WM_PARENTNOTIFY_MPS(msg, id, hwnd) \
+ (WPARAM)(msg), MAKELONG(hwnd, id)
+#define GET_WM_PARENTNOTIFY2_MPS(msg, x, y) \
+ (WPARAM)(msg), MAKELONG(x, y)
+
+#define GET_WM_VKEYTOITEM_CODE(wp, lp) (wp)
+#define GET_WM_VKEYTOITEM_ITEM(wp, lp) (INT)HIWORD(lp)
+#define GET_WM_VKEYTOITEM_HWND(wp, lp) (HWND)LOWORD(lp)
+#define GET_WM_VKEYTOITEM_MPS(code, item, hwnd) \
+ (WPARAM)(code), MAKELONG(hwnd, item)
+
+#define GET_EM_SETSEL_START(wp, lp) LOWORD(lp)
+#define GET_EM_SETSEL_END(wp, lp) HIWORD(lp)
+#define GET_EM_SETSEL_MPS(iStart, iEnd) \
+ 0, MAKELONG(iStart, iEnd)
+
+#define GET_EM_LINESCROLL_MPS(vert, horz) \
+ 0, MAKELONG(vert, horz)
+
+#define GET_WM_CHANGECBCHAIN_HWNDNEXT(wp, lp) (HWND)LOWORD(lp)
+
+#define GET_WM_HSCROLL_CODE(wp, lp) (wp)
+#define GET_WM_HSCROLL_POS(wp, lp) LOWORD(lp)
+#define GET_WM_HSCROLL_HWND(wp, lp) (HWND)HIWORD(lp)
+#define GET_WM_HSCROLL_MPS(code, pos, hwnd) \
+ (WPARAM)(code), MAKELONG(pos, hwnd)
+
+#define GET_WM_VSCROLL_CODE(wp, lp) (wp)
+#define GET_WM_VSCROLL_POS(wp, lp) LOWORD(lp)
+#define GET_WM_VSCROLL_HWND(wp, lp) (HWND)HIWORD(lp)
+#define GET_WM_VSCROLL_MPS(code, pos, hwnd) \
+ (WPARAM)(code), MAKELONG(pos, hwnd)
+
+#ifndef RC_INVOKED
+#pragma pack() /* Revert to default packing */
+#endif /* RC_INVOKED */
+
+#ifdef __cplusplus
+} /* End of extern "C" { */
+#endif /* __cplusplus */
+
+#endif /* !_INC_WINDOWSX */
+ \ No newline at end of file
diff --git a/private/oleauto/tools/win16/os2/inc/wnapidec.inc b/private/oleauto/tools/win16/os2/inc/wnapidec.inc
new file mode 100644
index 000000000..dccb1cc16
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/inc/wnapidec.inc
@@ -0,0 +1,68 @@
+' ------------------------------------------------------------------------
+' WNAPIDEC.TXT -- (Sample) Windows 3.0 API Declarations for TESTDrvr
+'
+' Copyright (C) 1991 Microsoft Corporation
+'
+' The following are provided for sample purposes only. You should only
+' copy the ones you use into your code in order to save code space and
+' parse time.
+'
+' You have a royalty-free right to use, modify, reproduce and distribute
+' this file (and/or any modified version) in any way you find useful,
+' provided that you agree Microsoft has no warranty, obligation or
+' liability for its contents. Refer to the Microsoft Windows Programmer's
+' Reference for further information.
+'
+' ------------------------------------------------------------------------
+'-------------------------------------------------------------------------
+
+
+' General Purpose Defines
+
+ Type RECT
+ left As Integer
+ top As Integer
+ right As Integer
+ bottom As Integer
+ End Type
+
+
+' SAMPLE WINDOWS API DECLARATIONS, from USER.EXE and KERNEL.EXE
+
+Declare Sub GetClientRect Lib "User" (hWnd%, lpRect As RECT)
+Declare Sub GetWindowRect Lib "User" (hWnd%, lpRect As RECT)
+
+Declare Function GetFocus Lib "User" () As Integer
+Declare Function SetFocus Lib "User" (hWnd%) As Integer
+
+Declare Function SendMessage% Lib "User" (hWnd%,wMsg%,wParam%,lParam As Any)
+Declare Function IsZoomed Lib "User" (hWnd%) As Integer
+Declare Function WinExec Lib "Kernel" (lpCmdLine$, nCmdShow%) As Integer
+
+Declare Function FindWindow Lib "User" (lpClassName$, lpWindowName$) As Integer
+Declare Function SetActiveWindow Lib "User" (hWnd%) As Integer
+Declare Function GetActiveWindow Lib "User" () As Integer
+Declare Function GetWindowText Lib "User" (hWnd%, lpBuffer$, wBufferLen%) As Integer
+Declare Function GetDesktopWindow Lib "User" () As Integer
+
+Declare Function ShowWindow Lib "User" (hWnd%, nCmdShow%) As Integer
+' ShowWindow() Commands (values for nCmdShow%)
+Const SW_HIDE = 0
+Const SW_SHOWNORMAL = 1
+Const SW_NORMAL = 1
+Const SW_SHOWMINIMIZED = 2
+Const SW_SHOWMAXIMIZED = 3
+Const SW_MAXIMIZE = 3
+Const SW_SHOWNOACTIVATE = 4
+Const SW_SHOW = 5
+Const SW_MINIMIZE = 6
+Const SW_SHOWMINNOACTIVE = 7
+Const SW_SHOWNA = 8
+Const SW_RESTORE = 9
+
+
+Declare Function GetWindowLong Lib "User" (hWnd%, nIndex%) As Long
+' Window field offsets (nIndex%) for GetWindowLong()
+Const GWL_WNDPROC = (-4)
+Const GWL_STYLE = (-16)
+Const GWL_EXSTYLE = (-20)
diff --git a/private/oleauto/tools/win16/os2/lib/wchkstk.asm b/private/oleauto/tools/win16/os2/lib/wchkstk.asm
new file mode 100644
index 000000000..fa7628ea4
--- /dev/null
+++ b/private/oleauto/tools/win16/os2/lib/wchkstk.asm
@@ -0,0 +1,164 @@
+ page ,132
+ title wchkstk.asm - Stack checking for windows
+;***
+;wchkstk.asm - Stack checking for windows
+;
+; Copyright (c) 1988-1992, Microsoft Corporation. All rights reserved.
+;
+;Purpose:
+; Windows versions of the C lib stack checking routines.
+;
+;Revision History:
+; 09-19-89 JCR Broke these routines out of winstart.asm.
+; 11-28-89 GJF Fixed copyright
+; 01-25-90 JCR Moved _aaltstkovr here from windstart.asm
+; 02-12-90 JCR Added __chkstk label for compatibility...
+; 07-23-91 JCR Load dgroup on error, WIN DLL bug fix
+;
+;*******************************************************************************
+
+.xlist
+include version.inc
+?PLM = 1
+include cmacros.inc
+include rterr.inc
+.list
+
+ externW pStackTop ; Windows stack values
+ externW pStackMin
+ externW pStackBot
+
+ externNP __amsg_exit ; fatal error handler
+
+ifdef SS_NEQ_DGROUP
+externP <__GetDGROUP> ; Function to recover DGROUP
+endif
+
+sBegin data
+ assumes ds,data
+
+globalCP __aaltstkovr,-1 ; Holds alternate overflow handler
+
+sEnd data
+
+
+sBegin code
+ assumes cs,code
+
+page
+;***
+; _aNchkstk - Near check stack routine (windows version)
+;
+;Purpose:
+;
+;Entry:
+; AX = size of local frame
+;
+;Exit:
+; SP = new stackframe if successful
+;
+;Uses:
+;
+;Exceptions:
+; Gives out of stack overflow error and aborts if there is not enough
+; stack space for the routine.
+;
+;*******************************************************************************
+
+ife sizeC
+labelP <PUBLIC,__chkstk>
+endif
+
+labelP <PUBLIC, __aNchkstk>
+ pop bx ; get return address
+ inc ax
+ and al,0FEh ; round up to nearest even
+ sub ax,sp
+ jae astkovr
+ neg ax
+ cmp ss:[pStackTop],ax
+ ja astkovr
+ cmp ss:[pStackMin],ax
+ jbe nchkstk1
+ mov ss:[pStackMin],ax
+nchkstk1:
+ mov sp,ax
+ jmp bx ; jump to return address
+
+
+page
+;***
+; _aFchkstk - Far check stack routine (windows version)
+;
+;Purpose:
+;
+;Entry:
+; AX = size of local frame
+;
+;Exit:
+; SP = new stackframe if successful
+;
+;Uses:
+;
+;Exceptions:
+; Gives out of stack overflow error and aborts if there is not enough
+; stack space for the routine.
+;
+;*******************************************************************************
+
+
+if sizeC
+labelP <PUBLIC,__chkstk>
+endif
+
+labelP <PUBLIC, __aFchkstk>
+ pop bx
+ pop dx ; get far return address
+ inc ax
+ and al,0FEh ; round up to nearest even
+ sub ax,sp
+ jae stkerr
+ neg ax
+ cmp ss:[pStackTop],ax
+ ja stkerr
+ cmp ss:[pStackMin],ax
+ jbe fchkstk1
+ mov ss:[pStackMin],ax
+fchkstk1:
+ mov sp,ax
+ push dx
+ push bx
+ccc proc far
+ ret
+ccc endp
+
+;
+; Stack fault has occurred
+; (common to both near and far check stack routines)
+;
+
+stkerr:
+
+ifdef SS_NEQ_DGROUP
+ call __GetDGROUP
+ mov ds,ax ;set DS = DGROUP
+endif
+ mov dx,word ptr [__aaltstkovr]
+ inc dx
+ jz astkovr
+ jmp [__aaltstkovr] ; alternate stack handler
+
+astkovr:
+ ;; *** HACK!!! ***
+ ;; Hammer the value to a low setting so FATALAPPEXIT will
+ ;; "work"...
+ mov ss:[pStackTop], 0 ; set it to a value
+ ;; *** EOH!!! ***
+
+ mov ax,_RT_STACK ; stack overflow error
+ jmp __amsg_exit ; fatal error handler
+
+
+sEnd code
+
+ end
diff --git a/private/oleauto/update.bat b/private/oleauto/update.bat
new file mode 100644
index 000000000..8b12dd721
--- /dev/null
+++ b/private/oleauto/update.bat
@@ -0,0 +1,2 @@
+@echo off
+walk /d . call \oleauto\upddir %%s
diff --git a/private/oleauto/upddir.bat b/private/oleauto/upddir.bat
new file mode 100644
index 000000000..c4c479eb7
--- /dev/null
+++ b/private/oleauto/upddir.bat
@@ -0,0 +1,3 @@
+@echo off
+cd \oleauto\%1
+for %%a in (*.*) do call \oleauto\chkfile %1 %%a